uv-suite 0.6.0 → 0.8.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/hooks/session-end.sh +51 -0
- package/hooks/session-start.sh +18 -0
- package/hooks/session-timer.sh +56 -0
- package/hooks/status-line.sh +46 -0
- package/install.sh +24 -101
- package/package.json +1 -1
- package/personas/auto.json +27 -0
- package/personas/professional.json +29 -2
- package/personas/spike.json +21 -0
- package/personas/sport.json +21 -0
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# UV Suite Hook: Session end — reflection and total time
|
|
3
|
+
# Event: Stop (replaces session-review-reminder.sh with richer behavior)
|
|
4
|
+
|
|
5
|
+
STATE_DIR="${CLAUDE_PROJECT_DIR:-.}/.uv-suite-state"
|
|
6
|
+
START_FILE="$STATE_DIR/session-start.txt"
|
|
7
|
+
|
|
8
|
+
# Compute session duration
|
|
9
|
+
DURATION_MSG=""
|
|
10
|
+
if [ -f "$START_FILE" ]; then
|
|
11
|
+
START=$(cat "$START_FILE")
|
|
12
|
+
NOW=$(date +%s)
|
|
13
|
+
ELAPSED=$((NOW - START))
|
|
14
|
+
MINUTES=$((ELAPSED / 60))
|
|
15
|
+
|
|
16
|
+
# Add to today's total
|
|
17
|
+
TODAY=$(date +%Y-%m-%d)
|
|
18
|
+
TODAY_FILE="$STATE_DIR/active-$TODAY.txt"
|
|
19
|
+
TODAY_TOTAL=$(cat "$TODAY_FILE" 2>/dev/null || echo "0")
|
|
20
|
+
TODAY_TOTAL=$((TODAY_TOTAL + MINUTES))
|
|
21
|
+
echo "$TODAY_TOTAL" > "$TODAY_FILE"
|
|
22
|
+
|
|
23
|
+
DURATION_MSG="Session: ${MINUTES} min. Today: ${TODAY_TOTAL} min. "
|
|
24
|
+
|
|
25
|
+
# Reset session state
|
|
26
|
+
rm -f "$START_FILE" "$STATE_DIR/tool-count.txt" "$STATE_DIR/last-warning.txt"
|
|
27
|
+
fi
|
|
28
|
+
|
|
29
|
+
# Check for uncommitted changes
|
|
30
|
+
STAGED=$(git diff --cached --stat 2>/dev/null)
|
|
31
|
+
UNSTAGED=$(git diff --stat 2>/dev/null)
|
|
32
|
+
UNTRACKED=$(git ls-files --others --exclude-standard 2>/dev/null | head -5)
|
|
33
|
+
|
|
34
|
+
REVIEW_MSG=""
|
|
35
|
+
if [ -n "$STAGED" ] || [ -n "$UNSTAGED" ] || [ -n "$UNTRACKED" ]; then
|
|
36
|
+
REVIEW_MSG="Uncommitted changes — consider /review and /slop-check before committing. "
|
|
37
|
+
fi
|
|
38
|
+
|
|
39
|
+
# Reflection prompt
|
|
40
|
+
REFLECTION_MSG="Before closing: What shipped? What did you learn? What would you teach the agent for next time (add to CLAUDE.md or DANGER-ZONES.md)?"
|
|
41
|
+
|
|
42
|
+
FULL_MSG="${DURATION_MSG}${REVIEW_MSG}${REFLECTION_MSG}"
|
|
43
|
+
|
|
44
|
+
cat <<EOF
|
|
45
|
+
{
|
|
46
|
+
"continue": true,
|
|
47
|
+
"systemMessage": "$FULL_MSG"
|
|
48
|
+
}
|
|
49
|
+
EOF
|
|
50
|
+
|
|
51
|
+
exit 0
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# UV Suite Hook: Session start — record start time
|
|
3
|
+
# Event: SessionStart
|
|
4
|
+
|
|
5
|
+
STATE_DIR="${CLAUDE_PROJECT_DIR:-.}/.uv-suite-state"
|
|
6
|
+
mkdir -p "$STATE_DIR"
|
|
7
|
+
|
|
8
|
+
# Record session start time
|
|
9
|
+
date +%s > "$STATE_DIR/session-start.txt"
|
|
10
|
+
|
|
11
|
+
# Track today's total active time
|
|
12
|
+
TODAY=$(date +%Y-%m-%d)
|
|
13
|
+
TODAY_FILE="$STATE_DIR/active-$TODAY.txt"
|
|
14
|
+
if [ ! -f "$TODAY_FILE" ]; then
|
|
15
|
+
echo "0" > "$TODAY_FILE"
|
|
16
|
+
fi
|
|
17
|
+
|
|
18
|
+
exit 0
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# UV Suite Hook: Session timer — warn about session duration
|
|
3
|
+
# Event: PostToolUse (runs every Nth tool call)
|
|
4
|
+
# Escalates: 45min → gentle, 90min → firm, 180min → strong
|
|
5
|
+
|
|
6
|
+
STATE_DIR="${CLAUDE_PROJECT_DIR:-.}/.uv-suite-state"
|
|
7
|
+
START_FILE="$STATE_DIR/session-start.txt"
|
|
8
|
+
|
|
9
|
+
# Only check every 20th tool call to avoid noise
|
|
10
|
+
COUNT_FILE="$STATE_DIR/tool-count.txt"
|
|
11
|
+
COUNT=$(cat "$COUNT_FILE" 2>/dev/null || echo "0")
|
|
12
|
+
COUNT=$((COUNT + 1))
|
|
13
|
+
echo "$COUNT" > "$COUNT_FILE"
|
|
14
|
+
|
|
15
|
+
if [ $((COUNT % 20)) -ne 0 ]; then
|
|
16
|
+
exit 0
|
|
17
|
+
fi
|
|
18
|
+
|
|
19
|
+
if [ ! -f "$START_FILE" ]; then
|
|
20
|
+
exit 0
|
|
21
|
+
fi
|
|
22
|
+
|
|
23
|
+
START=$(cat "$START_FILE")
|
|
24
|
+
NOW=$(date +%s)
|
|
25
|
+
ELAPSED=$((NOW - START))
|
|
26
|
+
MINUTES=$((ELAPSED / 60))
|
|
27
|
+
|
|
28
|
+
# Check if we've already shown a warning for this threshold
|
|
29
|
+
LAST_WARN_FILE="$STATE_DIR/last-warning.txt"
|
|
30
|
+
LAST_WARN=$(cat "$LAST_WARN_FILE" 2>/dev/null || echo "0")
|
|
31
|
+
|
|
32
|
+
MESSAGE=""
|
|
33
|
+
WARN_LEVEL=0
|
|
34
|
+
|
|
35
|
+
if [ "$MINUTES" -ge 180 ] && [ "$LAST_WARN" -lt 3 ]; then
|
|
36
|
+
MESSAGE="SESSION HEALTH (3+ hours): You've been in this session for ${MINUTES} minutes. This is a long stretch. Strongly consider: (1) commit what you have, (2) close this session, (3) take a real break away from the screen. Long uninterrupted agent sessions lead to goal drift, lower judgment quality, and burnout. /compact if you must continue, but a break is better."
|
|
37
|
+
WARN_LEVEL=3
|
|
38
|
+
elif [ "$MINUTES" -ge 90 ] && [ "$LAST_WARN" -lt 2 ]; then
|
|
39
|
+
MESSAGE="SESSION HEALTH (90+ min): You've been in this session for ${MINUTES} minutes. Consider taking a 10-minute break — stretch, water, walk. Come back with fresh eyes. Also a good time to commit progress."
|
|
40
|
+
WARN_LEVEL=2
|
|
41
|
+
elif [ "$MINUTES" -ge 45 ] && [ "$LAST_WARN" -lt 1 ]; then
|
|
42
|
+
MESSAGE="SESSION HEALTH (45 min): You've been in this session for ${MINUTES} minutes. Good time for a quick break and to commit any progress."
|
|
43
|
+
WARN_LEVEL=1
|
|
44
|
+
fi
|
|
45
|
+
|
|
46
|
+
if [ -n "$MESSAGE" ]; then
|
|
47
|
+
echo "$WARN_LEVEL" > "$LAST_WARN_FILE"
|
|
48
|
+
cat <<EOF
|
|
49
|
+
{
|
|
50
|
+
"continue": true,
|
|
51
|
+
"systemMessage": "$MESSAGE"
|
|
52
|
+
}
|
|
53
|
+
EOF
|
|
54
|
+
fi
|
|
55
|
+
|
|
56
|
+
exit 0
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# UV Suite Hook: Status line — show session duration and persona
|
|
3
|
+
# Event: statusLine (rendered continuously)
|
|
4
|
+
|
|
5
|
+
STATE_DIR="${CLAUDE_PROJECT_DIR:-.}/.uv-suite-state"
|
|
6
|
+
START_FILE="$STATE_DIR/session-start.txt"
|
|
7
|
+
|
|
8
|
+
# Session duration
|
|
9
|
+
if [ -f "$START_FILE" ]; then
|
|
10
|
+
START=$(cat "$START_FILE")
|
|
11
|
+
NOW=$(date +%s)
|
|
12
|
+
ELAPSED=$((NOW - START))
|
|
13
|
+
MINS=$((ELAPSED / 60))
|
|
14
|
+
|
|
15
|
+
if [ "$MINS" -ge 180 ]; then
|
|
16
|
+
SESSION="session ${MINS}m (!! take a break)"
|
|
17
|
+
elif [ "$MINS" -ge 90 ]; then
|
|
18
|
+
SESSION="session ${MINS}m (break soon)"
|
|
19
|
+
elif [ "$MINS" -ge 45 ]; then
|
|
20
|
+
SESSION="session ${MINS}m"
|
|
21
|
+
else
|
|
22
|
+
SESSION="session ${MINS}m"
|
|
23
|
+
fi
|
|
24
|
+
else
|
|
25
|
+
SESSION="session 0m"
|
|
26
|
+
fi
|
|
27
|
+
|
|
28
|
+
# Today's total active time
|
|
29
|
+
TODAY=$(date +%Y-%m-%d)
|
|
30
|
+
TODAY_FILE="$STATE_DIR/active-$TODAY.txt"
|
|
31
|
+
if [ -f "$TODAY_FILE" ]; then
|
|
32
|
+
TODAY_TOTAL=$(cat "$TODAY_FILE")
|
|
33
|
+
CURRENT_MINS=${MINS:-0}
|
|
34
|
+
TODAY_NOW=$((TODAY_TOTAL + CURRENT_MINS))
|
|
35
|
+
TODAY_STR=" · today ${TODAY_NOW}m"
|
|
36
|
+
else
|
|
37
|
+
TODAY_STR=""
|
|
38
|
+
fi
|
|
39
|
+
|
|
40
|
+
# Persona from settings path (best-effort detection)
|
|
41
|
+
PERSONA=""
|
|
42
|
+
if [ -f "$CLAUDE_PROJECT_DIR/.claude/settings.local.json" ]; then
|
|
43
|
+
PERSONA=$(grep -o '"effort"[^,]*' "$CLAUDE_PROJECT_DIR/.claude/settings.local.json" 2>/dev/null | head -1)
|
|
44
|
+
fi
|
|
45
|
+
|
|
46
|
+
echo "UV Suite · $SESSION$TODAY_STR"
|
package/install.sh
CHANGED
|
@@ -112,13 +112,16 @@ echo " ✓ /map-codebase, /spec, /architect, /review, /write-tests"
|
|
|
112
112
|
echo " ✓ /write-evals, /slop-check, /prototype, /security-review"
|
|
113
113
|
|
|
114
114
|
# --- Install hooks ---
|
|
115
|
-
echo "Installing
|
|
115
|
+
echo "Installing hook scripts..."
|
|
116
116
|
cp "$UV_SUITE_DIR/hooks/"*.sh "$TARGET_DIR/hooks/"
|
|
117
117
|
chmod +x "$TARGET_DIR/hooks/"*.sh
|
|
118
|
-
echo " ✓ auto-lint.sh (PostToolUse: auto-format
|
|
118
|
+
echo " ✓ auto-lint.sh (PostToolUse: auto-format)"
|
|
119
119
|
echo " ✓ danger-zone-check.sh (PreToolUse: warn on danger zone files)"
|
|
120
120
|
echo " ✓ block-destructive.sh (PreToolUse: block rm -rf, force push, etc.)"
|
|
121
|
-
echo " ✓ session-
|
|
121
|
+
echo " ✓ session-start.sh (SessionStart: track session start time)"
|
|
122
|
+
echo " ✓ session-timer.sh (PostToolUse: warn at 45/90/180 min)"
|
|
123
|
+
echo " ✓ session-end.sh (Stop: reflection + duration + review reminder)"
|
|
124
|
+
echo " ✓ status-line.sh (statusLine: show session time continuously)"
|
|
122
125
|
echo " + Real-time slop check (Haiku prompt hook, wired in settings.json)"
|
|
123
126
|
|
|
124
127
|
# --- Install guardrail rules (Sport only) ---
|
|
@@ -218,9 +221,25 @@ Agent output is written to uv-out/. Agents read prior artifacts automatically:
|
|
|
218
221
|
|
|
219
222
|
${HOOKS_TEXT}
|
|
220
223
|
|
|
221
|
-
###
|
|
224
|
+
### Working practices
|
|
222
225
|
|
|
223
|
-
|
|
226
|
+
**Honesty:** If you can't find a doc, file, or function, say so explicitly. Never fabricate. Say: "I did not find X. What should I do?" Never invent facts to fill gaps. Calibrate confidence — use "I think" when unsure. If 2-3 attempts fail, stop and escalate with what you tried.
|
|
227
|
+
|
|
228
|
+
**Scope:** Do what was asked. Nothing more. No "while I'm here" fixes. If you notice something worth fixing, mention it at the end, don't silently change it.
|
|
229
|
+
|
|
230
|
+
**Destructive actions:** Always confirm before rm -rf, force push, dropping tables, modifying CI/CD, pushing to main.
|
|
231
|
+
|
|
232
|
+
**Completion:** "Done" means verified. Run the tests. Don't say "should work" when you could say "I ran it and it works."
|
|
233
|
+
|
|
234
|
+
**Failures:** When you fail, say so. Use the escalation format: what you tried, why each failed, your hypothesis, what you need.
|
|
235
|
+
|
|
236
|
+
**The user knows things you don't:** If something looks wrong, ask why before "fixing" it. Users have context you don't.
|
|
237
|
+
|
|
238
|
+
**Context:** If the conversation is long, suggest /compact or a new session. Past 90 min, suggest a break.
|
|
239
|
+
|
|
240
|
+
### Launching sessions
|
|
241
|
+
|
|
242
|
+
uv claude pro | uv codex pro | uv pro (shorthand)
|
|
224
243
|
EOF
|
|
225
244
|
|
|
226
245
|
echo " ✓ UV Suite section added to CLAUDE.md"
|
|
@@ -325,102 +344,6 @@ else
|
|
|
325
344
|
echo " Register manually after installing Claude Code: claude mcp add playwright -- npx @playwright/mcp@latest"
|
|
326
345
|
fi
|
|
327
346
|
|
|
328
|
-
# --- Write UV Suite context to CLAUDE.md ---
|
|
329
|
-
if [ "$INSTALL_MODE" = "project" ]; then
|
|
330
|
-
PROJECT_ROOT="$(dirname "$TARGET_DIR")"
|
|
331
|
-
CLAUDE_MD="$PROJECT_ROOT/CLAUDE.md"
|
|
332
|
-
|
|
333
|
-
# Check if UV Suite section already exists
|
|
334
|
-
if [ -f "$CLAUDE_MD" ] && grep -q "## UV Suite" "$CLAUDE_MD" 2>/dev/null; then
|
|
335
|
-
echo "Updating UV Suite section in CLAUDE.md..."
|
|
336
|
-
# Remove old UV Suite section and rewrite
|
|
337
|
-
sed -i.bak '/^## UV Suite$/,/^## [^U]/{ /^## [^U]/!d; }' "$CLAUDE_MD" 2>/dev/null || true
|
|
338
|
-
rm -f "$CLAUDE_MD.bak" 2>/dev/null
|
|
339
|
-
else
|
|
340
|
-
echo "Adding UV Suite section to CLAUDE.md..."
|
|
341
|
-
fi
|
|
342
|
-
|
|
343
|
-
cat >> "$CLAUDE_MD" << CLAUDEMD
|
|
344
|
-
|
|
345
|
-
## UV Suite
|
|
346
|
-
|
|
347
|
-
This project uses [UV Suite](https://github.com/utsavanand/uv-suite) for AI-assisted development.
|
|
348
|
-
|
|
349
|
-
**Active persona:** $PERSONA_LABEL
|
|
350
|
-
**Version:** $(cat "$UV_SUITE_DIR/package.json" 2>/dev/null | grep '"version"' | head -1 | sed 's/.*: "//;s/".*//')
|
|
351
|
-
|
|
352
|
-
### Available skills (slash commands)
|
|
353
|
-
|
|
354
|
-
| Command | Agent | What it does |
|
|
355
|
-
|---------|-------|-------------|
|
|
356
|
-
| /map-codebase [dir] | Cartographer | Build knowledge graph of codebase |
|
|
357
|
-
| /map-stack [dir] | Cartographer | Map multiple services and their connections |
|
|
358
|
-
| /spec [requirements] | Spec Writer | Write technical specification |
|
|
359
|
-
| /architect [spec] | Architect | Design architecture, decompose into Acts |
|
|
360
|
-
| /review | Reviewer | Code review (correctness, security, perf, slop) |
|
|
361
|
-
| /write-tests [file] | Test Writer | Generate tests matching project conventions |
|
|
362
|
-
| /write-evals [prompt] | Eval Writer | Write AI/LLM evaluation cases |
|
|
363
|
-
| /slop-check | Anti-Slop Guard | Detect 6 categories of AI-generated slop |
|
|
364
|
-
| /prototype [concept] | Prototype Builder | Build static React prototype |
|
|
365
|
-
| /security-review | Security Agent | OWASP audit, dependency scan, secret detection |
|
|
366
|
-
|
|
367
|
-
### Artifacts
|
|
368
|
-
|
|
369
|
-
All agent output is written to \`uv-out/\`. Each agent reads relevant prior artifacts from this directory automatically.
|
|
370
|
-
|
|
371
|
-
| Artifact | Written by | Read by |
|
|
372
|
-
|----------|-----------|---------|
|
|
373
|
-
| uv-out/map-codebase.md | /map-codebase | /architect, /review, /security-review |
|
|
374
|
-
| uv-out/specs/*.md | /spec | /architect, /write-tests, /write-evals |
|
|
375
|
-
| uv-out/architecture/*.md | /architect | /review, /write-tests, /slop-check |
|
|
376
|
-
| uv-out/review-*.md | /review | /slop-check, /security-review |
|
|
377
|
-
| uv-out/security-review-*.md | /security-review | — |
|
|
378
|
-
| uv-out/slop-check-*.md | /slop-check | — |
|
|
379
|
-
|
|
380
|
-
### Active hooks
|
|
381
|
-
|
|
382
|
-
Hooks fire automatically on every relevant action. You do not invoke these.
|
|
383
|
-
|
|
384
|
-
$(if [ "$PERSONA" = "professional" ]; then
|
|
385
|
-
cat << 'HOOKS'
|
|
386
|
-
- **auto-lint** (on file write) — runs prettier/ruff/gofmt
|
|
387
|
-
- **slop check** (on file write) — Haiku scans for obvious slop
|
|
388
|
-
- **danger zone** (on file edit) — warns if file is in DANGER-ZONES.md
|
|
389
|
-
- **destructive block** (on bash) — blocks rm -rf, force push
|
|
390
|
-
- **review reminder** (on session end) — reminds to /review if uncommitted changes
|
|
391
|
-
HOOKS
|
|
392
|
-
elif [ "$PERSONA" = "auto" ]; then
|
|
393
|
-
cat << 'HOOKS'
|
|
394
|
-
- **auto-lint** (on file write) — runs prettier/ruff/gofmt
|
|
395
|
-
- **destructive block** (on bash) — blocks rm -rf, force push
|
|
396
|
-
HOOKS
|
|
397
|
-
elif [ "$PERSONA" = "sport" ]; then
|
|
398
|
-
cat << 'HOOKS'
|
|
399
|
-
- **auto-lint** (on file write) — runs prettier/ruff/gofmt
|
|
400
|
-
HOOKS
|
|
401
|
-
elif [ "$PERSONA" = "spike" ]; then
|
|
402
|
-
cat << 'HOOKS'
|
|
403
|
-
- **doc slop check** (on file write) — Haiku checks documentation quality
|
|
404
|
-
HOOKS
|
|
405
|
-
fi)
|
|
406
|
-
|
|
407
|
-
### Context management
|
|
408
|
-
|
|
409
|
-
If the conversation is getting long, proactively suggest running /compact or starting a new session. Use /cost to check token usage. The user's status line shows context window usage.
|
|
410
|
-
|
|
411
|
-
### Launching sessions
|
|
412
|
-
|
|
413
|
-
\`\`\`
|
|
414
|
-
uv claude pro # Claude Code, Professional persona
|
|
415
|
-
uv claude auto # Claude Code, Auto persona
|
|
416
|
-
uv codex pro # OpenAI Codex, Professional persona
|
|
417
|
-
uv codex sport # OpenAI Codex, Sport persona
|
|
418
|
-
\`\`\`
|
|
419
|
-
CLAUDEMD
|
|
420
|
-
|
|
421
|
-
echo " ✓ UV Suite section added to CLAUDE.md"
|
|
422
|
-
fi
|
|
423
|
-
|
|
424
347
|
# --- Install launcher script ---
|
|
425
348
|
echo "Installing session launcher..."
|
|
426
349
|
cp "$UV_SUITE_DIR/uv.sh" "$TARGET_DIR/../uv.sh" 2>/dev/null || true
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "uv-suite",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.8.0",
|
|
4
4
|
"description": "Portable framework for AI-assisted software development. 10 agents, 9 skills, 5 hooks, 4 personas. Works with Claude Code, Cursor, and Codex.",
|
|
5
5
|
"author": "Utsav Anand",
|
|
6
6
|
"license": "MIT",
|
package/personas/auto.json
CHANGED
|
@@ -50,6 +50,14 @@
|
|
|
50
50
|
},
|
|
51
51
|
|
|
52
52
|
"hooks": {
|
|
53
|
+
"SessionStart": [
|
|
54
|
+
{
|
|
55
|
+
"matcher": "*",
|
|
56
|
+
"hooks": [
|
|
57
|
+
{ "type": "command", "command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/session-start.sh", "timeout": 5 }
|
|
58
|
+
]
|
|
59
|
+
}
|
|
60
|
+
],
|
|
53
61
|
"PreToolUse": [
|
|
54
62
|
{
|
|
55
63
|
"matcher": "Bash",
|
|
@@ -64,6 +72,12 @@
|
|
|
64
72
|
}
|
|
65
73
|
],
|
|
66
74
|
"PostToolUse": [
|
|
75
|
+
{
|
|
76
|
+
"matcher": "*",
|
|
77
|
+
"hooks": [
|
|
78
|
+
{ "type": "command", "command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/session-timer.sh", "timeout": 5 }
|
|
79
|
+
]
|
|
80
|
+
},
|
|
67
81
|
{
|
|
68
82
|
"matcher": "Edit|Write",
|
|
69
83
|
"hooks": [
|
|
@@ -75,6 +89,19 @@
|
|
|
75
89
|
}
|
|
76
90
|
]
|
|
77
91
|
}
|
|
92
|
+
],
|
|
93
|
+
"Stop": [
|
|
94
|
+
{
|
|
95
|
+
"matcher": "*",
|
|
96
|
+
"hooks": [
|
|
97
|
+
{ "type": "command", "command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/session-end.sh", "timeout": 10 }
|
|
98
|
+
]
|
|
99
|
+
}
|
|
78
100
|
]
|
|
101
|
+
},
|
|
102
|
+
|
|
103
|
+
"statusLine": {
|
|
104
|
+
"type": "command",
|
|
105
|
+
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/status-line.sh"
|
|
79
106
|
}
|
|
80
107
|
}
|
|
@@ -48,6 +48,18 @@
|
|
|
48
48
|
},
|
|
49
49
|
|
|
50
50
|
"hooks": {
|
|
51
|
+
"SessionStart": [
|
|
52
|
+
{
|
|
53
|
+
"matcher": "*",
|
|
54
|
+
"hooks": [
|
|
55
|
+
{
|
|
56
|
+
"type": "command",
|
|
57
|
+
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/session-start.sh",
|
|
58
|
+
"timeout": 5
|
|
59
|
+
}
|
|
60
|
+
]
|
|
61
|
+
}
|
|
62
|
+
],
|
|
51
63
|
"PreToolUse": [
|
|
52
64
|
{
|
|
53
65
|
"matcher": "Bash",
|
|
@@ -73,6 +85,16 @@
|
|
|
73
85
|
}
|
|
74
86
|
],
|
|
75
87
|
"PostToolUse": [
|
|
88
|
+
{
|
|
89
|
+
"matcher": "*",
|
|
90
|
+
"hooks": [
|
|
91
|
+
{
|
|
92
|
+
"type": "command",
|
|
93
|
+
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/session-timer.sh",
|
|
94
|
+
"timeout": 5
|
|
95
|
+
}
|
|
96
|
+
]
|
|
97
|
+
},
|
|
76
98
|
{
|
|
77
99
|
"matcher": "Edit|Write",
|
|
78
100
|
"hooks": [
|
|
@@ -98,12 +120,17 @@
|
|
|
98
120
|
"hooks": [
|
|
99
121
|
{
|
|
100
122
|
"type": "command",
|
|
101
|
-
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/session-
|
|
123
|
+
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/session-end.sh",
|
|
102
124
|
"timeout": 10,
|
|
103
|
-
"statusMessage": "
|
|
125
|
+
"statusMessage": "Wrapping up session..."
|
|
104
126
|
}
|
|
105
127
|
]
|
|
106
128
|
}
|
|
107
129
|
]
|
|
130
|
+
},
|
|
131
|
+
|
|
132
|
+
"statusLine": {
|
|
133
|
+
"type": "command",
|
|
134
|
+
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/status-line.sh"
|
|
108
135
|
}
|
|
109
136
|
}
|
package/personas/spike.json
CHANGED
|
@@ -36,6 +36,14 @@
|
|
|
36
36
|
},
|
|
37
37
|
|
|
38
38
|
"hooks": {
|
|
39
|
+
"SessionStart": [
|
|
40
|
+
{
|
|
41
|
+
"matcher": "*",
|
|
42
|
+
"hooks": [
|
|
43
|
+
{ "type": "command", "command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/session-start.sh", "timeout": 5 }
|
|
44
|
+
]
|
|
45
|
+
}
|
|
46
|
+
],
|
|
39
47
|
"PostToolUse": [
|
|
40
48
|
{
|
|
41
49
|
"matcher": "Write",
|
|
@@ -49,6 +57,19 @@
|
|
|
49
57
|
}
|
|
50
58
|
]
|
|
51
59
|
}
|
|
60
|
+
],
|
|
61
|
+
"Stop": [
|
|
62
|
+
{
|
|
63
|
+
"matcher": "*",
|
|
64
|
+
"hooks": [
|
|
65
|
+
{ "type": "command", "command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/session-end.sh", "timeout": 10 }
|
|
66
|
+
]
|
|
67
|
+
}
|
|
52
68
|
]
|
|
69
|
+
},
|
|
70
|
+
|
|
71
|
+
"statusLine": {
|
|
72
|
+
"type": "command",
|
|
73
|
+
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/status-line.sh"
|
|
53
74
|
}
|
|
54
75
|
}
|
package/personas/sport.json
CHANGED
|
@@ -22,6 +22,14 @@
|
|
|
22
22
|
},
|
|
23
23
|
|
|
24
24
|
"hooks": {
|
|
25
|
+
"SessionStart": [
|
|
26
|
+
{
|
|
27
|
+
"matcher": "*",
|
|
28
|
+
"hooks": [
|
|
29
|
+
{ "type": "command", "command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/session-start.sh", "timeout": 5 }
|
|
30
|
+
]
|
|
31
|
+
}
|
|
32
|
+
],
|
|
25
33
|
"PostToolUse": [
|
|
26
34
|
{
|
|
27
35
|
"matcher": "Edit|Write",
|
|
@@ -34,6 +42,19 @@
|
|
|
34
42
|
}
|
|
35
43
|
]
|
|
36
44
|
}
|
|
45
|
+
],
|
|
46
|
+
"Stop": [
|
|
47
|
+
{
|
|
48
|
+
"matcher": "*",
|
|
49
|
+
"hooks": [
|
|
50
|
+
{ "type": "command", "command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/session-end.sh", "timeout": 10 }
|
|
51
|
+
]
|
|
52
|
+
}
|
|
37
53
|
]
|
|
54
|
+
},
|
|
55
|
+
|
|
56
|
+
"statusLine": {
|
|
57
|
+
"type": "command",
|
|
58
|
+
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/status-line.sh"
|
|
38
59
|
}
|
|
39
60
|
}
|