roam-code 12.43__tar.gz → 12.45__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 (667) hide show
  1. {roam_code-12.43 → roam_code-12.45}/PKG-INFO +1 -1
  2. {roam_code-12.43 → roam_code-12.45}/pyproject.toml +1 -1
  3. {roam_code-12.43 → roam_code-12.45}/src/roam/capability.py +4 -12
  4. {roam_code-12.43 → roam_code-12.45}/src/roam/catalog/detectors.py +3 -1
  5. {roam_code-12.43 → roam_code-12.45}/src/roam/catalog/tasks.py +46 -0
  6. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_compare.py +44 -30
  7. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_skill_generate.py +67 -62
  8. {roam_code-12.43 → roam_code-12.45}/src/roam/competitor_site_data.py +1 -1
  9. {roam_code-12.43 → roam_code-12.45}/src/roam/mcp-server-card.json +1 -1
  10. {roam_code-12.43 → roam_code-12.45}/src/roam/output/sarif.py +18 -6
  11. {roam_code-12.43 → roam_code-12.45}/src/roam_code.egg-info/PKG-INFO +1 -1
  12. {roam_code-12.43 → roam_code-12.45}/tests/test_capability_registry.py +2 -0
  13. {roam_code-12.43 → roam_code-12.45}/tests/test_compare_cli.py +4 -0
  14. {roam_code-12.43 → roam_code-12.45}/tests/test_math.py +3 -1
  15. {roam_code-12.43 → roam_code-12.45}/tests/test_sarif_enrichment.py +23 -18
  16. {roam_code-12.43 → roam_code-12.45}/tests/test_skill_generate.py +1 -0
  17. {roam_code-12.43 → roam_code-12.45}/LICENSE +0 -0
  18. {roam_code-12.43 → roam_code-12.45}/README.md +0 -0
  19. {roam_code-12.43 → roam_code-12.45}/setup.cfg +0 -0
  20. {roam_code-12.43 → roam_code-12.45}/src/roam/__init__.py +0 -0
  21. {roam_code-12.43 → roam_code-12.45}/src/roam/__main__.py +0 -0
  22. {roam_code-12.43 → roam_code-12.45}/src/roam/analysis/__init__.py +0 -0
  23. {roam_code-12.43 → roam_code-12.45}/src/roam/analysis/effects.py +0 -0
  24. {roam_code-12.43 → roam_code-12.45}/src/roam/analysis/taint.py +0 -0
  25. {roam_code-12.43 → roam_code-12.45}/src/roam/api.py +0 -0
  26. {roam_code-12.43 → roam_code-12.45}/src/roam/ask/__init__.py +0 -0
  27. {roam_code-12.43 → roam_code-12.45}/src/roam/ask/classifier.py +0 -0
  28. {roam_code-12.43 → roam_code-12.45}/src/roam/ask/recipes.py +0 -0
  29. {roam_code-12.43 → roam_code-12.45}/src/roam/ask/runner.py +0 -0
  30. {roam_code-12.43 → roam_code-12.45}/src/roam/ask/workflow.py +0 -0
  31. {roam_code-12.43 → roam_code-12.45}/src/roam/attest/__init__.py +0 -0
  32. {roam_code-12.43 → roam_code-12.45}/src/roam/attest/cga.py +0 -0
  33. {roam_code-12.43 → roam_code-12.45}/src/roam/bridges/__init__.py +0 -0
  34. {roam_code-12.43 → roam_code-12.45}/src/roam/bridges/base.py +0 -0
  35. {roam_code-12.43 → roam_code-12.45}/src/roam/bridges/bridge_config.py +0 -0
  36. {roam_code-12.43 → roam_code-12.45}/src/roam/bridges/bridge_django.py +0 -0
  37. {roam_code-12.43 → roam_code-12.45}/src/roam/bridges/bridge_protobuf.py +0 -0
  38. {roam_code-12.43 → roam_code-12.45}/src/roam/bridges/bridge_rest_api.py +0 -0
  39. {roam_code-12.43 → roam_code-12.45}/src/roam/bridges/bridge_salesforce.py +0 -0
  40. {roam_code-12.43 → roam_code-12.45}/src/roam/bridges/bridge_template.py +0 -0
  41. {roam_code-12.43 → roam_code-12.45}/src/roam/bridges/registry.py +0 -0
  42. {roam_code-12.43 → roam_code-12.45}/src/roam/catalog/__init__.py +0 -0
  43. {roam_code-12.43 → roam_code-12.45}/src/roam/catalog/fixes.py +0 -0
  44. {roam_code-12.43 → roam_code-12.45}/src/roam/catalog/python_idioms.py +0 -0
  45. {roam_code-12.43 → roam_code-12.45}/src/roam/catalog/smells.py +0 -0
  46. {roam_code-12.43 → roam_code-12.45}/src/roam/cli.py +0 -0
  47. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/__init__.py +0 -0
  48. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/audit_trail_helpers.py +0 -0
  49. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/changed_files.py +0 -0
  50. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_adrs.py +0 -0
  51. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_adversarial.py +0 -0
  52. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_affected.py +0 -0
  53. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_affected_tests.py +0 -0
  54. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_agent_context.py +0 -0
  55. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_agent_export.py +0 -0
  56. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_agent_plan.py +0 -0
  57. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_ai_ratio.py +0 -0
  58. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_ai_readiness.py +0 -0
  59. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_alerts.py +0 -0
  60. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_annotate.py +0 -0
  61. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_api.py +0 -0
  62. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_api_changes.py +0 -0
  63. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_api_drift.py +0 -0
  64. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_article_12_check.py +0 -0
  65. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_ask.py +0 -0
  66. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_attest.py +0 -0
  67. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_audit.py +0 -0
  68. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_audit_trail_conformance.py +0 -0
  69. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_audit_trail_export.py +0 -0
  70. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_audit_trail_verify.py +0 -0
  71. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_auth_gaps.py +0 -0
  72. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_bisect.py +0 -0
  73. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_breaking.py +0 -0
  74. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_budget.py +0 -0
  75. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_bus_factor.py +0 -0
  76. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_capabilities.py +0 -0
  77. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_capsule.py +0 -0
  78. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_cga.py +0 -0
  79. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_changelog.py +0 -0
  80. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_check_rules.py +0 -0
  81. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_ci_setup.py +0 -0
  82. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_clean.py +0 -0
  83. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_clones.py +0 -0
  84. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_closure.py +0 -0
  85. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_clusters.py +0 -0
  86. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_codeowners.py +0 -0
  87. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_complexity.py +0 -0
  88. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_config.py +0 -0
  89. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_congestion.py +0 -0
  90. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_context.py +0 -0
  91. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_conventions.py +0 -0
  92. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_coupling.py +0 -0
  93. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_coverage_gaps.py +0 -0
  94. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_critique.py +0 -0
  95. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_cut.py +0 -0
  96. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_dark_matter.py +0 -0
  97. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_dashboard.py +0 -0
  98. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_dead.py +0 -0
  99. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_debt.py +0 -0
  100. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_deps.py +0 -0
  101. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_describe.py +0 -0
  102. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_dev_profile.py +0 -0
  103. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_diagnose.py +0 -0
  104. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_diff.py +0 -0
  105. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_disambiguate.py +0 -0
  106. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_doc_staleness.py +0 -0
  107. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_docs_coverage.py +0 -0
  108. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_doctor.py +0 -0
  109. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_dogfood.py +0 -0
  110. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_drift.py +0 -0
  111. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_duplicates.py +0 -0
  112. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_effects.py +0 -0
  113. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_endpoints.py +0 -0
  114. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_entry_points.py +0 -0
  115. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_eval_retrieve.py +0 -0
  116. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_exit_codes.py +0 -0
  117. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_fan.py +0 -0
  118. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_file.py +0 -0
  119. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_fingerprint.py +0 -0
  120. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_fitness.py +0 -0
  121. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_flag_dead.py +0 -0
  122. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_fleet.py +0 -0
  123. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_fn_coupling.py +0 -0
  124. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_forecast.py +0 -0
  125. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_graph_export.py +0 -0
  126. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_graph_stats.py +0 -0
  127. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_grep.py +0 -0
  128. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_guard.py +0 -0
  129. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_health.py +0 -0
  130. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_help_search.py +0 -0
  131. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_hooks.py +0 -0
  132. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_hotspots.py +0 -0
  133. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_hover.py +0 -0
  134. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_impact.py +0 -0
  135. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_index.py +0 -0
  136. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_index_bundle.py +0 -0
  137. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_index_stats.py +0 -0
  138. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_ingest_trace.py +0 -0
  139. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_init.py +0 -0
  140. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_intent.py +0 -0
  141. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_invariants.py +0 -0
  142. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_layers.py +0 -0
  143. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_map.py +0 -0
  144. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_math.py +0 -0
  145. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_mcp_setup.py +0 -0
  146. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_mcp_status.py +0 -0
  147. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_metrics.py +0 -0
  148. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_metrics_push.py +0 -0
  149. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_migration_safety.py +0 -0
  150. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_minimap.py +0 -0
  151. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_missing_index.py +0 -0
  152. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_module.py +0 -0
  153. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_mutate.py +0 -0
  154. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_n1.py +0 -0
  155. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_oracle.py +0 -0
  156. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_orchestrate.py +0 -0
  157. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_orphan_imports.py +0 -0
  158. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_orphan_routes.py +0 -0
  159. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_over_fetch.py +0 -0
  160. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_owner.py +0 -0
  161. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_partition.py +0 -0
  162. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_path_coverage.py +0 -0
  163. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_patterns.py +0 -0
  164. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_permit.py +0 -0
  165. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_plan.py +0 -0
  166. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_plan_refactor.py +0 -0
  167. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_plugins.py +0 -0
  168. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_postmortem.py +0 -0
  169. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_pr_analyze.py +0 -0
  170. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_pr_comment_render.py +0 -0
  171. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_pr_diff.py +0 -0
  172. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_pr_prep.py +0 -0
  173. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_pr_risk.py +0 -0
  174. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_pre_commit.py +0 -0
  175. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_preflight.py +0 -0
  176. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_py_modern.py +0 -0
  177. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_py_types.py +0 -0
  178. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_pytest_fixtures.py +0 -0
  179. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_recipes.py +0 -0
  180. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_recommend.py +0 -0
  181. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_relate.py +0 -0
  182. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_report.py +0 -0
  183. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_reset.py +0 -0
  184. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_retrieve.py +0 -0
  185. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_risk.py +0 -0
  186. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_rules.py +0 -0
  187. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_rules_validate.py +0 -0
  188. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_safe_delete.py +0 -0
  189. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_safe_zones.py +0 -0
  190. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_sbom.py +0 -0
  191. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_schema.py +0 -0
  192. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_search.py +0 -0
  193. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_search_semantic.py +0 -0
  194. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_secrets.py +0 -0
  195. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_semantic_diff.py +0 -0
  196. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_simulate.py +0 -0
  197. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_simulate_departure.py +0 -0
  198. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_sketch.py +0 -0
  199. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_smells.py +0 -0
  200. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_spectral.py +0 -0
  201. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_split.py +0 -0
  202. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_stats.py +0 -0
  203. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_suggest_refactoring.py +0 -0
  204. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_suggest_reviewers.py +0 -0
  205. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_supply_chain.py +0 -0
  206. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_suppress.py +0 -0
  207. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_symbol.py +0 -0
  208. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_syntax_check.py +0 -0
  209. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_taint.py +0 -0
  210. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_telemetry.py +0 -0
  211. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_test_gaps.py +0 -0
  212. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_test_impact.py +0 -0
  213. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_test_pyramid.py +0 -0
  214. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_test_scaffold.py +0 -0
  215. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_testmap.py +0 -0
  216. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_timeline.py +0 -0
  217. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_tour.py +0 -0
  218. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_trace.py +0 -0
  219. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_trends.py +0 -0
  220. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_triage.py +0 -0
  221. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_understand.py +0 -0
  222. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_uses.py +0 -0
  223. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_verify.py +0 -0
  224. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_verify_imports.py +0 -0
  225. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_version.py +0 -0
  226. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_vibe_check.py +0 -0
  227. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_visualize.py +0 -0
  228. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_vuln_map.py +0 -0
  229. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_vuln_reach.py +0 -0
  230. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_vulns.py +0 -0
  231. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_watch.py +0 -0
  232. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_weather.py +0 -0
  233. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_why.py +0 -0
  234. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_why_fail.py +0 -0
  235. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_workflow.py +0 -0
  236. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_ws.py +0 -0
  237. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/cmd_xlang.py +0 -0
  238. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/codeowners_helpers.py +0 -0
  239. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/context_helpers.py +0 -0
  240. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/finding_suppress.py +0 -0
  241. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/gate_presets.py +0 -0
  242. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/git_helpers.py +0 -0
  243. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/graph_helpers.py +0 -0
  244. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/metrics_history.py +0 -0
  245. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/next_steps.py +0 -0
  246. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/pr_analyze/__init__.py +0 -0
  247. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/pr_analyze/audit_trail.py +0 -0
  248. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/pr_analyze/cache.py +0 -0
  249. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/pr_analyze/rules.py +0 -0
  250. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/resolve.py +0 -0
  251. {roam_code-12.43 → roam_code-12.45}/src/roam/commands/suppression.py +0 -0
  252. {roam_code-12.43 → roam_code-12.45}/src/roam/config.py +0 -0
  253. {roam_code-12.43 → roam_code-12.45}/src/roam/coverage_reports.py +0 -0
  254. {roam_code-12.43 → roam_code-12.45}/src/roam/critique/__init__.py +0 -0
  255. {roam_code-12.43 → roam_code-12.45}/src/roam/critique/aggregator.py +0 -0
  256. {roam_code-12.43 → roam_code-12.45}/src/roam/critique/checks.py +0 -0
  257. {roam_code-12.43 → roam_code-12.45}/src/roam/db/__init__.py +0 -0
  258. {roam_code-12.43 → roam_code-12.45}/src/roam/db/connection.py +0 -0
  259. {roam_code-12.43 → roam_code-12.45}/src/roam/db/queries.py +0 -0
  260. {roam_code-12.43 → roam_code-12.45}/src/roam/db/schema.py +0 -0
  261. {roam_code-12.43 → roam_code-12.45}/src/roam/eval/__init__.py +0 -0
  262. {roam_code-12.43 → roam_code-12.45}/src/roam/eval/harness.py +0 -0
  263. {roam_code-12.43 → roam_code-12.45}/src/roam/exit_codes.py +0 -0
  264. {roam_code-12.43 → roam_code-12.45}/src/roam/fleet/__init__.py +0 -0
  265. {roam_code-12.43 → roam_code-12.45}/src/roam/fleet/adapters.py +0 -0
  266. {roam_code-12.43 → roam_code-12.45}/src/roam/fleet/manifest.py +0 -0
  267. {roam_code-12.43 → roam_code-12.45}/src/roam/git_utils.py +0 -0
  268. {roam_code-12.43 → roam_code-12.45}/src/roam/graph/__init__.py +0 -0
  269. {roam_code-12.43 → roam_code-12.45}/src/roam/graph/anomaly.py +0 -0
  270. {roam_code-12.43 → roam_code-12.45}/src/roam/graph/builder.py +0 -0
  271. {roam_code-12.43 → roam_code-12.45}/src/roam/graph/clone_detect.py +0 -0
  272. {roam_code-12.43 → roam_code-12.45}/src/roam/graph/clusters.py +0 -0
  273. {roam_code-12.43 → roam_code-12.45}/src/roam/graph/cycles.py +0 -0
  274. {roam_code-12.43 → roam_code-12.45}/src/roam/graph/dark_matter.py +0 -0
  275. {roam_code-12.43 → roam_code-12.45}/src/roam/graph/diff.py +0 -0
  276. {roam_code-12.43 → roam_code-12.45}/src/roam/graph/fingerprint.py +0 -0
  277. {roam_code-12.43 → roam_code-12.45}/src/roam/graph/layers.py +0 -0
  278. {roam_code-12.43 → roam_code-12.45}/src/roam/graph/pagerank.py +0 -0
  279. {roam_code-12.43 → roam_code-12.45}/src/roam/graph/partition.py +0 -0
  280. {roam_code-12.43 → roam_code-12.45}/src/roam/graph/pathfinding.py +0 -0
  281. {roam_code-12.43 → roam_code-12.45}/src/roam/graph/propagation.py +0 -0
  282. {roam_code-12.43 → roam_code-12.45}/src/roam/graph/simulate.py +0 -0
  283. {roam_code-12.43 → roam_code-12.45}/src/roam/graph/spectral.py +0 -0
  284. {roam_code-12.43 → roam_code-12.45}/src/roam/graph/stats.py +0 -0
  285. {roam_code-12.43 → roam_code-12.45}/src/roam/index/__init__.py +0 -0
  286. {roam_code-12.43 → roam_code-12.45}/src/roam/index/complexity.py +0 -0
  287. {roam_code-12.43 → roam_code-12.45}/src/roam/index/discovery.py +0 -0
  288. {roam_code-12.43 → roam_code-12.45}/src/roam/index/django_post.py +0 -0
  289. {roam_code-12.43 → roam_code-12.45}/src/roam/index/file_roles.py +0 -0
  290. {roam_code-12.43 → roam_code-12.45}/src/roam/index/git_stats.py +0 -0
  291. {roam_code-12.43 → roam_code-12.45}/src/roam/index/gitignore.py +0 -0
  292. {roam_code-12.43 → roam_code-12.45}/src/roam/index/incremental.py +0 -0
  293. {roam_code-12.43 → roam_code-12.45}/src/roam/index/indexer.py +0 -0
  294. {roam_code-12.43 → roam_code-12.45}/src/roam/index/parser.py +0 -0
  295. {roam_code-12.43 → roam_code-12.45}/src/roam/index/pytest_fixtures.py +0 -0
  296. {roam_code-12.43 → roam_code-12.45}/src/roam/index/registry_dispatch.py +0 -0
  297. {roam_code-12.43 → roam_code-12.45}/src/roam/index/relations.py +0 -0
  298. {roam_code-12.43 → roam_code-12.45}/src/roam/index/symbols.py +0 -0
  299. {roam_code-12.43 → roam_code-12.45}/src/roam/index/test_conventions.py +0 -0
  300. {roam_code-12.43 → roam_code-12.45}/src/roam/languages/__init__.py +0 -0
  301. {roam_code-12.43 → roam_code-12.45}/src/roam/languages/apex_lang.py +0 -0
  302. {roam_code-12.43 → roam_code-12.45}/src/roam/languages/aura_lang.py +0 -0
  303. {roam_code-12.43 → roam_code-12.45}/src/roam/languages/base.py +0 -0
  304. {roam_code-12.43 → roam_code-12.45}/src/roam/languages/c_lang.py +0 -0
  305. {roam_code-12.43 → roam_code-12.45}/src/roam/languages/csharp_lang.py +0 -0
  306. {roam_code-12.43 → roam_code-12.45}/src/roam/languages/extractor_schema.py +0 -0
  307. {roam_code-12.43 → roam_code-12.45}/src/roam/languages/extractors/kotlin.yaml +0 -0
  308. {roam_code-12.43 → roam_code-12.45}/src/roam/languages/foxpro_lang.py +0 -0
  309. {roam_code-12.43 → roam_code-12.45}/src/roam/languages/generic_lang.py +0 -0
  310. {roam_code-12.43 → roam_code-12.45}/src/roam/languages/go_lang.py +0 -0
  311. {roam_code-12.43 → roam_code-12.45}/src/roam/languages/hcl_lang.py +0 -0
  312. {roam_code-12.43 → roam_code-12.45}/src/roam/languages/java_lang.py +0 -0
  313. {roam_code-12.43 → roam_code-12.45}/src/roam/languages/javascript_lang.py +0 -0
  314. {roam_code-12.43 → roam_code-12.45}/src/roam/languages/kotlin_lang.py +0 -0
  315. {roam_code-12.43 → roam_code-12.45}/src/roam/languages/php_lang.py +0 -0
  316. {roam_code-12.43 → roam_code-12.45}/src/roam/languages/python_lang.py +0 -0
  317. {roam_code-12.43 → roam_code-12.45}/src/roam/languages/query_engine.py +0 -0
  318. {roam_code-12.43 → roam_code-12.45}/src/roam/languages/registry.py +0 -0
  319. {roam_code-12.43 → roam_code-12.45}/src/roam/languages/ruby_lang.py +0 -0
  320. {roam_code-12.43 → roam_code-12.45}/src/roam/languages/rust_lang.py +0 -0
  321. {roam_code-12.43 → roam_code-12.45}/src/roam/languages/scala_lang.py +0 -0
  322. {roam_code-12.43 → roam_code-12.45}/src/roam/languages/sfxml_lang.py +0 -0
  323. {roam_code-12.43 → roam_code-12.45}/src/roam/languages/sql_lang.py +0 -0
  324. {roam_code-12.43 → roam_code-12.45}/src/roam/languages/swift_lang.py +0 -0
  325. {roam_code-12.43 → roam_code-12.45}/src/roam/languages/typescript_lang.py +0 -0
  326. {roam_code-12.43 → roam_code-12.45}/src/roam/languages/visualforce_lang.py +0 -0
  327. {roam_code-12.43 → roam_code-12.45}/src/roam/languages/yaml_lang.py +0 -0
  328. {roam_code-12.43 → roam_code-12.45}/src/roam/mcp_extras/__init__.py +0 -0
  329. {roam_code-12.43 → roam_code-12.45}/src/roam/mcp_extras/completions.py +0 -0
  330. {roam_code-12.43 → roam_code-12.45}/src/roam/mcp_extras/concurrency.py +0 -0
  331. {roam_code-12.43 → roam_code-12.45}/src/roam/mcp_extras/progress.py +0 -0
  332. {roam_code-12.43 → roam_code-12.45}/src/roam/mcp_extras/sampling.py +0 -0
  333. {roam_code-12.43 → roam_code-12.45}/src/roam/mcp_extras/session.py +0 -0
  334. {roam_code-12.43 → roam_code-12.45}/src/roam/mcp_extras/watcher.py +0 -0
  335. {roam_code-12.43 → roam_code-12.45}/src/roam/mcp_server.py +0 -0
  336. {roam_code-12.43 → roam_code-12.45}/src/roam/observability.py +0 -0
  337. {roam_code-12.43 → roam_code-12.45}/src/roam/output/__init__.py +0 -0
  338. {roam_code-12.43 → roam_code-12.45}/src/roam/output/confidence.py +0 -0
  339. {roam_code-12.43 → roam_code-12.45}/src/roam/output/errors.py +0 -0
  340. {roam_code-12.43 → roam_code-12.45}/src/roam/output/file_role_hints.py +0 -0
  341. {roam_code-12.43 → roam_code-12.45}/src/roam/output/formatter.py +0 -0
  342. {roam_code-12.43 → roam_code-12.45}/src/roam/output/framework_filter.py +0 -0
  343. {roam_code-12.43 → roam_code-12.45}/src/roam/output/mermaid.py +0 -0
  344. {roam_code-12.43 → roam_code-12.45}/src/roam/output/project_shape.py +0 -0
  345. {roam_code-12.43 → roam_code-12.45}/src/roam/output/schema_registry.py +0 -0
  346. {roam_code-12.43 → roam_code-12.45}/src/roam/plugins.py +0 -0
  347. {roam_code-12.43 → roam_code-12.45}/src/roam/refactor/__init__.py +0 -0
  348. {roam_code-12.43 → roam_code-12.45}/src/roam/refactor/codegen.py +0 -0
  349. {roam_code-12.43 → roam_code-12.45}/src/roam/refactor/transforms.py +0 -0
  350. {roam_code-12.43 → roam_code-12.45}/src/roam/retrieve/__init__.py +0 -0
  351. {roam_code-12.43 → roam_code-12.45}/src/roam/retrieve/learned_ranker.py +0 -0
  352. {roam_code-12.43 → roam_code-12.45}/src/roam/retrieve/pipeline.py +0 -0
  353. {roam_code-12.43 → roam_code-12.45}/src/roam/retrieve/rerank.py +0 -0
  354. {roam_code-12.43 → roam_code-12.45}/src/roam/retrieve/seeds.py +0 -0
  355. {roam_code-12.43 → roam_code-12.45}/src/roam/retrieve/semantic.py +0 -0
  356. {roam_code-12.43 → roam_code-12.45}/src/roam/rules/__init__.py +0 -0
  357. {roam_code-12.43 → roam_code-12.45}/src/roam/rules/ast_match.py +0 -0
  358. {roam_code-12.43 → roam_code-12.45}/src/roam/rules/builtin.py +0 -0
  359. {roam_code-12.43 → roam_code-12.45}/src/roam/rules/dataflow.py +0 -0
  360. {roam_code-12.43 → roam_code-12.45}/src/roam/rules/engine.py +0 -0
  361. {roam_code-12.43 → roam_code-12.45}/src/roam/runtime/__init__.py +0 -0
  362. {roam_code-12.43 → roam_code-12.45}/src/roam/runtime/daemon.py +0 -0
  363. {roam_code-12.43 → roam_code-12.45}/src/roam/runtime/graph_backend.py +0 -0
  364. {roam_code-12.43 → roam_code-12.45}/src/roam/runtime/hotspots.py +0 -0
  365. {roam_code-12.43 → roam_code-12.45}/src/roam/runtime/lock_modes.py +0 -0
  366. {roam_code-12.43 → roam_code-12.45}/src/roam/runtime/lockmgr.py +0 -0
  367. {roam_code-12.43 → roam_code-12.45}/src/roam/runtime/trace_ingest.py +0 -0
  368. {roam_code-12.43 → roam_code-12.45}/src/roam/search/__init__.py +0 -0
  369. {roam_code-12.43 → roam_code-12.45}/src/roam/search/framework_packs.py +0 -0
  370. {roam_code-12.43 → roam_code-12.45}/src/roam/search/index_embeddings.py +0 -0
  371. {roam_code-12.43 → roam_code-12.45}/src/roam/search/onnx_embeddings.py +0 -0
  372. {roam_code-12.43 → roam_code-12.45}/src/roam/search/tfidf.py +0 -0
  373. {roam_code-12.43 → roam_code-12.45}/src/roam/security/__init__.py +0 -0
  374. {roam_code-12.43 → roam_code-12.45}/src/roam/security/aibom_extension.py +0 -0
  375. {roam_code-12.43 → roam_code-12.45}/src/roam/security/taint_classifier.py +0 -0
  376. {roam_code-12.43 → roam_code-12.45}/src/roam/security/taint_engine.py +0 -0
  377. {roam_code-12.43 → roam_code-12.45}/src/roam/security/taint_rules/api_error_leak.yaml +0 -0
  378. {roam_code-12.43 → roam_code-12.45}/src/roam/security/taint_rules/java_fileupload_path_traversal.yaml +0 -0
  379. {roam_code-12.43 → roam_code-12.45}/src/roam/security/taint_rules/js_insecure_jwt_decode.yaml +0 -0
  380. {roam_code-12.43 → roam_code-12.45}/src/roam/security/taint_rules/js_localstorage_secrets.yaml +0 -0
  381. {roam_code-12.43 → roam_code-12.45}/src/roam/security/taint_rules/js_prototype_pollution.yaml +0 -0
  382. {roam_code-12.43 → roam_code-12.45}/src/roam/security/taint_rules/js_ssrf.yaml +0 -0
  383. {roam_code-12.43 → roam_code-12.45}/src/roam/security/taint_rules/js_xss.yaml +0 -0
  384. {roam_code-12.43 → roam_code-12.45}/src/roam/security/taint_rules/python_basic.yaml +0 -0
  385. {roam_code-12.43 → roam_code-12.45}/src/roam/security/taint_rules/python_deserialization.yaml +0 -0
  386. {roam_code-12.43 → roam_code-12.45}/src/roam/security/taint_rules/python_path_traversal.yaml +0 -0
  387. {roam_code-12.43 → roam_code-12.45}/src/roam/security/taint_rules/python_socketio_remote_source.yaml +0 -0
  388. {roam_code-12.43 → roam_code-12.45}/src/roam/security/taint_rules/python_sqli.yaml +0 -0
  389. {roam_code-12.43 → roam_code-12.45}/src/roam/security/taint_rules/python_urllib_open_redirect.yaml +0 -0
  390. {roam_code-12.43 → roam_code-12.45}/src/roam/security/taint_rules/vue_v_html.yaml +0 -0
  391. {roam_code-12.43 → roam_code-12.45}/src/roam/security/vuln_reach.py +0 -0
  392. {roam_code-12.43 → roam_code-12.45}/src/roam/security/vuln_store.py +0 -0
  393. {roam_code-12.43 → roam_code-12.45}/src/roam/surface_counts.py +0 -0
  394. {roam_code-12.43 → roam_code-12.45}/src/roam/telemetry.py +0 -0
  395. {roam_code-12.43 → roam_code-12.45}/src/roam/templates/__init__.py +0 -0
  396. {roam_code-12.43 → roam_code-12.45}/src/roam/templates/ci/Jenkinsfile +0 -0
  397. {roam_code-12.43 → roam_code-12.45}/src/roam/templates/ci/__init__.py +0 -0
  398. {roam_code-12.43 → roam_code-12.45}/src/roam/templates/ci/agent-review.yml +0 -0
  399. {roam_code-12.43 → roam_code-12.45}/src/roam/templates/ci/azure-pipelines.yml +0 -0
  400. {roam_code-12.43 → roam_code-12.45}/src/roam/templates/ci/bitbucket-pipelines.yml +0 -0
  401. {roam_code-12.43 → roam_code-12.45}/src/roam/templates/ci/gitlab-ci.yml +0 -0
  402. {roam_code-12.43 → roam_code-12.45}/src/roam/workspace/__init__.py +0 -0
  403. {roam_code-12.43 → roam_code-12.45}/src/roam/workspace/aggregator.py +0 -0
  404. {roam_code-12.43 → roam_code-12.45}/src/roam/workspace/api_scanner.py +0 -0
  405. {roam_code-12.43 → roam_code-12.45}/src/roam/workspace/config.py +0 -0
  406. {roam_code-12.43 → roam_code-12.45}/src/roam/workspace/db.py +0 -0
  407. {roam_code-12.43 → roam_code-12.45}/src/roam_code.egg-info/SOURCES.txt +0 -0
  408. {roam_code-12.43 → roam_code-12.45}/src/roam_code.egg-info/dependency_links.txt +0 -0
  409. {roam_code-12.43 → roam_code-12.45}/src/roam_code.egg-info/entry_points.txt +0 -0
  410. {roam_code-12.43 → roam_code-12.45}/src/roam_code.egg-info/requires.txt +0 -0
  411. {roam_code-12.43 → roam_code-12.45}/src/roam_code.egg-info/top_level.txt +0 -0
  412. {roam_code-12.43 → roam_code-12.45}/tests/test_adrs.py +0 -0
  413. {roam_code-12.43 → roam_code-12.45}/tests/test_adversarial.py +0 -0
  414. {roam_code-12.43 → roam_code-12.45}/tests/test_affected.py +0 -0
  415. {roam_code-12.43 → roam_code-12.45}/tests/test_agent_export.py +0 -0
  416. {roam_code-12.43 → roam_code-12.45}/tests/test_agent_mode.py +0 -0
  417. {roam_code-12.43 → roam_code-12.45}/tests/test_agent_plan_context.py +0 -0
  418. {roam_code-12.43 → roam_code-12.45}/tests/test_ai_ratio.py +0 -0
  419. {roam_code-12.43 → roam_code-12.45}/tests/test_ai_readiness.py +0 -0
  420. {roam_code-12.43 → roam_code-12.45}/tests/test_alerts_cmd.py +0 -0
  421. {roam_code-12.43 → roam_code-12.45}/tests/test_annotations.py +0 -0
  422. {roam_code-12.43 → roam_code-12.45}/tests/test_anomaly.py +0 -0
  423. {roam_code-12.43 → roam_code-12.45}/tests/test_api_changes.py +0 -0
  424. {roam_code-12.43 → roam_code-12.45}/tests/test_api_drift.py +0 -0
  425. {roam_code-12.43 → roam_code-12.45}/tests/test_ask.py +0 -0
  426. {roam_code-12.43 → roam_code-12.45}/tests/test_attest.py +0 -0
  427. {roam_code-12.43 → roam_code-12.45}/tests/test_audit_trail_aggregate.py +0 -0
  428. {roam_code-12.43 → roam_code-12.45}/tests/test_audit_trail_conformance.py +0 -0
  429. {roam_code-12.43 → roam_code-12.45}/tests/test_audit_trail_sequence.py +0 -0
  430. {roam_code-12.43 → roam_code-12.45}/tests/test_audit_trail_verify.py +0 -0
  431. {roam_code-12.43 → roam_code-12.45}/tests/test_auth_gaps.py +0 -0
  432. {roam_code-12.43 → roam_code-12.45}/tests/test_backend_fixes_round2.py +0 -0
  433. {roam_code-12.43 → roam_code-12.45}/tests/test_backend_fixes_round3.py +0 -0
  434. {roam_code-12.43 → roam_code-12.45}/tests/test_basic.py +0 -0
  435. {roam_code-12.43 → roam_code-12.45}/tests/test_batch_mcp.py +0 -0
  436. {roam_code-12.43 → roam_code-12.45}/tests/test_bisect.py +0 -0
  437. {roam_code-12.43 → roam_code-12.45}/tests/test_bridge_django.py +0 -0
  438. {roam_code-12.43 → roam_code-12.45}/tests/test_bridges.py +0 -0
  439. {roam_code-12.43 → roam_code-12.45}/tests/test_bridges_extended.py +0 -0
  440. {roam_code-12.43 → roam_code-12.45}/tests/test_budget.py +0 -0
  441. {roam_code-12.43 → roam_code-12.45}/tests/test_budget_flag.py +0 -0
  442. {roam_code-12.43 → roam_code-12.45}/tests/test_budget_phase2.py +0 -0
  443. {roam_code-12.43 → roam_code-12.45}/tests/test_bus_factor.py +0 -0
  444. {roam_code-12.43 → roam_code-12.45}/tests/test_capsule.py +0 -0
  445. {roam_code-12.43 → roam_code-12.45}/tests/test_cga.py +0 -0
  446. {roam_code-12.43 → roam_code-12.45}/tests/test_check_rules.py +0 -0
  447. {roam_code-12.43 → roam_code-12.45}/tests/test_ci_gate_eval.py +0 -0
  448. {roam_code-12.43 → roam_code-12.45}/tests/test_ci_sarif_guard.py +0 -0
  449. {roam_code-12.43 → roam_code-12.45}/tests/test_ci_setup.py +0 -0
  450. {roam_code-12.43 → roam_code-12.45}/tests/test_clones.py +0 -0
  451. {roam_code-12.43 → roam_code-12.45}/tests/test_closure.py +0 -0
  452. {roam_code-12.43 → roam_code-12.45}/tests/test_codeowners.py +0 -0
  453. {roam_code-12.43 → roam_code-12.45}/tests/test_commands_architecture.py +0 -0
  454. {roam_code-12.43 → roam_code-12.45}/tests/test_commands_exploration.py +0 -0
  455. {roam_code-12.43 → roam_code-12.45}/tests/test_commands_health.py +0 -0
  456. {roam_code-12.43 → roam_code-12.45}/tests/test_commands_refactoring.py +0 -0
  457. {roam_code-12.43 → roam_code-12.45}/tests/test_commands_workflow.py +0 -0
  458. {roam_code-12.43 → roam_code-12.45}/tests/test_competitor_site_data.py +0 -0
  459. {roam_code-12.43 → roam_code-12.45}/tests/test_comprehensive.py +0 -0
  460. {roam_code-12.43 → roam_code-12.45}/tests/test_config.py +0 -0
  461. {roam_code-12.43 → roam_code-12.45}/tests/test_congestion.py +0 -0
  462. {roam_code-12.43 → roam_code-12.45}/tests/test_context_propagation.py +0 -0
  463. {roam_code-12.43 → roam_code-12.45}/tests/test_conventions_cmd.py +0 -0
  464. {roam_code-12.43 → roam_code-12.45}/tests/test_coverage_gaps_cmd.py +0 -0
  465. {roam_code-12.43 → roam_code-12.45}/tests/test_coverage_ingestion.py +0 -0
  466. {roam_code-12.43 → roam_code-12.45}/tests/test_critique.py +0 -0
  467. {roam_code-12.43 → roam_code-12.45}/tests/test_cut.py +0 -0
  468. {roam_code-12.43 → roam_code-12.45}/tests/test_dark_matter.py +0 -0
  469. {roam_code-12.43 → roam_code-12.45}/tests/test_dark_matter_helpers.py +0 -0
  470. {roam_code-12.43 → roam_code-12.45}/tests/test_dashboard.py +0 -0
  471. {roam_code-12.43 → roam_code-12.45}/tests/test_dataflow_dead.py +0 -0
  472. {roam_code-12.43 → roam_code-12.45}/tests/test_dead_aging.py +0 -0
  473. {roam_code-12.43 → roam_code-12.45}/tests/test_defer_loading.py +0 -0
  474. {roam_code-12.43 → roam_code-12.45}/tests/test_demo_gif_asset.py +0 -0
  475. {roam_code-12.43 → roam_code-12.45}/tests/test_describe.py +0 -0
  476. {roam_code-12.43 → roam_code-12.45}/tests/test_detail_flag_hints.py +0 -0
  477. {roam_code-12.43 → roam_code-12.45}/tests/test_detector_precision.py +0 -0
  478. {roam_code-12.43 → roam_code-12.45}/tests/test_deterministic_output.py +0 -0
  479. {roam_code-12.43 → roam_code-12.45}/tests/test_dev_profile.py +0 -0
  480. {roam_code-12.43 → roam_code-12.45}/tests/test_difficulty_scoring.py +0 -0
  481. {roam_code-12.43 → roam_code-12.45}/tests/test_doc_consistency.py +0 -0
  482. {roam_code-12.43 → roam_code-12.45}/tests/test_doc_staleness.py +0 -0
  483. {roam_code-12.43 → roam_code-12.45}/tests/test_docker_assets.py +0 -0
  484. {roam_code-12.43 → roam_code-12.45}/tests/test_docs_coverage.py +0 -0
  485. {roam_code-12.43 → roam_code-12.45}/tests/test_docs_site_quality.py +0 -0
  486. {roam_code-12.43 → roam_code-12.45}/tests/test_doctor.py +0 -0
  487. {roam_code-12.43 → roam_code-12.45}/tests/test_dogfood.py +0 -0
  488. {roam_code-12.43 → roam_code-12.45}/tests/test_drift.py +0 -0
  489. {roam_code-12.43 → roam_code-12.45}/tests/test_drift_by_team.py +0 -0
  490. {roam_code-12.43 → roam_code-12.45}/tests/test_duplicates.py +0 -0
  491. {roam_code-12.43 → roam_code-12.45}/tests/test_effects.py +0 -0
  492. {roam_code-12.43 → roam_code-12.45}/tests/test_effects_propagation.py +0 -0
  493. {roam_code-12.43 → roam_code-12.45}/tests/test_endpoints.py +0 -0
  494. {roam_code-12.43 → roam_code-12.45}/tests/test_entry_points_cmd.py +0 -0
  495. {roam_code-12.43 → roam_code-12.45}/tests/test_eval_retrieve.py +0 -0
  496. {roam_code-12.43 → roam_code-12.45}/tests/test_except_pass_narrow.py +0 -0
  497. {roam_code-12.43 → roam_code-12.45}/tests/test_exclude_patterns.py +0 -0
  498. {roam_code-12.43 → roam_code-12.45}/tests/test_exit_codes.py +0 -0
  499. {roam_code-12.43 → roam_code-12.45}/tests/test_extractor_grammar_drift.py +0 -0
  500. {roam_code-12.43 → roam_code-12.45}/tests/test_fallback_contracts.py +0 -0
  501. {roam_code-12.43 → roam_code-12.45}/tests/test_file_roles.py +0 -0
  502. {roam_code-12.43 → roam_code-12.45}/tests/test_finding_suppress.py +0 -0
  503. {roam_code-12.43 → roam_code-12.45}/tests/test_fingerprint.py +0 -0
  504. {roam_code-12.43 → roam_code-12.45}/tests/test_fixes.py +0 -0
  505. {roam_code-12.43 → roam_code-12.45}/tests/test_flag_dead.py +0 -0
  506. {roam_code-12.43 → roam_code-12.45}/tests/test_fleet.py +0 -0
  507. {roam_code-12.43 → roam_code-12.45}/tests/test_fn_coupling.py +0 -0
  508. {roam_code-12.43 → roam_code-12.45}/tests/test_forecast.py +0 -0
  509. {roam_code-12.43 → roam_code-12.45}/tests/test_formatters.py +0 -0
  510. {roam_code-12.43 → roam_code-12.45}/tests/test_foxpro.py +0 -0
  511. {roam_code-12.43 → roam_code-12.45}/tests/test_framework_detection.py +0 -0
  512. {roam_code-12.43 → roam_code-12.45}/tests/test_gate_presets.py +0 -0
  513. {roam_code-12.43 → roam_code-12.45}/tests/test_git_helpers.py +0 -0
  514. {roam_code-12.43 → roam_code-12.45}/tests/test_git_utils.py +0 -0
  515. {roam_code-12.43 → roam_code-12.45}/tests/test_guard.py +0 -0
  516. {roam_code-12.43 → roam_code-12.45}/tests/test_health_gate.py +0 -0
  517. {roam_code-12.43 → roam_code-12.45}/tests/test_hooks.py +0 -0
  518. {roam_code-12.43 → roam_code-12.45}/tests/test_hotspots.py +0 -0
  519. {roam_code-12.43 → roam_code-12.45}/tests/test_hover.py +0 -0
  520. {roam_code-12.43 → roam_code-12.45}/tests/test_index.py +0 -0
  521. {roam_code-12.43 → roam_code-12.45}/tests/test_index_bundle.py +0 -0
  522. {roam_code-12.43 → roam_code-12.45}/tests/test_init_cmd.py +0 -0
  523. {roam_code-12.43 → roam_code-12.45}/tests/test_install_check.py +0 -0
  524. {roam_code-12.43 → roam_code-12.45}/tests/test_intent.py +0 -0
  525. {roam_code-12.43 → roam_code-12.45}/tests/test_invariants.py +0 -0
  526. {roam_code-12.43 → roam_code-12.45}/tests/test_json_contracts.py +0 -0
  527. {roam_code-12.43 → roam_code-12.45}/tests/test_json_error_envelope.py +0 -0
  528. {roam_code-12.43 → roam_code-12.45}/tests/test_kotlin_swift_extractors.py +0 -0
  529. {roam_code-12.43 → roam_code-12.45}/tests/test_language_corpus.py +0 -0
  530. {roam_code-12.43 → roam_code-12.45}/tests/test_languages.py +0 -0
  531. {roam_code-12.43 → roam_code-12.45}/tests/test_laravel_fp_fixes.py +0 -0
  532. {roam_code-12.43 → roam_code-12.45}/tests/test_library_api.py +0 -0
  533. {roam_code-12.43 → roam_code-12.45}/tests/test_math_fp_fixes.py +0 -0
  534. {roam_code-12.43 → roam_code-12.45}/tests/test_math_tips.py +0 -0
  535. {roam_code-12.43 → roam_code-12.45}/tests/test_mcp_extras.py +0 -0
  536. {roam_code-12.43 → roam_code-12.45}/tests/test_mcp_server.py +0 -0
  537. {roam_code-12.43 → roam_code-12.45}/tests/test_mcp_setup.py +0 -0
  538. {roam_code-12.43 → roam_code-12.45}/tests/test_mermaid.py +0 -0
  539. {roam_code-12.43 → roam_code-12.45}/tests/test_metrics_cmd.py +0 -0
  540. {roam_code-12.43 → roam_code-12.45}/tests/test_metrics_push.py +0 -0
  541. {roam_code-12.43 → roam_code-12.45}/tests/test_migration_safety.py +0 -0
  542. {roam_code-12.43 → roam_code-12.45}/tests/test_minimap.py +0 -0
  543. {roam_code-12.43 → roam_code-12.45}/tests/test_missing_index.py +0 -0
  544. {roam_code-12.43 → roam_code-12.45}/tests/test_mutate.py +0 -0
  545. {roam_code-12.43 → roam_code-12.45}/tests/test_n1.py +0 -0
  546. {roam_code-12.43 → roam_code-12.45}/tests/test_next_steps.py +0 -0
  547. {roam_code-12.43 → roam_code-12.45}/tests/test_onboard.py +0 -0
  548. {roam_code-12.43 → roam_code-12.45}/tests/test_oracle.py +0 -0
  549. {roam_code-12.43 → roam_code-12.45}/tests/test_orchestrate.py +0 -0
  550. {roam_code-12.43 → roam_code-12.45}/tests/test_orphan_routes.py +0 -0
  551. {roam_code-12.43 → roam_code-12.45}/tests/test_oss_bench_harness.py +0 -0
  552. {roam_code-12.43 → roam_code-12.45}/tests/test_over_fetch.py +0 -0
  553. {roam_code-12.43 → roam_code-12.45}/tests/test_pagerank_truncation.py +0 -0
  554. {roam_code-12.43 → roam_code-12.45}/tests/test_partition.py +0 -0
  555. {roam_code-12.43 → roam_code-12.45}/tests/test_path_coverage.py +0 -0
  556. {roam_code-12.43 → roam_code-12.45}/tests/test_patterns_cmd.py +0 -0
  557. {roam_code-12.43 → roam_code-12.45}/tests/test_performance.py +0 -0
  558. {roam_code-12.43 → roam_code-12.45}/tests/test_personalized_pagerank.py +0 -0
  559. {roam_code-12.43 → roam_code-12.45}/tests/test_pivot_phase0_commands.py +0 -0
  560. {roam_code-12.43 → roam_code-12.45}/tests/test_plan.py +0 -0
  561. {roam_code-12.43 → roam_code-12.45}/tests/test_plugin_discovery.py +0 -0
  562. {roam_code-12.43 → roam_code-12.45}/tests/test_pr_analyze.py +0 -0
  563. {roam_code-12.43 → roam_code-12.45}/tests/test_pr_analyze_cache.py +0 -0
  564. {roam_code-12.43 → roam_code-12.45}/tests/test_pr_analyze_edge_cases.py +0 -0
  565. {roam_code-12.43 → roam_code-12.45}/tests/test_pr_analyze_helpers.py +0 -0
  566. {roam_code-12.43 → roam_code-12.45}/tests/test_pr_analyze_v2_signals.py +0 -0
  567. {roam_code-12.43 → roam_code-12.45}/tests/test_pr_comment_render.py +0 -0
  568. {roam_code-12.43 → roam_code-12.45}/tests/test_pr_comment_script.py +0 -0
  569. {roam_code-12.43 → roam_code-12.45}/tests/test_pr_diff.py +0 -0
  570. {roam_code-12.43 → roam_code-12.45}/tests/test_pr_risk_author.py +0 -0
  571. {roam_code-12.43 → roam_code-12.45}/tests/test_progress.py +0 -0
  572. {roam_code-12.43 → roam_code-12.45}/tests/test_progressive_disclosure.py +0 -0
  573. {roam_code-12.43 → roam_code-12.45}/tests/test_properties.py +0 -0
  574. {roam_code-12.43 → roam_code-12.45}/tests/test_pytest_fixtures.py +0 -0
  575. {roam_code-12.43 → roam_code-12.45}/tests/test_python_extractor_v2.py +0 -0
  576. {roam_code-12.43 → roam_code-12.45}/tests/test_python_idioms_e2e.py +0 -0
  577. {roam_code-12.43 → roam_code-12.45}/tests/test_python_pivot.py +0 -0
  578. {roam_code-12.43 → roam_code-12.45}/tests/test_readme_surface_consistency.py +0 -0
  579. {roam_code-12.43 → roam_code-12.45}/tests/test_realworld_feedback.py +0 -0
  580. {roam_code-12.43 → roam_code-12.45}/tests/test_refactoring_intelligence.py +0 -0
  581. {roam_code-12.43 → roam_code-12.45}/tests/test_registry_dispatch.py +0 -0
  582. {roam_code-12.43 → roam_code-12.45}/tests/test_regression_fp_corpus.py +0 -0
  583. {roam_code-12.43 → roam_code-12.45}/tests/test_relate.py +0 -0
  584. {roam_code-12.43 → roam_code-12.45}/tests/test_report.py +0 -0
  585. {roam_code-12.43 → roam_code-12.45}/tests/test_reset_clean.py +0 -0
  586. {roam_code-12.43 → roam_code-12.45}/tests/test_resolve.py +0 -0
  587. {roam_code-12.43 → roam_code-12.45}/tests/test_retrieve.py +0 -0
  588. {roam_code-12.43 → roam_code-12.45}/tests/test_retrieve_cross_repo.py +0 -0
  589. {roam_code-12.43 → roam_code-12.45}/tests/test_retrieve_seeds.py +0 -0
  590. {roam_code-12.43 → roam_code-12.45}/tests/test_risk.py +0 -0
  591. {roam_code-12.43 → roam_code-12.45}/tests/test_ruby.py +0 -0
  592. {roam_code-12.43 → roam_code-12.45}/tests/test_rule_profiles.py +0 -0
  593. {roam_code-12.43 → roam_code-12.45}/tests/test_rules.py +0 -0
  594. {roam_code-12.43 → roam_code-12.45}/tests/test_rules_ast_match.py +0 -0
  595. {roam_code-12.43 → roam_code-12.45}/tests/test_rules_community_pack.py +0 -0
  596. {roam_code-12.43 → roam_code-12.45}/tests/test_rules_dataflow.py +0 -0
  597. {roam_code-12.43 → roam_code-12.45}/tests/test_rules_symbol_requirements.py +0 -0
  598. {roam_code-12.43 → roam_code-12.45}/tests/test_rules_validate.py +0 -0
  599. {roam_code-12.43 → roam_code-12.45}/tests/test_runtime.py +0 -0
  600. {roam_code-12.43 → roam_code-12.45}/tests/test_runtime_score.py +0 -0
  601. {roam_code-12.43 → roam_code-12.45}/tests/test_salesforce.py +0 -0
  602. {roam_code-12.43 → roam_code-12.45}/tests/test_sarif_flag.py +0 -0
  603. {roam_code-12.43 → roam_code-12.45}/tests/test_sbom.py +0 -0
  604. {roam_code-12.43 → roam_code-12.45}/tests/test_scala.py +0 -0
  605. {roam_code-12.43 → roam_code-12.45}/tests/test_schema_versioning.py +0 -0
  606. {roam_code-12.43 → roam_code-12.45}/tests/test_search_explain.py +0 -0
  607. {roam_code-12.43 → roam_code-12.45}/tests/test_secrets.py +0 -0
  608. {roam_code-12.43 → roam_code-12.45}/tests/test_secrets_v2.py +0 -0
  609. {roam_code-12.43 → roam_code-12.45}/tests/test_semantic_diff.py +0 -0
  610. {roam_code-12.43 → roam_code-12.45}/tests/test_semantic_onnx.py +0 -0
  611. {roam_code-12.43 → roam_code-12.45}/tests/test_semantic_search.py +0 -0
  612. {roam_code-12.43 → roam_code-12.45}/tests/test_simulate.py +0 -0
  613. {roam_code-12.43 → roam_code-12.45}/tests/test_simulate_departure.py +0 -0
  614. {roam_code-12.43 → roam_code-12.45}/tests/test_sketch.py +0 -0
  615. {roam_code-12.43 → roam_code-12.45}/tests/test_smells.py +0 -0
  616. {roam_code-12.43 → roam_code-12.45}/tests/test_smoke.py +0 -0
  617. {roam_code-12.43 → roam_code-12.45}/tests/test_sna_metrics.py +0 -0
  618. {roam_code-12.43 → roam_code-12.45}/tests/test_spectral.py +0 -0
  619. {roam_code-12.43 → roam_code-12.45}/tests/test_split_cmd.py +0 -0
  620. {roam_code-12.43 → roam_code-12.45}/tests/test_sql.py +0 -0
  621. {roam_code-12.43 → roam_code-12.45}/tests/test_suggest_reviewers.py +0 -0
  622. {roam_code-12.43 → roam_code-12.45}/tests/test_supply_chain.py +0 -0
  623. {roam_code-12.43 → roam_code-12.45}/tests/test_surface_counts.py +0 -0
  624. {roam_code-12.43 → roam_code-12.45}/tests/test_syntax_check.py +0 -0
  625. {roam_code-12.43 → roam_code-12.45}/tests/test_taint.py +0 -0
  626. {roam_code-12.43 → roam_code-12.45}/tests/test_taint_analysis.py +0 -0
  627. {roam_code-12.43 → roam_code-12.45}/tests/test_taint_classifier.py +0 -0
  628. {roam_code-12.43 → roam_code-12.45}/tests/test_taint_intraprocedural.py +0 -0
  629. {roam_code-12.43 → roam_code-12.45}/tests/test_test_conventions.py +0 -0
  630. {roam_code-12.43 → roam_code-12.45}/tests/test_test_gaps.py +0 -0
  631. {roam_code-12.43 → roam_code-12.45}/tests/test_test_scaffold.py +0 -0
  632. {roam_code-12.43 → roam_code-12.45}/tests/test_testmap.py +0 -0
  633. {roam_code-12.43 → roam_code-12.45}/tests/test_top_flag_consistency.py +0 -0
  634. {roam_code-12.43 → roam_code-12.45}/tests/test_tour_cmd.py +0 -0
  635. {roam_code-12.43 → roam_code-12.45}/tests/test_trends.py +0 -0
  636. {roam_code-12.43 → roam_code-12.45}/tests/test_trends_cohort.py +0 -0
  637. {roam_code-12.43 → roam_code-12.45}/tests/test_triage.py +0 -0
  638. {roam_code-12.43 → roam_code-12.45}/tests/test_uses_cmd.py +0 -0
  639. {roam_code-12.43 → roam_code-12.45}/tests/test_v1215_passes.py +0 -0
  640. {roam_code-12.43 → roam_code-12.45}/tests/test_v1216_passes.py +0 -0
  641. {roam_code-12.43 → roam_code-12.45}/tests/test_v1216_passes_41_50.py +0 -0
  642. {roam_code-12.43 → roam_code-12.45}/tests/test_v1216_passes_51_60.py +0 -0
  643. {roam_code-12.43 → roam_code-12.45}/tests/test_v1217_passes_61_80.py +0 -0
  644. {roam_code-12.43 → roam_code-12.45}/tests/test_v1218_passes_81_90.py +0 -0
  645. {roam_code-12.43 → roam_code-12.45}/tests/test_v1219_passes_91_100.py +0 -0
  646. {roam_code-12.43 → roam_code-12.45}/tests/test_v1220_passes_101_110.py +0 -0
  647. {roam_code-12.43 → roam_code-12.45}/tests/test_v1221_query_timeout.py +0 -0
  648. {roam_code-12.43 → roam_code-12.45}/tests/test_v1221_untested_commands.py +0 -0
  649. {roam_code-12.43 → roam_code-12.45}/tests/test_v12_2.py +0 -0
  650. {roam_code-12.43 → roam_code-12.45}/tests/test_v2_edge_cases.py +0 -0
  651. {roam_code-12.43 → roam_code-12.45}/tests/test_v2_integration.py +0 -0
  652. {roam_code-12.43 → roam_code-12.45}/tests/test_v6_features.py +0 -0
  653. {roam_code-12.43 → roam_code-12.45}/tests/test_v71_features.py +0 -0
  654. {roam_code-12.43 → roam_code-12.45}/tests/test_v7_features.py +0 -0
  655. {roam_code-12.43 → roam_code-12.45}/tests/test_v82_features.py +0 -0
  656. {roam_code-12.43 → roam_code-12.45}/tests/test_verify.py +0 -0
  657. {roam_code-12.43 → roam_code-12.45}/tests/test_verify_imports.py +0 -0
  658. {roam_code-12.43 → roam_code-12.45}/tests/test_vibe_check.py +0 -0
  659. {roam_code-12.43 → roam_code-12.45}/tests/test_visualize.py +0 -0
  660. {roam_code-12.43 → roam_code-12.45}/tests/test_vuln.py +0 -0
  661. {roam_code-12.43 → roam_code-12.45}/tests/test_vulns_cmd.py +0 -0
  662. {roam_code-12.43 → roam_code-12.45}/tests/test_watch.py +0 -0
  663. {roam_code-12.43 → roam_code-12.45}/tests/test_why.py +0 -0
  664. {roam_code-12.43 → roam_code-12.45}/tests/test_workspace.py +0 -0
  665. {roam_code-12.43 → roam_code-12.45}/tests/test_ws_resolve_fixes.py +0 -0
  666. {roam_code-12.43 → roam_code-12.45}/tests/test_xlang.py +0 -0
  667. {roam_code-12.43 → roam_code-12.45}/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.43
