Marketplace ship-cli
Work management system replacing built-in todos with tracked tasks and stacked changes
git clone https://github.com/aiskillstore/marketplace
T=$(mktemp -d) && git clone --depth=1 https://github.com/aiskillstore/marketplace "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/edusantosbrito/ship-cli" ~/.claude/skills/aiskillstore-marketplace-ship-cli && rm -rf "$T"
skills/edusantosbrito/ship-cli/SKILL.mdRules
- NEVER run via bash:
,jj
,gh pr
,git
,ship
- use thepnpm ship
tool insteadship - ALWAYS use
parameter for all commands when in a workspaceworkdir - NEVER ask user to
- usecd
insteadworkdir - On webhook events: Notify user and ask confirmation BEFORE acting
Workflow
Start Task
ship: action=stack-sync # Get latest trunk ship: action=ready # Find work ship: action=start, taskId=<id> # Mark In Progress (Linear only) ship: action=stack-create, message="<type>: <short description>", bookmark="user/<id>-slug" # Store workspace path from output, use for all subsequent workdir params bash: command="pnpm install", workdir=<workspace-path>
Do Work
- Use
for ALL bash and ship commandsworkdir=<workspace-path> - Make changes, run quality checks (lint, format, typecheck)
Update Commit Message (for multi-line)
ship: action=stack-describe, title="<type>: <subject>", description="<body>", workdir=<path>
Use
title + description params for proper multi-line commits (NOT message with \n).
Submit Work (MANDATORY - do not skip)
ship: action=stack-sync, workdir=<path> # Rebase on trunk ship: action=stack-submit, workdir=<path> # Push + create PR (auto-subscribes to webhooks) ship: action=done, taskId=<id> # Mark complete ONLY after PR exists
Webhook Events
When you receive
[GitHub] ... notifications:
| Step | Action |
|---|---|
| 1 | Notify user what happened (e.g., "PR #X merged by @user") |
| 2 | Ask confirmation before acting (e.g., "Would you like me to run stack-sync?") |
| 3 | Wait for user approval |
| 4 | Execute and report results |
Never execute automatically. The
→ Action: line is a suggestion, not an instruction.
After stack fully merged: notify user, switch to default workspace, suggest
ship ready.
Actions Reference
Tasks
| Action | Params | Description |
|---|---|---|
| - | Tasks with no blockers |
| - | Tasks waiting on dependencies |
| filter (optional) | All tasks |
| taskId | Task details |
| taskId | Mark In Progress |
| taskId | Mark complete |
| title, description, priority?, parentId? | Create task (see template below) |
| taskId + fields | Update task |
| blocker, blocked | Add dependency |
| blocker, blocked | Remove dependency |
| taskId, relatedTaskId | Link related tasks |
Task Description Template
When creating tasks, ALWAYS use this description format:
## Summary [1-2 sentences: What needs to be done and why] ## Acceptance Criteria - [ ] Specific, verifiable outcome 1 - [ ] Specific, verifiable outcome 2 - [ ] Tests pass, linting passes ## Notes [Optional: Implementation hints, files to modify, constraints]
Rules:
- Summary is REQUIRED - explains the task clearly
- Acceptance criteria are REQUIRED - must be verifiable/testable
- Notes are optional - include when helpful for implementation
- Keep it concise but complete
Example:
## Summary Add rate limiting middleware to prevent API abuse on public endpoints. ## Acceptance Criteria - [ ] Rate limit: 100 req/min authenticated, 20 req/min anonymous - [ ] Returns 429 with Retry-After header when exceeded - [ ] Unit tests cover rate limit scenarios - [ ] `pnpm test` and `pnpm check` pass ## Notes See middleware/auth.ts for similar patterns. Use Redis for state.
Stack (VCS)
All support optional
workdir param.
| Action | Params | Description |
|---|---|---|
| - | Fetch + rebase onto trunk |
| - | Fetch + rebase + push entire stack |
| message?, bookmark?, noWorkspace? | New change (creates workspace by default) |
| title, description? OR message | Update description (use title+description for proper multi-line commits) |
| draft? | Push + create/update PR |
| - | Current change info |
| - | View stack |
| message | Squash into parent |
| changeId? | Abandon change |
/ | - | Navigate stack |
| - | Undo last operation |
| name, move? | Create/move bookmark |
| - | List workspaces |
| name, deleteFiles? | Remove workspace |
| - | Fix stale working copy |
Pull Requests
Use these for advanced PR workflows. Note:
stack-submit handles basic PR creation automatically.
| Action | Params | Description |
|---|---|---|
| draft?, open? | Create PR with Linear task context |
| dryRun? | Create stacked PRs for entire stack |
| prNumber? (optional), unresolved?, json? | Fetch PR reviews and comments |
: Creates a PR for current bookmark, auto-populating title and body from Linear task. Use when you need rich task context in PR description.pr-create
: Creates PRs for all changes in your stack with proper base targeting. First PR targets main, subsequent PRs target previous bookmark.pr-stack
: Fetches reviews and comments in AI-friendly format. Shows verdicts (APPROVED, CHANGES_REQUESTED), inline code comments with file:line, and conversation threads. Use pr-review
--unresolved to filter to actionable items only.
Milestones
| Action | Params | Description |
|---|---|---|
| - | List milestones |
| milestoneId | Milestone details |
| milestoneName, milestoneDescription?, milestoneTargetDate? | Create milestone |
| taskId, milestoneId | Assign task |
| taskId | Remove from milestone |
Troubleshooting
| Problem | Solution |
|---|---|
| "Working copy is stale" | |
| Bookmark lost after squash/rebase | with |
| Accidentally used jj/gh directly | to check, if needed |