@pavp/storywright 1.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/.claude-plugin/plugin.json +25 -0
- package/LICENSE +21 -0
- package/README.md +108 -0
- package/bin/storywright.mjs +41 -0
- package/package.json +62 -0
- package/scripts/install-skills.mjs +23 -0
- package/scripts/lib/skills.mjs +94 -0
- package/scripts/list-skills.mjs +38 -0
- package/scripts/postinstall-hint.mjs +12 -0
- package/scripts/uninstall-skills.mjs +21 -0
- package/scripts/validate-skills.mjs +82 -0
- package/scripts/zip-skill.mjs +40 -0
- package/skills/_components/acceptance-criteria/SKILL.md +99 -0
- package/skills/_components/analytics-events/SKILL.md +90 -0
- package/skills/_components/business-rules/SKILL.md +77 -0
- package/skills/_components/clarification-questions/SKILL.md +79 -0
- package/skills/_components/definition-of-done/SKILL.md +76 -0
- package/skills/_components/edge-cases/SKILL.md +74 -0
- package/skills/_components/invest-checklist/SKILL.md +111 -0
- package/skills/_components/jira-wiki-formatter/SKILL.md +129 -0
- package/skills/_components/risks-and-dependencies/SKILL.md +87 -0
- package/skills/story-from-figma/SKILL.md +117 -0
- package/skills/story-from-figma/mcp-figma-notes.md +54 -0
- package/skills/story-generate/SKILL.md +144 -0
- package/skills/story-generate/templates/story.jira-wiki.md +54 -0
- package/skills/story-generate/templates/story.standard.md +59 -0
- package/skills/story-refine/SKILL.md +102 -0
- package/skills/story-split/SKILL.md +184 -0
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: story-split
|
|
3
|
+
description: Detect when a story is too big to ship in one sprint and propose an INVEST-driven split into an epic with sub-stories. Never auto-splits — always proposes, then waits for user confirmation.
|
|
4
|
+
trigger: "split this story | divide this story | dividir historia | this is too big"
|
|
5
|
+
intent: Splitting skill that uses the INVEST failure reasons (from invest-checklist) as the rationale for decomposition. Produces an epic skeleton plus N child story stubs, ready to feed back into story-generate.
|
|
6
|
+
version: 1.0.0
|
|
7
|
+
inputs:
|
|
8
|
+
- text
|
|
9
|
+
outputs:
|
|
10
|
+
- split-plan.md
|
|
11
|
+
- epic.md
|
|
12
|
+
- story-1.md, story-2.md, ... (N child stubs)
|
|
13
|
+
composes:
|
|
14
|
+
- _components/invest-checklist
|
|
15
|
+
- _components/clarification-questions
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## Purpose
|
|
19
|
+
|
|
20
|
+
When a story is an epic in disguise, splitting badly is worse than not splitting. This skill uses **established INVEST-compatible patterns** (workflow steps, business rules, user roles, data variations, happy/sad paths, simple/complex) to propose a clean decomposition. The user always approves the plan before any child stories are written.
|
|
21
|
+
|
|
22
|
+
## When to use
|
|
23
|
+
|
|
24
|
+
- `[[invest-checklist]]` returned `SPLIT RECOMMENDED` (failures on I, E, or S).
|
|
25
|
+
- User explicitly asks: "this story is too big, split it".
|
|
26
|
+
- Input visibly mixes ≥2 flows.
|
|
27
|
+
|
|
28
|
+
## Inputs & interpretation
|
|
29
|
+
|
|
30
|
+
- **text** — the oversize story (or a one-line goal that's clearly epic-scoped).
|
|
31
|
+
|
|
32
|
+
## Application (step-by-step)
|
|
33
|
+
|
|
34
|
+
### Pre-split gate — STOP conditions
|
|
35
|
+
|
|
36
|
+
Before splitting anything, run `[[invest-checklist]]` and apply these gates:
|
|
37
|
+
|
|
38
|
+
- **Valuable FAILS** → **STOP. Do not split.** A non-valuable item is a technical task, not a story. Combine it with related user-facing work; don't decompose it.
|
|
39
|
+
- **Testable FAILS** → **fix in place** via `[[story-refine]]` first. Splitting an untestable story produces untestable children.
|
|
40
|
+
- **Negotiable FAILS** → fix in place; the story is over-prescriptive, not too big.
|
|
41
|
+
- **Estimable FAILS due to unknowns** → run a **spike** (Pattern 9 below), not a split.
|
|
42
|
+
- **Independent / Estimable / Small FAIL** → continue to pattern selection.
|
|
43
|
+
|
|
44
|
+
### Pattern catalog (apply in order; stop at first that fits)
|
|
45
|
+
|
|
46
|
+
Based on the Humanizing Work splitting methodology (Richard Lawrence & Peter Green).
|
|
47
|
+
|
|
48
|
+
1. **Workflow steps — thin end-to-end slices.**
|
|
49
|
+
**Critical:** this is NOT "step 1 / step 2 / step 3" of the journey. Each child must deliver the **full** workflow with increasing sophistication.
|
|
50
|
+
- ❌ Wrong: Story 1 = editorial review, Story 2 = legal approval, Story 3 = publish. (Story 1 alone delivers nothing observable to the user.)
|
|
51
|
+
- ✅ Right: Story 1 = publish post immediately, no reviews. Story 2 = add editorial review step. Story 3 = add legal step. Each story produces visible behavior.
|
|
52
|
+
|
|
53
|
+
2. **CRUD operations.** When the input says "manage" / "handle" / "maintain", it bundles operations. Split into Create / Read / Update / Delete.
|
|
54
|
+
|
|
55
|
+
3. **Business rule variations.** Same feature, different rules → one story per rule (members / VIP / first-time discounts).
|
|
56
|
+
|
|
57
|
+
4. **Data type variations.** One story per data shape (counties / cities / custom areas; or jpg / pdf / mp4). Deliver simplest first.
|
|
58
|
+
|
|
59
|
+
5. **Data entry / UI complexity.** Basic input first (`YYYY-MM-DD` text); fancy UI (calendar picker, autocomplete, drag-drop) as follow-ups.
|
|
60
|
+
|
|
61
|
+
6. **Major effort.** First implementation does the heavy infrastructure lift; subsequent stories are trivial additions (build Visa payments + infra in story 1; add Mastercard/Amex in story 2).
|
|
62
|
+
|
|
63
|
+
7. **Simple / complex.** Strip variations from the core. Story 1 = simplest case that still delivers value; stories 2..N = each variation.
|
|
64
|
+
|
|
65
|
+
8. **Defer performance.** "Make it work" before "make it fast". Story 1 = functional, no SLA. Story 2 = optimize to <100ms / add caching / scale.
|
|
66
|
+
|
|
67
|
+
9. **Spike (last resort).** None of 1–8 apply because the unknown blocks decomposition. Run a 1–2 day time-boxed investigation answering a specific question ("is this feasible on our stack?", "what does the third-party API actually return?"). A spike is **not a story** — it produces learning, not shippable code. After the spike, restart at pattern 1.
|
|
68
|
+
|
|
69
|
+
**Anti-patterns (these are NOT splits):**
|
|
70
|
+
- Horizontal slicing (frontend story + backend story) — neither child has user value.
|
|
71
|
+
- Task decomposition ("set up DB" / "write endpoint" / "build form").
|
|
72
|
+
- Meaningless halves ("first half of feature" / "second half").
|
|
73
|
+
|
|
74
|
+
### Cynefin domain calibration
|
|
75
|
+
|
|
76
|
+
Adjust the splitting strategy to uncertainty:
|
|
77
|
+
|
|
78
|
+
- **Obvious / Complicated** — known problem, just engineering. Enumerate all children, prioritize by value/risk.
|
|
79
|
+
- **Complex** — unclear what users want or what will work. Don't enumerate exhaustively; produce **1–2 learning stories** that ship something observable, then let real usage teach what to write next.
|
|
80
|
+
- **Chaotic** — priorities shifting daily, fires burning. **Defer splitting** until stability returns. Stabilize first.
|
|
81
|
+
|
|
82
|
+
### Meta-pattern (applies across every pattern)
|
|
83
|
+
|
|
84
|
+
For any pattern you pick:
|
|
85
|
+
1. Name the **core complexity** that makes the story big.
|
|
86
|
+
2. List **all variations** of that complexity.
|
|
87
|
+
3. Pick **one variation** as the simplest complete vertical slice.
|
|
88
|
+
4. Each other variation becomes its own story.
|
|
89
|
+
|
|
90
|
+
### Procedure
|
|
91
|
+
|
|
92
|
+
1. Run `[[invest-checklist]]` and apply the pre-split gates above. If you should not split, say so explicitly and stop.
|
|
93
|
+
2. Apply the pattern catalog in order. Name the first pattern that fits and the meta-pattern's "core complexity".
|
|
94
|
+
3. **Draft a split plan** as a Markdown table:
|
|
95
|
+
```
|
|
96
|
+
### Split Plan
|
|
97
|
+
|
|
98
|
+
**Rationale (from INVEST failure):**
|
|
99
|
+
- S — FAIL: covers web + mobile + account-linking
|
|
100
|
+
- E — FAIL: account-linking edge cases not scoped
|
|
101
|
+
|
|
102
|
+
**Core complexity (meta-pattern):** authenticating new users + reconciling them with pre-existing accounts.
|
|
103
|
+
**Pattern(s) applied:** Workflow steps (thin end-to-end) + Simple→Complex
|
|
104
|
+
**Cynefin domain:** Complicated (known problem, just engineering)
|
|
105
|
+
|
|
106
|
+
| # | Proposed child story | Pattern | INVEST hint |
|
|
107
|
+
|---|---|---|---|
|
|
108
|
+
| 1 | Login Google — simplest path (new account, web) | Workflow / Simple | Smallest complete vertical slice |
|
|
109
|
+
| 2 | Login Google — mobile | Data variation (surface) | Small, depends on #1 |
|
|
110
|
+
| 3 | Account linking — Google ↔ existing email/password | Major effort | Independent flow |
|
|
111
|
+
| 4 | Workspace domain restriction | Business rule variation | Independent |
|
|
112
|
+
|
|
113
|
+
**Proposed epic title:** Login con Google (multi-surface + linking)
|
|
114
|
+
```
|
|
115
|
+
4. **Split evaluation (strategic check before approval).** Ask:
|
|
116
|
+
- **Does the split reveal low-value work we can deprioritize or kill?** Good splits surface 80/20 — e.g., after splitting flight search, "flexible dates" turns out to be rarely used → drop it.
|
|
117
|
+
- **Are the children roughly equal in size?** Equal-sized children give PMs prioritization flexibility mid-sprint.
|
|
118
|
+
If neither holds, try a different pattern.
|
|
119
|
+
5. **STOP and ask the user to approve the plan.** Options:
|
|
120
|
+
- "Approve plan" → proceed to step 6
|
|
121
|
+
- "Adjust" → user edits the table or merges/splits rows
|
|
122
|
+
- "Cancel" → leave the story unsplit (mark it as `NEEDS REFINEMENT` for the team to negotiate)
|
|
123
|
+
6. **After approval:**
|
|
124
|
+
- Write `epic.md` — title, description, child story list, business goal, dependencies between children
|
|
125
|
+
- Write one stub per child: title + 1-line user story + open clarifications. **Do not run the full story-generate flow yet** — stubs are placeholders; user invokes `[[story-generate]]` per child when ready.
|
|
126
|
+
7. **Coherence check** — verify the children together cover the original scope. If any child overlaps another or the union has gaps, flag it before saving.
|
|
127
|
+
8. **Recursive re-split check.** For each child, ask: still >1 sprint? If yes, restart at the pattern catalog **for that child**. Keep splitting until every leaf is sprint-shippable. Surface the tree visually in the plan.
|
|
128
|
+
9. **Save all artifacts** under `./stories/<epic-slug>/`:
|
|
129
|
+
- `epic.md`
|
|
130
|
+
- `story-1.md`, `story-2.md`, …
|
|
131
|
+
- `split-plan.md` (the decision trail)
|
|
132
|
+
|
|
133
|
+
## Examples
|
|
134
|
+
|
|
135
|
+
### Good
|
|
136
|
+
|
|
137
|
+
Original: "Permitir login con Google" with INVEST failing on Small + Estimable.
|
|
138
|
+
|
|
139
|
+
Split:
|
|
140
|
+
1. Web — new accounts only (Simple)
|
|
141
|
+
2. Mobile — new accounts only (Simple)
|
|
142
|
+
3. Account linking with existing email/password (Complex, depends on #1)
|
|
143
|
+
4. Workspace domain restriction (Independent rule)
|
|
144
|
+
|
|
145
|
+
Each child is shippable in one sprint, each has clear value, each is testable.
|
|
146
|
+
|
|
147
|
+
### Bad
|
|
148
|
+
|
|
149
|
+
Splitting "Permitir login con Google" into "Backend auth endpoint" and "Frontend login button" — that's a **task split**, not a story split. Both halves have no user value alone.
|
|
150
|
+
|
|
151
|
+
## Validate every child (must pass all 5)
|
|
152
|
+
|
|
153
|
+
1. **Delivers user value** independently? (not just "frontend done")
|
|
154
|
+
2. **Developable in isolation** with no hard ordering dependency?
|
|
155
|
+
3. **Testable** with concrete ACs?
|
|
156
|
+
4. **Sprintable** (1–5 days of work, single sprint)?
|
|
157
|
+
5. **Union equals original** — together do they cover the original scope?
|
|
158
|
+
|
|
159
|
+
A "no" on any line means revise the split.
|
|
160
|
+
|
|
161
|
+
## Common Pitfalls
|
|
162
|
+
|
|
163
|
+
- **Skipping the pre-split INVEST gate.** Splitting a non-Valuable item produces non-Valuable children. Splitting an untestable item produces untestable children. Fix first, split second.
|
|
164
|
+
- **Workflow done step-by-step instead of thin end-to-end.** Story 1 = "review" / Story 2 = "approve" / Story 3 = "publish" means Story 1 alone is invisible to the user. Each child must deliver visible behavior.
|
|
165
|
+
- **Horizontal slicing** (frontend / backend / DB). Each child must have user value.
|
|
166
|
+
- **Task splits** ("set up DB", "wire API to button"). Tasks aren't stories.
|
|
167
|
+
- **Splitting on size alone**, without naming the core complexity or pattern.
|
|
168
|
+
- **Forcing a pattern that doesn't fit.** If pattern N doesn't apply, say no and move on; never bend.
|
|
169
|
+
- **Auto-splitting without user approval.**
|
|
170
|
+
- **Forgetting the coherence check** — losing scope in the split.
|
|
171
|
+
- **Skipping the strategic evaluation** (low-value reveal, equal sizing).
|
|
172
|
+
- **Letting the tree go >5 children** — that's an initiative, not an epic.
|
|
173
|
+
- **Splitting in chaos.** Stabilize first; splitting amid shifting priorities just multiplies churn.
|
|
174
|
+
|
|
175
|
+
## References
|
|
176
|
+
|
|
177
|
+
- [[invest-checklist]]
|
|
178
|
+
- [[story-generate]]
|
|
179
|
+
- [[clarification-questions]]
|
|
180
|
+
|
|
181
|
+
<claude-specific>
|
|
182
|
+
- Use extended thinking — pattern selection benefits from explicit comparison of options.
|
|
183
|
+
- Cache the 8-pattern catalog.
|
|
184
|
+
</claude-specific>
|