Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
79 commits
Select commit Hold shift + click to select a range
31ba764
docs: add AGENTS.md with small-commit rule
claude Oct 3, 2026
6f43f82
feat(dashboard): highlight many more languages in the code viewer
claude Oct 3, 2026
dcba949
fix(dashboard): keep Prism tokens inline in the code viewer
claude Oct 3, 2026
90ecf21
feat(dashboard): scroll the code viewer to the node's line range
claude Oct 3, 2026
b75c8b9
feat(core): add full-text project content search
claude Oct 3, 2026
1b261b7
feat(server): add token-gated /search-content.json endpoint
claude Oct 3, 2026
ecd8101
feat(dashboard): add file path to graph node lookup helpers
claude Oct 3, 2026
b534430
feat(dashboard): add Code mode to search every project file's text
claude Oct 3, 2026
9072d1e
feat(core): add node annotations storage (tags + notes)
claude Oct 3, 2026
d8aa7d4
feat(server): serve /annotations.json from the dashboard and viewer
claude Oct 3, 2026
ed108ca
feat(dashboard): let users tag and annotate nodes
claude Oct 3, 2026
227be03
feat(dashboard): mark annotated nodes on the graph
claude Oct 3, 2026
b564ed5
feat(dashboard): hint that collapsed containers expand on click
claude Oct 3, 2026
4c638df
feat(dashboard): reveal nodes selected from outside the canvas
claude Oct 3, 2026
92d0a89
fix(dashboard): make the staleness banner readable on the light theme
claude Oct 3, 2026
cbaaea8
feat(dashboard): make the code viewer panel resizable
claude Oct 3, 2026
cb7afcb
feat(dashboard): add a copy-path button to the code viewer
claude Oct 3, 2026
cfd13e6
docs: describe code search, annotations and lazy grammars in CLAUDE.md
claude Oct 3, 2026
72ee150
chore: bump version to 2.10.0
claude Oct 3, 2026
dfadfa9
chore: ignore Node's node-compile-cache directory
claude Oct 3, 2026
a0322d0
feat(dashboard): keep navigation state in the URL hash
claude Oct 3, 2026
3c19c17
fix(dashboard): don't mix background shorthand with the Prism theme's…
claude Oct 3, 2026
c00c984
feat(dashboard): add a Ctrl/⌘+K command palette
claude Oct 3, 2026
8be789e
build(dashboard): typecheck server-side code
claude Oct 3, 2026
0ac92bb
feat(server): add a provider-neutral AI proxy for the dashboard
claude Oct 3, 2026
1d3aa5f
feat(dashboard): add AI client, provider presets and node context bui…
claude Oct 3, 2026
993427a
refactor(dashboard): extract themed Markdown rendering into MarkdownC…
claude Oct 3, 2026
bf7e447
style(dashboard): drop a needless escape in the fuzzy matcher's separ…
claude Oct 3, 2026
dc70955
feat(dashboard): add Ask-AI dialog state and UI strings
claude Oct 3, 2026
bced7f8
feat(dashboard): build provider message lists for node chats
claude Oct 3, 2026
67b6010
feat(dashboard): add a provider-neutral AI settings form
claude Oct 3, 2026
32d3c79
feat(dashboard): add the Ask AI dialog
claude Oct 3, 2026
b6f0890
feat(dashboard): open Ask AI from node details and the palette
claude Oct 3, 2026
a33bd22
docs: describe Ask AI, URL state and the command palette in CLAUDE.md
claude Oct 3, 2026
344e54f
feat(server): add embedding-based semantic node search
claude Oct 3, 2026
1806e85
fix(server): drop semantic hits far below the best match
claude Oct 3, 2026
ae1b75d
feat(dashboard): open AI settings straight to the embedding section
claude Oct 3, 2026
dd3f633
feat(dashboard): use embedding search in Semantic mode
claude Oct 3, 2026
43b5c54
docs: note embedding-backed Semantic search in CLAUDE.md
claude Oct 3, 2026
a92b177
feat(core): allow per-line notes in annotations
claude Oct 3, 2026
c5c81f2
feat(dashboard): add setLineNote to the annotations store
claude Oct 3, 2026
9d67a6a
feat(dashboard): add code-navigation graph index
claude Oct 3, 2026
137998c
feat(dashboard): add a per-project reading-progress store
claude Oct 3, 2026
0c978a6
feat(core): aggregate per-file git churn for a hotspot overlay
claude Oct 3, 2026
de2e966
feat(core): store user architecture rules in arch-rules.json
claude Oct 3, 2026
aef71dc
feat(server): serve /git-hotspots.json and /arch-rules.json
claude Oct 3, 2026
22bd851
feat(dashboard): add codeNav strings in all locales
claude Oct 3, 2026
03825bb
feat(dashboard): add a dependency-free STORE-only zip writer
claude Oct 3, 2026
04c97ee
feat(dashboard): add helpers for ordering and linking annotated nodes
claude Oct 3, 2026
2e48d69
feat(dashboard): build Markdown and Obsidian vault exports of notes
claude Oct 3, 2026
70781fb
feat(dashboard): turn annotated nodes into personal tour steps
claude Oct 3, 2026
832b4d1
feat(dashboard): let the tour machinery play user-built tours
claude Oct 3, 2026
f8b04ef
i18n(dashboard): add notesTools strings for My tour and notes export
claude Oct 3, 2026
709fc0b
feat(dashboard): Ctrl/Cmd+click identifiers in the code viewer
claude Oct 3, 2026
97638a7
feat(dashboard): compute a node's transitive dependents for impact an…
claude Oct 3, 2026
1750f3d
feat(dashboard): evaluate architecture rules against graph edges
claude Oct 3, 2026
bfb0b8a
feat(dashboard): map git churn onto graph nodes as heat levels
claude Oct 3, 2026
bcd972e
feat(dashboard): order changed nodes for review and summarize as Mark…
claude Oct 3, 2026
01d67db
feat(dashboard): file outline and gutter range bars in the code viewer
claude Oct 3, 2026
f2dbefd
fix(dashboard): highlight the file for function/class tour steps
claude Oct 3, 2026
207ce2a
feat(dashboard): line-level notes in the code viewer
claude Oct 3, 2026
e84cfee
feat(dashboard): build and play a personal tour from your notes
claude Oct 3, 2026
47bce4c
feat(dashboard): show reading progress in Files and Project Overview
claude Oct 3, 2026
95c5938
fix(dashboard): link dotted note names with an explicit .md in the vault
claude Oct 3, 2026
66bc4cf
feat(dashboard): export notes as Markdown or an Obsidian vault
claude Oct 3, 2026
6912f57
Merge group B: personal tour from notes and Markdown/Obsidian export
claude Oct 3, 2026
55d09d3
feat(dashboard): add UI strings for the analysis overlays
claude Oct 3, 2026
8b7d0b5
feat(dashboard): paint analysis overlays through one shared node/edge…
claude Oct 3, 2026
7d951be
feat(dashboard): add header controls, sidebar panels and a rules edit…
claude Oct 3, 2026
3a50be6
feat(dashboard): show impact and git churn in node details
claude Oct 3, 2026
901a593
feat(dashboard): add palette commands for hotspots, impact, rules and…
claude Oct 3, 2026
48d7831
Merge group C: git hotspots, impact analysis, architecture rules, PR …
claude Oct 3, 2026
2b19912
docs: describe code navigation, notes tools and analysis overlays in …
claude Oct 3, 2026
fa3f25a
chore: bump version to 2.11.0
claude Oct 3, 2026
8589666
fix(deps): sync the plugin lockfile with the dashboard's new dependen…
claude Oct 3, 2026
724ec06
feat(skill): start the full dev-server dashboard by default
claude Oct 3, 2026
c7343dc
chore: bump version to 2.11.1
claude Oct 3, 2026
c98f374
fix(viewer): keep serving when no browser opener is installed
claude Oct 3, 2026
03ece59
chore: bump version to 2.11.2
claude Oct 3, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .claude-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "understand-anything",
"description": "AI-powered codebase understanding — analyze, visualize, and explain any project",
"version": "2.9.7",
"version": "2.11.2",
"author": {
"name": "Egonex"
},
Expand Down
2 changes: 1 addition & 1 deletion .copilot-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "understand-anything",
"description": "AI-powered codebase understanding — analyze, visualize, and explain any project",
"version": "2.9.7",
"version": "2.11.2",
"author": {
"name": "Egonex"
},
Expand Down
2 changes: 1 addition & 1 deletion .cursor-plugin/plugin.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"name": "understand-anything",
"displayName": "Understand Anything",
"description": "AI-powered codebase understanding — analyze, visualize, and explain any project",
"version": "2.9.7",
"version": "2.11.2",
"author": {
"name": "Egonex"
},
Expand Down
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -19,3 +19,6 @@ venv/
*.pyo
Thumbs.db
*.tgz