3
+ Version: 12.45
4
4
  Summary: Instant codebase comprehension for AI coding agents
5
5
  Author: CosmoHac
6
6
  License-Expression: Apache-2.0
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "roam-code"
7
- version = "12.43"
7
+ version = "12.45"
8
8
  description = "Instant codebase comprehension for AI coding agents"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.9"
@@ -143,16 +143,8 @@ def roam_capability(
143
143
  cap_name = name or _derive_name(func)
144
144
  # For Click Commands, the original module is on the callback
145
145
  callback = getattr(func, "callback", None)
146
- module = (
147
- getattr(callback, "__module__", "")
148
- if callback is not None
149
- else getattr(func, "__module__", "")
150
- )
151
- func_name = (
152
- getattr(callback, "__name__", "")
153
- if callback is not None
154
- else getattr(func, "__name__", "")
155
- )
146
+ module = getattr(callback, "__module__", "") if callback is not None else getattr(func, "__module__", "")
147
+ func_name = getattr(callback, "__name__", "") if callback is not None else getattr(func, "__name__", "")
156
148
  cap = Capability(
157
149
  name=cap_name,
158
150
  category=category,
@@ -245,6 +237,6 @@ def emit_yaml() -> str:
245
237
 
246
238
  def _yaml_str(s: str) -> str:
247
239
  """Quote a string for YAML if needed."""
248
- if any(c in s for c in (':', '#', '\n', '"', "'", '[', ']', '{', '}', ',', '&', '*', '!', '|', '>')):
249
- return '"' + s.replace('\\', '\\\\').replace('"', '\\"') + '"'
240
+ if any(c in s for c in (":", "#", "\n", '"', "'", "[", "]", "{", "}", ",", "&", "*", "!", "|", ">")):
241
+ return '"' + s.replace("\\", "\\\\").replace('"', '\\"') + '"'
250
242
  return s
@@ -2549,7 +2549,9 @@ def detect_async_fire_and_forget(conn: sqlite3.Connection) -> list[dict]:
2549
2549
  ],
2550
2550
  )
