feat(cli): pick the app of the project the launcher belongs to

Discovery is per user, so every project's launcher sees every debug app
running, and with two of them up every command refused to guess and
asked for -i, though the agent in one project meant its own app. Two
copies of the example, both named basic, could only be told apart by
id.

The launcher now exports CRAFTER_DEBUG_PROJECT, its project's directory
(flatpak-spawn gets it spelled out), and the client counts an app as
the project's when its executable lies under it, as `-r` runs it from
<project>/bin/<variant>/. With other projects' apps running, commands
pick this project's; two copies of it still need -i. Another project's
app is never picked by default: with this project's app not up yet, or
crashed, the agent would otherwise drive, or quit, someone else's. It
is listed instead, for -i.

`ls` lists this project's apps first, marked, `--json` says which are,
and `--wait` waits for one of them rather than any app; the exit code
says whether one runs. A client started without the launcher has no
project and picks the one app running, as before, and the command the
protocol check prints for an older app's own client now names it with
-i.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Jorijn van der Graaf 2026-11-01 18:33:59 +01:00
commit 2217037d72
Signed by: jorijnvdgraaf
GPG key ID: 2937E59CDCC1BCFB
5 changed files with 126 additions and 16 deletions

View file

@ -58,6 +58,11 @@ export namespace Crafter::Debug::Cli {
std::ostream* err = &std::cerr;
// Where a screenshot without -o goes, relative paths included.
std::filesystem::path cwd = std::filesystem::current_path();
// The project the launcher that started this client was written for
// (CRAFTER_DEBUG_PROJECT). Its apps, the ones whose executable lies
// under it, are picked without -i when other apps run too, and no
// other app is. Empty: whichever app runs, as long as only one does.
std::filesystem::path project;
// Where lldb is here, for the attach command `debugger` prints: its
// absolute path, since `flatpak enter` runs a command without the
// sandbox's PATH, which /app/bin is on. Empty for none: gdb then.