@neurcode-ai/cli 0.10.1 → 0.12.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 (171) hide show
  1. package/.telemetry-bundle/dist/contracts.d.ts +1 -1
  2. package/README.md +74 -25
  3. package/dist/commands/remediate-export.js +1 -1
  4. package/dist/commands/replay.d.ts.map +1 -1
  5. package/dist/commands/replay.js +36 -0
  6. package/dist/commands/replay.js.map +1 -1
  7. package/dist/commands/verify-output.d.ts.map +1 -1
  8. package/dist/commands/verify-output.js +66 -4
  9. package/dist/commands/verify-output.js.map +1 -1
  10. package/dist/commands/verify.d.ts +22 -1
  11. package/dist/commands/verify.d.ts.map +1 -1
  12. package/dist/commands/verify.js +446 -34
  13. package/dist/commands/verify.js.map +1 -1
  14. package/dist/daemon/server.d.ts.map +1 -1
  15. package/dist/daemon/server.js +4 -0
  16. package/dist/daemon/server.js.map +1 -1
  17. package/dist/governance/intent/drift-detector.d.ts +100 -0
  18. package/dist/governance/intent/drift-detector.d.ts.map +1 -0
  19. package/dist/governance/intent/drift-detector.js +275 -0
  20. package/dist/governance/intent/drift-detector.js.map +1 -0
  21. package/dist/governance/intent/glob-match.d.ts +43 -0
  22. package/dist/governance/intent/glob-match.d.ts.map +1 -0
  23. package/dist/governance/intent/glob-match.js +108 -0
  24. package/dist/governance/intent/glob-match.js.map +1 -0
  25. package/dist/governance/intent/import-graph.d.ts +56 -0
  26. package/dist/governance/intent/import-graph.d.ts.map +1 -0
  27. package/dist/governance/intent/import-graph.js +133 -0
  28. package/dist/governance/intent/import-graph.js.map +1 -0
  29. package/dist/governance/intent/index.d.ts +23 -0
  30. package/dist/governance/intent/index.d.ts.map +1 -0
  31. package/dist/governance/intent/index.js +48 -0
  32. package/dist/governance/intent/index.js.map +1 -0
  33. package/dist/governance/intent/intelligence-boundaries.d.ts +69 -0
  34. package/dist/governance/intent/intelligence-boundaries.d.ts.map +1 -0
  35. package/dist/governance/intent/intelligence-boundaries.js +163 -0
  36. package/dist/governance/intent/intelligence-boundaries.js.map +1 -0
  37. package/dist/governance/intent/intent-contract.d.ts +76 -0
  38. package/dist/governance/intent/intent-contract.d.ts.map +1 -0
  39. package/dist/governance/intent/intent-contract.js +397 -0
  40. package/dist/governance/intent/intent-contract.js.map +1 -0
  41. package/dist/governance/intent/intent-graph.d.ts +135 -0
  42. package/dist/governance/intent/intent-graph.d.ts.map +1 -0
  43. package/dist/governance/intent/intent-graph.js +67 -0
  44. package/dist/governance/intent/intent-graph.js.map +1 -0
  45. package/dist/governance/pipeline/computation-trace.d.ts +52 -0
  46. package/dist/governance/pipeline/computation-trace.d.ts.map +1 -0
  47. package/dist/governance/pipeline/computation-trace.js +79 -0
  48. package/dist/governance/pipeline/computation-trace.js.map +1 -0
  49. package/dist/governance/pipeline/envelope-assembly.d.ts +132 -0
  50. package/dist/governance/pipeline/envelope-assembly.d.ts.map +1 -0
  51. package/dist/governance/pipeline/envelope-assembly.js +140 -0
  52. package/dist/governance/pipeline/envelope-assembly.js.map +1 -0
  53. package/dist/governance/pipeline/fingerprint.d.ts +34 -0
  54. package/dist/governance/pipeline/fingerprint.d.ts.map +1 -0
  55. package/dist/governance/pipeline/fingerprint.js +78 -0
  56. package/dist/governance/pipeline/fingerprint.js.map +1 -0
  57. package/dist/governance/pipeline/helpers.d.ts +74 -0
  58. package/dist/governance/pipeline/helpers.d.ts.map +1 -0
  59. package/dist/governance/pipeline/helpers.js +112 -0
  60. package/dist/governance/pipeline/helpers.js.map +1 -0
  61. package/dist/governance/pipeline/index.d.ts +27 -0
  62. package/dist/governance/pipeline/index.d.ts.map +1 -0
  63. package/dist/governance/pipeline/index.js +63 -0
  64. package/dist/governance/pipeline/index.js.map +1 -0
  65. package/dist/governance/pipeline/lineage.d.ts +26 -0
  66. package/dist/governance/pipeline/lineage.d.ts.map +1 -0
  67. package/dist/governance/pipeline/lineage.js +51 -0
  68. package/dist/governance/pipeline/lineage.js.map +1 -0
  69. package/dist/governance/pipeline/orchestration/advisory-mode-contract.d.ts +15 -0
  70. package/dist/governance/pipeline/orchestration/advisory-mode-contract.d.ts.map +1 -0
  71. package/dist/governance/pipeline/orchestration/advisory-mode-contract.js +44 -0
  72. package/dist/governance/pipeline/orchestration/advisory-mode-contract.js.map +1 -0
  73. package/dist/governance/pipeline/orchestration/advisory-mode.d.ts +102 -0
  74. package/dist/governance/pipeline/orchestration/advisory-mode.d.ts.map +1 -0
  75. package/dist/governance/pipeline/orchestration/advisory-mode.js +170 -0
  76. package/dist/governance/pipeline/orchestration/advisory-mode.js.map +1 -0
  77. package/dist/governance/pipeline/orchestration/evidence-lifecycle.d.ts +133 -0
  78. package/dist/governance/pipeline/orchestration/evidence-lifecycle.d.ts.map +1 -0
  79. package/dist/governance/pipeline/orchestration/evidence-lifecycle.js +125 -0
  80. package/dist/governance/pipeline/orchestration/evidence-lifecycle.js.map +1 -0
  81. package/dist/governance/pipeline/orchestration/index.d.ts +16 -0
  82. package/dist/governance/pipeline/orchestration/index.d.ts.map +1 -0
  83. package/dist/governance/pipeline/orchestration/index.js +30 -0
  84. package/dist/governance/pipeline/orchestration/index.js.map +1 -0
  85. package/dist/governance/pipeline/orchestration/intent-drift-orchestration.d.ts +65 -0
  86. package/dist/governance/pipeline/orchestration/intent-drift-orchestration.d.ts.map +1 -0
  87. package/dist/governance/pipeline/orchestration/intent-drift-orchestration.js +102 -0
  88. package/dist/governance/pipeline/orchestration/intent-drift-orchestration.js.map +1 -0
  89. package/dist/governance/pipeline/orchestration/plan-structural-analysis.d.ts +41 -0
  90. package/dist/governance/pipeline/orchestration/plan-structural-analysis.d.ts.map +1 -0
  91. package/dist/governance/pipeline/orchestration/plan-structural-analysis.js +74 -0
  92. package/dist/governance/pipeline/orchestration/plan-structural-analysis.js.map +1 -0
  93. package/dist/governance/pipeline/orchestration/policy-evaluation-summaries.d.ts +165 -0
  94. package/dist/governance/pipeline/orchestration/policy-evaluation-summaries.d.ts.map +1 -0
  95. package/dist/governance/pipeline/orchestration/policy-evaluation-summaries.js +160 -0
  96. package/dist/governance/pipeline/orchestration/policy-evaluation-summaries.js.map +1 -0
  97. package/dist/governance/pipeline/orchestration/scope-guard-orchestration.d.ts +152 -0
  98. package/dist/governance/pipeline/orchestration/scope-guard-orchestration.d.ts.map +1 -0
  99. package/dist/governance/pipeline/orchestration/scope-guard-orchestration.js +188 -0
  100. package/dist/governance/pipeline/orchestration/scope-guard-orchestration.js.map +1 -0
  101. package/dist/governance/pipeline/runtime.d.ts +70 -0
  102. package/dist/governance/pipeline/runtime.d.ts.map +1 -0
  103. package/dist/governance/pipeline/runtime.js +223 -0
  104. package/dist/governance/pipeline/runtime.js.map +1 -0
  105. package/dist/governance/pipeline/shared-types.d.ts +7 -0
  106. package/dist/governance/pipeline/shared-types.d.ts.map +1 -0
  107. package/dist/governance/pipeline/shared-types.js +7 -0
  108. package/dist/governance/pipeline/shared-types.js.map +1 -0
  109. package/dist/governance/pipeline/stages/compiled-policy-stage.d.ts +28 -0
  110. package/dist/governance/pipeline/stages/compiled-policy-stage.d.ts.map +1 -0
  111. package/dist/governance/pipeline/stages/compiled-policy-stage.js +53 -0
  112. package/dist/governance/pipeline/stages/compiled-policy-stage.js.map +1 -0
  113. package/dist/governance/pipeline/stages/diff-normalization-stage.d.ts +63 -0
  114. package/dist/governance/pipeline/stages/diff-normalization-stage.d.ts.map +1 -0
  115. package/dist/governance/pipeline/stages/diff-normalization-stage.js +140 -0
  116. package/dist/governance/pipeline/stages/diff-normalization-stage.js.map +1 -0
  117. package/dist/governance/pipeline/stages/governance-synthesis-stage.d.ts +53 -0
  118. package/dist/governance/pipeline/stages/governance-synthesis-stage.d.ts.map +1 -0
  119. package/dist/governance/pipeline/stages/governance-synthesis-stage.js +129 -0
  120. package/dist/governance/pipeline/stages/governance-synthesis-stage.js.map +1 -0
  121. package/dist/governance/pipeline/stages/index.d.ts +29 -0
  122. package/dist/governance/pipeline/stages/index.d.ts.map +1 -0
  123. package/dist/governance/pipeline/stages/index.js +40 -0
  124. package/dist/governance/pipeline/stages/index.js.map +1 -0
  125. package/dist/governance/pipeline/stages/policy-lock-stage.d.ts +31 -0
  126. package/dist/governance/pipeline/stages/policy-lock-stage.d.ts.map +1 -0
  127. package/dist/governance/pipeline/stages/policy-lock-stage.js +71 -0
  128. package/dist/governance/pipeline/stages/policy-lock-stage.js.map +1 -0
  129. package/dist/governance/pipeline/stages/runtime-guard-stage.d.ts +29 -0
  130. package/dist/governance/pipeline/stages/runtime-guard-stage.d.ts.map +1 -0
  131. package/dist/governance/pipeline/stages/runtime-guard-stage.js +65 -0
  132. package/dist/governance/pipeline/stages/runtime-guard-stage.js.map +1 -0
  133. package/dist/governance/pipeline/stages/structural-analysis-stage.d.ts +24 -0
  134. package/dist/governance/pipeline/stages/structural-analysis-stage.d.ts.map +1 -0
  135. package/dist/governance/pipeline/stages/structural-analysis-stage.js +58 -0
  136. package/dist/governance/pipeline/stages/structural-analysis-stage.js.map +1 -0
  137. package/dist/governance/pipeline/summary.d.ts +14 -0
  138. package/dist/governance/pipeline/summary.d.ts.map +1 -0
  139. package/dist/governance/pipeline/summary.js +50 -0
  140. package/dist/governance/pipeline/summary.js.map +1 -0
  141. package/dist/governance/pipeline/types.d.ts +69 -0
  142. package/dist/governance/pipeline/types.d.ts.map +1 -0
  143. package/dist/governance/pipeline/types.js +30 -0
  144. package/dist/governance/pipeline/types.js.map +1 -0
  145. package/dist/index.js +29 -0
  146. package/dist/index.js.map +1 -1
  147. package/dist/utils/active-engineering-context.d.ts +16 -0
  148. package/dist/utils/active-engineering-context.d.ts.map +1 -1
  149. package/dist/utils/active-engineering-context.js +302 -0
  150. package/dist/utils/active-engineering-context.js.map +1 -1
  151. package/dist/utils/import-edge-classifier.d.ts +76 -0
  152. package/dist/utils/import-edge-classifier.d.ts.map +1 -0
  153. package/dist/utils/import-edge-classifier.js +308 -0
  154. package/dist/utils/import-edge-classifier.js.map +1 -0
  155. package/dist/utils/import-edge-extractor.d.ts +52 -0
  156. package/dist/utils/import-edge-extractor.d.ts.map +1 -0
  157. package/dist/utils/import-edge-extractor.js +223 -0
  158. package/dist/utils/import-edge-extractor.js.map +1 -0
  159. package/dist/utils/import-edge-governance.d.ts +37 -0
  160. package/dist/utils/import-edge-governance.d.ts.map +1 -0
  161. package/dist/utils/import-edge-governance.js +56 -0
  162. package/dist/utils/import-edge-governance.js.map +1 -0
  163. package/dist/utils/path-boundary-classifier.d.ts +42 -0
  164. package/dist/utils/path-boundary-classifier.d.ts.map +1 -0
  165. package/dist/utils/path-boundary-classifier.js +143 -0
  166. package/dist/utils/path-boundary-classifier.js.map +1 -0
  167. package/dist/utils/replay-html-report.d.ts +29 -0
  168. package/dist/utils/replay-html-report.d.ts.map +1 -0
  169. package/dist/utils/replay-html-report.js +309 -0
  170. package/dist/utils/replay-html-report.js.map +1 -0
  171. package/package.json +2 -2
