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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
Four stub extensions now contribute real tabs with views:
- Decisions panel (sidebar, priority -20): lists confirmed D-records
from pql decisions list with ID, title, and domain.
- Tickets panel (sidebar, priority -10): lists tickets with status
dot color-coded by state (done=green, in_progress=blue,
cancelled=red).
- Markdown viewer (context, priority -100): shows raw content of
the active .md file, listens for editor.buffer_activated events.
- Graph view (context, priority -80): lists files with inbound and
outbound link counts from pql search --connections.
All four fetch data via the daemon's pql.exec IPC surface.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Phosphor Icons v2.0.8 (MIT) — regular, bold, and fill weights
bundled under assets/fonts/phosphor/. PhosphorIconPainter bridges
the font glyphs into the existing ClideIconPainter interface via
Paragraph API so icon rails, pane headers, and any widget using
ClideIcon can consume them. Sidebar and context panel icon rails
now use Phosphor glyphs instead of hand-painted CustomPaint icons.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Collapse state, panel sizes, active sidebar/context tabs, and
editor split ratio save to .clide/settings.yaml on every layout
change and restore on boot. Guards against missing projectDir
so tests and no-project scenarios degrade gracefully.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Editor opens above Claude via Ctrl+E with a draggable divider at
35% height (clamped 15-70%). Ctrl+W or Escape closes it. The
workspace no longer renders a tab bar — Claude is the always-visible
primary surface per D-047/D-048; the editor is a split overlay
per D-049, not a tab. The _WorkspaceSlot separates editor from
primary content tabs and renders them as a vertical split when the
editor is open.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Collapsed side panels render as a 12px vertical spine with rotated
label, hover highlight, and badge dot (D-051). Focus mode snapshots
and restores the full layout arrangement (D-052). Fourteen new
commands in the default-layout extension: collapse toggles
(Ctrl+Shift+1/3), panel focus (Ctrl+1/2/3), focus mode (Ctrl+.),
sidebar section switching (Alt+1-5), Escape dismiss (D-054). Right
panel gets a bottom icon rail matching the sidebar pattern (D-047).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
POLICY.md codifies runtime behavior rules (no network on default
launch path), dependency vetting, vendored binary rebuild process,
telemetry prohibition, and licensing requirements. Binding on all
contributors including agents.
Line length 160 in .editorconfig (all files) and
analysis_options.yaml (dart formatter).
Co-Authored-By: Claude <noreply@anthropic.com>
Vendor libtree-sitter.so (v0.26.8, wasmtime 44.0 statically linked)
and call its C API through dart:ffi. Grammar WASM files are loaded by
tree-sitter's embedded wasmtime engine via ts_wasm_store_load_language.
48 grammars compiled with tree-sitter build --wasm, 48 highlight
queries (42 from upstream repos, 6 written in-house for comment,
erlang, gdscript, gitignore, hcl, hlsl, swift). SQLite grammar
replaces full SQL (974K-line parser exhausted RAM at compile time).
Removes wasm_run and wasm_run_flutter — they downloaded a 22 MB
binary from GitHub at first launch, violating the no-network-on-
default-launch-path policy.
Co-Authored-By: Claude <noreply@anthropic.com>
Core frame builtins are infrastructure the shell can't function
without. Content extensions (editor, claude, canvas, etc.) are
bundled but architecturally removable — users swap the surface,
not the data.
Removes builtin.jira stub: Jira belongs as a third-party
extension, not a frame builtin. Git is a split component —
daemon-side process stays in frame, UI surfaces are extensions.
Co-Authored-By: Claude <noreply@anthropic.com>
test / unit + widget + golden + a11y (push) Failing after 41s
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
Larger wordmark (48px), START section header, icon-prefixed
action rows for Open project and New Claude session. Semantics
hint preserved for a11y.
Co-Authored-By: Claude <noreply@anthropic.com>
The discard button in the git panel now opens a dialog warning
that changes will be permanently lost. Prevents accidental data
loss from a misclick.
Co-Authored-By: Claude <noreply@anthropic.com>
git.branches and git.checkout IPC verbs. Status bar shows current
branch with ahead/behind count; clicking opens a branch picker
dialog for checkout.
Co-Authored-By: Claude <noreply@anthropic.com>