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.
Files changed (142) hide show
  1. package/package.json +3 -2
  2. package/dist/gates/codex-gate.d.ts +0 -51
  3. package/dist/gates/codex-gate.js +0 -121
  4. package/dist/gates/codex-gate.js.map +0 -1
  5. package/dist/gates/prd-gate.d.ts +0 -7
  6. package/dist/gates/prd-gate.js +0 -193
  7. package/dist/gates/prd-gate.js.map +0 -1
  8. package/dist/gates/remediation.d.ts +0 -46
  9. package/dist/gates/remediation.js +0 -423
  10. package/dist/gates/remediation.js.map +0 -1
  11. package/dist/gates/review-gate.d.ts +0 -16
  12. package/dist/gates/review-gate.js +0 -479
  13. package/dist/gates/review-gate.js.map +0 -1
  14. package/dist/gates/runtime-gate.d.ts +0 -5
  15. package/dist/gates/runtime-gate.js +0 -99
  16. package/dist/gates/runtime-gate.js.map +0 -1
  17. package/dist/gates/test-analysis.d.ts +0 -21
  18. package/dist/gates/test-analysis.js +0 -394
  19. package/dist/gates/test-analysis.js.map +0 -1
  20. package/dist/gates/visual-capture.d.ts +0 -24
  21. package/dist/gates/visual-capture.js +0 -144
  22. package/dist/gates/visual-capture.js.map +0 -1
  23. package/dist/gates/visual-gate.d.ts +0 -18
  24. package/dist/gates/visual-gate.js +0 -234
  25. package/dist/gates/visual-gate.js.map +0 -1
  26. package/dist/gates/visual-reviewer.d.ts +0 -11
  27. package/dist/gates/visual-reviewer.js +0 -211
  28. package/dist/gates/visual-reviewer.js.map +0 -1
  29. package/dist/go/auto-chain.d.ts +0 -136
  30. package/dist/go/auto-chain.js +0 -389
  31. package/dist/go/auto-chain.js.map +0 -1
  32. package/dist/go/executor.d.ts +0 -137
  33. package/dist/go/executor.js +0 -447
  34. package/dist/go/executor.js.map +0 -1
  35. package/dist/go/finalize.d.ts +0 -108
  36. package/dist/go/finalize.js +0 -331
  37. package/dist/go/finalize.js.map +0 -1
  38. package/dist/go/linear-sync-cli.d.ts +0 -55
  39. package/dist/go/linear-sync-cli.js +0 -192
  40. package/dist/go/linear-sync-cli.js.map +0 -1
  41. package/dist/go/linear-sync.d.ts +0 -112
  42. package/dist/go/linear-sync.js +0 -375
  43. package/dist/go/linear-sync.js.map +0 -1
  44. package/dist/go/prd-queue.d.ts +0 -43
  45. package/dist/go/prd-queue.js +0 -67
  46. package/dist/go/prd-queue.js.map +0 -1
  47. package/dist/go/prd-selector.d.ts +0 -57
  48. package/dist/go/prd-selector.js +0 -101
  49. package/dist/go/prd-selector.js.map +0 -1
  50. package/dist/go/verify-loop.d.ts +0 -64
  51. package/dist/go/verify-loop.js +0 -327
  52. package/dist/go/verify-loop.js.map +0 -1
  53. package/dist/hooks/pre-commit.d.ts +0 -5
  54. package/dist/hooks/pre-commit.js +0 -75
  55. package/dist/hooks/pre-commit.js.map +0 -1
  56. package/dist/linear/issues.d.ts +0 -22
  57. package/dist/linear/issues.js +0 -51
  58. package/dist/linear/issues.js.map +0 -1
  59. package/dist/linear/milestones.d.ts +0 -11
  60. package/dist/linear/milestones.js +0 -32
  61. package/dist/linear/milestones.js.map +0 -1
  62. package/dist/linear/projects.d.ts +0 -16
  63. package/dist/linear/projects.js +0 -51
  64. package/dist/linear/projects.js.map +0 -1
  65. package/dist/reporter/human.d.ts +0 -7
  66. package/dist/reporter/human.js +0 -93
  67. package/dist/reporter/human.js.map +0 -1
  68. package/dist/reporter/json.d.ts +0 -2
  69. package/dist/reporter/json.js +0 -4
  70. package/dist/reporter/json.js.map +0 -1
  71. package/dist/setup/structural-templates.d.ts +0 -12
  72. package/dist/setup/structural-templates.js +0 -288
  73. package/dist/setup/structural-templates.js.map +0 -1
  74. package/dist/setup/templates.d.ts +0 -17
  75. package/dist/setup/templates.js +0 -109
  76. package/dist/setup/templates.js.map +0 -1
  77. package/dist/setup/test-planner.d.ts +0 -38
  78. package/dist/setup/test-planner.js +0 -91
  79. package/dist/setup/test-planner.js.map +0 -1
  80. package/dist/setup/test-scaffold.d.ts +0 -31
  81. package/dist/setup/test-scaffold.js +0 -209
  82. package/dist/setup/test-scaffold.js.map +0 -1
  83. package/dist/setup/test-templates.d.ts +0 -37
  84. package/dist/setup/test-templates.js +0 -313
  85. package/dist/setup/test-templates.js.map +0 -1
  86. package/dist/spec/generator.d.ts +0 -34
  87. package/dist/spec/generator.js +0 -227
  88. package/dist/spec/generator.js.map +0 -1
  89. package/dist/spec/interview.d.ts +0 -142
  90. package/dist/spec/interview.js +0 -287
  91. package/dist/spec/interview.js.map +0 -1
  92. package/dist/spec/linear-sync.d.ts +0 -48
  93. package/dist/spec/linear-sync.js +0 -125
  94. package/dist/spec/linear-sync.js.map +0 -1
  95. package/dist/spec/scanner.d.ts +0 -79
  96. package/dist/spec/scanner.js +0 -566
  97. package/dist/spec/scanner.js.map +0 -1
  98. package/dist/spec/templates.d.ts +0 -375
  99. package/dist/spec/templates.js +0 -95
  100. package/dist/spec/templates.js.map +0 -1
  101. package/dist/state/prd-status.d.ts +0 -62
  102. package/dist/state/prd-status.js +0 -122
  103. package/dist/state/prd-status.js.map +0 -1
  104. package/dist/state/reader.d.ts +0 -7
  105. package/dist/state/reader.js +0 -43
  106. package/dist/state/reader.js.map +0 -1
  107. package/dist/state/writer.d.ts +0 -21
  108. package/dist/state/writer.js +0 -106
  109. package/dist/state/writer.js.map +0 -1
  110. package/dist/team/consensus.d.ts +0 -28
  111. package/dist/team/consensus.js +0 -130
  112. package/dist/team/consensus.js.map +0 -1
  113. package/dist/team/index.d.ts +0 -4
  114. package/dist/team/index.js +0 -5
  115. package/dist/team/index.js.map +0 -1
  116. package/dist/team/lifecycle.d.ts +0 -37
  117. package/dist/team/lifecycle.js +0 -92
  118. package/dist/team/lifecycle.js.map +0 -1
  119. package/dist/team/reviewer.d.ts +0 -10
  120. package/dist/team/reviewer.js +0 -345
  121. package/dist/team/reviewer.js.map +0 -1
  122. package/dist/team/types.d.ts +0 -269
  123. package/dist/team/types.js +0 -70
  124. package/dist/team/types.js.map +0 -1
  125. package/dist/utils/browser.d.ts +0 -10
  126. package/dist/utils/browser.js +0 -96
  127. package/dist/utils/browser.js.map +0 -1
  128. package/dist/utils/platform.d.ts +0 -29
  129. package/dist/utils/platform.js +0 -90
  130. package/dist/utils/platform.js.map +0 -1
  131. package/dist/worktree/identity.d.ts +0 -9
  132. package/dist/worktree/identity.js +0 -32
  133. package/dist/worktree/identity.js.map +0 -1
  134. package/dist/worktree/parallel.d.ts +0 -87
  135. package/dist/worktree/parallel.js +0 -328
  136. package/dist/worktree/parallel.js.map +0 -1
  137. package/dist/worktree/session.d.ts +0 -67
  138. package/dist/worktree/session.js +0 -194
  139. package/dist/worktree/session.js.map +0 -1
  140. package/dist/worktree/state-merge.d.ts +0 -43
  141. package/dist/worktree/state-merge.js +0 -162
  142. 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,5 +0,0 @@
