Releases: SBangslund/samind-3d-graph
Releases · SBangslund/samind-3d-graph
Release list
2.3.3
Fixed
- Cluster physics jitter: nodes never settled and kept visibly vibrating after the previous release's force tuning - the cluster force recomputed each cluster's centroid from its members' current, still-moving positions every tick, then pulled members toward it, creating a feedback loop between the moving target and the nodes chasing it. The centroid is now smoothed with an EMA instead, which removes most of the oscillation; force caps were also dialed back and damping/alpha-decay tuned so any remaining settle-in wobble resolves quickly
- Cluster hover/click hit-testing raycast an invisible, padded axis-aligned bounding box instead of the actual rendered shape - for convex-hull clusters (or just elongated ones) that invisible hitbox extended well past the visible outline into a neighboring cluster's space, so hovering near one cluster's outline often highlighted the wrong one. Now raycasts the actual rendered mesh directly
Changed
- Cluster physics settings simplified from 6 raw force-tuning sliders down to 3 plain-language ones (cluster tightness, cluster separation, explode spread), each 0-10 - the underlying physics values are now derived internally instead of exposed directly, since fine-tuning six interacting raw parameters was confusing and easy to leave in an unstable combination
- Settings sliders now show a live numeric tooltip while dragging
2.3.2
Fixed
McpServer.tsmixed a type-onlyimport type {...} from 'http'with a separate runtimerequire('http')cast viaas typeof import('http')- under the review's type-checking this resolvedServerto TypeScript's internalerrorplaceholder rather than a real type, cascading into "unsafe any" warnings across nearly the entire file. Replaced with a singleimport * as http from 'http'(still compiles to the same externalizedrequire("http")in the bundle, sincehttpis already marked external in esbuild.config.mjs) - norequire()call or eslint-disable needed at allSnippetOverlayService.ts: SVG elements were created viadocument.createElementNS(...) as SVGSVGElement/as SVGLineElement; switched to Obsidian's typedcreateSvg()helper, which needs no assertion- Remaining direct
.style.*/.style.setProperty()mutations inSnippetOverlayService.tsreplaced withsetCssStyles/setCssProps
2.3.1
2.3.0 never actually published - its own release build failed the same
tsc error below, so no release/assets exist for it. This supersedes it.
Fixed
- Build was broken:
registerHoverLinkSourcewas called onapp.workspace, but it's a method onPluginitself (this.registerHoverLinkSource(...)) - the release workflow's own build step failed the same way, so 2.3.0 never got far enough to reach the community review - MCP server sent
Access-Control-Allow-Origin: *with no authentication, while exposing tools that read arbitrary vault file content - real MCP clients (OpenCode, etc.) are native/CLI tools that don't send anOriginheader and aren't subject to CORS at all, so this only ever served to let any webpage open in a browser on the same machine read vault content viafetch(). Removed entirely - the browser's own same-origin policy now blocks that
Changed
- MCP server is now off by default, behind a new toggle in the graph's Settings panel (gear icon → MCP Server) - it previously started unconditionally on every plugin load
- README's privacy section updated to describe the optional MCP server truthfully instead of claiming no network activity at all
2.2.1
Fixed
minAppVersionwas still declared as1.2.3, but 2.2.0'sgetFileByPath()node-click lookup requires1.5.7- bumped to match
2.2.0
Added
- Convex hull cluster boundaries — clusters now wrap their actual node positions instead of an axis-aligned box; switchable back to box via a new Cluster Shape dropdown in Display settings
- Translucent cluster fill — a coloured semi-transparent volume inside each boundary makes cluster territories immediately readable at a glance
- Freeze Layout toggle — stops the physics simulation so nodes stay put; re-enabling it reheats the simulation. Double-clicking a cluster to explode it is also blocked while frozen
- Landmark node labels — the top 8 most important nodes always show their label regardless of mouse position, sized and weighted by their importance score (falls back to link count when no AI analysis is loaded)
- Cluster importance score (
importancefield on clusters inanalysis.json) — drives label font size and weight so the most prevalent topics stand out; the AI skill has been updated to generate this field - Always-visible cluster labels — cluster labels are now permanently visible at base opacity instead of only appearing on mouse hover
Changed
- Cluster boundary opacity raised significantly (box 0.35→0.55, fill 0.07→0.13, label 0.6→0.75) for better readability
- Convex hull expands beyond its nodes by
BOX_PADDINGso the boundary is easier to hover and click - Minimum node count for convex hull lowered from 4 to 2 (degenerate cases fall back to box automatically)
- Physics simulation default
cooldownTimereduced from 15 s to 8 s for faster settling
Fixed
- Release workflow now includes
SKILL.mdas a release asset - Clicking a node in a highlighted cluster caused severe lag —
checkRelationswas cloning the entire graph on every recursive ancestor step; it now reads the source graph directly and avisitedguard prevents infinite loops on bidirectional links - Node click file lookup was O(n) (
vault.getFiles().find()); now O(1) viavault.getFileByPath() - Convex hull was offset because vertices were in world space but then repositioned by the cluster centroid; vertices are now centroid-relative before hull construction
- Orphan nodes were kept in the physics simulation even when hidden (only
nodeVisibilityhid them visually); they are now excluded fromgraphDataentirely, removing their simulation and render cost - Exploding a cluster no longer reheats the simulation when Freeze Layout is on
2.1.0
Added
- First-run onboarding: a dismissible banner in the graph view when no AI analysis exists yet, with a step-by-step setup modal explaining how to generate one
Fixed
- Cluster boxes fully enclosed by another cluster's box were permanently unreachable by hover/click - hit-testing now prefers the innermost contained box instead of always picking the nearest outer one