@intentius/chant 0.13.1 → 0.15.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 +45 -5
- package/dist/audit/catalog.d.ts.map +1 -1
- package/dist/audit/proof.d.ts +3 -0
- package/dist/audit/proof.d.ts.map +1 -1
- package/dist/audit/report-model.d.ts +4 -1
- package/dist/audit/report-model.d.ts.map +1 -1
- package/dist/audit/report.d.ts +3 -0
- package/dist/audit/report.d.ts.map +1 -1
- package/dist/audit/rules-doc.d.ts +8 -2
- package/dist/audit/rules-doc.d.ts.map +1 -1
- package/dist/cli/commands/audit.d.ts.map +1 -1
- package/dist/cli/commands/doctor.d.ts.map +1 -1
- package/dist/cli/commands/lexicon-rolling-upgrade.d.ts +37 -0
- package/dist/cli/commands/lexicon-rolling-upgrade.d.ts.map +1 -0
- package/dist/cli/commands/lexicon-surface-diff.d.ts +48 -0
- package/dist/cli/commands/lexicon-surface-diff.d.ts.map +1 -0
- package/dist/cli/commands/lint.d.ts.map +1 -1
- package/dist/cli/commands/pinned-upgrade.d.ts +41 -0
- package/dist/cli/commands/pinned-upgrade.d.ts.map +1 -0
- package/dist/cli/handlers/build.d.ts.map +1 -1
- package/dist/cli/handlers/components.d.ts +39 -0
- package/dist/cli/handlers/components.d.ts.map +1 -0
- package/dist/cli/handlers/dev.d.ts +3 -0
- package/dist/cli/handlers/dev.d.ts.map +1 -1
- package/dist/cli/handlers/graph.d.ts +4 -2
- package/dist/cli/handlers/graph.d.ts.map +1 -1
- package/dist/cli/handlers/misc.d.ts.map +1 -1
- package/dist/cli/handlers/run.d.ts +49 -0
- package/dist/cli/handlers/run.d.ts.map +1 -1
- package/dist/cli/main.d.ts.map +1 -1
- package/dist/cli/registry.d.ts +35 -0
- package/dist/cli/registry.d.ts.map +1 -1
- package/dist/codegen/fetch.d.ts +22 -0
- package/dist/codegen/fetch.d.ts.map +1 -1
- package/dist/codegen/lexicon-regen.d.ts +110 -0
- package/dist/codegen/lexicon-regen.d.ts.map +1 -0
- package/dist/codegen/pinned-upgrade.d.ts +153 -0
- package/dist/codegen/pinned-upgrade.d.ts.map +1 -0
- package/dist/codegen/rolling-upgrade.d.ts +138 -0
- package/dist/codegen/rolling-upgrade.d.ts.map +1 -0
- package/dist/codegen/surface-snapshot.d.ts +173 -0
- package/dist/codegen/surface-snapshot.d.ts.map +1 -0
- package/dist/codegen/version-bump.d.ts +21 -0
- package/dist/codegen/version-bump.d.ts.map +1 -0
- package/dist/components/auto-release.d.ts +93 -0
- package/dist/components/auto-release.d.ts.map +1 -0
- package/dist/components/builders.d.ts +37 -0
- package/dist/components/builders.d.ts.map +1 -0
- package/dist/components/capability-plugin-loader.d.ts +111 -0
- package/dist/components/capability-plugin-loader.d.ts.map +1 -0
- package/dist/components/capability-plugin-schema.d.ts +24 -0
- package/dist/components/capability-plugin-schema.d.ts.map +1 -0
- package/dist/components/capability-plugin.d.ts +85 -0
- package/dist/components/capability-plugin.d.ts.map +1 -0
- package/dist/components/capability.d.ts +89 -0
- package/dist/components/capability.d.ts.map +1 -0
- package/dist/components/cli-support.d.ts +204 -0
- package/dist/components/cli-support.d.ts.map +1 -0
- package/dist/components/component.d.ts +179 -0
- package/dist/components/component.d.ts.map +1 -0
- package/dist/components/config-defaults.d.ts +41 -0
- package/dist/components/config-defaults.d.ts.map +1 -0
- package/dist/components/discover.d.ts +60 -0
- package/dist/components/discover.d.ts.map +1 -0
- package/dist/components/driver-output.d.ts +20 -0
- package/dist/components/driver-output.d.ts.map +1 -0
- package/dist/components/driver.d.ts +209 -0
- package/dist/components/driver.d.ts.map +1 -0
- package/dist/components/index.d.ts +22 -0
- package/dist/components/index.d.ts.map +1 -0
- package/dist/components/manifest-persistence.d.ts +79 -0
- package/dist/components/manifest-persistence.d.ts.map +1 -0
- package/dist/components/pilots/alb-ecs.pilot.d.ts +27 -0
- package/dist/components/pilots/alb-ecs.pilot.d.ts.map +1 -0
- package/dist/components/pilots/dynamodb.pilot.d.ts +22 -0
- package/dist/components/pilots/dynamodb.pilot.d.ts.map +1 -0
- package/dist/components/pilots/jar-emr.pilot.d.ts +37 -0
- package/dist/components/pilots/jar-emr.pilot.d.ts.map +1 -0
- package/dist/components/pilots/lambda.pilot.d.ts +35 -0
- package/dist/components/pilots/lambda.pilot.d.ts.map +1 -0
- package/dist/components/pilots/neo4j-fanout.pilot.d.ts +17 -0
- package/dist/components/pilots/neo4j-fanout.pilot.d.ts.map +1 -0
- package/dist/components/pilots/project.d.ts +13 -0
- package/dist/components/pilots/project.d.ts.map +1 -0
- package/dist/components/presets/ecs-fargate.d.ts +59 -0
- package/dist/components/presets/ecs-fargate.d.ts.map +1 -0
- package/dist/components/presets/index.d.ts +29 -0
- package/dist/components/presets/index.d.ts.map +1 -0
- package/dist/components/presets/lambda.d.ts +35 -0
- package/dist/components/presets/lambda.d.ts.map +1 -0
- package/dist/components/presets/single-host-compose.d.ts +43 -0
- package/dist/components/presets/single-host-compose.d.ts.map +1 -0
- package/dist/components/registry.d.ts +29 -0
- package/dist/components/registry.d.ts.map +1 -0
- package/dist/components/starter-plugin.d.ts +51 -0
- package/dist/components/starter-plugin.d.ts.map +1 -0
- package/dist/components/temporal-codegen-loader.d.ts +27 -0
- package/dist/components/temporal-codegen-loader.d.ts.map +1 -0
- package/dist/components/verbs/__tests__/mock-cloud-executor.d.ts +35 -0
- package/dist/components/verbs/__tests__/mock-cloud-executor.d.ts.map +1 -0
- package/dist/components/verbs/__tests__/mock-process-runner.d.ts +45 -0
- package/dist/components/verbs/__tests__/mock-process-runner.d.ts.map +1 -0
- package/dist/components/verbs/__tests__/mock-sbom-generator.d.ts +33 -0
- package/dist/components/verbs/__tests__/mock-sbom-generator.d.ts.map +1 -0
- package/dist/components/verbs/bom-writer.d.ts +155 -0
- package/dist/components/verbs/bom-writer.d.ts.map +1 -0
- package/dist/components/verbs/build-archive.d.ts +205 -0
- package/dist/components/verbs/build-archive.d.ts.map +1 -0
- package/dist/components/verbs/build.d.ts +150 -0
- package/dist/components/verbs/build.d.ts.map +1 -0
- package/dist/components/verbs/cloud-executor.d.ts +88 -0
- package/dist/components/verbs/cloud-executor.d.ts.map +1 -0
- package/dist/components/verbs/component-bom.d.ts +103 -0
- package/dist/components/verbs/component-bom.d.ts.map +1 -0
- package/dist/components/verbs/index.d.ts +49 -0
- package/dist/components/verbs/index.d.ts.map +1 -0
- package/dist/components/verbs/license-policy.d.ts +56 -0
- package/dist/components/verbs/license-policy.d.ts.map +1 -0
- package/dist/components/verbs/lockfile-sbom-generator.d.ts +81 -0
- package/dist/components/verbs/lockfile-sbom-generator.d.ts.map +1 -0
- package/dist/components/verbs/process-runner.d.ts +64 -0
- package/dist/components/verbs/process-runner.d.ts.map +1 -0
- package/dist/components/verbs/reproducibility.d.ts +80 -0
- package/dist/components/verbs/reproducibility.d.ts.map +1 -0
- package/dist/components/verbs/sbom-generator.d.ts +157 -0
- package/dist/components/verbs/sbom-generator.d.ts.map +1 -0
- package/dist/components/verbs/sbom.d.ts +79 -0
- package/dist/components/verbs/sbom.d.ts.map +1 -0
- package/dist/components/verbs/shell.d.ts +35 -0
- package/dist/components/verbs/shell.d.ts.map +1 -0
- package/dist/components/verbs/sign.d.ts +222 -0
- package/dist/components/verbs/sign.d.ts.map +1 -0
- package/dist/components/verbs/stub.d.ts +18 -0
- package/dist/components/verbs/stub.d.ts.map +1 -0
- package/dist/components/verbs/tool-sbom-generator.d.ts +51 -0
- package/dist/components/verbs/tool-sbom-generator.d.ts.map +1 -0
- package/dist/components/verbs/verify.d.ts +106 -0
- package/dist/components/verbs/verify.d.ts.map +1 -0
- package/dist/components/verbs/vex.d.ts +65 -0
- package/dist/components/verbs/vex.d.ts.map +1 -0
- package/dist/components/verbs/vuln-gate.d.ts +91 -0
- package/dist/components/verbs/vuln-gate.d.ts.map +1 -0
- package/dist/components/verbs/vuln-scan.d.ts +116 -0
- package/dist/components/verbs/vuln-scan.d.ts.map +1 -0
- package/dist/components/verbs/wait-verify.d.ts +85 -0
- package/dist/components/verbs/wait-verify.d.ts.map +1 -0
- package/dist/config.d.ts +205 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/lexicon.d.ts +78 -0
- package/dist/lexicon.d.ts.map +1 -1
- package/dist/lifecycle/build-ledger-store.d.ts +121 -0
- package/dist/lifecycle/build-ledger-store.d.ts.map +1 -0
- package/dist/lifecycle/build-ledger.d.ts +225 -0
- package/dist/lifecycle/build-ledger.d.ts.map +1 -0
- package/dist/lifecycle/git.d.ts +84 -0
- package/dist/lifecycle/git.d.ts.map +1 -1
- package/dist/lifecycle/index.d.ts +5 -0
- package/dist/lifecycle/index.d.ts.map +1 -1
- package/dist/lifecycle/oras-referrer-lookup.d.ts +41 -0
- package/dist/lifecycle/oras-referrer-lookup.d.ts.map +1 -0
- package/dist/lifecycle/release-ledger.d.ts +122 -0
- package/dist/lifecycle/release-ledger.d.ts.map +1 -0
- package/dist/lifecycle/status.d.ts +150 -0
- package/dist/lifecycle/status.d.ts.map +1 -0
- package/dist/lint/component-checks.d.ts +95 -0
- package/dist/lint/component-checks.d.ts.map +1 -0
- package/dist/lint/engine.d.ts +23 -0
- package/dist/lint/engine.d.ts.map +1 -1
- package/dist/lint/presets/strict.json +8 -1
- package/dist/lint/rules/__fixtures__/comp/comp000-discovery-error/broken-a.component.d.ts +4 -0
- package/dist/lint/rules/__fixtures__/comp/comp000-discovery-error/broken-a.component.d.ts.map +1 -0
- package/dist/lint/rules/__fixtures__/comp/comp000-discovery-error/broken-b.component.d.ts +4 -0
- package/dist/lint/rules/__fixtures__/comp/comp000-discovery-error/broken-b.component.d.ts.map +1 -0
- package/dist/lint/rules/__fixtures__/comp/comp001/fail/orphan-lib.component.d.ts +4 -0
- package/dist/lint/rules/__fixtures__/comp/comp001/fail/orphan-lib.component.d.ts.map +1 -0
- package/dist/lint/rules/__fixtures__/comp/comp001/pass/emr-job.component.d.ts +4 -0
- package/dist/lint/rules/__fixtures__/comp/comp001/pass/emr-job.component.d.ts.map +1 -0
- package/dist/lint/rules/__fixtures__/comp/comp001/pass/jar-lib.component.d.ts +4 -0
- package/dist/lint/rules/__fixtures__/comp/comp001/pass/jar-lib.component.d.ts.map +1 -0
- package/dist/lint/rules/__fixtures__/comp/comp002/fail/search-service.component.d.ts +10 -0
- package/dist/lint/rules/__fixtures__/comp/comp002/fail/search-service.component.d.ts.map +1 -0
- package/dist/lint/rules/__fixtures__/comp/comp002/pass/jar-lib.component.d.ts +3 -0
- package/dist/lint/rules/__fixtures__/comp/comp002/pass/jar-lib.component.d.ts.map +1 -0
- package/dist/lint/rules/__fixtures__/comp/comp002/pass/search-service.component.d.ts +4 -0
- package/dist/lint/rules/__fixtures__/comp/comp002/pass/search-service.component.d.ts.map +1 -0
- package/dist/lint/rules/__fixtures__/comp/comp003/fail/migrator.component.d.ts +4 -0
- package/dist/lint/rules/__fixtures__/comp/comp003/fail/migrator.component.d.ts.map +1 -0
- package/dist/lint/rules/__fixtures__/comp/comp003/pass/migrator.component.d.ts +4 -0
- package/dist/lint/rules/__fixtures__/comp/comp003/pass/migrator.component.d.ts.map +1 -0
- package/dist/lint/rules/__fixtures__/comp/comp003/pass/orders-table.component.d.ts +4 -0
- package/dist/lint/rules/__fixtures__/comp/comp003/pass/orders-table.component.d.ts.map +1 -0
- package/dist/lint/rules/__fixtures__/comp/comp004/fail/neo4j-cluster.component.d.ts +4 -0
- package/dist/lint/rules/__fixtures__/comp/comp004/fail/neo4j-cluster.component.d.ts.map +1 -0
- package/dist/lint/rules/__fixtures__/comp/comp004/pass/neo4j-cluster.component.d.ts +4 -0
- package/dist/lint/rules/__fixtures__/comp/comp004/pass/neo4j-cluster.component.d.ts.map +1 -0
- package/dist/lint/rules/__fixtures__/comp/comp004/pass/orders-table.component.d.ts +4 -0
- package/dist/lint/rules/__fixtures__/comp/comp004/pass/orders-table.component.d.ts.map +1 -0
- package/dist/lint/rules/__fixtures__/comp/comp005/fail/search-service.component.d.ts +4 -0
- package/dist/lint/rules/__fixtures__/comp/comp005/fail/search-service.component.d.ts.map +1 -0
- package/dist/lint/rules/__fixtures__/comp/comp005/pass/search-service.component.d.ts +4 -0
- package/dist/lint/rules/__fixtures__/comp/comp005/pass/search-service.component.d.ts.map +1 -0
- package/dist/lint/rules/__fixtures__/comp/comp006/fail/legacy-tool.component.d.ts +4 -0
- package/dist/lint/rules/__fixtures__/comp/comp006/fail/legacy-tool.component.d.ts.map +1 -0
- package/dist/lint/rules/__fixtures__/comp/comp006/pass/legacy-tool.component.d.ts +4 -0
- package/dist/lint/rules/__fixtures__/comp/comp006/pass/legacy-tool.component.d.ts.map +1 -0
- package/dist/lint/rules/__fixtures__/comp/comp007/fail/inventory-table.component.d.ts +4 -0
- package/dist/lint/rules/__fixtures__/comp/comp007/fail/inventory-table.component.d.ts.map +1 -0
- package/dist/lint/rules/__fixtures__/comp/comp007/fail/orders-table.component.d.ts +4 -0
- package/dist/lint/rules/__fixtures__/comp/comp007/fail/orders-table.component.d.ts.map +1 -0
- package/dist/lint/rules/__fixtures__/comp/comp007/pass/orders-table.component.d.ts +3 -0
- package/dist/lint/rules/__fixtures__/comp/comp007/pass/orders-table.component.d.ts.map +1 -0
- package/dist/lint/rules/__fixtures__/comp/comp007/pass/search-service.component.d.ts +4 -0
- package/dist/lint/rules/__fixtures__/comp/comp007/pass/search-service.component.d.ts.map +1 -0
- package/dist/lint/rules/comp/comp001-publishes-never-applies.d.ts +20 -0
- package/dist/lint/rules/comp/comp001-publishes-never-applies.d.ts.map +1 -0
- package/dist/lint/rules/comp/comp002-dangling-wiring-ref.d.ts +28 -0
- package/dist/lint/rules/comp/comp002-dangling-wiring-ref.d.ts.map +1 -0
- package/dist/lint/rules/comp/comp003-mutating-no-rollback.d.ts +39 -0
- package/dist/lint/rules/comp/comp003-mutating-no-rollback.d.ts.map +1 -0
- package/dist/lint/rules/comp/comp004-gate-needs-temporal.d.ts +37 -0
- package/dist/lint/rules/comp/comp004-gate-needs-temporal.d.ts.map +1 -0
- package/dist/lint/rules/comp/comp005-capability-kind-is-noun.d.ts +43 -0
- package/dist/lint/rules/comp/comp005-capability-kind-is-noun.d.ts.map +1 -0
- package/dist/lint/rules/comp/comp006-shell-needs-reason.d.ts +22 -0
- package/dist/lint/rules/comp/comp006-shell-needs-reason.d.ts.map +1 -0
- package/dist/lint/rules/comp/comp007-composition-sprawl.d.ts +33 -0
- package/dist/lint/rules/comp/comp007-composition-sprawl.d.ts.map +1 -0
- package/dist/lint/rules/comp/index.d.ts +18 -0
- package/dist/lint/rules/comp/index.d.ts.map +1 -0
- package/dist/lint/rules/comp/support.d.ts +71 -0
- package/dist/lint/rules/comp/support.d.ts.map +1 -0
- package/dist/lsp/lexicon-providers.d.ts.map +1 -1
- package/dist/op/activity-registry.d.ts +11 -6
- package/dist/op/activity-registry.d.ts.map +1 -1
- package/dist/op/activity-runtime.d.ts +24 -0
- package/dist/op/activity-runtime.d.ts.map +1 -0
- package/dist/op/builders.d.ts +56 -0
- package/dist/op/builders.d.ts.map +1 -1
- package/dist/op/index.d.ts +2 -1
- package/dist/op/index.d.ts.map +1 -1
- package/dist/ownership.d.ts +20 -14
- package/dist/ownership.d.ts.map +1 -1
- package/package.json +14 -1
- package/src/audit/catalog.test.ts +74 -22
- package/src/audit/catalog.ts +74 -471
- package/src/audit/proof.ts +4 -2
- package/src/audit/report-html.test.ts +14 -7
- package/src/audit/report-model.ts +20 -9
- package/src/audit/report.test.ts +36 -13
- package/src/audit/report.ts +2 -0
- package/src/audit/rules-doc.test.ts +8 -6
- package/src/audit/rules-doc.ts +13 -5
- package/src/cli/commands/audit.ts +23 -18
- package/src/cli/commands/component-lint.test.ts +158 -0
- package/src/cli/commands/doctor.test.ts +116 -2
- package/src/cli/commands/doctor.ts +46 -0
- package/src/cli/commands/lexicon-rolling-upgrade.ts +198 -0
- package/src/cli/commands/lexicon-surface-diff.test.ts +104 -0
- package/src/cli/commands/lexicon-surface-diff.ts +185 -0
- package/src/cli/commands/lint.ts +142 -1
- package/src/cli/commands/pinned-upgrade.ts +204 -0
- package/src/cli/handlers/build.ts +58 -1
- package/src/cli/handlers/components.test.ts +504 -0
- package/src/cli/handlers/components.ts +404 -0
- package/src/cli/handlers/dev.ts +60 -1
- package/src/cli/handlers/graph.ts +47 -2
- package/src/cli/handlers/misc.ts +45 -1
- package/src/cli/handlers/run.test.ts +967 -3
- package/src/cli/handlers/run.ts +618 -11
- package/src/cli/main.test.ts +66 -0
- package/src/cli/main.ts +105 -2
- package/src/cli/registry.ts +35 -0
- package/src/codegen/fetch.test.ts +84 -3
- package/src/codegen/fetch.ts +76 -2
- package/src/codegen/lexicon-regen.test.ts +298 -0
- package/src/codegen/lexicon-regen.ts +545 -0
- package/src/codegen/pinned-upgrade.test.ts +399 -0
- package/src/codegen/pinned-upgrade.ts +423 -0
- package/src/codegen/rolling-upgrade.test.ts +333 -0
- package/src/codegen/rolling-upgrade.ts +320 -0
- package/src/codegen/surface-snapshot.test.ts +461 -0
- package/src/codegen/surface-snapshot.ts +546 -0
- package/src/codegen/version-bump.test.ts +47 -0
- package/src/codegen/version-bump.ts +39 -0
- package/src/components/README.md +130 -0
- package/src/components/SPRAWL-VALIDATION.md +181 -0
- package/src/components/__fixtures__/alb-ecs-service.json +51 -0
- package/src/components/__fixtures__/dynamodb-infra.json +32 -0
- package/src/components/__fixtures__/emr-job-consumer.json +26 -0
- package/src/components/__fixtures__/jar-lib-producer.json +16 -0
- package/src/components/__fixtures__/lambda-image-processor.json +28 -0
- package/src/components/__fixtures__/neo4j-fanout.json +34 -0
- package/src/components/__fixtures__/single-host-compose.json +29 -0
- package/src/components/auto-release.test.ts +217 -0
- package/src/components/auto-release.ts +216 -0
- package/src/components/builders.test.ts +45 -0
- package/src/components/builders.ts +71 -0
- package/src/components/capability-plugin-loader.ts +218 -0
- package/src/components/capability-plugin-schema.ts +56 -0
- package/src/components/capability-plugin.test.ts +235 -0
- package/src/components/capability-plugin.ts +108 -0
- package/src/components/capability.ts +117 -0
- package/src/components/cli-support.test.ts +579 -0
- package/src/components/cli-support.ts +481 -0
- package/src/components/component-schema.test.ts +265 -0
- package/src/components/component.schema.json +235 -0
- package/src/components/component.test.ts +251 -0
- package/src/components/component.ts +255 -0
- package/src/components/config-defaults.test.ts +263 -0
- package/src/components/config-defaults.ts +145 -0
- package/src/components/discover.test.ts +352 -0
- package/src/components/discover.ts +167 -0
- package/src/components/driver-output.ts +71 -0
- package/src/components/driver.test.ts +638 -0
- package/src/components/driver.ts +690 -0
- package/src/components/index.ts +113 -0
- package/src/components/manifest-persistence.test.ts +152 -0
- package/src/components/manifest-persistence.ts +164 -0
- package/src/components/pilots/README.md +33 -0
- package/src/components/pilots/alb-ecs.pilot.ts +63 -0
- package/src/components/pilots/dynamodb.pilot.ts +59 -0
- package/src/components/pilots/jar-emr.pilot.ts +69 -0
- package/src/components/pilots/lambda.pilot.ts +55 -0
- package/src/components/pilots/neo4j-fanout.pilot.ts +92 -0
- package/src/components/pilots/pilots-lint-clean.test.ts +78 -0
- package/src/components/pilots/pilots.test.ts +126 -0
- package/src/components/pilots/project.ts +13 -0
- package/src/components/presets/comp007-reduction.test.ts +122 -0
- package/src/components/presets/ecs-fargate.test.ts +84 -0
- package/src/components/presets/ecs-fargate.ts +103 -0
- package/src/components/presets/index.ts +32 -0
- package/src/components/presets/lambda.test.ts +35 -0
- package/src/components/presets/lambda.ts +53 -0
- package/src/components/presets/single-host-compose.test.ts +65 -0
- package/src/components/presets/single-host-compose.ts +64 -0
- package/src/components/registry.test.ts +112 -0
- package/src/components/registry.ts +37 -0
- package/src/components/starter-plugin.ts +105 -0
- package/src/components/temporal-codegen-loader.ts +41 -0
- package/src/components/verbs/__fixtures__/package-lock.json +45 -0
- package/src/components/verbs/__fixtures__/pom.xml +37 -0
- package/src/components/verbs/__fixtures__/schemas/cyclonedx-1.5.schema.json +3800 -0
- package/src/components/verbs/__fixtures__/schemas/cyclonedx-spdx-license.schema.json +621 -0
- package/src/components/verbs/__fixtures__/schemas/jsf-0.82.schema.json +240 -0
- package/src/components/verbs/__fixtures__/schemas/spdx-2.3.schema.json +740 -0
- package/src/components/verbs/__tests__/mock-cloud-executor.ts +102 -0
- package/src/components/verbs/__tests__/mock-process-runner.ts +79 -0
- package/src/components/verbs/__tests__/mock-sbom-generator.ts +85 -0
- package/src/components/verbs/bom-writer.test.ts +331 -0
- package/src/components/verbs/bom-writer.ts +386 -0
- package/src/components/verbs/build-archive.test.ts +251 -0
- package/src/components/verbs/build-archive.ts +296 -0
- package/src/components/verbs/build.test.ts +222 -0
- package/src/components/verbs/build.ts +252 -0
- package/src/components/verbs/cloud-executor.ts +181 -0
- package/src/components/verbs/component-bom.test.ts +219 -0
- package/src/components/verbs/component-bom.ts +189 -0
- package/src/components/verbs/index.ts +49 -0
- package/src/components/verbs/license-policy.ts +115 -0
- package/src/components/verbs/lockfile-sbom-generator.test.ts +195 -0
- package/src/components/verbs/lockfile-sbom-generator.ts +236 -0
- package/src/components/verbs/process-runner.test.ts +79 -0
- package/src/components/verbs/process-runner.ts +113 -0
- package/src/components/verbs/reproducibility.test.ts +24 -0
- package/src/components/verbs/reproducibility.ts +100 -0
- package/src/components/verbs/sbom-generator.test.ts +96 -0
- package/src/components/verbs/sbom-generator.ts +209 -0
- package/src/components/verbs/sbom.test.ts +184 -0
- package/src/components/verbs/sbom.ts +152 -0
- package/src/components/verbs/shell.test.ts +36 -0
- package/src/components/verbs/shell.ts +51 -0
- package/src/components/verbs/sign.test.ts +210 -0
- package/src/components/verbs/sign.ts +350 -0
- package/src/components/verbs/stub.ts +34 -0
- package/src/components/verbs/tool-sbom-generator.test.ts +194 -0
- package/src/components/verbs/tool-sbom-generator.ts +192 -0
- package/src/components/verbs/verify.test.ts +159 -0
- package/src/components/verbs/verify.ts +179 -0
- package/src/components/verbs/vex.ts +182 -0
- package/src/components/verbs/vuln-gate.test.ts +201 -0
- package/src/components/verbs/vuln-gate.ts +170 -0
- package/src/components/verbs/vuln-scan.test.ts +145 -0
- package/src/components/verbs/vuln-scan.ts +266 -0
- package/src/components/verbs/wait-verify.test.ts +111 -0
- package/src/components/verbs/wait-verify.ts +171 -0
- package/src/config.test.ts +74 -1
- package/src/config.ts +219 -0
- package/src/index.ts +32 -0
- package/src/lexicon.ts +88 -0
- package/src/lifecycle/build-ledger-store.test.ts +217 -0
- package/src/lifecycle/build-ledger-store.ts +165 -0
- package/src/lifecycle/build-ledger.test.ts +349 -0
- package/src/lifecycle/build-ledger.ts +305 -0
- package/src/lifecycle/git.test.ts +118 -0
- package/src/lifecycle/git.ts +149 -14
- package/src/lifecycle/index.ts +5 -0
- package/src/lifecycle/oras-referrer-lookup.test.ts +116 -0
- package/src/lifecycle/oras-referrer-lookup.ts +110 -0
- package/src/lifecycle/release-ledger.test.ts +209 -0
- package/src/lifecycle/release-ledger.ts +185 -0
- package/src/lifecycle/status.test.ts +330 -0
- package/src/lifecycle/status.ts +278 -0
- package/src/lint/component-checks.ts +148 -0
- package/src/lint/config.test.ts +21 -0
- package/src/lint/engine.ts +11 -2
- package/src/lint/presets/relaxed.json +8 -1
- package/src/lint/presets/strict.json +8 -1
- package/src/lint/rules/__fixtures__/comp/comp000-discovery-error/broken-a.component.ts +9 -0
- package/src/lint/rules/__fixtures__/comp/comp000-discovery-error/broken-b.component.ts +9 -0
- package/src/lint/rules/__fixtures__/comp/comp001/fail/orphan-lib.component.ts +11 -0
- package/src/lint/rules/__fixtures__/comp/comp001/pass/emr-job.component.ts +13 -0
- package/src/lint/rules/__fixtures__/comp/comp001/pass/jar-lib.component.ts +11 -0
- package/src/lint/rules/__fixtures__/comp/comp002/fail/search-service.component.ts +27 -0
- package/src/lint/rules/__fixtures__/comp/comp002/pass/jar-lib.component.ts +10 -0
- package/src/lint/rules/__fixtures__/comp/comp002/pass/search-service.component.ts +23 -0
- package/src/lint/rules/__fixtures__/comp/comp003/fail/migrator.component.ts +10 -0
- package/src/lint/rules/__fixtures__/comp/comp003/pass/migrator.component.ts +19 -0
- package/src/lint/rules/__fixtures__/comp/comp003/pass/orders-table.component.ts +10 -0
- package/src/lint/rules/__fixtures__/comp/comp004/fail/neo4j-cluster.component.ts +20 -0
- package/src/lint/rules/__fixtures__/comp/comp004/pass/neo4j-cluster.component.ts +23 -0
- package/src/lint/rules/__fixtures__/comp/comp004/pass/orders-table.component.ts +10 -0
- package/src/lint/rules/__fixtures__/comp/comp005/fail/search-service.component.ts +14 -0
- package/src/lint/rules/__fixtures__/comp/comp005/pass/search-service.component.ts +18 -0
- package/src/lint/rules/__fixtures__/comp/comp006/fail/legacy-tool.component.ts +10 -0
- package/src/lint/rules/__fixtures__/comp/comp006/pass/legacy-tool.component.ts +14 -0
- package/src/lint/rules/__fixtures__/comp/comp007/fail/inventory-table.component.ts +13 -0
- package/src/lint/rules/__fixtures__/comp/comp007/fail/orders-table.component.ts +13 -0
- package/src/lint/rules/__fixtures__/comp/comp007/pass/orders-table.component.ts +12 -0
- package/src/lint/rules/__fixtures__/comp/comp007/pass/search-service.component.ts +18 -0
- package/src/lint/rules/comp/comp.test.ts +378 -0
- package/src/lint/rules/comp/comp001-publishes-never-applies.ts +78 -0
- package/src/lint/rules/comp/comp002-dangling-wiring-ref.ts +94 -0
- package/src/lint/rules/comp/comp003-mutating-no-rollback.ts +115 -0
- package/src/lint/rules/comp/comp004-gate-needs-temporal.ts +66 -0
- package/src/lint/rules/comp/comp005-capability-kind-is-noun.ts +113 -0
- package/src/lint/rules/comp/comp006-shell-needs-reason.ts +55 -0
- package/src/lint/rules/comp/comp007-composition-sprawl.ts +71 -0
- package/src/lint/rules/comp/index.ts +37 -0
- package/src/lint/rules/comp/support.ts +173 -0
- package/src/lsp/lexicon-providers.test.ts +55 -0
- package/src/lsp/lexicon-providers.ts +13 -3
- package/src/op/activity-registry.test.ts +38 -0
- package/src/op/activity-registry.ts +31 -12
- package/src/op/activity-runtime.ts +73 -0
- package/src/op/builders.ts +92 -0
- package/src/op/index.ts +3 -1
- package/src/ownership.test.ts +24 -26
- package/src/ownership.ts +26 -38
package/src/cli/commands/lint.ts
CHANGED
|
@@ -1,11 +1,15 @@
|
|
|
1
1
|
import { resolve, join } from "path";
|
|
2
2
|
import { readFileSync, writeFileSync, readdirSync, statSync } from "fs";
|
|
3
|
-
import { runLint } from "../../lint/engine";
|
|
3
|
+
import { runLint, parseDisableComments } from "../../lint/engine";
|
|
4
4
|
import type { LintRule, LintDiagnostic, LintFix } from "../../lint/rule";
|
|
5
5
|
import { loadPlugins, resolveProjectLexicons } from "../plugins";
|
|
6
6
|
import { formatStylish, formatJson, formatSarif } from "../reporters/stylish";
|
|
7
7
|
import { loadLocalRules } from "../../lint/rule-loader";
|
|
8
8
|
import { loadCoreRules } from "../../lint/rules/index";
|
|
9
|
+
import { loadComponentChecks } from "../../lint/rules/comp/index";
|
|
10
|
+
import { runComponentChecks, type ComponentCheckDiagnostic } from "../../lint/component-checks";
|
|
11
|
+
import { buildCapabilityRegistry } from "../../components/capability-plugin-loader";
|
|
12
|
+
import type { RollbackPolicy } from "../../components/capability";
|
|
9
13
|
import { rule } from "../../lint/declarative";
|
|
10
14
|
import { watchDirectory, formatTimestamp, formatChangedFiles } from "../watch";
|
|
11
15
|
import { formatError, formatInfo } from "../format";
|
|
@@ -203,6 +207,126 @@ function getDefaultRules(
|
|
|
203
207
|
return { rules, ruleOptions };
|
|
204
208
|
}
|
|
205
209
|
|
|
210
|
+
/**
|
|
211
|
+
* Run the COMP* composition checks (#562) over the discovered `Component`
|
|
212
|
+
* graph and convert their results into plain `LintDiagnostic`s so they merge
|
|
213
|
+
* into the same `chant lint` output (stylish/json/sarif) and the same
|
|
214
|
+
* error-count gating as every COR/EVL diagnostic.
|
|
215
|
+
*
|
|
216
|
+
* These checks operate on the whole discovered component graph, not one
|
|
217
|
+
* `ts.SourceFile`, so they carry no real line/column — reported at `1:1` in
|
|
218
|
+
* the file the component was declared in (matching COR009's whole-file
|
|
219
|
+
* diagnostic convention, see ../../lint/rules/file-declarable-limit.ts).
|
|
220
|
+
* Config severity overrides (`lint.rules["COMP001"]`, including `"off"`) are
|
|
221
|
+
* honored the same way `getDefaultRules` honors them for AST rules. Only the
|
|
222
|
+
* *file-level* disable directive form (`// chant-disable` /
|
|
223
|
+
* `// chant-disable COMP004 -- reason`, anywhere in the file) is honored —
|
|
224
|
+
* `-line`/`-next-line` need an exact line to match against, which a
|
|
225
|
+
* whole-component diagnostic does not have; see
|
|
226
|
+
* docs/lint-rules/composition.mdx for this documented limitation.
|
|
227
|
+
*/
|
|
228
|
+
/**
|
|
229
|
+
* Build the registry-derived context composition checks need — the set of
|
|
230
|
+
* capability kinds registered for this project (core's starter set plus the
|
|
231
|
+
* active lexicons' leaves, e.g. `cfn-deploy` when `lexicons: ["aws"]`) and each
|
|
232
|
+
* verb's rollback disposition — so COMP005/COMP003 read real registry facts
|
|
233
|
+
* rather than hard-coding verb lists. A verb's rollback policy is its own
|
|
234
|
+
* declaration (`rollbackPolicy`), else derived: a paired `rollback` method is
|
|
235
|
+
* `"native"`, everything else `"none-by-design"`. Tolerant: any failure (an
|
|
236
|
+
* unresolvable lexicon, a config-less directory) returns `undefined` fields,
|
|
237
|
+
* letting the checks fall back to core's starter set.
|
|
238
|
+
*/
|
|
239
|
+
async function resolveRegistryContext(
|
|
240
|
+
infraPath: string,
|
|
241
|
+
): Promise<{ knownKinds?: ReadonlySet<string>; rollbackPolicies?: ReadonlyMap<string, RollbackPolicy> }> {
|
|
242
|
+
try {
|
|
243
|
+
const lexicons = await resolveProjectLexicons(infraPath).catch(() => [] as string[]);
|
|
244
|
+
const registry = await buildCapabilityRegistry({ lexicons });
|
|
245
|
+
const kinds = registry.kinds();
|
|
246
|
+
const rollbackPolicies = new Map<string, RollbackPolicy>();
|
|
247
|
+
for (const kind of kinds) {
|
|
248
|
+
const capability = registry.resolve(kind);
|
|
249
|
+
rollbackPolicies.set(kind, capability.rollbackPolicy ?? (capability.rollback ? "native" : "none-by-design"));
|
|
250
|
+
}
|
|
251
|
+
return { knownKinds: new Set(kinds), rollbackPolicies };
|
|
252
|
+
} catch {
|
|
253
|
+
return {};
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
async function runComponentCheckDiagnostics(
|
|
258
|
+
infraPath: string,
|
|
259
|
+
): Promise<{ diagnostics: LintDiagnostic[]; suppressed: Array<LintDiagnostic & { reason?: string }> }> {
|
|
260
|
+
const config = loadConfig(infraPath);
|
|
261
|
+
const checks = loadComponentChecks();
|
|
262
|
+
const allCheckIds = new Set(checks.map((c) => c.id));
|
|
263
|
+
|
|
264
|
+
const registryContext = await resolveRegistryContext(infraPath);
|
|
265
|
+
const raw = await runComponentChecks(infraPath, checks, registryContext);
|
|
266
|
+
|
|
267
|
+
const fileDirectivesCache = new Map<string, ReturnType<typeof parseDisableComments>>();
|
|
268
|
+
const fileLevelDisable = (
|
|
269
|
+
file: string,
|
|
270
|
+
checkId: string,
|
|
271
|
+
): { suppressed: boolean; reason?: string } => {
|
|
272
|
+
let directives = fileDirectivesCache.get(file);
|
|
273
|
+
if (!directives) {
|
|
274
|
+
let content = "";
|
|
275
|
+
try {
|
|
276
|
+
content = readFileSync(file, "utf-8");
|
|
277
|
+
} catch {
|
|
278
|
+
// File may be unreadable (e.g. a synthetic discovery-error path) — no directives to honor.
|
|
279
|
+
}
|
|
280
|
+
directives = parseDisableComments(content);
|
|
281
|
+
fileDirectivesCache.set(file, directives);
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
for (const directive of directives) {
|
|
285
|
+
if (directive.type !== "file") continue;
|
|
286
|
+
if (!directive.ruleIds) return { suppressed: true, reason: directive.reason };
|
|
287
|
+
if (directive.ruleIds.some((id) => allCheckIds.has(id) || id === "COMP000") && directive.ruleIds.includes(checkId)) {
|
|
288
|
+
return { suppressed: true, reason: directive.reason };
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
return { suppressed: false };
|
|
292
|
+
};
|
|
293
|
+
|
|
294
|
+
const toLintDiagnostic = (d: ComponentCheckDiagnostic, severity: LintDiagnostic["severity"]): LintDiagnostic => ({
|
|
295
|
+
file: d.file,
|
|
296
|
+
line: 1,
|
|
297
|
+
column: 1,
|
|
298
|
+
ruleId: d.checkId,
|
|
299
|
+
severity,
|
|
300
|
+
message: d.message,
|
|
301
|
+
});
|
|
302
|
+
|
|
303
|
+
const diagnostics: LintDiagnostic[] = [];
|
|
304
|
+
const suppressed: Array<LintDiagnostic & { reason?: string }> = [];
|
|
305
|
+
|
|
306
|
+
for (const d of raw) {
|
|
307
|
+
// Discovery errors (COMP000) always surface at error severity — not user-configurable.
|
|
308
|
+
let severity = d.severity;
|
|
309
|
+
if (d.checkId !== "COMP000") {
|
|
310
|
+
const configValue = config.rules?.[d.checkId];
|
|
311
|
+
if (configValue !== undefined) {
|
|
312
|
+
const parsed = parseRuleConfig(configValue);
|
|
313
|
+
if (parsed.severity === "off") continue;
|
|
314
|
+
severity = parsed.severity;
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
const disable = fileLevelDisable(d.file, d.checkId);
|
|
319
|
+
const diagnostic = toLintDiagnostic(d, severity);
|
|
320
|
+
if (disable.suppressed) {
|
|
321
|
+
suppressed.push({ ...diagnostic, reason: disable.reason });
|
|
322
|
+
} else {
|
|
323
|
+
diagnostics.push(diagnostic);
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
return { diagnostics, suppressed };
|
|
328
|
+
}
|
|
329
|
+
|
|
206
330
|
/**
|
|
207
331
|
* Apply fixes to a file
|
|
208
332
|
*/
|
|
@@ -264,6 +388,15 @@ export async function lintCommand(options: LintOptions): Promise<LintResult> {
|
|
|
264
388
|
suppressed = result.suppressed;
|
|
265
389
|
}
|
|
266
390
|
|
|
391
|
+
// Run the COMP* composition checks (#562) over the discovered `Component`
|
|
392
|
+
// graph and merge them into the same diagnostics/suppressed lists — a
|
|
393
|
+
// structurally distinct check family (whole-project, post-discovery,
|
|
394
|
+
// see ../../lint/component-checks.ts) but the same `chant lint` output and
|
|
395
|
+
// the same error-severity gating as every COR/EVL diagnostic.
|
|
396
|
+
const componentResult = await runComponentCheckDiagnostics(infraPath);
|
|
397
|
+
diagnostics.push(...componentResult.diagnostics);
|
|
398
|
+
suppressed.push(...componentResult.suppressed);
|
|
399
|
+
|
|
267
400
|
// Apply fixes if requested
|
|
268
401
|
if (options.fix) {
|
|
269
402
|
// Group fixes by file
|
|
@@ -303,6 +436,14 @@ export async function lintCommand(options: LintOptions): Promise<LintResult> {
|
|
|
303
436
|
diagnostics = postResult.diagnostics;
|
|
304
437
|
suppressed = postResult.suppressed;
|
|
305
438
|
}
|
|
439
|
+
|
|
440
|
+
// COMP* checks have no `.fix` (nothing above could have touched a
|
|
441
|
+
// `*.component.ts` file on their behalf), but a fix applied to another
|
|
442
|
+
// rule could still be in the same file a component was discovered from —
|
|
443
|
+
// re-run for consistency with the AST re-lint above.
|
|
444
|
+
const postComponentResult = await runComponentCheckDiagnostics(infraPath);
|
|
445
|
+
diagnostics.push(...postComponentResult.diagnostics);
|
|
446
|
+
suppressed.push(...postComponentResult.suppressed);
|
|
306
447
|
}
|
|
307
448
|
|
|
308
449
|
// Count errors and warnings
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `chant dev pinned-upgrade <lexicon-dir>` command implementation.
|
|
3
|
+
*
|
|
4
|
+
* Detects whether a pinned-version lexicon (k8s, gcp, docker, gitlab) has a
|
|
5
|
+
* newer stable upstream release. When it does, it dry-run bumps the pinned
|
|
6
|
+
* version constant, regenerates + surface-diffs (via #524's regenLexicon), then
|
|
7
|
+
* reverts the bump — leaving the working tree unchanged.
|
|
8
|
+
*
|
|
9
|
+
* This command only REPORTS. Branch/PR automation lives in #527.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import { existsSync } from "fs";
|
|
13
|
+
import { basename, resolve } from "path";
|
|
14
|
+
import {
|
|
15
|
+
checkPinnedUpgrade,
|
|
16
|
+
type LexiconId,
|
|
17
|
+
type UpgradeCheckResult,
|
|
18
|
+
} from "../../codegen/pinned-upgrade";
|
|
19
|
+
|
|
20
|
+
const PINNED_LEXICONS: readonly LexiconId[] = ["k8s", "gcp", "docker", "gitlab"];
|
|
21
|
+
|
|
22
|
+
export interface PinnedUpgradeOptions {
|
|
23
|
+
/** Resolved path to the lexicon directory. */
|
|
24
|
+
lexiconDir: string;
|
|
25
|
+
/** Explicit lexicon id; inferred from the directory name when omitted. */
|
|
26
|
+
lexicon?: LexiconId;
|
|
27
|
+
/** Force re-fetch of the upstream spec during regen. */
|
|
28
|
+
force?: boolean;
|
|
29
|
+
/** Print subprocess output while running. */
|
|
30
|
+
verbose?: boolean;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Infer the lexicon id from a directory name. Returns null when the directory
|
|
35
|
+
* basename is not one of the pinned lexicons.
|
|
36
|
+
*/
|
|
37
|
+
export function inferLexicon(lexiconDir: string): LexiconId | null {
|
|
38
|
+
const name = basename(lexiconDir);
|
|
39
|
+
return (PINNED_LEXICONS as readonly string[]).includes(name) ? (name as LexiconId) : null;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Map a regen severity to a semver review label.
|
|
44
|
+
* additive → "minor"; breaking → "major"; none → "none".
|
|
45
|
+
*/
|
|
46
|
+
export function semverLabel(result: UpgradeCheckResult): "minor" | "major" | "none" {
|
|
47
|
+
const sev = result.validation?.severity;
|
|
48
|
+
if (sev === "breaking") return "major";
|
|
49
|
+
if (sev === "additive") return "minor";
|
|
50
|
+
return "none";
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Run the pinned-upgrade check and return the structured result.
|
|
55
|
+
* Never throws — a missing dir or an unrecognised lexicon becomes a fetchError.
|
|
56
|
+
*/
|
|
57
|
+
export async function runPinnedUpgrade(opts: PinnedUpgradeOptions): Promise<UpgradeCheckResult> {
|
|
58
|
+
const dir = resolve(opts.lexiconDir);
|
|
59
|
+
|
|
60
|
+
const lexicon = opts.lexicon ?? inferLexicon(dir);
|
|
61
|
+
if (!lexicon) {
|
|
62
|
+
return {
|
|
63
|
+
lexicon: "k8s",
|
|
64
|
+
hasUpgrade: false,
|
|
65
|
+
from: "(unknown)",
|
|
66
|
+
to: null,
|
|
67
|
+
validation: null,
|
|
68
|
+
fetchError: `Not a pinned lexicon directory: ${dir}. Expected one of: ${PINNED_LEXICONS.join(", ")}.`,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
if (!existsSync(dir)) {
|
|
73
|
+
return {
|
|
74
|
+
lexicon,
|
|
75
|
+
hasUpgrade: false,
|
|
76
|
+
from: "(unknown)",
|
|
77
|
+
to: null,
|
|
78
|
+
validation: null,
|
|
79
|
+
fetchError: `Lexicon directory not found: ${dir}`,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
return checkPinnedUpgrade({
|
|
84
|
+
lexiconDir: dir,
|
|
85
|
+
lexicon,
|
|
86
|
+
force: opts.force,
|
|
87
|
+
verbose: opts.verbose,
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// ── Human-readable output ─────────────────────────────────────────────
|
|
92
|
+
|
|
93
|
+
const COLORS = {
|
|
94
|
+
green: "\x1b[32m",
|
|
95
|
+
yellow: "\x1b[33m",
|
|
96
|
+
red: "\x1b[31m",
|
|
97
|
+
gray: "\x1b[90m",
|
|
98
|
+
bold: "\x1b[1m",
|
|
99
|
+
reset: "\x1b[0m",
|
|
100
|
+
};
|
|
101
|
+
|
|
102
|
+
function useColors(): boolean {
|
|
103
|
+
return !process.env.NO_COLOR && process.stdout.isTTY !== false;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
function c(text: string, code: string): string {
|
|
107
|
+
return useColors() ? `${code}${text}${COLORS.reset}` : text;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Print the pinned-upgrade result. `json` emits a machine-readable object.
|
|
112
|
+
*/
|
|
113
|
+
export function printPinnedUpgradeResult(result: UpgradeCheckResult, json: boolean): void {
|
|
114
|
+
const label = semverLabel(result);
|
|
115
|
+
|
|
116
|
+
if (json) {
|
|
117
|
+
console.log(
|
|
118
|
+
JSON.stringify(
|
|
119
|
+
{
|
|
120
|
+
lexicon: result.lexicon,
|
|
121
|
+
hasUpgrade: result.hasUpgrade,
|
|
122
|
+
from: result.from,
|
|
123
|
+
to: result.to,
|
|
124
|
+
semver: label,
|
|
125
|
+
severity: result.validation?.severity ?? "none",
|
|
126
|
+
changed: result.validation?.changed ?? false,
|
|
127
|
+
delta: result.validation?.delta ?? null,
|
|
128
|
+
validationOk: result.validation?.ok ?? null,
|
|
129
|
+
failures: result.validation?.failures ?? [],
|
|
130
|
+
fetchError: result.fetchError,
|
|
131
|
+
},
|
|
132
|
+
null,
|
|
133
|
+
2,
|
|
134
|
+
),
|
|
135
|
+
);
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
if (result.fetchError) {
|
|
140
|
+
console.log(c(`[${result.lexicon}] error: ${result.fetchError}`, COLORS.red));
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
if (!result.hasUpgrade) {
|
|
145
|
+
console.log(
|
|
146
|
+
c(`[${result.lexicon}] up to date`, COLORS.green) +
|
|
147
|
+
` pinned=${result.from}` +
|
|
148
|
+
(result.to ? ` latest=${result.to}` : ""),
|
|
149
|
+
);
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
// Upgrade available
|
|
154
|
+
console.log(
|
|
155
|
+
c(`[${result.lexicon}] upgrade available`, COLORS.bold) +
|
|
156
|
+
` ${result.from} -> ${result.to}`,
|
|
157
|
+
);
|
|
158
|
+
|
|
159
|
+
const v = result.validation;
|
|
160
|
+
if (v) {
|
|
161
|
+
// Surface delta
|
|
162
|
+
if (v.deltaText) {
|
|
163
|
+
console.log("");
|
|
164
|
+
console.log(v.deltaText);
|
|
165
|
+
} else if (v.changed) {
|
|
166
|
+
console.log(" Surface changed (no baseline to diff against).");
|
|
167
|
+
} else {
|
|
168
|
+
console.log(" No surface changes.");
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
// Failures
|
|
172
|
+
if (v.failures.length > 0) {
|
|
173
|
+
console.log("");
|
|
174
|
+
console.log(c(` ${v.failures.length} validation step(s) failed:`, COLORS.bold));
|
|
175
|
+
for (const f of v.failures) {
|
|
176
|
+
console.log(
|
|
177
|
+
c(
|
|
178
|
+
` FAIL [${f.step}]${f.exitCode !== undefined ? ` (exit ${f.exitCode})` : ""}`,
|
|
179
|
+
COLORS.red,
|
|
180
|
+
),
|
|
181
|
+
);
|
|
182
|
+
if (f.output) {
|
|
183
|
+
const indented = f.output
|
|
184
|
+
.split("\n")
|
|
185
|
+
.map((l) => ` ${l}`)
|
|
186
|
+
.join("\n");
|
|
187
|
+
console.log(c(indented, COLORS.gray));
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
console.log("");
|
|
194
|
+
const labelColor =
|
|
195
|
+
label === "major" ? COLORS.red : label === "minor" ? COLORS.yellow : COLORS.green;
|
|
196
|
+
const validationLabel = v
|
|
197
|
+
? v.ok
|
|
198
|
+
? c("ok", COLORS.green)
|
|
199
|
+
: c("FAILED", COLORS.red)
|
|
200
|
+
: c("skipped", COLORS.gray);
|
|
201
|
+
console.log(
|
|
202
|
+
`Validation: ${validationLabel} Semver: ${c(label, labelColor)} ${result.from} -> ${result.to}`,
|
|
203
|
+
);
|
|
204
|
+
}
|
|
@@ -1,11 +1,68 @@
|
|
|
1
|
+
import { writeFileSync, mkdirSync } from "node:fs";
|
|
2
|
+
import { dirname, resolve } from "node:path";
|
|
1
3
|
import { buildCommand, buildCommandWatch, printErrors, printWarnings, resolveBuildFormat } from "../commands/build";
|
|
2
|
-
import { formatError, formatInfo } from "../format";
|
|
4
|
+
import { formatError, formatInfo, formatSuccess, formatBold } from "../format";
|
|
3
5
|
import type { CommandContext } from "../registry";
|
|
6
|
+
import { generateComponentsPipeline } from "../../components/cli-support";
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* `chant build --components --generate <lexicon>` — generate mode (#563,
|
|
10
|
+
* epic #551 Phase 3). Discovers `Component` declarations under `args.path`
|
|
11
|
+
* and synthesizes a thin CI pipeline for `lexicon` instead of running a
|
|
12
|
+
* normal lexicon build: no entity discovery, no serializers, no post-synth
|
|
13
|
+
* checks — those apply to lexicon resources, which is a different input to
|
|
14
|
+
* a different command path (`chant build` without `--components`).
|
|
15
|
+
*/
|
|
16
|
+
async function runGenerateComponents(ctx: CommandContext): Promise<number> {
|
|
17
|
+
const { args } = ctx;
|
|
18
|
+
const lexicon = args.generate as string;
|
|
19
|
+
|
|
20
|
+
// Which lexicons support generate mode is a property of the loaded lexicon
|
|
21
|
+
// plugins (those implementing `generateComponentPipeline`, #688), not a
|
|
22
|
+
// hard-coded core list — `generateComponentsPipeline` returns a descriptive
|
|
23
|
+
// error when the target lexicon has no generator.
|
|
24
|
+
const result = await generateComponentsPipeline(args.path, lexicon, {
|
|
25
|
+
env: args.env,
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
if (!result.success) {
|
|
29
|
+
console.error(formatError({ message: result.error ?? "Failed to generate CI pipeline from components" }));
|
|
30
|
+
return 1;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
const yaml = result.yaml ?? "";
|
|
34
|
+
if (args.format === "json") {
|
|
35
|
+
console.log(JSON.stringify({ stages: result.stages, jobs: result.jobs, yaml }, null, 2));
|
|
36
|
+
} else if (args.output) {
|
|
37
|
+
const outputPath = resolve(args.output);
|
|
38
|
+
mkdirSync(dirname(outputPath), { recursive: true });
|
|
39
|
+
writeFileSync(outputPath, yaml);
|
|
40
|
+
} else {
|
|
41
|
+
console.log(yaml);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
if (args.verbose || args.output) {
|
|
45
|
+
console.error(
|
|
46
|
+
formatSuccess(
|
|
47
|
+
`Generated ${formatBold(lexicon)} pipeline: ${formatBold(String(result.jobs?.length ?? 0))} job(s) across ${formatBold(String(result.stages?.length ?? 0))} wave(s)`,
|
|
48
|
+
),
|
|
49
|
+
);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
return 0;
|
|
53
|
+
}
|
|
4
54
|
|
|
5
55
|
export async function runBuild(ctx: CommandContext): Promise<number> {
|
|
6
56
|
const { args, plugins } = ctx;
|
|
7
57
|
let { serializers } = ctx;
|
|
8
58
|
|
|
59
|
+
// Generate mode (#563): synthesize CI YAML from components instead of
|
|
60
|
+
// running a normal lexicon build. Checked first since it does not need
|
|
61
|
+
// `serializers`/lexicon resources at all.
|
|
62
|
+
if (args.components && args.generate) {
|
|
63
|
+
return runGenerateComponents(ctx);
|
|
64
|
+
}
|
|
65
|
+
|
|
9
66
|
// Filter to a single lexicon when --lexicon is specified
|
|
10
67
|
if (args.lexicon) {
|
|
11
68
|
serializers = serializers.filter((s) => s.name === args.lexicon);
|