Skip to content

Commit dc35cb1

Browse files
authored
Merge pull request #538 from PlanExeOrg/refactor/stages-to-nodes
refactor: rename plan/stages/ to plan/nodes/
2 parents 3d73c60 + 886f7a2 commit dc35cb1

74 files changed

Lines changed: 684 additions & 684 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

docs/superpowers/plans/2026-04-02-split-run-plan-pipeline.md

Lines changed: 214 additions & 214 deletions
Large diffs are not rendered by default.

docs/superpowers/plans/2026-04-03-extract-constraints.md

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -594,19 +594,19 @@ git commit -m "Add FilenameEnum entries for extract_constraints stage"
594594
### Task 4: Create the pipeline stage wrapper
595595

596596
**Files:**
597-
- Create: `worker_plan/worker_plan_internal/plan/stages/extract_constraints.py`
597+
- Create: `worker_plan/worker_plan_internal/plan/nodes/extract_constraints.py`
598598

599599
- [ ] **Step 1: Create the stage file**
600600

601-
Create `worker_plan/worker_plan_internal/plan/stages/extract_constraints.py`:
601+
Create `worker_plan/worker_plan_internal/plan/nodes/extract_constraints.py`:
602602

603603
```python
604604
"""Pipeline stage: extract constraints from user prompt."""
605605
from llama_index.core.llms.llm import LLM
606606
from worker_plan_internal.plan.run_plan_pipeline import PlanTask
607607
from worker_plan_internal.diagnostics.extract_constraints import ExtractConstraints
608608
from worker_plan_api.filenames import FilenameEnum
609-
from worker_plan_internal.plan.stages.setup import SetupTask
609+
from worker_plan_internal.plan.nodes.setup import SetupTask
610610

611611

612612
class ExtractConstraintsTask(PlanTask):
@@ -637,13 +637,13 @@ class ExtractConstraintsTask(PlanTask):
637637

638638
- [ ] **Step 2: Verify syntax**
639639

640-
Run: `cd worker_plan && /opt/homebrew/bin/python3.11 -c "import ast; ast.parse(open('worker_plan_internal/plan/stages/extract_constraints.py').read()); print('OK')"`
640+
Run: `cd worker_plan && /opt/homebrew/bin/python3.11 -c "import ast; ast.parse(open('worker_plan_internal/plan/nodes/extract_constraints.py').read()); print('OK')"`
641641
Expected: `OK`
642642

643643
- [ ] **Step 3: Commit**
644644

645645
```bash
646-
git add worker_plan/worker_plan_internal/plan/stages/extract_constraints.py
646+
git add worker_plan/worker_plan_internal/plan/nodes/extract_constraints.py
647647
git commit -m "Add ExtractConstraintsTask pipeline stage wrapper"
648648
```
649649

@@ -652,15 +652,15 @@ git commit -m "Add ExtractConstraintsTask pipeline stage wrapper"
652652
### Task 5: Wire into the full pipeline
653653

654654
**Files:**
655-
- Modify: `worker_plan/worker_plan_internal/plan/stages/full_plan_pipeline.py:10` (add import)
656-
- Modify: `worker_plan/worker_plan_internal/plan/stages/full_plan_pipeline.py:90-91` (add to requires dict)
655+
- Modify: `worker_plan/worker_plan_internal/plan/nodes/full_plan_pipeline.py:10` (add import)
656+
- Modify: `worker_plan/worker_plan_internal/plan/nodes/full_plan_pipeline.py:90-91` (add to requires dict)
657657

658658
- [ ] **Step 1: Add the import**
659659

660-
In `worker_plan/worker_plan_internal/plan/stages/full_plan_pipeline.py`, add after line 10 (`from ... import ScreenPlanningPromptTask`):
660+
In `worker_plan/worker_plan_internal/plan/nodes/full_plan_pipeline.py`, add after line 10 (`from ... import ScreenPlanningPromptTask`):
661661

662662
```python
663-
from worker_plan_internal.plan.stages.extract_constraints import ExtractConstraintsTask
663+
from worker_plan_internal.plan.nodes.extract_constraints import ExtractConstraintsTask
664664
```
665665

666666
- [ ] **Step 2: Add to the requires() dict**
@@ -673,13 +673,13 @@ In the `requires()` method, add after the `'screen_planning_prompt'` entry (line
673673

674674
- [ ] **Step 3: Verify syntax**
675675

676-
Run: `cd worker_plan && /opt/homebrew/bin/python3.11 -c "from worker_plan_internal.plan.stages.full_plan_pipeline import FullPlanPipeline; print('OK')"`
676+
Run: `cd worker_plan && /opt/homebrew/bin/python3.11 -c "from worker_plan_internal.plan.nodes.full_plan_pipeline import FullPlanPipeline; print('OK')"`
677677
Expected: `OK`
678678

679679
- [ ] **Step 4: Commit**
680680

681681
```bash
682-
git add worker_plan/worker_plan_internal/plan/stages/full_plan_pipeline.py
682+
git add worker_plan/worker_plan_internal/plan/nodes/full_plan_pipeline.py
683683
git commit -m "Register extract_constraints in the full plan pipeline"
684684
```
685685

@@ -688,16 +688,16 @@ git commit -m "Register extract_constraints in the full plan pipeline"
688688
### Task 6: Add to the report
689689

690690
**Files:**
691-
- Modify: `worker_plan/worker_plan_internal/plan/stages/report.py:28` (add import)
692-
- Modify: `worker_plan/worker_plan_internal/plan/stages/report.py:41-42` (add to requires dict)
693-
- Modify: `worker_plan/worker_plan_internal/plan/stages/report.py:90-91` (add append_markdown call)
691+
- Modify: `worker_plan/worker_plan_internal/plan/nodes/report.py:28` (add import)
692+
- Modify: `worker_plan/worker_plan_internal/plan/nodes/report.py:41-42` (add to requires dict)
693+
- Modify: `worker_plan/worker_plan_internal/plan/nodes/report.py:90-91` (add append_markdown call)
694694

695695
- [ ] **Step 1: Add the import**
696696

697-
In `worker_plan/worker_plan_internal/plan/stages/report.py`, add after line 28 (`from ... import ScreenPlanningPromptTask`):
697+
In `worker_plan/worker_plan_internal/plan/nodes/report.py`, add after line 28 (`from ... import ScreenPlanningPromptTask`):
698698

699699
```python
700-
from worker_plan_internal.plan.stages.extract_constraints import ExtractConstraintsTask
700+
from worker_plan_internal.plan.nodes.extract_constraints import ExtractConstraintsTask
701701
```
702702

703703
- [ ] **Step 2: Add to the requires() dict**
@@ -718,13 +718,13 @@ In `run_inner()`, add after the Self Audit line (line 90, `rg.append_markdown_wi
718718

