Commit Graph
659 Commits
Author SHA1 Message Date
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 ed97867a60 animate the running turn indicator with rotating verbs (T-255)
The static gray `running…` gave no sense anything was happening. Replace it
with a RunningIndicator: an animated ellipsis (Pondering → . → .. → ...) and a
curated, on-brand verb that rotates every few seconds (Pondering, Conjuring,
Brewing, …).

The verbs are clide-owned, not the Claude Code CLI's — that list is a TUI
cosmetic the stream-json protocol doesn't surface, and reusing the bundled
strings is a licensing gray area, so a curated list keeps us self-contained
(own-the-rendering-stack, D-75). Animation is driven off a single
AnimationController's value (no timers) so tests advance it with bounded
pumps; reduced-motion shows a static verb and the a11y label stays stable.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 10:51:02 +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 2f14d95010 drop an unused import in dock_status_item_test (T-54 follow-up)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 09:59:14 +02:00
jpmschweitzerandClaude Opus 4.8 49f480481a wire the output dock into the layout — toggle, tabs, persistence (T-54)
The D-87 bottom dock, end to end. New Slots.dock in the classic preset
(hidden by default); RootLayout renders it full-width above the status bar
when open, capped at half the window so Claude stays largest (the D-47
amendment). LogRing now lives on KernelServices (boot tees the kernel logger
into it; main.dart also tees the IPC/MCP logger), so the dock shows logs from
every subsystem.

OutputExtension contributes the Output tab, the merged health/toggle
status-bar widget (green check when clean, warn/error counts otherwise) that
replaces the old ipc-status item, and the dock.toggle command (Ctrl+J).
Problems moves out of the sidebar into the dock. open/height persist per
workspace via the default-layout extension.

Drag-resize of the dock height is deferred (DragResizeHandle needs a dock
sign case); height is the persisted default for now. Boot verified via
testmode; full suite green.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 09:58:29 +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 b0c9e9fccd add Output dock tab — filterable, auto-scrolling log view (T-54)
OutputController wraps a LogRing with source/level/text filter state;
OutputView renders the filtered rows (time · level · source · message,
severity-colored), follows the tail with a jump-to-latest pill when scrolled
up, and offers source/level cycle chips + Clear. Second slice of the D-87
dock — the component is standalone + tested; the dock shell, the merged
status-bar toggle widget, and moving Problems in are the next slices, where
this gets wired to a bottom slot.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-06 23:24:51 +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 74cb60f1e3 frame0 skill: prefer clide image show for inline display inside clide
A bare Read only renders the PNG in the transcript; inside clide the proper
way to put an image in the conversation is the clide image show verb (T-249),
which renders a native image card in the live Claude pane.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-06 22:22:07 +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 9cb7da3f57 format mcp_server_test (T-225 follow-up)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-06 21:38:18 +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 2ac1603b55 expose the clide command surface over MCP (T-225)
External MCP clients (Cursor, Windsurf, Copilot) can now drive clide. The
MCP server's tools/list is generated from the co-registered command+schema
registry (D-74) that already feeds the CLI and palette — the full
mcp__clide__* namespace with no hand-maintained second surface (D-86). Each
command's CommandSchema maps to a JSON-Schema inputSchema; tools/call routes
mcp__clide__<cmd> to dispatcher.dispatch and renders the IpcResponse as MCP
content (data as JSON, errors with isError).

register() gains a mcpExpose flag (default true); pane.tail opts out as a
poor request/response fit. tail/events are server-intercepted so they're
naturally absent. The two /ide stubs (getDiagnostics, executeCode) are left
as stubs — making them real (analyzer hook, Jupyter eval) is out of scope
per the ticket. Transport unchanged (SSE, D-73).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-06 21:37:38 +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 d6dccd841b add cursor-based pull events: clide events --since <cursor> (T-223)
The one-shot request/response complement to the never-returning
`tail --events` stream — what an agent poll loop wants. The IPC server now
keeps a single global, arrival-ordered event log keyed by a monotonic
cursor (alongside the per-subsystem replay ring), bounded by eventLogDepth
with drop-oldest back-pressure (D-85: producer never blocks).

`clide events [--since <cursor>] [--filter X]` returns events after the
cursor, a high-water `cursor` to poll from next, and `gap: true` (+
oldestCursor) when the requested cursor predates the retained window so a
caller detects loss instead of silently missing dropped events. Repeated
polls neither drop nor duplicate. No on-disk persistence.

`events` is handled in the IPC server like `tail` (not the dispatcher);
added to the argv umbrella set. bindingWhen/CommandContribution untouched.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-06 21:24:34 +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 f0fa602ff4 add friction.md install/setup log
Running newest-first log of install and environment friction, seeded
with the pql hooks issue: pql init wrote delegators into .git/hooks
while core.hooksPath was unset, silently disabling the repo's pre-push
gate. Documents the make-hooks fix and the pql-init pitfall.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-06-06 16:06:37 +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 bc81b0561e cover diff_view hunk/line rendering and error/empty states
Restores the coverage floor (94.85% → 95.19%). The diff-panel work landed
with diff_view.dart at 59% — the hunk header, the addition/removal/context
line rows, the new/deleted/renamed/binary metadata, and the error and
empty-state branches were never exercised. Adds four widget tests over an
injected controller; diff_view.dart goes 59% → 96%.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-06 13:12:49 +02:00
jpmschweitzerandClaude Opus 4.8 f63ab521f1 cover the cli-install env fallback and stale-GUI activation paths
Adds the two missing cases that left lib/kernel/src/cli_install.dart:74
(default-environment constructor branch) and the builtin extension's
stale-GUI activation warning uncovered.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-06 12:59:48 +02:00
jpmschweitzerandClaude Opus 4.8 9bdab1d2d3 trim T-212 changelog bullet under the 60-word gate
The Install-clide-command entry ran to 105 words; the rationale and the
stale-symlink detail live in the commit body and D-83/T-212. Keep the
changelog line to user-facing impact.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-06 12:52:07 +02:00
jpmschweitzerandClaude Opus 4.8 9be75d5592 clean-house: fix 37 stale DQR cross-links; sort architecture.md decisions
clean-house sweep over governance/ (validate green, 0 broken refs before
and after):

