@intentius/chant 0.124.13 → 0.124.15

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 (991) 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.d.ts +6 -0
  35. package/dist/build.d.ts.map +1 -1
  36. package/dist/build.js +669 -0
  37. package/dist/builder.js +44 -0
  38. package/dist/cdk/advise.js +30 -0
  39. package/dist/cdk/assembly.js +122 -0
  40. package/dist/cdk/graph.js +444 -0
  41. package/dist/cdk/tier-map.js +64 -0
  42. package/dist/cdk/types.js +24 -0
  43. package/dist/change-set.d.ts +24 -2
  44. package/dist/change-set.d.ts.map +1 -1
  45. package/dist/change-set.js +361 -0
  46. package/dist/child-project.js +21 -0
  47. package/dist/ci-jobs.d.ts +227 -0
  48. package/dist/ci-jobs.d.ts.map +1 -0
  49. package/dist/ci-jobs.js +448 -0
  50. package/dist/claimed-fields.js +135 -0
  51. package/dist/cli/build-options.js +70 -0
  52. package/dist/cli/build-params-cli.js +139 -0
  53. package/dist/cli/command-group.js +123 -0
  54. package/dist/cli/commands/audit-agents.js +326 -0
  55. package/dist/cli/commands/audit.js +571 -0
  56. package/dist/cli/commands/build.js +920 -0
  57. package/dist/cli/commands/carve-apply.js +153 -0
  58. package/dist/cli/commands/carve-bridge.js +201 -0
  59. package/dist/cli/commands/carve-emit.js +332 -0
  60. package/dist/cli/commands/carve-status.js +119 -0
  61. package/dist/cli/commands/carve.js +204 -0
  62. package/dist/cli/commands/check-lexicon-docs.js +79 -0
  63. package/dist/cli/commands/check-lexicon-examples.js +177 -0
  64. package/dist/cli/commands/check-lexicon-intrinsics.js +291 -0
  65. package/dist/cli/commands/check-lexicon-mcp.js +82 -0
  66. package/dist/cli/commands/check-lexicon-plugin.d.ts.map +1 -1
  67. package/dist/cli/commands/check-lexicon-plugin.js +104 -0
  68. package/dist/cli/commands/check-lexicon.js +766 -0
  69. package/dist/cli/commands/describe.js +85 -0
  70. package/dist/cli/commands/diff.js +175 -0
  71. package/dist/cli/commands/doctor.js +350 -0
  72. package/dist/cli/commands/import-agents.js +155 -0
  73. package/dist/cli/commands/import.js +670 -0
  74. package/dist/cli/commands/init-lexicon/templates/codegen.js +194 -0
  75. package/dist/cli/commands/init-lexicon/templates/docs.js +100 -0
  76. package/dist/cli/commands/init-lexicon/templates/examples.js +29 -0
  77. package/dist/cli/commands/init-lexicon/templates/lint.js +34 -0
  78. package/dist/cli/commands/init-lexicon/templates/lsp.js +37 -0
  79. package/dist/cli/commands/init-lexicon/templates/plugin.js +108 -0
  80. package/dist/cli/commands/init-lexicon/templates/project.js +240 -0
  81. package/dist/cli/commands/init-lexicon/templates/spec.js +56 -0
  82. package/dist/cli/commands/init-lexicon/templates/tests.js +66 -0
  83. package/dist/cli/commands/init-lexicon.js +172 -0
  84. package/dist/cli/commands/init.js +381 -0
  85. package/dist/cli/commands/lexicon-rolling-upgrade.js +145 -0
  86. package/dist/cli/commands/lexicon-surface-diff.js +145 -0
  87. package/dist/cli/commands/licenses.js +125 -0
  88. package/dist/cli/commands/lint.d.ts.map +1 -1
  89. package/dist/cli/commands/lint.js +948 -0
  90. package/dist/cli/commands/list.js +63 -0
  91. package/dist/cli/commands/migrate.d.ts.map +1 -1
  92. package/dist/cli/commands/migrate.js +423 -0
  93. package/dist/cli/commands/onboard.js +403 -0
  94. package/dist/cli/commands/pinned-upgrade.js +191 -0
  95. package/dist/cli/commands/update.js +194 -0
  96. package/dist/cli/commands/vendor.js +217 -0
  97. package/dist/cli/conflict-check.js +104 -0
  98. package/dist/cli/debug.js +8 -0
  99. package/dist/cli/format.js +104 -0
  100. package/dist/cli/handlers/build.js +267 -0
  101. package/dist/cli/handlers/carve-apply.js +30 -0
  102. package/dist/cli/handlers/carve-bridge.js +28 -0
  103. package/dist/cli/handlers/carve-emit.js +50 -0
  104. package/dist/cli/handlers/carve-status.js +26 -0
  105. package/dist/cli/handlers/carve.js +40 -0
  106. package/dist/cli/handlers/change-set.js +46 -0
  107. package/dist/cli/handlers/components.js +730 -0
  108. package/dist/cli/handlers/dev.js +113 -0
  109. package/dist/cli/handlers/emulator.js +233 -0
  110. package/dist/cli/handlers/explain.js +54 -0
  111. package/dist/cli/handlers/fan-out.js +422 -0
  112. package/dist/cli/handlers/gate-resume.js +275 -0
  113. package/dist/cli/handlers/generate.js +84 -0
  114. package/dist/cli/handlers/graph.js +969 -0
  115. package/dist/cli/handlers/init.js +102 -0
  116. package/dist/cli/handlers/lifecycle.js +1727 -0
  117. package/dist/cli/handlers/lint.js +62 -0
  118. package/dist/cli/handlers/migrate.js +48 -0
  119. package/dist/cli/handlers/misc.js +391 -0
  120. package/dist/cli/handlers/operator.js +1162 -0
  121. package/dist/cli/handlers/override-approve.js +102 -0
  122. package/dist/cli/handlers/pr.js +503 -0
  123. package/dist/cli/handlers/promote.js +342 -0
  124. package/dist/cli/handlers/run-generate.js +206 -0
  125. package/dist/cli/handlers/run-wave.js +66 -0
  126. package/dist/cli/handlers/run.js +1191 -0
  127. package/dist/cli/handlers/scenario.js +325 -0
  128. package/dist/cli/handlers/search.js +924 -0
  129. package/dist/cli/handlers/serve.js +32 -0
  130. package/dist/cli/handlers/vendor.js +154 -0
  131. package/dist/cli/index.js +3 -0
  132. package/dist/cli/is-entry-point.js +23 -0
  133. package/dist/cli/lsp/capabilities.js +28 -0
  134. package/dist/cli/lsp/diagnostics.js +34 -0
  135. package/dist/cli/lsp/server.js +329 -0
  136. package/dist/cli/main.d.ts.map +1 -1
  137. package/dist/cli/main.js +2540 -0
  138. package/dist/cli/mcp/lifecycle-tools.js +80 -0
  139. package/dist/cli/mcp/op-tools.js +306 -0
  140. package/dist/cli/mcp/resource-handlers.js +258 -0
  141. package/dist/cli/mcp/resources/context.js +85 -0
  142. package/dist/cli/mcp/server.js +353 -0
  143. package/dist/cli/mcp/tools/build.js +111 -0
  144. package/dist/cli/mcp/tools/composites.js +95 -0
  145. package/dist/cli/mcp/tools/explain.js +166 -0
  146. package/dist/cli/mcp/tools/import.js +49 -0
  147. package/dist/cli/mcp/tools/lint.js +41 -0
  148. package/dist/cli/mcp/tools/scaffold.js +111 -0
  149. package/dist/cli/mcp/tools/search.js +112 -0
  150. package/dist/cli/mcp/types.js +1 -0
  151. package/dist/cli/mcp/workspace-plugins.js +91 -0
  152. package/dist/cli/mcp/workspace-tools.d.ts +1 -1
  153. package/dist/cli/mcp/workspace-tools.js +564 -0
  154. package/dist/cli/mcp-config.js +70 -0
  155. package/dist/cli/plugins.js +313 -0
  156. package/dist/cli/registry.js +23 -0
  157. package/dist/cli/reporters/stylish.js +329 -0
  158. package/dist/cli/version.js +15 -0
  159. package/dist/cli/watch.js +79 -0
  160. package/dist/codegen/bound-property-types.js +82 -0
  161. package/dist/codegen/coverage.js +119 -0
  162. package/dist/codegen/docs-file-markers.js +60 -0
  163. package/dist/codegen/docs-pages.js +115 -0
  164. package/dist/codegen/docs-rule-scanning.js +164 -0
  165. package/dist/codegen/docs-rules.js +76 -0
  166. package/dist/codegen/docs-sections.js +117 -0
  167. package/dist/codegen/docs-sidebar.js +65 -0
  168. package/dist/codegen/docs-types.js +4 -0
  169. package/dist/codegen/docs.js +356 -0
  170. package/dist/codegen/fetch.js +340 -0
  171. package/dist/codegen/generate-post-synth-barrel.js +63 -0
  172. package/dist/codegen/generate-registry.js +71 -0
  173. package/dist/codegen/generate-runtime-index.js +56 -0
  174. package/dist/codegen/generate-typescript.js +119 -0
  175. package/dist/codegen/generate.js +115 -0
  176. package/dist/codegen/json-patch.js +141 -0
  177. package/dist/codegen/json-schema-to-ts.js +344 -0
  178. package/dist/codegen/json-schema.js +246 -0
  179. package/dist/codegen/lexicon-regen.js +412 -0
  180. package/dist/codegen/naming.js +217 -0
  181. package/dist/codegen/okf-lexicon.js +245 -0
  182. package/dist/codegen/package.js +150 -0
  183. package/dist/codegen/pinned-upgrade.d.ts.map +1 -1
  184. package/dist/codegen/pinned-upgrade.js +494 -0
  185. package/dist/codegen/registry.js +60 -0
  186. package/dist/codegen/rehype-base-url.mjs +68 -0
  187. package/dist/codegen/rolling-upgrade.js +217 -0
  188. package/dist/codegen/surface-snapshot.js +537 -0
  189. package/dist/codegen/testdata/postgres-tags.json +242 -0
  190. package/dist/codegen/topo-sort.js +36 -0
  191. package/dist/codegen/typecheck.js +115 -0
  192. package/dist/codegen/validate.js +200 -0
  193. package/dist/codegen/version-bump.js +35 -0
  194. package/dist/components/auto-release.js +143 -0
  195. package/dist/components/builders.js +47 -0
  196. package/dist/components/capability-plugin-loader.js +175 -0
  197. package/dist/components/capability-plugin-schema.js +46 -0
  198. package/dist/components/capability-plugin.js +99 -0
  199. package/dist/components/capability.js +60 -0
  200. package/dist/components/changed-files.js +72 -0
  201. package/dist/components/cli-support.js +427 -0
  202. package/dist/components/component.js +120 -0
  203. package/dist/components/component.schema.json +271 -0
  204. package/dist/components/config-defaults.js +130 -0
  205. package/dist/components/deploy-units.js +60 -0
  206. package/dist/components/discover.d.ts.map +1 -1
  207. package/dist/components/discover.js +189 -0
  208. package/dist/components/driver-output.js +86 -0
  209. package/dist/components/driver.js +728 -0
  210. package/dist/components/fan-out-output.js +165 -0
  211. package/dist/components/fan-out-record.js +94 -0
  212. package/dist/components/fan-out-run.js +373 -0
  213. package/dist/components/fan-out-support.js +60 -0
  214. package/dist/components/fan-out.js +273 -0
  215. package/dist/components/gate-plan.js +41 -0
  216. package/dist/components/gated-wave-pipeline.js +46 -0
  217. package/dist/components/index.js +24 -0
  218. package/dist/components/layers.js +28 -0
  219. package/dist/components/manifest-persistence.js +108 -0
  220. package/dist/components/pilots/alb-ecs.pilot.js +59 -0
  221. package/dist/components/pilots/dynamodb.pilot.js +51 -0
  222. package/dist/components/pilots/jar-emr.pilot.js +65 -0
  223. package/dist/components/pilots/lambda.pilot.js +52 -0
  224. package/dist/components/pilots/neo4j-fanout.pilot.js +68 -0
  225. package/dist/components/pilots/project.js +12 -0
  226. package/dist/components/pr-pipeline.d.ts.map +1 -1
  227. package/dist/components/pr-pipeline.js +135 -0
  228. package/dist/components/pr-run.js +363 -0
  229. package/dist/components/presets/ecs-fargate.js +72 -0
  230. package/dist/components/presets/index.js +28 -0
  231. package/dist/components/presets/lambda.js +34 -0
  232. package/dist/components/presets/single-host-compose.js +41 -0
  233. package/dist/components/promote.js +549 -0
  234. package/dist/components/registry.js +34 -0
  235. package/dist/components/run-progress.js +33 -0
  236. package/dist/components/sandbox/driver.d.ts.map +1 -1
  237. package/dist/components/sandbox/driver.js +93 -0
  238. package/dist/components/sandbox/run.js +115 -0
  239. package/dist/components/starter-plugin.js +104 -0
  240. package/dist/components/verbs/__tests__/mock-cloud-executor.js +68 -0
  241. package/dist/components/verbs/__tests__/mock-process-runner.js +45 -0
  242. package/dist/components/verbs/__tests__/mock-sbom-generator.js +56 -0
  243. package/dist/components/verbs/bom-writer.js +287 -0
  244. package/dist/components/verbs/build-archive.js +188 -0
  245. package/dist/components/verbs/build.js +142 -0
  246. package/dist/components/verbs/cloud-executor.js +110 -0
  247. package/dist/components/verbs/component-bom.js +125 -0
  248. package/dist/components/verbs/ensure-secret.js +50 -0
  249. package/dist/components/verbs/index.js +61 -0
  250. package/dist/components/verbs/license-policy.js +75 -0
  251. package/dist/components/verbs/lockfile-sbom-generator.js +191 -0
  252. package/dist/components/verbs/process-runner.js +78 -0
  253. package/dist/components/verbs/r2-sync.js +93 -0
  254. package/dist/components/verbs/reproducibility.js +62 -0
  255. package/dist/components/verbs/run-agent.js +577 -0
  256. package/dist/components/verbs/sbom-generator.js +119 -0
  257. package/dist/components/verbs/sbom.js +97 -0
  258. package/dist/components/verbs/shell.js +32 -0
  259. package/dist/components/verbs/sign.js +221 -0
  260. package/dist/components/verbs/stub.js +28 -0
  261. package/dist/components/verbs/tool-sbom-generator.js +154 -0
  262. package/dist/components/verbs/verify.js +112 -0
  263. package/dist/components/verbs/vex.js +131 -0
  264. package/dist/components/verbs/vuln-gate.js +152 -0
  265. package/dist/components/verbs/vuln-scan.js +288 -0
  266. package/dist/components/verbs/wait-verify.js +106 -0
  267. package/dist/components/verbs/wrangler.js +179 -0
  268. package/dist/components/wave-plan.js +102 -0
  269. package/dist/composite.d.ts +10 -2
  270. package/dist/composite.d.ts.map +1 -1
  271. package/dist/composite.js +313 -0
  272. package/dist/config-import.d.ts.map +1 -1
  273. package/dist/config-import.js +22 -0
  274. package/dist/config-sandbox.js +122 -0
  275. package/dist/config-static.js +206 -0
  276. package/dist/config.js +605 -0
  277. package/dist/content-digest.js +23 -0
  278. package/dist/declarable.js +114 -0
  279. package/dist/deep-observation.js +437 -0
  280. package/dist/detectLexicon.js +54 -0
  281. package/dist/discovery/cache.js +70 -0
  282. package/dist/discovery/collect.d.ts +2 -1
  283. package/dist/discovery/collect.d.ts.map +1 -1
  284. package/dist/discovery/collect.js +223 -0
  285. package/dist/discovery/cycles.js +95 -0
  286. package/dist/discovery/entity-wire-codec.js +391 -0
  287. package/dist/discovery/entity-wire.js +42 -0
  288. package/dist/discovery/files.js +121 -0
  289. package/dist/discovery/fold-import.d.ts.map +1 -1
  290. package/dist/discovery/fold-import.js +4073 -0
  291. package/dist/discovery/fold-rank.js +292 -0
  292. package/dist/discovery/graph.js +115 -0
  293. package/dist/discovery/host-composite.d.ts +35 -0
  294. package/dist/discovery/host-composite.d.ts.map +1 -0
  295. package/dist/discovery/host-composite.js +93 -0
  296. package/dist/discovery/import.d.ts.map +1 -1
  297. package/dist/discovery/import.js +65 -0
  298. package/dist/discovery/index.d.ts +9 -0
  299. package/dist/discovery/index.d.ts.map +1 -1
  300. package/dist/discovery/index.js +333 -0
  301. package/dist/discovery/param-deps.js +487 -0
  302. package/dist/discovery/resolve.js +39 -0
  303. package/dist/discovery/sandbox/bundle.js +214 -0
  304. package/dist/discovery/sandbox/child-errors.js +26 -0
  305. package/dist/discovery/sandbox/config-run.js +100 -0
  306. package/dist/discovery/sandbox/config-wire.js +183 -0
  307. package/dist/discovery/sandbox/driver.d.ts.map +1 -1
  308. package/dist/discovery/sandbox/driver.js +333 -0
  309. package/dist/discovery/sandbox/fork.js +229 -0
  310. package/dist/discovery/sandbox/policy-run.js +142 -0
  311. package/dist/discovery/sandbox/policy-wire.js +152 -0
  312. package/dist/discovery/sandbox/run.js +77 -0
  313. package/dist/discovery/specifier-resolve.js +320 -0
  314. package/dist/discovery/walk.js +284 -0
  315. package/dist/effect-receipt.js +340 -0
  316. package/dist/env.js +55 -0
  317. package/dist/errors.js +62 -0
  318. package/dist/fold/fold.js +1434 -0
  319. package/dist/fold/foldable-helpers.js +229 -0
  320. package/dist/fold/subset.js +696 -0
  321. package/dist/fold-provenance.js +414 -0
  322. package/dist/gate-decision.d.ts +20 -9
  323. package/dist/gate-decision.d.ts.map +1 -1
  324. package/dist/gate-decision.js +313 -0
  325. package/dist/gate-resume-run.js +154 -0
  326. package/dist/gated-waves.js +165 -0
  327. package/dist/governance.js +43 -0
  328. package/dist/graph-declared.js +45 -0
  329. package/dist/graph-detail.js +207 -0
  330. package/dist/graph-dot.js +54 -0
  331. package/dist/graph-effective.js +107 -0
  332. package/dist/graph-ir.js +623 -0
  333. package/dist/graph-layout.js +184 -0
  334. package/dist/graph-lens.js +105 -0
  335. package/dist/graph-mermaid.js +83 -0
  336. package/dist/graph-ops.js +39 -0
  337. package/dist/graph-refs.js +156 -0
  338. package/dist/held-elsewhere.js +87 -0
  339. package/dist/identity.js +251 -0
  340. package/dist/import/base-parser.js +34 -0
  341. package/dist/import/embedded.js +255 -0
  342. package/dist/import/generator.js +1 -0
  343. package/dist/import/ir-utils.js +85 -0
  344. package/dist/import/parser-options.js +45 -0
  345. package/dist/import/parser.js +1 -0
  346. package/dist/index.js +118 -0
  347. package/dist/intrinsic-interpolation.js +73 -0
  348. package/dist/intrinsic.js +31 -0
  349. package/dist/join-key.js +35 -0
  350. package/dist/kubectl-context.js +150 -0
  351. package/dist/lexicon-config.js +58 -0
  352. package/dist/lexicon-integrity.js +47 -0
  353. package/dist/lexicon-manifest.js +70 -0
  354. package/dist/lexicon-module.d.ts.map +1 -1
  355. package/dist/lexicon-module.js +241 -0
  356. package/dist/lexicon-output.js +218 -0
  357. package/dist/lexicon-plugin-helpers.js +104 -0
  358. package/dist/lexicon-schema.js +136 -0
  359. package/dist/lexicon.js +130 -0
  360. package/dist/lifecycle/affected.js +224 -0
  361. package/dist/lifecycle/assert-live.js +110 -0
  362. package/dist/lifecycle/build-ledger-store.js +160 -0
  363. package/dist/lifecycle/build-ledger.js +155 -0
  364. package/dist/lifecycle/change-set.js +356 -0
  365. package/dist/lifecycle/converge-ledger.js +161 -0
  366. package/dist/lifecycle/deep-diff.js +233 -0
  367. package/dist/lifecycle/deep-observe.js +147 -0
  368. package/dist/lifecycle/digest.js +143 -0
  369. package/dist/lifecycle/disruption.js +135 -0
  370. package/dist/lifecycle/gate-applied.js +113 -0
  371. package/dist/lifecycle/gate-audit.d.ts +69 -2
  372. package/dist/lifecycle/gate-audit.d.ts.map +1 -1
  373. package/dist/lifecycle/gate-audit.js +415 -0
  374. package/dist/lifecycle/gate-ledger-select.js +89 -0
  375. package/dist/lifecycle/gate-ledger.d.ts +24 -0
  376. package/dist/lifecycle/gate-ledger.d.ts.map +1 -1
  377. package/dist/lifecycle/gate-ledger.js +201 -0
  378. package/dist/lifecycle/gate-origin.js +117 -0
  379. package/dist/lifecycle/gate-pending.js +58 -0
  380. package/dist/lifecycle/git.js +1182 -0
  381. package/dist/lifecycle/identity.js +58 -0
  382. package/dist/lifecycle/index.js +26 -0
  383. package/dist/lifecycle/lease.js +283 -0
  384. package/dist/lifecycle/ledger-port.js +1 -0
  385. package/dist/lifecycle/legacy-digest.js +91 -0
  386. package/dist/lifecycle/live-diff.js +274 -0
  387. package/dist/lifecycle/local-note.js +15 -0
  388. package/dist/lifecycle/member-ledger.js +122 -0
  389. package/dist/lifecycle/observation-baseline.js +155 -0
  390. package/dist/lifecycle/observe.js +375 -0
  391. package/dist/lifecycle/oras-referrer-lookup.js +82 -0
  392. package/dist/lifecycle/override-ledger.js +54 -0
  393. package/dist/lifecycle/plan-digest.js +110 -0
  394. package/dist/lifecycle/plan-ledger.js +129 -0
  395. package/dist/lifecycle/receipt-plan.js +192 -0
  396. package/dist/lifecycle/release-ledger.js +155 -0
  397. package/dist/lifecycle/release-read.js +64 -0
  398. package/dist/lifecycle/replay.js +193 -0
  399. package/dist/lifecycle/rollback.js +102 -0
  400. package/dist/lifecycle/run-ledger.js +183 -0
  401. package/dist/lifecycle/scenario-eval.js +204 -0
  402. package/dist/lifecycle/scenario.js +214 -0
  403. package/dist/lifecycle/snapshot.js +239 -0
  404. package/dist/lifecycle/status.js +447 -0
  405. package/dist/lifecycle/symptoms.js +117 -0
  406. package/dist/lifecycle/teardown.js +255 -0
  407. package/dist/lifecycle/types.js +1 -0
  408. package/dist/lifecycle/unobserved-gate.js +33 -0
  409. package/dist/lifecycle/wave-plans.js +68 -0
  410. package/dist/lifecycle/work-item-id.js +36 -0
  411. package/dist/lifecycle/work-lease.js +393 -0
  412. package/dist/lint/component-checks.js +87 -0
  413. package/dist/lint/config.js +483 -0
  414. package/dist/lint/declarative.js +122 -0
  415. package/dist/lint/discover.d.ts.map +1 -1
  416. package/dist/lint/discover.js +138 -0
  417. package/dist/lint/engine.js +246 -0
  418. package/dist/lint/knowledge-checks.js +64 -0
  419. package/dist/lint/named-checks.js +22 -0
  420. package/dist/lint/output-checks.js +87 -0
  421. package/dist/lint/output-docs.js +163 -0
  422. package/dist/lint/parser.js +33 -0
  423. package/dist/lint/pipeline-change-gate.js +70 -0
  424. package/dist/lint/policy-import.d.ts +1 -1
  425. package/dist/lint/policy-import.d.ts.map +1 -1
  426. package/dist/lint/policy-import.js +62 -0
  427. package/dist/lint/policy-sandbox.js +86 -0
  428. package/dist/lint/policy.js +122 -0
  429. package/dist/lint/post-synth.js +87 -0
  430. package/dist/lint/presets/relaxed.json +26 -0
  431. package/dist/lint/presets/strict.json +24 -24
  432. package/dist/lint/receipt-checks.js +83 -0
  433. package/dist/lint/rule-loader.d.ts.map +1 -1
  434. package/dist/lint/rule-loader.js +89 -0
  435. package/dist/lint/rule-registry.js +86 -0
  436. package/dist/lint/rule.js +1 -0
  437. package/dist/lint/rules/__fixtures__/comp/comp000-discovery-error/broken-a.component.js +7 -0
  438. package/dist/lint/rules/__fixtures__/comp/comp000-discovery-error/broken-b.component.js +7 -0
  439. package/dist/lint/rules/__fixtures__/comp/comp001/fail/orphan-lib.component.js +9 -0
  440. package/dist/lint/rules/__fixtures__/comp/comp001/pass/emr-job.component.js +11 -0
  441. package/dist/lint/rules/__fixtures__/comp/comp001/pass/jar-lib.component.js +9 -0
  442. package/dist/lint/rules/__fixtures__/comp/comp002/fail/search-service.component.js +25 -0
  443. package/dist/lint/rules/__fixtures__/comp/comp002/pass/jar-lib.component.js +8 -0
  444. package/dist/lint/rules/__fixtures__/comp/comp002/pass/search-service.component.js +21 -0
  445. package/dist/lint/rules/__fixtures__/comp/comp003/fail/migrator.component.js +8 -0
  446. package/dist/lint/rules/__fixtures__/comp/comp003/pass/agent-turn.component.js +24 -0
  447. package/dist/lint/rules/__fixtures__/comp/comp003/pass/migrator.component.js +17 -0
  448. package/dist/lint/rules/__fixtures__/comp/comp003/pass/orders-table.component.js +8 -0
  449. package/dist/lint/rules/__fixtures__/comp/comp004/fail/neo4j-cluster.component.js +18 -0
  450. package/dist/lint/rules/__fixtures__/comp/comp004/pass/neo4j-cluster.component.js +20 -0
  451. package/dist/lint/rules/__fixtures__/comp/comp004/pass/orders-table.component.js +8 -0
  452. package/dist/lint/rules/__fixtures__/comp/comp005/fail/search-service.component.js +12 -0
  453. package/dist/lint/rules/__fixtures__/comp/comp005/pass/search-service.component.js +16 -0
  454. package/dist/lint/rules/__fixtures__/comp/comp006/fail/legacy-tool.component.js +8 -0
  455. package/dist/lint/rules/__fixtures__/comp/comp006/pass/legacy-tool.component.js +12 -0
  456. package/dist/lint/rules/__fixtures__/comp/comp007/fail/inventory-table.component.js +11 -0
  457. package/dist/lint/rules/__fixtures__/comp/comp007/fail/orders-table.component.js +11 -0
  458. package/dist/lint/rules/__fixtures__/comp/comp007/pass/orders-table.component.js +10 -0
  459. package/dist/lint/rules/__fixtures__/comp/comp007/pass/search-service.component.js +16 -0
  460. package/dist/lint/rules/comp/comp001-publishes-never-applies.js +69 -0
  461. package/dist/lint/rules/comp/comp002-dangling-wiring-ref.js +84 -0
  462. package/dist/lint/rules/comp/comp003-mutating-no-rollback.js +103 -0
  463. package/dist/lint/rules/comp/comp004-gate-needs-durable-runtime.js +70 -0
  464. package/dist/lint/rules/comp/comp005-capability-kind-is-noun.js +109 -0
  465. package/dist/lint/rules/comp/comp006-shell-needs-reason.js +49 -0
  466. package/dist/lint/rules/comp/comp007-composition-sprawl.js +64 -0
  467. package/dist/lint/rules/comp/index.js +33 -0
  468. package/dist/lint/rules/comp/support.js +129 -0
  469. package/dist/lint/rules/composite-scope.js +51 -0
  470. package/dist/lint/rules/cor017-composite-name-match.js +93 -0
  471. package/dist/lint/rules/cor018-composite-prefer-lexicon-type.js +136 -0
  472. package/dist/lint/rules/cor021-env-literal-name.js +100 -0
  473. package/dist/lint/rules/cor022-receipt-leaf.js +118 -0
  474. package/dist/lint/rules/cor024-receipt-secret-pointer.js +199 -0
  475. package/dist/lint/rules/declarable-naming-convention.js +62 -0
  476. package/dist/lint/rules/evl001-non-literal-expression.js +66 -0
  477. package/dist/lint/rules/evl002-control-flow-resource.js +69 -0
  478. package/dist/lint/rules/evl003-dynamic-property-access.js +44 -0
  479. package/dist/lint/rules/evl004-spread-non-const.js +94 -0
  480. package/dist/lint/rules/evl005-resource-block-body.js +41 -0
  481. package/dist/lint/rules/evl007-invalid-siblings.js +105 -0
  482. package/dist/lint/rules/evl009-composite-no-constant.js +158 -0
  483. package/dist/lint/rules/evl010-composite-no-transform.js +59 -0
  484. package/dist/lint/rules/evl011-symbolic-in-template.js +106 -0
  485. package/dist/lint/rules/export-required.js +115 -0
  486. package/dist/lint/rules/file-declarable-limit.js +88 -0
  487. package/dist/lint/rules/flat-declarations.js +62 -0
  488. package/dist/lint/rules/index.js +90 -0
  489. package/dist/lint/rules/no-cyclic-declarable-ref.js +138 -0
  490. package/dist/lint/rules/no-redundant-type-import.js +76 -0
  491. package/dist/lint/rules/no-redundant-value-cast.js +41 -0
  492. package/dist/lint/rules/no-string-ref.js +59 -0
  493. package/dist/lint/rules/no-unused-declarable-import.js +75 -0
  494. package/dist/lint/rules/no-unused-declarable.js +142 -0
  495. package/dist/lint/rules/op/index.js +28 -0
  496. package/dist/lint/rules/op/ops012-activity-contract.js +54 -0
  497. package/dist/lint/rules/op/ops013-step-output-ref.js +88 -0
  498. package/dist/lint/rules/op/ops014-converge-rule-refusals.js +114 -0
  499. package/dist/lint/rules/op/ops015-gate-approval.js +45 -0
  500. package/dist/lint/rules/op/support.js +11 -0
  501. package/dist/lint/rules/op/sys010-key-over-plain-http.js +100 -0
  502. package/dist/lint/rules/property-kind.js +56 -0
  503. package/dist/lint/rules/single-concern-file.js +71 -0
  504. package/dist/lint/rules/sys001-no-literal-key.js +60 -0
  505. package/dist/lint/selectors.js +168 -0
  506. package/dist/lint/suppressions.js +129 -0
  507. package/dist/lint/typescript.js +17 -0
  508. package/dist/live-endpoint.js +113 -0
  509. package/dist/live-read-session.js +76 -0
  510. package/dist/lsp/lexicon-providers.js +163 -0
  511. package/dist/lsp/types.js +5 -0
  512. package/dist/managed-fields.js +293 -0
  513. package/dist/mcp/types.js +4 -0
  514. package/dist/notify-verify.js +0 -1
  515. package/dist/notify.js +0 -1
  516. package/dist/notify.schema.json +72 -0
  517. package/dist/observation.js +266 -0
  518. package/dist/okf-read.js +134 -0
  519. package/dist/okf.js +275 -0
  520. package/dist/op/__fixtures__/decide-stub-backend.js +125 -0
  521. package/dist/op/activities/activity-contracts.d.ts +1 -1
  522. package/dist/op/activities/activity-contracts.js +313 -0
  523. package/dist/op/activities/apply.js +582 -0
  524. package/dist/op/activities/build.js +18 -0
  525. package/dist/op/activities/change-coverage.js +40 -0
  526. package/dist/op/activities/change-set.d.ts +8 -3
  527. package/dist/op/activities/change-set.d.ts.map +1 -1
  528. package/dist/op/activities/change-set.js +67 -0
  529. package/dist/op/activities/converge.js +492 -0
  530. package/dist/op/activities/decide.js +211 -0
  531. package/dist/op/activities/env-teardown.js +110 -0
  532. package/dist/op/activities/factory.js +591 -0
  533. package/dist/op/activities/forge-pull-request.js +82 -0
  534. package/dist/op/activities/gh-host.js +78 -0
  535. package/dist/op/activities/guard-validate.js +165 -0
  536. package/dist/op/activities/http-check.js +40 -0
  537. package/dist/op/activities/index.js +59 -0
  538. package/dist/op/activities/lexicon-upgrade.js +629 -0
  539. package/dist/op/activities/lifecycle.js +109 -0
  540. package/dist/op/activities/pipeline-audit.js +147 -0
  541. package/dist/op/activities/policy.js +26 -0
  542. package/dist/op/activities/predict-behaviour.js +341 -0
  543. package/dist/op/activities/propose-upgrade.js +165 -0
  544. package/dist/op/activities/reconcile.d.ts +28 -16
  545. package/dist/op/activities/reconcile.d.ts.map +1 -1
  546. package/dist/op/activities/reconcile.js +1011 -0
  547. package/dist/op/activities/shell.js +118 -0
  548. package/dist/op/activities/source-release.js +97 -0
  549. package/dist/op/activities/source-rollback.js +165 -0
  550. package/dist/op/activities/teardown.js +17 -0
  551. package/dist/op/activities/util.js +6 -0
  552. package/dist/op/activities/wait.js +51 -0
  553. package/dist/op/activities/work-evidence.js +35 -0
  554. package/dist/op/activities/workflow-audit.js +133 -0
  555. package/dist/op/activity-contract-registry.js +106 -0
  556. package/dist/op/activity-contract.js +232 -0
  557. package/dist/op/activity-failure.js +31 -0
  558. package/dist/op/activity-profiles.js +129 -0
  559. package/dist/op/activity-registry.js +105 -0
  560. package/dist/op/activity-runtime.js +28 -0
  561. package/dist/op/builders.d.ts +1 -1
  562. package/dist/op/builders.d.ts.map +1 -1
  563. package/dist/op/builders.js +801 -0
  564. package/dist/op/change-signal.js +118 -0
  565. package/dist/op/composites/apply-op.js +151 -0
  566. package/dist/op/composites/behaviour-op.js +65 -0
  567. package/dist/op/composites/converge-op.js +141 -0
  568. package/dist/op/composites/index.js +19 -0
  569. package/dist/op/composites/lexicon-upgrade-op.js +107 -0
  570. package/dist/op/composites/pipeline-audit-op.js +50 -0
  571. package/dist/op/composites/reconcile-op.js +84 -0
  572. package/dist/op/composites/watch-op.js +69 -0
  573. package/dist/op/composites/workflow-audit-op.js +57 -0
  574. package/dist/op/converge-rule.js +205 -0
  575. package/dist/op/cron.js +146 -0
  576. package/dist/op/decide-backend.js +181 -0
  577. package/dist/op/decide-config.js +68 -0
  578. package/dist/op/decide-read-inputs.js +141 -0
  579. package/dist/op/discover.d.ts.map +1 -1
  580. package/dist/op/discover.js +213 -0
  581. package/dist/op/duration.js +21 -0
  582. package/dist/op/emulator-freshness.js +80 -0
  583. package/dist/op/emulator-lifecycle.js +269 -0
  584. package/dist/op/factory.js +83 -0
  585. package/dist/op/gate-approval.js +172 -0
  586. package/dist/op/gate-name.js +86 -0
  587. package/dist/op/gate-plan-context.js +167 -0
  588. package/dist/op/gate-point-run.js +67 -0
  589. package/dist/op/gate-point.js +111 -0
  590. package/dist/op/gate-resume-plan.js +155 -0
  591. package/dist/op/gate-resume.js +31 -0
  592. package/dist/op/gate-review.js +290 -0
  593. package/dist/op/gate-run-locator.js +85 -0
  594. package/dist/op/gate-summary.js +100 -0
  595. package/dist/op/gate-wait.js +56 -0
  596. package/dist/op/gate.js +449 -0
  597. package/dist/op/generate-pipeline.js +124 -0
  598. package/dist/op/index.js +51 -0
  599. package/dist/op/lifecycle-receipt-store.js +45 -0
  600. package/dist/op/local-executor.js +1164 -0
  601. package/dist/op/local-output.js +140 -0
  602. package/dist/op/op-ir.js +317 -0
  603. package/dist/op/op-verb-class.js +131 -0
  604. package/dist/op/op-waves-notify.js +136 -0
  605. package/dist/op/op-waves-run.d.ts +1 -1
  606. package/dist/op/op-waves-run.d.ts.map +1 -1
  607. package/dist/op/op-waves-run.js +1657 -0
  608. package/dist/op/op-waves.js +409 -0
  609. package/dist/op/operator.js +743 -0
  610. package/dist/op/receipt-store.js +94 -0
  611. package/dist/op/resource.js +23 -0
  612. package/dist/op/run-context.js +28 -0
  613. package/dist/op/run-live.js +256 -0
  614. package/dist/op/runtime.js +21 -0
  615. package/dist/op/runtimes/local.js +195 -0
  616. package/dist/op/source-archive.js +131 -0
  617. package/dist/op/step-output-ref.js +397 -0
  618. package/dist/op/steward-beside.js +169 -0
  619. package/dist/op/steward-points.js +138 -0
  620. package/dist/op/steward-turn.js +59 -0
  621. package/dist/op/steward.js +317 -0
  622. package/dist/op/types.js +25 -0
  623. package/dist/op/work-lease-decl.js +81 -0
  624. package/dist/op/work-lease-run.js +393 -0
  625. package/dist/override-gate.js +284 -0
  626. package/dist/owner-chain.js +74 -0
  627. package/dist/ownership.js +92 -0
  628. package/dist/params.js +61 -0
  629. package/dist/plan-summary.js +711 -0
  630. package/dist/point-decision.js +211 -0
  631. package/dist/pr-forge.js +810 -0
  632. package/dist/pr-loop.js +203 -0
  633. package/dist/project-codegen.js +191 -0
  634. package/dist/project-root.js +74 -0
  635. package/dist/project-validation.js +50 -0
  636. package/dist/provenance.js +157 -0
  637. package/dist/pseudo-parameter.js +40 -0
  638. package/dist/reconcile.js +450 -0
  639. package/dist/resource-attributes.js +33 -0
  640. package/dist/runtime-adapter.js +77 -0
  641. package/dist/runtime.js +66 -0
  642. package/dist/secret-materialization.js +153 -0
  643. package/dist/secret-provenance.js +250 -0
  644. package/dist/serializer-walker.js +112 -0
  645. package/dist/serializer.js +1 -0
  646. package/dist/sort.js +45 -0
  647. package/dist/stack-output.js +115 -0
  648. package/dist/telemetry-attribution.js +149 -0
  649. package/dist/terraform/__fixtures__/build-graph.js +63 -0
  650. package/dist/terraform/adopt-state.js +40 -0
  651. package/dist/terraform/aws-resources.js +384 -0
  652. package/dist/terraform/bridge.js +204 -0
  653. package/dist/terraform/carve-provider.js +155 -0
  654. package/dist/terraform/carve.js +138 -0
  655. package/dist/terraform/data-source-shape.js +57 -0
  656. package/dist/terraform/emit-source.js +36 -0
  657. package/dist/terraform/excise.js +123 -0
  658. package/dist/terraform/graduate.js +128 -0
  659. package/dist/terraform/graph.js +435 -0
  660. package/dist/terraform/hcl2json.js +60 -0
  661. package/dist/terraform/manifest.js +149 -0
  662. package/dist/terraform/parse.js +81 -0
  663. package/dist/terraform/providers/aws.js +146 -0
  664. package/dist/terraform/providers/gcp.js +294 -0
  665. package/dist/terraform/providers/index.js +17 -0
  666. package/dist/terraform/providers/kubernetes.js +253 -0
  667. package/dist/terraform/score.js +151 -0
  668. package/dist/terraform/state.js +67 -0
  669. package/dist/terraform/tier-map.js +74 -0
  670. package/dist/terraform/types.js +13 -0
  671. package/dist/terraform/unified-diff.js +132 -0
  672. package/dist/testing.js +295 -0
  673. package/dist/toml-emit.js +153 -0
  674. package/dist/toml-parse.js +355 -0
  675. package/dist/toml-utils.js +60 -0
  676. package/dist/toml.js +428 -0
  677. package/dist/ts-loader.d.ts +46 -0
  678. package/dist/ts-loader.d.ts.map +1 -0
  679. package/dist/ts-loader.js +103 -0
  680. package/dist/types.js +1 -0
  681. package/dist/utils.js +61 -0
  682. package/dist/validation.js +20 -0
  683. package/dist/vendor/js-yaml-load.js +1662 -0
  684. package/dist/workspace/__fixtures__/contract-repo.d.ts +7 -0
  685. package/dist/workspace/__fixtures__/contract-repo.d.ts.map +1 -1
  686. package/dist/workspace/__fixtures__/contract-repo.js +119 -0
  687. package/dist/workspace/__fixtures__/decide-workspace.js +112 -0
  688. package/dist/workspace/__fixtures__/sessions.d.ts +1 -1
  689. package/dist/workspace/__fixtures__/sessions.d.ts.map +1 -1
  690. package/dist/workspace/__fixtures__/sessions.js +91 -0
  691. package/dist/workspace/__fixtures__/two-member-workspace.js +34 -0
  692. package/dist/workspace/agent-cli.js +99 -0
  693. package/dist/workspace/agent.schema.json +390 -0
  694. package/dist/workspace/answers-ledger.js +89 -0
  695. package/dist/workspace/box-cli.js +142 -0
  696. package/dist/workspace/box-factory-write.js +196 -0
  697. package/dist/workspace/box-factory-write.schema.json +342 -0
  698. package/dist/workspace/box-factory.js +88 -0
  699. package/dist/workspace/box-intent.js +126 -0
  700. package/dist/workspace/box-isolation.js +169 -0
  701. package/dist/workspace/box-listing-write.schema.json +204 -0
  702. package/dist/workspace/box-listing.js +298 -0
  703. package/dist/workspace/box-publish.js +352 -0
  704. package/dist/workspace/box-publish.schema.json +498 -0
  705. package/dist/workspace/box-services.js +39 -0
  706. package/dist/workspace/broker-protocol.js +359 -0
  707. package/dist/workspace/broker-protocol.schema.json +228 -0
  708. package/dist/workspace/change-set.schema.json +462 -0
  709. package/dist/workspace/changes-cli.js +56 -0
  710. package/dist/workspace/changes.js +446 -0
  711. package/dist/workspace/changes.schema.json +642 -0
  712. package/dist/workspace/chant-migrations/chud-lexicon-exit-fly-site.js +198 -0
  713. package/dist/workspace/chant-migrations/chud-lexicon-exit-live-names.js +155 -0
  714. package/dist/workspace/chant-migrations/chud-lexicon-exit-rollback.js +214 -0
  715. package/dist/workspace/chant-migrations/chud-lexicon-exit-ship-inputs.js +180 -0
  716. package/dist/workspace/chant-migrations/chud-lexicon-exit-ship-policy.js +99 -0
  717. package/dist/workspace/chant-migrations/chud-lexicon-exit.js +847 -0
  718. package/dist/workspace/chant-migrations.js +113 -0
  719. package/dist/workspace/check.schema.json +433 -0
  720. package/dist/workspace/checks/box-isolation.js +62 -0
  721. package/dist/workspace/checks/boxes.js +491 -0
  722. package/dist/workspace/checks/diagrams.js +104 -0
  723. package/dist/workspace/checks/generated.js +419 -0
  724. package/dist/workspace/checks/ledgers.js +212 -0
  725. package/dist/workspace/checks/links.js +191 -0
  726. package/dist/workspace/checks/live.js +100 -0
  727. package/dist/workspace/checks/pipelines.js +188 -0
  728. package/dist/workspace/checks/records.js +169 -0
  729. package/dist/workspace/checks.js +426 -0
  730. package/dist/workspace/ci-green-cli.js +125 -0
  731. package/dist/workspace/ci-green-forge.js +83 -0
  732. package/dist/workspace/ci-green-workflow.d.ts +3 -1
  733. package/dist/workspace/ci-green-workflow.d.ts.map +1 -1
  734. package/dist/workspace/ci-green-workflow.js +202 -0
  735. package/dist/workspace/ci-green.js +325 -0
  736. package/dist/workspace/ci-last-green.schema.json +158 -0
  737. package/dist/workspace/class-data.d.ts +84 -0
  738. package/dist/workspace/class-data.d.ts.map +1 -0
  739. package/dist/workspace/class-data.js +238 -0
  740. package/dist/workspace/compose-graph.js +235 -0
  741. package/dist/workspace/compose-reports.js +146 -0
  742. package/dist/workspace/composites.js +264 -0
  743. package/dist/workspace/composites.schema.json +617 -0
  744. package/dist/workspace/conformance/__fixture__/app/package.json +7 -0
  745. package/dist/workspace/conformance/__fixture__/app/src/server.mjs +29 -0
  746. package/dist/workspace/conformance/__fixture__/decisions/decision.kind.mjs +54 -0
  747. package/dist/workspace/conformance/__fixture__/decisions/decision.schema.json +512 -0
  748. package/dist/workspace/conformance/__fixture__/decisions/fix-001-how-the-app-is-deployed.md +40 -0
  749. package/dist/workspace/conformance/__fixture__/delivery/chant.config.ts +7 -0
  750. package/dist/workspace/conformance/__fixture__/delivery/lexicon/index.ts +26 -0
  751. package/dist/workspace/conformance/__fixture__/delivery/package.json +7 -0
  752. package/dist/workspace/conformance/__fixture__/delivery/src/app.component.ts +14 -0
  753. package/dist/workspace/conformance/__fixture__/delivery/src/app.ts +4 -0
  754. package/dist/workspace/conformance/__fixtures__/reference-broker.js +205 -0
  755. package/dist/workspace/conformance/__writer_fixture__/answers/answer.kind.mjs +32 -0
  756. package/dist/workspace/conformance/__writer_fixture__/answers/answer.schema.json +135 -0
  757. package/dist/workspace/conformance/__writer_fixture__/contracts/contract.kind.mjs +37 -0
  758. package/dist/workspace/conformance/__writer_fixture__/contracts/contract.schema.json +213 -0
  759. package/dist/workspace/conformance/__writer_fixture__/decisions/points.json +228 -0
  760. package/dist/workspace/conformance/__writer_fixture__/drivers/driver.kind.mjs +15 -0
  761. package/dist/workspace/conformance/__writer_fixture__/drivers/driver.schema.json +38 -0
  762. package/dist/workspace/conformance/__writer_fixture__/sessions/session.kind.mjs +54 -0
  763. package/dist/workspace/conformance/__writer_fixture__/sessions/session.schema.json +289 -0
  764. package/dist/workspace/conformance/__writer_fixture__/work/W-001-the-writer-suite-works-this-item.md +25 -0
  765. package/dist/workspace/conformance/__writer_fixture__/work/work.kind.mjs +60 -0
  766. package/dist/workspace/conformance/__writer_fixture__/work/work.schema.json +603 -0
  767. package/dist/workspace/conformance/broker.js +736 -0
  768. package/dist/workspace/conformance/index.js +673 -0
  769. package/dist/workspace/conformance/vitest.js +108 -0
  770. package/dist/workspace/conformance/writer.js +1080 -0
  771. package/dist/workspace/decide.js +879 -0
  772. package/dist/workspace/decision-points.schema.json +135 -135
  773. package/dist/workspace/declaration-write-cli.js +74 -0
  774. package/dist/workspace/declaration-write.js +238 -0
  775. package/dist/workspace/declaration.js +938 -0
  776. package/dist/workspace/declaration.schema.json +1413 -1413
  777. package/dist/workspace/declared-kinds.js +106 -0
  778. package/dist/workspace/environments.js +164 -0
  779. package/dist/workspace/evidence.schema.json +279 -0
  780. package/dist/workspace/export-cli.js +185 -0
  781. package/dist/workspace/export.js +499 -0
  782. package/dist/workspace/factory-rules.js +175 -0
  783. package/dist/workspace/generated-files.js +92 -0
  784. package/dist/workspace/glob.js +45 -0
  785. package/dist/workspace/graph-cache.js +352 -0
  786. package/dist/workspace/graph-cli.js +348 -0
  787. package/dist/workspace/graph.schema.json +1338 -0
  788. package/dist/workspace/identity-gate-rule.js +75 -0
  789. package/dist/workspace/identity.js +126 -0
  790. package/dist/workspace/import.js +283 -0
  791. package/dist/workspace/init.js +620 -0
  792. package/dist/workspace/intent-cli.js +263 -0
  793. package/dist/workspace/intent-joins.js +201 -0
  794. package/dist/workspace/intent-record.js +352 -0
  795. package/dist/workspace/intent-record.schema.json +864 -0
  796. package/dist/workspace/intent.js +1582 -0
  797. package/dist/workspace/intent.schema.json +2420 -0
  798. package/dist/workspace/json-edit.js +221 -0
  799. package/dist/workspace/jsonc.js +235 -0
  800. package/dist/workspace/kind-readers.js +103 -0
  801. package/dist/workspace/kinds.d.ts +3 -7
  802. package/dist/workspace/kinds.d.ts.map +1 -1
  803. package/dist/workspace/kinds.js +553 -0
  804. package/dist/workspace/lexicon-symbols.js +112 -0
  805. package/dist/workspace/lineage-adopt-cli.js +102 -0
  806. package/dist/workspace/lineage-adopt.js +360 -0
  807. package/dist/workspace/lineage-check.js +282 -0
  808. package/dist/workspace/lineage-cli.js +121 -0
  809. package/dist/workspace/lineage-hash-index.js +284 -0
  810. package/dist/workspace/lineage-init.js +507 -0
  811. package/dist/workspace/lineage-lock.js +387 -0
  812. package/dist/workspace/lineage-merge.js +45 -0
  813. package/dist/workspace/lineage-migrations.d.ts.map +1 -1
  814. package/dist/workspace/lineage-migrations.js +329 -0
  815. package/dist/workspace/lineage-provenance.js +36 -0
  816. package/dist/workspace/lineage-update.js +138 -0
  817. package/dist/workspace/lineage-upgrade-cli.js +131 -0
  818. package/dist/workspace/lineage-upgrade.js +889 -0
  819. package/dist/workspace/lineage-vendor.js +171 -0
  820. package/dist/workspace/lineage-version.js +128 -0
  821. package/dist/workspace/lineage-versions.js +275 -0
  822. package/dist/workspace/links.js +330 -0
  823. package/dist/workspace/ls-generated.js +95 -0
  824. package/dist/workspace/ls.js +277 -0
  825. package/dist/workspace/ls.schema.json +333 -0
  826. package/dist/workspace/member-commands.js +508 -0
  827. package/dist/workspace/member-handles.js +216 -0
  828. package/dist/workspace/member-pipeline.js +258 -0
  829. package/dist/workspace/member-run.js +117 -0
  830. package/dist/workspace/member-write.schema.json +193 -0
  831. package/dist/workspace/nested-graph.js +156 -0
  832. package/dist/workspace/nesting.js +38 -0
  833. package/dist/workspace/patch.js +301 -0
  834. package/dist/workspace/patch.schema.json +321 -0
  835. package/dist/workspace/pin-cli.js +55 -0
  836. package/dist/workspace/pin-integrity.js +100 -0
  837. package/dist/workspace/plan-summary.schema.json +155 -0
  838. package/dist/workspace/point-answer.schema.json +129 -129
  839. package/dist/workspace/points-cli.js +291 -0
  840. package/dist/workspace/points-write.schema.json +660 -0
  841. package/dist/workspace/points.js +521 -0
  842. package/dist/workspace/points.schema.json +916 -0
  843. package/dist/workspace/pr-report.schema.json +108 -0
  844. package/dist/workspace/principal-classes.d.ts +4 -11
  845. package/dist/workspace/principal-classes.d.ts.map +1 -1
  846. package/dist/workspace/principal-classes.js +162 -0
  847. package/dist/workspace/reason-codes.js +326 -0
  848. package/dist/workspace/record-assets.js +151 -0
  849. package/dist/workspace/record-decided.js +105 -0
  850. package/dist/workspace/record-sessions.js +96 -0
  851. package/dist/workspace/record-source.js +114 -0
  852. package/dist/workspace/records-amend.schema.json +284 -0
  853. package/dist/workspace/records-checkout.js +76 -0
  854. package/dist/workspace/records-cli.js +707 -0
  855. package/dist/workspace/records-close.js +116 -0
  856. package/dist/workspace/records-close.schema.json +278 -0
  857. package/dist/workspace/records-new.schema.json +202 -0
  858. package/dist/workspace/records-review.schema.json +367 -0
  859. package/dist/workspace/records-since.js +317 -0
  860. package/dist/workspace/records-since.schema.json +218 -0
  861. package/dist/workspace/records-write.js +1229 -0
  862. package/dist/workspace/records.js +1345 -0
  863. package/dist/workspace/records.schema.json +604 -0
  864. package/dist/workspace/reference-kinds/app/package.json +10 -0
  865. package/dist/workspace/reference-kinds/app/workspace-kinds.json +45 -0
  866. package/dist/workspace/returns.js +303 -0
  867. package/dist/workspace/root-refusal.js +75 -0
  868. package/dist/workspace/run-statement.schema.json +622 -0
  869. package/dist/workspace/runs-cli.js +584 -0
  870. package/dist/workspace/runs-write.schema.json +994 -0
  871. package/dist/workspace/runs.js +708 -0
  872. package/dist/workspace/runs.schema.json +1257 -0
  873. package/dist/workspace/runtimes.js +76 -0
  874. package/dist/workspace/session-kinds.js +83 -0
  875. package/dist/workspace/signers.schema.json +206 -0
  876. package/dist/workspace/source-block.js +125 -0
  877. package/dist/workspace/squash.js +177 -0
  878. package/dist/workspace/status-gates.js +162 -0
  879. package/dist/workspace/status-stewards.js +330 -0
  880. package/dist/workspace/status.js +514 -0
  881. package/dist/workspace/status.schema.json +998 -0
  882. package/dist/workspace/steward-index.js +191 -0
  883. package/dist/workspace/symbols.js +188 -0
  884. package/dist/workspace/template-manifest.js +227 -0
  885. package/dist/workspace/template-pins.js +115 -0
  886. package/dist/workspace/trailer-joins.js +65 -0
  887. package/dist/workspace/trailers.js +111 -0
  888. package/dist/workspace/tree.js +136 -0
  889. package/dist/workspace/trust/attestor.js +63 -0
  890. package/dist/workspace/trust/dsse.js +108 -0
  891. package/dist/workspace/trust/evidence-cli.js +175 -0
  892. package/dist/workspace/trust/evidence.js +161 -0
  893. package/dist/workspace/trust/gate-seal.js +226 -0
  894. package/dist/workspace/trust/policy.js +190 -0
  895. package/dist/workspace/trust/provenance.js +180 -0
  896. package/dist/workspace/trust/rotation.js +298 -0
  897. package/dist/workspace/trust/run-commits.js +101 -0
  898. package/dist/workspace/trust/run-statement.js +182 -0
  899. package/dist/workspace/trust/seal.js +272 -0
  900. package/dist/workspace/trust/signers-cli.js +152 -0
  901. package/dist/workspace/trust/ssh-commit.js +178 -0
  902. package/dist/workspace/trust/test-repo.js +118 -0
  903. package/dist/workspace/trust/trust-files.js +193 -0
  904. package/dist/workspace/trust/verify-cli.js +63 -0
  905. package/dist/workspace/trust/verify.js +192 -0
  906. package/dist/workspace/which-chant.js +141 -0
  907. package/dist/workspace/wip-cli.js +95 -0
  908. package/dist/workspace/wip-write.schema.json +504 -0
  909. package/dist/workspace/wip.js +631 -0
  910. package/dist/workspace/wip.schema.json +334 -0
  911. package/dist/workspace/work-cli.js +448 -0
  912. package/dist/workspace/work-evidence.js +122 -0
  913. package/dist/workspace/work-evidence.schema.json +222 -0
  914. package/dist/workspace/work-history.schema.json +421 -0
  915. package/dist/workspace/work-lease.schema.json +246 -0
  916. package/dist/workspace/work-size.js +77 -0
  917. package/dist/workspace/work.js +283 -0
  918. package/dist/workspace/workspace-kinds.schema.json +259 -259
  919. package/dist/workspace/workspace-principals.schema.json +53 -53
  920. package/dist/workspace/write-lock-cli.js +105 -0
  921. package/dist/workspace/write-lock.js +424 -0
  922. package/dist/workspace/write-lock.schema.json +172 -0
  923. package/dist/workspace/write-scope.js +484 -0
  924. package/dist/yaml.js +459 -0
  925. package/package.json +2 -2
  926. package/src/build.ts +8 -0
  927. package/src/change-set.test.ts +48 -0
  928. package/src/change-set.ts +52 -2
  929. package/src/ci-jobs.test.ts +49 -0
  930. package/src/ci-jobs.ts +515 -0
  931. package/src/cli/commands/check-lexicon-plugin.ts +2 -0
  932. package/src/cli/commands/lint.ts +3 -0
  933. package/src/cli/commands/migrate.ts +2 -0
  934. package/src/cli/compiled-cli.e2e.test.ts +165 -0
  935. package/src/cli/main.ts +121 -27
  936. package/src/cli/mcp/workspace-tools.ts +1 -1
  937. package/src/codegen/pinned-upgrade.ts +2 -0
  938. package/src/components/discover.ts +2 -0
  939. package/src/components/pr-pipeline.ts +3 -2
  940. package/src/components/sandbox/driver.ts +3 -1
  941. package/src/composite.ts +15 -3
  942. package/src/config-import.ts +3 -0
  943. package/src/discovery/collect.ts +15 -1
  944. package/src/discovery/fold-build-parity.test.ts +71 -0
  945. package/src/discovery/fold-import.ts +25 -127
  946. package/src/discovery/fold-project-provenance.test.ts +21 -4
  947. package/src/discovery/host-composite.ts +101 -0
  948. package/src/discovery/import.ts +2 -0
  949. package/src/discovery/index.ts +11 -1
  950. package/src/discovery/sandbox/driver.ts +3 -1
  951. package/src/gate-decision-bundle.test.ts +5 -4
  952. package/src/gate-decision-identity.test.ts +59 -6
  953. package/src/gate-decision.ts +81 -21
  954. package/src/lexicon-module.ts +3 -0
  955. package/src/lifecycle/gate-audit.test.ts +55 -1
  956. package/src/lifecycle/gate-audit.ts +116 -3
  957. package/src/lifecycle/gate-ledger.test.ts +20 -1
  958. package/src/lifecycle/gate-ledger.ts +33 -1
  959. package/src/lint/config.ts +1 -1
  960. package/src/lint/discover.ts +28 -8
  961. package/src/lint/policy-import.ts +4 -1
  962. package/src/lint/rule-loader.ts +2 -0
  963. package/src/op/activities/activity-contracts.ts +1 -1
  964. package/src/op/activities/change-set.ts +11 -3
  965. package/src/op/activities/lexicon-upgrade.test.ts +2 -0
  966. package/src/op/activities/reconcile.test.ts +62 -2
  967. package/src/op/activities/reconcile.ts +46 -22
  968. package/src/op/builders.ts +1 -1
  969. package/src/op/discover.ts +3 -0
  970. package/src/op/op-waves-run.ts +4 -3
  971. package/src/op/op-waves.test.ts +2 -0
  972. package/src/op/work-lease-run.test.ts +12 -4
  973. package/src/ts-loader.test.ts +23 -0
  974. package/src/ts-loader.ts +122 -0
  975. package/src/workspace/__fixtures__/contract-repo.ts +17 -1
  976. package/src/workspace/__fixtures__/sessions.ts +3 -3
  977. package/src/workspace/change-set.schema.json +5 -3
  978. package/src/workspace/chant-migrations/chud-lexicon-exit.ts +1 -1
  979. package/src/workspace/ci-green-workflow.test.ts +4 -4
  980. package/src/workspace/ci-green-workflow.ts +5 -2
  981. package/src/workspace/class-data.test.ts +64 -0
  982. package/src/workspace/class-data.ts +236 -0
  983. package/src/workspace/declaration.ts +1 -1
  984. package/src/workspace/kinds.ts +7 -36
  985. package/src/workspace/lineage-migrations.ts +2 -0
  986. package/src/workspace/points.ts +1 -1
  987. package/src/workspace/principal-classes.ts +12 -95
  988. package/src/workspace/records-formats.test.ts +7 -2
  989. package/src/workspace/records-sessions-write.test.ts +3 -3
  990. package/src/workspace/status-contract.e2e.test.ts +37 -0
  991. package/src/workspace/status-contract.test.ts +23 -21
