mstro-app 0.5.0 → 0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (556) hide show
  1. package/LICENSE +129 -190
  2. package/PRIVACY.md +3 -3
  3. package/README.md +5 -1
  4. package/bin/commands/config.js +0 -1
  5. package/bin/mstro.js +0 -1
  6. package/bin/postinstall.js +0 -1
  7. package/dist/server/cli/headless/claude-invoker-process.d.ts.map +1 -1
  8. package/dist/server/cli/headless/claude-invoker-process.js +0 -1
  9. package/dist/server/cli/headless/claude-invoker-process.js.map +1 -1
  10. package/dist/server/cli/headless/claude-invoker-stall.d.ts.map +1 -1
  11. package/dist/server/cli/headless/claude-invoker-stall.js +0 -1
  12. package/dist/server/cli/headless/claude-invoker-stall.js.map +1 -1
  13. package/dist/server/cli/headless/claude-invoker-stream.d.ts.map +1 -1
  14. package/dist/server/cli/headless/claude-invoker-stream.js +0 -1
  15. package/dist/server/cli/headless/claude-invoker-stream.js.map +1 -1
  16. package/dist/server/cli/headless/claude-invoker-tools.d.ts.map +1 -1
  17. package/dist/server/cli/headless/claude-invoker-tools.js +0 -1
  18. package/dist/server/cli/headless/claude-invoker-tools.js.map +1 -1
  19. package/dist/server/cli/headless/claude-invoker.d.ts.map +1 -1
  20. package/dist/server/cli/headless/claude-invoker.js +0 -1
  21. package/dist/server/cli/headless/claude-invoker.js.map +1 -1
  22. package/dist/server/cli/headless/haiku-assessments.d.ts.map +1 -1
  23. package/dist/server/cli/headless/haiku-assessments.js +0 -1
  24. package/dist/server/cli/headless/haiku-assessments.js.map +1 -1
  25. package/dist/server/cli/headless/headless-logger.d.ts.map +1 -1
  26. package/dist/server/cli/headless/headless-logger.js +0 -1
  27. package/dist/server/cli/headless/headless-logger.js.map +1 -1
  28. package/dist/server/cli/headless/index.d.ts.map +1 -1
  29. package/dist/server/cli/headless/index.js +0 -1
  30. package/dist/server/cli/headless/index.js.map +1 -1
  31. package/dist/server/cli/headless/native-timeout-detector.d.ts.map +1 -1
  32. package/dist/server/cli/headless/native-timeout-detector.js +0 -1
  33. package/dist/server/cli/headless/native-timeout-detector.js.map +1 -1
  34. package/dist/server/cli/headless/output-utils.d.ts.map +1 -1
  35. package/dist/server/cli/headless/output-utils.js +0 -1
  36. package/dist/server/cli/headless/output-utils.js.map +1 -1
  37. package/dist/server/cli/headless/prompt-utils.d.ts.map +1 -1
  38. package/dist/server/cli/headless/prompt-utils.js +0 -1
  39. package/dist/server/cli/headless/prompt-utils.js.map +1 -1
  40. package/dist/server/cli/headless/resilient-runner.d.ts.map +1 -1
  41. package/dist/server/cli/headless/resilient-runner.js +0 -1
  42. package/dist/server/cli/headless/resilient-runner.js.map +1 -1
  43. package/dist/server/cli/headless/retry-strategies.d.ts.map +1 -1
  44. package/dist/server/cli/headless/retry-strategies.js +0 -1
  45. package/dist/server/cli/headless/retry-strategies.js.map +1 -1
  46. package/dist/server/cli/headless/runner.d.ts.map +1 -1
  47. package/dist/server/cli/headless/runner.js +0 -1
  48. package/dist/server/cli/headless/runner.js.map +1 -1
  49. package/dist/server/cli/headless/stall-assessor.d.ts.map +1 -1
  50. package/dist/server/cli/headless/stall-assessor.js +0 -1
  51. package/dist/server/cli/headless/stall-assessor.js.map +1 -1
  52. package/dist/server/cli/headless/tool-watchdog.d.ts.map +1 -1
  53. package/dist/server/cli/headless/tool-watchdog.js +0 -1
  54. package/dist/server/cli/headless/tool-watchdog.js.map +1 -1
  55. package/dist/server/cli/headless/types.d.ts.map +1 -1
  56. package/dist/server/cli/headless/types.js +0 -1
  57. package/dist/server/cli/headless/types.js.map +1 -1
  58. package/dist/server/cli/improvisation-attachments.d.ts.map +1 -1
  59. package/dist/server/cli/improvisation-attachments.js +0 -1
  60. package/dist/server/cli/improvisation-attachments.js.map +1 -1
  61. package/dist/server/cli/improvisation-history-store.d.ts.map +1 -1
  62. package/dist/server/cli/improvisation-history-store.js +0 -1
  63. package/dist/server/cli/improvisation-history-store.js.map +1 -1
  64. package/dist/server/cli/improvisation-movements.d.ts.map +1 -1
  65. package/dist/server/cli/improvisation-movements.js +0 -1
  66. package/dist/server/cli/improvisation-movements.js.map +1 -1
  67. package/dist/server/cli/improvisation-output-queue.d.ts.map +1 -1
  68. package/dist/server/cli/improvisation-output-queue.js +0 -1
  69. package/dist/server/cli/improvisation-output-queue.js.map +1 -1
  70. package/dist/server/cli/improvisation-retry.d.ts.map +1 -1
  71. package/dist/server/cli/improvisation-retry.js +0 -1
  72. package/dist/server/cli/improvisation-retry.js.map +1 -1
  73. package/dist/server/cli/improvisation-session-manager.d.ts.map +1 -1
  74. package/dist/server/cli/improvisation-session-manager.js +0 -1
  75. package/dist/server/cli/improvisation-session-manager.js.map +1 -1
  76. package/dist/server/cli/improvisation-types.d.ts.map +1 -1
  77. package/dist/server/cli/improvisation-types.js +0 -1
  78. package/dist/server/cli/improvisation-types.js.map +1 -1
  79. package/dist/server/cli/retry/retry-best-result.d.ts.map +1 -1
  80. package/dist/server/cli/retry/retry-best-result.js +0 -1
  81. package/dist/server/cli/retry/retry-best-result.js.map +1 -1
  82. package/dist/server/cli/retry/retry-context-loss.d.ts.map +1 -1
  83. package/dist/server/cli/retry/retry-context-loss.js +0 -1
  84. package/dist/server/cli/retry/retry-context-loss.js.map +1 -1
  85. package/dist/server/cli/retry/retry-premature-completion.d.ts.map +1 -1
  86. package/dist/server/cli/retry/retry-premature-completion.js +1 -2
  87. package/dist/server/cli/retry/retry-premature-completion.js.map +1 -1
  88. package/dist/server/cli/retry/retry-recovery-strategies.d.ts.map +1 -1
  89. package/dist/server/cli/retry/retry-recovery-strategies.js +0 -1
  90. package/dist/server/cli/retry/retry-recovery-strategies.js.map +1 -1
  91. package/dist/server/cli/retry/retry-resume-strategy.d.ts.map +1 -1
  92. package/dist/server/cli/retry/retry-resume-strategy.js +0 -1
  93. package/dist/server/cli/retry/retry-resume-strategy.js.map +1 -1
  94. package/dist/server/cli/retry/retry-runner-factory.d.ts.map +1 -1
  95. package/dist/server/cli/retry/retry-runner-factory.js +0 -1
  96. package/dist/server/cli/retry/retry-runner-factory.js.map +1 -1
  97. package/dist/server/cli/retry/retry-tool-results.d.ts.map +1 -1
  98. package/dist/server/cli/retry/retry-tool-results.js +0 -1
  99. package/dist/server/cli/retry/retry-tool-results.js.map +1 -1
  100. package/dist/server/cli/retry/retry-types.d.ts.map +1 -1
  101. package/dist/server/cli/retry/retry-types.js +0 -1
  102. package/dist/server/cli/retry/retry-types.js.map +1 -1
  103. package/dist/server/index.js +0 -1
  104. package/dist/server/index.js.map +1 -1
  105. package/dist/server/mcp/bouncer-cli.js +0 -1
  106. package/dist/server/mcp/bouncer-cli.js.map +1 -1
  107. package/dist/server/mcp/bouncer-haiku.d.ts.map +1 -1
  108. package/dist/server/mcp/bouncer-haiku.js +0 -1
  109. package/dist/server/mcp/bouncer-haiku.js.map +1 -1
  110. package/dist/server/mcp/bouncer-integration.d.ts.map +1 -1
  111. package/dist/server/mcp/bouncer-integration.js +0 -1
  112. package/dist/server/mcp/bouncer-integration.js.map +1 -1
  113. package/dist/server/mcp/security-analysis.d.ts.map +1 -1
  114. package/dist/server/mcp/security-analysis.js +0 -1
  115. package/dist/server/mcp/security-analysis.js.map +1 -1
  116. package/dist/server/mcp/security-audit.d.ts.map +1 -1
  117. package/dist/server/mcp/security-audit.js +0 -1
  118. package/dist/server/mcp/security-audit.js.map +1 -1
  119. package/dist/server/mcp/security-patterns.d.ts.map +1 -1
  120. package/dist/server/mcp/security-patterns.js +0 -1
  121. package/dist/server/mcp/security-patterns.js.map +1 -1
  122. package/dist/server/mcp/server.js +0 -1
  123. package/dist/server/mcp/server.js.map +1 -1
  124. package/dist/server/routes/files.d.ts.map +1 -1
  125. package/dist/server/routes/files.js +0 -1
  126. package/dist/server/routes/files.js.map +1 -1
  127. package/dist/server/routes/improvise.d.ts.map +1 -1
  128. package/dist/server/routes/improvise.js +0 -1
  129. package/dist/server/routes/improvise.js.map +1 -1
  130. package/dist/server/routes/index.d.ts.map +1 -1
  131. package/dist/server/routes/index.js +0 -1
  132. package/dist/server/routes/index.js.map +1 -1
  133. package/dist/server/routes/instances.d.ts.map +1 -1
  134. package/dist/server/routes/instances.js +0 -1
  135. package/dist/server/routes/instances.js.map +1 -1
  136. package/dist/server/routes/notifications.d.ts.map +1 -1
  137. package/dist/server/routes/notifications.js +0 -1
  138. package/dist/server/routes/notifications.js.map +1 -1
  139. package/dist/server/server-setup.d.ts.map +1 -1
  140. package/dist/server/server-setup.js +0 -1
  141. package/dist/server/server-setup.js.map +1 -1
  142. package/dist/server/services/analytics.d.ts.map +1 -1
  143. package/dist/server/services/analytics.js +0 -1
  144. package/dist/server/services/analytics.js.map +1 -1
  145. package/dist/server/services/auth.d.ts.map +1 -1
  146. package/dist/server/services/auth.js +0 -1
  147. package/dist/server/services/auth.js.map +1 -1
  148. package/dist/server/services/client-id.d.ts.map +1 -1
  149. package/dist/server/services/client-id.js +0 -1
  150. package/dist/server/services/client-id.js.map +1 -1
  151. package/dist/server/services/file-explorer-ops.d.ts.map +1 -1
  152. package/dist/server/services/file-explorer-ops.js +0 -1
  153. package/dist/server/services/file-explorer-ops.js.map +1 -1
  154. package/dist/server/services/files.d.ts.map +1 -1
  155. package/dist/server/services/files.js +0 -1
  156. package/dist/server/services/files.js.map +1 -1
  157. package/dist/server/services/instances.d.ts.map +1 -1
  158. package/dist/server/services/instances.js +0 -1
  159. package/dist/server/services/instances.js.map +1 -1
  160. package/dist/server/services/pathUtils.d.ts.map +1 -1
  161. package/dist/server/services/pathUtils.js +0 -1
  162. package/dist/server/services/pathUtils.js.map +1 -1
  163. package/dist/server/services/plan/agent-loader.d.ts.map +1 -1
  164. package/dist/server/services/plan/agent-loader.js +0 -1
  165. package/dist/server/services/plan/agent-loader.js.map +1 -1
  166. package/dist/server/services/plan/board-config.d.ts.map +1 -1
  167. package/dist/server/services/plan/board-config.js +0 -1
  168. package/dist/server/services/plan/board-config.js.map +1 -1
  169. package/dist/server/services/plan/composer.d.ts.map +1 -1
  170. package/dist/server/services/plan/composer.js +0 -1
  171. package/dist/server/services/plan/composer.js.map +1 -1
  172. package/dist/server/services/plan/config-installer.d.ts.map +1 -1
  173. package/dist/server/services/plan/config-installer.js +0 -1
  174. package/dist/server/services/plan/config-installer.js.map +1 -1
  175. package/dist/server/services/plan/dependency-resolver.d.ts.map +1 -1
  176. package/dist/server/services/plan/dependency-resolver.js +0 -1
  177. package/dist/server/services/plan/dependency-resolver.js.map +1 -1
  178. package/dist/server/services/plan/executor.d.ts.map +1 -1
  179. package/dist/server/services/plan/executor.js +45 -3
  180. package/dist/server/services/plan/executor.js.map +1 -1
  181. package/dist/server/services/plan/front-matter.d.ts.map +1 -1
  182. package/dist/server/services/plan/front-matter.js +0 -1
  183. package/dist/server/services/plan/front-matter.js.map +1 -1
  184. package/dist/server/services/plan/issue-classification.d.ts.map +1 -1
  185. package/dist/server/services/plan/issue-classification.js +0 -1
  186. package/dist/server/services/plan/issue-classification.js.map +1 -1
  187. package/dist/server/services/plan/issue-loader.d.ts.map +1 -1
  188. package/dist/server/services/plan/issue-loader.js +0 -1
  189. package/dist/server/services/plan/issue-loader.js.map +1 -1
  190. package/dist/server/services/plan/issue-prompt-builder.d.ts.map +1 -1
  191. package/dist/server/services/plan/issue-prompt-builder.js +0 -1
  192. package/dist/server/services/plan/issue-prompt-builder.js.map +1 -1
  193. package/dist/server/services/plan/issue-retry.d.ts +3 -1
  194. package/dist/server/services/plan/issue-retry.d.ts.map +1 -1
  195. package/dist/server/services/plan/issue-retry.js +2 -1
  196. package/dist/server/services/plan/issue-retry.js.map +1 -1
  197. package/dist/server/services/plan/issue-writer.d.ts.map +1 -1
  198. package/dist/server/services/plan/issue-writer.js +0 -1
  199. package/dist/server/services/plan/issue-writer.js.map +1 -1
  200. package/dist/server/services/plan/output-manager.d.ts.map +1 -1
  201. package/dist/server/services/plan/output-manager.js +0 -1
  202. package/dist/server/services/plan/output-manager.js.map +1 -1
  203. package/dist/server/services/plan/parser-core.d.ts.map +1 -1
  204. package/dist/server/services/plan/parser-core.js +0 -1
  205. package/dist/server/services/plan/parser-core.js.map +1 -1
  206. package/dist/server/services/plan/parser-migration.d.ts.map +1 -1
  207. package/dist/server/services/plan/parser-migration.js +0 -1
  208. package/dist/server/services/plan/parser-migration.js.map +1 -1
  209. package/dist/server/services/plan/parser.d.ts.map +1 -1
  210. package/dist/server/services/plan/parser.js +0 -1
  211. package/dist/server/services/plan/parser.js.map +1 -1
  212. package/dist/server/services/plan/progress-log.d.ts.map +1 -1
  213. package/dist/server/services/plan/progress-log.js +0 -1
  214. package/dist/server/services/plan/progress-log.js.map +1 -1
  215. package/dist/server/services/plan/prompt-builder.d.ts.map +1 -1
  216. package/dist/server/services/plan/prompt-builder.js +0 -1
  217. package/dist/server/services/plan/prompt-builder.js.map +1 -1
  218. package/dist/server/services/plan/readiness-planner.d.ts.map +1 -1
  219. package/dist/server/services/plan/readiness-planner.js +0 -1
  220. package/dist/server/services/plan/readiness-planner.js.map +1 -1
  221. package/dist/server/services/plan/review-gate.d.ts.map +1 -1
  222. package/dist/server/services/plan/review-gate.js +0 -1
  223. package/dist/server/services/plan/review-gate.js.map +1 -1
  224. package/dist/server/services/plan/state-reconciler.d.ts.map +1 -1
  225. package/dist/server/services/plan/state-reconciler.js +0 -1
  226. package/dist/server/services/plan/state-reconciler.js.map +1 -1
  227. package/dist/server/services/plan/types.d.ts.map +1 -1
  228. package/dist/server/services/plan/types.js +0 -1
  229. package/dist/server/services/plan/types.js.map +1 -1
  230. package/dist/server/services/plan/watcher.d.ts.map +1 -1
  231. package/dist/server/services/plan/watcher.js +0 -1
  232. package/dist/server/services/plan/watcher.js.map +1 -1
  233. package/dist/server/services/platform-credentials.d.ts.map +1 -1
  234. package/dist/server/services/platform-credentials.js +0 -1
  235. package/dist/server/services/platform-credentials.js.map +1 -1
  236. package/dist/server/services/platform-token-lifecycle.d.ts +70 -0
  237. package/dist/server/services/platform-token-lifecycle.d.ts.map +1 -0
  238. package/dist/server/services/platform-token-lifecycle.js +156 -0
  239. package/dist/server/services/platform-token-lifecycle.js.map +1 -0
  240. package/dist/server/services/platform.d.ts +21 -56
  241. package/dist/server/services/platform.d.ts.map +1 -1
  242. package/dist/server/services/platform.js +98 -142
  243. package/dist/server/services/platform.js.map +1 -1
  244. package/dist/server/services/sentry.d.ts.map +1 -1
  245. package/dist/server/services/sentry.js +0 -1
  246. package/dist/server/services/sentry.js.map +1 -1
  247. package/dist/server/services/settings.d.ts.map +1 -1
  248. package/dist/server/services/settings.js +0 -1
  249. package/dist/server/services/settings.js.map +1 -1
  250. package/dist/server/services/terminal/pty-manager.d.ts.map +1 -1
  251. package/dist/server/services/terminal/pty-manager.js +0 -1
  252. package/dist/server/services/terminal/pty-manager.js.map +1 -1
  253. package/dist/server/services/terminal/pty-utils.d.ts.map +1 -1
  254. package/dist/server/services/terminal/pty-utils.js +0 -1
  255. package/dist/server/services/terminal/pty-utils.js.map +1 -1
  256. package/dist/server/services/websocket/autocomplete.d.ts.map +1 -1
  257. package/dist/server/services/websocket/autocomplete.js +0 -1
  258. package/dist/server/services/websocket/autocomplete.js.map +1 -1
  259. package/dist/server/services/websocket/file-definition-handlers.d.ts.map +1 -1
  260. package/dist/server/services/websocket/file-definition-handlers.js +0 -1
  261. package/dist/server/services/websocket/file-definition-handlers.js.map +1 -1
  262. package/dist/server/services/websocket/file-download-handler.d.ts.map +1 -1
  263. package/dist/server/services/websocket/file-download-handler.js +0 -1
  264. package/dist/server/services/websocket/file-download-handler.js.map +1 -1
  265. package/dist/server/services/websocket/file-explorer-handlers.d.ts.map +1 -1
  266. package/dist/server/services/websocket/file-explorer-handlers.js +0 -1
  267. package/dist/server/services/websocket/file-explorer-handlers.js.map +1 -1
  268. package/dist/server/services/websocket/file-search-handlers.d.ts.map +1 -1
  269. package/dist/server/services/websocket/file-search-handlers.js +0 -1
  270. package/dist/server/services/websocket/file-search-handlers.js.map +1 -1
  271. package/dist/server/services/websocket/file-upload-handler.d.ts +2 -3
  272. package/dist/server/services/websocket/file-upload-handler.d.ts.map +1 -1
  273. package/dist/server/services/websocket/file-upload-handler.js +4 -7
  274. package/dist/server/services/websocket/file-upload-handler.js.map +1 -1
  275. package/dist/server/services/websocket/file-utils.d.ts.map +1 -1
  276. package/dist/server/services/websocket/file-utils.js +0 -1
  277. package/dist/server/services/websocket/file-utils.js.map +1 -1
  278. package/dist/server/services/websocket/git-branch-handlers.d.ts.map +1 -1
  279. package/dist/server/services/websocket/git-branch-handlers.js +0 -1
  280. package/dist/server/services/websocket/git-branch-handlers.js.map +1 -1
  281. package/dist/server/services/websocket/git-diff-handlers.d.ts.map +1 -1
  282. package/dist/server/services/websocket/git-diff-handlers.js +0 -1
  283. package/dist/server/services/websocket/git-diff-handlers.js.map +1 -1
  284. package/dist/server/services/websocket/git-handlers.d.ts.map +1 -1
  285. package/dist/server/services/websocket/git-handlers.js +58 -6
  286. package/dist/server/services/websocket/git-handlers.js.map +1 -1
  287. package/dist/server/services/websocket/git-head-watcher.d.ts.map +1 -1
  288. package/dist/server/services/websocket/git-head-watcher.js +0 -1
  289. package/dist/server/services/websocket/git-head-watcher.js.map +1 -1
  290. package/dist/server/services/websocket/git-log-handlers.d.ts.map +1 -1
  291. package/dist/server/services/websocket/git-log-handlers.js +0 -1
  292. package/dist/server/services/websocket/git-log-handlers.js.map +1 -1
  293. package/dist/server/services/websocket/git-pr-handlers.d.ts.map +1 -1
  294. package/dist/server/services/websocket/git-pr-handlers.js +0 -1
  295. package/dist/server/services/websocket/git-pr-handlers.js.map +1 -1
  296. package/dist/server/services/websocket/git-tag-handlers.d.ts.map +1 -1
  297. package/dist/server/services/websocket/git-tag-handlers.js +0 -1
  298. package/dist/server/services/websocket/git-tag-handlers.js.map +1 -1
  299. package/dist/server/services/websocket/git-utils.d.ts +18 -3
  300. package/dist/server/services/websocket/git-utils.d.ts.map +1 -1
  301. package/dist/server/services/websocket/git-utils.js +58 -8
  302. package/dist/server/services/websocket/git-utils.js.map +1 -1
  303. package/dist/server/services/websocket/git-worktree-handlers.d.ts.map +1 -1
  304. package/dist/server/services/websocket/git-worktree-handlers.js +230 -14
  305. package/dist/server/services/websocket/git-worktree-handlers.js.map +1 -1
  306. package/dist/server/services/websocket/handler-context.d.ts.map +1 -1
  307. package/dist/server/services/websocket/handler-context.js +0 -1
  308. package/dist/server/services/websocket/handler-context.js.map +1 -1
  309. package/dist/server/services/websocket/handler.d.ts.map +1 -1
  310. package/dist/server/services/websocket/handler.js +3 -4
  311. package/dist/server/services/websocket/handler.js.map +1 -1
  312. package/dist/server/services/websocket/index.d.ts.map +1 -1
  313. package/dist/server/services/websocket/index.js +0 -1
  314. package/dist/server/services/websocket/index.js.map +1 -1
  315. package/dist/server/services/websocket/msg-id-tracker.d.ts.map +1 -1
  316. package/dist/server/services/websocket/msg-id-tracker.js +0 -1
  317. package/dist/server/services/websocket/msg-id-tracker.js.map +1 -1
  318. package/dist/server/services/websocket/plan-board-handlers.d.ts.map +1 -1
  319. package/dist/server/services/websocket/plan-board-handlers.js +0 -1
  320. package/dist/server/services/websocket/plan-board-handlers.js.map +1 -1
  321. package/dist/server/services/websocket/plan-execution-handlers.d.ts.map +1 -1
  322. package/dist/server/services/websocket/plan-execution-handlers.js +6 -2
  323. package/dist/server/services/websocket/plan-execution-handlers.js.map +1 -1
  324. package/dist/server/services/websocket/plan-handlers.d.ts.map +1 -1
  325. package/dist/server/services/websocket/plan-handlers.js +0 -1
  326. package/dist/server/services/websocket/plan-handlers.js.map +1 -1
  327. package/dist/server/services/websocket/plan-helpers.d.ts.map +1 -1
  328. package/dist/server/services/websocket/plan-helpers.js +0 -1
  329. package/dist/server/services/websocket/plan-helpers.js.map +1 -1
  330. package/dist/server/services/websocket/plan-issue-handlers.d.ts.map +1 -1
  331. package/dist/server/services/websocket/plan-issue-handlers.js +0 -1
  332. package/dist/server/services/websocket/plan-issue-handlers.js.map +1 -1
  333. package/dist/server/services/websocket/plan-sprint-handlers.d.ts.map +1 -1
  334. package/dist/server/services/websocket/plan-sprint-handlers.js +0 -1
  335. package/dist/server/services/websocket/plan-sprint-handlers.js.map +1 -1
  336. package/dist/server/services/websocket/quality-complexity.d.ts.map +1 -1
  337. package/dist/server/services/websocket/quality-complexity.js +0 -1
  338. package/dist/server/services/websocket/quality-complexity.js.map +1 -1
  339. package/dist/server/services/websocket/quality-grading.d.ts +46 -0
  340. package/dist/server/services/websocket/quality-grading.d.ts.map +1 -0
  341. package/dist/server/services/websocket/quality-grading.js +482 -0
  342. package/dist/server/services/websocket/quality-grading.js.map +1 -0
  343. package/dist/server/services/websocket/quality-handlers.d.ts.map +1 -1
  344. package/dist/server/services/websocket/quality-handlers.js +0 -1
  345. package/dist/server/services/websocket/quality-handlers.js.map +1 -1
  346. package/dist/server/services/websocket/quality-linting.d.ts.map +1 -1
  347. package/dist/server/services/websocket/quality-linting.js +0 -1
  348. package/dist/server/services/websocket/quality-linting.js.map +1 -1
  349. package/dist/server/services/websocket/quality-persistence.d.ts +14 -0
  350. package/dist/server/services/websocket/quality-persistence.d.ts.map +1 -1
  351. package/dist/server/services/websocket/quality-persistence.js +28 -12
  352. package/dist/server/services/websocket/quality-persistence.js.map +1 -1
  353. package/dist/server/services/websocket/quality-review-agent.d.ts.map +1 -1
  354. package/dist/server/services/websocket/quality-review-agent.js +0 -1
  355. package/dist/server/services/websocket/quality-review-agent.js.map +1 -1
  356. package/dist/server/services/websocket/quality-service.d.ts +3 -1
  357. package/dist/server/services/websocket/quality-service.d.ts.map +1 -1
  358. package/dist/server/services/websocket/quality-service.js +53 -58
  359. package/dist/server/services/websocket/quality-service.js.map +1 -1
  360. package/dist/server/services/websocket/quality-tools.d.ts +1 -1
  361. package/dist/server/services/websocket/quality-tools.d.ts.map +1 -1
  362. package/dist/server/services/websocket/quality-tools.js +6 -3
  363. package/dist/server/services/websocket/quality-tools.js.map +1 -1
  364. package/dist/server/services/websocket/quality-types.d.ts +18 -2
  365. package/dist/server/services/websocket/quality-types.d.ts.map +1 -1
  366. package/dist/server/services/websocket/quality-types.js +0 -1
  367. package/dist/server/services/websocket/quality-types.js.map +1 -1
  368. package/dist/server/services/websocket/session-handlers.d.ts.map +1 -1
  369. package/dist/server/services/websocket/session-handlers.js +0 -1
  370. package/dist/server/services/websocket/session-handlers.js.map +1 -1
  371. package/dist/server/services/websocket/session-history.d.ts.map +1 -1
  372. package/dist/server/services/websocket/session-history.js +0 -1
  373. package/dist/server/services/websocket/session-history.js.map +1 -1
  374. package/dist/server/services/websocket/session-initialization.d.ts.map +1 -1
  375. package/dist/server/services/websocket/session-initialization.js +0 -1
  376. package/dist/server/services/websocket/session-initialization.js.map +1 -1
  377. package/dist/server/services/websocket/session-registry.d.ts.map +1 -1
  378. package/dist/server/services/websocket/session-registry.js +0 -1
  379. package/dist/server/services/websocket/session-registry.js.map +1 -1
  380. package/dist/server/services/websocket/settings-handlers.d.ts.map +1 -1
  381. package/dist/server/services/websocket/settings-handlers.js +0 -1
  382. package/dist/server/services/websocket/settings-handlers.js.map +1 -1
  383. package/dist/server/services/websocket/skill-handlers.d.ts.map +1 -1
  384. package/dist/server/services/websocket/skill-handlers.js +0 -1
  385. package/dist/server/services/websocket/skill-handlers.js.map +1 -1
  386. package/dist/server/services/websocket/skill-watcher.d.ts.map +1 -1
  387. package/dist/server/services/websocket/skill-watcher.js +0 -1
  388. package/dist/server/services/websocket/skill-watcher.js.map +1 -1
  389. package/dist/server/services/websocket/tab-broadcast.d.ts.map +1 -1
  390. package/dist/server/services/websocket/tab-broadcast.js +0 -1
  391. package/dist/server/services/websocket/tab-broadcast.js.map +1 -1
  392. package/dist/server/services/websocket/tab-event-buffer.d.ts.map +1 -1
  393. package/dist/server/services/websocket/tab-event-buffer.js +0 -1
  394. package/dist/server/services/websocket/tab-event-buffer.js.map +1 -1
  395. package/dist/server/services/websocket/tab-event-replay.d.ts.map +1 -1
  396. package/dist/server/services/websocket/tab-event-replay.js +0 -1
  397. package/dist/server/services/websocket/tab-event-replay.js.map +1 -1
  398. package/dist/server/services/websocket/tab-handlers.d.ts.map +1 -1
  399. package/dist/server/services/websocket/tab-handlers.js +0 -1
  400. package/dist/server/services/websocket/tab-handlers.js.map +1 -1
  401. package/dist/server/services/websocket/terminal-handlers.d.ts.map +1 -1
  402. package/dist/server/services/websocket/terminal-handlers.js +39 -4
  403. package/dist/server/services/websocket/terminal-handlers.js.map +1 -1
  404. package/dist/server/services/websocket/types.d.ts +2 -2
  405. package/dist/server/services/websocket/types.d.ts.map +1 -1
  406. package/dist/server/services/websocket/types.js +2 -3
  407. package/dist/server/services/websocket/types.js.map +1 -1
  408. package/dist/server/utils/agent-manager.d.ts.map +1 -1
  409. package/dist/server/utils/agent-manager.js +0 -1
  410. package/dist/server/utils/agent-manager.js.map +1 -1
  411. package/dist/server/utils/paths.d.ts.map +1 -1
  412. package/dist/server/utils/paths.js +0 -1
  413. package/dist/server/utils/paths.js.map +1 -1
  414. package/dist/server/utils/port-manager.d.ts.map +1 -1
  415. package/dist/server/utils/port-manager.js +0 -1
  416. package/dist/server/utils/port-manager.js.map +1 -1
  417. package/dist/server/utils/port.d.ts.map +1 -1
  418. package/dist/server/utils/port.js +0 -1
  419. package/dist/server/utils/port.js.map +1 -1
  420. package/package.json +2 -2
  421. package/server/cli/headless/claude-invoker-process.ts +0 -1
  422. package/server/cli/headless/claude-invoker-stall.ts +0 -1
  423. package/server/cli/headless/claude-invoker-stream.ts +0 -1
  424. package/server/cli/headless/claude-invoker-tools.ts +0 -1
  425. package/server/cli/headless/claude-invoker.ts +0 -1
  426. package/server/cli/headless/haiku-assessments.ts +0 -1
  427. package/server/cli/headless/headless-logger.ts +0 -1
  428. package/server/cli/headless/index.ts +0 -1
  429. package/server/cli/headless/native-timeout-detector.ts +0 -1
  430. package/server/cli/headless/output-utils.ts +0 -1
  431. package/server/cli/headless/prompt-utils.ts +0 -1
  432. package/server/cli/headless/resilient-runner.ts +0 -1
  433. package/server/cli/headless/retry-strategies.ts +0 -1
  434. package/server/cli/headless/runner.ts +0 -1
  435. package/server/cli/headless/stall-assessor.ts +0 -1
  436. package/server/cli/headless/tool-watchdog.ts +0 -1
  437. package/server/cli/headless/types.ts +0 -1
  438. package/server/cli/improvisation-attachments.ts +0 -1
  439. package/server/cli/improvisation-history-store.ts +0 -1
  440. package/server/cli/improvisation-movements.ts +0 -1
  441. package/server/cli/improvisation-output-queue.ts +0 -1
  442. package/server/cli/improvisation-retry.ts +0 -1
  443. package/server/cli/improvisation-session-manager.ts +0 -1
  444. package/server/cli/improvisation-types.ts +0 -1
  445. package/server/cli/retry/retry-best-result.ts +0 -1
  446. package/server/cli/retry/retry-context-loss.ts +0 -1
  447. package/server/cli/retry/retry-premature-completion.ts +1 -2
  448. package/server/cli/retry/retry-recovery-strategies.ts +0 -1
  449. package/server/cli/retry/retry-resume-strategy.ts +0 -1
  450. package/server/cli/retry/retry-runner-factory.ts +0 -1
  451. package/server/cli/retry/retry-tool-results.ts +0 -1
  452. package/server/cli/retry/retry-types.ts +0 -1
  453. package/server/index.ts +0 -1
  454. package/server/mcp/bouncer-cli.ts +0 -1
  455. package/server/mcp/bouncer-haiku.ts +0 -1
  456. package/server/mcp/bouncer-integration.ts +0 -1
  457. package/server/mcp/security-analysis.ts +0 -1
  458. package/server/mcp/security-audit.ts +0 -1
  459. package/server/mcp/security-patterns.ts +0 -1
  460. package/server/mcp/server.ts +0 -1
  461. package/server/routes/files.ts +0 -1
  462. package/server/routes/improvise.ts +0 -1
  463. package/server/routes/index.ts +0 -1
  464. package/server/routes/instances.ts +0 -1
  465. package/server/routes/notifications.ts +0 -1
  466. package/server/server-setup.ts +0 -1
  467. package/server/services/analytics.ts +0 -1
  468. package/server/services/auth.ts +0 -1
  469. package/server/services/client-id.ts +0 -1
  470. package/server/services/file-explorer-ops.ts +0 -1
  471. package/server/services/files.ts +0 -1
  472. package/server/services/instances.ts +0 -1
  473. package/server/services/pathUtils.ts +0 -1
  474. package/server/services/plan/agent-loader.ts +0 -1
  475. package/server/services/plan/agents/code-review.md +13 -11
  476. package/server/services/plan/board-config.ts +0 -1
  477. package/server/services/plan/composer.ts +0 -1
  478. package/server/services/plan/config-installer.ts +0 -1
  479. package/server/services/plan/dependency-resolver.ts +0 -1
  480. package/server/services/plan/executor.ts +45 -3
  481. package/server/services/plan/front-matter.ts +0 -1
  482. package/server/services/plan/issue-classification.ts +0 -1
  483. package/server/services/plan/issue-loader.ts +0 -1
  484. package/server/services/plan/issue-prompt-builder.ts +0 -1
  485. package/server/services/plan/issue-retry.ts +5 -2
  486. package/server/services/plan/issue-writer.ts +0 -1
  487. package/server/services/plan/output-manager.ts +0 -1
  488. package/server/services/plan/parser-core.ts +0 -1
  489. package/server/services/plan/parser-migration.ts +0 -1
  490. package/server/services/plan/parser.ts +0 -1
  491. package/server/services/plan/progress-log.ts +0 -1
  492. package/server/services/plan/prompt-builder.ts +0 -1
  493. package/server/services/plan/readiness-planner.ts +0 -1
  494. package/server/services/plan/review-gate.ts +0 -1
  495. package/server/services/plan/state-reconciler.ts +0 -1
  496. package/server/services/plan/types.ts +0 -1
  497. package/server/services/plan/watcher.ts +0 -1
  498. package/server/services/platform-credentials.ts +0 -1
  499. package/server/services/platform-token-lifecycle.ts +171 -0
  500. package/server/services/platform.ts +106 -148
  501. package/server/services/sentry.ts +0 -1
  502. package/server/services/settings.ts +0 -1
  503. package/server/services/terminal/pty-manager.ts +0 -1
  504. package/server/services/terminal/pty-utils.ts +0 -1
  505. package/server/services/websocket/autocomplete.ts +0 -1
  506. package/server/services/websocket/file-definition-handlers.ts +0 -1
  507. package/server/services/websocket/file-download-handler.ts +0 -1
  508. package/server/services/websocket/file-explorer-handlers.ts +0 -1
  509. package/server/services/websocket/file-search-handlers.ts +0 -1
  510. package/server/services/websocket/file-upload-handler.ts +6 -5
  511. package/server/services/websocket/file-utils.ts +0 -1
  512. package/server/services/websocket/git-branch-handlers.ts +0 -1
  513. package/server/services/websocket/git-diff-handlers.ts +0 -1
  514. package/server/services/websocket/git-handlers.ts +66 -10
  515. package/server/services/websocket/git-head-watcher.ts +0 -1
  516. package/server/services/websocket/git-log-handlers.ts +0 -1
  517. package/server/services/websocket/git-pr-handlers.ts +0 -1
  518. package/server/services/websocket/git-tag-handlers.ts +0 -1
  519. package/server/services/websocket/git-utils.ts +69 -9
  520. package/server/services/websocket/git-worktree-handlers.ts +260 -17
  521. package/server/services/websocket/handler-context.ts +0 -1
  522. package/server/services/websocket/handler.ts +3 -4
  523. package/server/services/websocket/index.ts +0 -1
  524. package/server/services/websocket/msg-id-tracker.ts +0 -1
  525. package/server/services/websocket/plan-board-handlers.ts +0 -1
  526. package/server/services/websocket/plan-execution-handlers.ts +6 -2
  527. package/server/services/websocket/plan-handlers.ts +0 -1
  528. package/server/services/websocket/plan-helpers.ts +0 -1
  529. package/server/services/websocket/plan-issue-handlers.ts +0 -1
  530. package/server/services/websocket/plan-sprint-handlers.ts +0 -1
  531. package/server/services/websocket/quality-complexity.ts +0 -1
  532. package/server/services/websocket/quality-grading.ts +611 -0
  533. package/server/services/websocket/quality-handlers.ts +0 -1
  534. package/server/services/websocket/quality-linting.ts +0 -1
  535. package/server/services/websocket/quality-persistence.ts +30 -8
  536. package/server/services/websocket/quality-review-agent.ts +0 -1
  537. package/server/services/websocket/quality-service.ts +54 -55
  538. package/server/services/websocket/quality-tools.ts +11 -3
  539. package/server/services/websocket/quality-types.ts +21 -3
  540. package/server/services/websocket/session-handlers.ts +0 -1
  541. package/server/services/websocket/session-history.ts +0 -1
  542. package/server/services/websocket/session-initialization.ts +0 -1
  543. package/server/services/websocket/session-registry.ts +0 -1
  544. package/server/services/websocket/settings-handlers.ts +0 -1
  545. package/server/services/websocket/skill-handlers.ts +0 -1
  546. package/server/services/websocket/skill-watcher.ts +0 -1
  547. package/server/services/websocket/tab-broadcast.ts +0 -1
  548. package/server/services/websocket/tab-event-buffer.ts +0 -1
  549. package/server/services/websocket/tab-event-replay.ts +0 -1
  550. package/server/services/websocket/tab-handlers.ts +0 -1
  551. package/server/services/websocket/terminal-handlers.ts +39 -3
  552. package/server/services/websocket/types.ts +2 -3
  553. package/server/utils/agent-manager.ts +0 -1
  554. package/server/utils/paths.ts +0 -1
  555. package/server/utils/port-manager.ts +0 -1
  556. package/server/utils/port.ts +0 -1
