test / unit + widget + golden + a11y (push) Failing after 29s
test / integration_test (xvfb) (push) Has been skipped
test / bundle smoke (xvfb 5s) (push) Has been skipped
test / daemon subprocess + web WASM smoke (push) Has been skipped
test / dart doc (lib API) (push) Failing after 1m0s
socketPath-before-start + prepareParentDir-creates-missing — adds
two assertions that net a few more covered lines and put the
coverage gate back over 95%.
Co-Authored-By: Claude <noreply@anthropic.com>
Net new uncovered lines in lib/src/ipc/server.dart from the T-124
commit (handler-throw → toolError, non-request → userError, in-flight
client teardown on stop, multi-request on one connection) are covered
here so the coverage gate holds at 95%.
Co-Authored-By: Claude <noreply@anthropic.com>
First slice of T-99 (the D-56-path-a IPC server). What this lands:
* lib/src/ipc/paths.dart rewritten — `workspaceSocketPath(root)`
returns the per-workspace path per D-70 (FNV-1a 64-bit hash, hex,
no crypto dep — D-70 amended in this commit to record the hash
choice). Old `defaultSocketPath()` removed; the lone fallback in
facade.dart kept with a clear placeholder pending T-127.
* lib/src/ipc/server.dart — IpcServer class. ServerSocket.listen
accept loop (D-72), 0600 socket + 0700 parent (D-71), stale-node
probe + unlink on start, refuses to clobber a live listener.
* lib/main.dart — IpcServer started after the first dispatcher is
built and swapped on project open (workspace path changes).
Failure logged but non-fatal so the UI still works without IPC.
* 11 server tests + 5 path tests cover socket modes, multi-conn,
stale unlink, live-conflict, idempotent start/stop.
T-99 children downstream of T-124 (T-125 / T-126 / T-127 / T-130)
are now unblocked.
Co-Authored-By: Claude <noreply@anthropic.com>
pane.spawn (via PtyException.errno) and editor.open (via
FileSystemException.osError.errorCode) now route ENOENT to
not_found, EACCES/EPERM to user_error with a permissions hint,
EISDIR/ENOTDIR/EEXIST to distinct user-error/conflict, and
EMFILE/ENFILE to tool_error with a "fd limit hit" hint. The
mapping lives in lib/src/ipc/errno_mapping.dart so other handlers
can adopt the same surface as they pick up errno-bearing failures.
Co-Authored-By: Claude <noreply@anthropic.com>
First real content for the `clide` Dart package at the repo root.
One AOT-compiled binary (ADR 0005) with two modes:
* `clide --daemon` long-running unix-socket server; listens on
`$XDG_RUNTIME_DIR/clide-$USER.sock` with stale-socket
reclaim, accepts JSON-lines request/response traffic, clean
SIGTERM shutdown unlinks the socket file.
* `clide <subcommand>` one-shot; opens the socket, sends a
request, writes the response JSON to stdout, exits with the
dispatcher's error code per ADR 0006 (0/1/2/3/4). Unknown
subcommands forward to the daemon so extensions can register
their own without CLI changes.
Tier 0 handlers: `ping` (returns pong + version + UTC ts) and
`version`. Both are covered by `test/ipc/` + `test/daemon/`; the
subprocess test builds `bin/clide`, starts it, pings it, SIGTERMs
it, and asserts the socket file disappears.
Co-Authored-By: Claude <noreply@anthropic.com>