@softspark/ai-toolkit 2.12.0 → 3.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +50 -0
- package/README.md +25 -8
- package/app/.claude-plugin/plugin.json +1 -1
- package/app/skills/hook-creator/SKILL.md +84 -8
- package/app/skills/skill-creator/SKILL.md +8 -4
- package/benchmarks/ecosystem-doctor-snapshot.json +395 -0
- package/kb/history/completed/deep-coverage-v3-20260423.md +160 -0
- package/kb/history/completed/ecosystem-deep-sweep-20260423.md +273 -0
- package/kb/procedures/ecosystem-sync-sop.md +255 -0
- package/kb/procedures/maintenance-sop.md +13 -2
- package/kb/procedures/release-preparation-sop.md +94 -12
- package/kb/procedures/release-verification-sop.md +112 -8
- package/kb/reference/global-install-model.md +15 -2
- package/kb/reference/supported-tools-registry.md +229 -0
- package/llms-full.txt +1175 -24
- package/llms.txt +4 -0
- package/manifest.json +1 -1
- package/package.json +4 -1
- package/scripts/ecosystem_doctor.py +348 -0
- package/scripts/ecosystem_tools.json +500 -0
- package/scripts/generate_aider_conf.py +26 -1
- package/scripts/generate_antigravity.py +77 -8
- package/scripts/generate_augment_agents.py +161 -0
- package/scripts/generate_augment_commands.py +160 -0
- package/scripts/generate_augment_hooks.py +162 -0
- package/scripts/generate_augment_skills.py +98 -0
- package/scripts/generate_cline_rules.py +96 -9
- package/scripts/generate_codex_hooks.py +13 -2
- package/scripts/generate_codex_skills.py +195 -0
- package/scripts/generate_copilot.py +296 -18
- package/scripts/generate_cursor_agents.py +144 -0
- package/scripts/generate_cursor_hooks.py +155 -0
- package/scripts/generate_cursor_mdc.py +20 -8
- package/scripts/generate_gemini_commands.py +158 -0
- package/scripts/generate_gemini_hooks.py +159 -0
- package/scripts/generate_gemini_skills.py +98 -0
- package/scripts/generate_roo_modes.py +42 -1
- package/scripts/generate_windsurf_hooks.py +143 -0
- package/scripts/generate_windsurf_rules.py +162 -10
- package/scripts/install.py +11 -2
- package/scripts/install_steps/ai_tools.py +120 -5
- package/scripts/validate.py +20 -3
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "SOP: Ecosystem Sync"
|
|
3
|
+
category: procedures
|
|
4
|
+
service: ai-toolkit
|
|
5
|
+
tags: [sop, ecosystem, editors, generators, drift-detection, sync]
|
|
6
|
+
version: "1.0.0"
|
|
7
|
+
created: "2026-04-23"
|
|
8
|
+
last_updated: "2026-04-23"
|
|
9
|
+
description: "Quarterly (or event-triggered) sync procedure that detects documentation and capability drift in supported tools (Claude Code + 11 editors), analyses our generators and skills for missing features, and walks through the migration + generator-update workflow."
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# SOP: Ecosystem Sync
|
|
13
|
+
|
|
14
|
+
Keeps ai-toolkit aligned with the tools it integrates with. When an editor adds a new hook lifecycle, makes a feature globally available, changes a config path, or deprecates a flag, this SOP surfaces it before it surprises users.
|
|
15
|
+
|
|
16
|
+
**When to run:**
|
|
17
|
+
- **Every quarter** as a baseline health check (calendar reminder)
|
|
18
|
+
- **Before every minor release** of ai-toolkit (Phase 0 of release prep)
|
|
19
|
+
- **Whenever an editor ships a major version** (subscribe to their changelogs)
|
|
20
|
+
- **On demand** if a user reports "feature X exists but toolkit doesn't support it"
|
|
21
|
+
|
|
22
|
+
**Time:** 30 minutes for drift review + variable for any generator updates
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
## Quick Reference
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
# Full check (all 12 tools, online)
|
|
30
|
+
python3 scripts/ecosystem_doctor.py --format text
|
|
31
|
+
|
|
32
|
+
# Single tool
|
|
33
|
+
python3 scripts/ecosystem_doctor.py --tool cursor --format text
|
|
34
|
+
|
|
35
|
+
# First-ever run — baseline the snapshot
|
|
36
|
+
python3 scripts/ecosystem_doctor.py --update > /dev/null
|
|
37
|
+
|
|
38
|
+
# CI / gating mode
|
|
39
|
+
python3 scripts/ecosystem_doctor.py --check
|
|
40
|
+
|
|
41
|
+
# Offline (no network) — validates our side only
|
|
42
|
+
python3 scripts/ecosystem_doctor.py --offline --format text
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
|
|
47
|
+
## Inputs
|
|
48
|
+
|
|
49
|
+
| File | Purpose |
|
|
50
|
+
|------|---------|
|
|
51
|
+
| `scripts/ecosystem_tools.json` | Authoritative registry: 12 tools with doc URLs, config paths, our generators, capability markers |
|
|
52
|
+
| `benchmarks/ecosystem-doctor-snapshot.json` | Last-seen state (headings, content hash, markers, version) — updated via `--update` |
|
|
53
|
+
| `scripts/ecosystem_doctor.py` | Drift detector |
|
|
54
|
+
| `kb/reference/supported-tools-registry.md` | Human-readable view of the registry |
|
|
55
|
+
|
|
56
|
+
---
|
|
57
|
+
|
|
58
|
+
## Phase 1: Run the Doctor
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
python3 scripts/ecosystem_doctor.py --format text > /tmp/eco-report.txt
|
|
62
|
+
cat /tmp/eco-report.txt
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
The report classifies every tool into:
|
|
66
|
+
|
|
67
|
+
- **Clean** — doc page, headings, and markers match the last snapshot; no action
|
|
68
|
+
- **Drift** — something changed upstream. Each drift entry has a `kind`:
|
|
69
|
+
- `headings_added` — the doc grew new sections (new features? reorg?)
|
|
70
|
+
- `headings_removed` — a section disappeared (deprecation? renaming?)
|
|
71
|
+
- `marker_flips` — an expected capability marker appeared (`+`) or vanished (`-`)
|
|
72
|
+
- `content_changed_no_heading_delta` — prose edits, reorder, minor rewrites, OR HTML churn (timestamps, ads, CSRF nonces). Reported but **not** treated as drift by `--check` — too noisy on dynamic pages.
|
|
73
|
+
- `version_changed` — the CLI version bumped (for tools that expose `--version`)
|
|
74
|
+
- **Errored** — couldn't fetch docs (timeout, 404, auth wall). Doctor does not overwrite
|
|
75
|
+
the snapshot for errored tools; the last-known-good state persists.
|
|
76
|
+
|
|
77
|
+
---
|
|
78
|
+
|
|
79
|
+
## Phase 2: Classify Each Drift
|
|
80
|
+
|
|
81
|
+
For every drifting tool, read its docs URL and classify the change into exactly one bucket:
|
|
82
|
+
|
|
83
|
+
| Drift class | What it means | Action owner |
|
|
84
|
+
|-------------|---------------|--------------|
|
|
85
|
+
| **A. Cosmetic reword** | Prose edited, same feature set | Update snapshot (`--update`), no code change |
|
|
86
|
+
| **B. New feature — we should integrate** | New hook event, new config key, new CLI flag, new rule surface | Update the relevant generator in `scripts/generate_<tool>_*.py`; extend `app/skills/*` or `app/agents/*` if the feature maps onto our skills; document in `kb/reference/supported-tools-registry.md` |
|
|
87
|
+
| **C. New feature — not our concern** | Enterprise SSO, billing, proprietary UI-only features | Note in registry `capability_markers` as "not adopted"; update snapshot |
|
|
88
|
+
| **D. Deprecation** | Flag or path removed / renamed | Open migration issue; coordinate with `ai-toolkit install` and generator output; add deprecation warning to CLAUDE.md rules if user-facing |
|
|
89
|
+
| **E. Feature promoted to default** | Was behind a flag, now global | Remove the flag from generator output; simplify our installer |
|
|
90
|
+
| **F. Global availability** | Was editor-only, now also available via CLI / hooks / settings.json | Map new config surface; may require a new generator or extending an existing one |
|
|
91
|
+
|
|
92
|
+
Write one line per drift in `/tmp/eco-report.txt` with its class. Example:
|
|
93
|
+
|
|
94
|
+
```
|
|
95
|
+
cursor: headings_added [AGENTS.md support] -> class B (integrate: extend generate_cursor_mdc.py)
|
|
96
|
+
aider: version_changed 0.70 -> 0.72 -> class A (cosmetic, --update)
|
|
97
|
+
windsurf: marker_flips +Cascade -> class B (already supported, verify snapshot)
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
---
|
|
101
|
+
|
|
102
|
+
## Phase 3: Execute Changes
|
|
103
|
+
|
|
104
|
+
### For class B (new feature — integrate)
|
|
105
|
+
|
|
106
|
+
1. Read the tool's docs section that introduced the feature. Note the exact config key / hook name / file path.
|
|
107
|
+
2. Open the relevant generator (`scripts/generate_<tool>_*.py`) and add output for the new surface.
|
|
108
|
+
3. If the feature is a **hook event**, also update:
|
|
109
|
+
- `app/hooks.json` (if Claude-Code-native)
|
|
110
|
+
- `app/skills/hook-creator/SKILL.md` — add the event to the Supported Hook Events table
|
|
111
|
+
- `scripts/inject_hook_cli.py` — if the hook target path differs
|
|
112
|
+
4. If the feature is a **skill/agent schema extension**:
|
|
113
|
+
- Update `app/skills/skill-creator/SKILL.md` and `app/skills/command-creator/SKILL.md` templates
|
|
114
|
+
- Update `scripts/validate.py` field allowlists
|
|
115
|
+
- Update `kb/reference/agent-skills-spec.md` (if the change is an upstream spec change)
|
|
116
|
+
5. Add a bats test under `tests/test_<tool>.bats` covering the new output.
|
|
117
|
+
6. Regenerate artifacts: `npm run generate:all`.
|
|
118
|
+
|
|
119
|
+
### For class D (deprecation)
|
|
120
|
+
|
|
121
|
+
1. Open a migration issue in GitHub with "class: deprecation" and a link to the upstream changelog.
|
|
122
|
+
2. In the generator, mark the deprecated output path as emitting a comment: `# DEPRECATED: <link>, removed in <version>`.
|
|
123
|
+
3. If deprecation affects `ai-toolkit install --local --editors <tool>`, add a doctor check that warns when a user's repo still contains the deprecated file.
|
|
124
|
+
|
|
125
|
+
### For class E / F (feature promotion)
|
|
126
|
+
|
|
127
|
+
1. Simplify the generator to emit the new-default form; keep a fallback comment for users on older tool versions.
|
|
128
|
+
2. Update `kb/reference/supported-tools-registry.md` config-paths column.
|
|
129
|
+
|
|
130
|
+
### For class A / C (no code change)
|
|
131
|
+
|
|
132
|
+
1. Run `python3 scripts/ecosystem_doctor.py --update --tool <id>` to refresh that tool's snapshot.
|
|
133
|
+
|
|
134
|
+
---
|
|
135
|
+
|
|
136
|
+
## Phase 4: Update the Registry
|
|
137
|
+
|
|
138
|
+
If new capability markers, config paths, or doc URLs emerged during Phase 3, edit `scripts/ecosystem_tools.json`:
|
|
139
|
+
|
|
140
|
+
```bash
|
|
141
|
+
${EDITOR:-nvim} scripts/ecosystem_tools.json
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
Fields to consider updating:
|
|
145
|
+
- `urls.docs` — if the vendor moved their docs
|
|
146
|
+
- `urls.release_notes` — if the changelog location changed
|
|
147
|
+
- `config_paths` — if new files now ship in our install output
|
|
148
|
+
- `our_generators` — if a new generator was added
|
|
149
|
+
- `capability_markers` — if a new feature was adopted
|
|
150
|
+
- `version_probe.command` — if the CLI binary was renamed
|
|
151
|
+
|
|
152
|
+
After editing, increment `last_updated` in the registry and save the snapshot:
|
|
153
|
+
|
|
154
|
+
```bash
|
|
155
|
+
python3 scripts/ecosystem_doctor.py --update
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
---
|
|
159
|
+
|
|
160
|
+
## Phase 5: Validate
|
|
161
|
+
|
|
162
|
+
```bash
|
|
163
|
+
python3 scripts/validate.py --strict
|
|
164
|
+
python3 scripts/audit_skills.py --ci
|
|
165
|
+
python3 scripts/ecosystem_doctor.py --check # exits 0 after --update
|
|
166
|
+
npm test
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
All four must pass before committing generator / registry changes.
|
|
170
|
+
|
|
171
|
+
---
|
|
172
|
+
|
|
173
|
+
## Phase 6: Commit
|
|
174
|
+
|
|
175
|
+
Use a structured commit per change class:
|
|
176
|
+
|
|
177
|
+
```bash
|
|
178
|
+
git add scripts/ecosystem_tools.json benchmarks/ecosystem-doctor-snapshot.json
|
|
179
|
+
git add scripts/generate_<tool>_*.py # if class B/D/E/F
|
|
180
|
+
git add app/skills/<skill>/SKILL.md # if templates touched
|
|
181
|
+
git add kb/reference/supported-tools-registry.md
|
|
182
|
+
git commit -m "chore(ecosystem): sync <tool> — <brief summary>"
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
Recommended commit messages by class:
|
|
186
|
+
|
|
187
|
+
| Class | Template |
|
|
188
|
+
|-------|----------|
|
|
189
|
+
| A | `chore(ecosystem): refresh <tool> snapshot (cosmetic docs update)` |
|
|
190
|
+
| B | `feat(<tool>): add support for <feature>` |
|
|
191
|
+
| C | `chore(ecosystem): note <tool> <feature> as not-adopted` |
|
|
192
|
+
| D | `feat(<tool>): deprecation warning for <old-path>` |
|
|
193
|
+
| E | `refactor(<tool>): remove flag for <feature> (now default)` |
|
|
194
|
+
| F | `feat(<tool>): add <new-surface> generator` |
|
|
195
|
+
|
|
196
|
+
---
|
|
197
|
+
|
|
198
|
+
## Gotchas
|
|
199
|
+
|
|
200
|
+
- **First run has no baseline.** On a machine where `benchmarks/ecosystem-doctor-snapshot.json` does not exist, every tool shows as clean (no prior state to diff against). Run `--update` once to seed, then run again to see real drift.
|
|
201
|
+
- **Documentation sites use client-side rendering.** Aider, opencode, and Antigravity serve most content via JavaScript. `urllib` fetches the bare HTML skeleton — the doctor only sees a few headings. Combine the automated check with a manual visit to the docs on these tools.
|
|
202
|
+
- **Release notes pages change structure more often than docs.** Cursor and Windsurf refactor their changelog layouts periodically; a heading delta from a changelog page is often a presentation change, not a feature change. Classify as A when in doubt.
|
|
203
|
+
- **Version probes require the CLI to be installed locally.** `gemini --version`, `aider --version`, etc. are skipped silently when the binary isn't on `$PATH`. The snapshot therefore omits version drift for tools you haven't installed — that is intentional, not a bug.
|
|
204
|
+
- **GitHub release pages have anti-scraping.** `github.com/<org>/<repo>/releases` works via `urllib` but rate-limits aggressively. If the doctor errors on repeated runs, wait 10 minutes or manually review the release page.
|
|
205
|
+
- **Marker list is intentionally small.** Capability markers are a "did we adopt this?" checklist, not a feature coverage map. Adding every sub-feature bloats the JSON and produces noisy flips — keep markers at the top-level-capability tier.
|
|
206
|
+
- **`--check` only gates on structural drift.** Heading/marker/version changes and fetch errors exit `1`. Pure content-hash differences (`content_changed_no_heading_delta`) exit `0` — otherwise dynamic pages with timestamps or rotating ads would page you every run. If you want the strictest possible gate, grep for `Content changed` in the text report instead.
|
|
207
|
+
|
|
208
|
+
---
|
|
209
|
+
|
|
210
|
+
## Scheduling
|
|
211
|
+
|
|
212
|
+
Recommended cadence:
|
|
213
|
+
|
|
214
|
+
| Trigger | Action |
|
|
215
|
+
|---------|--------|
|
|
216
|
+
| Every Monday morning | `python3 scripts/ecosystem_doctor.py --format text` — scan during coffee |
|
|
217
|
+
| Before a minor release | Full sync + clean snapshot before tagging |
|
|
218
|
+
| After any drift report | Act within 1 week or record explicit "ignore, low priority" in the commit message |
|
|
219
|
+
| New tool added to the registry | Baseline with `--update --tool <id>` |
|
|
220
|
+
| Tool removed from support | Delete its entry from the registry AND from the snapshot JSON |
|
|
221
|
+
|
|
222
|
+
An optional GitHub Action can run `--check` weekly and open an issue on drift. Template:
|
|
223
|
+
|
|
224
|
+
```yaml
|
|
225
|
+
# .github/workflows/ecosystem-doctor.yml (proposed, not yet committed)
|
|
226
|
+
on:
|
|
227
|
+
schedule:
|
|
228
|
+
- cron: '0 9 * * 1' # Mondays 09:00 UTC
|
|
229
|
+
workflow_dispatch: {}
|
|
230
|
+
jobs:
|
|
231
|
+
doctor:
|
|
232
|
+
runs-on: ubuntu-latest
|
|
233
|
+
steps:
|
|
234
|
+
- uses: actions/checkout@v4
|
|
235
|
+
- run: python3 scripts/ecosystem_doctor.py --format text | tee /tmp/doctor.txt
|
|
236
|
+
- run: python3 scripts/ecosystem_doctor.py --check
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
---
|
|
240
|
+
|
|
241
|
+
## When NOT to Use
|
|
242
|
+
|
|
243
|
+
- For **runtime** user support (user hit a bug with an editor) — use `/debug` or `/triage-issue`
|
|
244
|
+
- For **picking** an editor to add — that is a product decision, not a sync; use `/architecture-decision`
|
|
245
|
+
- For **one-off** testing of a specific tool's install flow — use the release-verification SOP
|
|
246
|
+
- For **scaling up** the supported-tools list — add the new tool to the registry, then run the SOP to baseline it
|
|
247
|
+
|
|
248
|
+
---
|
|
249
|
+
|
|
250
|
+
## Related Documentation
|
|
251
|
+
|
|
252
|
+
- [Supported Tools Registry](../reference/supported-tools-registry.md) — human-readable per-tool breakdown
|
|
253
|
+
- [MCP Editor Compatibility](../reference/mcp-editor-compatibility.md) — MCP-specific adapter table
|
|
254
|
+
- [Maintenance SOP](maintenance-sop.md) — general toolkit upkeep
|
|
255
|
+
- [Release Preparation SOP](release-preparation-sop.md) — run the doctor before tagging
|
|
@@ -3,9 +3,9 @@ title: "SOP: Claude Toolkit Maintenance"
|
|
|
3
3
|
category: procedures
|
|
4
4
|
service: ai-toolkit
|
|
5
5
|
tags: [sop, maintenance, agents, skills, install]
|
|
6
|
-
version: "
|
|
6
|
+
version: "3.0.0"
|
|
7
7
|
created: "2026-03-23"
|
|
8
|
-
last_updated: "2026-04-
|
|
8
|
+
last_updated: "2026-04-23"
|
|
9
9
|
description: "Standard operating procedures for installing, maintaining, and evolving the ai-toolkit."
|
|
10
10
|
---
|
|
11
11
|
|
|
@@ -91,6 +91,17 @@ What `install` and `update` do (merge-friendly — user content never overwritte
|
|
|
91
91
|
|
|
92
92
|
Re-running updates only toolkit content. Old whole-directory symlinks are auto-upgraded to per-file on next run.
|
|
93
93
|
|
|
94
|
+
### Install Profiles (v3.0.0)
|
|
95
|
+
|
|
96
|
+
| Profile | Claude Code core | Editor rules | Gemini hooks | Copilot dir layout | Per-editor hooks / sub-agents / commands | Git hooks |
|
|
97
|
+
|---------|:---------------:|:------------:|:------------:|:------------------:|:---------------------------------------:|:---------:|
|
|
98
|
+
| `minimal` | yes | pointer only | no | no | no | no |
|
|
99
|
+
| `standard` (default) | yes | yes | **yes** (new in v3) | **yes** (new in v3) | no | no |
|
|
100
|
+
| `strict` | yes | yes | yes | yes | no | yes |
|
|
101
|
+
| `full` | yes | yes | yes | yes | **yes, all editors** | optional |
|
|
102
|
+
|
|
103
|
+
`--codex-skills` is orthogonal to `--profile` and materializes the full skill catalog under `.agents/skills/` for Codex. See `kb/reference/global-install-model.md` for the full semantic breakdown.
|
|
104
|
+
|
|
94
105
|
---
|
|
95
106
|
|
|
96
107
|
## Update Toolkit
|
|
@@ -2,11 +2,11 @@
|
|
|
2
2
|
title: "SOP: Release Preparation"
|
|
3
3
|
category: procedures
|
|
4
4
|
service: ai-toolkit
|
|
5
|
-
tags: [sop, release, version, publish, changelog, semver, provenance, sarif]
|
|
6
|
-
version: "1.
|
|
5
|
+
tags: [sop, release, version, publish, changelog, semver, provenance, sarif, ecosystem]
|
|
6
|
+
version: "1.10.0"
|
|
7
7
|
created: "2026-04-10"
|
|
8
|
-
last_updated: "2026-04-
|
|
9
|
-
description: "Step-by-step checklist for preparing a new ai-toolkit release — version sync, changelog, artifact regeneration, validation, and tagging. Run BEFORE every git tag. Includes mandatory Provenance, SARIF, and checksum-pin checks added in v2.8.0,
|
|
8
|
+
last_updated: "2026-04-24"
|
|
9
|
+
description: "Step-by-step checklist for preparing a new ai-toolkit release — ecosystem-sync drift check, version sync, changelog, artifact regeneration, validation, and tagging. Run BEFORE every git tag. Includes mandatory Provenance, SARIF, and checksum-pin checks added in v2.8.0, the single-run npm test discipline added in v1.8.0, the ecosystem-sync gate added in v1.9.0, and the registry-vs-generators drift gate added in v1.10.0."
|
|
10
10
|
---
|
|
11
11
|
|
|
12
12
|
# SOP: Release Preparation
|
|
@@ -17,20 +17,33 @@ Run this **before** tagging. After tagging and publishing, run the
|
|
|
17
17
|
|
|
18
18
|
**Pipeline:**
|
|
19
19
|
```
|
|
20
|
-
|
|
20
|
+
Ecosystem Sync SOP (drift check + generator updates)
|
|
21
|
+
↓
|
|
22
|
+
Release Preparation (this SOP)
|
|
23
|
+
↓
|
|
24
|
+
git tag → CI publish → Release Verification SOP
|
|
21
25
|
```
|
|
22
26
|
|
|
23
|
-
**Time:**
|
|
27
|
+
**Time:** 10-20 minutes (includes ecosystem sync review)
|
|
24
28
|
|
|
25
29
|
---
|
|
26
30
|
|
|
27
31
|
## Quick Checklist (TL;DR)
|
|
28
32
|
|
|
29
33
|
```bash
|
|
34
|
+
# 0. Ecosystem sync (mandatory for minor/major releases; optional for patch)
|
|
35
|
+
# Full procedure: kb/procedures/ecosystem-sync-sop.md
|
|
36
|
+
python3 scripts/ecosystem_doctor.py --format text > /tmp/eco-report.txt
|
|
37
|
+
cat /tmp/eco-report.txt
|
|
38
|
+
# If drift detected: stop here, follow ecosystem-sync-sop.md Phase 2-4 to
|
|
39
|
+
# classify each drift (A-F), update generators as needed, refresh snapshot,
|
|
40
|
+
# THEN resume this SOP.
|
|
41
|
+
python3 scripts/ecosystem_doctor.py --update # after all drift resolved
|
|
42
|
+
|
|
30
43
|
# 1. Decide version bump
|
|
31
44
|
# patch (1.4.2 → 1.4.3): bugfix, typo, doc fix
|
|
32
|
-
# minor (1.4.2 → 1.5.0): new feature, new skill, new flag
|
|
33
|
-
# major (1.4.2 → 2.0.0): breaking change
|
|
45
|
+
# minor (1.4.2 → 1.5.0): new feature, new skill, new flag, any ecosystem-class-B/F change
|
|
46
|
+
# major (1.4.2 → 2.0.0): breaking change, any ecosystem-class-D removed path
|
|
34
47
|
|
|
35
48
|
# 2. Sync version across all files
|
|
36
49
|
python3 scripts/sync_version.py X.Y.Z # if script exists, else manual
|
|
@@ -42,7 +55,7 @@ python3 scripts/generate_codex_rules.py .
|
|
|
42
55
|
python3 scripts/generate_llms_txt.py > llms.txt
|
|
43
56
|
python3 scripts/generate_llms_txt.py --full > llms-full.txt
|
|
44
57
|
|
|
45
|
-
# 5. Validate + audit + SARIF + test
|
|
58
|
+
# 5. Validate + audit + SARIF + test + ecosystem check
|
|
46
59
|
python3 scripts/validate.py --strict && python3 scripts/audit_skills.py --ci && python3 scripts/audit_skills.py --sarif > /tmp/audit.sarif && npm test
|
|
47
60
|
|
|
48
61
|
# 5a. Supply-chain standard (v2.8.0+) — non-negotiable
|
|
@@ -50,6 +63,9 @@ grep -q -- '--provenance' .github/workflows/publish.yml || { echo "MISSING --pro
|
|
|
50
63
|
grep -q 'id-token: write' .github/workflows/publish.yml || { echo "MISSING id-token: write"; exit 1; }
|
|
51
64
|
python3 scripts/audit_skills.py --permissions # review Bash/Write/Edit footprint
|
|
52
65
|
|
|
66
|
+
# 5b. Ecosystem gate — snapshot must be current before tag
|
|
67
|
+
python3 scripts/ecosystem_doctor.py --offline --check || { echo "STALE ecosystem snapshot — re-run doctor"; exit 1; }
|
|
68
|
+
|
|
53
69
|
# 6. Commit + tag + push
|
|
54
70
|
git add -A && git commit -m "chore: release vX.Y.Z"
|
|
55
71
|
git tag vX.Y.Z
|
|
@@ -58,6 +74,60 @@ git push origin main --tags
|
|
|
58
74
|
|
|
59
75
|
---
|
|
60
76
|
|
|
77
|
+
## Phase 0: Ecosystem Sync (MANDATORY for minor/major)
|
|
78
|
+
|
|
79
|
+
Before touching version numbers, confirm the toolkit is aligned with the current state of every editor / platform it integrates with. Skipping this phase ships a release whose generators may lag a month-old CLI refactor, a rename of `.cursorrules` to `.cursor/rules/`, or a new hook event we do not yet emit.
|
|
80
|
+
|
|
81
|
+
**When this phase is mandatory:**
|
|
82
|
+
- Minor release (X.Y.0) — always
|
|
83
|
+
- Major release (X.0.0) — always
|
|
84
|
+
- Patch release (X.Y.Z) — only if the patch touches a generator or install flow
|
|
85
|
+
|
|
86
|
+
**When to skip:** pure doc-only patches, SOP edits, internal refactors that do not touch `scripts/generate_*` or `app/skills/*/SKILL.md`.
|
|
87
|
+
|
|
88
|
+
### 0.1 Run the doctor
|
|
89
|
+
|
|
90
|
+
```bash
|
|
91
|
+
python3 scripts/ecosystem_doctor.py --format text | tee /tmp/eco-report.txt
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
Output classifies every registered tool as **Clean**, **Drift**, or **Errored**.
|
|
95
|
+
|
|
96
|
+
### 0.2 Act on drift
|
|
97
|
+
|
|
98
|
+
For each drifting tool, follow [ecosystem-sync-sop.md](ecosystem-sync-sop.md) Phase 2-4:
|
|
99
|
+
|
|
100
|
+
| Drift class | Release impact |
|
|
101
|
+
|-------------|----------------|
|
|
102
|
+
| A (cosmetic reword) | No version impact — refresh snapshot, continue |
|
|
103
|
+
| B (new feature — integrate) | **Minor** version bump at minimum; new generator or extended generator |
|
|
104
|
+
| C (new feature — not adopted) | No impact — note in registry |
|
|
105
|
+
| D (deprecation) | **Minor** or **major** depending on user impact; add migration warning |
|
|
106
|
+
| E (feature promoted to default) | **Minor**; simplify generator, keep fallback comment |
|
|
107
|
+
| F (feature newly globally available) | **Minor**; may require new generator or new config path |
|
|
108
|
+
|
|
109
|
+
If any B/D/E/F changes land in this preparation pass, mention them explicitly in the CHANGELOG entry (Phase 3) under a `Ecosystem` subsection.
|
|
110
|
+
|
|
111
|
+
### 0.3 Refresh snapshot
|
|
112
|
+
|
|
113
|
+
Once every drift is resolved (either by code change or by re-classifying as acceptable):
|
|
114
|
+
|
|
115
|
+
```bash
|
|
116
|
+
python3 scripts/ecosystem_doctor.py --update
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
This writes the new baseline to `benchmarks/ecosystem-doctor-snapshot.json`. Commit it as part of the release commit.
|
|
120
|
+
|
|
121
|
+
### 0.4 Gate
|
|
122
|
+
|
|
123
|
+
```bash
|
|
124
|
+
python3 scripts/ecosystem_doctor.py --offline --check
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
Must exit `0`. If it exits `1`, the snapshot is stale — rerun Phase 0.3 or review the remaining drift.
|
|
128
|
+
|
|
129
|
+
---
|
|
130
|
+
|
|
61
131
|
## Phase 1: Determine Version Bump
|
|
62
132
|
|
|
63
133
|
Follow [Semantic Versioning](https://semver.org/):
|
|
@@ -208,7 +278,15 @@ python3 scripts/audit_skills.py --ci
|
|
|
208
278
|
python3 scripts/audit_skills.py --sarif > audit.sarif # MANDATORY — GHAS ingest
|
|
209
279
|
python3 scripts/audit_skills.py --permissions # review Bash/Write/Edit footprint
|
|
210
280
|
|
|
211
|
-
#
|
|
281
|
+
# Registry / generator drift (added in 1.10.0). Meta-generators excluded.
|
|
282
|
+
META="generate_agents_md.py|generate_llms_txt.py"
|
|
283
|
+
diff \
|
|
284
|
+
<(grep -oE 'scripts/generate_[a-z_]+\.py' kb/reference/supported-tools-registry.md | sort -u) \
|
|
285
|
+
<(ls scripts/generate_*.py | grep -vE "$META" | sort -u) \
|
|
286
|
+
&& echo "OK: registry matches filesystem" \
|
|
287
|
+
|| { echo "DRIFT: update supported-tools-registry.md before tagging"; exit 1; }
|
|
288
|
+
|
|
289
|
+
# Run npm test ONCE, cache output, parse from file. The suite is 900+ bats
|
|
212
290
|
# cases — rerunning it per check wastes minutes. Do not pipe npm test into
|
|
213
291
|
# tail/grep multiple times in the same session.
|
|
214
292
|
npm test > /tmp/npm-test.log 2>&1
|
|
@@ -221,11 +299,12 @@ echo "ok: $(grep -c '^ok ' /tmp/npm-test.log) | not ok: $(grep -c '^not ok' /tmp
|
|
|
221
299
|
- `audit_skills.py --ci`: `HIGH: 0 | WARN: 0` (INFO is acceptable)
|
|
222
300
|
- `audit_skills.py --sarif`: valid JSON, non-empty `runs[0].tool.driver.rules`
|
|
223
301
|
- `audit_skills.py --permissions`: review `Skills with Bash + Write + Edit` list — any newly-added skill with broad access MUST be justified in the CHANGELOG entry
|
|
302
|
+
- Registry drift: `OK: registry matches filesystem`. If `DRIFT:` appears, add the missing `scripts/generate_*.py` rows to `kb/reference/supported-tools-registry.md` before tagging.
|
|
224
303
|
- `npm test`: `1..N` with zero `not ok` (read from the cached `/tmp/npm-test.log`, do not rerun)
|
|
225
304
|
|
|
226
305
|
**One-liner:**
|
|
227
306
|
```bash
|
|
228
|
-
python3 scripts/validate.py --strict && python3 scripts/audit_skills.py --ci && python3 scripts/audit_skills.py --sarif > audit.sarif && npm test
|
|
307
|
+
python3 scripts/validate.py --strict && python3 scripts/audit_skills.py --ci && python3 scripts/audit_skills.py --sarif > audit.sarif && diff <(grep -oE 'scripts/generate_[a-z_]+\.py' kb/reference/supported-tools-registry.md | sort -u) <(ls scripts/generate_*.py | grep -vE 'generate_agents_md\.py|generate_llms_txt\.py' | sort -u) && npm test
|
|
229
308
|
```
|
|
230
309
|
|
|
231
310
|
**If tests fail:** Fix the issue, do NOT skip. Common failures:
|
|
@@ -338,13 +417,16 @@ git push origin --delete vX.Y.Z
|
|
|
338
417
|
|
|
339
418
|
| # | Step | Command / Action | Pass Criteria |
|
|
340
419
|
|---|------|-----------------|---------------|
|
|
420
|
+
| 0a | Ecosystem drift check | `ecosystem_doctor.py --format text` | All tools Clean, or drift classified and resolved |
|
|
421
|
+
| 0b | Ecosystem snapshot refresh | `ecosystem_doctor.py --update` | `benchmarks/ecosystem-doctor-snapshot.json` updated |
|
|
422
|
+
| 0c | Ecosystem gate | `ecosystem_doctor.py --offline --check` | Exit 0 |
|
|
341
423
|
| 1 | Version bump type | Decide patch/minor/major | — |
|
|
342
424
|
| 2 | `package.json` version | Edit `"version"` | Matches target |
|
|
343
425
|
| 3 | `manifest.json` version | Edit `"version"` | Matches target |
|
|
344
426
|
| 4 | `plugin.json` version | Edit `"version"` | Matches target |
|
|
345
427
|
| 5 | `package-lock.json` | `npm install --package-lock-only` | Matches target |
|
|
346
428
|
| 6 | Count sync | Check `package.json` description, README | `validate.py` passes |
|
|
347
|
-
| 7 | CHANGELOG.md | Add release entry | Entry exists for vX.Y.Z |
|
|
429
|
+
| 7 | CHANGELOG.md | Add release entry (incl. `Ecosystem` subsection if any B/D/E/F drift) | Entry exists for vX.Y.Z |
|
|
348
430
|
| 8 | Regenerate artifacts | `generate_agents_md.py`, `generate_codex_rules.py`, `generate_llms_txt.py` | No unexpected diff |
|
|
349
431
|
| 9 | Validate | `validate.py --strict` | 0 errors, 0 warnings |
|
|
350
432
|
| 10 | Security audit (CI mode) | `audit_skills.py --ci` | 0 HIGH |
|
|
@@ -3,10 +3,10 @@ title: "SOP: Release Verification"
|
|
|
3
3
|
category: procedures
|
|
4
4
|
service: ai-toolkit
|
|
5
5
|
tags: [sop, verification, release, smoke-test, install, update, qa, provenance, sarif]
|
|
6
|
-
version: "1.
|
|
6
|
+
version: "1.4.0"
|
|
7
7
|
created: "2026-04-08"
|
|
8
|
-
last_updated: "2026-04-
|
|
9
|
-
description: "End-to-end smoke test after installing or updating @softspark/ai-toolkit — verifies CLI, install, doctor, validation, tests, eject, npm provenance attestation, SARIF audit, and per-skill permissions. Reflects the v2.8.0 supply-chain standard. v1.3.0
|
|
8
|
+
last_updated: "2026-04-24"
|
|
9
|
+
description: "End-to-end smoke test after installing or updating @softspark/ai-toolkit — verifies CLI, install, doctor, validation, tests, eject, npm provenance attestation, SARIF audit, and per-skill permissions. Reflects the v2.8.0 supply-chain standard. v1.3.0 added the single-run npm test discipline; v1.4.0 adds v3.0.0 deep-coverage checks (--profile full, --codex-skills, breaking-change surfaces, idempotence, registry drift, live-JSON parse) and refreshes stale thresholds."
|
|
10
10
|
---
|
|
11
11
|
|
|
12
12
|
# SOP: Release Verification
|
|
@@ -52,6 +52,10 @@ python3 scripts/audit_skills.py --ci # 10. Security audit
|
|
|
52
52
|
python3 scripts/audit_skills.py --sarif | python3 -c "import json,sys; assert json.load(sys.stdin)['version']=='2.1.0'; print('SARIF OK')" # 11. SARIF 2.1.0 well-formed?
|
|
53
53
|
python3 scripts/audit_skills.py --permissions | head -30 # 12. Broad-access skills reviewed?
|
|
54
54
|
npm view @softspark/ai-toolkit@X.Y.Z --json | python3 -c "import json,sys; d=json.load(sys.stdin); assert d['dist']['attestations']['provenance']['predicateType']=='https://slsa.dev/provenance/v1'; print('PROVENANCE OK')" # 13. Provenance attested on npm?
|
|
55
|
+
|
|
56
|
+
# Deep-coverage verification (Phase 9, v3.0.0+)
|
|
57
|
+
META="generate_agents_md.py|generate_llms_txt.py"
|
|
58
|
+
diff <(grep -oE 'scripts/generate_[a-z_]+\.py' kb/reference/supported-tools-registry.md | sort -u) <(ls scripts/generate_*.py | grep -vE "$META" | sort -u) && echo "OK: registry matches" # 14. Registry <-> generators drift?
|
|
55
59
|
```
|
|
56
60
|
|
|
57
61
|
---
|
|
@@ -117,8 +121,8 @@ ai-toolkit status
|
|
|
117
121
|
```
|
|
118
122
|
|
|
119
123
|
**Verify `--dry-run`:**
|
|
120
|
-
- [ ] Agents >=
|
|
121
|
-
- [ ] Skills >=
|
|
124
|
+
- [ ] Agents >= 44
|
|
125
|
+
- [ ] Skills >= 99
|
|
122
126
|
- [ ] Hooks merged into settings.json
|
|
123
127
|
- [ ] "Other AI Tools" section lists cursor, windsurf, gemini, augment (antigravity via --local)
|
|
124
128
|
|
|
@@ -168,7 +172,7 @@ cd - && rm -rf /tmp/ai-toolkit-verify
|
|
|
168
172
|
- [ ] Would create: CLAUDE.md
|
|
169
173
|
- [ ] Would create: .claude/settings.local.json
|
|
170
174
|
- [ ] Would inject: .claude/constitution.md
|
|
171
|
-
- [ ] Editors: all
|
|
175
|
+
- [ ] Editors: all 11 listed (copilot, cursor, windsurf, cline, roo, aider, augment, antigravity, codex, gemini, opencode)
|
|
172
176
|
- [ ] Would generate configs for each editor (legacy + directory-based)
|
|
173
177
|
- [ ] Would install: .git/hooks/pre-commit
|
|
174
178
|
- [ ] Would inject language rules (auto-detected)
|
|
@@ -189,7 +193,7 @@ python3 scripts/audit_skills.py --ci
|
|
|
189
193
|
```
|
|
190
194
|
|
|
191
195
|
**Verify validate.py:**
|
|
192
|
-
- [ ] Agents >=
|
|
196
|
+
- [ ] Agents >= 44, Skills >= 99, Tests >= 900
|
|
193
197
|
- [ ] Hook events: 12, Hook scripts: >= 20
|
|
194
198
|
- [ ] Plugin packs >= 10, KB documents >= 20
|
|
195
199
|
- [ ] `Errors: 0 | Warnings: 0` → `VALIDATION PASSED`
|
|
@@ -217,7 +221,7 @@ echo "exit: $exit"
|
|
|
217
221
|
|
|
218
222
|
**Verify:**
|
|
219
223
|
- [ ] `exit == 0`
|
|
220
|
-
- [ ] `ok == expected test count` (e.g.,
|
|
224
|
+
- [ ] `ok == expected test count` (e.g., 945 on v3.0.0)
|
|
221
225
|
- [ ] `not ok == 0`
|
|
222
226
|
- [ ] Bats runs tests in parallel (4 jobs)
|
|
223
227
|
- [ ] Groups: agents, autodetect, cli, generators, guards, hooks, inject,
|
|
@@ -322,6 +326,101 @@ AI_TOOLKIT_STRICT_PIN=1 ai-toolkit update --dry-run
|
|
|
322
326
|
|
|
323
327
|
---
|
|
324
328
|
|
|
329
|
+
## Phase 9: Deep-Coverage Checks (v3.0.0+)
|
|
330
|
+
|
|
331
|
+
These verify the native-surface generators shipped in v3.0.0 actually emit the right files for the right profiles, and that the tool registry stays in sync with shipped generators.
|
|
332
|
+
|
|
333
|
+
> **Safety warning — HOME-scoped writes:** Running `--profile full` with `augment` in the editor list writes to `$HOME/.augment/settings.json` (Augment stores hooks under HOME, not per-project). Use `--dry-run` for verification unless you intend to carry ai-toolkit hook entries on this machine. The generator is marker-safe (only rewrites its own `_source: ai-toolkit` entries) but is still a side-effect.
|
|
334
|
+
|
|
335
|
+
### 9.1 `--profile full` emits every native surface
|
|
336
|
+
|
|
337
|
+
```bash
|
|
338
|
+
D=/tmp/aitk-profile-full-${RANDOM} && mkdir -p "$D" && cd "$D" && git init -q
|
|
339
|
+
ai-toolkit install --local --editors cursor,windsurf,gemini,augment,codex \
|
|
340
|
+
--profile full --codex-skills --dry-run 2>&1 \
|
|
341
|
+
| grep -E "\\.cursor/(hooks\\.json|agents)|\\.windsurf/hooks\\.json|\\.gemini/(settings\\.json|commands)|\\.augment/(agents|commands)|\\.codex/skills"
|
|
342
|
+
```
|
|
343
|
+
|
|
344
|
+
**Verify** — at least the following lines appear:
|
|
345
|
+
- [ ] `.cursor/hooks.json` and `.cursor/agents/`
|
|
346
|
+
- [ ] `.windsurf/hooks.json`
|
|
347
|
+
- [ ] `.gemini/settings.json` hooks AND `.gemini/commands/`
|
|
348
|
+
- [ ] `.augment/agents/` + `.augment/commands/` + `$HOME/.augment/settings.json`
|
|
349
|
+
- [ ] `.codex/skills/` (opt-in via `--codex-skills`)
|
|
350
|
+
|
|
351
|
+
### 9.2 `--codex-skills` is orthogonal to `--profile`
|
|
352
|
+
|
|
353
|
+
```bash
|
|
354
|
+
D=/tmp/aitk-codex-skills-${RANDOM} && mkdir -p "$D" && cd "$D" && git init -q
|
|
355
|
+
ai-toolkit install --local --editors codex --profile standard --codex-skills --dry-run 2>&1 \
|
|
356
|
+
| grep -q "Would generate: .codex/skills" && echo "OK: --codex-skills works without --profile full"
|
|
357
|
+
ai-toolkit install --local --editors codex --profile full --dry-run 2>&1 \
|
|
358
|
+
| grep -q "Would generate: .codex/skills" && echo "FAIL: --profile full should NOT auto-emit .codex/skills" \
|
|
359
|
+
|| echo "OK: --profile full alone does not auto-emit .codex/skills (correct — opt-in only)"
|
|
360
|
+
```
|
|
361
|
+
|
|
362
|
+
**Verify:**
|
|
363
|
+
- [ ] `--codex-skills` emits `.codex/skills/` at any profile
|
|
364
|
+
- [ ] `--profile full` alone does NOT emit `.codex/skills/` (must be opt-in)
|
|
365
|
+
|
|
366
|
+
### 9.3 Breaking-change surfaces land on `--profile standard`
|
|
367
|
+
|
|
368
|
+
v3.0.0 moved two surfaces from opt-in to default:
|
|
369
|
+
- Copilot directory layout (`.github/instructions/`, `.github/prompts/`)
|
|
370
|
+
- Gemini hooks (`.gemini/settings.json`)
|
|
371
|
+
|
|
372
|
+
```bash
|
|
373
|
+
D=/tmp/aitk-breaking-${RANDOM} && mkdir -p "$D" && cd "$D" && git init -q
|
|
374
|
+
ai-toolkit install --local --editors copilot,gemini --profile standard --dry-run 2>&1 \
|
|
375
|
+
| tee /tmp/aitk-breaking.log
|
|
376
|
+
grep -q "\\.github/instructions/" /tmp/aitk-breaking.log && echo "OK: Copilot dir layout at standard"
|
|
377
|
+
grep -q "\\.gemini/settings\\.json hooks" /tmp/aitk-breaking.log && echo "OK: Gemini hooks at standard"
|
|
378
|
+
```
|
|
379
|
+
|
|
380
|
+
**Verify both lines print `OK:`**. If either is missing, a regression has unwound the v3.0.0 breaking change.
|
|
381
|
+
|
|
382
|
+
### 9.4 Install is idempotent
|
|
383
|
+
|
|
384
|
+
```bash
|
|
385
|
+
D=/tmp/aitk-idem-${RANDOM} && mkdir -p "$D" && cd "$D" && git init -q
|
|
386
|
+
ai-toolkit install --local --editors cursor,gemini --profile full >/dev/null 2>&1
|
|
387
|
+
SHA1=$(find .cursor .gemini -type f -exec shasum {} + | shasum | awk '{print $1}')
|
|
388
|
+
ai-toolkit install --local --editors cursor,gemini --profile full >/dev/null 2>&1
|
|
389
|
+
SHA2=$(find .cursor .gemini -type f -exec shasum {} + | shasum | awk '{print $1}')
|
|
390
|
+
[ "$SHA1" = "$SHA2" ] && echo "OK: idempotent" || echo "FAIL: install is not idempotent"
|
|
391
|
+
```
|
|
392
|
+
|
|
393
|
+
**Verify:** prints `OK: idempotent`. A second run must produce byte-identical files in every managed path.
|
|
394
|
+
|
|
395
|
+
### 9.5 Live-install JSON outputs parse
|
|
396
|
+
|
|
397
|
+
The bats suite validates JSON shape at generation time. This re-checks that what actually landed on disk after a live install parses without errors.
|
|
398
|
+
|
|
399
|
+
```bash
|
|
400
|
+
D=/tmp/aitk-json-${RANDOM} && mkdir -p "$D" && cd "$D" && git init -q
|
|
401
|
+
ai-toolkit install --local --editors cursor,windsurf,gemini,augment --profile full >/dev/null 2>&1
|
|
402
|
+
for f in .cursor/hooks.json .windsurf/hooks.json .gemini/settings.json $HOME/.augment/settings.json; do
|
|
403
|
+
[ -f "$f" ] && python3 -c "import json; json.load(open('$f'))" && echo "OK: $f"
|
|
404
|
+
done
|
|
405
|
+
```
|
|
406
|
+
|
|
407
|
+
**Verify:** each emitted file prints `OK: <path>`. Any `json.decoder.JSONDecodeError` means the merge logic corrupted the output.
|
|
408
|
+
|
|
409
|
+
### 9.6 Registry / generator drift check
|
|
410
|
+
|
|
411
|
+
`kb/reference/supported-tools-registry.md` should enumerate every per-editor `scripts/generate_*.py` we ship. Meta-generators (`generate_agents_md.py`, `generate_llms_txt.py`) are excluded — they produce docs/artifacts, not editor configs.
|
|
412
|
+
|
|
413
|
+
```bash
|
|
414
|
+
META="generate_agents_md.py|generate_llms_txt.py"
|
|
415
|
+
REG=$(grep -oE 'scripts/generate_[a-z_]+\.py' kb/reference/supported-tools-registry.md | sort -u)
|
|
416
|
+
FS=$(ls scripts/generate_*.py | grep -vE "$META" | sort -u)
|
|
417
|
+
diff <(echo "$REG") <(echo "$FS") && echo "OK: registry matches filesystem" || echo "DRIFT: update supported-tools-registry.md"
|
|
418
|
+
```
|
|
419
|
+
|
|
420
|
+
**Verify:** prints `OK: registry matches filesystem`. If not, add the missing rows to the registry before tagging the next release.
|
|
421
|
+
|
|
422
|
+
---
|
|
423
|
+
|
|
325
424
|
## Troubleshooting
|
|
326
425
|
|
|
327
426
|
### `ai-toolkit: command not found`
|
|
@@ -376,3 +475,8 @@ ai-toolkit eject /tmp/test # retry
|
|
|
376
475
|
| Tests | `npm test`: N/N passed, 0 failures |
|
|
377
476
|
| Eject | Standalone `.claude/` with real files AND `output-styles/` directory |
|
|
378
477
|
| Guards | Destructive commands blocked |
|
|
478
|
+
| Deep coverage | `--profile full` emits all 9 v3.0.0 native surfaces; `--codex-skills` works orthogonally |
|
|
479
|
+
| Breaking changes | Copilot directory layout + Gemini hooks emit at `--profile standard` (v3.0.0 contract) |
|
|
480
|
+
| Idempotence | Second `install` run produces byte-identical output in every managed path |
|
|
481
|
+
| Live JSON | Every generated `.json` file on disk parses as valid JSON |
|
|
482
|
+
| Registry | `supported-tools-registry.md` enumerates every `scripts/generate_*.py` we ship |
|