| name | dogfood |
| description | Simulate a first-time user trying rfw_gen packages, discover issues, and file them as GitHub Issues. Use /dogfood run to start a collection cycle, /dogfood fix to resolve filed issues. Triggers when user mentions dogfooding, DX testing, user simulation, or wants to find usability issues in rfw_gen. |
| user_invocable | true |
Dogfood Skill
Simulate a first-time rfw_gen user to discover DX issues, bugs, and feature gaps.
Argument Parsing
Parse user arguments to determine mode:
/dogfood run โ Run a collection cycle (Section: Run Mode)
/dogfood fix โ Fix filed issues (Section: Fix Mode)
/dogfood (no args) โ Show help: "Usage: /dogfood run | /dogfood fix"
Prerequisites (both modes)
Before any operation, verify:
- gh auth: Run
gh auth status. If not authenticated, tell user to run ! gh auth login and stop.
- GitHub labels: Run
gh label list --search dogfood. If dogfood label doesn't exist, create all needed labels:
gh label create dogfood --color 0E8A16 --description "Dogfood cycle issue"
gh label create dx --color D93F0B --description "Developer experience issue"
Also check for bug, feature, docs labels โ these likely already exist. Only create if missing.
- .gitignore: Check
example2/ is in .gitignore. If not, add it and commit.
Run Mode
Step 1: Clean up previous example2
rm -rf example2/
Step 2: Determine cycle number
Search existing dogfood issues for the latest cycle number:
gh issue list --label dogfood --state all --limit 100 --json body -q '.[].body'
Parse ์ฌ์ดํด: #N from issue bodies. New cycle = max(N) + 1. If no issues exist, start at #1.
Step 3: Select persona (random)
Pick ONE randomly. Do not repeat the same persona in consecutive cycles if you can recall the previous one.
Persona A โ ์ ๊ท ์ฌ์ฉ์ (First-time user)
- Flutter experienced, never used rfw_gen
- Can ONLY reference: README.md, pubspec.yaml, pub.dev page
- CANNOT read: package source code, internal docs, generated files
- Behavior: Starts from
pub.dev/packages/rfw_gen, follows getting started guide
Persona B โ ๋ฌธ์ ์ฝ์ ์ฌ์ฉ์ (Doc-reader)
- Flutter experienced, has read rfw_gen docs
- Can reference: README, CHANGELOG, doc/, example/ code
- CANNOT read: package source code internals
- Behavior: Understands @RfwWidget concept, tries intermediate patterns
Persona C โ ์ฝ๋์ ๊ฒฝํ์ (Code-gen veteran)
- Has used build_runner, freezed, json_serializable
- Can reference: everything including source code
- Behavior: Compares rfw_gen conventions with other code-gen packages, tries advanced patterns
Step 4: Select app topic (random)
Pick a topic NOT used in previous cycles. Check existing dogfood issues for past topics:
gh issue list --label dogfood --state all --limit 100 --json body -q '.[].body'
Parse ์ฃผ์ : {topic} from bodies and avoid duplicates.
Topic examples: ํฌ๋ ์ฑ, ๋ ์จ ๋์๋ณด๋, SNS ํผ๋, ๋ ์ํผ ๋ถ, ์ด๋ ํธ๋์ปค, ์์
ํ๋ ์ด์ด UI, ์ค์ ํ๋ฉด, ๋ด์ค ๋ฆฌ๋, ์ฑํ
UI, ๊ฐ๊ณ๋ถ, ์ผ๊ธฐ์ฅ, ์ํ ๋ชฉ๋ก, ํ์ต ์นด๋, ํ์ด๋จธ ์ฑ, ์๋จ ๊ด๋ฆฌ
Constraint: The topic must exercise at least 5-8 different RFW widgets and include both layout and interaction patterns.
Step 5: Create example2 project
flutter create example2 --project-name dogfood_app
Then update example2/pubspec.yaml dependencies. IMPORTANT: Check pub.dev for the latest versions of each package before writing the pubspec. Do not use the example versions below โ always use the actual latest published versions.
dependencies:
flutter:
sdk: flutter
rfw: ^<LATEST>
rfw_gen: ^<LATEST>
dev_dependencies:
flutter_test:
sdk: flutter
build_runner: ^<LATEST>
rfw_gen_builder: ^<LATEST>
If the persona attempts to use rfw_preview, add it to dependencies as well.
If flutter create fails, output the error and stop the cycle.
Run:
cd example2 && flutter pub get
If pub get fails, output the error (likely a pub.dev version issue) and stop the cycle.
Step 6: Develop the app as the selected persona
CRITICAL: Stay in character. Only use information your persona has access to.
Development process:
- Create Dart files with
@RfwWidget-annotated functions for each screen/component
- Run
dart run build_runner build to generate rfwtxt and binary files
- Attempt to use generated RFW content with rfw_preview if relevant
- Try at least 5-8 different widgets from the RFW widget set
- Include both layout widgets (Row, Column, Stack, etc.) and interaction widgets (GestureDetector, ElevatedButton, etc.)
As you work, record every friction point:
- Build errors or confusing error messages
- Documentation that was missing or unclear
- API patterns that felt unintuitive
- Widgets you wanted but weren't supported
- Behavior that differed from what you expected
- Error messages that didn't help you fix the problem
- Anything you had to guess or figure out by trial and error
Important: Don't just note the problem โ also note what you tried, what you expected, and what actually happened. This context is essential for the issue report.
Step 7: Compile and categorize issues
Organize discovered issues into categories:
bug โ Build errors, codegen failures, incorrect output
dx โ Poor documentation, unintuitive API, bad error messages
feature โ Unsupported widgets, missing functionality
docs โ Documentation improvements, missing examples
upstream โ RFW ํจํค์ง ์์ฒด ํ๊ณ (rfw_gen ์์ ์ผ๋ก ํด๊ฒฐ ๋ถ๊ฐ)
๋ถ๋ฅ ๊ธฐ์ค: rfw_gen ์ฝ๋ ์์ ์ผ๋ก ํด๊ฒฐ ๊ฐ๋ฅํ๋ฉด ์ 4๊ฐ ์นดํ
๊ณ ๋ฆฌ. RFW ํจํค์ง ์์ฒด ๋ณ๊ฒฝ์ด ํ์ํ๋ฉด upstream.
Playground Freshness Check (during dogfood run)
After completing the dogfood app, also check playground content:
- Stale examples: Open
rfw_gen_playground/ in browser, navigate to widget gallery
- Do examples use current API? (check parameter names, types, required/optional)
- Do examples compile without deprecation warnings?
- Missing examples: Run
dart tool/check_playground_coverage.dart
- Note any core/material widgets without playground gallery entries
- Categorize findings as:
playground + stale: Example exists but uses outdated API
playground + missing: Widget registered but no playground example
playground + broken: Example doesn't compile or render correctly
Maximum 7 issues per cycle. If more than 7, keep the top 7 by priority (bug > dx > feature > docs). Note the rest as "deferred to next cycle" in the summary.
For each issue, prepare:
- Title:
[dogfood/{category}] {concise summary}
- Problem description (what you tried, what happened)
- Reproduction steps
- Suggested fix
- Affected packages
Step 8: Check for duplicate issues
Before filing, search existing open dogfood issues:
gh issue list --label dogfood --state open --json title,number -q '.[] | "\(.number)\t\(.title)"'
Compare each new issue title/keywords against existing ones. If a likely duplicate exists, skip it and note in the summary.
Step 8.5: Handle upstream issues separately
For issues categorized as upstream, do NOT file as GitHub Issue. Instead:
- Create
docs/upstream/{issue-name}.md with this template:
# {์ด์ ์ ๋ชฉ}
## ์ํ
์์ง๋จ
## ์ฆ์
{๋ญ๊ฐ ์ ๋๋์ง, ์ฌ์ฉ์ ๊ด์ }
## ์ฌํ ์ฝ๋
### Flutter ์ฝ๋ (์
๋ ฅ)
\```dart
{RFW๋ก ๋ณํํ๋ ค๋ Flutter ์ฝ๋}
\```
### ๊ธฐ๋ํ๋ rfwtxt ์ถ๋ ฅ
\```rfwtxt
{๋์ด์ผ ํ๋ ๊ฒฐ๊ณผ}
\```
### ์ค์ ๋์
{์๋ฌ ๋ฉ์์ง ๋๋ ์๋ชป๋ ์ถ๋ ฅ}
## RFW ์์ค ์์ธ ๋ถ์
- **ํ์ผ**: `packages/rfw/lib/src/...`
- **์์ธ**: {์ฝ๋ ๋ ๋ฒจ์์ ์ ์ ๋๋์ง, ๋ถ์ ๊ฐ๋ฅํ๋ฉด}
## ์ ์ ํด๊ฒฐ์ฑ
{์์ผ๋ฉด โ ์์ผ๋ฉด "๋ถ์ ํ์"}
## ๊ด๋ จ ๋งํฌ
- ๋ฐ๊ฒฌ ๊ฒฝ๋ก: dogfood ์ฌ์ดํด #{N}
-
Update docs/upstream/README.md โ add the new issue under "์์ง๋จ" section:
- [{์ด์ ์ ๋ชฉ}]({issue-name}.md) โ {ํ์ค ์์ฝ}
-
Continue to Step 9 with remaining non-upstream issues only.
Step 9: File GitHub Issues
For each non-duplicate issue, create a GitHub Issue. Replace all {...} placeholders with actual values before running the command:
gh issue create \
--title "[dogfood/{category}] {summary}" \
--label "dogfood,{category}" \
--body "$(cat <<'EOF'
## ๋ฐ๊ฒฌ ์ปจํ
์คํธ
- ์ฌ์ดํด: #{cycle_number}
- ์ฃผ์ : {topic}
- ํ๋ฅด์๋: {persona_name}
## ๋ฌธ์
{description of what you tried and what went wrong}
## ์ฌํ ๋ฐฉ๋ฒ
{step by step reproduction}
## ์ ์ํ๋ ํด๊ฒฐ ๋ฐฉ์
{suggested fix approach}
## ์ํฅ๋ฐ๋ ํจํค์ง
- [ ] rfw_gen
- [ ] rfw_gen_builder
- [ ] rfw_gen_mcp
- [ ] rfw_preview
EOF
)"
If gh issue create fails, retry once. If it fails again, output the issue content to the terminal and tell the user to create it manually.
Step 10: Output cycle summary
## Dogfood Cycle #{N} Summary
๐ ์ฃผ์ : {topic}
๐ญ ํ๋ฅด์๋: {persona name}
๐ฆ ์์กด์ฑ: rfw_gen ^x.y.z, rfw_preview ^x.y.z
### ๋ฐ๊ฒฌ๋ ์ด์ ({count}๊ฑด)
| # | ์นดํ
๊ณ ๋ฆฌ | ์ด์ | GitHub |
|---|---------|------|--------|
| 1 | {cat} | {summary} | #{issue_number} |
### Upstream ์ด์ ({count}๊ฑด, docs/upstream/์ ๊ธฐ๋ก)
| # | ์ด์ | ํ์ผ |
|---|------|------|
| 1 | {summary} | docs/upstream/{name}.md |
### ๋ค์ ์ฌ์ดํด๋ก ์ด์ฐ ({count}๊ฑด)
- {deferred issues, if any}
### ์ค๋ณต์ผ๋ก ์คํต ({count}๊ฑด)
- {skipped duplicates, if any}
If zero issues were found, output:
## Dogfood Cycle #{N} Summary โ Clean Cycle โ
๐ ์ฃผ์ : {topic}
๐ญ ํ๋ฅด์๋: {persona name}
No issues discovered. All tested patterns worked as expected.
Fix Mode
Step 1: List open dogfood issues
gh issue list --label dogfood --state open --json number,title,labels -q '.[] | "\(.number)\t\(.title)\t\([.labels[].name] | join(","))"'
Step 2: Present issues sorted by priority
Sort by category priority: bug > dx > feature > docs
Present the list to the user and recommend which issue to tackle first (highest priority). Let the user choose.
Step 3: Start work on selected issue
Read the full issue body:
gh issue view {number} --json body,title -q '.title + "\n\n" + .body'
Then delegate to the git-workflow skill to create a worktree:
Use /git-workflow start fix/dogfood-{issue_number} to create an isolated worktree.
Step 4: Implement the fix
Work in the worktree to fix the issue. Follow the "์ ์ํ๋ ํด๊ฒฐ ๋ฐฉ์" from the issue body as a starting point. Run tests to verify:
melos exec -- dart test
dart analyze
Step 5: Create PR and link to issue
Use /git-workflow finish to push and create a PR.
After the PR is created, add a comment to the issue:
gh issue comment {number} --body "Fix submitted in PR #{pr_number}"