@intentius/chant 0.13.1 → 0.15.1

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 (450) 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/proof.d.ts +3 -0
  4. package/dist/audit/proof.d.ts.map +1 -1
  5. package/dist/audit/report-model.d.ts +4 -1
  6. package/dist/audit/report-model.d.ts.map +1 -1
  7. package/dist/audit/report.d.ts +3 -0
  8. package/dist/audit/report.d.ts.map +1 -1
  9. package/dist/audit/rules-doc.d.ts +8 -2
  10. package/dist/audit/rules-doc.d.ts.map +1 -1
  11. package/dist/cli/commands/audit.d.ts.map +1 -1
  12. package/dist/cli/commands/doctor.d.ts.map +1 -1
  13. package/dist/cli/commands/lexicon-rolling-upgrade.d.ts +37 -0
  14. package/dist/cli/commands/lexicon-rolling-upgrade.d.ts.map +1 -0
  15. package/dist/cli/commands/lexicon-surface-diff.d.ts +48 -0
  16. package/dist/cli/commands/lexicon-surface-diff.d.ts.map +1 -0
  17. package/dist/cli/commands/lint.d.ts.map +1 -1
  18. package/dist/cli/commands/pinned-upgrade.d.ts +41 -0
  19. package/dist/cli/commands/pinned-upgrade.d.ts.map +1 -0
  20. package/dist/cli/handlers/build.d.ts.map +1 -1
  21. package/dist/cli/handlers/components.d.ts +39 -0
  22. package/dist/cli/handlers/components.d.ts.map +1 -0
  23. package/dist/cli/handlers/dev.d.ts +3 -0
  24. package/dist/cli/handlers/dev.d.ts.map +1 -1
  25. package/dist/cli/handlers/graph.d.ts +4 -2
  26. package/dist/cli/handlers/graph.d.ts.map +1 -1
  27. package/dist/cli/handlers/misc.d.ts.map +1 -1
  28. package/dist/cli/handlers/run.d.ts +49 -0
  29. package/dist/cli/handlers/run.d.ts.map +1 -1
  30. package/dist/cli/main.d.ts.map +1 -1
  31. package/dist/cli/registry.d.ts +35 -0
  32. package/dist/cli/registry.d.ts.map +1 -1
  33. package/dist/codegen/fetch.d.ts +22 -0
  34. package/dist/codegen/fetch.d.ts.map +1 -1
  35. package/dist/codegen/lexicon-regen.d.ts +110 -0
  36. package/dist/codegen/lexicon-regen.d.ts.map +1 -0
  37. package/dist/codegen/pinned-upgrade.d.ts +153 -0
  38. package/dist/codegen/pinned-upgrade.d.ts.map +1 -0
  39. package/dist/codegen/rolling-upgrade.d.ts +138 -0
  40. package/dist/codegen/rolling-upgrade.d.ts.map +1 -0
  41. package/dist/codegen/surface-snapshot.d.ts +173 -0
  42. package/dist/codegen/surface-snapshot.d.ts.map +1 -0
  43. package/dist/codegen/version-bump.d.ts +21 -0
  44. package/dist/codegen/version-bump.d.ts.map +1 -0
  45. package/dist/components/auto-release.d.ts +93 -0
  46. package/dist/components/auto-release.d.ts.map +1 -0
  47. package/dist/components/builders.d.ts +37 -0
  48. package/dist/components/builders.d.ts.map +1 -0
  49. package/dist/components/capability-plugin-loader.d.ts +111 -0
  50. package/dist/components/capability-plugin-loader.d.ts.map +1 -0
  51. package/dist/components/capability-plugin-schema.d.ts +24 -0
  52. package/dist/components/capability-plugin-schema.d.ts.map +1 -0
  53. package/dist/components/capability-plugin.d.ts +85 -0
  54. package/dist/components/capability-plugin.d.ts.map +1 -0
  55. package/dist/components/capability.d.ts +89 -0
  56. package/dist/components/capability.d.ts.map +1 -0
  57. package/dist/components/cli-support.d.ts +204 -0
  58. package/dist/components/cli-support.d.ts.map +1 -0
  59. package/dist/components/component.d.ts +179 -0
  60. package/dist/components/component.d.ts.map +1 -0
  61. package/dist/components/config-defaults.d.ts +41 -0
  62. package/dist/components/config-defaults.d.ts.map +1 -0
  63. package/dist/components/discover.d.ts +60 -0
  64. package/dist/components/discover.d.ts.map +1 -0
  65. package/dist/components/driver-output.d.ts +20 -0
  66. package/dist/components/driver-output.d.ts.map +1 -0
  67. package/dist/components/driver.d.ts +209 -0
  68. package/dist/components/driver.d.ts.map +1 -0
  69. package/dist/components/index.d.ts +22 -0
  70. package/dist/components/index.d.ts.map +1 -0
  71. package/dist/components/manifest-persistence.d.ts +79 -0
  72. package/dist/components/manifest-persistence.d.ts.map +1 -0
  73. package/dist/components/pilots/alb-ecs.pilot.d.ts +27 -0
  74. package/dist/components/pilots/alb-ecs.pilot.d.ts.map +1 -0
  75. package/dist/components/pilots/dynamodb.pilot.d.ts +22 -0
  76. package/dist/components/pilots/dynamodb.pilot.d.ts.map +1 -0
  77. package/dist/components/pilots/jar-emr.pilot.d.ts +37 -0
  78. package/dist/components/pilots/jar-emr.pilot.d.ts.map +1 -0
  79. package/dist/components/pilots/lambda.pilot.d.ts +35 -0
  80. package/dist/components/pilots/lambda.pilot.d.ts.map +1 -0
  81. package/dist/components/pilots/neo4j-fanout.pilot.d.ts +17 -0
  82. package/dist/components/pilots/neo4j-fanout.pilot.d.ts.map +1 -0
  83. package/dist/components/pilots/project.d.ts +13 -0
  84. package/dist/components/pilots/project.d.ts.map +1 -0
  85. package/dist/components/presets/ecs-fargate.d.ts +59 -0
  86. package/dist/components/presets/ecs-fargate.d.ts.map +1 -0
  87. package/dist/components/presets/index.d.ts +29 -0
  88. package/dist/components/presets/index.d.ts.map +1 -0
  89. package/dist/components/presets/lambda.d.ts +35 -0
  90. package/dist/components/presets/lambda.d.ts.map +1 -0
  91. package/dist/components/presets/single-host-compose.d.ts +43 -0
  92. package/dist/components/presets/single-host-compose.d.ts.map +1 -0
  93. package/dist/components/registry.d.ts +29 -0
  94. package/dist/components/registry.d.ts.map +1 -0
  95. package/dist/components/starter-plugin.d.ts +51 -0
  96. package/dist/components/starter-plugin.d.ts.map +1 -0
  97. package/dist/components/temporal-codegen-loader.d.ts +27 -0
  98. package/dist/components/temporal-codegen-loader.d.ts.map +1 -0
  99. package/dist/components/verbs/__tests__/mock-cloud-executor.d.ts +35 -0
  100. package/dist/components/verbs/__tests__/mock-cloud-executor.d.ts.map +1 -0
  101. package/dist/components/verbs/__tests__/mock-process-runner.d.ts +45 -0
  102. package/dist/components/verbs/__tests__/mock-process-runner.d.ts.map +1 -0
  103. package/dist/components/verbs/__tests__/mock-sbom-generator.d.ts +33 -0
  104. package/dist/components/verbs/__tests__/mock-sbom-generator.d.ts.map +1 -0
  105. package/dist/components/verbs/bom-writer.d.ts +155 -0
  106. package/dist/components/verbs/bom-writer.d.ts.map +1 -0
  107. package/dist/components/verbs/build-archive.d.ts +205 -0
  108. package/dist/components/verbs/build-archive.d.ts.map +1 -0
  109. package/dist/components/verbs/build.d.ts +150 -0
  110. package/dist/components/verbs/build.d.ts.map +1 -0
  111. package/dist/components/verbs/cloud-executor.d.ts +88 -0
  112. package/dist/components/verbs/cloud-executor.d.ts.map +1 -0
  113. package/dist/components/verbs/component-bom.d.ts +103 -0
  114. package/dist/components/verbs/component-bom.d.ts.map +1 -0
  115. package/dist/components/verbs/index.d.ts +49 -0
  116. package/dist/components/verbs/index.d.ts.map +1 -0
  117. package/dist/components/verbs/license-policy.d.ts +56 -0
  118. package/dist/components/verbs/license-policy.d.ts.map +1 -0
  119. package/dist/components/verbs/lockfile-sbom-generator.d.ts +81 -0
  120. package/dist/components/verbs/lockfile-sbom-generator.d.ts.map +1 -0
  121. package/dist/components/verbs/process-runner.d.ts +64 -0
  122. package/dist/components/verbs/process-runner.d.ts.map +1 -0
  123. package/dist/components/verbs/reproducibility.d.ts +80 -0
  124. package/dist/components/verbs/reproducibility.d.ts.map +1 -0
  125. package/dist/components/verbs/sbom-generator.d.ts +157 -0
  126. package/dist/components/verbs/sbom-generator.d.ts.map +1 -0
  127. package/dist/components/verbs/sbom.d.ts +79 -0
  128. package/dist/components/verbs/sbom.d.ts.map +1 -0
  129. package/dist/components/verbs/shell.d.ts +35 -0
  130. package/dist/components/verbs/shell.d.ts.map +1 -0
  131. package/dist/components/verbs/sign.d.ts +222 -0
  132. package/dist/components/verbs/sign.d.ts.map +1 -0
  133. package/dist/components/verbs/stub.d.ts +18 -0
  134. package/dist/components/verbs/stub.d.ts.map +1 -0
  135. package/dist/components/verbs/tool-sbom-generator.d.ts +51 -0
  136. package/dist/components/verbs/tool-sbom-generator.d.ts.map +1 -0
  137. package/dist/components/verbs/verify.d.ts +106 -0
  138. package/dist/components/verbs/verify.d.ts.map +1 -0
  139. package/dist/components/verbs/vex.d.ts +65 -0
  140. package/dist/components/verbs/vex.d.ts.map +1 -0
  141. package/dist/components/verbs/vuln-gate.d.ts +91 -0
  142. package/dist/components/verbs/vuln-gate.d.ts.map +1 -0
  143. package/dist/components/verbs/vuln-scan.d.ts +116 -0
  144. package/dist/components/verbs/vuln-scan.d.ts.map +1 -0
  145. package/dist/components/verbs/wait-verify.d.ts +85 -0
  146. package/dist/components/verbs/wait-verify.d.ts.map +1 -0
  147. package/dist/config.d.ts +205 -0
  148. package/dist/config.d.ts.map +1 -1
  149. package/dist/index.d.ts +4 -0
  150. package/dist/index.d.ts.map +1 -1
  151. package/dist/lexicon.d.ts +78 -0
  152. package/dist/lexicon.d.ts.map +1 -1
  153. package/dist/lifecycle/build-ledger-store.d.ts +121 -0
  154. package/dist/lifecycle/build-ledger-store.d.ts.map +1 -0
  155. package/dist/lifecycle/build-ledger.d.ts +225 -0
  156. package/dist/lifecycle/build-ledger.d.ts.map +1 -0
  157. package/dist/lifecycle/git.d.ts +84 -0
  158. package/dist/lifecycle/git.d.ts.map +1 -1
  159. package/dist/lifecycle/index.d.ts +5 -0
  160. package/dist/lifecycle/index.d.ts.map +1 -1
  161. package/dist/lifecycle/oras-referrer-lookup.d.ts +41 -0
  162. package/dist/lifecycle/oras-referrer-lookup.d.ts.map +1 -0
  163. package/dist/lifecycle/release-ledger.d.ts +122 -0
  164. package/dist/lifecycle/release-ledger.d.ts.map +1 -0
  165. package/dist/lifecycle/status.d.ts +150 -0
  166. package/dist/lifecycle/status.d.ts.map +1 -0
  167. package/dist/lint/component-checks.d.ts +95 -0
  168. package/dist/lint/component-checks.d.ts.map +1 -0
  169. package/dist/lint/engine.d.ts +23 -0
  170. package/dist/lint/engine.d.ts.map +1 -1
  171. package/dist/lint/presets/strict.json +8 -1
  172. package/dist/lint/rules/__fixtures__/comp/comp000-discovery-error/broken-a.component.d.ts +4 -0
  173. package/dist/lint/rules/__fixtures__/comp/comp000-discovery-error/broken-a.component.d.ts.map +1 -0
  174. package/dist/lint/rules/__fixtures__/comp/comp000-discovery-error/broken-b.component.d.ts +4 -0
  175. package/dist/lint/rules/__fixtures__/comp/comp000-discovery-error/broken-b.component.d.ts.map +1 -0
  176. package/dist/lint/rules/__fixtures__/comp/comp001/fail/orphan-lib.component.d.ts +4 -0
  177. package/dist/lint/rules/__fixtures__/comp/comp001/fail/orphan-lib.component.d.ts.map +1 -0
  178. package/dist/lint/rules/__fixtures__/comp/comp001/pass/emr-job.component.d.ts +4 -0
  179. package/dist/lint/rules/__fixtures__/comp/comp001/pass/emr-job.component.d.ts.map +1 -0
  180. package/dist/lint/rules/__fixtures__/comp/comp001/pass/jar-lib.component.d.ts +4 -0
  181. package/dist/lint/rules/__fixtures__/comp/comp001/pass/jar-lib.component.d.ts.map +1 -0
  182. package/dist/lint/rules/__fixtures__/comp/comp002/fail/search-service.component.d.ts +10 -0
  183. package/dist/lint/rules/__fixtures__/comp/comp002/fail/search-service.component.d.ts.map +1 -0
  184. package/dist/lint/rules/__fixtures__/comp/comp002/pass/jar-lib.component.d.ts +3 -0
  185. package/dist/lint/rules/__fixtures__/comp/comp002/pass/jar-lib.component.d.ts.map +1 -0
  186. package/dist/lint/rules/__fixtures__/comp/comp002/pass/search-service.component.d.ts +4 -0
  187. package/dist/lint/rules/__fixtures__/comp/comp002/pass/search-service.component.d.ts.map +1 -0
  188. package/dist/lint/rules/__fixtures__/comp/comp003/fail/migrator.component.d.ts +4 -0
  189. package/dist/lint/rules/__fixtures__/comp/comp003/fail/migrator.component.d.ts.map +1 -0
  190. package/dist/lint/rules/__fixtures__/comp/comp003/pass/migrator.component.d.ts +4 -0
  191. package/dist/lint/rules/__fixtures__/comp/comp003/pass/migrator.component.d.ts.map +1 -0
  192. package/dist/lint/rules/__fixtures__/comp/comp003/pass/orders-table.component.d.ts +4 -0
  193. package/dist/lint/rules/__fixtures__/comp/comp003/pass/orders-table.component.d.ts.map +1 -0
  194. package/dist/lint/rules/__fixtures__/comp/comp004/fail/neo4j-cluster.component.d.ts +4 -0
  195. package/dist/lint/rules/__fixtures__/comp/comp004/fail/neo4j-cluster.component.d.ts.map +1 -0
  196. package/dist/lint/rules/__fixtures__/comp/comp004/pass/neo4j-cluster.component.d.ts +4 -0
  197. package/dist/lint/rules/__fixtures__/comp/comp004/pass/neo4j-cluster.component.d.ts.map +1 -0
  198. package/dist/lint/rules/__fixtures__/comp/comp004/pass/orders-table.component.d.ts +4 -0
  199. package/dist/lint/rules/__fixtures__/comp/comp004/pass/orders-table.component.d.ts.map +1 -0
  200. package/dist/lint/rules/__fixtures__/comp/comp005/fail/search-service.component.d.ts +4 -0
  201. package/dist/lint/rules/__fixtures__/comp/comp005/fail/search-service.component.d.ts.map +1 -0
  202. package/dist/lint/rules/__fixtures__/comp/comp005/pass/search-service.component.d.ts +4 -0
  203. package/dist/lint/rules/__fixtures__/comp/comp005/pass/search-service.component.d.ts.map +1 -0
  204. package/dist/lint/rules/__fixtures__/comp/comp006/fail/legacy-tool.component.d.ts +4 -0
  205. package/dist/lint/rules/__fixtures__/comp/comp006/fail/legacy-tool.component.d.ts.map +1 -0
  206. package/dist/lint/rules/__fixtures__/comp/comp006/pass/legacy-tool.component.d.ts +4 -0
  207. package/dist/lint/rules/__fixtures__/comp/comp006/pass/legacy-tool.component.d.ts.map +1 -0
  208. package/dist/lint/rules/__fixtures__/comp/comp007/fail/inventory-table.component.d.ts +4 -0
  209. package/dist/lint/rules/__fixtures__/comp/comp007/fail/inventory-table.component.d.ts.map +1 -0
  210. package/dist/lint/rules/__fixtures__/comp/comp007/fail/orders-table.component.d.ts +4 -0
  211. package/dist/lint/rules/__fixtures__/comp/comp007/fail/orders-table.component.d.ts.map +1 -0
  212. package/dist/lint/rules/__fixtures__/comp/comp007/pass/orders-table.component.d.ts +3 -0
  213. package/dist/lint/rules/__fixtures__/comp/comp007/pass/orders-table.component.d.ts.map +1 -0
  214. package/dist/lint/rules/__fixtures__/comp/comp007/pass/search-service.component.d.ts +4 -0
  215. package/dist/lint/rules/__fixtures__/comp/comp007/pass/search-service.component.d.ts.map +1 -0
  216. package/dist/lint/rules/comp/comp001-publishes-never-applies.d.ts +20 -0
  217. package/dist/lint/rules/comp/comp001-publishes-never-applies.d.ts.map +1 -0
  218. package/dist/lint/rules/comp/comp002-dangling-wiring-ref.d.ts +28 -0
  219. package/dist/lint/rules/comp/comp002-dangling-wiring-ref.d.ts.map +1 -0
  220. package/dist/lint/rules/comp/comp003-mutating-no-rollback.d.ts +39 -0
  221. package/dist/lint/rules/comp/comp003-mutating-no-rollback.d.ts.map +1 -0
  222. package/dist/lint/rules/comp/comp004-gate-needs-temporal.d.ts +37 -0
  223. package/dist/lint/rules/comp/comp004-gate-needs-temporal.d.ts.map +1 -0
  224. package/dist/lint/rules/comp/comp005-capability-kind-is-noun.d.ts +43 -0
  225. package/dist/lint/rules/comp/comp005-capability-kind-is-noun.d.ts.map +1 -0
  226. package/dist/lint/rules/comp/comp006-shell-needs-reason.d.ts +22 -0
  227. package/dist/lint/rules/comp/comp006-shell-needs-reason.d.ts.map +1 -0
  228. package/dist/lint/rules/comp/comp007-composition-sprawl.d.ts +33 -0
  229. package/dist/lint/rules/comp/comp007-composition-sprawl.d.ts.map +1 -0
  230. package/dist/lint/rules/comp/index.d.ts +18 -0
  231. package/dist/lint/rules/comp/index.d.ts.map +1 -0
  232. package/dist/lint/rules/comp/support.d.ts +71 -0
  233. package/dist/lint/rules/comp/support.d.ts.map +1 -0
  234. package/dist/lsp/lexicon-providers.d.ts.map +1 -1
  235. package/dist/op/activity-registry.d.ts +11 -6
  236. package/dist/op/activity-registry.d.ts.map +1 -1
  237. package/dist/op/activity-runtime.d.ts +24 -0
  238. package/dist/op/activity-runtime.d.ts.map +1 -0
  239. package/dist/op/builders.d.ts +59 -0
  240. package/dist/op/builders.d.ts.map +1 -1
  241. package/dist/op/index.d.ts +2 -1
  242. package/dist/op/index.d.ts.map +1 -1
  243. package/dist/ownership.d.ts +20 -14
  244. package/dist/ownership.d.ts.map +1 -1
  245. package/package.json +14 -1
  246. package/src/audit/catalog.test.ts +74 -22
  247. package/src/audit/catalog.ts +74 -471
  248. package/src/audit/proof.ts +4 -2
  249. package/src/audit/report-html.test.ts +14 -7
  250. package/src/audit/report-model.ts +20 -9
  251. package/src/audit/report.test.ts +36 -13
  252. package/src/audit/report.ts +2 -0
  253. package/src/audit/rules-doc.test.ts +8 -6
  254. package/src/audit/rules-doc.ts +13 -5
  255. package/src/cli/commands/audit.ts +23 -18
  256. package/src/cli/commands/component-lint.test.ts +158 -0
  257. package/src/cli/commands/doctor.test.ts +116 -2
  258. package/src/cli/commands/doctor.ts +46 -0
  259. package/src/cli/commands/lexicon-rolling-upgrade.ts +198 -0
  260. package/src/cli/commands/lexicon-surface-diff.test.ts +104 -0
  261. package/src/cli/commands/lexicon-surface-diff.ts +185 -0
  262. package/src/cli/commands/lint.ts +142 -1
  263. package/src/cli/commands/pinned-upgrade.ts +204 -0
  264. package/src/cli/handlers/build.ts +58 -1
  265. package/src/cli/handlers/components.test.ts +504 -0
  266. package/src/cli/handlers/components.ts +404 -0
  267. package/src/cli/handlers/dev.ts +60 -1
  268. package/src/cli/handlers/graph.ts +47 -2
  269. package/src/cli/handlers/misc.ts +45 -1
  270. package/src/cli/handlers/run.test.ts +967 -3
  271. package/src/cli/handlers/run.ts +618 -11
  272. package/src/cli/main.test.ts +66 -0
  273. package/src/cli/main.ts +105 -2
  274. package/src/cli/registry.ts +35 -0
  275. package/src/codegen/fetch.test.ts +84 -3
  276. package/src/codegen/fetch.ts +76 -2
  277. package/src/codegen/lexicon-regen.test.ts +298 -0
  278. package/src/codegen/lexicon-regen.ts +545 -0
  279. package/src/codegen/pinned-upgrade.test.ts +399 -0
  280. package/src/codegen/pinned-upgrade.ts +423 -0
  281. package/src/codegen/rolling-upgrade.test.ts +333 -0
  282. package/src/codegen/rolling-upgrade.ts +320 -0
  283. package/src/codegen/surface-snapshot.test.ts +461 -0
  284. package/src/codegen/surface-snapshot.ts +546 -0
  285. package/src/codegen/version-bump.test.ts +47 -0
  286. package/src/codegen/version-bump.ts +39 -0
  287. package/src/components/README.md +130 -0
  288. package/src/components/SPRAWL-VALIDATION.md +181 -0
  289. package/src/components/__fixtures__/alb-ecs-service.json +51 -0
  290. package/src/components/__fixtures__/dynamodb-infra.json +32 -0
  291. package/src/components/__fixtures__/emr-job-consumer.json +26 -0
  292. package/src/components/__fixtures__/jar-lib-producer.json +16 -0
  293. package/src/components/__fixtures__/lambda-image-processor.json +28 -0
  294. package/src/components/__fixtures__/neo4j-fanout.json +34 -0
  295. package/src/components/__fixtures__/single-host-compose.json +29 -0
  296. package/src/components/auto-release.test.ts +217 -0
  297. package/src/components/auto-release.ts +216 -0
  298. package/src/components/builders.test.ts +45 -0
  299. package/src/components/builders.ts +71 -0
  300. package/src/components/capability-plugin-loader.ts +218 -0
  301. package/src/components/capability-plugin-schema.ts +56 -0
  302. package/src/components/capability-plugin.test.ts +235 -0
  303. package/src/components/capability-plugin.ts +108 -0
  304. package/src/components/capability.ts +117 -0
  305. package/src/components/cli-support.test.ts +579 -0
  306. package/src/components/cli-support.ts +481 -0
  307. package/src/components/component-schema.test.ts +265 -0
  308. package/src/components/component.schema.json +235 -0
  309. package/src/components/component.test.ts +251 -0
  310. package/src/components/component.ts +255 -0
  311. package/src/components/config-defaults.test.ts +263 -0
  312. package/src/components/config-defaults.ts +145 -0
  313. package/src/components/discover.test.ts +352 -0
  314. package/src/components/discover.ts +167 -0
  315. package/src/components/driver-output.ts +71 -0
  316. package/src/components/driver.test.ts +638 -0
  317. package/src/components/driver.ts +690 -0
  318. package/src/components/index.ts +113 -0
  319. package/src/components/manifest-persistence.test.ts +152 -0
  320. package/src/components/manifest-persistence.ts +164 -0
  321. package/src/components/pilots/README.md +33 -0
  322. package/src/components/pilots/alb-ecs.pilot.ts +63 -0
  323. package/src/components/pilots/dynamodb.pilot.ts +59 -0
  324. package/src/components/pilots/jar-emr.pilot.ts +69 -0
  325. package/src/components/pilots/lambda.pilot.ts +55 -0
  326. package/src/components/pilots/neo4j-fanout.pilot.ts +92 -0
  327. package/src/components/pilots/pilots-lint-clean.test.ts +78 -0
  328. package/src/components/pilots/pilots.test.ts +126 -0
  329. package/src/components/pilots/project.ts +13 -0
  330. package/src/components/presets/comp007-reduction.test.ts +122 -0
  331. package/src/components/presets/ecs-fargate.test.ts +84 -0
  332. package/src/components/presets/ecs-fargate.ts +103 -0
  333. package/src/components/presets/index.ts +32 -0
  334. package/src/components/presets/lambda.test.ts +35 -0
  335. package/src/components/presets/lambda.ts +53 -0
  336. package/src/components/presets/single-host-compose.test.ts +65 -0
  337. package/src/components/presets/single-host-compose.ts +64 -0
  338. package/src/components/registry.test.ts +112 -0
  339. package/src/components/registry.ts +37 -0
  340. package/src/components/starter-plugin.ts +105 -0
  341. package/src/components/temporal-codegen-loader.ts +41 -0
  342. package/src/components/verbs/__fixtures__/package-lock.json +45 -0
  343. package/src/components/verbs/__fixtures__/pom.xml +37 -0
  344. package/src/components/verbs/__fixtures__/schemas/cyclonedx-1.5.schema.json +3800 -0
  345. package/src/components/verbs/__fixtures__/schemas/cyclonedx-spdx-license.schema.json +621 -0
  346. package/src/components/verbs/__fixtures__/schemas/jsf-0.82.schema.json +240 -0
  347. package/src/components/verbs/__fixtures__/schemas/spdx-2.3.schema.json +740 -0
  348. package/src/components/verbs/__tests__/mock-cloud-executor.ts +102 -0
  349. package/src/components/verbs/__tests__/mock-process-runner.ts +79 -0
  350. package/src/components/verbs/__tests__/mock-sbom-generator.ts +85 -0
  351. package/src/components/verbs/bom-writer.test.ts +331 -0
  352. package/src/components/verbs/bom-writer.ts +386 -0
  353. package/src/components/verbs/build-archive.test.ts +251 -0
  354. package/src/components/verbs/build-archive.ts +296 -0
  355. package/src/components/verbs/build.test.ts +222 -0
  356. package/src/components/verbs/build.ts +252 -0
  357. package/src/components/verbs/cloud-executor.ts +181 -0
  358. package/src/components/verbs/component-bom.test.ts +219 -0
  359. package/src/components/verbs/component-bom.ts +189 -0
  360. package/src/components/verbs/index.ts +49 -0
  361. package/src/components/verbs/license-policy.ts +115 -0
  362. package/src/components/verbs/lockfile-sbom-generator.test.ts +195 -0
  363. package/src/components/verbs/lockfile-sbom-generator.ts +236 -0
  364. package/src/components/verbs/process-runner.test.ts +79 -0
  365. package/src/components/verbs/process-runner.ts +113 -0
  366. package/src/components/verbs/reproducibility.test.ts +24 -0
  367. package/src/components/verbs/reproducibility.ts +100 -0
  368. package/src/components/verbs/sbom-generator.test.ts +96 -0
  369. package/src/components/verbs/sbom-generator.ts +209 -0
  370. package/src/components/verbs/sbom.test.ts +184 -0
  371. package/src/components/verbs/sbom.ts +152 -0
  372. package/src/components/verbs/shell.test.ts +36 -0
  373. package/src/components/verbs/shell.ts +51 -0
  374. package/src/components/verbs/sign.test.ts +210 -0
  375. package/src/components/verbs/sign.ts +350 -0
  376. package/src/components/verbs/stub.ts +34 -0
  377. package/src/components/verbs/tool-sbom-generator.test.ts +194 -0
  378. package/src/components/verbs/tool-sbom-generator.ts +192 -0
  379. package/src/components/verbs/verify.test.ts +159 -0
  380. package/src/components/verbs/verify.ts +179 -0
  381. package/src/components/verbs/vex.ts +182 -0
  382. package/src/components/verbs/vuln-gate.test.ts +201 -0
  383. package/src/components/verbs/vuln-gate.ts +170 -0
  384. package/src/components/verbs/vuln-scan.test.ts +145 -0
  385. package/src/components/verbs/vuln-scan.ts +266 -0
  386. package/src/components/verbs/wait-verify.test.ts +111 -0
  387. package/src/components/verbs/wait-verify.ts +171 -0
  388. package/src/config.test.ts +74 -1
  389. package/src/config.ts +219 -0
  390. package/src/index.ts +32 -0
  391. package/src/lexicon.ts +88 -0
  392. package/src/lifecycle/build-ledger-store.test.ts +217 -0
  393. package/src/lifecycle/build-ledger-store.ts +165 -0
  394. package/src/lifecycle/build-ledger.test.ts +349 -0
  395. package/src/lifecycle/build-ledger.ts +305 -0
  396. package/src/lifecycle/git.test.ts +118 -0
  397. package/src/lifecycle/git.ts +149 -14
  398. package/src/lifecycle/index.ts +5 -0
  399. package/src/lifecycle/oras-referrer-lookup.test.ts +116 -0
  400. package/src/lifecycle/oras-referrer-lookup.ts +110 -0
  401. package/src/lifecycle/release-ledger.test.ts +209 -0
  402. package/src/lifecycle/release-ledger.ts +185 -0
  403. package/src/lifecycle/status.test.ts +330 -0
  404. package/src/lifecycle/status.ts +278 -0
  405. package/src/lint/component-checks.ts +148 -0
  406. package/src/lint/config.test.ts +21 -0
  407. package/src/lint/engine.ts +11 -2
  408. package/src/lint/presets/relaxed.json +8 -1
  409. package/src/lint/presets/strict.json +8 -1
  410. package/src/lint/rules/__fixtures__/comp/comp000-discovery-error/broken-a.component.ts +9 -0
  411. package/src/lint/rules/__fixtures__/comp/comp000-discovery-error/broken-b.component.ts +9 -0
  412. package/src/lint/rules/__fixtures__/comp/comp001/fail/orphan-lib.component.ts +11 -0
  413. package/src/lint/rules/__fixtures__/comp/comp001/pass/emr-job.component.ts +13 -0
  414. package/src/lint/rules/__fixtures__/comp/comp001/pass/jar-lib.component.ts +11 -0
  415. package/src/lint/rules/__fixtures__/comp/comp002/fail/search-service.component.ts +27 -0
  416. package/src/lint/rules/__fixtures__/comp/comp002/pass/jar-lib.component.ts +10 -0
  417. package/src/lint/rules/__fixtures__/comp/comp002/pass/search-service.component.ts +23 -0
  418. package/src/lint/rules/__fixtures__/comp/comp003/fail/migrator.component.ts +10 -0
  419. package/src/lint/rules/__fixtures__/comp/comp003/pass/migrator.component.ts +19 -0
  420. package/src/lint/rules/__fixtures__/comp/comp003/pass/orders-table.component.ts +10 -0
  421. package/src/lint/rules/__fixtures__/comp/comp004/fail/neo4j-cluster.component.ts +20 -0
  422. package/src/lint/rules/__fixtures__/comp/comp004/pass/neo4j-cluster.component.ts +23 -0
  423. package/src/lint/rules/__fixtures__/comp/comp004/pass/orders-table.component.ts +10 -0
  424. package/src/lint/rules/__fixtures__/comp/comp005/fail/search-service.component.ts +14 -0
  425. package/src/lint/rules/__fixtures__/comp/comp005/pass/search-service.component.ts +18 -0
  426. package/src/lint/rules/__fixtures__/comp/comp006/fail/legacy-tool.component.ts +10 -0
  427. package/src/lint/rules/__fixtures__/comp/comp006/pass/legacy-tool.component.ts +14 -0
  428. package/src/lint/rules/__fixtures__/comp/comp007/fail/inventory-table.component.ts +13 -0
  429. package/src/lint/rules/__fixtures__/comp/comp007/fail/orders-table.component.ts +13 -0
  430. package/src/lint/rules/__fixtures__/comp/comp007/pass/orders-table.component.ts +12 -0
  431. package/src/lint/rules/__fixtures__/comp/comp007/pass/search-service.component.ts +18 -0
  432. package/src/lint/rules/comp/comp.test.ts +378 -0
  433. package/src/lint/rules/comp/comp001-publishes-never-applies.ts +78 -0
  434. package/src/lint/rules/comp/comp002-dangling-wiring-ref.ts +94 -0
  435. package/src/lint/rules/comp/comp003-mutating-no-rollback.ts +115 -0
  436. package/src/lint/rules/comp/comp004-gate-needs-temporal.ts +66 -0
  437. package/src/lint/rules/comp/comp005-capability-kind-is-noun.ts +113 -0
  438. package/src/lint/rules/comp/comp006-shell-needs-reason.ts +55 -0
  439. package/src/lint/rules/comp/comp007-composition-sprawl.ts +71 -0
  440. package/src/lint/rules/comp/index.ts +37 -0
  441. package/src/lint/rules/comp/support.ts +173 -0
  442. package/src/lsp/lexicon-providers.test.ts +55 -0
  443. package/src/lsp/lexicon-providers.ts +13 -3
  444. package/src/op/activity-registry.test.ts +38 -0
  445. package/src/op/activity-registry.ts +31 -12
  446. package/src/op/activity-runtime.ts +73 -0
  447. package/src/op/builders.ts +99 -0
  448. package/src/op/index.ts +3 -1
  449. package/src/ownership.test.ts +24 -26
  450. package/src/ownership.ts +26 -38
