@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,115 @@
1
+ /**
2
+ * Re-pinning records after template parameters are substituted (#2549, #2627).
3
+ *
4
+ * A template's decision records may pin a file of the template by hash. When
5
+ * `chant init --from` or `chant workspace upgrade` fills that file's
6
+ * `{{chant:<name>}}` placeholders, the copy's bytes differ from the
7
+ * template's, and every copy would report the pin as drifted on day one. So
8
+ * after substitution, each pin that held in the template and names a
9
+ * substituted file gets the hash of the substituted content.
10
+ *
11
+ * A record is any Markdown file whose front matter has an `evidence` list
12
+ * with path pins. Its paths resolve from the nearest directory above it that
13
+ * holds a workspace declaration, as `chant workspace records` resolves them.
14
+ * A pin that did not hold in the template stays as it is: re-pinning follows
15
+ * the substitution and never hides drift the template already had. Only the
16
+ * `sha256` value on the pin's line changes; the rest of the file is kept byte
17
+ * for byte.
18
+ */
19
+ import { sha256Hex } from "../content-digest.js";
20
+ import { pinEntries } from "./record-assets.js";
21
+ import { parseFrontMatter } from "./records.js";
22
+ const DECLARATIONS = ["chant.workspace.json", "chant.workspace.jsonc"];
23
+ const EVIDENCE = "evidence";
24
+ const dirOf = (path) => (path.includes("/") ? path.slice(0, path.lastIndexOf("/")) : "");
25
+ /** The nearest directory at or above `dir` holding a workspace declaration in `files`, or "" for the root. */
26
+ function workspaceRootOf(files, dir) {
27
+ for (let d = dir;; d = dirOf(d)) {
28
+ if (DECLARATIONS.some((name) => files.has(d === "" ? name : `${d}/${name}`)))
29
+ return d;
30
+ if (d === "")
31
+ return "";
32
+ }
33
+ }
34
+ /**
35
+ * Rewrite, in `substituted`, the pins of every record that name a file in
36
+ * `changed` and held against `original`. Returns the files with the records
37
+ * rewritten, and which records were.
38
+ */
39
+ export function repinSubstituted(original, substituted, changed) {
40
+ const files = new Map(substituted);
41
+ const repinned = [];
42
+ if (changed.length === 0)
43
+ return { files, repinned };
44
+ const changedSet = new Set(changed);
45
+ for (const [recordPath, data] of [...substituted].sort(([a], [b]) => a.localeCompare(b))) {
46
+ if (!recordPath.endsWith(".md"))
47
+ continue;
48
+ const text = data.toString("utf-8");
49
+ const fm = parseFrontMatter(text);
50
+ if (!fm.ok)
51
+ continue;
52
+ const root = workspaceRootOf(substituted, dirOf(recordPath));
53
+ const full = (p) => (root === "" ? p : `${root}/${p}`);
54
+ const updates = new Map();
55
+ for (const pin of pinEntries(fm.value, EVIDENCE)) {
56
+ const file = full(pin.path);
57
+ if (!changedSet.has(file))
58
+ continue;
59
+ const before = original.get(file);
60
+ const after = substituted.get(file);
61
+ if (!before || !after || sha256Hex(before) !== pin.sha256)
62
+ continue;
63
+ updates.set(pin.path, { from: pin.sha256, to: sha256Hex(after) });
64
+ }
65
+ if (updates.size === 0)
66
+ continue;
67
+ const rewritten = rewritePins(text, updates);
68
+ // Only a rewrite that reads back with every update applied is kept.
69
+ const check = parseFrontMatter(rewritten);
70
+ const pins = check.ok ? pinEntries(check.value, EVIDENCE) : [];
71
+ if (![...updates].every(([path, u]) => pins.some((p) => p.path === path && p.sha256 === u.to)))
72
+ continue;
73
+ files.set(recordPath, Buffer.from(rewritten, "utf-8"));
74
+ repinned.push({ record: recordPath, paths: [...updates.keys()].sort() });
75
+ }
76
+ return { files, repinned };
77
+ }
78
+ /**
79
+ * Replace the `sha256` of each updated pin in the front matter. A pin is a
80
+ * list entry, from its `- ` line to the next one at the same indentation or
81
+ * less, holding both `path: "<path>"` and `sha256: "<old>"`.
82
+ */
83
+ function rewritePins(text, updates) {
84
+ const eol = text.includes("\r\n") ? "\r\n" : "\n";
85
+ const lines = text.split(eol);
86
+ const end = lines.indexOf("---", 1);
87
+ if (lines[0] !== "---" || end < 0)
88
+ return text;
89
+ const starts = [];
90
+ for (let i = 1; i < end; i++)
91
+ if (/^\s*- /.test(lines[i]))
92
+ starts.push(i);
93
+ for (let s = 0; s < starts.length; s++) {
94
+ const from = starts[s];
95
+ const indent = lines[from].search(/-/);
96
+ let to = end;
97
+ for (let i = from + 1; i < end; i++) {
98
+ const lead = lines[i].search(/\S/);
99
+ if (lead >= 0 && lead <= indent) {
100
+ to = i;
101
+ break;
102
+ }
103
+ }
104
+ const entry = lines.slice(from, to).join("\n");
105
+ const path = entry.match(/(?:^|\n)\s*(?:- )?path: "([^"]*)"/)?.[1];
106
+ const update = path !== undefined ? updates.get(path) : undefined;
107
+ if (!update)
108
+ continue;
109
+ for (let i = from; i < to; i++) {
110
+ if (new RegExp(`^(\\s*(?:- )?sha256: )"${update.from}"\\s*$`).test(lines[i]))
111
+ lines[i] = lines[i].replace(update.from, update.to);
112
+ }
113
+ }
114
+ return lines.join(eol);
115
+ }
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Joining a commit through chant's own trailers (#3149, ws-075), for `graph
3
+ * --intent` and `graph --intent --record`.
4
+ *
5
+ * A plugin's `commitJoins` reads a kind's own trailers (`intent-joins.ts`).
6
+ * These are core's: a `Chant-Record` names a record by kind and id, and a
7
+ * `Chant-Lease` names a work lease by its fencing token, which the lease
8
+ * histories on `chant/lifecycle` turn into the work item it was taken on.
9
+ * Both read the local branch and never fetch.
10
+ */
11
+ import { execFileSync } from "node:child_process";
12
+ import { parseLeaseHistory } from "../lifecycle/work-lease.js";
13
+ import { readChantTrailers } from "./trailers.js";
14
+ /** The branch the lease histories are on. */
15
+ const LEDGER_BRANCH = "refs/heads/chant/lifecycle";
16
+ function git(top, args) {
17
+ try {
18
+ return execFileSync("git", args, { cwd: top, encoding: "utf-8", stdio: ["ignore", "pipe", "pipe"], maxBuffer: 256 * 1024 * 1024 });
19
+ }
20
+ catch {
21
+ return undefined;
22
+ }
23
+ }
24
+ /**
25
+ * The work item each lease token names, from the lease histories
26
+ * (`_leases/<item>.jsonl`, any member's) on the local `chant/lifecycle`
27
+ * branch. A token no history names is left out. Never fetches.
28
+ */
29
+ export function leaseItemsByToken(top, tokens) {
30
+ const out = new Map();
31
+ const wanted = [...new Set(tokens.filter((t) => t !== ""))];
32
+ if (wanted.length === 0 || git(top, ["rev-parse", "--verify", "--quiet", LEDGER_BRANCH]) === undefined)
33
+ return out;
34
+ const listed = git(top, ["grep", "-l", "-F", ...wanted.flatMap((t) => ["-e", t]), LEDGER_BRANCH, "--", ":(glob)**/_leases/*.jsonl"]);
35
+ for (const line of (listed ?? "").split("\n")) {
36
+ const path = line.startsWith(`${LEDGER_BRANCH}:`) ? line.slice(LEDGER_BRANCH.length + 1) : "";
37
+ const m = path.match(/(?:^|\/)_leases\/([^/]+)\.jsonl$/);
38
+ if (!m)
39
+ continue;
40
+ const text = git(top, ["show", `${LEDGER_BRANCH}:${path}`]);
41
+ for (const r of parseLeaseHistory(text ?? "").records)
42
+ if (wanted.includes(r.token) && r.item === m[1] && !out.has(r.token))
43
+ out.set(r.token, r.item);
44
+ }
45
+ return out;
46
+ }
47
+ /** Read chant's trailers from each commit, and the work items their lease tokens name. */
48
+ export function readTrailerJoins(top, commits) {
49
+ const read = commits.map((c) => ({ sha: c.sha, trailers: readChantTrailers(c.trailers) }));
50
+ const items = leaseItemsByToken(top, read.map((r) => r.trailers.lease).filter((t) => t !== null));
51
+ const out = new Map();
52
+ for (const { sha, trailers } of read) {
53
+ out.set(sha, {
54
+ trailers,
55
+ joins: {
56
+ agent: trailers.agent,
57
+ lease: trailers.lease === null ? null : { token: trailers.lease, item: items.get(trailers.lease) ?? null },
58
+ run: trailers.run,
59
+ records: trailers.records.map((r) => ({ kind: r.kind, id: r.id, node: null })),
60
+ applied: trailers.applied,
61
+ },
62
+ });
63
+ }
64
+ return out;
65
+ }
@@ -0,0 +1,111 @@
1
+ /**
2
+ * chant's commit trailers (#3149, ws-075): the vocabulary a commit uses to
3
+ * name the lease, the agent run, the records and the apply behind it.
4
+ *
5
+ * A trailer is how a commit points at a fact kept elsewhere: a work lease on
6
+ * `chant/lifecycle`, an agent run in the run ledger (#3033), a record in the
7
+ * working tree. Provenance is keyed to those ids, never to commit SHAs, so a
8
+ * commit that keeps its message through a rebase or a cherry-pick keeps its
9
+ * joins (#3037). chant never writes a commit itself (ws-074): whoever makes
10
+ * the commit adds the trailers, and chant reads them back in `graph
11
+ * --intent`, `graph --intent --record` and `workspace runs`.
12
+ *
13
+ * | Trailer | Value | Names |
14
+ * |---|---|---|
15
+ * | `Chant-Agent` | an agent session | the session that wrote the commit (ws-067) |
16
+ * | `Chant-Lease` | a fencing token | the work lease the commit was made under |
17
+ * | `Chant-Run` | a run id | the agent run that made the commit (#3033) |
18
+ * | `Chant-Record` | `<kind>:<id>` | a record the commit carries out or changes; repeatable |
19
+ * | `Chant-Applied-By` | a principal | who applied a leased branch, on the apply commit |
20
+ * | `Chant-Applied-At` | ISO 8601 | when it was applied |
21
+ * | `Chant-Applied-Commit` | a commit id | the tip of the branch that was applied |
22
+ *
23
+ * Every other trailer is a plugin's, and core gives it no meaning; a kind's
24
+ * `commitJoins` may (`intent-joins.ts`).
25
+ */
26
+ import { trailerValue, trailerValues } from "./intent-joins.js";
27
+ /** The agent session that wrote a commit (ws-067). */
28
+ export const AGENT_TRAILER = "Chant-Agent";
29
+ /** The fencing token of the work lease a commit was made under. */
30
+ export const LEASE_TRAILER = "Chant-Lease";
31
+ /** The agent run that made a commit (#3033). */
32
+ export const RUN_TRAILER = "Chant-Run";
33
+ /** A record a commit carries out or changes, as `<kind>:<id>`. Repeatable. */
34
+ export const RECORD_TRAILER = "Chant-Record";
35
+ /** Who applied a leased branch, on the commit that applied it. */
36
+ export const APPLIED_BY_TRAILER = "Chant-Applied-By";
37
+ /** When the branch was applied, ISO 8601. */
38
+ export const APPLIED_AT_TRAILER = "Chant-Applied-At";
39
+ /** The tip of the branch that was applied. */
40
+ export const APPLIED_COMMIT_TRAILER = "Chant-Applied-Commit";
41
+ /** Every trailer key core reads, in the order a writer should add them. */
42
+ export const CHANT_TRAILERS = [AGENT_TRAILER, LEASE_TRAILER, RUN_TRAILER, RECORD_TRAILER, APPLIED_BY_TRAILER, APPLIED_AT_TRAILER, APPLIED_COMMIT_TRAILER];
43
+ /** A record kind's name, as a kind file's `recordKind.name` gives it. */
44
+ const KIND_NAME = /^[a-z][a-z0-9-]*$/;
45
+ /** A record id, as the record kinds allocate them and as a work lease keys them. */
46
+ const RECORD_ID = /^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/;
47
+ const COMMIT_ID = /^[0-9a-f]{40,64}$/;
48
+ /** Parse one `Chant-Record` value, `<kind>:<id>`, or undefined when it is not one. */
49
+ export function parseRecordRef(value) {
50
+ const colon = value.indexOf(":");
51
+ if (colon <= 0)
52
+ return undefined;
53
+ const kind = value.slice(0, colon).trim();
54
+ const id = value.slice(colon + 1).trim();
55
+ return KIND_NAME.test(kind) && RECORD_ID.test(id) ? { kind, id } : undefined;
56
+ }
57
+ /** Read chant's own trailers from a commit's parsed trailers. Keys compare without case, as git's do. */
58
+ export function readChantTrailers(trailers) {
59
+ const records = [];
60
+ for (const v of trailerValues(trailers, RECORD_TRAILER)) {
61
+ const ref = parseRecordRef(v);
62
+ if (ref && !records.some((r) => r.kind === ref.kind && r.id === ref.id))
63
+ records.push(ref);
64
+ }
65
+ const by = trailerValue(trailers, APPLIED_BY_TRAILER) ?? null;
66
+ const commit = trailerValue(trailers, APPLIED_COMMIT_TRAILER) ?? null;
67
+ return {
68
+ agent: trailerValue(trailers, AGENT_TRAILER) ?? null,
69
+ lease: trailerValue(trailers, LEASE_TRAILER) ?? null,
70
+ run: trailerValue(trailers, RUN_TRAILER) ?? null,
71
+ records,
72
+ applied: by === null ? null : { by, at: trailerValue(trailers, APPLIED_AT_TRAILER) ?? null, commit: commit !== null && COMMIT_ID.test(commit) ? commit : null },
73
+ };
74
+ }
75
+ /** Whether a commit carries any of chant's own trailers. */
76
+ export function hasChantTrailers(t) {
77
+ return t.agent !== null || t.lease !== null || t.run !== null || t.records.length > 0 || t.applied !== null;
78
+ }
79
+ /**
80
+ * The trailer lines for a commit message, in {@link CHANT_TRAILERS} order.
81
+ * Throws when a value holds a line break or a record ref is malformed, since
82
+ * either would write a trailer git parses differently.
83
+ */
84
+ export function formatChantTrailers(input) {
85
+ const lines = [];
86
+ const add = (key, value) => {
87
+ if (value === undefined)
88
+ return;
89
+ const v = value.trim();
90
+ if (v === "" || /[\r\n]/.test(v))
91
+ throw new Error(`${key} takes one line of text, not ${JSON.stringify(value)}`);
92
+ lines.push(`${key}: ${v}`);
93
+ };
94
+ add(AGENT_TRAILER, input.agent);
95
+ add(LEASE_TRAILER, input.lease);
96
+ add(RUN_TRAILER, input.run);
97
+ for (const r of input.records ?? []) {
98
+ const ref = typeof r === "string" ? parseRecordRef(r) : r;
99
+ if (!ref || !KIND_NAME.test(ref.kind) || !RECORD_ID.test(ref.id))
100
+ throw new Error(`${RECORD_TRAILER} takes <kind>:<id>, not ${JSON.stringify(r)}`);
101
+ add(RECORD_TRAILER, `${ref.kind}:${ref.id}`);
102
+ }
103
+ if (input.applied) {
104
+ add(APPLIED_BY_TRAILER, input.applied.by);
105
+ add(APPLIED_AT_TRAILER, input.applied.at);
106
+ if (input.applied.commit !== undefined && !COMMIT_ID.test(input.applied.commit))
107
+ throw new Error(`${APPLIED_COMMIT_TRAILER} takes a full commit id, not ${JSON.stringify(input.applied.commit)}`);
108
+ add(APPLIED_COMMIT_TRAILER, input.applied.commit);
109
+ }
110
+ return lines;
111
+ }
@@ -0,0 +1,136 @@
1
+ /**
2
+ * The files a workspace read looks at: the working tree, or one commit's git
3
+ * objects (`--at <rev>`, #2524 D15). Reading a revision needs no checkout and
4
+ * no network; the whole tree is listed once from the local object store.
5
+ *
6
+ * Paths are relative to the tree's root, `/`-separated, and `""` is the root.
7
+ */
8
+ import { execFileSync } from "node:child_process";
9
+ import { readdirSync, readFileSync, statSync } from "node:fs";
10
+ import { join } from "node:path";
11
+ /** Join tree-relative path parts, leaving out `""` and `"."`. */
12
+ export function joinPath(...parts) {
13
+ return parts.filter((p) => p !== "" && p !== ".").join("/");
14
+ }
15
+ /** The working tree under `root`. */
16
+ export function workingTree(root) {
17
+ return {
18
+ label: "",
19
+ stat(path) {
20
+ try {
21
+ const s = statSync(join(root, path));
22
+ return s.isDirectory() ? "dir" : s.isFile() ? "file" : undefined;
23
+ }
24
+ catch {
25
+ return undefined;
26
+ }
27
+ },
28
+ list(path) {
29
+ let dirents;
30
+ try {
31
+ dirents = readdirSync(join(root, path), { withFileTypes: true });
32
+ }
33
+ catch {
34
+ return undefined;
35
+ }
36
+ const out = [];
37
+ for (const d of dirents) {
38
+ let type = d.isDirectory() ? "dir" : d.isFile() ? "file" : undefined;
39
+ if (!type && d.isSymbolicLink()) {
40
+ try {
41
+ const s = statSync(join(root, path, d.name));
42
+ type = s.isDirectory() ? "dir" : s.isFile() ? "file" : undefined;
43
+ }
44
+ catch {
45
+ // A dangling link is no entry.
46
+ }
47
+ }
48
+ if (type)
49
+ out.push({ name: d.name, type });
50
+ }
51
+ return out;
52
+ },
53
+ read(path) {
54
+ return readFileSync(join(root, path), "utf-8");
55
+ },
56
+ bytes(path) {
57
+ return readFileSync(join(root, path));
58
+ },
59
+ };
60
+ }
61
+ function git(cwd, args) {
62
+ return execFileSync("git", args, { cwd, encoding: "utf-8", stdio: ["ignore", "pipe", "pipe"], maxBuffer: 512 * 1024 * 1024 });
63
+ }
64
+ /** The top of the git repository holding `cwd`, or undefined outside one. */
65
+ export function gitTop(cwd) {
66
+ try {
67
+ return git(cwd, ["rev-parse", "--show-toplevel"]).trim();
68
+ }
69
+ catch {
70
+ return undefined;
71
+ }
72
+ }
73
+ /** The full commit id `rev` names in the repository at `top`, or undefined. */
74
+ export function resolveCommit(top, rev) {
75
+ if (rev.startsWith("-"))
76
+ return undefined;
77
+ try {
78
+ return git(top, ["rev-parse", "--verify", "--quiet", `${rev}^{commit}`]).trim();
79
+ }
80
+ catch {
81
+ return undefined;
82
+ }
83
+ }
84
+ /**
85
+ * The tree of `commit` in the repository at `top`, rooted at `prefix` (a
86
+ * directory relative to `top`, `""` for the top itself).
87
+ */
88
+ export function gitTree(top, commit, prefix = "") {
89
+ const entries = new Map([["", "dir"]]);
90
+ const children = new Map([["", []]]);
91
+ const out = git(top, ["ls-tree", "-r", "-t", "-z", "--full-tree", commit]);
92
+ for (const line of out.split("\0")) {
93
+ if (!line)
94
+ continue;
95
+ const tab = line.indexOf("\t");
96
+ const type = line.slice(0, tab).split(" ")[1];
97
+ const full = line.slice(tab + 1);
98
+ let path;
99
+ if (prefix === "")
100
+ path = full;
101
+ else if (full.startsWith(`${prefix}/`))
102
+ path = full.slice(prefix.length + 1);
103
+ else
104
+ continue;
105
+ const kind = type === "tree" ? "dir" : type === "blob" ? "file" : undefined;
106
+ if (!kind)
107
+ continue;
108
+ entries.set(path, kind);
109
+ const slash = path.lastIndexOf("/");
110
+ const parent = slash < 0 ? "" : path.slice(0, slash);
111
+ if (!children.has(parent))
112
+ children.set(parent, []);
113
+ children.get(parent).push({ name: path.slice(slash + 1), type: kind });
114
+ if (kind === "dir" && !children.has(path))
115
+ children.set(path, []);
116
+ }
117
+ return {
118
+ label: ` at ${commit.slice(0, 8)}`,
119
+ stat: (path) => entries.get(path),
120
+ list: (path) => (entries.get(path) === "dir" ? [...(children.get(path) ?? [])] : undefined),
121
+ read(path) {
122
+ if (entries.get(path) !== "file")
123
+ throw new Error(`${path} is not a file${` at ${commit.slice(0, 8)}`}`);
124
+ return git(top, ["cat-file", "blob", `${commit}:${joinPath(prefix, path)}`]);
125
+ },
126
+ bytes(path) {
127
+ if (entries.get(path) !== "file")
128
+ throw new Error(`${path} is not a file${` at ${commit.slice(0, 8)}`}`);
129
+ return execFileSync("git", ["cat-file", "blob", `${commit}:${joinPath(prefix, path)}`], { cwd: top, stdio: ["ignore", "pipe", "pipe"], maxBuffer: 512 * 1024 * 1024 });
130
+ },
131
+ };
132
+ }
133
+ /** Directory names a workspace walk never enters. */
134
+ export function skippedDir(name) {
135
+ return name === "node_modules" || name.startsWith(".");
136
+ }
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Attestors and provenance levels (#2524 D5).
3
+ *
4
+ * An attestor answers one question about a commit: does it carry an
5
+ * attestation that the policy read at base accepts? Concrete attestors are
6
+ * plugins. Core ships the contract and the first one, ssh-signed commits
7
+ * (./ssh-commit.ts). Plugin attestors will arrive the way kinds do, through
8
+ * `workspaceKinds` (#2525 rule 5), once the declaration can name them (#2534,
9
+ * #2535); until then {@link registerAttestor} is the entry point.
10
+ *
11
+ * What counts as proof: a signature the attestor checked against a key the
12
+ * base policy lists. Never a trailer, a typed-in name, an author field or an
13
+ * environment variable.
14
+ */
15
+ import { UNATTESTED_APPROVER } from "../../lifecycle/gate-origin.js";
16
+ /**
17
+ * How far a record's authorship is established. The list is closed and
18
+ * ordered from strongest to weakest; a gate may require `attested`.
19
+ *
20
+ * - `attested`: an attestor verified a signature by a signer the base policy lists.
21
+ * - `attested-unverifiable-here`: there is a signature, but nothing here can
22
+ * check it (a signature format no attestor handles, or a missing tool).
23
+ * - `adopted`: not attested, but inside a commit range the base policy admits.
24
+ * - `unattested`: none of the above. The same word, with the same meaning, as
25
+ * the approver a gate resolution records when its channel cannot attest to a
26
+ * name (#2384, {@link UNATTESTED_APPROVER}); D5 keeps that meaning.
27
+ */
28
+ export const PROVENANCE_LEVELS = ["attested", "attested-unverifiable-here", "adopted", UNATTESTED_APPROVER];
29
+ const registered = [];
30
+ /** Add an attestor. Later registrations are asked after earlier ones. */
31
+ export function registerAttestor(attestor) {
32
+ if (!registered.some((a) => a.name === attestor.name))
33
+ registered.push(attestor);
34
+ }
35
+ /** Remove every attestor registered by {@link registerAttestor}. For tests. */
36
+ export function resetAttestors() {
37
+ registered.length = 0;
38
+ }
39
+ /**
40
+ * Ask each attestor in turn. The first `attested` answer wins; otherwise
41
+ * `attested-unverifiable-here` beats `unattested`, so a signature nobody here
42
+ * can check is still reported as there.
43
+ */
44
+ export function attestCommit(ctx, commit, attestors) {
45
+ let best;
46
+ for (const a of attestors) {
47
+ const r = a.attestCommit(ctx, commit);
48
+ if (r.level === "attested")
49
+ return r;
50
+ if (!best || (best.level === "unattested" && r.level === "attested-unverifiable-here"))
51
+ best = r;
52
+ }
53
+ return best ?? { level: "unattested", attestor: "none", reason: "no attestor is registered" };
54
+ }
55
+ /** {@link attestCommit} for a raw commit object, asking only the attestors that judge one. */
56
+ export function attestRawCommit(ctx, raw, attestors) {
57
+ return attestCommit(ctx, "", attestors.filter((a) => a.attestRaw).map((a) => ({ name: a.name, attestCommit: (c) => a.attestRaw(c, raw) })));
58
+ }
59
+ /** The attestors in use: the built-in ones first, then any registered. */
60
+ export async function activeAttestors() {
61
+ const { sshCommitAttestor } = await import("./ssh-commit.js");
62
+ return [sshCommitAttestor, ...registered.filter((a) => a.name !== sshCommitAttestor.name)];
63
+ }
@@ -0,0 +1,108 @@
1
+ /**
2
+ * DSSE envelopes (https://github.com/secure-systems-lab/dsse, v1) signed with
3
+ * Ed25519 runner keys (#2553).
4
+ *
5
+ * The signature covers the pre-authentication encoding (PAE) of the payload
6
+ * type and the payload, never the payload alone, so an envelope cannot be
7
+ * replayed under another type. Everything here runs offline: verifying needs
8
+ * the envelope and the public key, nothing else.
9
+ *
10
+ * Public keys are written the way ssh writes them (`ssh-ed25519 AAAA...`), so
11
+ * the runner keys in `.chant/trust.json` read like the signers file beside
12
+ * them, and a key id is the key's ssh fingerprint (`SHA256:...`).
13
+ */
14
+ import { createHash, createPrivateKey, createPublicKey, sign, verify } from "node:crypto";
15
+ export const IN_TOTO_PAYLOAD_TYPE = "application/vnd.in-toto+json";
16
+ /** DSSE v1 pre-authentication encoding. Lengths are byte lengths in ASCII decimal. */
17
+ export function pae(payloadType, payload) {
18
+ const type = Buffer.from(payloadType, "utf8");
19
+ return Buffer.concat([Buffer.from(`DSSEv1 ${type.length} `, "utf8"), type, Buffer.from(` ${payload.length} `, "utf8"), payload]);
20
+ }
21
+ // ── ssh-ed25519 public keys ──────────────────────────────────────────────────
22
+ function sshString(buf, at) {
23
+ if (at + 4 > buf.length)
24
+ throw new Error("truncated key");
25
+ const len = buf.readUInt32BE(at);
26
+ if (at + 4 + len > buf.length)
27
+ throw new Error("truncated key");
28
+ return { value: buf.subarray(at + 4, at + 4 + len), next: at + 4 + len };
29
+ }
30
+ /** The 32 raw bytes of an `ssh-ed25519 <base64>` public key. */
31
+ export function ed25519FromSsh(line) {
32
+ const [type, b64] = line.trim().split(/\s+/);
33
+ if (type !== "ssh-ed25519" || !b64)
34
+ throw new Error("runner keys must be ssh-ed25519 public keys");
35
+ const blob = Buffer.from(b64, "base64");
36
+ const t = sshString(blob, 0);
37
+ if (t.value.toString("utf8") !== "ssh-ed25519")
38
+ throw new Error("the key blob is not ssh-ed25519");
39
+ const k = sshString(blob, t.next);
40
+ if (k.value.length !== 32 || k.next !== blob.length)
41
+ throw new Error("not a 32-byte ed25519 key");
42
+ return Buffer.from(k.value);
43
+ }
44
+ /** An `ssh-ed25519 <base64>` line for 32 raw public key bytes. */
45
+ export function sshFromEd25519(raw) {
46
+ const part = (b) => {
47
+ const len = Buffer.alloc(4);
48
+ len.writeUInt32BE(b.length);
49
+ return Buffer.concat([len, b]);
50
+ };
51
+ return `ssh-ed25519 ${Buffer.concat([part(Buffer.from("ssh-ed25519")), part(raw)]).toString("base64")}`;
52
+ }
53
+ /** The ssh fingerprint of a public key line: `SHA256:` and unpadded base64. */
54
+ export function sshFingerprint(line) {
55
+ const blob = Buffer.from(line.trim().split(/\s+/)[1] ?? "", "base64");
56
+ return `SHA256:${createHash("sha256").update(blob).digest("base64").replace(/=+$/, "")}`;
57
+ }
58
+ function publicKeyObject(line) {
59
+ return createPublicKey({ key: { kty: "OKP", crv: "Ed25519", x: ed25519FromSsh(line).toString("base64url") }, format: "jwk" });
60
+ }
61
+ /** A private Ed25519 key from PEM (PKCS#8), and its public half as an ssh line. */
62
+ export function loadRunnerKey(pem) {
63
+ const key = createPrivateKey(pem);
64
+ if (key.asymmetricKeyType !== "ed25519")
65
+ throw new Error(`runner keys must be Ed25519, not ${key.asymmetricKeyType}`);
66
+ const jwk = createPublicKey(key).export({ format: "jwk" });
67
+ return { key, publicKey: sshFromEd25519(Buffer.from(jwk.x, "base64url")) };
68
+ }
69
+ // ── Sign and verify ──────────────────────────────────────────────────────────
70
+ export function signEnvelope(payloadType, payload, key, publicKey) {
71
+ const sig = sign(null, pae(payloadType, payload), key);
72
+ return { payloadType, payload: payload.toString("base64"), signatures: [{ keyid: sshFingerprint(publicKey), sig: sig.toString("base64") }] };
73
+ }
74
+ /** Verify an envelope against `trusted`. One valid signature by a trusted key is enough. */
75
+ export function verifyEnvelope(envelope, trusted) {
76
+ if (!isEnvelope(envelope))
77
+ return { ok: false, code: "envelope-invalid", reason: "not a DSSE envelope: it needs payloadType, payload and signatures" };
78
+ const payload = Buffer.from(envelope.payload, "base64");
79
+ if (payload.toString("base64") !== envelope.payload)
80
+ return { ok: false, code: "envelope-invalid", reason: "the payload is not canonical base64" };
81
+ const message = pae(envelope.payloadType, payload);
82
+ const byId = new Map(trusted.map((t) => [sshFingerprint(t.key), t]));
83
+ for (const s of envelope.signatures) {
84
+ const t = byId.get(s.keyid);
85
+ if (!t)
86
+ continue;
87
+ let good = false;
88
+ try {
89
+ good = verify(null, message, publicKeyObject(t.key), Buffer.from(s.sig, "base64"));
90
+ }
91
+ catch {
92
+ good = false;
93
+ }
94
+ if (good)
95
+ return { ok: true, principal: t.principal, keyid: s.keyid, payloadType: envelope.payloadType, payload };
96
+ }
97
+ const ids = envelope.signatures.map((s) => s.keyid).join(", ") || "none";
98
+ return { ok: false, code: "envelope-untrusted", reason: `no signature verifies against a runner key the policy at base lists (key ids: ${ids})` };
99
+ }
100
+ function isEnvelope(v) {
101
+ if (v === null || typeof v !== "object")
102
+ return false;
103
+ const e = v;
104
+ return (typeof e.payloadType === "string" &&
105
+ typeof e.payload === "string" &&
106
+ Array.isArray(e.signatures) &&
107
+ e.signatures.every((s) => s !== null && typeof s === "object" && typeof s.keyid === "string" && typeof s.sig === "string"));
108
+ }