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.
@@ -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
- { "type": "command", "command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/session-start.sh", "timeout": 5 },
58
- { "type": "command", "command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/watchtower-send.sh SessionStart", "timeout": 2, "async": true }
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
- { "type": "command", "command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/watchtower-send.sh UserPromptSubmit", "timeout": 2, "async": true }
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
- { "matcher": "*", "hooks": [
72
- { "type": "command", "command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/watchtower-send.sh PermissionRequest", "timeout": 2, "async": true }
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
- { "matcher": "*", "hooks": [
77
- { "type": "command", "command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/watchtower-send.sh Notification", "timeout": 2, "async": true }
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
- { "matcher": "*", "hooks": [
82
- { "type": "command", "command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/watchtower-send.sh PostToolUseFailure", "timeout": 2, "async": true }
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
- { "type": "command", "command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/session-timer.sh", "timeout": 5 },
103
- { "type": "command", "command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/watchtower-send.sh PostToolUse", "timeout": 2, "async": true }
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
- { "type": "command", "command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/session-end.sh", "timeout": 10 }
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
- { "type": "command", "command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/watchtower-send.sh PermissionRequest", "timeout": 2, "async": true }
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
- { "type": "command", "command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/watchtower-send.sh Notification", "timeout": 2, "async": true }
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
- { "type": "command", "command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/watchtower-send.sh PostToolUseFailure", "timeout": 2, "async": true }
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
+ }
@@ -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
- { "type": "command", "command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/session-start.sh", "timeout": 5 },
44
- { "type": "command", "command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/watchtower-send.sh SessionStart", "timeout": 2, "async": true }
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
- { "type": "command", "command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/watchtower-send.sh UserPromptSubmit", "timeout": 2, "async": true }
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
- { "matcher": "*", "hooks": [
58
- { "type": "command", "command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/watchtower-send.sh PermissionRequest", "timeout": 2, "async": true }
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
- { "matcher": "*", "hooks": [
63
- { "type": "command", "command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/watchtower-send.sh Notification", "timeout": 2, "async": true }
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
- { "matcher": "*", "hooks": [
68
- { "type": "command", "command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/watchtower-send.sh PostToolUseFailure", "timeout": 2, "async": true }
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
- { "type": "command", "command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/watchtower-send.sh PostToolUse", "timeout": 2, "async": true }
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
- { "type": "command", "command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/session-end.sh", "timeout": 10 }
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
+ }
@@ -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
- { "type": "command", "command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/session-start.sh", "timeout": 5 },
30
- { "type": "command", "command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/watchtower-send.sh SessionStart", "timeout": 2, "async": true }
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
- { "type": "command", "command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/watchtower-send.sh UserPromptSubmit", "timeout": 2, "async": true }
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
- { "matcher": "*", "hooks": [
44
- { "type": "command", "command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/watchtower-send.sh PermissionRequest", "timeout": 2, "async": true }
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
- { "matcher": "*", "hooks": [
49
- { "type": "command", "command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/watchtower-send.sh Notification", "timeout": 2, "async": true }
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
- { "matcher": "*", "hooks": [
54
- { "type": "command", "command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/watchtower-send.sh PostToolUseFailure", "timeout": 2, "async": true }
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
- { "type": "command", "command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/watchtower-send.sh PostToolUse", "timeout": 2, "async": true }
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
- { "type": "command", "command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/session-end.sh", "timeout": 10 }
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
- The next session auto-loads the latest checkpoint.
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
- ## Write a checkpoint to uv-out/checkpoints/
26
+ ## Resolve session and checkpoint directory
20
27
 
21
- Create the directory `uv-out/checkpoints/` if it doesn't exist.
28
+ !`"$CLAUDE_PROJECT_DIR"/.claude/hooks/checkpoint-helper.sh dir`
22
29
 
23
- Write a file named `uv-out/checkpoints/YYYY-MM-DD-HHMM.md` (using the current timestamp).
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
- Also write/overwrite `uv-out/checkpoints/latest.md` with the same content (so the next session can always find the most recent checkpoint).
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: `uv-out/checkpoints/YYYY-MM-DD-HHMM-[label].md`
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
- Review the full conversation so far and write a structured checkpoint with these exact sections:
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 it under 80 lines. This isn't a novel it's a handoff.
80
- - Every checkpoint overwrites `latest.md` so the next session always finds the freshest state.
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`.