@@ -1,11 +1,15 @@
1
1
  import { resolve, join } from "path";
2
2
  import { readFileSync, writeFileSync, readdirSync, statSync } from "fs";
3
- import { runLint } from "../../lint/engine";
3
+ import { runLint, parseDisableComments } from "../../lint/engine";
4
4
  import type { LintRule, LintDiagnostic, LintFix } from "../../lint/rule";
5
5
  import { loadPlugins, resolveProjectLexicons } from "../plugins";
6
6
  import { formatStylish, formatJson, formatSarif } from "../reporters/stylish";
7
7
  import { loadLocalRules } from "../../lint/rule-loader";
8
8
  import { loadCoreRules } from "../../lint/rules/index";
9
+ import { loadComponentChecks } from "../../lint/rules/comp/index";
10
+ import { runComponentChecks, type ComponentCheckDiagnostic } from "../../lint/component-checks";
11
+ import { buildCapabilityRegistry } from "../../components/capability-plugin-loader";
12
+ import type { RollbackPolicy } from "../../components/capability";
9
13
  import { rule } from "../../lint/declarative";
10
14
  import { watchDirectory, formatTimestamp, formatChangedFiles } from "../watch";
11
15
  import { formatError, formatInfo } from "../format";
@@ -203,6 +207,126 @@ function getDefaultRules(
203
207
  return { rules, ruleOptions };
204
208
  }
