Commit Graph
19 Commits
Author SHA1 Message Date
jpmschweitzerandClaude Fable 5 f378be4084 persist the ticket dep-graph export
The pre-commit hook staged the ticket/history tables but left the
deps + idmap exports (the T-398..T-402 and T-403..T-407 blocker
links) unstaged on the previous commit; sweep them in.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-12 05:23:47 +02:00
jpmschweitzerandClaude Fable 5 6817abaf96 add WorkspaceRef + remote identity on RecentProject (T-332)
The model-independent half of the ssh:// open scheme. WorkspaceRef is
the value type for "where a workspace lives" — a local path or
ssh://[user@]host[:port]/abs/path, with parse/uri round-tripping and a
host:path display form. RecentProject carries host/port/user
(back-compatible JSON: absent keys deserialize as local) so remote
recents survive restarts and render with their host badge.

The remaining T-332 scope — ProjectManager.current off bare Directory,
open() branching, remote resolveProject — is gated on the execution
layer (T-336), which is itself blocked on the T-330 footprint pick;
the epic's blocker graph now encodes that gating.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-12 03:11:57 +02:00
jpmschweitzerandClaude Opus 4.8 c6fa384972 file SSH-remote workspaces epic (T-329) with phased stories
Plan an epic to run clide locally against a repo on a remote machine over
SSH: execution remote (git, pql, claude, terminal, file I/O), UI + clipboard
local, bridged by SSH. Resolves Q-23.

Epic T-329 with stories T-330..T-336: Phase-0 governance spike (gates the
epic; decides the footprint model — no-install ssh-exec vs auto-pushed
agent — and resolves Q-23), model-independent backbone (transport seam,
ssh:// open scheme, Claude stdio-control remoting, image-paste bridge, UI),
and an execution-layer fork placeholder that expands after the spike.
Dependency chain wired via ticket blocks.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-10 15:29:00 +02:00
jpmschweitzerandClaude Opus 4.8 01445c4fae enlarge the activity-card run-status spinner (T-304)
At size 12 the rotating logo-mark spinner on in-progress collapser cards
read as a static speck. Add a clideIconHero (24) control-geometry token
and use it for ClideStatusIndicator on the collapser — the spinner now
reads as motion at a glance; the success check / error cross share the
size so the card doesn't jump when the run settles. Only call site is the
collapser, so other status surfaces are untouched.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-10 14:05:17 +02:00
jpmschweitzerandClaude Opus 4.8 1194527ad5 T-317: merge canvas work into one drawing-card epic (D-91 follow-up)
Records the T-7 -> T-317 merge on D-91's Relationship bullet (the
former Tier-5 canvas+graph epic folds into the unified canvas
epic; canvas pane T-322 + graph view T-323 consume the shared
renderer) and the D-91 index line. Plus the changelog for this
turn's board restructure: epic T-317, core engine T-318,
templates T-319/320/321, re-parented T-313/315/316, T-7 cancelled
as superseded, T-41 moved to T-276.

Governance + .pql/changelog only — leaves concurrent lib/ work
and CHANGELOG.md to the other worker on this branch.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-10 13:25:04 +02:00
jpmschweitzerandClaude Opus 4.8 7a98cbae4b frame the context / thinking / agent-prompt meta cards (T-306)
The injected context block and the thinking / agent-prompt blocks
rendered as frameless `bare` cards, reading as unfinished `> context …`
rows next to the framed tool cards. Switch them to the bordered variant —
same panel border + left chevron + label as the surrounding cards — while
keeping the D-78 de-emphasis (muted accent, collapsed by default,
first-line summary; thinking gains a summary for parity). Adds a
conversation_card_meta golden.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-10 13:16:41 +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 826395481c make sidebar filter boxes CLI-addressable via the MessageBus (T-270)
The sidebar/dock filter fields (the shared ClideFilterBox) had no CLI
peer — a one-way, UI-only affordance that broke D-6 parity. Add the
drive+observe verb `clide ui filter <address> [<text>]`, routed entirely
through the kernel MessageBus pub/sub so a box reacts to a published
message identically whether the trigger was a UI keystroke or the CLI —
keeping extensions first-class (no dispatcher→widget wiring).

