@intentius/chant 0.13.0 → 0.15.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 (453) hide show
  1. package/dist/audit/catalog.d.ts +45 -5
  2. package/dist/audit/catalog.d.ts.map +1 -1
  3. package/dist/audit/fetch.d.ts.map +1 -1
  4. package/dist/audit/proof.d.ts +3 -0
  5. package/dist/audit/proof.d.ts.map +1 -1
  6. package/dist/audit/report-model.d.ts +4 -1
  7. package/dist/audit/report-model.d.ts.map +1 -1
  8. package/dist/audit/report.d.ts +3 -0
  9. package/dist/audit/report.d.ts.map +1 -1
  10. package/dist/audit/rules-doc.d.ts +8 -2
  11. package/dist/audit/rules-doc.d.ts.map +1 -1
  12. package/dist/cli/commands/audit.d.ts.map +1 -1
  13. package/dist/cli/commands/doctor.d.ts.map +1 -1
  14. package/dist/cli/commands/lexicon-rolling-upgrade.d.ts +37 -0
  15. package/dist/cli/commands/lexicon-rolling-upgrade.d.ts.map +1 -0
  16. package/dist/cli/commands/lexicon-surface-diff.d.ts +48 -0
  17. package/dist/cli/commands/lexicon-surface-diff.d.ts.map +1 -0
  18. package/dist/cli/commands/lint.d.ts.map +1 -1
  19. package/dist/cli/commands/pinned-upgrade.d.ts +41 -0
  20. package/dist/cli/commands/pinned-upgrade.d.ts.map +1 -0
  21. package/dist/cli/handlers/build.d.ts.map +1 -1
  22. package/dist/cli/handlers/components.d.ts +39 -0
  23. package/dist/cli/handlers/components.d.ts.map +1 -0
  24. package/dist/cli/handlers/dev.d.ts +3 -0
  25. package/dist/cli/handlers/dev.d.ts.map +1 -1
  26. package/dist/cli/handlers/graph.d.ts +4 -2
  27. package/dist/cli/handlers/graph.d.ts.map +1 -1
  28. package/dist/cli/handlers/misc.d.ts.map +1 -1
  29. package/dist/cli/handlers/run.d.ts +49 -0
  30. package/dist/cli/handlers/run.d.ts.map +1 -1
  31. package/dist/cli/main.d.ts.map +1 -1
  32. package/dist/cli/registry.d.ts +35 -0
  33. package/dist/cli/registry.d.ts.map +1 -1
  34. package/dist/codegen/fetch.d.ts +22 -0
  35. package/dist/codegen/fetch.d.ts.map +1 -1
  36. package/dist/codegen/lexicon-regen.d.ts +110 -0
  37. package/dist/codegen/lexicon-regen.d.ts.map +1 -0
  38. package/dist/codegen/pinned-upgrade.d.ts +153 -0
  39. package/dist/codegen/pinned-upgrade.d.ts.map +1 -0
  40. package/dist/codegen/rolling-upgrade.d.ts +138 -0
  41. package/dist/codegen/rolling-upgrade.d.ts.map +1 -0
  42. package/dist/codegen/surface-snapshot.d.ts +173 -0
  43. package/dist/codegen/surface-snapshot.d.ts.map +1 -0
  44. package/dist/codegen/version-bump.d.ts +21 -0
  45. package/dist/codegen/version-bump.d.ts.map +1 -0
  46. package/dist/components/auto-release.d.ts +93 -0
  47. package/dist/components/auto-release.d.ts.map +1 -0
  48. package/dist/components/builders.d.ts +37 -0
  49. package/dist/components/builders.d.ts.map +1 -0
  50. package/dist/components/capability-plugin-loader.d.ts +111 -0
  51. package/dist/components/capability-plugin-loader.d.ts.map +1 -0
  52. package/dist/components/capability-plugin-schema.d.ts +24 -0
  53. package/dist/components/capability-plugin-schema.d.ts.map +1 -0
  54. package/dist/components/capability-plugin.d.ts +85 -0
  55. package/dist/components/capability-plugin.d.ts.map +1 -0
  56. package/dist/components/capability.d.ts +89 -0
  57. package/dist/components/capability.d.ts.map +1 -0
  58. package/dist/components/cli-support.d.ts +204 -0
  59. package/dist/components/cli-support.d.ts.map +1 -0
  60. package/dist/components/component.d.ts +179 -0
  61. package/dist/components/component.d.ts.map +1 -0
  62. package/dist/components/config-defaults.d.ts +41 -0
  63. package/dist/components/config-defaults.d.ts.map +1 -0
  64. package/dist/components/discover.d.ts +60 -0
  65. package/dist/components/discover.d.ts.map +1 -0
  66. package/dist/components/driver-output.d.ts +20 -0
  67. package/dist/components/driver-output.d.ts.map +1 -0
  68. package/dist/components/driver.d.ts +209 -0
  69. package/dist/components/driver.d.ts.map +1 -0
  70. package/dist/components/index.d.ts +22 -0
  71. package/dist/components/index.d.ts.map +1 -0
  72. package/dist/components/manifest-persistence.d.ts +79 -0
  73. package/dist/components/manifest-persistence.d.ts.map +1 -0
  74. package/dist/components/pilots/alb-ecs.pilot.d.ts +27 -0
  75. package/dist/components/pilots/alb-ecs.pilot.d.ts.map +1 -0
  76. package/dist/components/pilots/dynamodb.pilot.d.ts +22 -0
  77. package/dist/components/pilots/dynamodb.pilot.d.ts.map +1 -0
  78. package/dist/components/pilots/jar-emr.pilot.d.ts +37 -0
  79. package/dist/components/pilots/jar-emr.pilot.d.ts.map +1 -0
  80. package/dist/components/pilots/lambda.pilot.d.ts +35 -0
  81. package/dist/components/pilots/lambda.pilot.d.ts.map +1 -0
  82. package/dist/components/pilots/neo4j-fanout.pilot.d.ts +17 -0
  83. package/dist/components/pilots/neo4j-fanout.pilot.d.ts.map +1 -0
  84. package/dist/components/pilots/project.d.ts +13 -0
  85. package/dist/components/pilots/project.d.ts.map +1 -0
  86. package/dist/components/presets/ecs-fargate.d.ts +59 -0
  87. package/dist/components/presets/ecs-fargate.d.ts.map +1 -0
  88. package/dist/components/presets/index.d.ts +29 -0
  89. package/dist/components/presets/index.d.ts.map +1 -0
  90. package/dist/components/presets/lambda.d.ts +35 -0
  91. package/dist/components/presets/lambda.d.ts.map +1 -0
  92. package/dist/components/presets/single-host-compose.d.ts +43 -0
  93. package/dist/components/presets/single-host-compose.d.ts.map +1 -0
  94. package/dist/components/registry.d.ts +29 -0
  95. package/dist/components/registry.d.ts.map +1 -0
  96. package/dist/components/starter-plugin.d.ts +51 -0
  97. package/dist/components/starter-plugin.d.ts.map +1 -0
  98. package/dist/components/temporal-codegen-loader.d.ts +27 -0
  99. package/dist/components/temporal-codegen-loader.d.ts.map +1 -0
  100. package/dist/components/verbs/__tests__/mock-cloud-executor.d.ts +35 -0
  101. package/dist/components/verbs/__tests__/mock-cloud-executor.d.ts.map +1 -0
  102. package/dist/components/verbs/__tests__/mock-process-runner.d.ts +45 -0
  103. package/dist/components/verbs/__tests__/mock-process-runner.d.ts.map +1 -0
  104. package/dist/components/verbs/__tests__/mock-sbom-generator.d.ts +33 -0
  105. package/dist/components/verbs/__tests__/mock-sbom-generator.d.ts.map +1 -0
  106. package/dist/components/verbs/bom-writer.d.ts +155 -0
  107. package/dist/components/verbs/bom-writer.d.ts.map +1 -0
  108. package/dist/components/verbs/build-archive.d.ts +205 -0
  109. package/dist/components/verbs/build-archive.d.ts.map +1 -0
  110. package/dist/components/verbs/build.d.ts +150 -0
  111. package/dist/components/verbs/build.d.ts.map +1 -0
  112. package/dist/components/verbs/cloud-executor.d.ts +88 -0
  113. package/dist/components/verbs/cloud-executor.d.ts.map +1 -0
  114. package/dist/components/verbs/component-bom.d.ts +103 -0
  115. package/dist/components/verbs/component-bom.d.ts.map +1 -0
  116. package/dist/components/verbs/index.d.ts +49 -0
  117. package/dist/components/verbs/index.d.ts.map +1 -0
  118. package/dist/components/verbs/license-policy.d.ts +56 -0
  119. package/dist/components/verbs/license-policy.d.ts.map +1 -0
  120. package/dist/components/verbs/lockfile-sbom-generator.d.ts +81 -0
  121. package/dist/components/verbs/lockfile-sbom-generator.d.ts.map +1 -0
  122. package/dist/components/verbs/process-runner.d.ts +64 -0
  123. package/dist/components/verbs/process-runner.d.ts.map +1 -0
  124. package/dist/components/verbs/reproducibility.d.ts +80 -0
  125. package/dist/components/verbs/reproducibility.d.ts.map +1 -0
  126. package/dist/components/verbs/sbom-generator.d.ts +157 -0
  127. package/dist/components/verbs/sbom-generator.d.ts.map +1 -0
  128. package/dist/components/verbs/sbom.d.ts +79 -0
  129. package/dist/components/verbs/sbom.d.ts.map +1 -0
  130. package/dist/components/verbs/shell.d.ts +35 -0
  131. package/dist/components/verbs/shell.d.ts.map +1 -0
  132. package/dist/components/verbs/sign.d.ts +222 -0
  133. package/dist/components/verbs/sign.d.ts.map +1 -0
  134. package/dist/components/verbs/stub.d.ts +18 -0
  135. package/dist/components/verbs/stub.d.ts.map +1 -0
  136. package/dist/components/verbs/tool-sbom-generator.d.ts +51 -0
  137. package/dist/components/verbs/tool-sbom-generator.d.ts.map +1 -0
  138. package/dist/components/verbs/verify.d.ts +106 -0
  139. package/dist/components/verbs/verify.d.ts.map +1 -0
  140. package/dist/components/verbs/vex.d.ts +65 -0
  141. package/dist/components/verbs/vex.d.ts.map +1 -0
  142. package/dist/components/verbs/vuln-gate.d.ts +91 -0
  143. package/dist/components/verbs/vuln-gate.d.ts.map +1 -0
  144. package/dist/components/verbs/vuln-scan.d.ts +116 -0
  145. package/dist/components/verbs/vuln-scan.d.ts.map +1 -0
  146. package/dist/components/verbs/wait-verify.d.ts +85 -0
  147. package/dist/components/verbs/wait-verify.d.ts.map +1 -0
  148. package/dist/config.d.ts +205 -0
  149. package/dist/config.d.ts.map +1 -1
  150. package/dist/index.d.ts +4 -0
  151. package/dist/index.d.ts.map +1 -1
  152. package/dist/lexicon.d.ts +78 -0
  153. package/dist/lexicon.d.ts.map +1 -1
  154. package/dist/lifecycle/build-ledger-store.d.ts +121 -0
  155. package/dist/lifecycle/build-ledger-store.d.ts.map +1 -0
  156. package/dist/lifecycle/build-ledger.d.ts +225 -0
  157. package/dist/lifecycle/build-ledger.d.ts.map +1 -0
  158. package/dist/lifecycle/git.d.ts +84 -0
  159. package/dist/lifecycle/git.d.ts.map +1 -1
  160. package/dist/lifecycle/index.d.ts +5 -0
  161. package/dist/lifecycle/index.d.ts.map +1 -1
  162. package/dist/lifecycle/oras-referrer-lookup.d.ts +41 -0
  163. package/dist/lifecycle/oras-referrer-lookup.d.ts.map +1 -0
  164. package/dist/lifecycle/release-ledger.d.ts +122 -0
  165. package/dist/lifecycle/release-ledger.d.ts.map +1 -0
  166. package/dist/lifecycle/status.d.ts +150 -0
  167. package/dist/lifecycle/status.d.ts.map +1 -0
  168. package/dist/lint/component-checks.d.ts +95 -0
  169. package/dist/lint/component-checks.d.ts.map +1 -0
  170. package/dist/lint/engine.d.ts +23 -0
  171. package/dist/lint/engine.d.ts.map +1 -1
  172. package/dist/lint/presets/strict.json +8 -1
  173. package/dist/lint/rules/__fixtures__/comp/comp000-discovery-error/broken-a.component.d.ts +4 -0
  174. package/dist/lint/rules/__fixtures__/comp/comp000-discovery-error/broken-a.component.d.ts.map +1 -0
  175. package/dist/lint/rules/__fixtures__/comp/comp000-discovery-error/broken-b.component.d.ts +4 -0
  176. package/dist/lint/rules/__fixtures__/comp/comp000-discovery-error/broken-b.component.d.ts.map +1 -0
  177. package/dist/lint/rules/__fixtures__/comp/comp001/fail/orphan-lib.component.d.ts +4 -0
  178. package/dist/lint/rules/__fixtures__/comp/comp001/fail/orphan-lib.component.d.ts.map +1 -0
  179. package/dist/lint/rules/__fixtures__/comp/comp001/pass/emr-job.component.d.ts +4 -0
  180. package/dist/lint/rules/__fixtures__/comp/comp001/pass/emr-job.component.d.ts.map +1 -0
  181. package/dist/lint/rules/__fixtures__/comp/comp001/pass/jar-lib.component.d.ts +4 -0
  182. package/dist/lint/rules/__fixtures__/comp/comp001/pass/jar-lib.component.d.ts.map +1 -0
  183. package/dist/lint/rules/__fixtures__/comp/comp002/fail/search-service.component.d.ts +10 -0
  184. package/dist/lint/rules/__fixtures__/comp/comp002/fail/search-service.component.d.ts.map +1 -0
  185. package/dist/lint/rules/__fixtures__/comp/comp002/pass/jar-lib.component.d.ts +3 -0
  186. package/dist/lint/rules/__fixtures__/comp/comp002/pass/jar-lib.component.d.ts.map +1 -0
  187. package/dist/lint/rules/__fixtures__/comp/comp002/pass/search-service.component.d.ts +4 -0
  188. package/dist/lint/rules/__fixtures__/comp/comp002/pass/search-service.component.d.ts.map +1 -0
  189. package/dist/lint/rules/__fixtures__/comp/comp003/fail/migrator.component.d.ts +4 -0
  190. package/dist/lint/rules/__fixtures__/comp/comp003/fail/migrator.component.d.ts.map +1 -0
  191. package/dist/lint/rules/__fixtures__/comp/comp003/pass/migrator.component.d.ts +4 -0
  192. package/dist/lint/rules/__fixtures__/comp/comp003/pass/migrator.component.d.ts.map +1 -0
  193. package/dist/lint/rules/__fixtures__/comp/comp003/pass/orders-table.component.d.ts +4 -0
  194. package/dist/lint/rules/__fixtures__/comp/comp003/pass/orders-table.component.d.ts.map +1 -0
  195. package/dist/lint/rules/__fixtures__/comp/comp004/fail/neo4j-cluster.component.d.ts +4 -0
  196. package/dist/lint/rules/__fixtures__/comp/comp004/fail/neo4j-cluster.component.d.ts.map +1 -0
  197. package/dist/lint/rules/__fixtures__/comp/comp004/pass/neo4j-cluster.component.d.ts +4 -0
  198. package/dist/lint/rules/__fixtures__/comp/comp004/pass/neo4j-cluster.component.d.ts.map +1 -0
  199. package/dist/lint/rules/__fixtures__/comp/comp004/pass/orders-table.component.d.ts +4 -0
  200. package/dist/lint/rules/__fixtures__/comp/comp004/pass/orders-table.component.d.ts.map +1 -0
  201. package/dist/lint/rules/__fixtures__/comp/comp005/fail/search-service.component.d.ts +4 -0
  202. package/dist/lint/rules/__fixtures__/comp/comp005/fail/search-service.component.d.ts.map +1 -0
  203. package/dist/lint/rules/__fixtures__/comp/comp005/pass/search-service.component.d.ts +4 -0
  204. package/dist/lint/rules/__fixtures__/comp/comp005/pass/search-service.component.d.ts.map +1 -0
  205. package/dist/lint/rules/__fixtures__/comp/comp006/fail/legacy-tool.component.d.ts +4 -0
  206. package/dist/lint/rules/__fixtures__/comp/comp006/fail/legacy-tool.component.d.ts.map +1 -0
  207. package/dist/lint/rules/__fixtures__/comp/comp006/pass/legacy-tool.component.d.ts +4 -0
  208. package/dist/lint/rules/__fixtures__/comp/comp006/pass/legacy-tool.component.d.ts.map +1 -0
  209. package/dist/lint/rules/__fixtures__/comp/comp007/fail/inventory-table.component.d.ts +4 -0
  210. package/dist/lint/rules/__fixtures__/comp/comp007/fail/inventory-table.component.d.ts.map +1 -0
  211. package/dist/lint/rules/__fixtures__/comp/comp007/fail/orders-table.component.d.ts +4 -0
  212. package/dist/lint/rules/__fixtures__/comp/comp007/fail/orders-table.component.d.ts.map +1 -0
  213. package/dist/lint/rules/__fixtures__/comp/comp007/pass/orders-table.component.d.ts +3 -0
  214. package/dist/lint/rules/__fixtures__/comp/comp007/pass/orders-table.component.d.ts.map +1 -0
  215. package/dist/lint/rules/__fixtures__/comp/comp007/pass/search-service.component.d.ts +4 -0
  216. package/dist/lint/rules/__fixtures__/comp/comp007/pass/search-service.component.d.ts.map +1 -0
  217. package/dist/lint/rules/comp/comp001-publishes-never-applies.d.ts +20 -0
  218. package/dist/lint/rules/comp/comp001-publishes-never-applies.d.ts.map +1 -0
  219. package/dist/lint/rules/comp/comp002-dangling-wiring-ref.d.ts +28 -0
  220. package/dist/lint/rules/comp/comp002-dangling-wiring-ref.d.ts.map +1 -0
  221. package/dist/lint/rules/comp/comp003-mutating-no-rollback.d.ts +39 -0
  222. package/dist/lint/rules/comp/comp003-mutating-no-rollback.d.ts.map +1 -0
  223. package/dist/lint/rules/comp/comp004-gate-needs-temporal.d.ts +37 -0
  224. package/dist/lint/rules/comp/comp004-gate-needs-temporal.d.ts.map +1 -0
  225. package/dist/lint/rules/comp/comp005-capability-kind-is-noun.d.ts +43 -0
  226. package/dist/lint/rules/comp/comp005-capability-kind-is-noun.d.ts.map +1 -0
  227. package/dist/lint/rules/comp/comp006-shell-needs-reason.d.ts +22 -0
  228. package/dist/lint/rules/comp/comp006-shell-needs-reason.d.ts.map +1 -0
  229. package/dist/lint/rules/comp/comp007-composition-sprawl.d.ts +33 -0
  230. package/dist/lint/rules/comp/comp007-composition-sprawl.d.ts.map +1 -0
  231. package/dist/lint/rules/comp/index.d.ts +18 -0
  232. package/dist/lint/rules/comp/index.d.ts.map +1 -0
  233. package/dist/lint/rules/comp/support.d.ts +71 -0
  234. package/dist/lint/rules/comp/support.d.ts.map +1 -0
  235. package/dist/lsp/lexicon-providers.d.ts.map +1 -1
  236. package/dist/op/activity-registry.d.ts +11 -6
  237. package/dist/op/activity-registry.d.ts.map +1 -1
  238. package/dist/op/activity-runtime.d.ts +24 -0
  239. package/dist/op/activity-runtime.d.ts.map +1 -0
  240. package/dist/op/builders.d.ts +56 -0
  241. package/dist/op/builders.d.ts.map +1 -1
  242. package/dist/op/index.d.ts +2 -1
  243. package/dist/op/index.d.ts.map +1 -1
  244. package/dist/ownership.d.ts +20 -14
  245. package/dist/ownership.d.ts.map +1 -1
  246. package/package.json +14 -1
  247. package/src/audit/catalog.test.ts +74 -22
  248. package/src/audit/catalog.ts +74 -471
  249. package/src/audit/fetch.test.ts +112 -8
  250. package/src/audit/fetch.ts +53 -8
  251. package/src/audit/proof.ts +4 -2
  252. package/src/audit/report-html.test.ts +14 -7
  253. package/src/audit/report-model.ts +20 -9
  254. package/src/audit/report.test.ts +36 -13
  255. package/src/audit/report.ts +2 -0
  256. package/src/audit/rules-doc.test.ts +8 -6
  257. package/src/audit/rules-doc.ts +13 -5
  258. package/src/cli/commands/audit.ts +23 -18
  259. package/src/cli/commands/component-lint.test.ts +158 -0
  260. package/src/cli/commands/doctor.test.ts +116 -2
  261. package/src/cli/commands/doctor.ts +46 -0
  262. package/src/cli/commands/lexicon-rolling-upgrade.ts +198 -0
  263. package/src/cli/commands/lexicon-surface-diff.test.ts +104 -0
  264. package/src/cli/commands/lexicon-surface-diff.ts +185 -0
  265. package/src/cli/commands/lint.ts +142 -1
  266. package/src/cli/commands/pinned-upgrade.ts +204 -0
  267. package/src/cli/handlers/build.ts +58 -1
  268. package/src/cli/handlers/components.test.ts +504 -0
  269. package/src/cli/handlers/components.ts +404 -0
  270. package/src/cli/handlers/dev.ts +60 -1
  271. package/src/cli/handlers/graph.ts +47 -2
  272. package/src/cli/handlers/misc.ts +45 -1
  273. package/src/cli/handlers/run.test.ts +967 -3
  274. package/src/cli/handlers/run.ts +618 -11
  275. package/src/cli/main.test.ts +66 -0
  276. package/src/cli/main.ts +105 -2
  277. package/src/cli/registry.ts +35 -0
  278. package/src/codegen/fetch.test.ts +84 -3
  279. package/src/codegen/fetch.ts +76 -2
  280. package/src/codegen/lexicon-regen.test.ts +298 -0
  281. package/src/codegen/lexicon-regen.ts +545 -0
  282. package/src/codegen/pinned-upgrade.test.ts +399 -0
  283. package/src/codegen/pinned-upgrade.ts +423 -0
  284. package/src/codegen/rolling-upgrade.test.ts +333 -0
  285. package/src/codegen/rolling-upgrade.ts +320 -0
  286. package/src/codegen/surface-snapshot.test.ts +461 -0
  287. package/src/codegen/surface-snapshot.ts +546 -0
  288. package/src/codegen/version-bump.test.ts +47 -0
  289. package/src/codegen/version-bump.ts +39 -0
  290. package/src/components/README.md +130 -0
  291. package/src/components/SPRAWL-VALIDATION.md +181 -0
  292. package/src/components/__fixtures__/alb-ecs-service.json +51 -0
  293. package/src/components/__fixtures__/dynamodb-infra.json +32 -0
  294. package/src/components/__fixtures__/emr-job-consumer.json +26 -0
  295. package/src/components/__fixtures__/jar-lib-producer.json +16 -0
  296. package/src/components/__fixtures__/lambda-image-processor.json +28 -0
  297. package/src/components/__fixtures__/neo4j-fanout.json +34 -0
  298. package/src/components/__fixtures__/single-host-compose.json +29 -0
  299. package/src/components/auto-release.test.ts +217 -0
  300. package/src/components/auto-release.ts +216 -0
  301. package/src/components/builders.test.ts +45 -0
  302. package/src/components/builders.ts +71 -0
  303. package/src/components/capability-plugin-loader.ts +218 -0
  304. package/src/components/capability-plugin-schema.ts +56 -0
  305. package/src/components/capability-plugin.test.ts +235 -0
  306. package/src/components/capability-plugin.ts +108 -0
  307. package/src/components/capability.ts +117 -0
  308. package/src/components/cli-support.test.ts +579 -0
  309. package/src/components/cli-support.ts +481 -0
  310. package/src/components/component-schema.test.ts +265 -0
  311. package/src/components/component.schema.json +235 -0
  312. package/src/components/component.test.ts +251 -0
  313. package/src/components/component.ts +255 -0
  314. package/src/components/config-defaults.test.ts +263 -0
  315. package/src/components/config-defaults.ts +145 -0
  316. package/src/components/discover.test.ts +352 -0
  317. package/src/components/discover.ts +167 -0
  318. package/src/components/driver-output.ts +71 -0
  319. package/src/components/driver.test.ts +638 -0
  320. package/src/components/driver.ts +690 -0
  321. package/src/components/index.ts +113 -0
  322. package/src/components/manifest-persistence.test.ts +152 -0
  323. package/src/components/manifest-persistence.ts +164 -0
  324. package/src/components/pilots/README.md +33 -0
  325. package/src/components/pilots/alb-ecs.pilot.ts +63 -0
  326. package/src/components/pilots/dynamodb.pilot.ts +59 -0
  327. package/src/components/pilots/jar-emr.pilot.ts +69 -0
  328. package/src/components/pilots/lambda.pilot.ts +55 -0
  329. package/src/components/pilots/neo4j-fanout.pilot.ts +92 -0
  330. package/src/components/pilots/pilots-lint-clean.test.ts +78 -0
  331. package/src/components/pilots/pilots.test.ts +126 -0
  332. package/src/components/pilots/project.ts +13 -0
  333. package/src/components/presets/comp007-reduction.test.ts +122 -0
  334. package/src/components/presets/ecs-fargate.test.ts +84 -0
  335. package/src/components/presets/ecs-fargate.ts +103 -0
  336. package/src/components/presets/index.ts +32 -0
  337. package/src/components/presets/lambda.test.ts +35 -0
  338. package/src/components/presets/lambda.ts +53 -0
  339. package/src/components/presets/single-host-compose.test.ts +65 -0
  340. package/src/components/presets/single-host-compose.ts +64 -0
  341. package/src/components/registry.test.ts +112 -0
  342. package/src/components/registry.ts +37 -0
  343. package/src/components/starter-plugin.ts +105 -0
  344. package/src/components/temporal-codegen-loader.ts +41 -0
  345. package/src/components/verbs/__fixtures__/package-lock.json +45 -0
  346. package/src/components/verbs/__fixtures__/pom.xml +37 -0
  347. package/src/components/verbs/__fixtures__/schemas/cyclonedx-1.5.schema.json +3800 -0
  348. package/src/components/verbs/__fixtures__/schemas/cyclonedx-spdx-license.schema.json +621 -0
  349. package/src/components/verbs/__fixtures__/schemas/jsf-0.82.schema.json +240 -0
  350. package/src/components/verbs/__fixtures__/schemas/spdx-2.3.schema.json +740 -0
  351. package/src/components/verbs/__tests__/mock-cloud-executor.ts +102 -0
  352. package/src/components/verbs/__tests__/mock-process-runner.ts +79 -0
  353. package/src/components/verbs/__tests__/mock-sbom-generator.ts +85 -0
  354. package/src/components/verbs/bom-writer.test.ts +331 -0
  355. package/src/components/verbs/bom-writer.ts +386 -0
  356. package/src/components/verbs/build-archive.test.ts +251 -0
  357. package/src/components/verbs/build-archive.ts +296 -0
  358. package/src/components/verbs/build.test.ts +222 -0
  359. package/src/components/verbs/build.ts +252 -0
  360. package/src/components/verbs/cloud-executor.ts +181 -0
  361. package/src/components/verbs/component-bom.test.ts +219 -0
  362. package/src/components/verbs/component-bom.ts +189 -0
  363. package/src/components/verbs/index.ts +49 -0
  364. package/src/components/verbs/license-policy.ts +115 -0
  365. package/src/components/verbs/lockfile-sbom-generator.test.ts +195 -0
  366. package/src/components/verbs/lockfile-sbom-generator.ts +236 -0
  367. package/src/components/verbs/process-runner.test.ts +79 -0
  368. package/src/components/verbs/process-runner.ts +113 -0
  369. package/src/components/verbs/reproducibility.test.ts +24 -0
  370. package/src/components/verbs/reproducibility.ts +100 -0
  371. package/src/components/verbs/sbom-generator.test.ts +96 -0
  372. package/src/components/verbs/sbom-generator.ts +209 -0
  373. package/src/components/verbs/sbom.test.ts +184 -0
  374. package/src/components/verbs/sbom.ts +152 -0
  375. package/src/components/verbs/shell.test.ts +36 -0
  376. package/src/components/verbs/shell.ts +51 -0
  377. package/src/components/verbs/sign.test.ts +210 -0
  378. package/src/components/verbs/sign.ts +350 -0
  379. package/src/components/verbs/stub.ts +34 -0
  380. package/src/components/verbs/tool-sbom-generator.test.ts +194 -0
  381. package/src/components/verbs/tool-sbom-generator.ts +192 -0
  382. package/src/components/verbs/verify.test.ts +159 -0
  383. package/src/components/verbs/verify.ts +179 -0
  384. package/src/components/verbs/vex.ts +182 -0
  385. package/src/components/verbs/vuln-gate.test.ts +201 -0
  386. package/src/components/verbs/vuln-gate.ts +170 -0
  387. package/src/components/verbs/vuln-scan.test.ts +145 -0
  388. package/src/components/verbs/vuln-scan.ts +266 -0
  389. package/src/components/verbs/wait-verify.test.ts +111 -0
  390. package/src/components/verbs/wait-verify.ts +171 -0
  391. package/src/config.test.ts +74 -1
  392. package/src/config.ts +219 -0
  393. package/src/index.ts +32 -0
  394. package/src/lexicon.ts +88 -0
  395. package/src/lifecycle/build-ledger-store.test.ts +217 -0
  396. package/src/lifecycle/build-ledger-store.ts +165 -0
  397. package/src/lifecycle/build-ledger.test.ts +349 -0
  398. package/src/lifecycle/build-ledger.ts +305 -0
  399. package/src/lifecycle/git.test.ts +118 -0
  400. package/src/lifecycle/git.ts +149 -14
  401. package/src/lifecycle/index.ts +5 -0
  402. package/src/lifecycle/oras-referrer-lookup.test.ts +116 -0
  403. package/src/lifecycle/oras-referrer-lookup.ts +110 -0
  404. package/src/lifecycle/release-ledger.test.ts +209 -0
  405. package/src/lifecycle/release-ledger.ts +185 -0
  406. package/src/lifecycle/status.test.ts +330 -0
  407. package/src/lifecycle/status.ts +278 -0
  408. package/src/lint/component-checks.ts +148 -0
  409. package/src/lint/config.test.ts +21 -0
  410. package/src/lint/engine.ts +11 -2
  411. package/src/lint/presets/relaxed.json +8 -1
  412. package/src/lint/presets/strict.json +8 -1
  413. package/src/lint/rules/__fixtures__/comp/comp000-discovery-error/broken-a.component.ts +9 -0
  414. package/src/lint/rules/__fixtures__/comp/comp000-discovery-error/broken-b.component.ts +9 -0
  415. package/src/lint/rules/__fixtures__/comp/comp001/fail/orphan-lib.component.ts +11 -0
  416. package/src/lint/rules/__fixtures__/comp/comp001/pass/emr-job.component.ts +13 -0
  417. package/src/lint/rules/__fixtures__/comp/comp001/pass/jar-lib.component.ts +11 -0
  418. package/src/lint/rules/__fixtures__/comp/comp002/fail/search-service.component.ts +27 -0
  419. package/src/lint/rules/__fixtures__/comp/comp002/pass/jar-lib.component.ts +10 -0
  420. package/src/lint/rules/__fixtures__/comp/comp002/pass/search-service.component.ts +23 -0
  421. package/src/lint/rules/__fixtures__/comp/comp003/fail/migrator.component.ts +10 -0
  422. package/src/lint/rules/__fixtures__/comp/comp003/pass/migrator.component.ts +19 -0
  423. package/src/lint/rules/__fixtures__/comp/comp003/pass/orders-table.component.ts +10 -0
  424. package/src/lint/rules/__fixtures__/comp/comp004/fail/neo4j-cluster.component.ts +20 -0
  425. package/src/lint/rules/__fixtures__/comp/comp004/pass/neo4j-cluster.component.ts +23 -0
  426. package/src/lint/rules/__fixtures__/comp/comp004/pass/orders-table.component.ts +10 -0
  427. package/src/lint/rules/__fixtures__/comp/comp005/fail/search-service.component.ts +14 -0
  428. package/src/lint/rules/__fixtures__/comp/comp005/pass/search-service.component.ts +18 -0
  429. package/src/lint/rules/__fixtures__/comp/comp006/fail/legacy-tool.component.ts +10 -0
  430. package/src/lint/rules/__fixtures__/comp/comp006/pass/legacy-tool.component.ts +14 -0
  431. package/src/lint/rules/__fixtures__/comp/comp007/fail/inventory-table.component.ts +13 -0
  432. package/src/lint/rules/__fixtures__/comp/comp007/fail/orders-table.component.ts +13 -0
  433. package/src/lint/rules/__fixtures__/comp/comp007/pass/orders-table.component.ts +12 -0
  434. package/src/lint/rules/__fixtures__/comp/comp007/pass/search-service.component.ts +18 -0
  435. package/src/lint/rules/comp/comp.test.ts +378 -0
  436. package/src/lint/rules/comp/comp001-publishes-never-applies.ts +78 -0
  437. package/src/lint/rules/comp/comp002-dangling-wiring-ref.ts +94 -0
  438. package/src/lint/rules/comp/comp003-mutating-no-rollback.ts +115 -0
  439. package/src/lint/rules/comp/comp004-gate-needs-temporal.ts +66 -0
  440. package/src/lint/rules/comp/comp005-capability-kind-is-noun.ts +113 -0
  441. package/src/lint/rules/comp/comp006-shell-needs-reason.ts +55 -0
  442. package/src/lint/rules/comp/comp007-composition-sprawl.ts +71 -0
  443. package/src/lint/rules/comp/index.ts +37 -0
  444. package/src/lint/rules/comp/support.ts +173 -0
  445. package/src/lsp/lexicon-providers.test.ts +55 -0
  446. package/src/lsp/lexicon-providers.ts +13 -3
  447. package/src/op/activity-registry.test.ts +38 -0
  448. package/src/op/activity-registry.ts +31 -12
  449. package/src/op/activity-runtime.ts +73 -0
  450. package/src/op/builders.ts +92 -0
  451. package/src/op/index.ts +3 -1
  452. package/src/ownership.test.ts +24 -26
  453. package/src/ownership.ts +26 -38
