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.
- package/LICENSE +21 -0
- package/README.md +240 -0
- package/dist/cli.d.ts +20 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +224 -0
- package/dist/cli.js.map +1 -0
- package/dist/config/critical-gate-config.d.ts +21 -0
- package/dist/config/critical-gate-config.d.ts.map +1 -0
- package/dist/config/critical-gate-config.js +81 -0
- package/dist/config/critical-gate-config.js.map +1 -0
- package/dist/config/index.d.ts +2 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +2 -0
- package/dist/config/index.js.map +1 -0
- package/dist/detectors/api-surface-detector.d.ts +3 -0
- package/dist/detectors/api-surface-detector.d.ts.map +1 -0
- package/dist/detectors/api-surface-detector.js +111 -0
- package/dist/detectors/api-surface-detector.js.map +1 -0
- package/dist/detectors/blast-radius-detector.d.ts +3 -0
- package/dist/detectors/blast-radius-detector.d.ts.map +1 -0
- package/dist/detectors/blast-radius-detector.js +90 -0
- package/dist/detectors/blast-radius-detector.js.map +1 -0
- package/dist/detectors/config-change-detector.d.ts +3 -0
- package/dist/detectors/config-change-detector.d.ts.map +1 -0
- package/dist/detectors/config-change-detector.js +68 -0
- package/dist/detectors/config-change-detector.js.map +1 -0
- package/dist/detectors/dependency-detector.d.ts +3 -0
- package/dist/detectors/dependency-detector.d.ts.map +1 -0
- package/dist/detectors/dependency-detector.js +98 -0
- package/dist/detectors/dependency-detector.js.map +1 -0
- package/dist/detectors/existing-solution-detector.d.ts +3 -0
- package/dist/detectors/existing-solution-detector.d.ts.map +1 -0
- package/dist/detectors/existing-solution-detector.js +87 -0
- package/dist/detectors/existing-solution-detector.js.map +1 -0
- package/dist/detectors/expected-companions-detector.d.ts +3 -0
- package/dist/detectors/expected-companions-detector.d.ts.map +1 -0
- package/dist/detectors/expected-companions-detector.js +65 -0
- package/dist/detectors/expected-companions-detector.js.map +1 -0
- package/dist/detectors/index.d.ts +17 -0
- package/dist/detectors/index.d.ts.map +1 -0
- package/dist/detectors/index.js +16 -0
- package/dist/detectors/index.js.map +1 -0
- package/dist/detectors/intent-verification-detector.d.ts +3 -0
- package/dist/detectors/intent-verification-detector.d.ts.map +1 -0
- package/dist/detectors/intent-verification-detector.js +43 -0
- package/dist/detectors/intent-verification-detector.js.map +1 -0
- package/dist/detectors/pattern-violation-detector.d.ts +3 -0
- package/dist/detectors/pattern-violation-detector.d.ts.map +1 -0
- package/dist/detectors/pattern-violation-detector.js +83 -0
- package/dist/detectors/pattern-violation-detector.js.map +1 -0
- package/dist/detectors/repository-intelligence-detector.d.ts +3 -0
- package/dist/detectors/repository-intelligence-detector.d.ts.map +1 -0
- package/dist/detectors/repository-intelligence-detector.js +51 -0
- package/dist/detectors/repository-intelligence-detector.js.map +1 -0
- package/dist/detectors/rewrite-detector.d.ts +3 -0
- package/dist/detectors/rewrite-detector.d.ts.map +1 -0
- package/dist/detectors/rewrite-detector.js +61 -0
- package/dist/detectors/rewrite-detector.js.map +1 -0
- package/dist/detectors/runner.d.ts +9 -0
- package/dist/detectors/runner.d.ts.map +1 -0
- package/dist/detectors/runner.js +96 -0
- package/dist/detectors/runner.js.map +1 -0
- package/dist/detectors/scope-detector.d.ts +3 -0
- package/dist/detectors/scope-detector.d.ts.map +1 -0
- package/dist/detectors/scope-detector.js +138 -0
- package/dist/detectors/scope-detector.js.map +1 -0
- package/dist/detectors/secret-path-detector.d.ts +5 -0
- package/dist/detectors/secret-path-detector.d.ts.map +1 -0
- package/dist/detectors/secret-path-detector.js +150 -0
- package/dist/detectors/secret-path-detector.js.map +1 -0
- package/dist/detectors/test-weakening-detector.d.ts +3 -0
- package/dist/detectors/test-weakening-detector.d.ts.map +1 -0
- package/dist/detectors/test-weakening-detector.js +91 -0
- package/dist/detectors/test-weakening-detector.js.map +1 -0
- package/dist/detectors/types.d.ts +15 -0
- package/dist/detectors/types.d.ts.map +1 -0
- package/dist/detectors/types.js +2 -0
- package/dist/detectors/types.js.map +1 -0
- package/dist/detectors/utility-reinvention-detector.d.ts +3 -0
- package/dist/detectors/utility-reinvention-detector.d.ts.map +1 -0
- package/dist/detectors/utility-reinvention-detector.js +78 -0
- package/dist/detectors/utility-reinvention-detector.js.map +1 -0
- package/dist/diff/git-diff-reader.d.ts +24 -0
- package/dist/diff/git-diff-reader.d.ts.map +1 -0
- package/dist/diff/git-diff-reader.js +81 -0
- package/dist/diff/git-diff-reader.js.map +1 -0
- package/dist/diff/index.d.ts +4 -0
- package/dist/diff/index.d.ts.map +1 -0
- package/dist/diff/index.js +4 -0
- package/dist/diff/index.js.map +1 -0
- package/dist/diff/parse-unified-diff.d.ts +3 -0
- package/dist/diff/parse-unified-diff.d.ts.map +1 -0
- package/dist/diff/parse-unified-diff.js +153 -0
- package/dist/diff/parse-unified-diff.js.map +1 -0
- package/dist/diff/path-classifier.d.ts +5 -0
- package/dist/diff/path-classifier.d.ts.map +1 -0
- package/dist/diff/path-classifier.js +86 -0
- package/dist/diff/path-classifier.js.map +1 -0
- package/dist/editor/diagnostics.d.ts +35 -0
- package/dist/editor/diagnostics.d.ts.map +1 -0
- package/dist/editor/diagnostics.js +55 -0
- package/dist/editor/diagnostics.js.map +1 -0
- package/dist/editor/index.d.ts +3 -0
- package/dist/editor/index.d.ts.map +1 -0
- package/dist/editor/index.js +2 -0
- package/dist/editor/index.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/intent/index.d.ts +5 -0
- package/dist/intent/index.d.ts.map +1 -0
- package/dist/intent/index.js +5 -0
- package/dist/intent/index.js.map +1 -0
- package/dist/intent/intent-core.d.ts +4 -0
- package/dist/intent/intent-core.d.ts.map +1 -0
- package/dist/intent/intent-core.js +58 -0
- package/dist/intent/intent-core.js.map +1 -0
- package/dist/intent/intent-model.d.ts +18 -0
- package/dist/intent/intent-model.d.ts.map +1 -0
- package/dist/intent/intent-model.js +74 -0
- package/dist/intent/intent-model.js.map +1 -0
- package/dist/intent/observed-actions.d.ts +17 -0
- package/dist/intent/observed-actions.d.ts.map +1 -0
- package/dist/intent/observed-actions.js +128 -0
- package/dist/intent/observed-actions.js.map +1 -0
- package/dist/intent/scope-expansion-score.d.ts +13 -0
- package/dist/intent/scope-expansion-score.d.ts.map +1 -0
- package/dist/intent/scope-expansion-score.js +87 -0
- package/dist/intent/scope-expansion-score.js.map +1 -0
- package/dist/intent/task-analysis.d.ts +18 -0
- package/dist/intent/task-analysis.d.ts.map +1 -0
- package/dist/intent/task-analysis.js +46 -0
- package/dist/intent/task-analysis.js.map +1 -0
- package/dist/knowledge/cache.d.ts +29 -0
- package/dist/knowledge/cache.d.ts.map +1 -0
- package/dist/knowledge/cache.js +85 -0
- package/dist/knowledge/cache.js.map +1 -0
- package/dist/knowledge/graph.d.ts +16 -0
- package/dist/knowledge/graph.d.ts.map +1 -0
- package/dist/knowledge/graph.js +139 -0
- package/dist/knowledge/graph.js.map +1 -0
- package/dist/knowledge/history-index.d.ts +20 -0
- package/dist/knowledge/history-index.d.ts.map +1 -0
- package/dist/knowledge/history-index.js +117 -0
- package/dist/knowledge/history-index.js.map +1 -0
- package/dist/knowledge/index.d.ts +9 -0
- package/dist/knowledge/index.d.ts.map +1 -0
- package/dist/knowledge/index.js +8 -0
- package/dist/knowledge/index.js.map +1 -0
- package/dist/knowledge/pattern-index.d.ts +14 -0
- package/dist/knowledge/pattern-index.d.ts.map +1 -0
- package/dist/knowledge/pattern-index.js +94 -0
- package/dist/knowledge/pattern-index.js.map +1 -0
- package/dist/knowledge/provider.d.ts +18 -0
- package/dist/knowledge/provider.d.ts.map +1 -0
- package/dist/knowledge/provider.js +83 -0
- package/dist/knowledge/provider.js.map +1 -0
- package/dist/knowledge/solution-index.d.ts +17 -0
- package/dist/knowledge/solution-index.d.ts.map +1 -0
- package/dist/knowledge/solution-index.js +170 -0
- package/dist/knowledge/solution-index.js.map +1 -0
- package/dist/knowledge/symbol-index.d.ts +4 -0
- package/dist/knowledge/symbol-index.d.ts.map +1 -0
- package/dist/knowledge/symbol-index.js +11 -0
- package/dist/knowledge/symbol-index.js.map +1 -0
- package/dist/knowledge/types.d.ts +100 -0
- package/dist/knowledge/types.d.ts.map +1 -0
- package/dist/knowledge/types.js +2 -0
- package/dist/knowledge/types.js.map +1 -0
- package/dist/llm/artifact.d.ts +6 -0
- package/dist/llm/artifact.d.ts.map +1 -0
- package/dist/llm/artifact.js +86 -0
- package/dist/llm/artifact.js.map +1 -0
- package/dist/llm/cache.d.ts +10 -0
- package/dist/llm/cache.d.ts.map +1 -0
- package/dist/llm/cache.js +24 -0
- package/dist/llm/cache.js.map +1 -0
- package/dist/llm/index.d.ts +8 -0
- package/dist/llm/index.d.ts.map +1 -0
- package/dist/llm/index.js +7 -0
- package/dist/llm/index.js.map +1 -0
- package/dist/llm/prompt.d.ts +7 -0
- package/dist/llm/prompt.d.ts.map +1 -0
- package/dist/llm/prompt.js +23 -0
- package/dist/llm/prompt.js.map +1 -0
- package/dist/llm/provider.d.ts +4 -0
- package/dist/llm/provider.d.ts.map +1 -0
- package/dist/llm/provider.js +43 -0
- package/dist/llm/provider.js.map +1 -0
- package/dist/llm/redaction.d.ts +3 -0
- package/dist/llm/redaction.d.ts.map +1 -0
- package/dist/llm/redaction.js +22 -0
- package/dist/llm/redaction.js.map +1 -0
- package/dist/llm/types.d.ts +89 -0
- package/dist/llm/types.d.ts.map +1 -0
- package/dist/llm/types.js +2 -0
- package/dist/llm/types.js.map +1 -0
- package/dist/reporters/index.d.ts +8 -0
- package/dist/reporters/index.d.ts.map +1 -0
- package/dist/reporters/index.js +21 -0
- package/dist/reporters/index.js.map +1 -0
- package/dist/reporters/json-reporter.d.ts +3 -0
- package/dist/reporters/json-reporter.d.ts.map +1 -0
- package/dist/reporters/json-reporter.js +4 -0
- package/dist/reporters/json-reporter.js.map +1 -0
- package/dist/reporters/markdown-reporter.d.ts +3 -0
- package/dist/reporters/markdown-reporter.d.ts.map +1 -0
- package/dist/reporters/markdown-reporter.js +76 -0
- package/dist/reporters/markdown-reporter.js.map +1 -0
- package/dist/reporters/repair-reporter.d.ts +3 -0
- package/dist/reporters/repair-reporter.d.ts.map +1 -0
- package/dist/reporters/repair-reporter.js +56 -0
- package/dist/reporters/repair-reporter.js.map +1 -0
- package/dist/reporters/sarif-reporter.d.ts +3 -0
- package/dist/reporters/sarif-reporter.d.ts.map +1 -0
- package/dist/reporters/sarif-reporter.js +161 -0
- package/dist/reporters/sarif-reporter.js.map +1 -0
- package/dist/repository/index.d.ts +3 -0
- package/dist/repository/index.d.ts.map +1 -0
- package/dist/repository/index.js +3 -0
- package/dist/repository/index.js.map +1 -0
- package/dist/repository/profile.d.ts +7 -0
- package/dist/repository/profile.d.ts.map +1 -0
- package/dist/repository/profile.js +6 -0
- package/dist/repository/profile.js.map +1 -0
- package/dist/repository/utility-index.d.ts +7 -0
- package/dist/repository/utility-index.d.ts.map +1 -0
- package/dist/repository/utility-index.js +6 -0
- package/dist/repository/utility-index.js.map +1 -0
- package/dist/schema/gate-result.schema.d.ts +514 -0
- package/dist/schema/gate-result.schema.d.ts.map +1 -0
- package/dist/schema/gate-result.schema.js +326 -0
- package/dist/schema/gate-result.schema.js.map +1 -0
- package/dist/schema/index.d.ts +4 -0
- package/dist/schema/index.d.ts.map +1 -0
- package/dist/schema/index.js +3 -0
- package/dist/schema/index.js.map +1 -0
- package/dist/schema/types.d.ts +136 -0
- package/dist/schema/types.d.ts.map +1 -0
- package/dist/schema/types.js +2 -0
- package/dist/schema/types.js.map +1 -0
- 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":"AAEA,OAAO,EAAE,gBAAgB,EAAoB,MAAM,mBAAmB,CAAC;AAevE,MAAM,mBAAmB,GAAG,6BAA6B,CAAC;AAC1D,MAAM,sBAAsB,GAC1B,0IAA0I,CAAC;AAC7I,MAAM,aAAa,GAAG,oEAAoE,CAAC;AAC3F,MAAM,oBAAoB,GAAG,kDAAkD,CAAC;AAChF,MAAM,wBAAwB,GAC5B,oHAAoH,CAAC;AACvH,MAAM,kBAAkB,GAAG,0BAA0B,CAAC;AACtD,MAAM,oBAAoB,GAAG,yBAAyB,CAAC;AAEvD,MAAM,UAAU,2BAA2B,CAAC,KAAiB;IAC3D,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAEpD,OAAO;QACL,OAAO,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;QACxE,QAAQ;KACT,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,2BAA2B,CACzC,IAAgB,EAChB,KAAiB;IAEjB,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;IACtC,MAAM,QAAQ,GAAG,2BAA2B,CAAC,KAAK,CAAC,CAAC;IACpD,MAAM,iBAAiB,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,CAC/C,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,oBAAoB,CAAC,QAAQ,CAAC,WAAW,CAAC,CACpE,CAAC;IACF,MAAM,cAAc,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,EAAE,CAC7D,MAAM,CAAC,oBAAoB,CAAC,QAAQ,CAAC,WAAW,CAAC,CAClD,CAAC;IAEF,OAAO;QACL,gBAAgB,EAAE,MAAM,CAAC,oBAAoB;QAC7C,eAAe,EAAE,QAAQ,CAAC,OAAO;QACjC,iBAAiB;QACjB,QAAQ,EAAE,WAAW,CAAC,QAAQ,CAAC,OAAO,EAAE,iBAAiB,EAAE,cAAc,CAAC;QAC1E,gBAAgB,EAAE;YAChB,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,WAAW,WAAW,EAAE,CAAC;YAChE,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,cAAc,WAAW,EAAE,CAAC;SACvE;KACF,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAClB,eAA8B,EAC9B,iBAAgC,EAChC,cAA6B;IAE7B,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChE,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,IAAI,iBAAiB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACnC,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,mBAAmB,CAAC,IAAc;IACzC,MAAM,QAAQ,GAAkC,EAAE,CAAC;IAEnD,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC3B,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,IAAI,EAAE,sBAAsB,CAAC,CAAC,CAAC;IACpE,CAAC;IAED,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QACzB,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,EAAE,oBAAoB,CAAC,CAAC,CAAC;IACjE,CAAC;IAED,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QACzB,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,EAAE,6BAA6B,CAAC,CAAC,CAAC;IACzE,CAAC;IAED,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QACzD,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,YAAY,EAAE,IAAI,EAAE,uCAAuC,CAAC,CAAC,CAAC;IACzF,CAAC;IAED,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC3B,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,IAAI,EAAE,6BAA6B,CAAC,CAAC,CAAC;IAC3E,CAAC;IAED,IAAI,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACxC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,0BAA0B,CAAC,CAAC,CAAC;IACpE,CAAC;IAED,IAAI,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3C,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,EAAE,0CAA0C,CAAC,CAAC,CAAC;IACvF,CAAC;IAED,IAAI,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,yBAAyB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/E,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,6BAA6B,CAAC,CAAC,CAAC;IACvE,CAAC;IAED,IAAI,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACzC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,YAAY,EAAE,IAAI,EAAE,oCAAoC,CAAC,CAAC,CAAC;IACtF,CAAC;IAED,QAAQ,CAAC,IAAI,CAAC,GAAG,2BAA2B,CAAC,IAAI,CAAC,CAAC,CAAC;IAEpD,OAAO,cAAc,CAAC,QAAQ,CAAC,CAAC;AAClC,CAAC;AAED,SAAS,2BAA2B,CAAC,IAAc;IACjD,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACjE,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CACjC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;QAC1B,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAClD,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,MAAM,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;QAErC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,OAAO;YACL;gBACE,WAAW,EAAE,aAAsB;gBACnC,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,UAAU,EAAE,IAAI,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa;gBACzE,MAAM;gBACN,MAAM,EAAE,wBAAwB;aACjC;SACF,CAAC;IACJ,CAAC,CAAC,CACH,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,IAAc;IACrC,MAAM,cAAc,GAAG,wBAAwB,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAEnE,IAAI,cAAc,KAAK,IAAI,EAAE,CAAC;QAC5B,OAAO,cAAc,CAAC,CAAC,CAAC,CAAC;IAC3B,CAAC;IAED,MAAM,WAAW,GAAG,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAE1D,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;QACzB,OAAO,WAAW,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;IAC/C,CAAC;IAED,IAAI,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5C,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,UAAU,CACjB,WAAwB,EACxB,IAAc,EACd,MAAc;IAEd,OAAO;QACL,WAAW;QACX,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,MAAM;KACP,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,QAAuC;IAC7D,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAE/B,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;QAC/B,MAAM,GAAG,GAAG,GAAG,KAAK,CAAC,WAAW,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,UAAU,IAAI,EAAE,IAAI,KAAK,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC;QAEjG,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAClB,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACd,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -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":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAUjC,MAAM,CAAC,MAAM,8BAA8B,GAAG,CAAC,CAAC;AAChD,MAAM,CAAC,MAAM,mBAAmB,GAAG,sBAAsB,CAAC;AAwB1D,MAAM,UAAU,0BAA0B;IACxC,MAAM,OAAO,GAAG,IAAI,GAAG,EAA+B,CAAC;IAEvD,OAAO;QACL,GAAG,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,GAAG,CAAC,CAAC;QAC1D,GAAG,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;YAClB,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;QACtD,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,IAAY;IACnD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,EAAE,mBAAmB,CAAC,CAAC;IAElD,OAAO;QACL,GAAG,EAAE,CAAC,GAAG,EAAE,EAAE;YACX,MAAM,IAAI,GAAG,YAAY,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;YAE1C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;gBACtB,OAAO,SAAS,CAAC;YACnB,CAAC;YAED,IAAI,CAAC;gBACH,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAwB,CAAC;YACvE,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,SAAS,CAAC;YACnB,CAAC;QACH,CAAC;QACD,GAAG,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;YAClB,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC1C,aAAa,CAAC,YAAY,CAAC,SAAS,EAAE,GAAG,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,CAAC;QAC7E,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,OAAiC;IACtE,OAAO;QACL,aAAa,EAAE,8BAA8B;QAC7C,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,YAAY,EAAE;YACZ,WAAW,EAAE,gBAAgB,CAAC,OAAO,EAAE,cAAc,CAAC;YACtD,WAAW,EAAE,gBAAgB,CAAC,OAAO,EAAE,mBAAmB,CAAC;YAC3D,QAAQ,EAAE,gBAAgB,CAAC,OAAO,EAAE,gBAAgB,CAAC;YACrD,QAAQ,EAAE,gBAAgB,CAAC,OAAO,EAAE,WAAW,CAAC;YAChD,OAAO,EAAE,gBAAgB,CAAC,OAAO,EAAE,WAAW,CAAC;YAC/C,QAAQ,EAAE,gBAAgB,CAAC,OAAO,EAAE,eAAe,CAAC;YACpD,cAAc,EAAE,UAAU,CACxB,oBAAoB,CAClB,OAAO,CAAC,MAAM,EACd,CAAC,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO,CAAC,EAC3D,OAAO,CAAC,IAAI,CACb,IAAI,EAAE,CACR;SACF;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,GAAsB;IAC/D,OAAO,IAAI,CAAC,SAAS,CAAC;QACpB,aAAa,EAAE,GAAG,CAAC,aAAa;QAChC,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,YAAY,EAAE,MAAM,CAAC,WAAW,CAC9B,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CACtF;KACF,CAAC,CAAC;AACL,CAAC;AAED,SAAS,YAAY,CAAC,SAAiB,EAAE,GAAsB;IAC7D,OAAO,IAAI,CAAC,SAAS,EAAE,GAAG,UAAU,CAAC,0BAA0B,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC;AAChF,CAAC;AAED,SAAS,gBAAgB,CAAC,OAAiC,EAAE,IAAY;IACvE,IAAI,CAAC;QACH,OAAO,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAC/E,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CAAC,KAAa;IAC/B,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC1D,CAAC;AAED,SAAS,oBAAoB,CAC3B,MAA0C,EAC1C,IAAc,EACd,GAAW;IAEX,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAC5D,OAAO,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;IAChD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC"}
|
|
@@ -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":"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"}
|