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