loadout-ai 0.6.0 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (133) hide show
  1. package/CHANGELOG.md +72 -0
  2. package/README.md +129 -26
  3. package/catalog/discovered.json +28469 -24524
  4. package/dist/src/cli.js +7 -2
  5. package/dist/src/commands/agents.js +6 -23
  6. package/dist/src/commands/catalog.js +186 -102
  7. package/dist/src/commands/health.js +6 -6
  8. package/dist/src/commands/inventory.js +19 -120
  9. package/dist/src/commands/lifecycle.js +13 -51
  10. package/dist/src/commands/mcp.js +10 -73
  11. package/dist/src/commands/setup.js +5 -5
  12. package/dist/src/commands/sharing.js +11 -108
  13. package/dist/src/commands/support.js +20 -9
  14. package/dist/src/core/{adapters.js → agents/adapters.js} +2 -2
  15. package/dist/src/core/{agent-inspection.js → agents/agent-inspection.js} +48 -6
  16. package/dist/src/core/{codex-mcp.js → agents/codex-mcp.js} +1 -1
  17. package/dist/src/core/{health-score-evidence.js → agents/health-score-evidence.js} +8 -8
  18. package/dist/src/core/{runtime-tools.js → agents/runtime-tools.js} +2 -2
  19. package/dist/src/core/{audit.js → catalog/audit.js} +4 -4
  20. package/dist/src/core/{catalog.js → catalog/catalog.js} +5 -5
  21. package/dist/src/core/{components.js → catalog/components.js} +2 -2
  22. package/dist/src/core/{conformance.js → catalog/conformance.js} +2 -2
  23. package/dist/src/core/{profiles.js → catalog/profiles.js} +2 -2
  24. package/dist/src/core/{provenance.js → catalog/provenance.js} +3 -3
  25. package/dist/src/core/{registry.js → catalog/registry.js} +59 -11
  26. package/dist/src/core/{safety.js → catalog/safety.js} +36 -7
  27. package/dist/src/core/{skill-compare.js → catalog/skill-compare.js} +1 -1
  28. package/dist/src/core/{skill-inventory.js → catalog/skill-inventory.js} +3 -3
  29. package/dist/src/core/{skills.js → catalog/skills.js} +1 -1
  30. package/dist/src/core/{candidate-intelligence.js → discovery/candidate-intelligence.js} +6 -6
  31. package/dist/src/core/{discovery-connector.js → discovery/discovery-connector.js} +2 -2
  32. package/dist/src/core/{evaluate.js → discovery/evaluate.js} +2 -2
  33. package/dist/src/core/{mcp-registry-discovery.js → discovery/mcp-registry-discovery.js} +1 -1
  34. package/dist/src/core/{observations.js → discovery/observations.js} +3 -3
  35. package/dist/src/core/{review-queue.js → discovery/review-queue.js} +2 -2
  36. package/dist/src/core/{skills-sh-discovery.js → discovery/skills-sh-discovery.js} +1 -1
  37. package/dist/src/core/{adopt.js → install/adopt.js} +3 -3
  38. package/dist/src/core/{catalog-install.js → install/catalog-install.js} +11 -11
  39. package/dist/src/core/{file-lock.js → install/file-lock.js} +1 -1
  40. package/dist/src/core/{install.js → install/install.js} +5 -5
  41. package/dist/src/core/{package.js → install/package.js} +3 -3
  42. package/dist/src/core/{reconcile.js → install/reconcile.js} +5 -5
  43. package/dist/src/core/{remove.js → install/remove.js} +4 -4
  44. package/dist/src/core/{snapshot.js → install/snapshot.js} +1 -1
  45. package/dist/src/core/{source.js → install/source.js} +22 -8
  46. package/dist/src/core/{sync.js → install/sync.js} +9 -9
  47. package/dist/src/core/{transaction.js → install/transaction.js} +1 -1
  48. package/dist/src/core/{uninstall.js → install/uninstall.js} +4 -4
  49. package/dist/src/core/{update.js → install/update.js} +4 -4
  50. package/dist/src/core/{cli-guide.js → reporting/cli-guide.js} +29 -45
  51. package/dist/src/core/reporting/completion.js +90 -0
  52. package/dist/src/core/{doctor.js → reporting/doctor.js} +5 -10
  53. package/dist/src/core/{freshness-alerts.js → reporting/freshness-alerts.js} +5 -5
  54. package/dist/src/core/{health.js → reporting/health.js} +6 -6
  55. package/dist/src/core/{loadout-card.js → reporting/loadout-card.js} +1 -1
  56. package/dist/src/core/{readme-claims.js → reporting/readme-claims.js} +1 -1
  57. package/dist/src/core/{readme-facts.js → reporting/readme-facts.js} +2 -2
  58. package/dist/src/core/{share-report.js → reporting/share-report.js} +3 -3
  59. package/dist/src/core/{upgrade.js → reporting/upgrade.js} +7 -7
  60. package/dist/src/core/routing/first-party-skills.js +118 -0
  61. package/dist/src/core/routing/handoff.js +314 -0
  62. package/dist/src/core/{model-config.js → routing/model-config.js} +4 -4
  63. package/dist/src/core/routing/policy.js +147 -0
  64. package/dist/src/core/{route.js → routing/route.js} +202 -39
  65. package/dist/src/core/{api.js → runtime/api.js} +4 -4
  66. package/dist/src/core/{canary.js → runtime/canary.js} +1 -1
  67. package/dist/src/core/{github.js → runtime/github.js} +1 -1
  68. package/dist/src/core/{mcp-recipes.js → runtime/mcp-recipes.js} +1 -1
  69. package/dist/src/core/{mcp.js → runtime/mcp.js} +2 -2
  70. package/dist/src/core/{scheduler.js → runtime/scheduler.js} +4 -4
  71. package/dist/src/core/{active-policy.js → workspace/active-policy.js} +2 -2
  72. package/dist/src/core/{active-set.js → workspace/active-set.js} +2 -2
  73. package/dist/src/core/{improve.js → workspace/improve.js} +3 -3
  74. package/dist/src/core/{manifest.js → workspace/manifest.js} +2 -2
  75. package/dist/src/core/{outcomes.js → workspace/outcomes.js} +3 -3
  76. package/dist/src/core/{portable.js → workspace/portable.js} +3 -3
  77. package/dist/src/core/{profile-state.js → workspace/profile-state.js} +1 -1
  78. package/dist/src/core/{recommend.js → workspace/recommend.js} +1 -1
  79. package/dist/src/core/{state.js → workspace/state.js} +3 -3
  80. package/docs/CANDIDATE_INTELLIGENCE.md +9 -2
  81. package/docs/CATALOG.md +1 -1
  82. package/docs/CREDENTIAL_AND_UPDATE_POLICY.md +1 -1
  83. package/docs/DISCOVERED.md +250 -248
  84. package/docs/FEATURE_TEST_MATRIX.md +7 -260
  85. package/docs/GITHUB_AUTHORIZATION.md +5 -0
  86. package/docs/PROVENANCE_AND_COMPARISON.md +1 -1
  87. package/docs/RELEASE_REVIEW.md +0 -1
  88. package/docs/evidence/readme-claims.json +22 -19
  89. package/package.json +7 -4
  90. package/skills/loadout-curator/SKILL.md +105 -0
  91. package/skills/loadout-router/SKILL.md +85 -0
  92. package/MASTER_PLAN.md +0 -2207
  93. package/dist/src/core/completion.js +0 -143
  94. package/dist/src/core/handoff.js +0 -161
  95. package/docs/ACTIVE_SET.md +0 -53
  96. package/docs/COMPATIBILITY_POLICY.md +0 -22
  97. package/docs/CONVERSION_AND_SANDBOX.md +0 -27
  98. package/docs/EVALUATION_PROTOCOL_V1.md +0 -300
  99. package/docs/HEAD_TO_HEAD_EVALUATION.md +0 -79
  100. package/docs/PROVIDER_CONFIGURATION.md +0 -45
  101. package/docs/README_RESEARCH.md +0 -36
  102. package/docs/REPOSITORY_STABILIZATION.md +0 -190
  103. package/docs/SAFE_UPDATE_DEMO.md +0 -25
  104. package/docs/SCHEMA_DECISIONS.md +0 -25
  105. package/docs/SUBMISSION_COPY.md +0 -90
  106. package/docs/TEAM_POLICY.md +0 -18
  107. package/docs/superpowers/plans/2026-07-19-relatable-readme-hero.md +0 -283
  108. package/docs/superpowers/plans/2026-07-20-loadout-readme-explainer.md +0 -116
  109. package/docs/superpowers/plans/2026-07-20-project-activation-safety.md +0 -469
  110. package/docs/superpowers/specs/2026-07-19-relatable-readme-hero-design.md +0 -80
  111. package/docs/superpowers/specs/2026-07-20-loadout-readme-explainer-design.md +0 -55
  112. package/docs/superpowers/specs/2026-07-20-project-activation-safety-design.md +0 -228
  113. /package/dist/src/core/{agent-health-score.js → agents/agent-health-score.js} +0 -0
  114. /package/dist/src/core/{agent-versions.js → agents/agent-versions.js} +0 -0
  115. /package/dist/src/core/{conversion.js → agents/conversion.js} +0 -0
  116. /package/dist/src/core/{paths.js → agents/paths.js} +0 -0
  117. /package/dist/src/core/{runtime-tool-recipe.js → agents/runtime-tool-recipe.js} +0 -0
  118. /package/dist/src/core/{catalog-coverage.js → catalog/catalog-coverage.js} +0 -0
  119. /package/dist/src/core/{skill-security.js → catalog/skill-security.js} +0 -0
  120. /package/dist/src/core/{community.js → discovery/community.js} +0 -0
  121. /package/dist/src/core/{github-discovery.js → discovery/github-discovery.js} +0 -0
  122. /package/dist/src/core/{private-discovery.js → discovery/private-discovery.js} +0 -0
  123. /package/dist/src/core/{ranking.js → discovery/ranking.js} +0 -0
  124. /package/dist/src/core/{atomic-file.js → install/atomic-file.js} +0 -0
  125. /package/dist/src/core/{diff.js → install/diff.js} +0 -0
  126. /package/dist/src/core/{update-watch.js → install/update-watch.js} +0 -0
  127. /package/dist/src/core/{loadout-badge.js → reporting/loadout-badge.js} +0 -0
  128. /package/dist/src/core/{terminal.js → reporting/terminal.js} +0 -0
  129. /package/dist/src/core/{access.js → routing/access.js} +0 -0
  130. /package/dist/src/core/{credentials.js → routing/credentials.js} +0 -0
  131. /package/dist/src/core/{sandbox.js → runtime/sandbox.js} +0 -0
  132. /package/dist/src/core/{active-limit.js → workspace/active-limit.js} +0 -0
  133. /package/dist/src/core/{target-occupancy.js → workspace/target-occupancy.js} +0 -0
