Generates fake knowledge-graph.json with configurable node count
for testing Web Worker layout performance. Forward-only edges to
avoid dagre stack overflow on cyclic graphs.
Usage: node scripts/generate-large-graph.mjs [nodeCount]
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add INSTALL.md for Gemini CLI and Pi Agent, and update all four
READMEs (EN, ZH, JA, TR) with install instructions and compatibility
table entries.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Fix ? shortcut: add shiftKey: true so it matches on standard keyboards
- Fix Escape: keep hook always enabled so ESC closes the modal
(remove dead showKeyboardHelp branch, read all state at invocation time)
- Fix formatShortcutKey: don't show redundant ⇧ for shifted punctuation
- Remove stale showKeyboardHelp from useMemo deps
- Add "Press ? for keyboard shortcuts" hint in graph area
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Use dashboard store state at handler runtime and simplify shortcut wiring to avoid stale closures. App.tsx: replace many useDashboardStore selectors with runtime getState() calls inside keyboard shortcut actions and reduce useMemo dependencies to showKeyboardHelp. KeyboardShortcutsHelp.tsx: remove local Escape key effect (handled globally). useKeyboardShortcuts.ts: ignore shortcuts while typing in inputs/textareas/contentEditable (allow Escape), and improve Mac detection via userAgentData.platform fallback; use the same isMac flag in formatShortcutKey. README (zh-CN & ja-JP): add link to Turkish README (README.tr-TR.md).
Fixes#14 — dashboard becomes unusable with large knowledge graphs (2,700+ nodes).
- Web Worker for dagre layout: graphs above 200 nodes compute layout off the
main thread via a dedicated Web Worker, keeping the UI responsive
- Request ID correlation: concurrent layout calls are routed by incrementing
request ID, preventing race conditions where results cross-wire
- Worker error handling: onerror rejects pending promises; GraphView catches
errors and clears the loading spinner
- Cancellation cleanup: effect cleanup clears layouting state to prevent
stuck spinners when the graph switches below the async threshold
- Topology/visual split: dagre only re-runs when graph structure changes;
node selection, tour highlights, and search results are applied as a
cheap O(n) overlay without triggering relayout
- React.memo on CustomNode: prevents O(n) re-renders when selecting
individual nodes in large graphs
- Zero overhead for small graphs: below 200 nodes, the original synchronous
layout path is used unchanged
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Replace the previous opencode.json example with a directive to fetch and follow the INSTALL.md from the Understand-Anything repo's .opencode path. Also update the OpenCode table entry to indicate "AI güdümlü kurulum" (AI-guided installation). Changes apply to README.tr-TR.md to streamline installation instructions.
Introduce keyboard shortcuts to the dashboard and add contributor docs. Adds a reusable useKeyboardShortcuts hook (with formatShortcutKey), a KeyboardShortcutsHelp modal component, and integrates shortcuts into App.tsx (registering keys like ?, Escape, /, ArrowLeft/Right, l, d and wiring store actions). Adds related styles (.glass-heavy, .kbd) to index.css. Also adds a comprehensive CONTRIBUTING.md with setup, workflow, testing, and PR guidelines.
Add a new Turkish translation file README.tr-TR.md with the full localized documentation and quickstart instructions. Update README.md to include a link to the Turkish README in the language selector so Turkish-speaking users can access the translated docs.
Replace platform-specific install approaches with a consistent
per-skill symlink pattern for OpenCode and Codex (both share
~/.agents/skills/), matching the OpenCode docs requirement of
<name>/SKILL.md discovery.
Changes:
- OpenCode: migrate from opencode.json plugin config to direct
skill symlinks in ~/.agents/skills/<name>/
- Codex: replace broken bundle symlink (understand-anything/ had
no SKILL.md at root) with individual per-skill symlinks, matching
OpenCode exactly
- All platforms: add universal ~/.understand-anything-plugin symlink
so understand-dashboard SKILL.md can reliably find packages/dashboard/
- All platforms: use idempotent [ -e ] || [ -L ] || ln -s guard to
handle multi-platform installs on the same machine
- All platforms: use ln -sf and rm -f for robust re-installs and
partial uninstalls
- understand-dashboard/SKILL.md: replace fragile dirname-based path
resolution with a prioritized candidate loop with explicit error
guard
- Remove orphaned .opencode/plugins/understand-anything.js and its
build scaffolding
- Update all three README variants (en, zh-CN, ja-JP) to reflect
new OpenCode AI-driven install method
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
OpenCode installs the repo via git and looks at the root for the plugin
entry point. Our skills/agents live inside understand-anything-plugin/,
so OpenCode couldn't find them.
- Add .opencode/plugins/understand-anything.js that uses the config hook
to inject understand-anything-plugin/skills/ into skills.paths
- Add "main" field to root package.json pointing to the plugin entry
- Update INSTALL.md with version pinning and troubleshooting sections
Closes#16
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
15-task TDD plan covering LanguageConfig types, LanguageRegistry,
12 language configs, GenericTreeSitterPlugin, prompt snippets,
and migration from TS-only TreeSitterPlugin.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Design for making Understand-Anything language-agnostic instead of
TypeScript-heavy. Covers LanguageConfig registry, GenericTreeSitterPlugin,
language-aware prompts, and support for 12 languages.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Set minZoom to 0.01 so fit-view works on graphs with hundreds of nodes
- Add TourFitView to pan/zoom to highlighted nodes during guided tours
- Add SelectedNodeFitView to center graph on node selected via search
- Wrap GraphView in ReactFlowProvider to enable useReactFlow() hooks
Thanks to @blackboxaicode for the insight on these improvements.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The original commit 9fe003a introduced normalization logic in three
separate places (Phase 4 inline, Phase 5 inline, Phase 5.5), creating
an ordering conflict where "do not use field X" rules appeared before
"convert field X to field Y" rules. An LLM following instructions
sequentially could drop legacy fields before converting them.
- Consolidate all layer normalization into Phase 4 as ordered steps
- Consolidate all tour normalization into Phase 5 as ordered steps
- Remove redundant Phase 5.5 entirely
- Fix misleading "from current prompt" comments about envelope format
- Add defensive handling for nodes-as-objects edge case
- Wrap JSON examples in arrays for visual consistency with prompts
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Update raw GitHub URLs in README to remove understand-anything-plugin/
prefix for Codex and OpenClaw INSTALL.md paths. Replace Cursor section
with auto-discovery via .cursor-plugin/plugin.json.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add .cursor-plugin/plugin.json with skills/agents paths pointing into
understand-anything-plugin/. Add .claude-plugin/plugin.json alongside
existing marketplace.json.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Move .codex/, .opencode/, .openclaw/ from understand-anything-plugin/ to
repo root so each AI coding platform discovers its config at the standard
location. Delete .cursor/ (replaced by .cursor-plugin/plugin.json in next
commit). Plugin source code stays inside understand-anything-plugin/.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace full flatten approach with minimal restructure: only move platform
config directories (.codex, .opencode, .openclaw) to repo root for discovery.
Add Cursor/Claude plugin descriptors. Remove Gemini extension. Keep all
plugin source code inside understand-anything-plugin/.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace all named agent dispatches (project-scanner, file-analyzer,
architecture-analyzer, tour-builder, graph-reviewer) with subagent
dispatches using prompt template files. Add context injection for each
phase including README content, package manifest, directory tree,
framework-specific guidance, and cross-validation data.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Each subagent dispatch now injects relevant context from the main session:
- Scanner: README + package manifest
- File Analyzer: framework info + project description from Phase 1
- Architecture Analyzer: framework layer hints + directory tree
- Tour Builder: README + entry point
- Graph Reviewer: scan inventory for cross-validation + phase warnings
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>