@intentius/chant 0.57.0 → 0.59.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (558) hide show
  1. package/dist/audit/catalog.d.ts +51 -1
  2. package/dist/audit/catalog.d.ts.map +1 -1
  3. package/dist/audit/core.d.ts +36 -1
  4. package/dist/audit/core.d.ts.map +1 -1
  5. package/dist/audit/discover.d.ts +26 -9
  6. package/dist/audit/discover.d.ts.map +1 -1
  7. package/dist/audit/lineage.d.ts +10 -0
  8. package/dist/audit/lineage.d.ts.map +1 -0
  9. package/dist/audit/prior-art.d.ts +385 -0
  10. package/dist/audit/prior-art.d.ts.map +1 -0
  11. package/dist/audit/proof.d.ts +16 -0
  12. package/dist/audit/proof.d.ts.map +1 -1
  13. package/dist/audit/report-html.d.ts.map +1 -1
  14. package/dist/audit/report-model.d.ts +8 -1
  15. package/dist/audit/report-model.d.ts.map +1 -1
  16. package/dist/audit/report.d.ts.map +1 -1
  17. package/dist/audit/rules-doc.d.ts +3 -0
  18. package/dist/audit/rules-doc.d.ts.map +1 -1
  19. package/dist/audit/secrets.d.ts +15 -0
  20. package/dist/audit/secrets.d.ts.map +1 -1
  21. package/dist/audit/terraform-state.d.ts +46 -0
  22. package/dist/audit/terraform-state.d.ts.map +1 -0
  23. package/dist/build.d.ts +17 -1
  24. package/dist/build.d.ts.map +1 -1
  25. package/dist/claimed-fields.d.ts +161 -0
  26. package/dist/claimed-fields.d.ts.map +1 -0
  27. package/dist/cli/build-params-cli.d.ts +2 -2
  28. package/dist/cli/command-group.d.ts +14 -0
  29. package/dist/cli/command-group.d.ts.map +1 -1
  30. package/dist/cli/commands/audit.d.ts +17 -1
  31. package/dist/cli/commands/audit.d.ts.map +1 -1
  32. package/dist/cli/commands/build.d.ts.map +1 -1
  33. package/dist/cli/commands/carve-bridge.d.ts.map +1 -1
  34. package/dist/cli/commands/check-lexicon-docs.d.ts +1 -1
  35. package/dist/cli/commands/check-lexicon-examples.d.ts +16 -6
  36. package/dist/cli/commands/check-lexicon-examples.d.ts.map +1 -1
  37. package/dist/cli/commands/init-lexicon/templates/codegen.d.ts +1 -0
  38. package/dist/cli/commands/init-lexicon/templates/codegen.d.ts.map +1 -1
  39. package/dist/cli/commands/init-lexicon/templates/project.d.ts +7 -0
  40. package/dist/cli/commands/init-lexicon/templates/project.d.ts.map +1 -1
  41. package/dist/cli/commands/init-lexicon.d.ts.map +1 -1
  42. package/dist/cli/commands/init.d.ts.map +1 -1
  43. package/dist/cli/commands/lint.d.ts +13 -0
  44. package/dist/cli/commands/lint.d.ts.map +1 -1
  45. package/dist/cli/commands/onboard.d.ts +2 -0
  46. package/dist/cli/commands/onboard.d.ts.map +1 -1
  47. package/dist/cli/handlers/build.d.ts.map +1 -1
  48. package/dist/cli/handlers/lifecycle.d.ts.map +1 -1
  49. package/dist/cli/handlers/operator.d.ts +82 -16
  50. package/dist/cli/handlers/operator.d.ts.map +1 -1
  51. package/dist/cli/handlers/run.d.ts +49 -42
  52. package/dist/cli/handlers/run.d.ts.map +1 -1
  53. package/dist/cli/main.d.ts +12 -1
  54. package/dist/cli/main.d.ts.map +1 -1
  55. package/dist/cli/mcp/op-tools.d.ts +16 -1
  56. package/dist/cli/mcp/op-tools.d.ts.map +1 -1
  57. package/dist/cli/mcp/resource-handlers.d.ts.map +1 -1
  58. package/dist/cli/mcp/resources/context.d.ts.map +1 -1
  59. package/dist/cli/plugins.d.ts +22 -0
  60. package/dist/cli/plugins.d.ts.map +1 -1
  61. package/dist/cli/registry.d.ts +40 -9
  62. package/dist/cli/registry.d.ts.map +1 -1
  63. package/dist/codegen/generate-post-synth-barrel.d.ts +1 -1
  64. package/dist/components/auto-release.d.ts +10 -20
  65. package/dist/components/auto-release.d.ts.map +1 -1
  66. package/dist/components/capability.d.ts +4 -4
  67. package/dist/components/cli-support.d.ts +24 -22
  68. package/dist/components/cli-support.d.ts.map +1 -1
  69. package/dist/components/component.d.ts +21 -6
  70. package/dist/components/component.d.ts.map +1 -1
  71. package/dist/components/driver-output.d.ts.map +1 -1
  72. package/dist/components/driver.d.ts +73 -37
  73. package/dist/components/driver.d.ts.map +1 -1
  74. package/dist/components/index.d.ts +1 -2
  75. package/dist/components/index.d.ts.map +1 -1
  76. package/dist/components/manifest-persistence.d.ts +1 -9
  77. package/dist/components/manifest-persistence.d.ts.map +1 -1
  78. package/dist/components/run-progress.d.ts +6 -6
  79. package/dist/components/run-progress.d.ts.map +1 -1
  80. package/dist/components/verbs/run-agent.d.ts +10 -22
  81. package/dist/components/verbs/run-agent.d.ts.map +1 -1
  82. package/dist/components/verbs/verify.d.ts +2 -2
  83. package/dist/deep-observation.d.ts +17 -0
  84. package/dist/deep-observation.d.ts.map +1 -1
  85. package/dist/detectLexicon.d.ts +13 -0
  86. package/dist/detectLexicon.d.ts.map +1 -1
  87. package/dist/discovery/files.d.ts +4 -4
  88. package/dist/discovery/fold-import.d.ts.map +1 -1
  89. package/dist/discovery/param-deps.d.ts +33 -0
  90. package/dist/discovery/param-deps.d.ts.map +1 -1
  91. package/dist/discovery/sandbox/bundle.d.ts.map +1 -1
  92. package/dist/discovery/sandbox/config-wire.d.ts +2 -2
  93. package/dist/fold/foldable-helpers.d.ts +5 -1
  94. package/dist/fold/foldable-helpers.d.ts.map +1 -1
  95. package/dist/fold-provenance.d.ts +236 -0
  96. package/dist/fold-provenance.d.ts.map +1 -0
  97. package/dist/graph-ops.d.ts +1 -1
  98. package/dist/held-elsewhere.d.ts +85 -0
  99. package/dist/held-elsewhere.d.ts.map +1 -0
  100. package/dist/index.d.ts +3 -0
  101. package/dist/index.d.ts.map +1 -1
  102. package/dist/kubectl-context.d.ts +3 -3
  103. package/dist/lexicon-config.d.ts +4 -4
  104. package/dist/lexicon-plugin-helpers.d.ts +1 -1
  105. package/dist/lexicon.d.ts +273 -16
  106. package/dist/lexicon.d.ts.map +1 -1
  107. package/dist/lifecycle/change-set.d.ts +13 -0
  108. package/dist/lifecycle/change-set.d.ts.map +1 -1
  109. package/dist/lifecycle/deep-diff.d.ts +133 -6
  110. package/dist/lifecycle/deep-diff.d.ts.map +1 -1
  111. package/dist/lifecycle/deep-observe.d.ts.map +1 -1
  112. package/dist/lifecycle/gate-ledger.d.ts +79 -3
  113. package/dist/lifecycle/gate-ledger.d.ts.map +1 -1
  114. package/dist/lifecycle/index.d.ts +1 -0
  115. package/dist/lifecycle/index.d.ts.map +1 -1
  116. package/dist/lifecycle/release-ledger.d.ts +2 -2
  117. package/dist/lifecycle/run-ledger.d.ts +53 -0
  118. package/dist/lifecycle/run-ledger.d.ts.map +1 -0
  119. package/dist/lifecycle/symptoms.d.ts +3 -3
  120. package/dist/lifecycle/symptoms.d.ts.map +1 -1
  121. package/dist/lint/config.d.ts +81 -2
  122. package/dist/lint/config.d.ts.map +1 -1
  123. package/dist/lint/post-synth.d.ts +55 -2
  124. package/dist/lint/post-synth.d.ts.map +1 -1
  125. package/dist/lint/rules/__fixtures__/comp/comp004/pass/neo4j-cluster.component.d.ts +1 -1
  126. package/dist/lint/rules/__fixtures__/comp/comp004/pass/neo4j-cluster.component.d.ts.map +1 -1
  127. package/dist/lint/rules/__fixtures__/comp/comp004/pass/orders-table.component.d.ts +1 -1
  128. package/dist/lint/rules/__fixtures__/comp/comp004/pass/orders-table.component.d.ts.map +1 -1
  129. package/dist/lint/rules/comp/comp004-gate-needs-durable-runtime.d.ts +44 -0
  130. package/dist/lint/rules/comp/comp004-gate-needs-durable-runtime.d.ts.map +1 -0
  131. package/dist/lint/rules/comp/index.d.ts +1 -1
  132. package/dist/lint/rules/comp/index.d.ts.map +1 -1
  133. package/dist/lint/rules/op/index.d.ts +16 -0
  134. package/dist/lint/rules/op/index.d.ts.map +1 -0
  135. package/dist/lint/rules/op/ops012-activity-contract.d.ts +27 -0
  136. package/dist/lint/rules/op/ops012-activity-contract.d.ts.map +1 -0
  137. package/dist/lint/rules/op/ops013-step-output-ref.d.ts +61 -0
  138. package/dist/lint/rules/op/ops013-step-output-ref.d.ts.map +1 -0
  139. package/dist/lint/rules/op/ops014-converge-rule-refusals.d.ts +55 -0
  140. package/dist/lint/rules/op/ops014-converge-rule-refusals.d.ts.map +1 -0
  141. package/dist/lint/rules/op/support.d.ts +12 -0
  142. package/dist/lint/rules/op/support.d.ts.map +1 -0
  143. package/dist/lint/suppressions.d.ts +108 -0
  144. package/dist/lint/suppressions.d.ts.map +1 -0
  145. package/dist/live-endpoint.d.ts +1 -1
  146. package/dist/op/activities/activity-contracts.d.ts +54 -0
  147. package/dist/op/activities/activity-contracts.d.ts.map +1 -0
  148. package/dist/op/activities/apply.d.ts +262 -0
  149. package/dist/op/activities/apply.d.ts.map +1 -0
  150. package/dist/op/activities/build.d.ts +13 -0
  151. package/dist/op/activities/build.d.ts.map +1 -0
  152. package/dist/op/activities/converge.d.ts +110 -0
  153. package/dist/op/activities/converge.d.ts.map +1 -0
  154. package/dist/op/activities/env-teardown.d.ts +76 -0
  155. package/dist/op/activities/env-teardown.d.ts.map +1 -0
  156. package/dist/op/activities/guard-validate.d.ts +64 -0
  157. package/dist/op/activities/guard-validate.d.ts.map +1 -0
  158. package/dist/op/activities/http-check.d.ts +34 -0
  159. package/dist/op/activities/http-check.d.ts.map +1 -0
  160. package/dist/op/activities/index.d.ts +31 -0
  161. package/dist/op/activities/index.d.ts.map +1 -0
  162. package/dist/op/activities/lexicon-upgrade.d.ts +182 -0
  163. package/dist/op/activities/lexicon-upgrade.d.ts.map +1 -0
  164. package/dist/op/activities/lifecycle.d.ts +42 -0
  165. package/dist/op/activities/lifecycle.d.ts.map +1 -0
  166. package/dist/op/activities/pipeline-audit.d.ts +84 -0
  167. package/dist/op/activities/pipeline-audit.d.ts.map +1 -0
  168. package/dist/op/activities/policy.d.ts +17 -0
  169. package/dist/op/activities/policy.d.ts.map +1 -0
  170. package/dist/op/activities/reconcile.d.ts +149 -0
  171. package/dist/op/activities/reconcile.d.ts.map +1 -0
  172. package/dist/op/activities/shell.d.ts +13 -0
  173. package/dist/op/activities/shell.d.ts.map +1 -0
  174. package/dist/op/activities/teardown.d.ts +10 -0
  175. package/dist/op/activities/teardown.d.ts.map +1 -0
  176. package/dist/op/activities/util.d.ts +7 -0
  177. package/dist/op/activities/util.d.ts.map +1 -0
  178. package/dist/op/activities/wait.d.ts +28 -0
  179. package/dist/op/activities/wait.d.ts.map +1 -0
  180. package/dist/op/activities/workflow-audit.d.ts +92 -0
  181. package/dist/op/activities/workflow-audit.d.ts.map +1 -0
  182. package/dist/op/activity-contract-registry.d.ts +76 -0
  183. package/dist/op/activity-contract-registry.d.ts.map +1 -0
  184. package/dist/op/activity-contract.d.ts +25 -18
  185. package/dist/op/activity-contract.d.ts.map +1 -1
  186. package/dist/op/activity-failure.d.ts +28 -0
  187. package/dist/op/activity-failure.d.ts.map +1 -0
  188. package/dist/op/activity-profiles.d.ts +118 -0
  189. package/dist/op/activity-profiles.d.ts.map +1 -0
  190. package/dist/op/activity-registry.d.ts +22 -38
  191. package/dist/op/activity-registry.d.ts.map +1 -1
  192. package/dist/op/activity-runtime.d.ts +3 -14
  193. package/dist/op/activity-runtime.d.ts.map +1 -1
  194. package/dist/op/builders.d.ts +85 -30
  195. package/dist/op/builders.d.ts.map +1 -1
  196. package/dist/op/change-signal.d.ts +91 -0
  197. package/dist/op/change-signal.d.ts.map +1 -0
  198. package/dist/op/composites/apply-op.d.ts +118 -0
  199. package/dist/op/composites/apply-op.d.ts.map +1 -0
  200. package/dist/op/composites/converge-op.d.ts +120 -0
  201. package/dist/op/composites/converge-op.d.ts.map +1 -0
  202. package/dist/op/composites/index.d.ts +26 -0
  203. package/dist/op/composites/index.d.ts.map +1 -0
  204. package/dist/op/composites/lexicon-upgrade-op.d.ts +78 -0
  205. package/dist/op/composites/lexicon-upgrade-op.d.ts.map +1 -0
  206. package/dist/op/composites/pipeline-audit-op.d.ts +50 -0
  207. package/dist/op/composites/pipeline-audit-op.d.ts.map +1 -0
  208. package/dist/op/composites/reconcile-op.d.ts +57 -0
  209. package/dist/op/composites/reconcile-op.d.ts.map +1 -0
  210. package/dist/op/composites/watch-op.d.ts +60 -0
  211. package/dist/op/composites/watch-op.d.ts.map +1 -0
  212. package/dist/op/composites/workflow-audit-op.d.ts +57 -0
  213. package/dist/op/composites/workflow-audit-op.d.ts.map +1 -0
  214. package/dist/op/converge-rule.d.ts +12 -10
  215. package/dist/op/converge-rule.d.ts.map +1 -1
  216. package/dist/op/cron.d.ts +51 -0
  217. package/dist/op/cron.d.ts.map +1 -0
  218. package/dist/op/discover.d.ts +9 -0
  219. package/dist/op/discover.d.ts.map +1 -1
  220. package/dist/op/duration.d.ts +11 -0
  221. package/dist/op/duration.d.ts.map +1 -0
  222. package/dist/op/emulator-lifecycle.d.ts.map +1 -1
  223. package/dist/op/gate-name.d.ts +40 -0
  224. package/dist/op/gate-name.d.ts.map +1 -0
  225. package/dist/op/gate-summary.d.ts +43 -0
  226. package/dist/op/gate-summary.d.ts.map +1 -0
  227. package/dist/op/gate.d.ts +90 -0
  228. package/dist/op/gate.d.ts.map +1 -0
  229. package/dist/op/generate-pipeline.d.ts +9 -0
  230. package/dist/op/generate-pipeline.d.ts.map +1 -1
  231. package/dist/op/index.d.ts +29 -9
  232. package/dist/op/index.d.ts.map +1 -1
  233. package/dist/op/local-executor.d.ts +114 -28
  234. package/dist/op/local-executor.d.ts.map +1 -1
  235. package/dist/op/local-output.d.ts +11 -1
  236. package/dist/op/local-output.d.ts.map +1 -1
  237. package/dist/op/op-ir.d.ts +185 -0
  238. package/dist/op/op-ir.d.ts.map +1 -0
  239. package/dist/op/op-verb-class.d.ts +10 -2
  240. package/dist/op/op-verb-class.d.ts.map +1 -1
  241. package/dist/op/operator.d.ts +93 -5
  242. package/dist/op/operator.d.ts.map +1 -1
  243. package/dist/op/receipt-store.d.ts +1 -1
  244. package/dist/op/receipt-store.d.ts.map +1 -1
  245. package/dist/op/resource.d.ts +15 -1
  246. package/dist/op/resource.d.ts.map +1 -1
  247. package/dist/op/runtime.d.ts +200 -0
  248. package/dist/op/runtime.d.ts.map +1 -0
  249. package/dist/op/runtimes/local.d.ts +29 -0
  250. package/dist/op/runtimes/local.d.ts.map +1 -0
  251. package/dist/op/step-output-ref.d.ts +15 -13
  252. package/dist/op/step-output-ref.d.ts.map +1 -1
  253. package/dist/op/types.d.ts +96 -29
  254. package/dist/op/types.d.ts.map +1 -1
  255. package/dist/ownership.d.ts +1 -1
  256. package/dist/provenance.d.ts +21 -0
  257. package/dist/provenance.d.ts.map +1 -1
  258. package/dist/serializer-walker.d.ts.map +1 -1
  259. package/dist/terraform/bridge.d.ts +26 -7
  260. package/dist/terraform/bridge.d.ts.map +1 -1
  261. package/dist/terraform/carve-provider.d.ts +28 -2
  262. package/dist/terraform/carve-provider.d.ts.map +1 -1
  263. package/dist/terraform/data-source-shape.d.ts +77 -0
  264. package/dist/terraform/data-source-shape.d.ts.map +1 -0
  265. package/dist/terraform/graph.d.ts.map +1 -1
  266. package/dist/terraform/providers/kubernetes.d.ts +5 -0
  267. package/dist/terraform/providers/kubernetes.d.ts.map +1 -1
  268. package/dist/terraform/tier-map.d.ts +16 -4
  269. package/dist/terraform/tier-map.d.ts.map +1 -1
  270. package/dist/terraform/types.d.ts +8 -0
  271. package/dist/terraform/types.d.ts.map +1 -1
  272. package/package.json +6 -1
  273. package/src/audit/catalog.test.ts +79 -3
  274. package/src/audit/catalog.ts +111 -13
  275. package/src/audit/core.test.ts +26 -0
  276. package/src/audit/core.ts +84 -18
  277. package/src/audit/discover.test.ts +39 -0
  278. package/src/audit/discover.ts +202 -18
  279. package/src/audit/lineage.ts +100 -0
  280. package/src/audit/prior-art.ts +153 -0
  281. package/src/audit/proof.test.ts +67 -0
  282. package/src/audit/proof.ts +70 -0
  283. package/src/audit/report-html.ts +9 -4
  284. package/src/audit/report-model.ts +16 -2
  285. package/src/audit/report.test.ts +33 -0
  286. package/src/audit/report.ts +5 -3
  287. package/src/audit/rules-doc.test.ts +34 -2
  288. package/src/audit/rules-doc.ts +82 -9
  289. package/src/audit/secrets.ts +15 -3
  290. package/src/audit/terraform-state.test.ts +144 -0
  291. package/src/audit/terraform-state.ts +131 -0
  292. package/src/build.ts +31 -1
  293. package/src/claimed-fields.test.ts +145 -0
  294. package/src/claimed-fields.ts +208 -0
  295. package/src/cli/build-params-cli.ts +2 -2
  296. package/src/cli/command-group.ts +14 -0
  297. package/src/cli/commands/__fixtures__/audit-terraform/infra/.terraform/providers/lock.txt +1 -0
  298. package/src/cli/commands/__fixtures__/audit-terraform/infra/main.tf +1 -0
  299. package/src/cli/commands/__fixtures__/audit-terraform/infra/modules/foo/main.tf +1 -0
  300. package/src/cli/commands/__fixtures__/audit-terraform/infra/variables.tf +3 -0
  301. package/src/cli/commands/__fixtures__/init-lexicon-output/package.json +13 -4
  302. package/src/cli/commands/__fixtures__/init-lexicon-output/src/codegen/docs-cli.ts +4 -0
  303. package/src/cli/commands/__fixtures__/init-lexicon-output/src/codegen/package.ts +1 -0
  304. package/src/cli/commands/__fixtures__/init-lexicon-output/src/package-cli.ts +21 -0
  305. package/src/cli/commands/__snapshots__/init-lexicon.test.ts.snap +1 -0
  306. package/src/cli/commands/audit.test.ts +191 -11
  307. package/src/cli/commands/audit.ts +78 -28
  308. package/src/cli/commands/build.test.ts +330 -9
  309. package/src/cli/commands/build.ts +170 -24
  310. package/src/cli/commands/carve-bridge.test.ts +237 -14
  311. package/src/cli/commands/carve-bridge.ts +21 -17
  312. package/src/cli/commands/carve-emit-k8s.test.ts +17 -10
  313. package/src/cli/commands/check-lexicon-docs.ts +1 -1
  314. package/src/cli/commands/check-lexicon-examples.test.ts +29 -1
  315. package/src/cli/commands/check-lexicon-examples.ts +42 -10
  316. package/src/cli/commands/init-lexicon/templates/codegen.ts +9 -0
  317. package/src/cli/commands/init-lexicon/templates/project.ts +44 -4
  318. package/src/cli/commands/init-lexicon.test.ts +97 -2
  319. package/src/cli/commands/init-lexicon.ts +4 -2
  320. package/src/cli/commands/init.test.ts +35 -1
  321. package/src/cli/commands/init.ts +14 -3
  322. package/src/cli/commands/lint.test.ts +194 -1
  323. package/src/cli/commands/lint.ts +205 -7
  324. package/src/cli/commands/onboard.test.ts +75 -0
  325. package/src/cli/commands/onboard.ts +54 -23
  326. package/src/cli/handlers/build.test.ts +81 -1
  327. package/src/cli/handlers/build.ts +15 -1
  328. package/src/cli/handlers/graph.test.ts +3 -3
  329. package/src/cli/handlers/lifecycle.test.ts +195 -12
  330. package/src/cli/handlers/lifecycle.ts +123 -6
  331. package/src/cli/handlers/misc.ts +1 -1
  332. package/src/cli/handlers/operator.test.ts +183 -11
  333. package/src/cli/handlers/operator.ts +341 -55
  334. package/src/cli/handlers/run.test.ts +568 -1295
  335. package/src/cli/handlers/run.ts +446 -912
  336. package/src/cli/main.test.ts +22 -16
  337. package/src/cli/main.ts +66 -33
  338. package/src/cli/mcp/op-tools.ts +147 -88
  339. package/src/cli/mcp/resource-handlers.ts +10 -37
  340. package/src/cli/mcp/resources/context.ts +11 -12
  341. package/src/cli/mcp/server.test.ts +25 -27
  342. package/src/cli/mcp/server.ts +2 -2
  343. package/src/cli/plugins.test.ts +68 -2
  344. package/src/cli/plugins.ts +39 -0
  345. package/src/cli/registry.ts +40 -9
  346. package/src/codegen/docs.ts +1 -1
  347. package/src/codegen/generate-post-synth-barrel.test.ts +1 -1
  348. package/src/codegen/generate-post-synth-barrel.ts +1 -1
  349. package/src/components/README.md +4 -3
  350. package/src/components/__fixtures__/neo4j-fanout.json +1 -1
  351. package/src/components/auto-release.test.ts +4 -20
  352. package/src/components/auto-release.ts +17 -42
  353. package/src/components/capability.ts +4 -4
  354. package/src/components/cli-support.test.ts +28 -12
  355. package/src/components/cli-support.ts +60 -47
  356. package/src/components/component-schema.test.ts +18 -2
  357. package/src/components/component.schema.json +18 -5
  358. package/src/components/component.test.ts +2 -2
  359. package/src/components/component.ts +27 -7
  360. package/src/components/config-defaults.test.ts +2 -2
  361. package/src/components/driver-output.ts +14 -2
  362. package/src/components/driver.test.ts +109 -20
  363. package/src/components/driver.ts +201 -84
  364. package/src/components/index.ts +1 -6
  365. package/src/components/manifest-persistence.test.ts +2 -20
  366. package/src/components/manifest-persistence.ts +4 -24
  367. package/src/components/pilots/neo4j-fanout.pilot.ts +3 -3
  368. package/src/components/pilots/pilots-lint-clean.test.ts +11 -10
  369. package/src/components/run-progress.ts +6 -6
  370. package/src/components/verbs/run-agent.test.ts +19 -0
  371. package/src/components/verbs/run-agent.ts +12 -24
  372. package/src/components/verbs/verify.ts +2 -2
  373. package/src/deep-observation.test.ts +75 -0
  374. package/src/deep-observation.ts +48 -0
  375. package/src/detectLexicon.ts +18 -1
  376. package/src/discovery/collect.test.ts +3 -3
  377. package/src/discovery/files.ts +4 -4
  378. package/src/discovery/fold-import.test.ts +1 -1
  379. package/src/discovery/fold-import.ts +105 -2
  380. package/src/discovery/param-deps.test.ts +112 -1
  381. package/src/discovery/param-deps.ts +193 -0
  382. package/src/discovery/sandbox/bundle.ts +15 -1
  383. package/src/discovery/sandbox/config-wire.test.ts +2 -2
  384. package/src/discovery/sandbox/config-wire.ts +2 -2
  385. package/src/fold/fold.test.ts +56 -0
  386. package/src/fold/foldable-helpers.ts +82 -2
  387. package/src/fold-provenance-exclusion.test.ts +186 -0
  388. package/src/fold-provenance.test.ts +495 -0
  389. package/src/fold-provenance.ts +441 -0
  390. package/src/graph-ops.test.ts +3 -3
  391. package/src/graph-ops.ts +1 -1
  392. package/src/held-elsewhere.test.ts +102 -0
  393. package/src/held-elsewhere.ts +114 -0
  394. package/src/index.ts +3 -0
  395. package/src/kubectl-context.ts +3 -3
  396. package/src/lexicon-config.test.ts +5 -5
  397. package/src/lexicon-config.ts +4 -4
  398. package/src/lexicon-plugin-helpers.ts +1 -1
  399. package/src/lexicon.ts +296 -16
  400. package/src/lifecycle/change-set.test.ts +49 -0
  401. package/src/lifecycle/change-set.ts +67 -0
  402. package/src/lifecycle/converge-ledger.ts +1 -1
  403. package/src/lifecycle/deep-diff.test.ts +267 -14
  404. package/src/lifecycle/deep-diff.ts +217 -14
  405. package/src/lifecycle/deep-observe.test.ts +3 -1
  406. package/src/lifecycle/deep-observe.ts +16 -6
  407. package/src/lifecycle/gate-ledger.test.ts +74 -2
  408. package/src/lifecycle/gate-ledger.ts +154 -36
  409. package/src/lifecycle/index.ts +1 -0
  410. package/src/lifecycle/release-ledger.ts +2 -2
  411. package/src/lifecycle/run-ledger.test.ts +268 -0
  412. package/src/lifecycle/run-ledger.ts +201 -0
  413. package/src/lifecycle/symptoms.ts +3 -3
  414. package/src/lint/config.test.ts +82 -1
  415. package/src/lint/config.ts +112 -3
  416. package/src/lint/pipeline-change-gate.test.ts +2 -2
  417. package/src/lint/policy.test.ts +1 -1
  418. package/src/lint/post-synth.test.ts +31 -0
  419. package/src/lint/post-synth.ts +54 -1
  420. package/src/lint/rules/__fixtures__/comp/comp004/pass/neo4j-cluster.component.ts +2 -2
  421. package/src/lint/rules/__fixtures__/comp/comp004/pass/orders-table.component.ts +1 -1
  422. package/src/lint/rules/comp/comp.test.ts +27 -1
  423. package/src/lint/rules/comp/comp004-gate-needs-durable-runtime.ts +76 -0
  424. package/src/lint/rules/comp/index.ts +3 -3
  425. package/src/lint/rules/op/index.ts +23 -0
  426. package/src/lint/rules/op/ops012-activity-contract.test.ts +161 -0
  427. package/src/lint/rules/op/ops012-activity-contract.ts +64 -0
  428. package/src/lint/rules/op/ops013-step-output-ref.test.ts +237 -0
  429. package/src/lint/rules/op/ops013-step-output-ref.ts +98 -0
  430. package/src/lint/rules/op/ops014-converge-rule-refusals.test.ts +263 -0
  431. package/src/lint/rules/op/ops014-converge-rule-refusals.ts +179 -0
  432. package/src/lint/rules/op/support.ts +11 -0
  433. package/src/lint/suppressions.test.ts +163 -0
  434. package/src/lint/suppressions.ts +204 -0
  435. package/src/live-endpoint.ts +1 -1
  436. package/src/op/activities/activity-contracts.ts +66 -0
  437. package/src/op/activities/apply.test.ts +567 -0
  438. package/src/op/activities/apply.ts +662 -0
  439. package/src/op/activities/build.ts +26 -0
  440. package/src/op/activities/converge.test.ts +330 -0
  441. package/src/op/activities/converge.ts +449 -0
  442. package/src/op/activities/env-teardown.test.ts +187 -0
  443. package/src/op/activities/env-teardown.ts +171 -0
  444. package/src/op/activities/guard-validate.test.ts +139 -0
  445. package/src/op/activities/guard-validate.ts +223 -0
  446. package/src/op/activities/http-check.test.ts +48 -0
  447. package/src/op/activities/http-check.ts +55 -0
  448. package/src/op/activities/index.ts +119 -0
  449. package/src/op/activities/lexicon-upgrade.test.ts +492 -0
  450. package/src/op/activities/lexicon-upgrade.ts +673 -0
  451. package/src/op/activities/lifecycle.ts +85 -0
  452. package/src/op/activities/pipeline-audit.test.ts +67 -0
  453. package/src/op/activities/pipeline-audit.ts +201 -0
  454. package/src/op/activities/policy.test.ts +19 -0
  455. package/src/op/activities/policy.ts +37 -0
  456. package/src/op/activities/reconcile.test.ts +161 -0
  457. package/src/op/activities/reconcile.ts +354 -0
  458. package/src/op/activities/shell.ts +26 -0
  459. package/src/op/activities/teardown.ts +22 -0
  460. package/src/op/activities/util.ts +6 -0
  461. package/src/op/activities/wait.ts +69 -0
  462. package/src/op/activities/workflow-audit.test.ts +90 -0
  463. package/src/op/activities/workflow-audit.ts +203 -0
  464. package/src/op/activity-contract-registry.test.ts +98 -0
  465. package/src/op/activity-contract-registry.ts +114 -0
  466. package/src/op/activity-contract.test.ts +1 -1
  467. package/src/op/activity-contract.ts +37 -33
  468. package/src/op/activity-failure.ts +34 -0
  469. package/src/op/activity-profiles.test.ts +56 -0
  470. package/src/op/activity-profiles.ts +116 -0
  471. package/src/op/activity-registry.test.ts +37 -28
  472. package/src/op/activity-registry.ts +27 -56
  473. package/src/op/activity-runtime.ts +3 -47
  474. package/src/op/builders-exports.test.ts +0 -49
  475. package/src/op/builders-typed.test.ts +164 -0
  476. package/src/op/builders.ts +125 -41
  477. package/src/op/change-signal.test.ts +117 -0
  478. package/src/op/change-signal.ts +169 -0
  479. package/src/op/composites/apply-op.ts +218 -0
  480. package/src/op/composites/composites.test.ts +379 -0
  481. package/src/op/composites/converge-op.test.ts +168 -0
  482. package/src/op/composites/converge-op.ts +214 -0
  483. package/src/op/composites/index.ts +26 -0
  484. package/src/op/composites/lexicon-upgrade-op.test.ts +68 -0
  485. package/src/op/composites/lexicon-upgrade-op.ts +134 -0
  486. package/src/op/composites/pipeline-audit-op.test.ts +25 -0
  487. package/src/op/composites/pipeline-audit-op.ts +78 -0
  488. package/src/op/composites/reconcile-op.test.ts +51 -0
  489. package/src/op/composites/reconcile-op.ts +110 -0
  490. package/src/op/composites/watch-op.ts +108 -0
  491. package/src/op/composites/workflow-audit-op.test.ts +25 -0
  492. package/src/op/composites/workflow-audit-op.ts +88 -0
  493. package/src/op/converge-rule.ts +12 -10
  494. package/src/op/cron.test.ts +128 -0
  495. package/src/op/cron.ts +149 -0
  496. package/src/op/discover-root.test.ts +105 -1
  497. package/src/op/discover.test.ts +6 -2
  498. package/src/op/discover.ts +84 -16
  499. package/src/op/duration.ts +21 -0
  500. package/src/op/effect-step.test.ts +29 -14
  501. package/src/op/emulator-lifecycle.ts +1 -2
  502. package/src/op/gate-name.test.ts +65 -0
  503. package/src/op/gate-name.ts +60 -0
  504. package/src/op/gate-summary.ts +84 -0
  505. package/src/op/gate.ts +155 -0
  506. package/src/op/generate-pipeline.test.ts +65 -3
  507. package/src/op/generate-pipeline.ts +19 -2
  508. package/src/op/index.ts +48 -8
  509. package/src/op/local-executor.test.ts +178 -34
  510. package/src/op/local-executor.ts +371 -102
  511. package/src/op/local-output.test.ts +95 -11
  512. package/src/op/local-output.ts +33 -4
  513. package/src/op/op-ir.test.ts +292 -0
  514. package/src/op/op-ir.ts +419 -0
  515. package/src/op/op-verb-class.test.ts +2 -2
  516. package/src/op/op-verb-class.ts +19 -5
  517. package/src/op/op.test.ts +28 -7
  518. package/src/op/operator.test.ts +543 -6
  519. package/src/op/operator.ts +203 -20
  520. package/src/op/receipt-store.ts +1 -1
  521. package/src/op/resource.ts +20 -2
  522. package/src/op/runtime.ts +203 -0
  523. package/src/op/runtimes/local.test.ts +181 -0
  524. package/src/op/runtimes/local.ts +212 -0
  525. package/src/op/step-output-ref.ts +15 -13
  526. package/src/op/types.ts +106 -26
  527. package/src/ownership.ts +1 -1
  528. package/src/provenance.test.ts +6 -0
  529. package/src/provenance.ts +21 -1
  530. package/src/serializer-walker.test.ts +42 -0
  531. package/src/serializer-walker.ts +21 -2
  532. package/src/terraform/aws-resources.test.ts +13 -4
  533. package/src/terraform/bridge.test.ts +22 -9
  534. package/src/terraform/bridge.ts +89 -28
  535. package/src/terraform/carve-provider.ts +38 -2
  536. package/src/terraform/data-source-shape.ts +95 -0
  537. package/src/terraform/graph.ts +35 -7
  538. package/src/terraform/providers/kubernetes.ts +48 -2
  539. package/src/terraform/tier-map.ts +21 -6
  540. package/src/terraform/types.ts +8 -0
  541. package/dist/cli/handlers/op-progress.d.ts +0 -90
  542. package/dist/cli/handlers/op-progress.d.ts.map +0 -1
  543. package/dist/cli/handlers/run-client.d.ts +0 -127
  544. package/dist/cli/handlers/run-client.d.ts.map +0 -1
  545. package/dist/cli/handlers/run-report.d.ts +0 -5
  546. package/dist/cli/handlers/run-report.d.ts.map +0 -1
  547. package/dist/components/temporal-codegen-loader.d.ts +0 -27
  548. package/dist/components/temporal-codegen-loader.d.ts.map +0 -1
  549. package/dist/lint/rules/comp/comp004-gate-needs-temporal.d.ts +0 -37
  550. package/dist/lint/rules/comp/comp004-gate-needs-temporal.d.ts.map +0 -1
  551. package/src/cli/handlers/op-progress.test.ts +0 -268
  552. package/src/cli/handlers/op-progress.ts +0 -248
  553. package/src/cli/handlers/run-client.test.ts +0 -82
  554. package/src/cli/handlers/run-client.ts +0 -219
  555. package/src/cli/handlers/run-report.test.ts +0 -62
  556. package/src/cli/handlers/run-report.ts +0 -122
  557. package/src/components/temporal-codegen-loader.ts +0 -41
  558. package/src/lint/rules/comp/comp004-gate-needs-temporal.ts +0 -66
