jules-merge Agent Skill
Workflow Order
Always execute commands in this sequence:
scan— detect conflicts and build the manifestget-contents— fetch file versions (base, main, pr:) for each hot zonestage-resolution— write resolved content for each conflicted filestatus— confirm all files resolved (ready: true,pendingis empty)push— create the multi-parent reconciliation commit and PRmerge— merge the reconciliation PR using a merge commit
Command Reference
scan
- Required:
prs(array of PR numbers),repo(owner/repo) - Optional:
base(branch name, default: main),includeClean
get-contents
sourcevalues:"base"|"main"|"pr:<N>"(e.g."pr:42")- Always check
totalLinesin the response — if it exceeds your context budget, surface to the user rather than attempting to process the file "base"= the common ancestor commit (merge base), not main
stage-resolution
parentsformat:"main,<prNumber>,<prNumber>"— always start with"main", followed by the PR numbers (as strings) that touch the file- Example:
["main", "10", "11"] - Either
content(inline string) orfromFile(local path) must be provided - Use
--dry-runto validate without writing to the manifest
push
mergeStrategyvalues:"sequential"(default) |"octopus"sequential: creates N 2-parent merge commits in a chain — required for GitHub auto-closeoctopus: creates a single N-parent commit — use for non-GitHub platforms or atomic history
- Check
warningsin the output — if"BASE_SHA_MISMATCH"is present, re-runscanbefore merging --dry-runis safe to call at any time; it validates without writingpushis idempotent: calling it twice on the same branch reuses the existing PR- When using
sequential, the output includesmergeChain— an array of{ commitSha, parents, prId }per step
merge
- Always uses merge commit strategy — never squash or rebase
- This preserves the ancestry chain that auto-closes fleet PRs via GitHub's "closes" detection
Exit Codes
| Code | Meaning | Action |
|---|---|---|
0 |
Success | Continue |
1 |
Recoverable conflict | Surface to user or re-scan |
2 |
Hard error | Abort and surface to user |
Key Invariants
- Merge strategy: always
merge(not squash/rebase) — squash breaks the ancestry chain that closes fleet PRs - Push merge strategy: default
sequentialcreates 2-parent chain for GitHub compatibility; useoctopusonly for non-GitHub platforms - parents format:
["main", "<prN>", "<prN>"]— the string"main"is always first, followed by PR numbers as strings - Scan before push: if
pushreturnswarnings: ["BASE_SHA_MISMATCH"], re-runscanto refresh the base SHA before proceeding - Context window: check
totalLineson everyget-contentsresponse; if a file is too large for your context budget, surface to the user rather than processing it - Idempotency:
scanoverwrites the manifest;pushreuses an existing open PR on the same branch - No pending files:
pushwill throw ifstatus.pendingis non-empty — resolve all hot zones first
Schema Introspection
jules-merge schema <command> # input/output schema for one command
jules-merge schema --all # all schemas at once