roam-code 12.47__tar.gz → 12.50__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 (682) hide show
  1. {roam_code-12.47 → roam_code-12.50}/PKG-INFO +42 -20
  2. {roam_code-12.47 → roam_code-12.50}/README.md +41 -19
  3. {roam_code-12.47 → roam_code-12.50}/pyproject.toml +6 -2
  4. {roam_code-12.47 → roam_code-12.50}/src/roam/ask/recipes.py +52 -1
  5. {roam_code-12.47 → roam_code-12.50}/src/roam/attest/__init__.py +0 -1
  6. {roam_code-12.47 → roam_code-12.50}/src/roam/catalog/detectors.py +1 -1
  7. {roam_code-12.47 → roam_code-12.50}/src/roam/cli.py +7 -2
  8. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_audit.py +12 -0
  9. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_capabilities.py +1 -1
  10. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_config.py +1 -3
  11. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_doc_staleness.py +2 -1
  12. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_docs_coverage.py +3 -1
  13. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_help_search.py +1 -1
  14. roam_code-12.50/src/roam/commands/cmd_lsp.py +936 -0
  15. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_mcp_setup.py +3 -3
  16. roam_code-12.50/src/roam/commands/cmd_pr_replay.py +811 -0
  17. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_preflight.py +1 -1
  18. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_smells.py +1 -1
  19. roam_code-12.50/src/roam/commands/cmd_stale_refs.py +3389 -0
  20. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_why_slow.py +1 -3
  21. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/next_steps.py +41 -0
  22. roam_code-12.50/src/roam/commands/stale_refs_anchors.py +230 -0
  23. roam_code-12.50/src/roam/commands/stale_refs_hints.py +417 -0
  24. {roam_code-12.47 → roam_code-12.50}/src/roam/competitor_site_data.py +2 -2
  25. {roam_code-12.47 → roam_code-12.50}/src/roam/mcp-server-card.json +9 -9
  26. {roam_code-12.47 → roam_code-12.50}/src/roam/mcp_server.py +456 -7
  27. {roam_code-12.47 → roam_code-12.50}/src/roam/output/formatter.py +1 -1
  28. {roam_code-12.47 → roam_code-12.50}/src/roam/output/sarif.py +69 -1
  29. {roam_code-12.47 → roam_code-12.50}/src/roam/runtime/daemon.py +8 -9
  30. {roam_code-12.47 → roam_code-12.50}/src/roam/runtime/lock_modes.py +3 -4
  31. {roam_code-12.47 → roam_code-12.50}/src/roam_code.egg-info/PKG-INFO +42 -20
  32. {roam_code-12.47 → roam_code-12.50}/src/roam_code.egg-info/SOURCES.txt +7 -0
  33. {roam_code-12.47 → roam_code-12.50}/tests/test_ask.py +3 -1
  34. {roam_code-12.47 → roam_code-12.50}/tests/test_critique.py +5 -1
  35. {roam_code-12.47 → roam_code-12.50}/tests/test_dart.py +2 -1
  36. {roam_code-12.47 → roam_code-12.50}/tests/test_doc_consistency.py +47 -112
  37. roam_code-12.50/tests/test_docs_site_quality.py +45 -0
  38. {roam_code-12.47 → roam_code-12.50}/tests/test_math.py +5 -5
  39. {roam_code-12.47 → roam_code-12.50}/tests/test_no_internal_language.py +73 -16
  40. roam_code-12.50/tests/test_pr_replay.py +384 -0
  41. roam_code-12.50/tests/test_stale_refs.py +3942 -0
  42. {roam_code-12.47 → roam_code-12.50}/tests/test_why_slow.py +1 -6
  43. roam_code-12.47/tests/test_docs_site_quality.py +0 -86
  44. {roam_code-12.47 → roam_code-12.50}/LICENSE +0 -0
  45. {roam_code-12.47 → roam_code-12.50}/setup.cfg +0 -0
  46. {roam_code-12.47 → roam_code-12.50}/src/roam/__init__.py +0 -0
  47. {roam_code-12.47 → roam_code-12.50}/src/roam/__main__.py +0 -0
  48. {roam_code-12.47 → roam_code-12.50}/src/roam/analysis/__init__.py +0 -0
  49. {roam_code-12.47 → roam_code-12.50}/src/roam/analysis/effects.py +0 -0
  50. {roam_code-12.47 → roam_code-12.50}/src/roam/analysis/taint.py +0 -0
  51. {roam_code-12.47 → roam_code-12.50}/src/roam/api.py +0 -0
  52. {roam_code-12.47 → roam_code-12.50}/src/roam/ask/__init__.py +0 -0
  53. {roam_code-12.47 → roam_code-12.50}/src/roam/ask/classifier.py +0 -0
  54. {roam_code-12.47 → roam_code-12.50}/src/roam/ask/runner.py +0 -0
  55. {roam_code-12.47 → roam_code-12.50}/src/roam/ask/workflow.py +0 -0
  56. {roam_code-12.47 → roam_code-12.50}/src/roam/attest/cga.py +0 -0
  57. {roam_code-12.47 → roam_code-12.50}/src/roam/bridges/__init__.py +0 -0
  58. {roam_code-12.47 → roam_code-12.50}/src/roam/bridges/base.py +0 -0
  59. {roam_code-12.47 → roam_code-12.50}/src/roam/bridges/bridge_config.py +0 -0
  60. {roam_code-12.47 → roam_code-12.50}/src/roam/bridges/bridge_django.py +0 -0
  61. {roam_code-12.47 → roam_code-12.50}/src/roam/bridges/bridge_protobuf.py +0 -0
  62. {roam_code-12.47 → roam_code-12.50}/src/roam/bridges/bridge_rest_api.py +0 -0
  63. {roam_code-12.47 → roam_code-12.50}/src/roam/bridges/bridge_salesforce.py +0 -0
  64. {roam_code-12.47 → roam_code-12.50}/src/roam/bridges/bridge_template.py +0 -0
  65. {roam_code-12.47 → roam_code-12.50}/src/roam/bridges/registry.py +0 -0
  66. {roam_code-12.47 → roam_code-12.50}/src/roam/capability.py +0 -0
  67. {roam_code-12.47 → roam_code-12.50}/src/roam/catalog/__init__.py +0 -0
  68. {roam_code-12.47 → roam_code-12.50}/src/roam/catalog/fixes.py +0 -0
  69. {roam_code-12.47 → roam_code-12.50}/src/roam/catalog/python_idioms.py +0 -0
  70. {roam_code-12.47 → roam_code-12.50}/src/roam/catalog/smells.py +0 -0
  71. {roam_code-12.47 → roam_code-12.50}/src/roam/catalog/tasks.py +0 -0
  72. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/__init__.py +0 -0
  73. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/audit_trail_helpers.py +0 -0
  74. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/changed_files.py +0 -0
  75. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_adrs.py +0 -0
  76. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_adversarial.py +0 -0
  77. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_affected.py +0 -0
  78. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_affected_tests.py +0 -0
  79. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_agent_context.py +0 -0
  80. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_agent_export.py +0 -0
  81. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_agent_plan.py +0 -0
  82. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_ai_ratio.py +0 -0
  83. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_ai_readiness.py +0 -0
  84. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_alerts.py +0 -0
  85. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_annotate.py +0 -0
  86. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_api.py +0 -0
  87. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_api_changes.py +0 -0
  88. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_api_drift.py +0 -0
  89. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_article_12_check.py +0 -0
  90. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_ask.py +0 -0
  91. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_attest.py +0 -0
  92. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_audit_trail_conformance.py +0 -0
  93. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_audit_trail_export.py +0 -0
  94. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_audit_trail_verify.py +0 -0
  95. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_auth_gaps.py +0 -0
  96. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_bisect.py +0 -0
  97. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_breaking.py +0 -0
  98. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_budget.py +0 -0
  99. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_bus_factor.py +0 -0
  100. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_capsule.py +0 -0
  101. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_cga.py +0 -0
  102. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_changelog.py +0 -0
  103. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_check_rules.py +0 -0
  104. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_ci_setup.py +0 -0
  105. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_clean.py +0 -0
  106. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_clones.py +0 -0
  107. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_closure.py +0 -0
  108. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_clusters.py +0 -0
  109. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_codeowners.py +0 -0
  110. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_compare.py +0 -0
  111. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_complexity.py +0 -0
  112. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_congestion.py +0 -0
  113. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_context.py +0 -0
  114. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_conventions.py +0 -0
  115. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_coupling.py +0 -0
  116. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_coverage_gaps.py +0 -0
  117. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_critique.py +0 -0
  118. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_cut.py +0 -0
  119. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_dark_matter.py +0 -0
  120. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_dashboard.py +0 -0
  121. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_dead.py +0 -0
  122. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_debt.py +0 -0
  123. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_deps.py +0 -0
  124. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_describe.py +0 -0
  125. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_dev_profile.py +0 -0
  126. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_diagnose.py +0 -0
  127. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_diff.py +0 -0
  128. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_disambiguate.py +0 -0
  129. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_doctor.py +0 -0
  130. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_dogfood.py +0 -0
  131. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_drift.py +0 -0
  132. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_duplicates.py +0 -0
  133. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_effects.py +0 -0
  134. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_endpoints.py +0 -0
  135. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_entry_points.py +0 -0
  136. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_eval_retrieve.py +0 -0
  137. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_exit_codes.py +0 -0
  138. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_fan.py +0 -0
  139. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_file.py +0 -0
  140. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_fingerprint.py +0 -0
  141. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_fitness.py +0 -0
  142. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_flag_dead.py +0 -0
  143. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_fleet.py +0 -0
  144. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_fn_coupling.py +0 -0
  145. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_forecast.py +0 -0
  146. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_graph_export.py +0 -0
  147. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_graph_stats.py +0 -0
  148. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_grep.py +0 -0
  149. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_guard.py +0 -0
  150. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_health.py +0 -0
  151. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_hooks.py +0 -0
  152. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_hotspots.py +0 -0
  153. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_hover.py +0 -0
  154. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_impact.py +0 -0
  155. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_index.py +0 -0
  156. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_index_bundle.py +0 -0
  157. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_index_stats.py +0 -0
  158. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_ingest_trace.py +0 -0
  159. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_init.py +0 -0
  160. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_intent.py +0 -0
  161. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_invariants.py +0 -0
  162. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_layers.py +0 -0
  163. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_map.py +0 -0
  164. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_math.py +0 -0
  165. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_mcp_status.py +0 -0
  166. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_metrics.py +0 -0
  167. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_metrics_push.py +0 -0
  168. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_migration_plan.py +0 -0
  169. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_migration_safety.py +0 -0
  170. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_minimap.py +0 -0
  171. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_missing_index.py +0 -0
  172. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_module.py +0 -0
  173. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_mutate.py +0 -0
  174. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_n1.py +0 -0
  175. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_oracle.py +0 -0
  176. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_orchestrate.py +0 -0
  177. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_orphan_imports.py +0 -0
  178. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_orphan_routes.py +0 -0
  179. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_over_fetch.py +0 -0
  180. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_owner.py +0 -0
  181. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_partition.py +0 -0
  182. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_path_coverage.py +0 -0
  183. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_patterns.py +0 -0
  184. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_permit.py +0 -0
  185. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_plan.py +0 -0
  186. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_plan_refactor.py +0 -0
  187. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_plugins.py +0 -0
  188. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_postmortem.py +0 -0
  189. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_pr_analyze.py +0 -0
  190. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_pr_comment_render.py +0 -0
  191. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_pr_diff.py +0 -0
  192. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_pr_prep.py +0 -0
  193. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_pr_risk.py +0 -0
  194. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_pre_commit.py +0 -0
  195. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_py_modern.py +0 -0
  196. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_py_types.py +0 -0
  197. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_pytest_fixtures.py +0 -0
  198. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_recipes.py +0 -0
  199. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_recommend.py +0 -0
  200. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_relate.py +0 -0
  201. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_report.py +0 -0
  202. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_reset.py +0 -0
  203. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_retrieve.py +0 -0
  204. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_risk.py +0 -0
  205. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_rules.py +0 -0
  206. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_rules_validate.py +0 -0
  207. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_safe_delete.py +0 -0
  208. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_safe_zones.py +0 -0
  209. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_sbom.py +0 -0
  210. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_schema.py +0 -0
  211. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_search.py +0 -0
  212. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_search_semantic.py +0 -0
  213. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_secrets.py +0 -0
  214. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_semantic_diff.py +0 -0
  215. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_simulate.py +0 -0
  216. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_simulate_departure.py +0 -0
  217. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_sketch.py +0 -0
  218. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_skill_generate.py +0 -0
  219. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_spectral.py +0 -0
  220. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_split.py +0 -0
  221. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_stats.py +0 -0
  222. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_suggest_refactoring.py +0 -0
  223. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_suggest_reviewers.py +0 -0
  224. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_supply_chain.py +0 -0
  225. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_suppress.py +0 -0
  226. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_symbol.py +0 -0
  227. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_syntax_check.py +0 -0
  228. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_taint.py +0 -0
  229. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_telemetry.py +0 -0
  230. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_test_gaps.py +0 -0
  231. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_test_impact.py +0 -0
  232. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_test_pyramid.py +0 -0
  233. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_test_scaffold.py +0 -0
  234. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_testmap.py +0 -0
  235. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_timeline.py +0 -0
  236. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_tour.py +0 -0
  237. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_trace.py +0 -0
  238. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_trends.py +0 -0
  239. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_triage.py +0 -0
  240. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_understand.py +0 -0
  241. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_uses.py +0 -0
  242. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_verify.py +0 -0
  243. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_verify_imports.py +0 -0
  244. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_version.py +0 -0
  245. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_vibe_check.py +0 -0
  246. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_visualize.py +0 -0
  247. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_vuln_map.py +0 -0
  248. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_vuln_reach.py +0 -0
  249. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_vulns.py +0 -0
  250. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_watch.py +0 -0
  251. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_weather.py +0 -0
  252. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_why.py +0 -0
  253. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_why_fail.py +0 -0
  254. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_workflow.py +0 -0
  255. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_ws.py +0 -0
  256. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/cmd_xlang.py +0 -0
  257. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/codeowners_helpers.py +0 -0
  258. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/context_helpers.py +0 -0
  259. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/finding_suppress.py +0 -0
  260. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/gate_presets.py +0 -0
  261. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/git_helpers.py +0 -0
  262. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/graph_helpers.py +0 -0
  263. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/metrics_history.py +0 -0
  264. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/pr_analyze/__init__.py +0 -0
  265. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/pr_analyze/audit_trail.py +0 -0
  266. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/pr_analyze/cache.py +0 -0
  267. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/pr_analyze/rules.py +0 -0
  268. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/resolve.py +0 -0
  269. {roam_code-12.47 → roam_code-12.50}/src/roam/commands/suppression.py +0 -0
  270. {roam_code-12.47 → roam_code-12.50}/src/roam/config.py +0 -0
  271. {roam_code-12.47 → roam_code-12.50}/src/roam/coverage_reports.py +0 -0
  272. {roam_code-12.47 → roam_code-12.50}/src/roam/critique/__init__.py +0 -0
  273. {roam_code-12.47 → roam_code-12.50}/src/roam/critique/aggregator.py +0 -0
  274. {roam_code-12.47 → roam_code-12.50}/src/roam/critique/checks.py +0 -0
  275. {roam_code-12.47 → roam_code-12.50}/src/roam/db/__init__.py +0 -0
  276. {roam_code-12.47 → roam_code-12.50}/src/roam/db/connection.py +0 -0
  277. {roam_code-12.47 → roam_code-12.50}/src/roam/db/queries.py +0 -0
  278. {roam_code-12.47 → roam_code-12.50}/src/roam/db/schema.py +0 -0
  279. {roam_code-12.47 → roam_code-12.50}/src/roam/eval/__init__.py +0 -0
  280. {roam_code-12.47 → roam_code-12.50}/src/roam/eval/harness.py +0 -0
  281. {roam_code-12.47 → roam_code-12.50}/src/roam/exit_codes.py +0 -0
  282. {roam_code-12.47 → roam_code-12.50}/src/roam/fleet/__init__.py +0 -0
  283. {roam_code-12.47 → roam_code-12.50}/src/roam/fleet/adapters.py +0 -0
  284. {roam_code-12.47 → roam_code-12.50}/src/roam/fleet/manifest.py +0 -0
  285. {roam_code-12.47 → roam_code-12.50}/src/roam/git_utils.py +0 -0
  286. {roam_code-12.47 → roam_code-12.50}/src/roam/graph/__init__.py +0 -0
  287. {roam_code-12.47 → roam_code-12.50}/src/roam/graph/anomaly.py +0 -0
  288. {roam_code-12.47 → roam_code-12.50}/src/roam/graph/builder.py +0 -0
  289. {roam_code-12.47 → roam_code-12.50}/src/roam/graph/clone_detect.py +0 -0
  290. {roam_code-12.47 → roam_code-12.50}/src/roam/graph/clusters.py +0 -0
  291. {roam_code-12.47 → roam_code-12.50}/src/roam/graph/cycles.py +0 -0
  292. {roam_code-12.47 → roam_code-12.50}/src/roam/graph/dark_matter.py +0 -0
  293. {roam_code-12.47 → roam_code-12.50}/src/roam/graph/diff.py +0 -0
  294. {roam_code-12.47 → roam_code-12.50}/src/roam/graph/fingerprint.py +0 -0
  295. {roam_code-12.47 → roam_code-12.50}/src/roam/graph/layers.py +0 -0
  296. {roam_code-12.47 → roam_code-12.50}/src/roam/graph/pagerank.py +0 -0
  297. {roam_code-12.47 → roam_code-12.50}/src/roam/graph/partition.py +0 -0
  298. {roam_code-12.47 → roam_code-12.50}/src/roam/graph/pathfinding.py +0 -0
  299. {roam_code-12.47 → roam_code-12.50}/src/roam/graph/propagation.py +0 -0
  300. {roam_code-12.47 → roam_code-12.50}/src/roam/graph/simulate.py +0 -0
  301. {roam_code-12.47 → roam_code-12.50}/src/roam/graph/spectral.py +0 -0
  302. {roam_code-12.47 → roam_code-12.50}/src/roam/graph/stats.py +0 -0
  303. {roam_code-12.47 → roam_code-12.50}/src/roam/index/__init__.py +0 -0
  304. {roam_code-12.47 → roam_code-12.50}/src/roam/index/complexity.py +0 -0
  305. {roam_code-12.47 → roam_code-12.50}/src/roam/index/discovery.py +0 -0
  306. {roam_code-12.47 → roam_code-12.50}/src/roam/index/django_post.py +0 -0
  307. {roam_code-12.47 → roam_code-12.50}/src/roam/index/file_roles.py +0 -0
  308. {roam_code-12.47 → roam_code-12.50}/src/roam/index/git_stats.py +0 -0
  309. {roam_code-12.47 → roam_code-12.50}/src/roam/index/gitignore.py +0 -0
  310. {roam_code-12.47 → roam_code-12.50}/src/roam/index/incremental.py +0 -0
  311. {roam_code-12.47 → roam_code-12.50}/src/roam/index/indexer.py +0 -0
  312. {roam_code-12.47 → roam_code-12.50}/src/roam/index/parser.py +0 -0
  313. {roam_code-12.47 → roam_code-12.50}/src/roam/index/pytest_fixtures.py +0 -0
  314. {roam_code-12.47 → roam_code-12.50}/src/roam/index/registry_dispatch.py +0 -0
  315. {roam_code-12.47 → roam_code-12.50}/src/roam/index/relations.py +0 -0
  316. {roam_code-12.47 → roam_code-12.50}/src/roam/index/symbols.py +0 -0
  317. {roam_code-12.47 → roam_code-12.50}/src/roam/index/test_conventions.py +0 -0
  318. {roam_code-12.47 → roam_code-12.50}/src/roam/languages/__init__.py +0 -0
  319. {roam_code-12.47 → roam_code-12.50}/src/roam/languages/apex_lang.py +0 -0
  320. {roam_code-12.47 → roam_code-12.50}/src/roam/languages/aura_lang.py +0 -0
  321. {roam_code-12.47 → roam_code-12.50}/src/roam/languages/base.py +0 -0
  322. {roam_code-12.47 → roam_code-12.50}/src/roam/languages/c_lang.py +0 -0
  323. {roam_code-12.47 → roam_code-12.50}/src/roam/languages/csharp_lang.py +0 -0
  324. {roam_code-12.47 → roam_code-12.50}/src/roam/languages/dart_lang.py +0 -0
  325. {roam_code-12.47 → roam_code-12.50}/src/roam/languages/extractor_schema.py +0 -0
  326. {roam_code-12.47 → roam_code-12.50}/src/roam/languages/extractors/kotlin.yaml +0 -0
  327. {roam_code-12.47 → roam_code-12.50}/src/roam/languages/foxpro_lang.py +0 -0
  328. {roam_code-12.47 → roam_code-12.50}/src/roam/languages/generic_lang.py +0 -0
  329. {roam_code-12.47 → roam_code-12.50}/src/roam/languages/go_lang.py +0 -0
  330. {roam_code-12.47 → roam_code-12.50}/src/roam/languages/hcl_lang.py +0 -0
  331. {roam_code-12.47 → roam_code-12.50}/src/roam/languages/java_lang.py +0 -0
  332. {roam_code-12.47 → roam_code-12.50}/src/roam/languages/javascript_lang.py +0 -0
  333. {roam_code-12.47 → roam_code-12.50}/src/roam/languages/kotlin_lang.py +0 -0
  334. {roam_code-12.47 → roam_code-12.50}/src/roam/languages/php_lang.py +0 -0
  335. {roam_code-12.47 → roam_code-12.50}/src/roam/languages/python_lang.py +0 -0
  336. {roam_code-12.47 → roam_code-12.50}/src/roam/languages/query_engine.py +0 -0
  337. {roam_code-12.47 → roam_code-12.50}/src/roam/languages/registry.py +0 -0
  338. {roam_code-12.47 → roam_code-12.50}/src/roam/languages/ruby_lang.py +0 -0
  339. {roam_code-12.47 → roam_code-12.50}/src/roam/languages/rust_lang.py +0 -0
  340. {roam_code-12.47 → roam_code-12.50}/src/roam/languages/scala_lang.py +0 -0
  341. {roam_code-12.47 → roam_code-12.50}/src/roam/languages/sfxml_lang.py +0 -0
  342. {roam_code-12.47 → roam_code-12.50}/src/roam/languages/sql_lang.py +0 -0
  343. {roam_code-12.47 → roam_code-12.50}/src/roam/languages/swift_lang.py +0 -0
  344. {roam_code-12.47 → roam_code-12.50}/src/roam/languages/typescript_lang.py +0 -0
  345. {roam_code-12.47 → roam_code-12.50}/src/roam/languages/visualforce_lang.py +0 -0
  346. {roam_code-12.47 → roam_code-12.50}/src/roam/languages/yaml_lang.py +0 -0
  347. {roam_code-12.47 → roam_code-12.50}/src/roam/mcp_extras/__init__.py +0 -0
  348. {roam_code-12.47 → roam_code-12.50}/src/roam/mcp_extras/completions.py +0 -0
  349. {roam_code-12.47 → roam_code-12.50}/src/roam/mcp_extras/concurrency.py +0 -0
  350. {roam_code-12.47 → roam_code-12.50}/src/roam/mcp_extras/progress.py +0 -0
  351. {roam_code-12.47 → roam_code-12.50}/src/roam/mcp_extras/sampling.py +0 -0
  352. {roam_code-12.47 → roam_code-12.50}/src/roam/mcp_extras/session.py +0 -0
  353. {roam_code-12.47 → roam_code-12.50}/src/roam/mcp_extras/watcher.py +0 -0
  354. {roam_code-12.47 → roam_code-12.50}/src/roam/observability.py +0 -0
  355. {roam_code-12.47 → roam_code-12.50}/src/roam/output/__init__.py +0 -0
  356. {roam_code-12.47 → roam_code-12.50}/src/roam/output/confidence.py +0 -0
  357. {roam_code-12.47 → roam_code-12.50}/src/roam/output/errors.py +0 -0
  358. {roam_code-12.47 → roam_code-12.50}/src/roam/output/file_role_hints.py +0 -0
  359. {roam_code-12.47 → roam_code-12.50}/src/roam/output/framework_filter.py +0 -0
  360. {roam_code-12.47 → roam_code-12.50}/src/roam/output/mermaid.py +0 -0
  361. {roam_code-12.47 → roam_code-12.50}/src/roam/output/project_shape.py +0 -0
  362. {roam_code-12.47 → roam_code-12.50}/src/roam/output/schema_registry.py +0 -0
  363. {roam_code-12.47 → roam_code-12.50}/src/roam/plugins.py +0 -0
  364. {roam_code-12.47 → roam_code-12.50}/src/roam/refactor/__init__.py +0 -0
  365. {roam_code-12.47 → roam_code-12.50}/src/roam/refactor/codegen.py +0 -0
  366. {roam_code-12.47 → roam_code-12.50}/src/roam/refactor/transforms.py +0 -0
  367. {roam_code-12.47 → roam_code-12.50}/src/roam/retrieve/__init__.py +0 -0
  368. {roam_code-12.47 → roam_code-12.50}/src/roam/retrieve/learned_ranker.py +0 -0
  369. {roam_code-12.47 → roam_code-12.50}/src/roam/retrieve/pipeline.py +0 -0
  370. {roam_code-12.47 → roam_code-12.50}/src/roam/retrieve/rerank.py +0 -0
  371. {roam_code-12.47 → roam_code-12.50}/src/roam/retrieve/seeds.py +0 -0
  372. {roam_code-12.47 → roam_code-12.50}/src/roam/retrieve/semantic.py +0 -0
  373. {roam_code-12.47 → roam_code-12.50}/src/roam/rules/__init__.py +0 -0
  374. {roam_code-12.47 → roam_code-12.50}/src/roam/rules/ast_match.py +0 -0
  375. {roam_code-12.47 → roam_code-12.50}/src/roam/rules/builtin.py +0 -0
  376. {roam_code-12.47 → roam_code-12.50}/src/roam/rules/dataflow.py +0 -0
  377. {roam_code-12.47 → roam_code-12.50}/src/roam/rules/engine.py +0 -0
  378. {roam_code-12.47 → roam_code-12.50}/src/roam/runtime/__init__.py +0 -0
  379. {roam_code-12.47 → roam_code-12.50}/src/roam/runtime/graph_backend.py +0 -0
  380. {roam_code-12.47 → roam_code-12.50}/src/roam/runtime/hotspots.py +0 -0
  381. {roam_code-12.47 → roam_code-12.50}/src/roam/runtime/lockmgr.py +0 -0
  382. {roam_code-12.47 → roam_code-12.50}/src/roam/runtime/trace_ingest.py +0 -0
  383. {roam_code-12.47 → roam_code-12.50}/src/roam/search/__init__.py +0 -0
  384. {roam_code-12.47 → roam_code-12.50}/src/roam/search/framework_packs.py +0 -0
  385. {roam_code-12.47 → roam_code-12.50}/src/roam/search/index_embeddings.py +0 -0
  386. {roam_code-12.47 → roam_code-12.50}/src/roam/search/onnx_embeddings.py +0 -0
  387. {roam_code-12.47 → roam_code-12.50}/src/roam/search/tfidf.py +0 -0
  388. {roam_code-12.47 → roam_code-12.50}/src/roam/security/__init__.py +0 -0
  389. {roam_code-12.47 → roam_code-12.50}/src/roam/security/aibom_extension.py +0 -0
  390. {roam_code-12.47 → roam_code-12.50}/src/roam/security/taint_classifier.py +0 -0
  391. {roam_code-12.47 → roam_code-12.50}/src/roam/security/taint_engine.py +0 -0
  392. {roam_code-12.47 → roam_code-12.50}/src/roam/security/taint_rules/api_error_leak.yaml +0 -0
  393. {roam_code-12.47 → roam_code-12.50}/src/roam/security/taint_rules/java_fileupload_path_traversal.yaml +0 -0
  394. {roam_code-12.47 → roam_code-12.50}/src/roam/security/taint_rules/js_insecure_jwt_decode.yaml +0 -0
  395. {roam_code-12.47 → roam_code-12.50}/src/roam/security/taint_rules/js_localstorage_secrets.yaml +0 -0
  396. {roam_code-12.47 → roam_code-12.50}/src/roam/security/taint_rules/js_prototype_pollution.yaml +0 -0
  397. {roam_code-12.47 → roam_code-12.50}/src/roam/security/taint_rules/js_ssrf.yaml +0 -0
  398. {roam_code-12.47 → roam_code-12.50}/src/roam/security/taint_rules/js_xss.yaml +0 -0
  399. {roam_code-12.47 → roam_code-12.50}/src/roam/security/taint_rules/python_basic.yaml +0 -0
  400. {roam_code-12.47 → roam_code-12.50}/src/roam/security/taint_rules/python_deserialization.yaml +0 -0
  401. {roam_code-12.47 → roam_code-12.50}/src/roam/security/taint_rules/python_path_traversal.yaml +0 -0
  402. {roam_code-12.47 → roam_code-12.50}/src/roam/security/taint_rules/python_socketio_remote_source.yaml +0 -0
  403. {roam_code-12.47 → roam_code-12.50}/src/roam/security/taint_rules/python_sqli.yaml +0 -0
  404. {roam_code-12.47 → roam_code-12.50}/src/roam/security/taint_rules/python_urllib_open_redirect.yaml +0 -0
  405. {roam_code-12.47 → roam_code-12.50}/src/roam/security/taint_rules/vue_v_html.yaml +0 -0
  406. {roam_code-12.47 → roam_code-12.50}/src/roam/security/vuln_reach.py +0 -0
  407. {roam_code-12.47 → roam_code-12.50}/src/roam/security/vuln_store.py +0 -0
  408. {roam_code-12.47 → roam_code-12.50}/src/roam/surface_counts.py +0 -0
  409. {roam_code-12.47 → roam_code-12.50}/src/roam/telemetry.py +0 -0
  410. {roam_code-12.47 → roam_code-12.50}/src/roam/templates/__init__.py +0 -0
  411. {roam_code-12.47 → roam_code-12.50}/src/roam/templates/ci/Jenkinsfile +0 -0
  412. {roam_code-12.47 → roam_code-12.50}/src/roam/templates/ci/__init__.py +0 -0
  413. {roam_code-12.47 → roam_code-12.50}/src/roam/templates/ci/agent-review.yml +0 -0
  414. {roam_code-12.47 → roam_code-12.50}/src/roam/templates/ci/azure-pipelines.yml +0 -0
  415. {roam_code-12.47 → roam_code-12.50}/src/roam/templates/ci/bitbucket-pipelines.yml +0 -0
  416. {roam_code-12.47 → roam_code-12.50}/src/roam/templates/ci/gitlab-ci.yml +0 -0
  417. {roam_code-12.47 → roam_code-12.50}/src/roam/workspace/__init__.py +0 -0
  418. {roam_code-12.47 → roam_code-12.50}/src/roam/workspace/aggregator.py +0 -0
  419. {roam_code-12.47 → roam_code-12.50}/src/roam/workspace/api_scanner.py +0 -0
  420. {roam_code-12.47 → roam_code-12.50}/src/roam/workspace/config.py +0 -0
  421. {roam_code-12.47 → roam_code-12.50}/src/roam/workspace/db.py +0 -0
  422. {roam_code-12.47 → roam_code-12.50}/src/roam_code.egg-info/dependency_links.txt +0 -0
  423. {roam_code-12.47 → roam_code-12.50}/src/roam_code.egg-info/entry_points.txt +0 -0
  424. {roam_code-12.47 → roam_code-12.50}/src/roam_code.egg-info/requires.txt +0 -0
  425. {roam_code-12.47 → roam_code-12.50}/src/roam_code.egg-info/top_level.txt +0 -0
  426. {roam_code-12.47 → roam_code-12.50}/tests/test_adrs.py +0 -0
  427. {roam_code-12.47 → roam_code-12.50}/tests/test_adversarial.py +0 -0
  428. {roam_code-12.47 → roam_code-12.50}/tests/test_affected.py +0 -0
  429. {roam_code-12.47 → roam_code-12.50}/tests/test_agent_export.py +0 -0
  430. {roam_code-12.47 → roam_code-12.50}/tests/test_agent_mode.py +0 -0
  431. {roam_code-12.47 → roam_code-12.50}/tests/test_agent_plan_context.py +0 -0
  432. {roam_code-12.47 → roam_code-12.50}/tests/test_ai_ratio.py +0 -0
  433. {roam_code-12.47 → roam_code-12.50}/tests/test_ai_readiness.py +0 -0
  434. {roam_code-12.47 → roam_code-12.50}/tests/test_alerts_cmd.py +0 -0
  435. {roam_code-12.47 → roam_code-12.50}/tests/test_annotations.py +0 -0
  436. {roam_code-12.47 → roam_code-12.50}/tests/test_anomaly.py +0 -0
  437. {roam_code-12.47 → roam_code-12.50}/tests/test_api_changes.py +0 -0
  438. {roam_code-12.47 → roam_code-12.50}/tests/test_api_drift.py +0 -0
  439. {roam_code-12.47 → roam_code-12.50}/tests/test_attest.py +0 -0
  440. {roam_code-12.47 → roam_code-12.50}/tests/test_audit_trail_aggregate.py +0 -0
  441. {roam_code-12.47 → roam_code-12.50}/tests/test_audit_trail_conformance.py +0 -0
  442. {roam_code-12.47 → roam_code-12.50}/tests/test_audit_trail_sequence.py +0 -0
  443. {roam_code-12.47 → roam_code-12.50}/tests/test_audit_trail_verify.py +0 -0
  444. {roam_code-12.47 → roam_code-12.50}/tests/test_auth_gaps.py +0 -0
  445. {roam_code-12.47 → roam_code-12.50}/tests/test_backend_fixes_round2.py +0 -0
  446. {roam_code-12.47 → roam_code-12.50}/tests/test_backend_fixes_round3.py +0 -0
  447. {roam_code-12.47 → roam_code-12.50}/tests/test_basic.py +0 -0
  448. {roam_code-12.47 → roam_code-12.50}/tests/test_batch_mcp.py +0 -0
  449. {roam_code-12.47 → roam_code-12.50}/tests/test_bisect.py +0 -0
  450. {roam_code-12.47 → roam_code-12.50}/tests/test_bridge_django.py +0 -0
  451. {roam_code-12.47 → roam_code-12.50}/tests/test_bridges.py +0 -0
  452. {roam_code-12.47 → roam_code-12.50}/tests/test_bridges_extended.py +0 -0
  453. {roam_code-12.47 → roam_code-12.50}/tests/test_budget.py +0 -0
  454. {roam_code-12.47 → roam_code-12.50}/tests/test_budget_flag.py +0 -0
  455. {roam_code-12.47 → roam_code-12.50}/tests/test_budget_phase2.py +0 -0
  456. {roam_code-12.47 → roam_code-12.50}/tests/test_bus_factor.py +0 -0
  457. {roam_code-12.47 → roam_code-12.50}/tests/test_capability_registry.py +0 -0
  458. {roam_code-12.47 → roam_code-12.50}/tests/test_capsule.py +0 -0
  459. {roam_code-12.47 → roam_code-12.50}/tests/test_cga.py +0 -0
  460. {roam_code-12.47 → roam_code-12.50}/tests/test_check_rules.py +0 -0
  461. {roam_code-12.47 → roam_code-12.50}/tests/test_ci_gate_eval.py +0 -0
  462. {roam_code-12.47 → roam_code-12.50}/tests/test_ci_sarif_guard.py +0 -0
  463. {roam_code-12.47 → roam_code-12.50}/tests/test_ci_setup.py +0 -0
  464. {roam_code-12.47 → roam_code-12.50}/tests/test_clones.py +0 -0
  465. {roam_code-12.47 → roam_code-12.50}/tests/test_closure.py +0 -0
  466. {roam_code-12.47 → roam_code-12.50}/tests/test_codeowners.py +0 -0
  467. {roam_code-12.47 → roam_code-12.50}/tests/test_commands_architecture.py +0 -0
  468. {roam_code-12.47 → roam_code-12.50}/tests/test_commands_exploration.py +0 -0
  469. {roam_code-12.47 → roam_code-12.50}/tests/test_commands_health.py +0 -0
  470. {roam_code-12.47 → roam_code-12.50}/tests/test_commands_refactoring.py +0 -0
  471. {roam_code-12.47 → roam_code-12.50}/tests/test_commands_workflow.py +0 -0
  472. {roam_code-12.47 → roam_code-12.50}/tests/test_compare_cli.py +0 -0
  473. {roam_code-12.47 → roam_code-12.50}/tests/test_competitor_site_data.py +0 -0
  474. {roam_code-12.47 → roam_code-12.50}/tests/test_comprehensive.py +0 -0
  475. {roam_code-12.47 → roam_code-12.50}/tests/test_config.py +0 -0
  476. {roam_code-12.47 → roam_code-12.50}/tests/test_congestion.py +0 -0
  477. {roam_code-12.47 → roam_code-12.50}/tests/test_context_propagation.py +0 -0
  478. {roam_code-12.47 → roam_code-12.50}/tests/test_conventions_cmd.py +0 -0
  479. {roam_code-12.47 → roam_code-12.50}/tests/test_coverage_gaps_cmd.py +0 -0
  480. {roam_code-12.47 → roam_code-12.50}/tests/test_coverage_ingestion.py +0 -0
  481. {roam_code-12.47 → roam_code-12.50}/tests/test_cut.py +0 -0
  482. {roam_code-12.47 → roam_code-12.50}/tests/test_dark_matter.py +0 -0
  483. {roam_code-12.47 → roam_code-12.50}/tests/test_dark_matter_helpers.py +0 -0
  484. {roam_code-12.47 → roam_code-12.50}/tests/test_dashboard.py +0 -0
  485. {roam_code-12.47 → roam_code-12.50}/tests/test_dataflow_dead.py +0 -0
  486. {roam_code-12.47 → roam_code-12.50}/tests/test_dead_aging.py +0 -0
  487. {roam_code-12.47 → roam_code-12.50}/tests/test_defer_loading.py +0 -0
  488. {roam_code-12.47 → roam_code-12.50}/tests/test_demo_gif_asset.py +0 -0
  489. {roam_code-12.47 → roam_code-12.50}/tests/test_describe.py +0 -0
  490. {roam_code-12.47 → roam_code-12.50}/tests/test_detail_flag_hints.py +0 -0
  491. {roam_code-12.47 → roam_code-12.50}/tests/test_detector_precision.py +0 -0
  492. {roam_code-12.47 → roam_code-12.50}/tests/test_deterministic_output.py +0 -0
  493. {roam_code-12.47 → roam_code-12.50}/tests/test_dev_profile.py +0 -0
  494. {roam_code-12.47 → roam_code-12.50}/tests/test_difficulty_scoring.py +0 -0
  495. {roam_code-12.47 → roam_code-12.50}/tests/test_doc_staleness.py +0 -0
  496. {roam_code-12.47 → roam_code-12.50}/tests/test_docker_assets.py +0 -0
  497. {roam_code-12.47 → roam_code-12.50}/tests/test_docs_coverage.py +0 -0
  498. {roam_code-12.47 → roam_code-12.50}/tests/test_doctor.py +0 -0
  499. {roam_code-12.47 → roam_code-12.50}/tests/test_dogfood.py +0 -0
  500. {roam_code-12.47 → roam_code-12.50}/tests/test_drift.py +0 -0
  501. {roam_code-12.47 → roam_code-12.50}/tests/test_drift_by_team.py +0 -0
  502. {roam_code-12.47 → roam_code-12.50}/tests/test_duplicates.py +0 -0
  503. {roam_code-12.47 → roam_code-12.50}/tests/test_effects.py +0 -0
  504. {roam_code-12.47 → roam_code-12.50}/tests/test_effects_propagation.py +0 -0
  505. {roam_code-12.47 → roam_code-12.50}/tests/test_endpoints.py +0 -0
  506. {roam_code-12.47 → roam_code-12.50}/tests/test_entry_points_cmd.py +0 -0
  507. {roam_code-12.47 → roam_code-12.50}/tests/test_eval_retrieve.py +0 -0
  508. {roam_code-12.47 → roam_code-12.50}/tests/test_except_pass_narrow.py +0 -0
  509. {roam_code-12.47 → roam_code-12.50}/tests/test_exclude_patterns.py +0 -0
  510. {roam_code-12.47 → roam_code-12.50}/tests/test_exit_codes.py +0 -0
  511. {roam_code-12.47 → roam_code-12.50}/tests/test_extractor_grammar_drift.py +0 -0
  512. {roam_code-12.47 → roam_code-12.50}/tests/test_fallback_contracts.py +0 -0
  513. {roam_code-12.47 → roam_code-12.50}/tests/test_file_roles.py +0 -0
  514. {roam_code-12.47 → roam_code-12.50}/tests/test_finding_suppress.py +0 -0
  515. {roam_code-12.47 → roam_code-12.50}/tests/test_fingerprint.py +0 -0
  516. {roam_code-12.47 → roam_code-12.50}/tests/test_fixes.py +0 -0
  517. {roam_code-12.47 → roam_code-12.50}/tests/test_flag_dead.py +0 -0
  518. {roam_code-12.47 → roam_code-12.50}/tests/test_fleet.py +0 -0
  519. {roam_code-12.47 → roam_code-12.50}/tests/test_fn_coupling.py +0 -0
  520. {roam_code-12.47 → roam_code-12.50}/tests/test_forecast.py +0 -0
  521. {roam_code-12.47 → roam_code-12.50}/tests/test_formatters.py +0 -0
  522. {roam_code-12.47 → roam_code-12.50}/tests/test_foxpro.py +0 -0
  523. {roam_code-12.47 → roam_code-12.50}/tests/test_framework_detection.py +0 -0
  524. {roam_code-12.47 → roam_code-12.50}/tests/test_gate_presets.py +0 -0
  525. {roam_code-12.47 → roam_code-12.50}/tests/test_git_helpers.py +0 -0
  526. {roam_code-12.47 → roam_code-12.50}/tests/test_git_utils.py +0 -0
  527. {roam_code-12.47 → roam_code-12.50}/tests/test_guard.py +0 -0
  528. {roam_code-12.47 → roam_code-12.50}/tests/test_health_gate.py +0 -0
  529. {roam_code-12.47 → roam_code-12.50}/tests/test_hooks.py +0 -0
  530. {roam_code-12.47 → roam_code-12.50}/tests/test_hotspots.py +0 -0
  531. {roam_code-12.47 → roam_code-12.50}/tests/test_hover.py +0 -0
  532. {roam_code-12.47 → roam_code-12.50}/tests/test_index.py +0 -0
  533. {roam_code-12.47 → roam_code-12.50}/tests/test_index_bundle.py +0 -0
  534. {roam_code-12.47 → roam_code-12.50}/tests/test_init_cmd.py +0 -0
  535. {roam_code-12.47 → roam_code-12.50}/tests/test_install_check.py +0 -0
  536. {roam_code-12.47 → roam_code-12.50}/tests/test_intent.py +0 -0
  537. {roam_code-12.47 → roam_code-12.50}/tests/test_invariants.py +0 -0
  538. {roam_code-12.47 → roam_code-12.50}/tests/test_json_contracts.py +0 -0
  539. {roam_code-12.47 → roam_code-12.50}/tests/test_json_error_envelope.py +0 -0
  540. {roam_code-12.47 → roam_code-12.50}/tests/test_kotlin_swift_extractors.py +0 -0
  541. {roam_code-12.47 → roam_code-12.50}/tests/test_language_corpus.py +0 -0
  542. {roam_code-12.47 → roam_code-12.50}/tests/test_languages.py +0 -0
  543. {roam_code-12.47 → roam_code-12.50}/tests/test_laravel_fp_fixes.py +0 -0
  544. {roam_code-12.47 → roam_code-12.50}/tests/test_library_api.py +0 -0
  545. {roam_code-12.47 → roam_code-12.50}/tests/test_math_fp_fixes.py +0 -0
  546. {roam_code-12.47 → roam_code-12.50}/tests/test_math_tips.py +0 -0
  547. {roam_code-12.47 → roam_code-12.50}/tests/test_mcp_extras.py +0 -0
  548. {roam_code-12.47 → roam_code-12.50}/tests/test_mcp_server.py +0 -0
  549. {roam_code-12.47 → roam_code-12.50}/tests/test_mcp_setup.py +0 -0
  550. {roam_code-12.47 → roam_code-12.50}/tests/test_mermaid.py +0 -0
  551. {roam_code-12.47 → roam_code-12.50}/tests/test_metrics_cmd.py +0 -0
  552. {roam_code-12.47 → roam_code-12.50}/tests/test_metrics_push.py +0 -0
  553. {roam_code-12.47 → roam_code-12.50}/tests/test_migration_plan.py +0 -0
  554. {roam_code-12.47 → roam_code-12.50}/tests/test_migration_safety.py +0 -0
  555. {roam_code-12.47 → roam_code-12.50}/tests/test_minimap.py +0 -0
  556. {roam_code-12.47 → roam_code-12.50}/tests/test_missing_index.py +0 -0
  557. {roam_code-12.47 → roam_code-12.50}/tests/test_mutate.py +0 -0
  558. {roam_code-12.47 → roam_code-12.50}/tests/test_n1.py +0 -0
  559. {roam_code-12.47 → roam_code-12.50}/tests/test_next_steps.py +0 -0
  560. {roam_code-12.47 → roam_code-12.50}/tests/test_onboard.py +0 -0
  561. {roam_code-12.47 → roam_code-12.50}/tests/test_oracle.py +0 -0
  562. {roam_code-12.47 → roam_code-12.50}/tests/test_orchestrate.py +0 -0
  563. {roam_code-12.47 → roam_code-12.50}/tests/test_orphan_routes.py +0 -0
  564. {roam_code-12.47 → roam_code-12.50}/tests/test_oss_bench_harness.py +0 -0
  565. {roam_code-12.47 → roam_code-12.50}/tests/test_over_fetch.py +0 -0
  566. {roam_code-12.47 → roam_code-12.50}/tests/test_pagerank_truncation.py +0 -0
  567. {roam_code-12.47 → roam_code-12.50}/tests/test_partition.py +0 -0
  568. {roam_code-12.47 → roam_code-12.50}/tests/test_path_coverage.py +0 -0
  569. {roam_code-12.47 → roam_code-12.50}/tests/test_patterns_cmd.py +0 -0
  570. {roam_code-12.47 → roam_code-12.50}/tests/test_performance.py +0 -0
  571. {roam_code-12.47 → roam_code-12.50}/tests/test_personalized_pagerank.py +0 -0
  572. {roam_code-12.47 → roam_code-12.50}/tests/test_phase0_commands.py +0 -0
  573. {roam_code-12.47 → roam_code-12.50}/tests/test_plan.py +0 -0
  574. {roam_code-12.47 → roam_code-12.50}/tests/test_plugin_discovery.py +0 -0
  575. {roam_code-12.47 → roam_code-12.50}/tests/test_pr_analyze.py +0 -0
  576. {roam_code-12.47 → roam_code-12.50}/tests/test_pr_analyze_cache.py +0 -0
  577. {roam_code-12.47 → roam_code-12.50}/tests/test_pr_analyze_edge_cases.py +0 -0
  578. {roam_code-12.47 → roam_code-12.50}/tests/test_pr_analyze_helpers.py +0 -0
  579. {roam_code-12.47 → roam_code-12.50}/tests/test_pr_analyze_v2_signals.py +0 -0
  580. {roam_code-12.47 → roam_code-12.50}/tests/test_pr_comment_render.py +0 -0
  581. {roam_code-12.47 → roam_code-12.50}/tests/test_pr_comment_script.py +0 -0
  582. {roam_code-12.47 → roam_code-12.50}/tests/test_pr_diff.py +0 -0
  583. {roam_code-12.47 → roam_code-12.50}/tests/test_pr_risk_author.py +0 -0
  584. {roam_code-12.47 → roam_code-12.50}/tests/test_progress.py +0 -0
  585. {roam_code-12.47 → roam_code-12.50}/tests/test_progressive_disclosure.py +0 -0
  586. {roam_code-12.47 → roam_code-12.50}/tests/test_properties.py +0 -0
  587. {roam_code-12.47 → roam_code-12.50}/tests/test_pytest_fixtures.py +0 -0
  588. {roam_code-12.47 → roam_code-12.50}/tests/test_python_extractor_v2.py +0 -0
  589. {roam_code-12.47 → roam_code-12.50}/tests/test_python_idioms_e2e.py +0 -0
  590. {roam_code-12.47 → roam_code-12.50}/tests/test_python_pivot.py +0 -0
  591. {roam_code-12.47 → roam_code-12.50}/tests/test_readme_surface_consistency.py +0 -0
  592. {roam_code-12.47 → roam_code-12.50}/tests/test_realworld_feedback.py +0 -0
  593. {roam_code-12.47 → roam_code-12.50}/tests/test_refactoring_intelligence.py +0 -0
  594. {roam_code-12.47 → roam_code-12.50}/tests/test_registry_dispatch.py +0 -0
  595. {roam_code-12.47 → roam_code-12.50}/tests/test_regression_fp_corpus.py +0 -0
  596. {roam_code-12.47 → roam_code-12.50}/tests/test_relate.py +0 -0
  597. {roam_code-12.47 → roam_code-12.50}/tests/test_report.py +0 -0
  598. {roam_code-12.47 → roam_code-12.50}/tests/test_reset_clean.py +0 -0
  599. {roam_code-12.47 → roam_code-12.50}/tests/test_resolve.py +0 -0
  600. {roam_code-12.47 → roam_code-12.50}/tests/test_retrieve.py +0 -0
  601. {roam_code-12.47 → roam_code-12.50}/tests/test_retrieve_cross_repo.py +0 -0
  602. {roam_code-12.47 → roam_code-12.50}/tests/test_retrieve_seeds.py +0 -0
  603. {roam_code-12.47 → roam_code-12.50}/tests/test_risk.py +0 -0
  604. {roam_code-12.47 → roam_code-12.50}/tests/test_ruby.py +0 -0
  605. {roam_code-12.47 → roam_code-12.50}/tests/test_rule_profiles.py +0 -0
  606. {roam_code-12.47 → roam_code-12.50}/tests/test_rules.py +0 -0
  607. {roam_code-12.47 → roam_code-12.50}/tests/test_rules_ast_match.py +0 -0
  608. {roam_code-12.47 → roam_code-12.50}/tests/test_rules_community_pack.py +0 -0
  609. {roam_code-12.47 → roam_code-12.50}/tests/test_rules_dataflow.py +0 -0
  610. {roam_code-12.47 → roam_code-12.50}/tests/test_rules_symbol_requirements.py +0 -0
  611. {roam_code-12.47 → roam_code-12.50}/tests/test_rules_validate.py +0 -0
  612. {roam_code-12.47 → roam_code-12.50}/tests/test_runtime.py +0 -0
  613. {roam_code-12.47 → roam_code-12.50}/tests/test_runtime_score.py +0 -0
  614. {roam_code-12.47 → roam_code-12.50}/tests/test_salesforce.py +0 -0
  615. {roam_code-12.47 → roam_code-12.50}/tests/test_sarif_enrichment.py +0 -0
  616. {roam_code-12.47 → roam_code-12.50}/tests/test_sarif_flag.py +0 -0
  617. {roam_code-12.47 → roam_code-12.50}/tests/test_sbom.py +0 -0
  618. {roam_code-12.47 → roam_code-12.50}/tests/test_scala.py +0 -0
  619. {roam_code-12.47 → roam_code-12.50}/tests/test_schema_versioning.py +0 -0
  620. {roam_code-12.47 → roam_code-12.50}/tests/test_search_explain.py +0 -0
  621. {roam_code-12.47 → roam_code-12.50}/tests/test_secrets.py +0 -0
  622. {roam_code-12.47 → roam_code-12.50}/tests/test_secrets_v2.py +0 -0
  623. {roam_code-12.47 → roam_code-12.50}/tests/test_semantic_diff.py +0 -0
  624. {roam_code-12.47 → roam_code-12.50}/tests/test_semantic_onnx.py +0 -0
  625. {roam_code-12.47 → roam_code-12.50}/tests/test_semantic_search.py +0 -0
  626. {roam_code-12.47 → roam_code-12.50}/tests/test_simulate.py +0 -0
  627. {roam_code-12.47 → roam_code-12.50}/tests/test_simulate_departure.py +0 -0
  628. {roam_code-12.47 → roam_code-12.50}/tests/test_sketch.py +0 -0
  629. {roam_code-12.47 → roam_code-12.50}/tests/test_skill_generate.py +0 -0
  630. {roam_code-12.47 → roam_code-12.50}/tests/test_smells.py +0 -0
  631. {roam_code-12.47 → roam_code-12.50}/tests/test_smoke.py +0 -0
  632. {roam_code-12.47 → roam_code-12.50}/tests/test_sna_metrics.py +0 -0
  633. {roam_code-12.47 → roam_code-12.50}/tests/test_spectral.py +0 -0
  634. {roam_code-12.47 → roam_code-12.50}/tests/test_split_cmd.py +0 -0
  635. {roam_code-12.47 → roam_code-12.50}/tests/test_sql.py +0 -0
  636. {roam_code-12.47 → roam_code-12.50}/tests/test_suggest_reviewers.py +0 -0
  637. {roam_code-12.47 → roam_code-12.50}/tests/test_supply_chain.py +0 -0
  638. {roam_code-12.47 → roam_code-12.50}/tests/test_surface_counts.py +0 -0
  639. {roam_code-12.47 → roam_code-12.50}/tests/test_syntax_check.py +0 -0
  640. {roam_code-12.47 → roam_code-12.50}/tests/test_taint.py +0 -0
  641. {roam_code-12.47 → roam_code-12.50}/tests/test_taint_analysis.py +0 -0
  642. {roam_code-12.47 → roam_code-12.50}/tests/test_taint_classifier.py +0 -0
  643. {roam_code-12.47 → roam_code-12.50}/tests/test_taint_intraprocedural.py +0 -0
  644. {roam_code-12.47 → roam_code-12.50}/tests/test_test_conventions.py +0 -0
  645. {roam_code-12.47 → roam_code-12.50}/tests/test_test_gaps.py +0 -0
  646. {roam_code-12.47 → roam_code-12.50}/tests/test_test_scaffold.py +0 -0
  647. {roam_code-12.47 → roam_code-12.50}/tests/test_testmap.py +0 -0
  648. {roam_code-12.47 → roam_code-12.50}/tests/test_top_flag_consistency.py +0 -0
  649. {roam_code-12.47 → roam_code-12.50}/tests/test_tour_cmd.py +0 -0
  650. {roam_code-12.47 → roam_code-12.50}/tests/test_trends.py +0 -0
  651. {roam_code-12.47 → roam_code-12.50}/tests/test_trends_cohort.py +0 -0
  652. {roam_code-12.47 → roam_code-12.50}/tests/test_triage.py +0 -0
  653. {roam_code-12.47 → roam_code-12.50}/tests/test_uses_cmd.py +0 -0
  654. {roam_code-12.47 → roam_code-12.50}/tests/test_v1215_passes.py +0 -0
  655. {roam_code-12.47 → roam_code-12.50}/tests/test_v1216_passes.py +0 -0
  656. {roam_code-12.47 → roam_code-12.50}/tests/test_v1216_passes_41_50.py +0 -0
  657. {roam_code-12.47 → roam_code-12.50}/tests/test_v1216_passes_51_60.py +0 -0
  658. {roam_code-12.47 → roam_code-12.50}/tests/test_v1217_passes_61_80.py +0 -0
  659. {roam_code-12.47 → roam_code-12.50}/tests/test_v1218_passes_81_90.py +0 -0
  660. {roam_code-12.47 → roam_code-12.50}/tests/test_v1219_passes_91_100.py +0 -0
  661. {roam_code-12.47 → roam_code-12.50}/tests/test_v1220_passes_101_110.py +0 -0
  662. {roam_code-12.47 → roam_code-12.50}/tests/test_v1221_query_timeout.py +0 -0
  663. {roam_code-12.47 → roam_code-12.50}/tests/test_v1221_untested_commands.py +0 -0
  664. {roam_code-12.47 → roam_code-12.50}/tests/test_v12_2.py +0 -0
  665. {roam_code-12.47 → roam_code-12.50}/tests/test_v2_edge_cases.py +0 -0
  666. {roam_code-12.47 → roam_code-12.50}/tests/test_v2_integration.py +0 -0
  667. {roam_code-12.47 → roam_code-12.50}/tests/test_v6_features.py +0 -0
  668. {roam_code-12.47 → roam_code-12.50}/tests/test_v71_features.py +0 -0
  669. {roam_code-12.47 → roam_code-12.50}/tests/test_v7_features.py +0 -0
  670. {roam_code-12.47 → roam_code-12.50}/tests/test_v82_features.py +0 -0
  671. {roam_code-12.47 → roam_code-12.50}/tests/test_verify.py +0 -0
  672. {roam_code-12.47 → roam_code-12.50}/tests/test_verify_imports.py +0 -0
  673. {roam_code-12.47 → roam_code-12.50}/tests/test_vibe_check.py +0 -0
  674. {roam_code-12.47 → roam_code-12.50}/tests/test_visualize.py +0 -0
  675. {roam_code-12.47 → roam_code-12.50}/tests/test_vuln.py +0 -0
  676. {roam_code-12.47 → roam_code-12.50}/tests/test_vulns_cmd.py +0 -0
  677. {roam_code-12.47 → roam_code-12.50}/tests/test_watch.py +0 -0
  678. {roam_code-12.47 → roam_code-12.50}/tests/test_why.py +0 -0
  679. {roam_code-12.47 → roam_code-12.50}/tests/test_workspace.py +0 -0
  680. {roam_code-12.47 → roam_code-12.50}/tests/test_ws_resolve_fixes.py +0 -0
  681. {roam_code-12.47 → roam_code-12.50}/tests/test_xlang.py +0 -0
  682. {roam_code-12.47 → roam_code-12.50}/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.47
