opencodekit 0.14.0 → 0.14.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.
Files changed (41) hide show
  1. package/dist/index.js +53 -18
  2. package/dist/template/.opencode/AGENTS.md +38 -3
  3. package/dist/template/.opencode/agent/build.md +44 -1
  4. package/dist/template/.opencode/agent/explore.md +1 -0
  5. package/dist/template/.opencode/agent/planner.md +40 -1
  6. package/dist/template/.opencode/agent/review.md +1 -0
  7. package/dist/template/.opencode/agent/rush.md +35 -0
  8. package/dist/template/.opencode/agent/scout.md +1 -0
  9. package/dist/template/.opencode/command/brainstorm.md +58 -3
  10. package/dist/template/.opencode/command/finish.md +18 -8
  11. package/dist/template/.opencode/command/fix.md +24 -15
  12. package/dist/template/.opencode/command/implement.md +44 -19
  13. package/dist/template/.opencode/command/import-plan.md +30 -8
  14. package/dist/template/.opencode/command/new-feature.md +37 -4
  15. package/dist/template/.opencode/command/plan.md +19 -1
  16. package/dist/template/.opencode/command/pr.md +25 -15
  17. package/dist/template/.opencode/command/revert-feature.md +15 -3
  18. package/dist/template/.opencode/command/skill-optimize.md +71 -7
  19. package/dist/template/.opencode/command/start.md +50 -5
  20. package/dist/template/.opencode/dcp.jsonc +11 -7
  21. package/dist/template/.opencode/memory/observations/2026-01-09-pattern-ampcode-mcp-json-includetools-pattern.md +42 -0
  22. package/dist/template/.opencode/memory/project/gotchas.md +52 -5
  23. package/dist/template/.opencode/memory/vector_db/memories.lance/_transactions/{0-8d00d272-cb80-463b-9774-7120a1c994e7.txn → 0-0d25ba80-ba3b-4209-9046-b45d6093b4da.txn} +0 -0
  24. package/dist/template/.opencode/memory/vector_db/memories.lance/_versions/1.manifest +0 -0
  25. package/dist/template/.opencode/memory/vector_db/memories.lance/data/{001010101000000101110001f998d04b63936ff83f9a34152d.lance → 1111100101010101011010004a9ef34df6b29f36a9a53a2892.lance} +0 -0
  26. package/dist/template/.opencode/opencode.json +525 -587
  27. package/dist/template/.opencode/package.json +1 -1
  28. package/dist/template/.opencode/plugin/memory.ts +77 -1
  29. package/dist/template/.opencode/plugin/package.json +1 -1
  30. package/dist/template/.opencode/plugin/skill-mcp.ts +155 -36
  31. package/dist/template/.opencode/skill/chrome-devtools/SKILL.md +43 -65
  32. package/dist/template/.opencode/skill/chrome-devtools/mcp.json +19 -0
  33. package/dist/template/.opencode/skill/executing-plans/SKILL.md +32 -2
  34. package/dist/template/.opencode/skill/finishing-a-development-branch/SKILL.md +42 -17
  35. package/dist/template/.opencode/skill/playwright/SKILL.md +58 -133
  36. package/dist/template/.opencode/skill/playwright/mcp.json +16 -0
  37. package/dist/template/.opencode/tool/memory-search.ts +2 -2
  38. package/package.json +4 -16
  39. package/dist/template/.opencode/memory/vector_db/memories.lance/_transactions/1-a3bea825-dad3-47dd-a6d6-ff41b76ff7b0.txn +0 -0
  40. package/dist/template/.opencode/memory/vector_db/memories.lance/_versions/2.manifest +0 -0
  41. package/dist/template/.opencode/memory/vector_db/memories.lance/data/010000101010000000010010701b3840d38c2b5f275da99978.lance +0 -0
@@ -142,10 +142,34 @@ Key risks identified:
142
142
  - [Risk 1]: Mitigation: [...]
143
143
  - [Risk 2]: Mitigation: [...]
144
144
 
