@intentius/chant 0.57.0 → 0.59.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/audit/catalog.d.ts +51 -1
- package/dist/audit/catalog.d.ts.map +1 -1
- package/dist/audit/core.d.ts +36 -1
- package/dist/audit/core.d.ts.map +1 -1
- package/dist/audit/discover.d.ts +26 -9
- package/dist/audit/discover.d.ts.map +1 -1
- package/dist/audit/lineage.d.ts +10 -0
- package/dist/audit/lineage.d.ts.map +1 -0
- package/dist/audit/prior-art.d.ts +385 -0
- package/dist/audit/prior-art.d.ts.map +1 -0
- package/dist/audit/proof.d.ts +16 -0
- package/dist/audit/proof.d.ts.map +1 -1
- package/dist/audit/report-html.d.ts.map +1 -1
- package/dist/audit/report-model.d.ts +8 -1
- package/dist/audit/report-model.d.ts.map +1 -1
- package/dist/audit/report.d.ts.map +1 -1
- package/dist/audit/rules-doc.d.ts +3 -0
- package/dist/audit/rules-doc.d.ts.map +1 -1
- package/dist/audit/secrets.d.ts +15 -0
- package/dist/audit/secrets.d.ts.map +1 -1
- package/dist/audit/terraform-state.d.ts +46 -0
- package/dist/audit/terraform-state.d.ts.map +1 -0
- package/dist/build.d.ts +17 -1
- package/dist/build.d.ts.map +1 -1
- package/dist/claimed-fields.d.ts +161 -0
- package/dist/claimed-fields.d.ts.map +1 -0
- package/dist/cli/build-params-cli.d.ts +2 -2
- package/dist/cli/command-group.d.ts +14 -0
- package/dist/cli/command-group.d.ts.map +1 -1
- package/dist/cli/commands/audit.d.ts +17 -1
- package/dist/cli/commands/audit.d.ts.map +1 -1
- package/dist/cli/commands/build.d.ts.map +1 -1
- package/dist/cli/commands/carve-bridge.d.ts.map +1 -1
- package/dist/cli/commands/check-lexicon-docs.d.ts +1 -1
- package/dist/cli/commands/check-lexicon-examples.d.ts +16 -6
- package/dist/cli/commands/check-lexicon-examples.d.ts.map +1 -1
- package/dist/cli/commands/init-lexicon/templates/codegen.d.ts +1 -0
- package/dist/cli/commands/init-lexicon/templates/codegen.d.ts.map +1 -1
- package/dist/cli/commands/init-lexicon/templates/project.d.ts +7 -0
- package/dist/cli/commands/init-lexicon/templates/project.d.ts.map +1 -1
- package/dist/cli/commands/init-lexicon.d.ts.map +1 -1
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/lint.d.ts +13 -0
- package/dist/cli/commands/lint.d.ts.map +1 -1
- package/dist/cli/commands/onboard.d.ts +2 -0
- package/dist/cli/commands/onboard.d.ts.map +1 -1
- package/dist/cli/handlers/build.d.ts.map +1 -1
- package/dist/cli/handlers/lifecycle.d.ts.map +1 -1
- package/dist/cli/handlers/operator.d.ts +82 -16
- package/dist/cli/handlers/operator.d.ts.map +1 -1
- package/dist/cli/handlers/run.d.ts +49 -42
- package/dist/cli/handlers/run.d.ts.map +1 -1
- package/dist/cli/main.d.ts +12 -1
- package/dist/cli/main.d.ts.map +1 -1
- package/dist/cli/mcp/op-tools.d.ts +16 -1
- package/dist/cli/mcp/op-tools.d.ts.map +1 -1
- package/dist/cli/mcp/resource-handlers.d.ts.map +1 -1
- package/dist/cli/mcp/resources/context.d.ts.map +1 -1
- package/dist/cli/plugins.d.ts +22 -0
- package/dist/cli/plugins.d.ts.map +1 -1
- package/dist/cli/registry.d.ts +40 -9
- package/dist/cli/registry.d.ts.map +1 -1
- package/dist/codegen/generate-post-synth-barrel.d.ts +1 -1
- package/dist/components/auto-release.d.ts +10 -20
- package/dist/components/auto-release.d.ts.map +1 -1
- package/dist/components/capability.d.ts +4 -4
- package/dist/components/cli-support.d.ts +24 -22
- package/dist/components/cli-support.d.ts.map +1 -1
- package/dist/components/component.d.ts +21 -6
- package/dist/components/component.d.ts.map +1 -1
- package/dist/components/driver-output.d.ts.map +1 -1
- package/dist/components/driver.d.ts +73 -37
- package/dist/components/driver.d.ts.map +1 -1
- package/dist/components/index.d.ts +1 -2
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/manifest-persistence.d.ts +1 -9
- package/dist/components/manifest-persistence.d.ts.map +1 -1
- package/dist/components/run-progress.d.ts +6 -6
- package/dist/components/run-progress.d.ts.map +1 -1
- package/dist/components/verbs/run-agent.d.ts +10 -22
- package/dist/components/verbs/run-agent.d.ts.map +1 -1
- package/dist/components/verbs/verify.d.ts +2 -2
- package/dist/deep-observation.d.ts +17 -0
- package/dist/deep-observation.d.ts.map +1 -1
- package/dist/detectLexicon.d.ts +13 -0
- package/dist/detectLexicon.d.ts.map +1 -1
- package/dist/discovery/files.d.ts +4 -4
- package/dist/discovery/fold-import.d.ts.map +1 -1
- package/dist/discovery/param-deps.d.ts +33 -0
- package/dist/discovery/param-deps.d.ts.map +1 -1
- package/dist/discovery/sandbox/bundle.d.ts.map +1 -1
- package/dist/discovery/sandbox/config-wire.d.ts +2 -2
- package/dist/fold/foldable-helpers.d.ts +5 -1
- package/dist/fold/foldable-helpers.d.ts.map +1 -1
- package/dist/fold-provenance.d.ts +236 -0
- package/dist/fold-provenance.d.ts.map +1 -0
- package/dist/graph-ops.d.ts +1 -1
- package/dist/held-elsewhere.d.ts +85 -0
- package/dist/held-elsewhere.d.ts.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/kubectl-context.d.ts +3 -3
- package/dist/lexicon-config.d.ts +4 -4
- package/dist/lexicon-plugin-helpers.d.ts +1 -1
- package/dist/lexicon.d.ts +273 -16
- package/dist/lexicon.d.ts.map +1 -1
- package/dist/lifecycle/change-set.d.ts +13 -0
- package/dist/lifecycle/change-set.d.ts.map +1 -1
- package/dist/lifecycle/deep-diff.d.ts +133 -6
- package/dist/lifecycle/deep-diff.d.ts.map +1 -1
- package/dist/lifecycle/deep-observe.d.ts.map +1 -1
- package/dist/lifecycle/gate-ledger.d.ts +79 -3
- package/dist/lifecycle/gate-ledger.d.ts.map +1 -1
- package/dist/lifecycle/index.d.ts +1 -0
- package/dist/lifecycle/index.d.ts.map +1 -1
- package/dist/lifecycle/release-ledger.d.ts +2 -2
- package/dist/lifecycle/run-ledger.d.ts +53 -0
- package/dist/lifecycle/run-ledger.d.ts.map +1 -0
- package/dist/lifecycle/symptoms.d.ts +3 -3
- package/dist/lifecycle/symptoms.d.ts.map +1 -1
- package/dist/lint/config.d.ts +81 -2
- package/dist/lint/config.d.ts.map +1 -1
- package/dist/lint/post-synth.d.ts +55 -2
- package/dist/lint/post-synth.d.ts.map +1 -1
- package/dist/lint/rules/__fixtures__/comp/comp004/pass/neo4j-cluster.component.d.ts +1 -1
- package/dist/lint/rules/__fixtures__/comp/comp004/pass/neo4j-cluster.component.d.ts.map +1 -1
- package/dist/lint/rules/__fixtures__/comp/comp004/pass/orders-table.component.d.ts +1 -1
- package/dist/lint/rules/__fixtures__/comp/comp004/pass/orders-table.component.d.ts.map +1 -1
- package/dist/lint/rules/comp/comp004-gate-needs-durable-runtime.d.ts +44 -0
- package/dist/lint/rules/comp/comp004-gate-needs-durable-runtime.d.ts.map +1 -0
- package/dist/lint/rules/comp/index.d.ts +1 -1
- package/dist/lint/rules/comp/index.d.ts.map +1 -1
- package/dist/lint/rules/op/index.d.ts +16 -0
- package/dist/lint/rules/op/index.d.ts.map +1 -0
- package/dist/lint/rules/op/ops012-activity-contract.d.ts +27 -0
- package/dist/lint/rules/op/ops012-activity-contract.d.ts.map +1 -0
- package/dist/lint/rules/op/ops013-step-output-ref.d.ts +61 -0
- package/dist/lint/rules/op/ops013-step-output-ref.d.ts.map +1 -0
- package/dist/lint/rules/op/ops014-converge-rule-refusals.d.ts +55 -0
- package/dist/lint/rules/op/ops014-converge-rule-refusals.d.ts.map +1 -0
- package/dist/lint/rules/op/support.d.ts +12 -0
- package/dist/lint/rules/op/support.d.ts.map +1 -0
- package/dist/lint/suppressions.d.ts +108 -0
- package/dist/lint/suppressions.d.ts.map +1 -0
- package/dist/live-endpoint.d.ts +1 -1
- package/dist/op/activities/activity-contracts.d.ts +54 -0
- package/dist/op/activities/activity-contracts.d.ts.map +1 -0
- package/dist/op/activities/apply.d.ts +262 -0
- package/dist/op/activities/apply.d.ts.map +1 -0
- package/dist/op/activities/build.d.ts +13 -0
- package/dist/op/activities/build.d.ts.map +1 -0
- package/dist/op/activities/converge.d.ts +110 -0
- package/dist/op/activities/converge.d.ts.map +1 -0
- package/dist/op/activities/env-teardown.d.ts +76 -0
- package/dist/op/activities/env-teardown.d.ts.map +1 -0
- package/dist/op/activities/guard-validate.d.ts +64 -0
- package/dist/op/activities/guard-validate.d.ts.map +1 -0
- package/dist/op/activities/http-check.d.ts +34 -0
- package/dist/op/activities/http-check.d.ts.map +1 -0
- package/dist/op/activities/index.d.ts +31 -0
- package/dist/op/activities/index.d.ts.map +1 -0
- package/dist/op/activities/lexicon-upgrade.d.ts +182 -0
- package/dist/op/activities/lexicon-upgrade.d.ts.map +1 -0
- package/dist/op/activities/lifecycle.d.ts +42 -0
- package/dist/op/activities/lifecycle.d.ts.map +1 -0
- package/dist/op/activities/pipeline-audit.d.ts +84 -0
- package/dist/op/activities/pipeline-audit.d.ts.map +1 -0
- package/dist/op/activities/policy.d.ts +17 -0
- package/dist/op/activities/policy.d.ts.map +1 -0
- package/dist/op/activities/reconcile.d.ts +149 -0
- package/dist/op/activities/reconcile.d.ts.map +1 -0
- package/dist/op/activities/shell.d.ts +13 -0
- package/dist/op/activities/shell.d.ts.map +1 -0
- package/dist/op/activities/teardown.d.ts +10 -0
- package/dist/op/activities/teardown.d.ts.map +1 -0
- package/dist/op/activities/util.d.ts +7 -0
- package/dist/op/activities/util.d.ts.map +1 -0
- package/dist/op/activities/wait.d.ts +28 -0
- package/dist/op/activities/wait.d.ts.map +1 -0
- package/dist/op/activities/workflow-audit.d.ts +92 -0
- package/dist/op/activities/workflow-audit.d.ts.map +1 -0
- package/dist/op/activity-contract-registry.d.ts +76 -0
- package/dist/op/activity-contract-registry.d.ts.map +1 -0
- package/dist/op/activity-contract.d.ts +25 -18
- package/dist/op/activity-contract.d.ts.map +1 -1
- package/dist/op/activity-failure.d.ts +28 -0
- package/dist/op/activity-failure.d.ts.map +1 -0
- package/dist/op/activity-profiles.d.ts +118 -0
- package/dist/op/activity-profiles.d.ts.map +1 -0
- package/dist/op/activity-registry.d.ts +22 -38
- package/dist/op/activity-registry.d.ts.map +1 -1
- package/dist/op/activity-runtime.d.ts +3 -14
- package/dist/op/activity-runtime.d.ts.map +1 -1
- package/dist/op/builders.d.ts +85 -30
- package/dist/op/builders.d.ts.map +1 -1
- package/dist/op/change-signal.d.ts +91 -0
- package/dist/op/change-signal.d.ts.map +1 -0
- package/dist/op/composites/apply-op.d.ts +118 -0
- package/dist/op/composites/apply-op.d.ts.map +1 -0
- package/dist/op/composites/converge-op.d.ts +120 -0
- package/dist/op/composites/converge-op.d.ts.map +1 -0
- package/dist/op/composites/index.d.ts +26 -0
- package/dist/op/composites/index.d.ts.map +1 -0
- package/dist/op/composites/lexicon-upgrade-op.d.ts +78 -0
- package/dist/op/composites/lexicon-upgrade-op.d.ts.map +1 -0
- package/dist/op/composites/pipeline-audit-op.d.ts +50 -0
- package/dist/op/composites/pipeline-audit-op.d.ts.map +1 -0
- package/dist/op/composites/reconcile-op.d.ts +57 -0
- package/dist/op/composites/reconcile-op.d.ts.map +1 -0
- package/dist/op/composites/watch-op.d.ts +60 -0
- package/dist/op/composites/watch-op.d.ts.map +1 -0
- package/dist/op/composites/workflow-audit-op.d.ts +57 -0
- package/dist/op/composites/workflow-audit-op.d.ts.map +1 -0
- package/dist/op/converge-rule.d.ts +12 -10
- package/dist/op/converge-rule.d.ts.map +1 -1
- package/dist/op/cron.d.ts +51 -0
- package/dist/op/cron.d.ts.map +1 -0
- package/dist/op/discover.d.ts +9 -0
- package/dist/op/discover.d.ts.map +1 -1
- package/dist/op/duration.d.ts +11 -0
- package/dist/op/duration.d.ts.map +1 -0
- package/dist/op/emulator-lifecycle.d.ts.map +1 -1
- package/dist/op/gate-name.d.ts +40 -0
- package/dist/op/gate-name.d.ts.map +1 -0
- package/dist/op/gate-summary.d.ts +43 -0
- package/dist/op/gate-summary.d.ts.map +1 -0
- package/dist/op/gate.d.ts +90 -0
- package/dist/op/gate.d.ts.map +1 -0
- package/dist/op/generate-pipeline.d.ts +9 -0
- package/dist/op/generate-pipeline.d.ts.map +1 -1
- package/dist/op/index.d.ts +29 -9
- package/dist/op/index.d.ts.map +1 -1
- package/dist/op/local-executor.d.ts +114 -28
- package/dist/op/local-executor.d.ts.map +1 -1
- package/dist/op/local-output.d.ts +11 -1
- package/dist/op/local-output.d.ts.map +1 -1
- package/dist/op/op-ir.d.ts +185 -0
- package/dist/op/op-ir.d.ts.map +1 -0
- package/dist/op/op-verb-class.d.ts +10 -2
- package/dist/op/op-verb-class.d.ts.map +1 -1
- package/dist/op/operator.d.ts +93 -5
- package/dist/op/operator.d.ts.map +1 -1
- package/dist/op/receipt-store.d.ts +1 -1
- package/dist/op/receipt-store.d.ts.map +1 -1
- package/dist/op/resource.d.ts +15 -1
- package/dist/op/resource.d.ts.map +1 -1
- package/dist/op/runtime.d.ts +200 -0
- package/dist/op/runtime.d.ts.map +1 -0
- package/dist/op/runtimes/local.d.ts +29 -0
- package/dist/op/runtimes/local.d.ts.map +1 -0
- package/dist/op/step-output-ref.d.ts +15 -13
- package/dist/op/step-output-ref.d.ts.map +1 -1
- package/dist/op/types.d.ts +96 -29
- package/dist/op/types.d.ts.map +1 -1
- package/dist/ownership.d.ts +1 -1
- package/dist/provenance.d.ts +21 -0
- package/dist/provenance.d.ts.map +1 -1
- package/dist/serializer-walker.d.ts.map +1 -1
- package/dist/terraform/bridge.d.ts +26 -7
- package/dist/terraform/bridge.d.ts.map +1 -1
- package/dist/terraform/carve-provider.d.ts +28 -2
- package/dist/terraform/carve-provider.d.ts.map +1 -1
- package/dist/terraform/data-source-shape.d.ts +77 -0
- package/dist/terraform/data-source-shape.d.ts.map +1 -0
- package/dist/terraform/graph.d.ts.map +1 -1
- package/dist/terraform/providers/kubernetes.d.ts +5 -0
- package/dist/terraform/providers/kubernetes.d.ts.map +1 -1
- package/dist/terraform/tier-map.d.ts +16 -4
- package/dist/terraform/tier-map.d.ts.map +1 -1
- package/dist/terraform/types.d.ts +8 -0
- package/dist/terraform/types.d.ts.map +1 -1
- package/package.json +6 -1
- package/src/audit/catalog.test.ts +79 -3
- package/src/audit/catalog.ts +111 -13
- package/src/audit/core.test.ts +26 -0
- package/src/audit/core.ts +84 -18
- package/src/audit/discover.test.ts +39 -0
- package/src/audit/discover.ts +202 -18
- package/src/audit/lineage.ts +100 -0
- package/src/audit/prior-art.ts +153 -0
- package/src/audit/proof.test.ts +67 -0
- package/src/audit/proof.ts +70 -0
- package/src/audit/report-html.ts +9 -4
- package/src/audit/report-model.ts +16 -2
- package/src/audit/report.test.ts +33 -0
- package/src/audit/report.ts +5 -3
- package/src/audit/rules-doc.test.ts +34 -2
- package/src/audit/rules-doc.ts +82 -9
- package/src/audit/secrets.ts +15 -3
- package/src/audit/terraform-state.test.ts +144 -0
- package/src/audit/terraform-state.ts +131 -0
- package/src/build.ts +31 -1
- package/src/claimed-fields.test.ts +145 -0
- package/src/claimed-fields.ts +208 -0
- package/src/cli/build-params-cli.ts +2 -2
- package/src/cli/command-group.ts +14 -0
- package/src/cli/commands/__fixtures__/audit-terraform/infra/.terraform/providers/lock.txt +1 -0
- package/src/cli/commands/__fixtures__/audit-terraform/infra/main.tf +1 -0
- package/src/cli/commands/__fixtures__/audit-terraform/infra/modules/foo/main.tf +1 -0
- package/src/cli/commands/__fixtures__/audit-terraform/infra/variables.tf +3 -0
- package/src/cli/commands/__fixtures__/init-lexicon-output/package.json +13 -4
- package/src/cli/commands/__fixtures__/init-lexicon-output/src/codegen/docs-cli.ts +4 -0
- package/src/cli/commands/__fixtures__/init-lexicon-output/src/codegen/package.ts +1 -0
- package/src/cli/commands/__fixtures__/init-lexicon-output/src/package-cli.ts +21 -0
- package/src/cli/commands/__snapshots__/init-lexicon.test.ts.snap +1 -0
- package/src/cli/commands/audit.test.ts +191 -11
- package/src/cli/commands/audit.ts +78 -28
- package/src/cli/commands/build.test.ts +330 -9
- package/src/cli/commands/build.ts +170 -24
- package/src/cli/commands/carve-bridge.test.ts +237 -14
- package/src/cli/commands/carve-bridge.ts +21 -17
- package/src/cli/commands/carve-emit-k8s.test.ts +17 -10
- package/src/cli/commands/check-lexicon-docs.ts +1 -1
- package/src/cli/commands/check-lexicon-examples.test.ts +29 -1
- package/src/cli/commands/check-lexicon-examples.ts +42 -10
- package/src/cli/commands/init-lexicon/templates/codegen.ts +9 -0
- package/src/cli/commands/init-lexicon/templates/project.ts +44 -4
- package/src/cli/commands/init-lexicon.test.ts +97 -2
- package/src/cli/commands/init-lexicon.ts +4 -2
- package/src/cli/commands/init.test.ts +35 -1
- package/src/cli/commands/init.ts +14 -3
- package/src/cli/commands/lint.test.ts +194 -1
- package/src/cli/commands/lint.ts +205 -7
- package/src/cli/commands/onboard.test.ts +75 -0
- package/src/cli/commands/onboard.ts +54 -23
- package/src/cli/handlers/build.test.ts +81 -1
- package/src/cli/handlers/build.ts +15 -1
- package/src/cli/handlers/graph.test.ts +3 -3
- package/src/cli/handlers/lifecycle.test.ts +195 -12
- package/src/cli/handlers/lifecycle.ts +123 -6
- package/src/cli/handlers/misc.ts +1 -1
- package/src/cli/handlers/operator.test.ts +183 -11
- package/src/cli/handlers/operator.ts +341 -55
- package/src/cli/handlers/run.test.ts +568 -1295
- package/src/cli/handlers/run.ts +446 -912
- package/src/cli/main.test.ts +22 -16
- package/src/cli/main.ts +66 -33
- package/src/cli/mcp/op-tools.ts +147 -88
- package/src/cli/mcp/resource-handlers.ts +10 -37
- package/src/cli/mcp/resources/context.ts +11 -12
- package/src/cli/mcp/server.test.ts +25 -27
- package/src/cli/mcp/server.ts +2 -2
- package/src/cli/plugins.test.ts +68 -2
- package/src/cli/plugins.ts +39 -0
- package/src/cli/registry.ts +40 -9
- package/src/codegen/docs.ts +1 -1
- package/src/codegen/generate-post-synth-barrel.test.ts +1 -1
- package/src/codegen/generate-post-synth-barrel.ts +1 -1
- package/src/components/README.md +4 -3
- package/src/components/__fixtures__/neo4j-fanout.json +1 -1
- package/src/components/auto-release.test.ts +4 -20
- package/src/components/auto-release.ts +17 -42
- package/src/components/capability.ts +4 -4
- package/src/components/cli-support.test.ts +28 -12
- package/src/components/cli-support.ts +60 -47
- package/src/components/component-schema.test.ts +18 -2
- package/src/components/component.schema.json +18 -5
- package/src/components/component.test.ts +2 -2
- package/src/components/component.ts +27 -7
- package/src/components/config-defaults.test.ts +2 -2
- package/src/components/driver-output.ts +14 -2
- package/src/components/driver.test.ts +109 -20
- package/src/components/driver.ts +201 -84
- package/src/components/index.ts +1 -6
- package/src/components/manifest-persistence.test.ts +2 -20
- package/src/components/manifest-persistence.ts +4 -24
- package/src/components/pilots/neo4j-fanout.pilot.ts +3 -3
- package/src/components/pilots/pilots-lint-clean.test.ts +11 -10
- package/src/components/run-progress.ts +6 -6
- package/src/components/verbs/run-agent.test.ts +19 -0
- package/src/components/verbs/run-agent.ts +12 -24
- package/src/components/verbs/verify.ts +2 -2
- package/src/deep-observation.test.ts +75 -0
- package/src/deep-observation.ts +48 -0
- package/src/detectLexicon.ts +18 -1
- package/src/discovery/collect.test.ts +3 -3
- package/src/discovery/files.ts +4 -4
- package/src/discovery/fold-import.test.ts +1 -1
- package/src/discovery/fold-import.ts +105 -2
- package/src/discovery/param-deps.test.ts +112 -1
- package/src/discovery/param-deps.ts +193 -0
- package/src/discovery/sandbox/bundle.ts +15 -1
- package/src/discovery/sandbox/config-wire.test.ts +2 -2
- package/src/discovery/sandbox/config-wire.ts +2 -2
- package/src/fold/fold.test.ts +56 -0
- package/src/fold/foldable-helpers.ts +82 -2
- package/src/fold-provenance-exclusion.test.ts +186 -0
- package/src/fold-provenance.test.ts +495 -0
- package/src/fold-provenance.ts +441 -0
- package/src/graph-ops.test.ts +3 -3
- package/src/graph-ops.ts +1 -1
- package/src/held-elsewhere.test.ts +102 -0
- package/src/held-elsewhere.ts +114 -0
- package/src/index.ts +3 -0
- package/src/kubectl-context.ts +3 -3
- package/src/lexicon-config.test.ts +5 -5
- package/src/lexicon-config.ts +4 -4
- package/src/lexicon-plugin-helpers.ts +1 -1
- package/src/lexicon.ts +296 -16
- package/src/lifecycle/change-set.test.ts +49 -0
- package/src/lifecycle/change-set.ts +67 -0
- package/src/lifecycle/converge-ledger.ts +1 -1
- package/src/lifecycle/deep-diff.test.ts +267 -14
- package/src/lifecycle/deep-diff.ts +217 -14
- package/src/lifecycle/deep-observe.test.ts +3 -1
- package/src/lifecycle/deep-observe.ts +16 -6
- package/src/lifecycle/gate-ledger.test.ts +74 -2
- package/src/lifecycle/gate-ledger.ts +154 -36
- package/src/lifecycle/index.ts +1 -0
- package/src/lifecycle/release-ledger.ts +2 -2
- package/src/lifecycle/run-ledger.test.ts +268 -0
- package/src/lifecycle/run-ledger.ts +201 -0
- package/src/lifecycle/symptoms.ts +3 -3
- package/src/lint/config.test.ts +82 -1
- package/src/lint/config.ts +112 -3
- package/src/lint/pipeline-change-gate.test.ts +2 -2
- package/src/lint/policy.test.ts +1 -1
- package/src/lint/post-synth.test.ts +31 -0
- package/src/lint/post-synth.ts +54 -1
- package/src/lint/rules/__fixtures__/comp/comp004/pass/neo4j-cluster.component.ts +2 -2
- package/src/lint/rules/__fixtures__/comp/comp004/pass/orders-table.component.ts +1 -1
- package/src/lint/rules/comp/comp.test.ts +27 -1
- package/src/lint/rules/comp/comp004-gate-needs-durable-runtime.ts +76 -0
- package/src/lint/rules/comp/index.ts +3 -3
- package/src/lint/rules/op/index.ts +23 -0
- package/src/lint/rules/op/ops012-activity-contract.test.ts +161 -0
- package/src/lint/rules/op/ops012-activity-contract.ts +64 -0
- package/src/lint/rules/op/ops013-step-output-ref.test.ts +237 -0
- package/src/lint/rules/op/ops013-step-output-ref.ts +98 -0
- package/src/lint/rules/op/ops014-converge-rule-refusals.test.ts +263 -0
- package/src/lint/rules/op/ops014-converge-rule-refusals.ts +179 -0
- package/src/lint/rules/op/support.ts +11 -0
- package/src/lint/suppressions.test.ts +163 -0
- package/src/lint/suppressions.ts +204 -0
- package/src/live-endpoint.ts +1 -1
- package/src/op/activities/activity-contracts.ts +66 -0
- package/src/op/activities/apply.test.ts +567 -0
- package/src/op/activities/apply.ts +662 -0
- package/src/op/activities/build.ts +26 -0
- package/src/op/activities/converge.test.ts +330 -0
- package/src/op/activities/converge.ts +449 -0
- package/src/op/activities/env-teardown.test.ts +187 -0
- package/src/op/activities/env-teardown.ts +171 -0
- package/src/op/activities/guard-validate.test.ts +139 -0
- package/src/op/activities/guard-validate.ts +223 -0
- package/src/op/activities/http-check.test.ts +48 -0
- package/src/op/activities/http-check.ts +55 -0
- package/src/op/activities/index.ts +119 -0
- package/src/op/activities/lexicon-upgrade.test.ts +492 -0
- package/src/op/activities/lexicon-upgrade.ts +673 -0
- package/src/op/activities/lifecycle.ts +85 -0
- package/src/op/activities/pipeline-audit.test.ts +67 -0
- package/src/op/activities/pipeline-audit.ts +201 -0
- package/src/op/activities/policy.test.ts +19 -0
- package/src/op/activities/policy.ts +37 -0
- package/src/op/activities/reconcile.test.ts +161 -0
- package/src/op/activities/reconcile.ts +354 -0
- package/src/op/activities/shell.ts +26 -0
- package/src/op/activities/teardown.ts +22 -0
- package/src/op/activities/util.ts +6 -0
- package/src/op/activities/wait.ts +69 -0
- package/src/op/activities/workflow-audit.test.ts +90 -0
- package/src/op/activities/workflow-audit.ts +203 -0
- package/src/op/activity-contract-registry.test.ts +98 -0
- package/src/op/activity-contract-registry.ts +114 -0
- package/src/op/activity-contract.test.ts +1 -1
- package/src/op/activity-contract.ts +37 -33
- package/src/op/activity-failure.ts +34 -0
- package/src/op/activity-profiles.test.ts +56 -0
- package/src/op/activity-profiles.ts +116 -0
- package/src/op/activity-registry.test.ts +37 -28
- package/src/op/activity-registry.ts +27 -56
- package/src/op/activity-runtime.ts +3 -47
- package/src/op/builders-exports.test.ts +0 -49
- package/src/op/builders-typed.test.ts +164 -0
- package/src/op/builders.ts +125 -41
- package/src/op/change-signal.test.ts +117 -0
- package/src/op/change-signal.ts +169 -0
- package/src/op/composites/apply-op.ts +218 -0
- package/src/op/composites/composites.test.ts +379 -0
- package/src/op/composites/converge-op.test.ts +168 -0
- package/src/op/composites/converge-op.ts +214 -0
- package/src/op/composites/index.ts +26 -0
- package/src/op/composites/lexicon-upgrade-op.test.ts +68 -0
- package/src/op/composites/lexicon-upgrade-op.ts +134 -0
- package/src/op/composites/pipeline-audit-op.test.ts +25 -0
- package/src/op/composites/pipeline-audit-op.ts +78 -0
- package/src/op/composites/reconcile-op.test.ts +51 -0
- package/src/op/composites/reconcile-op.ts +110 -0
- package/src/op/composites/watch-op.ts +108 -0
- package/src/op/composites/workflow-audit-op.test.ts +25 -0
- package/src/op/composites/workflow-audit-op.ts +88 -0
- package/src/op/converge-rule.ts +12 -10
- package/src/op/cron.test.ts +128 -0
- package/src/op/cron.ts +149 -0
- package/src/op/discover-root.test.ts +105 -1
- package/src/op/discover.test.ts +6 -2
- package/src/op/discover.ts +84 -16
- package/src/op/duration.ts +21 -0
- package/src/op/effect-step.test.ts +29 -14
- package/src/op/emulator-lifecycle.ts +1 -2
- package/src/op/gate-name.test.ts +65 -0
- package/src/op/gate-name.ts +60 -0
- package/src/op/gate-summary.ts +84 -0
- package/src/op/gate.ts +155 -0
- package/src/op/generate-pipeline.test.ts +65 -3
- package/src/op/generate-pipeline.ts +19 -2
- package/src/op/index.ts +48 -8
- package/src/op/local-executor.test.ts +178 -34
- package/src/op/local-executor.ts +371 -102
- package/src/op/local-output.test.ts +95 -11
- package/src/op/local-output.ts +33 -4
- package/src/op/op-ir.test.ts +292 -0
- package/src/op/op-ir.ts +419 -0
- package/src/op/op-verb-class.test.ts +2 -2
- package/src/op/op-verb-class.ts +19 -5
- package/src/op/op.test.ts +28 -7
- package/src/op/operator.test.ts +543 -6
- package/src/op/operator.ts +203 -20
- package/src/op/receipt-store.ts +1 -1
- package/src/op/resource.ts +20 -2
- package/src/op/runtime.ts +203 -0
- package/src/op/runtimes/local.test.ts +181 -0
- package/src/op/runtimes/local.ts +212 -0
- package/src/op/step-output-ref.ts +15 -13
- package/src/op/types.ts +106 -26
- package/src/ownership.ts +1 -1
- package/src/provenance.test.ts +6 -0
- package/src/provenance.ts +21 -1
- package/src/serializer-walker.test.ts +42 -0
- package/src/serializer-walker.ts +21 -2
- package/src/terraform/aws-resources.test.ts +13 -4
- package/src/terraform/bridge.test.ts +22 -9
- package/src/terraform/bridge.ts +89 -28
- package/src/terraform/carve-provider.ts +38 -2
- package/src/terraform/data-source-shape.ts +95 -0
- package/src/terraform/graph.ts +35 -7
- package/src/terraform/providers/kubernetes.ts +48 -2
- package/src/terraform/tier-map.ts +21 -6
- package/src/terraform/types.ts +8 -0
- package/dist/cli/handlers/op-progress.d.ts +0 -90
- package/dist/cli/handlers/op-progress.d.ts.map +0 -1
- package/dist/cli/handlers/run-client.d.ts +0 -127
- package/dist/cli/handlers/run-client.d.ts.map +0 -1
- package/dist/cli/handlers/run-report.d.ts +0 -5
- package/dist/cli/handlers/run-report.d.ts.map +0 -1
- package/dist/components/temporal-codegen-loader.d.ts +0 -27
- package/dist/components/temporal-codegen-loader.d.ts.map +0 -1
- package/dist/lint/rules/comp/comp004-gate-needs-temporal.d.ts +0 -37
- package/dist/lint/rules/comp/comp004-gate-needs-temporal.d.ts.map +0 -1
- package/src/cli/handlers/op-progress.test.ts +0 -268
- package/src/cli/handlers/op-progress.ts +0 -248
- package/src/cli/handlers/run-client.test.ts +0 -82
- package/src/cli/handlers/run-client.ts +0 -219
- package/src/cli/handlers/run-report.test.ts +0 -62
- package/src/cli/handlers/run-report.ts +0 -122
- package/src/components/temporal-codegen-loader.ts +0 -41
- package/src/lint/rules/comp/comp004-gate-needs-temporal.ts +0 -66
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { describe, test, expect, beforeEach, afterEach } from "vitest";
|
|
2
|
-
import { existsSync, readFileSync, mkdirSync, writeFileSync, rmSync, readdirSync, realpathSync } from "fs";
|
|
2
|
+
import { existsSync, readFileSync, mkdirSync, writeFileSync, rmSync, readdirSync, realpathSync, symlinkSync } from "fs";
|
|
3
3
|
import { execFileSync } from "child_process";
|
|
4
4
|
import { join, dirname } from "path";
|
|
5
5
|
import { tmpdir } from "os";
|
|
6
|
-
import { fileURLToPath } from "url";
|
|
6
|
+
import { fileURLToPath, pathToFileURL } from "url";
|
|
7
7
|
import { initLexiconCommand } from "./init-lexicon";
|
|
8
|
+
import { checkLexicon } from "./check-lexicon";
|
|
8
9
|
|
|
9
10
|
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
10
11
|
const FIXTURE_DIR = join(__dirname, "__fixtures__", "init-lexicon-output");
|
|
@@ -44,6 +45,8 @@ describe("initLexiconCommand", () => {
|
|
|
44
45
|
"src/codegen/naming.ts",
|
|
45
46
|
"src/codegen/package.ts",
|
|
46
47
|
"src/codegen/docs.ts",
|
|
48
|
+
"src/codegen/docs-cli.ts",
|
|
49
|
+
"src/package-cli.ts",
|
|
47
50
|
"src/spec/fetch.ts",
|
|
48
51
|
"src/spec/parse.ts",
|
|
49
52
|
"src/lint/rules/sample.ts",
|
|
@@ -245,6 +248,16 @@ describe("scaffold content validation", () => {
|
|
|
245
248
|
expect(pkg.scripts.build).toContain("tsconfig.build.json");
|
|
246
249
|
});
|
|
247
250
|
|
|
251
|
+
// #2090, the scaffolded package.json failed tier 1 as generated: a bare
|
|
252
|
+
// string exports["."], a build script that never deletes emitted .js, and
|
|
253
|
+
// a prepack that never bundled, so dist/manifest.json never existed.
|
|
254
|
+
test("package.json exports[\".\"].default is ./src/index.ts, build deletes emitted JS, prepack bundles (#2090)", () => {
|
|
255
|
+
const pkg = JSON.parse(readFileSync(join(targetDir, "package.json"), "utf-8"));
|
|
256
|
+
expect(pkg.exports["."].default).toBe("./src/index.ts");
|
|
257
|
+
expect(pkg.scripts.build).toContain("-delete");
|
|
258
|
+
expect(pkg.scripts.prepack).toContain("bundle");
|
|
259
|
+
});
|
|
260
|
+
|
|
248
261
|
test("tsconfig.build.json uses bundler resolution + the development condition (#749)", () => {
|
|
249
262
|
const cfg = JSON.parse(readFileSync(join(targetDir, "tsconfig.build.json"), "utf-8"));
|
|
250
263
|
expect(cfg.compilerOptions.moduleResolution).toBe("bundler");
|
|
@@ -308,6 +321,88 @@ describe("scaffold content validation", () => {
|
|
|
308
321
|
});
|
|
309
322
|
});
|
|
310
323
|
|
|
324
|
+
// #2090, a fresh scaffold used to fail 5 tier-1 checks before the author
|
|
325
|
+
// wrote anything. The docs-cli.ts gap (section 1) and the package.json/bundle
|
|
326
|
+
// gap (section 2) together fixed the packaging-shape check and let
|
|
327
|
+
// `npm run bundle` actually produce dist/manifest.json with a chantVersion.
|
|
328
|
+
describe("a fresh scaffold's tier-1 completeness (#2090)", () => {
|
|
329
|
+
let root: string;
|
|
330
|
+
let dir: string;
|
|
331
|
+
|
|
332
|
+
beforeEach(async () => {
|
|
333
|
+
root = join(tmpdir(), `chant-scaffold-tier1-${Date.now()}-${Math.random().toString(36).slice(2)}`);
|
|
334
|
+
mkdirSync(root, { recursive: true });
|
|
335
|
+
// The scaffold's tsconfig.json extends "../../tsconfig.json" (mirroring
|
|
336
|
+
// lexicons/<name>/tsconfig.json's real "../../tsconfig.json" -> repo
|
|
337
|
+
// root), so loading it needs a real file two levels up.
|
|
338
|
+
writeFileSync(join(root, "tsconfig.json"), "{}\n");
|
|
339
|
+
|
|
340
|
+
// A self-contained node_modules so the scaffold's own runtime imports of
|
|
341
|
+
// "@intentius/chant/*" resolve exactly as they would in the real
|
|
342
|
+
// monorepo, without touching the real repo's node_modules or lexicons/.
|
|
343
|
+
mkdirSync(join(root, "node_modules/@intentius"), { recursive: true });
|
|
344
|
+
symlinkSync(
|
|
345
|
+
join(__dirname, "..", "..", ".."), // commands -> cli -> src -> packages/core
|
|
346
|
+
join(root, "node_modules/@intentius/chant"),
|
|
347
|
+
"dir",
|
|
348
|
+
);
|
|
349
|
+
|
|
350
|
+
dir = join(root, "lexicons", "acme");
|
|
351
|
+
await initLexiconCommand({ name: "acme", path: dir });
|
|
352
|
+
|
|
353
|
+
// Bypass the generate() TODO throw. A real spec fetcher/parser is the
|
|
354
|
+
// author's job, not this test's. writeGeneratedFiles resolves its own
|
|
355
|
+
// target so a no-op stub is fine.
|
|
356
|
+
writeFileSync(
|
|
357
|
+
join(dir, "src/codegen/generate.ts"),
|
|
358
|
+
[
|
|
359
|
+
"export async function generate() {",
|
|
360
|
+
" return { resources: 0, properties: 0, enums: 0, lexiconJSON: '{}', typesDTS: '', indexTS: '' };",
|
|
361
|
+
"}",
|
|
362
|
+
"export function writeGeneratedFiles() {}",
|
|
363
|
+
"",
|
|
364
|
+
].join("\n"),
|
|
365
|
+
);
|
|
366
|
+
|
|
367
|
+
// Run the fixed bundle pipeline for real, proving section 2's package.json
|
|
368
|
+
// + package-cli.ts changes actually produce dist/manifest.json, not just
|
|
369
|
+
// that the scripts look right.
|
|
370
|
+
const packageMod = (await import(pathToFileURL(join(dir, "src/codegen/package.ts")).href)) as {
|
|
371
|
+
packageLexicon: (opts?: { verbose?: boolean }) => Promise<{ spec: unknown }>;
|
|
372
|
+
};
|
|
373
|
+
const { spec } = await packageMod.packageLexicon({ verbose: false });
|
|
374
|
+
|
|
375
|
+
const bundleMod = (await import(
|
|
376
|
+
pathToFileURL(join(root, "node_modules/@intentius/chant/src/codegen/package.ts")).href
|
|
377
|
+
)) as { writeBundleSpec: (spec: unknown, distDir: string) => void };
|
|
378
|
+
bundleMod.writeBundleSpec(spec, join(dir, "dist"));
|
|
379
|
+
});
|
|
380
|
+
|
|
381
|
+
afterEach(() => {
|
|
382
|
+
rmSync(root, { recursive: true, force: true });
|
|
383
|
+
});
|
|
384
|
+
|
|
385
|
+
test("the fixed bundle pipeline actually produces dist/manifest.json with a chantVersion", () => {
|
|
386
|
+
expect(existsSync(join(dir, "dist/manifest.json"))).toBe(true);
|
|
387
|
+
const manifest = JSON.parse(readFileSync(join(dir, "dist/manifest.json"), "utf-8"));
|
|
388
|
+
expect(typeof manifest.chantVersion).toBe("string");
|
|
389
|
+
expect(manifest.chantVersion.length).toBeGreaterThan(0);
|
|
390
|
+
});
|
|
391
|
+
|
|
392
|
+
// Only real author work should remain. "Every shipped example builds..."
|
|
393
|
+
// also fails here, but for a reason outside this issue's scope: the
|
|
394
|
+
// scaffold's getting-started example has every line commented out (nothing
|
|
395
|
+
// to build yet), which is true independent of sections 1 and 2 above.
|
|
396
|
+
test("fails only on real author work, not on anything sections 1-2 fix", async () => {
|
|
397
|
+
const result = await checkLexicon(dir);
|
|
398
|
+
const tier1Failures = result.items.filter((i) => i.tier === 1 && !i.pass).map((i) => i.name);
|
|
399
|
+
expect(tier1Failures).toEqual([
|
|
400
|
+
"postSynthChecks() returns at least 1 check",
|
|
401
|
+
"Every shipped example builds and passes its own post-synth checks",
|
|
402
|
+
]);
|
|
403
|
+
});
|
|
404
|
+
});
|
|
405
|
+
|
|
311
406
|
// ── Fixture snapshot tests ──────────────────────────────────────────
|
|
312
407
|
|
|
313
408
|
describe("init-lexicon fixture snapshot", () => {
|
|
@@ -4,11 +4,11 @@ import { formatSuccess, formatWarning } from "../format";
|
|
|
4
4
|
|
|
5
5
|
// Template generators
|
|
6
6
|
import { generatePluginTs, generateIndexTs } from "./init-lexicon/templates/plugin";
|
|
7
|
-
import { generateCodegenGenerateTs, generateCodegenGenerateCliTs, generateCodegenNamingTs, generateCodegenPackageTs, generateCodegenDocsTs } from "./init-lexicon/templates/codegen";
|
|
7
|
+
import { generateCodegenGenerateTs, generateCodegenGenerateCliTs, generateCodegenNamingTs, generateCodegenPackageTs, generateCodegenDocsTs, generateCodegenDocsCliTs } from "./init-lexicon/templates/codegen";
|
|
8
8
|
import { generateSpecFetchTs, generateSpecParseTs } from "./init-lexicon/templates/spec";
|
|
9
9
|
import { generateSampleRuleTs, generateLintRulesIndexTs } from "./init-lexicon/templates/lint";
|
|
10
10
|
import { generateLspCompletionsTs, generateLspHoverTs } from "./init-lexicon/templates/lsp";
|
|
11
|
-
import { generatePackageJson, generateTsConfig, generateTsConfigBuild, generateJustfile, generateGitignore, generateReadme, generateSerializerTs, generateValidateTs, generateValidateCliTs } from "./init-lexicon/templates/project";
|
|
11
|
+
import { generatePackageJson, generateTsConfig, generateTsConfigBuild, generateJustfile, generateGitignore, generateReadme, generateSerializerTs, generateValidateTs, generateValidateCliTs, generatePackageCliTs } from "./init-lexicon/templates/project";
|
|
12
12
|
import { generatePluginTestTs, generateSerializerTestTs, generateCompletionsTestTs, generateHoverTestTs } from "./init-lexicon/templates/tests";
|
|
13
13
|
import { generateDocsPackageJson, generateDocsTsConfig, generateDocsAstroConfig, generateDocsContentConfig, generateDocsIndexMdx, generateDocsGettingStartedMdx } from "./init-lexicon/templates/docs";
|
|
14
14
|
import { generateExamplePackageJson, generateExampleInfraTs } from "./init-lexicon/templates/examples";
|
|
@@ -137,6 +137,7 @@ export async function initLexiconCommand(options: InitLexiconOptions): Promise<I
|
|
|
137
137
|
"src/codegen/naming.ts": generateCodegenNamingTs(),
|
|
138
138
|
"src/codegen/package.ts": generateCodegenPackageTs(name),
|
|
139
139
|
"src/codegen/docs.ts": generateCodegenDocsTs(name),
|
|
140
|
+
"src/codegen/docs-cli.ts": generateCodegenDocsCliTs(),
|
|
140
141
|
"src/spec/fetch.ts": generateSpecFetchTs(),
|
|
141
142
|
"src/spec/parse.ts": generateSpecParseTs(),
|
|
142
143
|
"src/lint/rules/sample.ts": generateSampleRuleTs(names),
|
|
@@ -149,6 +150,7 @@ export async function initLexiconCommand(options: InitLexiconOptions): Promise<I
|
|
|
149
150
|
"src/serializer.test.ts": generateSerializerTestTs(name, names),
|
|
150
151
|
"src/validate.ts": generateValidateTs(name),
|
|
151
152
|
"src/validate-cli.ts": generateValidateCliTs(),
|
|
153
|
+
"src/package-cli.ts": generatePackageCliTs(),
|
|
152
154
|
"package.json": generatePackageJson(name, names),
|
|
153
155
|
"tsconfig.json": generateTsConfig(),
|
|
154
156
|
"tsconfig.build.json": generateTsConfigBuild(),
|
|
@@ -348,5 +348,39 @@ describe("initCommand", () => {
|
|
|
348
348
|
expect(pipeline).toContain("NodePipeline");
|
|
349
349
|
});
|
|
350
350
|
});
|
|
351
|
-
});
|
|
352
351
|
|
|
352
|
+
// chant #2129 — core writes `chant.config.ts` before a plugin's root files
|
|
353
|
+
// and `writeIfNotExists` keeps the first one, so a template that ships its
|
|
354
|
+
// own config used to be discarded in silence. The template's wins now: it
|
|
355
|
+
// is the only one that knows the config namespace the scaffold needs.
|
|
356
|
+
test("a template's own chant.config.ts wins over the generic one", async () => {
|
|
357
|
+
await withTestDir(async (testDir) => {
|
|
358
|
+
const result = await initCommand({
|
|
359
|
+
path: testDir,
|
|
360
|
+
lexicon: "fountain",
|
|
361
|
+
template: "steward",
|
|
362
|
+
skipMcp: true,
|
|
363
|
+
skipInstall: true,
|
|
364
|
+
});
|
|
365
|
+
|
|
366
|
+
expect(result.success).toBe(true);
|
|
367
|
+
expect(result.createdFiles).toContain("chant.config.ts");
|
|
368
|
+
// Written once, so no "already exists, skipping" warning about it.
|
|
369
|
+
expect(result.warnings.filter((w) => w.includes("chant.config.ts"))).toEqual([]);
|
|
370
|
+
|
|
371
|
+
const config = readFileSync(join(testDir, "chant.config.ts"), "utf-8");
|
|
372
|
+
expect(config).toContain("fountain:");
|
|
373
|
+
expect(config).toContain('token: { env: "FOUNTAIN_TOKEN" }');
|
|
374
|
+
expect(result.createdFiles).toContain("src/prod-watch.op.ts");
|
|
375
|
+
});
|
|
376
|
+
});
|
|
377
|
+
|
|
378
|
+
test("a template without a config still gets the generic one", async () => {
|
|
379
|
+
await withTestDir(async (testDir) => {
|
|
380
|
+
await initCommand({ path: testDir, lexicon: "fountain", skipMcp: true, skipInstall: true });
|
|
381
|
+
const config = readFileSync(join(testDir, "chant.config.ts"), "utf-8");
|
|
382
|
+
expect(config).toContain('lexicons: ["fountain"]');
|
|
383
|
+
expect(config).not.toContain("profiles");
|
|
384
|
+
});
|
|
385
|
+
});
|
|
386
|
+
});
|
package/src/cli/commands/init.ts
CHANGED
|
@@ -343,10 +343,17 @@ export async function initCommand(options: InitOptions): Promise<InitResult> {
|
|
|
343
343
|
warnings,
|
|
344
344
|
);
|
|
345
345
|
|
|
346
|
-
// Generate chant.config.ts
|
|
346
|
+
// Generate chant.config.ts. A template that ships its own wins: core's
|
|
347
|
+
// version knows only the lexicon name, while a template that declares a
|
|
348
|
+
// config namespace (fountain's steward scaffold and its `fountain.profiles`
|
|
349
|
+
// block, chant #2129) is scaffolding a project that needs it to run at all.
|
|
350
|
+
// The root-file loop below runs *after* this write, and `writeIfNotExists`
|
|
351
|
+
// keeps the first file, so a template's config would otherwise be discarded
|
|
352
|
+
// in silence — see lexicons/cedar/src/init-templates.ts, which documents
|
|
353
|
+
// having had to work around exactly that.
|
|
347
354
|
writeIfNotExists(
|
|
348
355
|
join(targetDir, "chant.config.ts"),
|
|
349
|
-
generateChantConfig(options.lexicon),
|
|
356
|
+
templateSet?.root?.["chant.config.ts"] ?? generateChantConfig(options.lexicon),
|
|
350
357
|
"chant.config.ts",
|
|
351
358
|
createdFiles,
|
|
352
359
|
warnings,
|
|
@@ -372,9 +379,13 @@ export async function initCommand(options: InitOptions): Promise<InitResult> {
|
|
|
372
379
|
warnings,
|
|
373
380
|
);
|
|
374
381
|
}
|
|
375
|
-
// Write root scaffold files (e.g. index.js, test.js, Dockerfile)
|
|
382
|
+
// Write root scaffold files (e.g. index.js, test.js, Dockerfile).
|
|
383
|
+
// `chant.config.ts` is skipped: it was already written above, from this
|
|
384
|
+
// same template set, and re-offering it here would only produce an
|
|
385
|
+
// "already exists, skipping" warning about a file the template supplied.
|
|
376
386
|
if (templateSet.root) {
|
|
377
387
|
for (const [filename, content] of Object.entries(templateSet.root)) {
|
|
388
|
+
if (filename === "chant.config.ts") continue;
|
|
378
389
|
writeIfNotExists(
|
|
379
390
|
join(targetDir, filename),
|
|
380
391
|
content,
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { describe, test, expect, beforeEach, afterEach } from "vitest";
|
|
2
|
-
import { lintCommand, isLintRule, loadPluginRules, type LintOptions } from "./lint";
|
|
2
|
+
import { lintCommand, isLintRule, loadPluginRules, LEXICON_RESOLUTION_RULE_ID, type LintOptions } from "./lint";
|
|
3
|
+
import { loadPlugins, resolveProjectLexicons } from "../plugins";
|
|
3
4
|
import { mkdir, rm, writeFile } from "node:fs/promises";
|
|
4
5
|
import { join, resolve } from "node:path";
|
|
5
6
|
import { tmpdir } from "node:os";
|
|
@@ -69,6 +70,54 @@ export const b = new Bucket({ encryption: { algo: "AES256" } });
|
|
|
69
70
|
expect(result.diagnostics.some((d) => d.ruleId === "COR001")).toBe(true);
|
|
70
71
|
});
|
|
71
72
|
|
|
73
|
+
// #2122 (epic #2114 sub-issue 6) — OPS013 is a core-owned Op-model
|
|
74
|
+
// post-synth check, run over every `*.op.ts` file `chant lint` finds under
|
|
75
|
+
// the target path with no lexicon or build needed. This is the acceptance
|
|
76
|
+
// criterion: it fires on a fixture with a dangling `stepOutput` reference,
|
|
77
|
+
// on a project with no lexicons configured (no `plugins` in `options`
|
|
78
|
+
// below, the same as every other test in this file).
|
|
79
|
+
test("OPS013 fires on a dangling stepOutput reference with no lexicons configured", async () => {
|
|
80
|
+
await writeFile(
|
|
81
|
+
join(testDir, "reconcile.op.ts"),
|
|
82
|
+
`
|
|
83
|
+
export default {
|
|
84
|
+
[Symbol.for("chant.declarable")]: true,
|
|
85
|
+
entityType: "Chant::Op",
|
|
86
|
+
lexicon: "chant",
|
|
87
|
+
kind: "resource",
|
|
88
|
+
props: {
|
|
89
|
+
name: "reconcile",
|
|
90
|
+
overview: "test",
|
|
91
|
+
phases: [
|
|
92
|
+
{ name: "Phase", steps: [
|
|
93
|
+
{
|
|
94
|
+
kind: "activity",
|
|
95
|
+
fn: "httpCheck",
|
|
96
|
+
args: {
|
|
97
|
+
url: "http://x",
|
|
98
|
+
contains: { [Symbol.for("chant.op.stepOutputRef")]: true, kind: "step-output-ref", step: "nope", path: "x" },
|
|
99
|
+
},
|
|
100
|
+
},
|
|
101
|
+
] },
|
|
102
|
+
],
|
|
103
|
+
},
|
|
104
|
+
};
|
|
105
|
+
`,
|
|
106
|
+
);
|
|
107
|
+
|
|
108
|
+
const options: LintOptions = {
|
|
109
|
+
path: testDir,
|
|
110
|
+
format: "stylish",
|
|
111
|
+
};
|
|
112
|
+
|
|
113
|
+
const result = await lintCommand(options);
|
|
114
|
+
|
|
115
|
+
expect(result.success).toBe(false);
|
|
116
|
+
expect(
|
|
117
|
+
result.diagnostics.some((d) => d.ruleId === "OPS013" && d.message.includes('unknown step id "nope"')),
|
|
118
|
+
).toBe(true);
|
|
119
|
+
});
|
|
120
|
+
|
|
72
121
|
test("formats output as JSON", async () => {
|
|
73
122
|
await writeFile(
|
|
74
123
|
join(testDir, "nested.ts"),
|
|
@@ -493,3 +542,147 @@ describe("lintCommand — git-ignored files are not linted", () => {
|
|
|
493
542
|
expect(result.diagnostics.some((d) => d.file.includes("authored.ts") && d.ruleId === "EVL003")).toBe(true);
|
|
494
543
|
});
|
|
495
544
|
});
|
|
545
|
+
|
|
546
|
+
/**
|
|
547
|
+
* chant #2222 (epic #2215 sub-issue 7) — `chant lint` used to print "No
|
|
548
|
+
* problems found" and exit 0 on a project whose declared lexicon could not be
|
|
549
|
+
* resolved, the state `chant build` refuses outright. These pin both halves:
|
|
550
|
+
* the failure is now reported, and the one case the old `catch` legitimately
|
|
551
|
+
* covered (a project that declares no lexicon at all) still lints quietly.
|
|
552
|
+
*/
|
|
553
|
+
describe("lintCommand — a declared lexicon that cannot be resolved (#2222)", () => {
|
|
554
|
+
let testDir: string;
|
|
555
|
+
|
|
556
|
+
beforeEach(async () => {
|
|
557
|
+
testDir = join(tmpdir(), `chant-lint-lexicon-${Date.now()}-${Math.random()}`);
|
|
558
|
+
await mkdir(join(testDir, "src"), { recursive: true });
|
|
559
|
+
await writeFile(join(testDir, "src", "clean.ts"), `export const x = 1;\n`);
|
|
560
|
+
process.env.NO_COLOR = "1";
|
|
561
|
+
});
|
|
562
|
+
|
|
563
|
+
afterEach(async () => {
|
|
564
|
+
await rm(testDir, { recursive: true, force: true });
|
|
565
|
+
delete process.env.NO_COLOR;
|
|
566
|
+
});
|
|
567
|
+
|
|
568
|
+
/** The message `chant build` prints after `error: ` for the same project. */
|
|
569
|
+
async function buildsMessageFor(dir: string): Promise<string> {
|
|
570
|
+
try {
|
|
571
|
+
await loadPlugins(await resolveProjectLexicons(dir));
|
|
572
|
+
} catch (err) {
|
|
573
|
+
return err instanceof Error ? err.message : String(err);
|
|
574
|
+
}
|
|
575
|
+
throw new Error(`expected ${dir} to fail lexicon resolution`);
|
|
576
|
+
}
|
|
577
|
+
|
|
578
|
+
test("a declared lexicon whose package is not installed fails the lint", async () => {
|
|
579
|
+
await writeFile(
|
|
580
|
+
join(testDir, "chant.config.ts"),
|
|
581
|
+
`export default { lexicons: ["not-a-real-lexicon"] };\n`,
|
|
582
|
+
);
|
|
583
|
+
|
|
584
|
+
const result = await lintCommand({ path: testDir, format: "stylish" });
|
|
585
|
+
|
|
586
|
+
expect(result.success).toBe(false);
|
|
587
|
+
expect(result.errorCount).toBe(1);
|
|
588
|
+
const diag = result.diagnostics.find((d) => d.ruleId === LEXICON_RESOLUTION_RULE_ID);
|
|
589
|
+
expect(diag).toBeDefined();
|
|
590
|
+
expect(diag!.severity).toBe("error");
|
|
591
|
+
expect(diag!.file).toBe(join(testDir, "chant.config.ts"));
|
|
592
|
+
// Byte-for-byte what `chant build` reports, not a second wording.
|
|
593
|
+
expect(diag!.message).toBe(await buildsMessageFor(testDir));
|
|
594
|
+
expect(result.output).not.toContain("No problems found");
|
|
595
|
+
});
|
|
596
|
+
|
|
597
|
+
test("a chant.config that cannot be loaded at all fails the lint with its own error", async () => {
|
|
598
|
+
// The shape found in the wild: the config imports the lexicon package, so
|
|
599
|
+
// it throws before `lexicons` is ever read.
|
|
600
|
+
await writeFile(
|
|
601
|
+
join(testDir, "chant.config.ts"),
|
|
602
|
+
`import { thing } from "@intentius/chant-lexicon-not-a-real-lexicon";\n` +
|
|
603
|
+
`export default { lexicons: ["aws"], thing };\n`,
|
|
604
|
+
);
|
|
605
|
+
|
|
606
|
+
const result = await lintCommand({ path: testDir, format: "stylish" });
|
|
607
|
+
|
|
608
|
+
expect(result.success).toBe(false);
|
|
609
|
+
const diag = result.diagnostics.find((d) => d.ruleId === LEXICON_RESOLUTION_RULE_ID);
|
|
610
|
+
expect(diag).toBeDefined();
|
|
611
|
+
expect(diag!.message).toBe(await buildsMessageFor(testDir));
|
|
612
|
+
expect(diag!.message).toContain("@intentius/chant-lexicon-not-a-real-lexicon");
|
|
613
|
+
});
|
|
614
|
+
|
|
615
|
+
test("the failure reaches --format json", async () => {
|
|
616
|
+
await writeFile(
|
|
617
|
+
join(testDir, "chant.config.ts"),
|
|
618
|
+
`export default { lexicons: ["not-a-real-lexicon"] };\n`,
|
|
619
|
+
);
|
|
620
|
+
|
|
621
|
+
const result = await lintCommand({ path: testDir, format: "json" });
|
|
622
|
+
|
|
623
|
+
const parsed = JSON.parse(result.output) as Array<Record<string, unknown>>;
|
|
624
|
+
const entry = parsed.find((d) => d.ruleId === LEXICON_RESOLUTION_RULE_ID);
|
|
625
|
+
expect(entry).toBeDefined();
|
|
626
|
+
expect(entry!.severity).toBe("error");
|
|
627
|
+
expect(entry!.message).toBe(await buildsMessageFor(testDir));
|
|
628
|
+
});
|
|
629
|
+
|
|
630
|
+
test("the failure reaches --format sarif as an error-level result", async () => {
|
|
631
|
+
await writeFile(
|
|
632
|
+
join(testDir, "chant.config.ts"),
|
|
633
|
+
`export default { lexicons: ["not-a-real-lexicon"] };\n`,
|
|
634
|
+
);
|
|
635
|
+
|
|
636
|
+
const result = await lintCommand({ path: testDir, format: "sarif" });
|
|
637
|
+
|
|
638
|
+
const sarif = JSON.parse(result.output) as {
|
|
639
|
+
runs: Array<{ results: Array<{ ruleId: string; level: string; message: { text: string } }> }>;
|
|
640
|
+
};
|
|
641
|
+
const found = sarif.runs[0].results.find((r) => r.ruleId === LEXICON_RESOLUTION_RULE_ID);
|
|
642
|
+
expect(found).toBeDefined();
|
|
643
|
+
expect(found!.level).toBe("error");
|
|
644
|
+
expect(found!.message.text).toBe(await buildsMessageFor(testDir));
|
|
645
|
+
});
|
|
646
|
+
|
|
647
|
+
test("--fix does not drop the diagnostic", async () => {
|
|
648
|
+
await writeFile(
|
|
649
|
+
join(testDir, "chant.config.ts"),
|
|
650
|
+
`export default { lexicons: ["not-a-real-lexicon"] };\n`,
|
|
651
|
+
);
|
|
652
|
+
|
|
653
|
+
const result = await lintCommand({ path: testDir, format: "stylish", fix: true });
|
|
654
|
+
|
|
655
|
+
expect(result.success).toBe(false);
|
|
656
|
+
expect(result.diagnostics.some((d) => d.ruleId === LEXICON_RESOLUTION_RULE_ID)).toBe(true);
|
|
657
|
+
});
|
|
658
|
+
|
|
659
|
+
// The case the swallowed `catch` was written for, and the one that must not
|
|
660
|
+
// change: no `chant.config.*`, no lexicon import in any source file. The
|
|
661
|
+
// detection fallback throws "No lexicon detected in infrastructure files",
|
|
662
|
+
// which is a project that lints under the core rules alone.
|
|
663
|
+
test("a project with no chant.config at all still lints clean", async () => {
|
|
664
|
+
const result = await lintCommand({ path: testDir, format: "stylish" });
|
|
665
|
+
|
|
666
|
+
expect(result.success).toBe(true);
|
|
667
|
+
expect(result.diagnostics.some((d) => d.ruleId === LEXICON_RESOLUTION_RULE_ID)).toBe(false);
|
|
668
|
+
expect(result.output).toContain("No problems found");
|
|
669
|
+
});
|
|
670
|
+
|
|
671
|
+
test("a chant.config that declares no lexicons still lints clean", async () => {
|
|
672
|
+
await writeFile(join(testDir, "chant.config.ts"), `export default {};\n`);
|
|
673
|
+
|
|
674
|
+
const result = await lintCommand({ path: testDir, format: "stylish" });
|
|
675
|
+
|
|
676
|
+
expect(result.success).toBe(true);
|
|
677
|
+
expect(result.diagnostics.some((d) => d.ruleId === LEXICON_RESOLUTION_RULE_ID)).toBe(false);
|
|
678
|
+
});
|
|
679
|
+
|
|
680
|
+
test("a declared lexicon that does resolve lints clean", async () => {
|
|
681
|
+
await writeFile(join(testDir, "chant.config.ts"), `export default { lexicons: ["aws"] };\n`);
|
|
682
|
+
|
|
683
|
+
const result = await lintCommand({ path: testDir, format: "stylish" });
|
|
684
|
+
|
|
685
|
+
expect(result.success).toBe(true);
|
|
686
|
+
expect(result.diagnostics.some((d) => d.ruleId === LEXICON_RESOLUTION_RULE_ID)).toBe(false);
|
|
687
|
+
});
|
|
688
|
+
});
|