Commit Graph
1172 Commits
Author SHA1 Message Date
jpmschweitzerandClaude Fable 5 d762f8b19b chore(plan): sweep the T-512 idmap export
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-13 22:50:01 +02:00
jpmschweitzerandClaude Fable 5 6f148b9910 docs(skills): lead the clide skill description with the entry action (T-512)
FR-2: settled-reach's drifted copy of the skill had a sharper opening —
naming clide-on-PATH + CLIDE_SOCK and `clide capabilities` as the first
move — which de-forking back to canonical would have dropped. The
description is what an agent reads when deciding whether to invoke the
skill, so the entry action belongs up front. Frontmatter wording only.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-13 22:49:23 +02:00
jpmschweitzerandClaude Fable 5 670915fbc9 chore(plan): close T-511 (per-workspace PATH preset shipped)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-13 18:49:33 +02:00
jpmschweitzerandClaude Fable 5 7b395c5a0a fix(testmode): skip the fd-inheritance probe when its helper is absent
The probe spawns a hand-built /tmp/checkfd binary that exists only on
machines where the T-438-era investigation ran; everywhere else it
failed the whole harness with a ProcessException. Absence is now an
explicit skip line, and the helper path is a named constant in both
the io and web-stub variants.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-13 18:48:48 +02:00
jpmschweitzerandClaude Fable 5 d9d06cf98e test(coverage): bring the backlinks panel under test; close preset gaps
The pre-push coverage gate was failing at 94.84% — below the 95% floor
even before the T-511 feature landed (the feature files sit at 97%; the
tree without them was at 94.80%). The bulk of the debt was the pql
backlinks panel: controller and view carried ~100 lines with zero
tests. Covers controller fetch/error/event-refresh/dispose and view
empty/error/group/row-navigation states, plus the T-511 stragglers a
formatter-conflicted edit dropped (presetLookupRoot) and the
env.path production default seams. Gate now passes at 95.26%.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-13 18:45:10 +02:00
jpmschweitzerandClaude Fable 5 f5c4826a55 docs(governance): fix the last D-58 -> D-92 reference in D-104
The CLIDE_PQL_BIN override is defined in D-92 (ship pql bundled);
D-58 is format engines. Third of three misattributions on this record
— the first two were corrected alongside D-106.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-13 18:18:08 +02:00
jpmschweitzerandClaude Fable 5 5398ecdc3f test(files): lock .worktrees/ into the ignore roster + init scaffold
The 23dd7fd1 behavior shipped without a test delta; the builtin-roster
lock test and the scaffold assertion now cover it.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-13 18:17:51 +02:00
jpmschweitzerandClaude Fable 5 0a44f95dfd fix(env): harden the PATH preset per review (T-511)
Three holes from the T-511 adversarial review pass:

- An entry containing the PATH separator smuggled extra tokens into
  the joined PATH — a stray trailing ':' yields an EMPTY token, which
  POSIX shells resolve as CWD (the dot-in-PATH hazard). The CLI verb
  and the settings control now reject such entries, and applyPathPreset
  skips malformed stored values that predate the check.
- The gitdir pointer a worktree resolution follows is repo-controlled
  text; the resolved main root is now validated (must hold a real
  .git directory) before its preset key is trusted, so a crafted
  pointer can't alias an arbitrary path's preset.
- A pane spawned with a cwd below the workspace root hashed the
  subdirectory and silently missed the workspace preset; the lookup
  now keys any in-workspace cwd to the workspace root
  (presetLookupRoot).

