Files
2025-11-30 08:39:24 +08:00

456 lines
16 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
description: Execute the implementation planning workflow using the plan template to generate design artifacts.
---
<!--
ATTRIBUTION CHAIN:
1. Original: GitHub spec-kit (https://github.com/github/spec-kit)
Copyright (c) GitHub, Inc. | MIT License
2. Adapted: SpecKit plugin by Marty Bonacci (2025)
3. Forked: SpecSwarm plugin with tech stack management
by Marty Bonacci & Claude Code (2025)
-->
## User Input
```text
$ARGUMENTS
```
You **MUST** consider the user input before proceeding (if not empty).
## Outline
1. **Discover Feature Context**:
a. **Find Repository Root and Initialize Features Directory**:
```bash
REPO_ROOT=$(git rev-parse --show-toplevel 2>/dev/null || pwd)
# Source features location helper
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PLUGIN_DIR="$(dirname "$SCRIPT_DIR")"
source "$PLUGIN_DIR/lib/features-location.sh"
# Initialize features directory (handles migration if needed)
get_features_dir "$REPO_ROOT"
```
b. **Get Current Feature**:
```bash
BRANCH=$(git rev-parse --abbrev-ref HEAD 2>/dev/null)
FEATURE_NUM=$(echo "$BRANCH" | grep -oE '^[0-9]{3}')
# Fallback for non-git
if [ -z "$FEATURE_NUM" ]; then
FEATURE_NUM=$(list_features "$REPO_ROOT" | grep -oE '^[0-9]{3}' | sort -nr | head -1)
fi
```
c. **Locate Feature Directory**:
```bash
find_feature_dir "$FEATURE_NUM" "$REPO_ROOT"
# FEATURE_DIR is now set by find_feature_dir
```
d. **Set Path Variables**:
```bash
FEATURE_SPEC="${FEATURE_DIR}/spec.md"
IMPL_PLAN="${FEATURE_DIR}/plan.md"
RESEARCH_FILE="${FEATURE_DIR}/research.md"
DATA_MODEL_FILE="${FEATURE_DIR}/data-model.md"
CONTRACTS_DIR="${FEATURE_DIR}/contracts"
```
e. **Validate Prerequisites**:
- Check that `spec.md` exists
- If missing: ERROR "No specification found. Run `/specify` first."
2. **Load context**:
- Read FEATURE_SPEC (spec.md)
- Read `.specswarm/constitution.md` if it exists
- Check for `.specswarm/tech-stack.md`
- Load plan template from `templates/plan-template.md` or use embedded template
<!-- ========== TECH STACK MANAGEMENT (SpecSwarm Enhancement) ========== -->
<!-- Added by Marty Bonacci & Claude Code (2025) -->
2a. **Tech Stack File Initialization** (first-time setup):
**Check if tech stack file exists**:
```bash
if [ ! -f "${REPO_ROOT}.specswarm/tech-stack.md" ]; then
FIRST_FEATURE=true
else
FIRST_FEATURE=false
fi
```
**If FIRST_FEATURE=true** (no tech-stack.md exists):
1. **Detect project technologies** (scan existing files):
```bash
# Check for package managers and extract dependencies
if [ -f "${REPO_ROOT}/package.json" ]; then
# Node.js/TypeScript project
LANGUAGE=$(grep -q "typescript" "${REPO_ROOT}/package.json" && echo "TypeScript" || echo "JavaScript")
RUNTIME="Node.js"
# Extract frameworks and libraries from dependencies
elif [ -f "${REPO_ROOT}/composer.json" ]; then
# PHP project
LANGUAGE="PHP"
elif [ -f "${REPO_ROOT}/requirements.txt" ] || [ -f "${REPO_ROOT}/pyproject.toml" ]; then
# Python project
LANGUAGE="Python"
elif [ -f "${REPO_ROOT}/go.mod" ]; then
# Go project
LANGUAGE="Go"
elif [ -f "${REPO_ROOT}/Gemfile" ]; then
# Ruby project
LANGUAGE="Ruby"
fi
```
2. **Generate tech-stack.md** using template:
- Use `/templates/tech-stack-template.md` if exists
- Otherwise use embedded template with detected technologies
- Populate Core Technologies section from detection
- Populate Standard Libraries from package files
- Leave Prohibited Technologies section with TODO marker and common examples
3. **Present to user for confirmation**:
```
🎯 TECH STACK FILE CREATED
This is your FIRST feature using SpecSwarm. I've created `.specswarm/tech-stack.md`
based on your project files and plan.md Technical Context.
**Detected Stack:**
- Language: {detected_language}
- Framework: {detected_framework}
- Database: {detected_database}
- Key Libraries: {detected_libraries}
**Action Required:**
1. Review `.specswarm/tech-stack.md`
2. Add any PROHIBITED technologies (important for drift prevention!)
3. Confirm accuracy of detected stack
⚠️ This file will be used to validate ALL future features.
**Options:**
- Type "continue" to accept and proceed with planning
- Type "edit" to pause while you refine tech-stack.md
- Provide corrections: "Language should be JavaScript, not TypeScript"
```
4. **Wait for user response**:
- If "continue": Proceed to section 2b (Tech Stack Validation)
- If "edit": PAUSE with message "Run `/specswarm:plan` again when ready"
- If corrections provided: Update tech-stack.md, show updated version, ask for confirmation again
5. **Add reminder to constitution** (if constitution exists):
- Append note to constitution.md suggesting Principle 5 formalization
- Message: "💡 Consider running `/specswarm:constitution` to formalize tech stack enforcement as Principle 5"
**If FIRST_FEATURE=false** (tech-stack.md already exists):
- Skip initialization entirely
- Proceed directly to section 2b (Tech Stack Validation)
**If auto-detection fails** (no package files found):
- Prompt user for manual input:
```
🎯 TECH STACK FILE NEEDED
Cannot auto-detect technologies. Please provide:
1. Programming language and version (e.g., "TypeScript 5.x")
2. Main framework (e.g., "React Router v7")
3. Database (e.g., "PostgreSQL 17")
4. 3-5 key libraries
Example: "TypeScript 5, React Router v7, PostgreSQL 17, Drizzle ORM, Zod"
```
- Wait for response, generate tech-stack.md from input
2b. **Tech Stack Validation** (runs for all features after first):
**If tech-stack.md does NOT exist**:
- Skip validation (handled by section 2a above)
**If tech-stack.md exists**:
1. **Extract technologies from plan.md Technical Context**:
- Parse all mentioned libraries, frameworks, tools from Technical Context section
- Create list: NEW_TECHNOLOGIES[] (technologies mentioned in current plan)
- Read and parse: APPROVED_STACK[] (from tech-stack.md approved sections)
- Read and parse: PROHIBITED_STACK[] (from tech-stack.md prohibited section)
2. **Classify each NEW technology**:
```bash
for TECH in "${NEW_TECHNOLOGIES[@]}"; do
# Check 1: Is it PROHIBITED?
if grep -qi "❌.*${TECH}" "${REPO_ROOT}.specswarm/tech-stack.md"; then
TECH_STATUS[$TECH]="PROHIBITED"
CONFLICTS_WITH[$TECH]=$(grep "❌.*${TECH}" "${REPO_ROOT}.specswarm/tech-stack.md" | sed 's/.*use \(.*\) instead.*/\1/')
continue
fi
# Check 2: Is it already APPROVED?
if grep -qi "${TECH}" "${REPO_ROOT}.specswarm/tech-stack.md" | grep -v "❌"; then
TECH_STATUS[$TECH]="APPROVED"
continue
fi
# Check 3: Does it CONFLICT with existing tech?
# Extract PURPOSE tag from tech-stack.md for conflict detection
TECH_PURPOSE=$(get_library_purpose "${TECH}")
if [ -n "$TECH_PURPOSE" ]; then
EXISTING_WITH_PURPOSE=$(grep -i "PURPOSE:${TECH_PURPOSE}" "${REPO_ROOT}.specswarm/tech-stack.md" | grep -v "❌" | head -1)
if [ -n "$EXISTING_WITH_PURPOSE" ]; then
TECH_STATUS[$TECH]="CONFLICT"
CONFLICTS_WITH[$TECH]="${EXISTING_WITH_PURPOSE}"
continue
fi
fi
# Check 4: No conflict = AUTO_ADD candidate
TECH_STATUS[$TECH]="AUTO_ADD"
done
```
3. **Generate Tech Stack Compliance Report** in plan.md:
Create a new section in the plan.md file:
```markdown
## Tech Stack Compliance Report
<!-- Auto-generated by SpecSwarm tech stack validation -->
### ✅ Approved Technologies (already in stack)
{list of technologies with APPROVED status}
### New Technologies (auto-added)
{list of technologies with AUTO_ADD status}
For each:
- **{Technology Name}**
- Purpose: {detected_purpose}
- No conflicts detected
- Added to: {section_name}
- Version updated: {old_version} → {new_version}
### ⚠️ Conflicting Technologies (require approval)
{list of technologies with CONFLICT status}
For each:
- **{Technology Name}**
- Purpose: {detected_purpose}
- ❌ CONFLICT: Project uses `{existing_tech}` ({purpose})
- **Action Required**: Choose one:
| Option | Choice | Implications |
|--------|--------|--------------|
| A | Use {existing_tech} (keep existing) | Remove {new_tech} from plan, update Technical Context |
| B | Replace {existing_tech} with {new_tech} | Update tech-stack.md (MAJOR version), refactor existing code |
| C | Use both (justify overlap) | Document why both needed in research.md, add note to tech-stack.md |
**Your choice**: _[Wait for user response]_
### ❌ Prohibited Technologies (cannot use)
{list of technologies with PROHIBITED status}
For each:
- **{Technology Name}**
- ❌ PROHIBITED in tech-stack.md
- Reason: "{reason from tech-stack.md}"
- **Must use**: {approved_alternative}
- **Cannot proceed** until plan.md updated
```
4. **Handle Each Status**:
**APPROVED** → Continue silently (no action needed)
**AUTO_ADD** →
```bash
# For each AUTO_ADD technology:
1. Determine appropriate section (Data Layer, UI Layer, Utilities, etc.)
2. Add entry to tech-stack.md:
- {Technology} v{version} ({purpose}) <!-- Auto-added: Feature {FEATURE_NUM}, {DATE} -->
3. Bump tech-stack.md MINOR version:
OLD_VERSION=$(grep "^\*\*Version\*\*:" "${REPO_ROOT}.specswarm/tech-stack.md" | grep -oE '[0-9]+\.[0-9]+\.[0-9]+')
MAJOR=$(echo $OLD_VERSION | cut -d. -f1)
MINOR=$(echo $OLD_VERSION | cut -d. -f2)
PATCH=$(echo $OLD_VERSION | cut -d. -f3)
NEW_MINOR=$((MINOR + 1))
NEW_VERSION="${MAJOR}.${NEW_MINOR}.0"
sed -i "s/\*\*Version\*\*: ${OLD_VERSION}/\*\*Version\*\*: ${NEW_VERSION}/" "${REPO_ROOT}.specswarm/tech-stack.md"
4. Update version history section
5. Notify user in compliance report
6. Continue with plan generation
```
**CONFLICT** →
```bash
1. STOP planning process
2. Show conflict details with options table (see report format above)
3. WAIT for user response (A, B, or C)
4. Based on choice:
Option A (keep existing):
- Remove conflicting tech from plan.md Technical Context
- Continue with plan generation
Option B (replace):
- Remove existing tech from tech-stack.md
- Add new tech to tech-stack.md
- Bump MAJOR version (breaking change)
- Add to research.md: justification for replacement
- Continue with plan generation
Option C (use both):
- Require research.md justification section
- Add new tech to tech-stack.md with overlap note
- Bump MINOR version
- Continue with plan generation
5. Document decision in plan.md under "Tech Stack Compliance"
```
**PROHIBITED** →
```bash
1. ERROR: Cannot proceed with planning
2. Show prohibited tech details and approved alternative
3. Show amendment process:
```
To use prohibited technology:
1. Document compelling business justification in research.md
2. Update .specswarm/constitution.md (requires constitutional amendment)
3. Remove from Prohibited section in tech-stack.md
4. Add to Approved section with justification comment
5. Bump tech-stack.md MAJOR version (breaking constitutional change)
6. Re-run /specswarm:plan
```
4. HALT planning until issue resolved
```
5. **Update tech-stack.md file** (for AUTO_ADD technologies):
- Automatically write changes to tech-stack.md
- Update version and version history
- Add auto-generated comment with feature number and date
<!-- ========== END TECH STACK MANAGEMENT ========== -->
3. **Execute plan workflow**: Follow the structure in IMPL_PLAN template to:
- Fill Technical Context (mark unknowns as "NEEDS CLARIFICATION")
- Fill Constitution Check section from constitution
- Evaluate gates (ERROR if violations unjustified)
- Phase 0: Generate research.md (resolve all NEEDS CLARIFICATION)
- Phase 1: Generate data-model.md, contracts/, quickstart.md
- Phase 1: Update agent context by running the agent script
- Re-evaluate Constitution Check post-design
4. **Stop and report**: Command ends after Phase 2 planning. Report branch, IMPL_PLAN path, and generated artifacts.
## Phases
### Phase 0: Outline & Research
1. **Extract unknowns from Technical Context** above:
- For each NEEDS CLARIFICATION → research task
- For each dependency → best practices task
- For each integration → patterns task
2. **Generate and dispatch research agents**:
```
For each unknown in Technical Context:
Task: "Research {unknown} for {feature context}"
For each technology choice:
Task: "Find best practices for {tech} in {domain}"
```
3. **Consolidate findings** in `research.md` using format:
- Decision: [what was chosen]
- Rationale: [why chosen]
- Alternatives considered: [what else evaluated]
**Output**: research.md with all NEEDS CLARIFICATION resolved
### Phase 1: Design & Contracts
**Prerequisites:** `research.md` complete
1. **Extract entities from feature spec** → `data-model.md`:
- Entity name, fields, relationships
- Validation rules from requirements
- State transitions if applicable
2. **Generate API contracts** from functional requirements:
- For each user action → endpoint
- Use standard REST/GraphQL patterns
- Output OpenAPI/GraphQL schema to `/contracts/`
3. **Agent context update** (optional):
a. **Detect Agent Type**:
```bash
# Check which agent context files exist
if [ -d "${REPO_ROOT}/.claude" ]; then
AGENT="claude"
CONTEXT_FILE=".claude/context.md"
elif [ -f "${REPO_ROOT}/.cursorrules" ]; then
AGENT="cursor"
CONTEXT_FILE=".cursorrules"
elif [ -f "${REPO_ROOT}/.github/copilot-instructions.md" ]; then
AGENT="copilot"
CONTEXT_FILE=".github/copilot-instructions.md"
else
# No agent context file found - skip this step
AGENT="none"
fi
```
b. **Extract Tech Stack from plan.md**:
- Language (e.g., Python, TypeScript, Go)
- Framework (e.g., React, FastAPI, Express)
- Database (e.g., PostgreSQL, MongoDB)
- Key libraries and tools
c. **Update Agent Context File** (Enhanced by SpecSwarm):
<!-- Tech stack enforcement added by Marty Bonacci & Claude Code (2025) -->
- Read existing CONTEXT_FILE (if exists)
- **Read `.specswarm/tech-stack.md` if exists** (SpecSwarm enhancement)
- Look for markers like `<!-- AUTO-GENERATED-START -->` and `<!-- AUTO-GENERATED-END -->`
- Replace content between markers with enhanced format:
- If no markers exist, append new section
- Preserve all manual edits outside markers
- **Enhanced format** (includes CRITICAL CONSTRAINTS from tech-stack.md):
```markdown
<!-- AUTO-GENERATED-START -->
## Tech Stack (from plan.md)
- **Language**: {language}
- **Framework**: {framework}
- **Database**: {database}
- **Key Libraries**: {libraries}
## CRITICAL CONSTRAINTS (from tech-stack.md)
⚠️ **BEFORE suggesting ANY library, framework, or pattern:**
1. Read `.specswarm/tech-stack.md`
2. Verify your suggestion is APPROVED
3. If PROHIBITED, suggest approved alternative
4. If UNAPPROVED, warn user and require justification
**Prohibited Technologies** (NEVER suggest these):
{list of ❌ technologies from tech-stack.md with approved alternatives}
Example format:
- ❌ Axios → Use: fetch API
- ❌ Class components → Use: Functional components
- ❌ Redux → Use: React Router loaders/actions
**Violation = Constitution violation** (see `.specswarm/constitution.md` Principle 5)
**Auto-Addition:** Non-conflicting new libraries will be auto-added during `/specswarm:plan`
<!-- AUTO-GENERATED-END -->
```
**Output**: data-model.md, /contracts/*, quickstart.md, (optional) agent context file
## Key rules
- Use absolute paths
- ERROR on gate failures or unresolved clarifications