@entelligentsia/forgecli 1.0.10 → 1.0.20
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/CHANGELOG.md +191 -0
- package/dist/CHANGELOG-forge-plugin.md +211 -0
- package/dist/bin/forge.js +0 -0
- package/dist/extensions/forgecli/config-layer.js.map +1 -1
- package/dist/extensions/forgecli/context-governor-compaction.d.ts +83 -0
- package/dist/extensions/forgecli/context-governor-compaction.js +302 -0
- package/dist/extensions/forgecli/context-governor-compaction.js.map +1 -0
- package/dist/extensions/forgecli/context-governor.d.ts +173 -0
- package/dist/extensions/forgecli/context-governor.js +618 -0
- package/dist/extensions/forgecli/context-governor.js.map +1 -0
- package/dist/extensions/forgecli/dashboard/component.d.ts +105 -0
- package/dist/extensions/forgecli/dashboard/component.js +861 -0
- package/dist/extensions/forgecli/dashboard/component.js.map +1 -0
- package/dist/extensions/forgecli/dashboard/register.d.ts +2 -0
- package/dist/extensions/forgecli/dashboard/register.js +31 -0
- package/dist/extensions/forgecli/dashboard/register.js.map +1 -0
- package/dist/extensions/forgecli/dashboard/theme.d.ts +27 -0
- package/dist/extensions/forgecli/dashboard/theme.js +91 -0
- package/dist/extensions/forgecli/dashboard/theme.js.map +1 -0
- package/dist/extensions/forgecli/dashboard/view-model.d.ts +35 -0
- package/dist/extensions/forgecli/dashboard/view-model.js +54 -0
- package/dist/extensions/forgecli/dashboard/view-model.js.map +1 -0
- package/dist/extensions/forgecli/fix-bug.js +126 -7
- package/dist/extensions/forgecli/fix-bug.js.map +1 -1
- package/dist/extensions/forgecli/forge-artifact-tool.js +2 -1
- package/dist/extensions/forgecli/forge-artifact-tool.js.map +1 -1
- package/dist/extensions/forgecli/forge-commands.js +1 -0
- package/dist/extensions/forgecli/forge-commands.js.map +1 -1
- package/dist/extensions/forgecli/forge-init/phase4-register.js +53 -0
- package/dist/extensions/forgecli/forge-init/phase4-register.js.map +1 -1
- package/dist/extensions/forgecli/forge-subagent.d.ts +20 -1
- package/dist/extensions/forgecli/forge-subagent.js +23 -7
- package/dist/extensions/forgecli/forge-subagent.js.map +1 -1
- package/dist/extensions/forgecli/forge-tools.js +3 -1
- package/dist/extensions/forgecli/forge-tools.js.map +1 -1
- package/dist/extensions/forgecli/hook-dispatcher.d.ts +3 -1
- package/dist/extensions/forgecli/hook-dispatcher.js +37 -3
- package/dist/extensions/forgecli/hook-dispatcher.js.map +1 -1
- package/dist/extensions/forgecli/index.js +38 -1
- package/dist/extensions/forgecli/index.js.map +1 -1
- package/dist/extensions/forgecli/lib/halt-advisor.d.ts +59 -0
- package/dist/extensions/forgecli/lib/halt-advisor.js +113 -0
- package/dist/extensions/forgecli/lib/halt-advisor.js.map +1 -0
- package/dist/extensions/forgecli/migration-engine.js +25 -12
- package/dist/extensions/forgecli/migration-engine.js.map +1 -1
- package/dist/extensions/forgecli/orchestrator-status-bar.d.ts +26 -0
- package/dist/extensions/forgecli/orchestrator-status-bar.js +213 -0
- package/dist/extensions/forgecli/orchestrator-status-bar.js.map +1 -0
- package/dist/extensions/forgecli/orchestrator-tree.d.ts +96 -0
- package/dist/extensions/forgecli/orchestrator-tree.js +390 -0
- package/dist/extensions/forgecli/orchestrator-tree.js.map +1 -0
- package/dist/extensions/forgecli/project-orientation.js +12 -8
- package/dist/extensions/forgecli/project-orientation.js.map +1 -1
- package/dist/extensions/forgecli/regenerate.d.ts +16 -0
- package/dist/extensions/forgecli/regenerate.js +110 -0
- package/dist/extensions/forgecli/regenerate.js.map +1 -1
- package/dist/extensions/forgecli/run-sprint.d.ts +3 -1
- package/dist/extensions/forgecli/run-sprint.js +34 -3
- package/dist/extensions/forgecli/run-sprint.js.map +1 -1
- package/dist/extensions/forgecli/run-task.d.ts +66 -1
- package/dist/extensions/forgecli/run-task.js +323 -12
- package/dist/extensions/forgecli/run-task.js.map +1 -1
- package/dist/extensions/forgecli/thread-switcher.d.ts +4 -1
- package/dist/extensions/forgecli/thread-switcher.js +118 -762
- package/dist/extensions/forgecli/thread-switcher.js.map +1 -1
- package/dist/extensions/forgecli/viewport-events.js +32 -0
- package/dist/extensions/forgecli/viewport-events.js.map +1 -1
- package/dist/forge-payload/.base-pack/commands/fix-bug.md +1 -1
- package/dist/forge-payload/.base-pack/commands/run-sprint.md +1 -1
- package/dist/forge-payload/.base-pack/commands/run-task.md +1 -1
- package/dist/forge-payload/.base-pack/personas/architect.md +1 -1
- package/dist/forge-payload/.base-pack/personas/bug-fixer.md +1 -1
- package/dist/forge-payload/.base-pack/personas/collator.md +3 -3
- package/dist/forge-payload/.base-pack/personas/engineer.md +1 -1
- package/dist/forge-payload/.base-pack/personas/librarian.md +1 -1
- package/dist/forge-payload/.base-pack/personas/orchestrator.md +1 -1
- package/dist/forge-payload/.base-pack/personas/product-manager.md +1 -1
- package/dist/forge-payload/.base-pack/personas/qa-engineer.md +1 -1
- package/dist/forge-payload/.base-pack/personas/supervisor.md +1 -1
- package/dist/forge-payload/.base-pack/workflows/_fragments/event-emission-schema.md +1 -1
- package/dist/forge-payload/.base-pack/workflows/_fragments/friction-emit.md +1 -1
- package/dist/forge-payload/.base-pack/workflows/_fragments/iron-laws.md +1 -1
- package/dist/forge-payload/.base-pack/workflows/_fragments/progress-reporting.md +2 -2
- package/dist/forge-payload/.base-pack/workflows/_fragments/store-cli-verbs.md +11 -2
- package/dist/forge-payload/.base-pack/workflows/architect_approve.md +6 -7
- package/dist/forge-payload/.base-pack/workflows/architect_review_sprint_completion.md +2 -2
- package/dist/forge-payload/.base-pack/workflows/architect_sprint_intake.md +2 -2
- package/dist/forge-payload/.base-pack/workflows/architect_sprint_plan.md +5 -5
- package/dist/forge-payload/.base-pack/workflows/collator_agent.md +4 -6
- package/dist/forge-payload/.base-pack/workflows/commit_task.md +5 -6
- package/dist/forge-payload/.base-pack/workflows/enhance.md +5 -5
- package/dist/forge-payload/.base-pack/workflows/implement_plan.md +15 -7
- package/dist/forge-payload/.base-pack/workflows/migrate_structural.md +12 -13
- package/dist/forge-payload/.base-pack/workflows/plan_task.md +12 -6
- package/dist/forge-payload/.base-pack/workflows/review_code.md +12 -11
- package/dist/forge-payload/.base-pack/workflows/review_plan.md +12 -11
- package/dist/forge-payload/.base-pack/workflows/sprint_retrospective.md +3 -3
- package/dist/forge-payload/.base-pack/workflows/triage.md +12 -9
- package/dist/forge-payload/.base-pack/workflows/update_implementation.md +2 -2
- package/dist/forge-payload/.base-pack/workflows/update_plan.md +2 -2
- package/dist/forge-payload/.base-pack/workflows/validate_task.md +9 -9
- package/dist/forge-payload/.base-pack/workflows-js/wfl-fix-bug.js +490 -0
- package/dist/forge-payload/.base-pack/workflows-js/wfl-run-sprint.js +416 -0
- package/dist/forge-payload/.base-pack/workflows-js/wfl-run-task.js +608 -0
- package/dist/forge-payload/.claude-plugin/plugin.json +1 -1
- package/dist/forge-payload/.schemas/config.schema.json +2 -3
- package/dist/forge-payload/.schemas/enum-catalog.json +2 -2
- package/dist/forge-payload/.schemas/event.schema.json +16 -0
- package/dist/forge-payload/.schemas/migrations.json +359 -18
- package/dist/forge-payload/commands/health.md +29 -0
- package/dist/forge-payload/commands/rebuild.md +143 -15
- package/dist/forge-payload/commands/update.md +28 -27
- package/dist/forge-payload/hooks/preflight-session.cjs +99 -0
- package/dist/forge-payload/init/phases/phase-3-materialize.md +18 -5
- package/dist/forge-payload/integrity.json +7 -6
- package/dist/forge-payload/meta/fragments/tool-discipline.md +1 -1
- package/dist/forge-payload/meta/personas/meta-architect.md +1 -1
- package/dist/forge-payload/meta/personas/meta-bug-fixer.md +1 -1
- package/dist/forge-payload/meta/personas/meta-collator.md +7 -7
- package/dist/forge-payload/meta/personas/meta-engineer.md +1 -1
- package/dist/forge-payload/meta/personas/meta-orchestrator.md +1 -1
- package/dist/forge-payload/meta/personas/meta-supervisor.md +1 -1
- package/dist/forge-payload/meta/tool-specs/store-cli.spec.md +1 -1
- package/dist/forge-payload/meta/workflows/_fragments/event-emission-schema.md +1 -1
- package/dist/forge-payload/meta/workflows/_fragments/friction-emit.md +1 -1
- package/dist/forge-payload/meta/workflows/_fragments/iron-laws.md +1 -1
- package/dist/forge-payload/meta/workflows/_fragments/progress-reporting.md +2 -2
- package/dist/forge-payload/meta/workflows/_fragments/store-cli-verbs.md +11 -2
- package/dist/forge-payload/meta/workflows/meta-approve.md +6 -7
- package/dist/forge-payload/meta/workflows/meta-bug-triage.md +12 -9
- package/dist/forge-payload/meta/workflows/meta-collate.md +5 -7
- package/dist/forge-payload/meta/workflows/meta-commit.md +5 -6
- package/dist/forge-payload/meta/workflows/meta-enhance.md +5 -5
- package/dist/forge-payload/meta/workflows/meta-fix-bug.md +35 -11
- package/dist/forge-payload/meta/workflows/meta-implement.md +15 -7
- package/dist/forge-payload/meta/workflows/meta-migrate.md +13 -14
- package/dist/forge-payload/meta/workflows/meta-new-sprint.md +3 -3
- package/dist/forge-payload/meta/workflows/meta-orchestrate.md +138 -39
- package/dist/forge-payload/meta/workflows/meta-plan-sprint.md +6 -6
- package/dist/forge-payload/meta/workflows/meta-plan-task.md +12 -6
- package/dist/forge-payload/meta/workflows/meta-retro.md +4 -4
- package/dist/forge-payload/meta/workflows/meta-retrospective.md +4 -4
- package/dist/forge-payload/meta/workflows/meta-review-implementation.md +12 -11
- package/dist/forge-payload/meta/workflows/meta-review-plan.md +12 -11
- package/dist/forge-payload/meta/workflows/meta-review-sprint-completion.md +3 -3
- package/dist/forge-payload/meta/workflows/meta-sprint-intake.md +3 -3
- package/dist/forge-payload/meta/workflows/meta-sprint-plan.md +6 -6
- package/dist/forge-payload/meta/workflows/meta-update-implementation.md +2 -2
- package/dist/forge-payload/meta/workflows/meta-update-plan.md +2 -2
- package/dist/forge-payload/meta/workflows/meta-validate.md +9 -9
- package/dist/forge-payload/schemas/config.schema.json +2 -3
- package/dist/forge-payload/schemas/enum-catalog.json +2 -2
- package/dist/forge-payload/schemas/event.schema.json +16 -0
- package/dist/forge-payload/schemas/structure-manifest.json +75 -73
- package/dist/forge-payload/skills/refresh-kb-links/SKILL.md +14 -7
- package/dist/forge-payload/tools/banners.cjs +29 -10
- package/dist/forge-payload/tools/check-structure.cjs +88 -7
- package/dist/forge-payload/tools/collate.cjs +48 -2
- package/dist/forge-payload/tools/manage-config.cjs +5 -7
- package/dist/forge-payload/tools/parse-gates.cjs +73 -1
- package/dist/forge-payload/tools/postflight-gate.cjs +298 -0
- package/dist/forge-payload/tools/preflight-gate.cjs +47 -0
- package/dist/forge-payload/tools/substitute-placeholders.cjs +5 -4
- package/dist/forge-payload/tools/verify-phase.cjs +17 -0
- package/package.json +2 -2
- package/dist/bin/forgecli.d.ts +0 -2
- package/dist/bin/forgecli.js +0 -6
- package/dist/bin/forgecli.js.map +0 -1
- package/dist/extensions/forgecli/config-tui/index.d.ts +0 -5
- package/dist/extensions/forgecli/config-tui/index.js +0 -5
- package/dist/extensions/forgecli/config-tui/index.js.map +0 -1
- package/dist/extensions/forgecli/loaders/persona-skill-loader.d.ts +0 -45
- package/dist/extensions/forgecli/loaders/persona-skill-loader.js +0 -227
- package/dist/extensions/forgecli/loaders/persona-skill-loader.js.map +0 -1
- package/dist/extensions/forgecli/loaders/template-render.d.ts +0 -20
- package/dist/extensions/forgecli/loaders/template-render.js +0 -85
- package/dist/extensions/forgecli/loaders/template-render.js.map +0 -1
- package/dist/extensions/forgecli/loaders/workflow-loader.d.ts +0 -41
- package/dist/extensions/forgecli/loaders/workflow-loader.js +0 -164
- package/dist/extensions/forgecli/loaders/workflow-loader.js.map +0 -1
- package/dist/forge-payload/.base-pack/workflows/fix_bug.md +0 -446
- package/dist/forge-payload/.base-pack/workflows/orchestrate_task.md +0 -928
- package/dist/forge-payload/.base-pack/workflows/run_sprint.md +0 -225
|
@@ -1,225 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
audience: orchestrator-only
|
|
3
|
-
deps:
|
|
4
|
-
personas: [orchestrator]
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
# Workflow: Run Sprint (Forge)
|
|
8
|
-
|
|
9
|
-
## Purpose
|
|
10
|
-
|
|
11
|
-
Drive all tasks in a sprint through the pipeline. Respects dependency
|
|
12
|
-
ordering and execution mode. Handles errors without halting the whole
|
|
13
|
-
sprint — escalated or failed tasks do not block unrelated tasks.
|
|
14
|
-
|
|
15
|
-
---
|
|
16
|
-
|
|
17
|
-
## Step 1 — Load Sprint
|
|
18
|
-
|
|
19
|
-
- Read `.forge/store/sprints/{{PREFIX}}-S{NN}.json`
|
|
20
|
-
- Read all task JSONs from `.forge/store/tasks/` filtered by `sprintId`
|
|
21
|
-
|
|
22
|
-
**Skip** tasks already in a terminal status: `committed`, `abandoned`.
|
|
23
|
-
**Resume** tasks mid-pipeline: `planned`, `plan-approved`, `implementing`, `review-approved`, `approved`, `escalated` (only if explicitly requested).
|
|
24
|
-
|
|
25
|
-
Update sprint `status` to `active`.
|
|
26
|
-
|
|
27
|
-
## Step 2 — Sort by Dependency
|
|
28
|
-
|
|
29
|
-
- Topological sort: tasks with no remaining dependencies go first.
|
|
30
|
-
- Compute waves: tasks with no inter-wave edges can run in parallel.
|
|
31
|
-
- Validate: no cycles. If a cycle is detected, stop and escalate to the user.
|
|
32
|
-
|
|
33
|
-
### Wave Computation Algorithm
|
|
34
|
-
|
|
35
|
-
```python
|
|
36
|
-
function compute_waves(tasks):
|
|
37
|
-
# Build adjacency list from task.dependencies
|
|
38
|
-
graph = {task_id: set() for task_id in tasks}
|
|
39
|
-
in_degree = {task_id: 0 for task_id in tasks}
|
|
40
|
-
task_map = {task.taskId: task for task in tasks}
|
|
41
|
-
|
|
42
|
-
for task in tasks:
|
|
43
|
-
for dep_id in task.get("dependencies", []):
|
|
44
|
-
if dep_id in graph:
|
|
45
|
-
graph[dep_id].add(task.taskId)
|
|
46
|
-
in_degree[task.taskId] += 1
|
|
47
|
-
|
|
48
|
-
# Kahn's algorithm — each "wave" is all nodes with in_degree == 0
|
|
49
|
-
waves = []
|
|
50
|
-
queue = [tid for tid, deg in in_degree.items() if deg == 0]
|
|
51
|
-
|
|
52
|
-
while queue:
|
|
53
|
-
wave = sorted(queue) # deterministic ordering within a wave
|
|
54
|
-
waves.append(wave)
|
|
55
|
-
next_queue = []
|
|
56
|
-
for tid in wave:
|
|
57
|
-
for successor in graph[tid]:
|
|
58
|
-
in_degree[successor] -= 1
|
|
59
|
-
if in_degree[successor] == 0:
|
|
60
|
-
next_queue.append(successor)
|
|
61
|
-
queue = next_queue
|
|
62
|
-
|
|
63
|
-
# If any nodes remain, there is a cycle
|
|
64
|
-
remaining = [tid for tid, deg in in_degree.items() if deg > 0]
|
|
65
|
-
if remaining:
|
|
66
|
-
raise CycleError(f"Dependency cycle detected among: {remaining}")
|
|
67
|
-
|
|
68
|
-
return waves
|
|
69
|
-
```
|
|
70
|
-
|
|
71
|
-
## Step 3 — Execute
|
|
72
|
-
|
|
73
|
-
### Clear Progress Log at Sprint Start
|
|
74
|
-
|
|
75
|
-
Before dispatching any task, clear the progress log for this sprint:
|
|
76
|
-
|
|
77
|
-
```bash
|
|
78
|
-
FORGE_ROOT=$(node -e "console.log(require('./.forge/config.json').paths.forgeRoot)")
|
|
79
|
-
node "$FORGE_ROOT/tools/store-cli.cjs" progress-clear {SPRINT_ID}
|
|
80
|
-
```
|
|
81
|
-
|
|
82
|
-
This ensures a clean log for each sprint run.
|
|
83
|
-
|
|
84
|
-
### Sequential Mode (default)
|
|
85
|
-
|
|
86
|
-
```python
|
|
87
|
-
for each task in dependency_sorted(tasks):
|
|
88
|
-
# Announce with the orchestrator banner
|
|
89
|
-
print("🌊 Sprint {SPRINT_ID} — running {task.taskId}")
|
|
90
|
-
|
|
91
|
-
# Spawn a fresh-context subagent for the full task pipeline via the Agent tool.
|
|
92
|
-
# The task-level orchestrator then spawns per-phase subagents with their own
|
|
93
|
-
# per-phase model resolution (see orchestrate_task.md).
|
|
94
|
-
spawn_subagent(
|
|
95
|
-
prompt="Read `.forge/workflows/orchestrate_task.md` and follow it. "
|
|
96
|
-
"Task ID: {task.taskId}. "
|
|
97
|
-
"Also read `engineering/MASTER_INDEX.md` for project state.",
|
|
98
|
-
description="Run pipeline for {task.taskId}",
|
|
99
|
-
model="sonnet" # orchestrator is a lightweight state machine
|
|
100
|
-
)
|
|
101
|
-
|
|
102
|
-
# After the subagent returns, read the task status from disk.
|
|
103
|
-
task_status = read_task_status(task.taskId) # .forge/store/tasks/{TASK_ID}.json
|
|
104
|
-
|
|
105
|
-
# Re-spawn guard: if the subagent returned without reaching a terminal state
|
|
106
|
-
# (e.g. it produced large output and ran out of context mid-pipeline),
|
|
107
|
-
# spawn once more with an explicit resume instruction before escalating.
|
|
108
|
-
if task_status not in ["committed", "abandoned", "escalated"]:
|
|
109
|
-
spawn_subagent(
|
|
110
|
-
prompt="Read `.forge/workflows/orchestrate_task.md` and follow it. "
|
|
111
|
-
"Task ID: {task.taskId}. "
|
|
112
|
-
"The task is currently at status '{task_status}' — resume from that phase. "
|
|
113
|
-
"Do not re-run phases that are already complete. "
|
|
114
|
-
"Also read `engineering/MASTER_INDEX.md` for project state.",
|
|
115
|
-
description="Resume pipeline for {task.taskId} (was {task_status})",
|
|
116
|
-
model="sonnet"
|
|
117
|
-
)
|
|
118
|
-
task_status = read_task_status(task.taskId)
|
|
119
|
-
if task_status not in ["committed", "abandoned", "escalated"]:
|
|
120
|
-
# Two attempts exhausted — escalate and continue with remaining tasks.
|
|
121
|
-
escalate("Task {task.taskId} did not reach terminal state after re-spawn "
|
|
122
|
-
"(status: {task_status}). Manual intervention required.")
|
|
123
|
-
# DO NOT compact mid re-spawn guard — compact only after final status read.
|
|
124
|
-
|
|
125
|
-
# Terminal: "committed" → success. "escalated" → note and continue.
|
|
126
|
-
# Never halt the whole sprint on one escalation.
|
|
127
|
-
|
|
128
|
-
# Compact context before next task: all state is on disk
|
|
129
|
-
remaining = count of tasks not yet in terminal status
|
|
130
|
-
print(f"[checkpoint] sprint={SPRINT_ID} task={task.taskId} status={task_status} remaining={remaining}")
|
|
131
|
-
/compact
|
|
132
|
-
```
|
|
133
|
-
|
|
134
|
-
**All verdict detection, revision loops, escalation, and event emission are
|
|
135
|
-
handled inside the task subagent.** See `orchestrate_task.md`.
|
|
136
|
-
|
|
137
|
-
### Wave-Parallel Mode
|
|
138
|
-
|
|
139
|
-
For each wave in dependency order:
|
|
140
|
-
|
|
141
|
-
1. Create a git worktree per task in the wave:
|
|
142
|
-
```bash
|
|
143
|
-
git worktree add ../worktrees/{TASK_ID} HEAD
|
|
144
|
-
```
|
|
145
|
-
2. Spawn one subagent per task in parallel, each running `orchestrate_task.md` inside its worktree
|
|
146
|
-
3. Wait for all subagents in the wave to finish
|
|
147
|
-
4. Merge strategy: rebase each completed worktree onto `main`; on conflict → escalate that task, continue with the rest
|
|
148
|
-
5. Remove worktrees:
|
|
149
|
-
```bash
|
|
150
|
-
git worktree remove ../worktrees/{TASK_ID}
|
|
151
|
-
```
|
|
152
|
-
|
|
153
|
-
### Full-Parallel Mode
|
|
154
|
-
|
|
155
|
-
Same as wave-parallel but all tasks start simultaneously. Use only when
|
|
156
|
-
every task is independent (no dependencies at all).
|
|
157
|
-
|
|
158
|
-
## Execution Modes
|
|
159
|
-
|
|
160
|
-
| Mode | Behaviour |
|
|
161
|
-
|---|---|
|
|
162
|
-
| `sequential` | One task at a time (default) |
|
|
163
|
-
| `wave-parallel` | Tasks in the same dependency wave run in parallel worktrees |
|
|
164
|
-
| `full-parallel` | All tasks run in parallel (use only when fully independent) |
|
|
165
|
-
|
|
166
|
-
## Step 4 — Post-Sprint
|
|
167
|
-
|
|
168
|
-
Once all tasks have reached a terminal status:
|
|
169
|
-
|
|
170
|
-
1. Run collation using the runtime-read pattern:
|
|
171
|
-
```bash
|
|
172
|
-
FORGE_ROOT=$(node -e "console.log(require('./.forge/config.json').paths.forgeRoot)")
|
|
173
|
-
node "$FORGE_ROOT/tools/collate.cjs"
|
|
174
|
-
```
|
|
175
|
-
Or —
|
|
176
|
-
2. Summarise outcomes:
|
|
177
|
-
```
|
|
178
|
-
🌊 Sprint {SPRINT_ID} complete.
|
|
179
|
-
〇 Committed: N tasks
|
|
180
|
-
△ Escalated: N tasks
|
|
181
|
-
── Carried over / abandoned: N tasks
|
|
182
|
-
```
|
|
183
|
-
3. Update sprint `status` to `completed` or `partially-completed`
|
|
184
|
-
4. Suggest: "Run `/forge:retro {SPRINT_ID}` to close out the sprint."
|
|
185
|
-
|
|
186
|
-
## Sprint Lifecycle Hooks
|
|
187
|
-
|
|
188
|
-
| Hook | When | Action |
|
|
189
|
-
|---|---|---|
|
|
190
|
-
| `collate` | After all tasks terminal | Run `node "$FORGE_ROOT/tools/collate.cjs"` |
|
|
191
|
-
| `report` | After collation | Print outcome summary (committed/escalated/carried-over counts) |
|
|
192
|
-
| `suggest` | After report | Suggest `/forge:retro {SPRINT_ID}` |
|
|
193
|
-
|
|
194
|
-
## Resume Semantics
|
|
195
|
-
|
|
196
|
-
If interrupted, re-run `/forge:run-sprint {SPRINT_ID}`. Already-committed tasks are
|
|
197
|
-
skipped. Tasks in mid-pipeline state resume from their current phase
|
|
198
|
-
(the task-level orchestrator reads `status` from disk and continues).
|
|
199
|
-
|
|
200
|
-
## Event Emission
|
|
201
|
-
|
|
202
|
-
The sprint runner itself emits `sprint-start`, `sprint-complete`, and
|
|
203
|
-
per-task `task-dispatch` events to `.forge/store/events/{SPRINT_ID}/`.
|
|
204
|
-
Per-phase events are emitted by `orchestrate_task.md` inside each task
|
|
205
|
-
subagent.
|
|
206
|
-
|
|
207
|
-
## Iron Laws
|
|
208
|
-
|
|
209
|
-
- Read `.forge/personas/orchestrator.md` first; print the persona identity line to stdout before any other tool use.
|
|
210
|
-
- All store I/O via `forge_store` (or `node "$FORGE_ROOT/tools/store-cli.cjs"`). Never edit `.forge/store/*.json` directly.
|
|
211
|
-
- Follow the Algorithm step by step. Do not skip tasks or skip the dependency sort.
|
|
212
|
-
- Verdict detection and revision loops are handled inside task subagents — the sprint runner must not fabricate results or assume success without evidence.
|
|
213
|
-
- Silent continuation past a failure is never acceptable. Every failure must produce a visible signal and a structured event.
|
|
214
|
-
|
|
215
|
-
## Store-Write Verification
|
|
216
|
-
|
|
217
|
-
Every `forge_store` write MUST succeed before advancing. If `store-cli` exits
|
|
218
|
-
non-zero or the `PreToolUse` write-boundary hook blocks the call (exit 2):
|
|
219
|
-
|
|
220
|
-
1. Parse the structured error (names the offending field + schema file).
|
|
221
|
-
2. Correct the JSON to satisfy the schema.
|
|
222
|
-
3. Retry. Repeat up to 3 times.
|
|
223
|
-
4. After 3 failures, halt and escalate with original payload, corrected payload, and all error messages.
|
|
224
|
-
|
|
225
|
-
Never set `FORGE_SKIP_WRITE_VALIDATION=1` — operator-only emergency switch.
|