145
- Proceed with spec? (yes/modify/explore-more)
146
145
  ```
147
146
 
148
- **STOP and wait for approval** before proceeding.
147
+ **STOP. Use question tool to get user approval:**
148
+
149
+ ```typescript
150
+ question({
151
+ questions: [
152
+ {
153
+ header: "Approve",
154
+ question:
155
+ "Should I proceed with creating the specification for $ARGUMENTS?",
156
+ options: [
157
+ {
158
+ label: "Yes, proceed",
159
+ description: "Approach looks good, create spec",
160
+ },
161
+ {
162
+ label: "Modify approach",
163
+ description: "Need changes to brainstorming",
164
+ },
165
+ { label: "Explore more", description: "Need more research first" },
166
+ ],
167
+ },
168
+ ],
169
+ });
170
+ ```
171
+
172
+ **Wait for user's answer before proceeding to spec creation.**
149
173
 
150
174
  ---
151
175
 
@@ -398,8 +422,17 @@ skill({ name: "using-git-worktrees" });
398
422
  # Ensure .gitignore has worktree directory
399
423
  grep -q "^\.worktrees/$" .gitignore || echo ".worktrees/" >> .gitignore
400
424
 
401
- # Create worktree for the epic
402
- git worktree add .worktrees/[epic-id] -b feature/[feature-name]
425
+ # Get current branch (parent branch)
426
+ PARENT_BRANCH=$(git rev-parse --abbrev-ref HEAD)
427
+
428
+ # Create readable branch name from feature name
429
+ FEATURE_SLUG=$(echo "[feature-name]" | tr '[:upper:]' '[:lower:]' | sed 's/[^a-z0-9]/-/g' | sed 's/--*/-/g' | cut -c1-40)
430
+
431
+ # Create branch: <parent>/feat/<epic-id>-<description>
432
+ BRANCH_NAME="${PARENT_BRANCH}/feat/[epic-id]-${FEATURE_SLUG}"
433
+
434
+ # Create worktree for the epic with readable branch
435
+ git worktree add ".worktrees/[epic-id]" -b "$BRANCH_NAME"
403
436
 
404
437
  # Setup in worktree
405
438
  cd .worktrees/[epic-id]
@@ -186,7 +186,25 @@ Decomposition: [Single bead | X tasks | X tasks with subtasks]
186
186
 
187
187
  Save to `.beads/artifacts/$ARGUMENTS/design.md`.
188
188
 
189
- **STOP. Wait for user to pick an option.**
189
+ **STOP. Use question tool to ask user to pick an option:**
190
+
191
+ ```typescript
192
+ question({
193
+ questions: [
194
+ {
195
+ header: "Design",
196
+ question: "Which implementation approach should I use for $ARGUMENTS?",
197
+ options: [
198
+ { label: "Option A (Recommended)", description: "[Option A summary]" },
199
+ { label: "Option B", description: "[Option B summary]" },
200
+ { label: "Option C", description: "[Option C summary]" },
201
+ ],
202
+ },
203
+ ],
204
+ });
205
+ ```
206
+
207
+ Wait for user's answer before proceeding.
190
208
 
191
209
  ---
192
210
 
@@ -120,23 +120,33 @@ git log origin/$(git branch --show-current)..HEAD --oneline 2>/dev/null || git l
120
120
  git diff --stat origin/$(git branch --show-current)..HEAD 2>/dev/null || git diff --stat HEAD~3..HEAD
121
121
  ```
122
122
 
123
- **Present to user:**
123
+ **Use question tool to get push/PR decision:**
124
124
 
125
+ ```typescript
126
+ question({
127
+ questions: [
128
+ {
129
+ header: "Push",
130
+ question: "Ready to push and create PR for $ARGUMENTS. What should I do?",
131
+ options: [
132
+ {
133
+ label: "Push & create PR (Recommended)",
134
+ description: "Push branch and create PR",
135
+ },
136
+ { label: "Push & draft PR", description: "Create as draft for review" },
137
+ {
138
+ label: "Show diff first",
139
+ description: "Review changes before pushing",
140
+ },
141
+ {
142
+ label: "Skip (I'll push manually)",
143
+ description: "Handle PR creation manually",
144
+ },
145
+ ],
146
+ },
147
+ ],
148
+ });
125
149
  ```
