RepoMap-命令行工具和MCP服务器
RepoMap是一个强大的工具,主要用于帮助LLM理解和导航复杂的代码库。它既可以作为按需分析的命令行应用程序,也可以作为MCP(模型上下文协议)服务器,为其他应用程序提供连续的存储库映射功能。通过生成软件存储库的“映射”,RepoMap突出显示了重要文件、代码定义及其关系。它利用Tree sitter进行准确的代码解析,并利用PageRank算法按重要性对代码元素进行排名,确保始终优先考虑最相关的信息。
目录
______________________________________________________________________
教唆者
RepoMap 100%基于Aider的RepoMap功能,但我不认为它与Aider共享任何代码。请允许我解释一下。
我最初的工作是从Aider中获取RepoMap类,删除所有特定于Aider的依赖关系,然后将其转换为命令行工具。Python不是我的母语,我真的很难让它工作。
几个小时前,我有了一个不同的想法。我从aider中获取了RepoMap及其相关代码,并将其输入到LLM(Claude或Gemini 2.5 Pro,不记得了)中,让它基本上从aider的实现中为此创建规范。因此,它为这个应用程序生成了一个非常详细的规范(减去MCP位),然后我用Claude 3.7将其提供给Aider,它构建了这个应用程序的命令行版本。
然后,我使用了Aider w/Claude 3.7、Cline w/Gemini 2.5 Pro Preview和Gemini 2.5 Flash Preview以及Phind.com、Gemini.com和Claude.com以及ChatGPT.com的组合,几个小时后,我终于解决了MCP服务器的问题。请记住,Python并不是我的母语。
______________________________________________________________________
输出示例
> python repomap.py . --chat-files repomap_class.py
Chat files: ['/mnt/programming/RepoMapper/repomap_class.py']
repomap_class.py:
(Rank value: 10.8111)
36: CACHE_VERSION = 1
39: TAGS_CACHE_DIR = os.path.join(os.getcwd(), f".repomap.tags.cache.v{CACHE_VERSION}")
40: SQLITE_ERRORS = (sqlite3.OperationalError, sqlite3.DatabaseError)
43: Tag = namedtuple("Tag", "rel_fname fname line name kind".split())
46: class RepoMap:
49: def __init__(
93: def load_tags_cache(self):
102: def save_tags_cache(self):
459: def get_ranked_tags_map_uncached(
483: def try_tags(num_tags: int) -> Tuple[Optional[str], int]:
512: def get_repo_map(
utils.py:
(Rank value: 0.2297)
18: Tag = namedtuple("Tag", "rel_fname fname line name kind".split())
21: def count_tokens(text: str, model_name: str = "gpt-4") -> int:
35: def read_text(filename: str, encoding: str = "utf-8", silent: bool = False) -> Optional[str]:
importance.py:
(Rank value: 0.1149)
8: IMPORTANT_FILENAMES = {
27: IMPORTANT_DIR_PATTERNS = {
34: def is_important(rel_file_path: str) -> bool:
56: def filter_important_files(file_paths: List[str]) -> List[str]:
...
...
...______________________________________________________________________
特性
- 智能代码分析:使用Tree sitter解析源代码并提取函数/类定义
- 相关性排名:使用PageRank算法按重要性对代码元素进行排名
- 令牌感知:尊重令牌限制以适应LLM上下文窗口
- 缓存:持久缓存,用于快速后续运行
- 多语言:支持Python、JavaScript、TypeScript、Java、C/C++、Go、Rust等
- 重要文件检测:自动识别重要文件并确定其优先级(README、requirements.txt等)
______________________________________________________________________
安装
pip install -r requirements.txt______________________________________________________________________
用法
基本用法
# Map current directory
python repomap.py .
# Map specific directory with custom token limit
python repomap.py src/ --map-tokens 2048
# Map specific files
python repomap.py file1.py file2.py
# Specify chat files (higher priority) vs other files
python repomap.py --chat-files main.py --other-files src/
# Specify mentioned files and identifiers
python repomap.py --mentioned-files config.py --mentioned-idents "main_function"
# Enable verbose output
python repomap.py . --verbose
# Force refresh of caches
python repomap.py . --force-refresh
# Specify model for token counting
python repomap.py . --model gpt-3.5-turbo
# Set maximum context window
python repomap.py . --max-context-window 8192
# Exclude files with Page Rank 0
python repomap.py . --exclude-unranked该工具按以下顺序对文件进行优先级排序:
--chat-files:这些文件被赋予最高优先级,因为它们被认为是您当前正在处理的文件。--mentioned-files:这些文件具有高优先级,因为它们在当前上下文中被明确提及。--other-files:这些文件被赋予最低优先级,用于提供额外的上下文。
高级选项
# Enable verbose output
python repomap.py . --verbose
# Force refresh of caches
python repomap.py . --force-refresh
# Specify model for token counting
python repomap.py . --model gpt-3.5-turbo
# Set maximum context window
python repomap.py . --max-context-window 8192
# Exclude files with Page Rank 0
python repomap.py . --exclude-unranked
# Mention specific files or identifiers for higher priority
python repomap.py . --mentioned-files config.py --mentioned-idents "main_function"______________________________________________________________________
运作原理
- 文件发现:扫描存储库中的源文件
- 代码解析:使用Tree sitter解析代码并提取定义/引用
- 图形构建:创建文件为节点、符号参照为边的图形
- 排名:应用PageRank算法按重要性对文件和符号进行排名
- 令牌优化:使用二分查找在令牌限制内匹配最重要的内容
- 输出生成:将结果格式化为可读的代码映射
______________________________________________________________________
输出格式
该工具生成代码库的结构化视图,显示:
- 文件路径和重要代码段
- 函数和类定义
- 代码元素之间的关键关系
- 根据实际使用情况和参考文献进行优先级排序
______________________________________________________________________
依赖项
tiktoken:各种LLM模型的令牌计数networkx:图形算法(PageRank)diskcache:持久缓存grep-ast:用于代码解析的Tree sitter集成tree-sitter:代码解析框架pygments:语法高亮和词法分析
______________________________________________________________________
缓存
该工具使用持久缓存来加速后续运行:
- 缓存目录:
.repomap.tags.cache.v1/ - 文件更改时自动失效
- 可以用以下方式清除
--force-refresh
______________________________________________________________________
支持的语言
目前支持使用Tree sitter语法的语言:
- 阿尔杜伊诺
- 聊天
- 常识
- C++
- C#
- c
- 飞镖
- d
- Emacs Lisp
- 灵药
- 榆树
- 微光
- 去
- JavaScript
- Java
- 卢阿
- ocaml_接口
- ocaml
- 小马
- 属性
- python
- 球拍
- r
- 红宝石
- 锈
- Solidity
- 迅速
- udev
- c_charp
- 盐酸
- Kotlin
- PHP
- 质量
- Scala
______________________________________________________________________
许可证
此实现基于Aider项目的RepoMap设计。
______________________________________________________________________
作为MCP服务器运行
RepoMap也可以作为MCP(模型上下文协议)服务器运行,允许其他应用程序访问其存储库映射功能。
设置
- RepoMap MCP服务器使用STDIO(标准输入/输出)进行通信。传输层不需要额外的配置。
- 要使用Cline(或Roo等类似工具)将RepoMap设置为MCP服务器,请将以下配置添加到Cline设置文件中(例如。,
cline_mcp_settings.json):
{
"mcpServers": {
"RepoMapper": {
"disabled": false,
"timeout": 60,
"type": "stdio",
"command": "/usr/bin/python3",
"args": [
"/absolute/path/to/repomap_server.py"
]
}
}
}- 替换
"/absolute/path/to/repomap_server.py"与您的实际路径repomap_server.py文件。
用法
- 跑吧
repomap_server.py脚本:
python repomap_server.py- 服务器将启动并通过STDIO监听请求。
- 其他应用程序可以使用
repo_map服务器提供的生成存储库映射的工具。他们必须明确project_root参数作为他们想要映射的项目的绝对路径。
更新日志
2025年7月13日-删除了project.json依赖项。修复了MCP服务器在文件名方面更易于LLM使用的问题。
