@intentius/chant 0.101.0 → 0.102.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (427) hide show
  1. package/dist/agents/checks.d.ts.map +1 -1
  2. package/dist/attrref.d.ts.map +1 -1
  3. package/dist/audit/discover.d.ts.map +1 -1
  4. package/dist/audit/nginx.d.ts.map +1 -1
  5. package/dist/audit/prior-art.d.ts +48 -0
  6. package/dist/audit/prior-art.d.ts.map +1 -1
  7. package/dist/behaviour-kinds.d.ts.map +1 -1
  8. package/dist/builder.d.ts.map +1 -1
  9. package/dist/cli/commands/carve-emit.d.ts.map +1 -1
  10. package/dist/cli/commands/check-lexicon.d.ts +16 -0
  11. package/dist/cli/commands/check-lexicon.d.ts.map +1 -1
  12. package/dist/cli/commands/import.d.ts +8 -0
  13. package/dist/cli/commands/import.d.ts.map +1 -1
  14. package/dist/cli/commands/init-lexicon.d.ts.map +1 -1
  15. package/dist/cli/commands/init.d.ts +19 -0
  16. package/dist/cli/commands/init.d.ts.map +1 -1
  17. package/dist/cli/commands/onboard.d.ts +9 -0
  18. package/dist/cli/commands/onboard.d.ts.map +1 -1
  19. package/dist/cli/commands/pinned-upgrade.d.ts +19 -5
  20. package/dist/cli/commands/pinned-upgrade.d.ts.map +1 -1
  21. package/dist/cli/handlers/dev.d.ts.map +1 -1
  22. package/dist/cli/handlers/lifecycle.d.ts.map +1 -1
  23. package/dist/cli/handlers/misc.d.ts.map +1 -1
  24. package/dist/cli/handlers/operator.d.ts +9 -0
  25. package/dist/cli/handlers/operator.d.ts.map +1 -1
  26. package/dist/cli/handlers/run.d.ts.map +1 -1
  27. package/dist/cli/lsp/server.d.ts.map +1 -1
  28. package/dist/cli/main.d.ts.map +1 -1
  29. package/dist/cli/mcp/server.d.ts.map +1 -1
  30. package/dist/cli/mcp/tools/build.d.ts.map +1 -1
  31. package/dist/cli/mcp/tools/composites.d.ts.map +1 -1
  32. package/dist/cli/mcp/tools/explain.d.ts.map +1 -1
  33. package/dist/cli/mcp/tools/import.d.ts.map +1 -1
  34. package/dist/cli/mcp/tools/lint.d.ts.map +1 -1
  35. package/dist/cli/mcp/tools/scaffold.d.ts.map +1 -1
  36. package/dist/cli/mcp/tools/search.d.ts.map +1 -1
  37. package/dist/cli/mcp/workspace-tools.d.ts +1 -1
  38. package/dist/cli/mcp/workspace-tools.d.ts.map +1 -1
  39. package/dist/cli/registry.d.ts +11 -2
  40. package/dist/cli/registry.d.ts.map +1 -1
  41. package/dist/codegen/fetch.d.ts.map +1 -1
  42. package/dist/codegen/naming.d.ts.map +1 -1
  43. package/dist/codegen/pinned-upgrade.d.ts +67 -3
  44. package/dist/codegen/pinned-upgrade.d.ts.map +1 -1
  45. package/dist/codegen/registry.d.ts.map +1 -1
  46. package/dist/components/capability-plugin-loader.d.ts.map +1 -1
  47. package/dist/components/capability.d.ts.map +1 -1
  48. package/dist/components/driver.d.ts.map +1 -1
  49. package/dist/components/fan-out.d.ts.map +1 -1
  50. package/dist/components/starter-plugin.d.ts.map +1 -1
  51. package/dist/components/verbs/process-runner.d.ts.map +1 -1
  52. package/dist/components/verbs/r2-sync.d.ts.map +1 -1
  53. package/dist/components/verbs/run-agent.d.ts.map +1 -1
  54. package/dist/components/verbs/sbom-generator.d.ts.map +1 -1
  55. package/dist/components/verbs/sign.d.ts.map +1 -1
  56. package/dist/components/verbs/verify.d.ts.map +1 -1
  57. package/dist/components/verbs/vuln-gate.d.ts.map +1 -1
  58. package/dist/components/verbs/vuln-scan.d.ts.map +1 -1
  59. package/dist/components/verbs/wrangler.d.ts.map +1 -1
  60. package/dist/composite.d.ts.map +1 -1
  61. package/dist/config.d.ts +19 -7
  62. package/dist/config.d.ts.map +1 -1
  63. package/dist/declarable.d.ts +16 -0
  64. package/dist/declarable.d.ts.map +1 -1
  65. package/dist/discovery/cache.d.ts.map +1 -1
  66. package/dist/discovery/fold-import.d.ts +15 -5
  67. package/dist/discovery/fold-import.d.ts.map +1 -1
  68. package/dist/discovery/param-deps.d.ts +16 -0
  69. package/dist/discovery/param-deps.d.ts.map +1 -1
  70. package/dist/discovery/sandbox/policy-wire.d.ts.map +1 -1
  71. package/dist/discovery/specifier-resolve.d.ts +37 -0
  72. package/dist/discovery/specifier-resolve.d.ts.map +1 -0
  73. package/dist/errors.d.ts.map +1 -1
  74. package/dist/fold/fold.d.ts +3 -1
  75. package/dist/fold/fold.d.ts.map +1 -1
  76. package/dist/graph-detail.d.ts.map +1 -1
  77. package/dist/graph-ir.d.ts.map +1 -1
  78. package/dist/graph-layout.d.ts.map +1 -1
  79. package/dist/import/base-parser.d.ts.map +1 -1
  80. package/dist/import/embedded.d.ts +7 -0
  81. package/dist/import/embedded.d.ts.map +1 -1
  82. package/dist/import/parser-options.d.ts +14 -0
  83. package/dist/import/parser-options.d.ts.map +1 -0
  84. package/dist/import/parser.d.ts +17 -0
  85. package/dist/import/parser.d.ts.map +1 -1
  86. package/dist/kubectl-context.d.ts.map +1 -1
  87. package/dist/lexicon-output.d.ts.map +1 -1
  88. package/dist/lexicon-schema.d.ts +3 -3
  89. package/dist/lexicon.d.ts +55 -3
  90. package/dist/lexicon.d.ts.map +1 -1
  91. package/dist/lifecycle/assert-live.d.ts.map +1 -1
  92. package/dist/lifecycle/gate-ledger.d.ts +15 -0
  93. package/dist/lifecycle/gate-ledger.d.ts.map +1 -1
  94. package/dist/lifecycle/git.d.ts.map +1 -1
  95. package/dist/lifecycle/member-ledger.d.ts.map +1 -1
  96. package/dist/lifecycle/observe.d.ts.map +1 -1
  97. package/dist/lifecycle/plan-ledger.d.ts.map +1 -1
  98. package/dist/lifecycle/release-ledger.d.ts.map +1 -1
  99. package/dist/lifecycle/scenario.d.ts.map +1 -1
  100. package/dist/lifecycle/status.d.ts.map +1 -1
  101. package/dist/lifecycle/work-lease.d.ts +61 -2
  102. package/dist/lifecycle/work-lease.d.ts.map +1 -1
  103. package/dist/lint/config.d.ts +8 -8
  104. package/dist/lint/engine.d.ts +6 -0
  105. package/dist/lint/engine.d.ts.map +1 -1
  106. package/dist/lsp/lexicon-providers.d.ts.map +1 -1
  107. package/dist/op/activities/activity-contracts.d.ts +11 -11
  108. package/dist/op/activities/apply.d.ts +79 -9
  109. package/dist/op/activities/apply.d.ts.map +1 -1
  110. package/dist/op/activities/decide.d.ts.map +1 -1
  111. package/dist/op/activities/index.d.ts +1 -1
  112. package/dist/op/activities/index.d.ts.map +1 -1
  113. package/dist/op/activities/lexicon-upgrade.d.ts +44 -12
  114. package/dist/op/activities/lexicon-upgrade.d.ts.map +1 -1
  115. package/dist/op/activity-contract.d.ts +1 -1
  116. package/dist/op/activity-failure.d.ts.map +1 -1
  117. package/dist/op/activity-profiles.d.ts.map +1 -1
  118. package/dist/op/builders.d.ts.map +1 -1
  119. package/dist/op/composites/apply-op.d.ts +12 -5
  120. package/dist/op/composites/apply-op.d.ts.map +1 -1
  121. package/dist/op/composites/lexicon-upgrade-op.d.ts +22 -6
  122. package/dist/op/composites/lexicon-upgrade-op.d.ts.map +1 -1
  123. package/dist/op/decide-backend.d.ts.map +1 -1
  124. package/dist/op/decide-read-inputs.d.ts.map +1 -1
  125. package/dist/op/emulator-lifecycle.d.ts +21 -2
  126. package/dist/op/emulator-lifecycle.d.ts.map +1 -1
  127. package/dist/op/gate-approval.d.ts +5 -1
  128. package/dist/op/gate-approval.d.ts.map +1 -1
  129. package/dist/op/gate-wait.d.ts.map +1 -1
  130. package/dist/op/gate.d.ts +19 -3
  131. package/dist/op/gate.d.ts.map +1 -1
  132. package/dist/op/index.d.ts +2 -0
  133. package/dist/op/index.d.ts.map +1 -1
  134. package/dist/op/local-executor.d.ts +6 -0
  135. package/dist/op/local-executor.d.ts.map +1 -1
  136. package/dist/op/operator.d.ts.map +1 -1
  137. package/dist/op/run-context.d.ts +39 -0
  138. package/dist/op/run-context.d.ts.map +1 -0
  139. package/dist/op/run-live.d.ts.map +1 -1
  140. package/dist/op/runtimes/local.d.ts.map +1 -1
  141. package/dist/op/source-archive.d.ts.map +1 -1
  142. package/dist/op/steward-beside.d.ts.map +1 -1
  143. package/dist/op/steward-points.d.ts.map +1 -1
  144. package/dist/op/steward.d.ts.map +1 -1
  145. package/dist/op/types.d.ts +8 -3
  146. package/dist/op/types.d.ts.map +1 -1
  147. package/dist/op/work-lease-run.d.ts +24 -4
  148. package/dist/op/work-lease-run.d.ts.map +1 -1
  149. package/dist/project-root.d.ts.map +1 -1
  150. package/dist/provenance.d.ts +21 -0
  151. package/dist/provenance.d.ts.map +1 -1
  152. package/dist/pseudo-parameter.d.ts.map +1 -1
  153. package/dist/reconcile.d.ts.map +1 -1
  154. package/dist/secret-materialization.d.ts.map +1 -1
  155. package/dist/terraform/emit-source.d.ts.map +1 -1
  156. package/dist/terraform/parse.d.ts.map +1 -1
  157. package/dist/testing.d.ts.map +1 -1
  158. package/dist/workspace/__fixtures__/contract-repo.d.ts.map +1 -1
  159. package/dist/workspace/__fixtures__/decide-workspace.d.ts +1 -1
  160. package/dist/workspace/__fixtures__/decide-workspace.d.ts.map +1 -1
  161. package/dist/workspace/agent-cli.d.ts +5 -0
  162. package/dist/workspace/agent-cli.d.ts.map +1 -1
  163. package/dist/workspace/box-factory.d.ts +73 -0
  164. package/dist/workspace/box-factory.d.ts.map +1 -0
  165. package/dist/workspace/changes.d.ts.map +1 -1
  166. package/dist/workspace/chant-migrations/chud-lexicon-exit.d.ts.map +1 -1
  167. package/dist/workspace/checks/boxes.d.ts.map +1 -1
  168. package/dist/workspace/checks.d.ts +5 -0
  169. package/dist/workspace/checks.d.ts.map +1 -1
  170. package/dist/workspace/compose-graph.d.ts +10 -0
  171. package/dist/workspace/compose-graph.d.ts.map +1 -1
  172. package/dist/workspace/conformance/index.d.ts +67 -6
  173. package/dist/workspace/conformance/index.d.ts.map +1 -1
  174. package/dist/workspace/conformance/vitest.d.ts +12 -3
  175. package/dist/workspace/conformance/vitest.d.ts.map +1 -1
  176. package/dist/workspace/conformance/writer.d.ts +368 -0
  177. package/dist/workspace/conformance/writer.d.ts.map +1 -0
  178. package/dist/workspace/decide.d.ts +1 -1
  179. package/dist/workspace/decide.d.ts.map +1 -1
  180. package/dist/workspace/declaration.d.ts +91 -4
  181. package/dist/workspace/declaration.d.ts.map +1 -1
  182. package/dist/workspace/declaration.schema.json +234 -5
  183. package/dist/workspace/generated-files.d.ts.map +1 -1
  184. package/dist/workspace/graph-cache.d.ts.map +1 -1
  185. package/dist/workspace/graph-cli.d.ts +2 -0
  186. package/dist/workspace/graph-cli.d.ts.map +1 -1
  187. package/dist/workspace/identity.d.ts +111 -0
  188. package/dist/workspace/identity.d.ts.map +1 -0
  189. package/dist/workspace/intent-cli.d.ts +7 -4
  190. package/dist/workspace/intent-cli.d.ts.map +1 -1
  191. package/dist/workspace/intent-record.d.ts +8 -1
  192. package/dist/workspace/intent-record.d.ts.map +1 -1
  193. package/dist/workspace/intent.d.ts +149 -5
  194. package/dist/workspace/intent.d.ts.map +1 -1
  195. package/dist/workspace/kinds.d.ts +18 -4
  196. package/dist/workspace/kinds.d.ts.map +1 -1
  197. package/dist/workspace/lineage-hash-index.d.ts.map +1 -1
  198. package/dist/workspace/lineage-lock.d.ts +2 -2
  199. package/dist/workspace/lineage-lock.d.ts.map +1 -1
  200. package/dist/workspace/links.d.ts.map +1 -1
  201. package/dist/workspace/points.d.ts.map +1 -1
  202. package/dist/workspace/principal-classes.d.ts +114 -0
  203. package/dist/workspace/principal-classes.d.ts.map +1 -0
  204. package/dist/workspace/reason-codes.d.ts +21 -1
  205. package/dist/workspace/reason-codes.d.ts.map +1 -1
  206. package/dist/workspace/record-assets.d.ts.map +1 -1
  207. package/dist/workspace/records-checkout.d.ts +54 -0
  208. package/dist/workspace/records-checkout.d.ts.map +1 -0
  209. package/dist/workspace/records-cli.d.ts +27 -1
  210. package/dist/workspace/records-cli.d.ts.map +1 -1
  211. package/dist/workspace/records-close.d.ts +1 -1
  212. package/dist/workspace/records-close.d.ts.map +1 -1
  213. package/dist/workspace/records-since.d.ts.map +1 -1
  214. package/dist/workspace/records-write.d.ts +5 -4
  215. package/dist/workspace/records-write.d.ts.map +1 -1
  216. package/dist/workspace/records.d.ts +15 -0
  217. package/dist/workspace/records.d.ts.map +1 -1
  218. package/dist/workspace/runs-cli.d.ts +164 -0
  219. package/dist/workspace/runs-cli.d.ts.map +1 -0
  220. package/dist/workspace/runs.d.ts +423 -0
  221. package/dist/workspace/runs.d.ts.map +1 -0
  222. package/dist/workspace/source-block.d.ts +1 -1
  223. package/dist/workspace/source-block.d.ts.map +1 -1
  224. package/dist/workspace/status-gates.d.ts +15 -3
  225. package/dist/workspace/status-gates.d.ts.map +1 -1
  226. package/dist/workspace/status.d.ts +10 -0
  227. package/dist/workspace/status.d.ts.map +1 -1
  228. package/dist/workspace/symbols.d.ts +52 -0
  229. package/dist/workspace/symbols.d.ts.map +1 -0
  230. package/dist/workspace/trailer-joins.d.ts +46 -0
  231. package/dist/workspace/trailer-joins.d.ts.map +1 -0
  232. package/dist/workspace/trailers.d.ts +89 -0
  233. package/dist/workspace/trailers.d.ts.map +1 -0
  234. package/dist/workspace/trust/attestor.d.ts.map +1 -1
  235. package/dist/workspace/trust/rotation.d.ts.map +1 -1
  236. package/dist/workspace/trust/seal.d.ts +33 -0
  237. package/dist/workspace/trust/seal.d.ts.map +1 -1
  238. package/dist/workspace/trust/test-repo.d.ts.map +1 -1
  239. package/dist/workspace/work-cli.d.ts +39 -3
  240. package/dist/workspace/work-cli.d.ts.map +1 -1
  241. package/dist/workspace/work-evidence.d.ts +1 -1
  242. package/dist/workspace/work-evidence.d.ts.map +1 -1
  243. package/dist/workspace/work.d.ts +26 -1
  244. package/dist/workspace/work.d.ts.map +1 -1
  245. package/dist/workspace/workspace-principals.schema.json +60 -0
  246. package/dist/workspace/write-scope.d.ts +79 -19
  247. package/dist/workspace/write-scope.d.ts.map +1 -1
  248. package/dist/yaml.d.ts +21 -39
  249. package/dist/yaml.d.ts.map +1 -1
  250. package/package.json +2 -2
  251. package/src/audit/prior-art.ts +15 -0
  252. package/src/cli/commands/__fixtures__/init-lexicon-output/package.json +1 -1
  253. package/src/cli/commands/carve-emit-state.test.ts +4 -0
  254. package/src/cli/commands/carve-emit.ts +5 -19
  255. package/src/cli/commands/check-lexicon.test.ts +62 -1
  256. package/src/cli/commands/check-lexicon.ts +36 -6
  257. package/src/cli/commands/import-live.test.ts +18 -0
  258. package/src/cli/commands/import-parser-options.test.ts +133 -0
  259. package/src/cli/commands/import.ts +21 -3
  260. package/src/cli/commands/init-lexicon/templates/project.ts +1 -1
  261. package/src/cli/commands/init.test.ts +8 -1
  262. package/src/cli/commands/init.ts +23 -8
  263. package/src/cli/commands/lint.test.ts +37 -0
  264. package/src/cli/commands/onboard.test.ts +53 -3
  265. package/src/cli/commands/onboard.ts +52 -4
  266. package/src/cli/commands/pinned-upgrade.ts +73 -33
  267. package/src/cli/handlers/__snapshots__/build-member.test.ts.snap +2 -2
  268. package/src/cli/handlers/components.ts +2 -2
  269. package/src/cli/handlers/dev.ts +8 -6
  270. package/src/cli/handlers/lifecycle.test.ts +67 -0
  271. package/src/cli/handlers/lifecycle.ts +6 -5
  272. package/src/cli/handlers/misc.ts +2 -0
  273. package/src/cli/handlers/operator.ts +87 -3
  274. package/src/cli/handlers/run.test.ts +111 -0
  275. package/src/cli/handlers/run.ts +85 -24
  276. package/src/cli/handlers/scenario.ts +2 -2
  277. package/src/cli/main.test.ts +1 -0
  278. package/src/cli/main.ts +65 -11
  279. package/src/cli/mcp/workspace-tools.test.ts +5 -2
  280. package/src/cli/mcp/workspace-tools.ts +29 -2
  281. package/src/cli/registry.ts +11 -2
  282. package/src/codegen/pinned-upgrade-multi.test.ts +157 -0
  283. package/src/codegen/pinned-upgrade-tags.test.ts +112 -0
  284. package/src/codegen/pinned-upgrade.test.ts +104 -0
  285. package/src/codegen/pinned-upgrade.ts +250 -56
  286. package/src/codegen/testdata/postgres-tags.json +242 -0
  287. package/src/config.test.ts +21 -0
  288. package/src/config.ts +15 -0
  289. package/src/declarable.test.ts +21 -0
  290. package/src/declarable.ts +19 -0
  291. package/src/discovery/fold-composite.test.ts +41 -5
  292. package/src/discovery/fold-import.test.ts +129 -0
  293. package/src/discovery/fold-import.ts +643 -131
  294. package/src/discovery/fold-package-composite.test.ts +264 -0
  295. package/src/discovery/fold-specifiers.test.ts +191 -0
  296. package/src/discovery/param-deps.test.ts +66 -1
  297. package/src/discovery/param-deps.ts +45 -0
  298. package/src/discovery/specifier-resolve.ts +344 -0
  299. package/src/fold/fold.test.ts +39 -1
  300. package/src/fold/fold.ts +83 -9
  301. package/src/fold-provenance.test.ts +140 -0
  302. package/src/graph-ir.test.ts +83 -0
  303. package/src/graph-ir.ts +29 -0
  304. package/src/import/embedded.test.ts +20 -0
  305. package/src/import/embedded.ts +13 -0
  306. package/src/import/parser-options.ts +46 -0
  307. package/src/import/parser.ts +20 -0
  308. package/src/lexicon.ts +55 -3
  309. package/src/lifecycle/gate-ledger.ts +16 -0
  310. package/src/lifecycle/observe.test.ts +18 -0
  311. package/src/lifecycle/observe.ts +6 -4
  312. package/src/lifecycle/snapshot.ts +2 -2
  313. package/src/lifecycle/work-lease.test.ts +1 -1
  314. package/src/lifecycle/work-lease.ts +93 -2
  315. package/src/lint/engine.test.ts +55 -0
  316. package/src/lint/engine.ts +30 -4
  317. package/src/lint/output-docs.test.ts +59 -56
  318. package/src/op/activities/apply.test.ts +189 -5
  319. package/src/op/activities/apply.ts +230 -8
  320. package/src/op/activities/index.ts +3 -0
  321. package/src/op/activities/lexicon-upgrade.test.ts +160 -6
  322. package/src/op/activities/lexicon-upgrade.ts +154 -51
  323. package/src/op/composites/apply-op.ts +12 -5
  324. package/src/op/composites/composites.test.ts +30 -3
  325. package/src/op/composites/lexicon-upgrade-op.test.ts +7 -2
  326. package/src/op/composites/lexicon-upgrade-op.ts +29 -8
  327. package/src/op/emulator-lifecycle.test.ts +23 -0
  328. package/src/op/emulator-lifecycle.ts +52 -14
  329. package/src/op/gate-approval.test.ts +74 -0
  330. package/src/op/gate-approval.ts +5 -1
  331. package/src/op/gate.ts +31 -5
  332. package/src/op/index.ts +2 -0
  333. package/src/op/local-executor.test.ts +15 -0
  334. package/src/op/local-executor.ts +40 -12
  335. package/src/op/local-output.ts +1 -1
  336. package/src/op/operator.ts +4 -0
  337. package/src/op/run-context.test.ts +141 -0
  338. package/src/op/run-context.ts +51 -0
  339. package/src/op/runtimes/local.test.ts +14 -0
  340. package/src/op/runtimes/local.ts +2 -0
  341. package/src/op/steward-beside.ts +2 -0
  342. package/src/op/types.ts +8 -3
  343. package/src/op/work-lease-run.test.ts +47 -0
  344. package/src/op/work-lease-run.ts +73 -11
  345. package/src/provenance.ts +35 -0
  346. package/src/workspace/__fixtures__/studio-template-84c8b21.json +1 -1
  347. package/src/workspace/agent-cli.ts +7 -3
  348. package/src/workspace/agent.schema.json +22 -0
  349. package/src/workspace/box-factory.test.ts +320 -0
  350. package/src/workspace/box-factory.ts +103 -0
  351. package/src/workspace/changes.schema.json +12 -20
  352. package/src/workspace/changes.ts +4 -1
  353. package/src/workspace/checks/boxes.test.ts +2 -0
  354. package/src/workspace/checks.ts +29 -5
  355. package/src/workspace/compose-graph.ts +7 -0
  356. package/src/workspace/conformance/__writer_fixture__/answers/answer.kind.mjs +27 -0
  357. package/src/workspace/conformance/__writer_fixture__/answers/answer.schema.json +95 -0
  358. package/src/workspace/conformance/__writer_fixture__/decisions/points.json +132 -0
  359. package/src/workspace/conformance/__writer_fixture__/sessions/session.kind.mjs +48 -0
  360. package/src/workspace/conformance/__writer_fixture__/sessions/session.schema.json +108 -0
  361. package/src/workspace/conformance/__writer_fixture__/work/W-001-the-writer-suite-works-this-item.md +25 -0
  362. package/src/workspace/conformance/__writer_fixture__/work/work.kind.mjs +60 -0
  363. package/src/workspace/conformance/__writer_fixture__/work/work.schema.json +578 -0
  364. package/src/workspace/conformance/conformance.e2e.test.ts +35 -3
  365. package/src/workspace/conformance/index.mjs +30 -3
  366. package/src/workspace/conformance/index.ts +103 -15
  367. package/src/workspace/conformance/vitest.ts +44 -2
  368. package/src/workspace/conformance/writer-conformance.e2e.test.ts +131 -0
  369. package/src/workspace/conformance/writer.test.ts +156 -0
  370. package/src/workspace/conformance/writer.ts +880 -0
  371. package/src/workspace/decide.ts +7 -1
  372. package/src/workspace/declaration.schema.json +234 -5
  373. package/src/workspace/declaration.ts +174 -10
  374. package/src/workspace/graph-cli.ts +5 -2
  375. package/src/workspace/graph.schema.json +247 -0
  376. package/src/workspace/identity.test.ts +196 -0
  377. package/src/workspace/identity.ts +186 -0
  378. package/src/workspace/intent-cli.ts +64 -10
  379. package/src/workspace/intent-record.schema.json +208 -0
  380. package/src/workspace/intent-record.ts +35 -1
  381. package/src/workspace/intent-why.test.ts +274 -0
  382. package/src/workspace/intent.schema.json +718 -7
  383. package/src/workspace/intent.test.ts +11 -2
  384. package/src/workspace/intent.ts +495 -32
  385. package/src/workspace/kinds.ts +44 -37
  386. package/src/workspace/points-write.schema.json +1 -0
  387. package/src/workspace/principal-classes.test.ts +175 -0
  388. package/src/workspace/principal-classes.ts +307 -0
  389. package/src/workspace/reason-codes.test.ts +11 -3
  390. package/src/workspace/reason-codes.ts +24 -1
  391. package/src/workspace/records-amend.schema.json +2 -0
  392. package/src/workspace/records-checkout.ts +106 -0
  393. package/src/workspace/records-cli.ts +103 -11
  394. package/src/workspace/records-close.schema.json +1 -0
  395. package/src/workspace/records-new.schema.json +2 -0
  396. package/src/workspace/records-review.schema.json +2 -0
  397. package/src/workspace/records-uncommitted.test.ts +171 -0
  398. package/src/workspace/records-write.ts +28 -6
  399. package/src/workspace/records.schema.json +72 -1
  400. package/src/workspace/records.ts +27 -0
  401. package/src/workspace/runs-cli.ts +381 -0
  402. package/src/workspace/runs-write.schema.json +583 -0
  403. package/src/workspace/runs.schema.json +810 -0
  404. package/src/workspace/runs.test.ts +242 -0
  405. package/src/workspace/runs.ts +709 -0
  406. package/src/workspace/status-contract.test.ts +5 -0
  407. package/src/workspace/status-gates.ts +22 -8
  408. package/src/workspace/status.schema.json +127 -2
  409. package/src/workspace/status.ts +21 -1
  410. package/src/workspace/symbols.ts +180 -0
  411. package/src/workspace/trailer-joins.test.ts +171 -0
  412. package/src/workspace/trailer-joins.ts +82 -0
  413. package/src/workspace/trailers.ts +148 -0
  414. package/src/workspace/trust/seal.ts +52 -1
  415. package/src/workspace/work-cli.e2e.test.ts +28 -1
  416. package/src/workspace/work-cli.ts +133 -8
  417. package/src/workspace/work-evidence.schema.json +2 -0
  418. package/src/workspace/work-history.schema.json +73 -1
  419. package/src/workspace/work-history.test.ts +48 -5
  420. package/src/workspace/work-kind-fields.test.ts +154 -0
  421. package/src/workspace/work-lease.schema.json +14 -1
  422. package/src/workspace/work.ts +82 -0
  423. package/src/workspace/workspace-principals.schema.json +60 -0
  424. package/src/workspace/write-scope.test.ts +128 -2
  425. package/src/workspace/write-scope.ts +170 -45
  426. package/src/yaml.test.ts +111 -1
  427. package/src/yaml.ts +141 -549
