speckit-specify
Create or update the feature specification from a natural language feature description.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
메뉴
Create or update the feature specification from a natural language feature description.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
SOC 직업 분류 기준
Push the LLM to reconsider, refine, and improve its recent output. Use when user asks for deeper critique or mentions a known deeper critique method, e.g. socratic, first principles, pre-mortem, red team.
System architect and technical design leader. Use when the user asks to talk to Winston or requests the architect.
Senior software engineer for story execution and code implementation. Use when the user asks to talk to Amelia or requests the developer agent.
Facilitate interactive brainstorming sessions using diverse creative techniques and ideation methods. Use when the user says help me brainstorm or help me ideate.
Review code changes adversarially using parallel review layers (Blind Hunter, Edge Case Hunter, Acceptance Auditor) with structured triage into actionable categories. Use when the user says "run code review" or "review this code"
Break requirements into epics and user stories. Use when the user says "create the epics and stories list"
| name | speckit-specify |
| description | Create or update the feature specification from a natural language feature description. |
| metadata | {"compatibility":"Requires spec-kit project structure with .specify/ directory","author":"github-spec-kit","source":"templates/commands/specify.md"} |
$ARGUMENTS
You MUST consider the user input before proceeding (if not empty).
Check for extension hooks (before specification):
Check if .specify/extensions.yml exists in the project root.
If it exists, read it and look for entries under the hooks.before_specify key
If the YAML cannot be parsed or is invalid, skip hook checking silently and continue normally
Filter out hooks where enabled is explicitly false. Treat hooks without an enabled field as enabled by default.
For each remaining hook, do not attempt to interpret or evaluate hook condition expressions:
condition field, or it is null/empty, treat the hook as executablecondition, skip the hook and leave condition evaluation to the HookExecutor implementationFor each executable hook, output the following based on its optional flag:
Optional hook (optional: true):
## Extension Hooks
**Optional Pre-Hook**: {extension}
Command: `/{command}`
Description: {description}
Prompt: {prompt}
To execute: `/{command}`
Mandatory hook (optional: false):
## Extension Hooks
**Automatic Pre-Hook**: {extension}
Executing: `/{command}`
EXECUTE_COMMAND: {command}
Wait for the result of the hook command before proceeding to the Outline.
If no hooks are registered or .specify/extensions.yml does not exist, skip silently
The text the user typed after /speckit-specify in the triggering message is the feature description. Assume you always have it available in this conversation even if $ARGUMENTS appears literally below. Do not ask the user to repeat it unless they provided an empty command.
Given that feature description, do this:
Generate a concise short name (2-4 words) for the feature:
Functional requirement grouping before directory creation:
FR(Functional Requirement) list from the user input.FR(Functional Requirement).FR(Functional Requirement) by using broad wording, parent requirements, combined verbs, or notes.FR(Functional Requirement) unless they introduce a required business behavior.FR(Functional Requirement) items by Miller's Law(米勒定律), using exactly 3 FR(Functional Requirement) items as the fixed cognitive load target for each generated spec.md.FR(Functional Requirement) items. A final remainder spec may contain 1 or 2 FR(Functional Requirement) items only when fewer than 3 items remain.FR(Functional Requirement) items and the items are related, continue with one spec.FR(Functional Requirement) items, group related FR(Functional Requirement) items into separate spec slices before creating directories.FR(Functional Requirement) items in the same spec slice when they describe the same business workflow, capability boundary, lifecycle phase, actor goal, or decision boundary.FR(Functional Requirement) items into separate specs only to create more specs, but do split it when it exceeds the 3 item upper bound.FR(Functional Requirement) unless every FR(Functional Requirement) is genuinely independent from the others.FR(Functional Requirement) items, split that group by a smaller business phase or sub-capability, and explain the dependency between the resulting specs.001-1, 001-2, 001-3.FR(Functional Requirement) items for one governance workflow should produce related specs such as 001-1, 001-2, 001-3, and 001-10, with each spec holding a coherent 3 item group.Branch creation (optional, via hook):
If a before_specify hook ran successfully in the Pre-Execution Checks above, it will have created/switched to a git branch and output JSON containing BRANCH_NAME and FEATURE_NUM. Note these values for reference, but the branch name does not dictate the spec directory name.
If the user explicitly provided GIT_BRANCH_NAME, pass it through to the hook so the branch script uses the exact value as the branch name (bypassing all prefix/suffix generation).
Create the spec feature directories:
Specs live under the default specs/ directory unless the user explicitly provides SPECIFY_FEATURE_DIRECTORY or SPECIFY_FEATURE_DIRECTORIES.
Resolution order for SPECIFY_FEATURE_DIRECTORY:
SPECIFY_FEATURE_DIRECTORIES as an ordered list, use those paths as-is for multiple related specsSPECIFY_FEATURE_DIRECTORY (e.g., via environment variable, argument, or configuration), use it as-is for one spec
SPECIFY_FEATURE_DIRECTORY as the base directory stem and derive related paths with ordered child suffixes, for example specs/001-governance-1, specs/001-governance-2specs/:
.specify/init-options.json for branch_numbering"timestamp": prefix is YYYYMMDD-HHMMSS (current timestamp)"sequential" or absent: prefix is NNN (next available 3-digit number after scanning existing directories in specs/)<prefix>-<short-name> (e.g., 003-user-auth or 20260319-143022-user-auth)"sequential" or absent: use one shared base prefix plus an ordered child number, for example 001-1, 001-2, 001-3, 001-4"timestamp": use one shared timestamp plus an ordered child number, for example 20260319-143022-1, 20260319-143022-2SPECIFY_FEATURE_DIRECTORIES to the ordered list of resolved spec directories.SPECIFY_FEATURE_DIRECTORY to the single resolved directory, or to the first resolved directory when multiple related specs are generated.Create the directory and spec file:
mkdir -p SPECIFY_FEATURE_DIRECTORY.specify/templates/spec-template.md to SPECIFY_FEATURE_DIRECTORY/spec.md as the starting pointSPEC_FILE to SPECIFY_FEATURE_DIRECTORY/spec.md.specify/feature.json:
{
"feature_directory": "<resolved feature dir>"
}
Write the actual resolved directory path value (for example, specs/003-user-auth), not the literal string SPECIFY_FEATURE_DIRECTORY.
This allows downstream commands (/speckit-plan, /speckit-tasks, etc.) to locate the feature directory without relying on git branch name conventions..specify/feature.json:
{
"feature_directory": "<first resolved feature dir>",
"active_feature_directory": "<first resolved feature dir>",
"feature_directories": [
"<first resolved feature dir>",
"<second resolved feature dir>"
]
}
active_feature_directory is the first slice that should enter planning first. feature_directories is the complete ordered split result. Related split specs must keep their shared base number visible in these paths.IMPORTANT:
FR(Functional Requirement) group or sub-group.spec.md at the fixed 3 FR(Functional Requirement) size when possible.FR(Functional Requirement) items in any generated spec.md./speckit-specify invocation may create multiple related spec directories when the user input requires more than 3 FR(Functional Requirement) items.Load .specify/templates/spec-template.md to understand required sections.
Follow this execution flow:
Write each specification to its own SPEC_FILE using the template structure, replacing placeholders with concrete details derived from the feature description and that spec slice while preserving section order and headings.
SPEC_FILE.SPEC_FILE per slice and keep each slice's functional requirements, scenarios, edge cases, entities, assumptions, and success criteria scoped to that slice.Specification Quality Validation: After writing the initial spec or specs, validate each spec against quality criteria:
a. Create Spec Quality Checklist: Generate a checklist file at each SPECIFY_FEATURE_DIRECTORY/checklists/requirements.md using the checklist template structure with these validation items:
# Specification Quality Checklist: [FEATURE NAME]
**Purpose**: Validate specification completeness and quality before proceeding to planning
**Created**: [DATE]
**Feature**: [Link to spec.md]
## Content Quality
- [ ] No implementation details (languages, frameworks, APIs)
- [ ] Focused on user value and business needs
- [ ] Written for non-technical stakeholders
- [ ] All mandatory sections completed
## Requirement Completeness
- [ ] No [NEEDS CLARIFICATION] markers remain
- [ ] Requirements are testable and unambiguous
- [ ] Success criteria are measurable
- [ ] Success criteria are technology-agnostic (no implementation details)
- [ ] All acceptance scenarios are defined
- [ ] Edge cases are identified
- [ ] Scope is clearly bounded
- [ ] Dependencies and assumptions identified
## Feature Readiness
- [ ] All functional requirements have clear acceptance criteria
- [ ] User scenarios cover primary flows
- [ ] Feature meets measurable outcomes defined in Success Criteria
- [ ] No implementation details leak into specification
## Notes
- Items marked incomplete require spec updates before `/speckit-clarify` or `/speckit-plan`
b. Run Validation Check: Review the spec against each checklist item:
c. Handle Validation Results:
If all items pass: Mark checklist complete and proceed to reporting
If items fail (excluding [NEEDS CLARIFICATION]):
If [NEEDS CLARIFICATION] markers remain:
Extract all [NEEDS CLARIFICATION: ...] markers from the spec
LIMIT CHECK: If more than 3 markers exist, keep only the 3 most critical (by scope/security/UX impact) and make informed guesses for the rest
For each clarification needed (max 3), present options to user in this format:
## Question [N]: [Topic]
**Context**: [Quote relevant spec section]
**What we need to know**: [Specific question from NEEDS CLARIFICATION marker]
**Suggested Answers**:
| Option | Answer | Implications |
| ------ | ------------------------- | ------------------------------------- |
| A | [First suggested answer] | [What this means for the feature] |
| B | [Second suggested answer] | [What this means for the feature] |
| C | [Third suggested answer] | [What this means for the feature] |
| Custom | Provide your own answer | [Explain how to provide custom input] |
**Your choice**: _[Wait for user response]_
CRITICAL - Table Formatting: Ensure markdown tables are properly formatted:
| Content | not |Content||--------|Number questions sequentially (Q1, Q2, Q3 - max 3 total)
Present all questions together before waiting for responses
Wait for user to respond with their choices for all questions (e.g., "Q1: A, Q2: Custom - [details], Q3: B")
Update the spec by replacing each [NEEDS CLARIFICATION] marker with the user's selected or provided answer
Re-run validation after all clarifications are resolved
d. Update Checklist: After each validation iteration, update the checklist file with current pass/fail status
Report completion to the user with:
SPECIFY_FEATURE_DIRECTORY — the feature directory pathSPEC_FILE — the spec file pathSPECIFY_FEATURE_DIRECTORIES — the ordered feature directory pathsSPEC_FILES — the ordered spec file pathsactive_feature_directory — the first spec that should enter planning first/speckit-clarify or /speckit-plan)Check for extension hooks: After reporting completion, check if .specify/extensions.yml exists in the project root.
If it exists, read it and look for entries under the hooks.after_specify key
If the YAML cannot be parsed or is invalid, skip hook checking silently and continue normally
Filter out hooks where enabled is explicitly false. Treat hooks without an enabled field as enabled by default.
For each remaining hook, do not attempt to interpret or evaluate hook condition expressions:
condition field, or it is null/empty, treat the hook as executablecondition, skip the hook and leave condition evaluation to the HookExecutor implementationFor each executable hook, output the following based on its optional flag:
Optional hook (optional: true):
## Extension Hooks
**Optional Hook**: {extension}
Command: `/{command}`
Description: {description}
Prompt: {prompt}
To execute: `/{command}`
Mandatory hook (optional: false):
## Extension Hooks
**Automatic Hook**: {extension}
Executing: `/{command}`
EXECUTE_COMMAND: {command}
If no hooks are registered or .specify/extensions.yml does not exist, skip silently
NOTE: Branch creation is handled by the before_specify hook (git extension). Spec directory and file creation are always handled by this core command.
When creating this spec from a user prompt:
Examples of reasonable defaults (don't ask about these):
Success criteria must be:
Good examples:
Bad examples (implementation-focused):