@intentius/chant 0.124.12 → 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 (928) 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.d.ts +36 -4
  306. package/dist/gate-decision.d.ts.map +1 -1
  307. package/dist/gate-decision.js +260 -0
  308. package/dist/gate-resume-run.js +154 -0
  309. package/dist/gated-waves.js +165 -0
  310. package/dist/governance.js +43 -0
  311. package/dist/graph-declared.js +45 -0
  312. package/dist/graph-detail.js +207 -0
  313. package/dist/graph-dot.js +54 -0
  314. package/dist/graph-effective.js +107 -0
  315. package/dist/graph-ir.js +623 -0
  316. package/dist/graph-layout.js +184 -0
  317. package/dist/graph-lens.js +105 -0
  318. package/dist/graph-mermaid.js +83 -0
  319. package/dist/graph-ops.js +39 -0
  320. package/dist/graph-refs.js +156 -0
  321. package/dist/held-elsewhere.js +87 -0
  322. package/dist/identity.js +251 -0
  323. package/dist/import/base-parser.js +34 -0
  324. package/dist/import/embedded.js +255 -0
  325. package/dist/import/generator.js +1 -0
  326. package/dist/import/ir-utils.js +85 -0
  327. package/dist/import/parser-options.js +45 -0
  328. package/dist/import/parser.js +1 -0
  329. package/dist/index.js +118 -0
  330. package/dist/intrinsic-interpolation.js +73 -0
  331. package/dist/intrinsic.js +31 -0
  332. package/dist/join-key.js +35 -0
  333. package/dist/kubectl-context.js +150 -0
  334. package/dist/lexicon-config.js +58 -0
  335. package/dist/lexicon-integrity.js +47 -0
  336. package/dist/lexicon-manifest.js +70 -0
  337. package/dist/lexicon-module.d.ts.map +1 -1
  338. package/dist/lexicon-module.js +241 -0
  339. package/dist/lexicon-output.js +218 -0
  340. package/dist/lexicon-plugin-helpers.js +104 -0
  341. package/dist/lexicon-schema.js +136 -0
  342. package/dist/lexicon.js +130 -0
  343. package/dist/lifecycle/affected.js +224 -0
  344. package/dist/lifecycle/assert-live.js +110 -0
  345. package/dist/lifecycle/build-ledger-store.js +160 -0
  346. package/dist/lifecycle/build-ledger.js +155 -0
  347. package/dist/lifecycle/change-set.js +356 -0
  348. package/dist/lifecycle/converge-ledger.js +161 -0
  349. package/dist/lifecycle/deep-diff.js +233 -0
  350. package/dist/lifecycle/deep-observe.js +147 -0
  351. package/dist/lifecycle/digest.js +143 -0
  352. package/dist/lifecycle/disruption.js +135 -0
  353. package/dist/lifecycle/gate-applied.js +113 -0
  354. package/dist/lifecycle/gate-audit.js +341 -0
  355. package/dist/lifecycle/gate-ledger-select.js +89 -0
  356. package/dist/lifecycle/gate-ledger.d.ts +8 -0
  357. package/dist/lifecycle/gate-ledger.d.ts.map +1 -1
  358. package/dist/lifecycle/gate-ledger.js +193 -0
  359. package/dist/lifecycle/gate-origin.js +117 -0
  360. package/dist/lifecycle/gate-pending.js +58 -0
  361. package/dist/lifecycle/git.js +1182 -0
  362. package/dist/lifecycle/identity.js +58 -0
  363. package/dist/lifecycle/index.js +26 -0
  364. package/dist/lifecycle/lease.js +283 -0
  365. package/dist/lifecycle/ledger-port.js +1 -0
  366. package/dist/lifecycle/legacy-digest.js +91 -0
  367. package/dist/lifecycle/live-diff.js +274 -0
  368. package/dist/lifecycle/local-note.js +15 -0
  369. package/dist/lifecycle/member-ledger.js +122 -0
  370. package/dist/lifecycle/observation-baseline.js +155 -0
  371. package/dist/lifecycle/observe.js +375 -0
  372. package/dist/lifecycle/oras-referrer-lookup.js +82 -0
  373. package/dist/lifecycle/override-ledger.js +54 -0
  374. package/dist/lifecycle/plan-digest.js +110 -0
  375. package/dist/lifecycle/plan-ledger.js +129 -0
  376. package/dist/lifecycle/receipt-plan.js +192 -0
  377. package/dist/lifecycle/release-ledger.js +155 -0
  378. package/dist/lifecycle/release-read.js +64 -0
  379. package/dist/lifecycle/replay.js +193 -0
  380. package/dist/lifecycle/rollback.js +102 -0
  381. package/dist/lifecycle/run-ledger.js +183 -0
  382. package/dist/lifecycle/scenario-eval.js +204 -0
  383. package/dist/lifecycle/scenario.js +214 -0
  384. package/dist/lifecycle/snapshot.js +239 -0
  385. package/dist/lifecycle/status.js +447 -0
  386. package/dist/lifecycle/symptoms.js +117 -0
  387. package/dist/lifecycle/teardown.js +255 -0
  388. package/dist/lifecycle/types.js +1 -0
  389. package/dist/lifecycle/unobserved-gate.js +33 -0
  390. package/dist/lifecycle/wave-plans.js +68 -0
  391. package/dist/lifecycle/work-item-id.js +36 -0
  392. package/dist/lifecycle/work-lease.js +393 -0
  393. package/dist/lint/component-checks.js +87 -0
  394. package/dist/lint/config.js +483 -0
  395. package/dist/lint/declarative.js +122 -0
  396. package/dist/lint/discover.d.ts.map +1 -1
  397. package/dist/lint/discover.js +138 -0
  398. package/dist/lint/engine.js +246 -0
  399. package/dist/lint/knowledge-checks.js +64 -0
  400. package/dist/lint/named-checks.js +22 -0
  401. package/dist/lint/output-checks.js +87 -0
  402. package/dist/lint/output-docs.js +163 -0
  403. package/dist/lint/parser.js +33 -0
  404. package/dist/lint/pipeline-change-gate.js +70 -0
  405. package/dist/lint/policy-import.d.ts +1 -1
  406. package/dist/lint/policy-import.d.ts.map +1 -1
  407. package/dist/lint/policy-import.js +62 -0
  408. package/dist/lint/policy-sandbox.js +86 -0
  409. package/dist/lint/policy.js +122 -0
  410. package/dist/lint/post-synth.js +87 -0
  411. package/dist/lint/presets/relaxed.json +26 -0
  412. package/dist/lint/presets/strict.json +24 -24
  413. package/dist/lint/receipt-checks.js +83 -0
  414. package/dist/lint/rule-loader.d.ts.map +1 -1
  415. package/dist/lint/rule-loader.js +89 -0
  416. package/dist/lint/rule-registry.js +86 -0
  417. package/dist/lint/rule.js +1 -0
  418. package/dist/lint/rules/__fixtures__/comp/comp000-discovery-error/broken-a.component.js +7 -0
  419. package/dist/lint/rules/__fixtures__/comp/comp000-discovery-error/broken-b.component.js +7 -0
  420. package/dist/lint/rules/__fixtures__/comp/comp001/fail/orphan-lib.component.js +9 -0
  421. package/dist/lint/rules/__fixtures__/comp/comp001/pass/emr-job.component.js +11 -0
  422. package/dist/lint/rules/__fixtures__/comp/comp001/pass/jar-lib.component.js +9 -0
  423. package/dist/lint/rules/__fixtures__/comp/comp002/fail/search-service.component.js +25 -0
  424. package/dist/lint/rules/__fixtures__/comp/comp002/pass/jar-lib.component.js +8 -0
  425. package/dist/lint/rules/__fixtures__/comp/comp002/pass/search-service.component.js +21 -0
  426. package/dist/lint/rules/__fixtures__/comp/comp003/fail/migrator.component.js +8 -0
  427. package/dist/lint/rules/__fixtures__/comp/comp003/pass/agent-turn.component.js +24 -0
  428. package/dist/lint/rules/__fixtures__/comp/comp003/pass/migrator.component.js +17 -0
  429. package/dist/lint/rules/__fixtures__/comp/comp003/pass/orders-table.component.js +8 -0
  430. package/dist/lint/rules/__fixtures__/comp/comp004/fail/neo4j-cluster.component.js +18 -0
  431. package/dist/lint/rules/__fixtures__/comp/comp004/pass/neo4j-cluster.component.js +20 -0
  432. package/dist/lint/rules/__fixtures__/comp/comp004/pass/orders-table.component.js +8 -0
  433. package/dist/lint/rules/__fixtures__/comp/comp005/fail/search-service.component.js +12 -0
  434. package/dist/lint/rules/__fixtures__/comp/comp005/pass/search-service.component.js +16 -0
  435. package/dist/lint/rules/__fixtures__/comp/comp006/fail/legacy-tool.component.js +8 -0
  436. package/dist/lint/rules/__fixtures__/comp/comp006/pass/legacy-tool.component.js +12 -0
  437. package/dist/lint/rules/__fixtures__/comp/comp007/fail/inventory-table.component.js +11 -0
  438. package/dist/lint/rules/__fixtures__/comp/comp007/fail/orders-table.component.js +11 -0
  439. package/dist/lint/rules/__fixtures__/comp/comp007/pass/orders-table.component.js +10 -0
  440. package/dist/lint/rules/__fixtures__/comp/comp007/pass/search-service.component.js +16 -0
  441. package/dist/lint/rules/comp/comp001-publishes-never-applies.js +69 -0
  442. package/dist/lint/rules/comp/comp002-dangling-wiring-ref.js +84 -0
  443. package/dist/lint/rules/comp/comp003-mutating-no-rollback.js +103 -0
  444. package/dist/lint/rules/comp/comp004-gate-needs-durable-runtime.js +70 -0
  445. package/dist/lint/rules/comp/comp005-capability-kind-is-noun.js +109 -0
  446. package/dist/lint/rules/comp/comp006-shell-needs-reason.js +49 -0
  447. package/dist/lint/rules/comp/comp007-composition-sprawl.js +64 -0
  448. package/dist/lint/rules/comp/index.js +33 -0
  449. package/dist/lint/rules/comp/support.js +129 -0
  450. package/dist/lint/rules/composite-scope.js +51 -0
  451. package/dist/lint/rules/cor017-composite-name-match.js +93 -0
  452. package/dist/lint/rules/cor018-composite-prefer-lexicon-type.js +136 -0
  453. package/dist/lint/rules/cor021-env-literal-name.js +100 -0
  454. package/dist/lint/rules/cor022-receipt-leaf.js +118 -0
  455. package/dist/lint/rules/cor024-receipt-secret-pointer.js +199 -0
  456. package/dist/lint/rules/declarable-naming-convention.js +62 -0
  457. package/dist/lint/rules/evl001-non-literal-expression.js +66 -0
  458. package/dist/lint/rules/evl002-control-flow-resource.js +69 -0
  459. package/dist/lint/rules/evl003-dynamic-property-access.js +44 -0
  460. package/dist/lint/rules/evl004-spread-non-const.js +94 -0
  461. package/dist/lint/rules/evl005-resource-block-body.js +41 -0
  462. package/dist/lint/rules/evl007-invalid-siblings.js +105 -0
  463. package/dist/lint/rules/evl009-composite-no-constant.js +158 -0
  464. package/dist/lint/rules/evl010-composite-no-transform.js +59 -0
  465. package/dist/lint/rules/evl011-symbolic-in-template.js +106 -0
  466. package/dist/lint/rules/export-required.js +115 -0
  467. package/dist/lint/rules/file-declarable-limit.js +88 -0
  468. package/dist/lint/rules/flat-declarations.js +62 -0
  469. package/dist/lint/rules/index.js +90 -0
  470. package/dist/lint/rules/no-cyclic-declarable-ref.js +138 -0
  471. package/dist/lint/rules/no-redundant-type-import.js +76 -0
  472. package/dist/lint/rules/no-redundant-value-cast.js +41 -0
  473. package/dist/lint/rules/no-string-ref.js +59 -0
  474. package/dist/lint/rules/no-unused-declarable-import.js +75 -0
  475. package/dist/lint/rules/no-unused-declarable.js +142 -0
  476. package/dist/lint/rules/op/index.js +28 -0
  477. package/dist/lint/rules/op/ops012-activity-contract.js +54 -0
  478. package/dist/lint/rules/op/ops013-step-output-ref.js +88 -0
  479. package/dist/lint/rules/op/ops014-converge-rule-refusals.js +114 -0
  480. package/dist/lint/rules/op/ops015-gate-approval.js +45 -0
  481. package/dist/lint/rules/op/support.js +11 -0
  482. package/dist/lint/rules/op/sys010-key-over-plain-http.js +100 -0
  483. package/dist/lint/rules/property-kind.js +56 -0
  484. package/dist/lint/rules/single-concern-file.js +71 -0
  485. package/dist/lint/rules/sys001-no-literal-key.js +60 -0
  486. package/dist/lint/selectors.js +168 -0
  487. package/dist/lint/suppressions.js +129 -0
  488. package/dist/lint/typescript.js +17 -0
  489. package/dist/live-endpoint.js +113 -0
  490. package/dist/live-read-session.js +76 -0
  491. package/dist/lsp/lexicon-providers.js +163 -0
  492. package/dist/lsp/types.js +5 -0
  493. package/dist/managed-fields.js +293 -0
  494. package/dist/mcp/types.js +4 -0
  495. package/dist/notify-verify.js +0 -1
  496. package/dist/notify.js +0 -1
  497. package/dist/notify.schema.json +72 -0
  498. package/dist/observation.js +266 -0
  499. package/dist/okf-read.js +134 -0
  500. package/dist/okf.js +275 -0
  501. package/dist/op/__fixtures__/decide-stub-backend.js +125 -0
  502. package/dist/op/activities/activity-contracts.js +313 -0
  503. package/dist/op/activities/apply.js +582 -0
  504. package/dist/op/activities/build.js +18 -0
  505. package/dist/op/activities/change-coverage.js +40 -0
  506. package/dist/op/activities/change-set.js +64 -0
  507. package/dist/op/activities/converge.js +492 -0
  508. package/dist/op/activities/decide.js +211 -0
  509. package/dist/op/activities/env-teardown.js +110 -0
  510. package/dist/op/activities/factory.js +591 -0
  511. package/dist/op/activities/forge-pull-request.js +82 -0
  512. package/dist/op/activities/gh-host.js +78 -0
  513. package/dist/op/activities/guard-validate.js +165 -0
  514. package/dist/op/activities/http-check.js +40 -0
  515. package/dist/op/activities/index.js +59 -0
  516. package/dist/op/activities/lexicon-upgrade.js +629 -0
  517. package/dist/op/activities/lifecycle.js +109 -0
  518. package/dist/op/activities/pipeline-audit.js +147 -0
  519. package/dist/op/activities/policy.js +26 -0
  520. package/dist/op/activities/predict-behaviour.js +341 -0
  521. package/dist/op/activities/propose-upgrade.js +165 -0
  522. package/dist/op/activities/reconcile.js +997 -0
  523. package/dist/op/activities/shell.js +118 -0
  524. package/dist/op/activities/source-release.js +97 -0
  525. package/dist/op/activities/source-rollback.js +165 -0
  526. package/dist/op/activities/teardown.js +17 -0
  527. package/dist/op/activities/util.js +6 -0
  528. package/dist/op/activities/wait.js +51 -0
  529. package/dist/op/activities/work-evidence.js +35 -0
  530. package/dist/op/activities/workflow-audit.js +133 -0
  531. package/dist/op/activity-contract-registry.js +106 -0
  532. package/dist/op/activity-contract.js +232 -0
  533. package/dist/op/activity-failure.js +31 -0
  534. package/dist/op/activity-profiles.js +129 -0
  535. package/dist/op/activity-registry.js +105 -0
  536. package/dist/op/activity-runtime.js +28 -0
  537. package/dist/op/builders.js +801 -0
  538. package/dist/op/change-signal.js +118 -0
  539. package/dist/op/composites/apply-op.js +151 -0
  540. package/dist/op/composites/behaviour-op.js +65 -0
  541. package/dist/op/composites/converge-op.js +141 -0
  542. package/dist/op/composites/index.js +19 -0
  543. package/dist/op/composites/lexicon-upgrade-op.js +107 -0
  544. package/dist/op/composites/pipeline-audit-op.js +50 -0
  545. package/dist/op/composites/reconcile-op.js +84 -0
  546. package/dist/op/composites/watch-op.js +69 -0
  547. package/dist/op/composites/workflow-audit-op.js +57 -0
  548. package/dist/op/converge-rule.js +205 -0
  549. package/dist/op/cron.js +146 -0
  550. package/dist/op/decide-backend.js +181 -0
  551. package/dist/op/decide-config.js +68 -0
  552. package/dist/op/decide-read-inputs.js +141 -0
  553. package/dist/op/discover.d.ts.map +1 -1
  554. package/dist/op/discover.js +213 -0
  555. package/dist/op/duration.js +21 -0
  556. package/dist/op/emulator-freshness.js +80 -0
  557. package/dist/op/emulator-lifecycle.js +269 -0
  558. package/dist/op/factory.js +83 -0
  559. package/dist/op/gate-approval.js +172 -0
  560. package/dist/op/gate-name.js +86 -0
  561. package/dist/op/gate-plan-context.js +167 -0
  562. package/dist/op/gate-point-run.js +67 -0
  563. package/dist/op/gate-point.js +111 -0
  564. package/dist/op/gate-resume-plan.js +155 -0
  565. package/dist/op/gate-resume.js +31 -0
  566. package/dist/op/gate-review.js +290 -0
  567. package/dist/op/gate-run-locator.js +85 -0
  568. package/dist/op/gate-summary.js +100 -0
  569. package/dist/op/gate-wait.js +56 -0
  570. package/dist/op/gate.js +449 -0
  571. package/dist/op/generate-pipeline.js +124 -0
  572. package/dist/op/index.js +51 -0
  573. package/dist/op/lifecycle-receipt-store.js +45 -0
  574. package/dist/op/local-executor.js +1164 -0
  575. package/dist/op/local-output.js +140 -0
  576. package/dist/op/op-ir.js +317 -0
  577. package/dist/op/op-verb-class.js +131 -0
  578. package/dist/op/op-waves-notify.js +136 -0
  579. package/dist/op/op-waves-run.d.ts +1 -1
  580. package/dist/op/op-waves-run.d.ts.map +1 -1
  581. package/dist/op/op-waves-run.js +1657 -0
  582. package/dist/op/op-waves.js +409 -0
  583. package/dist/op/operator.js +743 -0
  584. package/dist/op/receipt-store.js +94 -0
  585. package/dist/op/resource.js +23 -0
  586. package/dist/op/run-context.js +28 -0
  587. package/dist/op/run-live.js +256 -0
  588. package/dist/op/runtime.js +21 -0
  589. package/dist/op/runtimes/local.js +195 -0
  590. package/dist/op/source-archive.js +131 -0
  591. package/dist/op/step-output-ref.js +397 -0
  592. package/dist/op/steward-beside.js +169 -0
  593. package/dist/op/steward-points.js +138 -0
  594. package/dist/op/steward-turn.js +59 -0
  595. package/dist/op/steward.js +317 -0
  596. package/dist/op/types.js +25 -0
  597. package/dist/op/work-lease-decl.js +81 -0
  598. package/dist/op/work-lease-run.js +393 -0
  599. package/dist/override-gate.js +284 -0
  600. package/dist/owner-chain.js +74 -0
  601. package/dist/ownership.js +92 -0
  602. package/dist/params.js +61 -0
  603. package/dist/plan-summary.js +711 -0
  604. package/dist/point-decision.js +211 -0
  605. package/dist/pr-forge.js +810 -0
  606. package/dist/pr-loop.js +203 -0
  607. package/dist/project-codegen.js +191 -0
  608. package/dist/project-root.js +74 -0
  609. package/dist/project-validation.js +50 -0
  610. package/dist/provenance.js +157 -0
  611. package/dist/pseudo-parameter.js +40 -0
  612. package/dist/reconcile.js +450 -0
  613. package/dist/resource-attributes.js +33 -0
  614. package/dist/runtime-adapter.js +77 -0
  615. package/dist/runtime.js +66 -0
  616. package/dist/secret-materialization.js +153 -0
  617. package/dist/secret-provenance.js +250 -0
  618. package/dist/serializer-walker.js +112 -0
  619. package/dist/serializer.js +1 -0
  620. package/dist/sort.js +45 -0
  621. package/dist/stack-output.js +115 -0
  622. package/dist/telemetry-attribution.js +149 -0
  623. package/dist/terraform/__fixtures__/build-graph.js +63 -0
  624. package/dist/terraform/adopt-state.js +40 -0
  625. package/dist/terraform/aws-resources.js +384 -0
  626. package/dist/terraform/bridge.js +204 -0
  627. package/dist/terraform/carve-provider.js +155 -0
  628. package/dist/terraform/carve.js +138 -0
  629. package/dist/terraform/data-source-shape.js +57 -0
  630. package/dist/terraform/emit-source.js +36 -0
  631. package/dist/terraform/excise.js +123 -0
  632. package/dist/terraform/graduate.js +128 -0
  633. package/dist/terraform/graph.js +435 -0
  634. package/dist/terraform/hcl2json.js +60 -0
  635. package/dist/terraform/manifest.js +149 -0
  636. package/dist/terraform/parse.js +81 -0
  637. package/dist/terraform/providers/aws.js +146 -0
  638. package/dist/terraform/providers/gcp.js +294 -0
  639. package/dist/terraform/providers/index.js +17 -0
  640. package/dist/terraform/providers/kubernetes.js +253 -0
  641. package/dist/terraform/score.js +151 -0
  642. package/dist/terraform/state.js +67 -0
  643. package/dist/terraform/tier-map.js +74 -0
  644. package/dist/terraform/types.js +13 -0
  645. package/dist/terraform/unified-diff.js +132 -0
  646. package/dist/testing.js +295 -0
  647. package/dist/toml-emit.js +153 -0
  648. package/dist/toml-parse.js +355 -0
  649. package/dist/toml-utils.js +60 -0
  650. package/dist/toml.js +428 -0
  651. package/dist/ts-loader.d.ts +46 -0
  652. package/dist/ts-loader.d.ts.map +1 -0
  653. package/dist/ts-loader.js +103 -0
  654. package/dist/types.js +1 -0
  655. package/dist/utils.js +61 -0
  656. package/dist/validation.js +20 -0
  657. package/dist/vendor/js-yaml-load.js +1662 -0
  658. package/dist/workspace/__fixtures__/contract-repo.js +103 -0
  659. package/dist/workspace/__fixtures__/decide-workspace.js +112 -0
  660. package/dist/workspace/__fixtures__/sessions.js +91 -0
  661. package/dist/workspace/__fixtures__/two-member-workspace.js +34 -0
  662. package/dist/workspace/agent-cli.js +99 -0
  663. package/dist/workspace/agent.schema.json +390 -0
  664. package/dist/workspace/answers-ledger.js +89 -0
  665. package/dist/workspace/box-cli.js +142 -0
  666. package/dist/workspace/box-factory-write.js +196 -0
  667. package/dist/workspace/box-factory-write.schema.json +342 -0
  668. package/dist/workspace/box-factory.js +88 -0
  669. package/dist/workspace/box-intent.js +126 -0
  670. package/dist/workspace/box-isolation.js +169 -0
  671. package/dist/workspace/box-listing-write.schema.json +204 -0
  672. package/dist/workspace/box-listing.js +298 -0
  673. package/dist/workspace/box-publish.js +352 -0
  674. package/dist/workspace/box-publish.schema.json +498 -0
  675. package/dist/workspace/box-services.js +39 -0
  676. package/dist/workspace/broker-protocol.js +359 -0
  677. package/dist/workspace/broker-protocol.schema.json +228 -0
  678. package/dist/workspace/change-set.schema.json +460 -0
  679. package/dist/workspace/changes-cli.js +56 -0
  680. package/dist/workspace/changes.js +446 -0
  681. package/dist/workspace/changes.schema.json +642 -0
  682. package/dist/workspace/chant-migrations/chud-lexicon-exit-fly-site.js +198 -0
  683. package/dist/workspace/chant-migrations/chud-lexicon-exit-live-names.js +155 -0
  684. package/dist/workspace/chant-migrations/chud-lexicon-exit-rollback.js +214 -0
  685. package/dist/workspace/chant-migrations/chud-lexicon-exit-ship-inputs.js +180 -0
  686. package/dist/workspace/chant-migrations/chud-lexicon-exit-ship-policy.js +99 -0
  687. package/dist/workspace/chant-migrations/chud-lexicon-exit.js +847 -0
  688. package/dist/workspace/chant-migrations.js +113 -0
  689. package/dist/workspace/check.schema.json +433 -0
  690. package/dist/workspace/checks/box-isolation.js +62 -0
  691. package/dist/workspace/checks/boxes.js +491 -0
  692. package/dist/workspace/checks/diagrams.js +104 -0
  693. package/dist/workspace/checks/generated.js +419 -0
  694. package/dist/workspace/checks/ledgers.js +212 -0
  695. package/dist/workspace/checks/links.js +191 -0
  696. package/dist/workspace/checks/live.js +100 -0
  697. package/dist/workspace/checks/pipelines.js +188 -0
  698. package/dist/workspace/checks/records.js +169 -0
  699. package/dist/workspace/checks.js +426 -0
  700. package/dist/workspace/ci-green-cli.js +125 -0
  701. package/dist/workspace/ci-green-forge.js +83 -0
  702. package/dist/workspace/ci-green-workflow.js +199 -0
  703. package/dist/workspace/ci-green.js +325 -0
  704. package/dist/workspace/ci-last-green.schema.json +158 -0
  705. package/dist/workspace/compose-graph.js +235 -0
  706. package/dist/workspace/compose-reports.js +146 -0
  707. package/dist/workspace/composites.js +264 -0
  708. package/dist/workspace/composites.schema.json +617 -0
  709. package/dist/workspace/conformance/__fixture__/app/package.json +7 -0
  710. package/dist/workspace/conformance/__fixture__/app/src/server.mjs +29 -0
  711. package/dist/workspace/conformance/__fixture__/decisions/decision.kind.mjs +54 -0
  712. package/dist/workspace/conformance/__fixture__/decisions/decision.schema.json +512 -0
  713. package/dist/workspace/conformance/__fixture__/decisions/fix-001-how-the-app-is-deployed.md +40 -0
  714. package/dist/workspace/conformance/__fixture__/delivery/chant.config.ts +7 -0
  715. package/dist/workspace/conformance/__fixture__/delivery/lexicon/index.ts +26 -0
  716. package/dist/workspace/conformance/__fixture__/delivery/package.json +7 -0
  717. package/dist/workspace/conformance/__fixture__/delivery/src/app.component.ts +14 -0
  718. package/dist/workspace/conformance/__fixture__/delivery/src/app.ts +4 -0
  719. package/dist/workspace/conformance/__fixtures__/reference-broker.js +205 -0
  720. package/dist/workspace/conformance/__writer_fixture__/answers/answer.kind.mjs +32 -0
  721. package/dist/workspace/conformance/__writer_fixture__/answers/answer.schema.json +135 -0
  722. package/dist/workspace/conformance/__writer_fixture__/contracts/contract.kind.mjs +37 -0
  723. package/dist/workspace/conformance/__writer_fixture__/contracts/contract.schema.json +213 -0
  724. package/dist/workspace/conformance/__writer_fixture__/decisions/points.json +228 -0
  725. package/dist/workspace/conformance/__writer_fixture__/drivers/driver.kind.mjs +15 -0
  726. package/dist/workspace/conformance/__writer_fixture__/drivers/driver.schema.json +38 -0
  727. package/dist/workspace/conformance/__writer_fixture__/sessions/session.kind.mjs +54 -0
  728. package/dist/workspace/conformance/__writer_fixture__/sessions/session.schema.json +289 -0
  729. package/dist/workspace/conformance/__writer_fixture__/work/W-001-the-writer-suite-works-this-item.md +25 -0
  730. package/dist/workspace/conformance/__writer_fixture__/work/work.kind.mjs +60 -0
  731. package/dist/workspace/conformance/__writer_fixture__/work/work.schema.json +603 -0
  732. package/dist/workspace/conformance/broker.js +736 -0
  733. package/dist/workspace/conformance/index.js +673 -0
  734. package/dist/workspace/conformance/vitest.js +108 -0
  735. package/dist/workspace/conformance/writer.js +1080 -0
  736. package/dist/workspace/decide.js +879 -0
  737. package/dist/workspace/decision-points.schema.json +135 -135
  738. package/dist/workspace/declaration-write-cli.js +74 -0
  739. package/dist/workspace/declaration-write.js +238 -0
  740. package/dist/workspace/declaration.js +938 -0
  741. package/dist/workspace/declaration.schema.json +1413 -1413
  742. package/dist/workspace/declared-kinds.js +106 -0
  743. package/dist/workspace/environments.js +164 -0
  744. package/dist/workspace/evidence.schema.json +279 -0
  745. package/dist/workspace/export-cli.js +185 -0
  746. package/dist/workspace/export.js +499 -0
  747. package/dist/workspace/factory-rules.js +175 -0
  748. package/dist/workspace/generated-files.js +92 -0
  749. package/dist/workspace/glob.js +45 -0
  750. package/dist/workspace/graph-cache.js +352 -0
  751. package/dist/workspace/graph-cli.js +348 -0
  752. package/dist/workspace/graph.schema.json +1338 -0
  753. package/dist/workspace/identity-gate-rule.d.ts +65 -0
  754. package/dist/workspace/identity-gate-rule.d.ts.map +1 -0
  755. package/dist/workspace/identity-gate-rule.js +75 -0
  756. package/dist/workspace/identity.d.ts +4 -2
  757. package/dist/workspace/identity.d.ts.map +1 -1
  758. package/dist/workspace/identity.js +126 -0
  759. package/dist/workspace/import.js +283 -0
  760. package/dist/workspace/init.js +620 -0
  761. package/dist/workspace/intent-cli.js +263 -0
  762. package/dist/workspace/intent-joins.js +201 -0
  763. package/dist/workspace/intent-record.js +352 -0
  764. package/dist/workspace/intent-record.schema.json +864 -0
  765. package/dist/workspace/intent.js +1582 -0
  766. package/dist/workspace/intent.schema.json +2420 -0
  767. package/dist/workspace/json-edit.js +221 -0
  768. package/dist/workspace/jsonc.js +235 -0
  769. package/dist/workspace/kind-readers.js +103 -0
  770. package/dist/workspace/kinds.js +587 -0
  771. package/dist/workspace/lexicon-symbols.js +112 -0
  772. package/dist/workspace/lineage-adopt-cli.js +102 -0
  773. package/dist/workspace/lineage-adopt.js +360 -0
  774. package/dist/workspace/lineage-check.js +282 -0
  775. package/dist/workspace/lineage-cli.js +121 -0
  776. package/dist/workspace/lineage-hash-index.js +284 -0
  777. package/dist/workspace/lineage-init.js +507 -0
  778. package/dist/workspace/lineage-lock.js +387 -0
  779. package/dist/workspace/lineage-merge.js +45 -0
  780. package/dist/workspace/lineage-migrations.d.ts.map +1 -1
  781. package/dist/workspace/lineage-migrations.js +329 -0
  782. package/dist/workspace/lineage-provenance.js +36 -0
  783. package/dist/workspace/lineage-update.js +138 -0
  784. package/dist/workspace/lineage-upgrade-cli.js +131 -0
  785. package/dist/workspace/lineage-upgrade.js +889 -0
  786. package/dist/workspace/lineage-vendor.js +171 -0
  787. package/dist/workspace/lineage-version.js +128 -0
  788. package/dist/workspace/lineage-versions.js +275 -0
  789. package/dist/workspace/links.js +330 -0
  790. package/dist/workspace/ls-generated.js +95 -0
  791. package/dist/workspace/ls.js +277 -0
  792. package/dist/workspace/ls.schema.json +333 -0
  793. package/dist/workspace/member-commands.js +508 -0
  794. package/dist/workspace/member-handles.js +216 -0
  795. package/dist/workspace/member-pipeline.js +258 -0
  796. package/dist/workspace/member-run.js +117 -0
  797. package/dist/workspace/member-write.schema.json +193 -0
  798. package/dist/workspace/nested-graph.js +156 -0
  799. package/dist/workspace/nesting.js +38 -0
  800. package/dist/workspace/patch.js +301 -0
  801. package/dist/workspace/patch.schema.json +321 -0
  802. package/dist/workspace/pin-cli.js +55 -0
  803. package/dist/workspace/pin-integrity.js +100 -0
  804. package/dist/workspace/plan-summary.schema.json +155 -0
  805. package/dist/workspace/point-answer.schema.json +129 -129
  806. package/dist/workspace/points-cli.js +291 -0
  807. package/dist/workspace/points-write.schema.json +660 -0
  808. package/dist/workspace/points.js +521 -0
  809. package/dist/workspace/points.schema.json +916 -0
  810. package/dist/workspace/pr-report.schema.json +108 -0
  811. package/dist/workspace/principal-classes.d.ts +3 -14
  812. package/dist/workspace/principal-classes.d.ts.map +1 -1
  813. package/dist/workspace/principal-classes.js +245 -0
  814. package/dist/workspace/reason-codes.js +326 -0
  815. package/dist/workspace/record-assets.js +151 -0
  816. package/dist/workspace/record-decided.js +105 -0
  817. package/dist/workspace/record-sessions.js +96 -0
  818. package/dist/workspace/record-source.js +114 -0
  819. package/dist/workspace/records-amend.schema.json +284 -0
  820. package/dist/workspace/records-checkout.js +76 -0
  821. package/dist/workspace/records-cli.js +707 -0
  822. package/dist/workspace/records-close.js +116 -0
  823. package/dist/workspace/records-close.schema.json +278 -0
  824. package/dist/workspace/records-new.schema.json +202 -0
  825. package/dist/workspace/records-review.schema.json +367 -0
  826. package/dist/workspace/records-since.js +317 -0
  827. package/dist/workspace/records-since.schema.json +218 -0
  828. package/dist/workspace/records-write.js +1229 -0
  829. package/dist/workspace/records.js +1345 -0
  830. package/dist/workspace/records.schema.json +604 -0
  831. package/dist/workspace/reference-kinds/app/package.json +10 -0
  832. package/dist/workspace/reference-kinds/app/workspace-kinds.json +45 -0
  833. package/dist/workspace/returns.js +303 -0
  834. package/dist/workspace/root-refusal.js +75 -0
  835. package/dist/workspace/run-statement.schema.json +622 -0
  836. package/dist/workspace/runs-cli.js +584 -0
  837. package/dist/workspace/runs-write.schema.json +994 -0
  838. package/dist/workspace/runs.js +708 -0
  839. package/dist/workspace/runs.schema.json +1257 -0
  840. package/dist/workspace/runtimes.js +76 -0
  841. package/dist/workspace/session-kinds.js +83 -0
  842. package/dist/workspace/signers.schema.json +206 -0
  843. package/dist/workspace/source-block.js +125 -0
  844. package/dist/workspace/squash.js +177 -0
  845. package/dist/workspace/status-gates.js +162 -0
  846. package/dist/workspace/status-stewards.js +330 -0
  847. package/dist/workspace/status.js +514 -0
  848. package/dist/workspace/status.schema.json +998 -0
  849. package/dist/workspace/steward-index.js +191 -0
  850. package/dist/workspace/symbols.js +188 -0
  851. package/dist/workspace/template-manifest.js +227 -0
  852. package/dist/workspace/template-pins.js +115 -0
  853. package/dist/workspace/trailer-joins.js +65 -0
  854. package/dist/workspace/trailers.js +111 -0
  855. package/dist/workspace/tree.js +136 -0
  856. package/dist/workspace/trust/attestor.js +63 -0
  857. package/dist/workspace/trust/dsse.js +108 -0
  858. package/dist/workspace/trust/evidence-cli.js +175 -0
  859. package/dist/workspace/trust/evidence.js +161 -0
  860. package/dist/workspace/trust/gate-seal.js +226 -0
  861. package/dist/workspace/trust/policy.js +190 -0
  862. package/dist/workspace/trust/provenance.js +180 -0
  863. package/dist/workspace/trust/rotation.js +298 -0
  864. package/dist/workspace/trust/run-commits.js +101 -0
  865. package/dist/workspace/trust/run-statement.js +182 -0
  866. package/dist/workspace/trust/seal.js +272 -0
  867. package/dist/workspace/trust/signers-cli.js +152 -0
  868. package/dist/workspace/trust/ssh-commit.js +178 -0
  869. package/dist/workspace/trust/test-repo.js +118 -0
  870. package/dist/workspace/trust/trust-files.js +193 -0
  871. package/dist/workspace/trust/verify-cli.js +63 -0
  872. package/dist/workspace/trust/verify.js +192 -0
  873. package/dist/workspace/which-chant.js +141 -0
  874. package/dist/workspace/wip-cli.js +95 -0
  875. package/dist/workspace/wip-write.schema.json +504 -0
  876. package/dist/workspace/wip.js +631 -0
  877. package/dist/workspace/wip.schema.json +334 -0
  878. package/dist/workspace/work-cli.js +448 -0
  879. package/dist/workspace/work-evidence.js +122 -0
  880. package/dist/workspace/work-evidence.schema.json +222 -0
  881. package/dist/workspace/work-history.schema.json +421 -0
  882. package/dist/workspace/work-lease.schema.json +246 -0
  883. package/dist/workspace/work-size.js +77 -0
  884. package/dist/workspace/work.js +283 -0
  885. package/dist/workspace/workspace-kinds.schema.json +259 -259
  886. package/dist/workspace/workspace-principals.schema.json +53 -53
  887. package/dist/workspace/write-lock-cli.js +105 -0
  888. package/dist/workspace/write-lock.js +424 -0
  889. package/dist/workspace/write-lock.schema.json +172 -0
  890. package/dist/workspace/write-scope.js +484 -0
  891. package/dist/yaml.js +459 -0
  892. package/package.json +2 -2
  893. package/src/cli/commands/check-lexicon-plugin.ts +2 -0
  894. package/src/cli/commands/lint.ts +36 -6
  895. package/src/cli/commands/migrate.ts +2 -0
  896. package/src/cli/compiled-cli.e2e.test.ts +165 -0
  897. package/src/cli/main.ts +121 -27
  898. package/src/cli/mcp/workspace-tools.ts +1 -1
  899. package/src/codegen/pinned-upgrade.ts +2 -0
  900. package/src/components/discover.ts +2 -0
  901. package/src/components/sandbox/driver.ts +3 -1
  902. package/src/config-import.ts +3 -0
  903. package/src/discovery/fold-import.ts +23 -14
  904. package/src/discovery/import.ts +2 -0
  905. package/src/discovery/sandbox/driver.ts +3 -1
  906. package/src/gate-decision-bundle.test.ts +3 -2
  907. package/src/gate-decision-identity.test.ts +176 -0
  908. package/src/gate-decision.ts +100 -22
  909. package/src/lexicon-module.ts +3 -0
  910. package/src/lifecycle/gate-ledger.ts +8 -0
  911. package/src/lint/config.ts +1 -1
  912. package/src/lint/discover.ts +28 -8
  913. package/src/lint/policy-import.ts +4 -1
  914. package/src/lint/rule-loader.ts +2 -0
  915. package/src/op/discover.ts +3 -0
  916. package/src/op/op-waves-point.test.ts +1 -0
  917. package/src/op/op-waves-run.ts +5 -4
  918. package/src/op/op-waves.test.ts +14 -0
  919. package/src/ts-loader.test.ts +23 -0
  920. package/src/ts-loader.ts +122 -0
  921. package/src/workspace/chant-migrations/chud-lexicon-exit.ts +1 -1
  922. package/src/workspace/declaration.ts +1 -1
  923. package/src/workspace/identity-gate-rule.ts +109 -0
  924. package/src/workspace/identity.ts +8 -18
  925. package/src/workspace/kinds.ts +1 -1
  926. package/src/workspace/lineage-migrations.ts +2 -0
  927. package/src/workspace/points.ts +1 -1
  928. package/src/workspace/principal-classes.ts +5 -30
