@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
@@ -17,6 +17,9 @@
17
17
  * - `implements`: each decision it names, with that decision's state;
18
18
  * - `acceptance`, for a kind with acceptance criteria (#2772): how many of the
19
19
  * record's criteria passing evidence of the expected verification meets;
20
+ * - `contract`, for a kind with a contract link (#3147): the contract record
21
+ * the item builds, with its state, read from the contract kind at the same
22
+ * revision;
20
23
  *
21
24
  * and each decision `implementedBy`, the work records naming it. The
22
25
  * warnings are closed codes. `work-done-gap-open` is not raised here: it
@@ -25,7 +28,7 @@
25
28
  */
26
29
  import { type LoadedRecordKind, type ReadRecordsOptions, type RecordEntry } from "./records.js";
27
30
  /** Why a work record carries a warning. Closed, like the record warning codes. */
28
- export declare const WORK_WARNING_CODES: readonly ["work-needs-unknown", "work-implements-unknown", "work-needs-cycle", "work-implements-undecided", "work-done-unpinned", "work-closed-without-date", "work-done-gap-open", "work-acceptance-unmet", "work-acceptance-self-verified"];
31
+ export declare const WORK_WARNING_CODES: readonly ["work-needs-unknown", "work-implements-unknown", "work-needs-cycle", "work-implements-undecided", "work-done-unpinned", "work-closed-without-date", "work-done-gap-open", "work-acceptance-unmet", "work-acceptance-self-verified", "work-contract-unknown", "work-contract-undecided", "work-tier-unknown"];
29
32
  export type WorkWarningCode = (typeof WORK_WARNING_CODES)[number];
30
33
  /** A link from a work record to another record, with that record's state now. */
31
34
  export interface WorkLink {
@@ -33,6 +36,28 @@ export interface WorkLink {
33
36
  /** The linked record's state, or null when no record has the id. */
34
37
  state: string | null;
35
38
  }
39
+ /**
40
+ * One decision-point answer about a work item (#3147), as `records --json`
41
+ * joins it from the answer kind the work kind names: the answer records whose
42
+ * `constrains` names the item's id. The item never copies them.
43
+ */
44
+ export interface WorkAnswer {
45
+ /** The answer record's id, such as understand-0123456789ab. */
46
+ id: string;
47
+ /** The decision point it answers. */
48
+ point: string | null;
49
+ /** escalated, proposed or answered. */
50
+ state: string | null;
51
+ /** The answer, or null while there is none. */
52
+ answer: string | boolean | null;
53
+ /** The people who answered or confirmed it, empty when a table or model did. */
54
+ answeredBy: string[];
55
+ }
56
+ /**
57
+ * The answers about each work item: every answer record whose `constrains`
58
+ * names the item's id, in path order, by item id.
59
+ */
60
+ export declare function workAnswers(answerRecords: readonly RecordEntry[], ids: Iterable<string>): Map<string, WorkAnswer[]>;
36
61
  /** A decision as a work read lists it: its state and the work records implementing it. */
37
62
  export interface DecisionWork {
38
63
  id: string;
@@ -1 +1 @@
1
- {"version":3,"file":"work.d.ts","sourceRoot":"","sources":["../../src/workspace/work.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAIH,OAAO,EAAmD,KAAK,gBAAgB,EAAE,KAAK,kBAAkB,EAAE,KAAK,WAAW,EAAE,MAAM,WAAW,CAAC;AAE9I,kFAAkF;AAClF,eAAO,MAAM,kBAAkB,+OAmBW,CAAC;AAC3C,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,kBAAkB,CAAC,CAAC,MAAM,CAAC,CAAC;AAElE,iFAAiF;AACjF,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,oEAAoE;IACpE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAED,0FAA0F;AAC1F,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,aAAa,EAAE,QAAQ,EAAE,CAAC;CAC3B;AAED,mIAAmI;AACnI,eAAO,MAAM,kBAAkB,8DAA+D,CAAC;AAC/F,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,kBAAkB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEnE,iEAAiE;AACjE,eAAO,MAAM,gBAAgB,2BAA4B,CAAC;AAC1D,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC;AAE/D,2DAA2D;AAC3D,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,gBAAgB,CAAC;CAChC;AAED,oFAAoF;AACpF,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,YAAY,EAAE,gBAAgB,CAAC;IAC/B,GAAG,EAAE,OAAO,CAAC;CACd;AAED,0FAA0F;AAC1F,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,cAAc,EAAE,CAAC;CAC5B;AAED,sJAAsJ;AACtJ,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,CAOnG;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,EACpC,IAAI,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,EAC5C,SAAS,EAAE,MAAM,GAChB;IAAE,UAAU,EAAE,cAAc,GAAG,IAAI,CAAC;IAAC,YAAY,EAAE,MAAM,EAAE,CAAA;CAAE,CAwB/D;AAED,mDAAmD;AACnD,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAGpF;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,gBAAgB,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAGvF;AAED;;;GAGG;AACH,wBAAsB,SAAS,CAAC,MAAM,EAAE,gBAAgB,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC;IAAE,SAAS,EAAE,YAAY,EAAE,CAAA;CAAE,CAAC,CAiGrJ"}
1
+ {"version":3,"file":"work.d.ts","sourceRoot":"","sources":["../../src/workspace/work.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://intentius.io/chant/schemas/workspace/principals/v1/workspace-principals.schema.json",
4
+ "title": "workspace-principals.json",
5
+ "description": "Principal classes a plugin supplies (#2524 D5, #3080, ws-079). A package publishes this file as data at its ./workspace-principals subpath, beside ./workspace-kinds. chant reads it with the file system and never imports the package. A class is a name for the principals holding one role in the trust policy at base; the declaration's writeScope may then give it an entry.",
6
+ "type": "object",
7
+ "required": ["schema", "classes"],
8
+ "properties": {
9
+ "$schema": {
10
+ "type": "string",
11
+ "description": "An editor hint. chant ignores it."
12
+ },
13
+ "$comment": {
14
+ "type": "string",
15
+ "description": "A note for people. chant ignores it."
16
+ },
17
+ "schema": {
18
+ "const": 1,
19
+ "description": "The principal classes format version."
20
+ },
21
+ "classes": {
22
+ "type": "array",
23
+ "minItems": 1,
24
+ "items": {
25
+ "$ref": "#/$defs/class"
26
+ }
27
+ }
28
+ },
29
+ "patternProperties": {
30
+ "^x-": true
31
+ },
32
+ "additionalProperties": false,
33
+ "$defs": {
34
+ "class": {
35
+ "type": "object",
36
+ "required": ["name", "description", "role"],
37
+ "properties": {
38
+ "name": {
39
+ "type": "string",
40
+ "pattern": "^(?!x-)[a-z][a-z0-9-]{0,39}$",
41
+ "description": "The class's name, as a key of the declaration's writeScope names it. human, agent, runner and service are the core classes and can't be supplied."
42
+ },
43
+ "description": {
44
+ "type": "string",
45
+ "minLength": 1,
46
+ "description": "One line saying who is in the class, for listings and error messages."
47
+ },
48
+ "role": {
49
+ "type": "string",
50
+ "pattern": "^[a-z][a-z0-9-]*$",
51
+ "description": "The role whose grant in the trust policy at base (.chant/trust.json roles) puts a principal in this class. The agent, runner and service roles belong to the core classes and can't be named here. One role puts a principal in one class."
52
+ }
53
+ },
54
+ "patternProperties": {
55
+ "^x-": true
56
+ },
57
+ "additionalProperties": false
58
+ }
59
+ }
60
+ }
@@ -25,27 +25,40 @@
25
25
  * detection only (ws-002).
26
26
  *
27
27
  * A principal's class comes from the role grants in the trust policy at base,
28
- * through {@link principalClass} alone (the agent, runner and service roles),
28
+ * through {@link principalClass} alone (the agent, runner and service roles,
29
+ * then the role each domain class a pinned package supplies names, #3080),
29
30
  * or from naming an agent session. Claiming a session only ever narrows what
30
31
  * a writer may do, so an unverified `CHANT_AGENT` or trailer is safe to honour.
32
+ *
33
+ * A writeScope key no pinned package supplies fails closed: a writer judged
34
+ * `human` might be in that class, so it is refused with
35
+ * `write-scope-class-unknown` until the plugin is installed at the pinned
36
+ * version or the entry is removed.
31
37
  */
32
- import { type AgentDeclaration, type ClassScope, type Declaration, type PrincipalClass, type WriteVerb } from "./declaration.js";
38
+ import { type AgentDeclaration, type ClassScope, type Declaration, type PrincipalClass, type ProtectedPath, type WriteVerb } from "./declaration.js";
39
+ import { classesOf, roleGrants, type ClassRegistry } from "./principal-classes.js";
33
40
  import { type TrustPolicy } from "./trust/policy.js";
41
+ import { AGENT_TRAILER } from "./trailers.js";
34
42
  /** The environment variable naming the agent session a write is made in. */
35
43
  export declare const AGENT_ENV = "CHANT_AGENT";
36
- /** The commit trailer naming the agent session a commit was made in. */
37
- export declare const AGENT_TRAILER = "Chant-Agent";
44
+ /** The commit trailer naming the agent session a commit was made in, one of chant's trailers (`trailers.ts`). */
45
+ export { AGENT_TRAILER };
38
46
  /** Why a write is outside its writer's scope. Closed. */
39
- export declare const WRITE_SCOPE_CODES: readonly ["write-scope-member", "write-scope-kind", "agent-unknown"];
47
+ export declare const WRITE_SCOPE_CODES: readonly ["write-scope-member", "write-scope-kind", "write-scope-class-unknown", "agent-unknown"];
40
48
  export type WriteScopeCode = (typeof WRITE_SCOPE_CODES)[number];
41
49
  /**
42
- * The role grants a class is read from. Every read of roles for write scope
43
- * goes through here, so where the grants live (`.chant/trust.json` today,
44
- * possibly the declaration, #2547) is decided in one place: the policy.
50
+ * What `check --changes` reports a path with: the record-write codes, and a
51
+ * write to a protected path (#3146), which a record write never is. Closed.
52
+ */
53
+ export declare const SCOPE_FINDING_CODES: readonly ["write-scope-member", "write-scope-kind", "write-scope-class-unknown", "agent-unknown", "write-scope-protected"];
54
+ export type ScopeFindingCode = (typeof SCOPE_FINDING_CODES)[number];
55
+ export { classesOf, roleGrants };
56
+ /**
57
+ * The class a principal is in: the first of agent, runner and service whose
58
+ * role it holds at base, then the first domain class in `classes` whose role
59
+ * it holds (#3080), or human.
45
60
  */
46
- export declare function roleGrants(policy: TrustPolicy): Record<string, string[]>;
47
- /** The class a principal is in: the first of agent, runner and service whose role it holds at base, or human. */
48
- export declare function principalClass(policy: TrustPolicy, principal: string | null): PrincipalClass;
61
+ export declare function principalClass(policy: TrustPolicy, principal: string | null, classes?: ClassRegistry): PrincipalClass;
49
62
  /** Who is writing, as the scope judges it. */
50
63
  export interface Writer {
51
64
  /** The principal named, or null when none is. */
@@ -66,11 +79,32 @@ export declare class WriteScopeError extends Error {
66
79
  export declare function resolveWriter(declaration: Declaration | null, policy: TrustPolicy, given: {
67
80
  agent?: string | null;
68
81
  principal?: string | null;
69
- }): Writer;
82
+ }, classes?: ClassRegistry): Writer;
83
+ /**
84
+ * Refuse `writer` when the declaration's writeScope names a class `classes`
85
+ * doesn't know and the writer is judged human (#3080): nothing says which
86
+ * role puts a principal in the unknown class, so this writer may be in it.
87
+ * A writer in another class is judged by that class, which comes first.
88
+ */
89
+ export declare function unknownClassVerdict(declaration: Declaration | null, writer: Writer, classes: ClassRegistry): {
90
+ ok: true;
91
+ } | {
92
+ ok: false;
93
+ code: "write-scope-class-unknown";
94
+ message: string;
95
+ };
70
96
  /** The scope that applies to `writer`, or null when its class is not restricted. An agent is always restricted to its member. */
71
97
  export declare function scopeOf(declaration: Declaration | null, writer: Writer): ClassScope | null;
72
98
  export type ScopeVerdict = {
73
99
  ok: true;
100
+ } | {
101
+ ok: false;
102
+ code: Exclude<ScopeFindingCode, "agent-unknown">;
103
+ message: string;
104
+ };
105
+ /** A record write's verdict: never write-scope-protected, since protected paths judge files that aren't records. */
106
+ export type RecordVerdict = {
107
+ ok: true;
74
108
  } | {
75
109
  ok: false;
76
110
  code: Exclude<WriteScopeCode, "agent-unknown">;
@@ -88,9 +122,30 @@ export interface ScopedKind {
88
122
  declared: boolean;
89
123
  }
90
124
  /** Whether `writer` may write a record of `kind` with `verb`. A delete is never in a restricted scope. */
91
- export declare function judgeRecord(declaration: Declaration | null, writer: Writer, kind: ScopedKind, verb: WriteVerb | "delete"): ScopeVerdict;
92
- /** Whether `writer` may write the file at `path`, from the workspace root. */
93
- export declare function judgePath(declaration: Declaration | null, writer: Writer, path: string): ScopeVerdict;
125
+ export declare function judgeRecord(declaration: Declaration | null, writer: Writer, kind: ScopedKind, verb: WriteVerb | "delete"): RecordVerdict;
126
+ /**
127
+ * The protected entry of `entries` that covers `path` (#3146, ws-077): one
128
+ * whose glob matches the path or a directory above it. Null when none does.
129
+ */
130
+ export declare function protectedEntry(entries: readonly ProtectedPath[], path: string): ProtectedPath | null;
131
+ /**
132
+ * Whether JSON text `before` and `after` differ only in the top-level keys
133
+ * `except` names. False when either is missing or isn't a JSON object.
134
+ */
135
+ export declare function onlyKeysChanged(before: string | null, after: string | null, except: readonly string[]): boolean;
136
+ /** A file's text before and after a write, read only when a protected entry with `except` needs it. */
137
+ export interface PathChange {
138
+ before(): string | null;
139
+ after(): string | null;
140
+ }
141
+ /**
142
+ * Whether `writer` may write the file at `path`, from the workspace root:
143
+ * the path is in a member the writer may write, and no protected entry of
144
+ * its scope covers it, unless the entry's `except` allows the change (#3146).
145
+ * Without `change`, a write to a path an `except` entry covers is judged as a
146
+ * change outside the allowed keys.
147
+ */
148
+ export declare function judgePath(declaration: Declaration | null, writer: Writer, path: string, change?: PathChange): ScopeVerdict;
94
149
  /** The declaration and policy a write on this machine is judged by. */
95
150
  export interface ScopeSource {
96
151
  declaration: Declaration | null;
@@ -101,6 +156,8 @@ export interface ScopeSource {
101
156
  /** The workspace root from the git root, "." for the git root, or null without a declaration. */
102
157
  root: string | null;
103
158
  policy: TrustPolicy;
159
+ /** The principal classes: the core four and those the declaration's pins supply, path pins read where the declaration was (#3080). */
160
+ classes: ClassRegistry;
104
161
  }
105
162
  /**
106
163
  * The scope for a write from `cwd`: the declaration and the trust policy at
@@ -119,6 +176,7 @@ export declare function scopedKind(source: ScopeSource, kindName: string, kindFi
119
176
  * Refuse a record write outside the writer's scope (#2548): throws a
120
177
  * {@link WriteScopeError}. `agent` is the session the write names
121
178
  * (`CHANT_AGENT`), and `principal` who the write names as its author.
179
+ * Returns what it read at base, for the identity rule (#3163).
122
180
  */
123
181
  export declare function refuseRecordWrite(cwd: string, write: {
124
182
  kindName: string;
@@ -127,7 +185,7 @@ export declare function refuseRecordWrite(cwd: string, write: {
127
185
  verb: WriteVerb;
128
186
  agent?: string | null;
129
187
  principal?: string | null;
130
- }): void;
188
+ }): ScopeSource;
131
189
  /** A commit as the scope check judged it. */
132
190
  export interface ScopeCommit {
133
191
  commit: string;
@@ -143,9 +201,9 @@ export interface ScopeCommit {
143
201
  paths: number;
144
202
  }
145
203
  export interface ScopeFinding {
146
- /** `finding:<code>:<commit>:<path>`, or `finding:agent-unknown:<commit>`. */
204
+ /** `finding:<code>:<commit>:<path>`, or `finding:<code>:<commit>` for agent-unknown and write-scope-class-unknown, which judge the whole commit. */
147
205
  id: string;
148
- code: WriteScopeCode;
206
+ code: ScopeFindingCode;
149
207
  commit: string;
150
208
  /** From the workspace root, or null for a finding on the whole commit. */
151
209
  path: string | null;
@@ -159,7 +217,7 @@ export interface ScopeFinding {
159
217
  export interface ScopeReport {
160
218
  /** The commit the declaration and the trust policy were read at. */
161
219
  base: string;
162
- /** The classes with a writeScope entry, and agent when any session is declared. */
220
+ /** The classes with a writeScope entry, and agent when any session is declared: core first, then domain classes in pin order, then any no pinned package supplies. */
163
221
  restricted: PrincipalClass[];
164
222
  agents: string[];
165
223
  commits: ScopeCommit[];
@@ -195,5 +253,7 @@ export declare function checkWriteScope(q: {
195
253
  prefix: string;
196
254
  declaration: Declaration;
197
255
  kinds: CheckKind[];
256
+ /** The principal classes the declaration's pins supply at base (#3080). Without it, the core four. */
257
+ classes?: ClassRegistry;
198
258
  }): Promise<ScopeReport | null>;
199
259
  //# sourceMappingURL=write-scope.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"write-scope.d.ts","sourceRoot":"","sources":["../../src/workspace/write-scope.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"write-scope.d.ts","sourceRoot":"","sources":["../../src/workspace/write-scope.ts"],"names":[],"mappings":"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"}
package/dist/yaml.d.ts CHANGED
@@ -1,24 +1,23 @@
1
1
  /**
2
- * Lightweight YAML emitter and parser.
2
+ * YAML emitter and parser.
3
3
  *
4
- * Covers the subset of YAML used by Chant lexicons (scalars, block arrays,
5
- * nested objects, block scalars, tagged values, anchors, aliases and merge
6
- * keys). Not a full YAML implementation: flow collections are read only when
7
- * they are JSON. `splitYAMLDocuments` splits a multi-document stream. The
8
- * parser throws a `YAMLParseError` on a line it cannot place instead of
9
- * dropping it (#2991).
4
+ * The emitter writes the block-style YAML chant's serializers produce. The
5
+ * parser is js-yaml with chant's schema (#3006): YAML 1.2 core types,
6
+ * merge keys, `yes`/`no` booleans, and local tags such as `!reference` read
7
+ * as strings. `splitYAMLDocuments` splits a multi-document stream. Input the
8
+ * parser cannot read throws a `YAMLParseError` naming the line.
10
9
  */
11
10
  export declare function emitYAML(value: unknown, indent: number): string;
12
- /** Result of parsing a YAML block. */
13
- export interface ParseResult {
14
- value: unknown;
15
- endIndex: number;
16
- }
17
11
  /**
18
- * Input the parser cannot place (#2991). The parser used to skip such a line,
19
- * or read it as a key of whatever mapping was open at the top level, so a
20
- * mis-indented or unsupported construct came back as a quietly different
21
- * document. Now it is an error naming the line.
12
+ * `key: value` at column `indent * 2`, for a serializer that writes a
13
+ * document key by key. A block value follows the colon on the next line; an
14
+ * inline one (a scalar, `{}`, `[]`) needs a space after the colon, or
15
+ * `jobs:{}` is the plain scalar "jobs:{}" rather than a key (#3006).
16
+ */
17
+ export declare function emitYAMLEntry(key: string, value: unknown, indent?: number): string;
18
+ /**
19
+ * A document the parser cannot read. Its message and `line` name the line,
20
+ * so `chant import` can report "YAML line N: ..." instead of a stack trace.
22
21
  */
23
22
  export declare class YAMLParseError extends Error {
24
23
  /** 1-based line number within the text handed to the parser. */
@@ -28,17 +27,16 @@ export declare class YAMLParseError extends Error {
28
27
  /**
29
28
  * Parse a YAML document (or JSON document) into a plain object.
30
29
  *
31
- * Tries `JSON.parse` first; falls back to a line-based YAML parser that
32
- * handles the subset of YAML commonly found in CI configuration files. Throws
33
- * {@link YAMLParseError} on a line it cannot place rather than dropping it.
30
+ * Tries `JSON.parse` first, then js-yaml (#3006). A top-level sequence reads
31
+ * as `{}`, since callers rely on getting a mapping back; use
32
+ * {@link parseYAMLDocument} for the list. Throws {@link YAMLParseError} with
33
+ * the line number on input it cannot read.
34
34
  */
35
35
  export declare function parseYAML(content: string): Record<string, unknown>;
36
36
  /**
37
37
  * Parse one YAML (or JSON) document whose top level may be a sequence
38
- * (#2965). {@link parseYAML} reads only a top-level mapping and returns `{}`
39
- * for a file like `- a\n- b`; its callers rely on getting a mapping back, so
40
- * it keeps doing that. This returns the list instead, and otherwise defers to
41
- * `parseYAML`.
38
+ * (#2965). {@link parseYAML} returns `{}` for a file like `- a\n- b`; this
39
+ * returns the list.
42
40
  */
43
41
  export declare function parseYAMLDocument(content: string): unknown;
44
42
  /**
@@ -49,22 +47,6 @@ export declare function parseYAMLDocument(content: string): unknown;
49
47
  * normalized to `\n`.
50
48
  */
51
49
  export declare function splitYAMLDocuments(content: string): string[];
52
- /**
53
- * Parse indentation-based YAML lines into a key-value object: the mapping
54
- * whose keys sit at column `baseIndent`, starting at `startIndex`.
55
- *
56
- * It ends at the first line that is not one of its keys: a line at another
57
- * column, a sequence entry, or text that is not `key:`. That line goes back
58
- * to the caller in `endIndex`; if no caller owns it, `parseYAML` reports it
59
- * (#2991). This function never skips a content line.
60
- */
61
- export declare function parseYAMLLines(lines: string[], startIndex: number, baseIndent: number): ParseResult;
62
- /**
63
- * Parse a block array: the `- ` entries at column `baseIndent`, starting at
64
- * `startIndex`. Like {@link parseYAMLLines} it ends at the first line that is
65
- * not one of its entries and hands that line back in `endIndex`.
66
- */
67
- export declare function parseYAMLArray(lines: string[], startIndex: number, baseIndent: number): ParseResult;
68
50
  /**
69
51
  * Coerce a scalar string to a typed value.
70
52
  */
@@ -1 +1 @@
1
- {"version":3,"file":"yaml.d.ts","sourceRoot":"","sources":["../src/yaml.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AA0BH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAgH/D;AAMD,sCAAsC;AACtC,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,OAAO,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;;;GAKG;AACH,qBAAa,cAAe,SAAQ,KAAK;IACvC,gEAAgE;IAChE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;gBAEV,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAK1C;AAmJD;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAalE;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAW1D;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAc5D;AAiFD;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,MAAM,EAAE,EACf,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,GACjB,WAAW,CAqBb;AA+MD;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,MAAM,EAAE,EACf,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,GACjB,WAAW,CA4Db;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAwBlD"}
1
+ {"version":3,"file":"yaml.d.ts","sourceRoot":"","sources":["../src/yaml.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AA4BH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAsH/D;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,SAAI,GAAG,MAAM,CAG7E;AAMD;;;GAGG;AACH,qBAAa,cAAe,SAAQ,KAAK;IACvC,gEAAgE;IAChE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB,YAAY,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAIxC;CACF;AAkID;;;;;;;GAOG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAQlE;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAO1D;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAc5D;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAwBlD"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@intentius/chant",
3
- "version": "0.101.0",
3
+ "version": "0.102.0",
4
4
  "description": "Declarative infrastructure-as-code toolkit — TypeScript on Node.js",
5
5
  "license": "Apache-2.0",
6
6
  "homepage": "https://intentius.io/chant",
@@ -97,7 +97,7 @@
97
97
  }
98
98
  },
99
99
  "scripts": {
100
- "build": "tsc -p tsconfig.build.json && tsc-alias -p tsconfig.build.json && find dist -type f \\( -name \"*.js\" -o -name \"*.js.map\" \\) -delete",
100
+ "build": "../../scripts/tsc7.sh -p tsconfig.build.json && tsc-alias -p tsconfig.build.json && find dist -type f \\( -name \"*.js\" -o -name \"*.js.map\" \\) -delete",
101
101
  "prepack": "npm run build"
102
102
  },
103
103
  "dependencies": {
@@ -117,11 +117,26 @@ export const PRIOR_ART = {
117
117
  // docs site. The three `general/secrets` checks chant credits live only here:
118
118
  // trivy dropped them when it absorbed tfsec.
119
119
  "tfsec": { name: "tfsec", url: "https://github.com/aquasecurity/tfsec", license: "MIT", kind: "scanner" },
120
+ "trivy-checks": { name: "trivy-checks", url: "https://github.com/aquasecurity/trivy-checks", license: "MIT", kind: "scanner" },
120
121
  // Semgrep's engine is LGPL-2.1 but its rules are not: they ship under the
121
122
  // proprietary Semgrep Rules License v1.0, which forbids redistribution. So
122
123
  // this entry carries no SPDX id, and no semgrep rule text is ever copied into
123
124
  // this repository — a credit by name and link is the whole of it (#2107).
124
125
  "semgrep": { name: "Semgrep Registry rules", url: "https://github.com/semgrep/semgrep-rules", license: "Semgrep Rules License v1.0 (proprietary, not an SPDX id)", kind: "scanner" },
126
+ // Prometheus and Grafana observability family (#2916). promtool and amtool
127
+ // ship in the Prometheus and Alertmanager repositories and have no per-rule
128
+ // ids: credits to them name the check (`check rules`, `check-config`) in the
129
+ // lineage file's comments and omit `rule`.
130
+ "promtool": { name: "promtool check rules", url: "https://prometheus.io/docs/prometheus/latest/command-line/promtool/#promtool-check-rules", license: "Apache-2.0", kind: "vendor-validator" },
131
+ "amtool": { name: "amtool check-config", url: "https://github.com/prometheus/alertmanager/blob/main/cmd/amtool/check_config.go", license: "Apache-2.0", kind: "vendor-validator" },
132
+ "pint": { name: "pint (Cloudflare)", url: "https://github.com/cloudflare/pint", license: "Apache-2.0", kind: "scanner" },
133
+ "dashboard-linter": { name: "Grafana dashboard-linter", url: "https://github.com/grafana/dashboard-linter", license: "Apache-2.0", kind: "scanner" },
134
+ // Postgres schema and migration checks (#3285). squawk and strong_migrations
135
+ // are migration linters; their type rules overlap schema-level checks. The
136
+ // wiki page is documentation, not a tool.
137
+ "squawk": { name: "squawk", url: "https://github.com/sbdchd/squawk", license: "Apache-2.0", kind: "scanner" },
138
+ "strong_migrations": { name: "strong_migrations", url: "https://github.com/ankane/strong_migrations", license: "MIT", kind: "scanner" },
139
+ "postgres-wiki-dont-do-this": { name: "PostgreSQL wiki: Don't Do This", url: "https://wiki.postgresql.org/wiki/Don%27t_Do_This", license: "n/a", kind: "specification" },
125
140
  } as const satisfies Record<string, PriorArtEntry>;
126
141
 
127
142
  export type PriorArtTool = keyof typeof PRIOR_ART;
@@ -33,6 +33,6 @@
33
33
  "devDependencies": {
34
34
  "@intentius/chant": "*",
35
35
  "tsc-alias": "^1.8.17",
36
- "typescript": "^5.9.3"
36
+ "typescript": "^5.9.3 || ^7.0.0"
37
37
  }
38
38
  }
@@ -3,6 +3,7 @@ import { mkdtempSync, writeFileSync, rmSync, readFileSync } from "fs";
3
3
  import { tmpdir } from "os";
4
4
  import { join } from "path";
5
5
  import { carveEmit, formatCarveEmit } from "./carve-emit";
6
+ import { generateTsConfig, SCAFFOLD_DEV_DEPENDENCIES } from "./init";
6
7
  import { lintCommand } from "./lint";
7
8
  import { loadHcl2json } from "../../terraform/parse";
8
9
  import { readCarveManifest } from "../../terraform/manifest";
@@ -136,6 +137,9 @@ describe("carve emit --state (real adoption from tfstate)", () => {
136
137
  const pkg = JSON.parse(readFileSync(join(out, "package.json"), "utf-8"));
137
138
  expect(pkg.scripts.build).toBe("chant build src --lexicon aws");
138
139
  expect(Object.keys(pkg.dependencies)).toEqual(["@intentius/chant", "@intentius/chant-lexicon-aws"]);
140
+ // What `chant init` writes, which test/example-tsconfigs.e2e.test.ts compiles under TS 5.9 and 7 (#3233).
141
+ expect(pkg.devDependencies).toEqual(SCAFFOLD_DEV_DEPENDENCIES);
142
+ expect(JSON.parse(readFileSync(join(out, "tsconfig.json"), "utf-8"))).toEqual(JSON.parse(generateTsConfig()));
139
143
  expect(readFileSync(join(out, "chant.config.ts"), "utf-8")).toContain('lexicons: ["aws"]');
140
144
 
141
145
  // A second emit into the same dir leaves the scaffold (and edits) alone.
@@ -22,7 +22,7 @@ import { resolveEmitProvider } from "../../terraform/carve-provider";
22
22
  import { readStateResource, type StateResource } from "../../terraform/state";
23
23
  import { writeCarveManifest, type CarveManifest } from "../../terraform/manifest";
24
24
  import { adoptFromState, type DeferredParam, type FoldedContribution } from "../../terraform/adopt-state";
25
- import { getChantVersion } from "./init";
25
+ import { generateTsConfig, getChantVersion, SCAFFOLD_DEV_DEPENDENCIES } from "./init";
26
26
  import type { LexiconPlugin, ResourceSelector } from "../../lexicon";
27
27
  import type { ImportResult, LiveImportOptions } from "./import";
28
28
 
@@ -242,8 +242,8 @@ function deferredParams(report: CarveReport, attributes: Record<string, unknown>
242
242
 
243
243
  /**
244
244
  * Scaffold the emitted source into a buildable chant project: chant.config.ts,
245
- * package.json, tsconfig.json — same shape `chant init` produces, so
246
- * `npm install && npm run build` works in the output dir as-is. Existing files
245
+ * package.json, tsconfig.json, with the tsconfig and devDependencies `chant init`
246
+ * writes (#3233), so `npm install && npm run build` works in the output dir as-is. Existing files
247
247
  * are never overwritten (re-emits and user edits survive). Deferred inputs are
248
248
  * declared as `buildParams` (#998), defaults taken from the state's resolved
249
249
  * values, so the first build reproduces what is live while every survivor-fed
@@ -263,26 +263,12 @@ function scaffoldProject(outDir: string, lexicon: string, params: DeferredParam[
263
263
  "@intentius/chant": `^${ver}`,
264
264
  [`@intentius/chant-lexicon-${lexicon}`]: `^${ver}`,
265
265
  },
266
- devDependencies: {
267
- typescript: "^5.0.0",
268
- },
269
- };
270
- const tsconfig = {
271
- compilerOptions: {
272
- target: "ES2022",
273
- module: "NodeNext",
274
- moduleResolution: "NodeNext",
275
- strict: true,
276
- esModuleInterop: true,
277
- skipLibCheck: true,
278
- },
279
- include: ["src"],
280
- exclude: ["node_modules"],
266
+ devDependencies: { ...SCAFFOLD_DEV_DEPENDENCIES },
281
267
  };
282
268
  const files: Array<[string, string]> = [
283
269
  ["package.json", JSON.stringify(packageJson, null, 2) + "\n"],
284
270
  ["chant.config.ts", renderConfig(lexicon, params)],
285
- ["tsconfig.json", JSON.stringify(tsconfig, null, 2) + "\n"],
271
+ ["tsconfig.json", generateTsConfig() + "\n"],
286
272
  ];
287
273
 
288
274
  const written: string[] = [];
@@ -1,7 +1,9 @@
1
1
  import { describe, test, expect } from "vitest";
2
2
  import { join, dirname } from "node:path";
3
3
  import { fileURLToPath } from "node:url";
4
- import { checkLexicon, coverageReportCheck } from "./check-lexicon";
4
+ import { mkdtempSync, mkdirSync, writeFileSync, rmSync } from "node:fs";
5
+ import { tmpdir } from "node:os";
6
+ import { checkLexicon, countComposites, coverageReportCheck } from "./check-lexicon";
5
7
  import { loadLexiconFromDir } from "./check-lexicon-plugin";
6
8
  import type { LexiconPlugin } from "../../lexicon";
7
9
 
@@ -76,3 +78,62 @@ describe("coverageReportCheck", () => {
76
78
  expect(item.detail).toBe("all spec kinds accounted for");
77
79
  });
78
80
  });
81
+
82
+ // chant #3104 — the composite rows counted every .ts file in src/composites/
83
+ // but index.ts, so otel's one composite (NodeAgent) reported as four: the
84
+ // catalog, its test and composites.test.ts counted too.
85
+ describe("countComposites", () => {
86
+ const entry = (name: string) => ({ name, lexicon: "x", description: "", bundles: [], params: [] });
87
+
88
+ test("asks the plugin's composites() when it has one, not the files", () => {
89
+ const plugin = { composites: () => [entry("A"), entry("B")] } as unknown as LexiconPlugin;
90
+ expect(countComposites(plugin, "/nonexistent")).toEqual({
91
+ count: 2,
92
+ detail: "2 composite(s) in composites()",
93
+ });
94
+ });
95
+
96
+ test("counts zero, with the error, when composites() throws", () => {
97
+ const plugin = {
98
+ composites: () => {
99
+ throw new Error("catalog broken");
100
+ },
101
+ } as unknown as LexiconPlugin;
102
+ const result = countComposites(plugin, "/nonexistent");
103
+ expect(result.count).toBe(0);
104
+ expect(result.detail).toContain("catalog broken");
105
+ });
106
+
107
+ test("without composites(), counts files but not tests, the catalog, the barrel or helpers", () => {
108
+ const dir = mkdtempSync(join(tmpdir(), "check-lexicon-3104-"));
109
+ try {
110
+ mkdirSync(join(dir, "src/composites"), { recursive: true });
111
+ for (const f of [
112
+ "web-app.ts",
113
+ "worker.ts",
114
+ "index.ts",
115
+ "catalog.ts",
116
+ "catalog.test.ts",
117
+ "composites.test.ts",
118
+ "web-app.snapshot.test.ts",
119
+ "otel-helpers.ts",
120
+ "helpers.ts",
121
+ "shared.ts",
122
+ ]) {
123
+ writeFileSync(join(dir, "src/composites", f), "");
124
+ }
125
+ expect(countComposites({} as LexiconPlugin, dir).count).toBe(2);
126
+ expect(countComposites(undefined, dir).count).toBe(2);
127
+ } finally {
128
+ rmSync(dir, { recursive: true, force: true });
129
+ }
130
+ });
131
+
132
+ test("otel reports its one composite", async () => {
133
+ const loaded = await loadLexiconFromDir(join(repoRoot, "lexicons", "otel"));
134
+ expect(countComposites(loaded.plugin, join(repoRoot, "lexicons", "otel"))).toEqual({
135
+ count: 1,
136
+ detail: "1 composite(s) in composites()",
137
+ });
138
+ });
139
+ });