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,197 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Claude API Health Check Service
|
|
3
|
+
* Verifies API connectivity and account status before starting flows
|
|
4
|
+
*/
|
|
5
|
+
import { spawn } from 'node:child_process';
|
|
6
|
+
import { readFileSync, existsSync } from 'node:fs';
|
|
7
|
+
import { join } from 'node:path';
|
|
8
|
+
import { createClaudeErrorDetector } from './ClaudeErrorDetector.js';
|
|
9
|
+
const SANDBOX_IMAGE = 'red64-sandbox:latest';
|
|
10
|
+
/**
|
|
11
|
+
* Read API key from Claude config directory
|
|
12
|
+
*/
|
|
13
|
+
function readApiKeyFromConfig(configDir) {
|
|
14
|
+
const credentialPaths = [
|
|
15
|
+
join(configDir, 'credentials.json'),
|
|
16
|
+
join(configDir, '.credentials.json'),
|
|
17
|
+
join(configDir, 'settings.json'),
|
|
18
|
+
join(configDir, 'config.json'),
|
|
19
|
+
];
|
|
20
|
+
for (const credPath of credentialPaths) {
|
|
21
|
+
if (existsSync(credPath)) {
|
|
22
|
+
try {
|
|
23
|
+
const content = readFileSync(credPath, 'utf-8');
|
|
24
|
+
const data = JSON.parse(content);
|
|
25
|
+
const apiKey = data.apiKey || data.api_key || data.ANTHROPIC_API_KEY || data.anthropicApiKey;
|
|
26
|
+
if (apiKey && typeof apiKey === 'string' && apiKey.startsWith('sk-')) {
|
|
27
|
+
return apiKey;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
// Continue to next file
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Get API key from environment or config
|
|
39
|
+
*/
|
|
40
|
+
function getApiKey(tier) {
|
|
41
|
+
if (process.env.ANTHROPIC_API_KEY) {
|
|
42
|
+
return process.env.ANTHROPIC_API_KEY;
|
|
43
|
+
}
|
|
44
|
+
const homeDir = process.env.HOME ?? process.env.USERPROFILE ?? '';
|
|
45
|
+
if (!homeDir)
|
|
46
|
+
return null;
|
|
47
|
+
if (tier) {
|
|
48
|
+
const tierConfig = join(homeDir, `.claude-${tier}`);
|
|
49
|
+
const key = readApiKeyFromConfig(tierConfig);
|
|
50
|
+
if (key)
|
|
51
|
+
return key;
|
|
52
|
+
}
|
|
53
|
+
const defaultConfig = join(homeDir, '.claude');
|
|
54
|
+
return readApiKeyFromConfig(defaultConfig);
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Create Claude health check service
|
|
58
|
+
*/
|
|
59
|
+
export function createClaudeHealthCheck() {
|
|
60
|
+
const errorDetector = createClaudeErrorDetector();
|
|
61
|
+
return {
|
|
62
|
+
async check(options) {
|
|
63
|
+
const startTime = Date.now();
|
|
64
|
+
const timeoutMs = options?.timeoutMs ?? 30000; // 30 second timeout for health check
|
|
65
|
+
// Build environment
|
|
66
|
+
const env = { ...process.env };
|
|
67
|
+
if (options?.tier) {
|
|
68
|
+
const homeDir = process.env.HOME ?? process.env.USERPROFILE ?? '~';
|
|
69
|
+
env.CLAUDE_CONFIG_DIR = `${homeDir}/.claude-${options.tier}`;
|
|
70
|
+
}
|
|
71
|
+
// Minimal prompt that should succeed quickly if API is healthy
|
|
72
|
+
const healthPrompt = 'Reply with exactly: OK';
|
|
73
|
+
return new Promise((resolve) => {
|
|
74
|
+
let proc;
|
|
75
|
+
let stdout = '';
|
|
76
|
+
let stderr = '';
|
|
77
|
+
// Use Docker sandbox if enabled
|
|
78
|
+
if (options?.sandbox) {
|
|
79
|
+
const apiKey = getApiKey(options?.tier);
|
|
80
|
+
const dockerArgs = [
|
|
81
|
+
'run',
|
|
82
|
+
'--rm',
|
|
83
|
+
'-w', '/workspace',
|
|
84
|
+
'-v', `${process.cwd()}:/workspace`,
|
|
85
|
+
];
|
|
86
|
+
if (apiKey) {
|
|
87
|
+
dockerArgs.push('-e', `ANTHROPIC_API_KEY=${apiKey}`);
|
|
88
|
+
}
|
|
89
|
+
dockerArgs.push(SANDBOX_IMAGE);
|
|
90
|
+
dockerArgs.push('claude', '-p', healthPrompt, '--dangerously-skip-permissions');
|
|
91
|
+
proc = spawn('docker', dockerArgs, { stdio: ['pipe', 'pipe', 'pipe'] });
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
proc = spawn('claude', ['-p', healthPrompt], {
|
|
95
|
+
env,
|
|
96
|
+
stdio: ['pipe', 'pipe', 'pipe']
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
// Close stdin
|
|
100
|
+
proc.stdin?.end();
|
|
101
|
+
// Set timeout
|
|
102
|
+
const timeoutId = setTimeout(() => {
|
|
103
|
+
proc.kill('SIGTERM');
|
|
104
|
+
resolve({
|
|
105
|
+
healthy: false,
|
|
106
|
+
message: 'Health check timed out. Claude API may be slow or unreachable.',
|
|
107
|
+
error: {
|
|
108
|
+
code: 'NETWORK_ERROR',
|
|
109
|
+
message: 'Health check timed out',
|
|
110
|
+
recoverable: true,
|
|
111
|
+
suggestion: 'Check your internet connection and try again'
|
|
112
|
+
},
|
|
113
|
+
durationMs: Date.now() - startTime
|
|
114
|
+
});
|
|
115
|
+
}, timeoutMs);
|
|
116
|
+
// Capture output
|
|
117
|
+
proc.stdout?.on('data', (data) => {
|
|
118
|
+
stdout += data.toString();
|
|
119
|
+
});
|
|
120
|
+
proc.stderr?.on('data', (data) => {
|
|
121
|
+
stderr += data.toString();
|
|
122
|
+
});
|
|
123
|
+
// Handle completion
|
|
124
|
+
proc.on('close', (code) => {
|
|
125
|
+
clearTimeout(timeoutId);
|
|
126
|
+
const durationMs = Date.now() - startTime;
|
|
127
|
+
// Check for known errors
|
|
128
|
+
const claudeError = errorDetector.detect(stdout, stderr);
|
|
129
|
+
if (claudeError) {
|
|
130
|
+
resolve({
|
|
131
|
+
healthy: false,
|
|
132
|
+
error: claudeError,
|
|
133
|
+
message: errorDetector.formatErrorMessage(claudeError),
|
|
134
|
+
durationMs
|
|
135
|
+
});
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
// Check exit code
|
|
139
|
+
if (code !== 0) {
|
|
140
|
+
// Generic failure - extract first line of stderr or stdout
|
|
141
|
+
const errorLine = (stderr || stdout).trim().split('\n')[0] || 'Unknown error';
|
|
142
|
+
resolve({
|
|
143
|
+
healthy: false,
|
|
144
|
+
error: {
|
|
145
|
+
code: 'UNKNOWN',
|
|
146
|
+
message: errorLine,
|
|
147
|
+
recoverable: false,
|
|
148
|
+
suggestion: 'Check Claude CLI configuration and try again'
|
|
149
|
+
},
|
|
150
|
+
message: errorLine,
|
|
151
|
+
durationMs
|
|
152
|
+
});
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
// Success
|
|
156
|
+
resolve({
|
|
157
|
+
healthy: true,
|
|
158
|
+
message: 'API is ready',
|
|
159
|
+
durationMs
|
|
160
|
+
});
|
|
161
|
+
});
|
|
162
|
+
// Handle spawn errors
|
|
163
|
+
proc.on('error', (error) => {
|
|
164
|
+
clearTimeout(timeoutId);
|
|
165
|
+
const durationMs = Date.now() - startTime;
|
|
166
|
+
// Check if Claude CLI is not installed
|
|
167
|
+
if (error.message.includes('ENOENT')) {
|
|
168
|
+
resolve({
|
|
169
|
+
healthy: false,
|
|
170
|
+
error: {
|
|
171
|
+
code: 'AUTH_FAILED',
|
|
172
|
+
message: 'Claude CLI not found',
|
|
173
|
+
recoverable: false,
|
|
174
|
+
suggestion: 'Install Claude CLI: npm install -g @anthropic-ai/claude-cli'
|
|
175
|
+
},
|
|
176
|
+
message: 'Claude CLI is not installed',
|
|
177
|
+
durationMs
|
|
178
|
+
});
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
resolve({
|
|
182
|
+
healthy: false,
|
|
183
|
+
error: {
|
|
184
|
+
code: 'NETWORK_ERROR',
|
|
185
|
+
message: error.message,
|
|
186
|
+
recoverable: true,
|
|
187
|
+
suggestion: 'Check your system configuration'
|
|
188
|
+
},
|
|
189
|
+
message: error.message,
|
|
190
|
+
durationMs
|
|
191
|
+
});
|
|
192
|
+
});
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
//# sourceMappingURL=ClaudeHealthCheck.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ClaudeHealthCheck.js","sourceRoot":"","sources":["../../src/services/ClaudeHealthCheck.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Commit Service
|
|
3
|
+
* Task 3.1: Create commit service with stage and commit capabilities
|
|
4
|
+
* Requirements: 1.6, 5.3, 5.7
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Commit result interface
|
|
8
|
+
* Requirements: 5.3 - Return commit hash on success
|
|
9
|
+
*/
|
|
10
|
+
export interface CommitResult {
|
|
11
|
+
readonly success: boolean;
|
|
12
|
+
readonly commitHash: string | undefined;
|
|
13
|
+
readonly error: string | undefined;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Commit service interface
|
|
17
|
+
* Requirements: 1.6, 5.3, 5.7
|
|
18
|
+
*/
|
|
19
|
+
export interface CommitServiceInterface {
|
|
20
|
+
stageAll(workingDir: string): Promise<CommitResult>;
|
|
21
|
+
commit(workingDir: string, message: string): Promise<CommitResult>;
|
|
22
|
+
stageAndCommit(workingDir: string, message: string): Promise<CommitResult>;
|
|
23
|
+
formatTaskCommitMessage(feature: string, taskIndex: number, taskTitle: string): string;
|
|
24
|
+
formatPhaseCommitMessage(feature: string, phase: string): string;
|
|
25
|
+
/**
|
|
26
|
+
* Count commits on current branch since branching from base
|
|
27
|
+
* Returns 0 if unable to determine
|
|
28
|
+
*/
|
|
29
|
+
countFeatureCommits(workingDir: string, baseBranch?: string): Promise<number>;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Create commit service
|
|
33
|
+
* Requirements: 1.6, 5.3, 5.7 - Factory function for git commit operations
|
|
34
|
+
*/
|
|
35
|
+
export declare function createCommitService(): CommitServiceInterface;
|
|
36
|
+
//# sourceMappingURL=CommitService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CommitService.d.ts","sourceRoot":"","sources":["../../src/services/CommitService.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;IACxC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;CACpC;AAED;;;GAGG;AACH,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IACpD,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IACnE,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IAC3E,uBAAuB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC;IACvF,wBAAwB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;IACjE;;;OAGG;IACH,mBAAmB,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CAC/E;AAyDD;;;GAGG;AACH,wBAAgB,mBAAmB,IAAI,sBAAsB,CAqH5D"}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Commit Service
|
|
3
|
+
* Task 3.1: Create commit service with stage and commit capabilities
|
|
4
|
+
* Requirements: 1.6, 5.3, 5.7
|
|
5
|
+
*/
|
|
6
|
+
import { spawn } from 'node:child_process';
|
|
7
|
+
/**
|
|
8
|
+
* Execute git command and return result
|
|
9
|
+
*/
|
|
10
|
+
function execGit(args, cwd) {
|
|
11
|
+
return new Promise((resolve) => {
|
|
12
|
+
const process = spawn('git', args, {
|
|
13
|
+
cwd,
|
|
14
|
+
stdio: ['pipe', 'pipe', 'pipe']
|
|
15
|
+
});
|
|
16
|
+
let stdout = '';
|
|
17
|
+
let stderr = '';
|
|
18
|
+
process.stdout?.on('data', (data) => {
|
|
19
|
+
stdout += data.toString();
|
|
20
|
+
});
|
|
21
|
+
process.stderr?.on('data', (data) => {
|
|
22
|
+
stderr += data.toString();
|
|
23
|
+
});
|
|
24
|
+
process.on('close', (code) => {
|
|
25
|
+
resolve({ stdout, stderr, exitCode: code ?? 0 });
|
|
26
|
+
});
|
|
27
|
+
process.on('error', (error) => {
|
|
28
|
+
resolve({
|
|
29
|
+
stdout,
|
|
30
|
+
stderr: stderr || `Git error: ${error.message}`,
|
|
31
|
+
exitCode: -1
|
|
32
|
+
});
|
|
33
|
+
});
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Extract commit hash from git commit output
|
|
38
|
+
* Format: [branch hash] message
|
|
39
|
+
*/
|
|
40
|
+
function extractCommitHash(output) {
|
|
41
|
+
// Match pattern like [main abc1234] or [feature/test deadbeef]
|
|
42
|
+
const match = output.match(/\[[\w\/-]+\s+([a-f0-9]+)\]/);
|
|
43
|
+
return match?.[1];
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Check if output indicates no changes to commit
|
|
47
|
+
*/
|
|
48
|
+
function isNothingToCommit(stderr) {
|
|
49
|
+
return stderr.includes('nothing to commit') || stderr.includes('working tree clean');
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Create commit service
|
|
53
|
+
* Requirements: 1.6, 5.3, 5.7 - Factory function for git commit operations
|
|
54
|
+
*/
|
|
55
|
+
export function createCommitService() {
|
|
56
|
+
return {
|
|
57
|
+
/**
|
|
58
|
+
* Stage all changes in working directory
|
|
59
|
+
* Requirements: 5.3 - Stage all changes using git add
|
|
60
|
+
*/
|
|
61
|
+
async stageAll(workingDir) {
|
|
62
|
+
const result = await execGit(['add', '-A'], workingDir);
|
|
63
|
+
if (result.exitCode !== 0) {
|
|
64
|
+
return {
|
|
65
|
+
success: false,
|
|
66
|
+
commitHash: undefined,
|
|
67
|
+
error: result.stderr || 'Failed to stage changes'
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
return {
|
|
71
|
+
success: true,
|
|
72
|
+
commitHash: undefined,
|
|
73
|
+
error: undefined
|
|
74
|
+
};
|
|
75
|
+
},
|
|
76
|
+
/**
|
|
77
|
+
* Create commit with provided message
|
|
78
|
+
* Requirements: 5.3 - Create commit using git commit
|
|
79
|
+
* Requirements: 5.7 - Handle empty commits gracefully
|
|
80
|
+
*/
|
|
81
|
+
async commit(workingDir, message) {
|
|
82
|
+
const result = await execGit(['commit', '-m', message], workingDir);
|
|
83
|
+
// Handle "nothing to commit" as success (no-op)
|
|
84
|
+
if (result.exitCode !== 0 && isNothingToCommit(result.stderr)) {
|
|
85
|
+
return {
|
|
86
|
+
success: true,
|
|
87
|
+
commitHash: undefined,
|
|
88
|
+
error: undefined
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
if (result.exitCode !== 0) {
|
|
92
|
+
return {
|
|
93
|
+
success: false,
|
|
94
|
+
commitHash: undefined,
|
|
95
|
+
error: result.stderr || 'Failed to commit changes'
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
const commitHash = extractCommitHash(result.stdout);
|
|
99
|
+
return {
|
|
100
|
+
success: true,
|
|
101
|
+
commitHash,
|
|
102
|
+
error: undefined
|
|
103
|
+
};
|
|
104
|
+
},
|
|
105
|
+
/**
|
|
106
|
+
* Stage and commit in single atomic operation
|
|
107
|
+
* Requirements: 5.3 - Combine stage and commit
|
|
108
|
+
*/
|
|
109
|
+
async stageAndCommit(workingDir, message) {
|
|
110
|
+
// Stage all changes
|
|
111
|
+
const stageResult = await this.stageAll(workingDir);
|
|
112
|
+
if (!stageResult.success) {
|
|
113
|
+
return stageResult;
|
|
114
|
+
}
|
|
115
|
+
// Commit changes
|
|
116
|
+
return this.commit(workingDir, message);
|
|
117
|
+
},
|
|
118
|
+
/**
|
|
119
|
+
* Format commit message for task completion
|
|
120
|
+
* Requirements: 5.7 - Generate meaningful commit messages
|
|
121
|
+
*/
|
|
122
|
+
formatTaskCommitMessage(feature, taskIndex, taskTitle) {
|
|
123
|
+
return `feat(${feature}): implement task ${taskIndex} - ${taskTitle}`;
|
|
124
|
+
},
|
|
125
|
+
/**
|
|
126
|
+
* Format commit message for phase completion
|
|
127
|
+
* Requirements: 1.6 - Commit changes at each phase
|
|
128
|
+
*/
|
|
129
|
+
formatPhaseCommitMessage(feature, phase) {
|
|
130
|
+
return `feat(${feature}): complete ${phase} phase`;
|
|
131
|
+
},
|
|
132
|
+
/**
|
|
133
|
+
* Count commits on current branch since branching from base
|
|
134
|
+
* Uses git rev-list to count commits not in base branch
|
|
135
|
+
*/
|
|
136
|
+
async countFeatureCommits(workingDir, baseBranch) {
|
|
137
|
+
// Try to determine base branch if not specified
|
|
138
|
+
const base = baseBranch ?? 'main';
|
|
139
|
+
// First check if base branch exists
|
|
140
|
+
const checkResult = await execGit(['rev-parse', '--verify', base], workingDir);
|
|
141
|
+
if (checkResult.exitCode !== 0) {
|
|
142
|
+
// Try 'master' as fallback
|
|
143
|
+
const masterCheck = await execGit(['rev-parse', '--verify', 'master'], workingDir);
|
|
144
|
+
if (masterCheck.exitCode !== 0) {
|
|
145
|
+
// Can't determine base, return total commits on current branch
|
|
146
|
+
const totalResult = await execGit(['rev-list', '--count', 'HEAD'], workingDir);
|
|
147
|
+
return totalResult.exitCode === 0 ? parseInt(totalResult.stdout.trim(), 10) || 0 : 0;
|
|
148
|
+
}
|
|
149
|
+
// Use master as base
|
|
150
|
+
const result = await execGit(['rev-list', '--count', 'HEAD', '^master'], workingDir);
|
|
151
|
+
return result.exitCode === 0 ? parseInt(result.stdout.trim(), 10) || 0 : 0;
|
|
152
|
+
}
|
|
153
|
+
// Count commits not in base branch
|
|
154
|
+
const result = await execGit(['rev-list', '--count', 'HEAD', `^${base}`], workingDir);
|
|
155
|
+
return result.exitCode === 0 ? parseInt(result.stdout.trim(), 10) || 0 : 0;
|
|
156
|
+
}
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
//# sourceMappingURL=CommitService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CommitService.js","sourceRoot":"","sources":["../../src/services/CommitService.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Config service for init configuration management
|
|
3
|
+
* Requirements: 2.7
|
|
4
|
+
*/
|
|
5
|
+
import type { CodingAgent } from '../types/index.js';
|
|
6
|
+
/**
|
|
7
|
+
* Project type options
|
|
8
|
+
*/
|
|
9
|
+
export type ProjectType = 'web-app' | 'cli-tool' | 'library' | 'api' | 'other';
|
|
10
|
+
/**
|
|
11
|
+
* Init configuration structure
|
|
12
|
+
* Task 4.1: Configuration read/write operations
|
|
13
|
+
*/
|
|
14
|
+
export interface InitConfig {
|
|
15
|
+
readonly version: string;
|
|
16
|
+
readonly repo: string;
|
|
17
|
+
readonly stack: string;
|
|
18
|
+
readonly projectType: ProjectType;
|
|
19
|
+
readonly projectName: string;
|
|
20
|
+
readonly description: string;
|
|
21
|
+
readonly initializedAt: string;
|
|
22
|
+
readonly customValues: Record<string, string>;
|
|
23
|
+
readonly agent: CodingAgent;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Config service interface
|
|
27
|
+
* Requirements: 2.7
|
|
28
|
+
*/
|
|
29
|
+
export interface ConfigService {
|
|
30
|
+
/**
|
|
31
|
+
* Load config from .red64/config.json
|
|
32
|
+
* @returns null if file does not exist
|
|
33
|
+
*/
|
|
34
|
+
load(baseDir: string): Promise<InitConfig | null>;
|
|
35
|
+
/**
|
|
36
|
+
* Save config to .red64/config.json
|
|
37
|
+
*/
|
|
38
|
+
save(baseDir: string, config: InitConfig): Promise<void>;
|
|
39
|
+
/**
|
|
40
|
+
* Check if project is initialized
|
|
41
|
+
*/
|
|
42
|
+
isInitialized(baseDir: string): Promise<boolean>;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Create config service
|
|
46
|
+
* Task 4.1: Config service factory
|
|
47
|
+
*/
|
|
48
|
+
export declare function createConfigService(): ConfigService;
|
|
49
|
+
//# sourceMappingURL=ConfigService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConfigService.d.ts","sourceRoot":"","sources":["../../src/services/ConfigService.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,UAAU,GAAG,SAAS,GAAG,KAAK,GAAG,OAAO,CAAC;AAE/E;;;GAGG;AACH,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;IAClC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9C,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;CAC7B;AAED;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B;;;OAGG;IACH,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;IAElD;;OAEG;IACH,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEzD;;OAEG;IACH,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAClD;AAqBD;;;GAGG;AACH,wBAAgB,mBAAmB,IAAI,aAAa,CA+BnD"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Config service for init configuration management
|
|
3
|
+
* Requirements: 2.7
|
|
4
|
+
*/
|
|
5
|
+
import { mkdir, readFile, writeFile, access } from 'node:fs/promises';
|
|
6
|
+
import { join } from 'node:path';
|
|
7
|
+
/**
|
|
8
|
+
* Get config file path
|
|
9
|
+
*/
|
|
10
|
+
function getConfigPath(baseDir) {
|
|
11
|
+
return join(baseDir, '.red64', 'config.json');
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Check if file exists
|
|
15
|
+
*/
|
|
16
|
+
async function fileExists(path) {
|
|
17
|
+
try {
|
|
18
|
+
await access(path);
|
|
19
|
+
return true;
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
return false;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Create config service
|
|
27
|
+
* Task 4.1: Config service factory
|
|
28
|
+
*/
|
|
29
|
+
export function createConfigService() {
|
|
30
|
+
return {
|
|
31
|
+
async load(baseDir) {
|
|
32
|
+
const configPath = getConfigPath(baseDir);
|
|
33
|
+
try {
|
|
34
|
+
const content = await readFile(configPath, 'utf-8');
|
|
35
|
+
const config = JSON.parse(content);
|
|
36
|
+
return config;
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
},
|
|
42
|
+
async save(baseDir, config) {
|
|
43
|
+
const configPath = getConfigPath(baseDir);
|
|
44
|
+
const red64Dir = join(baseDir, '.red64');
|
|
45
|
+
// Ensure .red64 directory exists
|
|
46
|
+
await mkdir(red64Dir, { recursive: true });
|
|
47
|
+
// Write config with pretty formatting
|
|
48
|
+
const content = JSON.stringify(config, null, 2);
|
|
49
|
+
await writeFile(configPath, content, 'utf-8');
|
|
50
|
+
},
|
|
51
|
+
async isInitialized(baseDir) {
|
|
52
|
+
const configPath = getConfigPath(baseDir);
|
|
53
|
+
return fileExists(configPath);
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=ConfigService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConfigService.js","sourceRoot":"","sources":["../../src/services/ConfigService.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AA8CjC;;GAEG;AACH,SAAS,aAAa,CAAC,OAAe;IACpC,OAAO,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC;AAChD,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,UAAU,CAAC,IAAY;IACpC,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;QACnB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB;IACjC,OAAO;QACL,KAAK,CAAC,IAAI,CAAC,OAAe;YACxB,MAAM,UAAU,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;YAE1C,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;gBACpD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAe,CAAC;gBACjD,OAAO,MAAM,CAAC;YAChB,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,OAAe,EAAE,MAAkB;YAC5C,MAAM,UAAU,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;YAC1C,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;YAEzC,iCAAiC;YACjC,MAAM,KAAK,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAE3C,sCAAsC;YACtC,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;YAChD,MAAM,SAAS,CAAC,UAAU,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QAChD,CAAC;QAED,KAAK,CAAC,aAAa,CAAC,OAAe;YACjC,MAAM,UAAU,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;YAC1C,OAAO,UAAU,CAAC,UAAU,CAAC,CAAC;QAChC,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Docker Runner service for sandboxed command execution
|
|
3
|
+
* Runs Claude CLI commands inside a Docker container for isolation
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Docker run options
|
|
7
|
+
*/
|
|
8
|
+
export interface DockerRunOptions {
|
|
9
|
+
readonly image?: string;
|
|
10
|
+
readonly workingDirectory: string;
|
|
11
|
+
readonly command: string;
|
|
12
|
+
readonly args: readonly string[];
|
|
13
|
+
readonly env?: Record<string, string>;
|
|
14
|
+
readonly timeout?: number;
|
|
15
|
+
readonly onOutput?: (chunk: string) => void;
|
|
16
|
+
readonly onError?: (chunk: string) => void;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Docker run result
|
|
20
|
+
*/
|
|
21
|
+
export interface DockerRunResult {
|
|
22
|
+
readonly success: boolean;
|
|
23
|
+
readonly exitCode: number;
|
|
24
|
+
readonly stdout: string;
|
|
25
|
+
readonly stderr: string;
|
|
26
|
+
readonly timedOut: boolean;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Docker runner service interface
|
|
30
|
+
*/
|
|
31
|
+
export interface DockerRunnerService {
|
|
32
|
+
run(options: DockerRunOptions): Promise<DockerRunResult>;
|
|
33
|
+
isAvailable(): Promise<boolean>;
|
|
34
|
+
buildImage(dockerfilePath: string, imageName?: string): Promise<boolean>;
|
|
35
|
+
abort(): void;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Create Docker runner service
|
|
39
|
+
*/
|
|
40
|
+
export declare function createDockerRunner(): DockerRunnerService;
|
|
41
|
+
/**
|
|
42
|
+
* Check if sandbox image is available, build if not
|
|
43
|
+
*/
|
|
44
|
+
export declare function ensureSandboxImage(dockerfilePath?: string): Promise<boolean>;
|
|
45
|
+
//# sourceMappingURL=DockerRunner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DockerRunner.d.ts","sourceRoot":"","sources":["../../src/services/DockerRunner.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5C,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CAC5C;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,GAAG,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IACzD,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAChC,UAAU,CAAC,cAAc,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACzE,KAAK,IAAI,IAAI,CAAC;CACf;AA0BD;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,mBAAmB,CAgJxD;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,cAAc,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAYlF"}
|