@intentius/chant 0.124.12 → 0.124.14
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/bin/chant +11 -0
- package/dist/agents/checks.js +326 -0
- package/dist/agents/discover.js +885 -0
- package/dist/agents/importer.js +17 -0
- package/dist/agents/index.js +12 -0
- package/dist/agents/types.js +19 -0
- package/dist/apply.js +151 -0
- package/dist/attrref.js +70 -0
- package/dist/audit/catalog.js +350 -0
- package/dist/audit/core.js +252 -0
- package/dist/audit/discover.js +633 -0
- package/dist/audit/fetch.js +666 -0
- package/dist/audit/lineage.js +91 -0
- package/dist/audit/nginx.js +366 -0
- package/dist/audit/prior-art.js +132 -0
- package/dist/audit/proof.js +321 -0
- package/dist/audit/report-html.js +194 -0
- package/dist/audit/report-model.js +198 -0
- package/dist/audit/report.js +102 -0
- package/dist/audit/rules-doc.js +144 -0
- package/dist/audit/secrets.js +405 -0
- package/dist/audit/terraform-state.js +140 -0
- package/dist/audit/wrangler.js +262 -0
- package/dist/behaviour-delta.js +401 -0
- package/dist/behaviour-engine.js +357 -0
- package/dist/behaviour-graph.js +83 -0
- package/dist/behaviour-http.js +188 -0
- package/dist/behaviour-kinds.js +172 -0
- package/dist/behaviour-overlay.js +50 -0
- package/dist/behaviour-predict.js +188 -0
- package/dist/behaviour-request.js +194 -0
- package/dist/behaviour.js +1325 -0
- package/dist/build-params.js +108 -0
- package/dist/build.js +668 -0
- package/dist/builder.js +44 -0
- package/dist/cdk/advise.js +30 -0
- package/dist/cdk/assembly.js +122 -0
- package/dist/cdk/graph.js +444 -0
- package/dist/cdk/tier-map.js +64 -0
- package/dist/cdk/types.js +24 -0
- package/dist/change-set.js +312 -0
- package/dist/child-project.js +21 -0
- package/dist/claimed-fields.js +135 -0
- package/dist/cli/build-options.js +70 -0
- package/dist/cli/build-params-cli.js +139 -0
- package/dist/cli/command-group.js +123 -0
- package/dist/cli/commands/audit-agents.js +326 -0
- package/dist/cli/commands/audit.js +571 -0
- package/dist/cli/commands/build.js +920 -0
- package/dist/cli/commands/carve-apply.js +153 -0
- package/dist/cli/commands/carve-bridge.js +201 -0
- package/dist/cli/commands/carve-emit.js +332 -0
- package/dist/cli/commands/carve-status.js +119 -0
- package/dist/cli/commands/carve.js +204 -0
- package/dist/cli/commands/check-lexicon-docs.js +79 -0
- package/dist/cli/commands/check-lexicon-examples.js +177 -0
- package/dist/cli/commands/check-lexicon-intrinsics.js +291 -0
- package/dist/cli/commands/check-lexicon-mcp.js +82 -0
- package/dist/cli/commands/check-lexicon-plugin.d.ts.map +1 -1
- package/dist/cli/commands/check-lexicon-plugin.js +104 -0
- package/dist/cli/commands/check-lexicon.js +766 -0
- package/dist/cli/commands/describe.js +85 -0
- package/dist/cli/commands/diff.js +175 -0
- package/dist/cli/commands/doctor.js +350 -0
- package/dist/cli/commands/import-agents.js +155 -0
- package/dist/cli/commands/import.js +670 -0
- package/dist/cli/commands/init-lexicon/templates/codegen.js +194 -0
- package/dist/cli/commands/init-lexicon/templates/docs.js +100 -0
- package/dist/cli/commands/init-lexicon/templates/examples.js +29 -0
- package/dist/cli/commands/init-lexicon/templates/lint.js +34 -0
- package/dist/cli/commands/init-lexicon/templates/lsp.js +37 -0
- package/dist/cli/commands/init-lexicon/templates/plugin.js +108 -0
- package/dist/cli/commands/init-lexicon/templates/project.js +240 -0
- package/dist/cli/commands/init-lexicon/templates/spec.js +56 -0
- package/dist/cli/commands/init-lexicon/templates/tests.js +66 -0
- package/dist/cli/commands/init-lexicon.js +172 -0
- package/dist/cli/commands/init.js +381 -0
- package/dist/cli/commands/lexicon-rolling-upgrade.js +145 -0
- package/dist/cli/commands/lexicon-surface-diff.js +145 -0
- package/dist/cli/commands/licenses.js +125 -0
- package/dist/cli/commands/lint.d.ts.map +1 -1
- package/dist/cli/commands/lint.js +948 -0
- package/dist/cli/commands/list.js +63 -0
- package/dist/cli/commands/migrate.d.ts.map +1 -1
- package/dist/cli/commands/migrate.js +423 -0
- package/dist/cli/commands/onboard.js +403 -0
- package/dist/cli/commands/pinned-upgrade.js +191 -0
- package/dist/cli/commands/update.js +194 -0
- package/dist/cli/commands/vendor.js +217 -0
- package/dist/cli/conflict-check.js +104 -0
- package/dist/cli/debug.js +8 -0
- package/dist/cli/format.js +104 -0
- package/dist/cli/handlers/build.js +267 -0
- package/dist/cli/handlers/carve-apply.js +30 -0
- package/dist/cli/handlers/carve-bridge.js +28 -0
- package/dist/cli/handlers/carve-emit.js +50 -0
- package/dist/cli/handlers/carve-status.js +26 -0
- package/dist/cli/handlers/carve.js +40 -0
- package/dist/cli/handlers/change-set.js +46 -0
- package/dist/cli/handlers/components.js +730 -0
- package/dist/cli/handlers/dev.js +113 -0
- package/dist/cli/handlers/emulator.js +233 -0
- package/dist/cli/handlers/explain.js +54 -0
- package/dist/cli/handlers/fan-out.js +422 -0
- package/dist/cli/handlers/gate-resume.js +275 -0
- package/dist/cli/handlers/generate.js +84 -0
- package/dist/cli/handlers/graph.js +969 -0
- package/dist/cli/handlers/init.js +102 -0
- package/dist/cli/handlers/lifecycle.js +1727 -0
- package/dist/cli/handlers/lint.js +62 -0
- package/dist/cli/handlers/migrate.js +48 -0
- package/dist/cli/handlers/misc.js +391 -0
- package/dist/cli/handlers/operator.js +1162 -0
- package/dist/cli/handlers/override-approve.js +102 -0
- package/dist/cli/handlers/pr.js +503 -0
- package/dist/cli/handlers/promote.js +342 -0
- package/dist/cli/handlers/run-generate.js +206 -0
- package/dist/cli/handlers/run-wave.js +66 -0
- package/dist/cli/handlers/run.js +1191 -0
- package/dist/cli/handlers/scenario.js +325 -0
- package/dist/cli/handlers/search.js +924 -0
- package/dist/cli/handlers/serve.js +32 -0
- package/dist/cli/handlers/vendor.js +154 -0
- package/dist/cli/index.js +3 -0
- package/dist/cli/is-entry-point.js +23 -0
- package/dist/cli/lsp/capabilities.js +28 -0
- package/dist/cli/lsp/diagnostics.js +34 -0
- package/dist/cli/lsp/server.js +329 -0
- package/dist/cli/main.d.ts.map +1 -1
- package/dist/cli/main.js +2540 -0
- package/dist/cli/mcp/lifecycle-tools.js +80 -0
- package/dist/cli/mcp/op-tools.js +306 -0
- package/dist/cli/mcp/resource-handlers.js +258 -0
- package/dist/cli/mcp/resources/context.js +85 -0
- package/dist/cli/mcp/server.js +353 -0
- package/dist/cli/mcp/tools/build.js +111 -0
- package/dist/cli/mcp/tools/composites.js +95 -0
- package/dist/cli/mcp/tools/explain.js +166 -0
- package/dist/cli/mcp/tools/import.js +49 -0
- package/dist/cli/mcp/tools/lint.js +41 -0
- package/dist/cli/mcp/tools/scaffold.js +111 -0
- package/dist/cli/mcp/tools/search.js +112 -0
- package/dist/cli/mcp/types.js +1 -0
- package/dist/cli/mcp/workspace-plugins.js +91 -0
- package/dist/cli/mcp/workspace-tools.d.ts +1 -1
- package/dist/cli/mcp/workspace-tools.js +564 -0
- package/dist/cli/mcp-config.js +70 -0
- package/dist/cli/plugins.js +313 -0
- package/dist/cli/registry.js +23 -0
- package/dist/cli/reporters/stylish.js +329 -0
- package/dist/cli/version.js +15 -0
- package/dist/cli/watch.js +79 -0
- package/dist/codegen/bound-property-types.js +82 -0
- package/dist/codegen/coverage.js +119 -0
- package/dist/codegen/docs-file-markers.js +60 -0
- package/dist/codegen/docs-pages.js +115 -0
- package/dist/codegen/docs-rule-scanning.js +164 -0
- package/dist/codegen/docs-rules.js +76 -0
- package/dist/codegen/docs-sections.js +117 -0
- package/dist/codegen/docs-sidebar.js +65 -0
- package/dist/codegen/docs-types.js +4 -0
- package/dist/codegen/docs.js +356 -0
- package/dist/codegen/fetch.js +340 -0
- package/dist/codegen/generate-post-synth-barrel.js +63 -0
- package/dist/codegen/generate-registry.js +71 -0
- package/dist/codegen/generate-runtime-index.js +56 -0
- package/dist/codegen/generate-typescript.js +119 -0
- package/dist/codegen/generate.js +115 -0
- package/dist/codegen/json-patch.js +141 -0
- package/dist/codegen/json-schema-to-ts.js +344 -0
- package/dist/codegen/json-schema.js +246 -0
- package/dist/codegen/lexicon-regen.js +412 -0
- package/dist/codegen/naming.js +217 -0
- package/dist/codegen/okf-lexicon.js +245 -0
- package/dist/codegen/package.js +150 -0
- package/dist/codegen/pinned-upgrade.d.ts.map +1 -1
- package/dist/codegen/pinned-upgrade.js +494 -0
- package/dist/codegen/registry.js +60 -0
- package/dist/codegen/rehype-base-url.mjs +68 -0
- package/dist/codegen/rolling-upgrade.js +217 -0
- package/dist/codegen/surface-snapshot.js +537 -0
- package/dist/codegen/testdata/postgres-tags.json +242 -0
- package/dist/codegen/topo-sort.js +36 -0
- package/dist/codegen/typecheck.js +115 -0
- package/dist/codegen/validate.js +200 -0
- package/dist/codegen/version-bump.js +35 -0
- package/dist/components/auto-release.js +143 -0
- package/dist/components/builders.js +47 -0
- package/dist/components/capability-plugin-loader.js +175 -0
- package/dist/components/capability-plugin-schema.js +46 -0
- package/dist/components/capability-plugin.js +99 -0
- package/dist/components/capability.js +60 -0
- package/dist/components/changed-files.js +72 -0
- package/dist/components/cli-support.js +427 -0
- package/dist/components/component.js +120 -0
- package/dist/components/component.schema.json +271 -0
- package/dist/components/config-defaults.js +130 -0
- package/dist/components/deploy-units.js +60 -0
- package/dist/components/discover.d.ts.map +1 -1
- package/dist/components/discover.js +189 -0
- package/dist/components/driver-output.js +86 -0
- package/dist/components/driver.js +728 -0
- package/dist/components/fan-out-output.js +165 -0
- package/dist/components/fan-out-record.js +94 -0
- package/dist/components/fan-out-run.js +373 -0
- package/dist/components/fan-out-support.js +60 -0
- package/dist/components/fan-out.js +273 -0
- package/dist/components/gate-plan.js +41 -0
- package/dist/components/gated-wave-pipeline.js +46 -0
- package/dist/components/index.js +24 -0
- package/dist/components/layers.js +28 -0
- package/dist/components/manifest-persistence.js +108 -0
- package/dist/components/pilots/alb-ecs.pilot.js +59 -0
- package/dist/components/pilots/dynamodb.pilot.js +51 -0
- package/dist/components/pilots/jar-emr.pilot.js +65 -0
- package/dist/components/pilots/lambda.pilot.js +52 -0
- package/dist/components/pilots/neo4j-fanout.pilot.js +68 -0
- package/dist/components/pilots/project.js +12 -0
- package/dist/components/pr-pipeline.js +134 -0
- package/dist/components/pr-run.js +363 -0
- package/dist/components/presets/ecs-fargate.js +72 -0
- package/dist/components/presets/index.js +28 -0
- package/dist/components/presets/lambda.js +34 -0
- package/dist/components/presets/single-host-compose.js +41 -0
- package/dist/components/promote.js +549 -0
- package/dist/components/registry.js +34 -0
- package/dist/components/run-progress.js +33 -0
- package/dist/components/sandbox/driver.d.ts.map +1 -1
- package/dist/components/sandbox/driver.js +93 -0
- package/dist/components/sandbox/run.js +115 -0
- package/dist/components/starter-plugin.js +104 -0
- package/dist/components/verbs/__tests__/mock-cloud-executor.js +68 -0
- package/dist/components/verbs/__tests__/mock-process-runner.js +45 -0
- package/dist/components/verbs/__tests__/mock-sbom-generator.js +56 -0
- package/dist/components/verbs/bom-writer.js +287 -0
- package/dist/components/verbs/build-archive.js +188 -0
- package/dist/components/verbs/build.js +142 -0
- package/dist/components/verbs/cloud-executor.js +110 -0
- package/dist/components/verbs/component-bom.js +125 -0
- package/dist/components/verbs/ensure-secret.js +50 -0
- package/dist/components/verbs/index.js +61 -0
- package/dist/components/verbs/license-policy.js +75 -0
- package/dist/components/verbs/lockfile-sbom-generator.js +191 -0
- package/dist/components/verbs/process-runner.js +78 -0
- package/dist/components/verbs/r2-sync.js +93 -0
- package/dist/components/verbs/reproducibility.js +62 -0
- package/dist/components/verbs/run-agent.js +577 -0
- package/dist/components/verbs/sbom-generator.js +119 -0
- package/dist/components/verbs/sbom.js +97 -0
- package/dist/components/verbs/shell.js +32 -0
- package/dist/components/verbs/sign.js +221 -0
- package/dist/components/verbs/stub.js +28 -0
- package/dist/components/verbs/tool-sbom-generator.js +154 -0
- package/dist/components/verbs/verify.js +112 -0
- package/dist/components/verbs/vex.js +131 -0
- package/dist/components/verbs/vuln-gate.js +152 -0
- package/dist/components/verbs/vuln-scan.js +288 -0
- package/dist/components/verbs/wait-verify.js +106 -0
- package/dist/components/verbs/wrangler.js +179 -0
- package/dist/components/wave-plan.js +102 -0
- package/dist/composite.js +305 -0
- package/dist/config-import.d.ts.map +1 -1
- package/dist/config-import.js +22 -0
- package/dist/config-sandbox.js +122 -0
- package/dist/config-static.js +206 -0
- package/dist/config.js +605 -0
- package/dist/content-digest.js +23 -0
- package/dist/declarable.js +114 -0
- package/dist/deep-observation.js +437 -0
- package/dist/detectLexicon.js +54 -0
- package/dist/discovery/cache.js +70 -0
- package/dist/discovery/collect.js +208 -0
- package/dist/discovery/cycles.js +95 -0
- package/dist/discovery/entity-wire-codec.js +391 -0
- package/dist/discovery/entity-wire.js +42 -0
- package/dist/discovery/files.js +121 -0
- package/dist/discovery/fold-import.d.ts.map +1 -1
- package/dist/discovery/fold-import.js +4178 -0
- package/dist/discovery/fold-rank.js +292 -0
- package/dist/discovery/graph.js +115 -0
- package/dist/discovery/import.d.ts.map +1 -1
- package/dist/discovery/import.js +65 -0
- package/dist/discovery/index.js +333 -0
- package/dist/discovery/param-deps.js +487 -0
- package/dist/discovery/resolve.js +39 -0
- package/dist/discovery/sandbox/bundle.js +214 -0
- package/dist/discovery/sandbox/child-errors.js +26 -0
- package/dist/discovery/sandbox/config-run.js +100 -0
- package/dist/discovery/sandbox/config-wire.js +183 -0
- package/dist/discovery/sandbox/driver.d.ts.map +1 -1
- package/dist/discovery/sandbox/driver.js +333 -0
- package/dist/discovery/sandbox/fork.js +229 -0
- package/dist/discovery/sandbox/policy-run.js +142 -0
- package/dist/discovery/sandbox/policy-wire.js +152 -0
- package/dist/discovery/sandbox/run.js +77 -0
- package/dist/discovery/specifier-resolve.js +320 -0
- package/dist/discovery/walk.js +284 -0
- package/dist/effect-receipt.js +340 -0
- package/dist/env.js +55 -0
- package/dist/errors.js +62 -0
- package/dist/fold/fold.js +1434 -0
- package/dist/fold/foldable-helpers.js +229 -0
- package/dist/fold/subset.js +696 -0
- package/dist/fold-provenance.js +414 -0
- package/dist/gate-decision.d.ts +36 -4
- package/dist/gate-decision.d.ts.map +1 -1
- package/dist/gate-decision.js +260 -0
- package/dist/gate-resume-run.js +154 -0
- package/dist/gated-waves.js +165 -0
- package/dist/governance.js +43 -0
- package/dist/graph-declared.js +45 -0
- package/dist/graph-detail.js +207 -0
- package/dist/graph-dot.js +54 -0
- package/dist/graph-effective.js +107 -0
- package/dist/graph-ir.js +623 -0
- package/dist/graph-layout.js +184 -0
- package/dist/graph-lens.js +105 -0
- package/dist/graph-mermaid.js +83 -0
- package/dist/graph-ops.js +39 -0
- package/dist/graph-refs.js +156 -0
- package/dist/held-elsewhere.js +87 -0
- package/dist/identity.js +251 -0
- package/dist/import/base-parser.js +34 -0
- package/dist/import/embedded.js +255 -0
- package/dist/import/generator.js +1 -0
- package/dist/import/ir-utils.js +85 -0
- package/dist/import/parser-options.js +45 -0
- package/dist/import/parser.js +1 -0
- package/dist/index.js +118 -0
- package/dist/intrinsic-interpolation.js +73 -0
- package/dist/intrinsic.js +31 -0
- package/dist/join-key.js +35 -0
- package/dist/kubectl-context.js +150 -0
- package/dist/lexicon-config.js +58 -0
- package/dist/lexicon-integrity.js +47 -0
- package/dist/lexicon-manifest.js +70 -0
- package/dist/lexicon-module.d.ts.map +1 -1
- package/dist/lexicon-module.js +241 -0
- package/dist/lexicon-output.js +218 -0
- package/dist/lexicon-plugin-helpers.js +104 -0
- package/dist/lexicon-schema.js +136 -0
- package/dist/lexicon.js +130 -0
- package/dist/lifecycle/affected.js +224 -0
- package/dist/lifecycle/assert-live.js +110 -0
- package/dist/lifecycle/build-ledger-store.js +160 -0
- package/dist/lifecycle/build-ledger.js +155 -0
- package/dist/lifecycle/change-set.js +356 -0
- package/dist/lifecycle/converge-ledger.js +161 -0
- package/dist/lifecycle/deep-diff.js +233 -0
- package/dist/lifecycle/deep-observe.js +147 -0
- package/dist/lifecycle/digest.js +143 -0
- package/dist/lifecycle/disruption.js +135 -0
- package/dist/lifecycle/gate-applied.js +113 -0
- package/dist/lifecycle/gate-audit.js +341 -0
- package/dist/lifecycle/gate-ledger-select.js +89 -0
- package/dist/lifecycle/gate-ledger.d.ts +8 -0
- package/dist/lifecycle/gate-ledger.d.ts.map +1 -1
- package/dist/lifecycle/gate-ledger.js +193 -0
- package/dist/lifecycle/gate-origin.js +117 -0
- package/dist/lifecycle/gate-pending.js +58 -0
- package/dist/lifecycle/git.js +1182 -0
- package/dist/lifecycle/identity.js +58 -0
- package/dist/lifecycle/index.js +26 -0
- package/dist/lifecycle/lease.js +283 -0
- package/dist/lifecycle/ledger-port.js +1 -0
- package/dist/lifecycle/legacy-digest.js +91 -0
- package/dist/lifecycle/live-diff.js +274 -0
- package/dist/lifecycle/local-note.js +15 -0
- package/dist/lifecycle/member-ledger.js +122 -0
- package/dist/lifecycle/observation-baseline.js +155 -0
- package/dist/lifecycle/observe.js +375 -0
- package/dist/lifecycle/oras-referrer-lookup.js +82 -0
- package/dist/lifecycle/override-ledger.js +54 -0
- package/dist/lifecycle/plan-digest.js +110 -0
- package/dist/lifecycle/plan-ledger.js +129 -0
- package/dist/lifecycle/receipt-plan.js +192 -0
- package/dist/lifecycle/release-ledger.js +155 -0
- package/dist/lifecycle/release-read.js +64 -0
- package/dist/lifecycle/replay.js +193 -0
- package/dist/lifecycle/rollback.js +102 -0
- package/dist/lifecycle/run-ledger.js +183 -0
- package/dist/lifecycle/scenario-eval.js +204 -0
- package/dist/lifecycle/scenario.js +214 -0
- package/dist/lifecycle/snapshot.js +239 -0
- package/dist/lifecycle/status.js +447 -0
- package/dist/lifecycle/symptoms.js +117 -0
- package/dist/lifecycle/teardown.js +255 -0
- package/dist/lifecycle/types.js +1 -0
- package/dist/lifecycle/unobserved-gate.js +33 -0
- package/dist/lifecycle/wave-plans.js +68 -0
- package/dist/lifecycle/work-item-id.js +36 -0
- package/dist/lifecycle/work-lease.js +393 -0
- package/dist/lint/component-checks.js +87 -0
- package/dist/lint/config.js +483 -0
- package/dist/lint/declarative.js +122 -0
- package/dist/lint/discover.d.ts.map +1 -1
- package/dist/lint/discover.js +138 -0
- package/dist/lint/engine.js +246 -0
- package/dist/lint/knowledge-checks.js +64 -0
- package/dist/lint/named-checks.js +22 -0
- package/dist/lint/output-checks.js +87 -0
- package/dist/lint/output-docs.js +163 -0
- package/dist/lint/parser.js +33 -0
- package/dist/lint/pipeline-change-gate.js +70 -0
- package/dist/lint/policy-import.d.ts +1 -1
- package/dist/lint/policy-import.d.ts.map +1 -1
- package/dist/lint/policy-import.js +62 -0
- package/dist/lint/policy-sandbox.js +86 -0
- package/dist/lint/policy.js +122 -0
- package/dist/lint/post-synth.js +87 -0
- package/dist/lint/presets/relaxed.json +26 -0
- package/dist/lint/presets/strict.json +24 -24
- package/dist/lint/receipt-checks.js +83 -0
- package/dist/lint/rule-loader.d.ts.map +1 -1
- package/dist/lint/rule-loader.js +89 -0
- package/dist/lint/rule-registry.js +86 -0
- package/dist/lint/rule.js +1 -0
- package/dist/lint/rules/__fixtures__/comp/comp000-discovery-error/broken-a.component.js +7 -0
- package/dist/lint/rules/__fixtures__/comp/comp000-discovery-error/broken-b.component.js +7 -0
- package/dist/lint/rules/__fixtures__/comp/comp001/fail/orphan-lib.component.js +9 -0
- package/dist/lint/rules/__fixtures__/comp/comp001/pass/emr-job.component.js +11 -0
- package/dist/lint/rules/__fixtures__/comp/comp001/pass/jar-lib.component.js +9 -0
- package/dist/lint/rules/__fixtures__/comp/comp002/fail/search-service.component.js +25 -0
- package/dist/lint/rules/__fixtures__/comp/comp002/pass/jar-lib.component.js +8 -0
- package/dist/lint/rules/__fixtures__/comp/comp002/pass/search-service.component.js +21 -0
- package/dist/lint/rules/__fixtures__/comp/comp003/fail/migrator.component.js +8 -0
- package/dist/lint/rules/__fixtures__/comp/comp003/pass/agent-turn.component.js +24 -0
- package/dist/lint/rules/__fixtures__/comp/comp003/pass/migrator.component.js +17 -0
- package/dist/lint/rules/__fixtures__/comp/comp003/pass/orders-table.component.js +8 -0
- package/dist/lint/rules/__fixtures__/comp/comp004/fail/neo4j-cluster.component.js +18 -0
- package/dist/lint/rules/__fixtures__/comp/comp004/pass/neo4j-cluster.component.js +20 -0
- package/dist/lint/rules/__fixtures__/comp/comp004/pass/orders-table.component.js +8 -0
- package/dist/lint/rules/__fixtures__/comp/comp005/fail/search-service.component.js +12 -0
- package/dist/lint/rules/__fixtures__/comp/comp005/pass/search-service.component.js +16 -0
- package/dist/lint/rules/__fixtures__/comp/comp006/fail/legacy-tool.component.js +8 -0
- package/dist/lint/rules/__fixtures__/comp/comp006/pass/legacy-tool.component.js +12 -0
- package/dist/lint/rules/__fixtures__/comp/comp007/fail/inventory-table.component.js +11 -0
- package/dist/lint/rules/__fixtures__/comp/comp007/fail/orders-table.component.js +11 -0
- package/dist/lint/rules/__fixtures__/comp/comp007/pass/orders-table.component.js +10 -0
- package/dist/lint/rules/__fixtures__/comp/comp007/pass/search-service.component.js +16 -0
- package/dist/lint/rules/comp/comp001-publishes-never-applies.js +69 -0
- package/dist/lint/rules/comp/comp002-dangling-wiring-ref.js +84 -0
- package/dist/lint/rules/comp/comp003-mutating-no-rollback.js +103 -0
- package/dist/lint/rules/comp/comp004-gate-needs-durable-runtime.js +70 -0
- package/dist/lint/rules/comp/comp005-capability-kind-is-noun.js +109 -0
- package/dist/lint/rules/comp/comp006-shell-needs-reason.js +49 -0
- package/dist/lint/rules/comp/comp007-composition-sprawl.js +64 -0
- package/dist/lint/rules/comp/index.js +33 -0
- package/dist/lint/rules/comp/support.js +129 -0
- package/dist/lint/rules/composite-scope.js +51 -0
- package/dist/lint/rules/cor017-composite-name-match.js +93 -0
- package/dist/lint/rules/cor018-composite-prefer-lexicon-type.js +136 -0
- package/dist/lint/rules/cor021-env-literal-name.js +100 -0
- package/dist/lint/rules/cor022-receipt-leaf.js +118 -0
- package/dist/lint/rules/cor024-receipt-secret-pointer.js +199 -0
- package/dist/lint/rules/declarable-naming-convention.js +62 -0
- package/dist/lint/rules/evl001-non-literal-expression.js +66 -0
- package/dist/lint/rules/evl002-control-flow-resource.js +69 -0
- package/dist/lint/rules/evl003-dynamic-property-access.js +44 -0
- package/dist/lint/rules/evl004-spread-non-const.js +94 -0
- package/dist/lint/rules/evl005-resource-block-body.js +41 -0
- package/dist/lint/rules/evl007-invalid-siblings.js +105 -0
- package/dist/lint/rules/evl009-composite-no-constant.js +158 -0
- package/dist/lint/rules/evl010-composite-no-transform.js +59 -0
- package/dist/lint/rules/evl011-symbolic-in-template.js +106 -0
- package/dist/lint/rules/export-required.js +115 -0
- package/dist/lint/rules/file-declarable-limit.js +88 -0
- package/dist/lint/rules/flat-declarations.js +62 -0
- package/dist/lint/rules/index.js +90 -0
- package/dist/lint/rules/no-cyclic-declarable-ref.js +138 -0
- package/dist/lint/rules/no-redundant-type-import.js +76 -0
- package/dist/lint/rules/no-redundant-value-cast.js +41 -0
- package/dist/lint/rules/no-string-ref.js +59 -0
- package/dist/lint/rules/no-unused-declarable-import.js +75 -0
- package/dist/lint/rules/no-unused-declarable.js +142 -0
- package/dist/lint/rules/op/index.js +28 -0
- package/dist/lint/rules/op/ops012-activity-contract.js +54 -0
- package/dist/lint/rules/op/ops013-step-output-ref.js +88 -0
- package/dist/lint/rules/op/ops014-converge-rule-refusals.js +114 -0
- package/dist/lint/rules/op/ops015-gate-approval.js +45 -0
- package/dist/lint/rules/op/support.js +11 -0
- package/dist/lint/rules/op/sys010-key-over-plain-http.js +100 -0
- package/dist/lint/rules/property-kind.js +56 -0
- package/dist/lint/rules/single-concern-file.js +71 -0
- package/dist/lint/rules/sys001-no-literal-key.js +60 -0
- package/dist/lint/selectors.js +168 -0
- package/dist/lint/suppressions.js +129 -0
- package/dist/lint/typescript.js +17 -0
- package/dist/live-endpoint.js +113 -0
- package/dist/live-read-session.js +76 -0
- package/dist/lsp/lexicon-providers.js +163 -0
- package/dist/lsp/types.js +5 -0
- package/dist/managed-fields.js +293 -0
- package/dist/mcp/types.js +4 -0
- package/dist/notify-verify.js +0 -1
- package/dist/notify.js +0 -1
- package/dist/notify.schema.json +72 -0
- package/dist/observation.js +266 -0
- package/dist/okf-read.js +134 -0
- package/dist/okf.js +275 -0
- package/dist/op/__fixtures__/decide-stub-backend.js +125 -0
- package/dist/op/activities/activity-contracts.js +313 -0
- package/dist/op/activities/apply.js +582 -0
- package/dist/op/activities/build.js +18 -0
- package/dist/op/activities/change-coverage.js +40 -0
- package/dist/op/activities/change-set.js +64 -0
- package/dist/op/activities/converge.js +492 -0
- package/dist/op/activities/decide.js +211 -0
- package/dist/op/activities/env-teardown.js +110 -0
- package/dist/op/activities/factory.js +591 -0
- package/dist/op/activities/forge-pull-request.js +82 -0
- package/dist/op/activities/gh-host.js +78 -0
- package/dist/op/activities/guard-validate.js +165 -0
- package/dist/op/activities/http-check.js +40 -0
- package/dist/op/activities/index.js +59 -0
- package/dist/op/activities/lexicon-upgrade.js +629 -0
- package/dist/op/activities/lifecycle.js +109 -0
- package/dist/op/activities/pipeline-audit.js +147 -0
- package/dist/op/activities/policy.js +26 -0
- package/dist/op/activities/predict-behaviour.js +341 -0
- package/dist/op/activities/propose-upgrade.js +165 -0
- package/dist/op/activities/reconcile.js +997 -0
- package/dist/op/activities/shell.js +118 -0
- package/dist/op/activities/source-release.js +97 -0
- package/dist/op/activities/source-rollback.js +165 -0
- package/dist/op/activities/teardown.js +17 -0
- package/dist/op/activities/util.js +6 -0
- package/dist/op/activities/wait.js +51 -0
- package/dist/op/activities/work-evidence.js +35 -0
- package/dist/op/activities/workflow-audit.js +133 -0
- package/dist/op/activity-contract-registry.js +106 -0
- package/dist/op/activity-contract.js +232 -0
- package/dist/op/activity-failure.js +31 -0
- package/dist/op/activity-profiles.js +129 -0
- package/dist/op/activity-registry.js +105 -0
- package/dist/op/activity-runtime.js +28 -0
- package/dist/op/builders.js +801 -0
- package/dist/op/change-signal.js +118 -0
- package/dist/op/composites/apply-op.js +151 -0
- package/dist/op/composites/behaviour-op.js +65 -0
- package/dist/op/composites/converge-op.js +141 -0
- package/dist/op/composites/index.js +19 -0
- package/dist/op/composites/lexicon-upgrade-op.js +107 -0
- package/dist/op/composites/pipeline-audit-op.js +50 -0
- package/dist/op/composites/reconcile-op.js +84 -0
- package/dist/op/composites/watch-op.js +69 -0
- package/dist/op/composites/workflow-audit-op.js +57 -0
- package/dist/op/converge-rule.js +205 -0
- package/dist/op/cron.js +146 -0
- package/dist/op/decide-backend.js +181 -0
- package/dist/op/decide-config.js +68 -0
- package/dist/op/decide-read-inputs.js +141 -0
- package/dist/op/discover.d.ts.map +1 -1
- package/dist/op/discover.js +213 -0
- package/dist/op/duration.js +21 -0
- package/dist/op/emulator-freshness.js +80 -0
- package/dist/op/emulator-lifecycle.js +269 -0
- package/dist/op/factory.js +83 -0
- package/dist/op/gate-approval.js +172 -0
- package/dist/op/gate-name.js +86 -0
- package/dist/op/gate-plan-context.js +167 -0
- package/dist/op/gate-point-run.js +67 -0
- package/dist/op/gate-point.js +111 -0
- package/dist/op/gate-resume-plan.js +155 -0
- package/dist/op/gate-resume.js +31 -0
- package/dist/op/gate-review.js +290 -0
- package/dist/op/gate-run-locator.js +85 -0
- package/dist/op/gate-summary.js +100 -0
- package/dist/op/gate-wait.js +56 -0
- package/dist/op/gate.js +449 -0
- package/dist/op/generate-pipeline.js +124 -0
- package/dist/op/index.js +51 -0
- package/dist/op/lifecycle-receipt-store.js +45 -0
- package/dist/op/local-executor.js +1164 -0
- package/dist/op/local-output.js +140 -0
- package/dist/op/op-ir.js +317 -0
- package/dist/op/op-verb-class.js +131 -0
- package/dist/op/op-waves-notify.js +136 -0
- package/dist/op/op-waves-run.d.ts +1 -1
- package/dist/op/op-waves-run.d.ts.map +1 -1
- package/dist/op/op-waves-run.js +1657 -0
- package/dist/op/op-waves.js +409 -0
- package/dist/op/operator.js +743 -0
- package/dist/op/receipt-store.js +94 -0
- package/dist/op/resource.js +23 -0
- package/dist/op/run-context.js +28 -0
- package/dist/op/run-live.js +256 -0
- package/dist/op/runtime.js +21 -0
- package/dist/op/runtimes/local.js +195 -0
- package/dist/op/source-archive.js +131 -0
- package/dist/op/step-output-ref.js +397 -0
- package/dist/op/steward-beside.js +169 -0
- package/dist/op/steward-points.js +138 -0
- package/dist/op/steward-turn.js +59 -0
- package/dist/op/steward.js +317 -0
- package/dist/op/types.js +25 -0
- package/dist/op/work-lease-decl.js +81 -0
- package/dist/op/work-lease-run.js +393 -0
- package/dist/override-gate.js +284 -0
- package/dist/owner-chain.js +74 -0
- package/dist/ownership.js +92 -0
- package/dist/params.js +61 -0
- package/dist/plan-summary.js +711 -0
- package/dist/point-decision.js +211 -0
- package/dist/pr-forge.js +810 -0
- package/dist/pr-loop.js +203 -0
- package/dist/project-codegen.js +191 -0
- package/dist/project-root.js +74 -0
- package/dist/project-validation.js +50 -0
- package/dist/provenance.js +157 -0
- package/dist/pseudo-parameter.js +40 -0
- package/dist/reconcile.js +450 -0
- package/dist/resource-attributes.js +33 -0
- package/dist/runtime-adapter.js +77 -0
- package/dist/runtime.js +66 -0
- package/dist/secret-materialization.js +153 -0
- package/dist/secret-provenance.js +250 -0
- package/dist/serializer-walker.js +112 -0
- package/dist/serializer.js +1 -0
- package/dist/sort.js +45 -0
- package/dist/stack-output.js +115 -0
- package/dist/telemetry-attribution.js +149 -0
- package/dist/terraform/__fixtures__/build-graph.js +63 -0
- package/dist/terraform/adopt-state.js +40 -0
- package/dist/terraform/aws-resources.js +384 -0
- package/dist/terraform/bridge.js +204 -0
- package/dist/terraform/carve-provider.js +155 -0
- package/dist/terraform/carve.js +138 -0
- package/dist/terraform/data-source-shape.js +57 -0
- package/dist/terraform/emit-source.js +36 -0
- package/dist/terraform/excise.js +123 -0
- package/dist/terraform/graduate.js +128 -0
- package/dist/terraform/graph.js +435 -0
- package/dist/terraform/hcl2json.js +60 -0
- package/dist/terraform/manifest.js +149 -0
- package/dist/terraform/parse.js +81 -0
- package/dist/terraform/providers/aws.js +146 -0
- package/dist/terraform/providers/gcp.js +294 -0
- package/dist/terraform/providers/index.js +17 -0
- package/dist/terraform/providers/kubernetes.js +253 -0
- package/dist/terraform/score.js +151 -0
- package/dist/terraform/state.js +67 -0
- package/dist/terraform/tier-map.js +74 -0
- package/dist/terraform/types.js +13 -0
- package/dist/terraform/unified-diff.js +132 -0
- package/dist/testing.js +295 -0
- package/dist/toml-emit.js +153 -0
- package/dist/toml-parse.js +355 -0
- package/dist/toml-utils.js +60 -0
- package/dist/toml.js +428 -0
- package/dist/ts-loader.d.ts +46 -0
- package/dist/ts-loader.d.ts.map +1 -0
- package/dist/ts-loader.js +103 -0
- package/dist/types.js +1 -0
- package/dist/utils.js +61 -0
- package/dist/validation.js +20 -0
- package/dist/vendor/js-yaml-load.js +1662 -0
- package/dist/workspace/__fixtures__/contract-repo.js +103 -0
- package/dist/workspace/__fixtures__/decide-workspace.js +112 -0
- package/dist/workspace/__fixtures__/sessions.js +91 -0
- package/dist/workspace/__fixtures__/two-member-workspace.js +34 -0
- package/dist/workspace/agent-cli.js +99 -0
- package/dist/workspace/agent.schema.json +390 -0
- package/dist/workspace/answers-ledger.js +89 -0
- package/dist/workspace/box-cli.js +142 -0
- package/dist/workspace/box-factory-write.js +196 -0
- package/dist/workspace/box-factory-write.schema.json +342 -0
- package/dist/workspace/box-factory.js +88 -0
- package/dist/workspace/box-intent.js +126 -0
- package/dist/workspace/box-isolation.js +169 -0
- package/dist/workspace/box-listing-write.schema.json +204 -0
- package/dist/workspace/box-listing.js +298 -0
- package/dist/workspace/box-publish.js +352 -0
- package/dist/workspace/box-publish.schema.json +498 -0
- package/dist/workspace/box-services.js +39 -0
- package/dist/workspace/broker-protocol.js +359 -0
- package/dist/workspace/broker-protocol.schema.json +228 -0
- package/dist/workspace/change-set.schema.json +460 -0
- package/dist/workspace/changes-cli.js +56 -0
- package/dist/workspace/changes.js +446 -0
- package/dist/workspace/changes.schema.json +642 -0
- package/dist/workspace/chant-migrations/chud-lexicon-exit-fly-site.js +198 -0
- package/dist/workspace/chant-migrations/chud-lexicon-exit-live-names.js +155 -0
- package/dist/workspace/chant-migrations/chud-lexicon-exit-rollback.js +214 -0
- package/dist/workspace/chant-migrations/chud-lexicon-exit-ship-inputs.js +180 -0
- package/dist/workspace/chant-migrations/chud-lexicon-exit-ship-policy.js +99 -0
- package/dist/workspace/chant-migrations/chud-lexicon-exit.js +847 -0
- package/dist/workspace/chant-migrations.js +113 -0
- package/dist/workspace/check.schema.json +433 -0
- package/dist/workspace/checks/box-isolation.js +62 -0
- package/dist/workspace/checks/boxes.js +491 -0
- package/dist/workspace/checks/diagrams.js +104 -0
- package/dist/workspace/checks/generated.js +419 -0
- package/dist/workspace/checks/ledgers.js +212 -0
- package/dist/workspace/checks/links.js +191 -0
- package/dist/workspace/checks/live.js +100 -0
- package/dist/workspace/checks/pipelines.js +188 -0
- package/dist/workspace/checks/records.js +169 -0
- package/dist/workspace/checks.js +426 -0
- package/dist/workspace/ci-green-cli.js +125 -0
- package/dist/workspace/ci-green-forge.js +83 -0
- package/dist/workspace/ci-green-workflow.js +199 -0
- package/dist/workspace/ci-green.js +325 -0
- package/dist/workspace/ci-last-green.schema.json +158 -0
- package/dist/workspace/compose-graph.js +235 -0
- package/dist/workspace/compose-reports.js +146 -0
- package/dist/workspace/composites.js +264 -0
- package/dist/workspace/composites.schema.json +617 -0
- package/dist/workspace/conformance/__fixture__/app/package.json +7 -0
- package/dist/workspace/conformance/__fixture__/app/src/server.mjs +29 -0
- package/dist/workspace/conformance/__fixture__/decisions/decision.kind.mjs +54 -0
- package/dist/workspace/conformance/__fixture__/decisions/decision.schema.json +512 -0
- package/dist/workspace/conformance/__fixture__/decisions/fix-001-how-the-app-is-deployed.md +40 -0
- package/dist/workspace/conformance/__fixture__/delivery/chant.config.ts +7 -0
- package/dist/workspace/conformance/__fixture__/delivery/lexicon/index.ts +26 -0
- package/dist/workspace/conformance/__fixture__/delivery/package.json +7 -0
- package/dist/workspace/conformance/__fixture__/delivery/src/app.component.ts +14 -0
- package/dist/workspace/conformance/__fixture__/delivery/src/app.ts +4 -0
- package/dist/workspace/conformance/__fixtures__/reference-broker.js +205 -0
- package/dist/workspace/conformance/__writer_fixture__/answers/answer.kind.mjs +32 -0
- package/dist/workspace/conformance/__writer_fixture__/answers/answer.schema.json +135 -0
- package/dist/workspace/conformance/__writer_fixture__/contracts/contract.kind.mjs +37 -0
- package/dist/workspace/conformance/__writer_fixture__/contracts/contract.schema.json +213 -0
- package/dist/workspace/conformance/__writer_fixture__/decisions/points.json +228 -0
- package/dist/workspace/conformance/__writer_fixture__/drivers/driver.kind.mjs +15 -0
- package/dist/workspace/conformance/__writer_fixture__/drivers/driver.schema.json +38 -0
- package/dist/workspace/conformance/__writer_fixture__/sessions/session.kind.mjs +54 -0
- package/dist/workspace/conformance/__writer_fixture__/sessions/session.schema.json +289 -0
- package/dist/workspace/conformance/__writer_fixture__/work/W-001-the-writer-suite-works-this-item.md +25 -0
- package/dist/workspace/conformance/__writer_fixture__/work/work.kind.mjs +60 -0
- package/dist/workspace/conformance/__writer_fixture__/work/work.schema.json +603 -0
- package/dist/workspace/conformance/broker.js +736 -0
- package/dist/workspace/conformance/index.js +673 -0
- package/dist/workspace/conformance/vitest.js +108 -0
- package/dist/workspace/conformance/writer.js +1080 -0
- package/dist/workspace/decide.js +879 -0
- package/dist/workspace/decision-points.schema.json +135 -135
- package/dist/workspace/declaration-write-cli.js +74 -0
- package/dist/workspace/declaration-write.js +238 -0
- package/dist/workspace/declaration.js +938 -0
- package/dist/workspace/declaration.schema.json +1413 -1413
- package/dist/workspace/declared-kinds.js +106 -0
- package/dist/workspace/environments.js +164 -0
- package/dist/workspace/evidence.schema.json +279 -0
- package/dist/workspace/export-cli.js +185 -0
- package/dist/workspace/export.js +499 -0
- package/dist/workspace/factory-rules.js +175 -0
- package/dist/workspace/generated-files.js +92 -0
- package/dist/workspace/glob.js +45 -0
- package/dist/workspace/graph-cache.js +352 -0
- package/dist/workspace/graph-cli.js +348 -0
- package/dist/workspace/graph.schema.json +1338 -0
- package/dist/workspace/identity-gate-rule.d.ts +65 -0
- package/dist/workspace/identity-gate-rule.d.ts.map +1 -0
- package/dist/workspace/identity-gate-rule.js +75 -0
- package/dist/workspace/identity.d.ts +4 -2
- package/dist/workspace/identity.d.ts.map +1 -1
- package/dist/workspace/identity.js +126 -0
- package/dist/workspace/import.js +283 -0
- package/dist/workspace/init.js +620 -0
- package/dist/workspace/intent-cli.js +263 -0
- package/dist/workspace/intent-joins.js +201 -0
- package/dist/workspace/intent-record.js +352 -0
- package/dist/workspace/intent-record.schema.json +864 -0
- package/dist/workspace/intent.js +1582 -0
- package/dist/workspace/intent.schema.json +2420 -0
- package/dist/workspace/json-edit.js +221 -0
- package/dist/workspace/jsonc.js +235 -0
- package/dist/workspace/kind-readers.js +103 -0
- package/dist/workspace/kinds.js +587 -0
- package/dist/workspace/lexicon-symbols.js +112 -0
- package/dist/workspace/lineage-adopt-cli.js +102 -0
- package/dist/workspace/lineage-adopt.js +360 -0
- package/dist/workspace/lineage-check.js +282 -0
- package/dist/workspace/lineage-cli.js +121 -0
- package/dist/workspace/lineage-hash-index.js +284 -0
- package/dist/workspace/lineage-init.js +507 -0
- package/dist/workspace/lineage-lock.js +387 -0
- package/dist/workspace/lineage-merge.js +45 -0
- package/dist/workspace/lineage-migrations.d.ts.map +1 -1
- package/dist/workspace/lineage-migrations.js +329 -0
- package/dist/workspace/lineage-provenance.js +36 -0
- package/dist/workspace/lineage-update.js +138 -0
- package/dist/workspace/lineage-upgrade-cli.js +131 -0
- package/dist/workspace/lineage-upgrade.js +889 -0
- package/dist/workspace/lineage-vendor.js +171 -0
- package/dist/workspace/lineage-version.js +128 -0
- package/dist/workspace/lineage-versions.js +275 -0
- package/dist/workspace/links.js +330 -0
- package/dist/workspace/ls-generated.js +95 -0
- package/dist/workspace/ls.js +277 -0
- package/dist/workspace/ls.schema.json +333 -0
- package/dist/workspace/member-commands.js +508 -0
- package/dist/workspace/member-handles.js +216 -0
- package/dist/workspace/member-pipeline.js +258 -0
- package/dist/workspace/member-run.js +117 -0
- package/dist/workspace/member-write.schema.json +193 -0
- package/dist/workspace/nested-graph.js +156 -0
- package/dist/workspace/nesting.js +38 -0
- package/dist/workspace/patch.js +301 -0
- package/dist/workspace/patch.schema.json +321 -0
- package/dist/workspace/pin-cli.js +55 -0
- package/dist/workspace/pin-integrity.js +100 -0
- package/dist/workspace/plan-summary.schema.json +155 -0
- package/dist/workspace/point-answer.schema.json +129 -129
- package/dist/workspace/points-cli.js +291 -0
- package/dist/workspace/points-write.schema.json +660 -0
- package/dist/workspace/points.js +521 -0
- package/dist/workspace/points.schema.json +916 -0
- package/dist/workspace/pr-report.schema.json +108 -0
- package/dist/workspace/principal-classes.d.ts +3 -14
- package/dist/workspace/principal-classes.d.ts.map +1 -1
- package/dist/workspace/principal-classes.js +245 -0
- package/dist/workspace/reason-codes.js +326 -0
- package/dist/workspace/record-assets.js +151 -0
- package/dist/workspace/record-decided.js +105 -0
- package/dist/workspace/record-sessions.js +96 -0
- package/dist/workspace/record-source.js +114 -0
- package/dist/workspace/records-amend.schema.json +284 -0
- package/dist/workspace/records-checkout.js +76 -0
- package/dist/workspace/records-cli.js +707 -0
- package/dist/workspace/records-close.js +116 -0
- package/dist/workspace/records-close.schema.json +278 -0
- package/dist/workspace/records-new.schema.json +202 -0
- package/dist/workspace/records-review.schema.json +367 -0
- package/dist/workspace/records-since.js +317 -0
- package/dist/workspace/records-since.schema.json +218 -0
- package/dist/workspace/records-write.js +1229 -0
- package/dist/workspace/records.js +1345 -0
- package/dist/workspace/records.schema.json +604 -0
- package/dist/workspace/reference-kinds/app/package.json +10 -0
- package/dist/workspace/reference-kinds/app/workspace-kinds.json +45 -0
- package/dist/workspace/returns.js +303 -0
- package/dist/workspace/root-refusal.js +75 -0
- package/dist/workspace/run-statement.schema.json +622 -0
- package/dist/workspace/runs-cli.js +584 -0
- package/dist/workspace/runs-write.schema.json +994 -0
- package/dist/workspace/runs.js +708 -0
- package/dist/workspace/runs.schema.json +1257 -0
- package/dist/workspace/runtimes.js +76 -0
- package/dist/workspace/session-kinds.js +83 -0
- package/dist/workspace/signers.schema.json +206 -0
- package/dist/workspace/source-block.js +125 -0
- package/dist/workspace/squash.js +177 -0
- package/dist/workspace/status-gates.js +162 -0
- package/dist/workspace/status-stewards.js +330 -0
- package/dist/workspace/status.js +514 -0
- package/dist/workspace/status.schema.json +998 -0
- package/dist/workspace/steward-index.js +191 -0
- package/dist/workspace/symbols.js +188 -0
- package/dist/workspace/template-manifest.js +227 -0
- package/dist/workspace/template-pins.js +115 -0
- package/dist/workspace/trailer-joins.js +65 -0
- package/dist/workspace/trailers.js +111 -0
- package/dist/workspace/tree.js +136 -0
- package/dist/workspace/trust/attestor.js +63 -0
- package/dist/workspace/trust/dsse.js +108 -0
- package/dist/workspace/trust/evidence-cli.js +175 -0
- package/dist/workspace/trust/evidence.js +161 -0
- package/dist/workspace/trust/gate-seal.js +226 -0
- package/dist/workspace/trust/policy.js +190 -0
- package/dist/workspace/trust/provenance.js +180 -0
- package/dist/workspace/trust/rotation.js +298 -0
- package/dist/workspace/trust/run-commits.js +101 -0
- package/dist/workspace/trust/run-statement.js +182 -0
- package/dist/workspace/trust/seal.js +272 -0
- package/dist/workspace/trust/signers-cli.js +152 -0
- package/dist/workspace/trust/ssh-commit.js +178 -0
- package/dist/workspace/trust/test-repo.js +118 -0
- package/dist/workspace/trust/trust-files.js +193 -0
- package/dist/workspace/trust/verify-cli.js +63 -0
- package/dist/workspace/trust/verify.js +192 -0
- package/dist/workspace/which-chant.js +141 -0
- package/dist/workspace/wip-cli.js +95 -0
- package/dist/workspace/wip-write.schema.json +504 -0
- package/dist/workspace/wip.js +631 -0
- package/dist/workspace/wip.schema.json +334 -0
- package/dist/workspace/work-cli.js +448 -0
- package/dist/workspace/work-evidence.js +122 -0
- package/dist/workspace/work-evidence.schema.json +222 -0
- package/dist/workspace/work-history.schema.json +421 -0
- package/dist/workspace/work-lease.schema.json +246 -0
- package/dist/workspace/work-size.js +77 -0
- package/dist/workspace/work.js +283 -0
- package/dist/workspace/workspace-kinds.schema.json +259 -259
- package/dist/workspace/workspace-principals.schema.json +53 -53
- package/dist/workspace/write-lock-cli.js +105 -0
- package/dist/workspace/write-lock.js +424 -0
- package/dist/workspace/write-lock.schema.json +172 -0
- package/dist/workspace/write-scope.js +484 -0
- package/dist/yaml.js +459 -0
- package/package.json +2 -2
- package/src/cli/commands/check-lexicon-plugin.ts +2 -0
- package/src/cli/commands/lint.ts +36 -6
- package/src/cli/commands/migrate.ts +2 -0
- package/src/cli/compiled-cli.e2e.test.ts +165 -0
- package/src/cli/main.ts +121 -27
- package/src/cli/mcp/workspace-tools.ts +1 -1
- package/src/codegen/pinned-upgrade.ts +2 -0
- package/src/components/discover.ts +2 -0
- package/src/components/sandbox/driver.ts +3 -1
- package/src/config-import.ts +3 -0
- package/src/discovery/fold-import.ts +23 -14
- package/src/discovery/import.ts +2 -0
- package/src/discovery/sandbox/driver.ts +3 -1
- package/src/gate-decision-bundle.test.ts +3 -2
- package/src/gate-decision-identity.test.ts +176 -0
- package/src/gate-decision.ts +100 -22
- package/src/lexicon-module.ts +3 -0
- package/src/lifecycle/gate-ledger.ts +8 -0
- package/src/lint/config.ts +1 -1
- package/src/lint/discover.ts +28 -8
- package/src/lint/policy-import.ts +4 -1
- package/src/lint/rule-loader.ts +2 -0
- package/src/op/discover.ts +3 -0
- package/src/op/op-waves-point.test.ts +1 -0
- package/src/op/op-waves-run.ts +5 -4
- package/src/op/op-waves.test.ts +14 -0
- package/src/ts-loader.test.ts +23 -0
- package/src/ts-loader.ts +122 -0
- package/src/workspace/chant-migrations/chud-lexicon-exit.ts +1 -1
- package/src/workspace/declaration.ts +1 -1
- package/src/workspace/identity-gate-rule.ts +109 -0
- package/src/workspace/identity.ts +8 -18
- package/src/workspace/kinds.ts +1 -1
- package/src/workspace/lineage-migrations.ts +2 -0
- package/src/workspace/points.ts +1 -1
- package/src/workspace/principal-classes.ts +5 -30
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The observation contract (#1089) — what a lexicon's `describeResources()`
|
|
3
|
+
* is allowed to mean.
|
|
4
|
+
*
|
|
5
|
+
* Before this module there were two ways for an observation to return nothing
|
|
6
|
+
* for a declared entity and no way to tell them apart:
|
|
7
|
+
*
|
|
8
|
+
* 1. The provider was asked and said the resource does not exist.
|
|
9
|
+
* 2. The lexicon never looked — no reader for that kind, the read errored,
|
|
10
|
+
* no credentials, no cluster/subscription binding.
|
|
11
|
+
*
|
|
12
|
+
* Both arrived at the change set as "absent", and absent + declared classifies
|
|
13
|
+
* as `create`. So `chant lifecycle plan` proposed creating a Kubernetes CRD
|
|
14
|
+
* that already existed in the cluster, with nothing in the plan to say the tool
|
|
15
|
+
* had simply not looked (a warn on stderr is not a signal in a change set).
|
|
16
|
+
*
|
|
17
|
+
* The contract is a tri-state, per declared entity:
|
|
18
|
+
*
|
|
19
|
+
* - **OBSERVED-PRESENT** — a key in `resources`. The provider returned it.
|
|
20
|
+
* - **OBSERVED-ABSENT** — in neither map. The lexicon looked and the provider
|
|
21
|
+
* reported it missing. This is the only shape that may become a `create`.
|
|
22
|
+
* - **NOT-OBSERVED** — a key in `unobserved`, carrying a total
|
|
23
|
+
* {@link UnobservedReason}. Never a `create`, never a `delete`; consumers
|
|
24
|
+
* surface it and stop.
|
|
25
|
+
*
|
|
26
|
+
* Compatibility: `describeResources()` may still return the bare
|
|
27
|
+
* `name → ResourceMetadata` map it always did — that means "everything I was
|
|
28
|
+
* asked about, I looked at" and normalizes to an empty `unobserved`. Reporting
|
|
29
|
+
* NOT-OBSERVED requires the explicitly versioned {@link ObservationResult}
|
|
30
|
+
* envelope, which is discriminated by its literal `observation: "v1"` field (a
|
|
31
|
+
* bare map's value at any key is a `ResourceMetadata` object, never that
|
|
32
|
+
* string, so the two shapes can never be confused).
|
|
33
|
+
*/
|
|
34
|
+
/**
|
|
35
|
+
* Every legal {@link UnobservedReason}, for validation and conformance checks.
|
|
36
|
+
*
|
|
37
|
+
* Derived from a witness keyed off the union rather than written out beside it
|
|
38
|
+
* (chant#2366). A hand-maintained array is only ever checked for holding legal
|
|
39
|
+
* members, never for holding ALL of them, so a reason added to the type left
|
|
40
|
+
* the array silently short — `tsc` clean, every observation test green, and a
|
|
41
|
+
* value the type permits that `observation-conformance.ts` refuses. A lexicon
|
|
42
|
+
* could construct a value its own suite rejected.
|
|
43
|
+
*
|
|
44
|
+
* Keying a `Record` off the union makes the omission a compile error at the
|
|
45
|
+
* point of the omission. This is the construction #2365 applied to all four
|
|
46
|
+
* closed sets in `./behaviour.ts`; `BEHAVIOUR_UNPREDICTED_REASONS` derives from
|
|
47
|
+
* this very type, so that module was already protected against a change here
|
|
48
|
+
* while this module was not.
|
|
49
|
+
*/
|
|
50
|
+
const UNOBSERVED_REASON_WITNESS = {
|
|
51
|
+
"read-failed": true,
|
|
52
|
+
"no-credentials": true,
|
|
53
|
+
"no-binding": true,
|
|
54
|
+
"unsupported-kind": true,
|
|
55
|
+
filtered: true,
|
|
56
|
+
};
|
|
57
|
+
export const UNOBSERVED_REASONS = Object.keys(UNOBSERVED_REASON_WITNESS);
|
|
58
|
+
/** True when `value` is a legal {@link UnobservedReason}. */
|
|
59
|
+
export function isUnobservedReason(value) {
|
|
60
|
+
return typeof value === "string" && UNOBSERVED_REASONS.includes(value);
|
|
61
|
+
}
|
|
62
|
+
/** True when `value` is the versioned {@link ObservationResult} envelope. */
|
|
63
|
+
export function isObservationResult(value) {
|
|
64
|
+
return (typeof value === "object" &&
|
|
65
|
+
value !== null &&
|
|
66
|
+
value.observation === "v1");
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Build an {@link ObservationResult}. Lexicons use this rather than writing the
|
|
70
|
+
* discriminant by hand.
|
|
71
|
+
*/
|
|
72
|
+
export function observation(resources, unobserved, queried, notes, stackExports, sources) {
|
|
73
|
+
return {
|
|
74
|
+
observation: "v1",
|
|
75
|
+
resources,
|
|
76
|
+
...(unobserved && Object.keys(unobserved).length > 0 ? { unobserved } : {}),
|
|
77
|
+
...(queried && Object.keys(queried).length > 0 ? { queried } : {}),
|
|
78
|
+
...(sources && Object.keys(sources).length > 0 ? { sources } : {}),
|
|
79
|
+
...(notes && notes.length > 0 ? { notes } : {}),
|
|
80
|
+
...(stackExports && Object.keys(stackExports).length > 0 ? { stackExports } : {}),
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Normalize either accepted return shape. `undefined` (a lexicon that returned
|
|
85
|
+
* nothing at all) normalizes to two empty maps — which reads as "everything was
|
|
86
|
+
* observed absent", so callers that mean "the read failed" must say so with
|
|
87
|
+
* {@link unobservedAll} rather than returning nothing.
|
|
88
|
+
*/
|
|
89
|
+
export function normalizeObservation(value) {
|
|
90
|
+
if (!value)
|
|
91
|
+
return { resources: {}, unobserved: {}, queried: {}, sources: {}, notes: [] };
|
|
92
|
+
if (isObservationResult(value)) {
|
|
93
|
+
return {
|
|
94
|
+
resources: value.resources ?? {},
|
|
95
|
+
unobserved: value.unobserved ?? {},
|
|
96
|
+
queried: value.queried ?? {},
|
|
97
|
+
sources: value.sources ?? {},
|
|
98
|
+
notes: [...new Set(value.notes ?? [])],
|
|
99
|
+
...(value.stackExports && Object.keys(value.stackExports).length > 0 ? { stackExports: value.stackExports } : {}),
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
return { resources: value, unobserved: {}, queried: {}, sources: {}, notes: [] };
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Mark every named entity NOT-OBSERVED with one reason — the whole-lexicon
|
|
106
|
+
* failure case (the provider CLI is missing, the cluster binding refused, the
|
|
107
|
+
* credentials are gone). Core applies this when `describeResources()` throws,
|
|
108
|
+
* so a thrown read degrades to an honest "did not look" for each declared
|
|
109
|
+
* entity instead of an empty map that classifies as N creates.
|
|
110
|
+
*/
|
|
111
|
+
export function unobservedAll(names, reason, detail, types) {
|
|
112
|
+
const typeOf = (name) => {
|
|
113
|
+
if (!types)
|
|
114
|
+
return undefined;
|
|
115
|
+
if (types instanceof Map)
|
|
116
|
+
return types.get(name)?.entityType;
|
|
117
|
+
return types[name];
|
|
118
|
+
};
|
|
119
|
+
const out = {};
|
|
120
|
+
for (const name of names) {
|
|
121
|
+
const type = typeOf(name);
|
|
122
|
+
out[name] = { reason, ...(type ? { type } : {}), ...(detail ? { detail } : {}) };
|
|
123
|
+
}
|
|
124
|
+
return out;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Union several observations of the same lexicon (the multi-stack read, where
|
|
128
|
+
* `describeResources` runs once per stack). Precedence is
|
|
129
|
+
* present > not-observed > absent: a resource found in any stack is present; an
|
|
130
|
+
* entity nobody could look at stays not-observed; an entity every reader looked
|
|
131
|
+
* for and did not find is absent.
|
|
132
|
+
*/
|
|
133
|
+
export function mergeObservations(parts) {
|
|
134
|
+
const resources = {};
|
|
135
|
+
const unobserved = {};
|
|
136
|
+
const queried = {};
|
|
137
|
+
// Which read answered (#2267) merges the same way `queried` does: it is a
|
|
138
|
+
// fact about one entity's read, and the parts being merged are reads of
|
|
139
|
+
// disjoint entity sets (one per stack, or per terraform root).
|
|
140
|
+
const sources = {};
|
|
141
|
+
// A note is about the read, not a stack; four stacks saying the same thing
|
|
142
|
+
// is one note (#1265).
|
|
143
|
+
const notes = new Set();
|
|
144
|
+
const stackExports = {};
|
|
145
|
+
for (const part of parts) {
|
|
146
|
+
Object.assign(resources, part.resources);
|
|
147
|
+
Object.assign(unobserved, part.unobserved);
|
|
148
|
+
Object.assign(queried, part.queried);
|
|
149
|
+
Object.assign(sources, part.sources);
|
|
150
|
+
for (const n of part.notes)
|
|
151
|
+
notes.add(n);
|
|
152
|
+
Object.assign(stackExports, part.stackExports ?? {});
|
|
153
|
+
}
|
|
154
|
+
// Present wins: a stack that could not be read does not un-observe a resource
|
|
155
|
+
// another stack returned.
|
|
156
|
+
for (const name of Object.keys(resources))
|
|
157
|
+
delete unobserved[name];
|
|
158
|
+
return {
|
|
159
|
+
resources,
|
|
160
|
+
unobserved,
|
|
161
|
+
queried,
|
|
162
|
+
sources,
|
|
163
|
+
notes: [...notes],
|
|
164
|
+
...(Object.keys(stackExports).length > 0 ? { stackExports } : {}),
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
/** One-line human phrasing of a reason, for CLI output. */
|
|
168
|
+
export function unobservedReasonText(reason) {
|
|
169
|
+
switch (reason) {
|
|
170
|
+
case "read-failed":
|
|
171
|
+
return "read failed";
|
|
172
|
+
case "no-credentials":
|
|
173
|
+
return "no credentials";
|
|
174
|
+
case "no-binding":
|
|
175
|
+
return "no binding for this environment";
|
|
176
|
+
case "unsupported-kind":
|
|
177
|
+
return "no reader for this resource kind";
|
|
178
|
+
case "filtered":
|
|
179
|
+
return "withheld by the --owned filter";
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
/** `name — reason (detail) [queried address]`, the shared rendering for CLI and plan output. */
|
|
183
|
+
export function formatUnobserved(name, entry) {
|
|
184
|
+
const base = `${name}${entry.type ? ` (${entry.type})` : ""} — ${unobservedReasonText(entry.reason)}`;
|
|
185
|
+
const detailed = entry.detail ? `${base}: ${entry.detail}` : base;
|
|
186
|
+
return entry.queried ? `${detailed} [queried ${entry.queried}]` : detailed;
|
|
187
|
+
}
|
|
188
|
+
/** Default concurrency for {@link boundedConcurrently} when a transport ships no pool. */
|
|
189
|
+
export const DEFAULT_OBSERVE_CONCURRENCY = 16;
|
|
190
|
+
/**
|
|
191
|
+
* Run `fn` over `items` with at most `limit` in flight. A rejected `fn` rejects
|
|
192
|
+
* the whole run (the harness wraps per-entity reads so this stays for genuinely
|
|
193
|
+
* unexpected faults).
|
|
194
|
+
*/
|
|
195
|
+
export async function boundedConcurrently(items, fn, limit = DEFAULT_OBSERVE_CONCURRENCY) {
|
|
196
|
+
const queue = [...items];
|
|
197
|
+
const size = Math.max(1, Math.min(limit, queue.length || 1));
|
|
198
|
+
const workers = Array.from({ length: size }, async () => {
|
|
199
|
+
for (;;) {
|
|
200
|
+
const next = queue.shift();
|
|
201
|
+
if (next === undefined)
|
|
202
|
+
return;
|
|
203
|
+
await fn(next);
|
|
204
|
+
}
|
|
205
|
+
});
|
|
206
|
+
await Promise.all(workers);
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* The shared observer control flow (#1201). Binds via the adapter, reads every
|
|
210
|
+
* declared entity concurrently, and assembles the tri-state {@link ObservationResult}.
|
|
211
|
+
*
|
|
212
|
+
* A `bind()` throw becomes NOT-OBSERVED for every entity (typed by
|
|
213
|
+
* {@link ObserverAdapter.classifyBindFailure}) unless the adapter asks to
|
|
214
|
+
* rethrow. A per-entity `read()` throw the adapter did not itself map becomes
|
|
215
|
+
* `read-failed` for that one entity — never a silent absence, which would
|
|
216
|
+
* classify as a spurious `create`.
|
|
217
|
+
*/
|
|
218
|
+
export async function observeEntities(declared, adapter) {
|
|
219
|
+
const typesByName = {};
|
|
220
|
+
for (const d of declared)
|
|
221
|
+
typesByName[d.name] = d.type;
|
|
222
|
+
let client;
|
|
223
|
+
try {
|
|
224
|
+
client = await adapter.bind();
|
|
225
|
+
}
|
|
226
|
+
catch (err) {
|
|
227
|
+
const verdict = adapter.classifyBindFailure(err);
|
|
228
|
+
if (verdict === "rethrow")
|
|
229
|
+
throw err;
|
|
230
|
+
return observation({}, unobservedAll(declared.map((d) => d.name), verdict.reason, verdict.detail, typesByName));
|
|
231
|
+
}
|
|
232
|
+
const resources = {};
|
|
233
|
+
const unobserved = {};
|
|
234
|
+
const queried = {};
|
|
235
|
+
const run = adapter.concurrently ?? ((items, fn) => boundedConcurrently(items, fn));
|
|
236
|
+
await run(declared, async (entity) => {
|
|
237
|
+
let result;
|
|
238
|
+
try {
|
|
239
|
+
result = await adapter.read(client, entity);
|
|
240
|
+
}
|
|
241
|
+
catch (err) {
|
|
242
|
+
result = {
|
|
243
|
+
unobserved: {
|
|
244
|
+
reason: "read-failed",
|
|
245
|
+
detail: err instanceof Error ? err.message : String(err),
|
|
246
|
+
},
|
|
247
|
+
};
|
|
248
|
+
}
|
|
249
|
+
if (result.queried)
|
|
250
|
+
queried[entity.name] = result.queried;
|
|
251
|
+
if ("present" in result) {
|
|
252
|
+
resources[entity.name] = result.present;
|
|
253
|
+
}
|
|
254
|
+
else if ("unobserved" in result) {
|
|
255
|
+
unobserved[entity.name] = {
|
|
256
|
+
type: entity.type,
|
|
257
|
+
...result.unobserved,
|
|
258
|
+
...(result.queried ? { queried: result.queried } : {}),
|
|
259
|
+
};
|
|
260
|
+
}
|
|
261
|
+
// `absent`: the verdict records nothing — in neither map is how the
|
|
262
|
+
// contract spells absence — but its address, when the adapter supplied
|
|
263
|
+
// one, lands in `queried` (#1620) so the absence can explain itself.
|
|
264
|
+
});
|
|
265
|
+
return observation(resources, unobserved, queried);
|
|
266
|
+
}
|
package/dist/okf-read.js
ADDED
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import { readdir, readFile } from "node:fs/promises";
|
|
2
|
+
import { existsSync } from "node:fs";
|
|
3
|
+
import { join, relative, sep } from "node:path";
|
|
4
|
+
import { splitFrontmatter } from "./okf.js";
|
|
5
|
+
import { parseYAML } from "./yaml.js";
|
|
6
|
+
/**
|
|
7
|
+
* OKF bundle reader (#1864, design #1059, epic #1057) — the input half of
|
|
8
|
+
* `./okf.ts`'s emitter: loads a project-authored knowledge bundle from disk
|
|
9
|
+
* and binds its concepts to discovered entities.
|
|
10
|
+
*
|
|
11
|
+
* Tolerant to the letter of the OKF v0.2 spec (§11), the same posture
|
|
12
|
+
* `okfConformanceProblems` enforces on the emit side: unknown `type` values
|
|
13
|
+
* and extra frontmatter keys pass through untouched, a file with unparseable
|
|
14
|
+
* or missing frontmatter is skipped with a warning, and nothing here ever
|
|
15
|
+
* rejects the bundle — a missing knowledge directory included.
|
|
16
|
+
*/
|
|
17
|
+
const RESERVED_OKF_FILES = new Set(["index.md", "log.md"]);
|
|
18
|
+
/** `binds` accepts one name or a list (#1059); anything else is treated as "no binding" rather than rejecting the concept. */
|
|
19
|
+
function normalizeBinds(value) {
|
|
20
|
+
if (typeof value === "string")
|
|
21
|
+
return value.length > 0 ? [value] : [];
|
|
22
|
+
if (Array.isArray(value))
|
|
23
|
+
return value.filter((v) => typeof v === "string" && v.length > 0);
|
|
24
|
+
return [];
|
|
25
|
+
}
|
|
26
|
+
/** Recursively collect every `.md` file under `dir`, as bundle-relative (forward-slash) paths paired with their absolute path. */
|
|
27
|
+
async function findMarkdownFiles(dir) {
|
|
28
|
+
const found = [];
|
|
29
|
+
async function scan(current) {
|
|
30
|
+
let entries;
|
|
31
|
+
try {
|
|
32
|
+
entries = await readdir(current, { withFileTypes: true });
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
return; // unreadable directory: silently skip, same posture as findInfraFiles
|
|
36
|
+
}
|
|
37
|
+
for (const entry of entries) {
|
|
38
|
+
const fullPath = join(current, entry.name);
|
|
39
|
+
if (entry.isDirectory()) {
|
|
40
|
+
await scan(fullPath);
|
|
41
|
+
}
|
|
42
|
+
else if (entry.isFile() && entry.name.endsWith(".md")) {
|
|
43
|
+
const relPath = relative(dir, fullPath).split(sep).join("/");
|
|
44
|
+
found.push({ relPath, fullPath });
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
await scan(dir);
|
|
49
|
+
return found;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Load every authored concept from an OKF knowledge bundle directory.
|
|
53
|
+
* `index.md`/`log.md` are skipped (reserved, by basename, at any depth —
|
|
54
|
+
* matching `okfConformanceProblems`'s check on the emit side). A directory
|
|
55
|
+
* that does not exist yields an empty bundle, not an error: the #1059 design
|
|
56
|
+
* treats a missing `knowledge/` as "this project has none yet," the same
|
|
57
|
+
* posture as a project with no lexicons configured.
|
|
58
|
+
*
|
|
59
|
+
* A file that fails to parse — no frontmatter block, unparseable YAML, or
|
|
60
|
+
* frontmatter that isn't a mapping — is skipped with a `console.warn` and
|
|
61
|
+
* does not affect any other file. Nothing here throws.
|
|
62
|
+
*/
|
|
63
|
+
export async function loadOkfBundle(dir) {
|
|
64
|
+
if (!existsSync(dir))
|
|
65
|
+
return { concepts: [] };
|
|
66
|
+
const concepts = [];
|
|
67
|
+
for (const { relPath, fullPath } of await findMarkdownFiles(dir)) {
|
|
68
|
+
if (RESERVED_OKF_FILES.has(relPath.split("/").pop()))
|
|
69
|
+
continue;
|
|
70
|
+
let content;
|
|
71
|
+
try {
|
|
72
|
+
content = await readFile(fullPath, "utf8");
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
console.warn(`[chant] warning: knowledge bundle concept "${relPath}" could not be read, skipping`);
|
|
76
|
+
continue;
|
|
77
|
+
}
|
|
78
|
+
const split = splitFrontmatter(content);
|
|
79
|
+
if (!split) {
|
|
80
|
+
console.warn(`[chant] warning: knowledge bundle concept "${relPath}" has no frontmatter block, skipping`);
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
let parsed;
|
|
84
|
+
try {
|
|
85
|
+
parsed = parseYAML(split.frontmatter);
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
console.warn(`[chant] warning: knowledge bundle concept "${relPath}" has unparseable frontmatter, skipping`);
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) {
|
|
92
|
+
console.warn(`[chant] warning: knowledge bundle concept "${relPath}" frontmatter is not a mapping, skipping`);
|
|
93
|
+
continue;
|
|
94
|
+
}
|
|
95
|
+
const frontmatter = parsed;
|
|
96
|
+
concepts.push({
|
|
97
|
+
path: relPath,
|
|
98
|
+
type: typeof frontmatter.type === "string" ? frontmatter.type : "",
|
|
99
|
+
title: typeof frontmatter.title === "string" ? frontmatter.title : undefined,
|
|
100
|
+
binds: normalizeBinds(frontmatter.binds),
|
|
101
|
+
frontmatter,
|
|
102
|
+
body: split.body,
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
concepts.sort((a, b) => a.path.localeCompare(b.path));
|
|
106
|
+
return { concepts };
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Resolve every concept's `binds` against a project's discovered entities.
|
|
110
|
+
* `entities` is the same shape `./okf.ts`'s emitter takes, `DiscoveryResult`'s
|
|
111
|
+
* own `entities` map — a bare logical name is unambiguous within one
|
|
112
|
+
* discovery pass (#1059's "Rejected options" on binding ambiguity).
|
|
113
|
+
*
|
|
114
|
+
* A concept with no `binds` contributes to neither `bound` nor `unresolved`;
|
|
115
|
+
* an unbound concept is legitimate, not an omission (a runbook, a decision
|
|
116
|
+
* about the project as a whole).
|
|
117
|
+
*/
|
|
118
|
+
export function bindConcepts(bundle, entities) {
|
|
119
|
+
const bound = new Map();
|
|
120
|
+
const unresolved = [];
|
|
121
|
+
for (const concept of bundle.concepts) {
|
|
122
|
+
for (const name of concept.binds) {
|
|
123
|
+
if (entities.has(name)) {
|
|
124
|
+
if (!bound.has(name))
|
|
125
|
+
bound.set(name, []);
|
|
126
|
+
bound.get(name).push(concept);
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
unresolved.push({ concept, name });
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
return { bound, unresolved };
|
|
134
|
+
}
|
package/dist/okf.js
ADDED
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
import { relative, isAbsolute } from "node:path";
|
|
2
|
+
import { buildGraphIr } from "./graph-ir.js";
|
|
3
|
+
import { isLexiconOutput } from "./lexicon-output.js";
|
|
4
|
+
import { getProvenance } from "./provenance.js";
|
|
5
|
+
import { emitYAML, parseYAML } from "./yaml.js";
|
|
6
|
+
/**
|
|
7
|
+
* OKF bundle emitter (#1058, epic #1057) — projects a discovered entity graph
|
|
8
|
+
* into an Open Knowledge Format v0.2 bundle: a directory of markdown files
|
|
9
|
+
* with YAML frontmatter, per the spec at
|
|
10
|
+
* https://github.com/GoogleCloudPlatform/knowledge-catalog/blob/main/okf/SPEC.md
|
|
11
|
+
*
|
|
12
|
+
* One concept document per entity, `type` carrying the entity's resource type
|
|
13
|
+
* string, dependency edges as bundle-relative markdown links (the form the
|
|
14
|
+
* spec recommends for stability), and a root `index.md` grouping concepts into
|
|
15
|
+
* per-lexicon sections. Emit-only: OKF as project *input* is #1059.
|
|
16
|
+
*/
|
|
17
|
+
export const OKF_VERSION = "0.2";
|
|
18
|
+
/** Make an entity or lexicon name safe as a single path segment. */
|
|
19
|
+
export function slug(name) {
|
|
20
|
+
const cleaned = name.replace(/[^A-Za-z0-9._-]/g, "-").replace(/^\.+/, "");
|
|
21
|
+
return cleaned === "" ? "unnamed" : cleaned;
|
|
22
|
+
}
|
|
23
|
+
function relFile(file, projectPath) {
|
|
24
|
+
if (!file)
|
|
25
|
+
return undefined;
|
|
26
|
+
if (projectPath && isAbsolute(file)) {
|
|
27
|
+
const rel = relative(projectPath, file);
|
|
28
|
+
return rel.startsWith("..") ? file : rel;
|
|
29
|
+
}
|
|
30
|
+
return file;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Render a flat frontmatter mapping as a YAML block. Keys with undefined
|
|
34
|
+
* values are dropped; scalar quoting is `emitYAML`'s.
|
|
35
|
+
*/
|
|
36
|
+
export function frontmatter(fields) {
|
|
37
|
+
const lines = ["---"];
|
|
38
|
+
for (const [key, value] of Object.entries(fields)) {
|
|
39
|
+
if (value === undefined)
|
|
40
|
+
continue;
|
|
41
|
+
lines.push(`${key}: ${emitYAML(value, 0)}`);
|
|
42
|
+
}
|
|
43
|
+
lines.push("---");
|
|
44
|
+
return lines.join("\n");
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Split a concept document into its frontmatter block and body. Returns
|
|
48
|
+
* undefined when the document does not start with a `---` delimited block.
|
|
49
|
+
* Exported for the conformance tests (and any future OKF consumer, #1059).
|
|
50
|
+
*/
|
|
51
|
+
export function splitFrontmatter(content) {
|
|
52
|
+
const lines = content.split("\n");
|
|
53
|
+
if (lines[0] !== "---")
|
|
54
|
+
return undefined;
|
|
55
|
+
const end = lines.indexOf("---", 1);
|
|
56
|
+
if (end === -1)
|
|
57
|
+
return undefined;
|
|
58
|
+
return {
|
|
59
|
+
frontmatter: lines.slice(1, end).join("\n"),
|
|
60
|
+
body: lines.slice(end + 1).join("\n"),
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Check a bundle against the OKF v0.2 conformance criteria (spec §11) and
|
|
65
|
+
* return every violation found: parseable frontmatter on every non-reserved
|
|
66
|
+
* `.md`, a non-empty `type` everywhere, a well-formed root `index.md`, and
|
|
67
|
+
* generated cross-link entries that are bundle-absolute (or external URLs).
|
|
68
|
+
* Empty result means conformant. Shared by the project-bundle tests (#1058)
|
|
69
|
+
* and every lexicon's bundle tests (#1060).
|
|
70
|
+
*/
|
|
71
|
+
export function okfConformanceProblems(files) {
|
|
72
|
+
const problems = [];
|
|
73
|
+
const reserved = new Set(["index.md", "log.md"]);
|
|
74
|
+
const linkTarget = /\]\(([^)]+)\)/g;
|
|
75
|
+
const externalOrAbsolute = (target) => target.startsWith("/") || /^[a-z][a-z0-9+.-]*:/i.test(target);
|
|
76
|
+
for (const file of files) {
|
|
77
|
+
if (!file.path.endsWith(".md"))
|
|
78
|
+
problems.push(`${file.path}: not a markdown file`);
|
|
79
|
+
if (file.path.startsWith("/") || file.path.includes("..")) {
|
|
80
|
+
problems.push(`${file.path}: path is not bundle-relative`);
|
|
81
|
+
}
|
|
82
|
+
if (reserved.has(file.path.split("/").pop()))
|
|
83
|
+
continue;
|
|
84
|
+
const split = splitFrontmatter(file.content);
|
|
85
|
+
if (!split) {
|
|
86
|
+
problems.push(`${file.path}: no frontmatter block`);
|
|
87
|
+
continue;
|
|
88
|
+
}
|
|
89
|
+
let parsed;
|
|
90
|
+
try {
|
|
91
|
+
parsed = parseYAML(split.frontmatter);
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
problems.push(`${file.path}: unparseable frontmatter`);
|
|
95
|
+
continue;
|
|
96
|
+
}
|
|
97
|
+
if (typeof parsed !== "object" || parsed === null) {
|
|
98
|
+
problems.push(`${file.path}: frontmatter is not a mapping`);
|
|
99
|
+
continue;
|
|
100
|
+
}
|
|
101
|
+
const type = parsed.type;
|
|
102
|
+
if (typeof type !== "string" || type.length === 0) {
|
|
103
|
+
problems.push(`${file.path}: frontmatter has no non-empty type`);
|
|
104
|
+
}
|
|
105
|
+
// Cross-link entries (the "- [name](target)" lines the emitters generate)
|
|
106
|
+
// must point inside the bundle or at an external URL. Broken targets are
|
|
107
|
+
// permitted (not-yet-written knowledge); malformed ones are not. Free-text
|
|
108
|
+
// knowledge bodies may carry arbitrary links and are not checked.
|
|
109
|
+
for (const line of split.body.split("\n")) {
|
|
110
|
+
if (!line.trimStart().startsWith("- ["))
|
|
111
|
+
continue;
|
|
112
|
+
for (const match of line.matchAll(linkTarget)) {
|
|
113
|
+
if (!externalOrAbsolute(match[1])) {
|
|
114
|
+
problems.push(`${file.path}: link target "${match[1]}" is neither bundle-absolute nor external`);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
const index = files.find((f) => f.path === "index.md");
|
|
120
|
+
if (!index) {
|
|
121
|
+
problems.push("bundle has no root index.md");
|
|
122
|
+
return problems;
|
|
123
|
+
}
|
|
124
|
+
const split = splitFrontmatter(index.content);
|
|
125
|
+
if (!split) {
|
|
126
|
+
problems.push("index.md: no frontmatter block");
|
|
127
|
+
return problems;
|
|
128
|
+
}
|
|
129
|
+
const parsed = parseYAML(split.frontmatter);
|
|
130
|
+
for (const key of Object.keys(parsed ?? {})) {
|
|
131
|
+
if (key !== "okf_version")
|
|
132
|
+
problems.push(`index.md: frontmatter carries "${key}" — okf_version is the only key an index is allowed`);
|
|
133
|
+
}
|
|
134
|
+
for (const line of split.body.split("\n")) {
|
|
135
|
+
if (line.startsWith("*") && !/^\* \[[^\]]+\]\([^)]+\) - .+$/.test(line)) {
|
|
136
|
+
problems.push(`index.md: malformed entry line: ${line}`);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
return problems;
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* The `type`/`lexicon`/`kind` a concept carries. Most entities state all
|
|
143
|
+
* three; a `LexiconOutput` (an `output(...)` bridge) carries none of them
|
|
144
|
+
* directly, so its facts come from its producing side — `type` must be
|
|
145
|
+
* non-empty for the bundle to conform, never blank.
|
|
146
|
+
*/
|
|
147
|
+
function conceptFacts(entity) {
|
|
148
|
+
if (isLexiconOutput(entity)) {
|
|
149
|
+
const out = entity;
|
|
150
|
+
return { type: "Output", lexicon: out.sourceLexicon || "unknown", kind: "output" };
|
|
151
|
+
}
|
|
152
|
+
return {
|
|
153
|
+
type: entity.entityType || "Entity",
|
|
154
|
+
lexicon: entity.lexicon || "unknown",
|
|
155
|
+
kind: entity.kind ?? "resource",
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Build the OKF bundle for a discovered graph. Pure and deterministic: the
|
|
160
|
+
* same entities yield byte-identical files, so bundles are diffable and
|
|
161
|
+
* snapshot-testable. `projectPath` relativizes source-file paths so the
|
|
162
|
+
* bundle is portable.
|
|
163
|
+
*/
|
|
164
|
+
export function buildOkfBundle(input, projectPath) {
|
|
165
|
+
// Assign each entity a stable concept path: <lexicon>/<name>.md, deduped
|
|
166
|
+
// when slugging collides two distinct names.
|
|
167
|
+
const concepts = new Map();
|
|
168
|
+
const takenPaths = new Set();
|
|
169
|
+
const names = [...input.entities.keys()].sort((a, b) => a.localeCompare(b));
|
|
170
|
+
for (const name of names) {
|
|
171
|
+
const entity = input.entities.get(name);
|
|
172
|
+
const facts = conceptFacts(entity);
|
|
173
|
+
const base = `${slug(facts.lexicon)}/${slug(name)}`;
|
|
174
|
+
let path = `${base}.md`;
|
|
175
|
+
for (let n = 2; takenPaths.has(path); n++)
|
|
176
|
+
path = `${base}-${n}.md`;
|
|
177
|
+
takenPaths.add(path);
|
|
178
|
+
concepts.set(name, { name, entity, path, ...facts });
|
|
179
|
+
}
|
|
180
|
+
// Dependency edges: the graph IR's AttrRef/Ref-derived edges (the same
|
|
181
|
+
// derivation `chant graph --format ir` ships) unioned with discovery's
|
|
182
|
+
// declared dependency map — the map alone misses references that live only
|
|
183
|
+
// in attribute values.
|
|
184
|
+
const dependsOn = new Map();
|
|
185
|
+
const addEdge = (from, to) => {
|
|
186
|
+
if (!dependsOn.has(from))
|
|
187
|
+
dependsOn.set(from, new Set());
|
|
188
|
+
dependsOn.get(from).add(to);
|
|
189
|
+
};
|
|
190
|
+
for (const edge of buildGraphIr(input.entities, projectPath).edges)
|
|
191
|
+
addEdge(edge.from, edge.to);
|
|
192
|
+
for (const [from, deps] of input.dependencies)
|
|
193
|
+
for (const to of deps)
|
|
194
|
+
addEdge(from, to);
|
|
195
|
+
// Reverse edges: who references each entity.
|
|
196
|
+
const referencedBy = new Map();
|
|
197
|
+
for (const [from, deps] of dependsOn) {
|
|
198
|
+
for (const to of deps) {
|
|
199
|
+
if (!referencedBy.has(to))
|
|
200
|
+
referencedBy.set(to, []);
|
|
201
|
+
referencedBy.get(to).push(from);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
const files = [];
|
|
205
|
+
for (const name of names) {
|
|
206
|
+
const concept = concepts.get(name);
|
|
207
|
+
const { entity } = concept;
|
|
208
|
+
const prov = getProvenance(entity);
|
|
209
|
+
const source = relFile(prov?.sourceFile, projectPath);
|
|
210
|
+
const head = frontmatter({
|
|
211
|
+
type: concept.type,
|
|
212
|
+
title: name,
|
|
213
|
+
description: `${concept.lexicon} ${concept.kind} of type ${concept.type}`,
|
|
214
|
+
name,
|
|
215
|
+
lexicon: concept.lexicon,
|
|
216
|
+
kind: concept.kind,
|
|
217
|
+
source,
|
|
218
|
+
composite: prov?.composite,
|
|
219
|
+
composite_instance: prov?.compositeInstance,
|
|
220
|
+
});
|
|
221
|
+
const body = [""];
|
|
222
|
+
body.push(source ? `Declared in \`${source}\`.` : `Declared by the ${concept.lexicon} lexicon.`);
|
|
223
|
+
// Cross-resource references become bundle-relative links. A dependency
|
|
224
|
+
// whose target is not in the bundle still emits a link — the spec permits
|
|
225
|
+
// broken links (not-yet-written knowledge), so unresolved never fails.
|
|
226
|
+
const deps = [...(dependsOn.get(name) ?? [])].sort((a, b) => a.localeCompare(b));
|
|
227
|
+
if (deps.length > 0) {
|
|
228
|
+
body.push("", "## Depends on", "");
|
|
229
|
+
for (const dep of deps) {
|
|
230
|
+
const target = concepts.get(dep)?.path ?? `${slug(dep)}.md`;
|
|
231
|
+
body.push(`- [${dep}](/${target})`);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
const consumers = (referencedBy.get(name) ?? []).sort((a, b) => a.localeCompare(b));
|
|
235
|
+
if (consumers.length > 0) {
|
|
236
|
+
body.push("", "## Referenced by", "");
|
|
237
|
+
for (const consumer of consumers) {
|
|
238
|
+
const target = concepts.get(consumer)?.path ?? `${slug(consumer)}.md`;
|
|
239
|
+
body.push(`- [${consumer}](/${target})`);
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
body.push("");
|
|
243
|
+
files.push({ path: concept.path, content: head + body.join("\n") });
|
|
244
|
+
}
|
|
245
|
+
files.push({ path: "index.md", content: buildIndex(concepts, names) });
|
|
246
|
+
files.sort((a, b) => a.path.localeCompare(b.path));
|
|
247
|
+
return files;
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* The bundle-root `index.md` (spec §8): one section per lexicon, each entry a
|
|
251
|
+
* bundle-relative link plus the concept's description — the spec's
|
|
252
|
+
* progressive-disclosure mechanism. Root indexes may carry `okf_version`
|
|
253
|
+
* frontmatter (spec §12), the only frontmatter an index is allowed.
|
|
254
|
+
*/
|
|
255
|
+
function buildIndex(concepts, names) {
|
|
256
|
+
const byLexicon = new Map();
|
|
257
|
+
for (const name of names) {
|
|
258
|
+
const concept = concepts.get(name);
|
|
259
|
+
if (!byLexicon.has(concept.lexicon))
|
|
260
|
+
byLexicon.set(concept.lexicon, []);
|
|
261
|
+
byLexicon.get(concept.lexicon).push(concept);
|
|
262
|
+
}
|
|
263
|
+
const lines = ["---", `okf_version: '${OKF_VERSION}'`, "---", ""];
|
|
264
|
+
const lexicons = [...byLexicon.keys()].sort((a, b) => a.localeCompare(b));
|
|
265
|
+
for (const lexicon of lexicons) {
|
|
266
|
+
lines.push(`# Lexicon: ${lexicon}`, "");
|
|
267
|
+
for (const concept of byLexicon.get(lexicon)) {
|
|
268
|
+
lines.push(`* [${concept.name}](/${concept.path}) - ${lexicon} ${concept.kind} of type ${concept.type}`);
|
|
269
|
+
}
|
|
270
|
+
lines.push("");
|
|
271
|
+
}
|
|
272
|
+
if (lexicons.length === 0)
|
|
273
|
+
lines.push("No entities discovered.", "");
|
|
274
|
+
return lines.join("\n");
|
|
275
|
+
}
|