Commit Graph
780 Commits
Author SHA1 Message Date
jpmschweitzerandClaude Opus 4.8 b680df2b24 T-310: numpad digits select prompt-card options
The prompt card's number-key shortcuts matched only digit1..digit9
(the number row); numpad 1-9 fell through to ignored. Add a
parallel _numpadKeys list and check it in _onKey so the keypad
maps to the same 1-9 selection for Allow/Deny and question
options. numpadEnter was already handled. The hasPrimaryFocus
guard still lets digits type into a focused note field.

Adds four widget tests (numpad Allow/Deny, question option,
focused-note swallow). Closes T-310 (under UI epic T-276).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-10 12:07:35 +02:00
jpmschweitzerandClaude Opus 4.8 cb86346234 file T-311: permission card 'Deny & simplify' option
Filed under UI epic T-276. Adds a fourth permission-card option:
a deny carrying a preformatted note asking Claude to retry the
action in a simpler format, with an explicit clause not to add a
memory or rewrite permission config (avoids continuous fiddling
with the permission surface). Working label 'Deny & simplify',
tooltip via ClideButton's existing tooltip param. Captures the
escalation-in-context design note. Persisting the changelog.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-10 11:56:29 +02:00
jpmschweitzerandClaude Opus 4.8 bbf1c84fd2 T-307: gate frame0-wireframe skill on per-screen approval
The Core Workflow ran straight through and tended to fan out a
whole set of screens unprompted. Reframe it as a design
conversation: author one screen, show it, then STOP for explicit
user approval before building the next (loop back to step 2 per
screen). Multi-screen requests become a one-at-a-time queue.

Closes T-307 (under UI epic T-276).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-10 11:41:57 +02:00
jpmschweitzerandClaude Opus 4.8 9619613d4e document the conversation-panel card model in the ui-design skill (T-305)
Capture the three card categories (dialog / simple / collapsible), the
ClideCollapserCard rules, and the shared card-spacing constants so future
conversation-panel work follows the settled model. Closes T-305.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-10 11:41:24 +02:00
jpmschweitzerandClaude Opus 4.8 a73f0485c3 route every tool use through the collapser (T-305 P3)
Every tool use now renders as a ClideCollapserCard over a one-item list
(a single tool is a list of one) — no separate single-card path. The
collapser carries the echoed last line, the count, and the aggregate
status (spinner while in-flight, check/cross once resolved); the inner
content card holds the call body + folded CALL/PROMPT/RESULT segments and
its own per-item mark. Inside a run (activity/edits/agent), tools render
as the bare inner content card so collapsers don't nest.

ConversationCard gains a `margin` param so inner cards carry no stream
margin; the collapser pads its inner canvas evenly on all sides (the
inner card no longer jams under the header). Rewrote the conversation_view
tests for the new structure and added a single-tool golden.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-10 11:39:38 +02:00
jpmschweitzerandClaude Opus 4.8 24739b0515 file T-310: numpad digits should select prompt-card options
Filed under UI epic T-276. Prompt-card number shortcuts only
match the top number row (_digitKeys = digit1..digit9); numpad
1-9 fall through. numpadEnter is already handled, so numpad
parity is partial. Persisting the ticket changelog.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-10 11:39:09 +02:00
jpmschweitzerandClaude Opus 4.8 46edc258e6 file T-309: lightbox click-outside-image should dismiss
Filed under UI epic T-276. Clicking the dimmed area beside a
smaller-than-94% image doesn't close the lightbox today — the
host backdrop only reaches the 6% margin. Persisting the ticket
changelog (no code change to piggyback on).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-10 11:37:46 +02:00
jpmschweitzerandClaude Opus 4.8 10a714e2c5 file T-308: surface Claude's task list docked above the input pane
Claude's TodoWrite/TaskCreate task list is currently neither parsed
(transcript_reader skips the event) nor rendered — invisible to the user.
Ticket covers modelling it from the transcript and docking a compact,
collapsible, display-only list directly above the composer in the Claude
conversation view. Filed under the UI epic T-276.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-10 11:28:11 +02:00
jpmschweitzerandClaude Opus 4.8 c53e53be91 align board: close 7 completed tickets stuck in active/ready
Bookkeeping only — these all had DONE/FIXED completion notes (and landed
commits) but were never transitioned off in_progress/ready:

  T-29   editor respects .editorconfig (d5da614)
  T-292  pty session_test flake — serial pty pass (0231cb4)
  T-236  pasted-image @path thumbnails (7fb1a10)
  T-254  pasted-image inline render — closed with T-236 (7fb1a10)
  T-241  ultrawide widget-test coverage (1411e19)
  T-253  clickable conversation links (1e8e37c)
  T-293  per-repo theme persistence (e7cbdcd)

