- Sync .claude-plugin/plugin.json (was stuck at 1.1.0) and .cursor-plugin/plugin.json (was 1.0.5) to match main version
- Update CLAUDE.md versioning section to list all four files that must be kept in sync
- Document scripts/generate-large-graph.mjs in CLAUDE.md
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>
Critical fixes:
- C1: Remove unused treeSitter.nodeTypes from configs and schema — extraction
logic is TS/JS-specific, nodeTypes gave false impression of generality
- C2+C3: Remove blocking temp dir prompt, default to .understand-anything/tmp/,
update all 5 prompt templates to use project-local paths instead of /tmp/
- C4: Fix false-positive framework detection — use "next": (with quotes) for
Next.js, remove cors/body-parser from Express keywords
Important fixes:
- I1: Change FrameworkConfig.language to languages[] array — React/Express/Vue
now correctly listed under both typescript and javascript
- I2: Fix getByExtension case sensitivity — .TS now resolves same as .ts
- I3: languageKeyFromPath returns null instead of throwing for unknown extensions
- I4: Duplicate framework registration is now a no-op instead of corrupting array
- I5: SKILL.md now says "skip silently" when language/framework snippet not found
Also: getForLanguage returns a defensive copy, 3 new tests added (157 total).
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.
- Add blocking step in Phase 0 asking where to write temp files
($PROJECT_ROOT/.understand-anything/tmp/ or /tmp/), with explicit
STOP-and-wait language to prevent premature execution
- Make language/framework file discovery explicit in Phase 2 and
Phase 4 with concrete path examples and ls fallback, fixing
issue where Claude's Search tool couldn't find files in subdirs
- Clean up $TMP_DIR alongside intermediate files in Phase 7
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>
Replace the TypeScript/JavaScript-biased analysis pipeline with a truly
language-agnostic system. The core architecture was already language-neutral
(graph schema, dashboard, search) — the bias lived in agent prompts,
tree-sitter plugin, and language-lesson system.
Core changes:
- LanguageConfig + FrameworkConfig types with Zod validation
- LanguageRegistry (12 languages) and FrameworkRegistry (10 frameworks)
- Config-driven TreeSitterPlugin replacing hardcoded TS/JS grammars
- PluginRegistry now delegates to LanguageRegistry for extension mapping
- Language-lesson system uses config for display names and concepts
Prompt system:
- SKILL.md generalized: dynamic injection of language snippets and
framework addendums instead of hardcoded if/else conditionals
- 12 language prompt snippets (languages/*.md) with concepts, patterns,
frameworks per language
- 10 framework addendums (frameworks/*.md) with canonical file roles,
edge patterns, architectural layers — Django/FastAPI/Flask preserved
and split, plus React/Next.js/Express/Vue/Spring/Rails/Gin added
- Extended entry points, directory patterns, and test patterns across
all 12 language ecosystems in base prompts
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>