Skip to content

v1.7.0

Choose a tag to compare

@anton-core-plugin-publisher anton-core-plugin-publisher released this 10 Jun 00:28
· 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-purpose verify-vendored-assets gate (wired into verify-supply-chain) recomputes each hash and asserts the co-located license text, closing the non-Go asset gap go-licenses cannot 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 committed output.css is embedded by a plain go build; a path-filtered css-drift job in verify.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-map gains a vendored-path exclusion so the vendored templUI tree is not held to the first-party doc-citation floor. Rationale in docs/adr/0039-dashboard-tailwind-templui.md.
  • Docs: docs/plugin-spec/09-subsystems/dashboard.md — operator usage doc for core 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-graph v1.80.0 WebGL recipe — the UMD bundle plus three.js r0.183.0 (ESM module + core), the UnrealBloomPass glow pass + its shader deps, and a first-party three-bloom-bootstrap.js ESM bridge — is vendored under internal/dashboard/assets/vendor/ and go:embed-ed (no Node build; shipped binary stays plain go build). THIRD_PARTY_LICENSES.md sha-pins all seven files (3d-force-graph MIT + three.js MIT) and verify-vendored-assets gates 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 resolved relationships edges, 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 JSON truncated flag and a server-log warning — never silently capped. Each node also carries a heat in [0,1] for the frontend's bloom heat-map: a degree floor (graphHeatDegreeFloor, structural — so hubs are legible before any access data accrues) plus an items.access_count freshness 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 shared ReadGraphData read fn (internal/codegraph/cmd).
  • Dashboard 3D graph (canvas): the /graph page 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 ESM three-bloom-bootstrap.js first so window.THREE is set before the UMD bundle reads it — graph renderer and UnrealBloomPass then 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 in 3d-force-graph stay pinned to the same revision (r183), and UnrealBloomPass keeps exposing the _basic blit material the transparency fix reaches into.
  • Dashboard 3D graph (heat-driven bloom): the graph blooms per-node by heat rather than glowing flatly, and renders the full code graph. Each node is an unlit sphere whose warm --graph-* hue is scaled by its server-side heat (0..1, via a scaleHex helper from a cold-visible warm floor HEAT_DIM up 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-link token, so the whole graph reads amber, not grey). The UnrealBloom pass is tuned (strength 0.9, threshold 0.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-scaled nodeVal).
  • Dashboard 3D graph (filter + inspect): the /graph view 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/symbol callers/callees page. A node-click also fires POST /graph/touch?id= — the one write surface under /graph, so every GET stays read-only — which bumps items.access_count via retrieval.Apply (source dashboard-graph), so exploration warms nodes: freshness (hence heat, hence bloom) now accrues from real graph use, not only recall. The endpoint 400s a missing id and 404s a present-but-unknown one (the same existence guard /graph/symbol uses, so no phantom access-log row); the client-side bump is best-effort (a failed POST never breaks inspection). The app shell's main also gains min-w-0 so 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-read Execute dispatch (no query_log write) plus typed ExecuteWalk/ExecutePaths/ExecuteCycles/ExecuteDependents wrappers, and refactor Runner.Run to wrap Execute. Behavior-preserving for the CLI (one log row per fire); enables the read-only dashboard Graph surfaces.
  • setup skill: reworked /anton-core:setup into 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 --check implemented as a status probe (no install-state change). No behavior is removed; all existing flags keep working.

Fixed

  • core dashboard Memory 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 any summary.RunSummary caller): resolve the owner from config before acquiring the rollup's pooled connection. Previously RunSummary held the single SetMaxOpenConns(1) connection across a DB-backed Config.GetOwner, self-deadlocking whenever the config reader was cfgpkg.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/templ v0.3.1020 — typed HTML views for the dashboard (runtime library + a go tool directive for its code generator).
  • Consolidated the weekly Dependabot batch into one PR (supersedes #60, #61, #62, #63):
    • bump github.com/odvcencio/gotreesitter 0.19.1 → 0.20.2.
    • bump github.com/ncruces/go-sqlite3 0.34.3 → 0.34.4 (pulls indirect github.com/ncruces/go-sqlite3-wasm/v2 2.5.35301 → 2.6.35302).
    • bump actions/create-github-app-token v2.2.2 → v3.2.0 (release workflow).
    • bump actions/checkout v6.0.2 → v6.0.3 (verify + release workflows).
  • Regrouped .github/dependabot.yml under a multi-ecosystem-groups weekly group so future gomod + github-actions bumps arrive as a single PR instead of fanning out.