Compare commits
33 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e3b456c4c8 | ||
|
|
e04175b51e | ||
|
|
cc75a22e45 | ||
|
|
b2f749ef41 | ||
|
|
321edbc62e | ||
|
|
fadd250a98 | ||
|
|
9ff9c9fd8d | ||
|
|
45f04abd38 | ||
|
|
1c0e7d14d5 | ||
|
|
55555eb39e | ||
|
|
6f3e450cd8 | ||
|
|
8bbacd4adb | ||
|
|
6a3e81f813 | ||
|
|
eb3c63fe0f | ||
|
|
68eba52a40 | ||
|
|
721ecc9bec | ||
|
|
df3e4930cc | ||
|
|
f3d55cff84 | ||
|
|
c6051a0b8a | ||
|
|
04cb5f00d4 | ||
|
|
e924a73625 | ||
|
|
e642acaea4 | ||
|
|
f1ddf33ac4 | ||
|
|
f1063321c6 | ||
|
|
62f20c601c | ||
|
|
26645103a6 | ||
|
|
a4b86f7571 | ||
|
|
adc1417b0f | ||
|
|
c4698b623b | ||
|
|
2c373aa47a | ||
|
|
a0faa222c8 | ||
|
|
c7b61f4bfd | ||
|
|
bc101a4578 |
14
CHANGELOG.md
14
CHANGELOG.md
@@ -7,6 +7,20 @@ All notable changes to the Specify CLI will be documented in this file.
|
|||||||
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
||||||
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
||||||
|
|
||||||
|
## [LATEST_VERSION] - RELEASE_DATE
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- Support for using `.` as a shorthand for current directory in `specify init .` command, equivalent to `--here` flag but more intuitive for users
|
||||||
|
|
||||||
|
## [0.0.17] - 2025-09-22
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- New `/clarify` command template to surface up to 5 targeted clarification questions for an existing spec and persist answers into a Clarifications section in the spec.
|
||||||
|
- New `/analyze` command template providing a non-destructive cross-artifact discrepancy and alignment report (spec, clarifications, plan, tasks, constitution) inserted after `/tasks` and before `/implement`.
|
||||||
|
- Note: Constitution rules are explicitly treated as non-negotiable; any conflict is a CRITICAL finding requiring artifact remediation, not weakening of principles.
|
||||||
|
|
||||||
## [0.0.16] - 2025-09-22
|
## [0.0.16] - 2025-09-22
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
|
|||||||
@@ -47,12 +47,40 @@ When working on spec-kit:
|
|||||||
|
|
||||||
## AI contributions in Spec Kit
|
## AI contributions in Spec Kit
|
||||||
|
|
||||||
|
> [!IMPORTANT]
|
||||||
|
>
|
||||||
|
> If you are using **any kind of AI assistance** to contribute to Spec Kit,
|
||||||
|
> it must be disclosed in the pull request or issue.
|
||||||
|
|
||||||
We welcome and encourage the use of AI tools to help improve Spec Kit! Many valuable contributions have been enhanced with AI assistance for code generation, issue detection, and feature definition.
|
We welcome and encourage the use of AI tools to help improve Spec Kit! Many valuable contributions have been enhanced with AI assistance for code generation, issue detection, and feature definition.
|
||||||
|
|
||||||
|
That being said, if you are using any kind of AI assistance (e.g., agents, ChatGPT) while contributing to Spec Kit,
|
||||||
|
**this must be disclosed in the pull request or issue**, along with the extent to which AI assistance was used (e.g., documentation comments vs. code generation).
|
||||||
|
|
||||||
|
If your PR responses or comments are being generated by an AI, disclose that as well.
|
||||||
|
|
||||||
|
As an exception, trivial spacing or typo fixes don't need to be disclosed, so long as the changes are limited to small parts of the code or short phrases.
|
||||||
|
|
||||||
|
An example disclosure:
|
||||||
|
|
||||||
|
> This PR was written primarily by GitHub Copilot.
|
||||||
|
|
||||||
|
Or a more detailed disclosure:
|
||||||
|
|
||||||
|
> I consulted ChatGPT to understand the codebase but the solution
|
||||||
|
> was fully authored manually by myself.
|
||||||
|
|
||||||
|
Failure to disclose this is first and foremost rude to the human operators on the other end of the pull request, but it also makes it difficult to
|
||||||
|
determine how much scrutiny to apply to the contribution.
|
||||||
|
|
||||||
|
In a perfect world, AI assistance would produce equal or higher quality work than any human. That isn't the world we live in today, and in most cases
|
||||||
|
where human supervision or expertise is not in the loop, it's generating code that cannot be reasonably maintained or evolved.
|
||||||
|
|
||||||
### What we're looking for
|
### What we're looking for
|
||||||
|
|
||||||
When submitting AI-assisted contributions, please ensure they include:
|
When submitting AI-assisted contributions, please ensure they include:
|
||||||
|
|
||||||
|
- **Clear disclosure of AI use** - You are transparent about AI use and degree to which you're using it for the contribution
|
||||||
- **Human understanding and testing** - You've personally tested the changes and understand what they do
|
- **Human understanding and testing** - You've personally tested the changes and understand what they do
|
||||||
- **Clear rationale** - You can explain why the change is needed and how it fits within Spec Kit's goals
|
- **Clear rationale** - You can explain why the change is needed and how it fits within Spec Kit's goals
|
||||||
- **Concrete evidence** - Include test cases, scenarios, or examples that demonstrate the improvement
|
- **Concrete evidence** - Include test cases, scenarios, or examples that demonstrate the improvement
|
||||||
@@ -72,6 +100,8 @@ The key is demonstrating that you understand and have validated your proposed ch
|
|||||||
|
|
||||||
Contributors who consistently submit low-effort AI-generated changes may be restricted from further contributions at the maintainers' discretion.
|
Contributors who consistently submit low-effort AI-generated changes may be restricted from further contributions at the maintainers' discretion.
|
||||||
|
|
||||||
|
Please be respectful to maintainers and disclose AI assistance.
|
||||||
|
|
||||||
## Resources
|
## Resources
|
||||||
|
|
||||||
- [Spec-Driven Development Methodology](./spec-driven.md)
|
- [Spec-Driven Development Methodology](./spec-driven.md)
|
||||||
|
|||||||
64
README.md
64
README.md
@@ -150,13 +150,13 @@ The `specify` command supports the following options:
|
|||||||
|
|
||||||
| Argument/Option | Type | Description |
|
| Argument/Option | Type | Description |
|
||||||
|------------------------|----------|------------------------------------------------------------------------------|
|
|------------------------|----------|------------------------------------------------------------------------------|
|
||||||
| `<project-name>` | Argument | Name for your new project directory (optional if using `--here`) |
|
| `<project-name>` | Argument | Name for your new project directory (optional if using `--here`, or use `.` for current directory) |
|
||||||
| `--ai` | Option | AI assistant to use: `claude`, `gemini`, `copilot`, `cursor`, `qwen`, `opencode`, `codex`, `windsurf`, `kilocode`, `auggie`, or `roo` |
|
| `--ai` | Option | AI assistant to use: `claude`, `gemini`, `copilot`, `cursor`, `qwen`, `opencode`, `codex`, `windsurf`, `kilocode`, `auggie`, or `roo` |
|
||||||
| `--script` | Option | Script variant to use: `sh` (bash/zsh) or `ps` (PowerShell) |
|
| `--script` | Option | Script variant to use: `sh` (bash/zsh) or `ps` (PowerShell) |
|
||||||
| `--ignore-agent-tools` | Flag | Skip checks for AI agent tools like Claude Code |
|
| `--ignore-agent-tools` | Flag | Skip checks for AI agent tools like Claude Code |
|
||||||
| `--no-git` | Flag | Skip git repository initialization |
|
| `--no-git` | Flag | Skip git repository initialization |
|
||||||
| `--here` | Flag | Initialize project in the current directory instead of creating a new one |
|
| `--here` | Flag | Initialize project in the current directory instead of creating a new one |
|
||||||
| `--force` | Flag | Force merge/overwrite when using `--here` in a non-empty directory (skip confirmation) |
|
| `--force` | Flag | Force merge/overwrite when initializing in current directory (skip confirmation) |
|
||||||
| `--skip-tls` | Flag | Skip SSL/TLS verification (not recommended) |
|
| `--skip-tls` | Flag | Skip SSL/TLS verification (not recommended) |
|
||||||
| `--debug` | Flag | Enable detailed debug output for troubleshooting |
|
| `--debug` | Flag | Enable detailed debug output for troubleshooting |
|
||||||
| `--github-token` | Option | GitHub token for API requests (or set GH_TOKEN/GITHUB_TOKEN env variable) |
|
| `--github-token` | Option | GitHub token for API requests (or set GH_TOKEN/GITHUB_TOKEN env variable) |
|
||||||
@@ -180,9 +180,13 @@ specify init my-project --ai windsurf
|
|||||||
specify init my-project --ai copilot --script ps
|
specify init my-project --ai copilot --script ps
|
||||||
|
|
||||||
# Initialize in current directory
|
# Initialize in current directory
|
||||||
|
specify init . --ai copilot
|
||||||
|
# or use the --here flag
|
||||||
specify init --here --ai copilot
|
specify init --here --ai copilot
|
||||||
|
|
||||||
# Force merge into current (non-empty) directory without confirmation
|
# Force merge into current (non-empty) directory without confirmation
|
||||||
|
specify init . --force --ai copilot
|
||||||
|
# or
|
||||||
specify init --here --force --ai copilot
|
specify init --here --force --ai copilot
|
||||||
|
|
||||||
# Skip git initialization
|
# Skip git initialization
|
||||||
@@ -206,8 +210,10 @@ After running `specify init`, your AI coding agent will have access to these sla
|
|||||||
|-----------------|-----------------------------------------------------------------------|
|
|-----------------|-----------------------------------------------------------------------|
|
||||||
| `/constitution` | Create or update project governing principles and development guidelines |
|
| `/constitution` | Create or update project governing principles and development guidelines |
|
||||||
| `/specify` | Define what you want to build (requirements and user stories) |
|
| `/specify` | Define what you want to build (requirements and user stories) |
|
||||||
|
| `/clarify` | Clarify underspecified areas (must be run before `/plan` unless explicitly skipped; formerly `/quizme`) |
|
||||||
| `/plan` | Create technical implementation plans with your chosen tech stack |
|
| `/plan` | Create technical implementation plans with your chosen tech stack |
|
||||||
| `/tasks` | Generate actionable task lists for implementation |
|
| `/tasks` | Generate actionable task lists for implementation |
|
||||||
|
| `/analyze` | Cross-artifact consistency & coverage analysis (run after /tasks, before /implement) |
|
||||||
| `/implement` | Execute all tasks to build the feature according to the plan |
|
| `/implement` | Execute all tasks to build the feature according to the plan |
|
||||||
|
|
||||||
### Environment Variables
|
### Environment Variables
|
||||||
@@ -290,8 +296,12 @@ specify init <project_name>
|
|||||||
Or initialize in the current directory:
|
Or initialize in the current directory:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
|
specify init .
|
||||||
|
# or use the --here flag
|
||||||
specify init --here
|
specify init --here
|
||||||
# Skip confirmation when the directory already has files
|
# Skip confirmation when the directory already has files
|
||||||
|
specify init . --force
|
||||||
|
# or
|
||||||
specify init --here --force
|
specify init --here --force
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -309,9 +319,14 @@ specify init <project_name> --ai opencode
|
|||||||
specify init <project_name> --ai codex
|
specify init <project_name> --ai codex
|
||||||
specify init <project_name> --ai windsurf
|
specify init <project_name> --ai windsurf
|
||||||
# Or in current directory:
|
# Or in current directory:
|
||||||
|
specify init . --ai claude
|
||||||
|
specify init . --ai codex
|
||||||
|
# or use --here flag
|
||||||
specify init --here --ai claude
|
specify init --here --ai claude
|
||||||
specify init --here --ai codex
|
specify init --here --ai codex
|
||||||
# Force merge into a non-empty current directory
|
# Force merge into a non-empty current directory
|
||||||
|
specify init . --force --ai claude
|
||||||
|
# or
|
||||||
specify init --here --force --ai claude
|
specify init --here --force --ai claude
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -335,7 +350,7 @@ The first step should be establishing your project's governing principles using
|
|||||||
/constitution Create principles focused on code quality, testing standards, user experience consistency, and performance requirements. Include governance for how these principles should guide technical decisions and implementation choices.
|
/constitution Create principles focused on code quality, testing standards, user experience consistency, and performance requirements. Include governance for how these principles should guide technical decisions and implementation choices.
|
||||||
```
|
```
|
||||||
|
|
||||||
This step creates or updates the `/memory/constitution.md` file with your project's foundational guidelines that the AI agent will reference during specification, planning, and implementation phases.
|
This step creates or updates the `.specify/memory/constitution.md` file with your project's foundational guidelines that the AI agent will reference during specification, planning, and implementation phases.
|
||||||
|
|
||||||
### **STEP 2:** Create project specifications
|
### **STEP 2:** Create project specifications
|
||||||
|
|
||||||
@@ -374,27 +389,37 @@ The produced specification should contain a set of user stories and functional r
|
|||||||
At this stage, your project folder contents should resemble the following:
|
At this stage, your project folder contents should resemble the following:
|
||||||
|
|
||||||
```text
|
```text
|
||||||
├── memory
|
└── .specify
|
||||||
│ ├── constitution.md
|
├── memory
|
||||||
│ └── constitution_update_checklist.md
|
│ └── constitution.md
|
||||||
├── scripts
|
├── scripts
|
||||||
│ ├── check-prerequisites.sh
|
│ ├── check-prerequisites.sh
|
||||||
│ ├── common.sh
|
│ ├── common.sh
|
||||||
│ ├── create-new-feature.sh
|
│ ├── create-new-feature.sh
|
||||||
│ ├── setup-plan.sh
|
│ ├── setup-plan.sh
|
||||||
│ └── update-claude-md.sh
|
│ └── update-claude-md.sh
|
||||||
├── specs
|
├── specs
|
||||||
│ └── 001-create-taskify
|
│ └── 001-create-taskify
|
||||||
│ └── spec.md
|
│ └── spec.md
|
||||||
└── templates
|
└── templates
|
||||||
├── plan-template.md
|
├── plan-template.md
|
||||||
├── spec-template.md
|
├── spec-template.md
|
||||||
└── tasks-template.md
|
└── tasks-template.md
|
||||||
```
|
```
|
||||||
|
|
||||||
### **STEP 3:** Functional specification clarification
|
### **STEP 3:** Functional specification clarification (required before planning)
|
||||||
|
|
||||||
With the baseline specification created, you can go ahead and clarify any of the requirements that were not captured properly within the first shot attempt. For example, you could use a prompt like this within the same Claude Code session:
|
With the baseline specification created, you can go ahead and clarify any of the requirements that were not captured properly within the first shot attempt.
|
||||||
|
|
||||||
|
You should run the structured clarification workflow **before** creating a technical plan to reduce rework downstream.
|
||||||
|
|
||||||
|
Preferred order:
|
||||||
|
1. Use `/clarify` (structured) – sequential, coverage-based questioning that records answers in a Clarifications section.
|
||||||
|
2. Optionally follow up with ad-hoc free-form refinement if something still feels vague.
|
||||||
|
|
||||||
|
If you intentionally want to skip clarification (e.g., spike or exploratory prototype), explicitly state that so the agent doesn't block on missing clarifications.
|
||||||
|
|
||||||
|
Example free-form refinement prompt (after `/clarify` if still needed):
|
||||||
|
|
||||||
```text
|
```text
|
||||||
For each sample project or project that you create there should be a variable number of tasks between 5 and 15
|
For each sample project or project that you create there should be a variable number of tasks between 5 and 15
|
||||||
@@ -426,8 +451,7 @@ The output of this step will include a number of implementation detail documents
|
|||||||
.
|
.
|
||||||
├── CLAUDE.md
|
├── CLAUDE.md
|
||||||
├── memory
|
├── memory
|
||||||
│ ├── constitution.md
|
│ └── constitution.md
|
||||||
│ └── constitution_update_checklist.md
|
|
||||||
├── scripts
|
├── scripts
|
||||||
│ ├── check-prerequisites.sh
|
│ ├── check-prerequisites.sh
|
||||||
│ ├── common.sh
|
│ ├── common.sh
|
||||||
|
|||||||
@@ -55,8 +55,8 @@ Our research and experimentation focus on:
|
|||||||
|
|
||||||
## Contributing
|
## Contributing
|
||||||
|
|
||||||
Please see our [Contributing Guide](CONTRIBUTING.md) for information on how to contribute to this project.
|
Please see our [Contributing Guide](https://github.com/github/spec-kit/blob/main/CONTRIBUTING.md) for information on how to contribute to this project.
|
||||||
|
|
||||||
## Support
|
## Support
|
||||||
|
|
||||||
For support, please check our [Support Guide](SUPPORT.md) or open an issue on GitHub.
|
For support, please check our [Support Guide](https://github.com/github/spec-kit/blob/main/SUPPORT.md) or open an issue on GitHub.
|
||||||
|
|||||||
@@ -21,6 +21,8 @@ uvx --from git+https://github.com/github/spec-kit.git specify init <PROJECT_NAME
|
|||||||
Or initialize in the current directory:
|
Or initialize in the current directory:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
|
uvx --from git+https://github.com/github/spec-kit.git specify init .
|
||||||
|
# or use the --here flag
|
||||||
uvx --from git+https://github.com/github/spec-kit.git specify init --here
|
uvx --from git+https://github.com/github/spec-kit.git specify init --here
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
[project]
|
[project]
|
||||||
name = "specify-cli"
|
name = "specify-cli"
|
||||||
version = "0.0.16"
|
version = "0.0.17"
|
||||||
description = "Specify CLI, part of GitHub Spec Kit. A tool to bootstrap your projects for Spec-Driven Development (SDD)."
|
description = "Specify CLI, part of GitHub Spec Kit. A tool to bootstrap your projects for Spec-Driven Development (SDD)."
|
||||||
requires-python = ">=3.11"
|
requires-python = ">=3.11"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
|
|||||||
@@ -82,14 +82,20 @@ source "$SCRIPT_DIR/common.sh"
|
|||||||
eval $(get_feature_paths)
|
eval $(get_feature_paths)
|
||||||
check_feature_branch "$CURRENT_BRANCH" "$HAS_GIT" || exit 1
|
check_feature_branch "$CURRENT_BRANCH" "$HAS_GIT" || exit 1
|
||||||
|
|
||||||
# If paths-only mode, output paths and exit
|
# If paths-only mode, output paths and exit (support JSON + paths-only combined)
|
||||||
if $PATHS_ONLY; then
|
if $PATHS_ONLY; then
|
||||||
|
if $JSON_MODE; then
|
||||||
|
# Minimal JSON paths payload (no validation performed)
|
||||||
|
printf '{"REPO_ROOT":"%s","BRANCH":"%s","FEATURE_DIR":"%s","FEATURE_SPEC":"%s","IMPL_PLAN":"%s","TASKS":"%s"}\n' \
|
||||||
|
"$REPO_ROOT" "$CURRENT_BRANCH" "$FEATURE_DIR" "$FEATURE_SPEC" "$IMPL_PLAN" "$TASKS"
|
||||||
|
else
|
||||||
echo "REPO_ROOT: $REPO_ROOT"
|
echo "REPO_ROOT: $REPO_ROOT"
|
||||||
echo "BRANCH: $CURRENT_BRANCH"
|
echo "BRANCH: $CURRENT_BRANCH"
|
||||||
echo "FEATURE_DIR: $FEATURE_DIR"
|
echo "FEATURE_DIR: $FEATURE_DIR"
|
||||||
echo "FEATURE_SPEC: $FEATURE_SPEC"
|
echo "FEATURE_SPEC: $FEATURE_SPEC"
|
||||||
echo "IMPL_PLAN: $IMPL_PLAN"
|
echo "IMPL_PLAN: $IMPL_PLAN"
|
||||||
echo "TASKS: $TASKS"
|
echo "TASKS: $TASKS"
|
||||||
|
fi
|
||||||
exit 0
|
exit 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|||||||
@@ -80,7 +80,7 @@ fi
|
|||||||
FEATURE_DIR="$SPECS_DIR/$BRANCH_NAME"
|
FEATURE_DIR="$SPECS_DIR/$BRANCH_NAME"
|
||||||
mkdir -p "$FEATURE_DIR"
|
mkdir -p "$FEATURE_DIR"
|
||||||
|
|
||||||
TEMPLATE="$REPO_ROOT/templates/spec-template.md"
|
TEMPLATE="$REPO_ROOT/.specify/templates/spec-template.md"
|
||||||
SPEC_FILE="$FEATURE_DIR/spec.md"
|
SPEC_FILE="$FEATURE_DIR/spec.md"
|
||||||
if [ -f "$TEMPLATE" ]; then cp "$TEMPLATE" "$SPEC_FILE"; else touch "$SPEC_FILE"; fi
|
if [ -f "$TEMPLATE" ]; then cp "$TEMPLATE" "$SPEC_FILE"; else touch "$SPEC_FILE"; fi
|
||||||
|
|
||||||
|
|||||||
@@ -63,14 +63,25 @@ if (-not (Test-FeatureBranch -Branch $paths.CURRENT_BRANCH -HasGit:$paths.HAS_GI
|
|||||||
exit 1
|
exit 1
|
||||||
}
|
}
|
||||||
|
|
||||||
# If paths-only mode, output paths and exit
|
# If paths-only mode, output paths and exit (support combined -Json -PathsOnly)
|
||||||
if ($PathsOnly) {
|
if ($PathsOnly) {
|
||||||
|
if ($Json) {
|
||||||
|
[PSCustomObject]@{
|
||||||
|
REPO_ROOT = $paths.REPO_ROOT
|
||||||
|
BRANCH = $paths.CURRENT_BRANCH
|
||||||
|
FEATURE_DIR = $paths.FEATURE_DIR
|
||||||
|
FEATURE_SPEC = $paths.FEATURE_SPEC
|
||||||
|
IMPL_PLAN = $paths.IMPL_PLAN
|
||||||
|
TASKS = $paths.TASKS
|
||||||
|
} | ConvertTo-Json -Compress
|
||||||
|
} else {
|
||||||
Write-Output "REPO_ROOT: $($paths.REPO_ROOT)"
|
Write-Output "REPO_ROOT: $($paths.REPO_ROOT)"
|
||||||
Write-Output "BRANCH: $($paths.CURRENT_BRANCH)"
|
Write-Output "BRANCH: $($paths.CURRENT_BRANCH)"
|
||||||
Write-Output "FEATURE_DIR: $($paths.FEATURE_DIR)"
|
Write-Output "FEATURE_DIR: $($paths.FEATURE_DIR)"
|
||||||
Write-Output "FEATURE_SPEC: $($paths.FEATURE_SPEC)"
|
Write-Output "FEATURE_SPEC: $($paths.FEATURE_SPEC)"
|
||||||
Write-Output "IMPL_PLAN: $($paths.IMPL_PLAN)"
|
Write-Output "IMPL_PLAN: $($paths.IMPL_PLAN)"
|
||||||
Write-Output "TASKS: $($paths.TASKS)"
|
Write-Output "TASKS: $($paths.TASKS)"
|
||||||
|
}
|
||||||
exit 0
|
exit 0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -89,7 +89,7 @@ if ($hasGit) {
|
|||||||
$featureDir = Join-Path $specsDir $branchName
|
$featureDir = Join-Path $specsDir $branchName
|
||||||
New-Item -ItemType Directory -Path $featureDir -Force | Out-Null
|
New-Item -ItemType Directory -Path $featureDir -Force | Out-Null
|
||||||
|
|
||||||
$template = Join-Path $repoRoot 'templates/spec-template.md'
|
$template = Join-Path $repoRoot '.specify/templates/spec-template.md'
|
||||||
$specFile = Join-Path $featureDir 'spec.md'
|
$specFile = Join-Path $featureDir 'spec.md'
|
||||||
if (Test-Path $template) {
|
if (Test-Path $template) {
|
||||||
Copy-Item $template $specFile -Force
|
Copy-Item $template $specFile -Force
|
||||||
|
|||||||
@@ -124,7 +124,7 @@ function Extract-PlanField {
|
|||||||
if (-not (Test-Path $PlanFile)) { return '' }
|
if (-not (Test-Path $PlanFile)) { return '' }
|
||||||
# Lines like **Language/Version**: Python 3.12
|
# Lines like **Language/Version**: Python 3.12
|
||||||
$regex = "^\*\*$([Regex]::Escape($FieldPattern))\*\*: (.+)$"
|
$regex = "^\*\*$([Regex]::Escape($FieldPattern))\*\*: (.+)$"
|
||||||
Get-Content -LiteralPath $PlanFile | ForEach-Object {
|
Get-Content -LiteralPath $PlanFile -Encoding utf8 | ForEach-Object {
|
||||||
if ($_ -match $regex) {
|
if ($_ -match $regex) {
|
||||||
$val = $Matches[1].Trim()
|
$val = $Matches[1].Trim()
|
||||||
if ($val -notin @('NEEDS CLARIFICATION','N/A')) { return $val }
|
if ($val -notin @('NEEDS CLARIFICATION','N/A')) { return $val }
|
||||||
@@ -215,7 +215,7 @@ function New-AgentFile {
|
|||||||
$escaped_framework = $NEW_FRAMEWORK
|
$escaped_framework = $NEW_FRAMEWORK
|
||||||
$escaped_branch = $CURRENT_BRANCH
|
$escaped_branch = $CURRENT_BRANCH
|
||||||
|
|
||||||
$content = Get-Content -LiteralPath $temp -Raw
|
$content = Get-Content -LiteralPath $temp -Raw -Encoding utf8
|
||||||
$content = $content -replace '\[PROJECT NAME\]',$ProjectName
|
$content = $content -replace '\[PROJECT NAME\]',$ProjectName
|
||||||
$content = $content -replace '\[DATE\]',$Date.ToString('yyyy-MM-dd')
|
$content = $content -replace '\[DATE\]',$Date.ToString('yyyy-MM-dd')
|
||||||
|
|
||||||
@@ -253,7 +253,7 @@ function New-AgentFile {
|
|||||||
|
|
||||||
$parent = Split-Path -Parent $TargetFile
|
$parent = Split-Path -Parent $TargetFile
|
||||||
if (-not (Test-Path $parent)) { New-Item -ItemType Directory -Path $parent | Out-Null }
|
if (-not (Test-Path $parent)) { New-Item -ItemType Directory -Path $parent | Out-Null }
|
||||||
Set-Content -LiteralPath $TargetFile -Value $content -NoNewline
|
Set-Content -LiteralPath $TargetFile -Value $content -NoNewline -Encoding utf8
|
||||||
Remove-Item $temp -Force
|
Remove-Item $temp -Force
|
||||||
return $true
|
return $true
|
||||||
}
|
}
|
||||||
@@ -285,7 +285,7 @@ function Update-ExistingAgentFile {
|
|||||||
if ($techStack) { $newChangeEntry = "- ${CURRENT_BRANCH}: Added ${techStack}" }
|
if ($techStack) { $newChangeEntry = "- ${CURRENT_BRANCH}: Added ${techStack}" }
|
||||||
elseif ($NEW_DB -and $NEW_DB -notin @('N/A','NEEDS CLARIFICATION')) { $newChangeEntry = "- ${CURRENT_BRANCH}: Added ${NEW_DB}" }
|
elseif ($NEW_DB -and $NEW_DB -notin @('N/A','NEEDS CLARIFICATION')) { $newChangeEntry = "- ${CURRENT_BRANCH}: Added ${NEW_DB}" }
|
||||||
|
|
||||||
$lines = Get-Content -LiteralPath $TargetFile
|
$lines = Get-Content -LiteralPath $TargetFile -Encoding utf8
|
||||||
$output = New-Object System.Collections.Generic.List[string]
|
$output = New-Object System.Collections.Generic.List[string]
|
||||||
$inTech = $false; $inChanges = $false; $techAdded = $false; $changeAdded = $false; $existingChanges = 0
|
$inTech = $false; $inChanges = $false; $techAdded = $false; $changeAdded = $false; $existingChanges = 0
|
||||||
|
|
||||||
@@ -327,7 +327,7 @@ function Update-ExistingAgentFile {
|
|||||||
$newTechEntries | ForEach-Object { $output.Add($_) }
|
$newTechEntries | ForEach-Object { $output.Add($_) }
|
||||||
}
|
}
|
||||||
|
|
||||||
Set-Content -LiteralPath $TargetFile -Value ($output -join [Environment]::NewLine)
|
Set-Content -LiteralPath $TargetFile -Value ($output -join [Environment]::NewLine) -Encoding utf8
|
||||||
return $true
|
return $true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -14,11 +14,13 @@ Specify CLI - Setup tool for Specify projects
|
|||||||
|
|
||||||
Usage:
|
Usage:
|
||||||
uvx specify-cli.py init <project-name>
|
uvx specify-cli.py init <project-name>
|
||||||
|
uvx specify-cli.py init .
|
||||||
uvx specify-cli.py init --here
|
uvx specify-cli.py init --here
|
||||||
|
|
||||||
Or install globally:
|
Or install globally:
|
||||||
uv tool install --from specify-cli.py specify-cli
|
uv tool install --from specify-cli.py specify-cli
|
||||||
specify init <project-name>
|
specify init <project-name>
|
||||||
|
specify init .
|
||||||
specify init --here
|
specify init --here
|
||||||
"""
|
"""
|
||||||
|
|
||||||
@@ -192,9 +194,9 @@ def get_key():
|
|||||||
key = readchar.readkey()
|
key = readchar.readkey()
|
||||||
|
|
||||||
# Arrow keys
|
# Arrow keys
|
||||||
if key == readchar.key.UP:
|
if key == readchar.key.UP or key == readchar.key.CTRL_P:
|
||||||
return 'up'
|
return 'up'
|
||||||
if key == readchar.key.DOWN:
|
if key == readchar.key.DOWN or key == readchar.key.CTRL_N:
|
||||||
return 'down'
|
return 'down'
|
||||||
|
|
||||||
# Enter/Return
|
# Enter/Return
|
||||||
@@ -747,7 +749,7 @@ def ensure_executable_scripts(project_path: Path, tracker: StepTracker | None =
|
|||||||
|
|
||||||
@app.command()
|
@app.command()
|
||||||
def init(
|
def init(
|
||||||
project_name: str = typer.Argument(None, help="Name for your new project directory (optional if using --here)"),
|
project_name: str = typer.Argument(None, help="Name for your new project directory (optional if using --here, or use '.' for current directory)"),
|
||||||
ai_assistant: str = typer.Option(None, "--ai", help="AI assistant to use: claude, gemini, copilot, cursor, qwen, opencode, codex, windsurf, kilocode, or auggie"),
|
ai_assistant: str = typer.Option(None, "--ai", help="AI assistant to use: claude, gemini, copilot, cursor, qwen, opencode, codex, windsurf, kilocode, or auggie"),
|
||||||
script_type: str = typer.Option(None, "--script", help="Script type to use: sh or ps"),
|
script_type: str = typer.Option(None, "--script", help="Script type to use: sh or ps"),
|
||||||
ignore_agent_tools: bool = typer.Option(False, "--ignore-agent-tools", help="Skip checks for AI agent tools like Claude Code"),
|
ignore_agent_tools: bool = typer.Option(False, "--ignore-agent-tools", help="Skip checks for AI agent tools like Claude Code"),
|
||||||
@@ -781,7 +783,9 @@ def init(
|
|||||||
specify init my-project --ai windsurf
|
specify init my-project --ai windsurf
|
||||||
specify init my-project --ai auggie
|
specify init my-project --ai auggie
|
||||||
specify init --ignore-agent-tools my-project
|
specify init --ignore-agent-tools my-project
|
||||||
specify init --here --ai claude
|
specify init . --ai claude # Initialize in current directory
|
||||||
|
specify init . # Initialize in current directory (interactive AI selection)
|
||||||
|
specify init --here --ai claude # Alternative syntax for current directory
|
||||||
specify init --here --ai codex
|
specify init --here --ai codex
|
||||||
specify init --here
|
specify init --here
|
||||||
specify init --here --force # Skip confirmation when current directory not empty
|
specify init --here --force # Skip confirmation when current directory not empty
|
||||||
@@ -789,13 +793,18 @@ def init(
|
|||||||
# Show banner first
|
# Show banner first
|
||||||
show_banner()
|
show_banner()
|
||||||
|
|
||||||
|
# Handle '.' as shorthand for current directory (equivalent to --here)
|
||||||
|
if project_name == ".":
|
||||||
|
here = True
|
||||||
|
project_name = None # Clear project_name to use existing validation logic
|
||||||
|
|
||||||
# Validate arguments
|
# Validate arguments
|
||||||
if here and project_name:
|
if here and project_name:
|
||||||
console.print("[red]Error:[/red] Cannot specify both project name and --here flag")
|
console.print("[red]Error:[/red] Cannot specify both project name and --here flag")
|
||||||
raise typer.Exit(1)
|
raise typer.Exit(1)
|
||||||
|
|
||||||
if not here and not project_name:
|
if not here and not project_name:
|
||||||
console.print("[red]Error:[/red] Must specify either a project name or use --here flag")
|
console.print("[red]Error:[/red] Must specify either a project name, use '.' for current directory, or use --here flag")
|
||||||
raise typer.Exit(1)
|
raise typer.Exit(1)
|
||||||
|
|
||||||
# Determine project directory
|
# Determine project directory
|
||||||
@@ -1058,9 +1067,10 @@ def init(
|
|||||||
step_num += 1
|
step_num += 1
|
||||||
|
|
||||||
steps_lines.append(f"{step_num}. Start using slash commands with your AI agent:")
|
steps_lines.append(f"{step_num}. Start using slash commands with your AI agent:")
|
||||||
|
|
||||||
steps_lines.append(" 2.1 [cyan]/constitution[/] - Establish project principles")
|
steps_lines.append(" 2.1 [cyan]/constitution[/] - Establish project principles")
|
||||||
steps_lines.append(" 2.2 [cyan]/specify[/] - Create specifications")
|
steps_lines.append(" 2.2 [cyan]/specify[/] - Create baseline specification")
|
||||||
steps_lines.append(" 2.3 [cyan]/plan[/] - Create implementation plans")
|
steps_lines.append(" 2.3 [cyan]/plan[/] - Create implementation plan")
|
||||||
steps_lines.append(" 2.4 [cyan]/tasks[/] - Generate actionable tasks")
|
steps_lines.append(" 2.4 [cyan]/tasks[/] - Generate actionable tasks")
|
||||||
steps_lines.append(" 2.5 [cyan]/implement[/] - Execute implementation")
|
steps_lines.append(" 2.5 [cyan]/implement[/] - Execute implementation")
|
||||||
|
|
||||||
@@ -1068,6 +1078,16 @@ def init(
|
|||||||
console.print()
|
console.print()
|
||||||
console.print(steps_panel)
|
console.print(steps_panel)
|
||||||
|
|
||||||
|
enhancement_lines = [
|
||||||
|
"Optional commands that you can use for your specs [bright_black](improve quality & confidence)[/bright_black]",
|
||||||
|
"",
|
||||||
|
f"○ [cyan]/clarify[/] [bright_black](optional)[/bright_black] - Ask structured questions to de-risk ambiguous areas before planning (run before [cyan]/plan[/] if used)",
|
||||||
|
f"○ [cyan]/analyze[/] [bright_black](optional)[/bright_black] - Cross-artifact consistency & alignment report (after [cyan]/tasks[/], before [cyan]/implement[/])"
|
||||||
|
]
|
||||||
|
enhancements_panel = Panel("\n".join(enhancement_lines), title="Enhancement Commands", border_style="cyan", padding=(1,2))
|
||||||
|
console.print()
|
||||||
|
console.print(enhancements_panel)
|
||||||
|
|
||||||
if selected_ai == "codex":
|
if selected_ai == "codex":
|
||||||
warning_text = """[bold yellow]Important Note:[/bold yellow]
|
warning_text = """[bold yellow]Important Note:[/bold yellow]
|
||||||
|
|
||||||
|
|||||||
104
templates/commands/analyze.md
Normal file
104
templates/commands/analyze.md
Normal file
@@ -0,0 +1,104 @@
|
|||||||
|
---
|
||||||
|
description: Perform a non-destructive cross-artifact consistency and quality analysis across spec.md, plan.md, and tasks.md after task generation.
|
||||||
|
scripts:
|
||||||
|
sh: scripts/bash/check-prerequisites.sh --json --require-tasks --include-tasks
|
||||||
|
ps: scripts/powershell/check-prerequisites.ps1 -Json -RequireTasks -IncludeTasks
|
||||||
|
---
|
||||||
|
|
||||||
|
The user input to you can be provided directly by the agent or as a command argument - you **MUST** consider it before proceeding with the prompt (if not empty).
|
||||||
|
|
||||||
|
User input:
|
||||||
|
|
||||||
|
$ARGUMENTS
|
||||||
|
|
||||||
|
Goal: Identify inconsistencies, duplications, ambiguities, and underspecified items across the three core artifacts (`spec.md`, `plan.md`, `tasks.md`) before implementation. This command MUST run only after `/tasks` has successfully produced a complete `tasks.md`.
|
||||||
|
|
||||||
|
STRICTLY READ-ONLY: Do **not** modify any files. Output a structured analysis report. Offer an optional remediation plan (user must explicitly approve before any follow-up editing commands would be invoked manually).
|
||||||
|
|
||||||
|
Constitution Authority: The project constitution (`/memory/constitution.md`) is **non-negotiable** within this analysis scope. Constitution conflicts are automatically CRITICAL and require adjustment of the spec, plan, or tasks—not dilution, reinterpretation, or silent ignoring of the principle. If a principle itself needs to change, that must occur in a separate, explicit constitution update outside `/analyze`.
|
||||||
|
|
||||||
|
Execution steps:
|
||||||
|
|
||||||
|
1. Run `{SCRIPT}` once from repo root and parse JSON for FEATURE_DIR and AVAILABLE_DOCS. Derive absolute paths:
|
||||||
|
- SPEC = FEATURE_DIR/spec.md
|
||||||
|
- PLAN = FEATURE_DIR/plan.md
|
||||||
|
- TASKS = FEATURE_DIR/tasks.md
|
||||||
|
Abort with an error message if any required file is missing (instruct the user to run missing prerequisite command).
|
||||||
|
|
||||||
|
2. Load artifacts:
|
||||||
|
- Parse spec.md sections: Overview/Context, Functional Requirements, Non-Functional Requirements, User Stories, Edge Cases (if present).
|
||||||
|
- Parse plan.md: Architecture/stack choices, Data Model references, Phases, Technical constraints.
|
||||||
|
- Parse tasks.md: Task IDs, descriptions, phase grouping, parallel markers [P], referenced file paths.
|
||||||
|
- Load constitution `/memory/constitution.md` for principle validation.
|
||||||
|
|
||||||
|
3. Build internal semantic models:
|
||||||
|
- Requirements inventory: Each functional + non-functional requirement with a stable key (derive slug based on imperative phrase; e.g., "User can upload file" -> `user-can-upload-file`).
|
||||||
|
- User story/action inventory.
|
||||||
|
- Task coverage mapping: Map each task to one or more requirements or stories (inference by keyword / explicit reference patterns like IDs or key phrases).
|
||||||
|
- Constitution rule set: Extract principle names and any MUST/SHOULD normative statements.
|
||||||
|
|
||||||
|
4. Detection passes:
|
||||||
|
A. Duplication detection:
|
||||||
|
- Identify near-duplicate requirements. Mark lower-quality phrasing for consolidation.
|
||||||
|
B. Ambiguity detection:
|
||||||
|
- Flag vague adjectives (fast, scalable, secure, intuitive, robust) lacking measurable criteria.
|
||||||
|
- Flag unresolved placeholders (TODO, TKTK, ???, <placeholder>, etc.).
|
||||||
|
C. Underspecification:
|
||||||
|
- Requirements with verbs but missing object or measurable outcome.
|
||||||
|
- User stories missing acceptance criteria alignment.
|
||||||
|
- Tasks referencing files or components not defined in spec/plan.
|
||||||
|
D. Constitution alignment:
|
||||||
|
- Any requirement or plan element conflicting with a MUST principle.
|
||||||
|
- Missing mandated sections or quality gates from constitution.
|
||||||
|
E. Coverage gaps:
|
||||||
|
- Requirements with zero associated tasks.
|
||||||
|
- Tasks with no mapped requirement/story.
|
||||||
|
- Non-functional requirements not reflected in tasks (e.g., performance, security).
|
||||||
|
F. Inconsistency:
|
||||||
|
- Terminology drift (same concept named differently across files).
|
||||||
|
- Data entities referenced in plan but absent in spec (or vice versa).
|
||||||
|
- Task ordering contradictions (e.g., integration tasks before foundational setup tasks without dependency note).
|
||||||
|
- Conflicting requirements (e.g., one requires to use Next.js while other says to use Vue as the framework).
|
||||||
|
|
||||||
|
5. Severity assignment heuristic:
|
||||||
|
- CRITICAL: Violates constitution MUST, missing core spec artifact, or requirement with zero coverage that blocks baseline functionality.
|
||||||
|
- HIGH: Duplicate or conflicting requirement, ambiguous security/performance attribute, untestable acceptance criterion.
|
||||||
|
- MEDIUM: Terminology drift, missing non-functional task coverage, underspecified edge case.
|
||||||
|
- LOW: Style/wording improvements, minor redundancy not affecting execution order.
|
||||||
|
|
||||||
|
6. Produce a Markdown report (no file writes) with sections:
|
||||||
|
|
||||||
|
### Specification Analysis Report
|
||||||
|
| ID | Category | Severity | Location(s) | Summary | Recommendation |
|
||||||
|
|----|----------|----------|-------------|---------|----------------|
|
||||||
|
| A1 | Duplication | HIGH | spec.md:L120-134 | Two similar requirements ... | Merge phrasing; keep clearer version |
|
||||||
|
(Add one row per finding; generate stable IDs prefixed by category initial.)
|
||||||
|
|
||||||
|
Additional subsections:
|
||||||
|
- Coverage Summary Table:
|
||||||
|
| Requirement Key | Has Task? | Task IDs | Notes |
|
||||||
|
- Constitution Alignment Issues (if any)
|
||||||
|
- Unmapped Tasks (if any)
|
||||||
|
- Metrics:
|
||||||
|
* Total Requirements
|
||||||
|
* Total Tasks
|
||||||
|
* Coverage % (requirements with >=1 task)
|
||||||
|
* Ambiguity Count
|
||||||
|
* Duplication Count
|
||||||
|
* Critical Issues Count
|
||||||
|
|
||||||
|
7. At end of report, output a concise Next Actions block:
|
||||||
|
- If CRITICAL issues exist: Recommend resolving before `/implement`.
|
||||||
|
- If only LOW/MEDIUM: User may proceed, but provide improvement suggestions.
|
||||||
|
- Provide explicit command suggestions: e.g., "Run /specify with refinement", "Run /plan to adjust architecture", "Manually edit tasks.md to add coverage for 'performance-metrics'".
|
||||||
|
|
||||||
|
8. Ask the user: "Would you like me to suggest concrete remediation edits for the top N issues?" (Do NOT apply them automatically.)
|
||||||
|
|
||||||
|
Behavior rules:
|
||||||
|
- NEVER modify files.
|
||||||
|
- NEVER hallucinate missing sections—if absent, report them.
|
||||||
|
- KEEP findings deterministic: if rerun without changes, produce consistent IDs and counts.
|
||||||
|
- LIMIT total findings in the main table to 50; aggregate remainder in a summarized overflow note.
|
||||||
|
- If zero issues found, emit a success report with coverage statistics and proceed recommendation.
|
||||||
|
|
||||||
|
Context: {ARGS}
|
||||||
161
templates/commands/clarify.md
Normal file
161
templates/commands/clarify.md
Normal file
@@ -0,0 +1,161 @@
|
|||||||
|
---
|
||||||
|
description: Identify underspecified areas in the current feature spec by asking up to 5 highly targeted clarification questions and encoding answers back into the spec.
|
||||||
|
scripts:
|
||||||
|
sh: scripts/bash/check-prerequisites.sh --json --paths-only
|
||||||
|
ps: scripts/powershell/check-prerequisites.ps1 -Json -PathsOnly
|
||||||
|
---
|
||||||
|
|
||||||
|
The user input to you can be provided directly by the agent or as a command argument - you **MUST** consider it before proceeding with the prompt (if not empty).
|
||||||
|
|
||||||
|
User input:
|
||||||
|
|
||||||
|
$ARGUMENTS
|
||||||
|
|
||||||
|
Goal: Detect and reduce ambiguity or missing decision points in the active feature specification and record the clarifications directly in the spec file.
|
||||||
|
|
||||||
|
Note: This clarification workflow is expected to run (and be completed) BEFORE invoking `/plan`. If the user explicitly states they are skipping clarification (e.g., exploratory spike), you may proceed, but must warn that downstream rework risk increases.
|
||||||
|
|
||||||
|
Execution steps:
|
||||||
|
|
||||||
|
1. Run `{SCRIPT}` from repo root **once** (combined `--json --paths-only` mode / `-Json -PathsOnly`). Parse minimal JSON payload fields:
|
||||||
|
- `FEATURE_DIR`
|
||||||
|
- `FEATURE_SPEC`
|
||||||
|
- (Optionally capture `IMPL_PLAN`, `TASKS` for future chained flows.)
|
||||||
|
- If JSON parsing fails, abort and instruct user to re-run `/specify` or verify feature branch environment.
|
||||||
|
|
||||||
|
2. Load the current spec file. Perform a structured ambiguity & coverage scan using this taxonomy. For each category, mark status: Clear / Partial / Missing. Produce an internal coverage map used for prioritization (do not output raw map unless no questions will be asked).
|
||||||
|
|
||||||
|
Functional Scope & Behavior:
|
||||||
|
- Core user goals & success criteria
|
||||||
|
- Explicit out-of-scope declarations
|
||||||
|
- User roles / personas differentiation
|
||||||
|
|
||||||
|
Domain & Data Model:
|
||||||
|
- Entities, attributes, relationships
|
||||||
|
- Identity & uniqueness rules
|
||||||
|
- Lifecycle/state transitions
|
||||||
|
- Data volume / scale assumptions
|
||||||
|
|
||||||
|
Interaction & UX Flow:
|
||||||
|
- Critical user journeys / sequences
|
||||||
|
- Error/empty/loading states
|
||||||
|
- Accessibility or localization notes
|
||||||
|
|
||||||
|
Non-Functional Quality Attributes:
|
||||||
|
- Performance (latency, throughput targets)
|
||||||
|
- Scalability (horizontal/vertical, limits)
|
||||||
|
- Reliability & availability (uptime, recovery expectations)
|
||||||
|
- Observability (logging, metrics, tracing signals)
|
||||||
|
- Security & privacy (authN/Z, data protection, threat assumptions)
|
||||||
|
- Compliance / regulatory constraints (if any)
|
||||||
|
|
||||||
|
Integration & External Dependencies:
|
||||||
|
- External services/APIs and failure modes
|
||||||
|
- Data import/export formats
|
||||||
|
- Protocol/versioning assumptions
|
||||||
|
|
||||||
|
Edge Cases & Failure Handling:
|
||||||
|
- Negative scenarios
|
||||||
|
- Rate limiting / throttling
|
||||||
|
- Conflict resolution (e.g., concurrent edits)
|
||||||
|
|
||||||
|
Constraints & Tradeoffs:
|
||||||
|
- Technical constraints (language, storage, hosting)
|
||||||
|
- Explicit tradeoffs or rejected alternatives
|
||||||
|
|
||||||
|
Terminology & Consistency:
|
||||||
|
- Canonical glossary terms
|
||||||
|
- Avoided synonyms / deprecated terms
|
||||||
|
|
||||||
|
Completion Signals:
|
||||||
|
- Acceptance criteria testability
|
||||||
|
- Measurable Definition of Done style indicators
|
||||||
|
|
||||||
|
Misc / Placeholders:
|
||||||
|
- TODO markers / unresolved decisions
|
||||||
|
- Ambiguous adjectives ("robust", "intuitive") lacking quantification
|
||||||
|
|
||||||
|
For each category with Partial or Missing status, add a candidate question opportunity unless:
|
||||||
|
- Clarification would not materially change implementation or validation strategy
|
||||||
|
- Information is better deferred to planning phase (note internally)
|
||||||
|
|
||||||
|
3. Generate (internally) a prioritized queue of candidate clarification questions (maximum 5). Do NOT output them all at once. Apply these constraints:
|
||||||
|
- Maximum of 5 total questions across the whole session.
|
||||||
|
- Each question must be answerable with EITHER:
|
||||||
|
* A short multiple‑choice selection (2–5 distinct, mutually exclusive options), OR
|
||||||
|
* A one-word / short‑phrase answer (explicitly constrain: "Answer in <=5 words").
|
||||||
|
- Only include questions whose answers materially impact architecture, data modeling, task decomposition, test design, UX behavior, operational readiness, or compliance validation.
|
||||||
|
- Ensure category coverage balance: attempt to cover the highest impact unresolved categories first; avoid asking two low-impact questions when a single high-impact area (e.g., security posture) is unresolved.
|
||||||
|
- Exclude questions already answered, trivial stylistic preferences, or plan-level execution details (unless blocking correctness).
|
||||||
|
- Favor clarifications that reduce downstream rework risk or prevent misaligned acceptance tests.
|
||||||
|
- If more than 5 categories remain unresolved, select the top 5 by (Impact * Uncertainty) heuristic.
|
||||||
|
|
||||||
|
4. Sequential questioning loop (interactive):
|
||||||
|
- Present EXACTLY ONE question at a time.
|
||||||
|
- For multiple‑choice questions render options as a Markdown table:
|
||||||
|
|
||||||
|
| Option | Description |
|
||||||
|
|--------|-------------|
|
||||||
|
| A | <Option A description> |
|
||||||
|
| B | <Option B description> |
|
||||||
|
| C | <Option C description> | (add D/E as needed up to 5)
|
||||||
|
| Short | Provide a different short answer (<=5 words) | (Include only if free-form alternative is appropriate)
|
||||||
|
|
||||||
|
- For short‑answer style (no meaningful discrete options), output a single line after the question: `Format: Short answer (<=5 words)`.
|
||||||
|
- After the user answers:
|
||||||
|
* Validate the answer maps to one option or fits the <=5 word constraint.
|
||||||
|
* If ambiguous, ask for a quick disambiguation (count still belongs to same question; do not advance).
|
||||||
|
* Once satisfactory, record it in working memory (do not yet write to disk) and move to the next queued question.
|
||||||
|
- Stop asking further questions when:
|
||||||
|
* All critical ambiguities resolved early (remaining queued items become unnecessary), OR
|
||||||
|
* User signals completion ("done", "good", "no more"), OR
|
||||||
|
* You reach 5 asked questions.
|
||||||
|
- Never reveal future queued questions in advance.
|
||||||
|
- If no valid questions exist at start, immediately report no critical ambiguities.
|
||||||
|
|
||||||
|
5. Integration after EACH accepted answer (incremental update approach):
|
||||||
|
- Maintain in-memory representation of the spec (loaded once at start) plus the raw file contents.
|
||||||
|
- For the first integrated answer in this session:
|
||||||
|
* Ensure a `## Clarifications` section exists (create it just after the highest-level contextual/overview section per the spec template if missing).
|
||||||
|
* Under it, create (if not present) a `### Session YYYY-MM-DD` subheading for today.
|
||||||
|
- Append a bullet line immediately after acceptance: `- Q: <question> → A: <final answer>`.
|
||||||
|
- Then immediately apply the clarification to the most appropriate section(s):
|
||||||
|
* Functional ambiguity → Update or add a bullet in Functional Requirements.
|
||||||
|
* User interaction / actor distinction → Update User Stories or Actors subsection (if present) with clarified role, constraint, or scenario.
|
||||||
|
* Data shape / entities → Update Data Model (add fields, types, relationships) preserving ordering; note added constraints succinctly.
|
||||||
|
* Non-functional constraint → Add/modify measurable criteria in Non-Functional / Quality Attributes section (convert vague adjective to metric or explicit target).
|
||||||
|
* Edge case / negative flow → Add a new bullet under Edge Cases / Error Handling (or create such subsection if template provides placeholder for it).
|
||||||
|
* Terminology conflict → Normalize term across spec; retain original only if necessary by adding `(formerly referred to as "X")` once.
|
||||||
|
- If the clarification invalidates an earlier ambiguous statement, replace that statement instead of duplicating; leave no obsolete contradictory text.
|
||||||
|
- Save the spec file AFTER each integration to minimize risk of context loss (atomic overwrite).
|
||||||
|
- Preserve formatting: do not reorder unrelated sections; keep heading hierarchy intact.
|
||||||
|
- Keep each inserted clarification minimal and testable (avoid narrative drift).
|
||||||
|
|
||||||
|
6. Validation (performed after EACH write plus final pass):
|
||||||
|
- Clarifications session contains exactly one bullet per accepted answer (no duplicates).
|
||||||
|
- Total asked (accepted) questions ≤ 5.
|
||||||
|
- Updated sections contain no lingering vague placeholders the new answer was meant to resolve.
|
||||||
|
- No contradictory earlier statement remains (scan for now-invalid alternative choices removed).
|
||||||
|
- Markdown structure valid; only allowed new headings: `## Clarifications`, `### Session YYYY-MM-DD`.
|
||||||
|
- Terminology consistency: same canonical term used across all updated sections.
|
||||||
|
|
||||||
|
7. Write the updated spec back to `FEATURE_SPEC`.
|
||||||
|
|
||||||
|
8. Report completion (after questioning loop ends or early termination):
|
||||||
|
- Number of questions asked & answered.
|
||||||
|
- Path to updated spec.
|
||||||
|
- Sections touched (list names).
|
||||||
|
- Coverage summary table listing each taxonomy category with Status: Resolved (was Partial/Missing and addressed), Deferred (exceeds question quota or better suited for planning), Clear (already sufficient), Outstanding (still Partial/Missing but low impact).
|
||||||
|
- If any Outstanding or Deferred remain, recommend whether to proceed to `/plan` or run `/clarify` again later post-plan.
|
||||||
|
- Suggested next command.
|
||||||
|
|
||||||
|
Behavior rules:
|
||||||
|
- If no meaningful ambiguities found (or all potential questions would be low-impact), respond: "No critical ambiguities detected worth formal clarification." and suggest proceeding.
|
||||||
|
- If spec file missing, instruct user to run `/specify` first (do not create a new spec here).
|
||||||
|
- Never exceed 5 total asked questions (clarification retries for a single question do not count as new questions).
|
||||||
|
- Avoid speculative tech stack questions unless the absence blocks functional clarity.
|
||||||
|
- Respect user early termination signals ("stop", "done", "proceed").
|
||||||
|
- If no questions asked due to full coverage, output a compact coverage summary (all categories Clear) then suggest advancing.
|
||||||
|
- If quota reached with unresolved high-impact categories remaining, explicitly flag them under Deferred with rationale.
|
||||||
|
|
||||||
|
Context for prioritization: {ARGS}
|
||||||
@@ -14,6 +14,7 @@ $ARGUMENTS
|
|||||||
Given the implementation details provided as an argument, do this:
|
Given the implementation details provided as an argument, do this:
|
||||||
|
|
||||||
1. Run `{SCRIPT}` from the repo root and parse JSON for FEATURE_SPEC, IMPL_PLAN, SPECS_DIR, BRANCH. All future file paths must be absolute.
|
1. Run `{SCRIPT}` from the repo root and parse JSON for FEATURE_SPEC, IMPL_PLAN, SPECS_DIR, BRANCH. All future file paths must be absolute.
|
||||||
|
- BEFORE proceeding, inspect FEATURE_SPEC for a `## Clarifications` section with at least one `Session` subheading. If missing or clearly ambiguous areas remain (vague adjectives, unresolved critical choices), PAUSE and instruct the user to run `/clarify` first to reduce rework. Only continue if: (a) Clarifications exist OR (b) an explicit user override is provided (e.g., "proceed without clarification"). Do not attempt to fabricate clarifications yourself.
|
||||||
2. Read and analyze the feature specification to understand:
|
2. Read and analyze the feature specification to understand:
|
||||||
- The feature requirements and user stories
|
- The feature requirements and user stories
|
||||||
- Functional and non-functional requirements
|
- Functional and non-functional requirements
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ scripts:
|
|||||||
1. Load feature spec from Input path
|
1. Load feature spec from Input path
|
||||||
→ If not found: ERROR "No feature spec at {path}"
|
→ If not found: ERROR "No feature spec at {path}"
|
||||||
2. Fill Technical Context (scan for NEEDS CLARIFICATION)
|
2. Fill Technical Context (scan for NEEDS CLARIFICATION)
|
||||||
→ Detect Project Type from context (web=frontend+backend, mobile=app+api)
|
→ Detect Project Type from file system structure or context (web=frontend+backend, mobile=app+api)
|
||||||
→ Set Structure Decision based on project type
|
→ Set Structure Decision based on project type
|
||||||
3. Fill the Constitution Check section based on the content of the constitution document.
|
3. Fill the Constitution Check section based on the content of the constitution document.
|
||||||
4. Evaluate Constitution Check section below
|
4. Evaluate Constitution Check section below
|
||||||
@@ -69,8 +69,14 @@ specs/[###-feature]/
|
|||||||
```
|
```
|
||||||
|
|
||||||
### Source Code (repository root)
|
### Source Code (repository root)
|
||||||
|
<!--
|
||||||
|
ACTION REQUIRED: Replace the placeholder tree below with the concrete layout
|
||||||
|
for this feature. Delete unused options and expand the chosen structure with
|
||||||
|
real paths (e.g., apps/admin, packages/something). The delivered plan must
|
||||||
|
not include Option labels.
|
||||||
|
-->
|
||||||
```
|
```
|
||||||
# Option 1: Single project (DEFAULT)
|
# [REMOVE IF UNUSED] Option 1: Single project (DEFAULT)
|
||||||
src/
|
src/
|
||||||
├── models/
|
├── models/
|
||||||
├── services/
|
├── services/
|
||||||
@@ -82,7 +88,7 @@ tests/
|
|||||||
├── integration/
|
├── integration/
|
||||||
└── unit/
|
└── unit/
|
||||||
|
|
||||||
# Option 2: Web application (when "frontend" + "backend" detected)
|
# [REMOVE IF UNUSED] Option 2: Web application (when "frontend" + "backend" detected)
|
||||||
backend/
|
backend/
|
||||||
├── src/
|
├── src/
|
||||||
│ ├── models/
|
│ ├── models/
|
||||||
@@ -97,15 +103,16 @@ frontend/
|
|||||||
│ └── services/
|
│ └── services/
|
||||||
└── tests/
|
└── tests/
|
||||||
|
|
||||||
# Option 3: Mobile + API (when "iOS/Android" detected)
|
# [REMOVE IF UNUSED] Option 3: Mobile + API (when "iOS/Android" detected)
|
||||||
api/
|
api/
|
||||||
└── [same as backend above]
|
└── [same as backend above]
|
||||||
|
|
||||||
ios/ or android/
|
ios/ or android/
|
||||||
└── [platform-specific structure]
|
└── [platform-specific structure: feature modules, UI flows, platform tests]
|
||||||
```
|
```
|
||||||
|
|
||||||
**Structure Decision**: [DEFAULT to Option 1 unless Technical Context indicates web/mobile app]
|
**Structure Decision**: [Document the selected structure and reference the real
|
||||||
|
directories captured above]
|
||||||
|
|
||||||
## Phase 0: Outline & Research
|
## Phase 0: Outline & Research
|
||||||
1. **Extract unknowns from Technical Context** above:
|
1. **Extract unknowns from Technical Context** above:
|
||||||
|
|||||||
Reference in New Issue
Block a user