cohorte 2.10.0 → 3.0.0-dev.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 (211) hide show
  1. package/README.md +7 -0
  2. package/assets/manifest.json +193 -0
  3. package/assets/migrations/config/README.md +12 -0
  4. package/assets/migrations/state/0001_init.sql +154 -0
  5. package/assets/prompts/README.md +11 -0
  6. package/assets/prompts/agents/fixer.md +7 -0
  7. package/assets/prompts/agents/implementer.md +12 -0
  8. package/assets/prompts/agents/reviewer.md +8 -0
  9. package/assets/prompts/agents/security-reviewer.md +7 -0
  10. package/assets/prompts/phases/build.md +5 -0
  11. package/assets/prompts/phases/review.md +5 -0
  12. package/assets/prompts/phases/test.md +5 -0
  13. package/assets/prompts/system.md +11 -0
  14. package/assets/schemas/agent-output.schema.json +225 -0
  15. package/assets/schemas/auth-status.schema.json +87 -0
  16. package/assets/schemas/command-result.schema.json +192 -0
  17. package/assets/schemas/commands.schema.json +952 -0
  18. package/assets/schemas/config.schema.json +2259 -0
  19. package/assets/schemas/doctor-report.schema.json +104 -0
  20. package/assets/schemas/events.schema.json +8514 -0
  21. package/assets/schemas/fake-script.schema.json +549 -0
  22. package/assets/schemas/inspect.schema.json +3133 -0
  23. package/assets/schemas/manifest.schema.json +79 -0
  24. package/assets/schemas/ownership.schema.json +52 -0
  25. package/assets/schemas/policy-verdict.schema.json +282 -0
  26. package/assets/schemas/project-model.schema.json +783 -0
  27. package/assets/schemas/project-status.schema.json +217 -0
  28. package/assets/schemas/reconcile-plan.schema.json +155 -0
  29. package/assets/schemas/run-diff.schema.json +177 -0
  30. package/assets/schemas/run-snapshot-manifest.schema.json +2104 -0
  31. package/assets/schemas/run-state.schema.json +1755 -0
  32. package/assets/schemas/runtime-capabilities.schema.json +1545 -0
  33. package/assets/schemas/sandbox-capabilities.schema.json +116 -0
  34. package/assets/schemas/skill.schema.json +87 -0
  35. package/assets/schemas/spec.schema.json +202 -0
  36. package/assets/schemas/tool-catalogue.schema.json +655 -0
  37. package/assets/schemas/trust-record.schema.json +38 -0
  38. package/assets/skills/README.md +9 -0
  39. package/assets/skills/inspect-surface.md +4 -0
  40. package/dist/agent-host.mjs +50 -0
  41. package/dist/agent-host.mjs.map +1 -0
  42. package/dist/bundle-manifest.json +102 -0
  43. package/dist/chunks/__host-DgGPyco9.mjs +18 -0
  44. package/dist/chunks/__host-DgGPyco9.mjs.map +1 -0
  45. package/dist/chunks/approve-Cv135UqI.mjs +19 -0
  46. package/dist/chunks/approve-Cv135UqI.mjs.map +1 -0
  47. package/dist/chunks/auth-BT5oVp76.mjs +132 -0
  48. package/dist/chunks/auth-BT5oVp76.mjs.map +1 -0
  49. package/dist/chunks/auth-D8rCVY33.mjs +84 -0
  50. package/dist/chunks/auth-D8rCVY33.mjs.map +1 -0
  51. package/dist/chunks/brainstorm-CU10T1tm.mjs +7 -0
  52. package/dist/chunks/brainstorm-CU10T1tm.mjs.map +1 -0
  53. package/dist/chunks/cancel-KV_cpsqS.mjs +15 -0
  54. package/dist/chunks/cancel-KV_cpsqS.mjs.map +1 -0
  55. package/dist/chunks/canonical-C8UxeEmB.mjs +57 -0
  56. package/dist/chunks/canonical-C8UxeEmB.mjs.map +1 -0
  57. package/dist/chunks/catalogue-BvwSrM_j.mjs +1549 -0
  58. package/dist/chunks/catalogue-BvwSrM_j.mjs.map +1 -0
  59. package/dist/chunks/compose-Cr0hP0qm.mjs +7303 -0
  60. package/dist/chunks/compose-Cr0hP0qm.mjs.map +1 -0
  61. package/dist/chunks/config-DefHA2Lw.mjs +96 -0
  62. package/dist/chunks/config-DefHA2Lw.mjs.map +1 -0
  63. package/dist/chunks/contract-B0ra2-bm.mjs +295 -0
  64. package/dist/chunks/contract-B0ra2-bm.mjs.map +1 -0
  65. package/dist/chunks/contract-vYbwYr0Y.mjs +123 -0
  66. package/dist/chunks/contract-vYbwYr0Y.mjs.map +1 -0
  67. package/dist/chunks/deny-ClTxSvHJ.mjs +15 -0
  68. package/dist/chunks/deny-ClTxSvHJ.mjs.map +1 -0
  69. package/dist/chunks/diff-Qw0II0sj.mjs +101 -0
  70. package/dist/chunks/diff-Qw0II0sj.mjs.map +1 -0
  71. package/dist/chunks/discover-30Ciya_0.mjs +20 -0
  72. package/dist/chunks/discover-30Ciya_0.mjs.map +1 -0
  73. package/dist/chunks/doctor-DfCrKpfT.mjs +222 -0
  74. package/dist/chunks/doctor-DfCrKpfT.mjs.map +1 -0
  75. package/dist/chunks/fix-D4Tj8RVA.mjs +18 -0
  76. package/dist/chunks/fix-D4Tj8RVA.mjs.map +1 -0
  77. package/dist/chunks/gc-BBXlBF5w.mjs +161 -0
  78. package/dist/chunks/gc-BBXlBF5w.mjs.map +1 -0
  79. package/dist/chunks/init-Okz4mlhW.mjs +30 -0
  80. package/dist/chunks/init-Okz4mlhW.mjs.map +1 -0
  81. package/dist/chunks/inspect-Buby4cQD.mjs +22 -0
  82. package/dist/chunks/inspect-Buby4cQD.mjs.map +1 -0
  83. package/dist/chunks/logs-Giq5sUau.mjs +25 -0
  84. package/dist/chunks/logs-Giq5sUau.mjs.map +1 -0
  85. package/dist/chunks/migrate-DRoFUg53.mjs +19 -0
  86. package/dist/chunks/migrate-DRoFUg53.mjs.map +1 -0
  87. package/dist/chunks/models-Btp6X2YZ.mjs +24 -0
  88. package/dist/chunks/models-Btp6X2YZ.mjs.map +1 -0
  89. package/dist/chunks/pause-BASBfKLO.mjs +16 -0
  90. package/dist/chunks/pause-BASBfKLO.mjs.map +1 -0
  91. package/dist/chunks/policy-DUIgzF3W.mjs +139 -0
  92. package/dist/chunks/policy-DUIgzF3W.mjs.map +1 -0
  93. package/dist/chunks/providers-Dx78imKj.mjs +19 -0
  94. package/dist/chunks/providers-Dx78imKj.mjs.map +1 -0
  95. package/dist/chunks/reconcile-BfD785gd.mjs +26 -0
  96. package/dist/chunks/reconcile-BfD785gd.mjs.map +1 -0
  97. package/dist/chunks/render-DyZr5Lgi.mjs +53 -0
  98. package/dist/chunks/render-DyZr5Lgi.mjs.map +1 -0
  99. package/dist/chunks/resume-GJQRb2Eb.mjs +15 -0
  100. package/dist/chunks/resume-GJQRb2Eb.mjs.map +1 -0
  101. package/dist/chunks/retry-CLrUem1H.mjs +15 -0
  102. package/dist/chunks/retry-CLrUem1H.mjs.map +1 -0
  103. package/dist/chunks/review-BDdjb6kB.mjs +17 -0
  104. package/dist/chunks/review-BDdjb6kB.mjs.map +1 -0
  105. package/dist/chunks/run-CgTWYlcd.mjs +82 -0
  106. package/dist/chunks/run-CgTWYlcd.mjs.map +1 -0
  107. package/dist/chunks/run-tool-C3rAv4XF.mjs +26 -0
  108. package/dist/chunks/run-tool-C3rAv4XF.mjs.map +1 -0
  109. package/dist/chunks/schema-C9QbUW4H.mjs +578 -0
  110. package/dist/chunks/schema-C9QbUW4H.mjs.map +1 -0
  111. package/dist/chunks/send-BdnJ85Nz.mjs +19 -0
  112. package/dist/chunks/send-BdnJ85Nz.mjs.map +1 -0
  113. package/dist/chunks/ship-DTuLGoaJ.mjs +19 -0
  114. package/dist/chunks/ship-DTuLGoaJ.mjs.map +1 -0
  115. package/dist/chunks/shutdown-BM92Iyv2.mjs +15 -0
  116. package/dist/chunks/shutdown-BM92Iyv2.mjs.map +1 -0
  117. package/dist/chunks/skip-DZG5kpcH.mjs +18 -0
  118. package/dist/chunks/skip-DZG5kpcH.mjs.map +1 -0
  119. package/dist/chunks/spec-Bq0P3jVh.mjs +20 -0
  120. package/dist/chunks/spec-Bq0P3jVh.mjs.map +1 -0
  121. package/dist/chunks/src-CId6kMsY.mjs +1689 -0
  122. package/dist/chunks/src-CId6kMsY.mjs.map +1 -0
  123. package/dist/chunks/src-CfAOde7C.mjs +5403 -0
  124. package/dist/chunks/src-CfAOde7C.mjs.map +1 -0
  125. package/dist/chunks/src-Cu3TxNob.mjs +783 -0
  126. package/dist/chunks/src-Cu3TxNob.mjs.map +1 -0
  127. package/dist/chunks/src-DcU4IXMe.mjs +117 -0
  128. package/dist/chunks/src-DcU4IXMe.mjs.map +1 -0
  129. package/dist/chunks/src-JxawBQBn.mjs +446 -0
  130. package/dist/chunks/src-JxawBQBn.mjs.map +1 -0
  131. package/dist/chunks/src-s7YRvk0t.mjs +2116 -0
  132. package/dist/chunks/src-s7YRvk0t.mjs.map +1 -0
  133. package/dist/chunks/status-SMjiOMYy.mjs +29 -0
  134. package/dist/chunks/status-SMjiOMYy.mjs.map +1 -0
  135. package/dist/chunks/tail-BuhT-2PH.mjs +25 -0
  136. package/dist/chunks/tail-BuhT-2PH.mjs.map +1 -0
  137. package/dist/chunks/update-BXIppsbi.mjs +16 -0
  138. package/dist/chunks/update-BXIppsbi.mjs.map +1 -0
  139. package/dist/cli.mjs +175 -0
  140. package/dist/cli.mjs.map +1 -0
  141. package/package.json +17 -32
  142. package/CHANGELOG.md +0 -1453
  143. package/bin/cli.js +0 -812
  144. package/bin/report.js +0 -141
  145. package/core/adapter/render.js +0 -389
  146. package/core/agents/implementer.template.md +0 -142
  147. package/core/agents/profile-reader.md +0 -50
  148. package/core/agents/release.md +0 -58
  149. package/core/agents/review.md +0 -179
  150. package/core/commands/cohorte-align-ds.md +0 -33
  151. package/core/commands/cohorte-audit.md +0 -58
  152. package/core/commands/cohorte-brainstorm.md +0 -70
  153. package/core/commands/cohorte-build.md +0 -219
  154. package/core/commands/cohorte-doctor.md +0 -170
  155. package/core/commands/cohorte-fix.md +0 -80
  156. package/core/commands/cohorte-fleet.md +0 -103
  157. package/core/commands/cohorte-init-pipeline.md +0 -31
  158. package/core/commands/cohorte-intake.md +0 -92
  159. package/core/commands/cohorte-patch.md +0 -118
  160. package/core/commands/cohorte-refactor.md +0 -59
  161. package/core/commands/cohorte-retro.md +0 -85
  162. package/core/commands/cohorte-review.md +0 -270
  163. package/core/commands/cohorte-ship.md +0 -122
  164. package/core/commands/cohorte-spec.md +0 -101
  165. package/core/commands/cohorte-update-pipeline.md +0 -134
  166. package/core/hooks/gate.py +0 -580
  167. package/core/runtimes/claude.json +0 -74
  168. package/core/runtimes/codex.json +0 -83
  169. package/core/runtimes/cursor.json +0 -76
  170. package/core/runtimes/gemini.json +0 -76
  171. package/core/runtimes/opencode.json +0 -73
  172. package/core/templates/agent-handoff.md +0 -34
  173. package/core/templates/brainstorm-return.md +0 -36
  174. package/core/templates/decisions.template.md +0 -42
  175. package/core/templates/design-brief.md +0 -44
  176. package/core/templates/patch.template.md +0 -86
  177. package/core/templates/pr-body.md +0 -25
  178. package/core/templates/review-feedback.md +0 -38
  179. package/core/templates/spec.template.md +0 -87
  180. package/core/templates/steps/init-pipeline/01-detect-stack.md +0 -44
  181. package/core/templates/steps/init-pipeline/02-interview-gaps.md +0 -55
  182. package/core/templates/steps/init-pipeline/03-draft-profile.md +0 -10
  183. package/core/templates/steps/init-pipeline/04-write-render.md +0 -115
  184. package/core/templates/steps/init-pipeline/05-report.md +0 -12
  185. package/core/workflows/audit.js +0 -240
  186. package/core/workflows/loop.js +0 -641
  187. package/core/workflows/refactor.js +0 -276
  188. package/core/workflows/review.js +0 -456
  189. package/install.ps1 +0 -103
  190. package/install.sh +0 -114
  191. package/lib/doctor.js +0 -504
  192. package/lib/runtime.js +0 -134
  193. package/lib/versions.js +0 -149
  194. package/lib/yaml.js +0 -129
  195. package/profile/PIPELINE.template.md +0 -251
  196. package/profile/SCHEMA.md +0 -698
  197. package/profile/cohorte.config.template.yaml +0 -43
  198. package/scripts/assert-gate-hook.mjs +0 -75
  199. package/scripts/kanban-move.sh +0 -313
  200. package/scripts/metrics/collect.mjs +0 -531
  201. package/scripts/metrics/prices.json +0 -42
  202. package/scripts/new-feature.sh.template +0 -98
  203. package/scripts/preflight.sh +0 -124
  204. package/scripts/remove-feature.sh.template +0 -56
  205. package/scripts/test-adapter.mjs +0 -368
  206. package/scripts/test-gate.mjs +0 -428
  207. package/scripts/test-kanban.mjs +0 -304
  208. package/scripts/test-lib.mjs +0 -310
  209. package/scripts/test-metrics.mjs +0 -156
  210. package/scripts/test-workflows.mjs +0 -758
  211. package/scripts/validate-core.mjs +0 -320