@@ -0,0 +1,223 @@
1
+ "use strict";
2
+ /**
3
+ * Deterministic import-edge extractor.
4
+ *
5
+ * Pure regex over source lines — no AST, no inference, no probability.
6
+ * Same input always produces the same output, in the same canonical order.
7
+ *
8
+ * Supported languages:
9
+ * - Python: `import x.y.z`, `from x.y import z`, relative `from .foo import bar`
10
+ * - TypeScript / JavaScript:
11
+ * `import ... from "..."`
12
+ * `import "..."` (side-effect)
13
+ * `import("...")` (dynamic)
14
+ * `require("...")` (CommonJS)
15
+ *
16
+ * The extractor is diff-aware: it consumes already-added source lines so we
17
+ * only flag imports introduced by the current diff. Pre-existing imports
18
+ * stay outside the governance frame.
19
+ */
20
+ Object.defineProperty(exports, "__esModule", { value: true });
21
+ exports.extractImportEdgesFromDiff = extractImportEdgesFromDiff;
22
+ exports.canonicalizeEdges = canonicalizeEdges;
23
+ const PY_EXTENSIONS = new Set(['py', 'pyi']);
24
+ const TS_EXTENSIONS = new Set(['ts', 'tsx', 'mts', 'cts']);
25
+ const JS_EXTENSIONS = new Set(['js', 'jsx', 'mjs', 'cjs']);
26
+ function languageFor(path) {
27
+ const ext = (path.split('.').pop() ?? '').toLowerCase();
28
+ if (PY_EXTENSIONS.has(ext))
29
+ return 'python';
30
+ if (TS_EXTENSIONS.has(ext))
31
+ return 'typescript';
32
+ if (JS_EXTENSIONS.has(ext))
33
+ return 'javascript';
34
+ return null;
35
+ }
36
+ // ────────────────────────────────────────────────────────────────────────────
37
+ // Python regex set
38
+ // ────────────────────────────────────────────────────────────────────────────
39
+ // `import x.y.z` / `import x.y.z as foo`
40
+ // `from x.y import z` / `from .foo import bar` / `from ..baz.q import r`
41
+ // Multi-import on one line: `import a, b, c` (we capture each comma-separated entry)
42
+ const PY_IMPORT = /^\s*import\s+([\w\.,\s]+?)(?:\s+as\s+\w+)?\s*(?:#.*)?$/;
43
+ const PY_FROM = /^\s*from\s+(\.+)?([\w\.]*)\s+import\s+/;
44
+ // ────────────────────────────────────────────────────────────────────────────
45
+ // TS/JS regex set
46
+ // ────────────────────────────────────────────────────────────────────────────
47
+ const TS_STATIC = /\bimport\s+(?:[^'"\n;]+?\s+from\s+)?['"]([^'"]+)['"]/g;
48
+ const TS_SIDE_EFFECT = /\bimport\s+['"]([^'"]+)['"]/g;
49
+ const TS_DYNAMIC = /\bimport\s*\(\s*['"]([^'"]+)['"]\s*\)/g;
50
+ const TS_REQUIRE = /\brequire\s*\(\s*['"]([^'"]+)['"]\s*\)/g;
51
+ function collectAddedLines(file) {
52
+ const out = [];
53
+ for (const hunk of file.hunks ?? []) {
54
+ let cursor = hunk.newStart ?? 0;
55
+ for (const line of (hunk.lines ?? [])) {
56
+ if (line.type === 'added') {
57
+ out.push({ text: line.content ?? '', lineNumber: line.lineNumber ?? cursor });
58
+ cursor += 1;
59
+ }
60
+ else if (line.type === 'context') {
61
+ cursor += 1;
62
+ }
63
+ // 'removed' lines do not advance the new-file cursor
64
+ }
65
+ }
66
+ return out;
67
+ }
68
+ // ────────────────────────────────────────────────────────────────────────────
69
+ // Python extraction
70
+ // ────────────────────────────────────────────────────────────────────────────
71
+ function extractPython(file) {
72
+ const edges = [];
73
+ for (const { text, lineNumber } of collectAddedLines(file)) {
74
+ if (!text.trim())
75
+ continue;
76
+ // `from x import y`
77
+ const fromMatch = PY_FROM.exec(text);
78
+ if (fromMatch) {
79
+ const dots = fromMatch[1] ?? '';
80
+ const dotted = fromMatch[2] ?? '';
81
+ const importTarget = dots ? `${dots}${dotted}` : dotted;
82
+ if (importTarget) {
83
+ edges.push({
84
+ sourceFile: file.path,
85
+ sourceLine: lineNumber,
86
+ importStatement: text.trim(),
87
+ importTarget,
88
+ importKind: dots ? 'relative' : 'static',
89
+ language: 'python',
90
+ relativeLevel: dots.length,
91
+ });
92
+ }
93
+ continue;
94
+ }
95
+ // `import x.y[, z[, w as foo]]`
96
+ const importMatch = PY_IMPORT.exec(text);
97
+ if (importMatch) {
98
+ const body = importMatch[1] ?? '';
99
+ // Split on commas, strip `as <alias>` per entry, ignore inline whitespace.
100
+ const targets = body
101
+ .split(',')
102
+ .map((t) => t.trim())
103
+ .filter(Boolean)
104
+ .map((t) => t.replace(/\s+as\s+\w+$/, '').trim())
105
+ .filter(Boolean);
106
+ for (const importTarget of targets) {
107
+ // `import .relative` is a SyntaxError in Python; only top-level dotted
108
+ // names appear here. Still guard against leading dots defensively.
109
+ if (importTarget.startsWith('.'))
110
+ continue;
111
+ edges.push({
112
+ sourceFile: file.path,
113
+ sourceLine: lineNumber,
114
+ importStatement: text.trim(),
115
+ importTarget,
116
+ importKind: 'static',
117
+ language: 'python',
118
+ relativeLevel: 0,
119
+ });
120
+ }
121
+ }
122
+ }
123
+ return edges;
124
+ }
125
+ // ────────────────────────────────────────────────────────────────────────────
126
+ // TS/JS extraction
127
+ // ────────────────────────────────────────────────────────────────────────────
128
+ function extractTypeScript(file, language) {
129
+ const edges = [];
130
+ for (const { text, lineNumber } of collectAddedLines(file)) {
131
+ if (!text.trim())
132
+ continue;
133
+ const consumed = new Set();
134
+ const push = (target, kind) => {
135
+ const key = `${target}::${kind}`;
136
+ if (consumed.has(key))
137
+ return;
138
+ consumed.add(key);
139
+ edges.push({
140
+ sourceFile: file.path,
141
+ sourceLine: lineNumber,
142
+ importStatement: text.trim(),
143
+ importTarget: target,
144
+ importKind: kind,
145
+ language,
146
+ relativeLevel: 0,
147
+ });
148
+ };
149
+ // Static / side-effect imports
150
+ TS_STATIC.lastIndex = 0;
151
+ for (let m; (m = TS_STATIC.exec(text));) {
152
+ push(m[1], 'static');
153
+ }
154
+ TS_SIDE_EFFECT.lastIndex = 0;
155
+ for (let m; (m = TS_SIDE_EFFECT.exec(text));) {
156
+ push(m[1], 'side-effect');
157
+ }
158
+ // Dynamic / require
159
+ TS_DYNAMIC.lastIndex = 0;
160
+ for (let m; (m = TS_DYNAMIC.exec(text));) {
161
+ push(m[1], 'dynamic');
162
+ }
163
+ TS_REQUIRE.lastIndex = 0;
164
+ for (let m; (m = TS_REQUIRE.exec(text));) {
165
+ push(m[1], 'require');
166
+ }
167
+ }
168
+ return edges;
169
+ }
170
+ // ────────────────────────────────────────────────────────────────────────────
171
+ // Public entry point
172
+ // ────────────────────────────────────────────────────────────────────────────
173
+ /**
174
+ * Extract import edges from the added lines of a diff. Deterministic and
175
+ * order-stable: identical diffs yield identical edge arrays.
176
+ */
177
+ function extractImportEdgesFromDiff(diffFiles) {
178
+ const edges = [];
179
+ for (const file of diffFiles) {
180
+ if (file.changeType === 'delete')
181
+ continue;
182
+ const language = languageFor(file.path);
183
+ if (!language)
184
+ continue;
185
+ if (language === 'python') {
186
+ edges.push(...extractPython(file));
187
+ }
188
+ else {
189
+ edges.push(...extractTypeScript(file, language));
190
+ }
191
+ }
192
+ return canonicalizeEdges(edges);
193
+ }
194
+ /**
195
+ * Sort edges into a canonical, replay-stable order.
196
+ *
197
+ * Order: sourceFile → importTarget → sourceLine → importKind. Identical
198
+ * tuples are deduplicated.
199
+ */
200
+ function canonicalizeEdges(edges) {
201
+ const seen = new Set();
202
+ const out = [];
203
+ for (const e of edges) {
204
+ const key = `${e.sourceFile}|${e.importTarget}|${e.sourceLine}|${e.importKind}|${e.language}`;
205
+ if (seen.has(key))
206
+ continue;
207
+ seen.add(key);
208
+ out.push(e);
209
+ }
210
+ out.sort((a, b) => {
211
+ if (a.sourceFile !== b.sourceFile)
212
+ return a.sourceFile < b.sourceFile ? -1 : 1;
213
+ if (a.importTarget !== b.importTarget)
214
+ return a.importTarget < b.importTarget ? -1 : 1;
215
+ if (a.sourceLine !== b.sourceLine)
216
+ return a.sourceLine - b.sourceLine;
217
+ if (a.importKind !== b.importKind)
218
+ return a.importKind < b.importKind ? -1 : 1;
219
+ return 0;
220
+ });
221
+ return out;
222
+ }
223
+ //# sourceMappingURL=import-edge-extractor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"import-edge-extractor.js","sourceRoot":"","sources":["../../src/utils/import-edge-extractor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Deterministic import-edge governance orchestrator.
3
+ *
4
+ * Glues the extractor + classifier into a single replay-stable surface that
5
+ * verify.ts can consume. Every output array is sorted canonically and
6
+ * deduplicated; identical inputs always produce identical output bytes.
7
+ */
8
+ import type { DiffFile } from '@neurcode-ai/diff-parser';
9
+ import { type ImportEdge } from './import-edge-extractor';
10
+ import { type ImportEdgeFinding, type IntentContextSnapshot } from './import-edge-classifier';
11
+ export type { ImportEdge } from './import-edge-extractor';
12
+ export type { ImportEdgeFinding, IntentContextSnapshot, IntentApprovedScope, IntentForbiddenBoundary, ImportEdgePolicy, ImportEdgeBoundaryType, ImportEdgeSeverity, } from './import-edge-classifier';
13
+ export interface ImportEdgeGovernanceInput {
14
+ diffFiles: readonly DiffFile[];
15
+ projectRoot: string;
16
+ intent: IntentContextSnapshot;
17
+ }
18
+ export interface ImportEdgeGovernanceResult {
19
+ /** All import edges extracted from the added diff lines (canonical order). */
20
+ edges: ImportEdge[];
21
+ /** Edges that resolved into a flagged boundary, canonicalised + deduped. */
22
+ findings: ImportEdgeFinding[];
23
+ /** Convenience counts so callers do not have to recompute. */
24
+ edgeCount: number;
25
+ blockingFindingCount: number;
26
+ advisoryFindingCount: number;
27
+ /** A sorted, unique list of observed boundary types — useful for capability envelopes. */
28
+ observedBoundaryTypes: string[];
29
+ /** A sorted, unique list of observed policies — useful for capability envelopes. */
30
+ observedPolicies: string[];
31
+ }
32
+ /**
33
+ * Evaluate import-edge governance for the given diff against the given
34
+ * intent context. Pure, deterministic, replay-stable.
35
+ */
36
+ export declare function evaluateImportEdgeGovernance(input: ImportEdgeGovernanceInput): ImportEdgeGovernanceResult;
37
+ //# sourceMappingURL=import-edge-governance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"import-edge-governance.d.ts","sourceRoot":"","sources":["../../src/utils/import-edge-governance.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAEzD,OAAO,EAAiD,KAAK,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACzG,OAAO,EAEL,KAAK,iBAAiB,EACtB,KAAK,qBAAqB,EAC3B,MAAM,0BAA0B,CAAC;AAElC,YAAY,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAC1D,YAAY,EACV,iBAAiB,EACjB,qBAAqB,EACrB,mBAAmB,EACnB,uBAAuB,EACvB,gBAAgB,EAChB,sBAAsB,EACtB,kBAAkB,GACnB,MAAM,0BAA0B,CAAC;AAElC,MAAM,WAAW,yBAAyB;IACxC,SAAS,EAAE,SAAS,QAAQ,EAAE,CAAC;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,qBAAqB,CAAC;CAC/B;AAED,MAAM,WAAW,0BAA0B;IACzC,8EAA8E;IAC9E,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,4EAA4E;IAC5E,QAAQ,EAAE,iBAAiB,EAAE,CAAC;IAC9B,8DAA8D;IAC9D,SAAS,EAAE,MAAM,CAAC;IAClB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,0FAA0F;IAC1F,qBAAqB,EAAE,MAAM,EAAE,CAAC;IAChC,oFAAoF;IACpF,gBAAgB,EAAE,MAAM,EAAE,CAAC;CAC5B;AAED;;;GAGG;AACH,wBAAgB,4BAA4B,CAC1C,KAAK,EAAE,yBAAyB,GAC/B,0BAA0B,CAqC5B"}
@@ -0,0 +1,56 @@
1
+ "use strict";
2
+ /**
3
+ * Deterministic import-edge governance orchestrator.
4
+ *
5
+ * Glues the extractor + classifier into a single replay-stable surface that
6
+ * verify.ts can consume. Every output array is sorted canonically and
7
+ * deduplicated; identical inputs always produce identical output bytes.
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.evaluateImportEdgeGovernance = evaluateImportEdgeGovernance;
11
+ const import_edge_extractor_1 = require("./import-edge-extractor");
12
+ const import_edge_classifier_1 = require("./import-edge-classifier");
13
+ /**
14
+ * Evaluate import-edge governance for the given diff against the given
15
+ * intent context. Pure, deterministic, replay-stable.
16
+ */
17
+ function evaluateImportEdgeGovernance(input) {
18
+ const edges = (0, import_edge_extractor_1.canonicalizeEdges)((0, import_edge_extractor_1.extractImportEdgesFromDiff)(input.diffFiles));
19
+ const findings = [];
20
+ const dedupe = new Set();
21
+ for (const edge of edges) {
22
+ const finding = (0, import_edge_classifier_1.classifyImportEdge)(edge, input.projectRoot, input.intent);
23
+ if (!finding)
24
+ continue;
25
+ const key = `${finding.sourceFile}|${finding.importTarget}|${finding.resolvedBoundary}|${finding.policy}`;
26
+ if (dedupe.has(key))
27
+ continue;
28
+ dedupe.add(key);
29
+ findings.push(finding);
30
+ }
31
+ findings.sort((a, b) => {
32
+ if (a.sourceFile !== b.sourceFile)
33
+ return a.sourceFile < b.sourceFile ? -1 : 1;
34
+ if (a.resolvedBoundary !== b.resolvedBoundary)
35
+ return a.resolvedBoundary < b.resolvedBoundary ? -1 : 1;
36
+ if (a.importTarget !== b.importTarget)
37
+ return a.importTarget < b.importTarget ? -1 : 1;
38
+ if (a.sourceLine !== b.sourceLine)
39
+ return a.sourceLine - b.sourceLine;
40
+ return 0;
41
+ });
42
+ const blockingFindingCount = findings.filter((f) => f.governanceSeverity === 'blocking').length;
43
+ const advisoryFindingCount = findings.filter((f) => f.governanceSeverity === 'advisory').length;
44
+ const observedBoundaryTypes = Array.from(new Set(findings.map((f) => f.boundaryType))).sort();
45
+ const observedPolicies = Array.from(new Set(findings.map((f) => f.policy))).sort();
46
+ return {
47
+ edges,
48
+ findings,
49
+ edgeCount: edges.length,
50
+ blockingFindingCount,
51
+ advisoryFindingCount,
52
+ observedBoundaryTypes,
53
+ observedPolicies,
54
+ };
55
+ }
56
+ //# sourceMappingURL=import-edge-governance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"import-edge-governance.js","sourceRoot":"","sources":["../../src/utils/import-edge-governance.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;AA+CH,oEAuCC;AAlFD,mEAAyG;AACzG,qEAIkC;AAkClC;;;GAGG;AACH,SAAgB,4BAA4B,CAC1C,KAAgC;IAEhC,MAAM,KAAK,GAAG,IAAA,yCAAiB,EAAC,IAAA,kDAA0B,EAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;IAC7E,MAAM,QAAQ,GAAwB,EAAE,CAAC;IACzC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAU,CAAC;IAEjC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,IAAA,2CAAkB,EAAC,IAAI,EAAE,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;QAC1E,IAAI,CAAC,OAAO;YAAE,SAAS;QACvB,MAAM,GAAG,GAAG,GAAG,OAAO,CAAC,UAAU,IAAI,OAAO,CAAC,YAAY,IAAI,OAAO,CAAC,gBAAgB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QAC1G,IAAI,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,SAAS;QAC9B,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAChB,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACzB,CAAC;IAED,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACrB,IAAI,CAAC,CAAC,UAAU,KAAK,CAAC,CAAC,UAAU;YAAE,OAAO,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/E,IAAI,CAAC,CAAC,gBAAgB,KAAK,CAAC,CAAC,gBAAgB;YAAE,OAAO,CAAC,CAAC,gBAAgB,GAAG,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACvG,IAAI,CAAC,CAAC,YAAY,KAAK,CAAC,CAAC,YAAY;YAAE,OAAO,CAAC,CAAC,YAAY,GAAG,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACvF,IAAI,CAAC,CAAC,UAAU,KAAK,CAAC,CAAC,UAAU;YAAE,OAAO,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,CAAC;QACtE,OAAO,CAAC,CAAC;IACX,CAAC,CAAC,CAAC;IAEH,MAAM,oBAAoB,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,kBAAkB,KAAK,UAAU,CAAC,CAAC,MAAM,CAAC;IAChG,MAAM,oBAAoB,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,kBAAkB,KAAK,UAAU,CAAC,CAAC,MAAM,CAAC;IAEhG,MAAM,qBAAqB,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC9F,MAAM,gBAAgB,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAEnF,OAAO;QACL,KAAK;QACL,QAAQ;QACR,SAAS,EAAE,KAAK,CAAC,MAAM;QACvB,oBAAoB;QACpB,oBAAoB;QACpB,qBAAqB;QACrB,gBAAgB;KACjB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Deterministic, replay-safe path-boundary classification.
3
+ *
4
+ * Maps a repo-relative file path to one of a small, well-defined set of
5
+ * governance boundary categories (generated-code, infra, ci,
6
+ * dependency-manifest, sensitive). Uses ONLY pattern matching — no file I/O,
7
+ * no AI inference, no probabilistic scoring. Same path string → same
8
+ * classification across machines, runs, and CLI versions. Boundary patterns
9
+ * are intentionally conservative: when in doubt the classifier returns
10
+ * `null`, leaving the path uncategorised rather than asserting an incorrect
11
+ * boundary.
12
+ */
13
+ export type PathBoundaryCategory = 'generated-code' | 'infra' | 'ci' | 'dependency-manifest' | 'sensitive';
14
+ export interface PathBoundaryClassification {
15
+ category: PathBoundaryCategory;
16
+ /**
17
+ * Stable rationale ID. Used so dashboard/replay surfaces can group + render
18
+ * classifications without reading the human message.
19
+ */
20
+ reasonId: string;
21
+ /**
22
+ * Short human-readable description of why this path was classified this
23
+ * way. Stable: not parameterised by repo state.
24
+ */
25
+ reason: string;
26
+ }
27
+ /**
28
+ * Classify a single repo-relative path. Returns the FIRST matching boundary
29
+ * (rules are ordered by specificity / severity), or `null` when the path
30
+ * does not match any well-known boundary pattern.
31
+ *
32
+ * The classifier is intentionally first-match-wins so the ordering above
33
+ * encodes the priority: generated-code > CI > infra > sensitive > dep-manifest.
34
+ */
35
+ export declare function classifyPathBoundary(path: string): PathBoundaryClassification | null;
36
+ /**
37
+ * Bulk classify and bucket. Returns a deterministic { category → paths } map.
38
+ * Empty buckets are omitted from the result for compactness; consumers should
39
+ * defensively check `result.<category]?.length`.
40
+ */
41
+ export declare function classifyAndBucket(paths: readonly string[]): Partial<Record<PathBoundaryCategory, string[]>>;
42
+ //# sourceMappingURL=path-boundary-classifier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path-boundary-classifier.d.ts","sourceRoot":"","sources":["../../src/utils/path-boundary-classifier.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,MAAM,MAAM,oBAAoB,GAC5B,gBAAgB,GAChB,OAAO,GACP,IAAI,GACJ,qBAAqB,GACrB,WAAW,CAAC;AAEhB,MAAM,WAAW,0BAA0B;IACzC,QAAQ,EAAE,oBAAoB,CAAC;IAC/B;;;OAGG;IACH,QAAQ,EAAE,MAAM,CAAC;IACjB;;;OAGG;IACH,MAAM,EAAE,MAAM,CAAC;CAChB;AA0GD;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,0BAA0B,GAAG,IAAI,CASpF;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,oBAAoB,EAAE,MAAM,EAAE,CAAC,CAAC,CAe3G"}
@@ -0,0 +1,143 @@
1
+ "use strict";
2
+ /**
3
+ * Deterministic, replay-safe path-boundary classification.
4
+ *
5
+ * Maps a repo-relative file path to one of a small, well-defined set of
6
+ * governance boundary categories (generated-code, infra, ci,
7
+ * dependency-manifest, sensitive). Uses ONLY pattern matching — no file I/O,
8
+ * no AI inference, no probabilistic scoring. Same path string → same
9
+ * classification across machines, runs, and CLI versions. Boundary patterns
10
+ * are intentionally conservative: when in doubt the classifier returns
11
+ * `null`, leaving the path uncategorised rather than asserting an incorrect
12
+ * boundary.
13
+ */
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.classifyPathBoundary = classifyPathBoundary;
16
+ exports.classifyAndBucket = classifyAndBucket;
17
+ function exact(needle) {
18
+ return (path) => path === needle;
19
+ }
20
+ function basename(needle) {
21
+ return (path) => path === needle || path.endsWith(`/${needle}`);
22
+ }
23
+ function basenameAny(needles) {
24
+ const set = new Set(needles);
25
+ return (path) => {
26
+ const slash = path.lastIndexOf('/');
27
+ const name = slash === -1 ? path : path.slice(slash + 1);
28
+ return set.has(name);
29
+ };
30
+ }
31
+ function suffix(needle) {
32
+ return (path) => path.endsWith(needle);
33
+ }
34
+ function suffixAny(needles) {
35
+ return (path) => needles.some((n) => path.endsWith(n));
36
+ }
37
+ function segment(needle) {
38
+ const fragment = `/${needle}/`;
39
+ return (path) => path === needle || path.startsWith(`${needle}/`) || path.includes(fragment);
40
+ }
41
+ function regex(pattern) {
42
+ return (path) => pattern.test(path);
43
+ }
44
+ const RULES = Object.freeze([
45
+ // ── Generated code ────────────────────────────────────────────────────────
46
+ // Detection prioritised over infra because many generated artefacts live
47
+ // inside infra-adjacent paths (e.g. helm template output), and the
48
+ // "this is generated, do not hand-edit" semantic is the stronger signal.
49
+ { category: 'generated-code', reasonId: 'gen.protobuf-py', reason: 'Generated protobuf (Python).', test: suffixAny(['_pb2.py', '_pb2_grpc.py']) },
50
+ { category: 'generated-code', reasonId: 'gen.protobuf-go', reason: 'Generated protobuf (Go).', test: suffixAny(['.pb.go', '_pb.go']) },
51
+ { category: 'generated-code', reasonId: 'gen.protobuf-ts', reason: 'Generated protobuf (TS/JS).', test: suffixAny(['.pb.ts', '.pb.js']) },
52
+ { category: 'generated-code', reasonId: 'gen.dts', reason: 'TypeScript declaration file (typically generated).', test: suffix('.d.ts') },
53
+ { category: 'generated-code', reasonId: 'gen.openapi-segment', reason: 'OpenAPI / Swagger generated client surface.', test: regex(/(^|\/)(openapi-generated|swagger-generated|generated-clients?)\//) },
54
+ { category: 'generated-code', reasonId: 'gen.generated-segment', reason: 'Conventional generated-code directory.', test: regex(/(^|\/)(__generated__|generated|gen)\//) },
55
+ { category: 'generated-code', reasonId: 'gen.suffix-generated', reason: 'File explicitly suffixed `.generated.*`.', test: regex(/\.generated\.[A-Za-z0-9]+$/) },
56
+ { category: 'generated-code', reasonId: 'gen.dist-build', reason: 'Build output directory; never hand-edit.', test: regex(/(^|\/)(dist|build|out|\.next|\.nuxt|\.svelte-kit|\.turbo|target)\//) },
57
+ { category: 'generated-code', reasonId: 'gen.vendor', reason: 'Vendored / installed dependency tree.', test: regex(/(^|\/)(vendor|node_modules|Pods)\//) },
58
+ { category: 'generated-code', reasonId: 'gen.snapshots', reason: 'Generated test snapshot.', test: regex(/(^|\/)__snapshots__\//) },
59
+ { category: 'generated-code', reasonId: 'gen.lockfile', reason: 'Lock file — regenerated by tooling, not hand-authored.', test: basenameAny(['package-lock.json', 'pnpm-lock.yaml', 'yarn.lock', 'Cargo.lock', 'Pipfile.lock', 'poetry.lock', 'composer.lock', 'go.sum']) },
60
+ // ── CI ────────────────────────────────────────────────────────────────────
61
+ { category: 'ci', reasonId: 'ci.github-workflows', reason: 'GitHub Actions workflow.', test: regex(/^\.github\/workflows\//) },
62
+ { category: 'ci', reasonId: 'ci.github-action-config', reason: 'GitHub action / repo automation config.', test: regex(/^\.github\/(actions|dependabot\.yml|CODEOWNERS)/) },
63
+ { category: 'ci', reasonId: 'ci.gitlab', reason: 'GitLab CI config.', test: exact('.gitlab-ci.yml') },
64
+ { category: 'ci', reasonId: 'ci.circleci', reason: 'CircleCI config.', test: regex(/^\.circleci\//) },
65
+ { category: 'ci', reasonId: 'ci.jenkins', reason: 'Jenkins pipeline.', test: basenameAny(['Jenkinsfile']) },
66
+ { category: 'ci', reasonId: 'ci.travis', reason: 'Travis CI config.', test: exact('.travis.yml') },
67
+ { category: 'ci', reasonId: 'ci.azure-pipelines', reason: 'Azure Pipelines config.', test: basenameAny(['azure-pipelines.yml']) },
68
+ { category: 'ci', reasonId: 'ci.drone', reason: 'Drone CI config.', test: exact('.drone.yml') },
69
+ { category: 'ci', reasonId: 'ci.buildkite', reason: 'Buildkite pipeline.', test: regex(/^\.buildkite\//) },
70
+ // ── Infra / deployment ────────────────────────────────────────────────────
71
+ { category: 'infra', reasonId: 'infra.dockerfile', reason: 'Docker build artefact.', test: basenameAny(['Dockerfile']) },
72
+ { category: 'infra', reasonId: 'infra.dockerfile-variant', reason: 'Docker build artefact (variant).', test: regex(/(^|\/)Dockerfile(\.[A-Za-z0-9._-]+)?$/) },
73
+ { category: 'infra', reasonId: 'infra.docker-compose', reason: 'docker-compose deployment file.', test: regex(/(^|\/)docker-compose(\.[A-Za-z0-9._-]+)?\.ya?ml$/) },
74
+ { category: 'infra', reasonId: 'infra.terraform', reason: 'Terraform infrastructure source.', test: regex(/(^|\/)(terraform|infra\/terraform)\//) },
75
+ { category: 'infra', reasonId: 'infra.terraform-suffix', reason: 'Terraform source (suffix).', test: suffix('.tf') },
76
+ { category: 'infra', reasonId: 'infra.helm', reason: 'Helm chart source.', test: regex(/(^|\/)(helm|helm-chart|charts)\//) },
77
+ { category: 'infra', reasonId: 'infra.kubernetes', reason: 'Kubernetes manifest directory.', test: regex(/(^|\/)(k8s|kubernetes|manifests)\//) },
78
+ { category: 'infra', reasonId: 'infra.ansible', reason: 'Ansible playbook directory.', test: regex(/(^|\/)(ansible|playbooks)\//) },
79
+ { category: 'infra', reasonId: 'infra.cloudformation', reason: 'CloudFormation template directory.', test: regex(/(^|\/)cloudformation\//) },
80
+ { category: 'infra', reasonId: 'infra.serverless', reason: 'Serverless framework config.', test: basenameAny(['serverless.yml', 'serverless.yaml', 'serverless.ts']) },
81
+ { category: 'infra', reasonId: 'infra.nginx', reason: 'Nginx / reverse-proxy config.', test: regex(/(^|\/)nginx(.*)?\.conf$/) },
82
+ { category: 'infra', reasonId: 'infra.migration', reason: 'Database migration file.', test: regex(/(^|\/)(migrations|db\/migrations|services\/.+\/migrations)\//) },
83
+ // ── Sensitive ─────────────────────────────────────────────────────────────
84
+ { category: 'sensitive', reasonId: 'sensitive.env', reason: 'Environment variable file.', test: regex(/(^|\/)\.env(\.[A-Za-z0-9._-]+)?$/) },
85
+ { category: 'sensitive', reasonId: 'sensitive.keys', reason: 'Key/credential material.', test: regex(/\.(pem|key|crt|p12|pfx|jks|keystore)$/) },
86
+ { category: 'sensitive', reasonId: 'sensitive.auth-path', reason: 'Auth / IAM / permissions surface.', test: regex(/(^|\/)(auth|iam|permissions|secrets?)\//) },
87
+ // ── Dependency manifest ───────────────────────────────────────────────────
88
+ { category: 'dependency-manifest', reasonId: 'dep.npm', reason: 'Node package manifest.', test: basename('package.json') },
89
+ { category: 'dependency-manifest', reasonId: 'dep.python-requirements', reason: 'Python requirements file.', test: regex(/(^|\/)requirements(\/[^/]+)?\.(txt|in)$|^requirements(\/[^/]+)?\.(txt|in)$/) },
90
+ { category: 'dependency-manifest', reasonId: 'dep.python-requirements-dir', reason: 'Python requirements directory.', test: regex(/(^|\/)requirements\//) },
91
+ { category: 'dependency-manifest', reasonId: 'dep.pyproject', reason: 'Python project / build manifest.', test: basename('pyproject.toml') },
92
+ { category: 'dependency-manifest', reasonId: 'dep.pipfile', reason: 'Pipenv manifest.', test: basename('Pipfile') },
93
+ { category: 'dependency-manifest', reasonId: 'dep.setup-py', reason: 'Legacy setuptools manifest.', test: basename('setup.py') },
94
+ { category: 'dependency-manifest', reasonId: 'dep.setup-cfg', reason: 'Legacy setuptools config.', test: basename('setup.cfg') },
95
+ { category: 'dependency-manifest', reasonId: 'dep.cargo', reason: 'Rust crate manifest.', test: basename('Cargo.toml') },
96
+ { category: 'dependency-manifest', reasonId: 'dep.go-mod', reason: 'Go module manifest.', test: basename('go.mod') },
97
+ { category: 'dependency-manifest', reasonId: 'dep.maven', reason: 'Maven project manifest.', test: basename('pom.xml') },
98
+ { category: 'dependency-manifest', reasonId: 'dep.gradle', reason: 'Gradle build script.', test: suffixAny(['/build.gradle', '/build.gradle.kts', '/settings.gradle', '/settings.gradle.kts']) },
99
+ { category: 'dependency-manifest', reasonId: 'dep.composer', reason: 'PHP composer manifest.', test: basename('composer.json') },
100
+ { category: 'dependency-manifest', reasonId: 'dep.gemfile', reason: 'Ruby Gemfile.', test: basename('Gemfile') },
101
+ ]);
102
+ /**
103
+ * Classify a single repo-relative path. Returns the FIRST matching boundary
104
+ * (rules are ordered by specificity / severity), or `null` when the path
105
+ * does not match any well-known boundary pattern.
106
+ *
107
+ * The classifier is intentionally first-match-wins so the ordering above
108
+ * encodes the priority: generated-code > CI > infra > sensitive > dep-manifest.
109
+ */
110
+ function classifyPathBoundary(path) {
111
+ if (!path)
112
+ return null;
113
+ const normalised = path.replace(/\\/g, '/').replace(/^\.\//, '');
114
+ for (const rule of RULES) {
115
+ if (rule.test(normalised)) {
116
+ return { category: rule.category, reasonId: rule.reasonId, reason: rule.reason };
117
+ }
118
+ }
119
+ return null;
120
+ }
121
+ /**
122
+ * Bulk classify and bucket. Returns a deterministic { category → paths } map.
123
+ * Empty buckets are omitted from the result for compactness; consumers should
124
+ * defensively check `result.<category]?.length`.
125
+ */
126
+ function classifyAndBucket(paths) {
127
+ const buckets = {};
128
+ // Sort + dedupe inputs so the output is replay-stable regardless of caller
129
+ // ordering. This is load-bearing for the canonical replay checksum.
130
+ const seen = new Set();
131
+ const inputs = [...paths]
132
+ .filter((p) => typeof p === 'string' && p.length > 0)
133
+ .filter((p) => (seen.has(p) ? false : (seen.add(p), true)))
134
+ .sort();
135
+ for (const path of inputs) {
136
+ const classification = classifyPathBoundary(path);
137
+ if (!classification)
138
+ continue;
139
+ (buckets[classification.category] ??= []).push(path);
140
+ }
141
+ return buckets;
142
+ }
143
+ //# sourceMappingURL=path-boundary-classifier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path-boundary-classifier.js","sourceRoot":"","sources":["../../src/utils/path-boundary-classifier.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Self-contained HTML replay report generator.
3
+ *
4
+ * Renders deterministic replay state into a single audit-grade HTML file.
5
+ * No JavaScript, no external assets, no remote requests — every byte of the
6
+ * output is derived from canonical replay artifacts.
7
+ *
8
+ * The output is intended to be opened directly in a browser, attached to
9
+ * audit reports, or stored alongside `.neurcode/evidence/` artifacts.
10
+ */
11
+ import type { replayGovernanceState } from './replay-runtime';
12
+ type ReplayState = ReturnType<typeof replayGovernanceState>;
13
+ export interface HtmlReportInput {
14
+ state: ReplayState;
15
+ /**
16
+ * Optional latest verify payload (the structural+governance envelope
17
+ * emitted by `verify --json`). When provided, scope issues, runtime
18
+ * capabilities, and the canonical replay checksum are surfaced.
19
+ */
20
+ verify?: Record<string, unknown> | null;
21
+ generatedAt?: string;
22
+ }
23
+ /**
24
+ * Render a self-contained HTML report. The returned string is ready to be
25
+ * written to disk and opened in any browser. No external assets fetched.
26
+ */
27
+ export declare function renderReplayHtmlReport(input: HtmlReportInput): string;
28
+ export {};
29
+ //# sourceMappingURL=replay-html-report.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"replay-html-report.d.ts","sourceRoot":"","sources":["../../src/utils/replay-html-report.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAE9D,KAAK,WAAW,GAAG,UAAU,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAE5D,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,WAAW,CAAC;IACnB;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACxC,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAoQD;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,eAAe,GAAG,MAAM,CAsCrE"}