roam-code 12.14__tar.gz → 12.17__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 (607) hide show
  1. {roam_code-12.14/src/roam_code.egg-info → roam_code-12.17}/PKG-INFO +26 -8
  2. {roam_code-12.14 → roam_code-12.17}/README.md +25 -7
  3. {roam_code-12.14 → roam_code-12.17}/pyproject.toml +1 -1
  4. roam_code-12.17/src/roam/__main__.py +14 -0
  5. {roam_code-12.14 → roam_code-12.17}/src/roam/ask/recipes.py +265 -0
  6. {roam_code-12.14 → roam_code-12.17}/src/roam/cli.py +93 -0
  7. roam_code-12.17/src/roam/commands/cmd_api.py +106 -0
  8. roam_code-12.17/src/roam/commands/cmd_changelog.py +177 -0
  9. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_clones.py +41 -1
  10. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_config.py +197 -0
  11. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_context.py +44 -1
  12. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_critique.py +123 -1
  13. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_diagnose.py +74 -2
  14. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_diff.py +26 -1
  15. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_docs_coverage.py +77 -11
  16. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_doctor.py +87 -0
  17. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_eval_retrieve.py +12 -0
  18. roam_code-12.17/src/roam/commands/cmd_exit_codes.py +65 -0
  19. roam_code-12.17/src/roam/commands/cmd_graph_export.py +124 -0
  20. roam_code-12.17/src/roam/commands/cmd_graph_stats.py +115 -0
  21. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_health.py +35 -1
  22. roam_code-12.17/src/roam/commands/cmd_help_search.py +107 -0
  23. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_hotspots.py +107 -1
  24. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_impact.py +26 -5
  25. roam_code-12.17/src/roam/commands/cmd_index_stats.py +113 -0
  26. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_oracle.py +109 -0
  27. roam_code-12.17/src/roam/commands/cmd_orphan_imports.py +175 -0
  28. roam_code-12.17/src/roam/commands/cmd_plugins.py +98 -0
  29. roam_code-12.17/src/roam/commands/cmd_pr_prep.py +174 -0
  30. roam_code-12.17/src/roam/commands/cmd_recommend.py +198 -0
  31. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_reset.py +37 -2
  32. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_retrieve.py +21 -1
  33. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_search.py +89 -15
  34. roam_code-12.17/src/roam/commands/cmd_stats.py +110 -0
  35. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_taint.py +10 -1
  36. roam_code-12.17/src/roam/commands/cmd_telemetry.py +70 -0
  37. roam_code-12.17/src/roam/commands/cmd_test_pyramid.py +83 -0
  38. roam_code-12.17/src/roam/commands/cmd_timeline.py +140 -0
  39. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_tour.py +22 -1
  40. roam_code-12.17/src/roam/commands/cmd_version.py +80 -0
  41. roam_code-12.17/src/roam/commands/cmd_why_fail.py +179 -0
  42. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_workflow.py +53 -1
  43. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/resolve.py +47 -0
  44. {roam_code-12.14 → roam_code-12.17}/src/roam/competitor_site_data.py +2 -2
  45. {roam_code-12.14 → roam_code-12.17}/src/roam/db/connection.py +24 -0
  46. {roam_code-12.14 → roam_code-12.17}/src/roam/graph/builder.py +33 -0
  47. {roam_code-12.14 → roam_code-12.17}/src/roam/index/file_roles.py +56 -0
  48. {roam_code-12.14 → roam_code-12.17}/src/roam/index/indexer.py +43 -0
  49. {roam_code-12.14 → roam_code-12.17}/src/roam/mcp-server-card.json +5 -5
  50. {roam_code-12.14 → roam_code-12.17}/src/roam/mcp_server.py +267 -1
  51. roam_code-12.17/src/roam/telemetry.py +116 -0
  52. {roam_code-12.14 → roam_code-12.17/src/roam_code.egg-info}/PKG-INFO +26 -8
  53. {roam_code-12.14 → roam_code-12.17}/src/roam_code.egg-info/SOURCES.txt +23 -0
  54. {roam_code-12.14 → roam_code-12.17}/tests/test_ask.py +14 -2
  55. {roam_code-12.14 → roam_code-12.17}/tests/test_defer_loading.py +2 -0
  56. {roam_code-12.14 → roam_code-12.17}/tests/test_doctor.py +5 -1
  57. {roam_code-12.14 → roam_code-12.17}/tests/test_mcp_server.py +19 -4
  58. roam_code-12.17/tests/test_v1215_passes.py +109 -0
  59. roam_code-12.17/tests/test_v1216_passes.py +157 -0
  60. roam_code-12.17/tests/test_v1216_passes_41_50.py +192 -0
  61. roam_code-12.17/tests/test_v1216_passes_51_60.py +150 -0
  62. roam_code-12.17/tests/test_v1217_passes_61_80.py +194 -0
  63. roam_code-12.14/src/roam/__main__.py +0 -5
  64. {roam_code-12.14 → roam_code-12.17}/LICENSE +0 -0
  65. {roam_code-12.14 → roam_code-12.17}/setup.cfg +0 -0
  66. {roam_code-12.14 → roam_code-12.17}/src/roam/__init__.py +0 -0
  67. {roam_code-12.14 → roam_code-12.17}/src/roam/analysis/__init__.py +0 -0
  68. {roam_code-12.14 → roam_code-12.17}/src/roam/analysis/effects.py +0 -0
  69. {roam_code-12.14 → roam_code-12.17}/src/roam/analysis/taint.py +0 -0
  70. {roam_code-12.14 → roam_code-12.17}/src/roam/api.py +0 -0
  71. {roam_code-12.14 → roam_code-12.17}/src/roam/ask/__init__.py +0 -0
  72. {roam_code-12.14 → roam_code-12.17}/src/roam/ask/classifier.py +0 -0
  73. {roam_code-12.14 → roam_code-12.17}/src/roam/ask/runner.py +0 -0
  74. {roam_code-12.14 → roam_code-12.17}/src/roam/ask/workflow.py +0 -0
  75. {roam_code-12.14 → roam_code-12.17}/src/roam/attest/__init__.py +0 -0
  76. {roam_code-12.14 → roam_code-12.17}/src/roam/attest/cga.py +0 -0
  77. {roam_code-12.14 → roam_code-12.17}/src/roam/bridges/__init__.py +0 -0
  78. {roam_code-12.14 → roam_code-12.17}/src/roam/bridges/base.py +0 -0
  79. {roam_code-12.14 → roam_code-12.17}/src/roam/bridges/bridge_config.py +0 -0
  80. {roam_code-12.14 → roam_code-12.17}/src/roam/bridges/bridge_django.py +0 -0
  81. {roam_code-12.14 → roam_code-12.17}/src/roam/bridges/bridge_protobuf.py +0 -0
  82. {roam_code-12.14 → roam_code-12.17}/src/roam/bridges/bridge_rest_api.py +0 -0
  83. {roam_code-12.14 → roam_code-12.17}/src/roam/bridges/bridge_salesforce.py +0 -0
  84. {roam_code-12.14 → roam_code-12.17}/src/roam/bridges/bridge_template.py +0 -0
  85. {roam_code-12.14 → roam_code-12.17}/src/roam/bridges/registry.py +0 -0
  86. {roam_code-12.14 → roam_code-12.17}/src/roam/catalog/__init__.py +0 -0
  87. {roam_code-12.14 → roam_code-12.17}/src/roam/catalog/detectors.py +0 -0
  88. {roam_code-12.14 → roam_code-12.17}/src/roam/catalog/fixes.py +0 -0
  89. {roam_code-12.14 → roam_code-12.17}/src/roam/catalog/python_idioms.py +0 -0
  90. {roam_code-12.14 → roam_code-12.17}/src/roam/catalog/smells.py +0 -0
  91. {roam_code-12.14 → roam_code-12.17}/src/roam/catalog/tasks.py +0 -0
  92. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/__init__.py +0 -0
  93. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/changed_files.py +0 -0
  94. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_adrs.py +0 -0
  95. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_adversarial.py +0 -0
  96. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_affected.py +0 -0
  97. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_affected_tests.py +0 -0
  98. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_agent_context.py +0 -0
  99. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_agent_export.py +0 -0
  100. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_agent_plan.py +0 -0
  101. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_ai_ratio.py +0 -0
  102. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_ai_readiness.py +0 -0
  103. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_alerts.py +0 -0
  104. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_annotate.py +0 -0
  105. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_api_changes.py +0 -0
  106. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_api_drift.py +0 -0
  107. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_ask.py +0 -0
  108. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_attest.py +0 -0
  109. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_auth_gaps.py +0 -0
  110. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_bisect.py +0 -0
  111. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_breaking.py +0 -0
  112. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_budget.py +0 -0
  113. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_bus_factor.py +0 -0
  114. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_capsule.py +0 -0
  115. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_cga.py +0 -0
  116. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_check_rules.py +0 -0
  117. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_ci_setup.py +0 -0
  118. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_clean.py +0 -0
  119. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_closure.py +0 -0
  120. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_clusters.py +0 -0
  121. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_codeowners.py +0 -0
  122. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_complexity.py +0 -0
  123. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_congestion.py +0 -0
  124. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_conventions.py +0 -0
  125. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_coupling.py +0 -0
  126. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_coverage_gaps.py +0 -0
  127. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_cut.py +0 -0
  128. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_dark_matter.py +0 -0
  129. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_dashboard.py +0 -0
  130. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_dead.py +0 -0
  131. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_debt.py +0 -0
  132. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_deps.py +0 -0
  133. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_describe.py +0 -0
  134. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_dev_profile.py +0 -0
  135. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_doc_staleness.py +0 -0
  136. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_drift.py +0 -0
  137. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_duplicates.py +0 -0
  138. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_effects.py +0 -0
  139. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_endpoints.py +0 -0
  140. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_entry_points.py +0 -0
  141. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_fan.py +0 -0
  142. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_file.py +0 -0
  143. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_fingerprint.py +0 -0
  144. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_fitness.py +0 -0
  145. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_flag_dead.py +0 -0
  146. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_fleet.py +0 -0
  147. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_fn_coupling.py +0 -0
  148. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_forecast.py +0 -0
  149. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_grep.py +0 -0
  150. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_guard.py +0 -0
  151. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_hooks.py +0 -0
  152. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_hover.py +0 -0
  153. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_index.py +0 -0
  154. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_index_bundle.py +0 -0
  155. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_ingest_trace.py +0 -0
  156. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_init.py +0 -0
  157. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_intent.py +0 -0
  158. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_invariants.py +0 -0
  159. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_layers.py +0 -0
  160. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_map.py +0 -0
  161. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_math.py +0 -0
  162. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_mcp_setup.py +0 -0
  163. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_metrics.py +0 -0
  164. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_migration_safety.py +0 -0
  165. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_minimap.py +0 -0
  166. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_missing_index.py +0 -0
  167. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_module.py +0 -0
  168. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_mutate.py +0 -0
  169. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_n1.py +0 -0
  170. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_orchestrate.py +0 -0
  171. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_orphan_routes.py +0 -0
  172. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_over_fetch.py +0 -0
  173. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_owner.py +0 -0
  174. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_partition.py +0 -0
  175. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_path_coverage.py +0 -0
  176. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_patterns.py +0 -0
  177. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_plan.py +0 -0
  178. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_plan_refactor.py +0 -0
  179. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_pr_diff.py +0 -0
  180. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_pr_risk.py +0 -0
  181. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_preflight.py +0 -0
  182. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_py_modern.py +0 -0
  183. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_py_types.py +0 -0
  184. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_pytest_fixtures.py +0 -0
  185. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_relate.py +0 -0
  186. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_report.py +0 -0
  187. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_risk.py +0 -0
  188. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_rules.py +0 -0
  189. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_safe_delete.py +0 -0
  190. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_safe_zones.py +0 -0
  191. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_sbom.py +0 -0
  192. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_schema.py +0 -0
  193. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_search_semantic.py +0 -0
  194. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_secrets.py +0 -0
  195. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_semantic_diff.py +0 -0
  196. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_simulate.py +0 -0
  197. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_simulate_departure.py +0 -0
  198. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_sketch.py +0 -0
  199. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_smells.py +0 -0
  200. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_spectral.py +0 -0
  201. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_split.py +0 -0
  202. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_suggest_refactoring.py +0 -0
  203. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_suggest_reviewers.py +0 -0
  204. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_supply_chain.py +0 -0
  205. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_symbol.py +0 -0
  206. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_syntax_check.py +0 -0
  207. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_test_gaps.py +0 -0
  208. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_test_scaffold.py +0 -0
  209. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_testmap.py +0 -0
  210. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_trace.py +0 -0
  211. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_trends.py +0 -0
  212. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_triage.py +0 -0
  213. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_understand.py +0 -0
  214. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_uses.py +0 -0
  215. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_verify.py +0 -0
  216. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_verify_imports.py +0 -0
  217. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_vibe_check.py +0 -0
  218. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_visualize.py +0 -0
  219. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_vuln_map.py +0 -0
  220. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_vuln_reach.py +0 -0
  221. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_vulns.py +0 -0
  222. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_watch.py +0 -0
  223. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_weather.py +0 -0
  224. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_why.py +0 -0
  225. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_ws.py +0 -0
  226. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/cmd_xlang.py +0 -0
  227. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/codeowners_helpers.py +0 -0
  228. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/context_helpers.py +0 -0
  229. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/gate_presets.py +0 -0
  230. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/graph_helpers.py +0 -0
  231. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/metrics_history.py +0 -0
  232. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/next_steps.py +0 -0
  233. {roam_code-12.14 → roam_code-12.17}/src/roam/commands/suppression.py +0 -0
  234. {roam_code-12.14 → roam_code-12.17}/src/roam/config.py +0 -0
  235. {roam_code-12.14 → roam_code-12.17}/src/roam/coverage_reports.py +0 -0
  236. {roam_code-12.14 → roam_code-12.17}/src/roam/critique/__init__.py +0 -0
  237. {roam_code-12.14 → roam_code-12.17}/src/roam/critique/aggregator.py +0 -0
  238. {roam_code-12.14 → roam_code-12.17}/src/roam/critique/checks.py +0 -0
  239. {roam_code-12.14 → roam_code-12.17}/src/roam/db/__init__.py +0 -0
  240. {roam_code-12.14 → roam_code-12.17}/src/roam/db/queries.py +0 -0
  241. {roam_code-12.14 → roam_code-12.17}/src/roam/db/schema.py +0 -0
  242. {roam_code-12.14 → roam_code-12.17}/src/roam/eval/__init__.py +0 -0
  243. {roam_code-12.14 → roam_code-12.17}/src/roam/eval/harness.py +0 -0
  244. {roam_code-12.14 → roam_code-12.17}/src/roam/exit_codes.py +0 -0
  245. {roam_code-12.14 → roam_code-12.17}/src/roam/fleet/__init__.py +0 -0
  246. {roam_code-12.14 → roam_code-12.17}/src/roam/fleet/adapters.py +0 -0
  247. {roam_code-12.14 → roam_code-12.17}/src/roam/fleet/manifest.py +0 -0
  248. {roam_code-12.14 → roam_code-12.17}/src/roam/git_utils.py +0 -0
  249. {roam_code-12.14 → roam_code-12.17}/src/roam/graph/__init__.py +0 -0
  250. {roam_code-12.14 → roam_code-12.17}/src/roam/graph/anomaly.py +0 -0
  251. {roam_code-12.14 → roam_code-12.17}/src/roam/graph/clone_detect.py +0 -0
  252. {roam_code-12.14 → roam_code-12.17}/src/roam/graph/clusters.py +0 -0
  253. {roam_code-12.14 → roam_code-12.17}/src/roam/graph/cycles.py +0 -0
  254. {roam_code-12.14 → roam_code-12.17}/src/roam/graph/dark_matter.py +0 -0
  255. {roam_code-12.14 → roam_code-12.17}/src/roam/graph/diff.py +0 -0
  256. {roam_code-12.14 → roam_code-12.17}/src/roam/graph/fingerprint.py +0 -0
  257. {roam_code-12.14 → roam_code-12.17}/src/roam/graph/layers.py +0 -0
  258. {roam_code-12.14 → roam_code-12.17}/src/roam/graph/pagerank.py +0 -0
  259. {roam_code-12.14 → roam_code-12.17}/src/roam/graph/partition.py +0 -0
  260. {roam_code-12.14 → roam_code-12.17}/src/roam/graph/pathfinding.py +0 -0
  261. {roam_code-12.14 → roam_code-12.17}/src/roam/graph/propagation.py +0 -0
  262. {roam_code-12.14 → roam_code-12.17}/src/roam/graph/simulate.py +0 -0
  263. {roam_code-12.14 → roam_code-12.17}/src/roam/graph/spectral.py +0 -0
  264. {roam_code-12.14 → roam_code-12.17}/src/roam/graph/stats.py +0 -0
  265. {roam_code-12.14 → roam_code-12.17}/src/roam/index/__init__.py +0 -0
  266. {roam_code-12.14 → roam_code-12.17}/src/roam/index/complexity.py +0 -0
  267. {roam_code-12.14 → roam_code-12.17}/src/roam/index/discovery.py +0 -0
  268. {roam_code-12.14 → roam_code-12.17}/src/roam/index/django_post.py +0 -0
  269. {roam_code-12.14 → roam_code-12.17}/src/roam/index/git_stats.py +0 -0
  270. {roam_code-12.14 → roam_code-12.17}/src/roam/index/gitignore.py +0 -0
  271. {roam_code-12.14 → roam_code-12.17}/src/roam/index/incremental.py +0 -0
  272. {roam_code-12.14 → roam_code-12.17}/src/roam/index/parser.py +0 -0
  273. {roam_code-12.14 → roam_code-12.17}/src/roam/index/pytest_fixtures.py +0 -0
  274. {roam_code-12.14 → roam_code-12.17}/src/roam/index/registry_dispatch.py +0 -0
  275. {roam_code-12.14 → roam_code-12.17}/src/roam/index/relations.py +0 -0
  276. {roam_code-12.14 → roam_code-12.17}/src/roam/index/symbols.py +0 -0
  277. {roam_code-12.14 → roam_code-12.17}/src/roam/index/test_conventions.py +0 -0
  278. {roam_code-12.14 → roam_code-12.17}/src/roam/languages/__init__.py +0 -0
  279. {roam_code-12.14 → roam_code-12.17}/src/roam/languages/apex_lang.py +0 -0
  280. {roam_code-12.14 → roam_code-12.17}/src/roam/languages/aura_lang.py +0 -0
  281. {roam_code-12.14 → roam_code-12.17}/src/roam/languages/base.py +0 -0
  282. {roam_code-12.14 → roam_code-12.17}/src/roam/languages/c_lang.py +0 -0
  283. {roam_code-12.14 → roam_code-12.17}/src/roam/languages/csharp_lang.py +0 -0
  284. {roam_code-12.14 → roam_code-12.17}/src/roam/languages/extractor_schema.py +0 -0
  285. {roam_code-12.14 → roam_code-12.17}/src/roam/languages/extractors/kotlin.yaml +0 -0
  286. {roam_code-12.14 → roam_code-12.17}/src/roam/languages/foxpro_lang.py +0 -0
  287. {roam_code-12.14 → roam_code-12.17}/src/roam/languages/generic_lang.py +0 -0
  288. {roam_code-12.14 → roam_code-12.17}/src/roam/languages/go_lang.py +0 -0
  289. {roam_code-12.14 → roam_code-12.17}/src/roam/languages/hcl_lang.py +0 -0
  290. {roam_code-12.14 → roam_code-12.17}/src/roam/languages/java_lang.py +0 -0
  291. {roam_code-12.14 → roam_code-12.17}/src/roam/languages/javascript_lang.py +0 -0
  292. {roam_code-12.14 → roam_code-12.17}/src/roam/languages/kotlin_lang.py +0 -0
  293. {roam_code-12.14 → roam_code-12.17}/src/roam/languages/php_lang.py +0 -0
  294. {roam_code-12.14 → roam_code-12.17}/src/roam/languages/python_lang.py +0 -0
  295. {roam_code-12.14 → roam_code-12.17}/src/roam/languages/query_engine.py +0 -0
  296. {roam_code-12.14 → roam_code-12.17}/src/roam/languages/registry.py +0 -0
  297. {roam_code-12.14 → roam_code-12.17}/src/roam/languages/ruby_lang.py +0 -0
  298. {roam_code-12.14 → roam_code-12.17}/src/roam/languages/rust_lang.py +0 -0
  299. {roam_code-12.14 → roam_code-12.17}/src/roam/languages/scala_lang.py +0 -0
  300. {roam_code-12.14 → roam_code-12.17}/src/roam/languages/sfxml_lang.py +0 -0
  301. {roam_code-12.14 → roam_code-12.17}/src/roam/languages/sql_lang.py +0 -0
  302. {roam_code-12.14 → roam_code-12.17}/src/roam/languages/swift_lang.py +0 -0
  303. {roam_code-12.14 → roam_code-12.17}/src/roam/languages/typescript_lang.py +0 -0
  304. {roam_code-12.14 → roam_code-12.17}/src/roam/languages/visualforce_lang.py +0 -0
  305. {roam_code-12.14 → roam_code-12.17}/src/roam/languages/yaml_lang.py +0 -0
  306. {roam_code-12.14 → roam_code-12.17}/src/roam/mcp_extras/__init__.py +0 -0
  307. {roam_code-12.14 → roam_code-12.17}/src/roam/mcp_extras/completions.py +0 -0
  308. {roam_code-12.14 → roam_code-12.17}/src/roam/mcp_extras/concurrency.py +0 -0
  309. {roam_code-12.14 → roam_code-12.17}/src/roam/mcp_extras/progress.py +0 -0
  310. {roam_code-12.14 → roam_code-12.17}/src/roam/mcp_extras/sampling.py +0 -0
  311. {roam_code-12.14 → roam_code-12.17}/src/roam/mcp_extras/session.py +0 -0
  312. {roam_code-12.14 → roam_code-12.17}/src/roam/mcp_extras/watcher.py +0 -0
  313. {roam_code-12.14 → roam_code-12.17}/src/roam/output/__init__.py +0 -0
  314. {roam_code-12.14 → roam_code-12.17}/src/roam/output/confidence.py +0 -0
  315. {roam_code-12.14 → roam_code-12.17}/src/roam/output/errors.py +0 -0
  316. {roam_code-12.14 → roam_code-12.17}/src/roam/output/file_role_hints.py +0 -0
  317. {roam_code-12.14 → roam_code-12.17}/src/roam/output/formatter.py +0 -0
  318. {roam_code-12.14 → roam_code-12.17}/src/roam/output/framework_filter.py +0 -0
  319. {roam_code-12.14 → roam_code-12.17}/src/roam/output/mermaid.py +0 -0
  320. {roam_code-12.14 → roam_code-12.17}/src/roam/output/project_shape.py +0 -0
  321. {roam_code-12.14 → roam_code-12.17}/src/roam/output/sarif.py +0 -0
  322. {roam_code-12.14 → roam_code-12.17}/src/roam/output/schema_registry.py +0 -0
  323. {roam_code-12.14 → roam_code-12.17}/src/roam/plugins.py +0 -0
  324. {roam_code-12.14 → roam_code-12.17}/src/roam/refactor/__init__.py +0 -0
  325. {roam_code-12.14 → roam_code-12.17}/src/roam/refactor/codegen.py +0 -0
  326. {roam_code-12.14 → roam_code-12.17}/src/roam/refactor/transforms.py +0 -0
  327. {roam_code-12.14 → roam_code-12.17}/src/roam/retrieve/__init__.py +0 -0
  328. {roam_code-12.14 → roam_code-12.17}/src/roam/retrieve/learned_ranker.py +0 -0
  329. {roam_code-12.14 → roam_code-12.17}/src/roam/retrieve/pipeline.py +0 -0
  330. {roam_code-12.14 → roam_code-12.17}/src/roam/retrieve/rerank.py +0 -0
  331. {roam_code-12.14 → roam_code-12.17}/src/roam/retrieve/seeds.py +0 -0
  332. {roam_code-12.14 → roam_code-12.17}/src/roam/retrieve/semantic.py +0 -0
  333. {roam_code-12.14 → roam_code-12.17}/src/roam/rules/__init__.py +0 -0
  334. {roam_code-12.14 → roam_code-12.17}/src/roam/rules/ast_match.py +0 -0
  335. {roam_code-12.14 → roam_code-12.17}/src/roam/rules/builtin.py +0 -0
  336. {roam_code-12.14 → roam_code-12.17}/src/roam/rules/dataflow.py +0 -0
  337. {roam_code-12.14 → roam_code-12.17}/src/roam/rules/engine.py +0 -0
  338. {roam_code-12.14 → roam_code-12.17}/src/roam/runtime/__init__.py +0 -0
  339. {roam_code-12.14 → roam_code-12.17}/src/roam/runtime/daemon.py +0 -0
  340. {roam_code-12.14 → roam_code-12.17}/src/roam/runtime/graph_backend.py +0 -0
  341. {roam_code-12.14 → roam_code-12.17}/src/roam/runtime/hotspots.py +0 -0
  342. {roam_code-12.14 → roam_code-12.17}/src/roam/runtime/lock_modes.py +0 -0
  343. {roam_code-12.14 → roam_code-12.17}/src/roam/runtime/lockmgr.py +0 -0
  344. {roam_code-12.14 → roam_code-12.17}/src/roam/runtime/trace_ingest.py +0 -0
  345. {roam_code-12.14 → roam_code-12.17}/src/roam/search/__init__.py +0 -0
  346. {roam_code-12.14 → roam_code-12.17}/src/roam/search/framework_packs.py +0 -0
  347. {roam_code-12.14 → roam_code-12.17}/src/roam/search/index_embeddings.py +0 -0
  348. {roam_code-12.14 → roam_code-12.17}/src/roam/search/onnx_embeddings.py +0 -0
  349. {roam_code-12.14 → roam_code-12.17}/src/roam/search/tfidf.py +0 -0
  350. {roam_code-12.14 → roam_code-12.17}/src/roam/security/__init__.py +0 -0
  351. {roam_code-12.14 → roam_code-12.17}/src/roam/security/aibom_extension.py +0 -0
  352. {roam_code-12.14 → roam_code-12.17}/src/roam/security/taint_classifier.py +0 -0
  353. {roam_code-12.14 → roam_code-12.17}/src/roam/security/taint_engine.py +0 -0
  354. {roam_code-12.14 → roam_code-12.17}/src/roam/security/taint_rules/api_error_leak.yaml +0 -0
  355. {roam_code-12.14 → roam_code-12.17}/src/roam/security/taint_rules/java_fileupload_path_traversal.yaml +0 -0
  356. {roam_code-12.14 → roam_code-12.17}/src/roam/security/taint_rules/js_insecure_jwt_decode.yaml +0 -0
  357. {roam_code-12.14 → roam_code-12.17}/src/roam/security/taint_rules/js_localstorage_secrets.yaml +0 -0
  358. {roam_code-12.14 → roam_code-12.17}/src/roam/security/taint_rules/js_prototype_pollution.yaml +0 -0
  359. {roam_code-12.14 → roam_code-12.17}/src/roam/security/taint_rules/js_ssrf.yaml +0 -0
  360. {roam_code-12.14 → roam_code-12.17}/src/roam/security/taint_rules/js_xss.yaml +0 -0
  361. {roam_code-12.14 → roam_code-12.17}/src/roam/security/taint_rules/python_basic.yaml +0 -0
  362. {roam_code-12.14 → roam_code-12.17}/src/roam/security/taint_rules/python_deserialization.yaml +0 -0
  363. {roam_code-12.14 → roam_code-12.17}/src/roam/security/taint_rules/python_path_traversal.yaml +0 -0
  364. {roam_code-12.14 → roam_code-12.17}/src/roam/security/taint_rules/python_socketio_remote_source.yaml +0 -0
  365. {roam_code-12.14 → roam_code-12.17}/src/roam/security/taint_rules/python_sqli.yaml +0 -0
  366. {roam_code-12.14 → roam_code-12.17}/src/roam/security/taint_rules/python_urllib_open_redirect.yaml +0 -0
  367. {roam_code-12.14 → roam_code-12.17}/src/roam/security/taint_rules/vue_v_html.yaml +0 -0
  368. {roam_code-12.14 → roam_code-12.17}/src/roam/security/vuln_reach.py +0 -0
  369. {roam_code-12.14 → roam_code-12.17}/src/roam/security/vuln_store.py +0 -0
  370. {roam_code-12.14 → roam_code-12.17}/src/roam/surface_counts.py +0 -0
  371. {roam_code-12.14 → roam_code-12.17}/src/roam/templates/__init__.py +0 -0
  372. {roam_code-12.14 → roam_code-12.17}/src/roam/templates/ci/Jenkinsfile +0 -0
  373. {roam_code-12.14 → roam_code-12.17}/src/roam/templates/ci/__init__.py +0 -0
  374. {roam_code-12.14 → roam_code-12.17}/src/roam/templates/ci/azure-pipelines.yml +0 -0
  375. {roam_code-12.14 → roam_code-12.17}/src/roam/templates/ci/bitbucket-pipelines.yml +0 -0
  376. {roam_code-12.14 → roam_code-12.17}/src/roam/templates/ci/gitlab-ci.yml +0 -0
  377. {roam_code-12.14 → roam_code-12.17}/src/roam/workspace/__init__.py +0 -0
  378. {roam_code-12.14 → roam_code-12.17}/src/roam/workspace/aggregator.py +0 -0
  379. {roam_code-12.14 → roam_code-12.17}/src/roam/workspace/api_scanner.py +0 -0
  380. {roam_code-12.14 → roam_code-12.17}/src/roam/workspace/config.py +0 -0
  381. {roam_code-12.14 → roam_code-12.17}/src/roam/workspace/db.py +0 -0
  382. {roam_code-12.14 → roam_code-12.17}/src/roam_code.egg-info/dependency_links.txt +0 -0
  383. {roam_code-12.14 → roam_code-12.17}/src/roam_code.egg-info/entry_points.txt +0 -0
  384. {roam_code-12.14 → roam_code-12.17}/src/roam_code.egg-info/requires.txt +0 -0
  385. {roam_code-12.14 → roam_code-12.17}/src/roam_code.egg-info/top_level.txt +0 -0
  386. {roam_code-12.14 → roam_code-12.17}/tests/test_adrs.py +0 -0
  387. {roam_code-12.14 → roam_code-12.17}/tests/test_adversarial.py +0 -0
  388. {roam_code-12.14 → roam_code-12.17}/tests/test_affected.py +0 -0
  389. {roam_code-12.14 → roam_code-12.17}/tests/test_agent_export.py +0 -0
  390. {roam_code-12.14 → roam_code-12.17}/tests/test_agent_mode.py +0 -0
  391. {roam_code-12.14 → roam_code-12.17}/tests/test_agent_plan_context.py +0 -0
  392. {roam_code-12.14 → roam_code-12.17}/tests/test_ai_ratio.py +0 -0
  393. {roam_code-12.14 → roam_code-12.17}/tests/test_ai_readiness.py +0 -0
  394. {roam_code-12.14 → roam_code-12.17}/tests/test_alerts_cmd.py +0 -0
  395. {roam_code-12.14 → roam_code-12.17}/tests/test_annotations.py +0 -0
  396. {roam_code-12.14 → roam_code-12.17}/tests/test_anomaly.py +0 -0
  397. {roam_code-12.14 → roam_code-12.17}/tests/test_api_changes.py +0 -0
  398. {roam_code-12.14 → roam_code-12.17}/tests/test_api_drift.py +0 -0
  399. {roam_code-12.14 → roam_code-12.17}/tests/test_attest.py +0 -0
  400. {roam_code-12.14 → roam_code-12.17}/tests/test_auth_gaps.py +0 -0
  401. {roam_code-12.14 → roam_code-12.17}/tests/test_backend_fixes_round2.py +0 -0
  402. {roam_code-12.14 → roam_code-12.17}/tests/test_backend_fixes_round3.py +0 -0
  403. {roam_code-12.14 → roam_code-12.17}/tests/test_basic.py +0 -0
  404. {roam_code-12.14 → roam_code-12.17}/tests/test_batch_mcp.py +0 -0
  405. {roam_code-12.14 → roam_code-12.17}/tests/test_bisect.py +0 -0
  406. {roam_code-12.14 → roam_code-12.17}/tests/test_bridge_django.py +0 -0
  407. {roam_code-12.14 → roam_code-12.17}/tests/test_bridges.py +0 -0
  408. {roam_code-12.14 → roam_code-12.17}/tests/test_bridges_extended.py +0 -0
  409. {roam_code-12.14 → roam_code-12.17}/tests/test_budget.py +0 -0
  410. {roam_code-12.14 → roam_code-12.17}/tests/test_budget_flag.py +0 -0
  411. {roam_code-12.14 → roam_code-12.17}/tests/test_budget_phase2.py +0 -0
  412. {roam_code-12.14 → roam_code-12.17}/tests/test_bus_factor.py +0 -0
  413. {roam_code-12.14 → roam_code-12.17}/tests/test_capsule.py +0 -0
  414. {roam_code-12.14 → roam_code-12.17}/tests/test_cga.py +0 -0
  415. {roam_code-12.14 → roam_code-12.17}/tests/test_check_rules.py +0 -0
  416. {roam_code-12.14 → roam_code-12.17}/tests/test_ci_gate_eval.py +0 -0
  417. {roam_code-12.14 → roam_code-12.17}/tests/test_ci_sarif_guard.py +0 -0
  418. {roam_code-12.14 → roam_code-12.17}/tests/test_ci_setup.py +0 -0
  419. {roam_code-12.14 → roam_code-12.17}/tests/test_clones.py +0 -0
  420. {roam_code-12.14 → roam_code-12.17}/tests/test_closure.py +0 -0
  421. {roam_code-12.14 → roam_code-12.17}/tests/test_codeowners.py +0 -0
  422. {roam_code-12.14 → roam_code-12.17}/tests/test_commands_architecture.py +0 -0
  423. {roam_code-12.14 → roam_code-12.17}/tests/test_commands_exploration.py +0 -0
  424. {roam_code-12.14 → roam_code-12.17}/tests/test_commands_health.py +0 -0
  425. {roam_code-12.14 → roam_code-12.17}/tests/test_commands_refactoring.py +0 -0
  426. {roam_code-12.14 → roam_code-12.17}/tests/test_commands_workflow.py +0 -0
  427. {roam_code-12.14 → roam_code-12.17}/tests/test_competitor_site_data.py +0 -0
  428. {roam_code-12.14 → roam_code-12.17}/tests/test_comprehensive.py +0 -0
  429. {roam_code-12.14 → roam_code-12.17}/tests/test_config.py +0 -0
  430. {roam_code-12.14 → roam_code-12.17}/tests/test_congestion.py +0 -0
  431. {roam_code-12.14 → roam_code-12.17}/tests/test_context_propagation.py +0 -0
  432. {roam_code-12.14 → roam_code-12.17}/tests/test_conventions_cmd.py +0 -0
  433. {roam_code-12.14 → roam_code-12.17}/tests/test_coverage_gaps_cmd.py +0 -0
  434. {roam_code-12.14 → roam_code-12.17}/tests/test_coverage_ingestion.py +0 -0
  435. {roam_code-12.14 → roam_code-12.17}/tests/test_critique.py +0 -0
  436. {roam_code-12.14 → roam_code-12.17}/tests/test_cut.py +0 -0
  437. {roam_code-12.14 → roam_code-12.17}/tests/test_dark_matter.py +0 -0
  438. {roam_code-12.14 → roam_code-12.17}/tests/test_dark_matter_helpers.py +0 -0
  439. {roam_code-12.14 → roam_code-12.17}/tests/test_dashboard.py +0 -0
  440. {roam_code-12.14 → roam_code-12.17}/tests/test_dataflow_dead.py +0 -0
  441. {roam_code-12.14 → roam_code-12.17}/tests/test_dead_aging.py +0 -0
  442. {roam_code-12.14 → roam_code-12.17}/tests/test_demo_gif_asset.py +0 -0
  443. {roam_code-12.14 → roam_code-12.17}/tests/test_describe.py +0 -0
  444. {roam_code-12.14 → roam_code-12.17}/tests/test_detail_flag_hints.py +0 -0
  445. {roam_code-12.14 → roam_code-12.17}/tests/test_detector_precision.py +0 -0
  446. {roam_code-12.14 → roam_code-12.17}/tests/test_deterministic_output.py +0 -0
  447. {roam_code-12.14 → roam_code-12.17}/tests/test_dev_profile.py +0 -0
  448. {roam_code-12.14 → roam_code-12.17}/tests/test_difficulty_scoring.py +0 -0
  449. {roam_code-12.14 → roam_code-12.17}/tests/test_doc_consistency.py +0 -0
  450. {roam_code-12.14 → roam_code-12.17}/tests/test_doc_staleness.py +0 -0
  451. {roam_code-12.14 → roam_code-12.17}/tests/test_docker_assets.py +0 -0
  452. {roam_code-12.14 → roam_code-12.17}/tests/test_docs_coverage.py +0 -0
  453. {roam_code-12.14 → roam_code-12.17}/tests/test_docs_site_quality.py +0 -0
  454. {roam_code-12.14 → roam_code-12.17}/tests/test_drift.py +0 -0
  455. {roam_code-12.14 → roam_code-12.17}/tests/test_drift_by_team.py +0 -0
  456. {roam_code-12.14 → roam_code-12.17}/tests/test_duplicates.py +0 -0
  457. {roam_code-12.14 → roam_code-12.17}/tests/test_effects.py +0 -0
  458. {roam_code-12.14 → roam_code-12.17}/tests/test_effects_propagation.py +0 -0
  459. {roam_code-12.14 → roam_code-12.17}/tests/test_endpoints.py +0 -0
  460. {roam_code-12.14 → roam_code-12.17}/tests/test_entry_points_cmd.py +0 -0
  461. {roam_code-12.14 → roam_code-12.17}/tests/test_eval_retrieve.py +0 -0
  462. {roam_code-12.14 → roam_code-12.17}/tests/test_except_pass_narrow.py +0 -0
  463. {roam_code-12.14 → roam_code-12.17}/tests/test_exclude_patterns.py +0 -0
  464. {roam_code-12.14 → roam_code-12.17}/tests/test_exit_codes.py +0 -0
  465. {roam_code-12.14 → roam_code-12.17}/tests/test_extractor_grammar_drift.py +0 -0
  466. {roam_code-12.14 → roam_code-12.17}/tests/test_fallback_contracts.py +0 -0
  467. {roam_code-12.14 → roam_code-12.17}/tests/test_file_roles.py +0 -0
  468. {roam_code-12.14 → roam_code-12.17}/tests/test_fingerprint.py +0 -0
  469. {roam_code-12.14 → roam_code-12.17}/tests/test_fixes.py +0 -0
  470. {roam_code-12.14 → roam_code-12.17}/tests/test_flag_dead.py +0 -0
  471. {roam_code-12.14 → roam_code-12.17}/tests/test_fleet.py +0 -0
  472. {roam_code-12.14 → roam_code-12.17}/tests/test_fn_coupling.py +0 -0
  473. {roam_code-12.14 → roam_code-12.17}/tests/test_forecast.py +0 -0
  474. {roam_code-12.14 → roam_code-12.17}/tests/test_formatters.py +0 -0
  475. {roam_code-12.14 → roam_code-12.17}/tests/test_foxpro.py +0 -0
  476. {roam_code-12.14 → roam_code-12.17}/tests/test_framework_detection.py +0 -0
  477. {roam_code-12.14 → roam_code-12.17}/tests/test_gate_presets.py +0 -0
  478. {roam_code-12.14 → roam_code-12.17}/tests/test_git_utils.py +0 -0
  479. {roam_code-12.14 → roam_code-12.17}/tests/test_guard.py +0 -0
  480. {roam_code-12.14 → roam_code-12.17}/tests/test_health_gate.py +0 -0
  481. {roam_code-12.14 → roam_code-12.17}/tests/test_hooks.py +0 -0
  482. {roam_code-12.14 → roam_code-12.17}/tests/test_hotspots.py +0 -0
  483. {roam_code-12.14 → roam_code-12.17}/tests/test_hover.py +0 -0
  484. {roam_code-12.14 → roam_code-12.17}/tests/test_index.py +0 -0
  485. {roam_code-12.14 → roam_code-12.17}/tests/test_index_bundle.py +0 -0
  486. {roam_code-12.14 → roam_code-12.17}/tests/test_init_cmd.py +0 -0
  487. {roam_code-12.14 → roam_code-12.17}/tests/test_install_check.py +0 -0
  488. {roam_code-12.14 → roam_code-12.17}/tests/test_intent.py +0 -0
  489. {roam_code-12.14 → roam_code-12.17}/tests/test_invariants.py +0 -0
  490. {roam_code-12.14 → roam_code-12.17}/tests/test_json_contracts.py +0 -0
  491. {roam_code-12.14 → roam_code-12.17}/tests/test_json_error_envelope.py +0 -0
  492. {roam_code-12.14 → roam_code-12.17}/tests/test_kotlin_swift_extractors.py +0 -0
  493. {roam_code-12.14 → roam_code-12.17}/tests/test_language_corpus.py +0 -0
  494. {roam_code-12.14 → roam_code-12.17}/tests/test_languages.py +0 -0
  495. {roam_code-12.14 → roam_code-12.17}/tests/test_library_api.py +0 -0
  496. {roam_code-12.14 → roam_code-12.17}/tests/test_math.py +0 -0
  497. {roam_code-12.14 → roam_code-12.17}/tests/test_math_tips.py +0 -0
  498. {roam_code-12.14 → roam_code-12.17}/tests/test_mcp_extras.py +0 -0
  499. {roam_code-12.14 → roam_code-12.17}/tests/test_mcp_setup.py +0 -0
  500. {roam_code-12.14 → roam_code-12.17}/tests/test_mermaid.py +0 -0
  501. {roam_code-12.14 → roam_code-12.17}/tests/test_metrics_cmd.py +0 -0
  502. {roam_code-12.14 → roam_code-12.17}/tests/test_migration_safety.py +0 -0
  503. {roam_code-12.14 → roam_code-12.17}/tests/test_minimap.py +0 -0
  504. {roam_code-12.14 → roam_code-12.17}/tests/test_missing_index.py +0 -0
  505. {roam_code-12.14 → roam_code-12.17}/tests/test_mutate.py +0 -0
  506. {roam_code-12.14 → roam_code-12.17}/tests/test_n1.py +0 -0
  507. {roam_code-12.14 → roam_code-12.17}/tests/test_next_steps.py +0 -0
  508. {roam_code-12.14 → roam_code-12.17}/tests/test_onboard.py +0 -0
  509. {roam_code-12.14 → roam_code-12.17}/tests/test_oracle.py +0 -0
  510. {roam_code-12.14 → roam_code-12.17}/tests/test_orchestrate.py +0 -0
  511. {roam_code-12.14 → roam_code-12.17}/tests/test_orphan_routes.py +0 -0
  512. {roam_code-12.14 → roam_code-12.17}/tests/test_oss_bench_harness.py +0 -0
  513. {roam_code-12.14 → roam_code-12.17}/tests/test_over_fetch.py +0 -0
  514. {roam_code-12.14 → roam_code-12.17}/tests/test_pagerank_truncation.py +0 -0
  515. {roam_code-12.14 → roam_code-12.17}/tests/test_partition.py +0 -0
  516. {roam_code-12.14 → roam_code-12.17}/tests/test_path_coverage.py +0 -0
  517. {roam_code-12.14 → roam_code-12.17}/tests/test_patterns_cmd.py +0 -0
  518. {roam_code-12.14 → roam_code-12.17}/tests/test_performance.py +0 -0
  519. {roam_code-12.14 → roam_code-12.17}/tests/test_personalized_pagerank.py +0 -0
  520. {roam_code-12.14 → roam_code-12.17}/tests/test_plan.py +0 -0
  521. {roam_code-12.14 → roam_code-12.17}/tests/test_plugin_discovery.py +0 -0
  522. {roam_code-12.14 → roam_code-12.17}/tests/test_pr_comment_script.py +0 -0
  523. {roam_code-12.14 → roam_code-12.17}/tests/test_pr_diff.py +0 -0
  524. {roam_code-12.14 → roam_code-12.17}/tests/test_pr_risk_author.py +0 -0
  525. {roam_code-12.14 → roam_code-12.17}/tests/test_progress.py +0 -0
  526. {roam_code-12.14 → roam_code-12.17}/tests/test_progressive_disclosure.py +0 -0
  527. {roam_code-12.14 → roam_code-12.17}/tests/test_properties.py +0 -0
  528. {roam_code-12.14 → roam_code-12.17}/tests/test_pytest_fixtures.py +0 -0
  529. {roam_code-12.14 → roam_code-12.17}/tests/test_python_extractor_v2.py +0 -0
  530. {roam_code-12.14 → roam_code-12.17}/tests/test_python_idioms_e2e.py +0 -0
  531. {roam_code-12.14 → roam_code-12.17}/tests/test_python_pivot.py +0 -0
  532. {roam_code-12.14 → roam_code-12.17}/tests/test_readme_surface_consistency.py +0 -0
  533. {roam_code-12.14 → roam_code-12.17}/tests/test_realworld_feedback.py +0 -0
  534. {roam_code-12.14 → roam_code-12.17}/tests/test_refactoring_intelligence.py +0 -0
  535. {roam_code-12.14 → roam_code-12.17}/tests/test_registry_dispatch.py +0 -0
  536. {roam_code-12.14 → roam_code-12.17}/tests/test_relate.py +0 -0
  537. {roam_code-12.14 → roam_code-12.17}/tests/test_report.py +0 -0
  538. {roam_code-12.14 → roam_code-12.17}/tests/test_reset_clean.py +0 -0
  539. {roam_code-12.14 → roam_code-12.17}/tests/test_resolve.py +0 -0
  540. {roam_code-12.14 → roam_code-12.17}/tests/test_retrieve.py +0 -0
  541. {roam_code-12.14 → roam_code-12.17}/tests/test_retrieve_cross_repo.py +0 -0
  542. {roam_code-12.14 → roam_code-12.17}/tests/test_retrieve_seeds.py +0 -0
  543. {roam_code-12.14 → roam_code-12.17}/tests/test_risk.py +0 -0
  544. {roam_code-12.14 → roam_code-12.17}/tests/test_ruby.py +0 -0
  545. {roam_code-12.14 → roam_code-12.17}/tests/test_rule_profiles.py +0 -0
  546. {roam_code-12.14 → roam_code-12.17}/tests/test_rules.py +0 -0
  547. {roam_code-12.14 → roam_code-12.17}/tests/test_rules_ast_match.py +0 -0
  548. {roam_code-12.14 → roam_code-12.17}/tests/test_rules_community_pack.py +0 -0
  549. {roam_code-12.14 → roam_code-12.17}/tests/test_rules_dataflow.py +0 -0
  550. {roam_code-12.14 → roam_code-12.17}/tests/test_rules_symbol_requirements.py +0 -0
  551. {roam_code-12.14 → roam_code-12.17}/tests/test_runtime.py +0 -0
  552. {roam_code-12.14 → roam_code-12.17}/tests/test_runtime_score.py +0 -0
  553. {roam_code-12.14 → roam_code-12.17}/tests/test_salesforce.py +0 -0
  554. {roam_code-12.14 → roam_code-12.17}/tests/test_sarif_flag.py +0 -0
  555. {roam_code-12.14 → roam_code-12.17}/tests/test_sbom.py +0 -0
  556. {roam_code-12.14 → roam_code-12.17}/tests/test_scala.py +0 -0
  557. {roam_code-12.14 → roam_code-12.17}/tests/test_schema_versioning.py +0 -0
  558. {roam_code-12.14 → roam_code-12.17}/tests/test_search_explain.py +0 -0
  559. {roam_code-12.14 → roam_code-12.17}/tests/test_secrets.py +0 -0
  560. {roam_code-12.14 → roam_code-12.17}/tests/test_secrets_v2.py +0 -0
  561. {roam_code-12.14 → roam_code-12.17}/tests/test_semantic_diff.py +0 -0
  562. {roam_code-12.14 → roam_code-12.17}/tests/test_semantic_onnx.py +0 -0
  563. {roam_code-12.14 → roam_code-12.17}/tests/test_semantic_search.py +0 -0
  564. {roam_code-12.14 → roam_code-12.17}/tests/test_simulate.py +0 -0
  565. {roam_code-12.14 → roam_code-12.17}/tests/test_simulate_departure.py +0 -0
  566. {roam_code-12.14 → roam_code-12.17}/tests/test_sketch.py +0 -0
  567. {roam_code-12.14 → roam_code-12.17}/tests/test_smells.py +0 -0
  568. {roam_code-12.14 → roam_code-12.17}/tests/test_smoke.py +0 -0
  569. {roam_code-12.14 → roam_code-12.17}/tests/test_sna_metrics.py +0 -0
  570. {roam_code-12.14 → roam_code-12.17}/tests/test_spectral.py +0 -0
  571. {roam_code-12.14 → roam_code-12.17}/tests/test_split_cmd.py +0 -0
  572. {roam_code-12.14 → roam_code-12.17}/tests/test_sql.py +0 -0
  573. {roam_code-12.14 → roam_code-12.17}/tests/test_suggest_reviewers.py +0 -0
  574. {roam_code-12.14 → roam_code-12.17}/tests/test_supply_chain.py +0 -0
  575. {roam_code-12.14 → roam_code-12.17}/tests/test_surface_counts.py +0 -0
  576. {roam_code-12.14 → roam_code-12.17}/tests/test_syntax_check.py +0 -0
  577. {roam_code-12.14 → roam_code-12.17}/tests/test_taint.py +0 -0
  578. {roam_code-12.14 → roam_code-12.17}/tests/test_taint_analysis.py +0 -0
  579. {roam_code-12.14 → roam_code-12.17}/tests/test_taint_classifier.py +0 -0
  580. {roam_code-12.14 → roam_code-12.17}/tests/test_taint_intraprocedural.py +0 -0
  581. {roam_code-12.14 → roam_code-12.17}/tests/test_test_conventions.py +0 -0
  582. {roam_code-12.14 → roam_code-12.17}/tests/test_test_gaps.py +0 -0
  583. {roam_code-12.14 → roam_code-12.17}/tests/test_test_scaffold.py +0 -0
  584. {roam_code-12.14 → roam_code-12.17}/tests/test_testmap.py +0 -0
  585. {roam_code-12.14 → roam_code-12.17}/tests/test_top_flag_consistency.py +0 -0
  586. {roam_code-12.14 → roam_code-12.17}/tests/test_tour_cmd.py +0 -0
  587. {roam_code-12.14 → roam_code-12.17}/tests/test_trends.py +0 -0
  588. {roam_code-12.14 → roam_code-12.17}/tests/test_trends_cohort.py +0 -0
  589. {roam_code-12.14 → roam_code-12.17}/tests/test_triage.py +0 -0
  590. {roam_code-12.14 → roam_code-12.17}/tests/test_uses_cmd.py +0 -0
  591. {roam_code-12.14 → roam_code-12.17}/tests/test_v12_2.py +0 -0
  592. {roam_code-12.14 → roam_code-12.17}/tests/test_v6_features.py +0 -0
  593. {roam_code-12.14 → roam_code-12.17}/tests/test_v71_features.py +0 -0
  594. {roam_code-12.14 → roam_code-12.17}/tests/test_v7_features.py +0 -0
  595. {roam_code-12.14 → roam_code-12.17}/tests/test_v82_features.py +0 -0
  596. {roam_code-12.14 → roam_code-12.17}/tests/test_verify.py +0 -0
  597. {roam_code-12.14 → roam_code-12.17}/tests/test_verify_imports.py +0 -0
  598. {roam_code-12.14 → roam_code-12.17}/tests/test_vibe_check.py +0 -0
  599. {roam_code-12.14 → roam_code-12.17}/tests/test_visualize.py +0 -0
  600. {roam_code-12.14 → roam_code-12.17}/tests/test_vuln.py +0 -0
  601. {roam_code-12.14 → roam_code-12.17}/tests/test_vulns_cmd.py +0 -0
  602. {roam_code-12.14 → roam_code-12.17}/tests/test_watch.py +0 -0
  603. {roam_code-12.14 → roam_code-12.17}/tests/test_why.py +0 -0
  604. {roam_code-12.14 → roam_code-12.17}/tests/test_workspace.py +0 -0
  605. {roam_code-12.14 → roam_code-12.17}/tests/test_ws_resolve_fixes.py +0 -0
  606. {roam_code-12.14 → roam_code-12.17}/tests/test_xlang.py +0 -0
  607. {roam_code-12.14 → roam_code-12.17}/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.17
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 167 specialised commands are advanced surface for specialised workflows.
66
66
 