205
209
 
210
+ /**
211
+ * Run the COMP* composition checks (#562) over the discovered `Component`
212
+ * graph and convert their results into plain `LintDiagnostic`s so they merge
213
+ * into the same `chant lint` output (stylish/json/sarif) and the same
214
+ * error-count gating as every COR/EVL diagnostic.
215
+ *
216
+ * These checks operate on the whole discovered component graph, not one
217
+ * `ts.SourceFile`, so they carry no real line/column — reported at `1:1` in
218
+ * the file the component was declared in (matching COR009's whole-file
219
+ * diagnostic convention, see ../../lint/rules/file-declarable-limit.ts).
220
+ * Config severity overrides (`lint.rules["COMP001"]`, including `"off"`) are
221
+ * honored the same way `getDefaultRules` honors them for AST rules. Only the
222
+ * *file-level* disable directive form (`// chant-disable` /
223
+ * `// chant-disable COMP004 -- reason`, anywhere in the file) is honored —
224
+ * `-line`/`-next-line` need an exact line to match against, which a
225
+ * whole-component diagnostic does not have; see
226
+ * docs/lint-rules/composition.mdx for this documented limitation.
227
+ */
228
+ /**
229
+ * Build the registry-derived context composition checks need — the set of
230
+ * capability kinds registered for this project (core's starter set plus the
231
+ * active lexicons' leaves, e.g. `cfn-deploy` when `lexicons: ["aws"]`) and each
232
+ * verb's rollback disposition — so COMP005/COMP003 read real registry facts
233
+ * rather than hard-coding verb lists. A verb's rollback policy is its own
234
+ * declaration (`rollbackPolicy`), else derived: a paired `rollback` method is
235
+ * `"native"`, everything else `"none-by-design"`. Tolerant: any failure (an
236
+ * unresolvable lexicon, a config-less directory) returns `undefined` fields,
237
+ * letting the checks fall back to core's starter set.
238
+ */
239
+ async function resolveRegistryContext(
240
+ infraPath: string,
241
+ ): Promise<{ knownKinds?: ReadonlySet<string>; rollbackPolicies?: ReadonlyMap<string, RollbackPolicy> }> {
242
+ try {
243
+ const lexicons = await resolveProjectLexicons(infraPath).catch(() => [] as string[]);
244
+ const registry = await buildCapabilityRegistry({ lexicons });
245
+ const kinds = registry.kinds();
246
+ const rollbackPolicies = new Map<string, RollbackPolicy>();
247
+ for (const kind of kinds) {
248
+ const capability = registry.resolve(kind);
249
+ rollbackPolicies.set(kind, capability.rollbackPolicy ?? (capability.rollback ? "native" : "none-by-design"));
250
+ }
251
+ return { knownKinds: new Set(kinds), rollbackPolicies };
252
+ } catch {
253
+ return {};
254
+ }
255
+ }
256
+
257
+ async function runComponentCheckDiagnostics(
258
+ infraPath: string,
259
+ ): Promise<{ diagnostics: LintDiagnostic[]; suppressed: Array<LintDiagnostic & { reason?: string }> }> {
260
+ const config = loadConfig(infraPath);
261
+ const checks = loadComponentChecks();
262
+ const allCheckIds = new Set(checks.map((c) => c.id));
263
+
264
+ const registryContext = await resolveRegistryContext(infraPath);
265
+ const raw = await runComponentChecks(infraPath, checks, registryContext);
266
+
267
+ const fileDirectivesCache = new Map<string, ReturnType<typeof parseDisableComments>>();
268
+ const fileLevelDisable = (
269
+ file: string,
270
+ checkId: string,
271
+ ): { suppressed: boolean; reason?: string } => {
272
+ let directives = fileDirectivesCache.get(file);
273
+ if (!directives) {
274
+ let content = "";
275
+ try {
276
+ content = readFileSync(file, "utf-8");
277
+ } catch {
278
+ // File may be unreadable (e.g. a synthetic discovery-error path) — no directives to honor.
279
+ }
280
+ directives = parseDisableComments(content);
281
+ fileDirectivesCache.set(file, directives);
282
+ }
283
+
284
+ for (const directive of directives) {
285
+ if (directive.type !== "file") continue;
286
+ if (!directive.ruleIds) return { suppressed: true, reason: directive.reason };
287
+ if (directive.ruleIds.some((id) => allCheckIds.has(id) || id === "COMP000") && directive.ruleIds.includes(checkId)) {
288
+ return { suppressed: true, reason: directive.reason };
289
+ }
290
+ }
291
+ return { suppressed: false };
292
+ };
293
+
294
+ const toLintDiagnostic = (d: ComponentCheckDiagnostic, severity: LintDiagnostic["severity"]): LintDiagnostic => ({
295
+ file: d.file,
296
+ line: 1,
297
+ column: 1,
298
+ ruleId: d.checkId,
299
+ severity,
300
+ message: d.message,
301
+ });
302
+
303
+ const diagnostics: LintDiagnostic[] = [];
304
+ const suppressed: Array<LintDiagnostic & { reason?: string }> = [];
305
+
306
+ for (const d of raw) {
307
+ // Discovery errors (COMP000) always surface at error severity — not user-configurable.
308
+ let severity = d.severity;
309
+ if (d.checkId !== "COMP000") {
310
+ const configValue = config.rules?.[d.checkId];
311
+ if (configValue !== undefined) {
312
+ const parsed = parseRuleConfig(configValue);
313
+ if (parsed.severity === "off") continue;
314
+ severity = parsed.severity;
315
+ }
316
+ }
317
+
318
+ const disable = fileLevelDisable(d.file, d.checkId);
319
+ const diagnostic = toLintDiagnostic(d, severity);
320
+ if (disable.suppressed) {
321
+ suppressed.push({ ...diagnostic, reason: disable.reason });
322
+ } else {
323
+ diagnostics.push(diagnostic);
324
+ }
325
+ }
326
+
327
+ return { diagnostics, suppressed };
328
+ }
329
+
206
330
  /**
207
331
  * Apply fixes to a file
208
332
  */
