coverme-scanner 1.0.9 → 1.0.11

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.
@@ -9,7 +9,173 @@ You will receive PROJECT CONTEXT from the Context Discovery agent. Use it to und
9
9
  - Architecture patterns in use
10
10
  - Existing abstractions and utilities
11
11
 
12
- ## Scan Methodology
12
+ ## CRITICAL: Active Detection Strategies
13
+
14
+ ### Strategy 1: Find Dead Code (Orphan Detection)
15
+
16
+ **Step 1: Build the call graph mentally**
17
+ - Identify all entry points: routes, exports, event handlers, CLI commands
18
+ - Trace what each entry point calls
19
+ - Anything NOT reachable from entry points is dead code
20
+
21
+ **Step 2: Search for orphaned exports**
22
+ ```bash
23
+ # Find all exports
24
+ grep -r "export\s" --include="*.ts" --include="*.js"
25
+
26
+ # For each export, verify it's imported somewhere
27
+ grep -r "import.*{.*ExportName.*}" --include="*.ts" --include="*.js"
28
+ ```
29
+
30
+ **Step 3: Check for disconnected files**
31
+ - Files that export but are never imported
32
+ - Components that exist but aren't used in any route/page
33
+ - Utility functions that have no callers
34
+ - API endpoints with no frontend calls
35
+
36
+ **Red flags for dead code:**
37
+ - Functions with 0 callers (check with: where is this function called?)
38
+ - Files not imported anywhere
39
+ - Routes not linked from UI
40
+ - Event handlers for events never emitted
41
+ - Feature flags that are always false
42
+ - Code behind `if (false)` or `if (0)`
43
+
44
+ ### Strategy 2: Find Duplicate Code
45
+
46
+ **Step 1: Look for similar function names**
47
+ ```bash
48
+ # Functions with similar names often do similar things
49
+ grep -r "function validate" --include="*.ts"
50
+ grep -r "function format" --include="*.ts"
51
+ grep -r "function parse" --include="*.ts"
52
+ grep -r "function handle" --include="*.ts"
53
+ ```
54
+
55
+ **Step 2: Look for repeated patterns**
56
+ - Same regex appearing in multiple files
57
+ - Same error handling pattern copy-pasted
58
+ - Same API call structure repeated
59
+ - Same validation logic in multiple places
60
+ - Same date/string formatting code
61
+
62
+ **Step 3: Compare similar files**
63
+ - Controllers that handle similar resources
64
+ - Components that render similar UI
65
+ - Services that call similar APIs
66
+
67
+ **Report duplicates with ALL locations:**
68
+ ```json
69
+ {
70
+ "locations": [
71
+ {"file": "src/a.ts", "line": 10},
72
+ {"file": "src/b.ts", "line": 25},
73
+ {"file": "src/c.ts", "line": 42}
74
+ ]
75
+ }
76
+ ```
77
+
78
+ ### Strategy 3: Find Silent Failures (Fallback שקט)
79
+
80
+ **This is CRITICAL - silent failures hide bugs!**
81
+
82
+ **Pattern 1: Empty catch blocks**
83
+ ```javascript
84
+ // BAD - silent failure
85
+ try {
86
+ await doSomething();
87
+ } catch (e) {
88
+ // nothing here - BUG HIDER!
89
+ }
90
+ ```
91
+
92
+ **Pattern 2: Catch with only console.log**
93
+ ```javascript
94
+ // BAD - logs but continues as if success
95
+ try {
96
+ await saveToDatabase();
97
+ } catch (e) {
98
+ console.log(e); // No rethrow, no return, continues execution!
99
+ }
100
+ // Code here runs even on failure
101
+ ```
102
+
103
+ **Pattern 3: Default values hiding errors**
104
+ ```javascript
105
+ // BAD - returns empty instead of failing
106
+ function getUsers() {
107
+ try {
108
+ return fetchUsers();
109
+ } catch {
110
+ return []; // Silent! Caller thinks there are 0 users
111
+ }
112
+ }
113
+ ```
114
+
115
+ **Pattern 4: Optional chaining abuse**
116
+ ```javascript
117
+ // Suspicious - why would this be undefined?
118
+ const name = user?.profile?.name ?? 'Unknown';
119
+ // If user should always exist, this hides a bug
120
+ ```
121
+
122
+ **Pattern 5: || and ?? hiding errors**
123
+ ```javascript
124
+ // BAD - error becomes empty string
125
+ const data = riskyOperation() || '';
126
+ const config = parseConfig() ?? {};
127
+ ```
128
+
129
+ **Pattern 6: .catch() with no action**
130
+ ```javascript
131
+ // BAD
132
+ fetchData().catch(() => {});
133
+ promise.catch(console.error); // logs but doesn't handle
134
+ ```
135
+
136
+ **Search commands:**
137
+ ```bash
138
+ # Empty catch
139
+ grep -r "catch.*{[\s]*}" --include="*.ts" --include="*.js"
140
+
141
+ # Catch with only console
142
+ grep -r "catch.*console\.(log|error)" --include="*.ts"
143
+
144
+ # Silent fallbacks
145
+ grep -r "catch.*return \[\]" --include="*.ts"
146
+ grep -r "catch.*return {}" --include="*.ts"
147
+ grep -r "catch.*return null" --include="*.ts"
148
+ grep -r "catch.*return ''" --include="*.ts"
149
+
150
+ # Empty .catch()
151
+ grep -r "\.catch\(\s*\(\)\s*=>" --include="*.ts"
152
+ ```
153
+
154
+ ### Strategy 4: Find Disconnected Code
155
+
156
+ **Code that exists but isn't wired up:**
157
+
158
+ 1. **React components not in routes**
159
+ - Check every component in /components
160
+ - Verify it's used in a page or another component
161
+
162
+ 2. **API endpoints not called**
163
+ - List all routes
164
+ - Search frontend for each endpoint URL
165
+
166
+ 3. **Event handlers not connected**
167
+ - onClick handlers defined but not attached
168
+ - Event listeners for events never emitted
169
+
170
+ 4. **Config options not used**
171
+ - Config keys defined but never read
172
+ - Feature flags that are never checked
173
+
174
+ 5. **Database fields not used**
175
+ - Schema fields with no queries
176
+ - Migrations that add columns never used
177
+
178
+ ## Standard Quality Checks
13
179
 
