diff --git a/AGENTS.md b/AGENTS.md index 3a11e3eee..d8dc0f08f 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -66,6 +66,7 @@ AGENT_CONFIG = { "new-agent-cli": { # Use the ACTUAL CLI tool name (what users type in terminal) "name": "New Agent Display Name", "folder": ".newagent/", # Directory for agent files + "commands_subdir": "commands", # Subdirectory name for command files (default: "commands") "install_url": "https://example.com/install", # URL for installation docs (or None if IDE-based) "requires_cli": True, # True if CLI tool required, False for IDE-based agents }, @@ -83,6 +84,10 @@ This eliminates the need for special-case mappings throughout the codebase. - `name`: Human-readable display name shown to users - `folder`: Directory where agent-specific files are stored (relative to project root) +- `commands_subdir`: Subdirectory name within the agent folder where command/prompt files are stored (default: `"commands"`) + - Most agents use `"commands"` (e.g., `.claude/commands/`) + - Some agents use alternative names: `"agents"` (copilot), `"workflows"` (windsurf, kilocode, agy), `"prompts"` (codex, q), `"command"` (opencode - singular) + - This field enables `--ai-skills` to locate command templates correctly for skill generation - `install_url`: Installation documentation URL (set to `None` for IDE-based agents) - `requires_cli`: Whether the agent requires a CLI tool check during initialization diff --git a/CHANGELOG.md b/CHANGELOG.md index ab20202cb..7163d2b89 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,15 @@ 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.1.5] - Unreleased + +### Fixed + +- **AI Skills Installation Bug (#1658)**: Fixed `--ai-skills` flag not generating skill files for GitHub Copilot and other agents with non-standard command directory structures + - Added `commands_subdir` field to `AGENT_CONFIG` to explicitly specify the subdirectory name for each agent + - Affected agents now work correctly: copilot (`.github/agents/`), opencode (`.opencode/command/`), windsurf (`.windsurf/workflows/`), codex (`.codex/prompts/`), kilocode (`.kilocode/workflows/`), q (`.amazonq/prompts/`), and agy (`.agent/workflows/`) + - The `install_ai_skills()` function now uses the correct path for all agents instead of assuming `commands/` for everyone + ## [0.1.4] - Unreleased ### Fixed diff --git a/pyproject.toml b/pyproject.toml index 7af6f963c..2567f0ed4 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "specify-cli" -version = "0.1.4" +version = "0.1.5" description = "Specify CLI, part of GitHub Spec Kit. A tool to bootstrap your projects for Spec-Driven Development (SDD)." requires-python = ">=3.11" dependencies = [ diff --git a/src/specify_cli/__init__.py b/src/specify_cli/__init__.py index c8c01f4c9..f9a713999 100644 --- a/src/specify_cli/__init__.py +++ b/src/specify_cli/__init__.py @@ -123,119 +123,138 @@ def _format_rate_limit_error(status_code: int, headers: httpx.Headers, url: str) return "\n".join(lines) -# Agent configuration with name, folder, install URL, and CLI tool requirement +# Agent configuration with name, folder, install URL, CLI tool requirement, and commands subdirectory AGENT_CONFIG = { "copilot": { "name": "GitHub Copilot", "folder": ".github/", + "commands_subdir": "agents", # Special: uses agents/ not commands/ "install_url": None, # IDE-based, no CLI check needed "requires_cli": False, }, "claude": { "name": "Claude Code", "folder": ".claude/", + "commands_subdir": "commands", "install_url": "https://docs.anthropic.com/en/docs/claude-code/setup", "requires_cli": True, }, "gemini": { "name": "Gemini CLI", "folder": ".gemini/", + "commands_subdir": "commands", "install_url": "https://github.com/google-gemini/gemini-cli", "requires_cli": True, }, "cursor-agent": { "name": "Cursor", "folder": ".cursor/", + "commands_subdir": "commands", "install_url": None, # IDE-based "requires_cli": False, }, "qwen": { "name": "Qwen Code", "folder": ".qwen/", + "commands_subdir": "commands", "install_url": "https://github.com/QwenLM/qwen-code", "requires_cli": True, }, "opencode": { "name": "opencode", "folder": ".opencode/", + "commands_subdir": "command", # Special: singular 'command' not 'commands' "install_url": "https://opencode.ai", "requires_cli": True, }, "codex": { "name": "Codex CLI", "folder": ".codex/", + "commands_subdir": "prompts", # Special: uses prompts/ not commands/ "install_url": "https://github.com/openai/codex", "requires_cli": True, }, "windsurf": { "name": "Windsurf", "folder": ".windsurf/", + "commands_subdir": "workflows", # Special: uses workflows/ not commands/ "install_url": None, # IDE-based "requires_cli": False, }, "kilocode": { "name": "Kilo Code", "folder": ".kilocode/", + "commands_subdir": "workflows", # Special: uses workflows/ not commands/ "install_url": None, # IDE-based "requires_cli": False, }, "auggie": { "name": "Auggie CLI", "folder": ".augment/", + "commands_subdir": "commands", "install_url": "https://docs.augmentcode.com/cli/setup-auggie/install-auggie-cli", "requires_cli": True, }, "codebuddy": { "name": "CodeBuddy", "folder": ".codebuddy/", + "commands_subdir": "commands", "install_url": "https://www.codebuddy.ai/cli", "requires_cli": True, }, "qodercli": { "name": "Qoder CLI", "folder": ".qoder/", + "commands_subdir": "commands", "install_url": "https://qoder.com/cli", "requires_cli": True, }, "roo": { "name": "Roo Code", "folder": ".roo/", + "commands_subdir": "commands", "install_url": None, # IDE-based "requires_cli": False, }, "q": { "name": "Amazon Q Developer CLI", "folder": ".amazonq/", + "commands_subdir": "prompts", # Special: uses prompts/ not commands/ "install_url": "https://aws.amazon.com/developer/learning/q-developer-cli/", "requires_cli": True, }, "amp": { "name": "Amp", "folder": ".agents/", + "commands_subdir": "commands", "install_url": "https://ampcode.com/manual#install", "requires_cli": True, }, "shai": { "name": "SHAI", "folder": ".shai/", + "commands_subdir": "commands", "install_url": "https://github.com/ovh/shai", "requires_cli": True, }, "agy": { "name": "Antigravity", "folder": ".agent/", + "commands_subdir": "workflows", # Special: uses workflows/ not commands/ "install_url": None, # IDE-based "requires_cli": False, }, "bob": { "name": "IBM Bob", "folder": ".bob/", + "commands_subdir": "commands", "install_url": None, # IDE-based "requires_cli": False, }, "generic": { "name": "Generic (bring your own agent)", "folder": None, # Set dynamically via --ai-commands-dir + "commands_subdir": "commands", "install_url": None, "requires_cli": False, }, @@ -1056,10 +1075,11 @@ def install_ai_skills(project_path: Path, selected_ai: str, tracker: StepTracker # download_and_extract_template() already placed the .md files here. agent_config = AGENT_CONFIG.get(selected_ai, {}) agent_folder = agent_config.get("folder", "") + commands_subdir = agent_config.get("commands_subdir", "commands") if agent_folder: - templates_dir = project_path / agent_folder.rstrip("/") / "commands" + templates_dir = project_path / agent_folder.rstrip("/") / commands_subdir else: - templates_dir = project_path / "commands" + templates_dir = project_path / commands_subdir if not templates_dir.exists() or not any(templates_dir.glob("*.md")): # Fallback: try the repo-relative path (for running from source checkout)