v1.7.0
·
6 commits
to main
since this release
Added
core dashboard— read-only browser dashboard served on localhost. Overview plus the Tasks, Sessions, Improvements, News, Repos, Health, Memory, and Graph surfaces (Graph: roots/coverage orientation, symbol browse, callers/callees/explore, ranked impact, paths-between, cycles), each backed by an exported package read fn the CLI verb also calls.core graph symbols [--query --repo --limit]— list indexed code symbols/modules; the read fn (ListSymbols) is shared with the dashboard Graph symbol-search surface.- Supply-chain:
THIRD_PARTY_LICENSES.md(repo root) attributes and sha-pins the dashboard's vendored non-Go assets — the self-hosted Outfit + Geist fonts (OFL-1.1) and the templUI static primitives (MIT); a new single-purposeverify-vendored-assetsgate (wired intoverify-supply-chain) recomputes each hash and asserts the co-located license text, closing the non-Go asset gapgo-licensescannot see. - Dashboard design system: the UI adopts anton-go's shadcn stack — Tailwind v4 (compiled by the standalone CLI, a dev/CI-only tool the shipped binary never runs) + vendored templUI static primitives (
card/badge/table/button/input/label/separator/skeleton/icon) + a warm terracotta/amber oklch palette + self-hosted Outfit/Geist fonts. The committedoutput.cssis embedded by a plaingo build; a path-filteredcss-driftjob inverify.yml(make css-check) keeps it honest without coupling the release pipeline to Tailwind. A collapsible sidebar rail + dark/light theme toggle are driven by ~20-line vanilla no-FOUC scripts (theme-bootstrap.js/sidebar-state.js; no Alpine/HTMX).cmd/coverage-mapgains a vendored-path exclusion so the vendored templUI tree is not held to the first-party doc-citation floor. Rationale indocs/adr/0039-dashboard-tailwind-templui.md. - Docs:
docs/plugin-spec/09-subsystems/dashboard.md— operator usage doc forcore dashboard(launch flags, the surface map by nav group, and the/graph*sub-surfaces), cross-linked from the overview and glossary. - Dashboard 3D graph (vendoring): the
3d-force-graphv1.80.0 WebGL recipe — the UMD bundle plus three.js r0.183.0 (ESM module + core), theUnrealBloomPassglow pass + its shader deps, and a first-partythree-bloom-bootstrap.jsESM bridge — is vendored underinternal/dashboard/assets/vendor/andgo:embed-ed (no Node build; shipped binary stays plaingo build).THIRD_PARTY_LICENSES.mdsha-pins all seven files (3d-force-graph MIT + three.js MIT) andverify-vendored-assetsgates them. - Dashboard 3D graph (data):
GET /graph/data— a JSON node-link endpoint ({nodes:[{id,label,type,heat}], links:[{source,target,kind}], total, truncated}) that feeds the 3D force-graph view. Nodes are symbol/module items, links the resolvedrelationshipsedges, with a surfaced node cap (a high safety ceiling, default 20000 — the full graph renders, and truncation engages only for a pathologically large graph): when a graph exceeds it the most-connected nodes are kept and the truncation is signalled both in the JSONtruncatedflag and a server-log warning — never silently capped. Each node also carries aheatin[0,1]for the frontend's bloom heat-map: a degree floor (graphHeatDegreeFloor, structural — so hubs are legible before any access data accrues) plus anitems.access_countfreshness boost (graphHeatFreshGain), each normalized against the kept-set maxima and the sum clamped to 1. Links are filtered to those whose both endpoints survive the cap so the frontend never receives a dangling edge. Backed by a sharedReadGraphDataread fn (internal/codegraph/cmd). - Dashboard 3D graph (canvas): the
/graphpage now renders an interactive 3D force-graph, driven by a single vanilla-JS island (internal/dashboard/assets/js/graph.js). It injects the vendored recipe in load-bearing order (the ESMthree-bloom-bootstrap.jsfirst sowindow.THREEis set before the UMD bundle reads it — graph renderer andUnrealBloomPassthen share one three instance), fetches/graph/data, and renders the graph with an UnrealBloom glow. Node/link colours resolve at runtime from the dark-only--graph-*oklch palette (rasterised to sRGB via a 1×1 canvas, since three can't parse oklch); the bloom blit material is marked transparent so the warm card surface shows through. When the server caps the node set the page shows a "showing N of M nodes" banner — the visible half of the never-silent truncation contract. Two Go guard tests protect the vendored invariants: the standalone three and the three bundled in3d-force-graphstay pinned to the same revision (r183), andUnrealBloomPasskeeps exposing the_basicblit material the transparency fix reaches into. - Dashboard 3D graph (heat-driven bloom): the graph blooms per-node by
heatrather than glowing flatly, and renders the full code graph. Each node is an unlit sphere whose warm--graph-*hue is scaled by its server-sideheat(0..1, via ascaleHexhelper from a cold-visible warm floorHEAT_DIMup to full colour) — unlit so on-screen luminance equals the heat-scaled colour and the bloom gates on heat, not scene lighting. Hot (hub/accessed) nodes glow; the cold majority recedes into a dim warm mesh (the ~5000-edge link web is dimmed from a warm tone, not the near-grey--graph-linktoken, so the whole graph reads amber, not grey). The UnrealBloom pass is tuned (strength0.9,threshold0.55) so only genuinely hot nodes cross it — no dense-core white blowout — turning the glow into a real freshness signal. Hot nodes also read subtly larger (heat-scalednodeVal). - Dashboard 3D graph (filter + inspect): the
/graphview gains a type-filter rail (toggle module vs symbol nodes — re-feeds the graph with the kept nodes plus only the links whose both endpoints survive, so none dangle; a missing rail falls back to the full graph) and a click-to-inspect drawer that deep-links the clicked node to its/graph/symbolcallers/callees page. A node-click also firesPOST /graph/touch?id=— the one write surface under/graph, so every GET stays read-only — which bumpsitems.access_countviaretrieval.Apply(sourcedashboard-graph), so exploration warms nodes: freshness (hence heat, hence bloom) now accrues from real graph use, not onlyrecall. The endpoint 400s a missing id and 404s a present-but-unknown one (the same existence guard/graph/symboluses, so no phantom access-log row); the client-side bump is best-effort (a failed POST never breaks inspection). The app shell'smainalso gainsmin-w-0so the graph canvas sizes to its own column rather than its full pixel width — removing a horizontal-scroll overflow that had pushed the graph off-centre and would otherwise strand the right-anchored drawer off-screen.
Changed
internal/codegraph/templates: extract a pure-readExecutedispatch (noquery_logwrite) plus typedExecuteWalk/ExecutePaths/ExecuteCycles/ExecuteDependentswrappers, and refactorRunner.Runto wrapExecute. Behavior-preserving for the CLI (one log row per fire); enables the read-only dashboard Graph surfaces.- setup skill: reworked
/anton-core:setupinto a state-aware concierge — state probe + classification (with a classification line recorded to the events log), smart-default intent menu, plumbing hidden behind named progress stages, single-panel onboarding that remembers declined steps, repair/update framing, a guided uninstall with a keep-data-vs-erase scope menu and typed confirmation for data-erase, and--checkimplemented as a status probe (no install-state change). No behavior is removed; all existing flags keep working.
Fixed
core dashboardMemory search: a title-resolution (RunItemGet) failure now returns 500 instead of silently rendering results with raw item IDs — matching the Memory-detail handler and the dashboard's uniform error contract.core summary(and anysummary.RunSummarycaller): resolve the owner from config before acquiring the rollup's pooled connection. PreviouslyRunSummaryheld the singleSetMaxOpenConns(1)connection across a DB-backedConfig.GetOwner, self-deadlocking whenever the config reader wascfgpkg.SQLConfig(the production wiring) — masked until now because every summary test injects an in-memory config. The dashboard Overview surface drops its pre-fetch workaround as a result.
Dependencies
- Add
github.com/a-h/templv0.3.1020 — typed HTML views for the dashboard (runtime library + ago tooldirective for its code generator). - Consolidated the weekly Dependabot batch into one PR (supersedes #60, #61, #62, #63):
- bump
github.com/odvcencio/gotreesitter0.19.1 → 0.20.2. - bump
github.com/ncruces/go-sqlite30.34.3 → 0.34.4 (pulls indirectgithub.com/ncruces/go-sqlite3-wasm/v22.5.35301 → 2.6.35302). - bump
actions/create-github-app-tokenv2.2.2 → v3.2.0 (release workflow). - bump
actions/checkoutv6.0.2 → v6.0.3 (verify + release workflows).
- bump
- Regrouped
.github/dependabot.ymlunder amulti-ecosystem-groupsweekly group so future gomod + github-actions bumps arrive as a single PR instead of fanning out.