red64-cli 0.1.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 +454 -0
- package/dist/cli/parseArgs.d.ts +16 -0
- package/dist/cli/parseArgs.d.ts.map +1 -0
- package/dist/cli/parseArgs.js +172 -0
- package/dist/cli/parseArgs.js.map +1 -0
- package/dist/cli/validateFlags.d.ts +22 -0
- package/dist/cli/validateFlags.d.ts.map +1 -0
- package/dist/cli/validateFlags.js +24 -0
- package/dist/cli/validateFlags.js.map +1 -0
- package/dist/cli.d.ts +7 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +90 -0
- package/dist/cli.js.map +1 -0
- package/dist/components/App.d.ts +20 -0
- package/dist/components/App.d.ts.map +1 -0
- package/dist/components/App.js +35 -0
- package/dist/components/App.js.map +1 -0
- package/dist/components/CommandRouter.d.ts +21 -0
- package/dist/components/CommandRouter.d.ts.map +1 -0
- package/dist/components/CommandRouter.js +30 -0
- package/dist/components/CommandRouter.js.map +1 -0
- package/dist/components/GlobalConfig.d.ts +26 -0
- package/dist/components/GlobalConfig.d.ts.map +1 -0
- package/dist/components/GlobalConfig.js +30 -0
- package/dist/components/GlobalConfig.js.map +1 -0
- package/dist/components/index.d.ts +9 -0
- package/dist/components/index.d.ts.map +1 -0
- package/dist/components/index.js +9 -0
- package/dist/components/index.js.map +1 -0
- package/dist/components/init/CompleteStep.d.ts +11 -0
- package/dist/components/init/CompleteStep.d.ts.map +1 -0
- package/dist/components/init/CompleteStep.js +15 -0
- package/dist/components/init/CompleteStep.js.map +1 -0
- package/dist/components/init/ErrorStep.d.ts +14 -0
- package/dist/components/init/ErrorStep.d.ts.map +1 -0
- package/dist/components/init/ErrorStep.js +36 -0
- package/dist/components/init/ErrorStep.js.map +1 -0
- package/dist/components/init/FetchStep.d.ts +15 -0
- package/dist/components/init/FetchStep.d.ts.map +1 -0
- package/dist/components/init/FetchStep.js +33 -0
- package/dist/components/init/FetchStep.js.map +1 -0
- package/dist/components/init/SetupStep.d.ts +14 -0
- package/dist/components/init/SetupStep.d.ts.map +1 -0
- package/dist/components/init/SetupStep.js +78 -0
- package/dist/components/init/SetupStep.js.map +1 -0
- package/dist/components/init/SteeringStep.d.ts +12 -0
- package/dist/components/init/SteeringStep.d.ts.map +1 -0
- package/dist/components/init/SteeringStep.js +43 -0
- package/dist/components/init/SteeringStep.js.map +1 -0
- package/dist/components/init/WelcomeStep.d.ts +12 -0
- package/dist/components/init/WelcomeStep.d.ts.map +1 -0
- package/dist/components/init/WelcomeStep.js +52 -0
- package/dist/components/init/WelcomeStep.js.map +1 -0
- package/dist/components/init/index.d.ts +11 -0
- package/dist/components/init/index.d.ts.map +1 -0
- package/dist/components/init/index.js +10 -0
- package/dist/components/init/index.js.map +1 -0
- package/dist/components/init/types.d.ts +98 -0
- package/dist/components/init/types.d.ts.map +1 -0
- package/dist/components/init/types.js +6 -0
- package/dist/components/init/types.js.map +1 -0
- package/dist/components/screens/AbortScreen.d.ts +14 -0
- package/dist/components/screens/AbortScreen.d.ts.map +1 -0
- package/dist/components/screens/AbortScreen.js +181 -0
- package/dist/components/screens/AbortScreen.js.map +1 -0
- package/dist/components/screens/ApprovalScreen.d.ts +24 -0
- package/dist/components/screens/ApprovalScreen.d.ts.map +1 -0
- package/dist/components/screens/ApprovalScreen.js +82 -0
- package/dist/components/screens/ApprovalScreen.js.map +1 -0
- package/dist/components/screens/HelpScreen.d.ts +20 -0
- package/dist/components/screens/HelpScreen.d.ts.map +1 -0
- package/dist/components/screens/HelpScreen.js +70 -0
- package/dist/components/screens/HelpScreen.js.map +1 -0
- package/dist/components/screens/InitScreen.d.ts +15 -0
- package/dist/components/screens/InitScreen.d.ts.map +1 -0
- package/dist/components/screens/InitScreen.js +420 -0
- package/dist/components/screens/InitScreen.js.map +1 -0
- package/dist/components/screens/ListScreen.d.ts +14 -0
- package/dist/components/screens/ListScreen.d.ts.map +1 -0
- package/dist/components/screens/ListScreen.js +57 -0
- package/dist/components/screens/ListScreen.js.map +1 -0
- package/dist/components/screens/ProgressScreen.d.ts +26 -0
- package/dist/components/screens/ProgressScreen.d.ts.map +1 -0
- package/dist/components/screens/ProgressScreen.js +64 -0
- package/dist/components/screens/ProgressScreen.js.map +1 -0
- package/dist/components/screens/ResumeScreen.d.ts +14 -0
- package/dist/components/screens/ResumeScreen.d.ts.map +1 -0
- package/dist/components/screens/ResumeScreen.js +108 -0
- package/dist/components/screens/ResumeScreen.js.map +1 -0
- package/dist/components/screens/ScreenProps.d.ts +12 -0
- package/dist/components/screens/ScreenProps.d.ts.map +1 -0
- package/dist/components/screens/ScreenProps.js +5 -0
- package/dist/components/screens/ScreenProps.js.map +1 -0
- package/dist/components/screens/StartScreen.d.ts +26 -0
- package/dist/components/screens/StartScreen.d.ts.map +1 -0
- package/dist/components/screens/StartScreen.js +1021 -0
- package/dist/components/screens/StartScreen.js.map +1 -0
- package/dist/components/screens/StatusScreen.d.ts +14 -0
- package/dist/components/screens/StatusScreen.d.ts.map +1 -0
- package/dist/components/screens/StatusScreen.js +115 -0
- package/dist/components/screens/StatusScreen.js.map +1 -0
- package/dist/components/screens/index.d.ts +15 -0
- package/dist/components/screens/index.d.ts.map +1 -0
- package/dist/components/screens/index.js +12 -0
- package/dist/components/screens/index.js.map +1 -0
- package/dist/components/ui/ErrorBoundary.d.ts +34 -0
- package/dist/components/ui/ErrorBoundary.d.ts.map +1 -0
- package/dist/components/ui/ErrorBoundary.js +37 -0
- package/dist/components/ui/ErrorBoundary.js.map +1 -0
- package/dist/components/ui/ErrorDisplay.d.ts +20 -0
- package/dist/components/ui/ErrorDisplay.d.ts.map +1 -0
- package/dist/components/ui/ErrorDisplay.js +12 -0
- package/dist/components/ui/ErrorDisplay.js.map +1 -0
- package/dist/components/ui/ErrorRecoveryPrompt.d.ts +30 -0
- package/dist/components/ui/ErrorRecoveryPrompt.d.ts.map +1 -0
- package/dist/components/ui/ErrorRecoveryPrompt.js +66 -0
- package/dist/components/ui/ErrorRecoveryPrompt.js.map +1 -0
- package/dist/components/ui/FeatureSidebar.d.ts +27 -0
- package/dist/components/ui/FeatureSidebar.d.ts.map +1 -0
- package/dist/components/ui/FeatureSidebar.js +166 -0
- package/dist/components/ui/FeatureSidebar.js.map +1 -0
- package/dist/components/ui/FlowTable.d.ts +21 -0
- package/dist/components/ui/FlowTable.d.ts.map +1 -0
- package/dist/components/ui/FlowTable.js +105 -0
- package/dist/components/ui/FlowTable.js.map +1 -0
- package/dist/components/ui/Header.d.ts +20 -0
- package/dist/components/ui/Header.d.ts.map +1 -0
- package/dist/components/ui/Header.js +11 -0
- package/dist/components/ui/Header.js.map +1 -0
- package/dist/components/ui/OutputRegion.d.ts +20 -0
- package/dist/components/ui/OutputRegion.d.ts.map +1 -0
- package/dist/components/ui/OutputRegion.js +14 -0
- package/dist/components/ui/OutputRegion.js.map +1 -0
- package/dist/components/ui/PhaseProgressView.d.ts +23 -0
- package/dist/components/ui/PhaseProgressView.d.ts.map +1 -0
- package/dist/components/ui/PhaseProgressView.js +117 -0
- package/dist/components/ui/PhaseProgressView.js.map +1 -0
- package/dist/components/ui/ProgressBar.d.ts +20 -0
- package/dist/components/ui/ProgressBar.d.ts.map +1 -0
- package/dist/components/ui/ProgressBar.js +12 -0
- package/dist/components/ui/ProgressBar.js.map +1 -0
- package/dist/components/ui/SelectMenu.d.ts +27 -0
- package/dist/components/ui/SelectMenu.d.ts.map +1 -0
- package/dist/components/ui/SelectMenu.js +21 -0
- package/dist/components/ui/SelectMenu.js.map +1 -0
- package/dist/components/ui/Spinner.d.ts +18 -0
- package/dist/components/ui/Spinner.d.ts.map +1 -0
- package/dist/components/ui/Spinner.js +10 -0
- package/dist/components/ui/Spinner.js.map +1 -0
- package/dist/components/ui/StatusLine.d.ts +21 -0
- package/dist/components/ui/StatusLine.d.ts.map +1 -0
- package/dist/components/ui/StatusLine.js +30 -0
- package/dist/components/ui/StatusLine.js.map +1 -0
- package/dist/components/ui/index.d.ts +16 -0
- package/dist/components/ui/index.d.ts.map +1 -0
- package/dist/components/ui/index.js +16 -0
- package/dist/components/ui/index.js.map +1 -0
- package/dist/services/AgentInvoker.d.ts +20 -0
- package/dist/services/AgentInvoker.d.ts.map +1 -0
- package/dist/services/AgentInvoker.js +282 -0
- package/dist/services/AgentInvoker.js.map +1 -0
- package/dist/services/BranchService.d.ts +28 -0
- package/dist/services/BranchService.d.ts.map +1 -0
- package/dist/services/BranchService.js +114 -0
- package/dist/services/BranchService.js.map +1 -0
- package/dist/services/CacheService.d.ts +57 -0
- package/dist/services/CacheService.d.ts.map +1 -0
- package/dist/services/CacheService.js +208 -0
- package/dist/services/CacheService.js.map +1 -0
- package/dist/services/ClaudeErrorDetector.d.ts +45 -0
- package/dist/services/ClaudeErrorDetector.d.ts.map +1 -0
- package/dist/services/ClaudeErrorDetector.js +207 -0
- package/dist/services/ClaudeErrorDetector.js.map +1 -0
- package/dist/services/ClaudeHealthCheck.d.ts +37 -0
- package/dist/services/ClaudeHealthCheck.d.ts.map +1 -0
- package/dist/services/ClaudeHealthCheck.js +197 -0
- package/dist/services/ClaudeHealthCheck.js.map +1 -0
- package/dist/services/CommitService.d.ts +36 -0
- package/dist/services/CommitService.d.ts.map +1 -0
- package/dist/services/CommitService.js +159 -0
- package/dist/services/CommitService.js.map +1 -0
- package/dist/services/ConfigService.d.ts +49 -0
- package/dist/services/ConfigService.d.ts.map +1 -0
- package/dist/services/ConfigService.js +57 -0
- package/dist/services/ConfigService.js.map +1 -0
- package/dist/services/DockerRunner.d.ts +45 -0
- package/dist/services/DockerRunner.d.ts.map +1 -0
- package/dist/services/DockerRunner.js +170 -0
- package/dist/services/DockerRunner.js.map +1 -0
- package/dist/services/ExtendedFlowStateMachine.d.ts +31 -0
- package/dist/services/ExtendedFlowStateMachine.d.ts.map +1 -0
- package/dist/services/ExtendedFlowStateMachine.js +302 -0
- package/dist/services/ExtendedFlowStateMachine.js.map +1 -0
- package/dist/services/FeatureValidator.d.ts +26 -0
- package/dist/services/FeatureValidator.d.ts.map +1 -0
- package/dist/services/FeatureValidator.js +48 -0
- package/dist/services/FeatureValidator.js.map +1 -0
- package/dist/services/FlowStateMachine.d.ts +26 -0
- package/dist/services/FlowStateMachine.d.ts.map +1 -0
- package/dist/services/FlowStateMachine.js +177 -0
- package/dist/services/FlowStateMachine.js.map +1 -0
- package/dist/services/GitHubService.d.ts +72 -0
- package/dist/services/GitHubService.d.ts.map +1 -0
- package/dist/services/GitHubService.js +150 -0
- package/dist/services/GitHubService.js.map +1 -0
- package/dist/services/GitStatusChecker.d.ts +29 -0
- package/dist/services/GitStatusChecker.d.ts.map +1 -0
- package/dist/services/GitStatusChecker.js +127 -0
- package/dist/services/GitStatusChecker.js.map +1 -0
- package/dist/services/PRCreatorService.d.ts +59 -0
- package/dist/services/PRCreatorService.d.ts.map +1 -0
- package/dist/services/PRCreatorService.js +212 -0
- package/dist/services/PRCreatorService.js.map +1 -0
- package/dist/services/PRStatusFetcher.d.ts +39 -0
- package/dist/services/PRStatusFetcher.d.ts.map +1 -0
- package/dist/services/PRStatusFetcher.js +144 -0
- package/dist/services/PRStatusFetcher.js.map +1 -0
- package/dist/services/PhaseExecutor.d.ts +29 -0
- package/dist/services/PhaseExecutor.d.ts.map +1 -0
- package/dist/services/PhaseExecutor.js +125 -0
- package/dist/services/PhaseExecutor.js.map +1 -0
- package/dist/services/SpecInitService.d.ts +33 -0
- package/dist/services/SpecInitService.d.ts.map +1 -0
- package/dist/services/SpecInitService.js +168 -0
- package/dist/services/SpecInitService.js.map +1 -0
- package/dist/services/StateStore.d.ts +24 -0
- package/dist/services/StateStore.d.ts.map +1 -0
- package/dist/services/StateStore.js +171 -0
- package/dist/services/StateStore.js.map +1 -0
- package/dist/services/TaskParser.d.ts +44 -0
- package/dist/services/TaskParser.d.ts.map +1 -0
- package/dist/services/TaskParser.js +167 -0
- package/dist/services/TaskParser.js.map +1 -0
- package/dist/services/TaskRunner.d.ts +52 -0
- package/dist/services/TaskRunner.d.ts.map +1 -0
- package/dist/services/TaskRunner.js +135 -0
- package/dist/services/TaskRunner.js.map +1 -0
- package/dist/services/TemplateService.d.ts +73 -0
- package/dist/services/TemplateService.d.ts.map +1 -0
- package/dist/services/TemplateService.js +263 -0
- package/dist/services/TemplateService.js.map +1 -0
- package/dist/services/WorktreeService.d.ts +51 -0
- package/dist/services/WorktreeService.d.ts.map +1 -0
- package/dist/services/WorktreeService.js +204 -0
- package/dist/services/WorktreeService.js.map +1 -0
- package/dist/services/index.d.ts +25 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +25 -0
- package/dist/services/index.js.map +1 -0
- package/dist/types/extended-flow.d.ts +167 -0
- package/dist/types/extended-flow.d.ts.map +1 -0
- package/dist/types/extended-flow.js +103 -0
- package/dist/types/extended-flow.js.map +1 -0
- package/dist/types/index.d.ts +210 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +28 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/git.d.ts +41 -0
- package/dist/utils/git.d.ts.map +1 -0
- package/dist/utils/git.js +68 -0
- package/dist/utils/git.js.map +1 -0
- package/dist/utils/index.d.ts +6 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +6 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/paths.d.ts +30 -0
- package/dist/utils/paths.d.ts.map +1 -0
- package/dist/utils/paths.js +43 -0
- package/dist/utils/paths.js.map +1 -0
- package/framework/.red64/settings/rules/design-discovery-full.md +93 -0
- package/framework/.red64/settings/rules/design-discovery-light.md +49 -0
- package/framework/.red64/settings/rules/design-principles.md +182 -0
- package/framework/.red64/settings/rules/design-review.md +110 -0
- package/framework/.red64/settings/rules/ears-format.md +49 -0
- package/framework/.red64/settings/rules/gap-analysis.md +144 -0
- package/framework/.red64/settings/rules/steering-principles.md +90 -0
- package/framework/.red64/settings/rules/tasks-generation.md +131 -0
- package/framework/.red64/settings/rules/tasks-parallel-analysis.md +34 -0
- package/framework/.red64/settings/templates/flow-state.json +48 -0
- package/framework/.red64/settings/templates/specs/design.md +276 -0
- package/framework/.red64/settings/templates/specs/init.json +24 -0
- package/framework/.red64/settings/templates/specs/requirements-init.md +9 -0
- package/framework/.red64/settings/templates/specs/requirements.md +26 -0
- package/framework/.red64/settings/templates/specs/research.md +61 -0
- package/framework/.red64/settings/templates/specs/tasks.md +21 -0
- package/framework/.red64/settings/templates/steering/product.md +18 -0
- package/framework/.red64/settings/templates/steering/structure.md +41 -0
- package/framework/.red64/settings/templates/steering/tech.md +45 -0
- package/framework/.red64/settings/templates/steering-custom/api-standards.md +69 -0
- package/framework/.red64/settings/templates/steering-custom/authentication.md +67 -0
- package/framework/.red64/settings/templates/steering-custom/database.md +46 -0
- package/framework/.red64/settings/templates/steering-custom/deployment.md +54 -0
- package/framework/.red64/settings/templates/steering-custom/error-handling.md +59 -0
- package/framework/.red64/settings/templates/steering-custom/security.md +55 -0
- package/framework/.red64/settings/templates/steering-custom/testing.md +47 -0
- package/framework/agents/claude/.claude/agents/red64/spec-design.md +174 -0
- package/framework/agents/claude/.claude/agents/red64/spec-impl.md +120 -0
- package/framework/agents/claude/.claude/agents/red64/spec-requirements.md +102 -0
- package/framework/agents/claude/.claude/agents/red64/spec-tasks.md +141 -0
- package/framework/agents/claude/.claude/agents/red64/steering-custom.md +147 -0
- package/framework/agents/claude/.claude/agents/red64/steering.md +163 -0
- package/framework/agents/claude/.claude/agents/red64/validate-design.md +98 -0
- package/framework/agents/claude/.claude/agents/red64/validate-gap.md +99 -0
- package/framework/agents/claude/.claude/agents/red64/validate-impl.md +146 -0
- package/framework/agents/claude/.claude/commands/red64/spec-design.md +64 -0
- package/framework/agents/claude/.claude/commands/red64/spec-impl.md +68 -0
- package/framework/agents/claude/.claude/commands/red64/spec-init.md +65 -0
- package/framework/agents/claude/.claude/commands/red64/spec-quick.md +360 -0
- package/framework/agents/claude/.claude/commands/red64/spec-requirements.md +62 -0
- package/framework/agents/claude/.claude/commands/red64/spec-status.md +87 -0
- package/framework/agents/claude/.claude/commands/red64/spec-tasks.md +75 -0
- package/framework/agents/claude/.claude/commands/red64/steering-custom.md +59 -0
- package/framework/agents/claude/.claude/commands/red64/steering.md +62 -0
- package/framework/agents/claude/.claude/commands/red64/validate-design.md +59 -0
- package/framework/agents/claude/.claude/commands/red64/validate-gap.md +53 -0
- package/framework/agents/claude/.claude/commands/red64/validate-impl.md +68 -0
- package/framework/agents/claude/docs/CLAUDE.md +45 -0
- package/framework/agents/codex/.codex/agents/red64/spec-design.md +174 -0
- package/framework/agents/codex/.codex/agents/red64/spec-impl.md +120 -0
- package/framework/agents/codex/.codex/agents/red64/spec-requirements.md +102 -0
- package/framework/agents/codex/.codex/agents/red64/spec-tasks.md +141 -0
- package/framework/agents/codex/.codex/agents/red64/steering-custom.md +147 -0
- package/framework/agents/codex/.codex/agents/red64/steering.md +163 -0
- package/framework/agents/codex/.codex/agents/red64/validate-design.md +98 -0
- package/framework/agents/codex/.codex/agents/red64/validate-gap.md +99 -0
- package/framework/agents/codex/.codex/agents/red64/validate-impl.md +146 -0
- package/framework/agents/codex/.codex/commands/red64/spec-design.md +64 -0
- package/framework/agents/codex/.codex/commands/red64/spec-impl.md +68 -0
- package/framework/agents/codex/.codex/commands/red64/spec-init.md +65 -0
- package/framework/agents/codex/.codex/commands/red64/spec-quick.md +360 -0
- package/framework/agents/codex/.codex/commands/red64/spec-requirements.md +62 -0
- package/framework/agents/codex/.codex/commands/red64/spec-status.md +87 -0
- package/framework/agents/codex/.codex/commands/red64/spec-tasks.md +75 -0
- package/framework/agents/codex/.codex/commands/red64/steering-custom.md +59 -0
- package/framework/agents/codex/.codex/commands/red64/steering.md +62 -0
- package/framework/agents/codex/.codex/commands/red64/validate-design.md +59 -0
- package/framework/agents/codex/.codex/commands/red64/validate-gap.md +53 -0
- package/framework/agents/codex/.codex/commands/red64/validate-impl.md +68 -0
- package/framework/agents/codex/docs/AGENTS.md +68 -0
- package/framework/agents/gemini/commands.toml +607 -0
- package/framework/agents/gemini/docs/GEMINI.md +45 -0
- package/framework/stacks/generic/product.md +27 -0
- package/framework/stacks/generic/structure.md +46 -0
- package/framework/stacks/generic/tech.md +47 -0
- package/framework/stacks/node/product.md +27 -0
- package/framework/stacks/node/structure.md +82 -0
- package/framework/stacks/node/tech.md +63 -0
- package/framework/stacks/python/product.md +27 -0
- package/framework/stacks/python/structure.md +78 -0
- package/framework/stacks/python/tech.md +64 -0
- package/framework/stacks/react/product.md +27 -0
- package/framework/stacks/react/structure.md +76 -0
- package/framework/stacks/react/tech.md +65 -0
- package/package.json +47 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { Select } from '@inkjs/ui';
|
|
3
|
+
/**
|
|
4
|
+
* Interactive selection menu for approval gates
|
|
5
|
+
* Requirements: 6.5 - Support keyboard navigation
|
|
6
|
+
* Requirements: 6.6 - Render approval gates as interactive selection menus
|
|
7
|
+
*/
|
|
8
|
+
export function SelectMenu({ items, onSelect }) {
|
|
9
|
+
const options = items.map(item => ({
|
|
10
|
+
label: item.label,
|
|
11
|
+
value: item.value
|
|
12
|
+
}));
|
|
13
|
+
const handleSelect = (value) => {
|
|
14
|
+
const selectedItem = items.find(item => item.value === value);
|
|
15
|
+
if (selectedItem) {
|
|
16
|
+
onSelect(selectedItem);
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
return (_jsx(Select, { options: options, onChange: handleSelect }));
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=SelectMenu.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SelectMenu.js","sourceRoot":"","sources":["../../../src/components/ui/SelectMenu.tsx"],"names":[],"mappings":";AAMA,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAkBnC;;;;GAIG;AACH,MAAM,UAAU,UAAU,CAAa,EACrC,KAAK,EACL,QAAQ,EACW;IACnB,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjC,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,KAAK,EAAE,IAAI,CAAC,KAAe;KAC5B,CAAC,CAAC,CAAC;IAEJ,MAAM,YAAY,GAAG,CAAC,KAAa,EAAE,EAAE;QACrC,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC;QAC9D,IAAI,YAAY,EAAE,CAAC;YACjB,QAAQ,CAAC,YAAY,CAAC,CAAC;QACzB,CAAC;IACH,CAAC,CAAC;IAEF,OAAO,CACL,KAAC,MAAM,IACL,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,YAAY,GACtB,CACH,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Spinner component wrapper
|
|
3
|
+
* Requirements: 6.2
|
|
4
|
+
*/
|
|
5
|
+
import React from 'react';
|
|
6
|
+
/**
|
|
7
|
+
* Props for Spinner component
|
|
8
|
+
*/
|
|
9
|
+
interface SpinnerProps {
|
|
10
|
+
readonly label?: string;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Loading indicator using @inkjs/ui Spinner
|
|
14
|
+
* Requirements: 6.2 - Display spinners during async operations
|
|
15
|
+
*/
|
|
16
|
+
export declare const Spinner: React.FC<SpinnerProps>;
|
|
17
|
+
export {};
|
|
18
|
+
//# sourceMappingURL=Spinner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Spinner.d.ts","sourceRoot":"","sources":["../../../src/components/ui/Spinner.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B;;GAEG;AACH,UAAU,YAAY;IACpB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;;GAGG;AACH,eAAO,MAAM,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC,YAAY,CAE1C,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { Spinner as InkSpinner } from '@inkjs/ui';
|
|
3
|
+
/**
|
|
4
|
+
* Loading indicator using @inkjs/ui Spinner
|
|
5
|
+
* Requirements: 6.2 - Display spinners during async operations
|
|
6
|
+
*/
|
|
7
|
+
export const Spinner = ({ label }) => {
|
|
8
|
+
return _jsx(InkSpinner, { label: label });
|
|
9
|
+
};
|
|
10
|
+
//# sourceMappingURL=Spinner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Spinner.js","sourceRoot":"","sources":["../../../src/components/ui/Spinner.tsx"],"names":[],"mappings":";AAMA,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,WAAW,CAAC;AASlD;;;GAGG;AACH,MAAM,CAAC,MAAM,OAAO,GAA2B,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE;IAC3D,OAAO,KAAC,UAAU,IAAC,KAAK,EAAE,KAAK,GAAI,CAAC;AACtC,CAAC,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* StatusLine component with color coding
|
|
3
|
+
* Requirements: 6.1
|
|
4
|
+
*/
|
|
5
|
+
import React from 'react';
|
|
6
|
+
import type { Status } from '../../types/index.js';
|
|
7
|
+
/**
|
|
8
|
+
* Props for StatusLine component
|
|
9
|
+
*/
|
|
10
|
+
interface StatusLineProps {
|
|
11
|
+
readonly label: string;
|
|
12
|
+
readonly status: Status;
|
|
13
|
+
readonly message?: string;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Status display with color coding
|
|
17
|
+
* Requirements: 6.1 - Use color coding for status display
|
|
18
|
+
*/
|
|
19
|
+
export declare const StatusLine: React.FC<StatusLineProps>;
|
|
20
|
+
export {};
|
|
21
|
+
//# sourceMappingURL=StatusLine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StatusLine.d.ts","sourceRoot":"","sources":["../../../src/components/ui/StatusLine.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAEnD;;GAEG;AACH,UAAU,eAAe;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAsBD;;;GAGG;AACH,eAAO,MAAM,UAAU,EAAE,KAAK,CAAC,EAAE,CAAC,eAAe,CAchD,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { Box, Text } from 'ink';
|
|
3
|
+
/**
|
|
4
|
+
* Map status to color
|
|
5
|
+
* Requirements: 6.1 - green (success), red (errors), yellow (warnings/pending)
|
|
6
|
+
*/
|
|
7
|
+
function getStatusColor(status) {
|
|
8
|
+
switch (status) {
|
|
9
|
+
case 'success':
|
|
10
|
+
return 'green';
|
|
11
|
+
case 'error':
|
|
12
|
+
return 'red';
|
|
13
|
+
case 'warning':
|
|
14
|
+
case 'pending':
|
|
15
|
+
return 'yellow';
|
|
16
|
+
case 'running':
|
|
17
|
+
return 'cyan';
|
|
18
|
+
default:
|
|
19
|
+
return 'white';
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Status display with color coding
|
|
24
|
+
* Requirements: 6.1 - Use color coding for status display
|
|
25
|
+
*/
|
|
26
|
+
export const StatusLine = ({ label, status, message }) => {
|
|
27
|
+
const color = getStatusColor(status);
|
|
28
|
+
return (_jsxs(Box, { children: [_jsxs(Text, { children: [label, ": "] }), _jsx(Text, { color: color, children: status }), message && _jsxs(Text, { dimColor: true, children: [" - ", message] })] }));
|
|
29
|
+
};
|
|
30
|
+
//# sourceMappingURL=StatusLine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StatusLine.js","sourceRoot":"","sources":["../../../src/components/ui/StatusLine.tsx"],"names":[],"mappings":";AAMA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAYhC;;;GAGG;AACH,SAAS,cAAc,CAAC,MAAc;IACpC,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,SAAS;YACZ,OAAO,OAAO,CAAC;QACjB,KAAK,OAAO;YACV,OAAO,KAAK,CAAC;QACf,KAAK,SAAS,CAAC;QACf,KAAK,SAAS;YACZ,OAAO,QAAQ,CAAC;QAClB,KAAK,SAAS;YACZ,OAAO,MAAM,CAAC;QAChB;YACE,OAAO,OAAO,CAAC;IACnB,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,UAAU,GAA8B,CAAC,EACpD,KAAK,EACL,MAAM,EACN,OAAO,EACR,EAAE,EAAE;IACH,MAAM,KAAK,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;IAErC,OAAO,CACL,MAAC,GAAG,eACF,MAAC,IAAI,eAAE,KAAK,UAAU,EACtB,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,YAAG,MAAM,GAAQ,EAClC,OAAO,IAAI,MAAC,IAAI,IAAC,QAAQ,0BAAK,OAAO,IAAQ,IAC1C,CACP,CAAC;AACJ,CAAC,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* UI components index
|
|
3
|
+
*/
|
|
4
|
+
export { StatusLine } from './StatusLine.js';
|
|
5
|
+
export { Header } from './Header.js';
|
|
6
|
+
export { OutputRegion } from './OutputRegion.js';
|
|
7
|
+
export { Spinner } from './Spinner.js';
|
|
8
|
+
export { ProgressBar } from './ProgressBar.js';
|
|
9
|
+
export { SelectMenu, type SelectMenuItem } from './SelectMenu.js';
|
|
10
|
+
export { PhaseProgressView, type PhaseProgressViewProps } from './PhaseProgressView.js';
|
|
11
|
+
export { FeatureSidebar, type FeatureSidebarProps, type CodingAgent } from './FeatureSidebar.js';
|
|
12
|
+
export { FlowTable, type FlowTableProps } from './FlowTable.js';
|
|
13
|
+
export { ErrorDisplay, type ErrorDisplayProps } from './ErrorDisplay.js';
|
|
14
|
+
export { ErrorRecoveryPrompt, type ErrorRecoveryPromptProps, type RecoveryOption, type ErrorType } from './ErrorRecoveryPrompt.js';
|
|
15
|
+
export { ErrorBoundary, type ErrorBoundaryProps } from './ErrorBoundary.js';
|
|
16
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/ui/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,KAAK,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAClE,OAAO,EAAE,iBAAiB,EAAE,KAAK,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AACxF,OAAO,EAAE,cAAc,EAAE,KAAK,mBAAmB,EAAE,KAAK,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACjG,OAAO,EAAE,SAAS,EAAE,KAAK,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,KAAK,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACzE,OAAO,EACL,mBAAmB,EACnB,KAAK,wBAAwB,EAC7B,KAAK,cAAc,EACnB,KAAK,SAAS,EACf,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,KAAK,kBAAkB,EAAE,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* UI components index
|
|
3
|
+
*/
|
|
4
|
+
export { StatusLine } from './StatusLine.js';
|
|
5
|
+
export { Header } from './Header.js';
|
|
6
|
+
export { OutputRegion } from './OutputRegion.js';
|
|
7
|
+
export { Spinner } from './Spinner.js';
|
|
8
|
+
export { ProgressBar } from './ProgressBar.js';
|
|
9
|
+
export { SelectMenu } from './SelectMenu.js';
|
|
10
|
+
export { PhaseProgressView } from './PhaseProgressView.js';
|
|
11
|
+
export { FeatureSidebar } from './FeatureSidebar.js';
|
|
12
|
+
export { FlowTable } from './FlowTable.js';
|
|
13
|
+
export { ErrorDisplay } from './ErrorDisplay.js';
|
|
14
|
+
export { ErrorRecoveryPrompt } from './ErrorRecoveryPrompt.js';
|
|
15
|
+
export { ErrorBoundary } from './ErrorBoundary.js';
|
|
16
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/ui/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAuB,MAAM,iBAAiB,CAAC;AAClE,OAAO,EAAE,iBAAiB,EAA+B,MAAM,wBAAwB,CAAC;AACxF,OAAO,EAAE,cAAc,EAA8C,MAAM,qBAAqB,CAAC;AACjG,OAAO,EAAE,SAAS,EAAuB,MAAM,gBAAgB,CAAC;AAChE,OAAO,EAAE,YAAY,EAA0B,MAAM,mBAAmB,CAAC;AACzE,OAAO,EACL,mBAAmB,EAIpB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,aAAa,EAA2B,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent Invoker service for Claude CLI execution
|
|
3
|
+
* Requirements: 7.1-7.7, 2.1-2.6
|
|
4
|
+
* Supports both direct execution and Docker sandbox mode
|
|
5
|
+
*/
|
|
6
|
+
import type { AgentInvokeOptions, AgentResult } from '../types/index.js';
|
|
7
|
+
/**
|
|
8
|
+
* Agent invoker service interface
|
|
9
|
+
* Requirements: 7.1 - Wrap Claude CLI execution as typed TypeScript interface
|
|
10
|
+
*/
|
|
11
|
+
export interface AgentInvokerService {
|
|
12
|
+
invoke(options: AgentInvokeOptions): Promise<AgentResult>;
|
|
13
|
+
abort(): void;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Create agent invoker service
|
|
17
|
+
* Requirements: 7.1 - Factory function for agent invocation
|
|
18
|
+
*/
|
|
19
|
+
export declare function createAgentInvoker(): AgentInvokerService;
|
|
20
|
+
//# sourceMappingURL=AgentInvoker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AgentInvoker.d.ts","sourceRoot":"","sources":["../../src/services/AgentInvoker.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,KAAK,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AA6DzE;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAClC,MAAM,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IAC1D,KAAK,IAAI,IAAI,CAAC;CACf;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI,mBAAmB,CAgJxD"}
|
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent Invoker service for Claude CLI execution
|
|
3
|
+
* Requirements: 7.1-7.7, 2.1-2.6
|
|
4
|
+
* Supports both direct execution and Docker sandbox mode
|
|
5
|
+
*/
|
|
6
|
+
import { spawn } from 'node:child_process';
|
|
7
|
+
import { readFileSync, existsSync } from 'node:fs';
|
|
8
|
+
import { join } from 'node:path';
|
|
9
|
+
import { createClaudeErrorDetector } from './ClaudeErrorDetector.js';
|
|
10
|
+
const SANDBOX_IMAGE = 'red64-sandbox:latest';
|
|
11
|
+
/**
|
|
12
|
+
* Try to read API key from Claude config directory
|
|
13
|
+
* Claude stores credentials in various files within the config dir
|
|
14
|
+
*/
|
|
15
|
+
function readApiKeyFromConfig(configDir) {
|
|
16
|
+
// Try common credential file locations
|
|
17
|
+
const credentialPaths = [
|
|
18
|
+
join(configDir, 'credentials.json'),
|
|
19
|
+
join(configDir, '.credentials.json'),
|
|
20
|
+
join(configDir, 'settings.json'),
|
|
21
|
+
join(configDir, 'config.json'),
|
|
22
|
+
];
|
|
23
|
+
for (const credPath of credentialPaths) {
|
|
24
|
+
if (existsSync(credPath)) {
|
|
25
|
+
try {
|
|
26
|
+
const content = readFileSync(credPath, 'utf-8');
|
|
27
|
+
const data = JSON.parse(content);
|
|
28
|
+
// Check various possible key names
|
|
29
|
+
const apiKey = data.apiKey || data.api_key || data.ANTHROPIC_API_KEY || data.anthropicApiKey;
|
|
30
|
+
if (apiKey && typeof apiKey === 'string' && apiKey.startsWith('sk-')) {
|
|
31
|
+
return apiKey;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
// Continue to next file
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Get API key from environment or Claude config
|
|
43
|
+
*/
|
|
44
|
+
function getApiKey(tier) {
|
|
45
|
+
// First check environment variable
|
|
46
|
+
if (process.env.ANTHROPIC_API_KEY) {
|
|
47
|
+
return process.env.ANTHROPIC_API_KEY;
|
|
48
|
+
}
|
|
49
|
+
const homeDir = process.env.HOME ?? process.env.USERPROFILE ?? '';
|
|
50
|
+
if (!homeDir)
|
|
51
|
+
return null;
|
|
52
|
+
// Try tier-specific config first
|
|
53
|
+
if (tier) {
|
|
54
|
+
const tierConfig = join(homeDir, `.claude-${tier}`);
|
|
55
|
+
const key = readApiKeyFromConfig(tierConfig);
|
|
56
|
+
if (key)
|
|
57
|
+
return key;
|
|
58
|
+
}
|
|
59
|
+
// Try default Claude config
|
|
60
|
+
const defaultConfig = join(homeDir, '.claude');
|
|
61
|
+
return readApiKeyFromConfig(defaultConfig);
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Create agent invoker service
|
|
65
|
+
* Requirements: 7.1 - Factory function for agent invocation
|
|
66
|
+
*/
|
|
67
|
+
export function createAgentInvoker() {
|
|
68
|
+
let currentProcess = null;
|
|
69
|
+
let aborted = false;
|
|
70
|
+
const errorDetector = createClaudeErrorDetector();
|
|
71
|
+
return {
|
|
72
|
+
/**
|
|
73
|
+
* Invoke Claude CLI with options
|
|
74
|
+
* Requirements: 7.2 - Spawn Claude CLI as child process
|
|
75
|
+
* Requirements: 7.3, 7.4 - Pass skip-permissions and tier configuration
|
|
76
|
+
*/
|
|
77
|
+
async invoke(options) {
|
|
78
|
+
aborted = false;
|
|
79
|
+
// Use Docker sandbox if enabled
|
|
80
|
+
if (options.sandbox) {
|
|
81
|
+
return invokeInDocker(options, () => currentProcess, (p) => { currentProcess = p; }, () => aborted, errorDetector);
|
|
82
|
+
}
|
|
83
|
+
return new Promise((resolve) => {
|
|
84
|
+
// Build command arguments
|
|
85
|
+
const args = ['-p', options.prompt];
|
|
86
|
+
// Add model flag if specified
|
|
87
|
+
if (options.model) {
|
|
88
|
+
args.push('--model', options.model);
|
|
89
|
+
}
|
|
90
|
+
// Add skip-permissions flag if configured
|
|
91
|
+
// Requirements: 7.3 - Pass --skip-permissions flag to Claude CLI when configured
|
|
92
|
+
if (options.skipPermissions) {
|
|
93
|
+
args.push('--dangerously-skip-permissions');
|
|
94
|
+
}
|
|
95
|
+
// Build environment
|
|
96
|
+
const env = { ...process.env };
|
|
97
|
+
// Set CLAUDE_CONFIG_DIR if tier is specified
|
|
98
|
+
// Requirements: 7.4 - Set CLAUDE_CONFIG_DIR environment variable when tier is specified
|
|
99
|
+
// Format: --tier=red64 -> CLAUDE_CONFIG_DIR=~/.claude-red64
|
|
100
|
+
if (options.tier) {
|
|
101
|
+
const homeDir = process.env.HOME ?? process.env.USERPROFILE ?? '~';
|
|
102
|
+
env.CLAUDE_CONFIG_DIR = `${homeDir}/.claude-${options.tier}`;
|
|
103
|
+
}
|
|
104
|
+
// Spawn Claude CLI
|
|
105
|
+
// Requirements: 7.2 - Use spawn() for streaming output
|
|
106
|
+
currentProcess = spawn('claude', args, {
|
|
107
|
+
cwd: options.workingDirectory,
|
|
108
|
+
env,
|
|
109
|
+
stdio: ['pipe', 'pipe', 'pipe']
|
|
110
|
+
});
|
|
111
|
+
// Close stdin immediately - Claude CLI doesn't need input
|
|
112
|
+
currentProcess.stdin?.end();
|
|
113
|
+
let stdout = '';
|
|
114
|
+
let stderr = '';
|
|
115
|
+
let timedOut = false;
|
|
116
|
+
// Handle timeout (default 10 minutes for long-running tasks)
|
|
117
|
+
const timeoutMs = options.timeout ?? 600000;
|
|
118
|
+
const timeoutId = setTimeout(() => {
|
|
119
|
+
timedOut = true;
|
|
120
|
+
if (currentProcess) {
|
|
121
|
+
currentProcess.kill('SIGTERM');
|
|
122
|
+
}
|
|
123
|
+
}, timeoutMs);
|
|
124
|
+
// Capture stdout
|
|
125
|
+
// Requirements: 7.5 - Capture stdout/stderr and return them to calling code
|
|
126
|
+
currentProcess.stdout?.on('data', (data) => {
|
|
127
|
+
const chunk = data.toString();
|
|
128
|
+
stdout += chunk;
|
|
129
|
+
// Stream output to callback
|
|
130
|
+
// Requirements: 7.7 - Enable UI to display agent output as it streams
|
|
131
|
+
if (options.onOutput) {
|
|
132
|
+
options.onOutput(chunk);
|
|
133
|
+
}
|
|
134
|
+
});
|
|
135
|
+
// Capture stderr
|
|
136
|
+
currentProcess.stderr?.on('data', (data) => {
|
|
137
|
+
const chunk = data.toString();
|
|
138
|
+
stderr += chunk;
|
|
139
|
+
// Stream errors to callback
|
|
140
|
+
if (options.onError) {
|
|
141
|
+
options.onError(chunk);
|
|
142
|
+
}
|
|
143
|
+
});
|
|
144
|
+
// Handle process close
|
|
145
|
+
currentProcess.on('close', (code) => {
|
|
146
|
+
clearTimeout(timeoutId);
|
|
147
|
+
const exitCode = code ?? -1;
|
|
148
|
+
const success = exitCode === 0 && !timedOut && !aborted;
|
|
149
|
+
// Detect Claude-specific errors
|
|
150
|
+
const claudeError = !success ? errorDetector.detect(stdout, stderr) : undefined;
|
|
151
|
+
// Requirements: 7.6 - Return typed result indicating success/failure
|
|
152
|
+
resolve({
|
|
153
|
+
success,
|
|
154
|
+
exitCode,
|
|
155
|
+
stdout,
|
|
156
|
+
stderr,
|
|
157
|
+
timedOut,
|
|
158
|
+
claudeError: claudeError ?? undefined
|
|
159
|
+
});
|
|
160
|
+
currentProcess = null;
|
|
161
|
+
});
|
|
162
|
+
// Handle spawn errors
|
|
163
|
+
currentProcess.on('error', (error) => {
|
|
164
|
+
clearTimeout(timeoutId);
|
|
165
|
+
resolve({
|
|
166
|
+
success: false,
|
|
167
|
+
exitCode: -1,
|
|
168
|
+
stdout,
|
|
169
|
+
stderr: stderr || error.message,
|
|
170
|
+
timedOut: false
|
|
171
|
+
});
|
|
172
|
+
currentProcess = null;
|
|
173
|
+
});
|
|
174
|
+
});
|
|
175
|
+
},
|
|
176
|
+
/**
|
|
177
|
+
* Abort running agent process
|
|
178
|
+
* Requirements: 2.4, 2.6 - Terminate running agent process
|
|
179
|
+
*/
|
|
180
|
+
abort() {
|
|
181
|
+
aborted = true;
|
|
182
|
+
if (currentProcess) {
|
|
183
|
+
currentProcess.kill('SIGTERM');
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Invoke Claude CLI inside Docker sandbox
|
|
190
|
+
* Provides isolation for running with --dangerously-skip-permissions
|
|
191
|
+
*/
|
|
192
|
+
function invokeInDocker(options, getProcess, setProcess, isAborted, errorDetector) {
|
|
193
|
+
return new Promise((resolve) => {
|
|
194
|
+
// Build docker run command
|
|
195
|
+
const dockerArgs = [
|
|
196
|
+
'run',
|
|
197
|
+
'--rm', // Remove container after exit
|
|
198
|
+
'-w', '/workspace', // Working directory inside container
|
|
199
|
+
'-v', `${options.workingDirectory}:/workspace`, // Mount workspace
|
|
200
|
+
];
|
|
201
|
+
// Get API key from env or Claude config files
|
|
202
|
+
const apiKey = getApiKey(options.tier);
|
|
203
|
+
if (apiKey) {
|
|
204
|
+
dockerArgs.push('-e', `ANTHROPIC_API_KEY=${apiKey}`);
|
|
205
|
+
}
|
|
206
|
+
// Don't mount the Claude config - let Claude create a fresh one inside container
|
|
207
|
+
// The API key is passed via env var, which is all that's needed
|
|
208
|
+
// Add image
|
|
209
|
+
dockerArgs.push(SANDBOX_IMAGE);
|
|
210
|
+
// Add claude command with args
|
|
211
|
+
// In sandbox, always use --dangerously-skip-permissions since it's isolated
|
|
212
|
+
dockerArgs.push('claude', '-p', options.prompt, '--dangerously-skip-permissions');
|
|
213
|
+
// Add model flag if specified
|
|
214
|
+
if (options.model) {
|
|
215
|
+
dockerArgs.push('--model', options.model);
|
|
216
|
+
}
|
|
217
|
+
const proc = spawn('docker', dockerArgs, {
|
|
218
|
+
stdio: ['pipe', 'pipe', 'pipe']
|
|
219
|
+
});
|
|
220
|
+
setProcess(proc);
|
|
221
|
+
// Close stdin immediately
|
|
222
|
+
proc.stdin?.end();
|
|
223
|
+
let stdout = '';
|
|
224
|
+
let stderr = '';
|
|
225
|
+
let timedOut = false;
|
|
226
|
+
// Handle timeout (default 10 minutes)
|
|
227
|
+
const timeoutMs = options.timeout ?? 600000;
|
|
228
|
+
const timeoutId = setTimeout(() => {
|
|
229
|
+
timedOut = true;
|
|
230
|
+
const p = getProcess();
|
|
231
|
+
if (p) {
|
|
232
|
+
p.kill('SIGTERM');
|
|
233
|
+
}
|
|
234
|
+
}, timeoutMs);
|
|
235
|
+
// Capture stdout
|
|
236
|
+
proc.stdout?.on('data', (data) => {
|
|
237
|
+
const chunk = data.toString();
|
|
238
|
+
stdout += chunk;
|
|
239
|
+
if (options.onOutput) {
|
|
240
|
+
options.onOutput(chunk);
|
|
241
|
+
}
|
|
242
|
+
});
|
|
243
|
+
// Capture stderr
|
|
244
|
+
proc.stderr?.on('data', (data) => {
|
|
245
|
+
const chunk = data.toString();
|
|
246
|
+
stderr += chunk;
|
|
247
|
+
if (options.onError) {
|
|
248
|
+
options.onError(chunk);
|
|
249
|
+
}
|
|
250
|
+
});
|
|
251
|
+
// Handle process close
|
|
252
|
+
proc.on('close', (code) => {
|
|
253
|
+
clearTimeout(timeoutId);
|
|
254
|
+
const exitCode = code ?? -1;
|
|
255
|
+
const success = exitCode === 0 && !timedOut && !isAborted();
|
|
256
|
+
// Detect Claude-specific errors
|
|
257
|
+
const claudeError = !success ? errorDetector.detect(stdout, stderr) : undefined;
|
|
258
|
+
resolve({
|
|
259
|
+
success,
|
|
260
|
+
exitCode,
|
|
261
|
+
stdout,
|
|
262
|
+
stderr,
|
|
263
|
+
timedOut,
|
|
264
|
+
claudeError: claudeError ?? undefined
|
|
265
|
+
});
|
|
266
|
+
setProcess(null);
|
|
267
|
+
});
|
|
268
|
+
// Handle spawn errors
|
|
269
|
+
proc.on('error', (error) => {
|
|
270
|
+
clearTimeout(timeoutId);
|
|
271
|
+
resolve({
|
|
272
|
+
success: false,
|
|
273
|
+
exitCode: -1,
|
|
274
|
+
stdout,
|
|
275
|
+
stderr: stderr || `Docker error: ${error.message}`,
|
|
276
|
+
timedOut: false
|
|
277
|
+
});
|
|
278
|
+
setProcess(null);
|
|
279
|
+
});
|
|
280
|
+
});
|
|
281
|
+
}
|
|
282
|
+
//# sourceMappingURL=AgentInvoker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AgentInvoker.js","sourceRoot":"","sources":["../../src/services/AgentInvoker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Branch Service
|
|
3
|
+
* Task 1.3: Implement branch management service
|
|
4
|
+
* Requirements: 4.2
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Result of branch deletion operation
|
|
8
|
+
* Requirements: 4.2 - Report success/failure for branch operations
|
|
9
|
+
*/
|
|
10
|
+
export interface BranchDeleteResult {
|
|
11
|
+
readonly success: boolean;
|
|
12
|
+
readonly error: string | undefined;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Branch service interface
|
|
16
|
+
* Requirements: 4.2 - Delete feature branches on abort
|
|
17
|
+
*/
|
|
18
|
+
export interface BranchServiceInterface {
|
|
19
|
+
deleteLocal(branchName: string, force?: boolean): Promise<BranchDeleteResult>;
|
|
20
|
+
deleteRemote(branchName: string): Promise<BranchDeleteResult>;
|
|
21
|
+
exists(branchName: string): Promise<boolean>;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Create branch service
|
|
25
|
+
* Requirements: 4.2 - Factory function for branch operations
|
|
26
|
+
*/
|
|
27
|
+
export declare function createBranchService(): BranchServiceInterface;
|
|
28
|
+
//# sourceMappingURL=BranchService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BranchService.d.ts","sourceRoot":"","sources":["../../src/services/BranchService.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH;;;GAGG;AACH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;CACpC;AAED;;;GAGG;AACH,MAAM,WAAW,sBAAsB;IACrC,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAC9E,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAC9D,MAAM,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC9C;AAkDD;;;GAGG;AACH,wBAAgB,mBAAmB,IAAI,sBAAsB,CAyE5D"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Branch Service
|
|
3
|
+
* Task 1.3: Implement branch management service
|
|
4
|
+
* Requirements: 4.2
|
|
5
|
+
*/
|
|
6
|
+
import { spawn } from 'node:child_process';
|
|
7
|
+
/**
|
|
8
|
+
* Protected branch names that should never be deleted
|
|
9
|
+
*/
|
|
10
|
+
const PROTECTED_BRANCHES = new Set(['main', 'master', 'develop', 'development', 'release']);
|
|
11
|
+
/**
|
|
12
|
+
* Check if a branch name is protected
|
|
13
|
+
*/
|
|
14
|
+
function isProtectedBranch(branchName) {
|
|
15
|
+
return PROTECTED_BRANCHES.has(branchName.toLowerCase());
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Execute git command and return result
|
|
19
|
+
*/
|
|
20
|
+
function execGit(args) {
|
|
21
|
+
return new Promise((resolve) => {
|
|
22
|
+
const process = spawn('git', args, {
|
|
23
|
+
stdio: ['pipe', 'pipe', 'pipe']
|
|
24
|
+
});
|
|
25
|
+
let stdout = '';
|
|
26
|
+
let stderr = '';
|
|
27
|
+
process.stdout?.on('data', (data) => {
|
|
28
|
+
stdout += data.toString();
|
|
29
|
+
});
|
|
30
|
+
process.stderr?.on('data', (data) => {
|
|
31
|
+
stderr += data.toString();
|
|
32
|
+
});
|
|
33
|
+
process.on('close', (code) => {
|
|
34
|
+
resolve({ stdout, stderr, exitCode: code ?? 0 });
|
|
35
|
+
});
|
|
36
|
+
process.on('error', (error) => {
|
|
37
|
+
resolve({
|
|
38
|
+
stdout,
|
|
39
|
+
stderr: stderr || `git error: ${error.message}`,
|
|
40
|
+
exitCode: -1
|
|
41
|
+
});
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Create branch service
|
|
47
|
+
* Requirements: 4.2 - Factory function for branch operations
|
|
48
|
+
*/
|
|
49
|
+
export function createBranchService() {
|
|
50
|
+
return {
|
|
51
|
+
/**
|
|
52
|
+
* Delete a local branch
|
|
53
|
+
* Requirements: 4.2 - Delete local branch with optional force flag
|
|
54
|
+
*/
|
|
55
|
+
async deleteLocal(branchName, force) {
|
|
56
|
+
// Never delete protected branches
|
|
57
|
+
if (isProtectedBranch(branchName)) {
|
|
58
|
+
return {
|
|
59
|
+
success: false,
|
|
60
|
+
error: `Cannot delete protected branch: ${branchName}`
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
const flag = force ? '-D' : '-d';
|
|
64
|
+
const result = await execGit(['branch', flag, branchName]);
|
|
65
|
+
if (result.exitCode !== 0) {
|
|
66
|
+
return {
|
|
67
|
+
success: false,
|
|
68
|
+
error: result.stderr || 'Failed to delete branch'
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
return {
|
|
72
|
+
success: true,
|
|
73
|
+
error: undefined
|
|
74
|
+
};
|
|
75
|
+
},
|
|
76
|
+
/**
|
|
77
|
+
* Delete a remote branch
|
|
78
|
+
* Requirements: 4.2 - Delete remote branch via git push
|
|
79
|
+
*/
|
|
80
|
+
async deleteRemote(branchName) {
|
|
81
|
+
// Never delete protected branches
|
|
82
|
+
if (isProtectedBranch(branchName)) {
|
|
83
|
+
return {
|
|
84
|
+
success: false,
|
|
85
|
+
error: `Cannot delete protected branch: ${branchName}`
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
const result = await execGit(['push', 'origin', '--delete', branchName]);
|
|
89
|
+
if (result.exitCode !== 0) {
|
|
90
|
+
return {
|
|
91
|
+
success: false,
|
|
92
|
+
error: result.stderr || 'Failed to delete remote branch'
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
return {
|
|
96
|
+
success: true,
|
|
97
|
+
error: undefined
|
|
98
|
+
};
|
|
99
|
+
},
|
|
100
|
+
/**
|
|
101
|
+
* Check if a branch exists
|
|
102
|
+
* Requirements: 4.2 - Branch existence check before operations
|
|
103
|
+
*/
|
|
104
|
+
async exists(branchName) {
|
|
105
|
+
const result = await execGit([
|
|
106
|
+
'rev-parse',
|
|
107
|
+
'--verify',
|
|
108
|
+
`refs/heads/${branchName}`
|
|
109
|
+
]);
|
|
110
|
+
return result.exitCode === 0;
|
|
111
|
+
}
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=BranchService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BranchService.js","sourceRoot":"","sources":["../../src/services/BranchService.ts"],"names":[],"mappings":"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"}
|