Skip to content
Development
Command

/standup

Daily repo hygiene — review the day's repo state, then perform the cleanups under per-action confirmation. Fast-forward only, never destructive without a yes.

From plugin
codearbiter
13944 skills28 agents44 commands
Install
$ npx -y skills add arbiterForge/codeArbiter --agent claude-code

How it fires

How this command gets triggered: by you, by Claude, or both.

  • Fires itselfClaude auto-loads it when your prompt matches the work.
  • You can call itInvoke it directly when you want it.
  • Slash command/standup

Context preview

What this command does when you run it.

Daily repo hygiene — review the day's repo state, then perform the cleanups under per-action confirmation. Fast-forward only, never destructive without a yes.

Command definition

standup.md
description: Daily repo hygiene — review the day's repo state, then perform the cleanups under per-action confirmation. Fast-forward only, never destructive without a yes.
argument-hint: (none)

{{CMD:standup}} — daily hygiene

The best-practice checklist you run when you sit down to code, made routine and gated. The SessionStart briefing *reports* hygiene state read-only; this command is where the *actions* happen — each one confirmed individually, none taken unbidden. Arbiter gathers and proposes; you decide every mutation.

Flow

The orchestrator reads the current repo state (reusing the briefing's read-only computation — branch, ahead/behind, dirty tree, stashes, prune-candidate branches, stale worktrees) and presents it, then offers each applicable action in turn. Skip an action that has no candidates; never bundle confirmations across different actions or items — branch deletions always stay per-item, and the sole exception is step 3's explicitly enumerated worktree group, which is still one confirmation that names every member, never an implied yes.

1. **Fetch + fast-forward pull** — kick `git fetch`, then offer a **`--ff-only`** pull of the current branch. Eligibility is the briefing summary's `ff_pull_eligible` flag (SH-6: clean working tree AND behind upstream) — the same pure helper the SessionStart briefing computes, not a condition re-derived here. On a dirty tree the pull is withheld and the dirty state is reported instead. A diverged branch (would need a merge) is refused with a diverged-branch message — never a merge commit. 2. **Prune merged local branches** — list local branches already merged on remote (the `: gone]` upstream set), excluding the current branch and the default (`main`). Delete a listed branch only after an explicit per-branch confirmation; declining leaves it in place.

A `: gone]` branch that was squash-merged will typically **refuse** plain `git branch -d` — its upstream is already pruned, so `-d` has nothing to test reachability against. Before reporting that as a stop, check for a merged PR record: `gh pr list --head <branch> --state merged --json headRefOid`. When a `MERGED` PR's `headRefOid` equals that branch's local tip, containment is proven and `git branch -D` is permitted — with the proof stated and the branch named in the confirmation — mirroring the `post-merge-cleanup` Phase 5 contract. Without that proof, a refusal stays a report-and-stop; never guess. 3. **Remove stale worktrees** — list stale/merged worktrees (branch gone-or-merged, or path missing on disk), never the main worktree. Present the full stale list together with each item's evidence, then offer removal as an explicitly **enumerated group** — one confirmation that names every member — as well as per-item confirmation for anyone who wants to keep some. Declining the group falls back to per-item confirmation, and declining any item leaves it intact. 4. **Surface stashes / dirty / un-pushed** — list stashes, uncommitted changes, and un-pushed commits, each with a suggested next step (`{{CMD:commit}}`, `git push`, `git stash show`). Report-and-route only: never discard a stash, reset, or push. 5. **Advisory board-drift sweep** — run `git log` over the recent merge window (since the last `ca`-scoped tag, or a rolling 30-day window when no tag exists) and pipe that text to `"$PY" "{{PLUGIN_ROOT}}/hooks/boardsync.py" reconcile`. Resolve `$PY` once by presence — `PY=python3; { command -v python3 >/dev/null 2>&1 && python3 --version >/dev/null 2>&1; } || PY=python` — never `python3 X || python X`, which reruns X on any nonzero exit (#577); this resolution covers step 6's helper call too. Display the advisory drift report as-is: DRIFTED tasks (work merged but board state not `[x]`) and informational UNKNOWN ids (in the log but absent from the board). This step is read-only and best-effort — the dotted-id grep can miss a task never named in a commit. The board is never mutated here; `open-tasks.md` is never written. Any drifted task must be resolved explicitly through `{{CMD:task}} done <id>` — the only blessed board writer. State this clearly to the user; do not auto-flip.

6. **Archival sweep — proposed per item, never batched** (B-24). Long-done tasks accumulate on the board and inflate the in-flight count until it stops meaning anything. List the done items older than the cutoff, then ask about **each one separately** and archive only the ones the user says yes to: `"$PY" "{{PLUGIN_ROOT}}/hooks/taskwrite.py" archive <id>`.

One confirmation per item, one helper call per item — the two map 1:1 on purpose. A batched "archive all 12?" turns twelve decisions into one, and the helper's own per-item ordering (append to `done-tasks.md` first, then remove from `open-tasks.md`) is what makes an interrupted sweep recoverable; a batch loop that answered once would throw that away.

An item marked `[x]` with **no `(done YYYY-MM-DD)` stamp** cannot be aged, so it is never in the proposed set. Offer it only if the user asks, and only with `--allow-undated` — both `{{CMD:task}} done` and the board classifier require the stamp, so an unstamped entry is legacy or override-era and its real age is unknown.

Declining is always available and costs nothing: an unarchived task stays exactly where it is. Never archive without a yes.

Present a one-line summary of what was done and what was declined.

When NOT to use

  • A read-only state snapshot without acting → `{{CMD:status}}`.
  • Install health (interpreter, payload, hooks) → `{{CMD:doctor}}`.

{{IF:claude}}

  • Transcript hygiene to extend the session → `{{CMD:prune}}`.

{{END}}

  • Committing staged work → `{{CMD:commit}}`.

Hard gate

  • MUST pull with `--ff-only` and ONLY on a clean working tree — never a merge

commit, never on a dirty tree, never a rebase.

  • MUST exclude the curre
Read more
Ships withcodearbiter

When you can't trust yourself with your code base, trust Arbiter.

Get the whole plugin, auto-invoked
Stats
139
Stars
1
Views
7
Forks
Active
Maintenance
Python
Language
AGPL-3.0
License
just now
Last commit
3mo ago
Created

Repo: arbiterForge/codeArbiter