Raise the declared minimums in pubspec.yaml to what our deps already
require: Flutter >=3.35.0 / Dart >=3.9.0 (was 3.19.0 / 3.5.0). alchemist
0.12 needs Flutter 3.32; Dart 3.9 first ships in Flutter 3.35, so 3.35 is
the binding floor. Pin the exact build toolchain in .fvmrc (Flutter
3.44.1).
Moving to the Dart 3.9 language level switches `dart format` to the new
"tall" style and enables two new lints. This commit is the resulting
mechanical churn, isolated from any behaviour change:
- whole-tree `dart format` reformat (tall style)
- `dart fix` for unnecessary_underscores + use_null_aware_elements
No runtime behaviour change; `make test` green.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The pin/unpin toggle is a mode control, not navigation — grouping it
with back/forward/jump implied they work alike. Pull it out of
ReaderActionBar into a standalone ReaderPinButton placed before the
title (ClidePaneChrome.leading), leaving the right-hand navigator to
back/forward/jump-to-pin/edit. Applies to all three readers. (T-198)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Bring the tickets detail in line with markdown/decisions (D-81). The
controller loads on 'load' (the channel the retained ReaderNav emits),
the extension reveals the static tickets.detail tab on selection instead
of the per-click uncontribute/contribute churn (the T-188 anti-pattern),
and the view grabs nav.current on mount and wraps in ClidePaneChrome
with a ReaderActionBar — pin toggle left, back/forward + jump-to-pin
right, no edit pencil (tickets are pql records, not files). The
controller drops its now-unused panels dependency.
Also adds the tickets builtin's first tests — the sidebar list
(load/sections/filter/select/empty/error/refresh) and the detail reader
(load, nav, pin, parents/decisions/status) — covering a pre-existing gap
exposed by bringing these files under test.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Status buttons in the detail view now call pql.tickets.status IPC,
publish a changed event to refresh the sidebar list, and reload the
detail. Disabled for the current status. IPC handler accepts ids as
a list for batch transitions. PqlClient.ticketSetStatus takes
List<String> and joins with comma per pql CLI contract.
Co-Authored-By: Claude <noreply@anthropic.com>
All sidebar and detail panes use clideFontSmall/clideFontBadge/
clideFontCaption instead of hardcoded sizes — single place to tune.
Decision detail view subscribes to the message bus for selection
events (same pattern as ticket controller) and publishes focus after
loading. Both decisions and tickets sidebar views subscribe to the
focus channel, expand the accordion section, highlight the active
card, and scroll it into view.
Clickable DQRT links wired in decision detail, ticket detail, and
markdown viewer via onRecordTap. Ticket descriptions now render
through ClideMarkdown instead of plain text.
Co-Authored-By: Claude <noreply@anthropic.com>
Clicking a parent ticket in the tree publishes
builtin.tickets/selection — loads that ticket in the detail view.
Clicking a decision ref publishes builtin.decisions/selection —
switches context panel to the decision detail. Both show hover
highlight. Enables full cross-reference navigation without
leaving the context panel.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Two flow fixes:
1. First click now works — extension passes initialId to the
detail view constructor, which loads immediately in
didChangeDependencies. No second click needed.
2. Tab despawns when user navigates away — extension listens to
PanelRegistry changes, despawns detail tab when it's no longer
the active context panel tab.
Each selection re-creates the tab with a fresh initialId so the
view always matches the selection. Applied to both tickets and
decisions.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Click a ticket card in the sidebar → publishes on
builtin.tickets/selection → detail controller loads full ticket,
walks parent chain, resolves decision refs → context panel
activates tickets.detail tab and renders:
- Full ticket header with type dot, ID, priority
- Status controls (tappable row to change status)
- Description
- Parent tree (indented compact cards)
- Referenced D-records as cards
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>