14
180
  ### 1. DRY Violations (Don't Repeat Yourself)
15
181
  - [ ] Duplicated code blocks (>10 lines similar)
@@ -18,15 +184,6 @@ You will receive PROJECT CONTEXT from the Context Discovery agent. Use it to und
18
184
  - [ ] Repeated patterns that should be abstracted
19
185
  - [ ] Duplicated constants/magic numbers
20
186
 
21
- **How to find:**
22
- ```bash
23
- # Look for similar function signatures
24
- grep -r "function\|const.*=.*=>" --include="*.js" --include="*.ts" | sort | uniq -d
25
-
26
- # Look for repeated patterns
27
- # Use your judgment when reading code
28
- ```
29
-
30
187
  ### 2. Complexity Issues
31
188
  - [ ] Functions >50 lines
32
189
  - [ ] Cyclomatic complexity >10
@@ -36,13 +193,15 @@ grep -r "function\|const.*=.*=>" --include="*.js" --include="*.ts" | sort | uniq
36
193
  - [ ] Files with >500 lines
37
194
 
38
195
  ### 3. Dead Code
39
- - [ ] Unused functions
196
+ - [ ] Unused functions (no callers)
40
197
  - [ ] Unused variables
41
198
  - [ ] Unreachable code paths
42
- - [ ] Commented-out code blocks
199
+ - [ ] Commented-out code blocks (>3 lines)
43
200
  - [ ] Unused imports
44
201
  - [ ] Unused dependencies in package.json
45
202
  - [ ] Deprecated code still present
203
+ - [ ] Feature flags always false
204
+ - [ ] Exports with no imports
46
205
 
47
206
  ### 4. Anti-Patterns
48
207
  - [ ] God objects (classes doing too much)
@@ -54,14 +213,16 @@ grep -r "function\|const.*=.*=>" --include="*.js" --include="*.ts" | sort | uniq
54
213
  - [ ] Magic numbers/strings
55
214
  - [ ] Stringly-typed code
56
215
 
57
- ### 5. Error Handling
58
- - [ ] Empty catch blocks
59
- - [ ] Swallowed errors (catch without logging)
216
+ ### 5. Error Handling Issues (FOCUS HERE!)
217
+ - [ ] Empty catch blocks (**CRITICAL**)
218
+ - [ ] Swallowed errors (catch without rethrow)
219
+ - [ ] Silent fallbacks (return default on error)
60
220
  - [ ] Missing error handling on async operations
61
221
  - [ ] Inconsistent error formats
62
222
  - [ ] No error boundaries in React
63
223
  - [ ] No try-catch around JSON.parse
64
- - [ ] No validation of external data
224
+ - [ ] .catch() with no meaningful action
225
+ - [ ] Errors logged but not propagated
65
226
 
66
227
  ### 6. Type Safety (TypeScript)
67
228
  - [ ] `any` type usage
@@ -106,45 +267,80 @@ For EACH finding, output:
106
267
  ```json
107
268
  {
108
269
  "id": "QUAL-001",
109
- "title": "Duplicated Email Validation Logic",
270
+ "title": "Silent Error Handling in Payment Service",
271
+ "severity": "critical",
272
+ "category": "quality",
273
+ "subcategory": "silent_failure",
274
+ "file": "src/services/paymentService.ts",
275
+ "line": 45,
276
+ "endLine": 52,
277
+ "code": "try {\n await chargeCard(amount);\n} catch (e) {\n console.error(e);\n // continues to \"success\" response!\n}",
278
+ "description": "Payment errors are caught and logged but execution continues as if payment succeeded. Customer could receive product without paying.",
279
+ "impact": "Financial loss. Customers charged $0 for orders. Silent data corruption.",
280
+ "recommendation": "Rethrow the error or return error response:\n\n```typescript\ntry {\n await chargeCard(amount);\n} catch (e) {\n logger.error('Payment failed', { error: e, orderId });\n throw new PaymentError('Payment processing failed');\n}\n```",
281
+ "effort": "low"
282
+ }
283
+ ```
284
+
285
+ ### Dead Code Finding Example
286
+ ```json
287
+ {
288
+ "id": "QUAL-015",
289
+ "title": "Orphaned Component: UserAvatar",
290
+ "severity": "medium",
291
+ "category": "quality",
292
+ "subcategory": "dead_code",
293
+ "file": "src/components/UserAvatar.tsx",
294
+ "line": 1,
295
+ "endLine": 45,
296
+ "description": "UserAvatar component is defined but never imported or used anywhere in the codebase. It appears to be leftover from a removed feature.",
297
+ "evidence": [
298
+ "grep for 'UserAvatar' returns only the definition file",
299
+ "No imports found in any other file",
300
+ "Component not in any route or page"
301
+ ],
302
+ "recommendation": "Delete the file or integrate it if it was meant to be used.",
303
+ "effort": "low"
304
+ }
305
+ ```
306
+
307
+ ### Duplicate Code Finding Example
308
+ ```json
309
+ {
310
+ "id": "QUAL-022",
311
+ "title": "Duplicated Date Formatting Logic",
110
312
  "severity": "medium",
111
313
  "category": "quality",
112
314
  "subcategory": "dry_violation",
113
- "file": "src/services/userService.js",
114
- "line": 45,
115
- "endLine": 55,
315
+ "file": "src/utils/formatters.ts",
316
+ "line": 12,
116
317
  "additionalLocations": [
117
- {"file": "src/controllers/authController.js", "line": 78, "endLine": 88},
118
- {"file": "src/utils/validators.js", "line": 12, "endLine": 22}
318
+ {"file": "src/components/OrderList.tsx", "line": 34},
319
+ {"file": "src/components/InvoiceTable.tsx", "line": 89},
320
+ {"file": "src/pages/Dashboard.tsx", "line": 156}
119
321
  ],
120
- "code": "const isValidEmail = (email) => {\n const regex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n return regex.test(email);\n}",
121
- "description": "Email validation logic is duplicated in 3 different files with slight variations. This leads to inconsistent validation and maintenance burden.",
122
- "impact": "Changes to email validation must be made in 3 places. Risk of inconsistent behavior and bugs when one is updated but others are not.",
123
- "recommendation": "Extract to a shared utility:\n\n```typescript\n// src/utils/validation.ts\nexport const isValidEmail = (email: string): boolean => {\n return /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(email);\n};\n```\n\nThen import and use in all 3 locations.",
124
- "effort": "low",
125
- "linesAffected": 33,
126
- "evidence": [
127
- "Found in userService.js:45-55",
128
- "Found in authController.js:78-88",
129
- "Found in validators.js:12-22"
130
- ]
322
+ "code": "const formatted = `${date.getMonth()+1}/${date.getDate()}/${date.getFullYear()}`",
323
+ "description": "Same date formatting pattern appears in 4 different files. Any format change requires 4 updates.",
324
+ "recommendation": "Extract to shared utility:\n\n```typescript\n// src/utils/date.ts\nexport function formatDate(date: Date): string {\n return new Intl.DateTimeFormat('en-US').format(date);\n}\n```",
325
+ "linesAffected": 4,
326
+ "effort": "low"
131
327
  }
