Folds `josh-sync adopt` into `josh-sync onboard <target>` as the adopt strategy alongside the original reset flow. Strategy resolves by precedence: --mode flag > targets[].history_lock config (preserve|rewrite) > auto-detect via `git ls-remote --heads`. `josh-sync adopt` is kept as a thin alias. Adds the new `targets[].history_lock` config field (validated at parse time) and folds `<target>/adopt.json` state into `<target>/onboard.json` with a `.strategy` field; legacy state files are read with a backward-compat fallback. Safety hardening (from a multi-angle review of the unification): - auto-detect distinguishes auth/network failure from empty repo - resume validates --mode against the strategy saved in state - `josh-sync adopt` rejects a conflicting --mode in the forwarded args - missing import-PR lookup dies in both strategies (was WARN+continue for reset, which could create duplicate import PRs on resume) - --restart durably removes the legacy adopt.json from the state branch - adopt_branch is now a subshell function (EXIT trap can't clobber callers) - strategy value validated after resolve/load (reset|adopt) - --mode with missing/empty value dies with a usage hint - migrate-pr against an adopt-strategy target dies with a specific hint - reset importing asserts archived_url is present (no "null" → git clone) End-to-end + CLI bats coverage added (tests/unit/adopt_e2e.bats, tests/unit/cli.bats). 72 tests, shellcheck clean. Makefile dist bundle header now correctly interpolates VERSION and line count. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Architecture Decision Records
This directory contains Architecture Decision Records (ADRs) for josh-sync. Each ADR documents a significant design decision, its context, the alternatives considered, and the rationale for the chosen approach.
Index
| ADR | Title | Status |
|---|---|---|
| 001 | Josh-proxy for bidirectional sync | Accepted |
| 002 | State storage on orphan git branch | Accepted |
| 003 | Force-with-lease for forward sync | Accepted |
| 004 | Always-PR policy for reverse sync | Accepted |
| 005 | Git trailer for loop prevention | Accepted |
| 006 | Inline exclude in josh-proxy URL | Accepted |
| 007 | Reconciliation merge for filter changes | Accepted |
| 008 | First-parent ordering in reconciliation merges | Accepted |
| 009 | Tree comparison as sync skip guard | Accepted |
| 010 | Onboard workflow with checkpoint/resume | Accepted |
| 011 | Linearize fallback for reverse sync | Accepted |
| 012 | Explicit monorepo_url (drop first-target-host inference) |
Accepted |
| 013 | Non-destructive adoption merge for existing subrepos | Accepted |