719719
- [ ] **Step 4: Verify syntax**
720720

721-
Run: `cd worker_plan && /opt/homebrew/bin/python3.11 -c "from worker_plan_internal.plan.stages.report import ReportTask; print('OK')"`
721+
Run: `cd worker_plan && /opt/homebrew/bin/python3.11 -c "from worker_plan_internal.plan.nodes.report import ReportTask; print('OK')"`
722722
Expected: `OK`
723723

724724
- [ ] **Step 5: Commit**
725725

726726
```bash
727-
git add worker_plan/worker_plan_internal/plan/stages/report.py
727+
git add worker_plan/worker_plan_internal/plan/nodes/report.py
728728
git commit -m "Add extract_constraints to the HTML report"
729729
```
730730

docs/superpowers/specs/2026-04-02-split-run-plan-pipeline-design.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,7 @@ To insert a new `ValidateBudgetTask` between `CurrencyStrategyTask` and `Identif
188188

189189
1. Create `stages/validate_budget.py`:
190190
```python
191-
from worker_plan_internal.plan.stages.currency_strategy import CurrencyStrategyTask
191+
from worker_plan_internal.plan.nodes.currency_strategy import CurrencyStrategyTask
192192

193193
class ValidateBudgetTask(PlanTask):
194194
def requires(self):

docs/superpowers/specs/2026-04-03-extract-constraints-design.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ Output:
6363

6464
## Pipeline Stage
6565

66-
**Stage file:** `worker_plan_internal/plan/stages/extract_constraints.py`
66+
**Stage file:** `worker_plan_internal/plan/nodes/extract_constraints.py`
6767

6868
- `ExtractConstraintsTask` extends `PlanTask`
6969
- `requires()` — depends on `SetupTask` only (reads the raw user prompt)
@@ -101,10 +101,10 @@ EXTRACT_CONSTRAINTS_MARKDOWN = "002-0-extract_constraints.md"
101101

