Agent skill
prd
Creates Product Requirements Documents (PRDs) as MD files in __docs/prd/. Use when asked to "write a PRD", "create a product requirements document", "draft requirements", "write requirements for a feature", "create a spec", or "document product requirements".
Install this agent skill to your Project
npx add-skill https://github.com/jiyeol-lee/dotfiles/tree/main/.opencode/skills/prd
SKILL.md
Workflow
-
Clarify the goal — Confirm the feature/goal with the user. Ask for:
- What problem does this solve? (not what to build — WHY to build it)
- Who are the users affected?
- Any known constraints (timeline, tech stack, dependencies)?
- Any prior art or related features?
If the user provides enough context upfront, skip the interview and proceed.
-
Research the codebase — Before writing, ground the PRD in reality:
- Glob for related code, configs, and existing docs
- Read relevant source files to understand current architecture
- Check for existing PRDs in
__docs/prd/to avoid duplication and maintain consistency
-
Derive the feature name — Convert the feature/goal to kebab-case for the filename:
- "User Password Reset" →
user-password-reset - "Add Dark Mode Support" →
dark-mode-support - Strip verbs like "add", "implement", "create" — name the FEATURE, not the action
- "User Password Reset" →
-
Draft the PRD — Read
references/template.mdfor the full MD structure, then write each section following these principles:Problem Statement — Write this FIRST. If you can't articulate the problem clearly, the PRD isn't ready. Ask the user for clarification instead of guessing.
Goals vs Non-Goals — Non-goals are MORE important than goals. They prevent scope creep. For every goal, ask: "What's the adjacent thing someone might assume is included but ISN'T?"
User Stories — Write from the user's perspective, not the developer's. Bad: "As a developer, I want an API endpoint." Good: "As a customer, I want to reset my password so I can regain access to my account."
Functional Requirements — Number every requirement (FR-1, FR-2...). Each MUST be independently testable. If a requirement contains "and", split it into two.
Acceptance Criteria — Write these as pass/fail checks. Use "Given/When/Then" format. Every functional requirement MUST have at least one acceptance criterion.
Open Questions — Don't fake certainty. If something is unclear, list it here. A PRD with honest open questions is better than one with fabricated answers.
File Splitting
Always split PRDs into multiple files to maintain readability and enable parallel editing:
- Create an index file — Main PRD file that references sub-files
- Split logically — Group related content into separate files
- Index file structure — Include problem statement, goals, non-goals, and links to sub-files
__docs/prd/
├── feature-name.md # Index file
└── feature-name/ # PRD sub-directory
├── overview.md # Problem, goals, non-goals, user stories
├── functional-reqs.md # All FR-X requirements
└── acceptance-criteria.md # All acceptance criteria
The index file MUST:
- Contain the problem statement and executive summary
- Link to all sub-files
- Serve as the entry point for reading the PRD
Write the file
Write to a directory structure, not a single file:
__docs/prd/<feature-name>.md→ Index file (with YAML frontmatter)__docs/prd/<feature-name>/→ Sub-directory containing the parts
Frontmatter for PRD files — Every PRD index file should start with:
---
title: <feature-name in title case>
date: yyyy-mm-dd format
author: git config --get user.name (fallback to git config --get user.email)
---
Example: If the feature is user-password-reset, the frontmatter would be:
---
title: User Password Reset
date: 2026-03-30
author: John Doe
---
Report
Summarize what was created and flag any open questions that need resolution before implementation.
Example: User Password Reset PRD
Given the request: "We need to let users reset their passwords"
Step 1 — Clarify: Users currently have no self-service recovery.
Support team handles ~50 reset requests/week manually.
Step 2 — Research: Read auth module, found existing session management
in src/auth/. No existing reset flow. Uses JWT tokens.
Step 3 — Feature name: user-password-reset
Step 4 — Draft (abbreviated):
Problem: Users who forget passwords must contact support,
creating ~50 tickets/week and 24hr average resolution time.
Goals:
- Self-service password reset via email
- Reduce support tickets for password resets by 90%
Non-Goals:
- Account recovery for deleted accounts
- Password reset via SMS (future phase)
- Changing password policies or complexity rules
User Stories:
- As a user who forgot my password, I want to receive a reset
link via email so I can regain access without contacting support.
- As a user, I want confirmation that my password was changed
so I know the reset succeeded.
Functional Requirements:
- FR-1: System sends a reset email with a unique, time-limited token
- FR-2: Reset tokens expire after 1 hour
- FR-3: Reset tokens are single-use
Acceptance Criteria (for FR-1):
- Given a registered email, when the user requests a reset,
then an email with a reset link is sent within 60 seconds.
- Given an unregistered email, when the user requests a reset,
then the same success message is shown (no email enumeration).
Open Questions:
- Should we invalidate existing sessions on password reset?
- What's the rate limit for reset requests per email?
Step 5 — Write to:
- __docs/prd/user-password-reset.md (index file with frontmatter)
- __docs/prd/user-password-reset/overview.md
- __docs/prd/user-password-reset/functional-reqs.md
- __docs/prd/user-password-reset/acceptance-criteria.md
Writing Good Requirements — Common Mistakes
| Mistake | Example | Fix |
|---|---|---|
| Vague requirement | "System should be fast" | "Page loads in < 2s on 3G" |
| Untestable criterion | "User has a good experience" | "User completes flow in < 3 steps" |
| Solution disguised as requirement | "Use Redis for caching" | "Frequently accessed data loads in < 100ms" (let tech design choose HOW) |
| Missing non-goal | Goals list everything to build | Add what's explicitly OUT — prevents scope creep |
| AND in a requirement | "FR-1: User can reset password and update email" | Split into FR-1 and FR-2 |
Constraints
- NEVER invent requirements — if context is insufficient, list items under Open Questions
- NEVER specify implementation details in functional requirements (that's for tech design)
- NEVER skip Non-Goals — they are the most valuable section for preventing scope creep
- ALWAYS number functional requirements (FR-1, FR-2...) for traceability
- ALWAYS write acceptance criteria as testable pass/fail conditions
- ALWAYS split PRDs into multiple files (index + sub-directory)
- ALWAYS include YAML frontmatter in the index file
- ALWAYS write index file to
__docs/prd/<feature-name>.md - ALWAYS write sub-files to
__docs/prd/<feature-name>/
Recommended Agent Skills
Expand your agent's capabilities with these related and highly-rated skills.
pull-request
Analyzes branch diffs, drafts PR titles and bodies following Conventional Commits, and creates or updates pull requests via GitHub CLI. Use when user asks to "create a PR", "open a pull request", "update PR description", "draft a PR", or "submit changes for review".
commit
Analyzes repository state, proposes commit messages following Conventional Commits, and applies commits after user approval. Use when asked to "commit", "commit changes", "save my work", "create a commit", or "stage and commit".
review
Performs code review analysis across Quality, Regression, Documentation, and Performance focus areas with severity-classified findings. Use when user asks to "review code", "review this PR", "check code quality", "review changes", or "do a code review".
check
Verifies code quality through linting, type-checking, formatting, and testing. Use when asked to "run checks", "validate code", "lint this", "check for errors", "run tests", or "verify code quality" before or after changes.
task-breakdown
Decomposes complex goals into atomic, dependency-aware work items with execution plans. Use when asked to "break down this task", "create a task plan", "decompose this goal", "split this work", "plan the implementation", "what are the steps", or "create an execution plan".
code
Implements features, fixes bugs, refactors code, and writes unit and integration tests. Use when asked to "implement", "fix a bug", "refactor", "add a feature", "write tests", "add test coverage", or "update code".
Didn't find tool you were looking for?