roam-code 13.0__tar.gz → 13.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 (1403) hide show
  1. roam_code-13.1/PKG-INFO +2145 -0
  2. roam_code-13.1/README.md +2084 -0
  3. roam_code-13.1/pyproject.toml +172 -0
  4. roam_code-13.1/src/roam/analysis/effects.py +656 -0
  5. roam_code-13.1/src/roam/analysis/taint.py +765 -0
  6. roam_code-13.1/src/roam/attest/__init__.py +19 -0
  7. roam_code-13.1/src/roam/attest/cga.py +643 -0
  8. roam_code-13.1/src/roam/attest/emit_vsa.py +376 -0
  9. roam_code-13.1/src/roam/attest/vsa.py +426 -0
  10. roam_code-13.1/src/roam/catalog/_shared.py +329 -0
  11. roam_code-13.1/src/roam/catalog/clones_cross_layer.py +456 -0
  12. roam_code-13.1/src/roam/catalog/clones_rename_invariant.py +418 -0
  13. roam_code-13.1/src/roam/catalog/detectors.py +4851 -0
  14. roam_code-13.1/src/roam/catalog/fixes.py +90 -0
  15. roam_code-13.1/src/roam/catalog/parallel_hierarchy.py +344 -0
  16. roam_code-13.1/src/roam/catalog/python_idioms.py +1650 -0
  17. roam_code-13.1/src/roam/catalog/registry.py +305 -0
  18. roam_code-13.1/src/roam/catalog/smells.py +3102 -0
  19. roam_code-13.1/src/roam/catalog/tasks.py +1521 -0
  20. roam_code-13.1/src/roam/catalog/type_switch.py +493 -0
  21. roam_code-13.1/src/roam/catalog/versions.py +67 -0
  22. roam_code-13.1/src/roam/cli.py +1508 -0
  23. roam_code-13.1/src/roam/commands/_command_utils.py +39 -0
  24. roam_code-13.1/src/roam/commands/_yaml_loader.py +399 -0
  25. roam_code-13.1/src/roam/commands/actor_helpers.py +228 -0
  26. roam_code-13.1/src/roam/commands/changed_files.py +185 -0
  27. roam_code-13.1/src/roam/commands/cmd_adversarial.py +758 -0
  28. roam_code-13.1/src/roam/commands/cmd_alerts.py +1227 -0
  29. roam_code-13.1/src/roam/commands/cmd_annotate.py +262 -0
  30. roam_code-13.1/src/roam/commands/cmd_article_12_check.py +423 -0
  31. roam_code-13.1/src/roam/commands/cmd_audit_trail_conformance.py +616 -0
  32. roam_code-13.1/src/roam/commands/cmd_audit_trail_verify.py +383 -0
  33. roam_code-13.1/src/roam/commands/cmd_auth_gaps.py +1592 -0
  34. roam_code-13.1/src/roam/commands/cmd_budget.py +511 -0
  35. roam_code-13.1/src/roam/commands/cmd_bus_factor.py +928 -0
  36. roam_code-13.1/src/roam/commands/cmd_causal_graph.py +326 -0
  37. roam_code-13.1/src/roam/commands/cmd_cga.py +548 -0
  38. roam_code-13.1/src/roam/commands/cmd_check_rules.py +706 -0
  39. roam_code-13.1/src/roam/commands/cmd_ci_setup.py +885 -0
  40. roam_code-13.1/src/roam/commands/cmd_clones.py +521 -0
  41. roam_code-13.1/src/roam/commands/cmd_complexity.py +768 -0
  42. roam_code-13.1/src/roam/commands/cmd_context.py +1334 -0
  43. roam_code-13.1/src/roam/commands/cmd_conventions.py +1367 -0
  44. roam_code-13.1/src/roam/commands/cmd_coverage_gaps.py +816 -0
  45. roam_code-13.1/src/roam/commands/cmd_critique.py +874 -0
  46. roam_code-13.1/src/roam/commands/cmd_dark_matter.py +343 -0
  47. roam_code-13.1/src/roam/commands/cmd_dead.py +2593 -0
  48. roam_code-13.1/src/roam/commands/cmd_doctor.py +2067 -0
  49. roam_code-13.1/src/roam/commands/cmd_duplicates.py +981 -0
  50. roam_code-13.1/src/roam/commands/cmd_endpoints.py +892 -0
  51. roam_code-13.1/src/roam/commands/cmd_eval_retrieve.py +355 -0
  52. roam_code-13.1/src/roam/commands/cmd_evidence_diff.py +707 -0
  53. roam_code-13.1/src/roam/commands/cmd_evidence_doctor.py +1080 -0
  54. roam_code-13.1/src/roam/commands/cmd_evidence_oscal.py +571 -0
  55. roam_code-13.1/src/roam/commands/cmd_fan.py +738 -0
  56. roam_code-13.1/src/roam/commands/cmd_findings.py +398 -0
  57. roam_code-13.1/src/roam/commands/cmd_fingerprint.py +642 -0
  58. roam_code-13.1/src/roam/commands/cmd_fn_coupling.py +483 -0
  59. roam_code-13.1/src/roam/commands/cmd_guard.py +470 -0
  60. roam_code-13.1/src/roam/commands/cmd_health.py +2052 -0
  61. roam_code-13.1/src/roam/commands/cmd_hotspots.py +936 -0
  62. roam_code-13.1/src/roam/commands/cmd_hover.py +148 -0
  63. roam_code-13.1/src/roam/commands/cmd_idempotency.py +211 -0
  64. roam_code-13.1/src/roam/commands/cmd_impact.py +650 -0
  65. roam_code-13.1/src/roam/commands/cmd_init.py +376 -0
  66. roam_code-13.1/src/roam/commands/cmd_invariants.py +340 -0
  67. roam_code-13.1/src/roam/commands/cmd_laws.py +674 -0
  68. roam_code-13.1/src/roam/commands/cmd_lease.py +697 -0
  69. roam_code-13.1/src/roam/commands/cmd_llm_smells.py +1141 -0
  70. roam_code-13.1/src/roam/commands/cmd_math.py +594 -0
  71. roam_code-13.1/src/roam/commands/cmd_migration_plan.py +334 -0
  72. roam_code-13.1/src/roam/commands/cmd_migration_safety.py +766 -0
  73. roam_code-13.1/src/roam/commands/cmd_missing_index.py +1603 -0
  74. roam_code-13.1/src/roam/commands/cmd_mode.py +444 -0
  75. roam_code-13.1/src/roam/commands/cmd_n1.py +1801 -0
  76. roam_code-13.1/src/roam/commands/cmd_next.py +680 -0
  77. roam_code-13.1/src/roam/commands/cmd_oracle.py +707 -0
  78. roam_code-13.1/src/roam/commands/cmd_orphan_imports.py +970 -0
  79. roam_code-13.1/src/roam/commands/cmd_orphan_routes.py +761 -0
  80. roam_code-13.1/src/roam/commands/cmd_over_fetch.py +1500 -0
  81. roam_code-13.1/src/roam/commands/cmd_owner.py +375 -0
  82. roam_code-13.1/src/roam/commands/cmd_path_coverage.py +622 -0
  83. roam_code-13.1/src/roam/commands/cmd_patterns.py +780 -0
  84. roam_code-13.1/src/roam/commands/cmd_permit.py +791 -0
  85. roam_code-13.1/src/roam/commands/cmd_plan_refactor.py +484 -0
  86. roam_code-13.1/src/roam/commands/cmd_pr_bundle.py +2947 -0
  87. roam_code-13.1/src/roam/commands/cmd_pr_replay.py +3717 -0
  88. roam_code-13.1/src/roam/commands/cmd_pr_risk.py +1420 -0
  89. roam_code-13.1/src/roam/commands/cmd_preflight.py +962 -0
  90. roam_code-13.1/src/roam/commands/cmd_py_types.py +315 -0
  91. roam_code-13.1/src/roam/commands/cmd_pytest_fixtures.py +391 -0
  92. roam_code-13.1/src/roam/commands/cmd_risk.py +622 -0
  93. roam_code-13.1/src/roam/commands/cmd_rules_validate.py +492 -0
  94. roam_code-13.1/src/roam/commands/cmd_secrets.py +716 -0
  95. roam_code-13.1/src/roam/commands/cmd_side_effects.py +235 -0
  96. roam_code-13.1/src/roam/commands/cmd_smells.py +722 -0
  97. roam_code-13.1/src/roam/commands/cmd_stale_refs.py +3644 -0
  98. roam_code-13.1/src/roam/commands/cmd_suppress.py +299 -0
  99. roam_code-13.1/src/roam/commands/cmd_surface.py +238 -0
  100. roam_code-13.1/src/roam/commands/cmd_taint.py +638 -0
  101. roam_code-13.1/src/roam/commands/cmd_test_gaps.py +610 -0
  102. roam_code-13.1/src/roam/commands/cmd_tx_boundaries.py +313 -0
  103. roam_code-13.1/src/roam/commands/cmd_understand.py +1297 -0
  104. roam_code-13.1/src/roam/commands/cmd_uses.py +331 -0
  105. roam_code-13.1/src/roam/commands/cmd_verify_imports.py +569 -0
  106. roam_code-13.1/src/roam/commands/cmd_vibe_check.py +2135 -0
  107. roam_code-13.1/src/roam/commands/cmd_vuln_reach.py +311 -0
  108. roam_code-13.1/src/roam/commands/cmd_vulns.py +761 -0
  109. roam_code-13.1/src/roam/commands/conventions_helper.py +463 -0
  110. roam_code-13.1/src/roam/commands/finding_suppress.py +468 -0
  111. roam_code-13.1/src/roam/commands/git_helpers.py +105 -0
  112. roam_code-13.1/src/roam/commands/metrics_history.py +322 -0
  113. roam_code-13.1/src/roam/commands/smells_suppress.py +589 -0
  114. roam_code-13.1/src/roam/commands/suppression.py +499 -0
  115. roam_code-13.1/src/roam/competitor_site_data.py +2167 -0
  116. roam_code-13.1/src/roam/config.py +266 -0
  117. roam_code-13.1/src/roam/constitution/loader.py +1024 -0
  118. roam_code-13.1/src/roam/critique/__init__.py +31 -0
  119. roam_code-13.1/src/roam/critique/aggregator.py +146 -0
  120. roam_code-13.1/src/roam/critique/checks.py +596 -0
  121. roam_code-13.1/src/roam/db/connection.py +668 -0
  122. roam_code-13.1/src/roam/db/edge_kinds.py +73 -0
  123. roam_code-13.1/src/roam/db/findings.py +291 -0
  124. roam_code-13.1/src/roam/db/fs_detect.py +146 -0
  125. roam_code-13.1/src/roam/db/schema.py +462 -0
  126. roam_code-13.1/src/roam/evidence/__init__.py +156 -0
  127. roam_code-13.1/src/roam/evidence/_vocabulary.py +660 -0
  128. roam_code-13.1/src/roam/evidence/actor_trust.py +232 -0
  129. roam_code-13.1/src/roam/evidence/approval.py +170 -0
  130. roam_code-13.1/src/roam/evidence/artifact.py +158 -0
  131. roam_code-13.1/src/roam/evidence/banner.py +207 -0
  132. roam_code-13.1/src/roam/evidence/change_evidence.py +1634 -0
  133. roam_code-13.1/src/roam/evidence/collector.py +3620 -0
  134. roam_code-13.1/src/roam/evidence/control_mapping_vocab.py +170 -0
  135. roam_code-13.1/src/roam/evidence/env_refs.py +165 -0
  136. roam_code-13.1/src/roam/evidence/feedback.py +463 -0
  137. roam_code-13.1/src/roam/evidence/github_reviews.py +410 -0
  138. roam_code-13.1/src/roam/evidence/link.py +55 -0
  139. roam_code-13.1/src/roam/evidence/mcp_receipt.py +174 -0
  140. roam_code-13.1/src/roam/evidence/oscal.py +1392 -0
  141. roam_code-13.1/src/roam/evidence/policy.py +308 -0
  142. roam_code-13.1/src/roam/evidence/profiles.py +540 -0
  143. roam_code-13.1/src/roam/evidence/provenance.py +88 -0
  144. roam_code-13.1/src/roam/evidence/refs.py +234 -0
  145. roam_code-13.1/src/roam/evidence/subject.py +61 -0
  146. roam_code-13.1/src/roam/fleet/adapters.py +107 -0
  147. roam_code-13.1/src/roam/graph/clone_detect.py +1083 -0
  148. roam_code-13.1/src/roam/graph/pagerank.py +248 -0
  149. roam_code-13.1/src/roam/index/_containing_symbol.py +113 -0
  150. roam_code-13.1/src/roam/index/django_post.py +425 -0
  151. roam_code-13.1/src/roam/index/git_stats.py +766 -0
  152. roam_code-13.1/src/roam/index/indexer.py +2032 -0
  153. roam_code-13.1/src/roam/index/laravel_post.py +839 -0
  154. roam_code-13.1/src/roam/index/manifest.py +573 -0
  155. roam_code-13.1/src/roam/index/registry_dispatch.py +372 -0
  156. roam_code-13.1/src/roam/index/relations.py +1092 -0
  157. roam_code-13.1/src/roam/languages/extractor_schema.py +261 -0
  158. roam_code-13.1/src/roam/languages/extractors/__init__.py +34 -0
  159. roam_code-13.1/src/roam/languages/query_engine.py +594 -0
  160. roam_code-13.1/src/roam/languages/registry.py +422 -0
  161. roam_code-13.1/src/roam/laws/miner.py +632 -0
  162. roam_code-13.1/src/roam/leases/store.py +530 -0
  163. roam_code-13.1/src/roam/mcp-server-card.json +156 -0
  164. roam_code-13.1/src/roam/mcp_extras/preflight.py +197 -0
  165. roam_code-13.1/src/roam/mcp_server.py +14989 -0
  166. roam_code-13.1/src/roam/modes/policy.py +428 -0
  167. roam_code-13.1/src/roam/output/_severity.py +563 -0
  168. roam_code-13.1/src/roam/output/confidence.py +368 -0
  169. roam_code-13.1/src/roam/output/file_role_hints.py +107 -0
  170. roam_code-13.1/src/roam/output/formatter.py +1230 -0
  171. roam_code-13.1/src/roam/output/metric_definitions.py +199 -0
  172. roam_code-13.1/src/roam/output/risk.py +193 -0
  173. roam_code-13.1/src/roam/output/sarif.py +1635 -0
  174. roam_code-13.1/src/roam/permits/__init__.py +62 -0
  175. roam_code-13.1/src/roam/permits/store.py +488 -0
  176. roam_code-13.1/src/roam/plugins/__init__.py +308 -0
  177. roam_code-13.1/src/roam/plugins/registry.py +496 -0
  178. roam_code-13.1/src/roam/policy/suppression_v2.py +356 -0
  179. roam_code-13.1/src/roam/retrieve/learned_ranker.py +261 -0
  180. roam_code-13.1/src/roam/retrieve/rerank.py +818 -0
  181. roam_code-13.1/src/roam/retrieve/seeds.py +566 -0
  182. roam_code-13.1/src/roam/retrieve/semantic.py +264 -0
  183. roam_code-13.1/src/roam/rules/builtin.py +616 -0
  184. roam_code-13.1/src/roam/rules/dataflow.py +535 -0
  185. roam_code-13.1/src/roam/rules/engine.py +1418 -0
  186. roam_code-13.1/src/roam/runs/helpers.py +240 -0
  187. roam_code-13.1/src/roam/runs/ledger.py +539 -0
  188. roam_code-13.1/src/roam/search/index_embeddings.py +819 -0
  189. roam_code-13.1/src/roam/search/tfidf.py +367 -0
  190. roam_code-13.1/src/roam/security/redact.py +135 -0
  191. roam_code-13.1/src/roam/security/taint_engine.py +639 -0
  192. roam_code-13.1/src/roam/security/taint_rules/__init__.py +22 -0
  193. roam_code-13.1/src/roam/security/taint_rules/api_error_leak.yaml +29 -0
  194. roam_code-13.1/src/roam/security/taint_rules/java_deserialization.yaml +69 -0
  195. roam_code-13.1/src/roam/security/taint_rules/java_fileupload_path_traversal.yaml +29 -0
  196. roam_code-13.1/src/roam/security/taint_rules/java_sqli.yaml +59 -0
  197. roam_code-13.1/src/roam/security/taint_rules/js_insecure_jwt_decode.yaml +24 -0
  198. roam_code-13.1/src/roam/security/taint_rules/js_localstorage_secrets.yaml +26 -0
  199. roam_code-13.1/src/roam/security/taint_rules/js_prototype_pollution.yaml +31 -0
  200. roam_code-13.1/src/roam/security/taint_rules/js_ssrf.yaml +22 -0
  201. roam_code-13.1/src/roam/security/taint_rules/js_xss.yaml +24 -0
  202. roam_code-13.1/src/roam/security/taint_rules/php_command_injection.yaml +26 -0
  203. roam_code-13.1/src/roam/security/taint_rules/php_laravel_open_redirect.yaml +27 -0
  204. roam_code-13.1/src/roam/security/taint_rules/php_laravel_sqli.yaml +34 -0
  205. roam_code-13.1/src/roam/security/taint_rules/php_laravel_xss.yaml +31 -0
  206. roam_code-13.1/src/roam/security/taint_rules/php_path_traversal.yaml +33 -0
  207. roam_code-13.1/src/roam/security/taint_rules/python_basic.yaml +26 -0
  208. roam_code-13.1/src/roam/security/taint_rules/python_deserialization.yaml +35 -0
  209. roam_code-13.1/src/roam/security/taint_rules/python_path_traversal.yaml +23 -0
  210. roam_code-13.1/src/roam/security/taint_rules/python_socketio_remote_source.yaml +34 -0
  211. roam_code-13.1/src/roam/security/taint_rules/python_sqli.yaml +22 -0
  212. roam_code-13.1/src/roam/security/taint_rules/python_ssti.yaml +33 -0
  213. roam_code-13.1/src/roam/security/taint_rules/python_urllib_open_redirect.yaml +31 -0
  214. roam_code-13.1/src/roam/security/taint_rules/vue_v_html.yaml +27 -0
  215. roam_code-13.1/src/roam/surface_counts.py +265 -0
  216. roam_code-13.1/src/roam/templates/audit_report/__init__.py +18 -0
  217. roam_code-13.1/src/roam/templates/audit_report/control-mapping.yaml +771 -0
  218. roam_code-13.1/src/roam/templates/ci/Jenkinsfile +186 -0
  219. roam_code-13.1/src/roam/templates/ci/azure-pipelines.yml +162 -0
  220. roam_code-13.1/src/roam/templates/ci/bitbucket-pipelines.yml +179 -0
  221. roam_code-13.1/src/roam/templates/ci/gitlab-ci.yml +138 -0
  222. roam_code-13.1/src/roam/templates/ci/slsa-src-l3.yml +107 -0
  223. roam_code-13.1/src/roam/world_model/causal_graph.py +750 -0
  224. roam_code-13.1/src/roam/world_model/side_effects.py +573 -0
  225. roam_code-13.1/src/roam/world_model/tx_boundaries.py +759 -0
  226. roam_code-13.1/src/roam_code.egg-info/PKG-INFO +2145 -0
  227. roam_code-13.1/src/roam_code.egg-info/SOURCES.txt +1144 -0
  228. roam_code-13.1/src/roam_code.egg-info/requires.txt +36 -0
  229. roam_code-13.1/tests/test_actor_refs_provenance.py +386 -0
  230. roam_code-13.1/tests/test_actor_trust.py +417 -0
  231. roam_code-13.1/tests/test_adversarial.py +645 -0
  232. roam_code-13.1/tests/test_affected.py +329 -0
  233. roam_code-13.1/tests/test_agent_plan_context.py +101 -0
  234. roam_code-13.1/tests/test_agents_md.py +248 -0
  235. roam_code-13.1/tests/test_alerts_cmd.py +597 -0
  236. roam_code-13.1/tests/test_alias_deprecation.py +298 -0
  237. roam_code-13.1/tests/test_annotations.py +849 -0
  238. roam_code-13.1/tests/test_approvals_provenance.py +283 -0
  239. roam_code-13.1/tests/test_atomic_writes.py +274 -0
  240. roam_code-13.1/tests/test_attest_vsa.py +1068 -0
  241. roam_code-13.1/tests/test_authority_refs_provenance.py +426 -0
  242. roam_code-13.1/tests/test_authority_refs_source.py +249 -0
  243. roam_code-13.1/tests/test_authority_run_ledger_corroboration.py +345 -0
  244. roam_code-13.1/tests/test_auto_count_script.py +248 -0
  245. roam_code-13.1/tests/test_batch_mcp.py +889 -0
  246. roam_code-13.1/tests/test_budget_coverage_survey.py +503 -0
  247. roam_code-13.1/tests/test_caller_metric_definition.py +302 -0
  248. roam_code-13.1/tests/test_canonical_demo_fixture.py +265 -0
  249. roam_code-13.1/tests/test_catalog_registry.py +430 -0
  250. roam_code-13.1/tests/test_catalog_shared.py +381 -0
  251. roam_code-13.1/tests/test_causal_graph.py +311 -0
  252. roam_code-13.1/tests/test_changed_files_none_guard.py +33 -0
  253. roam_code-13.1/tests/test_check_rules.py +986 -0
  254. roam_code-13.1/tests/test_ci_gate_eval.py +91 -0
  255. roam_code-13.1/tests/test_ci_sarif_guard.py +137 -0
  256. roam_code-13.1/tests/test_ci_setup.py +412 -0
  257. roam_code-13.1/tests/test_cli_contract.py +455 -0
  258. roam_code-13.1/tests/test_cli_deprecated_commands_schema.py +211 -0
  259. roam_code-13.1/tests/test_closure.py +210 -0
  260. roam_code-13.1/tests/test_cloud_sync_detection.py +323 -0
  261. roam_code-13.1/tests/test_cmd_budget_warnings_out.py +183 -0
  262. roam_code-13.1/tests/test_cmd_check_rules_warnings_out.py +302 -0
  263. roam_code-13.1/tests/test_cmd_findings.py +295 -0
  264. roam_code-13.1/tests/test_cmd_permit_persist.py +488 -0
  265. roam_code-13.1/tests/test_cmd_permit_persist_redteam.py +1026 -0
  266. roam_code-13.1/tests/test_commands_architecture.py +839 -0
  267. roam_code-13.1/tests/test_commands_exploration.py +922 -0
  268. roam_code-13.1/tests/test_commands_health.py +683 -0
  269. roam_code-13.1/tests/test_commands_refactoring.py +493 -0
  270. roam_code-13.1/tests/test_commands_workflow.py +766 -0
  271. roam_code-13.1/tests/test_compat_sweep.py +116 -0
  272. roam_code-13.1/tests/test_confidence_triples.py +1065 -0
  273. roam_code-13.1/tests/test_constitution.py +539 -0
  274. roam_code-13.1/tests/test_conventions_consolidation.py +553 -0
  275. roam_code-13.1/tests/test_count_drift_hook.py +80 -0
  276. roam_code-13.1/tests/test_count_drift_no_overlap.py +147 -0
  277. roam_code-13.1/tests/test_critique.py +908 -0
  278. roam_code-13.1/tests/test_dashboard.py +312 -0
  279. roam_code-13.1/tests/test_dataflow_dead.py +527 -0
  280. roam_code-13.1/tests/test_db_tuning.py +266 -0
  281. roam_code-13.1/tests/test_dead_aging.py +592 -0
  282. roam_code-13.1/tests/test_dead_mcp_seeding.py +296 -0
  283. roam_code-13.1/tests/test_decorator_registry_parity.py +148 -0
  284. roam_code-13.1/tests/test_demo_fixtures.py +234 -0
  285. roam_code-13.1/tests/test_destructive_tools_derived.py +123 -0
  286. roam_code-13.1/tests/test_detail_semantics.py +335 -0
  287. roam_code-13.1/tests/test_detector_registry.py +210 -0
  288. roam_code-13.1/tests/test_dev_profile.py +858 -0
  289. roam_code-13.1/tests/test_doc_consistency.py +704 -0
  290. roam_code-13.1/tests/test_doc_hygiene_ci_gate.py +214 -0
  291. roam_code-13.1/tests/test_doc_link_anchors.py +91 -0
  292. roam_code-13.1/tests/test_doctor.py +922 -0
  293. roam_code-13.1/tests/test_doctor_ci_workflow_drift.py +283 -0
  294. roam_code-13.1/tests/test_dogfood_dedup_check.py +55 -0
  295. roam_code-13.1/tests/test_eight_questions_audit.py +553 -0
  296. roam_code-13.1/tests/test_env_refs_helper.py +284 -0
  297. roam_code-13.1/tests/test_evidence_banner.py +235 -0
  298. roam_code-13.1/tests/test_evidence_collector.py +1866 -0
  299. roam_code-13.1/tests/test_evidence_diff_cmd.py +465 -0
  300. roam_code-13.1/tests/test_evidence_doctor.py +660 -0
  301. roam_code-13.1/tests/test_evidence_feedback.py +506 -0
  302. roam_code-13.1/tests/test_evidence_limitations.py +370 -0
  303. roam_code-13.1/tests/test_evidence_oscal.py +466 -0
  304. roam_code-13.1/tests/test_evidence_oscal_ar.py +692 -0
  305. roam_code-13.1/tests/test_evidence_packet_size.py +426 -0
  306. roam_code-13.1/tests/test_evidence_policy.py +380 -0
  307. roam_code-13.1/tests/test_evidence_pr_replay.py +2268 -0
  308. roam_code-13.1/tests/test_evidence_profiles.py +607 -0
  309. roam_code-13.1/tests/test_evidence_provenance.py +145 -0
  310. roam_code-13.1/tests/test_evidence_redaction_snapshots.py +740 -0
  311. roam_code-13.1/tests/test_evidence_schema_migration.py +570 -0
  312. roam_code-13.1/tests/test_evidence_v0.py +1433 -0
  313. roam_code-13.1/tests/test_find_project_root_worktree.py +113 -0
  314. roam_code-13.1/tests/test_findings_audit_trail_conformance.py +763 -0
  315. roam_code-13.1/tests/test_findings_audit_trail_verify.py +552 -0
  316. roam_code-13.1/tests/test_findings_auth_gaps.py +472 -0
  317. roam_code-13.1/tests/test_findings_bus_factor.py +753 -0
  318. roam_code-13.1/tests/test_findings_clones.py +754 -0
  319. roam_code-13.1/tests/test_findings_complexity.py +398 -0
  320. roam_code-13.1/tests/test_findings_conventions.py +775 -0
  321. roam_code-13.1/tests/test_findings_critique.py +791 -0
  322. roam_code-13.1/tests/test_findings_dark_matter.py +654 -0
  323. roam_code-13.1/tests/test_findings_dead.py +293 -0
  324. roam_code-13.1/tests/test_findings_doctor.py +437 -0
  325. roam_code-13.1/tests/test_findings_duplicates.py +892 -0
  326. roam_code-13.1/tests/test_findings_fan.py +619 -0
  327. roam_code-13.1/tests/test_findings_fingerprint.py +557 -0
  328. roam_code-13.1/tests/test_findings_health.py +554 -0
  329. roam_code-13.1/tests/test_findings_hotspots.py +453 -0
  330. roam_code-13.1/tests/test_findings_laws.py +436 -0
  331. roam_code-13.1/tests/test_findings_missing_index.py +549 -0
  332. roam_code-13.1/tests/test_findings_n1.py +585 -0
  333. roam_code-13.1/tests/test_findings_orphan_imports.py +477 -0
  334. roam_code-13.1/tests/test_findings_over_fetch.py +683 -0
  335. roam_code-13.1/tests/test_findings_pr_risk.py +915 -0
  336. roam_code-13.1/tests/test_findings_registry.py +313 -0
  337. roam_code-13.1/tests/test_findings_smells.py +747 -0
  338. roam_code-13.1/tests/test_findings_taint.py +320 -0
  339. roam_code-13.1/tests/test_findings_vibe_check.py +743 -0
  340. roam_code-13.1/tests/test_findings_vulns.py +473 -0
  341. roam_code-13.1/tests/test_formatter_preserved_list_fields.py +177 -0
  342. roam_code-13.1/tests/test_fts5_docstring.py +248 -0
  343. roam_code-13.1/tests/test_git_stats_skip.py +243 -0
  344. roam_code-13.1/tests/test_github_reviews_parser.py +468 -0
  345. roam_code-13.1/tests/test_guard.py +57 -0
  346. roam_code-13.1/tests/test_hostile_markdown_inputs.py +818 -0
  347. roam_code-13.1/tests/test_ignore_findings_warnings_out.py +226 -0
  348. roam_code-13.1/tests/test_impact_bounded.py +285 -0
  349. roam_code-13.1/tests/test_index_import_verification.py +472 -0
  350. roam_code-13.1/tests/test_index_step_manifest.py +364 -0
  351. roam_code-13.1/tests/test_install_check.py +256 -0
  352. roam_code-13.1/tests/test_is_excluded_path_none_guard.py +39 -0
  353. roam_code-13.1/tests/test_is_test_path.py +323 -0
  354. roam_code-13.1/tests/test_json_contracts.py +602 -0
  355. roam_code-13.1/tests/test_language_corpus.py +245 -0
  356. roam_code-13.1/tests/test_languages.py +2282 -0
  357. roam_code-13.1/tests/test_laravel_dead_idioms.py +1235 -0
  358. roam_code-13.1/tests/test_law4_anchoring.py +269 -0
  359. roam_code-13.1/tests/test_law4_lint.py +546 -0
  360. roam_code-13.1/tests/test_law4_residual.py +304 -0
  361. roam_code-13.1/tests/test_law4_stragglers.py +274 -0
  362. roam_code-13.1/tests/test_laws_mining.py +693 -0
  363. roam_code-13.1/tests/test_lease_system.py +553 -0
  364. roam_code-13.1/tests/test_llm_smells.py +633 -0
  365. roam_code-13.1/tests/test_load_suppressions_warnings_out.py +262 -0
  366. roam_code-13.1/tests/test_load_yaml_with_warnings.py +624 -0
  367. roam_code-13.1/tests/test_math.py +2068 -0
  368. roam_code-13.1/tests/test_mcp_W303_wrappers.py +321 -0
  369. roam_code-13.1/tests/test_mcp_W304_wrappers.py +424 -0
  370. roam_code-13.1/tests/test_mcp_W305_wrappers.py +392 -0
  371. roam_code-13.1/tests/test_mcp_W306_wrappers.py +508 -0
  372. roam_code-13.1/tests/test_mcp_architecture_wrappers.py +363 -0
  373. roam_code-13.1/tests/test_mcp_cold_start_guard.py +390 -0
  374. roam_code-13.1/tests/test_mcp_decision_receipt.py +219 -0
  375. roam_code-13.1/tests/test_mcp_exploration_wrappers.py +303 -0
  376. roam_code-13.1/tests/test_mcp_extras.py +370 -0
  377. roam_code-13.1/tests/test_mcp_health_wrappers.py +428 -0
  378. roam_code-13.1/tests/test_mcp_param_aliases_input_path.py +470 -0
  379. roam_code-13.1/tests/test_mcp_param_names.py +1026 -0
  380. roam_code-13.1/tests/test_mcp_pattern1_variant_b.py +465 -0
  381. roam_code-13.1/tests/test_mcp_receipt_emitter.py +439 -0
  382. roam_code-13.1/tests/test_mcp_refactoring_wrappers.py +377 -0
  383. roam_code-13.1/tests/test_mcp_server.py +1733 -0
  384. roam_code-13.1/tests/test_mcp_server_card_hash.py +62 -0
  385. roam_code-13.1/tests/test_mcp_wrapper_coverage.py +345 -0
  386. roam_code-13.1/tests/test_mermaid.py +325 -0
  387. roam_code-13.1/tests/test_metric_definition_sidecars.py +327 -0
  388. roam_code-13.1/tests/test_missing_index.py +496 -0
  389. roam_code-13.1/tests/test_missing_index_unconditional.py +430 -0
  390. roam_code-13.1/tests/test_missing_index_unconditional_first.py +267 -0
  391. roam_code-13.1/tests/test_mode_classification_coverage.py +447 -0
  392. roam_code-13.1/tests/test_n1_fixes.py +2083 -0
  393. roam_code-13.1/tests/test_no_internal_language.py +290 -0
  394. roam_code-13.1/tests/test_non_idempotent_tools_derived.py +246 -0
  395. roam_code-13.1/tests/test_non_read_only_tools_derived.py +185 -0
  396. roam_code-13.1/tests/test_onboard.py +357 -0
  397. roam_code-13.1/tests/test_optional_imports_guarded.py +371 -0
  398. roam_code-13.1/tests/test_orphan_imports_filters.py +449 -0
  399. roam_code-13.1/tests/test_owner_path_not_found.py +146 -0
  400. roam_code-13.1/tests/test_package_data_wheel_drift.py +275 -0
  401. roam_code-13.1/tests/test_path_coverage.py +361 -0
  402. roam_code-13.1/tests/test_per_finding_suppressions_warnings_out.py +290 -0
  403. roam_code-13.1/tests/test_plan.py +394 -0
  404. roam_code-13.1/tests/test_plugin_substrate.py +632 -0
  405. roam_code-13.1/tests/test_policy_decisions_provenance.py +547 -0
  406. roam_code-13.1/tests/test_pr_bundle.py +1743 -0
  407. roam_code-13.1/tests/test_pr_bundle_causal_diff.py +531 -0
  408. roam_code-13.1/tests/test_pr_bundle_r28_integration.py +479 -0
  409. roam_code-13.1/tests/test_pr_replay.py +608 -0
  410. roam_code-13.1/tests/test_pr_replay_github_reviews.py +395 -0
  411. roam_code-13.1/tests/test_producer_collector_contracts.py +1112 -0
  412. roam_code-13.1/tests/test_pytest_fixtures.py +483 -0
  413. roam_code-13.1/tests/test_python_extractor_docstring_safety.py +304 -0
  414. roam_code-13.1/tests/test_readme_surface_consistency.py +208 -0
  415. roam_code-13.1/tests/test_registry_dispatch.py +188 -0
  416. roam_code-13.1/tests/test_relations.py +262 -0
  417. roam_code-13.1/tests/test_repo_root_helper.py +68 -0
  418. roam_code-13.1/tests/test_resolver_import_target_preference.py +323 -0
  419. roam_code-13.1/tests/test_retrieve.py +974 -0
  420. roam_code-13.1/tests/test_rules_symbol_requirements.py +149 -0
  421. roam_code-13.1/tests/test_sarif_consumers_schema.py +69 -0
  422. roam_code-13.1/tests/test_sarif_flag.py +328 -0
  423. roam_code-13.1/tests/test_sarif_suppressions_warnings_out.py +192 -0
  424. roam_code-13.1/tests/test_security_redact.py +233 -0
  425. roam_code-13.1/tests/test_semantic_diff.py +670 -0
  426. roam_code-13.1/tests/test_semantic_search.py +508 -0
  427. roam_code-13.1/tests/test_simulate.py +483 -0
  428. roam_code-13.1/tests/test_smells.py +3252 -0
  429. roam_code-13.1/tests/test_smells_confidence_mapping_parity.py +278 -0
  430. roam_code-13.1/tests/test_smells_detector_count_drift.py +183 -0
  431. roam_code-13.1/tests/test_sql_like_escape_discipline.py +267 -0
  432. roam_code-13.1/tests/test_stale_refs.py +3978 -0
  433. roam_code-13.1/tests/test_strip_list_payloads_preserves_warnings_out.py +88 -0
  434. roam_code-13.1/tests/test_suppression_v2.py +216 -0
  435. roam_code-13.1/tests/test_suppressions_unified_schema.py +262 -0
  436. roam_code-13.1/tests/test_surface_consistency.py +369 -0
  437. roam_code-13.1/tests/test_surface_counts.py +109 -0
  438. roam_code-13.1/tests/test_taint.py +819 -0
  439. roam_code-13.1/tests/test_taint_analysis.py +836 -0
  440. roam_code-13.1/tests/test_taint_java_deserialization.py +355 -0
  441. roam_code-13.1/tests/test_taint_java_sqli.py +339 -0
  442. roam_code-13.1/tests/test_taint_owasp_top10.py +343 -0
  443. roam_code-13.1/tests/test_taint_php_laravel.py +341 -0
  444. roam_code-13.1/tests/test_taint_rule_hygiene.py +234 -0
  445. roam_code-13.1/tests/test_taint_ssti.py +348 -0
  446. roam_code-13.1/tests/test_task_optional_tools_derived.py +337 -0
  447. roam_code-13.1/tests/test_task_required_tools_derived.py +157 -0
  448. roam_code-13.1/tests/test_user_version_discipline.py +104 -0
  449. roam_code-13.1/tests/test_v1215_passes.py +124 -0
  450. roam_code-13.1/tests/test_version_stamps.py +268 -0
  451. roam_code-13.1/tests/test_vibe_check.py +641 -0
  452. roam_code-13.1/tests/test_vibe_check_framework_hooks.py +323 -0
  453. roam_code-13.1/tests/test_vocabulary_drift_w198.py +319 -0
  454. roam_code-13.1/tests/test_vue_vitest_detection.py +441 -0
  455. roam_code-13.1/tests/test_w211_refs_extensions.py +351 -0
  456. roam_code-13.1/tests/test_w251_ci_env_detection.py +240 -0
  457. roam_code-13.1/tests/test_w444_mcp_tool_names_no_dedupe.py +122 -0
  458. roam_code-13.1/tests/test_w484_templates_ci_reachable.py +121 -0
  459. roam_code-13.1/tests/test_w512_edge_kinds_drift.py +235 -0
  460. roam_code-13.1/tests/test_w547_severity_drift.py +1158 -0
  461. roam_code-13.1/tests/test_w588_fragile_path_drift.py +360 -0
  462. roam_code-13.1/tests/test_w639_detector_smoke.py +134 -0
  463. roam_code-13.1/tests/test_w661_algo_detector_smoke.py +226 -0
  464. roam_code-13.1/tests/test_w662_bare_except_drift.py +527 -0
  465. roam_code-13.1/tests/test_w664_package_data_init_drift.py +127 -0
  466. roam_code-13.1/tests/test_w668_as_file_pattern_drift.py +287 -0
  467. roam_code-13.1/tests/test_w680_world_model_empty_corpus.py +167 -0
  468. roam_code-13.1/tests/test_w681_taint_engine_positive_smoke.py +289 -0
  469. roam_code-13.1/tests/test_w693_suppression_cross_loader.py +1089 -0
  470. roam_code-13.1/tests/test_w703_comment_syntax_coverage.py +104 -0
  471. roam_code-13.1/tests/test_w711_mcp_card_error_branches.py +179 -0
  472. roam_code-13.1/tests/test_w712_mcp_list_tools_smoke.py +184 -0
  473. roam_code-13.1/tests/test_w738_suppression_wire_format.py +200 -0
  474. roam_code-13.1/tests/test_w762_severity_upper_drift.py +447 -0
  475. roam_code-13.1/tests/test_w792_well_known_card_mirrors.py +65 -0
  476. roam_code-13.1/tests/test_w801_endpoints_empty_corpus.py +147 -0
  477. roam_code-13.1/tests/test_w802_dead_empty_corpus.py +136 -0
  478. roam_code-13.1/tests/test_w803_n1_empty_corpus.py +168 -0
  479. roam_code-13.1/tests/test_w806_complexity_empty_corpus.py +127 -0
  480. roam_code-13.1/tests/test_w807_missing_index_empty_corpus.py +127 -0
  481. roam_code-13.1/tests/test_w808_clones_empty_corpus.py +126 -0
  482. roam_code-13.1/tests/test_w809_over_fetch_empty_corpus.py +154 -0
  483. roam_code-13.1/tests/test_w811_bus_factor_empty_corpus.py +220 -0
  484. roam_code-13.1/tests/test_w812_orphan_imports_empty_corpus.py +143 -0
  485. roam_code-13.1/tests/test_w815_auth_gaps_empty_corpus.py +146 -0
  486. roam_code-13.1/tests/test_w816_hotspots_empty_corpus.py +110 -0
  487. roam_code-13.1/tests/test_w820_smells_empty_corpus.py +150 -0
  488. roam_code-13.1/tests/test_w821_duplicates_empty_corpus.py +135 -0
  489. roam_code-13.1/tests/test_w823_vulns_empty_corpus.py +185 -0
  490. roam_code-13.1/tests/test_w824_invariants_empty_corpus.py +178 -0
  491. roam_code-13.1/tests/test_w825_taint_empty_corpus.py +163 -0
  492. roam_code-13.1/tests/test_w827_audit_trail_conformance_empty_corpus.py +120 -0
  493. roam_code-13.1/tests/test_w828_pr_risk_empty_corpus.py +155 -0
  494. roam_code-13.1/tests/test_w829_audit_trail_verify_empty_corpus.py +122 -0
  495. roam_code-13.1/tests/test_w830_audit_trail_verify_gate.py +227 -0
  496. roam_code-13.1/tests/test_w831_critique_empty_corpus.py +219 -0
  497. roam_code-13.1/tests/test_w833_health_empty_corpus.py +209 -0
  498. roam_code-13.1/tests/test_w835_doctor_empty_corpus.py +149 -0
  499. roam_code-13.1/tests/test_w852_type_switch.py +532 -0
  500. roam_code-13.1/tests/test_w853_speculative_generality.py +210 -0
  501. roam_code-13.1/tests/test_w855_rename_invariant_clones.py +319 -0
  502. roam_code-13.1/tests/test_w856_cross_layer_clones.py +492 -0
  503. roam_code-13.1/tests/test_w857_parallel_hierarchy.py +288 -0
  504. roam_code-13.1/tests/test_w870_detector_version_stamp_parity.py +114 -0
  505. roam_code-13.1/tests/test_w910_alerts_threshold_parity.py +86 -0
  506. roam_code-13.1/tests/test_w911_confidence_tier_parity.py +80 -0
  507. roam_code-13.1/tests/test_w912_detector_metadata_coverage.py +222 -0
  508. roam_code-13.1/tests/test_w918_alerts_silent_fallback.py +229 -0
  509. roam_code-13.1/tests/test_w954_core_tools_capability_drift.py +198 -0
  510. roam_code-13.1/tests/test_w962_w963_w964_alerts_pattern2.py +1004 -0
  511. roam_code-13.1/tests/test_w987_smells_pattern2.py +399 -0
  512. roam_code-13.1/tests/test_w989_pr_risk_pattern2.py +312 -0
  513. roam_code-13.1/tests/test_w994_w995_suppress_yaml.py +581 -0
  514. roam_code-13.0/PKG-INFO +0 -1982
  515. roam_code-13.0/README.md +0 -1920
  516. roam_code-13.0/pyproject.toml +0 -173
  517. roam_code-13.0/src/roam/analysis/effects.py +0 -639
  518. roam_code-13.0/src/roam/analysis/taint.py +0 -726
  519. roam_code-13.0/src/roam/attest/__init__.py +0 -24
  520. roam_code-13.0/src/roam/attest/cga.py +0 -643
  521. roam_code-13.0/src/roam/catalog/detectors.py +0 -4358
  522. roam_code-13.0/src/roam/catalog/fixes.py +0 -86
  523. roam_code-13.0/src/roam/catalog/python_idioms.py +0 -1611
  524. roam_code-13.0/src/roam/catalog/smells.py +0 -600
  525. roam_code-13.0/src/roam/catalog/tasks.py +0 -1513
  526. roam_code-13.0/src/roam/cli.py +0 -1497
  527. roam_code-13.0/src/roam/commands/changed_files.py +0 -177
  528. roam_code-13.0/src/roam/commands/cmd_adversarial.py +0 -757
  529. roam_code-13.0/src/roam/commands/cmd_alerts.py +0 -594
  530. roam_code-13.0/src/roam/commands/cmd_annotate.py +0 -242
  531. roam_code-13.0/src/roam/commands/cmd_article_12_check.py +0 -416
  532. roam_code-13.0/src/roam/commands/cmd_audit_trail_conformance.py +0 -426
  533. roam_code-13.0/src/roam/commands/cmd_audit_trail_verify.py +0 -197
  534. roam_code-13.0/src/roam/commands/cmd_auth_gaps.py +0 -1293
  535. roam_code-13.0/src/roam/commands/cmd_budget.py +0 -432
  536. roam_code-13.0/src/roam/commands/cmd_bus_factor.py +0 -557
  537. roam_code-13.0/src/roam/commands/cmd_causal_graph.py +0 -327
  538. roam_code-13.0/src/roam/commands/cmd_cga.py +0 -443
  539. roam_code-13.0/src/roam/commands/cmd_check_rules.py +0 -592
  540. roam_code-13.0/src/roam/commands/cmd_ci_setup.py +0 -459
  541. roam_code-13.0/src/roam/commands/cmd_clones.py +0 -285
  542. roam_code-13.0/src/roam/commands/cmd_complexity.py +0 -550
  543. roam_code-13.0/src/roam/commands/cmd_context.py +0 -1333
  544. roam_code-13.0/src/roam/commands/cmd_conventions.py +0 -933
  545. roam_code-13.0/src/roam/commands/cmd_coverage_gaps.py +0 -776
  546. roam_code-13.0/src/roam/commands/cmd_critique.py +0 -491
  547. roam_code-13.0/src/roam/commands/cmd_dark_matter.py +0 -148
  548. roam_code-13.0/src/roam/commands/cmd_dead.py +0 -2282
  549. roam_code-13.0/src/roam/commands/cmd_doctor.py +0 -1292
  550. roam_code-13.0/src/roam/commands/cmd_duplicates.py +0 -653
  551. roam_code-13.0/src/roam/commands/cmd_endpoints.py +0 -794
  552. roam_code-13.0/src/roam/commands/cmd_eval_retrieve.py +0 -355
  553. roam_code-13.0/src/roam/commands/cmd_fan.py +0 -440
  554. roam_code-13.0/src/roam/commands/cmd_fingerprint.py +0 -278
  555. roam_code-13.0/src/roam/commands/cmd_fn_coupling.py +0 -483
  556. roam_code-13.0/src/roam/commands/cmd_guard.py +0 -469
  557. roam_code-13.0/src/roam/commands/cmd_health.py +0 -1425
  558. roam_code-13.0/src/roam/commands/cmd_hotspots.py +0 -764
  559. roam_code-13.0/src/roam/commands/cmd_hover.py +0 -145
  560. roam_code-13.0/src/roam/commands/cmd_idempotency.py +0 -210
  561. roam_code-13.0/src/roam/commands/cmd_impact.py +0 -608
  562. roam_code-13.0/src/roam/commands/cmd_init.py +0 -299
  563. roam_code-13.0/src/roam/commands/cmd_invariants.py +0 -320
  564. roam_code-13.0/src/roam/commands/cmd_laws.py +0 -529
  565. roam_code-13.0/src/roam/commands/cmd_lease.py +0 -675
  566. roam_code-13.0/src/roam/commands/cmd_math.py +0 -495
  567. roam_code-13.0/src/roam/commands/cmd_migration_plan.py +0 -318
  568. roam_code-13.0/src/roam/commands/cmd_migration_safety.py +0 -765
  569. roam_code-13.0/src/roam/commands/cmd_missing_index.py +0 -1382
  570. roam_code-13.0/src/roam/commands/cmd_mode.py +0 -400
  571. roam_code-13.0/src/roam/commands/cmd_n1.py +0 -1370
  572. roam_code-13.0/src/roam/commands/cmd_next.py +0 -694
  573. roam_code-13.0/src/roam/commands/cmd_oracle.py +0 -708
  574. roam_code-13.0/src/roam/commands/cmd_orphan_imports.py +0 -546
  575. roam_code-13.0/src/roam/commands/cmd_orphan_routes.py +0 -761
  576. roam_code-13.0/src/roam/commands/cmd_over_fetch.py +0 -1173
  577. roam_code-13.0/src/roam/commands/cmd_owner.py +0 -348
  578. roam_code-13.0/src/roam/commands/cmd_path_coverage.py +0 -597
  579. roam_code-13.0/src/roam/commands/cmd_patterns.py +0 -775
  580. roam_code-13.0/src/roam/commands/cmd_permit.py +0 -300
  581. roam_code-13.0/src/roam/commands/cmd_plan_refactor.py +0 -483
  582. roam_code-13.0/src/roam/commands/cmd_pr_bundle.py +0 -2103
  583. roam_code-13.0/src/roam/commands/cmd_pr_replay.py +0 -811
  584. roam_code-13.0/src/roam/commands/cmd_pr_risk.py +0 -802
  585. roam_code-13.0/src/roam/commands/cmd_preflight.py +0 -946
  586. roam_code-13.0/src/roam/commands/cmd_py_types.py +0 -315
  587. roam_code-13.0/src/roam/commands/cmd_pytest_fixtures.py +0 -367
  588. roam_code-13.0/src/roam/commands/cmd_risk.py +0 -622
  589. roam_code-13.0/src/roam/commands/cmd_rules_validate.py +0 -492
  590. roam_code-13.0/src/roam/commands/cmd_secrets.py +0 -703
  591. roam_code-13.0/src/roam/commands/cmd_side_effects.py +0 -235
  592. roam_code-13.0/src/roam/commands/cmd_smells.py +0 -333
  593. roam_code-13.0/src/roam/commands/cmd_stale_refs.py +0 -3608
  594. roam_code-13.0/src/roam/commands/cmd_suppress.py +0 -288
  595. roam_code-13.0/src/roam/commands/cmd_surface.py +0 -202
  596. roam_code-13.0/src/roam/commands/cmd_taint.py +0 -305
  597. roam_code-13.0/src/roam/commands/cmd_test_gaps.py +0 -592
  598. roam_code-13.0/src/roam/commands/cmd_tx_boundaries.py +0 -313
  599. roam_code-13.0/src/roam/commands/cmd_understand.py +0 -1297
  600. roam_code-13.0/src/roam/commands/cmd_uses.py +0 -330
  601. roam_code-13.0/src/roam/commands/cmd_verify_imports.py +0 -777
  602. roam_code-13.0/src/roam/commands/cmd_vibe_check.py +0 -1052
  603. roam_code-13.0/src/roam/commands/cmd_vuln_reach.py +0 -310
  604. roam_code-13.0/src/roam/commands/cmd_vulns.py +0 -539
  605. roam_code-13.0/src/roam/commands/conventions_helper.py +0 -395
  606. roam_code-13.0/src/roam/commands/finding_suppress.py +0 -308
  607. roam_code-13.0/src/roam/commands/git_helpers.py +0 -105
  608. roam_code-13.0/src/roam/commands/metrics_history.py +0 -321
  609. roam_code-13.0/src/roam/commands/suppression.py +0 -309
  610. roam_code-13.0/src/roam/competitor_site_data.py +0 -2167
  611. roam_code-13.0/src/roam/config.py +0 -266
  612. roam_code-13.0/src/roam/constitution/loader.py +0 -1031
  613. roam_code-13.0/src/roam/critique/__init__.py +0 -31
  614. roam_code-13.0/src/roam/critique/aggregator.py +0 -63
  615. roam_code-13.0/src/roam/critique/checks.py +0 -591
  616. roam_code-13.0/src/roam/db/connection.py +0 -582
  617. roam_code-13.0/src/roam/db/schema.py +0 -404
  618. roam_code-13.0/src/roam/fleet/adapters.py +0 -107
  619. roam_code-13.0/src/roam/graph/clone_detect.py +0 -940
  620. roam_code-13.0/src/roam/graph/pagerank.py +0 -248
  621. roam_code-13.0/src/roam/index/django_post.py +0 -423
  622. roam_code-13.0/src/roam/index/git_stats.py +0 -641
  623. roam_code-13.0/src/roam/index/indexer.py +0 -1674
  624. roam_code-13.0/src/roam/index/laravel_post.py +0 -820
  625. roam_code-13.0/src/roam/index/manifest.py +0 -411
  626. roam_code-13.0/src/roam/index/registry_dispatch.py +0 -277
  627. roam_code-13.0/src/roam/index/relations.py +0 -581
  628. roam_code-13.0/src/roam/languages/extractor_schema.py +0 -237
  629. roam_code-13.0/src/roam/languages/query_engine.py +0 -595
  630. roam_code-13.0/src/roam/languages/registry.py +0 -332
  631. roam_code-13.0/src/roam/laws/miner.py +0 -632
  632. roam_code-13.0/src/roam/leases/store.py +0 -433
  633. roam_code-13.0/src/roam/mcp-server-card.json +0 -156
  634. roam_code-13.0/src/roam/mcp_server.py +0 -9860
  635. roam_code-13.0/src/roam/modes/policy.py +0 -421
  636. roam_code-13.0/src/roam/output/confidence.py +0 -266
  637. roam_code-13.0/src/roam/output/file_role_hints.py +0 -102
  638. roam_code-13.0/src/roam/output/formatter.py +0 -1132
  639. roam_code-13.0/src/roam/output/sarif.py +0 -1307
  640. roam_code-13.0/src/roam/plugins/__init__.py +0 -284
  641. roam_code-13.0/src/roam/plugins/registry.py +0 -357
  642. roam_code-13.0/src/roam/retrieve/learned_ranker.py +0 -241
  643. roam_code-13.0/src/roam/retrieve/rerank.py +0 -796
  644. roam_code-13.0/src/roam/retrieve/seeds.py +0 -572
  645. roam_code-13.0/src/roam/retrieve/semantic.py +0 -266
  646. roam_code-13.0/src/roam/rules/builtin.py +0 -617
  647. roam_code-13.0/src/roam/rules/dataflow.py +0 -527
  648. roam_code-13.0/src/roam/rules/engine.py +0 -1418
  649. roam_code-13.0/src/roam/runs/helpers.py +0 -185
  650. roam_code-13.0/src/roam/runs/ledger.py +0 -530
  651. roam_code-13.0/src/roam/search/index_embeddings.py +0 -803
  652. roam_code-13.0/src/roam/search/tfidf.py +0 -362
  653. roam_code-13.0/src/roam/security/taint_engine.py +0 -492
  654. roam_code-13.0/src/roam/security/taint_rules/api_error_leak.yaml +0 -28
  655. roam_code-13.0/src/roam/security/taint_rules/java_fileupload_path_traversal.yaml +0 -28
  656. roam_code-13.0/src/roam/security/taint_rules/js_insecure_jwt_decode.yaml +0 -23
  657. roam_code-13.0/src/roam/security/taint_rules/js_localstorage_secrets.yaml +0 -25
  658. roam_code-13.0/src/roam/security/taint_rules/js_prototype_pollution.yaml +0 -30
  659. roam_code-13.0/src/roam/security/taint_rules/js_ssrf.yaml +0 -21
  660. roam_code-13.0/src/roam/security/taint_rules/js_xss.yaml +0 -23
  661. roam_code-13.0/src/roam/security/taint_rules/python_basic.yaml +0 -25
  662. roam_code-13.0/src/roam/security/taint_rules/python_deserialization.yaml +0 -34
  663. roam_code-13.0/src/roam/security/taint_rules/python_path_traversal.yaml +0 -22
  664. roam_code-13.0/src/roam/security/taint_rules/python_socketio_remote_source.yaml +0 -33
  665. roam_code-13.0/src/roam/security/taint_rules/python_sqli.yaml +0 -21
  666. roam_code-13.0/src/roam/security/taint_rules/python_urllib_open_redirect.yaml +0 -30
  667. roam_code-13.0/src/roam/security/taint_rules/vue_v_html.yaml +0 -26
  668. roam_code-13.0/src/roam/surface_counts.py +0 -165
  669. roam_code-13.0/src/roam/templates/ci/Jenkinsfile +0 -186
  670. roam_code-13.0/src/roam/templates/ci/azure-pipelines.yml +0 -162
  671. roam_code-13.0/src/roam/templates/ci/bitbucket-pipelines.yml +0 -179
  672. roam_code-13.0/src/roam/templates/ci/gitlab-ci.yml +0 -138
  673. roam_code-13.0/src/roam/world_model/causal_graph.py +0 -738
  674. roam_code-13.0/src/roam/world_model/side_effects.py +0 -562
  675. roam_code-13.0/src/roam/world_model/tx_boundaries.py +0 -760
  676. roam_code-13.0/src/roam_code.egg-info/PKG-INFO +0 -1982
  677. roam_code-13.0/src/roam_code.egg-info/SOURCES.txt +0 -888
  678. roam_code-13.0/src/roam_code.egg-info/requires.txt +0 -38
  679. roam_code-13.0/tests/test_adversarial.py +0 -640
  680. roam_code-13.0/tests/test_affected.py +0 -328
  681. roam_code-13.0/tests/test_agent_plan_context.py +0 -103
  682. roam_code-13.0/tests/test_agents_md.py +0 -246
  683. roam_code-13.0/tests/test_alerts_cmd.py +0 -591
  684. roam_code-13.0/tests/test_alias_deprecation.py +0 -300
  685. roam_code-13.0/tests/test_annotations.py +0 -787
  686. roam_code-13.0/tests/test_atomic_writes.py +0 -273
  687. roam_code-13.0/tests/test_auto_count_script.py +0 -221
  688. roam_code-13.0/tests/test_batch_mcp.py +0 -824
  689. roam_code-13.0/tests/test_budget_coverage_survey.py +0 -503
  690. roam_code-13.0/tests/test_caller_metric_definition.py +0 -298
  691. roam_code-13.0/tests/test_causal_graph.py +0 -281
  692. roam_code-13.0/tests/test_check_rules.py +0 -984
  693. roam_code-13.0/tests/test_ci_gate_eval.py +0 -89
  694. roam_code-13.0/tests/test_ci_sarif_guard.py +0 -135
  695. roam_code-13.0/tests/test_ci_setup.py +0 -93
  696. roam_code-13.0/tests/test_cli_contract.py +0 -450
  697. roam_code-13.0/tests/test_closure.py +0 -213
  698. roam_code-13.0/tests/test_commands_architecture.py +0 -713
  699. roam_code-13.0/tests/test_commands_exploration.py +0 -795
  700. roam_code-13.0/tests/test_commands_health.py +0 -678
  701. roam_code-13.0/tests/test_commands_refactoring.py +0 -369
  702. roam_code-13.0/tests/test_commands_workflow.py +0 -769
  703. roam_code-13.0/tests/test_compat_sweep.py +0 -111
  704. roam_code-13.0/tests/test_confidence_triples.py +0 -992
  705. roam_code-13.0/tests/test_constitution.py +0 -547
  706. roam_code-13.0/tests/test_conventions_consolidation.py +0 -551
  707. roam_code-13.0/tests/test_count_drift_hook.py +0 -78
  708. roam_code-13.0/tests/test_count_drift_no_overlap.py +0 -145
  709. roam_code-13.0/tests/test_critique.py +0 -718
  710. roam_code-13.0/tests/test_dashboard.py +0 -182
  711. roam_code-13.0/tests/test_dataflow_dead.py +0 -521
  712. roam_code-13.0/tests/test_dead_aging.py +0 -459
  713. roam_code-13.0/tests/test_detail_semantics.py +0 -337
  714. roam_code-13.0/tests/test_dev_profile.py +0 -856
  715. roam_code-13.0/tests/test_doc_consistency.py +0 -279
  716. roam_code-13.0/tests/test_doc_link_anchors.py +0 -89
  717. roam_code-13.0/tests/test_doctor.py +0 -916
  718. roam_code-13.0/tests/test_dogfood_dedup_check.py +0 -55
  719. roam_code-13.0/tests/test_guard.py +0 -59
  720. roam_code-13.0/tests/test_impact_bounded.py +0 -224
  721. roam_code-13.0/tests/test_install_check.py +0 -259
  722. roam_code-13.0/tests/test_json_contracts.py +0 -465
  723. roam_code-13.0/tests/test_language_corpus.py +0 -245
  724. roam_code-13.0/tests/test_languages.py +0 -2209
  725. roam_code-13.0/tests/test_laravel_dead_idioms.py +0 -1039
  726. roam_code-13.0/tests/test_law4_anchoring.py +0 -267
  727. roam_code-13.0/tests/test_law4_lint.py +0 -542
  728. roam_code-13.0/tests/test_law4_residual.py +0 -302
  729. roam_code-13.0/tests/test_law4_stragglers.py +0 -272
  730. roam_code-13.0/tests/test_laws_mining.py +0 -562
  731. roam_code-13.0/tests/test_lease_system.py +0 -468
  732. roam_code-13.0/tests/test_math.py +0 -2013
  733. roam_code-13.0/tests/test_mcp_extras.py +0 -366
  734. roam_code-13.0/tests/test_mcp_server.py +0 -1657
  735. roam_code-13.0/tests/test_mcp_server_card_hash.py +0 -54
  736. roam_code-13.0/tests/test_mcp_wrapper_coverage.py +0 -273
  737. roam_code-13.0/tests/test_mermaid.py +0 -328
  738. roam_code-13.0/tests/test_missing_index.py +0 -499
  739. roam_code-13.0/tests/test_missing_index_unconditional.py +0 -432
  740. roam_code-13.0/tests/test_missing_index_unconditional_first.py +0 -269
  741. roam_code-13.0/tests/test_mode_classification_coverage.py +0 -284
  742. roam_code-13.0/tests/test_n1_fixes.py +0 -1359
  743. roam_code-13.0/tests/test_no_internal_language.py +0 -296
  744. roam_code-13.0/tests/test_onboard.py +0 -360
  745. roam_code-13.0/tests/test_path_coverage.py +0 -356
  746. roam_code-13.0/tests/test_plan.py +0 -396
  747. roam_code-13.0/tests/test_plugin_substrate.py +0 -411
  748. roam_code-13.0/tests/test_pr_bundle.py +0 -875
  749. roam_code-13.0/tests/test_pr_bundle_causal_diff.py +0 -518
  750. roam_code-13.0/tests/test_pr_bundle_r28_integration.py +0 -479
  751. roam_code-13.0/tests/test_pr_replay.py +0 -384
  752. roam_code-13.0/tests/test_pytest_fixtures.py +0 -375
  753. roam_code-13.0/tests/test_readme_surface_consistency.py +0 -82
  754. roam_code-13.0/tests/test_registry_dispatch.py +0 -163
  755. roam_code-13.0/tests/test_retrieve.py +0 -955
  756. roam_code-13.0/tests/test_rules_symbol_requirements.py +0 -147
  757. roam_code-13.0/tests/test_sarif_flag.py +0 -242
  758. roam_code-13.0/tests/test_semantic_diff.py +0 -673
  759. roam_code-13.0/tests/test_semantic_search.py +0 -458
  760. roam_code-13.0/tests/test_simulate.py +0 -482
  761. roam_code-13.0/tests/test_smells.py +0 -809
  762. roam_code-13.0/tests/test_stale_refs.py +0 -3956
  763. roam_code-13.0/tests/test_surface_consistency.py +0 -285
  764. roam_code-13.0/tests/test_surface_counts.py +0 -107
  765. roam_code-13.0/tests/test_taint.py +0 -477
  766. roam_code-13.0/tests/test_taint_analysis.py +0 -831
  767. roam_code-13.0/tests/test_user_version_discipline.py +0 -73
  768. roam_code-13.0/tests/test_v1215_passes.py +0 -109
  769. roam_code-13.0/tests/test_vibe_check.py +0 -621
  770. roam_code-13.0/tests/test_vue_vitest_detection.py +0 -276
  771. {roam_code-13.0 → roam_code-13.1}/LICENSE +0 -0
  772. {roam_code-13.0 → roam_code-13.1}/setup.cfg +0 -0
  773. {roam_code-13.0 → roam_code-13.1}/src/roam/__init__.py +0 -0
  774. {roam_code-13.0 → roam_code-13.1}/src/roam/__main__.py +0 -0
  775. {roam_code-13.0 → roam_code-13.1}/src/roam/agents_md/__init__.py +0 -0
  776. {roam_code-13.0 → roam_code-13.1}/src/roam/agents_md/generator.py +0 -0
  777. {roam_code-13.0 → roam_code-13.1}/src/roam/analysis/__init__.py +0 -0
  778. {roam_code-13.0 → roam_code-13.1}/src/roam/api.py +0 -0
  779. {roam_code-13.0 → roam_code-13.1}/src/roam/ask/__init__.py +0 -0
  780. {roam_code-13.0 → roam_code-13.1}/src/roam/ask/classifier.py +0 -0
  781. {roam_code-13.0 → roam_code-13.1}/src/roam/ask/recipes.py +0 -0
  782. {roam_code-13.0 → roam_code-13.1}/src/roam/ask/runner.py +0 -0
  783. {roam_code-13.0 → roam_code-13.1}/src/roam/ask/workflow.py +0 -0
  784. {roam_code-13.0 → roam_code-13.1}/src/roam/atomic_io.py +0 -0
  785. {roam_code-13.0 → roam_code-13.1}/src/roam/bridges/__init__.py +0 -0
  786. {roam_code-13.0 → roam_code-13.1}/src/roam/bridges/base.py +0 -0
  787. {roam_code-13.0 → roam_code-13.1}/src/roam/bridges/bridge_config.py +0 -0
  788. {roam_code-13.0 → roam_code-13.1}/src/roam/bridges/bridge_django.py +0 -0
  789. {roam_code-13.0 → roam_code-13.1}/src/roam/bridges/bridge_protobuf.py +0 -0
  790. {roam_code-13.0 → roam_code-13.1}/src/roam/bridges/bridge_rest_api.py +0 -0
  791. {roam_code-13.0 → roam_code-13.1}/src/roam/bridges/bridge_salesforce.py +0 -0
  792. {roam_code-13.0 → roam_code-13.1}/src/roam/bridges/bridge_template.py +0 -0
  793. {roam_code-13.0 → roam_code-13.1}/src/roam/bridges/registry.py +0 -0
  794. {roam_code-13.0 → roam_code-13.1}/src/roam/capability.py +0 -0
  795. {roam_code-13.0 → roam_code-13.1}/src/roam/catalog/__init__.py +0 -0
  796. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/__init__.py +0 -0
  797. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/audit_trail_helpers.py +0 -0
  798. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_adrs.py +0 -0
  799. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_affected.py +0 -0
  800. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_affected_tests.py +0 -0
  801. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_agent_context.py +0 -0
  802. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_agent_export.py +0 -0
  803. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_agent_plan.py +0 -0
  804. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_agent_score.py +0 -0
  805. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_agents_md.py +0 -0
  806. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_ai_ratio.py +0 -0
  807. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_ai_readiness.py +0 -0
  808. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_api.py +0 -0
  809. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_api_changes.py +0 -0
  810. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_api_drift.py +0 -0
  811. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_architecture_drift.py +0 -0
  812. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_ask.py +0 -0
  813. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_attest.py +0 -0
  814. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_audit.py +0 -0
  815. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_audit_trail_export.py +0 -0
  816. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_batch_search.py +0 -0
  817. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_bisect.py +0 -0
  818. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_breaking.py +0 -0
  819. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_brief.py +0 -0
  820. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_capabilities.py +0 -0
  821. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_capsule.py +0 -0
  822. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_changelog.py +0 -0
  823. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_clean.py +0 -0
  824. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_closure.py +0 -0
  825. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_clusters.py +0 -0
  826. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_codeowners.py +0 -0
  827. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_compare.py +0 -0
  828. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_complete.py +0 -0
  829. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_config.py +0 -0
  830. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_congestion.py +0 -0
  831. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_constitution.py +0 -0
  832. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_coupling.py +0 -0
  833. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_cut.py +0 -0
  834. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_dashboard.py +0 -0
  835. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_db_check.py +0 -0
  836. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_debt.py +0 -0
  837. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_delete_check.py +0 -0
  838. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_deps.py +0 -0
  839. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_describe.py +0 -0
  840. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_dev_profile.py +0 -0
  841. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_diagnose.py +0 -0
  842. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_diff.py +0 -0
  843. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_disambiguate.py +0 -0
  844. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_doc_staleness.py +0 -0
  845. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_docs_coverage.py +0 -0
  846. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_dogfood.py +0 -0
  847. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_dogfood_aggregate.py +0 -0
  848. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_drift.py +0 -0
  849. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_effects.py +0 -0
  850. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_entry_points.py +0 -0
  851. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_exit_codes.py +0 -0
  852. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_explain_command.py +0 -0
  853. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_file.py +0 -0
  854. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_fitness.py +0 -0
  855. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_flag_dead.py +0 -0
  856. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_fleet.py +0 -0
  857. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_forecast.py +0 -0
  858. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_graph_diff.py +0 -0
  859. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_graph_export.py +0 -0
  860. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_graph_stats.py +0 -0
  861. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_grep.py +0 -0
  862. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_help_search.py +0 -0
  863. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_history_grep.py +0 -0
  864. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_hooks.py +0 -0
  865. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_index.py +0 -0
  866. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_index_bundle.py +0 -0
  867. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_index_stats.py +0 -0
  868. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_ingest_trace.py +0 -0
  869. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_intent.py +0 -0
  870. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_intent_check.py +0 -0
  871. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_layers.py +0 -0
  872. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_lsp.py +0 -0
  873. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_map.py +0 -0
  874. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_mcp.py +0 -0
  875. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_mcp_setup.py +0 -0
  876. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_mcp_status.py +0 -0
  877. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_memory.py +0 -0
  878. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_metrics.py +0 -0
  879. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_metrics_push.py +0 -0
  880. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_minimap.py +0 -0
  881. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_module.py +0 -0
  882. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_mutate.py +0 -0
  883. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_orchestrate.py +0 -0
  884. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_partition.py +0 -0
  885. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_plan.py +0 -0
  886. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_plugins.py +0 -0
  887. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_postmortem.py +0 -0
  888. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_pr_analyze.py +0 -0
  889. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_pr_comment_render.py +0 -0
  890. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_pr_diff.py +0 -0
  891. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_pr_prep.py +0 -0
  892. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_pre_commit.py +0 -0
  893. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_py_modern.py +0 -0
  894. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_recipes.py +0 -0
  895. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_recommend.py +0 -0
  896. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_refs_text.py +0 -0
  897. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_relate.py +0 -0
  898. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_replay.py +0 -0
  899. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_report.py +0 -0
  900. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_reset.py +0 -0
  901. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_retrieve.py +0 -0
  902. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_rules.py +0 -0
  903. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_runs.py +0 -0
  904. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_safe_delete.py +0 -0
  905. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_safe_zones.py +0 -0
  906. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_sbom.py +0 -0
  907. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_schema.py +0 -0
  908. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_search.py +0 -0
  909. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_search_semantic.py +0 -0
  910. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_semantic_diff.py +0 -0
  911. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_simulate.py +0 -0
  912. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_simulate_departure.py +0 -0
  913. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_sketch.py +0 -0
  914. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_skill_generate.py +0 -0
  915. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_spectral.py +0 -0
  916. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_split.py +0 -0
  917. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_stats.py +0 -0
  918. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_suggest_refactoring.py +0 -0
  919. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_suggest_reviewers.py +0 -0
  920. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_supply_chain.py +0 -0
  921. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_symbol.py +0 -0
  922. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_syntax_check.py +0 -0
  923. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_telemetry.py +0 -0
  924. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_test_impact.py +0 -0
  925. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_test_pyramid.py +0 -0
  926. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_test_scaffold.py +0 -0
  927. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_testmap.py +0 -0
  928. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_timeline.py +0 -0
  929. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_tour.py +0 -0
  930. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_trace.py +0 -0
  931. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_trends.py +0 -0
  932. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_triage.py +0 -0
  933. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_verify.py +0 -0
  934. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_version.py +0 -0
  935. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_visualize.py +0 -0
  936. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_vuln_map.py +0 -0
  937. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_watch.py +0 -0
  938. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_weather.py +0 -0
  939. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_why.py +0 -0
  940. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_why_fail.py +0 -0
  941. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_why_slow.py +0 -0
  942. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_workflow.py +0 -0
  943. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_ws.py +0 -0
  944. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/cmd_xlang.py +0 -0
  945. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/codeowners_helpers.py +0 -0
  946. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/context_helpers.py +0 -0
  947. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/gate_presets.py +0 -0
  948. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/graph_helpers.py +0 -0
  949. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/grep_helpers.py +0 -0
  950. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/next_steps.py +0 -0
  951. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/pr_analyze/__init__.py +0 -0
  952. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/pr_analyze/audit_trail.py +0 -0
  953. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/pr_analyze/cache.py +0 -0
  954. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/pr_analyze/rules.py +0 -0
  955. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/resolve.py +0 -0
  956. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/stale_index.py +0 -0
  957. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/stale_refs_anchors.py +0 -0
  958. {roam_code-13.0 → roam_code-13.1}/src/roam/commands/stale_refs_hints.py +0 -0
  959. {roam_code-13.0 → roam_code-13.1}/src/roam/constitution/__init__.py +0 -0
  960. {roam_code-13.0 → roam_code-13.1}/src/roam/coverage_reports.py +0 -0
  961. {roam_code-13.0 → roam_code-13.1}/src/roam/db/__init__.py +0 -0
  962. {roam_code-13.0 → roam_code-13.1}/src/roam/db/queries.py +0 -0
  963. {roam_code-13.0 → roam_code-13.1}/src/roam/eval/__init__.py +0 -0
  964. {roam_code-13.0 → roam_code-13.1}/src/roam/eval/harness.py +0 -0
  965. {roam_code-13.0 → roam_code-13.1}/src/roam/exit_codes.py +0 -0
  966. {roam_code-13.0 → roam_code-13.1}/src/roam/fleet/__init__.py +0 -0
  967. {roam_code-13.0 → roam_code-13.1}/src/roam/fleet/manifest.py +0 -0
  968. {roam_code-13.0 → roam_code-13.1}/src/roam/git_utils.py +0 -0
  969. {roam_code-13.0 → roam_code-13.1}/src/roam/graph/__init__.py +0 -0
  970. {roam_code-13.0 → roam_code-13.1}/src/roam/graph/anomaly.py +0 -0
  971. {roam_code-13.0 → roam_code-13.1}/src/roam/graph/builder.py +0 -0
  972. {roam_code-13.0 → roam_code-13.1}/src/roam/graph/clusters.py +0 -0
  973. {roam_code-13.0 → roam_code-13.1}/src/roam/graph/cycles.py +0 -0
  974. {roam_code-13.0 → roam_code-13.1}/src/roam/graph/dark_matter.py +0 -0
  975. {roam_code-13.0 → roam_code-13.1}/src/roam/graph/diff.py +0 -0
  976. {roam_code-13.0 → roam_code-13.1}/src/roam/graph/fingerprint.py +0 -0
  977. {roam_code-13.0 → roam_code-13.1}/src/roam/graph/layers.py +0 -0
  978. {roam_code-13.0 → roam_code-13.1}/src/roam/graph/partition.py +0 -0
  979. {roam_code-13.0 → roam_code-13.1}/src/roam/graph/pathfinding.py +0 -0
  980. {roam_code-13.0 → roam_code-13.1}/src/roam/graph/propagation.py +0 -0
  981. {roam_code-13.0 → roam_code-13.1}/src/roam/graph/simulate.py +0 -0
  982. {roam_code-13.0 → roam_code-13.1}/src/roam/graph/spectral.py +0 -0
  983. {roam_code-13.0 → roam_code-13.1}/src/roam/graph/stats.py +0 -0
  984. {roam_code-13.0 → roam_code-13.1}/src/roam/graph/versioning.py +0 -0
  985. {roam_code-13.0 → roam_code-13.1}/src/roam/index/__init__.py +0 -0
  986. {roam_code-13.0 → roam_code-13.1}/src/roam/index/complexity.py +0 -0
  987. {roam_code-13.0 → roam_code-13.1}/src/roam/index/discovery.py +0 -0
  988. {roam_code-13.0 → roam_code-13.1}/src/roam/index/file_roles.py +0 -0
  989. {roam_code-13.0 → roam_code-13.1}/src/roam/index/gitignore.py +0 -0
  990. {roam_code-13.0 → roam_code-13.1}/src/roam/index/incremental.py +0 -0
  991. {roam_code-13.0 → roam_code-13.1}/src/roam/index/parser.py +0 -0
  992. {roam_code-13.0 → roam_code-13.1}/src/roam/index/pytest_fixtures.py +0 -0
  993. {roam_code-13.0 → roam_code-13.1}/src/roam/index/symbols.py +0 -0
  994. {roam_code-13.0 → roam_code-13.1}/src/roam/index/test_conventions.py +0 -0
  995. {roam_code-13.0 → roam_code-13.1}/src/roam/languages/__init__.py +0 -0
  996. {roam_code-13.0 → roam_code-13.1}/src/roam/languages/apex_lang.py +0 -0
  997. {roam_code-13.0 → roam_code-13.1}/src/roam/languages/aura_lang.py +0 -0
  998. {roam_code-13.0 → roam_code-13.1}/src/roam/languages/base.py +0 -0
  999. {roam_code-13.0 → roam_code-13.1}/src/roam/languages/c_lang.py +0 -0
  1000. {roam_code-13.0 → roam_code-13.1}/src/roam/languages/csharp_lang.py +0 -0
  1001. {roam_code-13.0 → roam_code-13.1}/src/roam/languages/dart_lang.py +0 -0
  1002. {roam_code-13.0 → roam_code-13.1}/src/roam/languages/extractors/kotlin.yaml +0 -0
  1003. {roam_code-13.0 → roam_code-13.1}/src/roam/languages/foxpro_lang.py +0 -0
  1004. {roam_code-13.0 → roam_code-13.1}/src/roam/languages/generic_lang.py +0 -0
  1005. {roam_code-13.0 → roam_code-13.1}/src/roam/languages/go_lang.py +0 -0
  1006. {roam_code-13.0 → roam_code-13.1}/src/roam/languages/hcl_lang.py +0 -0
  1007. {roam_code-13.0 → roam_code-13.1}/src/roam/languages/java_lang.py +0 -0
  1008. {roam_code-13.0 → roam_code-13.1}/src/roam/languages/javascript_lang.py +0 -0
  1009. {roam_code-13.0 → roam_code-13.1}/src/roam/languages/kotlin_lang.py +0 -0
  1010. {roam_code-13.0 → roam_code-13.1}/src/roam/languages/php_lang.py +0 -0
  1011. {roam_code-13.0 → roam_code-13.1}/src/roam/languages/python_lang.py +0 -0
  1012. {roam_code-13.0 → roam_code-13.1}/src/roam/languages/ruby_lang.py +0 -0
  1013. {roam_code-13.0 → roam_code-13.1}/src/roam/languages/rust_lang.py +0 -0
  1014. {roam_code-13.0 → roam_code-13.1}/src/roam/languages/scala_lang.py +0 -0
  1015. {roam_code-13.0 → roam_code-13.1}/src/roam/languages/sfxml_lang.py +0 -0
  1016. {roam_code-13.0 → roam_code-13.1}/src/roam/languages/sql_lang.py +0 -0
  1017. {roam_code-13.0 → roam_code-13.1}/src/roam/languages/swift_lang.py +0 -0
  1018. {roam_code-13.0 → roam_code-13.1}/src/roam/languages/typescript_lang.py +0 -0
  1019. {roam_code-13.0 → roam_code-13.1}/src/roam/languages/visualforce_lang.py +0 -0
  1020. {roam_code-13.0 → roam_code-13.1}/src/roam/languages/yaml_lang.py +0 -0
  1021. {roam_code-13.0 → roam_code-13.1}/src/roam/laws/__init__.py +0 -0
  1022. {roam_code-13.0 → roam_code-13.1}/src/roam/laws/checker.py +0 -0
  1023. {roam_code-13.0 → roam_code-13.1}/src/roam/laws/serializer.py +0 -0
  1024. {roam_code-13.0 → roam_code-13.1}/src/roam/leases/__init__.py +0 -0
  1025. {roam_code-13.0 → roam_code-13.1}/src/roam/mcp_extras/__init__.py +0 -0
  1026. {roam_code-13.0 → roam_code-13.1}/src/roam/mcp_extras/completions.py +0 -0
  1027. {roam_code-13.0 → roam_code-13.1}/src/roam/mcp_extras/concurrency.py +0 -0
  1028. {roam_code-13.0 → roam_code-13.1}/src/roam/mcp_extras/progress.py +0 -0
  1029. {roam_code-13.0 → roam_code-13.1}/src/roam/mcp_extras/sampling.py +0 -0
  1030. {roam_code-13.0 → roam_code-13.1}/src/roam/mcp_extras/session.py +0 -0
  1031. {roam_code-13.0 → roam_code-13.1}/src/roam/mcp_extras/watcher.py +0 -0
  1032. {roam_code-13.0 → roam_code-13.1}/src/roam/memory/__init__.py +0 -0
  1033. {roam_code-13.0 → roam_code-13.1}/src/roam/memory/store.py +0 -0
  1034. {roam_code-13.0 → roam_code-13.1}/src/roam/modes/__init__.py +0 -0
  1035. {roam_code-13.0 → roam_code-13.1}/src/roam/observability.py +0 -0
  1036. {roam_code-13.0 → roam_code-13.1}/src/roam/output/__init__.py +0 -0
  1037. {roam_code-13.0 → roam_code-13.1}/src/roam/output/errors.py +0 -0
  1038. {roam_code-13.0 → roam_code-13.1}/src/roam/output/framework_filter.py +0 -0
  1039. {roam_code-13.0 → roam_code-13.1}/src/roam/output/mermaid.py +0 -0
  1040. {roam_code-13.0 → roam_code-13.1}/src/roam/output/project_shape.py +0 -0
  1041. {roam_code-13.0 → roam_code-13.1}/src/roam/output/schema_registry.py +0 -0
  1042. {roam_code-13.0 → roam_code-13.1}/src/roam/policy/__init__.py +0 -0
  1043. {roam_code-13.0 → roam_code-13.1}/src/roam/policy/graph_clauses.py +0 -0
  1044. {roam_code-13.0 → roam_code-13.1}/src/roam/quality/__init__.py +0 -0
  1045. {roam_code-13.0 → roam_code-13.1}/src/roam/quality/ai_rot.py +0 -0
  1046. {roam_code-13.0 → roam_code-13.1}/src/roam/quality/cycles.py +0 -0
  1047. {roam_code-13.0 → roam_code-13.1}/src/roam/quality/god_components.py +0 -0
  1048. {roam_code-13.0 → roam_code-13.1}/src/roam/quality/public_symbols.py +0 -0
  1049. {roam_code-13.0 → roam_code-13.1}/src/roam/refactor/__init__.py +0 -0
  1050. {roam_code-13.0 → roam_code-13.1}/src/roam/refactor/codegen.py +0 -0
  1051. {roam_code-13.0 → roam_code-13.1}/src/roam/refactor/transforms.py +0 -0
  1052. {roam_code-13.0 → roam_code-13.1}/src/roam/retrieve/__init__.py +0 -0
  1053. {roam_code-13.0 → roam_code-13.1}/src/roam/retrieve/pipeline.py +0 -0
  1054. {roam_code-13.0 → roam_code-13.1}/src/roam/rules/__init__.py +0 -0
  1055. {roam_code-13.0 → roam_code-13.1}/src/roam/rules/ast_match.py +0 -0
  1056. {roam_code-13.0 → roam_code-13.1}/src/roam/runs/__init__.py +0 -0
  1057. {roam_code-13.0 → roam_code-13.1}/src/roam/runs/signing.py +0 -0
  1058. {roam_code-13.0 → roam_code-13.1}/src/roam/runtime/__init__.py +0 -0
  1059. {roam_code-13.0 → roam_code-13.1}/src/roam/runtime/daemon.py +0 -0
  1060. {roam_code-13.0 → roam_code-13.1}/src/roam/runtime/graph_backend.py +0 -0
  1061. {roam_code-13.0 → roam_code-13.1}/src/roam/runtime/hotspots.py +0 -0
  1062. {roam_code-13.0 → roam_code-13.1}/src/roam/runtime/lock_modes.py +0 -0
  1063. {roam_code-13.0 → roam_code-13.1}/src/roam/runtime/lockmgr.py +0 -0
  1064. {roam_code-13.0 → roam_code-13.1}/src/roam/runtime/trace_ingest.py +0 -0
  1065. {roam_code-13.0 → roam_code-13.1}/src/roam/search/__init__.py +0 -0
  1066. {roam_code-13.0 → roam_code-13.1}/src/roam/search/framework_packs.py +0 -0
  1067. {roam_code-13.0 → roam_code-13.1}/src/roam/search/onnx_embeddings.py +0 -0
  1068. {roam_code-13.0 → roam_code-13.1}/src/roam/security/__init__.py +0 -0
  1069. {roam_code-13.0 → roam_code-13.1}/src/roam/security/aibom_extension.py +0 -0
  1070. {roam_code-13.0 → roam_code-13.1}/src/roam/security/sbom_reachability.py +0 -0
  1071. {roam_code-13.0 → roam_code-13.1}/src/roam/security/taint_classifier.py +0 -0
  1072. {roam_code-13.0 → roam_code-13.1}/src/roam/security/vuln_reach.py +0 -0
  1073. {roam_code-13.0 → roam_code-13.1}/src/roam/security/vuln_store.py +0 -0
  1074. {roam_code-13.0 → roam_code-13.1}/src/roam/telemetry.py +0 -0
  1075. {roam_code-13.0 → roam_code-13.1}/src/roam/templates/__init__.py +0 -0
  1076. {roam_code-13.0 → roam_code-13.1}/src/roam/templates/ci/__init__.py +0 -0
  1077. {roam_code-13.0 → roam_code-13.1}/src/roam/templates/ci/agent-review.yml +0 -0
  1078. {roam_code-13.0 → roam_code-13.1}/src/roam/workspace/__init__.py +0 -0
  1079. {roam_code-13.0 → roam_code-13.1}/src/roam/workspace/aggregator.py +0 -0
  1080. {roam_code-13.0 → roam_code-13.1}/src/roam/workspace/api_scanner.py +0 -0
  1081. {roam_code-13.0 → roam_code-13.1}/src/roam/workspace/config.py +0 -0
  1082. {roam_code-13.0 → roam_code-13.1}/src/roam/workspace/db.py +0 -0
  1083. {roam_code-13.0 → roam_code-13.1}/src/roam/world_model/__init__.py +0 -0
  1084. {roam_code-13.0 → roam_code-13.1}/src/roam/world_model/idempotency.py +0 -0
  1085. {roam_code-13.0 → roam_code-13.1}/src/roam_code.egg-info/dependency_links.txt +0 -0
  1086. {roam_code-13.0 → roam_code-13.1}/src/roam_code.egg-info/entry_points.txt +0 -0
  1087. {roam_code-13.0 → roam_code-13.1}/src/roam_code.egg-info/top_level.txt +0 -0
  1088. {roam_code-13.0 → roam_code-13.1}/tests/test_adrs.py +0 -0
  1089. {roam_code-13.0 → roam_code-13.1}/tests/test_agent_export.py +0 -0
  1090. {roam_code-13.0 → roam_code-13.1}/tests/test_agent_mode.py +0 -0
  1091. {roam_code-13.0 → roam_code-13.1}/tests/test_agent_modes.py +0 -0
  1092. {roam_code-13.0 → roam_code-13.1}/tests/test_agent_score.py +0 -0
  1093. {roam_code-13.0 → roam_code-13.1}/tests/test_ai_ratio.py +0 -0
  1094. {roam_code-13.0 → roam_code-13.1}/tests/test_ai_readiness.py +0 -0
  1095. {roam_code-13.0 → roam_code-13.1}/tests/test_ai_rot_reconciliation.py +0 -0
  1096. {roam_code-13.0 → roam_code-13.1}/tests/test_algo_nested_lookup_dataflow.py +0 -0
  1097. {roam_code-13.0 → roam_code-13.1}/tests/test_anomaly.py +0 -0
  1098. {roam_code-13.0 → roam_code-13.1}/tests/test_api_changes.py +0 -0
  1099. {roam_code-13.0 → roam_code-13.1}/tests/test_api_drift.py +0 -0
  1100. {roam_code-13.0 → roam_code-13.1}/tests/test_architecture_drift.py +0 -0
  1101. {roam_code-13.0 → roam_code-13.1}/tests/test_ask.py +0 -0
  1102. {roam_code-13.0 → roam_code-13.1}/tests/test_atomic_io_consolidation.py +0 -0
  1103. {roam_code-13.0 → roam_code-13.1}/tests/test_attest.py +0 -0
  1104. {roam_code-13.0 → roam_code-13.1}/tests/test_audit_trail_aggregate.py +0 -0
  1105. {roam_code-13.0 → roam_code-13.1}/tests/test_audit_trail_conformance.py +0 -0
  1106. {roam_code-13.0 → roam_code-13.1}/tests/test_audit_trail_sequence.py +0 -0
  1107. {roam_code-13.0 → roam_code-13.1}/tests/test_audit_trail_verify.py +0 -0
  1108. {roam_code-13.0 → roam_code-13.1}/tests/test_auth_gaps.py +0 -0
  1109. {roam_code-13.0 → roam_code-13.1}/tests/test_auth_gaps_helper_indirection.py +0 -0
  1110. {roam_code-13.0 → roam_code-13.1}/tests/test_backend_fixes_round2.py +0 -0
  1111. {roam_code-13.0 → roam_code-13.1}/tests/test_backend_fixes_round3.py +0 -0
  1112. {roam_code-13.0 → roam_code-13.1}/tests/test_basic.py +0 -0
  1113. {roam_code-13.0 → roam_code-13.1}/tests/test_batch_search_paths.py +0 -0
  1114. {roam_code-13.0 → roam_code-13.1}/tests/test_bisect.py +0 -0
  1115. {roam_code-13.0 → roam_code-13.1}/tests/test_bridge_django.py +0 -0
  1116. {roam_code-13.0 → roam_code-13.1}/tests/test_bridges.py +0 -0
  1117. {roam_code-13.0 → roam_code-13.1}/tests/test_bridges_extended.py +0 -0
  1118. {roam_code-13.0 → roam_code-13.1}/tests/test_brief.py +0 -0
  1119. {roam_code-13.0 → roam_code-13.1}/tests/test_budget.py +0 -0
  1120. {roam_code-13.0 → roam_code-13.1}/tests/test_budget_flag.py +0 -0
  1121. {roam_code-13.0 → roam_code-13.1}/tests/test_budget_phase2.py +0 -0
  1122. {roam_code-13.0 → roam_code-13.1}/tests/test_bus_factor.py +0 -0
  1123. {roam_code-13.0 → roam_code-13.1}/tests/test_bus_factor_excludes.py +0 -0
  1124. {roam_code-13.0 → roam_code-13.1}/tests/test_canonical_constant_citations.py +0 -0
  1125. {roam_code-13.0 → roam_code-13.1}/tests/test_capability_decoration.py +0 -0
  1126. {roam_code-13.0 → roam_code-13.1}/tests/test_capability_registry.py +0 -0
  1127. {roam_code-13.0 → roam_code-13.1}/tests/test_capsule.py +0 -0
  1128. {roam_code-13.0 → roam_code-13.1}/tests/test_cga.py +0 -0
  1129. {roam_code-13.0 → roam_code-13.1}/tests/test_cga_dirty_hash_binding.py +0 -0
  1130. {roam_code-13.0 → roam_code-13.1}/tests/test_cga_fail_closed.py +0 -0
  1131. {roam_code-13.0 → roam_code-13.1}/tests/test_cli_cache_atomic.py +0 -0
  1132. {roam_code-13.0 → roam_code-13.1}/tests/test_cli_responses_write.py +0 -0
  1133. {roam_code-13.0 → roam_code-13.1}/tests/test_clones.py +0 -0
  1134. {roam_code-13.0 → roam_code-13.1}/tests/test_cmd_mcp_fast_startup.py +0 -0
  1135. {roam_code-13.0 → roam_code-13.1}/tests/test_codeowners.py +0 -0
  1136. {roam_code-13.0 → roam_code-13.1}/tests/test_command_help_template.py +0 -0
  1137. {roam_code-13.0 → roam_code-13.1}/tests/test_compare_cli.py +0 -0
  1138. {roam_code-13.0 → roam_code-13.1}/tests/test_competitor_site_data.py +0 -0
  1139. {roam_code-13.0 → roam_code-13.1}/tests/test_complete_prefix.py +0 -0
  1140. {roam_code-13.0 → roam_code-13.1}/tests/test_compound_registry.py +0 -0
  1141. {roam_code-13.0 → roam_code-13.1}/tests/test_comprehensive.py +0 -0
  1142. {roam_code-13.0 → roam_code-13.1}/tests/test_config.py +0 -0
  1143. {roam_code-13.0 → roam_code-13.1}/tests/test_congestion.py +0 -0
  1144. {roam_code-13.0 → roam_code-13.1}/tests/test_context_propagation.py +0 -0
  1145. {roam_code-13.0 → roam_code-13.1}/tests/test_conventions_cmd.py +0 -0
  1146. {roam_code-13.0 → roam_code-13.1}/tests/test_coverage_gaps_cmd.py +0 -0
  1147. {roam_code-13.0 → roam_code-13.1}/tests/test_coverage_ingestion.py +0 -0
  1148. {roam_code-13.0 → roam_code-13.1}/tests/test_cut.py +0 -0
  1149. {roam_code-13.0 → roam_code-13.1}/tests/test_dark_matter.py +0 -0
  1150. {roam_code-13.0 → roam_code-13.1}/tests/test_dark_matter_helpers.py +0 -0
  1151. {roam_code-13.0 → roam_code-13.1}/tests/test_dart.py +0 -0
  1152. {roam_code-13.0 → roam_code-13.1}/tests/test_dashboard_unique_signals.py +0 -0
  1153. {roam_code-13.0 → roam_code-13.1}/tests/test_db_user_version.py +0 -0
  1154. {roam_code-13.0 → roam_code-13.1}/tests/test_dead_vue_consumers.py +0 -0
  1155. {roam_code-13.0 → roam_code-13.1}/tests/test_defer_loading.py +0 -0
  1156. {roam_code-13.0 → roam_code-13.1}/tests/test_demo_gif_asset.py +0 -0
  1157. {roam_code-13.0 → roam_code-13.1}/tests/test_describe.py +0 -0
  1158. {roam_code-13.0 → roam_code-13.1}/tests/test_describe_stack_leak.py +0 -0
  1159. {roam_code-13.0 → roam_code-13.1}/tests/test_detail_flag.py +0 -0
  1160. {roam_code-13.0 → roam_code-13.1}/tests/test_detail_flag_hints.py +0 -0
  1161. {roam_code-13.0 → roam_code-13.1}/tests/test_detector_precision.py +0 -0
  1162. {roam_code-13.0 → roam_code-13.1}/tests/test_deterministic_output.py +0 -0
  1163. {roam_code-13.0 → roam_code-13.1}/tests/test_diff_empty_state.py +0 -0
  1164. {roam_code-13.0 → roam_code-13.1}/tests/test_difficulty_scoring.py +0 -0
  1165. {roam_code-13.0 → roam_code-13.1}/tests/test_doc_staleness.py +0 -0
  1166. {roam_code-13.0 → roam_code-13.1}/tests/test_docker_assets.py +0 -0
  1167. {roam_code-13.0 → roam_code-13.1}/tests/test_docs_coverage.py +0 -0
  1168. {roam_code-13.0 → roam_code-13.1}/tests/test_docs_site_quality.py +0 -0
  1169. {roam_code-13.0 → roam_code-13.1}/tests/test_doctor_breadcrumb.py +0 -0
  1170. {roam_code-13.0 → roam_code-13.1}/tests/test_doctor_hints_in_errors.py +0 -0
  1171. {roam_code-13.0 → roam_code-13.1}/tests/test_doctor_refresh_install.py +0 -0
  1172. {roam_code-13.0 → roam_code-13.1}/tests/test_doctor_stale_signal_advisory.py +0 -0
  1173. {roam_code-13.0 → roam_code-13.1}/tests/test_dogfood.py +0 -0
  1174. {roam_code-13.0 → roam_code-13.1}/tests/test_dogfood_aggregate.py +0 -0
  1175. {roam_code-13.0 → roam_code-13.1}/tests/test_dogfood_dedup_check_e2e.py +0 -0
  1176. {roam_code-13.0 → roam_code-13.1}/tests/test_drift.py +0 -0
  1177. {roam_code-13.0 → roam_code-13.1}/tests/test_drift_by_team.py +0 -0
  1178. {roam_code-13.0 → roam_code-13.1}/tests/test_duplicates.py +0 -0
  1179. {roam_code-13.0 → roam_code-13.1}/tests/test_duplicates_bounded.py +0 -0
  1180. {roam_code-13.0 → roam_code-13.1}/tests/test_effects.py +0 -0
  1181. {roam_code-13.0 → roam_code-13.1}/tests/test_effects_propagation.py +0 -0
  1182. {roam_code-13.0 → roam_code-13.1}/tests/test_empty_state_framing.py +0 -0
  1183. {roam_code-13.0 → roam_code-13.1}/tests/test_endpoints.py +0 -0
  1184. {roam_code-13.0 → roam_code-13.1}/tests/test_entry_points_cmd.py +0 -0
  1185. {roam_code-13.0 → roam_code-13.1}/tests/test_eval_retrieve.py +0 -0
  1186. {roam_code-13.0 → roam_code-13.1}/tests/test_except_pass_narrow.py +0 -0
  1187. {roam_code-13.0 → roam_code-13.1}/tests/test_exclude_patterns.py +0 -0
  1188. {roam_code-13.0 → roam_code-13.1}/tests/test_exit_codes.py +0 -0
  1189. {roam_code-13.0 → roam_code-13.1}/tests/test_extension_constant_consolidation.py +0 -0
  1190. {roam_code-13.0 → roam_code-13.1}/tests/test_extension_versioning.py +0 -0
  1191. {roam_code-13.0 → roam_code-13.1}/tests/test_extractor_grammar_drift.py +0 -0
  1192. {roam_code-13.0 → roam_code-13.1}/tests/test_extractor_smoke.py +0 -0
  1193. {roam_code-13.0 → roam_code-13.1}/tests/test_fallback_contracts.py +0 -0
  1194. {roam_code-13.0 → roam_code-13.1}/tests/test_fetch_handle_chunked.py +0 -0
  1195. {roam_code-13.0 → roam_code-13.1}/tests/test_file_roles.py +0 -0
  1196. {roam_code-13.0 → roam_code-13.1}/tests/test_finding_suppress.py +0 -0
  1197. {roam_code-13.0 → roam_code-13.1}/tests/test_fingerprint.py +0 -0
  1198. {roam_code-13.0 → roam_code-13.1}/tests/test_first_error_message_preserved.py +0 -0
  1199. {roam_code-13.0 → roam_code-13.1}/tests/test_fixes.py +0 -0
  1200. {roam_code-13.0 → roam_code-13.1}/tests/test_flag_dead.py +0 -0
  1201. {roam_code-13.0 → roam_code-13.1}/tests/test_fleet.py +0 -0
  1202. {roam_code-13.0 → roam_code-13.1}/tests/test_fn_coupling.py +0 -0
  1203. {roam_code-13.0 → roam_code-13.1}/tests/test_forecast.py +0 -0
  1204. {roam_code-13.0 → roam_code-13.1}/tests/test_formatter_agent_contract.py +0 -0
  1205. {roam_code-13.0 → roam_code-13.1}/tests/test_formatters.py +0 -0
  1206. {roam_code-13.0 → roam_code-13.1}/tests/test_foxpro.py +0 -0
  1207. {roam_code-13.0 → roam_code-13.1}/tests/test_framework_detection.py +0 -0
  1208. {roam_code-13.0 → roam_code-13.1}/tests/test_fts5_incremental.py +0 -0
  1209. {roam_code-13.0 → roam_code-13.1}/tests/test_gate_presets.py +0 -0
  1210. {roam_code-13.0 → roam_code-13.1}/tests/test_git_helpers.py +0 -0
  1211. {roam_code-13.0 → roam_code-13.1}/tests/test_git_utils.py +0 -0
  1212. {roam_code-13.0 → roam_code-13.1}/tests/test_global_ci_mode.py +0 -0
  1213. {roam_code-13.0 → roam_code-13.1}/tests/test_graph_versioning.py +0 -0
  1214. {roam_code-13.0 → roam_code-13.1}/tests/test_grep_extended.py +0 -0
  1215. {roam_code-13.0 → roam_code-13.1}/tests/test_grep_integration.py +0 -0
  1216. {roam_code-13.0 → roam_code-13.1}/tests/test_grep_performance.py +0 -0
  1217. {roam_code-13.0 → roam_code-13.1}/tests/test_grep_xlang.py +0 -0
  1218. {roam_code-13.0 → roam_code-13.1}/tests/test_health_baseline.py +0 -0
  1219. {roam_code-13.0 → roam_code-13.1}/tests/test_health_gate.py +0 -0
  1220. {roam_code-13.0 → roam_code-13.1}/tests/test_hooks.py +0 -0
  1221. {roam_code-13.0 → roam_code-13.1}/tests/test_hotspots.py +0 -0
  1222. {roam_code-13.0 → roam_code-13.1}/tests/test_hover.py +0 -0
  1223. {roam_code-13.0 → roam_code-13.1}/tests/test_idempotency.py +0 -0
  1224. {roam_code-13.0 → roam_code-13.1}/tests/test_index.py +0 -0
  1225. {roam_code-13.0 → roam_code-13.1}/tests/test_index_bundle.py +0 -0
  1226. {roam_code-13.0 → roam_code-13.1}/tests/test_init_cmd.py +0 -0
  1227. {roam_code-13.0 → roam_code-13.1}/tests/test_init_no_unsolicited_writes.py +0 -0
  1228. {roam_code-13.0 → roam_code-13.1}/tests/test_intent.py +0 -0
  1229. {roam_code-13.0 → roam_code-13.1}/tests/test_invariants.py +0 -0
  1230. {roam_code-13.0 → roam_code-13.1}/tests/test_iri_migration.py +0 -0
  1231. {roam_code-13.0 → roam_code-13.1}/tests/test_json_error_envelope.py +0 -0
  1232. {roam_code-13.0 → roam_code-13.1}/tests/test_kotlin_swift_extractors.py +0 -0
  1233. {roam_code-13.0 → roam_code-13.1}/tests/test_laravel_fp_fixes.py +0 -0
  1234. {roam_code-13.0 → roam_code-13.1}/tests/test_law4_anchor_counts.py +0 -0
  1235. {roam_code-13.0 → roam_code-13.1}/tests/test_ledger_signing.py +0 -0
  1236. {roam_code-13.0 → roam_code-13.1}/tests/test_library_api.py +0 -0
  1237. {roam_code-13.0 → roam_code-13.1}/tests/test_loop_e2e.py +0 -0
  1238. {roam_code-13.0 → roam_code-13.1}/tests/test_loop_performance.py +0 -0
  1239. {roam_code-13.0 → roam_code-13.1}/tests/test_manifest.py +0 -0
  1240. {roam_code-13.0 → roam_code-13.1}/tests/test_math_fp_fixes.py +0 -0
  1241. {roam_code-13.0 → roam_code-13.1}/tests/test_math_tips.py +0 -0
  1242. {roam_code-13.0 → roam_code-13.1}/tests/test_mcp_batch_search_complete_parity.py +0 -0
  1243. {roam_code-13.0 → roam_code-13.1}/tests/test_mcp_contract_enforcement.py +0 -0
  1244. {roam_code-13.0 → roam_code-13.1}/tests/test_mcp_handle_off.py +0 -0
  1245. {roam_code-13.0 → roam_code-13.1}/tests/test_mcp_json_parse_defense.py +0 -0
  1246. {roam_code-13.0 → roam_code-13.1}/tests/test_mcp_param_aliases.py +0 -0
  1247. {roam_code-13.0 → roam_code-13.1}/tests/test_mcp_setup.py +0 -0
  1248. {roam_code-13.0 → roam_code-13.1}/tests/test_mcp_setup_write.py +0 -0
  1249. {roam_code-13.0 → roam_code-13.1}/tests/test_mcp_tool_telemetry.py +0 -0
  1250. {roam_code-13.0 → roam_code-13.1}/tests/test_mcp_tool_versioning.py +0 -0
  1251. {roam_code-13.0 → roam_code-13.1}/tests/test_memory_substrate.py +0 -0
  1252. {roam_code-13.0 → roam_code-13.1}/tests/test_metrics_cmd.py +0 -0
  1253. {roam_code-13.0 → roam_code-13.1}/tests/test_metrics_push.py +0 -0
  1254. {roam_code-13.0 → roam_code-13.1}/tests/test_migration_plan.py +0 -0
  1255. {roam_code-13.0 → roam_code-13.1}/tests/test_migration_safety.py +0 -0
  1256. {roam_code-13.0 → roam_code-13.1}/tests/test_minimap.py +0 -0
  1257. {roam_code-13.0 → roam_code-13.1}/tests/test_mode_bootstrap_allowlist.py +0 -0
  1258. {roam_code-13.0 → roam_code-13.1}/tests/test_mode_enforcement_dispatch.py +0 -0
  1259. {roam_code-13.0 → roam_code-13.1}/tests/test_mutate.py +0 -0
  1260. {roam_code-13.0 → roam_code-13.1}/tests/test_mutate_apply.py +0 -0
  1261. {roam_code-13.0 → roam_code-13.1}/tests/test_n1.py +0 -0
  1262. {roam_code-13.0 → roam_code-13.1}/tests/test_next_router.py +0 -0
  1263. {roam_code-13.0 → roam_code-13.1}/tests/test_next_steps.py +0 -0
  1264. {roam_code-13.0 → roam_code-13.1}/tests/test_oracle.py +0 -0
  1265. {roam_code-13.0 → roam_code-13.1}/tests/test_orchestrate.py +0 -0
  1266. {roam_code-13.0 → roam_code-13.1}/tests/test_orphan_routes.py +0 -0
  1267. {roam_code-13.0 → roam_code-13.1}/tests/test_oss_bench_harness.py +0 -0
  1268. {roam_code-13.0 → roam_code-13.1}/tests/test_over_fetch.py +0 -0
  1269. {roam_code-13.0 → roam_code-13.1}/tests/test_over_fetch_three_state.py +0 -0
  1270. {roam_code-13.0 → roam_code-13.1}/tests/test_pagerank_truncation.py +0 -0
  1271. {roam_code-13.0 → roam_code-13.1}/tests/test_parallel_analyzers.py +0 -0
  1272. {roam_code-13.0 → roam_code-13.1}/tests/test_partition.py +0 -0
  1273. {roam_code-13.0 → roam_code-13.1}/tests/test_pattern3c_reconciliation.py +0 -0
  1274. {roam_code-13.0 → roam_code-13.1}/tests/test_patterns_cmd.py +0 -0
  1275. {roam_code-13.0 → roam_code-13.1}/tests/test_performance.py +0 -0
  1276. {roam_code-13.0 → roam_code-13.1}/tests/test_personalized_pagerank.py +0 -0
  1277. {roam_code-13.0 → roam_code-13.1}/tests/test_phase0_commands.py +0 -0
  1278. {roam_code-13.0 → roam_code-13.1}/tests/test_plugin_discovery.py +0 -0
  1279. {roam_code-13.0 → roam_code-13.1}/tests/test_plugin_dogfood_rails.py +0 -0
  1280. {roam_code-13.0 → roam_code-13.1}/tests/test_policy_graph_clauses.py +0 -0
  1281. {roam_code-13.0 → roam_code-13.1}/tests/test_pr_analyze.py +0 -0
  1282. {roam_code-13.0 → roam_code-13.1}/tests/test_pr_analyze_cache.py +0 -0
  1283. {roam_code-13.0 → roam_code-13.1}/tests/test_pr_analyze_diff_failure_propagation.py +0 -0
  1284. {roam_code-13.0 → roam_code-13.1}/tests/test_pr_analyze_edge_cases.py +0 -0
  1285. {roam_code-13.0 → roam_code-13.1}/tests/test_pr_analyze_helpers.py +0 -0
  1286. {roam_code-13.0 → roam_code-13.1}/tests/test_pr_analyze_v2_signals.py +0 -0
  1287. {roam_code-13.0 → roam_code-13.1}/tests/test_pr_bundle_nonexistent_symbol.py +0 -0
  1288. {roam_code-13.0 → roam_code-13.1}/tests/test_pr_comment_render.py +0 -0
  1289. {roam_code-13.0 → roam_code-13.1}/tests/test_pr_comment_script.py +0 -0
  1290. {roam_code-13.0 → roam_code-13.1}/tests/test_pr_diff.py +0 -0
  1291. {roam_code-13.0 → roam_code-13.1}/tests/test_pr_risk_author.py +0 -0
  1292. {roam_code-13.0 → roam_code-13.1}/tests/test_progress.py +0 -0
  1293. {roam_code-13.0 → roam_code-13.1}/tests/test_progressive_disclosure.py +0 -0
  1294. {roam_code-13.0 → roam_code-13.1}/tests/test_properties.py +0 -0
  1295. {roam_code-13.0 → roam_code-13.1}/tests/test_python_extractor_v2.py +0 -0
  1296. {roam_code-13.0 → roam_code-13.1}/tests/test_python_idioms_e2e.py +0 -0
  1297. {roam_code-13.0 → roam_code-13.1}/tests/test_python_pivot.py +0 -0
  1298. {roam_code-13.0 → roam_code-13.1}/tests/test_realworld_feedback.py +0 -0
  1299. {roam_code-13.0 → roam_code-13.1}/tests/test_refactoring_intelligence.py +0 -0
  1300. {roam_code-13.0 → roam_code-13.1}/tests/test_regression_fp_corpus.py +0 -0
  1301. {roam_code-13.0 → roam_code-13.1}/tests/test_relate.py +0 -0
  1302. {roam_code-13.0 → roam_code-13.1}/tests/test_rename_edge_recovery.py +0 -0
  1303. {roam_code-13.0 → roam_code-13.1}/tests/test_replay.py +0 -0
  1304. {roam_code-13.0 → roam_code-13.1}/tests/test_report.py +0 -0
  1305. {roam_code-13.0 → roam_code-13.1}/tests/test_reset_clean.py +0 -0
  1306. {roam_code-13.0 → roam_code-13.1}/tests/test_resolve.py +0 -0
  1307. {roam_code-13.0 → roam_code-13.1}/tests/test_response_volume_handles.py +0 -0
  1308. {roam_code-13.0 → roam_code-13.1}/tests/test_retrieve_cross_repo.py +0 -0
  1309. {roam_code-13.0 → roam_code-13.1}/tests/test_retrieve_seeds.py +0 -0
  1310. {roam_code-13.0 → roam_code-13.1}/tests/test_risk.py +0 -0
  1311. {roam_code-13.0 → roam_code-13.1}/tests/test_ruby.py +0 -0
  1312. {roam_code-13.0 → roam_code-13.1}/tests/test_rule_profiles.py +0 -0
  1313. {roam_code-13.0 → roam_code-13.1}/tests/test_rules.py +0 -0
  1314. {roam_code-13.0 → roam_code-13.1}/tests/test_rules_ast_match.py +0 -0
  1315. {roam_code-13.0 → roam_code-13.1}/tests/test_rules_community_pack.py +0 -0
  1316. {roam_code-13.0 → roam_code-13.1}/tests/test_rules_dataflow.py +0 -0
  1317. {roam_code-13.0 → roam_code-13.1}/tests/test_rules_validate.py +0 -0
  1318. {roam_code-13.0 → roam_code-13.1}/tests/test_runs_auto_log.py +0 -0
  1319. {roam_code-13.0 → roam_code-13.1}/tests/test_runs_end_with_bundle.py +0 -0
  1320. {roam_code-13.0 → roam_code-13.1}/tests/test_runs_ledger.py +0 -0
  1321. {roam_code-13.0 → roam_code-13.1}/tests/test_runtime.py +0 -0
  1322. {roam_code-13.0 → roam_code-13.1}/tests/test_runtime_score.py +0 -0
  1323. {roam_code-13.0 → roam_code-13.1}/tests/test_salesforce.py +0 -0
  1324. {roam_code-13.0 → roam_code-13.1}/tests/test_sarif_consumer_list.py +0 -0
  1325. {roam_code-13.0 → roam_code-13.1}/tests/test_sarif_enrichment.py +0 -0
  1326. {roam_code-13.0 → roam_code-13.1}/tests/test_sbom.py +0 -0
  1327. {roam_code-13.0 → roam_code-13.1}/tests/test_sbom_fp_categories.py +0 -0
  1328. {roam_code-13.0 → roam_code-13.1}/tests/test_scala.py +0 -0
  1329. {roam_code-13.0 → roam_code-13.1}/tests/test_schema_versioning.py +0 -0
  1330. {roam_code-13.0 → roam_code-13.1}/tests/test_search_explain.py +0 -0
  1331. {roam_code-13.0 → roam_code-13.1}/tests/test_secrets.py +0 -0
  1332. {roam_code-13.0 → roam_code-13.1}/tests/test_secrets_v2.py +0 -0
  1333. {roam_code-13.0 → roam_code-13.1}/tests/test_semantic_onnx.py +0 -0
  1334. {roam_code-13.0 → roam_code-13.1}/tests/test_side_effects.py +0 -0
  1335. {roam_code-13.0 → roam_code-13.1}/tests/test_simulate_departure.py +0 -0
  1336. {roam_code-13.0 → roam_code-13.1}/tests/test_situation_compounds.py +0 -0
  1337. {roam_code-13.0 → roam_code-13.1}/tests/test_sketch.py +0 -0
  1338. {roam_code-13.0 → roam_code-13.1}/tests/test_skill_generate.py +0 -0
  1339. {roam_code-13.0 → roam_code-13.1}/tests/test_smoke.py +0 -0
  1340. {roam_code-13.0 → roam_code-13.1}/tests/test_sna_metrics.py +0 -0
  1341. {roam_code-13.0 → roam_code-13.1}/tests/test_spectral.py +0 -0
  1342. {roam_code-13.0 → roam_code-13.1}/tests/test_spectral_bounded.py +0 -0
  1343. {roam_code-13.0 → roam_code-13.1}/tests/test_split_cmd.py +0 -0
  1344. {roam_code-13.0 → roam_code-13.1}/tests/test_sql.py +0 -0
  1345. {roam_code-13.0 → roam_code-13.1}/tests/test_staged_rollout_readiness.py +0 -0
  1346. {roam_code-13.0 → roam_code-13.1}/tests/test_stale_db_dir_error.py +0 -0
  1347. {roam_code-13.0 → roam_code-13.1}/tests/test_stale_refs_corruption.py +0 -0
  1348. {roam_code-13.0 → roam_code-13.1}/tests/test_stale_refs_dogfood_fixes.py +0 -0
  1349. {roam_code-13.0 → roam_code-13.1}/tests/test_suggest_reviewers.py +0 -0
  1350. {roam_code-13.0 → roam_code-13.1}/tests/test_supply_chain.py +0 -0
  1351. {roam_code-13.0 → roam_code-13.1}/tests/test_synergy_agents_md_mode.py +0 -0
  1352. {roam_code-13.0 → roam_code-13.1}/tests/test_synergy_next_mode.py +0 -0
  1353. {roam_code-13.0 → roam_code-13.1}/tests/test_synergy_pr_bundle_mode.py +0 -0
  1354. {roam_code-13.0 → roam_code-13.1}/tests/test_synergy_runs_mode.py +0 -0
  1355. {roam_code-13.0 → roam_code-13.1}/tests/test_syntax_check.py +0 -0
  1356. {roam_code-13.0 → roam_code-13.1}/tests/test_taint_classifier.py +0 -0
  1357. {roam_code-13.0 → roam_code-13.1}/tests/test_taint_intraprocedural.py +0 -0
  1358. {roam_code-13.0 → roam_code-13.1}/tests/test_test_conventions.py +0 -0
  1359. {roam_code-13.0 → roam_code-13.1}/tests/test_test_detection_consolidation.py +0 -0
  1360. {roam_code-13.0 → roam_code-13.1}/tests/test_test_gaps.py +0 -0
  1361. {roam_code-13.0 → roam_code-13.1}/tests/test_test_scaffold.py +0 -0
  1362. {roam_code-13.0 → roam_code-13.1}/tests/test_testmap.py +0 -0
  1363. {roam_code-13.0 → roam_code-13.1}/tests/test_top_flag_consistency.py +0 -0
  1364. {roam_code-13.0 → roam_code-13.1}/tests/test_tour_cmd.py +0 -0
  1365. {roam_code-13.0 → roam_code-13.1}/tests/test_trace_bounded.py +0 -0
  1366. {roam_code-13.0 → roam_code-13.1}/tests/test_trends.py +0 -0
  1367. {roam_code-13.0 → roam_code-13.1}/tests/test_trends_cohort.py +0 -0
  1368. {roam_code-13.0 → roam_code-13.1}/tests/test_triage.py +0 -0
  1369. {roam_code-13.0 → roam_code-13.1}/tests/test_tx_boundaries.py +0 -0
  1370. {roam_code-13.0 → roam_code-13.1}/tests/test_uses_cmd.py +0 -0
  1371. {roam_code-13.0 → roam_code-13.1}/tests/test_v1216_passes.py +0 -0
  1372. {roam_code-13.0 → roam_code-13.1}/tests/test_v1216_passes_41_50.py +0 -0
  1373. {roam_code-13.0 → roam_code-13.1}/tests/test_v1216_passes_51_60.py +0 -0
  1374. {roam_code-13.0 → roam_code-13.1}/tests/test_v1217_passes_61_80.py +0 -0
  1375. {roam_code-13.0 → roam_code-13.1}/tests/test_v1218_passes_81_90.py +0 -0
  1376. {roam_code-13.0 → roam_code-13.1}/tests/test_v1219_passes_91_100.py +0 -0
  1377. {roam_code-13.0 → roam_code-13.1}/tests/test_v1220_passes_101_110.py +0 -0
  1378. {roam_code-13.0 → roam_code-13.1}/tests/test_v1221_query_timeout.py +0 -0
  1379. {roam_code-13.0 → roam_code-13.1}/tests/test_v1221_untested_commands.py +0 -0
  1380. {roam_code-13.0 → roam_code-13.1}/tests/test_v12_2.py +0 -0
  1381. {roam_code-13.0 → roam_code-13.1}/tests/test_v2_edge_cases.py +0 -0
  1382. {roam_code-13.0 → roam_code-13.1}/tests/test_v2_integration.py +0 -0
  1383. {roam_code-13.0 → roam_code-13.1}/tests/test_v6_features.py +0 -0
  1384. {roam_code-13.0 → roam_code-13.1}/tests/test_v71_features.py +0 -0
  1385. {roam_code-13.0 → roam_code-13.1}/tests/test_v7_features.py +0 -0
  1386. {roam_code-13.0 → roam_code-13.1}/tests/test_v82_features.py +0 -0
  1387. {roam_code-13.0 → roam_code-13.1}/tests/test_validate_plan.py +0 -0
  1388. {roam_code-13.0 → roam_code-13.1}/tests/test_verify.py +0 -0
  1389. {roam_code-13.0 → roam_code-13.1}/tests/test_verify_imports.py +0 -0
  1390. {roam_code-13.0 → roam_code-13.1}/tests/test_visualize.py +0 -0
  1391. {roam_code-13.0 → roam_code-13.1}/tests/test_vue_sfc_imports.py +0 -0
  1392. {roam_code-13.0 → roam_code-13.1}/tests/test_vuln.py +0 -0
  1393. {roam_code-13.0 → roam_code-13.1}/tests/test_vulns_cmd.py +0 -0
  1394. {roam_code-13.0 → roam_code-13.1}/tests/test_watch.py +0 -0
  1395. {roam_code-13.0 → roam_code-13.1}/tests/test_why.py +0 -0
  1396. {roam_code-13.0 → roam_code-13.1}/tests/test_why_slow.py +0 -0
  1397. {roam_code-13.0 → roam_code-13.1}/tests/test_workspace.py +0 -0
  1398. {roam_code-13.0 → roam_code-13.1}/tests/test_world_model_classifier_fidelity.py +0 -0
  1399. {roam_code-13.0 → roam_code-13.1}/tests/test_ws_resolve_fixes.py +0 -0
  1400. {roam_code-13.0 → roam_code-13.1}/tests/test_ws_resolve_unmatched.py +0 -0
  1401. {roam_code-13.0 → roam_code-13.1}/tests/test_x_lang_scope.py +0 -0
  1402. {roam_code-13.0 → roam_code-13.1}/tests/test_xlang.py +0 -0
  1403. {roam_code-13.0 → roam_code-13.1}/tests/test_yaml_hcl.py +0 -0
