Skip to content

Commit ad2fdcf

Browse files
Merge remote-tracking branch 'origin/main' into fix/preset-test-warnings
# Conflicts: # tests/test_presets.py
2 parents 1b8c70c + 0d8685a commit ad2fdcf

70 files changed

Lines changed: 7034 additions & 767 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.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, Tabnine CLI, Antigravity, IBM Bob, Mistral Vibe, Kimi Code, Trae, Pi Coding Agent, iFlow CLI
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, Devin for Terminal
1212
1313
- type: input
1414
id: agent-name

.github/workflows/codeql.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,14 @@ jobs:
1919
language: [ 'actions', 'python' ]
2020
steps:
2121
- name: Checkout repository
22-
uses: actions/checkout@v4
22+
uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
2323

2424
- name: Initialize CodeQL
25-
uses: github/codeql-action/init@v4
25+
uses: github/codeql-action/init@e46ed2cbd01164d986452f91f178727624ae40d7 # v4
2626
with:
2727
languages: ${{ matrix.language }}
2828

2929
- name: Perform CodeQL Analysis
30-
uses: github/codeql-action/analyze@v4
30+
uses: github/codeql-action/analyze@e46ed2cbd01164d986452f91f178727624ae40d7 # v4
3131
with:
3232
category: "/language:${{ matrix.language }}"

.github/workflows/docs.yml

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,12 @@ jobs:
3030
runs-on: ubuntu-latest
3131
steps:
3232
- name: Checkout
33-
uses: actions/checkout@v6
33+
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
3434
with:
3535
fetch-depth: 0 # Fetch all history for git info
3636

3737
- name: Setup .NET
38-
uses: actions/setup-dotnet@v4
38+
uses: actions/setup-dotnet@67a3573c9a986a3f9c594539f4ab511d57bb3ce9 # v4
3939
with:
4040
dotnet-version: '8.x'
4141

@@ -48,10 +48,10 @@ jobs:
4848
docfx docfx.json
4949
5050
- name: Setup Pages
51-
uses: actions/configure-pages@v6
51+
uses: actions/configure-pages@45bfe0192ca1faeb007ade9deae92b16b8254a0d # v6
5252

5353
- name: Upload artifact
54-
uses: actions/upload-pages-artifact@v5
54+
uses: actions/upload-pages-artifact@fc324d3547104276b827a68afc52ff2a11cc49c9 # v5
5555
with:
5656
path: 'docs/_site'
5757

@@ -66,5 +66,4 @@ jobs:
6666
steps:
6767
- name: Deploy to GitHub Pages
6868
id: deployment
69-
uses: actions/deploy-pages@v5
70-
69+
uses: actions/deploy-pages@cd2ce8fcbc39b97be8ca5fce6e763baed58fa128 # v5

.github/workflows/lint.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,10 @@ jobs:
1212
runs-on: ubuntu-latest
1313
steps:
1414
- name: Checkout
15-
uses: actions/checkout@v6
15+
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
1616

1717
- name: Run markdownlint-cli2
18-
uses: DavidAnson/markdownlint-cli2-action@ce4853d43830c74c1753b39f3cf40f71c2031eb9 # v23
18+
uses: DavidAnson/markdownlint-cli2-action@6b51ade7a9e4a75a7ad929842dd298a3804ebe8b # v23
1919
with:
2020
globs: |
2121
'**/*.md'

.github/workflows/release-trigger.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ jobs:
1616
pull-requests: write
1717
steps:
1818
- name: Checkout repository
19-
uses: actions/checkout@v6
19+
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
2020
with:
2121
fetch-depth: 0
2222
token: ${{ secrets.RELEASE_PAT }}

.github/workflows/release.yml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ jobs:
1212
contents: write
1313
steps:
1414
- name: Checkout repository
15-
uses: actions/checkout@v6
15+
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
1616
with:
1717
fetch-depth: 0
1818
token: ${{ secrets.GITHUB_TOKEN }}
@@ -86,4 +86,3 @@ jobs:
8686
--notes-file release_notes.md
8787
env:
8888
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
89-