# Node.js module compile cache (NODE_COMPILE_CACHE)
node-compile-cache/
10 changes: 10 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
# Agent Rules

Rules for any coding agent (Claude Code, Codex, Cursor, etc.) working in this repository.
Project architecture, commands and conventions live in [CLAUDE.md](./CLAUDE.md).

## Git

- Keep commits small. Each commit should hold one logical change; do not mix
large amounts of unrelated changes into a single commit. Split refactors,
features, dependency bumps and version bumps into separate commits.
17 changes: 15 additions & 2 deletions CLAUDE.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
# Understand Anything

Agent rules (commit hygiene, etc.): @AGENTS.md

## Project Overview
An open-source tool combining LLM intelligence + static analysis to produce interactive dashboards for understanding codebases.

Expand All @@ -19,10 +21,21 @@ An open-source tool combining LLM intelligence + static analysis to produce inte
## Dashboard
- Dark luxury theme: deep blacks (#0a0a0a), gold/amber accents (#d4a574), DM Serif Display typography
- Graph-first layout: 75% graph + 360px right sidebar
- No ChatPanel or Monaco Editor
- No Monaco Editor; no persistent chat panel — AI chat is an on-demand "Ask AI" dialog per node (`AskAiDialog.tsx`)
- Ask AI: the dev server proxies `/ai/config` and `/ai/chat` (`server/ai.ts`, token-gated) to any provider — `openai` protocol (any OpenAI-compatible `/chat/completions`: GPT, DeepSeek, GLM, Qwen, Ollama, OpenRouter, …) or `anthropic` (official SDK). Provider config incl. API key lives in `~/.understand-anything/ai.json` (mode 600, override with `UA_AI_CONFIG`), never in the project; the browser only sees a masked key hint. The viewer has no AI backend, so the dialog falls back to copying the prompt
- URL hash mirrors navigation state (`utils/urlState.ts`, `hooks/useUrlStateSync.ts`); Ctrl/⌘+K command palette (`CommandPalette.tsx`; register feature commands in `hooks/usePaletteCommands.ts`)
- Sidebar tabs: `Info` (ProjectOverview default → NodeInfo when node selected → LearnPanel in Learn persona, composing) and `Files` (FileExplorer tree built from the structural graph)
- Code viewer: prism-react-renderer source viewer that slides up from the bottom on file node click; an expand button promotes it into a full-screen modal. Source content is fetched from the dev server's `/file-content.json` endpoint, gated by access token + a graph-derived path allowlist
- Schema validation on graph load with error banner
- Search modes: `Fuzzy`/`Semantic` (node names/tags/summaries + user annotations; `Semantic` upgrades to embedding search via `/ai/semantic-search` — `server/semantic.ts`, vectors cached in the data directory's `embeddings.json` — when an embedding model is configured) and `Code` — full-text search over the graph's files via the dev server's `/search-content.json` (core `content-search.ts`; same graph-derived allowlist as `/file-content.json`)
- User annotations (personal tags + notes per node) persist to the data directory's `annotations.json` via `/annotations.json` (core `annotations.ts`), separate from `knowledge-graph.json` so `/understand` never overwrites them; the read-only viewer and demo build fall back to localStorage
- Code viewer grammars beyond prism-react-renderer's bundled set load on demand from `prismjs/components` (`utils/prismLanguages.ts`)
- Code viewer navigation: Ctrl/⌘+click on identifiers that name a graph node (same file first, then imported files; index in `utils/codeNav.ts`, cached per graph); a collapsible outline and gutter range bars show the open file's ranged child nodes
- Line notes: clicking a gutter line number edits a note stored on the file node as `annotations.json` `nodes[id].lines` (line → note; core `annotations.ts` sanitises it; version stays 1)
- Reading progress: files opened in the code viewer are tracked per project in localStorage (`readingProgress.ts`), shown as check marks in Files and "N / M files read" in ProjectOverview
- My tour: `MyTourDialog` turns annotated nodes into `TourStep[]` (`utils/myTour.ts`, `utils/annotatedNodes.ts`) and plays them via the store's `startCustomTour` / `customTour`; `stopTour`/`startTour` clear it, so `graph.tour` is never touched
- Notes export: Markdown or an Obsidian vault zip, built in the browser (`utils/notesExport.ts`, `notesExportActions.ts`; dependency-free STORE-only zip writer in `utils/zip.ts`)
- Analysis overlays (`analysisStore.ts`, one at a time, painted through `nodeMarks` / `markedEdges` read by CustomNode and GraphView): Hotspots (git churn from `/git-hotspots.json`, core `git-hotspots.ts`), Impact (transitive dependents, `utils/impact.ts`), Architecture rules (`arch-rules.json` in the data dir via `/arch-rules.json`, core `arch-rules.ts`, evaluated client-side in `utils/archRules.ts`) and PR review walkthrough (built on `diff-overlay.json`, progress in localStorage). Edge direction for all of them lives in `utils/dependencies.ts`

## Agent Pipeline
- Agents write intermediate results to the data directory's `intermediate/` subdirectory on disk (not returned to context) — `.ua/intermediate/`, or `.understand-anything/intermediate/` when that legacy directory is present
Expand Down Expand Up @@ -55,7 +68,7 @@ An open-source tool combining LLM intelligence + static analysis to produce inte
- `scripts/generate-large-graph.mjs` — Generates a fake knowledge graph for performance testing (e.g. large-graph layout). Writes to the project data directory's `knowledge-graph.json` (`.ua/knowledge-graph.json`, or `.understand-anything/` when that legacy directory is present). Usage: `node scripts/generate-large-graph.mjs [nodeCount]` (default: 3000 nodes). Not part of the production pipeline.

## Viewer Package
`packages/viewer` serves a committed graph without Claude Code, via `npx <release-asset-url>`. Update it when (a) the dashboard UI changes — the tarball embeds the built `dist/` — or (b) the `vite.config.ts` dev-server middleware changes, which `bin/viewer.mjs` deliberately mirrors. On every release, repack (`pack:release` script) and re-upload the tarball to the GitHub release as `understand-anything-viewer.tgz` — exactly that name, the READMEs' `releases/latest/download/` URL depends on it.
`packages/viewer` serves a committed graph without Claude Code, via `npx <release-asset-url>`. Update it when (a) the dashboard UI changes — the tarball embeds the built `dist/` — or (b) the `vite.config.ts` dev-server middleware changes, which `bin/viewer.mjs` deliberately mirrors. Server logic shared between the two lives in self-contained core modules (`staleness.ts`, `content-search.ts`, `annotations.ts`, `git-hotspots.ts`, `arch-rules.ts`; the viewer serves `/annotations.json` and `/arch-rules.json` read-only) that `build.mjs` copies into `bin/dist/`. On every release, repack (`pack:release` script) and re-upload the tarball to the GitHub release as `understand-anything-viewer.tgz` — exactly that name, the READMEs' `releases/latest/download/` URL depends on it.

## Versioning
When pushing to remote, bump the version in **all six** of these files (keep them in sync):
Expand Down
65 changes: 65 additions & 0 deletions pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion understand-anything-plugin/.claude-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "understand-anything",
"description": "AI-powered codebase understanding — analyze, visualize, and explain any project",
"version": "2.9.7",
"version": "2.11.2",
"author": {
"name": "Egonex"
},
Expand Down
2 changes: 1 addition & 1 deletion understand-anything-plugin/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@understand-anything/skill",
"version": "2.9.7",
"version": "2.11.2",
"type": "module",
"main": "dist/index.js",
"types": "dist/index.d.ts",
Expand Down
Loading