roam-code 9.0.0__tar.gz → 9.1.0__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-9.0.0/src/roam_code.egg-info → roam_code-9.1.0}/PKG-INFO +20 -13
- {roam_code-9.0.0 → roam_code-9.1.0}/README.md +18 -11
- {roam_code-9.0.0 → roam_code-9.1.0}/pyproject.toml +2 -2
- {roam_code-9.0.0 → roam_code-9.1.0/src/roam_code.egg-info}/PKG-INFO +20 -13
- {roam_code-9.0.0 → roam_code-9.1.0}/LICENSE +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/setup.cfg +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/__init__.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/__main__.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/bridges/__init__.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/bridges/base.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/bridges/bridge_protobuf.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/bridges/bridge_salesforce.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/bridges/registry.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/catalog/__init__.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/catalog/detectors.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/catalog/tasks.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/cli.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/commands/__init__.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/commands/changed_files.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/commands/cmd_affected_tests.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/commands/cmd_alerts.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/commands/cmd_breaking.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/commands/cmd_bus_factor.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/commands/cmd_clusters.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/commands/cmd_complexity.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/commands/cmd_context.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/commands/cmd_conventions.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/commands/cmd_coupling.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/commands/cmd_coverage_gaps.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/commands/cmd_dead.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/commands/cmd_debt.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/commands/cmd_deps.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/commands/cmd_describe.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/commands/cmd_diagnose.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/commands/cmd_diff.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/commands/cmd_digest.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/commands/cmd_doc_staleness.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/commands/cmd_entry_points.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/commands/cmd_fan.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/commands/cmd_file.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/commands/cmd_fitness.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/commands/cmd_fn_coupling.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/commands/cmd_grep.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/commands/cmd_health.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/commands/cmd_impact.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/commands/cmd_index.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/commands/cmd_init.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/commands/cmd_layers.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/commands/cmd_map.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/commands/cmd_math.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/commands/cmd_module.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/commands/cmd_owner.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/commands/cmd_patterns.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/commands/cmd_pr_risk.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/commands/cmd_preflight.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/commands/cmd_report.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/commands/cmd_risk.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/commands/cmd_safe_delete.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/commands/cmd_safe_zones.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/commands/cmd_search.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/commands/cmd_sketch.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/commands/cmd_snapshot.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/commands/cmd_split.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/commands/cmd_symbol.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/commands/cmd_testmap.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/commands/cmd_tour.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/commands/cmd_trace.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/commands/cmd_trend.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/commands/cmd_understand.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/commands/cmd_uses.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/commands/cmd_visualize.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/commands/cmd_weather.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/commands/cmd_why.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/commands/cmd_ws.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/commands/cmd_xlang.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/commands/context_helpers.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/commands/gate_presets.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/commands/graph_helpers.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/commands/metrics_history.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/commands/resolve.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/db/__init__.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/db/connection.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/db/queries.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/db/schema.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/graph/__init__.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/graph/anomaly.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/graph/builder.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/graph/clusters.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/graph/cycles.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/graph/layers.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/graph/pagerank.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/graph/pathfinding.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/index/__init__.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/index/complexity.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/index/discovery.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/index/file_roles.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/index/git_stats.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/index/incremental.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/index/indexer.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/index/parser.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/index/relations.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/index/symbols.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/index/test_conventions.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/languages/__init__.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/languages/apex_lang.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/languages/aura_lang.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/languages/base.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/languages/c_lang.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/languages/csharp_lang.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/languages/foxpro_lang.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/languages/generic_lang.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/languages/go_lang.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/languages/java_lang.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/languages/javascript_lang.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/languages/php_lang.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/languages/python_lang.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/languages/registry.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/languages/rust_lang.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/languages/sfxml_lang.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/languages/typescript_lang.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/languages/visualforce_lang.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/mcp_server.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/output/__init__.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/output/formatter.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/output/sarif.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/workspace/__init__.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/workspace/aggregator.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/workspace/api_scanner.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/workspace/config.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam/workspace/db.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam_code.egg-info/SOURCES.txt +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam_code.egg-info/dependency_links.txt +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam_code.egg-info/entry_points.txt +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam_code.egg-info/requires.txt +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/src/roam_code.egg-info/top_level.txt +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/tests/test_anomaly.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/tests/test_basic.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/tests/test_bridges.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/tests/test_commands_architecture.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/tests/test_commands_exploration.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/tests/test_commands_health.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/tests/test_commands_refactoring.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/tests/test_commands_workflow.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/tests/test_comprehensive.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/tests/test_dead_aging.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/tests/test_file_roles.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/tests/test_fixes.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/tests/test_formatters.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/tests/test_foxpro.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/tests/test_framework_detection.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/tests/test_gate_presets.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/tests/test_json_contracts.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/tests/test_languages.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/tests/test_math.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/tests/test_performance.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/tests/test_pr_risk_author.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/tests/test_python_extractor_v2.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/tests/test_resolve.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/tests/test_salesforce.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/tests/test_smoke.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/tests/test_test_conventions.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/tests/test_v6_features.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/tests/test_v71_features.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/tests/test_v7_features.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/tests/test_v82_features.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/tests/test_visualize.py +0 -0
- {roam_code-9.0.0 → roam_code-9.1.0}/tests/test_workspace.py +0 -0
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: roam-code
|
|
3
|
-
Version: 9.
|
|
3
|
+
Version: 9.1.0
|
|
4
4
|
Summary: Instant codebase comprehension for AI coding agents
|
|
5
5
|
Author: CosmoHac
|
|
6
|
-
License: MIT
|
|
6
|
+
License-Expression: MIT
|
|
7
7
|
Project-URL: Homepage, https://github.com/Cranot/roam-code
|
|
8
8
|
Project-URL: Repository, https://github.com/Cranot/roam-code
|
|
9
9
|
Project-URL: Issues, https://github.com/Cranot/roam-code/issues
|
|
@@ -37,9 +37,9 @@ Dynamic: license-file
|
|
|
37
37
|
|
|
38
38
|
# roam
|
|
39
39
|
|
|
40
|
-
**
|
|
40
|
+
**Instant codebase comprehension for AI coding agents. Semantic graph, algorithm anti-pattern detection, architecture health -- one CLI, zero API keys.**
|
|
41
41
|
|
|
42
|
-
*
|
|
42
|
+
*56 commands · 22 languages · algorithm catalog · 100% local*
|
|
43
43
|
|
|
44
44
|
[](https://pypi.org/project/roam-code/)
|
|
45
45
|
[](https://github.com/Cranot/roam-code/stargazers)
|
|
@@ -57,7 +57,7 @@ Roam pre-indexes your codebase into a semantic graph -- symbols, dependencies, c
|
|
|
57
57
|
|
|
58
58
|
Unlike LSPs (editor-bound and language-specific) or Sourcegraph (hosted search), Roam provides architecture-level graph queries -- offline, cross-language, and compact.
|
|
59
59
|
|
|
60
|
-
A semantic graph means Roam understands what functions call what, how modules depend on each other, which tests cover which code,
|
|
60
|
+
A semantic graph means Roam understands what functions call what, how modules depend on each other, which tests cover which code, the overall architecture structure, and where algorithms can be improved. The built-in algorithm catalog detects 23 anti-patterns (O(n^2) loops, N+1 queries, quadratic string building, branching recursion) and suggests better approaches with Big-O improvements.
|
|
61
61
|
|
|
62
62
|
```
|
|
63
63
|
Codebase ──> [Index] ──> Semantic Graph ──> CLI ──> AI Agent
|
|
@@ -100,6 +100,7 @@ $ roam diff # blast radius of uncommitted changes
|
|
|
100
100
|
- **Large codebases (100+ files)** -- graph queries beat linear search at scale
|
|
101
101
|
- **Architecture governance** -- health scores, CI quality gates, dependency cycle detection
|
|
102
102
|
- **Safe refactoring** -- blast radius, affected tests, pre-change safety checks
|
|
103
|
+
- **Algorithm optimization** -- detect O(n^2) loops, N+1 queries, and 21 other anti-patterns with suggested fixes
|
|
103
104
|
- **Multi-repo projects** -- cross-repo API edge detection between frontend and backend
|
|
104
105
|
|
|
105
106
|
### When NOT to use Roam
|
|
@@ -119,6 +120,8 @@ $ roam diff # blast radius of uncommitted changes
|
|
|
119
120
|
|
|
120
121
|
**Fully local.** No API keys, telemetry, or network calls. Works in air-gapped environments.
|
|
121
122
|
|
|
123
|
+
**Algorithm-aware.** Built-in catalog of 23 anti-patterns. Detects suboptimal algorithms (quadratic loops, N+1 queries, unbounded recursion) and suggests fixes with Big-O improvements and confidence scores.
|
|
124
|
+
|
|
122
125
|
**CI-ready.** `--json` output, `--gate` quality gates, GitHub Action, SARIF 2.1.0.
|
|
123
126
|
|
|
124
127
|
| | Without Roam | With Roam |
|
|
@@ -211,7 +214,7 @@ roam health
|
|
|
211
214
|
|
|
212
215
|
## Commands
|
|
213
216
|
|
|
214
|
-
The [5 core commands](#core-commands) shown above cover ~80% of agent workflows. 56
|
|
217
|
+
The [5 core commands](#core-commands) shown above cover ~80% of agent workflows. 56 commands are organized into 7 categories.
|
|
215
218
|
|
|
216
219
|
<details>
|
|
217
220
|
<summary><strong>Full command reference</strong></summary>
|
|
@@ -564,7 +567,7 @@ pip install fastmcp
|
|
|
564
567
|
fastmcp run roam.mcp_server:mcp
|
|
565
568
|
```
|
|
566
569
|
|
|
567
|
-
|
|
570
|
+
20 read-only tools and 2 resources. All tools query the index -- they never modify your code.
|
|
568
571
|
|
|
569
572
|
<details>
|
|
570
573
|
<summary><strong>MCP tool list</strong></summary>
|
|
@@ -588,6 +591,7 @@ fastmcp run roam.mcp_server:mcp
|
|
|
588
591
|
| `tour` | Auto-generated onboarding guide |
|
|
589
592
|
| `diagnose` | Root cause analysis for debugging |
|
|
590
593
|
| `visualize` | Generate Mermaid or DOT architecture diagrams |
|
|
594
|
+
| `math` | Algorithm anti-pattern detection with confidence calibration |
|
|
591
595
|
| `ws_understand` | Unified multi-repo workspace overview |
|
|
592
596
|
| `ws_context` | Cross-repo augmented symbol context |
|
|
593
597
|
|
|
@@ -894,13 +898,15 @@ Codebase
|
|
|
894
898
|
|
|
|
895
899
|
[5] Metrics ────── adaptive PageRank, betweenness, cognitive complexity, Halstead
|
|
896
900
|
|
|
|
897
|
-
[6]
|
|
901
|
+
[6] Algorithms ── 23-pattern anti-pattern catalog (O(n^2) loops, N+1, recursion)
|
|
902
|
+
|
|
|
903
|
+
[7] Git ────────── churn, co-change matrix, authorship, Renyi entropy
|
|
898
904
|
|
|
|
899
|
-
[
|
|
905
|
+
[8] Clusters ───── Louvain community detection
|
|
900
906
|
|
|
|
901
|
-
[
|
|
907
|
+
[9] Health ─────── per-file scores (7-factor) + composite score (0-100)
|
|
902
908
|
|
|
|
903
|
-
[
|
|
909
|
+
[10] Store ─────── .roam/index.db (SQLite, WAL mode)
|
|
904
910
|
```
|
|
905
911
|
|
|
906
912
|
After the first full index, `roam index` only re-processes changed files (mtime + SHA-256 hash). Incremental updates are near-instant.
|
|
@@ -927,6 +933,7 @@ After the first full index, `roam index` only re-processes changed files (mtime
|
|
|
927
933
|
- **Lift** -- association rule mining metric for co-change statistical significance (Agrawal & Srikant, 1994)
|
|
928
934
|
- **Halstead metrics** -- volume, difficulty, effort, and predicted bugs from operator/operand counts (Halstead, 1977)
|
|
929
935
|
- **SQALE remediation cost** -- time-to-fix estimates per issue type for tech debt prioritization (Letouzey, 2012)
|
|
936
|
+
- **Algorithm anti-pattern catalog** -- 23 patterns detecting suboptimal algorithms (quadratic loops, N+1 queries, quadratic string building, branching recursion, manual top-k, loop-invariant calls) with confidence calibration via caller-count and bounded-loop analysis
|
|
930
937
|
|
|
931
938
|
</details>
|
|
932
939
|
|
|
@@ -1042,8 +1049,8 @@ roam-code/
|
|
|
1042
1049
|
├── action.yml # Reusable GitHub Action
|
|
1043
1050
|
├── src/roam/
|
|
1044
1051
|
│ ├── __init__.py # Version (from pyproject.toml)
|
|
1045
|
-
│ ├── cli.py # Click CLI (
|
|
1046
|
-
│ ├── mcp_server.py # MCP server (
|
|
1052
|
+
│ ├── cli.py # Click CLI (56 commands, 7 categories)
|
|
1053
|
+
│ ├── mcp_server.py # MCP server (20 tools, 2 resources)
|
|
1047
1054
|
│ ├── db/
|
|
1048
1055
|
│ │ ├── connection.py # SQLite (WAL, pragmas, batched IN)
|
|
1049
1056
|
│ │ ├── schema.py # Tables, indexes, migrations
|
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
|
|
3
3
|
# roam
|
|
4
4
|
|
|
5
|
-
**
|
|
5
|
+
**Instant codebase comprehension for AI coding agents. Semantic graph, algorithm anti-pattern detection, architecture health -- one CLI, zero API keys.**
|
|
6
6
|
|
|
7
|
-
*
|
|
7
|
+
*56 commands · 22 languages · algorithm catalog · 100% local*
|
|
8
8
|
|
|
9
9
|
[](https://pypi.org/project/roam-code/)
|
|
10
10
|
[](https://github.com/Cranot/roam-code/stargazers)
|
|
@@ -22,7 +22,7 @@ Roam pre-indexes your codebase into a semantic graph -- symbols, dependencies, c
|
|
|
22
22
|
|
|
23
23
|
Unlike LSPs (editor-bound and language-specific) or Sourcegraph (hosted search), Roam provides architecture-level graph queries -- offline, cross-language, and compact.
|
|
24
24
|
|
|
25
|
-
A semantic graph means Roam understands what functions call what, how modules depend on each other, which tests cover which code,
|
|
25
|
+
A semantic graph means Roam understands what functions call what, how modules depend on each other, which tests cover which code, the overall architecture structure, and where algorithms can be improved. The built-in algorithm catalog detects 23 anti-patterns (O(n^2) loops, N+1 queries, quadratic string building, branching recursion) and suggests better approaches with Big-O improvements.
|
|
26
26
|
|
|
27
27
|
```
|
|
28
28
|
Codebase ──> [Index] ──> Semantic Graph ──> CLI ──> AI Agent
|
|
@@ -65,6 +65,7 @@ $ roam diff # blast radius of uncommitted changes
|
|
|
65
65
|
- **Large codebases (100+ files)** -- graph queries beat linear search at scale
|
|
66
66
|
- **Architecture governance** -- health scores, CI quality gates, dependency cycle detection
|
|
67
67
|
- **Safe refactoring** -- blast radius, affected tests, pre-change safety checks
|
|
68
|
+
- **Algorithm optimization** -- detect O(n^2) loops, N+1 queries, and 21 other anti-patterns with suggested fixes
|
|
68
69
|
- **Multi-repo projects** -- cross-repo API edge detection between frontend and backend
|
|
69
70
|
|
|
70
71
|
### When NOT to use Roam
|
|
@@ -84,6 +85,8 @@ $ roam diff # blast radius of uncommitted changes
|
|
|
84
85
|
|
|
85
86
|
**Fully local.** No API keys, telemetry, or network calls. Works in air-gapped environments.
|
|
86
87
|
|
|
88
|
+
**Algorithm-aware.** Built-in catalog of 23 anti-patterns. Detects suboptimal algorithms (quadratic loops, N+1 queries, unbounded recursion) and suggests fixes with Big-O improvements and confidence scores.
|
|
89
|
+
|
|
87
90
|
**CI-ready.** `--json` output, `--gate` quality gates, GitHub Action, SARIF 2.1.0.
|
|
88
91
|
|
|
89
92
|
| | Without Roam | With Roam |
|
|
@@ -176,7 +179,7 @@ roam health
|
|
|
176
179
|
|
|
177
180
|
## Commands
|
|
178
181
|
|
|
179
|
-
The [5 core commands](#core-commands) shown above cover ~80% of agent workflows. 56
|
|
182
|
+
The [5 core commands](#core-commands) shown above cover ~80% of agent workflows. 56 commands are organized into 7 categories.
|
|
180
183
|
|
|
181
184
|
<details>
|
|
182
185
|
<summary><strong>Full command reference</strong></summary>
|
|
@@ -529,7 +532,7 @@ pip install fastmcp
|
|
|
529
532
|
fastmcp run roam.mcp_server:mcp
|
|
530
533
|
```
|
|
531
534
|
|
|
532
|
-
|
|
535
|
+
20 read-only tools and 2 resources. All tools query the index -- they never modify your code.
|
|
533
536
|
|
|
534
537
|
<details>
|
|
535
538
|
<summary><strong>MCP tool list</strong></summary>
|
|
@@ -553,6 +556,7 @@ fastmcp run roam.mcp_server:mcp
|
|
|
553
556
|
| `tour` | Auto-generated onboarding guide |
|
|
554
557
|
| `diagnose` | Root cause analysis for debugging |
|
|
555
558
|
| `visualize` | Generate Mermaid or DOT architecture diagrams |
|
|
559
|
+
| `math` | Algorithm anti-pattern detection with confidence calibration |
|
|
556
560
|
| `ws_understand` | Unified multi-repo workspace overview |
|
|
557
561
|
| `ws_context` | Cross-repo augmented symbol context |
|
|
558
562
|
|
|
@@ -859,13 +863,15 @@ Codebase
|
|
|
859
863
|
|
|
|
860
864
|
[5] Metrics ────── adaptive PageRank, betweenness, cognitive complexity, Halstead
|
|
861
865
|
|
|
|
862
|
-
[6]
|
|
866
|
+
[6] Algorithms ── 23-pattern anti-pattern catalog (O(n^2) loops, N+1, recursion)
|
|
867
|
+
|
|
|
868
|
+
[7] Git ────────── churn, co-change matrix, authorship, Renyi entropy
|
|
863
869
|
|
|
|
864
|
-
[
|
|
870
|
+
[8] Clusters ───── Louvain community detection
|
|
865
871
|
|
|
|
866
|
-
[
|
|
872
|
+
[9] Health ─────── per-file scores (7-factor) + composite score (0-100)
|
|
867
873
|
|
|
|
868
|
-
[
|
|
874
|
+
[10] Store ─────── .roam/index.db (SQLite, WAL mode)
|
|
869
875
|
```
|
|
870
876
|
|
|
871
877
|
After the first full index, `roam index` only re-processes changed files (mtime + SHA-256 hash). Incremental updates are near-instant.
|
|
@@ -892,6 +898,7 @@ After the first full index, `roam index` only re-processes changed files (mtime
|
|
|
892
898
|
- **Lift** -- association rule mining metric for co-change statistical significance (Agrawal & Srikant, 1994)
|
|
893
899
|
- **Halstead metrics** -- volume, difficulty, effort, and predicted bugs from operator/operand counts (Halstead, 1977)
|
|
894
900
|
- **SQALE remediation cost** -- time-to-fix estimates per issue type for tech debt prioritization (Letouzey, 2012)
|
|
901
|
+
- **Algorithm anti-pattern catalog** -- 23 patterns detecting suboptimal algorithms (quadratic loops, N+1 queries, quadratic string building, branching recursion, manual top-k, loop-invariant calls) with confidence calibration via caller-count and bounded-loop analysis
|
|
895
902
|
|
|
896
903
|
</details>
|
|
897
904
|
|
|
@@ -1007,8 +1014,8 @@ roam-code/
|
|
|
1007
1014
|
├── action.yml # Reusable GitHub Action
|
|
1008
1015
|
├── src/roam/
|
|
1009
1016
|
│ ├── __init__.py # Version (from pyproject.toml)
|
|
1010
|
-
│ ├── cli.py # Click CLI (
|
|
1011
|
-
│ ├── mcp_server.py # MCP server (
|
|
1017
|
+
│ ├── cli.py # Click CLI (56 commands, 7 categories)
|
|
1018
|
+
│ ├── mcp_server.py # MCP server (20 tools, 2 resources)
|
|
1012
1019
|
│ ├── db/
|
|
1013
1020
|
│ │ ├── connection.py # SQLite (WAL, pragmas, batched IN)
|
|
1014
1021
|
│ │ ├── schema.py # Tables, indexes, migrations
|
|
@@ -4,11 +4,11 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "roam-code"
|
|
7
|
-
version = "9.
|
|
7
|
+
version = "9.1.0"
|
|
8
8
|
description = "Instant codebase comprehension for AI coding agents"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.9"
|
|
11
|
-
license =
|
|
11
|
+
license = "MIT"
|
|
12
12
|
authors = [
|
|
13
13
|
{name = "CosmoHac"},
|
|
14
14
|
]
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: roam-code
|
|
3
|
-
Version: 9.
|
|
3
|
+
Version: 9.1.0
|
|
4
4
|
Summary: Instant codebase comprehension for AI coding agents
|
|
5
5
|
Author: CosmoHac
|
|
6
|
-
License: MIT
|
|
6
|
+
License-Expression: MIT
|
|
7
7
|
Project-URL: Homepage, https://github.com/Cranot/roam-code
|
|
8
8
|
Project-URL: Repository, https://github.com/Cranot/roam-code
|
|
9
9
|
Project-URL: Issues, https://github.com/Cranot/roam-code/issues
|
|
@@ -37,9 +37,9 @@ Dynamic: license-file
|
|
|
37
37
|
|
|
38
38
|
# roam
|
|
39
39
|
|
|
40
|
-
**
|
|
40
|
+
**Instant codebase comprehension for AI coding agents. Semantic graph, algorithm anti-pattern detection, architecture health -- one CLI, zero API keys.**
|
|
41
41
|
|
|
42
|
-
*
|
|
42
|
+
*56 commands · 22 languages · algorithm catalog · 100% local*
|
|
43
43
|
|
|
44
44
|
[](https://pypi.org/project/roam-code/)
|
|
45
45
|
[](https://github.com/Cranot/roam-code/stargazers)
|
|
@@ -57,7 +57,7 @@ Roam pre-indexes your codebase into a semantic graph -- symbols, dependencies, c
|
|
|
57
57
|
|
|
58
58
|
Unlike LSPs (editor-bound and language-specific) or Sourcegraph (hosted search), Roam provides architecture-level graph queries -- offline, cross-language, and compact.
|
|
59
59
|
|
|
60
|
-
A semantic graph means Roam understands what functions call what, how modules depend on each other, which tests cover which code,
|
|
60
|
+
A semantic graph means Roam understands what functions call what, how modules depend on each other, which tests cover which code, the overall architecture structure, and where algorithms can be improved. The built-in algorithm catalog detects 23 anti-patterns (O(n^2) loops, N+1 queries, quadratic string building, branching recursion) and suggests better approaches with Big-O improvements.
|
|
61
61
|
|
|
62
62
|
```
|
|
63
63
|
Codebase ──> [Index] ──> Semantic Graph ──> CLI ──> AI Agent
|
|
@@ -100,6 +100,7 @@ $ roam diff # blast radius of uncommitted changes
|
|
|
100
100
|
- **Large codebases (100+ files)** -- graph queries beat linear search at scale
|
|
101
101
|
- **Architecture governance** -- health scores, CI quality gates, dependency cycle detection
|
|
102
102
|
- **Safe refactoring** -- blast radius, affected tests, pre-change safety checks
|
|
103
|
+
- **Algorithm optimization** -- detect O(n^2) loops, N+1 queries, and 21 other anti-patterns with suggested fixes
|
|
103
104
|
- **Multi-repo projects** -- cross-repo API edge detection between frontend and backend
|
|
104
105
|
|
|
105
106
|
### When NOT to use Roam
|
|
@@ -119,6 +120,8 @@ $ roam diff # blast radius of uncommitted changes
|
|
|
119
120
|
|
|
120
121
|
**Fully local.** No API keys, telemetry, or network calls. Works in air-gapped environments.
|
|
121
122
|
|
|
123
|
+
**Algorithm-aware.** Built-in catalog of 23 anti-patterns. Detects suboptimal algorithms (quadratic loops, N+1 queries, unbounded recursion) and suggests fixes with Big-O improvements and confidence scores.
|
|
124
|
+
|
|
122
125
|
**CI-ready.** `--json` output, `--gate` quality gates, GitHub Action, SARIF 2.1.0.
|
|
123
126
|
|
|
124
127
|
| | Without Roam | With Roam |
|
|
@@ -211,7 +214,7 @@ roam health
|
|
|
211
214
|
|
|
212
215
|
## Commands
|
|
213
216
|
|
|
214
|
-
The [5 core commands](#core-commands) shown above cover ~80% of agent workflows. 56
|
|
217
|
+
The [5 core commands](#core-commands) shown above cover ~80% of agent workflows. 56 commands are organized into 7 categories.
|
|
215
218
|
|
|
216
219
|
<details>
|
|
217
220
|
<summary><strong>Full command reference</strong></summary>
|
|
@@ -564,7 +567,7 @@ pip install fastmcp
|
|
|
564
567
|
fastmcp run roam.mcp_server:mcp
|
|
565
568
|
```
|
|
566
569
|
|
|
567
|
-
|
|
570
|
+
20 read-only tools and 2 resources. All tools query the index -- they never modify your code.
|
|
568
571
|
|
|
569
572
|
<details>
|
|
570
573
|
<summary><strong>MCP tool list</strong></summary>
|
|
@@ -588,6 +591,7 @@ fastmcp run roam.mcp_server:mcp
|
|
|
588
591
|
| `tour` | Auto-generated onboarding guide |
|
|
589
592
|
| `diagnose` | Root cause analysis for debugging |
|
|
590
593
|
| `visualize` | Generate Mermaid or DOT architecture diagrams |
|
|
594
|
+
| `math` | Algorithm anti-pattern detection with confidence calibration |
|
|
591
595
|
| `ws_understand` | Unified multi-repo workspace overview |
|
|
592
596
|
| `ws_context` | Cross-repo augmented symbol context |
|
|
593
597
|
|
|
@@ -894,13 +898,15 @@ Codebase
|
|
|
894
898
|
|
|
|
895
899
|
[5] Metrics ────── adaptive PageRank, betweenness, cognitive complexity, Halstead
|
|
896
900
|
|
|
|
897
|
-
[6]
|
|
901
|
+
[6] Algorithms ── 23-pattern anti-pattern catalog (O(n^2) loops, N+1, recursion)
|
|
902
|
+
|
|
|
903
|
+
[7] Git ────────── churn, co-change matrix, authorship, Renyi entropy
|
|
898
904
|
|
|
|
899
|
-
[
|
|
905
|
+
[8] Clusters ───── Louvain community detection
|
|
900
906
|
|
|
|
901
|
-
[
|
|
907
|
+
[9] Health ─────── per-file scores (7-factor) + composite score (0-100)
|
|
902
908
|
|
|
|
903
|
-
[
|
|
909
|
+
[10] Store ─────── .roam/index.db (SQLite, WAL mode)
|
|
904
910
|
```
|
|
905
911
|
|
|
906
912
|
After the first full index, `roam index` only re-processes changed files (mtime + SHA-256 hash). Incremental updates are near-instant.
|
|
@@ -927,6 +933,7 @@ After the first full index, `roam index` only re-processes changed files (mtime
|
|
|
927
933
|
- **Lift** -- association rule mining metric for co-change statistical significance (Agrawal & Srikant, 1994)
|
|
928
934
|
- **Halstead metrics** -- volume, difficulty, effort, and predicted bugs from operator/operand counts (Halstead, 1977)
|
|
929
935
|
- **SQALE remediation cost** -- time-to-fix estimates per issue type for tech debt prioritization (Letouzey, 2012)
|
|
936
|
+
- **Algorithm anti-pattern catalog** -- 23 patterns detecting suboptimal algorithms (quadratic loops, N+1 queries, quadratic string building, branching recursion, manual top-k, loop-invariant calls) with confidence calibration via caller-count and bounded-loop analysis
|
|
930
937
|
|
|
931
938
|
</details>
|
|
932
939
|
|
|
@@ -1042,8 +1049,8 @@ roam-code/
|
|
|
1042
1049
|
├── action.yml # Reusable GitHub Action
|
|
1043
1050
|
├── src/roam/
|
|
1044
1051
|
│ ├── __init__.py # Version (from pyproject.toml)
|
|
1045
|
-
│ ├── cli.py # Click CLI (
|
|
1046
|
-
│ ├── mcp_server.py # MCP server (
|
|
1052
|
+
│ ├── cli.py # Click CLI (56 commands, 7 categories)
|
|
1053
|
+
│ ├── mcp_server.py # MCP server (20 tools, 2 resources)
|
|
1047
1054
|
│ ├── db/
|
|
1048
1055
|
│ │ ├── connection.py # SQLite (WAL, pragmas, batched IN)
|
|
1049
1056
|
│ │ ├── schema.py # Tables, indexes, migrations
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|