mstro-app 0.4.13 → 0.4.15
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/dist/server/services/file-explorer-ops.d.ts +1 -1
- package/dist/server/services/file-explorer-ops.d.ts.map +1 -1
- package/dist/server/services/file-explorer-ops.js +7 -2
- package/dist/server/services/file-explorer-ops.js.map +1 -1
- package/dist/server/services/plan/composer.d.ts +1 -1
- package/dist/server/services/plan/composer.d.ts.map +1 -1
- package/dist/server/services/plan/composer.js +3 -2
- package/dist/server/services/plan/composer.js.map +1 -1
- package/dist/server/services/plan/executor.d.ts +5 -0
- package/dist/server/services/plan/executor.d.ts.map +1 -1
- package/dist/server/services/plan/executor.js +32 -1
- package/dist/server/services/plan/executor.js.map +1 -1
- package/dist/server/services/plan/parser-core.d.ts.map +1 -1
- package/dist/server/services/plan/parser-core.js +1 -0
- package/dist/server/services/plan/parser-core.js.map +1 -1
- package/dist/server/services/plan/review-gate.d.ts +2 -0
- package/dist/server/services/plan/review-gate.d.ts.map +1 -1
- package/dist/server/services/plan/review-gate.js +25 -3
- package/dist/server/services/plan/review-gate.js.map +1 -1
- package/dist/server/services/plan/types.d.ts +2 -0
- package/dist/server/services/plan/types.d.ts.map +1 -1
- package/dist/server/services/websocket/file-explorer-handlers.js +2 -1
- package/dist/server/services/websocket/file-explorer-handlers.js.map +1 -1
- package/dist/server/services/websocket/git-log-handlers.d.ts.map +1 -1
- package/dist/server/services/websocket/git-log-handlers.js +29 -9
- package/dist/server/services/websocket/git-log-handlers.js.map +1 -1
- package/dist/server/services/websocket/git-worktree-handlers.js +8 -0
- package/dist/server/services/websocket/git-worktree-handlers.js.map +1 -1
- package/dist/server/services/websocket/handler.d.ts.map +1 -1
- package/dist/server/services/websocket/handler.js +5 -3
- package/dist/server/services/websocket/handler.js.map +1 -1
- package/dist/server/services/websocket/plan-execution-handlers.d.ts.map +1 -1
- package/dist/server/services/websocket/plan-execution-handlers.js +4 -1
- package/dist/server/services/websocket/plan-execution-handlers.js.map +1 -1
- package/dist/server/services/websocket/plan-helpers.js +1 -1
- package/dist/server/services/websocket/plan-helpers.js.map +1 -1
- package/dist/server/services/websocket/quality-handlers.d.ts +1 -1
- package/dist/server/services/websocket/quality-handlers.d.ts.map +1 -1
- package/dist/server/services/websocket/quality-handlers.js +67 -14
- package/dist/server/services/websocket/quality-handlers.js.map +1 -1
- package/dist/server/services/websocket/quality-persistence.d.ts +2 -0
- package/dist/server/services/websocket/quality-persistence.d.ts.map +1 -1
- package/dist/server/services/websocket/quality-persistence.js +33 -2
- package/dist/server/services/websocket/quality-persistence.js.map +1 -1
- package/dist/server/services/websocket/quality-review-agent.d.ts +33 -0
- package/dist/server/services/websocket/quality-review-agent.d.ts.map +1 -1
- package/dist/server/services/websocket/quality-review-agent.js +360 -72
- package/dist/server/services/websocket/quality-review-agent.js.map +1 -1
- package/dist/server/services/websocket/quality-types.d.ts +3 -0
- package/dist/server/services/websocket/quality-types.d.ts.map +1 -1
- package/dist/server/services/websocket/quality-types.js.map +1 -1
- package/package.json +1 -1
- package/server/services/file-explorer-ops.ts +7 -2
- package/server/services/plan/composer.ts +3 -1
- package/server/services/plan/executor.ts +32 -1
- package/server/services/plan/parser-core.ts +1 -0
- package/server/services/plan/review-gate.ts +28 -3
- package/server/services/plan/types.ts +2 -0
- package/server/services/websocket/file-explorer-handlers.ts +2 -1
- package/server/services/websocket/git-log-handlers.ts +30 -9
- package/server/services/websocket/git-worktree-handlers.ts +9 -0
- package/server/services/websocket/handler.ts +6 -3
- package/server/services/websocket/plan-execution-handlers.ts +4 -1
- package/server/services/websocket/plan-helpers.ts +1 -1
- package/server/services/websocket/quality-handlers.ts +69 -9
- package/server/services/websocket/quality-persistence.ts +32 -2
- package/server/services/websocket/quality-review-agent.ts +427 -72
- package/server/services/websocket/quality-types.ts +3 -0
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
* - quality-fix-agent.ts — AI fix prompt, progress tracking, handler
|
|
10
10
|
*/
|
|
11
11
|
import { join } from 'node:path';
|
|
12
|
+
import { validatePathWithinWorkingDir } from '../pathUtils.js';
|
|
12
13
|
import { handleFixIssues } from './quality-fix-agent.js';
|
|
13
14
|
import { QualityPersistence } from './quality-persistence.js';
|
|
14
15
|
import { handleCodeReview } from './quality-review-agent.js';
|
|
@@ -31,26 +32,53 @@ function resolvePath(workingDir, dirPath) {
|
|
|
31
32
|
return dirPath;
|
|
32
33
|
return join(workingDir, dirPath);
|
|
33
34
|
}
|
|
35
|
+
/**
|
|
36
|
+
* Resolve and validate a directory path for sandboxed users.
|
|
37
|
+
* Returns null if the path escapes the working directory.
|
|
38
|
+
*/
|
|
39
|
+
function resolveAndValidatePath(workingDir, dirPath, isSandboxed) {
|
|
40
|
+
const resolved = resolvePath(workingDir, dirPath);
|
|
41
|
+
if (isSandboxed) {
|
|
42
|
+
const validation = validatePathWithinWorkingDir(resolved, workingDir);
|
|
43
|
+
if (!validation.valid) {
|
|
44
|
+
return { resolved: '', error: validation.error || 'Path outside project directory' };
|
|
45
|
+
}
|
|
46
|
+
return { resolved: validation.resolvedPath };
|
|
47
|
+
}
|
|
48
|
+
return { resolved };
|
|
49
|
+
}
|
|
34
50
|
// ── Message router ────────────────────────────────────────────
|
|
35
|
-
export function handleQualityMessage(ctx, ws, msg, _tabId, workingDir) {
|
|
51
|
+
export function handleQualityMessage(ctx, ws, msg, _tabId, workingDir, permission) {
|
|
52
|
+
const isSandboxed = permission === 'control' || permission === 'view';
|
|
53
|
+
const sendPathError = (path, error) => {
|
|
54
|
+
ctx.send(ws, { type: 'qualityError', data: { path, error } });
|
|
55
|
+
};
|
|
36
56
|
const handlers = {
|
|
37
|
-
qualityDetectTools: () => handleDetectTools(ctx, ws, msg, workingDir),
|
|
38
|
-
qualityScan: () => handleScan(ctx, ws, msg, workingDir),
|
|
39
|
-
qualityInstallTools: () => handleInstallTools(ctx, ws, msg, workingDir),
|
|
57
|
+
qualityDetectTools: () => handleDetectTools(ctx, ws, msg, workingDir, isSandboxed),
|
|
58
|
+
qualityScan: () => handleScan(ctx, ws, msg, workingDir, isSandboxed),
|
|
59
|
+
qualityInstallTools: () => handleInstallTools(ctx, ws, msg, workingDir, isSandboxed),
|
|
40
60
|
qualityCodeReview: () => {
|
|
41
|
-
const dirPath =
|
|
61
|
+
const { resolved: dirPath, error } = resolveAndValidatePath(workingDir, msg.data?.path, isSandboxed);
|
|
62
|
+
if (error) {
|
|
63
|
+
sendPathError(msg.data?.path || '.', error);
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
42
66
|
const reportPath = msg.data?.path || '.';
|
|
43
67
|
handleCodeReview(ctx, ws, reportPath, dirPath, workingDir, activeReviews, getPersistence);
|
|
44
68
|
},
|
|
45
69
|
qualityFixIssues: () => {
|
|
46
|
-
const dirPath =
|
|
70
|
+
const { resolved: dirPath, error } = resolveAndValidatePath(workingDir, msg.data?.path, isSandboxed);
|
|
71
|
+
if (error) {
|
|
72
|
+
sendPathError(msg.data?.path || '.', error);
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
47
75
|
const reportPath = msg.data?.path || '.';
|
|
48
76
|
const section = msg.data?.section;
|
|
49
77
|
const findings = msg.data?.findings || [];
|
|
50
78
|
handleFixIssues(ctx, ws, reportPath, dirPath, workingDir, section, findings, getPersistence);
|
|
51
79
|
},
|
|
52
80
|
qualityLoadState: () => handleLoadState(ctx, ws, workingDir),
|
|
53
|
-
qualitySaveDirectories: () => handleSaveDirectories(ctx, ws, msg, workingDir),
|
|
81
|
+
qualitySaveDirectories: () => handleSaveDirectories(ctx, ws, msg, workingDir, isSandboxed),
|
|
54
82
|
};
|
|
55
83
|
const handler = handlers[msg.type];
|
|
56
84
|
if (!handler)
|
|
@@ -80,10 +108,23 @@ async function handleLoadState(ctx, ws, workingDir) {
|
|
|
80
108
|
});
|
|
81
109
|
}
|
|
82
110
|
}
|
|
83
|
-
async function handleSaveDirectories(ctx, ws, msg, workingDir) {
|
|
111
|
+
async function handleSaveDirectories(ctx, ws, msg, workingDir, isSandboxed = false) {
|
|
84
112
|
try {
|
|
85
113
|
const persistence = getPersistence(workingDir);
|
|
86
114
|
const directories = msg.data?.directories || [];
|
|
115
|
+
// Validate all directory paths when sandboxed
|
|
116
|
+
if (isSandboxed) {
|
|
117
|
+
for (const dir of directories) {
|
|
118
|
+
const { error } = resolveAndValidatePath(workingDir, dir.path, true);
|
|
119
|
+
if (error) {
|
|
120
|
+
ctx.send(ws, {
|
|
121
|
+
type: 'qualityError',
|
|
122
|
+
data: { path: dir.path, error: `Cannot save directory: ${error}` },
|
|
123
|
+
});
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
87
128
|
persistence.saveConfig(directories);
|
|
88
129
|
}
|
|
89
130
|
catch (error) {
|
|
@@ -93,8 +134,12 @@ async function handleSaveDirectories(ctx, ws, msg, workingDir) {
|
|
|
93
134
|
});
|
|
94
135
|
}
|
|
95
136
|
}
|
|
96
|
-
async function handleDetectTools(ctx, ws, msg, workingDir) {
|
|
97
|
-
const dirPath =
|
|
137
|
+
async function handleDetectTools(ctx, ws, msg, workingDir, isSandboxed = false) {
|
|
138
|
+
const { resolved: dirPath, error: pathError } = resolveAndValidatePath(workingDir, msg.data?.path, isSandboxed);
|
|
139
|
+
if (pathError) {
|
|
140
|
+
ctx.send(ws, { type: 'qualityError', data: { path: msg.data?.path || '.', error: pathError } });
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
98
143
|
try {
|
|
99
144
|
const { tools, ecosystem } = await detectTools(dirPath);
|
|
100
145
|
ctx.send(ws, {
|
|
@@ -109,8 +154,12 @@ async function handleDetectTools(ctx, ws, msg, workingDir) {
|
|
|
109
154
|
});
|
|
110
155
|
}
|
|
111
156
|
}
|
|
112
|
-
async function handleScan(ctx, ws, msg, workingDir) {
|
|
113
|
-
const dirPath =
|
|
157
|
+
async function handleScan(ctx, ws, msg, workingDir, isSandboxed = false) {
|
|
158
|
+
const { resolved: dirPath, error: pathError } = resolveAndValidatePath(workingDir, msg.data?.path, isSandboxed);
|
|
159
|
+
if (pathError) {
|
|
160
|
+
ctx.send(ws, { type: 'qualityError', data: { path: msg.data?.path || '.', error: pathError } });
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
114
163
|
const reportPath = msg.data?.path || '.';
|
|
115
164
|
try {
|
|
116
165
|
const { tools: detectedTools } = await detectTools(dirPath);
|
|
@@ -141,8 +190,12 @@ async function handleScan(ctx, ws, msg, workingDir) {
|
|
|
141
190
|
});
|
|
142
191
|
}
|
|
143
192
|
}
|
|
144
|
-
async function handleInstallTools(ctx, ws, msg, workingDir) {
|
|
145
|
-
const dirPath =
|
|
193
|
+
async function handleInstallTools(ctx, ws, msg, workingDir, isSandboxed = false) {
|
|
194
|
+
const { resolved: dirPath, error: pathError } = resolveAndValidatePath(workingDir, msg.data?.path, isSandboxed);
|
|
195
|
+
if (pathError) {
|
|
196
|
+
ctx.send(ws, { type: 'qualityError', data: { path: msg.data?.path || '.', error: pathError } });
|
|
197
|
+
return;
|
|
198
|
+
}
|
|
146
199
|
const reportPath = msg.data?.path || '.';
|
|
147
200
|
const toolNames = msg.data?.tools;
|
|
148
201
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"quality-handlers.js","sourceRoot":"","sources":["../../../../server/services/websocket/quality-handlers.ts"],"names":[],"mappings":"AAAA,8DAA8D;AAC9D,gEAAgE;AAEhE;;;;;;;GAOG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"quality-handlers.js","sourceRoot":"","sources":["../../../../server/services/websocket/quality-handlers.ts"],"names":[],"mappings":"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"}
|
|
@@ -22,6 +22,7 @@ export interface QualityPersistedState {
|
|
|
22
22
|
export declare class QualityPersistence {
|
|
23
23
|
private qualityDir;
|
|
24
24
|
private reportsDir;
|
|
25
|
+
private reportHistoryDir;
|
|
25
26
|
private configPath;
|
|
26
27
|
private historyPath;
|
|
27
28
|
constructor(workingDir: string);
|
|
@@ -32,6 +33,7 @@ export declare class QualityPersistence {
|
|
|
32
33
|
loadReport(dirPath: string): QualityResults | null;
|
|
33
34
|
saveReport(dirPath: string, results: QualityResults): void;
|
|
34
35
|
loadAllReports(directories: QualityDirectoryConfig[]): Record<string, QualityResults>;
|
|
36
|
+
private pruneReportHistory;
|
|
35
37
|
loadHistory(): QualityHistoryEntry[];
|
|
36
38
|
appendHistory(results: QualityResults, dirPath: string): void;
|
|
37
39
|
loadCodeReview(dirPath: string): {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"quality-persistence.d.ts","sourceRoot":"","sources":["../../../../server/services/websocket/quality-persistence.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAM3D,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAMD,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,qBAAqB,EAAE,CAAC;CACtC;AAMD,MAAM,WAAW,qBAAqB;IACpC,WAAW,EAAE,sBAAsB,EAAE,CAAC;IACtC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IACxC,OAAO,EAAE,mBAAmB,EAAE,CAAC;CAChC;
|
|
1
|
+
{"version":3,"file":"quality-persistence.d.ts","sourceRoot":"","sources":["../../../../server/services/websocket/quality-persistence.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAM3D,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAMD,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,qBAAqB,EAAE,CAAC;CACtC;AAMD,MAAM,WAAW,qBAAqB;IACpC,WAAW,EAAE,sBAAsB,EAAE,CAAC;IACtC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IACxC,OAAO,EAAE,mBAAmB,EAAE,CAAC;CAChC;AA2CD,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,WAAW,CAAS;gBAEhB,UAAU,EAAE,MAAM;IAY9B,UAAU,IAAI,sBAAsB,EAAE;IAKtC,UAAU,CAAC,WAAW,EAAE,sBAAsB,EAAE,GAAG,IAAI;IAIvD,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAQ/C,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAOnC,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI;IAMlD,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,IAAI;IAY1D,cAAc,CAAC,WAAW,EAAE,sBAAsB,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC;IAarF,OAAO,CAAC,kBAAkB;IAa1B,WAAW,IAAI,mBAAmB,EAAE;IAKpC,aAAa,CAAC,OAAO,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAiD7D,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG;QAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAMnH,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAe3F,SAAS,IAAI,qBAAqB;CAenC"}
|
|
@@ -9,12 +9,13 @@
|
|
|
9
9
|
* .mstro/quality/reports/<slug>.json — Latest full report per directory
|
|
10
10
|
* .mstro/quality/history.json — Score history entries for trend tracking
|
|
11
11
|
*/
|
|
12
|
-
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
12
|
+
import { existsSync, mkdirSync, readdirSync, readFileSync, unlinkSync, writeFileSync } from 'node:fs';
|
|
13
13
|
import { join } from 'node:path';
|
|
14
14
|
// ============================================================================
|
|
15
15
|
// Helpers
|
|
16
16
|
// ============================================================================
|
|
17
17
|
const MAX_HISTORY_ENTRIES = 100;
|
|
18
|
+
const MAX_REPORT_HISTORY_FILES = 200;
|
|
18
19
|
function slugify(dirPath) {
|
|
19
20
|
if (dirPath === '.' || dirPath === './')
|
|
20
21
|
return '_root';
|
|
@@ -50,14 +51,17 @@ function writeJson(filePath, data) {
|
|
|
50
51
|
export class QualityPersistence {
|
|
51
52
|
qualityDir;
|
|
52
53
|
reportsDir;
|
|
54
|
+
reportHistoryDir;
|
|
53
55
|
configPath;
|
|
54
56
|
historyPath;
|
|
55
57
|
constructor(workingDir) {
|
|
56
58
|
this.qualityDir = join(workingDir, '.mstro', 'quality');
|
|
57
59
|
this.reportsDir = join(this.qualityDir, 'reports');
|
|
60
|
+
this.reportHistoryDir = join(this.reportsDir, 'history');
|
|
58
61
|
this.configPath = join(this.qualityDir, 'config.json');
|
|
59
62
|
this.historyPath = join(this.qualityDir, 'history.json');
|
|
60
63
|
ensureDir(this.reportsDir);
|
|
64
|
+
ensureDir(this.reportHistoryDir);
|
|
61
65
|
}
|
|
62
66
|
// ---- Config (directory list) ----
|
|
63
67
|
loadConfig() {
|
|
@@ -88,6 +92,11 @@ export class QualityPersistence {
|
|
|
88
92
|
const slug = slugify(dirPath);
|
|
89
93
|
const reportPath = join(this.reportsDir, `${slug}.json`);
|
|
90
94
|
writeJson(reportPath, results);
|
|
95
|
+
// Archive timestamped copy for historical tracking
|
|
96
|
+
const ts = Date.now();
|
|
97
|
+
const archivePath = join(this.reportHistoryDir, `${ts}_${slug}.json`);
|
|
98
|
+
writeJson(archivePath, results);
|
|
99
|
+
this.pruneReportHistory();
|
|
91
100
|
}
|
|
92
101
|
loadAllReports(directories) {
|
|
93
102
|
const reports = {};
|
|
@@ -99,6 +108,22 @@ export class QualityPersistence {
|
|
|
99
108
|
}
|
|
100
109
|
return reports;
|
|
101
110
|
}
|
|
111
|
+
// ---- Report history pruning ----
|
|
112
|
+
pruneReportHistory() {
|
|
113
|
+
try {
|
|
114
|
+
const files = readdirSync(this.reportHistoryDir).filter((f) => f.endsWith('.json')).sort();
|
|
115
|
+
if (files.length <= MAX_REPORT_HISTORY_FILES)
|
|
116
|
+
return;
|
|
117
|
+
const toRemove = files.slice(0, files.length - MAX_REPORT_HISTORY_FILES);
|
|
118
|
+
for (const file of toRemove) {
|
|
119
|
+
try {
|
|
120
|
+
unlinkSync(join(this.reportHistoryDir, file));
|
|
121
|
+
}
|
|
122
|
+
catch { /* ignore */ }
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
catch { /* directory may not exist yet */ }
|
|
126
|
+
}
|
|
102
127
|
// ---- History (trend tracking) ----
|
|
103
128
|
loadHistory() {
|
|
104
129
|
const history = readJson(this.historyPath, { entries: [] });
|
|
@@ -156,7 +181,13 @@ export class QualityPersistence {
|
|
|
156
181
|
saveCodeReview(dirPath, findings, summary) {
|
|
157
182
|
const slug = slugify(dirPath);
|
|
158
183
|
const reviewPath = join(this.reportsDir, `${slug}-review.json`);
|
|
159
|
-
|
|
184
|
+
const data = { findings, summary, timestamp: new Date().toISOString() };
|
|
185
|
+
writeJson(reviewPath, data);
|
|
186
|
+
// Archive timestamped copy for historical tracking
|
|
187
|
+
const ts = Date.now();
|
|
188
|
+
const archivePath = join(this.reportHistoryDir, `${ts}_${slug}-review.json`);
|
|
189
|
+
writeJson(archivePath, data);
|
|
190
|
+
this.pruneReportHistory();
|
|
160
191
|
}
|
|
161
192
|
// ---- Full state load ----
|
|
162
193
|
loadState() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"quality-persistence.js","sourceRoot":"","sources":["../../../../server/services/websocket/quality-persistence.ts"],"names":[],"mappings":"AAAA,8DAA8D;AAC9D,gEAAgE;AAEhE;;;;;;;;GAQG;AAEH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"quality-persistence.js","sourceRoot":"","sources":["../../../../server/services/websocket/quality-persistence.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,6 +9,9 @@ export interface CodeReviewFinding {
|
|
|
9
9
|
title: string;
|
|
10
10
|
description: string;
|
|
11
11
|
suggestion?: string;
|
|
12
|
+
evidence?: string;
|
|
13
|
+
verified?: boolean;
|
|
14
|
+
verificationNote?: string;
|
|
12
15
|
}
|
|
13
16
|
export declare function buildCodeReviewPrompt(dirPath: string, cliFindings?: Array<{
|
|
14
17
|
severity: string;
|
|
@@ -26,5 +29,35 @@ export interface CodeReviewResult {
|
|
|
26
29
|
scoreRationale: string | null;
|
|
27
30
|
}
|
|
28
31
|
export declare function parseCodeReviewResponse(response: string): CodeReviewResult;
|
|
32
|
+
/**
|
|
33
|
+
* Validate findings against the actual filesystem. Returns findings annotated
|
|
34
|
+
* with validation results. Does NOT remove findings — only marks them.
|
|
35
|
+
*/
|
|
36
|
+
export declare function validateFindings(findings: CodeReviewFinding[], dirPath: string): {
|
|
37
|
+
validated: CodeReviewFinding[];
|
|
38
|
+
rejected: CodeReviewFinding[];
|
|
39
|
+
stats: {
|
|
40
|
+
total: number;
|
|
41
|
+
passed: number;
|
|
42
|
+
failed: number;
|
|
43
|
+
};
|
|
44
|
+
};
|
|
45
|
+
export declare function buildVerificationPrompt(dirPath: string, findings: CodeReviewFinding[]): string;
|
|
46
|
+
interface VerificationVerdict {
|
|
47
|
+
id: number;
|
|
48
|
+
verdict: 'confirmed' | 'rejected';
|
|
49
|
+
confidence: number;
|
|
50
|
+
note: string;
|
|
51
|
+
}
|
|
52
|
+
export declare function parseVerificationResponse(response: string): VerificationVerdict[];
|
|
53
|
+
/**
|
|
54
|
+
* Apply verification verdicts to findings.
|
|
55
|
+
* Confirmed findings get verified=true. Rejected findings are removed.
|
|
56
|
+
*/
|
|
57
|
+
export declare function applyVerification(findings: CodeReviewFinding[], verdicts: VerificationVerdict[]): {
|
|
58
|
+
verified: CodeReviewFinding[];
|
|
59
|
+
rejected: CodeReviewFinding[];
|
|
60
|
+
};
|
|
29
61
|
export declare function handleCodeReview(ctx: HandlerContext, ws: WSContext, reportPath: string, dirPath: string, workingDir: string, activeReviews: Set<string>, getPersistence: (dir: string) => QualityPersistence): Promise<void>;
|
|
62
|
+
export {};
|
|
30
63
|
//# sourceMappingURL=quality-review-agent.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"quality-review-agent.d.ts","sourceRoot":"","sources":["../../../../server/services/websocket/quality-review-agent.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"quality-review-agent.d.ts","sourceRoot":"","sources":["../../../../server/services/websocket/quality-review-agent.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAEnE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAI5C,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IACjD,QAAQ,EAAE,UAAU,GAAG,MAAM,GAAG,aAAa,GAAG,iBAAiB,CAAC;IAClE,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAID,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,KAAK,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAAC,GAAG,MAAM,CAyGjM;AAkCD,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,iBAAiB,EAAE,CAAC;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B;AAED,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,gBAAgB,CAe1E;AAiDD;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,iBAAiB,EAAE,EAC7B,OAAO,EAAE,MAAM,GACd;IAAE,SAAS,EAAE,iBAAiB,EAAE,CAAC;IAAC,QAAQ,EAAE,iBAAiB,EAAE,CAAC;IAAC,KAAK,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,CAkB7H;AAqED,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,iBAAiB,EAAE,GAC5B,MAAM,CA4DR;AAED,UAAU,mBAAmB;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,WAAW,GAAG,UAAU,CAAC;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,MAAM,GAAG,mBAAmB,EAAE,CAiBjF;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,iBAAiB,EAAE,EAC7B,QAAQ,EAAE,mBAAmB,EAAE,GAC9B;IAAE,QAAQ,EAAE,iBAAiB,EAAE,CAAC;IAAC,QAAQ,EAAE,iBAAiB,EAAE,CAAA;CAAE,CA6BlE;AAoID,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,cAAc,EACnB,EAAE,EAAE,SAAS,EACb,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC,EAC1B,cAAc,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,kBAAkB,GAClD,OAAO,CAAC,IAAI,CAAC,CAgEf"}
|