2551
2551
  )
2552
- results[-1]["fix"] = "Store the task: `tasks.append(asyncio.create_task(coro()))` and await it later, or `await asyncio.create_task(coro())` directly."
2552
+ results[-1]["fix"] = (
2553
+ "Store the task: `tasks.append(asyncio.create_task(coro()))` and await it later, or `await asyncio.create_task(coro())` directly."
2554
+ )
2553
2555
  return results
2554
2556
 
2555
2557
 
@@ -584,6 +584,52 @@ CATALOG: dict[str, dict] = {
584
584
  },
585
585
  ],
586
586
  },
587
+ "async-fire-and-forget-task": {
588
+ "name": "asyncio.create_task() whose return value is discarded",
589
+ "category": "concurrency",
590
+ "kind": "algorithm",
591
+ "ways": [
592
+ {
593
+ "id": "store-task-reference",
594
+ "name": "Store the task in a long-lived collection",
595
+ "time": "n/a",
596
+ "space": "O(N tasks)",
597
+ "rank": 1,
598
+ "tip": "Capture the task: `tasks.append(asyncio.create_task(coro()))` and `await asyncio.gather(*tasks)` later. Or `await asyncio.create_task(coro())` directly for fire-and-await.",
599
+ },
600
+ {
601
+ "id": "leaked-asyncio-task",
602
+ "name": "Leaked asyncio.create_task — gc may discard before completion",
603
+ "time": "n/a",
604
+ "space": "O(1) — task object eligible for gc",
605
+ "rank": 10,
606
+ "tip": "",
607
+ },
608
+ ],
609
+ },
610
+ "async-nested-run": {
611
+ "name": "asyncio.run() invoked inside an async function",
612
+ "category": "concurrency",
613
+ "kind": "algorithm",
614
+ "ways": [
615
+ {
616
+ "id": "await-the-coroutine",
617
+ "name": "await the coroutine directly",
618
+ "time": "non-blocking",
619
+ "space": "O(1)",
620
+ "rank": 1,
621
+ "tip": "Replace `asyncio.run(coro())` with `await coro()` — you're already inside an event loop.",
622
+ },
623
+ {
624
+ "id": "asyncio-run-in-async",
625
+ "name": "asyncio.run inside async — RuntimeError at runtime",
626
+ "time": "raises immediately",
627
+ "space": "n/a",
628
+ "rank": 10,
629
+ "tip": "",
630
+ },
631
+ ],
632
+ },
587
633
  "serial-await-loop": {
588
634
  "name": "Serial `await` inside loop (Promise.all opportunity)",
589
635
  "category": "concurrency",
@@ -70,28 +70,32 @@ def compare_cmd(ctx, baseline: str, target: str, top: int, threshold: int) -> No
70
70
  verdict = _verdict(delta)
71
71
 
72
72
  if json_mode:
73
- click.echo(to_json(json_envelope(
74
- "compare",
75
- summary={
76
- "verdict": verdict,
77
- "baseline": str(base),
78
- "target": str(targ),
79
- "symbols_added": len(delta["symbols_added"]),
80
- "symbols_removed": len(delta["symbols_removed"]),
81
- "symbols_moved": len(delta["symbols_moved"]),
82
- "complexity_regressions": len(delta["complexity_up"]),
83
- "complexity_improvements": len(delta["complexity_down"]),
84
- },
85
- symbols_added=delta["symbols_added"][:top],
86
- symbols_removed=delta["symbols_removed"][:top],
87
- symbols_moved=delta["symbols_moved"][:top],
88
- complexity_up=delta["complexity_up"][:top],
89
- complexity_down=delta["complexity_down"][:top],
90
- file_count_baseline=base_state["file_count"],
91
- file_count_target=targ_state["file_count"],
92
- symbol_count_baseline=base_state["symbol_count"],
93
- symbol_count_target=targ_state["symbol_count"],
94
- )))
73
+ click.echo(
74
+ to_json(
75
+ json_envelope(
76
+ "compare",
77
+ summary={
78
+ "verdict": verdict,
79
+ "baseline": str(base),
80
+ "target": str(targ),
81
+ "symbols_added": len(delta["symbols_added"]),
82
+ "symbols_removed": len(delta["symbols_removed"]),
83
+ "symbols_moved": len(delta["symbols_moved"]),
84
+ "complexity_regressions": len(delta["complexity_up"]),
85
+ "complexity_improvements": len(delta["complexity_down"]),
86
+ },
87
+ symbols_added=delta["symbols_added"][:top],
88
+ symbols_removed=delta["symbols_removed"][:top],
89
+ symbols_moved=delta["symbols_moved"][:top],
90
+ complexity_up=delta["complexity_up"][:top],
91
+ complexity_down=delta["complexity_down"][:top],
92
+ file_count_baseline=base_state["file_count"],
93
+ file_count_target=targ_state["file_count"],
94
+ symbol_count_baseline=base_state["symbol_count"],
95
+ symbol_count_target=targ_state["symbol_count"],
96
+ )
97
+ )
98
+ )
95
99
  return
96
100
 
97
101
  click.echo(f"VERDICT: {verdict}")
@@ -117,8 +121,16 @@ def compare_cmd(ctx, baseline: str, target: str, top: int, threshold: int) -> No
117
121
  _section("Symbols added", delta["symbols_added"], lambda x: f"+ {x['kind']:8} {x['qname']} in {x['path']}")
118
122
  _section("Symbols removed", delta["symbols_removed"], lambda x: f"- {x['kind']:8} {x['qname']} was in {x['path']}")
119
123
  _section("Symbols moved", delta["symbols_moved"], lambda x: f"~ {x['qname']}: {x['old_path']} → {x['new_path']}")
120
- _section("Files got more complex", delta["complexity_up"], lambda x: f"↑ {x['path']} Δ +{x['delta']} (now {x['target']}, was {x['baseline']})")
121
- _section("Files got simpler", delta["complexity_down"], lambda x: f"↓ {x['path']} Δ -{abs(x['delta'])} (now {x['target']}, was {x['baseline']})")
124
+ _section(
125
+ "Files got more complex",
126
+ delta["complexity_up"],
127
+ lambda x: f"↑ {x['path']} Δ +{x['delta']} (now {x['target']}, was {x['baseline']})",
128
+ )
129
+ _section(
130
+ "Files got simpler",
131
+ delta["complexity_down"],
132
+ lambda x: f"↓ {x['path']} Δ -{abs(x['delta'])} (now {x['target']}, was {x['baseline']})",
133
+ )
122
134
 
123
135
 
124
136
  def _load_index_state(db_path: Path) -> dict:
@@ -177,12 +189,14 @@ def _compute_delta(base: dict, targ: dict, *, threshold: int) -> dict[str, list]
177
189
  moved = []
178
190
  for name in common_names:
179
191
  if base_syms[name]["path"] != targ_syms[name]["path"]:
180
- moved.append({
181
- "qname": name,
182
- "kind": targ_syms[name]["kind"],
183
- "old_path": base_syms[name]["path"],
184
- "new_path": targ_syms[name]["path"],
185
- })
192
+ moved.append(
193
+ {
194
+ "qname": name,
195
+ "kind": targ_syms[name]["kind"],
196
+ "old_path": base_syms[name]["path"],
197
+ "new_path": targ_syms[name]["path"],
198
+ }
199
+ )
186
200
 
187
201
  base_cx = base["complexities"]
188
202
  targ_cx = targ["complexities"]
@@ -53,6 +53,7 @@ def skill_generate_cmd(ctx, target: str, output_path: str | None, ai_safe_only:
53
53
  """
54
54
  # Force-load known capability modules
55
55
  from roam.commands.cmd_capabilities import _populate_registry
56
+
56
57
  _populate_registry()
57
58
 
58
59
  caps = REGISTRY.all()
@@ -96,50 +97,52 @@ def _emit_claude_skill(caps: list) -> str:
96
97
  ]
97
98
  for chunk in _wrap(description, 78, prefix=" "):
98
99
  lines.append(chunk)
99
- lines.extend([
100
- "---",
101
- "",
102
- "# Roam — Codebase Comprehension Skill",
103
- "",
104
- f"_Generated by `roam skill-generate --target claude` on {_today()}._",
105
- "",
106
- "**Repository:** <https://github.com/Cranot/roam-code>",
107
- "",
108
- "Roam pre-indexes codebases into a semantic graph (symbols, dependencies, "
109
- "call graphs, architecture layers, git history) stored in a local SQLite DB. "
110
- "Query it via CLI instead of repeatedly grepping files and guessing structure.",
111
- "",
112
- "## Setup",
113
- "",
114
- "```bash",
115
- "pip install roam-code # or: pipx install roam-code",
116
- "cd <project-root>",
117
- "roam init # indexes the codebase, creates .roam/index.db",
118
- "```",
119
- "",
120
- "After `git pull` or major changes, run `roam reindex` (incremental, near-instant). "
121
- "After large refactors: `roam reindex --force`.",
122
- "",
123
- "## When to use which command",
124
- "",
125
- "| Situation | Command |",
126
- "|-----------|---------|",
127
- "| Orient yourself in a new codebase | `roam understand` then `roam tour` |",
128
- "| Find a symbol | `roam search <pattern>` |",
129
- "| Free-form task (\"trace login flow\") | `roam retrieve \"<task>\"` |",
130
- "| Before changing a symbol | `roam preflight <symbol>` |",
131
- "| Files to read for context | `roam context <symbol>` |",
132
- "| Verify a patch | `git diff \\| roam critique` |",
133
- "| Pre-commit gate / agent verdict | `git diff --cached \\| roam permit` |",
134
- "| Replay current detectors against past commits | `roam postmortem HEAD~30..HEAD` |",
135
- "| EU AI Act Article 12 readiness | `roam article-12-check` |",
136
- "",
137
- "## Core capabilities",
138
- "",
139
- "These are the capabilities marked safe for autonomous agent calls. "
140
- "See `roam capabilities` for the full list.",
141
- "",
142
- ])
100
+ lines.extend(
101
+ [
102
+ "---",
103
+ "",
104
+ "# Roam — Codebase Comprehension Skill",
105
+ "",
106
+ f"_Generated by `roam skill-generate --target claude` on {_today()}._",
107
+ "",
108
+ "**Repository:** <https://github.com/Cranot/roam-code>",
109
+ "",
110
+ "Roam pre-indexes codebases into a semantic graph (symbols, dependencies, "
111
+ "call graphs, architecture layers, git history) stored in a local SQLite DB. "
112
+ "Query it via CLI instead of repeatedly grepping files and guessing structure.",
113
+ "",
114
+ "## Setup",
115
+ "",
116
+ "```bash",
117
+ "pip install roam-code # or: pipx install roam-code",
118
+ "cd <project-root>",
119
+ "roam init # indexes the codebase, creates .roam/index.db",
120
+ "```",
121
+ "",
122
+ "After `git pull` or major changes, run `roam reindex` (incremental, near-instant). "
123
+ "After large refactors: `roam reindex --force`.",
124
+ "",
125
+ "## When to use which command",
126
+ "",
127
+ "| Situation | Command |",
128
+ "|-----------|---------|",
129
+ "| Orient yourself in a new codebase | `roam understand` then `roam tour` |",
130
+ "| Find a symbol | `roam search <pattern>` |",
131
+ '| Free-form task ("trace login flow") | `roam retrieve "<task>"` |',
132
+ "| Before changing a symbol | `roam preflight <symbol>` |",
133
+ "| Files to read for context | `roam context <symbol>` |",
134
+ "| Verify a patch | `git diff \\| roam critique` |",
135
+ "| Pre-commit gate / agent verdict | `git diff --cached \\| roam permit` |",
136
+ "| Replay current detectors against past commits | `roam postmortem HEAD~30..HEAD` |",
137
+ "| EU AI Act Article 12 readiness | `roam article-12-check` |",
138
+ "",
139
+ "## Core capabilities",
140
+ "",
141
+ "These are the capabilities marked safe for autonomous agent calls. "
142
+ "See `roam capabilities` for the full list.",
143
+ "",
144
+ ]
145
+ )
143
146
  by_cat: dict[str, list] = {}
144
147
  for c in caps:
145
148
  by_cat.setdefault(c.category, []).append(c)
@@ -151,22 +154,24 @@ def _emit_claude_skill(caps: list) -> str:
151
154
  if cap.examples:
152
155
  lines.append(f" - Example: `{cap.examples[0]}`")
153
156
  lines.append("")
154
- lines.extend([
155
- "## Output modes",
156
- "",
157
- "- Text (default) — human-readable; safe to feed back into your context.",
158
- "- `--json`structured envelope with `verdict`, `summary`, schema_version. Parse this in code.",
159
- "- `--sarif` — SARIF 2.1.0 for CI integration (GitHub Code Scanning).",
160
- "",
161
- "## Exit codes",
162
- "",
163
- "- 0 — success / ALLOW",
164
- "- 5high-severity finding / BLOCK / gate failure",
165
- "- 6REVIEW / partial",
166
- "",
167
- "All other non-zero codes are unexpected; report as an issue.",
168
- "",
169
- ])
157
+ lines.extend(
158
+ [
159
+ "## Output modes",
160
+ "",
161
+ "- Text (default) human-readable; safe to feed back into your context.",
162
+ "- `--json` — structured envelope with `verdict`, `summary`, schema_version. Parse this in code.",
163
+ "- `--sarif` — SARIF 2.1.0 for CI integration (GitHub Code Scanning).",
164
+ "",
165
+ "## Exit codes",
166
+ "",
167
+ "- 0success / ALLOW",
168
+ "- 5high-severity finding / BLOCK / gate failure",
169
+ "- 6 — REVIEW / partial",
170
+ "",
171
+ "All other non-zero codes are unexpected; report as an issue.",
172
+ "",
173
+ ]
174
+ )
170
175
  return "\n".join(lines) + "\n"
171
176
 
172
177
 
@@ -183,8 +188,7 @@ def _emit_cursor_rule(caps: list) -> str:
183
188
  "",
184
189
  "# Roam codebase comprehension",
185
190
  "",
186
- "Before making non-trivial code changes, use the roam-code CLI to understand "
187
- "what you're about to touch.",
191
+ "Before making non-trivial code changes, use the roam-code CLI to understand what you're about to touch.",
188
192
  "",
189
193
  "1. `roam preflight <symbol>` — see what changing this affects.",
190
194
  "2. `roam context <symbol>` — get the exact files and line ranges to read.",
@@ -202,6 +206,7 @@ def _emit_cursor_rule(caps: list) -> str:
202
206
  def _emit_continue_snippet(caps: list) -> str:
203
207
  """Continue config.json snippet — slash commands."""
204
208
  import json
209
+
205
210
  snippet = {
206
211
  "slashCommands": [
207
212
  {
@@ -1363,7 +1363,7 @@ MAP_METADATA: dict[str, dict[str, object]] = {
1363
1363
  "peer": True,
1364
1364
  "graph": "PageRank + Tarjan + Louvain + layers",
1365
1365
  "note": "Graph algorithms (PageRank, SCC, Louvain, Fiedler) on tree-sitter ASTs fused with git history in SQLite. 136 MCP tools, 190 CLI commands. 19 Python idiom detectors (v12.7+). 54 algo detectors (12.40). Phase 0 monetization commands: permit / postmortem / article-12-check.",
1366
- "version_evaluated": "12.43",
1366
+ "version_evaluated": "12.45",
1367
1367
  "repo_url": "https://github.com/Cranot/roam-code",
1368
1368
  },
1369
1369
  "CKB/CodeMCP": {
@@ -2,7 +2,7 @@
2
2
  "$schema": "https://schemas.modelcontextprotocol.io/server-card/v1",
3
3
  "name": "roam-code",
4
4
  "display_name": "roam — instant codebase intelligence",
5
- "version": "12.43",
5
+ "version": "12.45",
6
6
  "description": "Architectural sight for AI agents before they edit. Pre-indexes symbols, call graphs, dependencies, architecture layers, and git history into a local SQLite DB. 136 MCP tools, 10 resources, 5 prompts, 27 languages. 100% local, zero API keys.",
7
7
  "vendor": {
8
8
  "name": "Cranot",
@@ -165,6 +165,7 @@ def _automation_details(tool_name: str, version: str) -> dict:
165
165
  """
166
166
  import os
167
167
  from datetime import datetime, timezone
168
+
168
169
  run_guid = f"{tool_name}/{version}/{datetime.now(timezone.utc).strftime('%Y%m%d')}"
169
170
  branch = os.environ.get("GITHUB_REF_NAME") or os.environ.get("CI_COMMIT_BRANCH") or "main"
170
171
  return {
@@ -180,24 +181,34 @@ def _version_control_provenance() -> list[dict]:
180
181
  Returns an empty list when git is unavailable so SARIF stays valid.
181
182
  """
182
183
  import subprocess
184
+
183
185
  try:
184
186
  sha = subprocess.run(
185
187
  ["git", "rev-parse", "HEAD"],
186
- capture_output=True, text=True, timeout=2,
188
+ capture_output=True,
189
+ text=True,
190
+ timeout=2,
187
191
  ).stdout.strip()
188
192
  if not sha:
189
193
  return []
190
194
  try:
191
- branch = subprocess.run(
192
- ["git", "rev-parse", "--abbrev-ref", "HEAD"],
193
- capture_output=True, text=True, timeout=2,
194
- ).stdout.strip() or "main"
195
+ branch = (
196
+ subprocess.run(
197
+ ["git", "rev-parse", "--abbrev-ref", "HEAD"],
198
+ capture_output=True,
199
+ text=True,
200
+ timeout=2,
201
+ ).stdout.strip()
202
+ or "main"
203
+ )
195
204
  except Exception:
196
205
  branch = "main"
197
206
  try:
198
207
  remote = subprocess.run(
199
208
  ["git", "config", "--get", "remote.origin.url"],
200
- capture_output=True, text=True, timeout=2,
209
+ capture_output=True,
210
+ text=True,
211
+ timeout=2,
201
212
  ).stdout.strip()
202
213
  except Exception:
203
214
  remote = ""
@@ -221,6 +232,7 @@ def _load_suppressions() -> list[dict]:
221
232
  """
222
233
  import json
223
234
  from pathlib import Path
235
+
224
236
  candidate = Path.cwd() / ".roam" / "suppressions.json"
225
237
  if not candidate.exists():
226
238
  return []
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: roam-code
3
- Version: 12.43
3
+ Version: 12.45
4
4
  Summary: Instant codebase comprehension for AI coding agents
5
5
  Author: CosmoHac
6
6
  License-Expression: Apache-2.0
@@ -4,6 +4,7 @@ Phase 1 of the v2 monetization plan; these tests guard the contract
4
4
  that the registry stays consistent across imports and emits stable
5
5
  YAML / JSON for downstream consumers.
6
6
  """
7
+
7
8
  from __future__ import annotations
8
9
 
9
10
  import json
@@ -112,6 +113,7 @@ def test_phase0_commands_register() -> None:
112
113
  """The 3 Phase 0 commands (permit, postmortem, article-12-check) decorate themselves."""
113
114
  # Force-import via the populator
114
115
  from roam.commands.cmd_capabilities import _populate_registry
116
+
115
117
  _populate_registry()
116
118
  assert REGISTRY.get("permit") is not None
117
119
  assert REGISTRY.get("postmortem") is not None
@@ -1,4 +1,5 @@
1
1
  """Tests for R8 — roam compare (structural index diff)."""
2
+
2
3
  from __future__ import annotations
3
4
 
4
5
  import sqlite3
@@ -39,6 +40,7 @@ def test_compute_delta_detects_added_and_removed(tmp_path) -> None:
39
40
  _make_index(targ_db, files=[(1, "a.py")], symbols=[("bar", "function", 1)])
40
41
 
41
42
  from roam.commands.cmd_compare import _load_index_state
43
+
42
44
  base = _load_index_state(base_db)
43
45
  targ = _load_index_state(targ_db)
44
46
  delta = _compute_delta(base, targ, threshold=1)
@@ -54,6 +56,7 @@ def test_compute_delta_detects_moves(tmp_path) -> None:
54
56
  _make_index(targ_db, files=[(1, "old.py"), (2, "new.py")], symbols=[("foo", "function", 2)])
55
57
 
56
58
  from roam.commands.cmd_compare import _load_index_state
59
+
57
60
  base = _load_index_state(base_db)
58
61
  targ = _load_index_state(targ_db)
59
62
  delta = _compute_delta(base, targ, threshold=1)
@@ -106,6 +109,7 @@ def test_cli_text_output(tmp_path) -> None:
106
109
 
107
110
  def test_cli_json_output(tmp_path) -> None:
108
111
  import json as jsonlib
112
+
109
113
  base_db = tmp_path / "base.db"
110
114
  targ_db = tmp_path / "targ.db"
111
115
  _make_index(base_db, files=[(1, "a.py")], symbols=[("foo", "function", 1)])
@@ -31,7 +31,9 @@ class TestCatalog:
31
31
  # broad-except-swallow, spread-accumulator, defer-in-loop;
32
32
  # X13 added chained-collection-walk; Z1/Z2/Z5 added useeffect-
33
33
  # missing-deps, dangerous-eval, unremoved-event-listener → 32.
34
- assert len(CATALOG) == 32, f"Expected 32 tasks, got {len(CATALOG)}"
34
+ # R5 (v12.43) added async-fire-and-forget-task,
35
+ # async-nested-run → 34.
36
+ assert len(CATALOG) == 34, f"Expected 34 tasks, got {len(CATALOG)}"
35
37
 
36
38
  def test_detector_registry_covers_catalog(self):
37
39
  from roam.catalog.detectors import _MATH_DETECTORS
@@ -4,6 +4,7 @@ The enrichment lets GitHub Code Scanning correlate runs across re-ingests,
4
4
  maps findings to a specific git commit, and respects user-defined
5
5
  suppressions from .roam/suppressions.json.
6
6
  """
7
+
7
8
  from __future__ import annotations
8
9
 
9
10
  import json
@@ -72,15 +73,17 @@ def test_suppressions_applied_when_file_present(tmp_path, monkeypatch) -> None:
72
73
  suppressions_dir = tmp_path / ".roam"
73
74
  suppressions_dir.mkdir()
74
75
  (suppressions_dir / "suppressions.json").write_text(
75
- json.dumps([
76
- {
77
- "rule_id": "ROAM-DEMO-1",
78
- "location": "src/x.py:10",
79
- "reason": "false positive: this is intentional",
80
- "kind": "external",
81
- "status": "accepted",
82
- }
83
- ]),
76
+ json.dumps(
77
+ [
78
+ {
79
+ "rule_id": "ROAM-DEMO-1",
80
+ "location": "src/x.py:10",
81
+ "reason": "false positive: this is intentional",
82
+ "kind": "external",
83
+ "status": "accepted",
84
+ }
85
+ ]
86
+ ),
84
87
  encoding="utf-8",
85
88
  )
86
89
 
@@ -104,15 +107,17 @@ def test_suppressions_object_shape_also_supported(tmp_path, monkeypatch) -> None
104
107
  suppressions_dir = tmp_path / ".roam"
105
108
  suppressions_dir.mkdir()
106
109
  (suppressions_dir / "suppressions.json").write_text(
107
- json.dumps({
108
- "suppressions": [
109
- {
110
- "rule_id": "ROAM-DEMO-1",
111
- "location": "src/x.py:10",
112
- "reason": "wrapped",
113
- }
114
- ]
115
- }),
110
+ json.dumps(
111
+ {
112
+ "suppressions": [
113
+ {
114
+ "rule_id": "ROAM-DEMO-1",
115
+ "location": "src/x.py:10",
116
+ "reason": "wrapped",
117
+ }
118
+ ]
119
+ }
120
+ ),
116
121
  encoding="utf-8",
117
122
  )
118
123
 
@@ -4,6 +4,7 @@ Generates an agent-runtime skill manifest from the capability registry.
4
4
  Targets: claude (SKILL.md), cursor (.mdc rule), continue (config snippet),
5
5
  aider (.aiderrc).
6
6
  """
7
+
7
8
  from __future__ import annotations
8
9
 
9
10
  import json
File without changes
File without changes
File without changes
File without changes