@houseofwolvesllc/claude-scrum-skill 1.8.1 → 2.0.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/README.md +55 -0
- package/bin/install.js +9 -0
- package/lib/workflows/adversarial_verify.js +148 -0
- package/lib/workflows/elaborate_epics.js +136 -0
- package/lib/workflows/review_panel.js +166 -0
- package/lib/workflows/schemas/EmulationFindingSchema.json +36 -0
- package/lib/workflows/schemas/EpicSchema.json +47 -0
- package/lib/workflows/schemas/PRDFrontmatterSchema.json +21 -0
- package/lib/workflows/schemas/ReviewVerdictSchema.json +61 -0
- package/lib/workflows/schemas/ScaffoldOutputSchema.json +34 -0
- package/lib/workflows/schemas/SpecSchema.json +77 -0
- package/lib/workflows/schemas/SprintStoryReturnSchema.json +42 -0
- package/lib/workflows/schemas/StorySchema.json +56 -0
- package/lib/workflows/sprint_pipeline.js +252 -0
- package/package.json +3 -2
- package/skills/project-cleanup/SKILL.md +27 -0
- package/skills/project-emulate/SKILL.md +29 -0
- package/skills/project-orchestrate/SKILL.md +45 -79
- package/skills/project-scaffold/SKILL.md +21 -23
- package/skills/project-spec/SKILL.md +29 -0
|
@@ -11,6 +11,7 @@ Fully autonomous project lifecycle driver. Plans sprints, executes stories via p
|
|
|
11
11
|
|
|
12
12
|
## Before You Start
|
|
13
13
|
|
|
14
|
+
0. **v2.0.0 runtime check.** Confirm the Claude Code **Workflow tool** is available in this session. v2.0.0 invokes workflow scripts at `<skills-root>/_workflows/*.js` for sprint execution, Pass 2 epic elaboration, multi-spec queueing, emulation finding verification, and the review gate. If the Workflow tool is absent, abort with: "v2.0.0 requires the Claude Code Workflow tool. Update Claude Code, or install the v1.8.x fallback (`npm install --save-dev @houseofwolvesllc/claude-scrum-skill@1.8.1`)." Do not proceed.
|
|
14
15
|
1. Read `../shared/references/CONVENTIONS.md` for all project management standards. Follow these conventions exactly. Pay particular attention to **Epic Structure → Design-Spike Epic** — orchestration honors the design-spike epic's gating, so implementation work in a scoped run does not begin until the design-spike epic completes. Also note **Frontmatter Fields → PRD Document Frontmatter** — the `depends_on` field controls inter-spec execution order in sequential multi-path mode.
|
|
15
16
|
1a. **Multi-path mode and new flags:** when invoked with 2+ existing-file paths, `/project-orchestrate` runs in sequential multi-path mode (each spec receives its own complete orchestration end-to-end). Two new flags are accepted: `--skip-on-pause` (default off; advance the queue when a spec hits a safety gate instead of pausing) and `--merged` (default off; treat multi-path inputs as one combined legacy multi-spec project with a deprecation warning). See **Input Parsing and Mode Detection** for the full classification and **Sequential Multi-Path Mode** for execution details.
|
|
16
17
|
2. Read `../shared/config.json` to determine the scaffolding mode (`scaffolding` key: `"local"`, `"github"`, `"jira"`, or `"trello"`, default: `"local"`). If `"local"`, also read the `paths.backlog` and `paths.context` values (`paths.context` defaults to `.claude-scrum-skill/context` and is where Step 3 subagents look for per-epic CONTEXT.md files). Read `../shared/references/PROVIDERS.md` for provider-specific API commands when using a remote provider.
|
|
@@ -381,94 +382,55 @@ After planning completes, update the state file with the sprint stories and thei
|
|
|
381
382
|
|
|
382
383
|
### Step 3: Story Execution
|
|
383
384
|
|
|
384
|
-
Execute all `executor:claude` stories in the current sprint. Skip `executor:human` and `executor:cowork` stories — they
|
|
385
|
+
Execute all `executor:claude` stories in the current sprint by invoking the **sprint_pipeline.js** workflow script. Skip `executor:human` and `executor:cowork` stories — they roll over to the next sprint automatically.
|
|
385
386
|
|
|
386
|
-
|
|
387
|
+
#### Path Resolution
|
|
387
388
|
|
|
388
|
-
|
|
389
|
+
The workflow script ships at `<skills-root>/_workflows/sprint_pipeline.js`, where `<skills-root>` is the parent directory of this SKILL.md's parent. For a SKILL.md at `~/.claude/skills/project-orchestrate/SKILL.md`, the workflow script absolute path is `~/.claude/skills/_workflows/sprint_pipeline.js`. The same algorithm works for global, local, and plugin install layouts.
|
|
389
390
|
|
|
390
|
-
|
|
391
|
+
#### Pre-spawn checks
|
|
391
392
|
|
|
392
|
-
|
|
393
|
-
**Local mode:** Read the `persona` field from the story file's frontmatter.
|
|
394
|
-
2. If found, load the matching preamble from `../shared/references/PERSONAS.md`.
|
|
395
|
-
3. If no persona exists, use the `impl` preamble.
|
|
396
|
-
4. If the persona references a name not defined in `PERSONAS.md`, fall back
|
|
397
|
-
to `impl` and log a warning.
|
|
393
|
+
Before invoking the workflow:
|
|
398
394
|
|
|
399
|
-
**
|
|
395
|
+
1. **Independence check.** Exclude stories whose `blocked_by` references unresolved blockers. Only pass ready stories to the workflow.
|
|
396
|
+
2. **Persona resolution.** For each story, resolve its persona (`impl`, `ops`, `research`) from labels (GitHub/Trello/Jira) or the `persona` frontmatter field (local mode). Default to `impl`. Build a `personaPreambles` map from the preambles in `../shared/references/PERSONAS.md` to pass to the workflow.
|
|
397
|
+
3. **Skip human/cowork stories.** Log them as skipped in the state file before invoking.
|
|
400
398
|
|
|
401
|
-
|
|
402
|
-
<persona preamble from PERSONAS.md>
|
|
399
|
+
#### Invocation
|
|
403
400
|
|
|
404
|
-
|
|
401
|
+
Invoke the Workflow tool with `scriptPath` set to the resolved absolute path and `args` set to:
|
|
405
402
|
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
binding for this epic — they override generic conventions in CLAUDE.md when
|
|
416
|
-
in conflict, and you should follow them even when CLAUDE.md is silent. The
|
|
417
|
-
`<paths.context>` and `<epic-slug>` values are substituted from the resolved
|
|
418
|
-
config and the story's epic at spawn time.
|
|
419
|
-
|
|
420
|
-
**Story:** <title>
|
|
421
|
-
**Acceptance criteria:** <from issue body or story file>
|
|
422
|
-
**Branch strategy:** Create branch `story/<number>-<slug>` from
|
|
423
|
-
`release/<epic-slug>`, implement, commit, push, and open a PR targeting
|
|
424
|
-
`release/<epic-slug>`.
|
|
425
|
-
|
|
426
|
-
After implementation:
|
|
427
|
-
|
|
428
|
-
GitHub mode:
|
|
429
|
-
1. Open a PR with a clear description of changes
|
|
430
|
-
2. Ensure CI passes
|
|
431
|
-
3. The PR should target the release branch, NOT development or main
|
|
432
|
-
4. Do NOT merge the PR — just open it and report back.
|
|
433
|
-
|
|
434
|
-
Local mode:
|
|
435
|
-
1. Commit all changes to the story branch
|
|
436
|
-
2. Merge the story branch into release/<epic-slug>
|
|
437
|
-
3. Push the release branch
|
|
438
|
-
4. Report back what was implemented.
|
|
403
|
+
```yaml
|
|
404
|
+
stories: <array of StorySchema-shaped story objects from the current sprint, filtered to executor:claude + ready>
|
|
405
|
+
epicSlug: <current epic slug>
|
|
406
|
+
releaseBranch: release/<epic-slug>
|
|
407
|
+
contextMdPath: <paths.context>/<epic-slug>/CONTEXT.md (or omit if no design-spike)
|
|
408
|
+
claudeMdPath: project CLAUDE.md absolute path (or omit if absent)
|
|
409
|
+
backendMode: local | github | jira | trello
|
|
410
|
+
repoIdentifier: <owner/repo> (github mode only)
|
|
411
|
+
personaPreambles: { impl: "...", ops: "...", research: "..." }
|
|
439
412
|
```
|
|
440
413
|
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
--jq '[.labels[].name | select(startswith("persona:"))] | first // empty' \
|
|
459
|
-
| sed 's/persona://')
|
|
460
|
-
persona=${persona:-impl}
|
|
461
|
-
```
|
|
462
|
-
- **Local mode:** Read the `persona` field from the story file's frontmatter. Default to `impl` if not set.
|
|
463
|
-
|
|
464
|
-
Load the corresponding preamble section from `../shared/references/PERSONAS.md`
|
|
465
|
-
and prepend it to the subagent prompt. Log the persona assignment in the
|
|
466
|
-
state file.
|
|
467
|
-
|
|
468
|
-
**Progress updates** — Print a concise progress line every 2-3 story completions:
|
|
414
|
+
Wait for the workflow to return. The return is `SprintStoryReturn[]` — one entry per completed (or blocked / failed) story per `lib/workflows/schemas/SprintStoryReturnSchema.json`.
|
|
415
|
+
|
|
416
|
+
#### Post-workflow persistence
|
|
417
|
+
|
|
418
|
+
For each entry in the workflow's return:
|
|
419
|
+
|
|
420
|
+
- `status: "done"` — Update the story file's frontmatter to `status: done`. Record `branch`, `prUrl` (github) or merge commit (local), and commit SHAs in the state file's "Current Sprint Stories" table.
|
|
421
|
+
- `status: "blocked"` — Record `blockers[]` and `reason` in the state file. Add the `blocked` label to the story (or mark blocked locally). Continue.
|
|
422
|
+
- `status: "failed"` — Same persistence as blocked, plus log the failure for sprint-release to roll over.
|
|
423
|
+
|
|
424
|
+
#### Concurrency and barriers
|
|
425
|
+
|
|
426
|
+
The workflow runs up to `min(16, cpu_cores - 2)` stories concurrently with no per-stage barriers — each story's pipeline is independent, so one slow review doesn't gate other stories' implementations. The barrier-removal benefit is unconditional; the concurrency lift is conditional on host cores (a 4-core host gets concurrency 2, an 8-core host gets 6, a 18+-core host gets the full 16). On all hosts this still beats v1.x's hardcoded 3 + barriers model on most sprint sizes.
|
|
427
|
+
|
|
428
|
+
#### Progress updates
|
|
429
|
+
|
|
430
|
+
The workflow surfaces structured progress via the Workflow tool's UI. Additionally, the executing agent SHOULD emit a concise summary line after the workflow returns:
|
|
469
431
|
|
|
470
432
|
```
|
|
471
|
-
Sprint 2: 5/8 stories done (13/19 pts) —
|
|
433
|
+
Sprint 2: 5/8 stories done (13/19 pts) — 2 blocked, 1 needs review
|
|
472
434
|
```
|
|
473
435
|
|
|
474
436
|
### Step 4: Sprint Release
|
|
@@ -906,16 +868,20 @@ Applies when Mode Classification selected sequential multi-path mode (2+ tokens,
|
|
|
906
868
|
|
|
907
869
|
### Per-Spec Loop
|
|
908
870
|
|
|
871
|
+
The per-spec loop is **executed by the skill markdown** (not a wrapping workflow), because the inner per-spec orchestration invokes individual workflows (`sprint_pipeline.js`, `elaborate_epics.js`, etc.) via the Workflow tool. The Workflow tool's nesting constraint ("one level of nesting only") prevents a multi-spec-queue workflow from invoking sub-workflows that themselves invoke workflows; the skill markdown is the right layer to orchestrate per-spec iteration.
|
|
872
|
+
|
|
909
873
|
For each spec in the topologically-sorted execution order:
|
|
910
874
|
|
|
911
|
-
1. Update the queue state file
|
|
912
|
-
2. Invoke the full single-spec orchestration against this spec
|
|
875
|
+
1. Update the queue state file: mark this spec's row as `in-progress`, record `Started` timestamp.
|
|
876
|
+
2. Invoke the full single-spec orchestration against this spec — re-enter Phase 1 (Epic Completion Loop, including scaffolding via `/project-scaffold`), Phase 2 (Emulation Hardening Loop), Phase 3 (Project Cleanup), Step 16 (ADR Update). Each of these phases internally invokes workflows (`sprint_pipeline.js`, `elaborate_epics.js`, `adversarial_verify.js`, `review_panel.js`) as documented in their respective sections. Step 17 (state file cleanup) is **suppressed** in multi-path mode; archive instead with the slug-suffixed naming below.
|
|
913
877
|
3. On the spec's natural completion: archive `.claude-scrum-skill/orchestration-state.md` to `.claude-scrum-skill/orchestration-state-<spec-slug>.previous.md` BEFORE the next spec begins. Update the queue state file: mark this spec's row as `completed`, record `Completed` timestamp, update aggregate stats.
|
|
914
878
|
4. On the spec's safety-gate pause:
|
|
915
|
-
- **Without `--skip-on-pause`** (default):
|
|
879
|
+
- **Without `--skip-on-pause`** (default): per-spec state file remains at `.claude-scrum-skill/orchestration-state.md` with `Status: paused`. Update the queue state file: mark this spec's row as `paused`, set queue `Status: paused`. Exit. Remaining specs are NOT started. User resolves the gate and re-invokes; queue resumes from the paused spec.
|
|
916
880
|
- **With `--skip-on-pause`**: archive `.claude-scrum-skill/orchestration-state.md` to `.claude-scrum-skill/orchestration-state-<spec-slug>.skipped.md`. Update the queue state file: mark this spec's row as `skipped`, record the pause reason. Continue to the next spec.
|
|
917
881
|
5. Per-spec orchestration runs to completion (or pause) before the next spec begins — no interleaving of sprints, no concurrent execution.
|
|
918
882
|
|
|
883
|
+
After all specs are processed, emit the Cumulative Summary per the subsection below.
|
|
884
|
+
|
|
919
885
|
### Spec Slug Derivation
|
|
920
886
|
|
|
921
887
|
A spec's slug is derived from its filename: `basename(path, ".md")`.
|
|
@@ -173,29 +173,27 @@ After Pass 1 completes, evaluate the epic count:
|
|
|
173
173
|
|
|
174
174
|
### Pass 2 — Per-Epic Elaboration
|
|
175
175
|
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
`/project-orchestrate` Step 3 convention). Additional epics queue and
|
|
198
|
-
start as earlier ones complete.
|
|
176
|
+
Pass 2 is performed by the **elaborate_epics.js** workflow script. Replaces the v1.x Task-based fan-out (concurrency cap of 3) with one parallel wave (concurrency 16) and schema-validated returns.
|
|
177
|
+
|
|
178
|
+
#### Path Resolution
|
|
179
|
+
|
|
180
|
+
Workflow script ships at `<skills-root>/_workflows/elaborate_epics.js`, where `<skills-root>` is the parent of this SKILL.md's parent directory. For `~/.claude/skills/project-scaffold/SKILL.md`, the absolute workflow path is `~/.claude/skills/_workflows/elaborate_epics.js`.
|
|
181
|
+
|
|
182
|
+
#### Invocation
|
|
183
|
+
|
|
184
|
+
Invoke the Workflow tool with `scriptPath` set to the resolved path and `args`:
|
|
185
|
+
|
|
186
|
+
```yaml
|
|
187
|
+
skeleton: { project: { name, description, global_preamble, non_functional_requirements }, epics: [...] } # the Pass 1 manifest
|
|
188
|
+
prdPath: <absolute path to the PRD>
|
|
189
|
+
conventionsPath: ../shared/references/CONVENTIONS.md # optional but recommended
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
The workflow returns `Epic[]` per `lib/workflows/schemas/EpicSchema.json`, each with `stories[]` populated. Failed epics return `null` in the array.
|
|
193
|
+
|
|
194
|
+
#### Per-epic context (encoded by the workflow)
|
|
195
|
+
|
|
196
|
+
Each `elaborate:<epic-slug>` agent receives the global preamble, its epic's PRD slice (using `slice.start_line` / `slice.end_line` from the manifest), and a sibling-epic skeleton summary for cross-epic dependency awareness. The output story shape matches `lib/workflows/schemas/StorySchema.json`: title, slug, acceptance_criteria, technical_context, points (Fibonacci), executor, persona, priority, blocked_by, blocks, labels.
|
|
199
197
|
|
|
200
198
|
### Story Assembly
|
|
201
199
|
|
|
@@ -47,6 +47,35 @@ default: `.claude-scrum-skill/specs`).
|
|
|
47
47
|
|
|
48
48
|
Save the output spec to `<specs-path>/YYYYMMDD_hhmmss_{name}.md` where the timestamp is in YYYYMMDD*hhmmss format in **US Pacific Time (PST/PDT)** and `{name}` is a snake_case name that succinctly describes the feature or project. To get the current Pacific time, run `TZ='America/Los_Angeles' date '+%Y%m%d*%H%M%S'` via the Bash tool.
|
|
49
49
|
|
|
50
|
+
### Schema-Validated Sibling Output (v2.0.0+)
|
|
51
|
+
|
|
52
|
+
In addition to the markdown spec document, write a sibling JSON file at `<specs-path>/YYYYMMDD_hhmmss_{name}.spec.json` conforming to `SpecSchema` (`<skills-root>/_workflows/schemas/SpecSchema.json`). Required fields:
|
|
53
|
+
|
|
54
|
+
```json
|
|
55
|
+
{
|
|
56
|
+
"title": "<spec title>",
|
|
57
|
+
"overview": "<one-paragraph overview>",
|
|
58
|
+
"objectives": {
|
|
59
|
+
"primary": ["..."],
|
|
60
|
+
"secondary": ["..."]
|
|
61
|
+
},
|
|
62
|
+
"epics": [
|
|
63
|
+
{
|
|
64
|
+
"name": "<epic name>",
|
|
65
|
+
"slug": "<kebab-case>",
|
|
66
|
+
"description": "<one-paragraph>",
|
|
67
|
+
"depends_on": [],
|
|
68
|
+
"shared_design_concerns": [],
|
|
69
|
+
"slice": { "start_line": 0, "end_line": 0 }
|
|
70
|
+
}
|
|
71
|
+
],
|
|
72
|
+
"dependencies": ["..."],
|
|
73
|
+
"design_concerns": ["..."]
|
|
74
|
+
}
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
The JSON sibling lets downstream skills (`/project-scaffold` especially) consume the spec via schema-validated direct access rather than re-parsing the markdown. Both files MUST be produced; the markdown remains the human-readable canonical document.
|
|
78
|
+
|
|
50
79
|
## Guidelines for Success
|
|
51
80
|
|
|
52
81
|
1. **Be Specific**: Avoid vague requirements; provide concrete details.
|