Skip to content

feat(ship): add ship as a standalone plugin - #11

Merged
crodris merged 5 commits into
mainfrom
feat/ship-skill
Aug 9, 2026
Merged

feat(ship): add ship as a standalone plugin#11
crodris merged 5 commits into
mainfrom
feat/ship-skill

Conversation

@crodris

@crodris crodris commented Aug 9, 2026

Copy link
Copy Markdown
Owner

Summary

Adds ship as a second plugin in this marketplace, alongside fathom, and makes the packaging support both.

The skill carries the current branch from working tree to merged release. What is new relative to the personal copy it replaces is stage 0: it resolves the project's own pipeline before touching anything - verify command, review command, base, branch and worktree conventions, release mechanism, post-merge command, and any PR-creation hook - from .ship/config.md, then the project's docs, then a declared aggregate task, then the pull-request CI job, then a composed fallback. The first tier that answers wins. Ambiguity produces exactly one question before the tree is touched, and the answer is recorded in .ship/config.md as its own commit so the next branch, clone, and teammate inherit it.

Packaging

marketplace.json now defines two plugins sharing the flat skills/ directory, each scoped by its own skills array:

Plugin Skills Needs
fathom execute, scaffold, fathom-shared a tracker MCP
ship ship a git repo with a remote

.claude-plugin/plugin.json is removed. With source: "./" a single root manifest applies to every entry and its version silently overrides each entry's own - claude plugin validate reports exactly that. bin/sync-versions.sh therefore treats marketplace.json as the version source of truth, and additionally fails when a skill directory is claimed by no plugin, by more than one, or is claimed but missing: a scoped entry replaces the default skills/ scan, so an unlisted skill would silently install for nobody.

npx skills add crod951/skills is unaffected - it walks skills/ to depth three regardless of plugin ownership.

Verification

  • bin/scan-skills.sh - all 4 skills clean (ship carries 3 documented AS3 suppressions for its project-local precedence check)
  • bin/sync-versions.sh - clean; negative-tested by planting an unclaimed skill directory (correctly exits 1)
  • claude plugin validate . --strict - passes
  • Install proven end to end: published to a throwaway local marketplace, installed ship, and asked a headless session which skills it could see - SHIP=yes, EXECUTE=no, SCAFFOLD=no, FATHOMSHARED=no. Scoping works even though the plugin cache contains all four directories. Test marketplace and plugin removed afterwards.

Review

Nine rounds of coderabbit review --agent against main, verify green in every round. Confirmed critical/major findings fixed, including several that were defects in text written earlier in the same session:

  • settled branch could equal base - preflight keyed its migration to "the default branch" while stage 0 resolves a base that may differ, so a project shipping into a release branch would open a PR against itself. Now keyed to base with an explicit settled != base assertion.
  • merge was not SHA-pinned - a push landing between the settled review and the merge shipped code no gate had seen. Now re-reads PR state and merges with --match-head-commit.
  • gh pr create without --title/--body - drops into an interactive prompt that hangs an unattended run.
  • $expected compared but never defined in the push guard; refs now quoted and validated with git check-ref-format --branch.
  • release watch treated a landed release commit as success - a job can push the commit and then fail on publish or tag. Now requires the run to reach a successful terminal state.
  • .ship/config.md write followed symlinks out of the repository; path is now resolved against the repo root and refused if it escapes.
  • cleanup could delete unrelated branches and worktrees, and checked out base inside the worktree it was about to remove.
  • unbounded loops - stage 1 rounds, gate timeouts, and stage 3 polling all bounded.

Dispositioned, not fixed

  • "Remove repository-local skill discovery" (raised 8 times) - that is the requested feature: a repo with its own .claude/skills/ship/SKILL.md keeps its specialized pipeline. The injection concern is addressed instead by scoping authority: a local file decides every stage, command, and convention, but cannot relax the Authority and boundary section.
  • "Snapshot the worktree and fail if verify mutates tracked files" (raised twice) - every build writes output; the rule constrains what the agent does with results, not what the command may touch. Clarified in the text instead.
  • "Drop --delete-branch unless the run created the branch" (raised twice) - deleting a merged branch is the intended outcome. The genuine half (it fails while a worktree holds the branch) was fixed: worktree runs leave both deletions to cleanup.
  • Speculative hardening - resolving a non-origin remote name, ignored files omitted by git stash --include-untracked, intent-to-add entries dirtying the worktree, isolating skillspector report artifacts. Real but not defects in any run this repo will make.

