arbiterforge/ca-task
The sanctioned task-board mutator — add a queued task, start one (flips to in-progress and stamps the date, minting a dotted ID on pick-up), or mark an in-progress task done. The only blessed write to open-tasks.md.
npx skills add https://github.com/arbiterForge/codeArbiter --skill ca-task
The one blessed way to mutate <project-root>/.codearbiter/open-tasks.md
(resolves D-1). Hand-editing the board is no longer the only path; this command keeps
every entry schema-conformant and every transition dated. The board LOGIC lives in the
pure _taskboardlib transforms; this command runs the thin writer
${CLAUDE_PLUGIN_ROOT}/hooks/taskwrite.py.
Always put -- before user text (a desc or title) so a value beginning with - is not
parsed as a flag. Interpreter fallback, same shape as the hooks: python3 … || python ….
--id <group>.<type> to minta dotted ID now, --from <origin> for a harvest back-ref, --boundaries a,b for the
security/trust boundaries it touches. The description must be nonblank and
single-line; origin and boundary values must also stay on one line.
python3 "${CLAUDE_PLUGIN_ROOT}/hooks/taskwrite.py" add [--id group.type] [--from origin] [--boundaries a,b] -- "<desc>" || python "${CLAUDE_PLUGIN_ROOT}/hooks/taskwrite.py" add ... -- "<desc>"be a dateless [~]). On an ID-less item, pass --as <group>.<type> to mint its dotted
ID at pick-up. --date YYYY-MM-DD overrides today.
python3 "${CLAUDE_PLUGIN_ROOT}/hooks/taskwrite.py" start [--as group.type] [--date YYYY-MM-DD] -- "<id|title>"--dateoverrides today). A queued task must be started first.
python3 "${CLAUDE_PLUGIN_ROOT}/hooks/taskwrite.py" done [--date YYYY-MM-DD] -- "<id|title>"A missing target, an already-matching state, an out-of-order transition, a malformed
add field or --date, or an invalid GROUP.TYPE namespace is reported and writes
nothing (exit 1).
A queued done identifies the task as queued and tells the caller to start it first.
Targeting by title is best-effort:
prefer the dotted ID, and
note that if two ID-less items share a title, start/done act on the first — give one
an ID ($ca-task start --as <group>.<type> -- "<title>") to disambiguate.
(${CLAUDE_PLUGIN_ROOT}/includes/harvest.md), which calls this writer for you.
$ca-status (read-only).chore(board) PR just to flip a task state → task-board transitions([x] done-flip, [~] start-flip, new [ ] add) ride the work commit via
commit-gate, co-located atomically with the code that completes, starts, or spawns the
task (ADR-0008). A lagging board-only PR is the anti-pattern this design eliminates.
taskwrite.py (the pure transforms), never afree-hand Edit that can malform the schema.
start MUST stamp a started date — never leave a dateless [~].done MUST target an in-progress task — a queued task must go through start first.done so the record survives.Take arbiterforge/ca-task 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.