aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--README.md97
1 files changed, 97 insertions, 0 deletions
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..ef66db2
--- /dev/null
+++ b/README.md
@@ -0,0 +1,97 @@
+# ida-tui
+
+A minimal, keyboard-first (mouse-capable) **TUI frontend for IDA Pro**, built with
+[Textual](https://textual.textualize.io/) and talking to the
+[ida-pro-mcp](https://github.com/mrexodia/ida-pro-mcp) (idalib) server.
+
+## ⚠️ Status: not ready for public consumption
+
+This is a personal, actively-hacked-on project. It is **not** packaged, polished,
+or supported for general use. Expect sharp edges:
+
+- Hardcoded paths and assumptions (e.g. a venv at `~/ida-venv`, a supervisor on
+ `127.0.0.1:8745`).
+- No stable API, no versioning promises, no changelog — things move and break.
+- Requires a working IDA Pro + idalib install, which you must license and set up
+ yourself.
+- Known open bugs (see the backlog below), including wonky xref navigation and no
+ handling of PLT/import stubs.
+- Basically undocumented beyond this file and `docs/`.
+
+If you found this expecting a finished tool: it isn't one yet. Poke around, but
+don't file expectations. **Use at your own risk.**
+
+## What it does
+
+- Virtualized **disassembly** and **decompilation (pseudocode)** views that page
+ lazily over the MCP server.
+- Keyboard navigation: follow (`enter`), xrefs (`x`), rename (`n`), incremental
+ search (`/` `?`), history (`back`), view toggle.
+- A **functions panel**, **hex viewer**, **struct editor**, and **(re-)typing**.
+- An optional unix-socket **RPC layer** to puppeteer the live TUI from another
+ process (agent-driven RE / livestreaming). See `docs/RPC.md`.
+
+## Architecture (three layers, kept separate)
+
+- **`idatui/client.py`** — stdlib-only persistent MCP client (`http.client` pool,
+ warm handshake, session recovery, keep-alive). No third-party deps.
+- **`idatui/domain.py`** — paging/caching over the client (`FunctionIndex`,
+ `DisasmModel`, `decompile`, xrefs, resolve). Synchronous, thread-safe.
+- **`idatui/app.py`** — the Textual app (virtualized `ScrollView`s, shared cursor/
+ search/nav mixins, modals).
+
+The client and domain layers are intentionally **stdlib-only**; only the TUI layer
+pulls in Textual + Pygments.
+
+## Requirements
+
+- Python ≥ 3.11
+- A working **IDA Pro** with **idalib** and **ida-pro-mcp** installed.
+- Textual ≥ 8 and Pygments ≥ 2 for the TUI (`pip install -e '.[tui]'`).
+
+## Running
+
+```sh
+# 1. Start the ida-pro-mcp supervisor (opens bin/ls by default).
+./spawn.sh # supervisor on 127.0.0.1:8745
+
+# 2. Launch the TUI (use a python that has textual + idapro).
+python -m idatui.tui # auto-resolve the sole session
+python -m idatui.tui --db <session>
+python -m idatui.tui --open /abs/path/bin # dir must be WRITABLE (.i64)
+```
+
+The `spawn.sh` host/port/target are overridable via `IDA_MCP_HOST`,
+`IDA_MCP_PORT`, `IDA_MCP_TARGET`, `IDA_MCP_MAX_WORKERS`. A systemd unit is in
+`systemd/`.
+
+## RPC / driving the TUI
+
+Give the TUI `--rpc <sock>` to expose a unix-socket control channel, then drive
+it from another pane:
+
+```sh
+python -m idatui.tui --db <s> --rpc /tmp/ida.sock
+python -m idatui.drive where # ergonomic terse-text helper
+python -m idatui.drive pc main # pseudocode of main
+python -m idatui.drive rename sub_5BE0 foo # goto + rename
+```
+
+See `docs/RPC.md` for the full protocol.
+
+## Tests
+
+Headless Textual `Pilot` suites live in `tests/` and need a live session id:
+
+```sh
+python tests/test_scenarios.py --db <session> # UI suite
+python tests/test_scenarios.py --db <s> --only hex,rename
+python tests/test_domain.py --db <session> # domain/paging (stdlib)
+```
+
+## Docs
+
+- `docs/RPC.md` — the RPC protocol
+- `docs/PAGING_FINDINGS.md` — ida-pro-mcp/idalib paging quirks
+- `docs/TEXTUAL_NOTES.md` — Textual pitfalls encountered
+- `docs/TUI_DRIVING_BLUEPRINT.md` — generalizing the driving layer