.github/workflows/stale.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ jobs:
1414
stale:
1515
runs-on: ubuntu-latest
1616
steps:
17-
- uses: actions/stale@v10
17+
- uses: actions/stale@b5d41d4e1d5dceea10e7104786b73624c18a190f # v10
1818
with:
1919
# Days of inactivity before an issue or PR becomes stale
2020
days-before-stale: 150

.github/workflows/test.yml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,13 @@ jobs:
1313
runs-on: ubuntu-latest
1414
steps:
1515
- name: Checkout
16-
uses: actions/checkout@v4
16+
uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
1717

1818
- name: Install uv
1919
uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
2020

2121
- name: Set up Python
22-
uses: actions/setup-python@v6
22+
uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6
2323
with:
2424
python-version: "3.13"
2525

@@ -34,13 +34,13 @@ jobs:
3434
python-version: ["3.11", "3.12", "3.13"]
3535
steps:
3636
- name: Checkout
37-
uses: actions/checkout@v4
37+
uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
3838

3939
- name: Install uv
4040
uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
4141

4242
- name: Set up Python ${{ matrix.python-version }}
43-
uses: actions/setup-python@v6
43+
uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6
4444
with:
4545
python-version: ${{ matrix.python-version }}
4646

AGENTS.md

Lines changed: 9 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -20,23 +20,17 @@ src/specify_cli/integrations/
2020
├── base.py # IntegrationBase, MarkdownIntegration, TomlIntegration, YamlIntegration, SkillsIntegration
2121
├── manifest.py # IntegrationManifest (file tracking)
2222
├── claude/ # Example: SkillsIntegration subclass
23-
│ ├── __init__.py # ClaudeIntegration class
24-
│ └── scripts/ # Thin wrapper scripts
25-
│ ├── update-context.sh
26-
│ └── update-context.ps1
23+
│ └── __init__.py # ClaudeIntegration class
2724
├── gemini/ # Example: TomlIntegration subclass
28-
│ ├── __init__.py
29-
│ └── scripts/
25+
│ └── __init__.py
3026
├── windsurf/ # Example: MarkdownIntegration subclass
31-
│ ├── __init__.py
32-
│ └── scripts/
27+
│ └── __init__.py
3328
├── copilot/ # Example: IntegrationBase subclass (custom setup)
34-
│ ├── __init__.py
35-
│ └── scripts/
29+
│ └── __init__.py
3630
└── ... # One subpackage per supported agent
3731
```
3832

39-
The registry is the **single source of truth for Python integration metadata**. Supported agents, their directories, formats, and capabilities are derived from the integration classes for the Python integration layer. However, context-update behavior still requires explicit cases in the shared dispatcher scripts (`scripts/bash/update-agent-context.sh` and `scripts/powershell/update-agent-context.ps1`), which currently maintain their own supported-agent lists and agent-key→context-file mappings until they are migrated to registry-based dispatch.
33+
The registry is the **single source of truth for Python integration metadata**. Supported agents, their directories, formats, capabilities, and context files are derived from the integration classes for the Python integration layer.
4034

4135
---
4236

@@ -179,63 +173,11 @@ def _register_builtins() -> None:
179173
# ...
180174
```
181175

182-
### 4. Add scripts
176+
### 4. Context file behavior
183177

184-
Create two thin wrapper scripts in `src/specify_cli/integrations/<package_dir>/scripts/` that delegate to the shared context-update scripts. Each is ~25 lines of boilerplate.
178+
Set `context_file` on the integration class. The base integration setup creates or updates the managed Spec Kit section in that file, and uninstall removes the managed section when appropriate.
185179

