A Claude Code plugin bundling Daniel's general engineering workflow skills: collaborative PR review, durable multi-step planning, auditable quantitative analysis pipelines with independent fact-checking, and a repo-native task loop for capturing and processing follow-up work.
/plugin marketplace add bestdan/workflow-skills
/plugin install workflow-skills@workflow-skills17 skills, 21 commands, and 2 subagents, organized into eight workflows. Each entry links to its own doc — that's where the flags, edge cases, and handler support live.
| Skill | Trigger | What it does |
|---|---|---|
| co-review | /co-review [PR# | --local | --remote | --post] [--base <branch>] |
Review a PR yourself, pull in other local agents (codex, agy, devin, copilot, crush, grok) as extra reviewers, reconcile everything against existing GitHub comments, auto-fix the high-confidence items, and surface the judgment calls. |
| local-review | "let me look over these changes", "open the diff so I can comment" | Open a GitHub-style split-diff UI on localhost so you read an agent's changes and leave inline line comments; the feedback is written to a file the agent acts on. Local-only — nothing touches GitHub unless you flag a comment for it. |
Run local-review by hand (no agent needed): the server is a plain script — alias it once and review any patch:
# ~/.zshrc — a function, not an alias: the cache keeps one directory per
# installed plugin version, so pick the newest deterministically instead of
# letting a glob expand to several paths.
local-review() {
python3 "$(ls -d "$HOME"/.claude/plugins/cache/workflow-skills/workflow-skills/*/scripts/local-review/server.py | sort -V | tail -1)" "$@"
}
cd my-worktree
local-review --git main # committed diff of my-branch vs main
local-review --git uncommitted # live diff of uncommitted worktree editsOpen the printed Review UI: URL. --git uncommitted re-reads the worktree
live, so further edits show up via the Refresh button; --git <ref> and
--git <A>...<B> diff commit-to-commit, so Refresh only picks up new content
when the refs themselves move (a new commit, a rebase), not a worktree edit.
For a patch file instead, pass --diff-file PATCH --title "<label>" (a
static snapshot; --title names the change in the header, otherwise the
patch path is shown).
Approve the reviewer commands once. co-review hands each local reviewer a
fixed input file on stdin (or via --prompt-file for devin), so the command
string never changes and you can approve each reviewer with an exact-match,
read-only rule instead of a broad wildcard. The skill's Permissions section
has the exact JSON — merge it into permissions.allow in
~/.claude/settings.json or the repo's .claude/settings.json.
| Skill | Trigger | What it does |
|---|---|---|
| plan-with-docs | /plan-with-docs, or after approving a plan in plan mode |
Write a multi-step plan as one markdown file per PR-sized task under dev_docs/tasks/<name>_plan/, then refine it through clarifying questions. |
| research-spike | filing/answering a question, registering an obligation, promoting a decision, checking convergence | Run a research spike through an obligation ledger, so a converging question count can't hide a climbing count of deferred work. |
Capture follow-up work with full context during development, then process it
automatically. The task skill auto-triggers on
deferred-work language and carries the file format, capture workflow, and
handler abstraction; the commands below do the work.
Where tasks land is configured per repo — repo-pr (markdown PR, default),
gh-issue, jira, or linear. Handler support is jagged, and
commands/task-config.md holds the authoritative
capability matrix.
| Command | Trigger | What it does |
|---|---|---|
/add-task |
/add-task [description] |
Capture follow-up work and deliver it via the configured handler. |
/do-tasks |
/do-tasks [slug | --all | -n N] [--remote|--local] |
The single execute verb — turn dependency-ready tasks into PRs, one in-session or N dispatched, bounded by wip_limit. |
/list-tasks |
/list-tasks [status] |
Table of all tasks with status, priority, size, blockers, tags, and expiry. |
/promote-tasks |
/promote-tasks [dry-run | apply] |
Score new tasks against the confidence check and promote them to ready or needs_refinement. |
/push-plan |
/push-plan <name> [--ready-only] |
Push a vetted local plan to the tracker in dependency order, recording ids back so re-runs don't duplicate. |
/reoptimize-tasks |
/reoptimize-tasks [project | initiative | team] [name] |
The inverse of /push-plan — reconcile prose dependencies against native relations and fix cycles, stale links, and overlap. |
/task-config |
/task-config [handler] |
Choose the handler and verify its prerequisites (writes dev_docs/tasks/.task-config.yml). |
/complete-task |
/complete-task <identifier> [--dry-run] |
Transition one identified work item to its tracker's completed state. All four handlers. |
/archive-tasks |
/archive-tasks [--older-than <N>d] [--issues <refs>] [--all] [dry-run] |
Retire terminal-state work past an age threshold. A sweep refuses to mutate without a threshold. |
/sweep-for-complete |
/sweep-for-complete [--apply] [--all] [--project <id|name>] |
Find started-state issues whose linked PR merged and complete exactly those. linear-only (v1). |
/reconcile-tasks |
/reconcile-tasks [--apply] [--all] [--project <id|name>] |
Fix issues sitting in the wrong state, against a fixed rule table. linear and gh-issue, each with its own table. |
/find-false-closures |
/find-false-closures [--apply] [--project <uuid>] [--repo <owner/name>] |
Detect completed issues no merged PR owns (the bare-id over-close bug) and restore them. linear-only. |
/sweep-for-archive |
/sweep-for-archive [--since 24h] [--apply] [...] |
Close-out sweep: verify the window's closures, complete what merged, archive exactly what was proved delivered. linear-only. |
/doctor |
/doctor [--fix] |
Diagnose the setup — config, prerequisites, legacy dirs, schema drift, co-review allow-rules — as PASS/WARN/FAIL. |
| break-down-task | a task is too big for one PR, or "split / slice / break down this task" | Find the natural shear points in an over-sized task and replace it with PR-sized components chained by is_blocked_by. |
/sweep-for-complete, /reconcile-tasks, /find-false-closures, and
/sweep-for-archive are dry-run-by-default and safe to schedule via /loop or
/schedule.
| Skill | Trigger | What it does |
|---|---|---|
| orchestrate-coders | /orchestrate-coders <task> [--coder <backend>[:<model>]]... [-n N] |
Turn the session into an orchestrator that writes no feature code: decompose into PR-sized packets, dispatch each to a coder backend in an isolated worktree, verify every diff, integrate. |
| select-coder | /select-coder <task> [--refresh] [-n N], or "which model should implement this" |
Probe which backends are actually available, profile the task, and return N ranked <backend>:<model> specs with rationale. |
| assess-task | /assess-task <task>, or "how hard / mechanical is this task" |
Profile what a task demands — complexity, creativity, scope, autonomy, cost sensitivity, verification criticality. Never picks a model. |
/refresh-coder-comparison |
/refresh-coder-comparison [backend | model], or a stale matrix cache date |
Re-research the capability matrix — benchmarks, pricing, model rosters, vendor terms — and write it back into select-coder/matrix.md. |
| Skill | Trigger | What it does |
|---|---|---|
| deliver-task | /deliver-task <slug | id> [--base <branch>] [--questions <path>] |
One task, all the way: claim → implement via a routed worker in an isolated worktree → verify → PR → non-interactive co-review → hand off at needs_review, never done. |
| auto-pilot | /auto-pilot <linear-project | plan-dir> (in progress) |
Advance a whole task graph unattended — a thin orchestrator walking the graph via /deliver-task, with crash-resumable state. See the design notes. |
| Skill | Trigger | What it does |
|---|---|---|
| analysis-pipeline | /analysis-pipeline, or auto when building report-producing analyses |
Structure quantitative work as model → template → fill pipelines, with input provenance and reproducible output. Ships a working example/. |
| review-facts | /review-facts |
Spawn the fact-reviewer subagent to verify links, cited values, reproducibility, number-trace, descriptors, units, formulas, and the recommendation. |
| analysis-conventions | auto when writing notebooks or analysis scripts | Conventions for analysis code: marimo vs plain scripts, uv run, scratchpad patterns, notebook structure. Not user-invocable. |
| Skill | Trigger | What it does |
|---|---|---|
| tutor | /tutor [--pr <N> | --diff [<ref>] | <path>], or "quiz me on this" |
Teach you the work until you can defend it: elicit first, close the gap, verify with a counterfactual quiz. An item is checked off only once you've demonstrated it. |
| research-spike-tutorial | "walk me through how the research-spike obligation ledger works" | A hands-on tutorial against a disposable tree under a temp dir — hit the "destination must already exist" wall for real, then watch the divergence. |
The plugin registers four hooks. Three of them create and tear down an
isolated worktree without anything being typed: WorktreeCreate puts it where
scripts/worktree-config.sh says worktrees live
(not inside the repo, which aborts in a repo that versions its own agent
config), WorktreeRemove tears down only what the exiting session itself
created, and a PostToolUse reminder on ExitWorktree says teardown ends
there. Teardown covers the paths the harness dispatches: an explicit
ExitWorktree and the interactive exit dialog. An unattended (claude -p)
exit fires SessionEnd and nothing else, and subagent worktrees are never
handed to the hook, so both still need a manual run of the same scripts —
they are plain scripts you can run by hand either way:
scripts/worktree-remove.sh <path> and scripts/branch-remove.sh <branch>.
The fourth, a PreToolUse guard
(scripts/guard-foreign-worktree.py),
refuses a write into a worktree of the same repo that the session never
entered — git -C <path> commit, cd <path> && …, a redirect, or a heredoc
naming the path — and points at EnterWorktree instead. Reads are allowed.
It also warns once when write-work starts in a main checkout on its default
branch. Bypass one Bash call with
env WORKFLOW_SKILLS_ALLOW_FOREIGN_WRITE=1 <command>.
| Skill | Trigger | What it does |
|---|---|---|
| worktree-teardown | auto, when a removal fails, refuses, or half-completes | The mechanics behind the teardown scripts: the submodule force gates, the PR-evidence branch delete, and the half-deleted and locked recovery cases. Not user-invocable. |
- fact-reviewer — read-only auditor used by
/review-facts. Fresh context,Read/Glob/Grep/Bash/WebFetch. Reports findings; never edits the analysis. - co-review-reconciler — judges review
findings for
/co-review.Read/Glob/Grep/Bash, noEdit/Write: it returns a verdict, never the fix it just graded.
- Overnight auto-resume (
car) — an external launcher you run instead ofclaudethat survives the 5-hour usage cap: it detects a cap-kill, sleeps until reset, and resumes the same conversation.
When you ask Claude to analyze something — compare vendors, project costs, evaluate options — the default behavior is to do the math in its head and write the answer directly into prose:
Based on the pricing, Vendor A costs $2,510/year, Vendor B costs $2,627/year, and Vendor C costs $2,197/year. I recommend Vendor C, saving $430/year.
This looks helpful but is fragile: you can't tell where the numbers came from, you can't update them when inputs change, and you can't verify the math. The analysis-pipeline and review-facts skills push Claude to structure analyses as reproducible pipelines instead — every number traces back to a named, sourced input, and a separate agent audits the result before it ships.
skills/analysis-pipeline/example/ contains a complete working pipeline (vendor cost comparison) you can run:
cd skills/analysis-pipeline/example
uv run model.py # compute all values -> model_output.json
uv run fill_templates.py # fill template placeholders -> memo.filled.mdThen audit it:
/review-facts .
Third-party marketplaces have auto-update disabled by default. Enable auto-update in the /plugin UI (Marketplaces tab), or update manually:
/plugin marketplace update bestdan/workflow-skills
/reload-pluginsRun the full quality gate locally with just check. Start at
AGENTS.md for the map of the repo and the conventions that are
load-bearing, then CONTRIBUTING.md for the dev loop and the
"adding a skill" checklist.
MIT