102102
**New files:**
103103
- `worker_plan_internal/diagnostics/extract_constraints.py` — Pydantic models, dataclass, system prompt, execute()
104-
- `worker_plan_internal/plan/stages/extract_constraints.py` — PlanTask wrapper
104+
- `worker_plan_internal/plan/nodes/extract_constraints.py` — PlanTask wrapper
105105
- `worker_plan_internal/diagnostics/tests/test_extract_constraints.py` — unit + LLM integration tests
106106

107107
**Modified files:**
108108
- `worker_plan_api/filenames.py` — add FilenameEnum entries
109-
- `worker_plan_internal/plan/stages/full_plan_pipeline.py` — register stage
109+
- `worker_plan_internal/plan/nodes/full_plan_pipeline.py` — register stage
110110
- `worker_plan_internal/report/report_generator.py` — add to report

worker_plan/AGENTS.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ consumers.
5050
`rate_limit`, etc.) stored in `usage_metrics.jsonl`. Unknown errors preserve
5151
a truncated `error_detail` field.
5252

53-
## Pipeline Stages (`worker_plan_internal/plan/stages/`)
53+
## Pipeline Stages (`worker_plan_internal/plan/nodes/`)
5454

5555
Each Luigi pipeline task lives in its own file under `stages/`. This enables:
5656
- Multiple agents working on different stages without merge conflicts

