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,135 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Task Runner Service
|
|
3
|
+
* Task 4.2: Implement task runner for incremental implementation execution
|
|
4
|
+
* Requirements: 5.2, 5.3, 5.4
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Checkpoint interval - trigger checkpoint every N tasks
|
|
8
|
+
* Requirements: 5.5 - Checkpoint every 3 tasks
|
|
9
|
+
*/
|
|
10
|
+
const CHECKPOINT_INTERVAL = 3;
|
|
11
|
+
/**
|
|
12
|
+
* Generate task prompt for agent invocation
|
|
13
|
+
*/
|
|
14
|
+
function generateTaskPrompt(task, feature) {
|
|
15
|
+
return `Execute implementation task ${task.id} for feature "${feature}":
|
|
16
|
+
|
|
17
|
+
Task: ${task.title}
|
|
18
|
+
|
|
19
|
+
Description:
|
|
20
|
+
${task.description}
|
|
21
|
+
|
|
22
|
+
Instructions:
|
|
23
|
+
1. Implement the task as described
|
|
24
|
+
2. Write tests before implementation (TDD)
|
|
25
|
+
3. Ensure all existing tests pass
|
|
26
|
+
4. Follow the project's coding standards
|
|
27
|
+
`;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Create task runner service
|
|
31
|
+
* Requirements: 5.2, 5.3, 5.4 - Factory function for task execution
|
|
32
|
+
*/
|
|
33
|
+
export function createTaskRunner(agentInvoker, commitService, taskParser) {
|
|
34
|
+
let aborted = false;
|
|
35
|
+
return {
|
|
36
|
+
/**
|
|
37
|
+
* Execute tasks sequentially
|
|
38
|
+
* Requirements: 5.2 - Execute tasks in order via AgentInvoker
|
|
39
|
+
* Requirements: 5.3 - Commit after each successful task
|
|
40
|
+
* Requirements: 5.4 - Report progress to callback
|
|
41
|
+
*/
|
|
42
|
+
async execute(options) {
|
|
43
|
+
aborted = false;
|
|
44
|
+
// Parse tasks from spec directory
|
|
45
|
+
const allTasks = await taskParser.parse(options.specDir);
|
|
46
|
+
const pendingTasks = taskParser.getPendingTasks(allTasks);
|
|
47
|
+
// Start from specified index
|
|
48
|
+
const tasksToExecute = pendingTasks.slice(options.startFromTask);
|
|
49
|
+
const totalTasks = pendingTasks.length;
|
|
50
|
+
if (tasksToExecute.length === 0) {
|
|
51
|
+
return {
|
|
52
|
+
success: true,
|
|
53
|
+
completedTasks: 0,
|
|
54
|
+
totalTasks,
|
|
55
|
+
pausedAt: undefined,
|
|
56
|
+
error: undefined
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
let completedCount = options.startFromTask;
|
|
60
|
+
for (const task of tasksToExecute) {
|
|
61
|
+
// Check for abort
|
|
62
|
+
if (aborted) {
|
|
63
|
+
return {
|
|
64
|
+
success: false,
|
|
65
|
+
completedTasks: completedCount,
|
|
66
|
+
totalTasks,
|
|
67
|
+
pausedAt: undefined,
|
|
68
|
+
error: 'Execution aborted'
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
// Invoke agent for task
|
|
72
|
+
const prompt = generateTaskPrompt(task, options.feature);
|
|
73
|
+
const result = await agentInvoker.invoke({
|
|
74
|
+
prompt,
|
|
75
|
+
workingDirectory: options.workingDir,
|
|
76
|
+
skipPermissions: options.flags.skipPermissions,
|
|
77
|
+
tier: options.flags.tier
|
|
78
|
+
});
|
|
79
|
+
if (!result.success) {
|
|
80
|
+
return {
|
|
81
|
+
success: false,
|
|
82
|
+
completedTasks: completedCount,
|
|
83
|
+
totalTasks,
|
|
84
|
+
pausedAt: undefined,
|
|
85
|
+
error: result.stderr || 'Agent execution failed'
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
// Commit changes after successful task
|
|
89
|
+
const commitMessage = commitService.formatTaskCommitMessage(options.feature, completedCount + 1, task.title);
|
|
90
|
+
await commitService.stageAndCommit(options.workingDir, commitMessage);
|
|
91
|
+
completedCount++;
|
|
92
|
+
// Report progress
|
|
93
|
+
options.onProgress(completedCount, totalTasks, task);
|
|
94
|
+
// Check for checkpoint (every 3 tasks)
|
|
95
|
+
if (completedCount % CHECKPOINT_INTERVAL === 0) {
|
|
96
|
+
const decision = await options.onCheckpoint(completedCount, totalTasks);
|
|
97
|
+
if (decision === 'pause') {
|
|
98
|
+
return {
|
|
99
|
+
success: true,
|
|
100
|
+
completedTasks: completedCount,
|
|
101
|
+
totalTasks,
|
|
102
|
+
pausedAt: completedCount,
|
|
103
|
+
error: undefined
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
if (decision === 'abort') {
|
|
107
|
+
return {
|
|
108
|
+
success: false,
|
|
109
|
+
completedTasks: completedCount,
|
|
110
|
+
totalTasks,
|
|
111
|
+
pausedAt: undefined,
|
|
112
|
+
error: 'Execution aborted by user'
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
return {
|
|
118
|
+
success: true,
|
|
119
|
+
completedTasks: completedCount,
|
|
120
|
+
totalTasks,
|
|
121
|
+
pausedAt: undefined,
|
|
122
|
+
error: undefined
|
|
123
|
+
};
|
|
124
|
+
},
|
|
125
|
+
/**
|
|
126
|
+
* Abort running task execution
|
|
127
|
+
* Requirements: 5.6 - Allow abort at any point
|
|
128
|
+
*/
|
|
129
|
+
abort() {
|
|
130
|
+
aborted = true;
|
|
131
|
+
agentInvoker.abort();
|
|
132
|
+
}
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
//# sourceMappingURL=TaskRunner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TaskRunner.js","sourceRoot":"","sources":["../../src/services/TaskRunner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Template service for file extraction and transformation
|
|
3
|
+
* Requirements: 1.3, 2.1-2.7, 3.1-3.6
|
|
4
|
+
*/
|
|
5
|
+
import type { CodingAgent } from '../types/index.js';
|
|
6
|
+
/**
|
|
7
|
+
* Structure creation result
|
|
8
|
+
*/
|
|
9
|
+
export interface StructureResult {
|
|
10
|
+
readonly createdDirs: readonly string[];
|
|
11
|
+
readonly createdFiles: readonly string[];
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Stack template application options
|
|
15
|
+
*/
|
|
16
|
+
export interface StackTemplateOptions {
|
|
17
|
+
readonly sourceDir: string;
|
|
18
|
+
readonly targetDir: string;
|
|
19
|
+
readonly stack: string;
|
|
20
|
+
readonly variables: Record<string, string>;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Tarball extraction options
|
|
24
|
+
*/
|
|
25
|
+
export interface ExtractOptions {
|
|
26
|
+
readonly tarballPath: string;
|
|
27
|
+
readonly targetDir: string;
|
|
28
|
+
readonly onProgress?: (file: string) => void;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Framework installation options
|
|
32
|
+
*/
|
|
33
|
+
export interface InstallFrameworkOptions {
|
|
34
|
+
readonly sourceDir: string;
|
|
35
|
+
readonly targetDir: string;
|
|
36
|
+
readonly variables?: Record<string, string>;
|
|
37
|
+
readonly agent?: CodingAgent;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Template service interface
|
|
41
|
+
* Requirements: 1.3, 2.1-2.7, 3.1-3.6
|
|
42
|
+
*/
|
|
43
|
+
export interface TemplateService {
|
|
44
|
+
/**
|
|
45
|
+
* Extract tarball and transform contents
|
|
46
|
+
* - Extracts to targetDir/.red64/
|
|
47
|
+
* - Renames kiro references to red64
|
|
48
|
+
*/
|
|
49
|
+
extract(options: ExtractOptions): Promise<StructureResult>;
|
|
50
|
+
/**
|
|
51
|
+
* Create unified directory structure
|
|
52
|
+
*/
|
|
53
|
+
createStructure(targetDir: string): Promise<StructureResult>;
|
|
54
|
+
/**
|
|
55
|
+
* Install the full framework from source to target
|
|
56
|
+
* Copies framework/.red64/ to target/.red64/
|
|
57
|
+
*/
|
|
58
|
+
installFramework(options: InstallFrameworkOptions): Promise<StructureResult>;
|
|
59
|
+
/**
|
|
60
|
+
* Apply stack-specific steering templates
|
|
61
|
+
*/
|
|
62
|
+
applyStackTemplates(options: StackTemplateOptions): Promise<readonly string[]>;
|
|
63
|
+
/**
|
|
64
|
+
* List available stacks in extracted source
|
|
65
|
+
*/
|
|
66
|
+
listStacks(sourceDir: string): Promise<readonly string[]>;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Create template service
|
|
70
|
+
* Task 2.3, 3.1, 3.2: Template service factory
|
|
71
|
+
*/
|
|
72
|
+
export declare function createTemplateService(): TemplateService;
|
|
73
|
+
//# sourceMappingURL=TemplateService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TemplateService.d.ts","sourceRoot":"","sources":["../../src/services/TemplateService.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AA4BrD;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;IACxC,QAAQ,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;CAC1C;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC5C;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9C;AAED;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5C,QAAQ,CAAC,KAAK,CAAC,EAAE,WAAW,CAAC;CAC9B;AAED;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B;;;;OAIG;IACH,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IAE3D;;OAEG;IACH,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IAE7D;;;OAGG;IACH,gBAAgB,CAAC,OAAO,EAAE,uBAAuB,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IAE7E;;OAEG;IACH,mBAAmB,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,SAAS,MAAM,EAAE,CAAC,CAAC;IAE/E;;OAEG;IACH,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,MAAM,EAAE,CAAC,CAAC;CAC3D;AAgJD;;;GAGG;AACH,wBAAgB,qBAAqB,IAAI,eAAe,CAuIvD"}
|
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Template service for file extraction and transformation
|
|
3
|
+
* Requirements: 1.3, 2.1-2.7, 3.1-3.6
|
|
4
|
+
*/
|
|
5
|
+
import { mkdir, readFile, writeFile, readdir, access, stat } from 'node:fs/promises';
|
|
6
|
+
import { join } from 'node:path';
|
|
7
|
+
/**
|
|
8
|
+
* Configuration for each supported coding agent
|
|
9
|
+
*/
|
|
10
|
+
const AGENT_CONFIGS = {
|
|
11
|
+
claude: {
|
|
12
|
+
configDir: '.claude',
|
|
13
|
+
instructionFile: 'CLAUDE.md'
|
|
14
|
+
},
|
|
15
|
+
gemini: {
|
|
16
|
+
configDir: '', // Gemini doesn't use a hidden config directory
|
|
17
|
+
instructionFile: 'GEMINI.md'
|
|
18
|
+
},
|
|
19
|
+
codex: {
|
|
20
|
+
configDir: '.codex',
|
|
21
|
+
instructionFile: 'AGENTS.md'
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* The unified directory structure to create
|
|
26
|
+
* Requirements: 2.1-2.6
|
|
27
|
+
*/
|
|
28
|
+
const STRUCTURE_DIRS = [
|
|
29
|
+
'.red64',
|
|
30
|
+
'.red64/steering',
|
|
31
|
+
'.red64/specs',
|
|
32
|
+
'.red64/templates',
|
|
33
|
+
'.red64/settings',
|
|
34
|
+
'.red64/settings/rules',
|
|
35
|
+
'.red64/settings/templates'
|
|
36
|
+
];
|
|
37
|
+
/**
|
|
38
|
+
* Perform kiro-to-red64 renaming in content
|
|
39
|
+
* Task 3.1: Case-aware string replacement
|
|
40
|
+
*/
|
|
41
|
+
function transformContent(content) {
|
|
42
|
+
return content
|
|
43
|
+
// Directory references
|
|
44
|
+
.replace(/\.kiro\//g, '.red64/')
|
|
45
|
+
.replace(/\.kiro(?=[^/a-z]|$)/g, '.red64')
|
|
46
|
+
// Slash command references
|
|
47
|
+
.replace(/\/kiro:/g, '/red64:')
|
|
48
|
+
// Hyphenated references (kiro-cli, kiro-spec, etc.)
|
|
49
|
+
.replace(/kiro-/g, 'red64-')
|
|
50
|
+
// Capitalized references
|
|
51
|
+
.replace(/Kiro/g, 'Red64')
|
|
52
|
+
// All caps references
|
|
53
|
+
.replace(/KIRO/g, 'RED64')
|
|
54
|
+
// Standalone lowercase
|
|
55
|
+
.replace(/\bkiro\b/g, 'red64');
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Replace template variables in content
|
|
59
|
+
* Variables are in format {{variableName}}
|
|
60
|
+
*/
|
|
61
|
+
function replaceVariables(content, variables) {
|
|
62
|
+
let result = content;
|
|
63
|
+
for (const [key, value] of Object.entries(variables)) {
|
|
64
|
+
const pattern = new RegExp(`\\{\\{${key}\\}\\}`, 'g');
|
|
65
|
+
result = result.replace(pattern, value);
|
|
66
|
+
}
|
|
67
|
+
return result;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Check if path exists
|
|
71
|
+
*/
|
|
72
|
+
async function pathExists(path) {
|
|
73
|
+
try {
|
|
74
|
+
await access(path);
|
|
75
|
+
return true;
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
return false;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Check if path is a directory
|
|
83
|
+
*/
|
|
84
|
+
async function isDirectory(path) {
|
|
85
|
+
try {
|
|
86
|
+
const stats = await stat(path);
|
|
87
|
+
return stats.isDirectory();
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
return false;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Copy framework directory recursively, tracking created dirs and files
|
|
95
|
+
*/
|
|
96
|
+
async function copyFrameworkDir(srcDir, destDir, variables, createdDirs, createdFiles, relativePath = '') {
|
|
97
|
+
await mkdir(destDir, { recursive: true });
|
|
98
|
+
if (relativePath) {
|
|
99
|
+
createdDirs.push(relativePath);
|
|
100
|
+
}
|
|
101
|
+
const entries = await readdir(srcDir, { withFileTypes: true });
|
|
102
|
+
for (const entry of entries) {
|
|
103
|
+
const srcPath = join(srcDir, entry.name);
|
|
104
|
+
const destPath = join(destDir, entry.name);
|
|
105
|
+
const entryRelPath = relativePath ? `${relativePath}/${entry.name}` : entry.name;
|
|
106
|
+
if (entry.isDirectory()) {
|
|
107
|
+
await copyFrameworkDir(srcPath, destPath, variables, createdDirs, createdFiles, entryRelPath);
|
|
108
|
+
}
|
|
109
|
+
else if (entry.isFile()) {
|
|
110
|
+
let content = await readFile(srcPath, 'utf-8');
|
|
111
|
+
content = replaceVariables(content, variables);
|
|
112
|
+
await writeFile(destPath, content, 'utf-8');
|
|
113
|
+
createdFiles.push(entryRelPath);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Copy directory recursively with transformations
|
|
119
|
+
*/
|
|
120
|
+
async function copyDirWithTransform(srcDir, destDir, variables) {
|
|
121
|
+
const copiedFiles = [];
|
|
122
|
+
// Ensure destination exists
|
|
123
|
+
await mkdir(destDir, { recursive: true });
|
|
124
|
+
const entries = await readdir(srcDir, { withFileTypes: true });
|
|
125
|
+
for (const entry of entries) {
|
|
126
|
+
const srcPath = join(srcDir, entry.name);
|
|
127
|
+
const destPath = join(destDir, entry.name);
|
|
128
|
+
if (entry.isDirectory()) {
|
|
129
|
+
// Recursively copy subdirectories
|
|
130
|
+
const subFiles = await copyDirWithTransform(srcPath, destPath, variables);
|
|
131
|
+
copiedFiles.push(...subFiles);
|
|
132
|
+
}
|
|
133
|
+
else if (entry.isFile()) {
|
|
134
|
+
// Read, transform, and write file
|
|
135
|
+
let content = await readFile(srcPath, 'utf-8');
|
|
136
|
+
content = transformContent(content);
|
|
137
|
+
content = replaceVariables(content, variables);
|
|
138
|
+
await writeFile(destPath, content, 'utf-8');
|
|
139
|
+
copiedFiles.push(entry.name);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
return copiedFiles;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Create template service
|
|
146
|
+
* Task 2.3, 3.1, 3.2: Template service factory
|
|
147
|
+
*/
|
|
148
|
+
export function createTemplateService() {
|
|
149
|
+
return {
|
|
150
|
+
async extract(_options) {
|
|
151
|
+
// Note: Full tarball extraction will be implemented separately
|
|
152
|
+
// This placeholder allows testing the interface
|
|
153
|
+
const createdDirs = [];
|
|
154
|
+
const createdFiles = [];
|
|
155
|
+
return { createdDirs, createdFiles };
|
|
156
|
+
},
|
|
157
|
+
async createStructure(targetDir) {
|
|
158
|
+
const createdDirs = [];
|
|
159
|
+
const createdFiles = [];
|
|
160
|
+
// Create all required directories
|
|
161
|
+
for (const dir of STRUCTURE_DIRS) {
|
|
162
|
+
const fullPath = join(targetDir, dir);
|
|
163
|
+
await mkdir(fullPath, { recursive: true });
|
|
164
|
+
createdDirs.push(dir);
|
|
165
|
+
}
|
|
166
|
+
return { createdDirs, createdFiles };
|
|
167
|
+
},
|
|
168
|
+
async installFramework(options) {
|
|
169
|
+
const { sourceDir, targetDir, variables = {}, agent = 'claude' } = options;
|
|
170
|
+
const createdDirs = [];
|
|
171
|
+
const createdFiles = [];
|
|
172
|
+
const agentConfig = AGENT_CONFIGS[agent];
|
|
173
|
+
const agentSourceDir = join(sourceDir, 'agents', agent);
|
|
174
|
+
// 1. Copy agent-specific config directory (e.g., .claude/, .codex/)
|
|
175
|
+
if (agentConfig.configDir) {
|
|
176
|
+
const configSrc = join(agentSourceDir, agentConfig.configDir);
|
|
177
|
+
const configDest = join(targetDir, agentConfig.configDir);
|
|
178
|
+
if (await pathExists(configSrc)) {
|
|
179
|
+
await copyFrameworkDir(configSrc, configDest, variables, createdDirs, createdFiles);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
// 2. Copy shared .red64/ directory (settings, templates)
|
|
183
|
+
const red64Src = join(sourceDir, '.red64');
|
|
184
|
+
const red64Dest = join(targetDir, '.red64');
|
|
185
|
+
if (await pathExists(red64Src)) {
|
|
186
|
+
await copyFrameworkDir(red64Src, red64Dest, variables, createdDirs, createdFiles);
|
|
187
|
+
}
|
|
188
|
+
else {
|
|
189
|
+
// Fall back to creating empty structure if framework not found
|
|
190
|
+
return this.createStructure(targetDir);
|
|
191
|
+
}
|
|
192
|
+
// 3. Copy agent-specific instruction file (e.g., CLAUDE.md, GEMINI.md, AGENTS.md)
|
|
193
|
+
const instructionSrc = join(agentSourceDir, 'docs', agentConfig.instructionFile);
|
|
194
|
+
const instructionDest = join(targetDir, agentConfig.instructionFile);
|
|
195
|
+
if (await pathExists(instructionSrc)) {
|
|
196
|
+
let content = await readFile(instructionSrc, 'utf-8');
|
|
197
|
+
content = replaceVariables(content, variables);
|
|
198
|
+
await writeFile(instructionDest, content, 'utf-8');
|
|
199
|
+
createdFiles.push(agentConfig.instructionFile);
|
|
200
|
+
}
|
|
201
|
+
// 4. For Gemini: Copy commands.toml if present
|
|
202
|
+
if (agent === 'gemini') {
|
|
203
|
+
const tomlSrc = join(agentSourceDir, 'commands.toml');
|
|
204
|
+
const tomlDest = join(targetDir, 'commands.toml');
|
|
205
|
+
if (await pathExists(tomlSrc)) {
|
|
206
|
+
let content = await readFile(tomlSrc, 'utf-8');
|
|
207
|
+
content = replaceVariables(content, variables);
|
|
208
|
+
await writeFile(tomlDest, content, 'utf-8');
|
|
209
|
+
createdFiles.push('commands.toml');
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
// 5. Ensure additional directories exist (specs, steering)
|
|
213
|
+
const additionalDirs = ['.red64/specs', '.red64/steering'];
|
|
214
|
+
for (const dir of additionalDirs) {
|
|
215
|
+
const fullPath = join(targetDir, dir);
|
|
216
|
+
if (!(await pathExists(fullPath))) {
|
|
217
|
+
await mkdir(fullPath, { recursive: true });
|
|
218
|
+
createdDirs.push(dir);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
return { createdDirs, createdFiles };
|
|
222
|
+
},
|
|
223
|
+
async applyStackTemplates(options) {
|
|
224
|
+
const { sourceDir, targetDir, stack, variables } = options;
|
|
225
|
+
const stacksDir = join(sourceDir, 'stacks');
|
|
226
|
+
// Ensure steering directory exists
|
|
227
|
+
const steeringDir = join(targetDir, '.red64', 'steering');
|
|
228
|
+
await mkdir(steeringDir, { recursive: true });
|
|
229
|
+
// Try to find the stack directory
|
|
230
|
+
let stackDir = join(stacksDir, stack);
|
|
231
|
+
let stackExists = await isDirectory(stackDir);
|
|
232
|
+
// Fall back to generic if stack not found
|
|
233
|
+
if (!stackExists) {
|
|
234
|
+
stackDir = join(stacksDir, 'generic');
|
|
235
|
+
stackExists = await isDirectory(stackDir);
|
|
236
|
+
}
|
|
237
|
+
if (!stackExists) {
|
|
238
|
+
return [];
|
|
239
|
+
}
|
|
240
|
+
// Copy and transform files
|
|
241
|
+
const copiedFiles = await copyDirWithTransform(stackDir, steeringDir, variables);
|
|
242
|
+
return copiedFiles;
|
|
243
|
+
},
|
|
244
|
+
async listStacks(sourceDir) {
|
|
245
|
+
const stacksDir = join(sourceDir, 'stacks');
|
|
246
|
+
if (!(await pathExists(stacksDir))) {
|
|
247
|
+
return [];
|
|
248
|
+
}
|
|
249
|
+
try {
|
|
250
|
+
const entries = await readdir(stacksDir, { withFileTypes: true });
|
|
251
|
+
const stacks = entries
|
|
252
|
+
.filter(entry => entry.isDirectory())
|
|
253
|
+
.map(entry => entry.name)
|
|
254
|
+
.sort();
|
|
255
|
+
return stacks;
|
|
256
|
+
}
|
|
257
|
+
catch {
|
|
258
|
+
return [];
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
//# sourceMappingURL=TemplateService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TemplateService.js","sourceRoot":"","sources":["../../src/services/TemplateService.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Worktree Service
|
|
3
|
+
* Task 1.2: Build worktree service for git worktree operations
|
|
4
|
+
* Requirements: 1.3, 1.4
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Worktree information
|
|
8
|
+
* Requirements: 1.3 - Check for existing worktree
|
|
9
|
+
*/
|
|
10
|
+
export interface WorktreeInfo {
|
|
11
|
+
readonly path: string;
|
|
12
|
+
readonly branch: string;
|
|
13
|
+
readonly exists: boolean;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Worktree operation result
|
|
17
|
+
* Requirements: 1.4 - Create worktree with branch
|
|
18
|
+
*/
|
|
19
|
+
export interface WorktreeResult {
|
|
20
|
+
readonly success: boolean;
|
|
21
|
+
readonly path: string | undefined;
|
|
22
|
+
readonly error: string | undefined;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Worktree service interface
|
|
26
|
+
* Requirements: 1.3, 1.4
|
|
27
|
+
*/
|
|
28
|
+
export interface WorktreeServiceInterface {
|
|
29
|
+
check(repoPath: string, feature: string): Promise<WorktreeInfo>;
|
|
30
|
+
create(repoPath: string, feature: string): Promise<WorktreeResult>;
|
|
31
|
+
remove(repoPath: string, feature: string, force?: boolean): Promise<WorktreeResult>;
|
|
32
|
+
list(repoPath: string): Promise<readonly WorktreeInfo[]>;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Sanitize feature name for use in git branch names and paths
|
|
36
|
+
* - Replace spaces with hyphens
|
|
37
|
+
* - Remove invalid characters
|
|
38
|
+
* - Convert to lowercase
|
|
39
|
+
*/
|
|
40
|
+
export declare function sanitizeFeatureName(feature: string): string;
|
|
41
|
+
/**
|
|
42
|
+
* Get the worktrees root directory (sibling to repo)
|
|
43
|
+
* Following GitLens/VSCode convention: ../repo-name.worktrees/
|
|
44
|
+
*/
|
|
45
|
+
export declare function getWorktreesRoot(repoPath: string): string;
|
|
46
|
+
/**
|
|
47
|
+
* Create worktree service
|
|
48
|
+
* Requirements: 1.3, 1.4 - Factory function for git worktree operations
|
|
49
|
+
*/
|
|
50
|
+
export declare function createWorktreeService(): WorktreeServiceInterface;
|
|
51
|
+
//# sourceMappingURL=WorktreeService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WorktreeService.d.ts","sourceRoot":"","sources":["../../src/services/WorktreeService.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;CAC1B;AAED;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;CACpC;AAED;;;GAGG;AACH,MAAM,WAAW,wBAAwB;IACvC,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IAChE,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;IACnE,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;IACpF,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,YAAY,EAAE,CAAC,CAAC;CAC1D;AAiFD;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAO3D;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAIzD;AAiBD;;;GAGG;AACH,wBAAgB,qBAAqB,IAAI,wBAAwB,CAiHhE"}
|