Skip to content
Open
Show file tree
Hide file tree
Changes from 24 commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
15a5630
Use VS Code handoffs
localden Oct 21, 2025
c59be99
Testing hand-offs
localden Oct 21, 2025
8e9d25e
Update with prompt
localden Oct 21, 2025
317ae4d
Update prompts
localden Oct 21, 2025
dbd1437
Let's switch to proper prompts
localden Oct 21, 2025
14a574a
Chatmodes are back in vogue
localden Oct 21, 2025
37e87c7
Hand offs with prompts
localden Oct 21, 2025
115b433
Prompt updates
localden Oct 21, 2025
0ac76c8
Merge branch 'main' into localden/vscode
localden Oct 21, 2025
9786e58
Lint fixes
localden Oct 21, 2025
65f8787
Merge branch 'localden/vscode' of https://github.com/github/spec-kit …
localden Oct 21, 2025
d4d3139
Exclude generated releases
localden Oct 21, 2025
e77d99a
Support for version command
localden Oct 21, 2025
2508d92
Fixes #975
localden Oct 21, 2025
a877af5
Fixes #970
localden Oct 21, 2025
72cb885
Update CHANGELOG.md
localden Oct 21, 2025
d550634
Update src/specify_cli/__init__.py
localden Oct 21, 2025
7522eb3
Potential fix for code scanning alert no. 3: Workflow does not contai…
localden Oct 21, 2025
ba861cd
Merge pull request #1003 from github/main
localden Oct 22, 2025
177dcad
Update CONTRIBUTING.md
localden Oct 22, 2025
779e1f8
Update src/specify_cli/__init__.py
localden Oct 22, 2025
5f1fc6b
Create taskstoissues.md
localden Oct 22, 2025
0927443
Merge branch 'localden/vscode' of https://github.com/github/spec-kit …
localden Oct 22, 2025
dafab39
Update taskstoissues.md
localden Oct 22, 2025
d6136cb
Script changes
localden Oct 22, 2025
f7fe48b
Create create-release-packages.ps1
localden Oct 22, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .github/workflows/lint.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
name: Lint
permissions:
contents: read

on:
push:
Expand Down
28 changes: 25 additions & 3 deletions .github/workflows/scripts/create-release-packages.sh
Original file line number Diff line number Diff line change
Expand Up @@ -95,12 +95,32 @@ generate_commands() {
{ echo "description = \"$description\""; echo; echo "prompt = \"\"\""; echo "$body"; echo "\"\"\""; } > "$output_dir/speckit.$name.$ext" ;;
md)
echo "$body" > "$output_dir/speckit.$name.$ext" ;;
prompt.md)
chatmode.md)
echo "$body" > "$output_dir/speckit.$name.$ext" ;;
esac
done
}

generate_copilot_prompts() {
local chatmodes_dir=$1 prompts_dir=$2
mkdir -p "$prompts_dir"

# Generate a .prompt.md file for each .chatmode.md file
for chatmode_file in "$chatmodes_dir"/speckit.*.chatmode.md; do
[[ -f "$chatmode_file" ]] || continue

local basename=$(basename "$chatmode_file" .chatmode.md)
local prompt_file="$prompts_dir/${basename}.prompt.md"

# Create prompt file with agent frontmatter
cat > "$prompt_file" <<EOF
---
agent: ${basename}

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I didn't see any tools loaded anywhere—has this given you issues before? Every single time I forget to set a tool back in one of these agent files, it seems to stop everything... but as frequently as they're changing things, I've stopped trying to guess. 😆 Just calling out as something to verify before you merge.

---
EOF
done
}

build_variant() {
local agent=$1 script=$2
local base_dir="$GENRELEASES_DIR/sdd-${agent}-package-${script}"
Expand Down Expand Up @@ -146,8 +166,10 @@ build_variant() {
generate_commands gemini toml "{{args}}" "$base_dir/.gemini/commands" "$script"
[[ -f agent_templates/gemini/GEMINI.md ]] && cp agent_templates/gemini/GEMINI.md "$base_dir/GEMINI.md" ;;
copilot)
mkdir -p "$base_dir/.github/prompts"
generate_commands copilot prompt.md "\$ARGUMENTS" "$base_dir/.github/prompts" "$script"
mkdir -p "$base_dir/.github/chatmodes"
generate_commands copilot chatmode.md "\$ARGUMENTS" "$base_dir/.github/chatmodes" "$script"
# Generate companion prompt files
generate_copilot_prompts "$base_dir/.github/chatmodes" "$base_dir/.github/prompts"
# Create VS Code workspace settings
mkdir -p "$base_dir/.vscode"
[[ -f templates/vscode-settings.json ]] && cp templates/vscode-settings.json "$base_dir/.vscode/settings.json"
Expand Down
5 changes: 4 additions & 1 deletion .markdownlint-cli2.jsonc
Original file line number Diff line number Diff line change
Expand Up @@ -20,5 +20,8 @@
"MD050": {
"style": "asterisk"
}
}
},
"ignores": [
".genreleases/"
]
}
17 changes: 15 additions & 2 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ Specify supports multiple AI agents by generating agent-specific command files a
|-------|-----------|---------|----------|-------------|
| **Claude Code** | `.claude/commands/` | Markdown | `claude` | Anthropic's Claude Code CLI |
| **Gemini CLI** | `.gemini/commands/` | TOML | `gemini` | Google's Gemini CLI |
| **GitHub Copilot** | `.github/prompts/` | Markdown | N/A (IDE-based) | GitHub Copilot in VS Code |
| **GitHub Copilot** | `.github/chatmodes/` | Markdown | N/A (IDE-based) | GitHub Copilot in VS Code |
| **Cursor** | `.cursor/commands/` | Markdown | `cursor-agent` | Cursor CLI |
| **Qwen Code** | `.qwen/commands/` | TOML | `qwen` | Alibaba's Qwen Code CLI |
| **opencode** | `.opencode/command/` | Markdown | `opencode` | opencode CLI |
Expand Down Expand Up @@ -325,9 +325,22 @@ Work within integrated development environments:

