@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,19 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* gate-keeper CLI entry point
|
|
4
|
+
*
|
|
5
|
+
* Usage:
|
|
6
|
+
* gate-keeper setup # Install deps, build, start daemon, write hooks
|
|
7
|
+
* gate-keeper daemon # Start the daemon
|
|
8
|
+
* gate-keeper mcp # Start the MCP server (stdio)
|
|
9
|
+
* gate-keeper dashboard # Open the dashboard in browser
|
|
10
|
+
* gate-keeper status # Check daemon status
|
|
11
|
+
* gate-keeper help # Show this help
|
|
12
|
+
*
|
|
13
|
+
* Shortcuts:
|
|
14
|
+
* gk setup
|
|
15
|
+
* gk daemon
|
|
16
|
+
* gk mcp
|
|
17
|
+
*/
|
|
18
|
+
export {};
|
|
19
|
+
//# sourceMappingURL=cli-entry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-entry.d.ts","sourceRoot":"","sources":["../src/cli-entry.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;;;;;;GAeG"}
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
/**
|
|
4
|
+
* gate-keeper CLI entry point
|
|
5
|
+
*
|
|
6
|
+
* Usage:
|
|
7
|
+
* gate-keeper setup # Install deps, build, start daemon, write hooks
|
|
8
|
+
* gate-keeper daemon # Start the daemon
|
|
9
|
+
* gate-keeper mcp # Start the MCP server (stdio)
|
|
10
|
+
* gate-keeper dashboard # Open the dashboard in browser
|
|
11
|
+
* gate-keeper status # Check daemon status
|
|
12
|
+
* gate-keeper help # Show this help
|
|
13
|
+
*
|
|
14
|
+
* Shortcuts:
|
|
15
|
+
* gk setup
|
|
16
|
+
* gk daemon
|
|
17
|
+
* gk mcp
|
|
18
|
+
*/
|
|
19
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
20
|
+
if (k2 === undefined) k2 = k;
|
|
21
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
22
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
23
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
24
|
+
}
|
|
25
|
+
Object.defineProperty(o, k2, desc);
|
|
26
|
+
}) : (function(o, m, k, k2) {
|
|
27
|
+
if (k2 === undefined) k2 = k;
|
|
28
|
+
o[k2] = m[k];
|
|
29
|
+
}));
|
|
30
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
31
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
32
|
+
}) : function(o, v) {
|
|
33
|
+
o["default"] = v;
|
|
34
|
+
});
|
|
35
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
36
|
+
var ownKeys = function(o) {
|
|
37
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
38
|
+
var ar = [];
|
|
39
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
40
|
+
return ar;
|
|
41
|
+
};
|
|
42
|
+
return ownKeys(o);
|
|
43
|
+
};
|
|
44
|
+
return function (mod) {
|
|
45
|
+
if (mod && mod.__esModule) return mod;
|
|
46
|
+
var result = {};
|
|
47
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
48
|
+
__setModuleDefault(result, mod);
|
|
49
|
+
return result;
|
|
50
|
+
};
|
|
51
|
+
})();
|
|
52
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
53
|
+
const child_process = __importStar(require("child_process"));
|
|
54
|
+
const path = __importStar(require("path"));
|
|
55
|
+
const http = __importStar(require("http"));
|
|
56
|
+
const GK_DIR = path.join(process.env.HOME ?? '/tmp', '.gate-keeper');
|
|
57
|
+
const PID_FILE = path.join(GK_DIR, 'daemon.pid');
|
|
58
|
+
const DAEMON_PORT = 5378;
|
|
59
|
+
const HELP = `
|
|
60
|
+
⬡ Gate Keeper — Real-time quality gates for AI-assisted development
|
|
61
|
+
|
|
62
|
+
Usage:
|
|
63
|
+
gate-keeper <command>
|
|
64
|
+
|
|
65
|
+
Commands:
|
|
66
|
+
setup Install deps, build, start daemon, write Claude hooks
|
|
67
|
+
daemon Start the daemon (ports 5378/5379)
|
|
68
|
+
mcp Start the MCP server (stdio) — pipe to your MCP client
|
|
69
|
+
dashboard Open http://localhost:5378/viz in your browser
|
|
70
|
+
status Check if the daemon is running
|
|
71
|
+
help Show this message
|
|
72
|
+
|
|
73
|
+
Examples:
|
|
74
|
+
gate-keeper setup
|
|
75
|
+
gate-keeper daemon --no-scan
|
|
76
|
+
echo '{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}' | gate-keeper mcp
|
|
77
|
+
`;
|
|
78
|
+
function isDaemonAlive() {
|
|
79
|
+
try {
|
|
80
|
+
const fs = require('fs');
|
|
81
|
+
const pid = parseInt(fs.readFileSync(PID_FILE, 'utf8').trim(), 10);
|
|
82
|
+
if (isNaN(pid))
|
|
83
|
+
return false;
|
|
84
|
+
process.kill(pid, 0);
|
|
85
|
+
return true;
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
return false;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
async function main() {
|
|
92
|
+
const cmd = process.argv[2]?.toLowerCase() ?? 'help';
|
|
93
|
+
switch (cmd) {
|
|
94
|
+
case 'setup': {
|
|
95
|
+
const setupScript = path.join(__dirname, '..', 'scripts', 'setup.sh');
|
|
96
|
+
const result = child_process.spawnSync('bash', [setupScript], {
|
|
97
|
+
stdio: 'inherit',
|
|
98
|
+
cwd: path.join(__dirname, '..'),
|
|
99
|
+
});
|
|
100
|
+
process.exit(result.status ?? 0);
|
|
101
|
+
break;
|
|
102
|
+
}
|
|
103
|
+
case 'daemon': {
|
|
104
|
+
const daemonScript = path.join(__dirname, 'daemon.js');
|
|
105
|
+
const args = process.argv.slice(3);
|
|
106
|
+
const child = child_process.spawn(process.execPath, [daemonScript, ...args], {
|
|
107
|
+
stdio: 'inherit',
|
|
108
|
+
cwd: path.join(__dirname, '..'),
|
|
109
|
+
});
|
|
110
|
+
child.on('exit', (code) => process.exit(code ?? 0));
|
|
111
|
+
break;
|
|
112
|
+
}
|
|
113
|
+
case 'mcp': {
|
|
114
|
+
const mcpScript = path.join(__dirname, 'mcp', 'server.js');
|
|
115
|
+
const mcp = child_process.spawn(process.execPath, [mcpScript], {
|
|
116
|
+
stdio: ['inherit', 'inherit', 'inherit'],
|
|
117
|
+
cwd: path.join(__dirname, '..'),
|
|
118
|
+
});
|
|
119
|
+
mcp.on('exit', (code) => process.exit(code ?? 0));
|
|
120
|
+
break;
|
|
121
|
+
}
|
|
122
|
+
case 'dashboard': {
|
|
123
|
+
const url = `http://localhost:${DAEMON_PORT}/viz`;
|
|
124
|
+
if (isDaemonAlive()) {
|
|
125
|
+
console.log(`[gate-keeper] Opening dashboard: ${url}`);
|
|
126
|
+
const open = require('open');
|
|
127
|
+
open(url);
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
console.log(`[gate-keeper] Daemon is not running. Start it first:\n gate-keeper daemon`);
|
|
131
|
+
console.log(` Dashboard URL: ${url}`);
|
|
132
|
+
}
|
|
133
|
+
break;
|
|
134
|
+
}
|
|
135
|
+
case 'status': {
|
|
136
|
+
if (isDaemonAlive()) {
|
|
137
|
+
const pid = require('fs').readFileSync(PID_FILE, 'utf8').trim();
|
|
138
|
+
console.log(`[gate-keeper] Daemon is running (PID: ${pid})`);
|
|
139
|
+
console.log(` Dashboard: http://localhost:${DAEMON_PORT}/viz`);
|
|
140
|
+
// Quick health check
|
|
141
|
+
try {
|
|
142
|
+
const data = await new Promise((resolve, reject) => {
|
|
143
|
+
const req = http.get(`http://127.0.0.1:${DAEMON_PORT}/api/status`, (res) => {
|
|
144
|
+
let d = '';
|
|
145
|
+
res.on('data', (c) => d += c);
|
|
146
|
+
res.on('end', () => resolve(d));
|
|
147
|
+
});
|
|
148
|
+
req.on('error', reject);
|
|
149
|
+
req.setTimeout(3000, () => { req.destroy(); reject(new Error('timeout')); });
|
|
150
|
+
});
|
|
151
|
+
const status = JSON.parse(data);
|
|
152
|
+
console.log(` Overall rating: ${status.overallRating ?? '?'}/10`);
|
|
153
|
+
console.log(` Cycles: ${status.cycles ?? '?'}`);
|
|
154
|
+
console.log(` Scanning: ${status.scanning ? 'yes' : 'no'}`);
|
|
155
|
+
}
|
|
156
|
+
catch {
|
|
157
|
+
console.log(` Health check: daemon not responding on port ${DAEMON_PORT}`);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
else {
|
|
161
|
+
console.log('[gate-keeper] Daemon is NOT running');
|
|
162
|
+
console.log(' Start it with: gate-keeper daemon');
|
|
163
|
+
}
|
|
164
|
+
break;
|
|
165
|
+
}
|
|
166
|
+
case 'help':
|
|
167
|
+
case '--help':
|
|
168
|
+
case '-h':
|
|
169
|
+
default:
|
|
170
|
+
console.log(HELP);
|
|
171
|
+
break;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
main().catch((err) => {
|
|
175
|
+
console.error('[gate-keeper] Error:', err);
|
|
176
|
+
process.exit(1);
|
|
177
|
+
});
|
|
178
|
+
//# sourceMappingURL=cli-entry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-entry.js","sourceRoot":"","sources":["../src/cli-entry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Watch mode — polls source files for mtime changes and triggers re-analysis.
|
|
3
|
+
*
|
|
4
|
+
* Uses fs.watchFile (stat-polling) rather than fs.watch (inotify) because inotify
|
|
5
|
+
* silently drops events on WSL DrvFs and NFS mounts. Same approach as the LCOV
|
|
6
|
+
* watcher in daemon.ts.
|
|
7
|
+
*
|
|
8
|
+
* Usage:
|
|
9
|
+
* const watcher = new WatchMode();
|
|
10
|
+
* watcher.start('/repo', (changed) => reAnalyze(changed), 5000);
|
|
11
|
+
* // later:
|
|
12
|
+
* watcher.stop();
|
|
13
|
+
*/
|
|
14
|
+
export interface WatchStats {
|
|
15
|
+
watchedFiles: number;
|
|
16
|
+
changesDetected: number;
|
|
17
|
+
lastPollAt: number | null;
|
|
18
|
+
}
|
|
19
|
+
export declare class WatchMode {
|
|
20
|
+
private mtimeCache;
|
|
21
|
+
private pollTimer;
|
|
22
|
+
private stats;
|
|
23
|
+
private debounceTimer;
|
|
24
|
+
private pendingChanged;
|
|
25
|
+
/**
|
|
26
|
+
* Start watching `repoRoot` for source file changes.
|
|
27
|
+
*
|
|
28
|
+
* @param repoRoot Absolute repo path to watch.
|
|
29
|
+
* @param onChanged Called with list of changed absolute file paths (debounced).
|
|
30
|
+
* @param intervalMs How often to poll for changes (default 5 s).
|
|
31
|
+
* @param debounceMs How long to wait before flushing a batch of changes (default 1 s).
|
|
32
|
+
*/
|
|
33
|
+
start(repoRoot: string, onChanged: (changedFiles: string[]) => void, intervalMs?: number, debounceMs?: number): void;
|
|
34
|
+
stop(): void;
|
|
35
|
+
getStats(): WatchStats;
|
|
36
|
+
/** Force an immediate snapshot update (e.g. after a manual re-analysis). */
|
|
37
|
+
refresh(repoRoot: string): void;
|
|
38
|
+
private snapshot;
|
|
39
|
+
private detectChanges;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=watch-mode.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"watch-mode.d.ts","sourceRoot":"","sources":["../../src/daemon/watch-mode.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AASH,MAAM,WAAW,UAAU;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,qBAAa,SAAS;IACpB,OAAO,CAAC,UAAU,CAA6B;IAC/C,OAAO,CAAC,SAAS,CAA+B;IAChD,OAAO,CAAC,KAAK,CAAyE;IACtF,OAAO,CAAC,aAAa,CAA+B;IACpD,OAAO,CAAC,cAAc,CAAqB;IAE3C;;;;;;;OAOG;IACH,KAAK,CACH,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,CAAC,YAAY,EAAE,MAAM,EAAE,KAAK,IAAI,EAC3C,UAAU,SAAQ,EAClB,UAAU,SAAQ,GACjB,IAAI;IAsBP,IAAI,IAAI,IAAI;IAOZ,QAAQ,IAAI,UAAU;IAItB,4EAA4E;IAC5E,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAM/B,OAAO,CAAC,QAAQ;IAiBhB,OAAO,CAAC,aAAa;CAgCtB"}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Watch mode — polls source files for mtime changes and triggers re-analysis.
|
|
4
|
+
*
|
|
5
|
+
* Uses fs.watchFile (stat-polling) rather than fs.watch (inotify) because inotify
|
|
6
|
+
* silently drops events on WSL DrvFs and NFS mounts. Same approach as the LCOV
|
|
7
|
+
* watcher in daemon.ts.
|
|
8
|
+
*
|
|
9
|
+
* Usage:
|
|
10
|
+
* const watcher = new WatchMode();
|
|
11
|
+
* watcher.start('/repo', (changed) => reAnalyze(changed), 5000);
|
|
12
|
+
* // later:
|
|
13
|
+
* watcher.stop();
|
|
14
|
+
*/
|
|
15
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
16
|
+
if (k2 === undefined) k2 = k;
|
|
17
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
18
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
19
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
20
|
+
}
|
|
21
|
+
Object.defineProperty(o, k2, desc);
|
|
22
|
+
}) : (function(o, m, k, k2) {
|
|
23
|
+
if (k2 === undefined) k2 = k;
|
|
24
|
+
o[k2] = m[k];
|
|
25
|
+
}));
|
|
26
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
27
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
28
|
+
}) : function(o, v) {
|
|
29
|
+
o["default"] = v;
|
|
30
|
+
});
|
|
31
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
32
|
+
var ownKeys = function(o) {
|
|
33
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
34
|
+
var ar = [];
|
|
35
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
36
|
+
return ar;
|
|
37
|
+
};
|
|
38
|
+
return ownKeys(o);
|
|
39
|
+
};
|
|
40
|
+
return function (mod) {
|
|
41
|
+
if (mod && mod.__esModule) return mod;
|
|
42
|
+
var result = {};
|
|
43
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
44
|
+
__setModuleDefault(result, mod);
|
|
45
|
+
return result;
|
|
46
|
+
};
|
|
47
|
+
})();
|
|
48
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
49
|
+
exports.WatchMode = void 0;
|
|
50
|
+
const fs = __importStar(require("fs"));
|
|
51
|
+
const path = __importStar(require("path"));
|
|
52
|
+
const viz_helpers_1 = require("../viz/viz-helpers");
|
|
53
|
+
const graphify_ignore_1 = require("../graph/graphify-ignore");
|
|
54
|
+
const SUPPORTED_EXTS = new Set(['.ts', '.tsx', '.js', '.jsx', '.cs']);
|
|
55
|
+
class WatchMode {
|
|
56
|
+
mtimeCache = new Map();
|
|
57
|
+
pollTimer = null;
|
|
58
|
+
stats = { watchedFiles: 0, changesDetected: 0, lastPollAt: null };
|
|
59
|
+
debounceTimer = null;
|
|
60
|
+
pendingChanged = new Set();
|
|
61
|
+
/**
|
|
62
|
+
* Start watching `repoRoot` for source file changes.
|
|
63
|
+
*
|
|
64
|
+
* @param repoRoot Absolute repo path to watch.
|
|
65
|
+
* @param onChanged Called with list of changed absolute file paths (debounced).
|
|
66
|
+
* @param intervalMs How often to poll for changes (default 5 s).
|
|
67
|
+
* @param debounceMs How long to wait before flushing a batch of changes (default 1 s).
|
|
68
|
+
*/
|
|
69
|
+
start(repoRoot, onChanged, intervalMs = 5_000, debounceMs = 1_000) {
|
|
70
|
+
this.snapshot(repoRoot);
|
|
71
|
+
this.pollTimer = setInterval(() => {
|
|
72
|
+
const changed = this.detectChanges(repoRoot);
|
|
73
|
+
this.stats.lastPollAt = Date.now();
|
|
74
|
+
if (changed.length === 0)
|
|
75
|
+
return;
|
|
76
|
+
this.stats.changesDetected += changed.length;
|
|
77
|
+
for (const f of changed)
|
|
78
|
+
this.pendingChanged.add(f);
|
|
79
|
+
if (this.debounceTimer)
|
|
80
|
+
clearTimeout(this.debounceTimer);
|
|
81
|
+
this.debounceTimer = setTimeout(() => {
|
|
82
|
+
const batch = [...this.pendingChanged];
|
|
83
|
+
this.pendingChanged.clear();
|
|
84
|
+
this.debounceTimer = null;
|
|
85
|
+
onChanged(batch);
|
|
86
|
+
}, debounceMs);
|
|
87
|
+
}, intervalMs);
|
|
88
|
+
}
|
|
89
|
+
stop() {
|
|
90
|
+
if (this.pollTimer) {
|
|
91
|
+
clearInterval(this.pollTimer);
|
|
92
|
+
this.pollTimer = null;
|
|
93
|
+
}
|
|
94
|
+
if (this.debounceTimer) {
|
|
95
|
+
clearTimeout(this.debounceTimer);
|
|
96
|
+
this.debounceTimer = null;
|
|
97
|
+
}
|
|
98
|
+
this.mtimeCache.clear();
|
|
99
|
+
this.pendingChanged.clear();
|
|
100
|
+
}
|
|
101
|
+
getStats() {
|
|
102
|
+
return { ...this.stats };
|
|
103
|
+
}
|
|
104
|
+
/** Force an immediate snapshot update (e.g. after a manual re-analysis). */
|
|
105
|
+
refresh(repoRoot) {
|
|
106
|
+
this.snapshot(repoRoot);
|
|
107
|
+
}
|
|
108
|
+
// ── Internal ─────────────────────────────────────────────
|
|
109
|
+
snapshot(repoRoot) {
|
|
110
|
+
const ignoreRules = (0, graphify_ignore_1.loadGraphifyIgnore)(repoRoot);
|
|
111
|
+
let count = 0;
|
|
112
|
+
for (const filePath of (0, viz_helpers_1.walkFiles)(repoRoot)) {
|
|
113
|
+
if (!SUPPORTED_EXTS.has(path.extname(filePath)))
|
|
114
|
+
continue;
|
|
115
|
+
if ((0, graphify_ignore_1.shouldIgnoreByGraphifyIgnore)(filePath, repoRoot, ignoreRules))
|
|
116
|
+
continue;
|
|
117
|
+
try {
|
|
118
|
+
const { mtimeMs } = fs.statSync(filePath);
|
|
119
|
+
this.mtimeCache.set(filePath, mtimeMs);
|
|
120
|
+
count++;
|
|
121
|
+
}
|
|
122
|
+
catch {
|
|
123
|
+
// file disappeared between walk and stat — skip
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
this.stats.watchedFiles = count;
|
|
127
|
+
}
|
|
128
|
+
detectChanges(repoRoot) {
|
|
129
|
+
const ignoreRules = (0, graphify_ignore_1.loadGraphifyIgnore)(repoRoot);
|
|
130
|
+
const changed = [];
|
|
131
|
+
const seen = new Set();
|
|
132
|
+
for (const filePath of (0, viz_helpers_1.walkFiles)(repoRoot)) {
|
|
133
|
+
if (!SUPPORTED_EXTS.has(path.extname(filePath)))
|
|
134
|
+
continue;
|
|
135
|
+
if ((0, graphify_ignore_1.shouldIgnoreByGraphifyIgnore)(filePath, repoRoot, ignoreRules))
|
|
136
|
+
continue;
|
|
137
|
+
seen.add(filePath);
|
|
138
|
+
try {
|
|
139
|
+
const { mtimeMs } = fs.statSync(filePath);
|
|
140
|
+
if (this.mtimeCache.get(filePath) !== mtimeMs) {
|
|
141
|
+
this.mtimeCache.set(filePath, mtimeMs);
|
|
142
|
+
changed.push(filePath);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
catch {
|
|
146
|
+
// file disappeared — treat as changed (deletion)
|
|
147
|
+
if (this.mtimeCache.has(filePath)) {
|
|
148
|
+
this.mtimeCache.delete(filePath);
|
|
149
|
+
changed.push(filePath);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
// New files not in cache yet
|
|
154
|
+
for (const filePath of seen) {
|
|
155
|
+
if (!this.mtimeCache.has(filePath))
|
|
156
|
+
changed.push(filePath);
|
|
157
|
+
}
|
|
158
|
+
this.stats.watchedFiles = seen.size;
|
|
159
|
+
return changed;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
exports.WatchMode = WatchMode;
|
|
163
|
+
//# sourceMappingURL=watch-mode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"watch-mode.js","sourceRoot":"","sources":["../../src/daemon/watch-mode.ts"],"names":[],"mappings":"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"}
|
package/dist/daemon.d.ts
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* gate-keeper daemon
|
|
3
|
+
*
|
|
4
|
+
* Listens on port 5379 for file paths from the hook-receiver, runs analysis,
|
|
5
|
+
* updates the SQLite cache, and broadcasts results to the dashboard (port 5378).
|
|
6
|
+
*
|
|
7
|
+
* Start with: node dist/daemon.js
|
|
8
|
+
*/
|
|
9
|
+
import { Config } from './types';
|
|
10
|
+
declare global {
|
|
11
|
+
namespace NodeJS {
|
|
12
|
+
interface Process {
|
|
13
|
+
_gateKeeperSignalsRegistered?: boolean;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
export declare const IPC_PORT = 5379;
|
|
18
|
+
export declare const GK_DIR: string;
|
|
19
|
+
export declare const PID_FILE: string;
|
|
20
|
+
export declare const CONFIG_FILE: string;
|
|
21
|
+
export declare const DEFAULT_CONFIG: Config;
|
|
22
|
+
export declare function findGitRoot(dir: string): string;
|
|
23
|
+
export declare function main(): Promise<void>;
|
|
24
|
+
//# sourceMappingURL=daemon.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daemon.d.ts","sourceRoot":"","sources":["../src/daemon.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAUH,OAAO,EAAE,MAAM,EAA+B,MAAM,SAAS,CAAC;AAG9D,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,MAAM,CAAC;QACf,UAAU,OAAO;YACf,4BAA4B,CAAC,EAAE,OAAO,CAAC;SACxC;KACF;CACF;AAED,eAAO,MAAM,QAAQ,OAAO,CAAC;AAC7B,eAAO,MAAM,MAAM,QAAwD,CAAC;AAC5E,eAAO,MAAM,QAAQ,QAAkC,CAAC;AACxD,eAAO,MAAM,WAAW,QAAmC,CAAC;AAE5D,eAAO,MAAM,cAAc,EAAE,MA8C5B,CAAC;AA4BF,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAK/C;AA0CD,wBAAsB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAgL1C"}
|