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