@memnexus-ai/mx-agent-cli 0.1.44 → 0.1.45
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/dist/__tests__/claude-sync.test.js +77 -13
- package/dist/__tests__/claude-sync.test.js.map +1 -1
- package/dist/commands/init.d.ts +9 -3
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +35 -21
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/start.d.ts.map +1 -1
- package/dist/commands/start.js +2 -1
- package/dist/commands/start.js.map +1 -1
- package/dist/lib/claude.d.ts.map +1 -1
- package/dist/lib/claude.js +126 -12
- package/dist/lib/claude.js.map +1 -1
- package/dist/lib/templates.d.ts +16 -1
- package/dist/lib/templates.d.ts.map +1 -1
- package/dist/lib/templates.js +373 -29
- package/dist/lib/templates.js.map +1 -1
- package/package.json +1 -1
package/dist/lib/templates.js
CHANGED
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
* Grants bash access and restricts to the worktree directory.
|
|
10
10
|
*/
|
|
11
11
|
export const SETTINGS_JSON_TEMPLATE = JSON.stringify({
|
|
12
|
+
CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS: '1',
|
|
12
13
|
hooks: {
|
|
13
14
|
PreToolUse: [
|
|
14
15
|
{
|
|
@@ -16,19 +17,25 @@ export const SETTINGS_JSON_TEMPLATE = JSON.stringify({
|
|
|
16
17
|
hooks: [{ type: 'command', command: '.claude/hooks/worktree-guard.sh' }],
|
|
17
18
|
},
|
|
18
19
|
],
|
|
20
|
+
PreCompact: [
|
|
21
|
+
{
|
|
22
|
+
matcher: '',
|
|
23
|
+
hooks: [{ type: 'command', command: '.claude/hooks/auto-checkpoint.sh' }],
|
|
24
|
+
},
|
|
25
|
+
],
|
|
26
|
+
SessionStart: [
|
|
27
|
+
{
|
|
28
|
+
matcher: 'compact',
|
|
29
|
+
hooks: [{ type: 'command', command: '.claude/hooks/reload-checkpoint.sh' }],
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
matcher: '',
|
|
33
|
+
hooks: [{ type: 'command', command: '.claude/hooks/set-terminal-appearance.sh' }],
|
|
34
|
+
},
|
|
35
|
+
],
|
|
19
36
|
},
|
|
20
37
|
permissions: {
|
|
21
38
|
allow: [
|
|
22
|
-
'Bash',
|
|
23
|
-
'Read',
|
|
24
|
-
'Edit',
|
|
25
|
-
'Write',
|
|
26
|
-
'Glob',
|
|
27
|
-
'Grep',
|
|
28
|
-
'WebFetch',
|
|
29
|
-
'WebSearch',
|
|
30
|
-
'Task',
|
|
31
|
-
'NotebookEdit',
|
|
32
39
|
'mcp__MX__search_memories',
|
|
33
40
|
'mcp__MX__create_memory',
|
|
34
41
|
'mcp__MX__retrieve_episodic_memory',
|
|
@@ -40,6 +47,16 @@ export const SETTINGS_JSON_TEMPLATE = JSON.stringify({
|
|
|
40
47
|
'mcp__MX__graphrag_query',
|
|
41
48
|
'mcp__MX__get_memory_usage',
|
|
42
49
|
'mcp__MX__list_conversations',
|
|
50
|
+
'Bash',
|
|
51
|
+
'Read',
|
|
52
|
+
'Edit',
|
|
53
|
+
'Write',
|
|
54
|
+
'Glob',
|
|
55
|
+
'Grep',
|
|
56
|
+
'WebFetch',
|
|
57
|
+
'WebSearch',
|
|
58
|
+
'Task',
|
|
59
|
+
'NotebookEdit',
|
|
43
60
|
],
|
|
44
61
|
deny: [
|
|
45
62
|
'Bash(rm -rf /*)',
|
|
@@ -52,6 +69,12 @@ export const SETTINGS_JSON_TEMPLATE = JSON.stringify({
|
|
|
52
69
|
'Bash(git reset --hard *)',
|
|
53
70
|
'Bash(git clean -fd *)',
|
|
54
71
|
'Bash(git clean -fdx *)',
|
|
72
|
+
'Bash(kubectl delete namespace *)',
|
|
73
|
+
'Bash(kubectl delete node *)',
|
|
74
|
+
'Bash(helm uninstall *)',
|
|
75
|
+
'Bash(az group delete *)',
|
|
76
|
+
'Bash(az aks delete *)',
|
|
77
|
+
'Bash(az deployment group delete *)',
|
|
55
78
|
'Bash(git checkout main)',
|
|
56
79
|
'Bash(git checkout main *)',
|
|
57
80
|
'Bash(git checkout -)',
|
|
@@ -75,6 +98,18 @@ export const SETTINGS_JSON_TEMPLATE = JSON.stringify({
|
|
|
75
98
|
'Bash(docker kill *)',
|
|
76
99
|
'Bash(docker rm *)',
|
|
77
100
|
'Bash(docker rmi *)',
|
|
101
|
+
'Bash(kubectl delete pod *)',
|
|
102
|
+
'Bash(kubectl delete deployment *)',
|
|
103
|
+
'Bash(kubectl delete service *)',
|
|
104
|
+
'Bash(kubectl drain *)',
|
|
105
|
+
'Bash(kubectl taint *)',
|
|
106
|
+
'Bash(helm upgrade *)',
|
|
107
|
+
'Bash(helm rollback *)',
|
|
108
|
+
'Bash(az aks upgrade *)',
|
|
109
|
+
'Bash(az aks scale *)',
|
|
110
|
+
'Bash(az deployment group create *)',
|
|
111
|
+
'Bash(az vm delete *)',
|
|
112
|
+
'Bash(az storage account delete *)',
|
|
78
113
|
],
|
|
79
114
|
},
|
|
80
115
|
}, null, 2);
|
|
@@ -83,22 +118,31 @@ export const SETTINGS_JSON_TEMPLATE = JSON.stringify({
|
|
|
83
118
|
* Blocks branch switching to main and force-pushes.
|
|
84
119
|
*/
|
|
85
120
|
export const WORKTREE_GUARD_SH_TEMPLATE = `#!/bin/bash
|
|
86
|
-
#
|
|
87
|
-
#
|
|
88
|
-
# Customize for your project's safety requirements.
|
|
121
|
+
# Worktree isolation guard - runs before every Bash command
|
|
122
|
+
# Exit 0 = allow, Exit 2 = block (non-zero exit blocks the command)
|
|
89
123
|
#
|
|
90
|
-
#
|
|
124
|
+
# This hook enforces worktree isolation by:
|
|
125
|
+
# 1. Blocking cd commands that leave the worktree directory
|
|
126
|
+
# 2. Blocking dangerous git operations (belt-and-suspenders with settings.json)
|
|
127
|
+
#
|
|
128
|
+
# Requires environment variables set by \`worktree start\`:
|
|
129
|
+
# - CLAUDE_WORKTREE_PATH: Absolute path to worktree (e.g., /workspace/.worktrees/foo)
|
|
130
|
+
# - CLAUDE_WORKTREE_NAME: Worktree name (e.g., foo)
|
|
91
131
|
|
|
92
132
|
set -euo pipefail
|
|
93
133
|
|
|
94
|
-
# Read tool input from stdin (JSON format)
|
|
134
|
+
# Read the tool input from stdin (JSON format)
|
|
95
135
|
INPUT=$(cat)
|
|
136
|
+
|
|
137
|
+
# Extract the command - handle both direct command and tool_input formats
|
|
96
138
|
COMMAND=$(echo "$INPUT" | jq -r '.tool_input.command // .command // empty' 2>/dev/null)
|
|
97
139
|
|
|
98
140
|
if [[ -z "$COMMAND" ]]; then
|
|
141
|
+
# Can't parse command, allow it (fail open)
|
|
99
142
|
exit 0
|
|
100
143
|
fi
|
|
101
144
|
|
|
145
|
+
# Get worktree path from environment
|
|
102
146
|
WORKTREE_PATH="\${CLAUDE_WORKTREE_PATH:-}"
|
|
103
147
|
|
|
104
148
|
# If no worktree restriction set, allow everything
|
|
@@ -106,52 +150,352 @@ if [[ -z "$WORKTREE_PATH" ]]; then
|
|
|
106
150
|
exit 0
|
|
107
151
|
fi
|
|
108
152
|
|
|
153
|
+
# Normalize worktree path (remove trailing slash)
|
|
109
154
|
WORKTREE_PATH="\${WORKTREE_PATH%/}"
|
|
110
155
|
|
|
111
|
-
#
|
|
112
|
-
|
|
113
|
-
|
|
156
|
+
# Get current working directory
|
|
157
|
+
CURRENT_DIR=$(pwd)
|
|
158
|
+
|
|
159
|
+
# ============================================================
|
|
160
|
+
# Rule 1: Block cd to paths outside worktree
|
|
161
|
+
# ============================================================
|
|
162
|
+
if echo "$COMMAND" | grep -qE '^\\s*cd\\s+' || echo "$COMMAND" | grep -qE '&&\\s*cd\\s+' || echo "$COMMAND" | grep -qE ';\\s*cd\\s+'; then
|
|
163
|
+
# Extract cd target(s) from command
|
|
164
|
+
# This handles: cd /path, cd path, command && cd path, etc.
|
|
165
|
+
|
|
166
|
+
# Get all cd targets
|
|
167
|
+
CD_TARGETS=$(echo "$COMMAND" | grep -oE 'cd\\s+[^;&|]+' | sed 's/cd\\s*//' | tr -d '"'"'" || true)
|
|
168
|
+
|
|
114
169
|
for TARGET in $CD_TARGETS; do
|
|
170
|
+
# Skip empty targets
|
|
115
171
|
[[ -z "$TARGET" ]] && continue
|
|
172
|
+
|
|
173
|
+
# Resolve the path
|
|
116
174
|
if [[ "$TARGET" == /* ]]; then
|
|
175
|
+
# Absolute path
|
|
117
176
|
RESOLVED="$TARGET"
|
|
177
|
+
elif [[ "$TARGET" == "~"* ]]; then
|
|
178
|
+
# Home directory path
|
|
179
|
+
RESOLVED="\${TARGET/#\\~/$HOME}"
|
|
118
180
|
else
|
|
119
|
-
|
|
181
|
+
# Relative path - resolve from current directory
|
|
182
|
+
RESOLVED=$(cd "$CURRENT_DIR" 2>/dev/null && cd "$TARGET" 2>/dev/null && pwd) || RESOLVED=""
|
|
120
183
|
fi
|
|
184
|
+
|
|
185
|
+
# Normalize resolved path
|
|
121
186
|
RESOLVED="\${RESOLVED%/}"
|
|
122
|
-
|
|
123
|
-
|
|
187
|
+
|
|
188
|
+
# Allow /tmp and /var/tmp
|
|
189
|
+
if [[ "$RESOLVED" == /tmp* ]] || [[ "$RESOLVED" == /var/tmp* ]]; then
|
|
190
|
+
continue
|
|
191
|
+
fi
|
|
192
|
+
|
|
193
|
+
# Allow paths within worktree
|
|
194
|
+
if [[ "$RESOLVED" == "$WORKTREE_PATH"* ]]; then
|
|
195
|
+
continue
|
|
196
|
+
fi
|
|
197
|
+
|
|
198
|
+
# Allow the scratchpad directory
|
|
199
|
+
if [[ "$RESOLVED" == *"/scratchpad"* ]]; then
|
|
200
|
+
continue
|
|
201
|
+
fi
|
|
202
|
+
|
|
203
|
+
# Allow the user's home directory (for inspecting global tools, configs, etc.)
|
|
204
|
+
if [[ -n "$HOME" ]] && [[ "$RESOLVED" == "$HOME"* ]]; then
|
|
205
|
+
continue
|
|
206
|
+
fi
|
|
207
|
+
|
|
208
|
+
# Block: path is outside worktree
|
|
124
209
|
if [[ -n "$RESOLVED" ]]; then
|
|
125
|
-
echo "
|
|
210
|
+
echo ""
|
|
211
|
+
echo "BLOCKED: Cannot navigate outside worktree"
|
|
212
|
+
echo " Target: $TARGET"
|
|
213
|
+
echo " Resolved: $RESOLVED"
|
|
214
|
+
echo " Allowed: $WORKTREE_PATH (and /tmp)"
|
|
215
|
+
echo ""
|
|
216
|
+
echo "You are working in worktree: \${CLAUDE_WORKTREE_NAME:-unknown}"
|
|
217
|
+
echo "Stay within your assigned worktree directory."
|
|
218
|
+
echo ""
|
|
126
219
|
exit 2
|
|
127
220
|
fi
|
|
128
221
|
done
|
|
129
222
|
fi
|
|
130
223
|
|
|
131
|
-
#
|
|
224
|
+
# ============================================================
|
|
225
|
+
# Rule 2: Block git operations that could tangle state
|
|
226
|
+
# (Belt-and-suspenders with settings.json deny rules)
|
|
227
|
+
# ============================================================
|
|
228
|
+
|
|
229
|
+
# Block checkout to main
|
|
132
230
|
if echo "$COMMAND" | grep -qE 'git\\s+(checkout|switch)\\s+main(\\s|$)'; then
|
|
133
|
-
echo "
|
|
231
|
+
echo ""
|
|
232
|
+
echo "BLOCKED: Cannot switch to main branch"
|
|
233
|
+
echo " Command: $COMMAND"
|
|
234
|
+
echo " Worktree: \${CLAUDE_WORKTREE_NAME:-unknown}"
|
|
235
|
+
echo ""
|
|
236
|
+
echo "To work on main, use a different worktree or the root workspace."
|
|
237
|
+
echo ""
|
|
134
238
|
exit 2
|
|
135
239
|
fi
|
|
136
240
|
|
|
137
|
-
# Block new branch creation
|
|
241
|
+
# Block checkout -b (new branch creation)
|
|
138
242
|
if echo "$COMMAND" | grep -qE 'git\\s+(checkout\\s+-b|switch\\s+(-c|--create))'; then
|
|
139
|
-
echo "
|
|
243
|
+
echo ""
|
|
244
|
+
echo "BLOCKED: Cannot create new branches"
|
|
245
|
+
echo " Command: $COMMAND"
|
|
246
|
+
echo " Worktree: \${CLAUDE_WORKTREE_NAME:-unknown}"
|
|
247
|
+
echo ""
|
|
248
|
+
echo "Work on your assigned branch. Create PRs to merge changes."
|
|
249
|
+
echo ""
|
|
140
250
|
exit 2
|
|
141
251
|
fi
|
|
142
252
|
|
|
143
253
|
# Block merge
|
|
144
254
|
if echo "$COMMAND" | grep -qE 'git\\s+merge\\s'; then
|
|
145
|
-
echo "
|
|
255
|
+
echo ""
|
|
256
|
+
echo "BLOCKED: Cannot merge branches directly"
|
|
257
|
+
echo " Command: $COMMAND"
|
|
258
|
+
echo " Worktree: \${CLAUDE_WORKTREE_NAME:-unknown}"
|
|
259
|
+
echo ""
|
|
260
|
+
echo "Use pull requests to merge changes."
|
|
261
|
+
echo ""
|
|
146
262
|
exit 2
|
|
147
263
|
fi
|
|
148
264
|
|
|
149
265
|
# Block push to main
|
|
150
|
-
if echo "$COMMAND" | grep -qE 'git\\s+push\\s
|
|
151
|
-
echo "
|
|
266
|
+
if echo "$COMMAND" | grep -qE 'git\\s+push\\s+.*\\s*origin\\s+main'; then
|
|
267
|
+
echo ""
|
|
268
|
+
echo "BLOCKED: Cannot push to main"
|
|
269
|
+
echo " Command: $COMMAND"
|
|
270
|
+
echo ""
|
|
271
|
+
echo "Push to your worktree branch and create a PR."
|
|
272
|
+
echo ""
|
|
152
273
|
exit 2
|
|
153
274
|
fi
|
|
154
275
|
|
|
276
|
+
# ============================================================
|
|
277
|
+
# All checks passed - allow the command
|
|
278
|
+
# ============================================================
|
|
279
|
+
exit 0
|
|
280
|
+
`;
|
|
281
|
+
/**
|
|
282
|
+
* auto-checkpoint.sh — PreCompact hook that saves a checkpoint memory
|
|
283
|
+
* before context compaction so agents can resume after losing context.
|
|
284
|
+
*/
|
|
285
|
+
export const AUTO_CHECKPOINT_SH_TEMPLATE = `#!/bin/bash
|
|
286
|
+
# auto-checkpoint.sh — Claude Code PreCompact hook
|
|
287
|
+
# Saves a checkpoint memory before context compaction so agents can resume
|
|
288
|
+
# after losing context. Uses the /mx-checkpoint template format.
|
|
289
|
+
#
|
|
290
|
+
# Fires on: PreCompact (auto or manual compaction)
|
|
291
|
+
# Input: JSON on stdin with transcript_path, session_id, trigger
|
|
292
|
+
# Output: none (side-effect only — saves memory via mx CLI)
|
|
293
|
+
# Exit: always 0 (never blocks compaction)
|
|
294
|
+
|
|
295
|
+
# Fail-open: any error → allow compaction without saving
|
|
296
|
+
trap 'exit 0' ERR
|
|
297
|
+
|
|
298
|
+
# ── 1. Parse hook input ──────────────────────────────────────────────────
|
|
299
|
+
INPUT=$(cat)
|
|
300
|
+
|
|
301
|
+
TRANSCRIPT_PATH=$(echo "$INPUT" | jq -r '.transcript_path // empty' 2>/dev/null)
|
|
302
|
+
SESSION_ID=$(echo "$INPUT" | jq -r '.session_id // empty' 2>/dev/null)
|
|
303
|
+
TRIGGER=$(echo "$INPUT" | jq -r '.trigger // .source // "auto"' 2>/dev/null)
|
|
304
|
+
|
|
305
|
+
# Skip if no transcript available or jq missing
|
|
306
|
+
if [[ -z "$TRANSCRIPT_PATH" || ! -f "$TRANSCRIPT_PATH" ]]; then
|
|
307
|
+
exit 0
|
|
308
|
+
fi
|
|
309
|
+
|
|
310
|
+
command -v jq >/dev/null 2>&1 || exit 0
|
|
311
|
+
command -v mx >/dev/null 2>&1 || exit 0
|
|
312
|
+
|
|
313
|
+
# ── 2. Extract context from transcript ───────────────────────────────────
|
|
314
|
+
|
|
315
|
+
# Recent user/assistant text (last ~200 lines of transcript, text content only)
|
|
316
|
+
RECENT_TEXT=$(tail -200 "$TRANSCRIPT_PATH" | \\
|
|
317
|
+
jq -r '
|
|
318
|
+
select(.type == "user" or .type == "assistant") |
|
|
319
|
+
.message.content[]? |
|
|
320
|
+
select(.type == "text") |
|
|
321
|
+
.text // empty
|
|
322
|
+
' 2>/dev/null | tail -c 8000)
|
|
323
|
+
|
|
324
|
+
# Files touched (from tool_use entries: Read, Edit, Write, Glob)
|
|
325
|
+
FILES_TOUCHED=$(tail -500 "$TRANSCRIPT_PATH" | \\
|
|
326
|
+
jq -r '
|
|
327
|
+
select(.type == "assistant") |
|
|
328
|
+
.message.content[]? |
|
|
329
|
+
select(.type == "tool_use") |
|
|
330
|
+
.input.file_path // empty
|
|
331
|
+
' 2>/dev/null | grep -v '^\$' | sort -u | head -30)
|
|
332
|
+
|
|
333
|
+
# Git branch and PR references
|
|
334
|
+
GIT_BRANCH="\${CLAUDE_WORKTREE_BRANCH:-}"
|
|
335
|
+
if [[ -z "$GIT_BRANCH" ]]; then
|
|
336
|
+
GIT_BRANCH=$(git branch --show-current 2>/dev/null || echo "unknown")
|
|
337
|
+
fi
|
|
338
|
+
|
|
339
|
+
# GitHub issue/PR references from recent text
|
|
340
|
+
GH_REFS=$(echo "$RECENT_TEXT" | grep -oE '#[0-9]+|PR #[0-9]+|issue #[0-9]+' 2>/dev/null | sort -u | head -10 | tr '\\n' ', ' | sed 's/,\$//')
|
|
341
|
+
|
|
342
|
+
# Worktree info
|
|
343
|
+
WORKTREE_NAME="\${CLAUDE_WORKTREE_NAME:-unknown}"
|
|
344
|
+
WORKTREE_PATH="\${CLAUDE_WORKTREE_PATH:-$(pwd)}"
|
|
345
|
+
|
|
346
|
+
# ── 3. Format checkpoint memory ─────────────────────────────────────────
|
|
347
|
+
|
|
348
|
+
# Build files list (indented)
|
|
349
|
+
FILES_LIST=""
|
|
350
|
+
if [[ -n "$FILES_TOUCHED" ]]; then
|
|
351
|
+
FILES_LIST=$(echo "$FILES_TOUCHED" | sed 's/^/- /')
|
|
352
|
+
fi
|
|
353
|
+
|
|
354
|
+
CONTENT="[Auto-Checkpoint] Context compaction (\${TRIGGER}) — \${WORKTREE_NAME}
|
|
355
|
+
|
|
356
|
+
Branch: \${GIT_BRANCH}
|
|
357
|
+
Session: \${SESSION_ID}
|
|
358
|
+
GitHub refs: \${GH_REFS:-none detected}
|
|
359
|
+
|
|
360
|
+
Goal: [Auto-captured checkpoint before context compaction]
|
|
361
|
+
|
|
362
|
+
Current status: Context window reached capacity. This checkpoint captures the working state just before compaction so the next session can resume.
|
|
363
|
+
|
|
364
|
+
Key files:
|
|
365
|
+
\${FILES_LIST:-No file paths detected in recent transcript.}
|
|
366
|
+
|
|
367
|
+
Key terms: \${WORKTREE_NAME}, \${GIT_BRANCH}, auto-checkpoint, context-compaction
|
|
368
|
+
|
|
369
|
+
Next steps: Resume work from this checkpoint. Review the recent context below to understand what was in progress.
|
|
370
|
+
|
|
371
|
+
---
|
|
372
|
+
Recent context (last messages before compaction):
|
|
373
|
+
|
|
374
|
+
\${RECENT_TEXT:-No recent text extracted from transcript.}"
|
|
375
|
+
|
|
376
|
+
# ── 4. Save checkpoint memory ───────────────────────────────────────────
|
|
377
|
+
|
|
378
|
+
# Use a named memory so it's easy to find and gets overwritten each compaction
|
|
379
|
+
mx memories create \\
|
|
380
|
+
--name "auto-checkpoint-\${WORKTREE_NAME}" \\
|
|
381
|
+
--conversation-id "NEW" \\
|
|
382
|
+
--content "$CONTENT" \\
|
|
383
|
+
--topics "checkpoint,context-compaction" \\
|
|
384
|
+
>/dev/null 2>&1 || true
|
|
385
|
+
|
|
386
|
+
# Always allow compaction to proceed
|
|
387
|
+
exit 0
|
|
388
|
+
`;
|
|
389
|
+
/**
|
|
390
|
+
* reload-checkpoint.sh — SessionStart hook (compact) that re-injects
|
|
391
|
+
* the auto-checkpoint memory after context compaction.
|
|
392
|
+
*/
|
|
393
|
+
export const RELOAD_CHECKPOINT_SH_TEMPLATE = `#!/bin/bash
|
|
394
|
+
# reload-checkpoint.sh — Claude Code SessionStart hook (matcher: compact)
|
|
395
|
+
# Re-injects the auto-checkpoint memory after context compaction.
|
|
396
|
+
#
|
|
397
|
+
# Fires on: SessionStart with source=compact (after compaction)
|
|
398
|
+
# Input: JSON on stdin with session_id, source
|
|
399
|
+
# Output: stdout text is injected into Claude's context
|
|
400
|
+
# Exit: always 0
|
|
401
|
+
|
|
402
|
+
# Fail-open: any error → start session without checkpoint injection
|
|
403
|
+
trap 'exit 0' ERR
|
|
404
|
+
|
|
405
|
+
# ── 1. Determine worktree name ──────────────────────────────────────────
|
|
406
|
+
|
|
407
|
+
WORKTREE_NAME="\${CLAUDE_WORKTREE_NAME:-}"
|
|
408
|
+
|
|
409
|
+
# If no worktree env var, try to detect from cwd
|
|
410
|
+
if [[ -z "$WORKTREE_NAME" ]]; then
|
|
411
|
+
INPUT=$(cat)
|
|
412
|
+
CWD=$(echo "$INPUT" | jq -r '.cwd // empty' 2>/dev/null)
|
|
413
|
+
if [[ "$CWD" == */.worktrees/* ]]; then
|
|
414
|
+
WORKTREE_NAME=$(echo "$CWD" | sed 's|.*/.worktrees/||' | cut -d'/' -f1)
|
|
415
|
+
fi
|
|
416
|
+
fi
|
|
417
|
+
|
|
418
|
+
# Can't identify worktree → nothing to reload
|
|
419
|
+
if [[ -z "$WORKTREE_NAME" ]]; then
|
|
420
|
+
exit 0
|
|
421
|
+
fi
|
|
422
|
+
|
|
423
|
+
command -v mx >/dev/null 2>&1 || exit 0
|
|
424
|
+
|
|
425
|
+
# ── 2. Retrieve checkpoint memory ───────────────────────────────────────
|
|
426
|
+
|
|
427
|
+
CHECKPOINT=$(mx memories get --name "auto-checkpoint-\${WORKTREE_NAME}" 2>/dev/null)
|
|
428
|
+
|
|
429
|
+
if [[ -z "$CHECKPOINT" || "$CHECKPOINT" == *"not found"* || "$CHECKPOINT" == *"404"* ]]; then
|
|
430
|
+
exit 0
|
|
431
|
+
fi
|
|
432
|
+
|
|
433
|
+
# Extract just the content field from the JSON response
|
|
434
|
+
CONTENT=$(echo "$CHECKPOINT" | jq -r '.content // empty' 2>/dev/null)
|
|
435
|
+
|
|
436
|
+
if [[ -z "$CONTENT" ]]; then
|
|
437
|
+
exit 0
|
|
438
|
+
fi
|
|
439
|
+
|
|
440
|
+
# ── 3. Output checkpoint for context injection ──────────────────────────
|
|
441
|
+
# Text written to stdout by SessionStart hooks is added to Claude's context.
|
|
442
|
+
|
|
443
|
+
cat <<CHECKPOINT_EOF
|
|
444
|
+
## Auto-Checkpoint Recovery
|
|
445
|
+
|
|
446
|
+
The following checkpoint was automatically saved before the last context compaction.
|
|
447
|
+
Use it to resume your work. The checkpoint captures what you were working on,
|
|
448
|
+
which files were involved, and the recent conversation context.
|
|
449
|
+
|
|
450
|
+
---
|
|
451
|
+
|
|
452
|
+
\${CONTENT}
|
|
453
|
+
|
|
454
|
+
---
|
|
455
|
+
|
|
456
|
+
**Action:** Review this checkpoint and continue where you left off.
|
|
457
|
+
If you need more context, search memories with: mx memories search --query "<topic>" --recent 24h
|
|
458
|
+
CHECKPOINT_EOF
|
|
459
|
+
|
|
460
|
+
exit 0
|
|
461
|
+
`;
|
|
462
|
+
/**
|
|
463
|
+
* set-terminal-appearance.sh — SessionStart hook that sets VS Code terminal
|
|
464
|
+
* tab title and color via OSC escape sequences written to /dev/tty.
|
|
465
|
+
*/
|
|
466
|
+
export const SET_TERMINAL_APPEARANCE_SH_TEMPLATE = `#!/bin/bash
|
|
467
|
+
# set-terminal-appearance.sh — Claude Code SessionStart hook
|
|
468
|
+
# Sets the VS Code terminal tab title and color for the agent team.
|
|
469
|
+
#
|
|
470
|
+
# Fires on: SessionStart (all — no matcher filter)
|
|
471
|
+
# Input: JSON on stdin (ignored)
|
|
472
|
+
# Output: none (side-effect: writes OSC sequences to /dev/tty)
|
|
473
|
+
# Exit: always 0
|
|
474
|
+
#
|
|
475
|
+
# Reads CLAUDE_TEAM_NAME and CLAUDE_TEAM_COLOR from environment
|
|
476
|
+
# (set by mx-agent start via launchClaudeSession).
|
|
477
|
+
# Writes escape sequences to /dev/tty to bypass Claude's stdin/stdout,
|
|
478
|
+
# ensuring the tab title/color persist after Claude's TUI initializes.
|
|
479
|
+
|
|
480
|
+
TEAM_NAME="\${CLAUDE_TEAM_NAME:-}"
|
|
481
|
+
TEAM_COLOR="\${CLAUDE_TEAM_COLOR:-}"
|
|
482
|
+
|
|
483
|
+
# Nothing to set — not launched via mx-agent
|
|
484
|
+
if [[ -z "$TEAM_NAME" ]]; then
|
|
485
|
+
exit 0
|
|
486
|
+
fi
|
|
487
|
+
|
|
488
|
+
# Drain stdin (hook contract requires reading input)
|
|
489
|
+
cat > /dev/null 2>&1 || true
|
|
490
|
+
|
|
491
|
+
# OSC 0: Set terminal tab title
|
|
492
|
+
printf '\\033]0;%s\\007' "$TEAM_NAME" > /dev/tty 2>/dev/null || true
|
|
493
|
+
|
|
494
|
+
# OSC 633;P;tabColor: Set VS Code tab color (VS Code 1.94+ shell integration)
|
|
495
|
+
if [[ -n "$TEAM_COLOR" ]]; then
|
|
496
|
+
printf '\\033]633;P;tabColor=%s\\007' "$TEAM_COLOR" > /dev/tty 2>/dev/null || true
|
|
497
|
+
fi
|
|
498
|
+
|
|
155
499
|
exit 0
|
|
156
500
|
`;
|
|
157
501
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/lib/templates.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;GAGG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,IAAI,CAAC,SAAS,CAClD;IACE,KAAK,EAAE;QACL,UAAU,EAAE;YACV;gBACE,OAAO,EAAE,MAAM;gBACf,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,iCAAiC,EAAE,CAAC;aACzE;SACF;
|
|
1
|
+
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/lib/templates.ts"],"names":[],"mappings":"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"}
|