Skip to content

Commit 7d24937

Browse files
authored
Merge branch 'main' into feat/timestamp-branch-numbering
2 parents f827045 + f85944a commit 7d24937

21 files changed

+1025
-174
lines changed

.devcontainer/post-create.sh

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,10 @@ echo -e "\n🤖 Installing OpenCode CLI..."
5151
run_command "npm install -g opencode-ai@latest"
5252
echo "✅ Done"
5353

54+
echo -e "\n🤖 Installing Junie CLI..."
55+
run_command "npm install -g @jetbrains/junie-cli@latest"
56+
echo "✅ Done"
57+
5458
echo -e "\n🤖 Installing Pi Coding Agent..."
5559
run_command "npm install -g @mariozechner/pi-coding-agent@latest"
5660
echo "✅ Done"

.github/ISSUE_TEMPLATE/agent_request.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ body:
88
value: |
99
Thanks for requesting a new agent! Before submitting, please check if the agent is already supported.
1010
11-
**Currently supported agents**: Claude Code, Gemini CLI, GitHub Copilot, Cursor, Qwen Code, opencode, Codex CLI, Windsurf, Kilo Code, Auggie CLI, Roo Code, CodeBuddy, Qoder CLI, Kiro CLI, Amp, SHAI, IBM Bob, Antigravity
11+
**Currently supported agents**: Claude Code, Gemini CLI, GitHub Copilot, Cursor, Qwen Code, opencode, Codex CLI, Windsurf, Kilo Code, Auggie CLI, Roo Code, CodeBuddy, Qoder CLI, Kiro CLI, Amp, SHAI, Tabnine CLI, Antigravity, IBM Bob, Mistral Vibe, Kimi Code, Trae, Pi Coding Agent, iFlow CLI
1212
1313
- type: input
1414
id: agent-name