126
- Ready to Push & Create PR
127
- ━━━━━━━━━━━━━━━━━━━━━━━━━
128
-
129
- Branch: [current branch]
130
- Commits: [N commits ahead of origin]
131
-
132
- Would you like me to:
133
- 1. Push and create PR
134
- 2. Push and create draft PR
135
- 3. Show full diff first
136
- 4. Skip (I'll push manually)
137
- ```
138
-
139
- **Wait for user confirmation before proceeding.**
140
150
 
141
151
  If user confirms, push:
142
152
 
@@ -99,7 +99,7 @@ Before reverting, check what depends on this:
99
99
 
100
100
  ### Downstream Report
101
101
 
102
- ```
102
+ ````
103
103
  Downstream Impact Analysis
104
104
  ━━━━━━━━━━━━━━━━━━━━━━━━━━
105
105
 
@@ -119,8 +119,20 @@ Feature flags:
119
119
  - AUTH_ENABLED flag in production
120
120
 
121
121
  CAUTION: Reverting may break dependent features.
122
- Proceed? (yes/abort/revert-cascade)
123
- ```
122
+
123
+ ```typescript
124
+ question({
125
+ questions: [{
126
+ header: "Confirm",
127
+ question: "Ready to revert $ARGUMENTS? Breaking changes detected.",
128
+ options: [
129
+ { label: "Proceed with revert", description: "Execute revert with backups" },
130
+ { label: "Abort", description: "Cancel this operation" },
131
+ { label: "Revert cascade", description: "Revert dependent features too" }
132
+ ]
133
+ }]
134
+ });
135
+ ````
124
136
 
125
137
  ---
126
138
 
@@ -150,7 +150,37 @@ Rules:
150
150
 
151
151
  ### Clarification Techniques
152
152
 
153
- ```
153
+ ````
154
+ BEFORE (vague):
155
+ ──────────────
156
+ "Check that the configuration is correct."
157
+
158
+ AFTER (specific):
159
+ ────────────────
160
+ "Verify config:
161
+ 1. Run: `npm run config:check`
162
+ 2. Confirm output shows: 'Configuration valid'
163
+ 3. If errors, check [specific file] for [specific issue]"
164
+
165
+ Rules:
166
+ - Replace "check" with specific verification command
167
+ - Include expected output
168
+ - Add troubleshooting for failures
169
+
170
+ Use question tool to confirm:
171
+ ```typescript
172
+ question({
173
+ questions: [{
174
+ header: "Verify",
175
+ question: "Configuration verified. Ready to continue?",
176
+ options: [
177
+ { label: "Yes, continue", description: "Proceed with optimization" },
178
+ { label: "No, fix issues", description: "Address validation errors first" }
179
+ ]
180
+ }]
181
+ });
182
+ ````
183
+
154
184
  BEFORE (vague):
155
185
  ───────────────
156
186
  "Check that the configuration is correct."
@@ -158,19 +188,23 @@ BEFORE (vague):
158
188
  AFTER (specific):
159
189
  ─────────────────
160
190
  "Verify config:
191
+
161
192
  1. Run: `npm run config:check`
162
193
  2. Confirm output shows: 'Configuration valid'
163
194
  3. If errors, check [specific file] for [specific issue]"
164
195
 
165
196
  Rules:
197
+
166
198
  - Replace "check" with specific verification command
167
199
  - Include expected output
168
200
  - Add troubleshooting for failures
201
+
169
202
  ```
170
203
 
171
204
  ### Hardening Techniques
172
205
 
173
206
  ```
207
+
174
208
  BEFORE (soft):
175
209
  ──────────────
176
210
  "You should generally avoid committing directly to main."
@@ -180,20 +214,24 @@ AFTER (hardened):
180
214
  "NEVER commit directly to main. ALWAYS use feature branches.
181
215
 
182
216
  If tempted to commit to main because 'it's just a small fix':
217
+
183
218
  - STOP
184
219
  - Create branch anyway: git checkout -b fix/small-fix
185
220
  - This is NOT optional"
186
221
 
187
222
  Rules:
223
+
188
224
  - Add MUST/NEVER to critical rules
189
225
  - Anticipate rationalizations
190
226
  - Explicitly reject common excuses
191
227
  - Name the anti-pattern
228
+
192
229
  ```
193
230
 
194
231
  ### Expansion Techniques
195
232
 
196
233
  ```
234
+
197
235
  BEFORE (incomplete):
198
236
  ────────────────────
199
237
  "Handle errors appropriately."
@@ -203,23 +241,28 @@ AFTER (comprehensive):
203
241
  "Error Handling:
204
242
 
205
243
  Network Errors:
244
+
206
245
  - Retry 2x with exponential backoff
207
246
  - If still failing, log and surface to user
208
247
 
209
248
  Validation Errors:
249
+
210
250
  - Display specific field errors
211
251
  - Do NOT proceed with invalid data
212
252
 
213
253
  Permission Errors:
254
+
214
255
  - Log with full context
215
256
  - Display user-friendly message
216
257
  - Do NOT expose internal details"
217
258
 
218
259
  Rules:
260
+
219
261
  - List specific error categories
220
262
  - Provide handling for each
221
263
  - Include what NOT to do
222
- ```
264
+
265
+ ````
223
266
 
224
267
  ## Phase 5: Test Optimizations
225
268
 
@@ -232,9 +275,9 @@ task({
232
275
  description: "Test original skill",
233
276
  prompt: `
234
277
  Load skill: skill({ name: "$ARGUMENTS" })
235
-
278
+
236
279
  Scenario: [test scenario]
237
-
280
+
238
281
  Follow the skill and report each step.
239
282
  `,
240
283
  });
@@ -245,13 +288,13 @@ task({
245
288
  description: "Test optimized skill",
246
289
  prompt: `
247
290
  Load skill: skill({ name: "$ARGUMENTS" })
248
-
291
+
249
292
  Scenario: [same test scenario]
250
-
293
+
251
294
  Follow the skill and report each step.
252
295
  `,
253
296
  });
254
- ```
297
+ ````
255
298
 
256
299
  ### Compare Results
257
300
 
@@ -367,6 +410,27 @@ write({
367
410
  skill({ name: "$ARGUMENTS" });
368
411
  ```
369
412
 
413
+ ```typescript
414
+ question({
415
+ questions: [
416
+ {
417
+ header: "Verify",
418
+ question: "Skill optimized and saved. Ready to deploy?",
419
+ options: [
420
+ {
421
+ label: "Yes, deploy (Recommended)",
422
+ description: "All verifications passed",
423
+ },
424
+ {
425
+ label: "No, fix issues",
426
+ description: "Need to address verification failures",
427
+ },
428
+ ],
429
+ },
430
+ ],
431
+ });
432
+ ```
433
+
370
434
  Confirm:
371
435
 
372
436
  - [ ] Skill loads without error
@@ -75,14 +75,40 @@ bd update $ARGUMENTS --status in_progress
75
75
 
76
76
  ## Workspace Setup
77
77
 
78
- ### Option A: Feature Branch (default)
78
+ ### Create Feature Branch
79
79
 
80
- If not already on a feature branch:
80
+ Extract task info and parent branch for a readable branch name:
81
81
 
82
82
  ```bash
83
- git checkout -b $ARGUMENTS
83
+ # Get current branch (parent branch)
84
+ PARENT_BRANCH=$(git rev-parse --abbrev-ref HEAD)
85
+
86
+ # Get task title and type from bead
87
+ BEAD_INFO=$(bd show $ARGUMENTS --json 2>/dev/null)
88
+ BEAD_TITLE=$(echo "$BEAD_INFO" | jq -r '.title // ""' | tr '[:upper:]' '[:lower:]' | sed 's/[^a-z0-9]/-/g' | sed 's/--*/-/g' | cut -c1-40)
89
+ BEAD_TYPE=$(echo "$BEAD_INFO" | jq -r '.type // "task"')
90
+
91
+ # Map bead type to branch prefix
92
+ case "$BEAD_TYPE" in
93
+ "bug") PREFIX="fix" ;;
94
+ "feature"|"epic") PREFIX="feat" ;;
95
+ "refactor") PREFIX="refactor" ;;
96
+ "chore") PREFIX="chore" ;;
97
+ *) PREFIX="feat" ;;
98
+ esac
99
+
100
+ # Create branch: <parent>/<type>/<bead-id>-<description>
101
+ BRANCH_NAME="${PARENT_BRANCH}/${PREFIX}/$ARGUMENTS-${BEAD_TITLE}"
102
+ git checkout -b "$BRANCH_NAME" 2>/dev/null || echo "Branch already exists or already on it"
84
103
  ```
85
104
 
105
+ **Branch naming convention:**
106
+ | Parent Branch | Bead Type | Example |
107
+ |---------------|-----------|---------|
108
+ | main | bug | `main/fix/bd-a1b2-login-error` |
109
+ | develop | feature | `develop/feat/bd-c3d4-user-auth` |
110
+ | release-v2 | chore | `release-v2/chore/bd-e5f6-update-deps` |
111
+
86
112
  ### Option B: Git Worktree (if --worktree flag)
87
113
 
88
114
  For isolated work that won't conflict with main workspace:
@@ -101,11 +127,30 @@ skill({ name: "using-git-worktrees" });
101
127
  **Worktree setup:**
102
128
 
103
129
  ```bash
