@jeger-ai/opengantry 3.3.0 → 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.
Files changed (166) hide show
  1. package/README.md +5 -2
  2. package/dist/cli/commands/contract.d.ts +21 -0
  3. package/dist/cli/commands/contract.d.ts.map +1 -0
  4. package/dist/cli/commands/contract.js +113 -0
  5. package/dist/cli/commands/contract.js.map +1 -0
  6. package/dist/cli/commands/tmvc-guard.d.ts.map +1 -1
  7. package/dist/cli/commands/tmvc-guard.js +1 -0
  8. package/dist/cli/commands/tmvc-guard.js.map +1 -1
  9. package/dist/cli/lib/contract/approve-prompt.d.ts +22 -0
  10. package/dist/cli/lib/contract/approve-prompt.d.ts.map +1 -0
  11. package/dist/cli/lib/contract/approve-prompt.js +71 -0
  12. package/dist/cli/lib/contract/approve-prompt.js.map +1 -0
  13. package/dist/cli/lib/contract/contract-hash.d.ts +19 -0
  14. package/dist/cli/lib/contract/contract-hash.d.ts.map +1 -0
  15. package/dist/cli/lib/contract/contract-hash.js +67 -0
  16. package/dist/cli/lib/contract/contract-hash.js.map +1 -0
  17. package/dist/cli/lib/contract/contract-scan.d.ts +27 -0
  18. package/dist/cli/lib/contract/contract-scan.d.ts.map +1 -0
  19. package/dist/cli/lib/contract/contract-scan.js +167 -0
  20. package/dist/cli/lib/contract/contract-scan.js.map +1 -0
  21. package/dist/cli/lib/contract/contract-types.d.ts +38 -0
  22. package/dist/cli/lib/contract/contract-types.d.ts.map +1 -0
  23. package/dist/cli/lib/contract/contract-types.js +11 -0
  24. package/dist/cli/lib/contract/contract-types.js.map +1 -0
  25. package/dist/cli/lib/contract/effective-scope.d.ts +21 -0
  26. package/dist/cli/lib/contract/effective-scope.d.ts.map +1 -0
  27. package/dist/cli/lib/contract/effective-scope.js +77 -0
  28. package/dist/cli/lib/contract/effective-scope.js.map +1 -0
  29. package/dist/cli/lib/contract/format.d.ts +20 -0
  30. package/dist/cli/lib/contract/format.d.ts.map +1 -0
  31. package/dist/cli/lib/contract/format.js +48 -0
  32. package/dist/cli/lib/contract/format.js.map +1 -0
  33. package/dist/cli/lib/contract/propose-gate.d.ts +21 -0
  34. package/dist/cli/lib/contract/propose-gate.d.ts.map +1 -0
  35. package/dist/cli/lib/contract/propose-gate.js +57 -0
  36. package/dist/cli/lib/contract/propose-gate.js.map +1 -0
  37. package/dist/cli/lib/contract/propose-imports.d.ts +26 -0
  38. package/dist/cli/lib/contract/propose-imports.d.ts.map +1 -0
  39. package/dist/cli/lib/contract/propose-imports.js +128 -0
  40. package/dist/cli/lib/contract/propose-imports.js.map +1 -0
  41. package/dist/cli/lib/contract/propose.d.ts +25 -0
  42. package/dist/cli/lib/contract/propose.d.ts.map +1 -0
  43. package/dist/cli/lib/contract/propose.js +100 -0
  44. package/dist/cli/lib/contract/propose.js.map +1 -0
  45. package/dist/cli/lib/contract/resolve-specifier.d.ts +34 -0
  46. package/dist/cli/lib/contract/resolve-specifier.d.ts.map +1 -0
  47. package/dist/cli/lib/contract/resolve-specifier.js +93 -0
  48. package/dist/cli/lib/contract/resolve-specifier.js.map +1 -0
  49. package/dist/cli/lib/draft-token.d.ts +5 -2
  50. package/dist/cli/lib/draft-token.d.ts.map +1 -1
  51. package/dist/cli/lib/draft-token.js +18 -3
  52. package/dist/cli/lib/draft-token.js.map +1 -1
  53. package/dist/cli/lib/errors.d.ts +2 -0
  54. package/dist/cli/lib/errors.d.ts.map +1 -1
  55. package/dist/cli/lib/errors.js +15 -2
  56. package/dist/cli/lib/errors.js.map +1 -1
  57. package/dist/cli/lib/git.d.ts +6 -0
  58. package/dist/cli/lib/git.d.ts.map +1 -1
  59. package/dist/cli/lib/git.js +10 -2
  60. package/dist/cli/lib/git.js.map +1 -1
  61. package/dist/cli/lib/gxt-error-codes.d.ts +5 -0
  62. package/dist/cli/lib/gxt-error-codes.d.ts.map +1 -1
  63. package/dist/cli/lib/gxt-error-codes.js +6 -0
  64. package/dist/cli/lib/gxt-error-codes.js.map +1 -1
  65. package/dist/cli/lib/import-scanner.d.ts +13 -3
  66. package/dist/cli/lib/import-scanner.d.ts.map +1 -1
  67. package/dist/cli/lib/import-scanner.js +185 -23
  68. package/dist/cli/lib/import-scanner.js.map +1 -1
  69. package/dist/cli/lib/interrogate/gaps.d.ts +2 -0
  70. package/dist/cli/lib/interrogate/gaps.d.ts.map +1 -1
  71. package/dist/cli/lib/interrogate/gaps.js +3 -4
  72. package/dist/cli/lib/interrogate/gaps.js.map +1 -1
  73. package/dist/cli/lib/interrogate/run.d.ts +1 -0
  74. package/dist/cli/lib/interrogate/run.d.ts.map +1 -1
  75. package/dist/cli/lib/interrogate/run.js +1 -0
  76. package/dist/cli/lib/interrogate/run.js.map +1 -1
  77. package/dist/cli/lib/legislate-from-intent.d.ts +9 -0
  78. package/dist/cli/lib/legislate-from-intent.d.ts.map +1 -0
  79. package/dist/cli/lib/legislate-from-intent.js +59 -0
  80. package/dist/cli/lib/legislate-from-intent.js.map +1 -0
  81. package/dist/cli/lib/legislate.d.ts +3 -1
  82. package/dist/cli/lib/legislate.d.ts.map +1 -1
  83. package/dist/cli/lib/legislate.js +24 -0
  84. package/dist/cli/lib/legislate.js.map +1 -1
  85. package/dist/cli/lib/mcp-draft-legislation.d.ts.map +1 -1
  86. package/dist/cli/lib/mcp-draft-legislation.js +28 -10
  87. package/dist/cli/lib/mcp-draft-legislation.js.map +1 -1
  88. package/dist/cli/lib/mcp-execute-legislation.d.ts.map +1 -1
  89. package/dist/cli/lib/mcp-execute-legislation.js +1 -0
  90. package/dist/cli/lib/mcp-execute-legislation.js.map +1 -1
  91. package/dist/cli/lib/mcp-governance-shared.d.ts +2 -1
  92. package/dist/cli/lib/mcp-governance-shared.d.ts.map +1 -1
  93. package/dist/cli/lib/mcp-governance-shared.js.map +1 -1
  94. package/dist/cli/lib/mcp-propose-contract.d.ts +22 -0
  95. package/dist/cli/lib/mcp-propose-contract.d.ts.map +1 -0
  96. package/dist/cli/lib/mcp-propose-contract.js +51 -0
  97. package/dist/cli/lib/mcp-propose-contract.js.map +1 -0
  98. package/dist/cli/lib/mcp-tools-register.d.ts.map +1 -1
  99. package/dist/cli/lib/mcp-tools-register.js +20 -0
  100. package/dist/cli/lib/mcp-tools-register.js.map +1 -1
  101. package/dist/cli/lib/missions/formatter.d.ts.map +1 -1
  102. package/dist/cli/lib/missions/formatter.js +2 -0
  103. package/dist/cli/lib/missions/formatter.js.map +1 -1
  104. package/dist/cli/lib/missions/parser.d.ts.map +1 -1
  105. package/dist/cli/lib/missions/parser.js +14 -0
  106. package/dist/cli/lib/missions/parser.js.map +1 -1
  107. package/dist/cli/lib/runtime-env.d.ts +3 -0
  108. package/dist/cli/lib/runtime-env.d.ts.map +1 -1
  109. package/dist/cli/lib/runtime-env.js +12 -2
  110. package/dist/cli/lib/runtime-env.js.map +1 -1
  111. package/dist/cli/lib/runtime-exec.d.ts +5 -1
  112. package/dist/cli/lib/runtime-exec.d.ts.map +1 -1
  113. package/dist/cli/lib/runtime-exec.js +18 -1
  114. package/dist/cli/lib/runtime-exec.js.map +1 -1
  115. package/dist/cli/lib/staged-tmvc-guard.d.ts +3 -0
  116. package/dist/cli/lib/staged-tmvc-guard.d.ts.map +1 -1
  117. package/dist/cli/lib/staged-tmvc-guard.js +4 -2
  118. package/dist/cli/lib/staged-tmvc-guard.js.map +1 -1
  119. package/dist/cli/lib/types.d.ts +7 -0
  120. package/dist/cli/lib/types.d.ts.map +1 -1
  121. package/dist/cli/lib/types.js.map +1 -1
  122. package/dist/cli/lib/verify-contract.d.ts +22 -0
  123. package/dist/cli/lib/verify-contract.d.ts.map +1 -0
  124. package/dist/cli/lib/verify-contract.js +110 -0
  125. package/dist/cli/lib/verify-contract.js.map +1 -0
  126. package/dist/cli/lib/verify-engine.d.ts.map +1 -1
  127. package/dist/cli/lib/verify-engine.js +6 -0
  128. package/dist/cli/lib/verify-engine.js.map +1 -1
  129. package/dist/cli/lib/verify-failure-normalize.d.ts.map +1 -1
  130. package/dist/cli/lib/verify-failure-normalize.js +10 -0
  131. package/dist/cli/lib/verify-failure-normalize.js.map +1 -1
  132. package/dist/cli/lib/verify-failure.d.ts +7 -2
  133. package/dist/cli/lib/verify-failure.d.ts.map +1 -1
  134. package/dist/cli/lib/verify-finding.d.ts +1 -1
  135. package/dist/cli/lib/verify-finding.d.ts.map +1 -1
  136. package/dist/cli/lib/verify-finding.js.map +1 -1
  137. package/dist/cli/lib/verify-hints.d.ts.map +1 -1
  138. package/dist/cli/lib/verify-hints.js +13 -0
  139. package/dist/cli/lib/verify-hints.js.map +1 -1
  140. package/dist/cli/lib/verify-interrogation.d.ts +2 -0
  141. package/dist/cli/lib/verify-interrogation.d.ts.map +1 -1
  142. package/dist/cli/lib/verify-interrogation.js +2 -2
  143. package/dist/cli/lib/verify-interrogation.js.map +1 -1
  144. package/dist/cli/lib/verify-payload.d.ts.map +1 -1
  145. package/dist/cli/lib/verify-payload.js +1 -0
  146. package/dist/cli/lib/verify-payload.js.map +1 -1
  147. package/dist/cli/lib/verify-phase-clock.d.ts +1 -1
  148. package/dist/cli/lib/verify-phase-clock.d.ts.map +1 -1
  149. package/dist/cli/lib/verify-phase-clock.js +1 -0
  150. package/dist/cli/lib/verify-phase-clock.js.map +1 -1
  151. package/dist/cli/lib/version.gen.d.ts +1 -1
  152. package/dist/cli/lib/version.gen.js +1 -1
  153. package/dist/cli/program-mission.d.ts.map +1 -1
  154. package/dist/cli/program-mission.js +38 -0
  155. package/dist/cli/program-mission.js.map +1 -1
  156. package/dist/cli/program-workflow.d.ts +4 -1
  157. package/dist/cli/program-workflow.d.ts.map +1 -1
  158. package/dist/cli/program-workflow.js +23 -4
  159. package/dist/cli/program-workflow.js.map +1 -1
  160. package/package.json +1 -1
  161. package/templates/.gitagent/foreman/SUBSTRATE.version.json +1 -1
  162. package/templates/.gitagent/planner/MISSION-ARCHITECT.md +26 -5
  163. package/templates/.gitagent/planner/MISSION.schema.yaml +52 -0
  164. package/templates/.gitagent/planner/RULES.md +55 -36
  165. package/templates/.githooks/pre-commit +12 -0
  166. package/templates/integrations/compatibility.json +1 -1
