Oneshot Ship
by @adwilkinson
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...
clawhub install oneshot-shipπ About This Skill
name: oneshot-ship description: 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. license: MIT metadata: author: ADWilkinson version: "0.2.0" repository: "https://github.com/ADWilkinson/oneshot-cli" compatibility: Requires Bun, Claude Code CLI, Codex CLI, and GitHub CLI. SSH access to a server optional (can run locally with --local)
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
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 under the workspace path:
~/projects/
my-org/my-app/
my-org/my-api/
Server prerequisites
ANTHROPIC_API_KEY and OPENAI_API_KEY in environmentUsage
oneshot "" # ship a task
oneshot # ship from a Linear ticket
oneshot "" --bg # fire and forget
oneshot "" --local # run locally, no SSH
oneshot "" --deep-review # force exhaustive review
oneshot "" --model sonnet # override Claude model
oneshot "" --branch dev # target a different branch
oneshot --dry-run # validate only
oneshot init # configure
oneshot stats # recent runs + timing
Pipeline
1. Validate: checks the repo exists, fetches latest from origin
2. Worktree: creates a temp git worktree from the target base branch
3. Classify: classifies the task as fast or deep via heuristics + LLM
4. Plan: Claude reads the codebase and CLAUDE.md conventions, outputs an implementation plan
5. Execute: Codex implements the plan. If it times out with partial changes, the pipeline continues
6. Draft PR: Claude creates a branch, commits, pushes, and opens a draft PR
7. Review: Codex reviews the diff. In deep mode it runs an exhaustive review across correctness, security, and code quality
8. 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 |
|------|-------|-------------|
| --model | -m | Override Claude model |
| --branch | -b | Base branch (default: main) |
| --deep-review | | Force exhaustive review mode |
| --local | | Run locally instead of over SSH |
| --bg | | Run in background, return PID + log path |
| --dry-run | -d | Validate only |
| --events-file | | Mirror JSONL events to an additional file |
| --help | -h | Help |
| --version | -v | Version |
Customization
CLAUDE.md in any repo root. oneshot passes it to Claude and Codex at every stepprompts/plan.txt, execute.txt, review.txt, pr.txt to change pipeline behaviorTips
--bg to fire and forget long tasksfast or deep mode automatically. Use --deep-review to force deep~/.oneshot/history.json)π‘ Examples
oneshot "" # ship a task
oneshot # ship from a Linear ticket
oneshot "" --bg # fire and forget
oneshot "" --local # run locally, no SSH
oneshot "" --deep-review # force exhaustive review
oneshot "" --model sonnet # override Claude model
oneshot "" --branch dev # target a different branch
oneshot --dry-run # validate only
oneshot init # configure
oneshot stats # recent runs + timing
βοΈ 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.
π Tips & Best Practices
--bg to fire and forget long tasksfast or deep mode automatically. Use --deep-review to force deep~/.oneshot/history.json)