@@ -0,0 +1,448 @@
1
+ /**
2
+ * The job primitives chant's three CI generators share (#3765): the scheduled
3
+ * Op pipeline (`generateOpsPipeline`), the Op waves pipeline
4
+ * (`generateOpWavesPipeline`) and the component pipeline (`chant build
5
+ * --components --generate`, with `--pr-loop`, `--wave-gate` and
6
+ * `--promote-to`). Each forge lexicon builds its documents from these, so a
7
+ * trigger, a token, a permission rule or an image default is decided once:
8
+ *
9
+ * - the image a generated job runs in, {@link CI_IMAGE};
10
+ * - the branches a trigger filters on, {@link triggerBranches};
11
+ * - the job token and secret expressions of GitHub Actions and Forgejo
12
+ * Actions, {@link GITHUB_JOB_TOKEN} and {@link githubSecret};
13
+ * - the `permissions:` a finding-mode needs and the rules for adding to it,
14
+ * {@link permissionsFor} and {@link mergePermissions};
15
+ * - the `setup` steps and `environment` a job may carry, checked once per
16
+ * forge ({@link assertSetupSteps}, {@link assertEnvironment},
17
+ * {@link gitlabSetupScript}, {@link assertGitlabEnvironment});
18
+ * - GitLab's `rules:` expressions and `id_tokens:` declaration.
19
+ *
20
+ * The Forgejo dialect (action refs, dropped `permissions:` and
21
+ * `environment:`, the header note naming what was dropped) is the forgejo
22
+ * lexicon's, in its `components/ci-jobs.ts`, since the transform it applies
23
+ * lives there.
24
+ */
25
+ // ── Every forge ─────────────────────────────────────────────────────────────
26
+ /**
27
+ * The image every generated job runs in unless the caller names another. It
28
+ * carries node and npm, which `chant` needs, and git, which a job that reads
29
+ * the base commit or pushes to `chant/lifecycle` needs (#3789).
30
+ */
31
+ export const CI_IMAGE = "node:22";
32
+ /**
33
+ * The branch a `push` trigger filters on when it names none. A generator
34
+ * works from a spec, not a checkout, so it cannot read a project's real
35
+ * default branch; a project on another one names it.
36
+ */
37
+ export const DEFAULT_BRANCH = "main";
38
+ /**
39
+ * The branches a push trigger filters on: the ones given, or
40
+ * {@link DEFAULT_BRANCH} when none are. An empty list is none, on every
41
+ * forge.
42
+ */
43
+ export function pushBranches(branches) {
44
+ return branches && branches.length > 0 ? [...branches] : [DEFAULT_BRANCH];
45
+ }
46
+ /**
47
+ * The branches a trigger filters on: a `pull_request` trigger's list, or
48
+ * undefined for every branch; a `push` trigger's, with {@link pushBranches}'
49
+ * default; none for `cron`.
50
+ */
51
+ export function triggerBranches(trigger) {
52
+ switch (trigger.kind) {
53
+ case "cron":
54
+ return undefined;
55
+ case "pull_request":
56
+ return trigger.branches && trigger.branches.length > 0 ? [...trigger.branches] : undefined;
57
+ case "push":
58
+ return pushBranches(trigger.branches);
59
+ }
60
+ }
61
+ /** A job id every forge accepts, from a kebab- or camel-cased name. */
62
+ export function ciJobName(name) {
63
+ return name.replace(/([a-z0-9])([A-Z])/g, "$1-$2").toLowerCase();
64
+ }
65
+ /** A command template with each `{name}` part filled in. */
66
+ export function fillCommand(template, name) {
67
+ return template.map((part) => part.replace("{name}", name));
68
+ }
69
+ /** `{ [key]: map }` when the map has an entry, else `{}`: for spreading an optional mapping into a document. */
70
+ export function nonEmpty(key, map) {
71
+ return map && Object.keys(map).length > 0 ? { [key]: map } : {};
72
+ }
73
+ /**
74
+ * A job's `environment:` mapping. Always the mapping form, never the string
75
+ * shorthand, so adding a `url` later is a new key rather than a reshaped
76
+ * value. GitHub and GitLab read the same two keys.
77
+ */
78
+ export function environmentDoc(environment) {
79
+ return { name: environment.name, ...(environment.url === undefined ? {} : { url: environment.url }) };
80
+ }
81
+ /** The directory part of a relative path, `.` when there is none. */
82
+ export function dirnameOf(path) {
83
+ const i = path.lastIndexOf("/");
84
+ return i <= 0 ? "." : path.slice(0, i);
85
+ }
86
+ // ── GitHub Actions and Forgejo Actions ──────────────────────────────────────
87
+ /** The runner label a generated job asks for; the Forgejo dialect rewrites it to the project's label. */
88
+ export const GITHUB_RUNNER = "ubuntu-latest";
89
+ /** The job token, which GitHub and Forgejo both mint for every run. */
90
+ export const GITHUB_JOB_TOKEN = "${{ github.token }}";
91
+ /** A repository secret, by name. */
92
+ export function githubSecret(name) {
93
+ return `\${{ secrets.${name} }}`;
94
+ }
95
+ /**
96
+ * A repository secret, or the job token when the secret is unset (#3624). An
97
+ * unset secret reads as the empty string, so a workflow generated for a
98
+ * production token still runs in a fork or a fresh repository, with what the
99
+ * job token may do.
100
+ */
101
+ export function githubSecretOrJobToken(name) {
102
+ return `\${{ secrets.${name} || github.token }}`;
103
+ }
104
+ /** Each name mapped from the repository secret of the same name. */
105
+ export function githubSecretEnv(names) {
106
+ return Object.fromEntries(names.map((n) => [n, githubSecret(n)]));
107
+ }
108
+ /**
109
+ * Least-privilege `permissions:` for a finding-mode. `report` needs no write
110
+ * access; `issue` needs only `issues: write`; `pull-request` (and
111
+ * `merge-request`, generated the same way when a GitLab-authored spec is
112
+ * targeted at github) needs `contents: write` to push the reconcile branch
113
+ * plus `pull-requests: write` to open the PR. `comment` changes nothing in
114
+ * the repository, so its whole scope is `{ contents: read, pull-requests:
115
+ * write }`.
116
+ */
117
+ export function permissionsForMode(mode) {
118
+ switch (mode) {
119
+ case "issue":
120
+ return { contents: "read", issues: "write" };
121
+ case "comment":
122
+ return { contents: "read", "pull-requests": "write" };
123
+ case "pull-request":
124
+ case "merge-request":
125
+ return { contents: "write", "pull-requests": "write" };
126
+ case "report":
127
+ return { contents: "read" };
128
+ }
129
+ }
130
+ /**
131
+ * {@link permissionsForMode} on a trigger. A `pull_request` trigger reports
132
+ * its finding as a comment on the triggering PR itself (#2084): any mode but
133
+ * `report` posts something to act on a finding, so on that trigger every
134
+ * such mode also gets `pull-requests: write` for the comment.
135
+ */
136
+ export function permissionsFor(mode, trigger) {
137
+ const base = permissionsForMode(mode);
138
+ if (trigger.kind === "pull_request" && mode !== "report")
139
+ return { ...base, "pull-requests": "write" };
140
+ return base;
141
+ }
142
+ /**
143
+ * Every scope `GITHUB_TOKEN` accepts in a workflow's `permissions:` mapping,
144
+ * kebab-cased as GitHub spells them. An additive scope outside this set is
145
+ * refused by name rather than emitted: GitHub ignores an unknown key, so
146
+ * `id_token` or `idToken` would generate a workflow that looks like it grants
147
+ * OIDC and hands the run no token at all.
148
+ */
149
+ export const GITHUB_TOKEN_SCOPES = new Set([
150
+ "actions",
151
+ "attestations",
152
+ "checks",
153
+ "contents",
154
+ "deployments",
155
+ "discussions",
156
+ "id-token",
157
+ "issues",
158
+ "models",
159
+ "packages",
160
+ "pages",
161
+ "pull-requests",
162
+ "repository-projects",
163
+ "security-events",
164
+ "statuses",
165
+ ]);
166
+ /**
167
+ * Merge a spec's additive `permissions` over the finding-mode's own set
168
+ * (#2242), refusing by name anything that is not strictly additive:
169
+ *
170
+ * - a blanket `write-all`/`read-all`, in either the key or the value
171
+ * position, which is the exact thing {@link permissionsForMode} exists to
172
+ * avoid;
173
+ * - a scope GitHub does not define ({@link GITHUB_TOKEN_SCOPES}), because
174
+ * GitHub ignores the key and the run silently gets nothing;
175
+ * - a scope the mode already grants, at any value — additive means additive,
176
+ * so this can neither downgrade `contents: write` to read nor restate it.
177
+ * A mode whose set is wrong is fixed by changing the mode, where the
178
+ * scope and the behavior that spends it stay together;
179
+ * - `pull-requests: write` on a trigger with no pull request. Pull-request
180
+ * access is what the finding-modes own: `pull-request` grants it together
181
+ * with the `contents: write` needed to push the branch first, and
182
+ * `comment` grants it on the one trigger that carries a pull request to
183
+ * comment on. Adding it beside a mode that posts nothing, on a cron or
184
+ * push run, grants write access no step in the generated job can spend.
185
+ */
186
+ export function mergePermissions(name, base, additive, trigger) {
187
+ const merged = { ...base };
188
+ for (const [rawScope, value] of Object.entries(additive)) {
189
+ const scope = rawScope.trim();
190
+ const where = `Scheduled Op "${name}" adds permission "${scope}: ${value}"`;
191
+ if (scope === "write-all" || scope === "read-all" || String(value).endsWith("-all")) {
192
+ throw new Error(`${where}, a blanket grant. \`permissions\` on a scheduled Op is additive over the ` +
193
+ `least-privilege set its finding-mode needs, one named scope at a time. Name the scopes the ` +
194
+ `job actually spends (e.g. { "id-token": "write" }).`);
195
+ }
196
+ if (!GITHUB_TOKEN_SCOPES.has(scope)) {
197
+ throw new Error(`${where}, which is not a GITHUB_TOKEN permission scope. GitHub ignores an unrecognized key, so ` +
198
+ `this would emit a workflow that reads as granted and hands the run nothing. Known scopes: ` +
199
+ `${[...GITHUB_TOKEN_SCOPES].sort().join(", ")}.`);
200
+ }
201
+ if (scope in base) {
202
+ throw new Error(`${where}, but its finding-mode already grants "${scope}: ${base[scope]}". These permissions are ` +
203
+ `additive only — they never replace, widen or downgrade a scope the mode computed. Change the ` +
204
+ `Op's findingMode if that set is wrong, and add only scopes no mode grants (e.g. "id-token").`);
205
+ }
206
+ if (scope === "pull-requests" && trigger.kind !== "pull_request") {
207
+ throw new Error(`${where}, but this Op's trigger is "${trigger.kind}", which carries no pull request. Pull-request ` +
208
+ `write access belongs to a finding-mode: "pull-request" grants it with the contents: write its ` +
209
+ `branch push needs, and "comment" grants it on the pull_request trigger. Set findingMode instead ` +
210
+ `of adding the scope here.`);
211
+ }
212
+ merged[scope] = value;
213
+ }
214
+ return merged;
215
+ }
216
+ /**
217
+ * Refs that name an action repository's own default branch. A generated
218
+ * workflow is committed once and then re-run unattended, often over a cloud
219
+ * role, so "whatever was pushed to that repo last" is not a version — the
220
+ * code that assumes the role can change between the run somebody reviewed and
221
+ * the next one. A release channel the action's author cuts deliberately (`v6`,
222
+ * `v6.2.4`, `stable`) or a commit sha is a version, and both pass.
223
+ */
224
+ const DEFAULT_BRANCH_REFS = new Set(["main", "master", "head", "default"]);
225
+ /** `owner/repo` or `owner/repo/subpath`, then `@ref`. */
226
+ const USES_PATTERN = /^([A-Za-z0-9_.-]+)\/([A-Za-z0-9_.-]+)((?:\/[A-Za-z0-9_.-]+)*)@([^\s@]+)$/;
227
+ /**
228
+ * Validate a `setup` list for GitHub or Forgejo Actions (#2242). A `run`
229
+ * entry needs a non-empty line and nothing else. A `uses` entry has to be a
230
+ * pinned `owner/repo[/subpath]@ref`: no bare `owner/repo`, since an unpinned
231
+ * action resolves to its default branch, and no ref in
232
+ * {@link DEFAULT_BRANCH_REFS} for the same reason spelled out loud. Local
233
+ * (`./path`) and container (`docker://`) refs are refused too — they are
234
+ * legal GitHub Actions, but the generator emits a workflow into a repository
235
+ * it has never seen, so it cannot know a local path resolves there.
236
+ */
237
+ export function assertSetupSteps(name, setup) {
238
+ setup.forEach((step, index) => {
239
+ const where = `Scheduled Op "${name}" setup step ${index + 1}`;
240
+ if ("uses" in step) {
241
+ const ref = step.uses.trim();
242
+ const match = USES_PATTERN.exec(ref);
243
+ if (!match) {
244
+ throw new Error(`${where} has \`uses: "${step.uses}"\`, which is not a pinned action reference. ` +
245
+ `Write it as owner/repo@ref (optionally owner/repo/subpath@ref), e.g. ` +
246
+ `"aws-actions/configure-aws-credentials@v6". A local "./path" or "docker://" ref is not ` +
247
+ `accepted here: this generator emits a workflow into a repository it cannot inspect, so it ` +
248
+ `has no way to tell whether such a ref resolves there.`);
249
+ }
250
+ const gitRef = match[4];
251
+ if (DEFAULT_BRANCH_REFS.has(gitRef.toLowerCase())) {
252
+ throw new Error(`${where} pins \`uses: "${step.uses}"\` to "${gitRef}", the action repository's own default ` +
253
+ `branch, which names whatever was pushed there last rather than a version. A generated ` +
254
+ `workflow is committed once and re-run unattended, often over a cloud role, so pin a release ` +
255
+ `tag or a commit sha instead (e.g. "${match[1]}/${match[2]}@v1" or "@<40-char sha>").`);
256
+ }
257
+ return;
258
+ }
259
+ if (step.run.trim() === "") {
260
+ throw new Error(`${where} has an empty \`run\` line. Give it a command, or drop the entry.`);
261
+ }
262
+ });
263
+ }
264
+ /** One setup entry as a GitHub Actions step: `with:` and `env:` only when they hold something. */
265
+ export function setupStepDoc(step) {
266
+ if ("uses" in step) {
267
+ return {
268
+ uses: step.uses,
269
+ ...nonEmpty("with", step.with),
270
+ ...nonEmpty("env", step.env),
271
+ };
272
+ }
273
+ return { run: step.run, ...nonEmpty("env", step.env) };
274
+ }
275
+ /**
276
+ * Validate an `environment` for GitHub Actions (#2257). GitHub creates an
277
+ * environment it has never seen on first use rather than failing the run,
278
+ * and an environment created that way carries no protection rules at all —
279
+ * so a job can name one and read as gated while being gated by nothing.
280
+ * Neither the generator nor GitHub can tell those apart at build time, which
281
+ * is why what is refused here is only the shape that could never bind: a
282
+ * name that is blank, and a `url` that is neither absolute nor an expression
283
+ * the forge resolves.
284
+ */
285
+ export function assertEnvironment(name, environment) {
286
+ const where = `Scheduled Op "${name}" environment`;
287
+ if (environment.name.trim() === "") {
288
+ throw new Error(`${where} has an empty \`name\`. An environment is named repository configuration — the ` +
289
+ `protection rules and reviewers live on the environment, not in this workflow — so there is ` +
290
+ `nothing for a blank name to resolve to. Give it the environment's name, or drop the option.`);
291
+ }
292
+ if (environment.url === undefined)
293
+ return;
294
+ const url = environment.url.trim();
295
+ if (url === "") {
296
+ throw new Error(`${where} "${environment.name}" has an empty \`url\`. Omit the field rather than setting it to "".`);
297
+ }
298
+ if (!/^https?:\/\//.test(url) && !url.includes("${{")) {
299
+ throw new Error(`${where} "${environment.name}" has \`url: "${environment.url}"\`, which is neither an absolute ` +
300
+ `http(s) URL nor a \${{ }} expression. GitHub renders this value as the deployment's own link, ` +
301
+ `so a relative path becomes a dead link on the environment page rather than an error anywhere. ` +
302
+ `Write the full URL, or an expression the run resolves to one.`);
303
+ }
304
+ }
305
+ // ── GitLab CI ───────────────────────────────────────────────────────────────
306
+ /** The pipeline source GitLab reports for a merge-request pipeline. */
307
+ export const GITLAB_MERGE_REQUEST_SOURCE = '$CI_PIPELINE_SOURCE == "merge_request_event"';
308
+ /** The pipeline source GitLab reports for a pipeline schedule. */
309
+ export const GITLAB_SCHEDULE_SOURCE = '$CI_PIPELINE_SOURCE == "schedule"';
310
+ /** A job variable that makes the runner clone the whole history, which a job reading the base commit needs. */
311
+ export const GITLAB_FULL_HISTORY = { GIT_DEPTH: "0" };
312
+ /** The `rules:` if-expression for a push to `branch`, a quoted name or an expression such as `$CI_DEFAULT_BRANCH`. */
313
+ export function gitlabPushRule(branch) {
314
+ return `$CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_BRANCH == ${branch}`;
315
+ }
316
+ /**
317
+ * Refuse a branch name that cannot be interpolated into a `rules:`
318
+ * if-expression. The expression is a string GitLab parses, so a `"` would end
319
+ * it early and a `$` would expand as a variable — either one silently changes
320
+ * which pipelines match the job, which is worse than not generating it.
321
+ * `subject` names what filters, such as `Scheduled Op "apply"`.
322
+ */
323
+ export function assertGitlabBranch(subject, branch) {
324
+ if (branch.trim() === "") {
325
+ throw new Error(`${subject} has an empty branch filter. Name a branch, or drop the filter.`);
326
+ }
327
+ if (/["$\\]/.test(branch)) {
328
+ throw new Error(`${subject} filters on branch "${branch}", which carries a character this generator ` +
329
+ `cannot put in a GitLab \`rules:\` expression: a quote would end the expression early and a "$" ` +
330
+ `would expand as a CI/CD variable, either of which silently changes which pipelines run the job. ` +
331
+ `Name a branch without \`"\`, \`$\` or \`\\\`.`);
332
+ }
333
+ }
334
+ /**
335
+ * One `rules:` entry per branch a trigger filters on, each checked by
336
+ * {@link assertGitlabBranch}. Two or more branches are two or more entries:
337
+ * `rules:` is an OR over its list, which is how GitLab spells the alternation
338
+ * github expresses as a `branches:` array. A cron trigger is selected by
339
+ * `selector`, the CI/CD variable a pipeline schedule sets, and the Op's name.
340
+ */
341
+ export function gitlabRules(subject, trigger, selector) {
342
+ switch (trigger.kind) {
343
+ case "cron":
344
+ return [{ if: `${GITLAB_SCHEDULE_SOURCE} && $${selector.variable} == "${selector.value}"` }];
345
+ case "pull_request": {
346
+ const branches = triggerBranches(trigger);
347
+ if (!branches)
348
+ return [{ if: GITLAB_MERGE_REQUEST_SOURCE }];
349
+ return branches.map((branch) => {
350
+ assertGitlabBranch(subject, branch);
351
+ return { if: `${GITLAB_MERGE_REQUEST_SOURCE} && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "${branch}"` };
352
+ });
353
+ }
354
+ case "push":
355
+ return pushBranches(trigger.branches).map((branch) => {
356
+ assertGitlabBranch(subject, branch);
357
+ return { if: gitlabPushRule(JSON.stringify(branch)) };
358
+ });
359
+ }
360
+ }
361
+ /**
362
+ * The `id_tokens:` entry an `id-token: write` spec gets. The name is the
363
+ * environment variable the JWT lands in, which the job's own setup line reads
364
+ * (`aws sts assume-role-with-web-identity --web-identity-token
365
+ * "$CHANT_ID_TOKEN"`, or the provider's equivalent).
366
+ *
367
+ * `$CI_SERVER_URL` as the audience is GitLab's own documented default: an
368
+ * identity provider federated to a GitLab instance is registered with that
369
+ * instance's URL as its audience, and the variable expands to exactly that on
370
+ * gitlab.com and on a self-managed instance alike.
371
+ */
372
+ export const GITLAB_ID_TOKEN_NAME = "CHANT_ID_TOKEN";
373
+ export const GITLAB_ID_TOKEN_AUDIENCE = "$CI_SERVER_URL";
374
+ /**
375
+ * Turn additive `permissions` (#2242) into the one GitLab declaration that
376
+ * carries the same meaning, refusing everything else by name.
377
+ *
378
+ * `id-token: write` is that one: GitLab's OIDC surface is `id_tokens:`, a
379
+ * per-job declaration of a JWT the job exchanges for cloud credentials
380
+ * itself. `id-token: read` is refused rather than mapped, because GitLab
381
+ * either mints the token into the job or does not. Every other scope is
382
+ * refused: GitLab has no per-job token-scope mapping at all, and a scope
383
+ * quietly dropped would emit a job that reads as granted and runs with
384
+ * nothing.
385
+ */
386
+ export function gitlabIdTokens(name, permissions) {
387
+ let wantsIdToken = false;
388
+ for (const [rawScope, value] of Object.entries(permissions ?? {})) {
389
+ const scope = rawScope.trim();
390
+ if (scope === "id-token") {
391
+ if (value !== "write") {
392
+ throw new Error(`Scheduled Op "${name}" adds permission "id-token: ${value}", but GitLab either mints an ` +
393
+ `OIDC token into a job or does not — there is no read-only half of an \`id_tokens:\` ` +
394
+ `declaration. Ask for { "id-token": "write" }, or drop the option.`);
395
+ }
396
+ wantsIdToken = true;
397
+ continue;
398
+ }
399
+ throw new Error(`Scheduled Op "${name}" adds permission "${scope}: ${value}", but GitLab CI has no per-job ` +
400
+ `token-scope mapping — there is no \`permissions:\` key to add it to (#2242). The one scope that ` +
401
+ `does cross over is "id-token": "write", which becomes an \`id_tokens:\` declaration. Drop the ` +
402
+ `option here, or generate this Op for github.`);
403
+ }
404
+ return wantsIdToken ? { [GITLAB_ID_TOKEN_NAME]: { aud: GITLAB_ID_TOKEN_AUDIENCE } } : undefined;
405
+ }
406
+ /**
407
+ * A `setup` list as GitLab `script:` lines. A `uses` entry is a GitHub
408
+ * Actions marketplace action, which GitLab has no shape for, so it is refused
409
+ * by name rather than dropped. `subject` names whose setup it is, such as
410
+ * `Scheduled Op "apply"`.
411
+ */
412
+ export function gitlabSetupScript(subject, setup) {
413
+ return (setup ?? []).map((step, index) => {
414
+ if ("uses" in step) {
415
+ throw new Error(`${subject} setup step ${index + 1} is \`uses: "${step.uses}"\`, a GitHub Actions ` +
416
+ `marketplace action. GitLab CI jobs run \`script\` lines only, so there is nothing to translate it ` +
417
+ `into (#2242). Express the setup as a \`{ run }\` entry, or generate it for github/forgejo.`);
418
+ }
419
+ return step.run;
420
+ });
421
+ }
422
+ /**
423
+ * Validate an `environment` on GitLab's own terms (#2257). A GitLab job
424
+ * naming an environment that does not exist creates an unprotected one on
425
+ * first deploy rather than failing, so the only shapes worth refusing at
426
+ * build time are the ones that could never bind: a blank name, and a `url`
427
+ * that is neither absolute nor a variable expression GitLab expands, which
428
+ * would render as a dead "View deployment" link.
429
+ */
430
+ export function assertGitlabEnvironment(name, environment) {
431
+ const where = `Scheduled Op "${name}" environment`;
432
+ if (environment.name.trim() === "") {
433
+ throw new Error(`${where} has an empty \`name\`. A GitLab environment is a project object, and its approval ` +
434
+ `rules live on that object rather than in this file, so a blank name resolves to nothing. ` +
435
+ `Give it the environment's name, or drop the option.`);
436
+ }
437
+ if (environment.url === undefined)
438
+ return;
439
+ const url = environment.url.trim();
440
+ if (url === "") {
441
+ throw new Error(`${where} "${environment.name}" has an empty \`url\`. Omit the field rather than setting it to "".`);
442
+ }
443
+ if (!/^https?:\/\//.test(url) && !url.includes("$")) {
444
+ throw new Error(`${where} "${environment.name}" has \`url: "${environment.url}"\`, which is neither an absolute ` +
445
+ `http(s) URL nor a variable expression GitLab expands. It becomes the environment's own link, ` +
446
+ `so a relative path is a dead link on the environment page rather than an error anywhere.`);
447
+ }
448
+ }
@@ -0,0 +1,135 @@
1
+ /**
2
+ * The claimed-field set (#2160) — which properties this declaration ever set.
3
+ *
4
+ * chant's ownership question has always been answered per resource, from a
5
+ * marker: is this thing mine. The finer question was never asked. A live
6
+ * property tree carries fields nobody declared — an autoscaler's replica count,
7
+ * a controller's annotation, a value a person typed into a console — and the
8
+ * deep diff (./lifecycle/deep-diff.ts) reported every one of them as a
9
+ * difference, because a difference is all a two-way comparison can produce.
10
+ *
11
+ * Every lexicon has been paying for that in hand-written knowledge.
12
+ * `DeepNormalizationHooks.prune` is where the noise goes, and three of the four
13
+ * hooks exist because the live tree holds fields the declaration never
14
+ * mentions. Kubernetes is the one substrate that escapes it: the API server
15
+ * records a field manager per field (`metadata.managedFields`), so a foreign
16
+ * write is a fact about the object rather than a rule somebody maintains.
17
+ * `lexicons/gcp/src/deep-observe.ts` says why nobody else can do that — "a REST
18
+ * payload carries no field ownership" — and answers with a static per-kind
19
+ * table instead.
20
+ *
21
+ * The declaration is the table they are missing. A `ResourceDeclarable`'s
22
+ * `props` are exactly the fields chant set, they are available on every
23
+ * substrate, and they come from the same build that produced the entity.
24
+ * Nothing has to come back from the provider.
25
+ *
26
+ * ## The grammar is the diff's grammar
27
+ *
28
+ * A claim is a set of property paths in the form `flattenDeepProperties`
29
+ * produces: `spec.replicas`, `Tags[#env].Value`, `ingress[0].fromPort`. Same
30
+ * hooks, same normalization, same flattening — so a path in the claim and a
31
+ * path in the diff are the same string or they are different fields. Deriving
32
+ * the claim any other way (walking raw props, say) would give a set that agrees
33
+ * with the diff for most trees and disagrees for exactly the ones the hooks
34
+ * were written for.
35
+ *
36
+ * ## Membership is exact, deliberately
37
+ *
38
+ * A claimed path is matched exactly, never by its index-erased pattern
39
+ * (`Tags[].Value`). The pattern is the right test for
40
+ * {@link import("./deep-observation.js").DeepNode.counterpart}, which asks a
41
+ * shape question ("did source declare tag values at all") before array order is
42
+ * canonical. Classification asks a value question, and it pairs a declared
43
+ * value with a live one at the same path. A pattern match would answer
44
+ * "declared" for a path that has no declared value to compare against, which is
45
+ * neither of the two declared classifications and would quietly become a third
46
+ * meaning of "drift".
47
+ *
48
+ * ## What the claim does not decide
49
+ *
50
+ * It does not prune. A field chant never declared still reaches the diff, still
51
+ * appears in the report, and still carries its live value — it is reported as
52
+ * unclaimed rather than dropped, because chant #1191 already lost a
53
+ * console-added label by pruning what it could not attribute. What the claim
54
+ * changes is the verdict: unclaimed is not drift, and drift is the only thing
55
+ * that may become an update.
56
+ */
57
+ import { deepValueEqual, flattenDeepProperties, normalizeDeepProperties, } from "./deep-observation.js";
58
+ /** An empty claim — a declaration with no props, and the safe default. */
59
+ export const NO_CLAIMED_FIELDS = { paths: new Set() };
60
+ /**
61
+ * Build a claim from an already-normalized declared property tree.
62
+ *
63
+ * `options` must be the same {@link FlattenDeepOptions} the diff flattens the
64
+ * declared side with, or the two disagree about keyed list segments.
65
+ */
66
+ export function claimedFieldsOfTree(declared, options) {
67
+ const flat = flattenDeepProperties(declared, {
68
+ entityType: options.entityType,
69
+ side: "declared",
70
+ ...(options.hooks ? { hooks: options.hooks } : {}),
71
+ });
72
+ return { paths: new Set(flat.keys()) };
73
+ }
74
+ /**
75
+ * Build a claim straight from a declaration's raw `props` — the entry point for
76
+ * a consumer that has an entity and no diff.
77
+ *
78
+ * Normalizes with the lexicon's own hooks first, exactly as the diff does, so
79
+ * pruned and masked paths land the same way on both routes. `livePaths` is the
80
+ * counterpart set (`deepPathSet` over the live tree) where the caller has one:
81
+ * without it the pass runs one-sided and any hook gated on
82
+ * {@link import("./deep-observation.js").DeepNode.counterpart} sees `"unknown"`,
83
+ * which is the honest answer and prunes nothing default-related.
84
+ */
85
+ export function claimedFieldsOfProps(props, options) {
86
+ const normalized = normalizeDeepProperties(props, {
87
+ entityType: options.entityType,
88
+ side: "declared",
89
+ ...(options.hooks ? { hooks: options.hooks } : {}),
90
+ ...(options.livePaths ? { counterpartPaths: options.livePaths } : {}),
91
+ });
92
+ return claimedFieldsOfTree(normalized, options);
93
+ }
94
+ /** True when this declaration set the property at `path`. */
95
+ export function isClaimed(claimed, path) {
96
+ return claimed !== undefined && claimed.paths.has(path);
97
+ }
98
+ /**
99
+ * The claim as a sorted array — the wire form, for
100
+ * {@link import("./deep-observation.js").DeepResourceObservation.claimedFields}
101
+ * and for anything serializing a result to JSON.
102
+ */
103
+ export function claimedFieldPaths(claimed) {
104
+ return [...claimed.paths].sort();
105
+ }
106
+ /** Rebuild a claim from its wire form. */
107
+ export function claimedFieldsFromPaths(paths) {
108
+ return { paths: new Set(paths) };
109
+ }
110
+ /**
111
+ * Classify one live value against the claim.
112
+ *
113
+ * `declaredValue` is only read when the path is claimed; pass whatever the
114
+ * declared tree holds there (including `undefined`, which is a legal declared
115
+ * value on a claimed path only in the sense that the flattener never emits it).
116
+ */
117
+ export function classifyLiveField(input) {
118
+ if (!isClaimed(input.claimed, input.path))
119
+ return "undeclared";
120
+ return deepValueEqual(input.declaredValue, input.liveValue) ? "declared-equal" : "declared-changed";
121
+ }
122
+ /**
123
+ * Who holds an undeclared live field, and which source said so.
124
+ *
125
+ * The manager wins where the substrate records one: "owned by `hpa-controller`"
126
+ * and "chant never set it" are the same verdict with very different amounts of
127
+ * information in them, and an operator can act on the first. The claim is the
128
+ * fallback, and it answers on every substrate.
129
+ */
130
+ export function heldBy(fieldOwners, path) {
131
+ const manager = fieldOwners?.[path];
132
+ if (manager)
133
+ return { holder: manager, source: "field-manager" };
134
+ return { source: "claimed-fields" };
135
+ }
@@ -0,0 +1,70 @@
1
+ /**
2
+ * The one place chant assembles `build()`'s options for a project directory.
3
+ *
4
+ * chant #2002 — `chant build` (./commands/build.ts) and the `policyGate` Op
5
+ * step (../lint/policy.ts's `evaluateProjectPolicies`) both build the same
6
+ * directory, and each used to assemble that option object itself. The two lists
7
+ * drifted to nine options against two: the gate built with fold off (the path
8
+ * `chant build` retired as its default in #1134), without the project's config
9
+ * (so serializers lost their lexicon-scoped dialect settings and a policy
10
+ * reading `ctx.docs` inspected different documents), and without `buildRoots`
11
+ * (so config-declared roots contributed no entities at all). A gate can only
12
+ * decide on a build `chant build` would produce if the two are assembled from
13
+ * one place, so they are.
14
+ *
15
+ * Two functions rather than one because the *modes* are needed earlier than the
16
+ * rest: `chant build` arms sandboxed policy execution from the resolved
17
+ * `sandbox` before it loads any policy module, which happens before build-time
18
+ * parameters and the ownership marker exist. {@link resolveBuildModes} is that
19
+ * early half; {@link resolveProjectBuildOptions} takes its result and assembles
20
+ * everything `build()` is given.
21
+ */
22
+ import { resolveFoldEnabled, resolveSandboxEnabled } from "../config.js";
23
+ import { collectBuildRootContributors, resolveLexiconVersions } from "./plugins.js";
24
+ /**
25
+ * Resolve this build's execution modes: an explicit CLI flag wins over
26
+ * `chant.config.ts`'s `build.fold`/`build.sandbox`, which wins over the default
27
+ * (fold on, sandbox off). Callers with no flags to offer (the `policyGate` step)
28
+ * pass no overrides and get the project's own answer.
29
+ */
30
+ export function resolveBuildModes(config, overrides) {
31
+ return {
32
+ fold: resolveFoldEnabled(config, overrides?.fold),
33
+ sandbox: resolveSandboxEnabled(config, overrides?.sandbox),
34
+ };
35
+ }
36
+ /**
37
+ * Assemble the option object `build()` takes for a project directory.
38
+ *
39
+ * Every option here is derived from the project (its config, its plugins, its
40
+ * resolved parameters) rather than from the command that asked, so two callers
41
+ * handing in the same project get byte-identical builds. A new option belongs
42
+ * in this function, never at a call site.
43
+ */
44
+ export function resolveProjectBuildOptions(input) {
45
+ const { config, configDir, plugins, modes, ownership, buildParams, telemetry } = input;
46
+ // #1039 — each loaded plugin's registered intrinsics (e.g. AWS's `Sub`), so
47
+ // a file using a registered intrinsic tagged template folds instead of
48
+ // unconditionally falling back to run. `intrinsics` is an optional plugin
49
+ // extension, hence the guard.
50
+ const intrinsics = plugins?.flatMap((plugin) => plugin.intrinsics?.() ?? []) ?? [];
51
+ // #1063 — the same loaded plugins, by NAME, are this build's allowlist for
52
+ // following a bare import specifier into a lexicon package (so `Azure`,
53
+ // `GCP`, `S3Actions`, `CI` fold as values).
54
+ const lexicons = plugins?.map((plugin) => plugin.name) ?? [];
55
+ return {
56
+ ownership,
57
+ ...(telemetry ? { telemetry } : {}),
58
+ config: config,
59
+ fold: modes.fold,
60
+ sandbox: modes.sandbox,
61
+ intrinsics,
62
+ lexicons,
63
+ // chant #1442 — which lexicon VERSION interpreted each declaration.
64
+ lexiconVersions: resolveLexiconVersions(lexicons),
65
+ buildParams,
66
+ // #1548 piece 3 — config-declared build roots (kustomize dirs, committed
67
+ // ciphertext), rendered into entities by the owning lexicon's hook.
68
+ buildRoots: collectBuildRootContributors(plugins, config, configDir),
69
+ };
70
+ }