.github/ISSUE_TEMPLATE/config.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ contact_links:
77
url: https://github.com/github/spec-kit/blob/main/README.md
88
about: Read the Spec Kit documentation and guides
99
- name: 🛠️ Extension Development Guide
10-
url: https://github.com/manfredseee/spec-kit/blob/main/extensions/EXTENSION-DEVELOPMENT-GUIDE.md
10+
url: https://github.com/github/spec-kit/blob/main/extensions/EXTENSION-DEVELOPMENT-GUIDE.md
1111
about: Learn how to develop and publish Spec Kit extensions
1212
- name: 🤝 Contributing Guide
1313
url: https://github.com/github/spec-kit/blob/main/CONTRIBUTING.md
Lines changed: 169 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,169 @@
1+
name: Preset Submission
2+
description: Submit your preset to the Spec Kit preset catalog
3+
title: "[Preset]: Add "
4+
labels: ["preset-submission", "enhancement", "needs-triage"]
5+
body:
6+
- type: markdown
7+
attributes:
8+
value: |
9+
Thanks for contributing a preset! This template helps you submit your preset to the community catalog.
10+
11+
**Before submitting:**
12+
- Review the [Preset Publishing Guide](https://github.com/github/spec-kit/blob/main/presets/PUBLISHING.md)
13+
- Ensure your preset has a valid `preset.yml` manifest
14+
- Create a GitHub release with a version tag (e.g., v1.0.0)
15+
- Test installation from the release archive: `specify preset add --from <download-url>`
16+
17+
- type: input
18+
id: preset-id
19+
attributes:
20+
label: Preset ID
21+
description: Unique preset identifier (lowercase with hyphens only)
22+
placeholder: "e.g., healthcare-compliance"
23+
validations:
24+
required: true
25+
26+
- type: input
27+
id: preset-name
28+
attributes:
29+
label: Preset Name
30+
description: Human-readable preset name
31+
placeholder: "e.g., Healthcare Compliance"
32+
validations:
33+
required: true
34+
35+
- type: input
36+
id: version
37+
attributes:
38+
label: Version
39+
description: Semantic version number
40+
placeholder: "e.g., 1.0.0"
41+
validations:
42+
required: true
43+
44+
- type: textarea
45+
id: description
46+
attributes:
47+
label: Description
48+
description: Brief description of what your preset does (under 200 characters)
49+
placeholder: Enforces HIPAA-compliant spec workflows with audit templates and compliance checklists
50+
validations:
51+
required: true
52+
53+
- type: input
54+
id: author
55+
attributes:
56+
label: Author
57+
description: Your name or organization
58+
placeholder: "e.g., John Doe or Acme Corp"
59+
validations:
60+
required: true
61+
62+
- type: input
63+
id: repository
64+
attributes:
65+
label: Repository URL
66+
description: GitHub repository URL for your preset
67+
placeholder: "https://github.com/your-org/spec-kit-your-preset"
68+
validations:
69+
required: true
70+
71+
- type: input
72+
id: download-url
73+
attributes:
74+
label: Download URL
75+
description: URL to the GitHub release archive for your preset (e.g., https://github.com/your-org/spec-kit-preset-your-preset/archive/refs/tags/v1.0.0.zip)
76+
placeholder: "https://github.com/your-org/spec-kit-preset-your-preset/archive/refs/tags/v1.0.0.zip"
77+
validations:
78+
required: true
79+
80+
- type: input
81+
id: license
82+
attributes:
83+
label: License
84+
description: Open source license type
85+
placeholder: "e.g., MIT, Apache-2.0"
86+
validations:
87+
required: true
88+
89+
- type: input
90+
id: speckit-version
91+
attributes:
92+
label: Required Spec Kit Version
93+
description: Minimum Spec Kit version required
94+
placeholder: "e.g., >=0.3.0"
95+
validations:
96+
required: true
97+
98+
- type: textarea
99+
id: templates-provided
100+
attributes:
101+
label: Templates Provided
102+
description: List the template overrides your preset provides
103+
placeholder: |
104+
- spec-template.md — adds compliance section
105+
- plan-template.md — includes audit checkpoints
106+
- checklist-template.md — HIPAA compliance checklist
107+
validations:
108+
required: true
109+
110+
- type: textarea
111+
id: commands-provided
112+
attributes:
113+
label: Commands Provided (optional)
114+
description: List any command overrides your preset provides
115+
placeholder: |
116+
- speckit.specify.md — customized for compliance workflows
117+
118+
- type: textarea
119+
id: tags
120+
attributes:
121+
label: Tags
122+
description: 2-5 relevant tags (lowercase, separated by commas)
123+
placeholder: "compliance, healthcare, hipaa, audit"
124+
validations:
125+
required: true
126+
127+
- type: textarea
128+
id: features
129+
attributes:
130+
label: Key Features
131+
description: List the main features and capabilities of your preset
132+
placeholder: |
133+
- HIPAA-compliant spec templates
134+
- Audit trail checklists
135+
- Compliance review workflow
136+
validations:
137+
required: true
138+
139+
- type: checkboxes
140+
id: testing
141+
attributes:
142+
label: Testing Checklist
143+
description: Confirm that your preset has been tested
144+
options:
145+
- label: Preset installs successfully via `specify preset add`
146+
required: true
147+
- label: Template resolution works correctly after installation
148+
required: true
149+
- label: Documentation is complete and accurate
150+
required: true
151+
- label: Tested on at least one real project
152+
required: true
153+
154+
- type: checkboxes
155+
id: requirements
156+
attributes:
157+
label: Submission Requirements
158+
description: Verify your preset meets all requirements
159+
options:
160+
- label: Valid `preset.yml` manifest included
161+
required: true
162+
- label: README.md with description and usage instructions
163+
required: true
164+
- label: LICENSE file included
165+
required: true
166+
- label: GitHub release created with version tag
167+
required: true
168+
- label: Preset ID follows naming conventions (lowercase-with-hyphens)
169+
required: true

.github/workflows/release-trigger.yml

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -86,8 +86,10 @@ jobs:
8686
if [ -f "CHANGELOG.md" ]; then
8787
DATE=$(date +%Y-%m-%d)
8888
89-
# Get the previous tag to compare commits
90-
PREVIOUS_TAG=$(git describe --tags --abbrev=0 2>/dev/null || echo "")
89+
# Get the previous tag by sorting all version tags numerically
90+
# (git describe --tags only finds tags reachable from HEAD,
91+
# which misses tags on unmerged release branches)
92+
PREVIOUS_TAG=$(git tag -l 'v*' --sort=-version:refname | head -n 1)
9193
9294
echo "Generating changelog from commits..."
9395
if [[ -n "$PREVIOUS_TAG" ]]; then
@@ -104,7 +106,7 @@ jobs:
104106
echo ""
105107
echo "## [${{ steps.version.outputs.version }}] - $DATE"
106108
echo ""
107-
echo "### Changed"
109+
echo "### Changes"
108110
echo ""
109111
echo "$COMMITS"
110112
echo ""

.github/workflows/scripts/create-github-release.sh

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ gh release create "$VERSION" \
3030
.genreleases/spec-kit-template-qwen-ps-"$VERSION".zip \
3131
.genreleases/spec-kit-template-windsurf-sh-"$VERSION".zip \
3232
.genreleases/spec-kit-template-windsurf-ps-"$VERSION".zip \
33+
.genreleases/spec-kit-template-junie-sh-"$VERSION".zip \
34+
.genreleases/spec-kit-template-junie-ps-"$VERSION".zip \
3335
.genreleases/spec-kit-template-codex-sh-"$VERSION".zip \
3436
.genreleases/spec-kit-template-codex-ps-"$VERSION".zip \
3537
.genreleases/spec-kit-template-kilocode-sh-"$VERSION".zip \

.github/workflows/scripts/create-release-packages.ps1

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
1515
.PARAMETER Agents
1616
Comma or space separated subset of agents to build (default: all)
17-
Valid agents: claude, gemini, copilot, cursor-agent, qwen, opencode, windsurf, codex, kilocode, auggie, roo, codebuddy, amp, kiro-cli, bob, qodercli, shai, tabnine, agy, vibe, kimi, trae, pi, iflow, generic
17+
Valid agents: claude, gemini, copilot, cursor-agent, qwen, opencode, windsurf, junie, codex, kilocode, auggie, roo, codebuddy, amp, kiro-cli, bob, qodercli, shai, tabnine, agy, vibe, kimi, trae, pi, iflow, generic
1818
1919
.PARAMETER Scripts
2020
Comma or space separated subset of script types to build (default: both)
@@ -201,20 +201,22 @@ agent: $basename
201201
}
202202
}
203203