@@ -1,5 +1,4 @@
1
1
  // Copyright (c) 2025-present Mstro, Inc. All rights reserved.
2
- // Licensed under the MIT License. See LICENSE file for details.
3
2
 
4
3
  /**
5
4
  * Quality Handlers — WebSocket message router for quality scanning
@@ -1,5 +1,4 @@
1
1
  // Copyright (c) 2025-present Mstro, Inc. All rights reserved.
2
- // Licensed under the MIT License. See LICENSE file for details.
3
2
 
4
3
  import { relative } from 'node:path';
5
4
  import { chunkFileList, filesByExt, runCommand, type SourceFile } from './quality-tools.js';
@@ -1,5 +1,4 @@
1
1
  // Copyright (c) 2025-present Mstro, Inc. All rights reserved.
2
- // Licensed under the MIT License. See LICENSE file for details.
3
2
 
4
3
  /**
5
4
  * Quality Persistence — Persists quality config, reports, and history
@@ -13,6 +12,7 @@
13
12
 
14
13
  import { existsSync, mkdirSync, readdirSync, readFileSync, unlinkSync, writeFileSync } from 'node:fs';
15
14
  import { join } from 'node:path';
15
+ import { gradeFromScore } from './quality-grading.js';
16
16
  import type { QualityResults } from './quality-service.js';
17
17
 
18
18
  // ============================================================================
@@ -46,6 +46,11 @@ export interface QualityHistoryEntry {
46
46
  grade: string;
47
47
  issueDensity?: number;
48
48
  categoryScores?: HistoryCategoryScore[];
49
+ dimensionScores?: {
50
+ security: { score: number; grade: string };
51
+ reliability: { score: number; grade: string };
52
+ maintainability: { score: number; grade: string };
53
+ };
49
54
  directories: HistoryDirectoryEntry[];
50
55
  }
51
56
 
@@ -232,6 +237,7 @@ export class QualityPersistence {
232
237
  : undefined;
233
238
 
234
239
  const issueDensity = results.scoreBreakdown?.issueDensity;
240
+ const dimensionScores = extractDimensionScores(results);
235
241
 
236
242
  if (lastEntry && now.getTime() - lastTime < mergeWindow) {
237
243
  const existing = lastEntry.directories.findIndex((d) => d.path === dirPath);
@@ -242,10 +248,15 @@ export class QualityPersistence {
242
248
  }
243
249
  const totalScore = lastEntry.directories.reduce((sum, d) => sum + d.score, 0);
244
250
  lastEntry.overall = Math.round(totalScore / lastEntry.directories.length);
245
- lastEntry.grade = gradeFromScore(lastEntry.overall);
251
+ // Preserve N/A when every directory is N/A; otherwise map averaged score
252
+ // back to a letter. `gradeFromScore` returns A-F only, so this is the
253
+ // only place the N/A signal could be lost during multi-directory merges.
254
+ const allNA = lastEntry.directories.every((d) => d.grade === 'N/A');
255
+ lastEntry.grade = allNA ? 'N/A' : gradeFromScore(lastEntry.overall);
246
256
  lastEntry.timestamp = now.toISOString();
247
257
  if (categoryScores) lastEntry.categoryScores = categoryScores;
248
258
  if (issueDensity !== undefined) lastEntry.issueDensity = issueDensity;
259
+ if (dimensionScores) lastEntry.dimensionScores = dimensionScores;
249
260
  } else {
250
261
  history.push({
251
262
  timestamp: now.toISOString(),
@@ -253,6 +264,7 @@ export class QualityPersistence {
253
264
  grade: results.grade,
254
265
  issueDensity,
255
266
  categoryScores,
267
+ dimensionScores,
256
268
  directories: [dirEntry],
257
269
  });
258
270
  }
@@ -361,10 +373,20 @@ export class QualityPersistence {
361
373
  }
362
374
  }
363
375
 
364
- function gradeFromScore(score: number): string {
365
- if (score >= 90) return 'A';
366
- if (score >= 80) return 'B';
367
- if (score >= 70) return 'C';
368
- if (score >= 60) return 'D';
369
- return 'F';
376
+ // Snapshot per-dimension scores when the new rating fields are present.
377
+ // Older `QualityResults` objects (e.g., loaded from pre-redesign reports)
378
+ // omit `dimensions`, in which case we return undefined so old history rows
379
+ // continue to round-trip without synthesized data.
380
+ function extractDimensionScores(results: QualityResults): QualityHistoryEntry['dimensionScores'] | undefined {
381
+ if (!results.dimensions) return undefined;
382
+ const byName = new Map(results.dimensions.map((d) => [d.name, d]));
383
+ const sec = byName.get('security');
384
+ const rel = byName.get('reliability');
385
+ const maint = byName.get('maintainability');
386
+ if (!sec || !rel || !maint) return undefined;
387
+ return {
388
+ security: { score: sec.score, grade: sec.grade },
389
+ reliability: { score: rel.score, grade: rel.grade },
390
+ maintainability: { score: maint.score, grade: maint.grade },
391
+ };
370
392
  }
@@ -1,5 +1,4 @@
1
1
  // Copyright (c) 2025-present Mstro, Inc. All rights reserved.
2
- // Licensed under the MIT License. See LICENSE file for details.
3
2
 
4
3
  /**
5
4
  * Quality Review Agent — AI-powered code review using Claude Code headless runner.
@@ -1,11 +1,11 @@
1
1
  // Copyright (c) 2025-present Mstro, Inc. All rights reserved.
2
- // Licensed under the MIT License. See LICENSE file for details.
3
2
 
4
3
  import { extname } from 'node:path';
5
4
  import { analyzeComplexity, analyzeFunctionLength } from './quality-complexity.js';
5
+ import { computeQualityRating, gradeFromScore } from './quality-grading.js';
6
6
  import { analyzeLinting } from './quality-linting.js';
7
7
  import { chunkFileList, collectSourceFiles, detectEcosystem, filesByExt, runCommand, type SourceFile } from './quality-tools.js';
8
- import { type CategoryPenalty, type CategoryScore, type Ecosystem, FILE_LENGTH_THRESHOLD, hasInstalledToolInCategory, type QualityFinding, type QualityResults, type ScanProgress, type ScoreBreakdown, TOTAL_STEPS } from './quality-types.js';
8
+ import { type CategoryPenalty, type CategoryScore, type DimensionName, type Ecosystem, FILE_LENGTH_THRESHOLD, hasInstalledToolInCategory, type QualityFinding, type QualityResults, type ScanProgress, type ScoreBreakdown, TOTAL_STEPS } from './quality-types.js';
9
9
 
10
10
  const NODE_FMT_EXTS = ['.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs'];
11
11
  const PY_FMT_EXTS = ['.py', '.pyi'];
@@ -144,15 +144,20 @@ function analyzeFileLength(files: SourceFile[]): { score: number; findings: Qual
144
144
  }
145
145
 
146
146
  // ============================================================================
147
- // Deterministic Scoring — penalty-density exponential decay
147
+ // Legacy Scoring Breakdown produces the per-category penalty data still
148
+ // consumed by older UI surfaces and persisted reports. The canonical grade
149
+ // now comes from the multi-dimensional `computeQualityRating`; this function
150
+ // only fills in `scoreBreakdown` so existing dashboards keep rendering.
148
151
  // ============================================================================
149
152
 
153
+ /**
154
+ * Score-to-grade conversion for legacy callers. Delegates to the shared
155
+ * grading module so there is one source of truth. Returns `string` to satisfy
156
+ * the wider `QualityResults.grade` field — `gradeFromScore` itself never
157
+ * returns the `'N/A'` variant of the shared `Grade` union.
158
+ */
150
159
  function computeGrade(score: number): string {
151
- if (score >= 90) return 'A';
152
- if (score >= 80) return 'B';
153
- if (score >= 70) return 'C';
154
- if (score >= 60) return 'D';
155
- return 'F';
160
+ return gradeFromScore(score);
156
161
  }