@@ -98,7 +98,6 @@ Confirm isolation before any applied command:
98
98
 
99
99
  ```bash
100
100
  loadout status --json
101
- loadout capabilities
102
101
  ```
103
102
 
104
103
  Expected: paths, if shown, are below `TEST_ROOT`; Codex and Claude Code are detected;
@@ -158,8 +157,6 @@ loadout library --json
158
157
  loadout health --explain --json
159
158
  loadout report --json
160
159
  loadout card --json
161
- loadout outcomes --json
162
- loadout capabilities --inspect --json
163
160
  ```
164
161
 
165
162
  Expected:
@@ -184,7 +181,6 @@ Network variants must be run deliberately:
184
181
  loadout catalog --refresh --json
185
182
  loadout health --updates --json
186
183
  loadout scan --agents codex,claude-code --refresh-provenance --json
187
- loadout compare brainstorming --offline --json
188
184
  loadout discover --source mcp-registry --limit 10 --json
189
185
  loadout discover --source skills-sh --limit 10 --json
190
186
  ```
@@ -201,79 +197,7 @@ skills.sh path needs its request-scoped `VERCEL_OIDC_TOKEN`; without one it must
201
197
  previous complete cache or return an attributed `unavailable` result without making
202
198
  an unauthenticated request. Neither source installs or promotes a lead.