@@ -264,6 +388,15 @@ export async function lintCommand(options: LintOptions): Promise<LintResult> {
264
388
  suppressed = result.suppressed;
265
389
  }
266
390
 
391
+ // Run the COMP* composition checks (#562) over the discovered `Component`
392
+ // graph and merge them into the same diagnostics/suppressed lists — a
393
+ // structurally distinct check family (whole-project, post-discovery,
394
+ // see ../../lint/component-checks.ts) but the same `chant lint` output and
395
+ // the same error-severity gating as every COR/EVL diagnostic.
396
+ const componentResult = await runComponentCheckDiagnostics(infraPath);
397
+ diagnostics.push(...componentResult.diagnostics);
398
+ suppressed.push(...componentResult.suppressed);
399
+
267
400
  // Apply fixes if requested
268
401
  if (options.fix) {
269
402
  // Group fixes by file
@@ -303,6 +436,14 @@ export async function lintCommand(options: LintOptions): Promise<LintResult> {
303
436
  diagnostics = postResult.diagnostics;
304
437
  suppressed = postResult.suppressed;
305
438
  }
439
+
440
+ // COMP* checks have no `.fix` (nothing above could have touched a
441
+ // `*.component.ts` file on their behalf), but a fix applied to another
442
+ // rule could still be in the same file a component was discovered from —
443
+ // re-run for consistency with the AST re-lint above.
444
+ const postComponentResult = await runComponentCheckDiagnostics(infraPath);
445
+ diagnostics.push(...postComponentResult.diagnostics);
446
+ suppressed.push(...postComponentResult.suppressed);
306
447
  }