@@ -1,5 +1,6 @@
1
1
  /**
2
- * Pinned-version upgrade detection for k8s, gcp, docker, gitlab lexicons.
2
+ * Pinned-version upgrade detection for any lexicon that declares `upstreamPin`
3
+ * (k8s, k3s, gcp, docker, gitlab, cedar, sql).
3
4
  *
4
5
  * For each lexicon with a pinned upstream version constant, this module:
5
6
  * 1. Reads the currently pinned version from the source file.
@@ -21,8 +22,9 @@
21
22
  * (returns the latest version tag, or null when no stable release is found).
22
23
  */
23
24
 
24
- import { readFileSync, writeFileSync } from "fs";
25
- import { join } from "path";
25
+ import { existsSync, readFileSync, writeFileSync } from "fs";
26
+ import { join, resolve } from "path";
27
+ import { pathToFileURL } from "url";
26
28
  import { regenLexicon, type RegenResult } from "./lexicon-regen";
27
29
  import { fetchWithRetry } from "./fetch";
28
30
  import { isLexiconPlugin, type UpstreamPin } from "../lexicon";
@@ -42,6 +44,8 @@ export type { UpstreamPin };
42
44
  export interface UpgradeCheckResult {
43
45
  /** Lexicon identifier. */
44
46
  lexicon: LexiconId;
47
+ /** The pin's label. Set only when the plugin declares more than one pin. */
48
+ pin?: string;
45
49
  /** Whether a newer stable upstream version was found. */
46
50
  hasUpgrade: boolean;
47
51
  /** Current pinned version string (e.g. "v1.32.0"). */
@@ -52,6 +56,12 @@ export interface UpgradeCheckResult {
52
56
  validation: RegenResult | null;
53
57
  /** Human-readable error when the upstream query itself failed. */
54
58
  fetchError: string | null;
59
+ /**
60
+ * Set when the new version was found but the pin cannot be rewritten
61
+ * generically (it moves with other constants). Nothing was edited or
62
+ * regenerated; `instructions` says what to move by hand.
63
+ */
64
+ manualPin?: { file: string; instructions: string };
55
65
  }
56
66
 
57
67
  /** Injectable upstream version resolver. Returns the latest stable tag or null. */
@@ -62,6 +72,11 @@ export interface CheckPinnedUpgradeOptions {
62
72
  lexiconDir: string;
63
73
  /** Which lexicon to check. */
64
74
  lexicon: LexiconId;
75
+ /**
76
+ * Label of the one pin to check, for a plugin that declares several. Omitted:
77
+ * `checkPinnedUpgrade` checks the first pin, `checkPinnedUpgrades` all of them.
78
+ */
79
+ pin?: string;
65
80
  /**
66
81
  * Override the upstream resolver (useful in tests to inject mocks).
67
82
  * When omitted the real GitHub API is called.
@@ -198,17 +213,92 @@ export function revertVersionBump(filePath: string, original: string): void {
198
213
  * not self-upgradable). Mirrors ../components/capability-plugin-loader.ts's
199
214
  * lexicon-borne loading.
200
215
  */
201
- export async function loadUpstreamPin(lexicon: LexiconId): Promise<UpstreamPin | null> {
202
- let mod: Record<string, unknown>;
216
+ export async function loadUpstreamPin(lexicon: LexiconId, lexiconDir?: string): Promise<UpstreamPin | null> {
217
+ return (await loadUpstreamPins(lexicon, lexiconDir))[0]?.pin ?? null;
218
+ }
219
+
220
+ /** One pin of a plugin with the label it is addressed by. */
221
+ export interface LabeledPin {
222
+ label: string;
223
+ pin: UpstreamPin;
224
+ }
225
+
226
+ /**
227
+ * Every pin a plugin declares: its `upstreamPin` (labelled by its own `label`,
228
+ * else the lexicon's name) followed by each `upstreamPins` entry. Empty when
229
+ * the plugin declares none or cannot be loaded.
230
+ */
231
+ export function pinsOfPlugin(plugin: { upstreamPin?: UpstreamPin; upstreamPins?: readonly UpstreamPin[] }, lexicon: LexiconId): LabeledPin[] {
232
+ const pins: LabeledPin[] = [];
233
+ if (plugin.upstreamPin) pins.push({ label: plugin.upstreamPin.label ?? lexicon, pin: plugin.upstreamPin });
234
+ for (const pin of plugin.upstreamPins ?? []) pins.push({ label: pin.label ?? `${lexicon}-${pins.length}`, pin });
235
+ return pins;
236
+ }
237
+
238
+ /** Load every pin the lexicon's plugin declares; see {@link loadUpstreamPin} for where it looks. */
239
+ export async function loadUpstreamPins(lexicon: LexiconId, lexiconDir?: string): Promise<LabeledPin[]> {
240
+ const pinsOf = (mod: Record<string, unknown>): LabeledPin[] => {
241
+ for (const value of Object.values(mod)) {
242
+ if (isLexiconPlugin(value)) {
243
+ const pins = pinsOfPlugin(value, lexicon);
244
+ if (pins.length > 0) return pins;
245
+ }
246
+ }
247
+ return [];
248
+ };
249
+ // The directory the caller pointed at wins: it is the checkout whose pin
250
+ // file will be edited, and it need not be installed under node_modules.
251
+ const entry = lexiconDir ? lexiconEntry(lexiconDir) : null;
252
+ if (entry) {
253
+ try {
254
+ const pins = pinsOf((await import(pathToFileURL(entry).href)) as Record<string, unknown>);
255
+ if (pins.length > 0) return pins;
256
+ } catch {
257
+ // fall through to the package-name route
258
+ }
259
+ }
203
260
  try {
204
- mod = (await importLexiconPackage(`@intentius/chant-lexicon-${lexicon}`)) as Record<string, unknown>;
261
+ return pinsOf((await importLexiconPackage(`@intentius/chant-lexicon-${lexicon}`)) as Record<string, unknown>);
262
+ } catch {
263
+ return [];
264
+ }
265
+ }
266
+
267
+ /** The module a lexicon directory's package.json exposes as ".", or null when it declares none. */
268
+ function lexiconEntry(lexiconDir: string): string | null {
269
+ try {
270
+ const pkg = JSON.parse(readFileSync(join(lexiconDir, "package.json"), "utf-8")) as {
271
+ main?: string;
272
+ exports?: Record<string, unknown> | string;
273
+ };
274
+ let rel: unknown = pkg.main;
275
+ const root = typeof pkg.exports === "string" ? pkg.exports : pkg.exports?.["."];
276
+ if (typeof root === "string") rel = root;
277
+ else if (root && typeof root === "object") {
278
+ const conds = root as Record<string, unknown>;
279
+ rel = conds.development ?? conds.default ?? conds.import ?? rel;
280
+ }
281
+ if (typeof rel !== "string") return null;
282
+ const abs = resolve(lexiconDir, rel);
283
+ return existsSync(abs) ? abs : null;
205
284
  } catch {
206
285
  return null;
207
286
  }
208
- for (const value of Object.values(mod)) {
209
- if (isLexiconPlugin(value) && value.upstreamPin) return value.upstreamPin;
287
+ }
288
+
289
+ /**
290
+ * The lexicon name a directory holds, from its package.json
291
+ * (`@intentius/chant-lexicon-<name>`), falling back to the directory name.
292
+ */
293
+ export function lexiconNameOf(lexiconDir: string): string {
294
+ try {
295
+ const pkg = JSON.parse(readFileSync(join(lexiconDir, "package.json"), "utf-8")) as { name?: string };
296
+ const m = /^@intentius\/chant-lexicon-(.+)$/.exec(pkg.name ?? "");
297
+ if (m) return m[1]!;
298
+ } catch {
299
+ // no package.json
210
300
  }
211
- return null;
301
+ return resolve(lexiconDir).split("/").pop() ?? lexiconDir;
212
302
  }
213
303
 
214
304
  /** Build a concrete `PinLocation` (absolute path + patterns) from a lexicon's descriptor and its checkout dir. */
@@ -222,38 +312,26 @@ function pinLocationFrom(pin: UpstreamPin, lexiconDir: string): PinLocation {
222
312
 
223
313
  // ── Real upstream resolvers ───────────────────────────────────────────
224
314
 
315
+ export interface LatestTagOptions {
316
+ /** Only keep tags ending with this suffix. */
317
+ tagSuffix?: string;
318
+ /** Map a raw tag to a version, or null to skip it (see `UpstreamPin.upstream.tagVersion`). */
319
+ tagVersion?: (tag: string) => string | null;
320
+ /** Only keep versions whose major equals this one's. */
321
+ sameMajorAs?: string;
322
+ }
323
+
225
324
  /**
226
- * Fetch GitHub releases or tags from the given repo and return the
227
- * latest stable version tag (highest semver, no pre-release).
228
- *
229
- * `kind` selects whether to use the releases API (which has published
230
- * stable releases) or the tags API (which has every git tag).
231
- *
232
- * `tagSuffix` filters tags to only those ending with the given string
233
- * (e.g. "-ee" for GitLab).
325
+ * Pick the highest stable version from a list of GitHub release or tag items.
326
+ * Pure: the network lives in `latestGitHubRelease`.
234
327
  */
235
- async function latestGitHubRelease(
236
- owner: string,
237
- repo: string,
328
+ export function pickLatest(
329
+ items: ReadonlyArray<{ tag_name?: string; name?: string; prerelease?: boolean }>,
238
330
  kind: "releases" | "tags",
239
- tagSuffix?: string,
240
- ): Promise<string | null> {
241
- const token = process.env.GITHUB_TOKEN ?? process.env.GH_TOKEN;
242
- const headers: Record<string, string> = {
243
- Accept: "application/vnd.github+json",
244
- "X-GitHub-Api-Version": "2022-11-28",
245
- };
246
- if (token) headers["Authorization"] = `Bearer ${token}`;
247
-
248
- const url = `https://api.github.com/repos/${owner}/${repo}/${kind}?per_page=50`;
249
-
250
- const resp = await fetchWithRetry(url, 4, 1000, { headers });
251
-
252
- const items = (await resp.json()) as Array<{
253
- tag_name?: string;
254
- name?: string;
255
- prerelease?: boolean;
256
- }>;
331
+ opts: LatestTagOptions = {},
332
+ ): string | null {
333
+ const { tagSuffix, tagVersion } = opts;
334
+ const major = opts.sameMajorAs !== undefined ? majorOf(opts.sameMajorAs, tagVersion) : undefined;
257
335
 
258
336
  let best: string | null = null;
259
337
  let bestParsed: number[] | null = null;
@@ -271,11 +349,15 @@ async function latestGitHubRelease(
271
349
  // Apply optional suffix filter (e.g. "-ee" for GitLab)
272
350
  if (tagSuffix && !rawTag.endsWith(tagSuffix)) continue;
273
351
 
274
- const parsed = parseVersion(rawTag);
352
+ const candidate = tagVersion ? tagVersion(rawTag) : rawTag;
353
+ if (!candidate) continue;
354
+
355
+ const parsed = parseVersion(candidate);
275
356
  if (!parsed) continue;
357
+ if (major !== undefined && parsed[0] !== major) continue;
276
358
 
277
359
  if (!bestParsed || compareVersionTuples(parsed, bestParsed) > 0) {
278
- best = rawTag;
360
+ best = candidate;
279
361
  bestParsed = parsed;
280
362
  }
281
363
  }
@@ -283,9 +365,59 @@ async function latestGitHubRelease(
283
365
  return best;
284
366
  }
285
367
 
368
+ /** First numeric segment of a pinned value, which may be a mapped version or a raw tag. */
369
+ function majorOf(value: string, tagVersion?: (tag: string) => string | null): number | undefined {
370
+ const parsed = parseVersion(value) ?? (tagVersion ? parseVersion(tagVersion(value) ?? "") : null);
371
+ return parsed?.[0];
372
+ }
373
+
374
+ const TAG_PAGE_SIZE = 100;
375
+ const TAG_MAX_PAGES = 20;
376
+
377
+ /**
378
+ * Fetch GitHub releases or tags from the given repo and return the
379
+ * latest stable version tag (highest semver, no pre-release).
380
+ *
381
+ * `kind` selects whether to use the releases API (which has published
382
+ * stable releases) or the tags API (which has every git tag).
383
+ *
384
+ * `tagSuffix` filters tags to only those ending with the given string
385
+ * (e.g. "-ee" for GitLab). `tagVersion` and `sameMajorAs` are described on
386
+ * `UpstreamPin.upstream`; with `tagVersion` every page of tags is read.
387
+ */
388
+ async function latestGitHubRelease(
389
+ owner: string,
390
+ repo: string,
391
+ kind: "releases" | "tags",
392
+ opts: LatestTagOptions = {},
393
+ ): Promise<string | null> {
394
+ const token = process.env.GITHUB_TOKEN ?? process.env.GH_TOKEN;
395
+ const headers: Record<string, string> = {
396
+ Accept: "application/vnd.github+json",
397
+ "X-GitHub-Api-Version": "2022-11-28",
398
+ };
399
+ if (token) headers["Authorization"] = `Bearer ${token}`;
400
+
401
+ type Item = { tag_name?: string; name?: string; prerelease?: boolean };
402
+ const paged = kind === "tags" && opts.tagVersion !== undefined;
403
+ const perPage = paged ? TAG_PAGE_SIZE : 50;
404
+ const items: Item[] = [];
405
+ for (let page = 1; page <= (paged ? TAG_MAX_PAGES : 1); page++) {
406
+ const url = `https://api.github.com/repos/${owner}/${repo}/${kind}?per_page=${perPage}&page=${page}`;
407
+ const resp = await fetchWithRetry(url, 4, 1000, { headers });
408
+ const batch = (await resp.json()) as Item[];
409
+ items.push(...batch);
410
+ if (batch.length < perPage) break;
411
+ }
412
+
413
+ return pickLatest(items, kind, opts);
414
+ }
415
+
286
416
  /** Build the real GitHub-backed upstream resolver from a lexicon's declared `upstream` descriptor. */
287
- function resolverFor(pin: UpstreamPin): UpstreamResolver {
288
- return () => latestGitHubRelease(pin.upstream.owner, pin.upstream.repo, pin.upstream.kind, pin.upstream.tagSuffix);
417
+ export function resolverFor(pin: UpstreamPin, from: string): UpstreamResolver {
418
+ const { owner, repo, kind, tagSuffix, tagVersion, trackMajor } = pin.upstream;
419
+ return () =>
420
+ latestGitHubRelease(owner, repo, kind, { tagSuffix, tagVersion, sameMajorAs: trackMajor ? from : undefined });
289
421
  }
290
422
 
291
423
  // ── Main function ─────────────────────────────────────────────────────
@@ -302,19 +434,53 @@ function resolverFor(pin: UpstreamPin): UpstreamResolver {
302
434
  * without any lasting change to the working tree.
303
435
  */
304
436
  export async function checkPinnedUpgrade(opts: CheckPinnedUpgradeOptions): Promise<UpgradeCheckResult> {
305
- const { lexiconDir, lexicon, force = false, verbose = false, skipBuild, skipBundle, skipLint } = opts;
437
+ const selected = await selectPins(opts);
438
+ if ("error" in selected) return selected.error;
439
+ return checkOnePin(selected.pins[0]!, opts, selected.multiple);
440
+ }
306
441
 
307
- const pin = await loadUpstreamPin(lexicon);
308
- if (!pin) {
309
- return {
310
- lexicon,
311
- hasUpgrade: false,
312
- from: "(unknown)",
313
- to: null,
314
- validation: null,
315
- fetchError: `Lexicon "${lexicon}" declares no upstreamPin (not self-upgradable), or its plugin package could not be loaded.`,
316
- };
442
+ /**
443
+ * Check every pin the plugin declares (or the one named by `opts.pin`), one
444
+ * result each, in declaration order. A plugin with one pin gives one result,
445
+ * the same as `checkPinnedUpgrade`. Pins are checked one after another: each
446
+ * dry-run bump edits and reverts a file, and regenerates.
447
+ */
448
+ export async function checkPinnedUpgrades(opts: CheckPinnedUpgradeOptions): Promise<UpgradeCheckResult[]> {
449
+ const selected = await selectPins({ ...opts, pin: opts.pin });
450
+ if ("error" in selected) return [selected.error];
451
+ const results: UpgradeCheckResult[] = [];
452
+ for (const labeled of selected.pins) results.push(await checkOnePin(labeled, opts, selected.multiple));
453
+ return results;
454
+ }
455
+
456
+ /** Choose the pins to check: all of them, or the one `opts.pin` names. */
457
+ async function selectPins(
458
+ opts: CheckPinnedUpgradeOptions,
459
+ ): Promise<{ pins: LabeledPin[]; multiple: boolean } | { error: UpgradeCheckResult }> {
460
+ const { lexiconDir, lexicon } = opts;
461
+ const fail = (fetchError: string): { error: UpgradeCheckResult } => ({
462
+ error: { lexicon, hasUpgrade: false, from: "(unknown)", to: null, validation: null, fetchError },
463
+ });
464
+ const all = await loadUpstreamPins(lexicon, lexiconDir);
465
+ if (all.length === 0) {
466
+ return fail(
467
+ `Lexicon "${lexicon}" declares no upstreamPin, so there is no pinned upstream version to check (see lexicon-authoring/generate, "Pinning the upstream schema"), or its plugin could not be loaded from ${lexiconDir}.`,
468
+ );
317
469
  }
470
+ const labels = all.map((p) => p.label);
471
+ const dup = labels.find((l, i) => labels.indexOf(l) !== i);
472
+ if (dup) return fail(`Lexicon "${lexicon}" declares two pins labelled "${dup}"; each pin's label must be unique.`);
473
+ const multiple = all.length > 1;
474
+ if (opts.pin === undefined) return { pins: all, multiple };
475
+ const chosen = all.find((p) => p.label === opts.pin);
476
+ if (!chosen) return fail(`Lexicon "${lexicon}" has no pin labelled "${opts.pin}". Pins: ${labels.join(", ")}.`);
477
+ return { pins: [chosen], multiple };
478
+ }
479
+
480
+ async function checkOnePin(labeled: LabeledPin, opts: CheckPinnedUpgradeOptions, multiple: boolean): Promise<UpgradeCheckResult> {
481
+ const { lexiconDir, lexicon, force = false, verbose = false, skipBuild, skipBundle, skipLint } = opts;
482
+ const { pin } = labeled;
483
+ const tag = multiple ? { pin: labeled.label } : {};
318
484
  const location = pinLocationFrom(pin, lexiconDir);
319
485
 
320
486
  // Read current pin
@@ -322,6 +488,7 @@ export async function checkPinnedUpgrade(opts: CheckPinnedUpgradeOptions): Promi
322
488
  if (!from) {
323
489
  return {
324
490
  lexicon,
491
+ ...tag,
325
492
  hasUpgrade: false,
326
493
  from: "(unknown)",
327
494
  to: null,
@@ -331,13 +498,14 @@ export async function checkPinnedUpgrade(opts: CheckPinnedUpgradeOptions): Promi
331
498
  }
332
499
 
333
500
  // Query upstream
334
- const resolver = opts.resolverOverride ?? resolverFor(pin);
501
+ const resolver = opts.resolverOverride ?? resolverFor(pin, from);
335
502
  let latestTag: string | null;
336
503
  try {
337
504
  latestTag = await resolver();
338
505
  } catch (e) {
339
506
  return {
340
507
  lexicon,
508
+ ...tag,
341
509
  hasUpgrade: false,
342
510
  from,
343
511
  to: null,
@@ -346,9 +514,12 @@ export async function checkPinnedUpgrade(opts: CheckPinnedUpgradeOptions): Promi
346
514
  };
347
515
  }
348
516
 
349
- if (!latestTag || !isNewer(latestTag, from)) {
517
+ // The pin may hold the raw tag (REL_18_6) where the resolver returns the mapped version (18.6).
518
+ const fromVersion = parseVersion(from) ? from : (pin.upstream.tagVersion?.(from) ?? from);
519
+ if (!latestTag || !isNewer(latestTag, fromVersion)) {
350
520
  return {
351
521
  lexicon,
522
+ ...tag,
352
523
  hasUpgrade: false,
353
524
  from,
354
525
  to: latestTag,
@@ -357,6 +528,22 @@ export async function checkPinnedUpgrade(opts: CheckPinnedUpgradeOptions): Promi
357
528
  };
358
529
  }
359
530
 
531
+ // A pin the descriptor's `replace` cannot move alone (a companion digest,
532
+ // say): report the new version and how to move it. Editing the version
533
+ // line only would leave a pin that fails generation.
534
+ if (pin.alsoMoves) {
535
+ return {
536
+ lexicon,
537
+ ...tag,
538
+ hasUpgrade: true,
539
+ from,
540
+ to: latestTag,
541
+ validation: null,
542
+ fetchError: null,
543
+ manualPin: { file: pin.file, instructions: pin.alsoMoves },
544
+ };
545
+ }
546
+
360
547
  // Apply bump, regen, then revert
361
548
  let originalContent: string;
362
549
  try {
@@ -364,6 +551,7 @@ export async function checkPinnedUpgrade(opts: CheckPinnedUpgradeOptions): Promi
364
551
  } catch (e) {
365
552
  return {
366
553
  lexicon,
554
+ ...tag,
367
555
  hasUpgrade: true,
368
556
  from,
369
557
  to: latestTag,
@@ -390,6 +578,7 @@ export async function checkPinnedUpgrade(opts: CheckPinnedUpgradeOptions): Promi
390
578
 
391
579
  return {
392
580
  lexicon,
581
+ ...tag,
393
582
  hasUpgrade: true,
394
583
  from,
395
584
  to: latestTag,
@@ -415,9 +604,14 @@ export async function applyPinnedVersionBump(
415
604
  lexicon: LexiconId,
416
605
  lexiconDir: string,
417
606
  newVersion: string,
607
+ pinLabel?: string,
418
608
  ): Promise<{ filePath: string }> {
419
- const pin = await loadUpstreamPin(lexicon);
609
+ const pins = await loadUpstreamPins(lexicon, lexiconDir);
610
+ const pin = (pinLabel === undefined ? pins[0] : pins.find((p) => p.label === pinLabel))?.pin;
420
611
  if (!pin) throw new Error(`Lexicon "${lexicon}" declares no upstreamPin (not self-upgradable).`);
612
+ if (pin.alsoMoves) {
613
+ throw new Error(`Lexicon "${lexicon}" cannot have its pin rewritten generically: ${pin.alsoMoves}`);
614
+ }
421
615
  const location = pinLocationFrom(pin, lexiconDir);
422
616
  applyVersionBump(location, newVersion);
423
617
  return { filePath: location.filePath };
@@ -0,0 +1,242 @@
1
+ [
2
+ {
3
+ "name": "REL_19_BETA4",
4
+ "commit": {
5
+ "sha": "0000000000000000000000000000000000000000"
6
+ }
7
+ },
8
+ {
9
+ "name": "REL_19_BETA3",
10
+ "commit": {
11
+ "sha": "0000000000000000000000000000000000000000"
12
+ }
13
+ },
14
+ {
15
+ "name": "REL_19_BETA2",
16
+ "commit": {
17
+ "sha": "0000000000000000000000000000000000000000"
18
+ }
19
+ },
20
+ {
21
+ "name": "REL_19_BETA1",
22
+ "commit": {
23
+ "sha": "0000000000000000000000000000000000000000"
24
+ }
25
+ },
26
+ {
27
+ "name": "REL_18_6",
28
+ "commit": {
29
+ "sha": "0000000000000000000000000000000000000000"
30
+ }
31
+ },
32
+ {
33
+ "name": "REL_18_5",
34
+ "commit": {
35
+ "sha": "0000000000000000000000000000000000000000"
36
+ }
37
+ },
38
+ {
39
+ "name": "REL_18_4",
40
+ "commit": {
41
+ "sha": "0000000000000000000000000000000000000000"
42
+ }
43
+ },
44
+ {
45
+ "name": "REL_18_3",
46
+ "commit": {
47
+ "sha": "0000000000000000000000000000000000000000"
48
+ }
49
+ },
50
+ {
51
+ "name": "REL_18_2",
52
+ "commit": {
53
+ "sha": "0000000000000000000000000000000000000000"
54
+ }
55
+ },
56
+ {
57
+ "name": "REL_18_1",
58
+ "commit": {
59
+ "sha": "0000000000000000000000000000000000000000"
60
+ }
61
+ },
62
+ {
63
+ "name": "REL_18_0",
64
+ "commit": {
65
+ "sha": "0000000000000000000000000000000000000000"
66
+ }
67
+ },
68
+ {
69
+ "name": "REL_18_RC1",
70
+ "commit": {
71
+ "sha": "0000000000000000000000000000000000000000"
72
+ }
73
+ },
74
+ {
75
+ "name": "REL_18_BETA3",
76
+ "commit": {
77
+ "sha": "0000000000000000000000000000000000000000"
78
+ }
79
+ },
80
+ {
81
+ "name": "REL_18_BETA2",
82
+ "commit": {
83
+ "sha": "0000000000000000000000000000000000000000"
84
+ }
85
+ },
86
+ {
87
+ "name": "REL_18_BETA1",
88
+ "commit": {
89
+ "sha": "0000000000000000000000000000000000000000"
90
+ }
91
+ },
92
+ {
93
+ "name": "REL_17_11",
94
+ "commit": {
95
+ "sha": "0000000000000000000000000000000000000000"
96
+ }
97
+ },
98
+ {
99
+ "name": "REL_17_10",
100
+ "commit": {
101
+ "sha": "0000000000000000000000000000000000000000"
102
+ }
103
+ },
104
+ {
105
+ "name": "REL_17_9",
106
+ "commit": {
107
+ "sha": "0000000000000000000000000000000000000000"
108
+ }
109
+ },
110
+ {
111
+ "name": "REL_17_0",
112
+ "commit": {
113
+ "sha": "0000000000000000000000000000000000000000"
114
+ }
115
+ },
116
+ {
117
+ "name": "REL_17_RC1",
118
+ "commit": {
119
+ "sha": "0000000000000000000000000000000000000000"
120
+ }
121
+ },
122
+ {
123
+ "name": "REL_17_BETA1",
124
+ "commit": {
125
+ "sha": "0000000000000000000000000000000000000000"
126
+ }
127
+ },
128
+ {
129
+ "name": "REL_16_15",
130
+ "commit": {
131
+ "sha": "0000000000000000000000000000000000000000"
132
+ }
133
+ },
134
+ {
135
+ "name": "REL_16_9",
136
+ "commit": {
137
+ "sha": "0000000000000000000000000000000000000000"
138
+ }
139
+ },
140
+ {
141
+ "name": "REL_16_0",
142
+ "commit": {
143
+ "sha": "0000000000000000000000000000000000000000"
144
+ }
145
+ },
146
+ {
147
+ "name": "REL_15_19",
148
+ "commit": {
149
+ "sha": "0000000000000000000000000000000000000000"
150
+ }
151
+ },
152
+ {
153
+ "name": "REL_15_2",
154
+ "commit": {
155
+ "sha": "0000000000000000000000000000000000000000"
156
+ }
157
+ },
158
+ {
159
+ "name": "REL_14_24",
160
+ "commit": {
161
+ "sha": "0000000000000000000000000000000000000000"
162
+ }
163
+ },
164
+ {
165
+ "name": "REL_14_9",
166
+ "commit": {
167
+ "sha": "0000000000000000000000000000000000000000"
168
+ }
169
+ },
170
+ {
171
+ "name": "REL_13_23",
172
+ "commit": {
173
+ "sha": "0000000000000000000000000000000000000000"
174
+ }
175
+ },
176
+ {
177
+ "name": "REL_12_22",
178
+ "commit": {
179
+ "sha": "0000000000000000000000000000000000000000"
180
+ }
181
+ },
182
+ {
183
+ "name": "REL_11_22",
184
+ "commit": {
185
+ "sha": "0000000000000000000000000000000000000000"
186
+ }
187
+ },
188
+ {
189
+ "name": "REL_10_23",
190
+ "commit": {
191
+ "sha": "0000000000000000000000000000000000000000"
192
+ }
193
+ },
194
+ {
195
+ "name": "REL9_6_24",
196
+ "commit": {
197
+ "sha": "0000000000000000000000000000000000000000"
198
+ }
199
+ },
200
+ {
201
+ "name": "REL9_5_25",
202
+ "commit": {
203
+ "sha": "0000000000000000000000000000000000000000"
204
+ }
205
+ },
206
+ {
207
+ "name": "REL8_4_22",
208
+ "commit": {
209
+ "sha": "0000000000000000000000000000000000000000"
210
+ }
211
+ },
212
+ {
213
+ "name": "REL8_0_26",
214
+ "commit": {
215
+ "sha": "0000000000000000000000000000000000000000"
216
+ }
217
+ },
218
+ {
219
+ "name": "REL7_4_30",
220
+ "commit": {
221
+ "sha": "0000000000000000000000000000000000000000"
222
+ }
223
+ },
224
+ {
225
+ "name": "Release_2_0",
226
+ "commit": {
227
+ "sha": "0000000000000000000000000000000000000000"
228
+ }
229
+ },
230
+ {
231
+ "name": "Release_1_0",
232
+ "commit": {
233
+ "sha": "0000000000000000000000000000000000000000"
234
+ }
235
+ },
236
+ {
237
+ "name": "REL_18_STABLE",
238
+ "commit": {
239
+ "sha": "0000000000000000000000000000000000000000"
240
+ }
241
+ }
242
+ ]