skilldrop-cli 0.2.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/LICENSE +21 -0
- package/README.md +413 -0
- package/bin/skilldrop.js +338 -0
- package/model-routing.json +147 -0
- package/package.json +36 -0
- package/packs.json +90 -0
- package/skills/accessibility-audit/SKILL.md +74 -0
- package/skills/accessibility-audit/examples/login-form.md +76 -0
- package/skills/accessibility-audit/manifest.json +11 -0
- package/skills/accessibility-audit/reference.md +69 -0
- package/skills/adr-generator/SKILL.md +49 -0
- package/skills/adr-generator/manifest.json +11 -0
- package/skills/adr-generator/templates/madr.md +56 -0
- package/skills/adr-generator/templates/nygard.md +19 -0
- package/skills/ai-usage-report/SKILL.md +111 -0
- package/skills/ai-usage-report/examples/weekly-engineering-team.md +133 -0
- package/skills/ai-usage-report/manifest.json +11 -0
- package/skills/ai-usage-report/scripts/build_report.py +436 -0
- package/skills/ai-usage-report/templates/report-per-user.md +42 -0
- package/skills/ai-usage-report/templates/report-team-rollup.md +49 -0
- package/skills/ai-usage-report/templates/usage-event-schema.md +76 -0
- package/skills/api-contract-draft/SKILL.md +69 -0
- package/skills/api-contract-draft/manifest.json +11 -0
- package/skills/api-contract-draft/reference.md +73 -0
- package/skills/api-contract-draft/templates/openapi-skeleton.yaml +148 -0
- package/skills/architecture-diagrams/SKILL.md +66 -0
- package/skills/architecture-diagrams/examples/aws-three-tier.md +44 -0
- package/skills/architecture-diagrams/examples/c4-container-saas.md +51 -0
- package/skills/architecture-diagrams/examples/microservices-sequence.md +49 -0
- package/skills/architecture-diagrams/manifest.json +28 -0
- package/skills/architecture-diagrams/templates/c4-container.puml +31 -0
- package/skills/architecture-diagrams/templates/mermaid-aws.md +52 -0
- package/skills/architecture-diagrams/templates/mermaid-flowchart.md +37 -0
- package/skills/architecture-diagrams/templates/mermaid-sequence.md +39 -0
- package/skills/audience-profile/SKILL.md +73 -0
- package/skills/audience-profile/manifest.json +11 -0
- package/skills/audience-profile/reference.md +175 -0
- package/skills/brief-intake/SKILL.md +78 -0
- package/skills/brief-intake/manifest.json +11 -0
- package/skills/brief-intake/templates/brief-adr.md +41 -0
- package/skills/brief-intake/templates/brief-decision-log.md +35 -0
- package/skills/brief-intake/templates/brief-deck.md +43 -0
- package/skills/brief-intake/templates/brief-design-doc.md +48 -0
- package/skills/brief-intake/templates/brief-exec-summary.md +47 -0
- package/skills/brief-intake/templates/brief-generic.md +45 -0
- package/skills/brief-intake/templates/brief-runbook.md +44 -0
- package/skills/brief-intake/templates/brief-tech-comparison.md +38 -0
- package/skills/bug-triage/SKILL.md +67 -0
- package/skills/bug-triage/manifest.json +11 -0
- package/skills/bug-triage/templates/bug-ticket.md +86 -0
- package/skills/business-case/SKILL.md +64 -0
- package/skills/business-case/manifest.json +11 -0
- package/skills/business-case/templates/business-case.md +60 -0
- package/skills/capacity-cost-model/SKILL.md +64 -0
- package/skills/capacity-cost-model/manifest.json +11 -0
- package/skills/capacity-cost-model/reference.md +54 -0
- package/skills/capacity-cost-model/templates/cost-model.md +68 -0
- package/skills/council-review/SKILL.md +106 -0
- package/skills/council-review/examples/redis-cache-decision.md +75 -0
- package/skills/council-review/manifest.json +11 -0
- package/skills/council-review/reference.md +76 -0
- package/skills/council-review/seats/architect.md +29 -0
- package/skills/council-review/seats/bench.md +39 -0
- package/skills/council-review/seats/operator.md +27 -0
- package/skills/council-review/seats/pragmatist.md +29 -0
- package/skills/council-review/seats/security-engineer.md +29 -0
- package/skills/council-review/seats/user-advocate.md +27 -0
- package/skills/council-review/templates/council-review.md +59 -0
- package/skills/data-contract/SKILL.md +67 -0
- package/skills/data-contract/manifest.json +11 -0
- package/skills/data-contract/reference.md +46 -0
- package/skills/data-contract/templates/data-contract.md +69 -0
- package/skills/db-schema-design/SKILL.md +68 -0
- package/skills/db-schema-design/manifest.json +11 -0
- package/skills/db-schema-design/reference.md +56 -0
- package/skills/db-schema-design/templates/schema-design.md +75 -0
- package/skills/decision-log/SKILL.md +67 -0
- package/skills/decision-log/manifest.json +11 -0
- package/skills/deck-builder/SKILL.md +114 -0
- package/skills/deck-builder/examples/exec-board-update.md +108 -0
- package/skills/deck-builder/manifest.json +17 -0
- package/skills/deck-builder/reference.md +92 -0
- package/skills/deck-builder/requirements.txt +1 -0
- package/skills/deck-builder/scripts/build_deck.py +309 -0
- package/skills/deck-builder/templates/deck-spec.json +97 -0
- package/skills/deck-builder/templates/palettes.json +59 -0
- package/skills/design-doc/SKILL.md +49 -0
- package/skills/design-doc/manifest.json +11 -0
- package/skills/design-doc/templates/design-doc.md +98 -0
- package/skills/devils-advocate/SKILL.md +142 -0
- package/skills/devils-advocate/lenses/adversarial-review.md +88 -0
- package/skills/devils-advocate/lenses/edge-cases.md +95 -0
- package/skills/devils-advocate/lenses/future-proofing.md +75 -0
- package/skills/devils-advocate/lenses/test-coverage.md +90 -0
- package/skills/devils-advocate/manifest.json +11 -0
- package/skills/devils-advocate/templates/challenge.md +118 -0
- package/skills/doc-critique/SKILL.md +119 -0
- package/skills/doc-critique/manifest.json +11 -0
- package/skills/doc-critique/rubrics/adr.md +36 -0
- package/skills/doc-critique/rubrics/decision-log.md +39 -0
- package/skills/doc-critique/rubrics/deck.md +45 -0
- package/skills/doc-critique/rubrics/design-doc.md +42 -0
- package/skills/doc-critique/rubrics/exec-summary.md +41 -0
- package/skills/doc-critique/rubrics/generic.md +40 -0
- package/skills/doc-critique/rubrics/runbook.md +42 -0
- package/skills/doc-critique/rubrics/tech-comparison.md +40 -0
- package/skills/doc-critique/templates/critique.md +49 -0
- package/skills/exec-summary/SKILL.md +45 -0
- package/skills/exec-summary/manifest.json +11 -0
- package/skills/exec-summary/templates/exec-summary.md +48 -0
- package/skills/feature-implement-loop/SKILL.md +83 -0
- package/skills/feature-implement-loop/manifest.json +11 -0
- package/skills/figma-diagrams/SKILL.md +85 -0
- package/skills/figma-diagrams/manifest.json +35 -0
- package/skills/figma-diagrams/reference.md +91 -0
- package/skills/figma-diagrams/requirements.txt +1 -0
- package/skills/figma-diagrams/scripts/_figma_client.py +71 -0
- package/skills/figma-diagrams/scripts/frame_to_mermaid.py +102 -0
- package/skills/figma-diagrams/scripts/inspect_file.py +46 -0
- package/skills/figma-diagrams/scripts/list_comments.py +35 -0
- package/skills/figma-diagrams/scripts/post_comment.py +52 -0
- package/skills/figma-diagrams/templates/figjam-import.json +20 -0
- package/skills/guide-builder/SKILL.md +76 -0
- package/skills/guide-builder/examples/local-setup-guide.md +127 -0
- package/skills/guide-builder/manifest.json +11 -0
- package/skills/guide-builder/templates/api-reference.md +120 -0
- package/skills/guide-builder/templates/design-walkthrough.md +72 -0
- package/skills/guide-builder/templates/setup-guide.md +109 -0
- package/skills/incident-comms/SKILL.md +68 -0
- package/skills/incident-comms/manifest.json +11 -0
- package/skills/incident-comms/reference.md +43 -0
- package/skills/incident-comms/templates/messages.md +82 -0
- package/skills/llm-eval-harness/SKILL.md +73 -0
- package/skills/llm-eval-harness/manifest.json +11 -0
- package/skills/llm-eval-harness/reference.md +58 -0
- package/skills/llm-eval-harness/templates/eval-plan.md +63 -0
- package/skills/llm-eval-harness/templates/golden-case.jsonl +5 -0
- package/skills/migration-plan/SKILL.md +68 -0
- package/skills/migration-plan/manifest.json +11 -0
- package/skills/migration-plan/templates/migration-plan.md +68 -0
- package/skills/nfr-spec/SKILL.md +63 -0
- package/skills/nfr-spec/manifest.json +11 -0
- package/skills/nfr-spec/reference.md +74 -0
- package/skills/nfr-spec/templates/nfr-spec.md +56 -0
- package/skills/observability-plan/SKILL.md +70 -0
- package/skills/observability-plan/manifest.json +11 -0
- package/skills/observability-plan/reference.md +67 -0
- package/skills/observability-plan/templates/observability-plan.md +62 -0
- package/skills/okr-cascade/SKILL.md +59 -0
- package/skills/okr-cascade/evals/eval_queries.json +12 -0
- package/skills/okr-cascade/evals/evals.json +28 -0
- package/skills/okr-cascade/manifest.json +11 -0
- package/skills/okr-cascade/templates/okr-cascade.md +46 -0
- package/skills/postmortem-generator/SKILL.md +65 -0
- package/skills/postmortem-generator/manifest.json +11 -0
- package/skills/postmortem-generator/templates/postmortem.md +67 -0
- package/skills/prd-draft/SKILL.md +62 -0
- package/skills/prd-draft/manifest.json +11 -0
- package/skills/prd-draft/templates/prd.md +66 -0
- package/skills/prfaq/SKILL.md +75 -0
- package/skills/prfaq/evals/eval_queries.json +13 -0
- package/skills/prfaq/evals/evals.json +32 -0
- package/skills/prfaq/manifest.json +11 -0
- package/skills/prfaq/templates/prfaq.md +60 -0
- package/skills/release-notes/SKILL.md +61 -0
- package/skills/release-notes/manifest.json +11 -0
- package/skills/release-notes/templates/release-notes.md +83 -0
- package/skills/requirements-interview/SKILL.md +61 -0
- package/skills/requirements-interview/manifest.json +11 -0
- package/skills/requirements-interview/templates/interview-kit.md +63 -0
- package/skills/reverse-architecture/SKILL.md +103 -0
- package/skills/reverse-architecture/manifest.json +11 -0
- package/skills/reverse-architecture/reference.md +150 -0
- package/skills/reverse-architecture/templates/description.md +52 -0
- package/skills/reverse-architecture/templates/extraction.md +55 -0
- package/skills/runbook-generator/SKILL.md +42 -0
- package/skills/runbook-generator/manifest.json +11 -0
- package/skills/runbook-generator/templates/runbook.md +109 -0
- package/skills/slide-outliner/SKILL.md +58 -0
- package/skills/slide-outliner/manifest.json +11 -0
- package/skills/slide-outliner/templates/deck-outline.md +131 -0
- package/skills/sonar-onboard/SKILL.md +170 -0
- package/skills/sonar-onboard/manifest.json +11 -0
- package/skills/sonar-onboard/reference.md +151 -0
- package/skills/sonar-onboard/templates/github-actions-sonar-server.yml.tmpl +50 -0
- package/skills/sonar-onboard/templates/github-actions-sonarcloud.yml.tmpl +53 -0
- package/skills/sonar-onboard/templates/readme-snippet.md +38 -0
- package/skills/sonar-onboard/templates/sonar-project.properties.tmpl +31 -0
- package/skills/sonar-review/SKILL.md +220 -0
- package/skills/sonar-review/lenses/bugs.md +48 -0
- package/skills/sonar-review/lenses/code-smells.md +64 -0
- package/skills/sonar-review/lenses/coverage-and-duplication.md +74 -0
- package/skills/sonar-review/lenses/security-hotspots.md +56 -0
- package/skills/sonar-review/lenses/vulnerabilities.md +52 -0
- package/skills/sonar-review/manifest.json +37 -0
- package/skills/sonar-review/reference.md +167 -0
- package/skills/sonar-review/templates/report.md +84 -0
- package/skills/strategy-analysis/SKILL.md +63 -0
- package/skills/strategy-analysis/evals/eval_queries.json +13 -0
- package/skills/strategy-analysis/evals/evals.json +36 -0
- package/skills/strategy-analysis/manifest.json +11 -0
- package/skills/success-metrics/SKILL.md +63 -0
- package/skills/success-metrics/evals/eval_queries.json +11 -0
- package/skills/success-metrics/evals/evals.json +27 -0
- package/skills/success-metrics/manifest.json +11 -0
- package/skills/success-metrics/templates/metrics-plan.md +55 -0
- package/skills/tech-comparison-matrix/SKILL.md +56 -0
- package/skills/tech-comparison-matrix/manifest.json +11 -0
- package/skills/tech-comparison-matrix/templates/matrix.md +45 -0
- package/skills/test-plan-generator/SKILL.md +59 -0
- package/skills/test-plan-generator/manifest.json +11 -0
- package/skills/test-plan-generator/templates/test-plan.md +83 -0
- package/skills/threat-model/SKILL.md +65 -0
- package/skills/threat-model/examples/document-upload.md +56 -0
- package/skills/threat-model/manifest.json +11 -0
- package/skills/threat-model/reference.md +69 -0
- package/skills/user-journey-map/SKILL.md +64 -0
- package/skills/user-journey-map/evals/eval_queries.json +12 -0
- package/skills/user-journey-map/evals/evals.json +30 -0
- package/skills/user-journey-map/examples/b2b-saas-onboarding.md +69 -0
- package/skills/user-journey-map/manifest.json +11 -0
- package/skills/user-journey-map/templates/journey-map.md +47 -0
- package/skills/user-story-splitter/SKILL.md +88 -0
- package/skills/user-story-splitter/examples/notifications-epic.md +123 -0
- package/skills/user-story-splitter/manifest.json +11 -0
- package/skills/user-story-splitter/templates/story.md +40 -0
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
{
|
|
2
|
+
"skill_name": "user-journey-map",
|
|
3
|
+
"evals": [
|
|
4
|
+
{
|
|
5
|
+
"id": 1,
|
|
6
|
+
"prompt": "Map the customer journey for freelance designers trying our invoicing app. We believe they drop off between signup and sending their first invoice. No research data yet — this is the team's hypothesis.",
|
|
7
|
+
"assertions": [
|
|
8
|
+
"One specific persona and one outcome are named in the map's title",
|
|
9
|
+
"Evidence level is declared as assumption-based at the top and framed as a hypothesis that directs research",
|
|
10
|
+
"The start trigger is an event in the persona's life (e.g. a client asks for an invoice), not 'visits the landing page'",
|
|
11
|
+
"3-6 stages, each a phase of the persona's goal — not one stage per screen",
|
|
12
|
+
"Every stage has all four rows: actions (persona's words, frontstage only), emotion score 1-5 with a reason, pains, opportunities",
|
|
13
|
+
"Opportunities are outcome-shaped, not feature suggestions like 'add a button'",
|
|
14
|
+
"The steepest dips, the highest peak, and the ending emotion are explicitly marked",
|
|
15
|
+
"A Mermaid journey diagram is emitted with valid syntax: one section per stage, actions scored 1-5",
|
|
16
|
+
"Opportunities are ranked and exactly 1-2 are named as targets; the rest are explicitly deprioritized with reasons",
|
|
17
|
+
"Hand-offs route committed work to prd-draft/user-story-splitter and measurement to success-metrics"
|
|
18
|
+
]
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
"id": 2,
|
|
22
|
+
"prompt": "[Non-interactive run — no user available to answer questions] Map the journey.",
|
|
23
|
+
"assertions": [
|
|
24
|
+
"No journey is drafted — with no persona or outcome derivable, the output is BLOCKED: need persona + outcome",
|
|
25
|
+
"The BLOCKED output names both missing anchors and what to rerun with",
|
|
26
|
+
"No invented persona, stages, or Mermaid diagram appear"
|
|
27
|
+
]
|
|
28
|
+
}
|
|
29
|
+
]
|
|
30
|
+
}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
# Worked example: trial-to-activation journey for a B2B monitoring SaaS
|
|
2
|
+
|
|
3
|
+
**Input given to the skill:**
|
|
4
|
+
|
|
5
|
+
> Map the journey for engineering managers trialing our infrastructure-monitoring product. We think most trials stall before the first dashboard shows real data. No user research yet — this is what the growth team believes is happening. Trial starts when an alerting incident burns the team; success is the manager seeing their own production data on a dashboard and sharing it with the team.
|
|
6
|
+
|
|
7
|
+
**Output:**
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# Journey map: Engineering manager "Priya" → own production data on a shared dashboard
|
|
12
|
+
|
|
13
|
+
> Evidence level: `[assumption-based]` — growth-team hypothesis, no primary research yet. This map directs research; treat pains as hypotheses to verify, not findings.
|
|
14
|
+
> Start trigger: a production incident goes unnoticed for 40 minutes and the postmortem lands on Priya's desk · End state: Priya shares a dashboard of her own production data with her team
|
|
15
|
+
|
|
16
|
+
## Stages
|
|
17
|
+
|
|
18
|
+
| | Feel the burn | Evaluate options | Start the trial | Connect real data | First shared win |
|
|
19
|
+
|---|---|---|---|---|---|
|
|
20
|
+
| **Actions** | Reads the postmortem; asks "why didn't we see this?"; searches "kubernetes monitoring alerts" | Skims 3 vendor sites; asks peers in a Slack community; shortlists 2 | Signs up with work email; lands on an empty dashboard | Installs the agent on a staging cluster; hunts for the right Helm values; waits for data | Sees staging metrics; wants prod but needs security sign-off; shares a screenshot in team channel |
|
|
21
|
+
| **Emotion (1–5 + why)** | 2 — on the hook for an outage nobody saw | 3 — options exist, but every site says the same words | 4 — signup was fast, feels like progress | 2 — empty dashboard + config hunt; unclear if it's working or broken | 3 — win is real but staging-only; prod approval looms |
|
|
22
|
+
| **Pains** | Postmortem pressure with no tooling answer | Undifferentiated marketing; can't tell depth from demos | **Empty dashboard with no next step** | **No feedback during agent setup — silence until data arrives**; Helm docs assume expertise | Security review blocks prod; sharing is screenshot-only |
|
|
23
|
+
| **Opportunities** | Meet the searcher with the incident story, not a feature tour | Let Priya see the product on realistic data before signup | First session ends with data visible, even if sample | Setup progress is visible minute-by-minute; failure states name their fix | The shared artifact is live, not a screenshot; security answers are self-serve |
|
|
24
|
+
|
|
25
|
+
## Emotion arc
|
|
26
|
+
|
|
27
|
+
```mermaid
|
|
28
|
+
journey
|
|
29
|
+
title Priya → own production data on a shared dashboard
|
|
30
|
+
section Feel the burn
|
|
31
|
+
Read the postmortem: 2: Priya
|
|
32
|
+
Search for tooling: 3: Priya
|
|
33
|
+
section Evaluate options
|
|
34
|
+
Compare vendors: 3: Priya
|
|
35
|
+
section Start the trial
|
|
36
|
+
Sign up: 4: Priya
|
|
37
|
+
Land on empty dashboard: 2: Priya
|
|
38
|
+
section Connect real data
|
|
39
|
+
Install agent, wait in silence: 2: Priya
|
|
40
|
+
section First shared win
|
|
41
|
+
See staging data: 4: Priya
|
|
42
|
+
Hit prod sign-off wall: 3: Priya
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
## Peaks and ending
|
|
46
|
+
|
|
47
|
+
- **Steepest dips:** signup-high (4) → empty dashboard (2) — the sharpest single drop in the journey; agent install silence (2) — longest time spent at the bottom
|
|
48
|
+
- **Highest peak:** staging data appears (4)
|
|
49
|
+
- **Ending emotion:** 3 — a real win immediately blunted by the prod-approval wall; the journey *ends* on friction, which the peak-end rule says colors the whole trial
|
|
50
|
+
|
|
51
|
+
## Opportunities, ranked
|
|
52
|
+
|
|
53
|
+
| # | Opportunity (outcome-shaped) | Dip severity | Reach | Evidence | Target? |
|
|
54
|
+
|---|---|---|---|---|---|
|
|
55
|
+
| 1 | The first session ends with data on the dashboard, even sample data | 4→2, sharpest drop | every trial | `[assumption-based]` | ✅ named target |
|
|
56
|
+
| 2 | Setup progress is visible minute-by-minute; silence never means "unknown" | 2, longest dwell | every self-serve install | `[assumption-based]` | ✅ named target |
|
|
57
|
+
| 3 | Security answers are self-serve so prod approval starts during trial | ending friction | enterprise segment | `[assumption-based]` | deprioritized — smaller reach; revisit after research |
|
|
58
|
+
| 4 | Evaluation shows the product on realistic data pre-signup | 3, mild | top of funnel | `[assumption-based]` | deprioritized — funnel, not activation |
|
|
59
|
+
|
|
60
|
+
## Hand-off
|
|
61
|
+
|
|
62
|
+
- Target #1 → verify with session recordings first (`[assumption-based]` — 5 recordings would confirm the drop), then `prd-draft` for the empty-state experience
|
|
63
|
+
- Target #2 → `user-story-splitter` (install-feedback states are already story-shaped)
|
|
64
|
+
- Fix measurement → `success-metrics`: candidate first-success event is "real data visible in first session"
|
|
65
|
+
- Backstage causes implicated: agent packaging (Helm defaults), security-review process → platform team, security team
|
|
66
|
+
|
|
67
|
+
---
|
|
68
|
+
|
|
69
|
+
**Why this output passes the quality bar:** one persona, one outcome, both in the title; evidence level declared and repeated where it matters (the map admits it's a hypothesis and names the research that would confirm it); stage edges live in Priya's life (the postmortem, not the landing page); every emotion score has a reason; opportunities are outcomes ("first session ends with data"), not features ("add sample data mode"); dips, peak, and ending are marked; exactly two targets are named and the rest explicitly deprioritized.
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "user-journey-map",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Map a customer's end-to-end journey toward an outcome — 3–6 stages, each with actions, emotions, pains, and opportunities, plus a rendered Mermaid emotion arc and the ranked pain points design should attack first. Use when the user wants a journey map, customer experience map, \"map the user's path through onboarding\", touchpoint analysis, or \"where do users feel friction\".",
|
|
5
|
+
"entrypoint": "SKILL.md",
|
|
6
|
+
"deps": { "npm": [], "pip": [] },
|
|
7
|
+
"env": { "required": [], "optional": [] },
|
|
8
|
+
"related": ["architecture-diagrams", "prd-draft", "reverse-architecture", "success-metrics", "user-story-splitter"],
|
|
9
|
+
"tags": ["journey-map", "customer-experience", "ux", "touchpoints", "mermaid", "personas"],
|
|
10
|
+
"model": { "tier": "standard", "rationale": "Structured synthesis into a fixed four-row stage model plus bounded ranking judgment. Escalate via ambiguous-input when the persona or outcome is contested or research inputs conflict." }
|
|
11
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# Journey map: {persona} → {outcome}
|
|
2
|
+
|
|
3
|
+
> Evidence level: `[observational]` / `[survey/analytics]` / `[assumption-based]`
|
|
4
|
+
> Start trigger: {event in the persona's life} · End state: {what done means to the persona}
|
|
5
|
+
|
|
6
|
+
## Stages
|
|
7
|
+
|
|
8
|
+
<!-- 3–6 stages — add or remove columns to match the journey; four here is a placeholder, not a required count. -->
|
|
9
|
+
|
|
10
|
+
| | {Stage 1} | {Stage 2} | {Stage 3} | {Stage 4} |
|
|
11
|
+
|---|---|---|---|---|
|
|
12
|
+
| **Actions** | {what the persona does, their words} | | | |
|
|
13
|
+
| **Emotion (1–5 + why)** | {3 — reason} | | | |
|
|
14
|
+
| **Pains** | {friction; tag if evidence differs} | | | |
|
|
15
|
+
| **Opportunities** | {outcome, not feature} | | | |
|
|
16
|
+
|
|
17
|
+
## Emotion arc
|
|
18
|
+
|
|
19
|
+
```mermaid
|
|
20
|
+
journey
|
|
21
|
+
title {persona} → {outcome}
|
|
22
|
+
section {Stage 1}
|
|
23
|
+
{action}: {1-5}: {persona-short-name}
|
|
24
|
+
{action}: {1-5}: {persona-short-name}
|
|
25
|
+
section {Stage 2}
|
|
26
|
+
{action}: {1-5}: {persona-short-name}
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## Peaks and ending
|
|
30
|
+
|
|
31
|
+
- **Steepest dips:** {stage/action, score, reason} · {stage/action, score, reason}
|
|
32
|
+
- **Highest peak:** {stage/action, score, reason}
|
|
33
|
+
- **Ending emotion:** {score, reason — peak-end rule counts this double}
|
|
34
|
+
|
|
35
|
+
## Opportunities, ranked
|
|
36
|
+
|
|
37
|
+
| # | Opportunity (outcome-shaped) | Dip severity | Reach | Evidence | Target? |
|
|
38
|
+
|---|---|---|---|---|---|
|
|
39
|
+
| 1 | {…} | {…} | {…} | {tag} | ✅ named target |
|
|
40
|
+
| 2 | {…} | {…} | {…} | {tag} | ✅ named target |
|
|
41
|
+
| 3 | {…} | {…} | {…} | {tag} | deprioritized — {why} |
|
|
42
|
+
|
|
43
|
+
## Hand-off
|
|
44
|
+
|
|
45
|
+
- Target #1 → `prd-draft` / `user-story-splitter` when committed
|
|
46
|
+
- Fix measurement → `success-metrics`
|
|
47
|
+
- Backstage causes implicated: {named systems/teams} → service owner
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: user-story-splitter
|
|
3
|
+
description: Split an epic, feature request, or PRD chunk into independently shippable user stories with testable Gherkin acceptance criteria and a recommended build order. Use whenever the user wants to "break this down", turn an epic or PRD into a backlog, slice a feature for sprint planning, or write acceptance criteria for a story.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# user-story-splitter
|
|
7
|
+
|
|
8
|
+
Turns one oversized requirement into a set of vertical slices a team can ship and demo one at a time. Upstream of `feature-implement-loop` — each story this skill emits is shaped to be handed straight to it (or to a human) with no re-interpretation.
|
|
9
|
+
|
|
10
|
+
## How to respond
|
|
11
|
+
|
|
12
|
+
1. **Ingest whatever the user has.** An epic title, a PRD section, a Slack thread, a one-paragraph idea — all valid inputs. Ask at most 2 clarifying questions, and only when the answer changes how the epic is cut (e.g. "is anonymous checkout in scope?"). Everything else: pick a default and tag it `[assumption]` inline.
|
|
13
|
+
|
|
14
|
+
2. **Cut vertical slices, never horizontal layers.** Every story must deliver observable behavior end-to-end — something demoable to a non-engineer. ✅ *"Shopper pays with a saved card"* — ❌ *"Build the payments database schema"*. Use the SPIDR patterns to find the cut lines, in this order of preference:
|
|
15
|
+
- **Path** — split by user path / scenario ("pay with saved card" vs "pay with new card")
|
|
16
|
+
- **Rules** — relax a business rule into a later story ("any currency" → "USD only" first)
|
|
17
|
+
- **Data** — subset of data first ("import CSV" before "import CSV + Excel + API")
|
|
18
|
+
- **Interface** — one channel first ("web" before "web + mobile + email")
|
|
19
|
+
- **Spike** — only when genuine unknowns block estimation; timebox it and state the question it must answer
|
|
20
|
+
|
|
21
|
+
3. **Make story #1 the walking skeleton.** The thinnest end-to-end path through the whole feature, even if it's embarrassingly minimal. It de-risks integration and gives every later story something working to build on.
|
|
22
|
+
|
|
23
|
+
4. **Write each story with [`templates/story.md`](templates/story.md).** Per story: Connextra statement ("As a… I want… so that…"), 3–7 Gherkin acceptance criteria, out-of-scope list, and dependencies. Every story must include **at least one negative or edge-case criterion** — a story with only happy-path ACs is not done being written. (Spikes are the one exception: they carry a question and a timebox instead of acceptance criteria — see the spike variant in the template.)
|
|
24
|
+
|
|
25
|
+
5. **Apply the split-again rule.** A story with more than 7 acceptance criteria, more than one persona, or an "and" in its title is two stories. Split until each one fits; stop splitting when a further cut would no longer be demoable on its own.
|
|
26
|
+
|
|
27
|
+
6. **Emit the full output in one message**: a summary table (ID, title, slice pattern used, depends on, build order), then each story in full, then an **Out of scope / not covered** section listing what the epic mentioned that no story delivers — explicitly, so nothing silently disappears.
|
|
28
|
+
|
|
29
|
+
## Output shape
|
|
30
|
+
|
|
31
|
+
```markdown
|
|
32
|
+
# Story map: {epic title}
|
|
33
|
+
|
|
34
|
+
| # | Story | Slice | Depends on | Order |
|
|
35
|
+
|---|-------|-------|------------|-------|
|
|
36
|
+
| S1 | … (walking skeleton) | Path | — | 1 |
|
|
37
|
+
| S2 | … | Rules | S1 | 2 |
|
|
38
|
+
|
|
39
|
+
## S1 — {title}
|
|
40
|
+
**As a** … **I want** … **so that** …
|
|
41
|
+
[assumption] {any defaults picked}
|
|
42
|
+
|
|
43
|
+
### Acceptance criteria
|
|
44
|
+
- **AC1** Given … When … Then …
|
|
45
|
+
- **AC2 (edge)** Given … When … Then …
|
|
46
|
+
|
|
47
|
+
### Out of scope
|
|
48
|
+
- … (covered by S3)
|
|
49
|
+
|
|
50
|
+
## Out of scope / not covered by any story
|
|
51
|
+
- …
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
## Useful references in this skill
|
|
55
|
+
|
|
56
|
+
- [`templates/story.md`](templates/story.md) — the per-story skeleton
|
|
57
|
+
- [`examples/notifications-epic.md`](examples/notifications-epic.md) — worked example: a 2-paragraph epic split into 5 stories
|
|
58
|
+
|
|
59
|
+
## Quality bar
|
|
60
|
+
|
|
61
|
+
- **Every story is demoable to a non-engineer.** If the demo is "look at this table in the database", it's a horizontal slice — re-cut it.
|
|
62
|
+
- **Every acceptance criterion is pass/fail without interpretation.** A tester who has never seen the epic can verdict it. ✅ *"Then the order total shows the discounted price within 2s"* — ❌ *"Then the discount works correctly"*.
|
|
63
|
+
- **Dependency graph is a chain or shallow tree, never a web.** No story depends on more than one other story; if it needs two, the cut is wrong.
|
|
64
|
+
- **Assumptions are tagged, not embedded.** Every default the skill picked appears as a visible `[assumption]`, so planning can challenge it.
|
|
65
|
+
- **The epic is fully accounted for.** Everything in the input is either inside a story or named in "Out of scope / not covered" — no silent drops.
|
|
66
|
+
|
|
67
|
+
## When to use this skill
|
|
68
|
+
|
|
69
|
+
- ✅ An epic or feature request too big to estimate or fit a sprint
|
|
70
|
+
- ✅ Turning a PRD section into backlog items before planning
|
|
71
|
+
- ✅ Writing acceptance criteria for an existing vague story
|
|
72
|
+
- ✅ Producing input for `feature-implement-loop` — each emitted story is shaped for it
|
|
73
|
+
|
|
74
|
+
## When NOT to use this skill
|
|
75
|
+
|
|
76
|
+
- ❌ The work has no user-visible behavior (pure refactor, dependency bump) — write a task list, not stories
|
|
77
|
+
- ❌ The story is already small and clear — go straight to `feature-implement-loop`
|
|
78
|
+
- ❌ Estimating effort in hours/points — this skill orders and sizes by slice, it does not estimate
|
|
79
|
+
- ❌ Writing the implementation — hand the story off instead
|
|
80
|
+
|
|
81
|
+
## Anti-patterns to avoid
|
|
82
|
+
|
|
83
|
+
- ❌ **Horizontal layer stories** — "API story", "DB story", "UI story". Three un-demoable thirds of one real story.
|
|
84
|
+
- ❌ **Acceptance criteria that restate the story.** "Given the feature exists, when used, then it works" verifies nothing.
|
|
85
|
+
- ❌ **Implementation details inside Gherkin.** ❌ *"When the user clicks `#submit-btn`"* — ✅ *"When the shopper confirms the order"*. ACs describe behavior, not DOM.
|
|
86
|
+
- ❌ **A "misc / cleanup / polish" story** as a dumping ground for everything that didn't fit. Re-cut, or move it to out-of-scope.
|
|
87
|
+
- ❌ **Splitting below the demoable threshold.** Fifteen confetti stories when six would ship is coordination overhead, not agility.
|
|
88
|
+
- ❌ **A spike without a question.** Every spike states the specific unknown it resolves and a timebox; "investigate the architecture" is neither.
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
# Worked example — notifications epic → 5 stories
|
|
2
|
+
|
|
3
|
+
## Input (verbatim from the user)
|
|
4
|
+
|
|
5
|
+
> Epic: customers keep missing order updates. We want a notification system — order shipped, delivered, delayed. Should support email and SMS, let users pick which events they care about, and marketing wants to reuse it later for promos. Some customers are in the EU so there's consent stuff to think about.
|
|
6
|
+
|
|
7
|
+
## Output
|
|
8
|
+
|
|
9
|
+
# Story map: Order-update notifications
|
|
10
|
+
|
|
11
|
+
| # | Story | Slice | Depends on | Order |
|
|
12
|
+
|---|-------|-------|------------|-------|
|
|
13
|
+
| S1 | Customer gets an email when an order ships (walking skeleton) | Path | — | 1 |
|
|
14
|
+
| S2 | Customer gets emails for delivered and delayed events | Rules | S1 | 2 |
|
|
15
|
+
| S3 | Customer chooses which order events to receive | Path | S2 | 3 |
|
|
16
|
+
| S4 | Customer receives notifications by SMS | Interface | S3 | 4 |
|
|
17
|
+
| S5 | EU customer consent is captured before any notification | Rules | S1 | 2 (parallel with S2) |
|
|
18
|
+
|
|
19
|
+
## S1 — Customer gets an email when an order ships (walking skeleton)
|
|
20
|
+
|
|
21
|
+
**As a** customer with a placed order
|
|
22
|
+
**I want** an email the moment my order ships
|
|
23
|
+
**so that** I know it's on the way without checking the site
|
|
24
|
+
|
|
25
|
+
**Slice pattern:** Path
|
|
26
|
+
**Depends on:** —
|
|
27
|
+
[assumption] Email comes from the existing transactional-email provider; no new vendor selection in this epic.
|
|
28
|
+
|
|
29
|
+
### Acceptance criteria
|
|
30
|
+
|
|
31
|
+
- **AC1** Given a customer with a confirmed order and a valid email address, When the order's status changes to *shipped*, Then the customer receives a shipped email containing the order number and carrier tracking link within 5 minutes.
|
|
32
|
+
- **AC2** Given an order that changes to *shipped* twice due to a status replay, When the duplicate event arrives, Then no second email is sent.
|
|
33
|
+
- **AC3 (edge)** Given a customer whose email address hard-bounces, When a shipped event occurs, Then no retry storm occurs and the failure is visible in the service's logs/metrics.
|
|
34
|
+
|
|
35
|
+
### Out of scope for this story
|
|
36
|
+
|
|
37
|
+
- Delivered/delayed events → S2
|
|
38
|
+
- Channel or event preferences → S3, S4
|
|
39
|
+
- Consent gating → S5
|
|
40
|
+
|
|
41
|
+
## S2 — Customer gets emails for delivered and delayed events
|
|
42
|
+
|
|
43
|
+
**As a** customer with a shipped order
|
|
44
|
+
**I want** emails when my order is delivered or delayed
|
|
45
|
+
**so that** I'm not surprised by either outcome
|
|
46
|
+
|
|
47
|
+
**Slice pattern:** Rules (relaxes "shipped only" to all three events)
|
|
48
|
+
**Depends on:** S1
|
|
49
|
+
|
|
50
|
+
### Acceptance criteria
|
|
51
|
+
|
|
52
|
+
- **AC1** Given a shipped order, When its status changes to *delivered*, Then the customer receives a delivered email within 5 minutes.
|
|
53
|
+
- **AC2** Given a shipped order, When the carrier reports a delay, Then the customer receives a delayed email containing the new estimated date.
|
|
54
|
+
- **AC3 (edge)** Given an order that goes *delayed* then *delivered* within 10 minutes, When both events arrive, Then the customer receives both emails in event order, not interleaved.
|
|
55
|
+
|
|
56
|
+
### Out of scope for this story
|
|
57
|
+
|
|
58
|
+
- Customer choosing which of the three events to receive → S3
|
|
59
|
+
|
|
60
|
+
## S3 — Customer chooses which order events to receive
|
|
61
|
+
|
|
62
|
+
**As a** customer
|
|
63
|
+
**I want** to pick which order events notify me
|
|
64
|
+
**so that** I only get the updates I care about
|
|
65
|
+
|
|
66
|
+
**Slice pattern:** Path
|
|
67
|
+
**Depends on:** S2
|
|
68
|
+
[assumption] Default for existing customers is all order events ON — opt-out, not opt-in (overridden by S5 for EU customers).
|
|
69
|
+
|
|
70
|
+
### Acceptance criteria
|
|
71
|
+
|
|
72
|
+
- **AC1** Given a logged-in customer on notification settings, When they turn *delayed* off and save, Then subsequent delay events produce no email and the setting survives logout/login.
|
|
73
|
+
- **AC2** Given a customer with all events off, When any order event occurs, Then no notification of any kind is sent.
|
|
74
|
+
- **AC3 (edge)** Given a settings save that fails server-side, When the customer saves, Then the UI shows the failure and the previous settings remain in effect — no silent partial save.
|
|
75
|
+
|
|
76
|
+
### Out of scope for this story
|
|
77
|
+
|
|
78
|
+
- Per-channel preferences (email vs SMS separately) → S4
|
|
79
|
+
|
|
80
|
+
## S4 — Customer receives notifications by SMS
|
|
81
|
+
|
|
82
|
+
**As a** customer who prefers texts
|
|
83
|
+
**I want** order notifications by SMS
|
|
84
|
+
**so that** I see them without opening email
|
|
85
|
+
|
|
86
|
+
**Slice pattern:** Interface (adds a channel to existing behavior)
|
|
87
|
+
**Depends on:** S3
|
|
88
|
+
[assumption] One SMS provider, chosen by the team's existing vendor list; international SMS limited to countries the store ships to.
|
|
89
|
+
|
|
90
|
+
### Acceptance criteria
|
|
91
|
+
|
|
92
|
+
- **AC1** Given a customer with a verified phone number and SMS enabled, When a subscribed order event occurs, Then they receive an SMS within 5 minutes containing order number and a short status line.
|
|
93
|
+
- **AC2** Given a customer with both channels enabled, When an event occurs, Then they receive both email and SMS for that event.
|
|
94
|
+
- **AC3 (edge)** Given an unverified phone number, When the customer enables SMS, Then sending is blocked until verification completes and the UI says so.
|
|
95
|
+
|
|
96
|
+
### Out of scope for this story
|
|
97
|
+
|
|
98
|
+
- Quiet hours / time-zone batching → not covered, listed in epic out-of-scope
|
|
99
|
+
|
|
100
|
+
## S5 — EU customer consent is captured before any notification
|
|
101
|
+
|
|
102
|
+
**As an** EU customer
|
|
103
|
+
**I want** to be asked for consent before receiving notifications
|
|
104
|
+
**so that** my communication preferences are lawful and mine
|
|
105
|
+
|
|
106
|
+
**Slice pattern:** Rules (tightens the default-on rule for one jurisdiction)
|
|
107
|
+
**Depends on:** S1
|
|
108
|
+
|
|
109
|
+
### Acceptance criteria
|
|
110
|
+
|
|
111
|
+
- **AC1** Given a customer whose account country is in the EU and who has not consented, When any order event occurs, Then no notification is sent on any channel.
|
|
112
|
+
- **AC2** Given an EU customer presented the consent prompt, When they accept, Then the consent decision, timestamp, and scope are stored and notifications begin from the next event.
|
|
113
|
+
- **AC3 (edge)** Given an EU customer who previously consented, When they withdraw consent, Then notifications stop from the next event and the withdrawal is stored with a timestamp.
|
|
114
|
+
|
|
115
|
+
### Out of scope for this story
|
|
116
|
+
|
|
117
|
+
- Legal review of the consent copy — flagged for the compliance team, not an engineering AC.
|
|
118
|
+
|
|
119
|
+
## Out of scope / not covered by any story
|
|
120
|
+
|
|
121
|
+
- **Marketing/promo notifications** — the epic mentions marketing reuse "later"; nothing here builds promo sending. The event-driven design keeps it possible.
|
|
122
|
+
- **Push notifications** — only email and SMS were requested.
|
|
123
|
+
- **Quiet hours / batching** — not requested; revisit if SMS complaint volume appears.
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "user-story-splitter",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Split an epic, feature request, or PRD chunk into independently shippable user stories with testable Gherkin acceptance criteria and a recommended build order. Use whenever the user wants to \"break this down\", turn an epic or PRD into a backlog, slice a feature for sprint planning, or write acceptance criteria for a story.",
|
|
5
|
+
"entrypoint": "SKILL.md",
|
|
6
|
+
"deps": { "npm": [], "pip": [] },
|
|
7
|
+
"env": { "required": [], "optional": [] },
|
|
8
|
+
"related": ["feature-implement-loop"],
|
|
9
|
+
"tags": ["user-stories", "agile", "backlog", "acceptance-criteria", "planning", "sprint"],
|
|
10
|
+
"model": { "tier": "standard", "rationale": "Decomposes an epic into INVEST slices with testable ACs. Structured synthesis; escalation rules cover large or contradictory PRDs." }
|
|
11
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# Story template
|
|
2
|
+
|
|
3
|
+
Copy per story. Keep every field; delete nothing silently — if a field is empty, say why.
|
|
4
|
+
|
|
5
|
+
```markdown
|
|
6
|
+
## S{n} — {Outcome noun phrase, e.g. "Shopper pays with a saved card"}
|
|
7
|
+
|
|
8
|
+
**As a** {one persona — if you need two, split the story}
|
|
9
|
+
**I want** {capability in the user's language, no implementation}
|
|
10
|
+
**so that** {the value — if you can't fill this, the story may not be worth building}
|
|
11
|
+
|
|
12
|
+
**Slice pattern:** {Path | Rules | Data | Interface | Spike}
|
|
13
|
+
**Depends on:** {one story ID, or —}
|
|
14
|
+
[assumption] {any default picked while writing this story; omit the line if none}
|
|
15
|
+
|
|
16
|
+
### Acceptance criteria (3–7; at least one edge/negative)
|
|
17
|
+
|
|
18
|
+
- **AC1** Given {precondition} When {action} Then {observable, pass/fail outcome}
|
|
19
|
+
- **AC2 (edge)** Given {boundary or failure precondition} When {action} Then {graceful observable outcome}
|
|
20
|
+
|
|
21
|
+
### Out of scope for this story
|
|
22
|
+
|
|
23
|
+
- {thing a reviewer will ask about} → {covered by S{m} | not covered, listed in epic out-of-scope}
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
Spike variant — replace acceptance criteria with:
|
|
27
|
+
|
|
28
|
+
```markdown
|
|
29
|
+
### Question this spike answers
|
|
30
|
+
|
|
31
|
+
{The single specific unknown, phrased so the answer is decidable.}
|
|
32
|
+
|
|
33
|
+
### Timebox
|
|
34
|
+
|
|
35
|
+
{e.g. 1 day. The spike ends when the timebox does, answered or not.}
|
|
36
|
+
|
|
37
|
+
### Output
|
|
38
|
+
|
|
39
|
+
A written recommendation that lets {the blocked story ID} be estimated.
|
|
40
|
+
```
|