@intentius/chant 0.124.31 → 0.124.33

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 (509) hide show
  1. package/bin/chant +7 -2
  2. package/dist/ci-jobs.d.ts +4 -0
  3. package/dist/ci-jobs.d.ts.map +1 -1
  4. package/dist/ci-jobs.js +9 -2
  5. package/dist/cli/commands/check-lexicon-plugin.d.ts +7 -4
  6. package/dist/cli/commands/check-lexicon-plugin.d.ts.map +1 -1
  7. package/dist/cli/commands/check-lexicon-plugin.js +10 -7
  8. package/dist/cli/commands/check-lexicon.d.ts.map +1 -1
  9. package/dist/cli/commands/check-lexicon.js +18 -12
  10. package/dist/cli/commands/import.d.ts +10 -0
  11. package/dist/cli/commands/import.d.ts.map +1 -1
  12. package/dist/cli/commands/import.js +37 -0
  13. package/dist/cli/commands/init-lexicon/templates/project.d.ts.map +1 -1
  14. package/dist/cli/commands/init-lexicon/templates/project.js +4 -3
  15. package/dist/cli/commands/onboard.d.ts.map +1 -1
  16. package/dist/cli/commands/onboard.js +8 -4
  17. package/dist/cli/commands/update.d.ts.map +1 -1
  18. package/dist/cli/commands/update.js +2 -1
  19. package/dist/cli/dependencies.d.ts +18 -0
  20. package/dist/cli/dependencies.d.ts.map +1 -0
  21. package/dist/cli/dependencies.js +120 -0
  22. package/dist/cli/handlers/build.d.ts.map +1 -1
  23. package/dist/cli/handlers/build.js +38 -4
  24. package/dist/cli/handlers/fan-out.d.ts.map +1 -1
  25. package/dist/cli/handlers/fan-out.js +12 -4
  26. package/dist/cli/handlers/graph.d.ts.map +1 -1
  27. package/dist/cli/handlers/graph.js +16 -6
  28. package/dist/cli/handlers/lifecycle-health.d.ts +16 -0
  29. package/dist/cli/handlers/lifecycle-health.d.ts.map +1 -0
  30. package/dist/cli/handlers/lifecycle-health.js +150 -0
  31. package/dist/cli/handlers/lifecycle.d.ts +26 -0
  32. package/dist/cli/handlers/lifecycle.d.ts.map +1 -1
  33. package/dist/cli/handlers/lifecycle.js +1 -1
  34. package/dist/cli/handlers/lint.d.ts.map +1 -1
  35. package/dist/cli/handlers/lint.js +6 -0
  36. package/dist/cli/handlers/operator.d.ts +2 -2
  37. package/dist/cli/handlers/operator.js +3 -3
  38. package/dist/cli/handlers/pr.d.ts +16 -0
  39. package/dist/cli/handlers/pr.d.ts.map +1 -1
  40. package/dist/cli/handlers/pr.js +610 -32
  41. package/dist/cli/handlers/promote.d.ts.map +1 -1
  42. package/dist/cli/handlers/promote.js +19 -2
  43. package/dist/cli/handlers/release.d.ts +16 -1
  44. package/dist/cli/handlers/release.d.ts.map +1 -1
  45. package/dist/cli/handlers/release.js +83 -11
  46. package/dist/cli/handlers/run.d.ts +13 -1
  47. package/dist/cli/handlers/run.d.ts.map +1 -1
  48. package/dist/cli/handlers/run.js +38 -15
  49. package/dist/cli/main.d.ts.map +1 -1
  50. package/dist/cli/main.js +121 -33
  51. package/dist/cli/parse-args.d.ts.map +1 -1
  52. package/dist/cli/parse-args.js +37 -0
  53. package/dist/cli/registry.d.ts +29 -6
  54. package/dist/cli/registry.d.ts.map +1 -1
  55. package/dist/cli/registry.js +6 -2
  56. package/dist/codegen/generate-post-synth-barrel.js +2 -2
  57. package/dist/codegen/lexicon-regen.d.ts +4 -0
  58. package/dist/codegen/lexicon-regen.d.ts.map +1 -1
  59. package/dist/codegen/lexicon-regen.js +1 -1
  60. package/dist/codegen/pinned-upgrade.js +2 -2
  61. package/dist/components/capability.d.ts +44 -3
  62. package/dist/components/capability.d.ts.map +1 -1
  63. package/dist/components/capability.js +21 -0
  64. package/dist/components/changed-files.d.ts +7 -1
  65. package/dist/components/changed-files.d.ts.map +1 -1
  66. package/dist/components/changed-files.js +9 -1
  67. package/dist/components/deploy-inputs.d.ts +91 -0
  68. package/dist/components/deploy-inputs.d.ts.map +1 -0
  69. package/dist/components/deploy-inputs.js +184 -0
  70. package/dist/components/driver.d.ts +38 -0
  71. package/dist/components/driver.d.ts.map +1 -1
  72. package/dist/components/driver.js +56 -6
  73. package/dist/components/fan-out-record.d.ts +6 -1
  74. package/dist/components/fan-out-record.d.ts.map +1 -1
  75. package/dist/components/fan-out-record.js +24 -0
  76. package/dist/components/fan-out-run.d.ts +20 -0
  77. package/dist/components/fan-out-run.d.ts.map +1 -1
  78. package/dist/components/fan-out-run.js +21 -1
  79. package/dist/components/gate-plan.d.ts +8 -0
  80. package/dist/components/gate-plan.d.ts.map +1 -1
  81. package/dist/components/gate-plan.js +6 -0
  82. package/dist/components/pr-pipeline.d.ts +98 -12
  83. package/dist/components/pr-pipeline.d.ts.map +1 -1
  84. package/dist/components/pr-pipeline.js +146 -23
  85. package/dist/components/pr-run.d.ts +128 -30
  86. package/dist/components/pr-run.d.ts.map +1 -1
  87. package/dist/components/pr-run.js +290 -70
  88. package/dist/components/release-compile.d.ts +37 -2
  89. package/dist/components/release-compile.d.ts.map +1 -1
  90. package/dist/components/release-compile.js +64 -8
  91. package/dist/components/release-promote.d.ts +17 -3
  92. package/dist/components/release-promote.d.ts.map +1 -1
  93. package/dist/components/release-promote.js +79 -18
  94. package/dist/components/verbs/bom-writer.d.ts +1 -1
  95. package/dist/components/verbs/bom-writer.d.ts.map +1 -1
  96. package/dist/components/verbs/lockfile-sbom-generator.d.ts +20 -0
  97. package/dist/components/verbs/lockfile-sbom-generator.d.ts.map +1 -1
  98. package/dist/components/verbs/lockfile-sbom-generator.js +41 -4
  99. package/dist/components/wave-plan.d.ts +15 -2
  100. package/dist/components/wave-plan.d.ts.map +1 -1
  101. package/dist/components/wave-plan.js +44 -5
  102. package/dist/discovery/fold-import.d.ts.map +1 -1
  103. package/dist/discovery/fold-import.js +16 -6
  104. package/dist/discovery/sandbox/bundle.d.ts.map +1 -1
  105. package/dist/discovery/sandbox/bundle.js +6 -0
  106. package/dist/discovery/specifier-resolve.d.ts.map +1 -1
  107. package/dist/discovery/specifier-resolve.js +8 -2
  108. package/dist/fold/fold.d.ts.map +1 -1
  109. package/dist/fold/fold.js +68 -1
  110. package/dist/fold/subset.d.ts +37 -0
  111. package/dist/fold/subset.d.ts.map +1 -1
  112. package/dist/fold/subset.js +88 -0
  113. package/dist/graph-detail.d.ts.map +1 -1
  114. package/dist/graph-detail.js +32 -7
  115. package/dist/health.d.ts +110 -0
  116. package/dist/health.d.ts.map +1 -0
  117. package/dist/health.js +105 -0
  118. package/dist/health.schema.json +191 -0
  119. package/dist/lexicon-module.d.ts +10 -0
  120. package/dist/lexicon-module.d.ts.map +1 -1
  121. package/dist/lexicon-module.js +53 -8
  122. package/dist/lexicon-plugin-helpers.d.ts.map +1 -1
  123. package/dist/lexicon-plugin-helpers.js +6 -4
  124. package/dist/lexicon.d.ts +29 -0
  125. package/dist/lexicon.d.ts.map +1 -1
  126. package/dist/lifecycle/affected.d.ts.map +1 -1
  127. package/dist/lifecycle/affected.js +7 -1
  128. package/dist/lifecycle/merge-record.d.ts +104 -0
  129. package/dist/lifecycle/merge-record.d.ts.map +1 -0
  130. package/dist/lifecycle/merge-record.js +102 -0
  131. package/dist/lifecycle/publish-attachments.d.ts +8 -5
  132. package/dist/lifecycle/publish-attachments.d.ts.map +1 -1
  133. package/dist/lifecycle/publish-attachments.js +27 -13
  134. package/dist/lifecycle/publish-npm.d.ts +3 -2
  135. package/dist/lifecycle/publish-npm.d.ts.map +1 -1
  136. package/dist/lifecycle/publish-npm.js +4 -3
  137. package/dist/lifecycle/release-at.d.ts +40 -0
  138. package/dist/lifecycle/release-at.d.ts.map +1 -0
  139. package/dist/lifecycle/release-at.js +83 -0
  140. package/dist/lifecycle/release-cut.d.ts.map +1 -1
  141. package/dist/lifecycle/release-cut.js +23 -12
  142. package/dist/lifecycle/release-ledger.d.ts +21 -0
  143. package/dist/lifecycle/release-ledger.d.ts.map +1 -1
  144. package/dist/lifecycle/release-ledger.js +24 -0
  145. package/dist/lifecycle/release-publish.d.ts +28 -12
  146. package/dist/lifecycle/release-publish.d.ts.map +1 -1
  147. package/dist/lifecycle/release-publish.js +29 -17
  148. package/dist/lifecycle/release-store.d.ts +25 -2
  149. package/dist/lifecycle/release-store.d.ts.map +1 -1
  150. package/dist/lifecycle/release-store.js +40 -13
  151. package/dist/lifecycle/run-ledger.d.ts.map +1 -1
  152. package/dist/lifecycle/run-ledger.js +1 -0
  153. package/dist/lifecycle/work-dir.d.ts +45 -0
  154. package/dist/lifecycle/work-dir.d.ts.map +1 -0
  155. package/dist/lifecycle/work-dir.js +78 -0
  156. package/dist/lint/discover.d.ts +17 -9
  157. package/dist/lint/discover.d.ts.map +1 -1
  158. package/dist/lint/discover.js +62 -54
  159. package/dist/lint/rules/op/index.d.ts +2 -1
  160. package/dist/lint/rules/op/index.d.ts.map +1 -1
  161. package/dist/lint/rules/op/index.js +4 -2
  162. package/dist/lint/rules/op/ops018-shell-image-digest.d.ts +10 -0
  163. package/dist/lint/rules/op/ops018-shell-image-digest.d.ts.map +1 -0
  164. package/dist/lint/rules/op/ops018-shell-image-digest.js +38 -0
  165. package/dist/module-source.d.ts +57 -0
  166. package/dist/module-source.d.ts.map +1 -0
  167. package/dist/module-source.js +104 -0
  168. package/dist/op/activities/activity-contracts.d.ts +5 -0
  169. package/dist/op/activities/activity-contracts.d.ts.map +1 -1
  170. package/dist/op/activities/activity-contracts.js +3 -0
  171. package/dist/op/activities/factory.js +1 -1
  172. package/dist/op/activities/shell.d.ts +38 -0
  173. package/dist/op/activities/shell.d.ts.map +1 -1
  174. package/dist/op/activities/shell.js +89 -3
  175. package/dist/op/builders.d.ts +7 -0
  176. package/dist/op/builders.d.ts.map +1 -1
  177. package/dist/op/builders.js +7 -0
  178. package/dist/op/discover.d.ts.map +1 -1
  179. package/dist/op/discover.js +13 -3
  180. package/dist/op/gate.d.ts.map +1 -1
  181. package/dist/op/gate.js +3 -0
  182. package/dist/op/op-waves-run.d.ts.map +1 -1
  183. package/dist/op/op-waves-run.js +20 -5
  184. package/dist/op/operator.d.ts +2 -2
  185. package/dist/op/operator.js +2 -2
  186. package/dist/op/runtime.d.ts +2 -0
  187. package/dist/op/runtime.d.ts.map +1 -1
  188. package/dist/op/steward.d.ts +6 -4
  189. package/dist/op/steward.d.ts.map +1 -1
  190. package/dist/op/steward.js +5 -3
  191. package/dist/op/work-lease-run.d.ts +20 -7
  192. package/dist/op/work-lease-run.d.ts.map +1 -1
  193. package/dist/op/work-lease-run.js +56 -12
  194. package/dist/pr-forge.d.ts +10 -0
  195. package/dist/pr-forge.d.ts.map +1 -1
  196. package/dist/pr-forge.js +39 -0
  197. package/dist/pr-loop.d.ts +155 -7
  198. package/dist/pr-loop.d.ts.map +1 -1
  199. package/dist/pr-loop.js +137 -11
  200. package/dist/pr-report-url.d.ts +4 -4
  201. package/dist/pr-report-url.d.ts.map +1 -1
  202. package/dist/pr-report-url.js +5 -5
  203. package/dist/runner-start.d.ts +179 -0
  204. package/dist/runner-start.d.ts.map +1 -0
  205. package/dist/runner-start.js +277 -0
  206. package/dist/ts-loader.d.ts +38 -4
  207. package/dist/ts-loader.d.ts.map +1 -1
  208. package/dist/ts-loader.js +190 -16
  209. package/dist/wave-runtime.mjs +238 -231
  210. package/dist/workspace/chant-migrations/fountain-retired-kinds.d.ts +34 -0
  211. package/dist/workspace/chant-migrations/fountain-retired-kinds.d.ts.map +1 -0
  212. package/dist/workspace/chant-migrations/fountain-retired-kinds.js +176 -0
  213. package/dist/workspace/chant-migrations.d.ts.map +1 -1
  214. package/dist/workspace/chant-migrations.js +2 -0
  215. package/dist/workspace/check.schema.json +70 -2
  216. package/dist/workspace/checks/boxes.d.ts +6 -6
  217. package/dist/workspace/checks/boxes.js +9 -9
  218. package/dist/workspace/checks/security.d.ts +35 -0
  219. package/dist/workspace/checks/security.d.ts.map +1 -0
  220. package/dist/workspace/checks/security.js +305 -0
  221. package/dist/workspace/checks.d.ts +2 -0
  222. package/dist/workspace/checks.d.ts.map +1 -1
  223. package/dist/workspace/checks.js +5 -0
  224. package/dist/workspace/ci-builds.d.ts +163 -0
  225. package/dist/workspace/ci-builds.d.ts.map +1 -0
  226. package/dist/workspace/ci-builds.js +315 -0
  227. package/dist/workspace/ci-green-cli.d.ts +2 -1
  228. package/dist/workspace/ci-green-cli.d.ts.map +1 -1
  229. package/dist/workspace/ci-green-cli.js +25 -5
  230. package/dist/workspace/ci-green-forge.d.ts +18 -4
  231. package/dist/workspace/ci-green-forge.d.ts.map +1 -1
  232. package/dist/workspace/ci-green-forge.js +12 -0
  233. package/dist/workspace/ci-green-workflow.d.ts +55 -1
  234. package/dist/workspace/ci-green-workflow.d.ts.map +1 -1
  235. package/dist/workspace/ci-green-workflow.js +128 -1
  236. package/dist/workspace/ci-green.d.ts +117 -16
  237. package/dist/workspace/ci-green.d.ts.map +1 -1
  238. package/dist/workspace/ci-green.js +358 -43
  239. package/dist/workspace/ci-last-green.schema.json +49 -0
  240. package/dist/workspace/ci-list.schema.json +47 -7
  241. package/dist/workspace/ci-report-url.d.ts +18 -0
  242. package/dist/workspace/ci-report-url.d.ts.map +1 -0
  243. package/dist/workspace/ci-report-url.js +33 -0
  244. package/dist/workspace/ci-run-index.d.ts +13 -1
  245. package/dist/workspace/ci-run-index.d.ts.map +1 -1
  246. package/dist/workspace/ci-run-index.js +6 -4
  247. package/dist/workspace/ci-run-index.schema.json +6 -4
  248. package/dist/workspace/ci-run.d.ts +85 -6
  249. package/dist/workspace/ci-run.d.ts.map +1 -1
  250. package/dist/workspace/ci-run.js +262 -64
  251. package/dist/workspace/ci-runner-key.d.ts +16 -3
  252. package/dist/workspace/ci-runner-key.d.ts.map +1 -1
  253. package/dist/workspace/ci-runner-key.js +30 -10
  254. package/dist/workspace/ci-runner-start.d.ts +77 -0
  255. package/dist/workspace/ci-runner-start.d.ts.map +1 -0
  256. package/dist/workspace/ci-runner-start.js +185 -0
  257. package/dist/workspace/ci-serve.d.ts +130 -11
  258. package/dist/workspace/ci-serve.d.ts.map +1 -1
  259. package/dist/workspace/ci-serve.js +323 -40
  260. package/dist/workspace/declaration.d.ts +25 -0
  261. package/dist/workspace/declaration.d.ts.map +1 -1
  262. package/dist/workspace/declaration.js +14 -2
  263. package/dist/workspace/declaration.schema.json +30 -2
  264. package/dist/workspace/export.d.ts +1 -1
  265. package/dist/workspace/export.d.ts.map +1 -1
  266. package/dist/workspace/export.js +7 -3
  267. package/dist/workspace/ls.d.ts +8 -1
  268. package/dist/workspace/ls.d.ts.map +1 -1
  269. package/dist/workspace/ls.js +2 -1
  270. package/dist/workspace/ls.schema.json +9 -2
  271. package/dist/workspace/member-pipeline.d.ts +1 -0
  272. package/dist/workspace/member-pipeline.d.ts.map +1 -1
  273. package/dist/workspace/member-pipeline.js +2 -0
  274. package/dist/workspace/merge-record.schema.json +49 -0
  275. package/dist/workspace/pin-integrity.d.ts.map +1 -1
  276. package/dist/workspace/pin-integrity.js +3 -2
  277. package/dist/workspace/pr-report.schema.json +75 -8
  278. package/dist/workspace/reason-codes.d.ts +18 -1
  279. package/dist/workspace/reason-codes.d.ts.map +1 -1
  280. package/dist/workspace/reason-codes.js +20 -2
  281. package/dist/workspace/release-candidates.d.ts +129 -0
  282. package/dist/workspace/release-candidates.d.ts.map +1 -0
  283. package/dist/workspace/release-candidates.js +233 -0
  284. package/dist/workspace/release-candidates.schema.json +353 -0
  285. package/dist/workspace/run-event.schema.json +3 -1
  286. package/dist/workspace/security.d.ts +40 -0
  287. package/dist/workspace/security.d.ts.map +1 -0
  288. package/dist/workspace/security.js +99 -0
  289. package/dist/workspace/status.schema.json +3 -1
  290. package/dist/workspace/write-scope.d.ts +9 -0
  291. package/dist/workspace/write-scope.d.ts.map +1 -1
  292. package/dist/workspace/write-scope.js +11 -1
  293. package/package.json +8 -1
  294. package/src/__fixtures__/pr-loop/pr-apply-wave-waiting.note.golden.md +48 -0
  295. package/src/__fixtures__/pr-loop/pr-plan.note.golden.md +1 -1
  296. package/src/ci-jobs.ts +11 -2
  297. package/src/cli/commands/__fixtures__/init-lexicon-output/package.json +3 -3
  298. package/src/cli/commands/audit.test.ts +2 -2
  299. package/src/cli/commands/check-lexicon-plugin.test.ts +9 -0
  300. package/src/cli/commands/check-lexicon-plugin.ts +11 -8
  301. package/src/cli/commands/check-lexicon.test.ts +1 -1
  302. package/src/cli/commands/check-lexicon.ts +16 -11
  303. package/src/cli/commands/import.ts +40 -0
  304. package/src/cli/commands/init-lexicon/templates/project.ts +4 -3
  305. package/src/cli/commands/init-lexicon.test.ts +8 -5
  306. package/src/cli/commands/onboard.test.ts +45 -0
  307. package/src/cli/commands/onboard.ts +8 -4
  308. package/src/cli/commands/update.test.ts +6 -0
  309. package/src/cli/commands/update.ts +4 -1
  310. package/src/cli/compiled-cli.e2e.test.ts +76 -11
  311. package/src/cli/dependencies.e2e.test.ts +101 -0
  312. package/src/cli/dependencies.test.ts +93 -0
  313. package/src/cli/dependencies.ts +122 -0
  314. package/src/cli/handlers/build.test.ts +105 -0
  315. package/src/cli/handlers/build.ts +35 -4
  316. package/src/cli/handlers/fan-out.test.ts +73 -0
  317. package/src/cli/handlers/fan-out.ts +11 -4
  318. package/src/cli/handlers/graph.test.ts +76 -0
  319. package/src/cli/handlers/graph.ts +19 -12
  320. package/src/cli/handlers/lifecycle-health.test.ts +123 -0
  321. package/src/cli/handlers/lifecycle-health.ts +157 -0
  322. package/src/cli/handlers/lifecycle.ts +1 -1
  323. package/src/cli/handlers/lint.test.ts +42 -0
  324. package/src/cli/handlers/lint.ts +6 -0
  325. package/src/cli/handlers/operator.ts +3 -3
  326. package/src/cli/handlers/pr-deploy-inputs.test.ts +209 -0
  327. package/src/cli/handlers/pr-record.test.ts +201 -0
  328. package/src/cli/handlers/pr-waves.test.ts +449 -0
  329. package/src/cli/handlers/pr.test.ts +156 -0
  330. package/src/cli/handlers/pr.ts +648 -33
  331. package/src/cli/handlers/promote.test.ts +43 -1
  332. package/src/cli/handlers/promote.ts +19 -3
  333. package/src/cli/handlers/release-cut-at.e2e.test.ts +115 -0
  334. package/src/cli/handlers/release-publish-targets.e2e.test.ts +2 -2
  335. package/src/cli/handlers/release-verify.e2e.test.ts +12 -10
  336. package/src/cli/handlers/release.e2e.test.ts +19 -28
  337. package/src/cli/handlers/release.ts +81 -11
  338. package/src/cli/handlers/run-components-exit.test.ts +99 -0
  339. package/src/cli/handlers/run-signer.test.ts +79 -0
  340. package/src/cli/handlers/run.ts +34 -16
  341. package/src/cli/main.test.ts +18 -0
  342. package/src/cli/main.ts +120 -33
  343. package/src/cli/parse-args.ts +28 -0
  344. package/src/cli/registry.ts +35 -8
  345. package/src/codegen/generate-post-synth-barrel.ts +2 -2
  346. package/src/codegen/lexicon-regen.ts +1 -1
  347. package/src/codegen/pinned-upgrade.ts +2 -2
  348. package/src/codegen/post-synth-barrel-guards.test.ts +6 -11
  349. package/src/components/capability.ts +51 -3
  350. package/src/components/changed-files.test.ts +16 -1
  351. package/src/components/changed-files.ts +9 -1
  352. package/src/components/deploy-inputs.test.ts +108 -0
  353. package/src/components/deploy-inputs.ts +225 -0
  354. package/src/components/driver.test.ts +36 -1
  355. package/src/components/driver.ts +87 -4
  356. package/src/components/fan-out-record.ts +29 -1
  357. package/src/components/fan-out-run.test.ts +35 -0
  358. package/src/components/fan-out-run.ts +40 -1
  359. package/src/components/gate-plan.ts +9 -0
  360. package/src/components/pr-pipeline.test.ts +100 -0
  361. package/src/components/pr-pipeline.ts +184 -28
  362. package/src/components/pr-run.test.ts +323 -18
  363. package/src/components/pr-run.ts +355 -76
  364. package/src/components/release-compile.test.ts +34 -0
  365. package/src/components/release-compile.ts +89 -8
  366. package/src/components/release-promote.test.ts +55 -2
  367. package/src/components/release-promote.ts +93 -23
  368. package/src/components/verbs/bom-writer.ts +1 -1
  369. package/src/components/verbs/lockfile-sbom-generator.test.ts +36 -0
  370. package/src/components/verbs/lockfile-sbom-generator.ts +43 -5
  371. package/src/components/wave-plan.ts +48 -8
  372. package/src/discovery/fold-host-method.test.ts +87 -0
  373. package/src/discovery/fold-import.ts +15 -5
  374. package/src/discovery/fold-package-composite.test.ts +27 -0
  375. package/src/discovery/fold-specifiers.test.ts +8 -0
  376. package/src/discovery/sandbox/bundle.ts +6 -0
  377. package/src/discovery/specifier-resolve.ts +8 -2
  378. package/src/fold/fold.test.ts +72 -0
  379. package/src/fold/fold.ts +71 -0
  380. package/src/fold/subset.test.ts +31 -0
  381. package/src/fold/subset.ts +99 -0
  382. package/src/graph-detail.test.ts +57 -0
  383. package/src/graph-detail.ts +33 -7
  384. package/src/health.schema.json +191 -0
  385. package/src/health.test.ts +62 -0
  386. package/src/health.ts +178 -0
  387. package/src/lexicon-dist.e2e.test.ts +254 -0
  388. package/src/lexicon-module.test.ts +47 -0
  389. package/src/lexicon-module.ts +49 -7
  390. package/src/lexicon-plugin-helpers.ts +6 -4
  391. package/src/lexicon.ts +43 -1
  392. package/src/lifecycle/affected.test.ts +7 -0
  393. package/src/lifecycle/affected.ts +6 -1
  394. package/src/lifecycle/merge-record.test.ts +111 -0
  395. package/src/lifecycle/merge-record.ts +154 -0
  396. package/src/lifecycle/publish-attachments.ts +25 -13
  397. package/src/lifecycle/publish-npm.ts +4 -3
  398. package/src/lifecycle/publish-targets.test.ts +34 -4
  399. package/src/lifecycle/release-at.test.ts +48 -0
  400. package/src/lifecycle/release-at.ts +100 -0
  401. package/src/lifecycle/release-cut.test.ts +41 -0
  402. package/src/lifecycle/release-cut.ts +22 -11
  403. package/src/lifecycle/release-ledger.ts +34 -0
  404. package/src/lifecycle/release-publish.test.ts +43 -13
  405. package/src/lifecycle/release-publish.ts +38 -18
  406. package/src/lifecycle/release-store.ts +57 -13
  407. package/src/lifecycle/run-ledger.test.ts +13 -0
  408. package/src/lifecycle/run-ledger.ts +1 -0
  409. package/src/lifecycle/work-dir.test.ts +77 -0
  410. package/src/lifecycle/work-dir.ts +82 -0
  411. package/src/lint/discover.test.ts +46 -2
  412. package/src/lint/discover.ts +55 -49
  413. package/src/lint/rules/op/index.ts +4 -2
  414. package/src/lint/rules/op/ops018-shell-image-digest.test.ts +60 -0
  415. package/src/lint/rules/op/ops018-shell-image-digest.ts +48 -0
  416. package/src/module-source.test.ts +85 -0
  417. package/src/module-source.ts +112 -0
  418. package/src/op/activities/activity-contracts.ts +3 -0
  419. package/src/op/activities/factory.ts +1 -1
  420. package/src/op/activities/shell-container.e2e.test.ts +67 -0
  421. package/src/op/activities/shell.test.ts +44 -1
  422. package/src/op/activities/shell.ts +110 -3
  423. package/src/op/builders.ts +7 -0
  424. package/src/op/discover-root.test.ts +31 -2
  425. package/src/op/discover.ts +14 -4
  426. package/src/op/gate.test.ts +30 -0
  427. package/src/op/gate.ts +3 -0
  428. package/src/op/op-waves-run.ts +20 -5
  429. package/src/op/op-waves.test.ts +49 -0
  430. package/src/op/operator.ts +2 -2
  431. package/src/op/runtime.ts +2 -0
  432. package/src/op/step-console.test.ts +4 -2
  433. package/src/op/steward.ts +6 -4
  434. package/src/op/work-lease-run.test.ts +88 -2
  435. package/src/op/work-lease-run.ts +52 -12
  436. package/src/pr-forge-bundle.test.ts +2 -2
  437. package/src/pr-forge.test.ts +42 -0
  438. package/src/pr-forge.ts +40 -0
  439. package/src/pr-loop-bundle.test.ts +2 -1
  440. package/src/pr-loop.test.ts +146 -1
  441. package/src/pr-loop.ts +278 -17
  442. package/src/pr-report-url.ts +7 -7
  443. package/src/runner-start-bundle.test.ts +29 -0
  444. package/src/runner-start.test.ts +179 -0
  445. package/src/runner-start.ts +329 -0
  446. package/src/terraform/__fixtures__/advise.test.ts +21 -2
  447. package/src/ts-loader.test.ts +89 -1
  448. package/src/ts-loader.ts +180 -13
  449. package/src/workspace/changes.test.ts +1 -1
  450. package/src/workspace/chant-migrations/fountain-retired-kinds.test.ts +33 -0
  451. package/src/workspace/chant-migrations/fountain-retired-kinds.ts +190 -0
  452. package/src/workspace/chant-migrations.e2e.test.ts +5 -0
  453. package/src/workspace/chant-migrations.ts +2 -0
  454. package/src/workspace/check-contract.test.ts +3 -2
  455. package/src/workspace/check.schema.json +70 -2
  456. package/src/workspace/checks/boxes.ts +9 -9
  457. package/src/workspace/checks/security.test.ts +138 -0
  458. package/src/workspace/checks/security.ts +305 -0
  459. package/src/workspace/checks.ts +5 -0
  460. package/src/workspace/ci-builds.e2e.test.ts +208 -0
  461. package/src/workspace/ci-builds.test.ts +174 -0
  462. package/src/workspace/ci-builds.ts +385 -0
  463. package/src/workspace/ci-green-builds.test.ts +180 -0
  464. package/src/workspace/ci-green-cli.test.ts +54 -0
  465. package/src/workspace/ci-green-cli.ts +26 -5
  466. package/src/workspace/ci-green-forge.ts +30 -4
  467. package/src/workspace/ci-green-runs.test.ts +53 -11
  468. package/src/workspace/ci-green-workflow.test.ts +84 -1
  469. package/src/workspace/ci-green-workflow.ts +139 -2
  470. package/src/workspace/ci-green.test.ts +6 -3
  471. package/src/workspace/ci-green.ts +408 -48
  472. package/src/workspace/ci-last-green.schema.json +49 -0
  473. package/src/workspace/ci-list.schema.json +47 -7
  474. package/src/workspace/ci-report-url.test.ts +220 -0
  475. package/src/workspace/ci-report-url.ts +33 -0
  476. package/src/workspace/ci-run-index.schema.json +6 -4
  477. package/src/workspace/ci-run-index.test.ts +42 -3
  478. package/src/workspace/ci-run-index.ts +19 -5
  479. package/src/workspace/ci-run.test.ts +203 -8
  480. package/src/workspace/ci-run.ts +295 -63
  481. package/src/workspace/ci-runner-key.test.ts +55 -17
  482. package/src/workspace/ci-runner-key.ts +36 -11
  483. package/src/workspace/ci-runner-start.test.ts +151 -0
  484. package/src/workspace/ci-runner-start.ts +193 -0
  485. package/src/workspace/ci-serve-builds.test.ts +86 -0
  486. package/src/workspace/ci-serve.test.ts +209 -6
  487. package/src/workspace/ci-serve.ts +341 -42
  488. package/src/workspace/declaration.schema.json +30 -2
  489. package/src/workspace/declaration.test.ts +40 -0
  490. package/src/workspace/declaration.ts +40 -3
  491. package/src/workspace/export.ts +6 -3
  492. package/src/workspace/ls.schema.json +9 -2
  493. package/src/workspace/ls.ts +10 -4
  494. package/src/workspace/member-pipeline.ts +2 -1
  495. package/src/workspace/merge-record.schema.json +49 -0
  496. package/src/workspace/pin-integrity.test.ts +5 -0
  497. package/src/workspace/pin-integrity.ts +3 -2
  498. package/src/workspace/pr-report.schema.json +75 -8
  499. package/src/workspace/reason-codes.test.ts +2 -0
  500. package/src/workspace/reason-codes.ts +20 -2
  501. package/src/workspace/release-candidates.schema.json +353 -0
  502. package/src/workspace/release-candidates.test.ts +106 -0
  503. package/src/workspace/release-candidates.ts +315 -0
  504. package/src/workspace/run-event.schema.json +3 -1
  505. package/src/workspace/security.test.ts +70 -0
  506. package/src/workspace/security.ts +118 -0
  507. package/src/workspace/status.schema.json +3 -1
  508. package/src/workspace/write-scope.test.ts +29 -1
  509. package/src/workspace/write-scope.ts +12 -1
