forge-orkes 0.6.1 → 0.9.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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "forge-orkes",
3
- "version": "0.6.1",
3
+ "version": "0.9.0",
4
4
  "description": "Set up the Forge meta-prompting framework for Claude Code in your project",
5
5
  "bin": {
6
6
  "create-forge": "./bin/create-forge.js"
@@ -250,6 +250,34 @@ Re-plan? Route to `planning` with summary.
250
250
 
251
251
  After convergence:
252
252
 
253
+ ### Step A: Milestone Gate (Advisory → Tier Escalation)
254
+
255
+ If no milestone exists (advisory discussion — forge routed here without tier/milestone):
256
+
257
+ 1. **Assess decisions.** Do locked decisions require code changes?
258
+ - Schema changes, field renames, new files, API changes, multi-file edits, refactoring → **yes, changes needed**
259
+ - Documentation only, config tweaks, "no changes needed" → **no** → end. *"No code changes needed. Discussion complete."*
260
+ 2. **Detect tier from decisions scope.**
261
+ - Single file, <50 lines, trivial → **Quick**
262
+ - Multi-file, refactor, feature, service changes → **Standard**
263
+ - Major architectural, multi-subsystem, multi-phase → **Full**
264
+ 3. **Create milestone.**
265
+ - Read `.forge/state/index.yml` (create from `.forge/templates/state/index.yml` if missing)
266
+ - Next ID = max existing ID + 1 (or 1 if none)
267
+ - Create `milestone-{id}.yml` from `.forge/templates/state/milestone.yml`:
268
+ - `milestone.id` = {id}, `milestone.name` = brief summary of discussion topic
269
+ - `current.tier` = detected tier
270
+ - `current.status` = `planning` (Standard) / `architecting` (Full) / `not_started` (Quick)
271
+ - `decisions[]` = locked decisions from `context.md`
272
+ - Add entry to `index.yml`: `id`, `name`, `status: active`, `last_updated: now`
273
+ 4. **Update `context.md`** — scope decisions under `### M{id} — {name} (locked {date})`
274
+ 5. **Quick tier?** → *"Scope is Quick. `/clear` then `/forge {id}` for quick-tasking."* End.
275
+ 6. Proceed to Step B with new milestone.
276
+
277
+ If milestone exists → skip to Step B.
278
+
279
+ ### Step B: Standard Handoff
280
+
253
281
  1. **Promote decisions in `context.md`** -- Rename milestone heading from `(drafting)` → `(locked {date})`. Decisions already written progressively — just finalize:
254
282
  - Verify all confirmed decisions present under `## Locked Decisions`
255
283
  - Verify deferred items under `## Deferred Ideas`
@@ -22,9 +22,9 @@ Check state files:
22
22
  - Match IDs (exact) or names (case-insensitive substring)
23
23
  - Found → auto-select: *"Resuming {id}: [{name}] -- {current.status}, {overall_percent}%"*
24
24
  - No match → *"No match for '{arg}'. Active:"*
25
- 3. **Multiple (no arg):** Show all + status + `last_updated`. Default recent. *"{N} active. Most recent: [{name}] ({current.status}, {date}). This one, or switch?"*
25
+ 3. **Multiple (no arg):** Show active + not_started milestones with status + `last_updated`. Default most recent. After main list, show **Deferred:** section (id, name, frozen status `was: {current.status}`, defer date, reason). *"{N} active. Most recent: [{name}] ({current.status}, {date}). This one, or switch?"*
26
26
  4. **One:** Auto-select. *"Resuming: [{name}] -- {current.status}, {overall_percent}%"*
27
- 5. **None:** Init or create.
27
+ 5. **None active:** If deferred exist, mention them: *"No active milestones. {N} deferred — 'resume milestone {id}' to reactivate."* Else → init or create.
28
28
  6. Load `milestone-{id}.yml`
29
29
  7. **Route on `current.status`, NOT `overall_percent`.** Complete only at `complete`. 100% tasks ≠ done -- verifying + reviewing must run.
30
30
  8. Report + **immediately route** (Step 3). Show: `current.status`, phase labels (Executed/Verified/Pending/In progress -- **never "Complete" for unverified**), `overall_percent`. **No menus.** Position → action → invoke.
@@ -43,6 +43,60 @@ Check `desire_paths` 3+ occurrences:
43
43
 
44
44
  No `project.yml` + Standard/Full → **Step 2A**. State exists → **Step 2B**.
45
45
 
46
+ ## Step 1.5: Lifecycle Operations
47
+
48
+ Before tier detection, check if user request matches lifecycle patterns:
49
+ - "defer milestone {id}" / "defer {id}" / "pause milestone {id}" → **Defer**
50
+ - "resume milestone {id}" / "undefer {id}" / "reactivate milestone {id}" → **Resume**
51
+ - "delete milestone {id}" / "archive milestone {id}" / "remove milestone {id}" → **Delete** (see below)
52
+
53
+ No match → fall through to Step 2B (tier detection).
54
+
55
+ ### Defer Operation
56
+
57
+ 1. Validate: milestone in `index.yml`, status not `deferred`
58
+ 2. Extract reason (text after "—"/"-" or second sentence). None → ask: *"Reason for deferring?"*
59
+ 3. Update `index.yml`: `status: deferred`, `last_updated`
60
+ 4. Update `milestone-{id}.yml`:
61
+ - `lifecycle.deferred_at` = ISO 8601 now
62
+ - `lifecycle.deferred_reason` = reason
63
+ - `lifecycle.status_before_defer` = copy of `current.status`
64
+ 5. Update `roadmap.yml`: all phases belonging to this milestone → `status: deferred`
65
+ 6. Confirm: *"Deferred milestone {id}: {name}. Was {status}, frozen at {current.status}. Reason: {reason}."*
66
+
67
+ ### Resume Operation
68
+
69
+ 1. Validate: milestone in `index.yml`, status is `deferred`
70
+ 2. Update `index.yml`: `status: active`, `last_updated`
71
+ 3. Update `milestone-{id}.yml`: `lifecycle.resumed_at` = ISO 8601 now
72
+ 4. Confirm + route: *"Resumed milestone {id}: {name}. Picking up at {current.status}."*
73
+ 5. Fall through to normal routing (Step 3) — `current.status` already frozen at correct position
74
+
75
+ ### Delete (Archive) Operation
76
+
77
+ 1. Validate: milestone in `index.yml` (any status — active, deferred, complete, not_started)
78
+ 2. Build manifest — scan for associated files:
79
+ - `.forge/state/milestone-{id}.yml`
80
+ - `.forge/phases/m{id}-*/` (glob all phase dirs)
81
+ - `.forge/research/milestone-{id}.md` (if exists)
82
+ - `.forge/audits/milestone-{id}-*` (if exists)
83
+ - Note: `.forge/context.md` is shared — do NOT archive or modify. M{id} decisions stay as history.
84
+ 3. Show manifest + confirm:
85
+ *"Archiving milestone {id}: {name}\n - {list files}\n → .forge/archive/milestone-{id}/\n\nProceed?"*
86
+ 4. On confirm:
87
+ a. Create `.forge/archive/milestone-{id}/`
88
+ b. Copy `milestone-{id}.yml` → archive as `state.yml`
89
+ c. Copy phase dirs → archive `phases/`
90
+ d. Copy research file → archive `research.md` (if exists)
91
+ e. Copy audit files → archive `audits/` (if exists)
92
+ f. Remove originals after successful copy
93
+ g. Remove milestone entry from `index.yml`
94
+ h. Remove milestone + its phases from `roadmap.yml`
95
+ i. Update `index.yml` `last_updated`
96
+ 5. Confirm: *"Archived milestone {id}: {name} → .forge/archive/milestone-{id}/. Removed from active state."*
97
+
98
+ **Safety:** Copy-then-delete, not move. If copy fails, originals intact.
99
+
46
100
  ### Parent Session Model Advisory
47
101
 
48
102
  Check `models.parent_session` from `project.yml`. **Always display:** *"Session model: {current}. Project recommends: {parent_session}."*
@@ -71,12 +125,18 @@ ANY: new project, major arch change, multi-phase, multi-subsystem, days of work,
71
125
  ### Direct Utility
72
126
  "upgrade"/"update forge"/"sync forge" → `upgrading` (bypasses tiers)
73
127
 
128
+ ### Advisory (Tier Deferred)
129
+ ANY: "review"/"advise"/"assess"/"evaluate" + specific system/component/feature, scope unclear, "what do you think about"
130
+ → No `project.yml` → init first. Then `discussing` (no milestone — tier detected post-discussion).
131
+
132
+ Can't know upfront if "review X" → "it's fine" or "restructure 6 files." Discussion determines scope. Discussing skill detects tier at convergence, creates milestone if code changes needed.
133
+
74
134
  ### User Override
75
135
  "Use Quick/Standard/Full tier" → honor.
76
136
 
77
137
  ## Step 3: Route to Next Skill
78
138
 
79
- Tier + state → invoke via `Skill` tool or `Agent` tool (agent-dispatched phases).
139
+ Tier + state → invoke via `Skill` tool. All phases use `Skill()`.
80
140
 
81
141
  **CRITICAL: NEVER `EnterPlanMode`.** "Planning" = `Skill(planning)`. Native plan mode writes wrong format, bypasses gates + state.
82
142
 
@@ -103,9 +163,7 @@ Resolve `{model}` for `{next}` skill using precedence above. **Always display**
103
163
 
104
164
  Where `{source}` = `skills.{name}` | `models.default` | `parent session`. Show on every transition, not just mismatch. If mismatch, append: *"Use `/model` to switch."*
105
165
 
106
- **Agent spawns MUST include `model` param.** Resolve model for the skill context, pass to `Agent(model: "{model}")`. This is the only enforcement point — `Skill` tool has no model param.
107
-
108
- Subagents via `Agent` tool → same precedence, enforced via `model` param.
166
+ **Model routing is advisory.** All phases use `Skill()`. Display expected model at each transition. Mismatch suggest `/model {expected}`. Review gate logs model used.
109
167
 
110
168
  | Skill | Model | Why |
111
169
  |-------|-------|-----|
@@ -119,95 +177,19 @@ Subagents via `Agent` tool → same precedence, enforced via `model` param.
119
177
  | discussing | sonnet | Conversation |
120
178
  | testing | sonnet | Code gen (author) + audit judgment (analyst) — matches executing/reviewing |
121
179
 
122
- *Model enforced only for Agent-dispatched skills (verifying, quick-tasking). Skill-routed phases are advisory — use `/model` to switch.*
123
-
124
- | `current.status` | Route To | Method |
125
- |-------------------|----------|--------|
126
- | `not_started` | Detect tier, start | |
127
- | `researching` | `Skill(researching)` → discussing | Skill |
128
- | `discussing` | `Skill(discussing)` → planning (or architecting if Full) | Skill |
129
- | `architecting` | `Skill(architecting)` → planning | Skill |
130
- | `planning` | `Skill(planning)` → executing | Skill |
131
- | `executing` | `Skill(executing)` → verifying | Skill |
132
- | `verifying` | Agent-dispatched reviewing | **Agent** |
133
- | `reviewing` | `Skill(reviewing)` complete | Skill |
134
- | `complete` | Done. Ask what's next. | — |
135
- | `quick-tasking` | Agent-dispatched (Quick tier / refactor-backlog) | **Agent** |
136
-
137
- **Phases marked Agent MUST use `Agent()` with `model` param. Never `Skill()` — model enforcement only works through `Agent()`.**
138
-
139
- ### Agent-Dispatched Phases
140
-
141
- Phases marked **Agent** run as spawned agents to enforce model routing. `Agent` tool's `model` param = only enforcement point.
142
-
143
- **Skill contract:** Each dispatched skill carries a guard header — if parent loads via Skill(), guard says STOP.
144
-
145
- **Parent protocol:**
146
- 1. Resolve model: `models.skills.{skill}` → `models.default` → parent
147
- 2. On return: read updated state, display *"Result: {outcome}. Model: {model} (enforced)."*, route next
148
-
149
- **Agent prompt requirements:** `touch .forge/.active-skill` (pre-commit guard) + "Report resolved model in summary."
150
-
151
- #### Verifying
152
-
153
- When `current.status == verifying`:
154
-
155
- 1. Read milestone state → identify plan path
156
- 2. Spawn:
157
-
158
- ```
159
- Agent(
160
- model: "{model}",
161
- description: "Verify milestone {id}: {name}",
162
- prompt: "You are a verifier agent. Prove completed work delivers what was promised.
163
-
164
- FIRST: Run `touch .forge/.active-skill`
165
-
166
- Read:
167
- - .claude/skills/verifying/SKILL.md — process instructions
168
- - .claude/agents/verifier.md — role, tools, output format
169
- - .forge/state/milestone-{id}.yml — current state
170
- - .forge/phases/{phase_path}/plan-{NN}.md — must_haves
171
- - .forge/project.yml — stack, verification commands
172
- - .forge/context.md — locked decisions
173
- - .forge/requirements.yml — requirement coverage
174
-
175
- Follow verifying/SKILL.md 3-level process exactly.
176
- Write results to plan directory.
177
- Update state: 'reviewing' if PASSED, keep 'verifying' if GAPS.
178
- Report resolved model in summary."
179
- )
180
- ```
181
-
182
- 3. On return: PASSED → reviewing. GAPS → planning (gap-closure).
183
-
184
- #### Quick-Tasking
185
-
186
- Quick-tasking runs as Agent from Quick tier or refactor-backlog. Parent constructs prompt based on milestone context:
187
-
188
- ```
189
- Agent(
190
- model: "{model}",
191
- description: "Quick fix: {description}",
192
- prompt: "You are a quick-tasking agent. Small, scoped fix.
193
-
194
- FIRST: Run `touch .forge/.active-skill`
195
-
196
- Read:
197
- - .claude/skills/quick-tasking/SKILL.md — workflow
198
- - .forge/project.yml — stack, verification commands
199
- [with milestone: + .forge/state/milestone-{id}.yml, .forge/context.md]
200
-
201
- Task: {description}
202
-
203
- Follow quick-tasking/SKILL.md workflow.
204
- [with milestone: After commit, update milestone-{id}.yml (increment progress, log deviations).]
205
- [without milestone: No state management.]
206
- Report resolved model in summary."
207
- )
208
- ```
209
-
210
- On return: display result + model. With milestone → read updated state.
180
+ | `current.status` | Route To |
181
+ |-------------------|----------|
182
+ | `not_started` | Detect tier, start |
183
+ | `researching` | `Skill(researching)` → discussing |
184
+ | `discussing` | `Skill(discussing)` planning (or architecting if Full) |
185
+ | `architecting` | `Skill(architecting)` → planning |
186
+ | `planning` | `Skill(planning)` → executing |
187
+ | `executing` | `Skill(executing)` → verifying |
188
+ | `verifying` | `Skill(verifying)` → reviewing |
189
+ | `reviewing` | `Skill(reviewing)` → complete |
190
+ | `complete` | Done. Ask what's next. |
191
+ | `deferred` | Milestone frozen. *"Resume milestone {id}" to reactivate.* |
192
+ | `quick-tasking` | `Skill(quick-tasking)` |
211
193
 
212
194
  ### Status Advancement Check
213
195
 
@@ -266,8 +248,9 @@ After clear, skills load from disk via "Read Context"/"Pre-Execution Checklist".
266
248
  ## State Transitions
267
249
 
268
250
  ```
269
- Standard: not_started → [init?] → researching → discussing → planning → executing → verifying → reviewing → complete
270
- Full: not_started → [init?] → researching → discussing → architecting → planning → executing → verifying → reviewing → complete
251
+ Standard: not_started → [init?] → researching → discussing → planning → executing → verifying → reviewing → complete
252
+ Full: not_started → [init?] → researching → discussing → architecting → planning → executing → verifying → reviewing → complete
253
+ Advisory: [init?] → discussing → [tier gate] → planning → executing → verifying → reviewing → complete
271
254
 
272
255
  Branches (any tier, on-demand): debugging (stuck) · designing (UI) · securing (auth/data/API) · testing (e2e/integration/flake)
273
256
  Phase boundaries: `[clear]` recommended between phases to reset context.
@@ -312,7 +312,7 @@ User selects per stack.
312
312
  milestones:
313
313
  - id: 1
314
314
  name: "{project name}"
315
- status: active
315
+ status: active # not_started | active | deferred | complete
316
316
  last_updated: "{date}"
317
317
  ```
318
318
  - `.forge/state/milestone-1.yml`:
@@ -3,8 +3,6 @@ name: quick-tasking
3
3
  description: "Small, scoped changes: typo fixes, config updates, minor bugs, dependency bumps, doc tweaks. Under 50 lines, 1-2 files, no architectural decisions. Quick tier — skip ceremony."
4
4
  ---
5
5
 
6
- > **AGENT-DISPATCHED:** If reading in parent session, STOP — use Agent() via forge/SKILL.md § Agent-Dispatched Phases.
7
-
8
6
  # Quick-Tasking
9
7
 
10
8
  Small change? Skip ceremony. Do it right, do it fast.
@@ -3,8 +3,6 @@ name: verifying
3
3
  description: "Prove completed work delivers what was promised. Goal-backward verification with 3 levels: Observable Truths, Artifacts, and Key Links. Task completion ≠ goal achievement."
4
4
  ---
5
5
 
6
- > **AGENT-DISPATCHED:** If reading in parent session, STOP — use Agent() via forge/SKILL.md § Agent-Dispatched Phases.
7
-
8
6
  # Verifying
9
7
 
10
8
  Prove completed work delivers what was promised. Task completion ≠ goal achievement.
@@ -4,13 +4,16 @@
4
4
 
5
5
  roadmap:
6
6
  # Milestones group phases into concurrent work streams.
7
- # Phases keep global IDs. Milestones reference them.
7
+ # Each milestone contains its own phases numbered sequentially (1, 2, 3...).
8
8
  # Different milestones can be worked on in parallel across sessions.
9
9
  milestones:
10
10
  - id: 1
11
11
  name: "" # e.g., "MVP", "Admin Dashboard"
12
- phases: [] # List of phase IDs belonging to this milestone
12
+ phases: [] # List of phase numbers belonging to this milestone
13
13
 
14
+ # Phases are scoped within milestones. Each phase has a local number (1, 2, 3...)
15
+ # within its milestone. Directory naming: .forge/phases/m{milestone_id}-{phase_num}-{name}/
16
+ # Example: m1-1-foundation/, m1-2-auth/, m2-1-dashboard/
14
17
  phases:
15
18
  - id: 1
16
19
  name: "" # e.g., "Foundation & Architecture"
@@ -21,7 +24,7 @@ roadmap:
21
24
  - "" # e.g., "User can see the landing page"
22
25
  - "" # e.g., "API returns valid JSON for /users"
23
26
  estimated_hours: null
24
- status: pending # pending | researching | planning | executing | verifying | complete
27
+ status: pending # pending | researching | planning | executing | verifying | deferred | complete
25
28
 
26
29
  - id: 2
27
30
  name: ""
@@ -5,7 +5,7 @@
5
5
  milestones: # Active milestones and their high-level status
6
6
  - id: 1
7
7
  name: "" # Human-readable milestone name from roadmap
8
- status: not_started # not_started | active | complete
8
+ status: not_started # not_started | active | deferred | complete
9
9
  last_updated: null # ISO 8601 timestamp — used for resume default selection
10
10
 
11
11
  metrics:
@@ -46,3 +46,11 @@ deviations: # Tracked deviations during execution
46
46
  plan: null
47
47
  task: null
48
48
  resolution: ""
49
+
50
+ # Lifecycle — events separate from workflow position (current:).
51
+ # current.status stays frozen when deferred — it IS the resume point.
52
+ lifecycle:
53
+ deferred_at: null # ISO 8601 — when milestone was deferred
54
+ deferred_reason: "" # User-provided reason for deferring
55
+ status_before_defer: null # Workflow status when deferred (mirrors frozen current.status)
56
+ resumed_at: null # ISO 8601 — when milestone was resumed
@@ -36,6 +36,10 @@ Auto-detects complexity. Override: "Use Quick/Standard/Full tier."
36
36
  **Flow:** `researching` → `discussing` → `architecting` → `planning` → `executing` → `verifying` → `reviewing` → done
37
37
  **Optional:** `designing` (UI), `securing` (auth/data/API), `debugging` (stuck), `testing` (e2e/integration/flake)
38
38
 
39
+ ### Advisory (tier deferred)
40
+ **Triggers:** "review"/"advise"/"assess"/"evaluate" + specific system/component, scope unclear upfront
41
+ **Flow:** `discussing` → [tier gate detects scope] → `planning` → `executing` → `verifying` → `reviewing` → done
42
+
39
43
  ## Skill Routing
40
44
 
41
45
  | Need to... | Skill | Tier |
@@ -92,8 +96,7 @@ models:
92
96
  ```
93
97
 
94
98
  **Precedence:** `skills.X` → `default` → parent model.
95
- **Parent session advisory** — warns if mismatch, cannot auto-switch. Enforced at review gate.
96
- **Agents model-agnostic** — skills set model at spawn. One routing table.
99
+ **All advisory** — forge displays expected model at each transition, suggests `/model` on mismatch. Review gate logs model used. Cannot auto-switch.
97
100
 
98
101
  ## Agents
99
102
 
@@ -130,8 +133,10 @@ State lives in `.forge/`:
130
133
  - `research/milestone-{id}.md` — Research findings snapshot (dated, immutable)
131
134
  - `phases/m{M}-{N}-{name}/plan-{NN}.md` — Task plans with must_haves frontmatter
132
135
  - `refactor-backlog.yml` — Refactoring catalog, worked via quick-tasking
136
+ - `archive/milestone-{id}/` — Archived milestone artifacts (archive-delete)
133
137
 
134
- **Milestones** group phases into concurrent streams. Own state file — no conflicts across sessions.
138
+ **Milestones** group phases into concurrent streams. Own state file — no conflicts across sessions. Can be deferred (frozen in place) or archive-deleted.
139
+ `index.yml status` gates routing: `not_started | active | deferred | complete`.
135
140
  **Format**: YAML for machine state, Markdown for human content.
136
141
  **`current.status` is authoritative.** Complete only at `current.status == complete`. 100% tasks ≠ done — still needs verifying + reviewing.
137
142