@mohantn/gate-keeper 2.1.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/.github/instructions/dotnet-api-integration.instructions.md +416 -0
- package/.github/instructions/dotnet-development.instructions.md +353 -0
- package/.github/instructions/dotnet-testing.instructions.md +406 -0
- package/.github/instructions/gate-keeper.instructions.md +91 -0
- package/.github/instructions/react-development.instructions.md +315 -0
- package/.github/instructions/react-testing-optimization.instructions.md +373 -0
- package/.github/instructions/uiux.instructions.md +261 -0
- package/LICENSE +21 -0
- package/README.md +181 -0
- package/dist/analyzer/coverage-analyzer.d.ts +126 -0
- package/dist/analyzer/coverage-analyzer.d.ts.map +1 -0
- package/dist/analyzer/coverage-analyzer.js +633 -0
- package/dist/analyzer/coverage-analyzer.js.map +1 -0
- package/dist/analyzer/csharp-analyzer.d.ts +28 -0
- package/dist/analyzer/csharp-analyzer.d.ts.map +1 -0
- package/dist/analyzer/csharp-analyzer.js +437 -0
- package/dist/analyzer/csharp-analyzer.js.map +1 -0
- package/dist/analyzer/pattern-detector.d.ts +5 -0
- package/dist/analyzer/pattern-detector.d.ts.map +1 -0
- package/dist/analyzer/pattern-detector.js +74 -0
- package/dist/analyzer/pattern-detector.js.map +1 -0
- package/dist/analyzer/refactoring-advisor.d.ts +7 -0
- package/dist/analyzer/refactoring-advisor.d.ts.map +1 -0
- package/dist/analyzer/refactoring-advisor.js +280 -0
- package/dist/analyzer/refactoring-advisor.js.map +1 -0
- package/dist/analyzer/sonar-eslint-runner.d.ts +3 -0
- package/dist/analyzer/sonar-eslint-runner.d.ts.map +1 -0
- package/dist/analyzer/sonar-eslint-runner.js +136 -0
- package/dist/analyzer/sonar-eslint-runner.js.map +1 -0
- package/dist/analyzer/sonar-rule-map.d.ts +19 -0
- package/dist/analyzer/sonar-rule-map.d.ts.map +1 -0
- package/dist/analyzer/sonar-rule-map.js +67 -0
- package/dist/analyzer/sonar-rule-map.js.map +1 -0
- package/dist/analyzer/string-analyzer.d.ts +27 -0
- package/dist/analyzer/string-analyzer.d.ts.map +1 -0
- package/dist/analyzer/string-analyzer.js +274 -0
- package/dist/analyzer/string-analyzer.js.map +1 -0
- package/dist/analyzer/typescript-analyzer.d.ts +27 -0
- package/dist/analyzer/typescript-analyzer.d.ts.map +1 -0
- package/dist/analyzer/typescript-analyzer.js +437 -0
- package/dist/analyzer/typescript-analyzer.js.map +1 -0
- package/dist/analyzer/universal-analyzer.d.ts +10 -0
- package/dist/analyzer/universal-analyzer.d.ts.map +1 -0
- package/dist/analyzer/universal-analyzer.js +155 -0
- package/dist/analyzer/universal-analyzer.js.map +1 -0
- package/dist/cache/quality-cache.d.ts +119 -0
- package/dist/cache/quality-cache.d.ts.map +1 -0
- package/dist/cache/quality-cache.js +130 -0
- package/dist/cache/quality-cache.js.map +1 -0
- package/dist/cache/sqlite-cache.d.ts +43 -0
- package/dist/cache/sqlite-cache.d.ts.map +1 -0
- package/dist/cache/sqlite-cache.js +346 -0
- package/dist/cache/sqlite-cache.js.map +1 -0
- package/dist/cli/query-repl.d.ts +37 -0
- package/dist/cli/query-repl.d.ts.map +1 -0
- package/dist/cli/query-repl.js +298 -0
- package/dist/cli/query-repl.js.map +1 -0
- package/dist/cli/repl-algorithms.d.ts +49 -0
- package/dist/cli/repl-algorithms.d.ts.map +1 -0
- package/dist/cli/repl-algorithms.js +147 -0
- package/dist/cli/repl-algorithms.js.map +1 -0
- package/dist/cli/setup-core.d.ts +38 -0
- package/dist/cli/setup-core.d.ts.map +1 -0
- package/dist/cli/setup-core.js +427 -0
- package/dist/cli/setup-core.js.map +1 -0
- package/dist/cli/setup.d.ts +25 -0
- package/dist/cli/setup.d.ts.map +1 -0
- package/dist/cli/setup.js +159 -0
- package/dist/cli/setup.js.map +1 -0
- package/dist/cli-entry.d.ts +19 -0
- package/dist/cli-entry.d.ts.map +1 -0
- package/dist/cli-entry.js +178 -0
- package/dist/cli-entry.js.map +1 -0
- package/dist/daemon/watch-mode.d.ts +41 -0
- package/dist/daemon/watch-mode.d.ts.map +1 -0
- package/dist/daemon/watch-mode.js +163 -0
- package/dist/daemon/watch-mode.js.map +1 -0
- package/dist/daemon.d.ts +24 -0
- package/dist/daemon.d.ts.map +1 -0
- package/dist/daemon.js +357 -0
- package/dist/daemon.js.map +1 -0
- package/dist/github/app.d.ts +34 -0
- package/dist/github/app.d.ts.map +1 -0
- package/dist/github/app.js +261 -0
- package/dist/github/app.js.map +1 -0
- package/dist/github/commenter.d.ts +67 -0
- package/dist/github/commenter.d.ts.map +1 -0
- package/dist/github/commenter.js +155 -0
- package/dist/github/commenter.js.map +1 -0
- package/dist/graph/dependency-graph.d.ts +28 -0
- package/dist/graph/dependency-graph.d.ts.map +1 -0
- package/dist/graph/dependency-graph.js +198 -0
- package/dist/graph/dependency-graph.js.map +1 -0
- package/dist/graph/global-graph.d.ts +65 -0
- package/dist/graph/global-graph.d.ts.map +1 -0
- package/dist/graph/global-graph.js +153 -0
- package/dist/graph/global-graph.js.map +1 -0
- package/dist/graph/graph-algorithms.d.ts +90 -0
- package/dist/graph/graph-algorithms.d.ts.map +1 -0
- package/dist/graph/graph-algorithms.js +180 -0
- package/dist/graph/graph-algorithms.js.map +1 -0
- package/dist/graph/graph-export.d.ts +68 -0
- package/dist/graph/graph-export.d.ts.map +1 -0
- package/dist/graph/graph-export.js +264 -0
- package/dist/graph/graph-export.js.map +1 -0
- package/dist/graph/graph-report.d.ts +34 -0
- package/dist/graph/graph-report.d.ts.map +1 -0
- package/dist/graph/graph-report.js +136 -0
- package/dist/graph/graph-report.js.map +1 -0
- package/dist/graph/graph-summary.d.ts +68 -0
- package/dist/graph/graph-summary.d.ts.map +1 -0
- package/dist/graph/graph-summary.js +213 -0
- package/dist/graph/graph-summary.js.map +1 -0
- package/dist/graph/graphify-ignore.d.ts +32 -0
- package/dist/graph/graphify-ignore.d.ts.map +1 -0
- package/dist/graph/graphify-ignore.js +124 -0
- package/dist/graph/graphify-ignore.js.map +1 -0
- package/dist/graph/question-suggester.d.ts +30 -0
- package/dist/graph/question-suggester.d.ts.map +1 -0
- package/dist/graph/question-suggester.js +113 -0
- package/dist/graph/question-suggester.js.map +1 -0
- package/dist/graph/relationship-extractor.d.ts +40 -0
- package/dist/graph/relationship-extractor.d.ts.map +1 -0
- package/dist/graph/relationship-extractor.js +254 -0
- package/dist/graph/relationship-extractor.js.map +1 -0
- package/dist/graph/relationship-types.d.ts +24 -0
- package/dist/graph/relationship-types.d.ts.map +1 -0
- package/dist/graph/relationship-types.js +21 -0
- package/dist/graph/relationship-types.js.map +1 -0
- package/dist/graph/surprising-connections.d.ts +39 -0
- package/dist/graph/surprising-connections.d.ts.map +1 -0
- package/dist/graph/surprising-connections.js +127 -0
- package/dist/graph/surprising-connections.js.map +1 -0
- package/dist/hook-pre-tool-use.d.ts +14 -0
- package/dist/hook-pre-tool-use.d.ts.map +1 -0
- package/dist/hook-pre-tool-use.js +167 -0
- package/dist/hook-pre-tool-use.js.map +1 -0
- package/dist/hook-receiver.d.ts +29 -0
- package/dist/hook-receiver.d.ts.map +1 -0
- package/dist/hook-receiver.js +327 -0
- package/dist/hook-receiver.js.map +1 -0
- package/dist/hooks/git-hooks.d.ts +30 -0
- package/dist/hooks/git-hooks.d.ts.map +1 -0
- package/dist/hooks/git-hooks.js +179 -0
- package/dist/hooks/git-hooks.js.map +1 -0
- package/dist/mcp/cache-preload.d.ts +29 -0
- package/dist/mcp/cache-preload.d.ts.map +1 -0
- package/dist/mcp/cache-preload.js +103 -0
- package/dist/mcp/cache-preload.js.map +1 -0
- package/dist/mcp/handlers/analysis.d.ts +4 -0
- package/dist/mcp/handlers/analysis.d.ts.map +1 -0
- package/dist/mcp/handlers/analysis.js +196 -0
- package/dist/mcp/handlers/analysis.js.map +1 -0
- package/dist/mcp/handlers/context.d.ts +25 -0
- package/dist/mcp/handlers/context.d.ts.map +1 -0
- package/dist/mcp/handlers/context.js +382 -0
- package/dist/mcp/handlers/context.js.map +1 -0
- package/dist/mcp/handlers/graph-intelligence.d.ts +26 -0
- package/dist/mcp/handlers/graph-intelligence.d.ts.map +1 -0
- package/dist/mcp/handlers/graph-intelligence.js +371 -0
- package/dist/mcp/handlers/graph-intelligence.js.map +1 -0
- package/dist/mcp/handlers/graph-query.d.ts +25 -0
- package/dist/mcp/handlers/graph-query.d.ts.map +1 -0
- package/dist/mcp/handlers/graph-query.js +410 -0
- package/dist/mcp/handlers/graph-query.js.map +1 -0
- package/dist/mcp/handlers/graph.d.ts +5 -0
- package/dist/mcp/handlers/graph.d.ts.map +1 -0
- package/dist/mcp/handlers/graph.js +283 -0
- package/dist/mcp/handlers/graph.js.map +1 -0
- package/dist/mcp/handlers/impact-format.d.ts +9 -0
- package/dist/mcp/handlers/impact-format.d.ts.map +1 -0
- package/dist/mcp/handlers/impact-format.js +189 -0
- package/dist/mcp/handlers/impact-format.js.map +1 -0
- package/dist/mcp/handlers/impact.d.ts +4 -0
- package/dist/mcp/handlers/impact.d.ts.map +1 -0
- package/dist/mcp/handlers/impact.js +139 -0
- package/dist/mcp/handlers/impact.js.map +1 -0
- package/dist/mcp/handlers/improvement.d.ts +4 -0
- package/dist/mcp/handlers/improvement.d.ts.map +1 -0
- package/dist/mcp/handlers/improvement.js +136 -0
- package/dist/mcp/handlers/improvement.js.map +1 -0
- package/dist/mcp/handlers/index.d.ts +14 -0
- package/dist/mcp/handlers/index.d.ts.map +1 -0
- package/dist/mcp/handlers/index.js +36 -0
- package/dist/mcp/handlers/index.js.map +1 -0
- package/dist/mcp/handlers/platform-installer.d.ts +10 -0
- package/dist/mcp/handlers/platform-installer.d.ts.map +1 -0
- package/dist/mcp/handlers/platform-installer.js +168 -0
- package/dist/mcp/handlers/platform-installer.js.map +1 -0
- package/dist/mcp/handlers/pr-review.d.ts +33 -0
- package/dist/mcp/handlers/pr-review.d.ts.map +1 -0
- package/dist/mcp/handlers/pr-review.js +170 -0
- package/dist/mcp/handlers/pr-review.js.map +1 -0
- package/dist/mcp/handlers/shared.d.ts +20 -0
- package/dist/mcp/handlers/shared.d.ts.map +1 -0
- package/dist/mcp/handlers/shared.js +27 -0
- package/dist/mcp/handlers/shared.js.map +1 -0
- package/dist/mcp/handlers/types.d.ts +46 -0
- package/dist/mcp/handlers/types.d.ts.map +1 -0
- package/dist/mcp/handlers/types.js +3 -0
- package/dist/mcp/handlers/types.js.map +1 -0
- package/dist/mcp/helpers.d.ts +36 -0
- package/dist/mcp/helpers.d.ts.map +1 -0
- package/dist/mcp/helpers.js +199 -0
- package/dist/mcp/helpers.js.map +1 -0
- package/dist/mcp/installer.d.ts +22 -0
- package/dist/mcp/installer.d.ts.map +1 -0
- package/dist/mcp/installer.js +341 -0
- package/dist/mcp/installer.js.map +1 -0
- package/dist/mcp/server.d.ts +111 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +216 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/token-tracker.d.ts +47 -0
- package/dist/mcp/token-tracker.d.ts.map +1 -0
- package/dist/mcp/token-tracker.js +93 -0
- package/dist/mcp/token-tracker.js.map +1 -0
- package/dist/quality-loop/file-lock.d.ts +12 -0
- package/dist/quality-loop/file-lock.d.ts.map +1 -0
- package/dist/quality-loop/file-lock.js +38 -0
- package/dist/quality-loop/file-lock.js.map +1 -0
- package/dist/quality-loop/fix-worker.d.ts +44 -0
- package/dist/quality-loop/fix-worker.d.ts.map +1 -0
- package/dist/quality-loop/fix-worker.js +414 -0
- package/dist/quality-loop/fix-worker.js.map +1 -0
- package/dist/quality-loop/orchestrator.d.ts +137 -0
- package/dist/quality-loop/orchestrator.d.ts.map +1 -0
- package/dist/quality-loop/orchestrator.js +894 -0
- package/dist/quality-loop/orchestrator.js.map +1 -0
- package/dist/quality-loop/queue-manager.d.ts +45 -0
- package/dist/quality-loop/queue-manager.d.ts.map +1 -0
- package/dist/quality-loop/queue-manager.js +173 -0
- package/dist/quality-loop/queue-manager.js.map +1 -0
- package/dist/rating/rating-calculator.d.ts +15 -0
- package/dist/rating/rating-calculator.d.ts.map +1 -0
- package/dist/rating/rating-calculator.js +136 -0
- package/dist/rating/rating-calculator.js.map +1 -0
- package/dist/types/agent.d.ts +49 -0
- package/dist/types/agent.d.ts.map +1 -0
- package/dist/types/agent.js +7 -0
- package/dist/types/agent.js.map +1 -0
- package/dist/types.d.ts +156 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/util/fix-text.d.ts +7 -0
- package/dist/util/fix-text.d.ts.map +1 -0
- package/dist/util/fix-text.js +13 -0
- package/dist/util/fix-text.js.map +1 -0
- package/dist/viz/graph-viz.d.ts +40 -0
- package/dist/viz/graph-viz.d.ts.map +1 -0
- package/dist/viz/graph-viz.js +332 -0
- package/dist/viz/graph-viz.js.map +1 -0
- package/dist/viz/viz-helpers.d.ts +13 -0
- package/dist/viz/viz-helpers.d.ts.map +1 -0
- package/dist/viz/viz-helpers.js +134 -0
- package/dist/viz/viz-helpers.js.map +1 -0
- package/dist/viz/viz-routes.d.ts +28 -0
- package/dist/viz/viz-routes.d.ts.map +1 -0
- package/dist/viz/viz-routes.js +333 -0
- package/dist/viz/viz-routes.js.map +1 -0
- package/dist/viz/viz-scanner.d.ts +20 -0
- package/dist/viz/viz-scanner.d.ts.map +1 -0
- package/dist/viz/viz-scanner.js +241 -0
- package/dist/viz/viz-scanner.js.map +1 -0
- package/dist/viz/viz-server.d.ts +38 -0
- package/dist/viz/viz-server.d.ts.map +1 -0
- package/dist/viz/viz-server.js +240 -0
- package/dist/viz/viz-server.js.map +1 -0
- package/package.json +89 -0
- package/scripts/postinstall.js +28 -0
- package/scripts/setup.sh +113 -0
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* AST-based semantic relationship extractor.
|
|
4
|
+
*
|
|
5
|
+
* Piggybacks on the TypeScript Compiler API (ts.createSourceFile) to extract
|
|
6
|
+
* relationships the existing import-only dependency graph misses:
|
|
7
|
+
*
|
|
8
|
+
* FUNCTION_CALL — file A calls an imported function from file B
|
|
9
|
+
* CLASS_EXTENDS — file A's class extends an imported class from file B
|
|
10
|
+
* IMPLEMENTS — file A's class implements an imported interface from file B
|
|
11
|
+
* COMMENTS_ABOUT — "why:", "rationale:", JSDoc summaries embedded as WhyNodes
|
|
12
|
+
*
|
|
13
|
+
* Confidence is always EXTRACTED (direct AST evidence) for calls/heritage and
|
|
14
|
+
* INFERRED for JSDoc (not always a hard relationship).
|
|
15
|
+
*
|
|
16
|
+
* Usage:
|
|
17
|
+
* const extractor = new RelationshipExtractor();
|
|
18
|
+
* const result = extractor.extractFromFile(filePath, knownFilesSet);
|
|
19
|
+
*/
|
|
20
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
21
|
+
if (k2 === undefined) k2 = k;
|
|
22
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
23
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
24
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
25
|
+
}
|
|
26
|
+
Object.defineProperty(o, k2, desc);
|
|
27
|
+
}) : (function(o, m, k, k2) {
|
|
28
|
+
if (k2 === undefined) k2 = k;
|
|
29
|
+
o[k2] = m[k];
|
|
30
|
+
}));
|
|
31
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
32
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
33
|
+
}) : function(o, v) {
|
|
34
|
+
o["default"] = v;
|
|
35
|
+
});
|
|
36
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
37
|
+
var ownKeys = function(o) {
|
|
38
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
39
|
+
var ar = [];
|
|
40
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
41
|
+
return ar;
|
|
42
|
+
};
|
|
43
|
+
return ownKeys(o);
|
|
44
|
+
};
|
|
45
|
+
return function (mod) {
|
|
46
|
+
if (mod && mod.__esModule) return mod;
|
|
47
|
+
var result = {};
|
|
48
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
49
|
+
__setModuleDefault(result, mod);
|
|
50
|
+
return result;
|
|
51
|
+
};
|
|
52
|
+
})();
|
|
53
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
54
|
+
exports.RelationshipExtractor = void 0;
|
|
55
|
+
const ts = __importStar(require("typescript"));
|
|
56
|
+
const fs = __importStar(require("fs"));
|
|
57
|
+
const path = __importStar(require("path"));
|
|
58
|
+
const relationship_types_1 = require("./relationship-types");
|
|
59
|
+
const EXTENSIONS = ['.ts', '.tsx', '.js', '.jsx'];
|
|
60
|
+
const WHY_PATTERNS = [
|
|
61
|
+
/\/\/\s*why:\s*(.+)/i,
|
|
62
|
+
/\/\/\s*rationale:\s*(.+)/i,
|
|
63
|
+
/\/\/\s*because:\s*(.+)/i,
|
|
64
|
+
/\/\/\s*reason:\s*(.+)/i,
|
|
65
|
+
];
|
|
66
|
+
class RelationshipExtractor {
|
|
67
|
+
/**
|
|
68
|
+
* Extract semantic relationships from a single file.
|
|
69
|
+
*
|
|
70
|
+
* @param filePath Absolute path to analyze.
|
|
71
|
+
* @param knownFiles Set of absolute paths already tracked in the graph.
|
|
72
|
+
* Only imports resolving to known files generate edges.
|
|
73
|
+
*/
|
|
74
|
+
extractFromFile(filePath, knownFiles) {
|
|
75
|
+
let content;
|
|
76
|
+
try {
|
|
77
|
+
content = fs.readFileSync(filePath, 'utf8');
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
return { enrichedEdges: [], whyComments: [] };
|
|
81
|
+
}
|
|
82
|
+
const sf = ts.createSourceFile(filePath, content, ts.ScriptTarget.Latest, true);
|
|
83
|
+
const importMap = this.buildImportMap(sf, path.dirname(filePath), knownFiles);
|
|
84
|
+
return {
|
|
85
|
+
enrichedEdges: [
|
|
86
|
+
...this.extractFunctionCalls(sf, filePath, importMap),
|
|
87
|
+
...this.extractClassRelations(sf, filePath, importMap),
|
|
88
|
+
],
|
|
89
|
+
whyComments: this.extractWhyComments(content, filePath),
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
// ── Import map ─────────────────────────────────────────────
|
|
93
|
+
buildImportMap(sf, dir, knownFiles) {
|
|
94
|
+
const map = new Map(); // localName → resolved absolute path
|
|
95
|
+
const visit = (node) => {
|
|
96
|
+
if (ts.isImportDeclaration(node)) {
|
|
97
|
+
const rawSpec = node.moduleSpecifier.text;
|
|
98
|
+
if (!rawSpec.startsWith('.')) {
|
|
99
|
+
ts.forEachChild(node, visit);
|
|
100
|
+
return; // skip npm packages
|
|
101
|
+
}
|
|
102
|
+
const resolved = this.resolveModule(rawSpec, dir);
|
|
103
|
+
if (!resolved || !knownFiles.has(resolved)) {
|
|
104
|
+
ts.forEachChild(node, visit);
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
const clause = node.importClause;
|
|
108
|
+
if (!clause) {
|
|
109
|
+
ts.forEachChild(node, visit);
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
// default import: import Foo from './foo'
|
|
113
|
+
if (clause.name)
|
|
114
|
+
map.set(clause.name.text, resolved);
|
|
115
|
+
if (clause.namedBindings) {
|
|
116
|
+
if (ts.isNamedImports(clause.namedBindings)) {
|
|
117
|
+
// named: import { foo, bar as baz } from './foo'
|
|
118
|
+
for (const el of clause.namedBindings.elements) {
|
|
119
|
+
map.set(el.name.text, resolved);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
else if (ts.isNamespaceImport(clause.namedBindings)) {
|
|
123
|
+
// namespace: import * as mod from './foo'
|
|
124
|
+
map.set(clause.namedBindings.name.text, resolved);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
ts.forEachChild(node, visit);
|
|
129
|
+
};
|
|
130
|
+
visit(sf);
|
|
131
|
+
return map;
|
|
132
|
+
}
|
|
133
|
+
// ── Function calls ─────────────────────────────────────────
|
|
134
|
+
extractFunctionCalls(sf, filePath, importMap) {
|
|
135
|
+
const edges = [];
|
|
136
|
+
// Deduplicate per target file (one edge per file pair, not per call site)
|
|
137
|
+
const seen = new Set();
|
|
138
|
+
const visit = (node) => {
|
|
139
|
+
if (ts.isCallExpression(node) || ts.isNewExpression(node)) {
|
|
140
|
+
const localName = this.resolveCalleeName(node.expression);
|
|
141
|
+
if (localName && importMap.has(localName)) {
|
|
142
|
+
const target = importMap.get(localName);
|
|
143
|
+
const key = `${filePath}→${target}:FUNCTION_CALL`;
|
|
144
|
+
if (!seen.has(key)) {
|
|
145
|
+
seen.add(key);
|
|
146
|
+
const { line } = sf.getLineAndCharacterOfPosition(node.getStart());
|
|
147
|
+
edges.push({
|
|
148
|
+
source: filePath,
|
|
149
|
+
target,
|
|
150
|
+
type: 'FUNCTION_CALL',
|
|
151
|
+
confidence: 'EXTRACTED',
|
|
152
|
+
weight: relationship_types_1.RELATIONSHIP_WEIGHTS.FUNCTION_CALL,
|
|
153
|
+
rationale: `calls ${localName} (first at line ${line + 1})`,
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
ts.forEachChild(node, visit);
|
|
159
|
+
};
|
|
160
|
+
visit(sf);
|
|
161
|
+
return edges;
|
|
162
|
+
}
|
|
163
|
+
resolveCalleeName(expr) {
|
|
164
|
+
if (ts.isIdentifier(expr))
|
|
165
|
+
return expr.text;
|
|
166
|
+
// obj.method() — check if `obj` is the imported name
|
|
167
|
+
if (ts.isPropertyAccessExpression(expr) && ts.isIdentifier(expr.expression)) {
|
|
168
|
+
return expr.expression.text;
|
|
169
|
+
}
|
|
170
|
+
return null;
|
|
171
|
+
}
|
|
172
|
+
// ── Class heritage ─────────────────────────────────────────
|
|
173
|
+
extractClassRelations(sf, filePath, importMap) {
|
|
174
|
+
const edges = [];
|
|
175
|
+
const visit = (node) => {
|
|
176
|
+
if (ts.isClassDeclaration(node) || ts.isClassExpression(node)) {
|
|
177
|
+
const className = ts.isClassDeclaration(node) ? (node.name?.text ?? '<anonymous>') : '<expr>';
|
|
178
|
+
for (const clause of node.heritageClauses ?? []) {
|
|
179
|
+
const relType = clause.token === ts.SyntaxKind.ExtendsKeyword ? 'CLASS_EXTENDS' : 'IMPLEMENTS';
|
|
180
|
+
for (const typeRef of clause.types) {
|
|
181
|
+
const baseName = ts.isIdentifier(typeRef.expression) ? typeRef.expression.text : null;
|
|
182
|
+
if (baseName && importMap.has(baseName)) {
|
|
183
|
+
edges.push({
|
|
184
|
+
source: filePath,
|
|
185
|
+
target: importMap.get(baseName),
|
|
186
|
+
type: relType,
|
|
187
|
+
confidence: 'EXTRACTED',
|
|
188
|
+
weight: relationship_types_1.RELATIONSHIP_WEIGHTS[relType],
|
|
189
|
+
rationale: `${className} ${relType === 'CLASS_EXTENDS' ? 'extends' : 'implements'} ${baseName}`,
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
ts.forEachChild(node, visit);
|
|
196
|
+
};
|
|
197
|
+
visit(sf);
|
|
198
|
+
return edges;
|
|
199
|
+
}
|
|
200
|
+
// ── Why comments ───────────────────────────────────────────
|
|
201
|
+
extractWhyComments(content, filePath) {
|
|
202
|
+
const nodes = [];
|
|
203
|
+
const lines = content.split('\n');
|
|
204
|
+
// Inline why: / rationale: comments
|
|
205
|
+
for (let i = 0; i < lines.length; i++) {
|
|
206
|
+
for (const pattern of WHY_PATTERNS) {
|
|
207
|
+
const m = lines[i].match(pattern);
|
|
208
|
+
if (m?.[1]) {
|
|
209
|
+
nodes.push({
|
|
210
|
+
id: `${filePath}:${i + 1}:why`,
|
|
211
|
+
text: m[1].trim().slice(0, 300),
|
|
212
|
+
file: filePath,
|
|
213
|
+
line: i + 1,
|
|
214
|
+
});
|
|
215
|
+
break;
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
// JSDoc block summaries (first non-empty line after /**, ignoring @tags)
|
|
220
|
+
const jsdocRe = /\/\*\*([\s\S]*?)\*\//g;
|
|
221
|
+
let m;
|
|
222
|
+
while ((m = jsdocRe.exec(content)) !== null) {
|
|
223
|
+
const rawLines = m[1].split('\n').map(l => l.replace(/^\s*\*\s?/, '').trim()).filter(Boolean);
|
|
224
|
+
const summary = rawLines.find(l => l.length > 10 && !l.startsWith('@'));
|
|
225
|
+
if (summary) {
|
|
226
|
+
const lineNum = content.substring(0, m.index).split('\n').length;
|
|
227
|
+
nodes.push({
|
|
228
|
+
id: `${filePath}:${lineNum}:jsdoc`,
|
|
229
|
+
text: summary.slice(0, 300),
|
|
230
|
+
file: filePath,
|
|
231
|
+
line: lineNum,
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
return nodes;
|
|
236
|
+
}
|
|
237
|
+
// ── Module resolution ──────────────────────────────────────
|
|
238
|
+
resolveModule(specifier, dir) {
|
|
239
|
+
const base = path.resolve(dir, specifier);
|
|
240
|
+
for (const ext of EXTENSIONS) {
|
|
241
|
+
const full = base + ext;
|
|
242
|
+
if (fs.existsSync(full))
|
|
243
|
+
return full;
|
|
244
|
+
}
|
|
245
|
+
for (const ext of EXTENSIONS) {
|
|
246
|
+
const index = path.join(base, `index${ext}`);
|
|
247
|
+
if (fs.existsSync(index))
|
|
248
|
+
return index;
|
|
249
|
+
}
|
|
250
|
+
return null;
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
exports.RelationshipExtractor = RelationshipExtractor;
|
|
254
|
+
//# sourceMappingURL=relationship-extractor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relationship-extractor.js","sourceRoot":"","sources":["../../src/graph/relationship-extractor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Semantic relationship types for the enriched knowledge graph.
|
|
3
|
+
*
|
|
4
|
+
* Every edge in the graph carries a RelationshipType and ConfidenceLevel so
|
|
5
|
+
* agents can filter, weight, and reason about connections without reading files.
|
|
6
|
+
*/
|
|
7
|
+
export type RelationshipType = 'IMPORT' | 'FUNCTION_CALL' | 'CLASS_EXTENDS' | 'IMPLEMENTS' | 'SHARED_DEPENDENCY' | 'CONFIG_REFERENCE' | 'TEST_COVERS' | 'COMMENTS_ABOUT' | 'SIMILAR_TOPIC';
|
|
8
|
+
export type ConfidenceLevel = 'EXTRACTED' | 'INFERRED' | 'AMBIGUOUS';
|
|
9
|
+
export declare const RELATIONSHIP_WEIGHTS: Record<RelationshipType, number>;
|
|
10
|
+
export interface EnrichedEdge {
|
|
11
|
+
source: string;
|
|
12
|
+
target: string;
|
|
13
|
+
type: RelationshipType;
|
|
14
|
+
confidence: ConfidenceLevel;
|
|
15
|
+
weight: number;
|
|
16
|
+
rationale?: string;
|
|
17
|
+
}
|
|
18
|
+
export interface WhyNode {
|
|
19
|
+
id: string;
|
|
20
|
+
text: string;
|
|
21
|
+
file: string;
|
|
22
|
+
line: number;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=relationship-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relationship-types.d.ts","sourceRoot":"","sources":["../../src/graph/relationship-types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,MAAM,gBAAgB,GACxB,QAAQ,GACR,eAAe,GACf,eAAe,GACf,YAAY,GACZ,mBAAmB,GACnB,kBAAkB,GAClB,aAAa,GACb,gBAAgB,GAChB,eAAe,CAAC;AAEpB,MAAM,MAAM,eAAe,GAAG,WAAW,GAAG,UAAU,GAAG,WAAW,CAAC;AAErE,eAAO,MAAM,oBAAoB,EAAE,MAAM,CAAC,gBAAgB,EAAE,MAAM,CAUjE,CAAC;AAEF,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,gBAAgB,CAAC;IACvB,UAAU,EAAE,eAAe,CAAC;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Semantic relationship types for the enriched knowledge graph.
|
|
4
|
+
*
|
|
5
|
+
* Every edge in the graph carries a RelationshipType and ConfidenceLevel so
|
|
6
|
+
* agents can filter, weight, and reason about connections without reading files.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.RELATIONSHIP_WEIGHTS = void 0;
|
|
10
|
+
exports.RELATIONSHIP_WEIGHTS = {
|
|
11
|
+
CLASS_EXTENDS: 3,
|
|
12
|
+
IMPLEMENTS: 3,
|
|
13
|
+
FUNCTION_CALL: 2,
|
|
14
|
+
TEST_COVERS: 2,
|
|
15
|
+
IMPORT: 1,
|
|
16
|
+
CONFIG_REFERENCE: 1,
|
|
17
|
+
SHARED_DEPENDENCY: 0.5,
|
|
18
|
+
COMMENTS_ABOUT: 0.5,
|
|
19
|
+
SIMILAR_TOPIC: 0.25,
|
|
20
|
+
};
|
|
21
|
+
//# sourceMappingURL=relationship-types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relationship-types.js","sourceRoot":"","sources":["../../src/graph/relationship-types.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAeU,QAAA,oBAAoB,GAAqC;IACpE,aAAa,EAAK,CAAC;IACnB,UAAU,EAAQ,CAAC;IACnB,aAAa,EAAK,CAAC;IACnB,WAAW,EAAO,CAAC;IACnB,MAAM,EAAY,CAAC;IACnB,gBAAgB,EAAE,CAAC;IACnB,iBAAiB,EAAE,GAAG;IACtB,cAAc,EAAI,GAAG;IACrB,aAAa,EAAK,IAAI;CACvB,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Surprising connection detection for the knowledge graph.
|
|
3
|
+
*
|
|
4
|
+
* "Surprising" = a dependency edge that crosses module boundaries in an
|
|
5
|
+
* unexpected way. Scored by: how far apart the directories are × how rare
|
|
6
|
+
* that specific cross-module path is.
|
|
7
|
+
*
|
|
8
|
+
* score = directoryDistance(a, b) / log(crossEdgeCount + 1)
|
|
9
|
+
*
|
|
10
|
+
* High score = few edges between those modules + deep directory separation.
|
|
11
|
+
*/
|
|
12
|
+
interface GNode {
|
|
13
|
+
id: string;
|
|
14
|
+
}
|
|
15
|
+
interface GEdge {
|
|
16
|
+
source: string;
|
|
17
|
+
target: string;
|
|
18
|
+
}
|
|
19
|
+
export interface SurprisingConnection {
|
|
20
|
+
source: string;
|
|
21
|
+
target: string;
|
|
22
|
+
sourceModule: string;
|
|
23
|
+
targetModule: string;
|
|
24
|
+
score: number;
|
|
25
|
+
explanation: string;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Returns the "module" label for a file path — the meaningful top-level
|
|
29
|
+
* directory group. Skips common language-convention prefixes (src/, lib/)
|
|
30
|
+
* so that `src/auth/service.ts` → `auth`, not `src`.
|
|
31
|
+
*/
|
|
32
|
+
export declare function getModule(filePath: string, repoRoot: string): string;
|
|
33
|
+
/**
|
|
34
|
+
* Find edges that cross module boundaries, ranked by "unexpectedness".
|
|
35
|
+
* Returns at most `topN` results.
|
|
36
|
+
*/
|
|
37
|
+
export declare function findSurprisingConnections(nodes: ReadonlyArray<GNode>, edges: ReadonlyArray<GEdge>, repoRoot: string, topN?: number): SurprisingConnection[];
|
|
38
|
+
export {};
|
|
39
|
+
//# sourceMappingURL=surprising-connections.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"surprising-connections.d.ts","sourceRoot":"","sources":["../../src/graph/surprising-connections.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,UAAU,KAAK;IAAG,EAAE,EAAE,MAAM,CAAA;CAAE;AAC9B,UAAU,KAAK;IAAG,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE;AAElD,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;CACrB;AAKD;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAMpE;AAaD;;;GAGG;AACH,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,aAAa,CAAC,KAAK,CAAC,EAC3B,KAAK,EAAE,aAAa,CAAC,KAAK,CAAC,EAC3B,QAAQ,EAAE,MAAM,EAChB,IAAI,SAAK,GACR,oBAAoB,EAAE,CA6CxB"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Surprising connection detection for the knowledge graph.
|
|
4
|
+
*
|
|
5
|
+
* "Surprising" = a dependency edge that crosses module boundaries in an
|
|
6
|
+
* unexpected way. Scored by: how far apart the directories are × how rare
|
|
7
|
+
* that specific cross-module path is.
|
|
8
|
+
*
|
|
9
|
+
* score = directoryDistance(a, b) / log(crossEdgeCount + 1)
|
|
10
|
+
*
|
|
11
|
+
* High score = few edges between those modules + deep directory separation.
|
|
12
|
+
*/
|
|
13
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
14
|
+
if (k2 === undefined) k2 = k;
|
|
15
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
16
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
17
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
18
|
+
}
|
|
19
|
+
Object.defineProperty(o, k2, desc);
|
|
20
|
+
}) : (function(o, m, k, k2) {
|
|
21
|
+
if (k2 === undefined) k2 = k;
|
|
22
|
+
o[k2] = m[k];
|
|
23
|
+
}));
|
|
24
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
25
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
26
|
+
}) : function(o, v) {
|
|
27
|
+
o["default"] = v;
|
|
28
|
+
});
|
|
29
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
30
|
+
var ownKeys = function(o) {
|
|
31
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
32
|
+
var ar = [];
|
|
33
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
34
|
+
return ar;
|
|
35
|
+
};
|
|
36
|
+
return ownKeys(o);
|
|
37
|
+
};
|
|
38
|
+
return function (mod) {
|
|
39
|
+
if (mod && mod.__esModule) return mod;
|
|
40
|
+
var result = {};
|
|
41
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
42
|
+
__setModuleDefault(result, mod);
|
|
43
|
+
return result;
|
|
44
|
+
};
|
|
45
|
+
})();
|
|
46
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
47
|
+
exports.getModule = getModule;
|
|
48
|
+
exports.findSurprisingConnections = findSurprisingConnections;
|
|
49
|
+
const path = __importStar(require("path"));
|
|
50
|
+
// Common single-level prefixes that aren't meaningful module names on their own.
|
|
51
|
+
const COMMON_PREFIXES = new Set(['src', 'lib', 'app', 'packages', 'modules', 'source']);
|
|
52
|
+
/**
|
|
53
|
+
* Returns the "module" label for a file path — the meaningful top-level
|
|
54
|
+
* directory group. Skips common language-convention prefixes (src/, lib/)
|
|
55
|
+
* so that `src/auth/service.ts` → `auth`, not `src`.
|
|
56
|
+
*/
|
|
57
|
+
function getModule(filePath, repoRoot) {
|
|
58
|
+
const rel = path.relative(repoRoot, filePath);
|
|
59
|
+
const parts = rel.split(path.sep).filter(Boolean);
|
|
60
|
+
if (parts.length <= 1)
|
|
61
|
+
return '(root)';
|
|
62
|
+
if (COMMON_PREFIXES.has(parts[0]) && parts.length > 2)
|
|
63
|
+
return parts[1];
|
|
64
|
+
return parts[0];
|
|
65
|
+
}
|
|
66
|
+
function directoryDistance(a, b) {
|
|
67
|
+
const aParts = a.split(path.sep);
|
|
68
|
+
const bParts = b.split(path.sep);
|
|
69
|
+
let common = 0;
|
|
70
|
+
for (let i = 0; i < Math.min(aParts.length, bParts.length); i++) {
|
|
71
|
+
if (aParts[i] === bParts[i])
|
|
72
|
+
common++;
|
|
73
|
+
else
|
|
74
|
+
break;
|
|
75
|
+
}
|
|
76
|
+
return (aParts.length - 1 - common) + (bParts.length - 1 - common);
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Find edges that cross module boundaries, ranked by "unexpectedness".
|
|
80
|
+
* Returns at most `topN` results.
|
|
81
|
+
*/
|
|
82
|
+
function findSurprisingConnections(nodes, edges, repoRoot, topN = 10) {
|
|
83
|
+
const nodeIds = new Set(nodes.map(n => n.id));
|
|
84
|
+
const moduleOf = new Map();
|
|
85
|
+
for (const n of nodes)
|
|
86
|
+
moduleOf.set(n.id, getModule(n.id, repoRoot));
|
|
87
|
+
// Count cross-module edges per module-pair key
|
|
88
|
+
const pairCounts = new Map();
|
|
89
|
+
for (const e of edges) {
|
|
90
|
+
if (!nodeIds.has(e.source) || !nodeIds.has(e.target))
|
|
91
|
+
continue;
|
|
92
|
+
const sm = moduleOf.get(e.source) ?? '(unknown)';
|
|
93
|
+
const tm = moduleOf.get(e.target) ?? '(unknown)';
|
|
94
|
+
if (sm !== tm) {
|
|
95
|
+
const key = `${sm}→${tm}`;
|
|
96
|
+
pairCounts.set(key, (pairCounts.get(key) ?? 0) + 1);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
const results = [];
|
|
100
|
+
for (const e of edges) {
|
|
101
|
+
if (!nodeIds.has(e.source) || !nodeIds.has(e.target))
|
|
102
|
+
continue;
|
|
103
|
+
const sm = moduleOf.get(e.source) ?? '(unknown)';
|
|
104
|
+
const tm = moduleOf.get(e.target) ?? '(unknown)';
|
|
105
|
+
if (sm === tm)
|
|
106
|
+
continue;
|
|
107
|
+
const pairCount = pairCounts.get(`${sm}→${tm}`) ?? 1;
|
|
108
|
+
const dist = directoryDistance(e.source, e.target);
|
|
109
|
+
const score = dist / Math.log(pairCount + 1);
|
|
110
|
+
results.push({
|
|
111
|
+
source: e.source,
|
|
112
|
+
target: e.target,
|
|
113
|
+
sourceModule: sm,
|
|
114
|
+
targetModule: tm,
|
|
115
|
+
score,
|
|
116
|
+
explanation: `${sm} → ${tm} (${pairCount} cross-edge${pairCount !== 1 ? 's' : ''}, distance ${dist})`,
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
return results
|
|
120
|
+
.sort((a, b) => b.score - a.score)
|
|
121
|
+
.filter((r, i, arr) => {
|
|
122
|
+
// Deduplicate: keep only first occurrence of each source→target pair
|
|
123
|
+
return arr.findIndex(x => x.source === r.source && x.target === r.target) === i;
|
|
124
|
+
})
|
|
125
|
+
.slice(0, topN);
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=surprising-connections.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"surprising-connections.js","sourceRoot":"","sources":["../../src/graph/surprising-connections.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* gate-keeper pre-tool-use hook
|
|
3
|
+
*
|
|
4
|
+
* Called by Claude Code's PreToolUse hook on every Write/Edit operation.
|
|
5
|
+
* Calls the daemon's check_pre_edit_safety endpoint and prints a warning
|
|
6
|
+
* (exit code 0 — non-blocking) if the edit would impact 3+ fragile
|
|
7
|
+
* dependents or has a "block" verdict.
|
|
8
|
+
*
|
|
9
|
+
* The warning is printed to stderr so Claude sees it but the edit is
|
|
10
|
+
* allowed to proceed. This is a safety advisory, not a gate — for
|
|
11
|
+
* blocking quality gates, see hook-receiver.ts (PostToolUse).
|
|
12
|
+
*/
|
|
13
|
+
export declare function main(): Promise<void>;
|
|
14
|
+
//# sourceMappingURL=hook-pre-tool-use.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hook-pre-tool-use.d.ts","sourceRoot":"","sources":["../src/hook-pre-tool-use.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AA+DH,wBAAsB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAyE1C"}
|