Commit Graph
100 Commits
Author SHA1 Message Date
vasyansk c4746f9864 feat(proto): GetConfig/SetConfig commands and ConfigChanged event 2026-06-14 09:22:39 +07:00
vasyansk e990e694b5 feat(proto): ConfigView wire type 2026-06-14 09:21:22 +07:00
vasyansk 80113da066 feat(spaceshd): config terminal+appearance sections and save 2026-06-14 09:20:24 +07:00
vasyanskandClaude Opus 4.8 052f484142 docs: settings modal implementation plan
11 TDD tasks: daemon config model/save, ConfigView + Get/Set/ConfigChanged
protocol, bridge + socketBridge, CSS-var theming, TerminalView font/theme,
settings modal, daemon Stop/Restart.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-14 09:05:22 +07:00
vasyanskandClaude Opus 4.8 4aacebcc60 docs: settings modal design spec
Config in config.toml via daemon (Get/Set/ConfigChanged), low-churn CSS-var
theme switching (Dark/Light + accent), terminal font, default shell, and
daemon status with Stop/Restart.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-14 09:01:53 +07:00
vasyansk 5b08b204b6 Merge workspace-list-features: pinned/favorites, drag-reorder, delete-with-confirm 2026-06-14 08:56:31 +07:00
vasyanskandClaude Opus 4.8 a55555983b feat(app): sidebar favorites, drag-reorder, and delete-with-confirm
- FAVORITES section at the top collects pinned workspaces (removed from their
  group listing); a star toggle on each row pins/unpins via setWorkspaceMeta.
- Drag-to-reorder within a section using raw pointer events (HTML5 DnD is
  unreliable in the macOS WKWebView), with a drop-line indicator; on drop the
  section's `order` is reassigned sequentially and persisted. Cross-section
  drops are ignored (group membership unchanged).
- Trash icon on row hover opens a ConfirmDelete modal that shows the live
  terminal count and warns before terminating them, then calls close_workspace
  and re-points the active workspace.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-14 08:56:20 +07:00
vasyanskandClaude Opus 4.8 7b47052a6f feat(spaceshd): pinned workspace field
Add a `pinned` bool to the workspace model, threaded through proto
(Workspace + WorkspaceView + SetWorkspaceMeta), the registry, the
set_workspace_meta handler, persistence, the CLI mapping, and the Tauri
bridge. serde(default) keeps existing state.json compatible (pinned=false).
Backs the sidebar Favorites section.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-14 08:56:09 +07:00
vasyansk 2c8ac8ebac Merge fix-spawn-search: lazy PTY spawn, working search, prompt-dup fix 2026-06-14 08:34:57 +07:00
vasyanskandClaude Opus 4.8 04ac7cdec2 fix(app): working scrollback search + stop prompt duplication on focus
Search fixes:
- TerminalView sets allowProposedApi (the search addon's match decorations
  use registerMarker/registerDecoration); without it findNext threw before
  firing results, so the counter was stuck at 0/0.
- The search bar now renders inside the panel it targets (in the header)
  instead of a global top-right overlay, so it's obvious which panel is
  searched.
- Search is anchored to the panel it was opened on (searchSurfaceId) and no
  longer follows focus — opening it in one panel and switching away no longer
  shows it open elsewhere.

Prompt duplication:
- The focus border was 1px when unfocused, 2px when focused; with border-box
  that resized the content on every focus switch, firing ResizeObserver -> fit
  -> PTY SIGWINCH and making zsh/powerlevel10k reprint its prompt. The border
  is now a constant 2px, color-only on focus.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-14 08:34:43 +07:00
vasyanskandClaude Opus 4.8 a30ec1cc7f fix(spaceshd): lazy PTY spawn so prompts render at the correct size
A new surface spawned its shell immediately at the default 80x24, so the
shell (e.g. zsh + powerlevel10k) printed its first prompt before the GUI
fit-resized the panel. The post-print resize reflowed the grid, leaving the
prompt invisible until Enter and shifted by a line.