Used by: Claude, Cursor, opencode, Windsurf, Amazon Q Developer, Amp

**Standard format:**

```markdown
---
description: "Command description"
---

Command content with {SCRIPT} and $ARGUMENTS placeholders.
```

**GitHub Copilot Chat Mode format:**

```markdown
---
description: "Command description"
mode: speckit.command-name
---

Command content with {SCRIPT} and $ARGUMENTS placeholders.
Expand All @@ -349,7 +362,7 @@ Command content with {SCRIPT} and {{args}} placeholders.

- **CLI agents**: Usually `.<agent-name>/commands/`
- **IDE agents**: Follow IDE-specific patterns:
- Copilot: `.github/prompts/`
- Copilot: `.github/chatmodes/`
- Cursor: `.cursor/commands/`
- Windsurf: `.windsurf/workflows/`

Expand Down
8 changes: 8 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,14 @@ All notable changes to the Specify CLI and templates are documented here.
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).

## [0.0.21] - 2025-10-21

- Fixes [#975](https://github.com/github/spec-kit/issues/975) (thank you [@fgalarraga](https://github.com/fgalarraga)).
- Adds support for Amp CLI.
- Adds support for VS Code hand-offs and moves prompts to be full-fledged chat modes.
- Adds support for `version` command (addresses [#811](https://github.com/github/spec-kit/issues/811) and [#486](https://github.com/github/spec-kit/issues/486), thank you [@mcasalaina](https://github.com/mcasalaina) and [@dentity007](https://github.com/dentity007)).
- Adds support for rendering the rate limit errors from the CLI when encountered ([#970](https://github.com/github/spec-kit/issues/970), thank you [@psmman](https://github.com/psmman)).

## [0.0.20] - 2025-10-14

### Added
Expand Down
1 change: 1 addition & 0 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -70,13 +70,14 @@
1. **Create release packages**

Run the following command to generate the local packages:

```

Check failure on line 74 in CONTRIBUTING.md

View workflow job for this annotation

GitHub Actions / markdownlint

Fenced code blocks should have a language specified

CONTRIBUTING.md:74 MD040/fenced-code-language Fenced code blocks should have a language specified [Context: "```"] https://github.com/DavidAnson/markdownlint/blob/v0.37.4/doc/md040.md
./.github/workflows/scripts/create-release-packages.sh v1.0.0
```

2. **Copy the relevant package to your test project**

```

Check failure on line 80 in CONTRIBUTING.md

View workflow job for this annotation

GitHub Actions / markdownlint

Fenced code blocks should have a language specified

