roam-code 12.14__tar.gz → 12.18__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 (613) hide show
  1. {roam_code-12.14/src/roam_code.egg-info → roam_code-12.18}/PKG-INFO +33 -10
  2. {roam_code-12.14 → roam_code-12.18}/README.md +32 -9
  3. {roam_code-12.14 → roam_code-12.18}/pyproject.toml +1 -1
  4. roam_code-12.18/src/roam/__main__.py +14 -0
  5. {roam_code-12.14 → roam_code-12.18}/src/roam/ask/recipes.py +265 -0
  6. {roam_code-12.14 → roam_code-12.18}/src/roam/cli.py +103 -0
  7. roam_code-12.18/src/roam/commands/cmd_api.py +106 -0
  8. roam_code-12.18/src/roam/commands/cmd_changelog.py +177 -0
  9. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_clones.py +41 -1
  10. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_config.py +197 -0
  11. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_context.py +44 -1
  12. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_critique.py +123 -1
  13. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_diagnose.py +74 -2
  14. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_diff.py +26 -1
  15. roam_code-12.18/src/roam/commands/cmd_disambiguate.py +98 -0
  16. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_docs_coverage.py +77 -11
  17. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_doctor.py +87 -0
  18. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_eval_retrieve.py +12 -0
  19. roam_code-12.18/src/roam/commands/cmd_exit_codes.py +65 -0
  20. roam_code-12.18/src/roam/commands/cmd_graph_export.py +124 -0
  21. roam_code-12.18/src/roam/commands/cmd_graph_stats.py +115 -0
  22. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_health.py +35 -1
  23. roam_code-12.18/src/roam/commands/cmd_help_search.py +107 -0
  24. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_hotspots.py +107 -1
  25. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_impact.py +26 -5
  26. roam_code-12.18/src/roam/commands/cmd_index_stats.py +113 -0
  27. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_map.py +46 -1
  28. roam_code-12.18/src/roam/commands/cmd_mcp_status.py +89 -0
  29. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_oracle.py +109 -0
  30. roam_code-12.18/src/roam/commands/cmd_orphan_imports.py +175 -0
  31. roam_code-12.18/src/roam/commands/cmd_plugins.py +98 -0
  32. roam_code-12.18/src/roam/commands/cmd_pr_prep.py +174 -0
  33. roam_code-12.18/src/roam/commands/cmd_pre_commit.py +120 -0
  34. roam_code-12.18/src/roam/commands/cmd_recipes.py +53 -0
  35. roam_code-12.18/src/roam/commands/cmd_recommend.py +198 -0
  36. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_reset.py +37 -2
  37. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_retrieve.py +21 -1
  38. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_search.py +89 -15
  39. roam_code-12.18/src/roam/commands/cmd_stats.py +110 -0
  40. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_taint.py +10 -1
  41. roam_code-12.18/src/roam/commands/cmd_telemetry.py +70 -0
  42. roam_code-12.18/src/roam/commands/cmd_test_impact.py +145 -0
  43. roam_code-12.18/src/roam/commands/cmd_test_pyramid.py +83 -0
  44. roam_code-12.18/src/roam/commands/cmd_timeline.py +140 -0
  45. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_tour.py +22 -1
  46. roam_code-12.18/src/roam/commands/cmd_version.py +80 -0
  47. roam_code-12.18/src/roam/commands/cmd_why_fail.py +179 -0
  48. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_workflow.py +53 -1
  49. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/resolve.py +47 -0
  50. {roam_code-12.14 → roam_code-12.18}/src/roam/competitor_site_data.py +2 -2
  51. {roam_code-12.14 → roam_code-12.18}/src/roam/config.py +21 -2
  52. {roam_code-12.14 → roam_code-12.18}/src/roam/db/connection.py +24 -0
  53. {roam_code-12.14 → roam_code-12.18}/src/roam/graph/builder.py +33 -0
  54. {roam_code-12.14 → roam_code-12.18}/src/roam/index/file_roles.py +56 -0
  55. {roam_code-12.14 → roam_code-12.18}/src/roam/index/indexer.py +43 -0
  56. {roam_code-12.14 → roam_code-12.18}/src/roam/mcp-server-card.json +5 -5
  57. {roam_code-12.14 → roam_code-12.18}/src/roam/mcp_server.py +304 -1
  58. roam_code-12.18/src/roam/telemetry.py +116 -0
  59. {roam_code-12.14 → roam_code-12.18/src/roam_code.egg-info}/PKG-INFO +33 -10
  60. {roam_code-12.14 → roam_code-12.18}/src/roam_code.egg-info/SOURCES.txt +29 -0
  61. {roam_code-12.14 → roam_code-12.18}/tests/test_ask.py +14 -2
  62. {roam_code-12.14 → roam_code-12.18}/tests/test_defer_loading.py +2 -0
  63. {roam_code-12.14 → roam_code-12.18}/tests/test_doctor.py +5 -1
  64. {roam_code-12.14 → roam_code-12.18}/tests/test_mcp_server.py +21 -4
  65. roam_code-12.18/tests/test_v1215_passes.py +109 -0
  66. roam_code-12.18/tests/test_v1216_passes.py +157 -0
  67. roam_code-12.18/tests/test_v1216_passes_41_50.py +192 -0
  68. roam_code-12.18/tests/test_v1216_passes_51_60.py +150 -0
  69. roam_code-12.18/tests/test_v1217_passes_61_80.py +194 -0
  70. roam_code-12.18/tests/test_v1218_passes_81_90.py +118 -0
  71. roam_code-12.14/src/roam/__main__.py +0 -5
  72. {roam_code-12.14 → roam_code-12.18}/LICENSE +0 -0
  73. {roam_code-12.14 → roam_code-12.18}/setup.cfg +0 -0
  74. {roam_code-12.14 → roam_code-12.18}/src/roam/__init__.py +0 -0
  75. {roam_code-12.14 → roam_code-12.18}/src/roam/analysis/__init__.py +0 -0
  76. {roam_code-12.14 → roam_code-12.18}/src/roam/analysis/effects.py +0 -0
  77. {roam_code-12.14 → roam_code-12.18}/src/roam/analysis/taint.py +0 -0
  78. {roam_code-12.14 → roam_code-12.18}/src/roam/api.py +0 -0
  79. {roam_code-12.14 → roam_code-12.18}/src/roam/ask/__init__.py +0 -0
  80. {roam_code-12.14 → roam_code-12.18}/src/roam/ask/classifier.py +0 -0
  81. {roam_code-12.14 → roam_code-12.18}/src/roam/ask/runner.py +0 -0
  82. {roam_code-12.14 → roam_code-12.18}/src/roam/ask/workflow.py +0 -0
  83. {roam_code-12.14 → roam_code-12.18}/src/roam/attest/__init__.py +0 -0
  84. {roam_code-12.14 → roam_code-12.18}/src/roam/attest/cga.py +0 -0
  85. {roam_code-12.14 → roam_code-12.18}/src/roam/bridges/__init__.py +0 -0
  86. {roam_code-12.14 → roam_code-12.18}/src/roam/bridges/base.py +0 -0
  87. {roam_code-12.14 → roam_code-12.18}/src/roam/bridges/bridge_config.py +0 -0
  88. {roam_code-12.14 → roam_code-12.18}/src/roam/bridges/bridge_django.py +0 -0
  89. {roam_code-12.14 → roam_code-12.18}/src/roam/bridges/bridge_protobuf.py +0 -0
  90. {roam_code-12.14 → roam_code-12.18}/src/roam/bridges/bridge_rest_api.py +0 -0
  91. {roam_code-12.14 → roam_code-12.18}/src/roam/bridges/bridge_salesforce.py +0 -0
  92. {roam_code-12.14 → roam_code-12.18}/src/roam/bridges/bridge_template.py +0 -0
  93. {roam_code-12.14 → roam_code-12.18}/src/roam/bridges/registry.py +0 -0
  94. {roam_code-12.14 → roam_code-12.18}/src/roam/catalog/__init__.py +0 -0
  95. {roam_code-12.14 → roam_code-12.18}/src/roam/catalog/detectors.py +0 -0
  96. {roam_code-12.14 → roam_code-12.18}/src/roam/catalog/fixes.py +0 -0
  97. {roam_code-12.14 → roam_code-12.18}/src/roam/catalog/python_idioms.py +0 -0
  98. {roam_code-12.14 → roam_code-12.18}/src/roam/catalog/smells.py +0 -0
  99. {roam_code-12.14 → roam_code-12.18}/src/roam/catalog/tasks.py +0 -0
  100. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/__init__.py +0 -0
  101. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/changed_files.py +0 -0
  102. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_adrs.py +0 -0
  103. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_adversarial.py +0 -0
  104. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_affected.py +0 -0
  105. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_affected_tests.py +0 -0
  106. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_agent_context.py +0 -0
  107. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_agent_export.py +0 -0
  108. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_agent_plan.py +0 -0
  109. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_ai_ratio.py +0 -0
  110. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_ai_readiness.py +0 -0
  111. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_alerts.py +0 -0
  112. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_annotate.py +0 -0
  113. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_api_changes.py +0 -0
  114. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_api_drift.py +0 -0
  115. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_ask.py +0 -0
  116. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_attest.py +0 -0
  117. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_auth_gaps.py +0 -0
  118. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_bisect.py +0 -0
  119. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_breaking.py +0 -0
  120. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_budget.py +0 -0
  121. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_bus_factor.py +0 -0
  122. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_capsule.py +0 -0
  123. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_cga.py +0 -0
  124. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_check_rules.py +0 -0
  125. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_ci_setup.py +0 -0
  126. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_clean.py +0 -0
  127. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_closure.py +0 -0
  128. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_clusters.py +0 -0
  129. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_codeowners.py +0 -0
  130. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_complexity.py +0 -0
  131. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_congestion.py +0 -0
  132. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_conventions.py +0 -0
  133. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_coupling.py +0 -0
  134. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_coverage_gaps.py +0 -0
  135. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_cut.py +0 -0
  136. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_dark_matter.py +0 -0
  137. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_dashboard.py +0 -0
  138. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_dead.py +0 -0
  139. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_debt.py +0 -0
  140. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_deps.py +0 -0
  141. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_describe.py +0 -0
  142. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_dev_profile.py +0 -0
  143. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_doc_staleness.py +0 -0
  144. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_drift.py +0 -0
  145. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_duplicates.py +0 -0
  146. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_effects.py +0 -0
  147. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_endpoints.py +0 -0
  148. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_entry_points.py +0 -0
  149. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_fan.py +0 -0
  150. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_file.py +0 -0
  151. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_fingerprint.py +0 -0
  152. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_fitness.py +0 -0
  153. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_flag_dead.py +0 -0
  154. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_fleet.py +0 -0
  155. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_fn_coupling.py +0 -0
  156. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_forecast.py +0 -0
  157. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_grep.py +0 -0
  158. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_guard.py +0 -0
  159. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_hooks.py +0 -0
  160. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_hover.py +0 -0
  161. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_index.py +0 -0
  162. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_index_bundle.py +0 -0
  163. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_ingest_trace.py +0 -0
  164. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_init.py +0 -0
  165. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_intent.py +0 -0
  166. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_invariants.py +0 -0
  167. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_layers.py +0 -0
  168. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_math.py +0 -0
  169. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_mcp_setup.py +0 -0
  170. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_metrics.py +0 -0
  171. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_migration_safety.py +0 -0
  172. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_minimap.py +0 -0
  173. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_missing_index.py +0 -0
  174. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_module.py +0 -0
  175. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_mutate.py +0 -0
  176. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_n1.py +0 -0
  177. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_orchestrate.py +0 -0
  178. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_orphan_routes.py +0 -0
  179. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_over_fetch.py +0 -0
  180. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_owner.py +0 -0
  181. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_partition.py +0 -0
  182. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_path_coverage.py +0 -0
  183. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_patterns.py +0 -0
  184. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_plan.py +0 -0
  185. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_plan_refactor.py +0 -0
  186. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_pr_diff.py +0 -0
  187. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_pr_risk.py +0 -0
  188. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_preflight.py +0 -0
  189. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_py_modern.py +0 -0
  190. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_py_types.py +0 -0
  191. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_pytest_fixtures.py +0 -0
  192. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_relate.py +0 -0
  193. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_report.py +0 -0
  194. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_risk.py +0 -0
  195. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_rules.py +0 -0
  196. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_safe_delete.py +0 -0
  197. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_safe_zones.py +0 -0
  198. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_sbom.py +0 -0
  199. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_schema.py +0 -0
  200. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_search_semantic.py +0 -0
  201. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_secrets.py +0 -0
  202. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_semantic_diff.py +0 -0
  203. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_simulate.py +0 -0
  204. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_simulate_departure.py +0 -0
  205. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_sketch.py +0 -0
  206. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_smells.py +0 -0
  207. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_spectral.py +0 -0
  208. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_split.py +0 -0
  209. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_suggest_refactoring.py +0 -0
  210. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_suggest_reviewers.py +0 -0
  211. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_supply_chain.py +0 -0
  212. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_symbol.py +0 -0
  213. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_syntax_check.py +0 -0
  214. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_test_gaps.py +0 -0
  215. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_test_scaffold.py +0 -0
  216. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_testmap.py +0 -0
  217. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_trace.py +0 -0
  218. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_trends.py +0 -0
  219. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_triage.py +0 -0
  220. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_understand.py +0 -0
  221. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_uses.py +0 -0
  222. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_verify.py +0 -0
  223. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_verify_imports.py +0 -0
  224. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_vibe_check.py +0 -0
  225. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_visualize.py +0 -0
  226. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_vuln_map.py +0 -0
  227. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_vuln_reach.py +0 -0
  228. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_vulns.py +0 -0
  229. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_watch.py +0 -0
  230. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_weather.py +0 -0
  231. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_why.py +0 -0
  232. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_ws.py +0 -0
  233. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/cmd_xlang.py +0 -0
  234. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/codeowners_helpers.py +0 -0
  235. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/context_helpers.py +0 -0
  236. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/gate_presets.py +0 -0
  237. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/graph_helpers.py +0 -0
  238. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/metrics_history.py +0 -0
  239. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/next_steps.py +0 -0
  240. {roam_code-12.14 → roam_code-12.18}/src/roam/commands/suppression.py +0 -0
  241. {roam_code-12.14 → roam_code-12.18}/src/roam/coverage_reports.py +0 -0
  242. {roam_code-12.14 → roam_code-12.18}/src/roam/critique/__init__.py +0 -0
  243. {roam_code-12.14 → roam_code-12.18}/src/roam/critique/aggregator.py +0 -0
  244. {roam_code-12.14 → roam_code-12.18}/src/roam/critique/checks.py +0 -0
  245. {roam_code-12.14 → roam_code-12.18}/src/roam/db/__init__.py +0 -0
  246. {roam_code-12.14 → roam_code-12.18}/src/roam/db/queries.py +0 -0
  247. {roam_code-12.14 → roam_code-12.18}/src/roam/db/schema.py +0 -0
  248. {roam_code-12.14 → roam_code-12.18}/src/roam/eval/__init__.py +0 -0
  249. {roam_code-12.14 → roam_code-12.18}/src/roam/eval/harness.py +0 -0
  250. {roam_code-12.14 → roam_code-12.18}/src/roam/exit_codes.py +0 -0
  251. {roam_code-12.14 → roam_code-12.18}/src/roam/fleet/__init__.py +0 -0
  252. {roam_code-12.14 → roam_code-12.18}/src/roam/fleet/adapters.py +0 -0
  253. {roam_code-12.14 → roam_code-12.18}/src/roam/fleet/manifest.py +0 -0
  254. {roam_code-12.14 → roam_code-12.18}/src/roam/git_utils.py +0 -0
  255. {roam_code-12.14 → roam_code-12.18}/src/roam/graph/__init__.py +0 -0
  256. {roam_code-12.14 → roam_code-12.18}/src/roam/graph/anomaly.py +0 -0
  257. {roam_code-12.14 → roam_code-12.18}/src/roam/graph/clone_detect.py +0 -0
  258. {roam_code-12.14 → roam_code-12.18}/src/roam/graph/clusters.py +0 -0
  259. {roam_code-12.14 → roam_code-12.18}/src/roam/graph/cycles.py +0 -0
  260. {roam_code-12.14 → roam_code-12.18}/src/roam/graph/dark_matter.py +0 -0
  261. {roam_code-12.14 → roam_code-12.18}/src/roam/graph/diff.py +0 -0
  262. {roam_code-12.14 → roam_code-12.18}/src/roam/graph/fingerprint.py +0 -0
  263. {roam_code-12.14 → roam_code-12.18}/src/roam/graph/layers.py +0 -0
  264. {roam_code-12.14 → roam_code-12.18}/src/roam/graph/pagerank.py +0 -0
  265. {roam_code-12.14 → roam_code-12.18}/src/roam/graph/partition.py +0 -0
  266. {roam_code-12.14 → roam_code-12.18}/src/roam/graph/pathfinding.py +0 -0
  267. {roam_code-12.14 → roam_code-12.18}/src/roam/graph/propagation.py +0 -0
  268. {roam_code-12.14 → roam_code-12.18}/src/roam/graph/simulate.py +0 -0
  269. {roam_code-12.14 → roam_code-12.18}/src/roam/graph/spectral.py +0 -0
  270. {roam_code-12.14 → roam_code-12.18}/src/roam/graph/stats.py +0 -0
  271. {roam_code-12.14 → roam_code-12.18}/src/roam/index/__init__.py +0 -0
  272. {roam_code-12.14 → roam_code-12.18}/src/roam/index/complexity.py +0 -0
  273. {roam_code-12.14 → roam_code-12.18}/src/roam/index/discovery.py +0 -0
  274. {roam_code-12.14 → roam_code-12.18}/src/roam/index/django_post.py +0 -0
  275. {roam_code-12.14 → roam_code-12.18}/src/roam/index/git_stats.py +0 -0
  276. {roam_code-12.14 → roam_code-12.18}/src/roam/index/gitignore.py +0 -0
  277. {roam_code-12.14 → roam_code-12.18}/src/roam/index/incremental.py +0 -0
  278. {roam_code-12.14 → roam_code-12.18}/src/roam/index/parser.py +0 -0
  279. {roam_code-12.14 → roam_code-12.18}/src/roam/index/pytest_fixtures.py +0 -0
  280. {roam_code-12.14 → roam_code-12.18}/src/roam/index/registry_dispatch.py +0 -0
  281. {roam_code-12.14 → roam_code-12.18}/src/roam/index/relations.py +0 -0
  282. {roam_code-12.14 → roam_code-12.18}/src/roam/index/symbols.py +0 -0
  283. {roam_code-12.14 → roam_code-12.18}/src/roam/index/test_conventions.py +0 -0
  284. {roam_code-12.14 → roam_code-12.18}/src/roam/languages/__init__.py +0 -0
  285. {roam_code-12.14 → roam_code-12.18}/src/roam/languages/apex_lang.py +0 -0
  286. {roam_code-12.14 → roam_code-12.18}/src/roam/languages/aura_lang.py +0 -0
  287. {roam_code-12.14 → roam_code-12.18}/src/roam/languages/base.py +0 -0
  288. {roam_code-12.14 → roam_code-12.18}/src/roam/languages/c_lang.py +0 -0
  289. {roam_code-12.14 → roam_code-12.18}/src/roam/languages/csharp_lang.py +0 -0
  290. {roam_code-12.14 → roam_code-12.18}/src/roam/languages/extractor_schema.py +0 -0
  291. {roam_code-12.14 → roam_code-12.18}/src/roam/languages/extractors/kotlin.yaml +0 -0
  292. {roam_code-12.14 → roam_code-12.18}/src/roam/languages/foxpro_lang.py +0 -0
  293. {roam_code-12.14 → roam_code-12.18}/src/roam/languages/generic_lang.py +0 -0
  294. {roam_code-12.14 → roam_code-12.18}/src/roam/languages/go_lang.py +0 -0
  295. {roam_code-12.14 → roam_code-12.18}/src/roam/languages/hcl_lang.py +0 -0
  296. {roam_code-12.14 → roam_code-12.18}/src/roam/languages/java_lang.py +0 -0
  297. {roam_code-12.14 → roam_code-12.18}/src/roam/languages/javascript_lang.py +0 -0
  298. {roam_code-12.14 → roam_code-12.18}/src/roam/languages/kotlin_lang.py +0 -0
  299. {roam_code-12.14 → roam_code-12.18}/src/roam/languages/php_lang.py +0 -0
  300. {roam_code-12.14 → roam_code-12.18}/src/roam/languages/python_lang.py +0 -0
  301. {roam_code-12.14 → roam_code-12.18}/src/roam/languages/query_engine.py +0 -0
  302. {roam_code-12.14 → roam_code-12.18}/src/roam/languages/registry.py +0 -0
  303. {roam_code-12.14 → roam_code-12.18}/src/roam/languages/ruby_lang.py +0 -0
  304. {roam_code-12.14 → roam_code-12.18}/src/roam/languages/rust_lang.py +0 -0
  305. {roam_code-12.14 → roam_code-12.18}/src/roam/languages/scala_lang.py +0 -0
  306. {roam_code-12.14 → roam_code-12.18}/src/roam/languages/sfxml_lang.py +0 -0
  307. {roam_code-12.14 → roam_code-12.18}/src/roam/languages/sql_lang.py +0 -0
  308. {roam_code-12.14 → roam_code-12.18}/src/roam/languages/swift_lang.py +0 -0
  309. {roam_code-12.14 → roam_code-12.18}/src/roam/languages/typescript_lang.py +0 -0
  310. {roam_code-12.14 → roam_code-12.18}/src/roam/languages/visualforce_lang.py +0 -0
  311. {roam_code-12.14 → roam_code-12.18}/src/roam/languages/yaml_lang.py +0 -0
  312. {roam_code-12.14 → roam_code-12.18}/src/roam/mcp_extras/__init__.py +0 -0
  313. {roam_code-12.14 → roam_code-12.18}/src/roam/mcp_extras/completions.py +0 -0
  314. {roam_code-12.14 → roam_code-12.18}/src/roam/mcp_extras/concurrency.py +0 -0
  315. {roam_code-12.14 → roam_code-12.18}/src/roam/mcp_extras/progress.py +0 -0
  316. {roam_code-12.14 → roam_code-12.18}/src/roam/mcp_extras/sampling.py +0 -0
  317. {roam_code-12.14 → roam_code-12.18}/src/roam/mcp_extras/session.py +0 -0
  318. {roam_code-12.14 → roam_code-12.18}/src/roam/mcp_extras/watcher.py +0 -0
  319. {roam_code-12.14 → roam_code-12.18}/src/roam/output/__init__.py +0 -0
  320. {roam_code-12.14 → roam_code-12.18}/src/roam/output/confidence.py +0 -0
  321. {roam_code-12.14 → roam_code-12.18}/src/roam/output/errors.py +0 -0
  322. {roam_code-12.14 → roam_code-12.18}/src/roam/output/file_role_hints.py +0 -0
  323. {roam_code-12.14 → roam_code-12.18}/src/roam/output/formatter.py +0 -0
  324. {roam_code-12.14 → roam_code-12.18}/src/roam/output/framework_filter.py +0 -0
  325. {roam_code-12.14 → roam_code-12.18}/src/roam/output/mermaid.py +0 -0
  326. {roam_code-12.14 → roam_code-12.18}/src/roam/output/project_shape.py +0 -0
  327. {roam_code-12.14 → roam_code-12.18}/src/roam/output/sarif.py +0 -0
  328. {roam_code-12.14 → roam_code-12.18}/src/roam/output/schema_registry.py +0 -0
  329. {roam_code-12.14 → roam_code-12.18}/src/roam/plugins.py +0 -0
  330. {roam_code-12.14 → roam_code-12.18}/src/roam/refactor/__init__.py +0 -0
  331. {roam_code-12.14 → roam_code-12.18}/src/roam/refactor/codegen.py +0 -0
  332. {roam_code-12.14 → roam_code-12.18}/src/roam/refactor/transforms.py +0 -0
  333. {roam_code-12.14 → roam_code-12.18}/src/roam/retrieve/__init__.py +0 -0
  334. {roam_code-12.14 → roam_code-12.18}/src/roam/retrieve/learned_ranker.py +0 -0
  335. {roam_code-12.14 → roam_code-12.18}/src/roam/retrieve/pipeline.py +0 -0
  336. {roam_code-12.14 → roam_code-12.18}/src/roam/retrieve/rerank.py +0 -0
  337. {roam_code-12.14 → roam_code-12.18}/src/roam/retrieve/seeds.py +0 -0
  338. {roam_code-12.14 → roam_code-12.18}/src/roam/retrieve/semantic.py +0 -0
  339. {roam_code-12.14 → roam_code-12.18}/src/roam/rules/__init__.py +0 -0
  340. {roam_code-12.14 → roam_code-12.18}/src/roam/rules/ast_match.py +0 -0
  341. {roam_code-12.14 → roam_code-12.18}/src/roam/rules/builtin.py +0 -0
  342. {roam_code-12.14 → roam_code-12.18}/src/roam/rules/dataflow.py +0 -0
  343. {roam_code-12.14 → roam_code-12.18}/src/roam/rules/engine.py +0 -0
  344. {roam_code-12.14 → roam_code-12.18}/src/roam/runtime/__init__.py +0 -0
  345. {roam_code-12.14 → roam_code-12.18}/src/roam/runtime/daemon.py +0 -0
  346. {roam_code-12.14 → roam_code-12.18}/src/roam/runtime/graph_backend.py +0 -0
  347. {roam_code-12.14 → roam_code-12.18}/src/roam/runtime/hotspots.py +0 -0
  348. {roam_code-12.14 → roam_code-12.18}/src/roam/runtime/lock_modes.py +0 -0
  349. {roam_code-12.14 → roam_code-12.18}/src/roam/runtime/lockmgr.py +0 -0
  350. {roam_code-12.14 → roam_code-12.18}/src/roam/runtime/trace_ingest.py +0 -0
  351. {roam_code-12.14 → roam_code-12.18}/src/roam/search/__init__.py +0 -0
  352. {roam_code-12.14 → roam_code-12.18}/src/roam/search/framework_packs.py +0 -0
  353. {roam_code-12.14 → roam_code-12.18}/src/roam/search/index_embeddings.py +0 -0
  354. {roam_code-12.14 → roam_code-12.18}/src/roam/search/onnx_embeddings.py +0 -0
  355. {roam_code-12.14 → roam_code-12.18}/src/roam/search/tfidf.py +0 -0
  356. {roam_code-12.14 → roam_code-12.18}/src/roam/security/__init__.py +0 -0
  357. {roam_code-12.14 → roam_code-12.18}/src/roam/security/aibom_extension.py +0 -0
  358. {roam_code-12.14 → roam_code-12.18}/src/roam/security/taint_classifier.py +0 -0
  359. {roam_code-12.14 → roam_code-12.18}/src/roam/security/taint_engine.py +0 -0
  360. {roam_code-12.14 → roam_code-12.18}/src/roam/security/taint_rules/api_error_leak.yaml +0 -0
  361. {roam_code-12.14 → roam_code-12.18}/src/roam/security/taint_rules/java_fileupload_path_traversal.yaml +0 -0
  362. {roam_code-12.14 → roam_code-12.18}/src/roam/security/taint_rules/js_insecure_jwt_decode.yaml +0 -0
  363. {roam_code-12.14 → roam_code-12.18}/src/roam/security/taint_rules/js_localstorage_secrets.yaml +0 -0
  364. {roam_code-12.14 → roam_code-12.18}/src/roam/security/taint_rules/js_prototype_pollution.yaml +0 -0
  365. {roam_code-12.14 → roam_code-12.18}/src/roam/security/taint_rules/js_ssrf.yaml +0 -0
  366. {roam_code-12.14 → roam_code-12.18}/src/roam/security/taint_rules/js_xss.yaml +0 -0
  367. {roam_code-12.14 → roam_code-12.18}/src/roam/security/taint_rules/python_basic.yaml +0 -0
  368. {roam_code-12.14 → roam_code-12.18}/src/roam/security/taint_rules/python_deserialization.yaml +0 -0
  369. {roam_code-12.14 → roam_code-12.18}/src/roam/security/taint_rules/python_path_traversal.yaml +0 -0
  370. {roam_code-12.14 → roam_code-12.18}/src/roam/security/taint_rules/python_socketio_remote_source.yaml +0 -0
  371. {roam_code-12.14 → roam_code-12.18}/src/roam/security/taint_rules/python_sqli.yaml +0 -0
  372. {roam_code-12.14 → roam_code-12.18}/src/roam/security/taint_rules/python_urllib_open_redirect.yaml +0 -0
  373. {roam_code-12.14 → roam_code-12.18}/src/roam/security/taint_rules/vue_v_html.yaml +0 -0
  374. {roam_code-12.14 → roam_code-12.18}/src/roam/security/vuln_reach.py +0 -0
  375. {roam_code-12.14 → roam_code-12.18}/src/roam/security/vuln_store.py +0 -0
  376. {roam_code-12.14 → roam_code-12.18}/src/roam/surface_counts.py +0 -0
  377. {roam_code-12.14 → roam_code-12.18}/src/roam/templates/__init__.py +0 -0
  378. {roam_code-12.14 → roam_code-12.18}/src/roam/templates/ci/Jenkinsfile +0 -0
  379. {roam_code-12.14 → roam_code-12.18}/src/roam/templates/ci/__init__.py +0 -0
  380. {roam_code-12.14 → roam_code-12.18}/src/roam/templates/ci/azure-pipelines.yml +0 -0
  381. {roam_code-12.14 → roam_code-12.18}/src/roam/templates/ci/bitbucket-pipelines.yml +0 -0
  382. {roam_code-12.14 → roam_code-12.18}/src/roam/templates/ci/gitlab-ci.yml +0 -0
  383. {roam_code-12.14 → roam_code-12.18}/src/roam/workspace/__init__.py +0 -0
  384. {roam_code-12.14 → roam_code-12.18}/src/roam/workspace/aggregator.py +0 -0
  385. {roam_code-12.14 → roam_code-12.18}/src/roam/workspace/api_scanner.py +0 -0
  386. {roam_code-12.14 → roam_code-12.18}/src/roam/workspace/config.py +0 -0
  387. {roam_code-12.14 → roam_code-12.18}/src/roam/workspace/db.py +0 -0
  388. {roam_code-12.14 → roam_code-12.18}/src/roam_code.egg-info/dependency_links.txt +0 -0
  389. {roam_code-12.14 → roam_code-12.18}/src/roam_code.egg-info/entry_points.txt +0 -0
  390. {roam_code-12.14 → roam_code-12.18}/src/roam_code.egg-info/requires.txt +0 -0
  391. {roam_code-12.14 → roam_code-12.18}/src/roam_code.egg-info/top_level.txt +0 -0
  392. {roam_code-12.14 → roam_code-12.18}/tests/test_adrs.py +0 -0
  393. {roam_code-12.14 → roam_code-12.18}/tests/test_adversarial.py +0 -0
  394. {roam_code-12.14 → roam_code-12.18}/tests/test_affected.py +0 -0
  395. {roam_code-12.14 → roam_code-12.18}/tests/test_agent_export.py +0 -0
  396. {roam_code-12.14 → roam_code-12.18}/tests/test_agent_mode.py +0 -0
  397. {roam_code-12.14 → roam_code-12.18}/tests/test_agent_plan_context.py +0 -0
  398. {roam_code-12.14 → roam_code-12.18}/tests/test_ai_ratio.py +0 -0
  399. {roam_code-12.14 → roam_code-12.18}/tests/test_ai_readiness.py +0 -0
  400. {roam_code-12.14 → roam_code-12.18}/tests/test_alerts_cmd.py +0 -0
  401. {roam_code-12.14 → roam_code-12.18}/tests/test_annotations.py +0 -0
  402. {roam_code-12.14 → roam_code-12.18}/tests/test_anomaly.py +0 -0
  403. {roam_code-12.14 → roam_code-12.18}/tests/test_api_changes.py +0 -0
  404. {roam_code-12.14 → roam_code-12.18}/tests/test_api_drift.py +0 -0
  405. {roam_code-12.14 → roam_code-12.18}/tests/test_attest.py +0 -0
  406. {roam_code-12.14 → roam_code-12.18}/tests/test_auth_gaps.py +0 -0
  407. {roam_code-12.14 → roam_code-12.18}/tests/test_backend_fixes_round2.py +0 -0
  408. {roam_code-12.14 → roam_code-12.18}/tests/test_backend_fixes_round3.py +0 -0
  409. {roam_code-12.14 → roam_code-12.18}/tests/test_basic.py +0 -0
  410. {roam_code-12.14 → roam_code-12.18}/tests/test_batch_mcp.py +0 -0
  411. {roam_code-12.14 → roam_code-12.18}/tests/test_bisect.py +0 -0
  412. {roam_code-12.14 → roam_code-12.18}/tests/test_bridge_django.py +0 -0
  413. {roam_code-12.14 → roam_code-12.18}/tests/test_bridges.py +0 -0
  414. {roam_code-12.14 → roam_code-12.18}/tests/test_bridges_extended.py +0 -0
  415. {roam_code-12.14 → roam_code-12.18}/tests/test_budget.py +0 -0
  416. {roam_code-12.14 → roam_code-12.18}/tests/test_budget_flag.py +0 -0
  417. {roam_code-12.14 → roam_code-12.18}/tests/test_budget_phase2.py +0 -0
  418. {roam_code-12.14 → roam_code-12.18}/tests/test_bus_factor.py +0 -0
  419. {roam_code-12.14 → roam_code-12.18}/tests/test_capsule.py +0 -0
  420. {roam_code-12.14 → roam_code-12.18}/tests/test_cga.py +0 -0
  421. {roam_code-12.14 → roam_code-12.18}/tests/test_check_rules.py +0 -0
  422. {roam_code-12.14 → roam_code-12.18}/tests/test_ci_gate_eval.py +0 -0
  423. {roam_code-12.14 → roam_code-12.18}/tests/test_ci_sarif_guard.py +0 -0
  424. {roam_code-12.14 → roam_code-12.18}/tests/test_ci_setup.py +0 -0
  425. {roam_code-12.14 → roam_code-12.18}/tests/test_clones.py +0 -0
  426. {roam_code-12.14 → roam_code-12.18}/tests/test_closure.py +0 -0
  427. {roam_code-12.14 → roam_code-12.18}/tests/test_codeowners.py +0 -0
  428. {roam_code-12.14 → roam_code-12.18}/tests/test_commands_architecture.py +0 -0
  429. {roam_code-12.14 → roam_code-12.18}/tests/test_commands_exploration.py +0 -0
  430. {roam_code-12.14 → roam_code-12.18}/tests/test_commands_health.py +0 -0
  431. {roam_code-12.14 → roam_code-12.18}/tests/test_commands_refactoring.py +0 -0
  432. {roam_code-12.14 → roam_code-12.18}/tests/test_commands_workflow.py +0 -0
  433. {roam_code-12.14 → roam_code-12.18}/tests/test_competitor_site_data.py +0 -0
  434. {roam_code-12.14 → roam_code-12.18}/tests/test_comprehensive.py +0 -0
  435. {roam_code-12.14 → roam_code-12.18}/tests/test_config.py +0 -0
  436. {roam_code-12.14 → roam_code-12.18}/tests/test_congestion.py +0 -0
  437. {roam_code-12.14 → roam_code-12.18}/tests/test_context_propagation.py +0 -0
  438. {roam_code-12.14 → roam_code-12.18}/tests/test_conventions_cmd.py +0 -0
  439. {roam_code-12.14 → roam_code-12.18}/tests/test_coverage_gaps_cmd.py +0 -0
  440. {roam_code-12.14 → roam_code-12.18}/tests/test_coverage_ingestion.py +0 -0
  441. {roam_code-12.14 → roam_code-12.18}/tests/test_critique.py +0 -0
  442. {roam_code-12.14 → roam_code-12.18}/tests/test_cut.py +0 -0
  443. {roam_code-12.14 → roam_code-12.18}/tests/test_dark_matter.py +0 -0
  444. {roam_code-12.14 → roam_code-12.18}/tests/test_dark_matter_helpers.py +0 -0
  445. {roam_code-12.14 → roam_code-12.18}/tests/test_dashboard.py +0 -0
  446. {roam_code-12.14 → roam_code-12.18}/tests/test_dataflow_dead.py +0 -0
  447. {roam_code-12.14 → roam_code-12.18}/tests/test_dead_aging.py +0 -0
  448. {roam_code-12.14 → roam_code-12.18}/tests/test_demo_gif_asset.py +0 -0
  449. {roam_code-12.14 → roam_code-12.18}/tests/test_describe.py +0 -0
  450. {roam_code-12.14 → roam_code-12.18}/tests/test_detail_flag_hints.py +0 -0
  451. {roam_code-12.14 → roam_code-12.18}/tests/test_detector_precision.py +0 -0
  452. {roam_code-12.14 → roam_code-12.18}/tests/test_deterministic_output.py +0 -0
  453. {roam_code-12.14 → roam_code-12.18}/tests/test_dev_profile.py +0 -0
  454. {roam_code-12.14 → roam_code-12.18}/tests/test_difficulty_scoring.py +0 -0
  455. {roam_code-12.14 → roam_code-12.18}/tests/test_doc_consistency.py +0 -0
  456. {roam_code-12.14 → roam_code-12.18}/tests/test_doc_staleness.py +0 -0
  457. {roam_code-12.14 → roam_code-12.18}/tests/test_docker_assets.py +0 -0
  458. {roam_code-12.14 → roam_code-12.18}/tests/test_docs_coverage.py +0 -0
  459. {roam_code-12.14 → roam_code-12.18}/tests/test_docs_site_quality.py +0 -0
  460. {roam_code-12.14 → roam_code-12.18}/tests/test_drift.py +0 -0
  461. {roam_code-12.14 → roam_code-12.18}/tests/test_drift_by_team.py +0 -0
  462. {roam_code-12.14 → roam_code-12.18}/tests/test_duplicates.py +0 -0
  463. {roam_code-12.14 → roam_code-12.18}/tests/test_effects.py +0 -0
  464. {roam_code-12.14 → roam_code-12.18}/tests/test_effects_propagation.py +0 -0
  465. {roam_code-12.14 → roam_code-12.18}/tests/test_endpoints.py +0 -0
  466. {roam_code-12.14 → roam_code-12.18}/tests/test_entry_points_cmd.py +0 -0
  467. {roam_code-12.14 → roam_code-12.18}/tests/test_eval_retrieve.py +0 -0
  468. {roam_code-12.14 → roam_code-12.18}/tests/test_except_pass_narrow.py +0 -0
  469. {roam_code-12.14 → roam_code-12.18}/tests/test_exclude_patterns.py +0 -0
  470. {roam_code-12.14 → roam_code-12.18}/tests/test_exit_codes.py +0 -0
  471. {roam_code-12.14 → roam_code-12.18}/tests/test_extractor_grammar_drift.py +0 -0
  472. {roam_code-12.14 → roam_code-12.18}/tests/test_fallback_contracts.py +0 -0
  473. {roam_code-12.14 → roam_code-12.18}/tests/test_file_roles.py +0 -0
  474. {roam_code-12.14 → roam_code-12.18}/tests/test_fingerprint.py +0 -0
  475. {roam_code-12.14 → roam_code-12.18}/tests/test_fixes.py +0 -0
  476. {roam_code-12.14 → roam_code-12.18}/tests/test_flag_dead.py +0 -0
  477. {roam_code-12.14 → roam_code-12.18}/tests/test_fleet.py +0 -0
  478. {roam_code-12.14 → roam_code-12.18}/tests/test_fn_coupling.py +0 -0
  479. {roam_code-12.14 → roam_code-12.18}/tests/test_forecast.py +0 -0
  480. {roam_code-12.14 → roam_code-12.18}/tests/test_formatters.py +0 -0
  481. {roam_code-12.14 → roam_code-12.18}/tests/test_foxpro.py +0 -0
  482. {roam_code-12.14 → roam_code-12.18}/tests/test_framework_detection.py +0 -0
  483. {roam_code-12.14 → roam_code-12.18}/tests/test_gate_presets.py +0 -0
  484. {roam_code-12.14 → roam_code-12.18}/tests/test_git_utils.py +0 -0
  485. {roam_code-12.14 → roam_code-12.18}/tests/test_guard.py +0 -0
  486. {roam_code-12.14 → roam_code-12.18}/tests/test_health_gate.py +0 -0
  487. {roam_code-12.14 → roam_code-12.18}/tests/test_hooks.py +0 -0
  488. {roam_code-12.14 → roam_code-12.18}/tests/test_hotspots.py +0 -0
  489. {roam_code-12.14 → roam_code-12.18}/tests/test_hover.py +0 -0
  490. {roam_code-12.14 → roam_code-12.18}/tests/test_index.py +0 -0
  491. {roam_code-12.14 → roam_code-12.18}/tests/test_index_bundle.py +0 -0
  492. {roam_code-12.14 → roam_code-12.18}/tests/test_init_cmd.py +0 -0
  493. {roam_code-12.14 → roam_code-12.18}/tests/test_install_check.py +0 -0
  494. {roam_code-12.14 → roam_code-12.18}/tests/test_intent.py +0 -0
  495. {roam_code-12.14 → roam_code-12.18}/tests/test_invariants.py +0 -0
  496. {roam_code-12.14 → roam_code-12.18}/tests/test_json_contracts.py +0 -0
  497. {roam_code-12.14 → roam_code-12.18}/tests/test_json_error_envelope.py +0 -0
  498. {roam_code-12.14 → roam_code-12.18}/tests/test_kotlin_swift_extractors.py +0 -0
  499. {roam_code-12.14 → roam_code-12.18}/tests/test_language_corpus.py +0 -0
  500. {roam_code-12.14 → roam_code-12.18}/tests/test_languages.py +0 -0
  501. {roam_code-12.14 → roam_code-12.18}/tests/test_library_api.py +0 -0
  502. {roam_code-12.14 → roam_code-12.18}/tests/test_math.py +0 -0
  503. {roam_code-12.14 → roam_code-12.18}/tests/test_math_tips.py +0 -0
  504. {roam_code-12.14 → roam_code-12.18}/tests/test_mcp_extras.py +0 -0
  505. {roam_code-12.14 → roam_code-12.18}/tests/test_mcp_setup.py +0 -0
  506. {roam_code-12.14 → roam_code-12.18}/tests/test_mermaid.py +0 -0
  507. {roam_code-12.14 → roam_code-12.18}/tests/test_metrics_cmd.py +0 -0
  508. {roam_code-12.14 → roam_code-12.18}/tests/test_migration_safety.py +0 -0
  509. {roam_code-12.14 → roam_code-12.18}/tests/test_minimap.py +0 -0
  510. {roam_code-12.14 → roam_code-12.18}/tests/test_missing_index.py +0 -0
  511. {roam_code-12.14 → roam_code-12.18}/tests/test_mutate.py +0 -0
  512. {roam_code-12.14 → roam_code-12.18}/tests/test_n1.py +0 -0
  513. {roam_code-12.14 → roam_code-12.18}/tests/test_next_steps.py +0 -0
  514. {roam_code-12.14 → roam_code-12.18}/tests/test_onboard.py +0 -0
  515. {roam_code-12.14 → roam_code-12.18}/tests/test_oracle.py +0 -0
  516. {roam_code-12.14 → roam_code-12.18}/tests/test_orchestrate.py +0 -0
  517. {roam_code-12.14 → roam_code-12.18}/tests/test_orphan_routes.py +0 -0
  518. {roam_code-12.14 → roam_code-12.18}/tests/test_oss_bench_harness.py +0 -0
  519. {roam_code-12.14 → roam_code-12.18}/tests/test_over_fetch.py +0 -0
  520. {roam_code-12.14 → roam_code-12.18}/tests/test_pagerank_truncation.py +0 -0
  521. {roam_code-12.14 → roam_code-12.18}/tests/test_partition.py +0 -0
  522. {roam_code-12.14 → roam_code-12.18}/tests/test_path_coverage.py +0 -0
  523. {roam_code-12.14 → roam_code-12.18}/tests/test_patterns_cmd.py +0 -0
  524. {roam_code-12.14 → roam_code-12.18}/tests/test_performance.py +0 -0
  525. {roam_code-12.14 → roam_code-12.18}/tests/test_personalized_pagerank.py +0 -0
  526. {roam_code-12.14 → roam_code-12.18}/tests/test_plan.py +0 -0
  527. {roam_code-12.14 → roam_code-12.18}/tests/test_plugin_discovery.py +0 -0
  528. {roam_code-12.14 → roam_code-12.18}/tests/test_pr_comment_script.py +0 -0
  529. {roam_code-12.14 → roam_code-12.18}/tests/test_pr_diff.py +0 -0
  530. {roam_code-12.14 → roam_code-12.18}/tests/test_pr_risk_author.py +0 -0
  531. {roam_code-12.14 → roam_code-12.18}/tests/test_progress.py +0 -0
  532. {roam_code-12.14 → roam_code-12.18}/tests/test_progressive_disclosure.py +0 -0
  533. {roam_code-12.14 → roam_code-12.18}/tests/test_properties.py +0 -0
  534. {roam_code-12.14 → roam_code-12.18}/tests/test_pytest_fixtures.py +0 -0
  535. {roam_code-12.14 → roam_code-12.18}/tests/test_python_extractor_v2.py +0 -0
  536. {roam_code-12.14 → roam_code-12.18}/tests/test_python_idioms_e2e.py +0 -0
  537. {roam_code-12.14 → roam_code-12.18}/tests/test_python_pivot.py +0 -0
  538. {roam_code-12.14 → roam_code-12.18}/tests/test_readme_surface_consistency.py +0 -0
  539. {roam_code-12.14 → roam_code-12.18}/tests/test_realworld_feedback.py +0 -0
  540. {roam_code-12.14 → roam_code-12.18}/tests/test_refactoring_intelligence.py +0 -0
  541. {roam_code-12.14 → roam_code-12.18}/tests/test_registry_dispatch.py +0 -0
  542. {roam_code-12.14 → roam_code-12.18}/tests/test_relate.py +0 -0
  543. {roam_code-12.14 → roam_code-12.18}/tests/test_report.py +0 -0
  544. {roam_code-12.14 → roam_code-12.18}/tests/test_reset_clean.py +0 -0
  545. {roam_code-12.14 → roam_code-12.18}/tests/test_resolve.py +0 -0
  546. {roam_code-12.14 → roam_code-12.18}/tests/test_retrieve.py +0 -0
  547. {roam_code-12.14 → roam_code-12.18}/tests/test_retrieve_cross_repo.py +0 -0
  548. {roam_code-12.14 → roam_code-12.18}/tests/test_retrieve_seeds.py +0 -0
  549. {roam_code-12.14 → roam_code-12.18}/tests/test_risk.py +0 -0
  550. {roam_code-12.14 → roam_code-12.18}/tests/test_ruby.py +0 -0
  551. {roam_code-12.14 → roam_code-12.18}/tests/test_rule_profiles.py +0 -0
  552. {roam_code-12.14 → roam_code-12.18}/tests/test_rules.py +0 -0
  553. {roam_code-12.14 → roam_code-12.18}/tests/test_rules_ast_match.py +0 -0
  554. {roam_code-12.14 → roam_code-12.18}/tests/test_rules_community_pack.py +0 -0
  555. {roam_code-12.14 → roam_code-12.18}/tests/test_rules_dataflow.py +0 -0
  556. {roam_code-12.14 → roam_code-12.18}/tests/test_rules_symbol_requirements.py +0 -0
  557. {roam_code-12.14 → roam_code-12.18}/tests/test_runtime.py +0 -0
  558. {roam_code-12.14 → roam_code-12.18}/tests/test_runtime_score.py +0 -0
  559. {roam_code-12.14 → roam_code-12.18}/tests/test_salesforce.py +0 -0
  560. {roam_code-12.14 → roam_code-12.18}/tests/test_sarif_flag.py +0 -0
  561. {roam_code-12.14 → roam_code-12.18}/tests/test_sbom.py +0 -0
  562. {roam_code-12.14 → roam_code-12.18}/tests/test_scala.py +0 -0
  563. {roam_code-12.14 → roam_code-12.18}/tests/test_schema_versioning.py +0 -0
  564. {roam_code-12.14 → roam_code-12.18}/tests/test_search_explain.py +0 -0
  565. {roam_code-12.14 → roam_code-12.18}/tests/test_secrets.py +0 -0
  566. {roam_code-12.14 → roam_code-12.18}/tests/test_secrets_v2.py +0 -0
  567. {roam_code-12.14 → roam_code-12.18}/tests/test_semantic_diff.py +0 -0
  568. {roam_code-12.14 → roam_code-12.18}/tests/test_semantic_onnx.py +0 -0
  569. {roam_code-12.14 → roam_code-12.18}/tests/test_semantic_search.py +0 -0
  570. {roam_code-12.14 → roam_code-12.18}/tests/test_simulate.py +0 -0
  571. {roam_code-12.14 → roam_code-12.18}/tests/test_simulate_departure.py +0 -0
  572. {roam_code-12.14 → roam_code-12.18}/tests/test_sketch.py +0 -0
  573. {roam_code-12.14 → roam_code-12.18}/tests/test_smells.py +0 -0
  574. {roam_code-12.14 → roam_code-12.18}/tests/test_smoke.py +0 -0
  575. {roam_code-12.14 → roam_code-12.18}/tests/test_sna_metrics.py +0 -0
  576. {roam_code-12.14 → roam_code-12.18}/tests/test_spectral.py +0 -0
  577. {roam_code-12.14 → roam_code-12.18}/tests/test_split_cmd.py +0 -0
  578. {roam_code-12.14 → roam_code-12.18}/tests/test_sql.py +0 -0
  579. {roam_code-12.14 → roam_code-12.18}/tests/test_suggest_reviewers.py +0 -0
  580. {roam_code-12.14 → roam_code-12.18}/tests/test_supply_chain.py +0 -0
  581. {roam_code-12.14 → roam_code-12.18}/tests/test_surface_counts.py +0 -0
  582. {roam_code-12.14 → roam_code-12.18}/tests/test_syntax_check.py +0 -0
  583. {roam_code-12.14 → roam_code-12.18}/tests/test_taint.py +0 -0
  584. {roam_code-12.14 → roam_code-12.18}/tests/test_taint_analysis.py +0 -0
  585. {roam_code-12.14 → roam_code-12.18}/tests/test_taint_classifier.py +0 -0
  586. {roam_code-12.14 → roam_code-12.18}/tests/test_taint_intraprocedural.py +0 -0
  587. {roam_code-12.14 → roam_code-12.18}/tests/test_test_conventions.py +0 -0
  588. {roam_code-12.14 → roam_code-12.18}/tests/test_test_gaps.py +0 -0
  589. {roam_code-12.14 → roam_code-12.18}/tests/test_test_scaffold.py +0 -0
  590. {roam_code-12.14 → roam_code-12.18}/tests/test_testmap.py +0 -0
  591. {roam_code-12.14 → roam_code-12.18}/tests/test_top_flag_consistency.py +0 -0
  592. {roam_code-12.14 → roam_code-12.18}/tests/test_tour_cmd.py +0 -0
  593. {roam_code-12.14 → roam_code-12.18}/tests/test_trends.py +0 -0
  594. {roam_code-12.14 → roam_code-12.18}/tests/test_trends_cohort.py +0 -0
  595. {roam_code-12.14 → roam_code-12.18}/tests/test_triage.py +0 -0
  596. {roam_code-12.14 → roam_code-12.18}/tests/test_uses_cmd.py +0 -0
  597. {roam_code-12.14 → roam_code-12.18}/tests/test_v12_2.py +0 -0
  598. {roam_code-12.14 → roam_code-12.18}/tests/test_v6_features.py +0 -0
  599. {roam_code-12.14 → roam_code-12.18}/tests/test_v71_features.py +0 -0
  600. {roam_code-12.14 → roam_code-12.18}/tests/test_v7_features.py +0 -0
  601. {roam_code-12.14 → roam_code-12.18}/tests/test_v82_features.py +0 -0
  602. {roam_code-12.14 → roam_code-12.18}/tests/test_verify.py +0 -0
  603. {roam_code-12.14 → roam_code-12.18}/tests/test_verify_imports.py +0 -0
  604. {roam_code-12.14 → roam_code-12.18}/tests/test_vibe_check.py +0 -0
  605. {roam_code-12.14 → roam_code-12.18}/tests/test_visualize.py +0 -0
  606. {roam_code-12.14 → roam_code-12.18}/tests/test_vuln.py +0 -0
  607. {roam_code-12.14 → roam_code-12.18}/tests/test_vulns_cmd.py +0 -0
  608. {roam_code-12.14 → roam_code-12.18}/tests/test_watch.py +0 -0
  609. {roam_code-12.14 → roam_code-12.18}/tests/test_why.py +0 -0
  610. {roam_code-12.14 → roam_code-12.18}/tests/test_workspace.py +0 -0
  611. {roam_code-12.14 → roam_code-12.18}/tests/test_ws_resolve_fixes.py +0 -0
  612. {roam_code-12.14 → roam_code-12.18}/tests/test_xlang.py +0 -0
  613. {roam_code-12.14 → roam_code-12.18}/tests/test_yaml_hcl.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: roam-code