- ClideFilterBox gains an `address`; when set it listens on `filter.set`
  for its address and republishes its value on `filter.state`. Null
  address keeps the box a kernel-free UI widget.
- FilterStateCache (new kernel service) caches the latest `filter.state`
  per address — the bus has no retention, so this backs the observe-half.
- ui.filter: with text → publishes `filter.set` (drive); without →
  reads the cache (observe). Honest toolError when there is no live UI.
- Address every box: decisions/tickets/files/git/output/problems panes,
  the four search boxes, and the pql search/query/markdown inputs.

Addresses are the ids from `clide pane list` (e.g. decisions.panel).
settings.json: allow the `clide` CLI + relevant skills.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 12:44:40 +02:00
jpmschweitzerandClaude Opus 4.8 495fc9151e file conversation-rendering streamlining epic (T-267) + children
Epic T-267 homes the work that streamlines the Claude conversation log
around three moves: fold redundant standalone items into their owning
card, fix misleading attribution, and settle the container model.

Children: T-262 (merge tool-call + success result), T-263 (fold agent
prompt into the Agent card), T-264 (nest the whole sub-agent run),
T-265 (relabel sidechain prose), T-266 (shared holder/container card +
collapse-control scroll race). T-264 blocked by T-266 (shared primitive).
Also records T-255 moving to ready.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 10:50:10 +02:00
Jeroen SchweitzerandClaude Opus 4.8 7ac936eb1c restore the Give Claude hands initiative (T-208–T-225)
A pql rebuild reset planning state to the committed changelog baseline
(max T-207), dropping the T-208–T-225 ticket tree sourced from
self-analysis.md. Re-created it deterministically (same order → same IDs)
and ran `pql plan export` so the changelog now carries the full tree:

- T-208 initiative "Give Claude hands"
- epics T-209 (PATH delivery), T-214 (bootstrap), T-218 (observability),
  T-222 (events) + tasks T-224/T-225, with blockers and decision refs.

Committing the regenerated changelog makes the work durable: the next
`pql plan rebuild` replays it instead of resetting to T-207.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-02 20:15:33 +02:00
jpmschweitzerandClaude Opus 4.8 4aa24a9898 fix dead default keymap from undefined focus intents
default.yaml bound tab/shift+tab to focus.next/focus.previous, intent
ids absent from builtinIntents. parseIntentId returns null, so
KeymapLayer.fromYaml throws — and KeymapService.load catches that and
sets _preset = null. The whole default preset was silently dropped at
boot: palette, quick-open, find-in-files, and zoom bindings never fired.

