$npx -y skills add Egonex-AI/Understand-Anything --skill understandAnalyze a codebase to produce an interactive knowledge graph for understanding architecture, components, and relationships
| 1 | # /understand |
| 2 | |
| 3 | Analyze the current codebase and produce a `knowledge-graph.json` file in the project's data directory (`.ua/`, or the legacy `.understand-anything/` when it already exists). This file powers the interactive dashboard for exploring the project's architecture. |
| 4 | |
| 5 | ## Options |
| 6 | |
| 7 | - `$ARGUMENTS` may contain: |
| 8 | - `--full` — Force a full rebuild, ignoring any existing graph |
| 9 | - `--auto-update` — Enable automatic graph updates on commit (writes `autoUpdate: true` to `$UA_DIR/config.json`) |
| 10 | - `--no-auto-update` — Disable automatic graph updates (writes `autoUpdate: false` to `$UA_DIR/config.json`) |
| 11 | - `--review` — Run full LLM graph-reviewer instead of inline deterministic validation |
| 12 | - `--language <lang>` — Generate all textual content (summaries, descriptions, tags, titles, languageNotes, languageLesson) in the specified language. Accepts ISO 639-1 codes (`zh`, `ja`, `ko`, `en`, `es`, `fr`, `de`, etc.) or friendly names (`chinese`, `japanese`, `korean`, `english`, `spanish`, etc.). Locale variants supported: `zh-TW`, `zh-HK`, etc. Defaults to `en` (English). Stores preference in `$UA_DIR/config.json` for consistency across incremental updates. |
| 13 | - `--exclude <patterns>` — Comma-separated glob patterns for additional files/directories to exclude from analysis (e.g., `--exclude "tests/*,docs/*"`). These patterns take highest priority over built-in defaults and `.understandignore` rules. Supports gitignore syntax including `!` negation. |
| 14 | - A directory path (e.g. `/path/to/repo` or `../other-project`) — Analyze the given directory instead of the current working directory |
| 15 | |
| 16 | --- |
| 17 | |
| 18 | ## Progress Reporting |
| 19 | |
| 20 | Throughout execution, report progress to the user at each phase transition and during batch processing. This keeps users informed on large codebases where analysis can take a long time. |
| 21 | |
| 22 | - **Phase transitions:** At the start of each phase, print a status line: |
| 23 | > `[Phase N/7] <phase name>...` |
| 24 | > |
| 25 | > Example: `[Phase 2/7] Analyzing files (12 batches)...` |
| 26 | |
| 27 | - **Batch progress:** During Phase 2, report each batch with its index and total: |
| 28 | > `Analyzing batch X/N (files: foo.ts, bar.ts, ...)` (list up to 3 filenames, then `...` if more) |
| 29 | |
| 30 | - **Phase completion:** When a phase finishes, briefly confirm: |
| 31 | > `Phase N complete. <one-line summary of result>` |
| 32 | > |
| 33 | > Example: `Phase 1 complete. Found 247 files across 3 languages.` |
| 34 | |
| 35 | --- |
| 36 | |
| 37 | ## Phase 0 — Pre-flight |
| 38 | |
| 39 | Determine whether to run a full analysis or incremental update. |
| 40 | |
| 41 | 1. **Resolve `PROJECT_ROOT`:** |
| 42 | - Parse `$ARGUMENTS` for a non-flag token (any argument that does not start with `--`). If found, treat it as the target directory path. |
| 43 | - If the path is relative, resolve it against the current working directory. |
| 44 | - Verify the resolved path exists and is a directory (run `test -d <path>`). If it does not exist or is not a directory, report an error to the user and **STOP**. |
| 45 | - Set `PROJECT_ROOT` to the resolved absolute path. |
| 46 | - If no directory path argument is found, set `PROJECT_ROOT` to the current working directory. |
| 47 | - **Worktree redirect.** If `PROJECT_ROOT` is inside a git worktree (not the main checkout), redirect output to the main repository root. Worktrees managed by Claude Code are ephemeral — the data directory (`.ua/`, or legacy `.understand-anything/`) written there is destroyed when the session ends, taking the knowledge graph with it (issue #133). Detect a worktree by comparing `git rev-parse --git-dir` against `git rev-parse --git-common-dir`; in a normal checkout or submodule they resolve to the same path, in a worktree they differ and the parent of `--git-common-dir` is the main repo root. |
| 48 | |
| 49 | ```bash |
| 50 | COMMON_DIR=$(git -C "$PROJECT_ROOT" rev-parse --git-common-dir 2>/dev/null) |
| 51 | GIT_DIR=$(git -C "$PROJECT_ROOT" rev-parse --git-dir 2>/dev/null) |
| 52 | if [ -n "$COMMON_DIR" ] && [ -n "$GIT_DIR" ]; then |
| 53 | COMMON_ABS=$(cd "$PROJECT_ROOT" && cd "$COMMON_DIR" 2>/dev/null && pwd -P) |
| 54 | GIT_ABS=$(cd "$PROJECT_ROOT" && cd "$GIT_DIR" 2>/dev/null && pwd -P) |
| 55 | if [ -n "$COMMON_ABS" ] && [ "$COMMON_ABS" != "$GIT_ABS" ]; then |
| 56 | MAIN_ROOT=$(dirname "$COMMON_ABS") |
| 57 | if [ -d "$MAIN_ROOT" ] && [ "${UNDERSTAND_NO_WORKTREE_REDIRECT:-0}" != "1" ]; then |
| 58 | echo "[understand] Detected git worktree at $PROJECT_ROOT" |
| 59 | echo "[understand] Redirecting output to main repo root: $MAIN_ROOT" |
| 60 | echo "[understand] (Set UNDERSTAND_NO_WORKTREE_REDIRECT=1 to keep PROJECT_ROOT as the worktree.)" |
| 61 | PROJECT_ROOT="$MAIN_ROOT" |
| 62 | fi |
| 63 | fi |
| 64 | fi |
| 65 | ``` |
| 66 | |
| 67 | Set `UNDERSTAND_NO_WORKTREE_REDIRECT=1` if you intentionally want a per-worktree graph (rare — most users want the redirect). |
| 68 | 1.5. **Ensure the plugin is built |