repo-maplisted
Install: claude install-skill hanzhangzzz/agent-skills-zh
# repo-map:本地仓库地图
## 机制概览(三层识别链路)
| 层 | 载体 | 覆盖场景 | 可靠性 |
|----|------|---------|--------|
| L1 | UserPromptSubmit hook 字符串匹配 | 用户提到明确仓库名 | 确定性 100% |
| L2 | 项目 CLAUDE.md「## 关联仓库」节 | 确认过的结构性老关系(选择性沉淀) | 常驻上下文 |
| L3 | 全局 CLAUDE.md 一行规则 + `resolve` 命令 | 模糊指代("那个缺陷分级服务") | 尽力而为兜底 |
核心不变量:**缓存是纯产物,人永远不维护**。每次 resolve/list/sync 先做低成本一致性检查(find .git 清单 vs 缓存路径集),差集增量分析、死路径自动剪枝。
自愈由谁触发,决定了"新仓库多久进地图":
| 触发方式 | 时机 | 覆盖 |
|---------|------|------|
| `resolve`/`list` 内置同步 | 用户手动跑命令那一刻 | 被动,不跑就不更新 |
| launchd 定时 `sync`(可选,冷启动询问) | 每 N 秒自动 | 主动,新仓库无需任何动作 |
`sync` 比 `list` 的增量多做一件事:**重析未成型仓库**(无 remote 或无提交)。刚 `git init` 的仓库会被记成"本地·可写"且无摘要,等它配好远端、有了首次提交,必须复查才能修正角色——纯增量永远不会回头看已存在路径,这是定时任务存在的真正理由。
组件:`scripts/repo_map.py`(scan/resolve/list/sync/schedule)+ `scripts/prompt_hook.py`(hook)。脚本就地运行于 skill 目录,不复制副本(单一事实源)。
## 安装步骤(幂等,可重复执行)
### 1. 前置检查
`python3 --version`、`git --version`、`~/.claude/settings.json` 存在。任一缺失即停下说明,不带病安装。
### 2. 探测扫描根,与用户确认
- 从历史 session 反推:`ls ~/.claude/projects/` 的目录名即历史 cwd(`-` 分隔),统计高频路径前缀。
- 辅助验证:对候选前缀 `find <root> -maxdepth 6 -name .git | head` 确认确实有仓库群。
- 把探测结果(根目录 + 预计仓库数)报给用户确认后再写配置。扫描根是配置不是数据——一年变不了一次,手工列出最诚实。
### 3. 身份引导,写配置 `~/.claude/repo-map.config.json`
配置含个人邮箱与组织域名,是机器级私密文件:**绝不提交进任何仓库**(本仓库 .gitignore 已设防线),只存在于 `~/.claude/`。
首次安装(配置不存在)时不要让用户手打邮箱,先探测候选、再让用户选择(选择优于输入):
- 候选邮箱来源:`git config --global user.email`,再抽 3-5 个扫描根内仓库统计高频作者(`git log --format=%ae | sort | uniq -c | sort -rn | head`)。
- 候选 host 来源:对扫描根内仓库的 remote host 做频次统计。
- 用选择题(AskU