Review queue is now empty; no open work left in active/ready.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-10 10:58:05 +02:00
jpmschweitzerandClaude Opus 4.8 cf36eca4e5 migrate group cards onto ClideCollapserCard; retire ClideHolderCard (T-305)
The activity run, edit run, and sub-agent run cards now render through the
shared ClideCollapserCard primitive instead of ClideHolderCard. The
collapsed ticker now leads with the card label, the count sits in a
fixed-width slot, and the status tick is pinned to the right edge.

ClideHolderCard (T-266) is fully superseded — removed along with its test
and golden; the deeper-control-passthrough coverage moved to the
ClideCollapserCard widget test.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-10 10:57:01 +02:00
jpmschweitzerandClaude Opus 4.8 9ed2475fe1 add ClideCollapserCard primitive + shared card metrics (T-305)
First slice of the conversation-panel card unification. Adds the
category-3 collapser primitive (lib/widgets/): a list of 1..N inner item
cards, collapsed ticker <-> expanded framed inner canvas, with the agreed
chrome — color drives the border + chevron/label tint, a fixed-width
counter slot, the status icon hard against the right edge, chevron hard
against the left edge, background + caret toggle (D-78 tail-follow). The
aggregate status/count/echoed-title are caller-computed, so the widget
stays free of conversation semantics; inner items keep their own per-item
status.

Also adds clide_card_metrics.dart — shared spacing constants (gap, radius,
header padding, counter slot width) for all three card categories.

Not yet wired into the stream (no user-visible change); migration of the
group/tool cards follows. Widget test + golden included.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-10 10:52:27 +02:00
jpmschweitzerandClaude Opus 4.8 8cc238cb75 file tickets T-306/T-307 for context-card + frame0 approval gate
T-306: card the injected "context" conversation block to match the
collapser-card frame the rest of the tool/group cards use, keeping the
D-78 muted/collapsed de-emphasis.

T-307: gate the frame0-wireframe skill on user approval after each shown
screen — wireframing is a design dialogue, not a batch generation run.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-10 10:18:13 +02:00
jpmschweitzerandClaude Opus 4.8 ef09441eb4 file T-305: unify collapser cards + wireframe
Two collapser-card families (ClideHolderCard group container, T-266; the
ConversationCard merged tool card, T-262) attach collapse differently and
render inconsistent header chrome — status mark placement, no fixed
counter slot, color knob on one but not the other. File T-305 (under the
T-276 UI tracker) to extract one ClideCollapserCard primitive both grab:
a `color` for border/text fidelity, a fixed-width counter slot, and the
status icon hard against the card edge.

Adds the Frame0 wireframe (collapsed color variants + expanded nested
cards) at docs/design/wireframes/cards/collapser-card.{json,png}.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-10 10:17:49 +02:00
jpmschweitzerandClaude Opus 4.8 ceaa8392d7 serialize real-pql tests to fix parallel db contention
The pql integration tests (test/pql/client_test.dart) and pql.* daemon
handler tests (test/daemon/pql_commands_test.dart) each spawn a real
`pql` process against the shared on-disk .pql/pql.db. In the parallel
test pool, concurrent invocations contend for the SQLite lock and flake
with PqlException(69) (db busy) — surfaced reliably by the pql 1.10
record_id migration. They pass one-at-a-time, so isolation is the fix.

