@amsterdamdatalabs/enact-extensions 0.1.0 → 0.1.3

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 (245) hide show
  1. package/README.md +96 -21
  2. package/dist/index.d.ts +5 -3
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js +3 -2
  5. package/dist/index.js.map +1 -1
  6. package/dist/install.d.ts +171 -1
  7. package/dist/install.d.ts.map +1 -1
  8. package/dist/install.js +402 -49
  9. package/dist/install.js.map +1 -1
  10. package/dist/internal/codex.d.ts.map +1 -1
  11. package/dist/internal/codex.js +7 -1
  12. package/dist/internal/codex.js.map +1 -1
  13. package/dist/internal/platform.d.ts +8 -0
  14. package/dist/internal/platform.d.ts.map +1 -1
  15. package/dist/internal/platform.js +46 -2
  16. package/dist/internal/platform.js.map +1 -1
  17. package/dist/provision.d.ts +30 -0
  18. package/dist/provision.d.ts.map +1 -0
  19. package/dist/provision.js +202 -0
  20. package/dist/provision.js.map +1 -0
  21. package/dist/validate/index.d.ts +44 -0
  22. package/dist/validate/index.d.ts.map +1 -1
  23. package/dist/validate/index.js +157 -0
  24. package/dist/validate/index.js.map +1 -1
  25. package/extensions/cmux/.agents/plugin.json +37 -0
  26. package/extensions/cmux/skills/cmux/SKILL.md +82 -0
  27. package/extensions/cmux/skills/cmux/agents/openai.yaml +4 -0
  28. package/extensions/cmux/skills/cmux/references/handles-and-identify.md +35 -0
  29. package/extensions/cmux/skills/cmux/references/panes-surfaces.md +37 -0
  30. package/extensions/cmux/skills/cmux/references/trigger-flash-and-health.md +23 -0
  31. package/extensions/cmux/skills/cmux/references/windows-workspaces.md +31 -0
  32. package/extensions/cmux/skills/cmux-vm-monitor/SKILL.md +122 -0
  33. package/extensions/cmux/skills/cmux-vm-monitor/agents/openai.yaml +4 -0
  34. package/extensions/cmux/skills/cmux-vm-monitor/references/cmux-commands.md +66 -0
  35. package/extensions/cmux/skills/cmux-vm-monitor/scripts/codex_vm_monitor.sh +45 -0
  36. package/extensions/cmux/skills/cmux-workspace/SKILL.md +93 -0
  37. package/extensions/dev-state/.agents/plugin.json +35 -0
  38. package/extensions/dev-state/skills/dev-state-plan-graduation/SKILL.md +194 -0
  39. package/extensions/dev-state/skills/dev-state-plan-graduation/agents/openai.yaml +4 -0
  40. package/extensions/dev-state/skills/dev-state-plan-graduation/references/reference.md +130 -0
  41. package/extensions/devops/.agents/plugin.json +36 -0
  42. package/extensions/devops/skills/azure-devops-cli/SKILL.md +431 -0
  43. package/extensions/devops/skills/azure-devops-cli/agents/openai.yaml +4 -0
  44. package/extensions/devops/skills/ci-pipeline-strategy/SKILL.md +217 -0
  45. package/extensions/devops/skills/ci-pipeline-strategy/agents/openai.yaml +4 -0
  46. package/extensions/enact-context/.agents/plugin.json +40 -0
  47. package/extensions/enact-context/.mcp.json +8 -0
  48. package/extensions/enact-context/README.md +25 -0
  49. package/extensions/enact-context/assets/icon.png +0 -0
  50. package/extensions/enact-context/assets/logo.png +0 -0
  51. package/extensions/enact-context/hooks/hooks.json +115 -0
  52. package/extensions/enact-context/skills/enact-context/SKILL.md +149 -0
  53. package/extensions/enact-context/skills/enact-context/scripts/install.sh +69 -0
  54. package/extensions/enact-factory/.agents/plugin.json +42 -0
  55. package/extensions/enact-factory/.mcp.json +8 -0
  56. package/extensions/enact-factory/assets/icon.png +0 -0
  57. package/extensions/enact-factory/assets/logo.png +0 -0
  58. package/extensions/enact-factory/hooks/user-prompt-submit.mjs +67 -0
  59. package/extensions/enact-factory/skills/testing-strategy/SKILL.md +167 -0
  60. package/extensions/enact-factory/skills/workitem-triage/SKILL.md +22 -0
  61. package/extensions/enact-operator/.agents/plugin.json +57 -0
  62. package/extensions/enact-operator/.app.json +3 -0
  63. package/extensions/enact-operator/.mcp.json +10 -0
  64. package/extensions/enact-operator/_taxonomy.md +86 -0
  65. package/extensions/enact-operator/agents/README.md +5 -0
  66. package/extensions/enact-operator/agents/architect.toml +25 -0
  67. package/extensions/enact-operator/agents/code-reviewer.toml +24 -0
  68. package/extensions/enact-operator/agents/critic.toml +30 -0
  69. package/extensions/enact-operator/agents/executor.toml +24 -0
  70. package/extensions/enact-operator/agents/explore.toml +23 -0
  71. package/extensions/enact-operator/agents/planner.toml +24 -0
  72. package/extensions/enact-operator/agents/verifier.toml +24 -0
  73. package/extensions/enact-operator/assets/icon.png +0 -0
  74. package/extensions/enact-operator/assets/logo.png +0 -0
  75. package/extensions/enact-operator/commands/doctor.md +39 -0
  76. package/extensions/enact-operator/commands/setup.md +51 -0
  77. package/extensions/enact-operator/hooks/hooks.json +146 -0
  78. package/extensions/enact-operator/skills/_variants.md +44 -0
  79. package/extensions/enact-operator/skills/ai-slop-cleaner/SKILL.md +50 -0
  80. package/extensions/enact-operator/skills/analyze/SKILL.md +91 -0
  81. package/extensions/enact-operator/skills/ask/SKILL.md +47 -0
  82. package/extensions/enact-operator/skills/autopilot/SKILL.md +170 -0
  83. package/extensions/enact-operator/skills/autoresearch-goal/SKILL.md +79 -0
  84. package/extensions/enact-operator/skills/cancel/SKILL.md +99 -0
  85. package/extensions/enact-operator/skills/configure-notifications/SKILL.md +77 -0
  86. package/extensions/enact-operator/skills/deep-interview/SKILL.md +80 -0
  87. package/extensions/enact-operator/skills/doctor/SKILL.md +48 -0
  88. package/extensions/enact-operator/skills/hud/SKILL.md +49 -0
  89. package/extensions/enact-operator/skills/hyperplan/SKILL.md +47 -0
  90. package/extensions/enact-operator/skills/plan/SKILL.md +78 -0
  91. package/extensions/enact-operator/skills/ralph/SKILL.md +201 -0
  92. package/extensions/enact-operator/skills/ralph/gemini.md +18 -0
  93. package/extensions/enact-operator/skills/ralplan/SKILL.md +151 -0
  94. package/extensions/enact-operator/skills/remove-deadcode/SKILL.md +45 -0
  95. package/extensions/enact-operator/skills/research/SKILL.md +74 -0
  96. package/extensions/enact-operator/skills/review/SKILL.md +58 -0
  97. package/extensions/enact-operator/skills/security-research/SKILL.md +54 -0
  98. package/extensions/enact-operator/skills/setup/SKILL.md +91 -0
  99. package/extensions/enact-operator/skills/setup/scripts/install.sh +50 -0
  100. package/extensions/enact-operator/skills/skill/SKILL.md +82 -0
  101. package/extensions/enact-operator/skills/tdd/SKILL.md +59 -0
  102. package/extensions/enact-operator/skills/team/SKILL.md +199 -0
  103. package/extensions/enact-operator/skills/trace/SKILL.md +41 -0
  104. package/extensions/enact-operator/skills/ultragoal/SKILL.md +99 -0
  105. package/extensions/enact-operator/skills/ultraqa/SKILL.md +113 -0
  106. package/extensions/enact-operator/skills/ultrawork/SKILL.md +145 -0
  107. package/extensions/enact-operator/skills/ultrawork/planner.md +28 -0
  108. package/extensions/enact-operator/skills/wiki/SKILL.md +41 -0
  109. package/extensions/enact-operator/skills/work-with-workitem/SKILL.md +51 -0
  110. package/extensions/enact-wiki/.agents/plugin.json +42 -0
  111. package/extensions/enact-wiki/.mcp.json +15 -0
  112. package/extensions/enact-wiki/README.md +44 -0
  113. package/extensions/enact-wiki/assets/icon.png +0 -0
  114. package/extensions/enact-wiki/assets/logo.png +0 -0
  115. package/extensions/enact-wiki/skills/document-parser/SKILL.md +17 -0
  116. package/extensions/enact-wiki/skills/document-parser/scripts/parse.sh +60 -0
  117. package/extensions/enact-wiki/skills/document-parser/skill.json +9 -0
  118. package/extensions/enact-wiki/skills/enact-wiki/SKILL.md +30 -0
  119. package/extensions/enact-wiki/skills/enact-wiki/references/ingest.md +62 -0
  120. package/extensions/enact-wiki/skills/enact-wiki/references/manage.md +34 -0
  121. package/extensions/enact-wiki/skills/enact-wiki/references/query.md +59 -0
  122. package/extensions/enact-wiki/skills/search-lab/SKILL.md +57 -0
  123. package/extensions/enact-wiki/skills/search-lab/scripts/analyze.ts +23 -0
  124. package/{plugins/net-revenue-management/.codex-plugin → extensions/net-revenue-management/.agents}/plugin.json +10 -6
  125. package/extensions/plugin-dev/.agents/plugin.json +42 -0
  126. package/extensions/plugin-dev/.mcp.json +3 -0
  127. package/extensions/plugin-dev/agents/agent-creator.md +199 -0
  128. package/extensions/plugin-dev/agents/plugin-validator.md +91 -0
  129. package/extensions/plugin-dev/agents/skill-reviewer.md +212 -0
  130. package/extensions/plugin-dev/commands/_archive/create-marketplace.md +427 -0
  131. package/extensions/plugin-dev/commands/_archive/plugin-dev-guide.md +12 -0
  132. package/extensions/plugin-dev/commands/create-plugin.md +498 -0
  133. package/extensions/plugin-dev/commands/start.md +81 -0
  134. package/extensions/plugin-dev/hooks/hooks.json +3 -0
  135. package/extensions/plugin-dev/skills/agent-development/SKILL.md +641 -0
  136. package/extensions/plugin-dev/skills/agent-development/examples/agent-creation-prompt.md +250 -0
  137. package/extensions/plugin-dev/skills/agent-development/examples/complete-agent-examples.md +461 -0
  138. package/extensions/plugin-dev/skills/agent-development/references/advanced-agent-fields.md +246 -0
  139. package/extensions/plugin-dev/skills/agent-development/references/agent-creation-system-prompt.md +216 -0
  140. package/extensions/plugin-dev/skills/agent-development/references/permission-modes-rules.md +226 -0
  141. package/extensions/plugin-dev/skills/agent-development/references/system-prompt-design.md +464 -0
  142. package/extensions/plugin-dev/skills/agent-development/references/triggering-examples.md +474 -0
  143. package/extensions/plugin-dev/skills/agent-development/scripts/create-agent-skeleton.sh +176 -0
  144. package/extensions/plugin-dev/skills/agent-development/scripts/test-agent-trigger.sh +227 -0
  145. package/extensions/plugin-dev/skills/agent-development/scripts/validate-agent.sh +227 -0
  146. package/extensions/plugin-dev/skills/command-development/SKILL.md +763 -0
  147. package/extensions/plugin-dev/skills/command-development/examples/plugin-commands.md +612 -0
  148. package/extensions/plugin-dev/skills/command-development/examples/simple-commands.md +527 -0
  149. package/extensions/plugin-dev/skills/command-development/references/advanced-workflows.md +762 -0
  150. package/extensions/plugin-dev/skills/command-development/references/documentation-patterns.md +769 -0
  151. package/extensions/plugin-dev/skills/command-development/references/frontmatter-reference.md +508 -0
  152. package/extensions/plugin-dev/skills/command-development/references/interactive-commands.md +966 -0
  153. package/extensions/plugin-dev/skills/command-development/references/marketplace-considerations.md +943 -0
  154. package/extensions/plugin-dev/skills/command-development/references/plugin-features-reference.md +637 -0
  155. package/extensions/plugin-dev/skills/command-development/references/plugin-integration.md +191 -0
  156. package/extensions/plugin-dev/skills/command-development/references/skill-tool.md +447 -0
  157. package/extensions/plugin-dev/skills/command-development/references/testing-strategies.md +723 -0
  158. package/extensions/plugin-dev/skills/command-development/scripts/check-frontmatter.sh +234 -0
  159. package/extensions/plugin-dev/skills/command-development/scripts/validate-command.sh +160 -0
  160. package/extensions/plugin-dev/skills/hook-development/SKILL.md +861 -0
  161. package/extensions/plugin-dev/skills/hook-development/examples/load-context.sh +55 -0
  162. package/extensions/plugin-dev/skills/hook-development/examples/validate-bash.sh +57 -0
  163. package/extensions/plugin-dev/skills/hook-development/examples/validate-write.sh +48 -0
  164. package/extensions/plugin-dev/skills/hook-development/references/advanced.md +871 -0
  165. package/extensions/plugin-dev/skills/hook-development/references/hook-input-schemas.md +145 -0
  166. package/extensions/plugin-dev/skills/hook-development/references/migration.md +392 -0
  167. package/extensions/plugin-dev/skills/hook-development/references/patterns.md +430 -0
  168. package/extensions/plugin-dev/skills/hook-development/scripts/README.md +181 -0
  169. package/extensions/plugin-dev/skills/hook-development/scripts/hook-linter.sh +153 -0
  170. package/extensions/plugin-dev/skills/hook-development/scripts/test-hook.sh +276 -0
  171. package/extensions/plugin-dev/skills/hook-development/scripts/validate-hook-schema.sh +159 -0
  172. package/extensions/plugin-dev/skills/mcp-integration/SKILL.md +775 -0
  173. package/extensions/plugin-dev/skills/mcp-integration/examples/http-server.json +20 -0
  174. package/extensions/plugin-dev/skills/mcp-integration/examples/sse-server.json +19 -0
  175. package/extensions/plugin-dev/skills/mcp-integration/examples/stdio-server.json +38 -0
  176. package/extensions/plugin-dev/skills/mcp-integration/examples/ws-server.json +26 -0
  177. package/extensions/plugin-dev/skills/mcp-integration/references/authentication.md +601 -0
  178. package/extensions/plugin-dev/skills/mcp-integration/references/server-discovery.md +190 -0
  179. package/extensions/plugin-dev/skills/mcp-integration/references/server-types.md +572 -0
  180. package/extensions/plugin-dev/skills/mcp-integration/references/tool-usage.md +623 -0
  181. package/extensions/plugin-dev/skills/plugin-dev-guide/SKILL.md +222 -0
  182. package/extensions/plugin-dev/skills/plugin-structure/SKILL.md +705 -0
  183. package/extensions/plugin-dev/skills/plugin-structure/examples/advanced-plugin.md +774 -0
  184. package/extensions/plugin-dev/skills/plugin-structure/examples/minimal-plugin.md +83 -0
  185. package/extensions/plugin-dev/skills/plugin-structure/examples/standard-plugin.md +611 -0
  186. package/extensions/plugin-dev/skills/plugin-structure/references/advanced-topics.md +289 -0
  187. package/extensions/plugin-dev/skills/plugin-structure/references/component-patterns.md +592 -0
  188. package/extensions/plugin-dev/skills/plugin-structure/references/github-actions.md +233 -0
  189. package/extensions/plugin-dev/skills/plugin-structure/references/headless-ci-mode.md +193 -0
  190. package/extensions/plugin-dev/skills/plugin-structure/references/manifest-reference.md +625 -0
  191. package/extensions/plugin-dev/skills/plugin-structure/references/output-styles.md +116 -0
  192. package/extensions/plugin-dev/skills/skill-development/SKILL.md +564 -0
  193. package/extensions/plugin-dev/skills/skill-development/examples/complete-skill.md +465 -0
  194. package/extensions/plugin-dev/skills/skill-development/examples/frontmatter-templates.md +167 -0
  195. package/extensions/plugin-dev/skills/skill-development/examples/minimal-skill.md +111 -0
  196. package/extensions/plugin-dev/skills/skill-development/references/advanced-frontmatter.md +225 -0
  197. package/extensions/plugin-dev/skills/skill-development/references/commands-vs-skills.md +39 -0
  198. package/extensions/plugin-dev/skills/skill-development/references/skill-creation-workflow.md +379 -0
  199. package/extensions/plugin-dev/skills/skill-development/references/skill-creator-original.md +210 -0
  200. package/package.json +8 -11
  201. package/scripts/enact-extensions.mjs +823 -21
  202. package/scripts/hooks/session-start-drift-check.mjs +58 -0
  203. package/scripts/lib/build-index.mjs +50 -0
  204. package/scripts/lib/bundle-hash.mjs +137 -0
  205. package/scripts/lib/hooks.mjs +741 -0
  206. package/scripts/lib/ledger.mjs +163 -0
  207. package/scripts/lib/list-bundles.mjs +70 -0
  208. package/scripts/lib/outdated.mjs +144 -0
  209. package/scripts/lib/provision-mcp.mjs +16 -0
  210. package/scripts/lib/resolve-bundle.mjs +121 -0
  211. package/scripts/lib/run-install.mjs +402 -38
  212. package/scripts/lib/run-prune.mjs +73 -0
  213. package/scripts/lib/run-sync.mjs +9 -1
  214. package/scripts/lib/run-uninstall.mjs +244 -0
  215. package/scripts/lib/run-update.mjs +152 -0
  216. package/scripts/lib/run-validate.mjs +21 -18
  217. package/scripts/lib/serve.mjs +472 -0
  218. package/scripts/postinstall.mjs +63 -0
  219. package/scripts/setup-enact-context.sh +2 -2
  220. package/scripts/version-bump.sh +463 -0
  221. package/spec/codex.json +1 -11
  222. package/spec/index.json +59 -0
  223. package/web/assets/README.md +111 -0
  224. package/web/assets/logo-full.png +0 -0
  225. package/web/assets/logo-slim.png +0 -0
  226. package/web/assets/tokens/base.css +45 -0
  227. package/web/assets/tokens/colors.css +248 -0
  228. package/web/assets/tokens/effects.css +24 -0
  229. package/web/assets/tokens/fonts.css +8 -0
  230. package/web/assets/tokens/index.css +18 -0
  231. package/web/assets/tokens/spacing.css +50 -0
  232. package/web/index.html +1188 -0
  233. package/.agents/plugins/marketplace.json +0 -20
  234. package/catalog/enact-context.json +0 -9
  235. package/catalog/enact-factory.json +0 -7
  236. package/catalog/enact-operator.json +0 -7
  237. package/catalog/enact-wiki.json +0 -7
  238. package/catalog/net-revenue-management.json +0 -8
  239. package/scripts/rename-supervisor-to-operator.pl +0 -66
  240. package/scripts/sync-manifests.mjs +0 -23
  241. package/scripts/validate-catalog.mjs +0 -37
  242. package/scripts/validate-plugin.mjs +0 -10
  243. /package/{plugins → extensions}/net-revenue-management/.mcp.json +0 -0
  244. /package/{plugins → extensions}/net-revenue-management/skills/net-revenue-risks/SKILL.md +0 -0
  245. /package/{plugins → extensions}/net-revenue-management/skills/net-revenue-scenario/SKILL.md +0 -0
