No repo is "done" until every applicable line is checked. Copy this into your repo root. Check items off per-release.
Tags: [all] every repo · [npm] [pypi] [vsix] [desktop] [container] published artifacts · [mcp] MCP servers · [cli] CLI tools
Repo: loadout-os (@mcptoolshop/loadout-os) · Type: [all][npm][cli] · Worked: 2026-06-16
-
[all]SECURITY.md exists (report email, supported versions, response timeline) (2026-06-16) —SECURITY.mdauthored: report email64996768+mcp-tool-shop@users.noreply.github.com, supported-versions table (1.x Yes / <1.0 No), response timeline (acknowledge 48h / assess 7d / fix 30d), and a per-surface attack-surface section. -
[all]README includes threat model paragraph (data touched, data NOT touched, permissions required) (2026-06-16) —README.md"## Trust model" section: data it touches (store/index/usage local files), data it does NOT touch (no network/telemetry/remote/secrets), permissions (local filesystem only; doctor/report read-only; refresh guarded). -
[all]No secrets, tokens, or credentials in source or diagnostics output (2026-06-16) — no credential handling anywhere; matcher/validators handle metadata only (SECURITY.md"No secrets handling"). Grep foreval(|new Function(|child_processoverpackages/cli/srcreturns only the documentedspawnSyncpassthrough forrules split(commands.ts:411-433) +hook.ts— no secret literals, no token reads. -
[all]No telemetry by default — state it explicitly even if obvious (2026-06-16) — stated explicitly in README Trust model ("no telemetry") and SECURITY.md ("No telemetry — nothing is collected centrally or transmitted"). The only write is the local append-only~/.ai-loadout/usage.jsonl(loadout-hook.mjs:120-141), never transmitted.
-
[cli|mcp|desktop]Dangerous actions (kill, delete, restart) require explicit--allow-*flag (2026-06-16) — no kill/delete/restart actions exist. The destructive ops are:refresh(irreversible global-index write) gated by--dry-run+ andon halt +<dest>.bakcompensator (refresh.ts:211-219, 253-287);rules splitrequires interactive per-extraction confirmation + supports--dry-run(commands.ts:411-433,help.ts:109-119). SKIP-equivalent: there is no destructive process action that warrants an--allow-*flag; the irreversible file write is gated by--dry-run+ compensator instead, which is the stronger guarantee. -
[cli|mcp|desktop]File operations constrained to known directories (2026-06-16) — writes confined to: storeindex.json(next to MEMORY.md), global resolver index~/.ai-loadout/index.json,.claude/rules/+CLAUDE.md(interactive split), and~/.ai-loadout/usage.jsonl. Reads target fixed canonical locations (doctor.ts:68-78defaultDoctorPaths;report.tsdefaults to~/.ai-loadout/*). No arbitrary tree walks (SECURITY.md"Scoped filesystem access"). -
[mcp]Network egress off by default — SKIP: loadout-os is a CLI + runtime hook, not an MCP server. -
[mcp]Stack traces never exposed — structured error results only — SKIP: not an MCP server. (CLI equivalent is covered under B below — structured errors, no raw stacks.)
-
[all]Errors follow the Structured Error Shape:code,message,hint,cause?,retryable?(2026-06-16) —CliError { code, message, hint, exitCode }(console.ts:40-51) thrown by every command handler viafail()(console.ts:53-61);RefreshError { code, message, exitCode, issues }for the ritual (refresh.ts:128-139);reportreturns{ ok, error: { code, message } }(report.ts:46-48, 100-106, 117-124).cause?/retryable?are optional in the standard and not needed here. -
[cli]Exit codes: 0 ok · 1 user error · 2 runtime error · 3 partial success (2026-06-16) — real and verified:doctor0 healthy / 1 any fail check (cli.ts:221-223);report0 ok / 2 missing input (cli.ts:241-243);refresh0 ok / 1 andon-validation or write failure / 2 store-or-MEMORY.md missing (refresh.ts:381-404,refresh.ts:185-197, 211-219); validators exit 1 on ≥1 error (commands.ts:172,193,301,320,617,631); unknown command → CliError exit 1 (cli.ts:353-357). Documented per-command inhelp.tsexit-code blocks. -
[cli]No raw stack traces without--debug(2026-06-16) — process boundary catchesCliErrorand prints✗ [CODE] message+ hint, never.stack(cli.ts:373-383); an unexpected error is reduced to✗ [RUNTIME_FATAL] <message>(the message only, not the stack). The runtime hook is fail-silent and prints nothing to stdout on error. -
[mcp]Tool errors return structured results — server never crashes on bad input — SKIP: not an MCP server. (The CLI's bad-input handling is covered above; the hook degrades gracefully on malformed input,loadout-hook.mjs:72-95.) -
[mcp]State/config corruption degrades gracefully (stale data over crash) — SKIP: not an MCP server. Note: the resolver/hook DO degrade gracefully — malformed index layers are skipped (doctor.tslayers-malformed check; hookloadout-hook.mjs:84), malformed JSONL lines are skipped (report.tsskippedcount). -
[desktop]Errors shown as user-friendly messages — no raw exceptions in UI — SKIP: not a desktop app. -
[vscode]Errors surface via VS Code notification API — no silent failures — SKIP: not a VS Code extension.
-
[all]README is current: what it does, install, usage, supported platforms + runtime versions (2026-06-16) —README.mdis the current front-door: what-it-does (Knowledge OS), four-surface table, full command surface, install (npm install -g @mcptoolshop/loadout-os), Node>=20runtime (package.json:19-21,packages/cli/package.json:39-41), status, links to handbook + repo. -
[all]CHANGELOG.md (Keep a Changelog format) (2026-06-16) — rootCHANGELOG.mdauthored in Keep a Changelog format with an[Unreleased]section (Added/Fixed/Changed) summarizing the consolidation, the unified CLI, the matcher recall fix (FT-K1), and docs. Pluspackages/cli/CHANGELOG.mdfor the published package. -
[all]LICENSE file present and repo states support status (2026-06-16) —LICENSEpresent (MIT, "Copyright (c) 2026 mcp-tool-shop"); alsopackages/cli/LICENSE. Support status stated in SECURITY.md supported-versions table and README Status section. -
[cli]--helpoutput accurate for all commands and flags (2026-06-16) — top-level/namespace help (cli.ts:77-135) + per-command help registry covering every leaf command with synopsis/args/flags/example/exit-codes (help.ts:43-237); a test (every dispatched command has help, referencedhelp.ts:38-42) enforces coverage so a new command without help fails CI. -
[cli|mcp|desktop]Logging levels defined: silent / normal / verbose / debug — secrets redacted at all levels (2026-06-16) — normal (human screen) vs--json(machine) on every verb; the runtime hook hasAI_LOADOUT_HOOK=off(silent) andAI_LOADOUT_HOOK=debug(STDERR-only diagnostics, never stdout —loadout-hook.mjs:25-27, 44-50). No secrets are handled, so there is nothing to redact at any level. -
[mcp]All tools documented with description + parameters — SKIP: not an MCP server (no tool schema). The CLI command equivalent is the per-command--helpregistry, checked above. -
[complex]HANDBOOK.md: daily ops, warn/critical response, recovery procedures (2026-06-16) — served by the Starlight handbook undersite/src/content/docs/handbook/:rituals.mddocuments daily ops + when-to-run + the refresh andon/compensator recovery and the doctor pass/warn/fail response;architecture.mdthe data flow;getting-started.mdinstall + first commands;reference.mdevery command/flag/exit code;migration.mdthe legacy-package migration. Linked from README "Documentation" + the landing page.
-
[all]verifyscript exists (test + build + smoke in one command) (2026-06-16) — rootnpm run verify=npm run build && verifyacross all four packages in topo order (package.json:17); each package'sverifyistsc --noEmit && node --test(e.g.packages/cli/package.json:27). The PowerShell hook smoke-test is deliberately excluded (Windows/rig-specific; would break Linux CI —package.json//buildOrdernote). -
[all]Version in manifest matches git tag (2026-06-16) — enforced at release:release.yml"Verify tag matches packages/cli/package.json version" step exits 1 on mismatch (release.yml:42-51). The actual match happens at the Phase-6 tag (manifest is the placeholder0.0.0until the coordinator bumps to 1.0.0 + tagsv1.0.0); the enforcement gate is in place now. -
[all]Dependency scanning runs in CI (ecosystem-appropriate) (2026-06-16) —ci.ymlrunsnpm audit --audit-level=moderateon every push/PR (ci.yml:41), Node 20 + 22 matrix. -
[all]Automated dependency update mechanism exists — SKIP: studio policy — deps updated manually, dependabot intentionally not added (.claude/rules/github-actions.md: "Do NOT add dependabot.yml unless explicitly requested"). -
[npm]npm pack --dry-runincludes: dist/, README.md, CHANGELOG.md, LICENSE (2026-06-16) — verified vianpm pack --dry-run -w packages/cli: tarball listsdist/…,README.md,CHANGELOG.md,LICENSE. Addedpackages/cli/CHANGELOG.md+CHANGELOG.mdto the clifilesfield (packages/cli/package.json:19-24) so the changelog is now in the tarball. -
[npm]engines.nodeset ·[pypi]python_requiresset (2026-06-16) —engines.node>=20at root (package.json:19-21) and inpackages/cli/package.json:39-41. -
[npm]Lockfile committed ·[pypi]Clean wheel + sdist build (2026-06-16) —package-lock.jsonpresent and git-tracked (git ls-files package-lock.json→package-lock.json). -
[vsix]vsce packageproduces clean .vsix with correct metadata — SKIP: not a VS Code extension. -
[desktop]Installer/package builds and runs on stated platforms — SKIP: not a desktop app.
-
[all]Logo in README header (2026-06-16) —README.md:1<img src="logo.png" alt="loadout-os" width="500">(logo.pngpresent in repo root). -
[all]Translations (polyglot-mcp, 8 languages) — COORDINATOR / publish-time: run before npm publish + GitHub release (per global release-ordering rule). Not done here. -
[org]Landing page (@mcptoolshop/site-theme) (2026-06-16) — Starlight site undersite/with the handbook wired to the landing page (README "Documentation" links tohttps://mcp-tool-shop-org.github.io/loadout-os/handbook/);pages.ymlworkflow present. -
[all]GitHub repo metadata: description, homepage, topics — COORDINATOR: set viagh repo editat publish time. Not done here.
Hard gate (A–D): Must pass before any version is tagged or published.
If a section doesn't apply, mark SKIP: with justification — don't leave it unchecked.
Soft gate (E): Should be done. Product ships without it, but isn't "whole."
Checking off:
- [x] `[all]` SECURITY.md exists (2026-02-27)
Skipping:
- [ ] `[pypi]` SKIP: not a Python project