@jeger-ai/opengantry 3.2.6 → 3.4.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/README.md +12 -2
- package/dist/cli/commands/contract.d.ts +21 -0
- package/dist/cli/commands/contract.d.ts.map +1 -0
- package/dist/cli/commands/contract.js +113 -0
- package/dist/cli/commands/contract.js.map +1 -0
- package/dist/cli/commands/deps.d.ts +18 -0
- package/dist/cli/commands/deps.d.ts.map +1 -0
- package/dist/cli/commands/deps.js +63 -0
- package/dist/cli/commands/deps.js.map +1 -0
- package/dist/cli/commands/doctor.d.ts +3 -6
- package/dist/cli/commands/doctor.d.ts.map +1 -1
- package/dist/cli/commands/doctor.js +8 -1
- package/dist/cli/commands/doctor.js.map +1 -1
- package/dist/cli/commands/interrogate.js +3 -3
- package/dist/cli/commands/interrogate.js.map +1 -1
- package/dist/cli/commands/ledger.d.ts +24 -0
- package/dist/cli/commands/ledger.d.ts.map +1 -0
- package/dist/cli/commands/ledger.js +88 -0
- package/dist/cli/commands/ledger.js.map +1 -0
- package/dist/cli/commands/mission.d.ts +6 -0
- package/dist/cli/commands/mission.d.ts.map +1 -1
- package/dist/cli/commands/mission.js +43 -3
- package/dist/cli/commands/mission.js.map +1 -1
- package/dist/cli/commands/perimeter.d.ts.map +1 -1
- package/dist/cli/commands/perimeter.js +4 -0
- package/dist/cli/commands/perimeter.js.map +1 -1
- package/dist/cli/commands/policy.d.ts +10 -0
- package/dist/cli/commands/policy.d.ts.map +1 -0
- package/dist/cli/commands/policy.js +49 -0
- package/dist/cli/commands/policy.js.map +1 -0
- package/dist/cli/commands/tmvc-guard.d.ts.map +1 -1
- package/dist/cli/commands/tmvc-guard.js +1 -0
- package/dist/cli/commands/tmvc-guard.js.map +1 -1
- package/dist/cli/commands/triage.d.ts.map +1 -1
- package/dist/cli/commands/triage.js +2 -1
- package/dist/cli/commands/triage.js.map +1 -1
- package/dist/cli/commands/verify.d.ts.map +1 -1
- package/dist/cli/commands/verify.js +2 -11
- package/dist/cli/commands/verify.js.map +1 -1
- package/dist/cli/kernel.d.ts +10 -3
- package/dist/cli/kernel.d.ts.map +1 -1
- package/dist/cli/kernel.js +18 -2
- package/dist/cli/kernel.js.map +1 -1
- package/dist/cli/lib/adapter-preflight-checks.d.ts +55 -0
- package/dist/cli/lib/adapter-preflight-checks.d.ts.map +1 -0
- package/dist/cli/lib/adapter-preflight-checks.js +275 -0
- package/dist/cli/lib/adapter-preflight-checks.js.map +1 -0
- package/dist/cli/lib/attest-mission.d.ts.map +1 -1
- package/dist/cli/lib/attest-mission.js +7 -0
- package/dist/cli/lib/attest-mission.js.map +1 -1
- package/dist/cli/lib/break-glass.d.ts +1 -1
- package/dist/cli/lib/break-glass.d.ts.map +1 -1
- package/dist/cli/lib/break-glass.js +6 -0
- package/dist/cli/lib/break-glass.js.map +1 -1
- package/dist/cli/lib/command-boundary.d.ts +7 -3
- package/dist/cli/lib/command-boundary.d.ts.map +1 -1
- package/dist/cli/lib/command-boundary.js +20 -4
- package/dist/cli/lib/command-boundary.js.map +1 -1
- package/dist/cli/lib/constants.d.ts +13 -0
- package/dist/cli/lib/constants.d.ts.map +1 -1
- package/dist/cli/lib/constants.js +13 -0
- package/dist/cli/lib/constants.js.map +1 -1
- package/dist/cli/lib/contract/approve-prompt.d.ts +22 -0
- package/dist/cli/lib/contract/approve-prompt.d.ts.map +1 -0
- package/dist/cli/lib/contract/approve-prompt.js +71 -0
- package/dist/cli/lib/contract/approve-prompt.js.map +1 -0
- package/dist/cli/lib/contract/contract-hash.d.ts +19 -0
- package/dist/cli/lib/contract/contract-hash.d.ts.map +1 -0
- package/dist/cli/lib/contract/contract-hash.js +67 -0
- package/dist/cli/lib/contract/contract-hash.js.map +1 -0
- package/dist/cli/lib/contract/contract-scan.d.ts +27 -0
- package/dist/cli/lib/contract/contract-scan.d.ts.map +1 -0
- package/dist/cli/lib/contract/contract-scan.js +167 -0
- package/dist/cli/lib/contract/contract-scan.js.map +1 -0
- package/dist/cli/lib/contract/contract-types.d.ts +38 -0
- package/dist/cli/lib/contract/contract-types.d.ts.map +1 -0
- package/dist/cli/lib/contract/contract-types.js +11 -0
- package/dist/cli/lib/contract/contract-types.js.map +1 -0
- package/dist/cli/lib/contract/effective-scope.d.ts +21 -0
- package/dist/cli/lib/contract/effective-scope.d.ts.map +1 -0
- package/dist/cli/lib/contract/effective-scope.js +77 -0
- package/dist/cli/lib/contract/effective-scope.js.map +1 -0
- package/dist/cli/lib/contract/format.d.ts +20 -0
- package/dist/cli/lib/contract/format.d.ts.map +1 -0
- package/dist/cli/lib/contract/format.js +48 -0
- package/dist/cli/lib/contract/format.js.map +1 -0
- package/dist/cli/lib/contract/propose-gate.d.ts +21 -0
- package/dist/cli/lib/contract/propose-gate.d.ts.map +1 -0
- package/dist/cli/lib/contract/propose-gate.js +57 -0
- package/dist/cli/lib/contract/propose-gate.js.map +1 -0
- package/dist/cli/lib/contract/propose-imports.d.ts +26 -0
- package/dist/cli/lib/contract/propose-imports.d.ts.map +1 -0
- package/dist/cli/lib/contract/propose-imports.js +128 -0
- package/dist/cli/lib/contract/propose-imports.js.map +1 -0
- package/dist/cli/lib/contract/propose.d.ts +25 -0
- package/dist/cli/lib/contract/propose.d.ts.map +1 -0
- package/dist/cli/lib/contract/propose.js +100 -0
- package/dist/cli/lib/contract/propose.js.map +1 -0
- package/dist/cli/lib/contract/resolve-specifier.d.ts +34 -0
- package/dist/cli/lib/contract/resolve-specifier.d.ts.map +1 -0
- package/dist/cli/lib/contract/resolve-specifier.js +93 -0
- package/dist/cli/lib/contract/resolve-specifier.js.map +1 -0
- package/dist/cli/lib/defensive-profile-presets.d.ts +6 -0
- package/dist/cli/lib/defensive-profile-presets.d.ts.map +1 -1
- package/dist/cli/lib/defensive-profile-presets.js +15 -1
- package/dist/cli/lib/defensive-profile-presets.js.map +1 -1
- package/dist/cli/lib/deps/deps-fetch.d.ts +4 -0
- package/dist/cli/lib/deps/deps-fetch.d.ts.map +1 -0
- package/dist/cli/lib/deps/deps-fetch.js +16 -0
- package/dist/cli/lib/deps/deps-fetch.js.map +1 -0
- package/dist/cli/lib/deps/deps-resolve.d.ts +18 -0
- package/dist/cli/lib/deps/deps-resolve.d.ts.map +1 -0
- package/dist/cli/lib/deps/deps-resolve.js +66 -0
- package/dist/cli/lib/deps/deps-resolve.js.map +1 -0
- package/dist/cli/lib/deps/deps-slug.d.ts +5 -0
- package/dist/cli/lib/deps/deps-slug.d.ts.map +1 -0
- package/dist/cli/lib/deps/deps-slug.js +44 -0
- package/dist/cli/lib/deps/deps-slug.js.map +1 -0
- package/dist/cli/lib/doctor-adapter-preflight.d.ts +24 -0
- package/dist/cli/lib/doctor-adapter-preflight.d.ts.map +1 -0
- package/dist/cli/lib/doctor-adapter-preflight.js +98 -0
- package/dist/cli/lib/doctor-adapter-preflight.js.map +1 -0
- package/dist/cli/lib/doctor-core.d.ts +7 -1
- package/dist/cli/lib/doctor-core.d.ts.map +1 -1
- package/dist/cli/lib/doctor-core.js +36 -5
- package/dist/cli/lib/doctor-core.js.map +1 -1
- package/dist/cli/lib/doctor-integration.d.ts +2 -0
- package/dist/cli/lib/doctor-integration.d.ts.map +1 -1
- package/dist/cli/lib/doctor-integration.js +4 -2
- package/dist/cli/lib/doctor-integration.js.map +1 -1
- package/dist/cli/lib/doctor-preflight/eslint.d.ts +4 -0
- package/dist/cli/lib/doctor-preflight/eslint.d.ts.map +1 -0
- package/dist/cli/lib/doctor-preflight/eslint.js +41 -0
- package/dist/cli/lib/doctor-preflight/eslint.js.map +1 -0
- package/dist/cli/lib/doctor-preflight/index.d.ts +3 -0
- package/dist/cli/lib/doctor-preflight/index.d.ts.map +1 -0
- package/dist/cli/lib/doctor-preflight/index.js +3 -0
- package/dist/cli/lib/doctor-preflight/index.js.map +1 -0
- package/dist/cli/lib/doctor-preflight/tsc.d.ts +4 -0
- package/dist/cli/lib/doctor-preflight/tsc.d.ts.map +1 -0
- package/dist/cli/lib/doctor-preflight/tsc.js +42 -0
- package/dist/cli/lib/doctor-preflight/tsc.js.map +1 -0
- package/dist/cli/lib/doctor-substrate.d.ts +2 -2
- package/dist/cli/lib/doctor-substrate.d.ts.map +1 -1
- package/dist/cli/lib/doctor-types.d.ts +4 -4
- package/dist/cli/lib/doctor-types.d.ts.map +1 -1
- package/dist/cli/lib/draft-token.d.ts +7 -1
- package/dist/cli/lib/draft-token.d.ts.map +1 -1
- package/dist/cli/lib/draft-token.js +25 -3
- package/dist/cli/lib/draft-token.js.map +1 -1
- package/dist/cli/lib/errors.d.ts +2 -0
- package/dist/cli/lib/errors.d.ts.map +1 -1
- package/dist/cli/lib/errors.js +15 -2
- package/dist/cli/lib/errors.js.map +1 -1
- package/dist/cli/lib/gate-adapters/adapter-findings.d.ts +41 -0
- package/dist/cli/lib/gate-adapters/adapter-findings.d.ts.map +1 -0
- package/dist/cli/lib/gate-adapters/adapter-findings.js +99 -0
- package/dist/cli/lib/gate-adapters/adapter-findings.js.map +1 -0
- package/dist/cli/lib/gate-adapters/eslint-json-adapter.d.ts +14 -0
- package/dist/cli/lib/gate-adapters/eslint-json-adapter.d.ts.map +1 -0
- package/dist/cli/lib/gate-adapters/eslint-json-adapter.js +63 -0
- package/dist/cli/lib/gate-adapters/eslint-json-adapter.js.map +1 -0
- package/dist/cli/lib/gate-adapters/gate-adapter-id.d.ts +10 -0
- package/dist/cli/lib/gate-adapters/gate-adapter-id.d.ts.map +1 -0
- package/dist/cli/lib/gate-adapters/gate-adapter-id.js +12 -0
- package/dist/cli/lib/gate-adapters/gate-adapter-id.js.map +1 -0
- package/dist/cli/lib/gate-adapters/gate-adapter-types.d.ts +17 -0
- package/dist/cli/lib/gate-adapters/gate-adapter-types.d.ts.map +1 -0
- package/dist/cli/lib/gate-adapters/gate-adapter-types.js +2 -0
- package/dist/cli/lib/gate-adapters/gate-adapter-types.js.map +1 -0
- package/dist/cli/lib/gate-adapters/generic-spawn-adapter.d.ts +4 -0
- package/dist/cli/lib/gate-adapters/generic-spawn-adapter.d.ts.map +1 -0
- package/dist/cli/lib/gate-adapters/generic-spawn-adapter.js +12 -0
- package/dist/cli/lib/gate-adapters/generic-spawn-adapter.js.map +1 -0
- package/dist/cli/lib/gate-adapters/parsing-adapter.d.ts +5 -0
- package/dist/cli/lib/gate-adapters/parsing-adapter.d.ts.map +1 -0
- package/dist/cli/lib/gate-adapters/parsing-adapter.js +13 -0
- package/dist/cli/lib/gate-adapters/parsing-adapter.js.map +1 -0
- package/dist/cli/lib/gate-adapters/registry.d.ts +6 -0
- package/dist/cli/lib/gate-adapters/registry.d.ts.map +1 -0
- package/dist/cli/lib/gate-adapters/registry.js +13 -0
- package/dist/cli/lib/gate-adapters/registry.js.map +1 -0
- package/dist/cli/lib/gate-adapters/spawn-stream-core.d.ts +36 -0
- package/dist/cli/lib/gate-adapters/spawn-stream-core.d.ts.map +1 -0
- package/dist/cli/lib/gate-adapters/spawn-stream-core.js +99 -0
- package/dist/cli/lib/gate-adapters/spawn-stream-core.js.map +1 -0
- package/dist/cli/lib/gate-adapters/tsc-adapter.d.ts +16 -0
- package/dist/cli/lib/gate-adapters/tsc-adapter.d.ts.map +1 -0
- package/dist/cli/lib/gate-adapters/tsc-adapter.js +51 -0
- package/dist/cli/lib/gate-adapters/tsc-adapter.js.map +1 -0
- package/dist/cli/lib/gate-log-writer.d.ts +8 -0
- package/dist/cli/lib/gate-log-writer.d.ts.map +1 -1
- package/dist/cli/lib/gate-log-writer.js +35 -0
- package/dist/cli/lib/gate-log-writer.js.map +1 -1
- package/dist/cli/lib/gate.d.ts +2 -0
- package/dist/cli/lib/gate.d.ts.map +1 -1
- package/dist/cli/lib/gate.js +2 -2
- package/dist/cli/lib/gate.js.map +1 -1
- package/dist/cli/lib/git.d.ts +14 -2
- package/dist/cli/lib/git.d.ts.map +1 -1
- package/dist/cli/lib/git.js +22 -7
- package/dist/cli/lib/git.js.map +1 -1
- package/dist/cli/lib/gxt-config.d.ts +9 -0
- package/dist/cli/lib/gxt-config.d.ts.map +1 -1
- package/dist/cli/lib/gxt-config.js +16 -0
- package/dist/cli/lib/gxt-config.js.map +1 -1
- package/dist/cli/lib/gxt-error-codes.d.ts +17 -0
- package/dist/cli/lib/gxt-error-codes.d.ts.map +1 -1
- package/dist/cli/lib/gxt-error-codes.js +18 -0
- package/dist/cli/lib/gxt-error-codes.js.map +1 -1
- package/dist/cli/lib/import-scanner.d.ts +13 -3
- package/dist/cli/lib/import-scanner.d.ts.map +1 -1
- package/dist/cli/lib/import-scanner.js +185 -23
- package/dist/cli/lib/import-scanner.js.map +1 -1
- package/dist/cli/lib/init-tutorial.js +3 -4
- package/dist/cli/lib/init-tutorial.js.map +1 -1
- package/dist/cli/lib/interrogate/gaps.d.ts +2 -0
- package/dist/cli/lib/interrogate/gaps.d.ts.map +1 -1
- package/dist/cli/lib/interrogate/gaps.js +3 -4
- package/dist/cli/lib/interrogate/gaps.js.map +1 -1
- package/dist/cli/lib/interrogate/run.d.ts +1 -0
- package/dist/cli/lib/interrogate/run.d.ts.map +1 -1
- package/dist/cli/lib/interrogate/run.js +1 -0
- package/dist/cli/lib/interrogate/run.js.map +1 -1
- package/dist/cli/lib/kpi-scan.js +5 -1
- package/dist/cli/lib/kpi-scan.js.map +1 -1
- package/dist/cli/lib/ledger/ledger-append.d.ts +14 -0
- package/dist/cli/lib/ledger/ledger-append.d.ts.map +1 -0
- package/dist/cli/lib/ledger/ledger-append.js +63 -0
- package/dist/cli/lib/ledger/ledger-append.js.map +1 -0
- package/dist/cli/lib/ledger/ledger-chain.d.ts +24 -0
- package/dist/cli/lib/ledger/ledger-chain.d.ts.map +1 -0
- package/dist/cli/lib/ledger/ledger-chain.js +101 -0
- package/dist/cli/lib/ledger/ledger-chain.js.map +1 -0
- package/dist/cli/lib/ledger/ledger-entry.d.ts +79 -0
- package/dist/cli/lib/ledger/ledger-entry.d.ts.map +1 -0
- package/dist/cli/lib/ledger/ledger-entry.js +36 -0
- package/dist/cli/lib/ledger/ledger-entry.js.map +1 -0
- package/dist/cli/lib/ledger/ledger-export.d.ts +28 -0
- package/dist/cli/lib/ledger/ledger-export.d.ts.map +1 -0
- package/dist/cli/lib/ledger/ledger-export.js +36 -0
- package/dist/cli/lib/ledger/ledger-export.js.map +1 -0
- package/dist/cli/lib/legislate-from-intent.d.ts +9 -0
- package/dist/cli/lib/legislate-from-intent.d.ts.map +1 -0
- package/dist/cli/lib/legislate-from-intent.js +59 -0
- package/dist/cli/lib/legislate-from-intent.js.map +1 -0
- package/dist/cli/lib/legislate-gate-options.d.ts +3 -4
- package/dist/cli/lib/legislate-gate-options.d.ts.map +1 -1
- package/dist/cli/lib/legislate-gate-options.js +9 -4
- package/dist/cli/lib/legislate-gate-options.js.map +1 -1
- package/dist/cli/lib/legislate-policy-warn.d.ts +3 -0
- package/dist/cli/lib/legislate-policy-warn.d.ts.map +1 -0
- package/dist/cli/lib/legislate-policy-warn.js +17 -0
- package/dist/cli/lib/legislate-policy-warn.js.map +1 -0
- package/dist/cli/lib/legislate.d.ts +5 -1
- package/dist/cli/lib/legislate.d.ts.map +1 -1
- package/dist/cli/lib/legislate.js +38 -12
- package/dist/cli/lib/legislate.js.map +1 -1
- package/dist/cli/lib/mcp-doctor.d.ts +18 -0
- package/dist/cli/lib/mcp-doctor.d.ts.map +1 -0
- package/dist/cli/lib/mcp-doctor.js +35 -0
- package/dist/cli/lib/mcp-doctor.js.map +1 -0
- package/dist/cli/lib/mcp-draft-legislation.d.ts.map +1 -1
- package/dist/cli/lib/mcp-draft-legislation.js +39 -16
- package/dist/cli/lib/mcp-draft-legislation.js.map +1 -1
- package/dist/cli/lib/mcp-execute-legislation.d.ts.map +1 -1
- package/dist/cli/lib/mcp-execute-legislation.js +2 -0
- package/dist/cli/lib/mcp-execute-legislation.js.map +1 -1
- package/dist/cli/lib/mcp-governance-shared.d.ts +4 -1
- package/dist/cli/lib/mcp-governance-shared.d.ts.map +1 -1
- package/dist/cli/lib/mcp-governance-shared.js.map +1 -1
- package/dist/cli/lib/mcp-interrogate.js +3 -3
- package/dist/cli/lib/mcp-interrogate.js.map +1 -1
- package/dist/cli/lib/mcp-org.d.ts +19 -0
- package/dist/cli/lib/mcp-org.d.ts.map +1 -0
- package/dist/cli/lib/mcp-org.js +51 -0
- package/dist/cli/lib/mcp-org.js.map +1 -0
- package/dist/cli/lib/mcp-propose-contract.d.ts +22 -0
- package/dist/cli/lib/mcp-propose-contract.d.ts.map +1 -0
- package/dist/cli/lib/mcp-propose-contract.js +51 -0
- package/dist/cli/lib/mcp-propose-contract.js.map +1 -0
- package/dist/cli/lib/mcp-runtime.d.ts +1 -1
- package/dist/cli/lib/mcp-runtime.d.ts.map +1 -1
- package/dist/cli/lib/mcp-runtime.js +1 -1
- package/dist/cli/lib/mcp-runtime.js.map +1 -1
- package/dist/cli/lib/mcp-start-orchestration.d.ts.map +1 -1
- package/dist/cli/lib/mcp-start-orchestration.js +1 -0
- package/dist/cli/lib/mcp-start-orchestration.js.map +1 -1
- package/dist/cli/lib/mcp-tools-register.d.ts.map +1 -1
- package/dist/cli/lib/mcp-tools-register.js +110 -17
- package/dist/cli/lib/mcp-tools-register.js.map +1 -1
- package/dist/cli/lib/mission-changed.d.ts +27 -0
- package/dist/cli/lib/mission-changed.d.ts.map +1 -0
- package/dist/cli/lib/mission-changed.js +107 -0
- package/dist/cli/lib/mission-changed.js.map +1 -0
- package/dist/cli/lib/missions/formatter.d.ts +1 -1
- package/dist/cli/lib/missions/formatter.d.ts.map +1 -1
- package/dist/cli/lib/missions/formatter.js +5 -0
- package/dist/cli/lib/missions/formatter.js.map +1 -1
- package/dist/cli/lib/missions/parser.d.ts +3 -1
- package/dist/cli/lib/missions/parser.d.ts.map +1 -1
- package/dist/cli/lib/missions/parser.js +30 -0
- package/dist/cli/lib/missions/parser.js.map +1 -1
- package/dist/cli/lib/msn-allocate.d.ts.map +1 -1
- package/dist/cli/lib/msn-allocate.js +17 -24
- package/dist/cli/lib/msn-allocate.js.map +1 -1
- package/dist/cli/lib/planner-signature.d.ts +7 -0
- package/dist/cli/lib/planner-signature.d.ts.map +1 -1
- package/dist/cli/lib/planner-signature.js +18 -1
- package/dist/cli/lib/planner-signature.js.map +1 -1
- package/dist/cli/lib/policy/policy-bundle.d.ts +6 -0
- package/dist/cli/lib/policy/policy-bundle.d.ts.map +1 -0
- package/dist/cli/lib/policy/policy-bundle.js +62 -0
- package/dist/cli/lib/policy/policy-bundle.js.map +1 -0
- package/dist/cli/lib/policy/policy-doctor.d.ts +4 -0
- package/dist/cli/lib/policy/policy-doctor.d.ts.map +1 -0
- package/dist/cli/lib/policy/policy-doctor.js +34 -0
- package/dist/cli/lib/policy/policy-doctor.js.map +1 -0
- package/dist/cli/lib/policy/policy-fetch.d.ts +10 -0
- package/dist/cli/lib/policy/policy-fetch.d.ts.map +1 -0
- package/dist/cli/lib/policy/policy-fetch.js +78 -0
- package/dist/cli/lib/policy/policy-fetch.js.map +1 -0
- package/dist/cli/lib/policy/policy-resolve.d.ts +38 -0
- package/dist/cli/lib/policy/policy-resolve.d.ts.map +1 -0
- package/dist/cli/lib/policy/policy-resolve.js +194 -0
- package/dist/cli/lib/policy/policy-resolve.js.map +1 -0
- package/dist/cli/lib/policy/policy-types.d.ts +76 -0
- package/dist/cli/lib/policy/policy-types.d.ts.map +1 -0
- package/dist/cli/lib/policy/policy-types.js +3 -0
- package/dist/cli/lib/policy/policy-types.js.map +1 -0
- package/dist/cli/lib/policy-digest-doctor.d.ts +1 -0
- package/dist/cli/lib/policy-digest-doctor.d.ts.map +1 -1
- package/dist/cli/lib/policy-digest-doctor.js +4 -2
- package/dist/cli/lib/policy-digest-doctor.js.map +1 -1
- package/dist/cli/lib/runtime-env.d.ts +3 -0
- package/dist/cli/lib/runtime-env.d.ts.map +1 -1
- package/dist/cli/lib/runtime-env.js +12 -2
- package/dist/cli/lib/runtime-env.js.map +1 -1
- package/dist/cli/lib/runtime-exec.d.ts +5 -1
- package/dist/cli/lib/runtime-exec.d.ts.map +1 -1
- package/dist/cli/lib/runtime-exec.js +18 -1
- package/dist/cli/lib/runtime-exec.js.map +1 -1
- package/dist/cli/lib/staged-tmvc-guard.d.ts +3 -0
- package/dist/cli/lib/staged-tmvc-guard.d.ts.map +1 -1
- package/dist/cli/lib/staged-tmvc-guard.js +4 -2
- package/dist/cli/lib/staged-tmvc-guard.js.map +1 -1
- package/dist/cli/lib/start-orchestration.d.ts +2 -1
- package/dist/cli/lib/start-orchestration.d.ts.map +1 -1
- package/dist/cli/lib/start-orchestration.js +5 -3
- package/dist/cli/lib/start-orchestration.js.map +1 -1
- package/dist/cli/lib/surgeons/banned-import.js +1 -1
- package/dist/cli/lib/surgeons/banned-import.js.map +1 -1
- package/dist/cli/lib/surgeons/import-layer.d.ts.map +1 -1
- package/dist/cli/lib/surgeons/import-layer.js +1 -1
- package/dist/cli/lib/surgeons/import-layer.js.map +1 -1
- package/dist/cli/lib/surgeons/registry.d.ts.map +1 -1
- package/dist/cli/lib/surgeons/registry.js +2 -4
- package/dist/cli/lib/surgeons/registry.js.map +1 -1
- package/dist/cli/lib/types.d.ts +30 -0
- package/dist/cli/lib/types.d.ts.map +1 -1
- package/dist/cli/lib/types.js +5 -1
- package/dist/cli/lib/types.js.map +1 -1
- package/dist/cli/lib/verify-contract.d.ts +22 -0
- package/dist/cli/lib/verify-contract.d.ts.map +1 -0
- package/dist/cli/lib/verify-contract.js +110 -0
- package/dist/cli/lib/verify-contract.js.map +1 -0
- package/dist/cli/lib/verify-engine.d.ts +1 -1
- package/dist/cli/lib/verify-engine.d.ts.map +1 -1
- package/dist/cli/lib/verify-engine.js +38 -17
- package/dist/cli/lib/verify-engine.js.map +1 -1
- package/dist/cli/lib/verify-evidence-snippet.d.ts +7 -0
- package/dist/cli/lib/verify-evidence-snippet.d.ts.map +1 -0
- package/dist/cli/lib/verify-evidence-snippet.js +29 -0
- package/dist/cli/lib/verify-evidence-snippet.js.map +1 -0
- package/dist/cli/lib/verify-failure-normalize.d.ts.map +1 -1
- package/dist/cli/lib/verify-failure-normalize.js +30 -4
- package/dist/cli/lib/verify-failure-normalize.js.map +1 -1
- package/dist/cli/lib/verify-failure.d.ts +27 -5
- package/dist/cli/lib/verify-failure.d.ts.map +1 -1
- package/dist/cli/lib/verify-finding-gate-projector.d.ts +1 -1
- package/dist/cli/lib/verify-finding-gate-projector.d.ts.map +1 -1
- package/dist/cli/lib/verify-finding-gate-projector.js +6 -28
- package/dist/cli/lib/verify-finding-gate-projector.js.map +1 -1
- package/dist/cli/lib/verify-finding.d.ts +1 -1
- package/dist/cli/lib/verify-finding.d.ts.map +1 -1
- package/dist/cli/lib/verify-finding.js.map +1 -1
- package/dist/cli/lib/verify-hints.d.ts.map +1 -1
- package/dist/cli/lib/verify-hints.js +27 -3
- package/dist/cli/lib/verify-hints.js.map +1 -1
- package/dist/cli/lib/verify-interrogation.d.ts +2 -0
- package/dist/cli/lib/verify-interrogation.d.ts.map +1 -1
- package/dist/cli/lib/verify-interrogation.js +2 -2
- package/dist/cli/lib/verify-interrogation.js.map +1 -1
- package/dist/cli/lib/verify-options.d.ts +5 -14
- package/dist/cli/lib/verify-options.d.ts.map +1 -1
- package/dist/cli/lib/verify-org-phases.d.ts +18 -0
- package/dist/cli/lib/verify-org-phases.d.ts.map +1 -0
- package/dist/cli/lib/verify-org-phases.js +61 -0
- package/dist/cli/lib/verify-org-phases.js.map +1 -0
- package/dist/cli/lib/verify-payload.d.ts +1 -1
- package/dist/cli/lib/verify-payload.d.ts.map +1 -1
- package/dist/cli/lib/verify-payload.js +49 -27
- package/dist/cli/lib/verify-payload.js.map +1 -1
- package/dist/cli/lib/verify-phase-clock.d.ts +3 -2
- package/dist/cli/lib/verify-phase-clock.d.ts.map +1 -1
- package/dist/cli/lib/verify-phase-clock.js +17 -5
- package/dist/cli/lib/verify-phase-clock.js.map +1 -1
- package/dist/cli/lib/verify-phase-steps.d.ts +14 -7
- package/dist/cli/lib/verify-phase-steps.d.ts.map +1 -1
- package/dist/cli/lib/verify-phase-steps.js +33 -24
- package/dist/cli/lib/verify-phase-steps.js.map +1 -1
- package/dist/cli/lib/verify-presenters.d.ts +1 -0
- package/dist/cli/lib/verify-presenters.d.ts.map +1 -1
- package/dist/cli/lib/verify-presenters.js +15 -4
- package/dist/cli/lib/verify-presenters.js.map +1 -1
- package/dist/cli/lib/verify-remediation-pipeline.d.ts +2 -0
- package/dist/cli/lib/verify-remediation-pipeline.d.ts.map +1 -1
- package/dist/cli/lib/verify-remediation-pipeline.js +5 -2
- package/dist/cli/lib/verify-remediation-pipeline.js.map +1 -1
- package/dist/cli/lib/verify-run.d.ts +2 -2
- package/dist/cli/lib/verify-run.d.ts.map +1 -1
- package/dist/cli/lib/verify-run.js +27 -13
- package/dist/cli/lib/verify-run.js.map +1 -1
- package/dist/cli/lib/version.gen.d.ts +1 -1
- package/dist/cli/lib/version.gen.js +1 -1
- package/dist/cli/program-core.d.ts +1 -1
- package/dist/cli/program-core.d.ts.map +1 -1
- package/dist/cli/program-core.js +62 -5
- package/dist/cli/program-core.js.map +1 -1
- package/dist/cli/program-mission.d.ts.map +1 -1
- package/dist/cli/program-mission.js +97 -35
- package/dist/cli/program-mission.js.map +1 -1
- package/dist/cli/program-org.d.ts +3 -0
- package/dist/cli/program-org.d.ts.map +1 -0
- package/dist/cli/program-org.js +119 -0
- package/dist/cli/program-org.js.map +1 -0
- package/dist/cli/program-workflow.d.ts +6 -2
- package/dist/cli/program-workflow.d.ts.map +1 -1
- package/dist/cli/program-workflow.js +63 -6
- package/dist/cli/program-workflow.js.map +1 -1
- package/dist/cli/program.d.ts.map +1 -1
- package/dist/cli/program.js +11 -0
- package/dist/cli/program.js.map +1 -1
- package/package.json +2 -1
- package/templates/.gitagent/config.json +4 -0
- package/templates/.gitagent/foreman/MANIFEST.json +1 -0
- package/templates/.gitagent/foreman/PLANNER.signing.pub +3 -0
- package/templates/.gitagent/foreman/POLICY.pointer.json +11 -0
- package/templates/.gitagent/foreman/SUBSTRATE.version.json +1 -1
- package/templates/.gitagent/planner/MISSION-ARCHITECT.md +26 -5
- package/templates/.gitagent/planner/MISSION.schema.yaml +103 -0
- package/templates/.gitagent/planner/ORG-POLICY.schema.yaml +174 -0
- package/templates/.gitagent/planner/RULES.md +75 -22
- package/templates/.githooks/pre-commit +12 -0
- package/templates/.github/workflows/gxt-attest-ingest.yml +56 -6
- package/templates/.github/workflows/gxt-validate.yml +33 -0
- package/templates/.gitignore.gxt +1 -0
- package/templates/integrations/asset-catalog.json +2 -0
- package/templates/integrations/compatibility.json +1 -1
- package/templates/scripts/validate-mcp-dogfood.mjs +5 -0
- package/templates/scripts/verify-pr-missions.sh +20 -41
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { importMatchesBan } from "../ast-discovery.js";
|
|
4
|
+
import { toPosixRel } from "../cli-io.js";
|
|
5
|
+
import { gitRunOk } from "../git.js";
|
|
6
|
+
import { GXT_ERROR } from "../gxt-error-codes.js";
|
|
7
|
+
import { extractImportSites } from "../import-scanner.js";
|
|
8
|
+
import { isPathUnderRoot, normalizeRepoRelativePath } from "../tmvc-path.js";
|
|
9
|
+
import { classifySpecifier, loadTsconfigPaths } from "./resolve-specifier.js";
|
|
10
|
+
const SOURCE_EXT = new Set([".ts", ".tsx", ".mts", ".cts", ".js", ".jsx", ".mjs", ".cjs"]);
|
|
11
|
+
const SKIP_DIRS = new Set(["node_modules", "dist", "build", "coverage"]);
|
|
12
|
+
export function isScannableSource(fileRel) {
|
|
13
|
+
const ext = path.extname(fileRel).toLowerCase();
|
|
14
|
+
return SOURCE_EXT.has(ext) && !fileRel.endsWith(".d.ts");
|
|
15
|
+
}
|
|
16
|
+
function walkSources(repoRoot, absRoot, out) {
|
|
17
|
+
if (!fs.existsSync(absRoot))
|
|
18
|
+
return;
|
|
19
|
+
const stat = fs.statSync(absRoot);
|
|
20
|
+
if (stat.isFile()) {
|
|
21
|
+
if (isScannableSource(absRoot))
|
|
22
|
+
out.push(toPosixRel(repoRoot, absRoot));
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
if (!stat.isDirectory())
|
|
26
|
+
return;
|
|
27
|
+
for (const ent of fs.readdirSync(absRoot, { withFileTypes: true })) {
|
|
28
|
+
const child = path.join(absRoot, ent.name);
|
|
29
|
+
if (ent.isDirectory()) {
|
|
30
|
+
if (SKIP_DIRS.has(ent.name) || ent.name.startsWith("."))
|
|
31
|
+
continue;
|
|
32
|
+
walkSources(repoRoot, child, out);
|
|
33
|
+
}
|
|
34
|
+
else if (ent.isFile() && isScannableSource(ent.name)) {
|
|
35
|
+
out.push(toPosixRel(repoRoot, child));
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
/** Repo-relative source files under the effective TMVC roots (sorted, deduped). */
|
|
40
|
+
export function listSourcesUnderRoots(repoRoot, roots) {
|
|
41
|
+
const out = [];
|
|
42
|
+
for (const root of roots)
|
|
43
|
+
walkSources(repoRoot, path.join(repoRoot, root), out);
|
|
44
|
+
return [...new Set(out)].sort();
|
|
45
|
+
}
|
|
46
|
+
function addGitNames(repoRoot, args, out) {
|
|
47
|
+
const r = gitRunOk(repoRoot, [...args, "--"]);
|
|
48
|
+
if (!r.ok)
|
|
49
|
+
return false;
|
|
50
|
+
for (const line of r.stdout.split(/\r?\n/))
|
|
51
|
+
if (line.trim())
|
|
52
|
+
out.add(line.trim());
|
|
53
|
+
return true;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Dirty sources: `git diff --name-only HEAD` ∪ untracked. On an unborn branch (no HEAD) the
|
|
57
|
+
* index (`ls-files --cached`) stands in for the diff. Every argv ends with `--` so a path that
|
|
58
|
+
* looks like a flag is never parsed as one. Missing/deleted paths are dropped.
|
|
59
|
+
*/
|
|
60
|
+
export function listChangedSourceFiles(repoRoot) {
|
|
61
|
+
const out = new Set();
|
|
62
|
+
if (!addGitNames(repoRoot, ["diff", "--name-only", "HEAD"], out)) {
|
|
63
|
+
addGitNames(repoRoot, ["ls-files", "--cached"], out);
|
|
64
|
+
}
|
|
65
|
+
addGitNames(repoRoot, ["ls-files", "--others", "--exclude-standard"], out);
|
|
66
|
+
return [...out]
|
|
67
|
+
.filter((rel) => isScannableSource(rel) && fs.existsSync(path.join(repoRoot, rel)))
|
|
68
|
+
.sort();
|
|
69
|
+
}
|
|
70
|
+
export function contractViolationCode(kind) {
|
|
71
|
+
switch (kind) {
|
|
72
|
+
case "banned":
|
|
73
|
+
return GXT_ERROR.CONTRACT_IMPORT_BANNED;
|
|
74
|
+
case "unlisted":
|
|
75
|
+
return GXT_ERROR.CONTRACT_IMPORT_UNLISTED;
|
|
76
|
+
case "dynamic":
|
|
77
|
+
return GXT_ERROR.CONTRACT_IMPORT_DYNAMIC;
|
|
78
|
+
case "scope_escape":
|
|
79
|
+
return GXT_ERROR.CONTRACT_SCOPE_ESCAPE;
|
|
80
|
+
default: {
|
|
81
|
+
const _exhaustive = kind;
|
|
82
|
+
return _exhaustive;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
function violation(kind, file, site, specifier, detail) {
|
|
87
|
+
return { kind, file, line: site.line, column: site.column, specifier, detail };
|
|
88
|
+
}
|
|
89
|
+
function checkBareSpecifier(scope, file, site, spec) {
|
|
90
|
+
const banned = scope.bannedImports.find((b) => importMatchesBan(spec, b));
|
|
91
|
+
if (banned) {
|
|
92
|
+
return violation("banned", file, site, spec, `import of banned specifier "${spec}" (banned: ${banned})`);
|
|
93
|
+
}
|
|
94
|
+
if (scope.allowedImports.length > 0 && !scope.allowedImports.some((a) => importMatchesBan(spec, a))) {
|
|
95
|
+
return violation("unlisted", file, site, spec, `import "${spec}" is not in contract.allowed_imports`);
|
|
96
|
+
}
|
|
97
|
+
return null;
|
|
98
|
+
}
|
|
99
|
+
function checkResolvedPath(scope, file, site, spec, resolvedRepoRel) {
|
|
100
|
+
const forbidden = scope.forbiddenZones.find((fz) => isPathUnderRoot(resolvedRepoRel, fz));
|
|
101
|
+
if (forbidden) {
|
|
102
|
+
return violation("scope_escape", file, site, spec, `import resolves into forbidden zone ${forbidden} (${resolvedRepoRel})`);
|
|
103
|
+
}
|
|
104
|
+
if (scope.strictRelativeImports && scope.tmvcRoots.length > 0) {
|
|
105
|
+
const inside = scope.tmvcRoots.some((r) => isPathUnderRoot(resolvedRepoRel, r));
|
|
106
|
+
if (!inside) {
|
|
107
|
+
return violation("scope_escape", file, site, spec, `import resolves outside effective TMVC roots (${resolvedRepoRel})`);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
return null;
|
|
111
|
+
}
|
|
112
|
+
function checkSite(scope, file, site, ts) {
|
|
113
|
+
if (site.spec === null) {
|
|
114
|
+
if (scope.allowDynamicSpecifiers)
|
|
115
|
+
return null;
|
|
116
|
+
return violation("dynamic", file, site, site.expression ?? "", `non-literal ${site.kind === "require_expr" ? "require" : "import"}(${site.expression ?? ""}) is not allowed (contract.allow_dynamic_specifiers=false)`);
|
|
117
|
+
}
|
|
118
|
+
const cls = classifySpecifier(site.spec, file, ts);
|
|
119
|
+
switch (cls.kind) {
|
|
120
|
+
case "builtin":
|
|
121
|
+
return null;
|
|
122
|
+
case "bare":
|
|
123
|
+
return checkBareSpecifier(scope, file, site, cls.specifier);
|
|
124
|
+
case "relative":
|
|
125
|
+
case "alias":
|
|
126
|
+
return checkResolvedPath(scope, file, site, cls.specifier, cls.resolvedRepoRel);
|
|
127
|
+
default: {
|
|
128
|
+
const _exhaustive = cls;
|
|
129
|
+
return _exhaustive;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
/** Scan a single source file's import sites against the effective scope. */
|
|
134
|
+
export function scanFileImports(repoRoot, fileRel, scope, ts = loadTsconfigPaths(repoRoot)) {
|
|
135
|
+
const abs = path.join(repoRoot, fileRel);
|
|
136
|
+
if (!fs.existsSync(abs) || !fs.statSync(abs).isFile())
|
|
137
|
+
return [];
|
|
138
|
+
const norm = normalizeRepoRelativePath(fileRel);
|
|
139
|
+
const out = [];
|
|
140
|
+
for (const site of extractImportSites(fs.readFileSync(abs, "utf8"))) {
|
|
141
|
+
const v = checkSite(scope, norm, site, ts);
|
|
142
|
+
if (v)
|
|
143
|
+
out.push(v);
|
|
144
|
+
}
|
|
145
|
+
return out;
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Import-site scan for the effective cage: banned / unlisted bare specifiers, non-literal dynamic
|
|
149
|
+
* specifiers, and relative or alias imports resolving into forbidden zones (or outside TMVC when
|
|
150
|
+
* `strict_relative_imports`). Deterministic ordering by file, line, column.
|
|
151
|
+
*/
|
|
152
|
+
export function scanContractImports(repoRoot, scope, options = {}) {
|
|
153
|
+
const files = options.files
|
|
154
|
+
? [...new Set(options.files.map(normalizeRepoRelativePath))].filter(isScannableSource).sort()
|
|
155
|
+
: scope.tmvcRoots.length > 0
|
|
156
|
+
? listSourcesUnderRoots(repoRoot, scope.tmvcRoots)
|
|
157
|
+
: listChangedSourceFiles(repoRoot);
|
|
158
|
+
const ts = loadTsconfigPaths(repoRoot);
|
|
159
|
+
const out = [];
|
|
160
|
+
for (const file of files)
|
|
161
|
+
out.push(...scanFileImports(repoRoot, file, scope, ts));
|
|
162
|
+
return out.sort((a, b) => a.file.localeCompare(b.file) || a.line - b.line || a.column - b.column);
|
|
163
|
+
}
|
|
164
|
+
export function formatContractViolation(v) {
|
|
165
|
+
return `[${contractViolationCode(v.kind)}] ${v.file}:${v.line}:${v.column} ${v.detail}`;
|
|
166
|
+
}
|
|
167
|
+
//# sourceMappingURL=contract-scan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contract-scan.js","sourceRoot":"","sources":["../../../../src/cli/lib/contract/contract-scan.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/** Planner-sealed mission cage (ADR-0045). All fields optional; absent = inherit skill/policy. */
|
|
2
|
+
export interface MissionContract {
|
|
3
|
+
tmvc_roots?: string[];
|
|
4
|
+
forbidden_zones?: string[];
|
|
5
|
+
allowed_imports?: string[];
|
|
6
|
+
banned_imports?: string[];
|
|
7
|
+
allow_dynamic_specifiers?: boolean;
|
|
8
|
+
strict_relative_imports?: boolean;
|
|
9
|
+
}
|
|
10
|
+
/** Effective cage after merging skill roots, mission contract, and org policy (tighten-only). */
|
|
11
|
+
export interface EffectiveScope {
|
|
12
|
+
/** Repo-relative TMVC roots (contract narrowing when present, else skill roots). */
|
|
13
|
+
tmvcRoots: string[];
|
|
14
|
+
/** Union of skill, contract, and policy forbidden zones. */
|
|
15
|
+
forbiddenZones: string[];
|
|
16
|
+
/** Bare-specifier allowlist; empty = no allowlist enforced. */
|
|
17
|
+
allowedImports: string[];
|
|
18
|
+
/** Union of contract and policy banned bare specifiers (exact or prefix match). */
|
|
19
|
+
bannedImports: string[];
|
|
20
|
+
allowDynamicSpecifiers: boolean;
|
|
21
|
+
strictRelativeImports: boolean;
|
|
22
|
+
/** True when the mission declared a contract block. */
|
|
23
|
+
hasContract: boolean;
|
|
24
|
+
}
|
|
25
|
+
export type ContractViolationKind = "banned" | "unlisted" | "dynamic" | "scope_escape";
|
|
26
|
+
export interface ContractImportViolation {
|
|
27
|
+
kind: ContractViolationKind;
|
|
28
|
+
/** Repo-relative importing file. */
|
|
29
|
+
file: string;
|
|
30
|
+
line: number;
|
|
31
|
+
column: number;
|
|
32
|
+
/** Specifier text, or the raw expression for dynamic sites. */
|
|
33
|
+
specifier: string;
|
|
34
|
+
detail: string;
|
|
35
|
+
}
|
|
36
|
+
export declare const CONTRACT_ARRAY_KEYS: readonly ["tmvc_roots", "forbidden_zones", "allowed_imports", "banned_imports"];
|
|
37
|
+
export declare const CONTRACT_BOOLEAN_KEYS: readonly ["allow_dynamic_specifiers", "strict_relative_imports"];
|
|
38
|
+
//# sourceMappingURL=contract-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contract-types.d.ts","sourceRoot":"","sources":["../../../../src/cli/lib/contract/contract-types.ts"],"names":[],"mappings":"AAAA,kGAAkG;AAClG,MAAM,WAAW,eAAe;IAC9B,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,wBAAwB,CAAC,EAAE,OAAO,CAAC;IACnC,uBAAuB,CAAC,EAAE,OAAO,CAAC;CACnC;AAED,iGAAiG;AACjG,MAAM,WAAW,cAAc;IAC7B,oFAAoF;IACpF,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,4DAA4D;IAC5D,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,+DAA+D;IAC/D,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,mFAAmF;IACnF,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,sBAAsB,EAAE,OAAO,CAAC;IAChC,qBAAqB,EAAE,OAAO,CAAC;IAC/B,uDAAuD;IACvD,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,MAAM,qBAAqB,GAAG,QAAQ,GAAG,UAAU,GAAG,SAAS,GAAG,cAAc,CAAC;AAEvF,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,qBAAqB,CAAC;IAC5B,oCAAoC;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,+DAA+D;IAC/D,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,eAAO,MAAM,mBAAmB,iFAKuB,CAAC;AAExD,eAAO,MAAM,qBAAqB,kEAGqB,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export const CONTRACT_ARRAY_KEYS = [
|
|
2
|
+
"tmvc_roots",
|
|
3
|
+
"forbidden_zones",
|
|
4
|
+
"allowed_imports",
|
|
5
|
+
"banned_imports",
|
|
6
|
+
];
|
|
7
|
+
export const CONTRACT_BOOLEAN_KEYS = [
|
|
8
|
+
"allow_dynamic_specifiers",
|
|
9
|
+
"strict_relative_imports",
|
|
10
|
+
];
|
|
11
|
+
//# sourceMappingURL=contract-types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contract-types.js","sourceRoot":"","sources":["../../../../src/cli/lib/contract/contract-types.ts"],"names":[],"mappings":"AAuCA,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,YAAY;IACZ,iBAAiB;IACjB,iBAAiB;IACjB,gBAAgB;CACqC,CAAC;AAExD,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,0BAA0B;IAC1B,yBAAyB;CAC4B,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { OrgPolicyBundle } from "../policy/policy-types.js";
|
|
2
|
+
import type { Manifest, ParsedMission } from "../types.js";
|
|
3
|
+
import type { EffectiveScope, MissionContract } from "./contract-types.js";
|
|
4
|
+
export interface ResolveEffectiveScopeInput {
|
|
5
|
+
manifest: Manifest;
|
|
6
|
+
skillKey: string;
|
|
7
|
+
contract: MissionContract | null;
|
|
8
|
+
/** Cached org policy bundle (ADR-0042); null when absent or unreadable. */
|
|
9
|
+
policy?: OrgPolicyBundle | null;
|
|
10
|
+
}
|
|
11
|
+
/** Best-effort offline policy bundle; verify's policy phase owns failure reporting. */
|
|
12
|
+
export declare function loadPolicyBundleQuiet(root: string): OrgPolicyBundle | null;
|
|
13
|
+
/**
|
|
14
|
+
* Tighten-only merge (RULES §4, §8): TMVC = contract narrowing or skill roots; forbidden zones and
|
|
15
|
+
* banned imports are unions of skill, contract, and policy. Throws GXT_CONTRACT_SCOPE_ESCAPE when the
|
|
16
|
+
* contract tries to widen scope.
|
|
17
|
+
*/
|
|
18
|
+
export declare function resolveEffectiveScope(input: ResolveEffectiveScopeInput): EffectiveScope;
|
|
19
|
+
/** Convenience for callers holding a parsed mission and repo root (loads policy quietly). */
|
|
20
|
+
export declare function resolveEffectiveScopeForMission(root: string, manifest: Manifest, mission: ParsedMission): EffectiveScope;
|
|
21
|
+
//# sourceMappingURL=effective-scope.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"effective-scope.d.ts","sourceRoot":"","sources":["../../../../src/cli/lib/contract/effective-scope.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAIjE,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE3D,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAE3E,MAAM,WAAW,0BAA0B;IACzC,QAAQ,EAAE,QAAQ,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,eAAe,GAAG,IAAI,CAAC;IACjC,2EAA2E;IAC3E,MAAM,CAAC,EAAE,eAAe,GAAG,IAAI,CAAC;CACjC;AAED,uFAAuF;AACvF,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CAI1E;AA+BD;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,0BAA0B,GAAG,cAAc,CAyBvF;AAED,6FAA6F;AAC7F,wBAAgB,+BAA+B,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,aAAa,GAAG,cAAc,CAWxH"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { GantryUserError } from "../errors.js";
|
|
2
|
+
import { GXT_ERROR } from "../gxt-error-codes.js";
|
|
3
|
+
import { resolveOrgPolicy } from "../policy/policy-resolve.js";
|
|
4
|
+
import { resolveManifestSkillKey } from "../skill-key.js";
|
|
5
|
+
import { isPathUnderRoot } from "../tmvc-path.js";
|
|
6
|
+
import { normalizeContract, normalizeContractPath } from "./contract-hash.js";
|
|
7
|
+
/** Best-effort offline policy bundle; verify's policy phase owns failure reporting. */
|
|
8
|
+
export function loadPolicyBundleQuiet(root) {
|
|
9
|
+
const resolved = resolveOrgPolicy(root);
|
|
10
|
+
if (!resolved.ok || !resolved.present)
|
|
11
|
+
return null;
|
|
12
|
+
return resolved.bundle;
|
|
13
|
+
}
|
|
14
|
+
function unionSorted(...lists) {
|
|
15
|
+
const out = new Set();
|
|
16
|
+
for (const list of lists)
|
|
17
|
+
for (const v of list)
|
|
18
|
+
if (v.trim())
|
|
19
|
+
out.add(v);
|
|
20
|
+
return [...out].sort();
|
|
21
|
+
}
|
|
22
|
+
function assertSubsetOfSkillRoots(contractRoots, skillRoots, skillKey) {
|
|
23
|
+
if (skillRoots.length === 0)
|
|
24
|
+
return;
|
|
25
|
+
const escaped = contractRoots.filter((r) => !skillRoots.some((s) => isPathUnderRoot(r, s)));
|
|
26
|
+
if (escaped.length === 0)
|
|
27
|
+
return;
|
|
28
|
+
throw new GantryUserError(GXT_ERROR.CONTRACT_SCOPE_ESCAPE, `${GXT_ERROR.CONTRACT_SCOPE_ESCAPE}: contract.tmvc_roots must stay inside skill ${skillKey} roots (${skillRoots.join(", ")}); escaped: ${escaped.join(", ")}`, "Narrow contract.tmvc_roots to a subset of the manifest skill tmvc_roots, or legislate under a skill that owns those roots.", 2);
|
|
29
|
+
}
|
|
30
|
+
function assertRootsOutsideForbidden(contractRoots, forbidden) {
|
|
31
|
+
const hits = contractRoots.filter((r) => forbidden.some((fz) => isPathUnderRoot(r, fz)));
|
|
32
|
+
if (hits.length === 0)
|
|
33
|
+
return;
|
|
34
|
+
throw new GantryUserError(GXT_ERROR.CONTRACT_SCOPE_ESCAPE, `${GXT_ERROR.CONTRACT_SCOPE_ESCAPE}: contract.tmvc_roots overlap forbidden zones: ${hits.join(", ")}`, "Remove the forbidden path from contract.tmvc_roots; forbidden zones are tighten-only and cannot be re-opened by a mission.", 2);
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Tighten-only merge (RULES §4, §8): TMVC = contract narrowing or skill roots; forbidden zones and
|
|
38
|
+
* banned imports are unions of skill, contract, and policy. Throws GXT_CONTRACT_SCOPE_ESCAPE when the
|
|
39
|
+
* contract tries to widen scope.
|
|
40
|
+
*/
|
|
41
|
+
export function resolveEffectiveScope(input) {
|
|
42
|
+
const skillKey = resolveManifestSkillKey(input.manifest, input.skillKey);
|
|
43
|
+
const skill = input.manifest.skills[skillKey];
|
|
44
|
+
const skillRoots = (skill?.tmvc_roots ?? []).map(normalizeContractPath);
|
|
45
|
+
const skillForbidden = (skill?.forbidden_zones ?? []).map(normalizeContractPath);
|
|
46
|
+
const contract = input.contract ? normalizeContract(input.contract) : {};
|
|
47
|
+
const policy = input.policy ?? null;
|
|
48
|
+
const policyForbidden = (policy?.manifest_constraints?.forbidden_zones_add ?? []).map(normalizeContractPath);
|
|
49
|
+
const policyBanned = (policy?.banned_imports ?? []).map((b) => b.specifier.trim());
|
|
50
|
+
const forbiddenZones = unionSorted(skillForbidden, contract.forbidden_zones ?? [], policyForbidden);
|
|
51
|
+
const contractRoots = contract.tmvc_roots ?? [];
|
|
52
|
+
assertSubsetOfSkillRoots(contractRoots, skillRoots, skillKey);
|
|
53
|
+
assertRootsOutsideForbidden(contractRoots, forbiddenZones);
|
|
54
|
+
return {
|
|
55
|
+
tmvcRoots: contractRoots.length > 0 ? contractRoots : skillRoots,
|
|
56
|
+
forbiddenZones,
|
|
57
|
+
allowedImports: [...(contract.allowed_imports ?? [])],
|
|
58
|
+
bannedImports: unionSorted(contract.banned_imports ?? [], policyBanned),
|
|
59
|
+
allowDynamicSpecifiers: contract.allow_dynamic_specifiers === true,
|
|
60
|
+
strictRelativeImports: contract.strict_relative_imports === true,
|
|
61
|
+
hasContract: input.contract !== null,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
/** Convenience for callers holding a parsed mission and repo root (loads policy quietly). */
|
|
65
|
+
export function resolveEffectiveScopeForMission(root, manifest, mission) {
|
|
66
|
+
const skillKey = mission.skillKey?.trim();
|
|
67
|
+
if (!skillKey) {
|
|
68
|
+
throw new GantryUserError("MISSION_SCHEMA_INVALID", `mission missing skill_key (${mission.rawPath})`, undefined, 2);
|
|
69
|
+
}
|
|
70
|
+
return resolveEffectiveScope({
|
|
71
|
+
manifest,
|
|
72
|
+
skillKey,
|
|
73
|
+
contract: mission.contract,
|
|
74
|
+
policy: loadPolicyBundleQuiet(root),
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=effective-scope.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"effective-scope.js","sourceRoot":"","sources":["../../../../src/cli/lib/contract/effective-scope.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { EffectiveScope, MissionContract } from "./contract-types.js";
|
|
2
|
+
import type { ProposedGate } from "./propose-gate.js";
|
|
3
|
+
export interface CageFormatInput {
|
|
4
|
+
tmvcRoots?: readonly string[];
|
|
5
|
+
forbiddenZones?: readonly string[];
|
|
6
|
+
allowedImports?: readonly string[];
|
|
7
|
+
bannedImports?: readonly string[];
|
|
8
|
+
allowDynamicSpecifiers?: boolean;
|
|
9
|
+
strictRelativeImports?: boolean;
|
|
10
|
+
emptyRoots?: string;
|
|
11
|
+
emptyForbidden?: string;
|
|
12
|
+
emptyAllowed?: string;
|
|
13
|
+
emptyBanned?: string;
|
|
14
|
+
gate?: ProposedGate | null;
|
|
15
|
+
}
|
|
16
|
+
/** Four cage lists + flags. Check, show, and propose share this. */
|
|
17
|
+
export declare function formatCage(input: CageFormatInput): string;
|
|
18
|
+
export declare function formatContractBlock(contract: MissionContract, gate?: ProposedGate | null): string;
|
|
19
|
+
export declare function formatEffectiveScope(scope: EffectiveScope, gate?: ProposedGate | null): string;
|
|
20
|
+
//# sourceMappingURL=format.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../../../src/cli/lib/contract/format.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAC3E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAMtD,MAAM,WAAW,eAAe;IAC9B,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC9B,cAAc,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,cAAc,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,aAAa,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,YAAY,GAAG,IAAI,CAAC;CAC5B;AAED,oEAAoE;AACpE,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,MAAM,CAmBzD;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,eAAe,EAAE,IAAI,CAAC,EAAE,YAAY,GAAG,IAAI,GAAG,MAAM,CAUjG;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,cAAc,EAAE,IAAI,CAAC,EAAE,YAAY,GAAG,IAAI,GAAG,MAAM,CAc9F"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
function csv(values, empty) {
|
|
2
|
+
return values && values.length > 0 ? values.join(", ") : empty;
|
|
3
|
+
}
|
|
4
|
+
/** Four cage lists + flags. Check, show, and propose share this. */
|
|
5
|
+
export function formatCage(input) {
|
|
6
|
+
const lines = [
|
|
7
|
+
"Scope:",
|
|
8
|
+
` ${csv(input.tmvcRoots, input.emptyRoots ?? "(inherit skill roots)")}`,
|
|
9
|
+
"Forbidden:",
|
|
10
|
+
` ${csv(input.forbiddenZones, input.emptyForbidden ?? "(none beyond skill/policy)")}`,
|
|
11
|
+
];
|
|
12
|
+
if (input.gate !== undefined) {
|
|
13
|
+
lines.push("Gate:", ` ${input.gate?.command ?? "(unchanged)"}`);
|
|
14
|
+
}
|
|
15
|
+
lines.push("Allowed Imports:", ` ${csv(input.allowedImports, input.emptyAllowed ?? "(any bare specifier)")}`, "Banned Imports:", ` ${csv(input.bannedImports, input.emptyBanned ?? "(none)")}`);
|
|
16
|
+
if (input.allowDynamicSpecifiers === true)
|
|
17
|
+
lines.push("Dynamic specifiers: allowed");
|
|
18
|
+
if (input.strictRelativeImports === true)
|
|
19
|
+
lines.push("Strict relative imports: on");
|
|
20
|
+
return lines.join("\n");
|
|
21
|
+
}
|
|
22
|
+
export function formatContractBlock(contract, gate) {
|
|
23
|
+
return formatCage({
|
|
24
|
+
tmvcRoots: contract.tmvc_roots,
|
|
25
|
+
forbiddenZones: contract.forbidden_zones,
|
|
26
|
+
allowedImports: contract.allowed_imports,
|
|
27
|
+
bannedImports: contract.banned_imports,
|
|
28
|
+
allowDynamicSpecifiers: contract.allow_dynamic_specifiers,
|
|
29
|
+
strictRelativeImports: contract.strict_relative_imports,
|
|
30
|
+
gate: gate ?? null,
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
export function formatEffectiveScope(scope, gate) {
|
|
34
|
+
return formatCage({
|
|
35
|
+
tmvcRoots: scope.tmvcRoots,
|
|
36
|
+
forbiddenZones: scope.forbiddenZones,
|
|
37
|
+
allowedImports: scope.allowedImports,
|
|
38
|
+
bannedImports: scope.bannedImports,
|
|
39
|
+
allowDynamicSpecifiers: scope.allowDynamicSpecifiers,
|
|
40
|
+
strictRelativeImports: scope.strictRelativeImports,
|
|
41
|
+
emptyRoots: "(none)",
|
|
42
|
+
emptyForbidden: "(none)",
|
|
43
|
+
emptyAllowed: "(any)",
|
|
44
|
+
emptyBanned: "(none)",
|
|
45
|
+
gate,
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=format.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format.js","sourceRoot":"","sources":["../../../../src/cli/lib/contract/format.ts"],"names":[],"mappings":"AAGA,SAAS,GAAG,CAAC,MAAqC,EAAE,KAAa;IAC/D,OAAO,MAAM,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;AACjE,CAAC;AAgBD,oEAAoE;AACpE,MAAM,UAAU,UAAU,CAAC,KAAsB;IAC/C,MAAM,KAAK,GAAG;QACZ,QAAQ;QACR,KAAK,GAAG,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,UAAU,IAAI,uBAAuB,CAAC,EAAE;QACxE,YAAY;QACZ,KAAK,GAAG,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,cAAc,IAAI,4BAA4B,CAAC,EAAE;KACvF,CAAC;IACF,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC7B,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,KAAK,CAAC,IAAI,EAAE,OAAO,IAAI,aAAa,EAAE,CAAC,CAAC;IACnE,CAAC;IACD,KAAK,CAAC,IAAI,CACR,kBAAkB,EAClB,KAAK,GAAG,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,YAAY,IAAI,sBAAsB,CAAC,EAAE,EAC9E,iBAAiB,EACjB,KAAK,GAAG,CAAC,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,WAAW,IAAI,QAAQ,CAAC,EAAE,CAC/D,CAAC;IACF,IAAI,KAAK,CAAC,sBAAsB,KAAK,IAAI;QAAE,KAAK,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;IACrF,IAAI,KAAK,CAAC,qBAAqB,KAAK,IAAI;QAAE,KAAK,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;IACpF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,QAAyB,EAAE,IAA0B;IACvF,OAAO,UAAU,CAAC;QAChB,SAAS,EAAE,QAAQ,CAAC,UAAU;QAC9B,cAAc,EAAE,QAAQ,CAAC,eAAe;QACxC,cAAc,EAAE,QAAQ,CAAC,eAAe;QACxC,aAAa,EAAE,QAAQ,CAAC,cAAc;QACtC,sBAAsB,EAAE,QAAQ,CAAC,wBAAwB;QACzD,qBAAqB,EAAE,QAAQ,CAAC,uBAAuB;QACvD,IAAI,EAAE,IAAI,IAAI,IAAI;KACnB,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,KAAqB,EAAE,IAA0B;IACpF,OAAO,UAAU,CAAC;QAChB,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,cAAc,EAAE,KAAK,CAAC,cAAc;QACpC,cAAc,EAAE,KAAK,CAAC,cAAc;QACpC,aAAa,EAAE,KAAK,CAAC,aAAa;QAClC,sBAAsB,EAAE,KAAK,CAAC,sBAAsB;QACpD,qBAAqB,EAAE,KAAK,CAAC,qBAAqB;QAClD,UAAU,EAAE,QAAQ;QACpB,cAAc,EAAE,QAAQ;QACxB,YAAY,EAAE,OAAO;QACrB,WAAW,EAAE,QAAQ;QACrB,IAAI;KACL,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { SkillEntry } from "../types.js";
|
|
2
|
+
export interface ProposedGate {
|
|
3
|
+
command: string;
|
|
4
|
+
successSubstring: string | null;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Prefer a skill allowlist entry whose text names a proposed TMVC root segment (e.g. `test:billing`),
|
|
8
|
+
* else the first allowlisted command. `package.json` script names are a secondary signal when no
|
|
9
|
+
* allowlist exists. Falls back to `echo OK` so interrogation can raise `missing_test_criteria`.
|
|
10
|
+
*/
|
|
11
|
+
export declare function proposeGate(input: {
|
|
12
|
+
root: string;
|
|
13
|
+
skill: SkillEntry | undefined;
|
|
14
|
+
proposedRoots: readonly string[];
|
|
15
|
+
explicitCommand?: string;
|
|
16
|
+
explicitSuccess?: string;
|
|
17
|
+
}): {
|
|
18
|
+
gate: ProposedGate;
|
|
19
|
+
rationale: string;
|
|
20
|
+
};
|
|
21
|
+
//# sourceMappingURL=propose-gate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"propose-gate.d.ts","sourceRoot":"","sources":["../../../../src/cli/lib/contract/propose-gate.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;CACjC;AAsBD;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,UAAU,GAAG,SAAS,CAAC;IAC9B,aAAa,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,GAAG;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CA8B5C"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
function packageScripts(root) {
|
|
4
|
+
const abs = path.join(root, "package.json");
|
|
5
|
+
if (!fs.existsSync(abs))
|
|
6
|
+
return [];
|
|
7
|
+
try {
|
|
8
|
+
const scripts = JSON.parse(fs.readFileSync(abs, "utf8")).scripts;
|
|
9
|
+
return scripts ? Object.keys(scripts).sort() : [];
|
|
10
|
+
}
|
|
11
|
+
catch {
|
|
12
|
+
return [];
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
function rootSegmentHits(command, roots) {
|
|
16
|
+
let hits = 0;
|
|
17
|
+
for (const root of roots) {
|
|
18
|
+
const seg = root.replace(/\/$/, "").split("/").filter(Boolean).pop();
|
|
19
|
+
if (seg && command.includes(seg))
|
|
20
|
+
hits += 1;
|
|
21
|
+
}
|
|
22
|
+
return hits;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Prefer a skill allowlist entry whose text names a proposed TMVC root segment (e.g. `test:billing`),
|
|
26
|
+
* else the first allowlisted command. `package.json` script names are a secondary signal when no
|
|
27
|
+
* allowlist exists. Falls back to `echo OK` so interrogation can raise `missing_test_criteria`.
|
|
28
|
+
*/
|
|
29
|
+
export function proposeGate(input) {
|
|
30
|
+
if (input.explicitCommand?.trim()) {
|
|
31
|
+
const command = input.explicitCommand.trim();
|
|
32
|
+
return {
|
|
33
|
+
gate: {
|
|
34
|
+
command,
|
|
35
|
+
successSubstring: input.explicitSuccess !== undefined ? input.explicitSuccess.trim() || null : null,
|
|
36
|
+
},
|
|
37
|
+
rationale: `gate_command from --gate-command: ${command}`,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
const allow = input.skill?.gate_commands ?? [];
|
|
41
|
+
if (allow.length > 0) {
|
|
42
|
+
const ranked = [...allow].sort((a, b) => rootSegmentHits(b, input.proposedRoots) - rootSegmentHits(a, input.proposedRoots) || a.localeCompare(b));
|
|
43
|
+
const command = ranked[0];
|
|
44
|
+
return { gate: { command, successSubstring: null }, rationale: `gate_command from skill allowlist: ${command}` };
|
|
45
|
+
}
|
|
46
|
+
const scripts = packageScripts(input.root);
|
|
47
|
+
const scriptHit = scripts.find((s) => rootSegmentHits(`npm run ${s}`, input.proposedRoots) > 0);
|
|
48
|
+
if (scriptHit) {
|
|
49
|
+
const command = `npm run ${scriptHit}`;
|
|
50
|
+
return { gate: { command, successSubstring: null }, rationale: `gate_command from package.json script matching a TMVC segment: ${command}` };
|
|
51
|
+
}
|
|
52
|
+
return {
|
|
53
|
+
gate: { command: "echo OK", successSubstring: "OK" },
|
|
54
|
+
rationale: "gate_command fallback echo OK (no skill allowlist; interrogation may raise missing_test_criteria)",
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=propose-gate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"propose-gate.js","sourceRoot":"","sources":["../../../../src/cli/lib/contract/propose-gate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { OrgPolicyBundle } from "../policy/policy-types.js";
|
|
2
|
+
export interface WorkspacePackage {
|
|
3
|
+
name: string;
|
|
4
|
+
dir: string;
|
|
5
|
+
}
|
|
6
|
+
/** Workspace packages from root `package.json` `workspaces` (no npm expand). */
|
|
7
|
+
export declare function listWorkspacePackages(root: string): WorkspacePackage[];
|
|
8
|
+
export interface ProposeImportsInput {
|
|
9
|
+
root: string;
|
|
10
|
+
proposedRoots: readonly string[];
|
|
11
|
+
forbiddenZones: readonly string[];
|
|
12
|
+
policy: OrgPolicyBundle | null;
|
|
13
|
+
}
|
|
14
|
+
export interface ProposeImportsResult {
|
|
15
|
+
allowed_imports: string[];
|
|
16
|
+
banned_imports: string[];
|
|
17
|
+
extraForbidden: string[];
|
|
18
|
+
rationale: string[];
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Allowed = bare specifiers already imported under proposed roots. Banned = policy ∪ arch
|
|
22
|
+
* substring rules ∪ specifiers seen only in forbidden zones. Workspace packages named by a
|
|
23
|
+
* banned specifier have their directory appended so relative traversal cannot substitute.
|
|
24
|
+
*/
|
|
25
|
+
export declare function proposeImports(input: ProposeImportsInput): ProposeImportsResult;
|
|
26
|
+
//# sourceMappingURL=propose-imports.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"propose-imports.d.ts","sourceRoot":"","sources":["../../../../src/cli/lib/contract/propose-imports.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAEjE,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;CACb;AAuBD,gFAAgF;AAChF,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,EAAE,CAsBtE;AAoCD,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,cAAc,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,MAAM,EAAE,eAAe,GAAG,IAAI,CAAC;CAChC;AAED,MAAM,WAAW,oBAAoB;IACnC,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,mBAAmB,GAAG,oBAAoB,CA0B/E"}
|