The surface actor now defers the child spawn: it waits for the first Resize
(spawning at that geometry) or, for headless/CLI surfaces that never attach a
GUI, falls back to the spec geometry after 250ms. Attaches received before
the spawn get an empty-grid snapshot plus a live subscription; pre-spawn
input is buffered and replayed. Adds two deterministic tests via `stty size`.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-14 08:34:28 +07:00
vasyansk 907df5b01c Merge backlog-polish: search fix, app icon, shell config, lock-test fix, GUI backlog 2026-06-14 08:01:47 +07:00
vasyanskandClaude Opus 4.8 58c75c71ae feat(app): GUI backlog — splitter, drag-reorder, fit, persist, modal focus
- LayoutEngine: fix splitter resize (track pointer 1:1 via delta-from-start)
  and add panel drag-to-reorder using raw pointer events with drop indicators
- TerminalView: auto-fit xterm to container via FitAddon + ResizeObserver
- App/TopBar: toggleable sidebar; persist sidebar/events collapse in
  localStorage; bell icon opens the activity log
- Wizard: new-workspace modal now grabs focus and handles keyboard
- deps: add @xterm/addon-fit

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-14 08:01:15 +07:00
vasyanskandClaude Opus 4.8 6a3875670a feat(spaceshd): configurable default shell
Add a config.rs module that loads optional ~/.spacesh/config.toml and a
default_shell() resolver: SPACESH_SHELL env -> config.toml default_shell ->
login shell from the passwd DB -> $SHELL -> /bin/sh. The passwd lookup
matters under launchd where $SHELL is absent. All plain-panel spawn sites in
server.rs now use the resolver. Adds toml + libc deps.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-14 08:01:04 +07:00
vasyanskandClaude Opus 4.8 0014d9358d feat(app): app icon and macOS bundle config
The dock showed a black square because tauri.conf.json had no bundle.icon
block and icons/ held only tiny placeholders with no .icns. Add an SVG
source logo (terminal prompt + split workspace panes), generate the full
icon set via `tauri icon` (icon.icns/.ico + all PNG/iOS/Android sizes), and
wire bundle.icon so the daemon embeds and macOS renders it.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-14 08:00:54 +07:00
vasyanskandClaude Opus 4.8 89373676e8 fix(app): incremental scrollback search
Search only ran on Enter; typing merely reset the counter to 0/0, so a
visible term showed no matches until the user pressed Enter. run() now takes
an optional query override and onChange fires it on every keystroke for
search-as-you-type, while Enter/Shift+Enter still navigate matches.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-14 08:00:45 +07:00
vasyanskandClaude Opus 4.8 21180ae9e0 fix(spaceshd): isolate instance-lock test via SPACESH_LOCK
lock_is_exclusive_within_process acquired the global ~/.spacesh/daemon.lock,
so it flaked whenever a real daemon was running. Add a SPACESH_LOCK env
override to lock_path() and point the test at a private temp file under a
serial() guard, making the suite deterministic regardless of a live daemon.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-14 08:00:35 +07:00
vasyanskandClaude Opus 4.8 cd44f0b263 Merge SP1+SP3+SP4: daemon health, scrollback search, panel zoom
- SP1: Cmd::Health (version/pid/uptime) → real sidebar live/uptime footer
- SP3: ⌘F scrollback search on the focused panel via xterm addon-search
- SP4: persisted per-workspace panel zoom (full-grid render, auto-clear on removal)
- 119 workspace tests green; frontend build clean

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-10 12:56:09 +07:00
vasyansk 8ea680d0df docs: SP1/SP3/SP4 manual scenarios and updated limitations 2026-06-10 12:55:07 +07:00
vasyanskandClaude Sonnet 4.6 ac3f0886d5 feat(app): scrollback search bar (⌘F) on the focused panel
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-10 12:48:03 +07:00
vasyansk 52a502c38b feat(app): load xterm search addon + surface→addon registry 2026-06-10 12:35:41 +07:00
vasyanskandClaude Opus 4.8 daf87d3c09 feat(app): panel zoom — full-grid render + header toggle
Wire Cmd::SetZoom through Tauri bridge (set_zoom command), add zoomed
field to WorkspaceView, short-circuit LayoutEngine to render only the
zoomed panel full-grid, and toggle Maximize2/Minimize2 in panel header.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-10 12:33:46 +07:00
vasyanskandClaude Sonnet 4.6 2b1ccaf31d feat: persisted per-workspace panel zoom (proto + daemon, auto-clear on removal)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-10 12:24:23 +07:00
vasyanskandClaude Opus 4.8 defceb1169 feat(app): real daemon health footer (live, uptime, version)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-10 12:09:35 +07:00
vasyansk f7763a84fc feat: Health command — version, pid, started_at (proto + daemon) 2026-06-10 12:06:38 +07:00
vasyanskandClaude Opus 4.8 f18d929c10 docs: SP1+SP3+SP4 implementation plan
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-10 11:57:45 +07:00
vasyanskandClaude Opus 4.8 a707895200 docs: SP1+SP3+SP4 design — observability, scrollback search, panel zoom
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-10 11:52:39 +07:00
vasyanskandClaude Opus 4.8 c9ed522230 chore(app): regenerate Tauri schemas for window-state permission
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-10 09:25:43 +07:00
vasyanskandClaude Opus 4.8 a5156859d6 Merge: persist window size/position via tauri-plugin-window-state
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-10 09:25:29 +07:00
vasyanskandClaude Opus 4.8 7d8e39ca3d feat(app): remember window size/position across restarts (window-state plugin)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-10 09:25:29 +07:00
vasyanskandClaude Opus 4.8 5fca6bfd09 Merge SP2: UI parity + persistent event log & read-model
- UI parity with Pencil mockup (top bar, panel cards, sidebar/event-center polish)
- Daemon-owned, disk-persisted event log (~/.spacesh/events.json) with read-flags
- Event Center sourced from daemon; real Unread/Errors tabs + bell unread badge
- 112 workspace tests green; frontend build clean

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-10 08:59:34 +07:00
vasyanskandClaude Opus 4.8 615b90e887 test(daemon): event log survives cold daemon restart
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-10 08:35:38 +07:00
vasyanskandClaude Sonnet 4.6 a8000323ec docs: SP2 manual test scenario and updated Event Center limitations
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-10 08:30:21 +07:00
vasyanskandClaude Sonnet 4.6 834d61c69a feat(app): daemon-sourced Event Center feed, read-model, bell badge
Source Event Center from daemon event_log (seed + live event/events_read push).
Unread/Errors tabs filter real EventRecord flags; bell shows numeric unread badge;
clicking an entry calls focusSurface + markEventsRead(ids). notify.ts param widened
to string so exit kind type-checks without breaking existing NOTIFY_STATES guard.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-10 08:28:35 +07:00
vasyansk d08a446b6f feat(app): event_log and mark_read bridge commands 2026-06-10 08:19:22 +07:00
vasyanskandClaude Sonnet 4.6 21fe1308cc feat(daemon): EventLog/MarkRead commands; Focus marks surface read
Wire Cmd::EventLog and Cmd::MarkRead to the live EventLog (replacing
NOT_IMPLEMENTED stubs). Cmd::Focus now calls mark_read for the surface,
persists the updated snapshot, and broadcasts Evt::EventsRead.
Add integration tests: event_log_query_and_mark_read and
focus_marks_surface_events_read.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-10 08:13:50 +07:00
vasyanskandClaude Opus 4.8 e83524a076 feat(daemon): record done/wait/error/exit into the event log
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-10 08:02:03 +07:00
vasyanskandClaude Opus 4.8 f7bf9fc5c6 wire(daemon): thread EventLog + EventPersister through serve/router
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-10 07:40:54 +07:00
vasyanskandClaude Sonnet 4.6 ac2d5ca1db feat(daemon): JsonEventStore + debounced EventPersister
Adds disk persistence for the event log: atomic temp+fsync+rename write,
corrupt-file backup, and a debounced coalescing persister task mirroring
state_store/persist patterns. 4 tests: round-trip, missing, corrupt, burst.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-10 07:27:23 +07:00
vasyanskandClaude Sonnet 4.6 56ba1723b9 feat(daemon): EventLog ring model with read-flags
Add event_log.rs with EventLog (capped VecDeque, monotonic ids, mark_read,
snapshot/restore) and EventLogState. Register mod in main.rs. Stub
Cmd::EventLog and Cmd::MarkRead arms in server.rs to keep the exhaustive
match compiling; full wiring follows in Task 4.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-10 07:21:26 +07:00
vasyanskandClaude Sonnet 4.6 5a8596dd0b feat(proto): EventLog/MarkRead commands and Event/EventsRead events
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-10 06:59:27 +07:00
vasyansk fc13e4340c feat(proto): EventKind, EventRecord, MarkReadTarget 2026-06-10 06:52:35 +07:00
vasyanskandClaude Opus 4.8 36964c9f21 feat(app): UI parity with Pencil mockup — top bar, panel cards, sidebar/event-center polish
Top bar (breadcrumb + actions + account), rounded panel cards with active
accent + rich headers, sidebar count pills/collapsible groups/daemon footer,
preset chips + scrollback pill, Event Center tabs + external-notify footer,
JetBrains Mono + Inter via @fontsource, shared theme tokens. Backend-absent
pieces are mocked (search, zoom, uptime, channels) pending SP1–SP5.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-10 06:47:38 +07:00
vasyanskandClaude Opus 4.8 807eab3f6c docs: SP2 implementation plan — persistent event log + read-model
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-10 06:40:15 +07:00
vasyanskandClaude Opus 4.8 e038ff307d docs: SP2 design — persistent event log + read-model
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-10 06:31:26 +07:00
vasyansk 5c47ec25a1 Merge fix: GUI spaceshd discovery + non-fatal connect 2026-06-09 23:31:52 +07:00
vasyanskandClaude Opus 4.8 92706c0780 fix(app): robust spaceshd discovery for tauri dev + non-fatal connect
The app is its own cargo workspace, so in 'tauri dev' the app binary lives
in app/src-tauri/target/ and spaceshd is NOT a sibling — lazy-start failed
and the .expect() crashed the window. Now: find_daemon tries SPACESHD_BIN,
sibling, repo-root target/{debug,release}, then PATH; bridge honors
SPACESH_SOCK like the daemon/CLI; setup logs instead of panicking.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-09 23:31:52 +07:00
vasyanskandClaude Opus 4.8 ec4025a683 docs: manual run & test guide (build, daemon, GUI, CLI, per-milestone checks)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-09 23:26:15 +07:00
vasyanskandClaude Opus 4.8 710fa6473f Merge spacesh M3: status detection sources + UI + native notifications
Claude Code hooks (per-surface CLAUDE_CONFIG_DIR), zsh OSC 133, fallback
patterns → set_state; status rings, sidebar aggregate, Event Center,
native macOS notifications, auto-unread. 87 tests green.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-09 23:18:50 +07:00
vasyanskandClaude Opus 4.8 c86627153d chore(app): lock notification plugin deps + regenerated tauri schemas
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-09 23:14:28 +07:00
vasyanskandClaude Opus 4.8 1ecefdeb80 feat(app): Event Center, native notifications, auto-unread, state wiring in App
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-09 23:13:00 +07:00
vasyanskandClaude Opus 4.8 d36548ff39 feat(app): status rings on panels + sidebar aggregate badge from state events
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-09 23:11:46 +07:00
vasyanskandClaude Opus 4.8 c35585755e feat(daemon): actor OSC133/fallback detection → set_state, hook/shell spawn env, cleanup
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-09 23:05:18 +07:00
vasyanskandClaude Opus 4.8 4396ad7909 feat(daemon): zsh OSC 133 shell integration via per-surface ZDOTDIR
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-09 23:00:48 +07:00
vasyanskandClaude Opus 4.8 255fa27271 feat(daemon): versioned Claude Code hook adapter (per-surface CLAUDE_CONFIG_DIR)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-09 23:00:40 +07:00
vasyanskandClaude Opus 4.8 4ec7dc1a78 feat(core): Osc133Scanner + FallbackScanner status detectors + grid tail_text
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-09 22:59:24 +07:00
vasyanskandClaude Opus 4.8 84a19356e2 docs(plan): M3 implementation plan — status detection sources + UI
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-09 22:52:29 +07:00
vasyanskandClaude Opus 4.8 c0c8fe25f1 docs(spec): M3 design — status detection sources + UI + native notifications
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-09 22:45:11 +07:00
vasyanskandClaude Opus 4.8 7f2afc3b8a Merge spacesh M4: CLI + set_state/state status primitive
spacesh-cli (lib+bin) one-shot client at full bus parity minus
interactive panels; --json + completions; lazy-start (notify
best-effort). In-memory ephemeral SurfaceState (set_state/state).
SPACESH_SOCK override. 73 tests green.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-09 22:28:30 +07:00
vasyanskandClaude Opus 4.8 819e936e6d docs(plan): sync M4 lifecycle test with SPACESH_SOCK serial-guard fix
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-09 22:24:40 +07:00
vasyanskandClaude Opus 4.8 67c64e5bfe chore: lock clap/clap_complete for spacesh-cli
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-09 22:24:40 +07:00
vasyanskandClaude Opus 4.8 6fc099bb6f test(daemon): serialize SPACESH_SOCK-mutating lifecycle tests to fix env race
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-09 22:23:41 +07:00
vasyanskandClaude Opus 4.8 6f2e7885a4 test(cli): wire-level integration tests via SPACESH_SOCK mock daemon
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-09 22:20:26 +07:00
vasyanskandClaude Opus 4.8 3c3a8039f3 feat(cli): command dispatch, human/--json rendering, status table, completions
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-09 22:17:53 +07:00
vasyanskandClaude Opus 4.8 a9fa1bf77b feat(cli): spacesh-cli scaffold — clap tree, one-shot client, command mapping
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-09 22:17:15 +07:00
vasyanskandClaude Opus 4.8 635f9f4356 feat(daemon): per-surface status (set_state/state), idle-on-spawn, SPACESH_SOCK override
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-09 22:13:50 +07:00
vasyanskandClaude Opus 4.8 4bd4aa4a36 feat(proto): SurfaceState + SetState command + State event + SurfaceView.state
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-09 22:10:54 +07:00
vasyanskandClaude Opus 4.8 c2f8ef4214 docs(plan): M4 implementation plan — CLI + set_state/state primitive
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-09 22:06:34 +07:00
vasyanskandClaude Opus 4.8 429fd6977e docs(spec): M4 design — CLI + set_state/state status primitive
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-09 21:58:40 +07:00
vasyanskandClaude Opus 4.8 34cc4ba5ca Merge spacesh M2: layouts, split tree, persistence, sidebar, presets
n-ary split layouts + LayoutEngine resize, multi-workspace structure
with groups/unread/order, 10 presets + wizard, disk persistence
(state.json) with cold-start restore (panels stopped). 56 tests green.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-09 21:44:16 +07:00
vasyanskandClaude Opus 4.8 33fc8625af docs(plan): correct M2 deferral note — group commands wired, only drag UI deferred
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-09 21:42:01 +07:00
vasyanskandClaude Opus 4.8 c9c3ba1fcd feat(app): wire set_group/delete_group bridge commands
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-09 21:41:34 +07:00
vasyanskandClaude Opus 4.8 0328797bce chore(daemon): remove unused imports and dead placeholders
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-09 21:39:43 +07:00
vasyanskandClaude Opus 4.8 7ec0c84685 feat(app): sidebar, preset picker, wizard, App rewired around workspaces + LayoutEngine
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-09 21:31:49 +07:00
vasyanskandClaude Opus 4.8 0320a2f313 feat(app): tauri bridge commands for M2 (split/ratios/move/preset/restart/groups/meta)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-09 21:30:26 +07:00
vasyanskandClaude Opus 4.8 4b88d269e3 feat(app): LayoutEngine — recursive split render, splitter resize, stopped overlay
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-09 21:29:26 +07:00
vasyanskandClaude Opus 4.8 ee2f7097ce feat(app): M2 layout TS types + bridge commands
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-09 21:28:54 +07:00
vasyanskandClaude Opus 4.8 62a65b691d feat(daemon): M2 command dispatch, layout events, cold-start restore, persistence wiring
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-09 21:25:35 +07:00
vasyanskandClaude Opus 4.8 b72f4cb3a5 feat(daemon): spawn_from_spec to (re)start surfaces from a persisted spec
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-09 21:22:29 +07:00
vasyanskandClaude Opus 4.8 d516414ac9 feat(daemon): registry owns workspaces/groups/trees + running/stopped surfaces
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-09 21:21:47 +07:00
vasyanskandClaude Opus 4.8 7515516699 feat(daemon): debounced persist scheduler coalescing bursts into one save
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-09 21:20:58 +07:00
vasyanskandClaude Opus 4.8 4f7ed2a5a3 feat(daemon): StateStore trait + atomic JSON store with corrupt-file backup
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-09 21:20:51 +07:00
vasyanskandClaude Opus 4.8 9927046c7e feat(core): 10 layout preset generators
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-09 21:17:35 +07:00
vasyanskandClaude Opus 4.8 28d0e05763 feat(core): n-ary tree ops — split, remove+collapse, ratios, move
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-09 21:17:35 +07:00
vasyanskandClaude Opus 4.8 2723d40ff9 feat(proto): M2 commands (split/ratios/move/preset/restart/groups/meta) and events
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-09 21:13:33 +07:00
vasyanskandClaude Opus 4.8 c8ba401023 feat(proto): SurfaceSpec, Group, Workspace, status view types
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-09 21:12:29 +07:00
vasyanskandClaude Opus 4.8 114922aaf8 feat(proto): GroupId, Orient, n-ary LayoutNode with external-tagged serde
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-09 21:11:51 +07:00
vasyanskandClaude Opus 4.8 d859aa8841 docs(plan): M2 implementation plan — layouts, persistence, sidebar, presets
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-09 21:08:40 +07:00
vasyanskandClaude Opus 4.8 ac13976bfd docs(spec): M2 design — layouts, split tree, persistence, sidebar, presets
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-09 20:58:51 +07:00
vasyanskandClaude Opus 4.8 17351f3da2 Merge spacesh M0+M1: daemon, PTY, grid/snapshot, Tauri app
Vertical slice (bytes GUI↔daemon↔PTY over UDS) + persistence/reattach
(daemon outlives GUI; snapshot repaint). 4 crates + Tauri 2 app.
26 tests green and non-flaky.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-09 20:41:23 +07:00
vasyanskandClaude Opus 4.8 ecc6eb9d66 design: spacesh v1 UI mockups (main, code/diff, wizard, auth, account)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-09 20:39:51 +07:00
vasyanskandClaude Opus 4.8 b2c771f4f7 chore: commit Cargo.lock for reproducible daemon/app builds
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-09 20:39:51 +07:00
vasyanskandClaude Opus 4.8 0cc1303fd9 docs(plan): sync Task 13 attach-snapshot with double-render fix
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-09 20:39:51 +07:00
vasyanskandClaude Opus 4.8 f1630633e5 test(daemon): serialize heavy socket/PTY integration tests
Process-wide serial lock around the socket-binding and PTY-spawning
integration tests in spaceshd. Running several at once on a many-core
box starved each other's async tasks and tripped timing assumptions,
causing ~1/10 flakes under cargo test --workspace. Unit tests stay
parallel. 0/20 spaceshd + 0/5 workspace runs after the change.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-09 20:39:24 +07:00
vasyanskandClaude Opus 4.8 77dfc69bd9 fix(daemon): remove pending broadcast on attach to prevent reattach double-render
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-09 20:33:11 +07:00
vasyanskandClaude Opus 4.8 62e86a1c97 feat(app): reattach repaint + disconnect guard (M1)
All Task 15 code (spacesh:disconnected emit in bridge.rs reader,
onDaemonRawEvent in socketBridge.ts, reconnect handler in App.tsx)
was implemented together with Task 10 in the prior commit.
This commit marks the task boundary.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-09 20:25:55 +07:00
vasyanskandClaude Opus 4.8 56893c51d0 feat(app): UDS bridge (channel/invoke/emit) + xterm.js terminal, M0 e2e works
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-09 20:24:57 +07:00
vasyanskandClaude Opus 4.8 1579686fdd chore(app): scaffold tauri 2 + react + vite, window launches
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-09 20:22:46 +07:00
vasyanskandClaude Opus 4.8 a56d8d0fea test(daemon): harden reattach test with pre-connect socket guard
Add wait_for_socket before second client connect to handle scheduling
jitter when tests run in parallel under cargo test --workspace.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-09 20:16:18 +07:00
vasyanskandClaude Opus 4.8 18ac699951 feat(daemon): launchd user-agent install with KeepAlive
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-09 20:14:00 +07:00