130
+ # Get current branch (parent branch)
131
+ PARENT_BRANCH=$(git rev-parse --abbrev-ref HEAD)
132
+
133
+ # Get task title for readable worktree name
134
+ BEAD_INFO=$(bd show $ARGUMENTS --json 2>/dev/null)
135
+ BEAD_TITLE=$(echo "$BEAD_INFO" | jq -r '.title // ""' | tr '[:upper:]' '[:lower:]' | sed 's/[^a-z0-9]/-/g' | sed 's/--*/-/g' | cut -c1-40)
136
+ BEAD_TYPE=$(echo "$BEAD_INFO" | jq -r '.type // "task"')
137
+
138
+ # Map bead type to branch prefix
139
+ case "$BEAD_TYPE" in
140
+ "bug") PREFIX="fix" ;;
141
+ "feature"|"epic") PREFIX="feat" ;;
142
+ "refactor") PREFIX="refactor" ;;
143
+ *) PREFIX="feat" ;;
144
+ esac
145
+
146
+ # Create branch: <parent>/<type>/<bead-id>-<description>
147
+ BRANCH_NAME="${PARENT_BRANCH}/${PREFIX}/$ARGUMENTS-${BEAD_TITLE}"
148
+
104
149
  # Verify .gitignore has worktree directory
