uv-suite 0.26.1 → 0.26.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/hooks/checkpoint-helper.sh +124 -0
- package/hooks/confirm-prompt.sh +51 -0
- package/hooks/session-label-nag.sh +63 -0
- package/hooks/session-meta.sh +121 -0
- package/hooks/session-start.sh +37 -9
- package/hooks/status-line.sh +50 -25
- package/hooks/watchtower-send.sh +44 -12
- package/install.sh +5 -3
- package/package.json +1 -1
- package/personas/auto.json +77 -19
- package/personas/professional.json +29 -7
- package/personas/spike.json +72 -18
- package/personas/sport.json +72 -18
- package/skills/checkpoint/SKILL.md +36 -11
- package/skills/confirm/SKILL.md +35 -0
- package/skills/restore/SKILL.md +40 -7
- package/skills/session-init/SKILL.md +45 -0
- package/uv.sh +84 -14
- package/watchtower/dashboard.html +125 -20
- package/watchtower/events.json +1 -22
package/personas/auto.json
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://json.schemastore.org/claude-code-settings.json",
|
|
3
3
|
"effort": "max",
|
|
4
|
-
|
|
5
4
|
"permissions": {
|
|
6
5
|
"allow": [
|
|
7
6
|
"Read(*)",
|
|
@@ -48,14 +47,22 @@
|
|
|
48
47
|
"Bash(git push --force * master)"
|
|
49
48
|
]
|
|
50
49
|
},
|
|
51
|
-
|
|
52
50
|
"hooks": {
|
|
53
51
|
"SessionStart": [
|
|
54
52
|
{
|
|
55
53
|
"matcher": "*",
|
|
56
54
|
"hooks": [
|
|
57
|
-
{
|
|
58
|
-
|
|
55
|
+
{
|
|
56
|
+
"type": "command",
|
|
57
|
+
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/session-start.sh",
|
|
58
|
+
"timeout": 5
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
"type": "command",
|
|
62
|
+
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/watchtower-send.sh SessionStart",
|
|
63
|
+
"timeout": 2,
|
|
64
|
+
"async": true
|
|
65
|
+
}
|
|
59
66
|
]
|
|
60
67
|
}
|
|
61
68
|
],
|
|
@@ -63,24 +70,63 @@
|
|
|
63
70
|
{
|
|
64
71
|
"matcher": "*",
|
|
65
72
|
"hooks": [
|
|
66
|
-
{
|
|
73
|
+
{
|
|
74
|
+
"type": "command",
|
|
75
|
+
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/confirm-prompt.sh",
|
|
76
|
+
"timeout": 3
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
"type": "command",
|
|
80
|
+
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/session-label-nag.sh",
|
|
81
|
+
"timeout": 3
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
"type": "command",
|
|
85
|
+
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/watchtower-send.sh UserPromptSubmit",
|
|
86
|
+
"timeout": 2,
|
|
87
|
+
"async": true
|
|
88
|
+
}
|
|
67
89
|
]
|
|
68
90
|
}
|
|
69
91
|
],
|
|
70
92
|
"PermissionRequest": [
|
|
71
|
-
{
|
|
72
|
-
|
|
73
|
-
|
|
93
|
+
{
|
|
94
|
+
"matcher": "*",
|
|
95
|
+
"hooks": [
|
|
96
|
+
{
|
|
97
|
+
"type": "command",
|
|
98
|
+
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/watchtower-send.sh PermissionRequest",
|
|
99
|
+
"timeout": 2,
|
|
100
|
+
"async": true
|
|
101
|
+
}
|
|
102
|
+
]
|
|
103
|
+
}
|
|
74
104
|
],
|
|
75
105
|
"Notification": [
|
|
76
|
-
{
|
|
77
|
-
|
|
78
|
-
|
|
106
|
+
{
|
|
107
|
+
"matcher": "*",
|
|
108
|
+
"hooks": [
|
|
109
|
+
{
|
|
110
|
+
"type": "command",
|
|
111
|
+
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/watchtower-send.sh Notification",
|
|
112
|
+
"timeout": 2,
|
|
113
|
+
"async": true
|
|
114
|
+
}
|
|
115
|
+
]
|
|
116
|
+
}
|
|
79
117
|
],
|
|
80
118
|
"PostToolUseFailure": [
|
|
81
|
-
{
|
|
82
|
-
|
|
83
|
-
|
|
119
|
+
{
|
|
120
|
+
"matcher": "*",
|
|
121
|
+
"hooks": [
|
|
122
|
+
{
|
|
123
|
+
"type": "command",
|
|
124
|
+
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/watchtower-send.sh PostToolUseFailure",
|
|
125
|
+
"timeout": 2,
|
|
126
|
+
"async": true
|
|
127
|
+
}
|
|
128
|
+
]
|
|
129
|
+
}
|
|
84
130
|
],
|
|
85
131
|
"PreToolUse": [
|
|
86
132
|
{
|
|
@@ -99,8 +145,17 @@
|
|
|
99
145
|
{
|
|
100
146
|
"matcher": "*",
|
|
101
147
|
"hooks": [
|
|
102
|
-
{
|
|
103
|
-
|
|
148
|
+
{
|
|
149
|
+
"type": "command",
|
|
150
|
+
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/session-timer.sh",
|
|
151
|
+
"timeout": 5
|
|
152
|
+
},
|
|
153
|
+
{
|
|
154
|
+
"type": "command",
|
|
155
|
+
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/watchtower-send.sh PostToolUse",
|
|
156
|
+
"timeout": 2,
|
|
157
|
+
"async": true
|
|
158
|
+
}
|
|
104
159
|
]
|
|
105
160
|
},
|
|
106
161
|
{
|
|
@@ -119,14 +174,17 @@
|
|
|
119
174
|
{
|
|
120
175
|
"matcher": "*",
|
|
121
176
|
"hooks": [
|
|
122
|
-
{
|
|
177
|
+
{
|
|
178
|
+
"type": "command",
|
|
179
|
+
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/session-end.sh",
|
|
180
|
+
"timeout": 10
|
|
181
|
+
}
|
|
123
182
|
]
|
|
124
183
|
}
|
|
125
184
|
]
|
|
126
185
|
},
|
|
127
|
-
|
|
128
186
|
"statusLine": {
|
|
129
187
|
"type": "command",
|
|
130
188
|
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/status-line.sh"
|
|
131
189
|
}
|
|
132
|
-
}
|
|
190
|
+
}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://json.schemastore.org/claude-code-settings.json",
|
|
3
3
|
"effort": "high",
|
|
4
|
-
|
|
5
4
|
"permissions": {
|
|
6
5
|
"allow": [
|
|
7
6
|
"Read(*)",
|
|
@@ -46,7 +45,6 @@
|
|
|
46
45
|
"Bash(git reset --hard origin/*)"
|
|
47
46
|
]
|
|
48
47
|
},
|
|
49
|
-
|
|
50
48
|
"hooks": {
|
|
51
49
|
"SessionStart": [
|
|
52
50
|
{
|
|
@@ -70,6 +68,16 @@
|
|
|
70
68
|
{
|
|
71
69
|
"matcher": "*",
|
|
72
70
|
"hooks": [
|
|
71
|
+
{
|
|
72
|
+
"type": "command",
|
|
73
|
+
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/confirm-prompt.sh",
|
|
74
|
+
"timeout": 3
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
"type": "command",
|
|
78
|
+
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/session-label-nag.sh",
|
|
79
|
+
"timeout": 3
|
|
80
|
+
},
|
|
73
81
|
{
|
|
74
82
|
"type": "command",
|
|
75
83
|
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/watchtower-send.sh UserPromptSubmit",
|
|
@@ -83,7 +91,12 @@
|
|
|
83
91
|
{
|
|
84
92
|
"matcher": "*",
|
|
85
93
|
"hooks": [
|
|
86
|
-
{
|
|
94
|
+
{
|
|
95
|
+
"type": "command",
|
|
96
|
+
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/watchtower-send.sh PermissionRequest",
|
|
97
|
+
"timeout": 2,
|
|
98
|
+
"async": true
|
|
99
|
+
}
|
|
87
100
|
]
|
|
88
101
|
}
|
|
89
102
|
],
|
|
@@ -91,7 +104,12 @@
|
|
|
91
104
|
{
|
|
92
105
|
"matcher": "*",
|
|
93
106
|
"hooks": [
|
|
94
|
-
{
|
|
107
|
+
{
|
|
108
|
+
"type": "command",
|
|
109
|
+
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/watchtower-send.sh Notification",
|
|
110
|
+
"timeout": 2,
|
|
111
|
+
"async": true
|
|
112
|
+
}
|
|
95
113
|
]
|
|
96
114
|
}
|
|
97
115
|
],
|
|
@@ -99,7 +117,12 @@
|
|
|
99
117
|
{
|
|
100
118
|
"matcher": "*",
|
|
101
119
|
"hooks": [
|
|
102
|
-
{
|
|
120
|
+
{
|
|
121
|
+
"type": "command",
|
|
122
|
+
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/watchtower-send.sh PostToolUseFailure",
|
|
123
|
+
"timeout": 2,
|
|
124
|
+
"async": true
|
|
125
|
+
}
|
|
103
126
|
]
|
|
104
127
|
}
|
|
105
128
|
],
|
|
@@ -176,9 +199,8 @@
|
|
|
176
199
|
}
|
|
177
200
|
]
|
|
178
201
|
},
|
|
179
|
-
|
|
180
202
|
"statusLine": {
|
|
181
203
|
"type": "command",
|
|
182
204
|
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/status-line.sh"
|
|
183
205
|
}
|
|
184
|
-
}
|
|
206
|
+
}
|
package/personas/spike.json
CHANGED
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
"$schema": "https://json.schemastore.org/claude-code-settings.json",
|
|
3
3
|
"model": "claude-opus-4-6",
|
|
4
4
|
"effort": "max",
|
|
5
|
-
|
|
6
5
|
"permissions": {
|
|
7
6
|
"allow": [
|
|
8
7
|
"Read(*)",
|
|
@@ -34,14 +33,22 @@
|
|
|
34
33
|
"Bash(npx *)"
|
|
35
34
|
]
|
|
36
35
|
},
|
|
37
|
-
|
|
38
36
|
"hooks": {
|
|
39
37
|
"SessionStart": [
|
|
40
38
|
{
|
|
41
39
|
"matcher": "*",
|
|
42
40
|
"hooks": [
|
|
43
|
-
{
|
|
44
|
-
|
|
41
|
+
{
|
|
42
|
+
"type": "command",
|
|
43
|
+
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/session-start.sh",
|
|
44
|
+
"timeout": 5
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
"type": "command",
|
|
48
|
+
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/watchtower-send.sh SessionStart",
|
|
49
|
+
"timeout": 2,
|
|
50
|
+
"async": true
|
|
51
|
+
}
|
|
45
52
|
]
|
|
46
53
|
}
|
|
47
54
|
],
|
|
@@ -49,30 +56,74 @@
|
|
|
49
56
|
{
|
|
50
57
|
"matcher": "*",
|
|
51
58
|
"hooks": [
|
|
52
|
-
{
|
|
59
|
+
{
|
|
60
|
+
"type": "command",
|
|
61
|
+
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/confirm-prompt.sh",
|
|
62
|
+
"timeout": 3
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
"type": "command",
|
|
66
|
+
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/session-label-nag.sh",
|
|
67
|
+
"timeout": 3
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
"type": "command",
|
|
71
|
+
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/watchtower-send.sh UserPromptSubmit",
|
|
72
|
+
"timeout": 2,
|
|
73
|
+
"async": true
|
|
74
|
+
}
|
|
53
75
|
]
|
|
54
76
|
}
|
|
55
77
|
],
|
|
56
78
|
"PermissionRequest": [
|
|
57
|
-
{
|
|
58
|
-
|
|
59
|
-
|
|
79
|
+
{
|
|
80
|
+
"matcher": "*",
|
|
81
|
+
"hooks": [
|
|
82
|
+
{
|
|
83
|
+
"type": "command",
|
|
84
|
+
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/watchtower-send.sh PermissionRequest",
|
|
85
|
+
"timeout": 2,
|
|
86
|
+
"async": true
|
|
87
|
+
}
|
|
88
|
+
]
|
|
89
|
+
}
|
|
60
90
|
],
|
|
61
91
|
"Notification": [
|
|
62
|
-
{
|
|
63
|
-
|
|
64
|
-
|
|
92
|
+
{
|
|
93
|
+
"matcher": "*",
|
|
94
|
+
"hooks": [
|
|
95
|
+
{
|
|
96
|
+
"type": "command",
|
|
97
|
+
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/watchtower-send.sh Notification",
|
|
98
|
+
"timeout": 2,
|
|
99
|
+
"async": true
|
|
100
|
+
}
|
|
101
|
+
]
|
|
102
|
+
}
|
|
65
103
|
],
|
|
66
104
|
"PostToolUseFailure": [
|
|
67
|
-
{
|
|
68
|
-
|
|
69
|
-
|
|
105
|
+
{
|
|
106
|
+
"matcher": "*",
|
|
107
|
+
"hooks": [
|
|
108
|
+
{
|
|
109
|
+
"type": "command",
|
|
110
|
+
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/watchtower-send.sh PostToolUseFailure",
|
|
111
|
+
"timeout": 2,
|
|
112
|
+
"async": true
|
|
113
|
+
}
|
|
114
|
+
]
|
|
115
|
+
}
|
|
70
116
|
],
|
|
71
117
|
"PostToolUse": [
|
|
72
118
|
{
|
|
73
119
|
"matcher": "*",
|
|
74
120
|
"hooks": [
|
|
75
|
-
{
|
|
121
|
+
{
|
|
122
|
+
"type": "command",
|
|
123
|
+
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/watchtower-send.sh PostToolUse",
|
|
124
|
+
"timeout": 2,
|
|
125
|
+
"async": true
|
|
126
|
+
}
|
|
76
127
|
]
|
|
77
128
|
},
|
|
78
129
|
{
|
|
@@ -91,14 +142,17 @@
|
|
|
91
142
|
{
|
|
92
143
|
"matcher": "*",
|
|
93
144
|
"hooks": [
|
|
94
|
-
{
|
|
145
|
+
{
|
|
146
|
+
"type": "command",
|
|
147
|
+
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/session-end.sh",
|
|
148
|
+
"timeout": 10
|
|
149
|
+
}
|
|
95
150
|
]
|
|
96
151
|
}
|
|
97
152
|
]
|
|
98
153
|
},
|
|
99
|
-
|
|
100
154
|
"statusLine": {
|
|
101
155
|
"type": "command",
|
|
102
156
|
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/status-line.sh"
|
|
103
157
|
}
|
|
104
|
-
}
|
|
158
|
+
}
|
package/personas/sport.json
CHANGED
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
"$schema": "https://json.schemastore.org/claude-code-settings.json",
|
|
3
3
|
"model": "claude-sonnet-4-6",
|
|
4
4
|
"effort": "high",
|
|
5
|
-
|
|
6
5
|
"permissions": {
|
|
7
6
|
"allow": [
|
|
8
7
|
"Read(*)",
|
|
@@ -20,14 +19,22 @@
|
|
|
20
19
|
"Bash(git *)"
|
|
21
20
|
]
|
|
22
21
|
},
|
|
23
|
-
|
|
24
22
|
"hooks": {
|
|
25
23
|
"SessionStart": [
|
|
26
24
|
{
|
|
27
25
|
"matcher": "*",
|
|
28
26
|
"hooks": [
|
|
29
|
-
{
|
|
30
|
-
|
|
27
|
+
{
|
|
28
|
+
"type": "command",
|
|
29
|
+
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/session-start.sh",
|
|
30
|
+
"timeout": 5
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
"type": "command",
|
|
34
|
+
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/watchtower-send.sh SessionStart",
|
|
35
|
+
"timeout": 2,
|
|
36
|
+
"async": true
|
|
37
|
+
}
|
|
31
38
|
]
|
|
32
39
|
}
|
|
33
40
|
],
|
|
@@ -35,30 +42,74 @@
|
|
|
35
42
|
{
|
|
36
43
|
"matcher": "*",
|
|
37
44
|
"hooks": [
|
|
38
|
-
{
|
|
45
|
+
{
|
|
46
|
+
"type": "command",
|
|
47
|
+
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/confirm-prompt.sh",
|
|
48
|
+
"timeout": 3
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
"type": "command",
|
|
52
|
+
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/session-label-nag.sh",
|
|
53
|
+
"timeout": 3
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
"type": "command",
|
|
57
|
+
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/watchtower-send.sh UserPromptSubmit",
|
|
58
|
+
"timeout": 2,
|
|
59
|
+
"async": true
|
|
60
|
+
}
|
|
39
61
|
]
|
|
40
62
|
}
|
|
41
63
|
],
|
|
42
64
|
"PermissionRequest": [
|
|
43
|
-
{
|
|
44
|
-
|
|
45
|
-
|
|
65
|
+
{
|
|
66
|
+
"matcher": "*",
|
|
67
|
+
"hooks": [
|
|
68
|
+
{
|
|
69
|
+
"type": "command",
|
|
70
|
+
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/watchtower-send.sh PermissionRequest",
|
|
71
|
+
"timeout": 2,
|
|
72
|
+
"async": true
|
|
73
|
+
}
|
|
74
|
+
]
|
|
75
|
+
}
|
|
46
76
|
],
|
|
47
77
|
"Notification": [
|
|
48
|
-
{
|
|
49
|
-
|
|
50
|
-
|
|
78
|
+
{
|
|
79
|
+
"matcher": "*",
|
|
80
|
+
"hooks": [
|
|
81
|
+
{
|
|
82
|
+
"type": "command",
|
|
83
|
+
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/watchtower-send.sh Notification",
|
|
84
|
+
"timeout": 2,
|
|
85
|
+
"async": true
|
|
86
|
+
}
|
|
87
|
+
]
|
|
88
|
+
}
|
|
51
89
|
],
|
|
52
90
|
"PostToolUseFailure": [
|
|
53
|
-
{
|
|
54
|
-
|
|
55
|
-
|
|
91
|
+
{
|
|
92
|
+
"matcher": "*",
|
|
93
|
+
"hooks": [
|
|
94
|
+
{
|
|
95
|
+
"type": "command",
|
|
96
|
+
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/watchtower-send.sh PostToolUseFailure",
|
|
97
|
+
"timeout": 2,
|
|
98
|
+
"async": true
|
|
99
|
+
}
|
|
100
|
+
]
|
|
101
|
+
}
|
|
56
102
|
],
|
|
57
103
|
"PostToolUse": [
|
|
58
104
|
{
|
|
59
105
|
"matcher": "*",
|
|
60
106
|
"hooks": [
|
|
61
|
-
{
|
|
107
|
+
{
|
|
108
|
+
"type": "command",
|
|
109
|
+
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/watchtower-send.sh PostToolUse",
|
|
110
|
+
"timeout": 2,
|
|
111
|
+
"async": true
|
|
112
|
+
}
|
|
62
113
|
]
|
|
63
114
|
},
|
|
64
115
|
{
|
|
@@ -77,14 +128,17 @@
|
|
|
77
128
|
{
|
|
78
129
|
"matcher": "*",
|
|
79
130
|
"hooks": [
|
|
80
|
-
{
|
|
131
|
+
{
|
|
132
|
+
"type": "command",
|
|
133
|
+
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/session-end.sh",
|
|
134
|
+
"timeout": 10
|
|
135
|
+
}
|
|
81
136
|
]
|
|
82
137
|
}
|
|
83
138
|
]
|
|
84
139
|
},
|
|
85
|
-
|
|
86
140
|
"statusLine": {
|
|
87
141
|
"type": "command",
|
|
88
142
|
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/status-line.sh"
|
|
89
143
|
}
|
|
90
|
-
}
|
|
144
|
+
}
|
|
@@ -3,7 +3,8 @@ name: checkpoint
|
|
|
3
3
|
description: >
|
|
4
4
|
Save a checkpoint of the current session — what was done, key decisions, current state,
|
|
5
5
|
and what's next. Use before ending a session, before /compact, or at any natural breakpoint.
|
|
6
|
-
|
|
6
|
+
Checkpoints are stored per-session under uv-out/checkpoints/<session-id>/, so concurrent
|
|
7
|
+
terminals don't clobber each other. /restore picks up the latest for the current session.
|
|
7
8
|
argument-hint: "[optional-label]"
|
|
8
9
|
user-invocable: true
|
|
9
10
|
allowed-tools:
|
|
@@ -12,27 +13,51 @@ allowed-tools:
|
|
|
12
13
|
- Bash(git status *)
|
|
13
14
|
- Bash(git diff *)
|
|
14
15
|
- Bash(git log *)
|
|
16
|
+
- Bash(git branch *)
|
|
17
|
+
- Bash(git rev-parse *)
|
|
15
18
|
- Bash(date *)
|
|
16
19
|
- Bash(ls *)
|
|
20
|
+
- Bash(mkdir *)
|
|
21
|
+
- Bash(cat *)
|
|
22
|
+
- Bash(echo *)
|
|
23
|
+
- Bash("$CLAUDE_PROJECT_DIR"/.claude/hooks/checkpoint-helper.sh *)
|
|
17
24
|
---
|
|
18
25
|
|
|
19
|
-
##
|
|
26
|
+
## Resolve session and checkpoint directory
|
|
20
27
|
|
|
21
|
-
|
|
28
|
+
!`"$CLAUDE_PROJECT_DIR"/.claude/hooks/checkpoint-helper.sh dir`
|
|
22
29
|
|
|
23
|
-
|
|
30
|
+
Use the absolute path printed above as `<checkpoint-dir>` for every file path below.
|
|
31
|
+
The directory is per-session — two `uv` launches in the same repo write to
|
|
32
|
+
different folders, so checkpoints don't collide.
|
|
24
33
|
|
|
25
|
-
|
|
34
|
+
## Session metadata
|
|
35
|
+
|
|
36
|
+
!`"$CLAUDE_PROJECT_DIR"/.claude/hooks/checkpoint-helper.sh meta`
|
|
37
|
+
|
|
38
|
+
## Frontmatter to embed at the top of the checkpoint
|
|
39
|
+
|
|
40
|
+
!`"$CLAUDE_PROJECT_DIR"/.claude/hooks/checkpoint-helper.sh frontmatter`
|
|
41
|
+
|
|
42
|
+
## Write a checkpoint
|
|
43
|
+
|
|
44
|
+
Write a file named `<checkpoint-dir>/YYYY-MM-DD-HHMM.md` using the current
|
|
45
|
+
timestamp. **Begin the file with the YAML frontmatter block printed above
|
|
46
|
+
exactly as shown** — `/restore` parses these fields when picking which
|
|
47
|
+
checkpoint to load.
|
|
48
|
+
|
|
49
|
+
Also write/overwrite `<checkpoint-dir>/latest.md` with the same content,
|
|
50
|
+
so the next session's `/restore` always finds the freshest state for this
|
|
51
|
+
session.
|
|
26
52
|
|
|
27
53
|
## Label
|
|
28
54
|
|
|
29
55
|
$ARGUMENTS
|
|
30
56
|
|
|
31
|
-
If a label was provided, include it in the filename:
|
|
32
|
-
|
|
33
|
-
## What to capture
|
|
57
|
+
If a label was provided, include it in the filename:
|
|
58
|
+
`<checkpoint-dir>/YYYY-MM-DD-HHMM-[label].md`
|
|
34
59
|
|
|
35
|
-
|
|
60
|
+
## Body structure (after the frontmatter)
|
|
36
61
|
|
|
37
62
|
```markdown
|
|
38
63
|
# Checkpoint: [date] [time] [label if provided]
|
|
@@ -76,5 +101,5 @@ Review the full conversation so far and write a structured checkpoint with these
|
|
|
76
101
|
|
|
77
102
|
- Be specific. "Worked on auth" is useless. "Added JWT refresh token rotation with 7-day expiry" is useful.
|
|
78
103
|
- Capture WHY decisions were made, not just what. The next session needs the rationale.
|
|
79
|
-
- Keep
|
|
80
|
-
-
|
|
104
|
+
- Keep the body under 80 lines. The frontmatter is required and not counted.
|
|
105
|
+
- Always include the YAML frontmatter — `/restore` reads it to pick the right checkpoint and to display session context.
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: confirm
|
|
3
|
+
description: >
|
|
4
|
+
Toggle confirm-mode (reframe-and-confirm long prompts) or change the word threshold.
|
|
5
|
+
When confirm-mode is on and a user prompt exceeds the threshold, the assistant will
|
|
6
|
+
restate the request and wait for confirmation before doing any work.
|
|
7
|
+
argument-hint: "[on|off|<number>|status]"
|
|
8
|
+
user-invocable: true
|
|
9
|
+
allowed-tools:
|
|
10
|
+
- Bash(mkdir *)
|
|
11
|
+
- Bash(echo *)
|
|
12
|
+
- Bash(cat *)
|
|
13
|
+
- Bash(printf *)
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## Apply /confirm $ARGUMENTS
|
|
17
|
+
|
|
18
|
+
!`STATE_DIR="${CLAUDE_PROJECT_DIR:-.}/.uv-suite-state"; mkdir -p "$STATE_DIR"; MODE_FILE="$STATE_DIR/confirm-mode.txt"; THRESH_FILE="$STATE_DIR/confirm-threshold.txt"; ARG=$(printf '%s' "$ARGUMENTS" | tr -d '[:space:]'); current_mode() { cat "$MODE_FILE" 2>/dev/null || echo "on"; }; current_thresh() { cat "$THRESH_FILE" 2>/dev/null || echo "50"; }; case "$ARG" in on) echo "on" > "$MODE_FILE"; echo "Confirm mode: ON (threshold: $(current_thresh) words)";; off) echo "off" > "$MODE_FILE"; echo "Confirm mode: OFF";; ''|status) echo "Confirm mode: $(current_mode) (threshold: $(current_thresh) words)";; *) if printf '%s' "$ARG" | grep -qE '^[0-9]+$'; then echo "$ARG" > "$THRESH_FILE"; echo "Threshold set to $ARG words (mode: $(current_mode))"; else echo "Usage: /confirm [on | off | <number> | status]"; fi;; esac`
|
|
19
|
+
|
|
20
|
+
## Instructions
|
|
21
|
+
|
|
22
|
+
Show the user the line of output above as the response — that line is the confirmation
|
|
23
|
+
that the toggle took effect. Do not add commentary. The change applies to the very
|
|
24
|
+
next user prompt; no restart needed.
|
|
25
|
+
|
|
26
|
+
## What this controls
|
|
27
|
+
|
|
28
|
+
- `on` / `off` — enable or disable the reframe-and-confirm behavior driven by
|
|
29
|
+
`hooks/confirm-prompt.sh` on every UserPromptSubmit event.
|
|
30
|
+
- `<number>` — set the word-count threshold above which prompts trigger a confirmation
|
|
31
|
+
step. Slash commands (`/foo ...`) are always exempt.
|
|
32
|
+
- `status` (or no argument) — print the current mode and threshold.
|
|
33
|
+
|
|
34
|
+
State lives in `${CLAUDE_PROJECT_DIR}/.uv-suite-state/confirm-mode.txt` and
|
|
35
|
+
`confirm-threshold.txt`. Defaults if missing: mode `on`, threshold `50`.
|