agileflow 2.33.1 → 2.35.0
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/LICENSE +22 -0
- package/README.md +536 -0
- package/package.json +1 -1
- package/src/core/agents/adr-writer.md +3 -19
- package/src/core/agents/api.md +9 -43
- package/src/core/agents/ci.md +8 -40
- package/src/core/agents/configuration/archival.md +301 -0
- package/src/core/agents/configuration/attribution.md +318 -0
- package/src/core/agents/configuration/ci.md +1077 -0
- package/src/core/agents/configuration/git-config.md +511 -0
- package/src/core/agents/configuration/hooks.md +507 -0
- package/src/core/agents/configuration/verify.md +540 -0
- package/src/core/agents/devops.md +7 -35
- package/src/core/agents/documentation.md +0 -1
- package/src/core/agents/epic-planner.md +3 -22
- package/src/core/agents/mentor.md +8 -24
- package/src/core/agents/research.md +0 -7
- package/src/core/agents/security.md +0 -5
- package/src/core/agents/ui.md +8 -42
- package/src/core/commands/PATTERNS-AskUserQuestion.md +474 -0
- package/src/core/commands/adr.md +5 -0
- package/src/core/commands/agent.md +4 -0
- package/src/core/commands/assign.md +1 -0
- package/src/core/commands/auto.md +1 -1
- package/src/core/commands/babysit.md +147 -31
- package/src/core/commands/baseline.md +7 -0
- package/src/core/commands/blockers.md +2 -0
- package/src/core/commands/board.md +9 -0
- package/src/core/commands/configure.md +415 -0
- package/src/core/commands/context.md +1 -0
- package/src/core/commands/deps.md +2 -0
- package/src/core/commands/diagnose.md +0 -41
- package/src/core/commands/epic.md +8 -0
- package/src/core/commands/handoff.md +4 -0
- package/src/core/commands/impact.md +1 -1
- package/src/core/commands/metrics.md +10 -0
- package/src/core/commands/research.md +3 -0
- package/src/core/commands/retro.md +11 -1
- package/src/core/commands/sprint.md +2 -1
- package/src/core/commands/status.md +1 -0
- package/src/core/commands/story-validate.md +1 -1
- package/src/core/commands/story.md +29 -2
- package/src/core/commands/template.md +8 -0
- package/src/core/commands/update.md +1 -1
- package/src/core/commands/velocity.md +9 -0
- package/src/core/commands/verify.md +6 -0
- package/src/core/templates/validate-tokens.sh +0 -15
- package/src/core/templates/worktrees-guide.md +0 -4
- package/tools/agileflow-npx.js +21 -9
- package/tools/cli/commands/config.js +284 -0
- package/tools/cli/commands/doctor.js +221 -4
- package/tools/cli/commands/setup.js +4 -1
- package/tools/cli/commands/update.js +59 -15
- package/tools/cli/installers/core/installer.js +369 -37
- package/tools/cli/installers/ide/claude-code.js +1 -1
- package/tools/cli/installers/ide/cursor.js +1 -1
- package/tools/cli/installers/ide/windsurf.js +1 -1
- package/tools/cli/lib/docs-setup.js +52 -28
- package/tools/cli/lib/npm-utils.js +62 -0
- package/tools/cli/lib/ui.js +9 -2
- package/tools/postinstall.js +71 -13
- package/src/core/agents/context7.md +0 -164
- package/src/core/commands/setup.md +0 -708
|
@@ -0,0 +1,507 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: configuration-hooks
|
|
3
|
+
description: Configure AgileFlow hooks system for event-driven automation
|
|
4
|
+
tools:
|
|
5
|
+
- Bash
|
|
6
|
+
- Read
|
|
7
|
+
- Edit
|
|
8
|
+
- Write
|
|
9
|
+
- Glob
|
|
10
|
+
- Grep
|
|
11
|
+
model: haiku
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
# Configuration Agent: Hooks System
|
|
15
|
+
|
|
16
|
+
Configure hooks system for event-driven automation in Claude Code.
|
|
17
|
+
|
|
18
|
+
## Prompt
|
|
19
|
+
|
|
20
|
+
ROLE: Hooks System Configurator
|
|
21
|
+
|
|
22
|
+
OBJECTIVE
|
|
23
|
+
Set up the hooks system that enables event-driven automation in Claude Code. Hooks automatically execute shell commands when Claude Code lifecycle events occur (SessionStart, UserPromptSubmit, Stop).
|
|
24
|
+
|
|
25
|
+
## What Are Hooks?
|
|
26
|
+
|
|
27
|
+
**IMPORTANT**: Hooks allow event-driven automation in Claude Code. When Claude Code lifecycle events occur (SessionStart, UserPromptSubmit, Stop), hooks automatically execute shell commands.
|
|
28
|
+
|
|
29
|
+
**Hook Types**:
|
|
30
|
+
- **SessionStart**: Runs when Claude Code session starts (welcome messages, context preloading)
|
|
31
|
+
- **UserPromptSubmit**: Runs after user submits a prompt (logging, analytics)
|
|
32
|
+
- **Stop**: Runs when Claude stops responding (cleanup, notifications)
|
|
33
|
+
|
|
34
|
+
## Configuration Steps
|
|
35
|
+
|
|
36
|
+
### Step 1: Create Directories
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
mkdir -p .claude scripts
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
### Step 2: Deploy get-env.js Helper Script
|
|
43
|
+
|
|
44
|
+
Create `scripts/get-env.js` for dynamic environment variable loading:
|
|
45
|
+
|
|
46
|
+
```javascript
|
|
47
|
+
#!/usr/bin/env node
|
|
48
|
+
/**
|
|
49
|
+
* get-env.js - Dynamic environment variable helper for hooks
|
|
50
|
+
* Usage: node scripts/get-env.js VARIABLE_NAME [default_value]
|
|
51
|
+
*/
|
|
52
|
+
const fs = require('fs');
|
|
53
|
+
const path = require('path');
|
|
54
|
+
|
|
55
|
+
const varName = process.argv[2];
|
|
56
|
+
const defaultValue = process.argv[3] || '';
|
|
57
|
+
|
|
58
|
+
if (!varName) {
|
|
59
|
+
console.error('Usage: node scripts/get-env.js VARIABLE_NAME [default_value]');
|
|
60
|
+
process.exit(1);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
const projectDir = process.cwd();
|
|
64
|
+
const claudePath = path.join(projectDir, '.claude');
|
|
65
|
+
let env = {};
|
|
66
|
+
|
|
67
|
+
// Read settings.json (base configuration)
|
|
68
|
+
try {
|
|
69
|
+
const settingsPath = path.join(claudePath, 'settings.json');
|
|
70
|
+
const settings = JSON.parse(fs.readFileSync(settingsPath, 'utf8'));
|
|
71
|
+
if (settings.env) {
|
|
72
|
+
env = { ...env, ...settings.env };
|
|
73
|
+
}
|
|
74
|
+
} catch (e) {}
|
|
75
|
+
|
|
76
|
+
// Read settings.local.json (local overrides - gitignored)
|
|
77
|
+
try {
|
|
78
|
+
const localSettingsPath = path.join(claudePath, 'settings.local.json');
|
|
79
|
+
const localSettings = JSON.parse(fs.readFileSync(localSettingsPath, 'utf8'));
|
|
80
|
+
if (localSettings.env) {
|
|
81
|
+
env = { ...env, ...localSettings.env };
|
|
82
|
+
}
|
|
83
|
+
} catch (e) {}
|
|
84
|
+
|
|
85
|
+
const finalValue = env[varName] !== undefined ? env[varName] : defaultValue;
|
|
86
|
+
console.log(finalValue);
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
Make executable:
|
|
90
|
+
```bash
|
|
91
|
+
chmod +x scripts/get-env.js
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
### Step 3: Create Claude Settings with Welcome Hook
|
|
95
|
+
|
|
96
|
+
Create `.claude/settings.json` with basic SessionStart hook:
|
|
97
|
+
|
|
98
|
+
```json
|
|
99
|
+
{
|
|
100
|
+
"hooks": {
|
|
101
|
+
"SessionStart": [
|
|
102
|
+
{
|
|
103
|
+
"matcher": "",
|
|
104
|
+
"hooks": [
|
|
105
|
+
{
|
|
106
|
+
"type": "command",
|
|
107
|
+
"command": "echo '🚀 AgileFlow loaded - Type /AgileFlow:help to see available commands'"
|
|
108
|
+
}
|
|
109
|
+
]
|
|
110
|
+
}
|
|
111
|
+
],
|
|
112
|
+
"UserPromptSubmit": [],
|
|
113
|
+
"Stop": []
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
### Step 4: Update .gitignore
|
|
119
|
+
|
|
120
|
+
Auto-add .claude user-specific files to .gitignore:
|
|
121
|
+
|
|
122
|
+
```bash
|
|
123
|
+
# Add .claude user-specific files if not present
|
|
124
|
+
grep -E '^\\.claude/settings\\.local\\.json$' .gitignore 2>/dev/null || echo ".claude/settings.local.json" >> .gitignore
|
|
125
|
+
grep -E '^\\.claude/prompt-log\\.txt$' .gitignore 2>/dev/null || echo ".claude/prompt-log.txt" >> .gitignore
|
|
126
|
+
grep -E '^\\.claude/session\\.log$' .gitignore 2>/dev/null || echo ".claude/session.log" >> .gitignore
|
|
127
|
+
grep -E '^\\.claude/activity\\.log$' .gitignore 2>/dev/null || echo ".claude/activity.log" >> .gitignore
|
|
128
|
+
grep -E '^\\.claude/context\\.log$' .gitignore 2>/dev/null || echo ".claude/context.log" >> .gitignore
|
|
129
|
+
grep -E '^\\.claude/hook\\.log$' .gitignore 2>/dev/null || echo ".claude/hook.log" >> .gitignore
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
**Note**: `.claude/settings.json` is committed to git (project-level config). User-specific files are gitignored.
|
|
133
|
+
|
|
134
|
+
### Step 5: Create Settings Local Template
|
|
135
|
+
|
|
136
|
+
Create `.claude/settings.local.example.json` (commit to git as template):
|
|
137
|
+
|
|
138
|
+
```json
|
|
139
|
+
{
|
|
140
|
+
"env": {
|
|
141
|
+
"USER_NAME": "Your Name",
|
|
142
|
+
"PROJECT_NAME": "Your Project"
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
### Step 6: Update CLAUDE.md
|
|
148
|
+
|
|
149
|
+
Add hooks documentation to project's CLAUDE.md:
|
|
150
|
+
|
|
151
|
+
```markdown
|
|
152
|
+
## Hooks System (AgileFlow v2.19.0+)
|
|
153
|
+
|
|
154
|
+
AgileFlow supports event-driven automation through Claude Code's official hooks system. Hooks are automatically triggered when Claude Code lifecycle events occur.
|
|
155
|
+
|
|
156
|
+
### Configured Hooks
|
|
157
|
+
|
|
158
|
+
**SessionStart Hook**:
|
|
159
|
+
- Displays welcome message when Claude Code starts
|
|
160
|
+
- Current hook: Shows "🚀 AgileFlow loaded" message
|
|
161
|
+
- Located in: .claude/settings.json
|
|
162
|
+
|
|
163
|
+
### Customizing Hooks
|
|
164
|
+
|
|
165
|
+
**To customize hooks**:
|
|
166
|
+
1. Edit `.claude/settings.json`
|
|
167
|
+
2. Add commands to SessionStart, UserPromptSubmit, or Stop events
|
|
168
|
+
3. Restart Claude Code to apply changes
|
|
169
|
+
|
|
170
|
+
**Example - Add project context loading**:
|
|
171
|
+
\`\`\`json
|
|
172
|
+
{
|
|
173
|
+
"hooks": {
|
|
174
|
+
"SessionStart": [{
|
|
175
|
+
"hooks": [
|
|
176
|
+
{
|
|
177
|
+
"type": "command",
|
|
178
|
+
"command": "echo 'Project: $(node scripts/get-env.js PROJECT_NAME)'"
|
|
179
|
+
}
|
|
180
|
+
]
|
|
181
|
+
}]
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
\`\`\`
|
|
185
|
+
|
|
186
|
+
**Example - Activity logging**:
|
|
187
|
+
\`\`\`json
|
|
188
|
+
{
|
|
189
|
+
"hooks": {
|
|
190
|
+
"UserPromptSubmit": [{
|
|
191
|
+
"hooks": [{
|
|
192
|
+
"type": "command",
|
|
193
|
+
"command": "echo '[LOG] Prompt at $(date)' >> .claude/activity.log"
|
|
194
|
+
}]
|
|
195
|
+
}]
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
\`\`\`
|
|
199
|
+
|
|
200
|
+
### Dynamic Environment Variables
|
|
201
|
+
|
|
202
|
+
Use `scripts/get-env.js` to load environment variables from `.claude/settings.json` and `.claude/settings.local.json`:
|
|
203
|
+
|
|
204
|
+
**Create .claude/settings.local.json** (gitignored - your local config):
|
|
205
|
+
\`\`\`json
|
|
206
|
+
{
|
|
207
|
+
"env": {
|
|
208
|
+
"USER_NAME": "Alice",
|
|
209
|
+
"PROJECT_NAME": "MyApp"
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
\`\`\`
|
|
213
|
+
|
|
214
|
+
**Use in hooks**:
|
|
215
|
+
\`\`\`json
|
|
216
|
+
{
|
|
217
|
+
"hooks": {
|
|
218
|
+
"SessionStart": [{
|
|
219
|
+
"hooks": [{
|
|
220
|
+
"type": "command",
|
|
221
|
+
"command": "echo 'Welcome $(node scripts/get-env.js USER_NAME)!'"
|
|
222
|
+
}]
|
|
223
|
+
}]
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
\`\`\`
|
|
227
|
+
|
|
228
|
+
Changes to `.claude/settings.local.json` take effect immediately (no restart needed).
|
|
229
|
+
|
|
230
|
+
### Security
|
|
231
|
+
|
|
232
|
+
- `.claude/settings.json` is committed (project-level config, shared with team)
|
|
233
|
+
- `.claude/settings.local.json` is gitignored (user-specific overrides)
|
|
234
|
+
- `.claude/settings.local.example.json` is committed (template for team)
|
|
235
|
+
|
|
236
|
+
See AgileFlow plugin documentation for advanced hooks patterns.
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
### Step 7: Verify Hooks Configuration (Optional)
|
|
240
|
+
|
|
241
|
+
**IMPORTANT**: Always ask permission before verifying.
|
|
242
|
+
|
|
243
|
+
**Ask if user wants to verify**:
|
|
244
|
+
|
|
245
|
+
```xml
|
|
246
|
+
<invoke name="AskUserQuestion">
|
|
247
|
+
<parameter name="questions">[{
|
|
248
|
+
"question": "Verify hooks configuration? (Tests JSON validity and get-env.js script)",
|
|
249
|
+
"header": "Verify",
|
|
250
|
+
"multiSelect": false,
|
|
251
|
+
"options": [
|
|
252
|
+
{
|
|
253
|
+
"label": "Yes, verify now",
|
|
254
|
+
"description": "Validate .claude/settings.json and test get-env.js script"
|
|
255
|
+
},
|
|
256
|
+
{
|
|
257
|
+
"label": "No, skip verification",
|
|
258
|
+
"description": "Skip verification - assume configuration is correct"
|
|
259
|
+
}
|
|
260
|
+
]
|
|
261
|
+
}]
|
|
262
|
+
|
|
263
|
+
#### 7.1: Validate .claude/settings.json
|
|
264
|
+
|
|
265
|
+
```bash
|
|
266
|
+
echo "🔍 Step 1: Validating .claude/settings.json..."
|
|
267
|
+
|
|
268
|
+
if [ ! -f .claude/settings.json ]; then
|
|
269
|
+
echo "❌ .claude/settings.json not found"
|
|
270
|
+
SETTINGS_VALID=false
|
|
271
|
+
else
|
|
272
|
+
# Validate JSON syntax
|
|
273
|
+
if jq empty .claude/settings.json 2>/dev/null; then
|
|
274
|
+
echo "✅ JSON syntax is valid"
|
|
275
|
+
|
|
276
|
+
# Check for hooks section
|
|
277
|
+
if jq -e '.hooks' .claude/settings.json >/dev/null; then
|
|
278
|
+
echo "✅ Hooks section exists"
|
|
279
|
+
|
|
280
|
+
# Check for SessionStart hook
|
|
281
|
+
if jq -e '.hooks.SessionStart' .claude/settings.json >/dev/null; then
|
|
282
|
+
HOOK_COUNT=$(jq '.hooks.SessionStart | length' .claude/settings.json)
|
|
283
|
+
echo "✅ SessionStart hook configured ($HOOK_COUNT hook(s))"
|
|
284
|
+
SETTINGS_VALID=true
|
|
285
|
+
else
|
|
286
|
+
echo "⚠️ No SessionStart hooks found"
|
|
287
|
+
SETTINGS_VALID="partial"
|
|
288
|
+
fi
|
|
289
|
+
else
|
|
290
|
+
echo "❌ No hooks section found"
|
|
291
|
+
SETTINGS_VALID=false
|
|
292
|
+
fi
|
|
293
|
+
else
|
|
294
|
+
echo "❌ Invalid JSON syntax"
|
|
295
|
+
SETTINGS_VALID=false
|
|
296
|
+
fi
|
|
297
|
+
fi
|
|
298
|
+
```
|
|
299
|
+
|
|
300
|
+
#### 7.2: Test get-env.js Script
|
|
301
|
+
|
|
302
|
+
```bash
|
|
303
|
+
echo ""
|
|
304
|
+
echo "🧪 Step 2: Testing get-env.js script..."
|
|
305
|
+
|
|
306
|
+
if [ ! -f scripts/get-env.js ]; then
|
|
307
|
+
echo "❌ scripts/get-env.js not found"
|
|
308
|
+
GET_ENV_VALID=false
|
|
309
|
+
else
|
|
310
|
+
# Check if executable
|
|
311
|
+
if [ ! -x scripts/get-env.js ]; then
|
|
312
|
+
echo "⚠️ Script not executable (expected, will use 'node' to run)"
|
|
313
|
+
fi
|
|
314
|
+
|
|
315
|
+
# Test basic functionality
|
|
316
|
+
echo "Testing: node scripts/get-env.js USER_NAME 'TestUser'"
|
|
317
|
+
TEST_OUTPUT=$(node scripts/get-env.js USER_NAME "TestUser" 2>&1)
|
|
318
|
+
TEST_EXIT=$?
|
|
319
|
+
|
|
320
|
+
if [ $TEST_EXIT -eq 0 ]; then
|
|
321
|
+
echo "✅ get-env.js executed successfully"
|
|
322
|
+
echo " Output: '$TEST_OUTPUT'"
|
|
323
|
+
|
|
324
|
+
# Test with actual .claude/settings.local.json if it exists
|
|
325
|
+
if [ -f .claude/settings.local.json ]; then
|
|
326
|
+
echo ""
|
|
327
|
+
echo "Testing with .claude/settings.local.json..."
|
|
328
|
+
|
|
329
|
+
# Check if there's a USER_NAME in the file
|
|
330
|
+
if jq -e '.env.USER_NAME' .claude/settings.local.json >/dev/null 2>&1; then
|
|
331
|
+
EXPECTED=$(jq -r '.env.USER_NAME' .claude/settings.local.json)
|
|
332
|
+
ACTUAL=$(node scripts/get-env.js USER_NAME)
|
|
333
|
+
|
|
334
|
+
if [ "$EXPECTED" = "$ACTUAL" ]; then
|
|
335
|
+
echo "✅ get-env.js correctly reads from settings.local.json"
|
|
336
|
+
echo " USER_NAME='$ACTUAL'"
|
|
337
|
+
else
|
|
338
|
+
echo "⚠️ Value mismatch (expected '$EXPECTED', got '$ACTUAL')"
|
|
339
|
+
fi
|
|
340
|
+
else
|
|
341
|
+
echo "⚠️ No USER_NAME in .claude/settings.local.json to test with"
|
|
342
|
+
echo " (This is okay - it's optional)"
|
|
343
|
+
fi
|
|
344
|
+
else
|
|
345
|
+
echo "⚠️ .claude/settings.local.json not found"
|
|
346
|
+
echo " (This is okay - it's optional for user overrides)"
|
|
347
|
+
fi
|
|
348
|
+
|
|
349
|
+
GET_ENV_VALID=true
|
|
350
|
+
else
|
|
351
|
+
echo "❌ get-env.js failed"
|
|
352
|
+
echo " Error: $TEST_OUTPUT"
|
|
353
|
+
GET_ENV_VALID=false
|
|
354
|
+
fi
|
|
355
|
+
fi
|
|
356
|
+
```
|
|
357
|
+
|
|
358
|
+
#### 7.3: Test Hook Execution (Optional, Advanced)
|
|
359
|
+
|
|
360
|
+
**Ask permission to test actual hook execution**:
|
|
361
|
+
|
|
362
|
+
```xml
|
|
363
|
+
<invoke name="AskUserQuestion">
|
|
364
|
+
<parameter name="questions">[{
|
|
365
|
+
"question": "Test SessionStart hook execution? (This will run hook commands)",
|
|
366
|
+
"header": "Test hook",
|
|
367
|
+
"multiSelect": false,
|
|
368
|
+
"options": [
|
|
369
|
+
{
|
|
370
|
+
"label": "Yes, test hook",
|
|
371
|
+
"description": "Execute the SessionStart hook command to verify it works"
|
|
372
|
+
},
|
|
373
|
+
{
|
|
374
|
+
"label": "No, skip hook test",
|
|
375
|
+
"description": "Skip hook execution test - assume hook command is correct"
|
|
376
|
+
}
|
|
377
|
+
]
|
|
378
|
+
}]</parameter>
|
|
379
|
+
</invoke>
|
|
380
|
+
```
|
|
381
|
+
|
|
382
|
+
**If user selects "Yes, test hook"**:
|
|
383
|
+
|
|
384
|
+
```bash
|
|
385
|
+
if [ "$testHook" = "Yes, test hook" ]; then
|
|
386
|
+
echo ""
|
|
387
|
+
echo "🚀 Step 3: Testing SessionStart hook execution..."
|
|
388
|
+
|
|
389
|
+
# Extract first SessionStart hook command
|
|
390
|
+
HOOK_CMD=$(jq -r '.hooks.SessionStart[0].hooks[0].command // ""' .claude/settings.json)
|
|
391
|
+
|
|
392
|
+
if [ -z "$HOOK_CMD" ] || [ "$HOOK_CMD" = "null" ]; then
|
|
393
|
+
echo "❌ No hook command found to test"
|
|
394
|
+
HOOK_TEST_RESULT="SKIPPED"
|
|
395
|
+
else
|
|
396
|
+
echo "Running hook command: $HOOK_CMD"
|
|
397
|
+
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
398
|
+
|
|
399
|
+
# Execute the hook command
|
|
400
|
+
HOOK_OUTPUT=$(eval "$HOOK_CMD" 2>&1)
|
|
401
|
+
HOOK_EXIT=$?
|
|
402
|
+
|
|
403
|
+
echo "$HOOK_OUTPUT"
|
|
404
|
+
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
405
|
+
|
|
406
|
+
if [ $HOOK_EXIT -eq 0 ]; then
|
|
407
|
+
echo "✅ Hook executed successfully"
|
|
408
|
+
HOOK_TEST_RESULT="PASSED"
|
|
409
|
+
else
|
|
410
|
+
echo "❌ Hook execution failed (exit code: $HOOK_EXIT)"
|
|
411
|
+
HOOK_TEST_RESULT="FAILED"
|
|
412
|
+
fi
|
|
413
|
+
fi
|
|
414
|
+
else
|
|
415
|
+
HOOK_TEST_RESULT="SKIPPED"
|
|
416
|
+
fi
|
|
417
|
+
```
|
|
418
|
+
|
|
419
|
+
### Verification Report
|
|
420
|
+
|
|
421
|
+
```
|
|
422
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
423
|
+
🔍 VERIFICATION REPORT
|
|
424
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
425
|
+
|
|
426
|
+
Configuration: Hooks System
|
|
427
|
+
Settings file: .claude/settings.json
|
|
428
|
+
|
|
429
|
+
Checks performed:
|
|
430
|
+
{{SETTINGS_VALID === true ? "✅" : SETTINGS_VALID === "partial" ? "⚠️" : "❌"}} Settings JSON validation: {{SETTINGS_VALID === true ? "PASSED" : SETTINGS_VALID === "partial" ? "PARTIAL" : "FAILED"}}
|
|
431
|
+
{{GET_ENV_VALID ? "✅" : "❌"}} get-env.js script: {{GET_ENV_VALID ? "PASSED" : "FAILED"}}
|
|
432
|
+
{{HOOK_TEST_RESULT === "PASSED" ? "✅" : HOOK_TEST_RESULT === "FAILED" ? "❌" : "⏭️"}} Hook execution test: {{HOOK_TEST_RESULT}}
|
|
433
|
+
|
|
434
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
435
|
+
Overall: {{SETTINGS_VALID === true && GET_ENV_VALID ? "✅ VERIFIED" : "⚠️ ISSUES FOUND"}}
|
|
436
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
437
|
+
```
|
|
438
|
+
|
|
439
|
+
**If verification failed**:
|
|
440
|
+
|
|
441
|
+
```
|
|
442
|
+
⚠️ Some checks failed, but hooks configuration has been saved.
|
|
443
|
+
|
|
444
|
+
{{#if !SETTINGS_VALID}}
|
|
445
|
+
Issues with .claude/settings.json:
|
|
446
|
+
- Check JSON syntax with: jq empty .claude/settings.json
|
|
447
|
+
- Ensure hooks section exists
|
|
448
|
+
{{/if}}
|
|
449
|
+
|
|
450
|
+
{{#if !GET_ENV_VALID}}
|
|
451
|
+
Issues with get-env.js:
|
|
452
|
+
- Check script exists: ls -la scripts/get-env.js
|
|
453
|
+
- Test manually: node scripts/get-env.js USER_NAME
|
|
454
|
+
{{/if}}
|
|
455
|
+
|
|
456
|
+
{{#if HOOK_TEST_RESULT == "FAILED"}}
|
|
457
|
+
Hook execution failed:
|
|
458
|
+
- Check hook command syntax
|
|
459
|
+
- Test command manually in terminal
|
|
460
|
+
{{/if}}
|
|
461
|
+
|
|
462
|
+
Important: Hooks will ONLY load when Claude Code restarts!
|
|
463
|
+
```
|
|
464
|
+
|
|
465
|
+
## Success Output
|
|
466
|
+
|
|
467
|
+
After successful configuration (with or without verification), print:
|
|
468
|
+
|
|
469
|
+
```
|
|
470
|
+
✅ Hooks system configured
|
|
471
|
+
✅ .claude/settings.json created with SessionStart welcome message
|
|
472
|
+
✅ scripts/get-env.js helper created
|
|
473
|
+
✅ .gitignore updated (.claude user-specific files protected)
|
|
474
|
+
✅ .claude/ directory created for settings
|
|
475
|
+
✅ .claude/settings.local.example.json template created
|
|
476
|
+
✅ CLAUDE.md updated with hooks documentation
|
|
477
|
+
|
|
478
|
+
Next steps for you:
|
|
479
|
+
1. Customize hooks: Edit .claude/settings.json
|
|
480
|
+
2. OPTIONAL: Create .claude/settings.local.json for user-specific environment variables
|
|
481
|
+
═══════════════════════════════════════════════════════════
|
|
482
|
+
3. 🔴🔴🔴 RESTART CLAUDE CODE NOW! (CRITICAL - DO NOT SKIP)
|
|
483
|
+
Quit completely (Cmd+Q), wait 5 seconds, restart
|
|
484
|
+
Hooks ONLY load on startup!
|
|
485
|
+
═══════════════════════════════════════════════════════════
|
|
486
|
+
4. Hooks will run automatically on SessionStart, UserPromptSubmit, Stop events
|
|
487
|
+
|
|
488
|
+
Next steps for team members:
|
|
489
|
+
1. Pull latest code (includes .claude/settings.json project config)
|
|
490
|
+
2. OPTIONAL: Create .claude/settings.local.json with their own environment variable overrides
|
|
491
|
+
═══════════════════════════════════════════════════════════
|
|
492
|
+
3. 🔴🔴🔴 RESTART CLAUDE CODE NOW! (CRITICAL - DO NOT SKIP)
|
|
493
|
+
Quit completely (Cmd+Q), wait 5 seconds, restart
|
|
494
|
+
Hooks ONLY load on startup!
|
|
495
|
+
═══════════════════════════════════════════════════════════
|
|
496
|
+
4. Hooks will run automatically!
|
|
497
|
+
|
|
498
|
+
Note: .claude/settings.json is committed to git (shared config). Team members can create .claude/settings.local.json for personal overrides (gitignored).
|
|
499
|
+
```
|
|
500
|
+
|
|
501
|
+
## Rules
|
|
502
|
+
|
|
503
|
+
- Validate JSON (no trailing commas)
|
|
504
|
+
- Show preview before writing files
|
|
505
|
+
- Make scripts executable (chmod +x)
|
|
506
|
+
- Update .gitignore atomically (check before adding)
|
|
507
|
+
- Always remind user to RESTART Claude Code
|