- RULE-ANCHOR-DRIFT (37): rewrote inline cross-reference links left over
  from before the decisions/questions/rejected subdir split — flat naming
  (questions-architecture.md, questions-process.md, rejected.md) and bare
  same-dir paths that were actually cross-type — to canonical
  subdir-relative form with current slugs. pql resolved these by ID so they
  were never broken to the tooling, only to GitHub anchor navigation.
- RULE-RECORD-SORT (1): reordered decisions/architecture.md D-records to
  strictly ascending (the D-1..D-6 block had been appended after D-41); pure
  block move, line count unchanged, content identical.
- RULE-FILE-OVER-THRESHOLD: deferred (architecture.md 435 > 350; splitting
  would re-churn the anchors just fixed).
- EOF/whitespace and Q↔D backlinks clean.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-06 12:50:27 +02:00
jpmschweitzerandClaude Opus 4.8 526daed237 sweep stale DQR anchor slugs to canonical (em-dash → double-hyphen, retitled records)
Fixes 11 distinct inline anchor slugs that drifted from the generated
canonical form: em-dash titles render `--` (single-hyphen links were stale),
plus several truncated/old slugs (D-5, D-10, D-21, D-39, D-40, D-43, D-68,
Q-1, Q-32, Q-33). pql resolves cross-refs by ID so these were never "broken"
to the tooling, but they'd fail GitHub markdown anchor navigation. Verified:
every inline anchor now matches the README index; pql decisions sync reports
0 broken refs.

Does NOT touch the separate stale-path class (flat `questions-*.md` /
`rejected.md` naming from before the DQR subdir split) — surfaced for a
follow-up.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-06 12:33:51 +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 2be3a20b92 note the pql changelog auto-commit in CLAUDE.md
Shared guidance so agents on any machine stop narrating that a ticket
change leaves .pql/changelog uncommitted — a local-memory note only
helped this system.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-06 10:33:35 +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
jpmschweitzerandClaude 968c3dbfa8 promote the Ctrl+K theme picker into a Settings modal
The status-bar popover already handles quick theme switching, so a
separate theme-only modal was redundant. Repurpose it as a general
Settings surface whose first (currently only) section is Appearance:
base themes, sorted, with a High-contrast toggle for -hc siblings,
reusing the theme_families helpers shared with the popover.

Command id stays theme.pick (the welcome theme-link and tests
reference it); only the title and the view it opens change.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-06-06 09:32:20 +02:00
jpmschweitzerandClaude ffd22069a7 mark T-239 done in plan changelog
Ticket was fixed and pushed earlier but left in_progress; persist the
done transition that only lived in the local pql.db.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-06-06 08:48:22 +02:00
jpmschweitzerandClaude Opus 4.8 cbea0b4fcd file tickets: compaction-progress UI + pane-list subject + socket hygiene
Persist three new tickets to the planning changelog:
- T-244: Claude pane shows no UI/status-bar progress while compacting (D-77)
- T-246: pane list omits the loaded subject; CLI can't tell which
  ticket/decision/file a detail pane shows (D-6)
- T-247: clide CLI ignores CLIDE_SOCK and auto-discovers; stale sockets
  orphaned in the runtime dir (D-6)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-05 23:31:19 +02:00
jpmschweitzerandClaude Opus 4.8 62c6a60ec7 add clide ui toast — raise a toast from the CLI (T-245)
The drive-half complement to the toast system (D-6 parity, like ui.open):
`clide ui toast "msg" [--severity success|warning|error|info] [--duration MS]`
publishes a message on the kernel MessageBus 'toast' channel, which the
ToastService consumes — so a hosted Claude session or any script can surface
"done/failed" on the user's screen. The channel literal is kept in ui_command
(not imported from the kernel) so the daemon command stays Flutter-free.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-05 23:30:46 +02:00
jpmschweitzerandClaude Opus 4.8 1f09abcfd7 add toast notification system (T-50)
Non-modal operation-feedback toasts, bottom-right: a ClideToast card per
severity (success/warning/error/info), auto-dismiss (errors linger), queue
with a visible cap, slide+fade in, manual dismiss, live-region a11y.

ToastService is a MessageBus consumer — components raise a toast by publishing
to the 'toast' channel (publishToast helper), so emitters stay decoupled from
the UI. GitController's push/pull are the first emitters. ToastOverlay mounts
in the app-root Stack.

Also adds comprehensive GitController coverage: importing it for the toast
emitter test first pulled the whole file into the coverage denominator, so the
controller is now tested end to end (status/stage/commit/stash/push/pull).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-05 23:14:42 +02:00