package/README.md CHANGED
@@ -194,8 +194,9 @@ Violations carry `file` and `line` for the failure envelope.
194
194
  ### 5. Mission + verify
195
195
 
196
196
  ```bash
197
- gantry legislate "add feature X" --msn MSN-0042 --skill-key gantry
198
- # Planner commits [MSN-0042] mission YAML
197
+ gantry legislate --from-intent "add feature X" --msn MSN-0042 --skill-key gantry
198
+ # or: gantry contract propose "add feature X" --skill-key gantry
199
+ # Planner commits [MSN-0042] mission YAML (seals contract + contract_sha256)
199
200
  eval "$(gantry runtime env --mission .gitagent/missions/MSN-0042.yaml)"
200
201
  # ... do work, append trace to EXECUTOR_LOG.md ...
201
202
  gantry verify --mission .gitagent/missions/MSN-0042.yaml --json
@@ -213,6 +214,8 @@ On failure, external agents ingest `findings[]`:
213
214
  }
214
215
  ```
215
216
 
217
+ **Mission contracts (v3.4.0):** Planner-sealed inline `contract` + `contract_sha256` on the mission YAML (tighten-only TMVC / forbidden / import cage). `gantry contract propose|check|show`, `gantry legislate --from-intent`, MCP `gxt_propose_contract`. Verify runs a `contract` phase after git-proof; `gantry runtime env` exports `GXT_ALLOWED_IMPORTS` / `GXT_BANNED_IMPORTS`; `runtime exec` reports `contract_violation` ([ADR-0045](.gitagent/out-of-scope/ADR-0045-mission-contracts.md)).
218
+
216
219
  **Org control plane (v3.3.0):** pin a signed org policy repo with `.gitagent/foreman/POLICY.pointer.json` and `gantry policy pull` (doctor/verify stay offline). Enable `ledger.mode: local` to append digest-only entries to `refs/gxt/ledger` (`gantry ledger verify` / `export --format soc2-pack`). Cross-repo gates use mission `depends_on[]` plus `gantry deps fetch` before verify ([ADR-0042](.gitagent/out-of-scope/ADR-0042-org-policy-bundle.md), [ADR-0043](.gitagent/out-of-scope/ADR-0043-compliance-ledger-git-ref.md), [ADR-0044](.gitagent/out-of-scope/ADR-0044-cross-repo-mission-dependencies.md)). Receipt schema stays 0.2.0.
