@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
package/src/config.test.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { describe, test, expect, beforeEach, afterEach, vi } from "vitest";
|
|
2
2
|
import {
|
|
3
3
|
loadChantConfig,
|
|
4
|
+
InvalidChantConfigError,
|
|
4
5
|
loadChantConfigUpward,
|
|
5
6
|
DEFAULT_CHANT_CONFIG,
|
|
6
7
|
resolveAutoReleaseDisabled,
|
|
@@ -129,6 +130,26 @@ describe("loadChantConfig", () => {
|
|
|
129
130
|
expect(result.config.release?.autoRecord).toBe(false);
|
|
130
131
|
});
|
|
131
132
|
|
|
133
|
+
// #2523: run.on is the project's default Op runtime for `chant run`.
|
|
134
|
+
test("loads chant.config.json with run.on", async () => {
|
|
135
|
+
writeFileSync(join(TEST_DIR, "chant.config.json"), JSON.stringify({ run: { on: "mylexicon" } }));
|
|
136
|
+
const result = await loadChantConfig(TEST_DIR);
|
|
137
|
+
expect(result.config.run?.on).toBe("mylexicon");
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
test.each([
|
|
141
|
+
["a non-string run.on", { run: { on: 5 } }, /run\.on/],
|
|
142
|
+
["an empty run.on", { run: { on: "" } }, /run\.on/],
|
|
143
|
+
["a misspelt key in run", { run: { onn: "mylexicon" } }, /run.*onn/],
|
|
144
|
+
])("rejects %s, naming the config file and the key", async (_, raw, key) => {
|
|
145
|
+
writeFileSync(join(TEST_DIR, "chant.config.json"), JSON.stringify(raw));
|
|
146
|
+
const err = await loadChantConfig(TEST_DIR).catch((e: unknown) => e);
|
|
147
|
+
expect(err).toBeInstanceOf(InvalidChantConfigError);
|
|
148
|
+
expect((err as InvalidChantConfigError).key).toBe("run");
|
|
149
|
+
expect((err as Error).message).toContain("chant.config.json");
|
|
150
|
+
expect((err as Error).message).toMatch(key);
|
|
151
|
+
});
|
|
152
|
+
|
|
132
153
|
// #606: sbom.format sets the project-wide default SBOM format for every
|
|
133
154
|
// `generate-sbom` step that doesn't specify its own.
|
|
134
155
|
test("loads chant.config.json with sbom.format: cyclonedx", async () => {
|
package/src/config.ts
CHANGED
|
@@ -164,6 +164,11 @@ export const ChantConfigSchema = z.object({
|
|
|
164
164
|
release: z.object({
|
|
165
165
|
autoRecord: z.boolean().optional(),
|
|
166
166
|
}).optional(),
|
|
167
|
+
// Strict: a misspelt key here would leave Ops on the local runtime with
|
|
168
|
+
// nothing said (#2523).
|
|
169
|
+
run: z.object({
|
|
170
|
+
on: z.string().min(1).optional(),
|
|
171
|
+
}).strict().optional(),
|
|
167
172
|
sbom: z.object({
|
|
168
173
|
format: z.enum(["spdx", "cyclonedx"]).optional(),
|
|
169
174
|
enabled: z.boolean().optional(),
|
|
@@ -370,6 +375,16 @@ export interface ChantConfig {
|
|
|
370
375
|
autoRecord?: boolean;
|
|
371
376
|
};
|
|
372
377
|
|
|
378
|
+
/** Defaults for `chant run` and its subcommands (#2523). */
|
|
379
|
+
run?: {
|
|
380
|
+
/**
|
|
381
|
+
* The runtime that hosts this project's Op runs when `--on` is not
|
|
382
|
+
* given: a configured lexicon that declares an `opRuntime`, or `"local"`.
|
|
383
|
+
* `--on` overrides it, and `--on local` selects the built-in runtime.
|
|
384
|
+
*/
|
|
385
|
+
on?: string;
|
|
386
|
+
};
|
|
387
|
+
|
|
373
388
|
/**
|
|
374
389
|
* Project-wide SBOM generation defaults (#606, epic #551 follow-up to
|
|
375
390
|
* #564/#568). Consumed by the `generate-sbom` capability
|
package/src/declarable.test.ts
CHANGED
|
@@ -4,6 +4,7 @@ import {
|
|
|
4
4
|
type Declarable,
|
|
5
5
|
isDeclarable,
|
|
6
6
|
isPropertyDeclarable,
|
|
7
|
+
isObservableDeclarable,
|
|
7
8
|
} from "./declarable";
|
|
8
9
|
|
|
9
10
|
describe("DECLARABLE_MARKER", () => {
|
|
@@ -123,6 +124,26 @@ describe("isPropertyDeclarable", () => {
|
|
|
123
124
|
});
|
|
124
125
|
});
|
|
125
126
|
|
|
127
|
+
describe("isObservableDeclarable (#3001)", () => {
|
|
128
|
+
const base = { lexicon: "test", [DECLARABLE_MARKER]: true as const };
|
|
129
|
+
|
|
130
|
+
test("is true for a resource-kind declarable with props", () => {
|
|
131
|
+
expect(isObservableDeclarable({ ...base, entityType: "R", kind: "resource", props: {} } as Declarable)).toBe(true);
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
test("is true for a declarable with props and no kind", () => {
|
|
135
|
+
expect(isObservableDeclarable({ ...base, entityType: "R", props: {} } as Declarable)).toBe(true);
|
|
136
|
+
});
|
|
137
|
+
|
|
138
|
+
test("is false for a property-kind declarable, though it carries props", () => {
|
|
139
|
+
expect(isObservableDeclarable({ ...base, entityType: "P", kind: "property", props: {} } as Declarable)).toBe(false);
|
|
140
|
+
});
|
|
141
|
+
|
|
142
|
+
test("is false for a declarable without props (an output, a directive)", () => {
|
|
143
|
+
expect(isObservableDeclarable({ ...base, entityType: "O", kind: "output" })).toBe(false);
|
|
144
|
+
});
|
|
145
|
+
});
|
|
146
|
+
|
|
126
147
|
describe("Declarable interface", () => {
|
|
127
148
|
test("allows creating objects without kind field (backward compatibility)", () => {
|
|
128
149
|
const obj: Declarable = {
|
package/src/declarable.ts
CHANGED
|
@@ -130,3 +130,22 @@ function carriesForeignDeclarableMarker(value: object): boolean {
|
|
|
130
130
|
export function isPropertyDeclarable(value: Declarable): boolean {
|
|
131
131
|
return value.kind === "property";
|
|
132
132
|
}
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* A declarable with a live counterpart of its own: what the live paths
|
|
136
|
+
* (`describeResources`, `observeResourcesDeep`, the snapshot, the diff and the
|
|
137
|
+
* change set) put in front of a lexicon's reader.
|
|
138
|
+
*
|
|
139
|
+
* Outputs, parameters and serializer directives carry no `props` and are
|
|
140
|
+
* already left out by {@link isResourceDeclarable}. A property-kind declarable
|
|
141
|
+
* (`createProperty`: Grafana's panels, an aws `SecurityGroup_Ingress`) does
|
|
142
|
+
* carry `props`, but it exists only inside the resource that holds it, and the
|
|
143
|
+
* deep diff already compares it as part of that resource's tree (#1314).
|
|
144
|
+
* Asking a reader about one on its own makes the answer either "absent", so
|
|
145
|
+
* `lifecycle plan` proposes a `create`, or "not observed", a hole for
|
|
146
|
+
* something read in full (#3001). This is the same test `graph-ir.ts` uses to
|
|
147
|
+
* keep property-kind declarables off the graph's nodes.
|
|
148
|
+
*/
|
|
149
|
+
export function isObservableDeclarable(value: Declarable): value is ResourceDeclarable {
|
|
150
|
+
return isResourceDeclarable(value) && !isPropertyDeclarable(value);
|
|
151
|
+
}
|
|
@@ -322,6 +322,37 @@ describe("composite factory interpretation (chant #1023)", () => {
|
|
|
322
322
|
expect(run).toContain("GetAtt");
|
|
323
323
|
});
|
|
324
324
|
|
|
325
|
+
test("a call whose props name a member of a same-file composite call interprets too (chant#3325)", async () => {
|
|
326
|
+
await writeComposite(
|
|
327
|
+
ADMISSIBLE_BODY,
|
|
328
|
+
`export const Reader = Composite((props) => {
|
|
329
|
+
const reader = new Role({ RoleName: props.name, Description: props.bucket.Arn });
|
|
330
|
+
return { reader };
|
|
331
|
+
}, "Reader");`,
|
|
332
|
+
);
|
|
333
|
+
await writeMain(`
|
|
334
|
+
import { Reader, WebApp } from "../composites";
|
|
335
|
+
export const web = WebApp({ name: "data" });
|
|
336
|
+
export const readers = Reader({ name: "readers", bucket: web.bucket });
|
|
337
|
+
`);
|
|
338
|
+
|
|
339
|
+
const runResult = await build(srcDir, [specSerializer], undefined, { fold: false });
|
|
340
|
+
resetFoldExecutionCounts();
|
|
341
|
+
const foldResult = await build(srcDir, [specSerializer], undefined, {
|
|
342
|
+
fold: true,
|
|
343
|
+
lexicons: [LEXICON_NAME],
|
|
344
|
+
});
|
|
345
|
+
|
|
346
|
+
expect(foldResult.errors).toEqual([]);
|
|
347
|
+
expect(foldResult.foldDecisions.map((d) => d.mode)).toEqual(["fold"]);
|
|
348
|
+
// `web` is interpreted once: the declarator and the reference share it.
|
|
349
|
+
expect(foldExecutionCounts()).toMatchObject({ factoryInterpretations: 2, projectFactoryInvocations: 0 });
|
|
350
|
+
const folded = String(foldResult.outputs.get(LEXICON_NAME));
|
|
351
|
+
expect(folded).toBe(String(runResult.outputs.get(LEXICON_NAME)));
|
|
352
|
+
expect(folded).toContain('"webBucket"');
|
|
353
|
+
expect(JSON.parse(folded).readersReader.props.Description).toEqual({ GetAtt: ["webBucket", "Arn"] });
|
|
354
|
+
});
|
|
355
|
+
|
|
325
356
|
test("provenance is stamped from the source's own composite name", async () => {
|
|
326
357
|
await writeComposite(ADMISSIBLE_BODY);
|
|
327
358
|
await writeMain(CALL_WEBAPP);
|
|
@@ -450,10 +481,15 @@ describe("composite factory interpretation (chant #1023)", () => {
|
|
|
450
481
|
expect([...result.entities.keys()].sort()).toEqual(["webBucket", "webRole"]);
|
|
451
482
|
});
|
|
452
483
|
|
|
453
|
-
test("a lexicon-package composite is
|
|
454
|
-
// `LambdaApi` is a composite the aws lexicon itself publishes
|
|
455
|
-
//
|
|
456
|
-
//
|
|
484
|
+
test("a lexicon-package composite whose body declines is invoked, and the file still folds (rule 1)", async () => {
|
|
485
|
+
// `LambdaApi` is a composite the aws lexicon itself publishes, reached
|
|
486
|
+
// through the package barrel. Since chant#3247 it is a candidate for
|
|
487
|
+
// interpretation like a project composite. Its body declines: the nested
|
|
488
|
+
// `LambdaFunction` is outside the subset and is invoked (package code,
|
|
489
|
+
// which #1093's allowlist permits), and `defaults?.permission` on an
|
|
490
|
+
// absent `defaults` does not resolve. The decline lands where the code
|
|
491
|
+
// always landed: the package's factory is invoked in-process and the file
|
|
492
|
+
// folds. The attempt's nested invocation is counted too, hence two.
|
|
457
493
|
await writeMain(`
|
|
458
494
|
import { LambdaApi } from ${JSON.stringify(LEXICON)};
|
|
459
495
|
export const api = LambdaApi({
|
|
@@ -469,7 +505,7 @@ describe("composite factory interpretation (chant #1023)", () => {
|
|
|
469
505
|
expect(result.errors).toEqual([]);
|
|
470
506
|
expect(result.foldDecisions.find((d) => d.file.endsWith("main.ts"))?.mode).toBe("fold");
|
|
471
507
|
expect(foldExecutionCounts()).toMatchObject({ factoryInterpretations: 0, projectFactoryInvocations: 0 });
|
|
472
|
-
expect(foldExecutionCounts().factoryInvocations).toBe(
|
|
508
|
+
expect(foldExecutionCounts().factoryInvocations).toBe(2);
|
|
473
509
|
expect(result.entities.size).toBeGreaterThan(0);
|
|
474
510
|
});
|
|
475
511
|
|
|
@@ -1007,6 +1007,135 @@ describe("tryFoldFile — registered intrinsic tagged templates (#1039)", () =>
|
|
|
1007
1007
|
});
|
|
1008
1008
|
});
|
|
1009
1009
|
|
|
1010
|
+
// chant #3196 — a registered tag that returns an entity (the shape the sql
|
|
1011
|
+
// lexicon's `table`/`view` tags take): it reads `strings.raw`, renders an
|
|
1012
|
+
// interpolated entity by its name, and records it as a dependency. Fold has to
|
|
1013
|
+
// hand it the TemplateStringsArray a real tagged call does, and a same-file
|
|
1014
|
+
// reference to one has to read the one entity discovery registers.
|
|
1015
|
+
describe("tryFoldFile — tags that read raw strings and return entities (#3196)", () => {
|
|
1016
|
+
let testDir: string;
|
|
1017
|
+
|
|
1018
|
+
beforeEach(async () => {
|
|
1019
|
+
testDir = join(tmpdir(), `chant-fold-import-tag-entity-test-${Date.now()}-${Math.random()}`);
|
|
1020
|
+
await mkdir(testDir, { recursive: true });
|
|
1021
|
+
});
|
|
1022
|
+
|
|
1023
|
+
afterEach(async () => {
|
|
1024
|
+
await rm(testDir, { recursive: true, force: true });
|
|
1025
|
+
});
|
|
1026
|
+
|
|
1027
|
+
const TABLE: IntrinsicDef = { name: "table", isTag: true };
|
|
1028
|
+
const SUB: IntrinsicDef = { name: "Sub", isTag: true };
|
|
1029
|
+
|
|
1030
|
+
async function writeTagDefs(): Promise<void> {
|
|
1031
|
+
await writeFile(
|
|
1032
|
+
join(testDir, "tags.ts"),
|
|
1033
|
+
`
|
|
1034
|
+
import { createResource } from ${JSON.stringify(runtimePath)};
|
|
1035
|
+
import { INTRINSIC_MARKER } from ${JSON.stringify(intrinsicPath)};
|
|
1036
|
+
const Table = createResource("Test::Table", "test", {});
|
|
1037
|
+
|
|
1038
|
+
export function table(strings, ...values) {
|
|
1039
|
+
if (!Object.isFrozen(strings) || !Object.isFrozen(strings.raw)) throw new Error("not a TemplateStringsArray");
|
|
1040
|
+
let ddl = strings.raw[0];
|
|
1041
|
+
const dependsOn = [];
|
|
1042
|
+
values.forEach((v, i) => {
|
|
1043
|
+
if (v && typeof v === "object" && v.props) {
|
|
1044
|
+
dependsOn.push(v);
|
|
1045
|
+
ddl += v.props.name;
|
|
1046
|
+
} else {
|
|
1047
|
+
ddl += String(v);
|
|
1048
|
+
}
|
|
1049
|
+
ddl += strings.raw[i + 1];
|
|
1050
|
+
});
|
|
1051
|
+
const name = /CREATE (?:TABLE|VIEW) (\\w+)/.exec(ddl)?.[1];
|
|
1052
|
+
return new Table({ name, ddl, cooked: strings.join("|"), dependsOn });
|
|
1053
|
+
}
|
|
1054
|
+
|
|
1055
|
+
export function Sub(strings, ...values) {
|
|
1056
|
+
return { [INTRINSIC_MARKER]: true, strings: [...strings], values, toJSON() { return { "Test::Sub": strings.join("") }; } };
|
|
1057
|
+
}
|
|
1058
|
+
`,
|
|
1059
|
+
);
|
|
1060
|
+
}
|
|
1061
|
+
|
|
1062
|
+
type Props = { name: string; ddl: string; cooked: string; dependsOn: unknown[] };
|
|
1063
|
+
const propsOf = (entity: unknown): Props => (entity as { props: Props }).props;
|
|
1064
|
+
|
|
1065
|
+
test("a backslash in the template folds to the same text running gives", async () => {
|
|
1066
|
+
await writeTagDefs();
|
|
1067
|
+
const file = join(testDir, "main.ts");
|
|
1068
|
+
await writeFile(
|
|
1069
|
+
file,
|
|
1070
|
+
"import { table } from \"./tags\";\n" +
|
|
1071
|
+
"export const users = table`CREATE TABLE users (re String DEFAULT '\\d+\\t', nl String DEFAULT '\\n')`;\n",
|
|
1072
|
+
);
|
|
1073
|
+
|
|
1074
|
+
const result = await tryFoldFile(file, [TABLE]);
|
|
1075
|
+
expect(result.ok).toBe(true);
|
|
1076
|
+
if (!result.ok) return;
|
|
1077
|
+
const folded = propsOf(result.exportedValues.get("users"));
|
|
1078
|
+
const ran = propsOf((await import(file)).users);
|
|
1079
|
+
|
|
1080
|
+
expect(folded.ddl).toBe("CREATE TABLE users (re String DEFAULT '\\d+\\t', nl String DEFAULT '\\n')");
|
|
1081
|
+
expect(folded.ddl).toBe(ran.ddl);
|
|
1082
|
+
expect(folded.cooked).toBe(ran.cooked);
|
|
1083
|
+
});
|
|
1084
|
+
|
|
1085
|
+
test("a tag referencing a same-file tag const folds, and reads the one entity discovery registers", async () => {
|
|
1086
|
+
await writeTagDefs();
|
|
1087
|
+
const file = join(testDir, "main.ts");
|
|
1088
|
+
await writeFile(
|
|
1089
|
+
file,
|
|
1090
|
+
`
|
|
1091
|
+
import { table } from "./tags";
|
|
1092
|
+
throw new Error("must never execute — the file folds");
|
|
1093
|
+
export const events = table\`CREATE TABLE events (user_id UUID)\`;
|
|
1094
|
+
export const active = table\`CREATE VIEW active AS SELECT user_id FROM \${events} -- \${events.props.name}\`;
|
|
1095
|
+
`,
|
|
1096
|
+
);
|
|
1097
|
+
|
|
1098
|
+
const result = await tryFoldFile(file, [TABLE]);
|
|
1099
|
+
expect(result.ok).toBe(true);
|
|
1100
|
+
if (!result.ok) return;
|
|
1101
|
+
expect(result.entities.map(([name]) => name)).toEqual(["events", "active"]);
|
|
1102
|
+
const events = result.entities[0][1];
|
|
1103
|
+
const active = propsOf(result.entities[1][1]);
|
|
1104
|
+
expect(active.ddl).toBe("CREATE VIEW active AS SELECT user_id FROM events -- events");
|
|
1105
|
+
expect(active.dependsOn).toHaveLength(1);
|
|
1106
|
+
expect(active.dependsOn[0]).toBe(events);
|
|
1107
|
+
});
|
|
1108
|
+
|
|
1109
|
+
test("a resource holding a same-file tag const shares the instance running gives it", async () => {
|
|
1110
|
+
await writeTagDefs();
|
|
1111
|
+
await writeFile(
|
|
1112
|
+
join(testDir, "resources.ts"),
|
|
1113
|
+
`
|
|
1114
|
+
import { createResource } from ${JSON.stringify(runtimePath)};
|
|
1115
|
+
export const Bucket = createResource("Test::Bucket", "test", {});
|
|
1116
|
+
`,
|
|
1117
|
+
);
|
|
1118
|
+
const file = join(testDir, "main.ts");
|
|
1119
|
+
await writeFile(
|
|
1120
|
+
file,
|
|
1121
|
+
`
|
|
1122
|
+
import { Bucket } from "./resources";
|
|
1123
|
+
import { Sub } from "./tags";
|
|
1124
|
+
export const name = Sub\`data-\\\\d\`;
|
|
1125
|
+
export const bucket = new Bucket({ name });
|
|
1126
|
+
`,
|
|
1127
|
+
);
|
|
1128
|
+
|
|
1129
|
+
const result = await tryFoldFile(file, [SUB]);
|
|
1130
|
+
expect(result.ok).toBe(true);
|
|
1131
|
+
if (!result.ok) return;
|
|
1132
|
+
const name = result.exportedValues.get("name");
|
|
1133
|
+
expect(isIntrinsic(name)).toBe(true);
|
|
1134
|
+
expect((result.exportedValues.get("bucket") as { props: { name: unknown } }).props.name).toBe(name);
|
|
1135
|
+
expect(JSON.stringify(name)).toBe(JSON.stringify((await import(file)).name));
|
|
1136
|
+
});
|
|
1137
|
+
});
|
|
1138
|
+
|
|
1010
1139
|
describe("tryFoldFile — build-time parameters (chant #1064)", () => {
|
|
1011
1140
|
let testDir: string;
|
|
1012
1141
|
|