3
+ Version: 12.50
4
4
  Summary: Instant codebase comprehension for AI coding agents
5
5
  Author: Cranot
6
6
  License-Expression: Apache-2.0
@@ -66,9 +66,9 @@ Dynamic: license-file
66
66
 
67
67
  **Architectural sight for AI coding agents — before they edit.**
68
68
 
69
- 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 197 specialised commands are advanced surface for specialised workflows.
69
+ 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 200 specialised commands are advanced surface for specialised workflows.
70
70
 
71
- *202 commands · 136 MCP tools · 28 languages · 100% local · zero API keys*
71
+ *205 commands · 137 MCP tools · 28 languages · 100% local · zero API keys*
72
72
 
73
73
  [![PyPI version](https://img.shields.io/pypi/v/roam-code?style=flat-square&color=blue)](https://pypi.org/project/roam-code/)
74
74
  [![GitHub stars](https://img.shields.io/github/stars/Cranot/roam-code?style=flat-square)](https://github.com/Cranot/roam-code/stargazers)
@@ -80,6 +80,24 @@ A local code graph (SQLite + tree-sitter + git history) that gives any agent —
80
80
 
81
81
  ---
82
82
 
83
+ ### Killer use case: post-rename doc hygiene
84
+
85
+ ```bash
86
+ git mv docs/old-guide.md docs/new-guide.md
87
+ roam stale-refs --fix preview # see what auto-rewrites are safe
88
+ roam stale-refs --fix apply # rewrite README + CHANGELOG + everywhere
89
+ ```
90
+
91
+ `stale-refs` finds every dangling markdown link, HTML href, backtick path, and
92
+ broken `#anchor` across the repo, with confidence-tagged rename hints from git
93
+ history + basename match + LLM enrichment. Composable with `--gate` (CI),
94
+ `--diff` (branch-only), `--baseline-from` (acknowledged debt), `--watch` (live),
95
+ `--check-external` (HTTP validation), `--sarif` (Code Scanning), and a
96
+ companion `roam lsp` server for editor squiggles. See
97
+ [stale-refs in the command table](#commands).
98
+
99
+ ---
100
+
83
101
  ## What is Roam?
84
102
 
85
103
  Roam is a structural intelligence engine for software. It pre-indexes your codebase into a semantic graph -- symbols, dependencies, call graphs, architecture layers, git history, and runtime traces -- stored in a local SQLite DB. Agents query it via CLI or MCP instead of repeatedly grepping files and guessing structure.
@@ -162,7 +180,7 @@ $ roam diff # blast radius of uncommitted changes
162
180
  - **`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.
163
181
  - **`.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`.
164
182
  - **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).
165
- - **202 CLI commands, 136 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.
183
+ - **205 CLI commands, 137 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.
166
184
 
167
185
  ## What's New in v11
168
186
 
@@ -336,7 +354,7 @@ roam health
336
354
 
337
355
  ## Commands
338
356
 
339
- **Lead with the 5 verbs.** The [5 core commands](#core-commands) cover ~80% of agent workflows: `understand`, `context`, `retrieve`, `preflight`, `critique`. The remaining ~197 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 **202 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.
357
+ **Lead with the 5 verbs.** The [5 core commands](#core-commands) cover ~80% of agent workflows: `understand`, `context`, `retrieve`, `preflight`, `critique`. The remaining ~200 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 **205 commands organised into 7 categories** (plus 7 aliases for muscle memory: `algo` → `math`, `weather` → `churn`, `digest` / `snapshot` / `trend` → `trends`, `onboard` → `understand`, `refs` → `uses`), but you don't need to know that to start.
340
358
 
341
359
  <details>
342
360
  <summary><strong>Full command reference</strong></summary>
@@ -380,6 +398,7 @@ roam health
380
398
  | `roam pr-prep [<range>]` | One-shot pre-PR fitness check that bundles diff + critique + pr-risk into one envelope |
381
399
  | `roam pr-analyze [<range>] [--input F] [--rules F] [--gate]` | Agent-aware PR risk verdict: aggregates `pr-prep` with AI-likelihood scoring, `.roam/rules.yml` enforcement, and INTENTIONAL/SAFE/REVIEW/BLOCK mapping; CI gate via `--gate` (exit 5 on BLOCK); governance audit trail via `--audit-trail` |
382
400
  | `roam pr-comment-render --input F` | Render a markdown PR comment from a `pr-analyze` JSON envelope; styles: `github`, `gitlab`, `plain` |
401
+ | `roam pr-replay [<sha>] [--audit-trail]` | Replay a PR's analysis at a specific commit (or HEAD); useful for reproducing audit decisions and validating cache stability |
383
402
  | `roam metrics-push [--token T] [--anonymize] [--dry-run]` | Push metrics-only summary (no source-code bodies) from `roam audit` to a Roam Cloud endpoint; `--dry-run` prints the payload locally |
384
403
  | `roam audit-trail-verify [--input F] [--gate]` | Walk the EU AI Act audit-trail JSONL and verify SHA-256 chain integrity; exit 5 on broken chain |
385
404
  | `roam audit-trail-export [--format md\|json\|csv] [--since T] [--verdict V] [--aggregate]` | Export the audit trail for procurement / compliance review; `--aggregate` rolls up per actor / repo / verdict / month |
@@ -419,7 +438,7 @@ roam health
419
438
  | `roam retrieve <task> [--budget N] [--k N] [--seed-files PATH]` | Graph-aware context for free-form tasks: FTS5 + structural rerank (PageRank + clones) + token budget |
420
439
  | `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. |
421
440
  | `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. |
422
- | `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. |
441
+ | `roam ask <query> [--list] [--explain] [--recipe NAME]` | One-phrase intent classifier over a 25-recipe registry with phase, review-lens, gate, and follow-up metadata — composes preflight/retrieve/critique/fleet/understand/diagnose/trace/trends/hotspots/debt/taint/dead/coupling/stale-refs to cover the most common workflows. |
423
442
  | `roam workflow [RECIPE] [--list] [--query TEXT]` | Inspect a recipe DAG, review lenses, gates, rendered command arguments, and follow-up commands without running the workflow. |
424
443
  | `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). |
425
444
  | `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. |
@@ -595,7 +614,7 @@ src/
595
614
  formatter.py # to_json, json_envelope
596
615
  cli.py # cli, LazyGroup
597
616
  mcp_server.py
598
- tests/ (186 files)
617
+ tests/ (267 files)
599
618
  ` ` `
600
619
 
601
620
  **Key symbols** (PageRank): `open_db` · `ensure_index` · `json_envelope` · `to_json` · `LanguageExtractor`
@@ -664,6 +683,8 @@ The sentinel pair `<!-- roam:minimap -->` / `<!-- /roam:minimap -->` is replaced
664
683
  | `roam bus-factor [--brain-methods]` | Knowledge loss risk per module |
665
684
  | `roam doc-staleness` | Detect stale docstrings |
666
685
  | `roam docs-coverage` | Public-symbol doc coverage + stale docs + PageRank-ranked missing-doc hotlist |
686
+ | `roam stale-refs [--gate] [--diff REF] [--fix preview\|apply]` | Find dangling file references AND markdown anchor mismatches — confidence-tagged rename hints from git history / basename / symbol graph; HIGH-confidence auto-fix; branch-diff filter for CI; SARIF export. Index-free. |
687
+ | `roam lsp` | Minimal LSP server (JSON-RPC over stdio). Wire into VS Code / Neovim / JetBrains as a custom server to get squiggly underlines on dangling links and missing anchors as you type. |
667
688
  | `roam suggest-refactoring [--limit N] [--min-score N]` | Proactive refactoring recommendations ranked by complexity, coupling, churn, smells, coverage gaps, and debt |
668
689
  | `roam plan-refactor <symbol> [--operation auto\|extract\|move]` | Ordered refactor plan with blast radius, test gaps, layer risk, and simulation-based strategy preview |
669
690
  | `roam test-scaffold <name\|file> [--write] [--framework F]` | Generate test file/function/import skeletons from symbol data (pytest, jest, Go, JUnit, RSpec) |
@@ -988,7 +1009,7 @@ pip install "roam-code[mcp]"
988
1009
  roam mcp
989
1010
  ```
990
1011
 
991
- 136 tools, 10 resources, and 5 prompts are available in the full preset. Most tools are read-only index queries; side-effect tools are explicitly annotated.
1012
+ 137 tools, 10 resources, and 5 prompts are available in the full preset. Most tools are read-only index queries; side-effect tools are explicitly annotated.
992
1013
 
993
1014
  **MCP v2 highlights (v11):**
994
1015
  - In-process MCP execution (no subprocess shell-out per call)
@@ -1019,7 +1040,7 @@ ROAM_MCP_LITE=0 roam mcp
1019
1040
  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`.
1020
1041
 
1021
1042
  <details>
1022
- <summary><strong>MCP tool list (all 136)</strong></summary>
1043
+ <summary><strong>MCP tool list (all 137)</strong></summary>
1023
1044
 
1024
1045
  *New in v12.26: `roam_pr_analyze`, `roam_pr_comment_render`, `roam_metrics_push`, `roam_audit_trail_verify`, `roam_audit_trail_export`, `roam_audit_trail_conformance_check`, `roam_rules_validate`, `roam_dogfood` — Roam Review + Cloud engines + governance audit-trail toolkit + production-grade rules linting + one-shot v2 stack runner.*
1025
1046
 
@@ -1112,6 +1133,7 @@ Core preset tools: `roam_affected_tests`, `roam_batch_get`, `roam_batch_search`,
1112
1133
  | `roam_weather` | Code hotspots: churn x complexity ranking |
1113
1134
  | `roam_debt` | Hotspot-weighted technical debt prioritization with optional ROI estimate |
1114
1135
  | `roam_docs_coverage` | Doc coverage and stale-doc drift with PageRank-ranked missing docs |
1136
+ | `roam_stale_refs` | Find dangling file references — markdown links / HTML href-src / backtick paths whose target is missing |
1115
1137
  | `roam_suggest_refactoring` | Rank proactive refactoring candidates using complexity, coupling, churn, smells, and coverage gaps |
1116
1138
  | `roam_plan_refactor` | Build an ordered refactor plan for one symbol with risk/test/simulation context |
1117
1139
  | `roam_n1` | Detect N+1 I/O patterns in ORM code |
@@ -1618,11 +1640,11 @@ Each factor uses sigmoid health: `h = e^(-signal/scale)` (1 = pristine, approach
1618
1640
 
1619
1641
  roam-code is the only tool that combines graph algorithms (PageRank, Tarjan SCC, Louvain clustering), git archaeology, architecture simulation, and multi-agent partitioning in a single local CLI with zero API keys.
1620
1642
 
1621
- Documentation (local HTML in `docs/site/`, CI-deployed via `.github/workflows/pages.yml`):
1622
- - `docs/site/getting-started.html` — tutorial
1623
- - `docs/site/command-reference.html` — examples
1624
- - `docs/site/architecture.html` — diagram + internals
1625
- - `docs/site/landscape.html`competitor matrix
1643
+ Documentation lives at <https://roam-code.com/docs/>:
1644
+ - Tutorial — <https://roam-code.com/docs/getting-started>
1645
+ - Command reference — <https://roam-code.com/docs/command-reference>
1646
+ - Architecture guide — <https://roam-code.com/docs/architecture>
1647
+ - Integration tutorials <https://roam-code.com/docs/integration-tutorials>
1626
1648
 
1627
1649
  | Capability | roam-code | AI IDEs (Cursor, Windsurf) | AI Agents (Claude Code, Codex) | SAST (SonarQube, CodeQL) |
1628
1650
  |---|---|---|---|---|
@@ -1710,7 +1732,7 @@ Delete `.roam/` from your project root to clean up local data.
1710
1732
  git clone https://github.com/Cranot/roam-code.git
1711
1733
  cd roam-code
1712
1734
  pip install -e ".[dev]" # includes pytest, ruff
1713
- pytest tests/ # ~5500 tests, Python 3.9-3.13
1735
+ pytest tests/ # ~7,500 tests, Python 3.9-3.13
1714
1736
 
1715
1737
  # Or use Make targets:
1716
1738
  make dev # install with dev extras
@@ -1727,8 +1749,8 @@ roam-code/
1727
1749
  ├── action.yml # Reusable GitHub Action
1728
1750
  ├── src/roam/
1729
1751
  │ ├── __init__.py # Version (from pyproject.toml)
1730
- │ ├── cli.py # Click CLI (194 canonical + 7 aliases)
1731
- │ ├── mcp_server.py # MCP server (136 tools, 10 resources, 5 prompts)
1752
+ │ ├── cli.py # Click CLI (198 canonical + 7 aliases)
1753
+ │ ├── mcp_server.py # MCP server (137 tools, 10 resources, 5 prompts)
1732
1754
  │ ├── db/
1733
1755
  │ │ ├── connection.py # SQLite (WAL, pragmas, batched IN)
1734
1756
  │ │ ├── schema.py # Tables, indexes, migrations
@@ -1799,7 +1821,7 @@ roam-code/
1799
1821
  │ ├── formatter.py # Token-efficient formatting
1800
1822
  │ ├── sarif.py # SARIF 2.1.0 output
1801
1823
  │ └── schema_registry.py # JSON envelope schema versioning
1802
- └── tests/ # ~5500 tests across 186 test files
1824
+ └── tests/ # ~7,500 tests across 267 test files
1803
1825
  ```
1804
1826
 
1805
1827
  </details>
@@ -1822,7 +1844,7 @@ Optional: Local semantic ONNX stack (`numpy`, `onnxruntime`, `tokenizers`) via `
1822
1844
  ### Shipped
1823
1845
 
1824
1846
  - [x] MCP v2 agent surface: in-process execution, compound operations, presets, schemas, annotations, and compatibility profiles.
1825
- - [x] Full command and MCP inventory parity in docs: 197 canonical CLI commands and 136 MCP tools.
1847
+ - [x] Full command and MCP inventory parity in docs: 198 canonical CLI commands (205 with aliases) and 137 MCP tools.
1826
1848
  - [x] CI hardening: composite action, changed-only mode, trend-aware gates, sticky PR updater, and SARIF guardrails.
1827
1849
  - [x] Performance foundation: FTS5/BM25 search, O(changed) incremental indexing, DB/index optimizations.
1828
1850
  - [x] Agent governance suite: `vibe-check`, `ai-readiness`, `verify`, `ai-ratio`, `duplicates`, advanced `algo` scoring/SARIF.
@@ -1843,7 +1865,7 @@ Optional: Local semantic ONNX stack (`numpy`, `onnxruntime`, `tokenizers`) via `
1843
1865
  git clone https://github.com/Cranot/roam-code.git
1844
1866
  cd roam-code
1845
1867
  pip install -e .
1846
- pytest tests/ # all ~5500 tests must pass
1868
+ pytest tests/ # all ~7,500 tests must pass
1847
1869
  ```
1848
1870
 
1849
1871
  Good first contributions: add a [Tier 1 language](src/roam/languages/) (see `go_lang.py` or `php_lang.py` as templates), improve reference resolution, add benchmark repos, extend SARIF converters, add MCP tools.
@@ -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 197 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 200 specialised commands are advanced surface for specialised workflows.
8
8
 
9
- *202 commands · 136 MCP tools · 28 languages · 100% local · zero API keys*
9
+ *205 commands · 137 MCP tools · 28 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)
@@ -18,6 +18,24 @@ A local code graph (SQLite + tree-sitter + git history) that gives any agent —
18
18
 
19
19
  ---
20
20
 
21
+ ### Killer use case: post-rename doc hygiene
22
+
23
+ ```bash
24
+ git mv docs/old-guide.md docs/new-guide.md
25
+ roam stale-refs --fix preview # see what auto-rewrites are safe
26
+ roam stale-refs --fix apply # rewrite README + CHANGELOG + everywhere
27
+ ```
28
+
29
+ `stale-refs` finds every dangling markdown link, HTML href, backtick path, and
30
+ broken `#anchor` across the repo, with confidence-tagged rename hints from git
31
+ history + basename match + LLM enrichment. Composable with `--gate` (CI),
32
+ `--diff` (branch-only), `--baseline-from` (acknowledged debt), `--watch` (live),
33
+ `--check-external` (HTTP validation), `--sarif` (Code Scanning), and a
34
+ companion `roam lsp` server for editor squiggles. See
35
+ [stale-refs in the command table](#commands).
36
+
37
+ ---
38
+
21
39
  ## What is Roam?
22
40
 
23
41
  Roam is a structural intelligence engine for software. It pre-indexes your codebase into a semantic graph -- symbols, dependencies, call graphs, architecture layers, git history, and runtime traces -- stored in a local SQLite DB. Agents query it via CLI or MCP instead of repeatedly grepping files and guessing structure.
@@ -100,7 +118,7 @@ $ roam diff # blast radius of uncommitted changes
100
118
  - **`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.
101
119
  - **`.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`.
102
120
  - **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).
103
- - **202 CLI commands, 136 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.
121
+ - **205 CLI commands, 137 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.
104
122
 
105
123
  ## What's New in v11
106
124
 
@@ -274,7 +292,7 @@ roam health
274
292
 
275
293
  ## Commands
276
294
 
277
- **Lead with the 5 verbs.** The [5 core commands](#core-commands) cover ~80% of agent workflows: `understand`, `context`, `retrieve`, `preflight`, `critique`. The remaining ~197 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 **202 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.
295
+ **Lead with the 5 verbs.** The [5 core commands](#core-commands) cover ~80% of agent workflows: `understand`, `context`, `retrieve`, `preflight`, `critique`. The remaining ~200 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 **205 commands organised into 7 categories** (plus 7 aliases for muscle memory: `algo` → `math`, `weather` → `churn`, `digest` / `snapshot` / `trend` → `trends`, `onboard` → `understand`, `refs` → `uses`), but you don't need to know that to start.
278
296
 
279
297
  <details>
280
298
  <summary><strong>Full command reference</strong></summary>
@@ -318,6 +336,7 @@ roam health
318
336
  | `roam pr-prep [<range>]` | One-shot pre-PR fitness check that bundles diff + critique + pr-risk into one envelope |
319
337
  | `roam pr-analyze [<range>] [--input F] [--rules F] [--gate]` | Agent-aware PR risk verdict: aggregates `pr-prep` with AI-likelihood scoring, `.roam/rules.yml` enforcement, and INTENTIONAL/SAFE/REVIEW/BLOCK mapping; CI gate via `--gate` (exit 5 on BLOCK); governance audit trail via `--audit-trail` |
320
338
  | `roam pr-comment-render --input F` | Render a markdown PR comment from a `pr-analyze` JSON envelope; styles: `github`, `gitlab`, `plain` |
339
+ | `roam pr-replay [<sha>] [--audit-trail]` | Replay a PR's analysis at a specific commit (or HEAD); useful for reproducing audit decisions and validating cache stability |
321
340
  | `roam metrics-push [--token T] [--anonymize] [--dry-run]` | Push metrics-only summary (no source-code bodies) from `roam audit` to a Roam Cloud endpoint; `--dry-run` prints the payload locally |
322
341
  | `roam audit-trail-verify [--input F] [--gate]` | Walk the EU AI Act audit-trail JSONL and verify SHA-256 chain integrity; exit 5 on broken chain |
323
342
  | `roam audit-trail-export [--format md\|json\|csv] [--since T] [--verdict V] [--aggregate]` | Export the audit trail for procurement / compliance review; `--aggregate` rolls up per actor / repo / verdict / month |
@@ -357,7 +376,7 @@ roam health
357
376
  | `roam retrieve <task> [--budget N] [--k N] [--seed-files PATH]` | Graph-aware context for free-form tasks: FTS5 + structural rerank (PageRank + clones) + token budget |
358
377
  | `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. |
359
378
  | `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. |
360
- | `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. |
379
+ | `roam ask <query> [--list] [--explain] [--recipe NAME]` | One-phrase intent classifier over a 25-recipe registry with phase, review-lens, gate, and follow-up metadata — composes preflight/retrieve/critique/fleet/understand/diagnose/trace/trends/hotspots/debt/taint/dead/coupling/stale-refs to cover the most common workflows. |
361
380
  | `roam workflow [RECIPE] [--list] [--query TEXT]` | Inspect a recipe DAG, review lenses, gates, rendered command arguments, and follow-up commands without running the workflow. |
362
381
  | `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). |
363
382
  | `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. |
@@ -533,7 +552,7 @@ src/
533
552
  formatter.py # to_json, json_envelope
534
553
  cli.py # cli, LazyGroup
535
554
  mcp_server.py
536
- tests/ (186 files)
555
+ tests/ (267 files)
537
556
  ` ` `
538
557
 
539
558
  **Key symbols** (PageRank): `open_db` · `ensure_index` · `json_envelope` · `to_json` · `LanguageExtractor`
@@ -602,6 +621,8 @@ The sentinel pair `<!-- roam:minimap -->` / `<!-- /roam:minimap -->` is replaced
602
621
  | `roam bus-factor [--brain-methods]` | Knowledge loss risk per module |
603
622
  | `roam doc-staleness` | Detect stale docstrings |
604
623
  | `roam docs-coverage` | Public-symbol doc coverage + stale docs + PageRank-ranked missing-doc hotlist |
624
+ | `roam stale-refs [--gate] [--diff REF] [--fix preview\|apply]` | Find dangling file references AND markdown anchor mismatches — confidence-tagged rename hints from git history / basename / symbol graph; HIGH-confidence auto-fix; branch-diff filter for CI; SARIF export. Index-free. |
625
+ | `roam lsp` | Minimal LSP server (JSON-RPC over stdio). Wire into VS Code / Neovim / JetBrains as a custom server to get squiggly underlines on dangling links and missing anchors as you type. |
605
626
  | `roam suggest-refactoring [--limit N] [--min-score N]` | Proactive refactoring recommendations ranked by complexity, coupling, churn, smells, coverage gaps, and debt |
606
627
  | `roam plan-refactor <symbol> [--operation auto\|extract\|move]` | Ordered refactor plan with blast radius, test gaps, layer risk, and simulation-based strategy preview |
607
628
  | `roam test-scaffold <name\|file> [--write] [--framework F]` | Generate test file/function/import skeletons from symbol data (pytest, jest, Go, JUnit, RSpec) |
@@ -926,7 +947,7 @@ pip install "roam-code[mcp]"
926
947
  roam mcp
927
948
  ```
928
949
 
929
- 136 tools, 10 resources, and 5 prompts are available in the full preset. Most tools are read-only index queries; side-effect tools are explicitly annotated.
950
+ 137 tools, 10 resources, and 5 prompts are available in the full preset. Most tools are read-only index queries; side-effect tools are explicitly annotated.
930
951
 
931
952
  **MCP v2 highlights (v11):**
932
953
  - In-process MCP execution (no subprocess shell-out per call)
@@ -957,7 +978,7 @@ ROAM_MCP_LITE=0 roam mcp
957
978
  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`.
958
979
 
959
980
  <details>
960
- <summary><strong>MCP tool list (all 136)</strong></summary>
981
+ <summary><strong>MCP tool list (all 137)</strong></summary>
961
982
 
962
983
  *New in v12.26: `roam_pr_analyze`, `roam_pr_comment_render`, `roam_metrics_push`, `roam_audit_trail_verify`, `roam_audit_trail_export`, `roam_audit_trail_conformance_check`, `roam_rules_validate`, `roam_dogfood` — Roam Review + Cloud engines + governance audit-trail toolkit + production-grade rules linting + one-shot v2 stack runner.*
963
984
 
@@ -1050,6 +1071,7 @@ Core preset tools: `roam_affected_tests`, `roam_batch_get`, `roam_batch_search`,
1050
1071
  | `roam_weather` | Code hotspots: churn x complexity ranking |
1051
1072
  | `roam_debt` | Hotspot-weighted technical debt prioritization with optional ROI estimate |
1052
1073
  | `roam_docs_coverage` | Doc coverage and stale-doc drift with PageRank-ranked missing docs |
1074
+ | `roam_stale_refs` | Find dangling file references — markdown links / HTML href-src / backtick paths whose target is missing |
1053
1075
  | `roam_suggest_refactoring` | Rank proactive refactoring candidates using complexity, coupling, churn, smells, and coverage gaps |
1054
1076
  | `roam_plan_refactor` | Build an ordered refactor plan for one symbol with risk/test/simulation context |
1055
1077
  | `roam_n1` | Detect N+1 I/O patterns in ORM code |
@@ -1556,11 +1578,11 @@ Each factor uses sigmoid health: `h = e^(-signal/scale)` (1 = pristine, approach
1556
1578
 
1557
1579
  roam-code is the only tool that combines graph algorithms (PageRank, Tarjan SCC, Louvain clustering), git archaeology, architecture simulation, and multi-agent partitioning in a single local CLI with zero API keys.
1558
1580
 
1559
- Documentation (local HTML in `docs/site/`, CI-deployed via `.github/workflows/pages.yml`):
1560
- - `docs/site/getting-started.html` — tutorial
1561
- - `docs/site/command-reference.html` — examples
1562
- - `docs/site/architecture.html` — diagram + internals
1563
- - `docs/site/landscape.html`competitor matrix
1581
+ Documentation lives at <https://roam-code.com/docs/>:
1582
+ - Tutorial — <https://roam-code.com/docs/getting-started>
1583
+ - Command reference — <https://roam-code.com/docs/command-reference>
1584
+ - Architecture guide — <https://roam-code.com/docs/architecture>
1585
+ - Integration tutorials <https://roam-code.com/docs/integration-tutorials>
1564
1586
 
1565
1587
  | Capability | roam-code | AI IDEs (Cursor, Windsurf) | AI Agents (Claude Code, Codex) | SAST (SonarQube, CodeQL) |
1566
1588
  |---|---|---|---|---|
@@ -1648,7 +1670,7 @@ Delete `.roam/` from your project root to clean up local data.
1648
1670
  git clone https://github.com/Cranot/roam-code.git
1649
1671
  cd roam-code
1650
1672
  pip install -e ".[dev]" # includes pytest, ruff
1651
- pytest tests/ # ~5500 tests, Python 3.9-3.13
1673
+ pytest tests/ # ~7,500 tests, Python 3.9-3.13
1652
1674
 
1653
1675
  # Or use Make targets:
1654
1676
  make dev # install with dev extras
@@ -1665,8 +1687,8 @@ roam-code/
1665
1687
  ├── action.yml # Reusable GitHub Action
1666
1688
  ├── src/roam/
1667
1689
  │ ├── __init__.py # Version (from pyproject.toml)
1668
- │ ├── cli.py # Click CLI (194 canonical + 7 aliases)
1669
- │ ├── mcp_server.py # MCP server (136 tools, 10 resources, 5 prompts)
1690
+ │ ├── cli.py # Click CLI (198 canonical + 7 aliases)
1691
+ │ ├── mcp_server.py # MCP server (137 tools, 10 resources, 5 prompts)
1670
1692
  │ ├── db/
1671
1693
  │ │ ├── connection.py # SQLite (WAL, pragmas, batched IN)
1672
1694
  │ │ ├── schema.py # Tables, indexes, migrations
@@ -1737,7 +1759,7 @@ roam-code/
1737
1759
  │ ├── formatter.py # Token-efficient formatting
1738
1760
  │ ├── sarif.py # SARIF 2.1.0 output
1739
1761
  │ └── schema_registry.py # JSON envelope schema versioning
1740
- └── tests/ # ~5500 tests across 186 test files
1762
+ └── tests/ # ~7,500 tests across 267 test files
1741
1763
  ```
1742
1764
 
1743
1765
  </details>
@@ -1760,7 +1782,7 @@ Optional: Local semantic ONNX stack (`numpy`, `onnxruntime`, `tokenizers`) via `
1760
1782
  ### Shipped
1761
1783
 
1762
1784
  - [x] MCP v2 agent surface: in-process execution, compound operations, presets, schemas, annotations, and compatibility profiles.
1763
- - [x] Full command and MCP inventory parity in docs: 197 canonical CLI commands and 136 MCP tools.
1785
+ - [x] Full command and MCP inventory parity in docs: 198 canonical CLI commands (205 with aliases) and 137 MCP tools.
1764
1786
  - [x] CI hardening: composite action, changed-only mode, trend-aware gates, sticky PR updater, and SARIF guardrails.
1765
1787
  - [x] Performance foundation: FTS5/BM25 search, O(changed) incremental indexing, DB/index optimizations.
1766
1788
  - [x] Agent governance suite: `vibe-check`, `ai-readiness`, `verify`, `ai-ratio`, `duplicates`, advanced `algo` scoring/SARIF.
@@ -1781,7 +1803,7 @@ Optional: Local semantic ONNX stack (`numpy`, `onnxruntime`, `tokenizers`) via `
1781
1803
  git clone https://github.com/Cranot/roam-code.git
1782
1804
  cd roam-code
1783
1805
  pip install -e .
1784
- pytest tests/ # all ~5500 tests must pass
1806
+ pytest tests/ # all ~7,500 tests must pass
1785
1807
  ```
1786
1808
 
1787
1809
  Good first contributions: add a [Tier 1 language](src/roam/languages/) (see `go_lang.py` or `php_lang.py` as templates), improve reference resolution, add benchmark repos, extend SARIF converters, add MCP tools.
@@ -1,10 +1,14 @@
1
1
  [build-system]
2
- requires = ["setuptools>=68.0", "wheel"]
2
+ # setuptools >= 77 is required to emit the PEP 639 ``License-Expression``
3
+ # metadata field. The 12.47 wheel was built with an older setuptools and
4
+ # shipped to PyPI with empty license metadata (the ``Apache-2.0`` SPDX
5
+ # expression below got dropped).
6
+ requires = ["setuptools>=77.0", "wheel"]
3
7
  build-backend = "setuptools.build_meta"
4
8
 
5
9
  [project]
6
10
  name = "roam-code"
7
- version = "12.47"
11
+ version = "12.50"
8
12
  description = "Instant codebase comprehension for AI coding agents"
9
13
  readme = "README.md"
10
14
  requires-python = ">=3.9"
@@ -144,7 +144,7 @@ RECIPES: list[Recipe] = [
144
144
  ),
145
145
  phase="review",
146
146
  perspectives=("blast-radius", "clone-consistency", "intent-alignment"),
147
- followups=("roam rules --changed", "roam test-impact"),
147
+ followups=("roam rules --changed", "roam test-impact", "roam stale-refs (after rename-heavy diffs)"),
148
148
  gates=("Stop on high-severity critique findings", "Add or run impacted tests before merge"),
149
149
  ),
150
150
  Recipe(
@@ -641,6 +641,57 @@ RECIPES: list[Recipe] = [
641
641
  followups=("roam visualize --focus <symbol>", "roam fingerprint"),
642
642
  gates=("Diagrams complement reading the code, they don't replace it",),
643
643
  ),
644
+ Recipe(
645
+ name="find-broken-links",
646
+ intent="Find dangling file references — markdown links / HTML href-src / backtick paths whose target is missing",
647
+ examples=(
648
+ "find broken links",
649
+ "any dead doc links in this repo",
650
+ "check for stale file references",
651
+ "what docs point at deleted files",
652
+ "audit my readme for missing links",
653
+ "broken doc links after the rename",
654
+ ),
655
+ keywords=(
656
+ # NOTE: keyword bonus is substring-matched against the query
657
+ # (`"ref" in "refresh"` would over-match), so we keep tokens
658
+ # that are unlikely to appear inside unrelated words. Tokens
659
+ # like "ref" / "refs" / "link" are dropped for that reason —
660
+ # the longer forms below still pick up real intent.
661
+ "broken",
662
+ "dangling",
663
+ "stale",
664
+ "links",
665
+ "reference",
666
+ "references",
667
+ "dead link",
668
+ "dead links",
669
+ ),
670
+ commands=(("stale-refs", ()),),
671
+ summary=(
672
+ "Scans every text file in the repo, surfaces dangling markdown "
673
+ "links, HTML href/src, and backtick paths whose target no "
674
+ "longer exists. Includes basename-match rename hints. Pure "
675
+ "filesystem scan — no index needed."
676
+ ),
677
+ phase="audit",
678
+ perspectives=("doc-hygiene", "post-refactor-cleanup", "ci-gate"),
679
+ followups=(
680
+ "roam stale-refs --gate (CI gate, exit 5 on findings)",
681
+ "roam stale-refs --by-file (group by source doc)",
682
+ "roam stale-refs --watch (always-on terminal during refactor)",
683
+ "roam stale-refs --fix preview (auto-rewrite HIGH-confidence)",
684
+ "roam stale-refs --baseline-save b.json (freeze acknowledged debt)",
685
+ "roam stale-refs --check-external (validate http(s) URLs too)",
686
+ "roam lsp (squiggly underlines in your editor as you type)",
687
+ "roam doc-staleness (stale docstring content)",
688
+ "roam docs-coverage (missing public-symbol docs)",
689
+ ),
690
+ gates=(
691
+ "Use --gate in CI to block merges with broken doc references",
692
+ "Suppress historical mentions with --ignore CHANGELOG.md if needed",
693
+ ),
694
+ ),
644
695
  ]
645
696
 
646
697
 
@@ -19,7 +19,6 @@ v12.1 ships:
19
19
  * Embedded CycloneDX 1.7 + OpenVEX predicates
20
20
  * Reachability claims integrated with ``roam taint`` output
21
21
  * GitHub Artifact Attestations upload action
22
- * Multi-repo verification over Tailscale (deferred from MVP)
23
22
  """
24
23
 
25
24
  from __future__ import annotations
@@ -1680,7 +1680,7 @@ def list_framework_profiles() -> list[str]:
1680
1680
 
1681
1681
 
1682
1682
  def autodetect_framework_profile() -> str | None:
1683
- """ sniff package.json / composer.json for known stacks.
1683
+ """sniff package.json / composer.json for known stacks.
1684
1684
 
1685
1685
  Inspects ``package.json`` and ``composer.json`` from the project root
1686
1686
  (current working directory) for the dependency signals that map onto
@@ -14,7 +14,7 @@ import click
14
14
 
15
15
  # Lazy-loading command group: imports command modules only when invoked.
16
16
  # This avoids importing networkx (~500ms) on every CLI call.
17
- # Total: 158 invokable command names (155 canonical commands + 3 alias names).
17
+ # Total: 205 invokable command names (198 canonical commands + 7 alias names).
18
18
  # If this changes, update README.md, CLAUDE.md, llms-install.md, and docs copy.
19
19
  # deprecated commands map to their replacement. When a user
20
20
  # invokes a deprecated name, we still resolve it (no breaking change)
@@ -75,6 +75,8 @@ _COMMANDS = {
75
75
  "breaking": ("roam.commands.cmd_breaking", "breaking"),
76
76
  "safe-zones": ("roam.commands.cmd_safe_zones", "safe_zones"),
77
77
  "doc-staleness": ("roam.commands.cmd_doc_staleness", "doc_staleness"),
78
+ "stale-refs": ("roam.commands.cmd_stale_refs", "stale_refs"),
79
+ "lsp": ("roam.commands.cmd_lsp", "lsp"),
78
80
  "docs-coverage": ("roam.commands.cmd_docs_coverage", "docs_coverage"),
79
81
  "suggest-refactoring": ("roam.commands.cmd_suggest_refactoring", "suggest_refactoring"),
80
82
  "plan-refactor": ("roam.commands.cmd_plan_refactor", "plan_refactor"),
@@ -85,6 +87,7 @@ _COMMANDS = {
85
87
  "preflight": ("roam.commands.cmd_preflight", "preflight"),
86
88
  "permit": ("roam.commands.cmd_permit", "permit_cmd"),
87
89
  "postmortem": ("roam.commands.cmd_postmortem", "postmortem_cmd"),
90
+ "pr-replay": ("roam.commands.cmd_pr_replay", "pr_replay_cmd"),
88
91
  "article-12-check": ("roam.commands.cmd_article_12_check", "article_12_check_cmd"),
89
92
  "capabilities": ("roam.commands.cmd_capabilities", "capabilities_cmd"),
90
93
  "skill-generate": ("roam.commands.cmd_skill_generate", "skill_generate_cmd"),
@@ -282,6 +285,7 @@ _CATEGORIES = {
282
285
  "preflight",
283
286
  "permit",
284
287
  "postmortem",
288
+ "pr-replay",
285
289
  "guard",
286
290
  "agent-plan",
287
291
  "agent-context",
@@ -437,6 +441,7 @@ _CATEGORIES = {
437
441
  "fn-coupling",
438
442
  "doc-staleness",
439
443
  "docs-coverage",
444
+ "stale-refs",
440
445
  "suggest-refactoring",
441
446
  "plan-refactor",
442
447
  "conventions",
@@ -936,7 +941,7 @@ def _run_help_all(ctx: click.Context, param: click.Parameter, value: bool) -> No
936
941
  "--sarif",
937
942
  "sarif_mode",
938
943
  is_flag=True,
939
- help="Output in SARIF 2.1.0 format (for dead, health, complexity, rules, secrets, algo)",
944
+ help="Output in SARIF 2.1.0 format (for dead, health, complexity, rules, secrets, algo, stale-refs)",
940
945
  )
941
946
  @click.option("--budget", type=int, default=0, help="Max output tokens (0=unlimited)")
942
947
  @click.option(
@@ -86,6 +86,9 @@ def audit(ctx, brief) -> None:
86
86
  api = _capture(["api", "--limit", "0"])
87
87
  stats = _capture(["stats"])
88
88
  hotspots = _capture(["hotspots", "--danger"])
89
+ # Doc hygiene: dangling markdown links / hrefs / backticks / anchors.
90
+ # Capped at the default --limit so the audit envelope stays small.
91
+ stale_refs = _capture(["stale-refs"])
89
92
 
90
93
  # Top-level scores so consumers can branch fast.
91
94
  health_score = _summary_field(health, "health_score", "score")
@@ -97,6 +100,7 @@ def audit(ctx, brief) -> None:
97
100
  file_total = _summary_field(stats, "file_total", default=0)
98
101
  sym_total = _summary_field(stats, "symbol_total", default=0)
99
102
  coverage_pct = _summary_field(health, "imported_coverage_pct")
103
+ stale_ref_count = _summary_field(stale_refs, "stale_refs", "missing_targets", default=0)
100
104
 
101
105
  # Verdict — stack-rank the most pressing dimension.
102
106
  pressures = []
@@ -106,6 +110,11 @@ def audit(ctx, brief) -> None:
106
110
  pressures.append(f"{danger_count} danger-zone file(s)")
107
111
  if isinstance(coverage_pct, (int, float)) and coverage_pct < 40:
108
112
  pressures.append(f"coverage {coverage_pct:.0f}%")
113
+ # Stale refs cross from "noise" to "pressure" at 10 — one or two
114
+ # dangling links is a doc-hygiene paper cut, but a wave of them
115
+ # signals an undocumented rename and breaks AI agents downstream.
116
+ if isinstance(stale_ref_count, int) and stale_ref_count >= 10:
117
+ pressures.append(f"{stale_ref_count} stale doc ref(s)")
109
118
  if pressures:
110
119
  verdict = "AUDIT — pressures: " + ", ".join(pressures)
111
120
  else:
@@ -126,6 +135,7 @@ def audit(ctx, brief) -> None:
126
135
  "imported_coverage_pct": coverage_pct,
127
136
  "file_total": file_total,
128
137
  "symbol_total": sym_total,
138
+ "stale_ref_count": stale_ref_count,
129
139
  }
130
140
 
131
141
  sections = {
@@ -135,6 +145,7 @@ def audit(ctx, brief) -> None:
135
145
  "test_pyramid": test_pyramid if not brief else {"summary": test_pyramid.get("summary", {})},
136
146
  "hotspots_danger": hotspots if not brief else {"summary": hotspots.get("summary", {})},
137
147
  "stats": stats if not brief else {"summary": stats.get("summary", {})},
148
+ "stale_refs": stale_refs if not brief else {"summary": stale_refs.get("summary", {})},
138
149
  }
139
150
 
140
151
  if json_mode:
@@ -164,5 +175,6 @@ def audit(ctx, brief) -> None:
164
175
  ("imported coverage %", coverage_pct),
165
176
  ("total files", file_total),
166
177
  ("total symbols", sym_total),
178
+ ("stale doc refs", stale_ref_count),
167
179
  ]:
168
180
  click.echo(f"{label:<28} {value}")
@@ -106,7 +106,7 @@ def _populate_registry() -> None:
106
106
  """Import known capability-decorated command modules to populate the registry.
107
107
 
108
108
  Today this lists commands explicitly. Once the decorator has been
109
- applied to all 190 commands, this becomes a sweep of
109
+ applied to every command, this becomes a sweep of
110
110
  ``roam.commands.cmd_*``.
111
111
  """
112
112
  import importlib
@@ -611,9 +611,7 @@ def _no_mutating_options(
611
611
  @click.option("--show", is_flag=True, help="Print current configuration.")
612
612
  @click.option("--semantic-status", is_flag=True, help="Show semantic backend readiness and embedding coverage.")
613
613
  @click.option("--env", "env_inventory", is_flag=True, help="List every ROAM_* env var read by the codebase.")
614
- @click.option(
615
- "--check", "validate_check", is_flag=True, help="Validate .roam/config.json keys against known schema."
616
- )
614
+ @click.option("--check", "validate_check", is_flag=True, help="Validate .roam/config.json keys against known schema.")
617
615
  @click.option(
618
616
  "--weights",
619
617
  "show_weights",
@@ -391,7 +391,8 @@ def doc_staleness(ctx, limit, days, include_prose_drift):
391
391
 
392
392
  Unlike ``docs-coverage`` (which reports missing docs for exported public
393
393
  symbols, ranked by PageRank), this command focuses on existing docs that
394
- have gone stale.
394
+ have gone stale. Audits *what* the docs say. For *where* the docs point —
395
+ dangling links, missing files referenced by README — see ``stale-refs``.
395
396
  """
396
397
  json_mode = ctx.obj.get("json") if ctx.obj else False
397
398
  ensure_index()
@@ -167,7 +167,9 @@ def docs_coverage(ctx, limit, days, threshold, quality):
167
167
 
168
168
  Unlike ``doc-staleness`` (which scans ALL symbols including private
169
169
  ones for stale docstrings), this command focuses on the exported public
170
- API surface and prioritizes missing docs by symbol importance.
170
+ API surface and prioritizes missing docs by symbol importance. For
171
+ dangling file references (markdown links and backtick paths whose
172
+ target no longer exists), see ``stale-refs``.
171
173
  """
172
174
  json_mode = ctx.obj.get("json") if ctx.obj else False
173
175
  ensure_index()