203
199
 
204
- ## 3. Package, manifest, lock, portability, and registry track (S/A)
205
-
206
- Create a package _inside_ the test project so its manifest can be exported portably:
207
-
208
- ```bash
209
- mkdir -p "$TEST_PROJECT/packages"
210
- loadout create "$TEST_PROJECT/packages/matrix-demo" \
211
- --name matrix-demo --description "Disposable matrix package"
212
- loadout pack "$TEST_PROJECT/packages/matrix-demo" --json
213
- loadout publish "$TEST_PROJECT/packages/matrix-demo" --local
214
- loadout search matrix-demo --json
215
-
216
- loadout init --path "$TEST_PROJECT/loadout.json" --name matrix \
217
- --agents codex,claude-code --scope project
218
- (
219
- cd "$TEST_PROJECT"
220
- loadout add local-demo --manifest loadout.json --local \
221
- --path packages/matrix-demo --agents codex,claude-code
222
- loadout sync --manifest loadout.json --lock loadout.lock
223
- loadout sync --manifest loadout.json --lock loadout.lock --yes
224
- loadout audit --manifest loadout.json --lock loadout.lock --json
225
- )
226
- ```
227
-
228
- Expected: `pack` returns a deterministic digest; local publication is immutable;
229
- the first `sync` is a dry run; applied sync prints one snapshot; `audit` returns
230
- `"valid": true`; skills appear only below the disposable profile.
231
-
232
- Exercise desired-state editing and portability:
233
-
234
- ```bash
235
- (
236
- cd "$TEST_PROJECT"
237
- loadout lock --manifest loadout.json --output loadout.lock
238
- loadout export portable.json --manifest loadout.json --lock loadout.lock
239
- loadout import portable.json --manifest imported.json --lock imported.lock
240
- loadout import portable.json --manifest imported.json --lock imported.lock --yes
241
- loadout unadd local-demo --manifest imported.json
242
- )
243
- ```
244
-
245
- Expected: import previews before writing; applied import snapshots destinations;
246
- `unadd` changes desired state only and does not delete installed files.
247
-
248
- The full authenticated remote-registry protocol, including wrong-token rejection,
249
- immutable-version conflict rejection, exact digest download, risk approval, and the
250
- HTTPS/non-loopback boundary, is reproducibly covered by:
251
-
252
- ```bash
253
- npx vitest run tests/registry-api.test.ts tests/package.test.ts
254
- ```
255
-
256
- Manual `registry-serve`/remote `publish` is an X test. After completing the throwaway
257
- credential setup in track 9, start this in one terminal:
258
-
259
- ```bash
260
- loadout registry-serve --port 7331 \
261
- --credential-keychain loadout-registry-test --credential-account tester
262
- ```
263
-
264
- Then publish from another terminal:
265
-
266
- ```bash
267
- loadout publish "$TEST_PROJECT/packages/matrix-demo" \
268
- --registry-url http://127.0.0.1:7331 \
269
- --credential-keychain loadout-registry-test --credential-account tester
270
- ```
271
-
272
- Never place the token on the command line. An identical version/content publish may
273
- be accepted idempotently; changed content at the same version must be rejected. Stop
274
- the server with Ctrl-C.
275
-
276
- ## 4. Install, active-set, outcome, and rollback track (A; Maximum is N)
200
+ ## 3. Install, active-set, and rollback track (A; Maximum is N)
277
201
 