@@ -0,0 +1,163 @@
1
+ import { describe, test, expect } from "vitest";
2
+ import {
3
+ applyInlineSuppressions,
4
+ entitySuppressions,
5
+ SUPPRESSION_EXPIRED_ID,
6
+ SUPPRESSION_MISPLACED_FILE_ID,
7
+ SUPPRESSION_UNIGNORABLE_ID,
8
+ type SuppressionDirective,
9
+ } from "./suppressions";
10
+ import { DECLARABLE_MARKER, type Declarable } from "../declarable";
11
+ import type { PostSynthDiagnostic } from "./post-synth";
12
+ import type { RuleConfig } from "./rule";
13
+
14
+ /** A minimal `Declarable` carrying the duck-typed `suppressions` field this module reads. */
15
+ function entityWith(directives?: SuppressionDirective[]): Declarable {
16
+ return {
17
+ [DECLARABLE_MARKER]: true,
18
+ lexicon: "fake",
19
+ entityType: "Fake::Thing",
20
+ suppressions: directives,
21
+ } as unknown as Declarable;
22
+ }
23
+
24
+ let seq = 0;
25
+ function directive(partial: Partial<SuppressionDirective> & Pick<SuppressionDirective, "form">): SuppressionDirective {
26
+ seq += 1;
27
+ return { ids: "all", file: "main.tf", line: 1, key: `key-${seq}`, ...partial };
28
+ }
29
+
30
+ function diag(checkId: string, entityKey?: string): PostSynthDiagnostic {
31
+ return { checkId, severity: "warning", message: `${checkId} fired`, entity: entityKey, lexicon: "fake" };
32
+ }
33
+
34
+ describe("entitySuppressions", () => {
35
+ test("returns [] for an entity with no suppressions field", () => {
36
+ expect(entitySuppressions(entityWith(undefined))).toEqual([]);
37
+ });
38
+
39
+ test("returns [] for undefined", () => {
40
+ expect(entitySuppressions(undefined)).toEqual([]);
41
+ });
42
+
43
+ test("returns the directives array when present", () => {
44
+ const d = directive({ form: "chant-ignore" });
45
+ expect(entitySuppressions(entityWith([d]))).toEqual([d]);
46
+ });
47
+ });
48
+
49
+ describe("applyInlineSuppressions", () => {
50
+ test("a directive naming the checkId explicitly suppresses it", () => {
51
+ const d = directive({ form: "chant-ignore", ids: new Set(["TF010"]) });
52
+ const entities = new Map([["e1", entityWith([d])]]);
53
+ const { diagnostics, suppressed } = applyInlineSuppressions([diag("TF010", "e1")], entities);
54
+ expect(diagnostics).toHaveLength(0);
55
+ expect(suppressed).toHaveLength(1);
56
+ });
57
+
58
+ test("a directive naming a different id does not suppress", () => {
59
+ const d = directive({ form: "chant-ignore", ids: new Set(["TF010"]) });
60
+ const entities = new Map([["e1", entityWith([d])]]);
61
+ const { diagnostics, suppressed } = applyInlineSuppressions([diag("TF011", "e1")], entities);
62
+ expect(diagnostics).toHaveLength(1);
63
+ expect(suppressed).toHaveLength(0);
64
+ });
65
+
66
+ test('"all" suppresses every rule id on the entity it anchors to', () => {
67
+ const d = directive({ form: "chant-ignore-block", ids: "all" });
68
+ const entities = new Map([["e1", entityWith([d])]]);
69
+ const { diagnostics, suppressed } = applyInlineSuppressions([diag("TF001", "e1"), diag("TF999", "e1")], entities);
70
+ expect(diagnostics).toHaveLength(0);
71
+ expect(suppressed).toHaveLength(2);
72
+ });
73
+
74
+ test("a diagnostic with no entity is never suppressed (nothing to look up)", () => {
75
+ const d = directive({ form: "chant-ignore", ids: "all" });
76
+ const entities = new Map([["e1", entityWith([d])]]);
77
+ const { diagnostics } = applyInlineSuppressions([diag("TF001", undefined)], entities);
78
+ expect(diagnostics).toHaveLength(1);
79
+ });
80
+
81
+ test("a diagnostic whose entity carries no directives is unaffected", () => {
82
+ const entities = new Map([["e1", entityWith(undefined)]]);
83
+ const { diagnostics, suppressed } = applyInlineSuppressions([diag("TF001", "e1")], entities);
84
+ expect(diagnostics).toHaveLength(1);
85
+ expect(suppressed).toHaveLength(0);
86
+ });
87
+
88
+ describe("expiry", () => {
89
+ test("an expired directive no longer suppresses, and is reported once as its own finding", () => {
90
+ const d = directive({ form: "chant-ignore", ids: "all", expires: "2020-01-01", file: "main.tf", line: 4 });
91
+ const entities = new Map([["e1", entityWith([d])]]);
92
+ const { diagnostics, suppressed, meta } = applyInlineSuppressions([diag("TF001", "e1")], entities, undefined, new Date("2026-01-01"));
93
+ expect(diagnostics).toHaveLength(1); // not suppressed: the finding still fires
94
+ expect(suppressed).toHaveLength(0);
95
+ expect(meta).toHaveLength(1);
96
+ expect(meta[0].checkId).toBe(SUPPRESSION_EXPIRED_ID);
97
+ expect(meta[0].file).toBe("main.tf");
98
+ expect(meta[0].line).toBe(4);
99
+ });
100
+
101
+ test("a not-yet-expired directive still suppresses normally", () => {
102
+ const d = directive({ form: "chant-ignore", ids: "all", expires: "2099-01-01" });
103
+ const entities = new Map([["e1", entityWith([d])]]);
104
+ const { diagnostics, suppressed, meta } = applyInlineSuppressions([diag("TF001", "e1")], entities, undefined, new Date("2026-01-01"));
105
+ expect(diagnostics).toHaveLength(0);
106
+ expect(suppressed).toHaveLength(1);
107
+ expect(meta).toHaveLength(0);
108
+ });
109
+
110
+ test("an expired directive attached to several entities is reported once, not once per entity", () => {
111
+ const d = directive({ form: "chant-ignore-file", ids: "all", expires: "2020-01-01", file: "main.tf", line: 1 });
112
+ const entities = new Map([
113
+ ["e1", entityWith([d])],
114
+ ["e2", entityWith([d])],
115
+ ]);
116
+ const { meta } = applyInlineSuppressions([diag("TF001", "e1"), diag("TF002", "e2")], entities, undefined, new Date("2026-01-01"));
117
+ expect(meta).toHaveLength(1);
118
+ });
119
+ });
120
+
121
+ describe("a misplaced chant-ignore-file directive", () => {
122
+ test("has no suppressing effect and is reported once as its own finding", () => {
123
+ const d = directive({ form: "chant-ignore-file", ids: "all", misplaced: true, file: "main.tf", line: 3 });
124
+ const entities = new Map([["e1", entityWith([d])]]);
125
+ const { diagnostics, suppressed, meta } = applyInlineSuppressions([diag("TF001", "e1")], entities);
126
+ expect(diagnostics).toHaveLength(1);
127
+ expect(suppressed).toHaveLength(0);
128
+ expect(meta).toHaveLength(1);
129
+ expect(meta[0].checkId).toBe(SUPPRESSION_MISPLACED_FILE_ID);
130
+ expect(meta[0].line).toBe(3);
131
+ });
132
+ });
133
+
134
+ describe("ignorable: false", () => {
135
+ const rules: Record<string, RuleConfig> = { TF008: ["error", { ignorable: false }] };
136
+
137
+ test("a directive explicitly naming an unignorable id does not suppress it, and is itself reported", () => {
138
+ const d = directive({ form: "chant-ignore", ids: new Set(["TF008"]) });
139
+ const entities = new Map([["e1", entityWith([d])]]);
140
+ const { diagnostics, suppressed, meta } = applyInlineSuppressions([diag("TF008", "e1")], entities, rules);
141
+ expect(diagnostics).toHaveLength(1);
142
+ expect(suppressed).toHaveLength(0);
143
+ expect(meta.map((m) => m.checkId)).toEqual([SUPPRESSION_UNIGNORABLE_ID]);
144
+ });
145
+
146
+ test("an unconfigured id is ignorable by default", () => {
147
+ const d = directive({ form: "chant-ignore", ids: new Set(["TF001"]) });
148
+ const entities = new Map([["e1", entityWith([d])]]);
149
+ const { diagnostics, suppressed, meta } = applyInlineSuppressions([diag("TF001", "e1")], entities, rules);
150
+ expect(diagnostics).toHaveLength(0);
151
+ expect(suppressed).toHaveLength(1);
152
+ expect(meta).toHaveLength(0);
153
+ });
154
+
155
+ test("a directive covering a different, ignorable id in the same set still suppresses that one", () => {
156
+ const d = directive({ form: "chant-ignore", ids: new Set(["TF008", "TF010"]) });
157
+ const entities = new Map([["e1", entityWith([d])]]);
158
+ const { diagnostics, suppressed } = applyInlineSuppressions([diag("TF010", "e1")], entities, rules);
159
+ expect(diagnostics).toHaveLength(0);
160
+ expect(suppressed).toHaveLength(1);
161
+ });
162
+ });
163
+ });
@@ -0,0 +1,204 @@
1
+ /**
2
+ * Inline HCL-comment suppression (chant #2111). This file is core's small,
3
+ * generic half of the mechanism. It filters already-produced
4
+ * `PostSynthDiagnostic`s against suppression directives an entity carries,
5
+ * with no knowledge of which lexicon produced that entity. The other half,
6
+ * reading `# chant-ignore` / `# chant-ignore-file` / `# chant-ignore-block`
7
+ * comments out of raw `.tf` text and attaching the result to each parsed
8
+ * entity, is terraform-specific and lives in
9
+ * `lexicons/terraform/src/hcl/suppressions.ts`.
10
+ *
11
+ * Placement. The issue that asked for this weighed two options: a wrapper
12
+ * over `runPostSynthChecks` private to the terraform lexicon, or a
13
+ * `PostSynthContext` field every lexicon could share. Neither is quite what
14
+ * this file does. `ctx.entities` is already the one thing every
15
+ * `PostSynthContext` carries regardless of lexicon, and a suppression
16
+ * directive is inherently a fact ABOUT one entity, namely which block it
17
+ * anchors to, not a fact about the run as a whole. That is the same reasoning
18
+ * that already lets each lexicon's `Declarable` carry its own `props` shape
19
+ * (`TerraformEntity.props`, `K8sEntity.props`, and so on), so the hook here
20
+ * is a plain, duck-typed optional field, `suppressions`, that any entity MAY
21
+ * carry beside its `props`, read generically through `entitySuppressions()`
22
+ * below. Choosing this over a `PostSynthContext.suppressions` field needed no
23
+ * change to `PostSynthContext`, `Declarable`, or any of the places that
24
+ * construct a context (`./post-synth.ts`'s `runPostSynthChecks`, `chant
25
+ * audit`'s `../audit/core.ts`, and the two test-utils builders). Every one
26
+ * of them already hands `applyInlineSuppressions` below `ctx.entities`, so a
27
+ * lexicon that wants this (k8s manifests are the epic's other named
28
+ * candidate) adopts the convention on its own entities, with zero further
29
+ * core changes.
30
+ *
31
+ * `rules` (a project's `lint.rules`) is optional here on purpose. `chant
32
+ * build` has one to pass, so `ignorable: false` works there; `chant audit`'s
33
+ * audit-core path does not thread a project config through at all today, see
34
+ * `../audit/core.ts`, so it calls this with `rules` omitted. Every rule
35
+ * reads as ignorable in that path, the same default this module
36
+ * gives an unconfigured rule id everywhere else.
37
+ */
38
+
39
+ import type { RuleConfig } from "./rule";
40
+ import type { PostSynthDiagnostic } from "./post-synth";
41
+ import type { Declarable } from "../declarable";
42
+
43
+ /** What a directive's id list names. `"all"` is the wildcard every form accepts. */
44
+ export type SuppressionIds = "all" | ReadonlySet<string>;
45
+
46
+ /** One `# chant-ignore*` comment, already parsed from raw source text. */
47
+ export interface SuppressionDirective {
48
+ /** Which of the three comment forms produced this directive. */
49
+ form: "chant-ignore" | "chant-ignore-file" | "chant-ignore-block";
50
+ /** Rule ids this directive names, or `"all"`. */
51
+ ids: SuppressionIds;
52
+ /** The `exp:YYYY-MM-DD` term, if present. */
53
+ expires?: string;
54
+ /** Source file the comment lives in. */
55
+ file: string;
56
+ /** 1-based line the comment ITSELF sits on (not the block it anchors to). */
57
+ line: number;
58
+ /**
59
+ * `chant-ignore-file` is only valid as the file's first non-blank line
60
+ * (tflint's own constraint on `tflint-ignore-file`, kept here so the form
61
+ * stays findable). A directive found elsewhere sets this instead of being
62
+ * applied; see `SUPPRESSION_MISPLACED_FILE_ID` below.
63
+ */
64
+ misplaced?: boolean;
65
+ /**
66
+ * Stable identity, for dedup across the several entities one directive can
67
+ * attach to. A file-level directive attaches to every entity parsed from
68
+ * its file, but an expired-or-misplaced report about it should appear once.
69
+ */
70
+ key: string;
71
+ }
72
+
73
+ /** An expired suppression is reported once as its own finding, not dropped. */
74
+ export const SUPPRESSION_EXPIRED_ID = "SUPP001";
75
+ /** A `chant-ignore-file` found anywhere but the first non-blank line. */
76
+ export const SUPPRESSION_MISPLACED_FILE_ID = "SUPP002";
77
+ /** A directive explicitly names a rule id configured `ignorable: false`. */
78
+ export const SUPPRESSION_UNIGNORABLE_ID = "SUPP003";
79
+
80
+ export type SuppressionMetaCheckId =
81
+ | typeof SUPPRESSION_EXPIRED_ID
82
+ | typeof SUPPRESSION_MISPLACED_FILE_ID
83
+ | typeof SUPPRESSION_UNIGNORABLE_ID;
84
+
85
+ /**
86
+ * A finding about the suppression mechanism itself, not about a rule id a
87
+ * check would normally report, so it deliberately does not go through the
88
+ * audit catalog: nothing here is registered as a `PostSynthCheck`, so it
89
+ * never needs a `RuleMeta` entry, a lineage entry, or a full page.
90
+ */
91
+ export interface SuppressionMetaFinding {
92
+ checkId: SuppressionMetaCheckId;
93
+ severity: "warning";
94
+ message: string;
95
+ file: string;
96
+ line: number;
97
+ }
98
+
99
+ export interface InlineSuppressionResult {
100
+ /** Diagnostics after inline suppression, matched ones removed. */
101
+ diagnostics: PostSynthDiagnostic[];
102
+ /** Diagnostics an inline directive suppressed, unaltered (counted, never dropped silently). */
103
+ suppressed: PostSynthDiagnostic[];
104
+ /** Findings about the suppression mechanism itself: expired, misplaced, or denied by `ignorable: false`. */
105
+ meta: SuppressionMetaFinding[];
106
+ }
107
+
108
+ /** Read an entity's directives, if it carries any (duck-typed; see module doc). */
109
+ export function entitySuppressions(entity: Declarable | undefined): readonly SuppressionDirective[] {
110
+ if (!entity) return [];
111
+ const s = (entity as { suppressions?: unknown }).suppressions;
112
+ return Array.isArray(s) ? (s as SuppressionDirective[]) : [];
113
+ }
114
+
115
+ /** Default is ignorable (per the issue); only an explicit `{ ignorable: false }` option denies it. */
116
+ function isIgnorable(rules: Record<string, RuleConfig> | undefined, id: string): boolean {
117
+ const cfg = rules?.[id];
118
+ if (!Array.isArray(cfg)) return true;
119
+ const options = cfg[1] as { ignorable?: boolean } | undefined;
120
+ return options?.ignorable !== false;
121
+ }
122
+
123
+ function namesId(ids: SuppressionIds, checkId: string): boolean {
124
+ return ids === "all" || ids.has(checkId);
125
+ }
126
+
127
+ function isExpired(expires: string | undefined, today: Date): boolean {
128
+ if (!expires) return false;
129
+ const parsed = new Date(`${expires}T00:00:00Z`);
130
+ if (Number.isNaN(parsed.getTime())) return false;
131
+ return parsed.getTime() < today.getTime();
132
+ }
133
+
134
+ /**
135
+ * Apply inline (`# chant-ignore*`) suppression to a set of post-synth
136
+ * diagnostics. `entities` is `ctx.entities`, the same map every
137
+ * `PostSynthContext` already carries. `rules` is the project's `lint.rules`,
138
+ * for `ignorable: false`; see this module's doc comment for why it is
139
+ * optional. `today` is injectable so an expiry test doesn't depend on the
140
+ * clock.
141
+ */
142
+ export function applyInlineSuppressions(
143
+ diagnostics: readonly PostSynthDiagnostic[],
144
+ entities: Map<string, Declarable>,
145
+ rules?: Record<string, RuleConfig>,
146
+ today: Date = new Date(),
147
+ ): InlineSuppressionResult {
148
+ const kept: PostSynthDiagnostic[] = [];
149
+ const suppressed: PostSynthDiagnostic[] = [];
150
+ const meta: SuppressionMetaFinding[] = [];
151
+ const reported = new Set<string>();
152
+
153
+ const reportMeta = (d: SuppressionDirective, checkId: SuppressionMetaCheckId, message: string): void => {
154
+ const dedupeKey = `${checkId}:${d.key}`;
155
+ if (reported.has(dedupeKey)) return;
156
+ reported.add(dedupeKey);
157
+ meta.push({ checkId, severity: "warning", file: d.file, line: d.line, message });
158
+ };
159
+
160
+ // Expired and misplaced directives are findings on their own. They don't
161
+ // need a matching diagnostic to be worth reporting, so every directive
162
+ // attached to any entity is checked once here, deduplicated by its own
163
+ // identity (a directive attached to several entities, as a file-level one
164
+ // is, would otherwise be reported once per entity).
165
+ for (const entity of entities.values()) {
166
+ for (const d of entitySuppressions(entity)) {
167
+ if (d.misplaced) {
168
+ reportMeta(
169
+ d,
170
+ SUPPRESSION_MISPLACED_FILE_ID,
171
+ `chant-ignore-file at ${d.file}:${d.line} is not the first non-blank line of the file, so it has no effect. Move it to the top.`,
172
+ );
173
+ continue;
174
+ }
175
+ if (isExpired(d.expires, today)) {
176
+ reportMeta(d, SUPPRESSION_EXPIRED_ID, `Suppression at ${d.file}:${d.line} expired ${d.expires} and no longer applies.`);
177
+ }
178
+ }
179
+ }
180
+
181
+ for (const diag of diagnostics) {
182
+ const entity = diag.entity ? entities.get(diag.entity) : undefined;
183
+ let matched: SuppressionDirective | undefined;
184
+ for (const d of entitySuppressions(entity)) {
185
+ if (d.misplaced) continue;
186
+ if (isExpired(d.expires, today)) continue;
187
+ if (!namesId(d.ids, diag.checkId)) continue;
188
+ if (d.ids !== "all" && !isIgnorable(rules, diag.checkId)) {
189
+ reportMeta(
190
+ d,
191
+ SUPPRESSION_UNIGNORABLE_ID,
192
+ `${diag.checkId} is configured \`ignorable: false\`; the ${d.form} at ${d.file}:${d.line} naming it has no effect.`,
193
+ );
194
+ continue;
195
+ }
196
+ matched = d;
197
+ break;
198
+ }
199
+ if (matched) suppressed.push(diag);
200
+ else kept.push(diag);
201
+ }
202
+
203
+ return { diagnostics: kept, suppressed, meta };
204
+ }
@@ -42,7 +42,7 @@ import { emulatorsOf, endpointEnvVars, type EmulatorDeclaration } from "./op/emu
42
42
  * The ambient endpoint vars a lexicon honors, from its emulator capability.
