mstro-app 0.4.52 → 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.
- package/LICENSE +129 -190
- package/PRIVACY.md +3 -3
- package/README.md +15 -6
- package/bin/commands/config.js +0 -1
- package/bin/mstro.js +1 -2
- package/bin/postinstall.js +0 -1
- package/dist/server/cli/headless/claude-invoker-process.d.ts.map +1 -1
- package/dist/server/cli/headless/claude-invoker-process.js +0 -1
- package/dist/server/cli/headless/claude-invoker-process.js.map +1 -1
- package/dist/server/cli/headless/claude-invoker-stall.d.ts.map +1 -1
- package/dist/server/cli/headless/claude-invoker-stall.js +7 -3
- package/dist/server/cli/headless/claude-invoker-stall.js.map +1 -1
- package/dist/server/cli/headless/claude-invoker-stream.d.ts.map +1 -1
- package/dist/server/cli/headless/claude-invoker-stream.js +0 -1
- package/dist/server/cli/headless/claude-invoker-stream.js.map +1 -1
- package/dist/server/cli/headless/claude-invoker-tools.d.ts.map +1 -1
- package/dist/server/cli/headless/claude-invoker-tools.js +0 -1
- package/dist/server/cli/headless/claude-invoker-tools.js.map +1 -1
- package/dist/server/cli/headless/claude-invoker.d.ts.map +1 -1
- package/dist/server/cli/headless/claude-invoker.js +1 -2
- package/dist/server/cli/headless/claude-invoker.js.map +1 -1
- package/dist/server/cli/headless/haiku-assessments.d.ts.map +1 -1
- package/dist/server/cli/headless/haiku-assessments.js +0 -1
- package/dist/server/cli/headless/haiku-assessments.js.map +1 -1
- package/dist/server/cli/headless/headless-logger.d.ts.map +1 -1
- package/dist/server/cli/headless/headless-logger.js +0 -1
- package/dist/server/cli/headless/headless-logger.js.map +1 -1
- package/dist/server/cli/headless/index.d.ts.map +1 -1
- package/dist/server/cli/headless/index.js +0 -1
- package/dist/server/cli/headless/index.js.map +1 -1
- package/dist/server/cli/headless/native-timeout-detector.d.ts.map +1 -1
- package/dist/server/cli/headless/native-timeout-detector.js +0 -1
- package/dist/server/cli/headless/native-timeout-detector.js.map +1 -1
- package/dist/server/cli/headless/output-utils.d.ts.map +1 -1
- package/dist/server/cli/headless/output-utils.js +0 -1
- package/dist/server/cli/headless/output-utils.js.map +1 -1
- package/dist/server/cli/headless/prompt-utils.d.ts.map +1 -1
- package/dist/server/cli/headless/prompt-utils.js +0 -1
- package/dist/server/cli/headless/prompt-utils.js.map +1 -1
- package/dist/server/cli/headless/resilient-runner.d.ts.map +1 -1
- package/dist/server/cli/headless/resilient-runner.js +0 -1
- package/dist/server/cli/headless/resilient-runner.js.map +1 -1
- package/dist/server/cli/headless/retry-strategies.d.ts.map +1 -1
- package/dist/server/cli/headless/retry-strategies.js +0 -1
- package/dist/server/cli/headless/retry-strategies.js.map +1 -1
- package/dist/server/cli/headless/runner.d.ts.map +1 -1
- package/dist/server/cli/headless/runner.js +63 -68
- package/dist/server/cli/headless/runner.js.map +1 -1
- package/dist/server/cli/headless/stall-assessor.d.ts.map +1 -1
- package/dist/server/cli/headless/stall-assessor.js +9 -5
- package/dist/server/cli/headless/stall-assessor.js.map +1 -1
- package/dist/server/cli/headless/tool-watchdog.d.ts.map +1 -1
- package/dist/server/cli/headless/tool-watchdog.js +0 -1
- package/dist/server/cli/headless/tool-watchdog.js.map +1 -1
- package/dist/server/cli/headless/types.d.ts.map +1 -1
- package/dist/server/cli/headless/types.js +0 -1
- package/dist/server/cli/headless/types.js.map +1 -1
- package/dist/server/cli/improvisation-attachments.d.ts.map +1 -1
- package/dist/server/cli/improvisation-attachments.js +0 -1
- package/dist/server/cli/improvisation-attachments.js.map +1 -1
- package/dist/server/cli/improvisation-history-store.d.ts +16 -0
- package/dist/server/cli/improvisation-history-store.d.ts.map +1 -0
- package/dist/server/cli/improvisation-history-store.js +51 -0
- package/dist/server/cli/improvisation-history-store.js.map +1 -0
- package/dist/server/cli/improvisation-movements.d.ts +31 -0
- package/dist/server/cli/improvisation-movements.d.ts.map +1 -0
- package/dist/server/cli/improvisation-movements.js +92 -0
- package/dist/server/cli/improvisation-movements.js.map +1 -0
- package/dist/server/cli/improvisation-output-queue.d.ts +13 -0
- package/dist/server/cli/improvisation-output-queue.d.ts.map +1 -0
- package/dist/server/cli/improvisation-output-queue.js +39 -0
- package/dist/server/cli/improvisation-output-queue.js.map +1 -0
- package/dist/server/cli/improvisation-retry.d.ts +21 -51
- package/dist/server/cli/improvisation-retry.d.ts.map +1 -1
- package/dist/server/cli/improvisation-retry.js +18 -434
- package/dist/server/cli/improvisation-retry.js.map +1 -1
- package/dist/server/cli/improvisation-session-manager.d.ts +10 -8
- package/dist/server/cli/improvisation-session-manager.d.ts.map +1 -1
- package/dist/server/cli/improvisation-session-manager.js +53 -149
- package/dist/server/cli/improvisation-session-manager.js.map +1 -1
- package/dist/server/cli/improvisation-types.d.ts.map +1 -1
- package/dist/server/cli/improvisation-types.js +0 -1
- package/dist/server/cli/improvisation-types.js.map +1 -1
- package/dist/server/cli/retry/retry-best-result.d.ts +4 -0
- package/dist/server/cli/retry/retry-best-result.d.ts.map +1 -0
- package/dist/server/cli/retry/retry-best-result.js +60 -0
- package/dist/server/cli/retry/retry-best-result.js.map +1 -0
- package/dist/server/cli/retry/retry-context-loss.d.ts +6 -0
- package/dist/server/cli/retry/retry-context-loss.d.ts.map +1 -0
- package/dist/server/cli/retry/retry-context-loss.js +67 -0
- package/dist/server/cli/retry/retry-context-loss.js.map +1 -0
- package/dist/server/cli/retry/retry-premature-completion.d.ts +5 -0
- package/dist/server/cli/retry/retry-premature-completion.d.ts.map +1 -0
- package/dist/server/cli/retry/retry-premature-completion.js +80 -0
- package/dist/server/cli/retry/retry-premature-completion.js.map +1 -0
- package/dist/server/cli/retry/retry-recovery-strategies.d.ts +13 -0
- package/dist/server/cli/retry/retry-recovery-strategies.d.ts.map +1 -0
- package/dist/server/cli/retry/retry-recovery-strategies.js +165 -0
- package/dist/server/cli/retry/retry-recovery-strategies.js.map +1 -0
- package/dist/server/cli/retry/retry-resume-strategy.d.ts +12 -0
- package/dist/server/cli/retry/retry-resume-strategy.d.ts.map +1 -0
- package/dist/server/cli/retry/retry-resume-strategy.js +21 -0
- package/dist/server/cli/retry/retry-resume-strategy.js.map +1 -0
- package/dist/server/cli/retry/retry-runner-factory.d.ts +11 -0
- package/dist/server/cli/retry/retry-runner-factory.d.ts.map +1 -0
- package/dist/server/cli/retry/retry-runner-factory.js +59 -0
- package/dist/server/cli/retry/retry-runner-factory.js.map +1 -0
- package/dist/server/cli/retry/retry-tool-results.d.ts +9 -0
- package/dist/server/cli/retry/retry-tool-results.d.ts.map +1 -0
- package/dist/server/cli/retry/retry-tool-results.js +23 -0
- package/dist/server/cli/retry/retry-tool-results.js.map +1 -0
- package/dist/server/cli/retry/retry-types.d.ts +30 -0
- package/dist/server/cli/retry/retry-types.d.ts.map +1 -0
- package/dist/server/cli/retry/retry-types.js +3 -0
- package/dist/server/cli/retry/retry-types.js.map +1 -0
- package/dist/server/index.js +21 -110
- package/dist/server/index.js.map +1 -1
- package/dist/server/mcp/bouncer-cli.js +0 -1
- package/dist/server/mcp/bouncer-cli.js.map +1 -1
- package/dist/server/mcp/bouncer-haiku.d.ts.map +1 -1
- package/dist/server/mcp/bouncer-haiku.js +0 -1
- package/dist/server/mcp/bouncer-haiku.js.map +1 -1
- package/dist/server/mcp/bouncer-integration.d.ts.map +1 -1
- package/dist/server/mcp/bouncer-integration.js +0 -1
- package/dist/server/mcp/bouncer-integration.js.map +1 -1
- package/dist/server/mcp/security-analysis.d.ts.map +1 -1
- package/dist/server/mcp/security-analysis.js +0 -1
- package/dist/server/mcp/security-analysis.js.map +1 -1
- package/dist/server/mcp/security-audit.d.ts.map +1 -1
- package/dist/server/mcp/security-audit.js +0 -1
- package/dist/server/mcp/security-audit.js.map +1 -1
- package/dist/server/mcp/security-patterns.d.ts.map +1 -1
- package/dist/server/mcp/security-patterns.js +0 -1
- package/dist/server/mcp/security-patterns.js.map +1 -1
- package/dist/server/mcp/server.js +0 -1
- package/dist/server/mcp/server.js.map +1 -1
- package/dist/server/routes/files.d.ts.map +1 -1
- package/dist/server/routes/files.js +0 -1
- package/dist/server/routes/files.js.map +1 -1
- package/dist/server/routes/improvise.d.ts.map +1 -1
- package/dist/server/routes/improvise.js +0 -1
- package/dist/server/routes/improvise.js.map +1 -1
- package/dist/server/routes/index.d.ts.map +1 -1
- package/dist/server/routes/index.js +0 -1
- package/dist/server/routes/index.js.map +1 -1
- package/dist/server/routes/instances.d.ts.map +1 -1
- package/dist/server/routes/instances.js +0 -1
- package/dist/server/routes/instances.js.map +1 -1
- package/dist/server/routes/notifications.d.ts.map +1 -1
- package/dist/server/routes/notifications.js +0 -1
- package/dist/server/routes/notifications.js.map +1 -1
- package/dist/server/server-setup.d.ts +16 -1
- package/dist/server/server-setup.d.ts.map +1 -1
- package/dist/server/server-setup.js +107 -1
- package/dist/server/server-setup.js.map +1 -1
- package/dist/server/services/analytics.d.ts.map +1 -1
- package/dist/server/services/analytics.js +0 -1
- package/dist/server/services/analytics.js.map +1 -1
- package/dist/server/services/auth.d.ts.map +1 -1
- package/dist/server/services/auth.js +0 -1
- package/dist/server/services/auth.js.map +1 -1
- package/dist/server/services/client-id.d.ts.map +1 -1
- package/dist/server/services/client-id.js +0 -1
- package/dist/server/services/client-id.js.map +1 -1
- package/dist/server/services/file-explorer-ops.d.ts.map +1 -1
- package/dist/server/services/file-explorer-ops.js +0 -1
- package/dist/server/services/file-explorer-ops.js.map +1 -1
- package/dist/server/services/files.d.ts.map +1 -1
- package/dist/server/services/files.js +0 -1
- package/dist/server/services/files.js.map +1 -1
- package/dist/server/services/instances.d.ts.map +1 -1
- package/dist/server/services/instances.js +0 -1
- package/dist/server/services/instances.js.map +1 -1
- package/dist/server/services/pathUtils.d.ts.map +1 -1
- package/dist/server/services/pathUtils.js +0 -1
- package/dist/server/services/pathUtils.js.map +1 -1
- package/dist/server/services/plan/agent-loader.d.ts.map +1 -1
- package/dist/server/services/plan/agent-loader.js +0 -1
- package/dist/server/services/plan/agent-loader.js.map +1 -1
- package/dist/server/services/plan/board-config.d.ts +21 -0
- package/dist/server/services/plan/board-config.d.ts.map +1 -0
- package/dist/server/services/plan/board-config.js +111 -0
- package/dist/server/services/plan/board-config.js.map +1 -0
- package/dist/server/services/plan/composer.d.ts +1 -1
- package/dist/server/services/plan/composer.d.ts.map +1 -1
- package/dist/server/services/plan/composer.js +7 -6
- package/dist/server/services/plan/composer.js.map +1 -1
- package/dist/server/services/plan/config-installer.d.ts.map +1 -1
- package/dist/server/services/plan/config-installer.js +0 -1
- package/dist/server/services/plan/config-installer.js.map +1 -1
- package/dist/server/services/plan/dependency-resolver.d.ts.map +1 -1
- package/dist/server/services/plan/dependency-resolver.js +0 -1
- package/dist/server/services/plan/dependency-resolver.js.map +1 -1
- package/dist/server/services/plan/executor.d.ts +48 -48
- package/dist/server/services/plan/executor.d.ts.map +1 -1
- package/dist/server/services/plan/executor.js +202 -458
- package/dist/server/services/plan/executor.js.map +1 -1
- package/dist/server/services/plan/front-matter.d.ts.map +1 -1
- package/dist/server/services/plan/front-matter.js +0 -1
- package/dist/server/services/plan/front-matter.js.map +1 -1
- package/dist/server/services/plan/issue-classification.d.ts.map +1 -1
- package/dist/server/services/plan/issue-classification.js +0 -1
- package/dist/server/services/plan/issue-classification.js.map +1 -1
- package/dist/server/services/plan/issue-loader.d.ts +16 -0
- package/dist/server/services/plan/issue-loader.d.ts.map +1 -0
- package/dist/server/services/plan/issue-loader.js +45 -0
- package/dist/server/services/plan/issue-loader.js.map +1 -0
- package/dist/server/services/plan/issue-prompt-builder.d.ts.map +1 -1
- package/dist/server/services/plan/issue-prompt-builder.js +0 -1
- package/dist/server/services/plan/issue-prompt-builder.js.map +1 -1
- package/dist/server/services/plan/issue-retry.d.ts +3 -1
- package/dist/server/services/plan/issue-retry.d.ts.map +1 -1
- package/dist/server/services/plan/issue-retry.js +2 -1
- package/dist/server/services/plan/issue-retry.js.map +1 -1
- package/dist/server/services/plan/issue-writer.d.ts +34 -0
- package/dist/server/services/plan/issue-writer.d.ts.map +1 -0
- package/dist/server/services/plan/issue-writer.js +109 -0
- package/dist/server/services/plan/issue-writer.js.map +1 -0
- package/dist/server/services/plan/output-manager.js +2 -2
- package/dist/server/services/plan/output-manager.js.map +1 -1
- package/dist/server/services/plan/parser-core.d.ts.map +1 -1
- package/dist/server/services/plan/parser-core.js +0 -1
- package/dist/server/services/plan/parser-core.js.map +1 -1
- package/dist/server/services/plan/parser-migration.d.ts.map +1 -1
- package/dist/server/services/plan/parser-migration.js +0 -1
- package/dist/server/services/plan/parser-migration.js.map +1 -1
- package/dist/server/services/plan/parser.d.ts.map +1 -1
- package/dist/server/services/plan/parser.js +0 -1
- package/dist/server/services/plan/parser.js.map +1 -1
- package/dist/server/services/plan/progress-log.d.ts +11 -0
- package/dist/server/services/plan/progress-log.d.ts.map +1 -0
- package/dist/server/services/plan/progress-log.js +80 -0
- package/dist/server/services/plan/progress-log.js.map +1 -0
- package/dist/server/services/plan/prompt-builder.d.ts.map +1 -1
- package/dist/server/services/plan/prompt-builder.js +48 -32
- package/dist/server/services/plan/prompt-builder.js.map +1 -1
- package/dist/server/services/plan/readiness-planner.d.ts +15 -0
- package/dist/server/services/plan/readiness-planner.d.ts.map +1 -0
- package/dist/server/services/plan/readiness-planner.js +40 -0
- package/dist/server/services/plan/readiness-planner.js.map +1 -0
- package/dist/server/services/plan/review-gate.d.ts +31 -0
- package/dist/server/services/plan/review-gate.d.ts.map +1 -1
- package/dist/server/services/plan/review-gate.js +52 -3
- package/dist/server/services/plan/review-gate.js.map +1 -1
- package/dist/server/services/plan/state-reconciler.d.ts.map +1 -1
- package/dist/server/services/plan/state-reconciler.js +0 -1
- package/dist/server/services/plan/state-reconciler.js.map +1 -1
- package/dist/server/services/plan/types.d.ts.map +1 -1
- package/dist/server/services/plan/types.js +0 -1
- package/dist/server/services/plan/types.js.map +1 -1
- package/dist/server/services/plan/watcher.d.ts.map +1 -1
- package/dist/server/services/plan/watcher.js +0 -1
- package/dist/server/services/plan/watcher.js.map +1 -1
- package/dist/server/services/platform-credentials.d.ts.map +1 -1
- package/dist/server/services/platform-credentials.js +0 -1
- package/dist/server/services/platform-credentials.js.map +1 -1
- package/dist/server/services/platform-token-lifecycle.d.ts +70 -0
- package/dist/server/services/platform-token-lifecycle.d.ts.map +1 -0
- package/dist/server/services/platform-token-lifecycle.js +156 -0
- package/dist/server/services/platform-token-lifecycle.js.map +1 -0
- package/dist/server/services/platform.d.ts +25 -4
- package/dist/server/services/platform.d.ts.map +1 -1
- package/dist/server/services/platform.js +150 -92
- package/dist/server/services/platform.js.map +1 -1
- package/dist/server/services/sentry.d.ts.map +1 -1
- package/dist/server/services/sentry.js +0 -1
- package/dist/server/services/sentry.js.map +1 -1
- package/dist/server/services/settings.d.ts.map +1 -1
- package/dist/server/services/settings.js +0 -1
- package/dist/server/services/settings.js.map +1 -1
- package/dist/server/services/terminal/pty-manager.d.ts.map +1 -1
- package/dist/server/services/terminal/pty-manager.js +0 -1
- package/dist/server/services/terminal/pty-manager.js.map +1 -1
- package/dist/server/services/terminal/pty-utils.d.ts.map +1 -1
- package/dist/server/services/terminal/pty-utils.js +0 -1
- package/dist/server/services/terminal/pty-utils.js.map +1 -1
- package/dist/server/services/websocket/autocomplete.d.ts.map +1 -1
- package/dist/server/services/websocket/autocomplete.js +0 -1
- package/dist/server/services/websocket/autocomplete.js.map +1 -1
- package/dist/server/services/websocket/file-definition-handlers.d.ts.map +1 -1
- package/dist/server/services/websocket/file-definition-handlers.js +0 -1
- package/dist/server/services/websocket/file-definition-handlers.js.map +1 -1
- package/dist/server/services/websocket/file-download-handler.d.ts +17 -0
- package/dist/server/services/websocket/file-download-handler.d.ts.map +1 -0
- package/dist/server/services/websocket/file-download-handler.js +164 -0
- package/dist/server/services/websocket/file-download-handler.js.map +1 -0
- package/dist/server/services/websocket/file-explorer-handlers.d.ts.map +1 -1
- package/dist/server/services/websocket/file-explorer-handlers.js +0 -1
- package/dist/server/services/websocket/file-explorer-handlers.js.map +1 -1
- package/dist/server/services/websocket/file-search-handlers.d.ts.map +1 -1
- package/dist/server/services/websocket/file-search-handlers.js +0 -1
- package/dist/server/services/websocket/file-search-handlers.js.map +1 -1
- package/dist/server/services/websocket/file-upload-handler.d.ts +2 -3
- package/dist/server/services/websocket/file-upload-handler.d.ts.map +1 -1
- package/dist/server/services/websocket/file-upload-handler.js +4 -7
- package/dist/server/services/websocket/file-upload-handler.js.map +1 -1
- package/dist/server/services/websocket/file-utils.d.ts.map +1 -1
- package/dist/server/services/websocket/file-utils.js +0 -1
- package/dist/server/services/websocket/file-utils.js.map +1 -1
- package/dist/server/services/websocket/git-branch-handlers.d.ts.map +1 -1
- package/dist/server/services/websocket/git-branch-handlers.js +0 -1
- package/dist/server/services/websocket/git-branch-handlers.js.map +1 -1
- package/dist/server/services/websocket/git-diff-handlers.d.ts.map +1 -1
- package/dist/server/services/websocket/git-diff-handlers.js +0 -1
- package/dist/server/services/websocket/git-diff-handlers.js.map +1 -1
- package/dist/server/services/websocket/git-handlers.d.ts.map +1 -1
- package/dist/server/services/websocket/git-handlers.js +58 -6
- package/dist/server/services/websocket/git-handlers.js.map +1 -1
- package/dist/server/services/websocket/git-head-watcher.d.ts.map +1 -1
- package/dist/server/services/websocket/git-head-watcher.js +0 -1
- package/dist/server/services/websocket/git-head-watcher.js.map +1 -1
- package/dist/server/services/websocket/git-log-handlers.d.ts.map +1 -1
- package/dist/server/services/websocket/git-log-handlers.js +0 -1
- package/dist/server/services/websocket/git-log-handlers.js.map +1 -1
- package/dist/server/services/websocket/git-pr-handlers.d.ts.map +1 -1
- package/dist/server/services/websocket/git-pr-handlers.js +0 -1
- package/dist/server/services/websocket/git-pr-handlers.js.map +1 -1
- package/dist/server/services/websocket/git-tag-handlers.d.ts.map +1 -1
- package/dist/server/services/websocket/git-tag-handlers.js +0 -1
- package/dist/server/services/websocket/git-tag-handlers.js.map +1 -1
- package/dist/server/services/websocket/git-utils.d.ts +18 -3
- package/dist/server/services/websocket/git-utils.d.ts.map +1 -1
- package/dist/server/services/websocket/git-utils.js +58 -8
- package/dist/server/services/websocket/git-utils.js.map +1 -1
- package/dist/server/services/websocket/git-worktree-handlers.d.ts.map +1 -1
- package/dist/server/services/websocket/git-worktree-handlers.js +258 -16
- package/dist/server/services/websocket/git-worktree-handlers.js.map +1 -1
- package/dist/server/services/websocket/handler-context.d.ts +15 -0
- package/dist/server/services/websocket/handler-context.d.ts.map +1 -1
- package/dist/server/services/websocket/handler-context.js +0 -1
- package/dist/server/services/websocket/handler-context.js.map +1 -1
- package/dist/server/services/websocket/handler.d.ts +7 -0
- package/dist/server/services/websocket/handler.d.ts.map +1 -1
- package/dist/server/services/websocket/handler.js +76 -15
- package/dist/server/services/websocket/handler.js.map +1 -1
- package/dist/server/services/websocket/index.d.ts.map +1 -1
- package/dist/server/services/websocket/index.js +0 -1
- package/dist/server/services/websocket/index.js.map +1 -1
- package/dist/server/services/websocket/msg-id-tracker.d.ts +21 -0
- package/dist/server/services/websocket/msg-id-tracker.d.ts.map +1 -0
- package/dist/server/services/websocket/msg-id-tracker.js +76 -0
- package/dist/server/services/websocket/msg-id-tracker.js.map +1 -0
- package/dist/server/services/websocket/plan-board-handlers.d.ts.map +1 -1
- package/dist/server/services/websocket/plan-board-handlers.js +0 -1
- package/dist/server/services/websocket/plan-board-handlers.js.map +1 -1
- package/dist/server/services/websocket/plan-execution-handlers.d.ts.map +1 -1
- package/dist/server/services/websocket/plan-execution-handlers.js +6 -2
- package/dist/server/services/websocket/plan-execution-handlers.js.map +1 -1
- package/dist/server/services/websocket/plan-handlers.d.ts.map +1 -1
- package/dist/server/services/websocket/plan-handlers.js +0 -1
- package/dist/server/services/websocket/plan-handlers.js.map +1 -1
- package/dist/server/services/websocket/plan-helpers.d.ts.map +1 -1
- package/dist/server/services/websocket/plan-helpers.js +0 -1
- package/dist/server/services/websocket/plan-helpers.js.map +1 -1
- package/dist/server/services/websocket/plan-issue-handlers.d.ts.map +1 -1
- package/dist/server/services/websocket/plan-issue-handlers.js +0 -1
- package/dist/server/services/websocket/plan-issue-handlers.js.map +1 -1
- package/dist/server/services/websocket/plan-sprint-handlers.d.ts.map +1 -1
- package/dist/server/services/websocket/plan-sprint-handlers.js +0 -1
- package/dist/server/services/websocket/plan-sprint-handlers.js.map +1 -1
- package/dist/server/services/websocket/quality-complexity.d.ts.map +1 -1
- package/dist/server/services/websocket/quality-complexity.js +0 -1
- package/dist/server/services/websocket/quality-complexity.js.map +1 -1
- package/dist/server/services/websocket/quality-grading.d.ts +46 -0
- package/dist/server/services/websocket/quality-grading.d.ts.map +1 -0
- package/dist/server/services/websocket/quality-grading.js +482 -0
- package/dist/server/services/websocket/quality-grading.js.map +1 -0
- package/dist/server/services/websocket/quality-handlers.d.ts.map +1 -1
- package/dist/server/services/websocket/quality-handlers.js +15 -4
- package/dist/server/services/websocket/quality-handlers.js.map +1 -1
- package/dist/server/services/websocket/quality-linting.d.ts.map +1 -1
- package/dist/server/services/websocket/quality-linting.js +0 -1
- package/dist/server/services/websocket/quality-linting.js.map +1 -1
- package/dist/server/services/websocket/quality-persistence.d.ts +14 -0
- package/dist/server/services/websocket/quality-persistence.d.ts.map +1 -1
- package/dist/server/services/websocket/quality-persistence.js +28 -12
- package/dist/server/services/websocket/quality-persistence.js.map +1 -1
- package/dist/server/services/websocket/quality-review-agent.d.ts.map +1 -1
- package/dist/server/services/websocket/quality-review-agent.js +2 -3
- package/dist/server/services/websocket/quality-review-agent.js.map +1 -1
- package/dist/server/services/websocket/quality-service.d.ts +3 -1
- package/dist/server/services/websocket/quality-service.d.ts.map +1 -1
- package/dist/server/services/websocket/quality-service.js +53 -58
- package/dist/server/services/websocket/quality-service.js.map +1 -1
- package/dist/server/services/websocket/quality-tools.d.ts +1 -1
- package/dist/server/services/websocket/quality-tools.d.ts.map +1 -1
- package/dist/server/services/websocket/quality-tools.js +6 -3
- package/dist/server/services/websocket/quality-tools.js.map +1 -1
- package/dist/server/services/websocket/quality-types.d.ts +18 -2
- package/dist/server/services/websocket/quality-types.d.ts.map +1 -1
- package/dist/server/services/websocket/quality-types.js +0 -1
- package/dist/server/services/websocket/quality-types.js.map +1 -1
- package/dist/server/services/websocket/session-handlers.d.ts +48 -2
- package/dist/server/services/websocket/session-handlers.d.ts.map +1 -1
- package/dist/server/services/websocket/session-handlers.js +204 -66
- package/dist/server/services/websocket/session-handlers.js.map +1 -1
- package/dist/server/services/websocket/session-history.d.ts.map +1 -1
- package/dist/server/services/websocket/session-history.js +0 -1
- package/dist/server/services/websocket/session-history.js.map +1 -1
- package/dist/server/services/websocket/session-initialization.d.ts +2 -2
- package/dist/server/services/websocket/session-initialization.d.ts.map +1 -1
- package/dist/server/services/websocket/session-initialization.js +75 -18
- package/dist/server/services/websocket/session-initialization.js.map +1 -1
- package/dist/server/services/websocket/session-registry.d.ts +29 -1
- package/dist/server/services/websocket/session-registry.d.ts.map +1 -1
- package/dist/server/services/websocket/session-registry.js +53 -5
- package/dist/server/services/websocket/session-registry.js.map +1 -1
- package/dist/server/services/websocket/settings-handlers.d.ts.map +1 -1
- package/dist/server/services/websocket/settings-handlers.js +0 -1
- package/dist/server/services/websocket/settings-handlers.js.map +1 -1
- package/dist/server/services/websocket/skill-handlers.d.ts.map +1 -1
- package/dist/server/services/websocket/skill-handlers.js +0 -1
- package/dist/server/services/websocket/skill-handlers.js.map +1 -1
- package/dist/server/services/websocket/skill-watcher.d.ts.map +1 -1
- package/dist/server/services/websocket/skill-watcher.js +0 -1
- package/dist/server/services/websocket/skill-watcher.js.map +1 -1
- package/dist/server/services/websocket/tab-broadcast.d.ts +24 -0
- package/dist/server/services/websocket/tab-broadcast.d.ts.map +1 -0
- package/dist/server/services/websocket/tab-broadcast.js +12 -0
- package/dist/server/services/websocket/tab-broadcast.js.map +1 -0
- package/dist/server/services/websocket/tab-event-buffer.d.ts +103 -0
- package/dist/server/services/websocket/tab-event-buffer.d.ts.map +1 -0
- package/dist/server/services/websocket/tab-event-buffer.js +106 -0
- package/dist/server/services/websocket/tab-event-buffer.js.map +1 -0
- package/dist/server/services/websocket/tab-event-replay.d.ts +20 -0
- package/dist/server/services/websocket/tab-event-replay.d.ts.map +1 -0
- package/dist/server/services/websocket/tab-event-replay.js +20 -0
- package/dist/server/services/websocket/tab-event-replay.js.map +1 -0
- package/dist/server/services/websocket/tab-handlers.d.ts +0 -1
- package/dist/server/services/websocket/tab-handlers.d.ts.map +1 -1
- package/dist/server/services/websocket/tab-handlers.js +2 -10
- package/dist/server/services/websocket/tab-handlers.js.map +1 -1
- package/dist/server/services/websocket/terminal-handlers.d.ts.map +1 -1
- package/dist/server/services/websocket/terminal-handlers.js +39 -4
- package/dist/server/services/websocket/terminal-handlers.js.map +1 -1
- package/dist/server/services/websocket/types.d.ts +17 -8
- package/dist/server/services/websocket/types.d.ts.map +1 -1
- package/dist/server/services/websocket/types.js +8 -7
- package/dist/server/services/websocket/types.js.map +1 -1
- package/dist/server/utils/agent-manager.d.ts.map +1 -1
- package/dist/server/utils/agent-manager.js +0 -1
- package/dist/server/utils/agent-manager.js.map +1 -1
- package/dist/server/utils/paths.d.ts.map +1 -1
- package/dist/server/utils/paths.js +0 -1
- package/dist/server/utils/paths.js.map +1 -1
- package/dist/server/utils/port-manager.d.ts.map +1 -1
- package/dist/server/utils/port-manager.js +0 -1
- package/dist/server/utils/port-manager.js.map +1 -1
- package/dist/server/utils/port.d.ts.map +1 -1
- package/dist/server/utils/port.js +0 -1
- package/dist/server/utils/port.js.map +1 -1
- package/package.json +2 -2
- package/server/README.md +1 -1
- package/server/cli/headless/claude-invoker-process.ts +0 -1
- package/server/cli/headless/claude-invoker-stall.ts +7 -3
- package/server/cli/headless/claude-invoker-stream.ts +0 -1
- package/server/cli/headless/claude-invoker-tools.ts +0 -1
- package/server/cli/headless/claude-invoker.ts +1 -2
- package/server/cli/headless/haiku-assessments.ts +0 -1
- package/server/cli/headless/headless-logger.ts +0 -1
- package/server/cli/headless/index.ts +0 -1
- package/server/cli/headless/native-timeout-detector.ts +0 -1
- package/server/cli/headless/output-utils.ts +0 -1
- package/server/cli/headless/prompt-utils.ts +0 -1
- package/server/cli/headless/resilient-runner.ts +0 -1
- package/server/cli/headless/retry-strategies.ts +0 -1
- package/server/cli/headless/runner.ts +67 -73
- package/server/cli/headless/stall-assessor.ts +9 -5
- package/server/cli/headless/tool-watchdog.ts +0 -1
- package/server/cli/headless/types.ts +1 -2
- package/server/cli/improvisation-attachments.ts +0 -1
- package/server/cli/improvisation-history-store.ts +61 -0
- package/server/cli/improvisation-movements.ts +119 -0
- package/server/cli/improvisation-output-queue.ts +41 -0
- package/server/cli/improvisation-retry.ts +25 -601
- package/server/cli/improvisation-session-manager.ts +74 -161
- package/server/cli/improvisation-types.ts +0 -1
- package/server/cli/retry/retry-best-result.ts +69 -0
- package/server/cli/retry/retry-context-loss.ts +86 -0
- package/server/cli/retry/retry-premature-completion.ts +112 -0
- package/server/cli/retry/retry-recovery-strategies.ts +246 -0
- package/server/cli/retry/retry-resume-strategy.ts +32 -0
- package/server/cli/retry/retry-runner-factory.ts +69 -0
- package/server/cli/retry/retry-tool-results.ts +30 -0
- package/server/cli/retry/retry-types.ts +31 -0
- package/server/index.ts +37 -124
- package/server/mcp/bouncer-cli.ts +0 -1
- package/server/mcp/bouncer-haiku.ts +0 -1
- package/server/mcp/bouncer-integration.ts +0 -1
- package/server/mcp/security-analysis.ts +0 -1
- package/server/mcp/security-audit.ts +0 -1
- package/server/mcp/security-patterns.ts +0 -1
- package/server/mcp/server.ts +0 -1
- package/server/routes/files.ts +0 -1
- package/server/routes/improvise.ts +0 -1
- package/server/routes/index.ts +0 -1
- package/server/routes/instances.ts +0 -1
- package/server/routes/notifications.ts +0 -1
- package/server/server-setup.ts +126 -2
- package/server/services/analytics.ts +0 -1
- package/server/services/auth.ts +0 -1
- package/server/services/client-id.ts +0 -1
- package/server/services/file-explorer-ops.ts +0 -1
- package/server/services/files.ts +0 -1
- package/server/services/instances.ts +0 -1
- package/server/services/pathUtils.ts +0 -1
- package/server/services/plan/agent-loader.ts +0 -1
- package/server/services/plan/agents/assess-stall.md +11 -4
- package/server/services/plan/agents/code-review.md +13 -11
- package/server/services/plan/board-config.ts +121 -0
- package/server/services/plan/composer.ts +7 -6
- package/server/services/plan/config-installer.ts +0 -1
- package/server/services/plan/dependency-resolver.ts +0 -1
- package/server/services/plan/executor.ts +259 -470
- package/server/services/plan/front-matter.ts +0 -1
- package/server/services/plan/issue-classification.ts +0 -1
- package/server/services/plan/issue-loader.ts +63 -0
- package/server/services/plan/issue-prompt-builder.ts +0 -1
- package/server/services/plan/issue-retry.ts +5 -2
- package/server/services/plan/issue-writer.ts +136 -0
- package/server/services/plan/output-manager.ts +2 -2
- package/server/services/plan/parser-core.ts +0 -1
- package/server/services/plan/parser-migration.ts +0 -1
- package/server/services/plan/parser.ts +0 -1
- package/server/services/plan/progress-log.ts +91 -0
- package/server/services/plan/prompt-builder.ts +73 -36
- package/server/services/plan/readiness-planner.ts +49 -0
- package/server/services/plan/review-gate.ts +102 -3
- package/server/services/plan/state-reconciler.ts +0 -1
- package/server/services/plan/types.ts +0 -1
- package/server/services/plan/watcher.ts +0 -1
- package/server/services/platform-credentials.ts +0 -1
- package/server/services/platform-token-lifecycle.ts +171 -0
- package/server/services/platform.ts +168 -105
- package/server/services/sentry.ts +0 -1
- package/server/services/settings.ts +0 -1
- package/server/services/terminal/pty-manager.ts +0 -1
- package/server/services/terminal/pty-utils.ts +0 -1
- package/server/services/websocket/autocomplete.ts +0 -1
- package/server/services/websocket/file-definition-handlers.ts +0 -1
- package/server/services/websocket/file-download-handler.ts +190 -0
- package/server/services/websocket/file-explorer-handlers.ts +0 -1
- package/server/services/websocket/file-search-handlers.ts +0 -1
- package/server/services/websocket/file-upload-handler.ts +6 -5
- package/server/services/websocket/file-utils.ts +0 -1
- package/server/services/websocket/git-branch-handlers.ts +0 -1
- package/server/services/websocket/git-diff-handlers.ts +0 -1
- package/server/services/websocket/git-handlers.ts +66 -10
- package/server/services/websocket/git-head-watcher.ts +0 -1
- package/server/services/websocket/git-log-handlers.ts +0 -1
- package/server/services/websocket/git-pr-handlers.ts +0 -1
- package/server/services/websocket/git-tag-handlers.ts +0 -1
- package/server/services/websocket/git-utils.ts +69 -9
- package/server/services/websocket/git-worktree-handlers.ts +289 -19
- package/server/services/websocket/handler-context.ts +15 -1
- package/server/services/websocket/handler.ts +79 -16
- package/server/services/websocket/index.ts +0 -1
- package/server/services/websocket/msg-id-tracker.ts +83 -0
- package/server/services/websocket/plan-board-handlers.ts +0 -1
- package/server/services/websocket/plan-execution-handlers.ts +6 -2
- package/server/services/websocket/plan-handlers.ts +0 -1
- package/server/services/websocket/plan-helpers.ts +0 -1
- package/server/services/websocket/plan-issue-handlers.ts +0 -1
- package/server/services/websocket/plan-sprint-handlers.ts +0 -1
- package/server/services/websocket/quality-complexity.ts +0 -1
- package/server/services/websocket/quality-grading.ts +611 -0
- package/server/services/websocket/quality-handlers.ts +16 -4
- package/server/services/websocket/quality-linting.ts +0 -1
- package/server/services/websocket/quality-persistence.ts +30 -8
- package/server/services/websocket/quality-review-agent.ts +2 -3
- package/server/services/websocket/quality-service.ts +54 -55
- package/server/services/websocket/quality-tools.ts +11 -3
- package/server/services/websocket/quality-types.ts +21 -3
- package/server/services/websocket/session-handlers.ts +213 -69
- package/server/services/websocket/session-history.ts +0 -1
- package/server/services/websocket/session-initialization.ts +83 -20
- package/server/services/websocket/session-registry.ts +61 -5
- package/server/services/websocket/settings-handlers.ts +0 -1
- package/server/services/websocket/skill-handlers.ts +0 -1
- package/server/services/websocket/skill-watcher.ts +0 -1
- package/server/services/websocket/tab-broadcast.ts +37 -0
- package/server/services/websocket/tab-event-buffer.ts +158 -0
- package/server/services/websocket/tab-event-replay.ts +41 -0
- package/server/services/websocket/tab-handlers.ts +2 -10
- package/server/services/websocket/terminal-handlers.ts +39 -3
- package/server/services/websocket/types.ts +19 -7
- package/server/utils/agent-manager.ts +0 -1
- package/server/utils/paths.ts +0 -1
- package/server/utils/port-manager.ts +0 -1
- 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 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
|
-
|
|
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
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
return
|
|
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.
|
|
@@ -428,7 +427,7 @@ async function runVerificationPass(
|
|
|
428
427
|
policy: 'STANDARD',
|
|
429
428
|
stallWarningMs: 300_000,
|
|
430
429
|
stallKillMs: 900_000,
|
|
431
|
-
stallHardCapMs:
|
|
430
|
+
stallHardCapMs: 3_600_000,
|
|
432
431
|
toolUseCallback: makeToolCallback(send, 'Verifying: '),
|
|
433
432
|
logLabel: 'code-review-verify',
|
|
434
433
|
});
|
|
@@ -505,7 +504,7 @@ export async function handleCodeReview(
|
|
|
505
504
|
policy: 'STANDARD',
|
|
506
505
|
stallWarningMs: 300_000,
|
|
507
506
|
stallKillMs: 1_200_000,
|
|
508
|
-
stallHardCapMs:
|
|
507
|
+
stallHardCapMs: 7_200_000,
|
|
509
508
|
toolUseCallback: makeToolCallback(send),
|
|
510
509
|
logLabel: 'code-review',
|
|
511
510
|
});
|
|
@@ -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
|
-
//
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
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:
|
|
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
|
|
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 {
|
|
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:
|
|
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
|
-
|
|
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(
|
|
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 {
|