From 056cb9cdf4a0be190d22fc29159af2c8f2fbd1de Mon Sep 17 00:00:00 2001 From: Kyle Sexton <153232337+kyle-sexton@users.noreply.github.com> Date: Tue, 21 Jul 2026 06:26:55 -0400 Subject: [PATCH 1/6] docs: document shell test-helper duplication and exit-code divergence as deliberate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Resolves the fork in #820: the per-plugin shell assert-helper copies (guardrails, claude-ops, source-control, repo-hygiene, work-items) and their divergent per-script exit-code taxonomies stay as-is rather than being consolidated into a shared mechanism. The existing lib/ + sync-*.sh vendoring precedent (hook-utils.sh) only covers clusters meant to stay byte-identical; these five copies are three genuinely different shapes already, so forcing them onto one shared library would mean a bigger, riskier redesign than the coupling it removes — and would cross the plugin-independence boundary the plugin philosophy already draws. Adds docs/conventions/shell-test-helpers/README.md as the owner doc, registers it in PLUGIN-PHILOSOPHY.md's convention registry, and adds a one-line pointer at each copy site (plus scripts/check-skill-portability.test.sh, which opted out for an unrelated reason: it is repo tooling, not a plugin). Co-Authored-By: Claude Sonnet 5 Claude-Session: https://claude.ai/code/session_01K1V3gkrfSf75isB8MiDy3o --- docs/PLUGIN-PHILOSOPHY.md | 1 + docs/conventions/shell-test-helpers/README.md | 72 +++++++++++++++++++ plugins/claude-ops/.claude-plugin/plugin.json | 2 +- plugins/claude-ops/CHANGELOG.md | 9 +++ .../hooks/claude-ops-test-helpers.sh | 3 + plugins/guardrails/.claude-plugin/plugin.json | 2 +- plugins/guardrails/CHANGELOG.md | 9 +++ .../hooks/guardrails-test-helpers.sh | 3 + .../repo-hygiene/.claude-plugin/plugin.json | 2 +- plugins/repo-hygiene/CHANGELOG.md | 9 +++ .../skills/clean/scripts/lib/test-helpers.sh | 3 + .../source-control/.claude-plugin/plugin.json | 2 +- plugins/source-control/CHANGELOG.md | 8 +++ .../source-control/scripts/test-helpers.sh | 3 + plugins/work-items/.claude-plugin/plugin.json | 2 +- plugins/work-items/CHANGELOG.md | 9 +++ .../tools/work-item-tracker/tests/lib.sh | 3 + scripts/check-skill-portability.test.sh | 4 ++ 18 files changed, 141 insertions(+), 5 deletions(-) create mode 100644 docs/conventions/shell-test-helpers/README.md diff --git a/docs/PLUGIN-PHILOSOPHY.md b/docs/PLUGIN-PHILOSOPHY.md index a31378a1fc..03c1000636 100644 --- a/docs/PLUGIN-PHILOSOPHY.md +++ b/docs/PLUGIN-PHILOSOPHY.md @@ -288,6 +288,7 @@ doc before a second plugin adopts it. Fleet audits check conformance per row. | Skill layout contract and evals schema | `skill-quality` plugin (contract gate + bundled schema) | | Review severity vocabulary | `review` plugin (`context/severity.md`) | | Seam phrasing (presence-gated fallbacks) | [`docs/conventions/seam-phrasing/`](conventions/seam-phrasing/README.md) | +| Shell test-helper duplication and exit-code divergence | [`docs/conventions/shell-test-helpers/`](conventions/shell-test-helpers/README.md) | ## Cross-platform contract diff --git a/docs/conventions/shell-test-helpers/README.md b/docs/conventions/shell-test-helpers/README.md new file mode 100644 index 0000000000..17e651bc41 --- /dev/null +++ b/docs/conventions/shell-test-helpers/README.md @@ -0,0 +1,72 @@ +# Shell test helpers — per-plugin duplication and exit-code divergence are deliberate + +Owner doc for one fork this marketplace has already decided: a plugin's shell `*.test.sh` assertion +primitives and a plugin script's exit-code taxonomy are **not** consolidated into a shared, +cross-plugin mechanism. Both stay duplicated or divergent per plugin, on purpose. The +[plugin philosophy](../../PLUGIN-PHILOSOPHY.md) owns the portability boundary this rests on: a plugin +never imports files from a sibling plugin, and cooperation crosses that boundary only through a +documented public seam — a shared shell assertion library is neither. + +## Why not the existing vendoring mechanism + +This repo already has one sanctioned way to share source across plugins: a canonical file under +[`lib/`](../../../lib/), copied (not imported) into each carrying plugin by a dedicated +`scripts/sync-*.sh`, and tracked in +[`scripts/cross-plugin-source-registry.txt`](../../../scripts/cross-plugin-source-registry.txt) so +`check-cross-plugin-source-drift.sh --check` fails if a copy drifts. `lib/hook-utils.sh` is the +worked example. + +That mechanism exists for clusters that are meant to stay **byte-identical**. The assert-helper copies +below are not that: they are already three genuinely different shapes, not one library that drifted — + +- **Hook-contract shape** (`ok`/`bad`, `PASS`/`FAIL` counters, plus `make_sink`/`wait_for_sink` for + hook telemetry): [`guardrails/hooks/guardrails-test-helpers.sh`](../../../plugins/guardrails/hooks/guardrails-test-helpers.sh), + [`claude-ops/hooks/claude-ops-test-helpers.sh`](../../../plugins/claude-ops/hooks/claude-ops-test-helpers.sh). +- **Skill-script shape** (`pass`/`fail`, `FAILED`/`CASE_NUM` counters, file-existence assertions): + [`source-control/scripts/test-helpers.sh`](../../../plugins/source-control/scripts/test-helpers.sh), + [`repo-hygiene/skills/clean/scripts/lib/test-helpers.sh`](../../../plugins/repo-hygiene/skills/clean/scripts/lib/test-helpers.sh). +- **Vendored-seam shape** (same `pass`/`fail` primitives, but owned by the seam itself so it stays + correct wherever the seam is resolved from — bundled or consumer-vendored — independent of this + repo's tooling): [`work-items/tools/work-item-tracker/tests/lib.sh`](../../../plugins/work-items/tools/work-item-tracker/tests/lib.sh). + +Forcing these into one shared, synced library would mean designing a fourth, unified assertion API +and rewriting every existing `*.test.sh` onto it — a bigger, riskier change than the coupling it would +remove, for a mechanism (`check-cross-plugin-source-drift.sh`) that already classifies these files as +outside its scope: they live at different paths per plugin and are not byte-identical, so `discover` +never flags them as an unregistered cluster. + +`scripts/check-skill-portability.test.sh` follows the same reasoning at the repo-tooling layer: it is +not a plugin, so no plugin assertion library is available to source, and it carries its own minimal +`PASS`/`FAIL` counters rather than reaching into a plugin's copy. + +## Exit-code taxonomies also diverge, deliberately + +Plugin scripts document their own `Exit:` codes rather than sharing one enum, because each taxonomy +encodes a different per-script contract, not an arbitrary numbering: + +- [`repo-hygiene/skills/clean/scripts/remove-path.sh`](../../../plugins/repo-hygiene/skills/clean/scripts/remove-path.sh) — + `0/1/2/3/4`: usage and existence checks plus two named blocking conditions (`blocked`, `unpushed`). +- [`repo-hygiene/skills/clean/scripts/git-tree-reset-batch.sh`](../../../plugins/repo-hygiene/skills/clean/scripts/git-tree-reset-batch.sh) — + `0/1/2` for the batch runner itself, forwarding a child's `5`/`7` (from + [`git-tree-reset.sh`](../../../plugins/repo-hygiene/skills/clean/scripts/git-tree-reset.sh)'s own + `0`–`7` taxonomy) into its own `1`. +- [`scripts/check-skill-portability.sh`](../../../scripts/check-skill-portability.sh) — `0/1/2`: gate + pass/fail plus usage error. + +A shared usage/exit helper would need to either flatten these distinct contracts into a lowest common +denominator or grow branching per caller — neither is simpler than each script documenting its own +`Exit:` line, which every script here already does at its own usage banner. + +## Deferred, not rejected + +`guardrails-test-helpers.sh` and `claude-ops-test-helpers.sh` are the one pair above that already +share a shape closely (both hook-contract helpers with near-identical `ok`/`bad`/`make_sink` bodies). +If they converge to byte-identical, vendoring just that pair through the existing `lib/`, +`sync-*.sh`, and registry mechanism — the same pattern `hook-utils.sh` already uses — is the smaller, +precedented move, revisited then rather than spread across all five plugins now. + +## Conformance + +Each copy site above carries a one-line pointer back to this doc. A new plugin adding its own +`*.test.sh` assertion helper is not required to register anything here — duplication of this shape is +the accepted default, not an opt-in. diff --git a/plugins/claude-ops/.claude-plugin/plugin.json b/plugins/claude-ops/.claude-plugin/plugin.json index 89f037cd6d..a5587f7e32 100644 --- a/plugins/claude-ops/.claude-plugin/plugin.json +++ b/plugins/claude-ops/.claude-plugin/plugin.json @@ -1,7 +1,7 @@ { "$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json", "name": "claude-ops", - "version": "0.17.1", + "version": "0.17.2", "description": "Claude Code operations toolkit. Seven skills: observability (read locally captured telemetry — OTEL store, collector, hook-event JSONL, ccusage — with trend reports and store pruning), known-issues (search known Claude product GitHub bugs, check service health, maintain a persistent tracked-issue registry), changelog (ingest Claude Code changelog entries and integrate them into the current repo), plugins (bring a machine's plugin fleet current on demand — marketplace refresh, effective-scope updates including in-repo project/local installs, new-plugin install per policy, scope-divergence detection and explicit convergence), morning-brief (read-only gh-based operator morning view — queue-label counts, merge-ready PRs, parked decisions with their RECOMMENDED lines, and loop-lane telemetry freshness), lanes (start/restart/stop/status loop lanes as named background Claude Code sessions seeded from canonical prompt files, with per-lane model/effort and a repo-pull + marketplace-refresh launch step), and a re-runnable setup action that settles where the known-issues registry lives. Plus a family of seven advisory *-audit telemetry-emitter hooks (API errors, config changes, instruction loads, permission denials, pre-compaction, skill usage, tool failures) that emit the shared hook-telemetry envelope, and a reference sink that maps envelopes into the hook-events.jsonl the observability skill reads.", "author": { "name": "Melodic Software", diff --git a/plugins/claude-ops/CHANGELOG.md b/plugins/claude-ops/CHANGELOG.md index e10f1b4519..a1a4ecdd86 100644 --- a/plugins/claude-ops/CHANGELOG.md +++ b/plugins/claude-ops/CHANGELOG.md @@ -3,6 +3,15 @@ All notable changes to the `claude-ops` plugin are documented here. Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/); this plugin uses semantic versioning. +## [0.17.2] + +### Documentation + +- `hooks/claude-ops-test-helpers.sh` now points at + `docs/conventions/shell-test-helpers/README.md`, the repo's owner doc recording that per-plugin + shell assert-helper duplication and per-script exit-code taxonomies are deliberate, not drift. No + behavior change. + ## [0.17.1] ### Fixed diff --git a/plugins/claude-ops/hooks/claude-ops-test-helpers.sh b/plugins/claude-ops/hooks/claude-ops-test-helpers.sh index abbbccf926..6c7370675a 100644 --- a/plugins/claude-ops/hooks/claude-ops-test-helpers.sh +++ b/plugins/claude-ops/hooks/claude-ops-test-helpers.sh @@ -3,6 +3,9 @@ # Sourced (never *.test.sh-named, so the test runner's glob ignores it) by each # hook's *.test.sh after that file sets up its own TEST_TMPDIR + trap. No # dependency on any host-repo assertion library — the plugin is standalone. +# +# Duplicated across plugins by design, not drift — see +# docs/conventions/shell-test-helpers/README.md at the repo root. : "${PASS:=0}" : "${FAIL:=0}" diff --git a/plugins/guardrails/.claude-plugin/plugin.json b/plugins/guardrails/.claude-plugin/plugin.json index 866f303b3f..da68efb8be 100644 --- a/plugins/guardrails/.claude-plugin/plugin.json +++ b/plugins/guardrails/.claude-plugin/plugin.json @@ -1,7 +1,7 @@ { "$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json", "name": "guardrails", - "version": "0.9.5", + "version": "0.9.6", "description": "Eight safety guards that block secret/credential writes, hardcoded machine-specific paths, git hook-bypass attempts, irreversible git operations (force-push, reset --hard, worktree-wide checkout/restore discards), Bash file-write workarounds that circumvent Write/Edit hooks, (advisory) hallucinated CLI flags, (advisory) un-throttled Workflow fan-out that risks burst 529s, and (advisory) direct git commit/gh pr create calls bypassing this marketplace's own commit/pull-request skills — each independently toggleable.", "author": { "name": "Melodic Software", diff --git a/plugins/guardrails/CHANGELOG.md b/plugins/guardrails/CHANGELOG.md index 5d3d29bf45..250d878d11 100644 --- a/plugins/guardrails/CHANGELOG.md +++ b/plugins/guardrails/CHANGELOG.md @@ -3,6 +3,15 @@ All notable changes to the `guardrails` plugin are documented here. Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/); this plugin uses semantic versioning. +## [0.9.6] + +### Documentation + +- `hooks/guardrails-test-helpers.sh` now points at + `docs/conventions/shell-test-helpers/README.md`, the repo's owner doc recording that per-plugin + shell assert-helper duplication and per-script exit-code taxonomies are deliberate, not drift. No + behavior change. + ## [0.9.5] ### Fixed diff --git a/plugins/guardrails/hooks/guardrails-test-helpers.sh b/plugins/guardrails/hooks/guardrails-test-helpers.sh index 75eb1c970b..31d8840b7a 100644 --- a/plugins/guardrails/hooks/guardrails-test-helpers.sh +++ b/plugins/guardrails/hooks/guardrails-test-helpers.sh @@ -3,6 +3,9 @@ # Sourced (never *.test.sh-named, so a test runner's glob ignores it) by each # hook's *.test.sh after that file sets up its own TEST_TMPDIR + trap. No # dependency on any host-repo assertion library — the plugin is standalone. +# +# Duplicated across plugins by design, not drift — see +# docs/conventions/shell-test-helpers/README.md at the repo root. : "${PASS:=0}" : "${FAIL:=0}" diff --git a/plugins/repo-hygiene/.claude-plugin/plugin.json b/plugins/repo-hygiene/.claude-plugin/plugin.json index e1c18cc521..66fa3d2acb 100644 --- a/plugins/repo-hygiene/.claude-plugin/plugin.json +++ b/plugins/repo-hygiene/.claude-plugin/plugin.json @@ -1,7 +1,7 @@ { "$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json", "name": "repo-hygiene", - "version": "0.4.4", + "version": "0.4.5", "description": "Repo hygiene action-router: /repo-hygiene:clean sweeps reclaimable caches, build artifacts, and stale git metadata, and can realign the working tree to a fresh-pull state — dry-run-first, with destructive tiers gated behind explicit confirmation and a session-scoped destructive-command guard. Ecosystem targets are detected at runtime; secrets, runtime dependencies, and skill data are preserved by default.", "author": { "name": "Melodic Software", diff --git a/plugins/repo-hygiene/CHANGELOG.md b/plugins/repo-hygiene/CHANGELOG.md index af462272ee..4b926b70bf 100644 --- a/plugins/repo-hygiene/CHANGELOG.md +++ b/plugins/repo-hygiene/CHANGELOG.md @@ -3,6 +3,15 @@ All notable changes to the `repo-hygiene` plugin are documented here. Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/); this plugin uses semantic versioning. +## [0.4.5] + +### Documentation + +- `skills/clean/scripts/lib/test-helpers.sh` now points at + `docs/conventions/shell-test-helpers/README.md`, the repo's owner doc recording that per-plugin + shell assert-helper duplication and per-script exit-code taxonomies are deliberate, not drift. No + behavior change. + ## [0.4.4] ### Changed diff --git a/plugins/repo-hygiene/skills/clean/scripts/lib/test-helpers.sh b/plugins/repo-hygiene/skills/clean/scripts/lib/test-helpers.sh index cf332addfb..e94fda9bc5 100644 --- a/plugins/repo-hygiene/skills/clean/scripts/lib/test-helpers.sh +++ b/plugins/repo-hygiene/skills/clean/scripts/lib/test-helpers.sh @@ -7,6 +7,9 @@ # # Each test file owns its own FAILED / CASE_NUM counters and exits non-zero at # the end: `[[ $FAILED -eq 0 ]] || exit 1`. +# +# Duplicated across plugins by design, not drift — see +# docs/conventions/shell-test-helpers/README.md at the repo root. [[ -n "${_CLEAN_TEST_HELPERS_LOADED:-}" ]] && return 0 readonly _CLEAN_TEST_HELPERS_LOADED=1 diff --git a/plugins/source-control/.claude-plugin/plugin.json b/plugins/source-control/.claude-plugin/plugin.json index 4bf5669644..610b694063 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.15.7", + "version": "0.15.8", "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, CI-log fetch), /babysit-prs (self-pacing fleet loop — safe by default; opt-in worker/autopilot tiers add gate-checked merge and thread resolution behind a deterministic Python engine), /worktree (create, status, cleanup, audit for parallel-session isolation), /setup (check the effective commit-subject / PR-title convention merged across its config layers and the babysit-prs config, or apply — interview the repo and write the convention config to a chosen layer), and /resolve-conflicts (intent-first merge/rebase conflict resolution with a semantic-conflict sweep — never --abort). The commit-subject / PR-title convention is configurable via a source-control.md config written by a re-runnable setup skill, layered across a ~/.claude user-global file, the tracked team file, and a gitignored .claude/source-control.local.md personal overlay merged per key; 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 a411723a81..a689adf16a 100644 --- a/plugins/source-control/CHANGELOG.md +++ b/plugins/source-control/CHANGELOG.md @@ -3,6 +3,14 @@ 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.15.8] + +### Documentation + +- `scripts/test-helpers.sh` now points at `docs/conventions/shell-test-helpers/README.md`, the + repo's owner doc recording that per-plugin shell assert-helper duplication and per-script exit-code + taxonomies are deliberate, not drift. No behavior change. + ## [0.15.7] ### Added diff --git a/plugins/source-control/scripts/test-helpers.sh b/plugins/source-control/scripts/test-helpers.sh index 75c229c4b5..f27b9167be 100644 --- a/plugins/source-control/scripts/test-helpers.sh +++ b/plugins/source-control/scripts/test-helpers.sh @@ -9,6 +9,9 @@ # # Param order: subject (haystack/actual) BEFORE expected (needle), except # assert_eq / assert_exit which take (label, expected, actual). +# +# Duplicated across plugins by design, not drift — see +# docs/conventions/shell-test-helpers/README.md at the repo root. [[ -n "${_TESTS_LIB_LOADED:-}" ]] && return 0 readonly _TESTS_LIB_LOADED=1 diff --git a/plugins/work-items/.claude-plugin/plugin.json b/plugins/work-items/.claude-plugin/plugin.json index 38f9236356..8aa290d30c 100644 --- a/plugins/work-items/.claude-plugin/plugin.json +++ b/plugins/work-items/.claude-plugin/plugin.json @@ -1,7 +1,7 @@ { "$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json", "name": "work-items", - "version": "0.18.1", + "version": "0.18.2", "description": "Manages development work items through a provider-neutral tracker seam that ships with the plugin (bundled dispatcher plus github and local-markdown adapters; seam plugin-dir canonical, adapters consumer-local-first): dashboard, taxonomy-labeled creation, a race-safe assignee-plus-lease claim protocol, recurring-schedule checks, TODO scanning, stale-lease auditing, plan decomposition into vertical-slice items, and raw-intake triage (issues and unsolicited PRs through raw, verified, briefed, autonomous-eligible states). The re-runnable setup skill binds the provider (.work-item-tracker.json), seeds the recurring-schedule seam (.github/recurring-schedule.json), and remaps canonical role labels.", "author": { "name": "Melodic Software", diff --git a/plugins/work-items/CHANGELOG.md b/plugins/work-items/CHANGELOG.md index a2eda36ec4..f7a9a23f4d 100644 --- a/plugins/work-items/CHANGELOG.md +++ b/plugins/work-items/CHANGELOG.md @@ -3,6 +3,15 @@ All notable changes to the `work-items` plugin are documented here. Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/); this plugin uses semantic versioning. +## [0.18.2] + +### Documentation + +- `tools/work-item-tracker/tests/lib.sh` now points at + `docs/conventions/shell-test-helpers/README.md`, the repo's owner doc recording that per-plugin + shell assert-helper duplication and per-script exit-code taxonomies are deliberate, not drift. No + behavior change. + ## [0.18.1] ### Changed diff --git a/plugins/work-items/tools/work-item-tracker/tests/lib.sh b/plugins/work-items/tools/work-item-tracker/tests/lib.sh index ccb71233b6..b2ea6a8aa5 100644 --- a/plugins/work-items/tools/work-item-tracker/tests/lib.sh +++ b/plugins/work-items/tools/work-item-tracker/tests/lib.sh @@ -14,6 +14,9 @@ # # Param order: subject (actual) BEFORE expected — reads as "in , # expect ". +# +# Duplicated across plugins by design, not drift — see +# docs/conventions/shell-test-helpers/README.md at the repo root. [[ -n "${_WIT_TESTS_LIB_LOADED:-}" ]] && return 0 readonly _WIT_TESTS_LIB_LOADED=1 diff --git a/scripts/check-skill-portability.test.sh b/scripts/check-skill-portability.test.sh index 1005ee14cb..71df32dc7b 100755 --- a/scripts/check-skill-portability.test.sh +++ b/scripts/check-skill-portability.test.sh @@ -5,6 +5,10 @@ # and runs the script's --all mode from a fixture root, exactly as the # silent-skip suite does. Two cases run against the REAL corpus to prove the # bare-vs-guarded discrimination on live files, not only synthetic ones. +# +# Bespoke PASS/FAIL counters by design, not drift: this is repo tooling, not a +# plugin, so no plugin assertion library applies here — see +# docs/conventions/shell-test-helpers/README.md. # shellcheck disable=SC2016 # fixture bodies are literal skill content in single quotes; expansion is never wanted set -uo pipefail From ae5c5aa8fc7a7f74468980f0aa096eb54f7d0c65 Mon Sep 17 00:00:00 2001 From: Kyle Sexton <153232337+kyle-sexton@users.noreply.github.com> Date: Tue, 21 Jul 2026 06:31:07 -0400 Subject: [PATCH 2/6] fix: bump past highest open-PR version claim for source-control, claude-ops, work-items MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Re-checked open PRs touching these plugins' plugin.json right before the version-bump collision protocol requires it: source-control carries #839 (0.15.8) and #840 (0.15.9), claude-ops carries #844 (0.17.2), work-items carries #826 (0.18.2) — all still open. Bumps this PR's claims one past each plugin's current highest open-PR claim (source-control 0.15.10, claude-ops 0.17.3, work-items 0.18.3) so this PR does not collide at merge time regardless of which sibling lands first. Co-Authored-By: Claude Sonnet 5 Claude-Session: https://claude.ai/code/session_01K1V3gkrfSf75isB8MiDy3o --- plugins/claude-ops/.claude-plugin/plugin.json | 2 +- plugins/claude-ops/CHANGELOG.md | 2 +- plugins/source-control/.claude-plugin/plugin.json | 2 +- plugins/source-control/CHANGELOG.md | 2 +- plugins/work-items/.claude-plugin/plugin.json | 2 +- plugins/work-items/CHANGELOG.md | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/plugins/claude-ops/.claude-plugin/plugin.json b/plugins/claude-ops/.claude-plugin/plugin.json index a5587f7e32..50f5601199 100644 --- a/plugins/claude-ops/.claude-plugin/plugin.json +++ b/plugins/claude-ops/.claude-plugin/plugin.json @@ -1,7 +1,7 @@ { "$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json", "name": "claude-ops", - "version": "0.17.2", + "version": "0.17.3", "description": "Claude Code operations toolkit. Seven skills: observability (read locally captured telemetry — OTEL store, collector, hook-event JSONL, ccusage — with trend reports and store pruning), known-issues (search known Claude product GitHub bugs, check service health, maintain a persistent tracked-issue registry), changelog (ingest Claude Code changelog entries and integrate them into the current repo), plugins (bring a machine's plugin fleet current on demand — marketplace refresh, effective-scope updates including in-repo project/local installs, new-plugin install per policy, scope-divergence detection and explicit convergence), morning-brief (read-only gh-based operator morning view — queue-label counts, merge-ready PRs, parked decisions with their RECOMMENDED lines, and loop-lane telemetry freshness), lanes (start/restart/stop/status loop lanes as named background Claude Code sessions seeded from canonical prompt files, with per-lane model/effort and a repo-pull + marketplace-refresh launch step), and a re-runnable setup action that settles where the known-issues registry lives. Plus a family of seven advisory *-audit telemetry-emitter hooks (API errors, config changes, instruction loads, permission denials, pre-compaction, skill usage, tool failures) that emit the shared hook-telemetry envelope, and a reference sink that maps envelopes into the hook-events.jsonl the observability skill reads.", "author": { "name": "Melodic Software", diff --git a/plugins/claude-ops/CHANGELOG.md b/plugins/claude-ops/CHANGELOG.md index a1a4ecdd86..6d46c5d0ee 100644 --- a/plugins/claude-ops/CHANGELOG.md +++ b/plugins/claude-ops/CHANGELOG.md @@ -3,7 +3,7 @@ All notable changes to the `claude-ops` plugin are documented here. Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/); this plugin uses semantic versioning. -## [0.17.2] +## [0.17.3] ### Documentation diff --git a/plugins/source-control/.claude-plugin/plugin.json b/plugins/source-control/.claude-plugin/plugin.json index 610b694063..bb3d15fb6a 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.15.8", + "version": "0.15.10", "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, CI-log fetch), /babysit-prs (self-pacing fleet loop — safe by default; opt-in worker/autopilot tiers add gate-checked merge and thread resolution behind a deterministic Python engine), /worktree (create, status, cleanup, audit for parallel-session isolation), /setup (check the effective commit-subject / PR-title convention merged across its config layers and the babysit-prs config, or apply — interview the repo and write the convention config to a chosen layer), and /resolve-conflicts (intent-first merge/rebase conflict resolution with a semantic-conflict sweep — never --abort). The commit-subject / PR-title convention is configurable via a source-control.md config written by a re-runnable setup skill, layered across a ~/.claude user-global file, the tracked team file, and a gitignored .claude/source-control.local.md personal overlay merged per key; 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 a689adf16a..09d12cc9f5 100644 --- a/plugins/source-control/CHANGELOG.md +++ b/plugins/source-control/CHANGELOG.md @@ -3,7 +3,7 @@ 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.15.8] +## [0.15.10] ### Documentation diff --git a/plugins/work-items/.claude-plugin/plugin.json b/plugins/work-items/.claude-plugin/plugin.json index 8aa290d30c..9eb816dada 100644 --- a/plugins/work-items/.claude-plugin/plugin.json +++ b/plugins/work-items/.claude-plugin/plugin.json @@ -1,7 +1,7 @@ { "$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json", "name": "work-items", - "version": "0.18.2", + "version": "0.18.3", "description": "Manages development work items through a provider-neutral tracker seam that ships with the plugin (bundled dispatcher plus github and local-markdown adapters; seam plugin-dir canonical, adapters consumer-local-first): dashboard, taxonomy-labeled creation, a race-safe assignee-plus-lease claim protocol, recurring-schedule checks, TODO scanning, stale-lease auditing, plan decomposition into vertical-slice items, and raw-intake triage (issues and unsolicited PRs through raw, verified, briefed, autonomous-eligible states). The re-runnable setup skill binds the provider (.work-item-tracker.json), seeds the recurring-schedule seam (.github/recurring-schedule.json), and remaps canonical role labels.", "author": { "name": "Melodic Software", diff --git a/plugins/work-items/CHANGELOG.md b/plugins/work-items/CHANGELOG.md index f7a9a23f4d..d8b2c9c5f5 100644 --- a/plugins/work-items/CHANGELOG.md +++ b/plugins/work-items/CHANGELOG.md @@ -3,7 +3,7 @@ All notable changes to the `work-items` plugin are documented here. Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/); this plugin uses semantic versioning. -## [0.18.2] +## [0.18.3] ### Documentation From 841a1bf2faff982ac6add79efc8dd172e6109096 Mon Sep 17 00:00:00 2001 From: Kyle Sexton <153232337+kyle-sexton@users.noreply.github.com> Date: Tue, 21 Jul 2026 12:30:09 -0400 Subject: [PATCH 3/6] fix: bump repo-hygiene past a newly-opened collision (#860) repo-hygiene had no open-PR collision at this PR's original open, but #860 (chore/skill-shell-declaration) opened since and claims 0.4.5 exactly, matching this branch's prior claim. Bump to 0.4.6 to stay ahead of it. Co-Authored-By: Claude Sonnet 5 Claude-Session: https://claude.ai/code/session_01K1V3gkrfSf75isB8MiDy3o --- plugins/repo-hygiene/.claude-plugin/plugin.json | 2 +- plugins/repo-hygiene/CHANGELOG.md | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/plugins/repo-hygiene/.claude-plugin/plugin.json b/plugins/repo-hygiene/.claude-plugin/plugin.json index 66fa3d2acb..b2e2dd2056 100644 --- a/plugins/repo-hygiene/.claude-plugin/plugin.json +++ b/plugins/repo-hygiene/.claude-plugin/plugin.json @@ -1,7 +1,7 @@ { "$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json", "name": "repo-hygiene", - "version": "0.4.5", + "version": "0.4.6", "description": "Repo hygiene action-router: /repo-hygiene:clean sweeps reclaimable caches, build artifacts, and stale git metadata, and can realign the working tree to a fresh-pull state — dry-run-first, with destructive tiers gated behind explicit confirmation and a session-scoped destructive-command guard. Ecosystem targets are detected at runtime; secrets, runtime dependencies, and skill data are preserved by default.", "author": { "name": "Melodic Software", diff --git a/plugins/repo-hygiene/CHANGELOG.md b/plugins/repo-hygiene/CHANGELOG.md index 4b926b70bf..7acc2b9c3f 100644 --- a/plugins/repo-hygiene/CHANGELOG.md +++ b/plugins/repo-hygiene/CHANGELOG.md @@ -3,14 +3,14 @@ All notable changes to the `repo-hygiene` plugin are documented here. Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/); this plugin uses semantic versioning. -## [0.4.5] +## [0.4.6] ### Documentation - `skills/clean/scripts/lib/test-helpers.sh` now points at `docs/conventions/shell-test-helpers/README.md`, the repo's owner doc recording that per-plugin shell assert-helper duplication and per-script exit-code taxonomies are deliberate, not drift. No - behavior change. + behavior change. Version bumped past `#860`'s open `0.4.5` claim to avoid a collision. ## [0.4.4] From 617a4d98038a66a1fae08deb9b4761129b72ab84 Mon Sep 17 00:00:00 2001 From: Kyle Sexton <153232337+kyle-sexton@users.noreply.github.com> Date: Tue, 21 Jul 2026 13:33:49 -0400 Subject: [PATCH 4/6] fix: re-bump source-control past #840's rebased 0.15.10 claim MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit #840 rebased since this branch's last check and re-derived its own claim from 0.15.9 to 0.15.10, so this PR's prior 0.15.10 now collides exactly. Bump to 0.15.11 (one past #840's current live claim). claude-ops (0.17.3), work-items (0.19.1), repo-hygiene (0.4.6), and guardrails (0.9.6) were independently re-verified against current main and all live open PRs and remain correct — no change needed for those four. Co-Authored-By: Claude Sonnet 5 Claude-Session: https://claude.ai/code/session_01K1V3gkrfSf75isB8MiDy3o --- plugins/source-control/.claude-plugin/plugin.json | 2 +- plugins/source-control/CHANGELOG.md | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/plugins/source-control/.claude-plugin/plugin.json b/plugins/source-control/.claude-plugin/plugin.json index bb3d15fb6a..f45c4d173b 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.15.10", + "version": "0.15.11", "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, CI-log fetch), /babysit-prs (self-pacing fleet loop — safe by default; opt-in worker/autopilot tiers add gate-checked merge and thread resolution behind a deterministic Python engine), /worktree (create, status, cleanup, audit for parallel-session isolation), /setup (check the effective commit-subject / PR-title convention merged across its config layers and the babysit-prs config, or apply — interview the repo and write the convention config to a chosen layer), and /resolve-conflicts (intent-first merge/rebase conflict resolution with a semantic-conflict sweep — never --abort). The commit-subject / PR-title convention is configurable via a source-control.md config written by a re-runnable setup skill, layered across a ~/.claude user-global file, the tracked team file, and a gitignored .claude/source-control.local.md personal overlay merged per key; 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 9dce8af4e1..dbe8715fc3 100644 --- a/plugins/source-control/CHANGELOG.md +++ b/plugins/source-control/CHANGELOG.md @@ -3,14 +3,14 @@ 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.15.10] +## [0.15.11] ### Documentation - `scripts/test-helpers.sh` now points at `docs/conventions/shell-test-helpers/README.md`, the repo's owner doc recording that per-plugin shell assert-helper duplication and per-script exit-code - taxonomies are deliberate, not drift. No behavior change. Version bumped past `#840`'s open - `0.15.9` claim and `#860`'s `0.15.9` claim (merged) to avoid a collision. + taxonomies are deliberate, not drift. No behavior change. Version re-bumped past `#840`'s + current `0.15.10` claim (re-derived after `#860` merged) to avoid a collision. ## [0.15.9] From 7fd025842b68fa251847561f32cf7770cc3a834f Mon Sep 17 00:00:00 2001 From: Kyle Sexton <153232337+kyle-sexton@users.noreply.github.com> Date: Tue, 21 Jul 2026 14:01:33 -0400 Subject: [PATCH 5/6] fix: re-bump claude-ops and source-control past new live collisions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit claude-ops: #844 rebased and re-derived its claim from 0.17.2 to 0.17.4, colliding exactly with this branch's prior 0.17.4. Bump to 0.17.5. source-control: a new PR, #882 (fix/511-babysit-self-identity-decouple), claims 0.16.0 — a minor bump above this branch's prior 0.15.11 and above #840's 0.15.10. Bump to 0.16.1 to stay ahead of both. repo-hygiene (0.4.6), guardrails (0.9.6), and work-items (0.19.1) were re-verified fresh against current main and every live open PR (main: repo-hygiene 0.4.5, guardrails 0.9.5, work-items 0.19.0; #861 0.19.0) and remain correct, no change needed. Co-Authored-By: Claude Sonnet 5 Claude-Session: https://claude.ai/code/session_01K1V3gkrfSf75isB8MiDy3o --- plugins/claude-ops/.claude-plugin/plugin.json | 2 +- plugins/claude-ops/CHANGELOG.md | 6 +++--- plugins/source-control/.claude-plugin/plugin.json | 2 +- plugins/source-control/CHANGELOG.md | 6 +++--- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/plugins/claude-ops/.claude-plugin/plugin.json b/plugins/claude-ops/.claude-plugin/plugin.json index 2b86decb6f..1eb374050a 100644 --- a/plugins/claude-ops/.claude-plugin/plugin.json +++ b/plugins/claude-ops/.claude-plugin/plugin.json @@ -1,7 +1,7 @@ { "$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json", "name": "claude-ops", - "version": "0.17.4", + "version": "0.17.5", "description": "Claude Code operations toolkit. Seven skills: observability (read locally captured telemetry — OTEL store, collector, hook-event JSONL, ccusage — with trend reports and store pruning), known-issues (search known Claude product GitHub bugs, check service health, maintain a persistent tracked-issue registry), changelog (ingest Claude Code changelog entries and integrate them into the current repo), plugins (bring a machine's plugin fleet current on demand — marketplace refresh, effective-scope updates including in-repo project/local installs, new-plugin install per policy, scope-divergence detection and explicit convergence), morning-brief (read-only gh-based operator morning view — queue-label counts, merge-ready PRs, parked decisions with their RECOMMENDED lines, and loop-lane telemetry freshness), lanes (start/restart/stop/status loop lanes as named background Claude Code sessions seeded from canonical prompt files, with per-lane model/effort and a repo-pull + marketplace-refresh launch step), and a re-runnable setup action that settles where the known-issues registry lives. Plus a family of seven advisory *-audit telemetry-emitter hooks (API errors, config changes, instruction loads, permission denials, pre-compaction, skill usage, tool failures) that emit the shared hook-telemetry envelope, and a reference sink that maps envelopes into the hook-events.jsonl the observability skill reads.", "author": { "name": "Melodic Software", diff --git a/plugins/claude-ops/CHANGELOG.md b/plugins/claude-ops/CHANGELOG.md index 75e0d82ab5..5fd203e928 100644 --- a/plugins/claude-ops/CHANGELOG.md +++ b/plugins/claude-ops/CHANGELOG.md @@ -3,15 +3,15 @@ All notable changes to the `claude-ops` plugin are documented here. Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/); this plugin uses semantic versioning. -## [0.17.4] +## [0.17.5] ### Documentation - `hooks/claude-ops-test-helpers.sh` now points at `docs/conventions/shell-test-helpers/README.md`, the repo's owner doc recording that per-plugin shell assert-helper duplication and per-script exit-code taxonomies are deliberate, not drift. No - behavior change. Version bumped past `#877`'s `0.17.3` claim (merged) and `#844`'s open `0.17.2` - claim to avoid a collision. + behavior change. Version re-bumped past `#844`'s current `0.17.4` claim (re-derived after + `#877` merged) to avoid a collision. ## [0.17.3] diff --git a/plugins/source-control/.claude-plugin/plugin.json b/plugins/source-control/.claude-plugin/plugin.json index f45c4d173b..9ca1875a33 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.15.11", + "version": "0.16.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, CI-log fetch), /babysit-prs (self-pacing fleet loop — safe by default; opt-in worker/autopilot tiers add gate-checked merge and thread resolution behind a deterministic Python engine), /worktree (create, status, cleanup, audit for parallel-session isolation), /setup (check the effective commit-subject / PR-title convention merged across its config layers and the babysit-prs config, or apply — interview the repo and write the convention config to a chosen layer), and /resolve-conflicts (intent-first merge/rebase conflict resolution with a semantic-conflict sweep — never --abort). The commit-subject / PR-title convention is configurable via a source-control.md config written by a re-runnable setup skill, layered across a ~/.claude user-global file, the tracked team file, and a gitignored .claude/source-control.local.md personal overlay merged per key; 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 dbe8715fc3..c1cf2c0db6 100644 --- a/plugins/source-control/CHANGELOG.md +++ b/plugins/source-control/CHANGELOG.md @@ -3,14 +3,14 @@ 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.15.11] +## [0.16.1] ### Documentation - `scripts/test-helpers.sh` now points at `docs/conventions/shell-test-helpers/README.md`, the repo's owner doc recording that per-plugin shell assert-helper duplication and per-script exit-code - taxonomies are deliberate, not drift. No behavior change. Version re-bumped past `#840`'s - current `0.15.10` claim (re-derived after `#860` merged) to avoid a collision. + taxonomies are deliberate, not drift. No behavior change. Version re-bumped past `#882`'s open + `0.16.0` claim (also above `#840`'s `0.15.10`) to avoid a collision. ## [0.15.9] From b2e17c8f3727bb93aa224aaa51561ef73893a962 Mon Sep 17 00:00:00 2001 From: Kyle Sexton <153232337+kyle-sexton@users.noreply.github.com> Date: Sat, 25 Jul 2026 05:26:54 -0400 Subject: [PATCH 6/6] docs: correct exit-1 and make_sink claims in shell-test-helper convention remove-path.sh returns 1 both when the target is already absent and when an --apply leaves it present, so summarizing exit 1 as an existence check alone understated the operational failure the taxonomy is cited to justify. The guardrails and claude-ops make_sink helpers take different arguments (a stub body vs a capture file), so they are not near-identical bodies. --- docs/conventions/shell-test-helpers/README.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/docs/conventions/shell-test-helpers/README.md b/docs/conventions/shell-test-helpers/README.md index 17e651bc41..1feb5c2181 100644 --- a/docs/conventions/shell-test-helpers/README.md +++ b/docs/conventions/shell-test-helpers/README.md @@ -45,7 +45,10 @@ Plugin scripts document their own `Exit:` codes rather than sharing one enum, be encodes a different per-script contract, not an arbitrary numbering: - [`repo-hygiene/skills/clean/scripts/remove-path.sh`](../../../plugins/repo-hygiene/skills/clean/scripts/remove-path.sh) — - `0/1/2/3/4`: usage and existence checks plus two named blocking conditions (`blocked`, `unpushed`). + `0/1/2/3/4`: usage and existence checks plus two named blocking conditions (`blocked`, `unpushed`), + where `1` carries both meanings — the target was already absent, and an `--apply` that left the + target present (locked, in use, or crossing a mount) — so the caller retries or reports rather than + treating exit 1 as "nothing to do". - [`repo-hygiene/skills/clean/scripts/git-tree-reset-batch.sh`](../../../plugins/repo-hygiene/skills/clean/scripts/git-tree-reset-batch.sh) — `0/1/2` for the batch runner itself, forwarding a child's `5`/`7` (from [`git-tree-reset.sh`](../../../plugins/repo-hygiene/skills/clean/scripts/git-tree-reset.sh)'s own @@ -60,7 +63,8 @@ denominator or grow branching per caller — neither is simpler than each script ## Deferred, not rejected `guardrails-test-helpers.sh` and `claude-ops-test-helpers.sh` are the one pair above that already -share a shape closely (both hook-contract helpers with near-identical `ok`/`bad`/`make_sink` bodies). +share a shape closely (both hook-contract helpers with near-identical `ok`/`bad` bodies; their +`make_sink` differs in contract — guardrails' takes a stub body, claude-ops' takes a capture file). If they converge to byte-identical, vendoring just that pair through the existing `lib/`, `sync-*.sh`, and registry mechanism — the same pattern `hook-utils.sh` already uses — is the smaller, precedented move, revisited then rather than spread across all five plugins now.