From arn-code
This skill should be used when the user says "ship it", "arness code ship", "create PR", "open pull request", "push and PR", "commit and push", "wrap up", "ship the feature", "ship the fix", "ready to ship", "push changes", "finalize", "finish up", or wants to commit, push, and optionally open a pull request. Guides through branching, staging, committing with meaningful messages, pushing, and PR creation. Works standalone or as the final Arness pipeline step. Do NOT use this for reviewing PRs — use /arn-code-review-pr for that.
npx claudepluginhub appsvortex/arness --plugin arn-codeThis skill uses the workspace's default tool permissions.
Searches, retrieves, and installs Agent Skills from prompts.chat registry using MCP tools like search_skills and get_skill. Activates for finding skills, browsing catalogs, or extending Claude.
Searches prompts.chat for AI prompt templates by keyword or category, retrieves by ID with variable handling, and improves prompts via AI. Use for discovering or enhancing prompts.
Compares coding agents like Claude Code and Aider on custom YAML-defined codebase tasks using git worktrees, measuring pass rate, cost, time, and consistency.
Guides through branching, staging, committing, pushing, and optionally opening a pull request. Works standalone or as the final step in the Arness pipeline.
Pipeline position:
arn-code-review-implementation -> arn-code-document-project -> **arn-code-ship**
This skill handles the entire shipping workflow: verifying git state, ensuring the user is on the right branch, staging changes safely, generating meaningful commit messages, pushing, and creating a pull request via the GitHub CLI or Bitbucket CLI.
Check ## Arness config in CLAUDE.md for Git: yes. If not present, run runtime check: git rev-parse --is-inside-work-tree.
If Git is not available, inform the user: "This project is not a git repository. /arn-code-ship requires Git." and exit.
Read the Platform field from ## Arness config in CLAUDE.md (values: github, bitbucket, or none). Store this value for use in Step 5. If the Platform field is not present, fall back to legacy detection: check for GitHub: yes and treat as github; otherwise treat as none.
Gather current state:
git branch --show-currentgit status --short (never use -uall)git log main..HEAD --oneline (skip if on main)git rev-parse --abbrev-ref @{upstream} (may fail if no upstream)If no uncommitted changes AND no commits ahead of remote, inform the user: "Nothing to ship — working tree is clean and up to date with remote." and exit.
If on main/master:
feat/websocket-support, fix/checkout-500-error)git checkout -b <branch-name>If on a feature branch:
<branch-name>. Proceeding."git status --short and git diff --stat.env, .env.*credential, secret, token, password, key in their nameid_rsa, *.pem, *.keyAskUserQuestion:
git add -A## Arness config from CLAUDE.md to get the plans directoryCHANGE_RECORD.json in plans subdirectories: SWIFT_*/CHANGE_RECORD.json, STANDARD_*/CHANGE_RECORD.json, CATCHUP_*/CHANGE_RECORD.json, and */CHANGE_RECORD.jsonceremonyTier field to determine the tier taggit log --oneline -10 and follow it. Default to imperative mood (e.g., "Add feature X", not "Added feature X").[swift], [standard], [thorough], or [catchup] (e.g., [swift] Add rate limiting to /api/users)git diff --staged --stat and file contentgit rev-parse --abbrev-ref @{upstream}git pushgit push -u origin <branch-name>git pull --rebase firstUse the Platform value read in Step 1 to determine the PR creation path.
Deferred Label Check:
If Platform is github: check if Arness labels exist by running gh label list --search "arness-". If fewer than 7 Arness labels are found, create the missing ones using gh label create --force for each label per ${CLAUDE_PLUGIN_ROOT}/skills/arn-code-init/references/platform-labels.md. This is idempotent and safe to run on every invocation.
If Platform is bitbucket or Issue tracker is jira: no label creation needed (Jira labels are implicit, Bitbucket uses different mechanisms).
Ask: "Would you like to create a pull request?"
If no: confirm the push was successful and exit.
If yes, branch based on Platform:
Run runtime check if needed: gh auth status. If GitHub CLI is not available or not authenticated, inform the user and skip this step.
Ceremony: [tier] line (e.g., "Ceremony: swift")specRef (if non-empty): Spec: [specRef]review.verdict (if present): Review: [verdict]filesModified and filesCreated arraysgh pr create --draft) if the user wants feedback before marking it ready for reviewgh pr create --title "..." --body "..." (add --draft if chosen)/arn-code-review-pr after receiving feedback on the pull request."Run runtime check: bkt auth status. If bkt is not available or not authenticated, inform the user and skip this step.
git symbolic-ref refs/remotes/origin/HEAD | sed 's@^refs/remotes/origin/@@'bkt pr create --title "..." --description "..." --source <branch> --destination <default-branch>bkt output/arn-code-review-pr after receiving feedback on the pull request."Skip PR creation. Inform user: "No platform configured for PR creation. Run /arn-shipping to get started."
If a CHANGE_RECORD.json was found in Step 3, update it after the commit and push (regardless of whether a PR was created):
commitHash from git rev-parse HEADcommitMessage from the commit message usednextSteps array (e.g., "PR: [url]")If no CHANGE_RECORD.json was found, skip this step silently.
After pushing (and optionally creating a PR), check for sketch directories in these locations:
arness-sketches/ at the project root (all paradigms)app/arness-sketches/, pages/arness-sketches/, src/routes/arness-sketches/Scan for subdirectories whose names match the shipped feature (by branch name, spec name, or feature ID).
If matching sketch directories are found, read each sketch's sketch-manifest.json to determine the paradigm, previewCommand, and status fields. Include previewCommand in the user-facing message when presenting options: "Preview was available via: [previewCommand]".
Present options based on the manifest status:
If status is "promoted":
"Found sketch directory arness-sketches/<name>/ for this feature. This sketch was already promoted into your codebase."
If status is "kept":
"Found sketch directory arness-sketches/<name>/ for this feature. What would you like to do?"
If status is "draft":
"Found sketch directory arness-sketches/<name>/ for this feature. This sketch was never finalized (draft status)."
If status is "consumed":
"Found sketch directory arness-sketches/<name>/ for this feature. This sketch was fully consumed during implementation -- all components were promoted."
Suggest Delete as the default action. Also offer Keep if the user wants to preserve for reference.
Action handling:
If Delete:
paradigm is web, check the project's framework (from architecture.md or the manifest's framework field) to determine if router cleanup is needed. File-system-routed frameworks (Next.js, SvelteKit, Nuxt) need route entry removal. Config-routed frameworks (React Router, Vue Router) need router config cleanup. Other web frameworks may only need directory deletion. For CLI, TUI, desktop, and mobile paradigms, simple directory deletion is sufficient -- no router cleanup is needed.If Keep: skip silently.
If Promote (only available for "kept" status): inform: "Sketch promotion copies the output files to your project. Review and integrate manually after this step."
If no matching sketch directories are found, skip this step silently.
This step is entirely optional — it activates only when a greenfield feature backlog exists. Projects without greenfield skip this step silently and proceed to the completion summary. It identifies the shipped feature (by branch name, spec, or commits), marks it as done, handles sub-feature parent rollup, and reports newly unblocked features.
Read
${CLAUDE_PLUGIN_ROOT}/skills/arn-code-ship/references/feature-tracker-update.mdfor the full detection chain, update workflow, and sub-feature parent rollup logic.
git pull --rebase, never force-push automatically.gh CLI not authenticated — inform user, skip PR creation, suggest gh auth login.bkt CLI not authenticated — inform user, skip PR creation, suggest bkt auth login.bkt, offer to retry.GitHub: yes detection. If neither found, treat as none./arn-spark-feature-extract to regenerate.