mirror of
https://github.com/github/spec-kit.git
synced 2026-07-03 12:28:06 +08:00
* feat: add Hermes Agent integration * feat: add Hermes Agent integration * feat: add Hermes Agent integration * feat: add Hermes Agent integration (with review fixes) - Full SkillsIntegration subclass with dual install strategy (project-local .hermes/skills/ + global ~/.hermes/skills/) - CLI fix: integration_uninstall now calls integration.teardown() instead of manifest.uninstall() directly, allowing custom cleanup - Fix Copilot review issues: - Docstring now reflects both -Q (quiet) and -q (query) flags - Empty command guard prevents passing empty skill names - Add catalog entry for hermes in integrations/catalog.json Co-authored-by: Zhaoxiaoguang001 <3357983213@qq.com> * feat: write Hermes skills directly to global ~/.hermes/skills/ Hermes loads skills from the global ~/.hermes/skills/ directory, not from project-local paths. The old dual-install strategy copied SKILL.md files to both locations — project-local (for manifest tracking) and global (for Hermes discovery). This change removes the project-local copies entirely: - setup() writes directly to ~/.hermes/skills/speckit-*/SKILL.md - An empty .hermes/skills/ marker directory is created in the project so extension commands (e.g. git) can detect Hermes as an active integration via register_commands_for_all_agents() - teardown() cleans both the global speckit-* dirs and the local marker - import yaml moved to local import inside setup() Tests updated: Hermes-specific tests now assert global skill location, and shared SkillsIntegrationTests that assumed project-local files are overridden with Hermes-appropriate assertions. Co-authored-by: Zhaoxiaoguang001 <3357983213@qq.com> * fix: address Copilot review feedback on Hermes integration Addresses all 6 review comments from copilot-pull-request-reviewer: 1. Hard-fail on missing integration key → fall back to manifest.uninstall() with a warning instead of raising an error. Allows users to always remove stale integration files even when the integration class is missing from the registry. 2. HOME isolation in tests → every test that calls setup() or CliRunner now monkeypatches Path.home() to a temp directory, keeping the test suite hermetic and non-destructive. 3. HermesIntegration.teardown() now delegates to manifest.uninstall() for project-local tracked files (scripts, manifest), merging results with global cleanup. 4. Global skills cleanup gated behind force=True to avoid destroying speckit-* skills shared across multiple Spec Kit projects when running 'specify integration uninstall hermes' without --force. 5. Line 160 isolation (CLI test test_complete_file_inventory_sh). 6. Line 258 isolation (Path.home assertion in test_ai_hermes_without_ai_skills_auto_promotes). * fix: address second Copilot review round — 6 remaining observations - Move to module scope (was inside per-template loop) - Add safety checks in setup() matching standard - Fix docstrings: global skills always removed on uninstall (standard) - Fix removal tracking: only report after successful rmtree - Override shared test_modified_file_survives_uninstall with Hermes-appropriate behaviour (global skills always removed, no hash tracking) - Update PR description to match implementation (global-only skills + marker) * fix: add first-class global/home-based agent dir support in CommandRegistrar Resolves Copilot HIGH concern (discussion_r3312194525): HermesIntegration.registrar_config.dir was '.hermes/skills' (project- relative), but skills live in ~/.hermes/skills/ (global). Extensions and presets registering commands for the 'hermes' agent via CommandRegistrar would write to the project-local marker directory instead of the real global skills directory, making those commands invisible to Hermes. Fix consists of three parts: 1. CommandRegistrar._resolve_agent_dir now supports '~/'-prefixed and absolute paths in agent_config['dir']. Relative paths still resolve against project_root as before — zero change for existing agents (Claude, Codex, Gemini, etc.). 2. HermesIntegration.registrar_config.dir changed from '.hermes/skills' to '~/.hermes/skills', so extensions/presets write directly to the global directory Hermes searches at runtime. 3. Two inline project_root / agent_config['dir'] calls in the extension update backup/restore paths (src/specify_cli/__init__.py) now delegate to _resolve_agent_dir, giving them the same global-dir support plus the legacy_dir fallback they were missing (improvement for all agents). Test side-effect: test_update_failure_rolls_back_registry_hooks_and_commands was constructing verification paths with project_dir / '~/.hermes/skills' (literal tilde) — fixed to use _resolve_agent_dir and monkeypatch Path.home() so Hermes' global dir doesn't leak into the real filesystem. * fix: address remaining 3 Copilot review observations (round 3) - teardown docstring: clarify marker removal is conditional (if empty) - test_pre_existing_skills_not_removed: now actually calls teardown() to verify foreign skills survive uninstall (was only running setup) - integration_switch Phase 1: replaced old_manifest.uninstall() + remove_context_section() with current_integration.teardown(), matching the pattern already used in integration_uninstall. This ensures custom teardown logic (e.g. Hermes global skills cleanup) runs during switches. * fix: address Copilot round 4 — home-relative dir resolution + project-local detection 1. _resolve_agent_dir(): expand ~/... via Path.home() + slice instead of expanduser(), so tests that monkeypatch Path.home() properly isolate the home directory (Copilot r3312731595, r3312731729) 2. Add detect_dir field to registrar_config: Hermes declares detect_dir='.hermes/skills' (project-local marker). CommandRegistrar checks detect_dir before resolving the output dir, preventing global dirs like ~/.hermes/skills from causing false detection in every project (Copilot r3312731682) 3. test_update_failure_rolls_back: no additional changes needed — the _resolve_agent_dir fix makes the existing Path.home() monkeypatch effective, so ~/.hermes/skills is not found in the fake home and Hermes is properly skipped. Tests: 2236 passed (2009 integration + 195 extension + 32 hermes) --------- Co-authored-by: Zhaoxiaoguang001 <3357983213@qq.com> Co-authored-by: majordave <majordave@users.noreply.github.com>
287 lines
8.6 KiB
JSON
287 lines
8.6 KiB
JSON
{
|
|
"schema_version": "1.0",
|
|
"updated_at": "2026-04-29T00:00:00Z",
|
|
"catalog_url": "https://raw.githubusercontent.com/github/spec-kit/main/integrations/catalog.json",
|
|
"integrations": {
|
|
"claude": {
|
|
"id": "claude",
|
|
"name": "Claude Code",
|
|
"version": "1.0.0",
|
|
"description": "Anthropic Claude Code CLI integration",
|
|
"author": "spec-kit-core",
|
|
"repository": "https://github.com/github/spec-kit",
|
|
"tags": ["cli", "anthropic"]
|
|
},
|
|
"copilot": {
|
|
"id": "copilot",
|
|
"name": "GitHub Copilot",
|
|
"version": "1.0.0",
|
|
"description": "GitHub Copilot IDE integration with agent commands and prompt files",
|
|
"author": "spec-kit-core",
|
|
"repository": "https://github.com/github/spec-kit",
|
|
"tags": ["ide", "github"]
|
|
},
|
|
"gemini": {
|
|
"id": "gemini",
|
|
"name": "Gemini CLI",
|
|
"version": "1.0.0",
|
|
"description": "Google Gemini CLI integration with TOML command format",
|
|
"author": "spec-kit-core",
|
|
"repository": "https://github.com/github/spec-kit",
|
|
"tags": ["cli", "google"]
|
|
},
|
|
"cursor-agent": {
|
|
"id": "cursor-agent",
|
|
"name": "Cursor",
|
|
"version": "1.0.0",
|
|
"description": "Cursor IDE integration",
|
|
"author": "spec-kit-core",
|
|
"repository": "https://github.com/github/spec-kit",
|
|
"tags": ["ide"]
|
|
},
|
|
"windsurf": {
|
|
"id": "windsurf",
|
|
"name": "Windsurf",
|
|
"version": "1.0.0",
|
|
"description": "Windsurf IDE workflow integration",
|
|
"author": "spec-kit-core",
|
|
"repository": "https://github.com/github/spec-kit",
|
|
"tags": ["ide"]
|
|
},
|
|
"amp": {
|
|
"id": "amp",
|
|
"name": "Amp",
|
|
"version": "1.0.0",
|
|
"description": "Amp CLI integration",
|
|
"author": "spec-kit-core",
|
|
"repository": "https://github.com/github/spec-kit",
|
|
"tags": ["cli"]
|
|
},
|
|
"codex": {
|
|
"id": "codex",
|
|
"name": "Codex CLI",
|
|
"version": "1.0.0",
|
|
"description": "Codex CLI skills-based integration",
|
|
"author": "spec-kit-core",
|
|
"repository": "https://github.com/github/spec-kit",
|
|
"tags": ["cli", "skills"]
|
|
},
|
|
"devin": {
|
|
"id": "devin",
|
|
"name": "Devin for Terminal",
|
|
"version": "1.0.0",
|
|
"description": "Devin for Terminal CLI skills-based integration",
|
|
"author": "spec-kit-core",
|
|
"repository": "https://github.com/github/spec-kit",
|
|
"tags": ["cli", "skills"]
|
|
},
|
|
"qwen": {
|
|
"id": "qwen",
|
|
"name": "Qwen Code",
|
|
"version": "1.0.0",
|
|
"description": "Alibaba Qwen Code CLI integration",
|
|
"author": "spec-kit-core",
|
|
"repository": "https://github.com/github/spec-kit",
|
|
"tags": ["cli", "alibaba"]
|
|
},
|
|
"opencode": {
|
|
"id": "opencode",
|
|
"name": "opencode",
|
|
"version": "1.0.0",
|
|
"description": "opencode CLI integration",
|
|
"author": "spec-kit-core",
|
|
"repository": "https://github.com/github/spec-kit",
|
|
"tags": ["cli"]
|
|
},
|
|
"forge": {
|
|
"id": "forge",
|
|
"name": "Forge",
|
|
"version": "1.0.0",
|
|
"description": "Forge CLI integration with parameter-based commands",
|
|
"author": "spec-kit-core",
|
|
"repository": "https://github.com/github/spec-kit",
|
|
"tags": ["cli"]
|
|
},
|
|
"kiro-cli": {
|
|
"id": "kiro-cli",
|
|
"name": "Kiro CLI",
|
|
"version": "1.0.0",
|
|
"description": "Kiro CLI prompt-based integration",
|
|
"author": "spec-kit-core",
|
|
"repository": "https://github.com/github/spec-kit",
|
|
"tags": ["cli"]
|
|
},
|
|
"junie": {
|
|
"id": "junie",
|
|
"name": "Junie",
|
|
"version": "1.0.0",
|
|
"description": "Junie by JetBrains CLI integration",
|
|
"author": "spec-kit-core",
|
|
"repository": "https://github.com/github/spec-kit",
|
|
"tags": ["cli", "jetbrains"]
|
|
},
|
|
"auggie": {
|
|
"id": "auggie",
|
|
"name": "Auggie CLI",
|
|
"version": "1.0.0",
|
|
"description": "Auggie CLI integration",
|
|
"author": "spec-kit-core",
|
|
"repository": "https://github.com/github/spec-kit",
|
|
"tags": ["cli"]
|
|
},
|
|
"shai": {
|
|
"id": "shai",
|
|
"name": "SHAI",
|
|
"version": "1.0.0",
|
|
"description": "SHAI CLI integration",
|
|
"author": "spec-kit-core",
|
|
"repository": "https://github.com/github/spec-kit",
|
|
"tags": ["cli"]
|
|
},
|
|
"tabnine": {
|
|
"id": "tabnine",
|
|
"name": "Tabnine CLI",
|
|
"version": "1.0.0",
|
|
"description": "Tabnine CLI integration with TOML command format",
|
|
"author": "spec-kit-core",
|
|
"repository": "https://github.com/github/spec-kit",
|
|
"tags": ["cli"]
|
|
},
|
|
"kilocode": {
|
|
"id": "kilocode",
|
|
"name": "Kilo Code",
|
|
"version": "1.0.0",
|
|
"description": "Kilo Code IDE workflow integration",
|
|
"author": "spec-kit-core",
|
|
"repository": "https://github.com/github/spec-kit",
|
|
"tags": ["ide"]
|
|
},
|
|
"roo": {
|
|
"id": "roo",
|
|
"name": "Roo Code",
|
|
"version": "1.0.0",
|
|
"description": "Roo Code IDE integration",
|
|
"author": "spec-kit-core",
|
|
"repository": "https://github.com/github/spec-kit",
|
|
"tags": ["ide"]
|
|
},
|
|
"bob": {
|
|
"id": "bob",
|
|
"name": "IBM Bob",
|
|
"version": "1.0.0",
|
|
"description": "IBM Bob IDE integration",
|
|
"author": "spec-kit-core",
|
|
"repository": "https://github.com/github/spec-kit",
|
|
"tags": ["ide", "ibm"]
|
|
},
|
|
"trae": {
|
|
"id": "trae",
|
|
"name": "Trae",
|
|
"version": "1.0.0",
|
|
"description": "Trae IDE rules-based integration",
|
|
"author": "spec-kit-core",
|
|
"repository": "https://github.com/github/spec-kit",
|
|
"tags": ["ide"]
|
|
},
|
|
"codebuddy": {
|
|
"id": "codebuddy",
|
|
"name": "CodeBuddy",
|
|
"version": "1.0.0",
|
|
"description": "CodeBuddy CLI integration",
|
|
"author": "spec-kit-core",
|
|
"repository": "https://github.com/github/spec-kit",
|
|
"tags": ["cli"]
|
|
},
|
|
"qodercli": {
|
|
"id": "qodercli",
|
|
"name": "Qoder CLI",
|
|
"version": "1.0.0",
|
|
"description": "Qoder CLI integration",
|
|
"author": "spec-kit-core",
|
|
"repository": "https://github.com/github/spec-kit",
|
|
"tags": ["cli"]
|
|
},
|
|
"kimi": {
|
|
"id": "kimi",
|
|
"name": "Kimi Code",
|
|
"version": "1.0.0",
|
|
"description": "Kimi Code CLI skills-based integration by Moonshot AI",
|
|
"author": "spec-kit-core",
|
|
"repository": "https://github.com/github/spec-kit",
|
|
"tags": ["cli", "skills"]
|
|
},
|
|
"lingma": {
|
|
"id": "lingma",
|
|
"name": "Lingma",
|
|
"version": "1.0.0",
|
|
"description": "Lingma IDE skills-based integration",
|
|
"author": "spec-kit-core",
|
|
"repository": "https://github.com/github/spec-kit",
|
|
"tags": ["ide", "skills"]
|
|
},
|
|
"pi": {
|
|
"id": "pi",
|
|
"name": "Pi Coding Agent",
|
|
"version": "1.0.0",
|
|
"description": "Pi terminal coding agent prompt-based integration",
|
|
"author": "spec-kit-core",
|
|
"repository": "https://github.com/github/spec-kit",
|
|
"tags": ["cli"]
|
|
},
|
|
"iflow": {
|
|
"id": "iflow",
|
|
"name": "iFlow CLI",
|
|
"version": "1.0.0",
|
|
"description": "iFlow CLI integration by iflow-ai",
|
|
"author": "spec-kit-core",
|
|
"repository": "https://github.com/github/spec-kit",
|
|
"tags": ["cli"]
|
|
},
|
|
"vibe": {
|
|
"id": "vibe",
|
|
"name": "Mistral Vibe",
|
|
"version": "1.0.0",
|
|
"description": "Mistral Vibe CLI prompt-based integration",
|
|
"author": "spec-kit-core",
|
|
"repository": "https://github.com/github/spec-kit",
|
|
"tags": ["cli", "mistral"]
|
|
},
|
|
"agy": {
|
|
"id": "agy",
|
|
"name": "Antigravity",
|
|
"version": "1.0.0",
|
|
"description": "Antigravity IDE skills-based integration",
|
|
"author": "spec-kit-core",
|
|
"repository": "https://github.com/github/spec-kit",
|
|
"tags": ["ide", "skills"]
|
|
},
|
|
"generic": {
|
|
"id": "generic",
|
|
"name": "Generic (bring your own agent)",
|
|
"version": "1.0.0",
|
|
"description": "Generic integration for any agent via --ai-commands-dir",
|
|
"author": "spec-kit-core",
|
|
"repository": "https://github.com/github/spec-kit",
|
|
"tags": ["generic"]
|
|
},
|
|
"goose": {
|
|
"id": "goose",
|
|
"name": "Goose",
|
|
"version": "1.0.0",
|
|
"description": "Goose CLI integration with YAML recipe format",
|
|
"author": "spec-kit-core",
|
|
"repository": "https://github.com/github/spec-kit",
|
|
"tags": ["cli"]
|
|
},
|
|
"hermes": {
|
|
"id": "hermes",
|
|
"name": "Hermes Agent",
|
|
"version": "1.0.0",
|
|
"description": "Hermes Agent skills-based integration by Nous Research",
|
|
"author": "spec-kit-core",
|
|
"repository": "https://github.com/github/spec-kit",
|
|
"tags": ["cli", "skills"]
|
|
}
|
|
}
|
|
}
|