diff --git a/.pi/skills/demo/README.md b/.pi/skills/demo/README.md new file mode 100644 index 0000000..bdc5ff1 --- /dev/null +++ b/.pi/skills/demo/README.md @@ -0,0 +1,54 @@ +# Demo Skill + +Generate living demo documents proving features work, with showboat for Markdown assembly and rodney for browser screenshots. + +## Prerequisites + +Requires two Go CLI tools: + +```bash +go install github.com/simonw/showboat@latest +go install github.com/simonw/rodney@latest +``` + +Verify installation: + +```bash +showboat --help +rodney --help +``` + +## Usage + +In pi, invoke via: + +``` +/skill:demo [--scenario ] [--plan ] +``` + +Or ask naturally: + +- "demo this" +- "show me it works" +- "create a demo" +- "create a demo of the authentication flow" + +## How It Works + +1. Checks that showboat and rodney are installed +2. Gathers feature context from plan files, recent commits, or your description +3. Verifies the dev server is running +4. Handles authentication (creates a demo user if needed) +5. Captures backend evidence (tests, compilation, database state) +6. Takes browser screenshots of UI pages +7. Maps evidence to acceptance criteria +8. Produces a standalone Markdown demo document in `demos/` + +## Demo Document Structure + +- **Feature Overview** — narrative description +- **Test Suite** — relevant test output +- **Compilation Check** — `mix compile --warnings-as-errors` +- **Database State** — if relevant +- **UI Screenshots** — static pages and interactive flows +- **Acceptance Criteria Verification** — checklist with evidence references diff --git a/.pi/skills/demo/SKILL.md b/.pi/skills/demo/SKILL.md new file mode 100644 index 0000000..3be9966 --- /dev/null +++ b/.pi/skills/demo/SKILL.md @@ -0,0 +1,202 @@ +--- +name: demo +description: >- + Generate a living demo document proving a feature works. Uses showboat for + Markdown assembly with captured command output and rodney for Chrome browser + screenshots. Use when the user says "demo this", "show me it works", "create + a demo", or after /build completes. +allowed-tools: Read Write Glob Grep Bash +--- + +# Demo Skill + +Role: worker. This command generates a standalone Markdown demo document that +proves a feature works, using showboat for document assembly and rodney for +browser automation. + +You have been invoked with the /demo command. +Parse Arguments + +Arguments: $ARGUMENTS + + Positional: (required) - short name or description of the feature to demo + --scenario : Explicit demo scenario describing what to show. If omitted, infer from the plan and recent commits. + --plan : Path to the plan file. If omitted, search plans/ for the most recently modified .md file with status implemented or approved. + +Steps +1. Check tool availability + +Verify showboat and rodney are installed: + +showboat --help 2>/dev/null && echo "showboat: ok" || echo "showboat: missing" +rodney --help 2>/dev/null && echo "rodney: ok" || echo "rodney: missing" + +If either tool is missing, tell the user: + + One or more demo tools are missing. Install them with: + + go install github.com/simonw/showboat@latest + go install github.com/simonw/rodney@latest + +Do not proceed until both tools are confirmed available. +2. Gather feature context + +Build an understanding of what to demo from these sources (in priority order): + + Explicit scenario (--scenario): If provided, use as primary guide. + Plan file: Read the plan's Goal, Acceptance Criteria, and completed Steps. + Recent commits: Run git log --oneline -15 and git diff main...HEAD --stat to identify changed files and commit messages. + Route map: Cross-reference changed files against known LiveView routes in the router (lib/hub_web/router.ex). + +From these sources, produce a demo outline: + + Narrative: 2-3 sentence description of what the feature does + Backend evidence: mix commands, test output, or database queries to run + UI pages: which routes to visit and what to look for + Interactions: any clicks, form fills, or navigation sequences to perform + +If no plan exists and commits are ambiguous, ask the user for a brief description of what to demo. +3. Check dev server + +curl -s -o /dev/null -w "%{http_code}" http://localhost:4000/ 2>/dev/null + +If the server is not reachable: + + The Phoenix dev server is not running. Start it now? + + mix phx.server & + +After starting, wait up to 10 seconds and verify connectivity. If it still fails, proceed with backend-only evidence (skip all browser screenshots) and note the limitation in the demo document. +4. Handle authentication + +The app requires authentication for LiveView routes. Before capturing UI screenshots: + + Ensure a demo user exists: + + mix run -e " + alias Hub.Accounts + case Accounts.get_user_by_email(\"demo@example.com\") do + nil -> Accounts.register_user(%{email: \"demo@example.com\", password: \"demodemo1234\"}) + user -> {:ok, user} + end + " + + Log in via rodney: + + rodney start + rodney open http://localhost:4000/users/log-in + rodney wait "input[name='user[email]']" + rodney input "input[name='user[email]']" "demo@example.com" + rodney input "input[name='user[password]']" "demodemo1234" + rodney click "button[type='submit']" + rodney waitidle + +If login fails, warn and proceed with backend-only evidence. +5. Initialize the demo document + +Slugify the feature name (lowercase, hyphens, no special chars). Then: + +showboat init "demos/demo-$(date +%Y%m%d-%H%M%S)-.md" "Demo: " + +Store the demo file path for use in all subsequent steps. +6. Narrative introduction + +showboat note "## Feature Overview + +<2-3 sentence description derived from the plan or commits.> + +**Branch**: $(git branch --show-current) +**Commits**: commits ahead of main +**Plan**: +" + +7. Backend evidence + +Capture backend proof via showboat exec. Always include relevant tests. Add narrative notes between evidence blocks explaining what each proves. + +Test output (always include): + +showboat note "## Test Suite" +showboat exec bash "mix test --color" +showboat note "All tests pass, confirming ." + +Compilation check: + +showboat note "## Compilation Check" +showboat exec bash "mix compile --warnings-as-errors" + +Database state (if relevant to the feature): + +showboat note "## Database State" +showboat exec bash "mix run -e ''" + +8. UI screenshots + +For each UI page identified in step 2, navigate with rodney, screenshot, and embed via showboat. + +Static page capture: + +rodney open http://localhost:4000/ +rodney waitidle +rodney screenshot demos/screenshots/-.png + +showboat note "### + +" + +showboat image '![](demos/screenshots/-.png)' + +Interactive flow (form submissions, navigation): + +showboat note "### Interactive Flow: " + +# Before state +rodney screenshot demos/screenshots/-before.png +showboat image '![Before: ](demos/screenshots/-before.png)' + +# Perform interaction +rodney click "" +rodney input "" "" +rodney click "" +rodney waitidle + +# After state +rodney screenshot demos/screenshots/-after.png +showboat image '![After: ](demos/screenshots/-after.png)' + +9. Acceptance criteria checklist + +If a plan file exists, map each acceptance criterion to evidence: + +showboat note "## Acceptance Criteria Verification + +- [x] -- see Test Suite output above +- [x] -- see screenshot +- [x] -- see Database State output +" + +If no plan, summarize what was demonstrated and what it proves. +10. Clean up + +rodney stop 2>/dev/null || true + +11. Report results + +Display: + +## Demo Complete + +- **Document**: demos/.md +- **Screenshots**: captured in demos/screenshots/ +- **Evidence**: backend commands, UI screenshots +- **Acceptance criteria**: / demonstrated + +Error Handling + + Tools not installed: Show go install commands. Do not proceed without them. + Dev server not running: Offer to start. If startup fails, produce backend-only demo and note the limitation. + Authentication failure: Proceed with backend-only evidence. Note skipped UI screenshots in the document. + Screenshot failure: Log the error as a note in the demo document, continue with remaining screenshots. + No plan found: Infer from git commits and changed files. Ask the user for a description if commits are ambiguous. + Rodney/Chrome crash: Run rodney stop then rodney start to reset. Retry once. If it fails again, degrade to backend-only. +