Resolve the database file itself; missing-target outranks same-source

Two Cursor findings on the previous guard fix:

- `canonicalDbPath` resolved only the directory and re-joined the
  filename, so a symlink at the *file* — `state.sqlite` itself linking
  into the shared home — passed the guard. Reproduced: the seed replaced
  the shared database through the link. Resolve the full path first (the
  file can be the link), falling back to directory-resolution only when
  the file does not exist yet, which is the one case a full resolution
  cannot handle and the one where the missing-target advice would create
  the database in the shared home.
- With --from and --to aliasing the same base and no database behind
  them, same-source fired before the existence check, hiding the
  actionable "start the dev server" guidance. The existence check now
  runs between the shared-home refusal (which must stay first — its
  advice is exactly wrong for the shared home) and same-source.

Verified seven ways: symlinked file refused with the shared rows
untouched, symlinked directory still refused, shared home with and
without a database refused as shared-home, aliased-empty reported as
missing-target, aliased-with-database as same-source, and a legitimate
seed unaffected.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
b769bb6455Theo Browne committed on 7/27/2026, 3:39:13 AMparentaad1bdd
1 file changedLine totals unavailable