3
- Version: 12.14
3
+ Version: 12.18
4
4
  Summary: Instant codebase comprehension for AI coding agents
5
5
  Author: CosmoHac
6
6
  License-Expression: MIT
@@ -62,9 +62,9 @@ Dynamic: license-file
62
62
 
63
63
  **Architectural sight for AI coding agents — before they edit.**
64
64
 
65
- A local code graph (SQLite + tree-sitter + git history) that gives any agent — Claude Code, Cursor, Aider, Continue, your own — five high-leverage verbs: `understand`, `retrieve`, `context`, `preflight`, `critique`. The other 150 specialised commands are advanced surface for specialised workflows.
65
+ A local code graph (SQLite + tree-sitter + git history) that gives any agent — Claude Code, Cursor, Aider, Continue, your own — five high-leverage verbs: `understand`, `retrieve`, `context`, `preflight`, `critique`. The other 172 specialised commands are advanced surface for specialised workflows.
66
66
 
67
- *155 commands · 122 MCP tools · 27 languages · 100% local · zero API keys*
67
+ *177 commands · 123 MCP tools · 27 languages · 100% local · zero API keys*
68
68
 
69
69
  [![PyPI version](https://img.shields.io/pypi/v/roam-code?style=flat-square&color=blue)](https://pypi.org/project/roam-code/)
70
70
  [![GitHub stars](https://img.shields.io/github/stars/Cranot/roam-code?style=flat-square)](https://github.com/Cranot/roam-code/stargazers)
@@ -83,7 +83,7 @@ Roam is a structural intelligence engine for software. It pre-indexes your codeb
83
83
  Unlike LSPs (editor-bound, language-specific) or Sourcegraph (hosted search), Roam provides architecture-level graph queries -- offline, cross-language, and compact. It goes beyond comprehension: Roam governs architecture through budget gates, simulates refactoring outcomes, orchestrates multi-agent swarms with zero-conflict guarantees, maps vulnerability reachability paths, and enables graph-level code editing without syntax errors.
84
84
 
85
85
  ```
86
- Codebase ──> [Index] ──> Semantic Graph ──> 155 Commands ──> AI Agent
86
+ Codebase ──> [Index] ──> Semantic Graph ──> 177 Commands ──> AI Agent
87
87
  │ │ │
88
88
  tree-sitter symbols comprehend
89
89
  27 languages + edges govern
@@ -156,7 +156,7 @@ $ roam diff # blast radius of uncommitted changes
156
156
  - **`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.
157
157
  - **`.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`.
158
158
  - **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).
159
- - **155 CLI commands, 122 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). 35-tool `core` preset is the default for token-budget-conscious clients.
159
+ - **177 CLI commands, 123 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). 35-tool `core` preset is the default for token-budget-conscious clients.
160
160
 
161
161
  ## What's New in v11
162
162
 
@@ -327,7 +327,7 @@ roam health
327
327
 
328
328
  ## Commands
329
329
 
330
- **Lead with the 5 verbs.** The [5 core commands](#core-commands) cover ~80% of agent workflows: `understand`, `context`, `retrieve`, `preflight`, `critique`. The remaining 150 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 **155 commands organised into 7 categories** (plus 6 aliases for muscle memory: `algo` → `math`, `weather` → `churn`, `digest` / `snapshot` / `trend` → `trends`, `onboard` → `understand`), but you don't need to know that to start.
330
+ **Lead with the 5 verbs.** The [5 core commands](#core-commands) cover ~80% of agent workflows: `understand`, `context`, `retrieve`, `preflight`, `critique`. The remaining 172 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 **177 commands organised into 7 categories** (plus 6 aliases for muscle memory: `algo` → `math`, `weather` → `churn`, `digest` / `snapshot` / `trend` → `trends`, `onboard` → `understand`), but you don't need to know that to start.
331
331
 
332
332
  <details>
333
333
  <summary><strong>Full command reference</strong></summary>
@@ -358,6 +358,28 @@ roam health
358
358
  | `roam mcp-setup <platform>` | Generate MCP config snippets for AI platforms: claude-code, cursor, windsurf, vscode, gemini-cli, codex-cli |
359
359
  | `roam ci-setup [--platform P] [--write]` | Generate CI/CD pipeline config (GitHub Actions, GitLab CI, Azure Pipelines, Jenkins, Bitbucket) with SARIF + quality gates |
360
360
  | `roam adrs [--status S] [--limit N]` | Discover Architecture Decision Records, link to affected code modules, show status and coverage |
361
+ | `roam plugins` | List discovered plugins (commands, detectors, language extractors) registered via `ROAM_PLUGIN_MODULES` or entry points |
362
+ | `roam index-stats` | Report .roam index size, row counts, and SQLite fragmentation; hints when VACUUM or `roam reset` is overdue |
363
+ | `roam test-pyramid` | Count tests by kind (unit/integration/e2e/smoke) using path + filename heuristics; flags inverted pyramids |
364
+ | `roam telemetry` | Surface the opt-in local telemetry ring buffer (slowest + recent calls); enable via `ROAM_TELEMETRY_LOCAL=1` |
365
+ | `roam orphan-imports` | List Python imports that don't resolve to any indexed module or installed package |
366
+ | `roam changelog [--suggest]` | List commits since the last tag, optionally as a Conventional-Commits-bucketed markdown CHANGELOG draft |
367
+ | `roam graph-export [--format graphml\|dot\|jsonl]` | Export the symbol or file dependency graph for external tooling (Gephi, Cytoscape, custom analyses) |
368
+ | `roam help-search <query>` | Fuzzy match across every command's name + help text (replaces grepping `--help-all` output) |
369
+ | `roam stats` | Aggregate metrics over the index: count by language, file role, kind, plus recent commit activity |
370
+ | `roam timeline <symbol>` | Chronological commits that touched the file owning the symbol — author, date, lines added/removed |
371
+ | `roam pr-prep [<range>]` | One-shot pre-PR fitness check that bundles diff + critique + pr-risk into one envelope |
372
+ | `roam why-fail <test>` | Find recently-changed symbols transitively reachable from a failing test |
373
+ | `roam recommend <symbol>` | Surface related symbols using call-graph + co-change + clone signals |
374
+ | `roam graph-stats` | Graph-level invariants: density, weak components, non-trivial cycles, top inbound symbols |
375
+ | `roam api [--scope <dir>]` | List the public API surface (exported public symbols + signatures) |
376
+ | `roam exit-codes` | List every roam exit code with its meaning |
377
+ | `roam version [--check]` | Show installed version; with `--check` also queries PyPI for newer releases |
378
+ | `roam disambiguate <name>` | List every symbol matching the name with file/line/kind/signature/docstring snippet to pick the right one |
379
+ | `roam pre-commit [--install\|--print]` | Install or preview a roam-critique git pre-commit hook |
380
+ | `roam mcp-status` | MCP server health: preset, registered tools, backpressure limits, cache entries, watcher state |
381
+ | `roam test-impact [<range>]` | Tests transitively reachable from changed symbols (sharper scope than `affected-tests`) |
382
+ | `roam recipes` | List every `roam ask` recipe with intent + example queries (sugar over `ask --list`) |
361
383
 
362
384
  ### Daily Workflow
363
385
 
@@ -370,7 +392,7 @@ roam health
370
392
  | `roam retrieve <task> [--budget N] [--k N] [--seed-files PATH]` | Graph-aware context for free-form tasks: FTS5 + structural rerank (PageRank + clones) + token budget |
371
393
  | `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. |
372
394
  | `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. |
373
- | `roam ask <query> [--list] [--explain] [--recipe NAME]` | One-phrase intent classifier over a 13-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 to cover the most common workflows. |
395
+ | `roam ask <query> [--list] [--explain] [--recipe NAME]` | One-phrase intent classifier over a 24-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 to cover the most common workflows. |
374
396
  | `roam workflow [RECIPE] [--list] [--query TEXT]` | Inspect a recipe DAG, review lenses, gates, rendered command arguments, and follow-up commands without running the workflow. |
375
397
  | `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). |
376
398
  | `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. |
@@ -970,7 +992,7 @@ ROAM_MCP_LITE=0 roam mcp
970
992
  Core preset tools: `roam_affected_tests`, `roam_batch_get`, `roam_batch_search`, `roam_complete`, `roam_complexity_report`, `roam_context`, `roam_dead_code`, `roam_deps`, `roam_diagnose`, `roam_diagnose_issue`, `roam_diff`, `roam_expand_toolset`, `roam_explore`, `roam_file_info`, `roam_health`, `roam_impact`, `roam_pr_risk`, `roam_preflight`, `roam_prepare_change`, `roam_review_change`, `roam_search_symbol`, `roam_syntax_check`, `roam_trace`, `roam_understand`, `roam_uses`.
971
993
 
972
994
  <details>
973
- <summary><strong>MCP tool list (all 122)</strong></summary>
995
+ <summary><strong>MCP tool list (all 123)</strong></summary>
974
996
 
975
997
  | Tool | Description |
976
998
  |------|-------------|
@@ -1093,6 +1115,7 @@ Core preset tools: `roam_affected_tests`, `roam_batch_get`, `roam_batch_search`,
1093
1115
  | `roam_reindex` | Refresh or force-rebuild the index with task-mode support |
1094
1116
  | `roam_reset` | Reset the roam index and cached data |
1095
1117
  | `roam_clean` | Remove stale or orphaned index entries |
1118
+ | `roam_catalog` | Machine-readable list of every registered MCP tool with capability flags (read_only / destructive / core) |
1096
1119
  | `roam_batch_search` | Batch symbol search: run multiple pattern queries in a single call |
1097
1120
  | `roam_batch_get` | Batch context retrieval: fetch multiple symbols/files in a single call |
1098
1121
  | `roam_dev_profile` | Developer productivity profile: commit patterns, specialization, and impact |
@@ -1610,7 +1633,7 @@ roam-code/
1610
1633
  ├── action.yml # Reusable GitHub Action
1611
1634
  ├── src/roam/
1612
1635
  │ ├── __init__.py # Version (from pyproject.toml)
1613
- │ ├── cli.py # Click CLI (155 canonical + 6 aliases)
1636
+ │ ├── cli.py # Click CLI (177 canonical + 7 aliases)
1614
1637
  │ ├── mcp_server.py # MCP server (122 tools, 10 resources, 5 prompts)
1615
1638
  │ ├── db/
1616
1639
  │ │ ├── connection.py # SQLite (WAL, pragmas, batched IN)
@@ -1705,7 +1728,7 @@ Optional: Local semantic ONNX stack (`numpy`, `onnxruntime`, `tokenizers`) via `
1705
1728
  ### Shipped
1706
1729
 
1707
1730
  - [x] MCP v2 agent surface: in-process execution, compound operations, presets, schemas, annotations, and compatibility profiles.
1708
- - [x] Full command and MCP inventory parity in docs: 155 canonical CLI commands and 122 MCP tools.
1731
+ - [x] Full command and MCP inventory parity in docs: 177 canonical CLI commands and 123 MCP tools.
1709
1732
  - [x] CI hardening: composite action, changed-only mode, trend-aware gates, sticky PR updater, and SARIF guardrails.
1710
1733
  - [x] Performance foundation: FTS5/BM25 search, O(changed) incremental indexing, DB/index optimizations.
1711
1734
  - [x] Agent governance suite: `vibe-check`, `ai-readiness`, `verify`, `ai-ratio`, `duplicates`, advanced `algo` scoring/SARIF.
@@ -4,9 +4,9 @@
4
4
 
5
5
  **Architectural sight for AI coding agents — before they edit.**
6
6
 
7
- A local code graph (SQLite + tree-sitter + git history) that gives any agent — Claude Code, Cursor, Aider, Continue, your own — five high-leverage verbs: `understand`, `retrieve`, `context`, `preflight`, `critique`. The other 150 specialised commands are advanced surface for specialised workflows.
7
+ A local code graph (SQLite + tree-sitter + git history) that gives any agent — Claude Code, Cursor, Aider, Continue, your own — five high-leverage verbs: `understand`, `retrieve`, `context`, `preflight`, `critique`. The other 172 specialised commands are advanced surface for specialised workflows.
8
8
 
9
- *155 commands · 122 MCP tools · 27 languages · 100% local · zero API keys*
9
+ *177 commands · 123 MCP tools · 27 languages · 100% local · zero API keys*
10
10
 
11
11
  [![PyPI version](https://img.shields.io/pypi/v/roam-code?style=flat-square&color=blue)](https://pypi.org/project/roam-code/)
12
12
  [![GitHub stars](https://img.shields.io/github/stars/Cranot/roam-code?style=flat-square)](https://github.com/Cranot/roam-code/stargazers)
@@ -25,7 +25,7 @@ Roam is a structural intelligence engine for software. It pre-indexes your codeb
25
25
  Unlike LSPs (editor-bound, language-specific) or Sourcegraph (hosted search), Roam provides architecture-level graph queries -- offline, cross-language, and compact. It goes beyond comprehension: Roam governs architecture through budget gates, simulates refactoring outcomes, orchestrates multi-agent swarms with zero-conflict guarantees, maps vulnerability reachability paths, and enables graph-level code editing without syntax errors.
26
26
 
27
27
  ```
28
- Codebase ──> [Index] ──> Semantic Graph ──> 155 Commands ──> AI Agent
28
+ Codebase ──> [Index] ──> Semantic Graph ──> 177 Commands ──> AI Agent
29
29
  │ │ │
30
30
  tree-sitter symbols comprehend
31
31
  27 languages + edges govern
@@ -98,7 +98,7 @@ $ roam diff # blast radius of uncommitted changes
98
98
  - **`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.
99
99
  - **`.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`.
100
100
  - **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).
101
- - **155 CLI commands, 122 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). 35-tool `core` preset is the default for token-budget-conscious clients.
101
+ - **177 CLI commands, 123 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). 35-tool `core` preset is the default for token-budget-conscious clients.
102
102
 
103
103
  ## What's New in v11
104
104
 
@@ -269,7 +269,7 @@ roam health
269
269
 
270
270
  ## Commands
271
271
 
272
- **Lead with the 5 verbs.** The [5 core commands](#core-commands) cover ~80% of agent workflows: `understand`, `context`, `retrieve`, `preflight`, `critique`. The remaining 150 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 **155 commands organised into 7 categories** (plus 6 aliases for muscle memory: `algo` → `math`, `weather` → `churn`, `digest` / `snapshot` / `trend` → `trends`, `onboard` → `understand`), but you don't need to know that to start.
272
+ **Lead with the 5 verbs.** The [5 core commands](#core-commands) cover ~80% of agent workflows: `understand`, `context`, `retrieve`, `preflight`, `critique`. The remaining 172 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 **177 commands organised into 7 categories** (plus 6 aliases for muscle memory: `algo` → `math`, `weather` → `churn`, `digest` / `snapshot` / `trend` → `trends`, `onboard` → `understand`), but you don't need to know that to start.
273
273
 
274
274
  <details>
275
275
  <summary><strong>Full command reference</strong></summary>
@@ -300,6 +300,28 @@ roam health
300
300
  | `roam mcp-setup <platform>` | Generate MCP config snippets for AI platforms: claude-code, cursor, windsurf, vscode, gemini-cli, codex-cli |
301
301
  | `roam ci-setup [--platform P] [--write]` | Generate CI/CD pipeline config (GitHub Actions, GitLab CI, Azure Pipelines, Jenkins, Bitbucket) with SARIF + quality gates |
302
302
  | `roam adrs [--status S] [--limit N]` | Discover Architecture Decision Records, link to affected code modules, show status and coverage |
303
+ | `roam plugins` | List discovered plugins (commands, detectors, language extractors) registered via `ROAM_PLUGIN_MODULES` or entry points |
304
+ | `roam index-stats` | Report .roam index size, row counts, and SQLite fragmentation; hints when VACUUM or `roam reset` is overdue |
305
+ | `roam test-pyramid` | Count tests by kind (unit/integration/e2e/smoke) using path + filename heuristics; flags inverted pyramids |
306
+ | `roam telemetry` | Surface the opt-in local telemetry ring buffer (slowest + recent calls); enable via `ROAM_TELEMETRY_LOCAL=1` |
307
+ | `roam orphan-imports` | List Python imports that don't resolve to any indexed module or installed package |
308
+ | `roam changelog [--suggest]` | List commits since the last tag, optionally as a Conventional-Commits-bucketed markdown CHANGELOG draft |
309
+ | `roam graph-export [--format graphml\|dot\|jsonl]` | Export the symbol or file dependency graph for external tooling (Gephi, Cytoscape, custom analyses) |
310
+ | `roam help-search <query>` | Fuzzy match across every command's name + help text (replaces grepping `--help-all` output) |
311
+ | `roam stats` | Aggregate metrics over the index: count by language, file role, kind, plus recent commit activity |
312
+ | `roam timeline <symbol>` | Chronological commits that touched the file owning the symbol — author, date, lines added/removed |
313
+ | `roam pr-prep [<range>]` | One-shot pre-PR fitness check that bundles diff + critique + pr-risk into one envelope |
314
+ | `roam why-fail <test>` | Find recently-changed symbols transitively reachable from a failing test |
315
+ | `roam recommend <symbol>` | Surface related symbols using call-graph + co-change + clone signals |
316
+ | `roam graph-stats` | Graph-level invariants: density, weak components, non-trivial cycles, top inbound symbols |
317
+ | `roam api [--scope <dir>]` | List the public API surface (exported public symbols + signatures) |
318
+ | `roam exit-codes` | List every roam exit code with its meaning |
319
+ | `roam version [--check]` | Show installed version; with `--check` also queries PyPI for newer releases |
320
+ | `roam disambiguate <name>` | List every symbol matching the name with file/line/kind/signature/docstring snippet to pick the right one |
321
+ | `roam pre-commit [--install\|--print]` | Install or preview a roam-critique git pre-commit hook |
322
+ | `roam mcp-status` | MCP server health: preset, registered tools, backpressure limits, cache entries, watcher state |
323
+ | `roam test-impact [<range>]` | Tests transitively reachable from changed symbols (sharper scope than `affected-tests`) |
324
+ | `roam recipes` | List every `roam ask` recipe with intent + example queries (sugar over `ask --list`) |
303
325
 
304
326
  ### Daily Workflow
305
327
 
@@ -312,7 +334,7 @@ roam health
312
334
  | `roam retrieve <task> [--budget N] [--k N] [--seed-files PATH]` | Graph-aware context for free-form tasks: FTS5 + structural rerank (PageRank + clones) + token budget |
313
335
  | `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. |
314
336
  | `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. |
315
- | `roam ask <query> [--list] [--explain] [--recipe NAME]` | One-phrase intent classifier over a 13-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 to cover the most common workflows. |
337
+ | `roam ask <query> [--list] [--explain] [--recipe NAME]` | One-phrase intent classifier over a 24-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 to cover the most common workflows. |
316
338
  | `roam workflow [RECIPE] [--list] [--query TEXT]` | Inspect a recipe DAG, review lenses, gates, rendered command arguments, and follow-up commands without running the workflow. |
317
339
  | `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). |
318
340
  | `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. |
@@ -912,7 +934,7 @@ ROAM_MCP_LITE=0 roam mcp
912
934
  Core preset tools: `roam_affected_tests`, `roam_batch_get`, `roam_batch_search`, `roam_complete`, `roam_complexity_report`, `roam_context`, `roam_dead_code`, `roam_deps`, `roam_diagnose`, `roam_diagnose_issue`, `roam_diff`, `roam_expand_toolset`, `roam_explore`, `roam_file_info`, `roam_health`, `roam_impact`, `roam_pr_risk`, `roam_preflight`, `roam_prepare_change`, `roam_review_change`, `roam_search_symbol`, `roam_syntax_check`, `roam_trace`, `roam_understand`, `roam_uses`.
913
935
 
914
936
  <details>
915
- <summary><strong>MCP tool list (all 122)</strong></summary>
937
+ <summary><strong>MCP tool list (all 123)</strong></summary>
916
938
 
917
939
  | Tool | Description |
918
940
  |------|-------------|
@@ -1035,6 +1057,7 @@ Core preset tools: `roam_affected_tests`, `roam_batch_get`, `roam_batch_search`,
1035
1057
  | `roam_reindex` | Refresh or force-rebuild the index with task-mode support |
1036
1058
  | `roam_reset` | Reset the roam index and cached data |
1037
1059
  | `roam_clean` | Remove stale or orphaned index entries |
1060
+ | `roam_catalog` | Machine-readable list of every registered MCP tool with capability flags (read_only / destructive / core) |
1038
1061
  | `roam_batch_search` | Batch symbol search: run multiple pattern queries in a single call |
1039
1062
  | `roam_batch_get` | Batch context retrieval: fetch multiple symbols/files in a single call |
1040
1063
  | `roam_dev_profile` | Developer productivity profile: commit patterns, specialization, and impact |
@@ -1552,7 +1575,7 @@ roam-code/
1552
1575
  ├── action.yml # Reusable GitHub Action
1553
1576
  ├── src/roam/
1554
1577
  │ ├── __init__.py # Version (from pyproject.toml)
1555
- │ ├── cli.py # Click CLI (155 canonical + 6 aliases)
1578
+ │ ├── cli.py # Click CLI (177 canonical + 7 aliases)
1556
1579
  │ ├── mcp_server.py # MCP server (122 tools, 10 resources, 5 prompts)
1557
1580
  │ ├── db/
1558
1581
  │ │ ├── connection.py # SQLite (WAL, pragmas, batched IN)
@@ -1647,7 +1670,7 @@ Optional: Local semantic ONNX stack (`numpy`, `onnxruntime`, `tokenizers`) via `
1647
1670
  ### Shipped
1648
1671
 
1649
1672
  - [x] MCP v2 agent surface: in-process execution, compound operations, presets, schemas, annotations, and compatibility profiles.
1650
- - [x] Full command and MCP inventory parity in docs: 155 canonical CLI commands and 122 MCP tools.
1673
+ - [x] Full command and MCP inventory parity in docs: 177 canonical CLI commands and 123 MCP tools.
1651
1674
  - [x] CI hardening: composite action, changed-only mode, trend-aware gates, sticky PR updater, and SARIF guardrails.
1652
1675
  - [x] Performance foundation: FTS5/BM25 search, O(changed) incremental indexing, DB/index optimizations.
1653
1676
  - [x] Agent governance suite: `vibe-check`, `ai-readiness`, `verify`, `ai-ratio`, `duplicates`, advanced `algo` scoring/SARIF.
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "roam-code"
7
- version = "12.14"
7
+ version = "12.18"
8
8
  description = "Instant codebase comprehension for AI coding agents"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.9"
@@ -0,0 +1,14 @@
1
+ """Allow running as python -m roam."""
2
+
3
+ import sys
4
+
5
+ from roam.cli import cli
6
+
7
+ # Pass 40 — graceful Ctrl-C: exit 130 (SIGINT convention) without
8
+ # spilling a Python traceback. Long-running commands still leave any
9
+ # committed DB rows in place — this just suppresses the noise.
10
+ try:
11
+ cli()
12
+ except KeyboardInterrupt:
13
+ sys.stderr.write("\nInterrupted (Ctrl-C). Partial work has been preserved; rerun the command to continue.\n")
14
+ sys.exit(130)
@@ -376,6 +376,271 @@ RECIPES: list[Recipe] = [
376
376
  followups=("roam fingerprint", "roam health --json"),
377
377
  gates=("Stop on new cycles", "Extract boundaries before moving highly coupled modules"),
378
378
  ),
379
+ # 12.15 — recipe expansion. Cover the agent workflows that
380
+ # showed up repeatedly in dogfood but weren't classified.
381
+ Recipe(
382
+ name="trace-bug",
383
+ intent="Diagnose a failing test, error, or bug back to its root cause",
384
+ examples=(
385
+ "why is my test failing",
386
+ "trace this exception to its source",
387
+ "debug this error",
388
+ "what's causing this bug",
389
+ ),
390
+ keywords=("debug", "bug", "error", "failing", "broken", "crash", "exception", "traceback"),
391
+ commands=(
392
+ ("diagnose", ("{symbol}",)),
393
+ ("trace", ("{symbol}",)),
394
+ ("affected-tests", ("{symbol}",)),
395
+ ),
396
+ summary=(
397
+ "Risk-ranked upstream/downstream suspects, dependency paths, and the "
398
+ "tests that exercise the symbol — three lenses on the same bug."
399
+ ),
400
+ phase="diagnose",
401
+ perspectives=("root-cause", "execution-path", "test-coverage"),
402
+ followups=("roam context {symbol}", "roam diff"),
403
+ gates=("Confirm reproduction before changing anything",),
404
+ ),
405
+ Recipe(
406
+ name="who-owns",
407
+ intent="Identify the human owners or expert authors of a symbol or area",
408
+ examples=(
409
+ "who owns this code",
410
+ "who should review my change to UserSession",
411
+ "who is the expert on auth",
412
+ "find the maintainer",
413
+ ),
414
+ keywords=("owner", "owns", "expert", "maintainer", "author", "review", "loop in"),
415
+ commands=(
416
+ ("owner", ("{symbol}",)),
417
+ ("suggest-reviewers", ()),
418
+ ("bus-factor", ()),
419
+ ),
420
+ summary=(
421
+ "Code-ownership map (CODEOWNERS + git churn) plus suggested reviewers "
422
+ "and bus-factor warnings. Use to route changes through the right humans."
423
+ ),
424
+ phase="ownership",
425
+ perspectives=("ownership", "review-routing", "bus-factor"),
426
+ followups=("roam codeowners --check", "roam dev-profile <author>"),
427
+ gates=("Loop in original author when bus-factor is 1",),
428
+ ),
429
+ Recipe(
430
+ name="what-changed",
431
+ intent="Summarise recent activity in a file, symbol, or directory",
432
+ examples=(
433
+ "what changed in this file recently",
434
+ "show recent commits to auth.py",
435
+ "what's the history of UserSession",
436
+ "who last touched this",
437
+ ),
438
+ keywords=("recent", "history", "commits", "lately", "last week", "last month", "what changed"),
439
+ commands=(
440
+ ("weather", ()),
441
+ ("trends", ("--days", "30")),
442
+ ),
443
+ summary=("Hot file weather plus 30-day trend snapshot. Use to spot churn spikes before reviewing a PR."),
444
+ phase="discover",
445
+ perspectives=("churn", "velocity", "regression-risk"),
446
+ followups=("roam diagnose <symbol>", "roam pr-risk"),
447
+ gates=("Re-run trends weekly to track movement",),
448
+ ),
449
+ Recipe(
450
+ name="audit-security",
451
+ intent="Run a security audit: secrets, taint flows, dependency vulnerabilities",
452
+ examples=(
453
+ "audit security",
454
+ "any vulnerabilities here",
455
+ "find secrets and SQLi",
456
+ "check for security issues",
457
+ ),
458
+ keywords=("security", "audit", "vulnerability", "vuln", "secret", "taint", "sqli", "xss"),
459
+ commands=(
460
+ ("secrets", ()),
461
+ ("taint", ()),
462
+ ("vulns", ()),
463
+ ("supply-chain", ()),
464
+ ),
465
+ summary=(
466
+ "Four parallel security passes: secret leakage, taint reachability, "
467
+ "known-CVE mapping, supply-chain trust. Treat any HIGH severity "
468
+ "as a release blocker."
469
+ ),
470
+ phase="security",
471
+ perspectives=("secrets", "data-flow", "supply-chain", "vulnerability-reachability"),
472
+ followups=("roam taint --rules-pack sqli", "roam cga emit --include-taint"),
473
+ gates=("Stop on any HIGH severity finding",),
474
+ ),
475
+ Recipe(
476
+ name="explore-impact",
477
+ intent="Predict the blast radius and risk of an upcoming change",
478
+ examples=(
479
+ "what will break if I change UserSession",
480
+ "predict the impact of editing auth.py",
481
+ "blast radius of this change",
482
+ "is this change risky",
483
+ ),
484
+ keywords=("impact", "blast", "break", "predict", "ripple", "risky"),
485
+ commands=(
486
+ ("impact", ("{symbol}",)),
487
+ ("affected-tests", ("{symbol}",)),
488
+ ("preflight", ("{symbol}",)),
489
+ ),
490
+ summary=(
491
+ "Transitive blast radius (PageRank-personalized), test coverage, "
492
+ "and the unified preflight verdict — three lenses on one change."
493
+ ),
494
+ phase="scope",
495
+ perspectives=("blast-radius", "test-coverage", "risk"),
496
+ followups=("roam closure {symbol}", "roam diff"),
497
+ gates=("Stop on CRITICAL preflight risk", "Cover all impacted tests before merging"),
498
+ ),
499
+ Recipe(
500
+ name="find-similar",
501
+ intent="Find code that duplicates or closely resembles a target",
502
+ examples=(
503
+ "find duplicates of this function",
504
+ "are there similar implementations of UserSession",
505
+ "show me clones",
506
+ "what code looks like this",
507
+ ),
508
+ keywords=("duplicate", "clone", "similar", "copy", "redundant", "dedup"),
509
+ commands=(
510
+ ("clones", ("--threshold", "0.7")),
511
+ ("duplicates", ()),
512
+ ),
513
+ summary=(
514
+ "AST-hash clone detection + lexical duplicate finder. Use to consolidate copy-paste before a refactor."
515
+ ),
516
+ phase="cleanup",
517
+ perspectives=("clone-detection", "deduplication", "consolidation"),
518
+ followups=("roam suggest-refactoring", "roam plan-refactor"),
519
+ gates=("Confirm tests still pass after consolidation",),
520
+ ),
521
+ Recipe(
522
+ name="why-this-exists",
523
+ intent="Understand why a piece of code exists — purpose, history, role",
524
+ examples=(
525
+ "why does this function exist",
526
+ "what is UserSession for",
527
+ "explain this code",
528
+ "purpose of handle_login",
529
+ ),
530
+ keywords=("why", "purpose", "what for", "explain", "describe", "role"),
531
+ commands=(
532
+ ("why", ("{symbol}",)),
533
+ ("symbol", ("{symbol}",)),
534
+ ("hover", ("{symbol}",)),
535
+ ),
536
+ summary=(
537
+ "Architectural role classification, full symbol metadata, and a "
538
+ "compact one-line summary — three views on one symbol's purpose."
539
+ ),
540
+ phase="understand",
541
+ perspectives=("role", "metadata", "summary"),
542
+ followups=("roam context {symbol}", "roam trace <caller> {symbol}"),
543
+ gates=("Don't repeat already-known intent — focus on unstated rationale",),
544
+ ),
545
+ Recipe(
546
+ name="check-pr",
547
+ intent="Run a full pre-merge review on a pull request",
548
+ examples=(
549
+ "review this PR",
550
+ "is my pull request ready to merge",
551
+ "audit the diff",
552
+ "pre-merge check",
553
+ ),
554
+ keywords=("pr", "pull request", "merge", "ship", "review", "ready"),
555
+ commands=(
556
+ ("pr-risk", ()),
557
+ ("pr-diff", ()),
558
+ ("breaking", ()),
559
+ ),
560
+ summary=(
561
+ "Risk score (with driver named), structural diff impact, and "
562
+ "breaking-change detection. Pair with `roam critique` for the "
563
+ "graph-grounded patch verifier."
564
+ ),
565
+ phase="review",
566
+ perspectives=("risk-score", "structural-diff", "breaking-changes"),
567
+ followups=("roam critique", "roam suggest-reviewers"),
568
+ gates=("Stop on HIGH risk score", "Stop on any breaking change without major version bump"),
569
+ ),
570
+ Recipe(
571
+ name="explore-tests",
572
+ intent="Map test coverage, gaps, and orphaned tests",
573
+ examples=(
574
+ "show test coverage",
575
+ "find untested code",
576
+ "what tests exercise this",
577
+ "are there orphan tests",
578
+ ),
579
+ keywords=("test", "coverage", "untested", "tests", "fixtures"),
580
+ commands=(
581
+ ("test-map", ()),
582
+ ("coverage-gaps", ("--gate-pattern", ".*")),
583
+ ("affected-tests", ("{symbol}",)),
584
+ ),
585
+ summary=(
586
+ "Source↔test mapping, coverage gaps for the gate pattern, "
587
+ "and the test set that exercises a specific symbol."
588
+ ),
589
+ phase="testing",
590
+ perspectives=("coverage", "test-discovery", "untested-paths"),
591
+ followups=("roam test-scaffold {symbol}", "roam pytest-fixtures"),
592
+ gates=("Cover every gate-protected entry point",),
593
+ ),
594
+ Recipe(
595
+ name="dependency-update",
596
+ intent="Assess the safety of upgrading or removing a dependency",
597
+ examples=(
598
+ "is it safe to upgrade flask",
599
+ "what depends on requests",
600
+ "remove this package",
601
+ "audit this dependency",
602
+ ),
603
+ keywords=("upgrade", "depend", "package", "library", "version", "lock", "remove"),
604
+ commands=(
605
+ ("supply-chain", ()),
606
+ ("vulns", ()),
607
+ ("vuln-reach", ()),
608
+ ),
609
+ summary=(
610
+ "Dependency tree + known-CVE mapping + reachability. The "
611
+ "reachability layer turns a 'CVE in transitive dep' alert into "
612
+ "an actionable 'this CVE is reachable from your code'."
613
+ ),
614
+ phase="dependency",
615
+ perspectives=("supply-chain", "vulnerability", "reachability"),
616
+ followups=("roam sbom --format cyclonedx", "roam cga emit"),
617
+ gates=("Block upgrades that introduce reachable HIGH CVEs",),
618
+ ),
619
+ Recipe(
620
+ name="visualize-architecture",
621
+ intent="Generate a diagram of the architecture, layers, or a focus area",
622
+ examples=(
623
+ "show me an architecture diagram",
624
+ "draw the layers",
625
+ "visualize the auth subsystem",
626
+ "diagram of UserSession's neighborhood",
627
+ ),
628
+ keywords=("diagram", "visualize", "draw", "graph", "mermaid", "picture", "layout"),
629
+ commands=(
630
+ ("visualize", ()),
631
+ ("layers", ()),
632
+ ("clusters", ()),
633
+ ),
634
+ summary=(
635
+ "Mermaid architecture diagram + topological layer breakdown + "
636
+ "Louvain cluster grouping. Use the diagram in PR descriptions "
637
+ "or design documents."
638
+ ),
639
+ phase="architecture",
640
+ perspectives=("structure", "layers", "clusters"),
641
+ followups=("roam visualize --focus <symbol>", "roam fingerprint"),
642
+ gates=("Diagrams complement reading the code, they don't replace it",),
643
+ ),
379
644
  ]
380
645
 
381
646