critical-gate 2.0.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 (243) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +240 -0
  3. package/dist/cli.d.ts +20 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +224 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/config/critical-gate-config.d.ts +21 -0
  8. package/dist/config/critical-gate-config.d.ts.map +1 -0
  9. package/dist/config/critical-gate-config.js +81 -0
  10. package/dist/config/critical-gate-config.js.map +1 -0
  11. package/dist/config/index.d.ts +2 -0
  12. package/dist/config/index.d.ts.map +1 -0
  13. package/dist/config/index.js +2 -0
  14. package/dist/config/index.js.map +1 -0
  15. package/dist/detectors/api-surface-detector.d.ts +3 -0
  16. package/dist/detectors/api-surface-detector.d.ts.map +1 -0
  17. package/dist/detectors/api-surface-detector.js +111 -0
  18. package/dist/detectors/api-surface-detector.js.map +1 -0
  19. package/dist/detectors/blast-radius-detector.d.ts +3 -0
  20. package/dist/detectors/blast-radius-detector.d.ts.map +1 -0
  21. package/dist/detectors/blast-radius-detector.js +90 -0
  22. package/dist/detectors/blast-radius-detector.js.map +1 -0
  23. package/dist/detectors/config-change-detector.d.ts +3 -0
  24. package/dist/detectors/config-change-detector.d.ts.map +1 -0
  25. package/dist/detectors/config-change-detector.js +68 -0
  26. package/dist/detectors/config-change-detector.js.map +1 -0
  27. package/dist/detectors/dependency-detector.d.ts +3 -0
  28. package/dist/detectors/dependency-detector.d.ts.map +1 -0
  29. package/dist/detectors/dependency-detector.js +98 -0
  30. package/dist/detectors/dependency-detector.js.map +1 -0
  31. package/dist/detectors/existing-solution-detector.d.ts +3 -0
  32. package/dist/detectors/existing-solution-detector.d.ts.map +1 -0
  33. package/dist/detectors/existing-solution-detector.js +87 -0
  34. package/dist/detectors/existing-solution-detector.js.map +1 -0
  35. package/dist/detectors/expected-companions-detector.d.ts +3 -0
  36. package/dist/detectors/expected-companions-detector.d.ts.map +1 -0
  37. package/dist/detectors/expected-companions-detector.js +65 -0
  38. package/dist/detectors/expected-companions-detector.js.map +1 -0
  39. package/dist/detectors/index.d.ts +17 -0
  40. package/dist/detectors/index.d.ts.map +1 -0
  41. package/dist/detectors/index.js +16 -0
  42. package/dist/detectors/index.js.map +1 -0
  43. package/dist/detectors/intent-verification-detector.d.ts +3 -0
  44. package/dist/detectors/intent-verification-detector.d.ts.map +1 -0
  45. package/dist/detectors/intent-verification-detector.js +43 -0
  46. package/dist/detectors/intent-verification-detector.js.map +1 -0
  47. package/dist/detectors/pattern-violation-detector.d.ts +3 -0
  48. package/dist/detectors/pattern-violation-detector.d.ts.map +1 -0
  49. package/dist/detectors/pattern-violation-detector.js +83 -0
  50. package/dist/detectors/pattern-violation-detector.js.map +1 -0
  51. package/dist/detectors/repository-intelligence-detector.d.ts +3 -0
  52. package/dist/detectors/repository-intelligence-detector.d.ts.map +1 -0
  53. package/dist/detectors/repository-intelligence-detector.js +51 -0
  54. package/dist/detectors/repository-intelligence-detector.js.map +1 -0
  55. package/dist/detectors/rewrite-detector.d.ts +3 -0
  56. package/dist/detectors/rewrite-detector.d.ts.map +1 -0
  57. package/dist/detectors/rewrite-detector.js +61 -0
  58. package/dist/detectors/rewrite-detector.js.map +1 -0
  59. package/dist/detectors/runner.d.ts +9 -0
  60. package/dist/detectors/runner.d.ts.map +1 -0
  61. package/dist/detectors/runner.js +96 -0
  62. package/dist/detectors/runner.js.map +1 -0
  63. package/dist/detectors/scope-detector.d.ts +3 -0
  64. package/dist/detectors/scope-detector.d.ts.map +1 -0
  65. package/dist/detectors/scope-detector.js +138 -0
  66. package/dist/detectors/scope-detector.js.map +1 -0
  67. package/dist/detectors/secret-path-detector.d.ts +5 -0
  68. package/dist/detectors/secret-path-detector.d.ts.map +1 -0
  69. package/dist/detectors/secret-path-detector.js +150 -0
  70. package/dist/detectors/secret-path-detector.js.map +1 -0
  71. package/dist/detectors/test-weakening-detector.d.ts +3 -0
  72. package/dist/detectors/test-weakening-detector.d.ts.map +1 -0
  73. package/dist/detectors/test-weakening-detector.js +91 -0
  74. package/dist/detectors/test-weakening-detector.js.map +1 -0
  75. package/dist/detectors/types.d.ts +15 -0
  76. package/dist/detectors/types.d.ts.map +1 -0
  77. package/dist/detectors/types.js +2 -0
  78. package/dist/detectors/types.js.map +1 -0
  79. package/dist/detectors/utility-reinvention-detector.d.ts +3 -0
  80. package/dist/detectors/utility-reinvention-detector.d.ts.map +1 -0
  81. package/dist/detectors/utility-reinvention-detector.js +78 -0
  82. package/dist/detectors/utility-reinvention-detector.js.map +1 -0
  83. package/dist/diff/git-diff-reader.d.ts +24 -0
  84. package/dist/diff/git-diff-reader.d.ts.map +1 -0
  85. package/dist/diff/git-diff-reader.js +81 -0
  86. package/dist/diff/git-diff-reader.js.map +1 -0
  87. package/dist/diff/index.d.ts +4 -0
  88. package/dist/diff/index.d.ts.map +1 -0
  89. package/dist/diff/index.js +4 -0
  90. package/dist/diff/index.js.map +1 -0
  91. package/dist/diff/parse-unified-diff.d.ts +3 -0
  92. package/dist/diff/parse-unified-diff.d.ts.map +1 -0
  93. package/dist/diff/parse-unified-diff.js +153 -0
  94. package/dist/diff/parse-unified-diff.js.map +1 -0
  95. package/dist/diff/path-classifier.d.ts +5 -0
  96. package/dist/diff/path-classifier.d.ts.map +1 -0
  97. package/dist/diff/path-classifier.js +86 -0
  98. package/dist/diff/path-classifier.js.map +1 -0
  99. package/dist/editor/diagnostics.d.ts +35 -0
  100. package/dist/editor/diagnostics.d.ts.map +1 -0
  101. package/dist/editor/diagnostics.js +55 -0
  102. package/dist/editor/diagnostics.js.map +1 -0
  103. package/dist/editor/index.d.ts +3 -0
  104. package/dist/editor/index.d.ts.map +1 -0
  105. package/dist/editor/index.js +2 -0
  106. package/dist/editor/index.js.map +1 -0
  107. package/dist/index.d.ts +11 -0
  108. package/dist/index.d.ts.map +1 -0
  109. package/dist/index.js +11 -0
  110. package/dist/index.js.map +1 -0
  111. package/dist/intent/index.d.ts +5 -0
  112. package/dist/intent/index.d.ts.map +1 -0
  113. package/dist/intent/index.js +5 -0
  114. package/dist/intent/index.js.map +1 -0
  115. package/dist/intent/intent-core.d.ts +4 -0
  116. package/dist/intent/intent-core.d.ts.map +1 -0
  117. package/dist/intent/intent-core.js +58 -0
  118. package/dist/intent/intent-core.js.map +1 -0
  119. package/dist/intent/intent-model.d.ts +18 -0
  120. package/dist/intent/intent-model.d.ts.map +1 -0
  121. package/dist/intent/intent-model.js +74 -0
  122. package/dist/intent/intent-model.js.map +1 -0
  123. package/dist/intent/observed-actions.d.ts +17 -0
  124. package/dist/intent/observed-actions.d.ts.map +1 -0
  125. package/dist/intent/observed-actions.js +128 -0
  126. package/dist/intent/observed-actions.js.map +1 -0
  127. package/dist/intent/scope-expansion-score.d.ts +13 -0
  128. package/dist/intent/scope-expansion-score.d.ts.map +1 -0
  129. package/dist/intent/scope-expansion-score.js +87 -0
  130. package/dist/intent/scope-expansion-score.js.map +1 -0
  131. package/dist/intent/task-analysis.d.ts +18 -0
  132. package/dist/intent/task-analysis.d.ts.map +1 -0
  133. package/dist/intent/task-analysis.js +46 -0
  134. package/dist/intent/task-analysis.js.map +1 -0
  135. package/dist/knowledge/cache.d.ts +29 -0
  136. package/dist/knowledge/cache.d.ts.map +1 -0
  137. package/dist/knowledge/cache.js +85 -0
  138. package/dist/knowledge/cache.js.map +1 -0
  139. package/dist/knowledge/graph.d.ts +16 -0
  140. package/dist/knowledge/graph.d.ts.map +1 -0
  141. package/dist/knowledge/graph.js +139 -0
  142. package/dist/knowledge/graph.js.map +1 -0
  143. package/dist/knowledge/history-index.d.ts +20 -0
  144. package/dist/knowledge/history-index.d.ts.map +1 -0
  145. package/dist/knowledge/history-index.js +117 -0
  146. package/dist/knowledge/history-index.js.map +1 -0
  147. package/dist/knowledge/index.d.ts +9 -0
  148. package/dist/knowledge/index.d.ts.map +1 -0
  149. package/dist/knowledge/index.js +8 -0
  150. package/dist/knowledge/index.js.map +1 -0
  151. package/dist/knowledge/pattern-index.d.ts +14 -0
  152. package/dist/knowledge/pattern-index.d.ts.map +1 -0
  153. package/dist/knowledge/pattern-index.js +94 -0
  154. package/dist/knowledge/pattern-index.js.map +1 -0
  155. package/dist/knowledge/provider.d.ts +18 -0
  156. package/dist/knowledge/provider.d.ts.map +1 -0
  157. package/dist/knowledge/provider.js +83 -0
  158. package/dist/knowledge/provider.js.map +1 -0
  159. package/dist/knowledge/solution-index.d.ts +17 -0
  160. package/dist/knowledge/solution-index.d.ts.map +1 -0
  161. package/dist/knowledge/solution-index.js +170 -0
  162. package/dist/knowledge/solution-index.js.map +1 -0
  163. package/dist/knowledge/symbol-index.d.ts +4 -0
  164. package/dist/knowledge/symbol-index.d.ts.map +1 -0
  165. package/dist/knowledge/symbol-index.js +11 -0
  166. package/dist/knowledge/symbol-index.js.map +1 -0
  167. package/dist/knowledge/types.d.ts +100 -0
  168. package/dist/knowledge/types.d.ts.map +1 -0
  169. package/dist/knowledge/types.js +2 -0
  170. package/dist/knowledge/types.js.map +1 -0
  171. package/dist/llm/artifact.d.ts +6 -0
  172. package/dist/llm/artifact.d.ts.map +1 -0
  173. package/dist/llm/artifact.js +86 -0
  174. package/dist/llm/artifact.js.map +1 -0
  175. package/dist/llm/cache.d.ts +10 -0
  176. package/dist/llm/cache.d.ts.map +1 -0
  177. package/dist/llm/cache.js +24 -0
  178. package/dist/llm/cache.js.map +1 -0
  179. package/dist/llm/index.d.ts +8 -0
  180. package/dist/llm/index.d.ts.map +1 -0
  181. package/dist/llm/index.js +7 -0
  182. package/dist/llm/index.js.map +1 -0
  183. package/dist/llm/prompt.d.ts +7 -0
  184. package/dist/llm/prompt.d.ts.map +1 -0
  185. package/dist/llm/prompt.js +23 -0
  186. package/dist/llm/prompt.js.map +1 -0
  187. package/dist/llm/provider.d.ts +4 -0
  188. package/dist/llm/provider.d.ts.map +1 -0
  189. package/dist/llm/provider.js +43 -0
  190. package/dist/llm/provider.js.map +1 -0
  191. package/dist/llm/redaction.d.ts +3 -0
  192. package/dist/llm/redaction.d.ts.map +1 -0
  193. package/dist/llm/redaction.js +22 -0
  194. package/dist/llm/redaction.js.map +1 -0
  195. package/dist/llm/types.d.ts +89 -0
  196. package/dist/llm/types.d.ts.map +1 -0
  197. package/dist/llm/types.js +2 -0
  198. package/dist/llm/types.js.map +1 -0
  199. package/dist/reporters/index.d.ts +8 -0
  200. package/dist/reporters/index.d.ts.map +1 -0
  201. package/dist/reporters/index.js +21 -0
  202. package/dist/reporters/index.js.map +1 -0
  203. package/dist/reporters/json-reporter.d.ts +3 -0
  204. package/dist/reporters/json-reporter.d.ts.map +1 -0
  205. package/dist/reporters/json-reporter.js +4 -0
  206. package/dist/reporters/json-reporter.js.map +1 -0
  207. package/dist/reporters/markdown-reporter.d.ts +3 -0
  208. package/dist/reporters/markdown-reporter.d.ts.map +1 -0
  209. package/dist/reporters/markdown-reporter.js +76 -0
  210. package/dist/reporters/markdown-reporter.js.map +1 -0
  211. package/dist/reporters/repair-reporter.d.ts +3 -0
  212. package/dist/reporters/repair-reporter.d.ts.map +1 -0
  213. package/dist/reporters/repair-reporter.js +56 -0
  214. package/dist/reporters/repair-reporter.js.map +1 -0
  215. package/dist/reporters/sarif-reporter.d.ts +3 -0
  216. package/dist/reporters/sarif-reporter.d.ts.map +1 -0
  217. package/dist/reporters/sarif-reporter.js +161 -0
  218. package/dist/reporters/sarif-reporter.js.map +1 -0
  219. package/dist/repository/index.d.ts +3 -0
  220. package/dist/repository/index.d.ts.map +1 -0
  221. package/dist/repository/index.js +3 -0
  222. package/dist/repository/index.js.map +1 -0
  223. package/dist/repository/profile.d.ts +7 -0
  224. package/dist/repository/profile.d.ts.map +1 -0
  225. package/dist/repository/profile.js +6 -0
  226. package/dist/repository/profile.js.map +1 -0
  227. package/dist/repository/utility-index.d.ts +7 -0
  228. package/dist/repository/utility-index.d.ts.map +1 -0
  229. package/dist/repository/utility-index.js +6 -0
  230. package/dist/repository/utility-index.js.map +1 -0
  231. package/dist/schema/gate-result.schema.d.ts +514 -0
  232. package/dist/schema/gate-result.schema.d.ts.map +1 -0
  233. package/dist/schema/gate-result.schema.js +326 -0
  234. package/dist/schema/gate-result.schema.js.map +1 -0
  235. package/dist/schema/index.d.ts +4 -0
  236. package/dist/schema/index.d.ts.map +1 -0
  237. package/dist/schema/index.js +3 -0
  238. package/dist/schema/index.js.map +1 -0
  239. package/dist/schema/types.d.ts +136 -0
  240. package/dist/schema/types.d.ts.map +1 -0
  241. package/dist/schema/types.js +2 -0
  242. package/dist/schema/types.js.map +1 -0
  243. package/package.json +51 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"observed-actions.d.ts","sourceRoot":"","sources":["../../src/intent/observed-actions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAY,MAAM,oBAAoB,CAAC;AAC7D,OAAO,KAAK,EAAE,yBAAyB,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChF,OAAO,EAAoB,KAAK,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEvE,MAAM,WAAW,2BAA2B;IAC1C,WAAW,EAAE,WAAW,CAAC;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,QAAQ,EAAE,2BAA2B,EAAE,CAAC;CACzC;AAYD,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,mBAAmB,CAOlF;AAED,wBAAgB,2BAA2B,CACzC,IAAI,EAAE,UAAU,EAChB,KAAK,EAAE,QAAQ,EAAE,GAChB,yBAAyB,CAoB3B"}