204-
# Create Kimi Code skills in .kimi/skills/<name>/SKILL.md format.
205-
# Kimi CLI discovers skills as directories containing a SKILL.md file,
206-
# invoked with /skill:<name> (e.g. /skill:speckit.specify).
207-
function New-KimiSkills {
204+
# Create skills in <skills_dir>\<name>\SKILL.md format.
205+
# Most agents use hyphenated names (e.g. speckit-plan); Kimi is the
206+
# current dotted-name exception (e.g. speckit.plan).
207+
function New-Skills {
208208
param(
209209
[string]$SkillsDir,
210-
[string]$ScriptVariant
210+
[string]$ScriptVariant,
211+
[string]$AgentName,
212+
[string]$Separator = '-'
211213
)
212214

213215
$templates = Get-ChildItem -Path "templates/commands/*.md" -File -ErrorAction SilentlyContinue
214216

215217
foreach ($template in $templates) {
216218
$name = [System.IO.Path]::GetFileNameWithoutExtension($template.Name)
217-
$skillName = "speckit.$name"
219+
$skillName = "speckit${Separator}$name"
218220
$skillDir = Join-Path $SkillsDir $skillName
219221
New-Item -ItemType Directory -Force -Path $skillDir | Out-Null
220222

@@ -267,7 +269,7 @@ function New-KimiSkills {
267269

268270
$body = $outputLines -join "`n"
269271
$body = $body -replace '\{ARGS\}', '$ARGUMENTS'
270-
$body = $body -replace '__AGENT__', 'kimi'
272+
$body = $body -replace '__AGENT__', $AgentName
271273
$body = Rewrite-Paths -Content $body
272274

273275
# Strip existing frontmatter, keep only body
@@ -395,9 +397,14 @@ function Build-Variant {
395397
$cmdDir = Join-Path $baseDir ".windsurf/workflows"
396398
Generate-Commands -Agent 'windsurf' -Extension 'md' -ArgFormat '$ARGUMENTS' -OutputDir $cmdDir -ScriptVariant $Script
397399
}
400+
'junie' {
401+
$cmdDir = Join-Path $baseDir ".junie/commands"
402+
Generate-Commands -Agent 'junie' -Extension 'md' -ArgFormat '$ARGUMENTS' -OutputDir $cmdDir -ScriptVariant $Script
403+
}
398404
'codex' {
399-
$cmdDir = Join-Path $baseDir ".codex/prompts"
400-
Generate-Commands -Agent 'codex' -Extension 'md' -ArgFormat '$ARGUMENTS' -OutputDir $cmdDir -ScriptVariant $Script
405+
$skillsDir = Join-Path $baseDir ".agents/skills"
406+
New-Item -ItemType Directory -Force -Path $skillsDir | Out-Null
407+
New-Skills -SkillsDir $skillsDir -ScriptVariant $Script -AgentName 'codex' -Separator '-'
401408
}
402409
'kilocode' {
403410
$cmdDir = Join-Path $baseDir ".kilocode/workflows"
@@ -452,7 +459,7 @@ function Build-Variant {
452459
'kimi' {
453460
$skillsDir = Join-Path $baseDir ".kimi/skills"
454461
New-Item -ItemType Directory -Force -Path $skillsDir | Out-Null
455-
New-KimiSkills -SkillsDir $skillsDir -ScriptVariant $Script
462+
New-Skills -SkillsDir $skillsDir -ScriptVariant $Script -AgentName 'kimi' -Separator '.'
456463
}
457464
'trae' {
458465
$rulesDir = Join-Path $baseDir ".trae/rules"
@@ -483,7 +490,7 @@ function Build-Variant {
483490
}
484491

485492
# Define all agents and scripts
486-
$AllAgents = @('claude', 'gemini', 'copilot', 'cursor-agent', 'qwen', 'opencode', 'windsurf', 'codex', 'kilocode', 'auggie', 'roo', 'codebuddy', 'amp', 'kiro-cli', 'bob', 'qodercli', 'shai', 'tabnine', 'agy', 'vibe', 'kimi', 'trae', 'pi', 'iflow', 'generic')
493+
$AllAgents = @('claude', 'gemini', 'copilot', 'cursor-agent', 'qwen', 'opencode', 'windsurf', 'junie', 'codex', 'kilocode', 'auggie', 'roo', 'codebuddy', 'amp', 'kiro-cli', 'bob', 'qodercli', 'shai', 'tabnine', 'agy', 'vibe', 'kimi', 'trae', 'pi', 'iflow', 'generic')
487494
$AllScripts = @('sh', 'ps')
488495

489496
function Normalize-List {

.github/workflows/scripts/create-release-packages.sh

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ set -euo pipefail
66
# Usage: .github/workflows/scripts/create-release-packages.sh <version>
77
# Version argument should include leading 'v'.
88
# Optionally set AGENTS and/or SCRIPTS env vars to limit what gets built.
9-
# AGENTS : space or comma separated subset of: claude gemini copilot cursor-agent qwen opencode windsurf codex kilocode auggie roo codebuddy amp shai tabnine kiro-cli agy bob vibe qodercli kimi trae pi iflow generic (default: all)
9+
# AGENTS : space or comma separated subset of: claude gemini copilot cursor-agent qwen opencode windsurf junie codex kilocode auggie roo codebuddy amp shai tabnine kiro-cli agy bob vibe qodercli kimi trae pi iflow generic (default: all)
1010
# SCRIPTS : space or comma separated subset of: sh ps (default: both)
1111
# Examples:
1212
# AGENTS=claude SCRIPTS=sh $0 v0.2.0
@@ -121,18 +121,20 @@ EOF
121121
done
122122
}
123123

124-
# Create Kimi Code skills in .kimi/skills/<name>/SKILL.md format.
125-
# Kimi CLI discovers skills as directories containing a SKILL.md file,
126-
# invoked with /skill:<name> (e.g. /skill:speckit.specify).
127-
create_kimi_skills() {
124+
# Create skills in <skills_dir>/<name>/SKILL.md format.
125+
# Most agents use hyphenated names (e.g. speckit-plan); Kimi is the
126+
# current dotted-name exception (e.g. speckit.plan).
127+
create_skills() {
128128
local skills_dir="$1"
129129
local script_variant="$2"
130+
local agent_name="$3"
131+
local separator="${4:-"-"}"
130132

131133
for template in templates/commands/*.md; do
132134
[[ -f "$template" ]] || continue
133135
local name
134136
name=$(basename "$template" .md)
135-
local skill_name="speckit.${name}"
137+
local skill_name="speckit${separator}${name}"
136138
local skill_dir="${skills_dir}/${skill_name}"
137139
mkdir -p "$skill_dir"
138140

@@ -175,9 +177,9 @@ create_kimi_skills() {
175177
in_frontmatter && skip_scripts && /^[[:space:]]/ { next }
176178
{ print }
177179
')
178-
body=$(printf '%s\n' "$body" | sed 's/{ARGS}/\$ARGUMENTS/g' | sed 's/__AGENT__/kimi/g' | rewrite_paths)
180+
body=$(printf '%s\n' "$body" | sed 's/{ARGS}/\$ARGUMENTS/g' | sed "s/__AGENT__/$agent_name/g" | rewrite_paths)
179181

180-
# Strip existing frontmatter and prepend Kimi frontmatter
182+
# Strip existing frontmatter and prepend skills frontmatter.
181183
local template_body
182184
template_body=$(printf '%s\n' "$body" | awk '/^---/{p++; if(p==2){found=1; next}} found')
183185

@@ -248,9 +250,12 @@ build_variant() {
248250
windsurf)
249251
mkdir -p "$base_dir/.windsurf/workflows"
250252
generate_commands windsurf md "\$ARGUMENTS" "$base_dir/.windsurf/workflows" "$script" ;;
253+
junie)
254+
mkdir -p "$base_dir/.junie/commands"
255+
generate_commands junie md "\$ARGUMENTS" "$base_dir/.junie/commands" "$script" ;;
251256
codex)
252-
mkdir -p "$base_dir/.codex/prompts"
253-
generate_commands codex md "\$ARGUMENTS" "$base_dir/.codex/prompts" "$script" ;;
257+
mkdir -p "$base_dir/.agents/skills"
258+
create_skills "$base_dir/.agents/skills" "$script" "codex" "-" ;;
254259
kilocode)
255260
mkdir -p "$base_dir/.kilocode/workflows"
256261
generate_commands kilocode md "\$ARGUMENTS" "$base_dir/.kilocode/workflows" "$script" ;;
@@ -290,7 +295,7 @@ build_variant() {
290295
generate_commands vibe md "\$ARGUMENTS" "$base_dir/.vibe/prompts" "$script" ;;
291296
kimi)
292297
mkdir -p "$base_dir/.kimi/skills"
293-
create_kimi_skills "$base_dir/.kimi/skills" "$script" ;;
298+
create_skills "$base_dir/.kimi/skills" "$script" "kimi" "." ;;
294299
trae)
295300
mkdir -p "$base_dir/.trae/rules"
296301
generate_commands trae md "\$ARGUMENTS" "$base_dir/.trae/rules" "$script" ;;
@@ -309,7 +314,7 @@ build_variant() {
309314
}
310315

311316
# Determine agent list
312-
ALL_AGENTS=(claude gemini copilot cursor-agent qwen opencode windsurf codex kilocode auggie roo codebuddy amp shai tabnine kiro-cli agy bob vibe qodercli kimi trae pi iflow generic)
317+
ALL_AGENTS=(claude gemini copilot cursor-agent qwen opencode windsurf junie codex kilocode auggie roo codebuddy amp shai tabnine kiro-cli agy bob vibe qodercli kimi trae pi iflow generic)
313318
ALL_SCRIPTS=(sh ps)
314319

315320
norm_list() {

0 commit comments

Comments
 (0)