forge-orkes 0.12.1 → 0.13.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.12.1",
3
+ "version": "0.13.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"
@@ -0,0 +1,85 @@
1
+ ---
2
+ name: deferred
3
+ description: Read-only aggregator. Show all deferred work in this project grouped by surface (milestones, refactor backlog, phases/tasks inside active milestones). Trigger:`/forge deferred`, "show deferred", "deferred items", "what's deferred".
4
+ model: haiku
5
+ ---
6
+
7
+ # Deferred
8
+
9
+ Read-only. Surface all deferred work across three storage surfaces so user need not remember where each kind lives. Never mutates state. No agents, no Skill invocations, no Write/Edit.
10
+
11
+ Three surfaces:
12
+
13
+ 1. **Milestones** — `.forge/state/index.yml` entries with `status: deferred`. Strategic punts (whole milestone frozen).
14
+ 2. **Refactor backlog** — `.forge/refactor-backlog.yml` items with `status: deferred`. Code-quality punts.
15
+ 3. **Inside active milestones** — phase/task entries with `status: deferred` or `deferred: true` inside `.forge/state/milestone-*.yml`. Tactical punts within in-flight work.
16
+
17
+ ## Step 1: Read three surfaces
18
+
19
+ **Surface 1 — Deferred milestones.** Read `.forge/state/index.yml`. Collect every entry under `milestones:` where `status: deferred`. Pull `id`, `name`, `lifecycle.deferred_at` (if present at top level fall back to `last_updated`), `lifecycle.deferred_reason` (may live in the milestone state file — read `.forge/state/milestone-{id}.yml → lifecycle.deferred_at / deferred_reason` for accuracy).
20
+
21
+ **Surface 2 — Deferred refactor items.** Read `.forge/refactor-backlog.yml`. Collect every item with `status: deferred`. Pull `id` (e.g. R-007), `description` (first line, truncate ≤80 chars), `deferred_at`, `deferred_reason`.
22
+
23
+ **Surface 3 — Deferred phases/tasks inside active milestones.** Glob `.forge/state/milestone-*.yml`. For each file:
24
+
25
+ - Look up that milestone's status in `index.yml`.
26
+ - **Only process if `status: active`.** Skip `complete` and `deferred` milestones.
27
+ - *Why:* a deferred milestone's own `lifecycle.deferred_at` block is already counted by Surface 1. Including it here double-counts. Skipping `complete` avoids historical noise.
28
+ - Within the file, find phase or task entries with `status: deferred` or `deferred: true`. Pull milestone id, phase/task name, `deferred_at`, `deferred_reason`.
29
+
30
+ Missing source files → that section renders `(none)`. Never error.
31
+
32
+ ## Step 2: Normalize
33
+
34
+ Each entry → tuple `{ surface, id, name, deferred_at, deferred_reason }`. Missing `deferred_at` → null. Missing `deferred_reason` → null.
35
+
36
+ ## Step 3: Sort
37
+
38
+ Within each section, sort by `deferred_at` ascending (oldest first). Null dates sort last.
39
+
40
+ ## Step 4: Render
41
+
42
+ Exact format:
43
+
44
+ ```
45
+ Deferred work in this project:
46
+
47
+ ## Milestones ({count})
48
+ - M{id} — {name} (deferred {deferred_at | "date unknown"})
49
+ Reason: {deferred_reason | "—"}
50
+
51
+ ## Refactor Backlog ({count})
52
+ - {R-id} — {description} (deferred {deferred_at | "unknown"})
53
+ Reason: {deferred_reason | "—"}
54
+
55
+ ## Inside Active Milestones ({count})
56
+ - M{milestone_id} → {phase or task name} (deferred {deferred_at | "unknown"})
57
+ Reason: {deferred_reason | "—"}
58
+ ```
59
+
60
+ Section with count 0 → render header + `(none)` line beneath.
61
+
62
+ ## Empty state
63
+
64
+ All three counts zero → print exactly:
65
+
66
+ ```
67
+ No deferred work in this project.
68
+ ```
69
+
70
+ Then exit.
71
+
72
+ ## Graceful degradation
73
+
74
+ - Missing `.forge/state/index.yml` → cannot proceed. Print `No forge state found in this project.` exit.
75
+ - Missing `.forge/refactor-backlog.yml` → Surface 2 renders `(none)`. Continue.
76
+ - No `milestone-*.yml` matches → Surface 3 renders `(none)`. Continue.
77
+ - Malformed YAML in any source → skip that source, render `(unreadable)` beneath header, continue others.
78
+
79
+ ## Boundaries
80
+
81
+ - Read-only. No Write, no Edit, no Bash mutations.
82
+ - No agent dispatch. Mechanical aggregation only.
83
+ - No filter subcommands. Grouped-only view (locked decision).
84
+ - No auto-close, no rot detection, no promotion. Deferred to v2.
85
+ - Do not invoke other skills.
@@ -212,6 +212,8 @@ Do NOT list test failures here — pre-existing failures belong in deferred-issu
212
212
  3. Update `.forge/state/index.yml` — set `last_updated` timestamp
