loadout-ai 0.7.0 → 0.9.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 +148 -1
- package/README.md +160 -315
- package/SECURITY.md +21 -1
- package/catalog/discovered.json +31269 -26003
- package/catalog/packages.json +4 -4
- package/dist/src/cli.js +13 -0
- package/dist/src/commands/agents.js +3 -1
- package/dist/src/commands/catalog-candidate.js +150 -0
- package/dist/src/commands/catalog-workflows.js +147 -0
- package/dist/src/commands/catalog.js +9 -367
- package/dist/src/commands/coordinate.js +586 -0
- package/dist/src/commands/coordination-discussions.js +194 -0
- package/dist/src/commands/coordination-sessions.js +197 -0
- package/dist/src/commands/inventory.js +4 -2
- package/dist/src/core/agents/agent-inspection.js +26 -4
- package/dist/src/core/{routing → agents}/model-config.js +7 -2
- package/dist/src/core/catalog/catalog.js +1 -0
- package/dist/src/core/catalog/registry.js +44 -10
- package/dist/src/core/catalog/safety.js +36 -7
- package/dist/src/core/coordination/adapters/claude-code.js +154 -0
- package/dist/src/core/coordination/adapters/codex.js +137 -0
- package/dist/src/core/coordination/adapters/types.js +64 -0
- package/dist/src/core/coordination/auth.js +59 -0
- package/dist/src/core/coordination/bridge-lease.js +79 -0
- package/dist/src/core/coordination/conflict-preview.js +167 -0
- package/dist/src/core/coordination/contract-diff.js +106 -0
- package/dist/src/core/coordination/coordinator.js +552 -0
- package/dist/src/core/coordination/crash-recovery.js +169 -0
- package/dist/src/core/coordination/daemon.js +667 -0
- package/dist/src/core/coordination/discussion.js +340 -0
- package/dist/src/core/coordination/events.js +161 -0
- package/dist/src/core/coordination/http-api.js +118 -0
- package/dist/src/core/coordination/interrupt-policy.js +89 -0
- package/dist/src/core/coordination/lock.js +110 -0
- package/dist/src/core/coordination/mcp-server.js +424 -0
- package/dist/src/core/coordination/redaction.js +85 -0
- package/dist/src/core/coordination/replay.js +188 -0
- package/dist/src/core/coordination/retention.js +128 -0
- package/dist/src/core/coordination/runtime.js +21 -0
- package/dist/src/core/coordination/session-manager.js +366 -0
- package/dist/src/core/coordination/watcher.js +128 -0
- package/dist/src/core/{routing → delegation}/first-party-skills.js +25 -13
- package/dist/src/core/{routing → delegation}/handoff.js +130 -63
- package/dist/src/core/discovery/candidate-intelligence-evidence.js +108 -0
- package/dist/src/core/discovery/candidate-intelligence-types.js +1 -0
- package/dist/src/core/discovery/candidate-intelligence-validation.js +108 -0
- package/dist/src/core/discovery/candidate-intelligence.js +3 -214
- package/dist/src/core/discovery/community.js +12 -4
- package/dist/src/core/discovery/github-discovery.js +6 -2
- package/dist/src/core/discovery/private-discovery.js +6 -2
- package/dist/src/core/install/reconcile.js +1 -1
- package/dist/src/core/install/source.js +21 -7
- package/dist/src/core/install/uninstall.js +39 -3
- package/dist/src/core/reporting/cli-guide.js +10 -6
- package/dist/src/core/reporting/completion.js +61 -109
- package/dist/src/core/reporting/doctor.js +4 -6
- package/dist/src/core/runtime/bounded-json.js +65 -0
- package/dist/src/core/runtime/github.js +30 -16
- package/dist/src/core/runtime/mcp-recipes.js +1 -1
- package/dist/src/core/workspace/active-policy.js +1 -1
- package/docs/CANDIDATE_INTELLIGENCE.md +9 -2
- package/docs/CATALOG.md +1 -1
- package/docs/CREDENTIAL_AND_UPDATE_POLICY.md +1 -1
- package/docs/DEMO_SCRIPT.md +19 -23
- package/docs/DISCOVERED.md +251 -250
- package/docs/FEATURE_TEST_MATRIX.md +10 -263
- package/docs/GITHUB_AUTHORIZATION.md +5 -0
- package/docs/LIVE_COLLABORATION.md +234 -0
- package/docs/PROVENANCE_AND_COMPARISON.md +1 -1
- package/docs/REFERENCE.md +163 -0
- package/docs/RELEASE_REVIEW.md +1 -2
- package/docs/TESTING.md +17 -1
- package/docs/USER_TEST_GUIDE.md +138 -3
- package/docs/assets/loadout-discover-activate.webp +0 -0
- package/docs/assets/loadout-handoff-coordinate.webp +0 -0
- package/docs/assets/loadout-social-preview.png +0 -0
- package/docs/decisions/001-coordination-jsonl-locking.md +35 -0
- package/docs/decisions/002-local-daemon-authentication.md +32 -0
- package/docs/decisions/003-bounded-agent-discussions.md +91 -0
- package/docs/specs/BOUNDED_AGENT_DISCUSSIONS.md +169 -0
- package/docs/superpowers/plans/2026-09-03-coordination-hardening.md +231 -0
- package/docs/superpowers/plans/2026-09-03-release-readiness.md +232 -0
- package/docs/superpowers/plans/2026-09-04-bounded-agent-discussions.md +121 -0
- package/package.json +18 -7
- package/skills/loadout-handoff/SKILL.md +238 -0
- package/MASTER_PLAN.md +0 -2207
- package/dist/src/core/routing/route.js +0 -539
- 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/assets/loadout-workflow.png +0 -0
- 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/skills/loadout-router/SKILL.md +0 -120
- /package/dist/src/core/{routing → agents}/credentials.js +0 -0
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
# Loadout Reference
|
|
2
|
+
|
|
3
|
+
Detailed configuration, profiles, integrations, and discovery documentation.
|
|
4
|
+
For the quick start, see the [README](../README.md).
|
|
5
|
+
|
|
6
|
+
## Profiles
|
|
7
|
+
|
|
8
|
+
Loadout is opinionated when you want it to be and precise when you do not. The
|
|
9
|
+
modes differ in one thing: how much of the reviewed catalog they install.
|
|
10
|
+
|
|
11
|
+
| Mode | Sources | Skills | Active by default |
|
|
12
|
+
| --------- | --------------------- | ------ | -------------------------------- |
|
|
13
|
+
| `stable` | 4 | 30 | yes — recommended starting point |
|
|
14
|
+
| `power` | 8 | 56 | yes |
|
|
15
|
+
| `maximum` | all reviewed | all | **no — downloaded but disabled** |
|
|
16
|
+
| `custom` | your `--package` list | varies | yes |
|
|
17
|
+
|
|
18
|
+
**Maximum is the one worth understanding.** It downloads the entire reviewed
|
|
19
|
+
library and leaves every skill _disabled_. Nothing reaches an agent prompt until
|
|
20
|
+
a project activates what it needs:
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
loadout setup --mode maximum --yes
|
|
24
|
+
cd ~/code/my-app
|
|
25
|
+
loadout optimize --project . # scans the repo, proposes an active set
|
|
26
|
+
loadout activate # enable just those here
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
That trade is deliberate: disk is cheap and context is not. A large disabled
|
|
30
|
+
library plus a small active set beats installing everything into every prompt.
|
|
31
|
+
|
|
32
|
+
### Stable: the essentials
|
|
33
|
+
|
|
34
|
+
Stable is the recommended daily driver: **30 selected skill directories from four
|
|
35
|
+
pinned public sources**, installed into each agent you choose.
|
|
36
|
+
|
|
37
|
+
| Included source | What Stable takes from it | GitHub |
|
|
38
|
+
| ---------------------------------------------------------------------- | ------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
39
|
+
| [Superpowers](https://github.com/obra/superpowers) | Planning, execution, testing, review, verification | [](https://github.com/obra/superpowers) |
|
|
40
|
+
| [Context7](https://github.com/upstash/context7) | Current documentation and MCP workflows | [](https://github.com/upstash/context7) |
|
|
41
|
+
| [Addy Osmani Agent Skills](https://github.com/addyosmani/agent-skills) | Engineering, frontend, debugging, performance, docs, shipping | [](https://github.com/addyosmani/agent-skills) |
|
|
42
|
+
| [Agent Skills Marketplace](https://github.com/wshobson/agents) | Architecture, review, error handling, JavaScript, Python | [](https://github.com/wshobson/agents) |
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
loadout setup --mode stable
|
|
46
|
+
loadout setup --mode stable --yes
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
### Power: a larger cross-project toolkit
|
|
50
|
+
|
|
51
|
+
Power draws a skill-level allowlist from eight major collections.
|
|
52
|
+
|
|
53
|
+
| Included source | Focus | GitHub |
|
|
54
|
+
| ------------------------------------------------------------------------ | --------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
55
|
+
| [Anthropic Skills](https://github.com/anthropics/skills) | Documents, frontend, MCP building, web testing | [](https://github.com/anthropics/skills) |
|
|
56
|
+
| [OpenAI Skills](https://github.com/openai/skills) | CLI, docs, browser work, images, security | [](https://github.com/openai/skills) |
|
|
57
|
+
| [Vercel Agent Skills](https://github.com/vercel-labs/agent-skills) | React, web design, composition, deployment | [](https://github.com/vercel-labs/agent-skills) |
|
|
58
|
+
| [Superpowers](https://github.com/obra/superpowers) | Planning, debugging, testing, collaboration | [](https://github.com/obra/superpowers) |
|
|
59
|
+
| [UI UX Pro Max](https://github.com/nextlevelbuilder/ui-ux-pro-max-skill) | UI systems, slides, styling, product design | [](https://github.com/nextlevelbuilder/ui-ux-pro-max-skill) |
|
|
60
|
+
| [Context7](https://github.com/upstash/context7) | Current documentation and MCP workflows | [](https://github.com/upstash/context7) |
|
|
61
|
+
| [Agent Skills Marketplace](https://github.com/wshobson/agents) | Architecture, testing, APIs, TypeScript, Python | [](https://github.com/wshobson/agents) |
|
|
62
|
+
| [Awesome Copilot](https://github.com/github/awesome-copilot) | Codebase knowledge, plans, browser and security workflows | [](https://github.com/github/awesome-copilot) |
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
loadout setup --mode power
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
### Maximum: download broadly, activate intelligently
|
|
69
|
+
|
|
70
|
+
Downloads every non-archived, technically screened skill component into
|
|
71
|
+
Loadout's **disabled local library**. Then let the current project choose:
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
loadout setup --mode maximum
|
|
75
|
+
loadout recommend --project .
|
|
76
|
+
loadout optimize --project . --limit 30
|
|
77
|
+
loadout optimize --project . --limit 30 --yes
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
### Custom: take exact control
|
|
81
|
+
|
|
82
|
+
```bash
|
|
83
|
+
# Replace the managed profile
|
|
84
|
+
loadout setup --mode custom --package superpowers --package context7
|
|
85
|
+
|
|
86
|
+
# Add without replacing
|
|
87
|
+
loadout install --mode custom --package humanizer
|
|
88
|
+
loadout install --mode custom --package obsidian-skills --agents claude-code,cursor
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
Run `loadout profiles` to compare every mode.
|
|
92
|
+
|
|
93
|
+
## MCP integrations
|
|
94
|
+
|
|
95
|
+
Profiles never start MCP servers silently.
|
|
96
|
+
|
|
97
|
+
```bash
|
|
98
|
+
loadout mcp-recipe # list recipes
|
|
99
|
+
loadout mcp-recipe --credential-free # no-credential subset
|
|
100
|
+
loadout mcp-recipe playwright --agent claude-code # preview
|
|
101
|
+
loadout mcp-recipe playwright --agent claude-code --yes # configure
|
|
102
|
+
loadout mcp-recipe playwright --agent claude-code --verify # test
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
Configuration alone does not start the server. Test a real connection separately
|
|
106
|
+
with `--connect --approve-risk`. Loadout can reference credentials from environment
|
|
107
|
+
variables or the OS keychain without printing their values.
|
|
108
|
+
|
|
109
|
+
## Optional runtime tools
|
|
110
|
+
|
|
111
|
+
[Graphify](https://github.com/Graphify-Labs/graphify) is an optional codebase graph
|
|
112
|
+
tool. It does not require an LLM API key:
|
|
113
|
+
|
|
114
|
+
```bash
|
|
115
|
+
loadout tool graphify
|
|
116
|
+
loadout tool graphify --yes --approve-risk
|
|
117
|
+
loadout tool graphify --remove --yes --approve-risk
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
Executable tools remain an explicit choice instead of hiding inside a profile.
|
|
121
|
+
|
|
122
|
+
## Catalog and discovery
|
|
123
|
+
|
|
124
|
+
The catalog is not a frozen list. Loadout separates **discovery** from
|
|
125
|
+
**installation** so a viral repo can be noticed quickly without being trusted
|
|
126
|
+
blindly.
|
|
127
|
+
|
|
128
|
+
```bash
|
|
129
|
+
loadout discover --source all --queue # find candidates
|
|
130
|
+
loadout review-queue # inspect the queue
|
|
131
|
+
loadout candidate inspect owner/repository # deep inspection
|
|
132
|
+
loadout update # check for source changes
|
|
133
|
+
loadout health --updates # managed source health
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
Daily checks are opt-in and read-only:
|
|
137
|
+
|
|
138
|
+
```bash
|
|
139
|
+
loadout autopilot --yes
|
|
140
|
+
loadout autopilot --status
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
## Manage skills you already have
|
|
144
|
+
|
|
145
|
+
```bash
|
|
146
|
+
loadout scan # read-only inventory
|
|
147
|
+
loadout reconcile --refresh # compare with catalog
|
|
148
|
+
loadout reconcile --yes # record ownership for exact matches
|
|
149
|
+
loadout reconcile --replace-outdated # preview replacing old copies
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
Unknown or ambiguous copies stay untouched.
|
|
153
|
+
|
|
154
|
+
## Agent support
|
|
155
|
+
|
|
156
|
+
Loadout's adapter capability matrix covers **12 agents**: Claude Code, Cline,
|
|
157
|
+
Codex, Cursor, Gemini CLI, GitHub Copilot, Hermes, Junie, Kiro CLI, OpenCode,
|
|
158
|
+
Roo Code, Windsurf.
|
|
159
|
+
|
|
160
|
+
See the [complete feature matrix](./FEATURE_TEST_MATRIX.md) for configured
|
|
161
|
+
paths, filesystem lifecycle, platform, and native-host evidence.
|
|
162
|
+
|
|
163
|
+
Use `loadout doctor --verbose` for the local component matrix.
|
package/docs/RELEASE_REVIEW.md
CHANGED
|
@@ -19,10 +19,9 @@ 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
|
|
|
26
|
-
The current release gate is `npm run verify`. Publication status must be checked
|
|
25
|
+
The current release gate is `npm run verify:full`. Publication status must be checked
|
|
27
26
|
against the npm registry and the corresponding GitHub release rather than inferred
|
|
28
27
|
from this archived document.
|
package/docs/TESTING.md
CHANGED
|
@@ -68,7 +68,23 @@ checks the current pinned Stable sources and remains network-dependent.
|
|
|
68
68
|
|
|
69
69
|
Run `npm run verify` for formatting, lint, types, deterministic evidence checks, all
|
|
70
70
|
Vitest suites, both CLI journeys, package smoke, and the performance gate.
|
|
71
|
-
`npm run verify:full`
|
|
71
|
+
Run `npm run verify:full` before a release; it runs that gate and then enforces
|
|
72
|
+
the global and security-sensitive per-file coverage floors.
|
|
73
|
+
|
|
74
|
+
The coordination suites exercise the protocol separately from paid providers:
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
npx vitest run 'tests/coordination*.test.ts'
|
|
78
|
+
npm run test:package
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
They cover cross-process ordering, ownership/revision conflicts, redaction,
|
|
82
|
+
retention and recovery, daemon authentication, MCP framing, provider command/SDK
|
|
83
|
+
shapes, automatic watcher delivery, passive interrupt policy, singleton bridge
|
|
84
|
+
ownership, bounded two-agent discussion turns and reply chains, leases, and
|
|
85
|
+
runaway-turn limits. Fake provider drivers are used for deterministic
|
|
86
|
+
tests; the suite does not spend Claude or Codex quota. Follow the disposable
|
|
87
|
+
manual flow in `docs/USER_TEST_GUIDE.md` for an intentional real-host test.
|
|
72
88
|
|
|
73
89
|
Current npm publication, the current pinned Stable repositories, and GitHub repository
|
|
74
90
|
settings are external state. Check them separately with:
|
package/docs/USER_TEST_GUIDE.md
CHANGED
|
@@ -192,7 +192,142 @@ GitHub token; use `loadout mcp-recipe --credential-free` to exclude every servic
|
|
|
192
192
|
credential too. Browser configuration and real connection testing remain explicit.
|
|
193
193
|
Graphify is a separate runtime tool, not an MCP server.
|
|
194
194
|
|
|
195
|
-
## 8.
|
|
195
|
+
## 8. Test handoff and live coordination in a disposable repository
|
|
196
|
+
|
|
197
|
+
Create a temporary Git repository so the test does not add handoff files to a
|
|
198
|
+
real project:
|
|
199
|
+
|
|
200
|
+
```bash
|
|
201
|
+
mkdir loadout-coordination-test
|
|
202
|
+
cd loadout-coordination-test
|
|
203
|
+
git init
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
First test the stable session-boundary inbox:
|
|
207
|
+
|
|
208
|
+
```bash
|
|
209
|
+
loadout handoff codex "Implement the frontend" --context "Claude owns src/api; consume checkout-api"
|
|
210
|
+
loadout handoff codex
|
|
211
|
+
loadout handoff
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
Copy the task ID printed by the inbox, then settle it:
|
|
215
|
+
|
|
216
|
+
```bash
|
|
217
|
+
loadout handoff --done <task-id>
|
|
218
|
+
loadout handoff codex
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
Next test structured coordination without running either model:
|
|
222
|
+
|
|
223
|
+
```bash
|
|
224
|
+
loadout coord own claude-code src/api
|
|
225
|
+
loadout coord own codex src/web
|
|
226
|
+
loadout coord contract checkout-api --agent claude-code \
|
|
227
|
+
--body "POST /api/checkout -> 201 { id: string }"
|
|
228
|
+
loadout coord snapshot codex
|
|
229
|
+
loadout coord ack codex 2
|
|
230
|
+
loadout coord status
|
|
231
|
+
loadout coord replay
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
Sequence numbers are printed by each command; use the actual latest relevant
|
|
235
|
+
sequence if it differs from `2`. Confirm that the first overlapping exclusive
|
|
236
|
+
claim is refused, then release the original path and confirm the retry succeeds:
|
|
237
|
+
|
|
238
|
+
```bash
|
|
239
|
+
loadout coord own codex src/api/checkout.ts
|
|
240
|
+
loadout coord release claude-code src/api
|
|
241
|
+
loadout coord own codex src/api/checkout.ts
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
Test the authenticated live dashboard in one terminal:
|
|
245
|
+
|
|
246
|
+
```bash
|
|
247
|
+
loadout daemon start
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
Open the exact dashboard URL it prints. In a second terminal, run another
|
|
251
|
+
`loadout coord update` and confirm it appears. A bare `/api/status` request
|
|
252
|
+
without the bearer token should return `401`. Press Ctrl+C in the daemon
|
|
253
|
+
terminal when finished.
|
|
254
|
+
|
|
255
|
+
Test the packaged MCP transport without changing either agent's configuration:
|
|
256
|
+
|
|
257
|
+
```bash
|
|
258
|
+
loadout serve
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
The process waits for MCP JSON-RPC on stdin and should print no banners or prose
|
|
262
|
+
to stdout. Press Ctrl+C. Host-specific configuration and the exact tool list are
|
|
263
|
+
in [the live coordination guide](./LIVE_COLLABORATION.md).
|
|
264
|
+
|
|
265
|
+
Finally, inspect the provider bridge surface:
|
|
266
|
+
|
|
267
|
+
```bash
|
|
268
|
+
loadout coord agents detect
|
|
269
|
+
loadout coord agents list
|
|
270
|
+
loadout coord agents bridge --help
|
|
271
|
+
```
|
|
272
|
+
|
|
273
|
+
The next commands run real provider turns and may consume Claude/Codex quota.
|
|
274
|
+
Only run them when you intentionally want that test:
|
|
275
|
+
|
|
276
|
+
```bash
|
|
277
|
+
loadout coord agents start claude-code "Claim backend files and publish a test contract"
|
|
278
|
+
loadout coord agents start codex "Read the shared snapshot and acknowledge the contract"
|
|
279
|
+
loadout coord agents bridge claude-code:<session-id> codex:<thread-id> --max-turns 4
|
|
280
|
+
```
|
|
281
|
+
|
|
282
|
+
While the bridge runs, publish a new contract from another terminal. Confirm
|
|
283
|
+
both provider sessions can proceed concurrently and that the bridge prints
|
|
284
|
+
their responses. Progress-only `update` events remain passive by default. Use
|
|
285
|
+
Ctrl+C to stop the bridge. Activate `loadout daemon kill "user test"` to verify
|
|
286
|
+
that new coordination writes and provider turns stop, then run
|
|
287
|
+
`loadout daemon resume`.
|
|
288
|
+
|
|
289
|
+
Now test an actual back-and-forth design discussion. This spends exactly three
|
|
290
|
+
provider turns: one Claude proposal, one Codex critique, and one Claude
|
|
291
|
+
synthesis. Neither agent should edit the disposable repository.
|
|
292
|
+
|
|
293
|
+
```bash
|
|
294
|
+
loadout coord discuss start "Should this test service expose REST or GraphQL?" \
|
|
295
|
+
--agents claude-code,codex \
|
|
296
|
+
--rounds 1 \
|
|
297
|
+
--max-turns 3 \
|
|
298
|
+
--timeout 120
|
|
299
|
+
```
|
|
300
|
+
|
|
301
|
+
Confirm all of the following before publishing:
|
|
302
|
+
|
|
303
|
+
1. stderr announces exactly three paid provider turns before either provider
|
|
304
|
+
runs;
|
|
305
|
+
2. Claude Code proposes a design and Codex directly critiques that proposal;
|
|
306
|
+
3. Claude's synthesis names a decision, rationale, alternatives, and any
|
|
307
|
+
unresolved disagreement;
|
|
308
|
+
4. `loadout coord discuss list` reports the thread as `closed`;
|
|
309
|
+
5. `loadout coord discuss show <thread-id>` shows the linked public transcript;
|
|
310
|
+
6. `loadout coord replay` includes the discussion and the resulting decision;
|
|
311
|
+
7. `git status --short` shows that neither agent edited a project file.
|
|
312
|
+
|
|
313
|
+
Repeat with known real session IDs to validate resumption:
|
|
314
|
+
|
|
315
|
+
```bash
|
|
316
|
+
loadout coord discuss start "What validation boundary should this service use?" \
|
|
317
|
+
--sessions claude-code:<session-id> codex:<thread-id> \
|
|
318
|
+
--rounds 1 --max-turns 3
|
|
319
|
+
```
|
|
320
|
+
|
|
321
|
+
For the kill-switch check, start a two-round discussion in one terminal and run
|
|
322
|
+
`loadout daemon kill "stop design room"` in another while the first provider
|
|
323
|
+
turn is active. The in-flight provider may finish, but its response must not be
|
|
324
|
+
persisted and Codex must not receive the next turn. Run `loadout daemon resume`
|
|
325
|
+
after confirming the halt.
|
|
326
|
+
|
|
327
|
+
Delete the disposable repository after inspection. Its `.handoff` directory
|
|
328
|
+
contains the local task/event audit trail, token, and session IDs.
|
|
329
|
+
|
|
330
|
+
## 9. Preview complete cleanup
|
|
196
331
|
|
|
197
332
|
```bash
|
|
198
333
|
loadout uninstall
|
|
@@ -211,7 +346,7 @@ cleanup deliberately deletes Loadout's snapshots, so it is the last lifecycle te
|
|
|
211
346
|
## Troubleshooting and recovery
|
|
212
347
|
|
|
213
348
|
- **`loadout` is not found after installation:** confirm `npm install --global
|
|
214
|
-
loadout-ai@0.
|
|
349
|
+
loadout-ai@0.9.0` completed, run `hash -r`, and confirm npm's global binary
|
|
215
350
|
directory is on `PATH`. For a source checkout, run `npm run build` and `npm link`.
|
|
216
351
|
- **A preview asks for `--approve-risk`:** read the reported scripts, domains,
|
|
217
352
|
credentials, binaries, or instruction findings. If you accept that specific plan,
|
|
@@ -238,7 +373,7 @@ loadout-ai@0.5.9` completed, run `hash -r`, and confirm npm's global binary
|
|
|
238
373
|
Unmanaged content is preserved, and modified managed files can make cleanup refuse
|
|
239
374
|
until you explicitly review the command's force path.
|
|
240
375
|
|
|
241
|
-
##
|
|
376
|
+
## 10. Advanced surface
|
|
242
377
|
|
|
243
378
|
The first help screen deliberately focuses on daily use. Existing advanced
|
|
244
379
|
commands have not been removed:
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# ADR 001: JSONL plus a project lock for coordination state
|
|
2
|
+
|
|
3
|
+
- Status: accepted
|
|
4
|
+
- Date: 2026-09-03
|
|
5
|
+
|
|
6
|
+
## Context
|
|
7
|
+
|
|
8
|
+
Loadout coordinates a small number of local coding-agent processes in one
|
|
9
|
+
repository. Events need durable ordering, human inspectability, recovery after
|
|
10
|
+
partial writes, and parity across CLI, MCP, HTTP, and provider adapters. A
|
|
11
|
+
database would add installation, migration, backup, and corruption-recovery
|
|
12
|
+
surface before the expected workload requires indexed storage.
|
|
13
|
+
|
|
14
|
+
## Decision
|
|
15
|
+
|
|
16
|
+
Use `.handoff/coordination.jsonl` as the source of truth. Serialize every
|
|
17
|
+
mutation with `.handoff/coordination.lock`, created exclusively with owner-only
|
|
18
|
+
permissions. Allocate event sequences and contract revisions while holding that
|
|
19
|
+
lock. Derive current ownership, contracts, acknowledgements, and snapshots from
|
|
20
|
+
validated events.
|
|
21
|
+
|
|
22
|
+
Compaction holds the same lock, writes a complete owner-only archive first,
|
|
23
|
+
then atomically replaces the working log with a valid summary and retained
|
|
24
|
+
events. Missing files mean empty state; other I/O errors propagate. Invalid
|
|
25
|
+
lines are reported without hiding valid neighbors.
|
|
26
|
+
|
|
27
|
+
## Consequences
|
|
28
|
+
|
|
29
|
+
- The audit trail is readable and easy to back up or remove.
|
|
30
|
+
- Independent local processes cannot allocate duplicate sequences or accept
|
|
31
|
+
conflicting ownership claims concurrently.
|
|
32
|
+
- Reads are linear in the active log, so retention must keep it bounded.
|
|
33
|
+
- This design is for local repository coordination, not a remote multi-user
|
|
34
|
+
service. A future remote transport would require a separate trust and storage
|
|
35
|
+
decision rather than exposing this daemon to a network.
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# ADR 002: Loopback-only authenticated coordination daemon
|
|
2
|
+
|
|
3
|
+
- Status: accepted
|
|
4
|
+
- Date: 2026-09-03
|
|
5
|
+
|
|
6
|
+
## Context
|
|
7
|
+
|
|
8
|
+
A localhost HTTP service is still reachable by browser pages, local malware,
|
|
9
|
+
and other users on an incorrectly configured machine. Coordination events can
|
|
10
|
+
contain private repository structure and can influence paid provider turns.
|
|
11
|
+
|
|
12
|
+
## Decision
|
|
13
|
+
|
|
14
|
+
Bind the daemon only to `127.0.0.1`. Generate a random 32-byte project token in
|
|
15
|
+
`.handoff/daemon.token` with mode `0600`. REST and SSE require a bearer header;
|
|
16
|
+
query-string tokens are rejected. Validate loopback Host headers and allow only
|
|
17
|
+
same-origin browser requests.
|
|
18
|
+
|
|
19
|
+
The CLI passes the token to the dashboard in a URL fragment. The dashboard
|
|
20
|
+
moves it into session storage immediately and removes the fragment from browser
|
|
21
|
+
history. Human-readable status does not expose the project root. Request bodies,
|
|
22
|
+
routes, cursors, agent names, and typed event payloads are bounded and validated.
|
|
23
|
+
|
|
24
|
+
## Consequences
|
|
25
|
+
|
|
26
|
+
- The dashboard opens conveniently without putting credentials in HTTP request
|
|
27
|
+
URLs or referrers.
|
|
28
|
+
- API clients must explicitly read the local token and set `Authorization`.
|
|
29
|
+
- The daemon is observability and local transport only; it is not supported as
|
|
30
|
+
a LAN or internet-facing service.
|
|
31
|
+
- Activating the project kill switch fails closed across storage, daemon,
|
|
32
|
+
compaction, MCP/CLI writes, and provider-driven turns.
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
# ADR 003: Bounded sequential agent discussions
|
|
2
|
+
|
|
3
|
+
## Status
|
|
4
|
+
|
|
5
|
+
Accepted
|
|
6
|
+
|
|
7
|
+
## Date
|
|
8
|
+
|
|
9
|
+
2026-09-04
|
|
10
|
+
|
|
11
|
+
## Context
|
|
12
|
+
|
|
13
|
+
The coordination bridge can deliver structured events to Claude Code and Codex,
|
|
14
|
+
but it does not make the agents deliberate. Users who want both models to weigh
|
|
15
|
+
the same feature must manually relay responses, and an unconstrained automatic
|
|
16
|
+
relay could consume quota indefinitely, spread prompt injection, or let two
|
|
17
|
+
agents edit the same files concurrently.
|
|
18
|
+
|
|
19
|
+
Provider interfaces can start or resume turns, but neither supported interface
|
|
20
|
+
offers a shared hidden context or reliable mid-turn steering. Provider output
|
|
21
|
+
is also untrusted data and may be empty, malformed, oversized, or contain
|
|
22
|
+
instructions unrelated to the user's question.
|
|
23
|
+
|
|
24
|
+
## Decision
|
|
25
|
+
|
|
26
|
+
Implement an opt-in, two-participant design room as a sequential protocol:
|
|
27
|
+
|
|
28
|
+
- one proposer and one reviewer alternate for 1-8 rounds;
|
|
29
|
+
- each response is explicitly public, redacted, bounded, persisted, and linked
|
|
30
|
+
to the prior event by thread and reply IDs;
|
|
31
|
+
- each round costs two provider turns and final synthesis costs one, so the
|
|
32
|
+
exact required budget is known before any provider session starts;
|
|
33
|
+
- prompts prohibit file edits, commands, tools, and disclosure of private
|
|
34
|
+
reasoning;
|
|
35
|
+
- the proposer returns a strict final JSON decision, rationale, alternatives,
|
|
36
|
+
and unresolved disagreements;
|
|
37
|
+
- Loadout emits a normal decision event and a terminal discussion event;
|
|
38
|
+
- provider rejection, invalid output, and empty output close the discussion as
|
|
39
|
+
failed without silent retries;
|
|
40
|
+
- the existing project kill switch is checked before every provider turn;
|
|
41
|
+
- provider turns default to 120 seconds and are explicitly bounded to a
|
|
42
|
+
user-selectable 10-600 seconds.
|
|
43
|
+
|
|
44
|
+
Fresh sessions start lazily with their first discussion prompt so setup does not
|
|
45
|
+
spend a hidden extra turn. Existing provider session IDs are attached without a
|
|
46
|
+
turn and then resumed on the first discussion response. The project bridge
|
|
47
|
+
lease prevents a background bridge and a design room from controlling the same
|
|
48
|
+
sessions concurrently.
|
|
49
|
+
|
|
50
|
+
## Alternatives considered
|
|
51
|
+
|
|
52
|
+
### Let both agents edit the same feature during the discussion
|
|
53
|
+
|
|
54
|
+
Rejected. The purpose of the design room is to settle an approach before file
|
|
55
|
+
ownership and implementation. Concurrent edits make the outcome harder to
|
|
56
|
+
review and reintroduce the conflicts the ownership protocol prevents.
|
|
57
|
+
|
|
58
|
+
### Forward full provider transcripts automatically
|
|
59
|
+
|
|
60
|
+
Rejected. It would expose unrelated context, increase prompt-injection risk,
|
|
61
|
+
and make storage and quota use unpredictable. Only responses requested for the
|
|
62
|
+
public discussion are shared.
|
|
63
|
+
|
|
64
|
+
### Run both agents concurrently and ask a third model to judge
|
|
65
|
+
|
|
66
|
+
Rejected for the first release. Parallel first proposals do not support genuine
|
|
67
|
+
back-and-forth critique, and a third model adds provider, billing, and tie-break
|
|
68
|
+
semantics without evidence that it improves decisions.
|
|
69
|
+
|
|
70
|
+
### Continue until the agents agree
|
|
71
|
+
|
|
72
|
+
Rejected. Agreement is not guaranteed, and an unbounded loop is unsafe. The
|
|
73
|
+
final result preserves unresolved disagreement rather than claiming consensus.
|
|
74
|
+
|
|
75
|
+
### Host a remote coordination bus
|
|
76
|
+
|
|
77
|
+
Rejected for this release. Authentication, tenant isolation, encryption,
|
|
78
|
+
availability, and remote conflict semantics require a separate design. The
|
|
79
|
+
current protocol remains local to one repository and machine.
|
|
80
|
+
|
|
81
|
+
## Consequences
|
|
82
|
+
|
|
83
|
+
- Users get a real Claude↔Codex critique loop with a predictable maximum cost.
|
|
84
|
+
- The transcript is inspectable with `coord discuss show` and the normal replay.
|
|
85
|
+
- The discussion cannot steer a provider mid-turn; a kill switch takes effect
|
|
86
|
+
before the next turn.
|
|
87
|
+
- Strict final JSON may fail when a provider ignores the requested format. That
|
|
88
|
+
failure is visible and auditable instead of being misrepresented as a valid
|
|
89
|
+
decision.
|
|
90
|
+
- More than two agents, voting, hosted rooms, and automatic implementation are
|
|
91
|
+
intentionally out of scope.
|