@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.
- package/README.md +96 -21
- package/dist/index.d.ts +5 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -2
- package/dist/index.js.map +1 -1
- package/dist/install.d.ts +171 -1
- package/dist/install.d.ts.map +1 -1
- package/dist/install.js +402 -49
- package/dist/install.js.map +1 -1
- package/dist/internal/codex.d.ts.map +1 -1
- package/dist/internal/codex.js +7 -1
- package/dist/internal/codex.js.map +1 -1
- package/dist/internal/platform.d.ts +8 -0
- package/dist/internal/platform.d.ts.map +1 -1
- package/dist/internal/platform.js +46 -2
- package/dist/internal/platform.js.map +1 -1
- package/dist/provision.d.ts +30 -0
- package/dist/provision.d.ts.map +1 -0
- package/dist/provision.js +202 -0
- package/dist/provision.js.map +1 -0
- package/dist/validate/index.d.ts +44 -0
- package/dist/validate/index.d.ts.map +1 -1
- package/dist/validate/index.js +157 -0
- package/dist/validate/index.js.map +1 -1
- package/extensions/cmux/.agents/plugin.json +37 -0
- package/extensions/cmux/skills/cmux/SKILL.md +82 -0
- package/extensions/cmux/skills/cmux/agents/openai.yaml +4 -0
- package/extensions/cmux/skills/cmux/references/handles-and-identify.md +35 -0
- package/extensions/cmux/skills/cmux/references/panes-surfaces.md +37 -0
- package/extensions/cmux/skills/cmux/references/trigger-flash-and-health.md +23 -0
- package/extensions/cmux/skills/cmux/references/windows-workspaces.md +31 -0
- package/extensions/cmux/skills/cmux-vm-monitor/SKILL.md +122 -0
- package/extensions/cmux/skills/cmux-vm-monitor/agents/openai.yaml +4 -0
- package/extensions/cmux/skills/cmux-vm-monitor/references/cmux-commands.md +66 -0
- package/extensions/cmux/skills/cmux-vm-monitor/scripts/codex_vm_monitor.sh +45 -0
- package/extensions/cmux/skills/cmux-workspace/SKILL.md +93 -0
- package/extensions/dev-state/.agents/plugin.json +35 -0
- package/extensions/dev-state/skills/dev-state-plan-graduation/SKILL.md +194 -0
- package/extensions/dev-state/skills/dev-state-plan-graduation/agents/openai.yaml +4 -0
- package/extensions/dev-state/skills/dev-state-plan-graduation/references/reference.md +130 -0
- package/extensions/devops/.agents/plugin.json +36 -0
- package/extensions/devops/skills/azure-devops-cli/SKILL.md +431 -0
- package/extensions/devops/skills/azure-devops-cli/agents/openai.yaml +4 -0
- package/extensions/devops/skills/ci-pipeline-strategy/SKILL.md +217 -0
- package/extensions/devops/skills/ci-pipeline-strategy/agents/openai.yaml +4 -0
- package/extensions/enact-context/.agents/plugin.json +40 -0
- package/extensions/enact-context/.mcp.json +8 -0
- package/extensions/enact-context/README.md +25 -0
- package/extensions/enact-context/assets/icon.png +0 -0
- package/extensions/enact-context/assets/logo.png +0 -0
- package/extensions/enact-context/hooks/hooks.json +115 -0
- package/extensions/enact-context/skills/enact-context/SKILL.md +149 -0
- package/extensions/enact-context/skills/enact-context/scripts/install.sh +69 -0
- package/extensions/enact-factory/.agents/plugin.json +42 -0
- package/extensions/enact-factory/.mcp.json +8 -0
- package/extensions/enact-factory/assets/icon.png +0 -0
- package/extensions/enact-factory/assets/logo.png +0 -0
- package/extensions/enact-factory/hooks/user-prompt-submit.mjs +67 -0
- package/extensions/enact-factory/skills/testing-strategy/SKILL.md +167 -0
- package/extensions/enact-factory/skills/workitem-triage/SKILL.md +22 -0
- package/extensions/enact-operator/.agents/plugin.json +57 -0
- package/extensions/enact-operator/.app.json +3 -0
- package/extensions/enact-operator/.mcp.json +10 -0
- package/extensions/enact-operator/_taxonomy.md +86 -0
- package/extensions/enact-operator/agents/README.md +5 -0
- package/extensions/enact-operator/agents/architect.toml +25 -0
- package/extensions/enact-operator/agents/code-reviewer.toml +24 -0
- package/extensions/enact-operator/agents/critic.toml +30 -0
- package/extensions/enact-operator/agents/executor.toml +24 -0
- package/extensions/enact-operator/agents/explore.toml +23 -0
- package/extensions/enact-operator/agents/planner.toml +24 -0
- package/extensions/enact-operator/agents/verifier.toml +24 -0
- package/extensions/enact-operator/assets/icon.png +0 -0
- package/extensions/enact-operator/assets/logo.png +0 -0
- package/extensions/enact-operator/commands/doctor.md +39 -0
- package/extensions/enact-operator/commands/setup.md +51 -0
- package/extensions/enact-operator/hooks/hooks.json +146 -0
- package/extensions/enact-operator/skills/_variants.md +44 -0
- package/extensions/enact-operator/skills/ai-slop-cleaner/SKILL.md +50 -0
- package/extensions/enact-operator/skills/analyze/SKILL.md +91 -0
- package/extensions/enact-operator/skills/ask/SKILL.md +47 -0
- package/extensions/enact-operator/skills/autopilot/SKILL.md +170 -0
- package/extensions/enact-operator/skills/autoresearch-goal/SKILL.md +79 -0
- package/extensions/enact-operator/skills/cancel/SKILL.md +99 -0
- package/extensions/enact-operator/skills/configure-notifications/SKILL.md +77 -0
- package/extensions/enact-operator/skills/deep-interview/SKILL.md +80 -0
- package/extensions/enact-operator/skills/doctor/SKILL.md +48 -0
- package/extensions/enact-operator/skills/hud/SKILL.md +49 -0
- package/extensions/enact-operator/skills/hyperplan/SKILL.md +47 -0
- package/extensions/enact-operator/skills/plan/SKILL.md +78 -0
- package/extensions/enact-operator/skills/ralph/SKILL.md +201 -0
- package/extensions/enact-operator/skills/ralph/gemini.md +18 -0
- package/extensions/enact-operator/skills/ralplan/SKILL.md +151 -0
- package/extensions/enact-operator/skills/remove-deadcode/SKILL.md +45 -0
- package/extensions/enact-operator/skills/research/SKILL.md +74 -0
- package/extensions/enact-operator/skills/review/SKILL.md +58 -0
- package/extensions/enact-operator/skills/security-research/SKILL.md +54 -0
- package/extensions/enact-operator/skills/setup/SKILL.md +91 -0
- package/extensions/enact-operator/skills/setup/scripts/install.sh +50 -0
- package/extensions/enact-operator/skills/skill/SKILL.md +82 -0
- package/extensions/enact-operator/skills/tdd/SKILL.md +59 -0
- package/extensions/enact-operator/skills/team/SKILL.md +199 -0
- package/extensions/enact-operator/skills/trace/SKILL.md +41 -0
- package/extensions/enact-operator/skills/ultragoal/SKILL.md +99 -0
- package/extensions/enact-operator/skills/ultraqa/SKILL.md +113 -0
- package/extensions/enact-operator/skills/ultrawork/SKILL.md +145 -0
- package/extensions/enact-operator/skills/ultrawork/planner.md +28 -0
- package/extensions/enact-operator/skills/wiki/SKILL.md +41 -0
- package/extensions/enact-operator/skills/work-with-workitem/SKILL.md +51 -0
- package/extensions/enact-wiki/.agents/plugin.json +42 -0
- package/extensions/enact-wiki/.mcp.json +15 -0
- package/extensions/enact-wiki/README.md +44 -0
- package/extensions/enact-wiki/assets/icon.png +0 -0
- package/extensions/enact-wiki/assets/logo.png +0 -0
- package/extensions/enact-wiki/skills/document-parser/SKILL.md +17 -0
- package/extensions/enact-wiki/skills/document-parser/scripts/parse.sh +60 -0
- package/extensions/enact-wiki/skills/document-parser/skill.json +9 -0
- package/extensions/enact-wiki/skills/enact-wiki/SKILL.md +30 -0
- package/extensions/enact-wiki/skills/enact-wiki/references/ingest.md +62 -0
- package/extensions/enact-wiki/skills/enact-wiki/references/manage.md +34 -0
- package/extensions/enact-wiki/skills/enact-wiki/references/query.md +59 -0
- package/extensions/enact-wiki/skills/search-lab/SKILL.md +57 -0
- package/extensions/enact-wiki/skills/search-lab/scripts/analyze.ts +23 -0
- package/{plugins/net-revenue-management/.codex-plugin → extensions/net-revenue-management/.agents}/plugin.json +10 -6
- package/extensions/plugin-dev/.agents/plugin.json +42 -0
- package/extensions/plugin-dev/.mcp.json +3 -0
- package/extensions/plugin-dev/agents/agent-creator.md +199 -0
- package/extensions/plugin-dev/agents/plugin-validator.md +91 -0
- package/extensions/plugin-dev/agents/skill-reviewer.md +212 -0
- package/extensions/plugin-dev/commands/_archive/create-marketplace.md +427 -0
- package/extensions/plugin-dev/commands/_archive/plugin-dev-guide.md +12 -0
- package/extensions/plugin-dev/commands/create-plugin.md +498 -0
- package/extensions/plugin-dev/commands/start.md +81 -0
- package/extensions/plugin-dev/hooks/hooks.json +3 -0
- package/extensions/plugin-dev/skills/agent-development/SKILL.md +641 -0
- package/extensions/plugin-dev/skills/agent-development/examples/agent-creation-prompt.md +250 -0
- package/extensions/plugin-dev/skills/agent-development/examples/complete-agent-examples.md +461 -0
- package/extensions/plugin-dev/skills/agent-development/references/advanced-agent-fields.md +246 -0
- package/extensions/plugin-dev/skills/agent-development/references/agent-creation-system-prompt.md +216 -0
- package/extensions/plugin-dev/skills/agent-development/references/permission-modes-rules.md +226 -0
- package/extensions/plugin-dev/skills/agent-development/references/system-prompt-design.md +464 -0
- package/extensions/plugin-dev/skills/agent-development/references/triggering-examples.md +474 -0
- package/extensions/plugin-dev/skills/agent-development/scripts/create-agent-skeleton.sh +176 -0
- package/extensions/plugin-dev/skills/agent-development/scripts/test-agent-trigger.sh +227 -0
- package/extensions/plugin-dev/skills/agent-development/scripts/validate-agent.sh +227 -0
- package/extensions/plugin-dev/skills/command-development/SKILL.md +763 -0
- package/extensions/plugin-dev/skills/command-development/examples/plugin-commands.md +612 -0
- package/extensions/plugin-dev/skills/command-development/examples/simple-commands.md +527 -0
- package/extensions/plugin-dev/skills/command-development/references/advanced-workflows.md +762 -0
- package/extensions/plugin-dev/skills/command-development/references/documentation-patterns.md +769 -0
- package/extensions/plugin-dev/skills/command-development/references/frontmatter-reference.md +508 -0
- package/extensions/plugin-dev/skills/command-development/references/interactive-commands.md +966 -0
- package/extensions/plugin-dev/skills/command-development/references/marketplace-considerations.md +943 -0
- package/extensions/plugin-dev/skills/command-development/references/plugin-features-reference.md +637 -0
- package/extensions/plugin-dev/skills/command-development/references/plugin-integration.md +191 -0
- package/extensions/plugin-dev/skills/command-development/references/skill-tool.md +447 -0
- package/extensions/plugin-dev/skills/command-development/references/testing-strategies.md +723 -0
- package/extensions/plugin-dev/skills/command-development/scripts/check-frontmatter.sh +234 -0
- package/extensions/plugin-dev/skills/command-development/scripts/validate-command.sh +160 -0
- package/extensions/plugin-dev/skills/hook-development/SKILL.md +861 -0
- package/extensions/plugin-dev/skills/hook-development/examples/load-context.sh +55 -0
- package/extensions/plugin-dev/skills/hook-development/examples/validate-bash.sh +57 -0
- package/extensions/plugin-dev/skills/hook-development/examples/validate-write.sh +48 -0
- package/extensions/plugin-dev/skills/hook-development/references/advanced.md +871 -0
- package/extensions/plugin-dev/skills/hook-development/references/hook-input-schemas.md +145 -0
- package/extensions/plugin-dev/skills/hook-development/references/migration.md +392 -0
- package/extensions/plugin-dev/skills/hook-development/references/patterns.md +430 -0
- package/extensions/plugin-dev/skills/hook-development/scripts/README.md +181 -0
- package/extensions/plugin-dev/skills/hook-development/scripts/hook-linter.sh +153 -0
- package/extensions/plugin-dev/skills/hook-development/scripts/test-hook.sh +276 -0
- package/extensions/plugin-dev/skills/hook-development/scripts/validate-hook-schema.sh +159 -0
- package/extensions/plugin-dev/skills/mcp-integration/SKILL.md +775 -0
- package/extensions/plugin-dev/skills/mcp-integration/examples/http-server.json +20 -0
- package/extensions/plugin-dev/skills/mcp-integration/examples/sse-server.json +19 -0
- package/extensions/plugin-dev/skills/mcp-integration/examples/stdio-server.json +38 -0
- package/extensions/plugin-dev/skills/mcp-integration/examples/ws-server.json +26 -0
- package/extensions/plugin-dev/skills/mcp-integration/references/authentication.md +601 -0
- package/extensions/plugin-dev/skills/mcp-integration/references/server-discovery.md +190 -0
- package/extensions/plugin-dev/skills/mcp-integration/references/server-types.md +572 -0
- package/extensions/plugin-dev/skills/mcp-integration/references/tool-usage.md +623 -0
- package/extensions/plugin-dev/skills/plugin-dev-guide/SKILL.md +222 -0
- package/extensions/plugin-dev/skills/plugin-structure/SKILL.md +705 -0
- package/extensions/plugin-dev/skills/plugin-structure/examples/advanced-plugin.md +774 -0
- package/extensions/plugin-dev/skills/plugin-structure/examples/minimal-plugin.md +83 -0
- package/extensions/plugin-dev/skills/plugin-structure/examples/standard-plugin.md +611 -0
- package/extensions/plugin-dev/skills/plugin-structure/references/advanced-topics.md +289 -0
- package/extensions/plugin-dev/skills/plugin-structure/references/component-patterns.md +592 -0
- package/extensions/plugin-dev/skills/plugin-structure/references/github-actions.md +233 -0
- package/extensions/plugin-dev/skills/plugin-structure/references/headless-ci-mode.md +193 -0
- package/extensions/plugin-dev/skills/plugin-structure/references/manifest-reference.md +625 -0
- package/extensions/plugin-dev/skills/plugin-structure/references/output-styles.md +116 -0
- package/extensions/plugin-dev/skills/skill-development/SKILL.md +564 -0
- package/extensions/plugin-dev/skills/skill-development/examples/complete-skill.md +465 -0
- package/extensions/plugin-dev/skills/skill-development/examples/frontmatter-templates.md +167 -0
- package/extensions/plugin-dev/skills/skill-development/examples/minimal-skill.md +111 -0
- package/extensions/plugin-dev/skills/skill-development/references/advanced-frontmatter.md +225 -0
- package/extensions/plugin-dev/skills/skill-development/references/commands-vs-skills.md +39 -0
- package/extensions/plugin-dev/skills/skill-development/references/skill-creation-workflow.md +379 -0
- package/extensions/plugin-dev/skills/skill-development/references/skill-creator-original.md +210 -0
- package/package.json +8 -11
- package/scripts/enact-extensions.mjs +823 -21
- package/scripts/hooks/session-start-drift-check.mjs +58 -0
- package/scripts/lib/build-index.mjs +50 -0
- package/scripts/lib/bundle-hash.mjs +137 -0
- package/scripts/lib/hooks.mjs +741 -0
- package/scripts/lib/ledger.mjs +163 -0
- package/scripts/lib/list-bundles.mjs +70 -0
- package/scripts/lib/outdated.mjs +144 -0
- package/scripts/lib/provision-mcp.mjs +16 -0
- package/scripts/lib/resolve-bundle.mjs +121 -0
- package/scripts/lib/run-install.mjs +402 -38
- package/scripts/lib/run-prune.mjs +73 -0
- package/scripts/lib/run-sync.mjs +9 -1
- package/scripts/lib/run-uninstall.mjs +244 -0
- package/scripts/lib/run-update.mjs +152 -0
- package/scripts/lib/run-validate.mjs +21 -18
- package/scripts/lib/serve.mjs +472 -0
- package/scripts/postinstall.mjs +63 -0
- package/scripts/setup-enact-context.sh +2 -2
- package/scripts/version-bump.sh +463 -0
- package/spec/codex.json +1 -11
- package/spec/index.json +59 -0
- package/web/assets/README.md +111 -0
- package/web/assets/logo-full.png +0 -0
- package/web/assets/logo-slim.png +0 -0
- package/web/assets/tokens/base.css +45 -0
- package/web/assets/tokens/colors.css +248 -0
- package/web/assets/tokens/effects.css +24 -0
- package/web/assets/tokens/fonts.css +8 -0
- package/web/assets/tokens/index.css +18 -0
- package/web/assets/tokens/spacing.css +50 -0
- package/web/index.html +1188 -0
- package/.agents/plugins/marketplace.json +0 -20
- package/catalog/enact-context.json +0 -9
- package/catalog/enact-factory.json +0 -7
- package/catalog/enact-operator.json +0 -7
- package/catalog/enact-wiki.json +0 -7
- package/catalog/net-revenue-management.json +0 -8
- package/scripts/rename-supervisor-to-operator.pl +0 -66
- package/scripts/sync-manifests.mjs +0 -23
- package/scripts/validate-catalog.mjs +0 -37
- package/scripts/validate-plugin.mjs +0 -10
- /package/{plugins → extensions}/net-revenue-management/.mcp.json +0 -0
- /package/{plugins → extensions}/net-revenue-management/skills/net-revenue-risks/SKILL.md +0 -0
- /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
|