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.
- package/CHANGELOG.md +72 -0
- package/README.md +129 -26
- package/catalog/discovered.json +28469 -24524
- package/dist/src/cli.js +7 -2
- package/dist/src/commands/agents.js +6 -23
- package/dist/src/commands/catalog.js +186 -102
- package/dist/src/commands/health.js +6 -6
- package/dist/src/commands/inventory.js +19 -120
- package/dist/src/commands/lifecycle.js +13 -51
- package/dist/src/commands/mcp.js +10 -73
- package/dist/src/commands/setup.js +5 -5
- package/dist/src/commands/sharing.js +11 -108
- package/dist/src/commands/support.js +20 -9
- package/dist/src/core/{adapters.js → agents/adapters.js} +2 -2
- package/dist/src/core/{agent-inspection.js → agents/agent-inspection.js} +48 -6
- package/dist/src/core/{codex-mcp.js → agents/codex-mcp.js} +1 -1
- package/dist/src/core/{health-score-evidence.js → agents/health-score-evidence.js} +8 -8
- package/dist/src/core/{runtime-tools.js → agents/runtime-tools.js} +2 -2
- package/dist/src/core/{audit.js → catalog/audit.js} +4 -4
- package/dist/src/core/{catalog.js → catalog/catalog.js} +5 -5
- package/dist/src/core/{components.js → catalog/components.js} +2 -2
- package/dist/src/core/{conformance.js → catalog/conformance.js} +2 -2
- package/dist/src/core/{profiles.js → catalog/profiles.js} +2 -2
- package/dist/src/core/{provenance.js → catalog/provenance.js} +3 -3
- package/dist/src/core/{registry.js → catalog/registry.js} +59 -11
- package/dist/src/core/{safety.js → catalog/safety.js} +36 -7
- package/dist/src/core/{skill-compare.js → catalog/skill-compare.js} +1 -1
- package/dist/src/core/{skill-inventory.js → catalog/skill-inventory.js} +3 -3
- package/dist/src/core/{skills.js → catalog/skills.js} +1 -1
- package/dist/src/core/{candidate-intelligence.js → discovery/candidate-intelligence.js} +6 -6
- package/dist/src/core/{discovery-connector.js → discovery/discovery-connector.js} +2 -2
- package/dist/src/core/{evaluate.js → discovery/evaluate.js} +2 -2
- package/dist/src/core/{mcp-registry-discovery.js → discovery/mcp-registry-discovery.js} +1 -1
- package/dist/src/core/{observations.js → discovery/observations.js} +3 -3
- package/dist/src/core/{review-queue.js → discovery/review-queue.js} +2 -2
- package/dist/src/core/{skills-sh-discovery.js → discovery/skills-sh-discovery.js} +1 -1
- package/dist/src/core/{adopt.js → install/adopt.js} +3 -3
- package/dist/src/core/{catalog-install.js → install/catalog-install.js} +11 -11
- package/dist/src/core/{file-lock.js → install/file-lock.js} +1 -1
- package/dist/src/core/{install.js → install/install.js} +5 -5
- package/dist/src/core/{package.js → install/package.js} +3 -3
- package/dist/src/core/{reconcile.js → install/reconcile.js} +5 -5
- package/dist/src/core/{remove.js → install/remove.js} +4 -4
- package/dist/src/core/{snapshot.js → install/snapshot.js} +1 -1
- package/dist/src/core/{source.js → install/source.js} +22 -8
- package/dist/src/core/{sync.js → install/sync.js} +9 -9
- package/dist/src/core/{transaction.js → install/transaction.js} +1 -1
- package/dist/src/core/{uninstall.js → install/uninstall.js} +4 -4
- package/dist/src/core/{update.js → install/update.js} +4 -4
- package/dist/src/core/{cli-guide.js → reporting/cli-guide.js} +29 -45
- package/dist/src/core/reporting/completion.js +90 -0
- package/dist/src/core/{doctor.js → reporting/doctor.js} +5 -10
- package/dist/src/core/{freshness-alerts.js → reporting/freshness-alerts.js} +5 -5
- package/dist/src/core/{health.js → reporting/health.js} +6 -6
- package/dist/src/core/{loadout-card.js → reporting/loadout-card.js} +1 -1
- package/dist/src/core/{readme-claims.js → reporting/readme-claims.js} +1 -1
- package/dist/src/core/{readme-facts.js → reporting/readme-facts.js} +2 -2
- package/dist/src/core/{share-report.js → reporting/share-report.js} +3 -3
- package/dist/src/core/{upgrade.js → reporting/upgrade.js} +7 -7
- package/dist/src/core/routing/first-party-skills.js +118 -0
- package/dist/src/core/routing/handoff.js +314 -0
- package/dist/src/core/{model-config.js → routing/model-config.js} +4 -4
- package/dist/src/core/routing/policy.js +147 -0
- package/dist/src/core/{route.js → routing/route.js} +202 -39
- package/dist/src/core/{api.js → runtime/api.js} +4 -4
- package/dist/src/core/{canary.js → runtime/canary.js} +1 -1
- package/dist/src/core/{github.js → runtime/github.js} +1 -1
- package/dist/src/core/{mcp-recipes.js → runtime/mcp-recipes.js} +1 -1
- package/dist/src/core/{mcp.js → runtime/mcp.js} +2 -2
- package/dist/src/core/{scheduler.js → runtime/scheduler.js} +4 -4
- package/dist/src/core/{active-policy.js → workspace/active-policy.js} +2 -2
- package/dist/src/core/{active-set.js → workspace/active-set.js} +2 -2
- package/dist/src/core/{improve.js → workspace/improve.js} +3 -3
- package/dist/src/core/{manifest.js → workspace/manifest.js} +2 -2
- package/dist/src/core/{outcomes.js → workspace/outcomes.js} +3 -3
- package/dist/src/core/{portable.js → workspace/portable.js} +3 -3
- package/dist/src/core/{profile-state.js → workspace/profile-state.js} +1 -1
- package/dist/src/core/{recommend.js → workspace/recommend.js} +1 -1
- package/dist/src/core/{state.js → workspace/state.js} +3 -3
- package/docs/CANDIDATE_INTELLIGENCE.md +9 -2
- package/docs/CATALOG.md +1 -1
- package/docs/CREDENTIAL_AND_UPDATE_POLICY.md +1 -1
- package/docs/DISCOVERED.md +250 -248
- package/docs/FEATURE_TEST_MATRIX.md +7 -260
- package/docs/GITHUB_AUTHORIZATION.md +5 -0
- package/docs/PROVENANCE_AND_COMPARISON.md +1 -1
- package/docs/RELEASE_REVIEW.md +0 -1
- package/docs/evidence/readme-claims.json +22 -19
- package/package.json +7 -4
- package/skills/loadout-curator/SKILL.md +105 -0
- package/skills/loadout-router/SKILL.md +85 -0
- package/MASTER_PLAN.md +0 -2207
- package/dist/src/core/completion.js +0 -143
- package/dist/src/core/handoff.js +0 -161
- package/docs/ACTIVE_SET.md +0 -53
- package/docs/COMPATIBILITY_POLICY.md +0 -22
- package/docs/CONVERSION_AND_SANDBOX.md +0 -27
- package/docs/EVALUATION_PROTOCOL_V1.md +0 -300
- package/docs/HEAD_TO_HEAD_EVALUATION.md +0 -79
- package/docs/PROVIDER_CONFIGURATION.md +0 -45
- package/docs/README_RESEARCH.md +0 -36
- package/docs/REPOSITORY_STABILIZATION.md +0 -190
- package/docs/SAFE_UPDATE_DEMO.md +0 -25
- package/docs/SCHEMA_DECISIONS.md +0 -25
- package/docs/SUBMISSION_COPY.md +0 -90
- package/docs/TEAM_POLICY.md +0 -18
- package/docs/superpowers/plans/2026-07-19-relatable-readme-hero.md +0 -283
- package/docs/superpowers/plans/2026-07-20-loadout-readme-explainer.md +0 -116
- package/docs/superpowers/plans/2026-07-20-project-activation-safety.md +0 -469
- package/docs/superpowers/specs/2026-07-19-relatable-readme-hero-design.md +0 -80
- package/docs/superpowers/specs/2026-07-20-loadout-readme-explainer-design.md +0 -55
- package/docs/superpowers/specs/2026-07-20-project-activation-safety-design.md +0 -228
- /package/dist/src/core/{agent-health-score.js → agents/agent-health-score.js} +0 -0
- /package/dist/src/core/{agent-versions.js → agents/agent-versions.js} +0 -0
- /package/dist/src/core/{conversion.js → agents/conversion.js} +0 -0
- /package/dist/src/core/{paths.js → agents/paths.js} +0 -0
- /package/dist/src/core/{runtime-tool-recipe.js → agents/runtime-tool-recipe.js} +0 -0
- /package/dist/src/core/{catalog-coverage.js → catalog/catalog-coverage.js} +0 -0
- /package/dist/src/core/{skill-security.js → catalog/skill-security.js} +0 -0
- /package/dist/src/core/{community.js → discovery/community.js} +0 -0
- /package/dist/src/core/{github-discovery.js → discovery/github-discovery.js} +0 -0
- /package/dist/src/core/{private-discovery.js → discovery/private-discovery.js} +0 -0
- /package/dist/src/core/{ranking.js → discovery/ranking.js} +0 -0
- /package/dist/src/core/{atomic-file.js → install/atomic-file.js} +0 -0
- /package/dist/src/core/{diff.js → install/diff.js} +0 -0
- /package/dist/src/core/{update-watch.js → install/update-watch.js} +0 -0
- /package/dist/src/core/{loadout-badge.js → reporting/loadout-badge.js} +0 -0
- /package/dist/src/core/{terminal.js → reporting/terminal.js} +0 -0
- /package/dist/src/core/{access.js → routing/access.js} +0 -0
- /package/dist/src/core/{credentials.js → routing/credentials.js} +0 -0
- /package/dist/src/core/{sandbox.js → runtime/sandbox.js} +0 -0
- /package/dist/src/core/{active-limit.js → workspace/active-limit.js} +0 -0
- /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.
|
|
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
|
-
##
|
|
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
|
-
##
|
|
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
|
-
##
|
|
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
|
-
##
|
|
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
|
-
##
|
|
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
|
-
##
|
|
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
|
|
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;
|
package/docs/RELEASE_REVIEW.md
CHANGED
|
@@ -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": [
|
|
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.
|
|
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:
|
|
68
|
-
"
|
|
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",
|