From flow
Execute the implementation phase of the flow workflow — read `tasks.md`, pick the next unchecked behavior, write a failing test (when TDD applies), implement until green, commit atomically with conventional commits, and check the box. Use this for any actual code change in a flow task, whether or not a plan exists. Even when the user says "just implement this", invoke develop so the atomic-commit and TDD discipline applies. The skill resumes cleanly from interrupted sessions because `tasks.md` is the source of truth for progress.
How this skill is triggered — by the user, by Claude, or both
Slash command
/flow:developThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Develop turns `tasks.md` into code, one checkbox at a time. Each unchecked behavior becomes a small loop: (write test → implement → green → commit → check the box). The skill is interruption-safe: re-entering finds the next unchecked item and resumes.
Develop turns tasks.md into code, one checkbox at a time. Each unchecked behavior becomes a small loop: (write test → implement → green → commit → check the box). The skill is interruption-safe: re-entering finds the next unchecked item and resumes.
git rev-parse --show-toplevel matches the worktree path).<worktree>/.planning/<date>-<task>/tasks.md exists.plan.md also exists. Develop can run without a plan if the user explicitly chose to skip planning, but only for size S.If tasks.md does not exist and the user is asking for an implementation, run flow:plan first — even a 5-line tasks.md is better than freestyling.
Before touching code, verify the workspace is the one prep would have created. If not, commits will land on the wrong branch.
# Worktree + branch + planning dir presence
WT_PATH="$(git rev-parse --show-toplevel 2>/dev/null)" || { echo "not a git repo"; exit 1; }
WT_PARENT="$(basename "$(dirname "$WT_PATH")")"
case "$WT_PARENT" in *.worktrees) IN_WORKTREE=1;; *) IN_WORKTREE=0;; esac
BRANCH="$(git branch --show-current)"
case "$BRANCH" in feature/*|fix/*|chore/*|refactor/*|docs/*) ON_TASK_BRANCH=1;; *) ON_TASK_BRANCH=0;; esac
TASKS="$(ls -1 .planning/*/tasks.md 2>/dev/null | head -n1)"
Decision matrix:
| Worktree | Task branch | tasks.md | Action |
|---|---|---|---|
| yes | yes | yes | Proceed with the core loop. |
| any | any | no | Stop. Run flow:plan first — develop has nothing to execute without tasks.md. |
| no | no | yes | Suspicious: there is a tasks file but no isolated worktree/branch. Tell the user, then ask: (a) run flow:prep to move the work into a worktree (preferred — preserves the in-progress branch by --force only with explicit consent), (b) continue in-place on the current branch (commits land here — confirm the user accepts that). Do not auto-decide. |
| no | yes | yes | On a task branch but not in a worktree. Usually fine (the user just opened the branch directly without prep). Confirm with the user once at the start of the session, then continue. Future commits land on this branch. |
Special case — uncommitted changes on a non-task branch (e.g., main): stop immediately. Do not commit on main. Offer to stash + run flow:prep to move the work into a fresh worktree.
For each unchecked item in tasks.md, top to bottom:
../../references/tdd-policy.md. If unsure, default to TDD.../../references/commit-conventions.md. For TDD pairs, you may either commit test and impl separately (two commits) or together (one commit). Prefer two commits when the change is non-trivial — the failing-test step is informative in history.tasks.md — check the box. Save the file. This must happen after the commit, so a partial work-in-progress doesn't show as completed if the session is interrupted.When develop is invoked and tasks.md already has some checked items:
tasks.md start-to-finish.git status and git log --oneline -n 10.Never auto-discard uncommitted changes. Always ask first.
For pure frontend implementation tasks — building a component, applying styling, wiring up a form — the user may prefer to delegate to Gemini. Defaults:
When in doubt, ask the user once at the start of develop ("Frontend portion — Claude or Gemini?") and remember the answer for this session. Do not ask before every task.
Gemini invocation:
gemini --model gemini-3.1-pro --yolo --skip-trust --prompt "$(cat <<'PROMPT'
You are implementing a frontend task. The plan and tasks live at:
- <abs-path>/.planning/<date>-<task>/plan.md
- <abs-path>/.planning/<date>-<task>/tasks.md
Implement only the next unchecked task: "<paste the task GWT verbatim>".
Follow the existing component patterns under <abs-path>/src/...
Write the Vitest test first.
Output the changed files as paths + full file content; I will apply them.
PROMPT
)" > /tmp/gemini-impl.txt
Then read the output, apply the changes via Edit/Write, run the test yourself, and commit. The Claude session retains responsibility for the test passing and the commit.
If the worktree looks like a web frontend project (Vite/Next.js, React, etc.):
vi.mock only for things you don't own (file system, timers, third-party modules).For other stacks (backend Node, Python, Go), use whatever the repo already uses. Don't introduce a new test framework — that's a separate task.
tasks.md before committing. Commit first, then check the box.tasks.md and keep moving.../../references/tdd-policy.md../../references/commit-conventions.md../../references/multi-llm.md../../references/models.mdGuides creation, editing, and verification of skills for AI coding agents using test-driven development with subagent scenarios. Use when authoring or debugging skills.
npx claudepluginhub gitgitwi/council-flow --plugin flow