217
220
 
218
221
  **Kernel (v3.3.0 breaking):** `import { verifyMission } from "@jeger-ai/opengantry/kernel"` now returns a Promise — always `await`. `verifyMissionAsync` is a deprecated alias (`DeprecationWarning` `GXT_DEP_VERIFY_MISSION_ASYNC`, removed in 4.0). CLI `--json-out` is unchanged.
@@ -0,0 +1,21 @@
1
+ export interface ContractCheckCliOptions {
2
+ mission?: string;
3
+ json?: boolean;
4
+ /** Restrict the import scan to these repo-relative files. */
5
+ files?: string[];
6
+ }
7
+ /** Read-only: resolve the effective cage for a mission and scan import sites (ADR-0022 containment). */
8
+ export declare function runContractCheck(options: ContractCheckCliOptions): void;
9
+ export interface ContractProposeCliOptions {
10
+ intent: string;
11
+ skillKey?: string;
12
+ paths?: string[];
13
+ json?: boolean;
14
+ }
15
+ export declare function runContractPropose(options: ContractProposeCliOptions): void;
16
+ export interface ContractShowCliOptions {
17
+ mission?: string;
18
+ json?: boolean;
19
+ }
20
+ export declare function runContractShow(options: ContractShowCliOptions): void;
21
+ //# sourceMappingURL=contract.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contract.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/contract.ts"],"names":[],"mappings":"AAaA,MAAM,WAAW,uBAAuB;IACtC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,6DAA6D;IAC7D,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;CAClB;AA4BD,wGAAwG;AACxG,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,uBAAuB,GAAG,IAAI,CAgCvE;AAED,MAAM,WAAW,yBAAyB;IACxC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,yBAAyB,GAAG,IAAI,CAkC3E;AAED,MAAM,WAAW,sBAAsB;IACrC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,sBAAsB,GAAG,IAAI,CAcrE"}
@@ -0,0 +1,113 @@
1
+ import { setExitCode } from "../lib/cli-io.js";
2
+ import { runUserCommand } from "../lib/command-boundary.js";
3
+ import { contractViolationCode, formatContractViolation, scanContractImports } from "../lib/contract/contract-scan.js";
4
+ import { resolveEffectiveScope, resolveEffectiveScopeForMission } from "../lib/contract/effective-scope.js";
5
+ import { GantryUserError } from "../lib/errors.js";
6
+ import { parseMissionFile, resolvePinnedMission } from "../lib/missions/parser.js";
7
+ import { contractSha256, normalizeContract } from "../lib/contract/contract-hash.js";
8
+ import { formatContractBlock, formatEffectiveScope } from "../lib/contract/format.js";
9
+ import { proposeContract } from "../lib/contract/propose.js";
10
+ import { resolveSkillKeyForLegislation } from "../lib/legislate.js";
11
+ import { loadWorkspace } from "../lib/workspace.js";
12
+ function scopeJson(scope) {
13
+ return {
14
+ tmvc_roots: scope.tmvcRoots,
15
+ forbidden_zones: scope.forbiddenZones,
16
+ allowed_imports: scope.allowedImports,
17
+ banned_imports: scope.bannedImports,
18
+ allow_dynamic_specifiers: scope.allowDynamicSpecifiers,
19
+ strict_relative_imports: scope.strictRelativeImports,
20
+ has_contract: scope.hasContract,
21
+ };
22
+ }
23
+ function humanLines(missionRel, scope, violations) {
24
+ const lines = [
25
+ `contract check: ${missionRel}${scope.hasContract ? "" : " (no contract block — effective scope from skill/policy)"}`,
26
+ formatEffectiveScope(scope),
27
+ ];
28
+ if (violations.length === 0) {
29
+ lines.push("contract check: OK — no import-site violations");
30
+ return lines;
31
+ }
32
+ lines.push(`contract check: ${String(violations.length)} violation(s):`);
33
+ for (const v of violations)
34
+ lines.push(` ${formatContractViolation(v)}`);
35
+ return lines;
36
+ }
37
+ /** Read-only: resolve the effective cage for a mission and scan import sites (ADR-0022 containment). */
38
+ export function runContractCheck(options) {
39
+ runUserCommand({ json: options.json }, () => {
40
+ const workspace = loadWorkspace();
41
+ const missionRel = options.mission?.trim() || resolvePinnedMission(workspace.root);
42
+ if (!missionRel) {
43
+ throw new GantryUserError("MISSION_REQUIRED", "gantry contract check: pass --mission <path> or pin a mission first", "gantry pin --mission .gitagent/missions/<file>.yaml", 2);
44
+ }
45
+ const mission = parseMissionFile(workspace.root, missionRel);
46
+ const scope = resolveEffectiveScopeForMission(workspace.root, workspace.manifest, mission);
47
+ const violations = scanContractImports(workspace.root, scope, options.files && options.files.length > 0 ? { files: options.files } : {});
48
+ if (violations.length > 0)
49
+ setExitCode(1);
50
+ return {
51
+ json: {
52
+ ok: violations.length === 0,
53
+ mission: missionRel,
54
+ msn_id: mission.msnId,
55
+ contract_sha256: mission.contractSha256,
56
+ scope: scopeJson(scope),
57
+ violations: violations.map((v) => ({ ...v, code: contractViolationCode(v.kind) })),
58
+ },
59
+ human: humanLines(missionRel, scope, violations),
60
+ };
61
+ });
62
+ }
63
+ export function runContractPropose(options) {
64
+ runUserCommand({ json: options.json }, () => {
65
+ const workspace = loadWorkspace();
66
+ const resolved = resolveSkillKeyForLegislation({
67
+ root: workspace.root,
68
+ manifest: workspace.manifest,
69
+ intent: options.intent,
70
+ skillKey: options.skillKey,
71
+ });
72
+ if (!resolved.ok) {
73
+ throw new GantryUserError("INVALID_ARGUMENT", `contract propose: ${resolved.reason}`, undefined, 2);
74
+ }
75
+ const proposed = proposeContract({
76
+ root: workspace.root,
77
+ manifest: workspace.manifest,
78
+ intent: options.intent,
79
+ skillKey: resolved.skillKey,
80
+ paths: options.paths,
81
+ });
82
+ const contract = normalizeContract(proposed.contract);
83
+ resolveEffectiveScope({ manifest: workspace.manifest, skillKey: resolved.skillKey, contract });
84
+ return {
85
+ json: {
86
+ ok: true,
87
+ skill_key: resolved.skillKey,
88
+ contract,
89
+ contract_sha256: contractSha256(contract),
90
+ gate: proposed.gate,
91
+ rationale: proposed.rationale,
92
+ block: formatContractBlock(contract, proposed.gate),
93
+ },
94
+ human: [formatContractBlock(contract, proposed.gate), "", "Rationale:", ...proposed.rationale.map((r) => ` - ${r}`)],
95
+ };
96
+ });
97
+ }
98
+ export function runContractShow(options) {
99
+ runUserCommand({ json: options.json }, () => {
100
+ const workspace = loadWorkspace();
101
+ const missionRel = options.mission?.trim() || resolvePinnedMission(workspace.root);
102
+ if (!missionRel) {
103
+ throw new GantryUserError("MISSION_REQUIRED", "gantry contract show: pass --mission <path> or pin a mission first", undefined, 2);
104
+ }
105
+ const mission = parseMissionFile(workspace.root, missionRel);
106
+ const contract = mission.contract ?? {};
107
+ return {
108
+ json: { ok: true, mission: missionRel, msn_id: mission.msnId, contract, contract_sha256: mission.contractSha256 },
109
+ human: formatContractBlock(contract, mission.gate ? { command: mission.gate.command, successSubstring: mission.gate.successSubstring } : null),
110
+ };
111
+ });
112
+ }
113
+ //# sourceMappingURL=contract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contract.js","sourceRoot":"","sources":["../../../src/cli/commands/contract.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"tmvc-guard.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/tmvc-guard.ts"],"names":[],"mappings":"AAaA,MAAM,WAAW,mBAAmB;IAClC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAQD,wBAAgB,YAAY,CAAC,OAAO,EAAE,mBAAmB,GAAG,IAAI,CA+D/D"}
1
+ {"version":3,"file":"tmvc-guard.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/tmvc-guard.ts"],"names":[],"mappings":"AAaA,MAAM,WAAW,mBAAmB;IAClC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAQD,wBAAgB,YAAY,CAAC,OAAO,EAAE,mBAAmB,GAAG,IAAI,CAgE/D"}
@@ -30,6 +30,7 @@ export function runTmvcGuard(options) {
30
30
  repoRoot: workspace.root,
31
31
  manifest: workspace.manifest,
32
32
  skillKey: resolved.skill_key,
33
+ scope: resolved.scope,
33
34
  });