Stage 1 was exited by judgment rather than on a no-fix round: findings ran 8 → 9 → 8 → 3 → 6 → 3 → 6 → 14 on a document that grew 113 → 299 lines, with each added guard creating fresh surface. Verify stayed green throughout. CodeRabbit on this PR is the final bar.

Follow-ups

  • feat/stacked-reviews bumps fathom to 2.2.0 in the plugin.json this PR deletes. Merge that branch first, then set fathom's marketplace entry to 2.2.0 here.
  • After /plugin install ship@crod951, delete the personal copy (~/.claude/skills/ship, ~/.agents/skills/ship) or two skills named ship will both be live.

Summary by CodeRabbit

  • New Features

    • Added the ship plugin with an end-to-end workflow for reviewing, verifying, merging, and releasing changes.
    • Added support for installing independent fathom and ship plugins or selecting individual agent skills.
    • Added safeguards for branch handling, reviews, verification, release monitoring, and cleanup.
  • Documentation

    • Expanded installation, prerequisites, skill selection, and release process guidance.
  • Chores

    • Improved version synchronization and validation.
    • Added worktree exclusions and skill-scan baseline configuration.

@coderabbitai

coderabbitai Bot commented Aug 9, 2026

Copy link
Copy Markdown

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 25e2614c-10ac-4c60-b933-7062f0a3bf18

📥 Commits

Reviewing files that changed from the base of the PR and between eda789f and b97a9ea.

📒 Files selected for processing (1)
  • skills/ship/SKILL.md

📝 Walkthrough

Walkthrough

The change adds the ship plugin and skill, updates marketplace metadata, moves version synchronization to marketplace.json, validates skill ownership, and documents installation and release workflows.

Changes

Ship plugin integration

Layer / File(s) Summary
Plugin manifests and ship workflow
.claude-plugin/marketplace.json, skills/ship/SKILL.md
The marketplace declares updated Fathom metadata and a new ship plugin. The ship skill defines pipeline resolution, preflight, review, verification, pull request, merge, release, cleanup, and stop conditions.
Pipeline resolution and marketplace validation
.ship/config.md, bin/sync-versions.sh
The pipeline profile defines verification commands and branch settings. Version synchronization reads marketplace entries, validates skill claims, and fails when problems are detected.
Installation and release documentation
README.md
The README documents independent plugin installation, prerequisites, ship usage, verification gates, and release workflow integration.
Worktree and skill inspection support
.gitignore, .skillspector-baseline.yaml
The repository ignores branch worktrees and records an AS3 suppression for the ship skill path.

Estimated code review effort: 4 (Complex) | ~45 minutes

Sequence Diagram(s)

sequenceDiagram
  participant ShipSkill as ship skill
  participant PipelineConfig as .ship/config.md
  participant Verification as verification commands
  participant GitHubCLI as GitHub CLI
  ShipSkill->>PipelineConfig: resolve pipeline settings
  PipelineConfig->>Verification: run configured checks
  ShipSkill->>GitHubCLI: create and monitor pull request
  GitHubCLI-->>ShipSkill: return review and release status
Loading

Possibly related PRs

  • crod951/skills#5: Adds a related plugin marketplace structure and repository-local release workflow.
  • crod951/skills#6: Updates related marketplace, synchronization, baseline, and documentation files.
  • crod951/skills#8: Modifies related marketplace and plugin metadata.
🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly and concisely describes the primary change: adding ship as a standalone plugin.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/ship-skill

Comment @coderabbitai help to get the list of available commands.

crodris added 2 commits August 8, 2026 18:31
Detection alone finds only bin/scan-skills.sh, the one command the README
names as a pre-commit gate. bin/sync-versions.sh is just as much a gate: it
fails when a skill directory is claimed by no plugin entry, by more than one,
or is claimed but missing. Record both so the next run does not rediscover a
partial answer.
Ship carries the current branch from working tree to merged release. It
resolves the project's own pipeline in stage 0 - verify command, base,
branch and worktree conventions, release mechanism, post-merge command,
and any PR-creation hook - from .ship/config.md, then the project's docs,
then a declared aggregate task, then the pull-request CI job, then a
composed fallback. Ambiguity produces one question before the tree is
touched, and the answer is recorded in .ship/config.md as its own commit.

