mirror of
https://github.com/github/spec-kit.git
synced 2026-07-05 05:21:48 +08:00
* Initial plan * Extract agent context updates into bundled agent-context extension * Potential fix for pull request finding 'Unused import' Co-authored-by: Copilot Autofix powered by AI <223894421+github-code-quality[bot]@users.noreply.github.com> * Potential fix for pull request finding 'Unused import' Co-authored-by: Copilot Autofix powered by AI <223894421+github-code-quality[bot]@users.noreply.github.com> * fix: address review comments on agent-context extension - bash: parse init-options.json with a single python3 invocation instead of three separate read_json_field calls, for parity with the PowerShell ConvertFrom-Json approach and to avoid divergent error semantics - bash: use parameter expansion to strip PROJECT_ROOT prefix from plan path instead of sed interpolation, avoiding special-character fragility - powershell: limit Get-ChildItem to -Depth 1 so plan.md discovery matches the bash glob specs/*/plan.md (one level deep) — fixes cross-platform inconsistency with nested plan.md files - powershell: replace Substring+Length relative-path with [System.IO.Path]::GetRelativePath for robustness across case/PSDrive differences - __init__.py: move agent-context extension install to after save_init_options so init-options.json is present when hooks run - __init__.py: seed context_markers in init-options only when context_file is truthy; avoids noise for integrations without a context file - integrations/base.py: narrow blanket except Exception in _resolve_context_markers to ImportError / (OSError, ValueError) so unexpected bugs surface instead of being silently swallowed * fix: gate context_markers in _update_init_options_for_integration on context_file Apply the same gating logic used during `specify init`: only write context_markers to init-options.json when the integration actually has a context_file set. When switching to an integration without a context file the stale markers are removed, keeping the two init paths consistent. * fix: move context_file/context_markers from init-options.json to agent-context extension config * Potential fix for pull request finding 'Unused global variable' Co-authored-by: Copilot Autofix powered by AI <223894421+github-code-quality[bot]@users.noreply.github.com> * fix: clarify local import comment in agents.py * Fix remaining agent-context review findings * Fix follow-up agent-context review issues * Address review feedback: narrow except, improve PyYAML messaging, surface config-written note * Fix double-space in PyYAML install hint message * Potential fix for pull request finding 'Empty except' Co-authored-by: Copilot Autofix powered by AI <223894421+github-code-quality[bot]@users.noreply.github.com> * Potential fix for pull request finding 'Empty except' Co-authored-by: Copilot Autofix powered by AI <223894421+github-code-quality[bot]@users.noreply.github.com> * Address latest agent-context review feedback * Harden bash config parse output handling * Clarify ImportError-only fallback comment * Apply review feedback: drop dead try/except, guard ext-config creation, explicit ConvertFrom-Yaml check * Remove redundant $Options = $null in PS1 catch block * Add constitution directives, deprecation warning, agent-context auto-install, and init flow fix - Add constitution-loading directive to specify, clarify, tasks, checklist, taskstoissues commands - Add deprecation warning (v0.12.0) in upsert_context_section() - Auto-install agent-context extension during specify init - Move context_file from init-options.json to agent-context extension config - Add tests: deprecation warning, corrupt config, constitution directives - Update file inventories across all integration tests * Address review: fix init ordering, test coverage, and hermes inventory - Move agent-context extension install after init-options.json is saved so skill registration can read ai_skills + integration key - Write extension config after install (avoids template overwriting context_file) - Fix test_defaults_when_markers_field_missing to truly test missing markers key - Update hermes tests to allow extension-installed agent-context skill * Address review: chmod ordering, preserve markers, PS1 Python check, YAML key order - Move ensure_executable_scripts after agent-context extension install so extension scripts get execute bits set - Use preserve_markers=True on reinit to keep user-customized markers - Add Python 3 version check in PowerShell fallback (matching bash behavior) - Add sort_keys=False to yaml.safe_dump for stable config output * Address review: path traversal guards and docstring fix - Reject absolute paths and '..' segments in context_file in both bash and PowerShell scripts to prevent writes outside the project root - Fix docstring in _update_init_options_for_integration to accurately describe marker preservation behavior * Address review: strict enabled check, docstring, segment-level path traversal - Use 'is not False' for enabled check so only literal False disables - Update upsert_context_section docstring to mention disabled-extension return - Fix path traversal guards to check actual path segments, not substrings (allows filenames like 'notes..md' while rejecting '../' traversal) * Address review: UnicodeError handling, missing extension warning - Add UnicodeError to exception tuples in _load_agent_context_config and _resolve_context_markers so garbled UTF-8 config files fall back to defaults - Emit error (with reinstall command) instead of silent skip when bundled agent-context extension is not found during init * Address review: bash backslash traversal guard, wheel packaging - Reject backslash separators and Windows drive-letter paths in bash context_file validation (prevents traversal on Git-Bash/Windows) - Add extensions/agent-context to pyproject.toml force-include so the bundled extension is included in wheel builds * Address review: write extension config before init-options.json - Reorder writes in _update_init_options_for_integration so the agent-context extension config is updated first; if it fails, init-options.json remains consistent with the previous state --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: Manfred Riem <15701806+mnriem@users.noreply.github.com> Co-authored-by: Copilot Autofix powered by AI <223894421+github-code-quality[bot]@users.noreply.github.com>
342 lines
17 KiB
Markdown
342 lines
17 KiB
Markdown
---
|
|
description: Create or update the feature specification from a natural language feature description.
|
|
handoffs:
|
|
- label: Build Technical Plan
|
|
agent: speckit.plan
|
|
prompt: Create a plan for the spec. I am building with...
|
|
- label: Clarify Spec Requirements
|
|
agent: speckit.clarify
|
|
prompt: Clarify specification requirements
|
|
send: true
|
|
---
|
|
|
|
## User Input
|
|
|
|
```text
|
|
$ARGUMENTS
|
|
```
|
|
|
|
You **MUST** consider the user input before proceeding (if not empty).
|
|
|
|
## Pre-Execution Checks
|
|
|
|
**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:
|
|
- If the hook has no `condition` field, or it is null/empty, treat the hook as executable
|
|
- If the hook defines a non-empty `condition`, skip the hook and leave condition evaluation to the HookExecutor implementation
|
|
- For 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
|
|
|
|
## Outline
|
|
|
|
The text the user typed after `__SPECKIT_COMMAND_SPECIFY__` in the triggering message **is** the feature description. Assume you always have it available in this conversation even if `{ARGS}` appears literally below. Do not ask the user to repeat it unless they provided an empty command.
|
|
|
|
Given that feature description, do this:
|
|
|
|
1. **Generate a concise short name** (2-4 words) for the feature:
|
|
- Analyze the feature description and extract the most meaningful keywords
|
|
- Create a 2-4 word short name that captures the essence of the feature
|
|
- Use action-noun format when possible (e.g., "add-user-auth", "fix-payment-bug")
|
|
- Preserve technical terms and acronyms (OAuth2, API, JWT, etc.)
|
|
- Keep it concise but descriptive enough to understand the feature at a glance
|
|
- Examples:
|
|
- "I want to add user authentication" → "user-auth"
|
|
- "Implement OAuth2 integration for the API" → "oauth2-api-integration"
|
|
- "Create a dashboard for analytics" → "analytics-dashboard"
|
|
- "Fix payment processing timeout bug" → "fix-payment-timeout"
|
|
|
|
2. **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).
|
|
|
|
3. **Create the spec feature directory**:
|
|
|
|
Specs live under the default `specs/` directory unless the user explicitly provides `SPECIFY_FEATURE_DIRECTORY`.
|
|
|
|
**Resolution order for `SPECIFY_FEATURE_DIRECTORY`**:
|
|
1. If the user explicitly provided `SPECIFY_FEATURE_DIRECTORY` (e.g., via environment variable, argument, or configuration), use it as-is
|
|
2. Otherwise, auto-generate it under `specs/`:
|
|
- Check `.specify/init-options.json` for `branch_numbering`
|
|
- If `"timestamp"`: prefix is `YYYYMMDD-HHMMSS` (current timestamp)
|
|
- If `"sequential"` or absent: prefix is `NNN` (next available 3-digit number after scanning existing directories in `specs/`)
|
|
- Construct the directory name: `<prefix>-<short-name>` (e.g., `003-user-auth` or `20260319-143022-user-auth`)
|
|
- Set `SPECIFY_FEATURE_DIRECTORY` to `specs/<directory-name>`
|
|
|
|
**Create the directory and spec file**:
|
|
- `mkdir -p SPECIFY_FEATURE_DIRECTORY`
|
|
- Copy `templates/spec-template.md` to `SPECIFY_FEATURE_DIRECTORY/spec.md` as the starting point
|
|
- Set `SPEC_FILE` to `SPECIFY_FEATURE_DIRECTORY/spec.md`
|
|
- Persist the resolved path to `.specify/feature.json`:
|
|
```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_COMMAND_PLAN__`, `__SPECKIT_COMMAND_TASKS__`, etc.) to locate the feature directory without relying on git branch name conventions.
|
|
|
|
**IMPORTANT**:
|
|
- You must only create one feature per `__SPECKIT_COMMAND_SPECIFY__` invocation
|
|
- The spec directory name and the git branch name are independent — they may be the same but that is the user's choice
|
|
- The spec directory and file are always created by this command, never by the hook
|
|
|
|
4. Load `templates/spec-template.md` to understand required sections.
|
|
|
|
5. **IF EXISTS**: Load `/memory/constitution.md` for project principles and governance constraints.
|
|
|
|
6. Follow this execution flow:
|
|
1. Parse user description from arguments
|
|
If empty: ERROR "No feature description provided"
|
|
2. Extract key concepts from description
|
|
Identify: actors, actions, data, constraints
|
|
3. For unclear aspects:
|
|
- Make informed guesses based on context and industry standards
|
|
- Only mark with [NEEDS CLARIFICATION: specific question] if:
|
|
- The choice significantly impacts feature scope or user experience
|
|
- Multiple reasonable interpretations exist with different implications
|
|
- No reasonable default exists
|
|
- **LIMIT: Maximum 3 [NEEDS CLARIFICATION] markers total**
|
|
- Prioritize clarifications by impact: scope > security/privacy > user experience > technical details
|
|
4. Fill User Scenarios & Testing section
|
|
If no clear user flow: ERROR "Cannot determine user scenarios"
|
|
5. Generate Functional Requirements
|
|
Each requirement must be testable
|
|
Use reasonable defaults for unspecified details (document assumptions in Assumptions section)
|
|
6. Define Success Criteria
|
|
Create measurable, technology-agnostic outcomes
|
|
Include both quantitative metrics (time, performance, volume) and qualitative measures (user satisfaction, task completion)
|
|
Each criterion must be verifiable without implementation details
|
|
7. Identify Key Entities (if data involved)
|
|
8. Return: SUCCESS (spec ready for planning)
|
|
|
|
6. Write the specification to SPEC_FILE using the template structure, replacing placeholders with concrete details derived from the feature description (arguments) while preserving section order and headings.
|
|
|
|
7. **Specification Quality Validation**: After writing the initial spec, validate it against quality criteria:
|
|
|
|
a. **Create Spec Quality Checklist**: Generate a checklist file at `SPECIFY_FEATURE_DIRECTORY/checklists/requirements.md` using the checklist template structure with these validation items:
|
|
|
|
```markdown
|
|
# 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_COMMAND_CLARIFY__` or `__SPECKIT_COMMAND_PLAN__`
|
|
```
|
|
|
|
b. **Run Validation Check**: Review the spec against each checklist item:
|
|
- For each item, determine if it passes or fails
|
|
- Document specific issues found (quote relevant spec sections)
|
|
|
|
c. **Handle Validation Results**:
|
|
|
|
- **If all items pass**: Mark checklist complete and proceed to the Mandatory Post-Execution Hooks section
|
|
|
|
- **If items fail (excluding [NEEDS CLARIFICATION])**:
|
|
1. List the failing items and specific issues
|
|
2. Update the spec to address each issue
|
|
3. Re-run validation until all items pass (max 3 iterations)
|
|
4. If still failing after 3 iterations, document remaining issues in checklist notes and warn user
|
|
|
|
- **If [NEEDS CLARIFICATION] markers remain**:
|
|
1. Extract all [NEEDS CLARIFICATION: ...] markers from the spec
|
|
2. **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
|
|
3. For each clarification needed (max 3), present options to user in this format:
|
|
|
|
```markdown
|
|
## 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]_
|
|
```
|
|
|
|
4. **CRITICAL - Table Formatting**: Ensure markdown tables are properly formatted:
|
|
- Use consistent spacing with pipes aligned
|
|
- Each cell should have spaces around content: `| Content |` not `|Content|`
|
|
- Header separator must have at least 3 dashes: `|--------|`
|
|
- Test that the table renders correctly in markdown preview
|
|
5. Number questions sequentially (Q1, Q2, Q3 - max 3 total)
|
|
6. Present all questions together before waiting for responses
|
|
7. Wait for user to respond with their choices for all questions (e.g., "Q1: A, Q2: Custom - [details], Q3: B")
|
|
8. Update the spec by replacing each [NEEDS CLARIFICATION] marker with the user's selected or provided answer
|
|
9. Re-run validation after all clarifications are resolved
|
|
|
|
d. **Update Checklist**: After each validation iteration, update the checklist file with current pass/fail status
|
|
|
|
## Mandatory Post-Execution Hooks
|
|
|
|
**You MUST complete this section before reporting completion to the user.**
|
|
|
|
Check if `.specify/extensions.yml` exists in the project root.
|
|
- If it does not exist, or no hooks are registered under `hooks.after_specify`, skip to the Completion Report.
|
|
- 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 to the Completion Report.
|
|
- 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:
|
|
- If the hook has no `condition` field, or it is null/empty, treat the hook as executable
|
|
- If the hook defines a non-empty `condition`, skip the hook and leave condition evaluation to the HookExecutor implementation
|
|
- For each executable hook, output the following based on its `optional` flag:
|
|
- **Mandatory hook** (`optional: false`) — **You MUST emit `EXECUTE_COMMAND:` for each mandatory hook**:
|
|
```
|
|
## Extension Hooks
|
|
|
|
**Automatic Hook**: {extension}
|
|
Executing: `/{command}`
|
|
EXECUTE_COMMAND: {command}
|
|
```
|
|
- **Optional hook** (`optional: true`):
|
|
```
|
|
## Extension Hooks
|
|
|
|
**Optional Hook**: {extension}
|
|
Command: `/{command}`
|
|
Description: {description}
|
|
|
|
Prompt: {prompt}
|
|
To execute: `/{command}`
|
|
```
|
|
|
|
## Completion Report
|
|
|
|
Report completion to the user with:
|
|
- `SPECIFY_FEATURE_DIRECTORY` — the feature directory path
|
|
- `SPEC_FILE` — the spec file path
|
|
- Checklist results summary
|
|
- Readiness for the next phase (`__SPECKIT_COMMAND_CLARIFY__` or `__SPECKIT_COMMAND_PLAN__`)
|
|
|
|
**NOTE:** Branch creation is handled by the `before_specify` hook (git extension). Spec directory and file creation are always handled by this core command.
|
|
|
|
## Quick Guidelines
|
|
|
|
- Focus on **WHAT** users need and **WHY**.
|
|
- Avoid HOW to implement (no tech stack, APIs, code structure).
|
|
- Written for business stakeholders, not developers.
|
|
- DO NOT create any checklists that are embedded in the spec. That will be a separate command.
|
|
|
|
### Section Requirements
|
|
|
|
- **Mandatory sections**: Must be completed for every feature
|
|
- **Optional sections**: Include only when relevant to the feature
|
|
- When a section doesn't apply, remove it entirely (don't leave as "N/A")
|
|
|
|
### For AI Generation
|
|
|
|
When creating this spec from a user prompt:
|
|
|
|
1. **Make informed guesses**: Use context, industry standards, and common patterns to fill gaps
|
|
2. **Document assumptions**: Record reasonable defaults in the Assumptions section
|
|
3. **Limit clarifications**: Maximum 3 [NEEDS CLARIFICATION] markers - use only for critical decisions that:
|
|
- Significantly impact feature scope or user experience
|
|
- Have multiple reasonable interpretations with different implications
|
|
- Lack any reasonable default
|
|
4. **Prioritize clarifications**: scope > security/privacy > user experience > technical details
|
|
5. **Think like a tester**: Every vague requirement should fail the "testable and unambiguous" checklist item
|
|
6. **Common areas needing clarification** (only if no reasonable default exists):
|
|
- Feature scope and boundaries (include/exclude specific use cases)
|
|
- User types and permissions (if multiple conflicting interpretations possible)
|
|
- Security/compliance requirements (when legally/financially significant)
|
|
|
|
**Examples of reasonable defaults** (don't ask about these):
|
|
|
|
- Data retention: Industry-standard practices for the domain
|
|
- Performance targets: Standard web/mobile app expectations unless specified
|
|
- Error handling: User-friendly messages with appropriate fallbacks
|
|
- Authentication method: Standard session-based or OAuth2 for web apps
|
|
- Integration patterns: Use project-appropriate patterns (REST/GraphQL for web services, function calls for libraries, CLI args for tools, etc.)
|
|
|
|
### Success Criteria Guidelines
|
|
|
|
Success criteria must be:
|
|
|
|
1. **Measurable**: Include specific metrics (time, percentage, count, rate)
|
|
2. **Technology-agnostic**: No mention of frameworks, languages, databases, or tools
|
|
3. **User-focused**: Describe outcomes from user/business perspective, not system internals
|
|
4. **Verifiable**: Can be tested/validated without knowing implementation details
|
|
|
|
**Good examples**:
|
|
|
|
- "Users can complete checkout in under 3 minutes"
|
|
- "System supports 10,000 concurrent users"
|
|
- "95% of searches return results in under 1 second"
|
|
- "Task completion rate improves by 40%"
|
|
|
|
**Bad examples** (implementation-focused):
|
|
|
|
- "API response time is under 200ms" (too technical, use "Users see results instantly")
|
|
- "Database can handle 1000 TPS" (implementation detail, use user-facing metric)
|
|
- "React components render efficiently" (framework-specific)
|
|
- "Redis cache hit rate above 80%" (technology-specific)
|
|
|
|
## Done When
|
|
|
|
- [ ] Specification written to `SPEC_FILE` and validated against quality checklist
|
|
- [ ] Extension hooks dispatched or skipped according to the rules in Mandatory Post-Execution Hooks above
|
|
- [ ] Completion reported to user with feature directory, spec file path, and checklist results
|