worker_plan/worker_plan_internal/extract_dag.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
# Module prefixes that are infrastructure/utilities, not implementation logic.
2525
# Imports from these are excluded from source_files auto-detection.
2626
_INFRASTRUCTURE_PREFIXES = (
27-
"worker_plan_internal.plan.stages.",
27+
"worker_plan_internal.plan.nodes.",
2828
"worker_plan_internal.plan.run_plan_pipeline",
2929
"worker_plan_internal.plan.pipeline_environment",
3030
"worker_plan_internal.plan.ping_llm",
@@ -171,7 +171,7 @@ def extract_dag() -> dict[str, Any]:
171171
172172
Returns a top-level schema object with stages sorted by pipeline order.
173173
"""
174-
from worker_plan_internal.plan.stages.full_plan_pipeline import FullPlanPipeline
174+
from worker_plan_internal.plan.nodes.full_plan_pipeline import FullPlanPipeline
175175

176176
root = FullPlanPipeline(run_id_dir=Path("/tmp/_dag_extract_dummy"))
177177

@@ -220,7 +220,7 @@ def _walk(task: luigi.Task) -> None:
220220
"schema_version": "1.0",
221221
"pipeline_name": "planning_pipeline",
222222
"description": "DAG for PlanExe, an AI-driven project planning system.",
223-
"stages": stages,
223+
"nodes": stages,
224224
}
225225

226226

@@ -235,7 +235,7 @@ def main() -> None:
235235

236236
if output_path:
237237
Path(output_path).write_text(dag_json + "\n", encoding="utf-8")
238-
print(f"Wrote {len(dag['stages'])} stages to {output_path}", file=sys.stderr)
238+
print(f"Wrote {len(dag['nodes'])} stages to {output_path}", file=sys.stderr)
239239
else:
240240
print(dag_json)
241241

worker_plan/worker_plan_internal/plan/stages/__init__.py renamed to worker_plan/worker_plan_internal/plan/nodes/__init__.py

File renamed without changes.

worker_plan/worker_plan_internal/plan/stages/candidate_scenarios.py renamed to worker_plan/worker_plan_internal/plan/nodes/candidate_scenarios.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,10 @@
44
from worker_plan_internal.lever.candidate_scenarios import CandidateScenarios
55
from worker_plan_api.filenames import FilenameEnum
66
from worker_plan_internal.llm_util.llm_executor import LLMExecutor
7-
from worker_plan_internal.plan.stages.setup import SetupTask
8-
from worker_plan_internal.plan.stages.identify_purpose import IdentifyPurposeTask
9-
from worker_plan_internal.plan.stages.plan_type import PlanTypeTask
10-
from worker_plan_internal.plan.stages.focus_on_vital_few_levers import FocusOnVitalFewLeversTask
7+
from worker_plan_internal.plan.nodes.setup import SetupTask
8+
from worker_plan_internal.plan.nodes.identify_purpose import IdentifyPurposeTask
9+
from worker_plan_internal.plan.nodes.plan_type import PlanTypeTask
10+
from worker_plan_internal.plan.nodes.focus_on_vital_few_levers import FocusOnVitalFewLeversTask
1111

1212

1313
class CandidateScenariosTask(PlanTask):

worker_plan/worker_plan_internal/plan/stages/consolidate_assumptions_markdown.py renamed to worker_plan/worker_plan_internal/plan/nodes/consolidate_assumptions_markdown.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,14 @@
55
from worker_plan_internal.assume.shorten_markdown import ShortenMarkdown
66
from worker_plan_api.filenames import FilenameEnum
77
from worker_plan_internal.llm_util.llm_executor import LLMExecutor, PipelineStopRequested
8-
from worker_plan_internal.plan.stages.identify_purpose import IdentifyPurposeTask
9-
from worker_plan_internal.plan.stages.plan_type import PlanTypeTask
10-
from worker_plan_internal.plan.stages.physical_locations import PhysicalLocationsTask
11-
from worker_plan_internal.plan.stages.currency_strategy import CurrencyStrategyTask
12-
from worker_plan_internal.plan.stages.identify_risks import IdentifyRisksTask
13-
from worker_plan_internal.plan.stages.make_assumptions import MakeAssumptionsTask
14-
from worker_plan_internal.plan.stages.distill_assumptions import DistillAssumptionsTask
15-
from worker_plan_internal.plan.stages.review_assumptions import ReviewAssumptionsTask
8+
from worker_plan_internal.plan.nodes.identify_purpose import IdentifyPurposeTask
9+
from worker_plan_internal.plan.nodes.plan_type import PlanTypeTask
10+
from worker_plan_internal.plan.nodes.physical_locations import PhysicalLocationsTask
11+
from worker_plan_internal.plan.nodes.currency_strategy import CurrencyStrategyTask
12+
from worker_plan_internal.plan.nodes.identify_risks import IdentifyRisksTask
13+
from worker_plan_internal.plan.nodes.make_assumptions import MakeAssumptionsTask
14+
from worker_plan_internal.plan.nodes.distill_assumptions import DistillAssumptionsTask
15+
from worker_plan_internal.plan.nodes.review_assumptions import ReviewAssumptionsTask
1616

1717
logger = logging.getLogger(__name__)
1818

worker_plan/worker_plan_internal/plan/stages/consolidate_governance.py renamed to worker_plan/worker_plan_internal/plan/nodes/consolidate_governance.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
"""ConsolidateGovernanceTask - Combines all governance phase markdown documents."""
22
from worker_plan_internal.plan.run_plan_pipeline import PlanTask
33
from worker_plan_api.filenames import FilenameEnum
4-
from worker_plan_internal.plan.stages.governance_phase1_audit import GovernancePhase1AuditTask
5-
from worker_plan_internal.plan.stages.governance_phase2_bodies import GovernancePhase2BodiesTask
6-
from worker_plan_internal.plan.stages.governance_phase3_impl_plan import GovernancePhase3ImplPlanTask
7-
from worker_plan_internal.plan.stages.governance_phase4_decision_escalation_matrix import GovernancePhase4DecisionEscalationMatrixTask
8-
from worker_plan_internal.plan.stages.governance_phase5_monitoring_progress import GovernancePhase5MonitoringProgressTask
9-
from worker_plan_internal.plan.stages.governance_phase6_extra import GovernancePhase6ExtraTask
4+
from worker_plan_internal.plan.nodes.governance_phase1_audit import GovernancePhase1AuditTask
5+
from worker_plan_internal.plan.nodes.governance_phase2_bodies import GovernancePhase2BodiesTask
6+
from worker_plan_internal.plan.nodes.governance_phase3_impl_plan import GovernancePhase3ImplPlanTask
7+
from worker_plan_internal.plan.nodes.governance_phase4_decision_escalation_matrix import GovernancePhase4DecisionEscalationMatrixTask
8+
from worker_plan_internal.plan.nodes.governance_phase5_monitoring_progress import GovernancePhase5MonitoringProgressTask
9+
from worker_plan_internal.plan.nodes.governance_phase6_extra import GovernancePhase6ExtraTask
1010

1111

1212
class ConsolidateGovernanceTask(PlanTask):

0 commit comments

Comments
 (0)