It went unnoticed because every keymap_service_test injects a synthetic
bundle; the shipped asset was never parsed in a test. Add focus.next ->
NextFocusIntent and focus.previous -> PreviousFocusIntent (Flutter-
provided, for correct Tab widget traversal), and a test that reads every
real assets/keymaps/*.yaml through the loader so a future typo fails CI
instead of disabling the keymap.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-01 20:50:49 +02:00
jpmschweitzerandClaude Opus 4.8 7e76455775 record D-79: workspace content search is pure-Dart, outside pql
Find-in-files / replace (T-52/T-53) run as an in-process isolate-pool
grep engine behind an engine-agnostic search.grep verb — not pql (its
search is a ranked document index, with no line numbers, regex, or
glob) and not a ripgrep shell-out (unvendored, not guaranteed
cross-platform). ripgrep is kept as a future optional accelerator
behind the same verb. Clarifies the D-3 wrap-pql boundary: content
grep is a code-navigation primitive pql does not offer.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-05-31 20:08:25 +02:00
jpmschweitzerandClaude Opus 4.7 af02ae39c4 add team cockpit + sidebar sub-tab wireframes (frame0)
Phase-2 interaction-model wireframes (D-77): the team cockpit sidebar and
the expanded team-chat pane (message inbox, @-routing, interrupt tickbox,
per-agent permission-mode badge), and the Claude sidebar reorganised into
Activity / Team / Config sub-tabs. Referenced by T-180..T-183.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-25 11:26:48 +02:00
jpmschweitzerandClaude Opus 4.7 1e77d72361 add StreamJsonSession transport (T-165 foundation)
test / unit + widget + golden + a11y (push) Failing after 25s
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
test / dart doc (lib API) (push) Failing after 23s
The testable core of the stream-json pivot (D-77): StreamJsonSession drives
a claude process in stream-json mode — parsing its line-delimited events into
the existing ConversationItem / SessionStatus types (reusing
parseTranscriptChunk, since stream-json assistant/user events share the
transcript's message.content shapes), pulling permission-mode off the init
event, and sending user input as stream-json over stdin (with a local echo
so the user's own message renders immediately). The process is abstracted
behind StreamJsonProcess so it unit-tests without spawning; the real
ClaudeStreamJsonProcess wraps Process.start.

Not yet wired into the pane — the claude_pane integration (replace the
tmux/PTY spawn + TranscriptReader feed, route input through send) and live
verification are the next step.

T-165.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-24 18:41:34 +02:00
jpmschweitzerandClaude Opus 4.7 e27b2b7fb1 add D-76: ClaudeConfig as clide's Claude config surface
Extends D-75's accepted CC-internals coupling from the transcript/team
schema to the config layout: a builtin-owned ClaudeConfig service is the
app-wide source of truth for skills, commands, settings, and permissions
(global + local, layered), watched and refreshable. Built-in slash
commands come from a stream-json probe cached per claude version id.
Kernel stays Claude-agnostic — Claude is a non-disableable extension but
still an extension. Implemented by T-151..T-154.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-23 11:54:04 +02:00
jpmschweitzerandClaude Opus 4.7 e1cd4653c0 bind each Claude pane to its own session id (T-146)
A regression from T-137: every pane rendered the newest .jsonl in the
workspace dir, so concurrent sessions collided — a secondary tab showed
the primary's conversation. Each pane now spawns claude with its own
--session-id (a transcript is named <session-id>.jsonl), tails that
exact file via TranscriptReader's file: param, and uses a per-session
MessageBus channel so controllers don't cross-talk.

The primary's id is deterministic from its session name (stable → it
resumes across restarts, like /resume off the same history file);
secondaries get a fresh random id so a clean session is always available.
The reader now waits for the bound file to appear rather than throwing.

Migration: an existing tmux session created before this (no --session-id,
claude chose its own id) must be killed once (claude.kill-all-sessions)
so the next spawn binds the controlled id.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-23 08:28:55 +02:00
jpmschweitzerandClaude 04aed1e851 record D-75: render Claude natively from transcripts (T-133)
Decision for epic T-132: clide renders the Claude conversation as native
Flutter widgets driven by Claude Code's transcript JSONL, not by scraping
the PTY/TUI. Claude still runs under tmux for process persistence (D-41),
but its content is sourced from the transcript. The terminal emulator is
retained as a general IDE tool only. Records the Claude-centric > CLI-first
ordering (D-6 surfaces preserved) and the accepted, version-pinned coupling
to Claude Code internal contracts, isolated behind one reader/observer.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-05-22 19:36:31 +02:00
jpmschweitzerandClaude 2b93bb1cb2 D-70/71/72: lock in the T-99 IPC server architecture choices
test / unit + widget + golden + a11y (push) Failing after 26s
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
test / dart doc (lib API) (push) Failing after 1m0s
Three architectural commitments T-124 needs settled before any code:

* D-70 — socket path is per-workspace and deterministic
  (`$XDG_RUNTIME_DIR/clide/<sha256(workspace)[:16]>.sock`). No env
  override; matches the per-repo tmux socket pattern (D-41) so users
  see one consistent shape across clide's process boundaries.
* D-71 — file permissions are the only gate: `0600` on the socket,
  `0700` on the parent. Capability-token auth stays a Tier-6 concern
  tracked by Q-1.
* D-72 — multi-connection accept loop, serial dispatch on the main
  Flutter isolate. Per-handler isolate offload (the NativePty /
  SchedulerService pattern) is available where it matters; the IPC
  layer doesn't impose isolate-safety across every subsystem.

T-124's description updated to inline the three decisions so the
implementer starts with the contract, not a discovery pass.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-05-18 14:43:09 +02:00
jpmschweitzer 01a99edd52 migrate to changelog replication 2026-05-10 01:25:32 +02:00