ship-finish
Use when a feature has been verified and needs to be completed — creates PR, merges locally, or keeps branch
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
القائمة
Use when a feature has been verified and needs to be completed — creates PR, merges locally, or keeps branch
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
استنادا إلى تصنيف SOC المهني
Use when a feature plan has been verified and is ready for implementation — executes tasks with atomic commits
Use when you want to auto-run all remaining Ship steps for a feature without manual step-by-step invocation
Use when a feature has been brainstormed and needs a detailed implementation plan with tasks
Use when a brainstormed feature needs architectural decisions — presents 2-3 approaches for user to choose before planning
Use when a plan has been created and needs independent verification against codebase patterns before building
Use when beginning new feature work, adding functionality, or fixing a bug — runs intensive brainstorming to capture requirements before planning
| name | ship:finish |
| description | Use when a feature has been verified and needs to be completed — creates PR, merges locally, or keeps branch |
| effort | medium |
| allowed-tools | Read, Bash, Glob, AskUserQuestion |
| argument-hint | [feature-name] [--accept-inconclusive "reason"] |
Finish the active feature after verification passes.
Parse $ARGUMENTS (a single string) into two components:
--accept-inconclusive "reason" — if this flag appears anywhere in the string, set ACCEPT_INCONCLUSIVE = true and extract the quoted reason text (everything between the matching "s after the flag).If --accept-inconclusive appears WITHOUT a quoted reason, abort and tell the user: --accept-inconclusive requires a non-empty reason in quotes. Example: /ship:finish my-feature --accept-inconclusive "manually verified end-to-end on staging".
If ACCEPT_INCONCLUSIVE = false, behave as before.
Feature state is injected by hooks at session start and after compaction — check conversation context for "SHIP ACTIVE FEATURES" or "SHIP FEATURE STATE" blocks first.
$ARGUMENTS is provided, use it as the feature namedone.planning/features/*/CONTEXT.mdRead .planning/features/{name}/VERIFY.md. Search for any of:
status: INCONCLUSIVE in the frontmatter, ORINCONCLUSIVE.If found:
ACCEPT_INCONCLUSIVE = false: Display:
Cannot finish — VERIFY.md contains INCONCLUSIVE verdicts:
{list each INCONCLUSIVE criterion}
Options:
1. Add runnable <verify> commands to PLAN.md for the inconclusive criteria, then re-run /ship:verify.
2. Override with: /ship:finish {name} --accept-inconclusive "reason for manual acceptance"
Stop. Do not proceed to Prerequisites.ACCEPT_INCONCLUSIVE = true: Append the override record to VERIFY.md's ## Inconclusive Override section:
Override applied: yesReason: {the reason text}Operator: $(git config user.email || echo unknown)Timestamp: $(date -u +%Y-%m-%dT%H:%M:%SZ)
Then continue to Prerequisites.If VERIFY.md has no INCONCLUSIVE markers, proceed directly to Prerequisites.
Run the project's test suite to confirm everything passes:
# Auto-detect test command from package.json, Cargo.toml, etc.
# If unclear, ask the user for the test command
If tests fail, stop and report failures. Do not proceed.
Feature '{name}' is verified and complete.
1. Create a Pull Request (push branch + gh pr create)
2. Merge to {base-branch} locally
3. Keep as-is (I'll handle it later)
Which option?
Use AskUserQuestion to get the user's choice.
First, check that gh is available: gh auth status. If it fails, tell the user to install/authenticate gh and abort.
# Detect base branch
git rev-parse --verify main &>/dev/null && echo main || echo master
# Determine PR title type from branch commits
# Look at commit prefixes (feat, fix, refactor, etc.) — use the most common one
# If mixed or unclear, default to "feat"
# Get feature summary from CONTEXT.md for PR body
# Push and create PR
git push -u origin HEAD
gh pr create --title "{type}: {feature-name}" --body "$(cat <<'EOF'
## Summary
{2-3 bullets from CONTEXT.md acceptance criteria}
## Test plan
{key verify commands from PLAN.md}
Built with [Ship](https://github.com/dilhanz/ship)
EOF
)"
Report the PR URL to the user.
# Detect base branch
BASE=$(git rev-parse --verify main &>/dev/null && echo main || echo master)
git checkout $BASE
git merge {feature-branch}
Run tests again on the merged result. If tests pass, report success.
Report: "Feature '{name}' kept on current branch. Run /ship:finish again when ready."
Do NOT archive the feature directory for this option.
After Option 1 or Option 2 completes successfully, move the feature directory to the archive:
mkdir -p .planning/archive
mv .planning/features/{feature-name} .planning/archive/{feature-name}
This preserves the full history (CONTEXT.md, PLAN.md, VERIFY.md) while keeping .planning/features/ clean for active work.
## FEATURE FINISHED
Feature: {name}
Action: {PR created / Merged to main / Kept as-is}
{If PR:} PR: {url}
{If merged:} Branch merged and tests passing
Archived: .planning/archive/{name}
$ARGUMENTS