diff --git a/README.md b/README.md index cfefff55e..58beaf4ec 100644 --- a/README.md +++ b/README.md @@ -47,7 +47,7 @@ Browse and manage with `/plugin`. To refresh after updates: `/plugin marketplace - [`actionlint`](plugins/actionlint) — Lint GitHub Actions workflow files on edit via actionlint, surfacing findings as advisory context. - [`source-control`](plugins/source-control) — Git and GitHub delivery workflow: /commit (Conventional Commits + Co-Authored-By trailer via safe heredoc mechanics), /pull-request (prep, create, CI monitoring, review-comment triage, merge, multi-PR babysit loop), /worktree (create, status, cleanup, audit for parallel-session isolation), /setup (interview the repo and write the tracked commit-subject / PR-title convention config), and /resolve-conflicts (intent-first merge/rebase conflict resolution with a semantic-conflict sweep — never --abort). The commit-subject / PR-title convention is configurable per repo via a tracked .claude/source-control.md config written by a re-runnable setup skill; Conventional Commits is the default when no convention is declared. - [`implementation`](plugins/implementation) — Disciplined implementation stage: execute approved plans inline (`/implementation:implement`) or via orchestrated worker subagents (`/implementation:implement-dispatch`) with incremental validation, TDD-by-default cadence, green-checkpoint commits, scope-fence drift detection, and divergence detection that routes back to planning. Build/test/lint, testing, and outcome verification live in the companion `toolchain`, `testing`, and `verification` plugins, invoked when installed. -- [`toolchain`](plugins/toolchain) — Repo-agnostic polyglot verification toolchain: build + test + lint for changed files across .NET, Python, TypeScript, Bash, PowerShell, Markdown, YAML, and cross-cutting surfaces (`/toolchain:build`, `/toolchain:lint`), plus a re-runnable `/toolchain:setup` that writes the tracked per-ecosystem command config those skills resolve first. +- [`toolchain`](plugins/toolchain) — Repo-agnostic polyglot verification toolchain: build + test + lint for changed files across .NET, Python, TypeScript, Bash, PowerShell, Markdown, YAML, and cross-cutting surfaces (`/toolchain:check`, `/toolchain:lint`), plus a re-runnable `/toolchain:setup` that writes the tracked per-ecosystem command config those skills resolve first. ### Testing diff --git a/docs/conventions/ecosystem-commands/README.md b/docs/conventions/ecosystem-commands/README.md index 21d911156..0d8ebd7c8 100644 --- a/docs/conventions/ecosystem-commands/README.md +++ b/docs/conventions/ecosystem-commands/README.md @@ -11,8 +11,8 @@ This directory is the source of truth: `ecosystem.schema.json` (per-file schema) ## Why this contract exists Before it, the same command truth was encoded independently in at least three places across this -marketplace — the `toolchain` plugin's `/toolchain:build` reference table, its `/toolchain:lint` reference table -(already divergent from `/toolchain:build`'s), and the `review` `ecosystem-specialist` agent's inline +marketplace — the `toolchain` plugin's `/toolchain:check` reference table, its `/toolchain:lint` reference table +(already divergent from `/toolchain:check`'s), and the `review` `ecosystem-specialist` agent's inline defaults — with no consumer-declared source any of them could defer to. The concern is cross-plugin by demonstrated fact, so the contract lives here in marketplace conventions (the same reasoning as `docs/conventions/hook-telemetry/`), not inside any one plugin. diff --git a/docs/topics/plugin-organization/PLAN.md b/docs/topics/plugin-organization/PLAN.md index 97e1faf50..3a27dee8b 100644 --- a/docs/topics/plugin-organization/PLAN.md +++ b/docs/topics/plugin-organization/PLAN.md @@ -31,7 +31,7 @@ history; grouping lives in marketplace metadata. | D10 | `claude-ops` unchanged as plugin; skills deprefixed: `claude-code-changelog` → `changelog`, `claude-observability` → `observability`, `claude-troubleshooting` → `troubleshoot`. | | D11 | `mcp-tool-audit` → `mcp-tools`, skill → `audit` (verified generic-MCP, standalone domain). | | D12 | `codebase-audit` → `codebase-health`, skill → `audit`. | -| D13 | `implementation` splits four ways: `toolchain` (`build`, `lint`, `setup`), `testing` (`plan`, `write`, `e2e`, `diagnose` — was test-*), `verification` (`confirm` — was verify-changes, `measure` — was verify-improvement), `implementation` (`implement`, `implement-dispatch`). Mechanism moves, obligation stays: implement builds via `/toolchain:build` seam; cross-plugin references presence-gated. | +| D13 | `implementation` splits four ways: `toolchain` (`build` — since renamed `check`, `lint`, `setup`), `testing` (`plan`, `write`, `e2e`, `diagnose` — was test-*), `verification` (`confirm` — was verify-changes, `measure` — was verify-improvement), `implementation` (`implement`, `implement-dispatch`). Mechanism moves, obligation stays: implement builds via `/toolchain:check` seam; cross-plugin references presence-gated. | | D14 | `tdd` stays standalone; skill → `principles`. | | D15 | `work-items` skill splits five ways: `track` (add/start/done/list/stats/search/due/recheck/audit), `triage`, `work`, `decompose`, `scan`. | | D16 | `context7`: skill → `lookup` + new `setup` (absorbs configure, `disable-model-invocation: true`); `update` stays inline maintainer action. | diff --git a/plugins/implementation/.claude-plugin/plugin.json b/plugins/implementation/.claude-plugin/plugin.json index 7eb0f7ba8..adfd87ff9 100644 --- a/plugins/implementation/.claude-plugin/plugin.json +++ b/plugins/implementation/.claude-plugin/plugin.json @@ -1,7 +1,7 @@ { "$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json", "name": "implementation", - "version": "0.6.0", + "version": "0.6.1", "description": "Disciplined implementation stage: execute approved plans inline (`/implementation:implement`) or via orchestrated worker subagents (`/implementation:implement-dispatch`) with incremental validation, TDD-by-default cadence, green-checkpoint commits, scope-fence drift detection, and divergence detection that routes back to planning. Build/test/lint, testing, and outcome verification live in the companion `toolchain`, `testing`, and `verification` plugins, invoked when installed.", "author": { "name": "Melodic Software", diff --git a/plugins/implementation/CHANGELOG.md b/plugins/implementation/CHANGELOG.md index bceee2478..2dd7e66c5 100644 --- a/plugins/implementation/CHANGELOG.md +++ b/plugins/implementation/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to the `implementation` plugin are documented here. Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/); this plugin uses semantic versioning. +## [0.6.1] + +### Changed + +- References to the renamed `/toolchain:build` skill now invoke `/toolchain:check` (toolchain 0.2.0 breaking rename). Version bumped so existing installs pick up the rewritten prompts. + ## [0.6.0] ### Changed — nine skills extracted into three new plugins (migration required to retain them) diff --git a/plugins/implementation/README.md b/plugins/implementation/README.md index 5ba053a02..e481b93ca 100644 --- a/plugins/implementation/README.md +++ b/plugins/implementation/README.md @@ -17,7 +17,7 @@ Build/test/lint, testing, and outcome verification were split out of this plugin three companion plugins. This plugin invokes them when installed and degrades gracefully when absent — no hard dependencies: -- **`toolchain`** — `/toolchain:build` runs after each logical block and at completion; +- **`toolchain`** — `/toolchain:check` runs after each logical block and at completion; when the plugin is absent this skill runs the project's own build/test command. - **`testing`** — `/testing:plan`, `/testing:write`, `/testing:diagnose` for coverage, authoring, and failure diagnosis. @@ -60,7 +60,7 @@ plugins. `implementation` keeps its name, so the marketplace's `renames` map (wh renamed or removed plugin automatically) does not apply — install the plugins you relied on: ```shell -/plugin install toolchain@melodic-software # build, lint, setup +/plugin install toolchain@melodic-software # check (was build), lint, setup /plugin install testing@melodic-software # test-plan, test-write, test-e2e, test-diagnose /plugin install verification@melodic-software # verify-changes, verify-improvement ``` diff --git a/plugins/implementation/skills/implement-dispatch/SKILL.md b/plugins/implementation/skills/implement-dispatch/SKILL.md index 1bf8bf093..65309cc09 100644 --- a/plugins/implementation/skills/implement-dispatch/SKILL.md +++ b/plugins/implementation/skills/implement-dispatch/SKILL.md @@ -33,7 +33,7 @@ Run the `/implementation:implement` "Step 1: Prerequisite Check" preflight first 1. **Compose the brief** — an explicit scope fence (ALLOWED files/actions and FORBIDDEN files/actions, enumerated), a divergence-escalation clause (verbatim in every brief: "if an assumption in this brief proves wrong or the task requires touching anything FORBIDDEN, STOP and report — do not improvise"), the project invariants the task touches (from the consuming project's `CLAUDE.md` / rules), the phase's acceptance criteria, and any model routing the plan specifies 2. **Dispatch** the worker 3. **Verify the return against direct evidence before accepting edits** — worker returns are synthesis, not ground truth; promote their claims to direct evidence (diff read, grep, file Read) before building on them -4. **Build/test main-side** — invoke `/toolchain:build` from the main window when the `toolchain` plugin is installed, otherwise run the project's own build/test command main-side; never accept a worker's green claim as the build signal +4. **Build/test main-side** — invoke `/toolchain:check` from the main window when the `toolchain` plugin is installed, otherwise run the project's own build/test command main-side; never accept a worker's green claim as the build signal 5. **Route worker divergence reports into `/implementation:implement` "Step 3: Divergence Detection"** — a worker STOPping per the divergence-escalation clause is a divergence signal, severity-assessed the same way; the orchestrator revises the brief or routes back to the planning skill (`/planning:architect review` when installed) ## Divergence in non-interactive runs @@ -63,7 +63,7 @@ Any criterion fails → clear + resume from the emitted prompt. **The phase-boun | Phase is inline-routed (main-window), interactive mode | Hand back to `/implementation:implement` classic cadence | | Phase is inline-routed or routing table absent, autonomous mode | Synthesize a worker row and dispatch — the orchestrator never does volume edits | | Worker divergence report | Severity-assess per `/implementation:implement` "Step 3: Divergence Detection"; Major → the planning skill (`/planning:architect review` when installed) | -| Every worker return | Verify against direct evidence, then `/toolchain:build` main-side (when the `toolchain` plugin is installed; else the project's own build) | +| Every worker return | Verify against direct evidence, then `/toolchain:check` main-side (when the `toolchain` plugin is installed; else the project's own build) | | Phase sanity check passes | `/implementation:implement` "Step 4" ritual (its item-1 verifier gate applies in every mode; orchestrated runs dispatch it — see Phase boundaries) | | All phases complete | `/implementation:implement` "Step 5: Completion and Handoff" | @@ -71,11 +71,11 @@ Any criterion fails → clear + resume from the emitted prompt. **The phase-boun - **Does not edit inline** — inline execution cadence, commit discipline, and mode context files (feature/bugfix/refactor) are `/implementation:implement`'s - **Does not create or revise plans** — a planning pass produces plans; this skill executes routing tables -- **Does not replace `/toolchain:build`** — the `toolchain` plugin's build skill (when installed) is the SSOT; this skill invokes it main-side at the right moments, falling back to the project's own build command when that plugin is absent +- **Does not replace `/toolchain:check`** — the `toolchain` plugin's check skill (when installed) is the SSOT; this skill invokes it main-side at the right moments, falling back to the project's own build command when that plugin is absent ## Gotchas -- **Never accept a worker's green claim as the build signal.** Workers report synthesis; the main window runs `/toolchain:build` (or the project's own build when the `toolchain` plugin is absent) itself after every accepted return +- **Never accept a worker's green claim as the build signal.** Workers report synthesis; the main window runs `/toolchain:check` (or the project's own build when the `toolchain` plugin is absent) itself after every accepted return - **A worker STOP is a divergence signal, not a failure.** Route it through the `/implementation:implement` Step 3 severity ladder; revising the brief is the cheap fix, a plan review the escalation - **Surface subagent results before ending the turn.** Results left unsurfaced at turn end are lost to the user - **Scope-fence drift applies to agent returns.** Every worker return is a decision boundary — classify proposed follow-ups per `/implementation:implement` "Step 3.5: Scope-fence drift detector (run at every decision boundary)" before announcing them diff --git a/plugins/implementation/skills/implement-dispatch/evals/evals.json b/plugins/implementation/skills/implement-dispatch/evals/evals.json index a14606970..fad748c04 100644 --- a/plugins/implementation/skills/implement-dispatch/evals/evals.json +++ b/plugins/implementation/skills/implement-dispatch/evals/evals.json @@ -30,12 +30,12 @@ "id": 3, "name": "verifies-worker-return-against-direct-evidence", "prompt": "/implementation:implement-dispatch phase-2 — the worker for phase 2 reported back: 'Done, all files updated and the build is green.' Accept the phase and move on.", - "expected_output": "Treats the worker return as synthesis, not ground truth: promotes its claims to direct evidence (diff read, grep, file Read) and runs /toolchain:build itself main-side before accepting the edits — it never accepts the worker's green claim as the build signal.", + "expected_output": "Treats the worker return as synthesis, not ground truth: promotes its claims to direct evidence (diff read, grep, file Read) and runs /toolchain:check itself main-side before accepting the edits — it never accepts the worker's green claim as the build signal.", "files": [], "expectations": [ "Does NOT accept the worker's 'build is green' claim as the authoritative build signal", "Verifies the worker's claims against direct evidence (reads the diff / greps / reads files) before building on them", - "Runs /toolchain:build itself from the main window rather than trusting the worker's report" + "Runs /toolchain:check itself from the main window rather than trusting the worker's report" ] }, { diff --git a/plugins/implementation/skills/implement/SKILL.md b/plugins/implementation/skills/implement/SKILL.md index 724eb3a96..d3fbead68 100644 --- a/plugins/implementation/skills/implement/SKILL.md +++ b/plugins/implementation/skills/implement/SKILL.md @@ -63,7 +63,7 @@ Core execution loop. Key discipline: **validate after each logical block, not ju ### Execution cadence 1. **Implement one logical block** — a single concern, function, class, or feature slice. Not the entire plan at once -2. **Build check** — invoke `/toolchain:build` (via Skill tool) for the affected ecosystem after each block when the `toolchain` plugin is installed; otherwise run the project's own build/test command directly. Catch compilation errors immediately, not after 5 files of changes. In non-interactive runs, tier the in-loop cost: typecheck/compile and the touched test files run per block; the broader affected-ecosystem test suite runs at phase boundaries and Step 5 — early detection stays, redundant full-suite passes go +2. **Build check** — invoke `/toolchain:check` (via Skill tool) for the affected ecosystem after each block when the `toolchain` plugin is installed; otherwise run the project's own build/test command directly. Catch compilation errors immediately, not after 5 files of changes. In non-interactive runs, tier the in-loop cost: typecheck/compile and the touched test files run per block; the broader affected-ecosystem test suite runs at phase boundaries and Step 5 — early detection stays, redundant full-suite passes go 3. **Test (TDD by default)** — when the `tdd` plugin is installed, invoke `/tdd:principles` via Skill tool **before writing the first test** for authoritative guidance on what to test, which testing style fits (output/state/communication), and when to mock. Then follow Red-Green-Refactor **one test at a time**: write a single failing test for the smallest slice of behavior, confirm it fails (red), implement the minimum to pass (green), refactor — then move to the next slice. **Do not write all tests upfront** — writing one at a time keeps each red signal observable (proving the test can fail before code makes it pass) and stops you over-fitting code to tests written against a design that doesn't exist yet. TDD is the default — skip only when genuinely impractical (e.g., pure infrastructure wiring with no testable logic, or UI rendering with no logic behind the seam). Honor the consuming project's own testing conventions (its `CLAUDE.md` / rules) 4. **Commit checkpoint** — commit after tests pass. Each commit should represent a green state. See below for commit discipline 5. **Repeat** until the plan is complete @@ -172,7 +172,7 @@ In orchestrated runs, the orchestrator may stay resident across phase boundaries When all planned work is done: -1. **Final build check** — invoke `/toolchain:build` via the Skill tool for all affected ecosystems when the `toolchain` plugin is installed; otherwise run the project's own build/test command +1. **Final build check** — invoke `/toolchain:check` via the Skill tool for all affected ecosystems when the `toolchain` plugin is installed; otherwise run the project's own build/test command 2. **Run all affected tests** — not just the ones you wrote, but tests that could be impacted by your changes 3. **Self-review (a floor, not the final verdict)** — the producing context converges on approval, so this catches slips but does not render the outcome verdict (step 5 hands to `/verification:confirm`, which renders it from outside the producing loop). Read through changes (`git diff HEAD~N`) looking for: - Consistency with existing patterns @@ -187,7 +187,7 @@ When all planned work is done: | Condition | Action | |-----------|--------| | Before writing first test | Invoke `/tdd:principles` via Skill tool (when installed) for test design guidance | -| After each logical block | Invoke `/toolchain:build` via Skill tool (when the `toolchain` plugin is installed; else the project's own build) | +| After each logical block | Invoke `/toolchain:check` via Skill tool (when the `toolchain` plugin is installed; else the project's own build) | | At every phase boundary | Run the Step 4 ritual (plan marks + handoff entry + status + commit + resume prompt) | | Worker-routed phase or autonomous orchestration | Invoke `/implementation:implement-dispatch` via Skill tool | | Divergence detected (major) | Route back to the planning skill (`/planning:architect review` when installed) | @@ -201,7 +201,7 @@ When all planned work is done: - **Does not auto-execute plans** — guides execution with checkpoints and validation. Code changes are still judgment calls - **Does not replace `/verification:confirm`** — the `verification` plugin's outcome-verification skill (a separate plugin, when installed) does comprehensive build + test + lint + outcome verification. This skill does incremental validation during implementation - **Does not produce plans** — a planning pass does. If the plan needs revision, this skill routes back to it -- **Does not replace `/toolchain:build`** — the `toolchain` plugin's build skill (a separate plugin, when installed) is the SSOT for build commands; this skill invokes it at the right moments and falls back to the project's own build command when that plugin is absent +- **Does not replace `/toolchain:check`** — the `toolchain` plugin's check skill (a separate plugin, when installed) is the SSOT for build commands; this skill invokes it at the right moments and falls back to the project's own build command when that plugin is absent - **Does not orchestrate workers** — `/implementation:implement-dispatch` owns the orchestrated dispatch cadence for worker-routed phases and autonomous runs. This skill detects the routing and chains to it ## Gotchas diff --git a/plugins/source-control/.claude-plugin/plugin.json b/plugins/source-control/.claude-plugin/plugin.json index 3ab314398..9943dc455 100644 --- a/plugins/source-control/.claude-plugin/plugin.json +++ b/plugins/source-control/.claude-plugin/plugin.json @@ -1,7 +1,7 @@ { "$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json", "name": "source-control", - "version": "0.5.0", + "version": "0.5.1", "description": "Git and GitHub delivery workflow: /commit (Conventional Commits + Co-Authored-By trailer via safe heredoc mechanics), /pull-request (prep, create, CI monitoring, review-comment triage, merge, multi-PR babysit loop), /worktree (create, status, cleanup, audit for parallel-session isolation), /setup (interview the repo and write the tracked commit-subject / PR-title convention config), and /resolve-conflicts (intent-first merge/rebase conflict resolution with a semantic-conflict sweep — never --abort). The commit-subject / PR-title convention is configurable per repo via a tracked .claude/source-control.md config written by a re-runnable setup skill; Conventional Commits is the default when no convention is declared.", "author": { "name": "Melodic Software", diff --git a/plugins/source-control/CHANGELOG.md b/plugins/source-control/CHANGELOG.md index eca302d34..561e9ad61 100644 --- a/plugins/source-control/CHANGELOG.md +++ b/plugins/source-control/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to the `source-control` plugin are documented here. Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/); this plugin uses semantic versioning. +## [0.5.1] + +### Changed + +- References to the renamed `/toolchain:build` skill now invoke `/toolchain:check` (toolchain 0.2.0 breaking rename). Version bumped so existing installs pick up the rewritten prompts. + ## [0.5.0] ### Added diff --git a/plugins/source-control/skills/pull-request/reference/prep.md b/plugins/source-control/skills/pull-request/reference/prep.md index f5ccbdb33..70c208360 100644 --- a/plugins/source-control/skills/pull-request/reference/prep.md +++ b/plugins/source-control/skills/pull-request/reference/prep.md @@ -46,7 +46,7 @@ Unless `quick` or `review-only` scope: ## 1.5 Verify gate (HARD — blocks PR creation) -Run the project's full build + test + lint surface — via its verify skill when one exists (e.g. a `/verification:confirm` or `/toolchain:build` command), otherwise the ecosystem-native commands (`dotnet build && dotnet test`, `npm test`, `pytest`, shellcheck, markdownlint, …) for every ecosystem the branch touches. **All results must be clean before proceeding to PR creation.** +Run the project's full build + test + lint surface — via its verify skill when one exists (e.g. a `/verification:confirm` or `/toolchain:check` command), otherwise the ecosystem-native commands (`dotnet build && dotnet test`, `npm test`, `pytest`, shellcheck, markdownlint, …) for every ecosystem the branch touches. **All results must be clean before proceeding to PR creation.** **Run the full cross-cutting surface, not just the "obvious" ecosystem.** A branch that "looks dotnet-only" can still break CI through a touched README, an unmarked `.sh` script, or a modified workflow file. Mirror locally whatever CI will run — the project's CI workflows are the canonical list of what must pass. diff --git a/plugins/testing/.claude-plugin/plugin.json b/plugins/testing/.claude-plugin/plugin.json index a1bf6b18b..7216f520d 100644 --- a/plugins/testing/.claude-plugin/plugin.json +++ b/plugins/testing/.claude-plugin/plugin.json @@ -1,7 +1,7 @@ { "$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json", "name": "testing", - "version": "0.1.0", + "version": "0.1.1", "description": "Test-stage discipline across all ecosystems: coverage-gap analysis and test planning (`/testing:plan`), TDD test authoring and placement (`/testing:write`), live E2E plus non-UI smoke verification (`/testing:e2e`), and failing-test root-cause diagnosis with the reproduce → isolate → fix → retest loop (`/testing:diagnose`).", "author": { "name": "Melodic Software", diff --git a/plugins/testing/CHANGELOG.md b/plugins/testing/CHANGELOG.md index a7d949215..aff931927 100644 --- a/plugins/testing/CHANGELOG.md +++ b/plugins/testing/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to the `testing` plugin are documented here. Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/); this plugin uses semantic versioning. +## [0.1.1] + +### Changed + +- References to the renamed `/toolchain:build` skill now invoke `/toolchain:check` (toolchain 0.2.0 breaking rename). Version bumped so existing installs pick up the rewritten prompts. + ## [0.1.0] ### Added diff --git a/plugins/testing/README.md b/plugins/testing/README.md index 0031363fe..442dd25f4 100644 --- a/plugins/testing/README.md +++ b/plugins/testing/README.md @@ -19,7 +19,7 @@ behavior with tests. project's `CLAUDE.md` / rules and existing test projects; the skills infer from what exists when nothing is documented. - **Cross-plugin refs degrade gracefully.** Test invocation defers to the `toolchain` - plugin's `/toolchain:build` when installed and to the project's own test command + plugin's `/toolchain:check` when installed and to the project's own test command otherwise; TDD design questions route to `/tdd:principles`, browser mechanics to `/playwright:playwright`, outcome sign-off to `/verification:confirm`, and the implement loop to `/implementation:implement` — each used when installed and diff --git a/plugins/testing/skills/diagnose/SKILL.md b/plugins/testing/skills/diagnose/SKILL.md index 89092b6e6..e044d4f93 100644 --- a/plugins/testing/skills/diagnose/SKILL.md +++ b/plugins/testing/skills/diagnose/SKILL.md @@ -1,6 +1,6 @@ --- name: diagnose -description: "Diagnose and fix failing tests — failure classification, root-cause analysis (never retry blindly), then the reproduce → isolate → fix → retest → regression loop. Use for 'why does this fail', visible test failures, stack traces, or flaky tests; for authoring new tests use /testing:write, for running the suite /toolchain:build." +description: "Diagnose and fix failing tests — failure classification, root-cause analysis (never retry blindly), then the reproduce → isolate → fix → retest → regression loop. Use for 'why does this fail', visible test failures, stack traces, or flaky tests; for authoring new tests use /testing:write, for running the suite /toolchain:check." argument-hint: "[failure] (e.g., /testing:diagnose, /testing:diagnose the frozen-logger error, /testing:diagnose loop)" user-invocable: true disable-model-invocation: false @@ -41,7 +41,7 @@ When `/implementation:implement` hits a test failure during its TDD cadence it c ## What this skill does NOT do -- **Does not run the suite wholesale** — `/toolchain:build` is SSOT for CLI invocation; this skill runs targeted reproductions +- **Does not run the suite wholesale** — `/toolchain:check` is SSOT for CLI invocation; this skill runs targeted reproductions - **Does not author new feature tests** — `/testing:write` (the loop's reproduce step writes only the failing test capturing the bug) ## Gotchas diff --git a/plugins/testing/skills/diagnose/context/investigate.md b/plugins/testing/skills/diagnose/context/investigate.md index 0e4132e38..86e649343 100644 --- a/plugins/testing/skills/diagnose/context/investigate.md +++ b/plugins/testing/skills/diagnose/context/investigate.md @@ -16,7 +16,7 @@ When tests fail, investigate — never dismiss, never retry blindly. Activates w | "Unknown option" from test runner | Bad CLI flags (e.g. `--nologo` against xUnit v3 MTP) | Strip the offending flag; confirm the runner version the project uses | | Timeout / hung test | Async deadlock, missing cancellation | Check for sync-over-async (`.Result` / `.Wait()`) | | Intermittent pass/fail | Shared static state, race condition | Check for process-global singletons, parallel execution | - | FileNotFoundException for assembly | Missing project reference or build | Run the ecosystem's build via `/toolchain:build` first; verify project references | + | FileNotFoundException for assembly | Missing project reference or build | Run the ecosystem's build via `/toolchain:check` first; verify project references | 3. **Reproduce deterministically** — run the failing test in isolation. Use the ecosystem's per-framework filter syntax (e.g. `--filter "FullyQualifiedName~TestClassName.TestMethodName"` for xUnit; `-k ` for pytest; `--testNamePattern` for vitest). diff --git a/plugins/testing/skills/e2e/context/non-ui.md b/plugins/testing/skills/e2e/context/non-ui.md index 74f139489..6495291be 100644 --- a/plugins/testing/skills/e2e/context/non-ui.md +++ b/plugins/testing/skills/e2e/context/non-ui.md @@ -1,6 +1,6 @@ # Non-UI Live Testing Playbook -Per-surface mapping of change-type → smoke-test invocation for non-UI code. Complements `e2e.md` (browser-driven UI evidence). Cites `/toolchain:build` for command shapes — never restates, never drifts. +Per-surface mapping of change-type → smoke-test invocation for non-UI code. Complements `e2e.md` (browser-driven UI evidence). Cites `/toolchain:check` for command shapes — never restates, never drifts. Load on-demand when `/testing:e2e` is invoked for non-UI changes. UI changes route to `e2e.md`. @@ -14,7 +14,7 @@ UI changes (Blazor / Razor / HTML / CSS / JS shipped to browser) MUST route to ` ## Per-surface table -Invocation commands come from `/toolchain:build`; framework, project-naming, and fixture detail come from the consuming project's testing conventions. +Invocation commands come from `/toolchain:check`; framework, project-naming, and fixture detail come from the consuming project's testing conventions. | # | Surface class | Live-test pattern | Known gaps | |---|---------------|-------------------|------------| @@ -22,7 +22,7 @@ Invocation commands come from `/toolchain:build`; framework, project-naming, and | 2 | API app (in-process) | The ecosystem's HTTP-test harness (e.g. WebApplicationFactory); shared-state fixture pattern when a process-global singleton forces it | Browser evidence handled via `e2e.md` when UI surfaces ship | | 3 | E2E orchestrator (e.g. Aspire AppHost) | Orchestrator boots in-process via its testing builder; assert resource health + endpoints | None | | 4 | Architecture rules | Run the project's architecture-test suite when touching project files or build infrastructure | None | -| 5 | Hooks + shell scripts | The project's shell-test convention (`*.test.sh` siblings, bats) via its documented runner | Cross-platform — Git Bash only on Windows; tests may pass locally and fail in CI (see `/toolchain:build` bash context "CI-environment caveat") | +| 5 | Hooks + shell scripts | The project's shell-test convention (`*.test.sh` siblings, bats) via its documented runner | Cross-platform — Git Bash only on Windows; tests may pass locally and fail in CI (see `/toolchain:check` bash context "CI-environment caveat") | | 6 | MCP server (per-runtime unit tests) | Unit-level coverage of tool handlers + transport plumbing | No protocol-level smoke test — see MCP stdio handshake pattern below | | 7 | MCP server stdio handshake | See "MCP stdio handshake" section below | No upstream harness; replace bespoke recipe if an official one ships | | 8 | Python infrastructure / scripts | pytest (via `uv run` in uv-managed projects); standard fixtures | None | @@ -83,6 +83,6 @@ Wire as `*.handshake.test.` next to existing unit tests; runner inherits th ## Cross-references - `e2e.md` — UI surface; mandatory evidence artifacts (snapshot / screenshot / console / network / assertion) -- `/toolchain:build` — SSOT for per-ecosystem build/test/lint invocations (per context file) +- `/toolchain:check` — SSOT for per-ecosystem build/test/lint invocations (per context file) - `/verification:confirm outcome` — composes this playbook into outcome reports when changes affect non-UI runtime - The consuming project's testing conventions — naming, framework gotchas, test placement diff --git a/plugins/testing/skills/plan/SKILL.md b/plugins/testing/skills/plan/SKILL.md index 0ee25c099..f4bd2f457 100644 --- a/plugins/testing/skills/plan/SKILL.md +++ b/plugins/testing/skills/plan/SKILL.md @@ -1,6 +1,6 @@ --- name: plan -description: "Analyze code changes and produce a test plan — classify changed files by required test type, identify coverage gaps, and prioritize by regression risk. Use for 'test plan' / 'what needs testing', after /implementation:implement completes, or for PR-prep coverage verification; for writing the tests use /testing:write, for running them /toolchain:build." +description: "Analyze code changes and produce a test plan — classify changed files by required test type, identify coverage gaps, and prioritize by regression risk. Use for 'test plan' / 'what needs testing', after /implementation:implement completes, or for PR-prep coverage verification; for writing the tests use /testing:write, for running them /toolchain:check." argument-hint: "[range or scope] (e.g., /testing:plan, /testing:plan HEAD~3, /testing:plan the auth module)" user-invocable: true disable-model-invocation: false @@ -100,7 +100,7 @@ Present the test plan to the user. Then suggest: ## What this skill does NOT do - **Does not write tests** — `/testing:write` -- **Does not run tests** — `/toolchain:build` (SSOT for CLI invocation) +- **Does not run tests** — `/toolchain:check` (SSOT for CLI invocation) ## Marketplace plugin skills (invoke only when installed) diff --git a/plugins/testing/skills/write/SKILL.md b/plugins/testing/skills/write/SKILL.md index d6ac7cc01..8731b3c1f 100644 --- a/plugins/testing/skills/write/SKILL.md +++ b/plugins/testing/skills/write/SKILL.md @@ -1,6 +1,6 @@ --- name: write -description: "Write and place tests across all ecosystems — TDD cadence (Red→Green→Refactor in vertical slices), test naming, test-type selection, project placement, and fixture patterns. Use for 'write tests', 'test this', 'where should this test go', or when code was just written without tests; for diagnosing failures use /testing:diagnose, for coverage-gap analysis /testing:plan, for running tests /toolchain:build." +description: "Write and place tests across all ecosystems — TDD cadence (Red→Green→Refactor in vertical slices), test naming, test-type selection, project placement, and fixture patterns. Use for 'write tests', 'test this', 'where should this test go', or when code was just written without tests; for diagnosing failures use /testing:diagnose, for coverage-gap analysis /testing:plan, for running tests /toolchain:check." argument-hint: "[task] (e.g., /testing:write, /testing:write the new handler, /testing:write organize)" user-invocable: true disable-model-invocation: false @@ -13,7 +13,7 @@ Working tree status: !`git status --porcelain 2>/dev/null | head -20 || echo "cl ## Purpose -Authoring discipline for tests: what to test, how to name it, which test type fits, and where the test lives. `/implementation:implement` calls this skill during its TDD cadence; `/toolchain:build` owns test INVOCATION (the actual commands, SSOT). Test STRUCTURE configuration (frameworks, project locations, naming, fixture conventions) belongs to the consuming project — read its testing conventions (its `CLAUDE.md` / rules / test-structure docs) before writing tests, and infer from existing test projects when nothing is documented. +Authoring discipline for tests: what to test, how to name it, which test type fits, and where the test lives. `/implementation:implement` calls this skill during its TDD cadence; `/toolchain:check` owns test INVOCATION (the actual commands, SSOT). Test STRUCTURE configuration (frameworks, project locations, naming, fixture conventions) belongs to the consuming project — read its testing conventions (its `CLAUDE.md` / rules / test-structure docs) before writing tests, and infer from existing test projects when nothing is documented. ## Arguments @@ -43,14 +43,14 @@ Read the relevant context file before proceeding. Both draw on the consuming pro ## Handoff -- Run the new tests via `/toolchain:build` (or the project's own test command when the `toolchain` plugin is absent), then continue implementation — `/implementation:implement` when that plugin is installed +- Run the new tests via `/toolchain:check` (or the project's own test command when the `toolchain` plugin is absent), then continue implementation — `/implementation:implement` when that plugin is installed - **For HIGH/CRITICAL test suites** (new domain logic, security-critical behavior, regression-prone paths, mocks of non-trivial dependencies, non-deterministic dependencies like clock/random/network) call the `advisor` tool (when available in the session) — rubber-duck checkpoint before commit. Lightweight cross-model critique catches false-green or brittle tests before slow CI runs — the author writing tests for their own code is the producer verifying its own work, and this cross-model pass is that independence seam. Skip for trivial test additions - After an `organize` decision: proceed to authoring for the new test project - Coverage gaps still open → `/testing:plan`; failures while running → `/testing:diagnose` ## What this skill does NOT do -- **Does not run test commands** — `/toolchain:build` is SSOT for CLI invocation +- **Does not run test commands** — `/toolchain:check` is SSOT for CLI invocation - **Does not diagnose failures** — `/testing:diagnose` - **Does not replace the project's testing conventions** — the consuming project's rules are the source of truth for frameworks, naming, organization; this skill defers to them diff --git a/plugins/toolchain/.claude-plugin/plugin.json b/plugins/toolchain/.claude-plugin/plugin.json index 7b1bb702a..eb316546c 100644 --- a/plugins/toolchain/.claude-plugin/plugin.json +++ b/plugins/toolchain/.claude-plugin/plugin.json @@ -1,8 +1,8 @@ { "$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json", "name": "toolchain", - "version": "0.1.1", - "description": "Repo-agnostic polyglot verification toolchain: build + test + lint for changed files across .NET, Python, TypeScript, Bash, PowerShell, Markdown, YAML, and cross-cutting surfaces (`/toolchain:build`, `/toolchain:lint`), plus a re-runnable `/toolchain:setup` that writes the tracked per-ecosystem command config those skills resolve first.", + "version": "0.2.0", + "description": "Repo-agnostic polyglot verification toolchain: build + test + lint for changed files across .NET, Python, TypeScript, Bash, PowerShell, Markdown, YAML, and cross-cutting surfaces (`/toolchain:check`, `/toolchain:lint`), plus a re-runnable `/toolchain:setup` that writes the tracked per-ecosystem command config those skills resolve first.", "author": { "name": "Melodic Software", "email": "info@melodicsoftware.com" diff --git a/plugins/toolchain/CHANGELOG.md b/plugins/toolchain/CHANGELOG.md index d879457f7..190c1c65d 100644 --- a/plugins/toolchain/CHANGELOG.md +++ b/plugins/toolchain/CHANGELOG.md @@ -3,6 +3,17 @@ All notable changes to the `toolchain` plugin are documented here. Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/); this plugin uses semantic versioning. +## [0.2.0] + +### Changed + +- **BREAKING: `/toolchain:build` renamed to `/toolchain:check`.** The skill runs build + test + lint + as a deterministic pass/fail gate, and per the marketplace naming grammar `check` = gate; "build" + is also a null phase for several covered ecosystems (Python, Markdown). The skill directory, + frontmatter `name`, and every repo-wide reference move together; no `renames`-map entry is added + (clean breaking change while the marketplace is settling). Invoke `/toolchain:check` where you + previously invoked `/toolchain:build`; behavior, arguments, and the resolution ladder are unchanged. + ## [0.1.1] ### Fixed diff --git a/plugins/toolchain/README.md b/plugins/toolchain/README.md index e6dbc099b..f2fda23e7 100644 --- a/plugins/toolchain/README.md +++ b/plugins/toolchain/README.md @@ -7,13 +7,13 @@ defaults. Three skills, one concern: mechanical verification of changed code. | Skill | What it does | |---|---| -| `/toolchain:build` | Build + test + lint for changed files, auto-detecting affected ecosystems (.NET, Python, TypeScript, Bash, PowerShell, Markdown) from git status; resolves each ecosystem's commands through the shared four-rung ladder. Also the reference skill other plugins compose for ecosystem detection and command resolution. | +| `/toolchain:check` | Build + test + lint for changed files, auto-detecting affected ecosystems (.NET, Python, TypeScript, Bash, PowerShell, Markdown) from git status; resolves each ecosystem's commands through the shared four-rung ladder. Also the reference skill other plugins compose for ecosystem detection and command resolution. | | `/toolchain:lint` | Lint + format checks only — faster than a build cycle, honors each tool's config-file opt-in, `--fix` mode where linters support it; also owns the `yaml` and `cross-cutting` lint surfaces. | -| `/toolchain:setup` | Configure the plugin for a repo — interview + infer + write the tracked `.claude/ecosystems/.yaml` files that `/toolchain:build` and `/toolchain:lint` resolve first, and offer the tracked `.claude/topic-docs.yaml` concern file. Re-runnable. | +| `/toolchain:setup` | Configure the plugin for a repo — interview + infer + write the tracked `.claude/ecosystems/.yaml` files that `/toolchain:check` and `/toolchain:lint` resolve first, and offer the tracked `.claude/topic-docs.yaml` concern file. Re-runnable. | ## Works in any repo -- **Consumer conventions win — via the ecosystem-commands seam.** `/toolchain:build` +- **Consumer conventions win — via the ecosystem-commands seam.** `/toolchain:check` and `/toolchain:lint` resolve each ecosystem's build/test/lint commands through a four-rung ladder: your repo's tracked `.claude/ecosystems/.yaml` (authoritative when present, additive over a `~/.claude/ecosystems/` user-global diff --git a/plugins/toolchain/reference/ecosystems/cross-cutting.yaml b/plugins/toolchain/reference/ecosystems/cross-cutting.yaml index 80fd938be..bac093879 100644 --- a/plugins/toolchain/reference/ecosystems/cross-cutting.yaml +++ b/plugins/toolchain/reference/ecosystems/cross-cutting.yaml @@ -2,7 +2,7 @@ # fallback ONLY (consumer .claude/ecosystems/cross-cutting.yaml overrides key-by-key). Contract + schema: # https://raw.githubusercontent.com/melodic-software/claude-code-plugins/main/docs/conventions/ecosystem-commands/README.md # Lint-only surface: /toolchain:lint runs it (alongside detected ecosystems when any text -# file changed AND the repo opts into its tools); /toolchain:build does not run it — its +# file changed AND the repo opts into its tools); /toolchain:check does not run it — its # `**` glob would otherwise match every change in build detection. globs: ["**"] # any text file change build-cmd: null @@ -18,4 +18,4 @@ install-hint: | typos: winget install Crate-CI.Typos | brew install typos-cli gitleaks: winget install Gitleaks.Gitleaks | brew install gitleaks editorconfig-checker: winget install EditorConfig-Checker.EditorConfig-Checker | brew install editorconfig-checker -notes: "Lint-only — owned by /toolchain:lint. /toolchain:build does not run this ecosystem." +notes: "Lint-only — owned by /toolchain:lint. /toolchain:check does not run this ecosystem." diff --git a/plugins/toolchain/reference/ecosystems/yaml.yaml b/plugins/toolchain/reference/ecosystems/yaml.yaml index e309ed886..27c10a334 100644 --- a/plugins/toolchain/reference/ecosystems/yaml.yaml +++ b/plugins/toolchain/reference/ecosystems/yaml.yaml @@ -1,7 +1,7 @@ # Bundled portable default — yaml (GitHub Actions workflows). Rung-4 fallback # ONLY (consumer .claude/ecosystems/yaml.yaml overrides key-by-key). Contract + schema: # https://raw.githubusercontent.com/melodic-software/claude-code-plugins/main/docs/conventions/ecosystem-commands/README.md -# Lint-only surface: /toolchain:lint runs it; /toolchain:build does not (no build/test phase). +# Lint-only surface: /toolchain:lint runs it; /toolchain:check does not (no build/test phase). globs: [".github/**/*.yml", ".github/**/*.yaml"] build-cmd: null test-cmd: null @@ -15,4 +15,4 @@ install-hint: | actionlint: winget install rhysd.actionlint | brew install actionlint check-jsonschema: pip install check-jsonschema zizmor: pip install zizmor -notes: "Lint-only — owned by /toolchain:lint. /toolchain:build does not run this ecosystem." +notes: "Lint-only — owned by /toolchain:lint. /toolchain:check does not run this ecosystem." diff --git a/plugins/toolchain/reference/resolution-ladder.md b/plugins/toolchain/reference/resolution-ladder.md index af6e1b69c..a390d23b6 100644 --- a/plugins/toolchain/reference/resolution-ladder.md +++ b/plugins/toolchain/reference/resolution-ladder.md @@ -1,6 +1,6 @@ # Ecosystem command resolution ladder -How `/toolchain:build` and `/toolchain:lint` resolve the per-ecosystem build/test/lint +How `/toolchain:check` and `/toolchain:lint` resolve the per-ecosystem build/test/lint command surface. Both skills read this one document; neither bakes its own table. Implements the ecosystem-commands contract "Resolution ladder (plugin behavior)": diff --git a/plugins/toolchain/reference/topic-docs.md b/plugins/toolchain/reference/topic-docs.md index 78d7fc807..0a586e2fa 100644 --- a/plugins/toolchain/reference/topic-docs.md +++ b/plugins/toolchain/reference/topic-docs.md @@ -1,6 +1,6 @@ # Topic-docs concern file — what `/toolchain:setup` offers -This plugin's skills (`/toolchain:build`, `/toolchain:lint`, `/toolchain:setup`) write no lifecycle +This plugin's skills (`/toolchain:check`, `/toolchain:lint`, `/toolchain:setup`) write no lifecycle documents of their own. `/toolchain:setup` reads this binding to offer the consuming repo the tracked `.claude/topic-docs.yaml` concern file — the shared, consumer-side source of truth that companion lifecycle plugins resolve for artifact placement. diff --git a/plugins/toolchain/skills/build/SKILL.md b/plugins/toolchain/skills/check/SKILL.md similarity index 89% rename from plugins/toolchain/skills/build/SKILL.md rename to plugins/toolchain/skills/check/SKILL.md index 777687b7f..f2432d465 100644 --- a/plugins/toolchain/skills/build/SKILL.md +++ b/plugins/toolchain/skills/check/SKILL.md @@ -1,8 +1,8 @@ --- -name: build +name: check description: "Run build, test, and lint verification for changed files, auto-detecting affected ecosystems (.NET, Python, TypeScript, Bash, PowerShell, Markdown) from git status, with the consuming project's own documented commands overriding portable defaults. Use after any code edit or for 'does it compile' / 'run tests' checks; for lint-only use /toolchain:lint, for full outcome verification use /verification:confirm." user-invocable: true -argument-hint: "[ecosystem] (e.g., /toolchain:build dotnet, /toolchain:build python, /toolchain:build all — default: auto-detect from git status)" +argument-hint: "[ecosystem] (e.g., /toolchain:check dotnet, /toolchain:check python, /toolchain:check all — default: auto-detect from git status)" --- ## Pre-computed context @@ -14,20 +14,20 @@ Current branch: !`git branch --show-current 2>/dev/null || echo "unknown"` Detects affected ecosystems from changed files and runs each one's build → test → lint. Serves two roles: -1. **Task skill** — `/toolchain:build` runs build verification for changed files. `/toolchain:build dotnet` targets one ecosystem +1. **Task skill** — `/toolchain:check` runs build verification for changed files. `/toolchain:check dotnet` targets one ecosystem 2. **Reference skill** — its sibling `/toolchain:lint`, the `verification` plugin's `/verification:confirm` (when installed), and verification agents compose this for detection and command resolution instead of baking their own tables -**The command surface is resolved, not hardcoded.** Both `/toolchain:build` and `/toolchain:lint` resolve each ecosystem's build/test/lint commands through the shared four-rung ladder in [`${CLAUDE_PLUGIN_ROOT}/reference/resolution-ladder.md`](${CLAUDE_PLUGIN_ROOT}/reference/resolution-ladder.md): the consuming repo's tracked `.claude/ecosystems/.yaml` is authoritative when present; the plugin's bundled portable defaults at `${CLAUDE_PLUGIN_ROOT}/reference/ecosystems/` are the rung-4 fallback. The consumer's file always wins. +**The command surface is resolved, not hardcoded.** Both `/toolchain:check` and `/toolchain:lint` resolve each ecosystem's build/test/lint commands through the shared four-rung ladder in [`${CLAUDE_PLUGIN_ROOT}/reference/resolution-ladder.md`](${CLAUDE_PLUGIN_ROOT}/reference/resolution-ladder.md): the consuming repo's tracked `.claude/ecosystems/.yaml` is authoritative when present; the plugin's bundled portable defaults at `${CLAUDE_PLUGIN_ROOT}/reference/ecosystems/` are the rung-4 fallback. The consumer's file always wins. ## Arguments `$ARGUMENTS` — optional ecosystem filter. If provided, run only that ecosystem. If omitted, auto-detect from changed files. -Available ecosystem filters are the ecosystems `/toolchain:build` covers: `dotnet`, `python`, `typescript`, `bash`, `powershell`, `markdown` (resolved per the ladder). Common aliases: `ts`/`node` → `typescript`, `shell` → `bash`, `ps`/`pwsh` → `powershell`, `md` → `markdown`. Literal `all` runs every covered ecosystem. The lint-only `yaml` and `cross-cutting` surfaces are **not** run by `/toolchain:build` — use `/toolchain:lint` for those. +Available ecosystem filters are the ecosystems `/toolchain:check` covers: `dotnet`, `python`, `typescript`, `bash`, `powershell`, `markdown` (resolved per the ladder). Common aliases: `ts`/`node` → `typescript`, `shell` → `bash`, `ps`/`pwsh` → `powershell`, `md` → `markdown`. Literal `all` runs every covered ecosystem. The lint-only `yaml` and `cross-cutting` surfaces are **not** run by `/toolchain:check` — use `/toolchain:lint` for those. ## Ecosystem detection -Each ecosystem declares a list of `globs` that classify changed files into that ecosystem (resolved per the ladder — consumer `.claude/ecosystems/.yaml` when present, else the bundled default). The skill matches `git status --porcelain` output against each covered ecosystem's `globs` to determine which ecosystems are affected. `/toolchain:build` covers `dotnet`, `python`, `typescript`, `bash`, `powershell`, `markdown`; the lint-only `yaml` and `cross-cutting` surfaces are `/toolchain:lint`'s (in particular `cross-cutting`'s `**` glob is never matched here). +Each ecosystem declares a list of `globs` that classify changed files into that ecosystem (resolved per the ladder — consumer `.claude/ecosystems/.yaml` when present, else the bundled default). The skill matches `git status --porcelain` output against each covered ecosystem's `globs` to determine which ecosystems are affected. `/toolchain:check` covers `dotnet`, `python`, `typescript`, `bash`, `powershell`, `markdown`; the lint-only `yaml` and `cross-cutting` surfaces are `/toolchain:lint`'s (in particular `cross-cutting`'s `**` glob is never matched here). For ecosystem-specific gotchas, reference files, and primary-source detail, read the corresponding context file: @@ -38,9 +38,9 @@ For ecosystem-specific gotchas, reference files, and primary-source detail, read - [context/bash.md](context/bash.md) — ShellCheck, shfmt - [context/powershell.md](context/powershell.md) — PSScriptAnalyzer -When invoked as a task (`/toolchain:build`), detect from `git status --porcelain`. When referenced by another skill, use the file list that skill provides. +When invoked as a task (`/toolchain:check`), detect from `git status --porcelain`. When referenced by another skill, use the file list that skill provides. -## Workflow (when invoked as /toolchain:build) +## Workflow (when invoked as /toolchain:check) ### 0. Resolve repo root @@ -52,11 +52,11 @@ All commands use absolute paths. Never `cd` and lose context. ### 1. Detect ecosystems -If `$ARGUMENTS` specifies an ecosystem, use it. If `all`, run every covered ecosystem. Otherwise, classify changed files from `git status --porcelain` against each covered ecosystem's `globs` (resolved per the ladder; `/toolchain:build` covers `dotnet`, `python`, `typescript`, `bash`, `powershell`, `markdown`). Skip any ecosystem whose resolved `enabled` is `false` (a consumer opt-out) — excluded even under `all`. +If `$ARGUMENTS` specifies an ecosystem, use it. If `all`, run every covered ecosystem. Otherwise, classify changed files from `git status --porcelain` against each covered ecosystem's `globs` (resolved per the ladder; `/toolchain:check` covers `dotnet`, `python`, `typescript`, `bash`, `powershell`, `markdown`). Skip any ecosystem whose resolved `enabled` is `false` (a consumer opt-out) — excluded even under `all`. If the working tree is clean, fall back to the branch diff — `git diff --name-only $(git merge-base HEAD)..HEAD` — so checkpoint-committed work still gets classified (the common pre-PR case: every green block was already committed). A caller passing an explicit changed-file list (e.g. `/verification:confirm`) overrides both detection paths. -If neither path yields changes and no `$ARGUMENTS`: report "No changes found (working tree clean, no branch diff vs the default branch). Use `/toolchain:build all` to verify the full repo, or `/toolchain:build ` for a specific ecosystem." and exit. +If neither path yields changes and no `$ARGUMENTS`: report "No changes found (working tree clean, no branch diff vs the default branch). Use `/toolchain:check all` to verify the full repo, or `/toolchain:check ` for a specific ecosystem." and exit. **Conversation-aware targeting**: when the conversation has been working with specific files/projects, scope the build to what was touched — don't rebuild the whole scope for a single-project change. The ecosystem config's `anchor` field provides the default scoping anchor for ecosystems with a canonical entry point; substitute a narrower project file when changes are confined to one project. For .NET specifically: use the specific `.csproj` when changes are in one project, use the solution file when changes span multiple projects or touch shared files (`.props`, `.targets`, solution file). @@ -106,12 +106,12 @@ Use `pass`, `FAIL`, `skip`, or `—` (not applicable — for ecosystems where th If any project-declared CI-parity gates fired, summarize each by name + outcome below the per-ecosystem block, with the remediation pointer on failure. -## For other skills referencing /toolchain:build +## For other skills referencing /toolchain:check -When composing `/toolchain:build` from another skill (like `/verification:confirm` or `/toolchain:lint`): +When composing `/toolchain:check` from another skill (like `/verification:confirm` or `/toolchain:lint`): - **To get command tables**: resolve per [`${CLAUDE_PLUGIN_ROOT}/reference/resolution-ladder.md`](${CLAUDE_PLUGIN_ROOT}/reference/resolution-ladder.md) — consumer `.claude/ecosystems/.yaml` wins, bundled defaults at `${CLAUDE_PLUGIN_ROOT}/reference/ecosystems/` are the fallback — or the relevant `context/.md` for gotchas and prose detail -- **To run full verification**: invoke `/toolchain:build` or `/toolchain:build ` via the Skill tool +- **To run full verification**: invoke `/toolchain:check` or `/toolchain:check ` via the Skill tool - **To run lint-only checks**: invoke `/toolchain:lint` or `/toolchain:lint ` (it resolves through the same ladder and additionally owns the `yaml` and `cross-cutting` surfaces) - **To embed commands in agent prompts**: resolve per the ladder AND read the corresponding `context/.md` for gotchas diff --git a/plugins/toolchain/skills/build/context/bash.md b/plugins/toolchain/skills/check/context/bash.md similarity index 100% rename from plugins/toolchain/skills/build/context/bash.md rename to plugins/toolchain/skills/check/context/bash.md diff --git a/plugins/toolchain/skills/build/context/dotnet.md b/plugins/toolchain/skills/check/context/dotnet.md similarity index 98% rename from plugins/toolchain/skills/build/context/dotnet.md rename to plugins/toolchain/skills/check/context/dotnet.md index 6d708279d..0d19aa34c 100644 --- a/plugins/toolchain/skills/build/context/dotnet.md +++ b/plugins/toolchain/skills/check/context/dotnet.md @@ -58,7 +58,7 @@ Choose the scope based on what changed: | Files in a single project | That project's `.csproj` | `dotnet build path/to/Project.csproj` | | Files spanning multiple projects | Full solution | `dotnet build ` | | Shared build config (`.props`, `.targets`, `.editorconfig`) | Full solution | `dotnet build ` | -| Nothing (clean tree, `/toolchain:build all`) | Full solution | `dotnet build ` | +| Nothing (clean tree, `/toolchain:check all`) | Full solution | `dotnet build ` | To find the `.csproj` for a changed file, walk up from the file's directory until you find a `.csproj`. diff --git a/plugins/toolchain/skills/build/context/powershell.md b/plugins/toolchain/skills/check/context/powershell.md similarity index 100% rename from plugins/toolchain/skills/build/context/powershell.md rename to plugins/toolchain/skills/check/context/powershell.md diff --git a/plugins/toolchain/skills/build/context/python.md b/plugins/toolchain/skills/check/context/python.md similarity index 100% rename from plugins/toolchain/skills/build/context/python.md rename to plugins/toolchain/skills/check/context/python.md diff --git a/plugins/toolchain/skills/build/context/sarif.md b/plugins/toolchain/skills/check/context/sarif.md similarity index 100% rename from plugins/toolchain/skills/build/context/sarif.md rename to plugins/toolchain/skills/check/context/sarif.md diff --git a/plugins/toolchain/skills/build/context/typescript.md b/plugins/toolchain/skills/check/context/typescript.md similarity index 94% rename from plugins/toolchain/skills/build/context/typescript.md rename to plugins/toolchain/skills/check/context/typescript.md index a7e1ffbba..40e72fec9 100644 --- a/plugins/toolchain/skills/build/context/typescript.md +++ b/plugins/toolchain/skills/check/context/typescript.md @@ -28,7 +28,7 @@ cd "$PROJECT_DIR" && npx biome check --write . - **Run from project directory** — each `package.json` defines an independent project root - **Biome walks up** to find `biome.json` from the CWD — run from project dir, not repo root -- **`tsc --noEmit`** belongs in CI and `/toolchain:build`, not in edit-time hooks — tsc is project-scoped and takes seconds +- **`tsc --noEmit`** belongs in CI and `/toolchain:check`, not in edit-time hooks — tsc is project-scoped and takes seconds - **npx on Windows** — programs spawning bare `npx` fail because `npx` is a `.cmd` file; CLI usage via a shell works fine ## Project discovery diff --git a/plugins/toolchain/skills/build/evals/evals.json b/plugins/toolchain/skills/check/evals/evals.json similarity index 87% rename from plugins/toolchain/skills/build/evals/evals.json rename to plugins/toolchain/skills/check/evals/evals.json index 436fda282..37b1d461f 100644 --- a/plugins/toolchain/skills/build/evals/evals.json +++ b/plugins/toolchain/skills/check/evals/evals.json @@ -1,10 +1,10 @@ { - "skill_name": "build", + "skill_name": "check", "evals": [ { "id": 1, "name": "auto-detects-affected-ecosystems-from-git-status", - "prompt": "/toolchain:build — I just edited a couple of .cs files and a pyproject-managed .py module.", + "prompt": "/toolchain:check — I just edited a couple of .cs files and a pyproject-managed .py module.", "expected_output": "Classifies the changed files from git status against each covered ecosystem's globs, detects the dotnet and python ecosystems, resolves each one's command surface via the ladder, and runs build -> test -> lint per ecosystem — reporting a per-ecosystem results table. It does not run ecosystems with no changed files.", "files": [], "expectations": [ @@ -17,7 +17,7 @@ { "id": 2, "name": "missing-tool-reports-skip-not-fail", - "prompt": "/toolchain:build python — but `uv` is not installed on this machine.", + "prompt": "/toolchain:check python — but `uv` is not installed on this machine.", "expected_output": "Verifies the tool is on PATH before running; since uv is missing it reports the python ecosystem as `skip` with the ecosystem's install-hint — it does NOT report FAIL for a missing tool.", "files": [], "expectations": [ @@ -29,7 +29,7 @@ { "id": 3, "name": "consumer-ecosystem-config-wins-over-bundled-default", - "prompt": "/toolchain:build dotnet — the repo has a tracked `.claude/ecosystems/dotnet.yaml` with a project-specific test-cmd.", + "prompt": "/toolchain:check dotnet — the repo has a tracked `.claude/ecosystems/dotnet.yaml` with a project-specific test-cmd.", "expected_output": "Resolves the dotnet command surface through the four-rung ladder with the consumer's tracked `.claude/ecosystems/dotnet.yaml` authoritative (rung 1) — the bundled portable default is only the rung-4 fallback. It runs the consumer's declared commands, not the bundled ones.", "files": [], "expectations": [ @@ -41,19 +41,19 @@ { "id": 4, "name": "build-scope-excludes-lint-only-surfaces", - "prompt": "/toolchain:build all — the working tree changed a GitHub Actions workflow YAML and a plain README, among other files.", - "expected_output": "Runs only the ecosystems /toolchain:build covers (dotnet, python, typescript, bash, powershell, markdown). It does NOT run the lint-only `yaml` or `cross-cutting` surfaces — those belong to /toolchain:lint, and cross-cutting's `**` glob is never matched here.", + "prompt": "/toolchain:check all — the working tree changed a GitHub Actions workflow YAML and a plain README, among other files.", + "expected_output": "Runs only the ecosystems /toolchain:check covers (dotnet, python, typescript, bash, powershell, markdown). It does NOT run the lint-only `yaml` or `cross-cutting` surfaces — those belong to /toolchain:lint, and cross-cutting's `**` glob is never matched here.", "files": [], "expectations": [ - "Runs only the six ecosystems `/toolchain:build` covers (dotnet, python, typescript, bash, powershell, markdown)", + "Runs only the six ecosystems `/toolchain:check` covers (dotnet, python, typescript, bash, powershell, markdown)", "Does NOT run the `yaml` surface for the workflow file — that surface is `/toolchain:lint`-only", - "Does NOT run the `cross-cutting` surface — its `**` glob is never matched by `/toolchain:build` (both `yaml` and `cross-cutting` are `/toolchain:lint`-only surfaces)" + "Does NOT run the `cross-cutting` surface — its `**` glob is never matched by `/toolchain:check` (both `yaml` and `cross-cutting` are `/toolchain:lint`-only surfaces)" ] }, { "id": 5, "name": "clean-tree-falls-back-to-branch-diff", - "prompt": "/toolchain:build — every block was already committed on this feature branch, so the working tree is clean.", + "prompt": "/toolchain:check — every block was already committed on this feature branch, so the working tree is clean.", "expected_output": "With a clean working tree it falls back to the branch diff (git diff against the merge-base with the default branch) so checkpoint-committed work still gets classified and verified — rather than reporting 'no changes' and exiting.", "files": [], "expectations": [ @@ -65,7 +65,7 @@ { "id": 6, "name": "malformed-consumer-config-degrades-not-hard-stops", - "prompt": "/toolchain:build dotnet — the repo's tracked `.claude/ecosystems/dotnet.yaml` exists but is malformed (invalid YAML / missing required keys).", + "prompt": "/toolchain:check dotnet — the repo's tracked `.claude/ecosystems/dotnet.yaml` exists but is malformed (invalid YAML / missing required keys).", "expected_output": "A malformed consumer ecosystem file warns and degrades to inference (rung 2) rather than hard-stopping — the ladder is tolerant, so a bad consumer file never aborts the build; it still resolves a command surface and runs.", "files": [], "expectations": [ diff --git a/plugins/toolchain/skills/lint/SKILL.md b/plugins/toolchain/skills/lint/SKILL.md index 0dcf3e521..bd01dc5ed 100644 --- a/plugins/toolchain/skills/lint/SKILL.md +++ b/plugins/toolchain/skills/lint/SKILL.md @@ -1,6 +1,6 @@ --- name: lint -description: "Run polyglot linters and format checks across all affected ecosystems without a full build cycle — auto-detects ecosystems from changed files, honors each tool's config-file opt-in, and supports --fix mode to auto-correct where linters allow. Use for quick lint/format feedback during development; for build+test use /toolchain:build, for full outcome verification use /verification:confirm." +description: "Run polyglot linters and format checks across all affected ecosystems without a full build cycle — auto-detects ecosystems from changed files, honors each tool's config-file opt-in, and supports --fix mode to auto-correct where linters allow. Use for quick lint/format feedback during development; for build+test use /toolchain:check, for full outcome verification use /verification:confirm." user-invocable: true argument-hint: "[ecosystem] [--fix] (e.g., /toolchain:lint, /toolchain:lint dotnet, /toolchain:lint --fix, /toolchain:lint all)" --- @@ -17,12 +17,12 @@ Run lint and format checks across affected ecosystems in one command. Fills the | Skill | What it runs | Speed | |-------|-------------|-------| | `/toolchain:lint` | Lint + format only | Fast (~5-15s) | -| `/toolchain:build` | Build + test + lint | Medium (~30-60s) | +| `/toolchain:check` | Build + test + lint | Medium (~30-60s) | | `/verification:confirm` | Build + test + lint + outcome verification | Medium+ | Use `/toolchain:lint` for quick feedback during development. Use `/verification:confirm` before committing. -**The command surface is resolved, not hardcoded.** `/toolchain:lint` resolves each ecosystem's `check-cmd`/`fix-cmd` through the shared four-rung ladder in [`${CLAUDE_PLUGIN_ROOT}/reference/resolution-ladder.md`](${CLAUDE_PLUGIN_ROOT}/reference/resolution-ladder.md) — shared with `/toolchain:build`: the consuming repo's tracked `.claude/ecosystems/.yaml` is authoritative when present; the plugin's bundled portable defaults at `${CLAUDE_PLUGIN_ROOT}/reference/ecosystems/` are the rung-4 fallback. The consumer's file always wins. +**The command surface is resolved, not hardcoded.** `/toolchain:lint` resolves each ecosystem's `check-cmd`/`fix-cmd` through the shared four-rung ladder in [`${CLAUDE_PLUGIN_ROOT}/reference/resolution-ladder.md`](${CLAUDE_PLUGIN_ROOT}/reference/resolution-ladder.md) — shared with `/toolchain:check`: the consuming repo's tracked `.claude/ecosystems/.yaml` is authoritative when present; the plugin's bundled portable defaults at `${CLAUDE_PLUGIN_ROOT}/reference/ecosystems/` are the rung-4 fallback. The consumer's file always wins. ## Arguments @@ -70,7 +70,7 @@ If neither detection path yields changes and no filter specified: report "No cha Run each ecosystem's resolved `check-cmd` (or `fix-cmd` with `--fix`). Honor each ecosystem's `opt-in` — skip tools the project hasn't configured. -For ecosystem-specific gotchas, reference `/toolchain:build` — its `context/.md` files own the per-ecosystem prose detail. +For ecosystem-specific gotchas, reference `/toolchain:check` — its `context/.md` files own the per-ecosystem prose detail. Per-project walking (ecosystems with `project-discovery`): @@ -126,7 +126,7 @@ When `--fix` is used, auto-fix capability is derived from the config: an ecosyst ## Relationship to other skills -- **Composes from `/toolchain:build`**: `/toolchain:build` owns the per-ecosystem prose gotchas — reference it rather than duplicating +- **Composes from `/toolchain:check`**: `/toolchain:check` owns the per-ecosystem prose gotchas — reference it rather than duplicating - **Composed by `/verification:confirm`** (the separate `verification` plugin, when installed): the lint leg of full verification - **After a simplify/cleanup pass**: run `/toolchain:lint` to catch formatting issues the cleanup introduced - **Before commit**: `/toolchain:lint --fix` is a quick pre-commit cleanup without the overhead of a full build diff --git a/plugins/toolchain/skills/lint/evals/evals.json b/plugins/toolchain/skills/lint/evals/evals.json index 82956213c..696046a65 100644 --- a/plugins/toolchain/skills/lint/evals/evals.json +++ b/plugins/toolchain/skills/lint/evals/evals.json @@ -10,7 +10,7 @@ "expectations": [ "Auto-detects affected ecosystems (typescript, bash) from the changed files", "Runs in check mode by default — reports violations WITHOUT modifying any files", - "Runs lint/format checks only, not a build or test cycle (that is /toolchain:build)", + "Runs lint/format checks only, not a build or test cycle (that is /toolchain:check)", "Presents a per-ecosystem results table with pass / FAIL / skip / — statuses" ] }, @@ -30,10 +30,10 @@ "id": 3, "name": "owns-yaml-and-cross-cutting-surfaces", "prompt": "/toolchain:lint all — the change set includes a GitHub Actions workflow YAML and touches several text files across the repo.", - "expected_output": "Runs the lint-only `yaml` and `cross-cutting` surfaces that /toolchain:build does not — yaml for the workflow file, and cross-cutting (typos/gitleaks/editorconfig-checker) when any text file changed and the repo opts into those tools — resolving the editorconfig-checker binary-name variant before substituting it in.", + "expected_output": "Runs the lint-only `yaml` and `cross-cutting` surfaces that /toolchain:check does not — yaml for the workflow file, and cross-cutting (typos/gitleaks/editorconfig-checker) when any text file changed and the repo opts into those tools — resolving the editorconfig-checker binary-name variant before substituting it in.", "files": [], "expectations": [ - "Runs the `yaml` surface for the workflow file (a `/toolchain:lint`-only surface not covered by `/toolchain:build`)", + "Runs the `yaml` surface for the workflow file (a `/toolchain:lint`-only surface not covered by `/toolchain:check`)", "Runs the `cross-cutting` surface when any text file changed AND the repo opts into its tools", "Honors each ecosystem's opt-in — does not run cross-cutting tools the repo has not configured" ] diff --git a/plugins/toolchain/skills/setup/SKILL.md b/plugins/toolchain/skills/setup/SKILL.md index dd244bac7..dce88054c 100644 --- a/plugins/toolchain/skills/setup/SKILL.md +++ b/plugins/toolchain/skills/setup/SKILL.md @@ -1,6 +1,6 @@ --- name: setup -description: "Configure the toolchain plugin for this repository: interview the user, infer per-ecosystem build/test/lint commands from the repo layout, write the tracked .claude/ecosystems/.yaml files that /toolchain:build and /toolchain:lint resolve first, and offer the tracked .claude/topic-docs.yaml concern file that places plan and verification artifacts. Use when: 'set up toolchain', 'configure build/lint commands', 'toolchain setup', /toolchain:build or /toolchain:lint reports it is falling back to bundled defaults, a toolchain change needs recording, or a skill asks where topic documents should land. Re-runnable — safe to invoke again to reconfigure." +description: "Configure the toolchain plugin for this repository: interview the user, infer per-ecosystem build/test/lint commands from the repo layout, write the tracked .claude/ecosystems/.yaml files that /toolchain:check and /toolchain:lint resolve first, and offer the tracked .claude/topic-docs.yaml concern file that places plan and verification artifacts. Use when: 'set up toolchain', 'configure build/lint commands', 'toolchain setup', /toolchain:check or /toolchain:lint reports it is falling back to bundled defaults, a toolchain change needs recording, or a skill asks where topic documents should land. Re-runnable — safe to invoke again to reconfigure." argument-hint: "[ecosystem] (no arguments — interview every inferred ecosystem; or name one to (re)configure just that ecosystem)" user-invocable: true disable-model-invocation: true @@ -9,7 +9,7 @@ disable-model-invocation: true ## Purpose Write (or update) the consuming repo's tracked ecosystem command surface at -`.claude/ecosystems/.yaml` so `/toolchain:build` and `/toolchain:lint` resolve +`.claude/ecosystems/.yaml` so `/toolchain:check` and `/toolchain:lint` resolve commands deterministically from rung 1 of the ladder ([`${CLAUDE_PLUGIN_ROOT}/reference/resolution-ladder.md`](${CLAUDE_PLUGIN_ROOT}/reference/resolution-ladder.md)) instead of inferring or falling back to bundled defaults every run. This skill is the ladder's @@ -51,7 +51,7 @@ then specialize it to the repo: - **bash** / **powershell** — shell/PowerShell files present; keep the bundled check/fix commands unless the repo documents its own. - **markdown** — a markdownlint config present. -- **yaml** — `.github/workflows/` present (lint-only surface — `/toolchain:lint` runs it, `/toolchain:build` does not). +- **yaml** — `.github/workflows/` present (lint-only surface — `/toolchain:lint` runs it, `/toolchain:check` does not). - **cross-cutting** — repo-root config for `typos`/`gitleaks`/editorconfig-checker present (lint-only). Repo-specific CI-parity gates beyond plain build/test/lint (lockfile drift, generated-artifact @@ -117,7 +117,7 @@ reconfigure. ## What this skill does NOT do -- Run build/test/lint — that is `/toolchain:build` and `/toolchain:lint`. +- Run build/test/lint — that is `/toolchain:check` and `/toolchain:lint`. - Write machine-local state — configuration lives in the consumer's tracked files, never in the plugin directory or the plugin data directory. - Ship or edit the bundled portable defaults — those are the plugin's rung-4 fallback, never written diff --git a/plugins/verification/.claude-plugin/plugin.json b/plugins/verification/.claude-plugin/plugin.json index a9316c68b..2f1b3ee0a 100644 --- a/plugins/verification/.claude-plugin/plugin.json +++ b/plugins/verification/.claude-plugin/plugin.json @@ -1,7 +1,7 @@ { "$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json", "name": "verification", - "version": "0.1.0", + "version": "0.1.1", "description": "Outcome-verification stage: prove a change achieved its intended outcome (`/verification:confirm` — a mechanical build/test/lint prerequisite gate, then intent-match + evidence + verdict with the criterion auto-detected by change type), and verify measurable-improvement claims against a planning-time baseline (`/verification:measure`), never fabricating numbers.", "author": { "name": "Melodic Software", diff --git a/plugins/verification/CHANGELOG.md b/plugins/verification/CHANGELOG.md index fedcb0cbc..8372704ad 100644 --- a/plugins/verification/CHANGELOG.md +++ b/plugins/verification/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to the `verification` plugin are documented here. Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/); this plugin uses semantic versioning. +## [0.1.1] + +### Changed + +- References to the renamed `/toolchain:build` skill now invoke `/toolchain:check` (toolchain 0.2.0 breaking rename). Version bumped so existing installs pick up the rewritten prompts. + ## [0.1.0] ### Added diff --git a/plugins/verification/README.md b/plugins/verification/README.md index 717c59825..759801adc 100644 --- a/plugins/verification/README.md +++ b/plugins/verification/README.md @@ -14,7 +14,7 @@ green build into confirmed outcomes. - **Delegates the mechanical pass, degrades gracefully.** `/verification:confirm` delegates its build/test/lint prerequisite to the `toolchain` plugin's - `/toolchain:build` and `/toolchain:lint` when installed, and runs the project's own + `/toolchain:check` and `/toolchain:lint` when installed, and runs the project's own ecosystem-native commands otherwise — the STOP-on-fail gate is unchanged, only the executor differs. Live-app verification prefers the `testing` plugin's `/testing:e2e` when installed and falls back to Claude Code's bundled `/verify` + diff --git a/plugins/verification/skills/confirm/SKILL.md b/plugins/verification/skills/confirm/SKILL.md index b9f6a3538..d9ff7c9b5 100644 --- a/plugins/verification/skills/confirm/SKILL.md +++ b/plugins/verification/skills/confirm/SKILL.md @@ -1,6 +1,6 @@ --- name: confirm -description: "Prove a change achieved its intended outcome: a mechanical build+test+lint prerequisite (delegated to /toolchain:build and /toolchain:lint, STOPs if broken), then outcome verification — does the change match the plan/intent and function correctly, with the criterion auto-detected by change-type (feature, fix, refactor). Use for 'verify changes', 'prove this works', 'did we build the right thing'; for quick mechanical-only checks use /toolchain:build, for measurable-improvement claims use /verification:measure." +description: "Prove a change achieved its intended outcome: a mechanical build+test+lint prerequisite (delegated to /toolchain:check and /toolchain:lint, STOPs if broken), then outcome verification — does the change match the plan/intent and function correctly, with the criterion auto-detected by change-type (feature, fix, refactor). Use for 'verify changes', 'prove this works', 'did we build the right thing'; for quick mechanical-only checks use /toolchain:check, for measurable-improvement claims use /verification:measure." user-invocable: true argument-hint: "[mode] [ecosystem] (e.g., /verification:confirm, /verification:confirm outcome, /verification:confirm fix, /verification:confirm refactor, /verification:confirm dotnet)" disable-model-invocation: false @@ -21,12 +21,12 @@ Two stages, in order: | Stage | Question | Mechanism | |-------|----------|-----------| -| 1. Mechanical **prerequisite** | "does it build, pass tests, satisfy linters?" | delegate `/toolchain:build` + `/toolchain:lint` cross-cutting + architecture-test gate. **STOP the flow if it fails** — can't verify broken code | +| 1. Mechanical **prerequisite** | "does it build, pass tests, satisfy linters?" | delegate `/toolchain:check` + `/toolchain:lint` cross-cutting + architecture-test gate. **STOP the flow if it fails** — can't verify broken code | | 2. Outcome **verification** (the core) | "does the change match the plan/intent and function correctly?" | intent match + evidence + (runtime) `/testing:e2e` / live-app observe | -The mechanical pass is a *gate*, not the point. `/toolchain:build` owns build+test+lint; `/toolchain:lint` owns cross-cutting checks. This skill composes them, then does the verification they cannot: did the change accomplish its goal. +The mechanical pass is a *gate*, not the point. `/toolchain:check` owns build+test+lint; `/toolchain:lint` owns cross-cutting checks. This skill composes them, then does the verification they cannot: did the change accomplish its goal. -**Quick mechanical-only?** Use `/toolchain:build` (not `/verification:confirm`). **Lint-only?** `/toolchain:lint`. **Tests-only?** `/toolchain:build `. Reach for `/verification:confirm` when you need outcome confirmation — proof, not just a green build. +**Quick mechanical-only?** Use `/toolchain:check` (not `/verification:confirm`). **Lint-only?** `/toolchain:lint`. **Tests-only?** `/toolchain:check `. Reach for `/verification:confirm` when you need outcome confirmation — proof, not just a green build. ## Arguments @@ -41,7 +41,7 @@ The mechanical pass is a *gate*, not the point. `/toolchain:build` owns build+te | `fix` | Original bug symptom resolved + no regression | | `refactor` | Behavior preserved — same tests pass, no semantic change | -There is **no standalone "mechanical pass" mode** — that role belongs to `/toolchain:build`. Stage 1 here is the prerequisite gate for every outcome criterion. Measurable-improvement claims (`performance` / `metrics` vs a captured baseline) are `/verification:measure`, not a mode here. +There is **no standalone "mechanical pass" mode** — that role belongs to `/toolchain:check`. Stage 1 here is the prerequisite gate for every outcome criterion. Measurable-improvement claims (`performance` / `metrics` vs a captured baseline) are `/verification:measure`, not a mode here. **Ecosystem filters** (combinable with any mode): `dotnet`, `python`, `typescript` (or `ts`/`node`), `bash` (or `shell`), `powershell` (or `ps`/`pwsh`), `all`. If omitted, auto-detect from changed files. @@ -77,13 +77,13 @@ These categories decide when a change escalates beyond the per-ecosystem mechani The gate. Runs before any outcome criterion. **If it fails, STOP** — report the failures; outcome confirmation is meaningless on code that doesn't build or pass tests. -Stage 1 delegates to the `toolchain` plugin's `/toolchain:build` and `/toolchain:lint` when that plugin is installed; when it is absent, run the project's own ecosystem-native build / test / lint commands (from its `CLAUDE.md` / rules) directly — the gate and its STOP-on-fail semantics are unchanged, only the executor differs. +Stage 1 delegates to the `toolchain` plugin's `/toolchain:check` and `/toolchain:lint` when that plugin is installed; when it is absent, run the project's own ecosystem-native build / test / lint commands (from its `CLAUDE.md` / rules) directly — the gate and its STOP-on-fail semantics are unchanged, only the executor differs. -1. **Build + test + lint per ecosystem** — when changed files span multiple ecosystems or the mechanical pass is non-trivial, dispatch a subagent with the changed-file paths and `/toolchain:build`'s command tables, and verify its summary against the actual command output; otherwise invoke `/toolchain:build` via the Skill tool. `/toolchain:build` remains SSOT for ecosystem detection, CLI commands, and gotchas. Pass through the ecosystem filter from `$ARGUMENTS` if given; else `/toolchain:build` auto-detects from changed files. +1. **Build + test + lint per ecosystem** — when changed files span multiple ecosystems or the mechanical pass is non-trivial, dispatch a subagent with the changed-file paths and `/toolchain:check`'s command tables, and verify its summary against the actual command output; otherwise invoke `/toolchain:check` via the Skill tool. `/toolchain:check` remains SSOT for ecosystem detection, CLI commands, and gotchas. Pass through the ecosystem filter from `$ARGUMENTS` if given; else `/toolchain:check` auto-detects from changed files. 2. **Architecture tests** — when changed files match the `arch-test-triggers` globs above and the project has an architecture-test suite, ensure it is included in the test step. 3. **Cross-cutting checks** — invoke `/toolchain:lint cross-cutting` via the Skill tool. `/toolchain:lint` owns the cross-cutting tools with the presence-gated graceful-degradation pattern (missing tool → `skip`, never `FAIL`). Do **not** inline that bash here — `/toolchain:lint` is the SSOT. -**Gate result:** if `/toolchain:build` or `/toolchain:lint cross-cutting` reports any FAIL, stop and surface the failing command's key error lines. Fix mechanical failures before outcome verification proceeds. If everything passes (or `skip`s), proceed to Stage 2. +**Gate result:** if `/toolchain:check` or `/toolchain:lint cross-cutting` reports any FAIL, stop and surface the failing command's key error lines. Fix mechanical failures before outcome verification proceeds. If everything passes (or `skip`s), proceed to Stage 2. ## Stage 2 — Outcome verification (the core) @@ -112,7 +112,7 @@ For "run the live app and watch it behave" — beyond automated `/testing:e2e` - **No git changes but user runs `/verification:confirm all`**: run Stage 1 across all ecosystems anyway (useful after a rebase or pull), then outcome verification if intent is in scope. - **Changed file outside any known ecosystem**: Stage 1 skips it with a note; Stage 2 still assesses intent match. -- **Missing tools**: `/toolchain:build` / `/toolchain:lint` report `skip` with install hint, not failure — except the core toolchain the project's own code requires. +- **Missing tools**: `/toolchain:check` / `/toolchain:lint` report `skip` with install hint, not failure — except the core toolchain the project's own code requires. - **Invoked from a PR-prep flow**: treat the verdict as a hard gate — any FAIL or unresolved CRITICAL gap blocks PR creation. ## Skill chaining @@ -128,7 +128,7 @@ For "run the live app and watch it behave" — beyond automated `/testing:e2e` ## What this skill does NOT do -- **Does not reimplement the mechanical pass** — `/toolchain:build` (build+test+lint) and `/toolchain:lint` (cross-cutting) are SSOT. Stage 1 delegates to them. +- **Does not reimplement the mechanical pass** — `/toolchain:check` (build+test+lint) and `/toolchain:lint` (cross-cutting) are SSOT. Stage 1 delegates to them. - **Does not auto-fix** — identifies failures and gaps; the implementer fixes them. For lint auto-fix, run `/toolchain:lint --fix`. - **Does not check design quality for ship-readiness** — that's the project's review/quality-gate flow. - **Does not verify measurable-improvement claims** — `/verification:measure` owns the baseline/compare mechanism; this skill redirects improvement claims there. diff --git a/plugins/verification/skills/confirm/evals/evals.json b/plugins/verification/skills/confirm/evals/evals.json index b3fa7e961..55ad38953 100644 --- a/plugins/verification/skills/confirm/evals/evals.json +++ b/plugins/verification/skills/confirm/evals/evals.json @@ -5,11 +5,11 @@ "id": 1, "name": "auto-detect-outcome-after-implement", "prompt": "I just finished implementing the caching feature we planned. verify changes", - "expected_output": "Runs Stage 1 (mechanical prerequisite — delegates /toolchain:build + /toolchain:lint cross-cutting), then Stage 2 outcome verification with the feature/general criterion: intent match against the plan + functions + (if UI) looks correct. Emits a CONFIRMED / NEEDS WORK verdict.", + "expected_output": "Runs Stage 1 (mechanical prerequisite — delegates /toolchain:check + /toolchain:lint cross-cutting), then Stage 2 outcome verification with the feature/general criterion: intent match against the plan + functions + (if UI) looks correct. Emits a CONFIRMED / NEEDS WORK verdict.", "files": [], "expectations": [ "Auto-detects the `outcome` criterion from the post-implementation context (no mode argument given)", - "Stage 1 delegates to /toolchain:build and /toolchain:lint cross-cutting — does NOT reimplement build/test/lint or inline exec-bit/gitleaks bash", + "Stage 1 delegates to /toolchain:check and /toolchain:lint cross-cutting — does NOT reimplement build/test/lint or inline exec-bit/gitleaks bash", "Stage 2 retrieves intent (plan / conversation) and produces an intent-match table", "Emits a CONFIRMED or NEEDS WORK verdict, not just a green build" ] @@ -21,7 +21,7 @@ "expected_output": "Stage 1 mechanical prerequisite fails (build or test red). The skill STOPS and reports the failures — it does NOT proceed to outcome verification, because outcome confirmation is meaningless on code that doesn't build or pass tests.", "files": [], "expectations": [ - "STOPS at Stage 1 when /toolchain:build or /toolchain:lint cross-cutting reports FAIL — does not run Stage 2", + "STOPS at Stage 1 when /toolchain:check or /toolchain:lint cross-cutting reports FAIL — does not run Stage 2", "Reports the failing command's key error lines", "States that mechanical failures must be fixed before outcome verification proceeds (\"can't verify broken code\")" ] @@ -66,10 +66,10 @@ "id": 8, "name": "quick-mechanical-routes-to-build", "prompt": "does this still build and pass tests?", - "expected_output": "Recognizes this as a quick mechanical-only request and routes to /toolchain:build (not /verification:confirm). /verification:confirm is for outcome confirmation; /toolchain:build owns the standalone mechanical pass.", + "expected_output": "Recognizes this as a quick mechanical-only request and routes to /toolchain:check (not /verification:confirm). /verification:confirm is for outcome confirmation; /toolchain:check owns the standalone mechanical pass.", "files": [], "expectations": [ - "Routes a quick mechanical-only request to /toolchain:build rather than running the full two-stage outcome flow", + "Routes a quick mechanical-only request to /toolchain:check rather than running the full two-stage outcome flow", "Reserves /verification:confirm for when outcome confirmation (proof the change achieved its intent) is wanted" ] }, diff --git a/plugins/verification/skills/measure/SKILL.md b/plugins/verification/skills/measure/SKILL.md index a4c1886cc..41d84ecd0 100644 --- a/plugins/verification/skills/measure/SKILL.md +++ b/plugins/verification/skills/measure/SKILL.md @@ -40,7 +40,7 @@ Each context file owns its family's full discipline: claim-to-metric mapping, me ## Prerequisite — green mechanical state (both phases) -Measuring broken code is meaningless, and a baseline captured on a broken tree poisons every later comparison. Before EITHER phase — `baseline` capture or `compare` — confirm the mechanical pass is green: reuse a `/toolchain:build` or `/verification:confirm` Stage-1 result from this conversation if nothing changed since; otherwise invoke `/toolchain:build` when the `toolchain` plugin is installed, or run the project's own build/test command when it is absent. Do not reimplement build/test/lint here. +Measuring broken code is meaningless, and a baseline captured on a broken tree poisons every later comparison. Before EITHER phase — `baseline` capture or `compare` — confirm the mechanical pass is green: reuse a `/toolchain:check` or `/verification:confirm` Stage-1 result from this conversation if nothing changed since; otherwise invoke `/toolchain:check` when the `toolchain` plugin is installed, or run the project's own build/test command when it is absent. Do not reimplement build/test/lint here. ## Integration @@ -56,7 +56,7 @@ Measuring broken code is meaningless, and a baseline captured on a broken tree p - **Does not confirm intent/outcome** — "did we build the right thing" is `/verification:confirm` (`outcome` / `fix` / `refactor` criteria). - **Does not review for ship-readiness** — that's the project's review gate; the measure-delta vs review-for-ship boundary is stated in "Purpose" above. - **Does not capture baselines after the fact** — a post-change "baseline" is not a baseline. Missing baseline → honest "cannot quantify", plus a current-state measurement for the record. -- **Does not run the mechanical pass** — `/toolchain:build` owns build+test+lint; this skill only requires its result to be green. +- **Does not run the mechanical pass** — `/toolchain:check` owns build+test+lint; this skill only requires its result to be green. ## Gotchas