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,177 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Deterministic Flow State Machine
|
|
3
|
+
* Requirements: 1.1, 1.2, 1.3, 1.6, 1.7
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Extract feature from phase if available
|
|
7
|
+
*/
|
|
8
|
+
function getFeatureFromPhase(phase) {
|
|
9
|
+
if (phase.type === 'idle') {
|
|
10
|
+
return '';
|
|
11
|
+
}
|
|
12
|
+
return phase.feature;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Pure transition function - deterministic state transitions
|
|
16
|
+
* Requirements: 1.1 - Pure transition function with no side effects
|
|
17
|
+
* Requirements: 1.2 - Application owns all flow control logic
|
|
18
|
+
*/
|
|
19
|
+
export function transition(phase, event) {
|
|
20
|
+
const feature = getFeatureFromPhase(phase);
|
|
21
|
+
// Global events that can occur from any phase
|
|
22
|
+
if (event.type === 'ABORT') {
|
|
23
|
+
return {
|
|
24
|
+
type: 'aborted',
|
|
25
|
+
feature: feature || 'unknown',
|
|
26
|
+
reason: event.reason
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
if (event.type === 'ERROR') {
|
|
30
|
+
return {
|
|
31
|
+
type: 'error',
|
|
32
|
+
feature: feature || 'unknown',
|
|
33
|
+
error: event.error
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
// Phase-specific transitions
|
|
37
|
+
switch (phase.type) {
|
|
38
|
+
case 'idle':
|
|
39
|
+
if (event.type === 'START') {
|
|
40
|
+
return {
|
|
41
|
+
type: 'initializing',
|
|
42
|
+
feature: event.feature,
|
|
43
|
+
description: event.description
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
if (event.type === 'RESUME') {
|
|
47
|
+
// RESUME from idle requires loading state from StateStore
|
|
48
|
+
// The actual resumed phase will be set externally after loading
|
|
49
|
+
return phase;
|
|
50
|
+
}
|
|
51
|
+
break;
|
|
52
|
+
case 'initializing':
|
|
53
|
+
if (event.type === 'PHASE_COMPLETE') {
|
|
54
|
+
return {
|
|
55
|
+
type: 'requirements-generating',
|
|
56
|
+
feature: phase.feature
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
break;
|
|
60
|
+
case 'requirements-generating':
|
|
61
|
+
if (event.type === 'PHASE_COMPLETE') {
|
|
62
|
+
return {
|
|
63
|
+
type: 'requirements-review',
|
|
64
|
+
feature: phase.feature
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
break;
|
|
68
|
+
case 'requirements-review':
|
|
69
|
+
if (event.type === 'APPROVE') {
|
|
70
|
+
return {
|
|
71
|
+
type: 'design-generating',
|
|
72
|
+
feature: phase.feature
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
if (event.type === 'REJECT') {
|
|
76
|
+
return {
|
|
77
|
+
type: 'requirements-generating',
|
|
78
|
+
feature: phase.feature
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
break;
|
|
82
|
+
case 'design-generating':
|
|
83
|
+
if (event.type === 'PHASE_COMPLETE') {
|
|
84
|
+
return {
|
|
85
|
+
type: 'design-review',
|
|
86
|
+
feature: phase.feature
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
break;
|
|
90
|
+
case 'design-review':
|
|
91
|
+
if (event.type === 'APPROVE') {
|
|
92
|
+
return {
|
|
93
|
+
type: 'tasks-generating',
|
|
94
|
+
feature: phase.feature
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
if (event.type === 'REJECT') {
|
|
98
|
+
return {
|
|
99
|
+
type: 'design-generating',
|
|
100
|
+
feature: phase.feature
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
break;
|
|
104
|
+
case 'tasks-generating':
|
|
105
|
+
if (event.type === 'PHASE_COMPLETE') {
|
|
106
|
+
return {
|
|
107
|
+
type: 'tasks-review',
|
|
108
|
+
feature: phase.feature
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
break;
|
|
112
|
+
case 'tasks-review':
|
|
113
|
+
if (event.type === 'APPROVE') {
|
|
114
|
+
return {
|
|
115
|
+
type: 'implementing',
|
|
116
|
+
feature: phase.feature,
|
|
117
|
+
currentTask: 1,
|
|
118
|
+
totalTasks: 0 // Will be set when tasks are counted
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
if (event.type === 'REJECT') {
|
|
122
|
+
return {
|
|
123
|
+
type: 'tasks-generating',
|
|
124
|
+
feature: phase.feature
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
break;
|
|
128
|
+
case 'implementing':
|
|
129
|
+
if (event.type === 'PHASE_COMPLETE') {
|
|
130
|
+
return {
|
|
131
|
+
type: 'complete',
|
|
132
|
+
feature: phase.feature
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
break;
|
|
136
|
+
case 'complete':
|
|
137
|
+
case 'aborted':
|
|
138
|
+
case 'error':
|
|
139
|
+
// Terminal states - no transitions except ABORT/ERROR handled above
|
|
140
|
+
break;
|
|
141
|
+
}
|
|
142
|
+
// Invalid transition - return current phase
|
|
143
|
+
return phase;
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Check if a transition is valid from current phase
|
|
147
|
+
* Requirements: 1.6 - Validate transitions before attempting
|
|
148
|
+
*/
|
|
149
|
+
function canTransitionFromPhase(phase, event) {
|
|
150
|
+
// ABORT and ERROR are always valid (except from terminal states)
|
|
151
|
+
if (event.type === 'ABORT' || event.type === 'ERROR') {
|
|
152
|
+
return phase.type !== 'complete' && phase.type !== 'aborted' && phase.type !== 'error';
|
|
153
|
+
}
|
|
154
|
+
// Check if transition would result in a different phase
|
|
155
|
+
const nextPhase = transition(phase, event);
|
|
156
|
+
return nextPhase !== phase || nextPhase.type !== phase.type;
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Create flow machine service
|
|
160
|
+
* Requirements: 1.1 - Factory function for state machine
|
|
161
|
+
*/
|
|
162
|
+
export function createFlowMachine(initialPhase) {
|
|
163
|
+
let currentPhase = initialPhase ?? { type: 'idle' };
|
|
164
|
+
return {
|
|
165
|
+
getPhase() {
|
|
166
|
+
return currentPhase;
|
|
167
|
+
},
|
|
168
|
+
send(event) {
|
|
169
|
+
currentPhase = transition(currentPhase, event);
|
|
170
|
+
return currentPhase;
|
|
171
|
+
},
|
|
172
|
+
canTransition(event) {
|
|
173
|
+
return canTransitionFromPhase(currentPhase, event);
|
|
174
|
+
}
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
//# sourceMappingURL=FlowStateMachine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FlowStateMachine.js","sourceRoot":"","sources":["../../src/services/FlowStateMachine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GitHub service for tarball fetching
|
|
3
|
+
* Requirements: 6.1-6.4
|
|
4
|
+
*/
|
|
5
|
+
import type { CacheService } from './CacheService.js';
|
|
6
|
+
/**
|
|
7
|
+
* GitHub service configuration
|
|
8
|
+
*/
|
|
9
|
+
export interface GitHubServiceConfig {
|
|
10
|
+
readonly defaultRepo: string;
|
|
11
|
+
readonly defaultVersion: string;
|
|
12
|
+
readonly cacheService: CacheService;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Fetch options
|
|
16
|
+
*/
|
|
17
|
+
export interface FetchOptions {
|
|
18
|
+
readonly repo?: string;
|
|
19
|
+
readonly version?: string;
|
|
20
|
+
readonly onProgress?: (progress: FetchProgress) => void;
|
|
21
|
+
readonly noCache?: boolean;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Fetch progress information
|
|
25
|
+
*/
|
|
26
|
+
export interface FetchProgress {
|
|
27
|
+
readonly phase: 'connecting' | 'downloading' | 'caching';
|
|
28
|
+
readonly bytesReceived?: number;
|
|
29
|
+
readonly totalBytes?: number;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Fetch result
|
|
33
|
+
*/
|
|
34
|
+
export interface FetchResult {
|
|
35
|
+
readonly tarballPath: string;
|
|
36
|
+
readonly version: string;
|
|
37
|
+
readonly repo: string;
|
|
38
|
+
readonly fromCache: boolean;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Error codes for GitHub fetch operations
|
|
42
|
+
*/
|
|
43
|
+
export type GitHubErrorCode = 'NETWORK_ERROR' | 'RATE_LIMITED' | 'INVALID_REPO' | 'NOT_FOUND' | 'EXTRACTION_ERROR';
|
|
44
|
+
/**
|
|
45
|
+
* Custom error for GitHub fetch operations
|
|
46
|
+
*/
|
|
47
|
+
export declare class GitHubFetchError extends Error {
|
|
48
|
+
readonly code: GitHubErrorCode;
|
|
49
|
+
constructor(message: string, code: GitHubErrorCode);
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* GitHub service interface
|
|
53
|
+
* Requirements: 6.1-6.4
|
|
54
|
+
*/
|
|
55
|
+
export interface GitHubService {
|
|
56
|
+
/**
|
|
57
|
+
* Fetch framework tarball from GitHub
|
|
58
|
+
* @throws GitHubFetchError on network failure, invalid repo, or rate limiting
|
|
59
|
+
*/
|
|
60
|
+
fetchTarball(options: FetchOptions): Promise<FetchResult>;
|
|
61
|
+
/**
|
|
62
|
+
* List available stacks from repository
|
|
63
|
+
* @throws GitHubFetchError on network failure
|
|
64
|
+
*/
|
|
65
|
+
listAvailableStacks(options: Pick<FetchOptions, 'repo' | 'version'>): Promise<readonly string[]>;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Create GitHub service
|
|
69
|
+
* Task 2.1, 2.2, 2.3: GitHub service factory
|
|
70
|
+
*/
|
|
71
|
+
export declare function createGitHubService(config: GitHubServiceConfig): GitHubService;
|
|
72
|
+
//# sourceMappingURL=GitHubService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GitHubService.d.ts","sourceRoot":"","sources":["../../src/services/GitHubService.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEtD;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,YAAY,EAAE,YAAY,CAAC;CACrC;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,aAAa,KAAK,IAAI,CAAC;IACxD,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,KAAK,EAAE,YAAY,GAAG,aAAa,GAAG,SAAS,CAAC;IACzD,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;CAC7B;AAED;;GAEG;AACH,MAAM,MAAM,eAAe,GACvB,eAAe,GACf,cAAc,GACd,cAAc,GACd,WAAW,GACX,kBAAkB,CAAC;AAEvB;;GAEG;AACH,qBAAa,gBAAiB,SAAQ,KAAK;IACzC,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC;gBAEnB,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe;CAKnD;AAED;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B;;;OAGG;IACH,YAAY,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IAE1D;;;OAGG;IACH,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,YAAY,EAAE,MAAM,GAAG,SAAS,CAAC,GAAG,OAAO,CAAC,SAAS,MAAM,EAAE,CAAC,CAAC;CAClG;AAsBD;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,mBAAmB,GAAG,aAAa,CAmJ9E"}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GitHub service for tarball fetching
|
|
3
|
+
* Requirements: 6.1-6.4
|
|
4
|
+
*/
|
|
5
|
+
import { writeFile, mkdir } from 'node:fs/promises';
|
|
6
|
+
import { join } from 'node:path';
|
|
7
|
+
/**
|
|
8
|
+
* Custom error for GitHub fetch operations
|
|
9
|
+
*/
|
|
10
|
+
export class GitHubFetchError extends Error {
|
|
11
|
+
code;
|
|
12
|
+
constructor(message, code) {
|
|
13
|
+
super(message);
|
|
14
|
+
this.name = 'GitHubFetchError';
|
|
15
|
+
this.code = code;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Validate repository format (owner/repo)
|
|
20
|
+
*/
|
|
21
|
+
function validateRepoFormat(repo) {
|
|
22
|
+
const repoPattern = /^[\w-]+\/[\w-]+$/;
|
|
23
|
+
if (!repoPattern.test(repo)) {
|
|
24
|
+
throw new GitHubFetchError(`Invalid repository format: "${repo}". Expected format: owner/repo`, 'INVALID_REPO');
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Build GitHub tarball URL
|
|
29
|
+
*/
|
|
30
|
+
function buildTarballUrl(repo, version) {
|
|
31
|
+
return `https://api.github.com/repos/${repo}/tarball/${version}`;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Create GitHub service
|
|
35
|
+
* Task 2.1, 2.2, 2.3: GitHub service factory
|
|
36
|
+
*/
|
|
37
|
+
export function createGitHubService(config) {
|
|
38
|
+
const { defaultRepo, defaultVersion, cacheService } = config;
|
|
39
|
+
// Validate default repo format
|
|
40
|
+
validateRepoFormat(defaultRepo);
|
|
41
|
+
return {
|
|
42
|
+
async fetchTarball(options) {
|
|
43
|
+
const repo = options.repo ?? defaultRepo;
|
|
44
|
+
const version = options.version ?? defaultVersion;
|
|
45
|
+
const noCache = options.noCache ?? false;
|
|
46
|
+
const onProgress = options.onProgress;
|
|
47
|
+
// Validate repo format if custom repo provided
|
|
48
|
+
if (options.repo) {
|
|
49
|
+
validateRepoFormat(options.repo);
|
|
50
|
+
}
|
|
51
|
+
// Check cache first (unless bypassed)
|
|
52
|
+
if (!noCache) {
|
|
53
|
+
const hasCache = await cacheService.has(repo, version);
|
|
54
|
+
if (hasCache) {
|
|
55
|
+
const entry = await cacheService.get(repo, version);
|
|
56
|
+
return {
|
|
57
|
+
tarballPath: entry.path,
|
|
58
|
+
version,
|
|
59
|
+
repo,
|
|
60
|
+
fromCache: true
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
// Report connecting phase
|
|
65
|
+
onProgress?.({ phase: 'connecting' });
|
|
66
|
+
// Build URL and fetch
|
|
67
|
+
const url = buildTarballUrl(repo, version);
|
|
68
|
+
try {
|
|
69
|
+
const response = await fetch(url, {
|
|
70
|
+
headers: {
|
|
71
|
+
'Accept': 'application/vnd.github+json',
|
|
72
|
+
'User-Agent': 'red64-cli'
|
|
73
|
+
},
|
|
74
|
+
redirect: 'follow'
|
|
75
|
+
});
|
|
76
|
+
// Handle error responses
|
|
77
|
+
if (!response.ok) {
|
|
78
|
+
if (response.status === 404) {
|
|
79
|
+
throw new GitHubFetchError(`Repository or version not found: ${repo}@${version}`, 'NOT_FOUND');
|
|
80
|
+
}
|
|
81
|
+
if (response.status === 403 || response.status === 429) {
|
|
82
|
+
throw new GitHubFetchError('GitHub API rate limit exceeded. Try again later or use cached version.', 'RATE_LIMITED');
|
|
83
|
+
}
|
|
84
|
+
throw new GitHubFetchError(`GitHub API error: ${response.status} ${response.statusText}`, 'NETWORK_ERROR');
|
|
85
|
+
}
|
|
86
|
+
// Get content length for progress
|
|
87
|
+
const contentLength = response.headers.get('content-length');
|
|
88
|
+
const totalBytes = contentLength ? parseInt(contentLength, 10) : undefined;
|
|
89
|
+
// Report downloading phase
|
|
90
|
+
onProgress?.({ phase: 'downloading', bytesReceived: 0, totalBytes });
|
|
91
|
+
// Read response body
|
|
92
|
+
const reader = response.body?.getReader();
|
|
93
|
+
if (!reader) {
|
|
94
|
+
throw new GitHubFetchError('Failed to read response body', 'NETWORK_ERROR');
|
|
95
|
+
}
|
|
96
|
+
const chunks = [];
|
|
97
|
+
let bytesReceived = 0;
|
|
98
|
+
while (true) {
|
|
99
|
+
const { done, value } = await reader.read();
|
|
100
|
+
if (done)
|
|
101
|
+
break;
|
|
102
|
+
chunks.push(value);
|
|
103
|
+
bytesReceived += value.length;
|
|
104
|
+
onProgress?.({
|
|
105
|
+
phase: 'downloading',
|
|
106
|
+
bytesReceived,
|
|
107
|
+
totalBytes
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
// Combine chunks
|
|
111
|
+
const tarball = new Uint8Array(bytesReceived);
|
|
112
|
+
let offset = 0;
|
|
113
|
+
for (const chunk of chunks) {
|
|
114
|
+
tarball.set(chunk, offset);
|
|
115
|
+
offset += chunk.length;
|
|
116
|
+
}
|
|
117
|
+
// Report caching phase
|
|
118
|
+
onProgress?.({ phase: 'caching' });
|
|
119
|
+
// Write to temp file
|
|
120
|
+
const tempDir = cacheService.getCacheDir();
|
|
121
|
+
await mkdir(tempDir, { recursive: true });
|
|
122
|
+
const tempPath = join(tempDir, `${repo.replace('/', '-')}-${version}.tar.gz`);
|
|
123
|
+
await writeFile(tempPath, tarball);
|
|
124
|
+
// Store in cache
|
|
125
|
+
const entry = await cacheService.set(repo, version, tempPath);
|
|
126
|
+
return {
|
|
127
|
+
tarballPath: entry.path,
|
|
128
|
+
version,
|
|
129
|
+
repo,
|
|
130
|
+
fromCache: false
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
catch (error) {
|
|
134
|
+
if (error instanceof GitHubFetchError) {
|
|
135
|
+
throw error;
|
|
136
|
+
}
|
|
137
|
+
// Handle network errors
|
|
138
|
+
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
139
|
+
throw new GitHubFetchError(`Network error fetching tarball: ${message}`, 'NETWORK_ERROR');
|
|
140
|
+
}
|
|
141
|
+
},
|
|
142
|
+
async listAvailableStacks(_options) {
|
|
143
|
+
// This would require fetching and parsing the tarball
|
|
144
|
+
// For now, return empty array - full implementation requires tarball extraction
|
|
145
|
+
// The actual stack listing happens after extraction via TemplateService
|
|
146
|
+
return [];
|
|
147
|
+
}
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
//# sourceMappingURL=GitHubService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GitHubService.js","sourceRoot":"","sources":["../../src/services/GitHubService.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Git Status Checker Service
|
|
3
|
+
* Task 1.1: Implement git status checking service
|
|
4
|
+
* Requirements: 1.3, 5.1
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Git status information
|
|
8
|
+
* Requirements: 1.3 - Detect uncommitted changes
|
|
9
|
+
*/
|
|
10
|
+
export interface GitStatus {
|
|
11
|
+
readonly hasChanges: boolean;
|
|
12
|
+
readonly staged: number;
|
|
13
|
+
readonly unstaged: number;
|
|
14
|
+
readonly untracked: number;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Git status checker service interface
|
|
18
|
+
* Requirements: 1.3 - Check for uncommitted changes in worktree
|
|
19
|
+
*/
|
|
20
|
+
export interface GitStatusCheckerService {
|
|
21
|
+
check(workingDir: string): Promise<GitStatus>;
|
|
22
|
+
hasUncommittedChanges(workingDir: string): Promise<boolean>;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Create git status checker service
|
|
26
|
+
* Requirements: 1.3 - Factory function for git status checking
|
|
27
|
+
*/
|
|
28
|
+
export declare function createGitStatusChecker(): GitStatusCheckerService;
|
|
29
|
+
//# sourceMappingURL=GitStatusChecker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GitStatusChecker.d.ts","sourceRoot":"","sources":["../../src/services/GitStatusChecker.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH;;;GAGG;AACH,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED;;;GAGG;AACH,MAAM,WAAW,uBAAuB;IACtC,KAAK,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IAC9C,qBAAqB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC7D;AA2GD;;;GAGG;AACH,wBAAgB,sBAAsB,IAAI,uBAAuB,CA+BhE"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Git Status Checker Service
|
|
3
|
+
* Task 1.1: Implement git status checking service
|
|
4
|
+
* Requirements: 1.3, 5.1
|
|
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
|
+
* Parse git status --porcelain output
|
|
38
|
+
*
|
|
39
|
+
* Status format: XY filename
|
|
40
|
+
* X = index status (staged)
|
|
41
|
+
* Y = work tree status (unstaged)
|
|
42
|
+
*
|
|
43
|
+
* Status codes:
|
|
44
|
+
* M = modified, A = added, D = deleted, R = renamed, C = copied
|
|
45
|
+
* U = updated but unmerged, ? = untracked, ! = ignored
|
|
46
|
+
*/
|
|
47
|
+
function parseGitStatus(output) {
|
|
48
|
+
// Don't use trim() on the full output - it removes significant leading spaces
|
|
49
|
+
// from status lines like " M filename" (space = no staged, M = modified in worktree)
|
|
50
|
+
if (!output || output.trim() === '') {
|
|
51
|
+
return {
|
|
52
|
+
hasChanges: false,
|
|
53
|
+
staged: 0,
|
|
54
|
+
unstaged: 0,
|
|
55
|
+
untracked: 0
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
let staged = 0;
|
|
59
|
+
let unstaged = 0;
|
|
60
|
+
let untracked = 0;
|
|
61
|
+
// Split by newline but don't trim - preserve leading spaces
|
|
62
|
+
const lines = output.split('\n');
|
|
63
|
+
for (const line of lines) {
|
|
64
|
+
// Skip empty lines (but keep lines with content)
|
|
65
|
+
if (line.length < 2)
|
|
66
|
+
continue;
|
|
67
|
+
const x = line[0]; // Index status (staged)
|
|
68
|
+
const y = line[1]; // Work tree status (unstaged)
|
|
69
|
+
// Untracked files
|
|
70
|
+
if (x === '?' && y === '?') {
|
|
71
|
+
untracked++;
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
// Ignored files - skip
|
|
75
|
+
if (x === '!' && y === '!') {
|
|
76
|
+
continue;
|
|
77
|
+
}
|
|
78
|
+
// Check staged changes (index status)
|
|
79
|
+
if (x !== ' ' && x !== '?') {
|
|
80
|
+
staged++;
|
|
81
|
+
}
|
|
82
|
+
// Check unstaged changes (work tree status)
|
|
83
|
+
if (y !== ' ' && y !== '?') {
|
|
84
|
+
unstaged++;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
return {
|
|
88
|
+
hasChanges: staged > 0 || unstaged > 0 || untracked > 0,
|
|
89
|
+
staged,
|
|
90
|
+
unstaged,
|
|
91
|
+
untracked
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Create git status checker service
|
|
96
|
+
* Requirements: 1.3 - Factory function for git status checking
|
|
97
|
+
*/
|
|
98
|
+
export function createGitStatusChecker() {
|
|
99
|
+
return {
|
|
100
|
+
/**
|
|
101
|
+
* Check git working directory for uncommitted changes
|
|
102
|
+
* Requirements: 1.3 - Detect staged, unstaged, and untracked changes
|
|
103
|
+
*/
|
|
104
|
+
async check(workingDir) {
|
|
105
|
+
const result = await execGit(['status', '--porcelain'], workingDir);
|
|
106
|
+
if (result.exitCode !== 0) {
|
|
107
|
+
// Non-zero exit code - not a git repo or error
|
|
108
|
+
return {
|
|
109
|
+
hasChanges: false,
|
|
110
|
+
staged: 0,
|
|
111
|
+
unstaged: 0,
|
|
112
|
+
untracked: 0
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
return parseGitStatus(result.stdout);
|
|
116
|
+
},
|
|
117
|
+
/**
|
|
118
|
+
* Check if there are any uncommitted changes
|
|
119
|
+
* Requirements: 1.3 - Simple boolean check for changes
|
|
120
|
+
*/
|
|
121
|
+
async hasUncommittedChanges(workingDir) {
|
|
122
|
+
const status = await this.check(workingDir);
|
|
123
|
+
return status.hasChanges;
|
|
124
|
+
}
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=GitStatusChecker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GitStatusChecker.js","sourceRoot":"","sources":["../../src/services/GitStatusChecker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PR Creator Service
|
|
3
|
+
* Task 5.1: Build PR creator service for GitHub CLI operations
|
|
4
|
+
* Requirements: 6.1, 6.2, 6.3, 6.4
|
|
5
|
+
*/
|
|
6
|
+
import type { CommitResult } from './CommitService.js';
|
|
7
|
+
/**
|
|
8
|
+
* PR create options
|
|
9
|
+
* Requirements: 6.2, 6.3 - PR creation configuration
|
|
10
|
+
*/
|
|
11
|
+
export interface PRCreateOptions {
|
|
12
|
+
readonly workingDir: string;
|
|
13
|
+
readonly feature: string;
|
|
14
|
+
readonly specDir: string;
|
|
15
|
+
readonly baseBranch: string;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* PR create result
|
|
19
|
+
* Requirements: 6.3, 6.4 - PR URL and number
|
|
20
|
+
*/
|
|
21
|
+
export interface PRCreateResult {
|
|
22
|
+
readonly success: boolean;
|
|
23
|
+
readonly prUrl: string | undefined;
|
|
24
|
+
readonly prNumber: number | undefined;
|
|
25
|
+
readonly error: string | undefined;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* PR merge options
|
|
29
|
+
* Requirements: 6.5, 6.6 - Merge configuration
|
|
30
|
+
*/
|
|
31
|
+
export interface PRMergeOptions {
|
|
32
|
+
readonly workingDir: string;
|
|
33
|
+
readonly prNumber: number;
|
|
34
|
+
readonly squash: boolean;
|
|
35
|
+
readonly deleteBranch: boolean;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* PR merge result
|
|
39
|
+
*/
|
|
40
|
+
export interface PRMergeResult {
|
|
41
|
+
readonly success: boolean;
|
|
42
|
+
readonly error: string | undefined;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* PR creator service interface
|
|
46
|
+
* Requirements: 6.1, 6.2, 6.3, 6.4
|
|
47
|
+
*/
|
|
48
|
+
export interface PRCreatorServiceInterface {
|
|
49
|
+
push(workingDir: string, remote?: string): Promise<CommitResult>;
|
|
50
|
+
createPR(options: PRCreateOptions): Promise<PRCreateResult>;
|
|
51
|
+
mergePR(options: PRMergeOptions): Promise<PRMergeResult>;
|
|
52
|
+
generatePRBody(specDir: string, feature: string): Promise<string>;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Create PR creator service
|
|
56
|
+
* Requirements: 6.1, 6.2, 6.3, 6.4 - Factory function for PR operations
|
|
57
|
+
*/
|
|
58
|
+
export declare function createPRCreatorService(): PRCreatorServiceInterface;
|
|
59
|
+
//# sourceMappingURL=PRCreatorService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PRCreatorService.d.ts","sourceRoot":"","sources":["../../src/services/PRCreatorService.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IACtC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;CACpC;AAED;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;CAChC;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;CACpC;AAED;;;GAGG;AACH,MAAM,WAAW,yBAAyB;IACxC,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IACjE,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;IAC5D,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;IACzD,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CACnE;AA4GD;;;GAGG;AACH,wBAAgB,sBAAsB,IAAI,yBAAyB,CAwIlE"}
|