`airship doctor` had one `git repo` line that reported `isGitRepo` and nothing
else, so a machine with no git on PATH was told it was not in a repository.
That is now two checks, because they fail for different reasons and have
different fixes: whether git can run at all, and whether this directory is
somewhere it can usefully run.
The level follows the rule `checkAgents` already set — only the backend being
used can fail the run. Claude snapshots its own before-state through a pre-tool
hook and edits and undoes with no git at all, so a working Claude install must
not be reported as broken; codex and opencode reconstruct their baseline from
HEAD and cannot. `doctor` exits non-zero on any fail and is documented as
scriptable, which is what that distinction protects.
The launch banner's git warning becomes unconditional. It used to fire only for
the non-Claude backends, but whatever is wrong with git breaks Commit and
Create pull request on every one of them; the diff-baseline sentence is the
half that really is backend-specific.
`--debug` had no consumer but `reportError`'s stack print. It now also prints
every failed git invocation to stderr with its argv, exit status and full
stderr — the detail behind the one line a toast has room for. stderr, so
`--json` stays parseable, and `AIRSHIP_DEBUG=1` works without changing how the
daemon is launched, which matters when the person who needs the trace is not
the person who knows the flags.
`isGitRepo` leaves @airship/server's exports with its last consumer. It stays
in @airship/git as the cheap predicate `commitEdit` takes before paying for a
`gitStatus`; it is no longer what anything user-facing asks, because it answers
"false" to three different problems.
Also: gen-models.mjs spawned `node_modules/.bin/biome`, the POSIX shell
wrapper, with no shell and no `.CMD` fallback — the last un-forked spawn in the
repo. Only reachable through `make models:refresh`, so it never failed in CI.