Packaging: marketplace.json now defines two plugins that share the flat
skills/ directory, each scoping itself with a "skills" array. fathom keeps
execute, scaffold, and fathom-shared; ship takes skills/ship. The root
plugin.json is removed because with source "./" one root manifest applies
to every entry and its version silently overrides each entry's own, which
`claude plugin validate` reports. sync-versions.sh therefore reads
marketplace.json as the source of truth and additionally fails when a skill
directory is claimed by no plugin, by more than one, or is claimed but
missing - a scoped entry replaces the default scan, so an unlisted skill
would otherwise install for nobody.

npx skills add is unaffected: it walks skills/ to depth three regardless of
which plugin owns what, so both install paths keep working.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@README.md`:
- Line 115: Update the “Asks once, remembers” README description to remove the
claim that `.ship/config.md` never appears in the review diff, while preserving
that the file is recorded and committed separately on the shipping feature
branch.

In `@skills/ship/SKILL.md`:
- Around line 13-17: Remove the repository-local skill discovery and delegation
instructions from the opening workflow in SKILL.md. Replace them with a
declarative repository configuration approach that this skill validates under
the existing Stage 0 safety restrictions, without allowing local configuration
to expand authority or permissions.
- Line 231: Update the stage-0 pr-hook flow so the hook returns both the merged
pull request and merge SHA, while limiting its authority to review and merge.
After the hook completes, always continue through the existing release
monitoring and cleanup steps, using the returned values for those steps.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 4fb5944d-b054-47eb-9325-83794c031960

📥 Commits

Reviewing files that changed from the base of the PR and between b10a899 and 3f510ea.

📒 Files selected for processing (8)
  • .claude-plugin/marketplace.json
  • .claude-plugin/plugin.json
  • .gitignore
  • .ship/config.md
  • .skillspector-baseline.yaml
  • README.md
  • bin/sync-versions.sh
  • skills/ship/SKILL.md
💤 Files with no reviewable changes (1)
  • .claude-plugin/plugin.json

Comment thread README.md Outdated
Comment thread skills/ship/SKILL.md
Comment thread skills/ship/SKILL.md
crodris added 2 commits August 8, 2026 18:41
…-commit claim

A pr-hook replaces stage 3's review and merge steps, including the one that
records the merge commit SHA. The release watch follows the run whose head is
that SHA, so a hook that merges without reporting one leaves the watch with no
run to follow; require it back, and recover it from the pull request when it is
missing.

The README also claimed the .ship/config.md commit keeps the file out of the
diff under review. Its own commit keeps it separable from the change, but the
file is still part of the pull request and still reviewed.
…peline

Precedence let a repository-local ship skill decide every stage, and the
executable-command restrictions lived in stage 0. A local pipeline could
therefore replace stage 0 and drop the credential, write-outside-repo,
privilege-escalation, and network checks while still honouring the branch,
force-push, history, and gate rules it was told it could not relax.

Move those restrictions into Authority and boundary, where they apply to
every command the run executes whoever resolved it, and say why they live
there. Stage 0 now references the rule instead of owning it.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@skills/ship/SKILL.md`:
- Around line 31-34: Update the command-boundary rule to narrowly permit Git and
forge operations required for the current branch and pull request, including
fetch, push, pull-request API, merge, and release-monitoring commands, while
retaining restrictions on credentials, privilege escalation, outside-repository
writes, and unrelated network access. In the executable-slot coverage around the
stage command rules, include release alongside the existing build, lint,
type-check, test, review, and tidy categories.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: eebc26ce-a081-402f-bdcb-25b090f45e81

📥 Commits

Reviewing files that changed from the base of the PR and between 65b6f56 and eda789f.

📒 Files selected for processing (1)
  • skills/ship/SKILL.md

Comment thread skills/ship/SKILL.md
The immutable command shape added in the previous commit reads literally
enough to forbid git fetch, git push, and the pull-request calls the skill
itself makes, which would stop a run before it ever opened a review.

Carve out those operations, scoped to the shipping branch and its own pull
request, and grant nothing else: credentials, privilege escalation, writes
outside the repository, and unrelated network access stay blocked. Also
cover the release slot in stage 0's list of executable slots.
@crodris
crodris merged commit 7c0e6b8 into main Aug 9, 2026
3 checks passed
@crodris
crodris deleted the feat/ship-skill branch August 9, 2026 02:03
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant