Commit Graph
99 Commits
Author SHA1 Message Date
jpmschweitzerandClaude Opus 4.8 e8cc1f1ceb turn indicator → Claude coral-orange brand accent (T-273)
The in-flight "Pondering…" turn indicator used muted grey; switch it to
the existing claudeAccent (#d97757, Anthropic's brand coral) — the
indicator is main-thread Claude running, which the accent is reserved for.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-08 13:44:34 +02:00
jpmschweitzerandClaude Opus 4.8 6fcca38e6a quarantine pre-existing app_test hang (T-280)
`test/app_test.dart` › "Open Folder on a non-repo path surfaces the 'no
git repo' dialog" wedges the runner ~10 minutes — teardown hangs on
`_RawReceivePort._handleMessage`. It's pre-existing (reproduces at the
base commit, predates the T-267 epic) and not a one-line fix: bisection
shows it persists even with project validation stubbed to a pure-Dart
`.git` walk and `runAsync` removed, so the booted-app + open-folder path
holds a native port teardown never drains.

Skipped so the suite/gate stays green; T-280 tracks the real fix with the
full bisection.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-08 13:35:43 +02:00
jpmschweitzerandClaude Opus 4.8 07b41c0ff1 file T-279 (clickable T/D/Q/R cross-refs in conversation view) under T-276
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-08 12:21:25 +02:00
jpmschweitzerandClaude Opus 4.8 069879620f attribute sidechain prose/thinking to the agent, not claude (T-265); close T-267
A sub-agent's prose rendered as "claude" and its thinking as "thinking",
identical to the main assistant, because the label logic ignored
isSidechain — presenting sub-agent output as if the main Claude said it.
Now a sidechain AssistantTextMessage is labelled "agent" with a muted
stripe (never the coral claudeAccent brand), and sidechain thinking is
"agent thinking". Main-thread items are unchanged.

Tests: sidechain prose/thinking relabel, main-thread unchanged; golden
contrasting the muted agent stripe with the coral claude stripe.

This completes epic T-267 (conversation rendering streamlining): fold
success result (T-262), fold agent prompt (T-263), nest the agent run
(T-264), the shared holder primitive (T-266), and this attribution fix.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-08 12:09:47 +02:00
jpmschweitzerandClaude Opus 4.8 db6ecbd5df nest the whole sub-agent run under its Agent card (T-264)
A sub-agent's sidechain run used to spill loose into the main chain,
indistinguishable from main-thread items. Now:

- _sidechainFold routes every sidechain item to its owning Agent/Task
  tool-use by walking the parentUuid chain up to the Agent message it
  branches off (nearest-preceding Agent as fallback) — correct even for
  parallel agents.
- The run (prose / thinking / tool cards) nests in an "agent run"
  ClideHolderCard UNDER the Agent card, suppressed from the top level. The
  prompt still folds into the call (T-263); a successful sidechain tool
  result folds into its own tool card inside the run, so it isn't a
  separate step.
- When a run is shown, the Agent card's returned-result segment is dropped
  (it duplicates the run's final output, note E) — but kept when no run
  was captured, so output is never lost.

Tests: run nesting, returned-result dedup, parallel-run attachment (would
fail under nearest-preceding), and folded-result-not-double-counted.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-08 11:26:09 +02:00
jpmschweitzerandClaude Opus 4.8 5253b7b759 file T-278 (slash typeahead breaks on '-'; flaky Tab-complete) under T-276
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-08 11:20:05 +02:00
jpmschweitzerandClaude Opus 4.8 75f7d1ca12 restyle activity card as a holder container; background-toggle collapse (T-266)
Extracts a shared ClideHolderCard primitive (consumed next by T-264) that
renders a folded run as one framed container wrapping its sub-cards:

- The whole holder background is the collapse toggle — a gesture target
  behind the children that only fires for hits the children don't consume.
  Each sub-card opaquely absorbs its own bounds, so a card tap (and its
  copy button) interacts with the card, never the holder; selection drags
  pass through. This ends the scroll race: while a run tail-follows, a
  click on whatever background is in view collapses it, no top header to
  reach.
- A focusable caret keeps the control keyboard/AT reachable (D-78); the
  collapsed ticker + step count are preserved.
- _ActivityCard becomes a thin stateless adopter of the primitive.

Tests: ticker/expand, background-toggle, child-tap-not-hijacked, copy
still works, keyboard Activate path; golden for collapsed + expanded.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-08 11:04:38 +02:00
jpmschweitzerandClaude Opus 4.8 a7a7b04a05 fold sub-agent prompt into the Agent card; relabel you → agent prompt (T-263)
A sidechain sub-agent prompt was rendered with the blue "you" label,
falsely implying the user typed it. Now:

- transcript_reader parses parentUuid (was dropped) onto every
  ConversationItem.
- conversation_view resolves each sidechain prompt to its spawning
  Agent/Task card via parentUuid (nearest-preceding Agent as fallback),
  folds the prompt into that card as a collapsed "prompt" segment, and
  suppresses the standalone block. Layered order when expanded:
  call → prompt → result (note E).
- A sidechain UserMessage never gets the "you" treatment: folded into its
  card, or — when orphaned — rendered as a muted standalone "agent prompt".

Tests: parentUuid parse, fold + suppression, parallel-agent attachment
(would fail under a nearest-preceding heuristic), orphan relabel, and a
golden for the Agent card's call → prompt → result layering.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-08 10:45:48 +02:00
jpmschweitzerandClaude Opus 4.8 c6bebcb1cb file T-277 (surface pql labels in clide tickets UI) under T-276
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-08 10:34:54 +02:00
jpmschweitzerandClaude Opus 4.8 9fb24e695f mark T-276 as a permanent never-close UI tracker
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-08 09:53:58 +02:00
jpmschweitzerandClaude Opus 4.8 04ab4e8009 add UI tweaks & fixes epic (T-276); parent T-273/T-274/T-275 under it
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-08 09:46:51 +02:00
jpmschweitzerandClaude Opus 4.8 38736f03b9 file T-275 (Frame0 design: permission-mode dropdown by composer)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-08 09:28:39 +02:00
jpmschweitzerandClaude Opus 4.8 a5dddd815a file T-274 (Claude status bar stays empty)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-08 09:26:19 +02:00
jpmschweitzerandClaude Opus 4.8 9a8f8641f7 merge successful tool call + result into one card (T-262)
A successful tool call now renders as a single merged card instead of a
separate call card + result card:

- ConversationCard gains a trailing header status slot (success check /
  error cross, semantics-labelled) and optional labelled extra body
  segments (P1 + P2 — reused by T-263's Agent card).
- conversation_view builds a reverse toolUseId→result lookup, folds a
  successful result into its call card as a colorized ClideCodeBlock
  (Read → file grammar, Bash → shell, else text), and suppresses the
  standalone success result in _visibleItems. Errors stay a separate
  prominent red card, now with a matching red header mark (note C).
- Suppression happens before grouping, so a merged success result is no
  longer a separate activity-cluster step (note D).

Tests: card status-mark + segment coverage, merged-fold + language
inference + in-flight/orphan/error cases, cluster non-double-count, and a
golden for the merged card (collapsed + expanded + error).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 19:41:28 +02:00
jpmschweitzerandClaude Opus 4.8 af23c7809e file T-273 (turn indicator → Claude accent orange)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 19:39:30 +02:00
jpmschweitzerandClaude Opus 4.8 3a78dfaf40 trim T-48 changelog bullet under the 60-word cap
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 18:31:10 +02:00
jpmschweitzerandClaude Opus 4.8 f36e8cecf8 close T-48 (application menu bar)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 17:40:17 +02:00
jpmschweitzerandClaude Opus 4.8 826395481c make sidebar filter boxes CLI-addressable via the MessageBus (T-270)
The sidebar/dock filter fields (the shared ClideFilterBox) had no CLI
peer — a one-way, UI-only affordance that broke D-6 parity. Add the
drive+observe verb `clide ui filter <address> [<text>]`, routed entirely
through the kernel MessageBus pub/sub so a box reacts to a published
message identically whether the trigger was a UI keystroke or the CLI —
keeping extensions first-class (no dispatcher→widget wiring).

- ClideFilterBox gains an `address`; when set it listens on `filter.set`
  for its address and republishes its value on `filter.state`. Null
  address keeps the box a kernel-free UI widget.
- FilterStateCache (new kernel service) caches the latest `filter.state`
  per address — the bus has no retention, so this backs the observe-half.
- ui.filter: with text → publishes `filter.set` (drive); without →
  reads the cache (observe). Honest toolError when there is no live UI.
- Address every box: decisions/tickets/files/git/output/problems panes,
  the four search boxes, and the pql search/query/markdown inputs.

Addresses are the ids from `clide pane list` (e.g. decisions.panel).
settings.json: allow the `clide` CLI + relevant skills.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 12:44:40 +02:00
jpmschweitzerandClaude Opus 4.8 f813fd4d5a rebind the Claude pane on an in-place workspace switch (T-269)
Separate clide windows are isolated (own process, per-root IPC socket,
per-repo deterministic session id), so parallel repos in separate windows
were already fine. But switching the workspace in place (Open Project /
Open Folder) only emitted ProjectOpened — nothing rebound the Claude
session, so the primary pane kept the PREVIOUS repo's conversation.

Two compounding causes, fixed in layers:
- ClaudeSessionOrchestrator.spawn() was idempotent on the literal key
  'primary' without checking cwd, so it handed the old repo's session to
  the new repo. It now reuses a cached session only when its cwd matches
  the spec; a mismatch tears the stale one down and spawns fresh.
- The primary ClaudePane is built once behind a GlobalKey and spawns once,
  so it never re-resolved. It now listens for ProjectOpened and rebinds:
  close its orchestrator entry, drop the cached session id + repo root, and
  respawn against the now-active repo. Secondaries don't self-rebind.
- ClaudeSessionHost drops the old repo's secondary/fork tabs on a switch,
  so a switched workspace starts like a fresh launch (lone primary).
- The extension closes any remaining sessions whose cwd != the new root,
  catching team/non-pane sessions no pane owns.

Tested at the orchestrator: cwd-aware idempotency (reuse on cwd match,
teardown + respawn on mismatch). Pane/host widget coverage is intentionally
deferred — claude_pane.dart has no widget-test harness yet and pulling it
into coverage piecemeal would drop the gate; tracked separately.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 12:37:53 +02:00
jpmschweitzerandClaude Opus 4.8 892240b3a6 primary /clear empties the deterministic session in place (T-268)
The primary Claude pane is anchored to a deterministic session id derived
from the repo path so it resumes the same transcript across restarts
(D-77/T-146). But /clear (T-156) respawned on a fresh RANDOM id, so the
next launch re-resolved to the deterministic id, found its old transcript
on disk, and resumed the PRE-clear conversation — the cleared session was
orphaned and the clear silently didn't stick.

/clear in the primary pane now deletes the deterministic session's
transcript (and its sidecar dir) and respawns on the SAME id, so
`--session-id` re-creates it empty and a cleared primary stays cleared.
Secondary panes are throwaway and keep the fresh-random behaviour.

Factor the duplicated transcript-path construction out of claude_pane into
session_naming helpers (claudeProjectDir / claudeTranscriptPath /
clearSessionTranscript) so the clear logic is DRY and unit-tested.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 11:39:26 +02:00
jpmschweitzerandClaude Opus 4.8 0bfc99719f close T-255 (animated running indicator)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 10:51:08 +02:00
jpmschweitzerandClaude Opus 4.8 495fc9151e file conversation-rendering streamlining epic (T-267) + children
Epic T-267 homes the work that streamlines the Claude conversation log
around three moves: fold redundant standalone items into their owning
card, fix misleading attribution, and settle the container model.

Children: T-262 (merge tool-call + success result), T-263 (fold agent
prompt into the Agent card), T-264 (nest the whole sub-agent run),
T-265 (relabel sidechain prose), T-266 (shared holder/container card +
collapse-control scroll race). T-264 blocked by T-266 (shared primitive).
Also records T-255 moving to ready.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 10:50:10 +02:00
jpmschweitzerandClaude Opus 4.8 2e1bdaec79 close T-252 (image lightbox)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 10:32:36 +02:00
jpmschweitzerandClaude Opus 4.8 076e66db80 add ClideLightbox — click image cards to enlarge (T-252)
The inline image cards (T-249) are often too small to read. Clicking one now
opens a full-screen lightbox: zoom (scroll wheel / pinch), pan when zoomed,
double-click to reset to fit, Esc / close button / backdrop click to dismiss.

ClideLightbox is a reusable primitive (lib/widgets/) over Flutter's
InteractiveViewer with clide-owned zoom gestures, shown via the DialogRouter
(dimmed backdrop, single modal at a time, D-78). The card stays display-only;
the click is a navigation gesture, not an inline control.

CLI parity (D-6): `clide image show <path> --fullscreen` opens straight into
the lightbox instead of injecting a card.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 10:32:16 +02:00
jpmschweitzerandClaude Opus 4.8 7c2d140146 close T-54 (output dock); file T-261 for dock drag-resize
Core delivered: toggle from the status-bar widget / Ctrl+J, Output + Problems
tabs, filterable auto-scrolling logs, health badge, persistence. Drag-resize
of the dock height is the one deferred refinement (T-261).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 10:03:33 +02:00
jpmschweitzerandClaude Opus 4.8 e0c65aba06 file T-260 — annotation tools on the image overlay
Expands on T-252 (lightbox overlay): an annotation layer for
boxes/arrows/labels so the user can mark up a shown image and round-trip
the markup back to Claude as a flattened PNG plus a structured summary —
a visual dialog about images. Also records T-255 moving to ready.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-06 23:49:26 +02:00
jpmschweitzerandClaude Opus 4.8 44a4c5d528 re-scope T-36 to live-sync read-mirror; amend D-50; add interaction-model epic T-259
T-36 bundled four D-50 clauses; the give-clide-hands push (T-208)
superseded three of them. The agent now drives the reader explicitly via
`clide ui open markdown <path>` (T-231) and ui.open->diff (T-233) instead
of clide parsing Claude's terminal output, so the auto-swap (clause 2)
and collapsed-spine badge (clause 3) are obsolete. Clauses 1 and 5
already hold. The one piece give-clide-hands did not deliver is the
live-sync read-mirror (clause 4).

- Amend D-50: record clauses 2/3 superseded by the agent-driven ui.open
  verb; live-sync remains the UI-owned piece.
- Re-scope T-36 to just the live-sync read-mirror, drop the spine badge,
  move back to backlog.
- Re-home T-36 from T-7 (Tier 5 canvas/graph, a mis-parent) to new
  epic T-259 (interaction model — D-47..D-57 surface).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-06 23:21:02 +02:00
jpmschweitzerandClaude Opus 4.8 38058c17f5 add LogRing — bounded retention for Logger records (T-54)
The Logger only live-broadcasts; an output panel opening late would see no
history. LogRing is a drop-oldest sink (default 2000 records) that keeps the
recent window plus per-source and per-level bookkeeping — distinct sources
for the panel's filter dropdown, level counts for the status-bar health
badge. Flutter-free; the dock UI wraps it. First slice of the D-87 dock.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-06 23:10:07 +02:00
jpmschweitzerandClaude Opus 4.8 da61af810d decide D-87 (output/log dock) + resolve Q-28; file T-258 (terminal home)
D-87 — T-54's "output and log panel" is a bottom output dock: read-only,
two tabs (Output = the Logger stream, filterable + auto-scroll; Problems =
diagnostics moved out of the sidebar). Toggled by a single status-bar widget
that replaces the app-status indicator (merged health+log: green check when
clean, warn/error counts otherwise) via click or Cmd/Ctrl+J. Needs a bounded
ring sink on the Logger (no history today). Amends D-47: the dock is the one
surface allowed to push Claude up, capped so Claude stays >=50%.

Resolves Q-28 by splitting on interaction: read-only output (logs/problems)
goes in the dock; the terminal does NOT — it stays a first-class editor-pane
surface, tracked by new T-258 (swap-vs-split, with Q-27). Refines T-54.

Wireframe under docs/design/wireframes/output-dock/.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-06 22:57:18 +02:00
jpmschweitzerandClaude Opus 4.8 d67c2c38d8 frame0 skill: add a "show it inline" workflow step
After exporting a wireframe PNG, Read it back so it renders in the
conversation — the user is designing with you and should see the result
without opening Frame0.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-06 22:16:05 +02:00
jpmschweitzerandClaude Opus 4.8 cba41a7e3b close T-256 and the T-208 "give Claude hands" initiative
All epics done: CLI on PATH (T-209), bootstrap (T-214), workspace
observability (T-218), pull-based events (T-222), plus the MCP surface
(T-225) and dogfood governance (T-224, D-83).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-06 21:53:16 +02:00
jpmschweitzerandClaude Opus 4.8 51cfa15c78 distinguish a dev-tree clide from a packaged install (T-256)
CliInstaller.inspect() gains a devTree state: when `clide` on PATH resolves
to a dev-tree build artifact (native/<plat>/clide, the Makefile's
CLIDE_CLI_BIN output) it's classified separately from a packaged install
rather than silently treated as "installed". needsInstall stays false for a
dev build (it's intentional on a checkout, not a reinstall prompt), and the
launch-time check surfaces it as an info note. install() flags fromDevTree +
notes it in the result message when the copied source is a dev build.

Closes the last open child of the T-208 "give Claude hands" initiative.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-06 21:53:01 +02:00
jpmschweitzerandClaude Opus 4.8 23898c758e close T-225 (clide command surface over MCP)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-06 21:37:53 +02:00
jpmschweitzerandClaude Opus 4.8 0b72e65eca close T-223 + epic T-222 (pull-based event observation)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-06 21:24:52 +02:00
jpmschweitzerandClaude Opus 4.8 1fefd26ef0 activate T-223 + T-225; close stale T-23
T-223 (clide events --since) and T-225 (MCP surface) picked up — both
refined and unblocked by D-85/D-86. T-23 (command palette keybinding) was
ready but already complete per its body; marked done.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-06 21:06:38 +02:00
jpmschweitzerandClaude Opus 4.8 a4b385e3d0 close T-257 (Esc returns to Vim normal mode)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-06 20:58:29 +02:00
jpmschweitzerandClaude Opus 4.8 635ae04dae fix Esc closing the editor instead of returning to Vim normal mode
panel.focusMode.exit is bound to Escape in the contributions layer, which
outranks the active preset. In Vim insert/visual mode that shadowed the
vim preset's `escape → vim.mode.normal` binding, so Esc closed the editor
instead of returning to normal mode.

Add an optional when-clause to a CommandContribution's defaultBinding
(plumbed through to KeymapService.registerCommandBinding, which already
accepts one) and guard focusMode.exit's escape with
`!vim.insert && !vim.visual` — symmetric with vim.yaml's vim.mode.normal.
Esc still exits focus / closes the editor in normal and non-Vim modes.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-06 20:58:14 +02:00
dehlakandClaude 79162818e4 add bug ticket T-257 for Esc closing pane in Vim mode
Pressing Esc to leave insert/visual mode closes the active file/pane
instead of returning to Vim normal mode. The unconditional
escape->dismiss binding in default.yaml shadows the when-scoped
escape->vim.mode.normal binding, contradicting T-207's contract.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-06-06 16:06:29 +02:00
jpmschweitzerandClaude Opus 4.8 b7f3731394 decide D-85 (event bus delivery) + D-86 (MCP tool surface); resolve Q-2/3/32/33
D-85 — event bus delivery semantics, resolving Q-2 + Q-3: bounded
per-subscriber ring buffer with drop-oldest back-pressure (producer never
blocks, subscribers never killed) and a gap marker so a pull reader detects
loss; in-memory cursor retention serves `clide events --since`; if
persistence is ever needed it is bus-owned, not a subscriber-subsystem —
reversing ADR 0006's unreasoned open-questions footer.

D-86 — MCP tool surface, resolving Q-32: expose the full mcp__clide__*
namespace but generate tools/list from the co-registered command registry
(D-74) that already feeds CLI + palette, so breadth costs no second
maintained surface; per-command MCP opt-out for poor-fit verbs.

Q-33 drift-fixed: was already closed by D-73 (SSE only) but the index still
listed it open; re-confirmed SSE-only, stdio/WS not added.

Refines T-223 (cursor pull events) and T-225 (MCP reachable) — both now
unblocked and scoped. Index regenerated by pql decisions sync.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-06 12:25:24 +02:00
jpmschweitzerandClaude Opus 4.8 0c248b0eab file T-256: flag dev-tree vs production clide path for the install affordance
Captured during T-212. The install affordance and `make run` resolve the
dev-tree C client; on a dev machine `clide` on PATH should prefer the
properly-installed production build. Low priority, no user-facing breakage.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-06 12:07:43 +02:00
jpmschweitzerandClaude Opus 4.8 562c17c06d add in-app "Install clide command in PATH" affordance (T-212)
A command-palette / `clide` CLI verb (`clide.installCli`) copies the
bundled C client into ~/.local/bin, VS Code "Install code command" style,
so a user who runs the app without `make install` can still reach the CLI
from a shell. On launch the app detects when `clide` is missing from PATH
or resolves to a stale symlink into the Flutter GUI bundle (the dogfood
footgun: a bare `clide` launched a second app instead of querying the
socket) and notifies with a pointer to the command. `make build` now ships
the C client inside the app bundle so the affordance can self-install from
it; `make run` points it at the dev-tree client via CLIDE_CLI_BIN.

Detection and the copy live in the Flutter-free CliInstaller
(kernel/src/cli_install.dart) so they run under unit tests without a real
install.

Closes epic T-209 (ship the clide CLI on PATH).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-06 12:05:41 +02:00
jpmschweitzerandClaude Opus 4.8 02a19d10f5 file T-255: animate the running… turn indicator
Persist the pql changelog: T-255 (animate the in-flight "running…"
indicator with rotating Claude-CLI-style status verbs), alongside the
other board edits already pending in the changelog (T-253, T-254, and
T-212/T-233 status changes).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-06 11:59:32 +02:00
jpmschweitzerandClaude Opus 4.8 b64028ecf9 reveal non-Claude workspace tabs in a split above Claude
A live test of ui open diff surfaced that the workspace slot hardcoded
the Claude pane (primary = claude ?? active), so activating diff.view
flipped the registry but never rendered. Generalise _WorkspaceSlot: when
a non-Claude, non-editor workspace tab is the active one, reveal it in
the split region above Claude with a close affordance back to full-Claude
— so clide ui open diff actually shows the diff alongside the
conversation. Fixes the reveal for terminal/team-chat tabs too.

Closes T-233.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-06 11:20:02 +02:00
jpmschweitzerandClaude Opus 4.8 870b773381 open a file in the diff panel via clide ui open diff
Adds diff as a fourth ui.open target. The diff extension now retains an
app-scoped DiffController and subscribes to its builtin.diff/selection
channel: a selection reveals the diff tab and focuses the file, which
the view scrolls into view and highlights. Retaining the controller in
the extension (not the view) lets a focus survive the tab being
revealed/remounted, mirroring the ReaderNav viewers.

Closes T-233.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-06 10:50:12 +02:00
jpmschweitzerandClaude Opus 4.8 ba230d4139 revert CLAUDE.md changelog note — now lives in the pql skill
The pql skill (installed by pql, shared across all repos) is the right
home for guidance about the .pql/changelog auto-commit, not this repo's
CLAUDE.md.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-06 10:44:42 +02:00
jpmschweitzerandClaude Opus 4.8 b05f6617d3 file T-252 (lightbox) and close T-248 review
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-06 10:31:29 +02:00
jpmschweitzerandClaude Opus 4.8 b446bd024d add image-viewer card + clide image show verb
Drives an image inline into the Claude conversation log over the same
bus-publish path as ui.toast/ui.open, keeping the dispatcher handler
Flutter-free. The card is display-only per D-78; the verb registers a
CommandSchema so it surfaces in clide capabilities for T-248 discovery.

Closes T-249.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-06 10:22:38 +02:00
jpmschweitzerandClaude 3cf77f40ed make the clide command surface self-describing
Parity guarantees a verb exists for every UI action, but a verb is
unreachable if nothing advertises it. Add `clide capabilities` — it
reflects the live dispatcher registry to JSON (subsystem, verb, arg
schema) so the surface is discoverable and can't drift from what
dispatches. A thin /clide skill points Claude at it rather than
hard-coding a verb list, so new panels become reachable the moment
they register.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-06-06 09:57:16 +02:00
jpmschweitzerandClaude 13187d3994 reflect permission-mode changes in the status line
setPermissionMode only wrote the control_request; the mode was never
folded back into the session status, so the badge and Ctrl/Cmd+M looked
dead. Optimistically merge + emit the new mode immediately; the next
system/init still reconciles.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-06-06 09:49:08 +02:00
jpmschweitzerandClaude 0e85f7f5e7 fuzzy-match + recency-rank the command palette
Completes the command-palette acceptance: the filter is now a
subsequence fuzzy match (was substring), and recently-invoked commands
float to the top and break score ties. The subsequence matcher is
extracted to a shared fuzzy helper so the palette and quick-open file
finder use one implementation instead of a private copy each.

Pinned commands and cross-session recency persistence are left as a
follow-up (they need a pin affordance + settings storage).

Co-Authored-By: Claude <noreply@anthropic.com>
2026-06-06 09:40:56 +02:00