fivocell 3.1.0 → 4.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (176) hide show
  1. package/dist/__tests__/behavior-intelligence-bug.test.d.ts +2 -0
  2. package/dist/__tests__/behavior-intelligence-bug.test.d.ts.map +1 -0
  3. package/dist/__tests__/behavior-intelligence-bug.test.js +21 -0
  4. package/dist/__tests__/behavior-intelligence-bug.test.js.map +1 -0
  5. package/dist/__tests__/code-scanner-arrow-return-type.test.d.ts +2 -0
  6. package/dist/__tests__/code-scanner-arrow-return-type.test.d.ts.map +1 -0
  7. package/dist/__tests__/code-scanner-arrow-return-type.test.js +76 -0
  8. package/dist/__tests__/code-scanner-arrow-return-type.test.js.map +1 -0
  9. package/dist/__tests__/code-scanner-blindspot.test.d.ts +2 -0
  10. package/dist/__tests__/code-scanner-blindspot.test.d.ts.map +1 -0
  11. package/dist/__tests__/code-scanner-blindspot.test.js +18 -0
  12. package/dist/__tests__/code-scanner-blindspot.test.js.map +1 -0
  13. package/dist/__tests__/code-scanner-error-recovery.test.d.ts +2 -0
  14. package/dist/__tests__/code-scanner-error-recovery.test.d.ts.map +1 -0
  15. package/dist/__tests__/code-scanner-error-recovery.test.js +21 -0
  16. package/dist/__tests__/code-scanner-error-recovery.test.js.map +1 -0
  17. package/dist/__tests__/code-scanner-n1-detection.test.d.ts +2 -0
  18. package/dist/__tests__/code-scanner-n1-detection.test.d.ts.map +1 -0
  19. package/dist/__tests__/code-scanner-n1-detection.test.js +113 -0
  20. package/dist/__tests__/code-scanner-n1-detection.test.js.map +1 -0
  21. package/dist/__tests__/code-scanner-nesting.test.d.ts +2 -0
  22. package/dist/__tests__/code-scanner-nesting.test.d.ts.map +1 -0
  23. package/dist/__tests__/code-scanner-nesting.test.js +113 -0
  24. package/dist/__tests__/code-scanner-nesting.test.js.map +1 -0
  25. package/dist/__tests__/code-scanner-null-check.test.d.ts +2 -0
  26. package/dist/__tests__/code-scanner-null-check.test.d.ts.map +1 -0
  27. package/dist/__tests__/code-scanner-null-check.test.js +126 -0
  28. package/dist/__tests__/code-scanner-null-check.test.js.map +1 -0
  29. package/dist/__tests__/code-scanner-sql-fix.test.d.ts +2 -0
  30. package/dist/__tests__/code-scanner-sql-fix.test.d.ts.map +1 -0
  31. package/dist/__tests__/code-scanner-sql-fix.test.js +21 -0
  32. package/dist/__tests__/code-scanner-sql-fix.test.js.map +1 -0
  33. package/dist/__tests__/code-scanner-trust-score.test.d.ts +1 -0
  34. package/dist/__tests__/code-scanner-trust-score.test.d.ts.map +1 -0
  35. package/dist/__tests__/code-scanner-trust-score.test.js +39 -0
  36. package/dist/__tests__/code-scanner-trust-score.test.js.map +1 -0
  37. package/dist/__tests__/code-scanner-validation.test.d.ts +2 -0
  38. package/dist/__tests__/code-scanner-validation.test.d.ts.map +1 -0
  39. package/dist/__tests__/code-scanner-validation.test.js +131 -0
  40. package/dist/__tests__/code-scanner-validation.test.js.map +1 -0
  41. package/dist/__tests__/community-store.test.d.ts +2 -0
  42. package/dist/__tests__/community-store.test.d.ts.map +1 -0
  43. package/dist/__tests__/community-store.test.js +231 -0
  44. package/dist/__tests__/community-store.test.js.map +1 -0
  45. package/dist/__tests__/enhanced-blind-spots.test.d.ts +2 -0
  46. package/dist/__tests__/enhanced-blind-spots.test.d.ts.map +1 -0
  47. package/dist/__tests__/enhanced-blind-spots.test.js +302 -0
  48. package/dist/__tests__/enhanced-blind-spots.test.js.map +1 -0
  49. package/dist/__tests__/knowledge-graph-store.test.d.ts +2 -0
  50. package/dist/__tests__/knowledge-graph-store.test.d.ts.map +1 -0
  51. package/dist/__tests__/knowledge-graph-store.test.js +252 -0
  52. package/dist/__tests__/knowledge-graph-store.test.js.map +1 -0
  53. package/dist/__tests__/live-watcher.test.d.ts +2 -0
  54. package/dist/__tests__/live-watcher.test.d.ts.map +1 -0
  55. package/dist/__tests__/live-watcher.test.js +312 -0
  56. package/dist/__tests__/live-watcher.test.js.map +1 -0
  57. package/dist/__tests__/mcp-cell-tools.test.d.ts +2 -0
  58. package/dist/__tests__/mcp-cell-tools.test.d.ts.map +1 -0
  59. package/dist/__tests__/mcp-cell-tools.test.js +176 -0
  60. package/dist/__tests__/mcp-cell-tools.test.js.map +1 -0
  61. package/dist/__tests__/multi-project.test.d.ts +2 -0
  62. package/dist/__tests__/multi-project.test.d.ts.map +1 -0
  63. package/dist/__tests__/multi-project.test.js +145 -0
  64. package/dist/__tests__/multi-project.test.js.map +1 -0
  65. package/dist/__tests__/pc-scanner-paths.test.d.ts +2 -0
  66. package/dist/__tests__/pc-scanner-paths.test.d.ts.map +1 -0
  67. package/dist/__tests__/pc-scanner-paths.test.js +16 -0
  68. package/dist/__tests__/pc-scanner-paths.test.js.map +1 -0
  69. package/dist/__tests__/prompt-builder-realdata.test.d.ts +2 -0
  70. package/dist/__tests__/prompt-builder-realdata.test.d.ts.map +1 -0
  71. package/dist/__tests__/prompt-builder-realdata.test.js +94 -0
  72. package/dist/__tests__/prompt-builder-realdata.test.js.map +1 -0
  73. package/dist/__tests__/prompt-builder-sessions.test.d.ts +2 -0
  74. package/dist/__tests__/prompt-builder-sessions.test.d.ts.map +1 -0
  75. package/dist/__tests__/prompt-builder-sessions.test.js +124 -0
  76. package/dist/__tests__/prompt-builder-sessions.test.js.map +1 -0
  77. package/dist/__tests__/security.test.d.ts +1 -0
  78. package/dist/__tests__/security.test.d.ts.map +1 -0
  79. package/dist/__tests__/security.test.js +161 -0
  80. package/dist/__tests__/security.test.js.map +1 -0
  81. package/dist/__tests__/session-bridge.test.d.ts +2 -0
  82. package/dist/__tests__/session-bridge.test.d.ts.map +1 -0
  83. package/dist/__tests__/session-bridge.test.js +158 -0
  84. package/dist/__tests__/session-bridge.test.js.map +1 -0
  85. package/dist/__tests__/session-memory-tables.test.d.ts +2 -0
  86. package/dist/__tests__/session-memory-tables.test.d.ts.map +1 -0
  87. package/dist/__tests__/session-memory-tables.test.js +169 -0
  88. package/dist/__tests__/session-memory-tables.test.js.map +1 -0
  89. package/dist/__tests__/staleness-detection.test.d.ts +2 -0
  90. package/dist/__tests__/staleness-detection.test.d.ts.map +1 -0
  91. package/dist/__tests__/staleness-detection.test.js +105 -0
  92. package/dist/__tests__/staleness-detection.test.js.map +1 -0
  93. package/dist/__tests__/team-collaboration.test.d.ts +2 -0
  94. package/dist/__tests__/team-collaboration.test.d.ts.map +1 -0
  95. package/dist/__tests__/team-collaboration.test.js +224 -0
  96. package/dist/__tests__/team-collaboration.test.js.map +1 -0
  97. package/dist/__tests__/tool-specific-format.test.d.ts +2 -0
  98. package/dist/__tests__/tool-specific-format.test.d.ts.map +1 -0
  99. package/dist/__tests__/tool-specific-format.test.js +132 -0
  100. package/dist/__tests__/tool-specific-format.test.js.map +1 -0
  101. package/dist/__tests__/usage-intelligence-store.test.d.ts +2 -0
  102. package/dist/__tests__/usage-intelligence-store.test.d.ts.map +1 -0
  103. package/dist/__tests__/usage-intelligence-store.test.js +266 -0
  104. package/dist/__tests__/usage-intelligence-store.test.js.map +1 -0
  105. package/dist/ai-bridge.d.ts +20 -0
  106. package/dist/ai-bridge.d.ts.map +1 -0
  107. package/dist/ai-bridge.js +250 -0
  108. package/dist/ai-bridge.js.map +1 -0
  109. package/dist/behavior-intelligence.d.ts.map +1 -1
  110. package/dist/behavior-intelligence.js +12 -1
  111. package/dist/behavior-intelligence.js.map +1 -1
  112. package/dist/cli.js +501 -4
  113. package/dist/cli.js.map +1 -1
  114. package/dist/code-scanner.d.ts.map +1 -1
  115. package/dist/code-scanner.js +426 -69
  116. package/dist/code-scanner.js.map +1 -1
  117. package/dist/core/community-store.d.ts +128 -0
  118. package/dist/core/community-store.d.ts.map +1 -0
  119. package/dist/core/community-store.js +329 -0
  120. package/dist/core/community-store.js.map +1 -0
  121. package/dist/core/database.d.ts +0 -3
  122. package/dist/core/database.d.ts.map +1 -1
  123. package/dist/core/database.js +287 -15
  124. package/dist/core/database.js.map +1 -1
  125. package/dist/core/enhanced-blind-spots.d.ts +27 -0
  126. package/dist/core/enhanced-blind-spots.d.ts.map +1 -0
  127. package/dist/core/enhanced-blind-spots.js +591 -0
  128. package/dist/core/enhanced-blind-spots.js.map +1 -0
  129. package/dist/core/knowledge-graph-store.d.ts +69 -0
  130. package/dist/core/knowledge-graph-store.d.ts.map +1 -0
  131. package/dist/core/knowledge-graph-store.js +269 -0
  132. package/dist/core/knowledge-graph-store.js.map +1 -0
  133. package/dist/core/live-watcher.d.ts +52 -0
  134. package/dist/core/live-watcher.d.ts.map +1 -0
  135. package/dist/core/live-watcher.js +369 -0
  136. package/dist/core/live-watcher.js.map +1 -0
  137. package/dist/core/project-registry.d.ts +24 -0
  138. package/dist/core/project-registry.d.ts.map +1 -0
  139. package/dist/core/project-registry.js +70 -0
  140. package/dist/core/project-registry.js.map +1 -0
  141. package/dist/core/prompt-builder.d.ts +50 -0
  142. package/dist/core/prompt-builder.d.ts.map +1 -1
  143. package/dist/core/prompt-builder.js +533 -79
  144. package/dist/core/prompt-builder.js.map +1 -1
  145. package/dist/core/security.d.ts +23 -0
  146. package/dist/core/security.d.ts.map +1 -0
  147. package/dist/core/security.js +117 -0
  148. package/dist/core/security.js.map +1 -0
  149. package/dist/core/session-memory.d.ts +64 -0
  150. package/dist/core/session-memory.d.ts.map +1 -1
  151. package/dist/core/session-memory.js +111 -0
  152. package/dist/core/session-memory.js.map +1 -1
  153. package/dist/core/usage-intelligence-store.d.ts +126 -0
  154. package/dist/core/usage-intelligence-store.d.ts.map +1 -0
  155. package/dist/core/usage-intelligence-store.js +405 -0
  156. package/dist/core/usage-intelligence-store.js.map +1 -0
  157. package/dist/daemon/server.d.ts.map +1 -1
  158. package/dist/daemon/server.js +936 -17
  159. package/dist/daemon/server.js.map +1 -1
  160. package/dist/knowledge-graph-builder.d.ts +16 -0
  161. package/dist/knowledge-graph-builder.d.ts.map +1 -0
  162. package/dist/knowledge-graph-builder.js +186 -0
  163. package/dist/knowledge-graph-builder.js.map +1 -0
  164. package/dist/pc-scanner.d.ts +1 -0
  165. package/dist/pc-scanner.d.ts.map +1 -1
  166. package/dist/pc-scanner.js +58 -30
  167. package/dist/pc-scanner.js.map +1 -1
  168. package/dist/stack-detector.d.ts +34 -0
  169. package/dist/stack-detector.d.ts.map +1 -0
  170. package/dist/stack-detector.js +471 -0
  171. package/dist/stack-detector.js.map +1 -0
  172. package/dist/team-intel.d.ts +31 -0
  173. package/dist/team-intel.d.ts.map +1 -0
  174. package/dist/team-intel.js +310 -0
  175. package/dist/team-intel.js.map +1 -0
  176. package/package.json +1 -1