67
- *155 commands · 122 MCP tools · 27 languages · 100% local · zero API keys*
67
+ *172 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)
@@ -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
+ - **155 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 167 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 **172 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,23 @@ 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 |
361
378
 
362
379
  ### Daily Workflow
363
380
 
@@ -370,7 +387,7 @@ roam health
370
387
  | `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
388
  | `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
389
  | `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. |
390
+ | `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
391
  | `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
392
  | `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
393
  | `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 +987,7 @@ ROAM_MCP_LITE=0 roam mcp
970
987
  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
988
 
972
989
  <details>
973
- <summary><strong>MCP tool list (all 122)</strong></summary>
990
+ <summary><strong>MCP tool list (all 123)</strong></summary>
974
991
 
975
992
  | Tool | Description |
976
993
  |------|-------------|
@@ -1093,6 +1110,7 @@ Core preset tools: `roam_affected_tests`, `roam_batch_get`, `roam_batch_search`,
1093
1110
  | `roam_reindex` | Refresh or force-rebuild the index with task-mode support |
1094
1111
  | `roam_reset` | Reset the roam index and cached data |
1095
1112
  | `roam_clean` | Remove stale or orphaned index entries |
1113
+ | `roam_catalog` | Machine-readable list of every registered MCP tool with capability flags (read_only / destructive / core) |
1096
1114
  | `roam_batch_search` | Batch symbol search: run multiple pattern queries in a single call |
1097
1115
  | `roam_batch_get` | Batch context retrieval: fetch multiple symbols/files in a single call |
1098
1116
  | `roam_dev_profile` | Developer productivity profile: commit patterns, specialization, and impact |
@@ -1705,7 +1723,7 @@ Optional: Local semantic ONNX stack (`numpy`, `onnxruntime`, `tokenizers`) via `
1705
1723
  ### Shipped
