@intentius/chant 0.124.13 → 0.124.14

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 (907) hide show
  1. package/bin/chant +11 -0
  2. package/dist/agents/checks.js +326 -0
  3. package/dist/agents/discover.js +885 -0
  4. package/dist/agents/importer.js +17 -0
  5. package/dist/agents/index.js +12 -0
  6. package/dist/agents/types.js +19 -0
  7. package/dist/apply.js +151 -0
  8. package/dist/attrref.js +70 -0
  9. package/dist/audit/catalog.js +350 -0
  10. package/dist/audit/core.js +252 -0
  11. package/dist/audit/discover.js +633 -0
  12. package/dist/audit/fetch.js +666 -0
  13. package/dist/audit/lineage.js +91 -0
  14. package/dist/audit/nginx.js +366 -0
  15. package/dist/audit/prior-art.js +132 -0
  16. package/dist/audit/proof.js +321 -0
  17. package/dist/audit/report-html.js +194 -0
  18. package/dist/audit/report-model.js +198 -0
  19. package/dist/audit/report.js +102 -0
  20. package/dist/audit/rules-doc.js +144 -0
  21. package/dist/audit/secrets.js +405 -0
  22. package/dist/audit/terraform-state.js +140 -0
  23. package/dist/audit/wrangler.js +262 -0
  24. package/dist/behaviour-delta.js +401 -0
  25. package/dist/behaviour-engine.js +357 -0
  26. package/dist/behaviour-graph.js +83 -0
  27. package/dist/behaviour-http.js +188 -0
  28. package/dist/behaviour-kinds.js +172 -0
  29. package/dist/behaviour-overlay.js +50 -0
  30. package/dist/behaviour-predict.js +188 -0
  31. package/dist/behaviour-request.js +194 -0
  32. package/dist/behaviour.js +1325 -0
  33. package/dist/build-params.js +108 -0
  34. package/dist/build.js +668 -0
  35. package/dist/builder.js +44 -0
  36. package/dist/cdk/advise.js +30 -0
  37. package/dist/cdk/assembly.js +122 -0
  38. package/dist/cdk/graph.js +444 -0
  39. package/dist/cdk/tier-map.js +64 -0
  40. package/dist/cdk/types.js +24 -0
  41. package/dist/change-set.js +312 -0
  42. package/dist/child-project.js +21 -0
  43. package/dist/claimed-fields.js +135 -0
  44. package/dist/cli/build-options.js +70 -0
  45. package/dist/cli/build-params-cli.js +139 -0
  46. package/dist/cli/command-group.js +123 -0
  47. package/dist/cli/commands/audit-agents.js +326 -0
  48. package/dist/cli/commands/audit.js +571 -0
  49. package/dist/cli/commands/build.js +920 -0
  50. package/dist/cli/commands/carve-apply.js +153 -0
  51. package/dist/cli/commands/carve-bridge.js +201 -0
  52. package/dist/cli/commands/carve-emit.js +332 -0
  53. package/dist/cli/commands/carve-status.js +119 -0
  54. package/dist/cli/commands/carve.js +204 -0
  55. package/dist/cli/commands/check-lexicon-docs.js +79 -0
  56. package/dist/cli/commands/check-lexicon-examples.js +177 -0
  57. package/dist/cli/commands/check-lexicon-intrinsics.js +291 -0
  58. package/dist/cli/commands/check-lexicon-mcp.js +82 -0
  59. package/dist/cli/commands/check-lexicon-plugin.d.ts.map +1 -1
  60. package/dist/cli/commands/check-lexicon-plugin.js +104 -0
  61. package/dist/cli/commands/check-lexicon.js +766 -0
  62. package/dist/cli/commands/describe.js +85 -0
  63. package/dist/cli/commands/diff.js +175 -0
  64. package/dist/cli/commands/doctor.js +350 -0
  65. package/dist/cli/commands/import-agents.js +155 -0
  66. package/dist/cli/commands/import.js +670 -0
  67. package/dist/cli/commands/init-lexicon/templates/codegen.js +194 -0
  68. package/dist/cli/commands/init-lexicon/templates/docs.js +100 -0
  69. package/dist/cli/commands/init-lexicon/templates/examples.js +29 -0
  70. package/dist/cli/commands/init-lexicon/templates/lint.js +34 -0
  71. package/dist/cli/commands/init-lexicon/templates/lsp.js +37 -0
  72. package/dist/cli/commands/init-lexicon/templates/plugin.js +108 -0
  73. package/dist/cli/commands/init-lexicon/templates/project.js +240 -0
  74. package/dist/cli/commands/init-lexicon/templates/spec.js +56 -0
  75. package/dist/cli/commands/init-lexicon/templates/tests.js +66 -0
  76. package/dist/cli/commands/init-lexicon.js +172 -0
  77. package/dist/cli/commands/init.js +381 -0
  78. package/dist/cli/commands/lexicon-rolling-upgrade.js +145 -0
  79. package/dist/cli/commands/lexicon-surface-diff.js +145 -0
  80. package/dist/cli/commands/licenses.js +125 -0
  81. package/dist/cli/commands/lint.d.ts.map +1 -1
  82. package/dist/cli/commands/lint.js +948 -0
  83. package/dist/cli/commands/list.js +63 -0
  84. package/dist/cli/commands/migrate.d.ts.map +1 -1
  85. package/dist/cli/commands/migrate.js +423 -0
  86. package/dist/cli/commands/onboard.js +403 -0
  87. package/dist/cli/commands/pinned-upgrade.js +191 -0
  88. package/dist/cli/commands/update.js +194 -0
  89. package/dist/cli/commands/vendor.js +217 -0
  90. package/dist/cli/conflict-check.js +104 -0
  91. package/dist/cli/debug.js +8 -0
  92. package/dist/cli/format.js +104 -0
  93. package/dist/cli/handlers/build.js +267 -0
  94. package/dist/cli/handlers/carve-apply.js +30 -0
  95. package/dist/cli/handlers/carve-bridge.js +28 -0
  96. package/dist/cli/handlers/carve-emit.js +50 -0
  97. package/dist/cli/handlers/carve-status.js +26 -0
  98. package/dist/cli/handlers/carve.js +40 -0
  99. package/dist/cli/handlers/change-set.js +46 -0
  100. package/dist/cli/handlers/components.js +730 -0
  101. package/dist/cli/handlers/dev.js +113 -0
  102. package/dist/cli/handlers/emulator.js +233 -0
  103. package/dist/cli/handlers/explain.js +54 -0
  104. package/dist/cli/handlers/fan-out.js +422 -0
  105. package/dist/cli/handlers/gate-resume.js +275 -0
  106. package/dist/cli/handlers/generate.js +84 -0
  107. package/dist/cli/handlers/graph.js +969 -0
  108. package/dist/cli/handlers/init.js +102 -0
  109. package/dist/cli/handlers/lifecycle.js +1727 -0
  110. package/dist/cli/handlers/lint.js +62 -0
  111. package/dist/cli/handlers/migrate.js +48 -0
  112. package/dist/cli/handlers/misc.js +391 -0
  113. package/dist/cli/handlers/operator.js +1162 -0
  114. package/dist/cli/handlers/override-approve.js +102 -0
  115. package/dist/cli/handlers/pr.js +503 -0
  116. package/dist/cli/handlers/promote.js +342 -0
  117. package/dist/cli/handlers/run-generate.js +206 -0
  118. package/dist/cli/handlers/run-wave.js +66 -0
  119. package/dist/cli/handlers/run.js +1191 -0
  120. package/dist/cli/handlers/scenario.js +325 -0
  121. package/dist/cli/handlers/search.js +924 -0
  122. package/dist/cli/handlers/serve.js +32 -0
  123. package/dist/cli/handlers/vendor.js +154 -0
  124. package/dist/cli/index.js +3 -0
  125. package/dist/cli/is-entry-point.js +23 -0
  126. package/dist/cli/lsp/capabilities.js +28 -0
  127. package/dist/cli/lsp/diagnostics.js +34 -0
  128. package/dist/cli/lsp/server.js +329 -0
  129. package/dist/cli/main.d.ts.map +1 -1
  130. package/dist/cli/main.js +2540 -0
  131. package/dist/cli/mcp/lifecycle-tools.js +80 -0
  132. package/dist/cli/mcp/op-tools.js +306 -0
  133. package/dist/cli/mcp/resource-handlers.js +258 -0
  134. package/dist/cli/mcp/resources/context.js +85 -0
  135. package/dist/cli/mcp/server.js +353 -0
  136. package/dist/cli/mcp/tools/build.js +111 -0
  137. package/dist/cli/mcp/tools/composites.js +95 -0
  138. package/dist/cli/mcp/tools/explain.js +166 -0
  139. package/dist/cli/mcp/tools/import.js +49 -0
  140. package/dist/cli/mcp/tools/lint.js +41 -0
  141. package/dist/cli/mcp/tools/scaffold.js +111 -0
  142. package/dist/cli/mcp/tools/search.js +112 -0
  143. package/dist/cli/mcp/types.js +1 -0
  144. package/dist/cli/mcp/workspace-plugins.js +91 -0
  145. package/dist/cli/mcp/workspace-tools.d.ts +1 -1
  146. package/dist/cli/mcp/workspace-tools.js +564 -0
  147. package/dist/cli/mcp-config.js +70 -0
  148. package/dist/cli/plugins.js +313 -0
  149. package/dist/cli/registry.js +23 -0
  150. package/dist/cli/reporters/stylish.js +329 -0
  151. package/dist/cli/version.js +15 -0
  152. package/dist/cli/watch.js +79 -0
  153. package/dist/codegen/bound-property-types.js +82 -0
  154. package/dist/codegen/coverage.js +119 -0
  155. package/dist/codegen/docs-file-markers.js +60 -0
  156. package/dist/codegen/docs-pages.js +115 -0
  157. package/dist/codegen/docs-rule-scanning.js +164 -0
  158. package/dist/codegen/docs-rules.js +76 -0
  159. package/dist/codegen/docs-sections.js +117 -0
  160. package/dist/codegen/docs-sidebar.js +65 -0
  161. package/dist/codegen/docs-types.js +4 -0
  162. package/dist/codegen/docs.js +356 -0
  163. package/dist/codegen/fetch.js +340 -0
  164. package/dist/codegen/generate-post-synth-barrel.js +63 -0
  165. package/dist/codegen/generate-registry.js +71 -0
  166. package/dist/codegen/generate-runtime-index.js +56 -0
  167. package/dist/codegen/generate-typescript.js +119 -0
  168. package/dist/codegen/generate.js +115 -0
  169. package/dist/codegen/json-patch.js +141 -0
  170. package/dist/codegen/json-schema-to-ts.js +344 -0
  171. package/dist/codegen/json-schema.js +246 -0
  172. package/dist/codegen/lexicon-regen.js +412 -0
  173. package/dist/codegen/naming.js +217 -0
  174. package/dist/codegen/okf-lexicon.js +245 -0
  175. package/dist/codegen/package.js +150 -0
  176. package/dist/codegen/pinned-upgrade.d.ts.map +1 -1
  177. package/dist/codegen/pinned-upgrade.js +494 -0
  178. package/dist/codegen/registry.js +60 -0
  179. package/dist/codegen/rehype-base-url.mjs +68 -0
  180. package/dist/codegen/rolling-upgrade.js +217 -0
  181. package/dist/codegen/surface-snapshot.js +537 -0
  182. package/dist/codegen/testdata/postgres-tags.json +242 -0
  183. package/dist/codegen/topo-sort.js +36 -0
  184. package/dist/codegen/typecheck.js +115 -0
  185. package/dist/codegen/validate.js +200 -0
  186. package/dist/codegen/version-bump.js +35 -0
  187. package/dist/components/auto-release.js +143 -0
  188. package/dist/components/builders.js +47 -0
  189. package/dist/components/capability-plugin-loader.js +175 -0
  190. package/dist/components/capability-plugin-schema.js +46 -0
  191. package/dist/components/capability-plugin.js +99 -0
  192. package/dist/components/capability.js +60 -0
  193. package/dist/components/changed-files.js +72 -0
  194. package/dist/components/cli-support.js +427 -0
  195. package/dist/components/component.js +120 -0
  196. package/dist/components/component.schema.json +271 -0
  197. package/dist/components/config-defaults.js +130 -0
  198. package/dist/components/deploy-units.js +60 -0
  199. package/dist/components/discover.d.ts.map +1 -1
  200. package/dist/components/discover.js +189 -0
  201. package/dist/components/driver-output.js +86 -0
  202. package/dist/components/driver.js +728 -0
  203. package/dist/components/fan-out-output.js +165 -0
  204. package/dist/components/fan-out-record.js +94 -0
  205. package/dist/components/fan-out-run.js +373 -0
  206. package/dist/components/fan-out-support.js +60 -0
  207. package/dist/components/fan-out.js +273 -0
  208. package/dist/components/gate-plan.js +41 -0
  209. package/dist/components/gated-wave-pipeline.js +46 -0
  210. package/dist/components/index.js +24 -0
  211. package/dist/components/layers.js +28 -0
  212. package/dist/components/manifest-persistence.js +108 -0
  213. package/dist/components/pilots/alb-ecs.pilot.js +59 -0
  214. package/dist/components/pilots/dynamodb.pilot.js +51 -0
  215. package/dist/components/pilots/jar-emr.pilot.js +65 -0
  216. package/dist/components/pilots/lambda.pilot.js +52 -0
  217. package/dist/components/pilots/neo4j-fanout.pilot.js +68 -0
  218. package/dist/components/pilots/project.js +12 -0
  219. package/dist/components/pr-pipeline.js +134 -0
  220. package/dist/components/pr-run.js +363 -0
  221. package/dist/components/presets/ecs-fargate.js +72 -0
  222. package/dist/components/presets/index.js +28 -0
  223. package/dist/components/presets/lambda.js +34 -0
  224. package/dist/components/presets/single-host-compose.js +41 -0
  225. package/dist/components/promote.js +549 -0
  226. package/dist/components/registry.js +34 -0
  227. package/dist/components/run-progress.js +33 -0
  228. package/dist/components/sandbox/driver.d.ts.map +1 -1
  229. package/dist/components/sandbox/driver.js +93 -0
  230. package/dist/components/sandbox/run.js +115 -0
  231. package/dist/components/starter-plugin.js +104 -0
  232. package/dist/components/verbs/__tests__/mock-cloud-executor.js +68 -0
  233. package/dist/components/verbs/__tests__/mock-process-runner.js +45 -0
  234. package/dist/components/verbs/__tests__/mock-sbom-generator.js +56 -0
  235. package/dist/components/verbs/bom-writer.js +287 -0
  236. package/dist/components/verbs/build-archive.js +188 -0
  237. package/dist/components/verbs/build.js +142 -0
  238. package/dist/components/verbs/cloud-executor.js +110 -0
  239. package/dist/components/verbs/component-bom.js +125 -0
  240. package/dist/components/verbs/ensure-secret.js +50 -0
  241. package/dist/components/verbs/index.js +61 -0
  242. package/dist/components/verbs/license-policy.js +75 -0
  243. package/dist/components/verbs/lockfile-sbom-generator.js +191 -0
  244. package/dist/components/verbs/process-runner.js +78 -0
  245. package/dist/components/verbs/r2-sync.js +93 -0
  246. package/dist/components/verbs/reproducibility.js +62 -0
  247. package/dist/components/verbs/run-agent.js +577 -0
  248. package/dist/components/verbs/sbom-generator.js +119 -0
  249. package/dist/components/verbs/sbom.js +97 -0
  250. package/dist/components/verbs/shell.js +32 -0
  251. package/dist/components/verbs/sign.js +221 -0
  252. package/dist/components/verbs/stub.js +28 -0
  253. package/dist/components/verbs/tool-sbom-generator.js +154 -0
  254. package/dist/components/verbs/verify.js +112 -0
  255. package/dist/components/verbs/vex.js +131 -0
  256. package/dist/components/verbs/vuln-gate.js +152 -0
  257. package/dist/components/verbs/vuln-scan.js +288 -0
  258. package/dist/components/verbs/wait-verify.js +106 -0
  259. package/dist/components/verbs/wrangler.js +179 -0
  260. package/dist/components/wave-plan.js +102 -0
  261. package/dist/composite.js +305 -0
  262. package/dist/config-import.d.ts.map +1 -1
  263. package/dist/config-import.js +22 -0
  264. package/dist/config-sandbox.js +122 -0
  265. package/dist/config-static.js +206 -0
  266. package/dist/config.js +605 -0
  267. package/dist/content-digest.js +23 -0
  268. package/dist/declarable.js +114 -0
  269. package/dist/deep-observation.js +437 -0
  270. package/dist/detectLexicon.js +54 -0
  271. package/dist/discovery/cache.js +70 -0
  272. package/dist/discovery/collect.js +208 -0
  273. package/dist/discovery/cycles.js +95 -0
  274. package/dist/discovery/entity-wire-codec.js +391 -0
  275. package/dist/discovery/entity-wire.js +42 -0
  276. package/dist/discovery/files.js +121 -0
  277. package/dist/discovery/fold-import.d.ts.map +1 -1
  278. package/dist/discovery/fold-import.js +4178 -0
  279. package/dist/discovery/fold-rank.js +292 -0
  280. package/dist/discovery/graph.js +115 -0
  281. package/dist/discovery/import.d.ts.map +1 -1
  282. package/dist/discovery/import.js +65 -0
  283. package/dist/discovery/index.js +333 -0
  284. package/dist/discovery/param-deps.js +487 -0
  285. package/dist/discovery/resolve.js +39 -0
  286. package/dist/discovery/sandbox/bundle.js +214 -0
  287. package/dist/discovery/sandbox/child-errors.js +26 -0
  288. package/dist/discovery/sandbox/config-run.js +100 -0
  289. package/dist/discovery/sandbox/config-wire.js +183 -0
  290. package/dist/discovery/sandbox/driver.d.ts.map +1 -1
  291. package/dist/discovery/sandbox/driver.js +333 -0
  292. package/dist/discovery/sandbox/fork.js +229 -0
  293. package/dist/discovery/sandbox/policy-run.js +142 -0
  294. package/dist/discovery/sandbox/policy-wire.js +152 -0
  295. package/dist/discovery/sandbox/run.js +77 -0
  296. package/dist/discovery/specifier-resolve.js +320 -0
  297. package/dist/discovery/walk.js +284 -0
  298. package/dist/effect-receipt.js +340 -0
  299. package/dist/env.js +55 -0
  300. package/dist/errors.js +62 -0
  301. package/dist/fold/fold.js +1434 -0
  302. package/dist/fold/foldable-helpers.js +229 -0
  303. package/dist/fold/subset.js +696 -0
  304. package/dist/fold-provenance.js +414 -0
  305. package/dist/gate-decision.js +260 -0
  306. package/dist/gate-resume-run.js +154 -0
  307. package/dist/gated-waves.js +165 -0
  308. package/dist/governance.js +43 -0
  309. package/dist/graph-declared.js +45 -0
  310. package/dist/graph-detail.js +207 -0
  311. package/dist/graph-dot.js +54 -0
  312. package/dist/graph-effective.js +107 -0
  313. package/dist/graph-ir.js +623 -0
  314. package/dist/graph-layout.js +184 -0
  315. package/dist/graph-lens.js +105 -0
  316. package/dist/graph-mermaid.js +83 -0
  317. package/dist/graph-ops.js +39 -0
  318. package/dist/graph-refs.js +156 -0
  319. package/dist/held-elsewhere.js +87 -0
  320. package/dist/identity.js +251 -0
  321. package/dist/import/base-parser.js +34 -0
  322. package/dist/import/embedded.js +255 -0
  323. package/dist/import/generator.js +1 -0
  324. package/dist/import/ir-utils.js +85 -0
  325. package/dist/import/parser-options.js +45 -0
  326. package/dist/import/parser.js +1 -0
  327. package/dist/index.js +118 -0
  328. package/dist/intrinsic-interpolation.js +73 -0
  329. package/dist/intrinsic.js +31 -0
  330. package/dist/join-key.js +35 -0
  331. package/dist/kubectl-context.js +150 -0
  332. package/dist/lexicon-config.js +58 -0
  333. package/dist/lexicon-integrity.js +47 -0
  334. package/dist/lexicon-manifest.js +70 -0
  335. package/dist/lexicon-module.d.ts.map +1 -1
  336. package/dist/lexicon-module.js +241 -0
  337. package/dist/lexicon-output.js +218 -0
  338. package/dist/lexicon-plugin-helpers.js +104 -0
  339. package/dist/lexicon-schema.js +136 -0
  340. package/dist/lexicon.js +130 -0
  341. package/dist/lifecycle/affected.js +224 -0
  342. package/dist/lifecycle/assert-live.js +110 -0
  343. package/dist/lifecycle/build-ledger-store.js +160 -0
  344. package/dist/lifecycle/build-ledger.js +155 -0
  345. package/dist/lifecycle/change-set.js +356 -0
  346. package/dist/lifecycle/converge-ledger.js +161 -0
  347. package/dist/lifecycle/deep-diff.js +233 -0
  348. package/dist/lifecycle/deep-observe.js +147 -0
  349. package/dist/lifecycle/digest.js +143 -0
  350. package/dist/lifecycle/disruption.js +135 -0
  351. package/dist/lifecycle/gate-applied.js +113 -0
  352. package/dist/lifecycle/gate-audit.js +341 -0
  353. package/dist/lifecycle/gate-ledger-select.js +89 -0
  354. package/dist/lifecycle/gate-ledger.js +193 -0
  355. package/dist/lifecycle/gate-origin.js +117 -0
  356. package/dist/lifecycle/gate-pending.js +58 -0
  357. package/dist/lifecycle/git.js +1182 -0
  358. package/dist/lifecycle/identity.js +58 -0
  359. package/dist/lifecycle/index.js +26 -0
  360. package/dist/lifecycle/lease.js +283 -0
  361. package/dist/lifecycle/ledger-port.js +1 -0
  362. package/dist/lifecycle/legacy-digest.js +91 -0
  363. package/dist/lifecycle/live-diff.js +274 -0
  364. package/dist/lifecycle/local-note.js +15 -0
  365. package/dist/lifecycle/member-ledger.js +122 -0
  366. package/dist/lifecycle/observation-baseline.js +155 -0
  367. package/dist/lifecycle/observe.js +375 -0
  368. package/dist/lifecycle/oras-referrer-lookup.js +82 -0
  369. package/dist/lifecycle/override-ledger.js +54 -0
  370. package/dist/lifecycle/plan-digest.js +110 -0
  371. package/dist/lifecycle/plan-ledger.js +129 -0
  372. package/dist/lifecycle/receipt-plan.js +192 -0
  373. package/dist/lifecycle/release-ledger.js +155 -0
  374. package/dist/lifecycle/release-read.js +64 -0
  375. package/dist/lifecycle/replay.js +193 -0
  376. package/dist/lifecycle/rollback.js +102 -0
  377. package/dist/lifecycle/run-ledger.js +183 -0
  378. package/dist/lifecycle/scenario-eval.js +204 -0
  379. package/dist/lifecycle/scenario.js +214 -0
  380. package/dist/lifecycle/snapshot.js +239 -0
  381. package/dist/lifecycle/status.js +447 -0
  382. package/dist/lifecycle/symptoms.js +117 -0
  383. package/dist/lifecycle/teardown.js +255 -0
  384. package/dist/lifecycle/types.js +1 -0
  385. package/dist/lifecycle/unobserved-gate.js +33 -0
  386. package/dist/lifecycle/wave-plans.js +68 -0
  387. package/dist/lifecycle/work-item-id.js +36 -0
  388. package/dist/lifecycle/work-lease.js +393 -0
  389. package/dist/lint/component-checks.js +87 -0
  390. package/dist/lint/config.js +483 -0
  391. package/dist/lint/declarative.js +122 -0
  392. package/dist/lint/discover.d.ts.map +1 -1
  393. package/dist/lint/discover.js +138 -0
  394. package/dist/lint/engine.js +246 -0
  395. package/dist/lint/knowledge-checks.js +64 -0
  396. package/dist/lint/named-checks.js +22 -0
  397. package/dist/lint/output-checks.js +87 -0
  398. package/dist/lint/output-docs.js +163 -0
  399. package/dist/lint/parser.js +33 -0
  400. package/dist/lint/pipeline-change-gate.js +70 -0
  401. package/dist/lint/policy-import.d.ts +1 -1
  402. package/dist/lint/policy-import.d.ts.map +1 -1
  403. package/dist/lint/policy-import.js +62 -0
  404. package/dist/lint/policy-sandbox.js +86 -0
  405. package/dist/lint/policy.js +122 -0
  406. package/dist/lint/post-synth.js +87 -0
  407. package/dist/lint/presets/relaxed.json +26 -0
  408. package/dist/lint/presets/strict.json +24 -24
  409. package/dist/lint/receipt-checks.js +83 -0
  410. package/dist/lint/rule-loader.d.ts.map +1 -1
  411. package/dist/lint/rule-loader.js +89 -0
  412. package/dist/lint/rule-registry.js +86 -0
  413. package/dist/lint/rule.js +1 -0
  414. package/dist/lint/rules/__fixtures__/comp/comp000-discovery-error/broken-a.component.js +7 -0
  415. package/dist/lint/rules/__fixtures__/comp/comp000-discovery-error/broken-b.component.js +7 -0
  416. package/dist/lint/rules/__fixtures__/comp/comp001/fail/orphan-lib.component.js +9 -0
  417. package/dist/lint/rules/__fixtures__/comp/comp001/pass/emr-job.component.js +11 -0
  418. package/dist/lint/rules/__fixtures__/comp/comp001/pass/jar-lib.component.js +9 -0
  419. package/dist/lint/rules/__fixtures__/comp/comp002/fail/search-service.component.js +25 -0
  420. package/dist/lint/rules/__fixtures__/comp/comp002/pass/jar-lib.component.js +8 -0
  421. package/dist/lint/rules/__fixtures__/comp/comp002/pass/search-service.component.js +21 -0
  422. package/dist/lint/rules/__fixtures__/comp/comp003/fail/migrator.component.js +8 -0
  423. package/dist/lint/rules/__fixtures__/comp/comp003/pass/agent-turn.component.js +24 -0
  424. package/dist/lint/rules/__fixtures__/comp/comp003/pass/migrator.component.js +17 -0
  425. package/dist/lint/rules/__fixtures__/comp/comp003/pass/orders-table.component.js +8 -0
  426. package/dist/lint/rules/__fixtures__/comp/comp004/fail/neo4j-cluster.component.js +18 -0
  427. package/dist/lint/rules/__fixtures__/comp/comp004/pass/neo4j-cluster.component.js +20 -0
  428. package/dist/lint/rules/__fixtures__/comp/comp004/pass/orders-table.component.js +8 -0
  429. package/dist/lint/rules/__fixtures__/comp/comp005/fail/search-service.component.js +12 -0
  430. package/dist/lint/rules/__fixtures__/comp/comp005/pass/search-service.component.js +16 -0
  431. package/dist/lint/rules/__fixtures__/comp/comp006/fail/legacy-tool.component.js +8 -0
  432. package/dist/lint/rules/__fixtures__/comp/comp006/pass/legacy-tool.component.js +12 -0
  433. package/dist/lint/rules/__fixtures__/comp/comp007/fail/inventory-table.component.js +11 -0
  434. package/dist/lint/rules/__fixtures__/comp/comp007/fail/orders-table.component.js +11 -0
  435. package/dist/lint/rules/__fixtures__/comp/comp007/pass/orders-table.component.js +10 -0
  436. package/dist/lint/rules/__fixtures__/comp/comp007/pass/search-service.component.js +16 -0
  437. package/dist/lint/rules/comp/comp001-publishes-never-applies.js +69 -0
  438. package/dist/lint/rules/comp/comp002-dangling-wiring-ref.js +84 -0
  439. package/dist/lint/rules/comp/comp003-mutating-no-rollback.js +103 -0
  440. package/dist/lint/rules/comp/comp004-gate-needs-durable-runtime.js +70 -0
  441. package/dist/lint/rules/comp/comp005-capability-kind-is-noun.js +109 -0
  442. package/dist/lint/rules/comp/comp006-shell-needs-reason.js +49 -0
  443. package/dist/lint/rules/comp/comp007-composition-sprawl.js +64 -0
  444. package/dist/lint/rules/comp/index.js +33 -0
  445. package/dist/lint/rules/comp/support.js +129 -0
  446. package/dist/lint/rules/composite-scope.js +51 -0
  447. package/dist/lint/rules/cor017-composite-name-match.js +93 -0
  448. package/dist/lint/rules/cor018-composite-prefer-lexicon-type.js +136 -0
  449. package/dist/lint/rules/cor021-env-literal-name.js +100 -0
  450. package/dist/lint/rules/cor022-receipt-leaf.js +118 -0
  451. package/dist/lint/rules/cor024-receipt-secret-pointer.js +199 -0
  452. package/dist/lint/rules/declarable-naming-convention.js +62 -0
  453. package/dist/lint/rules/evl001-non-literal-expression.js +66 -0
  454. package/dist/lint/rules/evl002-control-flow-resource.js +69 -0
  455. package/dist/lint/rules/evl003-dynamic-property-access.js +44 -0
  456. package/dist/lint/rules/evl004-spread-non-const.js +94 -0
  457. package/dist/lint/rules/evl005-resource-block-body.js +41 -0
  458. package/dist/lint/rules/evl007-invalid-siblings.js +105 -0
  459. package/dist/lint/rules/evl009-composite-no-constant.js +158 -0
  460. package/dist/lint/rules/evl010-composite-no-transform.js +59 -0
  461. package/dist/lint/rules/evl011-symbolic-in-template.js +106 -0
  462. package/dist/lint/rules/export-required.js +115 -0
  463. package/dist/lint/rules/file-declarable-limit.js +88 -0
  464. package/dist/lint/rules/flat-declarations.js +62 -0
  465. package/dist/lint/rules/index.js +90 -0
  466. package/dist/lint/rules/no-cyclic-declarable-ref.js +138 -0
  467. package/dist/lint/rules/no-redundant-type-import.js +76 -0
  468. package/dist/lint/rules/no-redundant-value-cast.js +41 -0
  469. package/dist/lint/rules/no-string-ref.js +59 -0
  470. package/dist/lint/rules/no-unused-declarable-import.js +75 -0
  471. package/dist/lint/rules/no-unused-declarable.js +142 -0
  472. package/dist/lint/rules/op/index.js +28 -0
  473. package/dist/lint/rules/op/ops012-activity-contract.js +54 -0
  474. package/dist/lint/rules/op/ops013-step-output-ref.js +88 -0
  475. package/dist/lint/rules/op/ops014-converge-rule-refusals.js +114 -0
  476. package/dist/lint/rules/op/ops015-gate-approval.js +45 -0
  477. package/dist/lint/rules/op/support.js +11 -0
  478. package/dist/lint/rules/op/sys010-key-over-plain-http.js +100 -0
  479. package/dist/lint/rules/property-kind.js +56 -0
  480. package/dist/lint/rules/single-concern-file.js +71 -0
  481. package/dist/lint/rules/sys001-no-literal-key.js +60 -0
  482. package/dist/lint/selectors.js +168 -0
  483. package/dist/lint/suppressions.js +129 -0
  484. package/dist/lint/typescript.js +17 -0
  485. package/dist/live-endpoint.js +113 -0
  486. package/dist/live-read-session.js +76 -0
  487. package/dist/lsp/lexicon-providers.js +163 -0
  488. package/dist/lsp/types.js +5 -0
  489. package/dist/managed-fields.js +293 -0
  490. package/dist/mcp/types.js +4 -0
  491. package/dist/notify-verify.js +0 -1
  492. package/dist/notify.js +0 -1
  493. package/dist/notify.schema.json +72 -0
  494. package/dist/observation.js +266 -0
  495. package/dist/okf-read.js +134 -0
  496. package/dist/okf.js +275 -0
  497. package/dist/op/__fixtures__/decide-stub-backend.js +125 -0
  498. package/dist/op/activities/activity-contracts.js +313 -0
  499. package/dist/op/activities/apply.js +582 -0
  500. package/dist/op/activities/build.js +18 -0
  501. package/dist/op/activities/change-coverage.js +40 -0
  502. package/dist/op/activities/change-set.js +64 -0
  503. package/dist/op/activities/converge.js +492 -0
  504. package/dist/op/activities/decide.js +211 -0
  505. package/dist/op/activities/env-teardown.js +110 -0
  506. package/dist/op/activities/factory.js +591 -0
  507. package/dist/op/activities/forge-pull-request.js +82 -0
  508. package/dist/op/activities/gh-host.js +78 -0
  509. package/dist/op/activities/guard-validate.js +165 -0
  510. package/dist/op/activities/http-check.js +40 -0
  511. package/dist/op/activities/index.js +59 -0
  512. package/dist/op/activities/lexicon-upgrade.js +629 -0
  513. package/dist/op/activities/lifecycle.js +109 -0
  514. package/dist/op/activities/pipeline-audit.js +147 -0
  515. package/dist/op/activities/policy.js +26 -0
  516. package/dist/op/activities/predict-behaviour.js +341 -0
  517. package/dist/op/activities/propose-upgrade.js +165 -0
  518. package/dist/op/activities/reconcile.js +997 -0
  519. package/dist/op/activities/shell.js +118 -0
  520. package/dist/op/activities/source-release.js +97 -0
  521. package/dist/op/activities/source-rollback.js +165 -0
  522. package/dist/op/activities/teardown.js +17 -0
  523. package/dist/op/activities/util.js +6 -0
  524. package/dist/op/activities/wait.js +51 -0
  525. package/dist/op/activities/work-evidence.js +35 -0
  526. package/dist/op/activities/workflow-audit.js +133 -0
  527. package/dist/op/activity-contract-registry.js +106 -0
  528. package/dist/op/activity-contract.js +232 -0
  529. package/dist/op/activity-failure.js +31 -0
  530. package/dist/op/activity-profiles.js +129 -0
  531. package/dist/op/activity-registry.js +105 -0
  532. package/dist/op/activity-runtime.js +28 -0
  533. package/dist/op/builders.js +801 -0
  534. package/dist/op/change-signal.js +118 -0
  535. package/dist/op/composites/apply-op.js +151 -0
  536. package/dist/op/composites/behaviour-op.js +65 -0
  537. package/dist/op/composites/converge-op.js +141 -0
  538. package/dist/op/composites/index.js +19 -0
  539. package/dist/op/composites/lexicon-upgrade-op.js +107 -0
  540. package/dist/op/composites/pipeline-audit-op.js +50 -0
  541. package/dist/op/composites/reconcile-op.js +84 -0
  542. package/dist/op/composites/watch-op.js +69 -0
  543. package/dist/op/composites/workflow-audit-op.js +57 -0
  544. package/dist/op/converge-rule.js +205 -0
  545. package/dist/op/cron.js +146 -0
  546. package/dist/op/decide-backend.js +181 -0
  547. package/dist/op/decide-config.js +68 -0
  548. package/dist/op/decide-read-inputs.js +141 -0
  549. package/dist/op/discover.d.ts.map +1 -1
  550. package/dist/op/discover.js +213 -0
  551. package/dist/op/duration.js +21 -0
  552. package/dist/op/emulator-freshness.js +80 -0
  553. package/dist/op/emulator-lifecycle.js +269 -0
  554. package/dist/op/factory.js +83 -0
  555. package/dist/op/gate-approval.js +172 -0
  556. package/dist/op/gate-name.js +86 -0
  557. package/dist/op/gate-plan-context.js +167 -0
  558. package/dist/op/gate-point-run.js +67 -0
  559. package/dist/op/gate-point.js +111 -0
  560. package/dist/op/gate-resume-plan.js +155 -0
  561. package/dist/op/gate-resume.js +31 -0
  562. package/dist/op/gate-review.js +290 -0
  563. package/dist/op/gate-run-locator.js +85 -0
  564. package/dist/op/gate-summary.js +100 -0
  565. package/dist/op/gate-wait.js +56 -0
  566. package/dist/op/gate.js +449 -0
  567. package/dist/op/generate-pipeline.js +124 -0
  568. package/dist/op/index.js +51 -0
  569. package/dist/op/lifecycle-receipt-store.js +45 -0
  570. package/dist/op/local-executor.js +1164 -0
  571. package/dist/op/local-output.js +140 -0
  572. package/dist/op/op-ir.js +317 -0
  573. package/dist/op/op-verb-class.js +131 -0
  574. package/dist/op/op-waves-notify.js +136 -0
  575. package/dist/op/op-waves-run.js +1657 -0
  576. package/dist/op/op-waves.js +409 -0
  577. package/dist/op/operator.js +743 -0
  578. package/dist/op/receipt-store.js +94 -0
  579. package/dist/op/resource.js +23 -0
  580. package/dist/op/run-context.js +28 -0
  581. package/dist/op/run-live.js +256 -0
  582. package/dist/op/runtime.js +21 -0
  583. package/dist/op/runtimes/local.js +195 -0
  584. package/dist/op/source-archive.js +131 -0
  585. package/dist/op/step-output-ref.js +397 -0
  586. package/dist/op/steward-beside.js +169 -0
  587. package/dist/op/steward-points.js +138 -0
  588. package/dist/op/steward-turn.js +59 -0
  589. package/dist/op/steward.js +317 -0
  590. package/dist/op/types.js +25 -0
  591. package/dist/op/work-lease-decl.js +81 -0
  592. package/dist/op/work-lease-run.js +393 -0
  593. package/dist/override-gate.js +284 -0
  594. package/dist/owner-chain.js +74 -0
  595. package/dist/ownership.js +92 -0
  596. package/dist/params.js +61 -0
  597. package/dist/plan-summary.js +711 -0
  598. package/dist/point-decision.js +211 -0
  599. package/dist/pr-forge.js +810 -0
  600. package/dist/pr-loop.js +203 -0
  601. package/dist/project-codegen.js +191 -0
  602. package/dist/project-root.js +74 -0
  603. package/dist/project-validation.js +50 -0
  604. package/dist/provenance.js +157 -0
  605. package/dist/pseudo-parameter.js +40 -0
  606. package/dist/reconcile.js +450 -0
  607. package/dist/resource-attributes.js +33 -0
  608. package/dist/runtime-adapter.js +77 -0
  609. package/dist/runtime.js +66 -0
  610. package/dist/secret-materialization.js +153 -0
  611. package/dist/secret-provenance.js +250 -0
  612. package/dist/serializer-walker.js +112 -0
  613. package/dist/serializer.js +1 -0
  614. package/dist/sort.js +45 -0
  615. package/dist/stack-output.js +115 -0
  616. package/dist/telemetry-attribution.js +149 -0
  617. package/dist/terraform/__fixtures__/build-graph.js +63 -0
  618. package/dist/terraform/adopt-state.js +40 -0
  619. package/dist/terraform/aws-resources.js +384 -0
  620. package/dist/terraform/bridge.js +204 -0
  621. package/dist/terraform/carve-provider.js +155 -0
  622. package/dist/terraform/carve.js +138 -0
  623. package/dist/terraform/data-source-shape.js +57 -0
  624. package/dist/terraform/emit-source.js +36 -0
  625. package/dist/terraform/excise.js +123 -0
  626. package/dist/terraform/graduate.js +128 -0
  627. package/dist/terraform/graph.js +435 -0
  628. package/dist/terraform/hcl2json.js +60 -0
  629. package/dist/terraform/manifest.js +149 -0
  630. package/dist/terraform/parse.js +81 -0
  631. package/dist/terraform/providers/aws.js +146 -0
  632. package/dist/terraform/providers/gcp.js +294 -0
  633. package/dist/terraform/providers/index.js +17 -0
  634. package/dist/terraform/providers/kubernetes.js +253 -0
  635. package/dist/terraform/score.js +151 -0
  636. package/dist/terraform/state.js +67 -0
  637. package/dist/terraform/tier-map.js +74 -0
  638. package/dist/terraform/types.js +13 -0
  639. package/dist/terraform/unified-diff.js +132 -0
  640. package/dist/testing.js +295 -0
  641. package/dist/toml-emit.js +153 -0
  642. package/dist/toml-parse.js +355 -0
  643. package/dist/toml-utils.js +60 -0
  644. package/dist/toml.js +428 -0
  645. package/dist/ts-loader.d.ts +46 -0
  646. package/dist/ts-loader.d.ts.map +1 -0
  647. package/dist/ts-loader.js +103 -0
  648. package/dist/types.js +1 -0
  649. package/dist/utils.js +61 -0
  650. package/dist/validation.js +20 -0
  651. package/dist/vendor/js-yaml-load.js +1662 -0
  652. package/dist/workspace/__fixtures__/contract-repo.js +103 -0
  653. package/dist/workspace/__fixtures__/decide-workspace.js +112 -0
  654. package/dist/workspace/__fixtures__/sessions.js +91 -0
  655. package/dist/workspace/__fixtures__/two-member-workspace.js +34 -0
  656. package/dist/workspace/agent-cli.js +99 -0
  657. package/dist/workspace/agent.schema.json +390 -0
  658. package/dist/workspace/answers-ledger.js +89 -0
  659. package/dist/workspace/box-cli.js +142 -0
  660. package/dist/workspace/box-factory-write.js +196 -0
  661. package/dist/workspace/box-factory-write.schema.json +342 -0
  662. package/dist/workspace/box-factory.js +88 -0
  663. package/dist/workspace/box-intent.js +126 -0
  664. package/dist/workspace/box-isolation.js +169 -0
  665. package/dist/workspace/box-listing-write.schema.json +204 -0
  666. package/dist/workspace/box-listing.js +298 -0
  667. package/dist/workspace/box-publish.js +352 -0
  668. package/dist/workspace/box-publish.schema.json +498 -0
  669. package/dist/workspace/box-services.js +39 -0
  670. package/dist/workspace/broker-protocol.js +359 -0
  671. package/dist/workspace/broker-protocol.schema.json +228 -0
  672. package/dist/workspace/change-set.schema.json +460 -0
  673. package/dist/workspace/changes-cli.js +56 -0
  674. package/dist/workspace/changes.js +446 -0
  675. package/dist/workspace/changes.schema.json +642 -0
  676. package/dist/workspace/chant-migrations/chud-lexicon-exit-fly-site.js +198 -0
  677. package/dist/workspace/chant-migrations/chud-lexicon-exit-live-names.js +155 -0
  678. package/dist/workspace/chant-migrations/chud-lexicon-exit-rollback.js +214 -0
  679. package/dist/workspace/chant-migrations/chud-lexicon-exit-ship-inputs.js +180 -0
  680. package/dist/workspace/chant-migrations/chud-lexicon-exit-ship-policy.js +99 -0
  681. package/dist/workspace/chant-migrations/chud-lexicon-exit.js +847 -0
  682. package/dist/workspace/chant-migrations.js +113 -0
  683. package/dist/workspace/check.schema.json +433 -0
  684. package/dist/workspace/checks/box-isolation.js +62 -0
  685. package/dist/workspace/checks/boxes.js +491 -0
  686. package/dist/workspace/checks/diagrams.js +104 -0
  687. package/dist/workspace/checks/generated.js +419 -0
  688. package/dist/workspace/checks/ledgers.js +212 -0
  689. package/dist/workspace/checks/links.js +191 -0
  690. package/dist/workspace/checks/live.js +100 -0
  691. package/dist/workspace/checks/pipelines.js +188 -0
  692. package/dist/workspace/checks/records.js +169 -0
  693. package/dist/workspace/checks.js +426 -0
  694. package/dist/workspace/ci-green-cli.js +125 -0
  695. package/dist/workspace/ci-green-forge.js +83 -0
  696. package/dist/workspace/ci-green-workflow.js +199 -0
  697. package/dist/workspace/ci-green.js +325 -0
  698. package/dist/workspace/ci-last-green.schema.json +158 -0
  699. package/dist/workspace/compose-graph.js +235 -0
  700. package/dist/workspace/compose-reports.js +146 -0
  701. package/dist/workspace/composites.js +264 -0
  702. package/dist/workspace/composites.schema.json +617 -0
  703. package/dist/workspace/conformance/__fixture__/app/package.json +7 -0
  704. package/dist/workspace/conformance/__fixture__/app/src/server.mjs +29 -0
  705. package/dist/workspace/conformance/__fixture__/decisions/decision.kind.mjs +54 -0
  706. package/dist/workspace/conformance/__fixture__/decisions/decision.schema.json +512 -0
  707. package/dist/workspace/conformance/__fixture__/decisions/fix-001-how-the-app-is-deployed.md +40 -0
  708. package/dist/workspace/conformance/__fixture__/delivery/chant.config.ts +7 -0
  709. package/dist/workspace/conformance/__fixture__/delivery/lexicon/index.ts +26 -0
  710. package/dist/workspace/conformance/__fixture__/delivery/package.json +7 -0
  711. package/dist/workspace/conformance/__fixture__/delivery/src/app.component.ts +14 -0
  712. package/dist/workspace/conformance/__fixture__/delivery/src/app.ts +4 -0
  713. package/dist/workspace/conformance/__fixtures__/reference-broker.js +205 -0
  714. package/dist/workspace/conformance/__writer_fixture__/answers/answer.kind.mjs +32 -0
  715. package/dist/workspace/conformance/__writer_fixture__/answers/answer.schema.json +135 -0
  716. package/dist/workspace/conformance/__writer_fixture__/contracts/contract.kind.mjs +37 -0
  717. package/dist/workspace/conformance/__writer_fixture__/contracts/contract.schema.json +213 -0
  718. package/dist/workspace/conformance/__writer_fixture__/decisions/points.json +228 -0
  719. package/dist/workspace/conformance/__writer_fixture__/drivers/driver.kind.mjs +15 -0
  720. package/dist/workspace/conformance/__writer_fixture__/drivers/driver.schema.json +38 -0
  721. package/dist/workspace/conformance/__writer_fixture__/sessions/session.kind.mjs +54 -0
  722. package/dist/workspace/conformance/__writer_fixture__/sessions/session.schema.json +289 -0
  723. package/dist/workspace/conformance/__writer_fixture__/work/W-001-the-writer-suite-works-this-item.md +25 -0
  724. package/dist/workspace/conformance/__writer_fixture__/work/work.kind.mjs +60 -0
  725. package/dist/workspace/conformance/__writer_fixture__/work/work.schema.json +603 -0
  726. package/dist/workspace/conformance/broker.js +736 -0
  727. package/dist/workspace/conformance/index.js +673 -0
  728. package/dist/workspace/conformance/vitest.js +108 -0
  729. package/dist/workspace/conformance/writer.js +1080 -0
  730. package/dist/workspace/decide.js +879 -0
  731. package/dist/workspace/decision-points.schema.json +135 -135
  732. package/dist/workspace/declaration-write-cli.js +74 -0
  733. package/dist/workspace/declaration-write.js +238 -0
  734. package/dist/workspace/declaration.js +938 -0
  735. package/dist/workspace/declaration.schema.json +1413 -1413
  736. package/dist/workspace/declared-kinds.js +106 -0
  737. package/dist/workspace/environments.js +164 -0
  738. package/dist/workspace/evidence.schema.json +279 -0
  739. package/dist/workspace/export-cli.js +185 -0
  740. package/dist/workspace/export.js +499 -0
  741. package/dist/workspace/factory-rules.js +175 -0
  742. package/dist/workspace/generated-files.js +92 -0
  743. package/dist/workspace/glob.js +45 -0
  744. package/dist/workspace/graph-cache.js +352 -0
  745. package/dist/workspace/graph-cli.js +348 -0
  746. package/dist/workspace/graph.schema.json +1338 -0
  747. package/dist/workspace/identity-gate-rule.js +75 -0
  748. package/dist/workspace/identity.js +126 -0
  749. package/dist/workspace/import.js +283 -0
  750. package/dist/workspace/init.js +620 -0
  751. package/dist/workspace/intent-cli.js +263 -0
  752. package/dist/workspace/intent-joins.js +201 -0
  753. package/dist/workspace/intent-record.js +352 -0
  754. package/dist/workspace/intent-record.schema.json +864 -0
  755. package/dist/workspace/intent.js +1582 -0
  756. package/dist/workspace/intent.schema.json +2420 -0
  757. package/dist/workspace/json-edit.js +221 -0
  758. package/dist/workspace/jsonc.js +235 -0
  759. package/dist/workspace/kind-readers.js +103 -0
  760. package/dist/workspace/kinds.js +587 -0
  761. package/dist/workspace/lexicon-symbols.js +112 -0
  762. package/dist/workspace/lineage-adopt-cli.js +102 -0
  763. package/dist/workspace/lineage-adopt.js +360 -0
  764. package/dist/workspace/lineage-check.js +282 -0
  765. package/dist/workspace/lineage-cli.js +121 -0
  766. package/dist/workspace/lineage-hash-index.js +284 -0
  767. package/dist/workspace/lineage-init.js +507 -0
  768. package/dist/workspace/lineage-lock.js +387 -0
  769. package/dist/workspace/lineage-merge.js +45 -0
  770. package/dist/workspace/lineage-migrations.d.ts.map +1 -1
  771. package/dist/workspace/lineage-migrations.js +329 -0
  772. package/dist/workspace/lineage-provenance.js +36 -0
  773. package/dist/workspace/lineage-update.js +138 -0
  774. package/dist/workspace/lineage-upgrade-cli.js +131 -0
  775. package/dist/workspace/lineage-upgrade.js +889 -0
  776. package/dist/workspace/lineage-vendor.js +171 -0
  777. package/dist/workspace/lineage-version.js +128 -0
  778. package/dist/workspace/lineage-versions.js +275 -0
  779. package/dist/workspace/links.js +330 -0
  780. package/dist/workspace/ls-generated.js +95 -0
  781. package/dist/workspace/ls.js +277 -0
  782. package/dist/workspace/ls.schema.json +333 -0
  783. package/dist/workspace/member-commands.js +508 -0
  784. package/dist/workspace/member-handles.js +216 -0
  785. package/dist/workspace/member-pipeline.js +258 -0
  786. package/dist/workspace/member-run.js +117 -0
  787. package/dist/workspace/member-write.schema.json +193 -0
  788. package/dist/workspace/nested-graph.js +156 -0
  789. package/dist/workspace/nesting.js +38 -0
  790. package/dist/workspace/patch.js +301 -0
  791. package/dist/workspace/patch.schema.json +321 -0
  792. package/dist/workspace/pin-cli.js +55 -0
  793. package/dist/workspace/pin-integrity.js +100 -0
  794. package/dist/workspace/plan-summary.schema.json +155 -0
  795. package/dist/workspace/point-answer.schema.json +129 -129
  796. package/dist/workspace/points-cli.js +291 -0
  797. package/dist/workspace/points-write.schema.json +660 -0
  798. package/dist/workspace/points.js +521 -0
  799. package/dist/workspace/points.schema.json +916 -0
  800. package/dist/workspace/pr-report.schema.json +108 -0
  801. package/dist/workspace/principal-classes.js +245 -0
  802. package/dist/workspace/reason-codes.js +326 -0
  803. package/dist/workspace/record-assets.js +151 -0
  804. package/dist/workspace/record-decided.js +105 -0
  805. package/dist/workspace/record-sessions.js +96 -0
  806. package/dist/workspace/record-source.js +114 -0
  807. package/dist/workspace/records-amend.schema.json +284 -0
  808. package/dist/workspace/records-checkout.js +76 -0
  809. package/dist/workspace/records-cli.js +707 -0
  810. package/dist/workspace/records-close.js +116 -0
  811. package/dist/workspace/records-close.schema.json +278 -0
  812. package/dist/workspace/records-new.schema.json +202 -0
  813. package/dist/workspace/records-review.schema.json +367 -0
  814. package/dist/workspace/records-since.js +317 -0
  815. package/dist/workspace/records-since.schema.json +218 -0
  816. package/dist/workspace/records-write.js +1229 -0
  817. package/dist/workspace/records.js +1345 -0
  818. package/dist/workspace/records.schema.json +604 -0
  819. package/dist/workspace/reference-kinds/app/package.json +10 -0
  820. package/dist/workspace/reference-kinds/app/workspace-kinds.json +45 -0
  821. package/dist/workspace/returns.js +303 -0
  822. package/dist/workspace/root-refusal.js +75 -0
  823. package/dist/workspace/run-statement.schema.json +622 -0
  824. package/dist/workspace/runs-cli.js +584 -0
  825. package/dist/workspace/runs-write.schema.json +994 -0
  826. package/dist/workspace/runs.js +708 -0
  827. package/dist/workspace/runs.schema.json +1257 -0
  828. package/dist/workspace/runtimes.js +76 -0
  829. package/dist/workspace/session-kinds.js +83 -0
  830. package/dist/workspace/signers.schema.json +206 -0
  831. package/dist/workspace/source-block.js +125 -0
  832. package/dist/workspace/squash.js +177 -0
  833. package/dist/workspace/status-gates.js +162 -0
  834. package/dist/workspace/status-stewards.js +330 -0
  835. package/dist/workspace/status.js +514 -0
  836. package/dist/workspace/status.schema.json +998 -0
  837. package/dist/workspace/steward-index.js +191 -0
  838. package/dist/workspace/symbols.js +188 -0
  839. package/dist/workspace/template-manifest.js +227 -0
  840. package/dist/workspace/template-pins.js +115 -0
  841. package/dist/workspace/trailer-joins.js +65 -0
  842. package/dist/workspace/trailers.js +111 -0
  843. package/dist/workspace/tree.js +136 -0
  844. package/dist/workspace/trust/attestor.js +63 -0
  845. package/dist/workspace/trust/dsse.js +108 -0
  846. package/dist/workspace/trust/evidence-cli.js +175 -0
  847. package/dist/workspace/trust/evidence.js +161 -0
  848. package/dist/workspace/trust/gate-seal.js +226 -0
  849. package/dist/workspace/trust/policy.js +190 -0
  850. package/dist/workspace/trust/provenance.js +180 -0
  851. package/dist/workspace/trust/rotation.js +298 -0
  852. package/dist/workspace/trust/run-commits.js +101 -0
  853. package/dist/workspace/trust/run-statement.js +182 -0
  854. package/dist/workspace/trust/seal.js +272 -0
  855. package/dist/workspace/trust/signers-cli.js +152 -0
  856. package/dist/workspace/trust/ssh-commit.js +178 -0
  857. package/dist/workspace/trust/test-repo.js +118 -0
  858. package/dist/workspace/trust/trust-files.js +193 -0
  859. package/dist/workspace/trust/verify-cli.js +63 -0
  860. package/dist/workspace/trust/verify.js +192 -0
  861. package/dist/workspace/which-chant.js +141 -0
  862. package/dist/workspace/wip-cli.js +95 -0
  863. package/dist/workspace/wip-write.schema.json +504 -0
  864. package/dist/workspace/wip.js +631 -0
  865. package/dist/workspace/wip.schema.json +334 -0
  866. package/dist/workspace/work-cli.js +448 -0
  867. package/dist/workspace/work-evidence.js +122 -0
  868. package/dist/workspace/work-evidence.schema.json +222 -0
  869. package/dist/workspace/work-history.schema.json +421 -0
  870. package/dist/workspace/work-lease.schema.json +246 -0
  871. package/dist/workspace/work-size.js +77 -0
  872. package/dist/workspace/work.js +283 -0
  873. package/dist/workspace/workspace-kinds.schema.json +259 -259
  874. package/dist/workspace/workspace-principals.schema.json +53 -53
  875. package/dist/workspace/write-lock-cli.js +105 -0
  876. package/dist/workspace/write-lock.js +424 -0
  877. package/dist/workspace/write-lock.schema.json +172 -0
  878. package/dist/workspace/write-scope.js +484 -0
  879. package/dist/yaml.js +459 -0
  880. package/package.json +2 -2
  881. package/src/cli/commands/check-lexicon-plugin.ts +2 -0
  882. package/src/cli/commands/lint.ts +3 -0
  883. package/src/cli/commands/migrate.ts +2 -0
  884. package/src/cli/compiled-cli.e2e.test.ts +165 -0
  885. package/src/cli/main.ts +121 -27
  886. package/src/cli/mcp/workspace-tools.ts +1 -1
  887. package/src/codegen/pinned-upgrade.ts +2 -0
  888. package/src/components/discover.ts +2 -0
  889. package/src/components/sandbox/driver.ts +3 -1
  890. package/src/config-import.ts +3 -0
  891. package/src/discovery/fold-import.ts +23 -14
  892. package/src/discovery/import.ts +2 -0
  893. package/src/discovery/sandbox/driver.ts +3 -1
  894. package/src/lexicon-module.ts +3 -0
  895. package/src/lint/config.ts +1 -1
  896. package/src/lint/discover.ts +28 -8
  897. package/src/lint/policy-import.ts +4 -1
  898. package/src/lint/rule-loader.ts +2 -0
  899. package/src/op/discover.ts +3 -0
  900. package/src/ts-loader.test.ts +23 -0
  901. package/src/ts-loader.ts +122 -0
  902. package/src/workspace/chant-migrations/chud-lexicon-exit.ts +1 -1
  903. package/src/workspace/declaration.ts +1 -1
  904. package/src/workspace/kinds.ts +1 -1
  905. package/src/workspace/lineage-migrations.ts +2 -0
  906. package/src/workspace/points.ts +1 -1
  907. package/src/workspace/principal-classes.ts +1 -1