307
448
 
308
449
  // Count errors and warnings
@@ -0,0 +1,204 @@
1
+ /**
2
+ * `chant dev pinned-upgrade <lexicon-dir>` command implementation.
3
+ *
4
+ * Detects whether a pinned-version lexicon (k8s, gcp, docker, gitlab) has a
5
+ * newer stable upstream release. When it does, it dry-run bumps the pinned
6
+ * version constant, regenerates + surface-diffs (via #524's regenLexicon), then
7
+ * reverts the bump — leaving the working tree unchanged.
8
+ *
9
+ * This command only REPORTS. Branch/PR automation lives in #527.
10
+ */
11
+
12
+ import { existsSync } from "fs";
13
+ import { basename, resolve } from "path";
14
+ import {
15
+ checkPinnedUpgrade,
16
+ type LexiconId,
17
+ type UpgradeCheckResult,
18
+ } from "../../codegen/pinned-upgrade";
19
+
20
+ const PINNED_LEXICONS: readonly LexiconId[] = ["k8s", "gcp", "docker", "gitlab"];
21
+
22
+ export interface PinnedUpgradeOptions {
23
+ /** Resolved path to the lexicon directory. */
24
+ lexiconDir: string;
25
+ /** Explicit lexicon id; inferred from the directory name when omitted. */
26
+ lexicon?: LexiconId;
27
+ /** Force re-fetch of the upstream spec during regen. */
28
+ force?: boolean;
29
+ /** Print subprocess output while running. */
30
+ verbose?: boolean;
31
+ }
32
+
33
+ /**
34
+ * Infer the lexicon id from a directory name. Returns null when the directory
35
+ * basename is not one of the pinned lexicons.
36
+ */
37
+ export function inferLexicon(lexiconDir: string): LexiconId | null {
38
+ const name = basename(lexiconDir);
39
+ return (PINNED_LEXICONS as readonly string[]).includes(name) ? (name as LexiconId) : null;
40
+ }
41
+
42
+ /**
43
+ * Map a regen severity to a semver review label.
44
+ * additive → "minor"; breaking → "major"; none → "none".
45
+ */
46
+ export function semverLabel(result: UpgradeCheckResult): "minor" | "major" | "none" {
47
+ const sev = result.validation?.severity;
48
+ if (sev === "breaking") return "major";
49
+ if (sev === "additive") return "minor";
50
+ return "none";
51
+ }
52
+
53
+ /**
54
+ * Run the pinned-upgrade check and return the structured result.
55
+ * Never throws — a missing dir or an unrecognised lexicon becomes a fetchError.
56
+ */
57
+ export async function runPinnedUpgrade(opts: PinnedUpgradeOptions): Promise<UpgradeCheckResult> {
58
+ const dir = resolve(opts.lexiconDir);
59
+
60
+ const lexicon = opts.lexicon ?? inferLexicon(dir);
61
+ if (!lexicon) {
62
+ return {
63
+ lexicon: "k8s",
64
+ hasUpgrade: false,
65
+ from: "(unknown)",
66
+ to: null,
67
+ validation: null,
68
+ fetchError: `Not a pinned lexicon directory: ${dir}. Expected one of: ${PINNED_LEXICONS.join(", ")}.`,
69
+ };
70
+ }
71
+
72
+ if (!existsSync(dir)) {
73
+ return {
74
+ lexicon,
75
+ hasUpgrade: false,
76
+ from: "(unknown)",
77
+ to: null,
78
+ validation: null,
79
+ fetchError: `Lexicon directory not found: ${dir}`,
80
+ };
81
+ }
82
+
83
+ return checkPinnedUpgrade({
84
+ lexiconDir: dir,
85
+ lexicon,
86
+ force: opts.force,
87
+ verbose: opts.verbose,
88
+ });
89
+ }
90
+
91
+ // ── Human-readable output ─────────────────────────────────────────────
92
+
93
+ const COLORS = {
94
+ green: "\x1b[32m",
95
+ yellow: "\x1b[33m",
96
+ red: "\x1b[31m",
97
+ gray: "\x1b[90m",
98
+ bold: "\x1b[1m",
99
+ reset: "\x1b[0m",
100
+ };
101
+
102
+ function useColors(): boolean {
103
+ return !process.env.NO_COLOR && process.stdout.isTTY !== false;
104
+ }
105
+
106
+ function c(text: string, code: string): string {
107
+ return useColors() ? `${code}${text}${COLORS.reset}` : text;
108
+ }
109
+
110
+ /**
111
+ * Print the pinned-upgrade result. `json` emits a machine-readable object.
112
+ */
113
+ export function printPinnedUpgradeResult(result: UpgradeCheckResult, json: boolean): void {
114
+ const label = semverLabel(result);
115
+
116
+ if (json) {
117
+ console.log(
118
+ JSON.stringify(
119
+ {
120
+ lexicon: result.lexicon,
121
+ hasUpgrade: result.hasUpgrade,
122
+ from: result.from,
123
+ to: result.to,
124
+ semver: label,
125
+ severity: result.validation?.severity ?? "none",
126
+ changed: result.validation?.changed ?? false,
127
+ delta: result.validation?.delta ?? null,
128
+ validationOk: result.validation?.ok ?? null,
129
+ failures: result.validation?.failures ?? [],
130
+ fetchError: result.fetchError,
131
+ },
132
+ null,
133
+ 2,
134
+ ),
135
+ );
136
+ return;
137
+ }
138
+
139
+ if (result.fetchError) {
140
+ console.log(c(`[${result.lexicon}] error: ${result.fetchError}`, COLORS.red));
141
+ return;
142
+ }
143
+
144
+ if (!result.hasUpgrade) {
145
+ console.log(
146
+ c(`[${result.lexicon}] up to date`, COLORS.green) +
147
+ ` pinned=${result.from}` +
148
+ (result.to ? ` latest=${result.to}` : ""),
149
+ );
150
+ return;
151
+ }
152
+
153
+ // Upgrade available
154
+ console.log(
155
+ c(`[${result.lexicon}] upgrade available`, COLORS.bold) +
156
+ ` ${result.from} -> ${result.to}`,
157
+ );
158
+
159
+ const v = result.validation;
160
+ if (v) {
161
+ // Surface delta
162
+ if (v.deltaText) {
163
+ console.log("");
164
+ console.log(v.deltaText);
165
+ } else if (v.changed) {
166
+ console.log(" Surface changed (no baseline to diff against).");
167
+ } else {
168
+ console.log(" No surface changes.");
169
+ }
170
+
171
+ // Failures
172
+ if (v.failures.length > 0) {
173
+ console.log("");
174
+ console.log(c(` ${v.failures.length} validation step(s) failed:`, COLORS.bold));
175
+ for (const f of v.failures) {
176
+ console.log(
177
+ c(
178
+ ` FAIL [${f.step}]${f.exitCode !== undefined ? ` (exit ${f.exitCode})` : ""}`,
179
+ COLORS.red,
180
+ ),
181
+ );
182
+ if (f.output) {
183
+ const indented = f.output
184
+ .split("\n")
185
+ .map((l) => ` ${l}`)
186
+ .join("\n");
187
+ console.log(c(indented, COLORS.gray));
188
+ }
189
+ }
190
+ }
191
+ }
192
+
193
+ console.log("");
194
+ const labelColor =
195
+ label === "major" ? COLORS.red : label === "minor" ? COLORS.yellow : COLORS.green;
196
+ const validationLabel = v
197
+ ? v.ok
198
+ ? c("ok", COLORS.green)
199
+ : c("FAILED", COLORS.red)
200
+ : c("skipped", COLORS.gray);
201
+ console.log(
202
+ `Validation: ${validationLabel} Semver: ${c(label, labelColor)} ${result.from} -> ${result.to}`,
203
+ );
204
+ }
@@ -1,11 +1,68 @@
1
+ import { writeFileSync, mkdirSync } from "node:fs";
2
+ import { dirname, resolve } from "node:path";
1
3
  import { buildCommand, buildCommandWatch, printErrors, printWarnings, resolveBuildFormat } from "../commands/build";