213
213
  4. All plans in phase complete → transition to `verifying`
214
214
 
215
+ **When deferring an individual phase or task** (writing `status: deferred` or `deferred: true` to a phase/task entry inside the milestone state file — as opposed to milestone-wide defer which goes through the forge skill's lifecycle flow): write `deferred_at` (ISO date today) and `deferred_reason` (one-line) siblings. Old entries without these fields parse fine — lazy migration. These feed the `deferred` aggregator skill.
216
+
215
217
  ## Desire Path Signals
216
218
 
217
219
  Log to `.forge/state/index.yml → desire_paths` (global, not per-milestone):
@@ -92,9 +92,15 @@ Before tier detection, check if user request matches lifecycle patterns:
92
92
  - "defer milestone {id}" / "defer {id}" / "pause milestone {id}" → **Defer**
93
93
  - "resume milestone {id}" / "undefer {id}" / "reactivate milestone {id}" → **Resume**
94
94
  - "delete milestone {id}" / "archive milestone {id}" / "remove milestone {id}" → **Delete** (see below)
95
+ - "deferred" / "show deferred" / "deferred items" / "what's deferred" / "deferred work" → **Show Deferred**
95
96
 
96
97
  No match → fall through to Step 2B (tier detection).
97
98
 
99
+ ### Show Deferred
100
+
101
+ 1. Invoke `Skill(deferred)` directly.
102
+ 2. Do not enter tier detection. Do not prompt for milestone. The deferred skill is read-only and self-contained.
103
+
98
104
  ### Defer Operation
99
105
 
100
106
  1. Validate: milestone in `index.yml`, status not `deferred`
@@ -218,6 +224,7 @@ Where `{source}` = `skills.{name}` | `models.default` | `parent session`. Suppre
218
224
  | quick-tasking | haiku | Speed |
219
225
  | discussing | sonnet | Conversation |
220
226
  | testing | sonnet | Code gen (author) + audit judgment (analyst) — matches executing/reviewing |
227
+ | deferred | haiku | Read + format only |
221
228
 
222
229
  | `current.status` | Route To |
223
230
  |-------------------|----------|
@@ -232,6 +239,7 @@ Where `{source}` = `skills.{name}` | `models.default` | `parent session`. Suppre
232
239
  | `complete` | Done. Ask what's next. |
233
240
  | `deferred` | Milestone frozen. *"Resume milestone {id}" to reactivate.* |
234
241
  | `quick-tasking` | `Skill(quick-tasking)` |
242
+ | (keyword: `deferred` / "show deferred") | `Skill(deferred)` — read-only aggregator |
235
243
 
236
244
  ### Status Advancement Check
237
245
 
@@ -285,6 +285,8 @@ items:
285
285
 
286
286
  Missing? Create from `.forge/templates/refactor-backlog.yml`.
287
287
 
288
+ **When deferring an individual refactor item** (status flipped to `deferred`, as opposed to milestone-wide defer which goes through the forge skill): write `deferred_at` (ISO date today) and `deferred_reason` (one-line) siblings to `status: deferred`. Pre-existing items without these fields parse fine — lazy migration. These feed the `deferred` aggregator skill.
289
+
288
290
  ### Route
289
291
 
290
292
  **HEALTHY/WARNINGS (accepted):** `current.status: complete` in milestone + index. *"Milestone [{name}] complete. {N} backlog items."* Beads: `bd complete`.
@@ -1,6 +1,12 @@
1
1
  # Forge Refactor Backlog
2
2
  # Auto-managed by the refactoring skill. Items added after milestone audits.
3
3
  # Work items via quick-tasking (effort: quick) or Standard tier (effort: standard).
4
+ #
5
+ # Status vocab: pending | in_progress | done | dismissed | deferred
6
+ # Optional fields (lazy migration — only required on entries set to status: deferred going forward):
7
+ # deferred_at: ISO date when status flipped to deferred
8
+ # deferred_reason: one-line why; revisited when status changes
9
+ # Pre-existing items without these fields parse fine.
4
10
 
5
11
  items:
6
12
  - id: R001 # Sequential ID: R001, R002, ...
@@ -11,6 +17,21 @@ items:
11
17
  description: "Brief description of the refactoring opportunity"
12
18
  effort: quick # quick (< 30 min, < 50 lines) | standard (needs planning)
13
19
  suggested_approach: "Concrete suggestion for how to address it"
14
- status: pending # pending | in_progress | done | dismissed
20
+ status: pending # pending | in_progress | done | dismissed | deferred
15
21
  added: "2026-01-01" # ISO 8601 date when added
16
22
  completed: null # ISO 8601 date when done, null otherwise
23
+
24
+ # Example of a deferred item — note the two optional sibling fields:
25
+ - id: R002
26
+ milestone: 1
27
+ category: abstraction
28
+ file: "src/legacy.ts"
29
+ lines: "1-200"
30
+ description: "Extract module — blocked on upstream API change"
31
+ effort: standard
32
+ suggested_approach: "Wait for v2 API, then extract"
33
+ status: deferred
34
+ deferred_at: "2026-05-29" # ISO date when status flipped to deferred
35
+ deferred_reason: "Blocked on upstream v2 API; revisit Q3"
36
+ added: "2026-01-15"
37
+ completed: null
@@ -50,8 +50,23 @@ deviations: # Tracked deviations during execution
50
50
 
51
51
  # Lifecycle — events separate from workflow position (current:).
52
52
  # current.status stays frozen when deferred — it IS the resume point.
53
+ # This block handles MILESTONE-LEVEL deferral (whole milestone frozen).
53
54
  lifecycle:
54
55
  deferred_at: null # ISO 8601 — when milestone was deferred
55
56
  deferred_reason: "" # User-provided reason for deferring
56
57
  status_before_defer: null # Workflow status when deferred (mirrors frozen current.status)
57
58
  resumed_at: null # ISO 8601 — when milestone was resumed
59
+
60
+ # Phase/task-level deferral (separate scope from milestone-level lifecycle above):
61
+ # When marking an individual phase or task deferred INSIDE an active milestone,
62
+ # add deferred_at + deferred_reason adjacent to that entry's status field.
63
+ # Fields are OPTIONAL (lazy migration — old entries lacking them parse fine).
64
+ # These feed the `deferred` aggregator skill.
65
+ #
66
+ # Example (this template doesn't model concrete phases, but when a skill
67
+ # writes such an entry, follow this shape):
68
+ # phases:
69
+ # - id: 3
70
+ # status: deferred
71
+ # deferred_at: "2026-05-29"
72
+ # deferred_reason: "Blocked on upstream API; revisit when X ships"