132
328
  ```
133
329
 
134
330
  ## Severity Guidelines
135
331
 
136
- - **Critical**: Will cause production issues (e.g., no error handling on payment flow)
137
- - **High**: Significant maintainability risk (e.g., 500-line function)
138
- - **Medium**: Should be fixed (e.g., DRY violation, missing types)
139
- - **Low**: Nice to fix (e.g., naming issues, minor dead code)
140
- - **Info**: Suggestions (e.g., could be more idiomatic)
332
+ - **Critical**: Silent failures that hide bugs, especially in payments/auth/data
333
+ - **High**: Significant maintainability risk (large dead code, major duplication)
334
+ - **Medium**: Should be fixed (DRY violations, missing types, smaller dead code)
335
+ - **Low**: Nice to fix (naming issues, minor dead code, small duplication)
336
+ - **Info**: Suggestions (could be more idiomatic)
141
337
 
142
338
  ## Rules
143
339
 
144
- 1. **Use context** - If CLAUDE.md says "no mocks", don't flag lack of mocks
145
- 2. **Be practical** - Small duplications (<5 lines) may be acceptable
146
- 3. **Consider tradeoffs** - Sometimes duplication is clearer than abstraction
147
- 4. **Check if it's used** - Before flagging dead code, verify it's really unused
340
+ 1. **Actively search** - Don't just read, grep for patterns
341
+ 2. **Verify dead code** - Confirm it's really not called anywhere
342
+ 3. **Find ALL duplicates** - List every location, not just the first two
343
+ 4. **Silent failures are CRITICAL** - Empty catch blocks hide production bugs
148
344
  5. **Give fixes** - Show exactly how to refactor
149
345
 
150
- START SCANNING NOW. Focus on issues that actually impact code quality.
346
+ START SCANNING NOW. Be aggressive about finding dead code and silent failures.
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/report/index.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,GAAG,MAAM,CAAC;IAC1D,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,MAAM,mBAAmB,GAAG,MAAM,GAAG;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAEpF,MAAM,WAAW,UAAU;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,cAAc,EAAE,aAAa,EAAE,CAAC;IAChC,oBAAoB,EAAE,mBAAmB,EAAE,CAAC;IAC5C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AA8HD,wBAAgB,YAAY,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAiRvD;AAED,wBAAsB,WAAW,CAAC,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA4BvF;AAED,wBAAsB,cAAc,CAClC,QAAQ,EAAE,MAAM,EAChB,UAAU,CAAC,EAAE,MAAM,EACnB,MAAM,GAAE,KAAK,GAAG,MAAc,GAC7B,OAAO,CAAC,IAAI,CAAC,CAaf"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/report/index.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,GAAG,MAAM,CAAC;IAC1D,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,MAAM,mBAAmB,GAAG,MAAM,GAAG;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAEpF,MAAM,WAAW,UAAU;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,cAAc,EAAE,aAAa,EAAE,CAAC;IAChC,oBAAoB,EAAE,mBAAmB,EAAE,CAAC;IAC5C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AA8HD,wBAAgB,YAAY,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAiRvD;AAED,wBAAsB,WAAW,CAAC,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA4BvF;AAED,wBAAsB,cAAc,CAClC,QAAQ,EAAE,MAAM,EAChB,UAAU,CAAC,EAAE,MAAM,EACnB,MAAM,GAAE,KAAK,GAAG,MAAc,GAC7B,OAAO,CAAC,IAAI,CAAC,CAgCf"}
@@ -41,6 +41,7 @@ exports.generatePdf = generatePdf;
41
41
  exports.generateReport = generateReport;
42
42
  const fs = __importStar(require("fs"));
43
43
  const puppeteer_1 = __importDefault(require("puppeteer"));
44
+ const generator_js_1 = require("./generator.js");
44
45
  function escapeHtml(text) {
45
46
  if (!text)
46
47
  return '';
@@ -453,13 +454,31 @@ async function generateReport(jsonPath, outputPath, format = 'pdf') {
453
454
  const reportData = JSON.parse(fs.readFileSync(jsonPath, 'utf-8'));
454
455
  const ext = format === 'pdf' ? '.pdf' : '.html';
455
456
  const finalPath = outputPath || jsonPath.replace('.json', ext);
457
+ // Convert old ScanReport format to new ScanResult format if needed
458
+ const findings = reportData.findings || [];
459
+ const scanResult = {
460
+ projectName: reportData.projectName,
461
+ scanDate: reportData.scanDate,
462
+ filesScanned: reportData.filesScanned || 0,
463
+ agentsUsed: reportData.agentsUsed || [],
464
+ summary: reportData.summary || {
465
+ total: findings.length,
466
+ critical: findings.filter((f) => f.severity === 'critical').length,
467
+ high: findings.filter((f) => f.severity === 'high').length,
468
+ medium: findings.filter((f) => f.severity === 'medium').length,
469
+ low: findings.filter((f) => f.severity === 'low').length,
470
+ info: findings.filter((f) => f.severity === 'info').length,
471
+ avgConfidence: 0,
472
+ },
473
+ findings,
474
+ positiveObservations: reportData.positiveObservations || [],
475
+ scanDuration: reportData.scanDuration || 0,
476
+ };
456
477
  if (format === 'pdf') {
457
- await generatePdf(reportData, finalPath);
478
+ await (0, generator_js_1.generatePdfReport)(scanResult, finalPath);
458
479
  }
459
480
  else {
460
- const html = generateHtml(reportData);
461
- fs.writeFileSync(finalPath, html);
462
- console.log(`HTML generated: ${finalPath}`);
481
+ await (0, generator_js_1.generateHtmlReport)(scanResult, finalPath, reportData.falsePositives || []);
463
482
  }
464
483
  }
465
484
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/report/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/report/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsKA,oCAiRC;AAED,kCA4BC;AAED,wCAoCC;AA3fD,uCAAyB;AAEzB,0DAAkC;AAClC,iDAAwH;AAuCxH,SAAS,UAAU,CAAC,IAAY;IAC9B,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,CAAC;IACrB,OAAO,IAAI;SACR,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC;SACvB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AAC7B,CAAC;AAED,SAAS,cAAc,CAAC,QAAmB;IACzC,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,UAAU,CAAC,CAAC,MAAM,CAAC;IACxE,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC,MAAM,CAAC;IAChE,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,MAAM,CAAC;IACpE,MAAM,GAAG,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,KAAK,CAAC,CAAC,MAAM,CAAC;IAE9D,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,OAAO,IAAI,IAAI,CAAC,GAAG,CAAC,QAAQ,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC;IACvC,OAAO,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;IAClC,OAAO,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;IACpC,OAAO,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC;IAElC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC;IAErD,IAAI,KAAa,CAAC;IAClB,IAAI,QAAQ,GAAG,CAAC;QAAE,KAAK,GAAG,GAAG,CAAC;SACzB,IAAI,KAAK,IAAI,EAAE;QAAE,KAAK,GAAG,GAAG,CAAC;SAC7B,IAAI,KAAK,IAAI,EAAE;QAAE,KAAK,GAAG,GAAG,CAAC;SAC7B,IAAI,KAAK,IAAI,EAAE;QAAE,KAAK,GAAG,GAAG,CAAC;SAC7B,IAAI,KAAK,IAAI,EAAE;QAAE,KAAK,GAAG,GAAG,CAAC;;QAC7B,KAAK,GAAG,GAAG,CAAC;IAEjB,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;AACjC,CAAC;AAED,SAAS,eAAe,CAAC,QAAmB;IAC1C,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,UAAU,CAAC,CAAC,MAAM,CAAC;IACxE,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC,MAAM,CAAC;IAChE,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC;IAE9B,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;QACjB,OAAO,wBAAwB,KAAK,wBAAwB,QAAQ,kBAAkB,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,kCAAkC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,kBAAkB,IAAI,mCAAmC,CAAC,CAAC,CAAC,EAAE,wCAAwC,CAAC;IACnQ,CAAC;IACD,IAAI,IAAI,GAAG,CAAC,EAAE,CAAC;QACb,OAAO,wBAAwB,KAAK,mBAAmB,IAAI,uBAAuB,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,4EAA4E,CAAC;IACpL,CAAC;IACD,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QACd,OAAO,wBAAwB,KAAK,wGAAwG,CAAC;IAC/I,CAAC;IACD,OAAO,kEAAkE,CAAC;AAC5E,CAAC;AAED,SAAS,aAAa,CAAC,CAAU,EAAE,QAAgB;IACjD,MAAM,SAAS,GAAG,oBAAoB,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,gBAAgB,UAAU,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,gBAAgB,CAAC,CAAC,IAAI,IAAI,EAAE,uBAAuB,UAAU,CAAC,CAAC,CAAC,WAAW,CAAC,0BAA0B,UAAU,CAAC,CAAC,CAAC,cAAc,CAAC,oBAAoB,QAAQ,eAAe,UAAU,CAAC,CAAC,CAAC,GAAG,IAAI,EAAE,CAAC,mBAAmB,UAAU,CAAC,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC,uBAAuB,UAAU,CAAC,CAAC,CAAC,WAAW,IAAI,EAAE,CAAC,GAAG,CAAC;IAE1Y,MAAM,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;;;WAGd,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC;WACjB,CAAC,CAAC,CAAC,EAAE,CAAC;IAEf,MAAM,UAAU,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;;;WAGtB,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC;WACrB,CAAC,CAAC,CAAC,EAAE,CAAC;IAEf,MAAM,QAAQ,GAAG,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC;;;WAGxB,UAAU,CAAC,CAAC,CAAC,WAAW,CAAC;WACzB,CAAC,CAAC,CAAC,EAAE,CAAC;IAEf,MAAM,SAAS,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;oCACO,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,CAAC;IAEzE,OAAO;2BACkB,SAAS;;0CAEM,QAAQ,KAAK,QAAQ;sCACzB,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC;qCACpB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE;;;;;wCAK7B,UAAU,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC;wCACxB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE;iFACe,UAAU,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,IAAI,EAAE;;;;;;iBAMxG,UAAU,CAAC,CAAC,CAAC,WAAW,CAAC;;YAE9B,MAAM;YACN,UAAU;YACV,QAAQ;YACR,SAAS;;;iBAGJ,UAAU,CAAC,CAAC,CAAC,cAAc,CAAC;;;;;;;;;yCASJ,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,UAAU,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,IAAI,EAAE;;WAE7F,UAAU,CAAC,CAAC,CAAC,WAAW,CAAC;EAClC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;EAC1C,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,cAAc,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;EACtD,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,kBAAkB,UAAU,CAAC,CAAC,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;;YAExD,UAAU,CAAC,CAAC,CAAC,cAAc,CAAC;;;WAG7B,CAAC;AACZ,CAAC;AAED,SAAgB,YAAY,CAAC,MAAkB;IAC7C,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,cAAc,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAEzD,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,UAAU,CAAC,CAAC;IACxE,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC;IAChE,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC;IACpE,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,KAAK,IAAI,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC;IAEvF,MAAM,eAAe,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;;;QAGxC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;eACnD,CAAC,CAAC,CAAC,EAAE,CAAC;IAEnB,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;;;QAGhC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;eAC3C,CAAC,CAAC,CAAC,EAAE,CAAC;IAEnB,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;;;QAGpC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;eAC/C,CAAC,CAAC,CAAC,EAAE,CAAC;IAEnB,MAAM,UAAU,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;;;QAG9B,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;eACzC,CAAC,CAAC,CAAC,EAAE,CAAC;IAEnB,MAAM,eAAe,GAAG,MAAM,CAAC,oBAAoB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;;;;UAIzD,MAAM,CAAC,oBAAoB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;QACtC,MAAM,IAAI,GAAG,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,WAAW,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;QACnG,OAAO;;;oBAGG,UAAU,CAAC,IAAI,CAAC;gBACpB,CAAC;IACT,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;;eAEN,CAAC,CAAC,CAAC,EAAE,CAAC;IAEnB,OAAO;;;;;WAKE,UAAU,CAAC,MAAM,CAAC,WAAW,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;YA+H7B,UAAU,CAAC,MAAM,CAAC,WAAW,CAAC;wBAClB,MAAM,CAAC,QAAQ;;;;uCAIA,KAAK,KAAK,KAAK;;;kCAGpB,QAAQ,CAAC,MAAM;;;;kCAIf,IAAI,CAAC,MAAM;;;;kCAIX,MAAM,CAAC,MAAM;;;;kCAIb,GAAG,CAAC,MAAM;;;;;;;gCAOZ,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC;;;;;;;;;;;;;;MAc1D,eAAe;MACf,WAAW;MACX,aAAa;MACb,UAAU;MACV,eAAe;;;;WAIV,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,YAAY,GAAG,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,GAAG,MAAM,CAAC,UAAU,GAAG,SAAS,CAAC,CAAC,CAAC,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QA4C3I,CAAC;AACT,CAAC;AAEM,KAAK,UAAU,WAAW,CAAC,MAAkB,EAAE,UAAkB;IACtE,MAAM,IAAI,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;IAElC,MAAM,OAAO,GAAG,MAAM,mBAAS,CAAC,MAAM,CAAC;QACrC,QAAQ,EAAE,IAAI;QACd,IAAI,EAAE,CAAC,cAAc,EAAE,0BAA0B,CAAC;KACnD,CAAC,CAAC;IAEH,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;IACrC,MAAM,IAAI,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;IACpD,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,cAAc,EAAE,CAAC,CAAC;IAC3D,MAAM,IAAI,CAAC,QAAQ,CAAC,6EAA6E,CAAC,CAAC;IAEnG,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC;;;KAGpC,CAAsC,CAAC;IAE1C,MAAM,IAAI,CAAC,GAAG,CAAC;QACb,IAAI,EAAE,UAAU;QAChB,KAAK,EAAE,OAAO;QACd,MAAM,EAAE,GAAG,UAAU,CAAC,MAAM,GAAG,EAAE,IAAI;QACrC,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE;QACpE,eAAe,EAAE,IAAI;KACtB,CAAC,CAAC;IAEH,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;IACtB,OAAO,CAAC,GAAG,CAAC,kBAAkB,UAAU,EAAE,CAAC,CAAC;AAC9C,CAAC;AAEM,KAAK,UAAU,cAAc,CAClC,QAAgB,EAChB,UAAmB,EACnB,SAAyB,KAAK;IAE9B,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;IAElE,MAAM,GAAG,GAAG,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;IAChD,MAAM,SAAS,GAAG,UAAU,IAAI,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IAE/D,mEAAmE;IACnE,MAAM,QAAQ,GAAG,UAAU,CAAC,QAAQ,IAAI,EAAE,CAAC;IAC3C,MAAM,UAAU,GAAe;QAC7B,WAAW,EAAE,UAAU,CAAC,WAAW;QACnC,QAAQ,EAAE,UAAU,CAAC,QAAQ;QAC7B,YAAY,EAAE,UAAU,CAAC,YAAY,IAAI,CAAC;QAC1C,UAAU,EAAE,UAAU,CAAC,UAAU,IAAI,EAAE;QACvC,OAAO,EAAE,UAAU,CAAC,OAAO,IAAI;YAC7B,KAAK,EAAE,QAAQ,CAAC,MAAM;YACtB,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAU,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,UAAU,CAAC,CAAC,MAAM;YAC3E,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAU,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC,MAAM;YACnE,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAU,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,MAAM;YACvE,GAAG,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAU,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,KAAK,CAAC,CAAC,MAAM;YACjE,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAU,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC,MAAM;YACnE,aAAa,EAAE,CAAC;SACjB;QACD,QAAQ;QACR,oBAAoB,EAAE,UAAU,CAAC,oBAAoB,IAAI,EAAE;QAC3D,YAAY,EAAE,UAAU,CAAC,YAAY,IAAI,CAAC;KAC3C,CAAC;IAEF,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;QACrB,MAAM,IAAA,gCAAoB,EAAC,UAAU,EAAE,SAAS,CAAC,CAAC;IACpD,CAAC;SAAM,CAAC;QACN,MAAM,IAAA,iCAAqB,EAAC,UAAU,EAAE,SAAS,EAAE,UAAU,CAAC,cAAc,IAAI,EAAE,CAAC,CAAC;IACtF,CAAC;AACH,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "coverme-scanner",
3
- "version": "1.0.9",
3
+ "version": "1.0.11",
4
4
  "description": "AI-powered code scanner with multi-agent verification for Claude Code. One command scans everything.",
5
5
  "main": "dist/index.js",
6
6
  "bin": {
@@ -9,7 +9,173 @@ You will receive PROJECT CONTEXT from the Context Discovery agent. Use it to und
9
9
  - Architecture patterns in use
10
10
  - Existing abstractions and utilities
11
11
 
12
- ## Scan Methodology
12
+ ## CRITICAL: Active Detection Strategies
13
+
14
+ ### Strategy 1: Find Dead Code (Orphan Detection)
15
+
16
+ **Step 1: Build the call graph mentally**
17
+ - Identify all entry points: routes, exports, event handlers, CLI commands
18
+ - Trace what each entry point calls
19
+ - Anything NOT reachable from entry points is dead code
20
+
21
+ **Step 2: Search for orphaned exports**
22
+ ```bash
23
+ # Find all exports
24
+ grep -r "export\s" --include="*.ts" --include="*.js"
25
+
26
+ # For each export, verify it's imported somewhere
27
+ grep -r "import.*{.*ExportName.*}" --include="*.ts" --include="*.js"
28
+ ```
29
+
30
+ **Step 3: Check for disconnected files**
31
+ - Files that export but are never imported
32
+ - Components that exist but aren't used in any route/page
33
+ - Utility functions that have no callers
34
+ - API endpoints with no frontend calls
35
+
36
+ **Red flags for dead code:**
37
+ - Functions with 0 callers (check with: where is this function called?)
38
+ - Files not imported anywhere
39
+ - Routes not linked from UI
40
+ - Event handlers for events never emitted
41
+ - Feature flags that are always false
42
+ - Code behind `if (false)` or `if (0)`
43
+
44
+ ### Strategy 2: Find Duplicate Code
45
+
46
+ **Step 1: Look for similar function names**
47
+ ```bash
48
+ # Functions with similar names often do similar things
49
+ grep -r "function validate" --include="*.ts"
50
+ grep -r "function format" --include="*.ts"
51
+ grep -r "function parse" --include="*.ts"
52
+ grep -r "function handle" --include="*.ts"
53
+ ```
54
+
55
+ **Step 2: Look for repeated patterns**
56
+ - Same regex appearing in multiple files
57
+ - Same error handling pattern copy-pasted
58
+ - Same API call structure repeated
59
+ - Same validation logic in multiple places
60
+ - Same date/string formatting code
61
+
62
+ **Step 3: Compare similar files**
63
+ - Controllers that handle similar resources
64
+ - Components that render similar UI
65
+ - Services that call similar APIs
66
+
67
+ **Report duplicates with ALL locations:**
68
+ ```json
69
+ {
70
+ "locations": [
71
+ {"file": "src/a.ts", "line": 10},
72
+ {"file": "src/b.ts", "line": 25},
73
+ {"file": "src/c.ts", "line": 42}
74
+ ]
75
+ }
76
+ ```
77
+
78
+ ### Strategy 3: Find Silent Failures (Fallback שקט)
79
+
80
+ **This is CRITICAL - silent failures hide bugs!**
81
+
82
+ **Pattern 1: Empty catch blocks**
83
+ ```javascript
84
+ // BAD - silent failure
85
+ try {
86
+ await doSomething();
87
+ } catch (e) {
88
+ // nothing here - BUG HIDER!
89
+ }
90
+ ```
91
+
92
+ **Pattern 2: Catch with only console.log**
93
+ ```javascript
94
+ // BAD - logs but continues as if success
95
+ try {
96
+ await saveToDatabase();
97
+ } catch (e) {
98
+ console.log(e); // No rethrow, no return, continues execution!
99
+ }
100
+ // Code here runs even on failure
101
+ ```
102
+
103
+ **Pattern 3: Default values hiding errors**
104
+ ```javascript
105
+ // BAD - returns empty instead of failing
106
+ function getUsers() {
107
+ try {
108
+ return fetchUsers();
109
+ } catch {
110
+ return []; // Silent! Caller thinks there are 0 users
111
+ }
112
+ }
113
+ ```
114
+
115
+ **Pattern 4: Optional chaining abuse**
116
+ ```javascript
117
+ // Suspicious - why would this be undefined?
118
+ const name = user?.profile?.name ?? 'Unknown';
119
+ // If user should always exist, this hides a bug
120
+ ```
121
+
122
+ **Pattern 5: || and ?? hiding errors**
123
+ ```javascript
124
+ // BAD - error becomes empty string
125
+ const data = riskyOperation() || '';
126
+ const config = parseConfig() ?? {};
127
+ ```
128
+
129
+ **Pattern 6: .catch() with no action**
130
+ ```javascript
131
+ // BAD
132
+ fetchData().catch(() => {});
133
+ promise.catch(console.error); // logs but doesn't handle
134
+ ```
135
+
136
+ **Search commands:**
137
+ ```bash
138
+ # Empty catch
139
+ grep -r "catch.*{[\s]*}" --include="*.ts" --include="*.js"
140
+
141
+ # Catch with only console
142
+ grep -r "catch.*console\.(log|error)" --include="*.ts"
143
+
144
+ # Silent fallbacks
145
+ grep -r "catch.*return \[\]" --include="*.ts"
146
+ grep -r "catch.*return {}" --include="*.ts"
147
+ grep -r "catch.*return null" --include="*.ts"
148
+ grep -r "catch.*return ''" --include="*.ts"
149
+
150
+ # Empty .catch()
151
+ grep -r "\.catch\(\s*\(\)\s*=>" --include="*.ts"
152
+ ```
153
+
154
+ ### Strategy 4: Find Disconnected Code
155
+
156
+ **Code that exists but isn't wired up:**
157
+
158
+ 1. **React components not in routes**
159
+ - Check every component in /components
160
+ - Verify it's used in a page or another component
161
+
162
+ 2. **API endpoints not called**
163
+ - List all routes
164
+ - Search frontend for each endpoint URL
165
+
166
+ 3. **Event handlers not connected**
167
+ - onClick handlers defined but not attached
168
+ - Event listeners for events never emitted
169
+
170
+ 4. **Config options not used**
171
+ - Config keys defined but never read
172
+ - Feature flags that are never checked
173
+
174
+ 5. **Database fields not used**
175
+ - Schema fields with no queries
176
+ - Migrations that add columns never used
177
+
178
+ ## Standard Quality Checks
13
179
 
14
180
  ### 1. DRY Violations (Don't Repeat Yourself)
15
181
  - [ ] Duplicated code blocks (>10 lines similar)
@@ -18,15 +184,6 @@ You will receive PROJECT CONTEXT from the Context Discovery agent. Use it to und
18
184
  - [ ] Repeated patterns that should be abstracted
19
185
  - [ ] Duplicated constants/magic numbers
20
186
 
21
- **How to find:**
22
- ```bash
23
- # Look for similar function signatures
24
- grep -r "function\|const.*=.*=>" --include="*.js" --include="*.ts" | sort | uniq -d
25
-
26
- # Look for repeated patterns
27
- # Use your judgment when reading code
28
- ```
29
-
30
187
  ### 2. Complexity Issues
31
188
  - [ ] Functions >50 lines
32
189
  - [ ] Cyclomatic complexity >10
@@ -36,13 +193,15 @@ grep -r "function\|const.*=.*=>" --include="*.js" --include="*.ts" | sort | uniq
36
193
  - [ ] Files with >500 lines
37
194
 
38
195
  ### 3. Dead Code
39
- - [ ] Unused functions
196
+ - [ ] Unused functions (no callers)
40
197
  - [ ] Unused variables
41
198
  - [ ] Unreachable code paths
42
- - [ ] Commented-out code blocks
199
+ - [ ] Commented-out code blocks (>3 lines)
43
200
  - [ ] Unused imports
44
201
  - [ ] Unused dependencies in package.json
45
202
  - [ ] Deprecated code still present
203
+ - [ ] Feature flags always false
204
+ - [ ] Exports with no imports
46
205
 
47
206
  ### 4. Anti-Patterns
48
207
  - [ ] God objects (classes doing too much)
@@ -54,14 +213,16 @@ grep -r "function\|const.*=.*=>" --include="*.js" --include="*.ts" | sort | uniq
54
213
  - [ ] Magic numbers/strings
55
214
  - [ ] Stringly-typed code
56
215
 
57
- ### 5. Error Handling
58
- - [ ] Empty catch blocks
59
- - [ ] Swallowed errors (catch without logging)
216
+ ### 5. Error Handling Issues (FOCUS HERE!)
217
+ - [ ] Empty catch blocks (**CRITICAL**)
218
+ - [ ] Swallowed errors (catch without rethrow)
219
+ - [ ] Silent fallbacks (return default on error)
60
220
  - [ ] Missing error handling on async operations
61
221
  - [ ] Inconsistent error formats
62
222
  - [ ] No error boundaries in React
63
223
  - [ ] No try-catch around JSON.parse
64
- - [ ] No validation of external data
224
+ - [ ] .catch() with no meaningful action
225
+ - [ ] Errors logged but not propagated
65
226
 
66
227
  ### 6. Type Safety (TypeScript)
67
228
  - [ ] `any` type usage
@@ -106,45 +267,80 @@ For EACH finding, output:
106
267
  ```json
