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.
- package/LICENSE +129 -190
- package/PRIVACY.md +3 -3
- package/README.md +5 -1
- package/bin/commands/config.js +0 -1
- package/bin/mstro.js +0 -1
- 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 +0 -1
- 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 +0 -1
- 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 +0 -1
- 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 +0 -1
- 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.map +1 -1
- package/dist/server/cli/improvisation-history-store.js +0 -1
- package/dist/server/cli/improvisation-history-store.js.map +1 -1
- package/dist/server/cli/improvisation-movements.d.ts.map +1 -1
- package/dist/server/cli/improvisation-movements.js +0 -1
- package/dist/server/cli/improvisation-movements.js.map +1 -1
- package/dist/server/cli/improvisation-output-queue.d.ts.map +1 -1
- package/dist/server/cli/improvisation-output-queue.js +0 -1
- package/dist/server/cli/improvisation-output-queue.js.map +1 -1
- package/dist/server/cli/improvisation-retry.d.ts.map +1 -1
- package/dist/server/cli/improvisation-retry.js +0 -1
- package/dist/server/cli/improvisation-retry.js.map +1 -1
- package/dist/server/cli/improvisation-session-manager.d.ts.map +1 -1
- package/dist/server/cli/improvisation-session-manager.js +0 -1
- 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.map +1 -1
- package/dist/server/cli/retry/retry-best-result.js +0 -1
- package/dist/server/cli/retry/retry-best-result.js.map +1 -1
- package/dist/server/cli/retry/retry-context-loss.d.ts.map +1 -1
- package/dist/server/cli/retry/retry-context-loss.js +0 -1
- package/dist/server/cli/retry/retry-context-loss.js.map +1 -1
- package/dist/server/cli/retry/retry-premature-completion.d.ts.map +1 -1
- package/dist/server/cli/retry/retry-premature-completion.js +1 -2
- package/dist/server/cli/retry/retry-premature-completion.js.map +1 -1
- package/dist/server/cli/retry/retry-recovery-strategies.d.ts.map +1 -1
- package/dist/server/cli/retry/retry-recovery-strategies.js +0 -1
- package/dist/server/cli/retry/retry-recovery-strategies.js.map +1 -1
- package/dist/server/cli/retry/retry-resume-strategy.d.ts.map +1 -1
- package/dist/server/cli/retry/retry-resume-strategy.js +0 -1
- package/dist/server/cli/retry/retry-resume-strategy.js.map +1 -1
- package/dist/server/cli/retry/retry-runner-factory.d.ts.map +1 -1
- package/dist/server/cli/retry/retry-runner-factory.js +0 -1
- package/dist/server/cli/retry/retry-runner-factory.js.map +1 -1
- package/dist/server/cli/retry/retry-tool-results.d.ts.map +1 -1
- package/dist/server/cli/retry/retry-tool-results.js +0 -1
- package/dist/server/cli/retry/retry-tool-results.js.map +1 -1
- package/dist/server/cli/retry/retry-types.d.ts.map +1 -1
- package/dist/server/cli/retry/retry-types.js +0 -1
- package/dist/server/cli/retry/retry-types.js.map +1 -1
- package/dist/server/index.js +0 -1
- 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.map +1 -1
- package/dist/server/server-setup.js +0 -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.map +1 -1
- package/dist/server/services/plan/board-config.js +0 -1
- package/dist/server/services/plan/board-config.js.map +1 -1
- package/dist/server/services/plan/composer.d.ts.map +1 -1
- package/dist/server/services/plan/composer.js +0 -1
- 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.map +1 -1
- package/dist/server/services/plan/executor.js +45 -3
- 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.map +1 -1
- package/dist/server/services/plan/issue-loader.js +0 -1
- package/dist/server/services/plan/issue-loader.js.map +1 -1
- 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.map +1 -1
- package/dist/server/services/plan/issue-writer.js +0 -1
- package/dist/server/services/plan/issue-writer.js.map +1 -1
- package/dist/server/services/plan/output-manager.d.ts.map +1 -1
- package/dist/server/services/plan/output-manager.js +0 -1
- 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.map +1 -1
- package/dist/server/services/plan/progress-log.js +0 -1
- package/dist/server/services/plan/progress-log.js.map +1 -1
- package/dist/server/services/plan/prompt-builder.d.ts.map +1 -1
- package/dist/server/services/plan/prompt-builder.js +0 -1
- package/dist/server/services/plan/prompt-builder.js.map +1 -1
- package/dist/server/services/plan/readiness-planner.d.ts.map +1 -1
- package/dist/server/services/plan/readiness-planner.js +0 -1
- package/dist/server/services/plan/readiness-planner.js.map +1 -1
- package/dist/server/services/plan/review-gate.d.ts.map +1 -1
- package/dist/server/services/plan/review-gate.js +0 -1
- 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 +21 -56
- package/dist/server/services/platform.d.ts.map +1 -1
- package/dist/server/services/platform.js +98 -142
- 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.map +1 -1
- package/dist/server/services/websocket/file-download-handler.js +0 -1
- package/dist/server/services/websocket/file-download-handler.js.map +1 -1
- 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 +230 -14
- package/dist/server/services/websocket/git-worktree-handlers.js.map +1 -1
- 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.map +1 -1
- package/dist/server/services/websocket/handler.js +3 -4
- 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.map +1 -1
- package/dist/server/services/websocket/msg-id-tracker.js +0 -1
- package/dist/server/services/websocket/msg-id-tracker.js.map +1 -1
- 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 +0 -1
- 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 +0 -1
- 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.map +1 -1
- package/dist/server/services/websocket/session-handlers.js +0 -1
- 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.map +1 -1
- package/dist/server/services/websocket/session-initialization.js +0 -1
- package/dist/server/services/websocket/session-initialization.js.map +1 -1
- package/dist/server/services/websocket/session-registry.d.ts.map +1 -1
- package/dist/server/services/websocket/session-registry.js +0 -1
- 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.map +1 -1
- package/dist/server/services/websocket/tab-broadcast.js +0 -1
- package/dist/server/services/websocket/tab-broadcast.js.map +1 -1
- package/dist/server/services/websocket/tab-event-buffer.d.ts.map +1 -1
- package/dist/server/services/websocket/tab-event-buffer.js +0 -1
- package/dist/server/services/websocket/tab-event-buffer.js.map +1 -1
- package/dist/server/services/websocket/tab-event-replay.d.ts.map +1 -1
- package/dist/server/services/websocket/tab-event-replay.js +0 -1
- package/dist/server/services/websocket/tab-event-replay.js.map +1 -1
- package/dist/server/services/websocket/tab-handlers.d.ts.map +1 -1
- package/dist/server/services/websocket/tab-handlers.js +0 -1
- 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 +2 -2
- package/dist/server/services/websocket/types.d.ts.map +1 -1
- package/dist/server/services/websocket/types.js +2 -3
- 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/cli/headless/claude-invoker-process.ts +0 -1
- package/server/cli/headless/claude-invoker-stall.ts +0 -1
- 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 +0 -1
- 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 +0 -1
- package/server/cli/headless/stall-assessor.ts +0 -1
- package/server/cli/headless/tool-watchdog.ts +0 -1
- package/server/cli/headless/types.ts +0 -1
- package/server/cli/improvisation-attachments.ts +0 -1
- package/server/cli/improvisation-history-store.ts +0 -1
- package/server/cli/improvisation-movements.ts +0 -1
- package/server/cli/improvisation-output-queue.ts +0 -1
- package/server/cli/improvisation-retry.ts +0 -1
- package/server/cli/improvisation-session-manager.ts +0 -1
- package/server/cli/improvisation-types.ts +0 -1
- package/server/cli/retry/retry-best-result.ts +0 -1
- package/server/cli/retry/retry-context-loss.ts +0 -1
- package/server/cli/retry/retry-premature-completion.ts +1 -2
- package/server/cli/retry/retry-recovery-strategies.ts +0 -1
- package/server/cli/retry/retry-resume-strategy.ts +0 -1
- package/server/cli/retry/retry-runner-factory.ts +0 -1
- package/server/cli/retry/retry-tool-results.ts +0 -1
- package/server/cli/retry/retry-types.ts +0 -1
- package/server/index.ts +0 -1
- 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 +0 -1
- 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/code-review.md +13 -11
- package/server/services/plan/board-config.ts +0 -1
- package/server/services/plan/composer.ts +0 -1
- package/server/services/plan/config-installer.ts +0 -1
- package/server/services/plan/dependency-resolver.ts +0 -1
- package/server/services/plan/executor.ts +45 -3
- 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 +0 -1
- 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 +0 -1
- package/server/services/plan/output-manager.ts +0 -1
- 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 +0 -1
- package/server/services/plan/prompt-builder.ts +0 -1
- package/server/services/plan/readiness-planner.ts +0 -1
- package/server/services/plan/review-gate.ts +0 -1
- 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 +106 -148
- 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 +0 -1
- 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 +260 -17
- package/server/services/websocket/handler-context.ts +0 -1
- package/server/services/websocket/handler.ts +3 -4
- package/server/services/websocket/index.ts +0 -1
- package/server/services/websocket/msg-id-tracker.ts +0 -1
- 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 +0 -1
- 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 +0 -1
- 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 +0 -1
- package/server/services/websocket/session-history.ts +0 -1
- package/server/services/websocket/session-initialization.ts +0 -1
- package/server/services/websocket/session-registry.ts +0 -1
- 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 +0 -1
- package/server/services/websocket/tab-event-buffer.ts +0 -1
- package/server/services/websocket/tab-event-replay.ts +0 -1
- package/server/services/websocket/tab-handlers.ts +0 -1
- package/server/services/websocket/terminal-handlers.ts +39 -3
- package/server/services/websocket/types.ts +2 -3
- 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,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 {
|
|
@@ -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 { 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 { 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
|
-
|
|
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
|
|
package/server/utils/paths.ts
CHANGED