codevanta 0.1.0__tar.gz → 0.1.1__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.
Files changed (169) hide show
  1. {codevanta-0.1.0 → codevanta-0.1.1}/CHANGELOG.md +19 -0
  2. {codevanta-0.1.0/src/codevanta.egg-info → codevanta-0.1.1}/PKG-INFO +69 -46
  3. {codevanta-0.1.0 → codevanta-0.1.1}/README.md +68 -45
  4. codevanta-0.1.1/docs/assets/callgraph.png +0 -0
  5. codevanta-0.1.1/docs/assets/cli.png +0 -0
  6. codevanta-0.1.1/docs/assets/gui.png +0 -0
  7. {codevanta-0.1.0 → codevanta-0.1.1}/docs/install.md +4 -3
  8. {codevanta-0.1.0 → codevanta-0.1.1}/docs/repository-settings.md +2 -2
  9. {codevanta-0.1.0 → codevanta-0.1.1}/pyproject.toml +1 -1
  10. codevanta-0.1.1/src/codevanta/analysis/debug_session.py +1504 -0
  11. {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta/cli/main.py +179 -1
  12. {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta/mcp_server/server.py +43 -1
  13. {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta/mcp_server/tools.py +64 -0
  14. {codevanta-0.1.0 → codevanta-0.1.1/src/codevanta.egg-info}/PKG-INFO +69 -46
  15. {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta.egg-info/SOURCES.txt +5 -0
  16. codevanta-0.1.1/tests/test_debug_session.py +925 -0
  17. {codevanta-0.1.0 → codevanta-0.1.1}/tests/test_mcp_tools.py +2 -1
  18. {codevanta-0.1.0 → codevanta-0.1.1}/LICENSE +0 -0
  19. {codevanta-0.1.0 → codevanta-0.1.1}/MANIFEST.in +0 -0
  20. {codevanta-0.1.0 → codevanta-0.1.1}/docs/api.md +0 -0
  21. {codevanta-0.1.0 → codevanta-0.1.1}/docs/architecture.md +0 -0
  22. {codevanta-0.1.0 → codevanta-0.1.1}/docs/attribution.md +0 -0
  23. {codevanta-0.1.0 → codevanta-0.1.1}/docs/phase2.md +0 -0
  24. {codevanta-0.1.0 → codevanta-0.1.1}/docs/phase2b.md +0 -0
  25. {codevanta-0.1.0 → codevanta-0.1.1}/docs/phase2c.md +0 -0
  26. {codevanta-0.1.0 → codevanta-0.1.1}/docs/phase2d.md +0 -0
  27. {codevanta-0.1.0 → codevanta-0.1.1}/docs/phase2e.md +0 -0
  28. {codevanta-0.1.0 → codevanta-0.1.1}/docs/phase2f.md +0 -0
  29. {codevanta-0.1.0 → codevanta-0.1.1}/docs/phase2g.md +0 -0
  30. {codevanta-0.1.0 → codevanta-0.1.1}/docs/phase2h.md +0 -0
  31. {codevanta-0.1.0 → codevanta-0.1.1}/docs/phase2i.md +0 -0
  32. {codevanta-0.1.0 → codevanta-0.1.1}/docs/phase2j.md +0 -0
  33. {codevanta-0.1.0 → codevanta-0.1.1}/docs/phase2k.md +0 -0
  34. {codevanta-0.1.0 → codevanta-0.1.1}/docs/phase3.md +0 -0
  35. {codevanta-0.1.0 → codevanta-0.1.1}/docs/phase6.md +0 -0
  36. {codevanta-0.1.0 → codevanta-0.1.1}/docs/release-checklist.md +0 -0
  37. {codevanta-0.1.0 → codevanta-0.1.1}/docs/samples.md +0 -0
  38. {codevanta-0.1.0 → codevanta-0.1.1}/requirements.txt +0 -0
  39. {codevanta-0.1.0 → codevanta-0.1.1}/scripts/agent_commit.py +0 -0
  40. {codevanta-0.1.0 → codevanta-0.1.1}/scripts/bench.py +0 -0
  41. {codevanta-0.1.0 → codevanta-0.1.1}/scripts/bench_gate.py +0 -0
  42. {codevanta-0.1.0 → codevanta-0.1.1}/scripts/check_decompiler_backends.py +0 -0
  43. {codevanta-0.1.0 → codevanta-0.1.1}/scripts/fuzz_parsers.py +0 -0
  44. {codevanta-0.1.0 → codevanta-0.1.1}/scripts/install.ps1 +0 -0
  45. {codevanta-0.1.0 → codevanta-0.1.1}/scripts/install.sh +0 -0
  46. {codevanta-0.1.0 → codevanta-0.1.1}/scripts/make_samples.py +0 -0
  47. {codevanta-0.1.0 → codevanta-0.1.1}/scripts/report_bundle.py +0 -0
  48. {codevanta-0.1.0 → codevanta-0.1.1}/setup.cfg +0 -0
  49. {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta/__init__.py +0 -0
  50. {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta/analysis/__init__.py +0 -0
  51. {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta/analysis/binary_diff.py +0 -0
  52. {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta/analysis/callgraph.py +0 -0
  53. {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta/analysis/cfg.py +0 -0
  54. {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta/analysis/dataflow.py +0 -0
  55. {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta/analysis/debugger.py +0 -0
  56. {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta/analysis/debuginfo.py +0 -0
  57. {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta/analysis/decompile.py +0 -0
  58. {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta/analysis/decompilers/__init__.py +0 -0
  59. {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta/analysis/decompilers/angr_backend.py +0 -0
  60. {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta/analysis/decompilers/base.py +0 -0
  61. {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta/analysis/decompilers/ghidra_backend.py +0 -0
  62. {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta/analysis/dynamic.py +0 -0
  63. {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta/analysis/emulate.py +0 -0
  64. {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta/analysis/evidence_bundle.py +0 -0
  65. {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta/analysis/function_hash.py +0 -0
  66. {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta/analysis/graph_export.py +0 -0
  67. {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta/analysis/html_view.py +0 -0
  68. {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta/analysis/jump_tables.py +0 -0
  69. {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta/analysis/solver.py +0 -0
  70. {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta/analysis/symbolic.py +0 -0
  71. {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta/analysis/trace.py +0 -0
  72. {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta/analysis/type_propagation.py +0 -0
  73. {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta/analysis/type_recovery.py +0 -0
  74. {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta/analysis/vtables.py +0 -0
  75. {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta/analysis/xrefs.py +0 -0
  76. {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta/api/__init__.py +0 -0
  77. {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta/cli/__init__.py +0 -0
  78. {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta/core/__init__.py +0 -0
  79. {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta/core/disassembler.py +0 -0
  80. {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta/core/entropy.py +0 -0
  81. {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta/core/functions.py +0 -0
  82. {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta/core/loader.py +0 -0
  83. {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta/core/report.py +0 -0
  84. {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta/core/strings.py +0 -0
  85. {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta/evidence/__init__.py +0 -0
  86. {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta/evidence/confidence.py +0 -0
  87. {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta/evidence/models.py +0 -0
  88. {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta/evidence/provenance.py +0 -0
  89. {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta/gui/__init__.py +0 -0
  90. {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta/gui/layout.py +0 -0
  91. {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta/gui/server.py +0 -0
  92. {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta/ir/__init__.py +0 -0
  93. {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta/ir/adapters/__init__.py +0 -0
  94. {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta/ir/base.py +0 -0
  95. {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta/ir/instruction.py +0 -0
  96. {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta/mcp_server/__init__.py +0 -0
  97. {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta/plugins/__init__.py +0 -0
  98. {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta/setup/__init__.py +0 -0
  99. {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta/setup/apply.py +0 -0
  100. {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta/setup/clients.py +0 -0
  101. {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta/setup/plan.py +0 -0
  102. {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta/setup/verify.py +0 -0
  103. {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta/storage/__init__.py +0 -0
  104. {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta/storage/session.py +0 -0
  105. {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta.egg-info/dependency_links.txt +0 -0
  106. {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta.egg-info/entry_points.txt +0 -0
  107. {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta.egg-info/requires.txt +0 -0
  108. {codevanta-0.1.0 → codevanta-0.1.1}/src/codevanta.egg-info/top_level.txt +0 -0
  109. {codevanta-0.1.0 → codevanta-0.1.1}/tests/conftest.py +0 -0
  110. {codevanta-0.1.0 → codevanta-0.1.1}/tests/test_agent_commit.py +0 -0
  111. {codevanta-0.1.0 → codevanta-0.1.1}/tests/test_bench.py +0 -0
  112. {codevanta-0.1.0 → codevanta-0.1.1}/tests/test_bench_gate.py +0 -0
  113. {codevanta-0.1.0 → codevanta-0.1.1}/tests/test_binary_diff.py +0 -0
  114. {codevanta-0.1.0 → codevanta-0.1.1}/tests/test_callgraph.py +0 -0
  115. {codevanta-0.1.0 → codevanta-0.1.1}/tests/test_cfg.py +0 -0
  116. {codevanta-0.1.0 → codevanta-0.1.1}/tests/test_cfg_recursive.py +0 -0
  117. {codevanta-0.1.0 → codevanta-0.1.1}/tests/test_cli.py +0 -0
  118. {codevanta-0.1.0 → codevanta-0.1.1}/tests/test_cli_gui.py +0 -0
  119. {codevanta-0.1.0 → codevanta-0.1.1}/tests/test_cli_phase2.py +0 -0
  120. {codevanta-0.1.0 → codevanta-0.1.1}/tests/test_cli_phase2b.py +0 -0
  121. {codevanta-0.1.0 → codevanta-0.1.1}/tests/test_cli_phase2d.py +0 -0
  122. {codevanta-0.1.0 → codevanta-0.1.1}/tests/test_cli_phase2e.py +0 -0
  123. {codevanta-0.1.0 → codevanta-0.1.1}/tests/test_cli_phase2f.py +0 -0
  124. {codevanta-0.1.0 → codevanta-0.1.1}/tests/test_cli_phase2g.py +0 -0
  125. {codevanta-0.1.0 → codevanta-0.1.1}/tests/test_cli_phase2h.py +0 -0
  126. {codevanta-0.1.0 → codevanta-0.1.1}/tests/test_cli_phase2i.py +0 -0
  127. {codevanta-0.1.0 → codevanta-0.1.1}/tests/test_cli_phase2j.py +0 -0
  128. {codevanta-0.1.0 → codevanta-0.1.1}/tests/test_cli_phase2k.py +0 -0
  129. {codevanta-0.1.0 → codevanta-0.1.1}/tests/test_cli_phase3.py +0 -0
  130. {codevanta-0.1.0 → codevanta-0.1.1}/tests/test_cli_phase7.py +0 -0
  131. {codevanta-0.1.0 → codevanta-0.1.1}/tests/test_cli_trace.py +0 -0
  132. {codevanta-0.1.0 → codevanta-0.1.1}/tests/test_dataflow.py +0 -0
  133. {codevanta-0.1.0 → codevanta-0.1.1}/tests/test_debugger.py +0 -0
  134. {codevanta-0.1.0 → codevanta-0.1.1}/tests/test_debuginfo.py +0 -0
  135. {codevanta-0.1.0 → codevanta-0.1.1}/tests/test_decompile.py +0 -0
  136. {codevanta-0.1.0 → codevanta-0.1.1}/tests/test_decompile_backends.py +0 -0
  137. {codevanta-0.1.0 → codevanta-0.1.1}/tests/test_decompiler_parity.py +0 -0
  138. {codevanta-0.1.0 → codevanta-0.1.1}/tests/test_disassembler.py +0 -0
  139. {codevanta-0.1.0 → codevanta-0.1.1}/tests/test_dynamic.py +0 -0
  140. {codevanta-0.1.0 → codevanta-0.1.1}/tests/test_emulate.py +0 -0
  141. {codevanta-0.1.0 → codevanta-0.1.1}/tests/test_entropy.py +0 -0
  142. {codevanta-0.1.0 → codevanta-0.1.1}/tests/test_evidence.py +0 -0
  143. {codevanta-0.1.0 → codevanta-0.1.1}/tests/test_evidence_bundle.py +0 -0
  144. {codevanta-0.1.0 → codevanta-0.1.1}/tests/test_function_hash.py +0 -0
  145. {codevanta-0.1.0 → codevanta-0.1.1}/tests/test_functions.py +0 -0
  146. {codevanta-0.1.0 → codevanta-0.1.1}/tests/test_fuzz_parsers.py +0 -0
  147. {codevanta-0.1.0 → codevanta-0.1.1}/tests/test_graph_export.py +0 -0
  148. {codevanta-0.1.0 → codevanta-0.1.1}/tests/test_gui.py +0 -0
  149. {codevanta-0.1.0 → codevanta-0.1.1}/tests/test_html_view.py +0 -0
  150. {codevanta-0.1.0 → codevanta-0.1.1}/tests/test_jump_tables.py +0 -0
  151. {codevanta-0.1.0 → codevanta-0.1.1}/tests/test_loader.py +0 -0
  152. {codevanta-0.1.0 → codevanta-0.1.1}/tests/test_plugins.py +0 -0
  153. {codevanta-0.1.0 → codevanta-0.1.1}/tests/test_report_bundle.py +0 -0
  154. {codevanta-0.1.0 → codevanta-0.1.1}/tests/test_report_callgraph.py +0 -0
  155. {codevanta-0.1.0 → codevanta-0.1.1}/tests/test_report_phase2.py +0 -0
  156. {codevanta-0.1.0 → codevanta-0.1.1}/tests/test_samples.py +0 -0
  157. {codevanta-0.1.0 → codevanta-0.1.1}/tests/test_session.py +0 -0
  158. {codevanta-0.1.0 → codevanta-0.1.1}/tests/test_setup_plan.py +0 -0
  159. {codevanta-0.1.0 → codevanta-0.1.1}/tests/test_solver.py +0 -0
  160. {codevanta-0.1.0 → codevanta-0.1.1}/tests/test_strings.py +0 -0
  161. {codevanta-0.1.0 → codevanta-0.1.1}/tests/test_symbolic.py +0 -0
  162. {codevanta-0.1.0 → codevanta-0.1.1}/tests/test_symbolic_parity.py +0 -0
  163. {codevanta-0.1.0 → codevanta-0.1.1}/tests/test_tooling_config.py +0 -0
  164. {codevanta-0.1.0 → codevanta-0.1.1}/tests/test_trace.py +0 -0
  165. {codevanta-0.1.0 → codevanta-0.1.1}/tests/test_trace_samples.py +0 -0
  166. {codevanta-0.1.0 → codevanta-0.1.1}/tests/test_type_propagation.py +0 -0
  167. {codevanta-0.1.0 → codevanta-0.1.1}/tests/test_type_recovery.py +0 -0
  168. {codevanta-0.1.0 → codevanta-0.1.1}/tests/test_vtables.py +0 -0
  169. {codevanta-0.1.0 → codevanta-0.1.1}/tests/test_xrefs.py +0 -0
@@ -4,6 +4,25 @@ 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.1.1] - 2026-11-13
8
+
9
+ ### Added
10
+
11
+ - **Live gdb debug sessions** (`codevanta.analysis.debug_session` + `codevanta debug`
12
+ + MCP tool `codevanta_debug`): the layer now owns a real `gdb --interpreter=mi2`
13
+ process - launch, break-at (symbol or address), continue, step/next, register
14
+ reads, bounded memory reads, backtrace frames, verified quit - each result typed,
15
+ JSON-safe and evidence-backed (`gdb.mi2`, HIGH, one-run provenance). A missing gdb
16
+ is a typed `AnalysisError` with an install hint, never a traceback.
17
+ - MCP tool count is now 23; the MCP `INSTRUCTIONS` document `debug` as the one
18
+ explicit execution exception.
19
+
20
+ ### Changed
21
+
22
+ - README is fully de-hardcoded: real screenshots of the CLI, the loopback dashboard
23
+ and a 97-node call graph export; installation starts from PyPI; volatile counts
24
+ and Windows-only example paths removed; docs describe the actual CI gates.
25
+
7
26
  ## [Unreleased]
8
27
 
9
28
  ### Added
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: codevanta
3
- Version: 0.1.0
3
+ Version: 0.1.1
4
4
  Summary: CODEVANTA — Advanced Code Intelligence: AI-Powered Reverse Engineering & Binary Analysis Platform
5
5
  Author: kevindoni
6
6
  License-Expression: MIT
@@ -49,8 +49,20 @@ Dynamic: license-file
49
49
 
50
50
  # CODEVANTA
51
51
 
52
+ [![PyPI — version](https://img.shields.io/pypi/v/codevanta)](https://pypi.org/project/codevanta/)
53
+
52
54
  > **Advanced Code Intelligence** — Decode. Analyze. Understand.
53
55
 
56
+ <p align="center">
57
+ <img src="docs/assets/cli.png" width="840" alt="CODEVANTA CLI - real output of info, functions and xrefs against a committed PE sample"><br>
58
+ <em>CLI - info, functions, xrefs on a committed PE sample</em><br><br>
59
+ <img src="docs/assets/gui.png" width="840" alt="CODEVANTA read-only web dashboard served on loopback"><br>
60
+ <em>Read-only web dashboard (codevanta gui)</em><br><br>
61
+ <img src="docs/assets/callgraph.png" width="840" alt="Self-contained HTML call graph export with pan and zoom"><br>
62
+ <em>HTML call graph export - 97 nodes (codevanta callgraph --format html)</em>
63
+ </p>
64
+
65
+
54
66
  CODEVANTA is an AI-powered code intelligence, reverse engineering, and binary
55
67
  analysis platform. It helps engineers, security researchers, and analysts
56
68
  understand software faster — from source code to executables with missing
@@ -218,7 +230,7 @@ Phase 2 adds the first reverse-engineering views on top of the phase 1 engine:
218
230
  `codevanta_diff`, `codevanta_jump_table`, `codevanta_function_hash`,
219
231
  `codevanta_xrefs`, `codevanta_cfg`, `codevanta_callgraph`,
220
232
  `codevanta_session_save`, and `codevanta_session_list`, alongside the five
221
- phase 1 tools (fifteen in total). `codevanta_diff` takes `max_functions`,
233
+ phase 1 tools. `codevanta_diff` takes `max_functions`,
222
234
  `deep`, `semantic`, and `threshold`, so the phase 2j pairing pass is reachable
223
235
  from an agent without a separate `codevanta_similarity` call.
224
236
  - **`analyze` integration** (`core/report.py`) — the `codevanta analyze` JSON
@@ -267,10 +279,10 @@ tools. Phase 2i adds the `alignment`/`array_groups` layout hints on a struct
267
279
  suggestion, the `function_similarity`/`normalized_tokens` API, and the
268
280
  `codevanta_struct` MCP tool. Phase 2j adds the opt-in semantic pairing pass on the
269
281
  binary diff (`semantic=True`, `threshold` defaulting to `0.9`), the
270
- `codevanta_similarity` MCP tool (fifteen tools), and the `signed` mnemonic hint on
282
+ `codevanta_similarity` MCP tool, and the `signed` mnemonic hint on
271
283
  struct fields, reachable as `diff --semantic --threshold` and as the
272
284
  `codevanta struct` footer `signed:` line. Phase 2k adds the `deep` / `semantic` /
273
- `threshold` arguments to the `codevanta_diff` MCP tool (fifteen tools, no new
285
+ `threshold` arguments to the `codevanta_diff` MCP tool (no new
274
286
  registration), the semantic pass's cross-architecture guard — the pass is skipped
275
287
  with a warning naming both `BinaryInfo.architecture` tokens, which are compared
276
288
  after trimming whitespace and lower-casing only, so a hand-built `AMD64` does not
@@ -290,8 +302,17 @@ scope, confidence semantics, and limitations.
290
302
 
291
303
  ## Installation
292
304
 
305
+ **From PyPI** (recommended):
306
+
307
+ ```powershell
308
+ python -m pip install codevanta
309
+ ```
310
+
311
+ **From source** (development install with the dev extras):
312
+
293
313
  ```powershell
294
- cd D:\PALIKASIKU\CODEVANTA
314
+ git clone https://github.com/kevindoni/CODEVANTA.git
315
+ cd CODEVANTA
295
316
  python -m pip install -e ".[dev]"
296
317
  ```
297
318
 
@@ -307,47 +328,46 @@ installs, and the full setup/uninstall reference.
307
328
  ## Usage
308
329
 
309
330
  ```powershell
310
- codevanta info C:\Windows\System32\notepad.exe
311
- codevanta functions C:\Windows\System32\kernel32.dll --limit 8
312
- codevanta strings C:\Windows\System32\notepad.exe --min-length 8
313
- codevanta entropy C:\Windows\System32\notepad.exe --threshold 7.2
314
- codevanta disasm C:\Windows\System32\notepad.exe --count 40
315
- codevanta analyze samples\elf64_text.bin --output samples\report.json
331
+ codevanta info samples\pe64_text.bin
332
+ codevanta functions samples\pe64_text.bin --limit 8
333
+ codevanta strings samples\macho64_text.bin --min-length 8
334
+ codevanta entropy samples\pe64_text.bin --threshold 7.2
335
+ codevanta disasm samples\pe64_text.bin --count 40
336
+ codevanta analyze samples\elf64_text.bin --output report.json
316
337
 
317
338
  # Phase 2
318
- codevanta analyze C:\Windows\System32\notepad.exe --xrefs --cfg # report + xrefs + cfg
319
- codevanta analyze C:\Windows\System32\notepad.exe # phase 1 only
320
- codevanta analyze C:\Windows\System32\notepad.exe --xref-limit 200 --xrefs -o report.json
321
- codevanta xrefs C:\Windows\System32\notepad.exe --limit 40
322
- codevanta cfg C:\Windows\System32\notepad.exe --address 0x140001000
323
- codevanta cfg C:\Windows\System32\notepad.exe --address 0x140001000 --traversal recursive
324
- codevanta cfg C:\Windows\System32\notepad.exe --address 0x140001000 --traversal recursive --resolve-indirect
325
- codevanta jump-table C:\Windows\System32\notepad.exe --address 0x140003000
326
- codevanta jump-table C:\Windows\System32\notepad.exe --address 0x140003000 --entries 64 --json
327
- codevanta diff samples\v1.bin samples\v2.bin
328
- codevanta diff samples\v1.bin samples\v2.bin --max-functions 20000 --json
329
- codevanta diff samples\v1.bin samples\v2.bin --semantic
330
- codevanta diff samples\v1.bin samples\v2.bin --semantic --threshold 0.75 --json
331
- codevanta callgraph C:\Windows\System32\notepad.exe --format dot -o callgraph.dot
332
- codevanta callgraph C:\Windows\System32\notepad.exe --format graphml -o callgraph.graphml
333
- codevanta callgraph C:\Windows\System32\notepad.exe --format html -o callgraph.html
339
+ codevanta analyze samples\pe64_text.bin --xrefs --cfg # report + xrefs + cfg
340
+ codevanta analyze samples\pe64_text.bin # phase 1 only
341
+ codevanta analyze samples\pe64_text.bin --xref-limit 200 --xrefs -o report.json
342
+ codevanta xrefs samples\pe64_text.bin --limit 40
343
+ codevanta cfg samples\pe64_text.bin # entry point, linear traversal
344
+ codevanta cfg samples\pe64_text.bin --traversal recursive
345
+ codevanta cfg samples\pe64_text.bin --traversal recursive --resolve-indirect
346
+ codevanta jump-table samples\pe64_text.bin --address 0x140001000
347
+ codevanta jump-table samples\pe64_text.bin --address 0x140001000 --entries 64 --json
348
+ codevanta diff samples\pe64_text.bin samples\macho64_text.bin
349
+ codevanta diff samples\pe64_text.bin samples\macho64_text.bin --max-functions 20000 --json
350
+ codevanta diff samples\pe64_text.bin samples\macho64_text.bin --semantic
351
+ codevanta diff samples\pe64_text.bin samples\macho64_text.bin --semantic --threshold 0.75 --json
352
+ codevanta callgraph samples\pe64_text.bin --format dot -o callgraph.dot
353
+ codevanta callgraph samples\pe64_text.bin --format graphml -o callgraph.graphml
354
+ codevanta callgraph samples\pe64_text.bin --format html -o callgraph.html
334
355
  Invoke-Item callgraph.html # drag to pan, wheel to zoom, search labels, filter by kind
335
- codevanta analyze C:\Windows\System32\notepad.exe --callgraph -o report.json
336
- codevanta session save C:\Windows\System32\notepad.exe --notes "baseline triage"
356
+ codevanta analyze samples\pe64_text.bin --callgraph -o report.json
357
+ codevanta session save samples\pe64_text.bin --notes "baseline triage" # prints: session saved: <id>
337
358
  codevanta session list --limit 10
338
- codevanta session show 4f9c1a7b2d3e
339
- codevanta session annotate 4f9c1a7b2d3e 0x401000 "decrypts config with XOR 0x5a"
340
- codevanta session notes 4f9c1a7b2d3e
341
- codevanta struct C:\Windows\System32\notepad.exe --address 0x140001000
342
- codevanta struct samples\handle.bin --function process --include-stack --json
359
+ codevanta session show SESSION_ID # the id that `session save` printed
360
+ codevanta session annotate SESSION_ID 0x140001000 "decrypts config with XOR 0x5a"
361
+ codevanta session notes SESSION_ID
362
+ codevanta struct samples\pe64_text.bin --function codevanta_sample_main --include-stack --json
343
363
 
344
364
  # Phase 3
345
- codevanta decompile C:\Windows\System32\notepad.exe 0x1400019c0 --backend native
365
+ codevanta decompile samples\pe64_text.bin 0x140001000 --backend native
346
366
  codevanta decompile samples\pe64_text.bin --json
347
367
  codevanta decompile samples\pe64_text.bin --max-instructions 20 --output rendering.c
348
368
  codevanta emulate samples\pe64_text.bin # returns 42
349
369
  codevanta emulate samples\pe64_text.bin --set rdi=2 --mem 0x600000=48454c4c4f
350
- codevanta emulate C:\Windows\System32\notepad.exe --resolve-target # jmp/call [rip+..]
370
+ codevanta emulate samples\pe64_text.bin --resolve-target # jmp/call [rip+..]
351
371
 
352
372
  # Phase 5 — symbol-grade views and dynamic sessions
353
373
  codevanta dwarf samples\hello-dwarf # DWARF symbols + type layouts
@@ -375,8 +395,11 @@ hinted anything. The same data comes back from Python and JSON:
375
395
  ```python
376
396
  from codevanta.analysis.binary_diff import diff_binaries
377
397
 
378
- # Leftovers paired by normalized instruction-shape similarity (default 0.9)
379
- diff = diff_binaries("samples/v1.bin", "samples/v2.bin", semantic=True, threshold=0.9)
398
+ diff = diff_binaries("samples/pe64_text.bin", "samples/macho64_text.bin")
399
+ print(diff.identical, len(diff.functions_added), len(diff.functions_removed))
400
+ # With semantic=True, the leftovers left unpaired by address and name matching
401
+ # are additionally scored by normalized instruction-shape similarity
402
+ # (threshold defaults to 0.9) and reported in `functions_changed`.
380
403
  for delta in diff.functions_changed:
381
404
  print(hex(delta.address), delta.similarity) # None unless the pair was scored
382
405
  ```
@@ -479,7 +502,7 @@ codevanta gui --no-browser # print the URL and wait
479
502
 
480
503
  `codevanta gui` serves one self-contained dashboard page over a loopback-only,
481
504
  read-only HTTP server — no extra dependencies, no network access, and the
482
- analysed file is never executed or written. The page drives fourteen JSON routes
505
+ analysed file is never executed or written. The page drives these JSON routes
483
506
  (`/api/health`, `/api/info`, `/api/functions`, `/api/strings`, `/api/xrefs`,
484
507
  `/api/cfg`, `/api/struct`, `/api/callgraph`, `/api/diff`, `/api/decompile`,
485
508
  `/api/emulate`, `/api/symbolic`, `/api/session_save`, `/api/session_list`), each
@@ -521,7 +544,7 @@ Safety model: every run prints the exact file changes and a diff first; nothing
521
544
  is written without `--yes` (or an interactive confirmation); existing configs
522
545
  are backed up as `*.codevanta.bak`; re-running the same command is a no-op.
523
546
 
524
- MCP tools (twenty-two): `codevanta_info`, `codevanta_functions`,
547
+ MCP tools: `codevanta_info`, `codevanta_functions`,
525
548
  `codevanta_strings`, `codevanta_disasm`, `codevanta_analyze`,
526
549
  `codevanta_xrefs`, `codevanta_cfg`, `codevanta_callgraph`, `codevanta_diff`,
527
550
  `codevanta_jump_table`, `codevanta_function_hash`, `codevanta_similarity`,
@@ -612,12 +635,12 @@ plus smoke-tests the wheel on 3.13.
612
635
  - [Project specification](PROJECT_SPEC.md)
613
636
  - [Architecture](docs/architecture.md)
614
637
  - [API reference](docs/api.md) — every public Python entry point, the evidence
615
- contract, the fourteen dashboard routes, and the twenty-two MCP tools
638
+ contract, the dashboard routes, and the MCP tools
616
639
  - [Sample binaries](docs/samples.md) — the committed PE/Mach-O/ELF fixtures and
617
640
  how to regenerate them
618
641
  - [Contributor attribution](docs/attribution.md) — how agent commits are credited,
619
642
  and how to make an agent appear in GitHub's contributor graph
620
- - [Release checklist](docs/release-checklist.md) — the pending PyPI publisher,
643
+ - [Release checklist](docs/release-checklist.md) — the PyPI trusted publisher,
621
644
  the `pypi` environment, dry runs, tagging and CI re-runs (maintainers)
622
645
  - [Phase 2 — cross-references, CFGs, sessions](docs/phase2.md)
623
646
  - [Phase 2b — call graphs, graph export, session annotations](docs/phase2b.md)
@@ -642,11 +665,11 @@ from `src/`. A phase can be **delivered with named gaps** — those gaps are the
642
665
 
643
666
  | Phase | Delivered | Open |
644
667
  |-------|-----------|------|
645
- | **1 · Foundation** | ✅ PE / ELF / Mach-O (fat slices too) / DEX loaders — `core/loader.py:363-379` (`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: 20 commands (19 `@app.command()` + `mcp serve`) plus the `session` sub-app with 5 subcommands — `cli/main.py`<br>✅ MCP server exposing 22 tools — `mcp_server/server.py` (`build_server().list_tools()` returns 22)<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 |
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, 14 endpoints — `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 |
668
+ | **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 |
669
+ | **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
670
  | **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>✅ 29 emulation tests — `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/` |
649
- | **5 · Platform** | ✅ CI/CD with real gates — `ci.yml` runs 7 job runs (3 Python versions × `test`, plus `type-check` (mypy), `package` (wheel smoke test), `decompile-parity`, `ghidra-parity`) and `pyproject.toml` sets `fail_under = 85` coverage<br>✅ Release pipeline — `release.yml`: `build` → `publish-pypi` (trusted publishing) → `github-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** — publishing is wired but has never run: `git tag -l` is empty, so no `v*` tag has been cut |
671
+ | **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/` |
672
+ | **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
673
 
651
674
  ## Product principles
652
675
 
@@ -1,7 +1,19 @@
1
1
  # CODEVANTA
2
2
 
3
+ [![PyPI — version](https://img.shields.io/pypi/v/codevanta)](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 (fifteen in total). `codevanta_diff` takes `max_functions`,
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 (fifteen tools), and the `signed` mnemonic hint on
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 (fifteen tools, no new
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
- cd D:\PALIKASIKU\CODEVANTA
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 C:\Windows\System32\notepad.exe
262
- codevanta functions C:\Windows\System32\kernel32.dll --limit 8
263
- codevanta strings C:\Windows\System32\notepad.exe --min-length 8
264
- codevanta entropy C:\Windows\System32\notepad.exe --threshold 7.2
265
- codevanta disasm C:\Windows\System32\notepad.exe --count 40
266
- codevanta analyze samples\elf64_text.bin --output samples\report.json
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 C:\Windows\System32\notepad.exe --xrefs --cfg # report + xrefs + cfg
270
- codevanta analyze C:\Windows\System32\notepad.exe # phase 1 only
271
- codevanta analyze C:\Windows\System32\notepad.exe --xref-limit 200 --xrefs -o report.json
272
- codevanta xrefs C:\Windows\System32\notepad.exe --limit 40
273
- codevanta cfg C:\Windows\System32\notepad.exe --address 0x140001000
274
- codevanta cfg C:\Windows\System32\notepad.exe --address 0x140001000 --traversal recursive
275
- codevanta cfg C:\Windows\System32\notepad.exe --address 0x140001000 --traversal recursive --resolve-indirect
276
- codevanta jump-table C:\Windows\System32\notepad.exe --address 0x140003000
277
- codevanta jump-table C:\Windows\System32\notepad.exe --address 0x140003000 --entries 64 --json
278
- codevanta diff samples\v1.bin samples\v2.bin
279
- codevanta diff samples\v1.bin samples\v2.bin --max-functions 20000 --json
280
- codevanta diff samples\v1.bin samples\v2.bin --semantic
281
- codevanta diff samples\v1.bin samples\v2.bin --semantic --threshold 0.75 --json
282
- codevanta callgraph C:\Windows\System32\notepad.exe --format dot -o callgraph.dot
283
- codevanta callgraph C:\Windows\System32\notepad.exe --format graphml -o callgraph.graphml
284
- codevanta callgraph C:\Windows\System32\notepad.exe --format html -o callgraph.html
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 C:\Windows\System32\notepad.exe --callgraph -o report.json
287
- codevanta session save C:\Windows\System32\notepad.exe --notes "baseline triage"
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 4f9c1a7b2d3e
290
- codevanta session annotate 4f9c1a7b2d3e 0x401000 "decrypts config with XOR 0x5a"
291
- codevanta session notes 4f9c1a7b2d3e
292
- codevanta struct C:\Windows\System32\notepad.exe --address 0x140001000
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 C:\Windows\System32\notepad.exe 0x1400019c0 --backend native
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 C:\Windows\System32\notepad.exe --resolve-target # jmp/call [rip+..]
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
- # Leftovers paired by normalized instruction-shape similarity (default 0.9)
330
- diff = diff_binaries("samples/v1.bin", "samples/v2.bin", semantic=True, threshold=0.9)
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 fourteen JSON routes
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 (twenty-two): `codevanta_info`, `codevanta_functions`,
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 fourteen dashboard routes, and the twenty-two MCP tools
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 pending PyPI publisher,
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:363-379` (`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: 20 commands (19 `@app.command()` + `mcp serve`) plus the `session` sub-app with 5 subcommands — `cli/main.py`<br>✅ MCP server exposing 22 tools — `mcp_server/server.py` (`build_server().list_tools()` returns 22)<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 |
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, 14 endpoints — `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 |
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>✅ 29 emulation tests — `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/` |
600
- | **5 · Platform** | ✅ CI/CD with real gates — `ci.yml` runs 7 job runs (3 Python versions × `test`, plus `type-check` (mypy), `package` (wheel smoke test), `decompile-parity`, `ghidra-parity`) and `pyproject.toml` sets `fail_under = 85` coverage<br>✅ Release pipeline — `release.yml`: `build` → `publish-pypi` (trusted publishing) → `github-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** — publishing is wired but has never run: `git tag -l` is empty, so no `v*` tag has been cut |
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
@@ -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 (after the first release)
40
+ ## From PyPI
41
41
 
42
42
  ```powershell
43
- uv tool install codevanta # or: pipx install codevanta
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
- Until the first PyPI release is published, use the GitHub one-liners above.
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.1.0"
7
+ version = "0.1.1"
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"