107
268
  {
108
269
  "id": "QUAL-001",
109
- "title": "Duplicated Email Validation Logic",
270
+ "title": "Silent Error Handling in Payment Service",
271
+ "severity": "critical",
272
+ "category": "quality",
273
+ "subcategory": "silent_failure",
274
+ "file": "src/services/paymentService.ts",
275
+ "line": 45,
276
+ "endLine": 52,
277
+ "code": "try {\n await chargeCard(amount);\n} catch (e) {\n console.error(e);\n // continues to \"success\" response!\n}",
278
+ "description": "Payment errors are caught and logged but execution continues as if payment succeeded. Customer could receive product without paying.",
279
+ "impact": "Financial loss. Customers charged $0 for orders. Silent data corruption.",
280
+ "recommendation": "Rethrow the error or return error response:\n\n```typescript\ntry {\n await chargeCard(amount);\n} catch (e) {\n logger.error('Payment failed', { error: e, orderId });\n throw new PaymentError('Payment processing failed');\n}\n```",
281
+ "effort": "low"
282
+ }
283
+ ```
284
+
285
+ ### Dead Code Finding Example
286
+ ```json
287
+ {
288
+ "id": "QUAL-015",
289
+ "title": "Orphaned Component: UserAvatar",
290
+ "severity": "medium",
291
+ "category": "quality",
292
+ "subcategory": "dead_code",
293
+ "file": "src/components/UserAvatar.tsx",
294
+ "line": 1,
295
+ "endLine": 45,
296
+ "description": "UserAvatar component is defined but never imported or used anywhere in the codebase. It appears to be leftover from a removed feature.",
297
+ "evidence": [
298
+ "grep for 'UserAvatar' returns only the definition file",
299
+ "No imports found in any other file",
300
+ "Component not in any route or page"
301
+ ],
302
+ "recommendation": "Delete the file or integrate it if it was meant to be used.",
303
+ "effort": "low"
304
+ }
305
+ ```
306
+
307
+ ### Duplicate Code Finding Example
308
+ ```json
309
+ {
310
+ "id": "QUAL-022",
311
+ "title": "Duplicated Date Formatting Logic",
110
312
  "severity": "medium",
111
313
  "category": "quality",
112
314
  "subcategory": "dry_violation",
113
- "file": "src/services/userService.js",
114
- "line": 45,
115
- "endLine": 55,
315
+ "file": "src/utils/formatters.ts",
316
+ "line": 12,
116
317
  "additionalLocations": [
117
- {"file": "src/controllers/authController.js", "line": 78, "endLine": 88},
118
- {"file": "src/utils/validators.js", "line": 12, "endLine": 22}
318
+ {"file": "src/components/OrderList.tsx", "line": 34},
319
+ {"file": "src/components/InvoiceTable.tsx", "line": 89},
320
+ {"file": "src/pages/Dashboard.tsx", "line": 156}
119
321
  ],
120
- "code": "const isValidEmail = (email) => {\n const regex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n return regex.test(email);\n}",
121
- "description": "Email validation logic is duplicated in 3 different files with slight variations. This leads to inconsistent validation and maintenance burden.",
122
- "impact": "Changes to email validation must be made in 3 places. Risk of inconsistent behavior and bugs when one is updated but others are not.",
123
- "recommendation": "Extract to a shared utility:\n\n```typescript\n// src/utils/validation.ts\nexport const isValidEmail = (email: string): boolean => {\n return /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(email);\n};\n```\n\nThen import and use in all 3 locations.",
124
- "effort": "low",
125
- "linesAffected": 33,
126
- "evidence": [
127
- "Found in userService.js:45-55",
128
- "Found in authController.js:78-88",
129
- "Found in validators.js:12-22"
130
- ]
322
+ "code": "const formatted = `${date.getMonth()+1}/${date.getDate()}/${date.getFullYear()}`",
323
+ "description": "Same date formatting pattern appears in 4 different files. Any format change requires 4 updates.",
324
+ "recommendation": "Extract to shared utility:\n\n```typescript\n// src/utils/date.ts\nexport function formatDate(date: Date): string {\n return new Intl.DateTimeFormat('en-US').format(date);\n}\n```",
325
+ "linesAffected": 4,
326
+ "effort": "low"
131
327
  }