278
202
  Exercise the new-user golden path before its constituent commands:
279
203
 
@@ -321,9 +245,6 @@ loadout disable direct-demo --agents codex
321
245
  loadout disable direct-demo --agents codex --yes --json
322
246
  loadout enable direct-demo --agents codex
323
247
  loadout enable direct-demo --agents codex --yes --json
324
- loadout outcome direct-demo/direct-demo --agent codex --task testing \
325
- --result success
326
- loadout outcomes --json
327
248
  loadout share "$TEST_PROJECT/share.json"
328
249
  loadout remove direct-demo
329
250
  loadout remove direct-demo --yes
@@ -355,7 +276,7 @@ and preserves matching active Stable units at the same reviewed commit; MCP-only
355
276
  packages remain explicit setup items. `--approve-risk` acknowledges displayed static
356
277
  findings but does not execute third-party repository scripts.
357
278
 
358
- ## 5. Existing-skill provenance, adoption, comparison, and freshness (R/S/A)
279
+ ## 4. Existing-skill provenance, adoption, and freshness (R/S/A)
359
280
 
360
281
  Copy one harmless skill into the disposable unmanaged profile, then inspect it:
361
282
 
@@ -366,7 +287,6 @@ cp "$TEST_PROJECT/packages/matrix-demo/skills/matrix-demo/SKILL.md" \
366
287
  loadout scan --agents codex --json
367
288
  loadout adopt unmanaged-demo --agent codex --json
368
289
  loadout adopt unmanaged-demo --agent codex --yes --json
369
- loadout compare unmanaged-demo --agent codex --offline --json
370
290
  ```
371
291
 
372
292
  Expected: scan labels the copy unmanaged; adoption preview does not change its bytes;
@@ -401,13 +321,12 @@ Only run the second command when the first reports a real reviewed update. Expec
401
321
  exact diff/safety plan, a snapshot on success, and refusal when new risky findings are
402
322
  not acknowledged with `--approve-risk`.
403
323
 
404
- ## 6. Discovery and human review queue (N/S)
324
+ ## 5. Discovery and human review queue (N/S)
405
325
 
406
326
  ```bash
407
327
  loadout discover --source hacker-news --limit 20 --min-score 20 --json
408
328
  loadout discover --source github --limit 20 --queue --json
409
329
  loadout discover --source all --limit 20 --queue --json
410
- loadout review-queue --decision pending --json
411
330
  ```
412
331
 
413
332
  Expected: results contain source evidence and public repository identifiers; queueing
@@ -415,12 +334,6 @@ deduplicates leads; nothing is promoted, cloned into an agent, or installed.
415
334
 
416
335
  For a repository printed by the queue:
417
336
 
418
- ```bash
419
- loadout review owner/repository --decision shortlisted
420
- loadout review-queue --decision shortlisted --json
421
- loadout review owner/repository --decision ignored
422
- ```
423
-
424
337
  Private GitHub discovery is opt-in and reads `GITHUB_TOKEN` only when `--private` is
425
338
  present. Prefer a native credential reference:
426
339
 
@@ -431,7 +344,7 @@ loadout discover --source github --private \
431
344
 
432
345
  Use a low-scope test token. The output and state must never contain its value.
433
346
 
434
- ## 7. Static inspection, MCP, conversion, canary, and sandbox (R/S/X)
347
+ ## 6. Static inspection, MCP, and conversion (R/S)
435
348
 
436
349
  Static package analysis never executes package content:
437
350
 
@@ -439,8 +352,6 @@ Static package analysis never executes package content:
439
352
  loadout inspect --source "$TEST_PROJECT/packages/matrix-demo" --json
440
353
  loadout evaluate --source "$TEST_PROJECT/packages/matrix-demo" --json
441
354
  loadout mcp --source "$TEST_PROJECT/packages/matrix-demo" --json
442
- loadout canary --source "$TEST_PROJECT/packages/matrix-demo" \
443
- --package matrix-demo --json
444
355
  ```
445
356
 
446
357
  Repeat `inspect`, `evaluate`, or `mcp` with `--repository owner/repository` for the
@@ -469,10 +380,6 @@ loadout mcp-config --config "$TEST_PROJECT/mcp.json" --name local-example \
469
380
  --command node --arg server.js
470
381
  loadout mcp-config --config "$TEST_PROJECT/mcp.json" --name local-example \
471
382
  --command node --arg server.js --yes
472
- loadout codex-mcp-config --config "$TEST_PROJECT/config.toml" \
473
- --name remote-example --url https://example.com/mcp
474
- loadout codex-mcp-config --config "$TEST_PROJECT/config.toml" \
475
- --name remote-example --url https://example.com/mcp --yes
476
383
  loadout mcp-recipe --json
