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,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cache service for offline download caching
|
|
3
|
+
* Requirements: 6.5, 6.6
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Cache entry metadata
|
|
7
|
+
*/
|
|
8
|
+
export interface CacheEntry {
|
|
9
|
+
readonly repo: string;
|
|
10
|
+
readonly version: string;
|
|
11
|
+
readonly path: string;
|
|
12
|
+
readonly cachedAt: string;
|
|
13
|
+
readonly size: number;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Cache service configuration
|
|
17
|
+
*/
|
|
18
|
+
export interface CacheServiceConfig {
|
|
19
|
+
readonly cacheDir?: string;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Cache service interface
|
|
23
|
+
* Requirements: 6.5-6.8
|
|
24
|
+
*/
|
|
25
|
+
export interface CacheService {
|
|
26
|
+
/**
|
|
27
|
+
* Get cache directory path (platform-specific)
|
|
28
|
+
*/
|
|
29
|
+
getCacheDir(): string;
|
|
30
|
+
/**
|
|
31
|
+
* Check if valid cache entry exists for version
|
|
32
|
+
*/
|
|
33
|
+
has(repo: string, version: string): Promise<boolean>;
|
|
34
|
+
/**
|
|
35
|
+
* Get cached tarball path
|
|
36
|
+
* @throws CacheError if entry does not exist
|
|
37
|
+
*/
|
|
38
|
+
get(repo: string, version: string): Promise<CacheEntry>;
|
|
39
|
+
/**
|
|
40
|
+
* Store tarball in cache
|
|
41
|
+
*/
|
|
42
|
+
set(repo: string, version: string, tarballPath: string): Promise<CacheEntry>;
|
|
43
|
+
/**
|
|
44
|
+
* Clear cache entries older than maxAge
|
|
45
|
+
*/
|
|
46
|
+
prune(maxAgeMs: number): Promise<number>;
|
|
47
|
+
/**
|
|
48
|
+
* Clear all cache entries
|
|
49
|
+
*/
|
|
50
|
+
clear(): Promise<void>;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Create cache service
|
|
54
|
+
* Task 1.1, 1.2: Cache service factory with platform detection and entry management
|
|
55
|
+
*/
|
|
56
|
+
export declare function createCacheService(config?: CacheServiceConfig): CacheService;
|
|
57
|
+
//# sourceMappingURL=CacheService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CacheService.d.ts","sourceRoot":"","sources":["../../src/services/CacheService.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AASD;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B;;OAEG;IACH,WAAW,IAAI,MAAM,CAAC;IAEtB;;OAEG;IACH,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAErD;;;OAGG;IACH,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAExD;;OAEG;IACH,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAE7E;;OAEG;IACH,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAEzC;;OAEG;IACH,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAsGD;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,GAAE,kBAAuB,GAAG,YAAY,CAiIhF"}
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cache service for offline download caching
|
|
3
|
+
* Requirements: 6.5, 6.6
|
|
4
|
+
*/
|
|
5
|
+
import { mkdir, readFile, writeFile, rm, access, copyFile, stat } from 'node:fs/promises';
|
|
6
|
+
import { homedir, tmpdir } from 'node:os';
|
|
7
|
+
import { join } from 'node:path';
|
|
8
|
+
/**
|
|
9
|
+
* Get platform-specific cache directory
|
|
10
|
+
* Task 1.1: Platform-specific cache directory resolution
|
|
11
|
+
*/
|
|
12
|
+
function getPlatformCacheDir() {
|
|
13
|
+
const currentPlatform = process.platform;
|
|
14
|
+
try {
|
|
15
|
+
const home = homedir();
|
|
16
|
+
switch (currentPlatform) {
|
|
17
|
+
case 'darwin':
|
|
18
|
+
// macOS: ~/Library/Caches/red64
|
|
19
|
+
return join(home, 'Library', 'Caches', 'red64');
|
|
20
|
+
case 'linux':
|
|
21
|
+
// Linux: $XDG_CACHE_HOME/red64 or ~/.cache/red64
|
|
22
|
+
const xdgCacheHome = process.env.XDG_CACHE_HOME;
|
|
23
|
+
if (xdgCacheHome) {
|
|
24
|
+
return join(xdgCacheHome, 'red64');
|
|
25
|
+
}
|
|
26
|
+
return join(home, '.cache', 'red64');
|
|
27
|
+
case 'win32':
|
|
28
|
+
// Windows: %LOCALAPPDATA%/red64
|
|
29
|
+
const localAppData = process.env.LOCALAPPDATA;
|
|
30
|
+
if (localAppData) {
|
|
31
|
+
return join(localAppData, 'red64');
|
|
32
|
+
}
|
|
33
|
+
return join(home, 'AppData', 'Local', 'red64');
|
|
34
|
+
default:
|
|
35
|
+
// Unknown platform: use home-based cache
|
|
36
|
+
return join(home, '.cache', 'red64');
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
// Fallback to temp directory when home cannot be determined
|
|
41
|
+
return join(tmpdir(), 'red64-cache');
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Get cache metadata file path
|
|
46
|
+
*/
|
|
47
|
+
function getCacheMetaPath(cacheDir) {
|
|
48
|
+
return join(cacheDir, 'cache.json');
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Generate tarball filename from repo and version
|
|
52
|
+
*/
|
|
53
|
+
function getTarballFilename(repo, version) {
|
|
54
|
+
// Convert owner/repo to owner-repo for filename
|
|
55
|
+
const safeRepo = repo.replace('/', '-');
|
|
56
|
+
return `${safeRepo}-${version}.tar.gz`;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Load cache metadata
|
|
60
|
+
*/
|
|
61
|
+
async function loadMetadata(cacheDir) {
|
|
62
|
+
const metaPath = getCacheMetaPath(cacheDir);
|
|
63
|
+
try {
|
|
64
|
+
const content = await readFile(metaPath, 'utf-8');
|
|
65
|
+
return JSON.parse(content);
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
return { entries: [] };
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Save cache metadata
|
|
73
|
+
*/
|
|
74
|
+
async function saveMetadata(cacheDir, metadata) {
|
|
75
|
+
const metaPath = getCacheMetaPath(cacheDir);
|
|
76
|
+
await mkdir(cacheDir, { recursive: true });
|
|
77
|
+
await writeFile(metaPath, JSON.stringify(metadata, null, 2), 'utf-8');
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Find entry in metadata
|
|
81
|
+
*/
|
|
82
|
+
function findEntry(metadata, repo, version) {
|
|
83
|
+
return metadata.entries.find(entry => entry.repo === repo && entry.version === version);
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Check if file exists
|
|
87
|
+
*/
|
|
88
|
+
async function fileExists(path) {
|
|
89
|
+
try {
|
|
90
|
+
await access(path);
|
|
91
|
+
return true;
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
return false;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Create cache service
|
|
99
|
+
* Task 1.1, 1.2: Cache service factory with platform detection and entry management
|
|
100
|
+
*/
|
|
101
|
+
export function createCacheService(config = {}) {
|
|
102
|
+
const cacheDir = config.cacheDir ?? getPlatformCacheDir();
|
|
103
|
+
return {
|
|
104
|
+
getCacheDir() {
|
|
105
|
+
return cacheDir;
|
|
106
|
+
},
|
|
107
|
+
async has(repo, version) {
|
|
108
|
+
const metadata = await loadMetadata(cacheDir);
|
|
109
|
+
const entry = findEntry(metadata, repo, version);
|
|
110
|
+
if (!entry) {
|
|
111
|
+
return false;
|
|
112
|
+
}
|
|
113
|
+
// Verify the file actually exists
|
|
114
|
+
return fileExists(entry.path);
|
|
115
|
+
},
|
|
116
|
+
async get(repo, version) {
|
|
117
|
+
const metadata = await loadMetadata(cacheDir);
|
|
118
|
+
const entry = findEntry(metadata, repo, version);
|
|
119
|
+
if (!entry) {
|
|
120
|
+
throw new Error('Cache entry not found');
|
|
121
|
+
}
|
|
122
|
+
// Verify the file exists
|
|
123
|
+
const exists = await fileExists(entry.path);
|
|
124
|
+
if (!exists) {
|
|
125
|
+
throw new Error('Cache entry not found');
|
|
126
|
+
}
|
|
127
|
+
return entry;
|
|
128
|
+
},
|
|
129
|
+
async set(repo, version, tarballPath) {
|
|
130
|
+
// Ensure cache directory exists
|
|
131
|
+
await mkdir(cacheDir, { recursive: true });
|
|
132
|
+
// Get file stats
|
|
133
|
+
const stats = await stat(tarballPath);
|
|
134
|
+
const size = stats.size;
|
|
135
|
+
// Determine destination path
|
|
136
|
+
const filename = getTarballFilename(repo, version);
|
|
137
|
+
const destPath = join(cacheDir, filename);
|
|
138
|
+
// Copy tarball to cache directory (if not already there)
|
|
139
|
+
if (tarballPath !== destPath) {
|
|
140
|
+
await copyFile(tarballPath, destPath);
|
|
141
|
+
}
|
|
142
|
+
// Create entry
|
|
143
|
+
const entry = {
|
|
144
|
+
repo,
|
|
145
|
+
version,
|
|
146
|
+
path: destPath,
|
|
147
|
+
cachedAt: new Date().toISOString(),
|
|
148
|
+
size
|
|
149
|
+
};
|
|
150
|
+
// Update metadata
|
|
151
|
+
const metadata = await loadMetadata(cacheDir);
|
|
152
|
+
const existingIndex = metadata.entries.findIndex(e => e.repo === repo && e.version === version);
|
|
153
|
+
if (existingIndex >= 0) {
|
|
154
|
+
// Update existing entry
|
|
155
|
+
metadata.entries[existingIndex] = entry;
|
|
156
|
+
}
|
|
157
|
+
else {
|
|
158
|
+
// Add new entry
|
|
159
|
+
metadata.entries.push(entry);
|
|
160
|
+
}
|
|
161
|
+
await saveMetadata(cacheDir, metadata);
|
|
162
|
+
return entry;
|
|
163
|
+
},
|
|
164
|
+
async prune(maxAgeMs) {
|
|
165
|
+
const metadata = await loadMetadata(cacheDir);
|
|
166
|
+
const now = Date.now();
|
|
167
|
+
const cutoff = now - maxAgeMs;
|
|
168
|
+
let removedCount = 0;
|
|
169
|
+
const remainingEntries = [];
|
|
170
|
+
for (const entry of metadata.entries) {
|
|
171
|
+
const cachedTime = new Date(entry.cachedAt).getTime();
|
|
172
|
+
if (cachedTime < cutoff) {
|
|
173
|
+
// Remove old entry
|
|
174
|
+
try {
|
|
175
|
+
await rm(entry.path, { force: true });
|
|
176
|
+
}
|
|
177
|
+
catch {
|
|
178
|
+
// Ignore removal errors
|
|
179
|
+
}
|
|
180
|
+
removedCount++;
|
|
181
|
+
}
|
|
182
|
+
else {
|
|
183
|
+
remainingEntries.push(entry);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
// Update metadata with remaining entries
|
|
187
|
+
metadata.entries = remainingEntries;
|
|
188
|
+
await saveMetadata(cacheDir, metadata);
|
|
189
|
+
return removedCount;
|
|
190
|
+
},
|
|
191
|
+
async clear() {
|
|
192
|
+
const metadata = await loadMetadata(cacheDir);
|
|
193
|
+
// Remove all cached files
|
|
194
|
+
for (const entry of metadata.entries) {
|
|
195
|
+
try {
|
|
196
|
+
await rm(entry.path, { force: true });
|
|
197
|
+
}
|
|
198
|
+
catch {
|
|
199
|
+
// Ignore removal errors
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
// Reset metadata
|
|
203
|
+
metadata.entries = [];
|
|
204
|
+
await saveMetadata(cacheDir, metadata);
|
|
205
|
+
}
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
//# sourceMappingURL=CacheService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CacheService.js","sourceRoot":"","sources":["../../src/services/CacheService.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAC1F,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAC1C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAgEjC;;;GAGG;AACH,SAAS,mBAAmB;IAC1B,MAAM,eAAe,GAAG,OAAO,CAAC,QAAQ,CAAC;IAEzC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;QAEvB,QAAQ,eAAe,EAAE,CAAC;YACxB,KAAK,QAAQ;gBACX,gCAAgC;gBAChC,OAAO,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;YAElD,KAAK,OAAO;gBACV,iDAAiD;gBACjD,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;gBAChD,IAAI,YAAY,EAAE,CAAC;oBACjB,OAAO,IAAI,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;gBACrC,CAAC;gBACD,OAAO,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;YAEvC,KAAK,OAAO;gBACV,gCAAgC;gBAChC,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;gBAC9C,IAAI,YAAY,EAAE,CAAC;oBACjB,OAAO,IAAI,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;gBACrC,CAAC;gBACD,OAAO,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;YAEjD;gBACE,yCAAyC;gBACzC,OAAO,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;QACzC,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,4DAA4D;QAC5D,OAAO,IAAI,CAAC,MAAM,EAAE,EAAE,aAAa,CAAC,CAAC;IACvC,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,gBAAgB,CAAC,QAAgB;IACxC,OAAO,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;AACtC,CAAC;AAED;;GAEG;AACH,SAAS,kBAAkB,CAAC,IAAY,EAAE,OAAe;IACvD,gDAAgD;IAChD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACxC,OAAO,GAAG,QAAQ,IAAI,OAAO,SAAS,CAAC;AACzC,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,YAAY,CAAC,QAAgB;IAC1C,MAAM,QAAQ,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAC5C,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAClD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAkB,CAAC;IAC9C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IACzB,CAAC;AACH,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,YAAY,CAAC,QAAgB,EAAE,QAAuB;IACnE,MAAM,QAAQ,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAC5C,MAAM,KAAK,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3C,MAAM,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AACxE,CAAC;AAED;;GAEG;AACH,SAAS,SAAS,CAAC,QAAuB,EAAE,IAAY,EAAE,OAAe;IACvE,OAAO,QAAQ,CAAC,OAAO,CAAC,IAAI,CAC1B,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,KAAK,OAAO,CAC1D,CAAC;AACJ,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,kBAAkB,CAAC,SAA6B,EAAE;IAChE,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,mBAAmB,EAAE,CAAC;IAE1D,OAAO;QACL,WAAW;YACT,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED,KAAK,CAAC,GAAG,CAAC,IAAY,EAAE,OAAe;YACrC,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,QAAQ,CAAC,CAAC;YAC9C,MAAM,KAAK,GAAG,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;YAEjD,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,OAAO,KAAK,CAAC;YACf,CAAC;YAED,kCAAkC;YAClC,OAAO,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAChC,CAAC;QAED,KAAK,CAAC,GAAG,CAAC,IAAY,EAAE,OAAe;YACrC,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,QAAQ,CAAC,CAAC;YAC9C,MAAM,KAAK,GAAG,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;YAEjD,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;YAC3C,CAAC;YAED,yBAAyB;YACzB,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC5C,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;YAC3C,CAAC;YAED,OAAO,KAAK,CAAC;QACf,CAAC;QAED,KAAK,CAAC,GAAG,CAAC,IAAY,EAAE,OAAe,EAAE,WAAmB;YAC1D,gCAAgC;YAChC,MAAM,KAAK,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAE3C,iBAAiB;YACjB,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,CAAC;YACtC,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;YAExB,6BAA6B;YAC7B,MAAM,QAAQ,GAAG,kBAAkB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YACnD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;YAE1C,yDAAyD;YACzD,IAAI,WAAW,KAAK,QAAQ,EAAE,CAAC;gBAC7B,MAAM,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;YACxC,CAAC;YAED,eAAe;YACf,MAAM,KAAK,GAAe;gBACxB,IAAI;gBACJ,OAAO;gBACP,IAAI,EAAE,QAAQ;gBACd,QAAQ,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBAClC,IAAI;aACL,CAAC;YAEF,kBAAkB;YAClB,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,QAAQ,CAAC,CAAC;YAC9C,MAAM,aAAa,GAAG,QAAQ,CAAC,OAAO,CAAC,SAAS,CAC9C,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,CAAC,OAAO,KAAK,OAAO,CAC9C,CAAC;YAEF,IAAI,aAAa,IAAI,CAAC,EAAE,CAAC;gBACvB,wBAAwB;gBACxB,QAAQ,CAAC,OAAO,CAAC,aAAa,CAAC,GAAG,KAAK,CAAC;YAC1C,CAAC;iBAAM,CAAC;gBACN,gBAAgB;gBAChB,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC/B,CAAC;YAED,MAAM,YAAY,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;YAEvC,OAAO,KAAK,CAAC;QACf,CAAC;QAED,KAAK,CAAC,KAAK,CAAC,QAAgB;YAC1B,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,QAAQ,CAAC,CAAC;YAC9C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACvB,MAAM,MAAM,GAAG,GAAG,GAAG,QAAQ,CAAC;YAE9B,IAAI,YAAY,GAAG,CAAC,CAAC;YACrB,MAAM,gBAAgB,GAAiB,EAAE,CAAC;YAE1C,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;gBACrC,MAAM,UAAU,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,OAAO,EAAE,CAAC;gBACtD,IAAI,UAAU,GAAG,MAAM,EAAE,CAAC;oBACxB,mBAAmB;oBACnB,IAAI,CAAC;wBACH,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;oBACxC,CAAC;oBAAC,MAAM,CAAC;wBACP,wBAAwB;oBAC1B,CAAC;oBACD,YAAY,EAAE,CAAC;gBACjB,CAAC;qBAAM,CAAC;oBACN,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAC/B,CAAC;YACH,CAAC;YAED,yCAAyC;YACzC,QAAQ,CAAC,OAAO,GAAG,gBAAgB,CAAC;YACpC,MAAM,YAAY,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;YAEvC,OAAO,YAAY,CAAC;QACtB,CAAC;QAED,KAAK,CAAC,KAAK;YACT,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,QAAQ,CAAC,CAAC;YAE9C,0BAA0B;YAC1B,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;gBACrC,IAAI,CAAC;oBACH,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;gBACxC,CAAC;gBAAC,MAAM,CAAC;oBACP,wBAAwB;gBAC1B,CAAC;YACH,CAAC;YAED,iBAAiB;YACjB,QAAQ,CAAC,OAAO,GAAG,EAAE,CAAC;YACtB,MAAM,YAAY,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QACzC,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Claude CLI Error Detection Service
|
|
3
|
+
* Parses stdout/stderr from Claude CLI to identify specific error conditions
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Error codes for Claude CLI-specific failures
|
|
7
|
+
*/
|
|
8
|
+
export type ClaudeErrorCode = 'CREDIT_EXHAUSTED' | 'RATE_LIMITED' | 'AUTH_FAILED' | 'MODEL_UNAVAILABLE' | 'CONTEXT_EXCEEDED' | 'NETWORK_ERROR' | 'PERMISSION_DENIED' | 'UNKNOWN';
|
|
9
|
+
/**
|
|
10
|
+
* Parsed Claude error with actionable information
|
|
11
|
+
*/
|
|
12
|
+
export interface ClaudeError {
|
|
13
|
+
readonly code: ClaudeErrorCode;
|
|
14
|
+
readonly message: string;
|
|
15
|
+
readonly recoverable: boolean;
|
|
16
|
+
readonly suggestion: string;
|
|
17
|
+
readonly retryAfterMs?: number;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Claude Error Detector Service
|
|
21
|
+
*/
|
|
22
|
+
export interface ClaudeErrorDetectorService {
|
|
23
|
+
/**
|
|
24
|
+
* Parse stdout and stderr to detect Claude-specific errors
|
|
25
|
+
* @returns ClaudeError if a known error pattern is detected, null otherwise
|
|
26
|
+
*/
|
|
27
|
+
detect(stdout: string, stderr: string): ClaudeError | null;
|
|
28
|
+
/**
|
|
29
|
+
* Check if error is fatal (non-recoverable)
|
|
30
|
+
*/
|
|
31
|
+
isFatal(error: ClaudeError): boolean;
|
|
32
|
+
/**
|
|
33
|
+
* Check if error warrants automatic retry
|
|
34
|
+
*/
|
|
35
|
+
shouldRetry(error: ClaudeError): boolean;
|
|
36
|
+
/**
|
|
37
|
+
* Get user-friendly error message
|
|
38
|
+
*/
|
|
39
|
+
formatErrorMessage(error: ClaudeError): string;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Create Claude error detector service
|
|
43
|
+
*/
|
|
44
|
+
export declare function createClaudeErrorDetector(): ClaudeErrorDetectorService;
|
|
45
|
+
//# sourceMappingURL=ClaudeErrorDetector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ClaudeErrorDetector.d.ts","sourceRoot":"","sources":["../../src/services/ClaudeErrorDetector.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AACH,MAAM,MAAM,eAAe,GACvB,kBAAkB,GAClB,cAAc,GACd,aAAa,GACb,mBAAmB,GACnB,kBAAkB,GAClB,eAAe,GACf,mBAAmB,GACnB,SAAS,CAAC;AAEd;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC;IAC/B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;IAC9B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;CAChC;AAoKD;;GAEG;AACH,MAAM,WAAW,0BAA0B;IACzC;;;OAGG;IACH,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAAC;IAE3D;;OAEG;IACH,OAAO,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC;IAErC;;OAEG;IACH,WAAW,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC;IAEzC;;OAEG;IACH,kBAAkB,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,CAAC;CAChD;AAED;;GAEG;AACH,wBAAgB,yBAAyB,IAAI,0BAA0B,CA0CtE"}
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Claude CLI Error Detection Service
|
|
3
|
+
* Parses stdout/stderr from Claude CLI to identify specific error conditions
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Error detection patterns
|
|
7
|
+
* Order matters: more specific patterns should come first
|
|
8
|
+
*/
|
|
9
|
+
const ERROR_PATTERNS = [
|
|
10
|
+
// Credit/billing errors
|
|
11
|
+
{
|
|
12
|
+
pattern: /credit balance is too low/i,
|
|
13
|
+
code: 'CREDIT_EXHAUSTED',
|
|
14
|
+
recoverable: false,
|
|
15
|
+
suggestion: 'Add credits at console.anthropic.com/settings/billing'
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
pattern: /insufficient credits/i,
|
|
19
|
+
code: 'CREDIT_EXHAUSTED',
|
|
20
|
+
recoverable: false,
|
|
21
|
+
suggestion: 'Add credits at console.anthropic.com/settings/billing'
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
pattern: /billing.*(?:issue|error|problem)/i,
|
|
25
|
+
code: 'CREDIT_EXHAUSTED',
|
|
26
|
+
recoverable: false,
|
|
27
|
+
suggestion: 'Check your billing status at console.anthropic.com/settings/billing'
|
|
28
|
+
},
|
|
29
|
+
// Rate limiting
|
|
30
|
+
{
|
|
31
|
+
pattern: /rate limit exceeded/i,
|
|
32
|
+
code: 'RATE_LIMITED',
|
|
33
|
+
recoverable: true,
|
|
34
|
+
suggestion: 'Wait a moment and retry, or reduce concurrent requests'
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
pattern: /too many requests/i,
|
|
38
|
+
code: 'RATE_LIMITED',
|
|
39
|
+
recoverable: true,
|
|
40
|
+
suggestion: 'Wait a moment and retry'
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
pattern: /retry.after.*?(\d+)/i,
|
|
44
|
+
code: 'RATE_LIMITED',
|
|
45
|
+
recoverable: true,
|
|
46
|
+
suggestion: 'Waiting for rate limit to reset...',
|
|
47
|
+
extractRetryAfter: (match) => {
|
|
48
|
+
const seconds = parseInt(match[1], 10);
|
|
49
|
+
return isNaN(seconds) ? undefined : seconds * 1000;
|
|
50
|
+
}
|
|
51
|
+
},
|
|
52
|
+
// Authentication errors
|
|
53
|
+
{
|
|
54
|
+
pattern: /invalid.*api.?key/i,
|
|
55
|
+
code: 'AUTH_FAILED',
|
|
56
|
+
recoverable: false,
|
|
57
|
+
suggestion: 'Check your ANTHROPIC_API_KEY environment variable or Claude config'
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
pattern: /authentication.*(?:failed|error|invalid)/i,
|
|
61
|
+
code: 'AUTH_FAILED',
|
|
62
|
+
recoverable: false,
|
|
63
|
+
suggestion: 'Verify your API key is correct and active'
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
pattern: /unauthorized/i,
|
|
67
|
+
code: 'AUTH_FAILED',
|
|
68
|
+
recoverable: false,
|
|
69
|
+
suggestion: 'Your API key may be invalid or revoked'
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
pattern: /api.?key.*(?:missing|not found|required)/i,
|
|
73
|
+
code: 'AUTH_FAILED',
|
|
74
|
+
recoverable: false,
|
|
75
|
+
suggestion: 'Set ANTHROPIC_API_KEY environment variable or configure Claude CLI'
|
|
76
|
+
},
|
|
77
|
+
// Model availability
|
|
78
|
+
{
|
|
79
|
+
pattern: /model.*(?:not available|unavailable|overloaded)/i,
|
|
80
|
+
code: 'MODEL_UNAVAILABLE',
|
|
81
|
+
recoverable: true,
|
|
82
|
+
suggestion: 'The model is temporarily unavailable. Try again in a few minutes.'
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
pattern: /service.*(?:unavailable|overloaded)/i,
|
|
86
|
+
code: 'MODEL_UNAVAILABLE',
|
|
87
|
+
recoverable: true,
|
|
88
|
+
suggestion: 'Anthropic API is temporarily overloaded. Try again shortly.'
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
pattern: /503|504|502/,
|
|
92
|
+
code: 'MODEL_UNAVAILABLE',
|
|
93
|
+
recoverable: true,
|
|
94
|
+
suggestion: 'Service temporarily unavailable. Will retry automatically.'
|
|
95
|
+
},
|
|
96
|
+
// Context length
|
|
97
|
+
{
|
|
98
|
+
pattern: /context.*(?:length|limit).*exceeded/i,
|
|
99
|
+
code: 'CONTEXT_EXCEEDED',
|
|
100
|
+
recoverable: false,
|
|
101
|
+
suggestion: 'Reduce prompt size or split into smaller tasks'
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
pattern: /maximum.*tokens.*exceeded/i,
|
|
105
|
+
code: 'CONTEXT_EXCEEDED',
|
|
106
|
+
recoverable: false,
|
|
107
|
+
suggestion: 'The request is too large. Try breaking it into smaller parts.'
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
pattern: /prompt.*too.*(?:long|large)/i,
|
|
111
|
+
code: 'CONTEXT_EXCEEDED',
|
|
112
|
+
recoverable: false,
|
|
113
|
+
suggestion: 'Reduce the size of your prompt or context'
|
|
114
|
+
},
|
|
115
|
+
// Network errors
|
|
116
|
+
{
|
|
117
|
+
pattern: /network.*(?:error|failed|unavailable)/i,
|
|
118
|
+
code: 'NETWORK_ERROR',
|
|
119
|
+
recoverable: true,
|
|
120
|
+
suggestion: 'Check your internet connection and try again'
|
|
121
|
+
},
|
|
122
|
+
{
|
|
123
|
+
pattern: /connection.*(?:refused|reset|timed out)/i,
|
|
124
|
+
code: 'NETWORK_ERROR',
|
|
125
|
+
recoverable: true,
|
|
126
|
+
suggestion: 'Network connection failed. Check your connection and retry.'
|
|
127
|
+
},
|
|
128
|
+
{
|
|
129
|
+
pattern: /ECONNREFUSED|ENOTFOUND|ETIMEDOUT|ECONNRESET/i,
|
|
130
|
+
code: 'NETWORK_ERROR',
|
|
131
|
+
recoverable: true,
|
|
132
|
+
suggestion: 'Network error. Verify internet connectivity.'
|
|
133
|
+
},
|
|
134
|
+
{
|
|
135
|
+
pattern: /fetch.*failed/i,
|
|
136
|
+
code: 'NETWORK_ERROR',
|
|
137
|
+
recoverable: true,
|
|
138
|
+
suggestion: 'Network request failed. Check your connection.'
|
|
139
|
+
},
|
|
140
|
+
// Permission/safety
|
|
141
|
+
{
|
|
142
|
+
pattern: /(?:content|request).*(?:blocked|refused|rejected)/i,
|
|
143
|
+
code: 'PERMISSION_DENIED',
|
|
144
|
+
recoverable: false,
|
|
145
|
+
suggestion: 'The request was blocked by safety filters'
|
|
146
|
+
},
|
|
147
|
+
{
|
|
148
|
+
pattern: /safety.*(?:filter|check)/i,
|
|
149
|
+
code: 'PERMISSION_DENIED',
|
|
150
|
+
recoverable: false,
|
|
151
|
+
suggestion: 'Content was flagged by safety systems'
|
|
152
|
+
}
|
|
153
|
+
];
|
|
154
|
+
/**
|
|
155
|
+
* Create Claude error detector service
|
|
156
|
+
*/
|
|
157
|
+
export function createClaudeErrorDetector() {
|
|
158
|
+
return {
|
|
159
|
+
detect(stdout, stderr) {
|
|
160
|
+
// Combine stdout and stderr for pattern matching
|
|
161
|
+
// Claude CLI sometimes outputs errors to stdout
|
|
162
|
+
const combined = `${stdout}\n${stderr}`;
|
|
163
|
+
for (const errorDef of ERROR_PATTERNS) {
|
|
164
|
+
const match = combined.match(errorDef.pattern);
|
|
165
|
+
if (match) {
|
|
166
|
+
// Extract the matched text for the error message
|
|
167
|
+
const matchedText = match[0];
|
|
168
|
+
const retryAfterMs = errorDef.extractRetryAfter?.(match);
|
|
169
|
+
return {
|
|
170
|
+
code: errorDef.code,
|
|
171
|
+
message: matchedText,
|
|
172
|
+
recoverable: errorDef.recoverable,
|
|
173
|
+
suggestion: errorDef.suggestion,
|
|
174
|
+
retryAfterMs
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
return null;
|
|
179
|
+
},
|
|
180
|
+
isFatal(error) {
|
|
181
|
+
return !error.recoverable;
|
|
182
|
+
},
|
|
183
|
+
shouldRetry(error) {
|
|
184
|
+
// Recoverable errors can be retried
|
|
185
|
+
// Rate limits should wait for retryAfterMs first
|
|
186
|
+
return error.recoverable;
|
|
187
|
+
},
|
|
188
|
+
formatErrorMessage(error) {
|
|
189
|
+
const codeLabel = ERROR_CODE_LABELS[error.code] ?? error.code;
|
|
190
|
+
return `${codeLabel}: ${error.suggestion}`;
|
|
191
|
+
}
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Human-readable labels for error codes
|
|
196
|
+
*/
|
|
197
|
+
const ERROR_CODE_LABELS = {
|
|
198
|
+
CREDIT_EXHAUSTED: 'Insufficient Credits',
|
|
199
|
+
RATE_LIMITED: 'Rate Limited',
|
|
200
|
+
AUTH_FAILED: 'Authentication Failed',
|
|
201
|
+
MODEL_UNAVAILABLE: 'Service Unavailable',
|
|
202
|
+
CONTEXT_EXCEEDED: 'Context Too Large',
|
|
203
|
+
NETWORK_ERROR: 'Network Error',
|
|
204
|
+
PERMISSION_DENIED: 'Request Blocked',
|
|
205
|
+
UNKNOWN: 'Unknown Error'
|
|
206
|
+
};
|
|
207
|
+
//# sourceMappingURL=ClaudeErrorDetector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ClaudeErrorDetector.js","sourceRoot":"","sources":["../../src/services/ClaudeErrorDetector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Claude API Health Check Service
|
|
3
|
+
* Verifies API connectivity and account status before starting flows
|
|
4
|
+
*/
|
|
5
|
+
import { type ClaudeError } from './ClaudeErrorDetector.js';
|
|
6
|
+
/**
|
|
7
|
+
* Health check result
|
|
8
|
+
*/
|
|
9
|
+
export interface HealthCheckResult {
|
|
10
|
+
readonly healthy: boolean;
|
|
11
|
+
readonly error?: ClaudeError;
|
|
12
|
+
readonly message: string;
|
|
13
|
+
readonly durationMs: number;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Health check options
|
|
17
|
+
*/
|
|
18
|
+
export interface HealthCheckOptions {
|
|
19
|
+
readonly tier?: string;
|
|
20
|
+
readonly sandbox?: boolean;
|
|
21
|
+
readonly timeoutMs?: number;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Claude Health Check Service Interface
|
|
25
|
+
*/
|
|
26
|
+
export interface ClaudeHealthCheckService {
|
|
27
|
+
/**
|
|
28
|
+
* Run a quick health check to verify API is ready
|
|
29
|
+
* Sends a minimal prompt to Claude CLI and checks for errors
|
|
30
|
+
*/
|
|
31
|
+
check(options?: HealthCheckOptions): Promise<HealthCheckResult>;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Create Claude health check service
|
|
35
|
+
*/
|
|
36
|
+
export declare function createClaudeHealthCheck(): ClaudeHealthCheckService;
|
|
37
|
+
//# sourceMappingURL=ClaudeHealthCheck.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ClaudeHealthCheck.d.ts","sourceRoot":"","sources":["../../src/services/ClaudeHealthCheck.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,EAA6B,KAAK,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAEvF;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,KAAK,CAAC,EAAE,WAAW,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAqDD;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC;;;OAGG;IACH,KAAK,CAAC,OAAO,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;CACjE;AAED;;GAEG;AACH,wBAAgB,uBAAuB,IAAI,wBAAwB,CA4JlE"}
|