nitm-ai-dev-toolkit 3.0.20 → 3.0.22

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "nitm-ai-dev-toolkit",
3
- "version": "3.0.20",
3
+ "version": "3.0.22",
4
4
  "description": "Scaffold AI agent config (Cursor, GitHub Copilot, Claude Code, OpenCode) into any repo, then hand off to your AI agent to finish setup.",
5
5
  "bin": {
6
6
  "nitm-ai-dev-toolkit": "bin/cli.js"
@@ -17,18 +17,18 @@ You are helping to patch AI instructions in this project by comparing against th
17
17
 
18
18
  ## Process
19
19
 
20
- 1. **Fetch Latest Templates**:
20
+ 1. **Fetch Latest Templates**:
21
21
 
22
- Clone or fetch the latest ai-assisted-dev-toolkit templates:
22
+ Clone or fetch the latest ai-assisted-dev-toolkit templates:
23
23
 
24
- ```bash
25
- TOOLKIT_TEMP=$(mktemp -d)
26
- git clone --depth 1 https://github.com/ninjasitm/ai-assisted-dev-toolkit.git "$TOOLKIT_TEMP"
27
- ```
24
+ ```bash
25
+ TOOLKIT_TEMP=$(mktemp -d)
26
+ git clone --depth 1 https://github.com/ninjasitm/ai-assisted-dev-toolkit.git "$TOOLKIT_TEMP"
27
+ ```
28
28
 
29
- Determine the correct source path based on project structure:
30
- - **Single repo**: Use `$TOOLKIT_TEMP/src/repo/`
31
- - **Monorepo**: Use `$TOOLKIT_TEMP/src/monorepo/`
29
+ Determine the correct source path based on project structure:
30
+ - **Single repo**: Use `$TOOLKIT_TEMP/src/repo/`
31
+ - **Monorepo**: Use `$TOOLKIT_TEMP/src/monorepo/`
32
32
 
33
33
  Detection heuristic:
34
34
  - If `apps/` and `packages/` directories exist at root → monorepo
@@ -46,132 +46,132 @@ You are helping to patch AI instructions in this project by comparing against th
46
46
  - **Same version**: No structural changes expected
47
47
  - **Newer version**: Check for structural changes (new directories, renamed files, format changes)
48
48
 
49
- 2. **Inventory Current State**:
49
+ 2. **Inventory Current State**:
50
50
 
51
- Scan the project's AI configuration directories:
51
+ Scan the project's AI configuration directories:
52
52
 
53
- | Category | Project Paths | Template Source Paths |
54
- | ---------------- | ------------------------------------------------------------- | ------------------------------------------- |
55
- | **Cursor Rules** | `.cursor/rules/*.mdc` | `src/{type}/.cursor/rules/*.mdc` |
56
- | **Cursor Cmds** | `.cursor/commands/*.md` | `src/{type}/.cursor/commands/*.md` |
57
- | **Cursor Agents**| `.cursor/agents/*.agent.md` | `src/{type}/.cursor/agents/*.agent.md` |
58
- | **GH Prompts** | `.github/prompts/*.prompt.md` | `src/{type}/.github/prompts/*.prompt.md` |
59
- | **GH Instrs** | `.github/instructions/*.instructions.md` | `src/{type}/.github/instructions/*.instructions.md` |
60
- | **GH Agents** | `.github/agents/*.agent.md` | `src/{type}/.github/agents/*.agent.md` |
61
- | **Claude Rules** | `.claude/rules/*.md` | `src/{type}/.claude/rules/*.md` |
62
- | **Claude Cmds** | `.claude/commands/*.md` | `src/{type}/.claude/commands/*.md` |
63
- | **Claude Agents**| `.claude/agents/*.agent.md` | `src/{type}/.claude/agents/*.agent.md` |
64
- | **Skills** | `.agents/skills/*/SKILL.md` | `src/{type}/.agents/skills/*/SKILL.md` |
65
- | **AGENTS.md** | `AGENTS.md` | `src/{type}/AGENTS.md` |
66
- | **CLAUDE.md** | `CLAUDE.md` | `src/{type}/CLAUDE.md` |
67
- | **Claude Rules Snippets** | `.claude/rules-snippets/*.md` | `src/{type}/.claude/rules-snippets/*.md` |
68
- | **Claude Prompt Snippets** | `.claude/prompt-snippets/*.md` | `src/{type}/.claude/prompt-snippets/*.md` |
69
- | **Claude Agent Snippets** | `.claude/agents-snippets/*.md` | `src/{type}/.claude/agents-snippets/*.md` |
70
- | **OpenCode Config** | `.opencode/opencode.json` | `src/{type}/.opencode/opencode.json` |
71
- | **OpenCode Commands** | `.opencode/commands/*.md` | `src/{type}/.opencode/commands/*.md` |
72
- | **OpenCode Rules** | `.opencode/rules/*.md` | `src/{type}/.opencode/rules/*.md` |
73
- | **OpenCode Agents** | `.opencode/agents/*.md` | `src/{type}/.opencode/agents/*.md` |
74
- | **OpenCode Plugins** | `.opencode/plugins/*.mjs` | `src/{type}/.opencode/plugins/*.mjs` |
75
- | **Hooks** | `hooks/*.{js,sh,ps1}` | `src/{type}/hooks/*.{js,sh,ps1}` |
76
- | **Agent Rules** | `.agents/rules/*.md` | `src/{type}/.agents/rules/*.md` |
77
- | **Toolkit Version** | `.toolkit-version` | `.toolkit-version` (root of toolkit) |
78
-
79
- **⚠️ OpenCode `opencode.json` Schema Validation:**
80
-
81
- When patching `.opencode/opencode.json`, **only add or modify supported top-level keys**. The schema is defined at `https://opencode.ai/config.json`. Do NOT add unsupported keys.
82
-
83
- **Supported top-level keys:** `$schema`, `instructions`, `skills`, `agent`, `default_agent`, `model`, `small_model`, `provider`, `mcp`, `tools`, `permission`, `lsp`, `formatter`, `server`, `shell`, `command`, `plugin`, `watcher`, `snapshot`, `share`, `autoupdate`, `compaction`, `attachment`, `logLevel`, `disabled_providers`, `enabled_providers`, `tool_output`, `enterprise`, `experimental`
84
-
85
- **Do NOT add** keys like `rules`, `agents`, `commands`, `prompts` as top-level keys — OpenCode uses the `.opencode/` directory structure and `instructions` array instead.
86
-
87
- > **Watch out:** the ponytail template uses the `plugin` key (singular). If you see `plugins` (plural) in your `opencode.json`, that's a typo and the plugin won't load.
88
-
89
- 3. **Diff Analysis** (parallelizable — dispatch one subagent per category):
90
-
91
- For each category, compare template files against project files:
92
-
93
- a. **Classify each file**:
94
- - **🆕 New**: Exists in template but not in project → candidate for addition
95
- - **📝 Updated**: Exists in both but template has newer content → candidate for merge
96
- - **✅ Current**: Exists in both and content matches → no action needed
97
- - **🔧 Customized**: Exists in both, project version has non-placeholder customizations → careful merge
98
- - **⚠️ Missing in Template**: Exists in project but not in template → project-specific, keep as-is
99
-
100
- b. **For updated files, generate a structured diff**:
101
- - Preserve project-specific `{{PLACEHOLDER}}` replacements (already-bootstrapped values)
102
- - Identify structural additions (new sections, new rules, new steps)
103
- - Identify structural removals (deprecated guidance, removed sections)
104
- - Identify content updates (changed instructions, improved wording)
105
-
106
- c. **Smart Merge Rules**:
107
- - **Never overwrite** project-specific values that replaced `{{PLACEHOLDER}}`
108
- - **Always add** new files that don't exist in the project
109
- - **Merge structural additions** into existing customized files
110
- - **Flag for review** any removals from files that have been customized
111
- - **Preserve custom agents/skills** that were added by the project
112
-
113
- 4. **Generate Patch Report**:
114
-
115
- ```markdown
116
- ## 🩹 Bootstrap Patch Report
117
-
118
- **Toolkit Version**: [commit hash] ([date])
119
- **Project Type**: repo | monorepo
120
- **Categories Scanned**: [list]
121
-
122
- ### 🆕 New Files (X files)
123
-
124
- | File | Category | Description |
125
- | ---- | -------- | ----------- |
126
- | `.cursor/rules/new-rule.mdc` | Rules | New coding standard rule |
127
-
128
- ### 📝 Updated Files (X files)
129
-
130
- | File | Changes | Risk |
131
- | ---- | ------- | ---- |
132
- | `.cursor/commands/implement.md` | Added orchestrator checkpoint | Low - additive |
133
- | `.github/instructions/subagent-workflow.instructions.md` | Added parallelization analysis | Low - additive |
134
-
135
- ### ✅ Current Files (X files)
136
- [No action needed]
137
-
138
- ### 🔧 Customized Files Requiring Review (X files)
139
-
140
- | File | Template Changes | Project Customizations | Merge Strategy |
141
- | ---- | ---------------- | ---------------------- | -------------- |
142
- | `AGENTS.md` | New section added | Has project-specific content | Manual merge |
143
-
144
- ### Summary
145
- - **Auto-apply**: X new files + Y updated files with no conflicts
146
- - **Review needed**: Z customized files with structural changes
147
- - **No action**: W files already current
148
- ```
149
-
150
- 5. **Confirm and Apply**:
151
-
152
- - If `--dry-run` flag: Output the report without making changes
153
- - Otherwise: Present the report and ask the user to confirm with (Y/n)
154
- - On confirmation:
155
- a. **New files**: Copy directly from template
156
- b. **Updated files (no customization)**: Replace with template version
157
- c. **Updated files (customized)**: Apply structural additions while preserving project values
158
- d. **Git commit**: Stage and commit all changes with message:
159
- ```bash
160
- git add -A
161
- git commit -m "chore: patch AI instructions from toolkit [$(date +%Y-%m-%d)]"
162
- ```
163
-
164
- 6. **Cleanup**:
53
+ | Category | Project Paths | Template Source Paths |
54
+ | -------------------------- | ---------------------------------------- | --------------------------------------------------- |
55
+ | **Cursor Rules** | `.cursor/rules/*.mdc` | `src/{type}/.cursor/rules/*.mdc` |
56
+ | **Cursor Cmds** | `.cursor/commands/*.md` | `src/{type}/.cursor/commands/*.md` |
57
+ | **Cursor Agents** | `.cursor/agents/*.agent.md` | `src/{type}/.cursor/agents/*.agent.md` |
58
+ | **GH Prompts** | `.github/prompts/*.prompt.md` | `src/{type}/.github/prompts/*.prompt.md` |
59
+ | **GH Instrs** | `.github/instructions/*.instructions.md` | `src/{type}/.github/instructions/*.instructions.md` |
60
+ | **GH Agents** | `.github/agents/*.agent.md` | `src/{type}/.github/agents/*.agent.md` |
61
+ | **Claude Rules** | `.claude/rules/*.md` | `src/{type}/.claude/rules/*.md` |
62
+ | **Claude Cmds** | `.claude/commands/*.md` | `src/{type}/.claude/commands/*.md` |
63
+ | **Claude Agents** | `.claude/agents/*.agent.md` | `src/{type}/.claude/agents/*.agent.md` |
64
+ | **Skills** | `.agents/skills/*/SKILL.md` | `src/{type}/.agents/skills/*/SKILL.md` |
65
+ | **AGENTS.md** | `AGENTS.md` | `src/{type}/AGENTS.md` |
66
+ | **CLAUDE.md** | `CLAUDE.md` | `src/{type}/CLAUDE.md` |
67
+ | **Claude Rules Snippets** | `.claude/rules-snippets/*.md` | `src/{type}/.claude/rules-snippets/*.md` |
68
+ | **Claude Prompt Snippets** | `.claude/prompt-snippets/*.md` | `src/{type}/.claude/prompt-snippets/*.md` |
69
+ | **Claude Agent Snippets** | `.claude/agents-snippets/*.md` | `src/{type}/.claude/agents-snippets/*.md` |
70
+ | **OpenCode Config** | `.opencode/opencode.jsonc` | `src/{type}/.opencode/opencode.jsonc` |
71
+ | **OpenCode Commands** | `.opencode/commands/*.md` | `src/{type}/.opencode/commands/*.md` |
72
+ | **OpenCode Rules** | `.opencode/rules/*.md` | `src/{type}/.opencode/rules/*.md` |
73
+ | **OpenCode Agents** | `.opencode/agents/*.md` | `src/{type}/.opencode/agents/*.md` |
74
+ | **OpenCode Plugins** | `.opencode/plugins/*.mjs` | `src/{type}/.opencode/plugins/*.mjs` |
75
+ | **Hooks** | `hooks/*.{js,sh,ps1}` | `src/{type}/hooks/*.{js,sh,ps1}` |
76
+ | **Agent Rules** | `.agents/rules/*.md` | `src/{type}/.agents/rules/*.md` |
77
+ | **Toolkit Version** | `.toolkit-version` | `.toolkit-version` (root of toolkit) |
78
+
79
+ **⚠️ OpenCode `opencode.jsonc` Schema Validation:**
80
+
81
+ When patching `.opencode/opencode.jsonc`, **only add or modify supported top-level keys**. The schema is defined at `https://opencode.ai/config.json`. Do NOT add unsupported keys.
82
+
83
+ **Supported top-level keys:** `$schema`, `instructions`, `skills`, `agent`, `default_agent`, `model`, `small_model`, `provider`, `mcp`, `tools`, `permission`, `lsp`, `formatter`, `server`, `shell`, `command`, `plugin`, `watcher`, `snapshot`, `share`, `autoupdate`, `compaction`, `attachment`, `logLevel`, `disabled_providers`, `enabled_providers`, `tool_output`, `enterprise`, `experimental`
84
+
85
+ **Do NOT add** keys like `rules`, `agents`, `commands`, `prompts` as top-level keys — OpenCode uses the `.opencode/` directory structure and `instructions` array instead.
86
+
87
+ > **Watch out:** the ponytail template uses the `plugin` key (singular). If you see `plugins` (plural) in your `opencode.jsonc`, that's a typo and the plugin won't load.
88
+
89
+ 3. **Diff Analysis** (parallelizable — dispatch one subagent per category):
90
+
91
+ For each category, compare template files against project files:
92
+
93
+ a. **Classify each file**:
94
+ - **🆕 New**: Exists in template but not in project → candidate for addition
95
+ - **📝 Updated**: Exists in both but template has newer content → candidate for merge
96
+ - **✅ Current**: Exists in both and content matches → no action needed
97
+ - **🔧 Customized**: Exists in both, project version has non-placeholder customizations → careful merge
98
+ - **⚠️ Missing in Template**: Exists in project but not in template → project-specific, keep as-is
99
+
100
+ b. **For updated files, generate a structured diff**:
101
+ - Preserve project-specific `{{PLACEHOLDER}}` replacements (already-bootstrapped values)
102
+ - Identify structural additions (new sections, new rules, new steps)
103
+ - Identify structural removals (deprecated guidance, removed sections)
104
+ - Identify content updates (changed instructions, improved wording)
105
+
106
+ c. **Smart Merge Rules**:
107
+ - **Never overwrite** project-specific values that replaced `{{PLACEHOLDER}}`
108
+ - **Always add** new files that don't exist in the project
109
+ - **Merge structural additions** into existing customized files
110
+ - **Flag for review** any removals from files that have been customized
111
+ - **Preserve custom agents/skills** that were added by the project
112
+
113
+ 4. **Generate Patch Report**:
114
+
115
+ ```markdown
116
+ ## 🩹 Bootstrap Patch Report
117
+
118
+ **Toolkit Version**: [commit hash] ([date])
119
+ **Project Type**: repo | monorepo
120
+ **Categories Scanned**: [list]
121
+
122
+ ### 🆕 New Files (X files)
123
+
124
+ | File | Category | Description |
125
+ | ---------------------------- | -------- | ------------------------ |
126
+ | `.cursor/rules/new-rule.mdc` | Rules | New coding standard rule |
127
+
128
+ ### 📝 Updated Files (X files)
129
+
130
+ | File | Changes | Risk |
131
+ | -------------------------------------------------------- | ------------------------------ | -------------- |
132
+ | `.cursor/commands/implement.md` | Added orchestrator checkpoint | Low - additive |
133
+ | `.github/instructions/subagent-workflow.instructions.md` | Added parallelization analysis | Low - additive |
134
+
135
+ ### ✅ Current Files (X files)
136
+
137
+ [No action needed]
138
+
139
+ ### 🔧 Customized Files Requiring Review (X files)
140
+
141
+ | File | Template Changes | Project Customizations | Merge Strategy |
142
+ | ----------- | ----------------- | ---------------------------- | -------------- |
143
+ | `AGENTS.md` | New section added | Has project-specific content | Manual merge |
144
+
145
+ ### Summary
146
+
147
+ - **Auto-apply**: X new files + Y updated files with no conflicts
148
+ - **Review needed**: Z customized files with structural changes
149
+ - **No action**: W files already current
150
+ ```
151
+
152
+ 5. **Confirm and Apply**:
153
+ - If `--dry-run` flag: Output the report without making changes
154
+ - Otherwise: Present the report and ask the user to confirm with (Y/n)
155
+ - On confirmation:
156
+ a. **New files**: Copy directly from template
157
+ b. **Updated files (no customization)**: Replace with template version
158
+ c. **Updated files (customized)**: Apply structural additions while preserving project values
159
+ d. **Git commit**: Stage and commit all changes with message:
160
+ ```bash
161
+ git add -A
162
+ git commit -m "chore: patch AI instructions from toolkit [$(date +%Y-%m-%d)]"
163
+ ```
165
164
 
166
- ```bash
167
- rm -rf "$TOOLKIT_TEMP"
168
- ```
165
+ 6. **Cleanup**:
169
166
 
170
- 7. **Post-Patch Validation**:
167
+ ```bash
168
+ rm -rf "$TOOLKIT_TEMP"
169
+ ```
171
170
 
172
- - Verify no `{{PLACEHOLDER}}` syntax was accidentally re-introduced
173
- - Confirm all files are valid (no broken frontmatter, no syntax errors)
174
- - List any new placeholders that need manual `bootstrap` to fill
171
+ 7. **Post-Patch Validation**:
172
+ - Verify no `{{PLACEHOLDER}}` syntax was accidentally re-introduced
173
+ - Confirm all files are valid (no broken frontmatter, no syntax errors)
174
+ - List any new placeholders that need manual `bootstrap` to fill
175
175
 
176
176
  ## Smart Merge Strategy
177
177
 
@@ -38,17 +38,17 @@ Migrate this monorepo's AI instruction files from the pre-3.0 inline pattern to
38
38
 
39
39
  4. **Inventory files to migrate** (parallelizable — scan all directories simultaneously):
40
40
 
41
- | Directory | Glob | Count |
42
- |-----------|------|-------|
43
- | `.claude/rules/` | `*.md` | {{N}} |
44
- | `.claude/commands/` | `*.md` | {{N}} |
45
- | `.claude/agents/` | `*.agent.md` | {{N}} |
41
+ | Directory | Glob | Count |
42
+ | ----------------------- | ------------------- | ----- |
43
+ | `.claude/rules/` | `*.md` | {{N}} |
44
+ | `.claude/commands/` | `*.md` | {{N}} |
45
+ | `.claude/agents/` | `*.agent.md` | {{N}} |
46
46
  | `.github/instructions/` | `*.instructions.md` | {{N}} |
47
- | `.github/prompts/` | `*.prompt.md` | {{N}} |
48
- | `.github/agents/` | `*.agent.md` | {{N}} |
49
- | `.cursor/rules/` | `*.mdc` | {{N}} |
50
- | `.cursor/commands/` | `*.md` | {{N}} |
51
- | `.cursor/agents/` | `*.agent.md` | {{N}} |
47
+ | `.github/prompts/` | `*.prompt.md` | {{N}} |
48
+ | `.github/agents/` | `*.agent.md` | {{N}} |
49
+ | `.cursor/rules/` | `*.mdc` | {{N}} |
50
+ | `.cursor/commands/` | `*.md` | {{N}} |
51
+ | `.cursor/agents/` | `*.agent.md` | {{N}} |
52
52
 
53
53
  5. **Present summary and ask for confirmation**:
54
54
 
@@ -89,17 +89,20 @@ mkdir -p .claude/agents-snippets
89
89
  > **Parallelizable**: Process rules, commands, and agents in parallel.
90
90
 
91
91
  For each `.claude/rules/*.md`:
92
+
92
93
  1. Read the file
93
94
  2. Parse frontmatter (between `---` delimiters) — **preserve `paths:` and `applyTo:` fields**
94
95
  3. Extract the body (everything after the closing `---`)
95
96
  4. Write to `.claude/rules-snippets/<name>.md` — include the frontmatter fields (`paths:`, `applyTo:`, `description:`) at the top of the snippet
96
97
 
97
98
  For each `.claude/commands/*.md`:
99
+
98
100
  1. Read the file
99
101
  2. Extract body content (after frontmatter)
100
102
  3. Write to `.claude/prompt-snippets/<name>.md`
101
103
 
102
104
  For each `.claude/agents/*.agent.md`:
105
+
103
106
  1. Read the file
104
107
  2. Parse frontmatter — preserve `user-invocable`, `agents`, `mode`, `model`, `temperature`, `permission` fields
105
108
  3. Extract body content
@@ -113,7 +116,7 @@ For each `.claude/agents/*.agent.md`:
113
116
 
114
117
  ```markdown
115
118
  ---
116
- {{ORIGINAL_FRONTMATTER}}
119
+ { { ORIGINAL_FRONTMATTER } }
117
120
  ---
118
121
 
119
122
  # {{TITLE}}
@@ -125,7 +128,7 @@ Follow the rules defined in [.claude/rules-snippets/{{NAME}}.md](../rules-snippe
125
128
 
126
129
  ```markdown
127
130
  ---
128
- {{ORIGINAL_FRONTMATTER}}
131
+ { { ORIGINAL_FRONTMATTER } }
129
132
  ---
130
133
 
131
134
  # {{TITLE}}
@@ -137,7 +140,7 @@ Follow the prompt defined in [.claude/prompt-snippets/{{NAME}}.md](../prompt-sni
137
140
 
138
141
  ```markdown
139
142
  ---
140
- {{ORIGINAL_FRONTMATTER}}
143
+ { { ORIGINAL_FRONTMATTER } }
141
144
  ---
142
145
 
143
146
  # {{AGENT_NAME}}
@@ -150,6 +153,7 @@ Follow the agent definition in [.claude/agents-snippets/{{NAME}}.md](../agents-s
150
153
  > **Parallelizable**: Process instructions, prompts, and agents in parallel.
151
154
 
152
155
  **Instructions** — For each `.github/instructions/*.instructions.md`:
156
+
153
157
  1. Check if a matching snippet exists in `.claude/rules-snippets/`
154
158
  2. If no matching snippet: extract body content → create `.claude/rules-snippets/<name>.md`
155
159
  3. Replace body with thin wrapper preserving `applyTo:` and `description:` frontmatter:
@@ -166,13 +170,14 @@ Follow the rules defined in [.claude/rules-snippets/{{NAME}}.md](../../.claude/r
166
170
  ```
167
171
 
168
172
  **Prompts** — For each `.github/prompts/*.prompt.md`:
173
+
169
174
  1. Check if a matching snippet exists in `.claude/prompt-snippets/`
170
175
  2. If no matching snippet: extract body → create `.claude/prompt-snippets/<name>.md`
171
176
  3. Replace body with thin wrapper:
172
177
 
173
178
  ```markdown
174
179
  ---
175
- {{ORIGINAL_FRONTMATTER}}
180
+ { { ORIGINAL_FRONTMATTER } }
176
181
  ---
177
182
 
178
183
  # {{TITLE}}
@@ -181,13 +186,14 @@ Follow the prompt defined in [.claude/prompt-snippets/{{NAME}}.md](../../.claude
181
186
  ```
182
187
 
183
188
  **Agents** — For each `.github/agents/*.agent.md`:
189
+
184
190
  1. Check if a matching snippet exists in `.claude/agents-snippets/`
185
191
  2. If no matching snippet: extract body → create `.claude/agents-snippets/<name>.md`
186
192
  3. Replace body with thin wrapper:
187
193
 
188
194
  ```markdown
189
195
  ---
190
- {{ORIGINAL_FRONTMATTER}}
196
+ { { ORIGINAL_FRONTMATTER } }
191
197
  ---
192
198
 
193
199
  # {{AGENT_NAME}}
@@ -200,13 +206,14 @@ Follow the agent definition in [.claude/agents-snippets/{{NAME}}.md](../../.clau
200
206
  > **Parallelizable**: Process rules, commands, and agents in parallel.
201
207
 
202
208
  **Rules** — For each `.cursor/rules/*.mdc`:
209
+
203
210
  1. Check if a matching snippet exists in `.claude/rules-snippets/`
204
211
  2. If no matching snippet: extract body → create `.claude/rules-snippets/<name>.md`
205
212
  3. Replace body with thin wrapper preserving original `.mdc` frontmatter:
206
213
 
207
214
  ```markdown
208
215
  ---
209
- {{ORIGINAL_MDC_FRONTMATTER}}
216
+ { { ORIGINAL_MDC_FRONTMATTER } }
210
217
  ---
211
218
 
212
219
  # {{TITLE}}
@@ -215,33 +222,29 @@ Follow the rules defined in [.claude/rules-snippets/{{NAME}}.md](../../.claude/r
215
222
  ```
216
223
 
217
224
  **Commands** — For each `.cursor/commands/*.md`:
225
+
218
226
  1. Check if a matching snippet exists in `.claude/prompt-snippets/`
219
227
  2. If no matching snippet: extract body → create `.claude/prompt-snippets/<name>.md`
220
228
  3. Replace body with thin wrapper referencing `../../.claude/prompt-snippets/{{NAME}}.md`
221
229
 
222
230
  **Agents** — For each `.cursor/agents/*.agent.md`:
231
+
223
232
  1. Check if a matching snippet exists in `.claude/agents-snippets/`
224
233
  2. If no matching snippet: extract body → create `.claude/agents-snippets/<name>.md`
225
234
  3. Replace body with thin wrapper referencing `../../.claude/agents-snippets/{{NAME}}.md`
226
235
 
227
236
  ### Step 7: Create .opencode/ Directory
228
237
 
229
- 1. Create `.opencode/opencode.json` using only supported schema keys:
238
+ 1. Create `.opencode/opencode.jsonc` using only supported schema keys:
230
239
 
231
240
  ```json
232
241
  {
233
- "$schema": "https://opencode.ai/config.json",
234
- "instructions": [
235
- "AGENTS.md",
236
- ".opencode/rules/*.md"
237
- ],
238
- "skills": {
239
- "paths": [
240
- ".agents/skills/**/*.md",
241
- ".claude/skills/**/*.md"
242
- ]
243
- },
244
- "lsp": true
242
+ "$schema": "https://opencode.ai/config.json",
243
+ "instructions": ["AGENTS.md", ".opencode/rules/*.md"],
244
+ "skills": {
245
+ "paths": [".agents/skills/**/*.md", ".claude/skills/**/*.md"]
246
+ },
247
+ "lsp": true
245
248
  }