@@ -0,0 +1,96 @@
1
+ import { n as sha256Hex } from "./canonical-C8UxeEmB.mjs";
2
+ import "./src-Cu3TxNob.mjs";
3
+ import { n as createKeyStore, r as createTrustStore } from "./auth-BT5oVp76.mjs";
4
+ import { i as resolveConfig, n as loadConfig } from "./src-DcU4IXMe.mjs";
5
+ import { readFile, writeFile } from "node:fs/promises";
6
+ import { join } from "node:path";
7
+ import { parse, stringify } from "yaml";
8
+ //#region src/commands/config/index.ts
9
+ const config = {
10
+ verb: "config",
11
+ async run(ctx, args) {
12
+ const path = join(ctx.cwd, ".cohorte", "config.yaml");
13
+ let value;
14
+ try {
15
+ value = parse(await readFile(path, "utf8"));
16
+ } catch (error) {
17
+ ctx.stdio.stderr.write(`cannot read ${path}: ${String(error)}\n`);
18
+ return 1;
19
+ }
20
+ if (args.subVerb === "validate") {
21
+ const valid = typeof value === "object" && value !== null && !Array.isArray(value) && value.schemaVersion === 1;
22
+ ctx.stdio.stdout.write(`${valid ? "valid" : "invalid"}\n`);
23
+ return valid ? 0 : 1;
24
+ }
25
+ if (args.subVerb === "set") {
26
+ const [key, rawValue] = args.positionals;
27
+ if (!key || rawValue === void 0 || !value || typeof value !== "object" || Array.isArray(value)) return 2;
28
+ const next = { ...value };
29
+ const parts = key.split(".").filter(Boolean);
30
+ if (parts.length === 0) return 2;
31
+ let cursor = next;
32
+ for (const part of parts.slice(0, -1)) {
33
+ const child = cursor[part];
34
+ cursor[part] = child && typeof child === "object" && !Array.isArray(child) ? { ...child } : {};
35
+ cursor = cursor[part];
36
+ }
37
+ cursor[parts.at(-1)] = parse(rawValue);
38
+ await writeFile(path, stringify(next), "utf8");
39
+ if (args.json) ctx.stdio.stdout.write(`${JSON.stringify(next)}\n`);
40
+ else ctx.stdio.stdout.write(`updated ${key}\n`);
41
+ return 0;
42
+ }
43
+ if (args.subVerb === "trust") {
44
+ const home = ctx.env.HOME ?? ctx.cwd;
45
+ const projectKeyId = sha256Hex(ctx.cwd).slice(0, 24);
46
+ const keys = createKeyStore({ directory: join(home, ".cohorte", "keys") });
47
+ const trustStore = createTrustStore({
48
+ directory: join(home, ".cohorte", "trust"),
49
+ keys
50
+ });
51
+ const loaded = await loadConfig({
52
+ cwd: ctx.cwd,
53
+ home
54
+ });
55
+ const resolved = await resolveConfig(loaded, {
56
+ trustStore,
57
+ projectKeyId
58
+ });
59
+ const policySha256 = resolved.status === "untrusted" ? resolved.policySha256 : resolved.trust.policySha256;
60
+ const loosenedKeys = resolved.status === "untrusted" ? resolved.loosenedKeys : resolved.trust.loosenedKeys;
61
+ if (policySha256 === void 0) return 1;
62
+ const flag = args.positionals.find((value) => value.startsWith("--"));
63
+ if (flag === "--revoke") {
64
+ const revoked = await trustStore.revoke(projectKeyId);
65
+ ctx.stdio.stdout.write(`${JSON.stringify({ revoked })}\n`);
66
+ return 0;
67
+ }
68
+ if (flag === "--grant") {
69
+ const record = await trustStore.grant(projectKeyId, {
70
+ policySha256,
71
+ loosenedKeys,
72
+ grantedBy: ctx.env.USER ?? "cli"
73
+ });
74
+ ctx.stdio.stdout.write(`${JSON.stringify(record)}\n`);
75
+ return 0;
76
+ }
77
+ const record = await trustStore.lookup(projectKeyId, policySha256);
78
+ ctx.stdio.stdout.write(`${JSON.stringify({
79
+ policySha256,
80
+ loosenedKeys,
81
+ trusted: record !== void 0,
82
+ record: record ?? null
83
+ })}\n`);
84
+ return 0;
85
+ }
86
+ if (args.subVerb === "get" || args.subVerb === void 0) {
87
+ ctx.stdio.stdout.write(`${JSON.stringify(value, null, 2)}\n`);
88
+ return 0;
89
+ }
90
+ return 10;
91
+ }
92
+ };
93
+ //#endregion
94
+ export { config as default };
95
+
96
+ //# sourceMappingURL=config-DefHA2Lw.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-DefHA2Lw.mjs","names":[],"sources":["../../../../apps/cli/src/commands/config/index.ts"],"sourcesContent":["// apps/cli/src/commands/config/index.ts — DESIGN §9 verb `config` (PLAN §3 rule 3 \"later units fill\n// stub files that lie inside their owned paths; they never edit ... the registry\"). Wave-0 stub: exits with the\n// documented not-available error (spec 24 `configuration/phase-not-available`); filled by the Wave-4/5\n// unit that owns `apps/cli/src/commands/config/**`.\nimport { readFile, writeFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { sha256Hex } from '@cohorte/base';\nimport { loadConfig, resolveConfig } from '@cohorte/config';\nimport { createKeyStore, createTrustStore } from '@cohorte/security/auth';\nimport { parse, stringify } from 'yaml';\nimport type { CommandModule } from '../../contract/index.ts';\n\nconst config: CommandModule = {\n verb: 'config',\n async run(ctx, args) {\n const path = join(ctx.cwd, '.cohorte', 'config.yaml');\n let value: unknown;\n try {\n value = parse(await readFile(path, 'utf8'));\n } catch (error) {\n ctx.stdio.stderr.write(`cannot read ${path}: ${String(error)}\\n`);\n return 1;\n }\n if (args.subVerb === 'validate') {\n const valid =\n typeof value === 'object' &&\n value !== null &&\n !Array.isArray(value) &&\n (value as { schemaVersion?: unknown }).schemaVersion === 1;\n ctx.stdio.stdout.write(`${valid ? 'valid' : 'invalid'}\\n`);\n return valid ? 0 : 1;\n }\n if (args.subVerb === 'set') {\n const [key, rawValue] = args.positionals;\n if (!key || rawValue === undefined || !value || typeof value !== 'object' || Array.isArray(value)) return 2;\n const next: Record<string, unknown> = { ...(value as Record<string, unknown>) };\n const parts = key.split('.').filter(Boolean);\n if (parts.length === 0) return 2;\n let cursor = next;\n for (const part of parts.slice(0, -1)) {\n const child = cursor[part];\n cursor[part] = child && typeof child === 'object' && !Array.isArray(child) ? { ...child } : {};\n cursor = cursor[part] as Record<string, unknown>;\n }\n cursor[parts.at(-1) as string] = parse(rawValue);\n await writeFile(path, stringify(next), 'utf8');\n if (args.json) ctx.stdio.stdout.write(`${JSON.stringify(next)}\\n`);\n else ctx.stdio.stdout.write(`updated ${key}\\n`);\n return 0;\n }\n if (args.subVerb === 'trust') {\n const home = ctx.env.HOME ?? ctx.cwd;\n const projectKeyId = sha256Hex(ctx.cwd).slice(0, 24);\n const keys = createKeyStore({ directory: join(home, '.cohorte', 'keys') });\n const trustStore = createTrustStore({ directory: join(home, '.cohorte', 'trust'), keys });\n const loaded = await loadConfig({ cwd: ctx.cwd, home });\n const resolved = await resolveConfig(loaded, {\n trustStore,\n projectKeyId,\n });\n const policySha256 = resolved.status === 'untrusted' ? resolved.policySha256 : resolved.trust.policySha256;\n const loosenedKeys = resolved.status === 'untrusted' ? resolved.loosenedKeys : resolved.trust.loosenedKeys;\n if (policySha256 === undefined) return 1;\n const flag = args.positionals.find((value) => value.startsWith('--'));\n if (flag === '--revoke') {\n const revoked = await trustStore.revoke(projectKeyId);\n ctx.stdio.stdout.write(`${JSON.stringify({ revoked })}\\n`);\n return 0;\n }\n if (flag === '--grant') {\n const record = await trustStore.grant(projectKeyId, {\n policySha256,\n loosenedKeys,\n grantedBy: ctx.env.USER ?? 'cli',\n });\n ctx.stdio.stdout.write(`${JSON.stringify(record)}\\n`);\n return 0;\n }\n const record = await trustStore.lookup(projectKeyId, policySha256);\n ctx.stdio.stdout.write(\n `${JSON.stringify({ policySha256, loosenedKeys, trusted: record !== undefined, record: record ?? null })}\\n`,\n );\n return 0;\n }\n if (args.subVerb === 'get' || args.subVerb === undefined) {\n ctx.stdio.stdout.write(`${JSON.stringify(value, null, 2)}\\n`);\n return 0;\n }\n return 10;\n },\n};\n\nexport default config;\n"],"mappings":"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"}
@@ -0,0 +1,295 @@
1
+ import { F as EXIT_CODE_BY_CLASS, L as ERROR_CLASSES, N as errorOf, j as CohorteError } from "./src-Cu3TxNob.mjs";
2
+ import "./contract-vYbwYr0Y.mjs";
3
+ import { f as HALTED_STATES, m as SUSPENDED_STATES, r as CONTROLLER_EXIT_CODES } from "./src-s7YRvk0t.mjs";
4
+ //#region src/contract/command-module.ts
5
+ /**
6
+ * The Wave-0 body of every verb (DESIGN §9 "stubbed with a seam" and the plain "not yet built" ones alike): a verb
7
+ * a later wave fills replaces this factory call with a real implementation, never the module's shape.
8
+ *
9
+ * It throws a CLASSIFIED `CohorteError`, not a bare `NotImplemented`: `toErrorInfo` keeps a `CohorteError`'s own
10
+ * code, so the documented `configuration/phase-not-available` (DESIGN §9, exit 10) is what the stub MEANS rather
11
+ * than what `cli.ts`'s unknown-throwable fallback happens to be. `cli.ts`'s fallback is `configuration/unexpected`
12
+ * (DESIGN 2.8 "Unknown throwables -> `<nearest class>/unexpected`"), so a real defect in a filled-in verb can never
13
+ * masquerade as "this phase is not available in this build".
14
+ */
15
+ function notImplementedCommand(verb) {
16
+ return {
17
+ verb,
18
+ async run(_ctx, _args) {
19
+ throw new CohorteError(errorOf("configuration/phase-not-available", `the verb \`${verb}\` is not available in this build`));
20
+ }
21
+ };
22
+ }
23
+ //#endregion
24
+ //#region src/contract/documents.ts
25
+ const protocolDoc = (name) => ({
26
+ source: "protocol",
27
+ name
28
+ });
29
+ const reconcilePlanDoc = {
30
+ source: "project-model",
31
+ name: "reconcile-plan"
32
+ };
33
+ /** DESIGN §9 verb semantics: "`cohorte discover` prints the deterministic scan as a Project Model document". */
34
+ const projectModelDoc = {
35
+ source: "project-model",
36
+ name: "project-model"
37
+ };
38
+ /** DESIGN 2.3.4's inbox route: every mutating command answers with a `CommandResultDocument`. */
39
+ const commandResult = [protocolDoc("command-result")];
40
+ Object.freeze({
41
+ status: [protocolDoc("project-status"), protocolDoc("run-state")],
42
+ inspect: [protocolDoc("inspect")],
43
+ diff: [protocolDoc("run-diff")],
44
+ doctor: [protocolDoc("doctor-report")],
45
+ auth: [protocolDoc("auth-status")],
46
+ reconcile: [reconcilePlanDoc],
47
+ discover: [projectModelDoc],
48
+ run: [protocolDoc("command-result"), protocolDoc("run-state")],
49
+ resume: commandResult,
50
+ pause: commandResult,
51
+ cancel: commandResult,
52
+ approve: commandResult,
53
+ deny: commandResult,
54
+ retry: commandResult,
55
+ skip: commandResult,
56
+ shutdown: commandResult,
57
+ send: commandResult,
58
+ "run-tool": commandResult
59
+ });
60
+ new Set(SUSPENDED_STATES);
61
+ new Set(HALTED_STATES);
62
+ /** DESIGN 2.3.4 "Controller exit codes: 0 completed · 3 rejected · 4 accepted-but-pending · 2 usage." */
63
+ const CONTROLLER_EXIT_HELP = [
64
+ {
65
+ code: CONTROLLER_EXIT_CODES.completed,
66
+ meaning: "completed"
67
+ },
68
+ {
69
+ code: CONTROLLER_EXIT_CODES.usage,
70
+ meaning: "usage error"
71
+ },
72
+ {
73
+ code: CONTROLLER_EXIT_CODES.rejected,
74
+ meaning: "rejected"
75
+ },
76
+ {
77
+ code: CONTROLLER_EXIT_CODES.pending,
78
+ meaning: "accepted, pending at --wait expiry (not an error: durable inbox)"
79
+ }
80
+ ];
81
+ /** DESIGN 2.8's table, class by class, in spec order. */
82
+ const ERROR_CLASS_EXIT_HELP = ERROR_CLASSES.map((errorClass) => ({
83
+ code: EXIT_CODE_BY_CLASS[errorClass],
84
+ meaning: `${errorClass} error`
85
+ }));
86
+ const CANCELLED_EXIT_HELP = {
87
+ code: 16,
88
+ meaning: "cancelled"
89
+ };
90
+ /** Rendered into `--help` (PLAN U0.10 test: "controller codes 0/2/3/4 documented in --help"). */
91
+ function formatExitCodesHelp() {
92
+ const rows = [
93
+ ...CONTROLLER_EXIT_HELP,
94
+ ...ERROR_CLASS_EXIT_HELP,
95
+ CANCELLED_EXIT_HELP
96
+ ];
97
+ const width = Math.max(...rows.map((row) => String(row.code).length));
98
+ return ["Exit codes:", ...rows.map((row) => ` ${String(row.code).padStart(width)} ${row.meaning}`)].join("\n");
99
+ }
100
+ //#endregion
101
+ //#region src/contract/verbs.ts
102
+ const VERBS = [
103
+ {
104
+ name: "init",
105
+ summary: "Scaffold .cohorte/ for this repository"
106
+ },
107
+ {
108
+ name: "doctor",
109
+ summary: "Diagnose the installation, configuration and toolchain",
110
+ json: true
111
+ },
112
+ {
113
+ name: "discover",
114
+ summary: "Print the deterministic project scan (no write)",
115
+ json: true
116
+ },
117
+ {
118
+ name: "run",
119
+ summary: "Start a pipeline run",
120
+ commandType: "start",
121
+ json: true
122
+ },
123
+ {
124
+ name: "status",
125
+ summary: "Show a run, or the project, status",
126
+ commandType: "status",
127
+ json: true
128
+ },
129
+ {
130
+ name: "inspect",
131
+ summary: "Inspect one agent, context, approval, effect, snapshot, lock, diff or artifact",
132
+ commandType: "inspect",
133
+ json: true
134
+ },
135
+ {
136
+ name: "resume",
137
+ summary: "Resume a suspended run",
138
+ commandType: "resume",
139
+ json: true
140
+ },
141
+ {
142
+ name: "pause",
143
+ summary: "Pause an active run",
144
+ commandType: "pause",
145
+ json: true
146
+ },
147
+ {
148
+ name: "cancel",
149
+ summary: "Cancel a run",
150
+ commandType: "cancel",
151
+ json: true
152
+ },
153
+ {
154
+ name: "shutdown",
155
+ summary: "Ask the detached host to shut down gracefully",
156
+ commandType: "shutdown",
157
+ json: true
158
+ },
159
+ {
160
+ name: "approve",
161
+ summary: "Approve a pending approval request",
162
+ commandType: "approve",
163
+ json: true
164
+ },
165
+ {
166
+ name: "deny",
167
+ summary: "Deny a pending approval request",
168
+ commandType: "deny",
169
+ json: true
170
+ },
171
+ {
172
+ name: "retry",
173
+ summary: "Retry a phase or an agent",
174
+ commandType: "retry",
175
+ json: true
176
+ },
177
+ {
178
+ name: "skip",
179
+ summary: "Skip a phase (only if policy.skip lists it)",
180
+ commandType: "skip",
181
+ json: true
182
+ },
183
+ {
184
+ name: "logs",
185
+ summary: "Print durable run events"
186
+ },
187
+ {
188
+ name: "tail",
189
+ summary: "Follow a run (durable + ephemeral events)",
190
+ commandType: "tail"
191
+ },
192
+ {
193
+ name: "diff",
194
+ summary: "Show the run diff for a surface",
195
+ json: true
196
+ },
197
+ {
198
+ name: "review",
199
+ summary: "Start a review-profile run over a ref range or a prior run"
200
+ },
201
+ {
202
+ name: "fix",
203
+ summary: "Retry a run's FIX phase"
204
+ },
205
+ {
206
+ name: "ship",
207
+ summary: "Show and resolve the pending ship approval"
208
+ },
209
+ {
210
+ name: "auth",
211
+ summary: "Manage provider authentication",
212
+ subVerbs: [
213
+ "login",
214
+ "status",
215
+ "logout"
216
+ ],
217
+ json: true
218
+ },
219
+ {
220
+ name: "providers",
221
+ summary: "List or test configured providers",
222
+ subVerbs: ["list", "test"]
223
+ },
224
+ {
225
+ name: "models",
226
+ summary: "List available models",
227
+ subVerbs: ["list"]
228
+ },
229
+ {
230
+ name: "config",
231
+ summary: "Read, write, validate or trust the project configuration",
232
+ subVerbs: [
233
+ "get",
234
+ "set",
235
+ "validate",
236
+ "trust"
237
+ ]
238
+ },
239
+ {
240
+ name: "migrate",
241
+ summary: "Check or apply state-store migrations"
242
+ },
243
+ {
244
+ name: "reconcile",
245
+ summary: "Plan the project configuration against the discovered state",
246
+ commandType: "reconcile",
247
+ json: true
248
+ },
249
+ {
250
+ name: "spec",
251
+ summary: "Validate or freeze a human-written spec",
252
+ subVerbs: ["validate", "freeze"]
253
+ },
254
+ {
255
+ name: "policy",
256
+ summary: "Explain the effective security policy",
257
+ subVerbs: ["explain"]
258
+ },
259
+ {
260
+ name: "gc",
261
+ summary: "Garbage-collect worktrees, spools and old runs"
262
+ },
263
+ {
264
+ name: "update",
265
+ summary: "Check for a newer pinned install (offline, --check only in V3.0)"
266
+ },
267
+ {
268
+ name: "brainstorm",
269
+ summary: "Not available in V3.0 (reserved verb id, DESIGN §9)"
270
+ },
271
+ {
272
+ name: "run-tool",
273
+ summary: "Run one tool directly (admin; policy.admin.runTool)",
274
+ commandType: "run-tool",
275
+ json: true
276
+ },
277
+ {
278
+ name: "send",
279
+ summary: "Send text to a running agent (policy.steer.enabled)",
280
+ commandType: "agent.send",
281
+ json: true
282
+ },
283
+ {
284
+ name: "__host",
285
+ summary: "Internal: run the detached host in-process",
286
+ hidden: true
287
+ }
288
+ ];
289
+ new Map(VERBS.map((verb) => [verb.name, verb]));
290
+ VERBS.map((verb) => verb.name);
291
+ Object.freeze(Object.fromEntries(VERBS.filter((verb) => verb.commandType !== void 0).map((verb) => [verb.commandType, verb.name])));
292
+ //#endregion
293
+ export { formatExitCodesHelp as n, notImplementedCommand as r, VERBS as t };
294
+
295
+ //# sourceMappingURL=contract-B0ra2-bm.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contract-B0ra2-bm.mjs","names":[],"sources":["../../../../apps/cli/src/contract/command-module.ts","../../../../apps/cli/src/contract/documents.ts","../../../../apps/cli/src/contract/exit-codes.ts","../../../../apps/cli/src/contract/verbs.ts"],"sourcesContent":["// apps/cli/src/contract/command-module.ts — DESIGN 10.1 rule 3 \"every barrel entry is a live export\": each verb's\n// `commands/<verb>/index.ts` implements `CommandModule`. Wave 0 fills every one with `notImplementedCommand` (the\n// documented not-available error, spec 24 `configuration/phase-not-available`); later waves replace the body,\n// never the shape — `cli.ts` and `lazy.ts` never change to accommodate a filled-in verb.\nimport { CohorteError, errorOf } from '@cohorte/base';\nimport type { CliContext } from './context.ts';\n\n/** What `cli.ts` hands a module after commander parsed the line: positionals, options, and the JSON flag. */\nexport interface CommandArgs {\n /**\n * Every token commander did not consume, IN ORDER — which in V3.0 means every flag a verb defines for itself:\n * `cohorte run spec-1 --wait 8 --detach` arrives as `['spec-1', '--wait', '8', '--detach']`. A verb module parses\n * its own flags from here.\n */\n readonly positionals: readonly string[];\n /**\n * In V3.0 this carries ONLY `json`. The registry is frozen (PLAN §3 rule 3) and `cli.ts` registers no option but\n * `--json`, on the verbs that publish a document; with `allowUnknownOption(true)` every other flag is left\n * unparsed in `positionals`. So `args.options.wait` / `args.options.check` are ALWAYS `undefined` — read\n * `positionals`. The map is kept open (rather than typed `{ json?: boolean }`) because a post-3.0 registry\n * amendment that declares a real option is a MINOR, not a breaking change to this contract.\n */\n readonly options: Readonly<Record<string, unknown>>;\n /** Set when the verb has DESIGN §9 sub-verbs (`config get`, `auth login`, ...): the one commander matched. */\n readonly subVerb?: string;\n readonly json: boolean;\n}\n\nexport interface CommandModule {\n readonly verb: string;\n /**\n * Runs the verb; returns the process exit code (DESIGN 2.8 / 2.3.4). Throwing is equivalent to returning the\n * class exit code of `toErrorInfo(thrown, …)`: `cli.ts` converts every throw at the boundary, so a module is\n * free to throw a `CohorteError`, a `NotImplemented`, or let an unexpected error surface — nothing here writes to\n * `ctx.stdio` on error, `cli.ts` alone owns the spec-21 `cause / impact / run / next action / exit code` format.\n */\n run(ctx: CliContext, args: CommandArgs): Promise<number>;\n}\n\n/**\n * The Wave-0 body of every verb (DESIGN §9 \"stubbed with a seam\" and the plain \"not yet built\" ones alike): a verb\n * a later wave fills replaces this factory call with a real implementation, never the module's shape.\n *\n * It throws a CLASSIFIED `CohorteError`, not a bare `NotImplemented`: `toErrorInfo` keeps a `CohorteError`'s own\n * code, so the documented `configuration/phase-not-available` (DESIGN §9, exit 10) is what the stub MEANS rather\n * than what `cli.ts`'s unknown-throwable fallback happens to be. `cli.ts`'s fallback is `configuration/unexpected`\n * (DESIGN 2.8 \"Unknown throwables -> `<nearest class>/unexpected`\"), so a real defect in a filled-in verb can never\n * masquerade as \"this phase is not available in this build\".\n */\nexport function notImplementedCommand(verb: string): CommandModule {\n return {\n verb,\n // `ctx`/`args` intentionally unused: the Wave-0 stub never touches a port (DESIGN 1.3).\n async run(_ctx, _args): Promise<number> {\n throw new CohorteError(\n errorOf('configuration/phase-not-available', `the verb \\`${verb}\\` is not available in this build`),\n );\n },\n };\n}\n","// apps/cli/src/contract/documents.ts — DESIGN 2.3.5 \"one [S] document per --json output\". `JSON_OUTPUTS` is the\n// map a Wave-4 command unit's `--json validates` test reads: verb -> the published document(s) that verb's\n// `--json` can print, each resolvable to a real schema in the protocol, project-model or security contract (PLAN\n// U0.10 test list, 6th row).\n\nimport { ProjectModel, ReconcilePlan } from '@cohorte/project-model/contract';\nimport { DOCUMENTS, type DocumentName } from '@cohorte/protocol';\nimport type { TSchema } from 'typebox';\n\n/** The two project-model documents a `--json` verb may print (DESIGN §9: `reconcile --plan`, `discover`). */\nexport const PROJECT_MODEL_DOCUMENT_NAMES = ['reconcile-plan', 'project-model'] as const;\nexport type ProjectModelDocumentName = (typeof PROJECT_MODEL_DOCUMENT_NAMES)[number];\n\nexport type DocumentRef =\n | { readonly source: 'protocol'; readonly name: DocumentName }\n | { readonly source: 'project-model'; readonly name: ProjectModelDocumentName };\n\n/** Resolves a `DocumentRef` to its real schema; throws when the referenced contract has no such entry (a drift\n * guard, not a runtime path: every entry of `JSON_OUTPUTS` below is checked against this at test time). */\nexport function resolveDocumentSchema(ref: DocumentRef): TSchema {\n if (ref.source === 'protocol') {\n const schema = DOCUMENTS[ref.name];\n if (!schema) throw new RangeError(`resolveDocumentSchema: no protocol document named ${ref.name}`);\n return schema;\n }\n // A plain lookup, not a `switch` with an unreachable default: the ref may come from a Wave-4 unit's data, so an\n // unknown name must throw at run time and not only fail to typecheck.\n // No cast: `TUnsafe<T> extends TSchema`, and there is exactly one typebox install (the `pnpm-workspace.yaml`\n // override pins 1.3.7), so `@cohorte/project-model/contract`'s schemas ARE `TSchema`s here. If this ever stops\n // compiling, the cause is a second typebox identity in the graph — a real defect to report, not to cast away.\n const projectModelSchemas: Record<ProjectModelDocumentName, TSchema> = {\n 'reconcile-plan': ReconcilePlan,\n 'project-model': ProjectModel,\n };\n const schema = projectModelSchemas[ref.name];\n if (!schema) throw new RangeError(`resolveDocumentSchema: no project-model document named ${String(ref.name)}`);\n return schema;\n}\n\nconst protocolDoc = (name: DocumentName): DocumentRef => ({ source: 'protocol', name });\nconst reconcilePlanDoc: DocumentRef = { source: 'project-model', name: 'reconcile-plan' };\n/** DESIGN §9 verb semantics: \"`cohorte discover` prints the deterministic scan as a Project Model document\". */\nconst projectModelDoc: DocumentRef = { source: 'project-model', name: 'project-model' };\n/** DESIGN 2.3.4's inbox route: every mutating command answers with a `CommandResultDocument`. */\nconst commandResult: readonly DocumentRef[] = [protocolDoc('command-result')];\n\n/**\n * Keyed by CLI verb (not by `CommandType`: read-only verbs publish a document with no command behind them).\n *\n * The key set is exactly `{ verb.name | verb.json }` of `contract/verbs.ts`, and `cli.ts` registers `--json` only\n * for those verbs — `apps/cli/test/registry/json-outputs.test.ts` pins both directions. `logs` and `tail` are\n * deliberately absent: DESIGN 4.7 gives an observer `--format=line|json` over an NDJSON *stream* of event\n * envelopes, not a single `--json` document (request U0.10 R1 asks U0.G to confirm that reading).\n */\nexport const JSON_OUTPUTS: Readonly<Record<string, readonly DocumentRef[]>> = Object.freeze({\n // `status <run>` -> run-state; `status` (no run) -> project-status (DESIGN 2.3.4 \"no runId => ProjectStatusDocument\")\n status: [protocolDoc('project-status'), protocolDoc('run-state')],\n inspect: [protocolDoc('inspect')],\n diff: [protocolDoc('run-diff')],\n doctor: [protocolDoc('doctor-report')],\n auth: [protocolDoc('auth-status')],\n reconcile: [reconcilePlanDoc],\n discover: [projectModelDoc],\n // `run` drives `start`; its `--wait`/`--json` prints the same run-state an observer would (DESIGN 4.7).\n run: [protocolDoc('command-result'), protocolDoc('run-state')],\n resume: commandResult,\n pause: commandResult,\n cancel: commandResult,\n approve: commandResult,\n deny: commandResult,\n retry: commandResult,\n skip: commandResult,\n shutdown: commandResult,\n send: commandResult,\n 'run-tool': commandResult,\n});\n","// apps/cli/src/contract/exit-codes.ts — DESIGN 2.8 \"Exit codes of a process that waits for a run\" + DESIGN 4.7 +\n// the controller codes of DESIGN 2.3.4 (`CONTROLLER_EXIT_CODES`). Total over `ErrorClass` because it is built\n// directly from `@cohorte/base`'s `EXIT_CODE_BY_CLASS`, which is itself total (a `satisfies Record<ErrorClass, …>`\n// literal): the totality test in `apps/cli/test/registry` checks that equality holds, it does not re-derive it.\nimport { ERROR_CLASSES, type ErrorClass, EXIT_CODE_BY_CLASS } from '@cohorte/base';\nimport { CONTROLLER_EXIT_CODES, HALTED_STATES, type PipelineState, SUSPENDED_STATES } from '@cohorte/protocol';\n\nexport { CONTROLLER_EXIT_CODES, EXIT_CODE_BY_CLASS };\n\n/** DESIGN 4.7 \"4 on a suspended state\" / DESIGN 2.3.4 \"4 accepted-but-pending at --wait expiry (not an error)\". */\nexport const SUSPENDED_EXIT_CODE = 4;\n/** DESIGN 2.8 \"16 on CANCELLED\" (shares the `conflict` class code, but CANCELLED is not itself an error). */\nexport const CANCELLED_EXIT_CODE = 16;\nexport const COMPLETED_EXIT_CODE = 0;\n\nconst SUSPENDED = new Set<string>(SUSPENDED_STATES);\nconst HALTED = new Set<string>(HALTED_STATES);\n\n/**\n * DESIGN 2.8 / 4.7: \"an observer started by `run`, or any `--wait`, exits 0 on COMPLETED, the class code of\n * `run.lastError` on FAILED/BLOCKED, 4 on a suspended state, 16 on CANCELLED.\" `lastErrorClass` is required\n * exactly when `state` is FAILED or BLOCKED (DESIGN 2.8: every halted run carries a `lastError`).\n */\nexport function waitExitCode(state: PipelineState, lastErrorClass?: ErrorClass): number {\n if (state === 'COMPLETED') return COMPLETED_EXIT_CODE;\n if (state === 'CANCELLED') return CANCELLED_EXIT_CODE;\n if (SUSPENDED.has(state)) return SUSPENDED_EXIT_CODE;\n if (HALTED.has(state)) {\n if (!lastErrorClass) throw new RangeError(`waitExitCode: ${state} requires lastErrorClass (DESIGN 2.8)`);\n return EXIT_CODE_BY_CLASS[lastErrorClass];\n }\n // IDLE and every ACTIVE_PIPELINE_STATE are not terminal/suspended: a waiter never observes them as a final state.\n throw new RangeError(`waitExitCode: ${state} is not a terminal or suspended state (DESIGN 2.8)`);\n}\n\nexport interface ExitCodeHelpRow {\n readonly code: number;\n readonly meaning: string;\n}\n\n/** DESIGN 2.3.4 \"Controller exit codes: 0 completed · 3 rejected · 4 accepted-but-pending · 2 usage.\" */\nexport const CONTROLLER_EXIT_HELP: readonly ExitCodeHelpRow[] = [\n { code: CONTROLLER_EXIT_CODES.completed, meaning: 'completed' },\n { code: CONTROLLER_EXIT_CODES.usage, meaning: 'usage error' },\n { code: CONTROLLER_EXIT_CODES.rejected, meaning: 'rejected' },\n { code: CONTROLLER_EXIT_CODES.pending, meaning: 'accepted, pending at --wait expiry (not an error: durable inbox)' },\n];\n\n/** DESIGN 2.8's table, class by class, in spec order. */\nexport const ERROR_CLASS_EXIT_HELP: readonly ExitCodeHelpRow[] = ERROR_CLASSES.map((errorClass) => ({\n code: EXIT_CODE_BY_CLASS[errorClass],\n meaning: `${errorClass} error`,\n}));\n\nexport const CANCELLED_EXIT_HELP: ExitCodeHelpRow = { code: CANCELLED_EXIT_CODE, meaning: 'cancelled' };\n\n/** Rendered into `--help` (PLAN U0.10 test: \"controller codes 0/2/3/4 documented in --help\"). */\nexport function formatExitCodesHelp(): string {\n const rows = [...CONTROLLER_EXIT_HELP, ...ERROR_CLASS_EXIT_HELP, CANCELLED_EXIT_HELP];\n const width = Math.max(...rows.map((row) => String(row.code).length));\n const lines = rows.map((row) => ` ${String(row.code).padStart(width)} ${row.meaning}`);\n return ['Exit codes:', ...lines].join('\\n');\n}\n","// apps/cli/src/contract/verbs.ts — DESIGN §9 \"V3.0 scope cut\" CLI row + the verb-semantics paragraph, and DESIGN\n// 2.3.4 \"every command type has a CLI verb, because one-shot CLI spawns are the only V3.0 transport\". `cli.ts`\n// builds the whole commander tree from this table and NOTHING ELSE (PLAN §3 rule 3: \"cli.ts pre-registers every\n// verb against commands/<verb>/index.ts\"); a later wave fills a verb's module, never this table's shape.\nimport type { CommandType } from '@cohorte/protocol';\n\nexport interface VerbSpec {\n readonly name: string;\n readonly summary: string;\n /** DESIGN §9: `config get|set|validate|trust`, `auth login|status|logout`, `providers list|test`, ... */\n readonly subVerbs?: readonly string[];\n /** Not listed in `cohorte --help` (the `__host` internal entry point, DESIGN 4.7). */\n readonly hidden?: boolean;\n /**\n * This verb accepts `--json` and publishes a document for it (DESIGN 2.3.5). Set exactly on the verbs that have\n * a `JSON_OUTPUTS` entry — `cli.ts` registers the `--json` option only for those, and\n * `apps/cli/test/registry/json-outputs.test.ts` pins the two sides equal in BOTH directions, so a verb can never\n * be silently flagged `--json` with no document behind it.\n */\n readonly json?: boolean;\n /** The `@cohorte/protocol` `CommandType` this verb drives 1:1, when it drives exactly one (DESIGN 2.3.4). */\n readonly commandType?: CommandType;\n}\n\nexport const VERBS: readonly VerbSpec[] = [\n { name: 'init', summary: 'Scaffold .cohorte/ for this repository' },\n { name: 'doctor', summary: 'Diagnose the installation, configuration and toolchain', json: true },\n { name: 'discover', summary: 'Print the deterministic project scan (no write)', json: true },\n { name: 'run', summary: 'Start a pipeline run', commandType: 'start', json: true },\n { name: 'status', summary: 'Show a run, or the project, status', commandType: 'status', json: true },\n {\n name: 'inspect',\n summary: 'Inspect one agent, context, approval, effect, snapshot, lock, diff or artifact',\n commandType: 'inspect',\n json: true,\n },\n { name: 'resume', summary: 'Resume a suspended run', commandType: 'resume', json: true },\n { name: 'pause', summary: 'Pause an active run', commandType: 'pause', json: true },\n { name: 'cancel', summary: 'Cancel a run', commandType: 'cancel', json: true },\n { name: 'shutdown', summary: 'Ask the detached host to shut down gracefully', commandType: 'shutdown', json: true },\n { name: 'approve', summary: 'Approve a pending approval request', commandType: 'approve', json: true },\n { name: 'deny', summary: 'Deny a pending approval request', commandType: 'deny', json: true },\n { name: 'retry', summary: 'Retry a phase or an agent', commandType: 'retry', json: true },\n { name: 'skip', summary: 'Skip a phase (only if policy.skip lists it)', commandType: 'skip', json: true },\n { name: 'logs', summary: 'Print durable run events' },\n { name: 'tail', summary: 'Follow a run (durable + ephemeral events)', commandType: 'tail' },\n { name: 'diff', summary: 'Show the run diff for a surface', json: true },\n { name: 'review', summary: 'Start a review-profile run over a ref range or a prior run' },\n { name: 'fix', summary: \"Retry a run's FIX phase\" },\n { name: 'ship', summary: 'Show and resolve the pending ship approval' },\n { name: 'auth', summary: 'Manage provider authentication', subVerbs: ['login', 'status', 'logout'], json: true },\n { name: 'providers', summary: 'List or test configured providers', subVerbs: ['list', 'test'] },\n { name: 'models', summary: 'List available models', subVerbs: ['list'] },\n {\n name: 'config',\n summary: 'Read, write, validate or trust the project configuration',\n subVerbs: ['get', 'set', 'validate', 'trust'],\n },\n { name: 'migrate', summary: 'Check or apply state-store migrations' },\n {\n name: 'reconcile',\n summary: 'Plan the project configuration against the discovered state',\n commandType: 'reconcile',\n json: true,\n },\n { name: 'spec', summary: 'Validate or freeze a human-written spec', subVerbs: ['validate', 'freeze'] },\n { name: 'policy', summary: 'Explain the effective security policy', subVerbs: ['explain'] },\n { name: 'gc', summary: 'Garbage-collect worktrees, spools and old runs' },\n {\n name: 'update',\n // DESIGN §9 spells it as a FLAG, `update --check`, not a sub-verb: the Wave-5 unit that fills\n // `commands/update/index.ts` reads `--check` from `args.options`/`args.positionals` like every other verb flag.\n summary: 'Check for a newer pinned install (offline, --check only in V3.0)',\n },\n { name: 'brainstorm', summary: 'Not available in V3.0 (reserved verb id, DESIGN §9)' },\n {\n name: 'run-tool',\n summary: 'Run one tool directly (admin; policy.admin.runTool)',\n commandType: 'run-tool',\n json: true,\n },\n {\n name: 'send',\n summary: 'Send text to a running agent (policy.steer.enabled)',\n commandType: 'agent.send',\n json: true,\n },\n { name: '__host', summary: 'Internal: run the detached host in-process', hidden: true },\n];\n\nconst BY_NAME = new Map(VERBS.map((verb) => [verb.name, verb]));\n\nexport function findVerb(name: string): VerbSpec | undefined {\n return BY_NAME.get(name);\n}\n\nexport const VERB_NAMES: readonly string[] = VERBS.map((verb) => verb.name);\n\n/** DESIGN 2.3.4: every `CommandType` has exactly one driving verb. Built from `VERBS`, so it can never drift. */\nexport const COMMAND_TYPE_TO_VERB: Readonly<Record<CommandType, string>> = Object.freeze(\n Object.fromEntries(\n VERBS.filter((verb): verb is VerbSpec & { commandType: CommandType } => verb.commandType !== undefined).map(\n (verb) => [verb.commandType, verb.name],\n ),\n ) as Record<CommandType, string>,\n);\n"],"mappings":"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"}
@@ -0,0 +1,123 @@
1
+ import { S as IsoInstant, T as Sha256, x as ID_PATTERN } from "./src-Cu3TxNob.mjs";
2
+ import { Type } from "typebox";
3
+ //#region ../../packages/project-model/src/contract.ts
4
+ const closed = { additionalProperties: false };
5
+ const oneOf = (values) => Type.Unsafe({
6
+ type: "string",
7
+ enum: [...values]
8
+ });
9
+ /** Spec 13: every field of the model, and every file of `.cohorte/`, has exactly one class. */
10
+ const FIELD_CLASSES = [
11
+ "human",
12
+ "generated",
13
+ "derived",
14
+ "observed",
15
+ "mixed"
16
+ ];
17
+ /** Spec 13: what the diff engine must tell apart. */
18
+ const DIFF_CLASSES = [
19
+ "absent",
20
+ "expected-change",
21
+ "human-change",
22
+ "conflict",
23
+ "potential-deletion",
24
+ "unknown"
25
+ ];
26
+ const strings = () => Type.Array(Type.String());
27
+ const ProvenanceSchema = Type.Object({
28
+ detector: Type.String({ minLength: 1 }),
29
+ sources: strings(),
30
+ confidence: Type.Optional(Type.Number({
31
+ minimum: 0,
32
+ maximum: 1
33
+ }))
34
+ }, closed);
35
+ const field = (value) => Type.Object({
36
+ value,
37
+ class: oneOf(FIELD_CLASSES),
38
+ provenance: ProvenanceSchema
39
+ }, closed);
40
+ const nullableString = () => Type.Union([Type.String(), Type.Null()]);
41
+ Type.Unsafe(Type.Object({
42
+ schemaVersion: Type.Literal(1),
43
+ project: Type.Object({
44
+ id: field(Type.String({ pattern: ID_PATTERN })),
45
+ root: field(Type.String())
46
+ }, closed),
47
+ stack: Type.Object({
48
+ languages: field(strings()),
49
+ packageManager: field(nullableString()),
50
+ frameworks: field(strings())
51
+ }, closed),
52
+ surfaces: Type.Record(Type.String({ pattern: ID_PATTERN }), Type.Object({ paths: field(strings()) }, closed)),
53
+ commands: Type.Record(Type.String(), field(Type.Array(Type.String(), { minItems: 1 }))),
54
+ testStrategy: field(Type.Object({
55
+ runner: nullableString(),
56
+ locations: strings()
57
+ }, closed)),
58
+ deploymentHints: field(strings()),
59
+ ownership: field(Type.Object({ codeowners: nullableString() }, closed)),
60
+ risks: Type.Array(Type.Object({
61
+ id: Type.String(),
62
+ severity: oneOf([
63
+ "high",
64
+ "medium",
65
+ "low"
66
+ ]),
67
+ message: Type.String(),
68
+ sources: strings()
69
+ }, closed)),
70
+ conventions: field(strings()),
71
+ generatedArtifacts: field(strings()),
72
+ unknowns: Type.Array(Type.Object({
73
+ id: Type.String(),
74
+ question: Type.String(),
75
+ candidates: strings(),
76
+ sources: strings()
77
+ }, closed)),
78
+ provenance: Type.Object({
79
+ generatedAt: IsoInstant,
80
+ toolVersion: Type.String(),
81
+ analysis: Type.Literal("deterministic")
82
+ }, closed)
83
+ }, closed));
84
+ const RECONCILE_OPS = [
85
+ "create",
86
+ "replace",
87
+ "delete",
88
+ "keep",
89
+ "ask"
90
+ ];
91
+ const sha = () => Type.Optional(Sha256);
92
+ const DriftReportSchema = Type.Object({
93
+ schemaVersion: Type.Literal(1),
94
+ generatedAt: IsoInstant,
95
+ entries: Type.Array(Type.Object({
96
+ target: Type.String({ minLength: 1 }),
97
+ class: oneOf(FIELD_CLASSES),
98
+ diff: oneOf(DIFF_CLASSES),
99
+ desiredSha256: sha(),
100
+ actualSha256: sha(),
101
+ recordedSha256: sha(),
102
+ detail: Type.String()
103
+ }, closed))
104
+ }, closed);
105
+ Type.Unsafe(DriftReportSchema);
106
+ Type.Unsafe(Type.Object({
107
+ schemaVersion: Type.Literal(1),
108
+ cohorteVersion: Type.String({ minLength: 1 }),
109
+ generatedAt: IsoInstant,
110
+ drift: DriftReportSchema,
111
+ operations: Type.Array(Type.Object({
112
+ op: oneOf(RECONCILE_OPS),
113
+ target: Type.String({ minLength: 1 }),
114
+ diff: oneOf(DIFF_CLASSES),
115
+ reason: Type.String()
116
+ }, closed)),
117
+ conflicts: Type.Array(Type.String()),
118
+ applyAvailable: Type.Literal(false)
119
+ }, closed));
120
+ //#endregion
121
+ export {};
122
+
123
+ //# sourceMappingURL=contract-vYbwYr0Y.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contract-vYbwYr0Y.mjs","names":[],"sources":["../../../../packages/project-model/src/contract.ts"],"sourcesContent":["// @cohorte/project-model/contract (PLAN PC-4, spec 12-13): frozen in Wave 0 so that the scan unit and the drift unit\n// never import each other. Types are written by hand and the schema consts annotated: see docs/v3/requests/U0.02.md R1.\nimport { ID_PATTERN, IsoInstant, Sha256 } from '@cohorte/base';\nimport type { Manifest } from '@cohorte/config/schema';\nimport { type TSchema, type TUnsafe, Type } from 'typebox';\n\nconst closed = { additionalProperties: false } as const;\nconst oneOf = <const V extends readonly string[]>(values: V): TUnsafe<V[number]> =>\n Type.Unsafe<V[number]>({ type: 'string', enum: [...values] });\n\n/** Spec 13: every field of the model, and every file of `.cohorte/`, has exactly one class. */\nexport const FIELD_CLASSES = ['human', 'generated', 'derived', 'observed', 'mixed'] as const;\nexport type FieldClass = (typeof FIELD_CLASSES)[number];\n\n/** Spec 13: what the diff engine must tell apart. */\nexport const DIFF_CLASSES = [\n 'absent',\n 'expected-change',\n 'human-change',\n 'conflict',\n 'potential-deletion',\n 'unknown',\n] as const;\nexport type DiffClass = (typeof DIFF_CLASSES)[number];\n\nexport interface Provenance {\n /** which deterministic detector produced the value, e.g. 'package-json', 'lockfile', 'git', 'human-config' */\n detector: string;\n /** repo-relative POSIX paths the value was read from */\n sources: string[];\n /** 0..1; only a SEMANTIC inference carries one (spec 12), and V3.0 has none */\n confidence?: number;\n}\n\nexport interface ModelField<T> {\n value: T;\n class: FieldClass;\n provenance: Provenance;\n}\n\n/** Ambiguity is recorded, NEVER resolved by inventing a value (a command least of all). */\nexport interface Unknown {\n id: string;\n question: string;\n candidates: string[];\n sources: string[];\n}\n\nexport interface Risk {\n id: string;\n severity: 'high' | 'medium' | 'low';\n message: string;\n sources: string[];\n}\n\n/** Spec 12. `commands` are argv arrays, not the shell strings of the spec's example: the product is argv-only (I3, D-25). */\nexport interface ProjectModel {\n schemaVersion: 1;\n project: { id: ModelField<string>; root: ModelField<string> };\n stack: {\n languages: ModelField<string[]>;\n packageManager: ModelField<string | null>;\n frameworks: ModelField<string[]>;\n };\n surfaces: Record<string, { paths: ModelField<string[]> }>;\n commands: Record<string, ModelField<string[]>>;\n testStrategy: ModelField<{ runner: string | null; locations: string[] }>;\n deploymentHints: ModelField<string[]>;\n ownership: ModelField<{ codeowners: string | null }>;\n risks: Risk[];\n conventions: ModelField<string[]>;\n generatedArtifacts: ModelField<string[]>;\n unknowns: Unknown[];\n provenance: { generatedAt: IsoInstant; toolVersion: string; analysis: 'deterministic' };\n}\n\nconst strings = () => Type.Array(Type.String());\nconst ProvenanceSchema = Type.Object(\n {\n detector: Type.String({ minLength: 1 }),\n sources: strings(),\n confidence: Type.Optional(Type.Number({ minimum: 0, maximum: 1 })),\n },\n closed,\n);\nconst field = (value: TSchema) =>\n Type.Object({ value, class: oneOf(FIELD_CLASSES), provenance: ProvenanceSchema }, closed);\nconst nullableString = () => Type.Union([Type.String(), Type.Null()]);\n\n/** [S] `.cohorte/project.yaml`, and the document `cohorte discover` prints. */\nexport const ProjectModel: TUnsafe<ProjectModel> = Type.Unsafe<ProjectModel>(\n Type.Object(\n {\n schemaVersion: Type.Literal(1),\n project: Type.Object({ id: field(Type.String({ pattern: ID_PATTERN })), root: field(Type.String()) }, closed),\n stack: Type.Object(\n { languages: field(strings()), packageManager: field(nullableString()), frameworks: field(strings()) },\n closed,\n ),\n surfaces: Type.Record(Type.String({ pattern: ID_PATTERN }), Type.Object({ paths: field(strings()) }, closed)),\n commands: Type.Record(Type.String(), field(Type.Array(Type.String(), { minItems: 1 }))),\n testStrategy: field(Type.Object({ runner: nullableString(), locations: strings() }, closed)),\n deploymentHints: field(strings()),\n ownership: field(Type.Object({ codeowners: nullableString() }, closed)),\n risks: Type.Array(\n Type.Object(\n {\n id: Type.String(),\n severity: oneOf(['high', 'medium', 'low']),\n message: Type.String(),\n sources: strings(),\n },\n closed,\n ),\n ),\n conventions: field(strings()),\n generatedArtifacts: field(strings()),\n unknowns: Type.Array(\n Type.Object({ id: Type.String(), question: Type.String(), candidates: strings(), sources: strings() }, closed),\n ),\n provenance: Type.Object(\n { generatedAt: IsoInstant, toolVersion: Type.String(), analysis: Type.Literal('deterministic') },\n closed,\n ),\n },\n closed,\n ),\n);\n\n/** One file Cohorte wants to exist under `.cohorte/` (desired) or found there (actual). */\nexport interface StateFile {\n /** `.cohorte`-relative POSIX path */\n path: string;\n class: FieldClass;\n sha256: Sha256;\n templateId?: string;\n}\nexport interface DesiredState {\n cohorteVersion: string;\n files: StateFile[];\n}\nexport interface ActualState {\n /** the manifest found on disk; null = not initialised */\n manifest: Manifest | null;\n files: StateFile[];\n}\n\nexport interface DriftEntry {\n /** `.cohorte`-relative POSIX path, or a JSON pointer into project.yaml prefixed with `project.yaml#` */\n target: string;\n class: FieldClass;\n diff: DiffClass;\n /** what the desired state renders to */\n desiredSha256?: Sha256;\n /** what is on disk */\n actualSha256?: Sha256;\n /** `renderedSha256` of the manifest: the previous-hash guard of spec 14 */\n recordedSha256?: Sha256;\n detail: string;\n}\n\nexport interface DriftReport {\n schemaVersion: 1;\n generatedAt: IsoInstant;\n entries: DriftEntry[];\n}\n\nexport const RECONCILE_OPS = ['create', 'replace', 'delete', 'keep', 'ask'] as const;\n\nexport interface ReconcileOperation {\n op: (typeof RECONCILE_OPS)[number];\n target: string;\n diff: DiffClass;\n reason: string;\n}\n\n/** The `--json` document of `cohorte reconcile --plan`. READ-ONLY: `--apply` is rejected in V3.0. */\nexport interface ReconcilePlan {\n schemaVersion: 1;\n cohorteVersion: string;\n generatedAt: IsoInstant;\n drift: DriftReport;\n /** a human override is never in here as `replace` or `delete`: a collision is a `conflict` */\n operations: ReconcileOperation[];\n /** targets whose diff class is `conflict` */\n conflicts: string[];\n applyAvailable: false;\n}\n\nconst sha = () => Type.Optional(Sha256);\nconst DriftReportSchema = Type.Object(\n {\n schemaVersion: Type.Literal(1),\n generatedAt: IsoInstant,\n entries: Type.Array(\n Type.Object(\n {\n target: Type.String({ minLength: 1 }),\n class: oneOf(FIELD_CLASSES),\n diff: oneOf(DIFF_CLASSES),\n desiredSha256: sha(),\n actualSha256: sha(),\n recordedSha256: sha(),\n detail: Type.String(),\n },\n closed,\n ),\n ),\n },\n closed,\n);\n\n/** [S] */\nexport const DriftReport: TUnsafe<DriftReport> = Type.Unsafe<DriftReport>(DriftReportSchema);\n\n/** [S] published by `gen-schemas` */\nexport const ReconcilePlan: TUnsafe<ReconcilePlan> = Type.Unsafe<ReconcilePlan>(\n Type.Object(\n {\n schemaVersion: Type.Literal(1),\n cohorteVersion: Type.String({ minLength: 1 }),\n generatedAt: IsoInstant,\n drift: DriftReportSchema,\n operations: Type.Array(\n Type.Object(\n {\n op: oneOf(RECONCILE_OPS),\n target: Type.String({ minLength: 1 }),\n diff: oneOf(DIFF_CLASSES),\n reason: Type.String(),\n },\n closed,\n ),\n ),\n conflicts: Type.Array(Type.String()),\n applyAvailable: Type.Literal(false),\n },\n closed,\n ),\n);\n\nexport interface InitFile {\n /** `.cohorte`-relative POSIX path */\n path: string;\n /** an existing human file is NEVER overwritten */\n action: 'create' | 'keep-existing';\n class: FieldClass;\n content: string;\n templateId?: string;\n templateSha256?: Sha256;\n renderedSha256?: Sha256;\n}\n\n/** What `cohorte init` will do, computed without writing anything. Idempotent: planning twice yields the same plan. */\nexport interface InitPlan {\n projectRoot: string;\n model: ProjectModel;\n files: InitFile[];\n manifest: Manifest;\n warnings: string[];\n}\n\n/** INJECTED into `planReconcile`, so the drift unit never imports the scan unit. */\nexport type RepositoryScanner = (root: string) => Promise<ProjectModel>;\n"],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ //#region src/commands/deny/index.ts
2
+ const deny = {
3
+ verb: "deny",
4
+ async run(ctx, args) {
5
+ const [runId, approvalId] = args.positionals;
6
+ if (!runId || !approvalId) return 2;
7
+ const result = await ctx.controller.send("deny", { approvalId }, { runId });
8
+ ctx.stdio.stdout.write(`${JSON.stringify(result)}\n`);
9
+ return result.status === "rejected" ? 3 : result.status === "pending" ? 4 : 0;
10
+ }
11
+ };
12
+ //#endregion
13
+ export { deny as default };
14
+
15
+ //# sourceMappingURL=deny-ClTxSvHJ.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deny-ClTxSvHJ.mjs","names":[],"sources":["../../../../apps/cli/src/commands/deny/index.ts"],"sourcesContent":["// apps/cli/src/commands/deny/index.ts — DESIGN §9 verb `deny` (PLAN §3 rule 3 \"later units fill\n// stub files that lie inside their owned paths; they never edit ... the registry\"). Wave-0 stub: exits with the\n// documented not-available error (spec 24 `configuration/phase-not-available`); filled by the Wave-4/5\n// unit that owns `apps/cli/src/commands/deny/**`.\nimport type { CommandModule } from '../../contract/index.ts';\n\nconst deny: CommandModule = {\n verb: 'deny',\n async run(ctx, args) {\n const [runId, approvalId] = args.positionals;\n if (!runId || !approvalId) return 2;\n const result = await ctx.controller.send('deny', { approvalId: approvalId as never }, { runId });\n ctx.stdio.stdout.write(`${JSON.stringify(result)}\\n`);\n return result.status === 'rejected' ? 3 : result.status === 'pending' ? 4 : 0;\n },\n};\n\nexport default deny;\n"],"mappings":";AAMA,MAAM,OAAsB;CAC1B,MAAM;CACN,MAAM,IAAI,KAAK,MAAM;EACnB,MAAM,CAAC,OAAO,cAAc,KAAK;EACjC,IAAI,CAAC,SAAS,CAAC,YAAY,OAAO;EAClC,MAAM,SAAS,MAAM,IAAI,WAAW,KAAK,QAAQ,EAAc,WAAoB,GAAG,EAAE,MAAM,CAAC;EAC/F,IAAI,MAAM,OAAO,MAAM,GAAG,KAAK,UAAU,MAAM,EAAE,GAAG;EACpD,OAAO,OAAO,WAAW,aAAa,IAAI,OAAO,WAAW,YAAY,IAAI;CAC9E;AACF"}