105
150
  grep -q "^\.worktrees/$" .gitignore || echo ".worktrees/" >> .gitignore
106
151
 
107
- # Create worktree
108
- git worktree add .worktrees/$ARGUMENTS -b $ARGUMENTS
152
+ # Create worktree with readable branch name
153
+ git worktree add ".worktrees/$ARGUMENTS" -b "$BRANCH_NAME"
109
154
 
110
155
  # Navigate to worktree
111
156
  cd .worktrees/$ARGUMENTS
@@ -14,28 +14,32 @@
14
14
  // Nudge every 8 tool calls (slightly more aggressive than default 10)
15
15
  "nudgeFrequency": 8,
16
16
  // Protect state-modifying and critical workflow tools
17
+ // Updated for v1.1.8: Added question tool, removed legacy bd_* (use CLI)
17
18
  "protectedTools": [
18
19
  "write",
19
20
  "edit",
21
+ "question",
20
22
  "memory-read",
21
23
  "memory-update",
22
24
  "memory-search",
23
25
  "observation",
24
26
  "skill",
25
27
  "skill_mcp",
28
+ "task",
29
+ "batch",
30
+ "todowrite",
31
+ "todoread",
32
+ "lsp",
26
33
  "lsp_lsp_rename",
27
34
  "lsp_lsp_find_references",
28
35
  "lsp_lsp_goto_definition",
29
36
  "lsp_lsp_code_actions",
30
37
  "lsp_lsp_code_action_apply",
31
38
  "lsp_lsp_organize_imports",
32
- "bd_init",
33
- "bd_claim",
34
- "bd_done",
35
- "bd_show",
36
- "bd_reserve",
37
- "bd_reservations",
38
- "bd_sync"
39
+ "bd-reserve",
40
+ "bd-release",
41
+ "bd-msg",
42
+ "bd-inbox"
39
43
  ]
40
44
  },
