aboutsummaryrefslogtreecommitdiffstats
path: root/uv.lock (follow)
Commit message (Collapse)AuthorAgeFilesLines
* Install ida-codemode from PyPI, not a sibling cloneblasty2026-08-071-17/+5
| | | | | | | | | | | | | | | | | | | | | | | | The README told people to "git clone ... ../ida-codemode" and pyproject carried a matching [tool.uv.sources] path override. That is not a convention, it is Duncan's development layout, inherited from the port patch and never questioned: it writes into the parent of the user's checkout, breaks if the directory is named anything else, and pins everyone to whatever happens to be in that working tree. ida-codemode is published on PyPI (0.3.1, the same version the clone was sitting at), so the dependency is now an ordinary versioned requirement and "uv sync" is the whole install. Verified end to end: uv lock resolves, uv sync --frozen installs from the registry, and ida_codemode.client.DatabaseHandle imports from the resulting venv. The path override is still the right answer when hacking on both at once, so that stays in the README as one "uv add --editable" line rather than as the default everyone pays for. Also fixed the plugin command it now documents: upstream's own README passes --prerelease=allow, and without it uvx refuses to resolve, because ida-codemode depends on ida-domain>=0.5.1.dev2. Checked that --install-plugin is a real flag and that the command runs, instead of copying it over on faith.
* README: rewrite, and fix the install it documentedblasty2026-08-071-12/+339
| | | | | | | | | | | | | | | | | | | | | | | | The old one had drifted into a wall of prose that described the project to someone who already knew it. Rewritten around what a reader actually needs: what this is, what it needs, how to run it, the keys, and what is in it -- with the logo up top and the sharp edges at the bottom instead of a wall of disclaimers at the top. Corrected while checking every claim rather than trusting it: - pyproject depended on 'ida-codemode-mcp' from '../ida-codemode-mcp'. The package is 'ida-codemode' and the repo is '../ida-codemode', so 'uv sync' -- the documented install -- could not have worked for anyone. Fixed, and uv.lock regenerated (it now resolves, 39 packages). - test counts were 257/733, they are 302/788 - the keys table is generated from the real BINDINGS: c/d/a/p/u, o/O/B, s for split, ctrl+t for structs, " for strings, all verified against app.py - dropped the ida-pro-mcp/worker-era architecture section, which described files that no longer exist, and replaced it with the current layout - links docs/CODEMODE_UPSTREAM.md and .fastfeedback/SPEED.md, which did not exist when the README was last touched Every path and doc link in it is checked to exist.
* Rebase MISTER EXO's ida-codemode port onto the current treeblasty2026-08-071-7/+58
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Mechanical part of the port: the 27-file patch was cut against a base ~148 commits behind us, so it did not apply. Resolved 11 conflicts (all of them diff drift, not semantic clashes) and the three file deletions: - app.py: the patch re-inserted _do_rename/_do_name_addr/_seek_split etc. as "theirs" because our tree moved them to edit_ctl.py/trace_ctl.py. Kept ours and applied the real intent (WorkerClient->CodeModeClient, .call->.invoke, _open_worker_client->_open_database_client) at their current homes. - domain.py: kept Head as a NamedTuple -- the patch reverted it to a frozen dataclass, which the perf work measured at 2.9us vs 1.9us per row on a quarter-million-row walk. Dropped _fetch_output (no download_url under Code Mode) and its now-dead urllib/json imports. - pane.py: the patch's deletion swallowed our zellij support along with the worker-reaping block it meant to remove. Kept zellij, removed the reaping. - test_scenarios.py: the idb_save->save_database teardown hunk belongs to tests/_fixtures.py in our tree; applied it there and kept our pc_num_format scenario that the drift landed on. Three defects in the patch itself, fixed here: - It made "import idatui" hard-require ida_codemode, so every offline suite died at import -- including the pure ones (graph/index/trace) that are the house rule for "tests/run.py --fast". The import is now deferred and gated on the binding, which is also what lets the port's own contract tests inject a fake DatabaseHandle. - project.stage() inlined an ida_codemode.registry import and treated "library not installed" as "someone owns this database", which broke IDA-free project staging. Ownership lookup moved to codemode_client.database_owner(). - tests/test_codemode_client.py had no NEEDS_IDA marker, which tests/run.py rejects outright. Offline suite: 301 passed, 0 failed. Against master's 344 the whole delta is accounted for: -40 worker_client (module deleted), -18 launch sweep checks (behaviour deliberately removed) +3 guarding that it stays removed, +2 pool (GUI-save semantics), +13 new codemode_client contract tests. NOT yet done, and the port is not functional without it: the adapter is missing five operations our tree grew since the patch's base (flowchart, op_format, pc_nums, pc_num_format, survey_binary) and its "heads" predates back-walking and digest/expect.
* disasm: render opcode bytes (toggle 'o'), padded to widest insnblasty2026-07-111-1/+3
| | | | | | | | | | | | | | Fetch per-instruction opcode bytes alongside the disasm listing and show them in a column between the address and the mnemonic. Instruction length comes from consecutive addresses (variable-length safe: x86 movabs shows its full 10 bytes); the block over-fetches one instruction for the last line's boundary, falling back to the function end for the final insn. The column pads to the widest instruction across the whole function: _fetch_block tracks a running max, and on load a background scan_bytes() settles a stable width so padding doesn't jump as blocks stream in. _op_field is shared by the rendered strip, _line_plain, and search _fmt so cursor/match offsets stay aligned. 'o' toggles the column.
* harden client: transparent session auto-recovery + stress suiteblasty2026-07-091-0/+191
- auto-recover stale db ("Session not found" after server restart): drop pin, re-resolve sole session, retry once. Only when db was auto-injected; never silently switches an explicitly-pinned db (auto_recover_session gate). - tests/serverctl.sh: start/stop/kill9/ready control over spawn.sh - tests/stress_client.py: 6 adversarial scenarios, 24 assertions: dead-port fail-fast, tight-timeout recovery, worker crash, full restart (naive auto-recovery + no-autoswitch), 300/16 concurrency, kill-under-churn. All clean: no hangs, no deadlocks, no non-IDAError leaks.