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