132
328
  ```
133
329
 
134
330
  ## Severity Guidelines
135
331
 
136
- - **Critical**: Will cause production issues (e.g., no error handling on payment flow)
137
- - **High**: Significant maintainability risk (e.g., 500-line function)
138
- - **Medium**: Should be fixed (e.g., DRY violation, missing types)
139
- - **Low**: Nice to fix (e.g., naming issues, minor dead code)
140
- - **Info**: Suggestions (e.g., could be more idiomatic)
332
+ - **Critical**: Silent failures that hide bugs, especially in payments/auth/data
333
+ - **High**: Significant maintainability risk (large dead code, major duplication)
334
+ - **Medium**: Should be fixed (DRY violations, missing types, smaller dead code)
335
+ - **Low**: Nice to fix (naming issues, minor dead code, small duplication)
336
+ - **Info**: Suggestions (could be more idiomatic)
141
337
 
142
338
  ## Rules
143
339
 
144
- 1. **Use context** - If CLAUDE.md says "no mocks", don't flag lack of mocks
145
- 2. **Be practical** - Small duplications (<5 lines) may be acceptable
146
- 3. **Consider tradeoffs** - Sometimes duplication is clearer than abstraction
147
- 4. **Check if it's used** - Before flagging dead code, verify it's really unused
340
+ 1. **Actively search** - Don't just read, grep for patterns
341
+ 2. **Verify dead code** - Confirm it's really not called anywhere
342
+ 3. **Find ALL duplicates** - List every location, not just the first two
343
+ 4. **Silent failures are CRITICAL** - Empty catch blocks hide production bugs
148
344
  5. **Give fixes** - Show exactly how to refactor
149
345
 
150
- START SCANNING NOW. Focus on issues that actually impact code quality.
346
+ START SCANNING NOW. Be aggressive about finding dead code and silent failures.
@@ -1,6 +1,8 @@
1
1
  import * as fs from 'fs';
2
2
  import * as path from 'path';
3
3
  import puppeteer from 'puppeteer';
4
+ import { generateHtmlReport as generateHtmlReportNew, generatePdfReport as generatePdfReportNew } from './generator.js';
5
+ import type { ScanResult } from '../types.js';
4
6
 
5
7
  export interface Finding {
6
8
  id: string;
@@ -472,16 +474,35 @@ export async function generateReport(
472
474
  outputPath?: string,
473
475
  format: 'pdf' | 'html' = 'pdf'
474
476
  ): Promise<void> {
475
- const reportData = JSON.parse(fs.readFileSync(jsonPath, 'utf-8')) as ScanReport;
477
+ const reportData = JSON.parse(fs.readFileSync(jsonPath, 'utf-8'));
476
478
 
477
479
  const ext = format === 'pdf' ? '.pdf' : '.html';
478
480
  const finalPath = outputPath || jsonPath.replace('.json', ext);
479
481
 
482
+ // Convert old ScanReport format to new ScanResult format if needed
483
+ const findings = reportData.findings || [];
484
+ const scanResult: ScanResult = {
485
+ projectName: reportData.projectName,
486
+ scanDate: reportData.scanDate,
487
+ filesScanned: reportData.filesScanned || 0,
488
+ agentsUsed: reportData.agentsUsed || [],
489
+ summary: reportData.summary || {
490
+ total: findings.length,
491
+ critical: findings.filter((f: Finding) => f.severity === 'critical').length,
492
+ high: findings.filter((f: Finding) => f.severity === 'high').length,
493
+ medium: findings.filter((f: Finding) => f.severity === 'medium').length,
494
+ low: findings.filter((f: Finding) => f.severity === 'low').length,
495
+ info: findings.filter((f: Finding) => f.severity === 'info').length,
496
+ avgConfidence: 0,
497
+ },
498
+ findings,
499
+ positiveObservations: reportData.positiveObservations || [],
500
+ scanDuration: reportData.scanDuration || 0,
501
+ };
502
+
480
503
  if (format === 'pdf') {
481
- await generatePdf(reportData, finalPath);
504
+ await generatePdfReportNew(scanResult, finalPath);
482
505
  } else {
483
- const html = generateHtml(reportData);
484
- fs.writeFileSync(finalPath, html);
485
- console.log(`HTML generated: ${finalPath}`);
506
+ await generateHtmlReportNew(scanResult, finalPath, reportData.falsePositives || []);
486
507
  }
487
508
  }