roam-code 12.26__tar.gz → 12.27__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.
- {roam_code-12.26/src/roam_code.egg-info → roam_code-12.27}/PKG-INFO +1843 -1839
- {roam_code-12.26 → roam_code-12.27}/README.md +6 -2
- {roam_code-12.26 → roam_code-12.27}/pyproject.toml +1 -1
- {roam_code-12.26 → roam_code-12.27}/setup.cfg +4 -4
- {roam_code-12.26 → roam_code-12.27}/src/roam/__main__.py +14 -14
- {roam_code-12.26 → roam_code-12.27}/src/roam/analysis/__init__.py +1 -1
- {roam_code-12.26 → roam_code-12.27}/src/roam/analysis/taint.py +760 -760
- {roam_code-12.26 → roam_code-12.27}/src/roam/catalog/detectors.py +2524 -2524
- {roam_code-12.26 → roam_code-12.27}/src/roam/catalog/smells.py +600 -600
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_audit_trail_conformance.py +69 -2
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_audit_trail_export.py +86 -4
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_clones.py +210 -210
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_metrics_push.py +86 -62
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_pr_analyze.py +385 -94
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_pr_comment_render.py +16 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_rules_validate.py +71 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_ws.py +811 -811
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/codeowners_helpers.py +109 -109
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/context_helpers.py +1137 -1137
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/suppression.py +309 -309
- {roam_code-12.26 → roam_code-12.27}/src/roam/db/queries.py +151 -151
- {roam_code-12.26 → roam_code-12.27}/src/roam/graph/clone_detect.py +671 -671
- {roam_code-12.26 → roam_code-12.27}/src/roam/graph/stats.py +24 -24
- {roam_code-12.26 → roam_code-12.27}/src/roam/index/gitignore.py +141 -141
- {roam_code-12.26 → roam_code-12.27}/src/roam/index/incremental.py +75 -75
- {roam_code-12.26 → roam_code-12.27}/src/roam/languages/scala_lang.py +620 -620
- {roam_code-12.26 → roam_code-12.27}/src/roam/languages/sql_lang.py +648 -648
- {roam_code-12.26 → roam_code-12.27}/src/roam/runtime/__init__.py +3 -3
- {roam_code-12.26 → roam_code-12.27}/src/roam/search/__init__.py +1 -1
- {roam_code-12.26 → roam_code-12.27}/src/roam/search/index_embeddings.py +733 -733
- {roam_code-12.26 → roam_code-12.27}/src/roam/security/__init__.py +1 -1
- {roam_code-12.26 → roam_code-12.27}/src/roam/templates/__init__.py +1 -1
- {roam_code-12.26 → roam_code-12.27}/src/roam/templates/ci/Jenkinsfile +186 -186
- {roam_code-12.26 → roam_code-12.27}/src/roam/templates/ci/__init__.py +1 -1
- {roam_code-12.26 → roam_code-12.27}/src/roam/templates/ci/azure-pipelines.yml +162 -162
- {roam_code-12.26 → roam_code-12.27}/src/roam/templates/ci/bitbucket-pipelines.yml +179 -179
- {roam_code-12.26 → roam_code-12.27}/src/roam/templates/ci/gitlab-ci.yml +138 -138
- {roam_code-12.26 → roam_code-12.27}/src/roam/workspace/__init__.py +3 -3
- {roam_code-12.26 → roam_code-12.27/src/roam_code.egg-info}/PKG-INFO +1843 -1839
- {roam_code-12.26 → roam_code-12.27}/src/roam_code.egg-info/SOURCES.txt +2 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_adrs.py +108 -108
- {roam_code-12.26 → roam_code-12.27}/tests/test_alerts_cmd.py +591 -591
- {roam_code-12.26 → roam_code-12.27}/tests/test_api_drift.py +88 -88
- {roam_code-12.26 → roam_code-12.27}/tests/test_audit_trail_aggregate.py +76 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_audit_trail_conformance.py +69 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_audit_trail_verify.py +20 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_auth_gaps.py +230 -230
- {roam_code-12.26 → roam_code-12.27}/tests/test_bus_factor.py +483 -483
- {roam_code-12.26 → roam_code-12.27}/tests/test_ci_setup.py +93 -93
- {roam_code-12.26 → roam_code-12.27}/tests/test_clones.py +607 -607
- {roam_code-12.26 → roam_code-12.27}/tests/test_congestion.py +90 -90
- {roam_code-12.26 → roam_code-12.27}/tests/test_conventions_cmd.py +499 -499
- {roam_code-12.26 → roam_code-12.27}/tests/test_coverage_gaps_cmd.py +399 -399
- {roam_code-12.26 → roam_code-12.27}/tests/test_dataflow_dead.py +521 -521
- {roam_code-12.26 → roam_code-12.27}/tests/test_describe.py +172 -172
- {roam_code-12.26 → roam_code-12.27}/tests/test_doc_staleness.py +70 -70
- {roam_code-12.26 → roam_code-12.27}/tests/test_entry_points_cmd.py +325 -325
- {roam_code-12.26 → roam_code-12.27}/tests/test_flag_dead.py +125 -125
- {roam_code-12.26 → roam_code-12.27}/tests/test_fn_coupling.py +88 -88
- {roam_code-12.26 → roam_code-12.27}/tests/test_hotspots.py +335 -335
- {roam_code-12.26 → roam_code-12.27}/tests/test_init_cmd.py +178 -178
- {roam_code-12.26 → roam_code-12.27}/tests/test_metrics_push.py +30 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_migration_safety.py +482 -482
- {roam_code-12.26 → roam_code-12.27}/tests/test_missing_index.py +484 -484
- {roam_code-12.26 → roam_code-12.27}/tests/test_n1.py +256 -256
- {roam_code-12.26 → roam_code-12.27}/tests/test_orphan_routes.py +103 -103
- {roam_code-12.26 → roam_code-12.27}/tests/test_over_fetch.py +92 -92
- {roam_code-12.26 → roam_code-12.27}/tests/test_patterns_cmd.py +378 -378
- {roam_code-12.26 → roam_code-12.27}/tests/test_pr_analyze.py +19 -0
- roam_code-12.27/tests/test_pr_analyze_helpers.py +383 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_report.py +211 -211
- {roam_code-12.26 → roam_code-12.27}/tests/test_risk.py +326 -326
- {roam_code-12.26 → roam_code-12.27}/tests/test_rules_validate.py +79 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_sbom.py +108 -108
- {roam_code-12.26 → roam_code-12.27}/tests/test_scala.py +376 -376
- {roam_code-12.26 → roam_code-12.27}/tests/test_sketch.py +232 -232
- {roam_code-12.26 → roam_code-12.27}/tests/test_split_cmd.py +286 -286
- {roam_code-12.26 → roam_code-12.27}/tests/test_sql.py +434 -434
- {roam_code-12.26 → roam_code-12.27}/tests/test_taint_analysis.py +831 -831
- {roam_code-12.26 → roam_code-12.27}/tests/test_test_scaffold.py +104 -104
- {roam_code-12.26 → roam_code-12.27}/tests/test_testmap.py +393 -393
- {roam_code-12.26 → roam_code-12.27}/tests/test_tour_cmd.py +277 -277
- {roam_code-12.26 → roam_code-12.27}/tests/test_triage.py +149 -149
- {roam_code-12.26 → roam_code-12.27}/tests/test_uses_cmd.py +245 -245
- roam_code-12.27/tests/test_v2_integration.py +237 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_why.py +271 -271
- {roam_code-12.26 → roam_code-12.27}/tests/test_xlang.py +230 -230
- {roam_code-12.26 → roam_code-12.27}/LICENSE +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/__init__.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/analysis/effects.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/api.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/ask/__init__.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/ask/classifier.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/ask/recipes.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/ask/runner.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/ask/workflow.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/attest/__init__.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/attest/cga.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/bridges/__init__.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/bridges/base.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/bridges/bridge_config.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/bridges/bridge_django.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/bridges/bridge_protobuf.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/bridges/bridge_rest_api.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/bridges/bridge_salesforce.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/bridges/bridge_template.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/bridges/registry.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/catalog/__init__.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/catalog/fixes.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/catalog/python_idioms.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/catalog/tasks.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/cli.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/__init__.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/audit_trail_helpers.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/changed_files.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_adrs.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_adversarial.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_affected.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_affected_tests.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_agent_context.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_agent_export.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_agent_plan.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_ai_ratio.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_ai_readiness.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_alerts.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_annotate.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_api.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_api_changes.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_api_drift.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_ask.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_attest.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_audit.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_audit_trail_verify.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_auth_gaps.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_bisect.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_breaking.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_budget.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_bus_factor.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_capsule.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_cga.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_changelog.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_check_rules.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_ci_setup.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_clean.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_closure.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_clusters.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_codeowners.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_complexity.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_config.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_congestion.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_context.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_conventions.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_coupling.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_coverage_gaps.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_critique.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_cut.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_dark_matter.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_dashboard.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_dead.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_debt.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_deps.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_describe.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_dev_profile.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_diagnose.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_diff.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_disambiguate.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_doc_staleness.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_docs_coverage.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_doctor.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_dogfood.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_drift.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_duplicates.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_effects.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_endpoints.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_entry_points.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_eval_retrieve.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_exit_codes.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_fan.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_file.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_fingerprint.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_fitness.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_flag_dead.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_fleet.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_fn_coupling.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_forecast.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_graph_export.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_graph_stats.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_grep.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_guard.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_health.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_help_search.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_hooks.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_hotspots.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_hover.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_impact.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_index.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_index_bundle.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_index_stats.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_ingest_trace.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_init.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_intent.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_invariants.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_layers.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_map.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_math.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_mcp_setup.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_mcp_status.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_metrics.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_migration_safety.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_minimap.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_missing_index.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_module.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_mutate.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_n1.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_oracle.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_orchestrate.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_orphan_imports.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_orphan_routes.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_over_fetch.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_owner.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_partition.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_path_coverage.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_patterns.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_plan.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_plan_refactor.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_plugins.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_pr_diff.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_pr_prep.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_pr_risk.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_pre_commit.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_preflight.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_py_modern.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_py_types.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_pytest_fixtures.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_recipes.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_recommend.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_relate.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_report.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_reset.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_retrieve.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_risk.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_rules.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_safe_delete.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_safe_zones.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_sbom.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_schema.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_search.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_search_semantic.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_secrets.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_semantic_diff.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_simulate.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_simulate_departure.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_sketch.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_smells.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_spectral.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_split.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_stats.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_suggest_refactoring.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_suggest_reviewers.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_supply_chain.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_symbol.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_syntax_check.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_taint.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_telemetry.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_test_gaps.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_test_impact.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_test_pyramid.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_test_scaffold.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_testmap.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_timeline.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_tour.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_trace.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_trends.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_triage.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_understand.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_uses.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_verify.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_verify_imports.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_version.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_vibe_check.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_visualize.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_vuln_map.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_vuln_reach.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_vulns.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_watch.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_weather.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_why.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_why_fail.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_workflow.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/cmd_xlang.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/gate_presets.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/git_helpers.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/graph_helpers.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/metrics_history.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/next_steps.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/commands/resolve.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/competitor_site_data.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/config.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/coverage_reports.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/critique/__init__.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/critique/aggregator.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/critique/checks.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/db/__init__.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/db/connection.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/db/schema.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/eval/__init__.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/eval/harness.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/exit_codes.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/fleet/__init__.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/fleet/adapters.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/fleet/manifest.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/git_utils.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/graph/__init__.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/graph/anomaly.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/graph/builder.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/graph/clusters.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/graph/cycles.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/graph/dark_matter.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/graph/diff.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/graph/fingerprint.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/graph/layers.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/graph/pagerank.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/graph/partition.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/graph/pathfinding.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/graph/propagation.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/graph/simulate.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/graph/spectral.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/index/__init__.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/index/complexity.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/index/discovery.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/index/django_post.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/index/file_roles.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/index/git_stats.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/index/indexer.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/index/parser.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/index/pytest_fixtures.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/index/registry_dispatch.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/index/relations.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/index/symbols.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/index/test_conventions.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/languages/__init__.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/languages/apex_lang.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/languages/aura_lang.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/languages/base.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/languages/c_lang.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/languages/csharp_lang.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/languages/extractor_schema.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/languages/extractors/kotlin.yaml +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/languages/foxpro_lang.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/languages/generic_lang.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/languages/go_lang.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/languages/hcl_lang.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/languages/java_lang.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/languages/javascript_lang.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/languages/kotlin_lang.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/languages/php_lang.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/languages/python_lang.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/languages/query_engine.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/languages/registry.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/languages/ruby_lang.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/languages/rust_lang.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/languages/sfxml_lang.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/languages/swift_lang.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/languages/typescript_lang.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/languages/visualforce_lang.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/languages/yaml_lang.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/mcp-server-card.json +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/mcp_extras/__init__.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/mcp_extras/completions.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/mcp_extras/concurrency.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/mcp_extras/progress.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/mcp_extras/sampling.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/mcp_extras/session.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/mcp_extras/watcher.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/mcp_server.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/observability.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/output/__init__.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/output/confidence.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/output/errors.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/output/file_role_hints.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/output/formatter.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/output/framework_filter.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/output/mermaid.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/output/project_shape.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/output/sarif.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/output/schema_registry.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/plugins.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/refactor/__init__.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/refactor/codegen.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/refactor/transforms.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/retrieve/__init__.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/retrieve/learned_ranker.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/retrieve/pipeline.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/retrieve/rerank.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/retrieve/seeds.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/retrieve/semantic.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/rules/__init__.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/rules/ast_match.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/rules/builtin.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/rules/dataflow.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/rules/engine.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/runtime/daemon.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/runtime/graph_backend.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/runtime/hotspots.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/runtime/lock_modes.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/runtime/lockmgr.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/runtime/trace_ingest.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/search/framework_packs.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/search/onnx_embeddings.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/search/tfidf.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/security/aibom_extension.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/security/taint_classifier.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/security/taint_engine.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/security/taint_rules/api_error_leak.yaml +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/security/taint_rules/java_fileupload_path_traversal.yaml +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/security/taint_rules/js_insecure_jwt_decode.yaml +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/security/taint_rules/js_localstorage_secrets.yaml +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/security/taint_rules/js_prototype_pollution.yaml +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/security/taint_rules/js_ssrf.yaml +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/security/taint_rules/js_xss.yaml +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/security/taint_rules/python_basic.yaml +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/security/taint_rules/python_deserialization.yaml +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/security/taint_rules/python_path_traversal.yaml +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/security/taint_rules/python_socketio_remote_source.yaml +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/security/taint_rules/python_sqli.yaml +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/security/taint_rules/python_urllib_open_redirect.yaml +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/security/taint_rules/vue_v_html.yaml +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/security/vuln_reach.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/security/vuln_store.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/surface_counts.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/telemetry.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/templates/ci/agent-review.yml +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/workspace/aggregator.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/workspace/api_scanner.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/workspace/config.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam/workspace/db.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam_code.egg-info/dependency_links.txt +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam_code.egg-info/entry_points.txt +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam_code.egg-info/requires.txt +0 -0
- {roam_code-12.26 → roam_code-12.27}/src/roam_code.egg-info/top_level.txt +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_adversarial.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_affected.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_agent_export.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_agent_mode.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_agent_plan_context.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_ai_ratio.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_ai_readiness.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_annotations.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_anomaly.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_api_changes.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_ask.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_attest.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_audit_trail_sequence.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_backend_fixes_round2.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_backend_fixes_round3.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_basic.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_batch_mcp.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_bisect.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_bridge_django.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_bridges.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_bridges_extended.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_budget.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_budget_flag.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_budget_phase2.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_capsule.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_cga.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_check_rules.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_ci_gate_eval.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_ci_sarif_guard.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_closure.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_codeowners.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_commands_architecture.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_commands_exploration.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_commands_health.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_commands_refactoring.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_commands_workflow.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_competitor_site_data.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_comprehensive.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_config.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_context_propagation.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_coverage_ingestion.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_critique.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_cut.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_dark_matter.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_dark_matter_helpers.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_dashboard.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_dead_aging.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_defer_loading.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_demo_gif_asset.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_detail_flag_hints.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_detector_precision.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_deterministic_output.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_dev_profile.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_difficulty_scoring.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_doc_consistency.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_docker_assets.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_docs_coverage.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_docs_site_quality.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_doctor.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_dogfood.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_drift.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_drift_by_team.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_duplicates.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_effects.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_effects_propagation.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_endpoints.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_eval_retrieve.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_except_pass_narrow.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_exclude_patterns.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_exit_codes.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_extractor_grammar_drift.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_fallback_contracts.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_file_roles.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_fingerprint.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_fixes.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_fleet.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_forecast.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_formatters.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_foxpro.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_framework_detection.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_gate_presets.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_git_helpers.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_git_utils.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_guard.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_health_gate.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_hooks.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_hover.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_index.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_index_bundle.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_install_check.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_intent.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_invariants.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_json_contracts.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_json_error_envelope.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_kotlin_swift_extractors.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_language_corpus.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_languages.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_library_api.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_math.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_math_tips.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_mcp_extras.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_mcp_server.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_mcp_setup.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_mermaid.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_metrics_cmd.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_minimap.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_mutate.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_next_steps.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_onboard.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_oracle.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_orchestrate.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_oss_bench_harness.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_pagerank_truncation.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_partition.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_path_coverage.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_performance.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_personalized_pagerank.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_plan.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_plugin_discovery.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_pr_analyze_cache.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_pr_analyze_edge_cases.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_pr_analyze_v2_signals.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_pr_comment_render.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_pr_comment_script.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_pr_diff.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_pr_risk_author.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_progress.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_progressive_disclosure.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_properties.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_pytest_fixtures.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_python_extractor_v2.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_python_idioms_e2e.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_python_pivot.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_readme_surface_consistency.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_realworld_feedback.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_refactoring_intelligence.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_registry_dispatch.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_relate.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_reset_clean.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_resolve.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_retrieve.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_retrieve_cross_repo.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_retrieve_seeds.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_ruby.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_rule_profiles.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_rules.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_rules_ast_match.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_rules_community_pack.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_rules_dataflow.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_rules_symbol_requirements.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_runtime.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_runtime_score.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_salesforce.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_sarif_flag.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_schema_versioning.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_search_explain.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_secrets.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_secrets_v2.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_semantic_diff.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_semantic_onnx.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_semantic_search.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_simulate.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_simulate_departure.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_smells.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_smoke.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_sna_metrics.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_spectral.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_suggest_reviewers.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_supply_chain.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_surface_counts.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_syntax_check.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_taint.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_taint_classifier.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_taint_intraprocedural.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_test_conventions.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_test_gaps.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_top_flag_consistency.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_trends.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_trends_cohort.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_v1215_passes.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_v1216_passes.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_v1216_passes_41_50.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_v1216_passes_51_60.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_v1217_passes_61_80.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_v1218_passes_81_90.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_v1219_passes_91_100.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_v1220_passes_101_110.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_v1221_query_timeout.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_v1221_untested_commands.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_v12_2.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_v2_edge_cases.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_v6_features.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_v71_features.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_v7_features.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_v82_features.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_verify.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_verify_imports.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_vibe_check.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_visualize.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_vuln.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_vulns_cmd.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_watch.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_workspace.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_ws_resolve_fixes.py +0 -0
- {roam_code-12.26 → roam_code-12.27}/tests/test_yaml_hcl.py +0 -0
|
@@ -1,1839 +1,1843 @@
|
|
|
1
|
-
Metadata-Version: 2.4
|
|
2
|
-
Name: roam-code
|
|
3
|
-
Version: 12.
|
|
4
|
-
Summary: Instant codebase comprehension for AI coding agents
|
|
5
|
-
Author: CosmoHac
|
|
6
|
-
License-Expression: Apache-2.0
|
|
7
|
-
Project-URL: Homepage, https://github.com/Cranot/roam-code
|
|
8
|
-
Project-URL: Documentation, https://cranot.github.io/roam-code/
|
|
9
|
-
Project-URL: Repository, https://github.com/Cranot/roam-code
|
|
10
|
-
Project-URL: Issues, https://github.com/Cranot/roam-code/issues
|
|
11
|
-
Project-URL: Changelog, https://github.com/Cranot/roam-code/blob/main/CHANGELOG.md
|
|
12
|
-
Keywords: code-intelligence,static-analysis,mcp-server,tree-sitter,architecture,code-graph,ai-coding,graph-analysis,code-quality,cli,codebase,code-analysis,ai-tools,mcp,sql
|
|
13
|
-
Classifier: Development Status :: 5 - Production/Stable
|
|
14
|
-
Classifier: Environment :: Console
|
|
15
|
-
Classifier: Intended Audience :: Developers
|
|
16
|
-
Classifier: Operating System :: OS Independent
|
|
17
|
-
Classifier: Programming Language :: Python :: 3
|
|
18
|
-
Classifier: Programming Language :: Python :: 3.9
|
|
19
|
-
Classifier: Programming Language :: Python :: 3.10
|
|
20
|
-
Classifier: Programming Language :: Python :: 3.11
|
|
21
|
-
Classifier: Programming Language :: Python :: 3.12
|
|
22
|
-
Classifier: Programming Language :: Python :: 3.13
|
|
23
|
-
Classifier: Topic :: Software Development
|
|
24
|
-
Classifier: Topic :: Software Development :: Code Generators
|
|
25
|
-
Classifier: Topic :: Software Development :: Quality Assurance
|
|
26
|
-
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
27
|
-
Requires-Python: >=3.9
|
|
28
|
-
Description-Content-Type: text/markdown
|
|
29
|
-
License-File: LICENSE
|
|
30
|
-
Requires-Dist: click>=8.0
|
|
31
|
-
Requires-Dist: tree-sitter>=0.23
|
|
32
|
-
Requires-Dist: tree-sitter-language-pack<1.6.3,>=0.6
|
|
33
|
-
Requires-Dist: networkx>=3.0
|
|
34
|
-
Provides-Extra: mcp
|
|
35
|
-
Requires-Dist: fastmcp>=2.0; extra == "mcp"
|
|
36
|
-
Provides-Extra: semantic
|
|
37
|
-
Requires-Dist: numpy>=1.24; extra == "semantic"
|
|
38
|
-
Requires-Dist: onnxruntime>=1.16; extra == "semantic"
|
|
39
|
-
Requires-Dist: tokenizers>=0.15; extra == "semantic"
|
|
40
|
-
Provides-Extra: leiden
|
|
41
|
-
Requires-Dist: igraph>=0.11; extra == "leiden"
|
|
42
|
-
Requires-Dist: leidenalg>=0.10; extra == "leiden"
|
|
43
|
-
Provides-Extra: graph-fast
|
|
44
|
-
Requires-Dist: rustworkx>=0.14; extra == "graph-fast"
|
|
45
|
-
Provides-Extra: sbom
|
|
46
|
-
Requires-Dist: cyclonedx-python-lib>=8.0; extra == "sbom"
|
|
47
|
-
Provides-Extra: learned
|
|
48
|
-
Requires-Dist: lightgbm>=4.0; extra == "learned"
|
|
49
|
-
Provides-Extra: dev
|
|
50
|
-
Requires-Dist: pytest>=7.0; extra == "dev"
|
|
51
|
-
Requires-Dist: pytest-xdist>=3.0; extra == "dev"
|
|
52
|
-
Requires-Dist: pytest-asyncio>=0.23; extra == "dev"
|
|
53
|
-
Requires-Dist: scipy>=1.11; extra == "dev"
|
|
54
|
-
Requires-Dist: fastmcp>=2.0; python_version >= "3.10" and extra == "dev"
|
|
55
|
-
Requires-Dist: ruff>=0.4; extra == "dev"
|
|
56
|
-
Requires-Dist: build>=1.0; extra == "dev"
|
|
57
|
-
Requires-Dist: twine>=5.0; extra == "dev"
|
|
58
|
-
Dynamic: license-file
|
|
59
|
-
|
|
60
|
-
<div align="center">
|
|
61
|
-
|
|
62
|
-
# roam-code
|
|
63
|
-
|
|
64
|
-
**Architectural sight for AI coding agents — before they edit.**
|
|
65
|
-
|
|
66
|
-
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 181 specialised commands are advanced surface for specialised workflows.
|
|
67
|
-
|
|
68
|
-
*186 commands · 136 MCP tools · 27 languages · 100% local · zero API keys*
|
|
69
|
-
|
|
70
|
-
[](https://pypi.org/project/roam-code/)
|
|
71
|
-
[](https://github.com/Cranot/roam-code/stargazers)
|
|
72
|
-
[](https://github.com/Cranot/roam-code/actions/workflows/roam-ci.yml)
|
|
73
|
-
[](https://www.python.org/downloads/)
|
|
74
|
-
[](https://opensource.org/licenses/Apache-2.0)
|
|
75
|
-
|
|
76
|
-
</div>
|
|
77
|
-
|
|
78
|
-
---
|
|
79
|
-
|
|
80
|
-
## What is Roam?
|
|
81
|
-
|
|
82
|
-
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.
|
|
83
|
-
|
|
84
|
-
> **For teams running AI coding agents:** Roam ships two paid layers on top of the free CLI — **[Roam Agent Review](#roam-agent-review-pr-bot-for-ai-generated-changes)** (PR bot scoring AI-generated changes for structural risk) and **[Roam Cloud Lite](#roam-cloud-lite-metrics-history-no-source-upload)** (metrics-history dashboard, no source code upload). Both run on the OSS engine and are licenced separately.
|
|
85
|
-
|
|
86
|
-
Unlike LSPs (editor-bound, language-specific) or Sourcegraph (hosted search), Roam provides architecture-level graph queries -- offline, cross-language, and compact. It goes beyond comprehension: Roam governs architecture through budget gates, simulates refactoring outcomes, orchestrates multi-agent swarms with zero-conflict guarantees, maps vulnerability reachability paths, and enables graph-level code editing without syntax errors.
|
|
87
|
-
|
|
88
|
-
```
|
|
89
|
-
Codebase ──> [Index] ──> Semantic Graph ──> 177 Commands ──> AI Agent
|
|
90
|
-
│ │ │
|
|
91
|
-
tree-sitter symbols comprehend
|
|
92
|
-
27 languages + edges govern
|
|
93
|
-
git history + metrics refactor
|
|
94
|
-
runtime traces + architecture orchestrate
|
|
95
|
-
```
|
|
96
|
-
|
|
97
|
-
### Start here — the 5 verbs that cover ~80% of agent workflows
|
|
98
|
-
|
|
99
|
-
```bash
|
|
100
|
-
pip install roam-code
|
|
101
|
-
|
|
102
|
-
cd your-repo/
|
|
103
|
-
roam understand # 1. landing pad — what is this codebase?
|
|
104
|
-
roam retrieve "where is auth?" # 2. graph-aware retrieval for free-form tasks
|
|
105
|
-
roam context AuthService # 3. exact files+lines to read before changing
|
|
106
|
-
roam preflight AuthService # 4. blast radius + tests + complexity check
|
|
107
|
-
git diff | roam critique # 5. patch verifier — clones-not-edited, hot-path
|
|
108
|
-
```
|
|
109
|
-
|
|
110
|
-
That's the full mental model. The other CLI surface — `taint`, `fleet`, `cga`, `simulate`, `mutate`, `partition`, `attest`, `eval-retrieve`, `oracle`, `py-types`, `py-modern`, `dark-matter`, `clones`, `propagation`, `fingerprint`, etc. — is advanced surface for specialised workflows; you'll never need most of them.
|
|
111
|
-
|
|
112
|
-
### The problem
|
|
113
|
-
|
|
114
|
-
Coding agents explore codebases inefficiently: dozens of grep/read cycles, high token cost, no structural understanding. Roam replaces this with one graph query:
|
|
115
|
-
|
|
116
|
-
```
|
|
117
|
-
$ roam context Flask
|
|
118
|
-
Callers: 47 Callees: 3
|
|
119
|
-
Affected tests: 31
|
|
120
|
-
|
|
121
|
-
Files to read:
|
|
122
|
-
src/flask/app.py:76-963 # definition
|
|
123
|
-
src/flask/__init__.py:1-15 # re-export
|
|
124
|
-
src/flask/testing.py:22-45 # caller: FlaskClient.__init__
|
|
125
|
-
tests/test_basic.py:12-30 # caller: test_app_factory
|
|
126
|
-
...12 more files
|
|
127
|
-
```
|
|
128
|
-
|
|
129
|
-
### Terminal demo
|
|
130
|
-
|
|
131
|
-

|
|
132
|
-
|
|
133
|
-
### Core commands
|
|
134
|
-
|
|
135
|
-
```bash
|
|
136
|
-
$ roam understand # full codebase briefing
|
|
137
|
-
$ roam context <name> # files-to-read with exact line ranges
|
|
138
|
-
$ roam retrieve "<task>" # graph-aware spans for free-form natural-language tasks
|
|
139
|
-
$ roam preflight <name> # blast radius + tests + complexity + architecture rules
|
|
140
|
-
$ roam critique # verify a patch (`git diff | roam critique`)
|
|
141
|
-
$ roam health # composite score (0-100)
|
|
142
|
-
$ roam diff # blast radius of uncommitted changes
|
|
143
|
-
```
|
|
144
|
-
|
|
145
|
-
## What's New in v12
|
|
146
|
-
|
|
147
|
-
### v12.1+ -- Boolean oracles, IDOR classifier, index portability + Django bridge
|
|
148
|
-
- **`roam oracle <name>`**: 5 boolean oracles for agents — 1-token yes/no answers (`symbol-exists`, `route-exists`, `is-test-only`, `is-reachable-from-entry`, `is-clone-of`). Direct counter to CKB v9.2's `symbolExists` pattern. MCP tools: `roam_oracle_*`.
|
|
149
|
-
- **`roam_taint_classify` (MCP only)**: LLM-augmented taint classification — runs `roam taint` then asks the agent's own model (via MCP sampling) to label each reachable finding as IDOR/AUTHZ/SQLI/XSS/etc. with confidence + reasoning. Counter to Semgrep Multimodal — same LLM-reasoning narrative without a hosted API key. Sequential for v12.1; concurrency-bounded gather lands in v12.2.
|
|
150
|
-
- **`roam index-export` / `roam index-import`**: portable, integrity-checked tarball format with manifest sha256 round-trip + optional cosign signing. Counter to Cursor's "92% similar codebase = reuse teammate's index" without a vendor cloud. Tamper-evident (manifest verifies index.db sha256 on import).
|
|
151
|
-
- **`roam eval-retrieve --emit-format coderag|beir`**: bench-portable JSONL emit for public leaderboard submission. CodeRAG-Bench-compatible `ctxs` array + BEIR-style trec_eval run files.
|
|
152
|
-
- **Django bridge**: full implicit-relationship resolution (admin→model, serializer→model, FK transitive, signal handlers, URL configs, Celery tasks, DRF routers). Ported from `@LukasBerka/roam-code` — credit Lukas Berka. New schema columns: `framework_type`, `field_type`, `field_metadata`. Post-resolver runs after graph metrics.
|
|
153
|
-
- **`worktree_git_env()`** (`git_utils.py`): `GIT_INDEX_FILE` override fixes `.git/index.lock` contention when parallel agents run roam in sibling worktrees. Wired into `discovery.py`, `git_stats.py`, `changed_files.py`. Ported from `@river-mounts/roam-code-sf` — credit Sam Hannan.
|
|
154
|
-
|
|
155
|
-
### v12.0 (released 2026-05-01) -- Retrieval substrate + patch verifier
|
|
156
|
-
- **`roam retrieve "<task>"`**: graph-aware context server. Hybrid first stage (FTS5) + structural reranker (personalised PageRank + clone-canonical signal + lexical baseline) + token-budget cap. Returns ranked spans with justification tags (`pagerank=...`, `clone_cluster=...`, `fts=...`) so callers can see *why* each span ranked. MCP tool: `roam_retrieve(task, budget, k, rerank, seed_files)`.
|
|
157
|
-
- **`roam critique`**: graph-grounded patch verifier. Pipe `git diff | roam critique` to get findings ranked by severity. The killer signal is **clones-not-edited**: for every changed symbol with persisted clone siblings outside the diff, we flag the sibling as a likely missed change. Plus a blast-radius caller-count finding. Exits 5 on high severity (CI-gateable). MCP tool: `roam_critique(diff_text)`.
|
|
158
|
-
- **`roam clones --persist`**: populate the `clone_pairs` and `clone_clusters` tables so downstream consumers (critique, retrieve) can query clones in O(1) instead of re-running detection.
|
|
159
|
-
- **`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.
|
|
160
|
-
- **`.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`.
|
|
161
|
-
- **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).
|
|
162
|
-
- **177 CLI commands, 128 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.
|
|
163
|
-
|
|
164
|
-
## What's New in v11
|
|
165
|
-
|
|
166
|
-
### v11.2 -- AST Clone Detection + Debug Artifact Rules
|
|
167
|
-
- **`roam clones`**: New AST structural clone detection via subtree hashing. Finds Type-2 clones (identical control flow, different identifiers/literals) with Jaccard similarity scoring, Union-Find clustering, and automated refactoring suggestions. More precise than the metric-based `duplicates` command.
|
|
168
|
-
- **9 debug artifact rules** (COR-560 through COR-568): Detect leftover `print()`, `breakpoint()`, `pdb.set_trace()`, `console.log()`, `debugger`, and `System.out.println()` in Python, JavaScript, TypeScript, and Java code. All use `ast_match` type with test file exemptions.
|
|
169
|
-
- **140 commands, 102 MCP tools** (at v11.2.0 release).
|
|
170
|
-
|
|
171
|
-
### v11.1.2 -- SQL + Scala Tier 1, 27 Languages
|
|
172
|
-
- **SQL DDL promoted to Tier 1** with dedicated `SqlExtractor` -- tables, columns, views, functions, triggers, schemas, types (enums), sequences, ALTER TABLE ADD COLUMN. Foreign keys produce graph edges; views and triggers reference source tables. Database-schema projects now work with `roam health`, `roam layers`, `roam impact`, `roam coupling` and all graph commands.
|
|
173
|
-
- **Scala promoted to Tier 1** with dedicated `ScalaExtractor` -- classes, traits, objects, case classes, sealed hierarchies, val/var properties, type aliases, imports, and inheritance. Full `extends` + `with` trait mixin resolution.
|
|
174
|
-
- **27 languages** with 16 dedicated Tier 1 extractors.
|
|
175
|
-
- `server.json` for official MCP Registry submission.
|
|
176
|
-
|
|
177
|
-
### v11.1.1 -- Command Quality Audit
|
|
178
|
-
- **Full command audit**: all 152 commands reviewed for usefulness, duplicates, and test coverage. ~20 bugs fixed, 21 new test files (700+ tests), every command docstring updated with cross-references to related commands.
|
|
179
|
-
- **Kotlin promoted to Tier 1** via new YAML-based declarative extractor architecture. Classes, interfaces, enums, objects, functions, methods, properties, and inheritance fully extracted.
|
|
180
|
-
- **7 new commands**: `roam congestion`, `roam adrs`, `roam flag-dead`, `roam test-scaffold`, `roam sbom`, `roam triage`, `roam ci-setup`.
|
|
181
|
-
- **CI templates**: `roam ci-setup` generates pipelines for GitHub Actions, GitLab CI, Azure Pipelines, Jenkins, and Bitbucket.
|
|
182
|
-
- **Bug fixes**: `--undocumented` mode in `intent` (wrong DB table), `--changed` flag in `verify` (was permanently dead), lazy-load violation in `visualize` (~500ms penalty), exit code inconsistency in `rules`, VERDICT-first convention enforced across all commands.
|
|
183
|
-
- **Code quality**: 15 unused variables removed, dead code swept (4 orphaned cmd files, 2 dead helper functions), algo detector false-positive rate reduced (regex-in-loop: 7 to 1, list-prepend deque suppression), 6 regex patterns pre-compiled for loop performance.
|
|
184
|
-
|
|
185
|
-
### v11.0 -- MCP v2 for Agent-First Workflows
|
|
186
|
-
- In-process MCP execution removes per-call subprocess overhead.
|
|
187
|
-
- 4 compound operations (`roam_explore`, `roam_prepare_change`, `roam_review_change`, `roam_diagnose_issue`) reduce multi-step agent workflows to single calls.
|
|
188
|
-
- Preset-based tool surfacing (`core`, `review`, `refactor`, `debug`, `architecture`, `full`) keeps default tool choice tight for agents while retaining full depth on demand.
|
|
189
|
-
- MCP tools now expose structured schemas and richer annotations for safer planner behavior.
|
|
190
|
-
- MCP token overhead for default core context dropped from ~36K to <3K tokens (about 92% reduction).
|
|
191
|
-
|
|
192
|
-
### Performance and Retrieval
|
|
193
|
-
- Symbol search moved to SQLite FTS5/BM25: typical search moved from seconds to tens of milliseconds on the indexed cohort (mileage varies by repo size and query selectivity — see `bench/retrieve/` for the methodology).
|
|
194
|
-
- Incremental indexing shifted from O(N) full-edge rebuild behavior to O(changed) updates.
|
|
195
|
-
- DB/runtime optimizations (`mmap_size`, safer large-graph guards, batched writes) reduce first-run and reindex friction on larger repos.
|
|
196
|
-
|
|
197
|
-
### CI, Governance, and Delivery
|
|
198
|
-
- GitHub Action supports quality gates, SARIF upload, sticky PR comments, and cache-aware execution.
|
|
199
|
-
- CI hardening includes changed-only analysis mode, trend-aware gates, and SARIF pre-upload guardrails (size/result caps + truncation signaling).
|
|
200
|
-
- Agent governance expanded with verification and AI-quality tooling (`roam verify`, `roam vibe-check`, `roam ai-readiness`, `roam ai-ratio`) for teams managing agent-written code.
|
|
201
|
-
|
|
202
|
-
## Best for
|
|
203
|
-
|
|
204
|
-
- **Agent-assisted coding** -- structured answers that reduce token usage vs raw file exploration
|
|
205
|
-
- **Large codebases (100+ files)** -- graph queries beat linear search at scale
|
|
206
|
-
- **Architecture governance** -- health scores, CI quality gates, budget enforcement, fitness functions
|
|
207
|
-
- **Safe refactoring** -- blast radius, affected tests, pre-change safety checks, graph-level editing
|
|
208
|
-
- **Multi-agent orchestration** -- partition codebases for parallel agent work with zero-conflict guarantees
|
|
209
|
-
- **Security analysis** -- vulnerability reachability mapping, auth gaps, CVE path tracing
|
|
210
|
-
- **Algorithm optimization** -- detect O(n^2) loops, N+1 queries, and 21 other anti-patterns with suggested fixes
|
|
211
|
-
- **Backend quality** -- auth gaps, missing indexes, over-fetching models, non-idempotent migrations, orphan routes, API drift
|
|
212
|
-
- **Runtime analysis** -- overlay production trace data onto the static graph for hotspot detection
|
|
213
|
-
- **Multi-repo projects** -- cross-repo API edge detection between frontend and backend
|
|
214
|
-
|
|
215
|
-
### When NOT to use Roam
|
|
216
|
-
|
|
217
|
-
- **Real-time type checking** -- use an LSP (pyright, gopls, tsserver). Roam is static and offline.
|
|
218
|
-
- **Small scripts (<10 files)** -- just read the files directly.
|
|
219
|
-
- **Pure text search** -- ripgrep is faster for raw string matching.
|
|
220
|
-
|
|
221
|
-
## Why use Roam
|
|
222
|
-
|
|
223
|
-
**Speed.** One command replaces 5-10 tool calls (in typical workflows). Under 0.5s for any query.
|
|
224
|
-
|
|
225
|
-
**Dependency-aware.** Computes structure, not string matches. Knows `Flask` has 47 dependents and 31 affected tests. `grep` knows it appears 847 times.
|
|
226
|
-
|
|
227
|
-
**LLM-optimized output.** Plain ASCII, compact abbreviations (`fn`, `cls`, `meth`), `--json` envelopes. Designed for agent consumption, not human decoration.
|
|
228
|
-
|
|
229
|
-
**Fully local.** No API keys, telemetry, or network calls. Works in air-gapped environments.
|
|
230
|
-
|
|
231
|
-
**Algorithm-aware.** Built-in catalog of 23 anti-patterns. Detects suboptimal algorithms (quadratic loops, N+1 queries, unbounded recursion) and suggests fixes with Big-O improvements and confidence scores. Receiver-aware loop-invariant analysis minimizes false positives.
|
|
232
|
-
|
|
233
|
-
**CI-ready.** `--json` output, `--gate` quality gates, GitHub Action, SARIF 2.1.0.
|
|
234
|
-
|
|
235
|
-
| | Without Roam | With Roam |
|
|
236
|
-
|--|-------------|-----------|
|
|
237
|
-
| Tool calls | 8 | **1** |
|
|
238
|
-
| Wall time | ~11s | **<0.5s** |
|
|
239
|
-
| Tokens consumed | ~15,000 | **~3,000** |
|
|
240
|
-
|
|
241
|
-
*Measured on a typical agent workflow in a 200-file Python project (Flask). See [benchmarks](#performance) for more.*
|
|
242
|
-
|
|
243
|
-
<details>
|
|
244
|
-
<summary><strong>Table of Contents</strong></summary>
|
|
245
|
-
|
|
246
|
-
**Getting Started:** [What is Roam?](#what-is-roam) · [What's New in v11](#whats-new-in-v11) · [Best for](#best-for) · [Why use Roam](#why-use-roam) · [Install](#install) · [Quick Start](#quick-start)
|
|
247
|
-
|
|
248
|
-
**Using Roam:** [Commands](#commands) · [Walkthrough](#walkthrough-investigating-a-codebase) · [AI Coding Tools](#integration-with-ai-coding-tools) · [MCP Server](#mcp-server)
|
|
249
|
-
|
|
250
|
-
**Operations:** [CI/CD Integration](#cicd-integration) · [SARIF Output](#sarif-output) · [For Teams](#for-teams)
|
|
251
|
-
|
|
252
|
-
**Reference:** [Language Support](#language-support) · [Performance](#performance) · [How It Works](#how-it-works) · [How Roam Compares](#how-roam-compares) · [FAQ](#faq)
|
|
253
|
-
|
|
254
|
-
**More:** [Limitations](#limitations) · [Troubleshooting](#troubleshooting) · [Update / Uninstall](#update--uninstall) · [Development](#development) · [Contributing](#contributing)
|
|
255
|
-
|
|
256
|
-
</details>
|
|
257
|
-
|
|
258
|
-
## Install
|
|
259
|
-
|
|
260
|
-
```bash
|
|
261
|
-
pip install roam-code
|
|
262
|
-
|
|
263
|
-
# Recommended: isolated environment
|
|
264
|
-
pipx install roam-code
|
|
265
|
-
# or
|
|
266
|
-
uv tool install roam-code
|
|
267
|
-
|
|
268
|
-
# From source
|
|
269
|
-
pip install git+https://github.com/Cranot/roam-code.git
|
|
270
|
-
```
|
|
271
|
-
|
|
272
|
-
Requires Python 3.9+. Works on Linux, macOS, and Windows.
|
|
273
|
-
|
|
274
|
-
> **Windows:** If `roam` is not found after installing with `uv`, run `uv tool update-shell` and restart your terminal.
|
|
275
|
-
|
|
276
|
-
### Docker (alpine-based)
|
|
277
|
-
|
|
278
|
-
```bash
|
|
279
|
-
docker build -t roam-code .
|
|
280
|
-
docker run --rm -v "$PWD:/workspace" roam-code index
|
|
281
|
-
docker run --rm -v "$PWD:/workspace" roam-code health
|
|
282
|
-
```
|
|
283
|
-
|
|
284
|
-
## Quick Start
|
|
285
|
-
|
|
286
|
-
```bash
|
|
287
|
-
cd your-project
|
|
288
|
-
roam init # indexes codebase, creates config + CI workflow
|
|
289
|
-
roam understand # full codebase briefing
|
|
290
|
-
```
|
|
291
|
-
|
|
292
|
-
First index takes ~5s for 200 files, ~15s for 1,000 files. Subsequent runs are incremental and near-instant.
|
|
293
|
-
|
|
294
|
-
**Next steps:**
|
|
295
|
-
|
|
296
|
-
- **Set up your AI agent:** `roam describe --write` (auto-detects CLAUDE.md, AGENTS.md, .cursor/rules, etc. — see [integration instructions](#integration-with-ai-coding-tools))
|
|
297
|
-
- **Explore:** `roam health` → `roam weather` → `roam map`
|
|
298
|
-
- **
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
roam
|
|
308
|
-
roam
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
<a href="#integration-with-ai-coding-tools">
|
|
321
|
-
<a href="#integration-with-ai-coding-tools">
|
|
322
|
-
<a href="#integration-with-ai-coding-tools">
|
|
323
|
-
<a href="#integration-with-ai-coding-tools">
|
|
324
|
-
<a href="#integration-with-ai-coding-tools">
|
|
325
|
-
<a href="#
|
|
326
|
-
<a href="#
|
|
327
|
-
<a href="#
|
|
328
|
-
<a href="#
|
|
329
|
-
</
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
|
344
|
-
|
|
345
|
-
| `roam
|
|
346
|
-
| `roam
|
|
347
|
-
| `roam
|
|
348
|
-
| `roam
|
|
349
|
-
| `roam
|
|
350
|
-
| `roam
|
|
351
|
-
| `roam
|
|
352
|
-
| `roam
|
|
353
|
-
| `roam
|
|
354
|
-
| `roam
|
|
355
|
-
| `roam
|
|
356
|
-
| `roam
|
|
357
|
-
| `roam
|
|
358
|
-
| `roam
|
|
359
|
-
| `roam
|
|
360
|
-
| `roam
|
|
361
|
-
| `roam
|
|
362
|
-
| `roam
|
|
363
|
-
| `roam
|
|
364
|
-
| `roam
|
|
365
|
-
| `roam
|
|
366
|
-
| `roam
|
|
367
|
-
| `roam
|
|
368
|
-
| `roam
|
|
369
|
-
| `roam
|
|
370
|
-
| `roam
|
|
371
|
-
| `roam
|
|
372
|
-
| `roam
|
|
373
|
-
| `roam
|
|
374
|
-
| `roam
|
|
375
|
-
| `roam
|
|
376
|
-
| `roam
|
|
377
|
-
| `roam
|
|
378
|
-
| `roam
|
|
379
|
-
| `roam
|
|
380
|
-
| `roam
|
|
381
|
-
| `roam
|
|
382
|
-
| `roam
|
|
383
|
-
| `roam
|
|
384
|
-
| `roam
|
|
385
|
-
| `roam
|
|
386
|
-
| `roam
|
|
387
|
-
| `roam
|
|
388
|
-
| `roam
|
|
389
|
-
| `roam
|
|
390
|
-
| `roam
|
|
391
|
-
| `roam
|
|
392
|
-
| `roam
|
|
393
|
-
| `roam
|
|
394
|
-
| `roam
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
|
402
|
-
|
|
403
|
-
| `roam
|
|
404
|
-
| `roam
|
|
405
|
-
| `roam
|
|
406
|
-
| `roam
|
|
407
|
-
| `roam
|
|
408
|
-
| `roam
|
|
409
|
-
| `roam
|
|
410
|
-
| `roam
|
|
411
|
-
| `roam
|
|
412
|
-
| `roam
|
|
413
|
-
| `roam
|
|
414
|
-
| `roam
|
|
415
|
-
| `roam
|
|
416
|
-
| `roam
|
|
417
|
-
| `roam
|
|
418
|
-
| `roam
|
|
419
|
-
| `roam
|
|
420
|
-
| `roam
|
|
421
|
-
| `roam
|
|
422
|
-
| `roam
|
|
423
|
-
| `roam
|
|
424
|
-
| `roam
|
|
425
|
-
| `roam
|
|
426
|
-
| `roam
|
|
427
|
-
| `roam
|
|
428
|
-
| `roam
|
|
429
|
-
| `roam
|
|
430
|
-
| `roam
|
|
431
|
-
| `roam
|
|
432
|
-
| `roam
|
|
433
|
-
| `roam
|
|
434
|
-
| `roam
|
|
435
|
-
| `roam
|
|
436
|
-
| `roam
|
|
437
|
-
| `roam
|
|
438
|
-
| `roam
|
|
439
|
-
| `roam
|
|
440
|
-
| `roam
|
|
441
|
-
| `roam
|
|
442
|
-
| `roam
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
|
450
|
-
|
|
451
|
-
| `roam
|
|
452
|
-
| `roam
|
|
453
|
-
| `roam
|
|
454
|
-
| `roam
|
|
455
|
-
| `roam
|
|
456
|
-
| `roam
|
|
457
|
-
| `roam
|
|
458
|
-
| `roam
|
|
459
|
-
| `roam
|
|
460
|
-
| `roam
|
|
461
|
-
| `roam
|
|
462
|
-
| `roam
|
|
463
|
-
| `roam
|
|
464
|
-
| `roam
|
|
465
|
-
| `roam
|
|
466
|
-
| `roam
|
|
467
|
-
| `roam
|
|
468
|
-
| `roam
|
|
469
|
-
| `roam
|
|
470
|
-
| `roam
|
|
471
|
-
| `roam
|
|
472
|
-
|
|
473
|
-
<
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
|
514
|
-
|
|
515
|
-
|
|
|
516
|
-
|
|
|
517
|
-
|
|
|
518
|
-
|
|
|
519
|
-
|
|
|
520
|
-
|
|
|
521
|
-
|
|
|
522
|
-
|
|
|
523
|
-
|
|
|
524
|
-
|
|
|
525
|
-
|
|
|
526
|
-
|
|
|
527
|
-
|
|
|
528
|
-
|
|
|
529
|
-
|
|
|
530
|
-
|
|
|
531
|
-
|
|
|
532
|
-
|
|
|
533
|
-
|
|
|
534
|
-
|
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
roam algo --task
|
|
543
|
-
roam --
|
|
544
|
-
roam
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
roam minimap
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
|
617
|
-
|
|
618
|
-
| `roam
|
|
619
|
-
| `roam
|
|
620
|
-
| `roam
|
|
621
|
-
| `roam
|
|
622
|
-
| `roam
|
|
623
|
-
| `roam
|
|
624
|
-
| `roam
|
|
625
|
-
| `roam
|
|
626
|
-
| `roam
|
|
627
|
-
| `roam
|
|
628
|
-
| `roam
|
|
629
|
-
| `roam
|
|
630
|
-
| `roam
|
|
631
|
-
| `roam
|
|
632
|
-
| `roam
|
|
633
|
-
| `roam
|
|
634
|
-
| `roam
|
|
635
|
-
| `roam
|
|
636
|
-
| `roam
|
|
637
|
-
| `roam
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
|
645
|
-
|
|
646
|
-
| `roam
|
|
647
|
-
| `roam
|
|
648
|
-
| `roam
|
|
649
|
-
| `roam
|
|
650
|
-
| `roam
|
|
651
|
-
| `roam
|
|
652
|
-
| `roam
|
|
653
|
-
| `roam
|
|
654
|
-
| `roam
|
|
655
|
-
| `roam
|
|
656
|
-
| `roam
|
|
657
|
-
| `roam
|
|
658
|
-
| `roam
|
|
659
|
-
| `roam
|
|
660
|
-
| `roam
|
|
661
|
-
| `roam
|
|
662
|
-
| `roam
|
|
663
|
-
| `roam
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
|
671
|
-
|
|
672
|
-
| `roam
|
|
673
|
-
| `roam
|
|
674
|
-
| `roam
|
|
675
|
-
| `roam
|
|
676
|
-
| `roam
|
|
677
|
-
| `roam
|
|
678
|
-
| `roam
|
|
679
|
-
| `roam
|
|
680
|
-
| `roam
|
|
681
|
-
| `roam
|
|
682
|
-
| `roam
|
|
683
|
-
| `roam
|
|
684
|
-
| `roam
|
|
685
|
-
| `roam
|
|
686
|
-
| `roam
|
|
687
|
-
| `roam
|
|
688
|
-
| `roam
|
|
689
|
-
| `roam
|
|
690
|
-
| `roam
|
|
691
|
-
| `roam
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
|
699
|
-
|
|
700
|
-
| `roam ws
|
|
701
|
-
| `roam ws
|
|
702
|
-
| `roam ws
|
|
703
|
-
| `roam ws
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
|
711
|
-
|
|
712
|
-
| `roam
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
meth
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
|
|
811
|
-
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
$ roam
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
|
|
874
|
-
|
|
|
875
|
-
|
|
876
|
-
|
|
|
877
|
-
| Need to
|
|
878
|
-
|
|
|
879
|
-
|
|
|
880
|
-
|
|
|
881
|
-
|
|
|
882
|
-
|
|
|
883
|
-
|
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
roam
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
|
|
900
|
-
|
|
901
|
-
|
|
902
|
-
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
```
|
|
906
|
-
|
|
907
|
-
|
|
908
|
-
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
|
|
920
|
-
|
|
921
|
-
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
`roam
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
|
|
931
|
-
|
|
932
|
-
|
|
933
|
-
|
|
934
|
-
|
|
935
|
-
|
|
936
|
-
|
|
937
|
-
|
|
938
|
-
|
|
939
|
-
|
|
|
940
|
-
|
|
941
|
-
| **
|
|
942
|
-
| **
|
|
943
|
-
| **
|
|
944
|
-
| **
|
|
945
|
-
| **
|
|
946
|
-
| **
|
|
947
|
-
|
|
948
|
-
|
|
949
|
-
|
|
950
|
-
|
|
951
|
-
|
|
952
|
-
|
|
953
|
-
|
|
954
|
-
|
|
955
|
-
|
|
956
|
-
|
|
|
957
|
-
|
|
958
|
-
| "
|
|
959
|
-
| "
|
|
960
|
-
| "
|
|
961
|
-
| "
|
|
962
|
-
| "
|
|
963
|
-
| "
|
|
964
|
-
|
|
965
|
-
|
|
966
|
-
|
|
967
|
-
|
|
968
|
-
|
|
969
|
-
|
|
970
|
-
|
|
971
|
-
|
|
972
|
-
|
|
973
|
-
|
|
974
|
-
```
|
|
975
|
-
|
|
976
|
-
|
|
977
|
-
|
|
978
|
-
|
|
979
|
-
|
|
980
|
-
|
|
981
|
-
|
|
982
|
-
-
|
|
983
|
-
|
|
984
|
-
|
|
985
|
-
-
|
|
986
|
-
|
|
987
|
-
|
|
988
|
-
- **
|
|
989
|
-
- **
|
|
990
|
-
|
|
991
|
-
**
|
|
992
|
-
|
|
993
|
-
|
|
994
|
-
|
|
995
|
-
|
|
996
|
-
|
|
997
|
-
#
|
|
998
|
-
|
|
999
|
-
|
|
1000
|
-
#
|
|
1001
|
-
|
|
1002
|
-
|
|
1003
|
-
|
|
1004
|
-
|
|
1005
|
-
|
|
1006
|
-
|
|
1007
|
-
|
|
1008
|
-
|
|
1009
|
-
|
|
1010
|
-
|
|
1011
|
-
|
|
1012
|
-
|
|
1013
|
-
|
|
1014
|
-
|
|
|
1015
|
-
|
|
1016
|
-
| `
|
|
1017
|
-
| `
|
|
1018
|
-
| `
|
|
1019
|
-
| `
|
|
1020
|
-
| `
|
|
1021
|
-
| `
|
|
1022
|
-
| `
|
|
1023
|
-
| `
|
|
1024
|
-
| `
|
|
1025
|
-
| `
|
|
1026
|
-
| `
|
|
1027
|
-
| `
|
|
1028
|
-
| `
|
|
1029
|
-
| `
|
|
1030
|
-
| `
|
|
1031
|
-
| `
|
|
1032
|
-
| `
|
|
1033
|
-
| `
|
|
1034
|
-
| `
|
|
1035
|
-
| `
|
|
1036
|
-
| `
|
|
1037
|
-
| `
|
|
1038
|
-
| `
|
|
1039
|
-
| `
|
|
1040
|
-
| `
|
|
1041
|
-
| `
|
|
1042
|
-
| `
|
|
1043
|
-
| `
|
|
1044
|
-
| `
|
|
1045
|
-
| `
|
|
1046
|
-
| `
|
|
1047
|
-
| `
|
|
1048
|
-
| `
|
|
1049
|
-
| `
|
|
1050
|
-
| `
|
|
1051
|
-
| `
|
|
1052
|
-
| `
|
|
1053
|
-
| `
|
|
1054
|
-
| `
|
|
1055
|
-
| `
|
|
1056
|
-
| `
|
|
1057
|
-
| `
|
|
1058
|
-
| `
|
|
1059
|
-
| `
|
|
1060
|
-
| `
|
|
1061
|
-
| `
|
|
1062
|
-
| `
|
|
1063
|
-
| `
|
|
1064
|
-
| `
|
|
1065
|
-
| `
|
|
1066
|
-
| `
|
|
1067
|
-
| `
|
|
1068
|
-
| `
|
|
1069
|
-
| `
|
|
1070
|
-
| `
|
|
1071
|
-
| `
|
|
1072
|
-
| `
|
|
1073
|
-
| `
|
|
1074
|
-
| `
|
|
1075
|
-
| `
|
|
1076
|
-
| `
|
|
1077
|
-
| `
|
|
1078
|
-
| `
|
|
1079
|
-
| `
|
|
1080
|
-
| `
|
|
1081
|
-
| `
|
|
1082
|
-
| `
|
|
1083
|
-
| `
|
|
1084
|
-
| `
|
|
1085
|
-
| `
|
|
1086
|
-
| `
|
|
1087
|
-
| `
|
|
1088
|
-
| `
|
|
1089
|
-
| `
|
|
1090
|
-
| `
|
|
1091
|
-
| `
|
|
1092
|
-
| `
|
|
1093
|
-
| `
|
|
1094
|
-
| `
|
|
1095
|
-
| `
|
|
1096
|
-
| `
|
|
1097
|
-
| `
|
|
1098
|
-
| `
|
|
1099
|
-
| `
|
|
1100
|
-
| `
|
|
1101
|
-
| `
|
|
1102
|
-
| `
|
|
1103
|
-
| `
|
|
1104
|
-
| `
|
|
1105
|
-
| `
|
|
1106
|
-
| `
|
|
1107
|
-
| `
|
|
1108
|
-
| `
|
|
1109
|
-
| `
|
|
1110
|
-
| `
|
|
1111
|
-
| `
|
|
1112
|
-
| `
|
|
1113
|
-
| `
|
|
1114
|
-
| `
|
|
1115
|
-
| `
|
|
1116
|
-
| `
|
|
1117
|
-
| `
|
|
1118
|
-
| `
|
|
1119
|
-
| `
|
|
1120
|
-
| `
|
|
1121
|
-
| `
|
|
1122
|
-
| `
|
|
1123
|
-
| `
|
|
1124
|
-
| `
|
|
1125
|
-
| `
|
|
1126
|
-
| `
|
|
1127
|
-
| `
|
|
1128
|
-
| `
|
|
1129
|
-
| `
|
|
1130
|
-
| `
|
|
1131
|
-
| `
|
|
1132
|
-
| `
|
|
1133
|
-
| `
|
|
1134
|
-
| `
|
|
1135
|
-
| `
|
|
1136
|
-
| `
|
|
1137
|
-
| `
|
|
1138
|
-
| `
|
|
1139
|
-
| `
|
|
1140
|
-
| `
|
|
1141
|
-
| `
|
|
1142
|
-
| `
|
|
1143
|
-
| `
|
|
1144
|
-
| `
|
|
1145
|
-
| `
|
|
1146
|
-
| `
|
|
1147
|
-
| `
|
|
1148
|
-
| `
|
|
1149
|
-
|
|
1150
|
-
|
|
1151
|
-
|
|
1152
|
-
|
|
1153
|
-
|
|
1154
|
-
|
|
1155
|
-
|
|
1156
|
-
|
|
1157
|
-
|
|
1158
|
-
|
|
1159
|
-
|
|
1160
|
-
|
|
1161
|
-
|
|
1162
|
-
|
|
1163
|
-
|
|
1164
|
-
|
|
1165
|
-
|
|
1166
|
-
|
|
1167
|
-
|
|
1168
|
-
|
|
1169
|
-
|
|
1170
|
-
|
|
1171
|
-
|
|
1172
|
-
|
|
1173
|
-
|
|
1174
|
-
|
|
1175
|
-
|
|
1176
|
-
|
|
1177
|
-
|
|
1178
|
-
|
|
1179
|
-
|
|
1180
|
-
|
|
1181
|
-
|
|
1182
|
-
|
|
1183
|
-
|
|
1184
|
-
|
|
1185
|
-
|
|
1186
|
-
|
|
1187
|
-
|
|
1188
|
-
|
|
1189
|
-
|
|
1190
|
-
|
|
1191
|
-
|
|
1192
|
-
|
|
1193
|
-
|
|
1194
|
-
|
|
1195
|
-
|
|
1196
|
-
|
|
1197
|
-
|
|
1198
|
-
|
|
1199
|
-
|
|
1200
|
-
|
|
1201
|
-
|
|
1202
|
-
|
|
1203
|
-
|
|
1204
|
-
|
|
1205
|
-
|
|
1206
|
-
|
|
1207
|
-
|
|
1208
|
-
|
|
1209
|
-
|
|
1210
|
-
|
|
1211
|
-
|
|
1212
|
-
|
|
1213
|
-
|
|
1214
|
-
|
|
1215
|
-
|
|
1216
|
-
|
|
1217
|
-
|
|
1218
|
-
|
|
1219
|
-
|
|
1220
|
-
|
|
1221
|
-
|
|
1222
|
-
|
|
1223
|
-
|
|
1224
|
-
|
|
1225
|
-
|
|
1226
|
-
|
|
1227
|
-
|
|
1228
|
-
|
|
1229
|
-
|
|
1230
|
-
|
|
1231
|
-
|
|
1232
|
-
|
|
1233
|
-
|
|
1234
|
-
|
|
1235
|
-
|
|
1236
|
-
|
|
1237
|
-
|
|
1238
|
-
|
|
1239
|
-
|
|
1240
|
-
|
|
1241
|
-
|
|
1242
|
-
roam pr-analyze --
|
|
1243
|
-
roam
|
|
1244
|
-
|
|
1245
|
-
|
|
1246
|
-
|
|
1247
|
-
|
|
1248
|
-
```
|
|
1249
|
-
|
|
1250
|
-
|
|
1251
|
-
|
|
1252
|
-
|
|
1253
|
-
|
|
1254
|
-
|
|
1255
|
-
|
|
1256
|
-
|
|
1257
|
-
|
|
1258
|
-
|
|
1259
|
-
|
|
1260
|
-
|
|
1261
|
-
|
|
1262
|
-
|
|
1263
|
-
|
|
1264
|
-
|
|
1265
|
-
|
|
1266
|
-
|
|
1267
|
-
A
|
|
1268
|
-
|
|
1269
|
-
|
|
1270
|
-
|
|
1271
|
-
|
|
1272
|
-
|
|
1273
|
-
|
|
1274
|
-
|
|
1275
|
-
roam metrics-push --token
|
|
1276
|
-
|
|
1277
|
-
```
|
|
1278
|
-
|
|
1279
|
-
|
|
1280
|
-
|
|
1281
|
-
|
|
1282
|
-
|
|
1283
|
-
|
|
1284
|
-
|
|
1285
|
-
|
|
1286
|
-
|
|
1287
|
-
|
|
1288
|
-
|
|
1289
|
-
|
|
1290
|
-
|
|
1291
|
-
|
|
1292
|
-
|
|
1293
|
-
|
|
1294
|
-
|
|
1295
|
-
|
|
1296
|
-
|
|
1297
|
-
|
|
1298
|
-
|
|
1299
|
-
|
|
1300
|
-
|
|
1301
|
-
|
|
1302
|
-
- uses:
|
|
1303
|
-
with:
|
|
1304
|
-
|
|
1305
|
-
|
|
1306
|
-
|
|
1307
|
-
|
|
1308
|
-
|
|
1309
|
-
|
|
1310
|
-
|
|
1311
|
-
|
|
1312
|
-
|
|
1313
|
-
|
|
1314
|
-
|
|
1315
|
-
|
|
1316
|
-
|
|
|
1317
|
-
|
|
1318
|
-
| `
|
|
1319
|
-
| `
|
|
1320
|
-
| `
|
|
1321
|
-
| `
|
|
1322
|
-
|
|
1323
|
-
|
|
1324
|
-
|
|
1325
|
-
|
|
1326
|
-
|
|
1327
|
-
|
|
1328
|
-
|
|
1329
|
-
|
|
1330
|
-
|
|
1331
|
-
|
|
1332
|
-
|
|
1333
|
-
|
|
1334
|
-
|
|
1335
|
-
-
|
|
1336
|
-
|
|
1337
|
-
|
|
1338
|
-
|
|
1339
|
-
|
|
1340
|
-
|
|
1341
|
-
|
|
1342
|
-
|
|
1343
|
-
|
|
1344
|
-
|
|
1345
|
-
|
|
1346
|
-
|
|
1347
|
-
|
|
1348
|
-
|
|
1349
|
-
|
|
1350
|
-
|
|
1351
|
-
|
|
1352
|
-
|
|
1353
|
-
|
|
1354
|
-
|
|
1355
|
-
|
|
1356
|
-
|
|
1357
|
-
|
|
1358
|
-
|
|
1359
|
-
|
|
1360
|
-
|
|
1361
|
-
|
|
1362
|
-
|
|
1363
|
-
|
|
1364
|
-
|
|
1365
|
-
|
|
1366
|
-
|
|
1367
|
-
|
|
1368
|
-
|
|
1369
|
-
|
|
1370
|
-
|
|
1371
|
-
|
|
1372
|
-
|
|
1373
|
-
|
|
1374
|
-
```
|
|
1375
|
-
|
|
1376
|
-
|
|
1377
|
-
|
|
1378
|
-
|
|
1379
|
-
|
|
1380
|
-
|
|
1381
|
-
|
|
1382
|
-
|
|
1383
|
-
|
|
1384
|
-
|
|
|
1385
|
-
|
|
1386
|
-
|
|
1387
|
-
|
|
1388
|
-
|
|
1389
|
-
|
|
1390
|
-
|
|
1391
|
-
|
|
1392
|
-
|
|
1393
|
-
|
|
1394
|
-
**
|
|
1395
|
-
|
|
1396
|
-
|
|
1397
|
-
|
|
1398
|
-
|
|
1399
|
-
|
|
1400
|
-
|
|
1401
|
-
|
|
1402
|
-
|
|
1403
|
-
|
|
1404
|
-
|
|
1405
|
-
|
|
|
1406
|
-
|
|
1407
|
-
|
|
1408
|
-
|
|
1409
|
-
|
|
1410
|
-
|
|
1411
|
-
|
|
1412
|
-
|
|
1413
|
-
|
|
1414
|
-
|
|
1415
|
-
|
|
1416
|
-
|
|
1417
|
-
|
|
1418
|
-
|
|
|
1419
|
-
|
|
1420
|
-
|
|
|
1421
|
-
|
|
|
1422
|
-
|
|
|
1423
|
-
|
|
|
1424
|
-
|
|
|
1425
|
-
|
|
|
1426
|
-
|
|
|
1427
|
-
|
|
|
1428
|
-
|
|
|
1429
|
-
|
|
|
1430
|
-
|
|
1431
|
-
|
|
1432
|
-
|
|
1433
|
-
|
|
1434
|
-
|
|
1435
|
-
|
|
1436
|
-
|
|
1437
|
-
|
|
1438
|
-
|
|
|
1439
|
-
|
|
1440
|
-
|
|
|
1441
|
-
|
|
1442
|
-
|
|
1443
|
-
|
|
1444
|
-
|
|
1445
|
-
|
|
1446
|
-
|
|
1447
|
-
|
|
1448
|
-
|
|
1449
|
-
|
|
1450
|
-
|
|
|
1451
|
-
|
|
|
1452
|
-
|
|
|
1453
|
-
|
|
1454
|
-
|
|
1455
|
-
|
|
1456
|
-
|
|
|
1457
|
-
|
|
1458
|
-
|
|
1459
|
-
|
|
1460
|
-
|
|
|
1461
|
-
|
|
1462
|
-
|
|
1463
|
-
|
|
1464
|
-
<
|
|
1465
|
-
|
|
1466
|
-
|
|
1467
|
-
|
|
1468
|
-
|
|
1469
|
-
|
|
1470
|
-
|
|
1471
|
-
|
|
1472
|
-
|
|
|
1473
|
-
|
|
1474
|
-
|
|
|
1475
|
-
|
|
1476
|
-
|
|
1477
|
-
|
|
1478
|
-
|
|
|
1479
|
-
|
|
1480
|
-
|
|
1481
|
-
|
|
1482
|
-
|
|
|
1483
|
-
|
|
1484
|
-
|
|
|
1485
|
-
|
|
1486
|
-
|
|
1487
|
-
|
|
1488
|
-
|
|
|
1489
|
-
|
|
1490
|
-
|
|
1491
|
-
|
|
1492
|
-
|
|
|
1493
|
-
|
|
1494
|
-
|
|
1495
|
-
|
|
1496
|
-
|
|
1497
|
-
|
|
1498
|
-
|
|
1499
|
-
|
|
1500
|
-
|
|
1501
|
-
|
|
1502
|
-
|
|
1503
|
-
|
|
1504
|
-
|
|
1505
|
-
|
|
1506
|
-
|
|
1507
|
-
|
|
|
1508
|
-
[
|
|
1509
|
-
|
|
|
1510
|
-
[
|
|
1511
|
-
|
|
|
1512
|
-
[
|
|
1513
|
-
|
|
|
1514
|
-
[
|
|
1515
|
-
|
|
|
1516
|
-
[
|
|
1517
|
-
|
|
|
1518
|
-
[
|
|
1519
|
-
|
|
|
1520
|
-
[
|
|
1521
|
-
|
|
|
1522
|
-
[
|
|
1523
|
-
|
|
1524
|
-
|
|
1525
|
-
|
|
1526
|
-
|
|
1527
|
-
|
|
1528
|
-
|
|
1529
|
-
|
|
1530
|
-
|
|
1531
|
-
|
|
1532
|
-
|
|
1533
|
-
|
|
1534
|
-
|
|
1535
|
-
|
|
|
1536
|
-
|
|
1537
|
-
|
|
|
1538
|
-
|
|
|
1539
|
-
|
|
|
1540
|
-
|
|
|
1541
|
-
|
|
|
1542
|
-
|
|
1543
|
-
|
|
1544
|
-
|
|
1545
|
-
|
|
1546
|
-
|
|
1547
|
-
|
|
1548
|
-
|
|
1549
|
-
|
|
1550
|
-
|
|
1551
|
-
|
|
1552
|
-
|
|
1553
|
-
|
|
1554
|
-
|
|
1555
|
-
|
|
1556
|
-
|
|
1557
|
-
|
|
1558
|
-
|
|
1559
|
-
|
|
1560
|
-
|
|
1561
|
-
|
|
1562
|
-
|
|
1563
|
-
|
|
1564
|
-
|
|
1565
|
-
- **
|
|
1566
|
-
- **
|
|
1567
|
-
- **
|
|
1568
|
-
- **
|
|
1569
|
-
- **
|
|
1570
|
-
- **
|
|
1571
|
-
- **
|
|
1572
|
-
- **
|
|
1573
|
-
- **
|
|
1574
|
-
- **
|
|
1575
|
-
- **
|
|
1576
|
-
- **
|
|
1577
|
-
- **
|
|
1578
|
-
- **
|
|
1579
|
-
- **
|
|
1580
|
-
- **
|
|
1581
|
-
|
|
1582
|
-
|
|
1583
|
-
|
|
1584
|
-
|
|
1585
|
-
|
|
1586
|
-
|
|
1587
|
-
|
|
1588
|
-
|
|
1589
|
-
|
|
1590
|
-
|
|
1591
|
-
|
|
1592
|
-
|
|
1593
|
-
|
|
|
1594
|
-
|
|
1595
|
-
|
|
|
1596
|
-
|
|
1597
|
-
|
|
1598
|
-
|
|
1599
|
-
|
|
1600
|
-
|
|
1601
|
-
|
|
1602
|
-
|
|
1603
|
-
|
|
1604
|
-
|
|
1605
|
-
|
|
1606
|
-
|
|
1607
|
-
-
|
|
1608
|
-
|
|
1609
|
-
|
|
1610
|
-
|
|
1611
|
-
|
|
1612
|
-
|
|
1613
|
-
|
|
1614
|
-
|
|
1615
|
-
|
|
|
1616
|
-
|
|
1617
|
-
|
|
|
1618
|
-
|
|
|
1619
|
-
|
|
|
1620
|
-
|
|
|
1621
|
-
|
|
|
1622
|
-
|
|
|
1623
|
-
|
|
|
1624
|
-
|
|
|
1625
|
-
|
|
1626
|
-
|
|
1627
|
-
|
|
1628
|
-
|
|
1629
|
-
|
|
1630
|
-
|
|
1631
|
-
|
|
1632
|
-
|
|
1633
|
-
|
|
1634
|
-
|
|
1635
|
-
**
|
|
1636
|
-
|
|
1637
|
-
|
|
1638
|
-
|
|
1639
|
-
|
|
1640
|
-
|
|
1641
|
-
|
|
1642
|
-
|
|
1643
|
-
|
|
1644
|
-
|
|
1645
|
-
|
|
1646
|
-
|
|
1647
|
-
|
|
1648
|
-
|
|
1649
|
-
|
|
1650
|
-
|
|
1651
|
-
|
|
1652
|
-
|
|
1653
|
-
|
|
1654
|
-
|
|
1655
|
-
|
|
1656
|
-
|
|
1657
|
-
|
|
1658
|
-
|
|
1659
|
-
|
|
1660
|
-
|
|
1661
|
-
- **
|
|
1662
|
-
|
|
1663
|
-
|
|
1664
|
-
|
|
1665
|
-
|
|
1666
|
-
|
|
1667
|
-
|
|
1668
|
-
|
|
1669
|
-
|
|
|
1670
|
-
|
|
1671
|
-
|
|
|
1672
|
-
|
|
|
1673
|
-
|
|
|
1674
|
-
|
|
1675
|
-
|
|
1676
|
-
|
|
1677
|
-
|
|
1678
|
-
|
|
1679
|
-
|
|
1680
|
-
|
|
1681
|
-
|
|
1682
|
-
|
|
1683
|
-
|
|
1684
|
-
|
|
1685
|
-
|
|
1686
|
-
|
|
1687
|
-
|
|
1688
|
-
|
|
1689
|
-
|
|
1690
|
-
|
|
1691
|
-
|
|
1692
|
-
|
|
1693
|
-
|
|
1694
|
-
|
|
1695
|
-
|
|
1696
|
-
|
|
1697
|
-
|
|
1698
|
-
|
|
1699
|
-
|
|
1700
|
-
|
|
1701
|
-
|
|
1702
|
-
|
|
1703
|
-
|
|
1704
|
-
|
|
1705
|
-
|
|
1706
|
-
|
|
1707
|
-
|
|
1708
|
-
|
|
1709
|
-
|
|
1710
|
-
|
|
1711
|
-
|
|
1712
|
-
|
|
1713
|
-
|
|
1714
|
-
|
|
1715
|
-
|
|
1716
|
-
|
|
1717
|
-
│
|
|
1718
|
-
│
|
|
1719
|
-
│
|
|
1720
|
-
│ ├──
|
|
1721
|
-
│ │ ├──
|
|
1722
|
-
│ │ ├──
|
|
1723
|
-
│ │
|
|
1724
|
-
│
|
|
1725
|
-
│ │ ├──
|
|
1726
|
-
│ │ ├──
|
|
1727
|
-
│ │ ├──
|
|
1728
|
-
│ │ ├──
|
|
1729
|
-
│ │ ├──
|
|
1730
|
-
│ │
|
|
1731
|
-
│ ├──
|
|
1732
|
-
│ │ ├──
|
|
1733
|
-
│ │ ├──
|
|
1734
|
-
│ │
|
|
1735
|
-
│
|
|
1736
|
-
│ ├──
|
|
1737
|
-
│ │ ├──
|
|
1738
|
-
│ │ ├──
|
|
1739
|
-
│ │ └──
|
|
1740
|
-
│ ├──
|
|
1741
|
-
│ │ ├──
|
|
1742
|
-
│ │
|
|
1743
|
-
│
|
|
1744
|
-
│
|
|
1745
|
-
│ │ ├──
|
|
1746
|
-
│ │
|
|
1747
|
-
│
|
|
1748
|
-
│ ├──
|
|
1749
|
-
│ │ ├──
|
|
1750
|
-
│ │ ├──
|
|
1751
|
-
│ │
|
|
1752
|
-
│
|
|
1753
|
-
│ │ ├──
|
|
1754
|
-
│ │
|
|
1755
|
-
│ ├──
|
|
1756
|
-
│ │ ├──
|
|
1757
|
-
│ │ ├──
|
|
1758
|
-
│ │
|
|
1759
|
-
│
|
|
1760
|
-
│ │
|
|
1761
|
-
│ ├──
|
|
1762
|
-
│ │ ├──
|
|
1763
|
-
│ │
|
|
1764
|
-
│
|
|
1765
|
-
│
|
|
1766
|
-
│ │
|
|
1767
|
-
│
|
|
1768
|
-
│
|
|
1769
|
-
│ │ ├──
|
|
1770
|
-
│ │
|
|
1771
|
-
│
|
|
1772
|
-
│ ├──
|
|
1773
|
-
│ │ ├──
|
|
1774
|
-
│ │
|
|
1775
|
-
│
|
|
1776
|
-
│
|
|
1777
|
-
│ │ ├──
|
|
1778
|
-
│ │ └──
|
|
1779
|
-
│ ├──
|
|
1780
|
-
│ │ ├──
|
|
1781
|
-
│ │
|
|
1782
|
-
│ └──
|
|
1783
|
-
│
|
|
1784
|
-
│
|
|
1785
|
-
│
|
|
1786
|
-
└──
|
|
1787
|
-
|
|
1788
|
-
|
|
1789
|
-
|
|
1790
|
-
|
|
1791
|
-
|
|
1792
|
-
|
|
1793
|
-
|
|
1794
|
-
|
|
1795
|
-
|
|
1796
|
-
|
|
1797
|
-
|
|
|
1798
|
-
|
|
1799
|
-
|
|
1800
|
-
|
|
1801
|
-
|
|
1802
|
-
|
|
1803
|
-
|
|
1804
|
-
|
|
1805
|
-
|
|
1806
|
-
|
|
1807
|
-
|
|
1808
|
-
|
|
1809
|
-
|
|
1810
|
-
|
|
1811
|
-
|
|
1812
|
-
- [x]
|
|
1813
|
-
- [x]
|
|
1814
|
-
- [x]
|
|
1815
|
-
- [x]
|
|
1816
|
-
|
|
1817
|
-
|
|
1818
|
-
|
|
1819
|
-
- [x]
|
|
1820
|
-
|
|
1821
|
-
|
|
1822
|
-
|
|
1823
|
-
|
|
1824
|
-
|
|
1825
|
-
|
|
1826
|
-
|
|
1827
|
-
|
|
1828
|
-
|
|
1829
|
-
|
|
1830
|
-
|
|
1831
|
-
|
|
1832
|
-
|
|
1833
|
-
|
|
1834
|
-
|
|
1835
|
-
|
|
1836
|
-
|
|
1837
|
-
|
|
1838
|
-
|
|
1839
|
-
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: roam-code
|
|
3
|
+
Version: 12.27
|
|
4
|
+
Summary: Instant codebase comprehension for AI coding agents
|
|
5
|
+
Author: CosmoHac
|
|
6
|
+
License-Expression: Apache-2.0
|
|
7
|
+
Project-URL: Homepage, https://github.com/Cranot/roam-code
|
|
8
|
+
Project-URL: Documentation, https://cranot.github.io/roam-code/
|
|
9
|
+
Project-URL: Repository, https://github.com/Cranot/roam-code
|
|
10
|
+
Project-URL: Issues, https://github.com/Cranot/roam-code/issues
|
|
11
|
+
Project-URL: Changelog, https://github.com/Cranot/roam-code/blob/main/CHANGELOG.md
|
|
12
|
+
Keywords: code-intelligence,static-analysis,mcp-server,tree-sitter,architecture,code-graph,ai-coding,graph-analysis,code-quality,cli,codebase,code-analysis,ai-tools,mcp,sql
|
|
13
|
+
Classifier: Development Status :: 5 - Production/Stable
|
|
14
|
+
Classifier: Environment :: Console
|
|
15
|
+
Classifier: Intended Audience :: Developers
|
|
16
|
+
Classifier: Operating System :: OS Independent
|
|
17
|
+
Classifier: Programming Language :: Python :: 3
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.9
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
21
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
22
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
23
|
+
Classifier: Topic :: Software Development
|
|
24
|
+
Classifier: Topic :: Software Development :: Code Generators
|
|
25
|
+
Classifier: Topic :: Software Development :: Quality Assurance
|
|
26
|
+
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
27
|
+
Requires-Python: >=3.9
|
|
28
|
+
Description-Content-Type: text/markdown
|
|
29
|
+
License-File: LICENSE
|
|
30
|
+
Requires-Dist: click>=8.0
|
|
31
|
+
Requires-Dist: tree-sitter>=0.23
|
|
32
|
+
Requires-Dist: tree-sitter-language-pack<1.6.3,>=0.6
|
|
33
|
+
Requires-Dist: networkx>=3.0
|
|
34
|
+
Provides-Extra: mcp
|
|
35
|
+
Requires-Dist: fastmcp>=2.0; extra == "mcp"
|
|
36
|
+
Provides-Extra: semantic
|
|
37
|
+
Requires-Dist: numpy>=1.24; extra == "semantic"
|
|
38
|
+
Requires-Dist: onnxruntime>=1.16; extra == "semantic"
|
|
39
|
+
Requires-Dist: tokenizers>=0.15; extra == "semantic"
|
|
40
|
+
Provides-Extra: leiden
|
|
41
|
+
Requires-Dist: igraph>=0.11; extra == "leiden"
|
|
42
|
+
Requires-Dist: leidenalg>=0.10; extra == "leiden"
|
|
43
|
+
Provides-Extra: graph-fast
|
|
44
|
+
Requires-Dist: rustworkx>=0.14; extra == "graph-fast"
|
|
45
|
+
Provides-Extra: sbom
|
|
46
|
+
Requires-Dist: cyclonedx-python-lib>=8.0; extra == "sbom"
|
|
47
|
+
Provides-Extra: learned
|
|
48
|
+
Requires-Dist: lightgbm>=4.0; extra == "learned"
|
|
49
|
+
Provides-Extra: dev
|
|
50
|
+
Requires-Dist: pytest>=7.0; extra == "dev"
|
|
51
|
+
Requires-Dist: pytest-xdist>=3.0; extra == "dev"
|
|
52
|
+
Requires-Dist: pytest-asyncio>=0.23; extra == "dev"
|
|
53
|
+
Requires-Dist: scipy>=1.11; extra == "dev"
|
|
54
|
+
Requires-Dist: fastmcp>=2.0; python_version >= "3.10" and extra == "dev"
|
|
55
|
+
Requires-Dist: ruff>=0.4; extra == "dev"
|
|
56
|
+
Requires-Dist: build>=1.0; extra == "dev"
|
|
57
|
+
Requires-Dist: twine>=5.0; extra == "dev"
|
|
58
|
+
Dynamic: license-file
|
|
59
|
+
|
|
60
|
+
<div align="center">
|
|
61
|
+
|
|
62
|
+
# roam-code
|
|
63
|
+
|
|
64
|
+
**Architectural sight for AI coding agents — before they edit.**
|
|
65
|
+
|
|
66
|
+
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 181 specialised commands are advanced surface for specialised workflows.
|
|
67
|
+
|
|
68
|
+
*186 commands · 136 MCP tools · 27 languages · 100% local · zero API keys*
|
|
69
|
+
|
|
70
|
+
[](https://pypi.org/project/roam-code/)
|
|
71
|
+
[](https://github.com/Cranot/roam-code/stargazers)
|
|
72
|
+
[](https://github.com/Cranot/roam-code/actions/workflows/roam-ci.yml)
|
|
73
|
+
[](https://www.python.org/downloads/)
|
|
74
|
+
[](https://opensource.org/licenses/Apache-2.0)
|
|
75
|
+
|
|
76
|
+
</div>
|
|
77
|
+
|
|
78
|
+
---
|
|
79
|
+
|
|
80
|
+
## What is Roam?
|
|
81
|
+
|
|
82
|
+
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.
|
|
83
|
+
|
|
84
|
+
> **For teams running AI coding agents:** Roam ships two paid layers on top of the free CLI — **[Roam Agent Review](#roam-agent-review-pr-bot-for-ai-generated-changes)** (PR bot scoring AI-generated changes for structural risk) and **[Roam Cloud Lite](#roam-cloud-lite-metrics-history-no-source-upload)** (metrics-history dashboard, no source code upload). Both run on the OSS engine and are licenced separately.
|
|
85
|
+
|
|
86
|
+
Unlike LSPs (editor-bound, language-specific) or Sourcegraph (hosted search), Roam provides architecture-level graph queries -- offline, cross-language, and compact. It goes beyond comprehension: Roam governs architecture through budget gates, simulates refactoring outcomes, orchestrates multi-agent swarms with zero-conflict guarantees, maps vulnerability reachability paths, and enables graph-level code editing without syntax errors.
|
|
87
|
+
|
|
88
|
+
```
|
|
89
|
+
Codebase ──> [Index] ──> Semantic Graph ──> 177 Commands ──> AI Agent
|
|
90
|
+
│ │ │
|
|
91
|
+
tree-sitter symbols comprehend
|
|
92
|
+
27 languages + edges govern
|
|
93
|
+
git history + metrics refactor
|
|
94
|
+
runtime traces + architecture orchestrate
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
### Start here — the 5 verbs that cover ~80% of agent workflows
|
|
98
|
+
|
|
99
|
+
```bash
|
|
100
|
+
pip install roam-code
|
|
101
|
+
|
|
102
|
+
cd your-repo/
|
|
103
|
+
roam understand # 1. landing pad — what is this codebase?
|
|
104
|
+
roam retrieve "where is auth?" # 2. graph-aware retrieval for free-form tasks
|
|
105
|
+
roam context AuthService # 3. exact files+lines to read before changing
|
|
106
|
+
roam preflight AuthService # 4. blast radius + tests + complexity check
|
|
107
|
+
git diff | roam critique # 5. patch verifier — clones-not-edited, hot-path
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
That's the full mental model. The other CLI surface — `taint`, `fleet`, `cga`, `simulate`, `mutate`, `partition`, `attest`, `eval-retrieve`, `oracle`, `py-types`, `py-modern`, `dark-matter`, `clones`, `propagation`, `fingerprint`, etc. — is advanced surface for specialised workflows; you'll never need most of them.
|
|
111
|
+
|
|
112
|
+
### The problem
|
|
113
|
+
|
|
114
|
+
Coding agents explore codebases inefficiently: dozens of grep/read cycles, high token cost, no structural understanding. Roam replaces this with one graph query:
|
|
115
|
+
|
|
116
|
+
```
|
|
117
|
+
$ roam context Flask
|
|
118
|
+
Callers: 47 Callees: 3
|
|
119
|
+
Affected tests: 31
|
|
120
|
+
|
|
121
|
+
Files to read:
|
|
122
|
+
src/flask/app.py:76-963 # definition
|
|
123
|
+
src/flask/__init__.py:1-15 # re-export
|
|
124
|
+
src/flask/testing.py:22-45 # caller: FlaskClient.__init__
|
|
125
|
+
tests/test_basic.py:12-30 # caller: test_app_factory
|
|
126
|
+
...12 more files
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
### Terminal demo
|
|
130
|
+
|
|
131
|
+

|
|
132
|
+
|
|
133
|
+
### Core commands
|
|
134
|
+
|
|
135
|
+
```bash
|
|
136
|
+
$ roam understand # full codebase briefing
|
|
137
|
+
$ roam context <name> # files-to-read with exact line ranges
|
|
138
|
+
$ roam retrieve "<task>" # graph-aware spans for free-form natural-language tasks
|
|
139
|
+
$ roam preflight <name> # blast radius + tests + complexity + architecture rules
|
|
140
|
+
$ roam critique # verify a patch (`git diff | roam critique`)
|
|
141
|
+
$ roam health # composite score (0-100)
|
|
142
|
+
$ roam diff # blast radius of uncommitted changes
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
## What's New in v12
|
|
146
|
+
|
|
147
|
+
### v12.1+ -- Boolean oracles, IDOR classifier, index portability + Django bridge
|
|
148
|
+
- **`roam oracle <name>`**: 5 boolean oracles for agents — 1-token yes/no answers (`symbol-exists`, `route-exists`, `is-test-only`, `is-reachable-from-entry`, `is-clone-of`). Direct counter to CKB v9.2's `symbolExists` pattern. MCP tools: `roam_oracle_*`.
|
|
149
|
+
- **`roam_taint_classify` (MCP only)**: LLM-augmented taint classification — runs `roam taint` then asks the agent's own model (via MCP sampling) to label each reachable finding as IDOR/AUTHZ/SQLI/XSS/etc. with confidence + reasoning. Counter to Semgrep Multimodal — same LLM-reasoning narrative without a hosted API key. Sequential for v12.1; concurrency-bounded gather lands in v12.2.
|
|
150
|
+
- **`roam index-export` / `roam index-import`**: portable, integrity-checked tarball format with manifest sha256 round-trip + optional cosign signing. Counter to Cursor's "92% similar codebase = reuse teammate's index" without a vendor cloud. Tamper-evident (manifest verifies index.db sha256 on import).
|
|
151
|
+
- **`roam eval-retrieve --emit-format coderag|beir`**: bench-portable JSONL emit for public leaderboard submission. CodeRAG-Bench-compatible `ctxs` array + BEIR-style trec_eval run files.
|
|
152
|
+
- **Django bridge**: full implicit-relationship resolution (admin→model, serializer→model, FK transitive, signal handlers, URL configs, Celery tasks, DRF routers). Ported from `@LukasBerka/roam-code` — credit Lukas Berka. New schema columns: `framework_type`, `field_type`, `field_metadata`. Post-resolver runs after graph metrics.
|
|
153
|
+
- **`worktree_git_env()`** (`git_utils.py`): `GIT_INDEX_FILE` override fixes `.git/index.lock` contention when parallel agents run roam in sibling worktrees. Wired into `discovery.py`, `git_stats.py`, `changed_files.py`. Ported from `@river-mounts/roam-code-sf` — credit Sam Hannan.
|
|
154
|
+
|
|
155
|
+
### v12.0 (released 2026-05-01) -- Retrieval substrate + patch verifier
|
|
156
|
+
- **`roam retrieve "<task>"`**: graph-aware context server. Hybrid first stage (FTS5) + structural reranker (personalised PageRank + clone-canonical signal + lexical baseline) + token-budget cap. Returns ranked spans with justification tags (`pagerank=...`, `clone_cluster=...`, `fts=...`) so callers can see *why* each span ranked. MCP tool: `roam_retrieve(task, budget, k, rerank, seed_files)`.
|
|
157
|
+
- **`roam critique`**: graph-grounded patch verifier. Pipe `git diff | roam critique` to get findings ranked by severity. The killer signal is **clones-not-edited**: for every changed symbol with persisted clone siblings outside the diff, we flag the sibling as a likely missed change. Plus a blast-radius caller-count finding. Exits 5 on high severity (CI-gateable). MCP tool: `roam_critique(diff_text)`.
|
|
158
|
+
- **`roam clones --persist`**: populate the `clone_pairs` and `clone_clusters` tables so downstream consumers (critique, retrieve) can query clones in O(1) instead of re-running detection.
|
|
159
|
+
- **`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.
|
|
160
|
+
- **`.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`.
|
|
161
|
+
- **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).
|
|
162
|
+
- **177 CLI commands, 128 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.
|
|
163
|
+
|
|
164
|
+
## What's New in v11
|
|
165
|
+
|
|
166
|
+
### v11.2 -- AST Clone Detection + Debug Artifact Rules
|
|
167
|
+
- **`roam clones`**: New AST structural clone detection via subtree hashing. Finds Type-2 clones (identical control flow, different identifiers/literals) with Jaccard similarity scoring, Union-Find clustering, and automated refactoring suggestions. More precise than the metric-based `duplicates` command.
|
|
168
|
+
- **9 debug artifact rules** (COR-560 through COR-568): Detect leftover `print()`, `breakpoint()`, `pdb.set_trace()`, `console.log()`, `debugger`, and `System.out.println()` in Python, JavaScript, TypeScript, and Java code. All use `ast_match` type with test file exemptions.
|
|
169
|
+
- **140 commands, 102 MCP tools** (at v11.2.0 release).
|
|
170
|
+
|
|
171
|
+
### v11.1.2 -- SQL + Scala Tier 1, 27 Languages
|
|
172
|
+
- **SQL DDL promoted to Tier 1** with dedicated `SqlExtractor` -- tables, columns, views, functions, triggers, schemas, types (enums), sequences, ALTER TABLE ADD COLUMN. Foreign keys produce graph edges; views and triggers reference source tables. Database-schema projects now work with `roam health`, `roam layers`, `roam impact`, `roam coupling` and all graph commands.
|
|
173
|
+
- **Scala promoted to Tier 1** with dedicated `ScalaExtractor` -- classes, traits, objects, case classes, sealed hierarchies, val/var properties, type aliases, imports, and inheritance. Full `extends` + `with` trait mixin resolution.
|
|
174
|
+
- **27 languages** with 16 dedicated Tier 1 extractors.
|
|
175
|
+
- `server.json` for official MCP Registry submission.
|
|
176
|
+
|
|
177
|
+
### v11.1.1 -- Command Quality Audit
|
|
178
|
+
- **Full command audit**: all 152 commands reviewed for usefulness, duplicates, and test coverage. ~20 bugs fixed, 21 new test files (700+ tests), every command docstring updated with cross-references to related commands.
|
|
179
|
+
- **Kotlin promoted to Tier 1** via new YAML-based declarative extractor architecture. Classes, interfaces, enums, objects, functions, methods, properties, and inheritance fully extracted.
|
|
180
|
+
- **7 new commands**: `roam congestion`, `roam adrs`, `roam flag-dead`, `roam test-scaffold`, `roam sbom`, `roam triage`, `roam ci-setup`.
|
|
181
|
+
- **CI templates**: `roam ci-setup` generates pipelines for GitHub Actions, GitLab CI, Azure Pipelines, Jenkins, and Bitbucket.
|
|
182
|
+
- **Bug fixes**: `--undocumented` mode in `intent` (wrong DB table), `--changed` flag in `verify` (was permanently dead), lazy-load violation in `visualize` (~500ms penalty), exit code inconsistency in `rules`, VERDICT-first convention enforced across all commands.
|
|
183
|
+
- **Code quality**: 15 unused variables removed, dead code swept (4 orphaned cmd files, 2 dead helper functions), algo detector false-positive rate reduced (regex-in-loop: 7 to 1, list-prepend deque suppression), 6 regex patterns pre-compiled for loop performance.
|
|
184
|
+
|
|
185
|
+
### v11.0 -- MCP v2 for Agent-First Workflows
|
|
186
|
+
- In-process MCP execution removes per-call subprocess overhead.
|
|
187
|
+
- 4 compound operations (`roam_explore`, `roam_prepare_change`, `roam_review_change`, `roam_diagnose_issue`) reduce multi-step agent workflows to single calls.
|
|
188
|
+
- Preset-based tool surfacing (`core`, `review`, `refactor`, `debug`, `architecture`, `full`) keeps default tool choice tight for agents while retaining full depth on demand.
|
|
189
|
+
- MCP tools now expose structured schemas and richer annotations for safer planner behavior.
|
|
190
|
+
- MCP token overhead for default core context dropped from ~36K to <3K tokens (about 92% reduction).
|
|
191
|
+
|
|
192
|
+
### Performance and Retrieval
|
|
193
|
+
- Symbol search moved to SQLite FTS5/BM25: typical search moved from seconds to tens of milliseconds on the indexed cohort (mileage varies by repo size and query selectivity — see `bench/retrieve/` for the methodology).
|
|
194
|
+
- Incremental indexing shifted from O(N) full-edge rebuild behavior to O(changed) updates.
|
|
195
|
+
- DB/runtime optimizations (`mmap_size`, safer large-graph guards, batched writes) reduce first-run and reindex friction on larger repos.
|
|
196
|
+
|
|
197
|
+
### CI, Governance, and Delivery
|
|
198
|
+
- GitHub Action supports quality gates, SARIF upload, sticky PR comments, and cache-aware execution.
|
|
199
|
+
- CI hardening includes changed-only analysis mode, trend-aware gates, and SARIF pre-upload guardrails (size/result caps + truncation signaling).
|
|
200
|
+
- Agent governance expanded with verification and AI-quality tooling (`roam verify`, `roam vibe-check`, `roam ai-readiness`, `roam ai-ratio`) for teams managing agent-written code.
|
|
201
|
+
|
|
202
|
+
## Best for
|
|
203
|
+
|
|
204
|
+
- **Agent-assisted coding** -- structured answers that reduce token usage vs raw file exploration
|
|
205
|
+
- **Large codebases (100+ files)** -- graph queries beat linear search at scale
|
|
206
|
+
- **Architecture governance** -- health scores, CI quality gates, budget enforcement, fitness functions
|
|
207
|
+
- **Safe refactoring** -- blast radius, affected tests, pre-change safety checks, graph-level editing
|
|
208
|
+
- **Multi-agent orchestration** -- partition codebases for parallel agent work with zero-conflict guarantees
|
|
209
|
+
- **Security analysis** -- vulnerability reachability mapping, auth gaps, CVE path tracing
|
|
210
|
+
- **Algorithm optimization** -- detect O(n^2) loops, N+1 queries, and 21 other anti-patterns with suggested fixes
|
|
211
|
+
- **Backend quality** -- auth gaps, missing indexes, over-fetching models, non-idempotent migrations, orphan routes, API drift
|
|
212
|
+
- **Runtime analysis** -- overlay production trace data onto the static graph for hotspot detection
|
|
213
|
+
- **Multi-repo projects** -- cross-repo API edge detection between frontend and backend
|
|
214
|
+
|
|
215
|
+
### When NOT to use Roam
|
|
216
|
+
|
|
217
|
+
- **Real-time type checking** -- use an LSP (pyright, gopls, tsserver). Roam is static and offline.
|
|
218
|
+
- **Small scripts (<10 files)** -- just read the files directly.
|
|
219
|
+
- **Pure text search** -- ripgrep is faster for raw string matching.
|
|
220
|
+
|
|
221
|
+
## Why use Roam
|
|
222
|
+
|
|
223
|
+
**Speed.** One command replaces 5-10 tool calls (in typical workflows). Under 0.5s for any query.
|
|
224
|
+
|
|
225
|
+
**Dependency-aware.** Computes structure, not string matches. Knows `Flask` has 47 dependents and 31 affected tests. `grep` knows it appears 847 times.
|
|
226
|
+
|
|
227
|
+
**LLM-optimized output.** Plain ASCII, compact abbreviations (`fn`, `cls`, `meth`), `--json` envelopes. Designed for agent consumption, not human decoration.
|
|
228
|
+
|
|
229
|
+
**Fully local.** No API keys, telemetry, or network calls. Works in air-gapped environments.
|
|
230
|
+
|
|
231
|
+
**Algorithm-aware.** Built-in catalog of 23 anti-patterns. Detects suboptimal algorithms (quadratic loops, N+1 queries, unbounded recursion) and suggests fixes with Big-O improvements and confidence scores. Receiver-aware loop-invariant analysis minimizes false positives.
|
|
232
|
+
|
|
233
|
+
**CI-ready.** `--json` output, `--gate` quality gates, GitHub Action, SARIF 2.1.0.
|
|
234
|
+
|
|
235
|
+
| | Without Roam | With Roam |
|
|
236
|
+
|--|-------------|-----------|
|
|
237
|
+
| Tool calls | 8 | **1** |
|
|
238
|
+
| Wall time | ~11s | **<0.5s** |
|
|
239
|
+
| Tokens consumed | ~15,000 | **~3,000** |
|
|
240
|
+
|
|
241
|
+
*Measured on a typical agent workflow in a 200-file Python project (Flask). See [benchmarks](#performance) for more.*
|
|
242
|
+
|
|
243
|
+
<details>
|
|
244
|
+
<summary><strong>Table of Contents</strong></summary>
|
|
245
|
+
|
|
246
|
+
**Getting Started:** [What is Roam?](#what-is-roam) · [What's New in v11](#whats-new-in-v11) · [Best for](#best-for) · [Why use Roam](#why-use-roam) · [Install](#install) · [Quick Start](#quick-start)
|
|
247
|
+
|
|
248
|
+
**Using Roam:** [Commands](#commands) · [Walkthrough](#walkthrough-investigating-a-codebase) · [AI Coding Tools](#integration-with-ai-coding-tools) · [MCP Server](#mcp-server)
|
|
249
|
+
|
|
250
|
+
**Operations:** [CI/CD Integration](#cicd-integration) · [SARIF Output](#sarif-output) · [For Teams](#for-teams)
|
|
251
|
+
|
|
252
|
+
**Reference:** [Language Support](#language-support) · [Performance](#performance) · [How It Works](#how-it-works) · [How Roam Compares](#how-roam-compares) · [FAQ](#faq)
|
|
253
|
+
|
|
254
|
+
**More:** [Limitations](#limitations) · [Troubleshooting](#troubleshooting) · [Update / Uninstall](#update--uninstall) · [Development](#development) · [Contributing](#contributing)
|
|
255
|
+
|
|
256
|
+
</details>
|
|
257
|
+
|
|
258
|
+
## Install
|
|
259
|
+
|
|
260
|
+
```bash
|
|
261
|
+
pip install roam-code
|
|
262
|
+
|
|
263
|
+
# Recommended: isolated environment
|
|
264
|
+
pipx install roam-code
|
|
265
|
+
# or
|
|
266
|
+
uv tool install roam-code
|
|
267
|
+
|
|
268
|
+
# From source
|
|
269
|
+
pip install git+https://github.com/Cranot/roam-code.git
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
Requires Python 3.9+. Works on Linux, macOS, and Windows.
|
|
273
|
+
|
|
274
|
+
> **Windows:** If `roam` is not found after installing with `uv`, run `uv tool update-shell` and restart your terminal.
|
|
275
|
+
|
|
276
|
+
### Docker (alpine-based)
|
|
277
|
+
|
|
278
|
+
```bash
|
|
279
|
+
docker build -t roam-code .
|
|
280
|
+
docker run --rm -v "$PWD:/workspace" roam-code index
|
|
281
|
+
docker run --rm -v "$PWD:/workspace" roam-code health
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
## Quick Start
|
|
285
|
+
|
|
286
|
+
```bash
|
|
287
|
+
cd your-project
|
|
288
|
+
roam init # indexes codebase, creates config + CI workflow
|
|
289
|
+
roam understand # full codebase briefing
|
|
290
|
+
```
|
|
291
|
+
|
|
292
|
+
First index takes ~5s for 200 files, ~15s for 1,000 files. Subsequent runs are incremental and near-instant.
|
|
293
|
+
|
|
294
|
+
**Next steps:**
|
|
295
|
+
|
|
296
|
+
- **Set up your AI agent:** `roam describe --write` (auto-detects CLAUDE.md, AGENTS.md, .cursor/rules, etc. — see [integration instructions](#integration-with-ai-coding-tools))
|
|
297
|
+
- **Explore:** `roam health` → `roam weather` → `roam map`
|
|
298
|
+
- **Run the v2 stack on every PR:** `git diff | roam pr-analyze --explain` (gates AI-generated risk; pair with `roam pr-comment-render` for sticky GitHub comments — see [Roam Agent Review](#roam-agent-review-pr-bot-for-ai-generated-risk))
|
|
299
|
+
- **First-touch demo:** `roam dogfood` (audit + pr-analyze + audit-trail + EU AI Act conformance in one envelope)
|
|
300
|
+
- **Add to CI:** `roam init` already generated a GitHub Action
|
|
301
|
+
- **Customer-facing artifacts:** see [`templates/`](templates/) — starter rule packs (Python / TypeScript / Go / Java / Kotlin / Rust at [`templates/rules/`](templates/rules/)), audit-report template ([`templates/audit-report/`](templates/audit-report/)), legal templates ([`templates/legal/`](templates/legal/)), v2 product specs ([`templates/products/`](templates/products/))
|
|
302
|
+
|
|
303
|
+
<details>
|
|
304
|
+
<summary><strong>Try it on Roam itself</strong></summary>
|
|
305
|
+
|
|
306
|
+
```bash
|
|
307
|
+
git clone https://github.com/Cranot/roam-code.git
|
|
308
|
+
cd roam-code
|
|
309
|
+
pip install -e .
|
|
310
|
+
roam init
|
|
311
|
+
roam understand
|
|
312
|
+
roam health
|
|
313
|
+
```
|
|
314
|
+
|
|
315
|
+
</details>
|
|
316
|
+
|
|
317
|
+
## Works With
|
|
318
|
+
|
|
319
|
+
<p align="center">
|
|
320
|
+
<a href="#integration-with-ai-coding-tools">Claude Code</a> •
|
|
321
|
+
<a href="#integration-with-ai-coding-tools">Cursor</a> •
|
|
322
|
+
<a href="#integration-with-ai-coding-tools">Windsurf</a> •
|
|
323
|
+
<a href="#integration-with-ai-coding-tools">GitHub Copilot</a> •
|
|
324
|
+
<a href="#integration-with-ai-coding-tools">Aider</a> •
|
|
325
|
+
<a href="#integration-with-ai-coding-tools">Cline</a> •
|
|
326
|
+
<a href="#integration-with-ai-coding-tools">Gemini CLI</a> •
|
|
327
|
+
<a href="#integration-with-ai-coding-tools">OpenAI Codex CLI</a> •
|
|
328
|
+
<a href="#mcp-server">MCP</a> •
|
|
329
|
+
<a href="#cicd-integration">GitHub Actions</a> •
|
|
330
|
+
<a href="#cicd-integration">GitLab CI</a> •
|
|
331
|
+
<a href="#cicd-integration">Azure DevOps</a>
|
|
332
|
+
</p>
|
|
333
|
+
|
|
334
|
+
## Commands
|
|
335
|
+
|
|
336
|
+
**Lead with the 5 verbs.** The [5 core commands](#core-commands) cover ~80% of agent workflows: `understand`, `context`, `retrieve`, `preflight`, `critique`. The remaining 181 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 **186 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.
|
|
337
|
+
|
|
338
|
+
<details>
|
|
339
|
+
<summary><strong>Full command reference</strong></summary>
|
|
340
|
+
|
|
341
|
+
### Getting Started
|
|
342
|
+
|
|
343
|
+
| Command | Description |
|
|
344
|
+
|---------|-------------|
|
|
345
|
+
| `roam index [--force] [--verbose]` | Build or rebuild the codebase index |
|
|
346
|
+
| `roam index-export <bundle.tar.gz> [--sign] [--key K] [--keyless]` | Export the indexed `.roam/index.db` as a signed, integrity-checked tarball. Counter to Cursor's "reuse teammate's index" without a vendor cloud. |
|
|
347
|
+
| `roam index-import <bundle.tar.gz> [--force] [--cosign-bundle B] [--cosign-key K]` | Import a portable index bundle. Verifies manifest sha256 + optional cosign signature; refuses to overwrite without `--force`. |
|
|
348
|
+
| `roam watch [--interval N] [--debounce N] [--webhook-port P] [--guardian]` | Long-running index daemon: poll/webhook-triggered refreshes plus optional continuous architecture-guardian snapshots and JSONL compliance artifacts |
|
|
349
|
+
| `roam init` | Guided onboarding: creates `.roam/fitness.yaml`, CI workflow, runs index, shows health |
|
|
350
|
+
| `roam hooks [--install] [--uninstall]` | Manage git hooks for automated roam index updates and health gates |
|
|
351
|
+
| `roam doctor` | Diagnose installation and environment: verify tree-sitter grammars, SQLite, git, and config health |
|
|
352
|
+
| `roam reset [--hard]` | Reset the roam index and cached data. `--hard` removes all `.roam/` artifacts |
|
|
353
|
+
| `roam clean [--all]` | Remove stale or orphaned index entries without a full rebuild |
|
|
354
|
+
| `roam understand` | Full codebase briefing: tech stack, architecture, key abstractions, health, conventions, complexity overview, entry points |
|
|
355
|
+
| `roam onboard` | Alias for `understand` |
|
|
356
|
+
| `roam tour [--write PATH]` | Auto-generated onboarding guide: top symbols, reading order, entry points, language breakdown. `--write` saves to Markdown |
|
|
357
|
+
| `roam describe [--write] [--force] [-o PATH] [--agent-prompt]` | Auto-generate project description for AI agents. `--write` auto-detects your agent's config file. `--agent-prompt` returns a compact (<500 token) system prompt |
|
|
358
|
+
| `roam agent-export [--format F] [--write]` | Generate agent-context bundle from project analysis (`AGENTS.md` + provider-specific overlays) |
|
|
359
|
+
| `roam minimap [--update] [-o FILE] [--init-notes]` | Compact annotated codebase snapshot for agent config injection: stack, annotated directory tree, key symbols by PageRank, high fan-in symbols to avoid touching, hotspots, conventions. Sentinel-based in-place updates |
|
|
360
|
+
| `roam config [--set-db-dir PATH] [--use-local-cache] [--semantic-status] [--semantic-backend MODE]` | Manage `.roam/config.json` (DB path, local cache storage, excludes, optional ONNX semantic settings, and activation diagnostics) |
|
|
361
|
+
| `roam map [-n N] [--full] [--budget N]` | Project skeleton: files, languages, entry points, top symbols by PageRank. `--budget` caps output to N tokens |
|
|
362
|
+
| `roam schema [--diff] [--version V]` | JSON envelope schema versioning: view, diff, and validate output schemas |
|
|
363
|
+
| `roam mcp [--list-tools] [--transport T]` | Start MCP server (stdio/SSE/streamable-http), inspect available tools, and expose roam to coding agents |
|
|
364
|
+
| `roam mcp-setup <platform>` | Generate MCP config snippets for AI platforms: claude-code, cursor, windsurf, vscode, gemini-cli, codex-cli |
|
|
365
|
+
| `roam ci-setup [--platform P] [--write]` | Generate CI/CD pipeline config (GitHub Actions, GitLab CI, Azure Pipelines, Jenkins, Bitbucket) with SARIF + quality gates |
|
|
366
|
+
| `roam adrs [--status S] [--limit N]` | Discover Architecture Decision Records, link to affected code modules, show status and coverage |
|
|
367
|
+
| `roam plugins` | List discovered plugins (commands, detectors, language extractors) registered via `ROAM_PLUGIN_MODULES` or entry points |
|
|
368
|
+
| `roam index-stats` | Report .roam index size, row counts, and SQLite fragmentation; hints when VACUUM or `roam reset` is overdue |
|
|
369
|
+
| `roam test-pyramid` | Count tests by kind (unit/integration/e2e/smoke) using path + filename heuristics; flags inverted pyramids |
|
|
370
|
+
| `roam telemetry` | Surface the opt-in local telemetry ring buffer (slowest + recent calls); enable via `ROAM_TELEMETRY_LOCAL=1` |
|
|
371
|
+
| `roam orphan-imports` | List Python imports that don't resolve to any indexed module or installed package |
|
|
372
|
+
| `roam changelog [--suggest]` | List commits since the last tag, optionally as a Conventional-Commits-bucketed markdown CHANGELOG draft |
|
|
373
|
+
| `roam graph-export [--format graphml\|dot\|jsonl]` | Export the symbol or file dependency graph for external tooling (Gephi, Cytoscape, custom analyses) |
|
|
374
|
+
| `roam help-search <query>` | Fuzzy match across every command's name + help text (replaces grepping `--help-all` output) |
|
|
375
|
+
| `roam stats` | Aggregate metrics over the index: count by language, file role, kind, plus recent commit activity |
|
|
376
|
+
| `roam timeline <symbol>` | Chronological commits that touched the file owning the symbol — author, date, lines added/removed |
|
|
377
|
+
| `roam pr-prep [<range>]` | One-shot pre-PR fitness check that bundles diff + critique + pr-risk into one envelope |
|
|
378
|
+
| `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); EU AI Act Article 12 audit trail via `--audit-trail` |
|
|
379
|
+
| `roam pr-comment-render --input F` | Render a markdown PR comment from a `pr-analyze` JSON envelope; styles: `github`, `gitlab`, `plain` |
|
|
380
|
+
| `roam metrics-push [--token T] [--anonymize] [--dry-run]` | Push metrics-only summary (no source code) from `roam audit` to a Roam Cloud Lite endpoint; `--dry-run` prints the payload locally |
|
|
381
|
+
| `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 |
|
|
382
|
+
| `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 |
|
|
383
|
+
| `roam audit-trail-conformance-check [--retention-days N] [--gate]` | Score the audit trail against an EU AI Act Article 12 checklist (chain integrity, timestamps, actors, reproducibility, retention) |
|
|
384
|
+
| `roam rules-validate [PATH] [--against DIFF] [--strict] [--gate] [--explain]` | Lint a `.roam/rules.yml` for typos, schema mistakes, unknown patterns, duplicate IDs; optional dry-run against a sample diff |
|
|
385
|
+
| `roam dogfood [--no-audit] [--no-pr-analyze] [--no-audit-trail]` | One-shot v2 stack runner: audit + pr-analyze + audit-trail + Article 12 conformance — first-touch demo for any repo |
|
|
386
|
+
| `roam why-fail <test>` | Find recently-changed symbols transitively reachable from a failing test |
|
|
387
|
+
| `roam recommend <symbol>` | Surface related symbols using call-graph + co-change + clone signals |
|
|
388
|
+
| `roam graph-stats` | Graph-level invariants: density, weak components, non-trivial cycles, top inbound symbols |
|
|
389
|
+
| `roam api [--scope <dir>]` | List the public API surface (exported public symbols + signatures) |
|
|
390
|
+
| `roam exit-codes` | List every roam exit code with its meaning |
|
|
391
|
+
| `roam version [--check]` | Show installed version; with `--check` also queries PyPI for newer releases |
|
|
392
|
+
| `roam audit [--brief]` | One-shot AI Agent Readiness Audit — chains health + debt + dead + risk + test-pyramid + api into a single envelope |
|
|
393
|
+
| `roam disambiguate <name>` | List every symbol matching the name with file/line/kind/signature/docstring snippet to pick the right one |
|
|
394
|
+
| `roam pre-commit [--install\|--print]` | Install or preview a roam-critique git pre-commit hook |
|
|
395
|
+
| `roam mcp-status` | MCP server health: preset, registered tools, backpressure limits, cache entries, watcher state |
|
|
396
|
+
| `roam test-impact [<range>]` | Tests transitively reachable from changed symbols (sharper scope than `affected-tests`) |
|
|
397
|
+
| `roam recipes` | List every `roam ask` recipe with intent + example queries (sugar over `ask --list`) |
|
|
398
|
+
|
|
399
|
+
### Daily Workflow
|
|
400
|
+
|
|
401
|
+
| Command | Description |
|
|
402
|
+
|---------|-------------|
|
|
403
|
+
| `roam file <path> [--full] [--changed] [--deps-of PATH]` | File skeleton: all definitions with signatures, cognitive load index, health score |
|
|
404
|
+
| `roam symbol <name> [--full]` | Symbol definition + callers + callees + metrics. Supports `file:symbol` disambiguation |
|
|
405
|
+
| `roam context <symbol> [--task MODE] [--for-file PATH]` | AI-optimized context: definition + callers + callees + files-to-read with line ranges |
|
|
406
|
+
| `roam hover <symbol>` | One-line architectural summary: kind, location, blast-radius bucket, top caller, top callee. Bounded at ~200 tokens for IDE hover panels |
|
|
407
|
+
| `roam retrieve <task> [--budget N] [--k N] [--seed-files PATH]` | Graph-aware context for free-form tasks: FTS5 + structural rerank (PageRank + clones) + token budget |
|
|
408
|
+
| `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. |
|
|
409
|
+
| `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. |
|
|
410
|
+
| `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. |
|
|
411
|
+
| `roam workflow [RECIPE] [--list] [--query TEXT]` | Inspect a recipe DAG, review lenses, gates, rendered command arguments, and follow-up commands without running the workflow. |
|
|
412
|
+
| `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). |
|
|
413
|
+
| `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. |
|
|
414
|
+
| `roam eval-retrieve [--tasks FILE] [--sweep] [--min-recall-at-20 N] [--emit-format coderag\|beir]` | Recall@K eval harness for `roam retrieve` — measures against a JSONL ground-truth file. CI-gateable. `--emit-format coderag` writes CodeRAG-Bench-compatible run files for public leaderboard submission. |
|
|
415
|
+
| `roam oracle <name> <subject>` | Boolean oracles for agents — 1-token yes/no answers. Subcommands: `symbol-exists`, `route-exists`, `is-test-only`, `is-reachable-from-entry`, `is-clone-of`. |
|
|
416
|
+
| `roam search <pattern> [--kind KIND]` | Find symbols by name pattern, PageRank-ranked |
|
|
417
|
+
| `roam grep <pattern> [-g glob] [-n N]` | Text search annotated with enclosing symbol context |
|
|
418
|
+
| `roam deps <path> [--full]` | What a file imports and what imports it |
|
|
419
|
+
| `roam trace <source> <target> [-k N]` | Dependency paths with coupling strength and hub detection |
|
|
420
|
+
| `roam impact <symbol>` | Blast radius: what breaks if a symbol changes (Personalized PageRank weighted) |
|
|
421
|
+
| `roam diff [--staged] [--full] [REV_RANGE]` | Blast radius of uncommitted changes or a commit range |
|
|
422
|
+
| `roam pr-risk [REV_RANGE]` | PR risk score (0-100, multiplicative model) + structural spread + suggested reviewers |
|
|
423
|
+
| `roam pr-diff [--staged] [--range R] [--format markdown]` | Structural PR diff: metric deltas, edge analysis, symbol changes, footprint. Not text diff — graph delta |
|
|
424
|
+
| `roam api-changes [REV_RANGE]` | API change classifier: breaking/non-breaking changes, severity, and affected contracts |
|
|
425
|
+
| `roam semantic-diff [REV_RANGE]` | Structural change summary: symbols added/removed/modified and changed call edges |
|
|
426
|
+
| `roam test-gaps [REV_RANGE]` | Changed-symbol test gap detection: what changed and what still lacks test coverage |
|
|
427
|
+
| `roam affected [REV_RANGE]` | Monorepo/package impact analysis: what components are affected by a change |
|
|
428
|
+
| `roam attest [REV_RANGE] [--format markdown] [--sign]` | Proof-carrying PR attestation: bundles blast radius, risk, breaking changes, fitness, budget, tests, effects into one verifiable artifact |
|
|
429
|
+
| `roam annotate <symbol> <note>` | Attach persistent notes to symbols (agentic memory across sessions) |
|
|
430
|
+
| `roam annotations [--file F] [--symbol S]` | View stored annotations |
|
|
431
|
+
| `roam diagnose <symbol> [--depth N]` | Root cause analysis: ranks suspects by z-score normalized risk |
|
|
432
|
+
| `roam preflight <symbol\|file>` | Compound pre-change check: blast radius + tests + complexity + coupling + fitness |
|
|
433
|
+
| `roam guard <symbol>` | Compact sub-agent preflight bundle: definition, 1-hop callers/callees, test files, breaking-risk score, and layer signals |
|
|
434
|
+
| `roam agent-plan --agents N` | Decompose partitions into dependency-ordered agent tasks with merge sequencing and handoffs |
|
|
435
|
+
| `roam agent-context --agent-id N [--agents M]` | Generate per-agent execution context: write scope, read-only dependencies, and interface contracts |
|
|
436
|
+
| `roam syntax-check [--changed] [PATHS...]` | Tree-sitter syntax integrity check for changed files and multi-agent judge workflows |
|
|
437
|
+
| `roam verify [--threshold N]` | Pre-commit AI-code consistency check across naming, imports, error handling, and duplication signals |
|
|
438
|
+
| `roam verify-imports [--file F]` | Import hallucination firewall: validate all imports against indexed symbol table, suggest corrections via FTS5 fuzzy matching |
|
|
439
|
+
| `roam triage list\|add\|stats\|check` | Security finding suppression workflow: manage `.roam-suppressions.yml` (SAFE/ACKNOWLEDGED/WONT-FIX status lifecycle) |
|
|
440
|
+
| `roam safe-delete <symbol>` | Safe deletion check: SAFE/REVIEW/UNSAFE verdict |
|
|
441
|
+
| `roam test-map <name>` | Map a symbol or file to its test coverage |
|
|
442
|
+
| `roam adversarial [--staged] [--range R]` | Adversarial architecture review: generates targeted challenges based on changes |
|
|
443
|
+
| `roam plan [--staged] [--range R] [--agents N]` | Agent work planner: decompose changes into sequenced, dependency-aware steps |
|
|
444
|
+
| `roam closure <symbol> [--rename] [--delete]` | Minimal-change synthesis: all files to touch for a safe rename/delete |
|
|
445
|
+
| `roam mutate move\|rename\|add-call\|extract` | Graph-level code editing: move symbols, rename across codebase, add calls, extract functions. Dry-run by default |
|
|
446
|
+
|
|
447
|
+
### Codebase Health
|
|
448
|
+
|
|
449
|
+
| Command | Description |
|
|
450
|
+
|---------|-------------|
|
|
451
|
+
| `roam health [--no-framework] [--gate]` | Composite health score (0-100): weighted geometric mean of tangle ratio, god components, bottlenecks, layer violations. `--gate` runs quality gate checks from `.roam-gates.yml` (exit 5 on failure) |
|
|
452
|
+
| `roam smells [--file F] [--min-severity S]` | Code smell detection: 15 deterministic detectors (brain methods, god classes, feature envy, shotgun surgery, data clumps, etc.) with per-file health scores |
|
|
453
|
+
| `roam dashboard` | Unified single-screen project status: health, hotspots, risks, ownership, and AI-rot indicators |
|
|
454
|
+
| `roam vibe-check [--threshold N]` | AI-rot auditor: 8-pattern taxonomy with composite risk score and prioritized findings |
|
|
455
|
+
| `roam ai-readiness` | 0-100 score for how well this codebase supports AI coding agents |
|
|
456
|
+
| `roam ai-ratio [--since N]` | Statistical estimate of AI-generated code ratio using commit-behavior signals |
|
|
457
|
+
| `roam trends [--record] [--days N] [--metric M]` | Historical metrics snapshots with sparklines and trend deltas |
|
|
458
|
+
| `roam complexity [--bumpy-road] [--include-tooling]` | Per-function cognitive complexity (SonarSource-compatible, triangular nesting penalty) + Halstead metrics (volume, difficulty, effort, bugs) + cyclomatic density |
|
|
459
|
+
| `roam py-types [--detail] [--include-tests] [--ci --min-coverage N]` | Python type-annotation health: % of public functions with full annotations, ``Any`` usage, legacy ``typing.Optional/Dict/List`` (PEP 585/604 modernisation candidates), per-file worst offenders. CI-gateable via ``--ci --min-coverage N`` (exit 5 below threshold). Default-excludes test files |
|
|
460
|
+
| `roam py-modern [--detail]` | Modern-Python adoption signal: counts walrus operator (PEP 572), match statements (PEP 634), PEP 604 ``X \| None``, PEP 585 ``dict[…]``, PEP 695 type aliases, f-strings vs ``.format()``. Reports type-modernisation % and f-string adoption % to gauge migration progress |
|
|
461
|
+
| `roam pytest-fixtures [SYMBOL] [--max-depth N]` | Inventory pytest fixture chains. With no SYMBOL, prints the project-wide fixture count and the top fixtures by dependent count. With a fixture or test name, walks the implicit fixture-parameter dependency graph to show what each test transitively requires. Resolves through ``conftest.py`` chains |
|
|
462
|
+
| `roam algo [--task T] [--confidence C] [--profile P]` | Algorithm anti-pattern detection: 23-pattern catalog detects suboptimal algorithms (O(n^2) loops, N+1 queries, quadratic string building, branching recursion, loop-invariant calls) and suggests better approaches with Big-O improvements. Confidence calibration via caller-count + runtime traces, evidence paths, impact scoring, framework-aware N+1 packs, and language-aware fix templates. Alias: `roam math` |
|
|
463
|
+
| `roam n1 [--confidence C] [--verbose]` | Implicit N+1 I/O detection: finds ORM model computed properties (`$appends`/accessors) that trigger lazy-loaded DB queries in collection contexts. Cross-references with eager loading config. Supports Laravel, Django, Rails, SQLAlchemy, JPA |
|
|
464
|
+
| `roam over-fetch [--threshold N] [--confidence C]` | Detect models serializing too many fields: large `$fillable` without `$hidden`/`$visible`, direct controller returns bypassing API Resources, poor exposed-to-hidden ratio |
|
|
465
|
+
| `roam missing-index [--table T] [--confidence C]` | Find queries on non-indexed columns: cross-references `WHERE`/`ORDER BY` clauses, foreign keys, and paginated queries against migration-defined indexes |
|
|
466
|
+
| `roam weather [-n N]` | Hotspots ranked by geometric mean of churn x complexity (percentile-normalized) |
|
|
467
|
+
| `roam debt [--roi]` | Hotspot-weighted tech debt prioritization with SQALE remediation costs and optional refactoring ROI estimates |
|
|
468
|
+
| `roam fitness [--explain] [--baseline PATH] [--write-baseline]` | Architectural fitness functions from `.roam/fitness.yaml`, with baseline/delta mode for existing debt |
|
|
469
|
+
| `roam alerts` | Health degradation trend detection (Mann-Kendall + Sen's slope) |
|
|
470
|
+
| `roam forecast [--symbol S] [--horizon N] [--alert-only]` | Predict when metrics will exceed thresholds: Theil-Sen regression on snapshot history + churn-weighted per-symbol risk |
|
|
471
|
+
| `roam budget [--init] [--staged] [--range R]` | Architectural budget enforcement: per-PR delta limits on health, cycles, complexity. CI gate (exit 5 on violation) |
|
|
472
|
+
| `roam bisect [--metric M] [--range R]` | Architectural git bisect: find the commit that degraded a specific metric |
|
|
473
|
+
| `roam ingest-trace <file> [--otel\|--jaeger\|--zipkin\|--generic]` | Ingest runtime trace data (OpenTelemetry, Jaeger, Zipkin) for hotspot overlay |
|
|
474
|
+
| `roam hotspots [--runtime] [--discrepancy]` | Runtime hotspot analysis: find symbols missed by static analysis but critical at runtime |
|
|
475
|
+
|
|
476
|
+
<details>
|
|
477
|
+
<summary><strong>roam algo — algorithm anti-pattern catalog (23 patterns)</strong></summary>
|
|
478
|
+
|
|
479
|
+
`roam algo` scans every indexed function against a 23-pattern catalog, ranks findings by runtime-aware impact score, and shows the exact Big-O improvement available. Findings include semantic evidence paths, precision metadata, and language-aware tips/fixes (Python, JS, Go, Rust, Java, etc.):
|
|
480
|
+
|
|
481
|
+
```
|
|
482
|
+
$ roam algo
|
|
483
|
+
VERDICT: 8 algorithmic improvements found (3 high, 4 medium, 1 low)
|
|
484
|
+
Ordering: highest impact first
|
|
485
|
+
Profile: balanced (filtered 0 low-signal findings)
|
|
486
|
+
|
|
487
|
+
Nested loop lookup (2):
|
|
488
|
+
fn resolve_permissions src/auth/rbac.py:112 [high, impact=86.4]
|
|
489
|
+
Current: Nested iteration -- O(n*m)
|
|
490
|
+
Better: Hash-map join -- O(n+m)
|
|
491
|
+
Tip: Build a dict/set from one collection, iterate the other
|
|
492
|
+
|
|
493
|
+
fn find_matching_rule src/rules/engine.py:67 [high, impact=78.1]
|
|
494
|
+
Current: Nested iteration -- O(n*m)
|
|
495
|
+
Better: Hash-map join -- O(n+m)
|
|
496
|
+
Tip: Build a dict/set from one collection, iterate the other
|
|
497
|
+
|
|
498
|
+
String building (1):
|
|
499
|
+
meth build_query src/db/query.py:88 [high, impact=74.0]
|
|
500
|
+
Current: Loop concatenation -- O(n^2)
|
|
501
|
+
Better: Join / StringBuilder -- O(n)
|
|
502
|
+
Tip: Collect parts in a list, join once at the end
|
|
503
|
+
|
|
504
|
+
Branching recursion without memoization (1):
|
|
505
|
+
fn compute_cost src/pricing/calc.py:34 [medium, impact=49.5]
|
|
506
|
+
Current: Naive branching recursion -- O(2^n)
|
|
507
|
+
Better: Memoized / iterative DP -- O(n)
|
|
508
|
+
Tip: Add @cache / @lru_cache, or convert to iterative with a table
|
|
509
|
+
```
|
|
510
|
+
|
|
511
|
+
**Full catalog — 23 patterns:**
|
|
512
|
+
|
|
513
|
+
| Pattern | Anti-pattern detected | Better approach | Improvement |
|
|
514
|
+
|---------|----------------------|-----------------|-------------|
|
|
515
|
+
| Nested loop lookup | `for x in a: for y in b: if x==y` | Hash-map join | O(n·m) → O(n+m) |
|
|
516
|
+
| Membership test | `if x in list` in a loop | Set lookup | O(n) → O(1) per check |
|
|
517
|
+
| Sorting | Bubble / selection sort | Built-in sort | O(n²) → O(n log n) |
|
|
518
|
+
| Search in sorted data | Linear scan on sorted sequence | Binary search | O(n) → O(log n) |
|
|
519
|
+
| String building | `s += chunk` in loop | `join()` / StringBuilder | O(n²) → O(n) |
|
|
520
|
+
| Deduplication | Nested loop dedup | `set()` / `dict.fromkeys` | O(n²) → O(n) |
|
|
521
|
+
| Max / min | Manual tracking loop | `max()` / `min()` | idiom |
|
|
522
|
+
| Accumulation | Manual accumulator | `sum()` / `reduce()` | idiom |
|
|
523
|
+
| Group by key | Manual key-existence check | `defaultdict` / `groupingBy` | idiom |
|
|
524
|
+
| Fibonacci | Naive recursion | Iterative / `@lru_cache` | O(2ⁿ) → O(n) |
|
|
525
|
+
| Exponentiation | Loop multiplication | `pow(b, e, mod)` | O(n) → O(log n) |
|
|
526
|
+
| GCD | Manual loop | `math.gcd()` | O(n) → O(log n) |
|
|
527
|
+
| Matrix multiply | Naive triple loop | NumPy / BLAS | same asymptotic, ~1000× faster via SIMD |
|
|
528
|
+
| Busy wait | `while True: sleep()` poll | Event / condition variable | O(k) → O(1) wake-up |
|
|
529
|
+
| Regex in loop | `re.match()` compiled per iteration | Pre-compiled pattern | O(n·(p+m)) → O(p + n·m) |
|
|
530
|
+
| N+1 query | Per-item DB / API call in loop | Batch `WHERE IN (...)` | n round-trips → 1 |
|
|
531
|
+
| List front operations | `list.insert(0, x)` in loop | `collections.deque` | O(n) → O(1) per op |
|
|
532
|
+
| Sort to select | `sorted(x)[0]` or `sorted(x)[:k]` | `min()` / `heapq.nsmallest` | O(n log n) → O(n) or O(n log k) |
|
|
533
|
+
| Repeated lookup | `.index()` / `.contains()` inside loop | Pre-built set / dict | O(m) → O(1) per lookup |
|
|
534
|
+
| Branching recursion | Naive `f(n-1) + f(n-2)` without cache | `@cache` / iterative DP | O(2ⁿ) → O(n) |
|
|
535
|
+
| Quadratic string building | `result += chunk` across multiple scopes | `parts.append` + `join` at end | O(n²) → O(n) |
|
|
536
|
+
| Loop-invariant call | `get_config()` / `compile_schema()` inside loop body | Hoist before loop | per-iter cost → O(1) |
|
|
537
|
+
| String reversal | Manual char-by-char loop | `s[::-1]` / `.reverse()` | idiom |
|
|
538
|
+
|
|
539
|
+
**Filtering:**
|
|
540
|
+
|
|
541
|
+
```bash
|
|
542
|
+
roam algo --task nested-lookup # one pattern type only
|
|
543
|
+
roam algo --confidence high # high-confidence findings only
|
|
544
|
+
roam algo --profile strict # precision-first filtering
|
|
545
|
+
roam algo --task io-in-loop -n 5 # top 5 N+1 query sites
|
|
546
|
+
roam --json algo # machine-readable output
|
|
547
|
+
roam --sarif algo > roam-algo.sarif # SARIF with fingerprints + fixes
|
|
548
|
+
```
|
|
549
|
+
|
|
550
|
+
**Confidence calibration:** `high` = strong structural signal (unbounded loop + high caller/runtime impact + pattern confirmed); `medium` = pattern matched but uncertainty remains; `low` = heuristic signal only.
|
|
551
|
+
|
|
552
|
+
**Profiles:** `balanced` (default), `strict` (precision-first), `aggressive` (surface more candidates).
|
|
553
|
+
|
|
554
|
+
</details>
|
|
555
|
+
|
|
556
|
+
<details>
|
|
557
|
+
<summary><strong>roam minimap — annotated codebase snapshot for agent configs</strong></summary>
|
|
558
|
+
|
|
559
|
+
`roam minimap` generates a compact block (stack, annotated directory tree, key symbols, hotspots, conventions) wrapped in sentinel comments for in-place agent config updates:
|
|
560
|
+
|
|
561
|
+
```
|
|
562
|
+
$ roam minimap
|
|
563
|
+
<!-- roam:minimap generated=2026-02-25 -->
|
|
564
|
+
**Stack:** Python · JavaScript · YAML
|
|
565
|
+
|
|
566
|
+
```
|
|
567
|
+
.github/ (CI + Action)
|
|
568
|
+
benchmarks/ (agent-eval + oss-eval)
|
|
569
|
+
src/
|
|
570
|
+
roam/
|
|
571
|
+
bridges/
|
|
572
|
+
base.py # LanguageBridge
|
|
573
|
+
registry.py # register_bridge, detect_bridges
|
|
574
|
+
commands/ (137 cmd files) # is_test_file, get_changed_files
|
|
575
|
+
db/
|
|
576
|
+
connection.py # find_project_root, batched_in
|
|
577
|
+
schema.py
|
|
578
|
+
graph/
|
|
579
|
+
builder.py # build_symbol_graph, build_file_graph
|
|
580
|
+
pagerank.py # compute_pagerank, compute_centrality
|
|
581
|
+
languages/ (21 files) # ApexExtractor
|
|
582
|
+
output/
|
|
583
|
+
formatter.py # to_json, json_envelope
|
|
584
|
+
cli.py # cli, LazyGroup
|
|
585
|
+
mcp_server.py
|
|
586
|
+
tests/ (186 files)
|
|
587
|
+
` ` `
|
|
588
|
+
|
|
589
|
+
**Key symbols** (PageRank): `open_db` · `ensure_index` · `json_envelope` · `to_json` · `LanguageExtractor`
|
|
590
|
+
|
|
591
|
+
**Touch carefully** (fan-in >= 15): `to_json` (116 callers) · `json_envelope` (116 callers) · `open_db` (105 callers) · `ensure_index` (100 callers)
|
|
592
|
+
|
|
593
|
+
**Hotspots** (churn x complexity): `cmd_context.py` · `csharp_lang.py` · `cmd_dead.py`
|
|
594
|
+
|
|
595
|
+
**Conventions:** snake_case fns, PascalCase classes
|
|
596
|
+
<!-- /roam:minimap -->
|
|
597
|
+
```
|
|
598
|
+
|
|
599
|
+
**Workflow:**
|
|
600
|
+
|
|
601
|
+
```bash
|
|
602
|
+
roam minimap # print to stdout
|
|
603
|
+
roam minimap --update # replace sentinel block in CLAUDE.md in-place
|
|
604
|
+
roam minimap -o docs/AGENTS.md # target a different file
|
|
605
|
+
roam minimap --init-notes # scaffold .roam/minimap-notes.md for project gotchas
|
|
606
|
+
```
|
|
607
|
+
|
|
608
|
+
The sentinel pair `<!-- roam:minimap -->` / `<!-- /roam:minimap -->` is replaced on each run — surrounding content is left intact. Add project-specific gotchas to `.roam/minimap-notes.md` and they appear in every subsequent output.
|
|
609
|
+
|
|
610
|
+
**Tree annotations** come from the top exported symbols by fan-in per file. Non-source root directories (`.github/`, `benchmarks/`, `docs/`) are collapsed immediately. Large subdirectories (e.g. `commands/`, `languages/`) are collapsed at depth 2+ with a file count.
|
|
611
|
+
|
|
612
|
+
</details>
|
|
613
|
+
|
|
614
|
+
### Architecture
|
|
615
|
+
|
|
616
|
+
| Command | Description |
|
|
617
|
+
|---------|-------------|
|
|
618
|
+
| `roam clusters [--min-size N]` | Community detection vs directory structure. Modularity Q-score (Newman 2004) + per-cluster conductance |
|
|
619
|
+
| `roam spectral [--depth N] [--compare] [--gap-only] [--k K]` | Spectral bisection: Fiedler vector partition tree with algebraic connectivity gap verdict |
|
|
620
|
+
| `roam layers` | Topological dependency layers + upward violations + Gini balance |
|
|
621
|
+
| `roam dead [--all] [--summary] [--clusters]` | Unreferenced exported symbols with safety verdicts + confidence scoring (60-95%) |
|
|
622
|
+
| `roam flag-dead [--config FILE] [--include-tests]` | Feature flag dead code detection: stale LaunchDarkly/Unleash/Split/custom flags with staleness analysis |
|
|
623
|
+
| `roam fan [symbol\|file] [-n N] [--no-framework]` | Fan-in/fan-out: most connected symbols or files |
|
|
624
|
+
| `roam risk [-n N] [--domain KW] [--explain]` | Domain-weighted risk ranking |
|
|
625
|
+
| `roam why <name> [name2 ...]` | Role classification (Hub/Bridge/Core/Leaf), reach, criticality |
|
|
626
|
+
| `roam split <file>` | Internal symbol groups with isolation % and extraction suggestions |
|
|
627
|
+
| `roam entry-points` | Entry point catalog with protocol classification |
|
|
628
|
+
| `roam patterns` | Architectural pattern recognition: Strategy, Factory, Observer, etc. |
|
|
629
|
+
| `roam visualize [--format mermaid\|dot] [--focus NAME] [--limit N]` | Generate Mermaid or DOT architecture diagrams. Smart filtering via PageRank, cluster grouping, cycle highlighting |
|
|
630
|
+
| `roam effects [TARGET] [--file F] [--type T]` | Side-effect classification: DB writes, network I/O, filesystem, global mutation. Direct + transitive effects through call graph |
|
|
631
|
+
| `roam dark-matter [--min-cochanges N]` | Detect hidden co-change couplings not explained by import/call edges |
|
|
632
|
+
| `roam simulate move\|extract\|merge\|delete` | Counterfactual architecture simulator: test refactoring ideas in-memory, see metric deltas before writing code |
|
|
633
|
+
| `roam orchestrate --agents N [--files P]` | Multi-agent swarm partitioning: split codebase for parallel agents with zero-conflict guarantees |
|
|
634
|
+
| `roam partition [--agents N]` | Multi-agent partition manifest: conflict risk, complexity, and suggested ownership splits |
|
|
635
|
+
| `roam fingerprint [--compact] [--compare F]` | Topology fingerprint: extract/compare architectural signatures across repos |
|
|
636
|
+
| `roam cut <target> [--depth N]` | Minimum graph cuts: find critical edges whose removal disconnects components |
|
|
637
|
+
| `roam safe-zones` | Graph-based containment boundaries |
|
|
638
|
+
| `roam coverage-gaps` | Unprotected entry points with no path to gate symbols |
|
|
639
|
+
| `roam duplicates [--threshold T] [--min-lines N]` | Semantic duplicate detector: functionally equivalent code clusters with divergent edge-case handling |
|
|
640
|
+
| `roam clones [--threshold T] [--min-lines N] [--scope P]` | AST structural clone detection: Type-2 clones via subtree hashing (more precise than `duplicates`) |
|
|
641
|
+
|
|
642
|
+
### Exploration
|
|
643
|
+
|
|
644
|
+
| Command | Description |
|
|
645
|
+
|---------|-------------|
|
|
646
|
+
| `roam module <path>` | Directory contents: exports, signatures, dependencies, cohesion |
|
|
647
|
+
| `roam sketch <dir> [--full]` | Compact structural skeleton of a directory |
|
|
648
|
+
| `roam uses <name>` | All consumers: callers, importers, inheritors. Use this *instead of* `grep "->X\|\.X\\b\|'X'\|\"X\""` to find references — graph-precise, no string-literal / comment false positives, structured by edge type. Available as `roam refs <name>` for grep-familiar muscle memory. |
|
|
649
|
+
| `roam owner <path>` | Code ownership: who owns a file or directory |
|
|
650
|
+
| `roam coupling [-n N] [--set]` | Temporal coupling: file pairs that change together (NPMI + lift) |
|
|
651
|
+
| `roam fn-coupling` | Function-level temporal coupling across files |
|
|
652
|
+
| `roam bus-factor [--brain-methods]` | Knowledge loss risk per module |
|
|
653
|
+
| `roam doc-staleness` | Detect stale docstrings |
|
|
654
|
+
| `roam docs-coverage` | Public-symbol doc coverage + stale docs + PageRank-ranked missing-doc hotlist |
|
|
655
|
+
| `roam suggest-refactoring [--limit N] [--min-score N]` | Proactive refactoring recommendations ranked by complexity, coupling, churn, smells, coverage gaps, and debt |
|
|
656
|
+
| `roam plan-refactor <symbol> [--operation auto\|extract\|move]` | Ordered refactor plan with blast radius, test gaps, layer risk, and simulation-based strategy preview |
|
|
657
|
+
| `roam test-scaffold <name\|file> [--write] [--framework F]` | Generate test file/function/import skeletons from symbol data (pytest, jest, Go, JUnit, RSpec) |
|
|
658
|
+
| `roam conventions` | Auto-detect naming styles, import preferences. Flags outliers |
|
|
659
|
+
| `roam breaking [REV_RANGE]` | Breaking change detection: removed exports, signature changes |
|
|
660
|
+
| `roam affected-tests <symbol\|file>` | Trace reverse call graph to test files |
|
|
661
|
+
| `roam relate <sym1> <sym2>` | Show relationship between two symbols: shared callers, shortest path, common ancestors |
|
|
662
|
+
| `roam endpoints [--routes] [--api]` | Enumerate all HTTP/API endpoint definitions and surface them for review or cross-repo matching |
|
|
663
|
+
| `roam metrics <file\|symbol>` | Unified vital signs: complexity, fan-in/out, PageRank, churn, test coverage, dead code risk -- all in one call |
|
|
664
|
+
| `roam search-semantic <query>` | Hybrid semantic search: BM25 + TF-IDF + optional local ONNX vectors (select via `--backend`) with framework/library packs |
|
|
665
|
+
| `roam intent [--staged] [--range R]` | Doc-to-code linking: match documentation to symbols, detect drift |
|
|
666
|
+
| `roam x-lang [--bridges] [--edges]` | Cross-language edge browser: inspect bridge-resolved connections |
|
|
667
|
+
|
|
668
|
+
### Reports & CI
|
|
669
|
+
|
|
670
|
+
| Command | Description |
|
|
671
|
+
|---------|-------------|
|
|
672
|
+
| `roam report [--list] [--config FILE] [PRESET]` | Compound presets: `first-contact`, `security`, `pre-pr`, `refactor`, `guardian` |
|
|
673
|
+
| `roam describe --write` | Generate agent config (auto-detects: CLAUDE.md, AGENTS.md, .cursor/rules, etc.) |
|
|
674
|
+
| `roam auth-gaps [--routes-only] [--controllers-only] [--min-confidence C]` | Find endpoints missing authentication or authorization: routes outside auth middleware groups, CRUD methods without `$this->authorize()` / `Gate::allows()` checks. String-aware PHP brace parsing |
|
|
675
|
+
| `roam orphan-routes [-n N] [--confidence C]` | Detect backend routes with no frontend consumer: parses route definitions, searches frontend for API call references, reports controller methods with no route mapping |
|
|
676
|
+
| `roam migration-safety [-n N] [--include-archive]` | Detect non-idempotent migrations: missing `hasTable`/`hasColumn` guards, raw SQL without `IF NOT EXISTS`, index operations without existence checks |
|
|
677
|
+
| `roam api-drift [--model M] [--confidence C]` | Detect mismatches between PHP model `$fillable`/`$appends` fields and TypeScript interface properties. Auto-converts snake_case/camelCase for comparison. Single-repo; cross-repo planned for `roam ws api-drift` |
|
|
678
|
+
| `roam codeowners [--unowned] [--owner NAME]` | CODEOWNERS coverage analysis: owned/unowned files, top owners, and ownership risk |
|
|
679
|
+
| `roam drift [--threshold N]` | Ownership drift detection: declared ownership vs observed maintenance activity |
|
|
680
|
+
| `roam suggest-reviewers [REV_RANGE]` | Reviewer recommendation via ownership, recency, breadth, and impact signals |
|
|
681
|
+
| `roam simulate-departure <developer>` | Knowledge-loss simulation: what breaks if a key contributor leaves |
|
|
682
|
+
| `roam dev-profile [--developer NAME] [--since N]` | Developer productivity profile: commit patterns, specialization, impact, and knowledge concentration per contributor |
|
|
683
|
+
| `roam secrets [--fail-on-found] [--include-tests]` | Secret scanning with masking, entropy detection, env-var suppression, remediation suggestions, and optional CI gate failure |
|
|
684
|
+
| `roam vulns [--import-file F] [--reachable-only]` | Vulnerability scanning: ingest npm/pip/trivy/osv reports, auto-detect format, reachability filtering, SARIF output |
|
|
685
|
+
| `roam path-coverage [--from P] [--to P] [--max-depth N]` | Find critical call paths (entry -> sink) with zero test protection. Suggests optimal test insertion points |
|
|
686
|
+
| `roam capsule [--redact-paths] [--no-signatures] [--output F]` | Export sanitized structural graph (no code bodies) for external architectural review |
|
|
687
|
+
| `roam rules [--init] [--ci] [--rules-dir D]` | Plugin DSL for governance: user-defined path/symbol/AST rules via `.roam/rules/` YAML (`$METAVAR` captures supported) |
|
|
688
|
+
| `roam check-rules [--severity S] [--fix]` | Evaluate built-in and user-defined governance rules (10 built-in: no-circular-imports, max-fan-out, etc.) |
|
|
689
|
+
| `roam vuln-map --generic\|--npm-audit\|--trivy F` | Ingest vulnerability reports and match to codebase symbols |
|
|
690
|
+
| `roam vuln-reach [--cve C] [--from E]` | Vulnerability reachability: exact paths from entry points to vulnerable calls |
|
|
691
|
+
| `roam supply-chain [--top N]` | Dependency risk dashboard: pin coverage, risk scoring, supply-chain health |
|
|
692
|
+
| `roam sbom [--format cyclonedx\|spdx] [--no-reachability] [-o FILE]` | SBOM generation (CycloneDX 1.5 / SPDX 2.3) enriched with call-graph reachability per dependency |
|
|
693
|
+
| `roam congestion [--window N] [--min-authors N]` | Developer congestion detection: concurrent authors per file, coordination risk scoring |
|
|
694
|
+
| `roam invariants [--staged] [--range R]` | Discover architectural contracts (invariants) from the codebase structure |
|
|
695
|
+
|
|
696
|
+
### Multi-Repo Workspace
|
|
697
|
+
|
|
698
|
+
| Command | Description |
|
|
699
|
+
|---------|-------------|
|
|
700
|
+
| `roam ws init <repo1> <repo2> [--name NAME]` | Initialize a workspace from sibling repos. Auto-detects frontend/backend roles |
|
|
701
|
+
| `roam ws status` | Show workspace repos, index ages, cross-repo edge count |
|
|
702
|
+
| `roam ws resolve` | Scan for REST API endpoints and match frontend calls to backend routes |
|
|
703
|
+
| `roam ws understand` | Unified workspace overview: per-repo stats + cross-repo connections |
|
|
704
|
+
| `roam ws health` | Workspace-wide health report with cross-repo coupling assessment |
|
|
705
|
+
| `roam ws context <symbol>` | Cross-repo augmented context: find a symbol across repos + show API callers |
|
|
706
|
+
| `roam ws trace <source> <target>` | Trace cross-repo paths via API edges |
|
|
707
|
+
|
|
708
|
+
### Global Options
|
|
709
|
+
|
|
710
|
+
| Option | Description |
|
|
711
|
+
|--------|-------------|
|
|
712
|
+
| `roam --json <command>` | Structured JSON output with consistent envelope |
|
|
713
|
+
| `roam --compact <command>` | Token-efficient output: TSV tables, minimal JSON envelope |
|
|
714
|
+
| `roam --sarif <command>` | SARIF 2.1.0 output for dead, health, complexity, rules, secrets, algo, py-types, py-modern (GitHub/CI integration) |
|
|
715
|
+
| `roam health --gate` | CI quality gate. Reads `.roam-gates.yml` thresholds. Exit code 5 on failure |
|
|
716
|
+
|
|
717
|
+
</details>
|
|
718
|
+
|
|
719
|
+
## Walkthrough: Investigating a Codebase
|
|
720
|
+
|
|
721
|
+
<details>
|
|
722
|
+
<summary><strong>10-step walkthrough using Flask as an example</strong> (click to expand)</summary>
|
|
723
|
+
|
|
724
|
+
Here's how you'd use Roam to understand a project you've never seen before. Using Flask as an example:
|
|
725
|
+
|
|
726
|
+
**Step 1: Onboard and get the full picture**
|
|
727
|
+
|
|
728
|
+
```
|
|
729
|
+
$ roam init
|
|
730
|
+
Created .roam/fitness.yaml (6 starter rules)
|
|
731
|
+
Created .github/workflows/roam.yml
|
|
732
|
+
Done. 226 files, 1132 symbols, 233 edges.
|
|
733
|
+
Health: 78/100
|
|
734
|
+
|
|
735
|
+
$ roam understand
|
|
736
|
+
Tech stack: Python (flask, jinja2, werkzeug)
|
|
737
|
+
Architecture: Monolithic — 3 layers, 5 clusters
|
|
738
|
+
Key abstractions: Flask, Blueprint, Request, Response
|
|
739
|
+
Health: 78/100 — 1 god component (Flask)
|
|
740
|
+
Entry points: src/flask/__init__.py, src/flask/cli.py
|
|
741
|
+
Conventions: snake_case functions, PascalCase classes, relative imports
|
|
742
|
+
Complexity: avg 4.2, 3 high (>15), 0 critical (>25)
|
|
743
|
+
```
|
|
744
|
+
|
|
745
|
+
**Step 2: Drill into a key file**
|
|
746
|
+
|
|
747
|
+
```
|
|
748
|
+
$ roam file src/flask/app.py
|
|
749
|
+
src/flask/app.py (python, 963 lines)
|
|
750
|
+
|
|
751
|
+
cls Flask(App) :76-963
|
|
752
|
+
meth __init__(self, import_name, ...) :152
|
|
753
|
+
meth route(self, rule, **options) :411
|
|
754
|
+
meth register_blueprint(self, blueprint, ...) :580
|
|
755
|
+
meth make_response(self, rv) :742
|
|
756
|
+
...12 more methods
|
|
757
|
+
```
|
|
758
|
+
|
|
759
|
+
**Step 3: Who depends on this?**
|
|
760
|
+
|
|
761
|
+
```
|
|
762
|
+
$ roam deps src/flask/app.py
|
|
763
|
+
Imported by:
|
|
764
|
+
file symbols
|
|
765
|
+
-------------------------- -------
|
|
766
|
+
src/flask/__init__.py 3
|
|
767
|
+
src/flask/testing.py 2
|
|
768
|
+
tests/test_basic.py 1
|
|
769
|
+
...18 files total
|
|
770
|
+
```
|
|
771
|
+
|
|
772
|
+
**Step 4: Find the hotspots**
|
|
773
|
+
|
|
774
|
+
```
|
|
775
|
+
$ roam weather
|
|
776
|
+
=== Hotspots (churn x complexity) ===
|
|
777
|
+
Score Churn Complexity Path Lang
|
|
778
|
+
----- ----- ---------- ---------------------- ------
|
|
779
|
+
18420 460 40.0 src/flask/app.py python
|
|
780
|
+
12180 348 35.0 src/flask/blueprints.py python
|
|
781
|
+
```
|
|
782
|
+
|
|
783
|
+
**Step 5: Check architecture health**
|
|
784
|
+
|
|
785
|
+
```
|
|
786
|
+
$ roam health
|
|
787
|
+
Health: 78/100
|
|
788
|
+
Tangle: 0.0% (0/1132 symbols in cycles)
|
|
789
|
+
1 god component (Flask, degree 47, actionable)
|
|
790
|
+
0 bottlenecks, 0 layer violations
|
|
791
|
+
|
|
792
|
+
=== God Components (degree > 20) ===
|
|
793
|
+
Sev Name Kind Degree Cat File
|
|
794
|
+
------- ----- ---- ------ --- ------------------
|
|
795
|
+
WARNING Flask cls 47 act src/flask/app.py
|
|
796
|
+
```
|
|
797
|
+
|
|
798
|
+
**Step 6: Get AI-ready context for a symbol**
|
|
799
|
+
|
|
800
|
+
```
|
|
801
|
+
$ roam context Flask
|
|
802
|
+
Files to read:
|
|
803
|
+
src/flask/app.py:76-963 # definition
|
|
804
|
+
src/flask/__init__.py:1-15 # re-export
|
|
805
|
+
src/flask/testing.py:22-45 # caller: FlaskClient.__init__
|
|
806
|
+
tests/test_basic.py:12-30 # caller: test_app_factory
|
|
807
|
+
...12 more files
|
|
808
|
+
|
|
809
|
+
Callers: 47 Callees: 3
|
|
810
|
+
```
|
|
811
|
+
|
|
812
|
+
**Step 7: Pre-change safety check**
|
|
813
|
+
|
|
814
|
+
```
|
|
815
|
+
$ roam preflight Flask
|
|
816
|
+
=== Preflight: Flask ===
|
|
817
|
+
Blast radius: 47 callers, 89 transitive
|
|
818
|
+
Affected tests: 31 (DIRECT: 12, TRANSITIVE: 19)
|
|
819
|
+
Complexity: cc=40 (critical), nesting=6
|
|
820
|
+
Coupling: 3 hidden co-change partners
|
|
821
|
+
Fitness: 1 violation (max-complexity exceeded)
|
|
822
|
+
Verdict: HIGH RISK — consider splitting before modifying
|
|
823
|
+
```
|
|
824
|
+
|
|
825
|
+
**Step 8: Decompose a large file**
|
|
826
|
+
|
|
827
|
+
```
|
|
828
|
+
$ roam split src/flask/app.py
|
|
829
|
+
=== Split analysis: src/flask/app.py ===
|
|
830
|
+
87 symbols, 42 internal edges, 95 external edges
|
|
831
|
+
Cross-group coupling: 18%
|
|
832
|
+
|
|
833
|
+
Group 1 (routing) — 12 symbols, isolation: 83% [extractable]
|
|
834
|
+
meth route L411 PR=0.0088
|
|
835
|
+
meth add_url_rule L450 PR=0.0045
|
|
836
|
+
...
|
|
837
|
+
|
|
838
|
+
=== Extraction Suggestions ===
|
|
839
|
+
Extract 'routing' group: route, add_url_rule, endpoint (+9 more)
|
|
840
|
+
83% isolated, only 3 edges to other groups
|
|
841
|
+
```
|
|
842
|
+
|
|
843
|
+
**Step 9: Understand why a symbol matters**
|
|
844
|
+
|
|
845
|
+
```
|
|
846
|
+
$ roam why Flask url_for Blueprint
|
|
847
|
+
Symbol Role Fan Reach Risk Verdict
|
|
848
|
+
--------- ------------ ---------- -------- -------- --------------------------------------------------
|
|
849
|
+
Flask Hub fan-in:47 reach:89 CRITICAL God symbol (47 in, 12 out). Consider splitting.
|
|
850
|
+
url_for Core utility fan-in:31 reach:45 HIGH Widely used utility (31 callers). Stable interface.
|
|
851
|
+
Blueprint Bridge fan-in:18 reach:34 moderate Coupling point between clusters.
|
|
852
|
+
```
|
|
853
|
+
|
|
854
|
+
**Step 10: Generate docs and set up CI**
|
|
855
|
+
|
|
856
|
+
```
|
|
857
|
+
$ roam describe --write
|
|
858
|
+
Wrote CLAUDE.md (98 lines) # auto-detects: CLAUDE.md, AGENTS.md, .cursor/rules, etc.
|
|
859
|
+
|
|
860
|
+
$ roam health --gate
|
|
861
|
+
Health: 78/100 — PASS
|
|
862
|
+
```
|
|
863
|
+
|
|
864
|
+
Ten commands. Complete picture: structure, dependencies, hotspots, health, context, safety checks, decomposition, and CI gates.
|
|
865
|
+
|
|
866
|
+
</details>
|
|
867
|
+
|
|
868
|
+
## Integration with AI Coding Tools
|
|
869
|
+
|
|
870
|
+
Roam is designed to be called by coding agents via shell commands. Instead of repeatedly grepping and reading files, the agent runs one `roam` command and gets structured output.
|
|
871
|
+
|
|
872
|
+
**Decision order for agents:**
|
|
873
|
+
|
|
874
|
+
| Situation | Command |
|
|
875
|
+
|-----------|---------|
|
|
876
|
+
| First time in a repo | `roam understand` then `roam tour` |
|
|
877
|
+
| Need to modify a symbol | `roam preflight <name>` (blast radius + tests + fitness) |
|
|
878
|
+
| Debugging a failure | `roam diagnose <name>` (root cause ranking) |
|
|
879
|
+
| Need files to read | `roam context <name>` (files + line ranges) |
|
|
880
|
+
| Need to find a symbol | `roam search <pattern>` |
|
|
881
|
+
| Need file structure | `roam file <path>` |
|
|
882
|
+
| Pre-PR check | `roam pr-risk HEAD~3..HEAD` |
|
|
883
|
+
| What breaks if I change X? | `roam impact <symbol>` |
|
|
884
|
+
| Check for N+1 queries | `roam n1` (implicit lazy-load detection) |
|
|
885
|
+
| Check auth coverage | `roam auth-gaps` (routes + controllers) |
|
|
886
|
+
| Check migration safety | `roam migration-safety` (idempotency guards) |
|
|
887
|
+
|
|
888
|
+
**Fastest setup:**
|
|
889
|
+
|
|
890
|
+
```bash
|
|
891
|
+
roam describe --write # auto-detects your agent's config file
|
|
892
|
+
roam describe --write -o AGENTS.md # or specify an explicit path
|
|
893
|
+
roam describe --agent-prompt # compact ~500-token prompt (append to any config)
|
|
894
|
+
roam minimap --update # inject/refresh annotated codebase minimap in CLAUDE.md
|
|
895
|
+
```
|
|
896
|
+
|
|
897
|
+
**Agent not using Roam correctly?** If your agent is ignoring Roam and falling back to grep/read exploration, it likely doesn't have the instructions. Run:
|
|
898
|
+
|
|
899
|
+
```bash
|
|
900
|
+
roam describe --write # writes instructions to your agent's config (CLAUDE.md, AGENTS.md, etc.)
|
|
901
|
+
```
|
|
902
|
+
|
|
903
|
+
If you already have a config file and don't want to overwrite it:
|
|
904
|
+
|
|
905
|
+
```bash
|
|
906
|
+
roam describe --agent-prompt # prints a compact prompt — copy-paste into your existing config
|
|
907
|
+
roam minimap --update # injects an annotated codebase snapshot into CLAUDE.md (won't touch other content)
|
|
908
|
+
```
|
|
909
|
+
|
|
910
|
+
This teaches the agent which Roam command to use for each situation (e.g., `roam preflight` before changes, `roam context` for files to read, `roam diagnose` for debugging).
|
|
911
|
+
|
|
912
|
+
<details>
|
|
913
|
+
<summary><strong>Copy-paste agent instructions</strong></summary>
|
|
914
|
+
|
|
915
|
+
```markdown
|
|
916
|
+
## Codebase navigation
|
|
917
|
+
|
|
918
|
+
This project uses `roam` for codebase comprehension. Always prefer roam over Glob/Grep/Read exploration.
|
|
919
|
+
|
|
920
|
+
Before modifying any code:
|
|
921
|
+
1. First time in the repo: `roam understand` then `roam tour`
|
|
922
|
+
2. Find a symbol: `roam search <pattern>`
|
|
923
|
+
3. Before changing a symbol: `roam preflight <name>` (blast radius + tests + fitness)
|
|
924
|
+
4. Need files to read: `roam context <name>` (files + line ranges, prioritized)
|
|
925
|
+
5. Debugging a failure: `roam diagnose <name>` (root cause ranking)
|
|
926
|
+
6. After making changes: `roam diff` (blast radius of uncommitted changes)
|
|
927
|
+
|
|
928
|
+
Additional: `roam health` (0-100 score), `roam impact <name>` (what breaks),
|
|
929
|
+
`roam pr-risk` (PR risk), `roam file <path>` (file skeleton).
|
|
930
|
+
|
|
931
|
+
Run `roam --help` for all commands. Use `roam --json <cmd>` for structured output.
|
|
932
|
+
```
|
|
933
|
+
|
|
934
|
+
</details>
|
|
935
|
+
|
|
936
|
+
<details>
|
|
937
|
+
<summary><strong>Where to put this for each tool</strong></summary>
|
|
938
|
+
|
|
939
|
+
| Tool | Config file |
|
|
940
|
+
|------|-------------|
|
|
941
|
+
| **Claude Code** | `CLAUDE.md` in your project root |
|
|
942
|
+
| **OpenAI Codex CLI** | `AGENTS.md` in your project root |
|
|
943
|
+
| **Gemini CLI** | `GEMINI.md` in your project root |
|
|
944
|
+
| **Cursor** | `.cursor/rules/roam.mdc` (add `alwaysApply: true` frontmatter) |
|
|
945
|
+
| **Windsurf** | `.windsurf/rules/roam.md` (add `trigger: always_on` frontmatter) |
|
|
946
|
+
| **GitHub Copilot** | `.github/copilot-instructions.md` |
|
|
947
|
+
| **Aider** | `CONVENTIONS.md` |
|
|
948
|
+
| **Continue.dev** | `config.yaml` rules |
|
|
949
|
+
| **Cline** | `.clinerules/` directory |
|
|
950
|
+
|
|
951
|
+
</details>
|
|
952
|
+
|
|
953
|
+
<details>
|
|
954
|
+
<summary><strong>Roam vs native tools</strong></summary>
|
|
955
|
+
|
|
956
|
+
| Task | Use Roam | Use native tools |
|
|
957
|
+
|------|----------|-----------------|
|
|
958
|
+
| "What calls this function?" | `roam symbol <name>` | LSP / Grep |
|
|
959
|
+
| "What files do I need to read?" | `roam context <name>` | Manual tracing (5+ calls) |
|
|
960
|
+
| "Is it safe to change X?" | `roam preflight <name>` | Multiple manual checks |
|
|
961
|
+
| "Show me this file's structure" | `roam file <path>` | Read the file directly |
|
|
962
|
+
| "Understand project architecture" | `roam understand` | Manual exploration |
|
|
963
|
+
| "What breaks if I change X?" | `roam impact <symbol>` | No direct equivalent |
|
|
964
|
+
| "What tests to run?" | `roam affected-tests <name>` | Grep for imports (misses indirect) |
|
|
965
|
+
| "What's causing this bug?" | `roam diagnose <name>` | Manual call-chain tracing |
|
|
966
|
+
| "Codebase health score for CI" | `roam health --gate` | No equivalent |
|
|
967
|
+
|
|
968
|
+
</details>
|
|
969
|
+
|
|
970
|
+
## MCP Server
|
|
971
|
+
|
|
972
|
+
Roam includes a [Model Context Protocol](https://modelcontextprotocol.io/) server for direct integration with tools that support MCP.
|
|
973
|
+
|
|
974
|
+
```bash
|
|
975
|
+
pip install "roam-code[mcp]"
|
|
976
|
+
roam mcp
|
|
977
|
+
```
|
|
978
|
+
|
|
979
|
+
103 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.
|
|
980
|
+
|
|
981
|
+
**MCP v2 highlights (v11):**
|
|
982
|
+
- In-process MCP execution (no subprocess shell-out per call)
|
|
983
|
+
- Preset-based tool surfacing (`core`, `review`, `refactor`, `debug`, `architecture`, `full`)
|
|
984
|
+
- Compound tools that collapse multi-step exploration/review flows into one call
|
|
985
|
+
- Structured output schemas + tool annotations for safer planner behavior
|
|
986
|
+
|
|
987
|
+
**MCP-native enhancements (v12):**
|
|
988
|
+
- **Sampling-driven compression** -- pass `summarize=True` to `roam_explore`, `roam_understand`, `roam_health`, or `roam_repo_map`. The server asks the client's own LLM (no API keys) to compress the full envelope into a short briefing, dropping output from ~50 KB JSON to ~1-2 KB prose. Falls back gracefully when the client doesn't support sampling.
|
|
989
|
+
- **Server-side session memory** -- `roam_context`, `roam_explore`, and `roam_retrieve` now remember symbols you've touched in the current session and auto-bias ranking without you threading `recent_symbols` through every call. Explicit args still win.
|
|
990
|
+
- **Phase-aware progress** -- `roam_init`, `roam_reindex`, and `roam_orchestrate` stream real `discover -> parse -> extract -> resolve -> graph -> metrics` progress to the client, replacing the old 5/100 placeholders.
|
|
991
|
+
- **Symbol & path completions** -- new `roam_complete(prefix, kind, limit)` tool returns just names from the FTS5 index (cheaper than `roam_search_symbol`). A protocol-level handler is also installed for clients that support `completion/complete`.
|
|
992
|
+
- **Reactive resource invalidation** (opt-in) -- set `ROAM_MCP_WATCH=1` and the server watches the working tree, runs incremental reindex on file changes, and emits `notifications/resources/updated` for `roam://health`, `roam://summary`, etc., so subscribed clients see fresh data without polling.
|
|
993
|
+
|
|
994
|
+
**Default preset:** `core` (25 tools: 24 core + `roam_expand_toolset` meta-tool).
|
|
995
|
+
|
|
996
|
+
```bash
|
|
997
|
+
# Default
|
|
998
|
+
roam mcp
|
|
999
|
+
|
|
1000
|
+
# Full toolset
|
|
1001
|
+
ROAM_MCP_PRESET=full roam mcp
|
|
1002
|
+
|
|
1003
|
+
# Legacy compatibility (same as full preset)
|
|
1004
|
+
ROAM_MCP_LITE=0 roam mcp
|
|
1005
|
+
```
|
|
1006
|
+
|
|
1007
|
+
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`.
|
|
1008
|
+
|
|
1009
|
+
<details>
|
|
1010
|
+
<summary><strong>MCP tool list (all 136)</strong></summary>
|
|
1011
|
+
|
|
1012
|
+
*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 Agent Review + Cloud Lite engines + EU AI Act audit-trail toolkit + production-grade rules linting + one-shot v2 stack runner.*
|
|
1013
|
+
|
|
1014
|
+
| Tool | Description |
|
|
1015
|
+
|------|-------------|
|
|
1016
|
+
| `roam_understand` | Full codebase briefing (supports `summarize=True` for sampled compression) |
|
|
1017
|
+
| `roam_health` | Health score (0-100) + issues (supports `summarize=True`) |
|
|
1018
|
+
| `roam_repo_map` | Project skeleton (supports `summarize=True`) |
|
|
1019
|
+
| `roam_preflight` | Pre-change safety check |
|
|
1020
|
+
| `roam_search_symbol` | Find symbols by name |
|
|
1021
|
+
| `roam_complete` | Prefix completion for symbols/paths/commands (FTS5-backed) |
|
|
1022
|
+
| `roam_context` | Files-to-read for modifying a symbol |
|
|
1023
|
+
| `roam_hover` | Single-line architectural summary — kind, blast-radius bucket, top caller, top callee |
|
|
1024
|
+
| `roam_retrieve` | Graph-aware context for free-form tasks (FTS5 + structural rerank + token budget) |
|
|
1025
|
+
| `roam_critique` | Verify a patch against the graph (clones-not-edited + blast radius) |
|
|
1026
|
+
| `roam_fleet_plan` | Plan a multi-agent fleet — graph-aware partition emits .roam-fleet.json |
|
|
1027
|
+
| `roam_oracle_symbol_exists` | Boolean oracle: does any symbol with this name exist? |
|
|
1028
|
+
| `roam_oracle_route_exists` | Boolean oracle: does any HTTP route handler match this URL path? |
|
|
1029
|
+
| `roam_oracle_is_test_only` | Boolean oracle: are ALL callers of this symbol in test files? |
|
|
1030
|
+
| `roam_oracle_is_reachable_from_entry` | Boolean oracle: can BFS reach this symbol from any entry-point? |
|
|
1031
|
+
| `roam_oracle_is_clone_of` | Boolean oracle: does this symbol participate in a persisted clone cluster? |
|
|
1032
|
+
| `roam_oracle_test_only` | Alias of `roam_oracle_is_test_only` (round 4 #15 — accept the shorter name) |
|
|
1033
|
+
| `roam_oracle_batch` | Run multiple oracle queries in one call (tri-state envelopes per result) |
|
|
1034
|
+
| `roam_taint_classify` | LLM-augmented taint classification (IDOR/AUTHZ/SQLI/...) via MCP sampling |
|
|
1035
|
+
| `roam_taint` | Static taint analysis — graph-reach BFS with OpenVEX-correct findings |
|
|
1036
|
+
| `roam_sbom` | CycloneDX 1.7 / SPDX 2.3 SBOM emit with optional AIBOM extension (EU AI Act) |
|
|
1037
|
+
| `roam_cga_emit` | Emit a Code Graph Attestation (in-toto v1) with optional cosign signing |
|
|
1038
|
+
| `roam_cga_verify` | Verify a CGA statement — re-derives Merkle + edge digest, checks cosign signature |
|
|
1039
|
+
| `roam_trace` | Dependency path between two symbols |
|
|
1040
|
+
| `roam_impact` | Blast radius of changing a symbol |
|
|
1041
|
+
| `roam_file_info` | File skeleton with all definitions |
|
|
1042
|
+
| `roam_pr_risk` | Risk score for pending changes |
|
|
1043
|
+
| `roam_pr_analyze` | Agent-aware PR verdict: pr-prep + AI-likelihood + `.roam/rules.yml` + INTENTIONAL/SAFE/REVIEW/BLOCK |
|
|
1044
|
+
| `roam_pr_comment_render` | Render a markdown PR comment from a `roam_pr_analyze` envelope |
|
|
1045
|
+
| `roam_metrics_push` | Push metrics-only summary (no source code) to Roam Cloud Lite; default dry-run |
|
|
1046
|
+
| `roam_audit_trail_verify` | Verify SHA-256 chain integrity of an EU AI Act audit-trail JSONL |
|
|
1047
|
+
| `roam_audit_trail_export` | Export the audit trail as markdown / json / csv (with date / verdict filters) for procurement |
|
|
1048
|
+
| `roam_audit_trail_conformance_check` | Score the audit trail against an EU AI Act Article 12 checklist (chain / timestamps / actors / reproducibility / retention) |
|
|
1049
|
+
| `roam_rules_validate` | Lint a `.roam/rules.yml` for typos, schema mistakes, unknown patterns, duplicate IDs |
|
|
1050
|
+
| `roam_dogfood` | One-shot v2 stack runner — audit + pr-analyze + audit-trail + conformance in one envelope |
|
|
1051
|
+
| `roam_breaking_changes` | Detect breaking changes between refs |
|
|
1052
|
+
| `roam_affected_tests` | Find tests affected by a change |
|
|
1053
|
+
| `roam_dead_code` | List unreferenced exports |
|
|
1054
|
+
| `roam_complexity_report` | Per-symbol cognitive complexity |
|
|
1055
|
+
| `roam_py_types` | Python type-annotation health (% public typed, Any, legacy typing) |
|
|
1056
|
+
| `roam_py_modern` | Modern-Python adoption (walrus, match, PEP 604/585/695, f-strings) |
|
|
1057
|
+
| `roam_pytest_fixtures` | pytest fixture chain — top fixtures by dependent count, or per-symbol dependency walk |
|
|
1058
|
+
| `roam_tour` | Auto-generated onboarding guide |
|
|
1059
|
+
| `roam_diagnose` | Root cause analysis for debugging |
|
|
1060
|
+
| `roam_visualize` | Generate Mermaid or DOT architecture diagrams |
|
|
1061
|
+
| `roam_algo` | Algorithm anti-pattern detection with language-aware tips |
|
|
1062
|
+
| `roam_ws_understand` | Unified multi-repo workspace overview |
|
|
1063
|
+
| `roam_ws_context` | Cross-repo augmented symbol context |
|
|
1064
|
+
| `roam_pr_diff` | Structural PR diff: metric deltas, edge analysis, symbol changes |
|
|
1065
|
+
| `roam_budget_check` | Check changes against architectural budgets |
|
|
1066
|
+
| `roam_effects` | Side-effect classification (DB writes, network, filesystem) |
|
|
1067
|
+
| `roam_attest` | Proof-carrying PR attestation with all evidence bundled |
|
|
1068
|
+
| `roam_capsule_export` | Export sanitized structural graph (no code bodies) |
|
|
1069
|
+
| `roam_path_coverage` | Find critical untested call paths (entry -> sink) |
|
|
1070
|
+
| `roam_forecast` | Predict when metrics will exceed thresholds |
|
|
1071
|
+
| `roam_simulate` | Counterfactual architecture simulator |
|
|
1072
|
+
| `roam_orchestrate` | Multi-agent swarm partitioning |
|
|
1073
|
+
| `roam_fingerprint` | Topology fingerprint comparison |
|
|
1074
|
+
| `roam_mutate` | Graph-level code editing (move/rename/extract) |
|
|
1075
|
+
| `roam_dark_matter` | Hidden co-change coupling detection |
|
|
1076
|
+
| `roam_closure` | Minimal-change synthesis for rename/delete |
|
|
1077
|
+
| `roam_adversarial_review` | Adversarial architecture review |
|
|
1078
|
+
| `roam_generate_plan` | Agent work planner |
|
|
1079
|
+
| `roam_get_invariants` | Architectural invariant discovery |
|
|
1080
|
+
| `roam_bisect_blame` | Architectural git bisect |
|
|
1081
|
+
| `roam_doc_intent` | Doc-to-code linking |
|
|
1082
|
+
| `roam_cut_analysis` | Minimum graph cut analysis |
|
|
1083
|
+
| `roam_clones` | AST structural clone detection (Type-2 clones) |
|
|
1084
|
+
| `roam_annotate_symbol` | Attach persistent notes to symbols |
|
|
1085
|
+
| `roam_get_annotations` | View stored annotations |
|
|
1086
|
+
| `roam_relate` | Show relationship between two symbols |
|
|
1087
|
+
| `roam_search_semantic` | Semantic search by meaning |
|
|
1088
|
+
| `roam_rules_check` | Plugin DSL governance rules |
|
|
1089
|
+
| `roam_check_rules` | Built-in + user-defined governance rule evaluation with autofix templates |
|
|
1090
|
+
| `roam_supply_chain` | Dependency risk dashboard: pin coverage and supply-chain health |
|
|
1091
|
+
| `roam_spectral` | Spectral bisection: Fiedler vector partition tree and modularity gap |
|
|
1092
|
+
| `roam_vuln_map` | Vulnerability report ingestion |
|
|
1093
|
+
| `roam_vuln_reach` | Vulnerability reachability paths |
|
|
1094
|
+
| `roam_ingest_trace` | Ingest runtime trace data |
|
|
1095
|
+
| `roam_runtime_hotspots` | Runtime hotspot analysis |
|
|
1096
|
+
| `roam_diff` | Blast radius of uncommitted/committed changes |
|
|
1097
|
+
| `roam_symbol` | Symbol definition, callers, callees, metrics |
|
|
1098
|
+
| `roam_deps` | File-level import/imported-by relationships |
|
|
1099
|
+
| `roam_uses` | All consumers of a symbol by edge type |
|
|
1100
|
+
| `roam_weather` | Code hotspots: churn x complexity ranking |
|
|
1101
|
+
| `roam_debt` | Hotspot-weighted technical debt prioritization with optional ROI estimate |
|
|
1102
|
+
| `roam_docs_coverage` | Doc coverage and stale-doc drift with PageRank-ranked missing docs |
|
|
1103
|
+
| `roam_suggest_refactoring` | Rank proactive refactoring candidates using complexity, coupling, churn, smells, and coverage gaps |
|
|
1104
|
+
| `roam_plan_refactor` | Build an ordered refactor plan for one symbol with risk/test/simulation context |
|
|
1105
|
+
| `roam_n1` | Detect N+1 I/O patterns in ORM code |
|
|
1106
|
+
| `roam_auth_gaps` | Find endpoints missing auth |
|
|
1107
|
+
| `roam_over_fetch` | Detect models serializing too many fields |
|
|
1108
|
+
| `roam_missing_index` | Find queries on non-indexed columns |
|
|
1109
|
+
| `roam_orphan_routes` | Detect dead backend routes |
|
|
1110
|
+
| `roam_migration_safety` | Detect non-idempotent migrations |
|
|
1111
|
+
| `roam_api_drift` | Backend/frontend model mismatch detection |
|
|
1112
|
+
| `roam_expand_toolset` | Discover presets, active toolset, and switch instructions |
|
|
1113
|
+
| `roam_explore` | Compound first-contact exploration bundle for fast repo orientation |
|
|
1114
|
+
| `roam_prepare_change` | Compound pre-change bundle: context, blast radius, risk, and tests |
|
|
1115
|
+
| `roam_review_change` | Compound review bundle for changed code and architecture checks |
|
|
1116
|
+
| `roam_diagnose_issue` | Compound debugging bundle with ranked suspects and dependency context |
|
|
1117
|
+
| `roam_onboard` | Structured onboarding brief for new contributors/agents |
|
|
1118
|
+
| `roam_syntax_check` | Tree-sitter syntax integrity validation for changed paths |
|
|
1119
|
+
| `roam_agent_export` | Generate multi-agent instruction bundles (`AGENTS.md` + overlays) |
|
|
1120
|
+
| `roam_vibe_check` | AI-rot auditor with 8-pattern taxonomy and composite score |
|
|
1121
|
+
| `roam_ai_readiness` | AI-agent effectiveness readiness scoring and recommendations |
|
|
1122
|
+
| `roam_dashboard` | Unified status snapshot across health, risk, churn, and quality |
|
|
1123
|
+
| `roam_codeowners` | CODEOWNERS coverage analysis and unowned file discovery |
|
|
1124
|
+
| `roam_drift` | Ownership drift detection from declared vs observed ownership |
|
|
1125
|
+
| `roam_suggest_reviewers` | Reviewer recommendations with multi-signal scoring |
|
|
1126
|
+
| `roam_simulate_departure` | Knowledge-loss simulation for contributor departure scenarios |
|
|
1127
|
+
| `roam_verify` | Pre-commit consistency verification and policy checks |
|
|
1128
|
+
| `roam_api_changes` | API signature change classification and severity labeling |
|
|
1129
|
+
| `roam_test_gaps` | Changed-symbol test gap analysis |
|
|
1130
|
+
| `roam_ai_ratio` | Estimated AI-generated code ratio from repository signals |
|
|
1131
|
+
| `roam_duplicates` | Semantic duplicate detection across structurally similar functions |
|
|
1132
|
+
| `roam_partition` | Multi-agent partition manifest with conflict and complexity scores |
|
|
1133
|
+
| `roam_affected` | Monorepo/package affected-set analysis for diffs |
|
|
1134
|
+
| `roam_semantic_diff` | Structural diff of symbol/edge changes |
|
|
1135
|
+
| `roam_trends` | Historical metric trend retrieval with sparkline output |
|
|
1136
|
+
| `roam_secrets` | Secret scanning with masking and CI-friendly fail behavior |
|
|
1137
|
+
| `roam_endpoints` | Enumerate HTTP/API endpoint definitions across the codebase |
|
|
1138
|
+
| `roam_doctor` | Diagnose installation and environment health |
|
|
1139
|
+
| `roam_init` | Initialize roam workspace state and build the first index |
|
|
1140
|
+
| `roam_reindex` | Refresh or force-rebuild the index with task-mode support |
|
|
1141
|
+
| `roam_reset` | Reset the roam index and cached data |
|
|
1142
|
+
| `roam_clean` | Remove stale or orphaned index entries |
|
|
1143
|
+
| `roam_catalog` | Machine-readable list of every registered MCP tool with capability flags (read_only / destructive / core) |
|
|
1144
|
+
| `roam_alerts` | Active health alerts: thresholds breached on tangle, complexity, churn, or coverage |
|
|
1145
|
+
| `roam_timeline` | Chronological commits that touched the file owning a symbol |
|
|
1146
|
+
| `roam_test_impact` | Tests transitively reachable from changed symbols (sharper than affected_tests) |
|
|
1147
|
+
| `roam_disambiguate` | List every symbol matching a name with file/line/kind/PageRank — pick the right overload |
|
|
1148
|
+
| `roam_why_fail` | Triage a failing test/symbol: recently-changed reachable symbols ranked by recency |
|
|
1149
|
+
| `roam_batch_search` | Batch symbol search: run multiple pattern queries in a single call |
|
|
1150
|
+
| `roam_batch_get` | Batch context retrieval: fetch multiple symbols/files in a single call |
|
|
1151
|
+
| `roam_dev_profile` | Developer productivity profile: commit patterns, specialization, and impact |
|
|
1152
|
+
|
|
1153
|
+
**Resources:** `roam://health` (current health score), `roam://summary` (project overview)
|
|
1154
|
+
|
|
1155
|
+
</details>
|
|
1156
|
+
|
|
1157
|
+
<details>
|
|
1158
|
+
<summary><strong>Claude Code</strong></summary>
|
|
1159
|
+
|
|
1160
|
+
```bash
|
|
1161
|
+
claude mcp add roam-code -- roam mcp
|
|
1162
|
+
```
|
|
1163
|
+
|
|
1164
|
+
Or add to `.mcp.json` in your project root:
|
|
1165
|
+
|
|
1166
|
+
```json
|
|
1167
|
+
{
|
|
1168
|
+
"mcpServers": {
|
|
1169
|
+
"roam-code": {
|
|
1170
|
+
"command": "roam",
|
|
1171
|
+
"args": ["mcp"]
|
|
1172
|
+
}
|
|
1173
|
+
}
|
|
1174
|
+
}
|
|
1175
|
+
```
|
|
1176
|
+
|
|
1177
|
+
</details>
|
|
1178
|
+
|
|
1179
|
+
<details>
|
|
1180
|
+
<summary><strong>Claude Desktop</strong></summary>
|
|
1181
|
+
|
|
1182
|
+
Add to your `claude_desktop_config.json`:
|
|
1183
|
+
|
|
1184
|
+
```json
|
|
1185
|
+
{
|
|
1186
|
+
"mcpServers": {
|
|
1187
|
+
"roam-code": {
|
|
1188
|
+
"command": "roam",
|
|
1189
|
+
"args": ["mcp"],
|
|
1190
|
+
"cwd": "/path/to/your/project"
|
|
1191
|
+
}
|
|
1192
|
+
}
|
|
1193
|
+
}
|
|
1194
|
+
```
|
|
1195
|
+
|
|
1196
|
+
</details>
|
|
1197
|
+
|
|
1198
|
+
<details>
|
|
1199
|
+
<summary><strong>Cursor</strong></summary>
|
|
1200
|
+
|
|
1201
|
+
Add to `.cursor/mcp.json`:
|
|
1202
|
+
|
|
1203
|
+
```json
|
|
1204
|
+
{
|
|
1205
|
+
"mcpServers": {
|
|
1206
|
+
"roam-code": {
|
|
1207
|
+
"command": "roam",
|
|
1208
|
+
"args": ["mcp"]
|
|
1209
|
+
}
|
|
1210
|
+
}
|
|
1211
|
+
}
|
|
1212
|
+
```
|
|
1213
|
+
|
|
1214
|
+
</details>
|
|
1215
|
+
|
|
1216
|
+
<details>
|
|
1217
|
+
<summary><strong>VS Code + Copilot</strong></summary>
|
|
1218
|
+
|
|
1219
|
+
Add to `.vscode/mcp.json`:
|
|
1220
|
+
|
|
1221
|
+
```json
|
|
1222
|
+
{
|
|
1223
|
+
"servers": {
|
|
1224
|
+
"roam-code": {
|
|
1225
|
+
"type": "stdio",
|
|
1226
|
+
"command": "roam",
|
|
1227
|
+
"args": ["mcp"]
|
|
1228
|
+
}
|
|
1229
|
+
}
|
|
1230
|
+
}
|
|
1231
|
+
```
|
|
1232
|
+
|
|
1233
|
+
</details>
|
|
1234
|
+
|
|
1235
|
+
## Roam Agent Review (PR bot for AI-generated changes)
|
|
1236
|
+
|
|
1237
|
+
Most "AI safety net" tools — CodeRabbit, Greptile, Qodo — review PR **semantics** (does the diff *look* right?). They don't read your **graph**: who calls the changed symbol, which layer it belongs to, whether the AI just touched a god-component with 47 callers. Roam Agent Review fills that gap.
|
|
1238
|
+
|
|
1239
|
+
`roam pr-analyze` is the CLI engine: pipe a unified diff in, get back a verdict (`INTENTIONAL` / `SAFE` / `REVIEW` / `BLOCK`) plus AI-likelihood score, blast radius, rule violations, suggested reviewers, and an EU AI Act Article 12 audit-trail record.
|
|
1240
|
+
|
|
1241
|
+
```bash
|
|
1242
|
+
git diff main..HEAD | roam pr-analyze --explain --with-reviewers --audit-trail
|
|
1243
|
+
roam pr-analyze main..HEAD --gate # exit 5 on BLOCK (CI gate)
|
|
1244
|
+
roam --json pr-analyze --input pr.diff | roam pr-comment-render # ready-to-post markdown
|
|
1245
|
+
roam pr-analyze --batch ./diffs/ --cache --parallel 4 # 24-55x speedup on incremental re-runs
|
|
1246
|
+
roam audit-trail-verify # check SHA-256 chain integrity
|
|
1247
|
+
roam audit-trail-conformance-check --gate # EU AI Act Article 12 score (CI)
|
|
1248
|
+
```
|
|
1249
|
+
|
|
1250
|
+
**Nine weighted heuristic signals** score the diff for AI-likelihood: add/remove ratio, comment density, test coverage, function-size variance, generic naming, orphan imports, **placeholder density** (TODO/FIXME/NotImplementedError stubs), **LLM-phrase density** ("we use this approach because…"), **suspicious imports** (numbered modules, mass typing imports). Each carries **language-aware weights** across Python / TypeScript / JavaScript / Go / Rust / Java / Kotlin. Starter rule packs ship for Python, TypeScript, Go, and Java at [`templates/rules/`](templates/rules/) — drop one at `.roam/rules.yml` to enable. Custom rules look like:
|
|
1251
|
+
|
|
1252
|
+
```yaml
|
|
1253
|
+
rules:
|
|
1254
|
+
- id: no-frontend-db-import
|
|
1255
|
+
description: Frontend modules must not import from db/ directly
|
|
1256
|
+
pattern: import_from # supported: import_from, function_call, class_inherit, decorator_use
|
|
1257
|
+
source_glob: "frontend/**/*.{ts,tsx}"
|
|
1258
|
+
forbidden_target_glob: "lib/db/**"
|
|
1259
|
+
severity: BLOCK
|
|
1260
|
+
- id: no-eval
|
|
1261
|
+
pattern: function_call
|
|
1262
|
+
source_glob: "src/**/*.py"
|
|
1263
|
+
forbidden_target_glob: "eval"
|
|
1264
|
+
severity: BLOCK
|
|
1265
|
+
```
|
|
1266
|
+
|
|
1267
|
+
A **drift baseline** (`--save-baseline` / `--baseline FILE`) compares the current PR's signals against the previous analysis and auto-escalates the verdict on regression — the GitHub App reads this to render `(+5 vs prev)` / `(-22 vs prev)` arrows on every push.
|
|
1268
|
+
|
|
1269
|
+
The **`pr-analyze --audit-trail`** flag appends a SHA-256-chained record to `.roam/audit-trail.jsonl` for each analysis (actor, repo, git SHA, diff hash, verdict, blast radius, AI-likelihood, intent marker). `roam audit-trail-verify` walks the chain and surfaces tampered records; `roam audit-trail-export --format md|csv|json` produces procurement-friendly reports. Built for **EU AI Act Article 12** compliance ahead of the August 2 2026 enforcement deadline.
|
|
1270
|
+
|
|
1271
|
+
A hosted GitHub App is in development on top of this CLI engine. Until it ships, the CLI is usable today as a free CI gate (`roam pr-analyze --gate` exits 5 on BLOCK).
|
|
1272
|
+
|
|
1273
|
+
## Roam Cloud Lite (metrics history, no source upload)
|
|
1274
|
+
|
|
1275
|
+
`roam metrics-push` sends a *summary-only* payload from `roam audit --json` to a Roam Cloud Lite endpoint — numerical metrics, file paths (or SHA-256 hashes when `--anonymize`), and identifier names only. **No source-code bodies are transmitted**, ever. Inspect the exact payload locally with `--dry-run` before any token is set.
|
|
1276
|
+
|
|
1277
|
+
```bash
|
|
1278
|
+
roam metrics-push --dry-run # local-only inspection
|
|
1279
|
+
roam metrics-push --token $ROAM_CLOUD_TOKEN --anonymize
|
|
1280
|
+
roam metrics-push --no-hotspots --json # minimal payload
|
|
1281
|
+
```
|
|
1282
|
+
|
|
1283
|
+
The hosted dashboard at `roam.cloud` (in development) renders trend charts of health-score, debt, dead-code count, danger-zone count, and bus-factor concentration over time. The schema (`roam-metrics-v1`) is allow-listed: any payload key outside the allow-list is rejected by the receiving API.
|
|
1284
|
+
|
|
1285
|
+
Both products are paid layers on top of the free CLI; the CLI itself stays Apache 2.0, zero-API-key, fully local, forever.
|
|
1286
|
+
|
|
1287
|
+
## CI/CD Integration
|
|
1288
|
+
|
|
1289
|
+
All you need is Python 3.9+ and `pip install roam-code`.
|
|
1290
|
+
|
|
1291
|
+
### GitHub Actions
|
|
1292
|
+
|
|
1293
|
+
```yaml
|
|
1294
|
+
# .github/workflows/roam.yml
|
|
1295
|
+
name: Roam Analysis
|
|
1296
|
+
on: [pull_request]
|
|
1297
|
+
|
|
1298
|
+
jobs:
|
|
1299
|
+
roam:
|
|
1300
|
+
runs-on: ubuntu-latest
|
|
1301
|
+
steps:
|
|
1302
|
+
- uses: actions/checkout@v4
|
|
1303
|
+
with:
|
|
1304
|
+
fetch-depth: 0
|
|
1305
|
+
|
|
1306
|
+
- uses: Cranot/roam-code@main
|
|
1307
|
+
with:
|
|
1308
|
+
commands: health
|
|
1309
|
+
gate: "score>=70"
|
|
1310
|
+
sarif: true
|
|
1311
|
+
comment: true
|
|
1312
|
+
```
|
|
1313
|
+
|
|
1314
|
+
Use `roam init` to auto-generate this workflow.
|
|
1315
|
+
|
|
1316
|
+
| Input | Default | Description |
|
|
1317
|
+
|-------|---------|-------------|
|
|
1318
|
+
| `commands` | `health` | Space-separated roam commands to run |
|
|
1319
|
+
| `gate` | (empty) | Quality gate expression (e.g., `score>=70`). Exit 5 on failure |
|
|
1320
|
+
| `sarif` | `false` | Upload SARIF results to GitHub Code Scanning |
|
|
1321
|
+
| `comment` | `true` | Post sticky PR comment with results |
|
|
1322
|
+
| `python-version` | `3.11` | Python version |
|
|
1323
|
+
| `version` | `latest` | Pin to a specific roam-code version |
|
|
1324
|
+
| `cache` | `true` | Cache the SQLite index between runs |
|
|
1325
|
+
| `changed-only` | `false` | Incremental mode: adapt commands to changed files |
|
|
1326
|
+
|
|
1327
|
+
<details>
|
|
1328
|
+
<summary><strong>GitLab CI</strong></summary>
|
|
1329
|
+
|
|
1330
|
+
```yaml
|
|
1331
|
+
roam-analysis:
|
|
1332
|
+
stage: test
|
|
1333
|
+
image: python:3.12-slim
|
|
1334
|
+
before_script:
|
|
1335
|
+
- pip install roam-code
|
|
1336
|
+
script:
|
|
1337
|
+
- roam index
|
|
1338
|
+
- roam health --gate
|
|
1339
|
+
- roam --json pr-risk origin/main..HEAD > roam-report.json
|
|
1340
|
+
artifacts:
|
|
1341
|
+
paths:
|
|
1342
|
+
- roam-report.json
|
|
1343
|
+
rules:
|
|
1344
|
+
- if: $CI_MERGE_REQUEST_IID
|
|
1345
|
+
```
|
|
1346
|
+
|
|
1347
|
+
</details>
|
|
1348
|
+
|
|
1349
|
+
<details>
|
|
1350
|
+
<summary><strong>Azure DevOps / any CI</strong></summary>
|
|
1351
|
+
|
|
1352
|
+
Universal pattern:
|
|
1353
|
+
|
|
1354
|
+
```bash
|
|
1355
|
+
pip install roam-code
|
|
1356
|
+
roam index
|
|
1357
|
+
roam health --gate # exit 5 on failure (reads .roam-gates.yml)
|
|
1358
|
+
roam --json health > report.json
|
|
1359
|
+
```
|
|
1360
|
+
|
|
1361
|
+
</details>
|
|
1362
|
+
|
|
1363
|
+
## SARIF Output
|
|
1364
|
+
|
|
1365
|
+
Roam exports analysis results in [SARIF 2.1.0](https://sarifweb.azurewebsites.net/) format for GitHub Code Scanning.
|
|
1366
|
+
|
|
1367
|
+
```python
|
|
1368
|
+
from roam.output.sarif import health_to_sarif, write_sarif
|
|
1369
|
+
|
|
1370
|
+
sarif = health_to_sarif(health_data)
|
|
1371
|
+
write_sarif(sarif, "roam-health.sarif")
|
|
1372
|
+
```
|
|
1373
|
+
|
|
1374
|
+
```yaml
|
|
1375
|
+
- uses: github/codeql-action/upload-sarif@v3
|
|
1376
|
+
with:
|
|
1377
|
+
sarif_file: roam-health.sarif
|
|
1378
|
+
```
|
|
1379
|
+
|
|
1380
|
+
## For Teams
|
|
1381
|
+
|
|
1382
|
+
Zero infrastructure, zero vendor lock-in, zero data leaving your network.
|
|
1383
|
+
|
|
1384
|
+
| Tool | Annual cost (20-dev team) | Infrastructure | Setup time |
|
|
1385
|
+
|------|--------------------------|----------------|------------|
|
|
1386
|
+
| SonarQube Server | $15,000-$45,000 | Self-hosted server | Days |
|
|
1387
|
+
| CodeScene | $20,000-$60,000 | SaaS or on-prem | Hours |
|
|
1388
|
+
| Code Climate | $12,000-$36,000 | SaaS | Hours |
|
|
1389
|
+
| **Roam** | **$0 (Apache 2.0)** | **None (local)** | **5 minutes** |
|
|
1390
|
+
|
|
1391
|
+
<details>
|
|
1392
|
+
<summary><strong>Team rollout guide</strong></summary>
|
|
1393
|
+
|
|
1394
|
+
**Week 1-2 (pilot):** 1-2 developers run `roam init` on one repo. Use `roam preflight` before changes, `roam pr-risk` before PRs.
|
|
1395
|
+
|
|
1396
|
+
**Week 3-4 (expand):** Add `roam health --gate` to CI as a non-blocking check (configure thresholds in `.roam-gates.yml`).
|
|
1397
|
+
|
|
1398
|
+
**Month 2+ (standardize):** Tighten gate thresholds. Expand to additional repos. Track trajectory with `roam trends`.
|
|
1399
|
+
|
|
1400
|
+
</details>
|
|
1401
|
+
|
|
1402
|
+
<details>
|
|
1403
|
+
<summary><strong>Complements your existing stack</strong></summary>
|
|
1404
|
+
|
|
1405
|
+
| If you use... | Roam adds... |
|
|
1406
|
+
|---------------|-------------|
|
|
1407
|
+
| **SonarQube** | Architecture-level analysis: dependency cycles, god components, blast radius, health scoring |
|
|
1408
|
+
| **CodeScene** | Free, local alternative for health scoring and hotspot analysis |
|
|
1409
|
+
| **ESLint / Pylint** | Cross-language architecture checks. Linters enforce style per file; Roam enforces architecture across the codebase |
|
|
1410
|
+
| **LSP** | AI-agent-optimized queries. `roam context` answers "what calls this?" with PageRank-ranked results in one call |
|
|
1411
|
+
|
|
1412
|
+
</details>
|
|
1413
|
+
|
|
1414
|
+
## Language Support
|
|
1415
|
+
|
|
1416
|
+
### Tier 1 -- Full extraction (dedicated parsers)
|
|
1417
|
+
|
|
1418
|
+
| Language | Extensions | Symbols | References | Inheritance |
|
|
1419
|
+
|----------|-----------|---------|------------|-------------|
|
|
1420
|
+
| Python | `.py` `.pyi` | classes, functions, methods, decorators, variables | imports, calls, inheritance | extends, `__all__` exports |
|
|
1421
|
+
| JavaScript | `.js` `.jsx` `.mjs` `.cjs` | classes, functions, arrow functions, CJS exports | imports, require(), calls | extends |
|
|
1422
|
+
| TypeScript | `.ts` `.tsx` `.mts` `.cts` | interfaces, type aliases, enums + all JS | imports, calls, type refs | extends, implements |
|
|
1423
|
+
| Java | `.java` | classes, interfaces, enums, constructors, fields | imports, calls | extends, implements |
|
|
1424
|
+
| Go | `.go` | structs, interfaces, functions, methods, fields | imports, calls | embedded structs |
|
|
1425
|
+
| Rust | `.rs` | structs, traits, impls, enums, functions | use, calls | impl Trait for Struct |
|
|
1426
|
+
| C / C++ | `.c` `.h` `.cpp` `.hpp` `.cc` | structs, classes, functions, namespaces, templates | includes, calls | extends |
|
|
1427
|
+
| C# | `.cs` | classes, interfaces, structs, enums, records, methods, constructors, properties, delegates, events, fields | using directives, calls, `new`, attributes | extends, implements |
|
|
1428
|
+
| PHP | `.php` | classes, interfaces, traits, enums, methods, properties | namespace use, calls, static calls, `new` | extends, implements, use (traits) |
|
|
1429
|
+
| Visual FoxPro | `.prg` | functions, procedures, classes, methods, properties, constants | DO, SET PROCEDURE/CLASSLIB, CREATEOBJECT, `=func()`, `obj.method()` | DEFINE CLASS ... AS |
|
|
1430
|
+
| YAML (CI/CD) | `.yml` `.yaml` | GitLab CI: jobs, template anchors, stages. GitHub Actions: workflow name, jobs, reusable workflows. Generic: top-level keys | `extends:`, `needs:`, `!reference`, `uses:` | — |
|
|
1431
|
+
| HCL / Terraform | `.tf` `.tfvars` `.hcl` | `resource`, `data`, `variable`, `output`, `module`, `provider`, `locals` entries | `var.*`, `module.*`, `data.*`, `local.*`, resource cross-refs | — |
|
|
1432
|
+
| Vue | `.vue` | via `<script>` block extraction (TS/JS) | imports, calls, type refs | extends, implements |
|
|
1433
|
+
| Svelte | `.svelte` | via `<script>` block extraction (TS/JS) | imports, calls, type refs | extends, implements |
|
|
1434
|
+
|
|
1435
|
+
<details>
|
|
1436
|
+
<summary><strong>Salesforce ecosystem (Tier 1)</strong></summary>
|
|
1437
|
+
|
|
1438
|
+
| Language | Extensions | Symbols | References |
|
|
1439
|
+
|----------|-----------|---------|------------|
|
|
1440
|
+
| Apex | `.cls` `.trigger` | classes, triggers, SOQL, annotations | imports, calls, System.Label, generic type refs |
|
|
1441
|
+
| Aura | `.cmp` `.app` `.evt` `.intf` `.design` | components, attributes, methods, events | controller refs, component refs |
|
|
1442
|
+
| LWC (JavaScript) | `.js` (in LWC dirs) | anonymous class from filename | `@salesforce/apex/`, `@salesforce/schema/`, `@salesforce/label/` |
|
|
1443
|
+
| Visualforce | `.page` `.component` | pages, components | controller/extensions, merge fields, includes |
|
|
1444
|
+
| SF Metadata XML | `*-meta.xml` | objects, fields, rules, layouts | Apex class refs, formula field refs, Flow actionCalls |
|
|
1445
|
+
|
|
1446
|
+
Cross-language edges mean `roam impact AccountService` shows blast radius across Apex, LWC, Aura, Visualforce, and Flows.
|
|
1447
|
+
|
|
1448
|
+
</details>
|
|
1449
|
+
|
|
1450
|
+
| Ruby | `.rb` | classes, modules, methods, singleton methods, constants | require, require_relative, include/extend, calls, ClassName.new | class inheritance |
|
|
1451
|
+
| Kotlin | `.kt` `.kts` | classes, interfaces, enums, objects, functions, methods, properties | imports, calls, type refs | extends, implements |
|
|
1452
|
+
| Scala | `.scala` `.sc` | classes, traits, objects, case classes, functions, methods, val/var, type aliases | imports, calls, `new` | extends, with (trait mixins) |
|
|
1453
|
+
| SQL (DDL) | `.sql` | tables, columns, views, functions, triggers, schemas, types (enums), sequences | foreign keys, view table deps, trigger table/function refs | -- |
|
|
1454
|
+
| Swift | `.swift` | classes, structs, enums, protocols, functions, methods, properties | imports, calls, type refs | extends, conforms |
|
|
1455
|
+
| JSONC | `.jsonc` | via JSON grammar | -- | -- |
|
|
1456
|
+
| MDX | `.mdx` | via Markdown grammar | -- | -- |
|
|
1457
|
+
|
|
1458
|
+
## Performance
|
|
1459
|
+
|
|
1460
|
+
| Metric | Value |
|
|
1461
|
+
|--------|-------|
|
|
1462
|
+
| Index 200 files | ~3-5s |
|
|
1463
|
+
| Index 3,000 files | ~2 min |
|
|
1464
|
+
| Incremental (no changes) | <1s |
|
|
1465
|
+
| Any query command | <0.5s |
|
|
1466
|
+
|
|
1467
|
+
<details>
|
|
1468
|
+
<summary><strong>Detailed benchmarks</strong></summary>
|
|
1469
|
+
|
|
1470
|
+
### Indexing Speed
|
|
1471
|
+
|
|
1472
|
+
| Project | Language | Files | Symbols | Edges | Index Time | Rate |
|
|
1473
|
+
|---------|----------|-------|---------|-------|-----------|------|
|
|
1474
|
+
| Express | JS | 211 | 624 | 804 | 3s | 70 files/s |
|
|
1475
|
+
| Axios | JS | 237 | 1,065 | 868 | 6s | 41 files/s |
|
|
1476
|
+
| Vue | TS | 697 | 5,335 | 8,984 | 25s | 28 files/s |
|
|
1477
|
+
| Laravel | PHP | 3,058 | 39,097 | 38,045 | 1m46s | 29 files/s |
|
|
1478
|
+
| Svelte | TS | 8,445 | 16,445 | 19,618 | 2m40s | 52 files/s |
|
|
1479
|
+
|
|
1480
|
+
### Quality Benchmark
|
|
1481
|
+
|
|
1482
|
+
| Repo | Language | Score | Coverage | Edge Density |
|
|
1483
|
+
|------|----------|-------|----------|--------------|
|
|
1484
|
+
| Laravel | PHP | **9.55** | 91.2% | 0.97 |
|
|
1485
|
+
| Vue | TS | **9.27** | 85.8% | 1.68 |
|
|
1486
|
+
| Svelte | TS | **9.04** | 94.7% | 1.19 |
|
|
1487
|
+
| Axios | JS | **8.98** | 85.9% | 0.82 |
|
|
1488
|
+
| Express | JS | **8.46** | 96.0% | 1.29 |
|
|
1489
|
+
|
|
1490
|
+
### Token Efficiency
|
|
1491
|
+
|
|
1492
|
+
| Metric | Value |
|
|
1493
|
+
|--------|-------|
|
|
1494
|
+
| 1,600-line file → `roam file` | ~5,000 chars (~70:1 compression) |
|
|
1495
|
+
| Full project map | ~4,000 chars |
|
|
1496
|
+
| `--compact` mode | 40-50% additional token reduction |
|
|
1497
|
+
| `roam preflight` replaces | 5-7 separate agent tool calls |
|
|
1498
|
+
|
|
1499
|
+
</details>
|
|
1500
|
+
|
|
1501
|
+
Agent-efficiency benchmarks: see the [`benchmarks/`](benchmarks/) directory for harness, repos, and results.
|
|
1502
|
+
|
|
1503
|
+
## How It Works
|
|
1504
|
+
|
|
1505
|
+
```
|
|
1506
|
+
Codebase
|
|
1507
|
+
|
|
|
1508
|
+
[1] Discovery ──── git ls-files (respects .gitignore + .roamignore)
|
|
1509
|
+
|
|
|
1510
|
+
[2] Parse ──────── tree-sitter AST per file (27 languages)
|
|
1511
|
+
|
|
|
1512
|
+
[3] Extract ────── symbols + references (calls, imports, inheritance)
|
|
1513
|
+
|
|
|
1514
|
+
[4] Resolve ────── match references to definitions → edges
|
|
1515
|
+
|
|
|
1516
|
+
[5] Metrics ────── adaptive PageRank, betweenness, cognitive complexity, Halstead
|
|
1517
|
+
|
|
|
1518
|
+
[6] Algorithms ── 23-pattern anti-pattern catalog (O(n^2) loops, N+1, recursion)
|
|
1519
|
+
|
|
|
1520
|
+
[7] Git ────────── churn, co-change matrix, authorship, Renyi entropy
|
|
1521
|
+
|
|
|
1522
|
+
[8] Clusters ───── Louvain community detection
|
|
1523
|
+
|
|
|
1524
|
+
[9] Health ─────── per-file scores (7-factor) + composite score (0-100)
|
|
1525
|
+
|
|
|
1526
|
+
[10] Store ─────── .roam/index.db (SQLite, WAL mode)
|
|
1527
|
+
```
|
|
1528
|
+
|
|
1529
|
+
After the first full index, `roam index` only re-processes changed files (mtime + SHA-256 hash). Incremental updates are near-instant.
|
|
1530
|
+
|
|
1531
|
+
### .roamignore
|
|
1532
|
+
|
|
1533
|
+
Create a `.roamignore` file in your project root to exclude files from indexing. It uses **full gitignore syntax**:
|
|
1534
|
+
|
|
1535
|
+
| Pattern | Meaning |
|
|
1536
|
+
|---------|---------|
|
|
1537
|
+
| `*.log` | Exclude all `.log` files (basename match) |
|
|
1538
|
+
| `vendor/` | Exclude the `vendor` directory and everything under it |
|
|
1539
|
+
| `/build/` | Exclude `build/` at repo root only (anchored) |
|
|
1540
|
+
| `src/**/*.pb.go` | Exclude `.pb.go` files at any depth under `src/` |
|
|
1541
|
+
| `**/test_*.py` | Exclude `test_*.py` files anywhere |
|
|
1542
|
+
| `?` | Match any single character (not `/`) |
|
|
1543
|
+
| `[abc]` / `[!abc]` | Character class / negated character class |
|
|
1544
|
+
| `!important.log` | Un-exclude (re-include) `important.log` |
|
|
1545
|
+
| `# comment` | Lines starting with `#` are comments |
|
|
1546
|
+
|
|
1547
|
+
Key rules: `*` matches within a single path segment (not across `/`). `**` matches across `/` boundaries. Last matching pattern wins (for negation). Patterns containing `/` are anchored to the repo root.
|
|
1548
|
+
|
|
1549
|
+
```
|
|
1550
|
+
# .roamignore example
|
|
1551
|
+
*_pb2.py
|
|
1552
|
+
*_pb2_grpc.py
|
|
1553
|
+
vendor/
|
|
1554
|
+
node_modules/
|
|
1555
|
+
*.generated.*
|
|
1556
|
+
/build/
|
|
1557
|
+
!build/keep/
|
|
1558
|
+
```
|
|
1559
|
+
|
|
1560
|
+
You can also exclude patterns via `roam config --exclude "*.proto"` (stored in `.roam/config.json`) or inspect active patterns with `roam config --show`.
|
|
1561
|
+
|
|
1562
|
+
<details>
|
|
1563
|
+
<summary><strong>Graph algorithms</strong></summary>
|
|
1564
|
+
|
|
1565
|
+
- **Adaptive PageRank** -- damping factor auto-tunes based on cycle density (0.82-0.92); identifies the most important symbols (used by `map`, `search`, `context`)
|
|
1566
|
+
- **Personalized PageRank** -- distance-weighted blast radius for `impact` (Gleich, 2015)
|
|
1567
|
+
- **Adaptive betweenness centrality** -- exact for small graphs, sqrt-scaled sampling for large (Brandes & Pich, 2007); finds bottleneck symbols
|
|
1568
|
+
- **Edge betweenness centrality** -- identifies critical cycle-breaking edges in SCCs (Brandes, 2001)
|
|
1569
|
+
- **Tarjan's SCC** -- detects dependency cycles with tangle ratio
|
|
1570
|
+
- **Propagation Cost** -- fraction of system affected by any change, via transitive closure (MacCormack, Rusnak & Baldwin, 2006)
|
|
1571
|
+
- **Algebraic connectivity (Fiedler value)** -- second-smallest Laplacian eigenvalue; measures architectural robustness (Fiedler, 1973)
|
|
1572
|
+
- **Louvain community detection** -- groups related symbols into clusters
|
|
1573
|
+
- **Modularity Q-score** -- measures if cluster boundaries match natural community structure (Newman, 2004)
|
|
1574
|
+
- **Conductance** -- per-cluster boundary tightness: cut(S, S_bar) / min(vol(S), vol(S_bar)) (Yang & Leskovec)
|
|
1575
|
+
- **Topological sort** -- computes dependency layers, Gini coefficient for layer balance (Gini, 1912), weighted violation severity
|
|
1576
|
+
- **k-shortest simple paths** -- traces dependency paths with coupling strength
|
|
1577
|
+
- **Renyi entropy (order 2)** -- measures co-change distribution; more robust to outliers than Shannon (Renyi, 1961)
|
|
1578
|
+
- **Mann-Kendall trend test** -- non-parametric degradation detection, robust to noise (Mann, 1945; Kendall, 1975)
|
|
1579
|
+
- **Sen's slope estimator** -- robust trend magnitude, resistant to outliers (Sen, 1968)
|
|
1580
|
+
- **NPMI** -- Normalized Pointwise Mutual Information for coupling strength (Bouma, 2009)
|
|
1581
|
+
- **Lift** -- association rule mining metric for co-change statistical significance (Agrawal & Srikant, 1994)
|
|
1582
|
+
- **Halstead metrics** -- volume, difficulty, effort, and predicted bugs from operator/operand counts (Halstead, 1977)
|
|
1583
|
+
- **SQALE remediation cost** -- time-to-fix estimates per issue type for tech debt prioritization (Letouzey, 2012)
|
|
1584
|
+
- **Algorithm anti-pattern catalog** -- 23 patterns detecting suboptimal algorithms (quadratic loops, N+1 queries, quadratic string building, branching recursion, manual top-k, loop-invariant calls) with confidence calibration via caller-count and bounded-loop analysis
|
|
1585
|
+
|
|
1586
|
+
</details>
|
|
1587
|
+
|
|
1588
|
+
<details>
|
|
1589
|
+
<summary><strong>Health scoring</strong></summary>
|
|
1590
|
+
|
|
1591
|
+
Composite health score (0-100) using a **weighted geometric mean** of sigmoid health factors. Non-compensatory: a zero in any dimension cannot be masked by high scores in others.
|
|
1592
|
+
|
|
1593
|
+
| Factor | Weight | What it measures |
|
|
1594
|
+
|--------|--------|-----------------|
|
|
1595
|
+
| Tangle ratio | 30% | % of symbols in dependency cycles |
|
|
1596
|
+
| God components | 20% | Symbols with extreme fan-in/fan-out |
|
|
1597
|
+
| Bottlenecks | 15% | High-betweenness chokepoints |
|
|
1598
|
+
| Layer violations | 15% | Upward dependency violations (severity-weighted by layer distance) |
|
|
1599
|
+
| Per-file health | 20% | Average of 7-factor file health scores |
|
|
1600
|
+
|
|
1601
|
+
Each factor uses sigmoid health: `h = e^(-signal/scale)` (1 = pristine, approaches 0 = worst). Score = `100 * product(h_i ^ w_i)`. Also reports **propagation cost** (MacCormack 2006) and **algebraic connectivity** (Fiedler 1973). Per-file health (1-10) combines: cognitive complexity (triangular nesting penalty per Sweller's Cognitive Load Theory), indentation complexity, cycle membership, god component membership, dead export ratio, co-change entropy, and churn amplification.
|
|
1602
|
+
|
|
1603
|
+
</details>
|
|
1604
|
+
|
|
1605
|
+
## How Roam Compares
|
|
1606
|
+
|
|
1607
|
+
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.
|
|
1608
|
+
|
|
1609
|
+
Documentation (local HTML in `docs/site/`, CI-deployed via `.github/workflows/pages.yml`):
|
|
1610
|
+
- `docs/site/getting-started.html` — tutorial
|
|
1611
|
+
- `docs/site/command-reference.html` — examples
|
|
1612
|
+
- `docs/site/architecture.html` — diagram + internals
|
|
1613
|
+
- `docs/site/landscape.html` — competitor matrix
|
|
1614
|
+
|
|
1615
|
+
| Capability | roam-code | AI IDEs (Cursor, Windsurf) | AI Agents (Claude Code, Codex) | SAST (SonarQube, CodeQL) |
|
|
1616
|
+
|---|---|---|---|---|
|
|
1617
|
+
| Persistent local index | SQLite | Cloud embeddings | None | Per-scan |
|
|
1618
|
+
| Call graph analysis | Yes | No | No | Yes (CodeQL) |
|
|
1619
|
+
| PageRank / centrality | Yes | No | No | No |
|
|
1620
|
+
| Cycle detection (Tarjan) | Yes | No | No | Deprecated (SonarQube) |
|
|
1621
|
+
| Community detection (Louvain) | Yes | No | No | No |
|
|
1622
|
+
| Git churn / co-change | Yes | No | No | No |
|
|
1623
|
+
| Architecture simulation | Yes | No | No | No |
|
|
1624
|
+
| Multi-agent partitioning | Yes | No | No | No |
|
|
1625
|
+
| MCP tools for agents | 101 (24 in default core preset) | Client only | Client only | 34 (SonarQube) |
|
|
1626
|
+
| Languages | 26 | 70+ | 50+ | 12-42 |
|
|
1627
|
+
| 100% local, zero API keys | Yes | No | No | Partial |
|
|
1628
|
+
| Open source | Apache 2.0 | No | Partial | Partial |
|
|
1629
|
+
|
|
1630
|
+
### Key Differentiators
|
|
1631
|
+
|
|
1632
|
+
- **vs AI IDEs** (Cursor, Windsurf, Augment): roam-code provides deterministic structural analysis. AI IDEs use probabilistic embeddings that can't guarantee reproducible results.
|
|
1633
|
+
- **vs AI Agents** (Claude Code, Codex CLI, Gemini CLI): These agents read files one at a time. roam-code pre-computes relationships so agents get instant answers about architecture, blast radius, and dependencies.
|
|
1634
|
+
- **vs SAST Tools** (SonarQube, CodeQL, Semgrep): SAST tools find bugs and vulnerabilities. roam-code understands architecture -- how code is structured, where it's coupled, and what breaks when you change it. Complementary, not competitive.
|
|
1635
|
+
- **vs Code Search** (Sourcegraph/Amp, Greptile): Text search finds where code is. roam-code understands why code matters -- which functions are central, which modules are tangled, which files are high-risk.
|
|
1636
|
+
|
|
1637
|
+
## FAQ
|
|
1638
|
+
|
|
1639
|
+
**Does Roam send any data externally?**
|
|
1640
|
+
No. Zero network calls. No telemetry, no analytics, no update checks.
|
|
1641
|
+
|
|
1642
|
+
**Can Roam run in air-gapped environments?**
|
|
1643
|
+
Yes. Once installed, no internet access is required.
|
|
1644
|
+
|
|
1645
|
+
**Does Roam modify my source code?**
|
|
1646
|
+
Read-only by default. Creates `.roam/` with an index database. The `roam mutate` command can apply code changes (move/rename/extract) but defaults to `--dry-run` mode — you must explicitly pass `--apply` to write changes.
|
|
1647
|
+
|
|
1648
|
+
**How does Roam handle monorepos?**
|
|
1649
|
+
Indexes from the root. Batched SQL handles 100k+ symbols. Incremental updates stay fast.
|
|
1650
|
+
|
|
1651
|
+
**How does Roam handle multi-repo projects (e.g., frontend + backend)?**
|
|
1652
|
+
Use `roam ws init <repo1> <repo2>` to create a workspace. Each repo keeps its own index; a workspace overlay DB stores cross-repo API edges. `roam ws resolve` scans for REST endpoints and matches frontend calls to backend routes. Then `roam ws context`, `roam ws trace`, etc. work across repos.
|
|
1653
|
+
|
|
1654
|
+
**Is Roam compatible with SonarQube / CodeScene?**
|
|
1655
|
+
Yes. Roam complements existing tools. Both can run in the same CI pipeline. SARIF output integrates with GitHub Code Scanning.
|
|
1656
|
+
|
|
1657
|
+
## Limitations
|
|
1658
|
+
|
|
1659
|
+
Static analysis trade-offs:
|
|
1660
|
+
|
|
1661
|
+
- **Static analysis primarily** -- can't trace dynamic dispatch, reflection, or eval'd code. Runtime trace ingestion (`roam ingest-trace`) adds production data but requires external trace export
|
|
1662
|
+
- **Import resolution is heuristic** -- complex re-exports or conditional imports may not resolve
|
|
1663
|
+
- **Limited cross-language edges** -- Salesforce, Protobuf, REST API, and multi-repo edges are supported, but not arbitrary FFI
|
|
1664
|
+
- **Tier 2 languages** get basic symbol extraction only via generic tree-sitter walker
|
|
1665
|
+
- **Large monorepos** (100k+ files) may have slow initial indexing
|
|
1666
|
+
|
|
1667
|
+
## Troubleshooting
|
|
1668
|
+
|
|
1669
|
+
| Problem | Solution |
|
|
1670
|
+
|---------|----------|
|
|
1671
|
+
| `roam: command not found` | Ensure install location is on PATH. For `uv`: `uv tool update-shell` |
|
|
1672
|
+
| `Another indexing process is running` | Delete `.roam/index.lock` and retry |
|
|
1673
|
+
| `database is locked` | `roam index --force` to rebuild |
|
|
1674
|
+
| Unicode errors on Windows | `chcp 65001` for UTF-8 |
|
|
1675
|
+
| Symbol resolves to wrong file | Use `file:symbol` syntax: `roam symbol myfile:MyFunction` |
|
|
1676
|
+
| Health score seems wrong | `roam --json health` for factor breakdown |
|
|
1677
|
+
| Index stale after `git pull` | `roam index` (incremental). After major refactors: `roam index --force` |
|
|
1678
|
+
|
|
1679
|
+
## Update / Uninstall
|
|
1680
|
+
|
|
1681
|
+
```bash
|
|
1682
|
+
# Update
|
|
1683
|
+
pipx upgrade roam-code
|
|
1684
|
+
uv tool upgrade roam-code
|
|
1685
|
+
pip install --upgrade roam-code
|
|
1686
|
+
|
|
1687
|
+
# Uninstall
|
|
1688
|
+
pipx uninstall roam-code
|
|
1689
|
+
uv tool uninstall roam-code
|
|
1690
|
+
pip uninstall roam-code
|
|
1691
|
+
```
|
|
1692
|
+
|
|
1693
|
+
Delete `.roam/` from your project root to clean up local data.
|
|
1694
|
+
|
|
1695
|
+
## Development
|
|
1696
|
+
|
|
1697
|
+
```bash
|
|
1698
|
+
git clone https://github.com/Cranot/roam-code.git
|
|
1699
|
+
cd roam-code
|
|
1700
|
+
pip install -e ".[dev]" # includes pytest, ruff
|
|
1701
|
+
pytest tests/ # ~5500 tests, Python 3.9-3.13
|
|
1702
|
+
|
|
1703
|
+
# Or use Make targets:
|
|
1704
|
+
make dev # install with dev extras
|
|
1705
|
+
make test # run tests
|
|
1706
|
+
make lint # ruff check
|
|
1707
|
+
```
|
|
1708
|
+
|
|
1709
|
+
<details>
|
|
1710
|
+
<summary><strong>Project structure</strong></summary>
|
|
1711
|
+
|
|
1712
|
+
```
|
|
1713
|
+
roam-code/
|
|
1714
|
+
├── pyproject.toml
|
|
1715
|
+
├── action.yml # Reusable GitHub Action
|
|
1716
|
+
├── src/roam/
|
|
1717
|
+
│ ├── __init__.py # Version (from pyproject.toml)
|
|
1718
|
+
│ ├── cli.py # Click CLI (177 canonical + 7 aliases)
|
|
1719
|
+
│ ├── mcp_server.py # MCP server (122 tools, 10 resources, 5 prompts)
|
|
1720
|
+
│ ├── db/
|
|
1721
|
+
│ │ ├── connection.py # SQLite (WAL, pragmas, batched IN)
|
|
1722
|
+
│ │ ├── schema.py # Tables, indexes, migrations
|
|
1723
|
+
│ │ └── queries.py # Named SQL constants
|
|
1724
|
+
│ ├── index/
|
|
1725
|
+
│ │ ├── indexer.py # Orchestrates full pipeline
|
|
1726
|
+
│ │ ├── discovery.py # git ls-files, .gitignore
|
|
1727
|
+
│ │ ├── parser.py # Tree-sitter parsing
|
|
1728
|
+
│ │ ├── symbols.py # Symbol + reference extraction
|
|
1729
|
+
│ │ ├── relations.py # Reference resolution -> edges
|
|
1730
|
+
│ │ ├── complexity.py # Cognitive complexity (SonarSource) + Halstead metrics
|
|
1731
|
+
│ │ ├── git_stats.py # Churn, co-change, blame, Renyi entropy
|
|
1732
|
+
│ │ ├── incremental.py # mtime + hash change detection
|
|
1733
|
+
│ │ ├── file_roles.py # Smart file role classifier
|
|
1734
|
+
│ │ └── test_conventions.py # Pluggable test naming adapters
|
|
1735
|
+
│ ├── languages/
|
|
1736
|
+
│ │ ├── base.py # Abstract LanguageExtractor
|
|
1737
|
+
│ │ ├── registry.py # Language detection + aliasing
|
|
1738
|
+
│ │ ├── *_lang.py # One file per language (21 dedicated + generic)
|
|
1739
|
+
│ │ └── generic_lang.py # Tier 2 fallback
|
|
1740
|
+
│ ├── bridges/
|
|
1741
|
+
│ │ ├── base.py, registry.py # Cross-language bridge framework
|
|
1742
|
+
│ │ ├── bridge_salesforce.py # Apex <-> Aura/LWC/Visualforce
|
|
1743
|
+
│ │ └── bridge_protobuf.py # .proto -> Go/Java/Python stubs
|
|
1744
|
+
│ ├── catalog/
|
|
1745
|
+
│ │ ├── tasks.py # Universal algorithm catalog (23 patterns)
|
|
1746
|
+
│ │ └── detectors.py # Anti-pattern detectors with confidence calibration
|
|
1747
|
+
│ ├── workspace/
|
|
1748
|
+
│ │ ├── config.py # .roam-workspace.json
|
|
1749
|
+
│ │ ├── db.py # Workspace overlay DB
|
|
1750
|
+
│ │ ├── api_scanner.py # REST API endpoint detection
|
|
1751
|
+
│ │ └── aggregator.py # Cross-repo aggregation
|
|
1752
|
+
│ ├── graph/
|
|
1753
|
+
│ │ ├── builder.py, pagerank.py # DB -> NetworkX, PageRank
|
|
1754
|
+
│ │ ├── cycles.py, clusters.py # Tarjan SCC, propagation cost, Louvain, modularity Q
|
|
1755
|
+
│ │ ├── layers.py, pathfinding.py # Topo layers, k-shortest paths
|
|
1756
|
+
│ │ ├── simulate.py, spectral.py # Architecture simulation, Fiedler bisection
|
|
1757
|
+
│ │ ├── partition.py, fingerprint.py # Multi-agent partitioning, topology fingerprints
|
|
1758
|
+
│ │ └── anomaly.py # Statistical anomaly detection
|
|
1759
|
+
│ ├── commands/
|
|
1760
|
+
│ │ ├── resolve.py # Shared symbol resolution
|
|
1761
|
+
│ │ ├── graph_helpers.py # Shared graph utilities (adj builders, BFS)
|
|
1762
|
+
│ │ ├── context_helpers.py # Data-gathering helpers for context command
|
|
1763
|
+
│ │ ├── gate_presets.py # Framework-specific gate rules
|
|
1764
|
+
│ │ └── cmd_*.py # One module per command
|
|
1765
|
+
│ ├── analysis/
|
|
1766
|
+
│ │ ├── effects.py # Side-effect classification engine
|
|
1767
|
+
│ │ └── taint.py # Taint analysis
|
|
1768
|
+
│ ├── refactor/
|
|
1769
|
+
│ │ ├── codegen.py # Import generation (Python/JS/Go)
|
|
1770
|
+
│ │ └── transforms.py # move/rename/add-call/extract transforms
|
|
1771
|
+
│ ├── rules/
|
|
1772
|
+
│ │ ├── engine.py # YAML rule parser + graph query evaluator
|
|
1773
|
+
│ │ ├── builtin.py # 10 built-in governance rules
|
|
1774
|
+
│ │ ├── ast_match.py # AST pattern matching with $METAVAR captures
|
|
1775
|
+
│ │ └── dataflow.py # Intra-procedural dataflow analysis
|
|
1776
|
+
│ ├── runtime/
|
|
1777
|
+
│ │ ├── trace_ingest.py # OpenTelemetry/Jaeger/Zipkin ingestion
|
|
1778
|
+
│ │ └── hotspots.py # Runtime hotspot analysis
|
|
1779
|
+
│ ├── search/
|
|
1780
|
+
│ │ ├── tfidf.py # TF-IDF semantic search engine
|
|
1781
|
+
│ │ ├── index_embeddings.py # Embedding index builder
|
|
1782
|
+
│ │ └── onnx_embeddings.py # Optional local ONNX semantic backend
|
|
1783
|
+
│ ├── security/
|
|
1784
|
+
│ │ ├── vuln_store.py # CVE/vulnerability storage
|
|
1785
|
+
│ │ └── vuln_reach.py # Vulnerability reachability paths
|
|
1786
|
+
│ └── output/
|
|
1787
|
+
│ ├── formatter.py # Token-efficient formatting
|
|
1788
|
+
│ ├── sarif.py # SARIF 2.1.0 output
|
|
1789
|
+
│ └── schema_registry.py # JSON envelope schema versioning
|
|
1790
|
+
└── tests/ # ~5500 tests across 186 test files
|
|
1791
|
+
```
|
|
1792
|
+
|
|
1793
|
+
</details>
|
|
1794
|
+
|
|
1795
|
+
### Dependencies
|
|
1796
|
+
|
|
1797
|
+
| Package | Purpose |
|
|
1798
|
+
|---------|---------|
|
|
1799
|
+
| [click](https://click.palletsprojects.com/) >= 8.0 | CLI framework |
|
|
1800
|
+
| [tree-sitter](https://github.com/tree-sitter/py-tree-sitter) >= 0.23 | AST parsing |
|
|
1801
|
+
| [tree-sitter-language-pack](https://github.com/nicolo-ribaudo/tree-sitter-language-pack) >= 0.6 | 165+ grammars |
|
|
1802
|
+
| [networkx](https://networkx.org/) >= 3.0 | Graph algorithms |
|
|
1803
|
+
|
|
1804
|
+
Optional: [fastmcp](https://github.com/jlowin/fastmcp) >= 2.0 (MCP server — install with `pip install "roam-code[mcp]"`)
|
|
1805
|
+
|
|
1806
|
+
Optional: Local semantic ONNX stack (`numpy`, `onnxruntime`, `tokenizers`) via `pip install "roam-code[semantic]"`; verify activation with `roam config --semantic-status`.
|
|
1807
|
+
|
|
1808
|
+
## Roadmap
|
|
1809
|
+
|
|
1810
|
+
### Shipped
|
|
1811
|
+
|
|
1812
|
+
- [x] MCP v2 agent surface: in-process execution, compound operations, presets, schemas, annotations, and compatibility profiles.
|
|
1813
|
+
- [x] Full command and MCP inventory parity in docs: 177 canonical CLI commands and 128 MCP tools.
|
|
1814
|
+
- [x] CI hardening: composite action, changed-only mode, trend-aware gates, sticky PR updater, and SARIF guardrails.
|
|
1815
|
+
- [x] Performance foundation: FTS5/BM25 search, O(changed) incremental indexing, DB/index optimizations.
|
|
1816
|
+
- [x] Agent governance suite: `vibe-check`, `ai-readiness`, `verify`, `ai-ratio`, `duplicates`, advanced `algo` scoring/SARIF.
|
|
1817
|
+
- [x] Ownership/review intelligence: `codeowners`, `drift`, `simulate-departure`, `suggest-reviewers`, `api-changes`, `test-gaps`, `semantic-diff`, `secrets`.
|
|
1818
|
+
- [x] Multi-agent operations: `partition`, `affected`, `syntax-check`, workspace-aware context and traces.
|
|
1819
|
+
- [x] Budget-aware context delivery: `--budget` (partial rollout), PageRank-weighted truncation, conversation-aware ranking.
|
|
1820
|
+
|
|
1821
|
+
### Next
|
|
1822
|
+
|
|
1823
|
+
- [x] Terminal demo GIF in README.
|
|
1824
|
+
- [ ] GitHub repo topics.
|
|
1825
|
+
- [ ] GitHub Discussions enabled.
|
|
1826
|
+
- [ ] MCP directory + awesome-list submissions.
|
|
1827
|
+
|
|
1828
|
+
## Contributing
|
|
1829
|
+
|
|
1830
|
+
```bash
|
|
1831
|
+
git clone https://github.com/Cranot/roam-code.git
|
|
1832
|
+
cd roam-code
|
|
1833
|
+
pip install -e .
|
|
1834
|
+
pytest tests/ # all ~5500 tests must pass
|
|
1835
|
+
```
|
|
1836
|
+
|
|
1837
|
+
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.
|
|
1838
|
+
|
|
1839
|
+
Please open an issue first to discuss larger changes.
|
|
1840
|
+
|
|
1841
|
+
## License
|
|
1842
|
+
|
|
1843
|
+
[Apache 2.0](LICENSE)
|