Also: the Add button pairs buttonBackground with its own
buttonHoverBackground token instead of borrowing the list-item hover
token, and the hosted-Claude leg gains an end-to-end orchestrator test
(preset lookup → spawn env).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-13 18:17:35 +02:00
jpmschweitzerandClaude Fable 5 49c82556a2 fix(settings): quote numeric-shaped YAML keys so hash-keyed settings survive reload
The emitter wrote block-map keys raw while only values went through
quoting. A workspace-hash key segment that happens to be all digits
with a leading zero (or digits-e-digits) reloaded as an int/float —
leading zero dropped, or collapsed to Infinity — orphaning the stored
value. Hit ~1 in 1200 repos, deterministically and permanently: the
PATH preset (D-106) and the pre-existing Claude account binding for
such a repo vanished on every restart with no diagnostics. Same defect
class as the T-376 value-corruption fixes in this file; found by the
T-511 review pass, confirmed against the live store.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-13 18:17:15 +02:00
jpmschweitzerandClaude Fable 5 880f642261 docs(inbox): add the feature-request inbox; triage FR-1 into D-106 (T-511)
The pre-triage inbox logged from consumer sessions (pql,
settled-reach), mirroring pql's own convention. FR-1 (per-repo PATH
preset) is accepted and shipped — tombstoned here, decided in D-106,
implemented under T-511. FR-2 (clide skill description lead) remains
proposed.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-13 17:41:47 +02:00
jpmschweitzerandClaude Fable 5 23dd7fd187 feat(files): treat in-repo .worktrees/ checkouts as ignored (T-511)
D-106 supports opening a worktree under <repo>/.worktrees/ as its own
workspace; the dir itself is sibling checkouts, not tree content — so
the builtin ignore set hides it and the project-init scaffold
gitignores it alongside .clide/.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-13 17:41:24 +02:00
jpmschweitzerandClaude Fable 5 1308cb3d23 feat(settings): Workspace PATH section in the Tools category (T-511)
The UI half of D-106 (D-6 parity with `clide env path`): an ordered
preset editor — add/remove/reorder, a missing-dir warning, a worktree
note naming the shared main repo, and capture-from-login-shell
suggestions adopted with one click. Writes land on the same user-scope
key the CLI verbs use and publish on the same channel, so both
surfaces stay live off the store notifier.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-13 17:41:06 +02:00
jpmschweitzerandClaude Fable 5 e1fea83868 feat(env): per-workspace PATH preset injected at spawn (T-511)
Implements D-106. The T-439 login-shell probe is a global heuristic
with a known hole — login-but-non-interactive shells skip ~/.bashrc,
so interactive-only additions (brew shellenv) never reach the agent's
Bash tool or terminal panes on a desktop launch. The preset is the
explicit per-repo layer on top: user-scope storage keyed by repo
identity (a linked worktree resolves through its gitdir pointer to the
main repo, so worktrees share the preset), prepended at spawn via the
PaneRegistry pathForSpawn hook and agentEnvDelta prependDirs — which
now exports PATH even when clide is already resolvable, closing the
gap where the hosted session inherited the sparse GUI PATH untouched.

CLI half: `clide env path list|set|add|remove|clear|capture` over an
injected Flutter-free store port; capture diffs the login-shell PATH
against the process PATH to suggest the dirs a desktop launch dropped.
Binary resolution (toolchain, supporter pins, bundled pql/git) stays
preset-blind per the D-92/T-98 fence.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-13 17:40:48 +02:00
jpmschweitzerandClaude Fable 5 1ac60d1fe7 docs(governance): D-106 per-workspace PATH preset (T-511)
Decides FR-1: a machine-local, user-scope list of dirs prepended to the
PATH of every spawned shell, keyed by repo identity so linked worktrees
(.worktrees/) share their main repo's preset. Prepend-over-login-shell
semantics, D-6 CLI parity (env path verbs), and a security fence: the
preset never feeds clide's own binary resolution (T-98 lesson).

Also corrects D-104's cross-references: the bundled-pql decision is
D-92, not D-58 (D-58 is format engines) — the anchor was dead.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-13 17:40:28 +02:00
jpmschweitzerandClaude Fable 5 bd3acf38e9 chore(plan): close T-510 (bypass reachability shipped)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-05 12:59:08 +02:00
jpmschweitzerandClaude Fable 5 a15b3fd098 feat(claude): reach bypass via Ctrl/Cmd+Shift+M + shift-click (T-510)
Restores the original intent that T-226's refinement wording lost: the
shift modifier is the explicit opt-in for bypassPermissions, not a
separate confirm flow. Plain Ctrl/Cmd+M keeps cycling the safe trio;
Ctrl/Cmd+Shift+M cycles the full list. The composer menu's bypass row
was permanently disabled, deferring to "the cockpit's confirmed path" —
but that roster is ghost-fed (T-396), so bypass was unreachable from
the primary session's UI entirely. The row now no-ops on a plain click
(menu stays open) and selects on shift-click, with a hint naming the
gesture. Roster badge and /permissions paths unchanged.