@@ -0,0 +1,266 @@
1
+ /**
2
+ * The observation contract (#1089) — what a lexicon's `describeResources()`
3
+ * is allowed to mean.
4
+ *
5
+ * Before this module there were two ways for an observation to return nothing
6
+ * for a declared entity and no way to tell them apart:
7
+ *
8
+ * 1. The provider was asked and said the resource does not exist.
9
+ * 2. The lexicon never looked — no reader for that kind, the read errored,
10
+ * no credentials, no cluster/subscription binding.
11
+ *
12
+ * Both arrived at the change set as "absent", and absent + declared classifies
13
+ * as `create`. So `chant lifecycle plan` proposed creating a Kubernetes CRD
14
+ * that already existed in the cluster, with nothing in the plan to say the tool
15
+ * had simply not looked (a warn on stderr is not a signal in a change set).
16
+ *
17
+ * The contract is a tri-state, per declared entity:
18
+ *
19
+ * - **OBSERVED-PRESENT** — a key in `resources`. The provider returned it.
20
+ * - **OBSERVED-ABSENT** — in neither map. The lexicon looked and the provider
21
+ * reported it missing. This is the only shape that may become a `create`.
22
+ * - **NOT-OBSERVED** — a key in `unobserved`, carrying a total
23
+ * {@link UnobservedReason}. Never a `create`, never a `delete`; consumers
24
+ * surface it and stop.
25
+ *
26
+ * Compatibility: `describeResources()` may still return the bare
27
+ * `name → ResourceMetadata` map it always did — that means "everything I was
28
+ * asked about, I looked at" and normalizes to an empty `unobserved`. Reporting
29
+ * NOT-OBSERVED requires the explicitly versioned {@link ObservationResult}
30
+ * envelope, which is discriminated by its literal `observation: "v1"` field (a
31
+ * bare map's value at any key is a `ResourceMetadata` object, never that
32
+ * string, so the two shapes can never be confused).
33
+ */
34
+ /**
35
+ * Every legal {@link UnobservedReason}, for validation and conformance checks.
36
+ *
37
+ * Derived from a witness keyed off the union rather than written out beside it
38
+ * (chant#2366). A hand-maintained array is only ever checked for holding legal
39
+ * members, never for holding ALL of them, so a reason added to the type left
40
+ * the array silently short — `tsc` clean, every observation test green, and a
41
+ * value the type permits that `observation-conformance.ts` refuses. A lexicon
42
+ * could construct a value its own suite rejected.
43
+ *
44
+ * Keying a `Record` off the union makes the omission a compile error at the
45
+ * point of the omission. This is the construction #2365 applied to all four
46
+ * closed sets in `./behaviour.ts`; `BEHAVIOUR_UNPREDICTED_REASONS` derives from
47
+ * this very type, so that module was already protected against a change here
48
+ * while this module was not.
49
+ */
50
+ const UNOBSERVED_REASON_WITNESS = {
51
+ "read-failed": true,
52
+ "no-credentials": true,
53
+ "no-binding": true,
54
+ "unsupported-kind": true,
55
+ filtered: true,
56
+ };
57
+ export const UNOBSERVED_REASONS = Object.keys(UNOBSERVED_REASON_WITNESS);
58
+ /** True when `value` is a legal {@link UnobservedReason}. */
59
+ export function isUnobservedReason(value) {
60
+ return typeof value === "string" && UNOBSERVED_REASONS.includes(value);
61
+ }
62
+ /** True when `value` is the versioned {@link ObservationResult} envelope. */
63
+ export function isObservationResult(value) {
64
+ return (typeof value === "object" &&
65
+ value !== null &&
66
+ value.observation === "v1");
67
+ }
68
+ /**
69
+ * Build an {@link ObservationResult}. Lexicons use this rather than writing the
70
+ * discriminant by hand.
71
+ */
72
+ export function observation(resources, unobserved, queried, notes, stackExports, sources) {
73
+ return {
74
+ observation: "v1",
75
+ resources,
76
+ ...(unobserved && Object.keys(unobserved).length > 0 ? { unobserved } : {}),
77
+ ...(queried && Object.keys(queried).length > 0 ? { queried } : {}),
78
+ ...(sources && Object.keys(sources).length > 0 ? { sources } : {}),
79
+ ...(notes && notes.length > 0 ? { notes } : {}),
80
+ ...(stackExports && Object.keys(stackExports).length > 0 ? { stackExports } : {}),
81
+ };
82
+ }
83
+ /**
84
+ * Normalize either accepted return shape. `undefined` (a lexicon that returned
85
+ * nothing at all) normalizes to two empty maps — which reads as "everything was
86
+ * observed absent", so callers that mean "the read failed" must say so with
87
+ * {@link unobservedAll} rather than returning nothing.
88
+ */
89
+ export function normalizeObservation(value) {
90
+ if (!value)
91
+ return { resources: {}, unobserved: {}, queried: {}, sources: {}, notes: [] };
92
+ if (isObservationResult(value)) {
93
+ return {
94
+ resources: value.resources ?? {},
95
+ unobserved: value.unobserved ?? {},
96
+ queried: value.queried ?? {},
97
+ sources: value.sources ?? {},
98
+ notes: [...new Set(value.notes ?? [])],
99
+ ...(value.stackExports && Object.keys(value.stackExports).length > 0 ? { stackExports: value.stackExports } : {}),
100
+ };
101
+ }
102
+ return { resources: value, unobserved: {}, queried: {}, sources: {}, notes: [] };
103
+ }
104
+ /**
105
+ * Mark every named entity NOT-OBSERVED with one reason — the whole-lexicon
106
+ * failure case (the provider CLI is missing, the cluster binding refused, the
107
+ * credentials are gone). Core applies this when `describeResources()` throws,
108
+ * so a thrown read degrades to an honest "did not look" for each declared
109
+ * entity instead of an empty map that classifies as N creates.
110
+ */
111
+ export function unobservedAll(names, reason, detail, types) {
112
+ const typeOf = (name) => {
113
+ if (!types)
114
+ return undefined;
115
+ if (types instanceof Map)
116
+ return types.get(name)?.entityType;
117
+ return types[name];
118
+ };
119
+ const out = {};
120
+ for (const name of names) {
121
+ const type = typeOf(name);
122
+ out[name] = { reason, ...(type ? { type } : {}), ...(detail ? { detail } : {}) };
123
+ }
124
+ return out;
125
+ }
126
+ /**
127
+ * Union several observations of the same lexicon (the multi-stack read, where
128
+ * `describeResources` runs once per stack). Precedence is
129
+ * present > not-observed > absent: a resource found in any stack is present; an
130
+ * entity nobody could look at stays not-observed; an entity every reader looked
131
+ * for and did not find is absent.
132
+ */
133
+ export function mergeObservations(parts) {
134
+ const resources = {};
135
+ const unobserved = {};
136
+ const queried = {};
137
+ // Which read answered (#2267) merges the same way `queried` does: it is a
138
+ // fact about one entity's read, and the parts being merged are reads of
139
+ // disjoint entity sets (one per stack, or per terraform root).
140
+ const sources = {};
141
+ // A note is about the read, not a stack; four stacks saying the same thing
142
+ // is one note (#1265).
143
+ const notes = new Set();
144
+ const stackExports = {};
145
+ for (const part of parts) {
146
+ Object.assign(resources, part.resources);
147
+ Object.assign(unobserved, part.unobserved);
148
+ Object.assign(queried, part.queried);
149
+ Object.assign(sources, part.sources);
150
+ for (const n of part.notes)
151
+ notes.add(n);
152
+ Object.assign(stackExports, part.stackExports ?? {});
153
+ }
154
+ // Present wins: a stack that could not be read does not un-observe a resource
155
+ // another stack returned.
156
+ for (const name of Object.keys(resources))
157
+ delete unobserved[name];
158
+ return {
159
+ resources,
160
+ unobserved,
161
+ queried,
162
+ sources,
163
+ notes: [...notes],
164
+ ...(Object.keys(stackExports).length > 0 ? { stackExports } : {}),
165
+ };
166
+ }
167
+ /** One-line human phrasing of a reason, for CLI output. */
168
+ export function unobservedReasonText(reason) {
169
+ switch (reason) {
170
+ case "read-failed":
171
+ return "read failed";
172
+ case "no-credentials":
173
+ return "no credentials";
174
+ case "no-binding":
175
+ return "no binding for this environment";
176
+ case "unsupported-kind":
177
+ return "no reader for this resource kind";
178
+ case "filtered":
179
+ return "withheld by the --owned filter";
180
+ }
181
+ }
182
+ /** `name — reason (detail) [queried address]`, the shared rendering for CLI and plan output. */
183
+ export function formatUnobserved(name, entry) {
184
+ const base = `${name}${entry.type ? ` (${entry.type})` : ""} — ${unobservedReasonText(entry.reason)}`;
185
+ const detailed = entry.detail ? `${base}: ${entry.detail}` : base;
186
+ return entry.queried ? `${detailed} [queried ${entry.queried}]` : detailed;
187
+ }
188
+ /** Default concurrency for {@link boundedConcurrently} when a transport ships no pool. */
189
+ export const DEFAULT_OBSERVE_CONCURRENCY = 16;
190
+ /**
191
+ * Run `fn` over `items` with at most `limit` in flight. A rejected `fn` rejects
192
+ * the whole run (the harness wraps per-entity reads so this stays for genuinely
193
+ * unexpected faults).
194
+ */
195
+ export async function boundedConcurrently(items, fn, limit = DEFAULT_OBSERVE_CONCURRENCY) {
196
+ const queue = [...items];
197
+ const size = Math.max(1, Math.min(limit, queue.length || 1));
198
+ const workers = Array.from({ length: size }, async () => {
199
+ for (;;) {
200
+ const next = queue.shift();
201
+ if (next === undefined)
202
+ return;
203
+ await fn(next);
204
+ }
205
+ });
206
+ await Promise.all(workers);
207
+ }
208
+ /**
209
+ * The shared observer control flow (#1201). Binds via the adapter, reads every
210
+ * declared entity concurrently, and assembles the tri-state {@link ObservationResult}.
211
+ *
212
+ * A `bind()` throw becomes NOT-OBSERVED for every entity (typed by
213
+ * {@link ObserverAdapter.classifyBindFailure}) unless the adapter asks to
214
+ * rethrow. A per-entity `read()` throw the adapter did not itself map becomes
215
+ * `read-failed` for that one entity — never a silent absence, which would
216
+ * classify as a spurious `create`.
217
+ */
218
+ export async function observeEntities(declared, adapter) {
219
+ const typesByName = {};
220
+ for (const d of declared)
221
+ typesByName[d.name] = d.type;
222
+ let client;
223
+ try {
224
+ client = await adapter.bind();
225
+ }
226
+ catch (err) {
227
+ const verdict = adapter.classifyBindFailure(err);
228
+ if (verdict === "rethrow")
229
+ throw err;
230
+ return observation({}, unobservedAll(declared.map((d) => d.name), verdict.reason, verdict.detail, typesByName));
231
+ }
232
+ const resources = {};
233
+ const unobserved = {};
234
+ const queried = {};
235
+ const run = adapter.concurrently ?? ((items, fn) => boundedConcurrently(items, fn));
236
+ await run(declared, async (entity) => {
237
+ let result;
238
+ try {
239
+ result = await adapter.read(client, entity);
240
+ }
241
+ catch (err) {
242
+ result = {
243
+ unobserved: {
244
+ reason: "read-failed",
245
+ detail: err instanceof Error ? err.message : String(err),
246
+ },
247
+ };
248
+ }
249
+ if (result.queried)
250
+ queried[entity.name] = result.queried;
251
+ if ("present" in result) {
252
+ resources[entity.name] = result.present;
253
+ }
254
+ else if ("unobserved" in result) {
255
+ unobserved[entity.name] = {
256
+ type: entity.type,
257
+ ...result.unobserved,
258
+ ...(result.queried ? { queried: result.queried } : {}),
259
+ };
260
+ }
261
+ // `absent`: the verdict records nothing — in neither map is how the
262
+ // contract spells absence — but its address, when the adapter supplied
263
+ // one, lands in `queried` (#1620) so the absence can explain itself.
264
+ });
265
+ return observation(resources, unobserved, queried);
266
+ }
@@ -0,0 +1,134 @@
1
+ import { readdir, readFile } from "node:fs/promises";
2
+ import { existsSync } from "node:fs";
3
+ import { join, relative, sep } from "node:path";
4
+ import { splitFrontmatter } from "./okf.js";
5
+ import { parseYAML } from "./yaml.js";
6
+ /**
7
+ * OKF bundle reader (#1864, design #1059, epic #1057) — the input half of
8
+ * `./okf.ts`'s emitter: loads a project-authored knowledge bundle from disk
9
+ * and binds its concepts to discovered entities.
10
+ *
11
+ * Tolerant to the letter of the OKF v0.2 spec (§11), the same posture
12
+ * `okfConformanceProblems` enforces on the emit side: unknown `type` values
13
+ * and extra frontmatter keys pass through untouched, a file with unparseable
14
+ * or missing frontmatter is skipped with a warning, and nothing here ever
15
+ * rejects the bundle — a missing knowledge directory included.
16
+ */
17
+ const RESERVED_OKF_FILES = new Set(["index.md", "log.md"]);
18
+ /** `binds` accepts one name or a list (#1059); anything else is treated as "no binding" rather than rejecting the concept. */
19
+ function normalizeBinds(value) {
20
+ if (typeof value === "string")
21
+ return value.length > 0 ? [value] : [];
22
+ if (Array.isArray(value))
23
+ return value.filter((v) => typeof v === "string" && v.length > 0);
24
+ return [];
25
+ }
26
+ /** Recursively collect every `.md` file under `dir`, as bundle-relative (forward-slash) paths paired with their absolute path. */
27
+ async function findMarkdownFiles(dir) {
28
+ const found = [];
29
+ async function scan(current) {
30
+ let entries;
31
+ try {
32
+ entries = await readdir(current, { withFileTypes: true });
33
+ }
34
+ catch {
35
+ return; // unreadable directory: silently skip, same posture as findInfraFiles
36
+ }
37
+ for (const entry of entries) {
38
+ const fullPath = join(current, entry.name);
39
+ if (entry.isDirectory()) {
40
+ await scan(fullPath);
41
+ }
42
+ else if (entry.isFile() && entry.name.endsWith(".md")) {
43
+ const relPath = relative(dir, fullPath).split(sep).join("/");
44
+ found.push({ relPath, fullPath });
45
+ }
46
+ }
47
+ }
48
+ await scan(dir);
49
+ return found;
50
+ }
51
+ /**
52
+ * Load every authored concept from an OKF knowledge bundle directory.
53
+ * `index.md`/`log.md` are skipped (reserved, by basename, at any depth —
54
+ * matching `okfConformanceProblems`'s check on the emit side). A directory
55
+ * that does not exist yields an empty bundle, not an error: the #1059 design
56
+ * treats a missing `knowledge/` as "this project has none yet," the same
57
+ * posture as a project with no lexicons configured.
58
+ *
59
+ * A file that fails to parse — no frontmatter block, unparseable YAML, or
60
+ * frontmatter that isn't a mapping — is skipped with a `console.warn` and
61
+ * does not affect any other file. Nothing here throws.
62
+ */
63
+ export async function loadOkfBundle(dir) {
64
+ if (!existsSync(dir))
65
+ return { concepts: [] };
66
+ const concepts = [];
67
+ for (const { relPath, fullPath } of await findMarkdownFiles(dir)) {
68
+ if (RESERVED_OKF_FILES.has(relPath.split("/").pop()))
69
+ continue;
70
+ let content;
71
+ try {
72
+ content = await readFile(fullPath, "utf8");
73
+ }
74
+ catch {
75
+ console.warn(`[chant] warning: knowledge bundle concept "${relPath}" could not be read, skipping`);
76
+ continue;
77
+ }
78
+ const split = splitFrontmatter(content);
79
+ if (!split) {
80
+ console.warn(`[chant] warning: knowledge bundle concept "${relPath}" has no frontmatter block, skipping`);
81
+ continue;
82
+ }
83
+ let parsed;
84
+ try {
85
+ parsed = parseYAML(split.frontmatter);
86
+ }
87
+ catch {
88
+ console.warn(`[chant] warning: knowledge bundle concept "${relPath}" has unparseable frontmatter, skipping`);
89
+ continue;
90
+ }
91
+ if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) {
92
+ console.warn(`[chant] warning: knowledge bundle concept "${relPath}" frontmatter is not a mapping, skipping`);
93
+ continue;
94
+ }
95
+ const frontmatter = parsed;
96
+ concepts.push({
97
+ path: relPath,
98
+ type: typeof frontmatter.type === "string" ? frontmatter.type : "",
99
+ title: typeof frontmatter.title === "string" ? frontmatter.title : undefined,
100
+ binds: normalizeBinds(frontmatter.binds),
101
+ frontmatter,
102
+ body: split.body,
103
+ });
104
+ }
105
+ concepts.sort((a, b) => a.path.localeCompare(b.path));
106
+ return { concepts };
107
+ }
108
+ /**
109
+ * Resolve every concept's `binds` against a project's discovered entities.
110
+ * `entities` is the same shape `./okf.ts`'s emitter takes, `DiscoveryResult`'s
111
+ * own `entities` map — a bare logical name is unambiguous within one
112
+ * discovery pass (#1059's "Rejected options" on binding ambiguity).
113
+ *
114
+ * A concept with no `binds` contributes to neither `bound` nor `unresolved`;
115
+ * an unbound concept is legitimate, not an omission (a runbook, a decision
116
+ * about the project as a whole).
117
+ */
118
+ export function bindConcepts(bundle, entities) {
119
+ const bound = new Map();
120
+ const unresolved = [];
121
+ for (const concept of bundle.concepts) {
122
+ for (const name of concept.binds) {
123
+ if (entities.has(name)) {
124
+ if (!bound.has(name))
125
+ bound.set(name, []);
126
+ bound.get(name).push(concept);
127
+ }
128
+ else {
129
+ unresolved.push({ concept, name });
130
+ }
131
+ }
132
+ }
133
+ return { bound, unresolved };
134
+ }
package/dist/okf.js ADDED
@@ -0,0 +1,275 @@
1
+ import { relative, isAbsolute } from "node:path";
2
+ import { buildGraphIr } from "./graph-ir.js";
3
+ import { isLexiconOutput } from "./lexicon-output.js";
4
+ import { getProvenance } from "./provenance.js";
5
+ import { emitYAML, parseYAML } from "./yaml.js";
6
+ /**
7
+ * OKF bundle emitter (#1058, epic #1057) — projects a discovered entity graph
8
+ * into an Open Knowledge Format v0.2 bundle: a directory of markdown files
9
+ * with YAML frontmatter, per the spec at
10
+ * https://github.com/GoogleCloudPlatform/knowledge-catalog/blob/main/okf/SPEC.md
11
+ *
12
+ * One concept document per entity, `type` carrying the entity's resource type
13
+ * string, dependency edges as bundle-relative markdown links (the form the
14
+ * spec recommends for stability), and a root `index.md` grouping concepts into
15
+ * per-lexicon sections. Emit-only: OKF as project *input* is #1059.
16
+ */
17
+ export const OKF_VERSION = "0.2";
18
+ /** Make an entity or lexicon name safe as a single path segment. */
19
+ export function slug(name) {
20
+ const cleaned = name.replace(/[^A-Za-z0-9._-]/g, "-").replace(/^\.+/, "");
21
+ return cleaned === "" ? "unnamed" : cleaned;
22
+ }
23
+ function relFile(file, projectPath) {
24
+ if (!file)
25
+ return undefined;
26
+ if (projectPath && isAbsolute(file)) {
27
+ const rel = relative(projectPath, file);
28
+ return rel.startsWith("..") ? file : rel;
29
+ }
30
+ return file;
31
+ }
32
+ /**
33
+ * Render a flat frontmatter mapping as a YAML block. Keys with undefined
34
+ * values are dropped; scalar quoting is `emitYAML`'s.
35
+ */
36
+ export function frontmatter(fields) {
37
+ const lines = ["---"];
38
+ for (const [key, value] of Object.entries(fields)) {
39
+ if (value === undefined)
40
+ continue;
41
+ lines.push(`${key}: ${emitYAML(value, 0)}`);
42
+ }
43
+ lines.push("---");
44
+ return lines.join("\n");
45
+ }
46
+ /**
47
+ * Split a concept document into its frontmatter block and body. Returns
48
+ * undefined when the document does not start with a `---` delimited block.
49
+ * Exported for the conformance tests (and any future OKF consumer, #1059).
50
+ */
51
+ export function splitFrontmatter(content) {
52
+ const lines = content.split("\n");
53
+ if (lines[0] !== "---")
54
+ return undefined;
55
+ const end = lines.indexOf("---", 1);
56
+ if (end === -1)
57
+ return undefined;
58
+ return {
59
+ frontmatter: lines.slice(1, end).join("\n"),
60
+ body: lines.slice(end + 1).join("\n"),
61
+ };
62
+ }
63
+ /**
64
+ * Check a bundle against the OKF v0.2 conformance criteria (spec §11) and
65
+ * return every violation found: parseable frontmatter on every non-reserved
66
+ * `.md`, a non-empty `type` everywhere, a well-formed root `index.md`, and
67
+ * generated cross-link entries that are bundle-absolute (or external URLs).
68
+ * Empty result means conformant. Shared by the project-bundle tests (#1058)
69
+ * and every lexicon's bundle tests (#1060).
70
+ */
71
+ export function okfConformanceProblems(files) {
72
+ const problems = [];
73
+ const reserved = new Set(["index.md", "log.md"]);
74
+ const linkTarget = /\]\(([^)]+)\)/g;
75
+ const externalOrAbsolute = (target) => target.startsWith("/") || /^[a-z][a-z0-9+.-]*:/i.test(target);
76
+ for (const file of files) {
77
+ if (!file.path.endsWith(".md"))
78
+ problems.push(`${file.path}: not a markdown file`);
79
+ if (file.path.startsWith("/") || file.path.includes("..")) {
80
+ problems.push(`${file.path}: path is not bundle-relative`);
81
+ }
82
+ if (reserved.has(file.path.split("/").pop()))
83
+ continue;
84
+ const split = splitFrontmatter(file.content);
85
+ if (!split) {
86
+ problems.push(`${file.path}: no frontmatter block`);
87
+ continue;
88
+ }
89
+ let parsed;
90
+ try {
91
+ parsed = parseYAML(split.frontmatter);
92
+ }
93
+ catch {
94
+ problems.push(`${file.path}: unparseable frontmatter`);
95
+ continue;
96
+ }
97
+ if (typeof parsed !== "object" || parsed === null) {
98
+ problems.push(`${file.path}: frontmatter is not a mapping`);
99
+ continue;
100
+ }
101
+ const type = parsed.type;
102
+ if (typeof type !== "string" || type.length === 0) {
103
+ problems.push(`${file.path}: frontmatter has no non-empty type`);
104
+ }
105
+ // Cross-link entries (the "- [name](target)" lines the emitters generate)
106
+ // must point inside the bundle or at an external URL. Broken targets are
107
+ // permitted (not-yet-written knowledge); malformed ones are not. Free-text
108
+ // knowledge bodies may carry arbitrary links and are not checked.
109
+ for (const line of split.body.split("\n")) {
110
+ if (!line.trimStart().startsWith("- ["))
111
+ continue;
112
+ for (const match of line.matchAll(linkTarget)) {
113
+ if (!externalOrAbsolute(match[1])) {
114
+ problems.push(`${file.path}: link target "${match[1]}" is neither bundle-absolute nor external`);
115
+ }
116
+ }
117
+ }
118
+ }
119
+ const index = files.find((f) => f.path === "index.md");
120
+ if (!index) {
121
+ problems.push("bundle has no root index.md");
122
+ return problems;
123
+ }
124
+ const split = splitFrontmatter(index.content);
125
+ if (!split) {
126
+ problems.push("index.md: no frontmatter block");
127
+ return problems;
128
+ }
129
+ const parsed = parseYAML(split.frontmatter);
130
+ for (const key of Object.keys(parsed ?? {})) {
131
+ if (key !== "okf_version")
132
+ problems.push(`index.md: frontmatter carries "${key}" — okf_version is the only key an index is allowed`);
133
+ }
134
+ for (const line of split.body.split("\n")) {
135
+ if (line.startsWith("*") && !/^\* \[[^\]]+\]\([^)]+\) - .+$/.test(line)) {
136
+ problems.push(`index.md: malformed entry line: ${line}`);
137
+ }
138
+ }
139
+ return problems;
140
+ }
141
+ /**
142
+ * The `type`/`lexicon`/`kind` a concept carries. Most entities state all
143
+ * three; a `LexiconOutput` (an `output(...)` bridge) carries none of them
144
+ * directly, so its facts come from its producing side — `type` must be
145
+ * non-empty for the bundle to conform, never blank.
146
+ */
147
+ function conceptFacts(entity) {
148
+ if (isLexiconOutput(entity)) {
149
+ const out = entity;
150
+ return { type: "Output", lexicon: out.sourceLexicon || "unknown", kind: "output" };
151
+ }
152
+ return {
153
+ type: entity.entityType || "Entity",
154
+ lexicon: entity.lexicon || "unknown",
155
+ kind: entity.kind ?? "resource",
156
+ };
157
+ }
158
+ /**
159
+ * Build the OKF bundle for a discovered graph. Pure and deterministic: the
160
+ * same entities yield byte-identical files, so bundles are diffable and
161
+ * snapshot-testable. `projectPath` relativizes source-file paths so the
162
+ * bundle is portable.
163
+ */
164
+ export function buildOkfBundle(input, projectPath) {
165
+ // Assign each entity a stable concept path: <lexicon>/<name>.md, deduped
166
+ // when slugging collides two distinct names.
167
+ const concepts = new Map();
168
+ const takenPaths = new Set();
169
+ const names = [...input.entities.keys()].sort((a, b) => a.localeCompare(b));
170
+ for (const name of names) {
171
+ const entity = input.entities.get(name);
172
+ const facts = conceptFacts(entity);
173
+ const base = `${slug(facts.lexicon)}/${slug(name)}`;
174
+ let path = `${base}.md`;
175
+ for (let n = 2; takenPaths.has(path); n++)
176
+ path = `${base}-${n}.md`;
177
+ takenPaths.add(path);
178
+ concepts.set(name, { name, entity, path, ...facts });
179
+ }
180
+ // Dependency edges: the graph IR's AttrRef/Ref-derived edges (the same
181
+ // derivation `chant graph --format ir` ships) unioned with discovery's
182
+ // declared dependency map — the map alone misses references that live only
183
+ // in attribute values.
184
+ const dependsOn = new Map();
185
+ const addEdge = (from, to) => {
186
+ if (!dependsOn.has(from))
187
+ dependsOn.set(from, new Set());
188
+ dependsOn.get(from).add(to);
189
+ };
190
+ for (const edge of buildGraphIr(input.entities, projectPath).edges)
191
+ addEdge(edge.from, edge.to);
192
+ for (const [from, deps] of input.dependencies)
193
+ for (const to of deps)
194
+ addEdge(from, to);
195
+ // Reverse edges: who references each entity.
196
+ const referencedBy = new Map();
197
+ for (const [from, deps] of dependsOn) {
198
+ for (const to of deps) {
199
+ if (!referencedBy.has(to))
200
+ referencedBy.set(to, []);
201
+ referencedBy.get(to).push(from);
202
+ }
203
+ }
204
+ const files = [];
205
+ for (const name of names) {
206
+ const concept = concepts.get(name);
207
+ const { entity } = concept;
208
+ const prov = getProvenance(entity);
209
+ const source = relFile(prov?.sourceFile, projectPath);
210
+ const head = frontmatter({
211
+ type: concept.type,
212
+ title: name,
213
+ description: `${concept.lexicon} ${concept.kind} of type ${concept.type}`,
214
+ name,
215
+ lexicon: concept.lexicon,
216
+ kind: concept.kind,
217
+ source,
218
+ composite: prov?.composite,
219
+ composite_instance: prov?.compositeInstance,
220
+ });
221
+ const body = [""];
222
+ body.push(source ? `Declared in \`${source}\`.` : `Declared by the ${concept.lexicon} lexicon.`);
223
+ // Cross-resource references become bundle-relative links. A dependency
224
+ // whose target is not in the bundle still emits a link — the spec permits
225
+ // broken links (not-yet-written knowledge), so unresolved never fails.
226
+ const deps = [...(dependsOn.get(name) ?? [])].sort((a, b) => a.localeCompare(b));
227
+ if (deps.length > 0) {
228
+ body.push("", "## Depends on", "");
229
+ for (const dep of deps) {
230
+ const target = concepts.get(dep)?.path ?? `${slug(dep)}.md`;
231
+ body.push(`- [${dep}](/${target})`);
232
+ }
233
+ }
234
+ const consumers = (referencedBy.get(name) ?? []).sort((a, b) => a.localeCompare(b));
235
+ if (consumers.length > 0) {
236
+ body.push("", "## Referenced by", "");
237
+ for (const consumer of consumers) {
238
+ const target = concepts.get(consumer)?.path ?? `${slug(consumer)}.md`;
239
+ body.push(`- [${consumer}](/${target})`);
240
+ }
241
+ }
242
+ body.push("");
243
+ files.push({ path: concept.path, content: head + body.join("\n") });
244
+ }
245
+ files.push({ path: "index.md", content: buildIndex(concepts, names) });
246
+ files.sort((a, b) => a.path.localeCompare(b.path));
247
+ return files;
248
+ }
249
+ /**
250
+ * The bundle-root `index.md` (spec §8): one section per lexicon, each entry a
251
+ * bundle-relative link plus the concept's description — the spec's
252
+ * progressive-disclosure mechanism. Root indexes may carry `okf_version`
253
+ * frontmatter (spec §12), the only frontmatter an index is allowed.
254
+ */
255
+ function buildIndex(concepts, names) {
256
+ const byLexicon = new Map();
257
+ for (const name of names) {
258
+ const concept = concepts.get(name);
259
+ if (!byLexicon.has(concept.lexicon))
260
+ byLexicon.set(concept.lexicon, []);
261
+ byLexicon.get(concept.lexicon).push(concept);
262
+ }
263
+ const lines = ["---", `okf_version: '${OKF_VERSION}'`, "---", ""];
264
+ const lexicons = [...byLexicon.keys()].sort((a, b) => a.localeCompare(b));
265
+ for (const lexicon of lexicons) {
266
+ lines.push(`# Lexicon: ${lexicon}`, "");
267
+ for (const concept of byLexicon.get(lexicon)) {
268
+ lines.push(`* [${concept.name}](/${concept.path}) - ${lexicon} ${concept.kind} of type ${concept.type}`);
269
+ }
270
+ lines.push("");
271
+ }
272
+ if (lexicons.length === 0)
273
+ lines.push("No entities discovered.", "");
274
+ return lines.join("\n");
275
+ }