CONTRIBUTING.md:80 MD040/fenced-code-language Fenced code blocks should have a language specified [Context: "```"] https://github.com/DavidAnson/markdownlint/blob/v0.37.4/doc/md040.md
cp -r .genreleases/sdd-copilot-package-sh/. <path-to-test-project>/
```

Expand Down
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[project]
name = "specify-cli"
version = "0.0.20"
version = "0.0.21"
description = "Specify CLI, part of GitHub Spec Kit. A tool to bootstrap your projects for Spec-Driven Development (SDD)."
requires-python = ">=3.11"
dependencies = [
Expand Down
32 changes: 30 additions & 2 deletions scripts/bash/create-new-feature.sh
Original file line number Diff line number Diff line change
Expand Up @@ -87,17 +87,45 @@ cd "$REPO_ROOT"
SPECS_DIR="$REPO_ROOT/specs"
mkdir -p "$SPECS_DIR"

HIGHEST=0
# Get highest number from specs directory
HIGHEST_FROM_SPECS=0
if [ -d "$SPECS_DIR" ]; then
for dir in "$SPECS_DIR"/*; do
[ -d "$dir" ] || continue
dirname=$(basename "$dir")
number=$(echo "$dirname" | grep -o '^[0-9]\+' || echo "0")
number=$((10#$number))
if [ "$number" -gt "$HIGHEST" ]; then HIGHEST=$number; fi
if [ "$number" -gt "$HIGHEST_FROM_SPECS" ]; then HIGHEST_FROM_SPECS=$number; fi
done
fi

# Get highest number from branch names (both local and remote)
HIGHEST_FROM_BRANCHES=0
if [ "$HAS_GIT" = true ]; then
# Get all branches (local and remote)
branches=$(git branch -a 2>/dev/null || echo "")

if [ -n "$branches" ]; then
while IFS= read -r branch; do
# Clean branch name: remove leading markers and remote prefixes
clean_branch=$(echo "$branch" | sed 's/^[* ]*//; s|^remotes/[^/]*/||')

# Extract feature number if branch matches pattern ###-*
if echo "$clean_branch" | grep -q '^[0-9]\{3\}-'; then
number=$(echo "$clean_branch" | grep -o '^[0-9]\{3\}' || echo "0")
number=$((10#$number))
if [ "$number" -gt "$HIGHEST_FROM_BRANCHES" ]; then HIGHEST_FROM_BRANCHES=$number; fi
fi
done <<< "$branches"
fi
fi

# Use the highest number from either source
HIGHEST=$HIGHEST_FROM_SPECS
if [ "$HIGHEST_FROM_BRANCHES" -gt "$HIGHEST" ]; then
HIGHEST=$HIGHEST_FROM_BRANCHES
fi

NEXT=$((HIGHEST + 1))
FEATURE_NUM=$(printf "%03d" "$NEXT")

Expand Down
2 changes: 1 addition & 1 deletion scripts/bash/update-agent-context.sh
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ AGENT_TYPE="${1:-}"
# Agent-specific file paths
CLAUDE_FILE="$REPO_ROOT/CLAUDE.md"
GEMINI_FILE="$REPO_ROOT/GEMINI.md"
COPILOT_FILE="$REPO_ROOT/.github/copilot-instructions.md"
COPILOT_FILE="$REPO_ROOT/.github/chatmodes/copilot-instructions.md"
CURSOR_FILE="$REPO_ROOT/.cursor/rules/specify-rules.mdc"
QWEN_FILE="$REPO_ROOT/QWEN.md"
AGENTS_FILE="$REPO_ROOT/AGENTS.md"
Expand Down
29 changes: 27 additions & 2 deletions scripts/powershell/create-new-feature.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -79,15 +79,40 @@ Set-Location $repoRoot
$specsDir = Join-Path $repoRoot 'specs'
New-Item -ItemType Directory -Path $specsDir -Force | Out-Null

$highest = 0
# Get highest number from specs directory
$highestFromSpecs = 0
if (Test-Path $specsDir) {
Get-ChildItem -Path $specsDir -Directory | ForEach-Object {
if ($_.Name -match '^(\d{3})') {
$num = [int]$matches[1]
if ($num -gt $highest) { $highest = $num }
if ($num -gt $highestFromSpecs) { $highestFromSpecs = $num }
}
}
}

# Get highest number from branch names (both local and remote)
$highestFromBranches = 0
try {
$branches = git branch -a 2>$null
if ($LASTEXITCODE -eq 0) {
foreach ($branch in $branches) {
# Clean branch name: remove leading markers and remote prefixes
Copy link

Copilot AI Oct 22, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[nitpick] The regex pattern could be made more readable with a comment explaining that it removes Git's current branch marker (*), whitespace, and remote prefixes (e.g., 'remotes/origin/').

Suggested change
# Clean branch name: remove leading markers and remote prefixes
# Clean branch name: remove leading markers and remote prefixes
# The following regex removes:
# - Git's current branch marker ('*') and leading whitespace (e.g., '* main')
# - Remote prefixes (e.g., 'remotes/origin/')

Copilot uses AI. Check for mistakes.
$cleanBranch = $branch.Trim() -replace '^\*?\s+', '' -replace '^remotes/[^/]+/', ''

# Extract feature number if branch matches pattern ###-*
if ($cleanBranch -match '^(\d{3})-') {
$num = [int]$matches[1]
if ($num -gt $highestFromBranches) { $highestFromBranches = $num }
}
}
}
} catch {
# If git command fails, just continue with specs-only check
Write-Verbose "Could not check Git branches: $_"
}

# Use the highest number from either source
$highest = [Math]::Max($highestFromSpecs, $highestFromBranches)
$next = $highest + 1
$featureNum = ('{0:000}' -f $next)

Expand Down
2 changes: 1 addition & 1 deletion scripts/powershell/update-agent-context.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ $NEW_PLAN = $IMPL_PLAN
# Agent file paths
$CLAUDE_FILE = Join-Path $REPO_ROOT 'CLAUDE.md'
$GEMINI_FILE = Join-Path $REPO_ROOT 'GEMINI.md'
$COPILOT_FILE = Join-Path $REPO_ROOT '.github/copilot-instructions.md'
$COPILOT_FILE = Join-Path $REPO_ROOT '.github/chatmodes/copilot-instructions.md'
$CURSOR_FILE = Join-Path $REPO_ROOT '.cursor/rules/specify-rules.mdc'
$QWEN_FILE = Join-Path $REPO_ROOT 'QWEN.md'
$AGENTS_FILE = Join-Path $REPO_ROOT 'AGENTS.md'
Expand Down
Loading
Loading