@intentius/chant 0.124.27 → 0.124.28
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.
- package/README.md +1 -1
- package/dist/__golden__/wave-loop/fan-out-gated.json +8 -0
- package/dist/__golden__/wave-loop/fan-out-no-members.json +4 -0
- package/dist/__golden__/wave-loop/fan-out-only.json +6 -0
- package/dist/__golden__/wave-loop/op-by-apply-hold.json +2 -0
- package/dist/__golden__/wave-loop/op-cost-member.json +3 -0
- package/dist/__golden__/wave-loop/op-held-on-before-apply.json +1 -0
- package/dist/__golden__/wave-loop/op-held-on.json +2 -0
- package/dist/__golden__/wave-loop/op-hooks-held.json +2 -0
- package/dist/__golden__/wave-loop/op-hooks-hold-before-apply.json +2 -0
- package/dist/__golden__/wave-loop/op-hooks-refused-at-base.json +3 -0
- package/dist/__golden__/wave-loop/op-hooks-share.json +3 -0
- package/dist/__golden__/wave-loop/op-per-run.json +7 -0
- package/dist/__golden__/wave-loop/op-pr-review.json +7 -0
- package/dist/__golden__/wave-loop/op-sealed.json +3 -0
- package/dist/__golden__/wave-loop/op-spend.json +3 -0
- package/dist/__golden__/wave-loop/op-wave-commands.json +7 -0
- package/dist/__golden__/wave-loop/op-wide-waiting.json +4 -0
- package/dist/change-set-graph.d.ts +56 -0
- package/dist/change-set-graph.d.ts.map +1 -0
- package/dist/change-set-graph.js +128 -0
- package/dist/change-set.d.ts +52 -3
- package/dist/change-set.d.ts.map +1 -1
- package/dist/change-set.js +35 -4
- package/dist/chant-version.d.ts +9 -0
- package/dist/chant-version.d.ts.map +1 -0
- package/dist/chant-version.js +16 -0
- package/dist/cli/commands/build.d.ts +8 -0
- package/dist/cli/commands/build.d.ts.map +1 -1
- package/dist/cli/commands/build.js +9 -8
- package/dist/cli/commands/check-lexicon-docs.d.ts.map +1 -1
- package/dist/cli/commands/check-lexicon-docs.js +30 -2
- package/dist/cli/commands/check-lexicon.d.ts.map +1 -1
- package/dist/cli/commands/check-lexicon.js +13 -2
- package/dist/cli/commands/init-lexicon/templates/docs.d.ts +4 -1
- package/dist/cli/commands/init-lexicon/templates/docs.d.ts.map +1 -1
- package/dist/cli/commands/init-lexicon/templates/docs.js +6 -6
- package/dist/cli/commands/init-lexicon.d.ts.map +1 -1
- package/dist/cli/commands/init-lexicon.js +17 -8
- package/dist/cli/handlers/approve.d.ts.map +1 -1
- package/dist/cli/handlers/approve.js +19 -4
- package/dist/cli/handlers/build.d.ts.map +1 -1
- package/dist/cli/handlers/build.js +28 -0
- package/dist/cli/handlers/change-set.d.ts +10 -0
- package/dist/cli/handlers/change-set.d.ts.map +1 -1
- package/dist/cli/handlers/change-set.js +51 -1
- package/dist/cli/handlers/fan-out.d.ts +1 -1
- package/dist/cli/handlers/fan-out.d.ts.map +1 -1
- package/dist/cli/handlers/fan-out.js +14 -3
- package/dist/cli/handlers/pr.d.ts +8 -2
- package/dist/cli/handlers/pr.d.ts.map +1 -1
- package/dist/cli/handlers/pr.js +148 -24
- package/dist/cli/handlers/promote.d.ts.map +1 -1
- package/dist/cli/handlers/promote.js +256 -21
- package/dist/cli/handlers/release.d.ts +34 -0
- package/dist/cli/handlers/release.d.ts.map +1 -0
- package/dist/cli/handlers/release.js +203 -0
- package/dist/cli/handlers/run.d.ts +28 -2
- package/dist/cli/handlers/run.d.ts.map +1 -1
- package/dist/cli/handlers/run.js +170 -13
- package/dist/cli/main.d.ts.map +1 -1
- package/dist/cli/main.js +88 -13
- package/dist/cli/mcp/workspace-tools.js +1 -1
- package/dist/cli/parse-args.d.ts.map +1 -1
- package/dist/cli/parse-args.js +49 -3
- package/dist/cli/registry.d.ts +29 -3
- package/dist/cli/registry.d.ts.map +1 -1
- package/dist/cli/run-events.d.ts +29 -0
- package/dist/cli/run-events.d.ts.map +1 -0
- package/dist/cli/run-events.js +47 -0
- package/dist/cli/version.d.ts +3 -5
- package/dist/cli/version.d.ts.map +1 -1
- package/dist/cli/version.js +3 -13
- package/dist/codegen/docs-in-site.d.ts +71 -0
- package/dist/codegen/docs-in-site.d.ts.map +1 -0
- package/dist/codegen/docs-in-site.js +177 -0
- package/dist/codegen/docs-types.d.ts +14 -1
- package/dist/codegen/docs-types.d.ts.map +1 -1
- package/dist/codegen/docs.d.ts +18 -1
- package/dist/codegen/docs.d.ts.map +1 -1
- package/dist/codegen/docs.js +40 -7
- package/dist/codegen/rehype-base-url.mjs +15 -9
- package/dist/components/auto-release.d.ts +4 -1
- package/dist/components/auto-release.d.ts.map +1 -1
- package/dist/components/auto-release.js +2 -0
- package/dist/components/cli-support.d.ts +6 -0
- package/dist/components/cli-support.d.ts.map +1 -1
- package/dist/components/cli-support.js +10 -9
- package/dist/components/driver.d.ts +42 -9
- package/dist/components/driver.d.ts.map +1 -1
- package/dist/components/driver.js +81 -54
- package/dist/components/fan-out-run.d.ts +7 -0
- package/dist/components/fan-out-run.d.ts.map +1 -1
- package/dist/components/fan-out-run.js +35 -26
- package/dist/components/pr-run.d.ts +11 -0
- package/dist/components/pr-run.d.ts.map +1 -1
- package/dist/components/pr-run.js +20 -1
- package/dist/components/promote-order.d.ts +38 -0
- package/dist/components/promote-order.d.ts.map +1 -0
- package/dist/components/promote-order.js +62 -0
- package/dist/components/promote.d.ts +15 -2
- package/dist/components/promote.d.ts.map +1 -1
- package/dist/components/promote.js +17 -0
- package/dist/components/release-compile.d.ts +133 -0
- package/dist/components/release-compile.d.ts.map +1 -0
- package/dist/components/release-compile.js +376 -0
- package/dist/components/release-gate.d.ts +125 -0
- package/dist/components/release-gate.d.ts.map +1 -0
- package/dist/components/release-gate.js +282 -0
- package/dist/components/release-promote.d.ts +96 -0
- package/dist/components/release-promote.d.ts.map +1 -0
- package/dist/components/release-promote.js +204 -0
- package/dist/components/run-progress.d.ts +7 -0
- package/dist/components/run-progress.d.ts.map +1 -1
- package/dist/components/wave-plan.d.ts +3 -1
- package/dist/components/wave-plan.d.ts.map +1 -1
- package/dist/components/wave-plan.js +1 -1
- package/dist/config.d.ts +7 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/lifecycle/change-set-store.d.ts +67 -0
- package/dist/lifecycle/change-set-store.d.ts.map +1 -0
- package/dist/lifecycle/change-set-store.js +96 -0
- package/dist/lifecycle/commit-sha.d.ts +13 -0
- package/dist/lifecycle/commit-sha.d.ts.map +1 -0
- package/dist/lifecycle/commit-sha.js +21 -0
- package/dist/lifecycle/gate-change-set.d.ts +69 -0
- package/dist/lifecycle/gate-change-set.d.ts.map +1 -0
- package/dist/lifecycle/gate-change-set.js +106 -0
- package/dist/lifecycle/gate-ledger.d.ts +49 -1
- package/dist/lifecycle/gate-ledger.d.ts.map +1 -1
- package/dist/lifecycle/gate-ledger.js +18 -0
- package/dist/lifecycle/release-cut.d.ts +107 -0
- package/dist/lifecycle/release-cut.d.ts.map +1 -0
- package/dist/lifecycle/release-cut.js +273 -0
- package/dist/lifecycle/release-ledger.d.ts +54 -0
- package/dist/lifecycle/release-ledger.d.ts.map +1 -1
- package/dist/lifecycle/release-ledger.js +53 -20
- package/dist/lifecycle/release-store.d.ts +190 -0
- package/dist/lifecycle/release-store.d.ts.map +1 -0
- package/dist/lifecycle/release-store.js +318 -0
- package/dist/lifecycle/run-ledger.d.ts +4 -0
- package/dist/lifecycle/run-ledger.d.ts.map +1 -1
- package/dist/lifecycle/run-ledger.js +2 -0
- package/dist/op/activities/change-coverage.d.ts.map +1 -1
- package/dist/op/activities/change-coverage.js +4 -2
- package/dist/op/activities/source-release.d.ts.map +1 -1
- package/dist/op/activities/source-release.js +7 -3
- package/dist/op/activities/source-rollback.d.ts.map +1 -1
- package/dist/op/activities/source-rollback.js +7 -3
- package/dist/op/gate-name.d.ts +11 -2
- package/dist/op/gate-name.d.ts.map +1 -1
- package/dist/op/gate-name.js +12 -3
- package/dist/op/gate-run-locator.d.ts +22 -0
- package/dist/op/gate-run-locator.d.ts.map +1 -1
- package/dist/op/gate-run-locator.js +31 -0
- package/dist/op/gate.d.ts +27 -3
- package/dist/op/gate.d.ts.map +1 -1
- package/dist/op/gate.js +57 -3
- package/dist/op/local-executor.d.ts +36 -1
- package/dist/op/local-executor.d.ts.map +1 -1
- package/dist/op/local-executor.js +158 -52
- package/dist/op/op-waves-run.d.ts.map +1 -1
- package/dist/op/op-waves-run.js +4 -0
- package/dist/op/run-live.d.ts +2 -0
- package/dist/op/run-live.d.ts.map +1 -1
- package/dist/op/run-live.js +1 -1
- package/dist/op/runtime.d.ts +46 -0
- package/dist/op/runtime.d.ts.map +1 -1
- package/dist/op/runtimes/local.d.ts.map +1 -1
- package/dist/op/runtimes/local.js +8 -0
- package/dist/point-decision.d.ts +2 -0
- package/dist/point-decision.d.ts.map +1 -1
- package/dist/point-decision.js +9 -2
- package/dist/run-event-store.d.ts +77 -0
- package/dist/run-event-store.d.ts.map +1 -0
- package/dist/run-event-store.js +204 -0
- package/dist/run-event-stream.d.ts +132 -0
- package/dist/run-event-stream.d.ts.map +1 -0
- package/dist/run-event-stream.js +238 -0
- package/dist/run-event.d.ts +267 -0
- package/dist/run-event.d.ts.map +1 -0
- package/dist/run-event.js +207 -0
- package/dist/wave-runtime.mjs +204 -199
- package/dist/workspace/__fixtures__/run-event-check.d.ts +19 -0
- package/dist/workspace/__fixtures__/run-event-check.d.ts.map +1 -0
- package/dist/workspace/__fixtures__/run-event-check.js +59 -0
- package/dist/workspace/change-set-show.d.ts +56 -0
- package/dist/workspace/change-set-show.d.ts.map +1 -0
- package/dist/workspace/change-set-show.js +54 -0
- package/dist/workspace/change-set-show.schema.json +102 -0
- package/dist/workspace/change-set.schema.json +28 -1
- package/dist/workspace/changes-cli.d.ts.map +1 -1
- package/dist/workspace/changes-cli.js +10 -1
- package/dist/workspace/changes.d.ts +37 -0
- package/dist/workspace/changes.d.ts.map +1 -1
- package/dist/workspace/changes.js +49 -2
- package/dist/workspace/changes.schema.json +135 -0
- package/dist/workspace/ci-green-cli.d.ts +19 -4
- package/dist/workspace/ci-green-cli.d.ts.map +1 -1
- package/dist/workspace/ci-green-cli.js +75 -12
- package/dist/workspace/ci-green-forge.d.ts +20 -3
- package/dist/workspace/ci-green-forge.d.ts.map +1 -1
- package/dist/workspace/ci-green-forge.js +6 -4
- package/dist/workspace/ci-green-workflow.d.ts +11 -0
- package/dist/workspace/ci-green-workflow.d.ts.map +1 -1
- package/dist/workspace/ci-green-workflow.js +6 -0
- package/dist/workspace/ci-green.d.ts +273 -13
- package/dist/workspace/ci-green.d.ts.map +1 -1
- package/dist/workspace/ci-green.js +449 -38
- package/dist/workspace/ci-last-green.schema.json +32 -2
- package/dist/workspace/ci-list.schema.json +525 -0
- package/dist/workspace/commit-links.d.ts +85 -0
- package/dist/workspace/commit-links.d.ts.map +1 -0
- package/dist/workspace/commit-links.js +163 -0
- package/dist/workspace/declaration.d.ts +19 -0
- package/dist/workspace/declaration.d.ts.map +1 -1
- package/dist/workspace/declaration.js +1 -1
- package/dist/workspace/declaration.schema.json +12 -0
- package/dist/workspace/identity-gate-rule.d.ts +37 -0
- package/dist/workspace/identity-gate-rule.d.ts.map +1 -1
- package/dist/workspace/identity-gate-rule.js +72 -7
- package/dist/workspace/identity.d.ts +12 -0
- package/dist/workspace/identity.d.ts.map +1 -1
- package/dist/workspace/identity.js +13 -1
- package/dist/workspace/intent.d.ts +6 -1
- package/dist/workspace/intent.d.ts.map +1 -1
- package/dist/workspace/intent.js +51 -1
- package/dist/workspace/ls.d.ts +4 -0
- package/dist/workspace/ls.d.ts.map +1 -1
- package/dist/workspace/ls.js +2 -0
- package/dist/workspace/ls.schema.json +3 -1
- package/dist/workspace/member-pipeline.d.ts +6 -0
- package/dist/workspace/member-pipeline.d.ts.map +1 -1
- package/dist/workspace/member-pipeline.js +6 -0
- package/dist/workspace/promotion-order.d.ts +41 -0
- package/dist/workspace/promotion-order.d.ts.map +1 -0
- package/dist/workspace/promotion-order.js +95 -0
- package/dist/workspace/reason-codes.d.ts +2 -0
- package/dist/workspace/reason-codes.d.ts.map +1 -1
- package/dist/workspace/reason-codes.js +4 -1
- package/dist/workspace/releases.d.ts +72 -0
- package/dist/workspace/releases.d.ts.map +1 -0
- package/dist/workspace/releases.js +94 -0
- package/dist/workspace/releases.schema.json +391 -0
- package/dist/workspace/run-event.schema.json +288 -0
- package/dist/workspace/status-gates.d.ts +26 -1
- package/dist/workspace/status-gates.d.ts.map +1 -1
- package/dist/workspace/status-gates.js +31 -2
- package/dist/workspace/status-stewards.d.ts +4 -0
- package/dist/workspace/status-stewards.d.ts.map +1 -1
- package/dist/workspace/status-stewards.js +2 -0
- package/dist/workspace/status.d.ts +39 -0
- package/dist/workspace/status.d.ts.map +1 -1
- package/dist/workspace/status.js +48 -1
- package/dist/workspace/status.schema.json +70 -1
- package/dist/workspace/trust/ci-tag-statement.d.ts +102 -0
- package/dist/workspace/trust/ci-tag-statement.d.ts.map +1 -0
- package/dist/workspace/trust/ci-tag-statement.js +123 -0
- package/dist/workspace/trust/op-run-statement.d.ts +91 -0
- package/dist/workspace/trust/op-run-statement.d.ts.map +1 -0
- package/dist/workspace/trust/op-run-statement.js +143 -0
- package/dist/workspace/trust/rotation.d.ts +18 -2
- package/dist/workspace/trust/rotation.d.ts.map +1 -1
- package/dist/workspace/trust/rotation.js +65 -16
- package/dist/workspace/trust/seal.d.ts +11 -0
- package/dist/workspace/trust/seal.d.ts.map +1 -1
- package/dist/workspace/trust/seal.js +9 -0
- package/dist/workspace/trust/ssh-commit.d.ts.map +1 -1
- package/dist/workspace/trust/ssh-commit.js +10 -10
- package/package.json +1 -1
- package/src/__golden__/wave-loop/fan-out-gated.json +8 -0
- package/src/__golden__/wave-loop/fan-out-no-members.json +4 -0
- package/src/__golden__/wave-loop/fan-out-only.json +6 -0
- package/src/__golden__/wave-loop/op-by-apply-hold.json +2 -0
- package/src/__golden__/wave-loop/op-cost-member.json +3 -0
- package/src/__golden__/wave-loop/op-held-on-before-apply.json +1 -0
- package/src/__golden__/wave-loop/op-held-on.json +2 -0
- package/src/__golden__/wave-loop/op-hooks-held.json +2 -0
- package/src/__golden__/wave-loop/op-hooks-hold-before-apply.json +2 -0
- package/src/__golden__/wave-loop/op-hooks-refused-at-base.json +3 -0
- package/src/__golden__/wave-loop/op-hooks-share.json +3 -0
- package/src/__golden__/wave-loop/op-per-run.json +7 -0
- package/src/__golden__/wave-loop/op-pr-review.json +7 -0
- package/src/__golden__/wave-loop/op-sealed.json +3 -0
- package/src/__golden__/wave-loop/op-spend.json +3 -0
- package/src/__golden__/wave-loop/op-wave-commands.json +7 -0
- package/src/__golden__/wave-loop/op-wide-waiting.json +4 -0
- package/src/change-set-graph.test.ts +72 -0
- package/src/change-set-graph.ts +133 -0
- package/src/change-set.ts +76 -6
- package/src/chant-version.ts +16 -0
- package/src/cli/commands/build.ts +19 -8
- package/src/cli/commands/check-lexicon-docs.test.ts +51 -0
- package/src/cli/commands/check-lexicon-docs.ts +39 -2
- package/src/cli/commands/check-lexicon.ts +14 -2
- package/src/cli/commands/init-lexicon/templates/docs.ts +7 -6
- package/src/cli/commands/init-lexicon.test.ts +25 -0
- package/src/cli/commands/init-lexicon.ts +18 -8
- package/src/cli/handlers/approve-release.test.ts +80 -0
- package/src/cli/handlers/approve.ts +18 -2
- package/src/cli/handlers/build.test.ts +52 -0
- package/src/cli/handlers/build.ts +29 -0
- package/src/cli/handlers/change-set.ts +49 -1
- package/src/cli/handlers/fan-out.test.ts +48 -0
- package/src/cli/handlers/fan-out.ts +15 -3
- package/src/cli/handlers/operator.test.ts +37 -0
- package/src/cli/handlers/pr.test.ts +194 -0
- package/src/cli/handlers/pr.ts +168 -34
- package/src/cli/handlers/promote.test.ts +389 -5
- package/src/cli/handlers/promote.ts +279 -20
- package/src/cli/handlers/release-implicit.e2e.test.ts +153 -0
- package/src/cli/handlers/release.e2e.test.ts +85 -0
- package/src/cli/handlers/release.ts +206 -0
- package/src/cli/handlers/run-auto-release.test.ts +71 -0
- package/src/cli/handlers/run-events-cmd.test.ts +92 -0
- package/src/cli/handlers/run.test.ts +30 -0
- package/src/cli/handlers/run.ts +176 -15
- package/src/cli/main.test.ts +7 -0
- package/src/cli/main.ts +88 -13
- package/src/cli/mcp/never-over-mcp.test.ts +2 -0
- package/src/cli/mcp/workspace-tools.ts +1 -1
- package/src/cli/parse-args.ts +37 -3
- package/src/cli/registry.ts +29 -3
- package/src/cli/run-events.ts +54 -0
- package/src/cli/version.ts +3 -13
- package/src/codegen/docs-in-site.test.ts +166 -0
- package/src/codegen/docs-in-site.ts +182 -0
- package/src/codegen/docs-site/AgentPrompt.astro +26 -1
- package/src/codegen/docs-types.ts +14 -1
- package/src/codegen/docs.ts +60 -7
- package/src/codegen/rehype-base-url.d.mts +3 -1
- package/src/codegen/rehype-base-url.mjs +15 -9
- package/src/codegen/rehype-base-url.test.ts +34 -0
- package/src/components/auto-release.test.ts +21 -0
- package/src/components/auto-release.ts +6 -1
- package/src/components/cli-support.test.ts +82 -0
- package/src/components/cli-support.ts +16 -9
- package/src/components/driver.ts +129 -56
- package/src/components/fan-out-run.ts +56 -35
- package/src/components/pr-run.ts +30 -1
- package/src/components/promote-order.test.ts +90 -0
- package/src/components/promote-order.ts +75 -0
- package/src/components/promote.test.ts +10 -1
- package/src/components/promote.ts +26 -1
- package/src/components/release-compile.test.ts +147 -0
- package/src/components/release-compile.ts +445 -0
- package/src/components/release-gate.test.ts +215 -0
- package/src/components/release-gate.ts +341 -0
- package/src/components/release-promote.test.ts +159 -0
- package/src/components/release-promote.ts +232 -0
- package/src/components/run-progress.ts +7 -0
- package/src/components/wave-plan.ts +1 -1
- package/src/config.ts +7 -1
- package/src/index.ts +2 -0
- package/src/lifecycle/change-set-store.test.ts +217 -0
- package/src/lifecycle/change-set-store.ts +112 -0
- package/src/lifecycle/commit-sha.ts +23 -0
- package/src/lifecycle/gate-change-set.e2e.test.ts +122 -0
- package/src/lifecycle/gate-change-set.ts +133 -0
- package/src/lifecycle/gate-ledger.test.ts +33 -0
- package/src/lifecycle/gate-ledger.ts +66 -1
- package/src/lifecycle/release-cut-signed.test.ts +180 -0
- package/src/lifecycle/release-cut.test.ts +411 -0
- package/src/lifecycle/release-cut.ts +367 -0
- package/src/lifecycle/release-ledger.test.ts +14 -0
- package/src/lifecycle/release-ledger.ts +85 -17
- package/src/lifecycle/release-store.ts +423 -0
- package/src/lifecycle/run-ledger.test.ts +10 -0
- package/src/lifecycle/run-ledger.ts +6 -0
- package/src/op/activities/change-coverage.ts +4 -1
- package/src/op/activities/source-release.ts +8 -3
- package/src/op/activities/source-rollback.ts +8 -4
- package/src/op/commit-run-gate-deploy-join.test.ts +117 -0
- package/src/op/gate-name.ts +13 -3
- package/src/op/gate-release.test.ts +126 -0
- package/src/op/gate-run-locator.test.ts +110 -0
- package/src/op/gate-run-locator.ts +35 -0
- package/src/op/gate.ts +88 -6
- package/src/op/local-executor.ts +207 -52
- package/src/op/op-waves-run.ts +4 -0
- package/src/op/run-events.test.ts +166 -0
- package/src/op/run-live.ts +1 -1
- package/src/op/runtime.ts +39 -0
- package/src/op/runtimes/local.test.ts +16 -0
- package/src/op/runtimes/local.ts +9 -0
- package/src/point-decision.ts +12 -2
- package/src/run-event-store.test.ts +144 -0
- package/src/run-event-store.ts +213 -0
- package/src/run-event-stream.test.ts +175 -0
- package/src/run-event-stream.ts +306 -0
- package/src/run-event.test.ts +277 -0
- package/src/run-event.ts +451 -0
- package/src/wave-loop-golden.test.ts +9 -0
- package/src/workspace/__fixtures__/run-event-check.ts +58 -0
- package/src/workspace/ancestry-index.test.ts +93 -0
- package/src/workspace/change-set-show.schema.json +102 -0
- package/src/workspace/change-set-show.ts +72 -0
- package/src/workspace/change-set.schema.json +28 -1
- package/src/workspace/changes-cli.ts +10 -1
- package/src/workspace/changes.schema.json +135 -0
- package/src/workspace/changes.test.ts +1 -1
- package/src/workspace/changes.ts +84 -2
- package/src/workspace/ci-green-cli.ts +75 -13
- package/src/workspace/ci-green-forge.ts +24 -4
- package/src/workspace/ci-green-runs.test.ts +242 -0
- package/src/workspace/ci-green-signed.test.ts +302 -0
- package/src/workspace/ci-green-workflow.test.ts +16 -0
- package/src/workspace/ci-green-workflow.ts +12 -0
- package/src/workspace/ci-green.test.ts +131 -2
- package/src/workspace/ci-green.ts +624 -42
- package/src/workspace/ci-last-green.schema.json +32 -2
- package/src/workspace/ci-list.schema.json +525 -0
- package/src/workspace/commit-links.test.ts +279 -0
- package/src/workspace/commit-links.ts +183 -0
- package/src/workspace/declaration.schema.json +12 -0
- package/src/workspace/declaration.ts +22 -2
- package/src/workspace/identity-gate-rule.ts +91 -7
- package/src/workspace/identity.ts +14 -1
- package/src/workspace/intent.ts +48 -1
- package/src/workspace/ls.schema.json +3 -1
- package/src/workspace/ls.ts +6 -0
- package/src/workspace/member-pipeline.test.ts +17 -0
- package/src/workspace/member-pipeline.ts +9 -0
- package/src/workspace/promotion-order.ts +97 -0
- package/src/workspace/read-contract.e2e.test.ts +4 -1
- package/src/workspace/reason-codes.test.ts +2 -1
- package/src/workspace/reason-codes.ts +4 -1
- package/src/workspace/releases.schema.json +391 -0
- package/src/workspace/releases.test.ts +108 -0
- package/src/workspace/releases.ts +122 -0
- package/src/workspace/run-event.schema.json +288 -0
- package/src/workspace/status-contract.test.ts +52 -1
- package/src/workspace/status-gates.ts +56 -1
- package/src/workspace/status-stewards.ts +6 -0
- package/src/workspace/status.schema.json +70 -1
- package/src/workspace/status.ts +80 -1
- package/src/workspace/trust/ci-tag-statement.ts +151 -0
- package/src/workspace/trust/op-run-statement.ts +148 -0
- package/src/workspace/trust/rotation.ts +61 -14
- package/src/workspace/trust/seal.ts +10 -0
- package/src/workspace/trust/ssh-commit.ts +10 -9
- package/src/cli/commands/__fixtures__/init-lexicon-output/docs/astro.config.mjs +0 -14
- package/src/cli/commands/__fixtures__/init-lexicon-output/docs/package.json +0 -16
- package/src/cli/commands/__fixtures__/init-lexicon-output/docs/src/content/docs/index.mdx +0 -8
- package/src/cli/commands/__fixtures__/init-lexicon-output/docs/src/content.config.ts +0 -15
- package/src/cli/commands/__fixtures__/init-lexicon-output/docs/tsconfig.json +0 -10
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Place a change set's entries on the graph (#4022).
|
|
3
|
+
*
|
|
4
|
+
* A reader such as behold draws the graph `chant graph --format ir` and
|
|
5
|
+
* `chant workspace graph` print, and wants each change of a change set on the
|
|
6
|
+
* node it changes. The planner's address is not that node's id: a terraform
|
|
7
|
+
* plan names an instance, `module.app.terraform_data.instance[0]`, where the
|
|
8
|
+
* graph has one node per block, `<root>/module.app/terraform_data.instance`
|
|
9
|
+
* (the terraform lexicon's entity key, `hcl/parse.ts`). So chant maps the
|
|
10
|
+
* address itself, against the node ids of the graph it read, and a reader
|
|
11
|
+
* never derives an id.
|
|
12
|
+
*
|
|
13
|
+
* {@link changeSetNodeCandidates} lists the ids an entry's address can have,
|
|
14
|
+
* by planner. {@link mapChangeSetToGraph} keeps the first that the graph
|
|
15
|
+
* holds and puts the member's name in front, as `chant workspace graph`
|
|
16
|
+
* does. An entry whose address the graph does not hold gets `node: null`:
|
|
17
|
+
* a delete of a block the source no longer declares, or a warden or sql
|
|
18
|
+
* change outside the graph.
|
|
19
|
+
*
|
|
20
|
+
* Like `./change-set.ts`, this imports nothing at run time, so it bundles
|
|
21
|
+
* into one file with the change-set code.
|
|
22
|
+
*/
|
|
23
|
+
/**
|
|
24
|
+
* Split a terraform address into its dot-separated parts, dropping every
|
|
25
|
+
* `[...]` index. A quoted key may hold `.` or `]`, so quotes are honoured.
|
|
26
|
+
*/
|
|
27
|
+
function terraformParts(address) {
|
|
28
|
+
const parts = [];
|
|
29
|
+
let current = "";
|
|
30
|
+
let depth = 0;
|
|
31
|
+
let quoted = false;
|
|
32
|
+
for (let i = 0; i < address.length; i++) {
|
|
33
|
+
const c = address[i];
|
|
34
|
+
if (depth > 0) {
|
|
35
|
+
if (quoted) {
|
|
36
|
+
if (c === "\\")
|
|
37
|
+
i++;
|
|
38
|
+
else if (c === '"')
|
|
39
|
+
quoted = false;
|
|
40
|
+
}
|
|
41
|
+
else if (c === '"')
|
|
42
|
+
quoted = true;
|
|
43
|
+
else if (c === "]")
|
|
44
|
+
depth--;
|
|
45
|
+
continue;
|
|
46
|
+
}
|
|
47
|
+
if (c === "[")
|
|
48
|
+
depth++;
|
|
49
|
+
else if (c === ".") {
|
|
50
|
+
parts.push(current);
|
|
51
|
+
current = "";
|
|
52
|
+
}
|
|
53
|
+
else
|
|
54
|
+
current += c;
|
|
55
|
+
}
|
|
56
|
+
parts.push(current);
|
|
57
|
+
return parts.filter((p) => p.length > 0);
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* The block key the terraform lexicon gives an address in its root:
|
|
61
|
+
* `module.<call>/` for each module call, then the block's own address with
|
|
62
|
+
* no index. `module.app.terraform_data.instance[0]` is
|
|
63
|
+
* `module.app/terraform_data.instance`.
|
|
64
|
+
*/
|
|
65
|
+
export function terraformBlockKey(address) {
|
|
66
|
+
const parts = terraformParts(address);
|
|
67
|
+
const scope = [];
|
|
68
|
+
let i = 0;
|
|
69
|
+
while (parts[i] === "module" && i + 1 < parts.length) {
|
|
70
|
+
scope.push(`module.${parts[i + 1]}`);
|
|
71
|
+
i += 2;
|
|
72
|
+
}
|
|
73
|
+
const rest = parts.slice(i);
|
|
74
|
+
let block;
|
|
75
|
+
if (rest[0] === "data" && rest.length >= 3)
|
|
76
|
+
block = `data.${rest[1]}.${rest[2]}`;
|
|
77
|
+
else if (rest.length >= 2)
|
|
78
|
+
block = `${rest[0]}.${rest[1]}`;
|
|
79
|
+
else if (rest.length === 0 && scope.length > 0) {
|
|
80
|
+
// The module call itself is a block of its caller.
|
|
81
|
+
const call = scope.pop();
|
|
82
|
+
block = call;
|
|
83
|
+
}
|
|
84
|
+
if (block === undefined)
|
|
85
|
+
return undefined;
|
|
86
|
+
return [...scope, block].join("/");
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* The ids, in the order tried, that an entry's address can have in its
|
|
90
|
+
* member's graph IR:
|
|
91
|
+
*
|
|
92
|
+
* - `chant`: the address, which is the entity name the IR uses as its id.
|
|
93
|
+
* - `terraform`, `tofu`, `choudoufu`: `<root>/<block key>`, the root being
|
|
94
|
+
* the change-set member (`terraformBlockKey`), then the address.
|
|
95
|
+
* - `warden`, `sql`: the address.
|
|
96
|
+
*/
|
|
97
|
+
export function changeSetNodeCandidates(entry) {
|
|
98
|
+
switch (entry.planner) {
|
|
99
|
+
case "terraform":
|
|
100
|
+
case "tofu":
|
|
101
|
+
case "choudoufu": {
|
|
102
|
+
const key = terraformBlockKey(entry.address);
|
|
103
|
+
return key === undefined ? [entry.address] : [`${entry.member}/${key}`, entry.address];
|
|
104
|
+
}
|
|
105
|
+
default:
|
|
106
|
+
return [entry.address];
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* The document with each entry's `node` set from `graph`, and `graph`
|
|
111
|
+
* recording which graph it was. A null `graph` (none could be read) gives
|
|
112
|
+
* every entry `node: null`. The digest is unchanged: `node` is not hashed.
|
|
113
|
+
*/
|
|
114
|
+
export function mapChangeSetToGraph(doc, graph) {
|
|
115
|
+
if (graph === null) {
|
|
116
|
+
return { ...doc, entries: doc.entries.map((e) => ({ ...e, node: null })), graph: null };
|
|
117
|
+
}
|
|
118
|
+
const ids = new Set(graph.ids);
|
|
119
|
+
const prefix = graph.member ? `${graph.member}/` : "";
|
|
120
|
+
return {
|
|
121
|
+
...doc,
|
|
122
|
+
entries: doc.entries.map((e) => {
|
|
123
|
+
const id = changeSetNodeCandidates(e).find((c) => ids.has(c));
|
|
124
|
+
return { ...e, node: id === undefined ? null : `${prefix}${id}` };
|
|
125
|
+
}),
|
|
126
|
+
graph: { member: graph.member, at: graph.at },
|
|
127
|
+
};
|
|
128
|
+
}
|
package/dist/change-set.d.ts
CHANGED
|
@@ -102,6 +102,15 @@ export interface ChangeSetEntry {
|
|
|
102
102
|
/** The estate, environment or org the change lands in. */
|
|
103
103
|
scope?: string;
|
|
104
104
|
attributes: ChangeSetAttribute[];
|
|
105
|
+
/**
|
|
106
|
+
* The graph node the entry changes, as `chant graph --format ir` and
|
|
107
|
+
* `chant workspace graph` name it (#4022): `<member>/<id>` inside a
|
|
108
|
+
* workspace. Null when the graph holds no node for the address, such as
|
|
109
|
+
* a delete of a block the source no longer declares. Absent until the
|
|
110
|
+
* document is mapped onto a graph (`./change-set-graph.ts`), and never
|
|
111
|
+
* part of the digest.
|
|
112
|
+
*/
|
|
113
|
+
node?: string | null;
|
|
105
114
|
}
|
|
106
115
|
/** Something a planner could not read, so the plan says nothing about it. */
|
|
107
116
|
export interface ChangeSetHole {
|
|
@@ -182,6 +191,29 @@ export interface ChangeSetDocument {
|
|
|
182
191
|
/** Triggered actions, sorted by member and address. Absent when no member runs one. */
|
|
183
192
|
sideEffects?: ChangeSetSideEffect[];
|
|
184
193
|
summary: ChangeSetSummary;
|
|
194
|
+
/**
|
|
195
|
+
* The graph the entries' `node` ids come from (#4022): the workspace member
|
|
196
|
+
* whose graph it is, or null outside a workspace, and the commit it was
|
|
197
|
+
* read at, or null when that is unknown. Null when no graph could be read,
|
|
198
|
+
* so every `node` is null. Absent on a document never mapped. Not hashed.
|
|
199
|
+
*/
|
|
200
|
+
graph?: ChangeSetGraph | null;
|
|
201
|
+
/**
|
|
202
|
+
* The release this change set was planned for (#4045): the `releaseDigest`
|
|
203
|
+
* of the release a `components promote --release` deploys. Set with
|
|
204
|
+
* `environment` on a release gate's document, absent on every other. Part
|
|
205
|
+
* of the digest when present, so a stored document names the one release
|
|
206
|
+
* and environment its gate bound, and two releases whose plans read the
|
|
207
|
+
* same never share a document or an approval.
|
|
208
|
+
*/
|
|
209
|
+
releaseDigest?: string;
|
|
210
|
+
/** The environment this change set was planned for (#4045), set with `releaseDigest`. Part of the digest when present. */
|
|
211
|
+
environment?: string;
|
|
212
|
+
}
|
|
213
|
+
/** Where a document's node ids come from. */
|
|
214
|
+
export interface ChangeSetGraph {
|
|
215
|
+
member: string | null;
|
|
216
|
+
at: string | null;
|
|
185
217
|
}
|
|
186
218
|
/**
|
|
187
219
|
* The set digest over members' plan digests: `computePlanDigest("change-set",
|
|
@@ -196,19 +228,29 @@ export declare function changeSetDigest(members: ReadonlyArray<Pick<ChangeSetMem
|
|
|
196
228
|
/**
|
|
197
229
|
* The document's digest: `computePlanDigest("change-set-document", …)` over
|
|
198
230
|
* the set digest ({@link changeSetDigest}), each member's name, status and
|
|
199
|
-
* holes, the entries and the side effects.
|
|
231
|
+
* holes, the entries (without their graph `node`) and the side effects.
|
|
232
|
+
* Members are sorted by name and
|
|
200
233
|
* entries and side effects by the keys {@link composeChangeSet} sorts them by,
|
|
201
234
|
* so order makes no difference.
|
|
202
235
|
*
|
|
203
236
|
* A provisional member is left out, with its entries and side effects, as
|
|
204
237
|
* the set digest leaves it out: no approval of the document covers it.
|
|
238
|
+
*
|
|
239
|
+
* A release gate's document (#4045) also hashes the `releaseDigest` and
|
|
240
|
+
* `environment` it was planned for. A document without them hashes as it
|
|
241
|
+
* always has, so no earlier digest moves.
|
|
205
242
|
*/
|
|
206
|
-
export declare function changeSetDocumentDigest(doc: Pick<ChangeSetDocument, "members" | "entries" | "sideEffects">): string;
|
|
243
|
+
export declare function changeSetDocumentDigest(doc: Pick<ChangeSetDocument, "members" | "entries" | "sideEffects" | "releaseDigest" | "environment">): string;
|
|
207
244
|
/** The summary of a set of members and entries. */
|
|
208
245
|
export declare function summarizeChangeSet(members: ChangeSetMember[], entries: ChangeSetEntry[]): ChangeSetSummary;
|
|
209
246
|
export interface ComposeChangeSetOptions {
|
|
210
247
|
/** The chant version to record in `chant`. */
|
|
211
248
|
chant?: string;
|
|
249
|
+
/** The release and environment a release gate's change set was planned for (#4045), recorded and hashed. */
|
|
250
|
+
planned?: {
|
|
251
|
+
releaseDigest: string;
|
|
252
|
+
environment: string;
|
|
253
|
+
};
|
|
212
254
|
}
|
|
213
255
|
/**
|
|
214
256
|
* Join adapters' parts into one document: members sorted by name, entries
|
|
@@ -222,7 +264,14 @@ export declare function composeChangeSet(parts: ReadonlyArray<ChangeSetPart>, op
|
|
|
222
264
|
* effects give ({@link changeSetDocumentDigest}). A document that names a
|
|
223
265
|
* member twice has no digest and is not verified.
|
|
224
266
|
*/
|
|
225
|
-
export declare function verifyChangeSetDigest(doc: Pick<ChangeSetDocument, "digest" | "members" | "entries" | "sideEffects">): boolean;
|
|
267
|
+
export declare function verifyChangeSetDigest(doc: Pick<ChangeSetDocument, "digest" | "members" | "entries" | "sideEffects" | "releaseDigest" | "environment">): boolean;
|
|
268
|
+
/**
|
|
269
|
+
* Whether a change set changes nothing (ws-104 question 6, #4045): it has at
|
|
270
|
+
* least one member, every member planned, none failed or provisional, no
|
|
271
|
+
* member has a hole, and every entry is a `no-op` or a `read`. A release
|
|
272
|
+
* gate over such a document passes without an approval.
|
|
273
|
+
*/
|
|
274
|
+
export declare function isEmptyChangeSet(doc: Pick<ChangeSetDocument, "members" | "entries">): boolean;
|
|
226
275
|
export interface LifecyclePlanPartInput {
|
|
227
276
|
member: string;
|
|
228
277
|
/** `chant lifecycle plan <env> --json`, parsed. */
|
package/dist/change-set.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"change-set.d.ts","sourceRoot":"","sources":["../src/change-set.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AAGH,OAAO,KAAK,EAAE,SAAS,IAAI,kBAAkB,EAAoC,MAAM,wBAAwB,CAAC;AAChH,OAAO,KAAK,EAAE,SAAS,IAAI,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEnE,2DAA2D;AAC3D,eAAO,MAAM,oBAAoB,sFAAsF,CAAC;AAExH,sDAAsD;AACtD,eAAO,MAAM,mBAAmB,IAAI,CAAC;AAErC,wHAAwH;AACxH,MAAM,MAAM,eAAe,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;AAEvG,yDAAyD;AACzD,eAAO,MAAM,kBAAkB,EAAE,SAAS,eAAe,EAAyE,CAAC;AAEnI,4FAA4F;AAC5F,MAAM,MAAM,mBAAmB,GAAG,UAAU,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;AAE7F,2CAA2C;AAC3C;;;;GAIG;AACH,MAAM,MAAM,gBAAgB,GAAG,WAAW,GAAG,MAAM,GAAG,WAAW,GAAG,OAAO,GAAG,QAAQ,GAAG,KAAK,CAAC;AAE/F,yDAAyD;AACzD,eAAO,MAAM,mBAAmB,EAAE,SAAS,gBAAgB,EAAiE,CAAC;AAE7H,+DAA+D;AAC/D,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,kEAAkE;IAClE,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,iFAAiF;IACjF,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,2CAA2C;IAC3C,OAAO,CAAC,EAAE,IAAI,CAAC;IACf,0EAA0E;IAC1E,SAAS,CAAC,EAAE,IAAI,CAAC;IACjB,8DAA8D;IAC9D,iBAAiB,CAAC,EAAE,IAAI,CAAC;CAC1B;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,gBAAgB,CAAC;IAC1B,2FAA2F;IAC3F,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,6FAA6F;IAC7F,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,qCAAqC;IACrC,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,4CAA4C;IAC5C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,kEAAkE;IAClE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,2DAA2D;IAC3D,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,eAAe,CAAC;IACxB,2IAA2I;IAC3I,SAAS,CAAC,EAAE,IAAI,CAAC;IACjB,2EAA2E;IAC3E,UAAU,CAAC,EAAE,mBAAmB,CAAC;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,0DAA0D;IAC1D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,kBAAkB,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"change-set.d.ts","sourceRoot":"","sources":["../src/change-set.ts"],"names":[],"mappings":"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"}
|
package/dist/change-set.js
CHANGED
|
@@ -78,12 +78,17 @@ export function changeSetDigest(members) {
|
|
|
78
78
|
/**
|
|
79
79
|
* The document's digest: `computePlanDigest("change-set-document", …)` over
|
|
80
80
|
* the set digest ({@link changeSetDigest}), each member's name, status and
|
|
81
|
-
* holes, the entries and the side effects.
|
|
81
|
+
* holes, the entries (without their graph `node`) and the side effects.
|
|
82
|
+
* Members are sorted by name and
|
|
82
83
|
* entries and side effects by the keys {@link composeChangeSet} sorts them by,
|
|
83
84
|
* so order makes no difference.
|
|
84
85
|
*
|
|
85
86
|
* A provisional member is left out, with its entries and side effects, as
|
|
86
87
|
* the set digest leaves it out: no approval of the document covers it.
|
|
88
|
+
*
|
|
89
|
+
* A release gate's document (#4045) also hashes the `releaseDigest` and
|
|
90
|
+
* `environment` it was planned for. A document without them hashes as it
|
|
91
|
+
* always has, so no earlier digest moves.
|
|
87
92
|
*/
|
|
88
93
|
export function changeSetDocumentDigest(doc) {
|
|
89
94
|
const provisional = new Set(doc.members.filter((m) => m.provisional === true).map((m) => m.member));
|
|
@@ -91,9 +96,18 @@ export function changeSetDocumentDigest(doc) {
|
|
|
91
96
|
.filter((m) => !provisional.has(m.member))
|
|
92
97
|
.map((m) => ({ member: m.member, status: m.status, holes: m.holes }))
|
|
93
98
|
.sort((a, b) => byString(a.member, b.member));
|
|
94
|
-
|
|
99
|
+
// An entry's graph node (#4022) says where on the graph the change is,
|
|
100
|
+
// not what the plan does, so it stays outside the digest: mapping a stored
|
|
101
|
+
// document onto a graph never moves the value its gate bound.
|
|
102
|
+
const entries = doc.entries
|
|
103
|
+
.filter((e) => !provisional.has(e.member))
|
|
104
|
+
.map(({ node: _node, ...e }) => e)
|
|
105
|
+
.sort((a, b) => byString(entryKey(a), entryKey(b)));
|
|
95
106
|
const sideEffects = (doc.sideEffects ?? []).filter((s) => !provisional.has(s.member)).sort(bySideEffect);
|
|
96
|
-
|
|
107
|
+
const planned = doc.releaseDigest !== undefined || doc.environment !== undefined
|
|
108
|
+
? { planned: { releaseDigest: doc.releaseDigest ?? null, environment: doc.environment ?? null } }
|
|
109
|
+
: {};
|
|
110
|
+
return computePlanDigest("change-set-document", { set: changeSetDigest(doc.members), members, entries, sideEffects, ...planned });
|
|
97
111
|
}
|
|
98
112
|
/** The summary of a set of members and entries. */
|
|
99
113
|
export function summarizeChangeSet(members, entries) {
|
|
@@ -155,12 +169,14 @@ export function composeChangeSet(parts, options = {}) {
|
|
|
155
169
|
const sideEffects = parts
|
|
156
170
|
.flatMap((p) => (p.sideEffects ?? []).map((s) => ({ member: p.member.member, ...s })))
|
|
157
171
|
.sort(bySideEffect);
|
|
158
|
-
const
|
|
172
|
+
const planned = options.planned ? { releaseDigest: options.planned.releaseDigest, environment: options.planned.environment } : {};
|
|
173
|
+
const digest = changeSetDocumentDigest({ members, entries, sideEffects, ...planned });
|
|
159
174
|
return {
|
|
160
175
|
$schema: CHANGE_SET_SCHEMA_ID,
|
|
161
176
|
contract: CHANGE_SET_CONTRACT,
|
|
162
177
|
...(options.chant !== undefined ? { chant: options.chant } : {}),
|
|
163
178
|
digest,
|
|
179
|
+
...planned,
|
|
164
180
|
members,
|
|
165
181
|
entries,
|
|
166
182
|
...(sideEffects.length > 0 ? { sideEffects } : {}),
|
|
@@ -180,6 +196,21 @@ export function verifyChangeSetDigest(doc) {
|
|
|
180
196
|
return false;
|
|
181
197
|
}
|
|
182
198
|
}
|
|
199
|
+
/**
|
|
200
|
+
* Whether a change set changes nothing (ws-104 question 6, #4045): it has at
|
|
201
|
+
* least one member, every member planned, none failed or provisional, no
|
|
202
|
+
* member has a hole, and every entry is a `no-op` or a `read`. A release
|
|
203
|
+
* gate over such a document passes without an approval.
|
|
204
|
+
*/
|
|
205
|
+
export function isEmptyChangeSet(doc) {
|
|
206
|
+
if (doc.members.length === 0)
|
|
207
|
+
return false;
|
|
208
|
+
for (const m of doc.members) {
|
|
209
|
+
if (m.status !== "planned" || m.provisional === true || m.holes.length > 0)
|
|
210
|
+
return false;
|
|
211
|
+
}
|
|
212
|
+
return doc.entries.every((e) => e.action === "no-op" || e.action === "read");
|
|
213
|
+
}
|
|
183
214
|
function lifecycleAttributes(entry) {
|
|
184
215
|
const because = new Set(entry.disruptionBecause ?? []);
|
|
185
216
|
return (entry.deltas ?? []).map((d) => ({
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The installed chant's version, read from `@intentius/chant`'s own
|
|
3
|
+
* package.json, or "0.0.0" when it can't be read. The path is the same from
|
|
4
|
+
* `src/` and `dist/`, so it holds whether chant runs from source or from its
|
|
5
|
+
* build. Kept outside `cli/` so that a module the Op entry loads, such as the
|
|
6
|
+
* run-event writer (#4041), can name the version without loading the CLI.
|
|
7
|
+
*/
|
|
8
|
+
export declare const CHANT_VERSION: string;
|
|
9
|
+
//# sourceMappingURL=chant-version.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chant-version.d.ts","sourceRoot":"","sources":["../src/chant-version.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AACH,eAAO,MAAM,aAAa,EAAE,MAMxB,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { createRequire } from "node:module";
|
|
2
|
+
/**
|
|
3
|
+
* The installed chant's version, read from `@intentius/chant`'s own
|
|
4
|
+
* package.json, or "0.0.0" when it can't be read. The path is the same from
|
|
5
|
+
* `src/` and `dist/`, so it holds whether chant runs from source or from its
|
|
6
|
+
* build. Kept outside `cli/` so that a module the Op entry loads, such as the
|
|
7
|
+
* run-event writer (#4041), can name the version without loading the CLI.
|
|
8
|
+
*/
|
|
9
|
+
export const CHANT_VERSION = (() => {
|
|
10
|
+
try {
|
|
11
|
+
return createRequire(import.meta.url)("../package.json").version ?? "0.0.0";
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
return "0.0.0";
|
|
15
|
+
}
|
|
16
|
+
})();
|
|
@@ -80,6 +80,14 @@ export interface BuildOptions {
|
|
|
80
80
|
serializers: Serializer[];
|
|
81
81
|
result?: ReturnType<typeof build>;
|
|
82
82
|
};
|
|
83
|
+
/**
|
|
84
|
+
* Where each output file goes: called with its absolute path and its
|
|
85
|
+
* content in place of creating the directory and writing the file. A
|
|
86
|
+
* release cut (#4046) passes one that keeps the files in memory, so it
|
|
87
|
+
* records exactly what this build writes and nothing left on disk by an
|
|
88
|
+
* earlier one.
|
|
89
|
+
*/
|
|
90
|
+
writeFile?: (path: string, content: string) => void;
|
|
83
91
|
}
|
|
84
92
|
/**
|
|
85
93
|
* Resolve the output format for `chant build`.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/build.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAepC,OAAO,KAAK,EAAE,UAAU,EAAoB,MAAM,kBAAkB,CAAC;AACrE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,KAAK,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAgBrF,OAAO,EAAuC,KAAK,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAOrG;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,uCAAuC;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,4CAA4C;IAC5C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,oBAAoB;IACpB,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,2CAA2C;IAC3C,WAAW,EAAE,UAAU,EAAE,CAAC;IAC1B,8CAA8C;IAC9C,OAAO,CAAC,EAAE,aAAa,EAAE,CAAC;IAC1B,8BAA8B;IAC9B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;;OAIG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;;;;;;;OAOG;IACH,IAAI,CAAC,EAAE,OAAO,CAAC;IAEf;;;;;;OAMG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAElB;;;;;OAKG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEhC;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;;;;;OAMG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB;;;;;OAKG;IACH,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAE/B;;;;;OAKG;IACH,WAAW,CAAC,EAAE;QAAE,WAAW,EAAE,UAAU,EAAE,CAAC;QAAC,MAAM,CAAC,EAAE,UAAU,CAAC,OAAO,KAAK,CAAC,CAAA;KAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/build.ts"],"names":[],"mappings":"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"}
|
|
@@ -25,6 +25,10 @@ import { formatError, formatWarning, formatSuccess, formatBold, formatInfo } fro
|
|
|
25
25
|
import { writeFileSync, mkdirSync } from "fs";
|
|
26
26
|
import { resolve, dirname, join, relative } from "path";
|
|
27
27
|
import { watchDirectory, formatTimestamp, formatChangedFiles } from "../watch.js";
|
|
28
|
+
function writeFileCreatingDir(path, content) {
|
|
29
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
30
|
+
writeFileSync(path, content);
|
|
31
|
+
}
|
|
28
32
|
/**
|
|
29
33
|
* Resolve the output format for `chant build`.
|
|
30
34
|
*
|
|
@@ -552,6 +556,7 @@ export async function buildCommand(options) {
|
|
|
552
556
|
}));
|
|
553
557
|
}
|
|
554
558
|
// Handle output
|
|
559
|
+
const writeOutput = options.writeFile ?? writeFileCreatingDir;
|
|
555
560
|
if (result.errors.length === 0 && errors.length === 0) {
|
|
556
561
|
// Extract primary content and collect additional files from SerializerResult.
|
|
557
562
|
// Each entry remembers which lexicon produced it, so a same-basename
|
|
@@ -680,8 +685,7 @@ export async function buildCommand(options) {
|
|
|
680
685
|
additionalFiles.delete(filename);
|
|
681
686
|
try {
|
|
682
687
|
const targetPath = join(projectDist, filename);
|
|
683
|
-
|
|
684
|
-
writeFileSync(targetPath, entry.content);
|
|
688
|
+
writeOutput(targetPath, entry.content);
|
|
685
689
|
opsWritten += 1;
|
|
686
690
|
}
|
|
687
691
|
catch (err) {
|
|
@@ -706,8 +710,7 @@ export async function buildCommand(options) {
|
|
|
706
710
|
continue;
|
|
707
711
|
try {
|
|
708
712
|
const targetPath = join(projectDist, "ops", config.name, "op.json");
|
|
709
|
-
|
|
710
|
-
writeFileSync(targetPath, serializeOpIR(config));
|
|
713
|
+
writeOutput(targetPath, serializeOpIR(config));
|
|
711
714
|
irWritten += 1;
|
|
712
715
|
}
|
|
713
716
|
catch (err) {
|
|
@@ -724,8 +727,7 @@ export async function buildCommand(options) {
|
|
|
724
727
|
// output path and any nested additional-file paths (e.g. ops/<name>/...).
|
|
725
728
|
try {
|
|
726
729
|
const outputPath = resolve(options.output);
|
|
727
|
-
|
|
728
|
-
writeFileSync(outputPath, output);
|
|
730
|
+
writeOutput(outputPath, output);
|
|
729
731
|
// Write additional files (e.g. nested stack templates) alongside the primary output
|
|
730
732
|
if (additionalFiles.size > 0) {
|
|
731
733
|
const outputDir = dirname(outputPath);
|
|
@@ -746,8 +748,7 @@ export async function buildCommand(options) {
|
|
|
746
748
|
}
|
|
747
749
|
}
|
|
748
750
|
const targetPath = join(outputDir, filename);
|
|
749
|
-
|
|
750
|
-
writeFileSync(targetPath, fileContent);
|
|
751
|
+
writeOutput(targetPath, fileContent);
|
|
751
752
|
}
|
|
752
753
|
}
|
|
753
754
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"check-lexicon-docs.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/check-lexicon-docs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;
|
|
1
|
+
{"version":3,"file":"check-lexicon-docs.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/check-lexicon-docs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAQH,MAAM,WAAW,gBAAgB;IAC/B,0DAA0D;IAC1D,OAAO,EAAE,OAAO,CAAC;IACjB,+DAA+D;IAC/D,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,+DAA+D;IAC/D,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAAC,YAAY,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAM9D;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,MAAM,GAAG,gBAAgB,CAkB1E;AAED,MAAM,WAAW,kBAAkB;IACjC,+DAA+D;IAC/D,QAAQ,EAAE,OAAO,CAAC;IAClB,gFAAgF;IAChF,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAID;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,MAAM,GAAG,kBAAkB,CAa9E"}
|
|
@@ -14,7 +14,9 @@
|
|
|
14
14
|
* membership is the whole of reachability for a lexicon site.
|
|
15
15
|
*/
|
|
16
16
|
import { existsSync, readdirSync, readFileSync } from "fs";
|
|
17
|
-
import { join } from "path";
|
|
17
|
+
import { basename, join, resolve } from "path";
|
|
18
|
+
import { collectSidebarSlugs } from "../../codegen/docs.js";
|
|
19
|
+
import { findChantDocsSite, sectionContentDir } from "../../codegen/docs-in-site.js";
|
|
18
20
|
/**
|
|
19
21
|
* Slugs the sidebar reaches, including nested group `items`.
|
|
20
22
|
*
|
|
@@ -42,7 +44,7 @@ export function auditDocsReachability(lexiconDir) {
|
|
|
42
44
|
const contentDir = join(lexiconDir, "docs", "src", "content", "docs");
|
|
43
45
|
const configPath = join(lexiconDir, "docs", "astro.config.mjs");
|
|
44
46
|
if (!existsSync(contentDir) || !existsSync(configPath)) {
|
|
45
|
-
return
|
|
47
|
+
return auditSectionReachability(lexiconDir);
|
|
46
48
|
}
|
|
47
49
|
const slugs = sidebarSlugs(readFileSync(configPath, "utf-8"));
|
|
48
50
|
const pages = readdirSync(contentDir)
|
|
@@ -77,3 +79,29 @@ export function auditDocsClassification(lexiconDir) {
|
|
|
77
79
|
}
|
|
78
80
|
return { hasPages: true, unclassified };
|
|
79
81
|
}
|
|
82
|
+
/**
|
|
83
|
+
* Reachability for a lexicon whose docs are a section of the chant main site
|
|
84
|
+
* (chant #3993): its generated pages under
|
|
85
|
+
* `docs/src/content/docs/lexicons/<name>/` against the `_sidebar.json` the
|
|
86
|
+
* pipeline wrote beside them. A page the fragment lists as hidden is
|
|
87
|
+
* deliberately URL-only and does not count. Before the section has been
|
|
88
|
+
* generated there is nothing to audit, which reads as no site, like a
|
|
89
|
+
* lexicon with no docs.
|
|
90
|
+
*/
|
|
91
|
+
function auditSectionReachability(lexiconDir) {
|
|
92
|
+
const site = findChantDocsSite(lexiconDir);
|
|
93
|
+
const name = basename(resolve(lexiconDir));
|
|
94
|
+
const dir = site ? sectionContentDir(site, name) : undefined;
|
|
95
|
+
const fragmentPath = dir ? join(dir, "_sidebar.json") : undefined;
|
|
96
|
+
if (!dir || !fragmentPath || !existsSync(fragmentPath))
|
|
97
|
+
return { hasSite: false, pages: [], unreachable: [] };
|
|
98
|
+
const fragment = JSON.parse(readFileSync(fragmentPath, "utf-8"));
|
|
99
|
+
const prefix = `lexicons/${name}/`;
|
|
100
|
+
const reached = new Set([...collectSidebarSlugs([fragment.group]), ...(fragment.hidden ?? [])].map((slug) => slug.startsWith(prefix) ? slug.slice(prefix.length) : slug));
|
|
101
|
+
const pages = readdirSync(dir)
|
|
102
|
+
.filter((f) => f.endsWith(".mdx") || f.endsWith(".md"))
|
|
103
|
+
.map((f) => f.replace(/\.mdx?$/, ""))
|
|
104
|
+
.sort();
|
|
105
|
+
const unreachable = pages.filter((slug) => slug !== "index" && !reached.has(slug));
|
|
106
|
+
return { hasSite: true, pages, unreachable };
|
|
107
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"check-lexicon.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/check-lexicon.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAInD,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAChB,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;CACpB;AAyBD,gEAAgE;AAChE;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,eAAe,EAAE,MAAM,GAAG,MAAM,CAIlE;AAuBD;;;;;;;;;;;GAWG;AACH,wBAAsB,mBAAmB,CAAC,MAAM,EAAE,aAAa,GAAG,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC,CAyB/F;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,CAC7B,MAAM,EAAE,aAAa,GAAG,SAAS,EACjC,GAAG,EAAE,MAAM,GACV;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAanC;AAED;;;;;;GAMG;AACH,wBAAsB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAazE;AAID;;GAEG;AACH,wBAAsB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,
|
|
1
|
+
{"version":3,"file":"check-lexicon.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/check-lexicon.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAInD,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAChB,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;CACpB;AAyBD,gEAAgE;AAChE;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,eAAe,EAAE,MAAM,GAAG,MAAM,CAIlE;AAuBD;;;;;;;;;;;GAWG;AACH,wBAAsB,mBAAmB,CAAC,MAAM,EAAE,aAAa,GAAG,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC,CAyB/F;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,CAC7B,MAAM,EAAE,aAAa,GAAG,SAAS,EACjC,GAAG,EAAE,MAAM,GACV;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAanC;AAED;;;;;;GAMG;AACH,wBAAsB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAazE;AAID;;GAEG;AACH,wBAAsB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CA4mBpE;AAqBD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,GAAG,IAAI,CAmDzE"}
|
|
@@ -406,12 +406,23 @@ export async function checkLexicon(dir) {
|
|
|
406
406
|
tier: 1,
|
|
407
407
|
pass: hasSerializerTest,
|
|
408
408
|
});
|
|
409
|
+
// A lexicon whose src/codegen/docs.ts runs docsPipeline always has a page:
|
|
410
|
+
// the pipeline writes the overview (index.mdx) from the manifest. Inside the
|
|
411
|
+
// chant repository that page is generated into the main docs site rather
|
|
412
|
+
// than committed under docs/ (chant #3993), so k3d, whose docs are all
|
|
413
|
+
// generated, has no .mdx of its own to count.
|
|
409
414
|
const mdxFiles = findFiles(join(dir, "docs"), (n) => n.endsWith(".mdx"));
|
|
415
|
+
const docsTs = join(dir, "src", "codegen", "docs.ts");
|
|
416
|
+
const pipelineOverview = existsSync(docsTs) && readFileSync(docsTs, "utf-8").includes("docsPipeline(");
|
|
410
417
|
items.push({
|
|
411
418
|
name: "At least 1 .mdx doc page",
|
|
412
419
|
tier: 1,
|
|
413
|
-
pass: mdxFiles.length > 0,
|
|
414
|
-
detail: mdxFiles.length > 0
|
|
420
|
+
pass: mdxFiles.length > 0 || pipelineOverview,
|
|
421
|
+
detail: mdxFiles.length > 0
|
|
422
|
+
? `${mdxFiles.length} page(s)`
|
|
423
|
+
: pipelineOverview
|
|
424
|
+
? "the docs pipeline's generated overview"
|
|
425
|
+
: undefined,
|
|
415
426
|
});
|
|
416
427
|
// Counting pages says nothing about whether a reader can find them.
|
|
417
428
|
// Starlight has no auto-discovery, so a page missing from the sidebar is
|
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Docs site template generators for init-lexicon scaffold.
|
|
2
|
+
* Docs site template generators for init-lexicon scaffold. The app files
|
|
3
|
+
* (package.json, tsconfig, Astro config, content config) are written only for a
|
|
4
|
+
* lexicon outside the chant repository; inside it, the lexicon's docs are a
|
|
5
|
+
* section of the main site (chant #3993).
|
|
3
6
|
*/
|
|
4
7
|
export declare function generateDocsPackageJson(name: string): string;
|
|
5
8
|
export declare function generateDocsTsConfig(): string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"docs.d.ts","sourceRoot":"","sources":["../../../../../src/cli/commands/init-lexicon/templates/docs.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"docs.d.ts","sourceRoot":"","sources":["../../../../../src/cli/commands/init-lexicon/templates/docs.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAiB5D;AAED,wBAAgB,oBAAoB,IAAI,MAAM,CAU7C;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAiB5D;AAED,wBAAgB,yBAAyB,IAAI,MAAM,CAiBlD;AAED;;;GAGG;AACH,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAmBlE;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAWzD"}
|
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Docs site template generators for init-lexicon scaffold.
|
|
2
|
+
* Docs site template generators for init-lexicon scaffold. The app files
|
|
3
|
+
* (package.json, tsconfig, Astro config, content config) are written only for a
|
|
4
|
+
* lexicon outside the chant repository; inside it, the lexicon's docs are a
|
|
5
|
+
* section of the main site (chant #3993).
|
|
3
6
|
*/
|
|
7
|
+
import { DOCS_SITE_DEPENDENCIES } from "../../../../codegen/docs-in-site.js";
|
|
4
8
|
export function generateDocsPackageJson(name) {
|
|
5
9
|
return JSON.stringify({
|
|
6
10
|
name: `@intentius/chant-lexicon-${name}-docs`,
|
|
@@ -12,11 +16,7 @@ export function generateDocsPackageJson(name) {
|
|
|
12
16
|
build: "astro build",
|
|
13
17
|
preview: "astro preview",
|
|
14
18
|
},
|
|
15
|
-
dependencies: {
|
|
16
|
-
"@astrojs/starlight": "^0.37.6",
|
|
17
|
-
astro: "^5.6.1",
|
|
18
|
-
sharp: "^0.34.2",
|
|
19
|
-
},
|
|
19
|
+
dependencies: { ...DOCS_SITE_DEPENDENCIES },
|
|
20
20
|
}, null, 2) + "\n";
|
|
21
21
|
}
|
|
22
22
|
export function generateDocsTsConfig() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init-lexicon.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/init-lexicon.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"init-lexicon.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/init-lexicon.ts"],"names":[],"mappings":"AAgBA;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,gCAAgC;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,uDAAuD;IACvD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,6CAA6C;IAC7C,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,0BAA0B;IAC1B,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAQD,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM;IAGpC,aAAa;IACb,iBAAiB;IACjB,UAAU;IACV,WAAW;EAEd;AAqBD;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAkIhG;AAED;;GAEG;AACH,wBAAsB,sBAAsB,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAyBrF"}
|
|
@@ -11,6 +11,7 @@ import { generatePackageJson, generateTsConfig, generateTsConfigBuild, generateJ
|
|
|
11
11
|
import { generatePluginTestTs, generateSerializerTestTs, generateCompletionsTestTs, generateHoverTestTs } from "./init-lexicon/templates/tests.js";
|
|
12
12
|
import { generateDocsPackageJson, generateDocsTsConfig, generateDocsAstroConfig, generateDocsContentConfig, generateDocsIndexMdx, generateDocsGettingStartedMdx } from "./init-lexicon/templates/docs.js";
|
|
13
13
|
import { generateExamplePackageJson, generateExampleInfraTs } from "./init-lexicon/templates/examples.js";
|
|
14
|
+
import { findChantDocsSite } from "../../codegen/docs-in-site.js";
|
|
14
15
|
// ── Name derivation helpers ──────────────────────────────────────────
|
|
15
16
|
function toCamelCase(name) {
|
|
16
17
|
return name.replace(/[-_]+(.)/g, (_, c) => c.toUpperCase());
|
|
@@ -60,6 +61,12 @@ export async function initLexiconCommand(options) {
|
|
|
60
61
|
warnings.push("Initializing in non-empty directory");
|
|
61
62
|
}
|
|
62
63
|
}
|
|
64
|
+
// Inside the chant repository a lexicon's docs are a section of the main
|
|
65
|
+
// site (chant #3993): the pipeline writes its pages into docs/, so the
|
|
66
|
+
// lexicon gets only docs/pages/. Anywhere else it gets a standalone
|
|
67
|
+
// Starlight app of its own, as before.
|
|
68
|
+
const standaloneDocs = findChantDocsSite(targetDir) === undefined;
|
|
69
|
+
const standaloneDocsDirs = ["docs/src", "docs/src/content", "docs/src/content/docs"];
|
|
63
70
|
// Create directory structure
|
|
64
71
|
const dirs = [
|
|
65
72
|
"",
|
|
@@ -71,9 +78,7 @@ export async function initLexiconCommand(options) {
|
|
|
71
78
|
"src/lsp",
|
|
72
79
|
"src/generated",
|
|
73
80
|
"docs",
|
|
74
|
-
|
|
75
|
-
"docs/src/content",
|
|
76
|
-
"docs/src/content/docs",
|
|
81
|
+
...(standaloneDocs ? standaloneDocsDirs : []),
|
|
77
82
|
"docs/pages",
|
|
78
83
|
"examples/getting-started",
|
|
79
84
|
"examples/getting-started/src",
|
|
@@ -114,11 +119,15 @@ export async function initLexiconCommand(options) {
|
|
|
114
119
|
"justfile": generateJustfile(name),
|
|
115
120
|
".gitignore": generateGitignore(),
|
|
116
121
|
"README.md": generateReadme(name, names),
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
+
...(standaloneDocs
|
|
123
|
+
? {
|
|
124
|
+
"docs/package.json": generateDocsPackageJson(name),
|
|
125
|
+
"docs/tsconfig.json": generateDocsTsConfig(),
|
|
126
|
+
"docs/astro.config.mjs": generateDocsAstroConfig(name),
|
|
127
|
+
"docs/src/content.config.ts": generateDocsContentConfig(),
|
|
128
|
+
"docs/src/content/docs/index.mdx": generateDocsIndexMdx(name),
|
|
129
|
+
}
|
|
130
|
+
: {}),
|
|
122
131
|
"docs/pages/getting-started.mdx": generateDocsGettingStartedMdx(name),
|
|
123
132
|
"examples/getting-started/package.json": generateExamplePackageJson(name),
|
|
124
133
|
"examples/getting-started/src/infra.ts": generateExampleInfraTs(name, names),
|