18 · install-without-cli
What this scenario proves
archon install --without=cli correctly omits the optional cli module from the install plan. After install:
tools/archon-cli/does not exist.- All required modules (soul, manifest, scripts, contracts, binding, …) are still present.
- The drift row records
Modules:withoutcliin the list.
This is the positive proof that module exclusion at install time works — and it is the static contract that the broken scenario update-cli-without-cli (08) tries to restore later via archon update --with=cli. See KNOWN-004 for why update is currently a no-op there.
Test environment
| Fixture | fixtures/sandbox-node-ts |
| IDE | Cursor |
| Manifest version under test | v0.1.x |
Pre-conditions
- Fixture copied — runner-managed.
- No
.archon/.
Steps
text
1. Run `archon install --without=cli`.
2. Observe install completes, no `tools/archon-cli/` is materialised.Expected outcome
| Check | Expected |
|---|---|
| Exit code | 0 |
.archon/soul.md | exists |
.cursor/commands/archon.md | exists |
tools/archon-cli/ | absent |
tools/archon-cli/bin/archon.mjs | absent |
.archon/drift.md Modules: line | does not mention cli |
Demo recordings
Recording coming soon
install-without-cli.mp4IDE chat-panel walkthroughdocs/public/videos/install-without-cli.mp4 once recorded. See videos/README for upload conventions. $ archon doctor .
[L1 Structural] OK
[L2 Contract] OK
[L3 Hints] OK
✔ Recording coming soon — placeholderdocs/public/asciinema/install-without-cli.cast embedded via the asciinema-player web component. See asciinema/README for the recording command. Run records
bash
node scripts/sandbox-run.mjs --only=install-without-cli| Started (UTC) | Manifest | Runner | Result | Duration | Notes | Record |
|---|---|---|---|---|---|---|
2026-06-08 08:17:12 UTC | v0.1.0 | cli | ✅ passing | 281 ms | — | JSON |
2026-06-07 07:10:17 UTC | v0.1.0 | cli | ✅ passing | 273 ms | — | JSON |
2026-06-06 06:34:41 UTC | v0.1.0 | cli | ✅ passing | 283 ms | — | JSON |
2026-06-05 07:14:08 UTC | v0.1.0 | cli | ✅ passing | 270 ms | — | JSON |
2026-06-04 07:56:44 UTC | v0.1.0 | cli | ✅ passing | 296 ms | — | JSON |
2026-06-03 08:24:18 UTC | v0.1.0 | cli | ✅ passing | 293 ms | — | JSON |
2026-06-02 08:00:52 UTC | v0.1.0 | cli | ✅ passing | 287 ms | — | JSON |
2026-06-01 08:40:46 UTC | v0.1.0 | cli | ✅ passing | 282 ms | — | JSON |
2026-05-31 07:02:25 UTC | v0.1.0 | cli | ✅ passing | 282 ms | — | JSON |
2026-05-30 06:27:54 UTC | v0.1.0 | cli | ✅ passing | 276 ms | — | JSON |
2026-05-29 06:59:40 UTC | v0.1.0 | cli | ✅ passing | 286 ms | — | JSON |
2026-05-28 06:59:34 UTC | v0.1.0 | cli | ✅ passing | 279 ms | — | JSON |
2026-05-27 07:09:43 UTC | v0.1.0 | cli | ✅ passing | 273 ms | — | JSON |
2026-05-26 06:52:09 UTC | v0.1.0 | cli | ✅ passing | 264 ms | — | JSON |
2026-05-25 07:20:23 UTC | v0.1.0 | cli | ✅ passing | 268 ms | — | JSON |
2026-05-24 06:41:53 UTC | v0.1.0 | cli | ✅ passing | 285 ms | — | JSON |
2026-05-23 06:16:51 UTC | v0.1.0 | cli | ✅ passing | 276 ms | — | JSON |
2026-05-22 06:54:18 UTC | v0.1.0 | cli | ✅ passing | 275 ms | — | JSON |
2026-05-21 06:58:05 UTC | v0.1.0 | cli | ✅ passing | 286 ms | — | JSON |
2026-05-20 06:53:38 UTC | v0.1.0 | cli | ✅ passing | 276 ms | — | JSON |
2026-05-19 06:53:19 UTC | v0.1.0 | cli | ✅ passing | 272 ms | — | JSON |
2026-05-18 07:01:48 UTC | v0.1.0 | cli | ✅ passing | 287 ms | — | JSON |
2026-05-17 06:27:37 UTC | v0.1.0 | cli | ✅ passing | 274 ms | — | JSON |
2026-05-16 06:04:41 UTC | v0.1.0 | cli | ✅ passing | 278 ms | — | JSON |
2026-05-15 06:38:00 UTC | v0.1.0 | cli | ✅ passing | 277 ms | — | JSON |
2026-05-14 06:28:57 UTC | v0.1.0 | cli | ✅ passing | 278 ms | — | JSON |
2026-05-13 06:30:25 UTC | v0.1.0 | cli | ✅ passing | 250 ms | — | JSON |
2026-05-12 06:19:01 UTC | v0.1.0 | cli | ✅ passing | 276 ms | — | JSON |
2026-05-11 06:45:36 UTC | v0.1.0 | cli | ✅ passing | 259 ms | — | JSON |
2026-05-10 06:16:45 UTC | v0.1.0 | cli | ✅ passing | 295 ms | — | JSON |
2026-05-09 05:52:40 UTC | v0.1.0 | cli | ✅ passing | 288 ms | — | JSON |
2026-05-08 05:33:36 UTC | v0.1.0 | cli | ✅ passing | 292 ms | — | JSON |
2026-05-07 11:01:04 UTC | v0.1.0 | cli | ✅ passing | 268 ms | — | JSON |
2026-05-07 09:54:54 UTC | v0.1.0 | cli | ✅ passing | 274 ms | — | JSON |
2026-05-07 09:45:14 UTC | v0.1.0 | cli | ✅ passing | 425 ms | — | JSON |
2026-05-07 06:15:45 UTC | v0.1.0 | cli | ✅ passing | 237 ms | — | JSON |
2026-05-06 11:45:38 UTC | v0.1.0 | cli | ✅ passing | 259 ms | — | JSON |
2026-05-06 11:44:07 UTC | v0.1.0 | cli | ✅ passing | 232 ms | — | JSON |
2026-05-06 11:19:27 UTC | v0.1.0 | cli | ✅ passing | 249 ms | — | JSON |
Known limitations
- Only excludes the
climodule. A future scenario should sweep every optional module (extensions-demand-pool,dashboard, …) with--without=<id>to lock the exclusion contract module-by-module. - Does not exercise the inverse combination
archon install --with=cli(covered explicitly by 13, 14).
Cross-references
- Protocol page:
/setup/install - Source:
docs/source-files/tools/archon-cli/lib/install.mjspickModules()(lines 115–156). - Related broken scenario: 08 · update-cli-without-cli (KNOWN-004).
- Install matrix: Install Matrix
json
{
"runnable": "cli",
"fixture": "fixtures/sandbox-node-ts",
"ide_platform": "cursor",
"prerequisites": [
{
"name": "drop sandbox check helper",
"write_file": {
"path": "__sb-check.cjs",
"content": "const fs=require('fs');const op=process.argv[2];const args=process.argv.slice(3);if(op==='drift-install-count'){const want=Number(args[0]);const c=fs.readFileSync('.archon/drift.md','utf8');const m=c.match(/^## install /gm);const n=m?m.length:0;if(n!==want){console.error('drift install rows: want',want,'got',n);process.exit(1)}process.exit(0)}if(op==='no-backup-dir'){const found=fs.readdirSync('.').some(function(x){return x.indexOf('.archon-backup-')===0});if(found){console.error('unexpected .archon-backup-*');process.exit(1)}process.exit(0)}if(op==='has-backup-dir'){const found=fs.readdirSync('.').some(function(x){return x.indexOf('.archon-backup-')===0});if(!found){console.error('expected .archon-backup-* missing');process.exit(1)}process.exit(0)}if(op==='pkg-name-equals'){const p=require('./package.json');if(p.name!==args[0]){console.error('package.json name mutated:',p.name);process.exit(1)}process.exit(0)}if(op==='file-includes'){const text=fs.readFileSync(args[0],'utf8');if(text.indexOf(args[1])===-1){console.error(args[0],'missing',args[1]);process.exit(1)}process.exit(0)}if(op==='drift-modules-excludes'){const c=fs.readFileSync('.archon/drift.md','utf8');const re=new RegExp('^- Modules:.*\\\\b'+args[0]+'\\\\b','m');if(re.test(c)){console.error(args[0],'unexpectedly listed');process.exit(1)}process.exit(0)}console.error('unknown op:',op);process.exit(2);\n"
}
}
],
"steps": [
{
"name": "archon install --without=cli",
"cli": "install",
"flags": ["--without=cli"]
}
],
"assertions": [
{ "file_exists": ".archon/soul.md" },
{ "file_exists": ".cursor/commands/archon.md" },
{ "dir_absent": "tools/archon-cli" },
{ "file_absent": "tools/archon-cli/bin/archon.mjs" },
{ "cmd_zero": ["node", "__sb-check.cjs", "drift-modules-excludes", "cli"] },
{ "cmd_zero": ["python3", "scripts/archon-check.py", "--root", "."] }
],
"notes": "Asserts module exclusion at install time. Sister-test of 08 (which exposes a known update bug)."
}