forge-cc 1.0.0 → 1.0.1
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/package.json +3 -2
- package/dist/gates/codex-gate.d.ts +0 -51
- package/dist/gates/codex-gate.js +0 -121
- package/dist/gates/codex-gate.js.map +0 -1
- package/dist/gates/prd-gate.d.ts +0 -7
- package/dist/gates/prd-gate.js +0 -193
- package/dist/gates/prd-gate.js.map +0 -1
- package/dist/gates/remediation.d.ts +0 -46
- package/dist/gates/remediation.js +0 -423
- package/dist/gates/remediation.js.map +0 -1
- package/dist/gates/review-gate.d.ts +0 -16
- package/dist/gates/review-gate.js +0 -479
- package/dist/gates/review-gate.js.map +0 -1
- package/dist/gates/runtime-gate.d.ts +0 -5
- package/dist/gates/runtime-gate.js +0 -99
- package/dist/gates/runtime-gate.js.map +0 -1
- package/dist/gates/test-analysis.d.ts +0 -21
- package/dist/gates/test-analysis.js +0 -394
- package/dist/gates/test-analysis.js.map +0 -1
- package/dist/gates/visual-capture.d.ts +0 -24
- package/dist/gates/visual-capture.js +0 -144
- package/dist/gates/visual-capture.js.map +0 -1
- package/dist/gates/visual-gate.d.ts +0 -18
- package/dist/gates/visual-gate.js +0 -234
- package/dist/gates/visual-gate.js.map +0 -1
- package/dist/gates/visual-reviewer.d.ts +0 -11
- package/dist/gates/visual-reviewer.js +0 -211
- package/dist/gates/visual-reviewer.js.map +0 -1
- package/dist/go/auto-chain.d.ts +0 -136
- package/dist/go/auto-chain.js +0 -389
- package/dist/go/auto-chain.js.map +0 -1
- package/dist/go/executor.d.ts +0 -137
- package/dist/go/executor.js +0 -447
- package/dist/go/executor.js.map +0 -1
- package/dist/go/finalize.d.ts +0 -108
- package/dist/go/finalize.js +0 -331
- package/dist/go/finalize.js.map +0 -1
- package/dist/go/linear-sync-cli.d.ts +0 -55
- package/dist/go/linear-sync-cli.js +0 -192
- package/dist/go/linear-sync-cli.js.map +0 -1
- package/dist/go/linear-sync.d.ts +0 -112
- package/dist/go/linear-sync.js +0 -375
- package/dist/go/linear-sync.js.map +0 -1
- package/dist/go/prd-queue.d.ts +0 -43
- package/dist/go/prd-queue.js +0 -67
- package/dist/go/prd-queue.js.map +0 -1
- package/dist/go/prd-selector.d.ts +0 -57
- package/dist/go/prd-selector.js +0 -101
- package/dist/go/prd-selector.js.map +0 -1
- package/dist/go/verify-loop.d.ts +0 -64
- package/dist/go/verify-loop.js +0 -327
- package/dist/go/verify-loop.js.map +0 -1
- package/dist/hooks/pre-commit.d.ts +0 -5
- package/dist/hooks/pre-commit.js +0 -75
- package/dist/hooks/pre-commit.js.map +0 -1
- package/dist/linear/issues.d.ts +0 -22
- package/dist/linear/issues.js +0 -51
- package/dist/linear/issues.js.map +0 -1
- package/dist/linear/milestones.d.ts +0 -11
- package/dist/linear/milestones.js +0 -32
- package/dist/linear/milestones.js.map +0 -1
- package/dist/linear/projects.d.ts +0 -16
- package/dist/linear/projects.js +0 -51
- package/dist/linear/projects.js.map +0 -1
- package/dist/reporter/human.d.ts +0 -7
- package/dist/reporter/human.js +0 -93
- package/dist/reporter/human.js.map +0 -1
- package/dist/reporter/json.d.ts +0 -2
- package/dist/reporter/json.js +0 -4
- package/dist/reporter/json.js.map +0 -1
- package/dist/setup/structural-templates.d.ts +0 -12
- package/dist/setup/structural-templates.js +0 -288
- package/dist/setup/structural-templates.js.map +0 -1
- package/dist/setup/templates.d.ts +0 -17
- package/dist/setup/templates.js +0 -109
- package/dist/setup/templates.js.map +0 -1
- package/dist/setup/test-planner.d.ts +0 -38
- package/dist/setup/test-planner.js +0 -91
- package/dist/setup/test-planner.js.map +0 -1
- package/dist/setup/test-scaffold.d.ts +0 -31
- package/dist/setup/test-scaffold.js +0 -209
- package/dist/setup/test-scaffold.js.map +0 -1
- package/dist/setup/test-templates.d.ts +0 -37
- package/dist/setup/test-templates.js +0 -313
- package/dist/setup/test-templates.js.map +0 -1
- package/dist/spec/generator.d.ts +0 -34
- package/dist/spec/generator.js +0 -227
- package/dist/spec/generator.js.map +0 -1
- package/dist/spec/interview.d.ts +0 -142
- package/dist/spec/interview.js +0 -287
- package/dist/spec/interview.js.map +0 -1
- package/dist/spec/linear-sync.d.ts +0 -48
- package/dist/spec/linear-sync.js +0 -125
- package/dist/spec/linear-sync.js.map +0 -1
- package/dist/spec/scanner.d.ts +0 -79
- package/dist/spec/scanner.js +0 -566
- package/dist/spec/scanner.js.map +0 -1
- package/dist/spec/templates.d.ts +0 -375
- package/dist/spec/templates.js +0 -95
- package/dist/spec/templates.js.map +0 -1
- package/dist/state/prd-status.d.ts +0 -62
- package/dist/state/prd-status.js +0 -122
- package/dist/state/prd-status.js.map +0 -1
- package/dist/state/reader.d.ts +0 -7
- package/dist/state/reader.js +0 -43
- package/dist/state/reader.js.map +0 -1
- package/dist/state/writer.d.ts +0 -21
- package/dist/state/writer.js +0 -106
- package/dist/state/writer.js.map +0 -1
- package/dist/team/consensus.d.ts +0 -28
- package/dist/team/consensus.js +0 -130
- package/dist/team/consensus.js.map +0 -1
- package/dist/team/index.d.ts +0 -4
- package/dist/team/index.js +0 -5
- package/dist/team/index.js.map +0 -1
- package/dist/team/lifecycle.d.ts +0 -37
- package/dist/team/lifecycle.js +0 -92
- package/dist/team/lifecycle.js.map +0 -1
- package/dist/team/reviewer.d.ts +0 -10
- package/dist/team/reviewer.js +0 -345
- package/dist/team/reviewer.js.map +0 -1
- package/dist/team/types.d.ts +0 -269
- package/dist/team/types.js +0 -70
- package/dist/team/types.js.map +0 -1
- package/dist/utils/browser.d.ts +0 -10
- package/dist/utils/browser.js +0 -96
- package/dist/utils/browser.js.map +0 -1
- package/dist/utils/platform.d.ts +0 -29
- package/dist/utils/platform.js +0 -90
- package/dist/utils/platform.js.map +0 -1
- package/dist/worktree/identity.d.ts +0 -9
- package/dist/worktree/identity.js +0 -32
- package/dist/worktree/identity.js.map +0 -1
- package/dist/worktree/parallel.d.ts +0 -87
- package/dist/worktree/parallel.js +0 -328
- package/dist/worktree/parallel.js.map +0 -1
- package/dist/worktree/session.d.ts +0 -67
- package/dist/worktree/session.js +0 -194
- package/dist/worktree/session.js.map +0 -1
- package/dist/worktree/state-merge.d.ts +0 -43
- package/dist/worktree/state-merge.js +0 -162
- package/dist/worktree/state-merge.js.map +0 -1
|
@@ -1,479 +0,0 @@
|
|
|
1
|
-
import { execSync } from "node:child_process";
|
|
2
|
-
import { readFileSync, existsSync } from "node:fs";
|
|
3
|
-
import { join } from "node:path";
|
|
4
|
-
/**
|
|
5
|
-
* Code review gate: evaluates the current diff against PRD acceptance criteria
|
|
6
|
-
* and CLAUDE.md coding rules to produce structured review findings.
|
|
7
|
-
*
|
|
8
|
-
* Non-blocking by default (returns passed: true with warnings).
|
|
9
|
-
* Set blocking: true to fail the gate when findings exist.
|
|
10
|
-
*/
|
|
11
|
-
export async function verifyReview(projectDir, options = {}) {
|
|
12
|
-
const start = Date.now();
|
|
13
|
-
const errors = [];
|
|
14
|
-
const warnings = [];
|
|
15
|
-
const reviewFindings = [];
|
|
16
|
-
const { prdPath, claudeMdPath, baseBranch, blocking = false } = options;
|
|
17
|
-
try {
|
|
18
|
-
// 1. Get the diff content
|
|
19
|
-
const diffContent = getDiffContent(projectDir, baseBranch);
|
|
20
|
-
if (!diffContent) {
|
|
21
|
-
warnings.push("No diff content available -- nothing to review");
|
|
22
|
-
return buildResult(true, errors, warnings, reviewFindings, start);
|
|
23
|
-
}
|
|
24
|
-
// 2. Parse diff into structured hunks
|
|
25
|
-
const hunks = parseDiffHunks(diffContent);
|
|
26
|
-
if (hunks.length === 0) {
|
|
27
|
-
warnings.push("Diff parsed but no hunks found -- nothing to review");
|
|
28
|
-
return buildResult(true, errors, warnings, reviewFindings, start);
|
|
29
|
-
}
|
|
30
|
-
// 3. Extract review checklist from PRD
|
|
31
|
-
const prdCriteria = extractPrdCriteria(prdPath, projectDir);
|
|
32
|
-
// 4. Extract coding rules from CLAUDE.md
|
|
33
|
-
const claudeRules = extractClaudeRules(claudeMdPath, projectDir);
|
|
34
|
-
// 5. Evaluate diff against PRD criteria
|
|
35
|
-
for (const criterion of prdCriteria) {
|
|
36
|
-
const finding = evaluatePrdCriterion(criterion, hunks);
|
|
37
|
-
if (finding) {
|
|
38
|
-
reviewFindings.push(finding);
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
// 6. Evaluate diff against CLAUDE.md rules
|
|
42
|
-
for (const rule of claudeRules) {
|
|
43
|
-
const findings = evaluateClaudeRule(rule, hunks);
|
|
44
|
-
reviewFindings.push(...findings);
|
|
45
|
-
}
|
|
46
|
-
// 7. Run structural style checks on the diff
|
|
47
|
-
const styleFindings = evaluateStyleRules(hunks);
|
|
48
|
-
reviewFindings.push(...styleFindings);
|
|
49
|
-
// 8. Convert findings to GateErrors and warnings
|
|
50
|
-
for (const finding of reviewFindings) {
|
|
51
|
-
if (finding.severity === "error") {
|
|
52
|
-
errors.push({
|
|
53
|
-
file: finding.file,
|
|
54
|
-
line: finding.line,
|
|
55
|
-
message: finding.message,
|
|
56
|
-
remediation: finding.remediation,
|
|
57
|
-
});
|
|
58
|
-
}
|
|
59
|
-
else {
|
|
60
|
-
warnings.push(`${finding.file ? `${finding.file}` : ""}${finding.line ? `:${finding.line}` : ""} ${finding.message} [${finding.source}]`);
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
// Non-blocking by default: pass even if there are errors, unless blocking is true
|
|
64
|
-
const passed = blocking ? errors.length === 0 : true;
|
|
65
|
-
if (!blocking && errors.length > 0) {
|
|
66
|
-
warnings.push(`Review gate found ${errors.length} issue(s) but is non-blocking. Set review.blocking: true in .forge.json to enforce.`);
|
|
67
|
-
}
|
|
68
|
-
return buildResult(passed, errors, warnings, reviewFindings, start);
|
|
69
|
-
}
|
|
70
|
-
catch (err) {
|
|
71
|
-
const message = err instanceof Error ? err.message : String(err);
|
|
72
|
-
errors.push({ message: `Review gate failed: ${message}` });
|
|
73
|
-
return buildResult(!blocking, errors, warnings, reviewFindings, start);
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
// ---------------------------------------------------------------------------
|
|
77
|
-
// Diff Retrieval
|
|
78
|
-
// ---------------------------------------------------------------------------
|
|
79
|
-
function getDiffContent(projectDir, baseBranch) {
|
|
80
|
-
// Try diff against base branch first if provided
|
|
81
|
-
if (baseBranch) {
|
|
82
|
-
try {
|
|
83
|
-
const diff = execSync(`git diff ${baseBranch}...HEAD`, {
|
|
84
|
-
cwd: projectDir,
|
|
85
|
-
encoding: "utf-8",
|
|
86
|
-
timeout: 30_000,
|
|
87
|
-
});
|
|
88
|
-
// If the command succeeded, trust the result even if empty —
|
|
89
|
-
// an empty diff means no changes vs the base branch.
|
|
90
|
-
return diff.trim() ? diff : null;
|
|
91
|
-
}
|
|
92
|
-
catch {
|
|
93
|
-
// Fall through to other strategies
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
// Try HEAD~1 (last commit's diff)
|
|
97
|
-
try {
|
|
98
|
-
const diff = execSync("git diff HEAD~1", {
|
|
99
|
-
cwd: projectDir,
|
|
100
|
-
encoding: "utf-8",
|
|
101
|
-
timeout: 30_000,
|
|
102
|
-
});
|
|
103
|
-
if (diff.trim())
|
|
104
|
-
return diff;
|
|
105
|
-
}
|
|
106
|
-
catch {
|
|
107
|
-
// Fall through
|
|
108
|
-
}
|
|
109
|
-
// Try staged changes
|
|
110
|
-
try {
|
|
111
|
-
const diff = execSync("git diff --cached", {
|
|
112
|
-
cwd: projectDir,
|
|
113
|
-
encoding: "utf-8",
|
|
114
|
-
timeout: 30_000,
|
|
115
|
-
});
|
|
116
|
-
if (diff.trim())
|
|
117
|
-
return diff;
|
|
118
|
-
}
|
|
119
|
-
catch {
|
|
120
|
-
// Fall through
|
|
121
|
-
}
|
|
122
|
-
// Try unstaged changes
|
|
123
|
-
try {
|
|
124
|
-
const diff = execSync("git diff", {
|
|
125
|
-
cwd: projectDir,
|
|
126
|
-
encoding: "utf-8",
|
|
127
|
-
timeout: 30_000,
|
|
128
|
-
});
|
|
129
|
-
if (diff.trim())
|
|
130
|
-
return diff;
|
|
131
|
-
}
|
|
132
|
-
catch {
|
|
133
|
-
// Nothing available
|
|
134
|
-
}
|
|
135
|
-
return null;
|
|
136
|
-
}
|
|
137
|
-
// ---------------------------------------------------------------------------
|
|
138
|
-
// Diff Parsing
|
|
139
|
-
// ---------------------------------------------------------------------------
|
|
140
|
-
const DIFF_FILE_RE = /^diff --git a\/(.+?) b\/(.+?)$/;
|
|
141
|
-
const HUNK_HEADER_RE = /^@@ -\d+(?:,\d+)? \+(\d+)(?:,\d+)? @@/;
|
|
142
|
-
function parseDiffHunks(diffContent) {
|
|
143
|
-
const lines = diffContent.split("\n");
|
|
144
|
-
const hunks = [];
|
|
145
|
-
let currentFile = "";
|
|
146
|
-
let currentHunk = null;
|
|
147
|
-
let currentLine = 0;
|
|
148
|
-
for (const line of lines) {
|
|
149
|
-
// New file header
|
|
150
|
-
const fileMatch = line.match(DIFF_FILE_RE);
|
|
151
|
-
if (fileMatch) {
|
|
152
|
-
if (currentHunk)
|
|
153
|
-
hunks.push(currentHunk);
|
|
154
|
-
currentFile = fileMatch[2];
|
|
155
|
-
currentHunk = null;
|
|
156
|
-
continue;
|
|
157
|
-
}
|
|
158
|
-
// New hunk header
|
|
159
|
-
const hunkMatch = line.match(HUNK_HEADER_RE);
|
|
160
|
-
if (hunkMatch) {
|
|
161
|
-
if (currentHunk)
|
|
162
|
-
hunks.push(currentHunk);
|
|
163
|
-
currentLine = parseInt(hunkMatch[1], 10);
|
|
164
|
-
currentHunk = {
|
|
165
|
-
file: currentFile,
|
|
166
|
-
startLine: currentLine,
|
|
167
|
-
content: "",
|
|
168
|
-
addedLines: [],
|
|
169
|
-
removedLines: [],
|
|
170
|
-
};
|
|
171
|
-
continue;
|
|
172
|
-
}
|
|
173
|
-
if (!currentHunk)
|
|
174
|
-
continue;
|
|
175
|
-
currentHunk.content += line + "\n";
|
|
176
|
-
if (line.startsWith("+") && !line.startsWith("+++")) {
|
|
177
|
-
currentHunk.addedLines.push({ line: currentLine, text: line.slice(1) });
|
|
178
|
-
currentLine++;
|
|
179
|
-
}
|
|
180
|
-
else if (line.startsWith("-") && !line.startsWith("---")) {
|
|
181
|
-
currentHunk.removedLines.push({ line: currentLine, text: line.slice(1) });
|
|
182
|
-
// Removed lines don't advance the new-file line counter
|
|
183
|
-
}
|
|
184
|
-
else {
|
|
185
|
-
// Context line
|
|
186
|
-
currentLine++;
|
|
187
|
-
}
|
|
188
|
-
}
|
|
189
|
-
if (currentHunk)
|
|
190
|
-
hunks.push(currentHunk);
|
|
191
|
-
return hunks;
|
|
192
|
-
}
|
|
193
|
-
function extractPrdCriteria(prdPath, projectDir) {
|
|
194
|
-
const criteria = [];
|
|
195
|
-
const resolvedPath = prdPath
|
|
196
|
-
? (prdPath.startsWith("/") || prdPath.includes(":") ? prdPath : join(projectDir, prdPath))
|
|
197
|
-
: null;
|
|
198
|
-
if (!resolvedPath || !existsSync(resolvedPath)) {
|
|
199
|
-
return criteria;
|
|
200
|
-
}
|
|
201
|
-
try {
|
|
202
|
-
const content = readFileSync(resolvedPath, "utf-8");
|
|
203
|
-
const lines = content.split("\n");
|
|
204
|
-
let currentSection = "General";
|
|
205
|
-
for (const line of lines) {
|
|
206
|
-
const trimmed = line.trim();
|
|
207
|
-
// Track section headings
|
|
208
|
-
const headingMatch = trimmed.match(/^#{1,3}\s+(.+)/);
|
|
209
|
-
if (headingMatch) {
|
|
210
|
-
currentSection = headingMatch[1].trim();
|
|
211
|
-
continue;
|
|
212
|
-
}
|
|
213
|
-
// Checkbox lines
|
|
214
|
-
const checkboxMatch = trimmed.match(/^-\s+\[([ x])\]\s+(.+)/i);
|
|
215
|
-
if (checkboxMatch) {
|
|
216
|
-
criteria.push({
|
|
217
|
-
text: checkboxMatch[2].trim(),
|
|
218
|
-
section: currentSection,
|
|
219
|
-
checked: checkboxMatch[1].toLowerCase() === "x",
|
|
220
|
-
});
|
|
221
|
-
}
|
|
222
|
-
}
|
|
223
|
-
}
|
|
224
|
-
catch {
|
|
225
|
-
// PRD unreadable -- skip
|
|
226
|
-
}
|
|
227
|
-
return criteria;
|
|
228
|
-
}
|
|
229
|
-
function extractClaudeRules(claudeMdPath, projectDir) {
|
|
230
|
-
const rules = [];
|
|
231
|
-
// Try explicit path, then look in projectDir, then projectDir/CLAUDE.md
|
|
232
|
-
const candidates = [
|
|
233
|
-
claudeMdPath,
|
|
234
|
-
join(projectDir, "CLAUDE.md"),
|
|
235
|
-
].filter((p) => !!p);
|
|
236
|
-
let content = null;
|
|
237
|
-
for (const candidate of candidates) {
|
|
238
|
-
const resolved = candidate.startsWith("/") || candidate.includes(":")
|
|
239
|
-
? candidate
|
|
240
|
-
: join(projectDir, candidate);
|
|
241
|
-
if (existsSync(resolved)) {
|
|
242
|
-
try {
|
|
243
|
-
content = readFileSync(resolved, "utf-8");
|
|
244
|
-
break;
|
|
245
|
-
}
|
|
246
|
-
catch {
|
|
247
|
-
continue;
|
|
248
|
-
}
|
|
249
|
-
}
|
|
250
|
-
}
|
|
251
|
-
if (!content)
|
|
252
|
-
return rules;
|
|
253
|
-
const lines = content.split("\n");
|
|
254
|
-
let currentSection = "";
|
|
255
|
-
let inRulesSection = false;
|
|
256
|
-
for (const line of lines) {
|
|
257
|
-
const trimmed = line.trim();
|
|
258
|
-
// Track section headings
|
|
259
|
-
const headingMatch = trimmed.match(/^#{1,3}\s+(.+)/);
|
|
260
|
-
if (headingMatch) {
|
|
261
|
-
currentSection = headingMatch[1].trim();
|
|
262
|
-
// Detect rule-related sections
|
|
263
|
-
inRulesSection = /rules|principles|execution|verification|learned/i.test(currentSection);
|
|
264
|
-
continue;
|
|
265
|
-
}
|
|
266
|
-
if (!inRulesSection)
|
|
267
|
-
continue;
|
|
268
|
-
// Bullet points with optional tags like [agent staging]
|
|
269
|
-
const bulletMatch = trimmed.match(/^[-*]\s+(?:\*\*\[([^\]]+)\]\*\*\s*)?(.+)/);
|
|
270
|
-
if (bulletMatch) {
|
|
271
|
-
const tag = bulletMatch[1] ?? undefined;
|
|
272
|
-
const text = bulletMatch[2].trim();
|
|
273
|
-
// Skip lines that are just formatting or too short to be a rule
|
|
274
|
-
if (text.length < 10)
|
|
275
|
-
continue;
|
|
276
|
-
rules.push({
|
|
277
|
-
text,
|
|
278
|
-
tag: tag ? `[${tag}]` : undefined,
|
|
279
|
-
section: currentSection,
|
|
280
|
-
});
|
|
281
|
-
}
|
|
282
|
-
}
|
|
283
|
-
return rules;
|
|
284
|
-
}
|
|
285
|
-
// ---------------------------------------------------------------------------
|
|
286
|
-
// PRD Criterion Evaluation
|
|
287
|
-
// ---------------------------------------------------------------------------
|
|
288
|
-
function evaluatePrdCriterion(criterion, hunks) {
|
|
289
|
-
// If the criterion is already checked, we do a lighter check
|
|
290
|
-
// For unchecked criteria, we check if the diff addresses them
|
|
291
|
-
// Extract keywords from the criterion
|
|
292
|
-
const keywords = extractKeywords(criterion.text);
|
|
293
|
-
if (keywords.length === 0)
|
|
294
|
-
return null;
|
|
295
|
-
// Search hunks for keyword presence
|
|
296
|
-
let matched = false;
|
|
297
|
-
for (const hunk of hunks) {
|
|
298
|
-
const hunkText = hunk.content.toLowerCase();
|
|
299
|
-
const fileText = hunk.file.toLowerCase();
|
|
300
|
-
const keywordHits = keywords.filter((kw) => hunkText.includes(kw) || fileText.includes(kw));
|
|
301
|
-
// Require at least 40% of keywords to match
|
|
302
|
-
if (keywordHits.length >= Math.ceil(keywords.length * 0.4)) {
|
|
303
|
-
matched = true;
|
|
304
|
-
break;
|
|
305
|
-
}
|
|
306
|
-
}
|
|
307
|
-
if (!matched && !criterion.checked) {
|
|
308
|
-
return {
|
|
309
|
-
type: "prd_compliance",
|
|
310
|
-
severity: "error",
|
|
311
|
-
message: `PRD criterion may not be addressed: "${criterion.text}"`,
|
|
312
|
-
remediation: `Review PRD section "${criterion.section}" and ensure this criterion is covered by the current changes.`,
|
|
313
|
-
source: `PRD: ${criterion.section}`,
|
|
314
|
-
};
|
|
315
|
-
}
|
|
316
|
-
return null;
|
|
317
|
-
}
|
|
318
|
-
// ---------------------------------------------------------------------------
|
|
319
|
-
// CLAUDE.md Rule Evaluation
|
|
320
|
-
// ---------------------------------------------------------------------------
|
|
321
|
-
function evaluateClaudeRule(rule, hunks) {
|
|
322
|
-
const findings = [];
|
|
323
|
-
const ruleTextLower = rule.text.toLowerCase();
|
|
324
|
-
// Check for specific patterns in rules that can be mechanically verified
|
|
325
|
-
const checks = getRuleChecks(rule);
|
|
326
|
-
for (const check of checks) {
|
|
327
|
-
for (const hunk of hunks) {
|
|
328
|
-
for (const addedLine of hunk.addedLines) {
|
|
329
|
-
if (check.pattern.test(addedLine.text)) {
|
|
330
|
-
findings.push({
|
|
331
|
-
type: "rule_violation",
|
|
332
|
-
severity: check.severity,
|
|
333
|
-
file: hunk.file,
|
|
334
|
-
line: addedLine.line,
|
|
335
|
-
message: check.message,
|
|
336
|
-
remediation: check.remediation,
|
|
337
|
-
source: rule.tag
|
|
338
|
-
? `CLAUDE.md: ${rule.tag}`
|
|
339
|
-
: `CLAUDE.md: ${rule.section}`,
|
|
340
|
-
});
|
|
341
|
-
}
|
|
342
|
-
}
|
|
343
|
-
}
|
|
344
|
-
}
|
|
345
|
-
// Heuristic: if rule mentions "never" or "always" + a keyword, scan for violations
|
|
346
|
-
if (/\bnever\b/i.test(ruleTextLower)) {
|
|
347
|
-
const neverMatch = ruleTextLower.match(/never\s+(?:use\s+)?(.+?)(?:\.|$)/i);
|
|
348
|
-
if (neverMatch) {
|
|
349
|
-
const forbidden = neverMatch[1].trim().replace(/[^a-z0-9\s-]/g, "").trim();
|
|
350
|
-
if (forbidden.length >= 3) {
|
|
351
|
-
for (const hunk of hunks) {
|
|
352
|
-
for (const addedLine of hunk.addedLines) {
|
|
353
|
-
if (addedLine.text.toLowerCase().includes(forbidden)) {
|
|
354
|
-
// Avoid duplicate with explicit checks
|
|
355
|
-
if (!findings.some((f) => f.file === hunk.file && f.line === addedLine.line)) {
|
|
356
|
-
findings.push({
|
|
357
|
-
type: "rule_violation",
|
|
358
|
-
severity: "warning",
|
|
359
|
-
file: hunk.file,
|
|
360
|
-
line: addedLine.line,
|
|
361
|
-
message: `Possible violation: "${rule.text}"`,
|
|
362
|
-
remediation: `Review this line against CLAUDE.md rule in section "${rule.section}".`,
|
|
363
|
-
source: rule.tag
|
|
364
|
-
? `CLAUDE.md: ${rule.tag}`
|
|
365
|
-
: `CLAUDE.md: ${rule.section}`,
|
|
366
|
-
});
|
|
367
|
-
}
|
|
368
|
-
}
|
|
369
|
-
}
|
|
370
|
-
}
|
|
371
|
-
}
|
|
372
|
-
}
|
|
373
|
-
}
|
|
374
|
-
return findings;
|
|
375
|
-
}
|
|
376
|
-
/** Map known rule patterns to mechanical checks */
|
|
377
|
-
function getRuleChecks(rule) {
|
|
378
|
-
const checks = [];
|
|
379
|
-
const text = rule.text.toLowerCase();
|
|
380
|
-
// [agent staging] -- detect `git add .` or `git add -A`
|
|
381
|
-
if (text.includes("git add") || (rule.tag && rule.tag.includes("staging"))) {
|
|
382
|
-
checks.push({
|
|
383
|
-
pattern: /git\s+add\s+(?:\.|--all|-A)\b/,
|
|
384
|
-
message: "Uses 'git add .' or 'git add -A' which can disrupt parallel agents' git index.",
|
|
385
|
-
remediation: "Stage specific files instead of using broad git add commands.",
|
|
386
|
-
severity: "error",
|
|
387
|
-
});
|
|
388
|
-
}
|
|
389
|
-
// Check for console.log left in code
|
|
390
|
-
if (text.includes("console") || text.includes("debug")) {
|
|
391
|
-
checks.push({
|
|
392
|
-
pattern: /console\.log\(/,
|
|
393
|
-
message: "console.log() left in code -- consider removing debug output.",
|
|
394
|
-
remediation: "Remove console.log statements before committing, or use a proper logger.",
|
|
395
|
-
severity: "error",
|
|
396
|
-
});
|
|
397
|
-
}
|
|
398
|
-
// Check for relative imports without .js extension (ES module rule)
|
|
399
|
-
if (text.includes(".js extension") || text.includes("es module")) {
|
|
400
|
-
checks.push({
|
|
401
|
-
pattern: /from\s+["'][.][^"']*(?<!\.js)["']/,
|
|
402
|
-
message: "Relative import missing .js extension (ES module requirement).",
|
|
403
|
-
remediation: "Add .js extension to all relative imports per ES module convention.",
|
|
404
|
-
severity: "error",
|
|
405
|
-
});
|
|
406
|
-
}
|
|
407
|
-
return checks;
|
|
408
|
-
}
|
|
409
|
-
// ---------------------------------------------------------------------------
|
|
410
|
-
// Style Checks
|
|
411
|
-
// ---------------------------------------------------------------------------
|
|
412
|
-
function evaluateStyleRules(hunks) {
|
|
413
|
-
const findings = [];
|
|
414
|
-
for (const hunk of hunks) {
|
|
415
|
-
// Only check TypeScript/JavaScript files
|
|
416
|
-
if (!/\.[tj]sx?$/.test(hunk.file))
|
|
417
|
-
continue;
|
|
418
|
-
for (const addedLine of hunk.addedLines) {
|
|
419
|
-
const text = addedLine.text;
|
|
420
|
-
// Check for `any` type usage in TypeScript
|
|
421
|
-
if (/:\s*any\b/.test(text) && !text.includes("// eslint-disable") && !text.includes("@ts-")) {
|
|
422
|
-
findings.push({
|
|
423
|
-
type: "style",
|
|
424
|
-
severity: "warning",
|
|
425
|
-
file: hunk.file,
|
|
426
|
-
line: addedLine.line,
|
|
427
|
-
message: "Explicit 'any' type used -- consider using a more specific type.",
|
|
428
|
-
remediation: "Replace 'any' with a specific type or 'unknown' for type safety.",
|
|
429
|
-
source: "Style: TypeScript strict mode",
|
|
430
|
-
});
|
|
431
|
-
}
|
|
432
|
-
// Check for TODO/FIXME/HACK left in code
|
|
433
|
-
if (/\b(TODO|FIXME|HACK|XXX)\b/.test(text)) {
|
|
434
|
-
findings.push({
|
|
435
|
-
type: "style",
|
|
436
|
-
severity: "warning",
|
|
437
|
-
file: hunk.file,
|
|
438
|
-
line: addedLine.line,
|
|
439
|
-
message: "TODO/FIXME/HACK marker found in new code.",
|
|
440
|
-
remediation: "Resolve the TODO or track it as a separate issue before merging.",
|
|
441
|
-
source: "Style: code cleanliness",
|
|
442
|
-
});
|
|
443
|
-
}
|
|
444
|
-
}
|
|
445
|
-
}
|
|
446
|
-
return findings;
|
|
447
|
-
}
|
|
448
|
-
// ---------------------------------------------------------------------------
|
|
449
|
-
// Utilities
|
|
450
|
-
// ---------------------------------------------------------------------------
|
|
451
|
-
const STOP_WORDS = new Set([
|
|
452
|
-
"the", "and", "for", "are", "but", "not", "you", "all", "can", "has",
|
|
453
|
-
"her", "was", "one", "our", "out", "its", "his", "how", "may", "who",
|
|
454
|
-
"did", "get", "let", "say", "she", "too", "use", "way", "each",
|
|
455
|
-
"which", "their", "will", "other", "about", "many", "then", "them",
|
|
456
|
-
"been", "have", "from", "with", "they", "this", "that", "what", "when",
|
|
457
|
-
"make", "like", "just", "over", "such", "take", "into", "than", "most",
|
|
458
|
-
"also", "should", "would", "could", "must", "shall", "might", "does",
|
|
459
|
-
"display", "show", "page", "user", "view", "click", "able", "ensure",
|
|
460
|
-
"given",
|
|
461
|
-
]);
|
|
462
|
-
function extractKeywords(text) {
|
|
463
|
-
return text
|
|
464
|
-
.toLowerCase()
|
|
465
|
-
.replace(/[^a-z0-9\s-]/g, " ")
|
|
466
|
-
.split(/\s+/)
|
|
467
|
-
.filter((w) => w.length >= 3 && !STOP_WORDS.has(w));
|
|
468
|
-
}
|
|
469
|
-
function buildResult(passed, errors, warnings, reviewFindings, start) {
|
|
470
|
-
return {
|
|
471
|
-
gate: "review",
|
|
472
|
-
passed,
|
|
473
|
-
errors,
|
|
474
|
-
warnings,
|
|
475
|
-
duration_ms: Date.now() - start,
|
|
476
|
-
reviewFindings,
|
|
477
|
-
};
|
|
478
|
-
}
|
|
479
|
-
//# sourceMappingURL=review-gate.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"review-gate.js","sourceRoot":"","sources":["../../src/gates/review-gate.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,99 +0,0 @@
|
|
|
1
|
-
import { startDevServer, stopDevServer, waitForServer, } from "../utils/browser.js";
|
|
2
|
-
export async function verifyRuntime(projectDir, endpoints, options) {
|
|
3
|
-
const start = Date.now();
|
|
4
|
-
const port = options?.devServerPort ?? 3000;
|
|
5
|
-
const errors = [];
|
|
6
|
-
const warnings = [];
|
|
7
|
-
try {
|
|
8
|
-
// Start dev server
|
|
9
|
-
try {
|
|
10
|
-
await startDevServer(projectDir, options?.devServerCommand, port);
|
|
11
|
-
}
|
|
12
|
-
catch (err) {
|
|
13
|
-
const message = err instanceof Error ? err.message : "Unknown dev server error";
|
|
14
|
-
return {
|
|
15
|
-
gate: "runtime",
|
|
16
|
-
passed: false,
|
|
17
|
-
errors: [{ message: `Dev server failed to start: ${message}` }],
|
|
18
|
-
warnings,
|
|
19
|
-
duration_ms: Date.now() - start,
|
|
20
|
-
};
|
|
21
|
-
}
|
|
22
|
-
// Ensure server is reachable
|
|
23
|
-
const ready = await waitForServer(port);
|
|
24
|
-
if (!ready) {
|
|
25
|
-
return {
|
|
26
|
-
gate: "runtime",
|
|
27
|
-
passed: false,
|
|
28
|
-
errors: [{ message: `Dev server not reachable on port ${port}` }],
|
|
29
|
-
warnings,
|
|
30
|
-
duration_ms: Date.now() - start,
|
|
31
|
-
};
|
|
32
|
-
}
|
|
33
|
-
// Test each endpoint
|
|
34
|
-
for (const endpoint of endpoints) {
|
|
35
|
-
let method;
|
|
36
|
-
let path;
|
|
37
|
-
// Parse "GET /api/foo" or "POST /api/foo" or just "/api/foo"
|
|
38
|
-
const spaceIndex = endpoint.indexOf(" ");
|
|
39
|
-
if (spaceIndex !== -1 && spaceIndex < endpoint.indexOf("/")) {
|
|
40
|
-
method = endpoint.substring(0, spaceIndex).toUpperCase();
|
|
41
|
-
path = endpoint.substring(spaceIndex + 1).trim();
|
|
42
|
-
}
|
|
43
|
-
else {
|
|
44
|
-
method = "GET";
|
|
45
|
-
path = endpoint.trim();
|
|
46
|
-
}
|
|
47
|
-
const label = `${method} ${path}`;
|
|
48
|
-
try {
|
|
49
|
-
const response = await fetch(`http://localhost:${port}${path}`, {
|
|
50
|
-
method,
|
|
51
|
-
});
|
|
52
|
-
if (response.status >= 200 && response.status < 300) {
|
|
53
|
-
// Success -- try to parse as JSON for informational warning
|
|
54
|
-
try {
|
|
55
|
-
const json = await response.json();
|
|
56
|
-
const keys = Object.keys(json);
|
|
57
|
-
warnings.push(`${label} -> ${response.status} (JSON, ${keys.length} keys)`);
|
|
58
|
-
}
|
|
59
|
-
catch {
|
|
60
|
-
// Not JSON -- still a success, just note it
|
|
61
|
-
warnings.push(`${label} -> ${response.status} (non-JSON response)`);
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
else {
|
|
65
|
-
errors.push({
|
|
66
|
-
message: `${label} -> ${response.status} ${response.statusText}`,
|
|
67
|
-
});
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
catch (err) {
|
|
71
|
-
const message = err instanceof Error ? err.message : "Request failed";
|
|
72
|
-
errors.push({
|
|
73
|
-
message: `${label} -> FAILED: ${message}`,
|
|
74
|
-
});
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
return {
|
|
78
|
-
gate: "runtime",
|
|
79
|
-
passed: errors.length === 0,
|
|
80
|
-
errors,
|
|
81
|
-
warnings,
|
|
82
|
-
duration_ms: Date.now() - start,
|
|
83
|
-
};
|
|
84
|
-
}
|
|
85
|
-
catch (err) {
|
|
86
|
-
const message = err instanceof Error ? err.message : "Unknown error in verifyRuntime";
|
|
87
|
-
return {
|
|
88
|
-
gate: "runtime",
|
|
89
|
-
passed: false,
|
|
90
|
-
errors: [{ message }],
|
|
91
|
-
warnings,
|
|
92
|
-
duration_ms: Date.now() - start,
|
|
93
|
-
};
|
|
94
|
-
}
|
|
95
|
-
finally {
|
|
96
|
-
await stopDevServer();
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
//# sourceMappingURL=runtime-gate.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"runtime-gate.js","sourceRoot":"","sources":["../../src/gates/runtime-gate.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
export interface TestAnalysisReport {
|
|
2
|
-
framework: {
|
|
3
|
-
testRunner: "vitest" | "jest" | "none";
|
|
4
|
-
appFramework: "nextjs-app" | "nextjs-pages" | "react-vite" | "express" | "plain-ts" | "unknown";
|
|
5
|
-
detectedPatterns: string[];
|
|
6
|
-
};
|
|
7
|
-
coverage: {
|
|
8
|
-
sourceFiles: number;
|
|
9
|
-
testFiles: number;
|
|
10
|
-
ratio: number;
|
|
11
|
-
untestedFiles: string[];
|
|
12
|
-
};
|
|
13
|
-
categories: TestCategory[];
|
|
14
|
-
}
|
|
15
|
-
export interface TestCategory {
|
|
16
|
-
name: string;
|
|
17
|
-
sourceFiles: string[];
|
|
18
|
-
testFiles: string[];
|
|
19
|
-
untestedFiles: string[];
|
|
20
|
-
}
|
|
21
|
-
export declare function analyzeTestCoverage(projectDir: string): Promise<TestAnalysisReport>;
|