SIGN IN SIGN UP

fix(worktree): read a detached shell without asking the enclosing repo

`path_holds_uncommitted` measured a post-removal shell with `git status`
run from the shell itself, and git walks up from there. A worktree root
configured inside the project — a relative `worktree_root` — puts the
shell under the project's own `.git`, so git answered about the PROJECT:
a project with a stray file of its own made an empty shell read as
"holds uncommitted files" and the cleanup retry never converged. Decide
from the directory alone whenever the `.git` marker is gone, since a
path git no longer speaks for cannot be described by its answer.

Report the filesystem half of `remove_worktree_and_branch` through a
message that names the path and the OS reason: `AppCommandError`'s
`Display` is its `message` alone, so `AppCommandError::io` left bare
"I/O operation failed" on the task card.

Cover the probe directly, in the DEFAULT worktree layout (beside the
project, outside every repository) — the existing fixture nests its
worktree inside the repo, where `git status` always answers and the
empty-shell branch is never reached.
X
xintaofei committed
8d8cab6516e9cfe3461baf0c263e5614801bd8e5
Parent: d203db3