Tag both files @Tags(['serial']) and add a --concurrency=1 serial pass
to ci/test_core.sh (pty + serial together), mirroring ci/test.sh's
existing serial handling. The error-path companion uses a fake binary,
so it stays parallel.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-10 10:01:15 +02:00
jpmschweitzerandClaude Opus 4.8 2b59598894 migrate ticket changelog to record_id identity (D-26)
Rewrites the committed .pql/changelog/ from the old T-NNN-keyed format to
the record_id identity model (pql 1.10.0, D-26): tickets keyed by a ULID
record_id, the friendly T-NNN in ticket_idmap, references and hashes
recomputed. Produced by the one-off cmd/migrate-ids in the pql repo.

Other clones: install pql >= 1.10.0, then rm .pql/pql.db && pql plan
rebuild to regenerate the local DB from this changelog.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-10 09:27:35 +02:00
jpmschweitzerandClaude Opus 4.8 301b6becf4 un-quarantine app_test open-folder hang (T-280)
The "Open Folder on a non-repo path" widget test wedged the runner ~10
minutes on a _RawReceivePort teardown hang. Root cause: project
validation shelled out to `git rev-parse` via Process.run, whose exit
ReceivePort leaks under the fake-async widget-test harness.

The KernelFixture now injects a pure-Dart `.git`-walk validator
(synchronous existsSync/typeSync, no native port), so the open-folder
flow is subprocess-free. Un-skipped the test and scoped the switcher
tap to the hat-bar ClideTappable to disambiguate it from the welcome
overlay's "clide" wordmark.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-09 23:43:16 +02:00
jpmschweitzerandClaude Opus 4.8 76346122aa fix bottom input box alignment when status bar hidden (T-298)
The composer (and any bottom-most pane content) ran flush into the
window's bottom resize-drag strip when the status bar was hidden, since
the bar normally covers that edge. Reserve ClideResizeBorder.edgeThickness
as a bottom inset in RootLayout whenever the status bar is not visible, so
the interaction zone bottom-anchors consistently either way.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-09 23:36:13 +02:00
jpmschweitzerandClaude Opus 4.8 cbeb2c2d5a fix T-287: silence GTK file-chooser GLib-GIO-CRITICAL noise
Root cause (confirmed by standalone reproducer): the Open Workspace
folder picker. GTK's GtkPlacesSidebar enumeration inside
gtk_file_chooser_dialog_new(SELECT_FOLDER) builds GFileInfo objects
without standard::size, then calls g_file_info_get_size() — a
GTK-internal bug that emits a GLib-GIO-CRITICAL pair on every pick.
Ruled out the T-138 clipboard channel.

Two-part fix:
- Switch pickDirectory to GtkFileChooserNative (portal-backed; runs
  out-of-process and silently in sandboxed/Flatpak builds).
- Install a narrowly-scoped GLib-GIO log handler that drops only the
  "g_file_info_get_size / without standard::size" message and forwards
  every other GLib-GIO critical untouched — the universal fix for the
  non-sandbox fallback path.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-09 23:21:59 +02:00
jpmschweitzerandClaude Opus 4.8 ace13b36b7 note T-56 security redesign (D-90)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-09 22:57:53 +02:00
jpmschweitzerandClaude Opus 4.8 7171a09fc2 gate clide:// deep links: paranoid allowlist + confirmation prompt (T-56, D-90)
A clide:// link is an untrusted external vector (any webpage can fire one), so it
no longer translates to a command in parseArgv. It routes the raw URL to a new
builtin.deeplink handler that is doubly defensive: a default-deny allowlist
(kDeepLinkSafeActions — only the read-only 'open' verb; run/git/write/passthrough
rejected) AND a mandatory 'an external link wants to: … allow?' confirmation
before anything runs. Records the security boundary as D-90.