41
45
  "discard": {
@@ -0,0 +1,42 @@
1
+ ---
2
+ type: pattern
3
+ created: 2026-01-09T08:04:40.257Z
4
+ confidence: high
5
+ valid_until: null
6
+ superseded_by: null
7
+ concepts: ["mcp", "includeTools", "ampcode", "skill", "token-optimization", "lazy-load", "filtering"]
8
+ ---
9
+
10
+ # 🔄 Ampcode mcp.json includeTools pattern
11
+
12
+ 🟢 **Confidence:** high
13
+
14
+ Learned from Ampcode's ui-preview skill (https://github.com/ampcode/amp-contrib/tree/main/.agents/skills/ui-preview):
15
+
16
+ ## Pattern: Lazy-load MCP with includeTools filtering
17
+
18
+ 1. **mcp.json file** (separate from SKILL.md):
19
+ ```json
20
+ {
21
+ "chrome-devtools": {
22
+ "command": "npx",
23
+ "args": ["-y", "chrome-devtools-mcp@latest"],
24
+ "includeTools": ["navigate_page", "take_screenshot", "new_page", "list_pages"]
25
+ }
26
+ }
27
+ ```
28
+
29
+ 2. **SKILL.md documents ONLY filtered tools**:
30
+ - "Available Tools" section lists only the filtered tools
31
+ - Workflow examples use only those tools
32
+ - Note at bottom explains how to expand filter if needed
33
+
34
+ 3. **Token savings**: ~90% reduction (4 tools vs 26+ for chrome-devtools)
35
+
36
+ ## Applied to OpenCodeKit:
37
+ - chrome-devtools: 11 tools (from 26+)
38
+ - playwright: 8 tools (from 17+)
39
+ - Other MCP skills already minimal (2-4 tools), no filtering needed
40
+
41
+ ## Key insight:
42
+ SKILL.md and mcp.json must be synchronized - don't document tools that aren't in includeTools filter, or agents get confused.
@@ -1,12 +1,46 @@
1
1
  ---
2
2
  purpose: Footguns, edge cases, and "don't forget this" warnings
3
- updated: 2025-01-05
3
+ updated: 2025-01-09
4
4
  ---
5
5
 
6
6
  # Project Gotchas
7
7
 
8
8
  ## Configuration Quirks
9
9
 
10
+ ### OpenCode v1.1.7 → v1.1.8 Changes
11
+
12
+ **v1.1.7 Features:**
13
+
14
+ - **Question tool**: New interactive tool for gathering user preferences/clarifying instructions
15
+ - **Config precedence fix**: Local `.opencode/opencode.json` now correctly overrides remote/global config
16
+ - **`.claude` loading toggle**: Can disable via `--no-claude-prompts` / `--no-claude-skills` flags
17
+ - **Task tool filtering**: Simplified subagent filtering
18
+
19
+ **v1.1.8 Features:**
20
+
21
+ - **Multi-select questions**: Question tool now supports `multiple: true` for multi-select
22
+ - **Performance**: Chunked message loading, lazy diff rendering
23
+ - **Full path fuzzy matching**: Autocomplete uses full file paths
24
+ - **OpenTUI v0.1.70**: UI improvements
25
+
26
+ **Plugin SDK Update Required:**
27
+
28
+ ```json
29
+ "@opencode-ai/plugin": "^1.1.8" // Was ^1.1.2
30
+ ```
31
+
32
+ ### DCP Protected Tools (v1.1.8)
33
+
34
+ Legacy `bd_*` tool names don't exist - use actual custom tool names:
35
+
36
+ | Old (Wrong) | New (Correct) |
37
+ | ----------------- | ------------- |
38
+ | `bd_init` | N/A (use CLI) |
39
+ | `bd_claim` | N/A (use CLI) |
40
+ | `bd_reserve` | `bd-reserve` |
41
+ | `bd_reservations` | `bd-release` |
42
+ | `bd_sync` | N/A (use CLI) |
43
+
10
44
  ### DCP v1.1.3 Schema Breaking Changes
11
45
 
12
46
  1. **Legacy `strategies.onIdle` removed**: v1.1.2+ no longer supports this field
@@ -35,10 +69,23 @@ updated: 2025-01-05
35
69
 
36
70
  ### Protected Tools in DCP
37
71
 
38
- v1.1.3 recognizes more tool variants. Ensure these are protected:
39
-
40
- - `lsp_lsp_find_references`, `lsp_lsp_goto_definition` (plugin-specific naming)
41
- - `memory-search`, `skill_mcp`, `bd_sync` (often forgotten)
72
+ v1.1.8 recognizes more tool variants. Ensure these are protected:
73
+
74
+ ```jsonc
75
+ "protectedTools": [
76
+ // State-modifying
77
+ "write", "edit", "question",
78
+ // Memory/observation
79
+ "memory-read", "memory-update", "memory-search", "observation",
80
+ // Skills/tasks
81
+ "skill", "skill_mcp", "task", "batch", "todowrite", "todoread",
82
+ // LSP
83
+ "lsp", "lsp_lsp_rename", "lsp_lsp_find_references", "lsp_lsp_goto_definition",
84
+ "lsp_lsp_code_actions", "lsp_lsp_code_action_apply", "lsp_lsp_organize_imports",
85
+ // Beads (custom tools only - CLI uses bash)
86
+ "bd-reserve", "bd-release", "bd-msg", "bd-inbox"
87
+ ]
88
+ ```
42
89
 
43
90
  ## Time Wasters
44
91