157
162
 
158
163
  const SEVERITY_WEIGHT: Record<string, number> = {
@@ -305,54 +310,30 @@ export async function runQualityScan(
305
310
  ];
306
311
 
307
312
  const totalLines = files.reduce((sum, f) => sum + f.lines, 0);
308
- const { score: overall, breakdown } = computeFormulaScore(allFindings, totalLines);
313
+ // Legacy breakdown drives the per-category panels and persisted `scoreBreakdown`.
314
+ const { breakdown } = computeFormulaScore(allFindings, totalLines);
315
+ // Canonical multi-dimensional rating — drives `overall`, `grade`, and the
316
+ // new dimensions/qualityGate/gradeRationale fields. Force Maintainability
317
+ // to N/A when no real maintainability tool ran (file/function length alone
318
+ // would otherwise let a clean codebase claim grade A even though linting
319
+ // was never checked).
320
+ const forceNA = new Set<DimensionName>();
321
+ if (!hasLinter && !hasFormatter && !complexityResult.available) {
322
+ forceNA.add('maintainability');
323
+ }
324
+ const rating = computeQualityRating(allFindings, totalLines, { forceNA });
309
325
 
310
326
  const categories: CategoryScore[] = [
311
- {
312
- name: 'Linting',
313
- score: lintResult.score,
314
- weight: 0,
315
- effectiveWeight: 0,
316
- available: lintResult.available,
317
- issueCount: lintResult.issueCount,
318
- },
319
- {
320
- name: 'Formatting',
321
- score: fmtResult.score,
322
- weight: 0,
323
- effectiveWeight: 0,
324
- available: fmtResult.available,
325
- issueCount: fmtResult.issueCount,
326
- },
327
- {
328
- name: 'Complexity',
329
- score: complexityResult.score,
330
- weight: 0,
331
- effectiveWeight: 0,
332
- available: complexityResult.available,
333
- issueCount: complexityResult.issueCount,
334
- },
335
- {
336
- name: 'File Length',
337
- score: fileLengthResult.score,
338
- weight: 0,
339
- effectiveWeight: 0,
340
- available: true,
341
- issueCount: fileLengthResult.issueCount,
342
- },
343
- {
344
- name: 'Function Length',
345
- score: funcLengthResult.score,
346
- weight: 0,
347
- effectiveWeight: 0,
348
- available: true,
349
- issueCount: funcLengthResult.issueCount,
350
- },
327
+ { name: 'Linting', score: lintResult.score, available: lintResult.available, issueCount: lintResult.issueCount },
328
+ { name: 'Formatting', score: fmtResult.score, available: fmtResult.available, issueCount: fmtResult.issueCount },
329
+ { name: 'Complexity', score: complexityResult.score, available: complexityResult.available, issueCount: complexityResult.issueCount },
330
+ { name: 'File Length', score: fileLengthResult.score, available: true, issueCount: fileLengthResult.issueCount },
331
+ { name: 'Function Length', score: funcLengthResult.score, available: true, issueCount: funcLengthResult.issueCount },
351
332
  ];
352
333
 
353
334
  return {
354
- overall,
355
- grade: computeGrade(overall),
335
+ overall: rating.overall.score,
336
+ grade: rating.overall.grade,
356
337
  categories,
357
338
  findings: allFindings.slice(0, 200),
358
339
  codeReview: [],
@@ -361,6 +342,9 @@ export async function runQualityScan(
361
342
  timestamp: new Date().toISOString(),
362
343
  ecosystem: ecosystems,
363
344
  scoreBreakdown: breakdown,
345
+ dimensions: rating.dimensions,
346
+ qualityGate: rating.qualityGate,
347
+ gradeRationale: rating.gradeRationale,
364
348
  };
365
349
  }
366
350
 
@@ -370,20 +354,35 @@ export async function runQualityScan(
370
354
 
371
355
  /**
372
356
  * Recompute the overall score after AI code review findings become available.
373
- * Merges CLI + AI findings and runs the deterministic penalty-density formula.
357
+ * Merges CLI + AI findings, runs the canonical multi-dimensional rating, and
358
+ * recomputes the legacy `scoreBreakdown` so both new and old UI surfaces stay
359
+ * in sync after the merge.
374
360
  */
375
361
  export function recomputeWithAiReview(
376
362
  results: QualityResults,
377
363
  aiFindings: Array<{ severity: string; category: string }>,
378
364
  ): QualityResults {
379
365
  const allFindings = [...results.findings, ...aiFindings];
380
- const { score: overall, breakdown } = computeFormulaScore(allFindings, results.totalLines);
366
+ const { breakdown } = computeFormulaScore(allFindings, results.totalLines);
367
+ // Preserve the Maintainability N/A signal across AI re-merges by deriving
368
+ // forceNA from category availability snapshotted in the original scan.
369
+ const forceNA = new Set<DimensionName>();
370
+ const linting = results.categories.find((c) => c.name === 'Linting');
371
+ const formatting = results.categories.find((c) => c.name === 'Formatting');
372
+ const complexity = results.categories.find((c) => c.name === 'Complexity');
373
+ if (!linting?.available && !formatting?.available && !complexity?.available) {
374
+ forceNA.add('maintainability');
375
+ }
376
+ const rating = computeQualityRating(allFindings, results.totalLines, { forceNA });
381
377
 
382
378
  return {
383
379
  ...results,
384
- overall,
385
- grade: computeGrade(overall),
380
+ overall: rating.overall.score,
381
+ grade: rating.overall.grade,
386
382
  codeReview: results.codeReview,
387
383
  scoreBreakdown: breakdown,
384
+ dimensions: rating.dimensions,
385
+ qualityGate: rating.qualityGate,
386
+ gradeRationale: rating.gradeRationale,
388
387
  };
389
388
  }
@@ -1,5 +1,4 @@
1
1
  // Copyright (c) 2025-present Mstro, Inc. All rights reserved.
2
- // Licensed under the MIT License. See LICENSE file for details.
3
2
 
4
3
  import { spawn } from 'node:child_process';
5
4
  import { readdirSync, readFileSync, statSync } from 'node:fs';
@@ -104,7 +103,10 @@ async function tryInstallCommands(tool: QualityTool, dirPath: string): Promise<s
104
103
  let lastStderr = '';
105
104
  for (const cmd of commands) {
106
105
  const parts = cmd.trim().split(' ');
107
- const result = await runCommand(parts[0], parts.slice(1), dirPath);
106
+ // Force NODE_ENV=development for install: npm/yarn/pnpm silently skip
107
+ // devDependencies under NODE_ENV=production, making `-D` installs no-op
108
+ // (exit 0, nothing installed) so the post-install detection re-fails.
109
+ const result = await runCommand(parts[0], parts.slice(1), dirPath, { NODE_ENV: 'development' });
108
110
  if (result.exitCode === 0) return null;
109
111
  lastStderr = result.stderr;
110
112
  }
@@ -276,13 +278,19 @@ export function chunkFileList(paths: string[], size = 400): string[][] {
276
278
  // Command Runner
277
279
  // ============================================================================
278
280
 
279
- export function runCommand(cmd: string, args: string[], cwd: string): Promise<{ stdout: string; stderr: string; exitCode: number }> {
281
+ export function runCommand(
282
+ cmd: string,
283
+ args: string[],
284
+ cwd: string,
285
+ envOverrides?: Record<string, string>,
286
+ ): Promise<{ stdout: string; stderr: string; exitCode: number }> {
280
287
  return new Promise((resolve) => {
281
288
  const proc = spawn(cmd, args, {
282
289
  cwd,
283
290
  shell: true,
284
291
  stdio: ['ignore', 'pipe', 'pipe'],
285
292
  timeout: 120000,
293
+ env: envOverrides ? { ...process.env, ...envOverrides } : undefined,
286
294
  });
287
295
  let stdout = '';
288
296
  let stderr = '';
@@ -1,10 +1,27 @@
1
1
  // Copyright (c) 2025-present Mstro, Inc. All rights reserved.
2
- // Licensed under the MIT License. See LICENSE file for details.
3
2
 
4
3
  // ============================================================================
5
4
  // Types
6
5
  // ============================================================================
7
6
 
7
+ export type Grade = 'A' | 'B' | 'C' | 'D' | 'F' | 'N/A';
8
+ export type DimensionName = 'security' | 'reliability' | 'maintainability';
9
+
10
+ export interface DimensionScore {
11
+ name: DimensionName;
12
+ score: number;
13
+ grade: Grade;
14
+ rationale: string;
15
+ available: boolean;
16
+ findingCount: number;
17
+ worstSeverity: 'critical' | 'high' | 'medium' | 'low' | null;
18
+ }
19
+
20
+ export interface QualityGate {
21
+ passed: boolean;
22
+ failingConditions: string[];
23
+ }
24
+
8
25
  export interface QualityTool {
9
26
  name: string;
10
27
  installed: boolean;
@@ -15,8 +32,6 @@ export interface QualityTool {
15
32
  export interface CategoryScore {
16
33
  name: string;
17
34
  score: number;
18
- weight: number;
19
- effectiveWeight: number;
20
35
  available: boolean;
21
36
  issueCount?: number;
22
37
  details?: Record<string, unknown>;
@@ -62,6 +77,9 @@ export interface QualityResults {
62
77
  timestamp: string;
63
78
  ecosystem: string[];
64
79
  scoreBreakdown?: ScoreBreakdown;
80
+ dimensions?: DimensionScore[];
81
+ qualityGate?: QualityGate;
82
+ gradeRationale?: string;
65
83
  }
66
84
 
67
85
  export interface ScanProgress {
@@ -1,5 +1,4 @@
1
1
  // Copyright (c) 2025-present Mstro, Inc. All rights reserved.
2
- // Licensed under the MIT License. See LICENSE file for details.
3
2
 
4
3
  import { type FileAttachment, ImprovisationSessionManager } from '../../cli/improvisation-session-manager.js';
5
4
  import { getEffortLevel, getModel } from '../settings.js';
@@ -1,5 +1,4 @@
1
1
  // Copyright (c) 2025-present Mstro, Inc. All rights reserved.
2
- // Licensed under the MIT License. See LICENSE file for details.
3
2
 
4
3
  import { existsSync, readdirSync, readFileSync, unlinkSync } from 'node:fs';
5
4
  import { readFile } from 'node:fs/promises';
@@ -1,5 +1,4 @@
1
1
  // Copyright (c) 2025-present Mstro, Inc. All rights reserved.
2
- // Licensed under the MIT License. See LICENSE file for details.
3
2
 
4
3
  import { ImprovisationSessionManager } from '../../cli/improvisation-session-manager.js';
5
4
  import { getEffortLevel, getModel } from '../settings.js';
@@ -1,5 +1,4 @@
1
1
  // Copyright (c) 2025-present Mstro, Inc. All rights reserved.
2
- // Licensed under the MIT License. See LICENSE file for details.
3
2
 
4
3
  /**
5
4
  * Session Registry — Persistent tab-to-session mapping
@@ -1,5 +1,4 @@
1
1
  // Copyright (c) 2025-present Mstro, Inc. All rights reserved.
2
- // Licensed under the MIT License. See LICENSE file for details.
3
2
 
4
3
  import { spawn } from 'node:child_process';
5
4
  import { existsSync, mkdirSync, unlinkSync, writeFileSync } from 'node:fs';
@@ -1,5 +1,4 @@
1
1
  // Copyright (c) 2025-present Mstro, Inc. All rights reserved.
2
- // Licensed under the MIT License. See LICENSE file for details.
3
2
 
4
3
  import { execSync } from 'node:child_process';
5
4
  import { existsSync, readdirSync, readFileSync } from 'node:fs';
@@ -1,5 +1,4 @@
1
1
  // Copyright (c) 2025-present Mstro, Inc. All rights reserved.
2
- // Licensed under the MIT License. See LICENSE file for details.
3
2
 
4
3
  import { type FSWatcher, watch } from 'node:fs';
5
4
  import { findSkillsDir } from '../../utils/paths.js';
@@ -1,5 +1,4 @@
1
1
  // Copyright (c) 2025-present Mstro, Inc. All rights reserved.
2
- // Licensed under the MIT License. See LICENSE file for details.
3
2
 
4
3
  /**
5
4
  * Tab-scoped broadcast helper.
@@ -1,5 +1,4 @@
1
1
  // Copyright (c) 2025-present Mstro, Inc. All rights reserved.
2
- // Licensed under the MIT License. See LICENSE file for details.
3
2
 
4
3
  /**
5
4
  * Tab event buffer — monotonic, bounded replay log for tab-scoped broadcasts.
@@ -1,5 +1,4 @@
1
1
  // Copyright (c) 2025-present Mstro, Inc. All rights reserved.
2
- // Licensed under the MIT License. See LICENSE file for details.
3
2
 
4
3
  /**
5
4
  * Replay tab-scoped events missed during a transport gap.
@@ -1,5 +1,4 @@
1
1
  // Copyright (c) 2025-present Mstro, Inc. All rights reserved.
2
- // Licensed under the MIT License. See LICENSE file for details.
3
2
 
4
3
  import { ImprovisationSessionManager } from '../../cli/improvisation-session-manager.js';
5
4
  import { getEffortLevel, getModel } from '../settings.js';
@@ -1,7 +1,8 @@
1
1
  // Copyright (c) 2025-present Mstro, Inc. All rights reserved.
2
- // Licensed under the MIT License. See LICENSE file for details.
3
2
 
3
+ import { statSync } from 'node:fs';
4
4
  import { platform } from 'node:os';
5
+ import { isAbsolute } from 'node:path';
5
6
  import { AnalyticsEvents, trackEvent } from '../analytics.js';
6
7
  import { getPTYManager } from '../terminal/pty-manager.js';
7
8
  import type { HandlerContext } from './handler-context.js';
@@ -11,7 +12,7 @@ export async function handleTerminalMessage(ctx: HandlerContext, ws: WSContext,
11
12
  const termId = msg.terminalId || tabId;
12
13
  switch (msg.type) {
13
14
  case 'terminalInit':
14
- await handleTerminalInit(ctx, ws, termId, workingDir, msg.data?.shell, msg.data?.cols, msg.data?.rows);
15
+ await handleTerminalInit(ctx, ws, termId, workingDir, msg.data?.cwd, msg.data?.shell, msg.data?.cols, msg.data?.rows);
15
16
  break;
16
17
  case 'terminalReconnect':
17
18
  handleTerminalReconnect(ctx, ws, termId);
@@ -36,6 +37,7 @@ async function handleTerminalInit(
36
37
  ws: WSContext,
37
38
  terminalId: string,
38
39
  workingDir: string,
40
+ requestedCwd?: string,
39
41
  requestedShell?: string,
40
42
  cols?: number,
41
43
  rows?: number,
@@ -57,10 +59,16 @@ async function handleTerminalInit(
57
59
  addTerminalSubscriber(ctx, terminalId, ws);
58
60
  setupTerminalBroadcastListeners(ctx, terminalId);
59
61
 
62
+ // Validate client-supplied cwd. Used by "Open in terminal" on a worktree
63
+ // row to spawn the PTY directly in the worktree path. Falls back silently
64
+ // to the connection-level workingDir on any failure (relative path, missing
65
+ // dir, file path, or stat error from a deleted worktree).
66
+ const effectiveCwd = resolveEffectiveCwd(requestedCwd, workingDir);
67
+
60
68
  try {
61
69
  const { shell, cwd, isReconnect, platform } = await ptyManager.create(
62
70
  terminalId,
63
- workingDir,
71
+ effectiveCwd,
64
72
  cols || 80,
65
73
  rows || 24,
66
74
  requestedShell,
@@ -282,6 +290,34 @@ function setupTerminalBroadcastListeners(ctx: HandlerContext, terminalId: string
282
290
  });
283
291
  }
284
292
 
293
+ /**
294
+ * Validate a client-supplied cwd and return the effective working directory
295
+ * to spawn the PTY in. Falls back to `workingDir` on any failure, so the
296
+ * caller can pass through whatever the client sent without pre-checking.
297
+ *
298
+ * Rejects: non-strings, relative paths, missing/inaccessible paths, file
299
+ * paths (must be a directory). Doesn't try to confirm the path is a known
300
+ * worktree — the threat model is bounded (view-only users are blocked at
301
+ * the relay; owners can `cd` anywhere from a PTY anyway).
302
+ */
303
+ function resolveEffectiveCwd(requestedCwd: string | undefined, workingDir: string): string {
304
+ if (!requestedCwd || typeof requestedCwd !== 'string') return workingDir;
305
+ if (!isAbsolute(requestedCwd)) {
306
+ console.warn(`[terminalInit] Ignoring non-absolute cwd: ${requestedCwd}`);
307
+ return workingDir;
308
+ }
309
+ try {
310
+ if (!statSync(requestedCwd).isDirectory()) {
311
+ console.warn(`[terminalInit] Ignoring non-directory cwd: ${requestedCwd}`);
312
+ return workingDir;
313
+ }
314
+ } catch {
315
+ console.warn(`[terminalInit] Ignoring inaccessible cwd: ${requestedCwd}`);
316
+ return workingDir;
317
+ }
318
+ return requestedCwd;
319
+ }
320
+
285
321
  /**
286
322
  * Clean up terminal subscribers for a disconnected WS context.
287
323
  * Called from handler.ts handleClose().
@@ -1,5 +1,4 @@
1
1
  // Copyright (c) 2025-present Mstro, Inc. All rights reserved.
2
- // Licensed under the MIT License. See LICENSE file for details.
3
2
 
4
3
  /**
5
4
  * WebSocket Improvise Types
@@ -36,7 +35,7 @@ const GitTagMessages = ['gitListTags', 'gitCreateTag', 'gitPushTag'] as const;
36
35
 
37
36
  const GitWorktreeMessages = ['gitWorktreeList', 'gitWorktreeCreate', 'gitWorktreeCreateAndAssign', 'gitWorktreeRemove', 'tabWorktreeSwitch', 'gitWorktreePush', 'gitWorktreeCreatePR'] as const;
38
37
 
39
- const GitMergeMessages = ['gitMergePreview', 'gitWorktreeMerge', 'gitMergeAbort', 'gitMergeComplete'] as const;
38
+ const GitMergeMessages = ['gitMergePreview', 'gitWorktreeMerge', 'gitMergeAbort', 'gitMergeComplete', 'gitMergeStashPop', 'gitMergeDiscardBlockers'] as const;
40
39
 
41
40
  const SessionSyncMessages = ['getActiveTabs', 'createTab', 'reorderTabs', 'syncTabMeta', 'removeTab', 'markTabViewed'] as const;
42
41
 
@@ -102,7 +101,7 @@ const GitTagResponseMessages = ['gitTagList', 'gitTagCreated', 'gitTagPushed'] a
102
101
 
103
102
  const GitWorktreeResponseMessages = ['gitWorktreeListResult', 'gitWorktreeCreated', 'gitWorktreeCreatedAndAssigned', 'gitWorktreeRemoved', 'tabWorktreeSwitched', 'gitBranchChanged', 'gitWorktreePushed', 'gitWorktreePRCreated'] as const;
104
103
 
105
- const GitMergeResponseMessages = ['gitMergePreviewResult', 'gitWorktreeMergeResult', 'gitMergeAborted', 'gitMergeCompleted'] as const;
104
+ const GitMergeResponseMessages = ['gitMergePreviewResult', 'gitWorktreeMergeResult', 'gitMergeAborted', 'gitMergeCompleted', 'gitMergeStashPopped', 'gitMergeBlockersDiscarded'] as const;
106
105
 
107
106
  const SessionSyncResponseMessages = ['activeTabs', 'tabCreated', 'tabRemoved', 'tabRenamed', 'tabsReordered', 'tabViewed', 'tabStateChanged'] as const;
108
107
 
@@ -1,5 +1,4 @@
1
1
  // Copyright (c) 2025-present Mstro, Inc. All rights reserved.
2
- // Licensed under the MIT License. See LICENSE file for details.
3
2
 
4
3
  /**
5
4
  * Agent Manager
@@ -1,5 +1,4 @@
1
1
  // Copyright (c) 2025-present Mstro, Inc. All rights reserved.
2
- // Licensed under the MIT License. See LICENSE file for details.
3
2
 
4
3
  /**
5
4
  * Path Utilities for Mstro Package
@@ -1,5 +1,4 @@
1
1
  // Copyright (c) 2025-present Mstro, Inc. All rights reserved.
2
- // Licensed under the MIT License. See LICENSE file for details.
3
2
 
4
3
  /**
5
4
  * Port Manager - Finds available ports for Mstro instances
@@ -1,5 +1,4 @@
1
1
  // Copyright (c) 2025-present Mstro, Inc. All rights reserved.
2
- // Licensed under the MIT License. See LICENSE file for details.
3
2
 
4
3
  /**
5
4
  * Port utilities for finding available ports