34
35
  const strict = options.strict === true || process.env.GXT_TMVC_GUARD_STRICT === "1";
35
36
  if (options.json) {
@@ -1 +1 @@
1
- {"version":3,"file":"tmvc-guard.js","sourceRoot":"","sources":["../../../src/cli/commands/tmvc-guard.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tmvc-guard.js","sourceRoot":"","sources":["../../../src/cli/commands/tmvc-guard.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { MissionContract } from "./contract-types.js";
2
+ import type { ProposedGate } from "./propose-gate.js";
3
+ export type ContractApproval = {
4
+ action: "approve";
5
+ contract: MissionContract;
6
+ } | {
7
+ action: "quit";
8
+ };
9
+ export interface ApproveContractInput {
10
+ contract: MissionContract;
11
+ gate?: ProposedGate;
12
+ rationale?: string[];
13
+ yes?: boolean;
14
+ stdin?: NodeJS.ReadStream;
15
+ stdout?: NodeJS.WriteStream;
16
+ }
17
+ /**
18
+ * TTY [a]pprove / [e]dit in $EDITOR / [q]uit. `--yes` skips the prompt. Non-TTY without `--yes`
19
+ * exits 2 — CI must pass `--yes` or `--contract-file`.
20
+ */
21
+ export declare function approveContractPrompt(input: ApproveContractInput): Promise<ContractApproval>;
22
+ //# sourceMappingURL=approve-prompt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"approve-prompt.d.ts","sourceRoot":"","sources":["../../../../src/cli/lib/contract/approve-prompt.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEtD,MAAM,MAAM,gBAAgB,GACxB;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,QAAQ,EAAE,eAAe,CAAA;CAAE,GAChD;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAEvB,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,eAAe,CAAC;IAC1B,IAAI,CAAC,EAAE,YAAY,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC,WAAW,CAAC;CAC7B;AAyBD;;;GAGG;AACH,wBAAsB,qBAAqB,CAAC,KAAK,EAAE,oBAAoB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAsClG"}
@@ -0,0 +1,71 @@
1
+ import { spawnSync } from "node:child_process";
2
+ import fs from "node:fs";
3
+ import os from "node:os";
4
+ import path from "node:path";
5
+ import readline from "node:readline/promises";
6
+ import YAML from "yaml";
7
+ import { GantryUserError } from "../errors.js";
8
+ import { formatContractBlock } from "./format.js";
9
+ import { normalizeContract, parseContractYaml } from "./contract-hash.js";
10
+ function parseEditedContract(body) {
11
+ return parseContractYaml(body);
12
+ }
13
+ function editInEditor(contract) {
14
+ const editor = process.env.VISUAL?.trim() || process.env.EDITOR?.trim() || "vi";
15
+ const tmp = path.join(os.tmpdir(), `gantry-contract-${process.pid}.yaml`);
16
+ fs.writeFileSync(tmp, YAML.stringify({ contract }), "utf8");
17
+ try {
18
+ const r = spawnSync(editor, [tmp], { stdio: "inherit" });
19
+ if (r.status !== 0) {
20
+ throw new GantryUserError("INVALID_ARGUMENT", `editor ${editor} exited ${String(r.status ?? "null")}`, undefined, 2);
21
+ }
22
+ return parseEditedContract(fs.readFileSync(tmp, "utf8"));
23
+ }
24
+ finally {
25
+ try {
26
+ fs.unlinkSync(tmp);
27
+ }
28
+ catch {
29
+ /* tmp cleanup is best-effort */
30
+ }
31
+ }
32
+ }
33
+ /**
34
+ * TTY [a]pprove / [e]dit in $EDITOR / [q]uit. `--yes` skips the prompt. Non-TTY without `--yes`
35
+ * exits 2 — CI must pass `--yes` or `--contract-file`.
36
+ */
37
+ export async function approveContractPrompt(input) {
38
+ if (input.yes === true)
39
+ return { action: "approve", contract: normalizeContract(input.contract) };
40
+ const stdin = input.stdin ?? process.stdin;
41
+ const stdout = input.stdout ?? process.stdout;
42
+ if (!stdin.isTTY || !stdout.isTTY) {
43
+ throw new GantryUserError("INVALID_ARGUMENT", "gantry legislate --from-intent requires a TTY, or pass --yes / --contract-file", "Re-run in an interactive terminal, or gantry legislate --from-intent --yes …", 2);
44
+ }
45
+ let current = normalizeContract(input.contract);
46
+ const rl = readline.createInterface({ input: stdin, output: stdout });
47
+ try {
48
+ for (;;) {
49
+ stdout.write(`${formatContractBlock(current, input.gate)}\n`);
50
+ if (input.rationale && input.rationale.length > 0) {
51
+ stdout.write(`Rationale:\n${input.rationale.map((r) => ` - ${r}`).join("\n")}\n`);
52
+ }
53
+ const answer = (await rl.question("[a]pprove / [e]dit in $EDITOR / [q]uit: ")).trim().toLowerCase();
54
+ if (answer === "a" || answer === "approve" || answer === "yes" || answer === "y") {
55
+ return { action: "approve", contract: current };
56
+ }
57
+ if (answer === "q" || answer === "quit" || answer === "n" || answer === "no") {
58
+ return { action: "quit" };
59
+ }
60
+ if (answer === "e" || answer === "edit") {
61
+ current = editInEditor(current);
62
+ continue;
63
+ }
64
+ stdout.write("Enter a, e, or q.\n");
65
+ }
66
+ }
67
+ finally {
68
+ rl.close();
69
+ }
70
+ }
71
+ //# sourceMappingURL=approve-prompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"approve-prompt.js","sourceRoot":"","sources":["../../../../src/cli/lib/contract/approve-prompt.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import { type MissionContract } from "./contract-types.js";
2
+ /**
3
+ * POSIX separators, no leading `./`, collapsed slashes. Directory-like segments get a single
4
+ * trailing `/` so `src/ui` and `src/ui/` hash alike; last-segment file names (contain `.`) do not.
5
+ */
6
+ export declare function normalizeContractPath(raw: string): string;
7
+ /**
8
+ * Canonical contract form: path lists normalized + sorted + deduped, import lists trimmed +
9
+ * sorted + deduped, empty lists and false booleans omitted. This is the only form written to
10
+ * mission YAML and the only form hashed, so key or array order can never produce a false
11
+ * GXT_CONTRACT_TAMPERED.
12
+ */
13
+ export declare function normalizeContract(contract: MissionContract): MissionContract;
14
+ export declare function contractSha256(contract: MissionContract): string;
15
+ /** True when the contract has no effective constraint at all. */
16
+ export declare function isEmptyContract(contract: MissionContract): boolean;
17
+ /** Accept a bare contract object or `{ contract: … }` YAML document. */
18
+ export declare function parseContractYaml(body: string): MissionContract;
19
+ //# sourceMappingURL=contract-hash.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contract-hash.d.ts","sourceRoot":"","sources":["../../../../src/cli/lib/contract/contract-hash.ts"],"names":[],"mappings":"AAIA,OAAO,EAA8C,KAAK,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAEvG;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAQzD;AAUD;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,eAAe,GAAG,eAAe,CAa5E;AAED,wBAAgB,cAAc,CAAC,QAAQ,EAAE,eAAe,GAAG,MAAM,CAEhE;AAED,iEAAiE;AACjE,wBAAgB,eAAe,CAAC,QAAQ,EAAE,eAAe,GAAG,OAAO,CAElE;AAED,wEAAwE;AACxE,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,CAO/D"}
@@ -0,0 +1,67 @@
1
+ import crypto from "node:crypto";
2
+ import YAML from "yaml";
3
+ import { canonicalJson } from "../canonical-json.js";
4
+ import { GantryUserError } from "../errors.js";
5
+ import { CONTRACT_ARRAY_KEYS, CONTRACT_BOOLEAN_KEYS } from "./contract-types.js";
6
+ /**
7
+ * POSIX separators, no leading `./`, collapsed slashes. Directory-like segments get a single
8
+ * trailing `/` so `src/ui` and `src/ui/` hash alike; last-segment file names (contain `.`) do not.
9
+ */
10
+ export function normalizeContractPath(raw) {
11
+ let p = raw.trim().replace(/\\/g, "/").replace(/\/{2,}/g, "/");
12
+ while (p.startsWith("./"))
13
+ p = p.slice(2);
14
+ if (p.length > 1)
15
+ p = p.replace(/\/+$/, "");
16
+ if (p.length === 0)
17
+ return p;
18
+ const last = p.split("/").pop() ?? p;
19
+ const looksLikeFile = last.includes(".") && last !== "." && last !== "..";
20
+ return looksLikeFile || p.endsWith("/") ? p : `${p}/`;
21
+ }
22
+ function normalizeSpecifier(raw) {
23
+ return raw.trim();
24
+ }
25
+ function sortedUnique(values) {
26
+ return [...new Set(values.filter((v) => v.length > 0))].sort();
27
+ }
28
+ /**
29
+ * Canonical contract form: path lists normalized + sorted + deduped, import lists trimmed +
30
+ * sorted + deduped, empty lists and false booleans omitted. This is the only form written to
31
+ * mission YAML and the only form hashed, so key or array order can never produce a false
32
+ * GXT_CONTRACT_TAMPERED.
33
+ */
34
+ export function normalizeContract(contract) {
35
+ const out = {};
36
+ for (const key of CONTRACT_ARRAY_KEYS) {
37
+ const raw = contract[key];
38
+ if (!Array.isArray(raw) || raw.length === 0)
39
+ continue;
40
+ const isPathList = key === "tmvc_roots" || key === "forbidden_zones";
41
+ const values = sortedUnique(raw.map((v) => (isPathList ? normalizeContractPath(v) : normalizeSpecifier(v))));
42
+ if (values.length > 0)
43
+ out[key] = values;
44
+ }
45
+ for (const key of CONTRACT_BOOLEAN_KEYS) {
46
+ if (contract[key] === true)
47
+ out[key] = true;
48
+ }
49
+ return out;
50
+ }
51
+ export function contractSha256(contract) {
52
+ return crypto.createHash("sha256").update(canonicalJson(normalizeContract(contract)), "utf8").digest("hex");
53
+ }
54
+ /** True when the contract has no effective constraint at all. */
55
+ export function isEmptyContract(contract) {
56
+ return Object.keys(normalizeContract(contract)).length === 0;
57
+ }
58
+ /** Accept a bare contract object or `{ contract: … }` YAML document. */
59
+ export function parseContractYaml(body) {
60
+ const doc = YAML.parse(body);
61
+ if (!doc || typeof doc !== "object") {
62
+ throw new GantryUserError("INVALID_ARGUMENT", "contract YAML is not an object", undefined, 2);
63
+ }
64
+ const block = "contract" in doc && doc.contract ? doc.contract : doc;
65
+ return normalizeContract(block);
66
+ }
67
+ //# sourceMappingURL=contract-hash.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contract-hash.js","sourceRoot":"","sources":["../../../../src/cli/lib/contract/contract-hash.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import { type GxtErrorCode } from "../gxt-error-codes.js";
2
+ import type { ContractImportViolation, ContractViolationKind, EffectiveScope } from "./contract-types.js";
3
+ import { type TsconfigPaths } from "./resolve-specifier.js";
4
+ export declare function isScannableSource(fileRel: string): boolean;
5
+ /** Repo-relative source files under the effective TMVC roots (sorted, deduped). */
6
+ export declare function listSourcesUnderRoots(repoRoot: string, roots: readonly string[]): string[];
7
+ /**
8
+ * Dirty sources: `git diff --name-only HEAD` ∪ untracked. On an unborn branch (no HEAD) the
9
+ * index (`ls-files --cached`) stands in for the diff. Every argv ends with `--` so a path that
10
+ * looks like a flag is never parsed as one. Missing/deleted paths are dropped.
11
+ */
12
+ export declare function listChangedSourceFiles(repoRoot: string): string[];
13
+ export declare function contractViolationCode(kind: ContractViolationKind): GxtErrorCode;
14
+ /** Scan a single source file's import sites against the effective scope. */
15
+ export declare function scanFileImports(repoRoot: string, fileRel: string, scope: EffectiveScope, ts?: TsconfigPaths | null): ContractImportViolation[];
16
+ export interface ScanContractImportsOptions {
17
+ /** Explicit repo-relative files; defaults to every source file under the effective TMVC roots. */
18
+ files?: readonly string[];
19
+ }
20
+ /**
21
+ * Import-site scan for the effective cage: banned / unlisted bare specifiers, non-literal dynamic
22
+ * specifiers, and relative or alias imports resolving into forbidden zones (or outside TMVC when
23
+ * `strict_relative_imports`). Deterministic ordering by file, line, column.
24
+ */
25
+ export declare function scanContractImports(repoRoot: string, scope: EffectiveScope, options?: ScanContractImportsOptions): ContractImportViolation[];
26
+ export declare function formatContractViolation(v: ContractImportViolation): string;
27
+ //# sourceMappingURL=contract-scan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contract-scan.d.ts","sourceRoot":"","sources":["../../../../src/cli/lib/contract/contract-scan.ts"],"names":[],"mappings":"AAKA,OAAO,EAAa,KAAK,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAGrE,OAAO,KAAK,EAAE,uBAAuB,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1G,OAAO,EAAwC,KAAK,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAKlG,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAG1D;AAqBD,mFAAmF;AACnF,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,EAAE,CAI1F;AASD;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,CASjE;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,qBAAqB,GAAG,YAAY,CAe/E;AAgED,4EAA4E;AAC5E,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,cAAc,EACrB,EAAE,GAAE,aAAa,GAAG,IAAkC,GACrD,uBAAuB,EAAE,CAU3B;AAED,MAAM,WAAW,0BAA0B;IACzC,kGAAkG;IAClG,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC3B;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,cAAc,EACrB,OAAO,GAAE,0BAA+B,GACvC,uBAAuB,EAAE,CAU3B;AAED,wBAAgB,uBAAuB,CAAC,CAAC,EAAE,uBAAuB,GAAG,MAAM,CAE1E"}
@@ -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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"}