@@ -0,0 +1,591 @@
1
+ /**
2
+ * The factory reference Op's activities (#3406, ws-087): the rules of
3
+ * `../../workspace/factory-rules.ts` run against a workspace, and the two
4
+ * places an orchestrator's execution plugs in, the builder and the check, run
5
+ * as commands in the run's worktree.
6
+ *
7
+ * factoryPick which work items are buildable now, in order (the lease claims the first free one)
8
+ * factoryAsk the leased item's tier and, for an ask, the understand answer, through `decide`
9
+ * factoryBuild the builder hook, in the worktree, unless understand said not to build
10
+ * factoryCheck the check hook (or the box's `factory.check`), with its evidence on each criterion
11
+ * factoryRecord the outcome: done (amended, proposals added, committed with chant's trailers),
12
+ * dropped (committed), redraft or ask (nothing), or not_done (kept by the run)
13
+ *
14
+ * `factoryOp` in `../factory.ts` declares them in that order. An open
15
+ * question in `factoryAsk` stops the run waiting, as `decide` does.
16
+ *
17
+ * Commands run with no shell, split as `box publish` splits a publisher, and
18
+ * asynchronously, so the lease heartbeat keeps running while a builder works.
19
+ */
20
+ import { spawn } from "node:child_process";
21
+ import { mkdirSync, realpathSync, writeFileSync } from "node:fs";
22
+ import { dirname, join, relative, resolve, sep } from "node:path";
23
+ import { liveRunEnv } from "../run-live.js";
24
+ /** Whether the declared kind file `file` is the one `kind` names, as a path from `cwd` (such as ../work/work.kind.mjs) or a trailing part of it. */
25
+ function sameKind(file, kind, cwd) {
26
+ const real = (p) => {
27
+ try {
28
+ return realpathSync(p);
29
+ }
30
+ catch {
31
+ return p;
32
+ }
33
+ };
34
+ return real(resolve(cwd, kind)) === real(file) || file.endsWith(kind.replace(/^(\.\.?\/)+/, ""));
35
+ }
36
+ /** The work kind's items and the box's intent, read through the read contract. */
37
+ /** The contract an item's own field names, when the kind links no contract kind: its state is unknown to chant. */
38
+ function contractField(data, field) {
39
+ const value = data?.[field ?? "contract"];
40
+ return typeof value === "string" && value.trim() !== "" ? { id: value.trim(), state: null } : null;
41
+ }
42
+ async function readWork(cwd, kind) {
43
+ const { declaredKindFiles, queryDeclaredRecords } = await import("../../workspace/records-cli.js");
44
+ const { loadRecordKind } = await import("../../workspace/records.js");
45
+ const files = declaredKindFiles(cwd);
46
+ const set = await queryDeclaredRecords(files, { cwd });
47
+ let found;
48
+ const decisionStates = new Map();
49
+ for (const [i, doc] of set.kinds.entries()) {
50
+ if ("error" in doc)
51
+ continue;
52
+ const loaded = await loadRecordKind(files[i].file, cwd);
53
+ if (!loaded.kind.work) {
54
+ for (const r of doc.records)
55
+ if (r.id)
56
+ decisionStates.set(r.id, { state: r.state, rank: r.state ? (loaded.kind.approval?.[r.state] ?? 0) : 0 });
57
+ continue;
58
+ }
59
+ if (found || (kind !== undefined && !sameKind(files[i].file, kind, cwd)))
60
+ continue;
61
+ const work = loaded.kind.work;
62
+ const states = loaded.kind.states ?? [];
63
+ const items = new Map();
64
+ for (const r of doc.records) {
65
+ if (r.id === null)
66
+ continue;
67
+ const data = r.data;
68
+ const tier = work.tier ? data?.[work.tier.field] : undefined;
69
+ items.set(r.id, {
70
+ id: r.id,
71
+ path: r.path,
72
+ state: r.state,
73
+ openState: work.open,
74
+ proposedState: states[0] !== undefined && states[0] !== work.open ? states[0] : null,
75
+ ready: r.ready ?? false,
76
+ data,
77
+ tier: typeof tier === "string" ? tier : null,
78
+ // The kind's contract link, else the item's own contract field (#3503): a kind whose contracts aren't
79
+ // a chant record kind yet, such as studio's markdown contracts, still names the contract an item builds.
80
+ contract: r.contract ?? contractField(data, work.contract?.field),
81
+ warnings: r.warnings.map((w) => w.code),
82
+ answers: (r.answers ?? []).map((a) => ({ id: a.id, point: a.point, state: a.state, answer: a.answer })),
83
+ leased: !!r.lease,
84
+ acceptance: (r.acceptance?.criteria ?? []).map((c) => ({ id: c.id, verification: c.verification, met: c.met })),
85
+ });
86
+ }
87
+ found = { kindFile: files[i].file, kindName: loaded.kind.name, work, states, stateField: loaded.kind.stateField ?? "state", items, intentDecided: null };
88
+ }
89
+ if (!found)
90
+ throw new Error("the factory reads a work kind, and the declaration names none");
91
+ // The box's intent (#2850): while the decision a box block names is not approved, nothing is picked.
92
+ const { readDeclaration } = await import("../../workspace/declaration.js");
93
+ const { locateWorkspace } = await import("../../workspace/which-chant.js");
94
+ const intents = readDeclaration(locateWorkspace(cwd).tree).members.map((m) => m.box?.intent).filter((x) => typeof x === "string");
95
+ if (intents.length > 0)
96
+ found.intentDecided = intents.every((id) => (decisionStates.get(id)?.rank ?? 0) > 0);
97
+ return found;
98
+ }
99
+ async function gitOut(args, cwd) {
100
+ const r = await run(["git", ...args], cwd, {});
101
+ return { ok: r.code === 0, out: r.stdout.trim() };
102
+ }
103
+ /**
104
+ * A record path from the repository's top: records --json reports paths from
105
+ * the repository root, but outside the process's own directory that report can
106
+ * come back relative to the process instead, so it is resolved and made relative again.
107
+ */
108
+ async function fromTop(cwd, path) {
109
+ if (!path.startsWith("../"))
110
+ return path;
111
+ const top = (await gitOut(["rev-parse", "--show-toplevel"], cwd)).out;
112
+ try {
113
+ return relative(realpathSync(top), realpathSync(resolve(process.cwd(), path))).split(sep).join("/");
114
+ }
115
+ catch {
116
+ return path;
117
+ }
118
+ }
119
+ /** The item as its work branch holds it: the state there, and whether the branch is in HEAD. Null when there is no branch. */
120
+ async function branchState(cwd, id, path) {
121
+ const ref = `refs/heads/chant/work/${id}`;
122
+ if (!(await gitOut(["rev-parse", "--verify", "-q", ref], cwd)).ok)
123
+ return null;
124
+ const shown = await gitOut(["show", `${ref}:${await fromTop(cwd, path)}`], cwd);
125
+ let state = null;
126
+ if (shown.ok) {
127
+ const { parseFrontMatter } = await import("../../workspace/records.js");
128
+ const fm = parseFrontMatter(shown.out);
129
+ if (fm.ok && typeof fm.value.state === "string")
130
+ state = fm.value.state;
131
+ }
132
+ const applied = (await gitOut(["merge-base", "--is-ancestor", ref, "HEAD"], cwd)).ok;
133
+ return { state, applied };
134
+ }
135
+ /** The points the workspace declares, by name, or an empty set when it declares none. */
136
+ async function declaredPoints(cwd) {
137
+ try {
138
+ const { workspacePoints } = await import("../../workspace/points-cli.js");
139
+ const doc = await workspacePoints({ cwd });
140
+ return "error" in doc ? new Set() : new Set(doc.points.map((p) => p.name));
141
+ }
142
+ catch {
143
+ return new Set();
144
+ }
145
+ }
146
+ /** The question a point would ask about the item as it is now, without writing anything; null when it can't be read. */
147
+ async function dryQuestion(cwd, point, id) {
148
+ try {
149
+ const { workspacePoints } = await import("../../workspace/points-cli.js");
150
+ const doc = await workspacePoints({ cwd });
151
+ if ("error" in doc)
152
+ return null;
153
+ const p = doc.points.find((x) => x.name === point);
154
+ if (!p)
155
+ return null;
156
+ const { readInputs } = await import("../decide-read-inputs.js");
157
+ const { inputs } = await readInputs(p.inputs.map((i) => i.name), { "work-item": id }, cwd);
158
+ const { askPoint } = await import("../../workspace/decide.js");
159
+ const out = await askPoint({ cwd, point, inputs, subject: id, dryRun: true });
160
+ // Only a question already asked holds an item: one nobody asked yet is what the run asks.
161
+ if ("error" in out || !out.reused)
162
+ return null;
163
+ return { state: out.question.state, answer: out.question.answer };
164
+ }
165
+ catch {
166
+ return null;
167
+ }
168
+ }
169
+ async function contextFor(cwd, item, intentDecided, points) {
170
+ const { workHistory } = await import("../../workspace/work-cli.js");
171
+ const h = await workHistory({ id: item.id, cwd });
172
+ const claims = "error" in h ? [] : h.claims.map((c) => ({ token: c.token, ended: c.ended, outcome: c.release?.outcome ?? null, attempt: c.attempt }));
173
+ const attempts = "error" in h ? { exhausted: false } : { exhausted: h.attempts.exhausted };
174
+ const { isAsk, TIER_POINT, UNDERSTAND_POINT } = await import("../../workspace/factory-rules.js");
175
+ return {
176
+ intentDecided,
177
+ claims,
178
+ attempts,
179
+ branch: await branchState(cwd, item.id, item.path),
180
+ questions: {
181
+ tier: item.tier === null && points.has(TIER_POINT) ? await dryQuestion(cwd, TIER_POINT, item.id) : null,
182
+ understand: isAsk(item.data) && points.has(UNDERSTAND_POINT) ? await dryQuestion(cwd, UNDERSTAND_POINT, item.id) : null,
183
+ },
184
+ };
185
+ }
186
+ /** Run argv in cwd, without a shell, asynchronously. */
187
+ function run(argv, cwd, env) {
188
+ return new Promise((settle) => {
189
+ // The run's activity file, as a shell step gets it, so a builder's lines reach its in-flight record (#3637).
190
+ const child = spawn(argv[0], argv.slice(1), { cwd, env: { ...process.env, ...liveRunEnv(), ...env }, stdio: ["ignore", "pipe", "pipe"] });
191
+ let stdout = "";
192
+ let stderr = "";
193
+ child.stdout.on("data", (b) => (stdout += b.toString("utf8")));
194
+ // A hook's stderr is its log: it goes to the run's log as it comes, as a shell step's does.
195
+ child.stderr.on("data", (b) => {
196
+ stderr += b.toString("utf8");
197
+ process.stderr.write(b);
198
+ });
199
+ child.on("error", (err) => settle({ code: null, stdout, stderr: `${stderr}${err.message}` }));
200
+ child.on("close", (code) => settle({ code, stdout, stderr }));
201
+ });
202
+ }
203
+ /** The last line of `stdout` that is a JSON object, or null. */
204
+ function lastJson(stdout) {
205
+ const lines = stdout.split("\n").map((l) => l.trim()).filter(Boolean);
206
+ for (let i = lines.length - 1; i >= 0; i--) {
207
+ try {
208
+ const v = JSON.parse(lines[i]);
209
+ if (v !== null && typeof v === "object" && !Array.isArray(v))
210
+ return v;
211
+ }
212
+ catch {
213
+ // Not this line.
214
+ }
215
+ }
216
+ return null;
217
+ }
218
+ /**
219
+ * Start the build from the checkout's HEAD (#382). A branch behind HEAD moves up to it; one with
220
+ * commits HEAD doesn't have, such as work an earlier run left under a lease it lost, has them kept
221
+ * at refs/chant/kept/<item>/earlier-<commit> first, so no attempt builds on another's work unasked.
222
+ */
223
+ async function freshStart(cwd, worktree, id) {
224
+ const head = (await gitOut(["rev-parse", "HEAD"], await checkoutRoot(cwd))).out;
225
+ const tip = (await gitOut(["rev-parse", "HEAD"], worktree)).out;
226
+ if (!head || !tip || head === tip)
227
+ return;
228
+ if (!(await gitOut(["merge-base", "--is-ancestor", tip, head], worktree)).ok) {
229
+ await gitOut(["update-ref", `refs/chant/kept/${id}/earlier-${tip.slice(0, 12)}`, tip], worktree);
230
+ }
231
+ await gitOut(["reset", "-q", "--hard", head], worktree);
232
+ }
233
+ /**
234
+ * The checkout's copy of the item, carried into the worktree when the worktree's differs or is missing
235
+ * (#382): an item written in the checkout and not committed yet, such as the box's first build, or an
236
+ * ask its author rewrote, is the one the run builds, as the points were asked about it.
237
+ */
238
+ async function carryItem(cwd, worktree, id) {
239
+ const { copyFileSync, existsSync, readFileSync } = await import("node:fs");
240
+ const there = (await readWork(cwd)).items.get(id);
241
+ if (!there)
242
+ return;
243
+ const checkout = await checkoutRoot(cwd);
244
+ const rel = await fromTop(cwd, there.path);
245
+ const from = join(checkout, ...rel.split("/"));
246
+ const to = join(worktree, ...rel.split("/"));
247
+ if (!existsSync(from))
248
+ return;
249
+ if (existsSync(to) && readFileSync(to).equals(readFileSync(from)))
250
+ return;
251
+ mkdirSync(dirname(to), { recursive: true });
252
+ copyFileSync(from, to);
253
+ }
254
+ async function words(command) {
255
+ const { splitCommand } = await import("../../workspace/box-publish.js");
256
+ return splitCommand(command);
257
+ }
258
+ function leaseOf(lease, step) {
259
+ if (!lease || typeof lease.item !== "string" || typeof lease.token !== "string")
260
+ throw new Error(`${step} runs under the factory Op's work lease: pass workLeaseOutput() as lease`);
261
+ if (!lease.worktree)
262
+ throw new Error(`${step} needs the run's worktree: the factory Op changes the checkout, so its lease makes one`);
263
+ return lease;
264
+ }
265
+ const today = () => new Date().toISOString().slice(0, 10);
266
+ /** Amend `id` in `cwd` through chant, refusing on any write error. */
267
+ async function amend(cwd, kindFile, id, fields) {
268
+ const { amendRecord } = await import("../../workspace/records-write.js");
269
+ const doc = await amendRecord({ kind: kindFile, id, fields: JSON.stringify(fields), cwd });
270
+ if ("error" in doc)
271
+ throw new Error(`the factory could not amend ${id}: ${doc.error.code}: ${doc.error.message}`);
272
+ }
273
+ /** The kind file as seen from the worktree: the same path under the worktree when it sits in the checkout. */
274
+ function inWorktree(kindFile, checkout, worktree) {
275
+ const real = (p) => {
276
+ try {
277
+ return realpathSync(p);
278
+ }
279
+ catch {
280
+ return p;
281
+ }
282
+ };
283
+ const [file, top, tree] = [real(kindFile), real(checkout), real(worktree)];
284
+ // Read from the worktree already (it sits under the checkout's .git), or outside the checkout: as it is.
285
+ if (file.startsWith(`${tree}/`) || !file.startsWith(`${top}/`))
286
+ return file;
287
+ return join(tree, file.slice(top.length + 1));
288
+ }
289
+ async function checkoutRoot(cwd) {
290
+ return (await gitOut(["rev-parse", "--show-toplevel"], cwd)).out || cwd;
291
+ }
292
+ /** Commit everything in the worktree with chant's trailers (ws-075). Null when there was nothing to commit. */
293
+ async function commitAll(worktree, subject, item, kindName, token, runId, extra = {}) {
294
+ await gitOut(["add", "-A"], worktree);
295
+ if ((await gitOut(["diff", "--cached", "--quiet"], worktree)).ok)
296
+ return null;
297
+ const { formatChantTrailers } = await import("../../workspace/trailers.js");
298
+ const records = [`${kindName}:${item}`, ...(extra.records ?? []).filter((r) => r !== `${kindName}:${item}`)];
299
+ const trailers = formatChantTrailers({ ...(extra.agent ? { agent: extra.agent } : {}), lease: token, ...(runId ? { run: runId } : {}), records });
300
+ const r = await run(["git", "-c", "commit.gpgsign=false", "commit", "-q", "--no-verify", "-m", subject, ...(extra.body ? ["-m", extra.body] : []), "-m", trailers.join("\n")], worktree, {});
301
+ if (r.code !== 0)
302
+ throw new Error(`the factory could not commit ${item}: ${r.stderr.trim()}`);
303
+ return (await gitOut(["rev-parse", "HEAD"], worktree)).out;
304
+ }
305
+ // ── the activities ───────────────────────────────────────────────────────────
306
+ /** Which work items are buildable now (#3406 rule 1): those that name a contract, asks and intent builds (#3503). */
307
+ export async function factoryPick(args = {}) {
308
+ const cwd = args.cwd ?? process.cwd();
309
+ const { pickable, readyKey } = await import("../../workspace/factory-rules.js");
310
+ const w = await readWork(cwd, args.kind);
311
+ const points = await declaredPoints(cwd);
312
+ const out = { candidates: [], held: [], keys: [] };
313
+ for (const item of w.items.values()) {
314
+ if (item.state !== null && item.state !== item.openState && item.state !== item.proposedState)
315
+ continue;
316
+ const ctx = await contextFor(cwd, item, w.intentDecided, points);
317
+ const verdict = pickable(item, ctx);
318
+ if (verdict.ok) {
319
+ out.candidates.push(item.id);
320
+ out.keys.push(readyKey(item, ctx, item.data));
321
+ }
322
+ else {
323
+ out.held.push({ item: item.id, hold: verdict.hold, message: verdict.message });
324
+ // Said in the run's log too, so whoever reads why nothing was built sees it.
325
+ console.error(`factoryPick: skipped ${item.id}: ${verdict.message}`);
326
+ }
327
+ }
328
+ return out;
329
+ }
330
+ /**
331
+ * The steward's ready step for the factory Op (#382, `factoryReady` in ../factory.ts): one key per
332
+ * buildable item, naming the state it was read in, so a person's answer, a retry or a changed item
333
+ * starts a run and the same state does not start another. Only reads.
334
+ */
335
+ export async function factoryReady(args = {}) {
336
+ const cwd = args.cwd ?? process.cwd();
337
+ const keys = (await factoryPick({ cwd, ...(args.kind !== undefined ? { kind: args.kind } : {}) })).keys;
338
+ if (args.also) {
339
+ const r = await run(await words(args.also), cwd, {});
340
+ if (r.code !== 0)
341
+ throw new Error(`factoryReady: ${args.also} exited ${r.code}: ${r.stderr.trim().split("\n").slice(-3).join(" ")}`);
342
+ let more;
343
+ try {
344
+ more = JSON.parse(r.stdout.trim().split("\n").pop() ?? "[]");
345
+ }
346
+ catch {
347
+ throw new Error(`factoryReady: ${args.also} printed no JSON list on its last line`);
348
+ }
349
+ if (!Array.isArray(more))
350
+ throw new Error(`factoryReady: ${args.also} printed no JSON list on its last line`);
351
+ for (const k of more)
352
+ keys.push(typeof k === "string" ? k : JSON.stringify(k));
353
+ }
354
+ return keys;
355
+ }
356
+ /** The leased item's tier and understand answer (#3406 rules 2 and 3). An open question stops the run waiting. */
357
+ export async function factoryAsk(args) {
358
+ const cwd = args.cwd ?? process.cwd();
359
+ if (!args.lease?.item)
360
+ throw new Error("factoryAsk runs under the factory Op's work lease: pass workLeaseOutput() as lease");
361
+ const id = args.lease.item;
362
+ const { isAsk, understandOutcome, TIER_POINT, UNDERSTAND_POINT } = await import("../../workspace/factory-rules.js");
363
+ const w = await readWork(cwd, args.kind);
364
+ const item = w.items.get(id);
365
+ if (!item)
366
+ throw new Error(`no record of the work kind has id ${id}`);
367
+ const points = await declaredPoints(cwd);
368
+ const { decide } = await import("./decide.js");
369
+ const ask = isAsk(item.data);
370
+ let understand = null;
371
+ if (ask && points.has(UNDERSTAND_POINT))
372
+ understand = String((await decide({ point: UNDERSTAND_POINT, read: { "work-item": id }, subject: id, cwd, ...(args.backends ? { backends: args.backends } : {}) })).answer);
373
+ else if (ask)
374
+ understand = "proceed";
375
+ const outcome = understandOutcome(understand);
376
+ let tier = item.tier;
377
+ if (tier === null && outcome === null) {
378
+ tier = points.has(TIER_POINT) ? String((await decide({ point: TIER_POINT, read: { "work-item": id }, subject: id, cwd, ...(args.backends ? { backends: args.backends } : {}) })).answer) : (w.work.tier?.tiers[0] ?? "small");
379
+ }
380
+ return { item: id, ask, tier: tier ?? w.work.tier?.tiers[0] ?? "small", understand, outcome };
381
+ }
382
+ /** Run the builder hook in the worktree, unless understand said not to build (#3406). */
383
+ export async function factoryBuild(args) {
384
+ const lease = leaseOf(args.lease, "factoryBuild");
385
+ const cwd = args.cwd ?? process.cwd();
386
+ if (args.ask.outcome !== null) {
387
+ // Nothing is built, but Record still writes the item's outcome (dropped) in the worktree, so an ask
388
+ // that lives only in the checkout, as every ask written from a surface does, is carried there first.
389
+ await carryItem(cwd, lease.worktree, lease.item);
390
+ return { ran: false, finished: false, exitCode: null, reverted: [], note: `understand answered ${args.ask.understand}: nothing is built`, report: null };
391
+ }
392
+ // A kept ask opens before it is built: chant writes the state in the worktree, so it goes with the build.
393
+ await freshStart(cwd, lease.worktree, lease.item);
394
+ await carryItem(cwd, lease.worktree, lease.item);
395
+ const w = await readWork(lease.worktree);
396
+ const item = w.items.get(lease.item);
397
+ if (item && item.proposedState !== null && item.state === item.proposedState) {
398
+ await amend(lease.worktree, inWorktree(w.kindFile, await checkoutRoot(cwd), lease.worktree), lease.item, { [w.stateField]: item.openState });
399
+ }
400
+ // An ask's builder writes its plan as the item's acceptance criteria and changes nothing else in it
401
+ // (#3406, studio#382): the item is kept as it was before the builder ran, and put back if it changed.
402
+ const { isAsk } = await import("../../workspace/factory-rules.js");
403
+ const opened = (await readWork(lease.worktree)).items.get(lease.item);
404
+ const acceptance = w.work.acceptance?.field ?? "acceptance";
405
+ const guarded = opened && isAsk(opened.data) ? { path: join(lease.worktree, ...(await fromTop(lease.worktree, opened.path)).split("/")), rel: await fromTop(lease.worktree, opened.path), data: opened.data } : null;
406
+ const { readFileSync, writeFileSync: write } = await import("node:fs");
407
+ const bytes = guarded ? readFileSync(guarded.path) : null;
408
+ const r = await run(await words(args.builder), lease.worktree, {
409
+ FACTORY_ITEM: lease.item,
410
+ FACTORY_TIER: args.ask.tier,
411
+ FACTORY_TOKEN: lease.token,
412
+ FACTORY_HOLDER: lease.holder,
413
+ FACTORY_WORKTREE: lease.worktree,
414
+ ...(args.context ? { FACTORY_CONTEXT: args.context } : {}),
415
+ });
416
+ // The builder's report: `reverted` lists what its guard put back, and `ok: false` says it did not finish though it exited 0.
417
+ const report = lastJson(r.stdout);
418
+ const reverted = Array.isArray(report?.reverted) ? report.reverted.filter((x) => typeof x === "string") : [];
419
+ if (guarded && bytes) {
420
+ const now = (await readWork(lease.worktree)).items.get(lease.item);
421
+ const rest = (data) => Object.fromEntries(Object.entries(data ?? {}).filter(([k]) => k !== acceptance).sort(([a], [b]) => a.localeCompare(b)));
422
+ const before = rest(guarded.data);
423
+ const after = now ? rest(now.data) : null;
424
+ if (!after || JSON.stringify(after) !== JSON.stringify(before)) {
425
+ const changed = after ? [...new Set([...Object.keys(before), ...Object.keys(after)])].filter((k) => JSON.stringify(before[k]) !== JSON.stringify(after[k])) : [];
426
+ write(guarded.path, bytes);
427
+ reverted.push(`${guarded.rel} (${after ? `it changed ${changed.join(", ")}, and only ${acceptance} is the builder's` : "chant no longer reads it"})`);
428
+ }
429
+ }
430
+ const finished = r.code === 0 && report?.ok !== false;
431
+ const note = typeof report?.note === "string" ? report.note : finished ? "the builder finished" : r.code === 0 ? "the builder reported it did not finish" : `the builder exited ${r.code}: ${r.stderr.trim().split("\n").slice(-3).join(" ")}`;
432
+ return { ran: true, finished, exitCode: r.code, reverted, note, report };
433
+ }
434
+ /** Run the check and attach its result as evidence to each criterion the factory ticks (#3406 rule 5). */
435
+ export async function factoryCheck(args) {
436
+ const lease = leaseOf(args.lease, "factoryCheck");
437
+ // A build whose guard put changes back is not done whatever its check says, so it is not checked.
438
+ if (!args.build.ran || !args.build.finished || args.build.reverted.length > 0)
439
+ return { ran: false, ok: false, command: null, evidence: [], log: null, report: null };
440
+ let command = args.check ?? null;
441
+ if (command === null) {
442
+ const { readDeclaration } = await import("../../workspace/declaration.js");
443
+ const { locateWorkspace } = await import("../../workspace/which-chant.js");
444
+ command = readDeclaration(locateWorkspace(lease.worktree).tree).members.find((m) => m.box?.factory?.check)?.box?.factory?.check?.run ?? null;
445
+ }
446
+ if (command === null)
447
+ return { ran: false, ok: false, command: null, evidence: [], log: null, report: null };
448
+ const r = await run(await words(command), lease.worktree, {
449
+ FACTORY_ITEM: lease.item,
450
+ FACTORY_TOKEN: lease.token,
451
+ FACTORY_HOLDER: lease.holder,
452
+ FACTORY_WORKTREE: lease.worktree,
453
+ FACTORY_BUILD: JSON.stringify(args.build.report ?? {}),
454
+ });
455
+ // A check may report each criterion's own result as its last JSON line, { "criteria": { "AC-1": "pass", ... } }:
456
+ // then each criterion is ticked by its own result, and one it names no result for gets none.
457
+ const report = lastJson(r.stdout);
458
+ const ok = r.code === 0 && report?.ok !== false;
459
+ const per = report?.criteria && typeof report.criteria === "object" ? report.criteria : null;
460
+ const log = `.chant/factory/${lease.item}/check.log`;
461
+ const abs = join(lease.worktree, ...log.split("/"));
462
+ mkdirSync(dirname(abs), { recursive: true });
463
+ writeFileSync(abs, `$ ${command}\nexit ${r.code}\n\n${r.stdout}${r.stderr ? `\n--- stderr ---\n${r.stderr}` : ""}`);
464
+ const w = await readWork(lease.worktree);
465
+ const item = w.items.get(lease.item);
466
+ const evidence = [];
467
+ const { attachWorkEvidence } = await import("../../workspace/work-evidence.js");
468
+ for (const c of item?.acceptance ?? []) {
469
+ if (c.verification === "manual" || c.verification === "runtime")
470
+ continue;
471
+ const own = per ? per[c.id] : undefined;
472
+ if (per && own !== "pass" && own !== "fail")
473
+ continue;
474
+ const result = per ? own : ok ? "pass" : "fail";
475
+ const out = await attachWorkEvidence({ cwd: lease.worktree, item: lease.item, holder: lease.holder, token: lease.token, criterion: c.id, result, title: `factory check: ${command}`, path: log });
476
+ if (!("error" in out))
477
+ evidence.push(c.id);
478
+ }
479
+ return { ran: true, ok, command, evidence, log, report };
480
+ }
481
+ /** The decisions a done build proposes it implements, from the intent graph of each path it changed (studio#243). */
482
+ async function proposals(worktree, base, already) {
483
+ const { proposeImplements } = await import("../../workspace/factory-rules.js");
484
+ // What the build changed since the base, the files it added among them: they are untracked until Record commits.
485
+ const tracked = (await gitOut(["diff", "--name-only", base], worktree)).out.split("\n");
486
+ const added = (await gitOut(["ls-files", "--others", "--exclude-standard"], worktree)).out.split("\n");
487
+ const changed = [...new Set([...tracked, ...added])].filter((p) => p && !p.startsWith(".chant/")).sort();
488
+ const { intentGraph } = await import("../../workspace/intent.js");
489
+ const rows = [];
490
+ for (const path of changed.slice(0, 20)) {
491
+ const { doc } = await intentGraph({ cwd: worktree, region: path });
492
+ if ("error" in doc)
493
+ continue;
494
+ const decisions = new Map(doc.nodes.filter((n) => n.kind === "decision").map((n) => [n.id, n]));
495
+ const out = [];
496
+ for (const e of doc.edges) {
497
+ if (e.kind !== "constrains")
498
+ continue;
499
+ const d = decisions.get(e.from);
500
+ if (d)
501
+ out.push({ id: d.record, state: d.state, granularity: e.granularity ?? "" });
502
+ }
503
+ rows.push({ path, decisions: out });
504
+ }
505
+ return proposeImplements(rows, already);
506
+ }
507
+ /** Record the outcome on the item's branch and name it for the lease's release (#3406 rules 4 to 6, 8). */
508
+ export async function factoryRecord(args) {
509
+ const result = await recordOutcome(args);
510
+ if (args.after) {
511
+ const lease = leaseOf(args.lease, "factoryRecord");
512
+ const r = await run(await words(args.after), lease.worktree, {
513
+ FACTORY_ITEM: lease.item,
514
+ FACTORY_TOKEN: lease.token,
515
+ FACTORY_HOLDER: lease.holder,
516
+ FACTORY_WORKTREE: lease.worktree,
517
+ FACTORY_OUTCOME: result.outcome,
518
+ FACTORY_COMMIT: result.commit ?? "",
519
+ FACTORY_REASON: result.reason ?? "",
520
+ FACTORY_BUILD: JSON.stringify(args.build?.report ?? {}),
521
+ FACTORY_CHECK: JSON.stringify(args.check?.report ?? {}),
522
+ });
523
+ if (r.code !== 0)
524
+ console.error(`factoryRecord: the after hook exited ${r.code}: ${r.stderr.trim().split("\n").slice(-3).join(" ")}`);
525
+ }
526
+ return result;
527
+ }
528
+ /**
529
+ * What the hooks' reports add to the done commit's trailers (ws-075): `chantAgent`, the agent session
530
+ * a builder ran as, for Chant-Agent, and `records`, more `<kind>:<id>` records the build carries, such
531
+ * as the contract it built and the evidence its check wrote, from the builder's and the check's reports.
532
+ */
533
+ function trailerExtras(build, check) {
534
+ const records = [];
535
+ for (const r of [build?.records, check?.records])
536
+ if (Array.isArray(r))
537
+ for (const x of r)
538
+ if (typeof x === "string" && /^[a-z][a-z0-9-]*:[A-Za-z0-9][A-Za-z0-9._-]*$/.test(x) && !records.includes(x))
539
+ records.push(x);
540
+ const agent = typeof build?.chantAgent === "string" && build.chantAgent.trim() !== "" ? build.chantAgent.trim() : undefined;
541
+ return { ...(agent ? { agent } : {}), records };
542
+ }
543
+ /** The run id a builder's report names for the Chant-Run trailer: `run.id` or `run`, or undefined. */
544
+ function runIdOf(report) {
545
+ const r = report?.run;
546
+ if (typeof r === "string" && r !== "")
547
+ return r;
548
+ const id = r && typeof r === "object" ? r.id : undefined;
549
+ return typeof id === "string" && id !== "" ? id : undefined;
550
+ }
551
+ async function recordOutcome(args) {
552
+ const lease = leaseOf(args.lease, "factoryRecord");
553
+ const cwd = args.cwd ?? process.cwd();
554
+ const root = await checkoutRoot(cwd);
555
+ const w = await readWork(lease.worktree);
556
+ const kindFile = inWorktree(w.kindFile, root, lease.worktree);
557
+ const item = w.items.get(lease.item);
558
+ if (!item)
559
+ throw new Error(`no record of the work kind has id ${lease.item} in the worktree`);
560
+ const none = { commit: null, implementsProposed: [] };
561
+ if (args.ask.outcome === "redraft" || args.ask.outcome === "ask")
562
+ return { outcome: args.ask.outcome, reason: `understand answered ${args.ask.understand}`, ...none };
563
+ if (args.ask.outcome === "dropped") {
564
+ await amend(lease.worktree, kindFile, lease.item, { [w.stateField]: "dropped", [w.work.closedOn]: today() });
565
+ const commit = await commitAll(lease.worktree, `${lease.item}: dropped, the understand point refused it`, lease.item, w.kindName, lease.token);
566
+ return { outcome: "dropped", reason: "understand answered refuse", commit, implementsProposed: [] };
567
+ }
568
+ const { doneVerdict } = await import("../../workspace/factory-rules.js");
569
+ const verdict = doneVerdict(args.build, args.check, item.acceptance);
570
+ if (!verdict.done) {
571
+ // The attempt is committed with why it is not done and chant's trailers, so the kept attempt the run
572
+ // makes of it (refs/chant/kept/<item>/<token>) says so and joins to the item and the lease.
573
+ const kept = await commitAll(lease.worktree, `${lease.item}: not done`, lease.item, w.kindName, lease.token, runIdOf(args.build.report), {
574
+ ...trailerExtras(args.build.report, args.check.report),
575
+ body: `Not done: ${verdict.reason}`,
576
+ }).catch(() => null);
577
+ return { outcome: "not_done", reason: verdict.reason, commit: kept, implementsProposed: [] };
578
+ }
579
+ const base = (await gitOut(["merge-base", "HEAD", (await gitOut(["rev-parse", "HEAD"], root)).out], lease.worktree)).out;
580
+ const already = Array.isArray(item.data?.[w.work.implements]) ? item.data[w.work.implements].filter((x) => typeof x === "string") : [];
581
+ const proposed = base ? await proposals(lease.worktree, base, already) : [];
582
+ await amend(lease.worktree, kindFile, lease.item, {
583
+ [w.stateField]: w.work.done,
584
+ [w.work.closedOn]: today(),
585
+ result: { lease: lease.token },
586
+ ...(proposed.length > 0 ? { [w.work.implements]: [...already, ...proposed.map((p) => p.decision)], implements_proposed: proposed } : {}),
587
+ });
588
+ const title = typeof item.data?.title === "string" ? item.data.title : lease.item;
589
+ const commit = await commitAll(lease.worktree, `${lease.item}: ${title}`, lease.item, w.kindName, lease.token, runIdOf(args.build.report), trailerExtras(args.build.report, args.check.report));
590
+ return { outcome: "done", reason: null, commit, implementsProposed: proposed };
591
+ }