Skip to content

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: without cli in 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

Fixturefixtures/sandbox-node-ts
IDECursor
Manifest version under testv0.1.x

Pre-conditions

  1. Fixture copied — runner-managed.
  2. No .archon/.

Steps

text
1. Run `archon install --without=cli`.
2. Observe install completes, no `tools/archon-cli/` is materialised.

Expected outcome

CheckExpected
Exit code0
.archon/soul.mdexists
.cursor/commands/archon.mdexists
tools/archon-cli/absent
tools/archon-cli/bin/archon.mjsabsent
.archon/drift.md Modules: linedoes not mention cli

Demo recordings

Will be replaced by docs/public/videos/install-without-cli.mp4 once recorded. See videos/README for upload conventions.
Will be replaced by docs/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)ManifestRunnerResultDurationNotesRecord
2026-06-08 08:17:12 UTCv0.1.0cli✅ passing281 msJSON
2026-06-07 07:10:17 UTCv0.1.0cli✅ passing273 msJSON
2026-06-06 06:34:41 UTCv0.1.0cli✅ passing283 msJSON
2026-06-05 07:14:08 UTCv0.1.0cli✅ passing270 msJSON
2026-06-04 07:56:44 UTCv0.1.0cli✅ passing296 msJSON
2026-06-03 08:24:18 UTCv0.1.0cli✅ passing293 msJSON
2026-06-02 08:00:52 UTCv0.1.0cli✅ passing287 msJSON
2026-06-01 08:40:46 UTCv0.1.0cli✅ passing282 msJSON
2026-05-31 07:02:25 UTCv0.1.0cli✅ passing282 msJSON
2026-05-30 06:27:54 UTCv0.1.0cli✅ passing276 msJSON
2026-05-29 06:59:40 UTCv0.1.0cli✅ passing286 msJSON
2026-05-28 06:59:34 UTCv0.1.0cli✅ passing279 msJSON
2026-05-27 07:09:43 UTCv0.1.0cli✅ passing273 msJSON
2026-05-26 06:52:09 UTCv0.1.0cli✅ passing264 msJSON
2026-05-25 07:20:23 UTCv0.1.0cli✅ passing268 msJSON
2026-05-24 06:41:53 UTCv0.1.0cli✅ passing285 msJSON
2026-05-23 06:16:51 UTCv0.1.0cli✅ passing276 msJSON
2026-05-22 06:54:18 UTCv0.1.0cli✅ passing275 msJSON
2026-05-21 06:58:05 UTCv0.1.0cli✅ passing286 msJSON
2026-05-20 06:53:38 UTCv0.1.0cli✅ passing276 msJSON
2026-05-19 06:53:19 UTCv0.1.0cli✅ passing272 msJSON
2026-05-18 07:01:48 UTCv0.1.0cli✅ passing287 msJSON
2026-05-17 06:27:37 UTCv0.1.0cli✅ passing274 msJSON
2026-05-16 06:04:41 UTCv0.1.0cli✅ passing278 msJSON
2026-05-15 06:38:00 UTCv0.1.0cli✅ passing277 msJSON
2026-05-14 06:28:57 UTCv0.1.0cli✅ passing278 msJSON
2026-05-13 06:30:25 UTCv0.1.0cli✅ passing250 msJSON
2026-05-12 06:19:01 UTCv0.1.0cli✅ passing276 msJSON
2026-05-11 06:45:36 UTCv0.1.0cli✅ passing259 msJSON
2026-05-10 06:16:45 UTCv0.1.0cli✅ passing295 msJSON
2026-05-09 05:52:40 UTCv0.1.0cli✅ passing288 msJSON
2026-05-08 05:33:36 UTCv0.1.0cli✅ passing292 msJSON
2026-05-07 11:01:04 UTCv0.1.0cli✅ passing268 msJSON
2026-05-07 09:54:54 UTCv0.1.0cli✅ passing274 msJSON
2026-05-07 09:45:14 UTCv0.1.0cli✅ passing425 msJSON
2026-05-07 06:15:45 UTCv0.1.0cli✅ passing237 msJSON
2026-05-06 11:45:38 UTCv0.1.0cli✅ passing259 msJSON
2026-05-06 11:44:07 UTCv0.1.0cli✅ passing232 msJSON
2026-05-06 11:19:27 UTCv0.1.0cli✅ passing249 msJSON

Known limitations

  • Only excludes the cli module. 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

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)."
}

Released under the Apache-2.0 License.