task-board-setup — file-based Kanban scaffolder

opus status / install / upgrade / enable / disable / uninstall / purge user-invoked

Tip

One command, complete task system. Point the skill at any repo and it spawns parallel analysis subagents, confirms the findings with you, then writes a fully parametrized file-based Kanban: curator agent, on-demand dashboard skill, lifecycle rule, and the complete .claude/features/** folder tree. After it runs, the repo is self-contained — no further dependency on this generator.

Quick reference

ItemValue
Skill command/brewtools:task-board-setup
Arguments[status | install | upgrade | enable | disable | uninstall | purge] [target repo path | empty = cwd] [free-text directive] — e.g. install /path/to/repo, upgrade, 'skip module split'
No verbResolved from the target: a deployed board reports status, a fresh repo gets install. A bare path alone installs into that path
Emits.claude/agents/task-tracker.md, .claude/skills/task-board/SKILL.md, .claude/rules/tasks.md, .claude/features/**
Emits (SPEC_MODE).claude/skills/task-spec/SKILL.md, .claude/features/specs/{SPEC_TEMPLATE,DESIGN_TEMPLATE}.md
SpawnsParallel analysis subagents (architect + Explore + domain-agent inventory) + multi-agent doc sweep — one bounded unit each
OptionalSpec + system-design layer (SPEC_MODE), confirmed during Step 1; gated CLAUDE.md optimization pass — propose-only, opt-in during confirmation
Upgradeupgrade directive retrofits SPEC_MODE onto an already-deployed board, additive-only
Modelopus
Commits?Never — committing is a user / manager action

When to use

ScenarioCommand
Inspect what is deployed, change nothing/brewtools:task-board-setup status
New repo needs file-based task tracking/brewtools:task-board-setup install
Standardize an existing Kanban convention across repos/brewtools:task-board-setup install /path/to/repo
Migrate scattered TODO / backlog docs into a structured board/brewtools:task-board-setup install — sweep subagents migrate legacy docs automatically
A task needs an architecture pass before codeTurn on SPEC_MODE at confirmation, then run the emitted /task-spec <ID>
An already-deployed board needs the spec + design layer/brewtools:task-board-setup upgrade /path/to/repo
Pause the board machinery without deleting anything/brewtools:task-board-setup disable
Resume after a disable/brewtools:task-board-setup enable
Remove the generated machinery, keep every task you wrote/brewtools:task-board-setup uninstall
Remove the machinery and delete .claude/features/** too/brewtools:task-board-setup purge

Example

# Report what is deployed in the current repo
/brewtools:task-board-setup status

# Deploy into the current repo
/brewtools:task-board-setup install

# Deploy into another repo
/brewtools:task-board-setup install /path/to/some-repo

# Deploy, then steer the optional CLAUDE.md pass with a free-text directive
/brewtools:task-board-setup install /path/to/some-repo also dedupe rules, skip module split

# Retrofit the spec + design layer onto a repo that already has a board
/brewtools:task-board-setup upgrade /path/to/some-repo

After completion the repo gains /task-board (view/add/move tasks) and the task-tracker agent auto-runs at the start of every task.

How it works

  1. Multi-agent repo analysis

    Three parallel subagents (Plan for domains + release style, Explore for exclusions + doc inventory, Explore for the domain-agent inventory) derive: domain id-segments, source-dir exclusions the curator must never touch, release style (vX.Y.Z tag / commit SHA / none), doc language, an inventory of existing task docs, and the repo’s own .claude/agents/** mapped to domains. Findings — plus whether to turn on the optional spec + design layer (SPEC_MODE) — are confirmed via AskUserQuestion; generation does not start until the user approves. If analysis yields no domains, the skill asks the user to name at least one (falls back to a single CORE domain).

  2. Generate task-tracker agent

    Writes .claude/agents/task-tracker.md — the board curator. It owns the Kanban: creates, moves, and closes tasks; grooms the backlog; keeps board.md in sync with the folder state. The agent writes only under .claude/features/** and never touches source directories. Release style shapes the closing-marker wording (vX.Y.Z tag + commit SHA / bare SHA / date / no tag).

  3. Generate task-board skill

    Writes .claude/skills/task-board/SKILL.md — the on-demand dashboard. Supports flows: view, add, move, backlog, groom. Non-trivial and bulk passes are delegated to the task-tracker agent. This skill is the everyday interface; the agent is the heavy-lifting backend.

  4. Generate task-spec skill (optional, SPEC_MODE)

    Runs only if SPEC_MODE was confirmed on in Step 1. Writes .claude/skills/task-spec/SKILL.md — the spec + design authoring flow, parametrized with the repo’s own domain-agent roster. When SPEC_MODE is off this step is skipped silently and every other artifact stays byte-identical to the pre-spec-layer generator.

  5. Generate rule + scaffold + doc sweep

    Writes .claude/rules/tasks.md (paths-scoped to .claude/features/**) — lifecycle rules, id convention, required frontmatter, grooming cadence, and the run-at-task-start rule that spawns task-tracker as an isolated subagent at the beginning of every task. This rule lives only in tasks.md — board generation never edits the target’s CLAUDE.md. Then scaffolds the folder tree and launches parallel sweep subagents over the discovered doc inventory to migrate legacy backlog / feature docs into the board (dedup, move done items into closed/, author initial board.md counts). If no legacy docs were found, the sweep is skipped entirely. Under SPEC_MODE the same scaffold pass also writes .claude/features/specs/{SPEC_TEMPLATE,DESIGN_TEMPLATE}.md; off leaves specs/ empty, exactly as before.

  6. Optional CLAUDE.md optimization (gated)

    Runs only if you opted in during the Step 1 confirmation. Propose-only: it reports current-vs-target line count, then asks before every change — extracting local-only content to CLAUDE.local.md, decomposing an over-budget file into nested module CLAUDE.md files (loaded on demand, unlike eager @path imports), deduping rules, then handing the touched files to text-optimize for token compression. Decline it and nothing is written. Pass a free-text directive in the argument (“also dedupe rules”, “skip module split”, “report only”) to steer this phase.

Delegation

Warning

A big task handed to one agent = an agent gone for an hour. You cannot observe it, you cannot correct it, and it usually drifts off-target. Both spawn points — the Step 1 repo analysis and the doc sweep — give one subagent ONE bounded unit: one doc group, ~5 files, ~10 steps. Bigger work is split into N tasks, all spawned in a single message.

Every spawn prompt carries six fields. A bare one-line task is never enough:

FieldContent
GOALdeploy the board into the target repo; this pass fills it from pre-existing task docs
ROLEown the listed docs — no invented tasks, no source-dir edits, no CLAUDE.md
SCOPEwrite only under .claude/features/**; out — exclusions, CLAUDE.md, .claude/agents, .claude/skills
CONTEXTconfirmed domains / release style / language, plus the already-written skeleton and templates; siblings sweep other groups now
CONSUMERverification counts what landed, and the installed task-tracker agent reads those files from then on
DONEfiles under closed/ + backlog/ plus a manifest — a no-op sweep must say so explicitly

The CONSUMER field is load-bearing here: an id or status folder that deviates from TASK_TEMPLATE.md makes the task invisible to the task-tracker agent forever after.

Note

The same six-field brief ships into your repo. The generated .claude/skills/task-board/SKILL.md carries its own Delegation section with the identical GOAL / ROLE / SCOPE / CONTEXT / CONSUMER / DONE contract, so bulk groom and transition passes delegated to task-tracker are briefed the same way long after this generator is gone.

What gets deployed

ArtifactPathRole
Curator agent.claude/agents/task-tracker.mdOwns the board — create / move / close tasks, groom backlog, keep board.md canonical. Writes only .claude/features/**.
Dashboard skill.claude/skills/task-board/SKILL.mdOn-demand /task-board — view / add / move / backlog / groom; delegates bulk to the agent.
Paths-scoped rule.claude/rules/tasks.mdLifecycle, id convention, required FM, grooming — plus “run task-tracker at the start of any task”. Auto-loads on .claude/features/**.
Board file.claude/features/board.mdThe Kanban board — counts and task table, authored by the doc sweep.
Session progress.claude/features/PROGRESS.mdSESSION progress against the board — five fields, overwritten in place. Ungated: written in both SPEC_MODE states, before any task exists.
Control files.claude/features/{TRACKER,TASK_TEMPLATE,INDEX}.md + backlog/README.mdTracker log, task template, index, backlog guide.
Folders.claude/features/{backlog,todo,progress,closed,specs}/Status folders — folder name = task status.
Spec skill (SPEC_MODE).claude/skills/task-spec/SKILL.mdOn-demand /task-spec <ID> — authors the product + design spec via a domain-architect fan-out.
Spec templates (SPEC_MODE).claude/features/specs/{SPEC_TEMPLATE,DESIGN_TEMPLATE}.mdFixed section skeletons for the two spec documents.

Session progress (PROGRESS.md)

Tip

Ungated — written in both SPEC_MODE states, at init, before any task exists. board.md owns the task LIST + status; PROGRESS.md owns what the SESSION did about it. It is not a second board — no task table, no per-task detail (that stays in the task’s ## Notes).

Five fields, overwritten in place, never appended:

FieldHolds
UpdatedISO date of the last rewrite
In flighttask ids being worked right now
Moved since last update<ID>: todo -> progress, one line each
Blocked<ID>: what blocks it / who unblocks it
Nextthe single next action for this session

The injection mechanism is a rule, not a hook: .claude/rules/tasks.md carries paths: [".claude/features/**"] frontmatter, and PROGRESS.md lives under that same glob — the rule auto-loads whenever a task touches the board, and rule 8 forces exactly that at the start of every task. task-board-setup installs no hooks for this.

Four rules bind it, in .claude/rules/tasks.md under “Session progress”:

#Rule
P1Always exists — created at board init. Missing → recreate it from board.md before anything else.
P2The main session keeps it current: refresh it in the same change as any transition.
P3Plan mode: a plan touching any task must carry an explicit final step — update .claude/features/PROGRESS.md. An otherwise-complete plan without that step is incomplete.
P4task-tracker watches it: every run rewrites the five fields from board.md + the task files, and reports staleness in one line. It cannot run a skill for you — act on its NEXT: line yourself.

Board drain. When the progress count on the board reaches zero, task-tracker appends NEXT: run /brewtools:task-board-setup upgrade <path> — but only when this repo has no .claude/skills/task-spec/ yet. A board that already has the spec layer stays silent, because upgrade forces SPEC_MODE=on and would otherwise push the spec layer onto a repo that deliberately declined it.

Spec + design layer (SPEC_MODE)

Tip

Optional, confirmed in the same Step 1 AskUserQuestion as the rest of the findings. SPEC_MODE=off is the default-compatible path — nothing below is emitted and every other artifact stays byte-identical to the pre-spec-layer generator.

With SPEC_MODE=on, a non-trivial task becomes three documents instead of one:

DocPathOwns
Task.claude/features/{backlog,todo,progress,closed}/<ID>.mdWHAT + WHY — context, links, the ask, and a ## Scope table of blocks S1..Sn
Product spec.claude/features/specs/<ID>-spec.mdHOW — decisions D1..Dn, resolved + open questions Q1..Qn, scope-coverage matrix
Design spec.claude/features/specs/<ID>-design.mdArchitecture — components, data flow, interfaces, failure modes, complexity budget, non-goals

Every task’s frontmatter gains spec: none | pending | full | design-only — “no spec” is a recorded decision, never an omission. A task needs a spec if it touches more than one domain, more than ~5 files, adds an integration or dependency, changes a schema / API / contract, is ambiguous, or the user asked for a design.

The generated task-spec skill

Three ways in, all supported by the emitted skill:

PathForm
Explicit/task-spec <ID> (default full), /task-spec <ID> design, /task-spec <ID> refresh
Plain prosemodel-invoked — “architect this task”, “write the spec”, “продумай архитектуру”. No skill name needed
Redirecttask-tracker ends its report with NEXT: run /task-spec <ID> (spec required: <reason>) when a task needs a spec and has none — an agent cannot call a skill for the main session, so it hands the call back to the user

Agent-resolution chain. Design docs are never written by a single generalist. For every domain the task touches, task-spec walks a 4-link chain, all spawned in one message: team agent (.claude/teams/team.md roster, if present) → the repo’s own project domain agent → any architecture-capable project agent → the built-in Plan. Whichever was used is named per domain in the design’s ## Evidence; domains with no owning agent are reported as gaps at install time and again in the design. An agent that refuses the task re-delegates to the colleague it names, capped at 2 retries.

GateRule
Coverage (G1)every in-scope id must appear as covered in both coverage tables; any partial/uncovered keeps the spec at status: draft
Close (G2)progress -> closed is blocked while any open question is blocking: yes — override only with an explicit SPEC WAIVER: <reason> line in the task’s ## Notes
Sync (G3)editing the task’s ## Scope invalidates both specs back to draft; run /task-spec <ID> refresh
Staleness (G5, close-time)REPORT-ONLY — reuses the same two docs G2 already opened, zero extra reads. Frontmatter status: still draft, or an in scope id just marked done that is uncovered/partial in ## Scope coverage, emits SPEC STALE: <ID> ... plus one NEXT: run /task-spec <ID> refresh. Never blocks the close, never writes a spec doc, never touches ## Scope coverage.

Clarify before research

Before the domain-architect fan-out, task-spec runs one AskUserQuestion pass (3-5 questions, max 4 per call) over a fixed three-category table, then treats every answer as settled input for every later architect spawn:

#CategoryAsks about
1Scopewhat is in/out, which modules are affected
2Constraintsrequired libraries, backward compat, API contracts
3Edge casesconcurrent access, empty/null inputs, error recovery

Answers land verbatim in the spec’s new ## Original requirements (the task’s ask, unedited) and ## User Q&A (this exchange) — never re-opened later.

Size advisory

More than 3 touched domains, or more than 12 in scope ids, makes the final report propose a split — addressed to task-tracker, not acted on here. task-spec never splits, creates or moves tasks itself; the board owns that.

-n / --noask — non-interactive mode

Suppresses exactly three interactive points, each recording Skipped (--noask mode):

SuppressedPhase
Clarify passP0.7
Open-questions batchP5
Review escalationP6-C

Blocking questions stay blocking: yes regardless. --noask does not suppress the two ground-truth stops — an ambiguous task id (several WIP candidates) and a missing ## Scope still AskUserQuestion and fail loud rather than guess.

Bounded self-review fix loop

After both docs are drafted:

PhaseDoes
A — findone adversarial reviewer per touched domain, all in one message; reports findings only, no edits
B — verifyevery finding re-checked against docs and code: confirmed / rejected / duplicate
C — fixwhile a confirmed blocker or major remains: apply fixes, re-run A for the affected domains, re-verify per B — capped at 3 iterations

Survivors after 3 rounds go to the user via AskUserQuestion (accept as-is, or convert to a blocking Q#/AQ#); under --noask every survivor converts to a blocking question automatically.

Structured final report

P7 replaces the old prose summary with a fixed block: mode, touched domains → agent used per domain, docs written + spec: value, decisions / open-questions counts, G1 coverage verdict, review counts (findings / confirmed / rejected / fix iterations / survivors), size advisory, and what synced in the same change.

Modes

Canonical order, shared by every -setup skill:

ModeRequiresEffect
statuseither stateRead-only inventory of the target: deployed or not, spec layer present, what to run next. Writes nothing, spawns nothing, asks nothing
installfresh repoThe full multi-agent deploy below. Refuses a repo that already has .claude/features/board.md
upgradedeployed boardRetrofits the spec + session-progress layers, additive-only
enabledeployed board, parkedRestores the machinery parked by disable — renames each .disabled file back. No re-analysis, no subagents, no confirmation
disabledeployed boardParks the machinery — task-tracker.md, task-board/SKILL.md, task-spec/SKILL.md (if the spec layer is deployed) and tasks.md are each renamed to a .disabled twin. Claude Code stops discovering them; .claude/features/** and every task are untouched
uninstalldeployed boardRemoves the generated machinery (curator agent, dashboard skill, rule, spec skill) and KEEPS .claude/features/**
purgedeployed boarduninstall plus deletion of .claude/features/** — every task you ever wrote

Only a standalone token counts as the verb; "upgrade the rules wording" inside a directive is prose, not a mode. init, setup, remove and reset are no longer commands — they are recognized as free-text synonyms and echoed back as the canonical verb. on/off are recognized as synonyms of enable/disable. The uninstall/purge split is deliberate: the generated files are machinery, .claude/features/** is your data. enable/disable on a FRESH (undeployed) target fall back to status and report there is no machinery to toggle.

Upgrading an existing board

/brewtools:task-board-setup upgrade <path> retrofits SPEC_MODE onto a repo that already has .claude/features/board.mdinstall refuses that repo outright and points here instead.

/brewtools:task-board-setup upgrade /path/to/repo

Upgrade installs two INDEPENDENT layers, gated file by file — not one all-or-nothing pass:

LayerGateAdds
Spec layerSPEC_MODE, forced on by upgradetask-spec skill, SPEC_TEMPLATE.md, DESIGN_TEMPLATE.md, the spec-related sites inside existing files
Session-progress layerungatedPROGRESS.md + every site that references it (rule section, TRACKER.md, task-board skill, INDEX.md)

A repo that already has the spec layer but predates PROGRESS.md (an older run of this generator) gains only the session-progress layer on upgrade — no duplicate spec-layer insertion. A fresh init and an upgrade on that same repo converge on the identical final state either way.

  • New files (the task-spec skill, the two spec templates, PROGRESS.md) are written outright.
  • Every edit to an existing file is shown as a diff and gated behind AskUserQuestion, file by file. Declined means no edit.
  • Task ids, scope ids and board rows are never renumbered, reordered or deleted. The one allowed board.md row edit is appending a spec cell (-- until task-spec fills it) to each existing progress/todo row.
  • Backfilling spec: on existing tasks is opt-in and off by default; when accepted the value is pending or none — never full.
  • Recovers domains / exclusions / language from the already-deployed artifacts instead of re-running analysis, and re-runs only the domain-agent inventory.
  • Re-running upgrade on a repo where both layers are already installed is a no-op: upgrade: no-op, spec layer already installed.

Output discipline in the generated curator

task-tracker ships with an output contract: before returning, it spends one step on what the main session actually needs and returns only that — a verdict plus task ids and file:line pointers. It never pastes the board, task bodies or backlog listings back. Bulk material (long logs, full diffs, dumps, long reports) goes into a file under .claude/reports/<YYYYMMDD-HHMMSS>_<name>/ and only the path comes back. Its finishing checklist carries this as a row, so a curator run that dumps the whole board into the reply fails its own check.

ID convention

Task IDs follow UPPER-KEBAB: <PREFIX>-<DOMAIN>-<SLUG>.

PrefixUse
T-Feature / product task
BUG-Defect
M-Maintenance / refactor / tech-debt
EPIC-Umbrella over several tasks

<DOMAIN> is the per-repo first kebab id-segment, discovered and confirmed in Step 1 (e.g. a frontend project might use UI, API, BUILD).

Version and ownership

Nine artifacts carry a four-key .md frontmatter: doc_type: llm, version, generated_by: "brewtools:task-board-setup", last_updated — the task-tracker agent, the task-board and task-spec skills, .claude/rules/tasks.md, and the five .claude/features/** control files. Per-task cards under backlog/, todo/, progress/, closed/ deliberately carry none of the four — they are your data, not generated machinery.

upgrade restamps version / generated_by / last_updated on every run, even when every content row is already a no-op SKIP. That restamp is the only thing that clears the stale verdict /brewcode:setup-status reads off board.md — an upgrade that reports success without moving the stamp sends you round the same loop next session.

Internals: placeholder map + reference files

Placeholder map — derived from confirmed Step 1 findings and substituted into every template before writing:

PlaceholderDerivation
{{DOMAINS}}Confirmed domain id-segment list, comma-separated
{{FIRST_DOMAIN}}DOMAINS[0]
{{EXCLUSIONS}}Confirmed source-dir exclusion list
{{REPO_NAME}}basename of TARGET
{{LANG}}Confirmed doc language
{{TODAY}}ISO date (YYYY-MM-DD)
{{CLOSE_MARKER}} / {{CLOSE_MARKER_SHORT}}Derived from RELEASE_STYLE: vtagvX.Y.Z tag + commit SHA / vX.Y.Z tag; shacommit SHA; nonedate / no tag / superseded / cancelled / no tag

Reference files (loaded from ${CLAUDE_SKILL_DIR}/references/):

FilePurpose
01-analysis.mdStep 1 analysis prompts + AskUserQuestion confirmation contract
02-task-tracker-agent.mdtask-tracker agent template (placeholders)
03-task-board-skill.mdtask-board skill template
04-tasks-rule.mdtasks.md rule template (includes run-at-start rule)
05-features-templates.md.claude/features/** file templates
06-doc-sweep.mdMulti-agent doc-sweep procedure
07-claude-md-optimize.mdOptional gated CLAUDE.md optimization procedure (P5.5)
08-task-spec-skill.mdtask-spec skill template (SPEC_MODE)
09-spec-templates.mdSPEC_TEMPLATE.md + DESIGN_TEMPLATE.md (SPEC_MODE)
10-upgrade.mdupgrade mode — retrofits the spec layer onto an already-deployed board
📝

Setup Status

Read-only dashboard across every -setup skill — installed, stale or missing, with the hand-run command for each.

📋

Manager Setup

Delegation companion — arm a HARD wall that forces the main session to orchestrate via Task/Agent while subagents stay free. Pairs well with task-board-setup for enforcing manager-only orchestration.

📄

Brewtools overview

All brewtools skills — text-optimize, secrets-scan, deploy, provider-switch, and more.

🔗

GitHub source

Source files — SKILL.md and all ten reference templates.

Updating plugins

Use /brewtools:plugin-update to check and update the brewcode plugin suite in one command. See the FAQ for details.