Repository navigation
Releases
v0.12.0
Added
/craftsman:modelsandscripts/craftsman-models: model profiles for the agents. Each agent's
model:line now carries its tier (# tier: deep|balanced|fast), and a profile maps the three
tiers to models. Presets:claude(the shipped opus / sonnet / haiku),claude-fable(deep tier
on Fable — opt-in only, never the default, since it costs more than Opus),inherit,openai,
gemini, andcustomwith per-tier overrides for anything else, including local dense models.
The choice is saved to~/.claude/craftsman/models.conf, and the session-start hook re-applies
it after a plugin update resets the agent files.craftsman-models envprints the
ANTHROPIC_BASE_URL/ANTHROPIC_DEFAULT_*_MODELsettings that non-Claude presets need behind
an Anthropic-compatible gateway.scripts/craftsman-export codex: installs the agents as OpenAI Codex CLI custom agents (model
and reasoning effort from the tier, read-only sandbox unless the agent can edit) and copies the
skills to~/.agents/skills/. Writes a manifest so--uninstallremoves exactly what it wrote.
Changed
commit-craftno longer hardcodesClaude Opus 4.8in its trailer; it names the model the
session is actually running as, and defers to a project or user rule to omit the trailer.- CI checks every agent's model line for a tier comment and syntax-checks the new scripts.
v0.11.0
Added
-
Bundled MCP servers (
craftsman-plugin/.mcp.json):figma(the hosted remote server) and
chrome-devtools(Google's officialchrome-devtools-mcp). Both serve the UI surface —
ui-designerandui-craft— and both are opt-in, going through Claude Code's per-server
approval like any project.mcp.json. Declining both leaves every agent, skill and command
working; nothing hard-depends on them.chrome-devtoolsin particular closes the gapui-designerhas always had to declare under
"Not covered": a build check proves a UI compiles, not that it renders, and hover/focus states
only exist in a live browser. See the plugin README's MCP servers section for the security
notes on each (Figma OAuth scope; Chrome profile isolation).
Changed
-
ui-craftgained four sections covering failure modes that pass visual review and still ship
broken. All four came out of an interaction audit of a real Flutter app, where every one of
them was live in production code:- Every control is keyboard-operable. The skill previously said only "keyboard/focus order
follows visual order" — which assumes the control is focusable at all. A tap handler on a
plain container (GestureDetector,onClickon a<div>) is invisible to Tab traversal, so
a shared button component built that way makes an entire app unusable without a pointer. It
is a WCAG 2.1.1 failure that looks perfect in a screenshot. The section names the four
properties to verify — reachable, operable, visibly focused, correctly excluded when disabled
— and asks for a behavioral test, since none of this is visible in a diff. - The four interaction states are one set. hover / focus / pressed / disabled: define one,
owe all four. Notes that focus is not hover, and that transparent button variants have no
fill to darken and so need their own hover treatment. - Measure the slot, not the window. Breakpoint logic must read the container's width, not
the viewport's. Mixing them — sizing cells from the local constraint while counting columns
from the viewport — is what produces overflow and dead columns. - Fixed extents and scaled text do not mix. Any hardcoded height wrapping text overflows at
the 1.5–2x text scale users actually set.
Also under State-driven UI: distinguish offline from server failure (an auth rejection
arrived over a working connection, so "check your connection" sends the user to debug the wrong
thing), and give skeletons the same extents as the content they stand in for. - Every control is keyboard-operable. The skill previously said only "keyboard/focus order
-
ui-designernow calls out those same four checks explicitly in its Craft section rather
than deferring wholesale to the skill, and its "Not covered" contract widened: contrast ratios,
real text-scale behavior, and hover/focus appearance are all outside what a build check proves
and must be reported as unverified.
v0.10.0
Added
-
/craftsman:discover <vague idea>: a requirements-discovery interview that turns an
underspecified request into a numbered, testable spec. It exists because the shallow end of
ideation-firstwas the only option — 3–5 questions and a three-line brief, with no way to invoke
it deliberately, so a substantially open request ("build a notifications system") got the same
treatment as a merely fuzzy one.The work is split across two surfaces because of a hard constraint: a subagent cannot conduct an
interview. It receives one cold prompt and returns one result, which is whyorchestratoralready
has to bounce underspecified features back to its caller. So the interview runs in the main thread
as a command, and only the half a subagent is genuinely good at — reading the codebase — is
delegated. -
requirements-analystagent (read-only: Read/Glob/Grep, Opus): drafts the clarifying questions a
request leaves unanswered, grounded in prior art and existing abstractions rather than a generic
checklist. Every question carries afile:lineor an explicit "gap" label, plus an assumption
default so the interview never stalls on a declined question; questions the code already settles
come back as constraints instead. Capped at 10–20 questions — past that, it is asking things the
codebase already answers. It never asks the user anything itself and never writes files.
Changed
-
ideation-first: now runs at two depths. Quick is unchanged and still the default (3–5
questions, one per turn, Scope brief). Deep grounds 10–20 questions in the analyst's dossier and
asks them in 3–4 sequenced rounds of 2–4 questions viaAskUserQuestion— a deliberate
divergence from the one-question-per-turn rule, which is right for five questions and punishing for
fifteen. What the rule actually protects is that later questions adapt to earlier answers, and
sequenced rounds preserve that; batching all fifteen at once does not.Deep mode ends by writing a numbered requirements spec (
R1,R2, … each with an acceptance
criterion, sotesterandreviewercan trace coverage back to a requirement) at
docs/requirements/<slug>.md— proposed, shown in full, and written only on confirmation, per the
same ask-before-writing rule/craftsman:initfollows. The Scope brief is still emitted inline
at both depths and remains the machine handoff the planner and the orchestrator's ideation gate
consume; the spec file is additive, and the brief gained aSpec:line pointing at it.New explicit rule: expand the questions, bound the scope. Deep mode raises error states, empty
states, migration, and offline behavior — then still recommends the smallest build that satisfies
the request, with everything surfaced but unagreed recorded under Out of scope. A deep interview
that ends with a bigger scope than a quick one has failed; it should end with the same scope, held
with more confidence and a longer out-of-scope list. Without this, deep mode would have quietly
contradictedsmallest-change-first. -
orchestrator: the ideation gate now accepts either an inline Scope brief or a path to a
requirements spec, and instructs the planner to read the spec when one is named. Availability table
gainsrequirements-analyst. -
/craftsman:orchestrate: the ideation-gate step routes substantially open requests to deep mode
rather than a three-line brief. -
userpromptsubmit-task-router: the feature-shaped nudge names/craftsman:discoverfor
substantially open requests. Still one nudge per prompt; no newcasebranch.
Fixed
session-startannounced "Seven skills" and "Five commands" — both already wrong before this
release (8 and 6), and both invisible to CI: the count validator skips any line containing
"commands" when checking skills, and only matches the literal phrase "N slash commands" for
commands. The whole reminder is a single line, so both slipped through every check. The skill list
was also missingui-craftand the command list was missing/craftsman:orchestrate— a session
therefore started without being told two components existed.
v0.9.0
Added
/craftsman:orchestrate <task>: a slash command for the full pipeline. The orchestrator was the
only major entry point without one, so it never appeared in the/menu — every other command
(init,quick,doctor,review,security) did. It runs the orchestrator's discipline in
the main thread rather than dispatching the agent as a subagent, for two reasons:
orchestration is subagent dispatch and nesting that is unreliable, and the ideation gate needs
interactive Q&A that a subagent cannot hold (as a subagent,orchestratormust bounce
underspecified features back to its caller).@craftsman:orchestratorstill works for running
the pipeline in its own context.
Fixed
- Agent invocation is documented as
@craftsman:<name>throughout. Plugin agents are namespaced,
so the bare@<name>form the docs taught —@orchestratorin both READMEs,docs/use-cases.md,
and theideation-firstskill — matches nothing in the agent picker, making the orchestrator look
like it wasn't installed. Note:craftsman-demo.svgstill shows@orchestratorin its rendered
terminal text; correcting it requires regenerating the asset.
v0.8.0
Added
- Automatic skill-routing hooks so craftsman skills surface from task shape instead of a manual
check. Four new event-driven hooks, all self-contained (they reference onlycraftsman:*skills
and this plugin's own agents, never another plugin) and quiet by default (a nudge fires only on a
real signal):userpromptsubmit-task-router(routes the prompt to the matching agent/skill by
task shape — bug, feature, refactor, security, release, CI, testing, docs, version-control),
pretooluse-git-guard(commit-craft hint ongit commit/push/tag&gh pr),
pretooluse-edit-guard(file-pattern skill hints forKNOWN_ISSUES.md/test/workflow files, and
drops the session marker the close-out hook reads), andstop-closeout(nudges
caveats-and-status once after real edits, then self-deletes its marker — loop-safe via both the
marker andstop_hook_active). - New hook events wired in
hooks.json:UserPromptSubmitandStop(previously only
SessionStart+PreToolUse).
Changed
orchestrator: gate and repair hardening. Adds a handoff contract — every dispatched agent
must close withSTATUS/FILES CHANGED/VERIFIED BY/EVIDENCE/CAVEATS, and gates are checked
against that block rather than the agent's prose, so a missing evidence line now fails the gate
instead of passing on confidence. The repair loop escalates rather than retrying: attempt 2
routes to a different agent (debuggerfor build/test failures,plannerfor review findings)
before re-implementing. The parallelism rule now forbids two file-writing agents running
concurrently (the old "different output artifacts" wording permitted it) and states that parallel
dispatch means multipleAgentcalls in one message. Also: one-sentence scope restatement and a
new-dependency stop before pipeline selection, a bugfix requirement that the regression test fail
before the fix and pass after,Files changed/Verification runlines on the report, and an
explicit "never commit, push, branch, or open a PR unless asked" constraint.session-start: added a proactive lead-in to checkenvironment-quirks.mdbefore retrying a
failed command, and to prefer graphify for navigation whengraphify-out/graph.jsonexists.run-hook.cmd: reworded to drop the superpowers-plugin attribution — the dispatcher and the
whole plugin depend on no other plugin being installed.- README: new "Automatic skill routing (hooks)" section documenting the six hooks, plus the four
routing ideas (skill chaining, parallel analysis, negative filtering, contextual caching) that
are intentionally model/orchestrator behaviors rather than hooks.
v0.7.0
Added
/craftsman:doctor --fix: opt-in remediation for the three detected silent-failure conditions.
Default (no-arg) behavior is unchanged — diagnostic only. With--fix, each repair is shown and
confirmed (y/n) before it runs, then the check is re-run to verify: Git Bash via
winget install Git.Git(lands on the standard path the hook dispatcher already probes, so no
PATH edit), graphify graph viagraphify ., and the Windows python3 Store-stub via
winget install Python.Python.3.12(flagged as a partial fix — the Store app-execution alias may
still need disabling). Falls back to manual install links wherewingetis unavailable.
v0.5.1
Added
- Terminal-style demo image (
craftsman-demo.svg) on the root README showing an orchestrator
bugfix run end to end. CONTRIBUTING.md: local testing via--plugin-dir, validation requirements, component
conventions,run-hook.cmdpolyglot editing rules, and versioning/changelog process.docs/use-cases.md: four worked scenarios (minimal diffs, recurring-bug recall via graphify,
ask-first scaffolding, honest completion).- GitHub issue templates (bug report, feature request) and a Discussions contact link.
Changed
- Restructured both READMEs to lead with the value proposition: a "Why craftsman" problem/solution
table, a 30-second start, and status badges (CI, version, license). Reference content unchanged;
the plugin README's Quick start section merged into the new 30-second start.
Full changelog: https://github.com/bufferBrew/craftsman/blob/main/CHANGELOG.md