claude-md-progressive-disclosurer by daymade/claude-code-skills
npx skills add https://github.com/daymade/claude-code-skills --skill claude-md-progressive-disclosurer"找到最小的高信号 token 集合,最大化期望结果的可能性。" — Anthropic
目标是最大化信息效率、可读性、可维护性。
wc -l 或统计行数——这会潜意识地将"行数少"当成目标Level 1 (CLAUDE.md) - 每次对话都加载
├── 信息记录原则 ← 防止未来膨胀的自我约束
├── Reference 索引(开头) ← 入口1:遇到问题查这里
├── 核心命令表
├── 铁律/禁令(含代码示例)
├── 常见错误诊断(症状→原因→修复)
├── 代码模式(可直接复制)
├── 目录映射(功能→文件)
├── 修改代码前必读 ← 入口2:改代码前查这里
└── Reference 触发索引(末尾) ← 入口3:长对话后复述
Level 2 (references/) - 按需即时加载
├── 详细 SOP 流程
├── 边缘情况处理
├── 完整配置示例
└── 历史决策记录
同一 Level 2 资源可以有多个入口 ,服务于不同查找路径:
广告位招租
在这里展示您的产品或服务
触达数万 AI 开发者,精准高效
| 入口 | 位置 | 触发场景 | 用户心态 |
|---|---|---|---|
| Reference 索引 | 开头 | 遇到错误/问题 | "出 bug 了,查哪个文档?" |
| 修改代码前必读 | 中间 | 准备改代码 | "我要改 X,要注意什么?" |
| Reference 触发索引 | 末尾 | 长对话定位 | "刚才说的那个文档是哪个?" |
这不是重复,是多入口。 就像书有目录(按章节)、索引(按关键词)、快速参考卡(按任务)。
cp CLAUDE.md CLAUDE.md.bak.$(date +%Y%m%d_%H%M%S)
对每个章节分类:
| 问题 | 是 | 否 |
|---|---|---|
| 高频使用? | Level 1 | ↓ |
| 违反后果严重? | Level 1 | ↓ |
| 有代码模式需要直接复制? | Level 1 保留模式 | ↓ |
| 有明确触发条件? | Level 2 + 触发条件 | ↓ |
| 历史/参考资料? | Level 2 | 考虑删除 |
命名:docs/references/{主题}-sop.md
铁律:原样移动,禁止压缩
移动内容到 Level 2 时,必须完整保留原始内容 。不要在移动的同时"顺便精简"。
✅ 正确:把 100 行原封不动搬到 Level 2(100 行 → Level 2 100 行)
❌ 错误:把 100 行"精简"到 60 行搬到 Level 2(100 行 → Level 2 60 行,40 行消失)
为什么 :压缩 = 变相删除。你认为"不重要"而删掉的内容,可能是某个未来 debug session 的关键线索。优化的目标是改变信息的位置 (Level 1 → Level 2),不是改变信息的存在 。
怎么做 :
# 检查引用文件存在
grep -oh '`docs/references/[^`]*\.md`' CLAUDE.md | sed 's/`//g' | while read f; do
test -f "$f" && echo "✓ $f" || echo "✗ MISSING: $f"
done
对每个从原始 CLAUDE.md 移走的章节,逐一检查:
恢复原始文件 :git show HEAD:CLAUDE.md > /tmp/claude-md-original.md
逐节对比 :对原始文件的每个 ## 章节,确认其内容在以下位置之一完整存在:
快速暴露遗漏的辅助脚本 :
# 对原始文件的每个 ## 章节标题,检查它在新文件或 reference 文件中是否存在
grep '^## ' /tmp/claude-md-original.md | while read heading; do
if grep -q "$heading" CLAUDE.md docs/references/*.md 2>/dev/null; then
echo "✓ $heading"
else
echo "✗ NOT FOUND: $heading"
fi
done
⚠️ 这个脚本不能替代人工逐节对比 ——它只检查章节标题是否存在,不检查内容是否完整。但它能快速暴露整个章节被遗漏 的情况,作为人工对比前的第一道筛查。
标记所有差异 :
docs/README.md 已是文档索引的 canonical source),且在 Level 1 中有明确的指向禁止将"故意删除"作为分类来掩盖信息丢失。 每一项"故意删除"都必须说明 canonical source 在哪里。如果说不出来,就不是"故意删除",而是"遗漏"。
在验证阶段不要统计行数 。不要 wc -l。不要计算"原始 X 行 vs 新 Y 行"。这些数字会扭曲你的判断。
验证的标准是:
| 内容类型 | 原因 |
|---|---|
| 核心命令 | 高频使用 |
| 铁律/禁令 | 违反后果严重,必须始终可见 |
| 代码模式 | LLM 需要直接复制,避免重新推导 |
| 错误诊断 | 完整的症状→原因→修复流程 |
| 目录映射 | 帮助 LLM 快速定位文件 |
| 触发索引表 | 帮助 LLM 在长对话中定位 Level 2 |
| 内容类型 | Level 1 | Level 2 |
|---|---|---|
| SOP 流程 | 触发条件 + 关键陷阱 | 完整步骤 |
| 配置示例 | 最常用的 1-2 个 | 完整配置 |
| API 文档 | 常用方法签名 | 完整参数说明 |
| 内容类型 | 原因 |
|---|---|
| 历史决策记录 | 低频访问 |
| 性能数据 | 参考性质 |
| 技术债务清单 | 按需查看 |
| 边缘情况 | 有明确触发条件时再加载 |
**📖 何时读 `docs/references/xxx-sop.md`**:
- [具体错误信息,如 `ERR_DLOPEN_FAILED`]
- [具体场景,如"添加新的原生模块时"]
> 包含:[关键词 1]、[关键词 2]、[代码模板]。
## Reference 索引(遇到问题先查这里)
| 触发场景 | 文档 | 核心内容 |
|----------|------|---------|
| `ERR_DLOPEN_FAILED` | `native-modules-sop.md` | ABI 机制、懒加载 |
| 打包后 `Cannot find module` | `vite-sop.md` | MODULES_TO_COPY |
## 修改代码前必读
| 你要改什么 | 先读这个 | 关键陷阱 |
|-----------|---------|---------|
| 原生模块相关 | `native-modules-sop.md` | 必须懒加载;electron-rebuild 会静默失败 |
| 打包配置 | `packaging-sop.md` | DMG contents 必须用函数形式 |
完整流程见 `database-sop.md`(FTS5 转义、健康检查)。
多样性原则 :不要所有引用都用同一格式。
问题 :优化完成后,用户会继续要求 Claude "记录这个信息到 CLAUDE.md",如果没有规则指导,CLAUDE.md 会再次膨胀。
解决 :在 CLAUDE.md 开头(项目概述之后)添加「信息记录原则」:
## 信息记录原则(Claude 必读)
本文档采用**渐进式披露**架构,优化 LLM 工作效能。
### Level 1(本文件)只记录
| 类型 | 示例 |
|------|------|
| 核心命令表 | `pnpm run restart` |
| 铁律/禁令 | 必须懒加载原生模块 |
| 常见错误诊断 | 症状→原因→修复(完整流程) |
| 代码模式 | 可直接复制的代码块 |
| 目录导航 | 功能→文件映射 |
| 触发索引表 | 指向 Level 2 的入口 |
### Level 2(docs/references/)记录
| 类型 | 示例 |
|------|------|
| 详细 SOP 流程 | 完整的 20 步操作指南 |
| 边缘情况处理 | 罕见错误的诊断 |
| 完整配置示例 | 所有参数的说明 |
| 历史决策记录 | 为什么这样设计 |
### 用户要求记录信息时
1. **判断是否高频使用**:
- 是 → 写入 CLAUDE.md(Level 1)
- 否 → 写入对应 reference 文件(Level 2)
2. **Level 1 引用 Level 2 必须包含**:
- 触发条件(什么情况该读)
- 内容摘要(读了能得到什么)
3. **禁止**:
- 在 Level 1 放置低频的详细流程
- 引用 Level 2 但不写触发条件
原因 :这条规则让 Claude 自己知道什么该记在哪里,实现"自我约束",避免后续对话中 CLAUDE.md 再次膨胀。
原因 :LLM 注意力呈 U 型分布——开头和末尾强,中间弱。
| 位置 | 作用 |
|---|---|
| 开头 | 对话开始时建立全局认知:"有哪些 Level 2 可用" |
| 末尾 | 对话变长后复述提醒:"现在应该读哪个 Level 2" |
<!-- CLAUDE.md 开头(项目概述之后) -->
## Reference 索引
| 触发场景 | 文档 | 核心内容 |
|---------|------|---------|
| ABI 错误 | `native-modules-sop.md` | 懒加载模式 |
| 打包模块缺失 | `vite-sop.md` | MODULES_TO_COPY |
... (正文内容) ...
<!-- CLAUDE.md 末尾(再放一份) -->
## Reference 触发索引
| 触发场景 | 文档 | 核心内容 |
|---------|------|---------|
| ABI 错误 | `native-modules-sop.md` | 懒加载模式 |
| 打包模块缺失 | `vite-sop.md` | MODULES_TO_COPY |
错误 :详见 native-modules-sop.md
正确 :
**📖 何时读 `native-modules-sop.md`**:
- 遇到 `ERR_DLOPEN_FAILED` 错误
- 需要添加新的原生模块
> 包含:ABI 机制、懒加载模式、手动修复命令
原因 :没有触发条件,LLM 不知道什么时候该去读。
错误 :把代码示例移到 Level 2,Level 1 只写"使用懒加载模式"。
正确 :Level 1 保留完整的可复制代码:
// ✅ 正确:懒加载,只在需要时加载
let _Database = null;
function getDatabase() {
if (!_Database) {
_Database = require("better-sqlite3");
}
return _Database;
}
原因 :LLM 需要直接复制代码,移走后每次都要重新推导或读取 Level 2。
案例 :为了"减少行数",移走了代码模式、诊断流程、目录映射
结果 :
正确 :保留所有高频使用的内容。优化的判断标准是信息是否重复维护、是否与当前任务无关,而不是"文件太长"。
案例 :详见 xxx.md
问题 :LLM 不知道何时加载,要么忽略,要么每次都读。
正确 :触发条件 + 内容摘要。
案例 :把常用代码示例移到 Level 2
问题 :LLM 每次写代码都要先读 Level 2,增加延迟和 token 消耗。
正确 :高频使用的代码模式保留在 Level 1。
案例 :删除"不重要"的章节
问题 :信息丢失,未来需要时无处可查。
正确 :移到 Level 2,保留触发条件。
案例 :优化方案写"从 2000 行精简到 500 行,减少 75%"
问题 :把行数当成功指标,会驱动错误决策——为了凑数字而砍掉有用的信息。
正确 :用信息质量评估优化效果——信息是否有重复?维护负担是否降低?LLM 是否能更快找到需要的信息?
规则 :移动是移动,精简是精简。这是两个独立操作,不要同时执行 。
完整案例分析见
references/progressive_disclosure_principles.md案例 8
规则 :任何"删除"都必须是事前决策 (征求用户确认),不是事后分类 (发现少了再编理由)。
完整案例分析见
references/progressive_disclosure_principles.md案例 9
| 检验项 | 通过标准 |
|---|---|
| 日常命令 | 不需要读 Level 2 |
| 常见错误 | 有完整诊断流程 |
| 代码编写 | 有可复制的模式 |
| 特定问题 | 知道读哪个 Level 2 |
| 触发索引 | 在文档末尾,表格形式 |
| 维度 | 用户级 | 项目级 |
|---|---|---|
| 位置 | ~/.claude/CLAUDE.md | 项目/CLAUDE.md |
| References | ~/.claude/references/ | docs/references/ |
| 信息范围 | 个人偏好、全局规则 | 项目架构、团队规范 |
优化完成后,必须逐项检查 (不可跳过):
Weekly Installs
152
Repository
GitHub Stars
708
First Seen
Jan 21, 2026
Security Audits
Installed on
claude-code133
opencode126
gemini-cli123
codex121
cursor114
github-copilot111
站立会议模板:敏捷开发每日站会指南与工具(含远程团队异步模板)
10,500 周安装