Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
15 changes: 9 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
2 changes: 1 addition & 1 deletion plugins/ballast/.claude-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -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": [
Expand Down
2 changes: 1 addition & 1 deletion plugins/ballast/ballast/__init__.py
Original file line number Diff line number Diff line change
@@ -1 +1 @@
__version__ = "0.6.0"
__version__ = "0.7.0"
4 changes: 2 additions & 2 deletions plugins/ballast/tests/test_smoke.py
Original file line number Diff line number Diff line change
Expand Up @@ -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():
Expand Down
2 changes: 1 addition & 1 deletion plugins/ballast/tests/test_stacks.py
Original file line number Diff line number Diff line change
Expand Up @@ -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():
Expand Down
2 changes: 1 addition & 1 deletion plugins/bosun/.claude-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -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": [
Expand Down
2 changes: 1 addition & 1 deletion plugins/bosun/bosun/__init__.py
Original file line number Diff line number Diff line change
@@ -1 +1 @@
__version__ = "0.6.0"
__version__ = "0.7.0"
4 changes: 2 additions & 2 deletions plugins/bosun/tests/test_smoke.py
Original file line number Diff line number Diff line change
Expand Up @@ -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():
Expand Down
2 changes: 1 addition & 1 deletion plugins/hull/.claude-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -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": [
Expand Down
2 changes: 1 addition & 1 deletion plugins/hull/hull/__init__.py
Original file line number Diff line number Diff line change
@@ -1 +1 @@
__version__ = "0.6.0"
__version__ = "0.7.0"
4 changes: 2 additions & 2 deletions plugins/hull/tests/test_smoke.py
Original file line number Diff line number Diff line change
Expand Up @@ -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():
Expand Down
2 changes: 1 addition & 1 deletion plugins/keel/.claude-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -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": [
Expand Down
2 changes: 1 addition & 1 deletion plugins/keel/keel/__init__.py
Original file line number Diff line number Diff line change
@@ -1 +1 @@
__version__ = "0.6.0"
__version__ = "0.7.0"
2 changes: 1 addition & 1 deletion plugins/keel/tests/test_smoke.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion plugins/rigging/.claude-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -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": [
Expand Down
2 changes: 1 addition & 1 deletion plugins/rigging/rigging/__init__.py
Original file line number Diff line number Diff line change
@@ -1 +1 @@
__version__ = "0.6.0"
__version__ = "0.7.0"
4 changes: 2 additions & 2 deletions plugins/rigging/tests/test_smoke.py
Original file line number Diff line number Diff line change
Expand Up @@ -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():
Expand Down
2 changes: 1 addition & 1 deletion plugins/rigging/tests/test_stacks.py
Original file line number Diff line number Diff line change
Expand Up @@ -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():
Expand Down
2 changes: 1 addition & 1 deletion plugins/stow/.claude-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -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": [
Expand Down
2 changes: 1 addition & 1 deletion plugins/stow/stow/__init__.py
Original file line number Diff line number Diff line change
@@ -1 +1 @@
__version__ = "0.6.0"
__version__ = "0.7.0"
4 changes: 2 additions & 2 deletions plugins/stow/tests/test_smoke.py
Original file line number Diff line number Diff line change
Expand Up @@ -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():
Expand Down
2 changes: 1 addition & 1 deletion plugins/stow/tests/test_stacks.py
Original file line number Diff line number Diff line change
Expand Up @@ -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():
Expand Down