@@ -0,0 +1,128 @@
1
+ import { buildIntentModel } from "./intent-model.js";
2
+ const workflowPathPattern = /(^|\/)\.github\/workflows\//;
3
+ const buildConfigPathPattern = /(^|\/)(tsconfig[^/]*\.json|vite\.config\.[cm]?[jt]s|webpack\.config\.[cm]?[jt]s|rollup\.config\.[cm]?[jt]s|esbuild\.config\.[cm]?[jt]s)$/;
4
+ const uiPathPattern = /(^|\/)(components?|views?|pages?|screens?|styles?|theme|themes)\//i;
5
+ const dataModelPathPattern = /(^|\/)(schemas?|models?|migrations?|entities)\//i;
6
+ const exportDeclarationPattern = /^\s*export\s+(?:async\s+)?(?:declare\s+)?(?:function|class|interface|type|enum|const|let|var)\s+([A-Za-z_$][\w$]*)/;
7
+ const namedExportPattern = /^\s*export\s*\{([^}]+)\}/;
8
+ const defaultExportPattern = /^\s*export\s+default\s+/;
9
+ export function classifyObservedDiffActions(files) {
10
+ const evidence = files.flatMap(classifyFileActions);
11
+ return {
12
+ classes: [...new Set(evidence.map((entry) => entry.changeClass))].sort(),
13
+ evidence
14
+ };
15
+ }
16
+ export function summarizeIntentVerification(task, files) {
17
+ const intent = buildIntentModel(task);
18
+ const observed = classifyObservedDiffActions(files);
19
+ const unexpectedClasses = observed.classes.filter((changeClass) => !intent.allowedChangeClasses.includes(changeClass));
20
+ const matchedClasses = observed.classes.filter((changeClass) => intent.allowedChangeClasses.includes(changeClass));
21
+ return {
22
+ requestedClasses: intent.allowedChangeClasses,
23
+ observedClasses: observed.classes,
24
+ unexpectedClasses,
25
+ coverage: getCoverage(observed.classes, unexpectedClasses, matchedClasses),
26
+ explanationCodes: [
27
+ ...matchedClasses.map((changeClass) => `matched:${changeClass}`),
28
+ ...unexpectedClasses.map((changeClass) => `unexpected:${changeClass}`)
29
+ ]
30
+ };
31
+ }
32
+ function getCoverage(observedClasses, unexpectedClasses, matchedClasses) {
33
+ if (observedClasses.length === 0 || matchedClasses.length === 0) {
34
+ return "none";
35
+ }
36
+ if (unexpectedClasses.length === 0) {
37
+ return "matched";
38
+ }
39
+ return "partial";
40
+ }
41
+ function classifyFileActions(file) {
42
+ const evidence = [];
43
+ if (file.role === "source") {
44
+ evidence.push(toEvidence("source", file, "Source file changed."));
45
+ }
46
+ if (file.role === "test") {
47
+ evidence.push(toEvidence("tests", file, "Test file changed."));
48
+ }
49
+ if (file.role === "docs") {
50
+ evidence.push(toEvidence("docs", file, "Documentation file changed."));
51
+ }
52
+ if (file.role === "manifest" || file.role === "lockfile") {
53
+ evidence.push(toEvidence("dependency", file, "Package manifest or lockfile changed."));
54
+ }
55
+ if (file.role === "config") {
56
+ evidence.push(toEvidence("config", file, "Configuration file changed."));
57
+ }
58
+ if (workflowPathPattern.test(file.path)) {
59
+ evidence.push(toEvidence("ci", file, "GitHub workflow changed."));
60
+ }
61
+ if (buildConfigPathPattern.test(file.path)) {
62
+ evidence.push(toEvidence("build", file, "Build or compiler configuration changed."));
63
+ }
64
+ if (uiPathPattern.test(file.path) || /\.(css|scss|sass|less)$/.test(file.path)) {
65
+ evidence.push(toEvidence("ui", file, "UI or styling file changed."));
66
+ }
67
+ if (dataModelPathPattern.test(file.path)) {
68
+ evidence.push(toEvidence("data-model", file, "Data model or schema file changed."));
69
+ }
70
+ evidence.push(...extractPublicExportEvidence(file));
71
+ return dedupeEvidence(evidence);
72
+ }
73
+ function extractPublicExportEvidence(file) {
74
+ if (file.role !== "source" || !/\.[cm]?[jt]sx?$/.test(file.path)) {
75
+ return [];
76
+ }
77
+ return file.hunks.flatMap((hunk) => hunk.lines.flatMap((line) => {
78
+ if (line.kind !== "add" && line.kind !== "delete") {
79
+ return [];
80
+ }
81
+ const symbol = getExportSymbol(line);
82
+ if (symbol === undefined) {
83
+ return [];
84
+ }
85
+ return [
86
+ {
87
+ changeClass: "api-surface",
88
+ path: file.path,
89
+ lineNumber: line.kind === "add" ? line.newLineNumber : line.oldLineNumber,
90
+ symbol,
91
+ reason: "Public export changed."
92
+ }
93
+ ];
94
+ }));
95
+ }
96
+ function getExportSymbol(line) {
97
+ const declaredExport = exportDeclarationPattern.exec(line.content);
98
+ if (declaredExport !== null) {
99
+ return declaredExport[1];
100
+ }
101
+ const namedExport = namedExportPattern.exec(line.content);
102
+ if (namedExport !== null) {
103
+ return namedExport[1]?.split(",")[0]?.trim();
104
+ }
105
+ if (defaultExportPattern.test(line.content)) {
106
+ return "default";
107
+ }
108
+ return undefined;
109
+ }
110
+ function toEvidence(changeClass, file, reason) {
111
+ return {
112
+ changeClass,
113
+ path: file.path,
114
+ reason
115
+ };
116
+ }
117
+ function dedupeEvidence(evidence) {
118
+ const seen = new Set();
119
+ return evidence.filter((entry) => {
120
+ const key = `${entry.changeClass}:${entry.path}:${entry.lineNumber ?? ""}:${entry.symbol ?? ""}`;
121
+ if (seen.has(key)) {
122
+ return false;
123
+ }
124
+ seen.add(key);
125
+ return true;
126
+ });
127
+ }
128
+ //# sourceMappingURL=observed-actions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"observed-actions.js","sourceRoot":"","sources":["../../src/intent/observed-actions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { DiffFile, Finding, TaskIntent } from "../schema/index.js";
2
+ export interface ScopeExpansionScore {
3
+ score: number;
4
+ drivers: ScopeExpansionDriver[];
5
+ }
6
+ export interface ScopeExpansionDriver {
7
+ code: string;
8
+ label: string;
9
+ points: number;
10
+ evidence?: string[];
11
+ }
12
+ export declare function calculateScopeExpansionScore(task: TaskIntent, files: DiffFile[], findings: Finding[]): ScopeExpansionScore;
13
+ //# sourceMappingURL=scope-expansion-score.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scope-expansion-score.d.ts","sourceRoot":"","sources":["../../src/intent/scope-expansion-score.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAGxE,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,oBAAoB,EAAE,CAAC;CACjC;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,wBAAgB,4BAA4B,CAC1C,IAAI,EAAE,UAAU,EAChB,KAAK,EAAE,QAAQ,EAAE,EACjB,QAAQ,EAAE,OAAO,EAAE,GAClB,mBAAmB,CAqBrB"}
@@ -0,0 +1,87 @@
1
+ import { analyzeTaskIntent, getDiffMetrics } from "./task-analysis.js";
2
+ export function calculateScopeExpansionScore(task, files, findings) {
3
+ const analysis = analyzeTaskIntent(task);
4
+ const metrics = getDiffMetrics(files);
5
+ const drivers = [
6
+ getClusterDriver(findings),
7
+ getHighRiskRoleDriver(files),
8
+ getRewriteDriver(findings),
9
+ getFindingDriver(findings, "dependency", "dependency-change", "Dependency changes"),
10
+ getFindingDriver(findings, "api", "api-surface-change", "API surface changes"),
11
+ getFindingDriver(findings, "config", "config-change", "Configuration changes"),
12
+ getMissingCompanionDriver(findings),
13
+ getChurnDriver(analysis.complexity, metrics.churn)
14
+ ].filter((driver) => driver !== undefined);
15
+ return {
16
+ score: Math.min(10, drivers.reduce((total, driver) => total + driver.points, 0)),
17
+ drivers
18
+ };
19
+ }
20
+ function getClusterDriver(findings) {
21
+ const clusters = findings.filter((finding) => finding.detector === "blast-radius");
22
+ if (clusters.length === 0) {
23
+ return undefined;
24
+ }
25
+ return {
26
+ code: "unexpected-clusters",
27
+ label: "Unexpected changed-file clusters",
28
+ points: Math.min(3, clusters.length * 2),
29
+ evidence: clusters.flatMap((finding) => finding.evidence
30
+ .map((evidence) => evidence.path)
31
+ .filter((path) => path !== undefined))
32
+ };
33
+ }
34
+ function getHighRiskRoleDriver(files) {
35
+ const paths = files
36
+ .filter((file) => file.role === "config" || file.role === "manifest" || file.role === "lockfile")
37
+ .map((file) => file.path);
38
+ if (paths.length === 0) {
39
+ return undefined;
40
+ }
41
+ return {
42
+ code: "high-risk-roles",
43
+ label: "Config, manifest, or lockfile touched",
44
+ points: Math.min(2, paths.length),
45
+ evidence: paths
46
+ };
47
+ }
48
+ function getRewriteDriver(findings) {
49
+ return getFindingDriver(findings, "rewrite", "rewrite", "Rewrite-like churn");
50
+ }
51
+ function getFindingDriver(findings, tag, code, label) {
52
+ const matching = findings.filter((finding) => finding.tags.includes(tag));
53
+ if (matching.length === 0) {
54
+ return undefined;
55
+ }
56
+ return {
57
+ code,
58
+ label,
59
+ points: Math.min(2, matching.length),
60
+ evidence: matching.map((finding) => finding.id)
61
+ };
62
+ }
63
+ function getMissingCompanionDriver(findings) {
64
+ const matching = findings.filter((finding) => finding.detector === "expected-companions");
65
+ if (matching.length === 0) {
66
+ return undefined;
67
+ }
68
+ return {
69
+ code: "missing-companions",
70
+ label: "Expected companion files missing",
71
+ points: Math.min(2, matching.length),
72
+ evidence: matching.map((finding) => finding.id)
73
+ };
74
+ }
75
+ function getChurnDriver(complexity, churn) {
76
+ const threshold = complexity === "small" ? 80 : complexity === "medium" ? 180 : 400;
77
+ if (churn <= threshold) {
78
+ return undefined;
79
+ }
80
+ return {
81
+ code: "churn",
82
+ label: "Churn exceeds task complexity",
83
+ points: complexity === "small" ? 2 : 1,
84
+ evidence: [`churn:${churn}`, `complexity:${complexity}`]
85
+ };
86
+ }
87
+ //# sourceMappingURL=scope-expansion-score.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scope-expansion-score.js","sourceRoot":"","sources":["../../src/intent/scope-expansion-score.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { DiffFile, TaskIntent } from "../schema/index.js";
2
+ import { estimateTaskComplexity, extractTaskKeywords, type TaskComplexity } from "./intent-core.js";
3
+ export interface TaskAnalysis {
4
+ complexity: TaskComplexity;
5
+ keywords: string[];
6
+ }
7
+ export interface DiffMetrics {
8
+ changedFiles: number;
9
+ additions: number;
10
+ deletions: number;
11
+ churn: number;
12
+ }
13
+ export declare function analyzeTaskIntent(task: TaskIntent): TaskAnalysis;
14
+ export declare function getDiffMetrics(files: DiffFile[]): DiffMetrics;
15
+ export { estimateTaskComplexity, extractTaskKeywords };
16
+ export type { TaskComplexity };
17
+ export declare function calculateDiffCostScore(task: TaskIntent, files: DiffFile[]): number;
18
+ //# sourceMappingURL=task-analysis.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-analysis.d.ts","sourceRoot":"","sources":["../../src/intent/task-analysis.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAE/D,OAAO,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,KAAK,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEpG,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,cAAc,CAAC;IAC3B,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,UAAU,GAAG,YAAY,CAOhE;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,WAAW,CAU7D;AAED,OAAO,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,CAAC;AACvD,YAAY,EAAE,cAAc,EAAE,CAAC;AAE/B,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,MAAM,CASlF"}
@@ -0,0 +1,46 @@
1
+ import { buildIntentModel } from "./intent-model.js";
2
+ import { estimateTaskComplexity, extractTaskKeywords } from "./intent-core.js";
3
+ export function analyzeTaskIntent(task) {
4
+ const model = buildIntentModel(task);
5
+ return {
6
+ complexity: model.complexity,
7
+ keywords: model.targetTokens
8
+ };
9
+ }
10
+ export function getDiffMetrics(files) {
11
+ const additions = files.reduce((total, file) => total + file.additions, 0);
12
+ const deletions = files.reduce((total, file) => total + file.deletions, 0);
13
+ return {
14
+ changedFiles: files.length,
15
+ additions,
16
+ deletions,
17
+ churn: additions + deletions
18
+ };
19
+ }
20
+ export { estimateTaskComplexity, extractTaskKeywords };
21
+ export function calculateDiffCostScore(task, files) {
22
+ const analysis = analyzeTaskIntent(task);
23
+ const metrics = getDiffMetrics(files);
24
+ const complexityMultiplier = getComplexityMultiplier(analysis.complexity);
25
+ const fileScore = Math.min(40, metrics.changedFiles * 5 * complexityMultiplier);
26
+ const churnScore = Math.min(35, Math.ceil(metrics.churn / 20) * 5 * complexityMultiplier);
27
+ const roleScore = Math.min(25, getUnexpectedRoleCount(analysis.complexity, files) * 8);
28
+ return Math.min(100, Math.round(fileScore + churnScore + roleScore));
29
+ }
30
+ function getComplexityMultiplier(complexity) {
31
+ switch (complexity) {
32
+ case "small":
33
+ return 1.4;
34
+ case "medium":
35
+ return 1;
36
+ case "large":
37
+ return 0.65;
38
+ }
39
+ }
40
+ function getUnexpectedRoleCount(complexity, files) {
41
+ if (complexity !== "small") {
42
+ return 0;
43
+ }
44
+ return files.filter((file) => file.role === "config" || file.role === "manifest" || file.role === "lockfile").length;
45
+ }
46
+ //# sourceMappingURL=task-analysis.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-analysis.js","sourceRoot":"","sources":["../../src/intent/task-analysis.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,sBAAsB,EAAE,mBAAmB,EAAuB,MAAM,kBAAkB,CAAC;AAcpG,MAAM,UAAU,iBAAiB,CAAC,IAAgB;IAChD,MAAM,KAAK,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;IAErC,OAAO;QACL,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,QAAQ,EAAE,KAAK,CAAC,YAAY;KAC7B,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,KAAiB;IAC9C,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,KAAK,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;IAC3E,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,KAAK,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;IAE3E,OAAO;QACL,YAAY,EAAE,KAAK,CAAC,MAAM;QAC1B,SAAS;QACT,SAAS;QACT,KAAK,EAAE,SAAS,GAAG,SAAS;KAC7B,CAAC;AACJ,CAAC;AAED,OAAO,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,CAAC;AAGvD,MAAM,UAAU,sBAAsB,CAAC,IAAgB,EAAE,KAAiB;IACxE,MAAM,QAAQ,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;IACzC,MAAM,OAAO,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;IACtC,MAAM,oBAAoB,GAAG,uBAAuB,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IAC1E,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,CAAC,YAAY,GAAG,CAAC,GAAG,oBAAoB,CAAC,CAAC;IAChF,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,oBAAoB,CAAC,CAAC;IAC1F,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,sBAAsB,CAAC,QAAQ,CAAC,UAAU,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;IAEvF,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,UAAU,GAAG,SAAS,CAAC,CAAC,CAAC;AACvE,CAAC;AAED,SAAS,uBAAuB,CAAC,UAA0B;IACzD,QAAQ,UAAU,EAAE,CAAC;QACnB,KAAK,OAAO;YACV,OAAO,GAAG,CAAC;QACb,KAAK,QAAQ;YACX,OAAO,CAAC,CAAC;QACX,KAAK,OAAO;YACV,OAAO,IAAI,CAAC;IAChB,CAAC;AACH,CAAC;AAED,SAAS,sBAAsB,CAAC,UAA0B,EAAE,KAAiB;IAC3E,IAAI,UAAU,KAAK,OAAO,EAAE,CAAC;QAC3B,OAAO,CAAC,CAAC;IACX,CAAC;IAED,OAAO,KAAK,CAAC,MAAM,CACjB,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU,CACzF,CAAC,MAAM,CAAC;AACX,CAAC"}
@@ -0,0 +1,29 @@
1
+ import type { FileGraph, HistoryIndex, KnowledgeCacheKey, PatternIndex, SolutionIndex } from "./types.js";
2
+ export declare const KNOWLEDGE_CACHE_SCHEMA_VERSION = 1;
3
+ export declare const KNOWLEDGE_CACHE_DIR = ".critical-gate/cache";
4
+ export interface KnowledgeCache {
5
+ get: (key: KnowledgeCacheKey) => KnowledgeCacheEntry | undefined;
6
+ set: (key: KnowledgeCacheKey, value: KnowledgeCacheEntry) => void;
7
+ }
8
+ export interface KnowledgeCacheEntry {
9
+ graph?: FileGraph;
10
+ history?: HistoryIndex;
11
+ patterns?: PatternIndex;
12
+ solutions?: SolutionIndex;
13
+ }
14
+ export interface KnowledgeCacheKeyOptions {
15
+ root: string;
16
+ baseRef?: string;
17
+ headRef?: string;
18
+ runner: {
19
+ execFile: (file: string, args: string[], options?: {
20
+ cwd?: string;
21
+ }) => string;
22
+ readFile?: (path: string) => string;
23
+ };
24
+ }
25
+ export declare function createMemoryKnowledgeCache(): KnowledgeCache;
26
+ export declare function createFileKnowledgeCache(root: string): KnowledgeCache;
27
+ export declare function buildKnowledgeCacheKey(options: KnowledgeCacheKeyOptions): KnowledgeCacheKey;
28
+ export declare function serializeKnowledgeCacheKey(key: KnowledgeCacheKey): string;
29
+ //# sourceMappingURL=cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/knowledge/cache.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,SAAS,EACT,YAAY,EACZ,iBAAiB,EACjB,YAAY,EACZ,aAAa,EACd,MAAM,YAAY,CAAC;AAEpB,eAAO,MAAM,8BAA8B,IAAI,CAAC;AAChD,eAAO,MAAM,mBAAmB,yBAAyB,CAAC;AAE1D,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,CAAC,GAAG,EAAE,iBAAiB,KAAK,mBAAmB,GAAG,SAAS,CAAC;IACjE,GAAG,EAAE,CAAC,GAAG,EAAE,iBAAiB,EAAE,KAAK,EAAE,mBAAmB,KAAK,IAAI,CAAC;CACnE;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,SAAS,CAAC,EAAE,aAAa,CAAC;CAC3B;AAED,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE;QACN,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE;YAAE,GAAG,CAAC,EAAE,MAAM,CAAA;SAAE,KAAK,MAAM,CAAC;QAC/E,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;KACrC,CAAC;CACH;AAED,wBAAgB,0BAA0B,IAAI,cAAc,CAS3D;AAED,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,CAsBrE;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,wBAAwB,GAAG,iBAAiB,CAsB3F;AAED,wBAAgB,0BAA0B,CAAC,GAAG,EAAE,iBAAiB,GAAG,MAAM,CAUzE"}
@@ -0,0 +1,85 @@
1
+ import { createHash } from "node:crypto";
2
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
3
+ import { join } from "node:path";
4
+ export const KNOWLEDGE_CACHE_SCHEMA_VERSION = 1;
5
+ export const KNOWLEDGE_CACHE_DIR = ".critical-gate/cache";
6
+ export function createMemoryKnowledgeCache() {
7
+ const entries = new Map();
8
+ return {
9
+ get: (key) => entries.get(serializeKnowledgeCacheKey(key)),
10
+ set: (key, value) => {
11
+ entries.set(serializeKnowledgeCacheKey(key), value);
12
+ }
13
+ };
14
+ }
15
+ export function createFileKnowledgeCache(root) {
16
+ const cacheRoot = join(root, KNOWLEDGE_CACHE_DIR);
17
+ return {
18
+ get: (key) => {
19
+ const path = getCachePath(cacheRoot, key);
20
+ if (!existsSync(path)) {
21
+ return undefined;
22
+ }
23
+ try {
24
+ return JSON.parse(readFileSync(path, "utf8"));
25
+ }
26
+ catch {
27
+ return undefined;
28
+ }
29
+ },
30
+ set: (key, value) => {
31
+ mkdirSync(cacheRoot, { recursive: true });
32
+ writeFileSync(getCachePath(cacheRoot, key), JSON.stringify(value), "utf8");
33
+ }
34
+ };
35
+ }
36
+ export function buildKnowledgeCacheKey(options) {
37
+ return {
38
+ schemaVersion: KNOWLEDGE_CACHE_SCHEMA_VERSION,
39
+ root: options.root,
40
+ baseRef: options.baseRef,
41
+ headRef: options.headRef,
42
+ fingerprints: {
43
+ packageJson: hashOptionalFile(options, "package.json"),
44
+ packageLock: hashOptionalFile(options, "package-lock.json"),
45
+ pnpmLock: hashOptionalFile(options, "pnpm-lock.yaml"),
46
+ yarnLock: hashOptionalFile(options, "yarn.lock"),
47
+ bunLock: hashOptionalFile(options, "bun.lockb"),
48
+ tsconfig: hashOptionalFile(options, "tsconfig.json"),
49
+ trackedSources: hashString(getOptionalGitOutput(options.runner, ["ls-files", "-s", "--", "src", "packages", "lib", "tests"], options.root) ?? "")
50
+ }
51
+ };
52
+ }
53
+ export function serializeKnowledgeCacheKey(key) {
54
+ return JSON.stringify({
55
+ schemaVersion: key.schemaVersion,
56
+ root: key.root,
57
+ baseRef: key.baseRef,
58
+ headRef: key.headRef,
59
+ fingerprints: Object.fromEntries(Object.entries(key.fingerprints).sort(([left], [right]) => left.localeCompare(right)))
60
+ });
61
+ }
62
+ function getCachePath(cacheRoot, key) {
63
+ return join(cacheRoot, `${hashString(serializeKnowledgeCacheKey(key))}.json`);
64
+ }
65
+ function hashOptionalFile(options, path) {
66
+ try {
67
+ return hashString(options.runner.readFile?.(join(options.root, path)) ?? "");
68
+ }
69
+ catch {
70
+ return "";
71
+ }
72
+ }
73
+ function hashString(value) {
74
+ return createHash("sha256").update(value).digest("hex");
75
+ }
76
+ function getOptionalGitOutput(runner, args, cwd) {
77
+ try {
78
+ const output = runner.execFile("git", args, { cwd }).trim();
79
+ return output.length > 0 ? output : undefined;
80
+ }
81
+ catch {
82
+ return undefined;
83
+ }
84
+ }
85
+ //# sourceMappingURL=cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/knowledge/cache.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { FileGraph, FileGraphEdge, FileGraphNode, HistoryIndex } from "./types.js";
2
+ export interface FileGraphRunner {
3
+ execFile: (file: string, args: string[], options?: {
4
+ cwd?: string;
5
+ }) => string;
6
+ readFile?: (path: string) => string;
7
+ }
8
+ export interface BuildFileGraphOptions {
9
+ root: string;
10
+ runner: FileGraphRunner;
11
+ history?: HistoryIndex;
12
+ }
13
+ export declare function createEmptyFileGraph(): FileGraph;
14
+ export declare function createFileGraph(nodes?: FileGraphNode[], edges?: FileGraphEdge[]): FileGraph;
15
+ export declare function buildFileGraph(options: BuildFileGraphOptions): FileGraph;
16
+ //# sourceMappingURL=graph.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph.d.ts","sourceRoot":"","sources":["../../src/knowledge/graph.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAExF,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE;QAAE,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,MAAM,CAAC;IAC/E,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;CACrC;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,eAAe,CAAC;IACxB,OAAO,CAAC,EAAE,YAAY,CAAC;CACxB;AAMD,wBAAgB,oBAAoB,IAAI,SAAS,CAKhD;AAED,wBAAgB,eAAe,CAC7B,KAAK,GAAE,aAAa,EAAO,EAC3B,KAAK,GAAE,aAAa,EAAO,GAC1B,SAAS,CAUX;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,qBAAqB,GAAG,SAAS,CAkBxE"}
@@ -0,0 +1,139 @@
1
+ import { dirname, normalize } from "node:path";
2
+ import { classifyPath } from "../diff/index.js";
3
+ const sourcePathPattern = /\.(?:[cm]?[jt]sx?)$/;
4
+ const importPattern = /(?:import\s+(?:[^'"]+\s+from\s+)?|export\s+[^'"]+\s+from\s+|require\()\s*["']([^"']+)["']/g;
5
+ export function createEmptyFileGraph() {
6
+ return {
7
+ nodes: [],
8
+ edges: []
9
+ };
10
+ }
11
+ export function createFileGraph(nodes = [], edges = []) {
12
+ return {
13
+ nodes: [...nodes].sort((left, right) => left.path.localeCompare(right.path)),
14
+ edges: [...edges].sort((left, right) => left.from.localeCompare(right.from) ||
15
+ left.to.localeCompare(right.to) ||
16
+ left.kind.localeCompare(right.kind))
17
+ };
18
+ }
19
+ export function buildFileGraph(options) {
20
+ const files = getTrackedFiles(options);
21
+ const sourceFiles = files.filter((path) => sourcePathPattern.test(path));
22
+ const nodes = files.map((path) => ({
23
+ path,
24
+ role: classifyPath(path)
25
+ }));
26
+ const edgeMap = new Map();
27
+ for (const file of sourceFiles) {
28
+ addImportEdges(file, sourceFiles, options, edgeMap);
29
+ }
30
+ addPathEdges(files, edgeMap);
31
+ addTestEdges(files, edgeMap);
32
+ addHistoryEdges(options.history, edgeMap);
33
+ return createFileGraph(nodes, [...edgeMap.values()]);
34
+ }
35
+ function addImportEdges(file, sourceFiles, options, edgeMap) {
36
+ const sourceText = options.runner.readFile?.(toAbsolutePath(options.root, file)) ?? "";
37
+ for (const match of sourceText.matchAll(importPattern)) {
38
+ const specifier = match[1];
39
+ if (specifier === undefined || !specifier.startsWith(".")) {
40
+ continue;
41
+ }
42
+ const target = resolveImport(file, specifier, sourceFiles);
43
+ if (target !== undefined) {
44
+ setEdge(edgeMap, file, target, "import", 1, `Relative import ${specifier}.`);
45
+ }
46
+ }
47
+ }
48
+ function addPathEdges(files, edgeMap) {
49
+ const groups = new Map();
50
+ for (const file of files) {
51
+ const key = file.split("/").slice(0, 2).join("/");
52
+ if (key.length === 0) {
53
+ continue;
54
+ }
55
+ groups.set(key, [...(groups.get(key) ?? []), file]);
56
+ }
57
+ for (const groupFiles of groups.values()) {
58
+ for (const from of groupFiles) {
59
+ for (const to of groupFiles) {
60
+ if (from !== to) {
61
+ setEdge(edgeMap, from, to, "path", 0.2, "Shared path prefix.");
62
+ }
63
+ }
64
+ }
65
+ }
66
+ }
67
+ function addTestEdges(files, edgeMap) {
68
+ const fileSet = new Set(files);
69
+ for (const file of files) {
70
+ const sourceCandidate = getSourceCandidateForTest(file);
71
+ if (sourceCandidate !== undefined && fileSet.has(sourceCandidate)) {
72
+ setEdge(edgeMap, file, sourceCandidate, "test", 0.9, "Test-source path relationship.");
73
+ setEdge(edgeMap, sourceCandidate, file, "test", 0.9, "Source-test path relationship.");
74
+ }
75
+ }
76
+ }
77
+ function addHistoryEdges(history, edgeMap) {
78
+ for (const coChange of history?.coChanges ?? []) {
79
+ for (const related of coChange.relatedPaths) {
80
+ setEdge(edgeMap, coChange.path, related.path, "history", 0.6, `Co-changed ${related.count} times.`);
81
+ }
82
+ }
83
+ }
84
+ function getTrackedFiles(options) {
85
+ try {
86
+ return options.runner
87
+ .execFile("git", ["ls-files"], { cwd: options.root })
88
+ .split(/\r?\n/)
89
+ .map((path) => path.trim().replaceAll("\\", "/"))
90
+ .filter((path) => path.length > 0)
91
+ .sort();
92
+ }
93
+ catch {
94
+ return [];
95
+ }
96
+ }
97
+ function resolveImport(file, specifier, sourceFiles) {
98
+ const basePath = normalize(`${dirname(file)}/${specifier}`).replaceAll("\\", "/");
99
+ const candidates = [
100
+ basePath,
101
+ `${basePath}.ts`,
102
+ `${basePath}.tsx`,
103
+ `${basePath}.js`,
104
+ `${basePath}.jsx`,
105
+ `${basePath}/index.ts`,
106
+ `${basePath}/index.tsx`,
107
+ `${basePath}/index.js`,
108
+ `${basePath}/index.jsx`
109
+ ];
110
+ const sourceFileSet = new Set(sourceFiles);
111
+ return candidates.find((candidate) => sourceFileSet.has(candidate));
112
+ }
113
+ function getSourceCandidateForTest(file) {
114
+ const normalizedPath = file.replaceAll("\\", "/");
115
+ if (!/(^|\/)(tests?|__tests__)\/|[._-](test|spec)\.[cm]?[jt]sx?$/.test(normalizedPath)) {
116
+ return undefined;
117
+ }
118
+ return normalizedPath
119
+ .replace(/^tests?\//, "src/")
120
+ .replace(/(^|\/)__tests__\//, "$1")
121
+ .replace(/[._-](test|spec)(\.[cm]?[jt]sx?)$/, "$2");
122
+ }
123
+ function toAbsolutePath(root, path) {
124
+ return normalize(`${root}/${path}`);
125
+ }
126
+ function setEdge(edgeMap, from, to, kind, weight, evidence) {
127
+ const key = `${from}->${to}:${kind}`;
128
+ if (edgeMap.has(key)) {
129
+ return;
130
+ }
131
+ edgeMap.set(key, {
132
+ from,
133
+ to,
134
+ kind,
135
+ weight,
136
+ evidence
137
+ });
138
+ }
139
+ //# sourceMappingURL=graph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph.js","sourceRoot":"","sources":["../../src/knowledge/graph.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAE/C,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAchD,MAAM,iBAAiB,GAAG,qBAAqB,CAAC;AAChD,MAAM,aAAa,GACjB,4FAA4F,CAAC;AAE/F,MAAM,UAAU,oBAAoB;IAClC,OAAO;QACL,KAAK,EAAE,EAAE;QACT,KAAK,EAAE,EAAE;KACV,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,eAAe,CAC7B,QAAyB,EAAE,EAC3B,QAAyB,EAAE;IAE3B,OAAO;QACL,KAAK,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC5E,KAAK,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CACpB,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CACd,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC;YACnC,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;YAC/B,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,CACtC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,OAA8B;IAC3D,MAAM,KAAK,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;IACvC,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACzE,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACjC,IAAI;QACJ,IAAI,EAAE,YAAY,CAAC,IAAI,CAAC;KACzB,CAAC,CAAC,CAAC;IACJ,MAAM,OAAO,GAAG,IAAI,GAAG,EAAyB,CAAC;IAEjD,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;QAC/B,cAAc,CAAC,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IACtD,CAAC;IAED,YAAY,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC7B,YAAY,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC7B,eAAe,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAE1C,OAAO,eAAe,CAAC,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;AACvD,CAAC;AAED,SAAS,cAAc,CACrB,IAAY,EACZ,WAAqB,EACrB,OAA8B,EAC9B,OAAmC;IAEnC,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,cAAc,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;IAEvF,KAAK,MAAM,KAAK,IAAI,UAAU,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;QACvD,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QAE3B,IAAI,SAAS,KAAK,SAAS,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC1D,SAAS;QACX,CAAC;QAED,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;QAE3D,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,OAAO,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,EAAE,mBAAmB,SAAS,GAAG,CAAC,CAAC;QAC/E,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,KAAe,EAAE,OAAmC;IACxE,MAAM,MAAM,GAAG,IAAI,GAAG,EAAoB,CAAC;IAE3C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAElD,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACrB,SAAS;QACX,CAAC;QAED,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;IACtD,CAAC;IAED,KAAK,MAAM,UAAU,IAAI,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;QACzC,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;YAC9B,KAAK,MAAM,EAAE,IAAI,UAAU,EAAE,CAAC;gBAC5B,IAAI,IAAI,KAAK,EAAE,EAAE,CAAC;oBAChB,OAAO,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,qBAAqB,CAAC,CAAC;gBACjE,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,KAAe,EAAE,OAAmC;IACxE,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;IAE/B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,eAAe,GAAG,yBAAyB,CAAC,IAAI,CAAC,CAAC;QAExD,IAAI,eAAe,KAAK,SAAS,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,EAAE,CAAC;YAClE,OAAO,CAAC,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,EAAE,GAAG,EAAE,gCAAgC,CAAC,CAAC;YACvF,OAAO,CAAC,OAAO,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,gCAAgC,CAAC,CAAC;QACzF,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CACtB,OAAiC,EACjC,OAAmC;IAEnC,KAAK,MAAM,QAAQ,IAAI,OAAO,EAAE,SAAS,IAAI,EAAE,EAAE,CAAC;QAChD,KAAK,MAAM,OAAO,IAAI,QAAQ,CAAC,YAAY,EAAE,CAAC;YAC5C,OAAO,CACL,OAAO,EACP,QAAQ,CAAC,IAAI,EACb,OAAO,CAAC,IAAI,EACZ,SAAS,EACT,GAAG,EACH,cAAc,OAAO,CAAC,KAAK,SAAS,CACrC,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,OAA8B;IACrD,IAAI,CAAC;QACH,OAAO,OAAO,CAAC,MAAM;aAClB,QAAQ,CAAC,KAAK,EAAE,CAAC,UAAU,CAAC,EAAE,EAAE,GAAG,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC;aACpD,KAAK,CAAC,OAAO,CAAC;aACd,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;aAChD,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;aACjC,IAAI,EAAE,CAAC;IACZ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,IAAY,EAAE,SAAiB,EAAE,WAAqB;IAC3E,MAAM,QAAQ,GAAG,SAAS,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,SAAS,EAAE,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAClF,MAAM,UAAU,GAAG;QACjB,QAAQ;QACR,GAAG,QAAQ,KAAK;QAChB,GAAG,QAAQ,MAAM;QACjB,GAAG,QAAQ,KAAK;QAChB,GAAG,QAAQ,MAAM;QACjB,GAAG,QAAQ,WAAW;QACtB,GAAG,QAAQ,YAAY;QACvB,GAAG,QAAQ,WAAW;QACtB,GAAG,QAAQ,YAAY;KACxB,CAAC;IACF,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,CAAC;IAE3C,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;AACtE,CAAC;AAED,SAAS,yBAAyB,CAAC,IAAY;IAC7C,MAAM,cAAc,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAElD,IAAI,CAAC,4DAA4D,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC;QACvF,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO,cAAc;SAClB,OAAO,CAAC,WAAW,EAAE,MAAM,CAAC;SAC5B,OAAO,CAAC,mBAAmB,EAAE,IAAI,CAAC;SAClC,OAAO,CAAC,mCAAmC,EAAE,IAAI,CAAC,CAAC;AACxD,CAAC;AAED,SAAS,cAAc,CAAC,IAAY,EAAE,IAAY;IAChD,OAAO,SAAS,CAAC,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC;AACtC,CAAC;AAED,SAAS,OAAO,CACd,OAAmC,EACnC,IAAY,EACZ,EAAU,EACV,IAA2B,EAC3B,MAAc,EACd,QAAgB;IAEhB,MAAM,GAAG,GAAG,GAAG,IAAI,KAAK,EAAE,IAAI,IAAI,EAAE,CAAC;IAErC,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;QACrB,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE;QACf,IAAI;QACJ,EAAE;QACF,IAAI;QACJ,MAAM;QACN,QAAQ;KACT,CAAC,CAAC;AACL,CAAC"}