codevanta 0.1.0__tar.gz → 0.2.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {codevanta-0.1.0 → codevanta-0.2.0}/CHANGELOG.md +58 -0
- {codevanta-0.1.0/src/codevanta.egg-info → codevanta-0.2.0}/PKG-INFO +72 -46
- {codevanta-0.1.0 → codevanta-0.2.0}/README.md +68 -45
- codevanta-0.2.0/docs/assets/callgraph.png +0 -0
- codevanta-0.2.0/docs/assets/cli.png +0 -0
- codevanta-0.2.0/docs/assets/gui.png +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/docs/install.md +4 -3
- {codevanta-0.1.0 → codevanta-0.2.0}/docs/repository-settings.md +2 -2
- {codevanta-0.1.0 → codevanta-0.2.0}/pyproject.toml +5 -1
- codevanta-0.2.0/src/codevanta/analysis/adb.py +1358 -0
- codevanta-0.2.0/src/codevanta/analysis/apple_ips.py +628 -0
- codevanta-0.2.0/src/codevanta/analysis/asar.py +519 -0
- codevanta-0.2.0/src/codevanta/analysis/binmeta.py +1520 -0
- codevanta-0.2.0/src/codevanta/analysis/cdp_client.py +1154 -0
- codevanta-0.2.0/src/codevanta/analysis/compare.py +738 -0
- codevanta-0.2.0/src/codevanta/analysis/containers.py +1364 -0
- codevanta-0.2.0/src/codevanta/analysis/crash_core.py +676 -0
- codevanta-0.2.0/src/codevanta/analysis/debug_session.py +1504 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/src/codevanta/analysis/evidence_bundle.py +25 -8
- codevanta-0.2.0/src/codevanta/analysis/fdt.py +436 -0
- codevanta-0.2.0/src/codevanta/analysis/nav.py +704 -0
- codevanta-0.2.0/src/codevanta/analysis/nav_providers.py +172 -0
- codevanta-0.2.0/src/codevanta/analysis/sigrok_cli_wrap.py +319 -0
- codevanta-0.2.0/src/codevanta/analysis/sigrok_sr.py +352 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/src/codevanta/analysis/solver.py +712 -2
- codevanta-0.2.0/src/codevanta/analysis/sqlite_view.py +281 -0
- codevanta-0.2.0/src/codevanta/analysis/uart_decode.py +360 -0
- codevanta-0.2.0/src/codevanta/cli/containers.py +272 -0
- codevanta-0.2.0/src/codevanta/cli/crash.py +234 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/src/codevanta/cli/main.py +585 -6
- codevanta-0.2.0/src/codevanta/cli/meta.py +107 -0
- codevanta-0.2.0/src/codevanta/cli/mobile.py +361 -0
- codevanta-0.2.0/src/codevanta/cli/nav.py +268 -0
- codevanta-0.2.0/src/codevanta/cli/signal.py +285 -0
- codevanta-0.2.0/src/codevanta/cli/web.py +259 -0
- codevanta-0.2.0/src/codevanta/core/unknowns.py +340 -0
- codevanta-0.2.0/src/codevanta/mcp_server/ext_bin.py +64 -0
- codevanta-0.2.0/src/codevanta/mcp_server/ext_crash.py +80 -0
- codevanta-0.2.0/src/codevanta/mcp_server/ext_meta.py +25 -0
- codevanta-0.2.0/src/codevanta/mcp_server/ext_mobile.py +65 -0
- codevanta-0.2.0/src/codevanta/mcp_server/ext_nav.py +214 -0
- codevanta-0.2.0/src/codevanta/mcp_server/ext_signal.py +91 -0
- codevanta-0.2.0/src/codevanta/mcp_server/ext_solver.py +130 -0
- codevanta-0.2.0/src/codevanta/mcp_server/ext_web.py +138 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/src/codevanta/mcp_server/server.py +118 -1
- {codevanta-0.1.0 → codevanta-0.2.0}/src/codevanta/mcp_server/tools.py +247 -0
- {codevanta-0.1.0 → codevanta-0.2.0/src/codevanta.egg-info}/PKG-INFO +72 -46
- {codevanta-0.1.0 → codevanta-0.2.0}/src/codevanta.egg-info/SOURCES.txt +46 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/src/codevanta.egg-info/requires.txt +4 -0
- codevanta-0.2.0/tests/test_adb.py +931 -0
- codevanta-0.2.0/tests/test_compare.py +384 -0
- codevanta-0.2.0/tests/test_containers.py +776 -0
- codevanta-0.2.0/tests/test_crash.py +913 -0
- codevanta-0.2.0/tests/test_debug_session.py +925 -0
- codevanta-0.2.0/tests/test_fdt.py +399 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/tests/test_mcp_tools.py +5 -1
- codevanta-0.2.0/tests/test_meta.py +1483 -0
- codevanta-0.2.0/tests/test_nav.py +903 -0
- codevanta-0.2.0/tests/test_signal.py +758 -0
- codevanta-0.2.0/tests/test_solver.py +763 -0
- codevanta-0.2.0/tests/test_unknowns.py +360 -0
- codevanta-0.2.0/tests/test_web.py +1868 -0
- codevanta-0.1.0/tests/test_solver.py +0 -310
- {codevanta-0.1.0 → codevanta-0.2.0}/LICENSE +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/MANIFEST.in +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/docs/api.md +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/docs/architecture.md +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/docs/attribution.md +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/docs/phase2.md +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/docs/phase2b.md +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/docs/phase2c.md +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/docs/phase2d.md +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/docs/phase2e.md +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/docs/phase2f.md +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/docs/phase2g.md +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/docs/phase2h.md +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/docs/phase2i.md +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/docs/phase2j.md +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/docs/phase2k.md +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/docs/phase3.md +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/docs/phase6.md +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/docs/release-checklist.md +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/docs/samples.md +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/requirements.txt +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/scripts/agent_commit.py +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/scripts/bench.py +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/scripts/bench_gate.py +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/scripts/check_decompiler_backends.py +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/scripts/fuzz_parsers.py +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/scripts/install.ps1 +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/scripts/install.sh +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/scripts/make_samples.py +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/scripts/report_bundle.py +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/setup.cfg +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/src/codevanta/__init__.py +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/src/codevanta/analysis/__init__.py +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/src/codevanta/analysis/binary_diff.py +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/src/codevanta/analysis/callgraph.py +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/src/codevanta/analysis/cfg.py +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/src/codevanta/analysis/dataflow.py +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/src/codevanta/analysis/debugger.py +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/src/codevanta/analysis/debuginfo.py +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/src/codevanta/analysis/decompile.py +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/src/codevanta/analysis/decompilers/__init__.py +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/src/codevanta/analysis/decompilers/angr_backend.py +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/src/codevanta/analysis/decompilers/base.py +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/src/codevanta/analysis/decompilers/ghidra_backend.py +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/src/codevanta/analysis/dynamic.py +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/src/codevanta/analysis/emulate.py +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/src/codevanta/analysis/function_hash.py +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/src/codevanta/analysis/graph_export.py +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/src/codevanta/analysis/html_view.py +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/src/codevanta/analysis/jump_tables.py +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/src/codevanta/analysis/symbolic.py +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/src/codevanta/analysis/trace.py +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/src/codevanta/analysis/type_propagation.py +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/src/codevanta/analysis/type_recovery.py +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/src/codevanta/analysis/vtables.py +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/src/codevanta/analysis/xrefs.py +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/src/codevanta/api/__init__.py +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/src/codevanta/cli/__init__.py +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/src/codevanta/core/__init__.py +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/src/codevanta/core/disassembler.py +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/src/codevanta/core/entropy.py +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/src/codevanta/core/functions.py +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/src/codevanta/core/loader.py +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/src/codevanta/core/report.py +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/src/codevanta/core/strings.py +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/src/codevanta/evidence/__init__.py +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/src/codevanta/evidence/confidence.py +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/src/codevanta/evidence/models.py +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/src/codevanta/evidence/provenance.py +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/src/codevanta/gui/__init__.py +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/src/codevanta/gui/layout.py +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/src/codevanta/gui/server.py +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/src/codevanta/ir/__init__.py +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/src/codevanta/ir/adapters/__init__.py +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/src/codevanta/ir/base.py +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/src/codevanta/ir/instruction.py +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/src/codevanta/mcp_server/__init__.py +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/src/codevanta/plugins/__init__.py +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/src/codevanta/setup/__init__.py +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/src/codevanta/setup/apply.py +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/src/codevanta/setup/clients.py +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/src/codevanta/setup/plan.py +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/src/codevanta/setup/verify.py +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/src/codevanta/storage/__init__.py +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/src/codevanta/storage/session.py +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/src/codevanta.egg-info/dependency_links.txt +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/src/codevanta.egg-info/entry_points.txt +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/src/codevanta.egg-info/top_level.txt +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/tests/conftest.py +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/tests/test_agent_commit.py +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/tests/test_bench.py +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/tests/test_bench_gate.py +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/tests/test_binary_diff.py +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/tests/test_callgraph.py +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/tests/test_cfg.py +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/tests/test_cfg_recursive.py +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/tests/test_cli.py +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/tests/test_cli_gui.py +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/tests/test_cli_phase2.py +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/tests/test_cli_phase2b.py +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/tests/test_cli_phase2d.py +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/tests/test_cli_phase2e.py +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/tests/test_cli_phase2f.py +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/tests/test_cli_phase2g.py +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/tests/test_cli_phase2h.py +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/tests/test_cli_phase2i.py +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/tests/test_cli_phase2j.py +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/tests/test_cli_phase2k.py +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/tests/test_cli_phase3.py +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/tests/test_cli_phase7.py +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/tests/test_cli_trace.py +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/tests/test_dataflow.py +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/tests/test_debugger.py +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/tests/test_debuginfo.py +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/tests/test_decompile.py +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/tests/test_decompile_backends.py +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/tests/test_decompiler_parity.py +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/tests/test_disassembler.py +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/tests/test_dynamic.py +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/tests/test_emulate.py +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/tests/test_entropy.py +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/tests/test_evidence.py +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/tests/test_evidence_bundle.py +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/tests/test_function_hash.py +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/tests/test_functions.py +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/tests/test_fuzz_parsers.py +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/tests/test_graph_export.py +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/tests/test_gui.py +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/tests/test_html_view.py +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/tests/test_jump_tables.py +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/tests/test_loader.py +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/tests/test_plugins.py +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/tests/test_report_bundle.py +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/tests/test_report_callgraph.py +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/tests/test_report_phase2.py +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/tests/test_samples.py +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/tests/test_session.py +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/tests/test_setup_plan.py +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/tests/test_strings.py +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/tests/test_symbolic.py +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/tests/test_symbolic_parity.py +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/tests/test_tooling_config.py +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/tests/test_trace.py +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/tests/test_trace_samples.py +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/tests/test_type_propagation.py +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/tests/test_type_recovery.py +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/tests/test_vtables.py +0 -0
- {codevanta-0.1.0 → codevanta-0.2.0}/tests/test_xrefs.py +0 -0
|
@@ -4,6 +4,64 @@ All notable changes to CODEVANTA are documented here. The format follows
|
|
|
4
4
|
[Keep a Changelog](https://keepachangelog.com/en/1.1.0/) and the project uses
|
|
5
5
|
[Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
6
6
|
|
|
7
|
+
## [0.2.0] - 2026-11-13
|
|
8
|
+
|
|
9
|
+
### Added
|
|
10
|
+
|
|
11
|
+
- **Typed comparators** (`codevanta compare <a.json> <b.json>` + MCP tool
|
|
12
|
+
`codevanta_compare`): function inventories matched by name and by fingerprint,
|
|
13
|
+
string-set diffs, and evidence-bundle membership diffs - all offline, typed,
|
|
14
|
+
evidence-backed.
|
|
15
|
+
- **Residual-unknown ledger** (`codevanta unknowns`): typed `UnknownRecord` with
|
|
16
|
+
deterministic ids and an open/resolve lifecycle, surfaced in the evidence bundle
|
|
17
|
+
and over MCP (`codevanta_unknowns`).
|
|
18
|
+
- **Six REA-parity lanes** (PR #50): ELF-core + Apple `.ips` crash parsers
|
|
19
|
+
(`codevanta core`/`codevanta ips`, MCP `codevanta_crash`); auto-detecting
|
|
20
|
+
format metadata (APK signing v2/v3, Go buildinfo, Rust cargo-auditable, `.pyc`
|
|
21
|
+
headers, Electron fuses, ELF notes/modinfo, desktop classification;
|
|
22
|
+
`codevanta metadata`, MCP `codevanta_metadata`); binary containers (WASM
|
|
23
|
+
sections, EVM disasm-lite, GGUF, safetensors, pcap, firmware magic scan,
|
|
24
|
+
`codevanta binmeta`/`codevanta evm`) and a read-only SQLite viewer
|
|
25
|
+
(`codevanta sqlite`, MCP `codevanta_binmeta`/`codevanta_sqlite`); the ADB
|
|
26
|
+
mobile lane with offline transcript parsers and skip-gated live wrappers
|
|
27
|
+
(`codevanta mobile`, MCP `codevanta_adb`); the Web/Electron lane (stdlib
|
|
28
|
+
CDP client, passive page inspection, screenshot, WebMCP probe, ASAR
|
|
29
|
+
reconstruction; `codevanta web`/`codevanta asar`, MCP
|
|
30
|
+
`codevanta_web_inspect`/`codevanta_asar`); and solver-backed symbolic
|
|
31
|
+
execution gated on optional z3-solver with an unchanged naive fallback
|
|
32
|
+
(`--solver auto`, MCP `codevanta_symbolic_solve`).
|
|
33
|
+
- **Signal/firmware lane** (PR #51): sigrok `.sr` session archives, a pure-Python
|
|
34
|
+
UART decoder-lite with parity/stop validation, flattened devicetree (FDT)
|
|
35
|
+
parsing, and a skip-gated sigrok-cli wrapper (`codevanta signal`/`codevanta dtb`,
|
|
36
|
+
MCP `codevanta_signal_sr`/`codevanta_uart_decode`/`codevanta_dtb`).
|
|
37
|
+
- **Provider-neutral navigation state** (PR #51): bookmarks, comments, cursor and
|
|
38
|
+
goto-history per session over the session store, plus typed external-GUI
|
|
39
|
+
provider probes (`codevanta nav`, MCP `codevanta_nav`/`codevanta_nav_providers`).
|
|
40
|
+
|
|
41
|
+
### Changed
|
|
42
|
+
|
|
43
|
+
- MCP server now exposes 38 tools (from 22 at v0.1.0); `z3-solver>=4.13` joined
|
|
44
|
+
the dev extras so CI exercises the solver lane for real.
|
|
45
|
+
|
|
46
|
+
## [0.1.1] - 2026-11-13
|
|
47
|
+
|
|
48
|
+
### Added
|
|
49
|
+
|
|
50
|
+
- **Live gdb debug sessions** (`codevanta.analysis.debug_session` + `codevanta debug`
|
|
51
|
+
+ MCP tool `codevanta_debug`): the layer now owns a real `gdb --interpreter=mi2`
|
|
52
|
+
process - launch, break-at (symbol or address), continue, step/next, register
|
|
53
|
+
reads, bounded memory reads, backtrace frames, verified quit - each result typed,
|
|
54
|
+
JSON-safe and evidence-backed (`gdb.mi2`, HIGH, one-run provenance). A missing gdb
|
|
55
|
+
is a typed `AnalysisError` with an install hint, never a traceback.
|
|
56
|
+
- MCP tool count is now 23; the MCP `INSTRUCTIONS` document `debug` as the one
|
|
57
|
+
explicit execution exception.
|
|
58
|
+
|
|
59
|
+
### Changed
|
|
60
|
+
|
|
61
|
+
- README is fully de-hardcoded: real screenshots of the CLI, the loopback dashboard
|
|
62
|
+
and a 97-node call graph export; installation starts from PyPI; volatile counts
|
|
63
|
+
and Windows-only example paths removed; docs describe the actual CI gates.
|
|
64
|
+
|
|
7
65
|
## [Unreleased]
|
|
8
66
|
|
|
9
67
|
### Added
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: codevanta
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.2.0
|
|
4
4
|
Summary: CODEVANTA — Advanced Code Intelligence: AI-Powered Reverse Engineering & Binary Analysis Platform
|
|
5
5
|
Author: kevindoni
|
|
6
6
|
License-Expression: MIT
|
|
@@ -38,6 +38,9 @@ Requires-Dist: ruff>=0.5; extra == "dev"
|
|
|
38
38
|
Requires-Dist: build>=1.2; extra == "dev"
|
|
39
39
|
Requires-Dist: unicorn>=2.0; extra == "dev"
|
|
40
40
|
Requires-Dist: pyelftools>=0.31; extra == "dev"
|
|
41
|
+
Requires-Dist: z3-solver>=4.13; extra == "dev"
|
|
42
|
+
Provides-Extra: solver
|
|
43
|
+
Requires-Dist: z3-solver>=4.13; extra == "solver"
|
|
41
44
|
Provides-Extra: emulation
|
|
42
45
|
Requires-Dist: unicorn>=2.0; extra == "emulation"
|
|
43
46
|
Provides-Extra: dwarf
|
|
@@ -49,8 +52,20 @@ Dynamic: license-file
|
|
|
49
52
|
|
|
50
53
|
# CODEVANTA
|
|
51
54
|
|
|
55
|
+
[](https://pypi.org/project/codevanta/)
|
|
56
|
+
|
|
52
57
|
> **Advanced Code Intelligence** — Decode. Analyze. Understand.
|
|
53
58
|
|
|
59
|
+
<p align="center">
|
|
60
|
+
<img src="docs/assets/cli.png" width="840" alt="CODEVANTA CLI - real output of info, functions and xrefs against a committed PE sample"><br>
|
|
61
|
+
<em>CLI - info, functions, xrefs on a committed PE sample</em><br><br>
|
|
62
|
+
<img src="docs/assets/gui.png" width="840" alt="CODEVANTA read-only web dashboard served on loopback"><br>
|
|
63
|
+
<em>Read-only web dashboard (codevanta gui)</em><br><br>
|
|
64
|
+
<img src="docs/assets/callgraph.png" width="840" alt="Self-contained HTML call graph export with pan and zoom"><br>
|
|
65
|
+
<em>HTML call graph export - 97 nodes (codevanta callgraph --format html)</em>
|
|
66
|
+
</p>
|
|
67
|
+
|
|
68
|
+
|
|
54
69
|
CODEVANTA is an AI-powered code intelligence, reverse engineering, and binary
|
|
55
70
|
analysis platform. It helps engineers, security researchers, and analysts
|
|
56
71
|
understand software faster — from source code to executables with missing
|
|
@@ -218,7 +233,7 @@ Phase 2 adds the first reverse-engineering views on top of the phase 1 engine:
|
|
|
218
233
|
`codevanta_diff`, `codevanta_jump_table`, `codevanta_function_hash`,
|
|
219
234
|
`codevanta_xrefs`, `codevanta_cfg`, `codevanta_callgraph`,
|
|
220
235
|
`codevanta_session_save`, and `codevanta_session_list`, alongside the five
|
|
221
|
-
phase 1 tools
|
|
236
|
+
phase 1 tools. `codevanta_diff` takes `max_functions`,
|
|
222
237
|
`deep`, `semantic`, and `threshold`, so the phase 2j pairing pass is reachable
|
|
223
238
|
from an agent without a separate `codevanta_similarity` call.
|
|
224
239
|
- **`analyze` integration** (`core/report.py`) — the `codevanta analyze` JSON
|
|
@@ -267,10 +282,10 @@ tools. Phase 2i adds the `alignment`/`array_groups` layout hints on a struct
|
|
|
267
282
|
suggestion, the `function_similarity`/`normalized_tokens` API, and the
|
|
268
283
|
`codevanta_struct` MCP tool. Phase 2j adds the opt-in semantic pairing pass on the
|
|
269
284
|
binary diff (`semantic=True`, `threshold` defaulting to `0.9`), the
|
|
270
|
-
`codevanta_similarity` MCP tool
|
|
285
|
+
`codevanta_similarity` MCP tool, and the `signed` mnemonic hint on
|
|
271
286
|
struct fields, reachable as `diff --semantic --threshold` and as the
|
|
272
287
|
`codevanta struct` footer `signed:` line. Phase 2k adds the `deep` / `semantic` /
|
|
273
|
-
`threshold` arguments to the `codevanta_diff` MCP tool (
|
|
288
|
+
`threshold` arguments to the `codevanta_diff` MCP tool (no new
|
|
274
289
|
registration), the semantic pass's cross-architecture guard — the pass is skipped
|
|
275
290
|
with a warning naming both `BinaryInfo.architecture` tokens, which are compared
|
|
276
291
|
after trimming whitespace and lower-casing only, so a hand-built `AMD64` does not
|
|
@@ -290,8 +305,17 @@ scope, confidence semantics, and limitations.
|
|
|
290
305
|
|
|
291
306
|
## Installation
|
|
292
307
|
|
|
308
|
+
**From PyPI** (recommended):
|
|
309
|
+
|
|
310
|
+
```powershell
|
|
311
|
+
python -m pip install codevanta
|
|
312
|
+
```
|
|
313
|
+
|
|
314
|
+
**From source** (development install with the dev extras):
|
|
315
|
+
|
|
293
316
|
```powershell
|
|
294
|
-
|
|
317
|
+
git clone https://github.com/kevindoni/CODEVANTA.git
|
|
318
|
+
cd CODEVANTA
|
|
295
319
|
python -m pip install -e ".[dev]"
|
|
296
320
|
```
|
|
297
321
|
|
|
@@ -307,47 +331,46 @@ installs, and the full setup/uninstall reference.
|
|
|
307
331
|
## Usage
|
|
308
332
|
|
|
309
333
|
```powershell
|
|
310
|
-
codevanta info
|
|
311
|
-
codevanta functions
|
|
312
|
-
codevanta strings
|
|
313
|
-
codevanta entropy
|
|
314
|
-
codevanta disasm
|
|
315
|
-
codevanta analyze samples\elf64_text.bin --output
|
|
334
|
+
codevanta info samples\pe64_text.bin
|
|
335
|
+
codevanta functions samples\pe64_text.bin --limit 8
|
|
336
|
+
codevanta strings samples\macho64_text.bin --min-length 8
|
|
337
|
+
codevanta entropy samples\pe64_text.bin --threshold 7.2
|
|
338
|
+
codevanta disasm samples\pe64_text.bin --count 40
|
|
339
|
+
codevanta analyze samples\elf64_text.bin --output report.json
|
|
316
340
|
|
|
317
341
|
# Phase 2
|
|
318
|
-
codevanta analyze
|
|
319
|
-
codevanta analyze
|
|
320
|
-
codevanta analyze
|
|
321
|
-
codevanta xrefs
|
|
322
|
-
codevanta cfg
|
|
323
|
-
codevanta cfg
|
|
324
|
-
codevanta cfg
|
|
325
|
-
codevanta jump-table
|
|
326
|
-
codevanta jump-table
|
|
327
|
-
codevanta diff samples\
|
|
328
|
-
codevanta diff samples\
|
|
329
|
-
codevanta diff samples\
|
|
330
|
-
codevanta diff samples\
|
|
331
|
-
codevanta callgraph
|
|
332
|
-
codevanta callgraph
|
|
333
|
-
codevanta callgraph
|
|
342
|
+
codevanta analyze samples\pe64_text.bin --xrefs --cfg # report + xrefs + cfg
|
|
343
|
+
codevanta analyze samples\pe64_text.bin # phase 1 only
|
|
344
|
+
codevanta analyze samples\pe64_text.bin --xref-limit 200 --xrefs -o report.json
|
|
345
|
+
codevanta xrefs samples\pe64_text.bin --limit 40
|
|
346
|
+
codevanta cfg samples\pe64_text.bin # entry point, linear traversal
|
|
347
|
+
codevanta cfg samples\pe64_text.bin --traversal recursive
|
|
348
|
+
codevanta cfg samples\pe64_text.bin --traversal recursive --resolve-indirect
|
|
349
|
+
codevanta jump-table samples\pe64_text.bin --address 0x140001000
|
|
350
|
+
codevanta jump-table samples\pe64_text.bin --address 0x140001000 --entries 64 --json
|
|
351
|
+
codevanta diff samples\pe64_text.bin samples\macho64_text.bin
|
|
352
|
+
codevanta diff samples\pe64_text.bin samples\macho64_text.bin --max-functions 20000 --json
|
|
353
|
+
codevanta diff samples\pe64_text.bin samples\macho64_text.bin --semantic
|
|
354
|
+
codevanta diff samples\pe64_text.bin samples\macho64_text.bin --semantic --threshold 0.75 --json
|
|
355
|
+
codevanta callgraph samples\pe64_text.bin --format dot -o callgraph.dot
|
|
356
|
+
codevanta callgraph samples\pe64_text.bin --format graphml -o callgraph.graphml
|
|
357
|
+
codevanta callgraph samples\pe64_text.bin --format html -o callgraph.html
|
|
334
358
|
Invoke-Item callgraph.html # drag to pan, wheel to zoom, search labels, filter by kind
|
|
335
|
-
codevanta analyze
|
|
336
|
-
codevanta session save
|
|
359
|
+
codevanta analyze samples\pe64_text.bin --callgraph -o report.json
|
|
360
|
+
codevanta session save samples\pe64_text.bin --notes "baseline triage" # prints: session saved: <id>
|
|
337
361
|
codevanta session list --limit 10
|
|
338
|
-
codevanta session show
|
|
339
|
-
codevanta session annotate
|
|
340
|
-
codevanta session notes
|
|
341
|
-
codevanta struct
|
|
342
|
-
codevanta struct samples\handle.bin --function process --include-stack --json
|
|
362
|
+
codevanta session show SESSION_ID # the id that `session save` printed
|
|
363
|
+
codevanta session annotate SESSION_ID 0x140001000 "decrypts config with XOR 0x5a"
|
|
364
|
+
codevanta session notes SESSION_ID
|
|
365
|
+
codevanta struct samples\pe64_text.bin --function codevanta_sample_main --include-stack --json
|
|
343
366
|
|
|
344
367
|
# Phase 3
|
|
345
|
-
codevanta decompile
|
|
368
|
+
codevanta decompile samples\pe64_text.bin 0x140001000 --backend native
|
|
346
369
|
codevanta decompile samples\pe64_text.bin --json
|
|
347
370
|
codevanta decompile samples\pe64_text.bin --max-instructions 20 --output rendering.c
|
|
348
371
|
codevanta emulate samples\pe64_text.bin # returns 42
|
|
349
372
|
codevanta emulate samples\pe64_text.bin --set rdi=2 --mem 0x600000=48454c4c4f
|
|
350
|
-
codevanta emulate
|
|
373
|
+
codevanta emulate samples\pe64_text.bin --resolve-target # jmp/call [rip+..]
|
|
351
374
|
|
|
352
375
|
# Phase 5 — symbol-grade views and dynamic sessions
|
|
353
376
|
codevanta dwarf samples\hello-dwarf # DWARF symbols + type layouts
|
|
@@ -375,8 +398,11 @@ hinted anything. The same data comes back from Python and JSON:
|
|
|
375
398
|
```python
|
|
376
399
|
from codevanta.analysis.binary_diff import diff_binaries
|
|
377
400
|
|
|
378
|
-
|
|
379
|
-
diff
|
|
401
|
+
diff = diff_binaries("samples/pe64_text.bin", "samples/macho64_text.bin")
|
|
402
|
+
print(diff.identical, len(diff.functions_added), len(diff.functions_removed))
|
|
403
|
+
# With semantic=True, the leftovers left unpaired by address and name matching
|
|
404
|
+
# are additionally scored by normalized instruction-shape similarity
|
|
405
|
+
# (threshold defaults to 0.9) and reported in `functions_changed`.
|
|
380
406
|
for delta in diff.functions_changed:
|
|
381
407
|
print(hex(delta.address), delta.similarity) # None unless the pair was scored
|
|
382
408
|
```
|
|
@@ -479,7 +505,7 @@ codevanta gui --no-browser # print the URL and wait
|
|
|
479
505
|
|
|
480
506
|
`codevanta gui` serves one self-contained dashboard page over a loopback-only,
|
|
481
507
|
read-only HTTP server — no extra dependencies, no network access, and the
|
|
482
|
-
analysed file is never executed or written. The page drives
|
|
508
|
+
analysed file is never executed or written. The page drives these JSON routes
|
|
483
509
|
(`/api/health`, `/api/info`, `/api/functions`, `/api/strings`, `/api/xrefs`,
|
|
484
510
|
`/api/cfg`, `/api/struct`, `/api/callgraph`, `/api/diff`, `/api/decompile`,
|
|
485
511
|
`/api/emulate`, `/api/symbolic`, `/api/session_save`, `/api/session_list`), each
|
|
@@ -521,7 +547,7 @@ Safety model: every run prints the exact file changes and a diff first; nothing
|
|
|
521
547
|
is written without `--yes` (or an interactive confirmation); existing configs
|
|
522
548
|
are backed up as `*.codevanta.bak`; re-running the same command is a no-op.
|
|
523
549
|
|
|
524
|
-
MCP tools
|
|
550
|
+
MCP tools: `codevanta_info`, `codevanta_functions`,
|
|
525
551
|
`codevanta_strings`, `codevanta_disasm`, `codevanta_analyze`,
|
|
526
552
|
`codevanta_xrefs`, `codevanta_cfg`, `codevanta_callgraph`, `codevanta_diff`,
|
|
527
553
|
`codevanta_jump_table`, `codevanta_function_hash`, `codevanta_similarity`,
|
|
@@ -612,12 +638,12 @@ plus smoke-tests the wheel on 3.13.
|
|
|
612
638
|
- [Project specification](PROJECT_SPEC.md)
|
|
613
639
|
- [Architecture](docs/architecture.md)
|
|
614
640
|
- [API reference](docs/api.md) — every public Python entry point, the evidence
|
|
615
|
-
contract, the
|
|
641
|
+
contract, the dashboard routes, and the MCP tools
|
|
616
642
|
- [Sample binaries](docs/samples.md) — the committed PE/Mach-O/ELF fixtures and
|
|
617
643
|
how to regenerate them
|
|
618
644
|
- [Contributor attribution](docs/attribution.md) — how agent commits are credited,
|
|
619
645
|
and how to make an agent appear in GitHub's contributor graph
|
|
620
|
-
- [Release checklist](docs/release-checklist.md) — the
|
|
646
|
+
- [Release checklist](docs/release-checklist.md) — the PyPI trusted publisher,
|
|
621
647
|
the `pypi` environment, dry runs, tagging and CI re-runs (maintainers)
|
|
622
648
|
- [Phase 2 — cross-references, CFGs, sessions](docs/phase2.md)
|
|
623
649
|
- [Phase 2b — call graphs, graph export, session annotations](docs/phase2b.md)
|
|
@@ -642,11 +668,11 @@ from `src/`. A phase can be **delivered with named gaps** — those gaps are the
|
|
|
642
668
|
|
|
643
669
|
| Phase | Delivered | Open |
|
|
644
670
|
|-------|-----------|------|
|
|
645
|
-
| **1 · Foundation** | ✅ PE / ELF / Mach-O (fat slices too) / DEX loaders — `core/loader.py
|
|
646
|
-
| **2 · RE views** | ✅ Cross-references, incl. `call_import` / `call_indirect` slot resolution — `analysis/xrefs.py`<br>✅ Linear **and** recursive CFG — `analysis/cfg.py` (`build_cfg`, `build_recursive_cfg`), `codevanta cfg --traversal recursive`<br>✅ Call graphs with DOT / GraphML / HTML export — `analysis/callgraph.py`, `analysis/graph_export.py`, `analysis/html_view.py`<br>✅ Absolute and relative jump tables — `analysis/jump_tables.py` (`MODE_ABSOLUTE`, `MODE_RELATIVE`)<br>✅ SQLite sessions with address annotations — `storage/session.py`, `codevanta session save/list/show/annotate/notes`<br>✅ Structural binary diff, function fingerprints, function similarity — `analysis/binary_diff.py`, `analysis/function_hash.py`<br>✅ Struct-field recovery — `analysis/type_recovery.py`, `codevanta struct`<br>✅ Read-only loopback dashboard
|
|
671
|
+
| **1 · Foundation** | ✅ PE / ELF / Mach-O (fat slices too) / DEX loaders — `core/loader.py` (`dex\n` magic → `_load_dex`)<br>✅ Disassembly, ASCII + UTF-16 strings, function discovery, JSON evidence report — `core/disassembler.py`, `core/strings.py`, `core/functions.py`, `core/report.py`<br>✅ Per-section entropy and packing triage — `core/entropy.py` (`shannon_entropy`, `analyze_entropy`), `codevanta entropy`<br>✅ CLI — see `codevanta --help` (the `session` sub-app adds its own subcommands) — `cli/main.py`<br>✅ MCP server exposing the analysis tools — `mcp_server/server.py` (`build_server().list_tools()`)<br>✅ Guided agent setup for Claude Code, Cursor, Cline and VS Code — `setup/` (`clients.py`, `plan.py`, `apply.py`, `verify.py`) | ⬜ **.NET (CLR), WebAssembly and JVM `.class`/JAR formats** — `loader.py` recognises PE, ELF, Mach-O and DEX only |
|
|
672
|
+
| **2 · RE views** | ✅ Cross-references, incl. `call_import` / `call_indirect` slot resolution — `analysis/xrefs.py`<br>✅ Linear **and** recursive CFG — `analysis/cfg.py` (`build_cfg`, `build_recursive_cfg`), `codevanta cfg --traversal recursive`<br>✅ Call graphs with DOT / GraphML / HTML export — `analysis/callgraph.py`, `analysis/graph_export.py`, `analysis/html_view.py`<br>✅ Absolute and relative jump tables — `analysis/jump_tables.py` (`MODE_ABSOLUTE`, `MODE_RELATIVE`)<br>✅ SQLite sessions with address annotations — `storage/session.py`, `codevanta session save/list/show/annotate/notes`<br>✅ Structural binary diff, function fingerprints, function similarity — `analysis/binary_diff.py`, `analysis/function_hash.py`<br>✅ Struct-field recovery — `analysis/type_recovery.py`, `codevanta struct`<br>✅ Read-only loopback dashboard — `gui/server.py` (`ROUTES`) | ⬜ **Live debugger execution** — `codevanta attach` states outright that "the provider is never launched: this command writes a file and prints a command line"; the gdb/Frida session layer generates scripts and replays traces (`analysis/dynamic.py`, `analysis/trace.py`) but nothing runs gdb/Frida against a target<br>✅ GUI session persistence — `/api/session_save` and `/api/session_list` over `storage/session.py`<br>⬜ **Graph-oriented viewer application** — the shipped viewer is the static HTML/SVG export (`analysis/html_view.py`), not an interactive app |
|
|
647
673
|
| **3 · Decompilation** | ✅ Pseudo-C through three providers — `analysis/decompile.py`, `analysis/decompilers/` (`native`, `angr`, `ghidra` reported by `available_backends()`)<br>✅ Type propagation over decompiled output — `analysis/type_propagation.py`<br>✅ Decompiler parity enforced in CI instead of assumed — `.github/workflows/ci.yml` jobs `decompile-parity` and `ghidra-parity` | ⬜ **Embedded Python scripting** — no script command and no sandboxed interpreter; `session` stores annotations only |
|
|
648
|
-
| **4 · Emulation** | ✅ Bounded, offline emulation that never executes on the host, with explicit `return` / `budget` / `unmapped` / `unsupported` stop reasons — `analysis/emulate.py` (Unicorn), `codevanta emulate`<br>✅
|
|
649
|
-
| **5 · Platform** | ✅ CI/CD with real gates — `ci.yml`
|
|
674
|
+
| **4 · Emulation** | ✅ Bounded, offline emulation that never executes on the host, with explicit `return` / `budget` / `unmapped` / `unsupported` stop reasons — `analysis/emulate.py` (Unicorn), `codevanta emulate`<br>✅ Emulation test suite — `tests/test_emulate.py` | ⬜ **Typed / SSA IR lifting** — `ir/base.py` and `ir/adapters/` are a contract plus an empty registry ("Concrete adapters arrive in phase 4")<br>⚠️ **Symbolic execution** — bounded path exploration over Unicorn exists (`analysis/symbolic.py`, seeded branches recorded as assumptions); no solver-based symbolic execution (`Simulator`/`SimulationManager`/Z3) in `src/` |
|
|
675
|
+
| **5 · Platform** | ✅ CI/CD with real gates — `ci.yml` gates the test matrix, `type-check` (mypy), the wheel smoke test, `decompile-parity` and `fuzz smoke`, with best-effort `ghidra-parity`, an informational `benchmark`, and non-blocking windows/macOS platform runs (see the workflow for the current job list) and `pyproject.toml` sets `fail_under = 85` coverage<br>✅ Release pipeline — `release.yml`: `build` → `publish-pypi` (trusted publishing) → `github-release`; used for the v0.1.0 release<br>✅ Dynamic provider probing, script generation and trace replay reachable from the CLI — `analysis/dynamic.py`, `analysis/trace.py` (`parse_gdb_trace`, `parse_frida_trace`), `codevanta attach`, `codevanta trace` | ✅ **Plugin SDK** — `plugins/` (entry-point discovery, bounded `run_plugin`, built-in registry, `MetricsAnalyzer`)<br>⬜ **Full AI layer** and **multi-user** — no auth, user or tenant model exists in `src/`<br>✅ **Evidence bundle** — `analysis/evidence_bundle.py` (manifest, per-entry tamper detection) and `scripts/report_bundle.py` (report + trace → verifiable bundle)<br>✅ **Fuzz and benchmark** — `scripts/fuzz_parsers.py` (`fuzz-smoke` job) and `scripts/bench_gate.py` (`benchmark` job, informational)<br>✅ **Windows / macOS CI** — `test-platform` matrix py3.13 on windows-latest and macos-latest (non-blocking platform signal)<br>✅ **PyPI release** — v0.1.0 published through trusted publishing: a `v*` tag drives `release.yml` |
|
|
650
676
|
|
|
651
677
|
## Product principles
|
|
652
678
|
|
|
@@ -1,7 +1,19 @@
|
|
|
1
1
|
# CODEVANTA
|
|
2
2
|
|
|
3
|
+
[](https://pypi.org/project/codevanta/)
|
|
4
|
+
|
|
3
5
|
> **Advanced Code Intelligence** — Decode. Analyze. Understand.
|
|
4
6
|
|
|
7
|
+
<p align="center">
|
|
8
|
+
<img src="docs/assets/cli.png" width="840" alt="CODEVANTA CLI - real output of info, functions and xrefs against a committed PE sample"><br>
|
|
9
|
+
<em>CLI - info, functions, xrefs on a committed PE sample</em><br><br>
|
|
10
|
+
<img src="docs/assets/gui.png" width="840" alt="CODEVANTA read-only web dashboard served on loopback"><br>
|
|
11
|
+
<em>Read-only web dashboard (codevanta gui)</em><br><br>
|
|
12
|
+
<img src="docs/assets/callgraph.png" width="840" alt="Self-contained HTML call graph export with pan and zoom"><br>
|
|
13
|
+
<em>HTML call graph export - 97 nodes (codevanta callgraph --format html)</em>
|
|
14
|
+
</p>
|
|
15
|
+
|
|
16
|
+
|
|
5
17
|
CODEVANTA is an AI-powered code intelligence, reverse engineering, and binary
|
|
6
18
|
analysis platform. It helps engineers, security researchers, and analysts
|
|
7
19
|
understand software faster — from source code to executables with missing
|
|
@@ -169,7 +181,7 @@ Phase 2 adds the first reverse-engineering views on top of the phase 1 engine:
|
|
|
169
181
|
`codevanta_diff`, `codevanta_jump_table`, `codevanta_function_hash`,
|
|
170
182
|
`codevanta_xrefs`, `codevanta_cfg`, `codevanta_callgraph`,
|
|
171
183
|
`codevanta_session_save`, and `codevanta_session_list`, alongside the five
|
|
172
|
-
phase 1 tools
|
|
184
|
+
phase 1 tools. `codevanta_diff` takes `max_functions`,
|
|
173
185
|
`deep`, `semantic`, and `threshold`, so the phase 2j pairing pass is reachable
|
|
174
186
|
from an agent without a separate `codevanta_similarity` call.
|
|
175
187
|
- **`analyze` integration** (`core/report.py`) — the `codevanta analyze` JSON
|
|
@@ -218,10 +230,10 @@ tools. Phase 2i adds the `alignment`/`array_groups` layout hints on a struct
|
|
|
218
230
|
suggestion, the `function_similarity`/`normalized_tokens` API, and the
|
|
219
231
|
`codevanta_struct` MCP tool. Phase 2j adds the opt-in semantic pairing pass on the
|
|
220
232
|
binary diff (`semantic=True`, `threshold` defaulting to `0.9`), the
|
|
221
|
-
`codevanta_similarity` MCP tool
|
|
233
|
+
`codevanta_similarity` MCP tool, and the `signed` mnemonic hint on
|
|
222
234
|
struct fields, reachable as `diff --semantic --threshold` and as the
|
|
223
235
|
`codevanta struct` footer `signed:` line. Phase 2k adds the `deep` / `semantic` /
|
|
224
|
-
`threshold` arguments to the `codevanta_diff` MCP tool (
|
|
236
|
+
`threshold` arguments to the `codevanta_diff` MCP tool (no new
|
|
225
237
|
registration), the semantic pass's cross-architecture guard — the pass is skipped
|
|
226
238
|
with a warning naming both `BinaryInfo.architecture` tokens, which are compared
|
|
227
239
|
after trimming whitespace and lower-casing only, so a hand-built `AMD64` does not
|
|
@@ -241,8 +253,17 @@ scope, confidence semantics, and limitations.
|
|
|
241
253
|
|
|
242
254
|
## Installation
|
|
243
255
|
|
|
256
|
+
**From PyPI** (recommended):
|
|
257
|
+
|
|
258
|
+
```powershell
|
|
259
|
+
python -m pip install codevanta
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
**From source** (development install with the dev extras):
|
|
263
|
+
|
|
244
264
|
```powershell
|
|
245
|
-
|
|
265
|
+
git clone https://github.com/kevindoni/CODEVANTA.git
|
|
266
|
+
cd CODEVANTA
|
|
246
267
|
python -m pip install -e ".[dev]"
|
|
247
268
|
```
|
|
248
269
|
|
|
@@ -258,47 +279,46 @@ installs, and the full setup/uninstall reference.
|
|
|
258
279
|
## Usage
|
|
259
280
|
|
|
260
281
|
```powershell
|
|
261
|
-
codevanta info
|
|
262
|
-
codevanta functions
|
|
263
|
-
codevanta strings
|
|
264
|
-
codevanta entropy
|
|
265
|
-
codevanta disasm
|
|
266
|
-
codevanta analyze samples\elf64_text.bin --output
|
|
282
|
+
codevanta info samples\pe64_text.bin
|
|
283
|
+
codevanta functions samples\pe64_text.bin --limit 8
|
|
284
|
+
codevanta strings samples\macho64_text.bin --min-length 8
|
|
285
|
+
codevanta entropy samples\pe64_text.bin --threshold 7.2
|
|
286
|
+
codevanta disasm samples\pe64_text.bin --count 40
|
|
287
|
+
codevanta analyze samples\elf64_text.bin --output report.json
|
|
267
288
|
|
|
268
289
|
# Phase 2
|
|
269
|
-
codevanta analyze
|
|
270
|
-
codevanta analyze
|
|
271
|
-
codevanta analyze
|
|
272
|
-
codevanta xrefs
|
|
273
|
-
codevanta cfg
|
|
274
|
-
codevanta cfg
|
|
275
|
-
codevanta cfg
|
|
276
|
-
codevanta jump-table
|
|
277
|
-
codevanta jump-table
|
|
278
|
-
codevanta diff samples\
|
|
279
|
-
codevanta diff samples\
|
|
280
|
-
codevanta diff samples\
|
|
281
|
-
codevanta diff samples\
|
|
282
|
-
codevanta callgraph
|
|
283
|
-
codevanta callgraph
|
|
284
|
-
codevanta callgraph
|
|
290
|
+
codevanta analyze samples\pe64_text.bin --xrefs --cfg # report + xrefs + cfg
|
|
291
|
+
codevanta analyze samples\pe64_text.bin # phase 1 only
|
|
292
|
+
codevanta analyze samples\pe64_text.bin --xref-limit 200 --xrefs -o report.json
|
|
293
|
+
codevanta xrefs samples\pe64_text.bin --limit 40
|
|
294
|
+
codevanta cfg samples\pe64_text.bin # entry point, linear traversal
|
|
295
|
+
codevanta cfg samples\pe64_text.bin --traversal recursive
|
|
296
|
+
codevanta cfg samples\pe64_text.bin --traversal recursive --resolve-indirect
|
|
297
|
+
codevanta jump-table samples\pe64_text.bin --address 0x140001000
|
|
298
|
+
codevanta jump-table samples\pe64_text.bin --address 0x140001000 --entries 64 --json
|
|
299
|
+
codevanta diff samples\pe64_text.bin samples\macho64_text.bin
|
|
300
|
+
codevanta diff samples\pe64_text.bin samples\macho64_text.bin --max-functions 20000 --json
|
|
301
|
+
codevanta diff samples\pe64_text.bin samples\macho64_text.bin --semantic
|
|
302
|
+
codevanta diff samples\pe64_text.bin samples\macho64_text.bin --semantic --threshold 0.75 --json
|
|
303
|
+
codevanta callgraph samples\pe64_text.bin --format dot -o callgraph.dot
|
|
304
|
+
codevanta callgraph samples\pe64_text.bin --format graphml -o callgraph.graphml
|
|
305
|
+
codevanta callgraph samples\pe64_text.bin --format html -o callgraph.html
|
|
285
306
|
Invoke-Item callgraph.html # drag to pan, wheel to zoom, search labels, filter by kind
|
|
286
|
-
codevanta analyze
|
|
287
|
-
codevanta session save
|
|
307
|
+
codevanta analyze samples\pe64_text.bin --callgraph -o report.json
|
|
308
|
+
codevanta session save samples\pe64_text.bin --notes "baseline triage" # prints: session saved: <id>
|
|
288
309
|
codevanta session list --limit 10
|
|
289
|
-
codevanta session show
|
|
290
|
-
codevanta session annotate
|
|
291
|
-
codevanta session notes
|
|
292
|
-
codevanta struct
|
|
293
|
-
codevanta struct samples\handle.bin --function process --include-stack --json
|
|
310
|
+
codevanta session show SESSION_ID # the id that `session save` printed
|
|
311
|
+
codevanta session annotate SESSION_ID 0x140001000 "decrypts config with XOR 0x5a"
|
|
312
|
+
codevanta session notes SESSION_ID
|
|
313
|
+
codevanta struct samples\pe64_text.bin --function codevanta_sample_main --include-stack --json
|
|
294
314
|
|
|
295
315
|
# Phase 3
|
|
296
|
-
codevanta decompile
|
|
316
|
+
codevanta decompile samples\pe64_text.bin 0x140001000 --backend native
|
|
297
317
|
codevanta decompile samples\pe64_text.bin --json
|
|
298
318
|
codevanta decompile samples\pe64_text.bin --max-instructions 20 --output rendering.c
|
|
299
319
|
codevanta emulate samples\pe64_text.bin # returns 42
|
|
300
320
|
codevanta emulate samples\pe64_text.bin --set rdi=2 --mem 0x600000=48454c4c4f
|
|
301
|
-
codevanta emulate
|
|
321
|
+
codevanta emulate samples\pe64_text.bin --resolve-target # jmp/call [rip+..]
|
|
302
322
|
|
|
303
323
|
# Phase 5 — symbol-grade views and dynamic sessions
|
|
304
324
|
codevanta dwarf samples\hello-dwarf # DWARF symbols + type layouts
|
|
@@ -326,8 +346,11 @@ hinted anything. The same data comes back from Python and JSON:
|
|
|
326
346
|
```python
|
|
327
347
|
from codevanta.analysis.binary_diff import diff_binaries
|
|
328
348
|
|
|
329
|
-
|
|
330
|
-
diff
|
|
349
|
+
diff = diff_binaries("samples/pe64_text.bin", "samples/macho64_text.bin")
|
|
350
|
+
print(diff.identical, len(diff.functions_added), len(diff.functions_removed))
|
|
351
|
+
# With semantic=True, the leftovers left unpaired by address and name matching
|
|
352
|
+
# are additionally scored by normalized instruction-shape similarity
|
|
353
|
+
# (threshold defaults to 0.9) and reported in `functions_changed`.
|
|
331
354
|
for delta in diff.functions_changed:
|
|
332
355
|
print(hex(delta.address), delta.similarity) # None unless the pair was scored
|
|
333
356
|
```
|
|
@@ -430,7 +453,7 @@ codevanta gui --no-browser # print the URL and wait
|
|
|
430
453
|
|
|
431
454
|
`codevanta gui` serves one self-contained dashboard page over a loopback-only,
|
|
432
455
|
read-only HTTP server — no extra dependencies, no network access, and the
|
|
433
|
-
analysed file is never executed or written. The page drives
|
|
456
|
+
analysed file is never executed or written. The page drives these JSON routes
|
|
434
457
|
(`/api/health`, `/api/info`, `/api/functions`, `/api/strings`, `/api/xrefs`,
|
|
435
458
|
`/api/cfg`, `/api/struct`, `/api/callgraph`, `/api/diff`, `/api/decompile`,
|
|
436
459
|
`/api/emulate`, `/api/symbolic`, `/api/session_save`, `/api/session_list`), each
|
|
@@ -472,7 +495,7 @@ Safety model: every run prints the exact file changes and a diff first; nothing
|
|
|
472
495
|
is written without `--yes` (or an interactive confirmation); existing configs
|
|
473
496
|
are backed up as `*.codevanta.bak`; re-running the same command is a no-op.
|
|
474
497
|
|
|
475
|
-
MCP tools
|
|
498
|
+
MCP tools: `codevanta_info`, `codevanta_functions`,
|
|
476
499
|
`codevanta_strings`, `codevanta_disasm`, `codevanta_analyze`,
|
|
477
500
|
`codevanta_xrefs`, `codevanta_cfg`, `codevanta_callgraph`, `codevanta_diff`,
|
|
478
501
|
`codevanta_jump_table`, `codevanta_function_hash`, `codevanta_similarity`,
|
|
@@ -563,12 +586,12 @@ plus smoke-tests the wheel on 3.13.
|
|
|
563
586
|
- [Project specification](PROJECT_SPEC.md)
|
|
564
587
|
- [Architecture](docs/architecture.md)
|
|
565
588
|
- [API reference](docs/api.md) — every public Python entry point, the evidence
|
|
566
|
-
contract, the
|
|
589
|
+
contract, the dashboard routes, and the MCP tools
|
|
567
590
|
- [Sample binaries](docs/samples.md) — the committed PE/Mach-O/ELF fixtures and
|
|
568
591
|
how to regenerate them
|
|
569
592
|
- [Contributor attribution](docs/attribution.md) — how agent commits are credited,
|
|
570
593
|
and how to make an agent appear in GitHub's contributor graph
|
|
571
|
-
- [Release checklist](docs/release-checklist.md) — the
|
|
594
|
+
- [Release checklist](docs/release-checklist.md) — the PyPI trusted publisher,
|
|
572
595
|
the `pypi` environment, dry runs, tagging and CI re-runs (maintainers)
|
|
573
596
|
- [Phase 2 — cross-references, CFGs, sessions](docs/phase2.md)
|
|
574
597
|
- [Phase 2b — call graphs, graph export, session annotations](docs/phase2b.md)
|
|
@@ -593,11 +616,11 @@ from `src/`. A phase can be **delivered with named gaps** — those gaps are the
|
|
|
593
616
|
|
|
594
617
|
| Phase | Delivered | Open |
|
|
595
618
|
|-------|-----------|------|
|
|
596
|
-
| **1 · Foundation** | ✅ PE / ELF / Mach-O (fat slices too) / DEX loaders — `core/loader.py
|
|
597
|
-
| **2 · RE views** | ✅ Cross-references, incl. `call_import` / `call_indirect` slot resolution — `analysis/xrefs.py`<br>✅ Linear **and** recursive CFG — `analysis/cfg.py` (`build_cfg`, `build_recursive_cfg`), `codevanta cfg --traversal recursive`<br>✅ Call graphs with DOT / GraphML / HTML export — `analysis/callgraph.py`, `analysis/graph_export.py`, `analysis/html_view.py`<br>✅ Absolute and relative jump tables — `analysis/jump_tables.py` (`MODE_ABSOLUTE`, `MODE_RELATIVE`)<br>✅ SQLite sessions with address annotations — `storage/session.py`, `codevanta session save/list/show/annotate/notes`<br>✅ Structural binary diff, function fingerprints, function similarity — `analysis/binary_diff.py`, `analysis/function_hash.py`<br>✅ Struct-field recovery — `analysis/type_recovery.py`, `codevanta struct`<br>✅ Read-only loopback dashboard
|
|
619
|
+
| **1 · Foundation** | ✅ PE / ELF / Mach-O (fat slices too) / DEX loaders — `core/loader.py` (`dex\n` magic → `_load_dex`)<br>✅ Disassembly, ASCII + UTF-16 strings, function discovery, JSON evidence report — `core/disassembler.py`, `core/strings.py`, `core/functions.py`, `core/report.py`<br>✅ Per-section entropy and packing triage — `core/entropy.py` (`shannon_entropy`, `analyze_entropy`), `codevanta entropy`<br>✅ CLI — see `codevanta --help` (the `session` sub-app adds its own subcommands) — `cli/main.py`<br>✅ MCP server exposing the analysis tools — `mcp_server/server.py` (`build_server().list_tools()`)<br>✅ Guided agent setup for Claude Code, Cursor, Cline and VS Code — `setup/` (`clients.py`, `plan.py`, `apply.py`, `verify.py`) | ⬜ **.NET (CLR), WebAssembly and JVM `.class`/JAR formats** — `loader.py` recognises PE, ELF, Mach-O and DEX only |
|
|
620
|
+
| **2 · RE views** | ✅ Cross-references, incl. `call_import` / `call_indirect` slot resolution — `analysis/xrefs.py`<br>✅ Linear **and** recursive CFG — `analysis/cfg.py` (`build_cfg`, `build_recursive_cfg`), `codevanta cfg --traversal recursive`<br>✅ Call graphs with DOT / GraphML / HTML export — `analysis/callgraph.py`, `analysis/graph_export.py`, `analysis/html_view.py`<br>✅ Absolute and relative jump tables — `analysis/jump_tables.py` (`MODE_ABSOLUTE`, `MODE_RELATIVE`)<br>✅ SQLite sessions with address annotations — `storage/session.py`, `codevanta session save/list/show/annotate/notes`<br>✅ Structural binary diff, function fingerprints, function similarity — `analysis/binary_diff.py`, `analysis/function_hash.py`<br>✅ Struct-field recovery — `analysis/type_recovery.py`, `codevanta struct`<br>✅ Read-only loopback dashboard — `gui/server.py` (`ROUTES`) | ⬜ **Live debugger execution** — `codevanta attach` states outright that "the provider is never launched: this command writes a file and prints a command line"; the gdb/Frida session layer generates scripts and replays traces (`analysis/dynamic.py`, `analysis/trace.py`) but nothing runs gdb/Frida against a target<br>✅ GUI session persistence — `/api/session_save` and `/api/session_list` over `storage/session.py`<br>⬜ **Graph-oriented viewer application** — the shipped viewer is the static HTML/SVG export (`analysis/html_view.py`), not an interactive app |
|
|
598
621
|
| **3 · Decompilation** | ✅ Pseudo-C through three providers — `analysis/decompile.py`, `analysis/decompilers/` (`native`, `angr`, `ghidra` reported by `available_backends()`)<br>✅ Type propagation over decompiled output — `analysis/type_propagation.py`<br>✅ Decompiler parity enforced in CI instead of assumed — `.github/workflows/ci.yml` jobs `decompile-parity` and `ghidra-parity` | ⬜ **Embedded Python scripting** — no script command and no sandboxed interpreter; `session` stores annotations only |
|
|
599
|
-
| **4 · Emulation** | ✅ Bounded, offline emulation that never executes on the host, with explicit `return` / `budget` / `unmapped` / `unsupported` stop reasons — `analysis/emulate.py` (Unicorn), `codevanta emulate`<br>✅
|
|
600
|
-
| **5 · Platform** | ✅ CI/CD with real gates — `ci.yml`
|
|
622
|
+
| **4 · Emulation** | ✅ Bounded, offline emulation that never executes on the host, with explicit `return` / `budget` / `unmapped` / `unsupported` stop reasons — `analysis/emulate.py` (Unicorn), `codevanta emulate`<br>✅ Emulation test suite — `tests/test_emulate.py` | ⬜ **Typed / SSA IR lifting** — `ir/base.py` and `ir/adapters/` are a contract plus an empty registry ("Concrete adapters arrive in phase 4")<br>⚠️ **Symbolic execution** — bounded path exploration over Unicorn exists (`analysis/symbolic.py`, seeded branches recorded as assumptions); no solver-based symbolic execution (`Simulator`/`SimulationManager`/Z3) in `src/` |
|
|
623
|
+
| **5 · Platform** | ✅ CI/CD with real gates — `ci.yml` gates the test matrix, `type-check` (mypy), the wheel smoke test, `decompile-parity` and `fuzz smoke`, with best-effort `ghidra-parity`, an informational `benchmark`, and non-blocking windows/macOS platform runs (see the workflow for the current job list) and `pyproject.toml` sets `fail_under = 85` coverage<br>✅ Release pipeline — `release.yml`: `build` → `publish-pypi` (trusted publishing) → `github-release`; used for the v0.1.0 release<br>✅ Dynamic provider probing, script generation and trace replay reachable from the CLI — `analysis/dynamic.py`, `analysis/trace.py` (`parse_gdb_trace`, `parse_frida_trace`), `codevanta attach`, `codevanta trace` | ✅ **Plugin SDK** — `plugins/` (entry-point discovery, bounded `run_plugin`, built-in registry, `MetricsAnalyzer`)<br>⬜ **Full AI layer** and **multi-user** — no auth, user or tenant model exists in `src/`<br>✅ **Evidence bundle** — `analysis/evidence_bundle.py` (manifest, per-entry tamper detection) and `scripts/report_bundle.py` (report + trace → verifiable bundle)<br>✅ **Fuzz and benchmark** — `scripts/fuzz_parsers.py` (`fuzz-smoke` job) and `scripts/bench_gate.py` (`benchmark` job, informational)<br>✅ **Windows / macOS CI** — `test-platform` matrix py3.13 on windows-latest and macos-latest (non-blocking platform signal)<br>✅ **PyPI release** — v0.1.0 published through trusted publishing: a `v*` tag drives `release.yml` |
|
|
601
624
|
|
|
602
625
|
## Product principles
|
|
603
626
|
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -37,14 +37,15 @@ uv tool install git+https://github.com/kevindoni/CODEVANTA.git # isolated
|
|
|
37
37
|
# from a local clone: python -m pip install -e ".[dev]"
|
|
38
38
|
```
|
|
39
39
|
|
|
40
|
-
## From PyPI
|
|
40
|
+
## From PyPI
|
|
41
41
|
|
|
42
42
|
```powershell
|
|
43
|
-
|
|
43
|
+
python -m pip install codevanta # or: uv tool install codevanta / pipx install codevanta
|
|
44
44
|
codevanta setup --dry-run --client claude
|
|
45
45
|
```
|
|
46
46
|
|
|
47
|
-
|
|
47
|
+
The GitHub one-liners above install from `main`; use them when you want the
|
|
48
|
+
latest unreleased changes instead of the published version.
|
|
48
49
|
|
|
49
50
|
## Connect a coding agent
|
|
50
51
|
|
|
@@ -11,7 +11,7 @@ Applied through the GitHub API (`PUT /repos/kevindoni/CODEVANTA/branches/main/pr
|
|
|
11
11
|
|------|-------|
|
|
12
12
|
| Require a pull request before merging | yes (0 approvals, so a maintainer can self-merge) |
|
|
13
13
|
| Dismiss stale approvals on new commits | yes |
|
|
14
|
-
| Require status checks | `test (py3.11)`, `test (py3.13)`, `build and smoke-test wheel` |
|
|
14
|
+
| Require status checks | `test (py3.11)`, `test (py3.13)`, `test (py3.14)`, `type-check (mypy)`, `build and smoke-test wheel`, `decompile-parity`, `fuzz smoke (parser hardening)` — the full CI run is listed in §6 |
|
|
15
15
|
| Require branches to be up to date | yes (strict) |
|
|
16
16
|
| Require linear history | yes (squash or rebase merges only) |
|
|
17
17
|
| Block force pushes | yes |
|
|
@@ -74,7 +74,7 @@ both files to the GitHub release. Update `CHANGELOG.md` before tagging.
|
|
|
74
74
|
|
|
75
75
|
| Workflow | Trigger | Jobs |
|
|
76
76
|
|----------|---------|------|
|
|
77
|
-
| `ci.yml` | push to `main`, pull requests, manual | lint + tests on 3.11/3.13, wheel build and clean-venv smoke test |
|
|
77
|
+
| `ci.yml` | push to `main`, pull requests, manual | lint + tests on 3.11/3.13/3.14, mypy type-check, wheel build and clean-venv smoke test, `decompile-parity` (angr), `ghidra-parity` (best effort), `fuzz smoke`, `benchmark` (informational), py3.13 windows/macos platform runs (non-blocking) |
|
|
78
78
|
| `release.yml` | tag `v*` | build, PyPI trusted publish, GitHub release assets |
|
|
79
79
|
|
|
80
80
|
Python 3.11, 3.13, and 3.14 are in the CI matrix. Older interpreters are
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "codevanta"
|
|
7
|
-
version = "0.
|
|
7
|
+
version = "0.2.0"
|
|
8
8
|
description = "CODEVANTA — Advanced Code Intelligence: AI-Powered Reverse Engineering & Binary Analysis Platform"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.10"
|
|
@@ -50,6 +50,10 @@ dev = [
|
|
|
50
50
|
"build>=1.2",
|
|
51
51
|
"unicorn>=2.0",
|
|
52
52
|
"pyelftools>=0.31",
|
|
53
|
+
"z3-solver>=4.13",
|
|
54
|
+
]
|
|
55
|
+
solver = [
|
|
56
|
+
"z3-solver>=4.13",
|
|
53
57
|
]
|
|
54
58
|
emulation = [
|
|
55
59
|
"unicorn>=2.0",
|