@@ -0,0 +1,2145 @@
1
+ Metadata-Version: 2.4
2
+ Name: roam-code
3
+ Version: 13.1
4
+ Summary: The local structural intelligence layer for coding agents
5
+ Author: Cranot
6
+ License-Expression: Apache-2.0
7
+ Project-URL: Homepage, https://roam-code.com/
8
+ Project-URL: Documentation, https://roam-code.com/docs/
9
+ Project-URL: Repository, https://github.com/Cranot/roam-code
10
+ Project-URL: Issues, https://github.com/Cranot/roam-code/issues
11
+ Project-URL: Changelog, https://github.com/Cranot/roam-code/blob/main/CHANGELOG.md
12
+ Project-URL: Pricing, https://roam-code.com/pricing
13
+ Project-URL: Security, https://roam-code.com/security
14
+ Keywords: code-intelligence,static-analysis,mcp-server,tree-sitter,architecture,code-graph,ai-coding,graph-analysis,code-quality,cli,codebase,code-analysis,ai-tools,mcp,sql
15
+ Classifier: Development Status :: 5 - Production/Stable
16
+ Classifier: Environment :: Console
17
+ Classifier: Intended Audience :: Developers
18
+ Classifier: Operating System :: OS Independent
19
+ Classifier: Programming Language :: Python :: 3
20
+ Classifier: Programming Language :: Python :: 3.10
21
+ Classifier: Programming Language :: Python :: 3.11
22
+ Classifier: Programming Language :: Python :: 3.12
23
+ Classifier: Programming Language :: Python :: 3.13
24
+ Classifier: Topic :: Software Development
25
+ Classifier: Topic :: Software Development :: Code Generators
26
+ Classifier: Topic :: Software Development :: Quality Assurance
27
+ Classifier: Topic :: Software Development :: Libraries :: Python Modules
28
+ Requires-Python: >=3.10
29
+ Description-Content-Type: text/markdown
30
+ License-File: LICENSE
31
+ Requires-Dist: click>=8.0
32
+ Requires-Dist: tree-sitter>=0.23
33
+ Requires-Dist: tree-sitter-language-pack<1.6.3,>=0.6
34
+ Requires-Dist: networkx>=3.0
35
+ Provides-Extra: mcp
36
+ Requires-Dist: fastmcp>=2.0; extra == "mcp"
37
+ Provides-Extra: semantic
38
+ Requires-Dist: numpy>=1.24; extra == "semantic"
39
+ Requires-Dist: onnxruntime>=1.16; extra == "semantic"
40
+ Requires-Dist: tokenizers>=0.15; extra == "semantic"
41
+ Provides-Extra: leiden
42
+ Requires-Dist: igraph>=0.11; extra == "leiden"
43
+ Requires-Dist: leidenalg>=0.10; extra == "leiden"
44
+ Provides-Extra: graph-fast
45
+ Requires-Dist: rustworkx>=0.14; extra == "graph-fast"
46
+ Provides-Extra: sbom
47
+ Requires-Dist: cyclonedx-python-lib>=8.0; extra == "sbom"
48
+ Provides-Extra: learned
49
+ Requires-Dist: lightgbm>=4.0; extra == "learned"
50
+ Provides-Extra: dev
51
+ Requires-Dist: pytest>=7.0; extra == "dev"
52
+ Requires-Dist: pytest-xdist>=3.0; extra == "dev"
53
+ Requires-Dist: pytest-asyncio>=0.23; extra == "dev"
54
+ Requires-Dist: scipy>=1.11; extra == "dev"
55
+ Requires-Dist: fastmcp>=2.0; extra == "dev"
56
+ Requires-Dist: pyyaml>=6.0; extra == "dev"
57
+ Requires-Dist: ruff>=0.4; extra == "dev"
58
+ Requires-Dist: build>=1.0; extra == "dev"
59
+ Requires-Dist: twine>=5.0; extra == "dev"
60
+ Dynamic: license-file
61
+
62
+ <div align="center">
63
+
64
+ # roam-code
65
+
66
+ **Local codebase intelligence for developers and AI agents — maps, gates, and evidence in one CLI.**
67
+
68
+ Roam is the **local codebase intelligence layer** for software work: it parses your repo into a SQLite-backed graph, then turns that graph into maps, retrieval, algorithmic judgment, change-safety gates, and tamper-evident evidence. Agents and developers use the same local facts before a change, during review, and after the patch lands.
69
+
70
+ [![PyPI version](https://img.shields.io/pypi/v/roam-code?style=flat-square&color=blue)](https://pypi.org/project/roam-code/)
71
+ [![GitHub stars](https://img.shields.io/github/stars/Cranot/roam-code?style=flat-square)](https://github.com/Cranot/roam-code/stargazers)
72
+ [![CI](https://github.com/Cranot/roam-code/actions/workflows/roam-ci.yml/badge.svg)](https://github.com/Cranot/roam-code/actions/workflows/roam-ci.yml)
73
+ [![Python 3.10+](https://img.shields.io/badge/python-3.10+-3776AB?logo=python&logoColor=white)](https://www.python.org/downloads/)
74
+ [![License: Apache 2.0](https://img.shields.io/badge/License-Apache_2.0-blue.svg)](https://opensource.org/licenses/Apache-2.0)
75
+
76
+ <sub>238 commands · 224 MCP tools (57 in the default `core` preset) · 28 language families · Apache 2.0 · runs entirely on your machine</sub>
77
+
78
+ </div>
79
+
80
+ ---
81
+
82
+ ### Killer use case: post-rename doc hygiene
83
+
84
+ ```bash
85
+ git mv docs/old-guide.md docs/new-guide.md
86
+ roam stale-refs --fix preview # see what auto-rewrites are safe
87
+ roam stale-refs --fix apply # rewrite README + CHANGELOG + everywhere
88
+ ```
89
+
90
+ `stale-refs` finds every dangling markdown link, HTML href, backtick path, and
91
+ broken `#anchor` across the repo, with confidence-tagged rename hints from git
92
+ history + basename match + LLM enrichment. Composable with `--gate` (CI),
93
+ `--diff` (branch-only), `--baseline-from` (acknowledged debt), `--watch` (live),
94
+ `--check-external` (HTTP validation), `--sarif` (Code Scanning), and a
95
+ companion `roam lsp` server for editor squiggles. See
96
+ [stale-refs in the command table](#commands).
97
+
98
+ ---
99
+
100
+ ## What is Roam?
101
+
102
+ Roam is a **local codebase intelligence engine**. It turns a repository into a queryable model of symbols, calls, imports, dependencies, architecture, git history, tests, risks, smells, security flows, and algorithmic patterns. Developers use it to understand the deeper shape of a codebase; AI agents use it as the structural context they do not have by default.
103
+
104
+ The assurance layer is one product built on top of that engine. Roam can gate an AI-assisted change before it happens and compile tamper-evident evidence after it lands, but the foundation is broader: a local map of what the codebase is, how it behaves, and what a change would touch.
105
+
106
+ <!-- BEGIN auto-count:readme-headline-prose -->
107
+ Mechanically: Roam parses your repo once, stores structural facts in a local SQLite graph (symbols, dependencies, call graphs, architecture layers, git history, runtime traces), and exposes the graph through 238 commands and 224 MCP tools across 28 languages.
108
+ <!-- END auto-count:readme-headline-prose -->
109
+
110
+ ### The senses your agent and team do not get from text alone
111
+
112
+ | Sense | The question agents miss | Roam commands |
113
+ | ----- | ------------------------ | ------------- |
114
+ | **Codebase sight** | "What does this repo do? What should I read?" | `understand` · `map` · `tour` · `describe` · `minimap` |
115
+ | **Context retrieval** | "Pull the exact spans I need for this task." | `retrieve` · `context` · `search-semantic` · `agent-context` |
116
+ | **Change safety** | "What breaks if I edit this? Which tests run?" | `preflight` · `impact` · `affected-tests` · `diff` · `guard` |
117
+ | **PR review** | "Did the AI miss a clone, a caller, a test?" | `critique` · `pr-analyze` · `pr-risk` · `pr-comment-render` |
118
+ | **Algorithmic judgment** | "Is this code *correct but slow*?" | `math` / `algo` · `n1` · `missing-index` · `hotspots` |
119
+ | **Architecture governance** | "Is the architecture drifting?" | `layers` · `cycles` · `clusters` · `health` · `budget` · `fitness` · `dark-matter` |
120
+ | **Refactor safety** | "Can I simulate this refactor first?" | `simulate` · `mutate` · `safe-delete` · `closure` · `plan-refactor` |
121
+ | **Multi-agent coordination** | "Can multiple agents work in parallel?" | `fleet` · `partition` · `orchestrate` · `agent-plan` |
122
+ | **Evidence + compliance** | "Can we prove what was checked?" | `attest` · `cga` · `audit-trail-export` · `audit-trail-verify` · `--sarif` |
123
+
124
+ Roam doesn't replace your linter, SAST, or AI semantic reviewer — it complements them by answering graph-aware questions they don't.
125
+
126
+ ### Algorithmic Risk Review (the differentiator)
127
+
128
+ `roam math` (alias `roam algo`) detects **code that is correct but computationally wrong** — exactly the class of patterns AI agents ship that pass tests and fail at scale:
129
+
130
+ - nested-loop lookups that quietly become O(n²)
131
+ - N+1 database query patterns
132
+ - regex compilation inside hot loops
133
+ - repeated JSON parsing of the same payload
134
+ - quadratic string concatenation
135
+ - branching recursion without memoisation
136
+ - expensive work inside request / render loops
137
+
138
+ This is the reason agent-generated code goes red after deploy without ever failing CI. Roam catches it before merge.
139
+
140
+ > **For teams running AI coding agents:** the OSS engine ships paid layers on top — **[Roam Review](#roam-review-pr-bot-for-ai-generated-changes)** (PR bot, early access), **[Roam Cloud](#roam-cloud-metrics-history-no-source-upload)** (metrics dashboard, early access), **[Roam Self-Hosted](https://roam-code.com/pricing#self-hosted)** (regulated stacks, early access), and **[PR Replay](#pr-replay-one-shot-paid-audit)** (one-shot audit, available today via email). All are licensed separately; the CLI stays Apache 2.0 forever.
141
+
142
+ ```
143
+ Codebase ──> [Index] ──> Semantic Graph ──> 200+ Commands ──> AI Agent
144
+ │ │ │
145
+ tree-sitter symbols comprehend
146
+ 28 languages + edges govern
147
+ git history + metrics refactor
148
+ runtime traces + architecture orchestrate
149
+ ```
150
+
151
+ ### Start here — the 5 verbs that cover ~80% of agent workflows
152
+
153
+ ```bash
154
+ pip install roam-code
155
+
156
+ cd your-repo/
157
+ roam understand # 1. landing pad — what is this codebase?
158
+ roam retrieve "where is auth?" # 2. graph-aware retrieval for free-form tasks
159
+ roam context AuthService # 3. exact files+lines to read before changing
160
+ roam preflight AuthService # 4. blast radius + tests + complexity check
161
+ git diff | roam critique # 5. patch verifier — clones-not-edited, hot-path
162
+ ```
163
+
164
+ That's the full mental model. The other CLI surface — `taint`, `fleet`, `cga`, `simulate`, `mutate`, `partition`, `attest`, `eval-retrieve`, `oracle`, `py-types`, `py-modern`, `dark-matter`, `clones`, `propagation`, `fingerprint`, etc. — is advanced surface for specialised workflows; you'll never need most of them.
165
+
166
+ ### The problem
167
+
168
+ Coding agents explore codebases inefficiently: dozens of grep/read cycles, high token cost, no structural understanding. Roam replaces this with one graph query:
169
+
170
+ ```
171
+ $ roam context Flask
172
+ Callers: 47 Callees: 3
173
+ Affected tests: 31
174
+
175
+ Files to read:
176
+ src/flask/app.py:76-963 # definition
177
+ src/flask/__init__.py:1-15 # re-export
178
+ src/flask/testing.py:22-45 # caller: FlaskClient.__init__
179
+ tests/test_basic.py:12-30 # caller: test_app_factory
180
+ ...12 more files
181
+ ```
182
+
183
+ ### Terminal demo
184
+
185
+ ![roam terminal demo](docs/assets/roam-terminal-demo.gif)
186
+
187
+ ### Core commands
188
+
189
+ ```bash
190
+ $ roam understand # full codebase briefing
191
+ $ roam context <name> # files-to-read with exact line ranges
192
+ $ roam retrieve "<task>" # graph-aware spans for free-form natural-language tasks
193
+ $ roam preflight <name> # blast radius + tests + complexity + architecture rules
194
+ $ roam critique # verify a patch (`git diff | roam critique`)
195
+ $ roam health # composite score (0-100)
196
+ $ roam diff # blast radius of uncommitted changes
197
+ ```
198
+
199
+ ## What's New in v13
200
+
201
+ ### v13.1 (released 2026-05-15) -- Pattern-2 propagation + shared YAML helper + 3 flagship silent-fallback seals
202
+
203
+ - **3 flagship Pattern-2 silent-fallback bugs sealed (W826/W834/W836).** `cmd_taint`, `cmd_health`, and `cmd_doctor` now emit explicit `state="empty_corpus"` + `partial_success=True` on unanalyzed repos instead of false `Healthy 100/100` / `No taint findings` / `all checks passed` verdicts. Security-critical for `cmd_taint`, CI-gate-critical for `cmd_health --gate`.
204
+ - **Shared YAML config-loader helper.** New `src/roam/commands/_yaml_loader.py::load_yaml_with_warnings()` absorbs the boilerplate Pattern-2 plumbing (PyYAML + tiny-parser + structured warnings + root-type check). 5 of 7 surveyed YAML loaders migrated. Net ~125 LOC removed across the package.
205
+ - **5 new smell detectors.** `type-switch`, `speculative-generality`, `empty-catch`, `rename-invariant-clone`, `cross-layer-clone`, `parallel-hierarchy` (smells roster 19 → 24 in-file + 3 sibling-file detectors).
206
+ - **`@detector` registry consolidation (W941, Gate-1 closure).** `ALL_DETECTORS` and `_SMELL_KIND_TO_CONFIDENCE` are derived views from the `@detector`-decorated registry. Parallel-maintenance debt class eliminated for smell detectors.
207
+ - **Cargo-cult `or ""` cleanup (W1029/W1013/W1014/W1034).** 14 defensive wrappers removed across `cmd_complexity`, `cmd_fan`, `cmd_risk`, `cmd_fn_coupling`, `laws/miner`, `world_model/causal_graph`, `search/tfidf`, `search/index_embeddings`. 3 helpers None-guarded at source.
208
+ - **SQL `LIKE` `ESCAPE` discipline (W990–W993).** 26 wildcard-unsafe `LIKE` patterns hardened across 4 files; drift-guard test enforces forever.
209
+ - **Catalog/_shared.py hoisting.** 6 helpers consolidated to a canonical home with `__all__`; 6 catalog/* modules adopted the `__all__` discipline; cross-layer `_is_test_path` / `_camel_split` / `_enclosing_symbol` / `_parse_iso` / `make_finding_id` / `make_smell_finding` all single-sourced.
210
+ - **30+ behavioral Pattern-2 fixes** across `cmd_alerts` / `cmd_smells` / `cmd_pr_risk` / `cmd_taint` / `cmd_health` / `cmd_doctor` / `finding_suppress` / `smells_suppress` / `suppression` / `sarif`.
211
+ - **Empty-corpus smoke sweep (W805 + W639 + W661).** 25+ detectors smoke-tested; 12 already clean, 7 auto-fixed by W817 helper-level auto-inject, 3 dedicated flagship fixes. Forbidden-fragment blacklist (`"safe"` / `"healthy"` / `"100/100"` / `"no concerns"`) prevents regressions.
212
+ - **No persisted-data breaks.** Hash-stability mandate held: 31/31 `test_evidence_schema_migration.py` byte-identical; `make_finding_id` hashes confirmed byte-identical before/after consolidation.
213
+
214
+ ### v13.0 (released 2026-05-13) -- Agent-OS substrate + Laravel idioms + Vue SFC
215
+
216
+ - **Agent-OS control plane.** New repo-local substrates under `.roam/`: constitution
217
+ (single source for laws / rules / memory / gates), HMAC-chained run ledger
218
+ (`roam runs start|verify|end`), multi-agent leases (`roam lease claim|release|list`),
219
+ portable agent memory (`.roam/memory.jsonl`), and 4 cumulative modes
220
+ (`read_only` → `safe_edit` → `migration` → `autonomous_pr`). Mode enforcement
221
+ is opt-in behind `ROAM_MODE_ENFORCEMENT=1` for v13.0 (PR-C ready; staged
222
+ rollout). See CLAUDE.md "Agent OS substrate" for the canonical loop.
223
+ - **World-model classifiers (R28).** 4 new detectors with first-class CLI surface:
224
+ `roam side-effects` (io_read / io_write / mutation / process / none),
225
+ `roam idempotency` (idempotent / non_idempotent / unknown),
226
+ `roam causal-graph` (param → sink dependency edges), and
227
+ `roam tx-boundaries` (begin / commit / rollback regions + `unsafe_mutation`
228
+ outside-tx findings).
229
+ - **Laravel dynamic-dispatch idioms.** New `src/roam/index/laravel_post.py`
230
+ post-resolver catches 7 of 8 implicit-edge idioms that `auth-gaps`, `n1`,
231
+ and `algo` were silently missing: Route closures, Eloquent scopes, Policy
232
+ resolution, Observer registration, Job dispatch, Queue worker dispatch,
233
+ and Artisan commands.
234
+ - **Vue SFC import graph.** Single-File Component support (`.vue`) — template,
235
+ script, and style blocks parsed into the symbol graph; imports + component
236
+ registrations resolved across the SFC boundary so `roam impact`, `roam context`,
237
+ and `roam preflight` work on Vue projects.
238
+ - **Plugin substrate (R25) validated end-to-end.** The `roam-plugin-*` entry-point
239
+ surface (see CLAUDE.md "Writing a roam plugin") shipped clean cut on Rails
240
+ Path A — framework-specific knowledge can ship as a plugin instead of
241
+ landing in core.
242
+ - **~20 new CLI commands.** `roam brief`, `roam next`, `roam mode`,
243
+ `roam constitution`, `roam laws`, `roam memory`, `roam lease`, `roam runs`,
244
+ `roam replay`, `roam agent-score`, `roam agents-md`, `roam architecture-drift`,
245
+ `roam graph-diff`, `roam side-effects`, `roam idempotency`, `roam causal-graph`,
246
+ `roam tx-boundaries`, `roam batch-search`, `roam complete`, `roam mcp`.
247
+ - **Real-world feedback fixes.** `stale-refs` heading-slugger now matches
248
+ GitHub's algorithm exactly; `stale-refs --fix` URL-half + bare-backtick
249
+ corruption guards; `algo` nested-lookup dataflow predicate +
250
+ PHP `===`/`!==` detection; `auth-gaps` helper indirection (2-level same-class +
251
+ ancestor descent); `over-fetch` 3-state classification
252
+ (BARE / GUARDED_RELATION / UNGUARDED_RELATION);
253
+ `pr-bundle --strict-resolved` + `--ci` global mode integration.
254
+ - **Schema bump (USER_VERSION 12 → 13).** Migration #51 adds the
255
+ `loop_eq_with_dependent_write` column that backs the new algo
256
+ nested-lookup dataflow predicate.
257
+
258
+ Full release notes in [CHANGELOG.md](CHANGELOG.md#130--2026-05-13).
259
+
260
+ ## What's New in v12
261
+
262
+ ### v12.1+ -- Boolean oracles, IDOR classifier, index portability + Django bridge
263
+ - **`roam oracle <name>`**: 5 boolean oracles for agents — 1-token yes/no answers (`symbol-exists`, `route-exists`, `is-test-only`, `is-reachable-from-entry`, `is-clone-of`). Direct counter to CKB v9.2's `symbolExists` pattern. MCP tools: `roam_oracle_*`.
264
+ - **`roam_taint_classify` (MCP only)**: LLM-augmented taint classification — runs `roam taint` then asks the agent's own model (via MCP sampling) to label each reachable finding as IDOR/AUTHZ/SQLI/XSS/etc. with confidence + reasoning. Counter to Semgrep Multimodal — same LLM-reasoning narrative without a hosted API key. Sequential for v12.1; concurrency-bounded gather lands in v12.2.
265
+ - **`roam index-export` / `roam index-import`**: portable, integrity-checked tarball format with manifest sha256 round-trip + optional cosign signing. Counter to Cursor's "92% similar codebase = reuse teammate's index" without a vendor cloud. Tamper-evident (manifest verifies index.db sha256 on import).
266
+ - **`roam eval-retrieve --emit-format coderag|beir`**: bench-portable JSONL emit for public leaderboard submission. CodeRAG-Bench-compatible `ctxs` array + BEIR-style trec_eval run files.
267
+ - **Django bridge**: full implicit-relationship resolution (admin→model, serializer→model, FK transitive, signal handlers, URL configs, Celery tasks, DRF routers). Ported from `@LukasBerka/roam-code` — credit Lukas Berka. New schema columns: `framework_type`, `field_type`, `field_metadata`. Post-resolver runs after graph metrics.
268
+ - **`worktree_git_env()`** (`git_utils.py`): `GIT_INDEX_FILE` override fixes `.git/index.lock` contention when parallel agents run roam in sibling worktrees. Wired into `discovery.py`, `git_stats.py`, `changed_files.py`. Ported from `@river-mounts/roam-code-sf` — credit Sam Hannan.
269
+
270
+ ### v12.0 (released 2026-05-01) -- Retrieval substrate + patch verifier
271
+ - **`roam retrieve "<task>"`**: graph-aware context server. Hybrid first stage (FTS5) + structural reranker (personalised PageRank + clone-canonical signal + lexical baseline) + token-budget cap. Returns ranked spans with justification tags (`pagerank=...`, `clone_cluster=...`, `fts=...`) so callers can see *why* each span ranked. MCP tool: `roam_retrieve(task, budget, k, rerank, seed_files)`.
272
+ - **`roam critique`**: graph-grounded patch verifier. Pipe `git diff | roam critique` to get findings ranked by severity. The killer signal is **clones-not-edited**: for every changed symbol with persisted clone siblings outside the diff, we flag the sibling as a likely missed change. Plus a blast-radius caller-count finding. Exits 5 on high severity (CI-gateable). MCP tool: `roam_critique(diff_text)`.
273
+ - **`roam clones --persist`**: populate the `clone_pairs` and `clone_clusters` tables so downstream consumers (critique, retrieve) can query clones in O(1) instead of re-running detection.
274
+ - **`personalized_pagerank()`** in `graph/pagerank.py`: NetworkX `personalization=` wrapper with empty-seed fallback to global PR; biases ranking toward query-relevant nodes for the retrieve reranker.
275
+ - **`.roam/config.toml`** (new): zero-dep TOML loader (stdlib `tomllib` → `tomli` → in-tree subset parser). Tunable retrieve weights (`alpha`/`beta`/`gamma`/`delta`/`epsilon`), `tokens_per_line`, `lexical_baseline`, `first_stage_token_cap`, `default_budget`, `default_k`, `default_rerank`.
276
+ - **DX corrections from dogfood pass**: `roam --detail <cmd>` is the canonical group-level flag; misleading "use --detail" hints in 7 commands rewritten to point users at `roam --detail <cmd>`. `--top N` aliased on `complexity`/`algo`/`rules` (`--top 0` means unlimited on `rules`). `roam fingerprint` no longer refuses graphs ≥5,000 symbols (new soft-warn threshold 20k, hard cap 100k).
277
+ - **211 CLI commands, 145 MCP tools** (`fleet`, `ask`, `workflow`, `cga`, `eval-retrieve` remain CLI-only; v12 exposes `roam_retrieve`, `roam_critique`, `roam_fleet_plan`, plus 5 v12.1 boolean oracles (`roam_oracle_*`), `roam_taint_classify`, `roam_pytest_fixtures`, and `roam_hover` as MCP tools). 57-tool `core` preset is the default for token-budget-conscious clients.
278
+
279
+ ## What's New in v11
280
+
281
+ ### v11.2 -- AST Clone Detection + Debug Artifact Rules
282
+ - **`roam clones`**: New AST structural clone detection via subtree hashing. Finds Type-2 clones (identical control flow, different identifiers/literals) with Jaccard similarity scoring, Union-Find clustering, and automated refactoring suggestions. More precise than the metric-based `duplicates` command.
283
+ - **9 debug artifact rules** (COR-560 through COR-568): Detect leftover `print()`, `breakpoint()`, `pdb.set_trace()`, `console.log()`, `debugger`, and `System.out.println()` in Python, JavaScript, TypeScript, and Java code. All use `ast_match` type with test file exemptions.
284
+ - **140 commands, 102 MCP tools** (at v11.2.0 release).
285
+
286
+ ### v11.1.2 -- SQL + Scala Tier 1, 27 Languages
287
+ - **SQL DDL promoted to Tier 1** with dedicated `SqlExtractor` -- tables, columns, views, functions, triggers, schemas, types (enums), sequences, ALTER TABLE ADD COLUMN. Foreign keys produce graph edges; views and triggers reference source tables. Database-schema projects now work with `roam health`, `roam layers`, `roam impact`, `roam coupling` and all graph commands.
288
+ - **Scala promoted to Tier 1** with dedicated `ScalaExtractor` -- classes, traits, objects, case classes, sealed hierarchies, val/var properties, type aliases, imports, and inheritance. Full `extends` + `with` trait mixin resolution.
289
+ - **28 languages** with 17 dedicated Tier 1 extractors.
290
+ - `server.json` for official MCP Registry submission.
291
+
292
+ ### v11.1.1 -- Command Quality Audit
293
+ - **Full command audit**: all 152 commands reviewed for usefulness, duplicates, and test coverage. ~20 bugs fixed, 21 new test files (700+ tests), every command docstring updated with cross-references to related commands.
294
+ - **Kotlin promoted to Tier 1** via new YAML-based declarative extractor architecture. Classes, interfaces, enums, objects, functions, methods, properties, and inheritance fully extracted.
295
+ - **7 new commands**: `roam congestion`, `roam adrs`, `roam flag-dead`, `roam test-scaffold`, `roam sbom`, `roam triage`, `roam ci-setup`.
296
+ - **CI templates**: `roam ci-setup` generates pipelines for GitHub Actions, GitLab CI, Azure Pipelines, Jenkins, and Bitbucket.
297
+ - **Bug fixes**: `--undocumented` mode in `intent` (wrong DB table), `--changed` flag in `verify` (was permanently dead), lazy-load violation in `visualize` (~500ms penalty), exit code inconsistency in `rules`, VERDICT-first convention enforced across all commands.
298
+ - **Code quality**: 15 unused variables removed, dead code swept (4 orphaned cmd files, 2 dead helper functions), algo detector false-positive rate reduced (regex-in-loop: 7 to 1, list-prepend deque suppression), 6 regex patterns pre-compiled for loop performance.
299
+
300
+ ### v11.0 -- MCP v2 for Agent-First Workflows
301
+ - In-process MCP execution removes per-call subprocess overhead.
302
+ - 4 compound operations (`roam_explore`, `roam_prepare_change`, `roam_review_change`, `roam_diagnose_issue`) reduce multi-step agent workflows to single calls.
303
+ - Preset-based tool surfacing (`core`, `review`, `refactor`, `debug`, `architecture`, `full`) keeps default tool choice tight for agents while retaining full depth on demand.
304
+ - MCP tools now expose structured schemas and richer annotations for safer planner behavior.
305
+ - MCP token overhead for default core context dropped from ~36K to <3K tokens (about 92% reduction).
306
+
307
+ ### Performance and Retrieval
308
+ - Symbol search moved to SQLite FTS5/BM25: typical search moved from seconds to tens of milliseconds on the indexed cohort (mileage varies by repo size and query selectivity — see `bench/retrieve/` for the methodology).
309
+ - Incremental indexing shifted from O(N) full-edge rebuild behavior to O(changed) updates.
310
+ - DB/runtime optimizations (`mmap_size`, safer large-graph guards, batched writes) reduce first-run and reindex friction on larger repos.
311
+
312
+ ### CI, Governance, and Delivery
313
+ - GitHub Action supports quality gates, SARIF upload, sticky PR comments, and cache-aware execution.
314
+ - CI hardening includes changed-only analysis mode, trend-aware gates, and SARIF pre-upload guardrails (size/result caps + truncation signaling).
315
+ - Agent governance expanded with verification and AI-quality tooling (`roam verify`, `roam vibe-check`, `roam ai-readiness`, `roam ai-ratio`) for teams managing agent-written code.
316
+
317
+ ## Best for
318
+
319
+ - **Agent-assisted coding** -- structured answers that reduce token usage vs raw file exploration
320
+ - **Large codebases (100+ files)** -- graph queries beat linear search at scale
321
+ - **Architecture governance** -- health scores, CI quality gates, budget enforcement, fitness functions
322
+ - **Safe refactoring** -- blast radius, affected tests, pre-change safety checks, graph-level editing
323
+ - **Multi-agent orchestration** -- partition codebases for parallel agent work with zero-conflict guarantees
324
+ - **Security analysis** -- vulnerability reachability mapping, auth gaps, CVE path tracing
325
+ - **Algorithm optimization** -- detect O(n^2) loops, N+1 queries, and 21 other anti-patterns with suggested fixes
326
+ - **Backend quality** -- auth gaps, missing indexes, over-fetching models, non-idempotent migrations, orphan routes, API drift
327
+ - **Runtime analysis** -- overlay production trace data onto the static graph for hotspot detection
328
+ - **Multi-repo projects** -- cross-repo API edge detection between frontend and backend
329
+
330
+ ### When NOT to use Roam
331
+
332
+ - **Real-time type checking** -- use an LSP (pyright, gopls, tsserver). Roam is static and offline.
333
+ - **Small scripts (<10 files)** -- just read the files directly.
334
+ - **Pure text search** -- ripgrep is faster for raw string matching.
335
+
336
+ ## Why use Roam
337
+
338
+ **Speed.** One command replaces 5-10 tool calls (in typical workflows). Under 0.5s for any query.
339
+
340
+ **Dependency-aware.** Computes structure, not string matches. Knows `Flask` has 47 dependents and 31 affected tests. `grep` knows it appears 847 times.
341
+
342
+ **LLM-optimized output.** Plain ASCII, compact abbreviations (`fn`, `cls`, `meth`), `--json` envelopes. Designed for agent consumption, not human decoration.
343
+
344
+ **Evidence that never leaves your machine.** Local SQLite, no telemetry, no network calls. Evidence packets hash-verify offline — works in air-gapped environments.
345
+
346
+ **Algorithm-aware.** Built-in catalog of 23 anti-patterns. Detects suboptimal algorithms (quadratic loops, N+1 queries, unbounded recursion) and suggests fixes with Big-O improvements and confidence scores. Receiver-aware loop-invariant analysis minimizes false positives.
347
+
348
+ **CI-ready.** `--json` output, `--gate` quality gates, GitHub Action, SARIF 2.1.0.
349
+
350
+ | | Without Roam | With Roam |
351
+ |--|-------------|-----------|
352
+ | Tool calls | 8 | **1** |
353
+ | Wall time | ~11s | **<0.5s** |
354
+ | Tokens consumed | ~15,000 | **~3,000** |
355
+
356
+ *Measured on a typical agent workflow in a 200-file Python project (Flask). See [benchmarks](#performance) for more.*
357
+
358
+ <details>
359
+ <summary><strong>Table of Contents</strong></summary>
360
+
361
+ **Getting Started:** [What is Roam?](#what-is-roam) · [What's New in v11](#whats-new-in-v11) · [Best for](#best-for) · [Why use Roam](#why-use-roam) · [Install](#install) · [Quick Start](#quick-start)
362
+
363
+ **Using Roam:** [Commands](#commands) · [Walkthrough](#walkthrough-investigating-a-codebase) · [AI Coding Tools](#integration-with-ai-coding-tools) · [MCP Server](#mcp-server)
364
+
365
+ **Operations:** [CI/CD Integration](#cicd-integration) · [SARIF Output](#sarif-output) · [For Teams](#for-teams)
366
+
367
+ **Reference:** [Language Support](#language-support) · [Performance](#performance) · [How It Works](#how-it-works) · [How Roam Compares](#how-roam-compares) · [FAQ](#faq)
368
+
369
+ **More:** [Limitations](#limitations) · [Troubleshooting](#troubleshooting) · [Update / Uninstall](#update--uninstall) · [Development](#development) · [Contributing](#contributing)
370
+
371
+ </details>
372
+
373
+ ## Install
374
+
375
+ ```bash
376
+ pip install roam-code
377
+
378
+ # Recommended: isolated environment
379
+ pipx install roam-code
380
+ # or
381
+ uv tool install roam-code
382
+
383
+ # From source
384
+ pip install git+https://github.com/Cranot/roam-code.git
385
+ ```
386
+
387
+ Requires Python 3.10+. Works on Linux, macOS, and Windows.
388
+
389
+ > **Windows:** If `roam` is not found after installing with `uv`, run `uv tool update-shell` and restart your terminal.
390
+
391
+ ### Docker (alpine-based)
392
+
393
+ ```bash
394
+ docker build -t roam-code .
395
+ docker run --rm -v "$PWD:/workspace" roam-code index
396
+ docker run --rm -v "$PWD:/workspace" roam-code health
397
+ ```
398
+
399
+ ## Quick Start
400
+
401
+ ```bash
402
+ cd your-project
403
+ roam init # indexes codebase, creates config + CI workflow
404
+ roam understand # full codebase briefing
405
+ ```
406
+
407
+ First index takes ~5s for 200 files, ~15s for 1,000 files. Subsequent runs are incremental and near-instant.
408
+
409
+ **Next steps:**
410
+
411
+ - **Set up your AI agent:** `roam describe --write` (auto-detects CLAUDE.md, AGENTS.md, .cursor/rules, etc. — see [integration instructions](#integration-with-ai-coding-tools))
412
+ - **Explore:** `roam health` → `roam weather` → `roam map`
413
+ - **Run the v2 stack on every PR:** `git diff | roam pr-analyze --explain` (gates AI-generated risk; pair with `roam pr-comment-render` for sticky GitHub comments — see [Roam Review](#roam-review-pr-bot-for-ai-generated-changes))
414
+ - **First-touch demo:** `roam dogfood` (audit + pr-analyze + audit-trail + governance checks in one envelope)
415
+ - **Add to CI:** `roam init` already generated a GitHub Action
416
+ - **Customer-facing artifacts:** see starter rule packs at [`templates/rules/`](templates/rules/), the audit-report template + redacted sample at [`templates/audit-report/`](templates/audit-report/), and the security/procurement packet at [`templates/legal/security-procurement-packet.md`](templates/legal/security-procurement-packet.md).
417
+
418
+ <details>
419
+ <summary><strong>Try it on Roam itself</strong></summary>
420
+
421
+ ```bash
422
+ git clone https://github.com/Cranot/roam-code.git
423
+ cd roam-code
424
+ pip install -e .
425
+ roam init
426
+ roam understand
427
+ roam health
428
+ ```
429
+
430
+ </details>
431
+
432
+ ## Works With
433
+
434
+ <p align="center">
435
+ <a href="#integration-with-ai-coding-tools">Claude Code</a> &bull;
436
+ <a href="#integration-with-ai-coding-tools">Cursor</a> &bull;
437
+ <a href="#integration-with-ai-coding-tools">Windsurf</a> &bull;
438
+ <a href="#integration-with-ai-coding-tools">GitHub Copilot</a> &bull;
439
+ <a href="#integration-with-ai-coding-tools">Aider</a> &bull;
440
+ <a href="#integration-with-ai-coding-tools">Cline</a> &bull;
441
+ <a href="#integration-with-ai-coding-tools">Gemini CLI</a> &bull;
442
+ <a href="#integration-with-ai-coding-tools">OpenAI Codex CLI</a> &bull;
443
+ <a href="#mcp-server">MCP</a> &bull;
444
+ <a href="#cicd-integration">GitHub Actions</a> &bull;
445
+ <a href="#cicd-integration">GitLab CI</a> &bull;
446
+ <a href="#cicd-integration">Azure DevOps</a>
447
+ </p>
448
+
449
+ ## Commands
450
+
451
+ <!-- BEGIN auto-count:readme-canonical-mention -->
452
+ **Lead with the 5 verbs.** The [5 core commands](#core-commands) cover ~80% of agent workflows: `understand`, `context`, `retrieve`, `preflight`, `critique`. The remaining ~233 commands are detail surface for specialised workflows (taint, fleet, cga, oracle, eval, …) — they're called by agents on demand, not memorised. This is intentional design; under the hood the canonical surface is **238 commands (231 canonical + 7 aliases) organised into 7 categories** (aliases for muscle memory: `algo` → `math`, `weather` → `churn`, `digest` / `snapshot` / `trend` → `trends`, `onboard` → `understand`, `refs` → `uses`), but you don't need to know that to start.
453
+ <!-- END auto-count:readme-canonical-mention -->
454
+
455
+ <details>
456
+ <!-- BEGIN auto-count:readme-cli-command-list-summary -->
457
+ <summary><strong>Full command reference — canonical command list (all 231)</strong></summary>
458
+ <!-- END auto-count:readme-cli-command-list-summary -->
459
+
460
+ ### Getting Started
461
+
462
+ | Command | Description |
463
+ |---------|-------------|
464
+ | `roam index [--force] [--verbose]` | Build or rebuild the codebase index |
465
+ | `roam index-export <bundle.tar.gz> [--sign] [--key K] [--keyless]` | Export the indexed `.roam/index.db` as a signed, integrity-checked tarball. Counter to Cursor's "reuse teammate's index" without a vendor cloud. |
466
+ | `roam index-import <bundle.tar.gz> [--force] [--cosign-bundle B] [--cosign-key K]` | Import a portable index bundle. Verifies manifest sha256 + optional cosign signature; refuses to overwrite without `--force`. |
467
+ | `roam watch [--interval N] [--debounce N] [--webhook-port P] [--guardian]` | Long-running index daemon: poll/webhook-triggered refreshes plus optional continuous architecture-guardian snapshots and JSONL compliance artifacts |
468
+ | `roam init` | Guided onboarding: creates `.roam/fitness.yaml`, CI workflow, runs index, shows health |
469
+ | `roam hooks [--install] [--uninstall]` | Manage git hooks for automated roam index updates and health gates |
470
+ | `roam doctor` | Diagnose installation and environment: verify tree-sitter grammars, SQLite, git, and config health |
471
+ | `roam reset [--hard]` | Reset the roam index and cached data. `--hard` removes all `.roam/` artifacts |
472
+ | `roam clean [--all]` | Remove stale or orphaned index entries without a full rebuild |
473
+ | `roam understand` | Full codebase briefing: tech stack, architecture, key abstractions, health, conventions, complexity overview, entry points |
474
+ | `roam onboard` | Alias for `understand` |
475
+ | `roam tour [--write PATH]` | Auto-generated onboarding guide: top symbols, reading order, entry points, language breakdown. `--write` saves to Markdown |
476
+ | `roam describe [--write] [--force] [-o PATH] [--agent-prompt]` | Auto-generate project description for AI agents. `--write` auto-detects your agent's config file. `--agent-prompt` returns a compact (<500 token) system prompt |
477
+ | `roam agent-export [--format F] [--write]` | Generate agent-context bundle from project analysis (`AGENTS.md` + provider-specific overlays) |
478
+ | `roam minimap [--update] [-o FILE] [--init-notes]` | Compact annotated codebase snapshot for agent config injection: stack, annotated directory tree, key symbols by PageRank, high fan-in symbols to avoid touching, hotspots, conventions. Sentinel-based in-place updates |
479
+ | `roam config [--set-db-dir PATH] [--use-local-cache] [--semantic-status] [--semantic-backend MODE]` | Manage `.roam/config.json` (DB path, local cache storage, excludes, optional ONNX semantic settings, and activation diagnostics) |
480
+ | `roam map [-n N] [--full] [--budget N]` | Project skeleton: files, languages, entry points, top symbols by PageRank. `--budget` caps output to N tokens |
481
+ | `roam schema [--diff] [--version V]` | JSON envelope schema versioning: view, diff, and validate output schemas |
482
+ | `roam mcp [--list-tools] [--transport T]` | Start MCP server (stdio/SSE/streamable-http), inspect available tools, and expose roam to coding agents |
483
+ | `roam mcp-setup <platform>` | Generate MCP config snippets for AI platforms: claude-code, cursor, windsurf, vscode, gemini-cli, codex-cli |
484
+ | `roam ci-setup [--platform P] [--write] [--with-slsa-l3] [--with-oscal]` | Generate CI/CD pipeline config (GitHub Actions, GitLab CI, Azure Pipelines, Jenkins, Bitbucket) with SARIF + quality gates. `--with-slsa-l3` adds the SRC-L3 auto-trigger workflow (W471). `--with-oscal` materialises persistent OSCAL v1.2 artifacts under `.roam/oscal/` (control-mapping.json + stub-assessment-plan.json) so future `roam evidence-oscal --kind assessment-results` calls can pass `--import-ap-ref` instead of inlining the stub (W535) |
485
+ | `roam adrs [--status S] [--limit N]` | Discover Architecture Decision Records, link to affected code modules, show status and coverage |
486
+ | `roam plugins` | List discovered plugins (commands, detectors, language extractors) registered via `ROAM_PLUGIN_MODULES` or entry points |
487
+ | `roam index-stats` | Report .roam index size, row counts, and SQLite fragmentation; hints when VACUUM or `roam reset` is overdue |
488
+ | `roam test-pyramid` | Count tests by kind (unit/integration/e2e/smoke) using path + filename heuristics; flags inverted pyramids |
489
+ | `roam telemetry` | Surface the opt-in local telemetry ring buffer (slowest + recent calls); enable via `ROAM_TELEMETRY_LOCAL=1` |
490
+ | `roam orphan-imports` | List Python imports that don't resolve to any indexed module or installed package |
491
+ | `roam changelog [--suggest]` | List commits since the last tag, optionally as a Conventional-Commits-bucketed markdown CHANGELOG draft |
492
+ | `roam graph-export [--format graphml\|dot\|jsonl]` | Export the symbol or file dependency graph for external tooling (Gephi, Cytoscape, custom analyses) |
493
+ | `roam help-search <query>` | Fuzzy match across every command's name + help text (replaces grepping `--help-all` output) |
494
+ | `roam stats` | Aggregate metrics over the index: count by language, file role, kind, plus recent commit activity |
495
+ | `roam timeline <symbol>` | Chronological commits that touched the file owning the symbol — author, date, lines added/removed |
496
+ | `roam pr-prep [<range>]` | One-shot pre-PR fitness check that bundles diff + critique + pr-risk into one envelope |
497
+ | `roam pr-analyze [<range>] [--input F] [--rules F] [--gate]` | Agent-aware PR risk verdict: aggregates `pr-prep` with AI-likelihood scoring, `.roam/rules.yml` enforcement, and INTENTIONAL/SAFE/REVIEW/BLOCK mapping; CI gate via `--gate` (exit 5 on BLOCK); governance audit trail via `--audit-trail` |
498
+ | `roam pr-comment-render --input F` | Render a markdown PR comment from a `pr-analyze` JSON envelope; styles: `github`, `gitlab`, `plain` |
499
+ | `roam pr-replay [<sha>] [--audit-trail]` | Replay a PR's analysis at a specific commit (or HEAD); useful for reproducing audit decisions and validating cache stability |
500
+ | `roam metrics-push [--token T] [--anonymize] [--dry-run]` | Push metrics-only summary (no source-code bodies) from `roam audit` to a Roam Cloud endpoint; `--dry-run` prints the payload locally |
501
+ | `roam audit-trail-verify [--input F] [--gate]` | Walk the EU AI Act audit-trail JSONL and verify SHA-256 chain integrity; exit 5 on broken chain |
502
+ | `roam audit-trail-export [--format md\|json\|csv] [--since T] [--verdict V] [--aggregate]` | Export the audit trail for procurement / compliance review; `--aggregate` rolls up per actor / repo / verdict / month |
503
+ | `roam audit-trail-conformance-check [--retention-days N] [--gate]` | Score the audit trail against governance-evidence checks (chain integrity, timestamps, actors, reproducibility, retention) |
504
+ | `roam article-12-check [--output F] [--pdf F]` | Article 12 scope/readiness assessment for actual Annex III high-risk AI-system buyers; produces a 1-page Markdown / PDF report. |
505
+ | `roam capabilities [--emit yaml\|json\|text] [--category X] [--ai-safe-only]` | Emit the decorator-driven capability registry — every command's machine-readable shape (inputs, outputs, ai_safe flag, since-version). For Roam Review GitHub App + MCP filtering. |
506
+ | `roam skill-generate [--target claude\|cursor\|continue\|aider] [--output F]` | Generate an agent-runtime skill manifest from the capability registry. SKILL.md / .mdc / config snippets — derived from decorators, never hand-edited. |
507
+ | `roam compare <baseline.db> <target.db> [--top N] [--threshold N]` | Structural delta between two indices: symbols added/removed/moved + per-file complexity deltas + IMPROVED/SIDEWAYS/REGRESSED verdict. The "did this refactor actually work?" tool. |
508
+ | `roam migration-plan [--target spec.yml] [--move SYMBOL=path] [--max-risk low\|medium\|high]` | Generate an ordered migration plan from current state to a target architecture. Each step annotated with blast-radius (caller count) + risk score (low/medium/high) + cross-layer detection. |
509
+ | `roam permit [--staged] [--input F] [--symbol N]` | Structural-permission verdict facade for AI agents: ALLOW/REVIEW/BLOCK over critique + preflight + blast-radius. Exit codes 0/5/6 for Cursor rules / Claude Code hooks / pre-commit / CI gates. |
510
+ | `roam postmortem <commit-range> [--limit N] [--show N]` | Replay current detectors against past commits; reports findings that would have surfaced pre-merge. The "would Roam have caught my Q1 incident?" demo. |
511
+ | `roam rules-validate [PATH] [--against DIFF] [--strict] [--gate] [--explain]` | Lint a `.roam/rules.yml` for typos, schema mistakes, unknown patterns, duplicate IDs; optional dry-run against a sample diff |
512
+ | `roam dogfood [--no-audit] [--no-pr-analyze] [--no-audit-trail]` | One-shot v2 stack runner: audit + pr-analyze + audit-trail + governance checks — first-touch demo for any repo |
513
+ | `roam suppress <finding-id> --reason "…"` | Suppress a math / over-fetch / missing-index / auth-gaps false positive with audit-trail-friendly record (`.roam/suppressions.json`); `--list` / `--remove` complete the workflow |
514
+ | `roam why-fail <test>` | Find recently-changed symbols transitively reachable from a failing test |
515
+ | `roam why-slow <symbol>` | Surface runtime hotspots and slow callers for a specific symbol (uses runtime traces if present) |
516
+ | `roam recommend <symbol>` | Surface related symbols using call-graph + co-change + clone signals |
517
+ | `roam graph-stats` | Graph-level invariants: density, weak components, non-trivial cycles, top inbound symbols |
518
+ | `roam api [--scope <dir>]` | List the public API surface (exported public symbols + signatures) |
519
+ | `roam exit-codes` | List every roam exit code with its meaning |
520
+ | `roam version [--check]` | Show installed version; with `--check` also queries PyPI for newer releases |
521
+ | `roam audit [--brief]` | One-shot AI-governance audit envelope — chains health + debt + dead + risk + test-pyramid + api into a single envelope |
522
+ | `roam disambiguate <name>` | List every symbol matching the name with file/line/kind/signature/docstring snippet to pick the right one |
523
+ | `roam pre-commit [--install\|--print]` | Install or preview a roam-critique git pre-commit hook |
524
+ | `roam mcp-status` | MCP server health: preset, registered tools, backpressure limits, cache entries, watcher state |
525
+ | `roam test-impact [<range>]` | Tests transitively reachable from changed symbols (sharper scope than `affected-tests`) |
526
+ | `roam recipes` | List every `roam ask` recipe with intent + example queries (sugar over `ask --list`) |
527
+ | `roam surface [--filter F] [--category C]` | Print the canonical capability surface (commands, aliases, MCP tools, maturity) for inventory and JSON consumption |
528
+ | `roam explain-command <name>` | Show what a command does, what it depends on, and how stale-index sensitive it is |
529
+ | `roam db-check` | Integrity sweep over the local index. Reports orphans, broken edges, missing FTS, and other structural issues |
530
+
531
+ ### Daily Workflow
532
+
533
+ | Command | Description |
534
+ |---------|-------------|
535
+ | `roam file <path> [--full] [--changed] [--deps-of PATH]` | File skeleton: all definitions with signatures, cognitive load index, health score |
536
+ | `roam symbol <name> [--full]` | Symbol definition + callers + callees + metrics. Supports `file:symbol` disambiguation |
537
+ | `roam context <symbol> [--task MODE] [--for-file PATH]` | AI-optimized context: definition + callers + callees + files-to-read with line ranges |
538
+ | `roam hover <symbol>` | One-line architectural summary: kind, location, blast-radius bucket, top caller, top callee. Bounded at ~200 tokens for IDE hover panels |
539
+ | `roam retrieve <task> [--budget N] [--k N] [--seed-files PATH]` | Graph-aware context for free-form tasks: FTS5 + structural rerank (PageRank + clones) + token budget |
540
+ | `roam critique [--input DIFF] [--intent TEXT] [--high-callers N]` | Verify a patch against the graph: clones-not-edited + blast radius + intent-vs-semantic-diff. Pipe `git diff` in. Exit 5 on high severity. |
541
+ | `roam fleet plan <goal> [--n-agents N] [--adapter raw\|composio\|copilot]` | Graph-aware planner: Louvain partition + co-change + PageRank anchors → `.roam-fleet.json` for Composio/Copilot CLI/raw. |
542
+ | `roam ask <query> [--list] [--explain] [--recipe NAME]` | One-phrase intent classifier over a 25-recipe registry with phase, review-lens, gate, and follow-up metadata — composes preflight/retrieve/critique/fleet/understand/diagnose/trace/trends/hotspots/debt/taint/dead/coupling/stale-refs to cover the most common workflows. |
543
+ | `roam workflow [RECIPE] [--list] [--query TEXT]` | Inspect a recipe DAG, review lenses, gates, rendered command arguments, and follow-up commands without running the workflow. |
544
+ | `roam taint [--rules-dir PATH] [--rule NAME] [--rules-pack PACK] [--ci]` | Graph-reach taint analysis with OpenVEX-correct VEX justifications. YAML rule packs (10 starter packs: sqli, xss, ssrf, path-traversal, command-injection, deserialization, open-redirect, urllib, socketio, fileupload). |
545
+ | `roam cga emit [--include-taint] [--sign --key]` | Code Graph Attestation — in-toto v1 statement with `roam-code.dev/CodeGraph/v1` predicate, Merkle root + edge bundle digest. `--include-taint` embeds OpenVEX-shaped reachability claims from `roam taint`. `--sign` signs with cosign (graceful skip if absent); `roam cga verify` round-trips both predicate digest and cosign signature. |
546
+ | `roam eval-retrieve [--tasks FILE] [--sweep] [--min-recall-at-20 N] [--emit-format coderag\|beir]` | Recall@K eval harness for `roam retrieve` — measures against a JSONL ground-truth file. CI-gateable. `--emit-format coderag` writes CodeRAG-Bench-compatible run files for public leaderboard submission. |
547
+ | `roam oracle <name> <subject>` | Boolean oracles for agents — 1-token yes/no answers. Subcommands: `symbol-exists`, `route-exists`, `is-test-only`, `is-reachable-from-entry`, `is-clone-of`. |
548
+ | `roam search <pattern> [--kind KIND]` | Find symbols by name pattern, PageRank-ranked |
549
+ | `roam grep <pattern> [-g glob] [-n N]` | Text search annotated with enclosing symbol context |
550
+ | `roam refs-text <string>...` | String audit with verdict (SAFE-TO-REMOVE / REVIEW / LOAD-BEARING). Groups refs by surface (code/test/docs/config/dead) and annotates reachability. |
551
+ | `roam delete-check [--source working\|staged\|pr\|head] [--ci]` | Gate a diff on surviving references — exits 5 on `BREAK-RISK` with `--ci`. The companion to `safe-delete` for unstructured deletion review. |
552
+ | `roam history-grep <pattern> [--polarity]` | Git pickaxe (`-S` / `-G`) with author / date and introduced-vs-removed annotation — for "when did this string appear?" investigations. |
553
+ | `roam deps <path> [--full]` | What a file imports and what imports it |
554
+ | `roam trace <source> <target> [-k N]` | Dependency paths with coupling strength and hub detection |
555
+ | `roam impact <symbol>` | Blast radius: what breaks if a symbol changes (Personalized PageRank weighted) |
556
+ | `roam diff [--staged] [--full] [REV_RANGE]` | Blast radius of uncommitted changes or a commit range |
557
+ | `roam pr-risk [REV_RANGE]` | PR risk score (0-100, multiplicative model) + structural spread + suggested reviewers |
558
+ | `roam pr-diff [--staged] [--range R] [--format markdown]` | Structural PR diff: metric deltas, edge analysis, symbol changes, footprint. Not text diff — graph delta |
559
+ | `roam evidence-diff <old> <new>` | Diff two `ChangeEvidence` packets: hash drift, schema drift, added/removed refs, missing/new findings, 8-question completeness regressions vs improvements |
560
+ | `roam evidence-doctor [PACKET]` | Read-only health diagnostic for a `ChangeEvidence` packet: schema validity, content-hash integrity, W259 completeness banner (STRONG / PARTIAL / INSUFFICIENT), suggested producer to lift the lowest-scoring question |
561
+ | `roam evidence-oscal` | Emit OSCAL v1.2 Control Mapping (or Assessment Results with --kind assessment-results). |
562
+ | `roam api-changes [REV_RANGE]` | API change classifier: breaking/non-breaking changes, severity, and affected contracts |
563
+ | `roam semantic-diff [REV_RANGE]` | Structural change summary: symbols added/removed/modified and changed call edges |
564
+ | `roam test-gaps [REV_RANGE]` | Changed-symbol test gap detection: what changed and what still lacks test coverage |
565
+ | `roam affected [REV_RANGE]` | Monorepo/package impact analysis: what components are affected by a change |
566
+ | `roam attest [REV_RANGE] [--format markdown] [--sign]` | Proof-carrying PR attestation: bundles blast radius, risk, breaking changes, fitness, budget, tests, effects into one verifiable artifact |
567
+ | `roam pr-bundle init\|set\|add\|emit\|validate` | Build a proof-carrying PR bundle (intent + context + affected symbols + risks + tests + non-goals). `--auto-collect` folds in envelopes from prior roam runs. CI-gateable via `validate` |
568
+ | `roam annotate <symbol> <note>` | Attach persistent notes to symbols (agentic memory across sessions) |
569
+ | `roam annotations [--file F] [--symbol S]` | View stored annotations |
570
+ | `roam diagnose <symbol> [--depth N]` | Root cause analysis: ranks suspects by z-score normalized risk |
571
+ | `roam preflight <symbol\|file>` | Compound pre-change check: blast radius + tests + complexity + coupling + fitness |
572
+ | `roam guard <symbol>` | Compact sub-agent preflight bundle: definition, 1-hop callers/callees, test files, breaking-risk score, and layer signals |
573
+ | `roam agent-plan --agents N` | Decompose partitions into dependency-ordered agent tasks with merge sequencing and handoffs |
574
+ | `roam agent-context --agent-id N [--agents M]` | Generate per-agent execution context: write scope, read-only dependencies, and interface contracts |
575
+ | `roam agent-score [--agent A] [--since N]` | Composite per-agent score (0-100) over the `.roam/runs/` ledger: completion rate + clean-signal rate + breadth, with low-confidence flag for <2 runs |
576
+ | `roam syntax-check [--changed] [PATHS...]` | Tree-sitter syntax integrity check for changed files and multi-agent judge workflows |
577
+ | `roam verify [--threshold N]` | Pre-commit AI-code consistency check across naming, imports, error handling, and duplication signals |
578
+ | `roam verify-imports [--file F]` | Import hallucination firewall: validate all imports against indexed symbol table, suggest corrections via FTS5 fuzzy matching |
579
+ | `roam triage list\|add\|stats\|check` | Security finding suppression workflow: manage `.roam-suppressions.yml` (SAFE/ACKNOWLEDGED/WONT-FIX status lifecycle) |
580
+ | `roam safe-delete <symbol>` | Safe deletion check: SAFE/REVIEW/UNSAFE verdict |
581
+ | `roam test-map <name>` | Map a symbol or file to its test coverage |
582
+ | `roam adversarial [--staged] [--range R]` | Adversarial architecture review: generates targeted challenges based on changes |
583
+ | `roam plan [--staged] [--range R] [--agents N]` | Agent work planner: decompose changes into sequenced, dependency-aware steps |
584
+ | `roam closure <symbol> [--rename] [--delete]` | Minimal-change synthesis: all files to touch for a safe rename/delete |
585
+ | `roam mutate move\|rename\|add-call\|extract` | Graph-level code editing: move symbols, rename across codebase, add calls, extract functions. Dry-run by default |
586
+ | `roam dogfood-aggregate [--all] [--status S] [--severity H\|M\|L] [--type T]` | Aggregate the dogfood eval corpus into a backlog/triage view — surface open findings, filter by status/severity/type |
587
+ | `roam memory add\|list\|relevant` | Repo-local agent memory at `.roam/memory.jsonl` — portable across agent vendors, travels with checkouts. `add` records, `list` filters by recency, `relevant` ranks against a query |
588
+ | `roam runs start\|log\|end\|list\|show\|verify` | Per-agent-run event ledger at `.roam/runs/<run_id>/` — `start` opens a run, `log` appends events, `end` closes it, `list`/`show` inspect, `verify` checks HMAC chain integrity. Substrate for replay / agent-score / audit-trail |
589
+ | `roam replay <run_id> [--execute --dry-run\|--no-dry-run]` | Re-narrate a past agent run from the ledger: numbered timeline + per-step verdicts. `--execute` re-runs the logged commands (refuses bare `--execute` to prevent accidental state mutation) |
590
+ | `roam constitution init\|check\|show\|apply\|where` | Manage the repo-local agent constitution at `.roam/constitution.yml` — the single declarative file an agent reads first. Points at laws/rules/memory/runs and enforces per-gate policy thresholds |
591
+ | `roam laws mine\|check\|list\|explain` | Self-installing constitution: mine repo invariants from index + tests + git history into `roam-laws.yml`, then `check` enforces them against a diff (exit 5 on violation) |
592
+ | `roam agents-md` | Generate AGENTS.md from indexed conventions, danger zones, constitution, and capability registry |
593
+ | `roam brief` | One-page agent briefing covering mode / next / highlights / pr-bundle / runs |
594
+ | `roam intent-check <command>` | Check if an intended command is allowed by the active mode |
595
+ | `roam lease claim\|release\|list\|show\|gc` | Multi-agent lease system: coordinate parallel agents on the same repo by reserving file/symbol scopes. `claim` opens, `release` drops, `gc` expires stale leases |
596
+ | `roam mode [MODE] [--check CMD] [--list]` | Show or switch active mode (read_only / safe_edit / migration / autonomous_pr) |
597
+ | `roam next` | Suggest the next roam command based on current repo state (index presence, staleness, working-tree dirtiness, recent envelope/memory). Bounded under 200ms |
598
+
599
+ ### Codebase Health
600
+
601
+ | Command | Description |
602
+ |---------|-------------|
603
+ | `roam health [--no-framework] [--gate]` | Composite health score (0-100): weighted geometric mean of tangle ratio, god components, bottlenecks, layer violations. `--gate` runs quality gate checks from `.roam-gates.yml` (exit 5 on failure) |
604
+ | `roam smells [--file F] [--min-severity S]` | Code smell detection: 15 deterministic detectors (brain methods, god classes, feature envy, shotgun surgery, data clumps, etc.) with per-file health scores |
605
+ | `roam dashboard` | Unified single-screen project status: health, hotspots, risks, ownership, and AI-rot indicators |
606
+ | `roam vibe-check [--threshold N]` | AI-rot auditor: 8-pattern taxonomy with composite risk score and prioritized findings |
607
+ | `roam llm-smells [--min-severity S] [--persist]` | LLM-API integration anti-patterns: 10 patterns (no-model-version-pinning, missing-max-tokens, prompt-injection surface, missing timeout/retries, no system message, LLM call in loop, etc.). Scans files that import openai/anthropic/langchain/litellm/google.generativeai/cohere/mistralai/together/groq/fireworks/llama_index/replicate. Distinct audience from `vibe-check` |
608
+ | `roam ai-readiness` | 0-100 score for how well this codebase supports AI coding agents |
609
+ | `roam ai-ratio [--since N]` | Statistical estimate of AI-generated code ratio using commit-behavior signals |
610
+ | `roam trends [--record] [--days N] [--metric M]` | Historical metrics snapshots with sparklines and trend deltas |
611
+ | `roam complexity [--bumpy-road] [--include-tooling]` | Per-function cognitive complexity (SonarSource-compatible, triangular nesting penalty) + Halstead metrics (volume, difficulty, effort, bugs) + cyclomatic density |
612
+ | `roam py-types [--detail] [--include-tests] [--ci --min-coverage N]` | Python type-annotation health: % of public functions with full annotations, ``Any`` usage, legacy ``typing.Optional/Dict/List`` (PEP 585/604 modernisation candidates), per-file worst offenders. CI-gateable via ``--ci --min-coverage N`` (exit 5 below threshold). Default-excludes test files |
613
+ | `roam py-modern [--detail]` | Modern-Python adoption signal: counts walrus operator (PEP 572), match statements (PEP 634), PEP 604 ``X \| None``, PEP 585 ``dict[…]``, PEP 695 type aliases, f-strings vs ``.format()``. Reports type-modernisation % and f-string adoption % to gauge migration progress |
614
+ | `roam pytest-fixtures [SYMBOL] [--max-depth N]` | Inventory pytest fixture chains. With no SYMBOL, prints the project-wide fixture count and the top fixtures by dependent count. With a fixture or test name, walks the implicit fixture-parameter dependency graph to show what each test transitively requires. Resolves through ``conftest.py`` chains |
615
+ | `roam algo [--task T] [--confidence C] [--profile P]` | Algorithm anti-pattern detection: 23-pattern catalog detects suboptimal algorithms (O(n^2) loops, N+1 queries, quadratic string building, branching recursion, loop-invariant calls) and suggests better approaches with Big-O improvements. Confidence calibration via caller-count + runtime traces, evidence paths, impact scoring, framework-aware N+1 packs, and language-aware fix templates. Alias: `roam math` |
616
+ | `roam n1 [--confidence C] [--verbose]` | Implicit N+1 I/O detection: finds ORM model computed properties (`$appends`/accessors) that trigger lazy-loaded DB queries in collection contexts. Cross-references with eager loading config. Supports Laravel, Django, Rails, SQLAlchemy, JPA |
617
+ | `roam over-fetch [--threshold N] [--confidence C]` | Detect models serializing too many fields: large `$fillable` without `$hidden`/`$visible`, direct controller returns bypassing API Resources, poor exposed-to-hidden ratio |
618
+ | `roam missing-index [--table T] [--confidence C]` | Find queries on non-indexed columns: cross-references `WHERE`/`ORDER BY` clauses, foreign keys, and paginated queries against migration-defined indexes |
619
+ | `roam weather [-n N]` | Hotspots ranked by geometric mean of churn x complexity (percentile-normalized) |
620
+ | `roam debt [--roi]` | Hotspot-weighted tech debt prioritization with SQALE remediation costs and optional refactoring ROI estimates |
621
+ | `roam fitness [--explain] [--baseline PATH] [--write-baseline]` | Architectural fitness functions from `.roam/fitness.yaml`, with baseline/delta mode for existing debt |
622
+ | `roam alerts` | Health degradation trend detection (Mann-Kendall + Sen's slope) |
623
+ | `roam forecast [--symbol S] [--horizon N] [--alert-only]` | Predict when metrics will exceed thresholds: Theil-Sen regression on snapshot history + churn-weighted per-symbol risk |
624
+ | `roam budget [--init] [--staged] [--range R]` | Architectural budget enforcement: per-PR delta limits on health, cycles, complexity. CI gate (exit 5 on violation) |
625
+ | `roam bisect [--metric M] [--range R]` | Architectural git bisect: find the commit that degraded a specific metric |
626
+ | `roam ingest-trace <file> [--otel\|--jaeger\|--zipkin\|--generic]` | Ingest runtime trace data (OpenTelemetry, Jaeger, Zipkin) for hotspot overlay |
627
+ | `roam hotspots [--runtime] [--discrepancy]` | Runtime hotspot analysis: find symbols missed by static analysis but critical at runtime |
628
+
629
+ <details>
630
+ <summary><strong>roam algo — algorithm anti-pattern catalog (23 patterns)</strong></summary>
631
+
632
+ `roam algo` scans every indexed function against a 23-pattern catalog, ranks findings by runtime-aware impact score, and shows the exact Big-O improvement available. Findings include semantic evidence paths, precision metadata, and language-aware tips/fixes (Python, JS, Go, Rust, Java, etc.):
633
+
634
+ ```
635
+ $ roam algo
636
+ VERDICT: 8 algorithmic improvements found (3 high, 4 medium, 1 low)
637
+ Ordering: highest impact first
638
+ Profile: balanced (filtered 0 low-signal findings)
639
+
640
+ Nested loop lookup (2):
641
+ fn resolve_permissions src/auth/rbac.py:112 [high, impact=86.4]
642
+ Current: Nested iteration -- O(n*m)
643
+ Better: Hash-map join -- O(n+m)
644
+ Tip: Build a dict/set from one collection, iterate the other
645
+
646
+ fn find_matching_rule src/rules/engine.py:67 [high, impact=78.1]
647
+ Current: Nested iteration -- O(n*m)
648
+ Better: Hash-map join -- O(n+m)
649
+ Tip: Build a dict/set from one collection, iterate the other
650
+
651
+ String building (1):
652
+ meth build_query src/db/query.py:88 [high, impact=74.0]
653
+ Current: Loop concatenation -- O(n^2)
654
+ Better: Join / StringBuilder -- O(n)
655
+ Tip: Collect parts in a list, join once at the end
656
+
657
+ Branching recursion without memoization (1):
658
+ fn compute_cost src/pricing/calc.py:34 [medium, impact=49.5]
659
+ Current: Naive branching recursion -- O(2^n)
660
+ Better: Memoized / iterative DP -- O(n)
661
+ Tip: Add @cache / @lru_cache, or convert to iterative with a table
662
+ ```
663
+
664
+ **Full catalog — 23 patterns:**
665
+
666
+ | Pattern | Anti-pattern detected | Better approach | Improvement |
667
+ |---------|----------------------|-----------------|-------------|
668
+ | Nested loop lookup | `for x in a: for y in b: if x==y` | Hash-map join | O(n·m) → O(n+m) |
669
+ | Membership test | `if x in list` in a loop | Set lookup | O(n) → O(1) per check |
670
+ | Sorting | Bubble / selection sort | Built-in sort | O(n²) → O(n log n) |
671
+ | Search in sorted data | Linear scan on sorted sequence | Binary search | O(n) → O(log n) |
672
+ | String building | `s += chunk` in loop | `join()` / StringBuilder | O(n²) → O(n) |
673
+ | Deduplication | Nested loop dedup | `set()` / `dict.fromkeys` | O(n²) → O(n) |
674
+ | Max / min | Manual tracking loop | `max()` / `min()` | idiom |
675
+ | Accumulation | Manual accumulator | `sum()` / `reduce()` | idiom |
676
+ | Group by key | Manual key-existence check | `defaultdict` / `groupingBy` | idiom |
677
+ | Fibonacci | Naive recursion | Iterative / `@lru_cache` | O(2ⁿ) → O(n) |
678
+ | Exponentiation | Loop multiplication | `pow(b, e, mod)` | O(n) → O(log n) |
679
+ | GCD | Manual loop | `math.gcd()` | O(n) → O(log n) |
680
+ | Matrix multiply | Naive triple loop | NumPy / BLAS | same asymptotic, ~1000× faster via SIMD |
681
+ | Busy wait | `while True: sleep()` poll | Event / condition variable | O(k) → O(1) wake-up |
682
+ | Regex in loop | `re.match()` compiled per iteration | Pre-compiled pattern | O(n·(p+m)) → O(p + n·m) |
683
+ | N+1 query | Per-item DB / API call in loop | Batch `WHERE IN (...)` | n round-trips → 1 |
684
+ | List front operations | `list.insert(0, x)` in loop | `collections.deque` | O(n) → O(1) per op |
685
+ | Sort to select | `sorted(x)[0]` or `sorted(x)[:k]` | `min()` / `heapq.nsmallest` | O(n log n) → O(n) or O(n log k) |
686
+ | Repeated lookup | `.index()` / `.contains()` inside loop | Pre-built set / dict | O(m) → O(1) per lookup |
687
+ | Branching recursion | Naive `f(n-1) + f(n-2)` without cache | `@cache` / iterative DP | O(2ⁿ) → O(n) |
688
+ | Quadratic string building | `result += chunk` across multiple scopes | `parts.append` + `join` at end | O(n²) → O(n) |
689
+ | Loop-invariant call | `get_config()` / `compile_schema()` inside loop body | Hoist before loop | per-iter cost → O(1) |
690
+ | String reversal | Manual char-by-char loop | `s[::-1]` / `.reverse()` | idiom |
691
+
692
+ **Filtering:**
693
+
694
+ ```bash
695
+ roam algo --task nested-lookup # one pattern type only
696
+ roam algo --confidence high # high-confidence findings only
697
+ roam algo --profile strict # precision-first filtering
698
+ roam algo --task io-in-loop -n 5 # top 5 N+1 query sites
699
+ roam --json algo # machine-readable output
700
+ roam --sarif algo > roam-algo.sarif # SARIF with fingerprints + fixes
701
+ ```
702
+
703
+ **Confidence calibration:** `high` = strong structural signal (unbounded loop + high caller/runtime impact + pattern confirmed); `medium` = pattern matched but uncertainty remains; `low` = heuristic signal only.
704
+
705
+ **Profiles:** `balanced` (default), `strict` (precision-first), `aggressive` (surface more candidates).
706
+
707
+ </details>
708
+
709
+ <details>
710
+ <summary><strong>roam minimap — annotated codebase snapshot for agent configs</strong></summary>
711
+
712
+ `roam minimap` generates a compact block (stack, annotated directory tree, key symbols, hotspots, conventions) wrapped in sentinel comments for in-place agent config updates:
713
+
714
+ ```
715
+ $ roam minimap
716
+ <!-- roam:minimap generated=2026-02-25 -->
717
+ **Stack:** Python · JavaScript · YAML
718
+
719
+ ```
720
+ .github/ (CI + Action)
721
+ benchmarks/ (agent-eval + oss-eval)
722
+ src/
723
+ roam/
724
+ bridges/
725
+ base.py # LanguageBridge
726
+ registry.py # register_bridge, detect_bridges
727
+ commands/ (137 cmd files) # is_test_file, get_changed_files
728
+ db/
729
+ connection.py # find_project_root, batched_in
730
+ schema.py
731
+ graph/
732
+ builder.py # build_symbol_graph, build_file_graph
733
+ pagerank.py # compute_pagerank, compute_centrality
734
+ languages/ (21 files) # ApexExtractor
735
+ output/
736
+ formatter.py # to_json, json_envelope
737
+ cli.py # cli, LazyGroup
738
+ mcp_server.py
739
+ tests/ (267 files)
740
+ ` ` `
741
+
742
+ **Key symbols** (PageRank): `open_db` · `ensure_index` · `json_envelope` · `to_json` · `LanguageExtractor`
743
+
744
+ **Touch carefully** (fan-in >= 15): `to_json` (116 callers) · `json_envelope` (116 callers) · `open_db` (105 callers) · `ensure_index` (100 callers)
745
+
746
+ **Hotspots** (churn x complexity): `cmd_context.py` · `csharp_lang.py` · `cmd_dead.py`
747
+
748
+ **Conventions:** snake_case fns, PascalCase classes
749
+ <!-- /roam:minimap -->
750
+ ```
751
+
752
+ **Workflow:**
753
+
754
+ ```bash
755
+ roam minimap # print to stdout
756
+ roam minimap --update # replace sentinel block in CLAUDE.md in-place
757
+ roam minimap -o docs/AGENTS.md # target a different file
758
+ roam minimap --init-notes # scaffold .roam/minimap-notes.md for project gotchas
759
+ ```
760
+
761
+ The sentinel pair `<!-- roam:minimap -->` / `<!-- /roam:minimap -->` is replaced on each run — surrounding content is left intact. Add project-specific gotchas to `.roam/minimap-notes.md` and they appear in every subsequent output.
762
+
763
+ **Tree annotations** come from the top exported symbols by fan-in per file. Non-source root directories (`.github/`, `benchmarks/`, `docs/`) are collapsed immediately. Large subdirectories (e.g. `commands/`, `languages/`) are collapsed at depth 2+ with a file count.
764
+
765
+ </details>
766
+
767
+ ### Architecture
768
+
769
+ | Command | Description |
770
+ |---------|-------------|
771
+ | `roam clusters [--min-size N]` | Community detection vs directory structure. Modularity Q-score (Newman 2004) + per-cluster conductance |
772
+ | `roam spectral [--depth N] [--compare] [--gap-only] [--k K]` | Spectral bisection: Fiedler vector partition tree with algebraic connectivity gap verdict |
773
+ | `roam layers` | Topological dependency layers + upward violations + Gini balance |
774
+ | `roam dead [--all] [--summary] [--clusters]` | Unreferenced exported symbols with safety verdicts + confidence scoring (60-95%) |
775
+ | `roam flag-dead [--config FILE] [--include-tests]` | Feature flag dead code detection: stale LaunchDarkly/Unleash/Split/custom flags with staleness analysis |
776
+ | `roam fan [symbol\|file] [-n N] [--no-framework]` | Fan-in/fan-out: most connected symbols or files |
777
+ | `roam risk [-n N] [--domain KW] [--explain]` | Domain-weighted risk ranking |
778
+ | `roam why <name> [name2 ...]` | Role classification (Hub/Bridge/Core/Leaf), reach, criticality |
779
+ | `roam split <file>` | Internal symbol groups with isolation % and extraction suggestions |
780
+ | `roam entry-points` | Entry point catalog with protocol classification |
781
+ | `roam patterns` | Architectural pattern recognition: Strategy, Factory, Observer, etc. |
782
+ | `roam visualize [--format mermaid\|dot] [--focus NAME] [--limit N]` | Generate Mermaid or DOT architecture diagrams. Smart filtering via PageRank, cluster grouping, cycle highlighting |
783
+ | `roam effects [TARGET] [--file F] [--type T]` | Side-effect classification: DB writes, network I/O, filesystem, global mutation. Direct + transitive effects through call graph |
784
+ | `roam side-effects [SYMBOL] [--kind K] [--top N]` | Classify symbol side-effects (io_read / io_write / mutation / process / none) — coarse, agent-friendly verdict that composes with `roam idempotency` |
785
+ | `roam idempotency [SYMBOL] [--kind K] [--top N]` | Classify symbol idempotency (idempotent / non_idempotent / unknown) — is this symbol safe to call twice? Builds on `roam side-effects` |
786
+ | `roam tx-boundaries [SYMBOL] [--classification C] [--top N]` | Classify functions by transactional safety (transactional / partial_transactional / unsafe_mutation / unmatched_begin / unmatched_commit / non_transactional / unknown). Composes with `roam idempotency` for retry-safety reasoning |
787
+ | `roam causal-graph [SYMBOL] [--kind K] [--top N]` | Build per-symbol causal graphs: trace input-to-sink data dependencies (param/global/env flowing into side-effect / return / raise / mutation). Heuristic — false negatives expected |
788
+ | `roam dark-matter [--min-cochanges N]` | Detect hidden co-change couplings not explained by import/call edges |
789
+ | `roam simulate move\|extract\|merge\|delete` | Counterfactual architecture simulator: test refactoring ideas in-memory, see metric deltas before writing code |
790
+ | `roam orchestrate --agents N [--files P]` | Multi-agent swarm partitioning: split codebase for parallel agents with zero-conflict guarantees |
791
+ | `roam partition [--agents N]` | Multi-agent partition manifest: conflict risk, complexity, and suggested ownership splits |
792
+ | `roam fingerprint [--compact] [--compare F]` | Topology fingerprint: extract/compare architectural signatures across repos |
793
+ | `roam graph-diff [--base L] [--head L] [--save-snapshot N]` | Structural diff between two graph snapshots: added/removed symbols, edge churn, new cycles, layer migrations, likely-move rename heuristics. Persists snapshots under `.roam/snapshots/` |
794
+ | `roam architecture-drift [--window 30d]` | Time-series structural-drift detection over `.roam/snapshots/`: classifies trend as improving / degrading / stable based on cycle counts, edge churn, and cohesion proxy |
795
+ | `roam cut <target> [--depth N]` | Minimum graph cuts: find critical edges whose removal disconnects components |
796
+ | `roam safe-zones` | Graph-based containment boundaries |
797
+ | `roam coverage-gaps` | Unprotected entry points with no path to gate symbols |
798
+ | `roam duplicates [--threshold T] [--min-lines N]` | Semantic duplicate detector: functionally equivalent code clusters with divergent edge-case handling |
799
+ | `roam clones [--threshold T] [--min-lines N] [--scope P]` | AST structural clone detection: Type-2 clones via subtree hashing (more precise than `duplicates`) |
800
+
801
+ ### Exploration
802
+
803
+ | Command | Description |
804
+ |---------|-------------|
805
+ | `roam module <path>` | Directory contents: exports, signatures, dependencies, cohesion |
806
+ | `roam sketch <dir> [--full]` | Compact structural skeleton of a directory |
807
+ | `roam uses <name>` | All consumers: callers, importers, inheritors. Use this *instead of* `grep "->X\|\.X\\b\|'X'\|\"X\""` to find references — graph-precise, no string-literal / comment false positives, structured by edge type. Available as `roam refs <name>` for grep-familiar muscle memory. |
808
+ | `roam owner <path>` | Code ownership: who owns a file or directory |
809
+ | `roam coupling [-n N] [--set]` | Temporal coupling: file pairs that change together (NPMI + lift) |
810
+ | `roam fn-coupling` | Function-level temporal coupling across files |
811
+ | `roam bus-factor [--brain-methods]` | Knowledge loss risk per module |
812
+ | `roam doc-staleness` | Detect stale docstrings |
813
+ | `roam docs-coverage` | Public-symbol doc coverage + stale docs + PageRank-ranked missing-doc hotlist |
814
+ | `roam stale-refs [--gate] [--diff REF] [--fix preview\|apply]` | Find dangling file references AND markdown anchor mismatches — confidence-tagged rename hints from git history / basename / symbol graph; HIGH-confidence auto-fix; branch-diff filter for CI; SARIF export. Index-free. |
815
+ | `roam lsp` | Minimal LSP server (JSON-RPC over stdio). Wire into VS Code / Neovim / JetBrains as a custom server to get squiggly underlines on dangling links and missing anchors as you type. |
816
+ | `roam suggest-refactoring [--limit N] [--min-score N]` | Proactive refactoring recommendations ranked by complexity, coupling, churn, smells, coverage gaps, and debt |
817
+ | `roam plan-refactor <symbol> [--operation auto\|extract\|move]` | Ordered refactor plan with blast radius, test gaps, layer risk, and simulation-based strategy preview |
818
+ | `roam test-scaffold <name\|file> [--write] [--framework F]` | Generate test file/function/import skeletons from symbol data (pytest, jest, Go, JUnit, RSpec) |
819
+ | `roam conventions` | Auto-detect naming styles, import preferences. Flags outliers |
820
+ | `roam breaking [REV_RANGE]` | Breaking change detection: removed exports, signature changes |
821
+ | `roam affected-tests <symbol\|file>` | Trace reverse call graph to test files |
822
+ | `roam relate <sym1> <sym2>` | Show relationship between two symbols: shared callers, shortest path, common ancestors |
823
+ | `roam endpoints [--routes] [--api]` | Enumerate all HTTP/API endpoint definitions and surface them for review or cross-repo matching |
824
+ | `roam metrics <file\|symbol>` | Unified vital signs: complexity, fan-in/out, PageRank, churn, test coverage, dead code risk -- all in one call |
825
+ | `roam findings list\|show\|count [--detector D]` | Query the central findings registry (the cross-detector denormalised view). 16+ detectors emit here (clones, dead, complexity, smells, n1, missing-index, over-fetch, bus-factor, auth-gaps, vulns, invariants, hotspots, taint, vibe-check, orphan-imports, conventions, pr-risk, duplicates, audit-trail-conformance, audit-trail-verify). Substrate for suppression and SARIF projection |
826
+ | `roam search-semantic <query>` | Hybrid semantic search: BM25 + TF-IDF + optional local ONNX vectors (select via `--backend`) with framework/library packs |
827
+ | `roam intent [--staged] [--range R]` | Doc-to-code linking: match documentation to symbols, detect drift |
828
+ | `roam x-lang [--bridges] [--edges]` | Cross-language edge browser: inspect bridge-resolved connections |
829
+ | `roam batch-search <pattern1> <pattern2> ... [--limit-per-query N] [--include-paths]` | Run up to 10 symbol-name pattern searches in one DB connection. Replaces 10 sequential `roam search` calls; results grouped by query |
830
+ | `roam complete <prefix> [--kind symbol\|path\|command\|all] [--limit N]` | Left-anchored prefix completions (FTS5-backed). Use `roam search` for substring matches and `roam search-semantic` for natural-language queries |
831
+
832
+ ### Reports & CI
833
+
834
+ | Command | Description |
835
+ |---------|-------------|
836
+ | `roam report [--list] [--config FILE] [PRESET]` | Compound presets: `first-contact`, `security`, `pre-pr`, `refactor`, `guardian` |
837
+ | `roam describe --write` | Generate agent config (auto-detects: CLAUDE.md, AGENTS.md, .cursor/rules, etc.) |
838
+ | `roam auth-gaps [--routes-only] [--controllers-only] [--min-confidence C]` | Find endpoints missing authentication or authorization: routes outside auth middleware groups, CRUD methods without `$this->authorize()` / `Gate::allows()` checks. String-aware PHP brace parsing |
839
+ | `roam orphan-routes [-n N] [--confidence C]` | Detect backend routes with no frontend consumer: parses route definitions, searches frontend for API call references, reports controller methods with no route mapping |
840
+ | `roam migration-safety [-n N] [--include-archive]` | Detect non-idempotent migrations: missing `hasTable`/`hasColumn` guards, raw SQL without `IF NOT EXISTS`, index operations without existence checks |
841
+ | `roam api-drift [--model M] [--confidence C]` | Detect mismatches between PHP model `$fillable`/`$appends` fields and TypeScript interface properties. Auto-converts snake_case/camelCase for comparison. Single-repo; cross-repo planned for `roam ws api-drift` |
842
+ | `roam codeowners [--unowned] [--owner NAME]` | CODEOWNERS coverage analysis: owned/unowned files, top owners, and ownership risk |
843
+ | `roam drift [--threshold N]` | Ownership drift detection: declared ownership vs observed maintenance activity |
844
+ | `roam suggest-reviewers [REV_RANGE]` | Reviewer recommendation via ownership, recency, breadth, and impact signals |
845
+ | `roam simulate-departure <developer>` | Knowledge-loss simulation: what breaks if a key contributor leaves |
846
+ | `roam dev-profile [--developer NAME] [--since N]` | Developer productivity profile: commit patterns, specialization, impact, and knowledge concentration per contributor |
847
+ | `roam secrets [--fail-on-found] [--include-tests]` | Secret scanning with masking, entropy detection, env-var suppression, remediation suggestions, and optional CI gate failure |
848
+ | `roam vulns [--import-file F] [--reachable-only]` | Vulnerability scanning: ingest npm/pip/trivy/osv reports, auto-detect format, reachability filtering, SARIF output |
849
+ | `roam path-coverage [--from P] [--to P] [--max-depth N]` | Find critical call paths (entry -> sink) with zero test protection. Suggests optimal test insertion points |
850
+ | `roam capsule [--redact-paths] [--no-signatures] [--output F]` | Export sanitized structural graph (no code bodies) for external architectural review |
851
+ | `roam rules [--init] [--ci] [--rules-dir D]` | Plugin DSL for governance: user-defined path/symbol/AST rules via `.roam/rules/` YAML (`$METAVAR` captures supported) |
852
+ | `roam check-rules [--severity S] [--fix]` | Evaluate built-in and user-defined governance rules (10 built-in: no-circular-imports, max-fan-out, etc.) |
853
+ | `roam vuln-map --generic\|--npm-audit\|--trivy F` | Ingest vulnerability reports and match to codebase symbols |
854
+ | `roam vuln-reach [--cve C] [--from E]` | Vulnerability reachability: exact paths from entry points to vulnerable calls |
855
+ | `roam supply-chain [--top N]` | Dependency risk dashboard: pin coverage, risk scoring, supply-chain health |
856
+ | `roam sbom [--format cyclonedx\|spdx] [--no-reachability] [-o FILE]` | SBOM generation (CycloneDX 1.5 / SPDX 2.3) enriched with call-graph reachability per dependency |
857
+ | `roam congestion [--window N] [--min-authors N]` | Developer congestion detection: concurrent authors per file, coordination risk scoring |
858
+ | `roam invariants [--staged] [--range R]` | Discover architectural contracts (invariants) from the codebase structure |
859
+
860
+ ### Multi-Repo Workspace
861
+
862
+ | Command | Description |
863
+ |---------|-------------|
864
+ | `roam ws init <repo1> <repo2> [--name NAME]` | Initialize a workspace from sibling repos. Auto-detects frontend/backend roles |
865
+ | `roam ws status` | Show workspace repos, index ages, cross-repo edge count |
866
+ | `roam ws resolve` | Scan for REST API endpoints and match frontend calls to backend routes |
867
+ | `roam ws understand` | Unified workspace overview: per-repo stats + cross-repo connections |
868
+ | `roam ws health` | Workspace-wide health report with cross-repo coupling assessment |
869
+ | `roam ws context <symbol>` | Cross-repo augmented context: find a symbol across repos + show API callers |
870
+ | `roam ws trace <source> <target>` | Trace cross-repo paths via API edges |
871
+
872
+ ### Global Options
873
+
874
+ | Option | Description |
875
+ |--------|-------------|
876
+ | `roam --json <command>` | Structured JSON output with consistent envelope |
877
+ | `roam --compact <command>` | Token-efficient output: TSV tables, minimal JSON envelope |
878
+ | `roam --sarif <command>` | SARIF 2.1.0 output for dead, health, complexity, rules, secrets, algo, py-types, py-modern (GitHub/CI integration) |
879
+ | `roam health --gate` | CI quality gate. Reads `.roam-gates.yml` thresholds. Exit code 5 on failure |
880
+
881
+ </details>
882
+
883
+ ## Walkthrough: Investigating a Codebase
884
+
885
+ <details>
886
+ <summary><strong>10-step walkthrough using Flask as an example</strong> (click to expand)</summary>
887
+
888
+ Here's how you'd use Roam to understand a project you've never seen before. Using Flask as an example:
889
+
890
+ **Step 1: Onboard and get the full picture**
891
+
892
+ ```
893
+ $ roam init
894
+ Created .roam/fitness.yaml (6 starter rules)
895
+ Created .github/workflows/roam.yml
896
+ Done. 226 files, 1132 symbols, 233 edges.
897
+ Health: 78/100
898
+
899
+ $ roam understand
900
+ Tech stack: Python (flask, jinja2, werkzeug)
901
+ Architecture: Monolithic — 3 layers, 5 clusters
902
+ Key abstractions: Flask, Blueprint, Request, Response
903
+ Health: 78/100 — 1 god component (Flask)
904
+ Entry points: src/flask/__init__.py, src/flask/cli.py
905
+ Conventions: snake_case functions, PascalCase classes, relative imports
906
+ Complexity: avg 4.2, 3 high (>15), 0 critical (>25)
907
+ ```
908
+
909
+ **Step 2: Drill into a key file**
910
+
911
+ ```
912
+ $ roam file src/flask/app.py
913
+ src/flask/app.py (python, 963 lines)
914
+
915
+ cls Flask(App) :76-963
916
+ meth __init__(self, import_name, ...) :152
917
+ meth route(self, rule, **options) :411
918
+ meth register_blueprint(self, blueprint, ...) :580
919
+ meth make_response(self, rv) :742
920
+ ...12 more methods
921
+ ```
922
+
923
+ **Step 3: Who depends on this?**
924
+
925
+ ```
926
+ $ roam deps src/flask/app.py
927
+ Imported by:
928
+ file symbols
929
+ -------------------------- -------
930
+ src/flask/__init__.py 3
931
+ src/flask/testing.py 2
932
+ tests/test_basic.py 1
933
+ ...18 files total
934
+ ```
935
+
936
+ **Step 4: Find the hotspots**
937
+
938
+ ```
939
+ $ roam weather
940
+ === Hotspots (churn x complexity) ===
941
+ Score Churn Complexity Path Lang
942
+ ----- ----- ---------- ---------------------- ------
943
+ 18420 460 40.0 src/flask/app.py python
944
+ 12180 348 35.0 src/flask/blueprints.py python
945
+ ```
946
+
947
+ **Step 5: Check architecture health**
948
+
949
+ ```
950
+ $ roam health
951
+ Health: 78/100
952
+ Tangle: 0.0% (0/1132 symbols in cycles)
953
+ 1 god component (Flask, degree 47, actionable)
954
+ 0 bottlenecks, 0 layer violations
955
+
956
+ === God Components (degree > 20) ===
957
+ Sev Name Kind Degree Cat File
958
+ ------- ----- ---- ------ --- ------------------
959
+ WARNING Flask cls 47 act src/flask/app.py
960
+ ```
961
+
962
+ **Step 6: Get AI-ready context for a symbol**
963
+
964
+ ```
965
+ $ roam context Flask
966
+ Files to read:
967
+ src/flask/app.py:76-963 # definition
968
+ src/flask/__init__.py:1-15 # re-export
969
+ src/flask/testing.py:22-45 # caller: FlaskClient.__init__
970
+ tests/test_basic.py:12-30 # caller: test_app_factory
971
+ ...12 more files
972
+
973
+ Callers: 47 Callees: 3
974
+ ```
975
+
976
+ **Step 7: Pre-change safety check**
977
+
978
+ ```
979
+ $ roam preflight Flask
980
+ === Preflight: Flask ===
981
+ Blast radius: 47 callers, 89 transitive
982
+ Affected tests: 31 (DIRECT: 12, TRANSITIVE: 19)
983
+ Complexity: cc=40 (critical), nesting=6
984
+ Coupling: 3 hidden co-change partners
985
+ Fitness: 1 violation (max-complexity exceeded)
986
+ Verdict: HIGH RISK — consider splitting before modifying
987
+ ```
988
+
989
+ **Step 8: Decompose a large file**
990
+
991
+ ```
992
+ $ roam split src/flask/app.py
993
+ === Split analysis: src/flask/app.py ===
994
+ 87 symbols, 42 internal edges, 95 external edges
995
+ Cross-group coupling: 18%
996
+
997
+ Group 1 (routing) — 12 symbols, isolation: 83% [extractable]
998
+ meth route L411 PR=0.0088
999
+ meth add_url_rule L450 PR=0.0045
1000
+ ...
1001
+
1002
+ === Extraction Suggestions ===
1003
+ Extract 'routing' group: route, add_url_rule, endpoint (+9 more)
1004
+ 83% isolated, only 3 edges to other groups
1005
+ ```
1006
+
1007
+ **Step 9: Understand why a symbol matters**
1008
+
1009
+ ```
1010
+ $ roam why Flask url_for Blueprint
1011
+ Symbol Role Fan Reach Risk Verdict
1012
+ --------- ------------ ---------- -------- -------- --------------------------------------------------
1013
+ Flask Hub fan-in:47 reach:89 CRITICAL God symbol (47 in, 12 out). Consider splitting.
1014
+ url_for Core utility fan-in:31 reach:45 HIGH Widely used utility (31 callers). Stable interface.
1015
+ Blueprint Bridge fan-in:18 reach:34 moderate Coupling point between clusters.
1016
+ ```
1017
+
1018
+ **Step 10: Generate docs and set up CI**
1019
+
1020
+ ```
1021
+ $ roam describe --write
1022
+ Wrote CLAUDE.md (98 lines) # auto-detects: CLAUDE.md, AGENTS.md, .cursor/rules, etc.
1023
+
1024
+ $ roam health --gate
1025
+ Health: 78/100 — PASS
1026
+ ```
1027
+
1028
+ Ten commands. Complete picture: structure, dependencies, hotspots, health, context, safety checks, decomposition, and CI gates.
1029
+
1030
+ </details>
1031
+
1032
+ ## Integration with AI Coding Tools
1033
+
1034
+ Roam is designed to be called by coding agents via shell commands. Instead of repeatedly grepping and reading files, the agent runs one `roam` command and gets structured output.
1035
+
1036
+ **Decision order for agents:**
1037
+
1038
+ | Situation | Command |
1039
+ |-----------|---------|
1040
+ | First time in a repo | `roam understand` then `roam tour` |
1041
+ | Need to modify a symbol | `roam preflight <name>` (blast radius + tests + fitness) |
1042
+ | Debugging a failure | `roam diagnose <name>` (root cause ranking) |
1043
+ | Need files to read | `roam context <name>` (files + line ranges) |
1044
+ | Need to find a symbol | `roam search <pattern>` |
1045
+ | Need file structure | `roam file <path>` |
1046
+ | Pre-PR check | `roam pr-risk HEAD~3..HEAD` |
1047
+ | What breaks if I change X? | `roam impact <symbol>` |
1048
+ | Check for N+1 queries | `roam n1` (implicit lazy-load detection) |
1049
+ | Check auth coverage | `roam auth-gaps` (routes + controllers) |
1050
+ | Check migration safety | `roam migration-safety` (idempotency guards) |
1051
+
1052
+ **Fastest setup:**
1053
+
1054
+ ```bash
1055
+ roam describe --write # auto-detects your agent's config file
1056
+ roam describe --write -o AGENTS.md # or specify an explicit path
1057
+ roam describe --agent-prompt # compact ~500-token prompt (append to any config)
1058
+ roam minimap --update # inject/refresh annotated codebase minimap in CLAUDE.md
1059
+ ```
1060
+
1061
+ **Agent not using Roam correctly?** If your agent is ignoring Roam and falling back to grep/read exploration, it likely doesn't have the instructions. Run:
1062
+
1063
+ ```bash
1064
+ roam describe --write # writes instructions to your agent's config (CLAUDE.md, AGENTS.md, etc.)
1065
+ ```
1066
+
1067
+ If you already have a config file and don't want to overwrite it:
1068
+
1069
+ ```bash
1070
+ roam describe --agent-prompt # prints a compact prompt — copy-paste into your existing config
1071
+ roam minimap --update # injects an annotated codebase snapshot into CLAUDE.md (won't touch other content)
1072
+ ```
1073
+
1074
+ This teaches the agent which Roam command to use for each situation (e.g., `roam preflight` before changes, `roam context` for files to read, `roam diagnose` for debugging).
1075
+
1076
+ <details>
1077
+ <summary><strong>Copy-paste agent instructions</strong></summary>
1078
+
1079
+ ```markdown
1080
+ ## Codebase navigation
1081
+
1082
+ This project uses `roam` for codebase comprehension. Always prefer roam over Glob/Grep/Read exploration.
1083
+
1084
+ Before modifying any code:
1085
+ 1. First time in the repo: `roam understand` then `roam tour`
1086
+ 2. Find a symbol: `roam search <pattern>`
1087
+ 3. Before changing a symbol: `roam preflight <name>` (blast radius + tests + fitness)
1088
+ 4. Need files to read: `roam context <name>` (files + line ranges, prioritized)
1089
+ 5. Debugging a failure: `roam diagnose <name>` (root cause ranking)
1090
+ 6. After making changes: `roam diff` (blast radius of uncommitted changes)
1091
+
1092
+ Additional: `roam health` (0-100 score), `roam impact <name>` (what breaks),
1093
+ `roam pr-risk` (PR risk), `roam file <path>` (file skeleton).
1094
+
1095
+ Run `roam --help` for all commands. Use `roam --json <cmd>` for structured output.
1096
+ ```
1097
+
1098
+ </details>
1099
+
1100
+ <details>
1101
+ <summary><strong>Where to put this for each tool</strong></summary>
1102
+
1103
+ | Tool | Config file |
1104
+ |------|-------------|
1105
+ | **Claude Code** | `CLAUDE.md` in your project root |
1106
+ | **OpenAI Codex CLI** | `AGENTS.md` in your project root |
1107
+ | **Gemini CLI** | `GEMINI.md` in your project root |
1108
+ | **Cursor** | `.cursor/rules/roam.mdc` (add `alwaysApply: true` frontmatter) |
1109
+ | **Windsurf** | `.windsurf/rules/roam.md` (add `trigger: always_on` frontmatter) |
1110
+ | **GitHub Copilot** | `.github/copilot-instructions.md` |
1111
+ | **Aider** | `CONVENTIONS.md` |
1112
+ | **Continue.dev** | `config.yaml` rules |
1113
+ | **Cline** | `.clinerules/` directory |
1114
+
1115
+ </details>
1116
+
1117
+ <details>
1118
+ <summary><strong>Roam vs native tools</strong></summary>
1119
+
1120
+ | Task | Use Roam | Use native tools |
1121
+ |------|----------|-----------------|
1122
+ | "What calls this function?" | `roam symbol <name>` | LSP / Grep |
1123
+ | "What files do I need to read?" | `roam context <name>` | Manual tracing (5+ calls) |
1124
+ | "Is it safe to change X?" | `roam preflight <name>` | Multiple manual checks |
1125
+ | "Show me this file's structure" | `roam file <path>` | Read the file directly |
1126
+ | "Understand project architecture" | `roam understand` | Manual exploration |
1127
+ | "What breaks if I change X?" | `roam impact <symbol>` | No direct equivalent |
1128
+ | "What tests to run?" | `roam affected-tests <name>` | Grep for imports (misses indirect) |
1129
+ | "What's causing this bug?" | `roam diagnose <name>` | Manual call-chain tracing |
1130
+ | "Codebase health score for CI" | `roam health --gate` | No equivalent |
1131
+
1132
+ </details>
1133
+
1134
+ ## MCP Server
1135
+
1136
+ Roam includes a [Model Context Protocol](https://modelcontextprotocol.io/) server for direct integration with tools that support MCP.
1137
+
1138
+ ```bash
1139
+ pip install "roam-code[mcp]"
1140
+ roam mcp
1141
+ ```
1142
+
1143
+ 169 tools, 10 resources, and 6 prompts are available in the full preset. Most tools are read-only index queries; side-effect tools are explicitly annotated.
1144
+
1145
+ See [Using Roam via MCP](https://roam-code.com/docs/mcp-usage) for the first-run flow, the cold-start envelope your agent will see on a fresh repo, and the canonical 7-step agent sequence.
1146
+
1147
+ **MCP v2 highlights (v11):**
1148
+ - In-process MCP execution (no subprocess shell-out per call)
1149
+ - Preset-based tool surfacing (`core`, `review`, `refactor`, `debug`, `architecture`, `full`)
1150
+ - Compound tools that collapse multi-step exploration/review flows into one call
1151
+ - Structured output schemas + tool annotations for safer planner behavior
1152
+
1153
+ **MCP-native enhancements (v12):**
1154
+ - **Sampling-driven compression** -- pass `summarize=True` to `roam_explore`, `roam_understand`, `roam_health`, or `roam_repo_map`. The server asks the client's own LLM (no API keys) to compress the full envelope into a short briefing, dropping output from ~50 KB JSON to ~1-2 KB prose. Falls back gracefully when the client doesn't support sampling.
1155
+ - **Server-side session memory** -- `roam_context`, `roam_explore`, and `roam_retrieve` now remember symbols you've touched in the current session and auto-bias ranking without you threading `recent_symbols` through every call. Explicit args still win.
1156
+ - **Phase-aware progress** -- `roam_init`, `roam_reindex`, and `roam_orchestrate` stream real `discover -> parse -> extract -> resolve -> graph -> metrics` progress to the client, replacing the old 5/100 placeholders.
1157
+ - **Symbol & path completions** -- new `roam_complete(prefix, kind, limit)` tool returns just names from the FTS5 index (cheaper than `roam_search_symbol`). A protocol-level handler is also installed for clients that support `completion/complete`.
1158
+ - **Reactive resource invalidation** (opt-in) -- set `ROAM_MCP_WATCH=1` and the server watches the working tree, runs incremental reindex on file changes, and emits `notifications/resources/updated` for `roam://health`, `roam://summary`, etc., so subscribed clients see fresh data without polling.
1159
+
1160
+ <!-- BEGIN auto-count:readme-default-preset -->
1161
+ **Default preset:** `core` (58 tools: 57 core + `roam_expand_toolset` meta-tool).
1162
+ <!-- END auto-count:readme-default-preset -->
1163
+
1164
+ ```bash
1165
+ # Default
1166
+ roam mcp
1167
+
1168
+ # Full toolset
1169
+ ROAM_MCP_PRESET=full roam mcp
1170
+
1171
+ # Legacy compatibility (same as full preset)
1172
+ ROAM_MCP_LITE=0 roam mcp
1173
+ ```
1174
+
1175
+ <!-- BEGIN auto-count:readme-mcp-core-preset-tools -->
1176
+ Core preset tools: `roam_affected_tests`, `roam_alerts`, `roam_ask`, `roam_audit_trail_conformance_check`, `roam_audit_trail_export`, `roam_audit_trail_verify`, `roam_batch_get`, `roam_batch_search`, `roam_catalog`, `roam_complete`, `roam_complexity_report`, `roam_context`, `roam_critique`, `roam_dead_code`, `roam_deps`, `roam_diagnose`, `roam_diagnose_issue`, `roam_diff`, `roam_disambiguate`, `roam_dogfood`, `roam_explore`, `roam_fetch_handle`, `roam_file_info`, `roam_fleet_plan`, `roam_for_bug_fix`, `roam_for_new_feature`, `roam_for_refactor`, `roam_for_security_review`, `roam_health`, `roam_impact`, `roam_metrics_push`, `roam_oracle_is_clone_of`, `roam_oracle_is_reachable_from_entry`, `roam_oracle_is_test_only`, `roam_oracle_route_exists`, `roam_oracle_symbol_exists`, `roam_pr_analyze`, `roam_pr_comment_render`, `roam_pr_risk`, `roam_preflight`, `roam_prepare_change`, `roam_py_modern`, `roam_py_types`, `roam_retrieve`, `roam_review_change`, `roam_rules_validate`, `roam_search_symbol`, `roam_session_metrics`, `roam_syntax_check`, `roam_taint_classify`, `roam_test_impact`, `roam_timeline`, `roam_trace`, `roam_understand`, `roam_uses`, `roam_validate_plan`, `roam_why_fail`.
1177
+ <!-- END auto-count:readme-mcp-core-preset-tools -->
1178
+
1179
+ <details>
1180
+ <!-- BEGIN auto-count:readme-mcp-tool-list-summary -->
1181
+ <summary><strong>MCP tool list (all 224)</strong></summary>
1182
+ <!-- END auto-count:readme-mcp-tool-list-summary -->
1183
+
1184
+ *New in v12.26: `roam_pr_analyze`, `roam_pr_comment_render`, `roam_metrics_push`, `roam_audit_trail_verify`, `roam_audit_trail_export`, `roam_audit_trail_conformance_check`, `roam_rules_validate`, `roam_dogfood` — Roam Review + Cloud engines + governance audit-trail toolkit + production-grade rules linting + one-shot v2 stack runner.*
1185
+
1186
+ <!-- BEGIN auto-count:readme-mcp-tool-list-table -->
1187
+ | Tool | Description |
1188
+ |------|-------------|
1189
+ | `roam_adrs` | Discover Architecture Decision Records (ADRs) and link them to code modules. Scans well-known ADR directories (``docs/adr/`` / ``architecture/decisions/`` / ...) for markdown files matching ADR naming patterns, parses each ADR's title / status / date / file refs, then cross-references mentioned files against the symbol index. Different from ``roam_doc_staleness`` (inline docstring drift) -- this is the prose-decision-document discoverer. |
1190
+ | `roam_adversarial` | Frame architectural issues in changed files as challenges the developer must defend: CRITICAL (new cyclic dependencies), HIGH (layer violations, high-confidence anti-patterns), WARNING (cross-cluster coupling, high fan-out), INFO (orphaned symbols). Composes cycles + clusters + layers + catalog + dead + complexity. Different from ``roam_diff`` (blast-radius facts) -- this is the architecture-review framing for code-review agents. |
1191
+ | `roam_adversarial_review` | Adversarial architecture review: challenges about cycles, anti-patterns, coupling. |
1192
+ | `roam_affected` | Monorepo impact analysis: find all affected packages/modules from changes. |
1193
+ | `roam_affected_tests` | Test files that exercise changed code, with hop distance. |
1194
+ | `roam_agent_context` | Extract a single agent's partition from the full agent plan: write scope, read-only dependencies, interface contracts, coordination instructions, and key symbols. Different from ``roam_agent_plan`` (full multi-agent view) and ``roam_orchestrate`` (operational dispatch with merge order) -- this is the focused per-worker packet for one agent. |
1195
+ | `roam_agent_export` | Generate AI agent context file (CLAUDE.md/AGENTS.md/.cursorrules) from index. |
1196
+ | `roam_agent_plan` | Decompose partitions into dependency-ordered multi-agent tasks: per-task write scope, read-only dependencies, interface contracts, phase schedule, and merge sequencing. Supports ``plain`` / ``json`` / ``claude-teams`` output formats. Different from ``roam_partition`` (raw analytical manifest) and ``roam_orchestrate`` (operational dispatch) -- this is the dependency-ordered phase schedule. |
1197
+ | `roam_agent_score` | Aggregate runs from the local ledger and score each agent on a 0..100 composite (run completion, gate adherence, preflight compliance, blast accuracy, replay survival). Empty state (no runs / no matching runs) returns a clean envelope with ``state: "no_data"`` -- never empty stdout, never a crash. Different from ``roam_runs_verify`` (HMAC tamper-detection) -- this is the per-agent quality score across runs. |
1198
+ | `roam_ai_ratio` | Estimate AI-generated code percentage from git commit heuristics. |
1199
+ | `roam_ai_readiness` | AI readiness score (0-100): how effectively AI agents can work on this codebase. |
1200
+ | `roam_alerts` | Active health alerts: thresholds breached on tangle, complexity, churn, or coverage. |
1201
+ | `roam_algo` | Detect suboptimal algorithms with better alternatives and complexity analysis. |
1202
+ | `roam_annotate_symbol` | Add persistent annotation to a symbol/file for future agent sessions. |
1203
+ | `roam_api` | List the public API surface — exported public symbols with signatures and docs. |
1204
+ | `roam_api_changes` | Detect breaking and non-breaking API changes vs a git ref. |
1205
+ | `roam_api_drift` | Mismatches between backend models and frontend interfaces. |
1206
+ | `roam_architecture_drift` | Compute per-week growth rates for symbols / edges / cycles across a sliding window of persisted ``.roam/snapshots/`` and classify overall direction as ``improving`` / ``degrading`` / ``stable``. Different from ``roam_graph_diff`` (point-in-time delta between two commits) and ``roam_trends`` (metric-level time series) -- this is the snapshot-based architectural-trajectory report. |
1207
+ | `roam_article_12_check` | Run a 6-item EU AI Act Article 12 readiness checklist over the indexed repo: audit-trail directory, audit-trail records, retention policy doc, technical docs, attestation surface, high-risk classification heuristic. Emits a structured envelope mapping each item to its Article (12, 18, 19) or Annex (III). Different from ``roam_audit_trail_conformance_check`` (per-record chain integrity) -- this is the repo-level governance-readiness assessment. Per the agentic-assurance guardrails: 'maps to' / 'supports evidence for', never 'certifies' / 'makes compliant'. |
1208
+ | `roam_ask` | Free-form intent dispatcher: maps a natural-language question ("is it safe to delete X", "where does login validate", "what just broke") to one of 24 pre-built recipes that compose preflight / retrieve / critique / fleet / diagnose / trace / trends / hotspots / debt / taint commands. Call this BEFORE falling back to Grep+Read — the recipe registry covers most common workflows in one tool call. |
1209
+ | `roam_attest` | Proof-carrying PR attestation: evidence bundle + merge verdict. |
1210
+ | `roam_audit` | Run a one-shot codebase architecture audit: bundles health, debt, dead-code, risk, test-pyramid, coverage, and API-surface signals into a single envelope. Designed as the structured artifact a written audit report attaches. Different from ``roam_health`` (single 0-100 score) and ``roam_report`` (preset-driven Markdown report) -- this is the verdict-first audit packet for governance and onboarding. |
1211
+ | `roam_audit_trail_conformance_check` | Score the audit trail against an EU AI Act Article 12 checklist. |
1212
+ | `roam_audit_trail_export` | Export the audit trail as markdown / json / csv for procurement review. |
1213
+ | `roam_audit_trail_verify` | Verify SHA-256 chain integrity of a roam audit trail. |
1214
+ | `roam_auth_gaps` | Endpoints missing authentication or authorization checks. |
1215
+ | `roam_batch_get` | Get details for up to 50 symbols in one call. Replaces 50 sequential roam_symbol calls. |
1216
+ | `roam_batch_search` | Search up to 10 patterns in one call. Replaces 10 sequential roam_search_symbol calls. |
1217
+ | `roam_bisect_blame` | Find snapshots that caused architectural degradation, ranked by impact. |
1218
+ | `roam_breaking_changes` | Detect breaking API changes between git refs: removed exports, changed signatures. |
1219
+ | `roam_brief` | Compose a one-page agent briefing covering five sections: ``next`` (what ``roam next`` would recommend), ``highlights`` (stack / top danger zones / top mined laws from ``roam agents-md``), ``pr_bundle`` (current PR-bundle status on the active branch), ``mode`` (active agent mode and its allow-list size), and ``runs`` (the N most-recent runs from the ledger). Designed as the FIRST command an agent runs when joining a roam-indexed repo. Different from ``roam_next`` (single-command router) -- this is the verdict-first session kickoff packet. |
1220
+ | `roam_budget_check` | Check changes against architectural budgets (cycles, health floor, complexity). |
1221
+ | `roam_bus_factor` | Score knowledge-concentration risk per directory: Shannon entropy over unique authors, primary-author share, last activity, and a staleness factor. Flags CRITICAL / HIGH / MEDIUM / LOW per module. Different from ``roam_owner`` (per-file blame) and ``roam_congestion`` (too-many-authors merge-conflict risk) -- this measures knowledge-loss risk. |
1222
+ | `roam_capsule_export` | Sanitized structural graph export without code bodies (privacy-safe). |
1223
+ | `roam_catalog` | Return the full machine-readable list of every roam MCP tool currently registered, including title, description, and capability flags (core / read_only / destructive). Use this once at session start to discover what's available without enumerating tools. |
1224
+ | `roam_causal_graph` | Build per-symbol causal graphs: edges from inputs (parameters / globals / env reads) to sinks (side-effecting calls / return / raise / mutation). Six causal kinds: ``param_to_effect``, ``param_to_return``, ``global_to_effect``, ``global_to_mutation``, ``env_to_effect``, ``param_to_raise``. Heuristic line-level text scan -- false negatives expected. Different from ``roam_taint`` (cross-symbol taint propagation) -- this is intra-symbol dataflow only. |
1225
+ | `roam_cga_emit` | Emit a Code Graph Attestation — in-toto v1 statement with predicate type `roam-code.dev/CodeGraph/v1` (or `CodeGraph-AIBOM/v1` with --aibom). Merkle root over symbol fingerprints + edge-bundle digest. Optional cosign keyless or offline signing. |
1226
+ | `roam_cga_verify` | Verify a Code Graph Attestation — re-derives the Merkle root + edge-bundle digest from the live DB and compares to the bundled predicate, AND verifies the cosign signature on the sibling `.bundle`. Fails closed (exit 5) when no bundle is present unless no_cosign=True is passed to acknowledge predicate-only verification. |
1227
+ | `roam_changelog` | List commits since last tag, optionally formatted as a markdown CHANGELOG draft. |
1228
+ | `roam_check_rules` | Run 10 built-in structural rules: cycles, fan-out, complexity, tests, god classes, layer violations. |
1229
+ | `roam_clean` | Remove orphaned index entries (files deleted from disk) without full rebuild. |
1230
+ | `roam_clones` | Detect near-duplicate code via AST structural hashing (Type-2 clones). |
1231
+ | `roam_closure` | Minimal set of changes needed for rename/delete/modify (exact files + lines). |
1232
+ | `roam_clusters` | Show Louvain code clusters and directory mismatches. Returns per-cluster size, cohesion, conductance, modularity Q, mega-cluster sub-group breakdowns, and inter-cluster coupling. Different from ``roam_layers`` (dependency-layer violations) -- this groups by community detection, not by topological depth. |
1233
+ | `roam_codeowners` | CODEOWNERS coverage, ownership distribution, unowned files, drift detection. |
1234
+ | `roam_compare` | Diff two roam indices structurally: reports symbols added/removed/moved, per-file complexity deltas above a threshold, language counts, and a one-line health verdict (improved / regressed / sideways). Different from ``roam_graph_diff`` (commit-range graph delta from one index) -- this is the cross-index structural delta for release-vs-release comparisons. |
1235
+ | `roam_complete` | Prefix completion for symbols / file paths / commands. Faster than search; returns just names. |
1236
+ | `roam_complexity_report` | Functions ranked by cognitive complexity above threshold. |
1237
+ | `roam_congestion` | Detect developer congestion: files with too many concurrent authors within a sliding time window. Combines author count, churn intensity, and complexity into a congestion score that predicts merge conflicts and coordination failures. Different from ``roam_bus_factor`` (knowledge-loss risk) and ``roam_owner`` (per-file blame breakdown) -- this measures too-many-cooks contention. |
1238
+ | `roam_context` | Minimal files + line ranges needed to work with a symbol. |
1239
+ | `roam_conventions` | Auto-detect codebase naming, file, import, and export conventions with outliers. |
1240
+ | `roam_coupling` | Show temporal coupling: file pairs that change together. Reads git history to find files with high co-change frequency. Different from ``roam_fan`` (structural connectivity) and ``roam_dark_matter`` (hidden co-change) -- this measures file-level temporal coupling. |
1241
+ | `roam_coverage_gaps` | Find unprotected entry points: top-level exported functions / methods that have no call-graph path to a required gate symbol (auth / permission / validation). Supports exact gate names, regex patterns, framework presets (python / javascript / go / java-maven / rust), and a ``.roam-gates.yml`` sidecar config. Different from ``roam_auth_gaps`` (PHP/Laravel source analysis) and ``roam_test_gaps`` (untested symbols in changed files) -- this walks the call graph to verify every entry reaches a required gate. |
1242
+ | `roam_critique` | Verify a patch against the indexed graph (clones-not-edited + blast radius). Pipe a diff in `diff_text`. |
1243
+ | `roam_cut` | Find fragile domain boundaries via minimum-cut analysis. Computes the thinnest edge cuts between architectural clusters and the highest-impact 'leak edges' whose removal would best improve domain isolation. Different from ``roam_split`` (decomposes a single file) -- this finds boundaries between clusters. |
1244
+ | `roam_cut_analysis` | Minimum cut analysis: fragile domain boundaries, highest-impact leak edges. |
1245
+ | `roam_dark_matter` | File pairs that co-change without structural links (hidden coupling). |
1246
+ | `roam_dashboard` | Unified single-screen codebase status: health, hotspots, bus factor, dead code, AI rot. |
1247
+ | `roam_dead_code` | Unreferenced exported symbols (dead code candidates). |
1248
+ | `roam_debt` | Prioritized tech debt with SQALE remediation cost estimates. |
1249
+ | `roam_delete_check` | Gate the diff (working / staged / PR / HEAD) on surviving references to deleted symbols and files. Per-deletion verdict: SAFE (no surviving references), LIKELY-SAFE (survivors only in tests / docs / unreachable code), or BREAK-RISK (survivors in reachable code). Different from ``roam_critique`` (PR-wide diff review) -- this targets the deletion surface specifically with CI-gate semantics (overall BREAK-RISK trips the gate). |
1250
+ | `roam_deps` | File-level imports and importers (what depends on this file). |
1251
+ | `roam_describe` | Auto-generate a project description for AI coding agents: multi-section Markdown report covering overview, directories, entry points, key abstractions, architecture, and testing. Different from ``roam_understand`` (compact codebase overview) -- this is the comprehensive prose description for CLAUDE.md / AGENTS.md / .cursor/rules. The wrapper emits to stdout; on-disk writes are deferred to the CLI (``roam describe --write``) so the MCP surface stays read-only. |
1252
+ | `roam_dev_profile` | Developer behavioral profiling: commit time patterns, change scatter (Gini), burst detection. |
1253
+ | `roam_diagnose` | Root cause analysis: upstream/downstream suspects ranked by composite risk. |
1254
+ | `roam_diagnose_issue` | Debug bundle: root cause suspects + side effects in one call. |
1255
+ | `roam_diff` | Blast radius of uncommitted/committed changes: affected symbols, files, tests. |
1256
+ | `roam_disambiguate` | List every symbol matching a name with file/line/kind/signature/PageRank — pick the right overload. |
1257
+ | `roam_doc_intent` | Link documentation to code: find drift, dead refs, undocumented symbols. |
1258
+ | `roam_doc_staleness` | Detect stale docstrings: docs whose body has drifted since the comment was written. Uses ``git blame`` to compare docstring timestamps against code body timestamps. Different from ``roam_docs_coverage`` (missing docs ranked by PageRank) and ``roam_stale_refs`` (dangling doc links) -- this audits what existing docs SAY. |
1259
+ | `roam_docs_coverage` | Doc coverage + stale-doc drift with PageRank-ranked missing docs. |
1260
+ | `roam_doctor` | Setup diagnostics: Python version, tree-sitter, git, index existence, freshness, SQLite. |
1261
+ | `roam_dogfood` | One-shot full-stack run: audit + pr-analyze + audit-trail + conformance. |
1262
+ | `roam_dogfood_aggregate` | Triage view over the dogfood eval corpus: totals, per-command findings count, by-status / by-severity / by-type breakdowns. Reads ``internal/dogfood/evals/`` (or an override path). Useful for agents auditing roam-code itself; mostly a no-op on consumer repos that have no dogfood corpus. |
1263
+ | `roam_drift` | Ownership drift detection: declared CODEOWNERS vs actual time-decayed contributors. |
1264
+ | `roam_duplicates` | Detect semantically duplicate functions via structural similarity. |
1265
+ | `roam_effects` | Side effects of functions: DB writes, network, filesystem (direct + transitive). |
1266
+ | `roam_endpoints` | List all REST/GraphQL/gRPC endpoints with handlers, methods, and locations. |
1267
+ | `roam_entry_points` | Catalog every entry point into the codebase: HTTP routes, CLI commands, scheduled jobs, event handlers, message consumers, main functions, and exports. Reports per-entry reachability coverage -- what fraction of symbols each entry transitively reaches through the call graph. |
1268
+ | `roam_eval_retrieve` | Run the retrieval eval harness over a labeled task set. Reports recall@K, mean reciprocal rank, and per-task diagnostics. Supports a weight sweep and CodeRAG-Bench / BEIR emit formats for public leaderboard submission. |
1269
+ | `roam_evidence_diff` | Diff two ``ChangeEvidence`` packets: shows hash drift, schema drift, added/removed refs, missing evidence, and changed verdicts. Useful for reviewing PR re-runs, comparing replay windows, or auditing whether a fresh evidence packet has improved or regressed against a stored baseline. Different from ``roam_compare`` (two-index structural delta) -- this is the two-packet evidence delta. |
1270
+ | `roam_evidence_doctor` | Diagnose a ChangeEvidence packet's health: schema validity, closed-enum conformance, content_hash integrity, completeness banner tier (STRONG / PARTIAL / INSUFFICIENT), declared redactions, and actionable next steps for partial / missing evidence questions. Read-only. |
1271
+ | `roam_evidence_oscal` | Emit an OSCAL v1.2 document. Default kind='control-mapping' compiles the roam control map (maps roam evidence to EU AI Act, ISO/IEC 42001, NIST AI RMF, NIST AI 600-1, NIST SP 800-218A, SOC 2, internal AI-change policy). kind='assessment-results' compiles a per-run AR document from a ChangeEvidence packet (requires evidence_path); AR mandates an Assessment Plan reference — pass import_ap_ref for an external AP or omit it to inline a synthesized stub AP. Supports evidence for the listed frameworks — does not certify compliance. Two roam-specific concepts (authority_refs, redactions) surface as OSCAL ``prop`` extensions under the ``urn:roam:oscal:v1`` namespace. |
1272
+ | `roam_expand_toolset` | List available tool presets or show contents of a preset. Presets: core (16), review (27), refactor (26), debug (27), architecture (29), full (all). |
1273
+ | `roam_explore` | Codebase exploration bundle: understand overview + optional symbol deep-dive in one call. |
1274
+ | `roam_fan` | Show fan-in / fan-out: the most-connected symbols or files. Flags hub / spreader / HIGH-RISK structural hotspots based on cross-file import / call edges. Different from coupling (co-change frequency) -- this measures structural connectivity. |
1275
+ | `roam_fetch_handle` | Fetch all or part of a large payload by handle — supports byte slice, section pick, jq projection. |
1276
+ | `roam_file_info` | File skeleton: all symbols with signatures, kinds, line ranges. |
1277
+ | `roam_findings_count` | Show per-detector finding counts. Useful for spotting which detectors have migrated to the central registry vs which are still only emitting to their detector-specific tables. |
1278
+ | `roam_findings_list` | List rows from the central findings registry, optionally filtered by detector or subject. Cross-detector view -- every migrated detector (clones, dead, complexity, smells, n1, missing-index, ...) emits here behind one schema. |
1279
+ | `roam_findings_show` | Show full detail for a single finding by its stable ``finding_id_str``. Returns the detector version, subject, confidence tier, claim, evidence JSON, and any suppressions. |
1280
+ | `roam_fingerprint` | Topology fingerprint for cross-repo comparison or structural drift tracking. |
1281
+ | `roam_fitness` | Run architectural fitness functions from ``.roam/fitness.yaml``: dependency constraints, layer enforcement, metric thresholds, naming conventions, and trend regression guards. Different from ``roam_preflight`` (compound 6-signal pre-edit gate) -- this is the dedicated fitness surface with per-rule output, baseline / delta mode, and trend regression guards. |
1282
+ | `roam_flag_dead` | Detect potentially stale feature-flag code: flags referenced only once, flags always checked with the same boolean default, and flags clustered in a single file. Recognises LaunchDarkly, Unleash, Split, generic ``feature_flag(...)`` calls, and ``FEATURE_*`` env-var patterns. Different from ``roam_dead_code`` (graph-unreachable symbols) -- this targets code that is alive in the graph but gated behind flags that may never fire. |
1283
+ | `roam_fleet_plan` | Plan a multi-agent fleet for a goal — graph-aware partition (Louvain + co-change) emits .roam-fleet.json for Composio / Copilot CLI / raw. |
1284
+ | `roam_fn_coupling` | Show function-level temporal coupling: symbol pairs that change together across commits. Different from ``roam_coupling`` (file-level pairs) -- this drills into co-changing symbols inside and across files, with optional structural-edge filtering. |
1285
+ | `roam_for_bug_fix` | Compound: diagnose + affected_tests + diff + context for a symbol you're about to debug. |
1286
+ | `roam_for_new_feature` | Compound: understand + search + context + complexity for an area you're about to add code to. |
1287
+ | `roam_for_refactor` | Compound: preflight + impact + complexity_report + clones for a symbol you're about to refactor. |
1288
+ | `roam_for_security_review` | Compound: taint + vuln + critique + adversarial for a security review pass. |
1289
+ | `roam_forecast` | Predict when metrics will exceed thresholds (Theil-Sen regression). |
1290
+ | `roam_generate_plan` | Structured execution plan for code modification: read order, invariants, tests. |
1291
+ | `roam_get_annotations` | Read annotations for symbols, files, or project. Filter by tag/date. |
1292
+ | `roam_get_invariants` | Implicit contracts for symbols: signature stability, usage spread, breaking risk. |
1293
+ | `roam_graph_diff` | Show the structural graph delta between two snapshots. Surfaces new / removed symbols, edge churn, degree shifts, new cycles, layer migrations, and likely renames. Reads persisted snapshots from ``.roam/snapshots/`` -- capture one with ``--save-snapshot``. |
1294
+ | `roam_graph_stats` | Report graph-level invariants: density, connected components, average in/out degree, top in-degree symbols, and approximate diameter. One overview number for 'how dense, connected, and cyclic is this codebase'. |
1295
+ | `roam_grep` | Run index-aware grep across the codebase. Returns matches with their enclosing symbol, reachability badge, PageRank, clone-class, and bridge annotations. Supports multi-pattern, source-only / test-only filters, reachable-from / unreachable filters, co-occurrence across patterns, and rank-by importance. |
1296
+ | `roam_guard` | Check breaking-change risk for a symbol before editing: 0..100 risk score with component breakdown (blast radius, complexity, centrality, test gap, layer analysis) plus caller / callee lists and covering tests -- all within a ~2K-token budget. Different from ``roam_preflight`` (file / staged / coupling / convention / fitness composite) -- this is the per-symbol quantified risk score for sub-agent dispatch. |
1297
+ | `roam_health` | Codebase health score (0-100) with issue breakdown, cycles, bottlenecks. |
1298
+ | `roam_history_grep` | Run git pickaxe (``-S`` / ``-G``) through commit history. Returns commits that introduced or removed the literal string, with author, date, short SHA, and summary per commit. |
1299
+ | `roam_hotspots` | Show runtime hotspots: symbols ranked by static analysis vs real production traces (requires ``roam ingest-trace`` to have populated ``runtime_stats``). Each row is tagged UPGRADE (runtime-critical but statically safe), CONFIRMED (both agree), or DOWNGRADE (statically risky but low traffic). Different from ``roam_why_slow`` (top-N by latency alone) -- this classifies static vs runtime mismatch. |
1300
+ | `roam_hover` | One-line architectural summary for a symbol — kind, location, blast-radius bucket, top caller, top callee. |
1301
+ | `roam_idempotency` | Classify symbols by retry safety: ``idempotent`` (pure, read-only I/O, write-with-check patterns like ``mkdir(exist_ok=True)`` / ``INSERT OR IGNORE`` / ``UPSERT`` / ``if not exists: create``), ``non_idempotent`` (naive writes, mutations, appends), or ``unknown`` (process spawn / unreadable body). Composes on top of ``roam_side_effects``. Different from ``roam_tx_boundaries`` (transaction correctness) -- this answers ``is it safe to retry?``. |
1302
+ | `roam_impact` | Blast radius for 'is it safe to change?' — symbols + files affected, in 5 lines. Compact decision-support output. Round 4 / S: the right default tool for safety-checks; preflight is heavier. |
1303
+ | `roam_ingest_trace` | Ingest runtime traces (OTel/Jaeger/Zipkin), match spans to symbols. |
1304
+ | `roam_init` | Initialize roam and build the first index. Task-mode for non-blocking setup. |
1305
+ | `roam_intent` | Link documentation to code: find which docs mention which symbols, and detect doc-to-code drift (references to non-existent symbols). Different from ``roam_docs_coverage`` (PageRank-ranked missing-docstring hotlist) and ``roam_doc_staleness`` (stale docstring content) -- this is the prose-doc-to-symbol linker plus drift detector. |
1306
+ | `roam_invariants` | Discover implicit contracts for a symbol or the public API surface: signature shape, parameter count and ordering, usage spread across files, dependency set. Different from ``roam_check_rules`` (explicit governance rules) -- this is the AUTO-discovered implicit-contract surface so agents know what must stay stable when modifying a symbol. |
1307
+ | `roam_layers` | Show topological dependency layers and violations. Returns each layer's symbol count, directory breakdown, and any back-edges that violate the topological order. Different from ``roam_clusters`` (community detection) -- this measures dependency depth. |
1308
+ | `roam_llm_smells` | Run LLM-API integration linter over indexed files: detects unpinned model versions, missing max_tokens, prompt injection via user-input concatenation, unvalidated json.loads on LLM output, and missing temperature. Different from ``roam_vibe_check`` (AI-generated code shape) and ``roam_smells`` (structural anti-patterns) -- this is the production gate for human-authored LLM-using code. |
1309
+ | `roam_map` | Show project skeleton: directory tree, entry points, top symbols by PageRank, language counts. Different from ``roam_describe`` (prose description) and ``roam_minimap`` (sentinel-block one-pager for CLAUDE.md) -- this is the structured skeleton with directories, entry points, and ranked symbols for agent onboarding. |
1310
+ | `roam_metrics` | Show unified per-file or per-symbol metrics: cognitive complexity, fan-in / fan-out, SNA centrality vector (PageRank / betweenness / closeness / eigenvector / clustering coefficient), composite debt score, churn, test coverage, and comprehension difficulty in a single view. |
1311
+ | `roam_metrics_push` | Push metrics-only summary to Roam Cloud Lite. |
1312
+ | `roam_migration_plan` | Generate an ordered migration plan with risk + blast-radius per step from a target-architecture YAML spec or inline ``--move SYMBOL=path/to/new/file`` directives. Each step is annotated with caller count and a derived risk score so agents can decide where to stop or insert tests. Stops at the first step exceeding ``max_risk``. Different from ``roam_simulate`` (counterfactual single-move analysis) -- this is the ordered multi-step plan with a risk gate. |
1313
+ | `roam_migration_safety` | Non-idempotent database migrations (unsafe for re-run). |
1314
+ | `roam_minimap` | Generate a compact ~20-line codebase minimap for CLAUDE.md injection: tech stack, annotated directory tree, key symbols by PageRank, high-fan-in symbols to avoid, hotspots, detected conventions. Different from ``roam_describe`` (long-form prose) and ``roam_map`` (structured skeleton) -- this is the sentinel-block one-pager. The wrapper emits to stdout; on-disk updates are deferred to the CLI (``roam minimap --update`` / ``--init-notes``) so the MCP surface stays read-only. |
1315
+ | `roam_missing_index` | Queries on non-indexed columns (slow query risk). |
1316
+ | `roam_module` | Show directory contents: exported symbols, signatures, external imports / importers, internal cohesion percentage, and API surface ratio. Different from ``roam_describe`` (project-wide) -- this analyses a single directory. |
1317
+ | `roam_mutate` | Agentic editing: move/rename/add-call/extract symbols with auto-import rewrite. |
1318
+ | `roam_n1` | Detect N+1 I/O patterns in ORM code (Laravel/Django/Rails/SQLAlchemy/JPA). |
1319
+ | `roam_next` | Suggest the next ``roam`` command based on cheap repo-state signals: index presence, staleness, working-tree dirtiness, recent envelope, and recent memory. Emits one imperative recommendation in <200ms. Different from ``roam_brief`` (multi-section session kickoff) and ``roam_workflow`` (curated multi-step recipes) -- this is the single-command router. |
1320
+ | `roam_onboard` | Generate a new-developer onboarding guide for the codebase. |
1321
+ | `roam_oracle_batch` | Run multiple oracle queries in one call. Items: [{name, oracle, max_hops?}, ...] where oracle is one of symbol-exists, route-exists, is-test-only, is-reachable-from-entry, is-clone-of. |
1322
+ | `roam_oracle_is_clone_of` | Answer the boolean oracle question: does this symbol have persisted clone siblings in the ``clone_pairs`` table? Returns a yes/no verdict envelope with the matched clone class size. Different from ``roam_clones`` (full clone-pair enumeration) -- this is the cheap boolean lookup for one symbol's clone status. |
1323
+ | `roam_oracle_is_reachable_from_entry` | Answer the boolean oracle question: is the symbol reachable from any entry point via the call graph (BFS up to ``max_hops`` depth)? Useful for sniffing orphans and production-vs-tooling code. Different from ``roam_dead_code`` (broad dead-symbol detection) and ``roam_entry_points`` (entry-point enumeration) -- this is the cheap boolean lookup for one symbol's reachability. |
1324
+ | `roam_oracle_is_test_only` | Answer the boolean oracle question: are ALL callers of this symbol in test files? Useful for sniffing test fixtures and dead-but-test-only helpers. Different from ``roam_dead_code`` (broad dead-symbol detection) -- this is the cheap boolean lookup for one symbol's test-only status. |
1325
+ | `roam_oracle_route_exists` | Answer the boolean oracle question: does a route handler match this URL path? Returns a yes/no verdict envelope with the matched handler's file + kind when found. Different from ``roam_endpoints`` (full endpoint enumeration) -- this is the cheap boolean lookup for one route precondition check. |
1326
+ | `roam_oracle_symbol_exists` | Answer the boolean oracle question: does a symbol with this name exist in the index? Returns a yes/no verdict envelope with the matched symbol's file + kind when found. Different from ``roam_search_symbol`` (top-N ranked hits) -- this is the cheap boolean lookup for agent precondition checks. |
1327
+ | `roam_oracle_test_only` | Alias of roam_oracle_is_test_only — preserves the shorter name agents sometimes guess. |
1328
+ | `roam_orchestrate` | Partition codebase for parallel multi-agent work with exclusive write zones. |
1329
+ | `roam_orphan_imports` | List imports that don't resolve to any indexed module or installed package -- catches typo'd local imports, missing packages, and dangling relative imports. Covers Python (default), JavaScript / TypeScript, and Go. Different from ``roam_dead_code`` (unused symbols) -- this targets import-statement orphans. |
1330
+ | `roam_orphan_routes` | Backend routes with no frontend consumer (dead endpoints). |
1331
+ | `roam_over_fetch` | Models serializing too many fields (data over-exposure risk). |
1332
+ | `roam_owner` | Show code ownership computed from git blame: per-author line counts, percentages, last-active dates, and a fragmentation index. Works on a file or a directory prefix. Different from ``roam_codeowners`` (which reads the CODEOWNERS file) -- this measures actual ownership. |
1333
+ | `roam_partition` | Multi-agent work partitioning: split codebase into independent work zones. |
1334
+ | `roam_path_coverage` | Critical call paths with zero test protection, ranked by risk. |
1335
+ | `roam_patterns` | Detect positive architectural patterns: Singleton, Factory, Observer, Repository, Middleware, Strategy, and Decorator. Different from ``roam_smells`` (negative anti-patterns) -- this discovers intentional design patterns. |
1336
+ | `roam_plan` | Generate a structured execution plan for modifying code: read-order (call-graph BFS), invariants (mined contracts), blast-radius preview, and per-task heuristics. Five task types: ``refactor`` / ``debug`` / ``extend`` / ``review`` / ``understand``. Different from ``roam_plan_refactor`` (refactoring-specific simulation) and ``roam_preflight`` (blast-radius gate) -- this is the general-purpose work plan for any task type. |
1337
+ | `roam_plan_refactor` | Build an ordered refactor plan for one symbol using risk/test/simulation context. |
1338
+ | `roam_postmortem` | Replay current detectors against past commits: walks a git commit range, runs ``roam critique`` against each commit's diff, and reports which findings would have surfaced pre-merge. Useful for retrospective replay -- 'would today's detector set have caught the incidents already in history?' Different from ``roam_pr_replay`` (one PR replay) -- this is the range-replay over historical commits. |
1339
+ | `roam_pr_analyze` | Agent-aware PR risk verdict — INTENTIONAL / SAFE / REVIEW / BLOCK. |
1340
+ | `roam_pr_comment_render` | Render a markdown PR comment from a pr-analyze JSON envelope. |
1341
+ | `roam_pr_diff` | Structural graph delta of code changes: metric deltas, layer violations. |
1342
+ | `roam_pr_prep` | One-shot pre-PR fitness check: bundles ``diff`` blast radius + ``critique`` + ``pr-risk`` into a single envelope with a ``ready_to_open`` verdict. Different from ``roam_pr_risk`` (composite risk score alone) and ``roam_critique`` (clones-not-edited + blast-radius alone) -- this is the three-section pre-PR rollup with the go/no-go verdict. |
1343
+ | `roam_pr_risk` | Risk score (0-100) for pending changes with per-file breakdown. |
1344
+ | `roam_preflight` | Pre-change safety check: blast radius, tests, complexity, fitness. Call BEFORE modifying code. |
1345
+ | `roam_prepare_change` | Pre-change bundle: preflight + context + effects in one call. Call BEFORE modifying code. |
1346
+ | `roam_py_modern` | Python modernisation signal: walrus, match, PEP 604/585, f-strings vs legacy. |
1347
+ | `roam_py_types` | Python type-annotation health: % public fns fully typed, Any usage, legacy typing. |
1348
+ | `roam_pytest_fixtures` | pytest fixture chain: top fixtures by dependent count, or per-symbol dependency walk. |
1349
+ | `roam_recommend` | Surface symbols related to a given symbol via three signal sources combined: call-graph neighbours (1-hop in + out), git co-change (other symbols whose files changed in the same commits), and persisted clone siblings (when ``roam clones --persist`` was run). Each candidate gets a score that's the normalised sum of the three contributions. Different from ``roam_impact`` (transitive blast radius) and ``roam_neighbours`` (graph-only 1-hop neighbours) -- this fuses co-change + clones into the ranking. |
1350
+ | `roam_refs_text` | Audit literal strings across the project and emit a per-string verdict: SAFE-TO-REMOVE / REVIEW / LOAD-BEARING. Groups every reference by surface (code, test, docs, config, generated, vendored) and annotates reachability for code hits. |
1351
+ | `roam_reindex` | Incremental or force reindex. Task-mode + elicited confirmation for force runs. |
1352
+ | `roam_relate` | How symbols connect: shared deps, call chains, conflicts, cohesion score. |
1353
+ | `roam_repo_map` | Compact project skeleton with key symbols per file, by PageRank. |
1354
+ | `roam_report` | Run a compound report preset (built-ins: ``first-contact``, ``security``, ``pre-pr``, ``refactor``, ``guardian``) that orchestrates multiple analysis commands into one rendered report. Different from ``roam_audit`` (single fixed bundle) -- this is the preset-driven multi-command roll-up with optional Markdown output and strict exit-code gating. |
1355
+ | `roam_reset` | Delete index DB and rebuild from scratch. Requires force=True. Recovery for corrupted indexes. |
1356
+ | `roam_retrieve` | Graph-aware context for free-form tasks: FTS5 + structural rerank (PageRank + clones) + token budget. |
1357
+ | `roam_review_change` | Change review bundle: pr-risk + breaking changes + structural diff in one call. |
1358
+ | `roam_risk` | Rank symbols by domain-weighted risk: combines static risk (fan-in + fan-out + betweenness) with domain criticality weights so financial / auth / data-integrity symbols rank higher than UI symbols. Different from ``roam_fan`` (raw fan-in/out degree) and ``roam_hotspots`` (runtime hotspot classification) -- this is the semantic-domain-weighted risk heatmap. |
1359
+ | `roam_rules_check` | Evaluate custom governance rules from .roam/rules/ YAML files. |
1360
+ | `roam_rules_validate` | Lint a `. |
1361
+ | `roam_runtime_hotspots` | Runtime hotspots where static and runtime rankings disagree (UPGRADE/DOWNGRADE). |
1362
+ | `roam_safe_delete` | Fuse dead-code, blast-radius, and test-coverage signals into a single deletion verdict: SAFE / REVIEW / UNSAFE. Reports direct callers (non-test), transitive dependents, affected files, and a public-API bump that flips SAFE -> REVIEW for exported symbols whose name matches a common public-API prefix. Different from ``roam_dead_code`` (all unreferenced symbols) and ``roam_impact`` (transitive blast radius) -- this is the single go/no-go gate. |
1363
+ | `roam_safe_zones` | Classify the refactor containment zone around a symbol or file: ISOLATED (no external connections), CONTAINED (<=5 boundary symbols), or EXPOSED (>5). Reports strictly-internal vs boundary symbols and external caller / callee counts per boundary. Different from ``roam_impact`` (unbounded reverse blast radius) and ``roam_closure`` (exact locations needing modification) -- this maps the bounded zone where it is safe to refactor freely. |
1364
+ | `roam_sbom` | Emit a Software Bill of Materials (CycloneDX 1.7 by default, or SPDX 2.3) enriched with call-graph reachability — distinguishes phantom dependencies from those actually exercised. Pair with --aibom for the AIBOM extension required by EU AI Act Art. 50. |
1365
+ | `roam_search_semantic` | Find symbols by natural language query (hybrid BM25 + vector + framework packs). |
1366
+ | `roam_search_symbol` | Find symbols by name substring. Returns kind, file, line, PageRank importance. |
1367
+ | `roam_secrets` | Scan for hardcoded secrets, API keys, tokens, passwords (24 patterns). |
1368
+ | `roam_semantic_diff` | Structural change summary: what symbols were added/removed/modified. |
1369
+ | `roam_session_metrics` | Local-only telemetry: per-tool invocation counts grouped by outcome (success / rate_limited / error). Helps answer "which tools are agents actually using?" and "are 90 of the 137 tools dead weight?". Never phones home — counters live in the MCP server process and reset on restart. |
1370
+ | `roam_side_effects` | Classify symbols by side-effect bucket: ``none`` (pure), ``io_read`` (disk / network / DB read), ``io_write`` (disk / network / DB write), ``mutation`` (global / module state mutation), ``process`` (subprocess / thread / async), or ``unknown``. Coarse five-bucket taxonomy designed for agent decisions. Different from ``roam_effects`` (finer 11-kind taxonomy + transitive propagation) -- this is the agent's go/no-go classifier for ``can I retry this safely?``. |
1371
+ | `roam_simulate` | Predict metric deltas from move/extract/merge/delete operations. |
1372
+ | `roam_simulate_departure` | Simulate knowledge loss if a developer leaves the team. |
1373
+ | `roam_sketch` | Render a compact structural skeleton of a directory: every file's exported symbols with kind, signature, line range, and first-line docstring. Different from ``roam_understand`` (broader project overview) and ``roam_file_info`` (one-file skeleton) -- this is the directory-level API surface in a single view, with optional ``full=True`` to include private symbols. |
1374
+ | `roam_smells` | Run 15 deterministic code-smell detectors over the indexed codebase: brain methods, god classes, deep nesting, shotgun surgery, feature envy, long parameter lists, large classes, dead params, low cohesion, message chains, data clumps, and more. Different from ``roam_vibe_check`` (AI-rot pattern regex) and ``roam_patterns`` (positive design patterns) -- this surfaces negative structural anti-patterns from DB queries. |
1375
+ | `roam_spectral` | Spectral bisection: Fiedler vector partition tree and modularity gap. |
1376
+ | `roam_split` | Analyse a file's internal call / reference graph and propose natural decomposition groups via Louvain community detection. Reports per-group isolation %, internal vs cross-group edges, and ranked extraction candidates (groups with >=3 symbols and >=50% isolation). Different from ``roam_clusters`` (repo-wide module partitioning) -- this analyses ONE file's internal seams. |
1377
+ | `roam_stale_refs` | Find dangling file references — markdown links / HTML href-src / backtick paths whose target is missing. v12.48 adds anchor validation, confidence-tagged hints, --diff branch filter, --fix preview/apply, and --sort-by ranking. Set enrich_with_llm=True for LLM-sampled hints on findings the deterministic providers couldn't resolve. |
1378
+ | `roam_stats` | Aggregate high-level statistics: language / role / kind counts plus a recent-commit activity counter over a configurable window. Different from ``roam_metrics`` (per-symbol static-metric report) and ``roam_graph_stats`` (graph-wide topology stats) -- this is the language-and-role inventory snapshot. |
1379
+ | `roam_suggest_refactoring` | Rank proactive refactoring candidates using complexity/coupling/churn/smells. |
1380
+ | `roam_suggest_reviewers` | Suggest optimal code reviewers for changed files. |
1381
+ | `roam_supply_chain` | Dependency risk dashboard: pin coverage, risk scoring, supply-chain health. |
1382
+ | `roam_symbol` | Symbol definition, callers, callees, PageRank, fan-in/out metrics. |
1383
+ | `roam_syntax_check` | Tree-sitter syntax validation. Finds ERROR/MISSING AST nodes. No index needed. |
1384
+ | `roam_taint` | Graph-reach taint analysis. Returns OpenVEX-shaped findings (spec-legal status + justification — never `code_not_reachable`). 10 starter rule packs: sqli, xss, ssrf, path-traversal, command-injection, deserialization, open-redirect, urllib, socketio, fileupload. Pair with --ci to gate on findings (exit 5). |
1385
+ | `roam_taint_classify` | Run `roam taint` then ask the agent's own LLM (via MCP sampling) to classify each reachable finding as IDOR/AUTHZ/SQLI/XSS/CMD_INJECTION/etc. with confidence + reasoning. Counter to Semgrep Multimodal — same LLM-reasoning narrative without a hosted API key. |
1386
+ | `roam_test_gaps` | Find changed symbols missing test coverage, ranked by severity. |
1387
+ | `roam_test_impact` | Tests transitively reachable from changed symbols — sharper scope than affected_tests. |
1388
+ | `roam_test_map` | Map a symbol or file to its current test coverage: direct test edges (test file calls the symbol), file-level importers (test file imports the symbol's module), and convention-based matches (Salesforce ``<Name>Test`` / ``<Name>_Test`` classes). Different from ``roam_test_gaps`` (untested symbols in changed files) and ``roam_affected_tests`` (forward trace from changes to affected tests) -- this is the lookup for what currently exercises a given symbol. |
1389
+ | `roam_test_pyramid` | Count indexed test files by kind (unit / integration / e2e / smoke / unknown) using path and name conventions, and flag inverted pyramids (when ``e2e + integration > unit``). Different from ``roam_test_gaps`` (missing coverage) -- this measures the shape of the existing test suite for slow-CI risk. |
1390
+ | `roam_test_scaffold` | Generate a test-file skeleton for a source file or symbol (functions, classes, methods) with the right imports and per-symbol stub blocks. Supports pytest / unittest (Python), jest / mocha / vitest (JS/TS), Go testing, JUnit4 / JUnit5 (Java), and RSpec / Minitest (Ruby). Dry-run by default; pair with ``roam_test_map`` first to confirm no existing coverage. Skips symbols that already have tests in the target file. |
1391
+ | `roam_timeline` | Chronological commits that touched the file owning a symbol — author, date, lines added/removed. |
1392
+ | `roam_tour` | Codebase onboarding guide: reading order, entry points, architecture roles. |
1393
+ | `roam_trace` | Shortest dependency path between two symbols with hop details. |
1394
+ | `roam_trends` | Historical metric tracking: record and query health metric trends over time. |
1395
+ | `roam_tx_boundaries` | Classify functions by transactional safety: ``transactional`` (begin matched by commit/rollback, all mutations inside scope), ``partial_transactional`` (mutations both inside AND outside scope), ``unsafe_mutation`` (mutations OUTSIDE any transaction wrapper -- latent bug), ``unmatched_begin`` (begin without commit/rollback -- leak), ``unmatched_commit``, ``non_transactional``, or ``unknown``. Composes on top of ``roam_side_effects``. Different from ``roam_idempotency`` (retry safety) -- this gates transaction correctness. |
1396
+ | `roam_understand` | Full codebase briefing: stack, architecture, health, hotspots. Call FIRST in a new repo. |
1397
+ | `roam_uses` | All consumers of a symbol: callers, importers, inheritors by edge type. Use this *instead of* a multi-shape grep ("->X\|\.X\b\|'X'\|\"X\"") to find references — graph-precise, no string-literal / comment false positives, and the result is already structured by edge type. For 3+ symbols call `roam_batch_get` (one round-trip) instead. |
1398
+ | `roam_validate_plan` | Pre-apply validator for a multi-step change plan. Returns blockers, warnings, advice per operation. |
1399
+ | `roam_verify` | Check changed files for naming, import, error-handling, and duplicate issues. |
1400
+ | `roam_verify_imports` | Hallucination firewall: validate import statements resolve to indexed symbols. |
1401
+ | `roam_vibe_check` | AI rot score (0-100): 8-pattern taxonomy of AI code anti-patterns. |
1402
+ | `roam_visualize` | Generate Mermaid/DOT architecture diagram with smart filtering. |
1403
+ | `roam_vuln_map` | Ingest vulnerability scanner reports (npm/pip/trivy/osv), match to symbols. |
1404
+ | `roam_vuln_reach` | Vulnerability reachability through call graph: paths, hops, blast radius. |
1405
+ | `roam_weather` | Churn x complexity hotspot ranking: highest-leverage refactoring targets. |
1406
+ | `roam_why` | Explain why a symbol matters: role classification (Hub/Bridge/Leaf), transitive reach, critical-path membership, cluster cohesion, and a one-line verdict. Accepts multiple symbol names for batch triage. Different from ``roam_fan`` (raw connectivity ranking) and ``roam_preflight`` (blast-radius gate before edit) -- this is the per-symbol role explainer for triage and onboarding. |
1407
+ | `roam_why_fail` | Triage a failing test/symbol: recently-changed symbols transitively reachable from it. |
1408
+ | `roam_why_slow` | Rank runtime hotspots by cost = log10(call_count + 1) * p99_latency_ms. Reads ``runtime_stats`` populated by ``roam ingest-trace``. Optionally restricts to symbols in changed files vs a base ref. Different from ``roam_hotspots`` (static-vs-runtime classification) -- this is the pure latency-weighted ranking. |
1409
+ | `roam_workflow` | Inspect a workflow recipe DAG, list available recipes, or suggest what to run next given a prior command. Useful as an agent navigation aid: 'I just ran roam impact -- what should I run next?' Different from the heavyweight analytical recipes -- this is the metadata-only recipe browser. |
1410
+ | `roam_ws_context` | Cross-repo augmented context for a symbol spanning multiple repos. |
1411
+ | `roam_ws_understand` | Multi-repo workspace overview: per-repo stats, cross-repo connections. |
1412
+ | `roam_x_lang` | Show cross-language symbol bridges: Protobuf .proto -> generated Go/Java/Python stubs, Salesforce Apex -> Aura/LWC/Visualforce, REST API frontend -> backend route, template variable -> source, and env-var read -> .env definition. Use ``roam_bridges`` to list registered bridge types. |
1413
+ <!-- END auto-count:readme-mcp-tool-list-table -->
1414
+
1415
+ **Resources:** `roam://health` (current health score), `roam://summary` (project overview)
1416
+
1417
+ </details>
1418
+
1419
+ <details>
1420
+ <summary><strong>Claude Code</strong></summary>
1421
+
1422
+ ```bash
1423
+ claude mcp add roam-code -- roam mcp
1424
+ ```
1425
+
1426
+ Or add to `.mcp.json` in your project root:
1427
+
1428
+ ```json
1429
+ {
1430
+ "mcpServers": {
1431
+ "roam-code": {
1432
+ "command": "roam",
1433
+ "args": ["mcp"]
1434
+ }
1435
+ }
1436
+ }
1437
+ ```
1438
+
1439
+ </details>
1440
+
1441
+ <details>
1442
+ <summary><strong>Claude Desktop</strong></summary>
1443
+
1444
+ Add to your `claude_desktop_config.json`:
1445
+
1446
+ ```json
1447
+ {
1448
+ "mcpServers": {
1449
+ "roam-code": {
1450
+ "command": "roam",
1451
+ "args": ["mcp"],
1452
+ "cwd": "/path/to/your/project"
1453
+ }
1454
+ }
1455
+ }
1456
+ ```
1457
+
1458
+ </details>
1459
+
1460
+ <details>
1461
+ <summary><strong>Cursor</strong></summary>
1462
+
1463
+ Add to `.cursor/mcp.json`:
1464
+
1465
+ ```json
1466
+ {
1467
+ "mcpServers": {
1468
+ "roam-code": {
1469
+ "command": "roam",
1470
+ "args": ["mcp"]
1471
+ }
1472
+ }
1473
+ }
1474
+ ```
1475
+
1476
+ </details>
1477
+
1478
+ <details>
1479
+ <summary><strong>VS Code + Copilot</strong></summary>
1480
+
1481
+ Add to `.vscode/mcp.json`:
1482
+
1483
+ ```json
1484
+ {
1485
+ "servers": {
1486
+ "roam-code": {
1487
+ "type": "stdio",
1488
+ "command": "roam",
1489
+ "args": ["mcp"]
1490
+ }
1491
+ }
1492
+ }
1493
+ ```
1494
+
1495
+ </details>
1496
+
1497
+ ## Roam Review (PR bot for AI-generated changes)
1498
+
1499
+ > **Status (2026-05-09):** Early access. Pricing published, sign-up via
1500
+ > [hello@roam-code.com](mailto:hello@roam-code.com). Flat tiers from
1501
+ > $99/mo: Starter $99 · Team $299 · Business $799 · Scale $1,499. Free
1502
+ > for open-source forever. Full pricing at <https://roam-code.com/pricing>.
1503
+
1504
+ Most "AI safety net" tools — CodeRabbit, Greptile, Qodo — review PR **semantics** (does the diff *look* right?). They don't read your **graph**: who calls the changed symbol, which layer it belongs to, whether the AI just touched a god-component with 47 callers. Roam Review fills that gap.
1505
+
1506
+ `roam pr-analyze` is the CLI engine: pipe a unified diff in, get back a verdict (`INTENTIONAL` / `SAFE` / `REVIEW` / `BLOCK`) plus AI-likelihood score, blast radius, rule violations, suggested reviewers, and a governance audit-trail record.
1507
+
1508
+ ```bash
1509
+ git diff main..HEAD | roam pr-analyze --explain --with-reviewers --audit-trail
1510
+ roam pr-analyze main..HEAD --gate # exit 5 on BLOCK (CI gate)
1511
+ roam --json pr-analyze --input pr.diff | roam pr-comment-render # ready-to-post markdown
1512
+ roam pr-analyze --batch ./diffs/ --cache --parallel 4 # 24-55x speedup on incremental re-runs
1513
+ roam audit-trail-verify # check SHA-256 chain integrity
1514
+ roam audit-trail-conformance-check --gate # governance-evidence score (CI)
1515
+ ```
1516
+
1517
+ **Nine weighted heuristic signals** score the diff for AI-likelihood: add/remove ratio, comment density, test coverage, function-size variance, generic naming, orphan imports, **placeholder density** (TODO/FIXME/NotImplementedError stubs), **LLM-phrase density** ("we use this approach because…"), **suspicious imports** (numbered modules, mass typing imports). Each carries **language-aware weights** across Python / TypeScript / JavaScript / Go / Rust / Java / Kotlin. Starter rule packs ship for Python, TypeScript, Go, and Java at [`templates/rules/`](templates/rules/) — drop one at `.roam/rules.yml` to enable. Custom rules look like:
1518
+
1519
+ ```yaml
1520
+ rules:
1521
+ - id: no-frontend-db-import
1522
+ description: Frontend modules must not import from db/ directly
1523
+ pattern: import_from # supported: import_from, function_call, class_inherit, decorator_use
1524
+ source_glob: "frontend/**/*.{ts,tsx}"
1525
+ forbidden_target_glob: "lib/db/**"
1526
+ severity: BLOCK
1527
+ - id: no-eval
1528
+ pattern: function_call
1529
+ source_glob: "src/**/*.py"
1530
+ forbidden_target_glob: "eval"
1531
+ severity: BLOCK
1532
+ ```
1533
+
1534
+ A **drift baseline** (`--save-baseline` / `--baseline FILE`) compares the current PR's signals against the previous analysis and auto-escalates the verdict on regression — the GitHub App reads this to render `(+5 vs prev)` / `(-22 vs prev)` arrows on every push.
1535
+
1536
+ The **`pr-analyze --audit-trail`** flag appends a SHA-256-chained record to `.roam/audit-trail.jsonl` for each analysis (actor, repo, git SHA, diff hash, verdict, blast radius, AI-likelihood, intent marker). `roam audit-trail-verify` walks the chain and surfaces tampered records; `roam audit-trail-export --format md|csv|json` produces procurement-friendly reports. This is best framed as SOC 2 CC8.1, ISO 42001, and internal AI-governance evidence. Article 12 is only relevant for actual Annex III high-risk AI-system buyers, and Roam's records are supporting evidence rather than complete runtime inference logs.
1537
+
1538
+ A hosted GitHub App is in development on top of this CLI engine. Until it ships, the CLI is usable today as a free CI gate (`roam pr-analyze --gate` exits 5 on BLOCK).
1539
+
1540
+ ## Roam Cloud (metrics history, no source upload)
1541
+
1542
+ > **Status (2026-05-09):** Early access. From $19/repo/mo (Starter),
1543
+ > $99/mo Team (10 repos), $299/mo Growth. 30-day money-back. Source
1544
+ > code is never uploaded — only metrics.
1545
+
1546
+ `roam metrics-push` sends a *summary-only* payload from `roam audit --json` to a Roam Cloud endpoint — numerical metrics, file paths (or SHA-256 hashes when `--anonymize`), and identifier names only. **No source-code bodies are transmitted**, ever. Inspect the exact payload locally with `--dry-run` before any token is set.
1547
+
1548
+ ```bash
1549
+ roam metrics-push --dry-run # local-only inspection
1550
+ roam metrics-push --token $ROAM_CLOUD_TOKEN --anonymize
1551
+ roam metrics-push --no-hotspots --json # minimal payload
1552
+ ```
1553
+
1554
+ The hosted dashboard at `roam.cloud` (in development) renders trend charts of health-score, debt, dead-code count, danger-zone count, and bus-factor concentration over time. The schema (`roam-metrics-v1`) is allow-listed: any payload key outside the allow-list is rejected by the receiving API.
1555
+
1556
+ Both products are paid layers on top of the free CLI; the CLI itself stays Apache 2.0, zero-API-key, fully local, forever.
1557
+
1558
+ ## PR Replay (one-shot paid audit)
1559
+
1560
+ > **Status (2026-05-09):** Available today via email. Self-serve checkout
1561
+ > launches alongside Roam Review.
1562
+
1563
+ PR Replay runs Roam against your last 30 or 90 merged PRs and ships a
1564
+ written structural-review report plus a founder walk-through. Same
1565
+ engine as the free CLI; the engagement is the report + the call.
1566
+
1567
+ | Tier | Price | What you get |
1568
+ | ------ | ----- | ------------ |
1569
+ | Sample | Free, DIY (`roam pr-replay --tier sample`) | 5 PRs, watermarked, no founder review. Same engine as the paid tiers. |
1570
+ | Team | $2,500 | 30-PR report, 30-min walk-through. **$1,250 credit** toward a Roam Review subscription within 60 days. |
1571
+ | Deep | $6,000 | 90-PR report with per-detector deep-dive + a 90-day remediation plan + 90-min walk-through. **$3,000 credit** toward a Roam Review subscription within 60 days. |
1572
+
1573
+ Order paid tiers by emailing
1574
+ [hello@roam-code.com](mailto:hello@roam-code.com) — the
1575
+ self-serve Stripe checkout launches with Roam Review. Full deliverable
1576
+ shape at <https://roam-code.com/audit>.
1577
+
1578
+ ## CI/CD Integration
1579
+
1580
+ All you need is Python 3.10+ and `pip install roam-code`.
1581
+
1582
+ ### GitHub Actions
1583
+
1584
+ ```yaml
1585
+ # .github/workflows/roam.yml
1586
+ name: Roam Analysis
1587
+ on: [pull_request]
1588
+
1589
+ jobs:
1590
+ roam:
1591
+ runs-on: ubuntu-latest
1592
+ steps:
1593
+ - uses: actions/checkout@v4
1594
+ with:
1595
+ fetch-depth: 0
1596
+
1597
+ - uses: Cranot/roam-code@main
1598
+ with:
1599
+ commands: health
1600
+ gate: "score>=70"
1601
+ sarif: true
1602
+ comment: true
1603
+ ```
1604
+
1605
+ Use `roam init` to auto-generate this workflow.
1606
+
1607
+ | Input | Default | Description |
1608
+ |-------|---------|-------------|
1609
+ | `commands` | `health` | Space-separated roam commands to run |
1610
+ | `gate` | (empty) | Quality gate expression (e.g., `score>=70`). Exit 5 on failure |
1611
+ | `sarif` | `false` | Upload SARIF results to GitHub Code Scanning |
1612
+ | `comment` | `true` | Post sticky PR comment with results |
1613
+ | `python-version` | `3.11` | Python version |
1614
+ | `version` | `latest` | Pin to a specific roam-code version |
1615
+ | `cache` | `true` | Cache the SQLite index between runs |
1616
+ | `changed-only` | `false` | Incremental mode: adapt commands to changed files |
1617
+
1618
+ <details>
1619
+ <summary><strong>GitLab CI</strong></summary>
1620
+
1621
+ ```yaml
1622
+ roam-analysis:
1623
+ stage: test
1624
+ image: python:3.12-slim
1625
+ before_script:
1626
+ - pip install roam-code
1627
+ script:
1628
+ - roam index
1629
+ - roam health --gate
1630
+ - roam --json pr-risk origin/main..HEAD > roam-report.json
1631
+ artifacts:
1632
+ paths:
1633
+ - roam-report.json
1634
+ rules:
1635
+ - if: $CI_MERGE_REQUEST_IID
1636
+ ```
1637
+
1638
+ </details>
1639
+
1640
+ <details>
1641
+ <summary><strong>Azure DevOps / any CI</strong></summary>
1642
+
1643
+ Universal pattern:
1644
+
1645
+ ```bash
1646
+ pip install roam-code
1647
+ roam index
1648
+ roam health --gate # exit 5 on failure (reads .roam-gates.yml)
1649
+ roam --json health > report.json
1650
+ ```
1651
+
1652
+ </details>
1653
+
1654
+ ## SARIF Output
1655
+
1656
+ Roam exports analysis results in [SARIF 2.1.0](https://sarifweb.azurewebsites.net/) format for GitHub Code Scanning.
1657
+
1658
+ Fourteen commands honour the global `--sarif` flag (the authoritative list is
1659
+ `_SARIF_CONSUMERS` in `src/roam/cli.py`, drift-guarded by
1660
+ `tests/test_sarif_consumer_list.py`). Minimal end-to-end upload:
1661
+
1662
+ ```yaml
1663
+ - run: roam --sarif health > roam-health.sarif
1664
+ - uses: github/codeql-action/upload-sarif@v3
1665
+ with:
1666
+ sarif_file: roam-health.sarif
1667
+ ```
1668
+
1669
+ For the full CI integration playbook -- plain-pip quickstart, composite Action,
1670
+ GitLab/Jenkins/Azure/BitBucket templates, severity gates, and upload guardrails
1671
+ -- see [docs/ci-integration.md](docs/ci-integration.md).
1672
+
1673
+ Programmatic access from Python:
1674
+
1675
+ ```python
1676
+ from roam.output.sarif import health_to_sarif, write_sarif
1677
+
1678
+ sarif = health_to_sarif(health_data)
1679
+ write_sarif(sarif, "roam-health.sarif")
1680
+ ```
1681
+
1682
+ ## For Teams
1683
+
1684
+ Zero infrastructure, zero vendor lock-in, zero data leaving your network.
1685
+
1686
+ | Tool | Annual cost (20-dev team) | Infrastructure | Setup time |
1687
+ |------|--------------------------|----------------|------------|
1688
+ | SonarQube Server | $15,000-$45,000 | Self-hosted server | Days |
1689
+ | CodeScene | $20,000-$60,000 | SaaS or on-prem | Hours |
1690
+ | Code Climate | $12,000-$36,000 | SaaS | Hours |
1691
+ | **Roam** | **$0 (Apache 2.0)** | **None (local)** | **5 minutes** |
1692
+
1693
+ <details>
1694
+ <summary><strong>Team rollout guide</strong></summary>
1695
+
1696
+ **Week 1-2 (pilot):** 1-2 developers run `roam init` on one repo. Use `roam preflight` before changes, `roam pr-risk` before PRs.
1697
+
1698
+ **Week 3-4 (expand):** Add `roam health --gate` to CI as a non-blocking check (configure thresholds in `.roam-gates.yml`).
1699
+
1700
+ **Month 2+ (standardize):** Tighten gate thresholds. Expand to additional repos. Track trajectory with `roam trends`.
1701
+
1702
+ </details>
1703
+
1704
+ <details>
1705
+ <summary><strong>Complements your existing stack</strong></summary>
1706
+
1707
+ | If you use... | Roam adds... |
1708
+ |---------------|-------------|
1709
+ | **SonarQube** | Architecture-level analysis: dependency cycles, god components, blast radius, health scoring |
1710
+ | **CodeScene** | Free, local alternative for health scoring and hotspot analysis |
1711
+ | **ESLint / Pylint** | Cross-language architecture checks. Linters enforce style per file; Roam enforces architecture across the codebase |
1712
+ | **LSP** | AI-agent-optimized queries. `roam context` answers "what calls this?" with PageRank-ranked results in one call |
1713
+
1714
+ </details>
1715
+
1716
+ ## Language Support
1717
+
1718
+ ### Tier 1 -- Full extraction (dedicated parsers)
1719
+
1720
+ | Language | Extensions | Symbols | References | Inheritance |
1721
+ |----------|-----------|---------|------------|-------------|
1722
+ | Python | `.py` `.pyi` | classes, functions, methods, decorators, variables | imports, calls, inheritance | extends, `__all__` exports |
1723
+ | JavaScript | `.js` `.jsx` `.mjs` `.cjs` | classes, functions, arrow functions, CJS exports | imports, require(), calls | extends |
1724
+ | TypeScript | `.ts` `.tsx` `.mts` `.cts` | interfaces, type aliases, enums + all JS | imports, calls, type refs | extends, implements |
1725
+ | Java | `.java` | classes, interfaces, enums, constructors, fields | imports, calls | extends, implements |
1726
+ | Go | `.go` | structs, interfaces, functions, methods, fields | imports, calls | embedded structs |
1727
+ | Rust | `.rs` | structs, traits, impls, enums, functions | use, calls | impl Trait for Struct |
1728
+ | C / C++ | `.c` `.h` `.cpp` `.hpp` `.cc` | structs, classes, functions, namespaces, templates | includes, calls | extends |
1729
+ | C# | `.cs` | classes, interfaces, structs, enums, records, methods, constructors, properties, delegates, events, fields | using directives, calls, `new`, attributes | extends, implements |
1730
+ | PHP | `.php` | classes, interfaces, traits, enums, methods, properties | namespace use, calls, static calls, `new` | extends, implements, use (traits) |
1731
+ | Visual FoxPro | `.prg` | functions, procedures, classes, methods, properties, constants | DO, SET PROCEDURE/CLASSLIB, CREATEOBJECT, `=func()`, `obj.method()` | DEFINE CLASS ... AS |
1732
+ | YAML (CI/CD) | `.yml` `.yaml` | GitLab CI: jobs, template anchors, stages. GitHub Actions: workflow name, jobs, reusable workflows. Generic: top-level keys | `extends:`, `needs:`, `!reference`, `uses:` | — |
1733
+ | HCL / Terraform | `.tf` `.tfvars` `.hcl` | `resource`, `data`, `variable`, `output`, `module`, `provider`, `locals` entries | `var.*`, `module.*`, `data.*`, `local.*`, resource cross-refs | — |
1734
+ | Vue | `.vue` | via `<script>` block extraction (TS/JS) | imports, calls, type refs | extends, implements |
1735
+ | Svelte | `.svelte` | via `<script>` block extraction (TS/JS) | imports, calls, type refs | extends, implements |
1736
+
1737
+ <details>
1738
+ <summary><strong>Salesforce ecosystem (Tier 1)</strong></summary>
1739
+
1740
+ | Language | Extensions | Symbols | References |
1741
+ |----------|-----------|---------|------------|
1742
+ | Apex | `.cls` `.trigger` | classes, triggers, SOQL, annotations | imports, calls, System.Label, generic type refs |
1743
+ | Aura | `.cmp` `.app` `.evt` `.intf` `.design` | components, attributes, methods, events | controller refs, component refs |
1744
+ | LWC (JavaScript) | `.js` (in LWC dirs) | anonymous class from filename | `@salesforce/apex/`, `@salesforce/schema/`, `@salesforce/label/` |
1745
+ | Visualforce | `.page` `.component` | pages, components | controller/extensions, merge fields, includes |
1746
+ | SF Metadata XML | `*-meta.xml` | objects, fields, rules, layouts | Apex class refs, formula field refs, Flow actionCalls |
1747
+
1748
+ Cross-language edges mean `roam impact AccountService` shows blast radius across Apex, LWC, Aura, Visualforce, and Flows.
1749
+
1750
+ </details>
1751
+
1752
+ | Ruby | `.rb` | classes, modules, methods, singleton methods, constants | require, require_relative, include/extend, calls, ClassName.new | class inheritance |
1753
+ | Kotlin | `.kt` `.kts` | classes, interfaces, enums, objects, functions, methods, properties | imports, calls, type refs | extends, implements |
1754
+ | Scala | `.scala` `.sc` | classes, traits, objects, case classes, functions, methods, val/var, type aliases | imports, calls, `new` | extends, with (trait mixins) |
1755
+ | SQL (DDL) | `.sql` | tables, columns, views, functions, triggers, schemas, types (enums), sequences | foreign keys, view table deps, trigger table/function refs | -- |
1756
+ | Swift | `.swift` | classes, structs, enums, protocols, functions, methods, properties | imports, calls, type refs | extends, conforms |
1757
+ | JSONC | `.jsonc` | via JSON grammar | -- | -- |
1758
+ | MDX | `.mdx` | via Markdown grammar | -- | -- |
1759
+
1760
+ ## Performance
1761
+
1762
+ | Metric | Value |
1763
+ |--------|-------|
1764
+ | Index 200 files | ~3-5s |
1765
+ | Index 3,000 files | ~2 min |
1766
+ | Incremental (no changes) | <1s |
1767
+ | Any query command | <0.5s |
1768
+
1769
+ <details>
1770
+ <summary><strong>Detailed benchmarks</strong></summary>
1771
+
1772
+ ### Indexing Speed
1773
+
1774
+ | Project | Language | Files | Symbols | Edges | Index Time | Rate |
1775
+ |---------|----------|-------|---------|-------|-----------|------|
1776
+ | Express | JS | 211 | 624 | 804 | 3s | 70 files/s |
1777
+ | Axios | JS | 237 | 1,065 | 868 | 6s | 41 files/s |
1778
+ | Vue | TS | 697 | 5,335 | 8,984 | 25s | 28 files/s |
1779
+ | Laravel | PHP | 3,058 | 39,097 | 38,045 | 1m46s | 29 files/s |
1780
+ | Svelte | TS | 8,445 | 16,445 | 19,618 | 2m40s | 52 files/s |
1781
+
1782
+ ### Quality Benchmark
1783
+
1784
+ | Repo | Language | Score | Coverage | Edge Density |
1785
+ |------|----------|-------|----------|--------------|
1786
+ | Laravel | PHP | **9.55** | 91.2% | 0.97 |
1787
+ | Vue | TS | **9.27** | 85.8% | 1.68 |
1788
+ | Svelte | TS | **9.04** | 94.7% | 1.19 |
1789
+ | Axios | JS | **8.98** | 85.9% | 0.82 |
1790
+ | Express | JS | **8.46** | 96.0% | 1.29 |
1791
+
1792
+ ### Token Efficiency
1793
+
1794
+ | Metric | Value |
1795
+ |--------|-------|
1796
+ | 1,600-line file → `roam file` | ~5,000 chars (~70:1 compression) |
1797
+ | Full project map | ~4,000 chars |
1798
+ | `--compact` mode | 40-50% additional token reduction |
1799
+ | `roam preflight` replaces | 5-7 separate agent tool calls |
1800
+
1801
+ </details>
1802
+
1803
+ Agent-efficiency benchmarks: see the [`benchmarks/`](benchmarks/) directory for harness, repos, and results.
1804
+
1805
+ ## How It Works
1806
+
1807
+ ```
1808
+ Codebase
1809
+ |
1810
+ [1] Discovery ──── git ls-files (respects .gitignore + .roamignore)
1811
+ |
1812
+ [2] Parse ──────── tree-sitter AST per file (28 languages)
1813
+ |
1814
+ [3] Extract ────── symbols + references (calls, imports, inheritance)
1815
+ |
1816
+ [4] Resolve ────── match references to definitions → edges
1817
+ |
1818
+ [5] Metrics ────── adaptive PageRank, betweenness, cognitive complexity, Halstead
1819
+ |
1820
+ [6] Algorithms ── 23-pattern anti-pattern catalog (O(n^2) loops, N+1, recursion)
1821
+ |
1822
+ [7] Git ────────── churn, co-change matrix, authorship, Renyi entropy
1823
+ |
1824
+ [8] Clusters ───── Louvain community detection
1825
+ |
1826
+ [9] Health ─────── per-file scores (7-factor) + composite score (0-100)
1827
+ |
1828
+ [10] Store ─────── .roam/index.db (SQLite, WAL mode)
1829
+ ```
1830
+
1831
+ After the first full index, `roam index` only re-processes changed files (mtime + SHA-256 hash). Incremental updates are near-instant.
1832
+
1833
+ ### .roamignore
1834
+
1835
+ Create a `.roamignore` file in your project root to exclude files from indexing. It uses **full gitignore syntax**:
1836
+
1837
+ | Pattern | Meaning |
1838
+ |---------|---------|
1839
+ | `*.log` | Exclude all `.log` files (basename match) |
1840
+ | `vendor/` | Exclude the `vendor` directory and everything under it |
1841
+ | `/build/` | Exclude `build/` at repo root only (anchored) |
1842
+ | `src/**/*.pb.go` | Exclude `.pb.go` files at any depth under `src/` |
1843
+ | `**/test_*.py` | Exclude `test_*.py` files anywhere |
1844
+ | `?` | Match any single character (not `/`) |
1845
+ | `[abc]` / `[!abc]` | Character class / negated character class |
1846
+ | `!important.log` | Un-exclude (re-include) `important.log` |
1847
+ | `# comment` | Lines starting with `#` are comments |
1848
+
1849
+ Key rules: `*` matches within a single path segment (not across `/`). `**` matches across `/` boundaries. Last matching pattern wins (for negation). Patterns containing `/` are anchored to the repo root.
1850
+
1851
+ ```
1852
+ # .roamignore example
1853
+ *_pb2.py
1854
+ *_pb2_grpc.py
1855
+ vendor/
1856
+ node_modules/
1857
+ *.generated.*
1858
+ /build/
1859
+ !build/keep/
1860
+ ```
1861
+
1862
+ You can also exclude patterns via `roam config --exclude "*.proto"` (stored in `.roam/config.json`) or inspect active patterns with `roam config --show`.
1863
+
1864
+ <details>
1865
+ <summary><strong>Graph algorithms</strong></summary>
1866
+
1867
+ - **Adaptive PageRank** -- damping factor auto-tunes based on cycle density (0.82-0.92); identifies the most important symbols (used by `map`, `search`, `context`)
1868
+ - **Personalized PageRank** -- distance-weighted blast radius for `impact` (Gleich, 2015)
1869
+ - **Adaptive betweenness centrality** -- exact for small graphs, sqrt-scaled sampling for large (Brandes & Pich, 2007); finds bottleneck symbols
1870
+ - **Edge betweenness centrality** -- identifies critical cycle-breaking edges in SCCs (Brandes, 2001)
1871
+ - **Tarjan's SCC** -- detects dependency cycles with tangle ratio
1872
+ - **Propagation Cost** -- fraction of system affected by any change, via transitive closure (MacCormack, Rusnak & Baldwin, 2006)
1873
+ - **Algebraic connectivity (Fiedler value)** -- second-smallest Laplacian eigenvalue; measures architectural robustness (Fiedler, 1973)
1874
+ - **Louvain community detection** -- groups related symbols into clusters
1875
+ - **Modularity Q-score** -- measures if cluster boundaries match natural community structure (Newman, 2004)
1876
+ - **Conductance** -- per-cluster boundary tightness: cut(S, S_bar) / min(vol(S), vol(S_bar)) (Yang & Leskovec)
1877
+ - **Topological sort** -- computes dependency layers, Gini coefficient for layer balance (Gini, 1912), weighted violation severity
1878
+ - **k-shortest simple paths** -- traces dependency paths with coupling strength
1879
+ - **Renyi entropy (order 2)** -- measures co-change distribution; more robust to outliers than Shannon (Renyi, 1961)
1880
+ - **Mann-Kendall trend test** -- non-parametric degradation detection, robust to noise (Mann, 1945; Kendall, 1975)
1881
+ - **Sen's slope estimator** -- robust trend magnitude, resistant to outliers (Sen, 1968)
1882
+ - **NPMI** -- Normalized Pointwise Mutual Information for coupling strength (Bouma, 2009)
1883
+ - **Lift** -- association rule mining metric for co-change statistical significance (Agrawal & Srikant, 1994)
1884
+ - **Halstead metrics** -- volume, difficulty, effort, and predicted bugs from operator/operand counts (Halstead, 1977)
1885
+ - **SQALE remediation cost** -- time-to-fix estimates per issue type for tech debt prioritization (Letouzey, 2012)
1886
+ - **Algorithm anti-pattern catalog** -- 23 patterns detecting suboptimal algorithms (quadratic loops, N+1 queries, quadratic string building, branching recursion, manual top-k, loop-invariant calls) with confidence calibration via caller-count and bounded-loop analysis
1887
+
1888
+ </details>
1889
+
1890
+ <details>
1891
+ <summary><strong>Health scoring</strong></summary>
1892
+
1893
+ Composite health score (0-100) using a **weighted geometric mean** of sigmoid health factors. Non-compensatory: a zero in any dimension cannot be masked by high scores in others.
1894
+
1895
+ | Factor | Weight | What it measures |
1896
+ |--------|--------|-----------------|
1897
+ | Tangle ratio | 30% | % of symbols in dependency cycles |
1898
+ | God components | 20% | Symbols with extreme fan-in/fan-out |
1899
+ | Bottlenecks | 15% | High-betweenness chokepoints |
1900
+ | Layer violations | 15% | Upward dependency violations (severity-weighted by layer distance) |
1901
+ | Per-file health | 20% | Average of 7-factor file health scores |
1902
+
1903
+ Each factor uses sigmoid health: `h = e^(-signal/scale)` (1 = pristine, approaches 0 = worst). Score = `100 * product(h_i ^ w_i)`. Also reports **propagation cost** (MacCormack 2006) and **algebraic connectivity** (Fiedler 1973). Per-file health (1-10) combines: cognitive complexity (triangular nesting penalty per Sweller's Cognitive Load Theory), indentation complexity, cycle membership, god component membership, dead export ratio, co-change entropy, and churn amplification.
1904
+
1905
+ </details>
1906
+
1907
+ ## How Roam Compares
1908
+
1909
+ roam-code is the only tool that combines graph algorithms (PageRank, Tarjan SCC, Louvain clustering), git archaeology, architecture simulation, and multi-agent partitioning in a single local CLI with zero API keys.
1910
+
1911
+ Documentation lives at <https://roam-code.com/docs/>:
1912
+ - Tutorial — <https://roam-code.com/docs/getting-started>
1913
+ - Command reference — <https://roam-code.com/docs/command-reference>
1914
+ - Architecture guide — <https://roam-code.com/docs/architecture>
1915
+ - Integration tutorials — <https://roam-code.com/docs/integration-tutorials>
1916
+
1917
+ | Capability | roam-code | AI IDEs (Cursor, Windsurf) | AI Agents (Claude Code, Codex) | SAST (SonarQube, CodeQL) |
1918
+ |---|---|---|---|---|
1919
+ | Persistent local index | SQLite | Cloud embeddings | None | Per-scan |
1920
+ | Call graph analysis | Yes | No | No | Yes (CodeQL) |
1921
+ | PageRank / centrality | Yes | No | No | No |
1922
+ | Cycle detection (Tarjan) | Yes | No | No | Deprecated (SonarQube) |
1923
+ | Community detection (Louvain) | Yes | No | No | No |
1924
+ | Git churn / co-change | Yes | No | No | No |
1925
+ | Architecture simulation | Yes | No | No | No |
1926
+ | Multi-agent partitioning | Yes | No | No | No |
1927
+ | MCP tools for agents | 101 (24 in default core preset) | Client only | Client only | 34 (SonarQube) |
1928
+ | Languages | 26 | 70+ | 50+ | 12-42 |
1929
+ | 100% local, zero API keys | Yes | No | No | Partial |
1930
+ | Open source | Apache 2.0 | No | Partial | Partial |
1931
+
1932
+ ### Key Differentiators
1933
+
1934
+ - **vs AI IDEs** (Cursor, Windsurf, Augment): roam-code provides deterministic structural analysis. AI IDEs use probabilistic embeddings that can't guarantee reproducible results.
1935
+ - **vs AI Agents** (Claude Code, Codex CLI, Gemini CLI): These agents read files one at a time. roam-code pre-computes relationships so agents get instant answers about architecture, blast radius, and dependencies.
1936
+ - **vs SAST Tools** (SonarQube, CodeQL, Semgrep): SAST tools find bugs and vulnerabilities. roam-code understands architecture -- how code is structured, where it's coupled, and what breaks when you change it. Complementary, not competitive.
1937
+ - **vs Code Search** (Sourcegraph/Amp, Greptile): Text search finds where code is. roam-code understands why code matters -- which functions are central, which modules are tangled, which files are high-risk.
1938
+
1939
+ ## FAQ
1940
+
1941
+ **Does Roam send any data externally?**
1942
+ No. Zero network calls. No telemetry, no analytics, no update checks.
1943
+
1944
+ **Can Roam run in air-gapped environments?**
1945
+ Yes. Once installed, no internet access is required.
1946
+
1947
+ **Does Roam modify my source code?**
1948
+ Read-only by default. Creates `.roam/` with an index database. The `roam mutate` command can apply code changes (move/rename/extract) but defaults to `--dry-run` mode — you must explicitly pass `--apply` to write changes.
1949
+
1950
+ **How does Roam handle monorepos?**
1951
+ Indexes from the root. Batched SQL handles 100k+ symbols. Incremental updates stay fast.
1952
+
1953
+ **How does Roam handle multi-repo projects (e.g., frontend + backend)?**
1954
+ Use `roam ws init <repo1> <repo2>` to create a workspace. Each repo keeps its own index; a workspace overlay DB stores cross-repo API edges. `roam ws resolve` scans for REST endpoints and matches frontend calls to backend routes. Then `roam ws context`, `roam ws trace`, etc. work across repos.
1955
+
1956
+ **Is Roam compatible with SonarQube / CodeScene?**
1957
+ Yes. Roam complements existing tools. Both can run in the same CI pipeline. SARIF output integrates with GitHub Code Scanning.
1958
+
1959
+ ## Limitations
1960
+
1961
+ Static analysis trade-offs:
1962
+
1963
+ - **Static analysis primarily** -- can't trace dynamic dispatch, reflection, or eval'd code. Runtime trace ingestion (`roam ingest-trace`) adds production data but requires external trace export
1964
+ - **Import resolution is heuristic** -- complex re-exports or conditional imports may not resolve
1965
+ - **Limited cross-language edges** -- Salesforce, Protobuf, REST API, and multi-repo edges are supported, but not arbitrary FFI
1966
+ - **Tier 2 languages** get basic symbol extraction only via generic tree-sitter walker
1967
+ - **Large monorepos** (100k+ files) may have slow initial indexing
1968
+
1969
+ ## Troubleshooting
1970
+
1971
+ | Problem | Solution |
1972
+ |---------|----------|
1973
+ | `roam: command not found` | Ensure install location is on PATH. For `uv`: `uv tool update-shell` |
1974
+ | `Another indexing process is running` | Delete `.roam/index.lock` and retry |
1975
+ | `database is locked` | `roam index --force` to rebuild |
1976
+ | Unicode errors on Windows | `chcp 65001` for UTF-8 |
1977
+ | Symbol resolves to wrong file | Use `file:symbol` syntax: `roam symbol myfile:MyFunction` |
1978
+ | Health score seems wrong | `roam --json health` for factor breakdown |
1979
+ | Index stale after `git pull` | `roam index` (incremental). After major refactors: `roam index --force` |
1980
+
1981
+ ## Update / Uninstall
1982
+
1983
+ ```bash
1984
+ # Update
1985
+ pipx upgrade roam-code
1986
+ uv tool upgrade roam-code
1987
+ pip install --upgrade roam-code
1988
+
1989
+ # Uninstall
1990
+ pipx uninstall roam-code
1991
+ uv tool uninstall roam-code
1992
+ pip uninstall roam-code
1993
+ ```
1994
+
1995
+ Delete `.roam/` from your project root to clean up local data.
1996
+
1997
+ ## Development
1998
+
1999
+ ```bash
2000
+ git clone https://github.com/Cranot/roam-code.git
2001
+ cd roam-code
2002
+ pip install -e ".[dev]" # includes pytest, ruff
2003
+ pytest tests/ # ~7,500 tests, Python 3.10-3.13
2004
+
2005
+ # Or use Make targets:
2006
+ make dev # install with dev extras
2007
+ make test # run tests
2008
+ make lint # ruff check
2009
+ ```
2010
+
2011
+ <details>
2012
+ <summary><strong>Project structure</strong></summary>
2013
+
2014
+ ```
2015
+ roam-code/
2016
+ ├── pyproject.toml
2017
+ ├── action.yml # Reusable GitHub Action
2018
+ ├── src/roam/
2019
+ │ ├── __init__.py # Version (from pyproject.toml)
2020
+ │ ├── cli.py # Click CLI (201 canonical + 7 aliases)
2021
+ │ ├── mcp_server.py # MCP server (169 tools, 10 resources, 6 prompts)
2022
+ │ ├── db/
2023
+ │ │ ├── connection.py # SQLite (WAL, pragmas, batched IN)
2024
+ │ │ ├── schema.py # Tables, indexes, migrations
2025
+ │ │ └── queries.py # Named SQL constants
2026
+ │ ├── index/
2027
+ │ │ ├── indexer.py # Orchestrates full pipeline
2028
+ │ │ ├── discovery.py # git ls-files, .gitignore
2029
+ │ │ ├── parser.py # Tree-sitter parsing
2030
+ │ │ ├── symbols.py # Symbol + reference extraction
2031
+ │ │ ├── relations.py # Reference resolution -> edges
2032
+ │ │ ├── complexity.py # Cognitive complexity (SonarSource) + Halstead metrics
2033
+ │ │ ├── git_stats.py # Churn, co-change, blame, Renyi entropy
2034
+ │ │ ├── incremental.py # mtime + hash change detection
2035
+ │ │ ├── file_roles.py # Smart file role classifier
2036
+ │ │ └── test_conventions.py # Pluggable test naming adapters
2037
+ │ ├── languages/
2038
+ │ │ ├── base.py # Abstract LanguageExtractor
2039
+ │ │ ├── registry.py # Language detection + aliasing
2040
+ │ │ ├── *_lang.py # One file per language (21 dedicated + generic)
2041
+ │ │ └── generic_lang.py # Tier 2 fallback
2042
+ │ ├── bridges/
2043
+ │ │ ├── base.py, registry.py # Cross-language bridge framework
2044
+ │ │ ├── bridge_salesforce.py # Apex <-> Aura/LWC/Visualforce
2045
+ │ │ └── bridge_protobuf.py # .proto -> Go/Java/Python stubs
2046
+ │ ├── catalog/
2047
+ │ │ ├── tasks.py # Universal algorithm catalog (23 patterns)
2048
+ │ │ └── detectors.py # Anti-pattern detectors with confidence calibration
2049
+ │ ├── workspace/
2050
+ │ │ ├── config.py # .roam-workspace.json
2051
+ │ │ ├── db.py # Workspace overlay DB
2052
+ │ │ ├── api_scanner.py # REST API endpoint detection
2053
+ │ │ └── aggregator.py # Cross-repo aggregation
2054
+ │ ├── graph/
2055
+ │ │ ├── builder.py, pagerank.py # DB -> NetworkX, PageRank
2056
+ │ │ ├── cycles.py, clusters.py # Tarjan SCC, propagation cost, Louvain, modularity Q
2057
+ │ │ ├── layers.py, pathfinding.py # Topo layers, k-shortest paths
2058
+ │ │ ├── simulate.py, spectral.py # Architecture simulation, Fiedler bisection
2059
+ │ │ ├── partition.py, fingerprint.py # Multi-agent partitioning, topology fingerprints
2060
+ │ │ └── anomaly.py # Statistical anomaly detection
2061
+ │ ├── commands/
2062
+ │ │ ├── resolve.py # Shared symbol resolution
2063
+ │ │ ├── graph_helpers.py # Shared graph utilities (adj builders, BFS)
2064
+ │ │ ├── context_helpers.py # Data-gathering helpers for context command
2065
+ │ │ ├── gate_presets.py # Framework-specific gate rules
2066
+ │ │ └── cmd_*.py # One module per command
2067
+ │ ├── analysis/
2068
+ │ │ ├── effects.py # Side-effect classification engine
2069
+ │ │ └── taint.py # Taint analysis
2070
+ │ ├── refactor/
2071
+ │ │ ├── codegen.py # Import generation (Python/JS/Go)
2072
+ │ │ └── transforms.py # move/rename/add-call/extract transforms
2073
+ │ ├── rules/
2074
+ │ │ ├── engine.py # YAML rule parser + graph query evaluator
2075
+ │ │ ├── builtin.py # 10 built-in governance rules
2076
+ │ │ ├── ast_match.py # AST pattern matching with $METAVAR captures
2077
+ │ │ └── dataflow.py # Intra-procedural dataflow analysis
2078
+ │ ├── runtime/
2079
+ │ │ ├── trace_ingest.py # OpenTelemetry/Jaeger/Zipkin ingestion
2080
+ │ │ └── hotspots.py # Runtime hotspot analysis
2081
+ │ ├── search/
2082
+ │ │ ├── tfidf.py # TF-IDF semantic search engine
2083
+ │ │ ├── index_embeddings.py # Embedding index builder
2084
+ │ │ └── onnx_embeddings.py # Optional local ONNX semantic backend
2085
+ │ ├── security/
2086
+ │ │ ├── vuln_store.py # CVE/vulnerability storage
2087
+ │ │ └── vuln_reach.py # Vulnerability reachability paths
2088
+ │ └── output/
2089
+ │ ├── formatter.py # Token-efficient formatting
2090
+ │ ├── sarif.py # SARIF 2.1.0 output
2091
+ │ └── schema_registry.py # JSON envelope schema versioning
2092
+ └── tests/ # ~7,500 tests across 267 test files
2093
+ ```
2094
+
2095
+ </details>
2096
+
2097
+ ### Dependencies
2098
+
2099
+ | Package | Purpose |
2100
+ |---------|---------|
2101
+ | [click](https://click.palletsprojects.com/) >= 8.0 | CLI framework |
2102
+ | [tree-sitter](https://github.com/tree-sitter/py-tree-sitter) >= 0.23 | AST parsing |
2103
+ | [tree-sitter-language-pack](https://github.com/nicolo-ribaudo/tree-sitter-language-pack) >= 0.6 | 165+ grammars |
2104
+ | [networkx](https://networkx.org/) >= 3.0 | Graph algorithms |
2105
+
2106
+ Optional: [fastmcp](https://github.com/jlowin/fastmcp) >= 2.0 (MCP server — install with `pip install "roam-code[mcp]"`)
2107
+
2108
+ Optional: Local semantic ONNX stack (`numpy`, `onnxruntime`, `tokenizers`) via `pip install "roam-code[semantic]"`; verify activation with `roam config --semantic-status`.
2109
+
2110
+ ## Roadmap
2111
+
2112
+ ### Shipped
2113
+
2114
+ - [x] MCP v2 agent surface: in-process execution, compound operations, presets, schemas, annotations, and compatibility profiles.
2115
+ - [x] Full command and MCP inventory parity in docs: 229 canonical CLI commands (236 with aliases) and 169 MCP tools.
2116
+ - [x] CI hardening: composite action, changed-only mode, trend-aware gates, sticky PR updater, and SARIF guardrails.
2117
+ - [x] Performance foundation: FTS5/BM25 search, O(changed) incremental indexing, DB/index optimizations.
2118
+ - [x] Agent governance suite: `vibe-check`, `ai-readiness`, `verify`, `ai-ratio`, `duplicates`, advanced `algo` scoring/SARIF.
2119
+ - [x] Ownership/review intelligence: `codeowners`, `drift`, `simulate-departure`, `suggest-reviewers`, `api-changes`, `test-gaps`, `semantic-diff`, `secrets`.
2120
+ - [x] Multi-agent operations: `partition`, `affected`, `syntax-check`, workspace-aware context and traces.
2121
+ - [x] Budget-aware context delivery: `--budget` (partial rollout), PageRank-weighted truncation, conversation-aware ranking.
2122
+
2123
+ ### Next
2124
+
2125
+ - [x] Terminal demo GIF in README.
2126
+ - [ ] GitHub repo topics.
2127
+ - [ ] GitHub Discussions enabled.
2128
+ - [ ] MCP directory + awesome-list submissions.
2129
+
2130
+ ## Contributing
2131
+
2132
+ ```bash
2133
+ git clone https://github.com/Cranot/roam-code.git
2134
+ cd roam-code
2135
+ pip install -e .
2136
+ pytest tests/ # all ~7,500 tests must pass
2137
+ ```
2138
+
2139
+ Good first contributions: add a [Tier 1 language](src/roam/languages/) (see `go_lang.py` or `php_lang.py` as templates), improve reference resolution, add benchmark repos, extend SARIF converters, add MCP tools.
2140
+
2141
+ Please open an issue first to discuss larger changes.
2142
+
2143
+ ## License
2144
+
2145
+ [Apache 2.0](LICENSE)