@@ -0,0 +1,110 @@
1
+ /**
2
+ * Runtime health (#4177): whether a declared thing is up, read separately from
3
+ * drift.
4
+ *
5
+ * The observation family answers what is deployed (`describeResources`), what
6
+ * its properties are (`observeResourcesDeep`) and what it would do
7
+ * (`predictBehaviour`). None of them says whether a service is serving. A
8
+ * lexicon that can read that implements {@link HealthLexicon.observeHealth}
9
+ * for the types it names in `healthTypes`, and `chant lifecycle health` reports
10
+ * the answers in the {@link HEALTH_SCHEMA} shape.
11
+ *
12
+ * The verdicts follow #1089's rule. Every entity the caller asks about lands in
13
+ * exactly one place: `entities` (read, with a state), `unobserved` (the read
14
+ * failed, a hole with a reason) or `absent` (the provider says it is not
15
+ * deployed). A failed read is never `unhealthy`: `unhealthy` is something the
16
+ * provider said.
17
+ *
18
+ * Routing is not modelled. A consumer that wants rotation (a latency record
19
+ * whose health check is unhealthy is out of rotation) derives it from the
20
+ * graph's edges and these states.
21
+ */
22
+ import type { UnobservedEntity, UnobservedReason } from "./observation.js";
23
+ /** The versioned shape `chant lifecycle health --json` prints. The JSON Schema is `./health.schema.json`. */
24
+ export declare const HEALTH_SCHEMA = "chant-health/v1";
25
+ /** The `$id` of `./health.schema.json`, which the package exports as `@intentius/chant/health.schema.json`. */
26
+ export declare const HEALTH_SCHEMA_ID = "https://intentius.io/chant/schemas/health/v1/health.schema.json";
27
+ /**
28
+ * `healthy` and `unhealthy` are what the provider reported. `unknown` means the
29
+ * read succeeded and the provider's answer does not decide either way (a
30
+ * deployment still rolling, a service scaled to zero, a condition pending).
31
+ */
32
+ export type HealthState = "healthy" | "unhealthy" | "unknown";
33
+ export interface HealthEntry {
34
+ /** Entity type, e.g. `AWS::ECS::Service`. */
35
+ type: string;
36
+ state: HealthState;
37
+ /** One short line saying why, in the provider's terms. */
38
+ detail: string;
39
+ /** When chant read it (ISO 8601). */
40
+ observedAt: string;
41
+ /** When the provider last checked or changed the state, when it says (ISO 8601). */
42
+ checkedAt?: string;
43
+ }
44
+ /** What one lexicon's health read returns. */
45
+ export interface HealthReadResult {
46
+ /** Read, keyed by chant entity name, which is the graph's node id. */
47
+ entities: Record<string, HealthEntry>;
48
+ /** Could not be read. Never folded into `unhealthy`. */
49
+ unobserved: Record<string, UnobservedEntity>;
50
+ /** The provider says these are not deployed. */
51
+ absent: string[];
52
+ }
53
+ /** The options core passes a lexicon's health read. They mirror `observeResourcesDeep`'s. */
54
+ export interface HealthReadOptions {
55
+ environment: string;
56
+ buildOutput: string;
57
+ /** Only entities whose type is in the lexicon's `healthTypes`. */
58
+ entities: Map<string, {
59
+ entityType: string;
60
+ props: Record<string, unknown>;
61
+ }>;
62
+ stack?: string;
63
+ region?: string;
64
+ }
65
+ /** The two plugin members a lexicon implements to answer a health read. */
66
+ export interface HealthLexicon {
67
+ name: string;
68
+ /** Entity types {@link observeHealth} can read. Data, so core picks the entities without calling the reader. */
69
+ healthTypes?: readonly string[];
70
+ observeHealth?(options: HealthReadOptions): Promise<HealthReadResult>;
71
+ }
72
+ /**
73
+ * The entities of one lexicon a health read applies to: those whose type the
74
+ * lexicon names in `healthTypes`.
75
+ */
76
+ export declare function healthApplicable(plugin: HealthLexicon, entities: Map<string, {
77
+ entityType: string;
78
+ props: Record<string, unknown>;
79
+ }>): Map<string, {
80
+ entityType: string;
81
+ props: Record<string, unknown>;
82
+ }>;
83
+ /**
84
+ * Run one lexicon's health read. Never throws: a thrown reader reports every
85
+ * applicable entity `read-failed`. The result is made total, so an entity the
86
+ * reader forgot comes back `unobserved` rather than missing.
87
+ */
88
+ export declare function observeHealthFor(plugin: HealthLexicon, options: HealthReadOptions): Promise<HealthReadResult>;
89
+ /**
90
+ * Put every asked-about name in exactly one of the three places. A name in
91
+ * `entities` wins over the others, then `absent`, then `unobserved`; a name in
92
+ * none of them becomes `read-failed`.
93
+ */
94
+ export declare function totalHealth(names: string[], result: HealthReadResult, types?: Map<string, {
95
+ entityType: string;
96
+ }>): HealthReadResult;
97
+ /** Counts across a health read, for the summary line and `--json`. */
98
+ export interface HealthSummary {
99
+ healthy: number;
100
+ unhealthy: number;
101
+ unknown: number;
102
+ unobserved: number;
103
+ absent: number;
104
+ }
105
+ export declare function summarizeHealth(results: Iterable<HealthReadResult>): HealthSummary;
106
+ /** A health entry, for a reader building its result. */
107
+ export declare function healthEntry(type: string, state: HealthState, detail: string, observedAt: string, checkedAt?: string): HealthEntry;
108
+ /** A hole, for a reader building its result. */
109
+ export declare function healthHole(type: string, reason: UnobservedReason, detail: string): UnobservedEntity;
110
+ //# sourceMappingURL=health.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health.d.ts","sourceRoot":"","sources":["../src/health.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAGxE,6GAA6G;AAC7G,eAAO,MAAM,aAAa,oBAAoB,CAAC;AAE/C,+GAA+G;AAC/G,eAAO,MAAM,gBAAgB,oEAAoE,CAAC;AAElG;;;;GAIG;AACH,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,WAAW,GAAG,SAAS,CAAC;AAE9D,MAAM,WAAW,WAAW;IAC1B,6CAA6C;IAC7C,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,WAAW,CAAC;IACnB,0DAA0D;IAC1D,MAAM,EAAE,MAAM,CAAC;IACf,qCAAqC;IACrC,UAAU,EAAE,MAAM,CAAC;IACnB,oFAAoF;IACpF,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,8CAA8C;AAC9C,MAAM,WAAW,gBAAgB;IAC/B,sEAAsE;IACtE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IACtC,wDAAwD;IACxD,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IAC7C,gDAAgD;IAChD,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,6FAA6F;AAC7F,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,kEAAkE;IAClE,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC,CAAC;IAC9E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,2EAA2E;AAC3E,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,gHAAgH;IAChH,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAChC,aAAa,CAAC,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;CACvE;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,aAAa,EACrB,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,CAAC,GAC5E,GAAG,CAAC,MAAM,EAAE;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,CAAC,CAKrE;AAED;;;;GAIG;AACH,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,aAAa,EACrB,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC,gBAAgB,CAAC,CAkB3B;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CACzB,KAAK,EAAE,MAAM,EAAE,EACf,MAAM,EAAE,gBAAgB,EACxB,KAAK,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE;IAAE,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC,GAC1C,gBAAgB,CAalB;AAED,sEAAsE;AACtE,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,QAAQ,CAAC,gBAAgB,CAAC,GAAG,aAAa,CAQlF;AAED,wDAAwD;AACxD,wBAAgB,WAAW,CACzB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,WAAW,EAClB,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,SAAS,CAAC,EAAE,MAAM,GACjB,WAAW,CAEb;AAED,gDAAgD;AAChD,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,GAAG,gBAAgB,CAEnG"}
package/dist/health.js ADDED
@@ -0,0 +1,105 @@
1
+ /**
2
+ * Runtime health (#4177): whether a declared thing is up, read separately from
3
+ * drift.
4
+ *
5
+ * The observation family answers what is deployed (`describeResources`), what
6
+ * its properties are (`observeResourcesDeep`) and what it would do
7
+ * (`predictBehaviour`). None of them says whether a service is serving. A
8
+ * lexicon that can read that implements {@link HealthLexicon.observeHealth}
9
+ * for the types it names in `healthTypes`, and `chant lifecycle health` reports
10
+ * the answers in the {@link HEALTH_SCHEMA} shape.
11
+ *
12
+ * The verdicts follow #1089's rule. Every entity the caller asks about lands in
13
+ * exactly one place: `entities` (read, with a state), `unobserved` (the read
14
+ * failed, a hole with a reason) or `absent` (the provider says it is not
15
+ * deployed). A failed read is never `unhealthy`: `unhealthy` is something the
16
+ * provider said.
17
+ *
18
+ * Routing is not modelled. A consumer that wants rotation (a latency record
19
+ * whose health check is unhealthy is out of rotation) derives it from the
20
+ * graph's edges and these states.
21
+ */
22
+ import { unobservedAll } from "./observation.js";
23
+ /** The versioned shape `chant lifecycle health --json` prints. The JSON Schema is `./health.schema.json`. */
24
+ export const HEALTH_SCHEMA = "chant-health/v1";
25
+ /** The `$id` of `./health.schema.json`, which the package exports as `@intentius/chant/health.schema.json`. */
26
+ export const HEALTH_SCHEMA_ID = "https://intentius.io/chant/schemas/health/v1/health.schema.json";
27
+ /**
28
+ * The entities of one lexicon a health read applies to: those whose type the
29
+ * lexicon names in `healthTypes`.
30
+ */
31
+ export function healthApplicable(plugin, entities) {
32
+ const types = new Set(plugin.healthTypes ?? []);
33
+ const out = new Map();
34
+ for (const [name, entity] of entities)
35
+ if (types.has(entity.entityType))
36
+ out.set(name, entity);
37
+ return out;
38
+ }
39
+ /**
40
+ * Run one lexicon's health read. Never throws: a thrown reader reports every
41
+ * applicable entity `read-failed`. The result is made total, so an entity the
42
+ * reader forgot comes back `unobserved` rather than missing.
43
+ */
44
+ export async function observeHealthFor(plugin, options) {
45
+ const names = [...options.entities.keys()];
46
+ if (names.length === 0)
47
+ return { entities: {}, unobserved: {}, absent: [] };
48
+ if (!plugin.observeHealth) {
49
+ return {
50
+ entities: {},
51
+ unobserved: unobservedAll(names, "unsupported-kind", `${plugin.name} has no health read`, options.entities),
52
+ absent: [],
53
+ };
54
+ }
55
+ let result;
56
+ try {
57
+ result = await plugin.observeHealth(options);
58
+ }
59
+ catch (err) {
60
+ const message = err instanceof Error ? err.message : String(err);
61
+ return { entities: {}, unobserved: unobservedAll(names, "read-failed", message, options.entities), absent: [] };
62
+ }
63
+ return totalHealth(names, result, options.entities);
64
+ }
65
+ /**
66
+ * Put every asked-about name in exactly one of the three places. A name in
67
+ * `entities` wins over the others, then `absent`, then `unobserved`; a name in
68
+ * none of them becomes `read-failed`.
69
+ */
70
+ export function totalHealth(names, result, types) {
71
+ const entities = {};
72
+ const unobserved = {};
73
+ const absentSet = new Set(result.absent ?? []);
74
+ const absent = [];
75
+ for (const name of names) {
76
+ const entry = result.entities?.[name];
77
+ if (entry)
78
+ entities[name] = entry;
79
+ else if (absentSet.has(name))
80
+ absent.push(name);
81
+ else if (result.unobserved?.[name])
82
+ unobserved[name] = result.unobserved[name];
83
+ else
84
+ Object.assign(unobserved, unobservedAll([name], "read-failed", "the health read returned no answer for this entity", types));
85
+ }
86
+ return { entities, unobserved, absent };
87
+ }
88
+ export function summarizeHealth(results) {
89
+ const summary = { healthy: 0, unhealthy: 0, unknown: 0, unobserved: 0, absent: 0 };
90
+ for (const r of results) {
91
+ for (const entry of Object.values(r.entities))
92
+ summary[entry.state]++;
93
+ summary.unobserved += Object.keys(r.unobserved).length;
94
+ summary.absent += r.absent.length;
95
+ }
96
+ return summary;
97
+ }
98
+ /** A health entry, for a reader building its result. */
99
+ export function healthEntry(type, state, detail, observedAt, checkedAt) {
100
+ return { type, state, detail, observedAt, ...(checkedAt ? { checkedAt } : {}) };
101
+ }
102
+ /** A hole, for a reader building its result. */
103
+ export function healthHole(type, reason, detail) {
104
+ return { type, reason, detail };
105
+ }
@@ -0,0 +1,191 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://intentius.io/chant/schemas/health/v1/health.schema.json",
4
+ "title": "chant-health/v1",
5
+ "description": "What `chant lifecycle health <env> --json` prints (#4177): whether each declared resource that has a health read is up, read separately from drift. Every entity a read applies to lands in exactly one of `entities` (read, with a state), `unobserved` (the read failed, never folded into unhealthy) or `absent` (the provider says it is not deployed). Entity names are the graph's node ids. A single-stack project puts `lexicons` at the top level; a multi-stack one nests them under `stacks`. Written by the first chant release after 0.124.32. Readers ignore fields they do not know; a field is only ever added within a version.",
6
+ "type": "object",
7
+ "required": [
8
+ "schema",
9
+ "chantVersion",
10
+ "environment",
11
+ "observedAt",
12
+ "summary"
13
+ ],
14
+ "properties": {
15
+ "schema": {
16
+ "const": "chant-health/v1"
17
+ },
18
+ "chantVersion": {
19
+ "type": "string",
20
+ "description": "The chant that ran the read."
21
+ },
22
+ "environment": {
23
+ "type": "string",
24
+ "description": "The environment named on the command line."
25
+ },
26
+ "observedAt": {
27
+ "type": "string",
28
+ "description": "When the command started reading, ISO 8601 UTC."
29
+ },
30
+ "summary": {
31
+ "type": "object",
32
+ "required": [
33
+ "healthy",
34
+ "unhealthy",
35
+ "unknown",
36
+ "unobserved",
37
+ "absent"
38
+ ],
39
+ "description": "Counts over every lexicon and stack.",
40
+ "properties": {
41
+ "healthy": {
42
+ "type": "integer",
43
+ "minimum": 0
44
+ },
45
+ "unhealthy": {
46
+ "type": "integer",
47
+ "minimum": 0
48
+ },
49
+ "unknown": {
50
+ "type": "integer",
51
+ "minimum": 0
52
+ },
53
+ "unobserved": {
54
+ "type": "integer",
55
+ "minimum": 0
56
+ },
57
+ "absent": {
58
+ "type": "integer",
59
+ "minimum": 0
60
+ }
61
+ }
62
+ }
63
+ },
64
+ "oneOf": [
65
+ {
66
+ "required": [
67
+ "lexicons"
68
+ ],
69
+ "properties": {
70
+ "lexicons": {
71
+ "$ref": "#/$defs/byLexicon"
72
+ }
73
+ }
74
+ },
75
+ {
76
+ "required": [
77
+ "stacks"
78
+ ],
79
+ "properties": {
80
+ "stacks": {
81
+ "type": "object",
82
+ "description": "Per stack name, the same per-lexicon results.",
83
+ "additionalProperties": {
84
+ "$ref": "#/$defs/byLexicon"
85
+ }
86
+ }
87
+ }
88
+ }
89
+ ],
90
+ "$defs": {
91
+ "byLexicon": {
92
+ "type": "object",
93
+ "description": "Per lexicon name, that lexicon's read. A lexicon with no applicable entity is left out.",
94
+ "additionalProperties": {
95
+ "$ref": "#/$defs/read"
96
+ }
97
+ },
98
+ "read": {
99
+ "type": "object",
100
+ "required": [
101
+ "entities",
102
+ "unobserved",
103
+ "absent"
104
+ ],
105
+ "properties": {
106
+ "entities": {
107
+ "type": "object",
108
+ "additionalProperties": {
109
+ "$ref": "#/$defs/entry"
110
+ }
111
+ },
112
+ "unobserved": {
113
+ "type": "object",
114
+ "additionalProperties": {
115
+ "$ref": "#/$defs/hole"
116
+ }
117
+ },
118
+ "absent": {
119
+ "type": "array",
120
+ "items": {
121
+ "type": "string"
122
+ },
123
+ "description": "Entity names the provider says are not deployed."
124
+ }
125
+ }
126
+ },
127
+ "entry": {
128
+ "type": "object",
129
+ "required": [
130
+ "type",
131
+ "state",
132
+ "detail",
133
+ "observedAt"
134
+ ],
135
+ "properties": {
136
+ "type": {
137
+ "type": "string",
138
+ "description": "Entity type, such as AWS::ECS::Service."
139
+ },
140
+ "state": {
141
+ "enum": [
142
+ "healthy",
143
+ "unhealthy",
144
+ "unknown"
145
+ ],
146
+ "description": "healthy and unhealthy are what the provider reported. unknown means the read succeeded and the answer decides neither way: a rollout in progress, a service scaled to zero, a condition pending."
147
+ },
148
+ "detail": {
149
+ "type": "string",
150
+ "description": "One short line saying why, in the provider's terms."
151
+ },
152
+ "observedAt": {
153
+ "type": "string",
154
+ "description": "When chant read it, ISO 8601."
155
+ },
156
+ "checkedAt": {
157
+ "type": "string",
158
+ "description": "When the provider last checked or changed the state, when it says, ISO 8601."
159
+ }
160
+ }
161
+ },
162
+ "hole": {
163
+ "type": "object",
164
+ "required": [
165
+ "reason"
166
+ ],
167
+ "description": "A read that failed. Never counted as unhealthy.",
168
+ "properties": {
169
+ "type": {
170
+ "type": "string"
171
+ },
172
+ "reason": {
173
+ "enum": [
174
+ "read-failed",
175
+ "no-credentials",
176
+ "no-binding",
177
+ "unsupported-kind",
178
+ "filtered"
179
+ ]
180
+ },
181
+ "detail": {
182
+ "type": "string"
183
+ },
184
+ "queried": {
185
+ "type": "string",
186
+ "description": "The address the read was issued against, when the lexicon reports it."
187
+ }
188
+ }
189
+ }
190
+ }
191
+ }
@@ -97,6 +97,9 @@ export declare function resetLexiconModules(): void;
97
97
  * `typeScript: false` imports it with plain node, without registering tsx
