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,212 @@
|
|
|
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 { spawn } from 'node:child_process';
|
|
7
|
+
import { readFile } from 'node:fs/promises';
|
|
8
|
+
import { join } from 'node:path';
|
|
9
|
+
/**
|
|
10
|
+
* Execute command and return result
|
|
11
|
+
*/
|
|
12
|
+
function execCommand(command, args, cwd, stdin) {
|
|
13
|
+
return new Promise((resolve) => {
|
|
14
|
+
const process = spawn(command, args, {
|
|
15
|
+
cwd,
|
|
16
|
+
stdio: ['pipe', 'pipe', 'pipe']
|
|
17
|
+
});
|
|
18
|
+
let stdout = '';
|
|
19
|
+
let stderr = '';
|
|
20
|
+
process.stdout?.on('data', (data) => {
|
|
21
|
+
stdout += data.toString();
|
|
22
|
+
});
|
|
23
|
+
process.stderr?.on('data', (data) => {
|
|
24
|
+
stderr += data.toString();
|
|
25
|
+
});
|
|
26
|
+
process.on('close', (code) => {
|
|
27
|
+
resolve({ stdout: stdout.trim(), stderr: stderr.trim(), exitCode: code ?? 0 });
|
|
28
|
+
});
|
|
29
|
+
process.on('error', (error) => {
|
|
30
|
+
resolve({
|
|
31
|
+
stdout,
|
|
32
|
+
stderr: stderr || `Command error: ${error.message}`,
|
|
33
|
+
exitCode: -1
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
// Write to stdin if provided
|
|
37
|
+
if (stdin && process.stdin) {
|
|
38
|
+
process.stdin.write(stdin);
|
|
39
|
+
process.stdin.end();
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Extract PR number from URL
|
|
45
|
+
*/
|
|
46
|
+
function extractPRNumber(url) {
|
|
47
|
+
const match = url.match(/\/pull\/(\d+)/);
|
|
48
|
+
return match ? parseInt(match[1], 10) : undefined;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Read file safely, returning empty string on error
|
|
52
|
+
*/
|
|
53
|
+
async function readFileSafe(path) {
|
|
54
|
+
try {
|
|
55
|
+
return await readFile(path, 'utf-8');
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
return '';
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Extract summary from requirements.md
|
|
63
|
+
*/
|
|
64
|
+
function extractRequirementsSummary(content) {
|
|
65
|
+
if (!content)
|
|
66
|
+
return 'No requirements available';
|
|
67
|
+
// Try to extract first paragraph after the title
|
|
68
|
+
const lines = content.split('\n').filter(l => l.trim() && !l.startsWith('#'));
|
|
69
|
+
return lines.slice(0, 3).join(' ').trim() || 'Requirements defined in spec';
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Extract overview from design.md
|
|
73
|
+
*/
|
|
74
|
+
function extractDesignOverview(content) {
|
|
75
|
+
if (!content)
|
|
76
|
+
return 'No design available';
|
|
77
|
+
// Try to extract overview section
|
|
78
|
+
const overviewMatch = content.match(/##\s*Overview\s*\n([\s\S]*?)(?=\n##|$)/i);
|
|
79
|
+
if (overviewMatch) {
|
|
80
|
+
return overviewMatch[1].trim().split('\n').slice(0, 3).join(' ').trim();
|
|
81
|
+
}
|
|
82
|
+
const lines = content.split('\n').filter(l => l.trim() && !l.startsWith('#'));
|
|
83
|
+
return lines.slice(0, 3).join(' ').trim() || 'Design defined in spec';
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Extract task summary from tasks.md
|
|
87
|
+
*/
|
|
88
|
+
function extractTasksSummary(content) {
|
|
89
|
+
if (!content)
|
|
90
|
+
return 'No tasks available';
|
|
91
|
+
// Count completed and total tasks
|
|
92
|
+
const taskLines = content.match(/- \[([ x])\]/g) || [];
|
|
93
|
+
const completed = taskLines.filter(l => l.includes('[x]')).length;
|
|
94
|
+
const total = taskLines.length;
|
|
95
|
+
return `${completed}/${total} tasks completed`;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Create PR creator service
|
|
99
|
+
* Requirements: 6.1, 6.2, 6.3, 6.4 - Factory function for PR operations
|
|
100
|
+
*/
|
|
101
|
+
export function createPRCreatorService() {
|
|
102
|
+
return {
|
|
103
|
+
/**
|
|
104
|
+
* Push branch to remote
|
|
105
|
+
* Requirements: 6.1 - Push feature branch using git
|
|
106
|
+
*/
|
|
107
|
+
async push(workingDir, remote = 'origin') {
|
|
108
|
+
const result = await execCommand('git', ['push', '-u', remote, 'HEAD'], workingDir);
|
|
109
|
+
if (result.exitCode !== 0) {
|
|
110
|
+
return {
|
|
111
|
+
success: false,
|
|
112
|
+
commitHash: undefined,
|
|
113
|
+
error: result.stderr || 'Failed to push branch'
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
return {
|
|
117
|
+
success: true,
|
|
118
|
+
commitHash: undefined,
|
|
119
|
+
error: undefined
|
|
120
|
+
};
|
|
121
|
+
},
|
|
122
|
+
/**
|
|
123
|
+
* Create pull request using GitHub CLI
|
|
124
|
+
* Requirements: 6.2, 6.3, 6.4 - Create PR with spec artifacts
|
|
125
|
+
*/
|
|
126
|
+
async createPR(options) {
|
|
127
|
+
// Generate PR body from spec artifacts
|
|
128
|
+
const body = await this.generatePRBody(options.specDir, options.feature);
|
|
129
|
+
// Build title
|
|
130
|
+
const title = `feat: ${options.feature}`;
|
|
131
|
+
// Create PR using gh CLI
|
|
132
|
+
const result = await execCommand('gh', ['pr', 'create', '--title', title, '--body', body, '--base', options.baseBranch], options.workingDir);
|
|
133
|
+
if (result.exitCode !== 0) {
|
|
134
|
+
return {
|
|
135
|
+
success: false,
|
|
136
|
+
prUrl: undefined,
|
|
137
|
+
prNumber: undefined,
|
|
138
|
+
error: result.stderr || 'Failed to create PR'
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
const prUrl = result.stdout;
|
|
142
|
+
const prNumber = extractPRNumber(prUrl);
|
|
143
|
+
return {
|
|
144
|
+
success: true,
|
|
145
|
+
prUrl,
|
|
146
|
+
prNumber,
|
|
147
|
+
error: undefined
|
|
148
|
+
};
|
|
149
|
+
},
|
|
150
|
+
/**
|
|
151
|
+
* Merge pull request
|
|
152
|
+
* Requirements: 6.5, 6.6 - Squash merge and delete branch
|
|
153
|
+
*/
|
|
154
|
+
async mergePR(options) {
|
|
155
|
+
const args = ['pr', 'merge', options.prNumber.toString()];
|
|
156
|
+
if (options.squash) {
|
|
157
|
+
args.push('--squash');
|
|
158
|
+
}
|
|
159
|
+
if (options.deleteBranch) {
|
|
160
|
+
args.push('--delete-branch');
|
|
161
|
+
}
|
|
162
|
+
const result = await execCommand('gh', args, options.workingDir);
|
|
163
|
+
if (result.exitCode !== 0) {
|
|
164
|
+
return {
|
|
165
|
+
success: false,
|
|
166
|
+
error: result.stderr || 'Failed to merge PR'
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
return {
|
|
170
|
+
success: true,
|
|
171
|
+
error: undefined
|
|
172
|
+
};
|
|
173
|
+
},
|
|
174
|
+
/**
|
|
175
|
+
* Generate PR body from spec artifacts
|
|
176
|
+
* Requirements: 6.2 - Read spec artifacts for PR body
|
|
177
|
+
* Requirements: 6.4 - Include links to spec artifacts
|
|
178
|
+
*/
|
|
179
|
+
async generatePRBody(specDir, feature) {
|
|
180
|
+
// Read spec artifacts
|
|
181
|
+
const requirementsPath = join(specDir, 'requirements.md');
|
|
182
|
+
const designPath = join(specDir, 'design.md');
|
|
183
|
+
const tasksPath = join(specDir, 'tasks.md');
|
|
184
|
+
const [requirements, design, tasks] = await Promise.all([
|
|
185
|
+
readFileSafe(requirementsPath),
|
|
186
|
+
readFileSafe(designPath),
|
|
187
|
+
readFileSafe(tasksPath)
|
|
188
|
+
]);
|
|
189
|
+
const requirementsSummary = extractRequirementsSummary(requirements);
|
|
190
|
+
const designOverview = extractDesignOverview(design);
|
|
191
|
+
const tasksSummary = extractTasksSummary(tasks);
|
|
192
|
+
return `## Feature: ${feature}
|
|
193
|
+
|
|
194
|
+
### Summary
|
|
195
|
+
${requirementsSummary}
|
|
196
|
+
|
|
197
|
+
### Design
|
|
198
|
+
${designOverview}
|
|
199
|
+
|
|
200
|
+
### Tasks
|
|
201
|
+
${tasksSummary}
|
|
202
|
+
|
|
203
|
+
---
|
|
204
|
+
**Spec Artifacts**
|
|
205
|
+
- [Requirements](.red64/specs/${feature}/requirements.md)
|
|
206
|
+
- [Design](.red64/specs/${feature}/design.md)
|
|
207
|
+
- [Tasks](.red64/specs/${feature}/tasks.md)
|
|
208
|
+
`;
|
|
209
|
+
}
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
//# sourceMappingURL=PRCreatorService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PRCreatorService.js","sourceRoot":"","sources":["../../src/services/PRCreatorService.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PR Status Fetcher Service
|
|
3
|
+
* Task 1.2: Implement PR status fetching service
|
|
4
|
+
* Requirements: 2.4, 4.3
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* PR status information
|
|
8
|
+
* Requirements: 2.4 - Fetch PR status for display
|
|
9
|
+
*/
|
|
10
|
+
export interface PRStatus {
|
|
11
|
+
readonly number: number;
|
|
12
|
+
readonly url: string;
|
|
13
|
+
readonly state: 'open' | 'closed' | 'merged';
|
|
14
|
+
readonly mergeable: boolean;
|
|
15
|
+
readonly reviewDecision: 'approved' | 'changes_requested' | 'review_required' | 'unknown';
|
|
16
|
+
readonly checksStatus: 'passing' | 'failing' | 'pending' | 'unknown';
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* PR close operation result
|
|
20
|
+
* Requirements: 4.3 - Close PR on abort
|
|
21
|
+
*/
|
|
22
|
+
export interface PRCloseResult {
|
|
23
|
+
readonly success: boolean;
|
|
24
|
+
readonly error: string | undefined;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* PR status fetcher service interface
|
|
28
|
+
* Requirements: 2.4, 4.3
|
|
29
|
+
*/
|
|
30
|
+
export interface PRStatusFetcherService {
|
|
31
|
+
getStatus(prNumberOrUrl: string | number): Promise<PRStatus | undefined>;
|
|
32
|
+
close(prNumber: number): Promise<PRCloseResult>;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Create PR status fetcher service
|
|
36
|
+
* Requirements: 2.4, 4.3 - Factory function for PR operations
|
|
37
|
+
*/
|
|
38
|
+
export declare function createPRStatusFetcher(): PRStatusFetcherService;
|
|
39
|
+
//# sourceMappingURL=PRStatusFetcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PRStatusFetcher.d.ts","sourceRoot":"","sources":["../../src/services/PRStatusFetcher.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH;;;GAGG;AACH,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAAC;IAC7C,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,cAAc,EAAE,UAAU,GAAG,mBAAmB,GAAG,iBAAiB,GAAG,SAAS,CAAC;IAC1F,QAAQ,CAAC,YAAY,EAAE,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;CACtE;AAED;;;GAGG;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,sBAAsB;IACrC,SAAS,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC,CAAC;IACzE,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;CACjD;AAmHD;;;GAGG;AACH,wBAAgB,qBAAqB,IAAI,sBAAsB,CAsD9D"}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PR Status Fetcher Service
|
|
3
|
+
* Task 1.2: Implement PR status fetching service
|
|
4
|
+
* Requirements: 2.4, 4.3
|
|
5
|
+
*/
|
|
6
|
+
import { spawn } from 'node:child_process';
|
|
7
|
+
/**
|
|
8
|
+
* Execute gh command and return result
|
|
9
|
+
*/
|
|
10
|
+
function execGh(args) {
|
|
11
|
+
return new Promise((resolve) => {
|
|
12
|
+
const process = spawn('gh', args, {
|
|
13
|
+
stdio: ['pipe', 'pipe', 'pipe']
|
|
14
|
+
});
|
|
15
|
+
let stdout = '';
|
|
16
|
+
let stderr = '';
|
|
17
|
+
process.stdout?.on('data', (data) => {
|
|
18
|
+
stdout += data.toString();
|
|
19
|
+
});
|
|
20
|
+
process.stderr?.on('data', (data) => {
|
|
21
|
+
stderr += data.toString();
|
|
22
|
+
});
|
|
23
|
+
process.on('close', (code) => {
|
|
24
|
+
resolve({ stdout, stderr, exitCode: code ?? 0 });
|
|
25
|
+
});
|
|
26
|
+
process.on('error', (error) => {
|
|
27
|
+
resolve({
|
|
28
|
+
stdout,
|
|
29
|
+
stderr: stderr || `gh error: ${error.message}`,
|
|
30
|
+
exitCode: -1
|
|
31
|
+
});
|
|
32
|
+
});
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Map GitHub API state to our state type
|
|
37
|
+
*/
|
|
38
|
+
function mapState(apiState) {
|
|
39
|
+
switch (apiState?.toUpperCase()) {
|
|
40
|
+
case 'OPEN':
|
|
41
|
+
return 'open';
|
|
42
|
+
case 'CLOSED':
|
|
43
|
+
return 'closed';
|
|
44
|
+
case 'MERGED':
|
|
45
|
+
return 'merged';
|
|
46
|
+
default:
|
|
47
|
+
return 'open';
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Map GitHub API mergeable status to boolean
|
|
52
|
+
*/
|
|
53
|
+
function mapMergeable(apiMergeable) {
|
|
54
|
+
return apiMergeable?.toUpperCase() === 'MERGEABLE';
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Map GitHub API review decision to our type
|
|
58
|
+
*/
|
|
59
|
+
function mapReviewDecision(apiDecision) {
|
|
60
|
+
switch (apiDecision?.toUpperCase()) {
|
|
61
|
+
case 'APPROVED':
|
|
62
|
+
return 'approved';
|
|
63
|
+
case 'CHANGES_REQUESTED':
|
|
64
|
+
return 'changes_requested';
|
|
65
|
+
case 'REVIEW_REQUIRED':
|
|
66
|
+
return 'review_required';
|
|
67
|
+
default:
|
|
68
|
+
return 'unknown';
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Map GitHub API status check rollup to our type
|
|
73
|
+
*/
|
|
74
|
+
function mapChecksStatus(rollup) {
|
|
75
|
+
if (!rollup || !rollup.state) {
|
|
76
|
+
return 'unknown';
|
|
77
|
+
}
|
|
78
|
+
switch (rollup.state.toUpperCase()) {
|
|
79
|
+
case 'SUCCESS':
|
|
80
|
+
return 'passing';
|
|
81
|
+
case 'FAILURE':
|
|
82
|
+
case 'ERROR':
|
|
83
|
+
return 'failing';
|
|
84
|
+
case 'PENDING':
|
|
85
|
+
case 'EXPECTED':
|
|
86
|
+
return 'pending';
|
|
87
|
+
default:
|
|
88
|
+
return 'unknown';
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Create PR status fetcher service
|
|
93
|
+
* Requirements: 2.4, 4.3 - Factory function for PR operations
|
|
94
|
+
*/
|
|
95
|
+
export function createPRStatusFetcher() {
|
|
96
|
+
return {
|
|
97
|
+
/**
|
|
98
|
+
* Get PR status by number or URL
|
|
99
|
+
* Requirements: 2.4 - Fetch PR status for display
|
|
100
|
+
*/
|
|
101
|
+
async getStatus(prNumberOrUrl) {
|
|
102
|
+
const identifier = String(prNumberOrUrl);
|
|
103
|
+
const fields = 'number,url,state,mergeable,reviewDecision,statusCheckRollup';
|
|
104
|
+
const result = await execGh(['pr', 'view', identifier, '--json', fields]);
|
|
105
|
+
if (result.exitCode !== 0) {
|
|
106
|
+
// PR not found or gh not authenticated
|
|
107
|
+
return undefined;
|
|
108
|
+
}
|
|
109
|
+
try {
|
|
110
|
+
const data = JSON.parse(result.stdout);
|
|
111
|
+
return {
|
|
112
|
+
number: data.number ?? 0,
|
|
113
|
+
url: data.url ?? '',
|
|
114
|
+
state: mapState(data.state),
|
|
115
|
+
mergeable: mapMergeable(data.mergeable),
|
|
116
|
+
reviewDecision: mapReviewDecision(data.reviewDecision),
|
|
117
|
+
checksStatus: mapChecksStatus(data.statusCheckRollup)
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
catch {
|
|
121
|
+
// Invalid JSON response
|
|
122
|
+
return undefined;
|
|
123
|
+
}
|
|
124
|
+
},
|
|
125
|
+
/**
|
|
126
|
+
* Close a PR by number
|
|
127
|
+
* Requirements: 4.3 - Close PR on abort (never merge)
|
|
128
|
+
*/
|
|
129
|
+
async close(prNumber) {
|
|
130
|
+
const result = await execGh(['pr', 'close', String(prNumber)]);
|
|
131
|
+
if (result.exitCode !== 0) {
|
|
132
|
+
return {
|
|
133
|
+
success: false,
|
|
134
|
+
error: result.stderr || 'Failed to close PR'
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
return {
|
|
138
|
+
success: true,
|
|
139
|
+
error: undefined
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
//# sourceMappingURL=PRStatusFetcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PRStatusFetcher.js","sourceRoot":"","sources":["../../src/services/PRStatusFetcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Phase Executor service
|
|
3
|
+
* Requirements: 1.1, 2.1-2.6
|
|
4
|
+
*/
|
|
5
|
+
import type { FlowPhase, GlobalFlags } from '../types/index.js';
|
|
6
|
+
import type { AgentInvokerService } from './AgentInvoker.js';
|
|
7
|
+
import type { StateStoreService } from './StateStore.js';
|
|
8
|
+
/**
|
|
9
|
+
* Phase execution result
|
|
10
|
+
* Requirements: 2.5 - Return success only when output is valid and complete
|
|
11
|
+
*/
|
|
12
|
+
export interface PhaseExecutionResult {
|
|
13
|
+
readonly success: boolean;
|
|
14
|
+
readonly output: string | undefined;
|
|
15
|
+
readonly error: string | undefined;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Phase executor service interface
|
|
19
|
+
* Requirements: 2.1 - Execute phase-specific operations
|
|
20
|
+
*/
|
|
21
|
+
export interface PhaseExecutorService {
|
|
22
|
+
execute(phase: FlowPhase, flags: GlobalFlags, workingDirectory: string): Promise<PhaseExecutionResult>;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Create phase executor service
|
|
26
|
+
* Requirements: 2.1 - Factory function for phase executor
|
|
27
|
+
*/
|
|
28
|
+
export declare function createPhaseExecutor(agentInvoker: AgentInvokerService, _stateStore: StateStoreService): PhaseExecutorService;
|
|
29
|
+
//# sourceMappingURL=PhaseExecutor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PhaseExecutor.d.ts","sourceRoot":"","sources":["../../src/services/PhaseExecutor.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEzD;;;GAGG;AACH,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;CACpC;AAED;;;GAGG;AACH,MAAM,WAAW,oBAAoB;IACnC,OAAO,CACL,KAAK,EAAE,SAAS,EAChB,KAAK,EAAE,WAAW,EAClB,gBAAgB,EAAE,MAAM,GACvB,OAAO,CAAC,oBAAoB,CAAC,CAAC;CAClC;AAmED;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,YAAY,EAAE,mBAAmB,EACjC,WAAW,EAAE,iBAAiB,GAC7B,oBAAoB,CAqEtB"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Phase Executor service
|
|
3
|
+
* Requirements: 1.1, 2.1-2.6
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Prompt templates for each generation phase
|
|
7
|
+
* Requirements: 2.2 - Construct focused prompts for each generation task
|
|
8
|
+
* Requirements: 8.3 - Use red64: prefix for slash commands
|
|
9
|
+
*/
|
|
10
|
+
const PHASE_PROMPTS = {
|
|
11
|
+
'initializing': '/red64:spec-init "{feature}" "{description}"',
|
|
12
|
+
'requirements-generating': '/red64:spec-requirements {feature}',
|
|
13
|
+
'design-generating': '/red64:spec-design {feature}',
|
|
14
|
+
'tasks-generating': '/red64:spec-tasks {feature}',
|
|
15
|
+
'implementing': '/red64:spec-impl {feature}'
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* Default retry configuration
|
|
19
|
+
* Requirements: 2.6 - Configurable max retry count
|
|
20
|
+
*/
|
|
21
|
+
const DEFAULT_MAX_RETRIES = 3;
|
|
22
|
+
const RETRY_DELAY_MS = 1000;
|
|
23
|
+
/**
|
|
24
|
+
* Check if phase requires agent invocation
|
|
25
|
+
*/
|
|
26
|
+
function isGenerationPhase(phase) {
|
|
27
|
+
return [
|
|
28
|
+
'initializing',
|
|
29
|
+
'requirements-generating',
|
|
30
|
+
'design-generating',
|
|
31
|
+
'tasks-generating',
|
|
32
|
+
'implementing'
|
|
33
|
+
].includes(phase.type);
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Build prompt for phase
|
|
37
|
+
* Requirements: 2.2, 2.3 - Focused prompt without workflow state
|
|
38
|
+
*/
|
|
39
|
+
function buildPrompt(phase) {
|
|
40
|
+
const template = PHASE_PROMPTS[phase.type];
|
|
41
|
+
if (!template) {
|
|
42
|
+
return '';
|
|
43
|
+
}
|
|
44
|
+
let prompt = template;
|
|
45
|
+
// Replace feature placeholder
|
|
46
|
+
if ('feature' in phase) {
|
|
47
|
+
prompt = prompt.replace('{feature}', phase.feature);
|
|
48
|
+
}
|
|
49
|
+
// Replace description placeholder for initializing phase
|
|
50
|
+
if (phase.type === 'initializing') {
|
|
51
|
+
prompt = prompt.replace('{description}', phase.description);
|
|
52
|
+
}
|
|
53
|
+
return prompt;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Sleep for specified milliseconds
|
|
57
|
+
*/
|
|
58
|
+
function sleep(ms) {
|
|
59
|
+
return new Promise(resolve => setTimeout(resolve, ms));
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Create phase executor service
|
|
63
|
+
* Requirements: 2.1 - Factory function for phase executor
|
|
64
|
+
*/
|
|
65
|
+
export function createPhaseExecutor(agentInvoker, _stateStore) {
|
|
66
|
+
return {
|
|
67
|
+
/**
|
|
68
|
+
* Execute phase-specific operations
|
|
69
|
+
* Requirements: 2.1-2.6 - Execute generation tasks with retry logic
|
|
70
|
+
*/
|
|
71
|
+
async execute(phase, flags, workingDirectory) {
|
|
72
|
+
// Non-generation phases don't require agent invocation
|
|
73
|
+
if (!isGenerationPhase(phase)) {
|
|
74
|
+
return {
|
|
75
|
+
success: true,
|
|
76
|
+
output: undefined,
|
|
77
|
+
error: undefined
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
const prompt = buildPrompt(phase);
|
|
81
|
+
if (!prompt) {
|
|
82
|
+
return {
|
|
83
|
+
success: true,
|
|
84
|
+
output: undefined,
|
|
85
|
+
error: undefined
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
// Retry loop
|
|
89
|
+
// Requirements: 2.6 - Implement retry logic in TypeScript
|
|
90
|
+
for (let attempt = 1; attempt <= DEFAULT_MAX_RETRIES; attempt++) {
|
|
91
|
+
const result = await agentInvoker.invoke({
|
|
92
|
+
prompt,
|
|
93
|
+
workingDirectory,
|
|
94
|
+
skipPermissions: flags.skipPermissions,
|
|
95
|
+
tier: flags.tier
|
|
96
|
+
});
|
|
97
|
+
if (result.success) {
|
|
98
|
+
// Requirements: 2.5 - Parse agent output after completion
|
|
99
|
+
return {
|
|
100
|
+
success: true,
|
|
101
|
+
output: result.stdout,
|
|
102
|
+
error: undefined
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
// Last attempt failed
|
|
106
|
+
if (attempt === DEFAULT_MAX_RETRIES) {
|
|
107
|
+
return {
|
|
108
|
+
success: false,
|
|
109
|
+
output: result.stdout || undefined,
|
|
110
|
+
error: `Agent failed after ${DEFAULT_MAX_RETRIES} retries: ${result.stderr}`
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
// Wait before retry with exponential backoff
|
|
114
|
+
await sleep(RETRY_DELAY_MS * attempt);
|
|
115
|
+
}
|
|
116
|
+
// Should not reach here, but TypeScript needs this
|
|
117
|
+
return {
|
|
118
|
+
success: false,
|
|
119
|
+
output: undefined,
|
|
120
|
+
error: 'Unexpected error in phase execution'
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=PhaseExecutor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PhaseExecutor.js","sourceRoot":"","sources":["../../src/services/PhaseExecutor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Spec Initialization Service
|
|
3
|
+
* Creates the spec directory structure with templates
|
|
4
|
+
* Replaces the /red64:spec-init command for orchestrator use
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Spec initialization result
|
|
8
|
+
*/
|
|
9
|
+
export interface SpecInitResult {
|
|
10
|
+
readonly success: boolean;
|
|
11
|
+
readonly specDir: string;
|
|
12
|
+
readonly featureName: string;
|
|
13
|
+
readonly error?: string;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Spec update result
|
|
17
|
+
*/
|
|
18
|
+
export interface SpecUpdateResult {
|
|
19
|
+
readonly success: boolean;
|
|
20
|
+
readonly error?: string;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Spec initialization service interface
|
|
24
|
+
*/
|
|
25
|
+
export interface SpecInitService {
|
|
26
|
+
init(workDir: string, featureName: string, description: string): Promise<SpecInitResult>;
|
|
27
|
+
updateTaskApproval(workDir: string, featureName: string): Promise<SpecUpdateResult>;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Create spec init service
|
|
31
|
+
*/
|
|
32
|
+
export declare function createSpecInitService(): SpecInitService;
|
|
33
|
+
//# sourceMappingURL=SpecInitService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SpecInitService.d.ts","sourceRoot":"","sources":["../../src/services/SpecInitService.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAOH;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;IACzF,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;CACrF;AAwFD;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,eAAe,CAqGvD"}
|