diff --git a/.planning/phases/14-parallel-phase-execution/14-01-PLAN.md b/.planning/phases/14-parallel-phase-execution/14-01-PLAN.md new file mode 100644 index 0000000..dbaee1a --- /dev/null +++ b/.planning/phases/14-parallel-phase-execution/14-01-PLAN.md @@ -0,0 +1,104 @@ +--- +phase: 14-parallel-phase-execution +plan: 01 +type: execute +wave: 1 +depends_on: [] +files_modified: + - src/db/schema.ts + - src/db/repositories/phase-repository.ts + - src/db/repositories/drizzle/phase.ts +autonomous: true +--- + + +Add phase dependencies to database schema and repository following the task_dependencies pattern. + +Purpose: Enable tracking which phases depend on which other phases, prerequisite for parallel execution. +Output: phase_dependencies table, PhaseRepository with dependency methods. + + + +@~/.claude/get-shit-done/workflows/execute-plan.md +@~/.claude/get-shit-done/templates/summary.md + + + +@.planning/PROJECT.md +@.planning/ROADMAP.md +@.planning/STATE.md + +# Reference implementations: +@src/db/schema.ts +@src/db/repositories/task-repository.ts +@src/db/repositories/drizzle/task.ts + + + + + + Task 1: Add phase_dependencies table to schema + src/db/schema.ts + +Add phase_dependencies table mirroring task_dependencies: +- id (text, primary key) +- phaseId (text, FK to phases.id, cascade delete) +- dependsOnPhaseId (text, FK to phases.id, cascade delete) +- createdAt (integer timestamp) + +Add relations for phases: +- dependsOn: many(phaseDependencies, relationName: 'dependentPhase') +- dependents: many(phaseDependencies, relationName: 'dependencyPhase') + +Add phaseDependenciesRelations with: +- phase: one(phases, dependentPhase) +- dependsOnPhase: one(phases, dependencyPhase) + +Export PhaseDependency and NewPhaseDependency types. + + npx tsc --noEmit passes + phase_dependencies table defined with proper FK relations and types exported + + + + Task 2: Add dependency methods to PhaseRepository + src/db/repositories/phase-repository.ts, src/db/repositories/drizzle/phase.ts + +Add to PhaseRepository interface: +- createDependency(phaseId: string, dependsOnPhaseId: string): Promise +- getDependencies(phaseId: string): Promise (returns IDs of phases this phase depends on) +- getDependents(phaseId: string): Promise (returns IDs of phases that depend on this phase) + +Implement in DrizzlePhaseRepository: +- createDependency: insert into phase_dependencies with nanoid +- getDependencies: select dependsOnPhaseId where phaseId = input +- getDependents: select phaseId where dependsOnPhaseId = input + +Follow exact patterns from DrizzleTaskRepository.createDependency. + + npx tsc --noEmit passes; npm test -- --grep "phase" passes + PhaseRepository has dependency methods, Drizzle adapter implements them + + + + + +Before declaring plan complete: +- [ ] `npm run build` succeeds without errors +- [ ] `npm test` passes all tests +- [ ] Phase dependency types exported from schema +- [ ] PhaseRepository interface has 3 new methods +- [ ] DrizzlePhaseRepository implements all methods + + + + +- All tasks completed +- All verification checks pass +- Schema matches task_dependencies pattern +- Repository follows hexagonal architecture + + + +After completion, create `.planning/phases/14-parallel-phase-execution/14-01-SUMMARY.md` + diff --git a/.planning/phases/14-parallel-phase-execution/14-02-PLAN.md b/.planning/phases/14-parallel-phase-execution/14-02-PLAN.md new file mode 100644 index 0000000..677c3ce --- /dev/null +++ b/.planning/phases/14-parallel-phase-execution/14-02-PLAN.md @@ -0,0 +1,101 @@ +--- +phase: 14-parallel-phase-execution +plan: 02 +type: execute +wave: 1 +depends_on: [] +files_modified: + - src/events/types.ts + - src/events/index.ts +autonomous: true +--- + + +Add phase lifecycle events for parallel execution coordination. + +Purpose: Enable event-driven coordination of parallel phase execution. +Output: Phase domain events (queued, started, completed, blocked). + + + +@~/.claude/get-shit-done/workflows/execute-plan.md +@~/.claude/get-shit-done/templates/summary.md + + + +@.planning/PROJECT.md +@.planning/ROADMAP.md +@.planning/STATE.md + +# Reference implementations: +@src/events/types.ts +@src/events/index.ts + + + + + + Task 1: Add phase domain events + src/events/types.ts + +Add phase events to DomainEventMap following task event patterns: + +PhaseQueuedEvent: +- type: 'phase:queued' +- payload: { phaseId, initiativeId, dependsOn: string[] } + +PhaseStartedEvent: +- type: 'phase:started' +- payload: { phaseId, initiativeId } + +PhaseCompletedEvent: +- type: 'phase:completed' +- payload: { phaseId, initiativeId, success: boolean, message?: string } + +PhaseBlockedEvent: +- type: 'phase:blocked' +- payload: { phaseId, reason: string } + +Add to DomainEventMap: +- 'phase:queued': PhaseQueuedEvent +- 'phase:started': PhaseStartedEvent +- 'phase:completed': PhaseCompletedEvent +- 'phase:blocked': PhaseBlockedEvent + + npx tsc --noEmit passes + Four phase events defined in DomainEventMap + + + + Task 2: Export phase events + src/events/index.ts + +Add exports for the four new phase event types: +- PhaseQueuedEvent +- PhaseStartedEvent +- PhaseCompletedEvent +- PhaseBlockedEvent + + npx tsc --noEmit passes + Phase events exported from events module + + + + + +Before declaring plan complete: +- [ ] `npm run build` succeeds without errors +- [ ] `npm test` passes all tests +- [ ] All four phase events importable from src/events + + + + +- All tasks completed +- All verification checks pass +- Events follow existing naming pattern (phase:queued, phase:started, etc.) + + + +After completion, create `.planning/phases/14-parallel-phase-execution/14-02-SUMMARY.md` + diff --git a/.planning/phases/14-parallel-phase-execution/14-03-PLAN.md b/.planning/phases/14-parallel-phase-execution/14-03-PLAN.md new file mode 100644 index 0000000..da2f3f0 --- /dev/null +++ b/.planning/phases/14-parallel-phase-execution/14-03-PLAN.md @@ -0,0 +1,103 @@ +--- +phase: 14-parallel-phase-execution +plan: 03 +type: execute +wave: 2 +depends_on: ["14-01", "14-02"] +files_modified: + - src/dispatch/phase-dispatch.ts + - src/dispatch/types.ts + - src/dispatch/index.ts +autonomous: true +--- + + +Create PhaseDispatchManager port interface for dependency-ordered phase execution. + +Purpose: Enable queuing and dispatching phases based on their dependencies. +Output: PhaseDispatchManager interface with queue/dispatch operations. + + + +@~/.claude/get-shit-done/workflows/execute-plan.md +@~/.claude/get-shit-done/templates/summary.md + + + +@.planning/PROJECT.md +@.planning/ROADMAP.md +@.planning/STATE.md +@.planning/phases/14-parallel-phase-execution/14-01-SUMMARY.md +@.planning/phases/14-parallel-phase-execution/14-02-SUMMARY.md + +# Reference implementations: +@src/dispatch/types.ts +@src/dispatch/manager.ts + + + + + + Task 1: Define PhaseDispatchManager port interface + src/dispatch/types.ts + +Add types for phase dispatch: + +QueuedPhase interface: +- phaseId: string +- initiativeId: string +- queuedAt: Date +- dependsOn: string[] (phase IDs) + +PhaseDispatchResult interface: +- success: boolean +- phaseId: string +- reason?: string (failure reason) + +PhaseDispatchManager port interface: +- queuePhase(phaseId: string): Promise +- getNextDispatchablePhase(): Promise +- dispatchNextPhase(): Promise +- completePhase(phaseId: string): Promise +- blockPhase(phaseId: string, reason: string): Promise +- getPhaseQueueState(): Promise<{ queued: QueuedPhase[], ready: QueuedPhase[], blocked: Array<{phaseId: string, reason: string}> }> + +Follow exact patterns from DispatchManager for tasks. + + npx tsc --noEmit passes + PhaseDispatchManager interface defined with all methods + + + + Task 2: Export phase dispatch types + src/dispatch/index.ts + +Export new types from dispatch module: +- QueuedPhase +- PhaseDispatchResult +- PhaseDispatchManager + + npx tsc --noEmit passes + Phase dispatch types exported from dispatch module + + + + + +Before declaring plan complete: +- [ ] `npm run build` succeeds without errors +- [ ] `npm test` passes all tests +- [ ] PhaseDispatchManager importable from src/dispatch + + + + +- All tasks completed +- All verification checks pass +- Interface follows hexagonal architecture (port pattern) +- Methods mirror DispatchManager for consistency + + + +After completion, create `.planning/phases/14-parallel-phase-execution/14-03-SUMMARY.md` + diff --git a/.planning/phases/14-parallel-phase-execution/14-04-PLAN.md b/.planning/phases/14-parallel-phase-execution/14-04-PLAN.md new file mode 100644 index 0000000..4a3cc0c --- /dev/null +++ b/.planning/phases/14-parallel-phase-execution/14-04-PLAN.md @@ -0,0 +1,98 @@ +--- +phase: 14-parallel-phase-execution +plan: 04 +type: execute +wave: 3 +depends_on: ["14-03"] +files_modified: + - src/dispatch/phase-manager.ts + - src/dispatch/index.ts +autonomous: true +--- + + +Implement DefaultPhaseDispatchManager adapter with in-memory queue and dependency checking. + +Purpose: Enable actual phase dispatch with dependency resolution. +Output: Working adapter implementation. + + + +@~/.claude/get-shit-done/workflows/execute-plan.md +@~/.claude/get-shit-done/templates/summary.md + + + +@.planning/PROJECT.md +@.planning/ROADMAP.md +@.planning/STATE.md +@.planning/phases/14-parallel-phase-execution/14-03-SUMMARY.md + +# Reference implementations: +@src/dispatch/manager.ts +@src/dispatch/types.ts + + + + + + Task 1: Implement DefaultPhaseDispatchManager + src/dispatch/phase-manager.ts + +Create DefaultPhaseDispatchManager class implementing PhaseDispatchManager: + +Constructor dependencies: +- phaseRepository: PhaseRepository +- eventBus: EventBus + +Internal state: +- phaseQueue: Map +- blockedPhases: Map + +Implement methods: +- queuePhase: fetch phase, get dependencies from phaseRepository.getDependencies(), add to queue, emit PhaseQueuedEvent +- getNextDispatchablePhase: filter queue for phases with all deps complete (phase.status === 'completed'), sort by queuedAt +- dispatchNextPhase: get next, update phase status to 'in_progress', emit PhaseStartedEvent, return result +- completePhase: update phase status to 'completed', remove from queue, emit PhaseCompletedEvent +- blockPhase: update phase status, add to blocked map, remove from queue, emit PhaseBlockedEvent +- getPhaseQueueState: return current state of queued, ready, blocked + +Private helper: +- areAllPhaseDependenciesComplete(dependsOn: string[]): check each phase status via phaseRepository.findById + +Follow exact patterns from DefaultDispatchManager for consistency. + + npx tsc --noEmit passes + DefaultPhaseDispatchManager implements all interface methods + + + + Task 2: Export DefaultPhaseDispatchManager + src/dispatch/index.ts + +Add export for DefaultPhaseDispatchManager class. + + npx tsc --noEmit passes + DefaultPhaseDispatchManager exported from dispatch module + + + + + +Before declaring plan complete: +- [ ] `npm run build` succeeds without errors +- [ ] `npm test` passes all tests +- [ ] DefaultPhaseDispatchManager importable from src/dispatch + + + + +- All tasks completed +- All verification checks pass +- Adapter follows hexagonal architecture pattern +- Event emission matches phase event types from 14-02 + + + +After completion, create `.planning/phases/14-parallel-phase-execution/14-04-SUMMARY.md` + diff --git a/.planning/phases/14-parallel-phase-execution/14-05-PLAN.md b/.planning/phases/14-parallel-phase-execution/14-05-PLAN.md new file mode 100644 index 0000000..e6d1cf5 --- /dev/null +++ b/.planning/phases/14-parallel-phase-execution/14-05-PLAN.md @@ -0,0 +1,112 @@ +--- +phase: 14-parallel-phase-execution +plan: 05 +type: execute +wave: 3 +depends_on: ["14-01"] +files_modified: + - src/trpc/context.ts + - src/trpc/router.ts +autonomous: true +--- + + +Add tRPC procedures for phase dependencies and dispatch. + +Purpose: Expose phase dependency and dispatch operations via API. +Output: tRPC procedures for creating dependencies and managing phase queue. + + + +@~/.claude/get-shit-done/workflows/execute-plan.md +@~/.claude/get-shit-done/templates/summary.md + + + +@.planning/PROJECT.md +@.planning/ROADMAP.md +@.planning/STATE.md +@.planning/phases/14-parallel-phase-execution/14-01-SUMMARY.md + +# Reference implementations: +@src/trpc/router.ts +@src/trpc/context.ts + + + + + + Task 1: Add PhaseDispatchManager to tRPC context + src/trpc/context.ts + +Add optional phaseDispatchManager to AppContext: +- phaseDispatchManager?: PhaseDispatchManager + +Import PhaseDispatchManager from dispatch module. +Follow same pattern as agentManager (optional, undefined by default). + + npx tsc --noEmit passes + PhaseDispatchManager available in tRPC context + + + + Task 2: Add phase dependency and dispatch procedures + src/trpc/router.ts + +Add procedures under existing phase group: + +createPhaseDependency: +- input: { phaseId: string, dependsOnPhaseId: string } +- validates both phases exist +- calls phaseRepository.createDependency() +- returns { success: true } + +getPhaseDependencies: +- input: { phaseId: string } +- returns { dependencies: string[] } from phaseRepository.getDependencies() + +Add new phase dispatch procedures: + +queuePhase: +- input: { phaseId: string } +- requires phaseDispatchManager +- calls phaseDispatchManager.queuePhase() +- returns { success: true } + +dispatchNextPhase: +- no input +- requires phaseDispatchManager +- calls phaseDispatchManager.dispatchNextPhase() +- returns PhaseDispatchResult + +getPhaseQueueState: +- no input +- requires phaseDispatchManager +- returns queue state + +Follow existing router patterns for error handling and input validation. + + npx tsc --noEmit passes + Phase dependency and dispatch procedures available via tRPC + + + + + +Before declaring plan complete: +- [ ] `npm run build` succeeds without errors +- [ ] `npm test` passes all tests +- [ ] New procedures type-check correctly + + + + +- All tasks completed +- All verification checks pass +- Procedures follow existing naming conventions +- Error handling consistent with other procedures + + + +After completion, create `.planning/phases/14-parallel-phase-execution/14-05-SUMMARY.md` + diff --git a/.planning/phases/14-parallel-phase-execution/14-06-PLAN.md b/.planning/phases/14-parallel-phase-execution/14-06-PLAN.md new file mode 100644 index 0000000..3a1cc43 --- /dev/null +++ b/.planning/phases/14-parallel-phase-execution/14-06-PLAN.md @@ -0,0 +1,103 @@ +--- +phase: 14-parallel-phase-execution +plan: 06 +type: execute +wave: 4 +depends_on: ["14-04", "14-05"] +files_modified: + - src/cli/commands/phase.ts + - src/cli/index.ts +autonomous: true +--- + + +Add CLI commands for phase dependency and dispatch operations. + +Purpose: Enable user to manage phase dependencies and parallel execution from command line. +Output: CLI commands for dependencies, queue, and dispatch. + + + +@~/.claude/get-shit-done/workflows/execute-plan.md +@~/.claude/get-shit-done/templates/summary.md + + + +@.planning/PROJECT.md +@.planning/ROADMAP.md +@.planning/STATE.md +@.planning/phases/14-parallel-phase-execution/14-04-SUMMARY.md +@.planning/phases/14-parallel-phase-execution/14-05-SUMMARY.md + +# Reference implementations: +@src/cli/commands/task.ts +@src/cli/commands/initiative.ts + + + + + + Task 1: Add phase dependency commands + src/cli/commands/phase.ts + +If phase.ts doesn't exist, create it. If exists, extend it. + +Add commands under phase group: + +cw phase add-dependency --phase --depends-on +- Calls createPhaseDependency procedure +- Output: "Added dependency: phase {phaseId} depends on {dependsOnPhaseId}" + +cw phase dependencies +- Calls getPhaseDependencies procedure +- Output: Lists dependency phase IDs or "No dependencies" + +cw phase queue +- Calls queuePhase procedure +- Output: "Phase {phaseId} queued for execution" + +cw phase dispatch +- Calls dispatchNextPhase procedure +- Output: Success message with phaseId or failure reason + +cw phase queue-status +- Calls getPhaseQueueState procedure +- Output: Formatted list of queued, ready, and blocked phases + +Follow existing CLI patterns for error handling and output formatting. + + npx tsc --noEmit passes + Phase dependency and dispatch CLI commands implemented + + + + Task 2: Register phase commands in CLI + src/cli/index.ts + +Import and register phase commands if not already registered. +Follow pattern from other command modules (task, initiative, agent). + + npx tsc --noEmit passes; cw phase --help shows new commands + Phase commands available in CLI + + + + + +Before declaring plan complete: +- [ ] `npm run build` succeeds without errors +- [ ] `npm test` passes all tests +- [ ] `cw phase --help` shows dependency and dispatch commands + + + + +- All tasks completed +- All verification checks pass +- Commands follow existing CLI patterns +- Help text is clear and concise + + + +After completion, create `.planning/phases/14-parallel-phase-execution/14-06-SUMMARY.md` + diff --git a/.planning/phases/14-parallel-phase-execution/14-07-PLAN.md b/.planning/phases/14-parallel-phase-execution/14-07-PLAN.md new file mode 100644 index 0000000..99d9194 --- /dev/null +++ b/.planning/phases/14-parallel-phase-execution/14-07-PLAN.md @@ -0,0 +1,123 @@ +--- +phase: 14-parallel-phase-execution +plan: 07 +type: execute +wave: 5 +depends_on: ["14-06"] +files_modified: + - src/dispatch/phase-manager.test.ts + - src/db/repositories/drizzle/phase.test.ts +autonomous: true +--- + + +Add unit tests for phase dependencies and dispatch. + +Purpose: Verify phase dependency and dispatch logic works correctly. +Output: Unit tests with full coverage of new functionality. + + + +@~/.claude/get-shit-done/workflows/execute-plan.md +@~/.claude/get-shit-done/templates/summary.md + + + +@.planning/PROJECT.md +@.planning/ROADMAP.md +@.planning/STATE.md +@.planning/phases/14-parallel-phase-execution/14-06-SUMMARY.md + +# Reference implementations: +@src/dispatch/manager.test.ts +@src/db/repositories/drizzle/task.test.ts + + + + + + Task 1: Add PhaseRepository dependency tests + src/db/repositories/drizzle/phase.test.ts + +Add test cases for new PhaseRepository methods: + +describe('createDependency'): +- creates dependency between two phases +- throws if phase doesn't exist +- allows multiple dependencies for same phase + +describe('getDependencies'): +- returns empty array for phase with no dependencies +- returns dependency IDs for phase with dependencies +- returns only direct dependencies (not transitive) + +describe('getDependents'): +- returns empty array for phase with no dependents +- returns dependent phase IDs +- returns only direct dependents + +Use existing test patterns with createTestDatabase() and cleanup. + + npm test -- src/db/repositories/drizzle/phase.test.ts passes + PhaseRepository dependency methods have test coverage + + + + Task 2: Add DefaultPhaseDispatchManager tests + src/dispatch/phase-manager.test.ts + +Create test file for DefaultPhaseDispatchManager: + +describe('queuePhase'): +- adds phase to queue +- emits PhaseQueuedEvent +- includes dependencies in queued phase + +describe('getNextDispatchablePhase'): +- returns null when queue empty +- returns phase with no dependencies first +- skips phases with incomplete dependencies +- returns oldest phase when multiple ready + +describe('dispatchNextPhase'): +- updates phase status to in_progress +- emits PhaseStartedEvent +- returns failure when no dispatchable phases + +describe('completePhase'): +- updates phase status to completed +- removes from queue +- emits PhaseCompletedEvent + +describe('blockPhase'): +- updates phase status +- adds to blocked list +- emits PhaseBlockedEvent + +Use EventEmitterBus for event verification. +Mock PhaseRepository for dependency data. + + npm test -- src/dispatch/phase-manager.test.ts passes + DefaultPhaseDispatchManager has test coverage + + + + + +Before declaring plan complete: +- [ ] `npm run build` succeeds without errors +- [ ] `npm test` passes all tests +- [ ] New tests cover all new functionality + + + + +- All tasks completed +- All verification checks pass +- Tests follow existing patterns +- Coverage includes happy path and edge cases + + + +After completion, create `.planning/phases/14-parallel-phase-execution/14-07-SUMMARY.md` + diff --git a/.planning/phases/14-parallel-phase-execution/14-08-PLAN.md b/.planning/phases/14-parallel-phase-execution/14-08-PLAN.md new file mode 100644 index 0000000..a3ac6a6 --- /dev/null +++ b/.planning/phases/14-parallel-phase-execution/14-08-PLAN.md @@ -0,0 +1,111 @@ +--- +phase: 14-parallel-phase-execution +plan: 08 +type: execute +wave: 5 +depends_on: ["14-06"] +files_modified: + - src/__tests__/e2e/phase-dispatch.test.ts +autonomous: true +--- + + +Add E2E tests for parallel phase execution scenarios. + +Purpose: Verify end-to-end phase dispatch with dependencies works correctly. +Output: E2E tests covering parallel execution scenarios. + + + +@~/.claude/get-shit-done/workflows/execute-plan.md +@~/.claude/get-shit-done/templates/summary.md + + + +@.planning/PROJECT.md +@.planning/ROADMAP.md +@.planning/STATE.md +@.planning/phases/14-parallel-phase-execution/14-06-SUMMARY.md + +# Reference implementations: +@src/__tests__/e2e/happy-path.test.ts +@src/__tests__/e2e/parallel-conflict.test.ts + + + + + + Task 1: Create phase dispatch E2E tests + src/__tests__/e2e/phase-dispatch.test.ts + +Create E2E test file for phase dispatch scenarios: + +describe('Phase Parallel Execution'): + +Test 1: Independent phases dispatch in parallel +- Create initiative with 2 independent phases (no dependencies) +- Queue both phases +- Both should be ready for dispatch immediately +- Dispatch both and verify parallel execution + +Test 2: Dependent phase waits for prerequisite +- Create phases: A, B (depends on A) +- Queue both +- Only A should be ready +- Complete A +- B should become ready + +Test 3: Diamond dependency pattern +- Create phases: A, B (depends on A), C (depends on A), D (depends on B, C) +- Queue all +- A ready first +- After A completes: B and C ready (parallel) +- After B and C complete: D ready + +Test 4: Blocked phase doesn't dispatch +- Create phases: A, B (depends on A) +- Block A +- B should never become ready + +Use TestHarness with database fixtures. +Follow existing E2E test patterns. + + npm test -- src/__tests__/e2e/phase-dispatch.test.ts passes + Phase dispatch E2E tests cover parallel execution scenarios + + + + Task 2: Add phase dispatch to TestHarness + src/__tests__/harness.ts + +Extend TestHarness to support phase dispatch testing: +- Add phaseDispatchManager property (DefaultPhaseDispatchManager instance) +- Wire up with phaseRepository and eventBus +- Add helper methods if needed: queuePhase(), dispatchPhase() + +Follow patterns from existing harness setup. + + npm test -- src/__tests__/e2e/phase-dispatch.test.ts passes + TestHarness supports phase dispatch scenarios + + + + + +Before declaring plan complete: +- [ ] `npm run build` succeeds without errors +- [ ] `npm test` passes all tests +- [ ] E2E tests verify actual parallel behavior + + + + +- All tasks completed +- All verification checks pass +- Tests verify dependency ordering is enforced +- Tests verify parallel phases dispatch together + + + +After completion, create `.planning/phases/14-parallel-phase-execution/14-08-SUMMARY.md` +