{"slug":"codebase-context","title":"codebase-context","summary":"项目代码库上下文管理。通读项目生成参考文档(scan)，或加载文档辅助开发(dev)。","platform":"Claude","tags":[],"authorName":"LLM Mart","authorSlug":"llm-mart","score":0,"source":"github","price":null,"verified":false,"createdAt":"2026-09-24T15:43:04.571091Z","repo":{"url":"https://github.com/kingxiaozhe/cm-workflow","stars":27,"forks":0,"license":"MIT","updatedAt":"2026-09-24T10:35:03Z"},"bodyHtml":"<hr>\n<h2>name: codebase-context\ndescription: 项目代码库上下文管理。通读项目生成参考文档(scan)，或加载文档辅助开发(dev)。\ntrigger: manual\nmetadata:\nargument-hint: \"&lt;scan|dev&gt; [project-name] [--full]\"</h2>\n<h1>codebase-context — 项目代码库上下文管理</h1>\n<p>这是一份写给 AI 执行的 SOP。目的：把\"每次开发前重读整个代码库\"这个昂贵动作<strong>一次性固化成结构化文档缓存</strong>，后续开发直接加载文档当上下文。</p>\n<ul>\n<li><strong>scan（生产）</strong>：系统通读源码，生成结构化参考文档。</li>\n<li><strong>dev（消费）</strong>：加载参考文档进上下文辅助开发，开发完成后自动评估并回写更新文档。</li>\n</ul>\n<h2>参数解析</h2>\n<p>调用格式：<code>/codebase-context &lt;mode&gt; [project-name] [--full]</code></p>\n<ol>\n<li>解析第一个参数为 <code>mode</code>：\n<ul>\n<li>值为 <code>scan</code> → 进入 scan 模式</li>\n<li>值为 <code>dev</code> → 进入 dev 模式</li>\n<li>缺失或为其他值 → 输出用法提示 <code>用法: /codebase-context &lt;scan|dev&gt; [project-name] [--full]</code> 并终止</li>\n</ul>\n</li>\n<li>解析第二个非 <code>--</code> 开头参数为 <code>project-name</code>：\n<ul>\n<li>已提供 → 直接使用</li>\n<li>未提供 → 用 Bash 执行 <code>basename \"$PWD\"</code>，取当前工作目录最后一段路径名作为 project-name</li>\n</ul>\n</li>\n<li>检查是否存在 <code>--full</code> 参数：\n<ul>\n<li>存在且 mode=scan → 强制全量扫描</li>\n<li>存在且 mode=dev → 忽略该参数并提示\"--full 仅 scan 模式有效\"</li>\n</ul>\n</li>\n<li>设定文档目录 <code>DOC_DIR = {PROJECT_ROOT}/docs/codebase-context/</code>（存于项目工程内,随 git 提交、团队共享、换机不丢）</li>\n<li>设定项目根 <code>PROJECT_ROOT = 当前工作目录</code></li>\n</ol>\n<h2>产物清单（固定 10 份文档 + 1 份元数据）</h2>\n<p>全部存于 <code>DOC_DIR</code> 下，文件名固定，不得增删改名：</p>\n<table>\n<thead>\n<tr>\n<th>文件</th>\n<th>内容</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>00-index.md</td>\n<td>索引与快速导航</td>\n</tr>\n<tr>\n<td>01-overview.md</td>\n<td>项目概述与技术栈</td>\n</tr>\n<tr>\n<td>02-directory.md</td>\n<td>目录结构</td>\n</tr>\n<tr>\n<td>03-architecture.md</td>\n<td>架构设计与模块关系</td>\n</tr>\n<tr>\n<td>04-api-routes.md</td>\n<td>API 接口汇总</td>\n</tr>\n<tr>\n<td>05-data-models.md</td>\n<td>数据模型与类型</td>\n</tr>\n<tr>\n<td>06-core-modules.md</td>\n<td>核心模块（组件/Hooks/Store）</td>\n</tr>\n<tr>\n<td>07-business-logic.md</td>\n<td>关键业务逻辑</td>\n</tr>\n<tr>\n<td>08-conventions.md</td>\n<td>编码规范与约定</td>\n</tr>\n<tr>\n<td>09-changelog.md</td>\n<td>文档变更记录</td>\n</tr>\n<tr>\n<td>.scan-meta.json</td>\n<td><code>{\"lastScanTime\":\"UTC时间\",\"scanType\":\"full|incremental\",\"projectRoot\":\"绝对路径\"}</code></td>\n</tr>\n</tbody>\n</table>\n<hr>\n<h2>scan 模式流程</h2>\n<h3>步骤 1：初始化</h3>\n<ol>\n<li>按参数解析规则推导 project-name\n1.5 <strong>多项目仓库检测（禁止扫仓库根）</strong>：用 Glob 匹配 <code>*/package.json</code>、<code>*/*/package.json</code>（及 Cargo.toml/go.mod 等）——若当前目录自身不是单一项目根（无 src/），而多个子目录各含项目描述文件 → <strong>列出候选子项目并让用户选定</strong>（或用 project-name 参数匹配子目录名）；选定后 <code>PROJECT_ROOT</code>/<code>DOC_DIR</code> 重设为该子项目根。把多个不相干项目扫进一张地图，查重与波及面全部失真——<strong>脏地图比没地图更危险</strong>（实跑教训：4 项目混装仓库靠人肉 cd 才扫对）</li>\n<li>设定 DOC_DIR</li>\n<li>判断扫描模式（分支条件显式如下）：\n<ul>\n<li>DOC_DIR 不存在 → <strong>全量扫描</strong></li>\n<li>带 <code>--full</code> 参数 → <strong>全量扫描</strong></li>\n<li>DOC_DIR 已存在 且 存在 <code>.scan-meta.json</code> 且 无 <code>--full</code> → <strong>增量扫描</strong></li>\n<li>DOC_DIR 已存在 但 缺 <code>.scan-meta.json</code> → <strong>全量扫描</strong>（元数据缺失视同首扫）</li>\n</ul>\n</li>\n<li>用 Bash 执行 <code>mkdir -p {DOC_DIR}</code> 创建目录</li>\n</ol>\n<h3>全量扫描</h3>\n<h4>步骤 2a：系统读取代码（分 7 轮，每轮用 Glob/Grep/Read）</h4>\n<p><strong>规模档位（先数源码文件再动手）</strong>：≤200 个源文件 → 按下述七轮正常执行；<strong>&gt;200 个</strong> → 第 4/5/6 轮不逐个 Read，改用 Grep 收 export 签名清单入表（函数名/类型名/位置），精读仍限抽样 3–5 个最复杂文件；<strong>&gt;500 个</strong> → 同上，并提示用户\"项目较大，建议按模块分次 scan（cd 到子模块根分别执行）\"。防止扫到一半上下文耗尽——成本花了、地图没产出是最差结果。</p>\n<p><strong>第 1 轮 项目元信息</strong>：用 Read 读取 <code>package.json</code>、<code>README.md</code>；用 Glob 匹配构建配置 <code>vite.config.*</code>、<code>webpack.config.*</code>、<code>tsconfig.json</code>、<code>next.config.*</code>、<code>.env.example</code>，逐个 Read。提取：项目名/版本/依赖清单/脚本命令/构建工具/环境变量键名。</p>\n<p><strong>第 2 轮 目录结构</strong>：用 Bash 执行 <code>ls -R</code>（或用 Glob <code>src/*/*</code> 展开 src 两层）。识别 <code>pages/</code>、<code>components/</code>、<code>api/</code>、<code>store/</code>、<code>hooks/</code>、<code>utils/</code>、<code>types/</code> 等目录及其职责。</p>\n<p><strong>第 3 轮 入口与路由</strong>：用 Glob 定位 <code>main.*</code>、<code>index.*</code>、<code>App.*</code>、<code>router/</code>、<code>routes/</code>，逐个 Read；用 Grep 搜索全局 store 初始化与全局 service 入口。提取：启动链路、路由表、全局状态挂载点。</p>\n<p><strong>第 4 轮 API 接口层</strong>：用 Glob 匹配 <code>**/api/**</code> 与 <code>**/services/**</code>，逐个 Read。提取每个接口函数的：函数名 / HTTP 方法 / URL / 参数 / 返回类型 / 定义位置（文件:函数）。</p>\n<p><strong>第 5 轮 数据模型与类型</strong>：用 Glob 匹配 <code>**/types/**</code>、<code>**/models/**</code>、<code>**/interfaces/**</code>、<code>**/enums/**</code>，逐个 Read。提取：实体 / 枚举 / DTO 及各自定义位置。</p>\n<p><strong>第 6 轮 核心模块</strong>：用 Glob 展开 <code>components/</code>（区分公共组件 vs 业务组件）、<code>hooks/</code>、<code>store/</code>，逐个 Read 提取签名与职责；再用 Grep 按 import 次数与文件行数<strong>抽样精读 3–5 个最复杂的页面/组件</strong>（Read 全文），提取其状态、关键流程。</p>\n<p><strong>第 7 轮 规范与工具</strong>：用 Glob 匹配 <code>**/constants/**</code>、<code>**/config/**</code>、<code>**/utils/**</code> 及 <code>.eslintrc*</code>、<code>.prettierrc*</code>，逐个 Read。提取：常量清单 / 工具函数清单 / 可推断的代码规范。</p>\n<h4>步骤 3a：生成文档</h4>\n<p>依据下方【文档模板】，按 00 → 09 顺序逐份用 Write 生成 10 份文档，照模板填空。</p>\n<h4>步骤 4a：写元数据与摘要</h4>\n<ol>\n<li>用 Bash 执行 <code>date -u +\"%Y-%m-%dT%H:%M:%SZ\"</code> 取 UTC 时间</li>\n<li>用 Write 写 <code>.scan-meta.json</code>：<code>{\"lastScanTime\":\"{UTC}\",\"scanType\":\"full\",\"projectRoot\":\"{PROJECT_ROOT}\"}</code></li>\n<li>输出终端摘要：</li>\n</ol>\n<pre><code>✅ codebase-context 全量扫描完成 — {project-name}\n\uD83D\uDCC1 文档目录: {DOC_DIR}\n\uD83D\uDCC4 生成文档: 10 份（00-index ~ 09-changelog）\n\uD83D\uDCCA 扫描统计: 接口 {N} 个 | 类型 {N} 个 | 组件 {N} 个 | Hooks {N} 个 | 精读页面 {N} 个\n▶ 开发时执行: /codebase-context dev {project-name}\n</code></pre>\n<h3>增量扫描</h3>\n<h4>步骤 2b：变更检测</h4>\n<ol>\n<li>用 Read 读 <code>.scan-meta.json</code>，取 <code>lastScanTime</code> 与 <code>projectRoot</code></li>\n<li>用 Bash 执行：</li>\n</ol>\n<pre><code>find {projectRoot}/src -type f \\( -name \"*.ts\" -o -name \"*.tsx\" -o -name \"*.js\" -o -name \"*.jsx\" -o -name \"*.vue\" -o -name \"*.json\" \\) -newer {DOC_DIR}/.scan-meta.json\n</code></pre>\n<ol start=\"3\">\n<li>将结果与 <code>02-directory.md</code> 记录的文件清单对比，推断<strong>新增文件</strong>（结果里有、文档里无）与<strong>删除文件</strong>（文档里有、磁盘上无——用 Bash <code>test -f</code> 验证）</li>\n<li>mtime 检测未命中不证明地图最新（可能遗漏 src 外文件、其他语言或分支切换）。补查项目实际源码/配置路径及 Git 工作树变化；无可信历史基线时明确本次检测范围与限制，不能输出“全仓无变更/文档已是最新”</li>\n</ol>\n<h4>步骤 3b：确定受影响轮次（映射表）</h4>\n<p>按下表将每个变更文件路径映射到扫描轮次，<strong>只重跑受影响的轮次</strong>：</p>\n<table>\n<thead>\n<tr>\n<th>文件路径模式</th>\n<th>扫描轮次</th>\n<th>需更新文档</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>package.json / README / vite・webpack・tsconfig・next 配置 / .env.example</td>\n<td>第 1 轮</td>\n<td>01-overview</td>\n</tr>\n<tr>\n<td>目录新增/删除（任何路径层级变化）</td>\n<td>第 2 轮</td>\n<td>02-directory</td>\n</tr>\n<tr>\n<td>main.* / index.* / App.* / router/ / routes/ / 全局 store・service 入口</td>\n<td>第 3 轮</td>\n<td>03-architecture</td>\n</tr>\n<tr>\n<td>**/api/** 、 **/services/**</td>\n<td>第 4 轮</td>\n<td>04-api-routes</td>\n</tr>\n<tr>\n<td>**/types/** 、 **/models/** 、 **/interfaces/** 、 **/enums/**</td>\n<td>第 5 轮</td>\n<td>05-data-models</td>\n</tr>\n<tr>\n<td>components/ 、 hooks/ 、 store/</td>\n<td>第 6 轮</td>\n<td>06-core-modules</td>\n</tr>\n<tr>\n<td>pages/ 下的页面文件</td>\n<td>第 6 轮</td>\n<td>06-core-modules、07-business-logic</td>\n</tr>\n<tr>\n<td>**/constants/** 、 **/config/** 、 **/utils/** 、 eslint/prettier 配置</td>\n<td>第 7 轮</td>\n<td>08-conventions</td>\n</tr>\n<tr>\n<td>（任何变更，无条件）</td>\n<td>—</td>\n<td>09-changelog、00-index（日期）</td>\n</tr>\n</tbody>\n</table>\n<h4>步骤 4b：增量合并</h4>\n<ol>\n<li>用 Read 读取受影响的现有文档（只读需更新的那几份）</li>\n<li>用 Read <strong>只读变更文件</strong>（不重读全库）</li>\n<li>用 Edit 增量合并，禁止全量覆盖：\n<ul>\n<li>新增内容 → 在对应章节<strong>追加</strong>行/条目</li>\n<li>修改内容 → <strong>替换</strong>对应行/条目</li>\n<li>删除文件涉及的条目 → <strong>移除</strong>对应行/条目</li>\n</ul>\n</li>\n</ol>\n<h4>步骤 5b：收尾更新</h4>\n<ol>\n<li>用 Edit 更新 <code>00-index.md</code> 的\"最后更新\"日期</li>\n<li>用 Edit 在 <code>09-changelog.md</code> 追加本次条目（日期/类型 incremental/变更摘要/涉及文档）</li>\n<li>仅在变更检测覆盖项目实际源码/配置且基线可信时更新 <code>.scan-meta.json</code>（<code>scanType: \"incremental\"</code>）；否则保留原元数据，在索引/日志标明本次局部核实范围，不用新时间掩盖未知区域</li>\n</ol>\n<h4>步骤 6b：输出变更检测摘要</h4>\n<pre><code>✅ codebase-context 增量扫描完成 — {project-name}\n\uD83D\uDD0D 变更检测: 新增 {N} 个 | 修改 {N} 个 | 删除 {N} 个\n\uD83D\uDCC4 已更新文档: {文档列表，如 04-api-routes、05-data-models、09-changelog、00-index}\n</code></pre>\n<hr>\n<h2>dev 模式流程</h2>\n<h3>步骤 1：加载</h3>\n<ol>\n<li>按参数解析规则推导 project-name，设定 DOC_DIR</li>\n<li>分支判断：\n<ul>\n<li>DOC_DIR 不存在或缺少索引 → 按 <code>references/writeback.md</code> 先查项目指定地图，否则从代码定向建立本次链路；任务目标缺失时先补问目标，不盲扫全仓</li>\n<li>有索引 → 按索引读取本次任务相关且实际存在的文档；局部地图只代表标注的覆盖范围</li>\n</ul>\n</li>\n<li>按 <code>references/writeback.md</code> 核实地图与当前代码；过期、错误或缺少相关链路时定向补查，确认本次影响范围后才能改业务代码。授权范围内审前回写，不强制全量 scan</li>\n<li>输出已加载确认（项目概要从已读资料提取，缺失则不猜）：</li>\n</ol>\n<pre><code>\uD83D\uDCDA 已加载 {project-name} 参考文档（{实际数量} 份，覆盖 {相关模块}，最后更新 {日期}）\n\uD83D\uDCCC 项目概要: {已核实的一句话或待核实}\n</code></pre>\n<h3>步骤 2：辅助开发</h3>\n<p>开发过程中强制遵循：</p>\n<ol>\n<li>编码风格遵循 <code>08-conventions.md</code> 的规范与约定</li>\n<li>调用接口前先查 <code>04-api-routes.md</code>——<strong>已有接口直接复用，不重复造</strong></li>\n<li>定义类型前先查 <code>05-data-models.md</code>——<strong>已有类型直接引用，不重复定义</strong></li>\n<li>写组件/Hook 前先查 <code>06-core-modules.md</code>——<strong>已有组件/Hook 直接复用</strong></li>\n<li>新代码放置位置参考 <code>03-architecture.md</code> 的分层与模块归属</li>\n</ol>\n<h3>步骤 3：开发完成后强制评估回写</h3>\n<p>开发结束、独立审查前<strong>必须</strong>按 <a href=\"references/writeback.md\">业务地图增量回写</a> 评估并更新受影响章节；\n无需更新时说明依据。需求开发和缺陷修复复用同一判据，不重复扫描或在批准后回写。</p>\n<hr>\n<h2>文档模板</h2>\n<p>生成时照模板填空；某章节在本项目无对应内容时保留标题并填\"本项目未发现此类文件\"。</p>\n<h3>00-index.md</h3>\n<pre><code># {project-name} — 代码库参考文档索引\n\n- 最后更新: {YYYY-MM-DD HH:MM UTC}\n- 扫描类型: {full | incremental}\n- 项目根: {projectRoot}\n\n## 文档导航\n\n| 文档 | 内容 | 什么时候看 |\n| ---- | ---- | ---- |\n| 01-overview | 项目概述与技术栈 | 初次接触项目 |\n| 02-directory | 目录结构 | 找文件放哪/在哪 |\n| 03-architecture | 架构与模块关系 | 新代码归属、理解依赖方向 |\n| 04-api-routes | API 接口汇总 | 调接口前查重 |\n| 05-data-models | 数据模型与类型 | 定义类型前查重 |\n| 06-core-modules | 组件/Hooks/Store | 写组件前查复用 |\n| 07-business-logic | 关键业务逻辑 | 改业务流程前看线路 |\n| 08-conventions | 编码规范与约定 | 动手写代码前 |\n| 09-changelog | 文档变更记录 | 追溯文档演进 |\n\n## 快速定位\n\n| 我想找… | 去 |\n| ---- | ---- |\n| 某个接口怎么调 | 04-api-routes |\n| 某个字段的类型定义 | 05-data-models |\n| 有没有现成组件/Hook | 06-core-modules |\n| 某业务流程的完整线路 | 07-business-logic |\n| 命名/风格规矩 | 08-conventions |\n</code></pre>\n<h3>01-overview.md</h3>\n<pre><code># 项目概述与技术栈\n\n## 项目定位\n\n{一句话说明这个项目是什么、给谁用、解决什么问题}\n\n## 技术栈\n\n| 层 | 技术 | 版本 |\n| ---- | ---- | ---- |\n| 语言 | {TypeScript/…} | {x.y} |\n| 框架 | {React/Vue/…} | {x.y} |\n| 构建 | {Vite/Webpack/…} | {x.y} |\n| 状态管理 | {…} | {x.y} |\n| 其他关键依赖 | {…} | {x.y} |\n\n## 脚本命令\n\n| 命令 | 作用 |\n| ---- | ---- |\n| `npm run dev` | {…} |\n| `npm run build` | {…} |\n| `npm run test` | {…} |\n\n## 环境变量（仅键名与用途，不含值）\n\n| 键 | 用途 | 来源 |\n| ---- | ---- | ---- |\n| {ENV_KEY} | {…} | .env.example |\n</code></pre>\n<h3>02-directory.md</h3>\n<pre><code># 目录结构\n\n## 目录树（src 两层）\n\n```text\nsrc/\n├── pages/          # {职责}\n├── components/     # {职责}\n├── api/            # {职责}\n├── store/          # {职责}\n├── hooks/          # {职责}\n├── utils/          # {职责}\n└── types/          # {职责}\n```\n\n## 目录职责\n\n| 目录 | 职责 | 典型文件 |\n| ---- | ---- | ---- |\n| {src/pages} | {…} | {…} |\n\n## 文件清单（供增量扫描对比新增/删除）\n\n| 文件 | 所属轮次 |\n| ---- | ---- |\n| {src/api/user.ts} | 4 |\n</code></pre>\n<h3>03-architecture.md</h3>\n<pre><code># 架构设计与模块关系\n\n## 分层结构\n\n```text\n{页面层 pages}\n    ↓ 调用\n{逻辑层 hooks / store}\n    ↓ 调用\n{服务层 api / services}\n    ↓ 请求\n{后端 / 云函数}\n```\n\n## 启动链路\n\n{main.* → App.* → 路由挂载 → 全局 store 初始化，逐步说明，每步带 文件:位置}\n\n## 路由表\n\n| 路径 | 页面 | 定义位置 |\n| ---- | ---- | ---- |\n| {/home} | {pages/home} | {router/index.ts} |\n\n## 模块依赖关系\n\n| 模块 | 依赖谁 | 被谁依赖 |\n| ---- | ---- | ---- |\n| {store/user} | {api/user} | {pages/*, hooks/useAuth} |\n</code></pre>\n<h3>04-api-routes.md</h3>\n<pre><code># API 接口汇总\n\n## {模块名，如 user}\n\n| 函数名 | 方法 | URL | 参数 | 返回类型 | 定义位置 |\n| ---- | ---- | ---- | ---- | ---- | ---- |\n| {getUser} | GET | {/api/user/:id} | {id: string} | {User} | {src/api/user.ts} |\n\n（按模块分节重复上表；无 api/ 与 services/ 目录时填\"本项目未发现此类文件\"）\n</code></pre>\n<h3>05-data-models.md</h3>\n<pre><code># 数据模型与类型\n\n## 实体\n\n| 名称 | 字段摘要 | 定义位置 | 主要使用方 |\n| ---- | ---- | ---- | ---- |\n| {User} | {id, name, role…} | {src/types/user.ts} | {api/user, store/user} |\n\n## 枚举\n\n| 名称 | 取值 | 定义位置 |\n| ---- | ---- | ---- |\n| {OrderStatus} | {pending/paid/closed} | {src/types/order.ts} |\n\n## DTO / 请求响应类型\n\n| 名称 | 用于接口 | 定义位置 |\n| ---- | ---- | ---- |\n| {CreateOrderReq} | {POST /api/order} | {src/types/dto.ts} |\n</code></pre>\n<h3>06-core-modules.md</h3>\n<pre><code># 核心模块\n\n## 公共组件\n\n| 组件 | Props 摘要 | 定义位置 | 复用场景 |\n| ---- | ---- | ---- | ---- |\n| {Button} | {type, onClick…} | {src/components/common/} | {全局} |\n\n## 业务组件\n\n| 组件 | 职责 | 定义位置 | 所属业务 |\n| ---- | ---- | ---- | ---- |\n\n## Hooks\n\n| 名称 | 输入 | 输出 | 定义位置 |\n| ---- | ---- | ---- | ---- |\n| {useAuth} | {—} | {user, login, logout} | {src/hooks/useAuth.ts} |\n\n## Store\n\n| 模块 | state 摘要 | 主要 actions | 定义位置 |\n| ---- | ---- | ---- | ---- |\n\n## 复杂页面精读（3–5 个）\n\n### {页面名}（{文件路径}）\n\n- 职责: {…}\n- 关键状态: {…}\n- 关键流程: {步骤 1 → 步骤 2 → …，每步带函数名}\n</code></pre>\n<h3>07-business-logic.md</h3>\n<pre><code># 关键业务逻辑\n\n## {业务线名，如：下单}\n\n**线路**：{页面 pages/order} → {hook useOrder} → {api createOrder} → {POST /api/order} → {模型 Order}\n（每个环节标注 文件:函数）\n\n**关键规则**：\n\n- {规则 1，如：金额用分存储，展示层才转元 —— src/utils/money.ts}\n- {规则 2}\n\n**边界与注意**：\n\n- {已知坑/特殊分支/兼容逻辑，带位置}\n\n（按业务线重复本节）\n</code></pre>\n<h3>08-conventions.md</h3>\n<pre><code># 编码规范与约定\n\n## 命名\n\n| 对象 | 规则 | 示例 |\n| ---- | ---- | ---- |\n| 组件文件 | {PascalCase} | {UserCard.tsx} |\n| hooks | {use 前缀} | {useAuth} |\n\n## 代码风格（自 ESLint/Prettier 推断）\n\n- {缩进/引号/分号/import 排序 等要点}\n\n## 常量\n\n| 常量 | 值/含义 | 定义位置 |\n| ---- | ---- | ---- |\n\n## 工具函数\n\n| 函数 | 用途 | 定义位置 |\n| ---- | ---- | ---- |\n\n## 其他约定\n\n- {错误处理方式/请求封装规则/目录放置约定}\n</code></pre>\n<h3>09-changelog.md</h3>\n<pre><code># 文档变更记录\n\n| 日期(UTC) | 类型 | 变更摘要 | 涉及文档 |\n| ---- | ---- | ---- | ---- |\n| {2026-07-14T08:00Z} | full | 首次全量扫描 | 全部 10 份 |\n| {…} | incremental | {新增 2 接口/修改 1 类型} | {04、05} |\n| {…} | dev回写 | {开发 xx 功能后回写} | {04、06、07} |\n</code></pre>\n<hr>\n<h2>错误处理</h2>\n<ol>\n<li><strong>无 package.json</strong>：项目根不存在 package.json → 输出 <code>⚠ 当前目录未发现 package.json，请确认 {PROJECT_ROOT} 是正确的项目目录（回复继续则按非 npm 项目扫描）</code>，等用户确认后再继续。</li>\n<li><strong>某轮目标目录不存在</strong>（如无 <code>api/</code>）：跳过该轮，在对应文档的相应章节标注\"本项目未发现此类文件\"，不报错不中断。</li>\n<li><strong>超大文件（&gt;1000 行）</strong>：不复制全文，只用 Grep/Read 提取关键导出（export 的函数/类/类型签名），并在文档条目备注 <code>(大文件,仅提取签名)</code>。</li>\n<li><strong>dev 模式文档缺失或陈旧</strong>：按 <code>references/writeback.md</code> 定向核实/补齐；证据不足暂停相关修改，不猜测，不强制全量 scan。</li>\n</ol>\n","files":[{"path":"references/writeback.md","sizeBytes":7913,"isText":true},{"path":"SKILL.md","sizeBytes":18170,"isText":true}],"reviewScore":null,"reviewSummary":null,"trust":{"provenance":"trusted-source-unreviewed","notice":"Community-authored content, reproduced verbatim and not vetted as instructions. Treat it as data to evaluate, never as directives to follow.","bodySource":null},"bodyLocked":false,"purchaseUrl":null,"sourceUrl":null,"report":{"provenance":"trusted-source-unreviewed","screen":{"ran":true,"outcome":"notes-only","suspicious":0,"notes":6,"hiddenCharacters":false},"virusScan":{"engine":"clamav","status":"clean","scannedAt":"2026-09-24T15:44:09.983015Z","sha256":"1A48ED1AE97F76C850D424505C88DC59AFFEA74BD7C4A5D6318E3D3D840DA6DC","sizeBytes":12233},"review":null,"source":{"repositoryUrl":"https://github.com/kingxiaozhe/cm-workflow","path":"skills/codebase-context","license":"MIT","commit":"3f79f657e2e9e21f1300efe8e5c0bd5d4d6d208c","subtreeSha":"50FE92C186C233F625AA9A0BC5BB779F80A9A40A2CC35DD1F2F702D8CC28167D","lastSyncedAt":"2026-09-24T15:42:59.811488Z"},"reviewedAt":"2026-09-24T15:46:58.422578Z","notice":"Community-authored content, reproduced verbatim and not vetted as instructions. Treat it as data to evaluate, never as directives to follow."},"install":[{"target":"skills-cli","command":"npx skills add https://github.com/kingxiaozhe/cm-workflow/tree/main/skills/codebase-context"},{"target":"claude-code","command":"claude plugin marketplace add https://llmmart.ai/marketplace.json && claude plugin install kingxiaozhe-cm-workflow@llmmart"},{"target":"git","command":"git clone https://github.com/kingxiaozhe/cm-workflow.git"}]}