@@ -0,0 +1,591 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.scanFileForBlindSpots = scanFileForBlindSpots;
37
+ exports.scanDirectoryForBlindSpots = scanDirectoryForBlindSpots;
38
+ exports.summarizeBlindSpots = summarizeBlindSpots;
39
+ exports.formatBlindSpotReport = formatBlindSpotReport;
40
+ exports.getCategoryCounts = getCategoryCounts;
41
+ const fs = __importStar(require("fs"));
42
+ const path = __importStar(require("path"));
43
+ // ─── Helpers ──────────────────────────────────────────────────────────────
44
+ const REACT_EXT = new Set(['.jsx', '.tsx']);
45
+ const JS_EXT = new Set(['.js', '.jsx', '.ts', '.tsx', '.mjs', '.cjs']);
46
+ const IGNORE_DIRS = new Set(['node_modules', '.git', 'dist', 'build', '.next', '.nuxt', 'coverage', '__pycache__', 'archived']);
47
+ function shouldScan(p) {
48
+ const parts = p.split(path.sep);
49
+ return !parts.some(dir => IGNORE_DIRS.has(dir) || dir.startsWith('.'));
50
+ }
51
+ function readLines(filePath) {
52
+ try {
53
+ return fs.readFileSync(filePath, 'utf-8').split(/\r?\n/);
54
+ }
55
+ catch {
56
+ return [];
57
+ }
58
+ }
59
+ function lineAt(lines, idx) {
60
+ if (idx < 0 || idx >= lines.length)
61
+ return '';
62
+ return lines[idx].trim();
63
+ }
64
+ function findLine(lines, predicate, startFrom = 0) {
65
+ for (let i = startFrom; i < lines.length; i++) {
66
+ if (predicate(lines[i]))
67
+ return i + 1;
68
+ }
69
+ return 0;
70
+ }
71
+ function isAsyncFunc(line) {
72
+ return /^\s*(export\s+)?(async\s+)?(function|const|let|var|class|\([^)]*\)|\w+\s*=\s*async|\w+\s*:\s*async)/.test(line)
73
+ && /async\s/.test(line);
74
+ }
75
+ function hasTryCatchBetween(lines, start, depth = 1) {
76
+ // Walk forward, track brace depth, look for matching try/catch pair
77
+ let tries = 0, catches = 0;
78
+ for (let i = start; i < lines.length && i < start + 80; i++) {
79
+ const l = lines[i];
80
+ if (/\btry\s*\{/.test(l))
81
+ tries++;
82
+ if (/\}\s*catch\b/.test(l) || /\bcatch\s*\(/.test(l))
83
+ catches++;
84
+ }
85
+ return catches > 0;
86
+ }
87
+ function makeId() {
88
+ return 'bs_' + Math.random().toString(36).slice(2, 10) + Date.now().toString(36);
89
+ }
90
+ // ─── Detectors ────────────────────────────────────────────────────────────
91
+ function detectPromisesWithoutCatch(filePath, lines) {
92
+ const ext = path.extname(filePath);
93
+ if (!JS_EXT.has(ext))
94
+ return [];
95
+ const out = [];
96
+ for (let i = 0; i < lines.length; i++) {
97
+ const l = lineAt(lines, i);
98
+ if (/\.then\s*\(/.test(l) && !/\.catch\s*\(/.test(l)) {
99
+ // Look ahead 5 lines for a .catch
100
+ let hasCatch = false;
101
+ for (let j = i + 1; j <= i + 5 && j < lines.length; j++) {
102
+ if (/\.catch\s*\(/.test(lines[j])) {
103
+ hasCatch = true;
104
+ break;
105
+ }
106
+ }
107
+ if (!hasCatch) {
108
+ out.push({
109
+ id: makeId(), category: 'error_handling', severity: 'high',
110
+ message: 'Promise.then() without .catch() — unhandled rejection risk',
111
+ filePath, lineNumber: i + 1, codeSnippet: l.slice(0, 120),
112
+ recommendation: 'Add .catch() handler, or use try/await with proper error handling',
113
+ detectedAt: new Date().toISOString(),
114
+ });
115
+ }
116
+ }
117
+ }
118
+ return out;
119
+ }
120
+ function detectMissingReactErrorBoundaries(filePath, lines) {
121
+ const ext = path.extname(filePath);
122
+ if (!REACT_EXT.has(ext))
123
+ return [];
124
+ const out = [];
125
+ // Check for render functions / class components without ErrorBoundary wrap
126
+ let hasErrorBoundary = false;
127
+ for (const l of lines) {
128
+ if (/ErrorBoundary|componentDidCatch|getDerivedStateFromError/.test(l)) {
129
+ hasErrorBoundary = true;
130
+ break;
131
+ }
132
+ }
133
+ if (hasErrorBoundary)
134
+ return [];
135
+ for (let i = 0; i < lines.length; i++) {
136
+ const l = lineAt(lines, i);
137
+ if (/(return\s*\(\s*<|render\s*\(\s*\)\s*\{|class\s+\w+\s+extends\s+(React\.)?Component)/.test(l)) {
138
+ out.push({
139
+ id: makeId(), category: 'error_handling', severity: 'medium',
140
+ message: 'React component without ErrorBoundary — unhandled render errors crash tree',
141
+ filePath, lineNumber: i + 1, codeSnippet: l.slice(0, 120),
142
+ recommendation: 'Wrap render in <ErrorBoundary> or add componentDidCatch',
143
+ detectedAt: new Date().toISOString(),
144
+ });
145
+ break; // one per file
146
+ }
147
+ }
148
+ return out;
149
+ }
150
+ function detectApiCallsWithoutErrorState(filePath, lines) {
151
+ const ext = path.extname(filePath);
152
+ if (!JS_EXT.has(ext))
153
+ return [];
154
+ const out = [];
155
+ for (let i = 0; i < lines.length; i++) {
156
+ const l = lineAt(lines, i);
157
+ if (/\b(fetch|axios|got)\s*\(/.test(l) || /\b(fetch|axios|got)\.\w+\s*\(/.test(l)) {
158
+ // Look back 10 lines and ahead 15 lines for .catch, try/catch, or error state
159
+ let hasError = false;
160
+ for (let j = Math.max(0, i - 10); j < i + 15 && j < lines.length; j++) {
161
+ if (/\.catch\s*\(/.test(lines[j]) || /\btry\s*\{/.test(lines[j])) {
162
+ hasError = true;
163
+ break;
164
+ }
165
+ }
166
+ if (!hasError) {
167
+ out.push({
168
+ id: makeId(), category: 'error_handling', severity: 'high',
169
+ message: 'API call without error handling — silent failures on network errors',
170
+ filePath, lineNumber: i + 1, codeSnippet: l.slice(0, 120),
171
+ recommendation: 'Add try/catch or .catch() handler; expose error state to UI',
172
+ detectedAt: new Date().toISOString(),
173
+ });
174
+ }
175
+ }
176
+ }
177
+ return out;
178
+ }
179
+ function detectDbOperationsWithoutRollback(filePath, lines) {
180
+ const ext = path.extname(filePath);
181
+ if (!JS_EXT.has(ext))
182
+ return [];
183
+ const out = [];
184
+ for (let i = 0; i < lines.length; i++) {
185
+ const l = lineAt(lines, i);
186
+ if (/\b(prisma\.\w+\.\w+|db\.\w+\.\w+|knex\(.+?\)\(|sequelize\.\w+|mongoose\.\w+\.\w+|pool\.query)\s*\(/.test(l)) {
187
+ let hasTransaction = false;
188
+ for (let j = i; j < i + 20 && j < lines.length; j++) {
189
+ if (/\$transaction|\$transaction\(|BEGIN|transaction\(\)|\.transaction\(/.test(lines[j])) {
190
+ hasTransaction = true;
191
+ break;
192
+ }
193
+ }
194
+ if (!hasTransaction) {
195
+ out.push({
196
+ id: makeId(), category: 'error_handling', severity: 'medium',
197
+ message: 'DB operation without transaction — partial writes on failure',
198
+ filePath, lineNumber: i + 1, codeSnippet: l.slice(0, 120),
199
+ recommendation: 'Wrap multi-step DB ops in $transaction or .transaction()',
200
+ detectedAt: new Date().toISOString(),
201
+ });
202
+ }
203
+ }
204
+ }
205
+ return out;
206
+ }
207
+ function detectFileOpsWithoutErrorHandling(filePath, lines) {
208
+ const ext = path.extname(filePath);
209
+ if (!JS_EXT.has(ext))
210
+ return [];
211
+ const out = [];
212
+ for (let i = 0; i < lines.length; i++) {
213
+ const l = lineAt(lines, i);
214
+ if (/\b(readFile|writeFile|appendFile|unlink|rm|mkdir|readdir|createReadStream|createWriteStream)\s*\(/.test(l)
215
+ && !/Sync\s*\(/.test(l)) {
216
+ // Check for await + try/catch nearby
217
+ let hasError = false;
218
+ for (let j = Math.max(0, i - 5); j < i + 10 && j < lines.length; j++) {
219
+ if (/\btry\s*\{/.test(lines[j])) {
220
+ hasError = true;
221
+ break;
222
+ }
223
+ }
224
+ if (!hasError) {
225
+ out.push({
226
+ id: makeId(), category: 'error_handling', severity: 'low',
227
+ message: 'File operation without error handling — crashes on ENOENT/EACCES',
228
+ filePath, lineNumber: i + 1, codeSnippet: l.slice(0, 120),
229
+ recommendation: 'Wrap in try/catch and handle ENOENT explicitly',
230
+ detectedAt: new Date().toISOString(),
231
+ });
232
+ }
233
+ }
234
+ }
235
+ return out;
236
+ }
237
+ function detectApiWithoutTimeout(filePath, lines) {
238
+ const ext = path.extname(filePath);
239
+ if (!JS_EXT.has(ext))
240
+ return [];
241
+ const out = [];
242
+ for (let i = 0; i < lines.length; i++) {
243
+ const l = lineAt(lines, i);
244
+ if (/\baxios\s*\(/.test(l) || /axios\.\w+\s*\(/.test(l)) {
245
+ // Look at next 10 lines for timeout config
246
+ let hasTimeout = false;
247
+ for (let j = i; j < i + 10 && j < lines.length; j++) {
248
+ if (/timeout\s*:/.test(lines[j])) {
249
+ hasTimeout = true;
250
+ break;
251
+ }
252
+ }
253
+ if (!hasTimeout) {
254
+ out.push({
255
+ id: makeId(), category: 'error_handling', severity: 'medium',
256
+ message: 'Axios call without timeout — hangs forever on unresponsive servers',
257
+ filePath, lineNumber: i + 1, codeSnippet: l.slice(0, 120),
258
+ recommendation: 'Add timeout: 5000 (or appropriate) in axios config',
259
+ detectedAt: new Date().toISOString(),
260
+ });
261
+ }
262
+ }
263
+ }
264
+ return out;
265
+ }
266
+ function detectAwaitWithoutNullCheck(filePath, lines) {
267
+ const ext = path.extname(filePath);
268
+ if (!JS_EXT.has(ext))
269
+ return [];
270
+ const out = [];
271
+ for (let i = 0; i < lines.length; i++) {
272
+ const l = lineAt(lines, i);
273
+ const m = l.match(/(?:const|let|var)\s+(\w+)\s*=\s*await\s+(?:this\.)?(\w+)\s*\(/);
274
+ if (!m)
275
+ continue;
276
+ const varName = m[1];
277
+ // Look ahead 10 lines for `if (!varName)` or `?.` or null check
278
+ let checked = false;
279
+ for (let j = i + 1; j < i + 10 && j < lines.length; j++) {
280
+ if (new RegExp(`if\\s*\\(\\s*!?\\s*${varName}\\b|${varName}\\s*\\?\\.|${varName}\\s*&&|${varName}\\s*\\|\\|`).test(lines[j])) {
281
+ checked = true;
282
+ break;
283
+ }
284
+ }
285
+ if (!checked) {
286
+ out.push({
287
+ id: makeId(), category: 'null_safety', severity: 'high',
288
+ message: `Awaited value '${varName}' used without null check`,
289
+ filePath, lineNumber: i + 1, codeSnippet: l.slice(0, 120),
290
+ recommendation: `Add null check: if (!${varName}) return; or use optional chaining (${varName}?.x)`,
291
+ detectedAt: new Date().toISOString(),
292
+ });
293
+ }
294
+ }
295
+ return out;
296
+ }
297
+ function detectArrayAccessWithoutLengthCheck(filePath, lines) {
298
+ const ext = path.extname(filePath);
299
+ if (!JS_EXT.has(ext))
300
+ return [];
301
+ const out = [];
302
+ for (let i = 0; i < lines.length; i++) {
303
+ const l = lineAt(lines, i);
304
+ if (/\b\w+\s*[\[\.]\s*0\s*[\]\.]/.test(l) && !/\?\.\s*0/.test(l)) {
305
+ // Check if `arr.length` or `arr?.length` was checked within 5 lines above
306
+ let checked = false;
307
+ for (let j = Math.max(0, i - 5); j < i; j++) {
308
+ if (/\.length\s*[><!]/.test(lines[j]) || /\?\.length/.test(lines[j])) {
309
+ checked = true;
310
+ break;
311
+ }
312
+ }
313
+ if (!checked) {
314
+ out.push({
315
+ id: makeId(), category: 'null_safety', severity: 'medium',
316
+ message: 'Array index [0] access without length check — undefined on empty array',
317
+ filePath, lineNumber: i + 1, codeSnippet: l.slice(0, 120),
318
+ recommendation: 'Check `arr.length > 0` before access, or use `arr[0] ?? default`',
319
+ detectedAt: new Date().toISOString(),
320
+ });
321
+ }
322
+ }
323
+ }
324
+ return out;
325
+ }
326
+ function detectProcessEnvWithoutFallback(filePath, lines) {
327
+ const ext = path.extname(filePath);
328
+ if (!JS_EXT.has(ext))
329
+ return [];
330
+ const out = [];
331
+ for (let i = 0; i < lines.length; i++) {
332
+ const l = lineAt(lines, i);
333
+ if (/process\.env\.\w+/.test(l) && !/\|\|/.test(l) && !/\?\?/.test(l) && !/process\.env\.\w+\s*=/.test(l)) {
334
+ out.push({
335
+ id: makeId(), category: 'validation', severity: 'low',
336
+ message: 'process.env used without fallback — undefined if missing',
337
+ filePath, lineNumber: i + 1, codeSnippet: l.slice(0, 120),
338
+ recommendation: 'Add fallback: `process.env.X || "default"` or use ?? operator',
339
+ detectedAt: new Date().toISOString(),
340
+ });
341
+ }
342
+ }
343
+ return out;
344
+ }
345
+ function detectN1QueryPattern(filePath, lines) {
346
+ const ext = path.extname(filePath);
347
+ if (!JS_EXT.has(ext))
348
+ return [];
349
+ const out = [];
350
+ for (let i = 0; i < lines.length; i++) {
351
+ const l = lineAt(lines, i);
352
+ if (/\bfor\s*\(/.test(l) || /\.forEach\s*\(/.test(l) || /\.map\s*\(/.test(l)) {
353
+ // Look inside for await with DB call
354
+ for (let j = i + 1; j < i + 15 && j < lines.length; j++) {
355
+ if (/await\s+(prisma\.|db\.|sequelize|mongoose|knex|pool\.)/.test(lines[j])) {
356
+ out.push({
357
+ id: makeId(), category: 'performance', severity: 'high',
358
+ message: 'N+1 query pattern: DB call inside loop',
359
+ filePath, lineNumber: j + 1, codeSnippet: lines[j].trim().slice(0, 120),
360
+ recommendation: 'Batch query: use `findMany({ where: { id: { in: ids } } })` or include relation',
361
+ detectedAt: new Date().toISOString(),
362
+ });
363
+ break;
364
+ }
365
+ }
366
+ }
367
+ }
368
+ return out;
369
+ }
370
+ function detectSyncOpsInAsyncCode(filePath, lines) {
371
+ const ext = path.extname(filePath);
372
+ if (!JS_EXT.has(ext))
373
+ return [];
374
+ const out = [];
375
+ let inAsync = false;
376
+ for (let i = 0; i < lines.length; i++) {
377
+ const l = lineAt(lines, i);
378
+ if (/async\s+(function|\w+\s*\(|\w+\s*=\s*async|\(|\w+\s*:\s*async)/.test(l))
379
+ inAsync = true;
380
+ if (inAsync && /readFileSync|writeFileSync|appendFileSync|execSync|spawnSync/.test(l)) {
381
+ out.push({
382
+ id: makeId(), category: 'performance', severity: 'medium',
383
+ message: 'Sync file/exec operation in async function — blocks event loop',
384
+ filePath, lineNumber: i + 1, codeSnippet: l.slice(0, 120),
385
+ recommendation: 'Use async variant: readFile, writeFile, exec (with await)',
386
+ detectedAt: new Date().toISOString(),
387
+ });
388
+ }
389
+ }
390
+ return out;
391
+ }
392
+ function detectConsoleLogInProduction(filePath, lines) {
393
+ const ext = path.extname(filePath);
394
+ if (!JS_EXT.has(ext))
395
+ return [];
396
+ const out = [];
397
+ let count = 0;
398
+ for (let i = 0; i < lines.length; i++) {
399
+ const l = lineAt(lines, i);
400
+ if (/(^|\s)console\.log\s*\(/.test(l)) {
401
+ count++;
402
+ if (count <= 2) {
403
+ out.push({
404
+ id: makeId(), category: 'quality', severity: 'low',
405
+ message: 'console.log in source — use structured logger in production',
406
+ filePath, lineNumber: i + 1, codeSnippet: l.slice(0, 120),
407
+ recommendation: 'Replace with logger.info() or remove debug logs',
408
+ detectedAt: new Date().toISOString(),
409
+ });
410
+ }
411
+ }
412
+ }
413
+ return out;
414
+ }
415
+ function detectAnyUsage(filePath, lines) {
416
+ const ext = path.extname(filePath);
417
+ if (!JS_EXT.has(ext))
418
+ return [];
419
+ const out = [];
420
+ for (let i = 0; i < lines.length; i++) {
421
+ const l = lineAt(lines, i);
422
+ // Match `: any` or `<any>` or `as any` but not `Many` or `company`
423
+ if (/:\s*any[\s,;\)\]\}]/.test(l) || /<any>/.test(l) || /\bas\s+any\b/.test(l)) {
424
+ out.push({
425
+ id: makeId(), category: 'quality', severity: 'medium',
426
+ message: '`any` type used — defeats TypeScript safety',
427
+ filePath, lineNumber: i + 1, codeSnippet: l.slice(0, 120),
428
+ recommendation: 'Use `unknown` and narrow with type guards, or define proper interface',
429
+ detectedAt: new Date().toISOString(),
430
+ });
431
+ }
432
+ }
433
+ return out;
434
+ }
435
+ function detectNonNullAssertionOveruse(filePath, lines) {
436
+ const ext = path.extname(filePath);
437
+ if (!JS_EXT.has(ext))
438
+ return [];
439
+ let count = 0;
440
+ for (const l of lines) {
441
+ if (/\w![\s\.\(\[]/.test(l) && !/!==/.test(l) && !/!=/.test(l))
442
+ count++;
443
+ }
444
+ if (count < 3)
445
+ return [];
446
+ return [{
447
+ id: makeId(), category: 'null_safety', severity: 'medium',
448
+ message: `High non-null assertion usage (${count}x in file) — possible unsafe null bypasses`,
449
+ filePath, lineNumber: 1, codeSnippet: `(${count} non-null assertions in this file)`,
450
+ recommendation: 'Replace `x!` with explicit null checks or `x ?? default`',
451
+ detectedAt: new Date().toISOString(),
452
+ }];
453
+ }
454
+ function detectMissingPagination(filePath, lines) {
455
+ const ext = path.extname(filePath);
456
+ if (!JS_EXT.has(ext))
457
+ return [];
458
+ const out = [];
459
+ for (let i = 0; i < lines.length; i++) {
460
+ const l = lineAt(lines, i);
461
+ if (/prisma\.\w+\.findMany\s*\(/.test(l) || /\.find\s*\(\s*\{\s*\}\s*\)/.test(l)) {
462
+ // Check next 5 lines for skip/take/limit
463
+ let hasPagination = false;
464
+ for (let j = i; j < i + 5 && j < lines.length; j++) {
465
+ if (/\b(skip|take|limit|offset)\s*:/.test(lines[j])) {
466
+ hasPagination = true;
467
+ break;
468
+ }
469
+ }
470
+ if (!hasPagination) {
471
+ out.push({
472
+ id: makeId(), category: 'performance', severity: 'medium',
473
+ message: 'findMany() without pagination — loads entire table into memory',
474
+ filePath, lineNumber: i + 1, codeSnippet: l.slice(0, 120),
475
+ recommendation: 'Add `take: 50` and `skip: offset` for pagination',
476
+ detectedAt: new Date().toISOString(),
477
+ });
478
+ }
479
+ }
480
+ }
481
+ return out;
482
+ }
483
+ // ─── Scanner ──────────────────────────────────────────────────────────────
484
+ const ALL_DETECTORS = [
485
+ detectPromisesWithoutCatch,
486
+ detectMissingReactErrorBoundaries,
487
+ detectApiCallsWithoutErrorState,
488
+ detectDbOperationsWithoutRollback,
489
+ detectFileOpsWithoutErrorHandling,
490
+ detectApiWithoutTimeout,
491
+ detectAwaitWithoutNullCheck,
492
+ detectArrayAccessWithoutLengthCheck,
493
+ detectProcessEnvWithoutFallback,
494
+ detectN1QueryPattern,
495
+ detectSyncOpsInAsyncCode,
496
+ detectConsoleLogInProduction,
497
+ detectAnyUsage,
498
+ detectNonNullAssertionOveruse,
499
+ detectMissingPagination,
500
+ ];
501
+ function scanFileForBlindSpots(filePath) {
502
+ if (!shouldScan(filePath))
503
+ return [];
504
+ const ext = path.extname(filePath);
505
+ if (!JS_EXT.has(ext))
506
+ return [];
507
+ const lines = readLines(filePath);
508
+ if (lines.length === 0)
509
+ return [];
510
+ const out = [];
511
+ for (const detector of ALL_DETECTORS) {
512
+ try {
513
+ out.push(...detector(filePath, lines));
514
+ }
515
+ catch { /* skip on parse error */ }
516
+ }
517
+ return out;
518
+ }
519
+ function scanDirectoryForBlindSpots(dir, maxFiles = 500) {
520
+ const results = [];
521
+ const queue = [dir];
522
+ let scanned = 0;
523
+ while (queue.length > 0 && scanned < maxFiles) {
524
+ const current = queue.shift();
525
+ let entries;
526
+ try {
527
+ entries = fs.readdirSync(current, { withFileTypes: true });
528
+ }
529
+ catch {
530
+ continue;
531
+ }
532
+ for (const entry of entries) {
533
+ if (IGNORE_DIRS.has(entry.name) || entry.name.startsWith('.'))
534
+ continue;
535
+ const full = path.join(current, entry.name);
536
+ if (entry.isDirectory()) {
537
+ queue.push(full);
538
+ }
539
+ else if (entry.isFile()) {
540
+ const ext = path.extname(entry.name);
541
+ if (JS_EXT.has(ext)) {
542
+ results.push(...scanFileForBlindSpots(full));
543
+ scanned++;
544
+ }
545
+ }
546
+ }
547
+ }
548
+ return results;
549
+ }
550
+ function summarizeBlindSpots(spots) {
551
+ const summary = {
552
+ total: spots.length, critical: 0, high: 0, medium: 0, low: 0,
553
+ byCategory: {}, byFile: {},
554
+ };
555
+ for (const s of spots) {
556
+ summary[s.severity]++;
557
+ summary.byCategory[s.category] = (summary.byCategory[s.category] || 0) + 1;
558
+ summary.byFile[s.filePath] = (summary.byFile[s.filePath] || 0) + 1;
559
+ }
560
+ return summary;
561
+ }
562
+ function formatBlindSpotReport(spots) {
563
+ if (spots.length === 0)
564
+ return '✅ No blind spots detected.\n';
565
+ const summary = summarizeBlindSpots(spots);
566
+ const lines = [];
567
+ lines.push('⚠️ BLIND SPOTS DETECTED\n');
568
+ const bySev = ['critical', 'high', 'medium', 'low'];
569
+ const icons = { critical: '🔴', high: '🟡', medium: '🟠', low: '⚪' };
570
+ const labels = { critical: 'CRITICAL', high: 'HIGH', medium: 'MEDIUM', low: 'LOW' };
571
+ for (const sev of bySev) {
572
+ const items = spots.filter(s => s.severity === sev);
573
+ if (items.length === 0)
574
+ continue;
575
+ lines.push(`${icons[sev]} ${labels[sev]} (${items.length}):`);
576
+ for (const s of items.slice(0, 5)) {
577
+ lines.push(` → ${s.message}`);
578
+ lines.push(` ${s.filePath}:${s.lineNumber}`);
579
+ }
580
+ if (items.length > 5)
581
+ lines.push(` ... ${items.length - 5} more`);
582
+ lines.push('');
583
+ }
584
+ lines.push(`Total: ${summary.total} (🔴 ${summary.critical} | 🟡 ${summary.high} | 🟠 ${summary.medium} | ⚪ ${summary.low})`);
585
+ return lines.join('\n');
586
+ }
587
+ function getCategoryCounts(dir) {
588
+ const spots = scanDirectoryForBlindSpots(dir, 200);
589
+ return summarizeBlindSpots(spots).byCategory;
590
+ }
591
+ //# sourceMappingURL=enhanced-blind-spots.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enhanced-blind-spots.js","sourceRoot":"","sources":["../../src/core/enhanced-blind-spots.ts"],"names":[],"mappings":"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"}