lib/test_app.dart is a format-only follow-up to the previous commit.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-05 12:54:11 +02:00
jpmschweitzerandClaude Fable 5 0f1d15efdd test(testmode): add canvas to the extension roster (T-322)
builtin.canvas graduated from a Tier-0 stub to a real extension with an
activate/deactivate lifecycle, so the real-boot harness should exercise
it like its siblings. 26/26 pass.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-05 10:03:54 +02:00
jpmschweitzerandClaude Fable 5 e2e305dea6 feat(canvas): open .canvas files in a workspace pane (T-322)
Makes the canvas foundation (parser/renderer/view) reachable. The
extension owns an app-scoped MultitabController (the diff/T-233
pattern) so open documents survive the pane being rebuilt; each
document is a real sub-tab per the refinement decision, kept alive
across switches. Routing goes through the existing seams instead of
the dead TabContribution.fileGlobs field: openWorkspaceFile gains a
.canvas branch mirroring .md, and ui.open gains a canvas reader for
D-6 parity (clide ui open canvas <path>). Also corrects the
json_canvas doc header that claimed SVG-lowering — the interactive
pane paints the model directly (D-103 live-widget exception).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-05 08:56:09 +02:00
jpmschweitzerandClaude Fable 5 8d7d886bea chore(plan): record T-322 integration-phase refinement (T-322)
Batch selection via /whats-next confirmed finishing T-322 as the next
work. Refinement pass resolved the open integration questions:
workspace slot + real MultitabPane tabs (user-confirmed), file-open
routing via the openWorkspaceFile() .md-branch mirror plus a ui_command
_readers entry for D-6 CLI parity (fileGlobs confirmed dead — not
wired), and a stale SVG-lowering doc header in json_canvas.dart to fix
alongside the pane-shell work.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-03 22:26:01 +02:00
jpmschweitzerandClaude Opus 4.8 53c053d4d4 chore(plan): record T-322 canvas foundation complete (parser/renderer/view)
The .canvas rendering + interaction foundation is built and tested (parser,
CustomPaint renderer, interactive CanvasView — 21 tests). Records the
remaining reachable-integration phase: pane shell, CanvasExtension
registration, and .canvas file-open routing (TabContribution.fileGlobs is
declared but unconsumed, so routing must be built).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-02 23:23:14 +02:00
jpmschweitzerandClaude Opus 4.8 7700fc7a83 feat(canvas): interactive CanvasView — pan, zoom, click-select (T-322)
Adds hitTestCanvasNode (topmost node under a point, cards over the group
frames behind them, via the same viewport the painter draws with) and the
CanvasView widget: scroll-zoom, drag-pan, and click-to-select with a focus
ring. Node drag/resize and edit affordances follow.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-02 23:14:13 +02:00
jpmschweitzerandClaude Opus 4.8 d42c8c3236 chore(plan): keep T-509 broad — render bug is one symptom
Records that the model/effort trust problem spans more than the
local-command-stdout render defect: control state reflection, point-of-
interaction acknowledgement, and active-value drift are all in scope.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-02 22:41:31 +02:00
jpmschweitzerandClaude Opus 4.8 717b854d19 chore(plan): file T-509 (model/effort feedback) + T-322 canvas progress
T-509 (child of the UI/UX epic T-276): investigate + improve the model
switch and effort toggle so a change is unmistakably confirmed. T-322
(canvas pane) moved to in_progress with its parser + renderer foundations
recorded.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-02 22:39:16 +02:00
jpmschweitzerandClaude Opus 4.8 7fa2d091bc chore(plan): file T-509 (model/effort feedback) + T-322 canvas progress
T-509 (child of the UI/UX epic T-276): investigate + improve the model
switch and effort toggle so a change is unmistakably confirmed. T-322
(canvas pane) moved to in_progress with its parser + renderer foundations
recorded.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-02 22:37:26 +02:00
jpmschweitzerandClaude Opus 4.8 035a37a13c feat(canvas): CustomPaint renderer for .canvas docs (T-322)
Paints a CanvasDoc — group frames behind, edges with arrowheads, then
node cards (text / file / link) — fitted by a shared pan/zoom CanvasViewport
so a later hit-test lands on what's drawn. Node colours come from the file
(Obsidian presets 1..6 or hex), not clide tokens, since a .canvas is
arbitrary content; only the chrome is themed. Read-only for now; selection,
drag, and edit affordances follow.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-02 22:26:07 +02:00
jpmschweitzerandClaude Opus 4.8 2eb5d0f170 feat(canvas): JSONCanvas parser + model for .canvas files (T-322)
Parses the Obsidian .canvas format into a typed CanvasDoc — text / file /
link / group nodes and edges (sides, end caps, colour, label) — and
serialises back with round-trip fidelity. Unknown node types and entries
missing required fields are skipped rather than fatal; end caps omit their
spec defaults on write. Pure Dart, no I/O; runs under dart test. The
foundation for the interactive canvas pane.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-02 22:19:14 +02:00
jpmschweitzerandClaude Opus 4.8 3e972a7309 chore(plan): close T-323 — vault graph view complete
The Tier-5 graph pane is fully delivered: force-directed layout, hover
highlight, click-to-open, pan/zoom, and path-glob / tag / depth filters.
Real-boot verified via testmode; 56 graph tests green.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-02 21:48:20 +02:00
jpmschweitzerandClaude Opus 4.8 aabec87d9a feat(graph): filter bar — path glob, tag include/exclude, depth (T-323)
Switches the controller from pql.outlinks to pql.meta (outlinks + tags in
one call per file) and strips #heading fragments from link targets, so a
heading link now connects the two notes. Adds a filter bar above the graph:
a path glob that re-queries pql on submit, a depth-from-active selector for
the local graph around the open note, and tri-state tag pills
(neutral / include / exclude). The pane draws the filtered visibleGraph.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-02 21:42:50 +02:00
jpmschweitzerandClaude Opus 4.8 f859173b98 feat(graph): filter model — local-graph BFS, subgraph, GraphFilter (T-323)
Adds the pure filtering primitives the graph pane composes: VaultGraph
nodesWithin (depth-bounded BFS over undirected edges = the local graph
around a note) and subgraph (retain a node set + the edges between them),
plus GraphFilter, which combines depth-from-active with tag include/exclude
over a caller-supplied tag map. Flutter-free; runs under dart test.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-02 20:26:59 +02:00
jpmschweitzerandClaude Opus 4.8 46d9b4031c test(testmode): cover builtin.graph activation in the harness
Adds PqlExtension + GraphExtension to the extensions-category boot test so
the graph view's dependency-ordered activation and real i18n-catalog load
are validated in a full app boot, not just the widget fixture.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-02 16:40:10 +02:00
jpmschweitzerandClaude Opus 4.8 e6556401f3 feat(graph): pan + zoom on the vault graph view (T-323)
Folds a user zoom (scroll wheel, clamped) and pan (drag) transform into
GraphViewport so the painter and hit-testing move in lockstep — hover and
click keep landing on what's drawn. Zoom scales about the canvas centre; a
fresh graph re-fits and drops the transform.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-02 15:55:59 +02:00
jpmschweitzerandClaude 07ef8cbbcc chore(plan): close T-507 — clide-side skill cleanup done
Co-Authored-By: Claude <noreply@anthropic.com>
2026-07-02 11:56:04 +02:00
jpmschweitzerandClaude 78d5f22104 docs(skills): prune bundled skills to clide-specific set (T-507)
The 2026-07-02 skill review found the repo bundling skills that don't
belong to it: d2-diagram and frame0-wireframe are repo-agnostic and
carried settled-reach game content verbatim (agent personas, palette,
templates) presented as clide conventions; skill-create was a
byte-identical copy of a generic skill; clean-house was double-installed
(the pql-managed user-scope copy is canonical); the generic commit skill
collided with git-commit on its trigger word while contradicting three
repo safety rules; penpot-login was fully broken and published personal
infrastructure in a public repo.