246
249
  ```
247
250
 
@@ -299,6 +302,7 @@ Install the CHANGELOG/secrets enforcement hook to run before every commit:
299
302
  ```
300
303
 
301
304
  This enforces:
305
+
302
306
  - **CHANGELOG.md** — [Unreleased] must have content when non-trivial files are staged
303
307
  - **Zone.Identifier** — `*:Zone.Identifier` files are blocked from commit
304
308
  - **Secrets** — `.env`, `.env.*`, `*.key`, `*.pem` files are blocked from commit
@@ -335,6 +339,7 @@ Read the existing `CLAUDE.md` and add missing sections:
335
339
  - Build system section ({{BUILD_SYSTEM}} detected in Step 1)
336
340
 
337
341
  3. **Snippet architecture section** — add:
342
+
338
343
  ```markdown
339
344
  ## Snippet Architecture
340
345
 
@@ -377,45 +382,45 @@ If `--verbose`: log each check result.
377
382
 
378
383
  ### Directories Created
379
384
 
380
- | Directory | Files |
381
- |-----------|-------|
382
- | `.claude/rules-snippets/` | {{N}} |
385
+ | Directory | Files |
386
+ | -------------------------- | ----- |
387
+ | `.claude/rules-snippets/` | {{N}} |
383
388
  | `.claude/prompt-snippets/` | {{N}} |
384
389
  | `.claude/agents-snippets/` | {{N}} |
385
- | `.opencode/commands/` | {{N}} |
386
- | `.opencode/rules/` | {{N}} |
387
- | `.opencode/agents/` | {{N}} |
390
+ | `.opencode/commands/` | {{N}} |
391
+ | `.opencode/rules/` | {{N}} |
392
+ | `.opencode/agents/` | {{N}} |
388
393
 
389
394
  ### Files Converted to Thin Wrappers
390
395
 
391
- | Category | Count | Example |
392
- |----------|-------|---------|
393
- | `.claude/rules/` | {{N}} | `coding-standards.md` → thin wrapper |
394
- | `.claude/commands/` | {{N}} | `bootstrap.md` → thin wrapper |
395
- | `.claude/agents/` | {{N}} | `reviewer.agent.md` → thin wrapper |
396
+ | Category | Count | Example |
397
+ | ----------------------- | ----- | ------------------------------------------------- |
398
+ | `.claude/rules/` | {{N}} | `coding-standards.md` → thin wrapper |
399
+ | `.claude/commands/` | {{N}} | `bootstrap.md` → thin wrapper |
400
+ | `.claude/agents/` | {{N}} | `reviewer.agent.md` → thin wrapper |
396
401
  | `.github/instructions/` | {{N}} | `coding-standards.instructions.md` → thin wrapper |
397
- | `.github/prompts/` | {{N}} | `specify.prompt.md` → thin wrapper |
398
- | `.github/agents/` | {{N}} | `reviewer.agent.md` → thin wrapper |
399
- | `.cursor/rules/` | {{N}} | `coding-standards.mdc` → thin wrapper |
400
- | `.cursor/commands/` | {{N}} | `bootstrap.md` → thin wrapper |
401
- | `.cursor/agents/` | {{N}} | `reviewer.agent.md` → thin wrapper |
402
+ | `.github/prompts/` | {{N}} | `specify.prompt.md` → thin wrapper |
403
+ | `.github/agents/` | {{N}} | `reviewer.agent.md` → thin wrapper |
404
+ | `.cursor/rules/` | {{N}} | `coding-standards.mdc` → thin wrapper |
405
+ | `.cursor/commands/` | {{N}} | `bootstrap.md` → thin wrapper |
406
+ | `.cursor/agents/` | {{N}} | `reviewer.agent.md` → thin wrapper |
402
407
 
403
408
  ### New Files
404
409
 
405
- | File | Purpose |
406
- |------|---------|
407
- | `.opencode/opencode.json` | OpenCode configuration |
408
- | `.toolkit-version` | Version tracking (`3.0.0`) |
410
+ | File | Purpose |
411
+ | -------------------------- | -------------------------- |
412
+ | `.opencode/opencode.jsonc` | OpenCode configuration |
413
+ | `.toolkit-version` | Version tracking (`3.0.0`) |
409
414
 
410
415
  ### Validation Results
411
416
 
412
- | Check | Status |
413
- |-------|--------|
414
- | Snippet completeness | ✅ All snippets have content |
415
- | Thin wrapper references | ✅ All wrappers reference correct snippets |
416
- | `paths:` frontmatter preserved | ✅ Monorepo scoping intact |
417
- | No lost placeholders | ✅ All `{{VAR}}` preserved |
418
- | No broken paths | ✅ All relative paths resolve |
417
+ | Check | Status |
418
+ | ------------------------------ | ------------------------------------------ |
419
+ | Snippet completeness | ✅ All snippets have content |
420
+ | Thin wrapper references | ✅ All wrappers reference correct snippets |
421
+ | `paths:` frontmatter preserved | ✅ Monorepo scoping intact |
422
+ | No lost placeholders | ✅ All `{{VAR}}` preserved |
423
+ | No broken paths | ✅ All relative paths resolve |
419
424
 
420
425
  ### Cleanup
421
426