98
98
  * (#3276): tsx's ESM hooks run on a thread of their own, which costs the
99
99
  * compiled CLI about 200 MB, so a caller whose module is JavaScript says so.
100
+ * Left out, the module's extension decides (#3981): a `.js` or `.mjs` module
101
+ * imports with plain node, and anything else (`.ts`, or no extension, which
102
+ * only tsx's resolver completes) registers tsx first.
100
103
  */
101
104
  export declare function importLexiconModule(name: string, options?: {
102
105
  typeScript?: boolean;
@@ -133,6 +136,13 @@ export declare function resolveFromProject(spec: string, fromDir?: string): stri
133
136
  * that installs its lexicons in its own node_modules, it is resolved from
134
137
  * `fromDir` (the project) and imported from there. Any other failure, and a
135
138
  * package the project doesn't have either, rethrows the first error.
139
+ *
140
+ * #3981 — tsx is registered only when the module resolves to TypeScript. A
141
+ * lexicon that ships compiled JS imports with plain node. The module is
142
+ * resolved before it is imported, because a failed import is cached: one
143
+ * tried without tsx cannot be tried again with it. A resolution that fails
144
+ * for any reason but a missing package registers tsx, whose resolver may
145
+ * still complete it.
136
146
  */
137
147
  export declare function importLexiconPackage(spec: string, fromDir?: string): Promise<Record<string, unknown>>;
138
148
  //# sourceMappingURL=lexicon-module.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"lexicon-module.d.ts","sourceRoot":"","sources":["../src/lexicon-module.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAQH;;;;GAIG;AACH,MAAM,MAAM,kBAAkB,GAAG,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAE1F,mEAAmE;AACnE,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,kBAAkB,GAAG,MAAM,CAExE;AAED,iFAAiF;AACjF,wBAAgB,YAAY,CAAC,OAAO,EAAE,SAAS,kBAAkB,EAAE,GAAG,MAAM,EAAE,CAAC;AAC/E,wBAAgB,YAAY,CAAC,OAAO,EAAE,SAAS,kBAAkB,EAAE,GAAG,SAAS,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC;AAiBvG;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,eAAe,CAC7B,KAAK,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,EACxC,OAAO,EAAE,MAAM,EACf,SAAS,SAAM,GACd;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAgBrC;AAED;;;;;;;;;GASG;AACH,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,SAAS,kBAAkB,EAAE,GAAG,SAAS,EAClD,OAAO,EAAE,MAAM,EACf,SAAS,CAAC,EAAE,MAAM,GACjB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAgBxB;AAMD;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,SAAS,kBAAkB,EAAE,EAAE,OAAO,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAM3G;AAED,2DAA2D;AAC3D,wBAAgB,sBAAsB,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAE5D;AAED,sGAAsG;AACtG,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAElE;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAElE;AAED,6CAA6C;AAC7C,wBAAgB,mBAAmB,IAAI,IAAI,CAG1C;AAED;;;;;;;;GAQG;AACH,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE;IAAE,UAAU,CAAC,EAAE,OAAO,CAAA;CAAO,GACrC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC,CAY9C;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,MAAsB,EAC/B,KAAK,GAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAe,GAC/C,MAAM,CAKR;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,SAAS,MAAM,EAAE,EACxB,KAAK,GAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAe,GAC/C,MAAM,EAAE,CAEV;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAI9D;AAUD;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,MAAsB,GAAG,MAAM,GAAG,SAAS,CAMpG;AAED;;;;;;;;GAQG;AACH,wBAAsB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,MAAsB,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAW1H"}
1
+ {"version":3,"file":"lexicon-module.d.ts","sourceRoot":"","sources":["../src/lexicon-module.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AASH;;;;GAIG;AACH,MAAM,MAAM,kBAAkB,GAAG,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAE1F,mEAAmE;AACnE,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,kBAAkB,GAAG,MAAM,CAExE;AAED,iFAAiF;AACjF,wBAAgB,YAAY,CAAC,OAAO,EAAE,SAAS,kBAAkB,EAAE,GAAG,MAAM,EAAE,CAAC;AAC/E,wBAAgB,YAAY,CAAC,OAAO,EAAE,SAAS,kBAAkB,EAAE,GAAG,SAAS,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC;AAiBvG;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,eAAe,CAC7B,KAAK,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,EACxC,OAAO,EAAE,MAAM,EACf,SAAS,SAAM,GACd;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAgBrC;AAED;;;;;;;;;GASG;AACH,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,SAAS,kBAAkB,EAAE,GAAG,SAAS,EAClD,OAAO,EAAE,MAAM,EACf,SAAS,CAAC,EAAE,MAAM,GACjB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAgBxB;AAMD;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,SAAS,kBAAkB,EAAE,EAAE,OAAO,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAM3G;AAED,2DAA2D;AAC3D,wBAAgB,sBAAsB,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAE5D;AAED,sGAAsG;AACtG,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAElE;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAElE;AAED,6CAA6C;AAC7C,wBAAgB,mBAAmB,IAAI,IAAI,CAG1C;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE;IAAE,UAAU,CAAC,EAAE,OAAO,CAAA;CAAO,GACrC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC,CAa9C;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,MAAsB,EAC/B,KAAK,GAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAe,GAC/C,MAAM,CAKR;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,SAAS,MAAM,EAAE,EACxB,KAAK,GAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAe,GAC/C,MAAM,EAAE,CAEV;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAI9D;AAUD;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,MAAsB,GAAG,MAAM,GAAG,SAAS,CAMpG;AAcD;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,MAAsB,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAqB1H"}
@@ -26,8 +26,9 @@
26
26
  import { createRequire } from "node:module";
27
27
  import { dirname, isAbsolute, join, relative, resolve, sep } from "node:path";
28
28
  import { pathToFileURL } from "node:url";
29
- import { ensureTypeScriptLoader } from "./ts-loader.js";
29
+ import { ensureTypeScriptLoader, ensureTypeScriptLoaderFor, typeScriptLoaderPending } from "./ts-loader.js";
30
30
  import { esModuleNamespace } from "./module-interop.js";
31
+ import { isJavaScriptModule } from "./module-source.js";
31
32
  /** The lexicon name an entry declares, whichever form it takes. */
32
33
  export function lexiconDeclarationName(entry) {
33
34
  return typeof entry === "string" ? entry : entry.name;
@@ -154,13 +155,17 @@ export function resetLexiconModules() {
154
155
  * `typeScript: false` imports it with plain node, without registering tsx
155
156
  * (#3276): tsx's ESM hooks run on a thread of their own, which costs the
156
157
  * compiled CLI about 200 MB, so a caller whose module is JavaScript says so.
158
+ * Left out, the module's extension decides (#3981): a `.js` or `.mjs` module
159
+ * imports with plain node, and anything else (`.ts`, or no extension, which
160
+ * only tsx's resolver completes) registers tsx first.
157
161
  */
158
162
  export async function importLexiconModule(name, options = {}) {
159
163
  const path = modulePaths.get(name);
160
164
  if (path === undefined)
161
165
  return undefined;
162
166
  try {
163
- if (options.typeScript !== false)
167
+ const typeScript = options.typeScript ?? !isJavaScriptModule(path);
168
+ if (typeScript)
164
169
  ensureTypeScriptLoader();
165
170
  return esModuleNamespace((await import(path)));
166
171
  }
@@ -221,6 +226,19 @@ export function resolveFromProject(spec, fromDir = process.cwd()) {
221
226
  return undefined;
222
227
  }
223
228
  }
229
+ /**
230
+ * #3981 — where `spec` resolves from this module, as `import(spec)` here
231
+ * would resolve it. Throws as the import would when it cannot be resolved.
232
+ * An absolute path is its own file URL.
233
+ */
234
+ function resolveImport(spec) {
235
+ if (isAbsolute(spec))
236
+ return pathToFileURL(spec).href;
237
+ const resolveMeta = import.meta.resolve;
238
+ if (typeof resolveMeta === "function")
239
+ return resolveMeta(spec);
240
+ return pathToFileURL(createRequire(import.meta.url).resolve(spec)).href;
241
+ }
224
242
  /**
225
243
  * chant#2845 — import a lexicon package, or one of its subpaths, by its bare
226
244
  * specifier. chant's own install is tried first, as a bare `import()` always
@@ -229,19 +247,46 @@ export function resolveFromProject(spec, fromDir = process.cwd()) {
229
247
  * that installs its lexicons in its own node_modules, it is resolved from
230
248
  * `fromDir` (the project) and imported from there. Any other failure, and a
231
249
  * package the project doesn't have either, rethrows the first error.
250
+ *
251
+ * #3981 — tsx is registered only when the module resolves to TypeScript. A
252
+ * lexicon that ships compiled JS imports with plain node. The module is
253
+ * resolved before it is imported, because a failed import is cached: one
254
+ * tried without tsx cannot be tried again with it. A resolution that fails
255
+ * for any reason but a missing package registers tsx, whose resolver may
256
+ * still complete it.
232
257
  */
233
258
  export async function importLexiconPackage(spec, fromDir = process.cwd()) {
259
+ const pkg = packageNameOf(spec);
260
+ if (typeScriptLoaderPending()) {
261
+ let resolved;
262
+ try {
263
+ resolved = resolveImport(spec);
264
+ }
265
+ catch (err) {
266
+ if (pkg === undefined || !isPackageNotFound(err, pkg)) {
267
+ ensureTypeScriptLoader();
268
+ }
269
+ else {
270
+ return importFromProject(spec, fromDir, err);
271
+ }
272
+ }
273
+ if (resolved !== undefined)
274
+ ensureTypeScriptLoaderFor(resolved);
275
+ }
234
276
  try {
235
- ensureTypeScriptLoader();
236
277
  return esModuleNamespace((await import(spec)));
237
278
  }
238
279
  catch (err) {
239
- const pkg = packageNameOf(spec);
240
280
  if (pkg === undefined || !isPackageNotFound(err, pkg))
241
281
  throw err;
242
- const resolved = resolveFromProject(spec, fromDir);
243
- if (resolved === undefined)
244
- throw err;
245
- return esModuleNamespace((await import(pathToFileURL(resolved).href)));
282
+ return importFromProject(spec, fromDir, err);
246
283
  }
247
284
  }
285
+ /** The project's copy of `spec`, for {@link importLexiconPackage}. Rethrows `err` when the project has none. */
286
+ async function importFromProject(spec, fromDir, err) {
287
+ const resolved = resolveFromProject(spec, fromDir);
288
+ if (resolved === undefined)
289
+ throw err;
290
+ ensureTypeScriptLoaderFor(resolved);
291
+ return esModuleNamespace((await import(pathToFileURL(resolved).href)));
292
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"lexicon-plugin-helpers.d.ts","sourceRoot":"","sources":["../src/lexicon-plugin-helpers.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AACjD,OAAO,KAAK,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAChF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAI/C;;;GAGG;AACH,MAAM,MAAM,aAAa,GAAG,IAAI,CAAC,eAAe,EAAE,SAAS,CAAC,GAAG;IAC7D,sEAAsE;IACtE,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,kBAAkB,CAChC,aAAa,EAAE,MAAM,EACrB,KAAK,EAAE,aAAa,EAAE,GACrB,MAAM,eAAe,EAAE,CAYzB;AAID;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAC5B,UAAU,EAAE,UAAU,EACtB,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,GAClB,mBAAmB,CAsBrB;AAID;;;;;;;;;;;;;GAaG;AACH,wBAAgB,qBAAqB,CACnC,aAAa,EAAE,MAAM,EACrB,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,eAAe,EAAE,MAAM,EACvB,WAAW,EAAE,MAAM,GAClB,uBAAuB,CAmBzB"}
1
+ {"version":3,"file":"lexicon-plugin-helpers.d.ts","sourceRoot":"","sources":["../src/lexicon-plugin-helpers.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AACjD,OAAO,KAAK,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAChF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAI/C;;;GAGG;AACH,MAAM,MAAM,aAAa,GAAG,IAAI,CAAC,eAAe,EAAE,SAAS,CAAC,GAAG;IAC7D,sEAAsE;IACtE,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,kBAAkB,CAChC,aAAa,EAAE,MAAM,EACrB,KAAK,EAAE,aAAa,EAAE,GACrB,MAAM,eAAe,EAAE,CAazB;AAID;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAC5B,UAAU,EAAE,UAAU,EACtB,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,GAClB,mBAAmB,CAsBrB;AAID;;;;;;;;;;;;;GAaG;AACH,wBAAgB,qBAAqB,CACnC,aAAa,EAAE,MAAM,EACrB,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,eAAe,EAAE,MAAM,EACvB,WAAW,EAAE,MAAM,GAClB,uBAAuB,CAoBzB"}
@@ -6,8 +6,8 @@
6
6
  * MCP diff tool, and MCP catalog resource.
7
7
  */
8
8
  import { readFileSync } from "fs";
9
- import { join, dirname } from "path";
10
- import { fileURLToPath } from "url";
9
+ import { join } from "path";
10
+ import { moduleSourceDir } from "./module-source.js";
11
11
  /**
12
12
  * Create a skills loader that reads .md files from a lexicon's skills directory.
13
13
  *
@@ -25,7 +25,8 @@ import { fileURLToPath } from "url";
25
25
  */
26
26
  export function createSkillsLoader(importMetaUrl, specs) {
27
27
  return () => {
28
- const skillsDir = join(dirname(fileURLToPath(importMetaUrl)), "skills");
28
+ // Skills are markdown beside the source; a compiled plugin finds them under src/ (#3981).
29
+ const skillsDir = join(moduleSourceDir(importMetaUrl), "skills");
29
30
  return specs.map(({ file, ...meta }) => {
30
31
  try {
31
32
  const content = readFileSync(join(skillsDir, file), "utf-8");
@@ -91,7 +92,8 @@ export function createCatalogResource(importMetaUrl, name, description, lexiconJ
91
92
  description,
92
93
  mimeType: "application/json",
93
94
  async handler() {
94
- const dir = dirname(fileURLToPath(importMetaUrl));
95
+ // Generated JSON sits beside the source; a compiled plugin finds it under src/ (#3981).
96
+ const dir = moduleSourceDir(importMetaUrl);
95
97
  const lexicon = JSON.parse(readFileSync(join(dir, "generated", lexiconJsonFile), "utf-8"));
96
98
  const entries = Object.entries(lexicon).map(([className, entry]) => ({
97
99
  className,
package/dist/lexicon.d.ts CHANGED
@@ -41,6 +41,7 @@ export type { CommandGroup, CommandGroupCommand, CommandGroupContext } from "./c
41
41
  export type { ReferenceCatalog, IdentityRule, RefRule } from "./graph-refs.js";
42
42
  export type { IREdge } from "./graph-ir.js";
43
43
  export type { DescribeResourcesResult, ObservationResult, NormalizedObservation, UnobservedEntity, UnobservedReason, } from "./observation.js";
44
+ export type { HealthEntry, HealthReadOptions, HealthReadResult, HealthState, } from "./health.js";
44
45
  export type { DescribeIdentityOptions, DescribeIdentityResult, ResolvedIdentity, UnresolvedIdentity, IdentityRow, IdentityStatus, } from "./identity.js";
45
46
  export type { Disruption, DisruptionQuery, DisruptionVerdict, DisruptionClassifier, } from "./lifecycle/disruption.js";
46
47
  export type { DeepObservationResult, DeepResourceObservation, NormalizedDeepObservation, DeepNormalizationHooks, DeepNode, DeepArrayElement, DeepSide, } from "./deep-observation.js";
@@ -470,6 +471,8 @@ export interface ComponentPipelineOptions {
470
471
  * `wave-<k>` runs `chant components fan-out --wave-gate <gate> --wave <k>`
471
472
  * and hands the attempt record to the next job. See
472
473
  * `components/gated-wave-pipeline.ts`. Unset, the pipeline is unchanged.
474
+ * Beside `prLoop` (#4003) it gives the pull request's apply a gate per
475
+ * wave instead: one apply job per wave (`prLoopWithWaves`).
473
476
  */
474
477
  gatedWaves?: GatedWavePipelineOptions;
475
478
  /**
@@ -587,6 +590,15 @@ export type OpTrigger = {
587
590
  } | {
588
591
  kind: "push";
589
592
  branches?: string[];
593
+ /**
594
+ * Which pushes run the Op (#4169), for an Op a `ci.green` phase names
595
+ * with `build` and the tick reads from chant runs. `every`: each
596
+ * commit, in a run of its own that no later push cancels. `newest`:
597
+ * one run at a time, the newest push waiting and the ones between
598
+ * dropped, plus a run at each `ci/build/<sha>` tag the tick or `ci run
599
+ * --at` pushes. Absent: one run at a time per Op, as before.
600
+ */
601
+ build?: "every" | "newest";
590
602
  };
591
603
  /**
592
604
  * One step a generated Op job runs between the checkout and the
@@ -1615,6 +1627,23 @@ export interface LexiconPlugin {
1615
1627
  /** Restrict to chant-owned resources (#119). A lexicon with no marker channel on this path says so. */
1616
1628
  owned?: boolean;
1617
1629
  }): Promise<DeepObservationResult>;
1630
+ /**
1631
+ * Entity types {@link observeHealth} reads (#4177). Data, not a method, so
1632
+ * core picks the entities a health read applies to without calling it.
1633
+ */
1634
+ healthTypes?: readonly string[];
1635
+ /**
1636
+ * Whether each declared entity of a {@link healthTypes} type is up (#4177),
1637
+ * read separately from drift: a service's running count, a health check's
1638
+ * checkers, a revision's running state, a Ready condition.
1639
+ *
1640
+ * Every entity in `options.entities` lands in exactly one of `entities`,
1641
+ * `unobserved` or `absent`. A read that failed is `unobserved` with a reason,
1642
+ * never `unhealthy`: `unhealthy` is something the provider said. Throwing is
1643
+ * the whole-lexicon failure, and core reports every entity `read-failed`.
1644
+ * Endpoint overrides apply as on the other reads, so an emulator answers.
1645
+ */
1646
+ observeHealth?(options: import("./health.js").HealthReadOptions): Promise<import("./health.js").HealthReadResult>;
1618
1647
  /**
1619
1648
  * This lexicon's noise rules for deep observation (#1014): which fields are
1620
1649
  * read-only / server-populated / controller-managed / provider-defaulted, and