@intrect/openswarm 0.9.3 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +76 -1
- package/config.example.yaml +6 -0
- package/dist/adapters/agenticLoop.d.ts +24 -0
- package/dist/adapters/agenticLoop.d.ts.map +1 -1
- package/dist/adapters/agenticLoop.js +130 -11
- package/dist/adapters/agenticLoop.js.map +1 -1
- package/dist/adapters/applyPatch.d.ts +21 -0
- package/dist/adapters/applyPatch.d.ts.map +1 -0
- package/dist/adapters/applyPatch.js +175 -0
- package/dist/adapters/applyPatch.js.map +1 -0
- package/dist/adapters/base.d.ts.map +1 -1
- package/dist/adapters/base.js +7 -0
- package/dist/adapters/base.js.map +1 -1
- package/dist/adapters/codex.js +10 -0
- package/dist/adapters/codex.js.map +1 -1
- package/dist/adapters/codexResponses.d.ts +8 -0
- package/dist/adapters/codexResponses.d.ts.map +1 -1
- package/dist/adapters/codexResponses.js +86 -8
- package/dist/adapters/codexResponses.js.map +1 -1
- package/dist/adapters/errorClassification.d.ts +8 -0
- package/dist/adapters/errorClassification.d.ts.map +1 -0
- package/dist/adapters/errorClassification.js +54 -0
- package/dist/adapters/errorClassification.js.map +1 -0
- package/dist/adapters/gpt.d.ts.map +1 -1
- package/dist/adapters/gpt.js +12 -1
- package/dist/adapters/gpt.js.map +1 -1
- package/dist/adapters/local.d.ts.map +1 -1
- package/dist/adapters/local.js +9 -1
- package/dist/adapters/local.js.map +1 -1
- package/dist/adapters/openrouter.d.ts.map +1 -1
- package/dist/adapters/openrouter.js +9 -1
- package/dist/adapters/openrouter.js.map +1 -1
- package/dist/adapters/rateLimitError.d.ts +29 -0
- package/dist/adapters/rateLimitError.d.ts.map +1 -0
- package/dist/adapters/rateLimitError.js +64 -0
- package/dist/adapters/rateLimitError.js.map +1 -0
- package/dist/adapters/resultParsing.d.ts.map +1 -1
- package/dist/adapters/resultParsing.js +18 -0
- package/dist/adapters/resultParsing.js.map +1 -1
- package/dist/adapters/tools.d.ts +3 -0
- package/dist/adapters/tools.d.ts.map +1 -1
- package/dist/adapters/tools.js +148 -11
- package/dist/adapters/tools.js.map +1 -1
- package/dist/adapters/types.d.ts +15 -0
- package/dist/adapters/types.d.ts.map +1 -1
- package/dist/adapters/webTools.d.ts.map +1 -1
- package/dist/adapters/webTools.js +44 -21
- package/dist/adapters/webTools.js.map +1 -1
- package/dist/agents/agentPair.d.ts +9 -0
- package/dist/agents/agentPair.d.ts.map +1 -1
- package/dist/agents/agentPair.js.map +1 -1
- package/dist/agents/auditor.d.ts.map +1 -1
- package/dist/agents/auditor.js +3 -0
- package/dist/agents/auditor.js.map +1 -1
- package/dist/agents/documenter.d.ts.map +1 -1
- package/dist/agents/documenter.js +3 -0
- package/dist/agents/documenter.js.map +1 -1
- package/dist/agents/draftAnalyzer.d.ts +30 -7
- package/dist/agents/draftAnalyzer.d.ts.map +1 -1
- package/dist/agents/draftAnalyzer.js +181 -30
- package/dist/agents/draftAnalyzer.js.map +1 -1
- package/dist/agents/pairPipeline.d.ts +7 -1
- package/dist/agents/pairPipeline.d.ts.map +1 -1
- package/dist/agents/pairPipeline.js +110 -66
- package/dist/agents/pairPipeline.js.map +1 -1
- package/dist/agents/pipelineFormat.d.ts.map +1 -1
- package/dist/agents/pipelineFormat.js +4 -0
- package/dist/agents/pipelineFormat.js.map +1 -1
- package/dist/agents/reviewer.d.ts +16 -0
- package/dist/agents/reviewer.d.ts.map +1 -1
- package/dist/agents/reviewer.js +30 -0
- package/dist/agents/reviewer.js.map +1 -1
- package/dist/agents/skillDocumenter.d.ts.map +1 -1
- package/dist/agents/skillDocumenter.js +3 -0
- package/dist/agents/skillDocumenter.js.map +1 -1
- package/dist/agents/tester.d.ts.map +1 -1
- package/dist/agents/tester.js +3 -0
- package/dist/agents/tester.js.map +1 -1
- package/dist/agents/worker.d.ts +14 -0
- package/dist/agents/worker.d.ts.map +1 -1
- package/dist/agents/worker.js +123 -22
- package/dist/agents/worker.js.map +1 -1
- package/dist/automation/autonomousRunner.d.ts +12 -0
- package/dist/automation/autonomousRunner.d.ts.map +1 -1
- package/dist/automation/autonomousRunner.js +218 -29
- package/dist/automation/autonomousRunner.js.map +1 -1
- package/dist/automation/runnerExecution.d.ts +15 -0
- package/dist/automation/runnerExecution.d.ts.map +1 -1
- package/dist/automation/runnerExecution.js +77 -1
- package/dist/automation/runnerExecution.js.map +1 -1
- package/dist/automation/runnerState.d.ts +7 -0
- package/dist/automation/runnerState.d.ts.map +1 -1
- package/dist/automation/runnerState.js +23 -1
- package/dist/automation/runnerState.js.map +1 -1
- package/dist/automation/runnerTypes.d.ts +2 -0
- package/dist/automation/runnerTypes.d.ts.map +1 -1
- package/dist/automation/scheduler.d.ts +12 -0
- package/dist/automation/scheduler.d.ts.map +1 -1
- package/dist/automation/scheduler.js +29 -2
- package/dist/automation/scheduler.js.map +1 -1
- package/dist/automation/taskSource.d.ts +9 -1
- package/dist/automation/taskSource.d.ts.map +1 -1
- package/dist/automation/taskSource.js +13 -2
- package/dist/automation/taskSource.js.map +1 -1
- package/dist/cli/auditPM.d.ts +40 -0
- package/dist/cli/auditPM.d.ts.map +1 -0
- package/dist/cli/auditPM.js +132 -0
- package/dist/cli/auditPM.js.map +1 -0
- package/dist/cli/designPipeline.d.ts +30 -0
- package/dist/cli/designPipeline.d.ts.map +1 -0
- package/dist/cli/designPipeline.js +113 -0
- package/dist/cli/designPipeline.js.map +1 -0
- package/dist/cli/mcpCommand.d.ts +22 -0
- package/dist/cli/mcpCommand.d.ts.map +1 -0
- package/dist/cli/mcpCommand.js +93 -0
- package/dist/cli/mcpCommand.js.map +1 -0
- package/dist/cli/projectHandler.d.ts.map +1 -1
- package/dist/cli/projectHandler.js +4 -2
- package/dist/cli/projectHandler.js.map +1 -1
- package/dist/cli/reviewAudit.d.ts +130 -0
- package/dist/cli/reviewAudit.d.ts.map +1 -0
- package/dist/cli/reviewAudit.js +283 -0
- package/dist/cli/reviewAudit.js.map +1 -0
- package/dist/cli/reviewCommand.d.ts +53 -0
- package/dist/cli/reviewCommand.d.ts.map +1 -0
- package/dist/cli/reviewCommand.js +207 -0
- package/dist/cli/reviewCommand.js.map +1 -0
- package/dist/cli/reviewMaxCommand.d.ts +35 -0
- package/dist/cli/reviewMaxCommand.d.ts.map +1 -0
- package/dist/cli/reviewMaxCommand.js +272 -0
- package/dist/cli/reviewMaxCommand.js.map +1 -0
- package/dist/cli/reviewProgress.d.ts +34 -0
- package/dist/cli/reviewProgress.d.ts.map +1 -0
- package/dist/cli/reviewProgress.js +109 -0
- package/dist/cli/reviewProgress.js.map +1 -0
- package/dist/cli/scheduleCommand.d.ts +15 -0
- package/dist/cli/scheduleCommand.d.ts.map +1 -0
- package/dist/cli/scheduleCommand.js +68 -0
- package/dist/cli/scheduleCommand.js.map +1 -0
- package/dist/cli.js +182 -26
- package/dist/cli.js.map +1 -1
- package/dist/core/config.d.ts +24 -0
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +42 -0
- package/dist/core/config.js.map +1 -1
- package/dist/core/providerOverride.d.ts.map +1 -1
- package/dist/core/providerOverride.js +16 -13
- package/dist/core/providerOverride.js.map +1 -1
- package/dist/core/service.d.ts.map +1 -1
- package/dist/core/service.js +11 -0
- package/dist/core/service.js.map +1 -1
- package/dist/core/types.d.ts +38 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/discord/discordHandlers.d.ts.map +1 -1
- package/dist/discord/discordHandlers.js +1 -0
- package/dist/discord/discordHandlers.js.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/linear/linear.d.ts +21 -0
- package/dist/linear/linear.d.ts.map +1 -1
- package/dist/linear/linear.js +109 -4
- package/dist/linear/linear.js.map +1 -1
- package/dist/linear/projectUpdater.js +3 -1
- package/dist/linear/projectUpdater.js.map +1 -1
- package/dist/locale/prompts/en.d.ts.map +1 -1
- package/dist/locale/prompts/en.js +104 -11
- package/dist/locale/prompts/en.js.map +1 -1
- package/dist/locale/prompts/ko.d.ts.map +1 -1
- package/dist/locale/prompts/ko.js +103 -11
- package/dist/locale/prompts/ko.js.map +1 -1
- package/dist/locale/types.d.ts +12 -0
- package/dist/locale/types.d.ts.map +1 -1
- package/dist/mcp/mcpClient.d.ts +28 -1
- package/dist/mcp/mcpClient.d.ts.map +1 -1
- package/dist/mcp/mcpClient.js +74 -3
- package/dist/mcp/mcpClient.js.map +1 -1
- package/dist/orchestration/decisionEngine.d.ts +20 -0
- package/dist/orchestration/decisionEngine.d.ts.map +1 -1
- package/dist/orchestration/decisionEngine.js +23 -0
- package/dist/orchestration/decisionEngine.js.map +1 -1
- package/dist/orchestration/taskScheduler.d.ts.map +1 -1
- package/dist/orchestration/taskScheduler.js +12 -1
- package/dist/orchestration/taskScheduler.js.map +1 -1
- package/dist/support/chatBackend.d.ts +18 -0
- package/dist/support/chatBackend.d.ts.map +1 -1
- package/dist/support/chatBackend.js +92 -8
- package/dist/support/chatBackend.js.map +1 -1
- package/dist/support/chatSession.d.ts +51 -0
- package/dist/support/chatSession.d.ts.map +1 -0
- package/dist/support/chatSession.js +134 -0
- package/dist/support/chatSession.js.map +1 -0
- package/dist/support/chatTui.d.ts.map +1 -1
- package/dist/support/chatTui.js +6 -75
- package/dist/support/chatTui.js.map +1 -1
- package/dist/support/concurrencyPool.d.ts +18 -0
- package/dist/support/concurrencyPool.d.ts.map +1 -0
- package/dist/support/concurrencyPool.js +46 -0
- package/dist/support/concurrencyPool.js.map +1 -0
- package/dist/support/dashboardHtml.d.ts +1 -1
- package/dist/support/dashboardHtml.d.ts.map +1 -1
- package/dist/support/dashboardHtml.js +0 -28
- package/dist/support/dashboardHtml.js.map +1 -1
- package/dist/support/editParser.d.ts +26 -0
- package/dist/support/editParser.d.ts.map +1 -1
- package/dist/support/editParser.js +43 -0
- package/dist/support/editParser.js.map +1 -1
- package/dist/support/goalCommand.d.ts +35 -0
- package/dist/support/goalCommand.d.ts.map +1 -0
- package/dist/support/goalCommand.js +112 -0
- package/dist/support/goalCommand.js.map +1 -0
- package/dist/support/index.d.ts +0 -1
- package/dist/support/index.d.ts.map +1 -1
- package/dist/support/index.js +0 -1
- package/dist/support/index.js.map +1 -1
- package/dist/support/web.d.ts.map +1 -1
- package/dist/support/web.js +0 -7
- package/dist/support/web.js.map +1 -1
- package/dist/taskState/store.d.ts +5 -0
- package/dist/taskState/store.d.ts.map +1 -1
- package/dist/taskState/store.js +16 -0
- package/dist/taskState/store.js.map +1 -1
- package/dist/telemetry/telemetry.d.ts +42 -0
- package/dist/telemetry/telemetry.d.ts.map +1 -0
- package/dist/telemetry/telemetry.js +138 -0
- package/dist/telemetry/telemetry.js.map +1 -0
- package/dist/tui/App.d.ts +20 -0
- package/dist/tui/App.d.ts.map +1 -0
- package/dist/tui/App.js +52 -0
- package/dist/tui/App.js.map +1 -0
- package/dist/tui/chatModel.d.ts +81 -0
- package/dist/tui/chatModel.d.ts.map +1 -0
- package/dist/tui/chatModel.js +129 -0
- package/dist/tui/chatModel.js.map +1 -0
- package/dist/tui/components/AuditBoard.d.ts +10 -0
- package/dist/tui/components/AuditBoard.d.ts.map +1 -0
- package/dist/tui/components/AuditBoard.js +50 -0
- package/dist/tui/components/AuditBoard.js.map +1 -0
- package/dist/tui/components/ChatInput.d.ts +14 -0
- package/dist/tui/components/ChatInput.d.ts.map +1 -0
- package/dist/tui/components/ChatInput.js +46 -0
- package/dist/tui/components/ChatInput.js.map +1 -0
- package/dist/tui/components/ChatLog.d.ts +12 -0
- package/dist/tui/components/ChatLog.d.ts.map +1 -0
- package/dist/tui/components/ChatLog.js +47 -0
- package/dist/tui/components/ChatLog.js.map +1 -0
- package/dist/tui/components/CommandPalette.d.ts +6 -0
- package/dist/tui/components/CommandPalette.d.ts.map +1 -0
- package/dist/tui/components/CommandPalette.js +14 -0
- package/dist/tui/components/CommandPalette.js.map +1 -0
- package/dist/tui/components/ContextBar.d.ts +9 -0
- package/dist/tui/components/ContextBar.d.ts.map +1 -0
- package/dist/tui/components/ContextBar.js +18 -0
- package/dist/tui/components/ContextBar.js.map +1 -0
- package/dist/tui/components/DataTable.d.ts +6 -0
- package/dist/tui/components/DataTable.d.ts.map +1 -0
- package/dist/tui/components/DataTable.js +13 -0
- package/dist/tui/components/DataTable.js.map +1 -0
- package/dist/tui/components/HelpBar.d.ts +2 -0
- package/dist/tui/components/HelpBar.d.ts.map +1 -0
- package/dist/tui/components/HelpBar.js +8 -0
- package/dist/tui/components/HelpBar.js.map +1 -0
- package/dist/tui/components/LiveLog.d.ts +6 -0
- package/dist/tui/components/LiveLog.d.ts.map +1 -0
- package/dist/tui/components/LiveLog.js +10 -0
- package/dist/tui/components/LiveLog.js.map +1 -0
- package/dist/tui/components/LogLine.d.ts +4 -0
- package/dist/tui/components/LogLine.d.ts.map +1 -0
- package/dist/tui/components/LogLine.js +8 -0
- package/dist/tui/components/LogLine.js.map +1 -0
- package/dist/tui/components/SelectList.d.ts +6 -0
- package/dist/tui/components/SelectList.d.ts.map +1 -0
- package/dist/tui/components/SelectList.js +15 -0
- package/dist/tui/components/SelectList.js.map +1 -0
- package/dist/tui/components/StageTimeline.d.ts +7 -0
- package/dist/tui/components/StageTimeline.d.ts.map +1 -0
- package/dist/tui/components/StageTimeline.js +18 -0
- package/dist/tui/components/StageTimeline.js.map +1 -0
- package/dist/tui/components/StatusBar.d.ts +7 -0
- package/dist/tui/components/StatusBar.d.ts.map +1 -0
- package/dist/tui/components/StatusBar.js +8 -0
- package/dist/tui/components/StatusBar.js.map +1 -0
- package/dist/tui/components/SubagentTree.d.ts +10 -0
- package/dist/tui/components/SubagentTree.d.ts.map +1 -0
- package/dist/tui/components/SubagentTree.js +12 -0
- package/dist/tui/components/SubagentTree.js.map +1 -0
- package/dist/tui/components/TabBar.d.ts +5 -0
- package/dist/tui/components/TabBar.d.ts.map +1 -0
- package/dist/tui/components/TabBar.js +9 -0
- package/dist/tui/components/TabBar.js.map +1 -0
- package/dist/tui/components/WorkingIndicator.d.ts +6 -0
- package/dist/tui/components/WorkingIndicator.d.ts.map +1 -0
- package/dist/tui/components/WorkingIndicator.js +20 -0
- package/dist/tui/components/WorkingIndicator.js.map +1 -0
- package/dist/tui/hooks/useMonitor.d.ts +8 -0
- package/dist/tui/hooks/useMonitor.d.ts.map +1 -0
- package/dist/tui/hooks/useMonitor.js +42 -0
- package/dist/tui/hooks/useMonitor.js.map +1 -0
- package/dist/tui/hooks/usePipelineEvents.d.ts +6 -0
- package/dist/tui/hooks/usePipelineEvents.d.ts.map +1 -0
- package/dist/tui/hooks/usePipelineEvents.js +21 -0
- package/dist/tui/hooks/usePipelineEvents.js.map +1 -0
- package/dist/tui/hooks/useTerminalSize.d.ts +6 -0
- package/dist/tui/hooks/useTerminalSize.d.ts.map +1 -0
- package/dist/tui/hooks/useTerminalSize.js +26 -0
- package/dist/tui/hooks/useTerminalSize.js.map +1 -0
- package/dist/tui/index.d.ts +22 -0
- package/dist/tui/index.d.ts.map +1 -0
- package/dist/tui/index.js +18 -0
- package/dist/tui/index.js.map +1 -0
- package/dist/tui/inputDebug.d.ts +20 -0
- package/dist/tui/inputDebug.d.ts.map +1 -0
- package/dist/tui/inputDebug.js +42 -0
- package/dist/tui/inputDebug.js.map +1 -0
- package/dist/tui/loadingMessages.d.ts +11 -0
- package/dist/tui/loadingMessages.d.ts.map +1 -0
- package/dist/tui/loadingMessages.js +39 -0
- package/dist/tui/loadingMessages.js.map +1 -0
- package/dist/tui/logFormat.d.ts +10 -0
- package/dist/tui/logFormat.d.ts.map +1 -0
- package/dist/tui/logFormat.js +86 -0
- package/dist/tui/logFormat.js.map +1 -0
- package/dist/tui/markdown.d.ts +3 -0
- package/dist/tui/markdown.d.ts.map +1 -0
- package/dist/tui/markdown.js +33 -0
- package/dist/tui/markdown.js.map +1 -0
- package/dist/tui/monitorApi.d.ts +6 -0
- package/dist/tui/monitorApi.d.ts.map +1 -0
- package/dist/tui/monitorApi.js +35 -0
- package/dist/tui/monitorApi.js.map +1 -0
- package/dist/tui/monitorRows.d.ts +43 -0
- package/dist/tui/monitorRows.d.ts.map +1 -0
- package/dist/tui/monitorRows.js +65 -0
- package/dist/tui/monitorRows.js.map +1 -0
- package/dist/tui/panels/ChatPanel.d.ts +16 -0
- package/dist/tui/panels/ChatPanel.d.ts.map +1 -0
- package/dist/tui/panels/ChatPanel.js +305 -0
- package/dist/tui/panels/ChatPanel.js.map +1 -0
- package/dist/tui/panels/LogsPanel.d.ts +8 -0
- package/dist/tui/panels/LogsPanel.d.ts.map +1 -0
- package/dist/tui/panels/LogsPanel.js +19 -0
- package/dist/tui/panels/LogsPanel.js.map +1 -0
- package/dist/tui/panels/MonitorPanel.d.ts +8 -0
- package/dist/tui/panels/MonitorPanel.d.ts.map +1 -0
- package/dist/tui/panels/MonitorPanel.js +19 -0
- package/dist/tui/panels/MonitorPanel.js.map +1 -0
- package/dist/tui/panels/PipelinePanel.d.ts +6 -0
- package/dist/tui/panels/PipelinePanel.d.ts.map +1 -0
- package/dist/tui/panels/PipelinePanel.js +22 -0
- package/dist/tui/panels/PipelinePanel.js.map +1 -0
- package/dist/tui/pipelineEvents.d.ts +21 -0
- package/dist/tui/pipelineEvents.d.ts.map +1 -0
- package/dist/tui/pipelineEvents.js +30 -0
- package/dist/tui/pipelineEvents.js.map +1 -0
- package/dist/tui/sse.d.ts +24 -0
- package/dist/tui/sse.d.ts.map +1 -0
- package/dist/tui/sse.js +78 -0
- package/dist/tui/sse.js.map +1 -0
- package/dist/tui/subagentTree.d.ts +10 -0
- package/dist/tui/subagentTree.d.ts.map +1 -0
- package/dist/tui/subagentTree.js +30 -0
- package/dist/tui/subagentTree.js.map +1 -0
- package/dist/tui/tabs.d.ts +10 -0
- package/dist/tui/tabs.d.ts.map +1 -0
- package/dist/tui/tabs.js +26 -0
- package/dist/tui/tabs.js.map +1 -0
- package/dist/tui/theme.d.ts +29 -0
- package/dist/tui/theme.d.ts.map +1 -0
- package/dist/tui/theme.js +34 -0
- package/dist/tui/theme.js.map +1 -0
- package/package.json +13 -3
|
@@ -0,0 +1,283 @@
|
|
|
1
|
+
// ============================================
|
|
2
|
+
// OpenSwarm - `openswarm review --max` codebase audit (INT-2006)
|
|
3
|
+
// ============================================
|
|
4
|
+
//
|
|
5
|
+
// Full-codebase, multi-agent audit. Partition the tracked source into
|
|
6
|
+
// directory-shaped "areas", fan a reviewer subagent out over each area with a
|
|
7
|
+
// concurrency cap, then aggregate the verdicts. The pure pieces (filter /
|
|
8
|
+
// partition / aggregate) are unit-tested; the orchestration shell wires
|
|
9
|
+
// git + runReviewer + the live board + Linear.
|
|
10
|
+
import { execFileSync } from 'node:child_process';
|
|
11
|
+
import { dirname } from 'node:path';
|
|
12
|
+
import { runPool } from '../support/concurrencyPool.js';
|
|
13
|
+
import { RateLimitError } from '../adapters/rateLimitError.js';
|
|
14
|
+
// Source extensions and test patterns mirror src/knowledge/scanner.ts. Kept
|
|
15
|
+
// local (not imported) because those are unexported module consts; the audit
|
|
16
|
+
// only needs the stable subset and drift here is low-risk.
|
|
17
|
+
const SOURCE_EXTENSIONS = new Set(['.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs', '.py', '.pyw']);
|
|
18
|
+
const TEST_PATTERNS = [/\.test\.[tj]sx?$/, /\.spec\.[tj]sx?$/, /_test\.py$/, /test_.*\.py$/, /\.test\.py$/];
|
|
19
|
+
// Belt-and-suspenders: git ls-files already honors .gitignore, but tracked
|
|
20
|
+
// junk dirs (snapshots, coverage) shouldn't be audited as if they were source.
|
|
21
|
+
const SKIP_DIR_SEGMENTS = new Set(['node_modules', 'dist', 'build', 'trash', '.openswarm', 'htmlcov', 'coverage', 'vendor']);
|
|
22
|
+
/** Drop non-source, test, and junk-dir files. Pure. */
|
|
23
|
+
export function filterSourceFiles(files) {
|
|
24
|
+
return files.filter((f) => {
|
|
25
|
+
const ext = f.slice(f.lastIndexOf('.'));
|
|
26
|
+
if (!SOURCE_EXTENSIONS.has(ext))
|
|
27
|
+
return false;
|
|
28
|
+
if (TEST_PATTERNS.some((re) => re.test(f)))
|
|
29
|
+
return false;
|
|
30
|
+
if (f.split('/').some((seg) => SKIP_DIR_SEGMENTS.has(seg)))
|
|
31
|
+
return false;
|
|
32
|
+
return true;
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Prefer a conventional production-source root: if any `src/` files exist, audit
|
|
37
|
+
* only those (drops benchmarks/scripts/config at the repo root); otherwise fall
|
|
38
|
+
* back to the full source set. Pure. (extend the prefix list if a repo uses
|
|
39
|
+
* lib/ or packages/ instead.)
|
|
40
|
+
*/
|
|
41
|
+
export function preferSrcRoot(files) {
|
|
42
|
+
const src = files.filter((f) => f.startsWith('src/'));
|
|
43
|
+
return src.length ? src : files;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* List the repo's tracked source files via `git ls-files` (honors .gitignore),
|
|
47
|
+
* keep production source, and prefer the src/ root. Throws if `cwd` isn't a git
|
|
48
|
+
* repo.
|
|
49
|
+
*/
|
|
50
|
+
export function listSourceFiles(cwd) {
|
|
51
|
+
const out = execFileSync('git', ['ls-files'], { cwd, encoding: 'utf8', maxBuffer: 64 * 1024 * 1024 });
|
|
52
|
+
const all = filterSourceFiles(out.split('\n').map((l) => l.trim()).filter(Boolean));
|
|
53
|
+
return preferSrcRoot(all);
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Partition source files into areas. Each directory becomes one area; a
|
|
57
|
+
* directory with more than `maxFilesPerArea` files is split into numbered
|
|
58
|
+
* chunks so a single reviewer subagent never gets an unreadable pile. Pure and
|
|
59
|
+
* deterministic (dirs and files sorted). (INT-2006)
|
|
60
|
+
*/
|
|
61
|
+
export function partitionIntoAreas(files, maxFilesPerArea = 12) {
|
|
62
|
+
const byDir = new Map();
|
|
63
|
+
for (const f of files) {
|
|
64
|
+
const dir = dirname(f);
|
|
65
|
+
(byDir.get(dir) ?? byDir.set(dir, []).get(dir)).push(f);
|
|
66
|
+
}
|
|
67
|
+
const areas = [];
|
|
68
|
+
for (const dir of [...byDir.keys()].sort()) {
|
|
69
|
+
const dirFiles = byDir.get(dir).sort();
|
|
70
|
+
if (dirFiles.length <= maxFilesPerArea) {
|
|
71
|
+
areas.push({ label: dir, dir, files: dirFiles });
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
// Split oversized directories into evenly numbered chunks.
|
|
75
|
+
const chunks = Math.ceil(dirFiles.length / maxFilesPerArea);
|
|
76
|
+
for (let i = 0; i < chunks; i++) {
|
|
77
|
+
const slice = dirFiles.slice(i * maxFilesPerArea, (i + 1) * maxFilesPerArea);
|
|
78
|
+
areas.push({ label: `${dir} (${i + 1}/${chunks})`, dir, files: slice });
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
return areas;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Roll N per-area results into one verdict + merged issues/actions. The worst
|
|
85
|
+
* decision wins (reject > revise > approve); errored areas are counted but don't
|
|
86
|
+
* affect the decision (a crashed subagent shouldn't silently "approve"). Pure.
|
|
87
|
+
*/
|
|
88
|
+
export function aggregateAuditResults(results) {
|
|
89
|
+
const areas = [];
|
|
90
|
+
const issues = [];
|
|
91
|
+
const recommendedActions = [];
|
|
92
|
+
let worst = 'approve';
|
|
93
|
+
let completed = 0;
|
|
94
|
+
let failed = 0;
|
|
95
|
+
// Cross-area dedup: a fan-out reviewer often flags a shared file it imported,
|
|
96
|
+
// so the same finding shows up under several areas. Keep the first. (INT-2022)
|
|
97
|
+
const seen = new Set();
|
|
98
|
+
const rank = (d) => (d === 'reject' ? 2 : d === 'revise' ? 1 : 0);
|
|
99
|
+
// True when a follow-up's location points at a file this area actually owns.
|
|
100
|
+
// Reviewers may read imports to understand them, but a finding outside the area
|
|
101
|
+
// is audited by its own area — dropping it here removes the fan-out duplicate. (INT-2022)
|
|
102
|
+
const inArea = (location, area) => {
|
|
103
|
+
if (!location)
|
|
104
|
+
return true; // area-level note, keep
|
|
105
|
+
const path = location.split(':')[0].trim();
|
|
106
|
+
return area.files.includes(path) || path === area.dir || path.startsWith(area.dir + '/');
|
|
107
|
+
};
|
|
108
|
+
for (const { area, review, error } of results) {
|
|
109
|
+
if (error || !review) {
|
|
110
|
+
failed++;
|
|
111
|
+
areas.push({ label: area.label, decision: 'error', issueCount: 0, actionCount: 0 });
|
|
112
|
+
continue;
|
|
113
|
+
}
|
|
114
|
+
completed++;
|
|
115
|
+
if (rank(review.decision) > rank(worst))
|
|
116
|
+
worst = review.decision;
|
|
117
|
+
const reviewIssues = review.issues ?? [];
|
|
118
|
+
reviewIssues.forEach((i) => issues.push(`[${area.label}] ${i}`));
|
|
119
|
+
let kept = 0;
|
|
120
|
+
for (const a of review.recommendedActions ?? []) {
|
|
121
|
+
// (B) area isolation — drop findings outside this area (audited elsewhere).
|
|
122
|
+
if (!inArea(a.location, area))
|
|
123
|
+
continue;
|
|
124
|
+
// (A) dedup by type + file:line across all areas.
|
|
125
|
+
const key = `${a.type}|${a.location ?? a.title}`;
|
|
126
|
+
if (seen.has(key))
|
|
127
|
+
continue;
|
|
128
|
+
seen.add(key);
|
|
129
|
+
recommendedActions.push({
|
|
130
|
+
...a,
|
|
131
|
+
// Fold the area into the location so the merged list stays traceable.
|
|
132
|
+
location: a.location ? `${area.label}: ${a.location}` : area.label,
|
|
133
|
+
});
|
|
134
|
+
kept++;
|
|
135
|
+
}
|
|
136
|
+
areas.push({
|
|
137
|
+
label: area.label,
|
|
138
|
+
decision: review.decision,
|
|
139
|
+
issueCount: reviewIssues.length,
|
|
140
|
+
actionCount: kept,
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
return { decision: worst, totalAreas: results.length, completed, failed, areas, issues, recommendedActions };
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Render the audit as a persistable markdown report. Pure — timestamp is injected
|
|
147
|
+
* (no Date.now() inside) so it's deterministic and testable. (INT-2022)
|
|
148
|
+
*/
|
|
149
|
+
export function formatAuditReport(summary, repoName, timestamp) {
|
|
150
|
+
const mark = (d) => d === 'approve' ? '✓' : d === 'revise' ? '✎' : d === 'reject' ? '✗' : '⚠';
|
|
151
|
+
const approved = summary.areas.filter((a) => a.decision === 'approve').length;
|
|
152
|
+
const revised = summary.areas.filter((a) => a.decision === 'revise').length;
|
|
153
|
+
const rejected = summary.areas.filter((a) => a.decision === 'reject').length;
|
|
154
|
+
const lines = [];
|
|
155
|
+
lines.push(`# Codebase audit — ${repoName}`);
|
|
156
|
+
lines.push('');
|
|
157
|
+
lines.push(`\`openswarm review --max\` · ${timestamp}`);
|
|
158
|
+
lines.push('');
|
|
159
|
+
lines.push(`**${summary.totalAreas} area(s)** — ${summary.completed} reviewed, ${summary.failed} failed · ` +
|
|
160
|
+
`${approved} ✓ / ${revised} ✎ / ${rejected} ✗ · **Verdict: ${summary.decision.toUpperCase()}**`);
|
|
161
|
+
lines.push('');
|
|
162
|
+
const failedAreas = summary.areas.filter((a) => a.decision === 'error');
|
|
163
|
+
if (failedAreas.length) {
|
|
164
|
+
lines.push(`## ⚠ Reviewer failures (${failedAreas.length})`);
|
|
165
|
+
lines.push('These areas were NOT audited (subagent error). Re-run to cover them.');
|
|
166
|
+
failedAreas.forEach((a) => lines.push(`- ${a.label}`));
|
|
167
|
+
lines.push('');
|
|
168
|
+
}
|
|
169
|
+
lines.push('## Areas');
|
|
170
|
+
lines.push('| area | verdict | issues | follow-ups |');
|
|
171
|
+
lines.push('|---|---|---|---|');
|
|
172
|
+
summary.areas.forEach((a) => lines.push(`| ${a.label} | ${mark(a.decision)} | ${a.issueCount} | ${a.actionCount} |`));
|
|
173
|
+
lines.push('');
|
|
174
|
+
if (summary.recommendedActions.length) {
|
|
175
|
+
lines.push(`## Recommended follow-ups (${summary.recommendedActions.length}, deduped)`);
|
|
176
|
+
const byType = new Map();
|
|
177
|
+
for (const a of summary.recommendedActions) {
|
|
178
|
+
(byType.get(a.type) ?? byType.set(a.type, []).get(a.type)).push(a);
|
|
179
|
+
}
|
|
180
|
+
for (const [type, actions] of [...byType.entries()].sort((x, y) => y[1].length - x[1].length)) {
|
|
181
|
+
lines.push('');
|
|
182
|
+
lines.push(`### ${type} (${actions.length})`);
|
|
183
|
+
actions.forEach((a) => lines.push(`- ${a.title}${a.location ? ` — \`${a.location}\`` : ''}`));
|
|
184
|
+
}
|
|
185
|
+
lines.push('');
|
|
186
|
+
}
|
|
187
|
+
if (summary.issues.length) {
|
|
188
|
+
lines.push(`## Issues (${summary.issues.length})`);
|
|
189
|
+
summary.issues.forEach((i) => lines.push(`- ${i}`));
|
|
190
|
+
}
|
|
191
|
+
return lines.join('\n');
|
|
192
|
+
}
|
|
193
|
+
/** Render the aggregate audit verdict for the terminal. Pure. */
|
|
194
|
+
export function formatAuditSummary(summary) {
|
|
195
|
+
const mark = (d) => d === 'approve' ? '✓' : d === 'revise' ? '✎' : d === 'reject' ? '✗' : '⚠';
|
|
196
|
+
const lines = [];
|
|
197
|
+
const approved = summary.areas.filter((a) => a.decision === 'approve').length;
|
|
198
|
+
const revised = summary.areas.filter((a) => a.decision === 'revise').length;
|
|
199
|
+
const rejected = summary.areas.filter((a) => a.decision === 'reject').length;
|
|
200
|
+
lines.push(`Codebase audit — ${summary.totalAreas} area(s): ${approved} ✓, ${revised} ✎ revise, ${rejected} ✗ reject` +
|
|
201
|
+
(summary.failed ? ` [${summary.failed} failed]` : ''));
|
|
202
|
+
lines.push(`Verdict: ${summary.decision.toUpperCase()}`);
|
|
203
|
+
lines.push('');
|
|
204
|
+
for (const a of summary.areas) {
|
|
205
|
+
const counts = a.decision === 'error' ? '(subagent failed)' : `${a.issueCount} issue(s), ${a.actionCount} follow-up(s)`;
|
|
206
|
+
lines.push(` ${mark(a.decision)} ${a.label} ${counts}`);
|
|
207
|
+
}
|
|
208
|
+
if (summary.issues.length) {
|
|
209
|
+
lines.push('', `Issues (${summary.issues.length}):`);
|
|
210
|
+
summary.issues.forEach((i) => lines.push(` - ${i}`));
|
|
211
|
+
}
|
|
212
|
+
if (summary.recommendedActions.length) {
|
|
213
|
+
lines.push('', `Recommended follow-ups (${summary.recommendedActions.length}):`);
|
|
214
|
+
summary.recommendedActions.forEach((a) => lines.push(` - [${a.type}] ${a.title}${a.location ? ` (${a.location})` : ''}`));
|
|
215
|
+
}
|
|
216
|
+
return lines.join('\n');
|
|
217
|
+
}
|
|
218
|
+
/** Default area reviewer: spawn an independent reviewer subagent over the area's files. */
|
|
219
|
+
async function defaultReviewArea(area, cwd, opts, onLog) {
|
|
220
|
+
const { runReviewer } = await import('../agents/reviewer.js');
|
|
221
|
+
const { buildReviewWorkerResult } = await import('./reviewCommand.js');
|
|
222
|
+
return runReviewer({
|
|
223
|
+
mode: 'audit',
|
|
224
|
+
taskTitle: `Codebase audit: ${area.label}`,
|
|
225
|
+
taskDescription: `Audit the ${area.files.length} existing source file(s) under ${area.label} for correctness bugs, ` +
|
|
226
|
+
`security issues, resource leaks, and quality problems.`,
|
|
227
|
+
workerResult: buildReviewWorkerResult(area.files, `Codebase audit of ${area.label}`),
|
|
228
|
+
projectPath: cwd,
|
|
229
|
+
adapterName: opts.adapter,
|
|
230
|
+
signal: opts.signal,
|
|
231
|
+
onLog,
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* Fan a reviewer subagent out over each area with a concurrency cap, then
|
|
236
|
+
* aggregate. Areas are partitioned by the caller (so the board can show them
|
|
237
|
+
* up-front and the cost gate can count them). Never throws on a single area
|
|
238
|
+
* failure — that area lands as an error in the summary. (INT-2006)
|
|
239
|
+
*/
|
|
240
|
+
export async function runMaxReview(areas, cwd, opts, deps = {}) {
|
|
241
|
+
const review = deps.review ?? ((area, onLog) => defaultReviewArea(area, cwd, opts, onLog));
|
|
242
|
+
const total = areas.length;
|
|
243
|
+
let done = 0;
|
|
244
|
+
// Once a codex usage-limit hits, stop launching new area reviews — they'd all
|
|
245
|
+
// fail against the same exhausted quota (the STONKS "5/16 → end" wipeout). Keep
|
|
246
|
+
// the typed error so the caller can report the reset time. (INT-2192)
|
|
247
|
+
let rateLimit = null;
|
|
248
|
+
const settled = await runPool(areas, opts.concurrency, async (area) => {
|
|
249
|
+
if (rateLimit)
|
|
250
|
+
throw new Error('skipped: codex usage limit already hit this run');
|
|
251
|
+
deps.onProgress?.({ type: 'start', label: area.label, done, total });
|
|
252
|
+
try {
|
|
253
|
+
return await review(area, (line) => deps.onProgress?.({ type: 'log', label: area.label, line }));
|
|
254
|
+
}
|
|
255
|
+
catch (e) {
|
|
256
|
+
if (e instanceof RateLimitError)
|
|
257
|
+
rateLimit = e;
|
|
258
|
+
throw e;
|
|
259
|
+
}
|
|
260
|
+
}, (s) => {
|
|
261
|
+
done++;
|
|
262
|
+
const area = areas[s.index];
|
|
263
|
+
if (s.error) {
|
|
264
|
+
deps.onProgress?.({ type: 'error', label: area.label, error: String(s.error), done, total });
|
|
265
|
+
}
|
|
266
|
+
else if (s.value) {
|
|
267
|
+
deps.onProgress?.({ type: 'done', label: area.label, decision: s.value.decision, done, total });
|
|
268
|
+
}
|
|
269
|
+
});
|
|
270
|
+
const results = settled.map((s, i) => s.error || !s.value ? { area: areas[i], error: s.error ? String(s.error) : 'no result' } : { area: areas[i], review: s.value });
|
|
271
|
+
return { summary: aggregateAuditResults(results), results, rateLimit: rateLimit ?? undefined };
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* Merge a fallback run (a retry of the primary run's failed/skipped areas on a
|
|
275
|
+
* different adapter) back over the primary results, then re-aggregate. The
|
|
276
|
+
* fallback's own rateLimit (e.g. claude also exhausted) carries forward. (INT-2192)
|
|
277
|
+
*/
|
|
278
|
+
export function mergeFallback(primary, fallback) {
|
|
279
|
+
const fb = new Map(fallback.results.map((r) => [r.area.label, r]));
|
|
280
|
+
const results = primary.results.map((r) => (r.error && fb.has(r.area.label) ? fb.get(r.area.label) : r));
|
|
281
|
+
return { summary: aggregateAuditResults(results), results, rateLimit: fallback.rateLimit };
|
|
282
|
+
}
|
|
283
|
+
//# sourceMappingURL=reviewAudit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reviewAudit.js","sourceRoot":"","sources":["../../src/cli/reviewAudit.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import type { ReviewResult, WorkerResult } from '../agents/agentPair.js';
|
|
2
|
+
import type { ITaskSource } from '../automation/taskSource.js';
|
|
3
|
+
/** Synthesize a WorkerResult describing the working-tree changes for the reviewer. */
|
|
4
|
+
export declare function buildReviewWorkerResult(changedFiles: string[], summary?: string): WorkerResult;
|
|
5
|
+
/**
|
|
6
|
+
* Render a review verdict for the terminal. `color` adds ANSI styling (decision
|
|
7
|
+
* green/yellow/red, bold section headers, dim locations); off → plain text. (INT-1966)
|
|
8
|
+
*/
|
|
9
|
+
export declare function formatReviewOutput(review: ReviewResult, color?: boolean): string;
|
|
10
|
+
/**
|
|
11
|
+
* Extract a Linear-style issue id (e.g. INT-1705) from a git branch name so the
|
|
12
|
+
* user can run `--issues` without typing the id. Returns undefined if none. (INT-1967)
|
|
13
|
+
*/
|
|
14
|
+
export declare function resolveIssueFromBranch(branch: string): string | undefined;
|
|
15
|
+
/** Best-effort Linear project id from <repo>/openswarm.json, so standalone follow-ups land in the right project. (INT-1968) */
|
|
16
|
+
export declare function resolveProjectId(cwd: string): Promise<string | undefined>;
|
|
17
|
+
/**
|
|
18
|
+
* A Linear-backed task source for the standalone `review` CLI. The daemon
|
|
19
|
+
* registers one at startup, but a bare `openswarm review` does not — so init
|
|
20
|
+
* Linear from config (OAuth profile or apiKey) and build a LinearTaskSource.
|
|
21
|
+
* Returns null when Linear isn't configured. (INT-1969)
|
|
22
|
+
*/
|
|
23
|
+
export declare function ensureTaskSource(): Promise<ITaskSource | null>;
|
|
24
|
+
export interface ReviewCommandOptions {
|
|
25
|
+
/** Project path (default cwd). */
|
|
26
|
+
path?: string;
|
|
27
|
+
/**
|
|
28
|
+
* File recommendedActions as Linear sub-issues. A string is the explicit parent
|
|
29
|
+
* id; `true` (bare `--issues`) infers the parent from the git branch. (INT-1967)
|
|
30
|
+
*/
|
|
31
|
+
fileIssue?: string | boolean;
|
|
32
|
+
/** Adapter override. */
|
|
33
|
+
adapter?: string;
|
|
34
|
+
/** Verbose logging. */
|
|
35
|
+
debug?: boolean;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Run the review flow. Injectable deps keep it testable without git/network.
|
|
39
|
+
*/
|
|
40
|
+
export declare function runReviewCommand(opts?: ReviewCommandOptions, deps?: {
|
|
41
|
+
getChangedFiles?: (cwd: string) => Promise<string[]>;
|
|
42
|
+
review?: (wr: WorkerResult, cwd: string, onLog?: (line: string) => void) => Promise<ReviewResult>;
|
|
43
|
+
fileFollowups?: (parentIssueId: string | undefined, review: ReviewResult) => Promise<number>;
|
|
44
|
+
log?: (line: string) => void;
|
|
45
|
+
/** Override the progress indicator (default: TTY-gated spinner). Tests pass a stub. */
|
|
46
|
+
startProgress?: () => {
|
|
47
|
+
note: (line: string) => void;
|
|
48
|
+
stop: () => void;
|
|
49
|
+
} | null;
|
|
50
|
+
/** Current git branch (default: `git rev-parse --abbrev-ref HEAD`). For --issues inference. */
|
|
51
|
+
getBranch?: (cwd: string) => Promise<string>;
|
|
52
|
+
}): Promise<ReviewResult | null>;
|
|
53
|
+
//# sourceMappingURL=reviewCommand.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reviewCommand.d.ts","sourceRoot":"","sources":["../../src/cli/reviewCommand.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAG/D,sFAAsF;AACtF,wBAAgB,uBAAuB,CAAC,YAAY,EAAE,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,YAAY,CAQ9F;AAcD;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,YAAY,EAAE,KAAK,UAAQ,GAAG,MAAM,CA2B9E;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAGzE;AAED,+HAA+H;AAC/H,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAQ/E;AAED;;;;;GAKG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CA0BpE;AAED,MAAM,WAAW,oBAAoB;IACnC,kCAAkC;IAClC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAC7B,wBAAwB;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,uBAAuB;IACvB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,IAAI,GAAE,oBAAyB,EAC/B,IAAI,GAAE;IACJ,eAAe,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACrD,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,KAAK,OAAO,CAAC,YAAY,CAAC,CAAC;IAClG,aAAa,CAAC,EAAE,CAAC,aAAa,EAAE,MAAM,GAAG,SAAS,EAAE,MAAM,EAAE,YAAY,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAC7F,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7B,uFAAuF;IACvF,aAAa,CAAC,EAAE,MAAM;QAAE,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;QAAC,IAAI,EAAE,MAAM,IAAI,CAAA;KAAE,GAAG,IAAI,CAAC;IAChF,+FAA+F;IAC/F,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;CACzC,GACL,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CA6F9B"}
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
// ============================================
|
|
2
|
+
// OpenSwarm - `openswarm review` (INT-1955)
|
|
3
|
+
// ============================================
|
|
4
|
+
//
|
|
5
|
+
// Run the reviewer over the working-tree changes from the CLI, print the
|
|
6
|
+
// verdict, and (optionally) file its recommendedActions as Linear sub-issues
|
|
7
|
+
// under a parent issue — reusing fileReviewerFollowups (INT-1704/INT-1954).
|
|
8
|
+
// The formatter and synthetic-WorkerResult builder are pure (unit-tested); the
|
|
9
|
+
// command shell wires git + reviewer + Linear.
|
|
10
|
+
import { startReviewProgress } from './reviewProgress.js';
|
|
11
|
+
/** Synthesize a WorkerResult describing the working-tree changes for the reviewer. */
|
|
12
|
+
export function buildReviewWorkerResult(changedFiles, summary) {
|
|
13
|
+
return {
|
|
14
|
+
success: true,
|
|
15
|
+
summary: summary ?? `Working-tree review of ${changedFiles.length} changed file(s)`,
|
|
16
|
+
filesChanged: changedFiles,
|
|
17
|
+
commands: [],
|
|
18
|
+
output: '',
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
// Minimal ANSI helpers — no extra dep. Wrappers only, so plain substrings
|
|
22
|
+
// (e.g. 'Decision: APPROVE') survive for tests/grep. (INT-1966)
|
|
23
|
+
const ANSI = {
|
|
24
|
+
reset: '\x1b[0m',
|
|
25
|
+
bold: '\x1b[1m',
|
|
26
|
+
dim: '\x1b[2m',
|
|
27
|
+
green: '\x1b[32m',
|
|
28
|
+
yellow: '\x1b[33m',
|
|
29
|
+
red: '\x1b[31m',
|
|
30
|
+
cyan: '\x1b[36m',
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* Render a review verdict for the terminal. `color` adds ANSI styling (decision
|
|
34
|
+
* green/yellow/red, bold section headers, dim locations); off → plain text. (INT-1966)
|
|
35
|
+
*/
|
|
36
|
+
export function formatReviewOutput(review, color = false) {
|
|
37
|
+
const c = (code, s) => (color ? `${code}${s}${ANSI.reset}` : s);
|
|
38
|
+
const header = (s) => c(ANSI.bold, s);
|
|
39
|
+
const decisionColor = review.decision === 'approve' ? ANSI.green : review.decision === 'reject' ? ANSI.red : ANSI.yellow;
|
|
40
|
+
const lines = [];
|
|
41
|
+
const mark = review.decision === 'approve' ? '✓' : review.decision === 'reject' ? '✗' : '✎';
|
|
42
|
+
lines.push(c(decisionColor, `${c(ANSI.bold, mark)} Decision: ${review.decision.toUpperCase()}`));
|
|
43
|
+
if (review.feedback)
|
|
44
|
+
lines.push(` ${review.feedback}`);
|
|
45
|
+
if (review.issues?.length) {
|
|
46
|
+
lines.push(` ${header('Issues:')}`);
|
|
47
|
+
review.issues.forEach((i) => lines.push(` ${c(ANSI.red, '-')} ${i}`));
|
|
48
|
+
}
|
|
49
|
+
if (review.suggestions?.length) {
|
|
50
|
+
lines.push(` ${header('Suggestions:')}`);
|
|
51
|
+
review.suggestions.forEach((s) => lines.push(` ${c(ANSI.cyan, '-')} ${s}`));
|
|
52
|
+
}
|
|
53
|
+
if (review.recommendedActions?.length) {
|
|
54
|
+
lines.push(` ${header('Recommended follow-ups:')}`);
|
|
55
|
+
review.recommendedActions.forEach((a) => lines.push(` - ${c(ANSI.cyan, `[${a.type}]`)} ${a.title}${a.location ? ` ${c(ANSI.dim, `(${a.location})`)}` : ''}`));
|
|
56
|
+
}
|
|
57
|
+
return lines.join('\n');
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Extract a Linear-style issue id (e.g. INT-1705) from a git branch name so the
|
|
61
|
+
* user can run `--issues` without typing the id. Returns undefined if none. (INT-1967)
|
|
62
|
+
*/
|
|
63
|
+
export function resolveIssueFromBranch(branch) {
|
|
64
|
+
const m = branch.match(/([a-z]{2,}-\d+)/i);
|
|
65
|
+
return m ? m[1].toUpperCase() : undefined;
|
|
66
|
+
}
|
|
67
|
+
/** Best-effort Linear project id from <repo>/openswarm.json, so standalone follow-ups land in the right project. (INT-1968) */
|
|
68
|
+
export async function resolveProjectId(cwd) {
|
|
69
|
+
try {
|
|
70
|
+
const { loadRepoMetadata } = await import('../support/repoMetadata.js');
|
|
71
|
+
const meta = await loadRepoMetadata(cwd);
|
|
72
|
+
return meta?.linear?.projectId;
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
return undefined;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* A Linear-backed task source for the standalone `review` CLI. The daemon
|
|
80
|
+
* registers one at startup, but a bare `openswarm review` does not — so init
|
|
81
|
+
* Linear from config (OAuth profile or apiKey) and build a LinearTaskSource.
|
|
82
|
+
* Returns null when Linear isn't configured. (INT-1969)
|
|
83
|
+
*/
|
|
84
|
+
export async function ensureTaskSource() {
|
|
85
|
+
const { getTaskSource } = await import('../automation/runnerExecution.js');
|
|
86
|
+
const existing = getTaskSource();
|
|
87
|
+
if (existing)
|
|
88
|
+
return existing;
|
|
89
|
+
try {
|
|
90
|
+
const linear = await import('../linear/linear.js');
|
|
91
|
+
if (!linear.isLinearInitialized()) {
|
|
92
|
+
const { loadConfig } = await import('../core/config.js');
|
|
93
|
+
const config = loadConfig();
|
|
94
|
+
if (config.linearTeamId) {
|
|
95
|
+
const { AuthProfileStore, ensureValidToken } = await import('../auth/index.js');
|
|
96
|
+
const authStore = new AuthProfileStore();
|
|
97
|
+
if (authStore.getProfile('linear:default')) {
|
|
98
|
+
const token = await ensureValidToken(authStore, 'linear:default');
|
|
99
|
+
linear.initLinear(token, config.linearTeamId, true);
|
|
100
|
+
}
|
|
101
|
+
else if (config.linearApiKey) {
|
|
102
|
+
linear.initLinear(config.linearApiKey, config.linearTeamId);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
if (!linear.isLinearInitialized())
|
|
107
|
+
return null;
|
|
108
|
+
const { LinearTaskSource } = await import('../automation/taskSource.js');
|
|
109
|
+
return new LinearTaskSource(async () => []); // fetch unused for filing
|
|
110
|
+
}
|
|
111
|
+
catch {
|
|
112
|
+
return null;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Run the review flow. Injectable deps keep it testable without git/network.
|
|
117
|
+
*/
|
|
118
|
+
export async function runReviewCommand(opts = {}, deps = {}) {
|
|
119
|
+
const cwd = opts.path ?? process.cwd();
|
|
120
|
+
const log = deps.log ?? ((l) => console.log(l));
|
|
121
|
+
const getChangedFiles = deps.getChangedFiles ?? (async (c) => (await import('../support/gitTracker.js')).getChangedFiles(c));
|
|
122
|
+
const changed = await getChangedFiles(cwd);
|
|
123
|
+
if (!changed.length) {
|
|
124
|
+
log('No working-tree changes to review.');
|
|
125
|
+
return null;
|
|
126
|
+
}
|
|
127
|
+
if (opts.debug)
|
|
128
|
+
log(`Reviewing ${changed.length} changed file(s): ${changed.join(', ')}`);
|
|
129
|
+
const review = deps.review ??
|
|
130
|
+
(async (wr, c, onLog) => {
|
|
131
|
+
const { runReviewer } = await import('../agents/reviewer.js');
|
|
132
|
+
return runReviewer({
|
|
133
|
+
taskTitle: 'CLI working-tree review',
|
|
134
|
+
taskDescription: 'Review the current working-tree changes for correctness, bugs, and follow-ups.',
|
|
135
|
+
workerResult: wr,
|
|
136
|
+
projectPath: c,
|
|
137
|
+
adapterName: opts.adapter,
|
|
138
|
+
onLog,
|
|
139
|
+
});
|
|
140
|
+
});
|
|
141
|
+
// Live "still working" feedback so a multi-second review doesn't look frozen.
|
|
142
|
+
// On a TTY, a spinner heartbeat; otherwise each tool line is printed. (INT-1963)
|
|
143
|
+
const startProgress = deps.startProgress ?? (() => (process.stderr.isTTY ? startReviewProgress() : null));
|
|
144
|
+
const progress = startProgress();
|
|
145
|
+
const onLog = (line) => {
|
|
146
|
+
if (progress)
|
|
147
|
+
progress.note(line);
|
|
148
|
+
else
|
|
149
|
+
log(` · ${line}`);
|
|
150
|
+
};
|
|
151
|
+
let result;
|
|
152
|
+
try {
|
|
153
|
+
result = await review(buildReviewWorkerResult(changed), cwd, onLog);
|
|
154
|
+
}
|
|
155
|
+
finally {
|
|
156
|
+
progress?.stop();
|
|
157
|
+
}
|
|
158
|
+
log(formatReviewOutput(result, !!process.stdout.isTTY));
|
|
159
|
+
const followups = result.recommendedActions?.length ?? 0;
|
|
160
|
+
if (opts.fileIssue && followups) {
|
|
161
|
+
// Resolve the parent issue: explicit id, else inferred from the git branch. (INT-1967)
|
|
162
|
+
let parent = typeof opts.fileIssue === 'string' ? opts.fileIssue : undefined;
|
|
163
|
+
if (!parent) {
|
|
164
|
+
const getBranch = deps.getBranch ??
|
|
165
|
+
(async (c) => {
|
|
166
|
+
const { execFileSync } = await import('node:child_process');
|
|
167
|
+
return execFileSync('git', ['rev-parse', '--abbrev-ref', 'HEAD'], {
|
|
168
|
+
cwd: c,
|
|
169
|
+
stdio: ['ignore', 'pipe', 'ignore'],
|
|
170
|
+
})
|
|
171
|
+
.toString()
|
|
172
|
+
.trim();
|
|
173
|
+
});
|
|
174
|
+
const branch = await getBranch(cwd).catch(() => '');
|
|
175
|
+
parent = resolveIssueFromBranch(branch);
|
|
176
|
+
if (parent)
|
|
177
|
+
log(`Filing follow-ups under ${parent} (inferred from branch "${branch}").`);
|
|
178
|
+
}
|
|
179
|
+
// No parent → create top-level (standalone) issues rather than refusing. (INT-1968)
|
|
180
|
+
// Default path initializes a Linear task source itself (the daemon isn't
|
|
181
|
+
// running here), and files regardless of decision. (INT-1969)
|
|
182
|
+
const fileFollowups = deps.fileFollowups ??
|
|
183
|
+
(async (p, r) => {
|
|
184
|
+
const { fileReviewerFollowups } = await import('../automation/runnerExecution.js');
|
|
185
|
+
const source = await ensureTaskSource();
|
|
186
|
+
if (!source)
|
|
187
|
+
return 0;
|
|
188
|
+
const projectId = p ? undefined : await resolveProjectId(cwd);
|
|
189
|
+
return fileReviewerFollowups(source, p, r, { autoFile: true, projectId, requireApprove: false });
|
|
190
|
+
});
|
|
191
|
+
const filed = await fileFollowups(parent, result);
|
|
192
|
+
if (filed > 0) {
|
|
193
|
+
log(parent
|
|
194
|
+
? `Filed ${filed} follow-up sub-issue(s) under ${parent}.`
|
|
195
|
+
: `Filed ${filed} standalone follow-up issue(s) (pass \`--issues <id>\` to nest them under an issue).`);
|
|
196
|
+
}
|
|
197
|
+
else {
|
|
198
|
+
log(`Could not file follow-ups (0 created). Is Linear connected? Run \`openswarm auth login --provider linear\` (or set linearApiKey in config).`);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
else if (followups) {
|
|
202
|
+
// Suggestions were made but nothing was filed — make the flag discoverable. (INT-1966/1967)
|
|
203
|
+
log(`\n${followups} follow-up(s) suggested. Re-run with \`--issues\` to create them as Linear sub-issues (parent inferred from the branch, or pass \`--issues <id>\`).`);
|
|
204
|
+
}
|
|
205
|
+
return result;
|
|
206
|
+
}
|
|
207
|
+
//# sourceMappingURL=reviewCommand.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reviewCommand.js","sourceRoot":"","sources":["../../src/cli/reviewCommand.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
export interface ReviewMaxOptions {
|
|
2
|
+
/** Project path (default cwd). */
|
|
3
|
+
path?: string;
|
|
4
|
+
/** Max reviewer subagents in flight (default 4). */
|
|
5
|
+
concurrency?: number;
|
|
6
|
+
/** Files per area before chunking (default 12). */
|
|
7
|
+
maxFilesPerArea?: number;
|
|
8
|
+
/** Adapter override for the reviewers. */
|
|
9
|
+
adapter?: string;
|
|
10
|
+
/** PM-synthesize follow-ups into ≤10 cohesive Linear sub-issues (parent id or branch-inferred). */
|
|
11
|
+
fileIssue?: string | boolean;
|
|
12
|
+
/** Legacy: file one follow-up batch per audit area (the old --issues behavior). (INT-2225) */
|
|
13
|
+
issuesPerArea?: string | boolean;
|
|
14
|
+
/** Skip the interactive cost gate (CI / scripted). */
|
|
15
|
+
yes?: boolean;
|
|
16
|
+
/** Partition only, print the plan, and exit (no subagents spawned). */
|
|
17
|
+
dryRun?: boolean;
|
|
18
|
+
/** Report file path (default: <cwd>/.openswarm/audit/audit-<ts>.md). (INT-2022) */
|
|
19
|
+
out?: string;
|
|
20
|
+
/** Skip creating the default Linear master audit issue. (INT-2022) */
|
|
21
|
+
noLinear?: boolean;
|
|
22
|
+
/** Adapter to retry usage-limited areas on (default claude for codex primary). (INT-2192) */
|
|
23
|
+
fallbackAdapter?: string;
|
|
24
|
+
/** Disable the automatic usage-limit fallback. (INT-2192) */
|
|
25
|
+
noFallback?: boolean;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Run the full-codebase multi-agent audit. Returns the aggregate verdict (or
|
|
29
|
+
* null when there's nothing to audit / the user declined). exit code is set to 1
|
|
30
|
+
* by the caller on a reject verdict.
|
|
31
|
+
*/
|
|
32
|
+
export declare function runReviewMaxCommand(opts?: ReviewMaxOptions): Promise<{
|
|
33
|
+
decision: string;
|
|
34
|
+
} | null>;
|
|
35
|
+
//# sourceMappingURL=reviewMaxCommand.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reviewMaxCommand.d.ts","sourceRoot":"","sources":["../../src/cli/reviewMaxCommand.tsx"],"names":[],"mappings":"AA+BA,MAAM,WAAW,gBAAgB;IAC/B,kCAAkC;IAClC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,oDAAoD;IACpD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mDAAmD;IACnD,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,0CAA0C;IAC1C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,mGAAmG;IACnG,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAC7B,8FAA8F;IAC9F,aAAa,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IACjC,sDAAsD;IACtD,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,uEAAuE;IACvE,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,mFAAmF;IACnF,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,sEAAsE;IACtE,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,6FAA6F;IAC7F,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,6DAA6D;IAC7D,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAyED;;;;GAIG;AACH,wBAAsB,mBAAmB,CAAC,IAAI,GAAE,gBAAqB,GAAG,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC,CAyG3G"}
|