@@ -0,0 +1,481 @@
1
+ /**
2
+ * CLI-facing helpers over component discovery (#560, epic #551) — kept
3
+ * separate from ../cli/commands/{list,describe}.ts and
4
+ * ../cli/handlers/graph.ts so those files stay thin dispatchers and the
5
+ * component-specific report shaping lives alongside the rest of the
6
+ * component subsystem, the same way ../op/discover.ts's results are shaped
7
+ * inline by its own CLI callers rather than a `cli` folder inside `op/`.
8
+ *
9
+ * Surfaces components in the three places the issue asks for:
10
+ * - `chant list --components` — inventory (mirrors `ListEntity`/`listCommand`).
11
+ * - `chant describe <name> --components` — one component's full JSON contract
12
+ * projection (mirrors `describeCommand`'s effective-config view).
13
+ * - `chant graph --components` — dependency order/waves from `dependsOn`
14
+ * (mirrors `computeStackGraph`/`runStackGraph`, but reuses
15
+ * `resolveComponentGraph` from ../driver.ts since a component's `dependsOn`
16
+ * is already a flat name list — no AttrRef-style inference needed).
17
+ * - `chant build --components --generate gitlab` — generate mode (#563):
18
+ * synthesize CI YAML from the same discovered declarations instead of
19
+ * running them, via `generateGitlabPipeline` (../generate-gitlab.ts).
20
+ * - `chant run --components <name|all>` — interpret mode (#585): dispatch
21
+ * discovered component(s) through the interpret `driver.ts` on the local
22
+ * executor, the CLI entrypoint the driver (#556) never had.
23
+ */
24
+
25
+ import { discoverComponents } from "./discover";
26
+ import { projectToJson, type Archetype } from "./component";
27
+ import {
28
+ resolveComponentGraph,
29
+ runInterpretDriver,
30
+ runComponentDeploy,
31
+ UnknownDependencyError,
32
+ DependencyCycleError,
33
+ DriverGateUnsupportedError,
34
+ DriverRunFailure,
35
+ type DriverComponent,
36
+ type DriverPhase,
37
+ type DriverRunResult,
38
+ } from "./driver";
39
+ import { isLexiconPlugin, type LexiconPlugin, type ComponentPipelineOptions } from "../lexicon";
40
+ import { buildCapabilityRegistry } from "./capability-plugin-loader";
41
+ import type { CapabilityRegistry } from "./capability";
42
+ import { applyConfigDefaults } from "./config-defaults";
43
+ import { loadChantConfig, type ChantConfig } from "../config";
44
+
45
+ /** One component in `chant list --components` output. */
46
+ export interface ListedComponent {
47
+ name: string;
48
+ archetype: Archetype;
49
+ dependsOn: string[];
50
+ hasBuild: boolean;
51
+ phases: string[];
52
+ filePath: string;
53
+ }
54
+
55
+ export interface ListComponentsResult {
56
+ success: boolean;
57
+ components: ListedComponent[];
58
+ errors: string[];
59
+ }
60
+
61
+ /** Discover components under `path` and shape them for `chant list --components`. */
62
+ export async function listComponents(path: string): Promise<ListComponentsResult> {
63
+ const result = await discoverComponents(path);
64
+ if (result.errors.length > 0) {
65
+ return { success: false, components: [], errors: result.errors.map((e) => e.message) };
66
+ }
67
+
68
+ const components: ListedComponent[] = [...result.components.values()]
69
+ .map(({ component, filePath }) => {
70
+ const projected = projectToJson(component) as { archetype: Archetype };
71
+ return {
72
+ name: component.name,
73
+ archetype: projected.archetype,
74
+ dependsOn: component.dependsOn,
75
+ hasBuild: component.build !== undefined,
76
+ phases: component.deploy.map((p) => p.phase),
77
+ filePath,
78
+ };
79
+ })
80
+ .sort((a, b) => a.name.localeCompare(b.name));
81
+
82
+ return { success: true, components, errors: [] };
83
+ }
84
+
85
+ /** One component's full JSON contract projection, for `chant describe <name> --components`. */
86
+ export interface DescribedComponent {
87
+ name: string;
88
+ filePath: string;
89
+ /** The component's JSON contract projection (validates against component.schema.json). */
90
+ json: unknown;
91
+ }
92
+
93
+ export interface DescribeComponentResult {
94
+ success: boolean;
95
+ component: string;
96
+ described?: DescribedComponent;
97
+ output: string;
98
+ }
99
+
100
+ /** Find and project one named component, for `chant describe <name> --components`. */
101
+ export async function describeComponent(path: string, name: string): Promise<DescribeComponentResult> {
102
+ const result = await discoverComponents(path);
103
+ if (result.errors.length > 0) {
104
+ return { success: false, component: name, output: result.errors.map((e) => e.message).join("\n") };
105
+ }
106
+
107
+ const found = result.components.get(name);
108
+ if (!found) {
109
+ const known = [...result.components.keys()].sort().join(", ");
110
+ return {
111
+ success: false,
112
+ component: name,
113
+ output: `No component "${name}" found.\nKnown components: ${known || "(none)"}`,
114
+ };
115
+ }
116
+
117
+ const json = projectToJson(found.component);
118
+ return {
119
+ success: true,
120
+ component: name,
121
+ described: { name, filePath: found.filePath, json },
122
+ output: "",
123
+ };
124
+ }
125
+
126
+ /** Dependency order/waves for `chant graph --components`, from every discovered component's `dependsOn`. */
127
+ export interface ComponentGraphResult {
128
+ success: boolean;
129
+ order: string[];
130
+ waves: string[][];
131
+ edges: Array<{ from: string; to: string }>;
132
+ error?: string;
133
+ }
134
+
135
+ /** Compute the components' dependency graph under `path`, for `chant graph --components`. */
136
+ export async function computeComponentGraph(path: string): Promise<ComponentGraphResult> {
137
+ const result = await discoverComponents(path);
138
+ if (result.errors.length > 0) {
139
+ return { success: false, order: [], waves: [], edges: [], error: result.errors.map((e) => e.message).join("\n") };
140
+ }
141
+
142
+ const driverComponents: DriverComponent[] = [...result.components.values()].map(({ component }) => ({
143
+ name: component.name,
144
+ dependsOn: component.dependsOn,
145
+ deploy: component.deploy,
146
+ }));
147
+
148
+ try {
149
+ const { order, waves } = resolveComponentGraph(driverComponents);
150
+ const edges: Array<{ from: string; to: string }> = [];
151
+ for (const c of driverComponents) {
152
+ for (const dep of c.dependsOn ?? []) edges.push({ from: c.name, to: dep });
153
+ }
154
+ return { success: true, order, waves, edges };
155
+ } catch (err) {
156
+ if (err instanceof UnknownDependencyError || err instanceof DependencyCycleError) {
157
+ return { success: false, order: [], waves: [], edges: [], error: err.message };
158
+ }
159
+ throw err;
160
+ }
161
+ }
162
+
163
+ /** A generate-mode target lexicon name — any lexicon whose plugin implements `generateComponentPipeline` (currently gitlab; github/forgejo as they add it). */
164
+ export type GenerateLexicon = string;
165
+
166
+ /** Result of `chant build --components --generate <lexicon>`. */
167
+ export interface GenerateComponentsResult {
168
+ success: boolean;
169
+ /** The synthesized CI YAML, when `success` is true. */
170
+ yaml?: string;
171
+ /** Wave-ordered stage names (one entry per wave). */
172
+ stages?: string[];
173
+ /** Every generated job, for a machine-readable view (`--format json`). */
174
+ jobs?: Array<{ jobName: string; component: string; stage: string; needs: string[] }>;
175
+ error?: string;
176
+ }
177
+
178
+ /**
179
+ * Load a lexicon's plugin (`@intentius/chant-lexicon-<name>`) to reach its
180
+ * `generateComponentPipeline`. Tolerant: returns null when the package can't be
181
+ * resolved. Mirrors the lexicon-borne loading the capability + upstream-pin
182
+ * seams use, kept here so `components` doesn't depend on the `cli` plugin loader.
183
+ */
184
+ async function loadLexiconPlugin(name: string): Promise<LexiconPlugin | null> {
185
+ let mod: Record<string, unknown>;
186
+ try {
187
+ mod = (await import(`@intentius/chant-lexicon-${name}`)) as Record<string, unknown>;
188
+ } catch {
189
+ return null;
190
+ }
191
+ for (const value of Object.values(mod)) {
192
+ if (isLexiconPlugin(value)) return value;
193
+ }
194
+ return null;
195
+ }
196
+
197
+ /**
198
+ * Generate mode (#563): discover every `Component` under `path` and
199
+ * synthesize a thin CI pipeline for `lexicon` that triggers each component's
200
+ * own composition in dependency order/waves — the same `resolveComponentGraph`
201
+ * order `chant graph --components`/the interpret driver use. No deploy logic
202
+ * is inlined into the generated YAML; a cross-cutting change goes through
203
+ * `options`, never per component. The CI-specific synthesis is contributed by
204
+ * the target lexicon's `generateComponentPipeline` (#688); core owns only the
205
+ * generic discovery + graph.
206
+ */
207
+ export async function generateComponentsPipeline(
208
+ path: string,
209
+ lexicon: GenerateLexicon,
210
+ options?: ComponentPipelineOptions,
211
+ ): Promise<GenerateComponentsResult> {
212
+ const plugin = await loadLexiconPlugin(lexicon);
213
+ if (!plugin?.generateComponentPipeline) {
214
+ return {
215
+ success: false,
216
+ error: `Lexicon "${lexicon}" does not support generate mode (no generateComponentPipeline). GitLab is supported today; GitHub/Forgejo as they add it.`,
217
+ };
218
+ }
219
+
220
+ const result = await discoverComponents(path);
221
+ if (result.errors.length > 0) {
222
+ return { success: false, error: result.errors.map((e) => e.message).join("\n") };
223
+ }
224
+
225
+ const driverComponents: DriverComponent[] = [...result.components.values()].map(({ component }) => ({
226
+ name: component.name,
227
+ dependsOn: component.dependsOn,
228
+ deploy: component.deploy,
229
+ }));
230
+
231
+ try {
232
+ const { yaml, stages, jobs } = plugin.generateComponentPipeline(driverComponents, options);
233
+ return { success: true, yaml, stages, jobs };
234
+ } catch (err) {
235
+ if (err instanceof UnknownDependencyError || err instanceof DependencyCycleError) {
236
+ return { success: false, error: err.message };
237
+ }
238
+ throw err;
239
+ }
240
+ }
241
+
242
+ // ── Interpret mode: `chant run --components <name|all>` (#585) ──────────────
243
+
244
+ /** Convert a discovered `Component` to the driver's leaner `DriverComponent` shape (name/dependsOn/deploy/rollback — the only fields the driver reads). */
245
+ function toDriverComponent(component: { name: string; dependsOn: string[]; deploy: DriverPhase[]; rollback?: DriverPhase[] }): DriverComponent {
246
+ return {
247
+ name: component.name,
248
+ dependsOn: component.dependsOn,
249
+ deploy: component.deploy,
250
+ ...(component.rollback ? { rollback: component.rollback } : {}),
251
+ };
252
+ }
253
+
254
+ /**
255
+ * Find the first `gate` step anywhere in a component's `deploy`/`rollback`
256
+ * composition (including nested fan-out phases), mirroring
257
+ * `../op/local-executor.ts`'s `findGate`. Used as a pre-flight check so
258
+ * `chant run --components` fails before any step runs — matching
259
+ * `runOpLocal`'s behavior for Ops — rather than only failing mid-run when the
260
+ * driver itself reaches the gated phase (`DriverGateUnsupportedError`).
261
+ */
262
+ export function findComponentGate(component: DriverComponent): { signalName: string } | undefined {
263
+ const search = (phases: DriverPhase[] | undefined): { signalName: string } | undefined => {
264
+ for (const phaseDef of phases ?? []) {
265
+ for (const entry of phaseDef.steps) {
266
+ if ((entry as { kind?: unknown }).kind === "gate") {
267
+ return entry as unknown as { signalName: string };
268
+ }
269
+ if (typeof (entry as DriverPhase).phase === "string" && Array.isArray((entry as DriverPhase).steps)) {
270
+ const nested = search([entry as DriverPhase]);
271
+ if (nested) return nested;
272
+ }
273
+ }
274
+ const fromOnFailure = search(phaseDef.onFailure);
275
+ if (fromOnFailure) return fromOnFailure;
276
+ }
277
+ return undefined;
278
+ };
279
+ return search(component.deploy) ?? search(component.rollback);
280
+ }
281
+
282
+ /** Options for `runComponents` (backs `chant run --components <name|all> [--env <env>]`). */
283
+ export interface RunComponentsOptions {
284
+ /** Target environment name, threaded into every capability's `DeployContext.env` (default: "local"). */
285
+ env?: string;
286
+ /** Additional capability plugin package names to load on top of the built-in starter set (see `buildCapabilityRegistry`). */
287
+ capabilityPlugins?: string[];
288
+ /**
289
+ * Pre-built registry to dispatch through, bypassing `buildCapabilityRegistry`
290
+ * entirely. Real callers (the CLI handler) should leave this unset; it exists
291
+ * so tests can inject a registry wired to a `MockCloudExecutor` (mirroring
292
+ * `../components/pilots/pilots-e2e.test.ts`'s `buildRegistry`) instead of the
293
+ * default starter set, whose non-pilot verbs are still typed stubs that throw
294
+ * `CapabilityNotImplementedError` (see `./verbs/stub.ts`).
295
+ */
296
+ registry?: CapabilityRegistry;
297
+ /**
298
+ * Pre-loaded project config to resolve `sbom`/`signing`/`vulnPolicy`
299
+ * defaults from (#629), bypassing `loadChantConfig` entirely. Real callers
300
+ * (the CLI handler) should leave this unset — `runComponents` loads
301
+ * `chant.config.ts`/`chant.config.json` from `path` itself; this exists so
302
+ * tests can inject a config object directly, the same escape hatch
303
+ * `registry` above provides for the capability registry.
304
+ */
305
+ config?: ChantConfig;
306
+ /**
307
+ * Cross-component/cross-stack outputs to seed the run with — keyed by
308
+ * component name, the same shape `DriverRunResult.componentOutputs` produces.
309
+ * The CLI populates this from `--seed-outputs` files (an upstream CI job's
310
+ * dumped outputs), so a single-component run in a downstream job can resolve
311
+ * `stackOutput()`/`@<name>.publish.*` references to a component that already
312
+ * ran elsewhere. Merged with, and overridden by, outputs this run produces.
313
+ */
314
+ componentOutputs?: Record<string, Record<string, unknown>>;
315
+ }
316
+
317
+ /** Result of `chant run --components <name|all>`. */
318
+ export interface RunComponentsResult {
319
+ success: boolean;
320
+ /** The driver's run result, when the run reached the driver (even on a failed component). */
321
+ run?: DriverRunResult;
322
+ /** Component names actually dispatched to the driver, in run order. */
323
+ selected: string[];
324
+ error?: string;
325
+ /** Set when a selected component (or one of its `deploy`/`rollback` phases) contains a `gate` the local executor cannot run. */
326
+ gateUnsupported?: { component: string; signalName: string };
327
+ }
328
+
329
+ /**
330
+ * Run one named component, or every discovered component (`selector ===
331
+ * "all"`), through the interpret driver (`../components/driver.ts`) on the
332
+ * local in-process executor — the CLI entrypoint the driver never had (#585,
333
+ * follow-up to #556). Discovers the full component set first, then either:
334
+ * - `selector === "all"`: resolves the whole set's dependency order/waves
335
+ * and dispatches every component through `runInterpretDriver`, matching
336
+ * what the generated orchestrator Op will eventually do — the same
337
+ * order `chant graph --components` reports.
338
+ * - a single name: dispatches just that component via `runComponentDeploy`,
339
+ * without requiring the rest of its `dependsOn` graph to be present in
340
+ * this invocation. This mirrors generate mode's per-job invocation model
341
+ * (`generate-gitlab.ts`) — each CI job triggers exactly one component, and
342
+ * cross-job/cross-wave ordering is the CI DAG's (`needs:`) job, not this
343
+ * command's; requiring the full graph here would make `chant run
344
+ * --components <name>` fail for any component whose `dependsOn` names
345
+ * infra outside the discovered set (e.g. a shared stack, per the
346
+ * `search-service` pilot), which is exactly the common case.
347
+ *
348
+ * Pre-flights every selected component for a `gate` step and fails before any
349
+ * step runs (`gateUnsupported`), matching `runOpLocal`'s pre-flight
350
+ * `findGate` check for Ops — gated components need a durable (Temporal)
351
+ * backend, which is out of scope here (issue #585 scopes Temporal-backed
352
+ * component execution to what already exists for Ops; the epic tracks
353
+ * graduating a gated component to `--temporal` separately).
354
+ */
355
+ /** Result of resolving a `<name|all>` selector against discovered components — shared by the local (`runComponents`) and durable (Temporal codegen, #589) entrypoints. */
356
+ export interface ResolvedComponentTargets {
357
+ success: boolean;
358
+ targets: DriverComponent[];
359
+ error?: string;
360
+ }
361
+
362
+ /**
363
+ * Discover every component under `path` and resolve `selector` (`"all"` or a
364
+ * single component name) to the `DriverComponent`(s) to run, with no gate
365
+ * check and no dispatch — just discovery + selection, factored out of
366
+ * `runComponents` so the durable Temporal entrypoint (`chant run --components
367
+ * <name> --temporal`, #589) can reuse the exact same selection semantics
368
+ * without also inheriting the local executor's pre-flight gate rejection
369
+ * (gates are exactly what the durable path exists to support).
370
+ */
371
+ export async function resolveComponentTargets(path: string, selector: string): Promise<ResolvedComponentTargets> {
372
+ const result = await discoverComponents(path);
373
+ if (result.errors.length > 0) {
374
+ return { success: false, targets: [], error: result.errors.map((e) => e.message).join("\n") };
375
+ }
376
+
377
+ const all = [...result.components.values()].map(({ component }) => toDriverComponent(component));
378
+
379
+ if (selector === "all") {
380
+ return { success: true, targets: all };
381
+ }
382
+
383
+ const found = all.find((c) => c.name === selector);
384
+ if (!found) {
385
+ const known = all.map((c) => c.name).sort().join(", ");
386
+ return {
387
+ success: false,
388
+ targets: [],
389
+ error: `Component "${selector}" not found.${known ? ` Known components: ${known}` : " No components discovered."}`,
390
+ };
391
+ }
392
+ return { success: true, targets: [found] };
393
+ }
394
+
395
+ export async function runComponents(
396
+ path: string,
397
+ selector: string,
398
+ options: RunComponentsOptions = {},
399
+ ): Promise<RunComponentsResult> {
400
+ const resolved = await resolveComponentTargets(path, selector);
401
+ if (!resolved.success) {
402
+ return { success: false, selected: [], error: resolved.error };
403
+ }
404
+ const targets = resolved.targets;
405
+
406
+ for (const component of targets) {
407
+ const gate = findComponentGate(component);
408
+ if (gate) {
409
+ return {
410
+ success: false,
411
+ selected: targets.map((c) => c.name),
412
+ gateUnsupported: { component: component.name, signalName: gate.signalName },
413
+ };
414
+ }
415
+ }
416
+
417
+ // (#629) Resolve `chant.config.ts`'s `sbom`/`signing`/`vulnPolicy` sections
418
+ // and fill their defaults into every recognized step (`generate-sbom`,
419
+ // `sign`/`attest-provenance`, `verify`, `vuln-gate`) that didn't already
420
+ // specify the value itself, BEFORE dispatching to the driver — the driver
421
+ // itself stays capability-agnostic and never reads project config (see
422
+ // ./config-defaults.ts's module doc). Loaded up front here (rather than just
423
+ // before `applyConfigDefaults`) so the same config drives which capability
424
+ // plugins the registry loads: a component's cloud leaves (e.g. `cfn-deploy`)
425
+ // are contributed by the project's active lexicons (`config.lexicons`), not
426
+ // baked into core — see ./capability-plugin-loader.ts.
427
+ const { config } = options.config ? { config: options.config } : await loadChantConfig(path);
428
+ const registry: CapabilityRegistry =
429
+ options.registry ??
430
+ (await buildCapabilityRegistry({
431
+ plugins: options.capabilityPlugins ?? config.capabilities,
432
+ lexicons: config.lexicons,
433
+ }));
434
+ const env = options.env ?? "local";
435
+ const selected = targets.map((c) => c.name);
436
+ const resolvedTargets = targets.map((component) => applyConfigDefaults(component, config));
437
+ // Cross-component/cross-stack outputs to resolve references against. Seeded
438
+ // from a caller (a downstream CI job passing an upstream job's dumped
439
+ // outputs via `--seed-outputs`); grows as this run's components complete.
440
+ const seedOutputs = options.componentOutputs ?? {};
441
+
442
+ try {
443
+ if (selector === "all") {
444
+ const run = await runInterpretDriver(resolvedTargets, registry, { env, componentOutputs: seedOutputs });
445
+ return { success: true, run, selected };
446
+ }
447
+
448
+ // Single-component invocation: run just this component, bypassing
449
+ // whole-graph `dependsOn` resolution (see docstring above). The seeded
450
+ // outputs stand in for the dependency components that ran in earlier jobs,
451
+ // so a single-component run still resolves their `stackOutput()`/publish
452
+ // references. `runComponentDeploy` mutates this map with this component's
453
+ // own outputs, which `run.componentOutputs` then exposes for `--dump-outputs`.
454
+ const componentOutputs = { ...seedOutputs };
455
+ const componentResult = await runComponentDeploy(resolvedTargets[0], { env, component: resolvedTargets[0].name }, registry, componentOutputs);
456
+ const run: DriverRunResult = {
457
+ order: selected,
458
+ waves: [selected],
459
+ results: [componentResult],
460
+ ok: componentResult.ok,
461
+ failedComponent: componentResult.ok ? undefined : componentResult.component,
462
+ componentOutputs,
463
+ };
464
+ return { success: componentResult.ok, run, selected };
465
+ } catch (err) {
466
+ if (err instanceof DriverRunFailure) {
467
+ return { success: false, run: err.result, selected, error: err.message };
468
+ }
469
+ if (err instanceof DriverGateUnsupportedError) {
470
+ return {
471
+ success: false,
472
+ selected,
473
+ gateUnsupported: { component: err.component, signalName: err.signalName },
474
+ };
475
+ }
476
+ if (err instanceof UnknownDependencyError || err instanceof DependencyCycleError) {
477
+ return { success: false, selected, error: err.message };
478
+ }
479
+ throw err;
480
+ }
481
+ }