Compare commits
3 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ad746ce35d | ||
|
|
14ac43ba41 | ||
|
|
0857f83de8 |
@@ -28,29 +28,8 @@ fi
|
|||||||
|
|
||||||
# Create release notes
|
# Create release notes
|
||||||
cat > release_notes.md << EOF
|
cat > release_notes.md << EOF
|
||||||
Template release $NEW_VERSION
|
This is the latest set of releases that you can use with your agent of choice. We recommend using the Specify CLI to scaffold your projects, however you can download these independently and manage them yourself.
|
||||||
|
|
||||||
Updated specification-driven development templates for GitHub Copilot, Claude Code, Gemini CLI, Cursor, Qwen, opencode, Windsurf, and Codex.
|
|
||||||
|
|
||||||
Now includes per-script variants for POSIX shell (sh) and PowerShell (ps).
|
|
||||||
|
|
||||||
Download the template for your preferred AI assistant + script type:
|
|
||||||
- spec-kit-template-copilot-sh-$NEW_VERSION.zip
|
|
||||||
- spec-kit-template-copilot-ps-$NEW_VERSION.zip
|
|
||||||
- spec-kit-template-claude-sh-$NEW_VERSION.zip
|
|
||||||
- spec-kit-template-claude-ps-$NEW_VERSION.zip
|
|
||||||
- spec-kit-template-gemini-sh-$NEW_VERSION.zip
|
|
||||||
- spec-kit-template-gemini-ps-$NEW_VERSION.zip
|
|
||||||
- spec-kit-template-cursor-sh-$NEW_VERSION.zip
|
|
||||||
- spec-kit-template-cursor-ps-$NEW_VERSION.zip
|
|
||||||
- spec-kit-template-opencode-sh-$NEW_VERSION.zip
|
|
||||||
- spec-kit-template-opencode-ps-$NEW_VERSION.zip
|
|
||||||
- spec-kit-template-qwen-sh-$NEW_VERSION.zip
|
|
||||||
- spec-kit-template-qwen-ps-$NEW_VERSION.zip
|
|
||||||
- spec-kit-template-windsurf-sh-$NEW_VERSION.zip
|
|
||||||
- spec-kit-template-windsurf-ps-$NEW_VERSION.zip
|
|
||||||
- spec-kit-template-codex-sh-$NEW_VERSION.zip
|
|
||||||
- spec-kit-template-codex-ps-$NEW_VERSION.zip
|
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
echo "Generated release notes:"
|
echo "Generated release notes:"
|
||||||
|
|||||||
@@ -5,6 +5,12 @@ All notable changes to the Specify CLI will be documented in this file.
|
|||||||
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
||||||
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
||||||
|
|
||||||
|
## [0.0.14] - 2025-09-21
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- Error messages are now shown consistently.
|
||||||
|
|
||||||
## [0.0.13] - 2025-09-21
|
## [0.0.13] - 2025-09-21
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
|
|||||||
@@ -382,8 +382,6 @@ def check_tool(tool: str, install_hint: str) -> bool:
|
|||||||
if shutil.which(tool):
|
if shutil.which(tool):
|
||||||
return True
|
return True
|
||||||
else:
|
else:
|
||||||
console.print(f"[yellow]⚠️ {tool} not found[/yellow]")
|
|
||||||
console.print(f" Install with: [cyan]{install_hint}[/cyan]")
|
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
||||||
@@ -817,7 +815,15 @@ def init(
|
|||||||
project_path = Path(project_name).resolve()
|
project_path = Path(project_name).resolve()
|
||||||
# Check if project directory already exists
|
# Check if project directory already exists
|
||||||
if project_path.exists():
|
if project_path.exists():
|
||||||
console.print(f"[red]Error:[/red] Directory '{project_name}' already exists")
|
error_panel = Panel(
|
||||||
|
f"Directory '[cyan]{project_name}[/cyan]' already exists\n"
|
||||||
|
"Please choose a different project name or remove the existing directory.",
|
||||||
|
title="[red]Directory Conflict[/red]",
|
||||||
|
border_style="red",
|
||||||
|
padding=(1, 2)
|
||||||
|
)
|
||||||
|
console.print()
|
||||||
|
console.print(error_panel)
|
||||||
raise typer.Exit(1)
|
raise typer.Exit(1)
|
||||||
|
|
||||||
# Create formatted setup info with column alignment
|
# Create formatted setup info with column alignment
|
||||||
@@ -861,35 +867,45 @@ def init(
|
|||||||
# Check agent tools unless ignored
|
# Check agent tools unless ignored
|
||||||
if not ignore_agent_tools:
|
if not ignore_agent_tools:
|
||||||
agent_tool_missing = False
|
agent_tool_missing = False
|
||||||
|
install_url = ""
|
||||||
if selected_ai == "claude":
|
if selected_ai == "claude":
|
||||||
if not check_tool("claude", "Install from: https://docs.anthropic.com/en/docs/claude-code/setup"):
|
if not check_tool("claude", "https://docs.anthropic.com/en/docs/claude-code/setup"):
|
||||||
console.print("[red]Error:[/red] Claude CLI is required for Claude Code projects")
|
install_url = "https://docs.anthropic.com/en/docs/claude-code/setup"
|
||||||
agent_tool_missing = True
|
agent_tool_missing = True
|
||||||
elif selected_ai == "gemini":
|
elif selected_ai == "gemini":
|
||||||
if not check_tool("gemini", "Install from: https://github.com/google-gemini/gemini-cli"):
|
if not check_tool("gemini", "https://github.com/google-gemini/gemini-cli"):
|
||||||
console.print("[red]Error:[/red] Gemini CLI is required for Gemini projects")
|
install_url = "https://github.com/google-gemini/gemini-cli"
|
||||||
agent_tool_missing = True
|
agent_tool_missing = True
|
||||||
elif selected_ai == "qwen":
|
elif selected_ai == "qwen":
|
||||||
if not check_tool("qwen", "Install from: https://github.com/QwenLM/qwen-code"):
|
if not check_tool("qwen", "https://github.com/QwenLM/qwen-code"):
|
||||||
console.print("[red]Error:[/red] Qwen CLI is required for Qwen Code projects")
|
install_url = "https://github.com/QwenLM/qwen-code"
|
||||||
agent_tool_missing = True
|
agent_tool_missing = True
|
||||||
elif selected_ai == "opencode":
|
elif selected_ai == "opencode":
|
||||||
if not check_tool("opencode", "Install from: https://opencode.ai"):
|
if not check_tool("opencode", "https://opencode.ai"):
|
||||||
console.print("[red]Error:[/red] opencode CLI is required for opencode projects")
|
install_url = "https://opencode.ai"
|
||||||
agent_tool_missing = True
|
agent_tool_missing = True
|
||||||
elif selected_ai == "codex":
|
elif selected_ai == "codex":
|
||||||
if not check_tool("codex", "Install from: https://github.com/openai/codex"):
|
if not check_tool("codex", "https://github.com/openai/codex"):
|
||||||
console.print("[red]Error:[/red] Codex CLI is required for Codex projects")
|
install_url = "https://github.com/openai/codex"
|
||||||
agent_tool_missing = True
|
agent_tool_missing = True
|
||||||
elif selected_ai == "auggie":
|
elif selected_ai == "auggie":
|
||||||
if not check_tool("auggie", "Install from: https://docs.augmentcode.com/cli/setup-auggie/install-auggie-cli"):
|
if not check_tool("auggie", "https://docs.augmentcode.com/cli/setup-auggie/install-auggie-cli"):
|
||||||
console.print("[red]Error:[/red] Auggie CLI is required for Auggie CLI projects")
|
install_url = "https://docs.augmentcode.com/cli/setup-auggie/install-auggie-cli"
|
||||||
agent_tool_missing = True
|
agent_tool_missing = True
|
||||||
# GitHub Copilot and Cursor checks are not needed as they're typically available in supported IDEs
|
# GitHub Copilot and Cursor checks are not needed as they're typically available in supported IDEs
|
||||||
|
|
||||||
if agent_tool_missing:
|
if agent_tool_missing:
|
||||||
console.print("\n[red]Required AI tool is missing![/red]")
|
error_panel = Panel(
|
||||||
console.print("[yellow]Tip:[/yellow] Use --ignore-agent-tools to skip this check")
|
f"[cyan]{selected_ai}[/cyan] not found\n"
|
||||||
|
f"Install with: [cyan]{install_url}[/cyan]\n"
|
||||||
|
f"{AI_CHOICES[selected_ai]} is required to continue with this project type.\n\n"
|
||||||
|
"Tip: Use [cyan]--ignore-agent-tools[/cyan] to skip this check",
|
||||||
|
title="[red]Agent Detection Error[/red]",
|
||||||
|
border_style="red",
|
||||||
|
padding=(1, 2)
|
||||||
|
)
|
||||||
|
console.print()
|
||||||
|
console.print(error_panel)
|
||||||
raise typer.Exit(1)
|
raise typer.Exit(1)
|
||||||
|
|
||||||
# Determine script type (explicit, interactive, or OS default)
|
# Determine script type (explicit, interactive, or OS default)
|
||||||
@@ -998,7 +1014,7 @@ def init(
|
|||||||
"codex": ".codex/",
|
"codex": ".codex/",
|
||||||
"windsurf": ".windsurf/",
|
"windsurf": ".windsurf/",
|
||||||
"kilocode": ".kilocode/",
|
"kilocode": ".kilocode/",
|
||||||
"auggie": ".auggie/",
|
"auggie": ".augment/",
|
||||||
"copilot": ".github/"
|
"copilot": ".github/"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user