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