43
43
  *
44
44
  * A lexicon with no emulator contributes nothing, which is the same answer the
45
- * hand-maintained map gave for k8s, gcp and temporal — they resolve their live
45
+ * hand-maintained map gave for k8s and gcp — they resolve their live
46
46
  * target from `chant.config` itself, so there is nothing to inject.
47
47
  */
48
48
  export function endpointEnvVarsFor(lexicon: EndpointLexicon): string[] {
@@ -0,0 +1,66 @@
1
+ /**
2
+ * Activity contracts for core's own `op/activities` (chant #1288
3
+ * Stage 1). Each contract's `args` schema mirrors the corresponding
4
+ * `*Args` interface in `./activities/*.ts` — kept alongside the
5
+ * implementation, the way the issue asked for, and validated by
6
+ * `chant build` via `tmp012` (the OPS012 activity-contract rule).
7
+ *
8
+ * Author `args` with `z.strictObject(...)`, never `z.object(...)`: the
9
+ * default form silently drops a key it doesn't recognize instead of
10
+ * rejecting it, which reproduces the exact bug this issue is about
11
+ * (`helmInstall("api", "./chart", { nameSpace: "prod" })` — the misspelled
12
+ * key vanishes rather than failing the build).
13
+ *
14
+ * Deliberately partial. Only activities with args simple enough for a zod
15
+ * mirror to earn its keep are covered here — `kubectlApply`/`helmInstall`/
16
+ * the cloud appliers carry a dozen-plus fields each with real cross-field
17
+ * logic (see `KubectlApplyArgs`, `HelmInstallArgs`), and forcing those
18
+ * through a duplicate schema is exactly the maintenance burden Stage 2
19
+ * (regenerating the step builders as fully typed wrappers) is meant to
20
+ * avoid by deriving types instead of restating them. A step calling an
21
+ * activity with no registered contract here is skipped by `tmp012`, not
22
+ * flagged — see `activityContract`'s doc in `../activity-contract` for why
23
+ * that's the intended, non-breaking default.
24
+ */
25
+
26
+ import { z } from "zod";
27
+ import { activityContract } from "../activity-contract";
28
+
29
+ export const lifecycleSnapshotContract = activityContract(
30
+ "lifecycleSnapshot",
31
+ z.strictObject({ env: z.string() }),
32
+ );
33
+
34
+ export const lifecycleDiffContract = activityContract(
35
+ "lifecycleDiff",
36
+ z.strictObject({ env: z.string(), live: z.boolean().optional() }),
37
+ z.object({ output: z.string(), exitCode: z.number(), drifted: z.boolean() }),
38
+ );
39
+
40
+ export const shellCmdContract = activityContract(
41
+ "shellCmd",
42
+ z.strictObject({ cmd: z.string(), env: z.record(z.string(), z.string()).optional(), cwd: z.string().optional() }),
43
+ );
44
+
45
+ export const httpCheckContract = activityContract(
46
+ "httpCheck",
47
+ z.strictObject({
48
+ url: z.string(),
49
+ method: z.string().optional(),
50
+ status: z.number().optional(),
51
+ contains: z.string().optional(),
52
+ retries: z.number().optional(),
53
+ intervalMs: z.number().optional(),
54
+ }),
55
+ z.object({ status: z.number() }),
56
+ // The check's effect is entity-scoped (#2022): `url` names the service the
57
+ // step probes, so op.json resolves it into the step's `entities` — the join
58
+ // a renderer draws to the estate node it targets. The scope-ish args
59
+ // (retries, interval) stay mechanics.
60
+ { entities: ["url"] },
61
+ );
62
+
63
+ export const chantTeardownContract = activityContract(
64
+ "chantTeardown",
65
+ z.strictObject({ path: z.string() }),
66
+ );