186-
> **Note on `<package_dir>` vs `<key>`:** `<package_dir>` is the Python-safe directory name for your integration — it matches `<key>` exactly when the key contains no hyphens (e.g., key `"gemini"``gemini/`), but uses underscores when it does (e.g., key `"kiro-cli"``kiro_cli/`). The `IntegrationBase.key` class attribute always retains the original hyphenated value (e.g., `key = "kiro-cli"`), since that is what the CLI and registry use.
187-
188-
**`update-context.sh`:**
189-
190-
```bash
191-
#!/usr/bin/env bash
192-
# update-context.sh — <Agent Name> integration: create/update <context_file>
193-
set -euo pipefail
194-
195-
_script_dir="$(cd "$(dirname "$0")" && pwd)"
196-
_root="$_script_dir"
197-
while [ "$_root" != "/" ] && [ ! -d "$_root/.specify" ]; do _root="$(dirname "$_root")"; done
198-
if [ -z "${REPO_ROOT:-}" ]; then
199-
if [ -d "$_root/.specify" ]; then
200-
REPO_ROOT="$_root"
201-
else
202-
git_root="$(git rev-parse --show-toplevel 2>/dev/null || true)"
203-
if [ -n "$git_root" ] && [ -d "$git_root/.specify" ]; then
204-
REPO_ROOT="$git_root"
205-
else
206-
REPO_ROOT="$_root"
207-
fi
208-
fi
209-
fi
210-
211-
exec "$REPO_ROOT/.specify/scripts/bash/update-agent-context.sh" <key>
212-
```
213-
214-
**`update-context.ps1`:**
215-
216-
```powershell
217-
# update-context.ps1 — <Agent Name> integration: create/update <context_file>
218-
$ErrorActionPreference = 'Stop'
219-
220-
$scriptDir = Split-Path -Parent $MyInvocation.MyCommand.Definition
221-
$repoRoot = try { git rev-parse --show-toplevel 2>$null } catch { $null }
222-
if (-not $repoRoot -or -not (Test-Path (Join-Path $repoRoot '.specify'))) {
223-
$repoRoot = $scriptDir
224-
$fsRoot = [System.IO.Path]::GetPathRoot($repoRoot)
225-
while ($repoRoot -and $repoRoot -ne $fsRoot -and -not (Test-Path (Join-Path $repoRoot '.specify'))) {
226-
$repoRoot = Split-Path -Parent $repoRoot
227-
}
228-
}
229-
230-
& "$repoRoot/.specify/scripts/powershell/update-agent-context.ps1" -AgentType <key>
231-
```
232-
233-
Replace `<key>` with your integration key and `<Agent Name>` / `<context_file>` with the appropriate values.
234-
235-
You must also add the agent to the shared context-update scripts so the shared dispatcher recognises the new key:
236-
237-
- **`scripts/bash/update-agent-context.sh`** — add a file-path variable and a case in `update_specific_agent()`.
238-
- **`scripts/powershell/update-agent-context.ps1`** — add a file-path variable, add the new key to the `AgentType` parameter's `[ValidateSet(...)]`, add a switch case in `Update-SpecificAgent`, and add an entry in `Update-AllExistingAgents`.
180+
Only add custom setup logic when the agent needs non-standard behavior. Most integrations do not need wrapper scripts or separate context-update dispatch code.
239181

240182
### 5. Test it
241183

@@ -422,7 +364,6 @@ Implementation: Extends `MarkdownIntegration` with custom `setup()` method that:
422364
3. Applies Forge-specific transformations via `_apply_forge_transformations()`
423365
4. Strips `handoffs` frontmatter key
424366
5. Injects missing `name` fields
425-
6. Ensures the shared `update-agent-context.*` scripts include a `forge` case that maps context updates to `AGENTS.md` and lists `forge` in their usage/help text
426367

427368
### Goose Integration
428369

@@ -436,7 +377,7 @@ Implementation: Extends `YamlIntegration` (parallel to `TomlIntegration`):
436377
2. Extracts title and description from frontmatter
437378
3. Renders output as Goose recipe YAML (version, title, description, author, extensions, activities, prompt)
438379
4. Uses `yaml.safe_dump()` for header fields to ensure proper escaping
439-
5. Context updates map to `AGENTS.md` (shared with opencode/codex/pi/forge)
380+
5. Sets `context_file = "AGENTS.md"` so the base setup manages the Spec Kit context section there
440381