477
384
  ```
478
385
 
@@ -486,148 +393,11 @@ requirements you have reviewed.
486
393
 
487
394
  Docker sandbox execution is intentionally separate:
488
395
 
489
- ```bash
490
- loadout sandbox-run --source "$TEST_PROJECT/packages/matrix-demo" \
491
- --image '<reviewed-image>@sha256:<digest>' \
492
- --command node --command --version --json
493
- loadout sandbox-run --source "$TEST_PROJECT/packages/matrix-demo" \
494
- --image '<reviewed-image>@sha256:<digest>' \
495
- --command node --command --version \
496
- --approve-risk --timeout 30000 --json
497
- ```
498
-
499
396
  Expected: the first invocation refuses/only plans without approval; the approved
500
397
  container has a read-only source mount, no inherited secrets, no Docker socket, no
501
398
  network, and a time bound. The image may need to be pulled beforehand.
502
399
 
503
- ## 8. Signing and head-to-head evidence (S)
504
-
505
- Validate the model-free benchmark campaign and card/compare surfaces with their
506
- deterministic automated contracts:
507
-
508
- ```bash
509
- npx vitest run tests/benchmark-campaign.test.ts tests/benchmark-cli.test.ts \
510
- tests/loadout-card.test.ts tests/share-report.test.ts
511
- ```
512
-
513
- Expected: campaign hashes and paired order are deterministic, every retry is included
514
- in the worst-case budget, over-budget plans are blocked, resumable metadata contains
515
- no prompt/output/credential bytes, and aggregate comparison never invents a quality
516
- delta. See `docs/EVALUATION_PROTOCOL_V1.md` for the campaign JSON contract. These
517
- tests do not call a model provider and consume no provider credit.
518
-
519
- ```bash
520
- loadout keygen --private-key "$TEST_ROOT/private.pem" \
521
- --public-key "$TEST_ROOT/public.pem"
522
- loadout catalog-sign --catalog "$LOADOUT_ROOT/catalog/packages.json" \
523
- --private-key "$TEST_ROOT/private.pem" --output "$TEST_ROOT/catalog.signed.json"
524
- loadout catalog-verify --snapshot "$TEST_ROOT/catalog.signed.json" \
525
- --public-key "$TEST_ROOT/public.pem"
526
- ```
527
-
528
- Expected: the private key is owner-only and outside the repository; verification
529
- succeeds; changing any byte in the signed payload makes verification fail.
530
-
531
- Preview and apply the same signed catalog inside the disposable profile:
532
-
533
- ```bash
534
- loadout catalog-update --source "$TEST_ROOT/catalog.signed.json" \
535
- --public-key "$TEST_ROOT/public.pem"
536
- loadout catalog-update --source "$TEST_ROOT/catalog.signed.json" \
537
- --public-key "$TEST_ROOT/public.pem" --yes
538
- loadout catalog --coverage --json
539
- ```
540
-
541
- Expected: preview prints an exact signed diff without mutation; apply creates a
542
- snapshot and trusted state; the effective catalog re-verifies the stored envelope.
543
- Repeating `--yes` refuses a replay. Test removal only in the disposable profile and
544
- only with the separate `--allow-removals` acknowledgement.
545
-
546
- The repository's generated feed can be triaged without network access:
547
-
548
- ```bash
549
- loadout candidate list --limit 5 --json
550
- loadout candidate list --query "codex skills"
551
- loadout capabilities --gaps --json
552
- loadout recommend --project "$TEST_PROJECT" --agent codex --json
553
- ```
554
-
555
- `candidate inspect owner/repository --output ./candidate-dossier.json` is a networked
556
- test: it performs a real public Git clone and writes a static immutable dossier to
557
- disposable Loadout state. Review that output before exercising `candidate propose`;
558
- proposal preview and approved proposal output never mutate the catalog.
559
-
560
- Graphify is an explicit executable recipe rather than a broad-setup component. With
561
- `uv` installed, exercise it only inside the disposable profile:
562
-
563
- ```bash
564
- loadout tool
565
- loadout tool graphify --agents codex
566
- loadout tool graphify --agents codex --yes --approve-risk
567
- "$LOADOUT_HOME/runtime/graphify/bin/graphify" --version
568
- test -f "$LOADOUT_USER_HOME/.codex/skills/graphify/SKILL.md"
569
- loadout tool graphify --remove
570
- loadout tool graphify --remove --yes --approve-risk
571
- test ! -e "$LOADOUT_USER_HOME/.codex/skills/graphify"
572
- test ! -e "$LOADOUT_HOME/runtime/graphify"
573
- ```
574
-
575
- Expected: preview identifies the exact wheel hash and all commands; apply reports
576
- Graphify 0.9.17, writes only the disposable target and isolated runtime, and removal
577
- restores the original target. The installer subprocess must not inherit API keys.
578
-
579
- Create a deterministic workflow fixture and five declared trials per candidate. This
580
- is harness input, not model-generated evidence, and it executes no candidate content:
581
-
582
- ```bash
583
- node --input-type=module <<'NODE'
584
- import { writeFile } from "node:fs/promises";
585
- const root = process.env.TEST_PROJECT;
586
- const fixture = {
587
- id: "matrix-workflow",
588
- version: "1",
589
- category: "workflow-adherence",
590
- requiredActions: ["inspect", "edit", "verify"],
591
- forbiddenActions: ["delete-unrelated"]
592
- };
593
- const trials = Array.from({ length: 5 }, () => [
594
- {
595
- candidateId: "baseline",
596
- fixtureId: fixture.id,
597
- observations: ["inspect", "edit", "verify"],
598
- durationMs: 10
599
- },
600
- {
601
- candidateId: "improved",
602
- fixtureId: fixture.id,
603
- observations: ["inspect", "edit", "verify", "report-uncertainty"],
604
- durationMs: 10
605
- }
606
- ]).flat();
607
- await writeFile(`${root}/fixture.json`, JSON.stringify(fixture, null, 2));
608
- await writeFile(`${root}/trials.json`, JSON.stringify(trials, null, 2));
609
- NODE
610
- ```
611
-
612
- Sign and inspect the resulting evidence:
613
-
614
- ```bash
615
- loadout head-to-head --fixture "$TEST_PROJECT/fixture.json" \
616
- --trials "$TEST_PROJECT/trials.json" --private-key "$TEST_ROOT/private.pem" \
617
- --output "$TEST_ROOT/evidence.json" --json
618
- loadout alerts --evidence "$TEST_ROOT/evidence.json" \
619
- --public-key "$TEST_ROOT/public.pem" --json
620
- ```
621
-
622
- The harness scores declared observations only. It never executes candidate content.
623
- The authoritative schema, safety-failure, minimum-trial, tamper, and practical-delta
624
- tests are also directly runnable:
625
-
626
- ```bash
627
- npx vitest run tests/head-to-head.test.ts tests/signing.test.ts
628
- ```
629
-
630
- ## 9. Credentials and model-provider verification (H/$)
400
+ ## 7. Credentials and model-provider verification (H/$)
631
401
 
632
402
  This track touches the real operating-system credential store even when
633
403
  `LOADOUT_HOME` is disposable. Use a unique throwaway service name and delete it.
@@ -668,7 +438,7 @@ unset OPENROUTER_API_KEY
668
438
  `models verify` makes one minimal request and may consume provider credit ($). Inspect
669
439
  provider billing before and after; do not run it in a loop.
670
440
 
671
- ## 10. Watchers, native scheduling, completions, and loopback UI/API (X/H)
441
+ ## 8. Watchers, native scheduling, completions, and loopback UI/API (X/H)
672
442
 
673
443
  One-shot update watching is safe and networked:
674
444
 
@@ -707,33 +477,10 @@ and `unschedule` commands remain available for job-specific control.
707
477
 
708
478
  The optional read-only loopback API can be checked separately:
709
479
 
710
- ```bash
711
- loadout serve --port 0
712
- ```
713
-
714
480
  Confirm that it binds only to `127.0.0.1`, inspect the API response, and stop it with
715
481
  Ctrl-C. It must not bind a public interface.
716
482
 
717
- ## 11. Improvement-cycle records (S)
718
-
719
- ```bash
720
- loadout improve --json
721
- loadout improve --write --output "$TEST_PROJECT/improvements" --json
722
- ```
723
-
724
- Copy the exact cycle id printed by the second command:
725
-
726
- ```bash
727
- loadout improve-feedback --id <cycle-id> --outcome partial \
728
- --note "Disposable matrix verification" \
729
- --directory "$TEST_PROJECT/improvements"
730
- ```
731
-
732
- Expected: the first command is read-only; `--write` persists a local prompt/cycle
733
- record only; feedback requires a human-selected outcome and stores no project source
734
- or prompt transcript.
735
-
736
- ## 12. Cleanup and pass criteria
483
+ ## 9. Cleanup and pass criteria
737
484
 
738
485
  First verify snapshot availability and roll back any remaining disposable mutation:
739
486
 
@@ -19,6 +19,11 @@ paste a token into a manifest, catalog, log, or command argument.
19
19
 
20
20
  ## Local flow and failure modes
21
21
 
22
+ > **Partly unimplemented.** `loadout connect` and `loadout disconnect` do not
23
+ > exist in the CLI today. `loadout discover --private` is real and reads
24
+ > credentials the user has already configured. Steps 1, 2, 3, and 5 describe the
25
+ > intended flow, not current behaviour.
26
+
22
27
  1. `loadout connect github` opens a browser using PKCE and a loopback callback.
23
28
  2. The local process verifies `state`, PKCE verifier, expiration, and callback host.
24
29
  3. It stores only an OS-keychain reference to the refresh/session material.
@@ -26,7 +26,7 @@ their `SKILL.md` files, and writes a local index below `LOADOUT_HOME/provenance`
26
26
 
27
27
  ## Relationship classification
28
28
 
29
- `loadout compare` uses deterministic relationships:
29
+ `loadout scan` uses deterministic relationships:
30
30
 
31
31
  - `exact-copy`: identical instruction fingerprint;
32
32
  - `divergent-same-name`: same normalized name, different instructions;
@@ -19,7 +19,6 @@ For current behavior and evidence, use:
19
19
  catalog/support facts;
20
20
  - the [changelog](../CHANGELOG.md) for released behavior;
21
21
  - the [feature test matrix](./FEATURE_TEST_MATRIX.md) for adapter evidence;
22
- - the [repository stabilization record](./REPOSITORY_STABILIZATION.md) and
23
22
  [sanitized July 19 live checks](./evidence/live-checks-2026-07-19.json) only when
24
23
  investigating that historical release line.
25
24
 
@@ -21,7 +21,7 @@
21
21
  "status": "proven",
22
22
  "evidence": [
23
23
  "catalog/packages.json",
24
- "src/core/catalog-coverage.ts",
24
+ "src/core/catalog/catalog-coverage.ts",
25
25
  "tests/catalog-coverage.test.ts"
26
26
  ]
27
27
  },
@@ -31,7 +31,7 @@
31
31
  "summary": "Stable selection is defined by the checked-in policy and allowlist.",
32
32
  "evidenceClass": "policy-selected",
33
33
  "status": "proven",
34
- "evidence": ["src/core/profiles.ts", "tests/profiles.test.ts"]
34
+ "evidence": ["src/core/catalog/profiles.ts", "tests/profiles.test.ts"]
35
35
  },
36
36
  {
37
37
  "id": "selection.power",
@@ -39,7 +39,7 @@
39
39
  "summary": "Power selection is defined by the checked-in policy and allowlist.",
40
40
  "evidenceClass": "policy-selected",
41
41
  "status": "proven",
42
- "evidence": ["src/core/profiles.ts", "tests/profiles.test.ts"]
42
+ "evidence": ["src/core/catalog/profiles.ts", "tests/profiles.test.ts"]
43
43
  },
44
44
  {
45
45
  "id": "selection.maximum",
@@ -47,7 +47,10 @@
47
47
  "summary": "Maximum selection keeps optional components in Loadout's managed library rather than activating every component.",
48
48
  "evidenceClass": "integration-verified",
49
49
  "status": "bounded",
50
- "evidence": ["src/core/active-set.ts", "tests/active-set.test.ts"]
50
+ "evidence": [
51
+ "src/core/workspace/active-set.ts",
52
+ "tests/active-set.test.ts"
53
+ ]
51
54
  },
52
55
  {
53
56
  "id": "agents.support",
@@ -56,7 +59,7 @@
56
59
  "evidenceClass": "integration-verified",
57
60
  "status": "bounded",
58
61
  "evidence": [
59
- "src/core/adapters.ts",
62
+ "src/core/agents/adapters.ts",
60
63
  "tests/adapters.test.ts",
61
64
  "tests/adapter-conformance.test.ts"
62
65
  ]
@@ -79,7 +82,7 @@
79
82
  "evidenceClass": "integration-verified",
80
83
  "status": "proven",
81
84
  "evidence": [
82
- "src/core/install.ts",
85
+ "src/core/install/install.ts",
83
86
  "tests/transaction.test.ts",
84
87
  "tests/install.test.ts"
85
88
  ]
@@ -90,7 +93,7 @@
90
93
  "summary": "Update workflows present a bounded local plan before an explicit apply step.",
91
94
  "evidenceClass": "integration-verified",
92
95
  "status": "proven",
93
- "evidence": ["src/core/update.ts", "tests/update.test.ts"]
96
+ "evidence": ["src/core/install/update.ts", "tests/update.test.ts"]
94
97
  },
95
98
  {
96
99
  "id": "updates.saved-profile",
@@ -99,8 +102,8 @@
99
102
  "evidenceClass": "integration-verified",
100
103
  "status": "proven",
101
104
  "evidence": [
102
- "src/core/profile-state.ts",
103
- "src/core/update.ts",
105
+ "src/core/workspace/profile-state.ts",
106
+ "src/core/install/update.ts",
104
107
  "tests/profile-state.test.ts",
105
108
  "tests/update.test.ts"
106
109
  ]
@@ -111,7 +114,7 @@
111
114
  "summary": "Managed installation treats recursively empty leftover skill directories as unoccupied while retaining collision protection for files and symlinks.",
112
115
  "evidenceClass": "integration-verified",
113
116
  "status": "proven",
114
- "evidence": ["src/core/install.ts", "tests/install.test.ts"]
117
+ "evidence": ["src/core/install/install.ts", "tests/install.test.ts"]
115
118
  },
116
119
  {
117
120
  "id": "rollback.snapshot",
@@ -120,7 +123,7 @@
120
123
  "evidenceClass": "integration-verified",
121
124
  "status": "proven",
122
125
  "evidence": [
123
- "src/core/snapshot.ts",
126
+ "src/core/install/snapshot.ts",
124
127
  "tests/snapshot.test.ts",
125
128
  "tests/transaction.test.ts"
126
129
  ]
@@ -131,7 +134,7 @@
131
134
  "summary": "Recommendations expose bounded repository and local evidence rather than universal quality claims.",
132
135
  "evidenceClass": "unit-verified",
133
136
  "status": "bounded",
134
- "evidence": ["src/core/recommend.ts", "tests/recommend.test.ts"]
137
+ "evidence": ["src/core/workspace/recommend.ts", "tests/recommend.test.ts"]
135
138
  },
136
139
  {
137
140
  "id": "trust.stages",
@@ -140,7 +143,7 @@
140
143
  "evidenceClass": "structural",
141
144
  "status": "proven",
142
145
  "evidence": [
143
- "src/core/profiles.ts",
146
+ "src/core/catalog/profiles.ts",
144
147
  "tests/profiles.test.ts",
145
148
  "docs/CATALOG_POLICY.md"
146
149
  ]
@@ -152,7 +155,7 @@
152
155
  "evidenceClass": "integration-verified",
153
156
  "status": "proven",
154
157
  "evidence": [
155
- "src/core/github-discovery.ts",
158
+ "src/core/discovery/github-discovery.ts",
156
159
  "tests/daily-discovery.test.ts",
157
160
  "tests/review-queue.test.ts"
158
161
  ]
@@ -177,7 +180,7 @@
177
180
  "status": "proven",
178
181
  "evidence": [
179
182
  "src/cli.ts",
180
- "src/core/mcp-recipes.ts",
183
+ "src/core/runtime/mcp-recipes.ts",
181
184
  "tests/cli-help.test.ts",
182
185
  "tests/mcp-recipes.test.ts"
183
186
  ]
@@ -188,7 +191,7 @@
188
191
  "summary": "MCP configuration uses explicit plans and keeps credentials outside persisted shared manifests.",
189
192
  "evidenceClass": "integration-verified",
190
193
  "status": "proven",
191
- "evidence": ["src/core/mcp.ts", "tests/mcp-config.test.ts"]
194
+ "evidence": ["src/core/runtime/mcp.ts", "tests/mcp-config.test.ts"]
192
195
  },
193
196
  {
194
197
  "id": "manifests.portability",
@@ -197,7 +200,7 @@
197
200
  "evidenceClass": "structural",
198
201
  "status": "proven",
199
202
  "evidence": [
200
- "src/core/manifest.ts",
203
+ "src/core/workspace/manifest.ts",
201
204
  "src/shared/schemas.ts",
202
205
  "tests/manifest.test.ts"
203
206
  ]
@@ -209,8 +212,8 @@
209
212
  "evidenceClass": "integration-verified",
210
213
  "status": "bounded",
211
214
  "evidence": [
212
- "src/core/uninstall.ts",
213
- "src/core/remove.ts",
215
+ "src/core/install/uninstall.ts",
216
+ "src/core/install/remove.ts",
214
217
  "tests/uninstall.test.ts"
215
218
  ]
216
219
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "loadout-ai",
3
- "version": "0.6.0",
3
+ "version": "0.8.0",
4
4
  "private": false,
5
5
  "license": "MIT",
6
6
  "description": "Universal upgrade manager for AI coding agents",
@@ -11,10 +11,10 @@
11
11
  "files": [
12
12
  "dist/src",
13
13
  "catalog",
14
+ "skills",
14
15
  "docs",
15
16
  "README.md",
16
17
  "CHANGELOG.md",
17
- "MASTER_PLAN.md",
18
18
  "SECURITY.md",
19
19
  "LICENSE"
20
20
  ],
@@ -56,6 +56,7 @@
56
56
  "test:e2e:readme": "node scripts/readme-product-flow.mjs",
57
57
  "test:package": "node scripts/package-smoke.mjs",
58
58
  "pretest:performance": "npm run build",
59
+ "test:coverage": "vitest run --coverage",
59
60
  "test:performance": "node scripts/scan-benchmark.mjs",
60
61
  "typecheck": "tsc -p tsconfig.json --noEmit",
61
62
  "readme:update": "node scripts/update-readme-facts.mjs",
@@ -64,8 +65,9 @@
64
65
  "check:live": "node scripts/check-live-evidence.mjs",
65
66
  "check:allowlists": "npm run build && node scripts/check-mode-allowlists.mjs",
66
67
  "check:catalog-freshness": "npm run build && node scripts/check-catalog-freshness.mjs",
67
- "check:evidence": "node scripts/check-catalog-attribution.mjs && node scripts/check-discovery-artifacts.mjs && npm run check:readme-claims",
68
- "verify": "npm run format:check && npm run lint && npm run typecheck && npm run check:evidence && npm test -- --run && npm run test:e2e:cli && npm run test:e2e:readme && npm run test:package && npm run test:performance",
68
+ "check:audit": "npm audit --audit-level=high",
69
+ "check:evidence": "node scripts/check-catalog-attribution.mjs && node scripts/check-discovery-artifacts.mjs && node scripts/check-documented-commands.mjs && npm run check:readme-claims",
70
+ "verify": "npm run format:check && npm run lint && npm run typecheck && npm run check:audit && npm run check:evidence && npm test -- --run && npm run test:e2e:cli && npm run test:e2e:readme && npm run test:package && npm run test:performance",
69
71
  "verify:full": "npm run verify"
70
72
  },
71
73
  "dependencies": {
@@ -75,6 +77,7 @@
75
77
  "devDependencies": {
76
78
  "@eslint/js": "^9.39.5",
77
79
  "@types/node": "^22.10.0",
80
+ "@vitest/coverage-v8": "^4.1.10",
78
81
  "eslint": "^9.39.5",
79
82
  "eslint-config-prettier": "^10.1.8",
80
83
  "prettier": "^3.9.5",