diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json
new file mode 100644
index 00000000..caf184c1
--- /dev/null
+++ b/.devcontainer/devcontainer.json
@@ -0,0 +1,77 @@
+// For format details, see https://aka.ms/devcontainer.json. For config options, see the
+// README at: https://github.com/devcontainers/templates/tree/main/src/python
+{
+ "name": "SpecKitDevContainer",
+ // Or use a Dockerfile or Docker Compose file. More info: https://containers.dev/guide/dockerfile
+ "image": "mcr.microsoft.com/devcontainers/python:3.13-trixie", // based on Debian "Trixie" (13)
+ "features": {
+ "ghcr.io/devcontainers/features/common-utils:2": {
+ "installZsh": true,
+ "installOhMyZsh": true,
+ "installOhMyZshConfig": true,
+ "upgradePackages": true,
+ "username": "devcontainer",
+ "userUid": "automatic",
+ "userGid": "automatic"
+ },
+ "ghcr.io/devcontainers/features/dotnet:2": {
+ "version": "lts"
+ },
+ "ghcr.io/devcontainers/features/git:1": {
+ "ppa": true,
+ "version": "latest"
+ },
+ "ghcr.io/devcontainers/features/node": {
+ "version": "lts"
+ }
+ },
+
+ // Use 'forwardPorts' to make a list of ports inside the container available locally.
+ "forwardPorts": [
+ 8080 // for Spec-Kit documentation site
+ ],
+ "containerUser": "devcontainer",
+ "updateRemoteUserUID": true,
+ "postCreateCommand": "chmod +x ./.devcontainer/post-create.sh && ./.devcontainer/post-create.sh",
+ "postStartCommand": "git config --global --add safe.directory ${containerWorkspaceFolder}",
+ "customizations": {
+ "vscode": {
+ "extensions": [
+ "mhutchie.git-graph",
+ "eamodio.gitlens",
+ "anweber.reveal-button",
+ "chrisdias.promptboost",
+ // Github Copilot
+ "GitHub.copilot",
+ "GitHub.copilot-chat",
+ // Codex
+ "openai.chatgpt",
+ // Kilo Code
+ "kilocode.Kilo-Code",
+ // Roo Code
+ "RooVeterinaryInc.roo-cline",
+ // Amazon Developer Q
+ "AmazonWebServices.amazon-q-vscode",
+ // Claude Code
+ "anthropic.claude-code"
+ ],
+ "settings": {
+ "debug.javascript.autoAttachFilter": "disabled", // fix running commands in integrated terminal
+
+ // Specify settings for Github Copilot
+ "git.autofetch": true,
+ "chat.promptFilesRecommendations": {
+ "speckit.constitution": true,
+ "speckit.specify": true,
+ "speckit.plan": true,
+ "speckit.tasks": true,
+ "speckit.implement": true
+ },
+ "chat.tools.terminal.autoApprove": {
+ ".specify/scripts/bash/": true,
+ ".specify/scripts/powershell/": true
+ }
+ }
+ }
+ }
+}
diff --git a/.devcontainer/post-create.sh b/.devcontainer/post-create.sh
new file mode 100755
index 00000000..9608a28a
--- /dev/null
+++ b/.devcontainer/post-create.sh
@@ -0,0 +1,100 @@
+#!/bin/bash
+
+# Exit immediately on error, treat unset variables as an error, and fail if any command in a pipeline fails.
+set -euo pipefail
+
+# Function to run a command and show logs only on error
+run_command() {
+ local command_to_run="$*"
+ local output
+ local exit_code
+
+ # Capture all output (stdout and stderr)
+ output=$(eval "$command_to_run" 2>&1) || exit_code=$?
+ exit_code=${exit_code:-0}
+
+ if [ $exit_code -ne 0 ]; then
+ echo -e "\033[0;31m[ERROR] Command failed (Exit Code $exit_code): $command_to_run\033[0m" >&2
+ echo -e "\033[0;31m$output\033[0m" >&2
+
+ exit $exit_code
+ fi
+}
+
+# Installing CLI-based AI Agents
+
+echo -e "\nπ€ Installing Copilot CLI..."
+run_command "npm install -g @github/copilot@latest"
+echo "β Done"
+
+echo -e "\nπ€ Installing Claude CLI..."
+run_command "npm install -g @anthropic-ai/claude-code@latest"
+echo "β Done"
+
+echo -e "\nπ€ Installing Codex CLI..."
+run_command "npm install -g @openai/codex@latest"
+echo "β Done"
+
+echo -e "\nπ€ Installing Gemini CLI..."
+run_command "npm install -g @google/gemini-cli@latest"
+echo "β Done"
+
+echo -e "\nπ€ Installing Augie CLI..."
+run_command "npm install -g @augmentcode/auggie@latest"
+echo "β Done"
+
+echo -e "\nπ€ Installing Qwen Code CLI..."
+run_command "npm install -g @qwen-code/qwen-code@latest"
+echo "β Done"
+
+echo -e "\nπ€ Installing OpenCode CLI..."
+run_command "npm install -g opencode-ai@latest"
+echo "β Done"
+
+echo -e "\nπ€ Installing Amazon Q CLI..."
+# ππΎ https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/command-line-verify-download.html
+
+run_command "curl --proto '=https' --tlsv1.2 -sSf 'https://desktop-release.q.us-east-1.amazonaws.com/latest/q-x86_64-linux.zip' -o 'q.zip'"
+run_command "curl --proto '=https' --tlsv1.2 -sSf 'https://desktop-release.q.us-east-1.amazonaws.com/latest/q-x86_64-linux.zip.sig' -o 'q.zip.sig'"
+cat > amazonq-public-key.asc << 'EOF'
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+
+mDMEZig60RYJKwYBBAHaRw8BAQdAy/+G05U5/EOA72WlcD4WkYn5SInri8pc4Z6D
+BKNNGOm0JEFtYXpvbiBRIENMSSBUZWFtIDxxLWNsaUBhbWF6b24uY29tPoiZBBMW
+CgBBFiEEmvYEF+gnQskUPgPsUNx6jcJMVmcFAmYoOtECGwMFCQPCZwAFCwkIBwIC
+IgIGFQoJCAsCBBYCAwECHgcCF4AACgkQUNx6jcJMVmef5QD/QWWEGG/cOnbDnp68
+SJXuFkwiNwlH2rPw9ZRIQMnfAS0A/0V6ZsGB4kOylBfc7CNfzRFGtovdBBgHqA6P
+zQ/PNscGuDgEZig60RIKKwYBBAGXVQEFAQEHQC4qleONMBCq3+wJwbZSr0vbuRba
+D1xr4wUPn4Avn4AnAwEIB4h+BBgWCgAmFiEEmvYEF+gnQskUPgPsUNx6jcJMVmcF
+AmYoOtECGwwFCQPCZwAACgkQUNx6jcJMVmchMgEA6l3RveCM0YHAGQaSFMkguoAo
+vK6FgOkDawgP0NPIP2oA/jIAO4gsAntuQgMOsPunEdDeji2t+AhV02+DQIsXZpoB
+=f8yY
+-----END PGP PUBLIC KEY BLOCK-----
+EOF
+run_command "gpg --batch --import amazonq-public-key.asc"
+run_command "gpg --verify q.zip.sig q.zip"
+run_command "unzip -q q.zip"
+run_command "chmod +x ./q/install.sh"
+run_command "./q/install.sh --no-confirm"
+run_command "rm -rf ./q q.zip q.zip.sig amazonq-public-key.asc"
+echo "β Done"
+
+echo -e "\nπ€ Installing CodeBuddy CLI..."
+run_command "npm install -g @tencent-ai/codebuddy-code@latest"
+echo "β Done"
+
+# Installing UV (Python package manager)
+echo -e "\nπ Installing UV - Python Package Manager..."
+run_command "pipx install uv"
+echo "β Done"
+
+# Installing DocFx (for documentation site)
+echo -e "\nπ Installing DocFx..."
+run_command "dotnet tool update -g docfx"
+echo "β Done"
+
+echo -e "\nπ§Ή Cleaning cache..."
+run_command "sudo apt-get autoclean"
+run_command "sudo apt-get clean"
+
+echo "β Setup completed. Happy coding! π"
diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml
new file mode 100644
index 00000000..fa20c809
--- /dev/null
+++ b/.github/workflows/lint.yml
@@ -0,0 +1,18 @@
+name: Lint
+
+on:
+ push:
+ branches: ["main"]
+ pull_request:
+
+jobs:
+ markdownlint:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v4
+
+ - name: Run markdownlint-cli2
+ uses: DavidAnson/markdownlint-cli2-action@v19
+ with:
+ globs: '**/*.md'
diff --git a/.markdownlint-cli2.jsonc b/.markdownlint-cli2.jsonc
new file mode 100644
index 00000000..a96fd3e6
--- /dev/null
+++ b/.markdownlint-cli2.jsonc
@@ -0,0 +1,24 @@
+{
+ // https://github.com/DavidAnson/markdownlint/blob/main/doc/Rules.md
+ "config": {
+ "default": true,
+ "MD003": {
+ "style": "atx"
+ },
+ "MD007": {
+ "indent": 2
+ },
+ "MD013": false,
+ "MD024": {
+ "siblings_only": true
+ },
+ "MD033": false,
+ "MD041": false,
+ "MD049": {
+ "style": "asterisk"
+ },
+ "MD050": {
+ "style": "asterisk"
+ }
+ }
+}
\ No newline at end of file
diff --git a/AGENTS.md b/AGENTS.md
index 02e43769..d34efb67 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -69,12 +69,14 @@ AGENT_CONFIG = {
```
**Key Design Principle**: The dictionary key should match the actual executable name that users install. For example:
+
- β Use `"cursor-agent"` because the CLI tool is literally called `cursor-agent`
- β Don't use `"cursor"` as a shortcut if the tool is `cursor-agent`
This eliminates the need for special-case mappings throughout the codebase.
**Field Explanations**:
+
- `name`: Human-readable display name shown to users
- `folder`: Directory where agent-specific files are stored (relative to project root)
- `install_url`: Installation documentation URL (set to `None` for IDE-based agents)
@@ -103,12 +105,14 @@ Update the **Supported AI Agents** section in `README.md` to include the new age
Modify `.github/workflows/scripts/create-release-packages.sh`:
-##### Add to ALL_AGENTS array:
+##### Add to ALL_AGENTS array
+
```bash
ALL_AGENTS=(claude gemini copilot cursor-agent qwen opencode windsurf q)
```
-##### Add case statement for directory structure:
+##### Add case statement for directory structure
+
```bash
case $agent in
# ... existing cases ...
@@ -132,14 +136,16 @@ gh release create "$VERSION" \
#### 5. Update Agent Context Scripts
-##### Bash script (`scripts/bash/update-agent-context.sh`):
+##### Bash script (`scripts/bash/update-agent-context.sh`)
Add file variable:
+
```bash
WINDSURF_FILE="$REPO_ROOT/.windsurf/rules/specify-rules.md"
```
Add to case statement:
+
```bash
case "$AGENT_TYPE" in
# ... existing cases ...
@@ -152,14 +158,16 @@ case "$AGENT_TYPE" in
esac
```
-##### PowerShell script (`scripts/powershell/update-agent-context.ps1`):
+##### PowerShell script (`scripts/powershell/update-agent-context.ps1`)
Add file variable:
+
```powershell
$windsurfFile = Join-Path $repoRoot '.windsurf/rules/specify-rules.md'
```
Add to switch statement:
+
```powershell
switch ($AgentType) {
# ... existing cases ...
@@ -201,6 +209,7 @@ elif selected_ai == "windsurf":
**CRITICAL**: When adding a new agent to AGENT_CONFIG, always use the **actual executable name** as the dictionary key, not a shortened or convenient version.
**Why this matters:**
+
- The `check_tool()` function uses `shutil.which(tool)` to find executables in the system PATH
- If the key doesn't match the actual CLI tool name, you'll need special-case mappings throughout the codebase
- This creates unnecessary complexity and maintenance burden
@@ -208,6 +217,7 @@ elif selected_ai == "windsurf":
**Example - The Cursor Lesson:**
β **Wrong approach** (requires special-case mapping):
+
```python
AGENT_CONFIG = {
"cursor": { # Shorthand that doesn't match the actual tool
@@ -223,6 +233,7 @@ if agent_key == "cursor":
```
β **Correct approach** (no mapping needed):
+
```python
AGENT_CONFIG = {
"cursor-agent": { # Matches the actual executable name
@@ -235,32 +246,83 @@ AGENT_CONFIG = {
```
**Benefits of this approach:**
+
- Eliminates special-case logic scattered throughout the codebase
- Makes the code more maintainable and easier to understand
- Reduces the chance of bugs when adding new agents
- Tool checking "just works" without additional mappings
+#### 7. Update Devcontainer files (Optional)
+
+For agents that have VS Code extensions or require CLI installation, update the devcontainer configuration files:
+
+##### VS Code Extension-based Agents
+
+For agents available as VS Code extensions, add them to `.devcontainer/devcontainer.json`:
+
+```json
+{
+ "customizations": {
+ "vscode": {
+ "extensions": [
+ // ... existing extensions ...
+ // [New Agent Name]
+ "[New Agent Extension ID]"
+ ]
+ }
+ }
+}
+```
+
+##### CLI-based Agents
+
+For agents that require CLI tools, add installation commands to `.devcontainer/post-create.sh`:
+
+```bash
+#!/bin/bash
+
+# Existing installations...
+
+echo -e "\nπ€ Installing [New Agent Name] CLI..."
+# run_command "npm install -g [agent-cli-package]@latest" # Example for node-based CLI
+# or other installation instructions (must be non-interactive and compatible with Linux Debian "Trixie" or later)...
+echo "β Done"
+
+```
+
+**Quick Tips:**
+
+- **Extension-based agents**: Add to the `extensions` array in `devcontainer.json`
+- **CLI-based agents**: Add installation scripts to `post-create.sh`
+- **Hybrid agents**: May require both extension and CLI installation
+- **Test thoroughly**: Ensure installations work in the devcontainer environment
+
## Agent Categories
### CLI-Based Agents
Require a command-line tool to be installed:
+
- **Claude Code**: `claude` CLI
- **Gemini CLI**: `gemini` CLI
- **Cursor**: `cursor-agent` CLI
- **Qwen Code**: `qwen` CLI
- **opencode**: `opencode` CLI
+- **Amazon Q Developer CLI**: `q` CLI
- **CodeBuddy CLI**: `codebuddy` CLI
- **Amp**: `amp` CLI
### IDE-Based Agents
+
Work within integrated development environments:
+
- **GitHub Copilot**: Built into VS Code/compatible editors
- **Windsurf**: Built into Windsurf IDE
## Command File Formats
### Markdown Format
+
Used by: Claude, Cursor, opencode, Windsurf, Amazon Q Developer, Amp
```markdown
@@ -272,6 +334,7 @@ Command content with {SCRIPT} and $ARGUMENTS placeholders.
```
### TOML Format
+
Used by: Gemini, Qwen
```toml
@@ -293,6 +356,7 @@ Command content with {SCRIPT} and {{args}} placeholders.
## Argument Patterns
Different agents use different argument placeholders:
+
- **Markdown/prompt-based**: `$ARGUMENTS`
- **TOML-based**: `{{args}}`
- **Script placeholders**: `{SCRIPT}` (replaced with actual script path)
@@ -328,4 +392,3 @@ When adding new agents:
---
*This documentation should be updated whenever new agents are added to maintain accuracy and completeness.*
-
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 3ca2ee00..ea672914 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -63,7 +63,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- 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.
+ - 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
@@ -140,7 +140,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Updated command instructions in the CLI.
- Cleaned up the code to not render agent-specific information when it's generic.
-
## [0.0.6] - 2025-09-17
### Added
@@ -166,4 +165,3 @@ N/A
### Changed
N/A
-
diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md
index 6dc4b121..73a27ec9 100644
--- a/CODE_OF_CONDUCT.md
+++ b/CODE_OF_CONDUCT.md
@@ -14,21 +14,21 @@ orientation.
Examples of behavior that contributes to creating a positive environment
include:
-* Using welcoming and inclusive language
-* Being respectful of differing viewpoints and experiences
-* Gracefully accepting constructive criticism
-* Focusing on what is best for the community
-* Showing empathy towards other community members
+- Using welcoming and inclusive language
+- Being respectful of differing viewpoints and experiences
+- Gracefully accepting constructive criticism
+- Focusing on what is best for the community
+- Showing empathy towards other community members
Examples of unacceptable behavior by participants include:
-* The use of sexualized language or imagery and unwelcome sexual attention or
+- The use of sexualized language or imagery and unwelcome sexual attention or
advances
-* Trolling, insulting/derogatory comments, and personal or political attacks
-* Public or private harassment
-* Publishing others' private information, such as a physical or electronic
+- Trolling, insulting/derogatory comments, and personal or political attacks
+- Public or private harassment
+- Publishing others' private information, such as a physical or electronic
address, without explicit permission
-* Other conduct which could reasonably be considered inappropriate in a
+- Other conduct which could reasonably be considered inappropriate in a
professional setting
## Our Responsibilities
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 947480d0..3e6e24aa 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -1,4 +1,4 @@
-## Contributing to Spec Kit
+# Contributing to Spec Kit
Hi there! We're thrilled that you'd like to contribute to Spec Kit. Contributions to this project are [released](https://help.github.com/articles/github-terms-of-service/#6-contributions-under-repository-license) to the public under the [project's open source license](LICENSE).
@@ -13,6 +13,23 @@ These are one time installations required to be able to test your changes locall
1. Install [Git](https://git-scm.com/downloads)
1. Have an [AI coding agent available](README.md#-supported-ai-agents)
+
+π‘ Hint if you are using VSCode or GitHub Codespaces as your IDE
+
+
+
+Provided you have [Docker](https://docker.com) installed on your machine, you can leverage [Dev Containers](https://containers.dev) through this [VSCode extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers), to easily set up your development environment, with aforementioned tools already installed and configured, thanks to the `.devcontainer/devcontainer.json` file (located at the root of the project).
+
+To do so, simply:
+
+- Checkout the repo
+- Open it with VSCode
+- Open the [Command Palette](https://code.visualstudio.com/docs/getstarted/userinterface#_command-palette) and select "Dev Containers: Open Folder in Container..."
+
+On [GitHub Codespaces](https://github.com/features/codespaces) it's even simpler, as it leverages the `.devcontainer/devcontainer.json` automatically upon opening the codespace.
+
+
+
## Submitting a pull request
>[!NOTE]
@@ -108,4 +125,3 @@ Please be respectful to maintainers and disclose AI assistance.
- [How to Contribute to Open Source](https://opensource.guide/how-to-contribute/)
- [Using Pull Requests](https://help.github.com/articles/about-pull-requests/)
- [GitHub Help](https://help.github.com)
-
diff --git a/README.md b/README.md
index 0c68dbdb..1c7dda21 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,5 @@
-
+
π± Spec Kit
Build high-quality software faster.
@@ -84,6 +84,8 @@ uvx --from git+https://github.com/github/spec-kit.git specify init [!IMPORTANT]
->Be as explicit as possible about _what_ you are trying to build and _why_. **Do not focus on the tech stack at this point**.
+>Be as explicit as possible about *what* you are trying to build and *why*. **Do not focus on the tech stack at this point**.
An example prompt:
@@ -419,16 +421,16 @@ At this stage, your project folder contents should resemble the following:
```text
βββ .specify
βββ memory
- β βββ constitution.md
+ β βββ constitution.md
βββ scripts
- β βββ check-prerequisites.sh
- β βββ common.sh
- β βββ create-new-feature.sh
- β βββ setup-plan.sh
- β βββ update-claude-md.sh
+ β βββ check-prerequisites.sh
+ β βββ common.sh
+ β βββ create-new-feature.sh
+ β βββ setup-plan.sh
+ β βββ update-claude-md.sh
βββ specs
- β βββ 001-create-taskify
- β βββ spec.md
+ β βββ 001-create-taskify
+ β βββ spec.md
βββ templates
βββ plan-template.md
βββ spec-template.md
@@ -442,6 +444,7 @@ With the baseline specification created, you can go ahead and clarify any of the
You should run the structured clarification workflow **before** creating a technical plan to reduce rework downstream.
Preferred order:
+
1. Use `/speckit.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.
@@ -479,23 +482,23 @@ The output of this step will include a number of implementation detail documents
.
βββ CLAUDE.md
βββ memory
-β βββ constitution.md
+β βββ constitution.md
βββ scripts
-β βββ check-prerequisites.sh
-β βββ common.sh
-β βββ create-new-feature.sh
-β βββ setup-plan.sh
-β βββ update-claude-md.sh
+β βββ check-prerequisites.sh
+β βββ common.sh
+β βββ create-new-feature.sh
+β βββ setup-plan.sh
+β βββ update-claude-md.sh
βββ specs
-β βββ 001-create-taskify
-β βββ contracts
-β β βββ api-spec.json
-β β βββ signalr-spec.md
-β βββ data-model.md
-β βββ plan.md
-β βββ quickstart.md
-β βββ research.md
-β βββ spec.md
+β βββ 001-create-taskify
+β βββ contracts
+β β βββ api-spec.json
+β β βββ signalr-spec.md
+β βββ data-model.md
+β βββ plan.md
+β βββ quickstart.md
+β βββ research.md
+β βββ spec.md
βββ templates
βββ CLAUDE-template.md
βββ plan-template.md
@@ -577,6 +580,7 @@ Once ready, use the `/speckit.implement` command to execute your implementation
```
The `/speckit.implement` command will:
+
- Validate that all prerequisites are in place (constitution, spec, plan, and tasks)
- Parse the task breakdown from `tasks.md`
- Execute tasks in the correct order, respecting dependencies and parallel execution markers
@@ -627,4 +631,3 @@ This project is heavily influenced by and based on the work and research of [Joh
## π License
This project is licensed under the terms of the MIT open source license. Please refer to the [LICENSE](./LICENSE) file for the full terms.
-
diff --git a/SECURITY.md b/SECURITY.md
index 67a9cbf2..4c1e92da 100644
--- a/SECURITY.md
+++ b/SECURITY.md
@@ -1,10 +1,10 @@
-Thanks for helping make GitHub safe for everyone.
+# Security Policy
-# Security
+Thanks for helping make GitHub safe for everyone.
GitHub takes the security of our software products and services seriously, including all of the open source code repositories managed through our GitHub organizations, such as [GitHub](https://github.com/GitHub).
-Even though [open source repositories are outside of the scope of our bug bounty program](https://bounty.github.com/index.html#scope) and therefore not eligible for bounty rewards, we will ensure that your finding gets passed along to the appropriate maintainers for remediation.
+Even though [open source repositories are outside of the scope of our bug bounty program](https://bounty.github.com/index.html#scope) and therefore not eligible for bounty rewards, we will ensure that your finding gets passed along to the appropriate maintainers for remediation.
## Reporting Security Issues
@@ -16,13 +16,13 @@ Instead, please send an email to opensource-security[@]github.com.
Please include as much of the information listed below as you can to help us better understand and resolve the issue:
- * The type of issue (e.g., buffer overflow, SQL injection, or cross-site scripting)
- * Full paths of source file(s) related to the manifestation of the issue
- * The location of the affected source code (tag/branch/commit or direct URL)
- * Any special configuration required to reproduce the issue
- * Step-by-step instructions to reproduce the issue
- * Proof-of-concept or exploit code (if possible)
- * Impact of the issue, including how an attacker might exploit the issue
+- The type of issue (e.g., buffer overflow, SQL injection, or cross-site scripting)
+- Full paths of source file(s) related to the manifestation of the issue
+- The location of the affected source code (tag/branch/commit or direct URL)
+- Any special configuration required to reproduce the issue
+- Step-by-step instructions to reproduce the issue
+- Proof-of-concept or exploit code (if possible)
+- Impact of the issue, including how an attacker might exploit the issue
This information will help us triage your report more quickly.
diff --git a/SUPPORT.md b/SUPPORT.md
index c75ce9bd..c6acf76e 100644
--- a/SUPPORT.md
+++ b/SUPPORT.md
@@ -1,4 +1,4 @@
-# Support
+# Support
## How to file issues and get help
@@ -17,4 +17,3 @@ For help or questions about using this project, please:
## GitHub Support Policy
Support for this project is limited to the resources listed above.
-
diff --git a/docs/README.md b/docs/README.md
index 7a155cfa..a9edc81d 100644
--- a/docs/README.md
+++ b/docs/README.md
@@ -7,11 +7,13 @@ This folder contains the documentation source files for Spec Kit, built using [D
To build the documentation locally:
1. Install DocFX:
+
```bash
dotnet tool install -g docfx
```
2. Build the documentation:
+
```bash
cd docs
docfx docfx.json --serve
@@ -31,4 +33,3 @@ To build the documentation locally:
## Deployment
Documentation is automatically built and deployed to GitHub Pages when changes are pushed to the `main` branch. The workflow is defined in `.github/workflows/docs.yml`.
-
diff --git a/docs/index.md b/docs/index.md
index e134404e..38a6de34 100644
--- a/docs/index.md
+++ b/docs/index.md
@@ -18,7 +18,7 @@ Spec-Driven Development **flips the script** on traditional software development
Spec-Driven Development is a structured process that emphasizes:
-- **Intent-driven development** where specifications define the "_what_" before the "_how_"
+- **Intent-driven development** where specifications define the "*what*" before the "*how*"
- **Rich specification creation** using guardrails and organizational principles
- **Multi-step refinement** rather than one-shot code generation from prompts
- **Heavy reliance** on advanced AI model capabilities for specification interpretation
@@ -36,19 +36,23 @@ Spec-Driven Development is a structured process that emphasizes:
Our research and experimentation focus on:
### Technology Independence
+
- Create applications using diverse technology stacks
- Validate the hypothesis that Spec-Driven Development is a process not tied to specific technologies, programming languages, or frameworks
### Enterprise Constraints
+
- Demonstrate mission-critical application development
- Incorporate organizational constraints (cloud providers, tech stacks, engineering practices)
- Support enterprise design systems and compliance requirements
### User-Centric Development
+
- Build applications for different user cohorts and preferences
- Support various development approaches (from vibe-coding to AI-native development)
### Creative & Iterative Processes
+
- Validate the concept of parallel implementation exploration
- Provide robust iterative feature development workflows
- Extend processes to handle upgrades and modernization tasks
@@ -60,4 +64,3 @@ Please see our [Contributing Guide](https://github.com/github/spec-kit/blob/main
## Support
For support, please check our [Support Guide](https://github.com/github/spec-kit/blob/main/SUPPORT.md) or open an issue on GitHub.
-
diff --git a/docs/installation.md b/docs/installation.md
index d4dfaa3d..6daff243 100644
--- a/docs/installation.md
+++ b/docs/installation.md
@@ -42,11 +42,13 @@ uvx --from git+https://github.com/github/spec-kit.git specify init --script sh
uvx --from git+https://github.com/github/spec-kit.git specify init --script ps
@@ -63,6 +65,7 @@ uvx --from git+https://github.com/github/spec-kit.git specify init --script ps # Force PowerShell
uvx --from git+https://github.com/github/spec-kit.git specify init --script sh # Force POSIX shell
@@ -120,4 +121,3 @@ implement specs/002-create-taskify/plan.md
- Read the complete methodology for in-depth guidance
- Check out more examples in the repository
- Explore the source code on GitHub
-
diff --git a/media/bootstrap-claude-code.gif b/media/bootstrap-claude-code.gif
index bf845175..ba3a7e98 100644
Binary files a/media/bootstrap-claude-code.gif and b/media/bootstrap-claude-code.gif differ
diff --git a/media/logo_large.webp b/media/logo_large.webp
index ce095f72..209e3dee 100644
Binary files a/media/logo_large.webp and b/media/logo_large.webp differ
diff --git a/media/logo_small.webp b/media/logo_small.webp
index e256f4ed..95b5efc3 100644
Binary files a/media/logo_small.webp and b/media/logo_small.webp differ
diff --git a/media/spec-kit-video-header.jpg b/media/spec-kit-video-header.jpg
index 9a7fa84f..783eee9c 100644
Binary files a/media/spec-kit-video-header.jpg and b/media/spec-kit-video-header.jpg differ
diff --git a/media/specify_cli.gif b/media/specify_cli.gif
index 555baa9b..70aae2d6 100644
Binary files a/media/specify_cli.gif and b/media/specify_cli.gif differ
diff --git a/scripts/bash/create-new-feature.sh b/scripts/bash/create-new-feature.sh
index 510f6204..53adbcef 100644
--- a/scripts/bash/create-new-feature.sh
+++ b/scripts/bash/create-new-feature.sh
@@ -5,20 +5,26 @@ set -e
JSON_MODE=false
SHORT_NAME=""
ARGS=()
-i=0
-while [ $i -lt $# ]; do
+i=1
+while [ $i -le $# ]; do
arg="${!i}"
case "$arg" in
--json)
JSON_MODE=true
;;
--short-name)
- if [ $((i + 1)) -ge $# ]; then
+ if [ $((i + 1)) -gt $# ]; then
echo 'Error: --short-name requires a value' >&2
exit 1
fi
i=$((i + 1))
- SHORT_NAME="${!i}"
+ next_arg="${!i}"
+ # Check if the next argument is another option (starts with --)
+ if [[ "$next_arg" == --* ]]; then
+ echo 'Error: --short-name requires a value' >&2
+ exit 1
+ fi
+ SHORT_NAME="$next_arg"
;;
--help|-h)
echo "Usage: $0 [--json] [--short-name ] "
@@ -197,4 +203,4 @@ else
echo "SPEC_FILE: $SPEC_FILE"
echo "FEATURE_NUM: $FEATURE_NUM"
echo "SPECIFY_FEATURE environment variable set to: $BRANCH_NAME"
-fi
\ No newline at end of file
+fi
diff --git a/scripts/bash/update-agent-context.sh b/scripts/bash/update-agent-context.sh
index c40010c2..49fe37b1 100644
--- a/scripts/bash/update-agent-context.sh
+++ b/scripts/bash/update-agent-context.sh
@@ -251,7 +251,7 @@ get_commands_for_language() {
echo "cargo test && cargo clippy"
;;
*"JavaScript"*|*"TypeScript"*)
- echo "npm test \&\& npm run lint"
+ echo "npm test \\&\\& npm run lint"
;;
*)
echo "# Add commands for $lang"
diff --git a/spec-driven.md b/spec-driven.md
index 13edc9e3..0e546ff3 100644
--- a/spec-driven.md
+++ b/spec-driven.md
@@ -401,4 +401,3 @@ By embedding these principles into the specification and planning process, SDD e
This isn't about replacing developers or automating creativity. It's about amplifying human capability by automating mechanical translation. It's about creating a tight feedback loop where specifications, research, and code evolve together, each iteration bringing deeper understanding and better alignment between intent and implementation.
Software development needs better tools for maintaining alignment between intent and implementation. SDD provides the methodology for achieving this alignment through executable specifications that generate code rather than merely guiding it.
-
diff --git a/src/specify_cli/__init__.py b/src/specify_cli/__init__.py
index be77b243..a33a1c61 100644
--- a/src/specify_cli/__init__.py
+++ b/src/specify_cli/__init__.py
@@ -491,6 +491,73 @@ def init_git_repo(project_path: Path, quiet: bool = False) -> Tuple[bool, Option
finally:
os.chdir(original_cwd)
+def handle_vscode_settings(sub_item, dest_file, rel_path, verbose=False, tracker=None) -> None:
+ """Handle merging or copying of .vscode/settings.json files."""
+ def log(message, color="green"):
+ if verbose and not tracker:
+ console.print(f"[{color}]{message}[/] {rel_path}")
+
+ try:
+ with open(sub_item, 'r', encoding='utf-8') as f:
+ new_settings = json.load(f)
+
+ if dest_file.exists():
+ merged = merge_json_files(dest_file, new_settings, verbose=verbose and not tracker)
+ with open(dest_file, 'w', encoding='utf-8') as f:
+ json.dump(merged, f, indent=4)
+ f.write('\n')
+ log("Merged:", "green")
+ else:
+ shutil.copy2(sub_item, dest_file)
+ log("Copied (no existing settings.json):", "blue")
+
+ except Exception as e:
+ log(f"Warning: Could not merge, copying instead: {e}", "yellow")
+ shutil.copy2(sub_item, dest_file)
+
+def merge_json_files(existing_path: Path, new_content: dict, verbose: bool = False) -> dict:
+ """Merge new JSON content into existing JSON file.
+
+ Performs a deep merge where:
+ - New keys are added
+ - Existing keys are preserved unless overwritten by new content
+ - Nested dictionaries are merged recursively
+ - Lists and other values are replaced (not merged)
+
+ Args:
+ existing_path: Path to existing JSON file
+ new_content: New JSON content to merge in
+ verbose: Whether to print merge details
+
+ Returns:
+ Merged JSON content as dict
+ """
+ try:
+ with open(existing_path, 'r', encoding='utf-8') as f:
+ existing_content = json.load(f)
+ except (FileNotFoundError, json.JSONDecodeError):
+ # If file doesn't exist or is invalid, just use new content
+ return new_content
+
+ def deep_merge(base: dict, update: dict) -> dict:
+ """Recursively merge update dict into base dict."""
+ result = base.copy()
+ for key, value in update.items():
+ if key in result and isinstance(result[key], dict) and isinstance(value, dict):
+ # Recursively merge nested dictionaries
+ result[key] = deep_merge(result[key], value)
+ else:
+ # Add new key or replace existing value
+ result[key] = value
+ return result
+
+ merged = deep_merge(existing_content, new_content)
+
+ if verbose:
+ console.print(f"[cyan]Merged JSON file:[/cyan] {existing_path.name}")
+
+ return merged
+
def download_template_from_github(ai_assistant: str, download_dir: Path, *, script_type: str = "sh", verbose: bool = True, show_progress: bool = True, client: httpx.Client = None, debug: bool = False, github_token: str = None) -> Tuple[Path, dict]:
repo_owner = "github"
repo_name = "spec-kit"
@@ -682,7 +749,11 @@ def download_and_extract_template(project_path: Path, ai_assistant: str, script_
rel_path = sub_item.relative_to(item)
dest_file = dest_path / rel_path
dest_file.parent.mkdir(parents=True, exist_ok=True)
- shutil.copy2(sub_item, dest_file)
+ # Special handling for .vscode/settings.json - merge instead of overwrite
+ if dest_file.name == "settings.json" and dest_file.parent.name == ".vscode":
+ handle_vscode_settings(sub_item, dest_file, rel_path, verbose, tracker)
+ else:
+ shutil.copy2(sub_item, dest_file)
else:
shutil.copytree(item, dest_path)
else:
@@ -1099,18 +1170,25 @@ def check():
tracker.add("git", "Git version control")
git_ok = check_tool("git", tracker=tracker)
-
+
agent_results = {}
for agent_key, agent_config in AGENT_CONFIG.items():
agent_name = agent_config["name"]
-
+ requires_cli = agent_config["requires_cli"]
+
tracker.add(agent_key, agent_name)
- agent_results[agent_key] = check_tool(agent_key, tracker=tracker)
-
+
+ if requires_cli:
+ agent_results[agent_key] = check_tool(agent_key, tracker=tracker)
+ else:
+ # IDE-based agent - skip CLI check and mark as optional
+ tracker.skip(agent_key, "IDE-based, no CLI check")
+ agent_results[agent_key] = False # Don't count IDE agents as "found"
+
# Check VS Code variants (not in agent config)
tracker.add("code", "Visual Studio Code")
code_ok = check_tool("code", tracker=tracker)
-
+
tracker.add("code-insiders", "Visual Studio Code Insiders")
code_insiders_ok = check_tool("code-insiders", tracker=tracker)
diff --git a/templates/agent-file-template.md b/templates/agent-file-template.md
index f7349979..4cc7fd66 100644
--- a/templates/agent-file-template.md
+++ b/templates/agent-file-template.md
@@ -3,20 +3,25 @@
Auto-generated from all feature plans. Last updated: [DATE]
## Active Technologies
+
[EXTRACTED FROM ALL PLAN.MD FILES]
## Project Structure
-```
+
+```text
[ACTUAL STRUCTURE FROM PLANS]
```
## Commands
+
[ONLY COMMANDS FOR ACTIVE TECHNOLOGIES]
## Code Style
+
[LANGUAGE-SPECIFIC, ONLY FOR LANGUAGES IN USE]
## Recent Changes
+
[LAST 3 FEATURES AND WHAT THEY ADDED]
diff --git a/templates/checklist-template.md b/templates/checklist-template.md
index 1c8b11a1..806657da 100644
--- a/templates/checklist-template.md
+++ b/templates/checklist-template.md
@@ -38,4 +38,3 @@
- Add comments or findings inline
- Link to relevant resources or documentation
- Items are numbered sequentially for easy reference
-
diff --git a/templates/commands/analyze.md b/templates/commands/analyze.md
index 82957e5e..827d4e4c 100644
--- a/templates/commands/analyze.md
+++ b/templates/commands/analyze.md
@@ -15,13 +15,13 @@ You **MUST** consider the user input before proceeding (if not empty).
## 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`.
+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 `/speckit.tasks` has successfully produced a complete `tasks.md`.
## Operating Constraints
**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`.
+**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 `/speckit.analyze`.
## Execution Steps
@@ -157,9 +157,9 @@ Output a Markdown report (no file writes) with the following structure:
At end of report, output a concise Next Actions block:
-- If CRITICAL issues exist: Recommend resolving before `/implement`
+- If CRITICAL issues exist: Recommend resolving before `/speckit.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'"
+- Provide explicit command suggestions: e.g., "Run /speckit.specify with refinement", "Run /speckit.plan to adjust architecture", "Manually edit tasks.md to add coverage for 'performance-metrics'"
### 8. Offer Remediation
@@ -185,4 +185,3 @@ Ask the user: "Would you like me to suggest concrete remediation edits for the t
## Context
{ARGS}
-
diff --git a/templates/commands/checklist.md b/templates/commands/checklist.md
index 0900e33a..e32a2c84 100644
--- a/templates/commands/checklist.md
+++ b/templates/commands/checklist.md
@@ -10,12 +10,14 @@ scripts:
**CRITICAL CONCEPT**: Checklists are **UNIT TESTS FOR REQUIREMENTS WRITING** - they validate the quality, clarity, and completeness of requirements in a given domain.
**NOT for verification/testing**:
+
- β NOT "Verify the button clicks correctly"
- β NOT "Test error handling works"
- β NOT "Confirm the API returns 200"
- β NOT checking if code/implementation matches the spec
**FOR requirements quality validation**:
+
- β "Are visual hierarchy requirements defined for all card types?" (completeness)
- β "Is 'prominent display' quantified with specific sizing/positioning?" (clarity)
- β "Are hover state requirements consistent across all interactive elements?" (consistency)
@@ -80,7 +82,7 @@ You **MUST** consider the user input before proceeding (if not empty).
- spec.md: Feature requirements and scope
- plan.md (if exists): Technical details, dependencies
- tasks.md (if exists): Implementation tasks
-
+
**Context Loading Strategy**:
- Load only necessary portions relevant to active focus areas (avoid full-file dumping)
- Prefer summarizing long sections into concise scenario/requirement bullets
@@ -91,7 +93,7 @@ You **MUST** consider the user input before proceeding (if not empty).
- Create `FEATURE_DIR/checklists/` directory if it doesn't exist
- Generate unique checklist filename:
- Use short, descriptive name based on domain (e.g., `ux.md`, `api.md`, `security.md`)
- - Format: `[domain].md`
+ - Format: `[domain].md`
- If file exists, append to existing file
- Number items sequentially starting from CHK001
- Each `/speckit.checklist` run creates a NEW file (never overwrites existing checklists)
@@ -103,7 +105,7 @@ You **MUST** consider the user input before proceeding (if not empty).
- **Consistency**: Do requirements align with each other?
- **Measurability**: Can requirements be objectively verified?
- **Coverage**: Are all scenarios/edge cases addressed?
-
+
**Category Structure** - Group items by requirement quality dimensions:
- **Requirement Completeness** (Are all necessary requirements documented?)
- **Requirement Clarity** (Are requirements specific and unambiguous?)
@@ -114,14 +116,14 @@ You **MUST** consider the user input before proceeding (if not empty).
- **Non-Functional Requirements** (Performance, Security, Accessibility, etc. - are they specified?)
- **Dependencies & Assumptions** (Are they documented and validated?)
- **Ambiguities & Conflicts** (What needs clarification?)
-
+
**HOW TO WRITE CHECKLIST ITEMS - "Unit Tests for English"**:
-
+
β **WRONG** (Testing implementation):
- "Verify landing page displays 3 episode cards"
- "Test hover states work on desktop"
- "Confirm logo click navigates home"
-
+
β **CORRECT** (Testing requirements quality):
- "Are the exact number and layout of featured episodes specified?" [Completeness]
- "Is 'prominent display' quantified with specific sizing/positioning?" [Clarity]
@@ -130,7 +132,7 @@ You **MUST** consider the user input before proceeding (if not empty).
- "Is the fallback behavior specified when logo image fails to load?" [Edge Cases]
- "Are loading states defined for asynchronous episode data?" [Completeness]
- "Does the spec define visual hierarchy for competing UI elements?" [Clarity]
-
+
**ITEM STRUCTURE**:
Each item should follow this pattern:
- Question format asking about requirement quality
@@ -138,28 +140,28 @@ You **MUST** consider the user input before proceeding (if not empty).
- Include quality dimension in brackets [Completeness/Clarity/Consistency/etc.]
- Reference spec section `[Spec Β§X.Y]` when checking existing requirements
- Use `[Gap]` marker when checking for missing requirements
-
+
**EXAMPLES BY QUALITY DIMENSION**:
-
+
Completeness:
- "Are error handling requirements defined for all API failure modes? [Gap]"
- "Are accessibility requirements specified for all interactive elements? [Completeness]"
- "Are mobile breakpoint requirements defined for responsive layouts? [Gap]"
-
+
Clarity:
- "Is 'fast loading' quantified with specific timing thresholds? [Clarity, Spec Β§NFR-2]"
- "Are 'related episodes' selection criteria explicitly defined? [Clarity, Spec Β§FR-5]"
- "Is 'prominent' defined with measurable visual properties? [Ambiguity, Spec Β§FR-4]"
-
+
Consistency:
- "Do navigation requirements align across all pages? [Consistency, Spec Β§FR-10]"
- "Are card component requirements consistent between landing and detail pages? [Consistency]"
-
+
Coverage:
- "Are requirements defined for zero-state scenarios (no episodes)? [Coverage, Edge Case]"
- "Are concurrent user interaction scenarios addressed? [Coverage, Gap]"
- "Are requirements specified for partial data loading failures? [Coverage, Exception Flow]"
-
+
Measurability:
- "Are visual hierarchy requirements measurable/testable? [Acceptance Criteria, Spec Β§FR-1]"
- "Can 'balanced visual weight' be objectively verified? [Measurability, Spec Β§FR-2]"
@@ -195,7 +197,7 @@ You **MUST** consider the user input before proceeding (if not empty).
- β "Click", "navigate", "render", "load", "execute"
- β Test cases, test plans, QA procedures
- β Implementation details (frameworks, APIs, algorithms)
-
+
**β REQUIRED PATTERNS** - These test requirements quality:
- β "Are [requirement type] defined/specified/documented for [scenario]?"
- β "Is [vague term] quantified/clarified with specific criteria?"
@@ -225,6 +227,7 @@ To avoid clutter, use descriptive types and clean up obsolete checklists when do
**UX Requirements Quality:** `ux.md`
Sample items (testing the requirements, NOT the implementation):
+
- "Are visual hierarchy requirements defined with measurable criteria? [Clarity, Spec Β§FR-1]"
- "Is the number and positioning of UI elements explicitly specified? [Completeness, Spec Β§FR-1]"
- "Are interaction state requirements (hover, focus, active) consistently defined? [Consistency]"
@@ -235,6 +238,7 @@ Sample items (testing the requirements, NOT the implementation):
**API Requirements Quality:** `api.md`
Sample items:
+
- "Are error response formats specified for all failure scenarios? [Completeness]"
- "Are rate limiting requirements quantified with specific thresholds? [Clarity]"
- "Are authentication requirements consistent across all endpoints? [Consistency]"
@@ -244,6 +248,7 @@ Sample items:
**Performance Requirements Quality:** `performance.md`
Sample items:
+
- "Are performance requirements quantified with specific metrics? [Clarity]"
- "Are performance targets defined for all critical user journeys? [Coverage]"
- "Are performance requirements under different load conditions specified? [Completeness]"
@@ -253,6 +258,7 @@ Sample items:
**Security Requirements Quality:** `security.md`
Sample items:
+
- "Are authentication requirements specified for all protected resources? [Coverage]"
- "Are data protection requirements defined for sensitive information? [Completeness]"
- "Is the threat model documented and requirements aligned to it? [Traceability]"
@@ -282,10 +288,10 @@ Sample items:
```
**Key Differences:**
+
- Wrong: Tests if the system works correctly
- Correct: Tests if the requirements are written correctly
- Wrong: Verification of behavior
- Correct: Validation of requirement quality
-- Wrong: "Does it do X?"
+- Wrong: "Does it do X?"
- Correct: "Is X clearly specified?"
-
diff --git a/templates/commands/clarify.md b/templates/commands/clarify.md
index 65f2536f..9a62dfa7 100644
--- a/templates/commands/clarify.md
+++ b/templates/commands/clarify.md
@@ -87,63 +87,63 @@ Execution steps:
3. Generate (internally) a prioritized queue of candidate clarification questions (maximum 5). Do NOT output them all at once. Apply these constraints:
- Maximum of 10 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.
+ - 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:
- * **Analyze all options** and determine the **most suitable option** based on:
+ - **Analyze all options** and determine the **most suitable option** based on:
- Best practices for the project type
- Common patterns in similar implementations
- Risk reduction (security, performance, maintainability)
- Alignment with any explicit project goals or constraints visible in the spec
- * Present your **recommended option prominently** at the top with clear reasoning (1-2 sentences explaining why this is the best choice).
- * Format as: `**Recommended:** Option [X] - `
- * Then render all options as a Markdown table:
+ - Present your **recommended option prominently** at the top with clear reasoning (1-2 sentences explaining why this is the best choice).
+ - Format as: `**Recommended:** Option [X] - `
+ - Then render all options as a Markdown table:
| Option | Description |
|--------|-------------|
| A |