Skills oneshot-ship
Ship code with oneshot CLI. One command that plans, executes, reviews, and opens a PR. Runs over SSH or locally. Use when the user wants to ship code changes, automate PRs, or run a coding pipeline with Claude and Codex.
install
source · Clone the upstream repo
git clone https://github.com/openclaw/skills
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/openclaw/skills "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/adwilkinson/oneshot-ship" ~/.claude/skills/clawdbot-skills-oneshot-ship && rm -rf "$T"
manifest:
skills/adwilkinson/oneshot-ship/SKILL.mdsource content
oneshot CLI
Ship code with a single command. oneshot runs a full pipeline: plan (Claude) → execute (Codex) → review (Codex) → PR (Claude). Works over SSH to a remote server or locally with
--local.
When to use this skill
- User wants to ship a code change to a repository without manual coding
- User wants to automate the plan/implement/review/PR workflow
- User mentions "oneshot" or wants to delegate a coding task
- User wants to run a task on a remote server or locally
Installation
bun install -g oneshot-ship
Setup
Run
oneshot init to configure SSH host, workspace path, API keys, and model preferences. Config is saved to ~/.oneshot/config.json.
Repos on the server should live as
<org>/<repo> under the workspace path:
~/projects/ my-org/my-app/ my-org/my-api/
Server prerequisites
- Bun
- Claude Code CLI
- Codex CLI
- GitHub CLI (authenticated)
andANTHROPIC_API_KEY
in environmentOPENAI_API_KEY
Usage
oneshot <repo> "<task>" # ship a task oneshot <repo> <linear-url> # ship from a Linear ticket oneshot <repo> "<task>" --bg # fire and forget oneshot <repo> "<task>" --local # run locally, no SSH oneshot <repo> "<task>" --deep-review # force exhaustive review oneshot <repo> "<task>" --model sonnet # override Claude model oneshot <repo> "<task>" --branch dev # target a different branch oneshot <repo> --dry-run # validate only oneshot init # configure oneshot stats # recent runs + timing
Pipeline
- Validate: checks the repo exists, fetches latest from origin
- Worktree: creates a temp git worktree from the target base branch
- Classify: classifies the task as
orfast
via heuristics + LLMdeep - Plan: Claude reads the codebase and CLAUDE.md conventions, outputs an implementation plan
- Execute: Codex implements the plan. If it times out with partial changes, the pipeline continues
- Draft PR: Claude creates a branch, commits, pushes, and opens a draft PR
- Review: Codex reviews the diff. In
mode it runs an exhaustive review across correctness, security, and code qualitydeep - Finalize: pushes review fixes and marks the PR ready
Worktree is cleaned up after every run.
Configuration
~/.oneshot/config.json:
{ "host": "user@100.x.x.x", "basePath": "~/projects", "anthropicApiKey": "sk-ant-...", "linearApiKey": "lin_api_...", "claude": { "model": "opus", "timeoutMinutes": 180 }, "codex": { "model": "gpt-5.4-mini", "reasoningEffort": "xhigh", "reviewModel": "gpt-5.4-mini", "reviewReasoningEffort": "xhigh", "timeoutMinutes": 180 }, "stepTimeouts": { "planMinutes": 20, "executeMinutes": 60, "reviewMinutes": 20, "deepReviewMinutes": 20, "prMinutes": 20 } }
Only
host is required for SSH runs. Local mode works without a config file.
Flags
| Flag | Short | Description |
|---|---|---|
| | Override Claude model |
| | Base branch (default: main) |
| Force exhaustive review mode | |
| Run locally instead of over SSH | |
| Run in background, return PID + log path | |
| | Validate only |
| Mirror JSONL events to an additional file | |
| | Help |
| | Version |
Customization
- Put a
in any repo root. oneshot passes it to Claude and Codex at every stepCLAUDE.md - Edit
,prompts/plan.txt
,execute.txt
,review.txt
to change pipeline behaviorpr.txt
Tips
- Use
to fire and forget long tasks--bg - Linear integration moves tickets to "In Review" and comments the PR URL
- Per-step timeouts prevent runaway processes (plan 20m, execute 60m, review 20m, PR 20m)
- Worktree isolation means your main branch is never touched
- Task classification picks
orfast
mode automatically. Usedeep
to force deep--deep-review - Duration estimates come from historical runs per repo (
)~/.oneshot/history.json