mstro-app 0.5.1 → 0.5.6

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 (283) hide show
  1. package/PRIVACY.md +9 -9
  2. package/README.md +71 -28
  3. package/bin/commands/config.js +1 -1
  4. package/bin/mstro.js +55 -4
  5. package/dist/server/cli/eta-estimator.d.ts +55 -0
  6. package/dist/server/cli/eta-estimator.d.ts.map +1 -0
  7. package/dist/server/cli/eta-estimator.js +222 -0
  8. package/dist/server/cli/eta-estimator.js.map +1 -0
  9. package/dist/server/cli/headless/claude-invoker-process.d.ts.map +1 -1
  10. package/dist/server/cli/headless/claude-invoker-process.js +9 -1
  11. package/dist/server/cli/headless/claude-invoker-process.js.map +1 -1
  12. package/dist/server/cli/headless/mcp-config.d.ts +22 -5
  13. package/dist/server/cli/headless/mcp-config.d.ts.map +1 -1
  14. package/dist/server/cli/headless/mcp-config.js +7 -5
  15. package/dist/server/cli/headless/mcp-config.js.map +1 -1
  16. package/dist/server/cli/headless/runner.d.ts.map +1 -1
  17. package/dist/server/cli/headless/runner.js +19 -0
  18. package/dist/server/cli/headless/runner.js.map +1 -1
  19. package/dist/server/cli/headless/stall-assessor.d.ts +50 -0
  20. package/dist/server/cli/headless/stall-assessor.d.ts.map +1 -1
  21. package/dist/server/cli/headless/stall-assessor.js +64 -9
  22. package/dist/server/cli/headless/stall-assessor.js.map +1 -1
  23. package/dist/server/cli/headless/tool-watchdog.d.ts +21 -0
  24. package/dist/server/cli/headless/tool-watchdog.d.ts.map +1 -1
  25. package/dist/server/cli/headless/tool-watchdog.js +19 -12
  26. package/dist/server/cli/headless/tool-watchdog.js.map +1 -1
  27. package/dist/server/cli/headless/types.d.ts +16 -1
  28. package/dist/server/cli/headless/types.d.ts.map +1 -1
  29. package/dist/server/cli/improvisation-history-store.d.ts.map +1 -1
  30. package/dist/server/cli/improvisation-history-store.js +5 -1
  31. package/dist/server/cli/improvisation-history-store.js.map +1 -1
  32. package/dist/server/cli/improvisation-output-queue.d.ts +5 -1
  33. package/dist/server/cli/improvisation-output-queue.d.ts.map +1 -1
  34. package/dist/server/cli/improvisation-output-queue.js +30 -7
  35. package/dist/server/cli/improvisation-output-queue.js.map +1 -1
  36. package/dist/server/cli/improvisation-session-manager.d.ts +35 -0
  37. package/dist/server/cli/improvisation-session-manager.d.ts.map +1 -1
  38. package/dist/server/cli/improvisation-session-manager.js +58 -1
  39. package/dist/server/cli/improvisation-session-manager.js.map +1 -1
  40. package/dist/server/cli/improvisation-types.d.ts +9 -0
  41. package/dist/server/cli/improvisation-types.d.ts.map +1 -1
  42. package/dist/server/cli/improvisation-types.js.map +1 -1
  43. package/dist/server/cli/retry/retry-runner-factory.d.ts.map +1 -1
  44. package/dist/server/cli/retry/retry-runner-factory.js +1 -0
  45. package/dist/server/cli/retry/retry-runner-factory.js.map +1 -1
  46. package/dist/server/engines/EngineEvent.d.ts +126 -0
  47. package/dist/server/engines/EngineEvent.d.ts.map +1 -0
  48. package/dist/server/engines/EngineEvent.js +11 -0
  49. package/dist/server/engines/EngineEvent.js.map +1 -0
  50. package/dist/server/engines/claude/ClaudeCodeEngine.d.ts +47 -0
  51. package/dist/server/engines/claude/ClaudeCodeEngine.d.ts.map +1 -0
  52. package/dist/server/engines/claude/ClaudeCodeEngine.js +338 -0
  53. package/dist/server/engines/claude/ClaudeCodeEngine.js.map +1 -0
  54. package/dist/server/engines/factory.d.ts +21 -0
  55. package/dist/server/engines/factory.d.ts.map +1 -0
  56. package/dist/server/engines/factory.js +152 -0
  57. package/dist/server/engines/factory.js.map +1 -0
  58. package/dist/server/engines/opencode/OpenCodeEngine.d.ts +148 -0
  59. package/dist/server/engines/opencode/OpenCodeEngine.d.ts.map +1 -0
  60. package/dist/server/engines/opencode/OpenCodeEngine.js +630 -0
  61. package/dist/server/engines/opencode/OpenCodeEngine.js.map +1 -0
  62. package/dist/server/engines/opencode/OpenCodeServerManager.d.ts +172 -0
  63. package/dist/server/engines/opencode/OpenCodeServerManager.d.ts.map +1 -0
  64. package/dist/server/engines/opencode/OpenCodeServerManager.js +390 -0
  65. package/dist/server/engines/opencode/OpenCodeServerManager.js.map +1 -0
  66. package/dist/server/engines/opencode/model-catalog.d.ts +94 -0
  67. package/dist/server/engines/opencode/model-catalog.d.ts.map +1 -0
  68. package/dist/server/engines/opencode/model-catalog.js +141 -0
  69. package/dist/server/engines/opencode/model-catalog.js.map +1 -0
  70. package/dist/server/engines/types.d.ts +146 -0
  71. package/dist/server/engines/types.d.ts.map +1 -0
  72. package/dist/server/engines/types.js +4 -0
  73. package/dist/server/engines/types.js.map +1 -0
  74. package/dist/server/index.js +9 -2
  75. package/dist/server/index.js.map +1 -1
  76. package/dist/server/mcp/bouncer-haiku.d.ts +17 -4
  77. package/dist/server/mcp/bouncer-haiku.d.ts.map +1 -1
  78. package/dist/server/mcp/bouncer-haiku.js +8 -124
  79. package/dist/server/mcp/bouncer-haiku.js.map +1 -1
  80. package/dist/server/mcp/bouncer-integration.d.ts +45 -0
  81. package/dist/server/mcp/bouncer-integration.d.ts.map +1 -1
  82. package/dist/server/mcp/bouncer-integration.js +69 -5
  83. package/dist/server/mcp/bouncer-integration.js.map +1 -1
  84. package/dist/server/mcp/classifier/BouncerClassifier.d.ts +34 -0
  85. package/dist/server/mcp/classifier/BouncerClassifier.d.ts.map +1 -0
  86. package/dist/server/mcp/classifier/BouncerClassifier.js +4 -0
  87. package/dist/server/mcp/classifier/BouncerClassifier.js.map +1 -0
  88. package/dist/server/mcp/classifier/ClaudeBouncerClassifier.d.ts +17 -0
  89. package/dist/server/mcp/classifier/ClaudeBouncerClassifier.d.ts.map +1 -0
  90. package/dist/server/mcp/classifier/ClaudeBouncerClassifier.js +142 -0
  91. package/dist/server/mcp/classifier/ClaudeBouncerClassifier.js.map +1 -0
  92. package/dist/server/mcp/classifier/OpenCodeBouncerClassifier.d.ts +68 -0
  93. package/dist/server/mcp/classifier/OpenCodeBouncerClassifier.d.ts.map +1 -0
  94. package/dist/server/mcp/classifier/OpenCodeBouncerClassifier.js +182 -0
  95. package/dist/server/mcp/classifier/OpenCodeBouncerClassifier.js.map +1 -0
  96. package/dist/server/mcp/classifier/factory.d.ts +70 -0
  97. package/dist/server/mcp/classifier/factory.d.ts.map +1 -0
  98. package/dist/server/mcp/classifier/factory.js +155 -0
  99. package/dist/server/mcp/classifier/factory.js.map +1 -0
  100. package/dist/server/mcp/server.js +52 -0
  101. package/dist/server/mcp/server.js.map +1 -1
  102. package/dist/server/routes/index.d.ts +1 -0
  103. package/dist/server/routes/index.d.ts.map +1 -1
  104. package/dist/server/routes/index.js +1 -0
  105. package/dist/server/routes/index.js.map +1 -1
  106. package/dist/server/routes/internal.d.ts +16 -0
  107. package/dist/server/routes/internal.d.ts.map +1 -0
  108. package/dist/server/routes/internal.js +94 -0
  109. package/dist/server/routes/internal.js.map +1 -0
  110. package/dist/server/services/plan/agent-resolver.d.ts +26 -0
  111. package/dist/server/services/plan/agent-resolver.d.ts.map +1 -0
  112. package/dist/server/services/plan/agent-resolver.js +102 -0
  113. package/dist/server/services/plan/agent-resolver.js.map +1 -0
  114. package/dist/server/services/plan/composer.d.ts.map +1 -1
  115. package/dist/server/services/plan/composer.js +59 -11
  116. package/dist/server/services/plan/composer.js.map +1 -1
  117. package/dist/server/services/plan/executor.d.ts.map +1 -1
  118. package/dist/server/services/plan/executor.js +3 -1
  119. package/dist/server/services/plan/executor.js.map +1 -1
  120. package/dist/server/services/plan/issue-prompt-builder.d.ts.map +1 -1
  121. package/dist/server/services/plan/issue-prompt-builder.js +33 -1
  122. package/dist/server/services/plan/issue-prompt-builder.js.map +1 -1
  123. package/dist/server/services/plan/parser-core.d.ts.map +1 -1
  124. package/dist/server/services/plan/parser-core.js +1 -0
  125. package/dist/server/services/plan/parser-core.js.map +1 -1
  126. package/dist/server/services/plan/types.d.ts +1 -0
  127. package/dist/server/services/plan/types.d.ts.map +1 -1
  128. package/dist/server/services/runtime-info.d.ts +3 -0
  129. package/dist/server/services/runtime-info.d.ts.map +1 -0
  130. package/dist/server/services/runtime-info.js +21 -0
  131. package/dist/server/services/runtime-info.js.map +1 -0
  132. package/dist/server/services/settings.d.ts +76 -2
  133. package/dist/server/services/settings.d.ts.map +1 -1
  134. package/dist/server/services/settings.js +127 -4
  135. package/dist/server/services/settings.js.map +1 -1
  136. package/dist/server/services/websocket/ask-user-question-bridge.d.ts +32 -0
  137. package/dist/server/services/websocket/ask-user-question-bridge.d.ts.map +1 -0
  138. package/dist/server/services/websocket/ask-user-question-bridge.js +115 -0
  139. package/dist/server/services/websocket/ask-user-question-bridge.js.map +1 -0
  140. package/dist/server/services/websocket/git-branch-handlers.d.ts.map +1 -1
  141. package/dist/server/services/websocket/git-branch-handlers.js +19 -6
  142. package/dist/server/services/websocket/git-branch-handlers.js.map +1 -1
  143. package/dist/server/services/websocket/handler.d.ts +25 -1
  144. package/dist/server/services/websocket/handler.d.ts.map +1 -1
  145. package/dist/server/services/websocket/handler.js +84 -2
  146. package/dist/server/services/websocket/handler.js.map +1 -1
  147. package/dist/server/services/websocket/quality-complexity.d.ts.map +1 -1
  148. package/dist/server/services/websocket/quality-complexity.js +78 -26
  149. package/dist/server/services/websocket/quality-complexity.js.map +1 -1
  150. package/dist/server/services/websocket/quality-eta.d.ts +47 -0
  151. package/dist/server/services/websocket/quality-eta.d.ts.map +1 -0
  152. package/dist/server/services/websocket/quality-eta.js +110 -0
  153. package/dist/server/services/websocket/quality-eta.js.map +1 -0
  154. package/dist/server/services/websocket/quality-grading.d.ts +27 -4
  155. package/dist/server/services/websocket/quality-grading.d.ts.map +1 -1
  156. package/dist/server/services/websocket/quality-grading.js +369 -201
  157. package/dist/server/services/websocket/quality-grading.js.map +1 -1
  158. package/dist/server/services/websocket/quality-handlers.d.ts.map +1 -1
  159. package/dist/server/services/websocket/quality-handlers.js +145 -7
  160. package/dist/server/services/websocket/quality-handlers.js.map +1 -1
  161. package/dist/server/services/websocket/quality-operations.d.ts +34 -0
  162. package/dist/server/services/websocket/quality-operations.d.ts.map +1 -0
  163. package/dist/server/services/websocket/quality-operations.js +47 -0
  164. package/dist/server/services/websocket/quality-operations.js.map +1 -0
  165. package/dist/server/services/websocket/quality-persistence.d.ts +9 -0
  166. package/dist/server/services/websocket/quality-persistence.d.ts.map +1 -1
  167. package/dist/server/services/websocket/quality-persistence.js +10 -0
  168. package/dist/server/services/websocket/quality-persistence.js.map +1 -1
  169. package/dist/server/services/websocket/quality-review-agent.d.ts +1 -1
  170. package/dist/server/services/websocket/quality-review-agent.d.ts.map +1 -1
  171. package/dist/server/services/websocket/quality-review-agent.js +105 -56
  172. package/dist/server/services/websocket/quality-review-agent.js.map +1 -1
  173. package/dist/server/services/websocket/quality-service.d.ts +9 -1
  174. package/dist/server/services/websocket/quality-service.d.ts.map +1 -1
  175. package/dist/server/services/websocket/quality-service.js +334 -14
  176. package/dist/server/services/websocket/quality-service.js.map +1 -1
  177. package/dist/server/services/websocket/quality-tools.d.ts +21 -0
  178. package/dist/server/services/websocket/quality-tools.d.ts.map +1 -1
  179. package/dist/server/services/websocket/quality-tools.js +49 -0
  180. package/dist/server/services/websocket/quality-tools.js.map +1 -1
  181. package/dist/server/services/websocket/quality-types.d.ts +35 -2
  182. package/dist/server/services/websocket/quality-types.d.ts.map +1 -1
  183. package/dist/server/services/websocket/quality-types.js +1 -1
  184. package/dist/server/services/websocket/quality-types.js.map +1 -1
  185. package/dist/server/services/websocket/session-handlers.d.ts +3 -1
  186. package/dist/server/services/websocket/session-handlers.d.ts.map +1 -1
  187. package/dist/server/services/websocket/session-handlers.js +60 -9
  188. package/dist/server/services/websocket/session-handlers.js.map +1 -1
  189. package/dist/server/services/websocket/session-history.js +3 -0
  190. package/dist/server/services/websocket/session-history.js.map +1 -1
  191. package/dist/server/services/websocket/session-initialization.d.ts.map +1 -1
  192. package/dist/server/services/websocket/session-initialization.js +158 -42
  193. package/dist/server/services/websocket/session-initialization.js.map +1 -1
  194. package/dist/server/services/websocket/session-registry.d.ts +25 -0
  195. package/dist/server/services/websocket/session-registry.d.ts.map +1 -1
  196. package/dist/server/services/websocket/session-registry.js +19 -0
  197. package/dist/server/services/websocket/session-registry.js.map +1 -1
  198. package/dist/server/services/websocket/settings-handlers.d.ts +1 -1
  199. package/dist/server/services/websocket/settings-handlers.d.ts.map +1 -1
  200. package/dist/server/services/websocket/settings-handlers.js +35 -4
  201. package/dist/server/services/websocket/settings-handlers.js.map +1 -1
  202. package/dist/server/services/websocket/tab-broadcast.d.ts +7 -2
  203. package/dist/server/services/websocket/tab-broadcast.d.ts.map +1 -1
  204. package/dist/server/services/websocket/tab-broadcast.js +10 -2
  205. package/dist/server/services/websocket/tab-broadcast.js.map +1 -1
  206. package/dist/server/services/websocket/tab-event-buffer.d.ts +97 -8
  207. package/dist/server/services/websocket/tab-event-buffer.d.ts.map +1 -1
  208. package/dist/server/services/websocket/tab-event-buffer.js +138 -12
  209. package/dist/server/services/websocket/tab-event-buffer.js.map +1 -1
  210. package/dist/server/services/websocket/tab-event-replay.d.ts +29 -13
  211. package/dist/server/services/websocket/tab-event-replay.d.ts.map +1 -1
  212. package/dist/server/services/websocket/tab-event-replay.js +55 -2
  213. package/dist/server/services/websocket/tab-event-replay.js.map +1 -1
  214. package/dist/server/services/websocket/tab-handlers.d.ts +9 -1
  215. package/dist/server/services/websocket/tab-handlers.d.ts.map +1 -1
  216. package/dist/server/services/websocket/tab-handlers.js +47 -2
  217. package/dist/server/services/websocket/tab-handlers.js.map +1 -1
  218. package/dist/server/services/websocket/types.d.ts +67 -7
  219. package/dist/server/services/websocket/types.d.ts.map +1 -1
  220. package/dist/server/services/websocket/types.js +12 -6
  221. package/dist/server/services/websocket/types.js.map +1 -1
  222. package/package.json +5 -3
  223. package/server/cli/eta-estimator.ts +249 -0
  224. package/server/cli/headless/claude-invoker-process.ts +9 -1
  225. package/server/cli/headless/mcp-config.ts +30 -5
  226. package/server/cli/headless/runner.ts +21 -0
  227. package/server/cli/headless/stall-assessor.ts +93 -0
  228. package/server/cli/headless/tool-watchdog.ts +21 -0
  229. package/server/cli/headless/types.ts +16 -1
  230. package/server/cli/improvisation-history-store.ts +4 -1
  231. package/server/cli/improvisation-output-queue.ts +29 -7
  232. package/server/cli/improvisation-session-manager.ts +63 -1
  233. package/server/cli/improvisation-types.ts +9 -0
  234. package/server/cli/retry/retry-runner-factory.ts +1 -0
  235. package/server/engines/EngineEvent.ts +156 -0
  236. package/server/engines/claude/ClaudeCodeEngine.ts +404 -0
  237. package/server/engines/factory.ts +176 -0
  238. package/server/engines/opencode/OpenCodeEngine.ts +786 -0
  239. package/server/engines/opencode/OpenCodeServerManager.ts +577 -0
  240. package/server/engines/opencode/model-catalog.ts +217 -0
  241. package/server/engines/types.ts +173 -0
  242. package/server/index.ts +9 -1
  243. package/server/mcp/bouncer-haiku.ts +21 -145
  244. package/server/mcp/bouncer-integration.ts +107 -5
  245. package/server/mcp/classifier/BouncerClassifier.ts +40 -0
  246. package/server/mcp/classifier/ClaudeBouncerClassifier.ts +189 -0
  247. package/server/mcp/classifier/OpenCodeBouncerClassifier.ts +305 -0
  248. package/server/mcp/classifier/factory.ts +195 -0
  249. package/server/mcp/server.ts +57 -0
  250. package/server/routes/index.ts +1 -0
  251. package/server/routes/internal.ts +112 -0
  252. package/server/services/plan/agent-resolver.ts +115 -0
  253. package/server/services/plan/agents/code-review.md +38 -8
  254. package/server/services/plan/composer.ts +63 -11
  255. package/server/services/plan/executor.ts +3 -1
  256. package/server/services/plan/issue-prompt-builder.ts +39 -1
  257. package/server/services/plan/parser-core.ts +1 -0
  258. package/server/services/plan/types.ts +4 -0
  259. package/server/services/runtime-info.ts +24 -0
  260. package/server/services/settings.ts +161 -4
  261. package/server/services/websocket/ask-user-question-bridge.ts +148 -0
  262. package/server/services/websocket/git-branch-handlers.ts +20 -6
  263. package/server/services/websocket/handler.ts +89 -2
  264. package/server/services/websocket/quality-complexity.ts +80 -26
  265. package/server/services/websocket/quality-eta.ts +155 -0
  266. package/server/services/websocket/quality-grading.ts +445 -222
  267. package/server/services/websocket/quality-handlers.ts +153 -7
  268. package/server/services/websocket/quality-operations.ts +72 -0
  269. package/server/services/websocket/quality-persistence.ts +17 -0
  270. package/server/services/websocket/quality-review-agent.ts +154 -64
  271. package/server/services/websocket/quality-service.ts +361 -13
  272. package/server/services/websocket/quality-tools.ts +51 -0
  273. package/server/services/websocket/quality-types.ts +41 -2
  274. package/server/services/websocket/session-handlers.ts +67 -10
  275. package/server/services/websocket/session-history.ts +3 -0
  276. package/server/services/websocket/session-initialization.ts +189 -46
  277. package/server/services/websocket/session-registry.ts +37 -0
  278. package/server/services/websocket/settings-handlers.ts +41 -4
  279. package/server/services/websocket/tab-broadcast.ts +10 -2
  280. package/server/services/websocket/tab-event-buffer.ts +143 -11
  281. package/server/services/websocket/tab-event-replay.ts +70 -3
  282. package/server/services/websocket/tab-handlers.ts +53 -5
  283. package/server/services/websocket/types.ts +85 -7