The earlier silent editor.open passthrough is replaced; open still works, now
behind the prompt. Tests cover the allowlist (the boundary) + the gating.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-09 22:57:43 +02:00
jpmschweitzerandClaude Opus 4.8 2791776ab7 close T-56 (Linux deep links); file T-303 (macOS delivery follow-up)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-09 22:41:45 +02:00
jpmschweitzerandClaude Opus 4.8 4057286632 clide:// deep link handler — open files at a line (T-56)
clide://open?path=&line= translates (in parseArgv) to editor.open, so an OS
scheme invocation routes through the existing CLI→IPC path into the running
window — single-instance for free, no new code path. Registered the scheme:
linux/clide.desktop MimeType x-scheme-handler/clide (Exec already passes %U) and
macOS Info.plist CFBundleURLTypes. Parser validates the action/path/line.

Linux works end to end (the OS passes the URL as argv). macOS URL DELIVERY (the
AppDelegate openURLs callback → forward into this path) is a follow-up — the
scheme is registered, but the native hook needs a real macOS machine to verify,
so it's not shipped blind. Also drops a stray import in clide_markdown_test.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-09 22:41:00 +02:00
jpmschweitzerandClaude Opus 4.8 1411e19ab4 ultrawide layout test coverage + shared setSurfaceSize helper (T-241)
Add setSurfaceSize(tester, width) to the widget harness — the reusable way to
test width-sensitive layout at an ultrawide surface (a wide SizedBox under the
default 800px surface is clamped, so the view's physicalSize must be set), the
foundation T-241 asked for.

Ultrawide cases on the surfaces most prone to width-proportional bugs (the T-239
class): ClideMarquee stays static when a line fits a 3440 slot (it was only
tested narrow); the quick-open palette stays width-capped, not stretched edge to
edge. The status bar already covers 600+3440 (T-239).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-09 22:34:16 +02:00
jpmschweitzerandClaude Opus 4.8 7d8f58690f number-key + Enter shortcuts for interactive prompt buttons (T-240)
In a ToolPromptCard, number keys pick the matching button/option (labels are
prefixed 1./2./3.…) and Enter confirms the primary action — matching the Claude
CLI. Permission: 1=Allow, 2=Allow&remember (when offered) else Deny, 3=Deny.
AskUserQuestion: 1..N select/toggle the current question's options + Other.

The card autofocuses and the key handler self-guards on hasPrimaryFocus, so once
the user clicks into a note field the digits type normally and never fire a
button. Shared the permission/option actions between the buttons and the keys.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-09 22:27:08 +02:00
jpmschweitzerandClaude Opus 4.8 1e8e37c6f9 clickable http links in the Claude conversation; bundle markdown hooks (T-253)
http(s) links (typed or autolinked) in the conversation now open via the OS URL
handler (OsBridge.openURL) on click, with a hover underline + pointer; non-http
schemes stay inert. Works across prose, lists, tables, and headings.

Refactor: ClideMarkdown's growing set of inline-interaction callbacks
(onRecordTap, onImageToken, onLinkTap) is bundled into one ClideMarkdownHooks
value threaded as a single param — no more per-callback threading, and the hooks
now reach every context uniformly (links/images previously only worked in some).
The public widget API is unchanged.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-09 22:16:57 +02:00
jpmschweitzerandClaude Opus 4.8 dc8ae0beaa file T-300 + T-301 (clickable + repo-relative file refs in Claude convo)
Both under the UI tracker epic T-276. T-300: linkify file-path
references in the conversation so they open in the editor via
`clide editor open`. T-301: show in-repo paths relative to the repo
root — design open, needs discussion.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-09 22:09:34 +02:00
jpmschweitzerandClaude Opus 4.8 86a52cd731 finish T-235 (persisted activity fold level); close T-132 via Q-34
T-235: app-scoped kActivityFoldLevelKey + a claude.activity.fold-level command
that cycles none→tools→thinking→everything; ClaudePane + team_panel_host read it
and re-fold live via the settings notifier. Unit tests for the helpers.

T-132 cleanup: the one blocked item (account/team token budget) is detached
(T-158), reframed as Q-34 'how + when to surface the budget given upstream
doesn't expose it', with T-158 as its backlog resolver. T-132 closed — all
doable work delivered.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-09 19:24:19 +02:00
jpmschweitzerandClaude Opus 4.8 eb7b738c17 correct T-132 status: in_progress (delivered bar T-158/T-235), not superseded
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-09 19:06:53 +02:00
jpmschweitzerandClaude Opus 4.8 548e3e17e8 pin collapse toggles to the status-bar screen edges + flip chevron live (T-294)
Two fixes to the just-shipped collapse toggles:
- They lived inside the centre StatusbarHost, so they shifted when a pane
  collapsed and the bar resized. Move them to the OUTER status-bar row ends
  (screen edges) so they stay put. StatusbarHost reverts to its prior layout.
- The toggle was a const widget that read isCollapsed in its own build; Flutter
  skips identical const children on rebuild, so the chevron never flipped. Pass
  collapsed/visible in from the parent's arrangement listener so it rebuilds and
  the chevron tracks the action direction. A 'flips live' test now guards it.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-09 18:54:46 +02:00
jpmschweitzerandClaude Opus 4.8 c35bb50c0c file T-299 + remove gemini-report.md
Salvage the report's only actionable content — automate Dart osv-scanner
and native SHA256 verification in CI — into T-299, then drop the stray
root-level analysis doc (the rest was praise + an exploration trace;
recoverable from history at bf4b6be).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-09 18:43:02 +02:00
jpmschweitzerandClaude Opus 4.8 0536c48b97 trim T-296/T-236 changelog bullets under the 60-word cap
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-09 18:40:36 +02:00
jpmschweitzerandClaude Opus 4.8 d7de14800d close T-294, T-296, T-297 (status-bar toggles, edit grouping, re-scroll)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-09 18:35:01 +02:00
jpmschweitzerandClaude Opus 4.8 407ed25ab0 group consecutive same-file edits into one collapsed card (T-296)
A run of 2+ consecutive edits to the same file now folds into one ClideHolderCard
labelled '# edits' (coalesceEditRuns, run after groupConversation) instead of a
stack of cards; a different file or an interleaving step splits the run. Every
edit stays reachable on expand.

The holder gained an optional aggregate status. New owned primitives: ClideSpinner
(the logo mark, monochrome, 3D Y-axis rotation, reduced-motion-aware) and
ClideStatusIndicator (running→spinner / success→check / error→cross, with an
AnimatedSwitcher seam for a richer transition later — kept self-contained, not
built on ConversationCard's mark). The activity card shares the same indicator.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-09 18:34:27 +02:00
jpmschweitzerandClaude Opus 4.8 6efb3b5d2b re-anchor the conversation tail when the bottom input zone resizes (T-297)
When the interaction zone grows/shrinks (composer ↔ permission prompt /
AskUserQuestion, D-78) the conversation viewport changed height but the scroll
offset didn't follow, leaving the last card hidden behind the taller box. Track
whether the view is pinned to the tail; a LayoutBuilder around the list detects
the viewport-height change and re-jumps to the bottom only when pinned, so a
scrolled-up reader is undisturbed.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-09 18:22:14 +02:00
jpmschweitzerandClaude Opus 4.8 3414db148a add status-bar collapse toggles for sidebar + context pane (T-294)
Fixed ~24px caret-line cells bookend the status bar (left=sidebar, right=context);
chevron flips per arrangement.isCollapsed (inward=collapse, outward=expand) and
fires the existing sidebar.collapse / context.collapse commands — the mouse
affordance for the already keyboard/CLI-addressable action (D-6). Visual only;
no new collapse logic. Status items shift 28px inward for the reserved cells.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-09 18:19:30 +02:00
jpmschweitzerandClaude Opus 4.8 2f9159606f file T-298: bottom input box misaligned when status bar is hidden
Composer/prompt box alignment depends on the status bar being present;
with it hidden the box sits weird. Should bottom-anchor independently.
Filed under T-276.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-09 18:06:47 +02:00
jpmschweitzerandClaude Opus 4.8 adbd8e285a harden SettingsStore against notify-after-dispose for fire-and-forget writes
set() doesn't await its file write, so a write in flight when the store is
disposed (app shutdown, or a closing test) would assert on a disposed
ChangeNotifier. Skip the post-write notify once disposed via a _disposed guard +
_safeNotify. Surfaced by the T-293 theme-persistence test flaking under the
loaded parallel run; also the correct behaviour for graceful shutdown.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-09 18:05:53 +02:00
jpmschweitzerandClaude Opus 4.8 24364e6329 file T-297: conversation doesn't re-scroll when bottom input resizes
When the interaction zone (D-78) grows for a permission / AskUserQuestion
prompt, the conversation viewport shrinks but the scroll offset isn't
adjusted, so tail content hides behind the box. Filed under T-276.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-09 18:01:20 +02:00
jpmschweitzerandClaude Opus 4.8 7fb1a10982 close T-236 + T-254 (inline pasted-image thumbnails, D-89)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-09 17:55:24 +02:00
jpmschweitzerandClaude Opus 4.8 529f40996d render pasted images inline with lightbox expansion (T-236, T-254, D-89)
A pasted-image @<path> token now renders as an inline, keyboard-activatable
thumbnail in the Claude conversation that opens the full image in the lightbox;
the composer's attachment chips use the same (larger, 44px) thumbnail. New
ImageThumbnail + openImageLightbox in the Claude layer; ClideMarkdown gains an
onImageToken builder seam (mirroring onRecordTap) that drops a WidgetSpan into
the text flow — it owns no Image.file/lightbox, staying generic. Missing files
degrade to a placeholder; render-only (the sent text + copyText are unchanged).

Resolves the conflicting T-236 (inline thumbnail) / T-254 (image card) designs
into the hybrid the user chose; recorded as D-89.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-09 17:54:55 +02:00
jpmschweitzerandClaude Opus 4.8 6f67757240 T-296: spec live status tick — spinner while editing, check when each lands
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-09 17:46:12 +02:00
jpmschweitzerandClaude Opus 4.8 1d160a0bd2 T-296: add worked example (clide_markdown.dart run -> 3 edits / 2 steps / 7 edits)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-09 17:45:20 +02:00
jpmschweitzerandClaude Opus 4.8 57755ac676 file T-296: group consecutive same-file edits into one collapsed card
Bundle subsequent edits to the same file into a single ClideHolderCard
(reusing the T-230/T-266 folding), labelled "# edits" instead of
"# steps", with every per-edit report preserved on expand. Under T-276.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-09 17:44:07 +02:00
jpmschweitzerandClaude Opus 4.8 5c6674d739 persist the chosen theme per repo across loads (T-293)
ThemeController.select() applied live but never persisted, so every restart reset
to the first bundled theme. Add wireThemePersistence (facade): on theme change
write app.theme (global default) + project.theme (the open repo's
.clide/settings.yaml); on settings change — notably when a repo opens and its
project values load — restore the most specific saved theme (project then app).
The name encodes the -hc variant so high-contrast persists; an unknown/removed
theme is ignored so a stale value can't wedge startup.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-09 17:36:04 +02:00
jpmschweitzerandClaude Opus 4.8 af39f5b98a T-294: resolve placement — toggles fixed at status-bar ends (design final)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-09 17:34:18 +02:00
jpmschweitzerandClaude Opus 4.8 8cc88bf7f9 T-294: glyph decision — Phosphor caret-line-left/right (0xe132 / 0xe130)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-09 17:33:22 +02:00
jpmschweitzerandClaude Opus 4.8 81e98bf3f3 T-294: fixed-end status-bar placement variant + space-reservation note
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-09 17:31:46 +02:00
jpmschweitzerandClaude Opus 4.8 ccd6b6174c flag T-294 ready — status-bar collapse-toggle design approved
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-09 17:29:19 +02:00
jpmschweitzerandClaude Opus 4.8 da3043308a T-294: move collapse toggles into the status bar
Revise the mock — toggles no longer float on the pane edges; they live in
the bottom status bar, pinned to the center pane's left/right edge so each
slides to the far end when its pane collapses.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-09 17:28:24 +02:00
jpmschweitzerandClaude Opus 4.8 0c44bd25f3 file T-295: clide image show is not tab-aware (opens in primary tab)
Bug found while showing a wireframe during T-294 — image-show renders into
the primary tab regardless of the active tab. Filed under T-276 UI epic.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-09 17:26:07 +02:00