arbiterforge/ca-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.
npx skills add https://github.com/arbiterForge/codeArbiter --skill ca-standup
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.
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.
git fetch, then offer a --ff-onlypull 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.
(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.
or path missing on disk), never the main worktree. Remove one only after explicit
per-item confirmation; declining leaves it intact.
un-pushed commits, each with a suggested next step ($ca-commit, git push,
git stash show). Report-and-route only: never discard a stash, reset, or push.
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
python3 "${CLAUDE_PLUGIN_ROOT}/hooks/boardsync.py" reconcile || python "${CLAUDE_PLUGIN_ROOT}/hooks/boardsync.py" reconcile.
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
$ca-task done <id> — the only blessed board writer. State this clearly to the
user; do not auto-flip.
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:
python3 "${CLAUDE_PLUGIN_ROOT}/hooks/taskwrite.py" archive <id> || python "${CLAUDE_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 $ca-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.
$ca-status.$ca-doctor.$ca-commit.--ff-only and ONLY on a clean working tree — never a mergecommit, never on a dirty tree, never a rebase.
the main worktree from worktree cleanup.
individually before performing it — no batched or implied yes.
discard, reset, force, or push on the user's behalf.
and read-only; resolving a drifted task is the user's decision and routes
exclusively through $ca-task done <id>.
Take arbiterforge/ca-standup from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.