@intentius/chant 0.57.0 → 0.58.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 (504) 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 +20 -1
  4. package/dist/audit/core.d.ts.map +1 -1
  5. package/dist/audit/discover.d.ts +14 -8
  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/check-lexicon-docs.d.ts +1 -1
  34. package/dist/cli/commands/check-lexicon-examples.d.ts +16 -6
  35. package/dist/cli/commands/check-lexicon-examples.d.ts.map +1 -1
  36. package/dist/cli/commands/init-lexicon/templates/codegen.d.ts +1 -0
  37. package/dist/cli/commands/init-lexicon/templates/codegen.d.ts.map +1 -1
  38. package/dist/cli/commands/init-lexicon/templates/project.d.ts +7 -0
  39. package/dist/cli/commands/init-lexicon/templates/project.d.ts.map +1 -1
  40. package/dist/cli/commands/init-lexicon.d.ts.map +1 -1
  41. package/dist/cli/commands/init.d.ts.map +1 -1
  42. package/dist/cli/commands/lint.d.ts.map +1 -1
  43. package/dist/cli/commands/onboard.d.ts +2 -0
  44. package/dist/cli/commands/onboard.d.ts.map +1 -1
  45. package/dist/cli/handlers/build.d.ts.map +1 -1
  46. package/dist/cli/handlers/lifecycle.d.ts.map +1 -1
  47. package/dist/cli/handlers/operator.d.ts +82 -16
  48. package/dist/cli/handlers/operator.d.ts.map +1 -1
  49. package/dist/cli/handlers/run.d.ts +49 -42
  50. package/dist/cli/handlers/run.d.ts.map +1 -1
  51. package/dist/cli/main.d.ts +28 -1
  52. package/dist/cli/main.d.ts.map +1 -1
  53. package/dist/cli/mcp/op-tools.d.ts +16 -1
  54. package/dist/cli/mcp/op-tools.d.ts.map +1 -1
  55. package/dist/cli/mcp/resource-handlers.d.ts.map +1 -1
  56. package/dist/cli/mcp/resources/context.d.ts.map +1 -1
  57. package/dist/cli/registry.d.ts +26 -9
  58. package/dist/cli/registry.d.ts.map +1 -1
  59. package/dist/codegen/generate-post-synth-barrel.d.ts +1 -1
  60. package/dist/components/auto-release.d.ts +10 -20
  61. package/dist/components/auto-release.d.ts.map +1 -1
  62. package/dist/components/capability.d.ts +4 -4
  63. package/dist/components/cli-support.d.ts +20 -21
  64. package/dist/components/cli-support.d.ts.map +1 -1
  65. package/dist/components/component.d.ts +3 -3
  66. package/dist/components/component.d.ts.map +1 -1
  67. package/dist/components/driver-output.d.ts.map +1 -1
  68. package/dist/components/driver.d.ts +66 -36
  69. package/dist/components/driver.d.ts.map +1 -1
  70. package/dist/components/index.d.ts +1 -2
  71. package/dist/components/index.d.ts.map +1 -1
  72. package/dist/components/manifest-persistence.d.ts +1 -9
  73. package/dist/components/manifest-persistence.d.ts.map +1 -1
  74. package/dist/components/run-progress.d.ts +6 -6
  75. package/dist/components/run-progress.d.ts.map +1 -1
  76. package/dist/components/verbs/run-agent.d.ts +9 -15
  77. package/dist/components/verbs/run-agent.d.ts.map +1 -1
  78. package/dist/components/verbs/verify.d.ts +2 -2
  79. package/dist/deep-observation.d.ts +17 -0
  80. package/dist/deep-observation.d.ts.map +1 -1
  81. package/dist/discovery/files.d.ts +4 -4
  82. package/dist/discovery/fold-import.d.ts.map +1 -1
  83. package/dist/discovery/param-deps.d.ts +33 -0
  84. package/dist/discovery/param-deps.d.ts.map +1 -1
  85. package/dist/discovery/sandbox/bundle.d.ts.map +1 -1
  86. package/dist/discovery/sandbox/config-wire.d.ts +2 -2
  87. package/dist/fold/foldable-helpers.d.ts +5 -1
  88. package/dist/fold/foldable-helpers.d.ts.map +1 -1
  89. package/dist/fold-provenance.d.ts +236 -0
  90. package/dist/fold-provenance.d.ts.map +1 -0
  91. package/dist/graph-ops.d.ts +1 -1
  92. package/dist/held-elsewhere.d.ts +85 -0
  93. package/dist/held-elsewhere.d.ts.map +1 -0
  94. package/dist/index.d.ts +3 -0
  95. package/dist/index.d.ts.map +1 -1
  96. package/dist/kubectl-context.d.ts +3 -3
  97. package/dist/lexicon-config.d.ts +4 -4
  98. package/dist/lexicon-plugin-helpers.d.ts +1 -1
  99. package/dist/lexicon.d.ts +104 -14
  100. package/dist/lexicon.d.ts.map +1 -1
  101. package/dist/lifecycle/change-set.d.ts +13 -0
  102. package/dist/lifecycle/change-set.d.ts.map +1 -1
  103. package/dist/lifecycle/deep-diff.d.ts +133 -6
  104. package/dist/lifecycle/deep-diff.d.ts.map +1 -1
  105. package/dist/lifecycle/deep-observe.d.ts.map +1 -1
  106. package/dist/lifecycle/gate-ledger.d.ts +71 -3
  107. package/dist/lifecycle/gate-ledger.d.ts.map +1 -1
  108. package/dist/lifecycle/index.d.ts +1 -0
  109. package/dist/lifecycle/index.d.ts.map +1 -1
  110. package/dist/lifecycle/release-ledger.d.ts +2 -2
  111. package/dist/lifecycle/run-ledger.d.ts +53 -0
  112. package/dist/lifecycle/run-ledger.d.ts.map +1 -0
  113. package/dist/lifecycle/symptoms.d.ts +3 -3
  114. package/dist/lifecycle/symptoms.d.ts.map +1 -1
  115. package/dist/lint/config.d.ts +81 -2
  116. package/dist/lint/config.d.ts.map +1 -1
  117. package/dist/lint/post-synth.d.ts +55 -2
  118. package/dist/lint/post-synth.d.ts.map +1 -1
  119. package/dist/lint/rules/__fixtures__/comp/comp004/pass/neo4j-cluster.component.d.ts +1 -1
  120. package/dist/lint/rules/__fixtures__/comp/comp004/pass/neo4j-cluster.component.d.ts.map +1 -1
  121. package/dist/lint/rules/__fixtures__/comp/comp004/pass/orders-table.component.d.ts +1 -1
  122. package/dist/lint/rules/__fixtures__/comp/comp004/pass/orders-table.component.d.ts.map +1 -1
  123. package/dist/lint/rules/comp/comp004-gate-needs-durable-runtime.d.ts +44 -0
  124. package/dist/lint/rules/comp/comp004-gate-needs-durable-runtime.d.ts.map +1 -0
  125. package/dist/lint/rules/comp/index.d.ts +1 -1
  126. package/dist/lint/rules/comp/index.d.ts.map +1 -1
  127. package/dist/lint/rules/op/index.d.ts +16 -0
  128. package/dist/lint/rules/op/index.d.ts.map +1 -0
  129. package/dist/lint/rules/op/ops012-activity-contract.d.ts +27 -0
  130. package/dist/lint/rules/op/ops012-activity-contract.d.ts.map +1 -0
  131. package/dist/lint/rules/op/ops013-step-output-ref.d.ts +61 -0
  132. package/dist/lint/rules/op/ops013-step-output-ref.d.ts.map +1 -0
  133. package/dist/lint/rules/op/ops014-converge-rule-refusals.d.ts +55 -0
  134. package/dist/lint/rules/op/ops014-converge-rule-refusals.d.ts.map +1 -0
  135. package/dist/lint/rules/op/support.d.ts +12 -0
  136. package/dist/lint/rules/op/support.d.ts.map +1 -0
  137. package/dist/lint/suppressions.d.ts +108 -0
  138. package/dist/lint/suppressions.d.ts.map +1 -0
  139. package/dist/live-endpoint.d.ts +1 -1
  140. package/dist/op/activities/activity-contracts.d.ts +54 -0
  141. package/dist/op/activities/activity-contracts.d.ts.map +1 -0
  142. package/dist/op/activities/apply.d.ts +262 -0
  143. package/dist/op/activities/apply.d.ts.map +1 -0
  144. package/dist/op/activities/build.d.ts +13 -0
  145. package/dist/op/activities/build.d.ts.map +1 -0
  146. package/dist/op/activities/converge.d.ts +110 -0
  147. package/dist/op/activities/converge.d.ts.map +1 -0
  148. package/dist/op/activities/env-teardown.d.ts +76 -0
  149. package/dist/op/activities/env-teardown.d.ts.map +1 -0
  150. package/dist/op/activities/guard-validate.d.ts +64 -0
  151. package/dist/op/activities/guard-validate.d.ts.map +1 -0
  152. package/dist/op/activities/http-check.d.ts +34 -0
  153. package/dist/op/activities/http-check.d.ts.map +1 -0
  154. package/dist/op/activities/index.d.ts +31 -0
  155. package/dist/op/activities/index.d.ts.map +1 -0
  156. package/dist/op/activities/lexicon-upgrade.d.ts +182 -0
  157. package/dist/op/activities/lexicon-upgrade.d.ts.map +1 -0
  158. package/dist/op/activities/lifecycle.d.ts +42 -0
  159. package/dist/op/activities/lifecycle.d.ts.map +1 -0
  160. package/dist/op/activities/pipeline-audit.d.ts +84 -0
  161. package/dist/op/activities/pipeline-audit.d.ts.map +1 -0
  162. package/dist/op/activities/policy.d.ts +17 -0
  163. package/dist/op/activities/policy.d.ts.map +1 -0
  164. package/dist/op/activities/reconcile.d.ts +89 -0
  165. package/dist/op/activities/reconcile.d.ts.map +1 -0
  166. package/dist/op/activities/shell.d.ts +13 -0
  167. package/dist/op/activities/shell.d.ts.map +1 -0
  168. package/dist/op/activities/teardown.d.ts +10 -0
  169. package/dist/op/activities/teardown.d.ts.map +1 -0
  170. package/dist/op/activities/util.d.ts +7 -0
  171. package/dist/op/activities/util.d.ts.map +1 -0
  172. package/dist/op/activities/wait.d.ts +28 -0
  173. package/dist/op/activities/wait.d.ts.map +1 -0
  174. package/dist/op/activities/workflow-audit.d.ts +92 -0
  175. package/dist/op/activities/workflow-audit.d.ts.map +1 -0
  176. package/dist/op/activity-contract-registry.d.ts +76 -0
  177. package/dist/op/activity-contract-registry.d.ts.map +1 -0
  178. package/dist/op/activity-contract.d.ts +25 -18
  179. package/dist/op/activity-contract.d.ts.map +1 -1
  180. package/dist/op/activity-failure.d.ts +28 -0
  181. package/dist/op/activity-failure.d.ts.map +1 -0
  182. package/dist/op/activity-profiles.d.ts +118 -0
  183. package/dist/op/activity-profiles.d.ts.map +1 -0
  184. package/dist/op/activity-registry.d.ts +22 -38
  185. package/dist/op/activity-registry.d.ts.map +1 -1
  186. package/dist/op/activity-runtime.d.ts +3 -14
  187. package/dist/op/activity-runtime.d.ts.map +1 -1
  188. package/dist/op/builders.d.ts +84 -29
  189. package/dist/op/builders.d.ts.map +1 -1
  190. package/dist/op/composites/apply-op.d.ts +113 -0
  191. package/dist/op/composites/apply-op.d.ts.map +1 -0
  192. package/dist/op/composites/converge-op.d.ts +120 -0
  193. package/dist/op/composites/converge-op.d.ts.map +1 -0
  194. package/dist/op/composites/index.d.ts +26 -0
  195. package/dist/op/composites/index.d.ts.map +1 -0
  196. package/dist/op/composites/lexicon-upgrade-op.d.ts +78 -0
  197. package/dist/op/composites/lexicon-upgrade-op.d.ts.map +1 -0
  198. package/dist/op/composites/pipeline-audit-op.d.ts +50 -0
  199. package/dist/op/composites/pipeline-audit-op.d.ts.map +1 -0
  200. package/dist/op/composites/reconcile-op.d.ts +57 -0
  201. package/dist/op/composites/reconcile-op.d.ts.map +1 -0
  202. package/dist/op/composites/watch-op.d.ts +60 -0
  203. package/dist/op/composites/watch-op.d.ts.map +1 -0
  204. package/dist/op/composites/workflow-audit-op.d.ts +57 -0
  205. package/dist/op/composites/workflow-audit-op.d.ts.map +1 -0
  206. package/dist/op/converge-rule.d.ts +12 -10
  207. package/dist/op/converge-rule.d.ts.map +1 -1
  208. package/dist/op/cron.d.ts +51 -0
  209. package/dist/op/cron.d.ts.map +1 -0
  210. package/dist/op/discover.d.ts +9 -0
  211. package/dist/op/discover.d.ts.map +1 -1
  212. package/dist/op/duration.d.ts +11 -0
  213. package/dist/op/duration.d.ts.map +1 -0
  214. package/dist/op/emulator-lifecycle.d.ts.map +1 -1
  215. package/dist/op/gate.d.ts +90 -0
  216. package/dist/op/gate.d.ts.map +1 -0
  217. package/dist/op/generate-pipeline.d.ts +9 -0
  218. package/dist/op/generate-pipeline.d.ts.map +1 -1
  219. package/dist/op/index.d.ts +23 -7
  220. package/dist/op/index.d.ts.map +1 -1
  221. package/dist/op/local-executor.d.ts +114 -28
  222. package/dist/op/local-executor.d.ts.map +1 -1
  223. package/dist/op/local-output.d.ts +11 -1
  224. package/dist/op/local-output.d.ts.map +1 -1
  225. package/dist/op/op-ir.d.ts +184 -0
  226. package/dist/op/op-ir.d.ts.map +1 -0
  227. package/dist/op/op-verb-class.d.ts +10 -2
  228. package/dist/op/op-verb-class.d.ts.map +1 -1
  229. package/dist/op/operator.d.ts +30 -5
  230. package/dist/op/operator.d.ts.map +1 -1
  231. package/dist/op/receipt-store.d.ts +1 -1
  232. package/dist/op/receipt-store.d.ts.map +1 -1
  233. package/dist/op/resource.d.ts +15 -1
  234. package/dist/op/resource.d.ts.map +1 -1
  235. package/dist/op/runtime.d.ts +200 -0
  236. package/dist/op/runtime.d.ts.map +1 -0
  237. package/dist/op/runtimes/local.d.ts +29 -0
  238. package/dist/op/runtimes/local.d.ts.map +1 -0
  239. package/dist/op/step-output-ref.d.ts +15 -13
  240. package/dist/op/step-output-ref.d.ts.map +1 -1
  241. package/dist/op/types.d.ts +79 -27
  242. package/dist/op/types.d.ts.map +1 -1
  243. package/dist/ownership.d.ts +1 -1
  244. package/dist/provenance.d.ts +21 -0
  245. package/dist/provenance.d.ts.map +1 -1
  246. package/dist/serializer-walker.d.ts.map +1 -1
  247. package/package.json +6 -1
  248. package/src/audit/catalog.test.ts +79 -3
  249. package/src/audit/catalog.ts +111 -13
  250. package/src/audit/core.test.ts +26 -0
  251. package/src/audit/core.ts +61 -17
  252. package/src/audit/discover.test.ts +39 -0
  253. package/src/audit/discover.ts +91 -15
  254. package/src/audit/lineage.ts +100 -0
  255. package/src/audit/prior-art.ts +153 -0
  256. package/src/audit/proof.test.ts +67 -0
  257. package/src/audit/proof.ts +70 -0
  258. package/src/audit/report-html.ts +9 -4
  259. package/src/audit/report-model.ts +16 -2
  260. package/src/audit/report.test.ts +33 -0
  261. package/src/audit/report.ts +5 -3
  262. package/src/audit/rules-doc.test.ts +34 -2
  263. package/src/audit/rules-doc.ts +82 -9
  264. package/src/audit/secrets.ts +15 -3
  265. package/src/audit/terraform-state.test.ts +144 -0
  266. package/src/audit/terraform-state.ts +131 -0
  267. package/src/build.ts +31 -1
  268. package/src/claimed-fields.test.ts +145 -0
  269. package/src/claimed-fields.ts +208 -0
  270. package/src/cli/build-params-cli.ts +2 -2
  271. package/src/cli/command-group.ts +14 -0
  272. package/src/cli/commands/__fixtures__/audit-terraform/infra/.terraform/providers/lock.txt +1 -0
  273. package/src/cli/commands/__fixtures__/audit-terraform/infra/main.tf +1 -0
  274. package/src/cli/commands/__fixtures__/audit-terraform/infra/modules/foo/main.tf +1 -0
  275. package/src/cli/commands/__fixtures__/audit-terraform/infra/variables.tf +3 -0
  276. package/src/cli/commands/__fixtures__/init-lexicon-output/package.json +13 -4
  277. package/src/cli/commands/__fixtures__/init-lexicon-output/src/codegen/docs-cli.ts +4 -0
  278. package/src/cli/commands/__fixtures__/init-lexicon-output/src/codegen/package.ts +1 -0
  279. package/src/cli/commands/__fixtures__/init-lexicon-output/src/package-cli.ts +21 -0
  280. package/src/cli/commands/__snapshots__/init-lexicon.test.ts.snap +1 -0
  281. package/src/cli/commands/audit.test.ts +189 -11
  282. package/src/cli/commands/audit.ts +73 -27
  283. package/src/cli/commands/build.test.ts +292 -9
  284. package/src/cli/commands/build.ts +156 -24
  285. package/src/cli/commands/check-lexicon-docs.ts +1 -1
  286. package/src/cli/commands/check-lexicon-examples.test.ts +29 -1
  287. package/src/cli/commands/check-lexicon-examples.ts +42 -10
  288. package/src/cli/commands/init-lexicon/templates/codegen.ts +9 -0
  289. package/src/cli/commands/init-lexicon/templates/project.ts +44 -4
  290. package/src/cli/commands/init-lexicon.test.ts +97 -2
  291. package/src/cli/commands/init-lexicon.ts +4 -2
  292. package/src/cli/commands/init.test.ts +35 -1
  293. package/src/cli/commands/init.ts +14 -3
  294. package/src/cli/commands/lint.test.ts +48 -0
  295. package/src/cli/commands/lint.ts +123 -0
  296. package/src/cli/commands/onboard.test.ts +75 -0
  297. package/src/cli/commands/onboard.ts +54 -23
  298. package/src/cli/handlers/build.test.ts +81 -1
  299. package/src/cli/handlers/build.ts +15 -1
  300. package/src/cli/handlers/graph.test.ts +3 -3
  301. package/src/cli/handlers/lifecycle.test.ts +195 -12
  302. package/src/cli/handlers/lifecycle.ts +123 -6
  303. package/src/cli/handlers/misc.ts +1 -1
  304. package/src/cli/handlers/operator.test.ts +183 -11
  305. package/src/cli/handlers/operator.ts +260 -55
  306. package/src/cli/handlers/run.test.ts +431 -1287
  307. package/src/cli/handlers/run.ts +365 -915
  308. package/src/cli/main.test.ts +23 -15
  309. package/src/cli/main.ts +88 -33
  310. package/src/cli/mcp/op-tools.ts +147 -88
  311. package/src/cli/mcp/resource-handlers.ts +10 -37
  312. package/src/cli/mcp/resources/context.ts +11 -12
  313. package/src/cli/mcp/server.test.ts +25 -27
  314. package/src/cli/mcp/server.ts +2 -2
  315. package/src/cli/registry.ts +26 -9
  316. package/src/codegen/docs.ts +1 -1
  317. package/src/codegen/generate-post-synth-barrel.test.ts +1 -1
  318. package/src/codegen/generate-post-synth-barrel.ts +1 -1
  319. package/src/components/README.md +3 -2
  320. package/src/components/auto-release.test.ts +4 -20
  321. package/src/components/auto-release.ts +17 -42
  322. package/src/components/capability.ts +4 -4
  323. package/src/components/cli-support.test.ts +10 -5
  324. package/src/components/cli-support.ts +52 -44
  325. package/src/components/component.schema.json +2 -2
  326. package/src/components/component.ts +3 -3
  327. package/src/components/driver-output.ts +14 -2
  328. package/src/components/driver.test.ts +92 -22
  329. package/src/components/driver.ts +193 -83
  330. package/src/components/index.ts +1 -6
  331. package/src/components/manifest-persistence.test.ts +2 -20
  332. package/src/components/manifest-persistence.ts +4 -24
  333. package/src/components/pilots/pilots-lint-clean.test.ts +11 -10
  334. package/src/components/run-progress.ts +6 -6
  335. package/src/components/verbs/run-agent.ts +11 -17
  336. package/src/components/verbs/verify.ts +2 -2
  337. package/src/deep-observation.test.ts +75 -0
  338. package/src/deep-observation.ts +48 -0
  339. package/src/discovery/collect.test.ts +3 -3
  340. package/src/discovery/files.ts +4 -4
  341. package/src/discovery/fold-import.ts +105 -2
  342. package/src/discovery/param-deps.test.ts +112 -1
  343. package/src/discovery/param-deps.ts +193 -0
  344. package/src/discovery/sandbox/bundle.ts +15 -1
  345. package/src/discovery/sandbox/config-wire.test.ts +2 -2
  346. package/src/discovery/sandbox/config-wire.ts +2 -2
  347. package/src/fold/fold.test.ts +56 -0
  348. package/src/fold/foldable-helpers.ts +81 -1
  349. package/src/fold-provenance-exclusion.test.ts +186 -0
  350. package/src/fold-provenance.test.ts +495 -0
  351. package/src/fold-provenance.ts +441 -0
  352. package/src/graph-ops.test.ts +2 -2
  353. package/src/graph-ops.ts +1 -1
  354. package/src/held-elsewhere.test.ts +102 -0
  355. package/src/held-elsewhere.ts +114 -0
  356. package/src/index.ts +3 -0
  357. package/src/kubectl-context.ts +3 -3
  358. package/src/lexicon-config.test.ts +5 -5
  359. package/src/lexicon-config.ts +4 -4
  360. package/src/lexicon-plugin-helpers.ts +1 -1
  361. package/src/lexicon.ts +120 -14
  362. package/src/lifecycle/change-set.test.ts +49 -0
  363. package/src/lifecycle/change-set.ts +67 -0
  364. package/src/lifecycle/converge-ledger.ts +1 -1
  365. package/src/lifecycle/deep-diff.test.ts +267 -14
  366. package/src/lifecycle/deep-diff.ts +217 -14
  367. package/src/lifecycle/deep-observe.test.ts +3 -1
  368. package/src/lifecycle/deep-observe.ts +16 -6
  369. package/src/lifecycle/gate-ledger.test.ts +74 -2
  370. package/src/lifecycle/gate-ledger.ts +143 -36
  371. package/src/lifecycle/index.ts +1 -0
  372. package/src/lifecycle/release-ledger.ts +2 -2
  373. package/src/lifecycle/run-ledger.test.ts +268 -0
  374. package/src/lifecycle/run-ledger.ts +201 -0
  375. package/src/lifecycle/symptoms.ts +3 -3
  376. package/src/lint/config.test.ts +82 -1
  377. package/src/lint/config.ts +112 -3
  378. package/src/lint/policy.test.ts +1 -1
  379. package/src/lint/post-synth.test.ts +31 -0
  380. package/src/lint/post-synth.ts +54 -1
  381. package/src/lint/rules/__fixtures__/comp/comp004/pass/neo4j-cluster.component.ts +2 -2
  382. package/src/lint/rules/__fixtures__/comp/comp004/pass/orders-table.component.ts +1 -1
  383. package/src/lint/rules/comp/comp.test.ts +1 -1
  384. package/src/lint/rules/comp/comp004-gate-needs-durable-runtime.ts +74 -0
  385. package/src/lint/rules/comp/index.ts +3 -3
  386. package/src/lint/rules/op/index.ts +23 -0
  387. package/src/lint/rules/op/ops012-activity-contract.test.ts +161 -0
  388. package/src/lint/rules/op/ops012-activity-contract.ts +64 -0
  389. package/src/lint/rules/op/ops013-step-output-ref.test.ts +237 -0
  390. package/src/lint/rules/op/ops013-step-output-ref.ts +98 -0
  391. package/src/lint/rules/op/ops014-converge-rule-refusals.test.ts +263 -0
  392. package/src/lint/rules/op/ops014-converge-rule-refusals.ts +179 -0
  393. package/src/lint/rules/op/support.ts +11 -0
  394. package/src/lint/suppressions.test.ts +163 -0
  395. package/src/lint/suppressions.ts +204 -0
  396. package/src/live-endpoint.ts +1 -1
  397. package/src/op/activities/activity-contracts.ts +66 -0
  398. package/src/op/activities/apply.test.ts +567 -0
  399. package/src/op/activities/apply.ts +662 -0
  400. package/src/op/activities/build.ts +26 -0
  401. package/src/op/activities/converge.test.ts +330 -0
  402. package/src/op/activities/converge.ts +449 -0
  403. package/src/op/activities/env-teardown.test.ts +187 -0
  404. package/src/op/activities/env-teardown.ts +171 -0
  405. package/src/op/activities/guard-validate.test.ts +139 -0
  406. package/src/op/activities/guard-validate.ts +223 -0
  407. package/src/op/activities/http-check.test.ts +48 -0
  408. package/src/op/activities/http-check.ts +55 -0
  409. package/src/op/activities/index.ts +119 -0
  410. package/src/op/activities/lexicon-upgrade.test.ts +492 -0
  411. package/src/op/activities/lexicon-upgrade.ts +673 -0
  412. package/src/op/activities/lifecycle.ts +85 -0
  413. package/src/op/activities/pipeline-audit.test.ts +67 -0
  414. package/src/op/activities/pipeline-audit.ts +201 -0
  415. package/src/op/activities/policy.test.ts +19 -0
  416. package/src/op/activities/policy.ts +37 -0
  417. package/src/op/activities/reconcile.test.ts +81 -0
  418. package/src/op/activities/reconcile.ts +187 -0
  419. package/src/op/activities/shell.ts +26 -0
  420. package/src/op/activities/teardown.ts +22 -0
  421. package/src/op/activities/util.ts +6 -0
  422. package/src/op/activities/wait.ts +69 -0
  423. package/src/op/activities/workflow-audit.test.ts +90 -0
  424. package/src/op/activities/workflow-audit.ts +203 -0
  425. package/src/op/activity-contract-registry.test.ts +98 -0
  426. package/src/op/activity-contract-registry.ts +114 -0
  427. package/src/op/activity-contract.test.ts +1 -1
  428. package/src/op/activity-contract.ts +37 -33
  429. package/src/op/activity-failure.ts +34 -0
  430. package/src/op/activity-profiles.test.ts +56 -0
  431. package/src/op/activity-profiles.ts +116 -0
  432. package/src/op/activity-registry.test.ts +37 -28
  433. package/src/op/activity-registry.ts +27 -56
  434. package/src/op/activity-runtime.ts +3 -47
  435. package/src/op/builders-exports.test.ts +0 -49
  436. package/src/op/builders-typed.test.ts +164 -0
  437. package/src/op/builders.ts +123 -39
  438. package/src/op/composites/apply-op.ts +208 -0
  439. package/src/op/composites/composites.test.ts +366 -0
  440. package/src/op/composites/converge-op.test.ts +168 -0
  441. package/src/op/composites/converge-op.ts +214 -0
  442. package/src/op/composites/index.ts +26 -0
  443. package/src/op/composites/lexicon-upgrade-op.test.ts +68 -0
  444. package/src/op/composites/lexicon-upgrade-op.ts +134 -0
  445. package/src/op/composites/pipeline-audit-op.test.ts +25 -0
  446. package/src/op/composites/pipeline-audit-op.ts +78 -0
  447. package/src/op/composites/reconcile-op.test.ts +51 -0
  448. package/src/op/composites/reconcile-op.ts +107 -0
  449. package/src/op/composites/watch-op.ts +108 -0
  450. package/src/op/composites/workflow-audit-op.test.ts +25 -0
  451. package/src/op/composites/workflow-audit-op.ts +88 -0
  452. package/src/op/converge-rule.ts +12 -10
  453. package/src/op/cron.test.ts +128 -0
  454. package/src/op/cron.ts +149 -0
  455. package/src/op/discover-root.test.ts +105 -1
  456. package/src/op/discover.test.ts +6 -2
  457. package/src/op/discover.ts +84 -16
  458. package/src/op/duration.ts +21 -0
  459. package/src/op/effect-step.test.ts +26 -11
  460. package/src/op/emulator-lifecycle.ts +1 -2
  461. package/src/op/gate.ts +155 -0
  462. package/src/op/generate-pipeline.test.ts +65 -3
  463. package/src/op/generate-pipeline.ts +19 -2
  464. package/src/op/index.ts +39 -6
  465. package/src/op/local-executor.test.ts +163 -34
  466. package/src/op/local-executor.ts +370 -102
  467. package/src/op/local-output.test.ts +95 -11
  468. package/src/op/local-output.ts +33 -4
  469. package/src/op/op-ir.test.ts +281 -0
  470. package/src/op/op-ir.ts +417 -0
  471. package/src/op/op-verb-class.ts +19 -5
  472. package/src/op/op.test.ts +26 -5
  473. package/src/op/operator.test.ts +175 -6
  474. package/src/op/operator.ts +63 -16
  475. package/src/op/receipt-store.ts +1 -1
  476. package/src/op/resource.ts +20 -2
  477. package/src/op/runtime.ts +203 -0
  478. package/src/op/runtimes/local.test.ts +181 -0
  479. package/src/op/runtimes/local.ts +212 -0
  480. package/src/op/step-output-ref.ts +15 -13
  481. package/src/op/types.ts +84 -24
  482. package/src/ownership.ts +1 -1
  483. package/src/provenance.test.ts +6 -0
  484. package/src/provenance.ts +21 -1
  485. package/src/serializer-walker.test.ts +42 -0
  486. package/src/serializer-walker.ts +21 -2
  487. package/dist/cli/handlers/op-progress.d.ts +0 -90
  488. package/dist/cli/handlers/op-progress.d.ts.map +0 -1
  489. package/dist/cli/handlers/run-client.d.ts +0 -127
  490. package/dist/cli/handlers/run-client.d.ts.map +0 -1
  491. package/dist/cli/handlers/run-report.d.ts +0 -5
  492. package/dist/cli/handlers/run-report.d.ts.map +0 -1
  493. package/dist/components/temporal-codegen-loader.d.ts +0 -27
  494. package/dist/components/temporal-codegen-loader.d.ts.map +0 -1
  495. package/dist/lint/rules/comp/comp004-gate-needs-temporal.d.ts +0 -37
  496. package/dist/lint/rules/comp/comp004-gate-needs-temporal.d.ts.map +0 -1
  497. package/src/cli/handlers/op-progress.test.ts +0 -268
  498. package/src/cli/handlers/op-progress.ts +0 -248
  499. package/src/cli/handlers/run-client.test.ts +0 -82
  500. package/src/cli/handlers/run-client.ts +0 -219
  501. package/src/cli/handlers/run-report.test.ts +0 -62
  502. package/src/cli/handlers/run-report.ts +0 -122
  503. package/src/components/temporal-codegen-loader.ts +0 -41
  504. package/src/lint/rules/comp/comp004-gate-needs-temporal.ts +0 -66
