git-coworker-check
Detect coworker Claude agents in a shared checkout. Use when starting a session in a shared clone, before destructive git ops (stash, reset, checkout), or before bulk-edit / commit-loop workflows.
- License 许可
- MIT
- 最近更新
- 2026-11-13
- Stars
- ★ 59
- Forks
- 6
01 前言 Front Matter
- args
- [--check | --claim | --release]
- name
- git-coworker-check
- created
- 1776729600000
- modified
- 1793750400000
- reviewed
- 1779148800000
- description
- Detect coworker Claude agents in a shared checkout. Use when starting a session in a shared clone, before destructive git ops (stash, reset, checkout), or before bulk-edit / commit-loop workflows.
- allowed-tools
- Bash(bash *), Bash(git status *), Bash(git stash *), Bash(git rev-parse *), Read, TodoWrite
- argument-hint
- [--claim | --release | --check (default)]
02 资源文件 9
- 参考文档REFERENCE.md19.7 KB
- 参考文档references/field-evidence.md2.1 KB
- 参考文档references/integration.md1.4 KB
- 参考文档references/recovery.md3.5 KB
- 脚本scripts/claim-session.sh1.4 KB
- 脚本scripts/detect-coworkers.sh13.5 KB
- 脚本scripts/release-session.sh676 B
- 脚本scripts/tests/test-bare-flip.sh3.8 KB
- 脚本scripts/tests/test-worktree-leak.sh4.6 KB
03 SKILL.md 正文
/git:coworker-check
Detect another agent working in the same repo clone and warn before destructive operations that could destroy its uncommitted changes.
When to Use This Skill
| Use this skill when... | Use a worktree instead when... |
|---|---|
| Session starts in a clone that may already be in use | You control the session and can enter a worktree (EnterWorktree, or git worktree add .claude/worktrees/<task>) |
About to run git stash, git reset --hard, git checkout -- . |
You already know the working tree is yours alone |
git status shows files you don't remember touching |
Baseline + markers are already confirming you are alone |
| Bulk-edit / commit-loop fan-out about to start (per-plugin, per-package commits across many subdirectories) | Each iteration is already isolated in its own worktree |
| A collision already happened and you need to recover | See REFERENCE.md — Recovery section |
Signal design — what each signal survives and where it goes blind — is in
REFERENCE.md § Signal design. The always-loaded response rules
are .claude/rules/agent-coworker-detection.md.
Bulk-edit / commit-loop precondition
Bulk-edit and commit-loop workflows (git-commit-workflow "Bulk-edit / per-plugin commit loops", per-package release-please loops, mass refactors) MUST run this check up front, before staging any files — not opportunistically partway through.
Why front-loaded, not opportunistic: a mid-loop check lets whichever session looks first win. Field scenario: references/field-evidence.md § Why the check is front-loaded.
The rule: the orchestrator stops before fan-out if the playing field is contended. Mid-loop checks let "the agent who happens to look first wins" — which is non-deterministic and produces misleading commit histories.
| Verdict from up-front check | What to do |
|---|---|
clear |
Proceed with the bulk-edit / commit loop |
drift_detected |
Inspect the new files. If they are yours from earlier in the session, proceed with explicit paths. If unknown, stop and ask. |
worktree_leak_suspected |
A child worktree-isolated agent is leaking an untracked file into the parent (issue #1319). Do not stage or stash the matching path. Wait for the child's commit, then re-run the check before continuing. |
bare_flip_suspected |
The shared checkout was flipped to core.bare=true, or a leaked GIT_DIR / GIT_WORK_TREE env points away from the repo (issue #1692). Stop and recover before any further git ops — see the Recovery section. Do not start the loop. |
coworker_detected |
Stop. Recommend a fresh isolated worktree under <repo>/.claude/worktrees/<task> (EnterWorktree for the session's own repo), or wait for the other session to finish. Do not start the loop. |
For a worked example of the "stop and inspect" branch (#1277), see references/field-evidence.md.
Context
- Repo root: !
git rev-parse --show-toplevel - Git dir: !
git rev-parse --git-dir - Current status: !
git status --porcelain=v2 --branch - Stash count: !
git stash list - Existing markers: !
find . -path './.git/.claude-session-*' -maxdepth 3
Parameters
Parse $ARGUMENTS for the mode flag. Default is --check.
| Flag | Action |
|---|---|
--check (default) |
Run detection. Report verdict without writing anything. |
--claim |
Write a session marker and baseline snapshot for this session. Run at session start. |
--release |
Remove this session's marker and baseline files. Run on session exit. |
Execution
Execute this detection workflow:
Step 1: Resolve mode
Inspect $ARGUMENTS. If it contains --claim, go to Step 2a. If it contains --release, go to Step 2b. Otherwise (including empty), go to Step 3.
Step 2a: Claim (write marker + baseline)
Run:
bash ${CLAUDE_SKILL_DIR}/scripts/claim-session.sh --project-dir "$(pwd)"
Report the three file paths printed. These are the marker and baseline files — do not commit or delete them. They live inside .git/ and are not tracked.
Stop here.
Step 2b: Release (remove marker + baseline)
Run:
bash ${CLAUDE_SKILL_DIR}/scripts/release-session.sh --project-dir "$(pwd)"
No output is expected. Stop here.
Step 3: Detect coworkers
Look up the current session's baseline files (if --claim was run earlier this session). Then run detection. Pass --self-agent claude-${CLAUDE_SESSION_ID:0:8} so taskwarrior claims by this same session are reported as OWN_CLAIM_* rather than counted as coworkers:
bash ${CLAUDE_SKILL_DIR}/scripts/detect-coworkers.sh \
--project-dir "$(pwd)" \
--self-agent claude-${CLAUDE_SESSION_ID:0:8} \
--baseline-status .git/.claude-baseline-$$.status \
--baseline-stash .git/.claude-baseline-$$.stash
If no --claim was run, omit the --baseline-* flags — drift detection will return unknown but marker, process, and taskwarrior signals still work.
The taskwarrior signal is best-effort: when task or jq is not on PATH, the script reports TW_SCAN_METHOD=unavailable and the verdict falls back to the three git-side signals.
Step 4: Interpret the verdict
Parse the VERDICT= line from the script's output:
| Verdict | Meaning | Action |
|---|---|---|
clear |
No coworker detected | Proceed; still prefer explicit git add <paths> over git add -A |
drift_detected |
Files appeared since baseline but no other process/marker/claim found | Inspect NEW_STATUS_LINES — may be coworker or may be a forgotten earlier edit. Ask the user before stashing. |
worktree_leak_suspected |
Untracked file in parent matches a path held by a linked worktree (issue #1319) | Do not stash or commit the matching path. Wait for the child worktree's commit to reclaim it. Avoid committing on the parent branch until child agents are done. |
bare_flip_suspected |
CORE_BARE=true on a shared working checkout, or a LEAKED_GIT_DIR / LEAKED_GIT_WORK_TREE env points away from the repo (issue #1692) |
Stop and recover. Flip core.bare back to false and/or unset the leaked env before any further git ops — see Recovery. Recover any wiped untracked work from the reflog / agent worktree branches. |
coworker_detected |
Another agent/process/taskwarrior claim is active in this clone | Do not stash, restore, or reset. Report the MARKER_PID / PROC_PID / TW_CLAIM_* entries. Recommend the user switch to a worktree. |
The six signals are independent — any one of MARKER_COUNT > 0, PROC_COUNT > 0, or TW_CLAIM_COUNT > 0 raises coworker_detected. A non-zero WORKTREE_LEAK_COUNT on its own raises worktree_leak_suspected, and a non-zero BARE_FLIP_COUNT raises bare_flip_suspected (ranked first, since a bare flip breaks git for every linked worktree). OWN_CLAIM_* lines are this session's own taskwarrior claims and do not contribute to the count.
Step 5: Report findings
Print a short summary:
- Verdict
- Count of markers + processes + drift entries
- If non-clear, the specific PIDs or changed files
- Recommended next action (worktree, ask user, proceed with explicit paths)
Post-actions
- On
drift_detectedorcoworker_detected: do not rungit stash,git reset --hard,git checkout -- ., orgit cleanin this session. Stage only explicit paths. - Suggest a clean isolated checkout:
EnterWorktreefor the session's own repo, orgit -C <repo> worktree add -b <branch> <repo>/.claude/worktrees/<task> origin/mainfor another repo.hooks-plugin'sworktree-location-guard.shdenies paths outside.claude/worktrees/.
Integration
Bulk-edit / commit-loop skills invoke this before staging any files. For the SlashCommand snippet other skills use, and where hook-based enforcement belongs, see references/integration.md.
Agentic Optimizations
| Context | Command |
|---|---|
| Cheapest detection (no baseline) | bash scripts/detect-coworkers.sh --project-dir "$(pwd)" |
| Full detection with drift | Add --baseline-status + --baseline-stash from a --claim run |
| One-line verdict check | ... | awk -F= '/^VERDICT=/ {print $2}' |
Recovery
When detection failed to prevent a collision, or the verdict is bare_flip_suspected, read references/recovery.md before any further git op: symptom triage, bare-flip / leaked GIT_DIR recovery (#1692), and commit-early guidance.
Related Skills
Skills that invoke this check, and its taskwarrior sister skills: references/integration.md § Related Skills.
04 同仓库更多 Skills
kitty-show-image
Show the user an image with a note on what to judge, via a file send or a labelled kitty tab. Use when the user must see an image, or icat fails with no /dev/tty.
kitty-session-persistence
Snapshot and restore kitty terminal sessions on macOS. Use when surviving WindowServer hangs without losing tabs, configuring snapshots, or restoring after a force-reboot.
kitty-remote-control
Safe kitty remote control from an agent — read panes with kitty @ ls/get-text, notify, and never mutate the live terminal unasked. Use when running inside kitty.
docs-reference-check
Dangling doc-reference gate: flag markdown naming repo paths or relative links that no longer exist. Use when docs cite moved/deleted files, or wiring a doc-drift lint.
youtube-upload
Upload a video to YouTube via the Data API v3 and edit its title, description, tags or thumbnail afterwards. Use when publishing or retitling a YouTube video.
youtube-studio-share
Share a private YouTube video with a whole Google Workspace organization by scripting YouTube Studio in the browser. Use when a video must be org-only.