@@ -0,0 +1,430 @@
1
+ # Common Hook Patterns
2
+
3
+ This reference provides common, proven patterns for implementing Claude Code hooks. Use these patterns as starting points for typical hook use cases.
4
+
5
+ ## Pattern 1: Security Validation
6
+
7
+ Block dangerous file writes using prompt-based hooks:
8
+
9
+ ```json
10
+ {
11
+ "PreToolUse": [
12
+ {
13
+ "matcher": "Write|Edit",
14
+ "hooks": [
15
+ {
16
+ "type": "prompt",
17
+ "prompt": "File path: $TOOL_INPUT.file_path. Verify: 1) Not in /etc or system directories 2) Not .env or credentials 3) Path doesn't contain '..' traversal. Return 'approve' or 'deny'."
18
+ }
19
+ ]
20
+ }
21
+ ]
22
+ }
23
+ ```
24
+
25
+ **Use for:** Preventing writes to sensitive files or system directories.
26
+
27
+ ## Pattern 2: Test Enforcement
28
+
29
+ Ensure tests run before stopping:
30
+
31
+ ```json
32
+ {
33
+ "Stop": [
34
+ {
35
+ "matcher": "*",
36
+ "hooks": [
37
+ {
38
+ "type": "prompt",
39
+ "prompt": "Review transcript. If code was modified (Write/Edit tools used), verify tests were executed. If no tests were run, block with reason 'Tests must be run after code changes'."
40
+ }
41
+ ]
42
+ }
43
+ ]
44
+ }
45
+ ```
46
+
47
+ **Use for:** Enforcing quality standards and preventing incomplete work.
48
+
49
+ ## Pattern 3: Context Loading
50
+
51
+ Load project-specific context at session start:
52
+
53
+ ```json
54
+ {
55
+ "SessionStart": [
56
+ {
57
+ "matcher": "*",
58
+ "hooks": [
59
+ {
60
+ "type": "command",
61
+ "command": "bash ${CLAUDE_PLUGIN_ROOT}/scripts/load-context.sh"
62
+ }
63
+ ]
64
+ }
65
+ ]
66
+ }
67
+ ```
68
+
69
+ **Example script (load-context.sh):**
70
+
71
+ ```bash
72
+ #!/bin/bash
73
+ cd "$CLAUDE_PROJECT_DIR" || exit 1
74
+
75
+ # Detect project type
76
+ if [ -f "package.json" ]; then
77
+ echo "📦 Node.js project detected"
78
+ echo "export PROJECT_TYPE=nodejs" >> "$CLAUDE_ENV_FILE"
79
+ elif [ -f "Cargo.toml" ]; then
80
+ echo "🦀 Rust project detected"
81
+ echo "export PROJECT_TYPE=rust" >> "$CLAUDE_ENV_FILE"
82
+ fi
83
+ ```
84
+
85
+ **Use for:** Automatically detecting and configuring project-specific settings.
86
+
87
+ ## Pattern 4: Notification Logging
88
+
89
+ Log all notifications for audit or analysis:
90
+
91
+ ```json
92
+ {
93
+ "Notification": [
94
+ {
95
+ "matcher": "*",
96
+ "hooks": [
97
+ {
98
+ "type": "command",
99
+ "command": "bash ${CLAUDE_PLUGIN_ROOT}/scripts/log-notification.sh"
100
+ }
101
+ ]
102
+ }
103
+ ]
104
+ }
105
+ ```
106
+
107
+ **Use for:** Tracking user notifications or integration with external logging systems.
108
+
109
+ ## Pattern 5: MCP Tool Monitoring
110
+
111
+ Monitor and validate MCP tool usage:
112
+
113
+ ```json
114
+ {
115
+ "PreToolUse": [
116
+ {
117
+ "matcher": "mcp__.*__delete.*",
118
+ "hooks": [
119
+ {
120
+ "type": "prompt",
121
+ "prompt": "Deletion operation detected. Verify: Is this deletion intentional? Can it be undone? Are there backups? Return 'approve' only if safe."
122
+ }
123
+ ]
124
+ }
125
+ ]
126
+ }
127
+ ```
128
+
129
+ **Use for:** Protecting against destructive MCP operations.
130
+
131
+ ## Pattern 6: Build Verification
132
+
133
+ Ensure project builds after code changes:
134
+
135
+ ```json
136
+ {
137
+ "Stop": [
138
+ {
139
+ "matcher": "*",
140
+ "hooks": [
141
+ {
142
+ "type": "prompt",
143
+ "prompt": "Check if code was modified. If Write/Edit tools were used, verify the project was built (npm run build, cargo build, etc). If not built, block and request build."
144
+ }
145
+ ]
146
+ }
147
+ ]
148
+ }
149
+ ```
150
+
151
+ **Use for:** Catching build errors before committing or stopping work.
152
+
153
+ ## Pattern 7: Permission Confirmation
154
+
155
+ Ask user before dangerous operations:
156
+
157
+ ```json
158
+ {
159
+ "PreToolUse": [
160
+ {
161
+ "matcher": "Bash",
162
+ "hooks": [
163
+ {
164
+ "type": "prompt",
165
+ "prompt": "Command: $TOOL_INPUT.command. If command contains 'rm', 'delete', 'drop', or other destructive operations, return 'ask' to confirm with user. Otherwise 'approve'."
166
+ }
167
+ ]
168
+ }
169
+ ]
170
+ }
171
+ ```
172
+
173
+ **Use for:** User confirmation on potentially destructive commands.
174
+
175
+ ## Pattern 8: Code Quality Checks
176
+
177
+ Run linters or formatters on file edits:
178
+
179
+ ```json
180
+ {
181
+ "PostToolUse": [
182
+ {
183
+ "matcher": "Write|Edit",
184
+ "hooks": [
185
+ {
186
+ "type": "command",
187
+ "command": "bash ${CLAUDE_PLUGIN_ROOT}/scripts/check-quality.sh"
188
+ }
189
+ ]
190
+ }
191
+ ]
192
+ }
193
+ ```
194
+
195
+ **Example script (check-quality.sh):**
196
+
197
+ ```bash
198
+ #!/bin/bash
199
+ input=$(cat)
200
+ file_path=$(echo "$input" | jq -r '.tool_input.file_path')
201
+
202
+ # Run linter if applicable
203
+ if [[ "$file_path" == *.js ]] || [[ "$file_path" == *.ts ]]; then
204
+ npx eslint "$file_path" 2>&1 || true
205
+ fi
206
+ ```
207
+
208
+ **Use for:** Automatic code quality enforcement.
209
+
210
+ ## Pattern Combinations
211
+
212
+ Combine multiple patterns for comprehensive protection:
213
+
214
+ ```json
215
+ {
216
+ "PreToolUse": [
217
+ {
218
+ "matcher": "Write|Edit",
219
+ "hooks": [
220
+ {
221
+ "type": "prompt",
222
+ "prompt": "Validate file write safety"
223
+ }
224
+ ]
225
+ },
226
+ {
227
+ "matcher": "Bash",
228
+ "hooks": [
229
+ {
230
+ "type": "prompt",
231
+ "prompt": "Validate bash command safety"
232
+ }
233
+ ]
234
+ }
235
+ ],
236
+ "Stop": [
237
+ {
238
+ "matcher": "*",
239
+ "hooks": [
240
+ {
241
+ "type": "prompt",
242
+ "prompt": "Verify tests run and build succeeded"
243
+ }
244
+ ]
245
+ }
246
+ ],
247
+ "SessionStart": [
248
+ {
249
+ "matcher": "*",
250
+ "hooks": [
251
+ {
252
+ "type": "command",
253
+ "command": "bash ${CLAUDE_PLUGIN_ROOT}/scripts/load-context.sh"
254
+ }
255
+ ]
256
+ }
257
+ ]
258
+ }
259
+ ```
260
+
261
+ This provides multi-layered protection and automation.
262
+
263
+ ## Pattern 9: Temporarily Active Hooks
264
+
265
+ Create hooks that only run when explicitly enabled via flag files:
266
+
267
+ ```bash
268
+ #!/bin/bash
269
+ # Hook only active when flag file exists
270
+ FLAG_FILE="$CLAUDE_PROJECT_DIR/.enable-security-scan"
271
+
272
+ if [ ! -f "$FLAG_FILE" ]; then
273
+ # Quick exit when disabled
274
+ exit 0
275
+ fi
276
+
277
+ # Flag present, run validation
278
+ input=$(cat)
279
+ file_path=$(echo "$input" | jq -r '.tool_input.file_path')
280
+
281
+ # Run security scan
282
+ security-scanner "$file_path"
283
+ ```
284
+
285
+ **Activation:**
286
+
287
+ ```bash
288
+ # Enable the hook
289
+ touch .enable-security-scan
290
+
291
+ # Disable the hook
292
+ rm .enable-security-scan
293
+ ```
294
+
295
+ **Use for:**
296
+
297
+ - Temporary debugging hooks
298
+ - Feature flags for development
299
+ - Project-specific validation that's opt-in
300
+ - Performance-intensive checks only when needed
301
+
302
+ **Note:** Must restart Claude Code after creating/removing flag files for hooks to recognize changes.
303
+
304
+ ## Pattern 10: Configuration-Driven Hooks
305
+
306
+ Use JSON configuration to control hook behavior:
307
+
308
+ ```bash
309
+ #!/bin/bash
310
+ CONFIG_FILE="$CLAUDE_PROJECT_DIR/.claude/my-plugin.local.json"
311
+
312
+ # Read configuration
313
+ if [ -f "$CONFIG_FILE" ]; then
314
+ strict_mode=$(jq -r '.strictMode // false' "$CONFIG_FILE")
315
+ max_file_size=$(jq -r '.maxFileSize // 1000000' "$CONFIG_FILE")
316
+ else
317
+ # Defaults
318
+ strict_mode=false
319
+ max_file_size=1000000
320
+ fi
321
+
322
+ # Skip if not in strict mode
323
+ if [ "$strict_mode" != "true" ]; then
324
+ exit 0
325
+ fi
326
+
327
+ # Apply configured limits
328
+ input=$(cat)
329
+ file_size=$(echo "$input" | jq -r '.tool_input.content | length')
330
+
331
+ if [ "$file_size" -gt "$max_file_size" ]; then
332
+ echo '{"decision": "deny", "reason": "File exceeds configured size limit"}' >&2
333
+ exit 2
334
+ fi
335
+ ```
336
+
337
+ **Configuration file (.claude/my-plugin.local.json):**
338
+
339
+ ```json
340
+ {
341
+ "strictMode": true,
342
+ "maxFileSize": 500000,
343
+ "allowedPaths": ["/tmp", "/home/user/projects"]
344
+ }
345
+ ```
346
+
347
+ **Use for:**
348
+
349
+ - User-configurable hook behavior
350
+ - Per-project settings
351
+ - Team-specific rules
352
+ - Dynamic validation criteria
353
+
354
+ ## Pattern 11: TeammateIdle Notification
355
+
356
+ Send notifications when agent team teammates go idle:
357
+
358
+ ```json
359
+ {
360
+ "TeammateIdle": [
361
+ {
362
+ "matcher": "*",
363
+ "hooks": [
364
+ {
365
+ "type": "command",
366
+ "command": "bash ${CLAUDE_PLUGIN_ROOT}/scripts/notify-idle.sh"
367
+ }
368
+ ]
369
+ }
370
+ ]
371
+ }
372
+ ```
373
+
374
+ **Example script (notify-idle.sh):**
375
+
376
+ ```bash
377
+ #!/bin/bash
378
+ input=$(cat)
379
+ teammate=$(echo "$input" | jq -r '.teammate_name')
380
+ team=$(echo "$input" | jq -r '.team_name')
381
+
382
+ # Log or notify
383
+ echo "Teammate $teammate in team $team went idle" >> /tmp/team-log.txt
384
+
385
+ # Exit 0 to allow idle, exit 2 to keep teammate working
386
+ exit 0
387
+ ```
388
+
389
+ **Use for:** Monitoring team progress, logging teammate activity, enforcing work standards.
390
+
391
+ ## Pattern 12: Task Completion Verification
392
+
393
+ Verify task quality before accepting completion:
394
+
395
+ ```json
396
+ {
397
+ "TaskCompleted": [
398
+ {
399
+ "matcher": "*",
400
+ "hooks": [
401
+ {
402
+ "type": "command",
403
+ "command": "bash ${CLAUDE_PLUGIN_ROOT}/scripts/verify-task.sh"
404
+ }
405
+ ]
406
+ }
407
+ ]
408
+ }
409
+ ```
410
+
411
+ **Example script (verify-task.sh):**
412
+
413
+ ```bash
414
+ #!/bin/bash
415
+ input=$(cat)
416
+ task_subject=$(echo "$input" | jq -r '.task_subject')
417
+
418
+ # Check if tests were mentioned in the task
419
+ if echo "$task_subject" | grep -qi "implement\|add\|create"; then
420
+ # Verify tests exist for implementation tasks
421
+ if [ ! -f "/tmp/tests-ran-$$" ]; then
422
+ echo "Implementation task completed without running tests" >&2
423
+ exit 2 # Block completion
424
+ fi
425
+ fi
426
+
427
+ exit 0
428
+ ```
429
+
430
+ **Use for:** Enforcing quality gates, preventing premature task completion, team workflow standards.
@@ -0,0 +1,181 @@
1
+ # Hook Development Utility Scripts
2
+
3
+ These scripts help validate, test, and lint hook implementations before deployment.
4
+
5
+ ## validate-hook-schema.sh
6
+
7
+ Validates `hooks.json` configuration files for correct structure and common issues.
8
+
9
+ **Usage:**
10
+
11
+ ```bash
12
+ ./validate-hook-schema.sh path/to/hooks.json
13
+ ```
14
+
15
+ **Checks:**
16
+
17
+ - Valid JSON syntax
18
+ - Required fields present
19
+ - Valid hook event names
20
+ - Proper hook types (command/prompt)
21
+ - Timeout values in valid ranges
22
+ - Hardcoded path detection
23
+ - Prompt hook event compatibility
24
+
25
+ **Example:**
26
+
27
+ ```bash
28
+ cd my-plugin
29
+ ./validate-hook-schema.sh hooks/hooks.json
30
+ ```
31
+
32
+ ## test-hook.sh
33
+
34
+ Tests individual hook scripts with sample input before deploying to Claude Code.
35
+
36
+ **Usage:**
37
+
38
+ ```bash
39
+ ./test-hook.sh [options] <hook-script> <test-input.json>
40
+ ```
41
+
42
+ **Options:**
43
+
44
+ - `-v, --verbose` - Show detailed execution information
45
+ - `-t, --timeout N` - Set timeout in seconds (default: 60)
46
+ - `--create-sample <event-type>` - Generate sample test input
47
+
48
+ **Example:**
49
+
50
+ ```bash
51
+ # Create sample test input
52
+ ./test-hook.sh --create-sample PreToolUse > test-input.json
53
+
54
+ # Test a hook script
55
+ ./test-hook.sh my-hook.sh test-input.json
56
+
57
+ # Test with verbose output and custom timeout
58
+ ./test-hook.sh -v -t 30 my-hook.sh test-input.json
59
+ ```
60
+
61
+ **Features:**
62
+
63
+ - Sets up proper environment variables (CLAUDE_PROJECT_DIR, CLAUDE_PLUGIN_ROOT)
64
+ - Measures execution time
65
+ - Validates output JSON
66
+ - Shows exit codes and their meanings
67
+ - Captures environment file output
68
+
69
+ ## hook-linter.sh
70
+
71
+ Checks hook scripts for common issues and best practices violations.
72
+
73
+ **Usage:**
74
+
75
+ ```bash
76
+ ./hook-linter.sh <hook-script.sh> [hook-script2.sh ...]
77
+ ```
78
+
79
+ **Checks:**
80
+
81
+ - Shebang presence
82
+ - `set -euo pipefail` usage
83
+ - Stdin input reading
84
+ - Proper error handling
85
+ - Variable quoting (injection prevention)
86
+ - Exit code usage
87
+ - Hardcoded paths
88
+ - Long-running code detection
89
+ - Error output to stderr
90
+ - Input validation
91
+
92
+ **Example:**
93
+
94
+ ```bash
95
+ # Lint single script
96
+ ./hook-linter.sh ../examples/validate-write.sh
97
+
98
+ # Lint multiple scripts
99
+ ./hook-linter.sh ../examples/*.sh
100
+ ```
101
+
102
+ ## Typical Workflow
103
+
104
+ 1. **Write your hook script**
105
+
106
+ ```bash
107
+ vim my-plugin/scripts/my-hook.sh
108
+ ```
109
+
110
+ 2. **Lint the script**
111
+
112
+ ```bash
113
+ ./hook-linter.sh my-plugin/scripts/my-hook.sh
114
+ ```
115
+
116
+ 3. **Create test input**
117
+
118
+ ```bash
119
+ ./test-hook.sh --create-sample PreToolUse > test-input.json
120
+ # Edit test-input.json as needed
121
+ ```
122
+
123
+ 4. **Test the hook**
124
+
125
+ ```bash
126
+ ./test-hook.sh -v my-plugin/scripts/my-hook.sh test-input.json
127
+ ```
128
+
129
+ 5. **Add to hooks.json**
130
+
131
+ ```bash
132
+ # Edit my-plugin/hooks/hooks.json
133
+ ```
134
+
135
+ 6. **Validate configuration**
136
+
137
+ ```bash
138
+ ./validate-hook-schema.sh my-plugin/hooks/hooks.json
139
+ ```
140
+
141
+ 7. **Test in Claude Code**
142
+ ```bash
143
+ claude --debug
144
+ ```
145
+
146
+ ## Tips
147
+
148
+ - Always test hooks before deploying to avoid breaking user workflows
149
+ - Use verbose mode (`-v`) to debug hook behavior
150
+ - Check the linter output for security and best practice issues
151
+ - Validate hooks.json after any changes
152
+ - Create different test inputs for various scenarios (safe operations, dangerous operations, edge cases)
153
+
154
+ ## Common Issues
155
+
156
+ ### Hook doesn't execute
157
+
158
+ Check:
159
+
160
+ - Script has shebang (`#!/bin/bash`)
161
+ - Script is executable (`chmod +x`)
162
+ - Path in hooks.json is correct (use `${CLAUDE_PLUGIN_ROOT}`)
163
+
164
+ ### Hook times out
165
+
166
+ - Reduce timeout in hooks.json
167
+ - Optimize hook script performance
168
+ - Remove long-running operations
169
+
170
+ ### Hook fails silently
171
+
172
+ - Check exit codes (should be 0 or 2)
173
+ - Ensure errors go to stderr (`>&2`)
174
+ - Validate JSON output structure
175
+
176
+ ### Injection vulnerabilities
177
+
178
+ - Always quote variables: `"$variable"`
179
+ - Use `set -euo pipefail`
180
+ - Validate all input fields
181
+ - Run the linter to catch issues