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