{"id":"standup","name":"standup","summary":"gitのワークツリー、ブランチ、PR間で読み取り専用のスタンドアップを成立させ、変更を比較し、一つの統合計画を作成すること。","body":"# standup — facilitate a group chat between branch-agents\n\nYou're the **facilitator**. Each of the user's git worktrees (and any PRs they\npick) joins a shared markdown chat as its own agent, and the agents reconcile\ntheir scattered work into ONE consolidated worktree. You convene the room, run\nthe conversation in rounds, and carry the outcome back — the reconciling happens\nin the chat, between the agents.\n\nThe room is one shared file (default `~/.claude-mem/STANDUP.md`): YAML front\nmatter holds the `goal` + `prompt`; the body is the transcript. Writes are\natomically locked, so agents speak at once. It is **read-only** — agents decide\nhow the merge *should* go; nobody commits or merges inside the room. Real git\nwork happens afterward via `/do`.\n\n## 1. Fill the room\n\nTwo ways, mixable:\n\n- **By recency** (common) — worktrees active in a window:\n  ```bash\n  node \"${CLAUDE_SKILL_DIR}/standup.mjs\" worktrees --since <1h|4h|24h|7d|all> --json\n  ```\n  Active = a commit *or* an uncommitted/staged/untracked edit in the window. If\n  the user didn't name a window, offer 1h / 4h / 24h / 7d / all.\n\n- **By hand** — specific branches and/or open PRs:\n  ```bash\n  node \"${CLAUDE_SKILL_DIR}/standup.mjs\" worktrees --json   # local branches\n  node \"${CLAUDE_SKILL_DIR}/standup.mjs\" prs --json         # open PRs (via gh)\n  ```\n  Show one numbered list (worktrees + PRs, with age/title); their reply is the\n  \"checkbox.\" If `prs` errors (no `gh` / not GitHub), carry on worktrees-only.\n\nZero or one candidate isn't a standup — say so, offer to widen, stop. Otherwise\necho the roster to confirm before you start.\n\n## 2. Open the room\n\nSet a goal + prompt that invite a conversation, not one-shot status reports:\n\n```bash\nnode \"${CLAUDE_SKILL_DIR}/standup.mjs\" open --force --agent facilitator \\\n  --goal \"Collapse these branches/PRs into ONE consolidated worktree: what each changed, where they overlap, which becomes the target, and the merge order.\" \\\n  --prompt \"Facilitated rounds. Round 1: introduce your branch and its state. Then resolve the conflicts the facilitator surfaces, round by round, until the room lands on one concrete plan (target worktree + merge order + conflict resolutions). Read-only: decide, don't merge. Register AGREE when you back the plan.\"\n```\n\n## 3. Run it as rounds\n\nYou drive the turns — if agents watch-loop on their own the room can stall with\nnothing decided. Each agent speaks once per round (read → post → return); you\nread between rounds and bring back whoever's still needed.\n\nSpawned agents don't inherit `CLAUDE_SKILL_DIR`, so resolve it once and paste the\nreal path into each brief:\n```bash\necho \"${CLAUDE_SKILL_DIR}\"\n```\n\n**Round 1 — intros (everyone, one Task message so they run together).** Brief\neach:\n\n> You're **`<branch>`** (a PR is **`pr-<number>`**) in a standup group chat. Read\n> `<skill-dir>/agent-brief.md` and play your part by it. The room is\n> `~/.claude-mem/STANDUP.md`; speak with `node \"<skill-dir>/standup.mjs\" post …`,\n> catch up with `… read`. Get your bearings (`cd \"<path>\"`,\n> `git log --oneline origin/main..HEAD`, `git status --short`,\n> `git diff --stat origin/main...HEAD`; a PR uses `gh pr view/diff <number>`),\n> then post ONE turn: your branch, its real state, and how it should fold in.\n> Read-only. Then return.\n\n**Reconcile.** Once they've returned, `read` the room and list the **open\nitems** — overlaps, conflicts, competing implementations, undecided\ntarget/order. None? Skip to the close.\n\n**Resolution rounds (cap ~4).** Per open item, re-spawn only the agents it\nimplicates, with the specific question. Tell them to `read --since <their-name>`\nfirst, then post their position and `--agree` if convinced. `read` again, update\nthe list. Repeat.\n\n**Close — you always write it.** Stop when the list is empty, you hit the cap, or\nan agent errors (note \"didn't report,\" don't block). Then write the SUMMATION\nyourself — don't wait for an agent to volunteer. Write it as plain prose a human\ncan skim, not a field dump: which worktree is the target and why, the merge order\nin a sentence, and what's left for the human:\n```bash\nnode \"${CLAUDE_SKILL_DIR}/standup.mjs\" summation --agent facilitator \\\n  --text \"Build on <worktree> — it's the only one with real code. Layer <branch>'s changes on top, then drop in the doc-only branches; skip <empty branch>. Your call before it's safe: <the one or two real decisions>. Done when it all sits in <target> and builds clean.\"\n```\n\n## 4. Brief the human in plain language\n\nThis is the payoff — don't hand them the raw SUMMATION, **translate it.** A human\nwho didn't watch the room should understand the outcome without decoding paths,\nline counts, or commit hashes. Lead with the answer, then the few choices only\nthey can make:\n\n- **What you found** — one plain line per branch: who has real code, who's just\n  docs, who's empty.\n- **The plan** — target + merge order in a sentence or two.\n- **Their call** — only the decisions a human must make (which implementation\n  wins, what to drop, anything risky), as concrete questions. Use\n  `AskUserQuestion` for the clear-cut ones.\n\nKeep git internals out unless they ask. Once they've settled the open calls, hand\nthe plan to **`/do`** to perform the merges — don't merge anything yourself\noutside `/do`.\n\n## CLI\n\n```bash\nnode \"${CLAUDE_SKILL_DIR}/standup.mjs\" <command> [--flags]\n```\nDefaults: agent = git branch, file = `~/.claude-mem/STANDUP.md`. Every write is\natomically locked.\n\n| command | what it does |\n|---|---|\n| `worktrees [--since 4h] [--json]` | worktrees newest-first; `--since N{m,h,d,w}` keeps those active in the window |\n| `prs [--since 4h] [--json]` | open GitHub PRs (via `gh`) newest-first |\n| `open --goal \"…\" --prompt \"…\" [--force]` | create the room (`--force` rotates an old one aside) |\n| `join [--message \"…\"]` | add yourself + say Hello |\n| `post --message \"…\" [--agree \"…\"]` | append a turn |\n| `agree --deliverable \"…\"` | append an AGREE turn |\n| `watch [--timeout SEC] [--interval SEC]` | block until someone else posts, print it (exit 2 on timeout) |\n| `read [--tail N] [--since AGENT]` | print the chat (or only turns after AGENT's last) |\n| `status` | participants + AGREEs + consensus check |\n| `summation --text \"…\"` | write the SUMMATION, flip `status: agreed` |\n\nEach spawned agent plays its turns by **`agent-brief.md`** (bundled here) — the\nplaybook for being one voice in the room.","author":"@thedotmack","ownerProfile":null,"authorContacts":null,"sourceUrl":"https://github.com/thedotmack/claude-mem/tree/main/plugin/skills/standup","license":"Apache-2.0","category":null,"lang":"en","tokens":1756,"stars":0,"calls30d":2,"claimed":false,"visibility":"public","origin":"crawler","version":"0.1.0","createdAt":"2026-08-22","updatedAt":"2026-08-22","files":[{"path":"agent-brief.md","size":2173,"sha256":"dc7a1a91dba7dd7c51b5d2a5aa55a3f006e039f2e9590bac8d83949accab0476"},{"path":"standup.mjs","size":22168,"sha256":"c6deac4bc99b9e5e3a55c836cbd792e88cf97395a1d1846497697c5f7823aa70"}],"requires":{"mcp":[],"tools":["Bash","Read","Edit","Task","AskUserQuestion"]},"safety":{"flags":[{"code":"code.eval","kind":"dangerous-code","where":"standup.mjs:188","excerpt":"exec(","message":"evaluates code at runtime","severity":"warn"}],"scannedAt":"2026-08-22","hasScripts":true,"networkEndpoints":[]}}