fix(explorer): address PR #486 review blockers + resolve conflict with main

Merge conflict resolution:
- Kept fix/graph-motion's conditional layout-stop (only in focused mode)
  to preserve live layout motion for derived graphs — the core intent of
  this PR.

Must-fix items resolved:

1. plugin.json — removed "hooks": "./hooks/hooks.json" (re-added by this
   branch, already removed in PR #489 on main as it is auto-loaded).
   Kept "agents": "./agents".

2. Double Louvain per render — added groupedViewAvailable useMemo in
   GraphWorkspace (deps: [graphVersion]) that runs community detection
   once. Passed result into resolveDisplayGraph and resolveDisplayStateSnapshot
   via new groupedViewAvailable option; both functions skip their internal
   computeGraphAnalyticsBase call when the value is pre-supplied.

3. graphVersion in displayState deps — removed graphVersion from the
   displayState memo dep array. displayState now depends on the stable
   boolean groupedViewAvailable, not on every ADD_NODE/ADD_EDGE tick,
   so Louvain no longer re-fires on every WebSocket update.

4. hideLabelsOnMove / hideEdgesOnMove flipped to true — intentional:
   suppressing labels and edges during pan reduces visual noise and is
   part of the flicker-reduction fix described in the PR.

Co-authored-by: ZohaibHassan16 <zohaibhassan1696@gmail.com>
Co-authored-by: KaifAhmad1 <kaifahmad087@gmail.com>
This commit is contained in:
KaifAhmad1
2026-04-23 18:58:48 +05:30
co-authored by ZohaibHassan16
10 changed files with 76 additions and 18 deletions
+2 -1
View File
@@ -91,7 +91,8 @@ claude --plugin-dir ./plugins
Or inside a session:
```bash
/plugin install ./plugins
/plugin marketplace add ./plugins
/plugin install semantica@semantica-local
```
Verify:
+4
View File
@@ -1,5 +1,9 @@
{
"name": "semantica-local",
"owner": {
"name": "Hawksight AI",
"url": "https://github.com/Hawksight-AI/semantica"
},
"plugins": [
{
"name": "semantica",
+1 -2
View File
@@ -25,6 +25,5 @@
"mcp"
],
"skills": "./skills",
"agents": "./agents",
"hooks": "./hooks/hooks.json"
"agents": "./agents"
}