@@ -3,7 +3,7 @@ import { extname } from 'node:path';
3
3
  import { analyzeComplexity, analyzeFunctionLength } from './quality-complexity.js';
4
4
  import { computeQualityRating, gradeFromScore } from './quality-grading.js';
5
5
  import { analyzeLinting } from './quality-linting.js';
6
- import { chunkFileList, collectSourceFiles, detectEcosystem, filesByExt, runCommand } from './quality-tools.js';
6
+ import { chunkFileList, collectSourceFiles, detectEcosystem, filesByExt, isTestFile, runCommand } from './quality-tools.js';
7
7
  import { FILE_LENGTH_THRESHOLD, hasInstalledToolInCategory, TOTAL_STEPS } from './quality-types.js';
8
8
  const NODE_FMT_EXTS = ['.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs'];
9
9
  const PY_FMT_EXTS = ['.py', '.pyi'];
@@ -86,6 +86,272 @@ async function analyzeFormatting(dirPath, ecosystems, files) {
86
86
  return { score, available: true, issueCount: acc.totalFiles - acc.passingFiles, findings: acc.findings.slice(0, 50) };
87
87
  }
88
88
  // ============================================================================
89
+ // Build / Compile Error Detection
90
+ // ============================================================================
91
+ //
92
+ // A codebase that does not compile is, by the user's spec, an automatic F.
93
+ // We capture compile failures as `category: 'build'` findings with severity
94
+ // `critical` so they map to the Reliability dimension and trigger the
95
+ // "critical → F-" path through the standard severity logic — no special-
96
+ // case branching elsewhere in the grading module.
97
+ //
98
+ // Per ecosystem:
99
+ // - Node: tsc --noEmit (only if a tsconfig.json is present)
100
+ // - Rust: cargo check (idiomatic compile-test for crates)
101
+ // - Other: skipped — Python has no canonical "is it valid" check, Go
102
+ // projects vary too much in module structure for `go build ./...`
103
+ // to be reliable, and Swift/Kotlin compile via larger build
104
+ // systems we don't want to spawn from a quality scan.
105
+ //
106
+ // Findings are capped at the first 5 errors per check so a totally broken
107
+ // codebase doesn't produce 200 individual findings — one critical finding is
108
+ // enough to pin the grade.
109
+ const BUILD_FINDING_CAP = 5;
110
+ function tscOutputToFindings(output, dirPath) {
111
+ const findings = [];
112
+ // tsc error format: `path/to/file.ts(line,col): error TS####: message`
113
+ const errorPattern = /^(.+?)\((\d+),\d+\):\s+error\s+TS\d+:\s+(.+)$/gm;
114
+ for (const match of output.matchAll(errorPattern)) {
115
+ if (findings.length >= BUILD_FINDING_CAP)
116
+ break;
117
+ const filePath = match[1].replace(`${dirPath}/`, '').replace(/^\.\//, '');
118
+ findings.push({
119
+ severity: 'critical',
120
+ category: 'build',
121
+ file: filePath,
122
+ line: Number.parseInt(match[2], 10) || null,
123
+ title: `TypeScript build error`,
124
+ description: match[3].trim(),
125
+ suggestion: 'Resolve compile errors before merging — broken builds block all other quality work.',
126
+ });
127
+ }
128
+ return findings;
129
+ }
130
+ function cargoCheckOutputToFindings(output, dirPath) {
131
+ const findings = [];
132
+ // cargo emits one JSON object per line in --message-format=json mode; in
133
+ // plain mode it emits "error[E####]: message\n --> path:line:col"
134
+ const errorPattern = /^error(?:\[E\d+\])?:\s+(.+?)$\s+-->\s+([^:\s]+):(\d+):\d+/gm;
135
+ for (const match of output.matchAll(errorPattern)) {
136
+ if (findings.length >= BUILD_FINDING_CAP)
137
+ break;
138
+ findings.push({
139
+ severity: 'critical',
140
+ category: 'build',
141
+ file: match[2].replace(`${dirPath}/`, ''),
142
+ line: Number.parseInt(match[3], 10) || null,
143
+ title: `Rust build error`,
144
+ description: match[1].trim(),
145
+ suggestion: 'Resolve compile errors before merging — broken builds block all other quality work.',
146
+ });
147
+ }
148
+ return findings;
149
+ }
150
+ async function checkNodeBuild(dirPath, installed) {
151
+ // Only run if TypeScript is installed. Avoids npm-installing tsc on the fly
152
+ // (slow + side-effecting) and cleanly skips JS-only projects.
153
+ if (installed && !installed.has('typescript'))
154
+ return [];
155
+ // Only run if a tsconfig.json exists at the project root — otherwise tsc
156
+ // will pick up arbitrary nearby configs in monorepos and produce confusing
157
+ // results.
158
+ let hasTsconfig = false;
159
+ try {
160
+ const { readFileSync } = await import('node:fs');
161
+ readFileSync(`${dirPath}/tsconfig.json`, 'utf-8');
162
+ hasTsconfig = true;
163
+ }
164
+ catch {
165
+ return [];
166
+ }
167
+ if (!hasTsconfig)
168
+ return [];
169
+ const result = await runCommand('npx', ['tsc', '--noEmit', '--pretty', 'false'], dirPath);
170
+ if (result.exitCode === 0)
171
+ return [];
172
+ // Combine stdout + stderr — tsc writes errors to stdout in --pretty=false.
173
+ return tscOutputToFindings(`${result.stdout}\n${result.stderr}`, dirPath);
174
+ }
175
+ async function checkRustBuild(dirPath) {
176
+ const result = await runCommand('cargo', ['check', '--message-format=human'], dirPath);
177
+ if (result.exitCode === 0)
178
+ return [];
179
+ return cargoCheckOutputToFindings(`${result.stdout}\n${result.stderr}`, dirPath);
180
+ }
181
+ async function analyzeBuildErrors(dirPath, ecosystems, installed) {
182
+ const findings = [];
183
+ let ran = false;
184
+ if (ecosystems.includes('node')) {
185
+ const nodeFindings = await checkNodeBuild(dirPath, installed);
186
+ if (nodeFindings.length > 0)
187
+ ran = true;
188
+ findings.push(...nodeFindings);
189
+ }
190
+ if (ecosystems.includes('rust')) {
191
+ ran = true;
192
+ findings.push(...(await checkRustBuild(dirPath)));
193
+ }
194
+ // `available` only matters for the dimension-availability heuristic; the
195
+ // findings drive the actual grade. For build, "available" tracks whether
196
+ // we ran a build check at all (so a clean tsc output still counts).
197
+ return { findings, available: ran || ecosystems.includes('node') || ecosystems.includes('rust') };
198
+ }
199
+ // ============================================================================
200
+ // File Cohesion Analysis (LCOM-inspired)
201
+ // ============================================================================
202
+ //
203
+ // Long files are not all equal. A 1500-line file with one focused public
204
+ // surface (one class, one large function, several private helpers) is fine —
205
+ // it's cohesive. A 1500-line file mixing config + parsing + rendering + IO is
206
+ // a real maintenance hazard.
207
+ //
208
+ // We compute a 0-1 "mixed-concerns score" per file using cheap textual
209
+ // signals (no AST parsing — we already have the file content in memory):
210
+ //
211
+ // - Top-level export count — many independent exports = many concerns.
212
+ // - Distinct top-level identifier prefixes — cohesive files share a domain
213
+ // vocabulary (e.g., everything starts with `User…`); mixed files do not.
214
+ // - Distinct import roots — files that import from many unrelated modules
215
+ // are usually doing many unrelated things.
216
+ // - Section-divider density — `// ===` style dividers signal that the
217
+ // author is mentally separating concerns; many sections + low export
218
+ // overlap = mixed.
219
+ //
220
+ // The score then modulates the severity of any file-length violation:
221
+ //
222
+ // cohesion ≤ 0.30 → SUPPRESS the finding (the file is long but focused)
223
+ // cohesion ≤ 0.55 → low severity
224
+ // cohesion ≤ 0.75 → medium severity
225
+ // cohesion > 0.75 → high severity
226
+ //
227
+ // This implements the user's requirement that a 1000-line file might be
228
+ // "just fine" while another 1000-line file is a "severe mix of concerns."
229
+ // ============================================================================
230
+ const TOP_LEVEL_EXPORT_PATTERN = /^export\s+(?:default\s+)?(?:async\s+)?(?:function|class|const|let|var|interface|type|enum)\s+(\w+)/gm;
231
+ const TOP_LEVEL_DECL_PATTERN = /^(?:export\s+)?(?:async\s+)?(?:function|class)\s+(\w+)/gm;
232
+ const PY_TOP_LEVEL_PATTERN = /^(?:def|class)\s+(\w+)/gm;
233
+ const IMPORT_PATTERN = /^(?:import\s+.+from\s+['"]([^'"]+)['"]|from\s+([^\s]+)\s+import|import\s+([^\s]+))/gm;
234
+ const SECTION_DIVIDER_PATTERN = /^\s*(?:\/\/|#)\s*={3,}|^\s*(?:\/\/|#)\s*-{3,}/gm;
235
+ /** Group identifiers by their leading word-prefix and return how many distinct groups exist. */
236
+ function distinctIdentifierPrefixes(names) {
237
+ if (names.length === 0)
238
+ return 0;
239
+ const prefixes = new Set();
240
+ for (const name of names) {
241
+ // Split on camelCase / snake_case boundaries; take the first segment.
242
+ const first = name.replace(/[A-Z][a-z]+|_+/g, (m, _o, _s) => `${m.replace(/_/g, '')}`).split('').filter(Boolean)[0] ?? name;
243
+ const lowered = first.toLowerCase();
244
+ if (lowered.length >= 2)
245
+ prefixes.add(lowered);
246
+ }
247
+ return prefixes.size;
248
+ }
249
+ /** Extract the path "root" from an import specifier (the first non-dot segment). */
250
+ function importRoot(spec) {
251
+ const trimmed = spec.replace(/^['"]|['"]$/g, '').trim();
252
+ if (!trimmed)
253
+ return '';
254
+ if (trimmed.startsWith('.'))
255
+ return 'relative';
256
+ return trimmed.split('/')[0].replace(/^@/, '');
257
+ }
258
+ function jsDeclNames(content) {
259
+ const exports = [];
260
+ const decls = [];
261
+ for (const match of content.matchAll(TOP_LEVEL_EXPORT_PATTERN))
262
+ exports.push(match[1]);
263
+ for (const match of content.matchAll(TOP_LEVEL_DECL_PATTERN))
264
+ decls.push(match[1]);
265
+ return { exports, decls };
266
+ }
267
+ function pyDeclNames(content) {
268
+ const exports = [];
269
+ const decls = [];
270
+ for (const match of content.matchAll(PY_TOP_LEVEL_PATTERN)) {
271
+ decls.push(match[1]);
272
+ // Python doesn't have explicit "export" — public iff it doesn't start with "_".
273
+ if (!match[1].startsWith('_'))
274
+ exports.push(match[1]);
275
+ }
276
+ return { exports, decls };
277
+ }
278
+ function importRootCount(content) {
279
+ const roots = new Set();
280
+ for (const match of content.matchAll(IMPORT_PATTERN)) {
281
+ const spec = match[1] ?? match[2] ?? match[3] ?? '';
282
+ const root = importRoot(spec);
283
+ if (root)
284
+ roots.add(root);
285
+ }
286
+ return roots.size;
287
+ }
288
+ function collectCohesionSignals(file) {
289
+ const ext = extname(file.path).toLowerCase();
290
+ const isJs = ['.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs'].includes(ext);
291
+ const isPy = ['.py', '.pyi'].includes(ext);
292
+ const { exports, decls } = isJs
293
+ ? jsDeclNames(file.content)
294
+ : isPy
295
+ ? pyDeclNames(file.content)
296
+ : { exports: [], decls: [] };
297
+ const allNames = exports.length > 0 ? exports : decls;
298
+ return {
299
+ exports: exports.length,
300
+ decls: decls.length,
301
+ prefixes: distinctIdentifierPrefixes(allNames),
302
+ importRoots: importRootCount(file.content),
303
+ dividers: (file.content.match(SECTION_DIVIDER_PATTERN) || []).length,
304
+ isJs,
305
+ isPy,
306
+ };
307
+ }
308
+ /**
309
+ * Compute a 0-1 "mixed-concerns" score for a file. 0 = highly cohesive,
310
+ * 1 = many unrelated concerns. The formula combines four signals with
311
+ * empirically chosen weights — tuned so that:
312
+ *
313
+ * - A 2000-line file with 1 class + helpers scores ~0.15
314
+ * - A 2000-line file with 8 unrelated exports scores ~0.85
315
+ * - The CLI quality-tools.ts (one domain, many helpers) scores < 0.4
316
+ * - A miscellaneous "utils.ts" (string + date + DOM helpers) scores > 0.7
317
+ *
318
+ * Returns 0 for files we can't analyze (non-JS/Py), since we don't want to
319
+ * fabricate a violation for languages we can't introspect.
320
+ */
321
+ function computeMixedConcernsScore(file) {
322
+ const sig = collectCohesionSignals(file);
323
+ if (!sig.isJs && !sig.isPy)
324
+ return 0;
325
+ // Each component is independently normalized to [0, 1]; the final score
326
+ // averages them with slight weighting toward identifier-prefix variance
327
+ // (the strongest cohesion signal in practice).
328
+ const exportComponent = sig.exports <= 2 ? 0 : Math.min(1, (sig.exports - 2) / 12);
329
+ const prefixComponent = sig.prefixes <= 1 ? 0 : Math.min(1, (sig.prefixes - 1) / 6);
330
+ const importComponent = sig.importRoots <= 4 ? 0 : Math.min(1, (sig.importRoots - 4) / 12);
331
+ const dividerComponent = sig.dividers <= 2 ? 0 : Math.min(1, (sig.dividers - 2) / 6);
332
+ return Math.min(1, 0.30 * prefixComponent +
333
+ 0.30 * exportComponent +
334
+ 0.25 * importComponent +
335
+ 0.15 * dividerComponent);
336
+ }
337
+ /**
338
+ * Map a file's mixed-concerns score to a severity for the file-length
339
+ * finding. Returns `null` to suppress the finding entirely when the file is
340
+ * cohesive enough that its length isn't a real concern.
341
+ */
342
+ function severityFromCohesion(mixed, lines) {
343
+ // Files that are absurdly long (>5x threshold) emit a finding regardless
344
+ // of cohesion — a 5000-line file is always worth flagging even if focused.
345
+ const isAbsurd = lines > FILE_LENGTH_THRESHOLD * 5;
346
+ if (mixed <= 0.30 && !isAbsurd)
347
+ return null;
348
+ if (mixed <= 0.55)
349
+ return 'low';
350
+ if (mixed <= 0.75)
351
+ return 'medium';
352
+ return 'high';
353
+ }
354
+ // ============================================================================
89
355
  // File Length Analysis
90
356
  // ============================================================================
91
357
  function analyzeFileLength(files) {
@@ -93,24 +359,48 @@ function analyzeFileLength(files) {
93
359
  return { score: 100, findings: [], issueCount: 0 };
94
360
  const findings = [];
95
361
  let totalScore = 0;
362
+ let scoredFiles = 0;
96
363
  for (const file of files) {
364
+ // Test files are exempt from structural-length checks: a long test file
365
+ // is normally just many independent small tests, which is a feature.
366
+ // Excluding them from both scoring and finding emission keeps the
367
+ // dimension's score honest (otherwise a clean prod codebase with a
368
+ // huge test file would be unfairly penalised on file-length).
369
+ if (isTestFile(file.relativePath))
370
+ continue;
97
371
  const ratio = Math.max(1, file.lines / FILE_LENGTH_THRESHOLD);
98
372
  const fileScore = 100 / ratio ** 1.5;
99
373
  totalScore += fileScore;
374
+ scoredFiles++;
100
375
  if (file.lines > FILE_LENGTH_THRESHOLD) {
376
+ const mixedScore = computeMixedConcernsScore(file);
377
+ const severity = severityFromCohesion(mixedScore, file.lines);
378
+ if (!severity)
379
+ continue; // Cohesive long file — not actually a violation.
380
+ const cohesionPct = Math.round((1 - mixedScore) * 100);
101
381
  findings.push({
102
- severity: file.lines > FILE_LENGTH_THRESHOLD * 3 ? 'high' : file.lines > FILE_LENGTH_THRESHOLD * 2 ? 'medium' : 'low',
382
+ severity,
103
383
  category: 'file-length',
104
384
  file: file.relativePath,
105
385
  line: null,
106
- title: `File has ${file.lines} lines (threshold: ${FILE_LENGTH_THRESHOLD})`,
107
- description: `This file exceeds the recommended length of ${FILE_LENGTH_THRESHOLD} lines by ${file.lines - FILE_LENGTH_THRESHOLD} lines.`,
386
+ title: `File has ${file.lines} lines (threshold: ${FILE_LENGTH_THRESHOLD}, cohesion: ${cohesionPct}%)`,
387
+ description: `Exceeds the ${FILE_LENGTH_THRESHOLD}-line threshold by ${file.lines - FILE_LENGTH_THRESHOLD} lines. ` +
388
+ `Mixed-concerns score is ${roundOne(mixedScore)} (0 = focused, 1 = many concerns); ` +
389
+ `severity reflects how mixed the file's responsibilities appear. ` +
390
+ (mixedScore > 0.55
391
+ ? 'Consider splitting unrelated exports into separate modules.'
392
+ : 'The file is long but reasonably focused — split only if a clear seam exists.'),
108
393
  });
109
394
  }
110
395
  }
111
- const score = Math.round(totalScore / files.length);
396
+ if (scoredFiles === 0)
397
+ return { score: 100, findings: [], issueCount: 0 };
398
+ const score = Math.round(totalScore / scoredFiles);
112
399
  return { score: Math.min(100, score), findings: findings.slice(0, 50), issueCount: findings.length };
113
400
  }
401
+ function roundOne(n) {
402
+ return Math.round(n * 10) / 10;
403
+ }
114
404
  // ============================================================================
115
405
  // Legacy Scoring Breakdown — produces the per-category penalty data still
116
406
  // consumed by older UI surfaces and persisted reports. The canonical grade
@@ -200,7 +490,22 @@ export function computeFormulaScore(allFindings, totalLines) {
200
490
  },
201
491
  };
202
492
  }
203
- export async function runQualityScan(dirPath, onProgress, installedToolNames) {
493
+ /**
494
+ * Sentinel thrown when a scan is cancelled mid-flight via the `signal`
495
+ * argument. Callers should treat it as a clean cancellation, not a scan
496
+ * failure (no `qualityError` payload, no persisted partial result).
497
+ */
498
+ export class QualityScanAbortedError extends Error {
499
+ constructor() {
500
+ super('Quality scan aborted');
501
+ this.name = 'QualityScanAbortedError';
502
+ }
503
+ }
504
+ function checkAborted(signal) {
505
+ if (signal?.aborted)
506
+ throw new QualityScanAbortedError();
507
+ }
508
+ export async function runQualityScan(dirPath, onProgress, installedToolNames, signal) {
204
509
  const ecosystems = detectEcosystem(dirPath);
205
510
  // Build set of installed tools for gating analyses
206
511
  const installedSet = installedToolNames ? new Set(installedToolNames) : null;
@@ -208,32 +513,44 @@ export async function runQualityScan(dirPath, onProgress, installedToolNames) {
208
513
  onProgress?.({ step, current, total: TOTAL_STEPS });
209
514
  };
210
515
  // Step 1: Collect source files
516
+ checkAborted(signal);
211
517
  progress('Collecting source files', 1);
212
518
  const files = await collectSourceFiles(dirPath, dirPath);
213
519
  // Step 2: Run linting (only if a linter is installed)
520
+ checkAborted(signal);
214
521
  progress('Running linters', 2);
215
522
  const hasLinter = !installedSet || hasInstalledToolInCategory(installedSet, ecosystems, 'linter');
216
523
  const lintResult = hasLinter
217
524
  ? await analyzeLinting(dirPath, ecosystems, files, installedToolNames)
218
525
  : { score: 0, findings: [], available: false, issueCount: 0 };
219
526
  // Step 3: Check formatting (only if a formatter is installed)
527
+ checkAborted(signal);
220
528
  progress('Checking formatting', 3);
221
529
  const hasFormatter = !installedSet || hasInstalledToolInCategory(installedSet, ecosystems, 'formatter');
222
530
  const fmtResult = hasFormatter
223
531
  ? await analyzeFormatting(dirPath, ecosystems, files)
224
532
  : { score: 0, available: false, issueCount: 0, findings: [] };
225
- // Step 4: Analyze complexity (using real tools: Biome, ESLint, radon)
226
- progress('Analyzing complexity', 4);
533
+ // Step 4: Check for build/compile errors (auto-F if any are found)
534
+ checkAborted(signal);
535
+ progress('Checking build', 4);
536
+ const buildResult = await analyzeBuildErrors(dirPath, ecosystems, installedSet);
537
+ // Step 5: Analyze complexity (using real tools: Biome, ESLint, radon)
538
+ checkAborted(signal);
539
+ progress('Analyzing complexity', 5);
227
540
  const complexityResult = await analyzeComplexity(dirPath, ecosystems, files, installedToolNames);
228
- // Step 5: Check file lengths
229
- progress('Checking file lengths', 5);
541
+ // Step 6: Check file lengths
542
+ checkAborted(signal);
543
+ progress('Checking file lengths', 6);
230
544
  const fileLengthResult = analyzeFileLength(files);
231
- // Step 6: Check function lengths
232
- progress('Checking function lengths', 6);
545
+ // Step 7: Check function lengths
546
+ checkAborted(signal);
547
+ progress('Checking function lengths', 7);
233
548
  const funcLengthResult = analyzeFunctionLength(files);
234
- // Step 7: Compute scores
235
- progress('Computing scores', 7);
549
+ // Step 8: Compute scores
550
+ checkAborted(signal);
551
+ progress('Computing scores', 8);
236
552
  const allFindings = [
553
+ ...buildResult.findings,
237
554
  ...lintResult.findings,
238
555
  ...fmtResult.findings,
239
556
  ...complexityResult.findings,
@@ -253,7 +570,10 @@ export async function runQualityScan(dirPath, onProgress, installedToolNames) {
253
570
  forceNA.add('maintainability');
254
571
  }
255
572
  const rating = computeQualityRating(allFindings, totalLines, { forceNA });
573
+ // Build score: 100 if no compile errors, 0 if any (one error breaks everything).
574
+ const buildScore = buildResult.findings.length === 0 ? 100 : 0;
256
575
  const categories = [
576
+ { name: 'Build', score: buildScore, available: buildResult.available, issueCount: buildResult.findings.length },
257
577
  { name: 'Linting', score: lintResult.score, available: lintResult.available, issueCount: lintResult.issueCount },
258
578
  { name: 'Formatting', score: fmtResult.score, available: fmtResult.available, issueCount: fmtResult.issueCount },
259
579
  { name: 'Complexity', score: complexityResult.score, available: complexityResult.available, issueCount: complexityResult.issueCount },
@@ -1 +1 @@
1
- {"version":3,"file":"quality-service.js","sourceRoot":"","sources":["../../../../server/services/websocket/quality-service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"quality-service.js","sourceRoot":"","sources":["../../../../server/services/websocket/quality-service.ts"],"names":[],"mappings":"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"}
@@ -28,6 +28,27 @@ export declare function collectSourceFiles(dirPath: string, rootPath: string): P
28
28
  * web/dist or nested build outputs in monorepos.
29
29
  */
30
30
  export declare function filesByExt(files: SourceFile[], exts: string[]): string[];
31
+ /**
32
+ * Identify a path as a test/spec file. Test files are exempt from
33
+ * structural-length checks (long-file, long-function) because:
34
+ *
35
+ * - A 600-line test file with 50 small `it()` blocks is easy to read,
36
+ * each block is independent, and "split it" yields zero maintenance
37
+ * benefit while harming discoverability.
38
+ * - A 200-line test function (long Arrange-Act-Assert with helpers
39
+ * inlined) is normal for feature coverage and not a complexity smell.
40
+ *
41
+ * Linters and security/bug findings still apply to test files — only the
42
+ * structural-length heuristics defer. Pattern-matches the conventions used
43
+ * by Code Climate's default-exclude set:
44
+ *
45
+ * - JS/TS: *.test.ts, *.test.tsx, *.spec.js, *.spec.jsx, *.test.mts, ...
46
+ * - Folder: __tests__/, /tests/, /test/, e2e/, spec/, __mocks__/
47
+ * - Python: test_*.py, *_test.py
48
+ * - Go: *_test.go
49
+ * - Rust: files inside `tests/` are integration tests by convention
50
+ */
51
+ export declare function isTestFile(relativePath: string): boolean;
31
52
  /**
32
53
  * Split a file list into chunks so a single command invocation doesn't
33
54
  * blow past ARG_MAX. macOS ARG_MAX is ~256KB; 400 paths at ~200 chars each
@@ -1 +1 @@
1
- {"version":3,"file":"quality-tools.d.ts","sourceRoot":"","sources":["../../../../server/services/websocket/quality-tools.ts"],"names":[],"mappings":"AAKA,OAAO,EAAwC,KAAK,SAAS,EAAE,KAAK,WAAW,EAAqB,MAAM,oBAAoB,CAAC;AAa/H,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,EAAE,CAe5D;AA0CD,wBAAsB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,KAAK,EAAE,WAAW,EAAE,CAAC;IAAC,SAAS,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAsBzG;AAmBD,wBAAsB,YAAY,CAChC,OAAO,EAAE,MAAM,EACf,SAAS,CAAC,EAAE,MAAM,EAAE,GACnB,OAAO,CAAC;IAAE,KAAK,EAAE,WAAW,EAAE,CAAC;IAAC,SAAS,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAoBxD;AAMD,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAwDD;;;;;GAKG;AACH,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CA6BjG;AAMD;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAOxE;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,IAAI,SAAM,GAAG,MAAM,EAAE,EAAE,CAOrE;AAMD,wBAAgB,UAAU,CACxB,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EAAE,EACd,GAAG,EAAE,MAAM,EACX,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACpC,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CAgB/D"}
1
+ {"version":3,"file":"quality-tools.d.ts","sourceRoot":"","sources":["../../../../server/services/websocket/quality-tools.ts"],"names":[],"mappings":"AAKA,OAAO,EAAwC,KAAK,SAAS,EAAE,KAAK,WAAW,EAAqB,MAAM,oBAAoB,CAAC;AAa/H,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,EAAE,CAe5D;AA0CD,wBAAsB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,KAAK,EAAE,WAAW,EAAE,CAAC;IAAC,SAAS,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAsBzG;AAmBD,wBAAsB,YAAY,CAChC,OAAO,EAAE,MAAM,EACf,SAAS,CAAC,EAAE,MAAM,EAAE,GACnB,OAAO,CAAC;IAAE,KAAK,EAAE,WAAW,EAAE,CAAC;IAAC,SAAS,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAoBxD;AAMD,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAwDD;;;;;GAKG;AACH,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CA6BjG;AAMD;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAOxE;AA0BD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,UAAU,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAKxD;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,IAAI,SAAM,GAAG,MAAM,EAAE,EAAE,CAOrE;AAMD,wBAAgB,UAAU,CACxB,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EAAE,EACd,GAAG,EAAE,MAAM,EACX,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACpC,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CAgB/D"}
@@ -251,6 +251,55 @@ export function filesByExt(files, exts) {
251
251
  }
252
252
  return out;
253
253
  }
254
+ /** Folders that signal "this whole tree is test code" by convention. */
255
+ const TEST_FOLDER_SEGMENTS = ['__tests__', '__mocks__', 'tests', 'test', 'e2e', 'spec'];
256
+ /** Filename regexes that mark a single file as a test, regardless of folder. */
257
+ const TEST_FILE_PATTERNS = [
258
+ /\.(test|spec)\.(ts|tsx|js|jsx|mjs|cjs|mts|cts)$/, // JS/TS .test/.spec
259
+ /_test\.(go|py)$/, // Go / Python *_test
260
+ /^test_.+\.py$/, // Python test_*.py
261
+ ];
262
+ function pathHasTestFolder(path) {
263
+ for (const segment of TEST_FOLDER_SEGMENTS) {
264
+ if (path.includes(`/${segment}/`) || path.startsWith(`${segment}/`))
265
+ return true;
266
+ }
267
+ return false;
268
+ }
269
+ function fileNameLooksLikeTest(name) {
270
+ for (const pattern of TEST_FILE_PATTERNS) {
271
+ if (pattern.test(name))
272
+ return true;
273
+ }
274
+ return false;
275
+ }
276
+ /**
277
+ * Identify a path as a test/spec file. Test files are exempt from
278
+ * structural-length checks (long-file, long-function) because:
279
+ *
280
+ * - A 600-line test file with 50 small `it()` blocks is easy to read,
281
+ * each block is independent, and "split it" yields zero maintenance
282
+ * benefit while harming discoverability.
283
+ * - A 200-line test function (long Arrange-Act-Assert with helpers
284
+ * inlined) is normal for feature coverage and not a complexity smell.
285
+ *
286
+ * Linters and security/bug findings still apply to test files — only the
287
+ * structural-length heuristics defer. Pattern-matches the conventions used
288
+ * by Code Climate's default-exclude set:
289
+ *
290
+ * - JS/TS: *.test.ts, *.test.tsx, *.spec.js, *.spec.jsx, *.test.mts, ...
291
+ * - Folder: __tests__/, /tests/, /test/, e2e/, spec/, __mocks__/
292
+ * - Python: test_*.py, *_test.py
293
+ * - Go: *_test.go
294
+ * - Rust: files inside `tests/` are integration tests by convention
295
+ */
296
+ export function isTestFile(relativePath) {
297
+ const path = relativePath.replace(/\\/g, '/').toLowerCase();
298
+ if (pathHasTestFolder(path))
299
+ return true;
300
+ const name = path.split('/').pop() ?? path;
301
+ return fileNameLooksLikeTest(name);
302
+ }
254
303
  /**
255
304
  * Split a file list into chunks so a single command invocation doesn't
256
305
  * blow past ARG_MAX. macOS ARG_MAX is ~256KB; 400 paths at ~200 chars each