From 05aa1b4294dd69403ee6016748c96f9be944e48e Mon Sep 17 00:00:00 2001 From: Steve Manicdote Date: Wed, 22 Jul 2026 17:35:24 -0700 Subject: [PATCH] chore(release): 0.7.0 Roll the Unreleased changelog into 0.7.0 and bump all six plugins in lockstep (0.6.0 -> 0.7.0). Minor: every change since 0.6.0 is backward-compatible and additive -- hull's licence-free trufflehog scanner, rigging driving pnpm/yarn/bun, rigging's custom testCommand, a suite-wide propose_config round-trip property test (which fixed a latent TypeError contract break), and the inverted rigging refusal table. README Status updated: rigging no longer refuses pnpm/yarn/bun repos -- it drives them. Co-Authored-By: Claude Opus 4.8 --- CHANGELOG.md | 2 ++ README.md | 15 +++++++++------ plugins/ballast/.claude-plugin/plugin.json | 2 +- plugins/ballast/ballast/__init__.py | 2 +- plugins/ballast/tests/test_smoke.py | 4 ++-- plugins/ballast/tests/test_stacks.py | 2 +- plugins/bosun/.claude-plugin/plugin.json | 2 +- plugins/bosun/bosun/__init__.py | 2 +- plugins/bosun/tests/test_smoke.py | 4 ++-- plugins/hull/.claude-plugin/plugin.json | 2 +- plugins/hull/hull/__init__.py | 2 +- plugins/hull/tests/test_smoke.py | 4 ++-- plugins/keel/.claude-plugin/plugin.json | 2 +- plugins/keel/keel/__init__.py | 2 +- plugins/keel/tests/test_smoke.py | 2 +- plugins/rigging/.claude-plugin/plugin.json | 2 +- plugins/rigging/rigging/__init__.py | 2 +- plugins/rigging/tests/test_smoke.py | 4 ++-- plugins/rigging/tests/test_stacks.py | 2 +- plugins/stow/.claude-plugin/plugin.json | 2 +- plugins/stow/stow/__init__.py | 2 +- plugins/stow/tests/test_smoke.py | 4 ++-- plugins/stow/tests/test_stacks.py | 2 +- 23 files changed, 37 insertions(+), 32 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 64afdb2..b6b0b58 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,8 @@ and could stop an installed copy from updating. ## [Unreleased] +## [0.7.0] - 2026-07-22 + ### Added - **A secret scanner that needs no license.** `.hull.json`'s `scanner` now diff --git a/README.md b/README.md index ebde369..d44d14d 100644 --- a/README.md +++ b/README.md @@ -325,14 +325,17 @@ other change. ## Status -**v0.6.0.** All six plugins have shipped and version in lockstep. Everything +**v0.7.0.** All six plugins have shipped and version in lockstep. Everything before 0.3.0 was pre-release; see the [CHANGELOG](CHANGELOG.md). -Three `init` skills now **refuse to scaffold** rather than render an artifact -that cannot work in the target repo: `hull:init` in an organization-owned repo -with no scanner license, and `rigging:init` in a repo driven by pnpm, yarn, or -bun. Both say why, and both are a change from 0.5.1, which produced files in -those cases. +`rigging` now drives pnpm, yarn (both majors), and bun — not just npm — and +takes a custom `testCommand` when a repo's real test command isn't the default. +`hull` adds a license-free `trufflehog` scanner alongside `gitleaks`. Two `init` +skills still **refuse to scaffold** rather than render an artifact that cannot +work: `hull:init` in an organization-owned repo with no scanner license, and +`rigging:init` when a JavaScript toolchain is genuinely undeterminable (an +ambiguous Yarn major, or two package-manager lockfiles at the root). Both say +why. Each plugin's `init` skill scaffolds its config and renders its artifact, never overwriting a file that already exists: diff --git a/plugins/ballast/.claude-plugin/plugin.json b/plugins/ballast/.claude-plugin/plugin.json index 35abe6e..8700c61 100644 --- a/plugins/ballast/.claude-plugin/plugin.json +++ b/plugins/ballast/.claude-plugin/plugin.json @@ -1,7 +1,7 @@ { "name": "ballast", "displayName": "ballast", - "version": "0.6.0", + "version": "0.7.0", "description": "Configures the pytest runner: renders pytest.ini from .ballast.json so tests resolve and collect correctly.", "license": "MIT", "keywords": [ diff --git a/plugins/ballast/ballast/__init__.py b/plugins/ballast/ballast/__init__.py index 906d362..49e0fc1 100644 --- a/plugins/ballast/ballast/__init__.py +++ b/plugins/ballast/ballast/__init__.py @@ -1 +1 @@ -__version__ = "0.6.0" +__version__ = "0.7.0" diff --git a/plugins/ballast/tests/test_smoke.py b/plugins/ballast/tests/test_smoke.py index 8aebf72..c1c394c 100644 --- a/plugins/ballast/tests/test_smoke.py +++ b/plugins/ballast/tests/test_smoke.py @@ -13,13 +13,13 @@ def test_package_imports(): import ballast - assert ballast.__version__ == "0.6.0" + assert ballast.__version__ == "0.7.0" def test_plugin_json_parses_and_names_ballast(): plugin = json.loads((PLUGIN_ROOT / ".claude-plugin" / "plugin.json").read_text()) assert plugin["name"] == "ballast" - assert plugin["version"] == "0.6.0" + assert plugin["version"] == "0.7.0" def test_marketplace_lists_ballast(): diff --git a/plugins/ballast/tests/test_stacks.py b/plugins/ballast/tests/test_stacks.py index 0f79c3d..c6564ad 100644 --- a/plugins/ballast/tests/test_stacks.py +++ b/plugins/ballast/tests/test_stacks.py @@ -6,7 +6,7 @@ def test_ballast_version(): import ballast - assert ballast.__version__ == "0.6.0" + assert ballast.__version__ == "0.7.0" def test_registry_keys(): diff --git a/plugins/bosun/.claude-plugin/plugin.json b/plugins/bosun/.claude-plugin/plugin.json index ddd6174..52b31da 100644 --- a/plugins/bosun/.claude-plugin/plugin.json +++ b/plugins/bosun/.claude-plugin/plugin.json @@ -1,7 +1,7 @@ { "name": "bosun", "displayName": "bosun", - "version": "0.6.0", + "version": "0.7.0", "description": "Authors a Dependabot config (.github/dependabot.yml) to keep a repo's dependencies updated.", "license": "MIT", "keywords": [ diff --git a/plugins/bosun/bosun/__init__.py b/plugins/bosun/bosun/__init__.py index 906d362..49e0fc1 100644 --- a/plugins/bosun/bosun/__init__.py +++ b/plugins/bosun/bosun/__init__.py @@ -1 +1 @@ -__version__ = "0.6.0" +__version__ = "0.7.0" diff --git a/plugins/bosun/tests/test_smoke.py b/plugins/bosun/tests/test_smoke.py index 12cba15..5bdeedf 100644 --- a/plugins/bosun/tests/test_smoke.py +++ b/plugins/bosun/tests/test_smoke.py @@ -13,13 +13,13 @@ def test_package_imports(): import bosun - assert bosun.__version__ == "0.6.0" + assert bosun.__version__ == "0.7.0" def test_plugin_json_parses_and_names_bosun(): plugin = json.loads((PLUGIN_ROOT / ".claude-plugin" / "plugin.json").read_text()) assert plugin["name"] == "bosun" - assert plugin["version"] == "0.6.0" + assert plugin["version"] == "0.7.0" def test_marketplace_lists_bosun(): diff --git a/plugins/hull/.claude-plugin/plugin.json b/plugins/hull/.claude-plugin/plugin.json index 867411f..fb20b60 100644 --- a/plugins/hull/.claude-plugin/plugin.json +++ b/plugins/hull/.claude-plugin/plugin.json @@ -1,7 +1,7 @@ { "name": "hull", "displayName": "hull", - "version": "0.6.0", + "version": "0.7.0", "description": "Authors a secret-scanning CI workflow (gitleaks or trufflehog) for a repo.", "license": "MIT", "keywords": [ diff --git a/plugins/hull/hull/__init__.py b/plugins/hull/hull/__init__.py index 906d362..49e0fc1 100644 --- a/plugins/hull/hull/__init__.py +++ b/plugins/hull/hull/__init__.py @@ -1 +1 @@ -__version__ = "0.6.0" +__version__ = "0.7.0" diff --git a/plugins/hull/tests/test_smoke.py b/plugins/hull/tests/test_smoke.py index 0c27d40..4786cd1 100644 --- a/plugins/hull/tests/test_smoke.py +++ b/plugins/hull/tests/test_smoke.py @@ -13,13 +13,13 @@ def test_package_imports(): import hull - assert hull.__version__ == "0.6.0" + assert hull.__version__ == "0.7.0" def test_plugin_json_parses_and_names_hull(): plugin = json.loads((PLUGIN_ROOT / ".claude-plugin" / "plugin.json").read_text()) assert plugin["name"] == "hull" - assert plugin["version"] == "0.6.0" + assert plugin["version"] == "0.7.0" def test_marketplace_lists_hull(): diff --git a/plugins/keel/.claude-plugin/plugin.json b/plugins/keel/.claude-plugin/plugin.json index 3e53555..a5c4048 100644 --- a/plugins/keel/.claude-plugin/plugin.json +++ b/plugins/keel/.claude-plugin/plugin.json @@ -1,7 +1,7 @@ { "name": "keel", "displayName": "keel", - "version": "0.6.0", + "version": "0.7.0", "description": "Guides a project's git lifecycle: start work, land it, ship it.", "license": "MIT", "keywords": [ diff --git a/plugins/keel/keel/__init__.py b/plugins/keel/keel/__init__.py index 906d362..49e0fc1 100644 --- a/plugins/keel/keel/__init__.py +++ b/plugins/keel/keel/__init__.py @@ -1 +1 @@ -__version__ = "0.6.0" +__version__ = "0.7.0" diff --git a/plugins/keel/tests/test_smoke.py b/plugins/keel/tests/test_smoke.py index 058381d..e66c7d2 100644 --- a/plugins/keel/tests/test_smoke.py +++ b/plugins/keel/tests/test_smoke.py @@ -18,7 +18,7 @@ REPO = Path(__file__).resolve().parents[3] PLUGIN_ROOT = Path(__file__).resolve().parents[1] -VERSION = "0.6.0" +VERSION = "0.7.0" #: Every skill keel ships. Listed explicitly rather than globbed so that #: deleting a skill fails here instead of silently shrinking what's diff --git a/plugins/rigging/.claude-plugin/plugin.json b/plugins/rigging/.claude-plugin/plugin.json index bd7d066..a462832 100644 --- a/plugins/rigging/.claude-plugin/plugin.json +++ b/plugins/rigging/.claude-plugin/plugin.json @@ -1,7 +1,7 @@ { "name": "rigging", "displayName": "rigging", - "version": "0.6.0", + "version": "0.7.0", "description": "Authors CI pipelines: detects a repo's stack and scaffolds a safe GitHub Actions workflow.", "license": "MIT", "keywords": [ diff --git a/plugins/rigging/rigging/__init__.py b/plugins/rigging/rigging/__init__.py index 906d362..49e0fc1 100644 --- a/plugins/rigging/rigging/__init__.py +++ b/plugins/rigging/rigging/__init__.py @@ -1 +1 @@ -__version__ = "0.6.0" +__version__ = "0.7.0" diff --git a/plugins/rigging/tests/test_smoke.py b/plugins/rigging/tests/test_smoke.py index 8d9572b..174492f 100644 --- a/plugins/rigging/tests/test_smoke.py +++ b/plugins/rigging/tests/test_smoke.py @@ -13,13 +13,13 @@ def test_package_imports(): import rigging - assert rigging.__version__ == "0.6.0" + assert rigging.__version__ == "0.7.0" def test_plugin_json_parses_and_names_rigging(): plugin = json.loads((PLUGIN_ROOT / ".claude-plugin" / "plugin.json").read_text()) assert plugin["name"] == "rigging" - assert plugin["version"] == "0.6.0" + assert plugin["version"] == "0.7.0" def test_marketplace_lists_rigging(): diff --git a/plugins/rigging/tests/test_stacks.py b/plugins/rigging/tests/test_stacks.py index b0a6b78..cf6f782 100644 --- a/plugins/rigging/tests/test_stacks.py +++ b/plugins/rigging/tests/test_stacks.py @@ -7,7 +7,7 @@ def test_rigging_version(): import rigging - assert rigging.__version__ == "0.6.0" + assert rigging.__version__ == "0.7.0" def test_registry_keys(): diff --git a/plugins/stow/.claude-plugin/plugin.json b/plugins/stow/.claude-plugin/plugin.json index 26df987..a2cff23 100644 --- a/plugins/stow/.claude-plugin/plugin.json +++ b/plugins/stow/.claude-plugin/plugin.json @@ -1,7 +1,7 @@ { "name": "stow", "displayName": "stow", - "version": "0.6.0", + "version": "0.7.0", "description": "Outfits a repo's baseline files: manages .gitignore sections per detected stack, updatable in place.", "license": "MIT", "keywords": [ diff --git a/plugins/stow/stow/__init__.py b/plugins/stow/stow/__init__.py index 906d362..49e0fc1 100644 --- a/plugins/stow/stow/__init__.py +++ b/plugins/stow/stow/__init__.py @@ -1 +1 @@ -__version__ = "0.6.0" +__version__ = "0.7.0" diff --git a/plugins/stow/tests/test_smoke.py b/plugins/stow/tests/test_smoke.py index 16be35c..0828828 100644 --- a/plugins/stow/tests/test_smoke.py +++ b/plugins/stow/tests/test_smoke.py @@ -13,13 +13,13 @@ def test_package_imports(): import stow - assert stow.__version__ == "0.6.0" + assert stow.__version__ == "0.7.0" def test_plugin_json_parses_and_names_stow(): plugin = json.loads((PLUGIN_ROOT / ".claude-plugin" / "plugin.json").read_text()) assert plugin["name"] == "stow" - assert plugin["version"] == "0.6.0" + assert plugin["version"] == "0.7.0" def test_marketplace_lists_stow(): diff --git a/plugins/stow/tests/test_stacks.py b/plugins/stow/tests/test_stacks.py index 7d40d9a..bcbc136 100644 --- a/plugins/stow/tests/test_stacks.py +++ b/plugins/stow/tests/test_stacks.py @@ -9,7 +9,7 @@ def test_stow_version(): import stow - assert stow.__version__ == "0.6.0" + assert stow.__version__ == "0.7.0" def test_registry_keys():