cd9eec112d
Changes:
- skills/lib.sh:
- HOME_DIR default changed from $HOME to <workspace_root> (workspace self-sufficient)
- Added CLAUDE_PROJECT_DIR / LOCAL_BIN env var pattern (default $HOME, overridable)
- skills/tmux-agent-orchestrate-monitor/scripts/reconcile.sh:
- STATE_DIR moved from $HOME/.cache/... to <workspace>/.cache/tmux-agent-orchestrate-monitor
- skills/tmux-agent-orchestrate-create/scripts/create_session.sh:
- WRAPPER uses $LOCAL_BIN env var (default $HOME/.local/bin)
- 6 SKILL.md: examples and explanations updated to mention env var override capability
User/portability contract:
- Workspace-internal data: .hermes/ + .cache/ (moves with workspace)
- User/system data: $HOME/* (overridable via CLAUDE_PROJECT_DIR, LOCAL_BIN)
- All env vars follow: ${VAR:-default} pattern with documented defaults
Verified on isolated server -L agy-homeport-test (kill-server after):
- syntax check PASS
- E2E: defaults resolve to workspace-relative paths
- E2E: env var override correctly changes paths
- 0 leftover direct $HOME references in code
- Global skill non-interference verified
- Main isolated server -L multi-agent-canary untouched
7.4 KiB
7.4 KiB
name, description, version, author, license, platforms, environments, metadata
| name | description | version | author | license | platforms | environments | metadata | ||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| tmux-agent-orchestrate-delete | Terminate an agent tmux session (claude, antigravity/agy) and update .hermes/agent-sessions.yaml to mark it terminated with timestamp. Does NOT delete on-disk conversation artifacts (jsonl/db) — those are preserved for future resume. Use when ending a work session, switching to a different one, or cleaning up before a fresh start. | 1.0.0 | godopu | MIT |
|
|
|
Multi-Agent Delete — Terminate an Agent tmux Session
Companion skills:
tmux-agent-orchestrate-create(start),tmux-agent-orchestrate-resume(re-attach),tmux-agent-orchestrate-monitor(live status). Tmux Isolation:delete명령은 YAML의tmux_server필드를 자동으로 파싱하여 해당 격리 서버의 세션을 안전하게 종료(kill)하므로,TMUX_SERVER_NAME환경변수를 수동으로 지정할 필요가 없습니다. Single source of truth:./.hermes/agent-sessions.yaml.
What this skill does
Stop an agent's tmux session and mark the YAML entry as terminated. Preserves:
- The tmux session's recorded
pane.pid / cmd / cwd / mcp_attachmentsfor audit - The agent's on-disk conversation (claude
*.jsonl, agyconversations/*.db) — so the user cantmux-agent-orchestrate-resumelater - The
start_commandso a futuretmux-agent-orchestrate-create --session <name>reproduces the same tmux spec
The user explicitly chooses:
- soft delete (default): update YAML only; leave tmux running. Useful when "delete" really means "I'm done with this card".
- hard delete:
tmux kill-session+ update YAML. The default when the user says "kill it" or "end the session".
Pre-flight
SESSION_NAME=<workspace>-creator-<agent> # convention
AGENT_SESSIONS_YAML=.hermes/agent-sessions.yaml
# 1) Session is registered?
python3 -c "
import yaml
d = yaml.safe_load(open('$AGENT_SESSIONS_YAML'))
names = [s['name'] for s in d.get('tmux_sessions', [])]
if '$SESSION_NAME' not in names:
print('NOT in YAML — refusing to delete (no audit trail). Use tmux-agent-orchestrate-create first, or pass --force-no-yaml.')
raise SystemExit(1)
"
# 2) Already terminated?
ALREADY=$(python3 -c "
import yaml
d = yaml.safe_load(open('$AGENT_SESSIONS_YAML'))
s = [x for x in d['tmux_sessions'] if x['name']=='$SESSION_NAME'][0]
print(s.get('status', 'unknown'))
")
if [ "$ALREADY" = "terminated" ]; then
echo "Already terminated at $(python3 -c "import yaml; d=yaml.safe_load(open('$AGENT_SESSIONS_YAML')); print([x for x in d['tmux_sessions'] if x['name']=='$SESSION_NAME'][0].get('terminated_at',''))")"
echo "Re-running will just refresh the timestamp. Continue? (--yes to skip)"
fi
Workflow
# 1. soft delete (YAML only — tmux left running)
bash skills/tmux-agent-orchestrate-delete/scripts/delete_session.sh \
--session "$SESSION_NAME" --mode soft
# 2. hard delete (default — kill tmux + update YAML)
bash skills/tmux-agent-orchestrate-delete/scripts/delete_session.sh \
--session "$SESSION_NAME" --mode hard
# 3. hard delete + clean up on-disk conversation (DANGEROUS)
# — this prevents any future resume. Use only when user is certain.
bash skills/tmux-agent-orchestrate-delete/scripts/delete_session.sh \
--session "$SESSION_NAME" --mode hard --purge-conversation
The script:
- Verifies the session is in agent-sessions.yaml
- If
delegate_job_idis set, automatically publishes aprogress --detail "terminating"event to the tmux-agent-orchestrate-delegate-job registry - Captures the
last_visible_statusfromtmux capture-pane(so we have a final TUI snapshot for audit) - For
hardmode:tmux kill-session -t <name>(which auto-SIGTERMs children including the agent) - For
purge-conversation: deletes~/.claude/projects/.../jsonl(claude) or~/.gemini/antigravity-cli/conversations/...db+brain/...(agy) - Updates the YAML entry
- If
delegate_job_idis set, publishes acompletedevent to the tmux-agent-orchestrate-delegate-job registry - Updates the YAML entry:
- name: <SESSION_NAME> status: terminated terminated_at: 2026-06-17T...Z terminated_at_epoch: ... # all original fields preserved
Pitfalls
tmux kill-sessiondoesn't just kill the session — it sends SIGHUP to the pane's child processes too. This is usually what you want (the agent process dies, no zombie reparenting to init). But if you wanted to keep the agent running outside tmux for some reason, usesoftmode.- Don't delete on-disk artifacts by default — the agent's
*.jsonl/conversations/*.dbis the data thattmux-agent-orchestrate-resumeneeds.--purge-conversationis for when the user is genuinely done with the conversation and wants zero recovery chance. - YAML is append-only until you write a delete — if a previous run left the entry as
runningbut tmux is actually dead (crash, host reboot), the YAML is stale. Runningtmux-agent-orchestrate-delete --mode hardwill detect "tmux already dead, just update YAML" and proceed. - Don't delete the
claude_session_id_own: nullplaceholder — when the user creates a fresh session withtmux-agent-orchestrate-createand never sent a message, the entry hasclaude_session_id_own: null. Deletion must preserve that field (it's the audit trail showing "this tmux session never produced a session id of its own"). - Monitor skill may still be tracking — if
tmux-agent-orchestrate-monitoris running a heartbeat loop, deleting a session while it watches will trigger itstmux ls != yamlreconciliation. That's expected — let the monitor run, it will mark the entry asterminatedon its own. Don't fight it.
Verification
# 1. tmux gone
tmux has-session -t "$SESSION_NAME" 2>/dev/null && echo "STILL ALIVE" || echo "OK: tmux gone"
# 2. YAML has terminated entry
python3 -c "
import yaml
d = yaml.safe_load(open('$AGENT_SESSIONS_YAML'))
s = [x for x in d['tmux_sessions'] if x['name']=='$SESSION_NAME'][0]
assert s['status'] == 'terminated', f'expected terminated, got {s[\"status\"]}'
assert s.get('terminated_at'), 'missing terminated_at'
print(f'OK: terminated at {s[\"terminated_at\"]}')
print(f' preserved: pane.pid={s[\"pane\"][\"pid\"]}, cmd={s[\"pane\"][\"cmd\"]}, cwd={s[\"pane\"][\"cwd\"]}')
"
# 3. (if --purge-conversation) disk artifacts gone (CLAUDE_PROJECT_DIR env var overrides default $HOME/.claude/projects)
[ -f "${CLAUDE_PROJECT_DIR:-$HOME/.claude/projects}/<projkey>/<uuid>.jsonl" ] && echo "WARN: jsonl still exists" || echo "OK: jsonl purged"
When NOT to use this skill
- Just detaching →
tmux detach(Ctrl-B d) or just close the terminal. The tmux session keeps running. - Stopping the agent inside but keeping tmux → send
Ctrl-Cor/exit(claude) /Ctrl-D(agy) viatmux send-keys. The tmux session stays but the agent process is gone; you can thentmux-agent-orchestrate-createagain to spawn a fresh agent in the same tmux session. - Replacing an existing session with a new one →
tmux-agent-orchestrate-delete --mode hardfirst, thentmux-agent-orchestrate-create.