{"owner":"Egonex-AI","repo":"Understand-Anything","hasSkills":true,"hasMcp":false,"mcpConfig":null,"found":["CLAUDE.md"],"skills":{"CLAUDE.md":"# Understand Anything\n\n## Project Overview\nAn open-source tool combining LLM intelligence + static analysis to produce interactive dashboards for understanding codebases.\n\n## Prerequisites\n- Node.js >= 22 (developed on v24)\n- pnpm >= 10 (pinned via `packageManager` field in root `package.json`)\n\n## Architecture\n- **Monorepo** with pnpm workspaces\n- **understand-anything-plugin/** — Claude Code plugin containing all source code:\n  - **packages/core** — Shared analysis engine (types, persistence, tree-sitter, search, schema, tours, plugins)\n  - **packages/dashboard** — React + TypeScript web dashboard (React Flow, Zustand, TailwindCSS v4)\n  - **src/** — Skill TypeScript source for `/understand-chat`, `/understand-diff`, `/understand-explain`, `/understand-onboard`\n  - **skills/** — Skill definitions (`/understand`, `/understand-dashboard`, etc.)\n  - **agents/** — Agent definitions (project-scanner, file-analyzer, architecture-analyzer, tour-builder, graph-reviewer)\n\n## Dashboard\n- Dark luxury theme: deep blacks (#0a0a0a), gold/amber accents (#d4a574), DM Serif Display typography\n- Graph-first layout: 75% graph + 360px right sidebar\n- No ChatPanel or Monaco Editor\n- Sidebar tabs: `Info` (ProjectOverview default → NodeInfo when node selected → LearnPanel in Learn persona, composing) and `Files` (FileExplorer tree built from the structural graph)\n- 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\n- Schema validation on graph load with error banner\n\n## Agent Pipeline\n- 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\n- Agent model field is omitted from frontmatter so each platform falls back to its configured default — `inherit` was a Claude Code-only keyword that opencode (and similar tools) treated as a literal model id and rejected with `ProviderModelNotFoundError` (see #167)\n- `/understand` auto-triggers `/understand-dashboard` after completion\n- Intermediate files cleaned up after graph assembly\n\n## Key Commands\n- `pnpm install` — Install all dependencies\n- `pnpm --filter @understand-anything/core build` — Build the core package\n- `pnpm --filter @understand-anything/core test` — Run core tests\n- `pnpm --filter @understand-anything/skill build` — Build the plugin package\n- `pnpm test` — Run all tests (skill tests live at repo-root `tests/skill/`, picked up by root `vitest.config.ts`)\n- `pnpm --filter @understand-anything/dashboard build` — Build the dashboard\n- `pnpm dev:dashboard` — Start dashboard dev server\n- `pnpm lint` — Run ESLint across the project\n\n## Conventions\n- TypeScript strict mode everywhere\n- Vitest for testing\n- ESM modules (`\"type\": \"module\"`)\n- Knowledge graph JSON lives in the analyzed project's data directory: `.ua/` for new projects, or the legacy `.understand-anything/` directory when it already exists (if `.understand-anything/` is present it is used for both reads and writes; otherwise `.ua/`). All bundled scripts and core code self-resolve this rule.\n- Core uses subpath exports (`./search`, `./types`, `./schema`) to avoid pulling Node.js modules into browser\n\n## Gotchas\n- **tree-sitter**: Uses `web-tree-sitter` (WASM) instead of native `tree-sitter` — native bindings fail on darwin/arm64 + Node 24\n- **Dashboard imports**: Dashboard must only import from core's browser-safe subpath exports (`./search`, `./types`, `./schema`), never the main entry point which pulls in Node.js modules\n\n## Scripts\n- `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.\n\n## Viewer Package\n`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.\n\n## Versioning\nWhen pushing to remote, bump the version in **all six** of these files (keep them in sync):\n- `understand-anything-plugin/package.json` → `\"version\"` field\n- `understand-anything-plugin/.claude-plugin/plugin.json` → `\"version\"` field\n- `understand-anything-plugin/packages/viewer/package.json` → `\"version\"` field\n- `.claude-plugin/plugin.json` → `\"version\"` field\n- `.cursor-plugin/plugin.json` → `\"version\"` field\n- `.copilot-plugin/plugin.json` → `\"version\"` field\n\nNote: `.claude-plugin/marketplace.json` does **not** carry a version — the `plugins[]` entry only supports `name` and `source`, and adding other fields causes marketplace schema validation failures.\n\n## Testing Local Plugin Changes\n\nClaude Code caches installed plugins at `~/.claude/plugins/cache/understand-anything/understand-anything/<version>/`. Symlinks don't work because Claude's Search/Glob tools can't follow them. To test local changes:\n\n1. **Build the packages:**\n   ```bash\n   pnpm --filter @understand-anything/core build\n   pnpm --filter @understand-anything/skill build\n   ```\n\n2. **Find the installed version** (must match what the marketplace currently serves):\n   ```bash\n   ls ~/.claude/plugins/cache/understand-anything/understand-anything/\n   ```\n\n3. **Copy your local plugin into the cache**, replacing `<VERSION>` with the version from step 2:\n   ```bash\n   rm -rf ~/.claude/plugins/cache/understand-anything/understand-anything/<VERSION>\n   cp -R ./understand-anything-plugin ~/.claude/plugins/cache/understand-anything/understand-anything/<VERSION>\n   ```\n\n4. **Start a fresh Claude Code session** (existing sessions cache the old prompts in context).\n\n5. **Run `/understand --full`** in the target project to verify.\n\n**Re-sync after further changes:**\n```bash\npnpm --filter @understand-anything/core build && \\\ncp -R ./understand-anything-plugin/* ~/.claude/plugins/cache/understand-anything/understand-anything/<VERSION>/\n```\n\n**To revert to upstream:** Uninstall and reinstall the plugin from the marketplace — it repopulates the cache from the upstream repo.\n"},"files":{"CLAUDE.md":"# Understand Anything\n\n## Project Overview\nAn open-source tool combining LLM intelligence + static analysis to produce interactive dashboards for understanding codebases.\n\n## Prerequisites\n- Node.js >= 22 (developed on v24)\n- pnpm >= 10 (pinned via `packageManager` field in root `package.json`)\n\n## Architecture\n- **Monorepo** with pnpm workspaces\n- **understand-anything-plugin/** — Claude Code plugin containing all source code:\n  - **packages/core** — Shared analysis engine (types, persistence, tree-sitter, search, schema, tours, plugins)\n  - **packages/dashboard** — React + TypeScript web dashboard (React Flow, Zustand, TailwindCSS v4)\n  - **src/** — Skill TypeScript source for `/understand-chat`, `/understand-diff`, `/understand-explain`, `/understand-onboard`\n  - **skills/** — Skill definitions (`/understand`, `/understand-dashboard`, etc.)\n  - **agents/** — Agent definitions (project-scanner, file-analyzer, architecture-analyzer, tour-builder, graph-reviewer)\n\n## Dashboard\n- Dark luxury theme: deep blacks (#0a0a0a), gold/amber accents (#d4a574), DM Serif Display typography\n- Graph-first layout: 75% graph + 360px right sidebar\n- No ChatPanel or Monaco Editor\n- Sidebar tabs: `Info` (ProjectOverview default → NodeInfo when node selected → LearnPanel in Learn persona, composing) and `Files` (FileExplorer tree built from the structural graph)\n- 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\n- Schema validation on graph load with error banner\n\n## Agent Pipeline\n- 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\n- Agent model field is omitted from frontmatter so each platform falls back to its configured default — `inherit` was a Claude Code-only keyword that opencode (and similar tools) treated as a literal model id and rejected with `ProviderModelNotFoundError` (see #167)\n- `/understand` auto-triggers `/understand-dashboard` after completion\n- Intermediate files cleaned up after graph assembly\n\n## Key Commands\n- `pnpm install` — Install all dependencies\n- `pnpm --filter @understand-anything/core build` — Build the core package\n- `pnpm --filter @understand-anything/core test` — Run core tests\n- `pnpm --filter @understand-anything/skill build` — Build the plugin package\n- `pnpm test` — Run all tests (skill tests live at repo-root `tests/skill/`, picked up by root `vitest.config.ts`)\n- `pnpm --filter @understand-anything/dashboard build` — Build the dashboard\n- `pnpm dev:dashboard` — Start dashboard dev server\n- `pnpm lint` — Run ESLint across the project\n\n## Conventions\n- TypeScript strict mode everywhere\n- Vitest for testing\n- ESM modules (`\"type\": \"module\"`)\n- Knowledge graph JSON lives in the analyzed project's data directory: `.ua/` for new projects, or the legacy `.understand-anything/` directory when it already exists (if `.understand-anything/` is present it is used for both reads and writes; otherwise `.ua/`). All bundled scripts and core code self-resolve this rule.\n- Core uses subpath exports (`./search`, `./types`, `./schema`) to avoid pulling Node.js modules into browser\n\n## Gotchas\n- **tree-sitter**: Uses `web-tree-sitter` (WASM) instead of native `tree-sitter` — native bindings fail on darwin/arm64 + Node 24\n- **Dashboard imports**: Dashboard must only import from core's browser-safe subpath exports (`./search`, `./types`, `./schema`), never the main entry point which pulls in Node.js modules\n\n## Scripts\n- `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.\n\n## Viewer Package\n`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.\n\n## Versioning\nWhen pushing to remote, bump the version in **all six** of these files (keep them in sync):\n- `understand-anything-plugin/package.json` → `\"version\"` field\n- `understand-anything-plugin/.claude-plugin/plugin.json` → `\"version\"` field\n- `understand-anything-plugin/packages/viewer/package.json` → `\"version\"` field\n- `.claude-plugin/plugin.json` → `\"version\"` field\n- `.cursor-plugin/plugin.json` → `\"version\"` field\n- `.copilot-plugin/plugin.json` → `\"version\"` field\n\nNote: `.claude-plugin/marketplace.json` does **not** carry a version — the `plugins[]` entry only supports `name` and `source`, and adding other fields causes marketplace schema validation failures.\n\n## Testing Local Plugin Changes\n\nClaude Code caches installed plugins at `~/.claude/plugins/cache/understand-anything/understand-anything/<version>/`. Symlinks don't work because Claude's Search/Glob tools can't follow them. To test local changes:\n\n1. **Build the packages:**\n   ```bash\n   pnpm --filter @understand-anything/core build\n   pnpm --filter @understand-anything/skill build\n   ```\n\n2. **Find the installed version** (must match what the marketplace currently serves):\n   ```bash\n   ls ~/.claude/plugins/cache/understand-anything/understand-anything/\n   ```\n\n3. **Copy your local plugin into the cache**, replacing `<VERSION>` with the version from step 2:\n   ```bash\n   rm -rf ~/.claude/plugins/cache/understand-anything/understand-anything/<VERSION>\n   cp -R ./understand-anything-plugin ~/.claude/plugins/cache/understand-anything/understand-anything/<VERSION>\n   ```\n\n4. **Start a fresh Claude Code session** (existing sessions cache the old prompts in context).\n\n5. **Run `/understand --full`** in the target project to verify.\n\n**Re-sync after further changes:**\n```bash\npnpm --filter @understand-anything/core build && \\\ncp -R ./understand-anything-plugin/* ~/.claude/plugins/cache/understand-anything/understand-anything/<VERSION>/\n```\n\n**To revert to upstream:** Uninstall and reinstall the plugin from the marketplace — it repopulates the cache from the upstream repo.\n"},"items":[{"name":"CLAUDE.md","path":"CLAUDE.md","title":"CLAUDE.md","content":"# Understand Anything\n\n## Project Overview\nAn open-source tool combining LLM intelligence + static analysis to produce interactive dashboards for understanding codebases.\n\n## Prerequisites\n- Node.js >= 22 (developed on v24)\n- pnpm >= 10 (pinned via `packageManager` field in root `package.json`)\n\n## Architecture\n- **Monorepo** with pnpm workspaces\n- **understand-anything-plugin/** — Claude Code plugin containing all source code:\n  - **packages/core** — Shared analysis engine (types, persistence, tree-sitter, search, schema, tours, plugins)\n  - **packages/dashboard** — React + TypeScript web dashboard (React Flow, Zustand, TailwindCSS v4)\n  - **src/** — Skill TypeScript source for `/understand-chat`, `/understand-diff`, `/understand-explain`, `/understand-onboard`\n  - **skills/** — Skill definitions (`/understand`, `/understand-dashboard`, etc.)\n  - **agents/** — Agent definitions (project-scanner, file-analyzer, architecture-analyzer, tour-builder, graph-reviewer)\n\n## Dashboard\n- Dark luxury theme: deep blacks (#0a0a0a), gold/amber accents (#d4a574), DM Serif Display typography\n- Graph-first layout: 75% graph + 360px right sidebar\n- No ChatPanel or Monaco Editor\n- Sidebar tabs: `Info` (ProjectOverview default → NodeInfo when node selected → LearnPanel in Learn persona, composing) and `Files` (FileExplorer tree built from the structural graph)\n- 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\n- Schema validation on graph load with error banner\n\n## Agent Pipeline\n- 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\n- Agent model field is omitted from frontmatter so each platform falls back to its configured default — `inherit` was a Claude Code-only keyword that opencode (and similar tools) treated as a literal model id and rejected with `ProviderModelNotFoundError` (see #167)\n- `/understand` auto-triggers `/understand-dashboard` after completion\n- Intermediate files cleaned up after graph assembly\n\n## Key Commands\n- `pnpm install` — Install all dependencies\n- `pnpm --filter @understand-anything/core build` — Build the core package\n- `pnpm --filter @understand-anything/core test` — Run core tests\n- `pnpm --filter @understand-anything/skill build` — Build the plugin package\n- `pnpm test` — Run all tests (skill tests live at repo-root `tests/skill/`, picked up by root `vitest.config.ts`)\n- `pnpm --filter @understand-anything/dashboard build` — Build the dashboard\n- `pnpm dev:dashboard` — Start dashboard dev server\n- `pnpm lint` — Run ESLint across the project\n\n## Conventions\n- TypeScript strict mode everywhere\n- Vitest for testing\n- ESM modules (`\"type\": \"module\"`)\n- Knowledge graph JSON lives in the analyzed project's data directory: `.ua/` for new projects, or the legacy `.understand-anything/` directory when it already exists (if `.understand-anything/` is present it is used for both reads and writes; otherwise `.ua/`). All bundled scripts and core code self-resolve this rule.\n- Core uses subpath exports (`./search`, `./types`, `./schema`) to avoid pulling Node.js modules into browser\n\n## Gotchas\n- **tree-sitter**: Uses `web-tree-sitter` (WASM) instead of native `tree-sitter` — native bindings fail on darwin/arm64 + Node 24\n- **Dashboard imports**: Dashboard must only import from core's browser-safe subpath exports (`./search`, `./types`, `./schema`), never the main entry point which pulls in Node.js modules\n\n## Scripts\n- `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.\n\n## Viewer Package\n`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.\n\n## Versioning\nWhen pushing to remote, bump the version in **all six** of these files (keep them in sync):\n- `understand-anything-plugin/package.json` → `\"version\"` field\n- `understand-anything-plugin/.claude-plugin/plugin.json` → `\"version\"` field\n- `understand-anything-plugin/packages/viewer/package.json` → `\"version\"` field\n- `.claude-plugin/plugin.json` → `\"version\"` field\n- `.cursor-plugin/plugin.json` → `\"version\"` field\n- `.copilot-plugin/plugin.json` → `\"version\"` field\n\nNote: `.claude-plugin/marketplace.json` does **not** carry a version — the `plugins[]` entry only supports `name` and `source`, and adding other fields causes marketplace schema validation failures.\n\n## Testing Local Plugin Changes\n\nClaude Code caches installed plugins at `~/.claude/plugins/cache/understand-anything/understand-anything/<version>/`. Symlinks don't work because Claude's Search/Glob tools can't follow them. To test local changes:\n\n1. **Build the packages:**\n   ```bash\n   pnpm --filter @understand-anything/core build\n   pnpm --filter @understand-anything/skill build\n   ```\n\n2. **Find the installed version** (must match what the marketplace currently serves):\n   ```bash\n   ls ~/.claude/plugins/cache/understand-anything/understand-anything/\n   ```\n\n3. **Copy your local plugin into the cache**, replacing `<VERSION>` with the version from step 2:\n   ```bash\n   rm -rf ~/.claude/plugins/cache/understand-anything/understand-anything/<VERSION>\n   cp -R ./understand-anything-plugin ~/.claude/plugins/cache/understand-anything/understand-anything/<VERSION>\n   ```\n\n4. **Start a fresh Claude Code session** (existing sessions cache the old prompts in context).\n\n5. **Run `/understand --full`** in the target project to verify.\n\n**Re-sync after further changes:**\n```bash\npnpm --filter @understand-anything/core build && \\\ncp -R ./understand-anything-plugin/* ~/.claude/plugins/cache/understand-anything/understand-anything/<VERSION>/\n```\n\n**To revert to upstream:** Uninstall and reinstall the plugin from the marketplace — it repopulates the cache from the upstream repo.\n","category":"root","tokens":1696}]}