2
- import { formatError, formatInfo } from "../format";
4
+ import { formatError, formatInfo, formatSuccess, formatBold } from "../format";
3
5
  import type { CommandContext } from "../registry";
6
+ import { generateComponentsPipeline } from "../../components/cli-support";
7
+
8
+ /**
9
+ * `chant build --components --generate <lexicon>` — generate mode (#563,
10
+ * epic #551 Phase 3). Discovers `Component` declarations under `args.path`
11
+ * and synthesizes a thin CI pipeline for `lexicon` instead of running a
12
+ * normal lexicon build: no entity discovery, no serializers, no post-synth
13
+ * checks — those apply to lexicon resources, which is a different input to
14
+ * a different command path (`chant build` without `--components`).
15
+ */
16
+ async function runGenerateComponents(ctx: CommandContext): Promise<number> {
17
+ const { args } = ctx;
18
+ const lexicon = args.generate as string;
19
+
20
+ // Which lexicons support generate mode is a property of the loaded lexicon
21
+ // plugins (those implementing `generateComponentPipeline`, #688), not a
22
+ // hard-coded core list — `generateComponentsPipeline` returns a descriptive
23
+ // error when the target lexicon has no generator.
24
+ const result = await generateComponentsPipeline(args.path, lexicon, {
25
+ env: args.env,
26
+ });
27
+
28
+ if (!result.success) {
29
+ console.error(formatError({ message: result.error ?? "Failed to generate CI pipeline from components" }));
30
+ return 1;
31
+ }
32
+
33
+ const yaml = result.yaml ?? "";
34
+ if (args.format === "json") {
35
+ console.log(JSON.stringify({ stages: result.stages, jobs: result.jobs, yaml }, null, 2));
36
+ } else if (args.output) {
37
+ const outputPath = resolve(args.output);
38
+ mkdirSync(dirname(outputPath), { recursive: true });
39
+ writeFileSync(outputPath, yaml);
40
+ } else {
41
+ console.log(yaml);
42
+ }
43
+
44
+ if (args.verbose || args.output) {
45
+ console.error(
46
+ formatSuccess(
47
+ `Generated ${formatBold(lexicon)} pipeline: ${formatBold(String(result.jobs?.length ?? 0))} job(s) across ${formatBold(String(result.stages?.length ?? 0))} wave(s)`,
48
+ ),
49
+ );
50
+ }
51
+
52
+ return 0;
53
+ }
4
54
 
5
55
  export async function runBuild(ctx: CommandContext): Promise<number> {
6
56
  const { args, plugins } = ctx;
7
57
  let { serializers } = ctx;
8
58
 
59
+ // Generate mode (#563): synthesize CI YAML from components instead of
60
+ // running a normal lexicon build. Checked first since it does not need
61
+ // `serializers`/lexicon resources at all.
62
+ if (args.components && args.generate) {
63
+ return runGenerateComponents(ctx);
64
+ }
65
+
9
66
  // Filter to a single lexicon when --lexicon is specified
10
67
  if (args.lexicon) {
11
68
  serializers = serializers.filter((s) => s.name === args.lexicon);