You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
| `output.dir` | Output directory for artifacts | `".enola"` |
@@ -341,6 +341,7 @@ Each extractor is detected by characteristic project files and then parses what
341
341
| TypeScript | tree-sitter | `tsconfig.json`, `tsconfig.base.json`, or `package.json` with TypeScript (root or one level deep) |
342
342
| Swift | tree-sitter | `Package.swift`, `.xcodeproj`, or `.xcworkspace` present |
343
343
| Ruby | regex scanner | `Gemfile` present |
344
+
| C++ | tree-sitter | a C++ source (`.cpp`/`.cc`/`.cxx`/`.hpp`/...) present, or a build file (`CMakeLists.txt`/`Makefile`/`meson.build`/`*.vcxproj`) plus any header |
344
345
| OpenAPI | YAML/JSON scanner| any file containing `openapi:` or `swagger:` |
345
346
346
347
**Go** uses the standard-library parser directly, so symbols, methods, interfaces, imports, and call edges are exact.
@@ -357,6 +358,8 @@ Each extractor is detected by characteristic project files and then parses what
357
358
358
359
**Ruby** is Rails-aware: ActiveRecord models (`has_many`, `belongs_to`, scopes, table inference), the route DSL in `config/routes.rb` (resources, namespaces, member/collection blocks), and Packwerk package boundaries (`package.yml` dependency enforcement). It also tracks modules, classes, methods with visibility, mixins (`include`/`extend`/`prepend`), `ActiveSupport::Concern`, constants, and attributes.
359
360
361
+
**C++** is parsed with tree-sitter and handles the header/source split that defines the language. Classes, structs, unions, enums (incl. `enum class`), namespaces, free functions and methods, data members, and `typedef`/`using` aliases become symbol facts named `<dir>.<ns1::ns2::Class::member>` — enola's `<dir>.` module convention on the outside, native C++ `::` scope inside. Because an out-of-line definition `Class::method` (parsed from a `qualified_identifier`) yields the same canonical name as its in-class declaration, a dedup pass **merges a header's method prototype with its `.cpp` definition** into a single symbol (the definition wins for file/line and carries the call-graph edges). Base classes become `implements` edges; method bodies are walked for `calls`/`instantiates` edges; quoted `#include "x.h"` becomes a `dependency` resolved to the declaring module, while system `<...>` includes are skipped. Templates are unwrapped to their inner declaration and flagged `templated`, and the walker descends through `#if`/`#ifdef` preprocessor guards (so code wrapped in `#if defined(HAVE_*)` and headers behind include guards are still extracted). *Limitation:* header/source merging relies on the `.h` and `.cpp` living in the same directory (the common layout); split `include/` + `src/` trees are not merged.
Copy file name to clipboardExpand all lines: README.md
+12-2Lines changed: 12 additions & 2 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -101,13 +101,22 @@ Binaries are published for Linux, macOS (amd64/arm64), and Windows (amd64). You
101
101
102
102
### Connect it to your agent
103
103
104
-
Add enola to your MCP client configuration. For example, in Cursor's `mcp.json`:
104
+
**Claude Code** — register enola as an MCP server with one command. This assumes the `enola` binary is on your `PATH` (the install script above puts it in `~/.local/bin`):
105
+
106
+
```bash
107
+
claude mcp add enola enola /path/to/enola/mcp-arch.yaml
108
+
```
109
+
110
+
The shape is `claude mcp add <name> <command> [args…]`: the first `enola` names the server, the second is the binary, and the trailing path is the config it reads. That config's `repo:` is only the *default* repository — you can still snapshot any repo by passing `repo_path` to `generate_snapshot`. Verify it registered with `claude mcp list`, then start Claude Code and ask it to generate a snapshot.
111
+
112
+
**Cursor / other MCP clients** — add enola to your client's MCP configuration. For example, in Cursor's `mcp.json`:
105
113
106
114
```json
107
115
{
108
116
"mcpServers": {
109
117
"enola": {
110
-
"command": "enola"
118
+
"command": "enola",
119
+
"args": ["/path/to/enola/mcp-arch.yaml"]
111
120
}
112
121
}
113
122
}
@@ -149,6 +158,7 @@ Working across several repos? Generate the first, then add the rest with append
| C++ |`.cpp`/`.hpp`/… source or `CMakeLists.txt`/`Makefile` + header (header/source method merging, namespaces, templates) |
152
162
| OpenAPI | any spec with an `openapi:` / `swagger:` key |
153
163
154
164
Framework- and platform-specific detection for each language is described in **[ARCHITECTURE.md → Supported languages](ARCHITECTURE.md#supported-languages)**.
0 commit comments