@@ -1,219 +0,0 @@
1
- /** Subset of WorkerProfile fields used by `chant run`. */
2
- export interface WorkerProfile {
3
- address: string;
4
- namespace: string;
5
- taskQueue: string;
6
- tls?: boolean | { serverNameOverride?: string };
7
- apiKey?: string | { env: string };
8
- autoStart?: boolean;
9
- }
10
-
11
- export interface TemporalClientModule {
12
- Connection: {
13
- connect(opts: Record<string, unknown>): Promise<unknown>;
14
- };
15
- Client: new (opts: Record<string, unknown>) => TemporalClientHandle;
16
- }
17
-
18
- export interface TemporalClientHandle {
19
- workflow: {
20
- start(workflowFn: unknown, opts: Record<string, unknown>): Promise<WorkflowHandleRaw>;
21
- getHandle(workflowId: string): WorkflowHandleRaw;
22
- list(opts?: Record<string, unknown>): AsyncIterable<WorkflowExecutionInfo>;
23
- };
24
- }
25
-
26
- export interface WorkflowHandleRaw {
27
- workflowId: string;
28
- firstExecutionRunId?: string;
29
- result(): Promise<unknown>;
30
- describe(): Promise<WorkflowExecutionDescription>;
31
- fetchHistory(): Promise<WorkflowHistoryRaw>;
32
- signal(signalName: string, ...args: unknown[]): Promise<void>;
33
- query<T = unknown>(queryName: string, ...args: unknown[]): Promise<T>;
34
- cancel(): Promise<void>;
35
- }
36
-
37
- export interface WorkflowExecutionDescription {
38
- workflowId: string;
39
- runId: string;
40
- status: { name: string };
41
- startTime: Date;
42
- closeTime?: Date;
43
- taskQueue: string;
44
- type: { name: string };
45
- }
46
-
47
- export interface WorkflowExecutionInfo {
48
- workflowId: string;
49
- runId: string;
50
- type: { name: string };
51
- status: { name: string };
52
- startTime: Date;
53
- closeTime?: Date;
54
- }
55
-
56
- export interface WorkflowHistoryRaw {
57
- events?: HistoryEvent[];
58
- }
59
-
60
- /**
61
- * `eventType` is the short PascalCase form (`"ActivityTaskScheduled"`, not
62
- * the wire enum's `"EVENT_TYPE_ACTIVITY_TASK_SCHEDULED"`) and `eventId`/
63
- * `scheduledEventId` are decimal strings — the shape {@link fetchNormalizedHistory}
64
- * produces, not `WorkflowHandleRaw.fetchHistory()`'s own raw return value.
65
- */
66
- export interface HistoryEvent {
67
- eventId?: string;
68
- eventType?: string;
69
- eventTime?: Date;
70
- activityTaskCompletedEventAttributes?: { scheduledEventId?: string };
71
- activityTaskScheduledEventAttributes?: { activityId?: string; activityType?: { name?: string } };
72
- activityTaskFailedEventAttributes?: { scheduledEventId?: string; failure?: { message?: string } };
73
- workflowExecutionCompletedEventAttributes?: unknown;
74
- workflowExecutionFailedEventAttributes?: { failure?: { message?: string } };
75
- }
76
-
77
- /**
78
- * `WorkflowHandleRaw.fetchHistory()` returns the Temporal wire proto
79
- * untouched: `eventType` is the numeric enum, `eventId`/`scheduledEventId`
80
- * are `Long` instances, `eventTime` is a `{seconds, nanos}` protobuf
81
- * Timestamp — none of them comparable or constructible the way the rest of
82
- * this file (and run-report.ts, op-progress.ts) needs. The proto message's
83
- * own `toJSON()` is what turns enums into their string name and `Long`s into
84
- * decimal strings, so a JSON round-trip is the normalization step; only
85
- * `eventTime` then needs a further Timestamp-to-Date conversion.
86
- */
87
- export async function fetchNormalizedHistory(handle: WorkflowHandleRaw): Promise<WorkflowHistoryRaw> {
88
- const raw = (await handle.fetchHistory()) as unknown as { events?: unknown[] };
89
- const events = JSON.parse(JSON.stringify(raw.events ?? [])) as Array<Record<string, unknown>>;
90
- return { events: events.map(normalizeHistoryEvent) };
91
- }
92
-
93
- /** `"EVENT_TYPE_ACTIVITY_TASK_SCHEDULED"` → `"ActivityTaskScheduled"`. A value that isn't ALL_CAPS_WITH_UNDERSCORES (e.g. already-short test fixture data) passes through unchanged, so normalizing twice is a no-op. */
94
- function shortEventType(raw: unknown): string | undefined {
95
- if (typeof raw !== "string" || raw.length === 0) return undefined;
96
- if (!/^[A-Z][A-Z0-9_]*$/.test(raw)) return raw;
97
- const stripped = raw.startsWith("EVENT_TYPE_") ? raw.slice("EVENT_TYPE_".length) : raw;
98
- return stripped
99
- .split("_")
100
- .filter(Boolean)
101
- .map((w) => w[0] + w.slice(1).toLowerCase())
102
- .join("");
103
- }
104
-
105
- /** Accepts a protobuf `{seconds, nanos}` Timestamp (its `seconds` a decimal string post-JSON-round-trip), an ISO string (already-normalized test fixture data, or the same value normalized twice), or a `Date`. */
106
- function protoTimestampToDate(ts: unknown): Date | undefined {
107
- if (!ts) return undefined;
108
- if (ts instanceof Date) return ts;
109
- if (typeof ts === "string") {
110
- const d = new Date(ts);
111
- return Number.isNaN(d.getTime()) ? undefined : d;
112
- }
113
- if (typeof ts !== "object") return undefined;
114
- const seconds = Number((ts as { seconds?: unknown }).seconds);
115
- const nanos = Number((ts as { nanos?: unknown }).nanos ?? 0);
116
- if (!Number.isFinite(seconds)) return undefined;
117
- return new Date(seconds * 1000 + Math.floor(nanos / 1e6));
118
- }
119
-
120
- /** `undefined`/`null` stays `undefined`; anything else (a decimal string post-JSON-round-trip, or a bare number/Long from an un-round-tripped test fixture) becomes a string — `scheduledEventId` is joined against `eventId` as a Map key, and a number `7` and a string `"7"` are different keys. */
121
- function idString(v: unknown): string | undefined {
122
- return v === undefined || v === null ? undefined : String(v);
123
- }
124
-
125
- function normalizeHistoryEvent(raw: Record<string, unknown>): HistoryEvent {
126
- const scheduled = raw.activityTaskScheduledEventAttributes as
127
- | { activityId?: unknown; activityType?: { name?: string } }
128
- | undefined;
129
- const completed = raw.activityTaskCompletedEventAttributes as { scheduledEventId?: unknown } | undefined;
130
- const failed = raw.activityTaskFailedEventAttributes as
131
- | { scheduledEventId?: unknown; failure?: { message?: string } }
132
- | undefined;
133
-
134
- return {
135
- eventId: idString(raw.eventId),
136
- eventType: shortEventType(raw.eventType),
137
- eventTime: protoTimestampToDate(raw.eventTime),
138
- ...(scheduled
139
- ? { activityTaskScheduledEventAttributes: { activityId: idString(scheduled.activityId), activityType: scheduled.activityType } }
140
- : {}),
141
- ...(completed
142
- ? { activityTaskCompletedEventAttributes: { scheduledEventId: idString(completed.scheduledEventId) } }
143
- : {}),
144
- ...(failed
145
- ? { activityTaskFailedEventAttributes: { scheduledEventId: idString(failed.scheduledEventId), failure: failed.failure } }
146
- : {}),
147
- workflowExecutionCompletedEventAttributes: raw.workflowExecutionCompletedEventAttributes,
148
- workflowExecutionFailedEventAttributes: raw.workflowExecutionFailedEventAttributes as HistoryEvent["workflowExecutionFailedEventAttributes"],
149
- };
150
- }
151
-
152
- /**
153
- * Dynamically import @temporalio/client from the user's project node_modules.
154
- * Fails with a helpful message if not installed.
155
- */
156
- export async function loadTemporalClient(): Promise<TemporalClientModule> {
157
- try {
158
- // Use variable to prevent tsc from statically resolving the optional dep
159
- const mod = "@temporalio/client";
160
- return await import(mod) as unknown as TemporalClientModule;
161
- } catch {
162
- throw new Error(
163
- '@temporalio/client is not installed. Run: npm install @temporalio/client',
164
- );
165
- }
166
- }
167
-
168
- /**
169
- * Build a Temporal Connection.connect() options object from a worker profile.
170
- */
171
- export function connectionOptions(profile: WorkerProfile): Record<string, unknown> {
172
- const apiKey =
173
- typeof profile.apiKey === "object" && profile.apiKey !== null
174
- ? process.env[(profile.apiKey as { env: string }).env]
175
- : (profile.apiKey as string | undefined);
176
-
177
- return {
178
- address: profile.address,
179
- ...(profile.tls && {
180
- tls: typeof profile.tls === "object" ? profile.tls : {},
181
- metadata: apiKey ? { Authorization: `Bearer ${apiKey}` } : {},
182
- }),
183
- };
184
- }
185
-
186
- /**
187
- * Deterministic workflow ID for an Op — allows status/signal/cancel/log
188
- * without storing run IDs locally.
189
- */
190
- export function resolveWorkflowId(opName: string): string {
191
- return `chant-op-${opName}`;
192
- }
193
-
194
- /**
195
- * Resolve a named profile from the chant config.
196
- * Falls back to defaultProfile then "local".
197
- */
198
- export function resolveProfile(
199
- config: Record<string, unknown>,
200
- profileName?: string,
201
- ): WorkerProfile {
202
- // #1344 — the temporal lexicon declares this namespace and core validates it
203
- // at load, so this reads a checked value rather than asserting one.
204
- const temporal = (config as { temporal?: Record<string, unknown> }).temporal;
205
- if (!temporal?.profiles) {
206
- throw new Error(
207
- 'No temporal.profiles found in chant.config.ts. Add a profile to use `chant run`.',
208
- );
209
- }
210
- const profiles = temporal.profiles as Record<string, WorkerProfile>;
211
- const name = profileName ?? (temporal.defaultProfile as string | undefined) ?? "local";
212
- const profile = profiles[name];
213
- if (!profile) {
214
- throw new Error(
215
- `Temporal profile "${name}" not found. Available: ${Object.keys(profiles).join(", ")}`,
216
- );
217
- }
218
- return profile;
219
- }
@@ -1,62 +0,0 @@
1
- import { describe, test, expect } from "vitest";
2
- import { generateReport } from "./run-report";
3
- import type { OpConfig } from "../../op/types";
4
- import type { WorkflowExecutionDescription, WorkflowHistoryRaw, HistoryEvent } from "./run-client";
5
-
6
- function scheduled(eventId: string, fn: string): HistoryEvent {
7
- return {
8
- eventId,
9
- eventType: "ActivityTaskScheduled",
10
- eventTime: new Date(0),
11
- activityTaskScheduledEventAttributes: { activityId: eventId, activityType: { name: fn } },
12
- };
13
- }
14
- function completed(scheduledEventId: string): HistoryEvent {
15
- return {
16
- eventType: "ActivityTaskCompleted",
17
- eventTime: new Date(1000),
18
- activityTaskCompletedEventAttributes: { scheduledEventId },
19
- };
20
- }
21
-
22
- const desc: WorkflowExecutionDescription = {
23
- workflowId: "wf", runId: "r1", status: { name: "COMPLETED" },
24
- startTime: new Date(0), closeTime: new Date(2000), taskQueue: "q", type: { name: "opWorkflow" },
25
- };
26
-
27
- describe("generateReport", () => {
28
- test("two steps calling the same activity each get their own row (no last-wins collision, chant #1676)", () => {
29
- const config: OpConfig = {
30
- name: "op", overview: "o",
31
- phases: [{ name: "P1", steps: [{ kind: "activity", fn: "dup" }, { kind: "activity", fn: "dup" }] }],
32
- };
33
- const history: WorkflowHistoryRaw = {
34
- events: [scheduled("1", "dup"), completed("1"), scheduled("2", "dup"), completed("2")],
35
- };
36
- const md = generateReport("op", config, desc, history);
37
- // Both rows present — the prior fn-name join would have produced one
38
- // row for "dup" (the second scheduled event overwriting the first).
39
- const dupRows = md.split("\n").filter((line) => line.includes("| P1 | dup |"));
40
- expect(dupRows).toHaveLength(2);
41
- expect(dupRows.every((line) => line.includes("✓ completed"))).toBe(true);
42
- });
43
-
44
- test("a declared step with no matching history is reported skipped, not a phantom 'running' row", () => {
45
- const config: OpConfig = {
46
- name: "op", overview: "o",
47
- phases: [
48
- { name: "P1", steps: [{ kind: "activity", fn: "a" }] },
49
- { name: "P2", steps: [{ kind: "activity", fn: "b" }] },
50
- ],
51
- onFailure: [{ name: "C1", steps: [{ kind: "activity", fn: "comp" }] }],
52
- };
53
- const history: WorkflowHistoryRaw = { events: [scheduled("1", "a"), completed("1"), scheduled("2", "b"), completed("2")] };
54
- const md = generateReport("op", config, desc, history);
55
- expect(md).toContain("| P1 | a | 1.0s | ✓ completed |");
56
- expect(md).toContain("| P2 | b | 1.0s | ✓ completed |");
57
- // The timeline table is scoped to config.phases only (unchanged from
58
- // before this fix) — onFailure phases never appear in it regardless of
59
- // whether they ran.
60
- expect(md).not.toContain("C1");
61
- });
62
- });
@@ -1,122 +0,0 @@
1
- import { writeFileSync, mkdirSync } from "node:fs";
2
- import { join, dirname } from "node:path";
3
- import type { OpConfig } from "../../op/types";
4
- import type { WorkflowExecutionDescription, WorkflowHistoryRaw, HistoryEvent } from "./run-client";
5
- import { extractStepRecords } from "./op-progress";
6
-
7
- interface ActivityRecord {
8
- name: string;
9
- durationMs?: number;
10
- status: "completed" | "failed" | "skipped";
11
- error?: string;
12
- }
13
-
14
- interface PhaseRecord {
15
- name: string;
16
- activities: ActivityRecord[];
17
- }
18
-
19
- function formatDuration(ms: number): string {
20
- if (ms < 1000) return `${ms}ms`;
21
- if (ms < 60_000) return `${(ms / 1000).toFixed(1)}s`;
22
- const mins = Math.floor(ms / 60_000);
23
- const secs = Math.round((ms % 60_000) / 1000);
24
- return secs > 0 ? `${mins}m ${secs}s` : `${mins}m`;
25
- }
26
-
27
- /**
28
- * Group `extractStepRecords`' flat, declared-order step list back into
29
- * per-phase rows for the markdown table. `final` (a closed workflow has
30
- * every settled step it's ever going to have) decides whether an unmatched
31
- * declared step is reported "skipped" or simply omitted for now — see
32
- * `extractStepRecords`'s own doc.
33
- */
34
- function extractPhaseRecords(config: OpConfig, history: WorkflowHistoryRaw, final: boolean): PhaseRecord[] {
35
- const byPhase = new Map<string, ActivityRecord[]>();
36
- for (const phase of config.phases) byPhase.set(phase.name, []);
37
-
38
- for (const step of extractStepRecords(config, history, { final })) {
39
- const status = step.status === "ok" ? "completed" : step.status === "fail" ? "failed" : "skipped";
40
- const list = byPhase.get(step.phase) ?? (byPhase.set(step.phase, []), byPhase.get(step.phase)!);
41
- list.push({ name: step.fn, durationMs: step.durationMs, status, ...(step.error ? { error: step.error } : {}) });
42
- }
43
-
44
- return config.phases.map((phase) => ({ name: phase.name, activities: byPhase.get(phase.name) ?? [] }));
45
- }
46
-
47
- export function generateReport(
48
- opName: string,
49
- config: OpConfig,
50
- description: WorkflowExecutionDescription,
51
- history: WorkflowHistoryRaw,
52
- ): string {
53
- const lines: string[] = [];
54
-
55
- const status = description.status.name;
56
- const startTime = description.startTime;
57
- const closeTime = description.closeTime;
58
- const durationMs = closeTime ? closeTime.getTime() - startTime.getTime() : undefined;
59
-
60
- lines.push(`# Deployment Report: ${opName}`);
61
- lines.push("");
62
- lines.push("## Overview");
63
- lines.push("");
64
- lines.push(`| Field | Value |`);
65
- lines.push(`|---|---|`);
66
- lines.push(`| Op | ${opName} |`);
67
- lines.push(`| Overview | ${config.overview} |`);
68
- lines.push(`| Status | **${status}** |`);
69
- lines.push(`| Workflow ID | ${description.workflowId} |`);
70
- lines.push(`| Run ID | ${description.runId} |`);
71
- lines.push(`| Start | ${startTime.toISOString()} |`);
72
- if (closeTime) lines.push(`| End | ${closeTime.toISOString()} |`);
73
- if (durationMs !== undefined) lines.push(`| Duration | ${formatDuration(durationMs)} |`);
74
- lines.push("");
75
-
76
- lines.push("## Timeline");
77
- lines.push("");
78
- lines.push("| Phase | Activity | Duration | Status |");
79
- lines.push("|---|---|---|---|");
80
-
81
- const phases = extractPhaseRecords(config, history, Boolean(closeTime));
82
- for (const phase of phases) {
83
- if (phase.activities.length === 0) {
84
- lines.push(`| ${phase.name} | — | — | — |`);
85
- }
86
- for (const act of phase.activities) {
87
- const dur = act.durationMs !== undefined ? formatDuration(act.durationMs) : "—";
88
- const statusEmoji = act.status === "completed" ? "✓" : act.status === "failed" ? "✗" : "○";
89
- lines.push(`| ${phase.name} | ${act.name} | ${dur} | ${statusEmoji} ${act.status} |`);
90
- }
91
- }
92
- lines.push("");
93
-
94
- // Errors section
95
- const failedEvents = (history.events ?? []).filter(
96
- (e): e is HistoryEvent & Required<Pick<HistoryEvent, "activityTaskFailedEventAttributes">> =>
97
- e.eventType === "ActivityTaskFailed" && !!e.activityTaskFailedEventAttributes,
98
- );
99
-
100
- if (failedEvents.length > 0) {
101
- lines.push("## Errors");
102
- lines.push("");
103
- for (const event of failedEvents) {
104
- const msg = event.activityTaskFailedEventAttributes?.failure?.message ?? "unknown";
105
- lines.push(`- ${msg}`);
106
- }
107
- lines.push("");
108
- }
109
-
110
- lines.push(`---`);
111
- lines.push(`*Generated by chant at ${new Date().toISOString()}*`);
112
- lines.push("");
113
-
114
- return lines.join("\n");
115
- }
116
-
117
- export function writeReport(opName: string, markdown: string): string {
118
- const outPath = join("dist", `${opName}-report.md`);
119
- mkdirSync(dirname(outPath), { recursive: true });
120
- writeFileSync(outPath, markdown, "utf-8");
121
- return outPath;
122
- }
@@ -1,41 +0,0 @@
1
- /**
2
- * Dynamic loader for the durable component → Temporal codegen (#589, epic
3
- * #551 §5/§8). The actual `serializeComponent` generator lives in
4
- * `@intentius/chant-lexicon-temporal` (`src/component-op/serializer.ts`),
5
- * mirroring `Temporal::Op` codegen — core never statically depends on the
6
- * Temporal lexicon, the same boundary `../op/activity-registry.ts`'s
7
- * `loadActivities`/`loadProfiles` already keep for Op activities.
8
- */
9
-
10
- import type { DriverComponent } from "./driver";
11
-
12
- /** Target environment (and env-config) baked into the generated workflow at compile time — see `serializeComponent`'s docstring in the Temporal lexicon for why this can't be resolved at workflow-run time instead. */
13
- export interface ComponentTemporalCodegenOptions {
14
- env?: string;
15
- vars?: Record<string, unknown>;
16
- }
17
-
18
- export interface ComponentTemporalCodegen {
19
- /** Serialize one component into `{ "components/<name>/workflow.ts": "...", ... }`. */
20
- serializeComponent(component: DriverComponent, options?: ComponentTemporalCodegenOptions): Record<string, string>;
21
- /** Deterministic workflow function name for a component (mirrors the generated `export async function <fn>()`). */
22
- componentWorkflowFnName(componentName: string): string;
23
- }
24
-
25
- /**
26
- * Dynamically import the Temporal lexicon's component codegen. Throws a
27
- * friendly error if the lexicon is not installed — the durable component
28
- * path needs the generator even though discovery/local execution never do.
29
- */
30
- export async function loadComponentTemporalCodegen(): Promise<ComponentTemporalCodegen> {
31
- try {
32
- // Variable specifier so tsc does not statically resolve the optional dep.
33
- const spec = "@intentius/chant-lexicon-temporal/component-op/serializer";
34
- return (await import(spec)) as unknown as ComponentTemporalCodegen;
35
- } catch (err) {
36
- throw new Error(
37
- "no durable component codegen available — install `@intentius/chant-lexicon-temporal` " +
38
- `to run components with --temporal (${err instanceof Error ? err.message : String(err)})`,
39
- );
40
- }
41
- }
@@ -1,66 +0,0 @@
1
- /**
2
- * COMP004: gate-needs-temporal
3
- *
4
- * Flags a `gate` step anywhere in a component's composition — a durable,
5
- * human-approval wait that cannot run on the local in-process executor (see
6
- * ../../../components/driver.ts's `DriverGateUnsupportedError` and
7
- * docs/components/orchestration.mdx's "Temporal is optional" aside: "gates ...
8
- * require the durable (Temporal) execution backend").
9
- *
10
- * The component contract has no per-component backend/executor field (the
11
- * backend is chosen per *run*, via `chant run --temporal`, per epic #551 §8 —
12
- * intentionally not part of the declaration, so the same component graduates
13
- * to Temporal without changing its definition). That means lint cannot tell,
14
- * from the declaration alone, whether a given `gate` will actually run under
15
- * Temporal when this component is deployed — every `gate` is a standing
16
- * "this component needs the durable backend" fact worth surfacing, not a
17
- * mistake to silently allow. Acknowledge it explicitly with a **file-level**
18
- * disable directive once the durable backend is genuinely intended (see
19
- * lint-rules/disable-directives.mdx) — a COMP* diagnostic carries no real
20
- * line/column (it is reported for the whole component; see
21
- * ../../component-checks.ts), so only the file-level `chant-disable` form is
22
- * honored for these rules — `-line`/`-next-line` do not suppress a COMP*
23
- * diagnostic (see ../../../cli/commands/lint.ts's
24
- * `runComponentCheckDiagnostics`):
25
- *
26
- * ```ts
27
- * // chant-disable COMP004 -- graduates to --temporal for the human approval wait
28
- * ```
29
- *
30
- * Triggers on: any `gate` step in `deploy`/`rollback` with no matching
31
- * file-level disable directive.
32
- * OK: a component with no `gate` steps at all, or a `gate` whose file-level
33
- * disable directive documents the Temporal graduation.
34
- */
35
-
36
- import type { ComponentCheck, ComponentCheckContext, ComponentCheckDiagnostic } from "../../component-checks";
37
- import { walkComponent } from "./support";
38
-
39
- export const comp004GateNeedsTemporalRule: ComponentCheck = {
40
- id: "COMP004",
41
- severity: "error",
42
- category: "correctness",
43
- description: "A gate step requires the durable (Temporal) execution backend — it cannot run on the local executor",
44
- check(ctx: ComponentCheckContext): ComponentCheckDiagnostic[] {
45
- const diagnostics: ComponentCheckDiagnostic[] = [];
46
-
47
- for (const [name, { component, filePath }] of ctx.components) {
48
- const { gates } = walkComponent(component);
49
- for (const { gate, phaseName } of gates) {
50
- diagnostics.push({
51
- checkId: "COMP004",
52
- severity: "error",
53
- component: name,
54
- file: filePath,
55
- message:
56
- `Component "${name}": gate "${gate.signalName}" (phase "${phaseName}") requires the durable (Temporal) ` +
57
- `execution backend — it cannot run on the local in-process executor. If this component is meant to run ` +
58
- `with "chant run --temporal", suppress with a file-level "// chant-disable COMP004 -- <reason>" comment ` +
59
- `anywhere in this file to document that intent explicitly.`,
60
- });
61
- }
62
- }
63
-
64
- return diagnostics;
65
- },
66
- };