d2-diagram, frame0-wireframe, and skill-create now live de-contaminated
at user scope (~/.claude/skills/). The commit/penpot-login/clean-house/
skill-create deletions landed with the previous commit (pre-staged by
git rm); this one removes the centralized pair and rewrites the README
index to the five clide-specific skills that remain.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-07-02 11:55:28 +02:00
jpmschweitzerandClaude b02740e87d docs(skills): fix stale guidance in bundled skills (T-507)
The 2026-07-02 skill review (adversarially verified) found the bundled
skills teaching pre-refactor reality: whats-next pointed refinement
agents at the pre-governance/ decision paths, claimed gh doesn't exist,
and taught the hand-staged .pql/changelog flow the pre-commit hook
replaced; git-commit mandated the heredoc-in-substitution commit form
the repo moved away from and referenced sidecar-era paths; the clide
skill omitted the dock slot (D-87); testmode omitted the terminal
category; ui-design's glyph table taught the static-const icon API
removed in T-314, and its generator scanned for a pattern that no
longer matches anything.

All fixed against current repo state. The glyph table is regenerated
3-column (name-keyed, byName-first); tool/gen_phosphor_glyphs.dart
round-trips it byte-identically. git-commit also gains the
session-vs-pre-existing triage step (backported from the settled-reach
variant) since this worktree hosts concurrent Claude sessions.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-07-02 11:51:41 +02:00
jpmschweitzerandClaude Opus 4.8 a5acb6acc7 feat(graph): register the vault graph view in the context panel (T-323)
Wires GraphPanel into GraphExtension as the graph.view context-panel tab
(its icon-rail entry and tab id were already scaffolded) and ships the
builtin.graph i18n catalogs. The graph is now reachable: notes as nodes,
wikilinks as edges, hover-highlight and click-to-open. It activates after
its pql dependency, which supplies the link data.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-02 10:32:13 +02:00
jpmschweitzerandClaude Opus 4.8 6fae1bc46a feat(graph): graph context-panel shell — states + click-to-open (T-323)
Wraps GraphController + GraphView into the panel widget: loads the vault
graph on mount, shows a spinner / empty / error state until it is ready,
then draws the graph and opens a note on node click via editor.open. A
debounced refresh keeps the current graph on screen instead of flashing
back to the spinner.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-02 09:43:57 +02:00
jpmschweitzerandClaude Opus 4.8 3b67725b7e feat(graph): pql-backed GraphController — files + outlinks to VaultGraph (T-323)
Lists every markdown note (nodes) and fetches each one's outlinks
(edges) via the pql.files / pql.outlinks IPC commands, assembling the
file->outlinks map that VaultGraph consumes. Coalesces file-change
bursts into one debounced reload. 1+N calls, since pql exposes no
bulk-outlinks query; acceptable for a spinner-backed, explicitly-opened
view.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-02 09:30:35 +02:00
jpmschweitzerandClaude Opus 4.8 c529703b9f feat(graph): interactive GraphView — hover-highlight + click-to-open (T-323)
GraphView lays a VaultGraph out with the force solver, paints it, and wires
hover (light the hovered node's neighbourhood, dim the rest) + click (onOpen
with the node's vault path). A shared GraphViewport keeps hit-testing aligned
with paint. Solver + model + painter + interactive view now stand; the pql
link-data wiring, filter, and MultitabPane/slot registration are the
remaining "integrate into the app" work.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-02 08:34:26 +02:00
jpmschweitzerandClaude Opus 4.8 6bea1723bb feat(graph): CustomPaint renderer for the vault graph (T-323)
GraphPainter draws a solver-positioned VaultGraph — edges as lines, nodes as
labelled dots — fitting the layout space into the canvas (aspect-preserving,
centered), with a hovered node's neighbourhood lit and the rest dimmed.
Paints through SurfaceTokens (the graph is IDE chrome here, D-7).
Pixel-tested. Solver + model + painter now stand; the interactive pane (pql
wiring, hover/click, filter, tab/slot) is next.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-02 08:31:37 +02:00
jpmschweitzerandClaude Opus 4.8 084bf84258 feat(graph): vault link-graph model — notes to nodes, wikilinks to edges (T-323)
VaultGraph.fromOutlinks builds the graph from pql's per-file outlinks: every
file a node (labelled by basename), each outlink to a known file an edge;
self/dangling links dropped, parallels de-duped. neighborhood() drives the
hover-highlight; edgePairs feeds the ForceLayout solver. Pure Dart,
dart-tested (6 cases). The graph pane's data layer, on top of the solver.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-01 22:32:37 +02:00
jpmschweitzerandClaude Opus 4.8 1e8ee2c412 test(coverage): lift os/code-block/deeplink for gate headroom
The three worst-covered files were genuinely untested, not edge cases:
os.dart 27%→~85% (inject the process runner so openURL/reveal don't spawn a
real browser), clide_code_block 39%→~90% (expose the byte→char span mapper
as a top-level fn + render tests), deeplink 29%→~75% (the confirm-opens and
not-activated paths). Buys buffer above the 95% floor so a feature batch
doesn't immediately trip the gate. 95.01% → 95.22%.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
v2.9.0
2026-07-01 22:01:08 +02:00
jpmschweitzerandClaude Opus 4.8 1d9000988d test(draw): cover the 2.9.0 drawing-card additions to clear the coverage floor
The drawing-card feature batch (icon/image/compare/graph/d2 cards, --stdin,
tool resolution) added widget + wiring code that dipped total coverage under
the 95% floor — surfaced by `make release` (push-check skips coverage). Cover
the gaps: ProblemsController.refresh, every SVG shape-type bbox + the style
vocabulary, _spawnD2 via a real /bin/cat, the icon-show bus path + error
branches, and quad/arc/close marker paths.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-01 22:00:56 +02:00
jpmschweitzer 9abcb0c30c release v2.9.0 2026-06-30 00:36:07 +02:00
jpmschweitzerandClaude Opus 4.8 2150a85b2f fix(cli): make clide draw reachable as an umbrella command (T-318)
draw is single-token (no verb), so `clide draw --file x` mis-parsed as cmd
"draw.--file" — the dispatcher registered draw but the argv parser never
learned it was umbrella (unlike icon/image which use subsystem.verb). Found
driving the live install; the handler unit tests bypassed the argv path so
they missed it. Added draw to _umbrellaCommands + a parse regression test.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-30 00:28:28 +02:00
jpmschweitzer b0cc60735c chore(plan): split Tier-5 interactive panes (T-322/T-323) into epic T-506 2026-06-30 00:18:11 +02:00
jpmschweitzerandClaude Opus 4.8 bcef3a6fca feat(graph): deterministic force-directed layout solver (T-323)
Fruchterman-Reingold (clide-owned, no layout package): nodes repel, edges
attract, cooled over iterations into a readable layout. Deterministic — a
fixed circular seed, no RNG — so the graph view is stable across rebuilds
and the solver is unit-tested (6 cases). Flutter-free; the interactive graph
pane (render, pan/zoom, hover, filter, pql wiring) builds on this.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-30 00:03:44 +02:00
jpmschweitzerandClaude Opus 4.8 c167a37ea7 feat(draw): graph card template — circular node/edge layout (T-321)
graphTemplateHandler lowers a {nodes,edges} payload to SVG: a deterministic
circular layout of labelled <circle> nodes with <line> edges, self-contained
(own light backdrop + content colors, like a d2 card) and painted by the
shared renderer. Display-only (D-78); decoupled from the interactive graph
pane (T-323) since a static card only needs a layout->SVG. Honest error on
a duplicate id or an edge to an unknown node.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-30 00:00:44 +02:00
jpmschweitzerandClaude Opus 4.8 64410e8047 feat(cli): --stdin piped JSON payloads for structured commands (T-315)
The C client slurps stdin when it sees --stdin, strips the flag, and ships
the payload alongside the argv; the Dart unwrap folds it into the request
as a `stdin` arg (undeclared keys pass the schema untouched). icon.show and
image.show now read that payload as the peer of --file (stdin wins). Bounded
slurp + the envelope's existing size guard keep a huge payload from
corrupting the wire. C client builds clean.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-29 23:56:33 +02:00
jpmschweitzerandClaude Opus 4.8 1f6d31ac73 feat(draw): wire compare card image loading + register the template (T-319)
The drawing card now loads any <image> hrefs its SVG references into
ui.Images before painting (loadDrawingImages, decoder injectable for
tests) — the renderer and the lightbox both paint through the resolver, so
a compare card shows real images and zooms. main registers the `compare`
template with a workspace path resolver. A drawing with no images is
unaffected.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-29 15:02:21 +02:00
jpmschweitzerandClaude Opus 4.8 a651c9e026 feat(draw): compare template + aspect-fit image painting (T-319)
compareTemplateHandler lowers an `images` array to an SVG of side-by-side
<image> cells, each with the per-object data-label/description caption and
data-lightbox; paths resolve to absolute up front (injected, honest error
on a miss). _paintImage now aspect-fits (contain, centered) so cells of
differing-shape images don't distort. Flutter-free handler + painter pixel
tests. Card image-loading + registration next.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-29 13:57:47 +02:00