@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,119 @@
|
|
|
1
|
+
import Database from 'better-sqlite3';
|
|
2
|
+
interface QueueRow {
|
|
3
|
+
id: number;
|
|
4
|
+
repo: string;
|
|
5
|
+
file_path: string;
|
|
6
|
+
current_rating: number;
|
|
7
|
+
target_rating: number;
|
|
8
|
+
priority_score: number;
|
|
9
|
+
status: string;
|
|
10
|
+
attempts: number;
|
|
11
|
+
max_attempts: number;
|
|
12
|
+
worker_id: string | null;
|
|
13
|
+
locked_at: number | null;
|
|
14
|
+
error_message: string | null;
|
|
15
|
+
completed_at: number | null;
|
|
16
|
+
created_at: number;
|
|
17
|
+
}
|
|
18
|
+
interface QueueStats {
|
|
19
|
+
total: number;
|
|
20
|
+
pending: number;
|
|
21
|
+
in_progress: number;
|
|
22
|
+
completed: number;
|
|
23
|
+
failed: number;
|
|
24
|
+
skipped: number;
|
|
25
|
+
}
|
|
26
|
+
export declare class QualityCache {
|
|
27
|
+
private db;
|
|
28
|
+
constructor(db: Database.Database);
|
|
29
|
+
enqueueFile(repo: string, filePath: string, currentRating: number, targetRating: number, priorityScore: number): void;
|
|
30
|
+
getQueue(statusFilter?: string, repoFilter?: string): Array<{
|
|
31
|
+
id: number;
|
|
32
|
+
repo: string;
|
|
33
|
+
file_path: string;
|
|
34
|
+
current_rating: number;
|
|
35
|
+
target_rating: number;
|
|
36
|
+
priority_score: number;
|
|
37
|
+
status: string;
|
|
38
|
+
attempts: number;
|
|
39
|
+
max_attempts: number;
|
|
40
|
+
worker_id: string | null;
|
|
41
|
+
locked_at: number | null;
|
|
42
|
+
error_message: string | null;
|
|
43
|
+
completed_at: number | null;
|
|
44
|
+
created_at: number;
|
|
45
|
+
}>;
|
|
46
|
+
getQueueItem(itemId: number): QueueRow | undefined;
|
|
47
|
+
updateQueueItem(itemId: number, updates: Record<string, unknown>): void;
|
|
48
|
+
logAttempt(entry: {
|
|
49
|
+
queueId: number;
|
|
50
|
+
attempt: number;
|
|
51
|
+
ratingBefore: number;
|
|
52
|
+
ratingAfter?: number;
|
|
53
|
+
violationsFixed?: number;
|
|
54
|
+
violationsRemaining?: number;
|
|
55
|
+
fixSummary?: string;
|
|
56
|
+
errorMessage?: string;
|
|
57
|
+
durationMs?: number;
|
|
58
|
+
workerOutput?: string;
|
|
59
|
+
}): void;
|
|
60
|
+
getAttemptLogWithOutput(queueId: number): Array<{
|
|
61
|
+
id: number;
|
|
62
|
+
queue_id: number;
|
|
63
|
+
attempt: number;
|
|
64
|
+
rating_before: number;
|
|
65
|
+
rating_after: number | null;
|
|
66
|
+
violations_fixed: number;
|
|
67
|
+
violations_remaining: number;
|
|
68
|
+
fix_summary: string | null;
|
|
69
|
+
error_message: string | null;
|
|
70
|
+
duration_ms: number | null;
|
|
71
|
+
worker_output: string | null;
|
|
72
|
+
created_at: number;
|
|
73
|
+
}>;
|
|
74
|
+
getAttemptLog(queueId: number): Array<{
|
|
75
|
+
id: number;
|
|
76
|
+
queue_id: number;
|
|
77
|
+
attempt: number;
|
|
78
|
+
rating_before: number;
|
|
79
|
+
rating_after: number | null;
|
|
80
|
+
violations_fixed: number;
|
|
81
|
+
violations_remaining: number;
|
|
82
|
+
fix_summary: string | null;
|
|
83
|
+
error_message: string | null;
|
|
84
|
+
duration_ms: number | null;
|
|
85
|
+
created_at: number;
|
|
86
|
+
}>;
|
|
87
|
+
recordTrend(repo: string, overallRating: number, filesTotal: number, filesPassed: number, filesFailed: number, filesPending: number): void;
|
|
88
|
+
getTrends(repo?: string, limit?: number): Array<{
|
|
89
|
+
id: number;
|
|
90
|
+
repo: string;
|
|
91
|
+
overall_rating: number;
|
|
92
|
+
files_total: number;
|
|
93
|
+
files_passed: number;
|
|
94
|
+
files_failed: number;
|
|
95
|
+
files_pending: number;
|
|
96
|
+
recorded_at: number;
|
|
97
|
+
}>;
|
|
98
|
+
saveCheckpoint(reason: string, queueSnapshot: string, filesFixed: number, overallRating: number): void;
|
|
99
|
+
getLatestCheckpoint(): {
|
|
100
|
+
id: number;
|
|
101
|
+
reason: string;
|
|
102
|
+
queue_snapshot: string;
|
|
103
|
+
files_fixed: number;
|
|
104
|
+
overall_rating: number;
|
|
105
|
+
created_at: number;
|
|
106
|
+
} | null;
|
|
107
|
+
acquireLock(filePath: string, workerId: string, ttlMs?: number): boolean;
|
|
108
|
+
releaseLock(filePath: string, workerId: string): void;
|
|
109
|
+
getQueueStats(): QueueStats;
|
|
110
|
+
getStaleLocks(ttlMs?: number): Array<{
|
|
111
|
+
file_path: string;
|
|
112
|
+
worker_id: string;
|
|
113
|
+
locked_at: number;
|
|
114
|
+
}>;
|
|
115
|
+
clearStaleLocks(ttlMs?: number): number;
|
|
116
|
+
clearQualityQueue(): number;
|
|
117
|
+
}
|
|
118
|
+
export {};
|
|
119
|
+
//# sourceMappingURL=quality-cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quality-cache.d.ts","sourceRoot":"","sources":["../../src/cache/quality-cache.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAEtC,UAAU,QAAQ;IAChB,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAC3F,cAAc,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAC/E,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IACjF,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;CACjD;AA6BD,UAAU,UAAU;IAClB,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;CACzG;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,EAAE,CAAoB;gBAElB,EAAE,EAAE,QAAQ,CAAC,QAAQ;IAIjC,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,IAAI;IAYrH,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;QAC1D,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QAC3F,cAAc,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAC/E,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;QACjF,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;KACjD,CAAC;IASF,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS;IAIlD,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAYvE,UAAU,CAAC,KAAK,EAAE;QAChB,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAC;QAC7E,eAAe,CAAC,EAAE,MAAM,CAAC;QAAC,mBAAmB,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAC;QAC5E,YAAY,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAC;KACnE,GAAG,IAAI;IAYR,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,KAAK,CAAC;QAC9C,EAAE,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;QAClG,gBAAgB,EAAE,MAAM,CAAC;QAAC,oBAAoB,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;QACnF,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;KAC5G,CAAC;IAIF,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,KAAK,CAAC;QACpC,EAAE,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;QAClG,gBAAgB,EAAE,MAAM,CAAC;QAAC,oBAAoB,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;QACnF,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;KAC9E,CAAC;IAIF,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI;IAO1I,SAAS,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,SAAK,GAAG,KAAK,CAAC;QAC1C,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QACtE,YAAY,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;KACxF,CAAC;IASF,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,IAAI;IAOtG,mBAAmB,IAAI;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAIrJ,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,SAAU,GAAG,OAAO;IAazE,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAIrD,aAAa,IAAI,UAAU;IAY3B,aAAa,CAAC,KAAK,SAAU,GAAG,KAAK,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;IAKlG,eAAe,CAAC,KAAK,SAAU,GAAG,MAAM;IAKxC,iBAAiB,IAAI,MAAM;CAM5B"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.QualityCache = void 0;
|
|
4
|
+
class QualityCache {
|
|
5
|
+
db;
|
|
6
|
+
constructor(db) {
|
|
7
|
+
this.db = db;
|
|
8
|
+
}
|
|
9
|
+
enqueueFile(repo, filePath, currentRating, targetRating, priorityScore) {
|
|
10
|
+
this.db.prepare(`
|
|
11
|
+
INSERT INTO quality_queue (repo, file_path, current_rating, target_rating, priority_score, created_at)
|
|
12
|
+
VALUES (?, ?, ?, ?, ?, ?)
|
|
13
|
+
ON CONFLICT(repo, file_path) DO UPDATE SET
|
|
14
|
+
current_rating = excluded.current_rating,
|
|
15
|
+
target_rating = excluded.target_rating,
|
|
16
|
+
priority_score = excluded.priority_score,
|
|
17
|
+
status = CASE WHEN quality_queue.status = 'pending' THEN 'pending' ELSE quality_queue.status END
|
|
18
|
+
`).run(repo, filePath, currentRating, targetRating, priorityScore, Date.now());
|
|
19
|
+
}
|
|
20
|
+
getQueue(statusFilter, repoFilter) {
|
|
21
|
+
let sql = 'SELECT * FROM quality_queue WHERE 1=1';
|
|
22
|
+
const params = [];
|
|
23
|
+
if (statusFilter) {
|
|
24
|
+
sql += ' AND status = ?';
|
|
25
|
+
params.push(statusFilter);
|
|
26
|
+
}
|
|
27
|
+
if (repoFilter) {
|
|
28
|
+
sql += ' AND repo = ?';
|
|
29
|
+
params.push(repoFilter);
|
|
30
|
+
}
|
|
31
|
+
sql += ' ORDER BY priority_score DESC';
|
|
32
|
+
return this.db.prepare(sql).all(...params);
|
|
33
|
+
}
|
|
34
|
+
getQueueItem(itemId) {
|
|
35
|
+
return this.db.prepare('SELECT * FROM quality_queue WHERE id = ?').get(itemId);
|
|
36
|
+
}
|
|
37
|
+
updateQueueItem(itemId, updates) {
|
|
38
|
+
const setClauses = [];
|
|
39
|
+
const params = [];
|
|
40
|
+
for (const [key, val] of Object.entries(updates)) {
|
|
41
|
+
setClauses.push(`${key} = ?`);
|
|
42
|
+
params.push(val);
|
|
43
|
+
}
|
|
44
|
+
if (setClauses.length === 0)
|
|
45
|
+
return;
|
|
46
|
+
params.push(itemId);
|
|
47
|
+
this.db.prepare(`UPDATE quality_queue SET ${setClauses.join(', ')} WHERE id = ?`).run(...params);
|
|
48
|
+
}
|
|
49
|
+
logAttempt(entry) {
|
|
50
|
+
this.db.prepare(`
|
|
51
|
+
INSERT INTO quality_attempt_log (queue_id, attempt, rating_before, rating_after, violations_fixed, violations_remaining, fix_summary, error_message, duration_ms, worker_output, created_at)
|
|
52
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
53
|
+
`).run(entry.queueId, entry.attempt, entry.ratingBefore, entry.ratingAfter ?? null, entry.violationsFixed ?? 0, entry.violationsRemaining ?? 0, entry.fixSummary ?? null, entry.errorMessage ?? null, entry.durationMs ?? null, entry.workerOutput ?? null, Date.now());
|
|
54
|
+
}
|
|
55
|
+
getAttemptLogWithOutput(queueId) {
|
|
56
|
+
return this.db.prepare('SELECT * FROM quality_attempt_log WHERE queue_id = ? ORDER BY attempt ASC').all(queueId);
|
|
57
|
+
}
|
|
58
|
+
getAttemptLog(queueId) {
|
|
59
|
+
return this.db.prepare('SELECT * FROM quality_attempt_log WHERE queue_id = ? ORDER BY attempt ASC').all(queueId);
|
|
60
|
+
}
|
|
61
|
+
recordTrend(repo, overallRating, filesTotal, filesPassed, filesFailed, filesPending) {
|
|
62
|
+
this.db.prepare(`
|
|
63
|
+
INSERT INTO quality_trend (repo, overall_rating, files_total, files_passed, files_failed, files_pending, recorded_at)
|
|
64
|
+
VALUES (?, ?, ?, ?, ?, ?, ?)
|
|
65
|
+
`).run(repo, overallRating, filesTotal, filesPassed, filesFailed, filesPending, Date.now());
|
|
66
|
+
}
|
|
67
|
+
getTrends(repo, limit = 50) {
|
|
68
|
+
let sql = 'SELECT * FROM quality_trend WHERE 1=1';
|
|
69
|
+
const params = [];
|
|
70
|
+
if (repo) {
|
|
71
|
+
sql += ' AND repo = ?';
|
|
72
|
+
params.push(repo);
|
|
73
|
+
}
|
|
74
|
+
sql += ' ORDER BY recorded_at ASC LIMIT ?';
|
|
75
|
+
params.push(limit);
|
|
76
|
+
return this.db.prepare(sql).all(...params);
|
|
77
|
+
}
|
|
78
|
+
saveCheckpoint(reason, queueSnapshot, filesFixed, overallRating) {
|
|
79
|
+
this.db.prepare(`
|
|
80
|
+
INSERT INTO quality_checkpoints (reason, queue_snapshot, files_fixed, overall_rating, created_at)
|
|
81
|
+
VALUES (?, ?, ?, ?, ?)
|
|
82
|
+
`).run(reason, queueSnapshot, filesFixed, overallRating, Date.now());
|
|
83
|
+
}
|
|
84
|
+
getLatestCheckpoint() {
|
|
85
|
+
return this.db.prepare('SELECT * FROM quality_checkpoints ORDER BY created_at DESC LIMIT 1').get() ?? null;
|
|
86
|
+
}
|
|
87
|
+
acquireLock(filePath, workerId, ttlMs = 300_000) {
|
|
88
|
+
const existing = this.db.prepare('SELECT * FROM quality_file_locks WHERE file_path = ?').get(filePath);
|
|
89
|
+
if (existing) {
|
|
90
|
+
if (Date.now() - existing.locked_at > ttlMs) {
|
|
91
|
+
this.db.prepare('DELETE FROM quality_file_locks WHERE file_path = ?').run(filePath);
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
return false;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
this.db.prepare('INSERT OR REPLACE INTO quality_file_locks (file_path, worker_id, locked_at) VALUES (?, ?, ?)').run(filePath, workerId, Date.now());
|
|
98
|
+
return true;
|
|
99
|
+
}
|
|
100
|
+
releaseLock(filePath, workerId) {
|
|
101
|
+
this.db.prepare('DELETE FROM quality_file_locks WHERE file_path = ? AND worker_id = ?').run(filePath, workerId);
|
|
102
|
+
}
|
|
103
|
+
getQueueStats() {
|
|
104
|
+
const rows = this.db.prepare(`
|
|
105
|
+
SELECT status, COUNT(*) as cnt FROM quality_queue GROUP BY status
|
|
106
|
+
`).all();
|
|
107
|
+
const stats = { total: 0, pending: 0, in_progress: 0, completed: 0, failed: 0, skipped: 0 };
|
|
108
|
+
for (const row of rows) {
|
|
109
|
+
stats.total += row.cnt;
|
|
110
|
+
stats[row.status] = row.cnt;
|
|
111
|
+
}
|
|
112
|
+
return stats;
|
|
113
|
+
}
|
|
114
|
+
getStaleLocks(ttlMs = 300_000) {
|
|
115
|
+
const cutoff = Date.now() - ttlMs;
|
|
116
|
+
return this.db.prepare('SELECT * FROM quality_file_locks WHERE locked_at < ?').all(cutoff);
|
|
117
|
+
}
|
|
118
|
+
clearStaleLocks(ttlMs = 300_000) {
|
|
119
|
+
const cutoff = Date.now() - ttlMs;
|
|
120
|
+
return this.db.prepare('DELETE FROM quality_file_locks WHERE locked_at < ?').run(cutoff).changes;
|
|
121
|
+
}
|
|
122
|
+
clearQualityQueue() {
|
|
123
|
+
const removed = this.db.prepare('DELETE FROM quality_queue').run().changes;
|
|
124
|
+
this.db.prepare('DELETE FROM quality_attempt_log').run();
|
|
125
|
+
this.db.prepare('DELETE FROM quality_trend').run();
|
|
126
|
+
return removed;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
exports.QualityCache = QualityCache;
|
|
130
|
+
//# sourceMappingURL=quality-cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quality-cache.js","sourceRoot":"","sources":["../../src/cache/quality-cache.ts"],"names":[],"mappings":";;;AAwCA,MAAa,YAAY;IACf,EAAE,CAAoB;IAE9B,YAAY,EAAqB;QAC/B,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;IACf,CAAC;IAED,WAAW,CAAC,IAAY,EAAE,QAAgB,EAAE,aAAqB,EAAE,YAAoB,EAAE,aAAqB;QAC5G,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;;;;;;KAQf,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,EAAE,aAAa,EAAE,YAAY,EAAE,aAAa,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IACjF,CAAC;IAED,QAAQ,CAAC,YAAqB,EAAE,UAAmB;QAMjD,IAAI,GAAG,GAAG,uCAAuC,CAAC;QAClD,MAAM,MAAM,GAAc,EAAE,CAAC;QAC7B,IAAI,YAAY,EAAE,CAAC;YAAC,GAAG,IAAI,iBAAiB,CAAC;YAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAAC,CAAC;QAC1E,IAAI,UAAU,EAAE,CAAC;YAAC,GAAG,IAAI,eAAe,CAAC;YAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAAC,CAAC;QACpE,GAAG,IAAI,+BAA+B,CAAC;QACvC,OAAO,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,MAAM,CAAe,CAAC;IAC3D,CAAC;IAED,YAAY,CAAC,MAAc;QACzB,OAAO,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,0CAA0C,CAAC,CAAC,GAAG,CAAC,MAAM,CAAyB,CAAC;IACzG,CAAC;IAED,eAAe,CAAC,MAAc,EAAE,OAAgC;QAC9D,MAAM,UAAU,GAAa,EAAE,CAAC;QAChC,MAAM,MAAM,GAAc,EAAE,CAAC;QAC7B,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YACjD,UAAU,CAAC,IAAI,CAAC,GAAG,GAAG,MAAM,CAAC,CAAC;YAC9B,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACnB,CAAC;QACD,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QACpC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACpB,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,4BAA4B,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC;IACnG,CAAC;IAED,UAAU,CAAC,KAIV;QACC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;KAGf,CAAC,CAAC,GAAG,CACJ,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC,WAAW,IAAI,IAAI,EAC3E,KAAK,CAAC,eAAe,IAAI,CAAC,EAAE,KAAK,CAAC,mBAAmB,IAAI,CAAC,EAC1D,KAAK,CAAC,UAAU,IAAI,IAAI,EAAE,KAAK,CAAC,YAAY,IAAI,IAAI,EAAE,KAAK,CAAC,UAAU,IAAI,IAAI,EAC9E,KAAK,CAAC,YAAY,IAAI,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,CACvC,CAAC;IACJ,CAAC;IAED,uBAAuB,CAAC,OAAe;QAKrC,OAAO,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,2EAA2E,CAAC,CAAC,GAAG,CAAC,OAAO,CAA8B,CAAC;IAChJ,CAAC;IAED,aAAa,CAAC,OAAe;QAK3B,OAAO,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,2EAA2E,CAAC,CAAC,GAAG,CAAC,OAAO,CAAoB,CAAC;IACtI,CAAC;IAED,WAAW,CAAC,IAAY,EAAE,aAAqB,EAAE,UAAkB,EAAE,WAAmB,EAAE,WAAmB,EAAE,YAAoB;QACjI,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;KAGf,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,aAAa,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,YAAY,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IAC9F,CAAC;IAED,SAAS,CAAC,IAAa,EAAE,KAAK,GAAG,EAAE;QAIjC,IAAI,GAAG,GAAG,uCAAuC,CAAC;QAClD,MAAM,MAAM,GAAc,EAAE,CAAC;QAC7B,IAAI,IAAI,EAAE,CAAC;YAAC,GAAG,IAAI,eAAe,CAAC;YAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAAC,CAAC;QACxD,GAAG,IAAI,mCAAmC,CAAC;QAC3C,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnB,OAAO,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,MAAM,CAAe,CAAC;IAC3D,CAAC;IAED,cAAc,CAAC,MAAc,EAAE,aAAqB,EAAE,UAAkB,EAAE,aAAqB;QAC7F,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;KAGf,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,aAAa,EAAE,UAAU,EAAE,aAAa,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IACvE,CAAC;IAED,mBAAmB;QACjB,OAAO,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,oEAAoE,CAAC,CAAC,GAAG,EAA+B,IAAI,IAAI,CAAC;IAC1I,CAAC;IAED,WAAW,CAAC,QAAgB,EAAE,QAAgB,EAAE,KAAK,GAAG,OAAO;QAC7D,MAAM,QAAQ,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,sDAAsD,CAAC,CAAC,GAAG,CAAC,QAAQ,CAA4B,CAAC;QAClI,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,CAAC,SAAS,GAAG,KAAK,EAAE,CAAC;gBAC5C,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,oDAAoD,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACtF,CAAC;iBAAM,CAAC;gBACN,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;QACD,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,8FAA8F,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;QACpJ,OAAO,IAAI,CAAC;IACd,CAAC;IAED,WAAW,CAAC,QAAgB,EAAE,QAAgB;QAC5C,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,sEAAsE,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAClH,CAAC;IAED,aAAa;QACX,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;KAE5B,CAAC,CAAC,GAAG,EAAqB,CAAC;QAC5B,MAAM,KAAK,GAAe,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;QACxG,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,KAAK,CAAC,KAAK,IAAI,GAAG,CAAC,GAAG,CAAC;YACtB,KAA2C,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC;QACrE,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,aAAa,CAAC,KAAK,GAAG,OAAO;QAC3B,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;QAClC,OAAO,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,sDAAsD,CAAC,CAAC,GAAG,CAAC,MAAM,CAAkB,CAAC;IAC9G,CAAC;IAED,eAAe,CAAC,KAAK,GAAG,OAAO;QAC7B,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;QAClC,OAAO,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,oDAAoD,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC;IACnG,CAAC;IAED,iBAAiB;QACf,MAAM,OAAO,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,2BAA2B,CAAC,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC;QAC3E,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,iCAAiC,CAAC,CAAC,GAAG,EAAE,CAAC;QACzD,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,2BAA2B,CAAC,CAAC,GAAG,EAAE,CAAC;QACnD,OAAO,OAAO,CAAC;IACjB,CAAC;CACF;AA5JD,oCA4JC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { FileAnalysis, RepoMetadata } from '../types';
|
|
2
|
+
import { QualityCache } from './quality-cache';
|
|
3
|
+
export declare class SqliteCache {
|
|
4
|
+
private db;
|
|
5
|
+
readonly quality: QualityCache;
|
|
6
|
+
constructor(dbPath?: string);
|
|
7
|
+
private migrate;
|
|
8
|
+
private init;
|
|
9
|
+
save(analysis: FileAnalysis): void;
|
|
10
|
+
get(filePath: string, repoRoot: string): FileAnalysis | null;
|
|
11
|
+
getAll(repoRoot?: string): FileAnalysis[];
|
|
12
|
+
getRepos(): string[];
|
|
13
|
+
getRatingHistory(filePath: string, repoRoot: string, limit?: number): Array<{
|
|
14
|
+
rating: number;
|
|
15
|
+
recorded_at: number;
|
|
16
|
+
}>;
|
|
17
|
+
getOverallRating(repoRoot: string): number;
|
|
18
|
+
saveNodePosition(repo: string, nodeId: string, x: number, y: number): void;
|
|
19
|
+
getNodePositions(repo: string): Array<{
|
|
20
|
+
nodeId: string;
|
|
21
|
+
x: number;
|
|
22
|
+
y: number;
|
|
23
|
+
}>;
|
|
24
|
+
deleteFile(filePath: string, repoRoot: string): boolean;
|
|
25
|
+
clearRepo(repo: string): number;
|
|
26
|
+
saveRepository(repo: RepoMetadata): void;
|
|
27
|
+
getRepository(repoId: string): RepoMetadata | null;
|
|
28
|
+
getRepositoryByPath(repoPath: string): RepoMetadata | null;
|
|
29
|
+
getAllRepositories(activeOnly?: boolean): RepoMetadata[];
|
|
30
|
+
getRepositoriesBySession(sessionId: string): RepoMetadata[];
|
|
31
|
+
updateRepositoryStats(repoId: string, fileCount: number, overallRating: number): void;
|
|
32
|
+
deleteRepository(repoId: string): number;
|
|
33
|
+
private rowToRepoMetadata;
|
|
34
|
+
close(): void;
|
|
35
|
+
getExcludePatterns(repo: string): Array<{
|
|
36
|
+
id: number;
|
|
37
|
+
pattern: string;
|
|
38
|
+
label: string | null;
|
|
39
|
+
}>;
|
|
40
|
+
addExcludePattern(repo: string, pattern: string, label?: string): number;
|
|
41
|
+
removeExcludePattern(id: number): boolean;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=sqlite-cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlite-cache.d.ts","sourceRoot":"","sources":["../../src/cache/sqlite-cache.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAsB/C,qBAAa,WAAW;IACtB,OAAO,CAAC,EAAE,CAAoB;IAC9B,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAC;gBAEnB,MAAM,SAAU;IAQ5B,OAAO,CAAC,OAAO;IAef,OAAO,CAAC,IAAI;IA2HZ,IAAI,CAAC,QAAQ,EAAE,YAAY,GAAG,IAAI;IAoBlC,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI;IAO5D,MAAM,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,YAAY,EAAE;IAQzC,QAAQ,IAAI,MAAM,EAAE;IAOpB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,SAAK,GAAG,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;IAMhH,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;IAO1C,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI;IAM1E,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAO/E,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO;IAOvD,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAQ/B,cAAc,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI;IAwBxC,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI;IAOlD,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI;IAO1D,kBAAkB,CAAC,UAAU,UAAQ,GAAG,YAAY,EAAE;IAQtD,wBAAwB,CAAC,SAAS,EAAE,MAAM,GAAG,YAAY,EAAE;IAO3D,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,IAAI;IAQrF,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAOxC,OAAO,CAAC,iBAAiB;IAezB,KAAK,IAAI,IAAI;IAKb,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IAM9F,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM;IAOxE,oBAAoB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;CAG1C"}
|
|
@@ -0,0 +1,346 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.SqliteCache = void 0;
|
|
40
|
+
const better_sqlite3_1 = __importDefault(require("better-sqlite3"));
|
|
41
|
+
const path = __importStar(require("path"));
|
|
42
|
+
const fs = __importStar(require("fs"));
|
|
43
|
+
const quality_cache_1 = require("./quality-cache");
|
|
44
|
+
const DB_PATH = path.join(process.env.HOME ?? '/tmp', '.gate-keeper', 'cache.db');
|
|
45
|
+
class SqliteCache {
|
|
46
|
+
db;
|
|
47
|
+
quality;
|
|
48
|
+
constructor(dbPath = DB_PATH) {
|
|
49
|
+
fs.mkdirSync(path.dirname(dbPath), { recursive: true });
|
|
50
|
+
this.db = new better_sqlite3_1.default(dbPath);
|
|
51
|
+
this.migrate();
|
|
52
|
+
this.init();
|
|
53
|
+
this.quality = new quality_cache_1.QualityCache(this.db);
|
|
54
|
+
}
|
|
55
|
+
migrate() {
|
|
56
|
+
// Drop old single-tenant schema (no `repo` column) so we start clean.
|
|
57
|
+
const cols = this.db.prepare('PRAGMA table_info(analyses)').all();
|
|
58
|
+
if (cols.length > 0 && !cols.some(c => c.name === 'repo')) {
|
|
59
|
+
this.db.exec('DROP TABLE IF EXISTS analyses; DROP TABLE IF EXISTS rating_history;');
|
|
60
|
+
}
|
|
61
|
+
// Add worker_output column to quality_attempt_log if missing
|
|
62
|
+
try {
|
|
63
|
+
const alCols = this.db.prepare('PRAGMA table_info(quality_attempt_log)').all();
|
|
64
|
+
if (!alCols.some(c => c.name === 'worker_output')) {
|
|
65
|
+
this.db.exec('ALTER TABLE quality_attempt_log ADD COLUMN worker_output TEXT');
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
catch { /* table may not exist yet, init() will create it */ }
|
|
69
|
+
}
|
|
70
|
+
init() {
|
|
71
|
+
this.db.exec(`
|
|
72
|
+
CREATE TABLE IF NOT EXISTS analyses (
|
|
73
|
+
repo TEXT NOT NULL,
|
|
74
|
+
path TEXT NOT NULL,
|
|
75
|
+
language TEXT NOT NULL,
|
|
76
|
+
data TEXT NOT NULL,
|
|
77
|
+
rating REAL NOT NULL,
|
|
78
|
+
analyzed_at INTEGER NOT NULL,
|
|
79
|
+
PRIMARY KEY (repo, path)
|
|
80
|
+
);
|
|
81
|
+
|
|
82
|
+
CREATE TABLE IF NOT EXISTS rating_history (
|
|
83
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
84
|
+
repo TEXT NOT NULL,
|
|
85
|
+
path TEXT NOT NULL,
|
|
86
|
+
rating REAL NOT NULL,
|
|
87
|
+
recorded_at INTEGER NOT NULL
|
|
88
|
+
);
|
|
89
|
+
|
|
90
|
+
CREATE TABLE IF NOT EXISTS node_positions (
|
|
91
|
+
repo TEXT NOT NULL,
|
|
92
|
+
node_id TEXT NOT NULL,
|
|
93
|
+
x REAL NOT NULL,
|
|
94
|
+
y REAL NOT NULL,
|
|
95
|
+
PRIMARY KEY (repo, node_id)
|
|
96
|
+
);
|
|
97
|
+
|
|
98
|
+
CREATE TABLE IF NOT EXISTS repositories (
|
|
99
|
+
id TEXT PRIMARY KEY,
|
|
100
|
+
path TEXT NOT NULL UNIQUE,
|
|
101
|
+
name TEXT NOT NULL,
|
|
102
|
+
session_id TEXT,
|
|
103
|
+
session_type TEXT DEFAULT 'unknown',
|
|
104
|
+
created_at INTEGER NOT NULL,
|
|
105
|
+
last_analyzed INTEGER,
|
|
106
|
+
file_count INTEGER DEFAULT 0,
|
|
107
|
+
overall_rating REAL DEFAULT 10.0,
|
|
108
|
+
is_active INTEGER DEFAULT 1
|
|
109
|
+
);
|
|
110
|
+
|
|
111
|
+
CREATE INDEX IF NOT EXISTS idx_analyses_repo ON analyses(repo);
|
|
112
|
+
CREATE INDEX IF NOT EXISTS idx_rh_repo_path ON rating_history(repo, path);
|
|
113
|
+
CREATE INDEX IF NOT EXISTS idx_rh_time ON rating_history(recorded_at);
|
|
114
|
+
CREATE INDEX IF NOT EXISTS idx_repos_session ON repositories(session_id);
|
|
115
|
+
CREATE INDEX IF NOT EXISTS idx_repos_active ON repositories(is_active);
|
|
116
|
+
|
|
117
|
+
CREATE TABLE IF NOT EXISTS quality_queue (
|
|
118
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
119
|
+
repo TEXT NOT NULL,
|
|
120
|
+
file_path TEXT NOT NULL,
|
|
121
|
+
current_rating REAL NOT NULL,
|
|
122
|
+
target_rating REAL NOT NULL DEFAULT 7.0,
|
|
123
|
+
priority_score REAL NOT NULL DEFAULT 0,
|
|
124
|
+
status TEXT NOT NULL DEFAULT 'pending',
|
|
125
|
+
attempts INTEGER NOT NULL DEFAULT 0,
|
|
126
|
+
max_attempts INTEGER NOT NULL DEFAULT 3,
|
|
127
|
+
worker_id TEXT,
|
|
128
|
+
locked_at INTEGER,
|
|
129
|
+
error_message TEXT,
|
|
130
|
+
completed_at INTEGER,
|
|
131
|
+
created_at INTEGER NOT NULL,
|
|
132
|
+
UNIQUE(repo, file_path)
|
|
133
|
+
);
|
|
134
|
+
|
|
135
|
+
CREATE TABLE IF NOT EXISTS quality_attempt_log (
|
|
136
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
137
|
+
queue_id INTEGER NOT NULL REFERENCES quality_queue(id),
|
|
138
|
+
attempt INTEGER NOT NULL,
|
|
139
|
+
rating_before REAL NOT NULL,
|
|
140
|
+
rating_after REAL,
|
|
141
|
+
violations_fixed INTEGER DEFAULT 0,
|
|
142
|
+
violations_remaining INTEGER DEFAULT 0,
|
|
143
|
+
fix_summary TEXT,
|
|
144
|
+
error_message TEXT,
|
|
145
|
+
duration_ms INTEGER,
|
|
146
|
+
worker_output TEXT,
|
|
147
|
+
created_at INTEGER NOT NULL
|
|
148
|
+
);
|
|
149
|
+
|
|
150
|
+
CREATE TABLE IF NOT EXISTS quality_trend (
|
|
151
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
152
|
+
repo TEXT NOT NULL,
|
|
153
|
+
overall_rating REAL NOT NULL,
|
|
154
|
+
files_total INTEGER NOT NULL,
|
|
155
|
+
files_passed INTEGER NOT NULL,
|
|
156
|
+
files_failed INTEGER NOT NULL,
|
|
157
|
+
files_pending INTEGER NOT NULL,
|
|
158
|
+
recorded_at INTEGER NOT NULL
|
|
159
|
+
);
|
|
160
|
+
|
|
161
|
+
CREATE TABLE IF NOT EXISTS quality_checkpoints (
|
|
162
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
163
|
+
reason TEXT NOT NULL,
|
|
164
|
+
queue_snapshot TEXT NOT NULL,
|
|
165
|
+
files_fixed INTEGER NOT NULL,
|
|
166
|
+
overall_rating REAL NOT NULL,
|
|
167
|
+
created_at INTEGER NOT NULL
|
|
168
|
+
);
|
|
169
|
+
|
|
170
|
+
CREATE TABLE IF NOT EXISTS quality_file_locks (
|
|
171
|
+
file_path TEXT PRIMARY KEY,
|
|
172
|
+
worker_id TEXT NOT NULL,
|
|
173
|
+
locked_at INTEGER NOT NULL
|
|
174
|
+
);
|
|
175
|
+
|
|
176
|
+
CREATE INDEX IF NOT EXISTS idx_qq_status ON quality_queue(status);
|
|
177
|
+
CREATE INDEX IF NOT EXISTS idx_qq_priority ON quality_queue(priority_score DESC);
|
|
178
|
+
CREATE INDEX IF NOT EXISTS idx_qq_repo ON quality_queue(repo);
|
|
179
|
+
CREATE INDEX IF NOT EXISTS idx_qal_queue_id ON quality_attempt_log(queue_id);
|
|
180
|
+
CREATE INDEX IF NOT EXISTS idx_qt_recorded_at ON quality_trend(recorded_at);
|
|
181
|
+
CREATE INDEX IF NOT EXISTS idx_qc_created_at ON quality_checkpoints(created_at);
|
|
182
|
+
|
|
183
|
+
CREATE TABLE IF NOT EXISTS exclude_patterns (
|
|
184
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
185
|
+
repo TEXT NOT NULL,
|
|
186
|
+
pattern TEXT NOT NULL,
|
|
187
|
+
label TEXT,
|
|
188
|
+
UNIQUE(repo, pattern)
|
|
189
|
+
);
|
|
190
|
+
`);
|
|
191
|
+
}
|
|
192
|
+
save(analysis) {
|
|
193
|
+
const repo = analysis.repoRoot ?? '';
|
|
194
|
+
this.db.prepare(`
|
|
195
|
+
INSERT OR REPLACE INTO analyses (repo, path, language, data, rating, analyzed_at)
|
|
196
|
+
VALUES (@repo, @path, @language, @data, @rating, @analyzed_at)
|
|
197
|
+
`).run({
|
|
198
|
+
repo,
|
|
199
|
+
path: analysis.path,
|
|
200
|
+
language: analysis.language,
|
|
201
|
+
data: JSON.stringify(analysis),
|
|
202
|
+
rating: analysis.rating,
|
|
203
|
+
analyzed_at: analysis.analyzedAt
|
|
204
|
+
});
|
|
205
|
+
this.db.prepare(`
|
|
206
|
+
INSERT INTO rating_history (repo, path, rating, recorded_at)
|
|
207
|
+
VALUES (@repo, @path, @rating, @recorded_at)
|
|
208
|
+
`).run({ repo, path: analysis.path, rating: analysis.rating, recorded_at: analysis.analyzedAt });
|
|
209
|
+
}
|
|
210
|
+
get(filePath, repoRoot) {
|
|
211
|
+
const row = this.db
|
|
212
|
+
.prepare('SELECT data FROM analyses WHERE repo = ? AND path = ?')
|
|
213
|
+
.get(repoRoot, filePath);
|
|
214
|
+
return row ? JSON.parse(row.data) : null;
|
|
215
|
+
}
|
|
216
|
+
getAll(repoRoot) {
|
|
217
|
+
const rows = (repoRoot
|
|
218
|
+
? this.db.prepare('SELECT data FROM analyses WHERE repo = ? ORDER BY analyzed_at DESC').all(repoRoot)
|
|
219
|
+
: this.db.prepare('SELECT data FROM analyses ORDER BY analyzed_at DESC').all());
|
|
220
|
+
return rows.map(r => JSON.parse(r.data));
|
|
221
|
+
}
|
|
222
|
+
getRepos() {
|
|
223
|
+
const rows = this.db
|
|
224
|
+
.prepare('SELECT DISTINCT repo FROM analyses WHERE repo != \'\' ORDER BY repo')
|
|
225
|
+
.all();
|
|
226
|
+
return rows.map(r => r.repo);
|
|
227
|
+
}
|
|
228
|
+
getRatingHistory(filePath, repoRoot, limit = 20) {
|
|
229
|
+
return this.db
|
|
230
|
+
.prepare('SELECT rating, recorded_at FROM rating_history WHERE repo = ? AND path = ? ORDER BY recorded_at DESC LIMIT ?')
|
|
231
|
+
.all(repoRoot, filePath, limit);
|
|
232
|
+
}
|
|
233
|
+
getOverallRating(repoRoot) {
|
|
234
|
+
const row = this.db
|
|
235
|
+
.prepare('SELECT AVG(rating) as avg FROM analyses WHERE repo = ?')
|
|
236
|
+
.get(repoRoot);
|
|
237
|
+
return row.avg ?? 10;
|
|
238
|
+
}
|
|
239
|
+
saveNodePosition(repo, nodeId, x, y) {
|
|
240
|
+
this.db.prepare(`
|
|
241
|
+
INSERT OR REPLACE INTO node_positions (repo, node_id, x, y) VALUES (?, ?, ?, ?)
|
|
242
|
+
`).run(repo, nodeId, x, y);
|
|
243
|
+
}
|
|
244
|
+
getNodePositions(repo) {
|
|
245
|
+
return this.db
|
|
246
|
+
.prepare('SELECT node_id, x, y FROM node_positions WHERE repo = ?')
|
|
247
|
+
.all(repo)
|
|
248
|
+
.map(r => ({ nodeId: r.node_id, x: r.x, y: r.y }));
|
|
249
|
+
}
|
|
250
|
+
deleteFile(filePath, repoRoot) {
|
|
251
|
+
const deleted = this.db.prepare('DELETE FROM analyses WHERE repo = ? AND path = ?').run(repoRoot, filePath).changes;
|
|
252
|
+
this.db.prepare('DELETE FROM rating_history WHERE repo = ? AND path = ?').run(repoRoot, filePath);
|
|
253
|
+
this.db.prepare('DELETE FROM node_positions WHERE repo = ? AND node_id = ?').run(repoRoot, filePath);
|
|
254
|
+
return deleted > 0;
|
|
255
|
+
}
|
|
256
|
+
clearRepo(repo) {
|
|
257
|
+
const deletedAnalyses = this.db.prepare('DELETE FROM analyses WHERE repo = ?').run(repo).changes;
|
|
258
|
+
this.db.prepare('DELETE FROM rating_history WHERE repo = ?').run(repo);
|
|
259
|
+
this.db.prepare('DELETE FROM node_positions WHERE repo = ?').run(repo);
|
|
260
|
+
return deletedAnalyses;
|
|
261
|
+
}
|
|
262
|
+
// Repository management
|
|
263
|
+
saveRepository(repo) {
|
|
264
|
+
// ON CONFLICT preserves created_at / stats; only mutable session fields are updated
|
|
265
|
+
this.db.prepare(`
|
|
266
|
+
INSERT INTO repositories (id, path, name, session_id, session_type, created_at, last_analyzed, file_count, overall_rating, is_active)
|
|
267
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
268
|
+
ON CONFLICT(id) DO UPDATE SET
|
|
269
|
+
name = excluded.name,
|
|
270
|
+
session_id = excluded.session_id,
|
|
271
|
+
session_type = excluded.session_type,
|
|
272
|
+
is_active = excluded.is_active
|
|
273
|
+
`).run(repo.id, repo.path, repo.name, repo.sessionId || null, repo.sessionType, repo.createdAt, repo.lastAnalyzedAt || null, repo.fileCount || 0, repo.overallRating || 10.0, repo.isActive ? 1 : 0);
|
|
274
|
+
}
|
|
275
|
+
getRepository(repoId) {
|
|
276
|
+
const row = this.db
|
|
277
|
+
.prepare('SELECT * FROM repositories WHERE id = ?')
|
|
278
|
+
.get(repoId);
|
|
279
|
+
return row ? this.rowToRepoMetadata(row) : null;
|
|
280
|
+
}
|
|
281
|
+
getRepositoryByPath(repoPath) {
|
|
282
|
+
const row = this.db
|
|
283
|
+
.prepare('SELECT * FROM repositories WHERE path = ?')
|
|
284
|
+
.get(repoPath);
|
|
285
|
+
return row ? this.rowToRepoMetadata(row) : null;
|
|
286
|
+
}
|
|
287
|
+
getAllRepositories(activeOnly = false) {
|
|
288
|
+
const query = activeOnly
|
|
289
|
+
? 'SELECT * FROM repositories WHERE is_active = 1 ORDER BY created_at DESC'
|
|
290
|
+
: 'SELECT * FROM repositories ORDER BY created_at DESC';
|
|
291
|
+
const rows = this.db.prepare(query).all();
|
|
292
|
+
return rows.map(r => this.rowToRepoMetadata(r));
|
|
293
|
+
}
|
|
294
|
+
getRepositoriesBySession(sessionId) {
|
|
295
|
+
const rows = this.db
|
|
296
|
+
.prepare('SELECT * FROM repositories WHERE session_id = ? ORDER BY created_at DESC')
|
|
297
|
+
.all(sessionId);
|
|
298
|
+
return rows.map(r => this.rowToRepoMetadata(r));
|
|
299
|
+
}
|
|
300
|
+
updateRepositoryStats(repoId, fileCount, overallRating) {
|
|
301
|
+
this.db.prepare(`
|
|
302
|
+
UPDATE repositories
|
|
303
|
+
SET file_count = ?, overall_rating = ?, last_analyzed = ?
|
|
304
|
+
WHERE id = ?
|
|
305
|
+
`).run(fileCount, overallRating, Date.now(), repoId);
|
|
306
|
+
}
|
|
307
|
+
deleteRepository(repoId) {
|
|
308
|
+
const repo = this.getRepository(repoId);
|
|
309
|
+
if (!repo)
|
|
310
|
+
return 0;
|
|
311
|
+
this.clearRepo(repo.path);
|
|
312
|
+
return this.db.prepare('DELETE FROM repositories WHERE id = ?').run(repoId).changes;
|
|
313
|
+
}
|
|
314
|
+
rowToRepoMetadata(row) {
|
|
315
|
+
return {
|
|
316
|
+
id: row.id,
|
|
317
|
+
path: row.path,
|
|
318
|
+
name: row.name,
|
|
319
|
+
sessionId: row.session_id ?? undefined,
|
|
320
|
+
sessionType: row.session_type || 'unknown',
|
|
321
|
+
createdAt: row.created_at,
|
|
322
|
+
lastAnalyzedAt: row.last_analyzed ?? undefined,
|
|
323
|
+
fileCount: row.file_count,
|
|
324
|
+
overallRating: row.overall_rating,
|
|
325
|
+
isActive: row.is_active === 1
|
|
326
|
+
};
|
|
327
|
+
}
|
|
328
|
+
close() {
|
|
329
|
+
this.db.close();
|
|
330
|
+
}
|
|
331
|
+
// Exclude patterns
|
|
332
|
+
getExcludePatterns(repo) {
|
|
333
|
+
return this.db
|
|
334
|
+
.prepare('SELECT id, pattern, label FROM exclude_patterns WHERE repo = ? ORDER BY id')
|
|
335
|
+
.all(repo);
|
|
336
|
+
}
|
|
337
|
+
addExcludePattern(repo, pattern, label) {
|
|
338
|
+
const result = this.db.prepare('INSERT OR IGNORE INTO exclude_patterns (repo, pattern, label) VALUES (?, ?, ?)').run(repo, pattern, label ?? null);
|
|
339
|
+
return result.lastInsertRowid;
|
|
340
|
+
}
|
|
341
|
+
removeExcludePattern(id) {
|
|
342
|
+
return this.db.prepare('DELETE FROM exclude_patterns WHERE id = ?').run(id).changes > 0;
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
exports.SqliteCache = SqliteCache;
|
|
346
|
+
//# sourceMappingURL=sqlite-cache.js.map
|