1
- import type { GateResult } from "../types.js";
2
- export declare function verifyRuntime(projectDir: string, endpoints: string[], options?: {
3
- devServerCommand?: string;
4
- devServerPort?: number;
5
- }): Promise<GateResult>;
@@ -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":"AACA,OAAO,EACL,cAAc,EACd,aAAa,EACb,aAAa,GACd,MAAM,qBAAqB,CAAC;AAE7B,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,UAAkB,EAClB,SAAmB,EACnB,OAGC;IAED,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACzB,MAAM,IAAI,GAAG,OAAO,EAAE,aAAa,IAAI,IAAI,CAAC;IAC5C,MAAM,MAAM,GAAgB,EAAE,CAAC;IAC/B,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,IAAI,CAAC;QACH,mBAAmB;QACnB,IAAI,CAAC;YACH,MAAM,cAAc,CAAC,UAAU,EAAE,OAAO,EAAE,gBAAgB,EAAE,IAAI,CAAC,CAAC;QACpE,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,OAAO,GACX,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,0BAA0B,CAAC;YAClE,OAAO;gBACL,IAAI,EAAE,SAAS;gBACf,MAAM,EAAE,KAAK;gBACb,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,+BAA+B,OAAO,EAAE,EAAE,CAAC;gBAC/D,QAAQ;gBACR,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;aAChC,CAAC;QACJ,CAAC;QAED,6BAA6B;QAC7B,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,IAAI,CAAC,CAAC;QACxC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO;gBACL,IAAI,EAAE,SAAS;gBACf,MAAM,EAAE,KAAK;gBACb,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,oCAAoC,IAAI,EAAE,EAAE,CAAC;gBACjE,QAAQ;gBACR,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;aAChC,CAAC;QACJ,CAAC;QAED,qBAAqB;QACrB,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YACjC,IAAI,MAAc,CAAC;YACnB,IAAI,IAAY,CAAC;YAEjB,6DAA6D;YAC7D,MAAM,UAAU,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACzC,IAAI,UAAU,KAAK,CAAC,CAAC,IAAI,UAAU,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC5D,MAAM,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,WAAW,EAAE,CAAC;gBACzD,IAAI,GAAG,QAAQ,CAAC,SAAS,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YACnD,CAAC;iBAAM,CAAC;gBACN,MAAM,GAAG,KAAK,CAAC;gBACf,IAAI,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC;YACzB,CAAC;YAED,MAAM,KAAK,GAAG,GAAG,MAAM,IAAI,IAAI,EAAE,CAAC;YAElC,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,oBAAoB,IAAI,GAAG,IAAI,EAAE,EAAE;oBAC9D,MAAM;iBACP,CAAC,CAAC;gBAEH,IAAI,QAAQ,CAAC,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;oBACpD,4DAA4D;oBAC5D,IAAI,CAAC;wBACH,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;wBACnC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;wBAC/B,QAAQ,CAAC,IAAI,CAAC,GAAG,KAAK,OAAO,QAAQ,CAAC,MAAM,WAAW,IAAI,CAAC,MAAM,QAAQ,CAAC,CAAC;oBAC9E,CAAC;oBAAC,MAAM,CAAC;wBACP,4CAA4C;wBAC5C,QAAQ,CAAC,IAAI,CAAC,GAAG,KAAK,OAAO,QAAQ,CAAC,MAAM,sBAAsB,CAAC,CAAC;oBACtE,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACN,MAAM,CAAC,IAAI,CAAC;wBACV,OAAO,EAAE,GAAG,KAAK,OAAO,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE;qBACjE,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YAAC,OAAO,GAAY,EAAE,CAAC;gBACtB,MAAM,OAAO,GACX,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC;gBACxD,MAAM,CAAC,IAAI,CAAC;oBACV,OAAO,EAAE,GAAG,KAAK,eAAe,OAAO,EAAE;iBAC1C,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,OAAO;YACL,IAAI,EAAE,SAAS;YACf,MAAM,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC;YAC3B,MAAM;YACN,QAAQ;YACR,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;SAChC,CAAC;IACJ,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,MAAM,OAAO,GACX,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,gCAAgC,CAAC;QACxE,OAAO;YACL,IAAI,EAAE,SAAS;YACf,MAAM,EAAE,KAAK;YACb,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC;YACrB,QAAQ;YACR,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;SAChC,CAAC;IACJ,CAAC;YAAS,CAAC;QACT,MAAM,aAAa,EAAE,CAAC;IACxB,CAAC;AACH,CAAC"}
@@ -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>;