mirror of
https://github.com/github/spec-kit.git
synced 2026-07-04 04:45:43 +08:00
* Initial plan * feat: add integration catalog system with catalog files, IntegrationCatalog class, list --catalog flag, upgrade command, integration.yml descriptor, and tests Agent-Logs-Url: https://github.com/github/spec-kit/sessions/bbcd44e8-c69c-4735-adc1-bdf1ce109184 Co-authored-by: mnriem <15701806+mnriem@users.noreply.github.com> * fix: address PR review feedback - Replace empty except with cache cleanup in _fetch_single_catalog - Log teardown failure warning instead of silent pass in upgrade - Validate catalog_data and integrations are dicts before use - Catch OSError/UnicodeError in IntegrationDescriptor._load - Add isinstance checks for integration/requires/provides/commands - Enforce semver (X.Y.Z) instead of PEP 440 for descriptor versions - Fix docstring and CONTRIBUTING.md to match actual block-on-modified behavior - Restore old manifest on upgrade failure for transactional safety * refactor: address second round of PR review feedback - Remove dead cache_file/cache_metadata_file attributes from IntegrationCatalog - Deduplicate non-default catalog warning (show once per process) - Anchor version regex to reject partial matches like 1.0.0beta - Fix 'Preserved modified' message to 'Skipped' for accuracy - Make upgrade transactional: install new files first, then remove stale old-only files, so a failed setup leaves old integration intact - Update CONTRIBUTING.md: speckit_version validates presence only * Potential fix for pull request finding 'Empty except' Co-authored-by: Copilot Autofix powered by AI <223894421+github-code-quality[bot]@users.noreply.github.com> * fix: address third round of PR review feedback - Fix CONTRIBUTING.md JSON examples to show full catalog structure with schema_version and integrations wrapper - Wrap cache writes in try/except OSError for read-only project dirs - Validate _load_catalog_config YAML root is a dict - Skip non-dict integ_data entries in merged catalog - Normalize tags to list-of-strings before filtering/searching - Add path traversal containment check for stale file deletion - Clarify docstring: lower numeric priority = higher precedence * fix: address fourth round of PR review feedback - Remove unused _write_catalog helper from test file - Fix comment: tests use monkeypatched urlopen, not file:// URLs - Wrap cache unlink calls in OSError handler - Add explicit encoding='utf-8' to all cache read_text/write_text calls - Restore packaging.version.Version for descriptor version validation to align with extension/preset validators - Add missing goose entry to integrations/catalog.json * fix: remove unused Path import, add comment to empty except * fix: validate descriptor root is dict, add shared infra to upgrade - Add isinstance(self.data, dict) check at start of _validate() so non-mapping YAML roots raise IntegrationDescriptorError - Run _install_shared_infra() and ensure_executable_scripts() in upgrade command to match install/switch behavior * fix: address sixth round of PR review feedback - Validate integration.id/name/version/description are strings - Catch TypeError in pkg_version.Version() for non-string versions - Swap validation order: check catalogs type before emptiness - Isolate TestActiveCatalogs from user ~/.specify/ via monkeypatch * fix: address seventh round of PR review feedback - Update docs: version field uses PEP 440, not semver - Harden search() against non-string author/name/description fields - Validate requires.speckit_version is a non-empty string - Validate command name/file are non-empty strings, file is safe relative path - Handle stale symlinks in upgrade cleanup - Document catalog configuration stack in README.md * fix: validate script entries, remove destructive teardown from upgrade rollback - Validate provides.scripts entries are non-empty strings with safe relative paths - Remove teardown from upgrade rollback since setup overwrites in-place — teardown would delete files that were working before the upgrade * fix: use consistent resolved root for stale-file cleanup paths * fix: validate redirect URL and reject drive-qualified paths - Validate final URL after redirects with _validate_catalog_url() - Reject paths with Path.drive or Path.anchor for Windows safety - Update FakeResponse mocks with geturl() method * fix: fix docstring backticks, assert file modification in upgrade tests * docs: clarify directory naming convention for hyphenated integration keys * fix: correct key type hint, isolate all catalog tests from env - Fix key parameter type to str | None (defaults to None) - Add HOME/USERPROFILE monkeypatch and clear SPECKIT_INTEGRATION_CATALOG_URL in all TestCatalogFetch tests for full environment isolation * fix: neutralize catalog table title, handle non-dict cache metadata * fix: validate requires.tools entries in descriptor * fix: show discovery-only status, clear metadata files in clear_cache * fix: catch OSError/UnicodeError in cache read path * refactor: reuse IntegrationManifest.uninstall for stale-file cleanup * fix: normalize null tools to empty list in descriptor accessor --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: mnriem <15701806+mnriem@users.noreply.github.com> Co-authored-by: Copilot Autofix powered by AI <223894421+github-code-quality[bot]@users.noreply.github.com>
260 lines
7.7 KiB
JSON
260 lines
7.7 KiB
JSON
{
|
|
"schema_version": "1.0",
|
|
"updated_at": "2026-04-08T00: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"]
|
|
},
|
|
"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"]
|
|
},
|
|
"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"]
|
|
}
|
|
}
|
|
}
|