Commit Graph
153 Commits
Author SHA1 Message Date
jpmschweitzerandClaude Opus 4.6 fc23f4b953 re-render taskbar icons from 2048px master
SVG rendered at 2400 DPI to 2048px master, then downsampled to
1024/512/256/192/128/48/32/16. Crisper edges at all sizes.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-23 10:01:27 +02:00
jpmschweitzerandClaude Opus 4.6 0b1596c551 add taskbar icon with dark circle background
Logo SVGs made square (160x160). New onbackground variant has the
clide logo on a #20202C filled circle. Rendered at 1024px and
downsampled to 256/128/48 for crisp taskbar icons. Native runner
loads clide-taskbar-256.png instead of the bare logo.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-23 10:00:25 +02:00
jpmschweitzerandClaude Opus 4.6 6314ce4ad1 resolve window icon relative to executable path
The relative path failed because flutter run's cwd differs from
the bundle directory. Now reads /proc/self/exe to find the binary
location and builds the icon path from there.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-23 09:50:21 +02:00
jpmschweitzerandClaude Opus 4.6 fa0adb0998 fix mouse jumping: query GDK pointer position at call time
Flutter's globalPosition is window-relative, not screen-absolute.
Now using gdk_device_get_position() on the native side to get
the actual screen coordinates at the moment startDrag/startResize
is called. Dart no longer passes coordinates — the native handler
queries the pointer directly.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-23 09:47:44 +02:00
jpmschweitzerandClaude Opus 4.6 5debc57d31 restore GDK_BACKEND=x11 for KDE Wayland frameless
The KDE server-decoration protocol negotiation compiles and runs
but KWin still applies SSD. XWayland remains the only reliable
path on KDE Wayland + GTK3. The native protocol code stays in
place for when KWin or GTK behavior changes. Q-031 tracks this.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-23 09:43:11 +02:00
jpmschweitzerandClaude Opus 4.6 c65cc6bc99 remove xdg-decoration leftovers, add make build-check
The xdg-decoration protocol files caused a linker error
(xdg_toplevel_interface undefined) since we switched to the KDE
server-decoration protocol. Removed. Added make build-check
target that runs flutter build linux to catch native compilation
failures that flutter test misses.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-23 09:41:35 +02:00
jpmschweitzerandClaude Opus 4.6 3e40eb6126 ship prebuilt ptyc in native/linux-x64/
Prebuilt ptyc binary sits alongside libtree-sitter.so in the
platform-specific native directory. Resolution order:
native/linux-x64/ptyc → ptyc/bin/ptyc → ~/.local/bin/ptyc → PATH.
Eliminates the make ptyc-build step on fresh clones.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-23 09:35:12 +02:00
jpmschweitzerandClaude Opus 4.6 db550d6829 use KDE server-decoration protocol for native Wayland frameless
Replace xdg-decoration (needs xdg_toplevel, GTK3 doesn't expose it)
with org_kde_kwin_server_decoration (works with wl_surface which
GDK provides). On KDE Wayland: binds the manager from the registry,
creates a per-surface decoration object, requests mode=None (0).
Falls back gracefully on GNOME (protocol not present, GTK's
set_decorated(FALSE) already works). X11 fallback via
gdk_window_set_decorations(0) unchanged.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-23 09:30:51 +02:00
jpmschweitzerandClaude Opus 4.6 a6b11a4cd8 implement xdg-decoration for native Wayland frameless
Replace XWayland fallback with proper xdg-decoration protocol
negotiation. On Wayland: binds zxdg_decoration_manager_v1 from
the compositor registry, requests CLIENT_SIDE mode on the toplevel
surface — KWin respects this and drops server-side decorations.
Falls back to gdk_window_set_decorations(0) + set_decorated(FALSE)
on X11. GDK_BACKEND=x11 removed from Makefile.

Also fixes mouse-jumping glitch: startDrag and startResize now
pass screen coordinates from Flutter's globalPosition through the
method channel to gtk_window_begin_move/resize_drag.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-23 09:21:19 +02:00
jpmschweitzerandClaude Opus 4.6 8475e2e33a add window resize handles for frameless mode
Without OS decorations there are no resize handles. Added 6px
edge and 12px corner invisible hit zones around the window
perimeter via ClideResizeBorder. Each zone changes the cursor
and calls gtk_window_begin_resize_drag via the clide/window
method channel with a GdkWindowEdge direction.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-23 09:13:32 +02:00
jpmschweitzerandClaude Opus 4.6 8938a0d502 add Q-031: XWayland fallback, proper Wayland protocol roadmap
Documents the workaround (GDK_BACKEND=x11), rollback instructions,
the proper fix (libwayland-client + xdg-decoration protocol), and
the alternative timeline (Flutter GTK4 migration).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-23 09:09:16 +02:00
jpmschweitzerandClaude Opus 4.6 2a3ec8f45c force X11 backend for frameless window on KDE Wayland
GTK3 doesn't implement the xdg-decoration Wayland protocol, so
KWin always adds server-side decorations regardless of
gtk_window_set_decorated(FALSE). GDK_BACKEND=x11 forces XWayland
where MOTIF_WM_HINTS reliably removes decorations. Revisit when
Flutter moves to GTK4 or implements xdg-decoration natively.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-23 09:04:51 +02:00
jpmschweitzerandClaude Opus 4.6 065cef24c2 use gdk_window_set_decorations to strip KWin SSD
gtk_window_set_decorated alone doesn't work on KDE Wayland — KWin
adds server-side decorations regardless. Now also calling
gdk_window_set_decorations(gdk_win, 0) after realize and before
first frame show, which communicates directly with the compositor
via GDK's Wayland layer.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-23 09:02:45 +02:00
jpmschweitzerandClaude Opus 4.6 80ad41cd62 set GTK_CSD=1 in make run for frameless on KDE Wayland
KWin adds server-side decorations that ignore
gtk_window_set_decorated(FALSE). GTK_CSD=1 forces client-side
decoration mode, which our set_decorated(FALSE) then suppresses.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-23 09:00:47 +02:00
jpmschweitzerandClaude Opus 4.6 86ad659121 add chrome token set for frame surfaces
New tokens: chromeBackground, chromeForeground, chromeBorder —
shared root for hat bar, sidebar, context panel, status bar,
spines, and drag handles. All resolve to bgSunken/textDim/border
in the palette by default. Themes can override individually to
diverge surfaces. Replaces direct sidebarBackground/statusBar
references in chrome contexts. Updated theme-ui skill.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-23 08:52:44 +02:00
jpmschweitzerandClaude Opus 4.6 1494d6a414 add theme-ui skill for token selection consistency
Guides widget development to use the correct background, border,
text, and hover tokens per surface type. Documents the three-tier
background model (root/chrome/surface), the token identity rule
(no borrowing across surfaces), and flags the pending need for
chromeBackground/chromeForeground tokens.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-23 08:47:07 +02:00
jpmschweitzerandClaude Opus 4.6 d3913a8b28 use sidebar background color for hat bar
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-23 08:36:17 +02:00
jpmschweitzerandClaude Opus 4.6 2553ebccc9 add bottom border to hat bar matching divider color
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-23 08:35:40 +02:00
jpmschweitzerandClaude Opus 4.6 2dba5f1d12 widen drag handle to 8px hit area
Still 1px visible line; 8px aligns with Flutter's 8-point grid.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-23 08:33:47 +02:00
jpmschweitzerandClaude Opus 4.6 ddfe8dd99d paint drag handle background to match adjacent panel
The non-line pixels in the 5px drag handle now fill with the
adjacent panel's background color (sidebar or context) instead
of being transparent. The 1px divider line stays on the inner
edge touching the center column.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-23 08:33:08 +02:00
jpmschweitzerandClaude Opus 4.6 161534043e fix side panel padding: no pad on divider edge
Sidebar pads left/top only (not right — that's the divider side).
Context panel pads right/top only (not left — divider side). The
divider handle's transparent pixels now show the center column's
background correctly.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-23 08:30:41 +02:00
jpmschweitzerandClaude Opus 4.6 1167874324 align divider line to inner edge, add side panel padding
The 1px visible line in the 5px drag handle now sits on the
innermost pixel (touching the center column) instead of centered.
Side panels (sidebar and context) get 2px padding on all sides
except the bottom, creating a balanced inset that matches the
divider's visual weight.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-23 08:28:22 +02:00
jpmschweitzerandClaude Opus 4.6 c808a853da refine column separator: 5px handle, 1px divider-colored center
Handle is 5px wide for comfortable drag, with a 1px center line
using dividerColor (switches to panelActiveBorder on hover).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-23 08:24:13 +02:00
jpmschweitzerandClaude Opus 4.6 767f485e2f make hat bar full-width, separators 1px visible
Hat bar is now a single continuous row above the three columns
instead of per-column segments. Left: macOS traffic lights or
empty. Center: project > branch. Right: minimize/maximize/close
on Linux or empty. Column separators keep 4px hit area but show
a 1px centered line.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-23 08:23:05 +02:00
jpmschweitzerandClaude Opus 4.6 538472f7ec replace OS title bar with per-column 24px hats (D-057)
Hide GTK title bar via gtk_window_set_decorated(FALSE). Add
MethodChannel('clide/window') for drag/minimize/maximize/close
wired to GTK window functions. Dart WindowControls service wraps
the channel. Three per-column hats in RootLayout: left (macOS
traffic lights or plain drag), center (project > branch label),
right (minimize/maximize/close glyph buttons on Linux). Resolves
Q-006.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-23 08:16:28 +02:00
jpmschweitzerandClaude Opus 4.6 eb8c9ecf5d add ClideFilterBox widget to all sidebar panes
Shared filter box with search icon, debounced input, and clear
button. Applied to all six left-panel panes for consistent
filtering: Files (flat path results when filtering), Git (filter
staged/unstaged/untracked by path), Decisions (by ID/title/domain),
Tickets (by ID/title/status), Problems (by source/message), and
pql Query (replaces custom _QueryInput).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-23 07:56:39 +02:00
jpmschweitzerandClaude Opus 4.6 76029a02a0 collapse tool status to single "ok" when both tools found
Shows "● ok" in green when both ptyc and pql are available.
When either is missing, shows each broken tool by name in amber
("● ptyc not found", "● pql not found"). Font matches the git
branch widget — uses inherited UI face at clideFontCaption size,
no mono override. Dot indicator replaces the Phosphor icon.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-23 07:43:10 +02:00
jpmschweitzerandClaude Opus 4.6 80daa76623 fix git.branches: use pipe separator instead of null byte
test / unit + widget + golden + a11y (push) Failing after 35s
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
The null byte in the --format string didn't survive Process.run
argument passing, so the output was unparseable and no branches
were returned. Switched to pipe separator with lastIndexOf split
to handle branch names containing pipes.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-23 00:59:42 +02:00
jpmschweitzerandClaude Opus 4.6 8b6fdbd294 fix branch picker: escape to dismiss, error display, backdrop click
Branch picker now handles Escape key to dismiss, shows an × close
button in the header, and displays error/empty states instead of
silently showing nothing. Dialog backdrop is click-to-dismiss (the
dialog content stops propagation so clicks inside don't close it).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-23 00:57:46 +02:00
jpmschweitzerandClaude Opus 4.6 2561329836 check ptyc/bin/ptyc relative to cwd for status indicator
The tool status indicator now checks the repo-local ptyc binary
before falling back to PATH lookup, matching the resolution logic
in main.dart.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-23 00:54:58 +02:00
jpmschweitzerandClaude Opus 4.6 d0df794e69 resolve ptyc path from repo root in in-process boot
The Flutter app now looks for ptyc/bin/ptyc relative to the
workspace root before falling back to PATH. Fixes
"ProcessException: No such file or directory. Command: ptyc"
when running in-process without ptyc installed globally.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-23 00:53:25 +02:00
jpmschweitzerandClaude Opus 4.6 289d064639 wire in-process dispatcher — no daemon socket needed
InProcessClient dispatches IPC requests directly to handlers in the
same process, bypassing the unix socket entirely. All subsystem
registries (pane, files, editor, git, pql) are created in the
Flutter app's boot sequence and registered on a DaemonDispatcher.
Events bridge to the kernel EventBus via _BusEventSink. The app
no longer needs `clide --daemon` running.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-23 00:51:33 +02:00
jpmschweitzerandClaude Opus 4.6 1fdd35706e fold project.yaml into pubspec.yaml
pubspec.yaml is now the single source of truth for version and
project metadata. Makefile reads version from pubspec.yaml. All
references to project.yaml across CLAUDE.md, CHANGELOG.md,
decisions, and skills updated.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-23 00:45:36 +02:00
jpmschweitzerandClaude Opus 4.6 3df0a3f026 replace daemon indicator with ptyc/pql tool status
The status bar now shows whether ptyc and pql are findable on PATH
(green = found, amber = missing) instead of the obsolete daemon
connection state. Per D-056 there is no daemon to connect to.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-23 00:43:18 +02:00
jpmschweitzerandClaude Opus 4.6 f2c20fe2d0 update CLAUDE.md for single-package layout (D-056)
Rewritten to reflect the dissolved daemon, single Flutter package
at repo root, and updated repo layout. Removed references to app/,
clide --daemon, two-package structure, and AOT compilation.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-23 00:41:01 +02:00
jpmschweitzerandClaude Opus 4.6 38ca686b4f ignore .claude/skills/pql/ (managed by pql init)
These files are generated and updated by pql init, not manually
authored. Tracking them causes drift when pql versions change.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-23 00:39:20 +02:00
jpmschweitzerandClaude Opus 4.6 514fb03be4 ignore .clide/settings.yaml (per-user layout state)
Contains last-opened project, panel sizes, collapse state — all
personal preferences. Committing it causes merge conflicts when
users have different layouts.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-23 00:38:26 +02:00
jpmschweitzerandClaude Opus 4.6 46329700d5 dissolve app/ into repo root (D-056)
Single Flutter package at the repo root. All code, tests, assets,
and platform directories moved from app/ to root. Package renamed
from clide_app to clide — all imports rewritten. Merged pubspec
combines core (ffi) and app (flutter, yaml, xterm) dependencies.
Makefile simplified: no APP_PRESENT conditionals, no cd, no daemon
lifecycle. 317 tests pass.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-23 00:37:20 +02:00
jpmschweitzerandClaude Opus 4.6 a526c5b9b7 add D-055 Claude internal tabs, readable session name slugs
D-055: multiple Claude sessions share the workspace as internal
tabs inside the Claude pane header. Primary has no close; secondaries
show ×. Tab row hidden when only primary exists. + button and
double-click-empty spawn new secondaries.

Session names now use a readable path slug (strip $HOME, replace /
with -) with fallback to FNV-1a hash when the slug exceeds 80 chars.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-23 00:13:24 +02:00
jpmschweitzerandClaude Opus 4.6 3f0d4e2c02 top-align sidebar and context panel content
Side panel content was vertically centered by Container's default
alignment. Added Alignment.topLeft so file tree, viewer, and other
panel content docks to the top.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-23 00:02:43 +02:00
jpmschweitzerandClaude Opus 4.6 ed7373aac7 bump type scale: body 15, caption 13, mono 14
Status bar text (git branch, connection indicator) used
clideFontCaption at 12px — too small relative to the new 15px app
default. Bumped the full type scale: body 14→15, caption 12→13,
mono 13→14.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-22 23:59:08 +02:00
jpmschweitzerandClaude Opus 4.6 44dad67417 bump phosphor icon font to size 1.0, fix welcome tests
Phosphor glyph fontSize set to 1.0 in unit space so glyphs fill
the full icon size (16px in the rail). Welcome tests updated to
match the redesigned view.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-22 23:52:38 +02:00
jpmschweitzerandClaude Opus 4.6 3cde60dfcc fix bottom strip: icon sizing, rail padding, status alignment
Phosphor icons: reduced font size from 0.88 to 0.75 in unit space
and center-aligned paragraph to prevent horizontal stretching.
Icon rail: removed top border, tightened padding (10h/4v from
12h/6v), reduced icon size to 14px to fit the 26px strip. Status
bar: added horizontal padding and vertical center alignment.
Bottom strip row: added top border, crossAxisAlignment.stretch
so all three sections fill the height uniformly. Default app font
bumped from 14 to 15px.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-22 23:48:45 +02:00
jpmschweitzerandClaude Opus 4.6 a22bbfbe8d move icon rails to bottom strip row aligned with status bar
Icon rails pulled out of _SidebarSlot and _ContextSlot into the
bottom row alongside StatusbarHost. All three strips — left icon
rail, app strip, right icon rail — now sit on one continuous
horizontal line per D-047. Sidebar and context panels render
content only; their bottom rails share the status bar row with
matched widths. Collapsed spines get a matching-width spacer.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-22 23:44:09 +02:00
jpmschweitzerandClaude Opus 4.6 f71f2bce7c resolve ptyc path relative to daemon binary
The daemon now checks for ptyc at ../ptyc/bin/ptyc relative to its
own binary location before falling back to PATH lookup. Fixes
"ProcessException: No such file or directory. Command: ptyc" when
ptyc is built but not on PATH.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-22 23:44:00 +02:00
jpmschweitzerandClaude Opus 4.6 b581ed3fe8 center welcome content, bump font sizes, hide debug banner
Welcome content block is now centered in the viewport with a
720px max-width constraint. Status line pinned to the bottom.
Font sizes bumped across the board: title 52px, subtitle 16px,
section headers 12px, action labels 15px, recent project names
15px. Debug banner disabled via debugShowCheckedModeBanner.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-22 23:38:44 +02:00
jpmschweitzerandClaude Opus 4.6 16ecf51091 redesign welcome as full-screen overlay with recent projects
Welcome screen is now a full-window overlay that covers the IDE
when no project is open. Two-column layout: START actions (open
folder, clone from git, start Claude session) with keyboard
shortcut hints, and RECENT projects list showing name, path,
branch, and relative timestamp. Status line shows version, daemon
connection state, and active theme.

ProjectManager tracks up to 10 recent projects with path, branch
name, and last-opened time, persisted as JSON in app.recentProjects.
Boot chain: try last project → try cwd → show welcome. Clicking a
recent project opens it directly into Claude.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-22 23:35:21 +02:00
jpmschweitzerandClaude Opus 4.6 eedeaec05a persist last-opened project and wire welcome open dialog
ProjectManager.open() now saves app.lastProject to user settings.
Boot calls openLast() instead of opening cwd — first launch shows
the welcome screen, subsequent launches restore the last project
directly into Claude. The welcome "Open project" button shows a
modal path-entry dialog that validates against git and activates
the Claude tab on success. Removed the dead "New Claude session"
button since secondary sessions are spawned via command palette.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-22 23:29:40 +02:00
jpmschweitzerandClaude Opus 4.6 f07a7b55a2 auto-open project from cwd and show Claude as primary
On desktop boot, main.dart calls project.open(cwd) to resolve the
git root. If a project opens successfully, the workspace activates
claude.primary instead of welcome. The _WorkspaceSlot now listens
to ProjectManager: when isOpen, Claude is always the visible
primary surface; when no project, welcome shows. This closes the
gap where the app loaded the project root but still displayed the
welcome screen as if no choice had been made.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-22 23:26:35 +02:00
jpmschweitzerandClaude Opus 4.6 257bb0cd94 fix tooltip stacking on fast mouse movement
The delayed show callback fired even after the mouse had already
exited, causing tooltips to stack. Track hover state with a bool
and check it after the delay before showing.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-22 23:19:32 +02:00