1706
1724
 
1707
1725
  - [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.
1726
+ - [x] Full command and MCP inventory parity in docs: 155 canonical CLI commands and 123 MCP tools.
1709
1727
  - [x] CI hardening: composite action, changed-only mode, trend-aware gates, sticky PR updater, and SARIF guardrails.
1710
1728
  - [x] Performance foundation: FTS5/BM25 search, O(changed) incremental indexing, DB/index optimizations.
1711
1729
  - [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 167 specialised commands are advanced surface for specialised workflows.
8
8
 
9
- *155 commands · 122 MCP tools · 27 languages · 100% local · zero API keys*
9
+ *172 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)
@@ -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
+ - **155 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 167 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 **172 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,23 @@ 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 |
303
320
 
304
321
  ### Daily Workflow
305
322
 
@@ -312,7 +329,7 @@ roam health
312
329
  | `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
330
  | `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
331
  | `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. |
332
+ | `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
333
  | `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
334
  | `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
335
  | `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 +929,7 @@ ROAM_MCP_LITE=0 roam mcp
912
929
  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
930
 
914
931
  <details>
915
- <summary><strong>MCP tool list (all 122)</strong></summary>
932
+ <summary><strong>MCP tool list (all 123)</strong></summary>
916
933
 
917
934
  | Tool | Description |
918
935
  |------|-------------|
@@ -1035,6 +1052,7 @@ Core preset tools: `roam_affected_tests`, `roam_batch_get`, `roam_batch_search`,
1035
1052
  | `roam_reindex` | Refresh or force-rebuild the index with task-mode support |
1036
1053
  | `roam_reset` | Reset the roam index and cached data |
1037
1054
  | `roam_clean` | Remove stale or orphaned index entries |
1055
+ | `roam_catalog` | Machine-readable list of every registered MCP tool with capability flags (read_only / destructive / core) |
1038
1056
  | `roam_batch_search` | Batch symbol search: run multiple pattern queries in a single call |
1039
1057
  | `roam_batch_get` | Batch context retrieval: fetch multiple symbols/files in a single call |
1040
1058
  | `roam_dev_profile` | Developer productivity profile: commit patterns, specialization, and impact |
@@ -1647,7 +1665,7 @@ Optional: Local semantic ONNX stack (`numpy`, `onnxruntime`, `tokenizers`) via `
1647
1665
  ### Shipped
1648
1666
 
1649
1667
  - [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.
1668
+ - [x] Full command and MCP inventory parity in docs: 155 canonical CLI commands and 123 MCP tools.
1651
1669
  - [x] CI hardening: composite action, changed-only mode, trend-aware gates, sticky PR updater, and SARIF guardrails.
1652
1670
  - [x] Performance foundation: FTS5/BM25 search, O(changed) incremental indexing, DB/index optimizations.
1653
1671
  - [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.17"
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