441382
## Common Pitfalls
442383

CHANGELOG.md

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,66 @@
22

33
<!-- insert new changelog below this comment -->
44

5+
## [0.8.5] - 2026-05-04
6+
7+
### Changed
8+
9+
- feat(presets): add Spec2Cloud preset for Azure deployment workflow (#2413)
10+
- update security-review and memory-md extensions to latest versions (#2445)
11+
- fix: honor template overrides for tasks-template (#2278) (#2292)
12+
- Add token-analyzer to community catalog (#2433)
13+
- docs: add April 2026 newsletter (#2434)
14+
- feat: emit init-time notice for git extension default change (#2165) (#2432)
15+
- Update DyanGalih(Memory Hub and Security Review) community extensions (#2429)
16+
- Support controlled multi-install for safe AI agent integrations (#2389)
17+
- chore(integrations): clean up docs and project guard (#2428)
18+
- chore: release 0.8.4, begin 0.8.5.dev0 development (#2431)
19+
20+
## [0.8.4] - 2026-05-01
21+
22+
### Changed
23+
24+
- fix(specify): correct self-referencing step number in validation flow (#2152)
25+
- chore(deps): bump DavidAnson/markdownlint-cli2-action (#2425)
26+
- Add security-governance to community catalog (#2386)
27+
- Add cross-platform-governance to community catalog (#2384)
28+
- Add architecture-governance to community catalog (#2383)
29+
- Add a11y-governance to community catalog (#2381)
30+
- feat(extensions): add Spec2Cloud extension for Azure deployment workflow (#2412)
31+
- fix: migrate extension commands on integration switch (#2404)
32+
- feat: add Squad Bridge extension to community catalog (#2417)
33+
- chore: release 0.8.3, begin 0.8.4.dev0 development (#2418)
34+
35+
## [0.8.3] - 2026-04-29
36+
37+
### Changed
38+
39+
- Add Work IQ extension to community catalog (#2415)
40+
- feat(integrations): add Devin for Terminal skills-based integration (#2364)
41+
- fix: include --from git+... in upgrade hint to avoid PyPI squat package (#2411)
42+
- fix: dispatch opencode commands via run (#2410)
43+
- feat: add catalog discovery CLI commands (#2360)
44+
- update security review extension catalog to v1.3.0 (#2374)
45+
- chore(catalog): bump v-model extension to v0.6.0 (#2399)
46+
- feat: add threatmodel extension to community catalog (#2369)
47+
- Add isaqb-architecture-governance to community catalog (#2385)
48+
- chore: release 0.8.2, begin 0.8.3.dev0 development (#2397)
49+
50+
## [0.8.2] - 2026-04-28
51+
52+
### Changed
53+
54+
- Add MarkItDown Document Converter extension to community catalog (#2390)
55+
- feat: Speckit preset fiction book v1.7 - Support for RAG (Chroma DB) offline semantic search (#2367)
56+
- fix(extensions): use explicit UTF-8 encoding when reading manifest YAML (#2370)
57+
- catalog: add m365 community extension
58+
- docs: replace deprecated --ai flag with --integration in all documentation (#2359)
59+
- feat(extensions,presets): authenticate GitHub-hosted catalog and download requests with GITHUB_TOKEN/GH_TOKEN (#2331)
60+
- Update extensify to v1.1.0 in community catalog (#2337)
61+
- feat(init): deprecate --no-git flag, gate deprecations at v0.10.0 (#2357)
62+
- Add Spec Orchestrator extension to community catalog (#2350)
63+
- chore: release 0.8.1, begin 0.8.2.dev0 development (#2356)
64+
565
## [0.8.1] - 2026-04-24
666

767
### Changed

0 commit comments

Comments
 (0)