<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[不想起名字]]></title><description><![CDATA[AI / Coding / Notes]]></description><link>https://www.myls.top</link><generator>RSS for Node</generator><lastBuildDate>Wed, 08 Apr 2026 05:33:57 GMT</lastBuildDate><atom:link href="https://www.myls.top/feed.xml" rel="self" type="application/rss+xml"/><copyright><![CDATA[Copyright 2026 Shuo]]></copyright><language><![CDATA[zh-CN]]></language><item><title><![CDATA[用 Codex 和 Claude Code 两天做一个 Next.js + Supabase 导航站：NavSphere 项目复盘]]></title><description><![CDATA[复盘 NavSphere 这个开发者导航站项目：技术栈、架构设计、部署方式，以及用 Codex 和 Claude Code 把一个可运行全栈项目压缩到两天内完成的真实体感。]]></description><link>https://www.myls.top/posts/2026-04-08-navsphere-codex-claude-code</link><guid isPermaLink="true">https://www.myls.top/posts/2026-04-08-navsphere-codex-claude-code</guid><category><![CDATA[Next.js]]></category><category><![CDATA[Supabase]]></category><category><![CDATA[Codex]]></category><category><![CDATA[Claude Code]]></category><category><![CDATA[Vercel]]></category><category><![CDATA[项目复盘]]></category><pubDate>Wed, 08 Apr 2026 00:00:00 GMT</pubDate><content:encoded><![CDATA[<h1 id="用-codex-和-claude-code-两天做一个-next-js-supabase-导航站-navsphere-项目复盘" tabindex="-1">用 Codex 和 Claude Code 两天做一个 Next.js + Supabase 导航站：NavSphere 项目复盘 <a class="header-anchor" href="#用-codex-和-claude-code-两天做一个-next-js-supabase-导航站-navsphere-项目复盘" aria-label="Permalink to “用 Codex 和 Claude Code 两天做一个 Next.js + Supabase 导航站：NavSphere 项目复盘”">&#8203;</a></h1>
<p>这两天我看了一个小而完整的项目：<code>NavSphere</code>。</p>
<p>项目在线地址也已经有了：</p>
<blockquote>
<p><strong><a href="https://nav.myls.top/" target="_blank" rel="noreferrer">https://nav.myls.top/</a></strong></p>
</blockquote>
<p>它不是那种只有一个首页截图能看的&quot;演示型项目&quot;，而是一个已经具备完整使用链路的开发者导航站：</p>
<ul>
<li>前台导航首页</li>
<li>GitHub 登录</li>
<li>后台管理</li>
<li>JSON 批量导入</li>
<li>Chrome 书签导入脚本</li>
<li>Supabase RLS 权限控制</li>
<li>可直接接到 Vercel 部署</li>
</ul>
<p>如果只看最终界面，会觉得这只是一个&quot;收藏夹网站&quot;。
但从工程角度看，它其实是一个很典型的 <strong>AI 时代小型全栈项目样本</strong>：</p>
<blockquote>
<p><strong>需求不算大，但链路完整，足够检验 Codex 和 Claude Code 到底能不能把一个项目从想法快速推进到可部署状态。</strong></p>
</blockquote>
<p>这篇文章就从几个角度来复盘它：</p>
<ul>
<li>用到了哪些技术</li>
<li>项目是怎么组织的</li>
<li>实际怎么部署</li>
<li>如果用 Codex 和 Claude Code 做，速度大概有多快</li>
<li>人工出力主要还剩下什么</li>
</ul>
<hr>
<h2 id="navsphere-是什么" tabindex="-1">NavSphere 是什么 <a class="header-anchor" href="#navsphere-是什么" aria-label="Permalink to “NavSphere 是什么”">&#8203;</a></h2>
<p>先用一句话概括：</p>
<blockquote>
<p><strong>NavSphere 是一个面向开发者和团队内部工具场景的导航站。</strong></p>
</blockquote>
<p>它不是单纯展示一堆链接，而是把&quot;公开导航&quot;和&quot;个人私有导航&quot;放在同一个系统里：</p>
<ul>
<li>未登录用户可以看到公开分类和公开链接</li>
<li>登录用户可以看到自己的私有分类和私有链接</li>
<li>后台可以维护分类、链接、排序和导入</li>
<li>分类支持路径式命名，例如 <code>研发 / AI工具</code></li>
</ul>
<p>这类项目非常适合做成一个轻量化内部产品，或者作为个人工作台的入口层。</p>
<hr>
<h2 id="这个项目用了哪些技术" tabindex="-1">这个项目用了哪些技术 <a class="header-anchor" href="#这个项目用了哪些技术" aria-label="Permalink to “这个项目用了哪些技术”">&#8203;</a></h2>
<p>从仓库来看，<code>NavSphere</code> 的核心技术栈非常清晰：</p>
<ul>
<li><strong>Next.js 16</strong></li>
<li><strong>React 19</strong></li>
<li><strong>TypeScript</strong></li>
<li><strong>Tailwind CSS 4</strong></li>
<li><strong>Supabase Auth + Database</strong></li>
<li><strong>Vercel Analytics / Speed Insights</strong></li>
</ul>
<p>如果再细分一层，可以看到它是一个标准的 <strong>Next.js App Router + Supabase SSR</strong> 架构。</p>
<h3 id="_1-前端层" tabindex="-1">1. 前端层 <a class="header-anchor" href="#_1-前端层" aria-label="Permalink to “1. 前端层”">&#8203;</a></h3>
<p>项目使用的是 Next.js App Router。
路由结构很直观：</p>
<ul>
<li><code>app/page.tsx</code> 负责前台导航首页</li>
<li><code>app/login</code> 负责登录页</li>
<li><code>app/admin</code> 负责后台页面</li>
<li><code>app/auth/callback/route.ts</code> 负责 GitHub OAuth 回调</li>
<li><code>app/api/import</code> 和 <code>app/api/ai-import</code> 负责导入接口</li>
</ul>
<p>前台导航页并不是一个纯静态页面，它会在服务端读取导航数据，然后交给客户端壳组件做交互。</p>
<p>这里有几个做得比较顺手的点：</p>
<ul>
<li>用 <code>useDeferredValue</code> 和自定义 debounce 处理搜索</li>
<li>用 <code>IntersectionObserver</code> 跟踪当前可见分类</li>
<li>用 <code>useTransition</code> 处理后台跳转和搜索输入的过渡状态</li>
<li>用 <code>router.prefetch('/admin')</code> 提前预取后台页面</li>
</ul>
<p>也就是说，这不是&quot;能跑就行&quot;的 React 页面，而是已经开始用 React 19 的交互能力去优化体验了。</p>
<h3 id="_2-数据层" tabindex="-1">2. 数据层 <a class="header-anchor" href="#_2-数据层" aria-label="Permalink to “2. 数据层”">&#8203;</a></h3>
<p>数据层是 Supabase PostgreSQL。</p>
<p>数据库里只有两张核心表：</p>
<ul>
<li><code>categories</code></li>
<li><code>links</code></li>
</ul>
<p>另外定义了一个枚举：</p>
<ul>
<li><code>link_environment</code>，值为 <code>test</code> 和 <code>prod</code></li>
</ul>
<p>这个建模很克制，但已经够用：</p>
<ul>
<li>分类有名称、描述、排序、公开状态、创建者</li>
<li>链接有名称、URL、环境、描述、图标、排序、公开状态、所属分类、创建者</li>
</ul>
<p>整个 schema 里还有几个值得注意的细节：</p>
<ul>
<li>用触发器自动维护 <code>updated_at</code></li>
<li>给公开数据和个人数据分别建了索引</li>
<li>给 <code>name</code> 和 <code>description</code> 建了 <code>pg_trgm</code> GIN 索引</li>
<li>通过 <code>(created_by, name)</code> 和 <code>(created_by, category_id, name)</code> 做唯一约束</li>
</ul>
<p>这说明作者并不是只想把东西存进去，而是已经考虑到搜索、排序和多用户隔离这些真实使用问题。</p>
<h3 id="_3-权限层" tabindex="-1">3. 权限层 <a class="header-anchor" href="#_3-权限层" aria-label="Permalink to “3. 权限层”">&#8203;</a></h3>
<p>这个项目最像&quot;正式产品&quot;的一点，在于它不是前端自己判断权限，而是把权限下沉到了数据库层。</p>
<p>Supabase schema 里启用了 RLS，并且分别定义了：</p>
<ul>
<li>匿名用户只能读公开分类和公开链接</li>
<li>已登录用户可以读公开数据和自己的私有数据</li>
<li>插入、更新、删除只能操作自己的数据</li>
<li>链接写入时还会检查所属分类是不是当前用户自己的分类</li>
</ul>
<p>这一层很关键。</p>
<p>因为很多小项目在早期最容易偷懒的地方，就是权限只做在页面上，数据库其实没有真正拦住。
但 <code>NavSphere</code> 这套写法，已经是比较稳的做法了。</p>
<h3 id="_4-认证层" tabindex="-1">4. 认证层 <a class="header-anchor" href="#_4-认证层" aria-label="Permalink to “4. 认证层”">&#8203;</a></h3>
<p>认证采用的是：</p>
<blockquote>
<p><strong>Supabase Auth + GitHub OAuth</strong></p>
</blockquote>
<p>这套组合非常适合开发者工具项目。</p>
<p>原因也很简单：</p>
<ul>
<li>目标用户本来就有 GitHub 账号</li>
<li>不需要自己维护密码体系</li>
<li>登录链路短</li>
<li>后续如果要和开发工具生态结合，也更自然</li>
</ul>
<p>项目里当前只保留了 GitHub 登录方式，这其实是对的。</p>
<p>在这类小型项目里，过早支持邮箱、短信、多个 OAuth Provider，往往只会把复杂度抬高，但对早期价值没有明显帮助。</p>
<h3 id="_5-运维辅助层" tabindex="-1">5. 运维辅助层 <a class="header-anchor" href="#_5-运维辅助层" aria-label="Permalink to “5. 运维辅助层”">&#8203;</a></h3>
<p>这个项目还有一个很实用的小设计：<strong>Chrome 书签导入脚本</strong>。</p>
<p>仓库自带 <code>scripts/export-chrome-bookmarks.mjs</code>，可以把本地 Chrome 书签导出成项目可导入的 JSON 格式。</p>
<p>这件事看起来不大，但很有产品意识。</p>
<p>因为导航站最常见的问题不是&quot;系统做不出来&quot;，而是：</p>
<blockquote>
<p><strong>第一批数据怎么进来。</strong></p>
</blockquote>
<p>如果每个人都要手动录入几十上百个链接，系统的可用性会下降很多。
而书签导入脚本一加，迁移成本马上就低了一截。</p>
<hr>
<h2 id="这个项目的结构为什么适合-ai-协作" tabindex="-1">这个项目的结构为什么适合 AI 协作 <a class="header-anchor" href="#这个项目的结构为什么适合-ai-协作" aria-label="Permalink to “这个项目的结构为什么适合 AI 协作”">&#8203;</a></h2>
<p><code>NavSphere</code> 很适合拿来说明一个问题：</p>
<blockquote>
<p><strong>不是所有项目都同样适合 AI 辅助开发。</strong></p>
</blockquote>
<p>它之所以适合，是因为它同时满足了几个条件：</p>
<ul>
<li>目录结构清晰</li>
<li>模块职责分明</li>
<li>技术栈主流</li>
<li>依赖链不复杂</li>
<li>数据模型简单但真实</li>
<li>页面数量不多，但闭环完整</li>
</ul>
<p>仓库的主结构大概是这样：</p>
<div class="language-text"><button title="Copy Code" class="copy"></button><span class="lang">text</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span>app/                    路由、页面、API、OAuth 回调</span></span>
<span class="line"><span>components/             前台和后台组件</span></span>
<span class="line"><span>lib/data/               导航查询、后台查询、导入逻辑</span></span>
<span class="line"><span>lib/supabase/           Supabase 客户端封装</span></span>
<span class="line"><span>data/                   导入示例数据</span></span>
<span class="line"><span>scripts/                Chrome 书签转换脚本</span></span>
<span class="line"><span>supabase/schema.sql     数据库结构与 RLS 策略</span></span></code></pre>
</div><p>对 Codex 或 Claude Code 来说，这种项目有几个天然优势：</p>
<ul>
<li>很容易快速扫清全局上下文</li>
<li>很容易定位修改点</li>
<li>很容易做端到端的小闭环改动</li>
<li>很容易把&quot;页面、接口、数据库&quot;串起来理解</li>
</ul>
<p>换句话说，这不是那种需要先读三天历史包袱才能动手的项目。
AI 工具能直接进入高价值区。</p>
<hr>
<h2 id="它是怎么部署的" tabindex="-1">它是怎么部署的 <a class="header-anchor" href="#它是怎么部署的" aria-label="Permalink to “它是怎么部署的”">&#8203;</a></h2>
<p>从仓库信息看，<code>NavSphere</code> 当前的部署思路很明确：</p>
<blockquote>
<p><strong>前端部署在 Vercel，数据和认证放在 Supabase。</strong></p>
</blockquote>
<p>当前线上访问地址是：</p>
<ul>
<li><a href="https://nav.myls.top/" target="_blank" rel="noreferrer">https://nav.myls.top/</a></li>
</ul>
<p>这是现在做小型 Next.js 全栈项目非常顺手的一套组合。</p>
<h3 id="_1-vercel-部署前端" tabindex="-1">1. Vercel 部署前端 <a class="header-anchor" href="#_1-vercel-部署前端" aria-label="Permalink to “1. Vercel 部署前端”">&#8203;</a></h3>
<p>仓库里已经存在 <code>.vercel/project.json</code>，并且依赖中也接入了：</p>
<ul>
<li><code>@vercel/analytics</code></li>
<li><code>@vercel/speed-insights</code></li>
</ul>
<p>这基本说明项目已经按 Vercel 的方式在跑了，或者至少已经完成了绑定。</p>
<p>对 Next.js App Router 项目来说，Vercel 的好处非常直接：</p>
<ul>
<li>零配置支持 Next.js</li>
<li>Route Handler、SSR、静态资源都能自然托管</li>
<li>预览部署方便</li>
<li>和 GitHub 工作流贴合</li>
</ul>
<h3 id="_2-supabase-承担数据与登录" tabindex="-1">2. Supabase 承担数据与登录 <a class="header-anchor" href="#_2-supabase-承担数据与登录" aria-label="Permalink to “2. Supabase 承担数据与登录”">&#8203;</a></h3>
<p>部署这个项目时，真正需要先准备好的其实不是 Vercel，而是 Supabase。</p>
<p>最小步骤大概是：</p>
<ol>
<li>新建一个 Supabase 项目</li>
<li>在 SQL Editor 执行 <code>supabase/schema.sql</code></li>
<li>在 Auth 里启用 GitHub Provider</li>
<li>配置 GitHub OAuth 回调地址</li>
<li>准备环境变量</li>
</ol>
<p>项目当前需要的关键环境变量非常少：</p>
<div class="language-env"><button title="Copy Code" class="copy"></button><span class="lang">env</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span>NEXT_PUBLIC_SUPABASE_URL=...</span></span>
<span class="line"><span>NEXT_PUBLIC_SUPABASE_PUBLISHABLE_DEFAULT_KEY=...</span></span></code></pre>
</div><p>也就是说，它的部署门槛其实不高。</p>
<h3 id="_3-一条比较实际的上线链路" tabindex="-1">3. 一条比较实际的上线链路 <a class="header-anchor" href="#_3-一条比较实际的上线链路" aria-label="Permalink to “3. 一条比较实际的上线链路”">&#8203;</a></h3>
<p>如果我来部署这个项目，我会按这个顺序：</p>
<ol>
<li>先把 Supabase 项目和 schema 跑起来</li>
<li>配 GitHub OAuth，确认本地登录回调正常</li>
<li>在本地导入一批样例数据</li>
<li>再把仓库接到 Vercel</li>
<li>在 Vercel 配同样的环境变量</li>
<li>把 GitHub OAuth 回调地址补上生产域名</li>
</ol>
<p>这样做的原因是：</p>
<blockquote>
<p><strong>这个项目真正复杂的不是前端构建，而是&quot;登录 + 数据权限 + 数据初始化&quot;这三件事要一次打通。</strong></p>
</blockquote>
<p>前端页面本身反而是最好部署的部分。</p>
<hr>
<h2 id="用-codex-和-claude-code-做-这个项目到底有多快" tabindex="-1">用 Codex 和 Claude Code 做，这个项目到底有多快 <a class="header-anchor" href="#用-codex-和-claude-code-做-这个项目到底有多快" aria-label="Permalink to “用 Codex 和 Claude Code 做，这个项目到底有多快”">&#8203;</a></h2>
<p>这部分是我觉得最值得聊的。</p>
<p>从 Git 提交记录看，<code>NavSphere</code> 的时间线非常集中：</p>
<ul>
<li>首个提交：<code>2026-04-07 16:22</code></li>
<li>最新提交：<code>2026-04-08 13:06</code></li>
<li>共 <code>14</code> 次提交</li>
</ul>
<p>如果只看活跃提交窗口，这个项目的主开发期基本就集中在两段时间里：</p>
<ul>
<li>4 月 7 日傍晚</li>
<li>4 月 8 日上午到中午</li>
</ul>
<p>而从代码变化量看，在首个提交之后又累计发生了：</p>
<ul>
<li><code>56</code> 个文件变更</li>
<li><code>6397</code> 行新增</li>
<li><code>757</code> 行删除</li>
</ul>
<p>这个规模说明它不是单纯改个 landing page，而是实打实把一个小型全栈产品骨架补全了。</p>
<h3 id="我的判断-这是一个典型的-0-5-到-1-人日-ai-项目" tabindex="-1">我的判断：这是一个典型的&quot;0.5 到 1 人日 AI 项目&quot; <a class="header-anchor" href="#我的判断-这是一个典型的-0-5-到-1-人日-ai-项目" aria-label="Permalink to “我的判断：这是一个典型的&quot;0.5 到 1 人日 AI 项目&quot;”">&#8203;</a></h3>
<p>如果把 Git 时间线、项目范围和实现复杂度放在一起看，我会这样判断：</p>
<blockquote>
<p><strong>在 Codex + Claude Code 的帮助下，这个项目做到当前程度，大概率属于 0.5 到 1 人日可以完成的范围。</strong></p>
</blockquote>
<p>这里说的不是&quot;上线运营级产品全部完成&quot;，而是：</p>
<ul>
<li>能跑</li>
<li>能登</li>
<li>能管</li>
<li>能导</li>
<li>能部署</li>
<li>权限基本正确</li>
</ul>
<p>这个版本已经具备了。</p>
<h3 id="如果完全手写-时间大概率会拉长" tabindex="-1">如果完全手写，时间大概率会拉长 <a class="header-anchor" href="#如果完全手写-时间大概率会拉长" aria-label="Permalink to “如果完全手写，时间大概率会拉长”">&#8203;</a></h3>
<p>如果换成传统纯手工开发，我对这个项目的估算会更接近：</p>
<ul>
<li>经验熟练的全栈开发者：<code>2 到 4</code> 人日</li>
<li>如果还要一边查文档一边搭：可能更久</li>
</ul>
<p>因为它虽然不大，但有几类事情其实都挺花时间：</p>
<ul>
<li>Next.js App Router 路由和页面组织</li>
<li>Supabase SSR 客户端封装</li>
<li>GitHub OAuth 回调接通</li>
<li>RLS 策略写对</li>
<li>后台管理页和导入流程串通</li>
<li>数据导入格式和校验逻辑统一</li>
<li>本地验证 + 部署验证</li>
</ul>
<p>这些事情单个看都不大，但凑在一起很容易把开发时间拉长。</p>
<p>而 AI 工具最擅长的，就是把这些&quot;中等复杂、模式清晰、重复度高&quot;的工作一段段吞掉。</p>
<h3 id="codex-和-claude-code-各自适合干什么" tabindex="-1">Codex 和 Claude Code 各自适合干什么 <a class="header-anchor" href="#codex-和-claude-code-各自适合干什么" aria-label="Permalink to “Codex 和 Claude Code 各自适合干什么”">&#8203;</a></h3>
<p>如果让我把这类项目拆成两种 AI 工具的优势，我会这样理解：</p>
<p><strong>Codex 更适合：</strong></p>
<ul>
<li>直接进仓库做结构化修改</li>
<li>读现有代码后补齐缺口</li>
<li>把页面、接口、数据层一起串起来改</li>
<li>做验证、构建、查错、收尾</li>
</ul>
<p><strong>Claude Code 更适合：</strong></p>
<ul>
<li>快速展开方案</li>
<li>推导页面和模块结构</li>
<li>起草一版较完整的实现</li>
<li>做较长链路的代码生成和说明</li>
</ul>
<p>当然，现实里它们往往不是二选一，而是接力关系：</p>
<blockquote>
<p><strong>Claude Code 更像高吞吐的第一轮实现，Codex 更像强执行和强收口的第二轮工程化推进。</strong></p>
</blockquote>
<p>这也是为什么现在很多项目做起来，速度会明显比过去快。</p>
<hr>
<h2 id="人工出力还剩多少" tabindex="-1">人工出力还剩多少 <a class="header-anchor" href="#人工出力还剩多少" aria-label="Permalink to “人工出力还剩多少”">&#8203;</a></h2>
<p>这也是很多人最关心的问题。</p>
<p>我的答案是：</p>
<blockquote>
<p><strong>人工出力并没有消失，但已经从&quot;大量敲代码&quot;转移成了&quot;做决策、给约束、验结果&quot;。</strong></p>
</blockquote>
<p>如果以 <code>NavSphere</code> 这种项目为例，我会把人工出力大致理解成下面几个部分。</p>
<h3 id="_1-人来定义边界" tabindex="-1">1. 人来定义边界 <a class="header-anchor" href="#_1-人来定义边界" aria-label="Permalink to “1. 人来定义边界”">&#8203;</a></h3>
<p>比如这些事，仍然非常需要人来定：</p>
<ul>
<li>这个项目到底是公开导航站，还是带私有空间的导航站</li>
<li>登录方式为什么只保留 GitHub</li>
<li>分类是否支持路径式命名</li>
<li>数据导入到底采用什么 JSON 结构</li>
<li>后台要做到什么程度算够用</li>
</ul>
<p>这些不是代码生成问题，而是产品决策问题。</p>
<h3 id="_2-人来确认权限和安全" tabindex="-1">2. 人来确认权限和安全 <a class="header-anchor" href="#_2-人来确认权限和安全" aria-label="Permalink to “2. 人来确认权限和安全”">&#8203;</a></h3>
<p>AI 可以写出 RLS 策略，但最后最该负责的人还是开发者自己。</p>
<p>尤其是像这种涉及：</p>
<ul>
<li>匿名可读</li>
<li>登录后可读私有数据</li>
<li>用户只能写自己的分类和链接</li>
</ul>
<p>这种边界，一定要人工做最终确认。</p>
<h3 id="_3-人来做验收" tabindex="-1">3. 人来做验收 <a class="header-anchor" href="#_3-人来做验收" aria-label="Permalink to “3. 人来做验收”">&#8203;</a></h3>
<p>真正影响项目质量的，往往是这些最后一公里：</p>
<ul>
<li>登录回调是不是正常</li>
<li>导入的数据有没有脏格式</li>
<li>排序是不是符合预期</li>
<li>空分类到底显不显示</li>
<li>生产环境回调地址有没有漏配</li>
</ul>
<p>这些检查 AI 能辅助，但很难完全替代人工判断。</p>
<h3 id="_4-一个比较现实的占比判断" tabindex="-1">4. 一个比较现实的占比判断 <a class="header-anchor" href="#_4-一个比较现实的占比判断" aria-label="Permalink to “4. 一个比较现实的占比判断”">&#8203;</a></h3>
<p>如果只是问&quot;代码体力劳动&quot;的占比，我会觉得在这类项目里，AI 已经可以吃掉大约 <code>60% 到 80%</code>。</p>
<p>但如果问的是整个项目交付过程里的总出力，我的判断会更保守一点：</p>
<blockquote>
<p><strong>人工仍然要承担大约 <code>20% 到 40%</code> 的关键工作量。</strong></p>
</blockquote>
<p>这些工作主要不是敲代码，而是：</p>
<ul>
<li>需求取舍</li>
<li>环境配置</li>
<li>数据准备</li>
<li>权限确认</li>
<li>验收和收口</li>
</ul>
<p>所以今天真正高效的开发方式，不是&quot;AI 全做，人什么都不管&quot;，而是：</p>
<blockquote>
<p><strong>人负责方向和边界，AI 负责高密度执行。</strong></p>
</blockquote>
<hr>
<h2 id="我觉得这个项目最有代表性的地方" tabindex="-1">我觉得这个项目最有代表性的地方 <a class="header-anchor" href="#我觉得这个项目最有代表性的地方" aria-label="Permalink to “我觉得这个项目最有代表性的地方”">&#8203;</a></h2>
<p><code>NavSphere</code> 这个项目有代表性，不是因为它多复杂，而是因为它刚好落在一个很有现实意义的区间里：</p>
<ul>
<li>足够小，个人开发者能在短时间推进</li>
<li>足够完整，不是只能截图展示</li>
<li>足够真实，已经有权限、导入、后台、部署这些实际问题</li>
<li>足够标准，AI 工具很容易介入</li>
</ul>
<p>这类项目特别适合现在的 AI 编程工具。</p>
<p>因为它既不是过于简单的 demo，也不是充满历史包袱的大型遗留系统。
它属于那种：</p>
<blockquote>
<p><strong>AI 能真正把开发速度提升到肉眼可见程度的黄金区间。</strong></p>
</blockquote>
<hr>
<h2 id="最后" tabindex="-1">最后 <a class="header-anchor" href="#最后" aria-label="Permalink to “最后”">&#8203;</a></h2>
<p>如果只看结果，<code>NavSphere</code> 像是一个&quot;普通的导航站项目&quot;。</p>
<p>但如果把它放到开发流程里看，它其实更像一个信号：</p>
<blockquote>
<p><strong>现在做一个有登录、有数据库、有后台、有导入、有部署链路的小型全栈应用，真的已经进入了&quot;周末可做完&quot;的阶段。</strong></p>
</blockquote>
<p>前提不是 AI 会魔法，而是你要选对项目形态：</p>
<ul>
<li>技术栈主流</li>
<li>结构清晰</li>
<li>业务边界明确</li>
<li>能快速验证</li>
</ul>
<p>当这些条件满足时，Codex 和 Claude Code 这样的工具，确实能把项目推进速度提升到过去很难想象的程度。</p>
<p>而人最重要的价值，也会越来越集中在那几件事上：</p>
<ul>
<li>想清楚做什么</li>
<li>判断什么是对的</li>
<li>决定什么先做、什么不做</li>
<li>把项目收口到可交付状态</li>
</ul>
<p>这可能才是 AI 开发真正开始成熟的标志。</p>
]]></content:encoded></item><item><title><![CDATA[Claude Code 深度指南（长篇版）]]></title><description><![CDATA[深入探讨 Claude Code 的高级使用技巧：Token 经济学、记忆持久化、动态系统提示注入、持续学习、子代理编排、评估基准测试、MCP 替代策略、并行实例管理等。]]></description><link>https://www.myls.top/posts/2026-03-30-longform-guide-claude-code</link><guid isPermaLink="true">https://www.myls.top/posts/2026-03-30-longform-guide-claude-code</guid><category><![CDATA[Claude Code]]></category><category><![CDATA[AI]]></category><category><![CDATA[开发工具]]></category><category><![CDATA[效率]]></category><pubDate>Mon, 30 Mar 2026 00:00:00 GMT</pubDate><content:encoded><![CDATA[<blockquote>
<p><strong>转载声明</strong>：本文翻译转载自 Affaan Mustafa（@affaanmustafa）的文章《The Longform Guide to Everything Claude Code》。</p>
<p>原文链接：<a href="https://x.com/affaanmustafa/article/2014040193557471352" target="_blank" rel="noreferrer">https://x.com/affaanmustafa/article/2014040193557471352</a></p>
</blockquote>
<h1 id="claude-code-深度指南-长篇版" tabindex="-1">Claude Code 深度指南（长篇版） <a class="header-anchor" href="#claude-code-深度指南-长篇版" aria-label="Permalink to “Claude Code 深度指南（长篇版）”">&#8203;</a></h1>
<p>在《Claude Code 速查指南》中，我涵盖了基础设置：技能与命令、钩子、子代理、MCP、插件，以及构成高效 Claude Code 工作流骨干的配置模式。那是一份设置指南和基础设施说明。</p>
<p>这篇长篇指南则深入探讨那些<strong>将高效会话与浪费时间的会话区分开来的技巧</strong>。如果你还没读过速查指南，请先回去配置好你的设置。以下内容假设你已经配置好了技能、代理、钩子和 MCP，并且它们正常工作。</p>
<p>本文的主题包括：<strong>Token 经济学、记忆持久化、验证模式、并行化策略，以及构建可复用工作流的复合效应</strong>。这些是我经过 10 多个月的日常使用提炼出来的模式，它们决定了你是在第一个小时内就被上下文腐化困扰，还是能维持数小时的高效会话。</p>
<p>速查指南和长篇指南中涵盖的所有内容都可以在 GitHub 上找到。</p>
<hr>
<h2 id="跨会话共享记忆" tabindex="-1">跨会话共享记忆 <a class="header-anchor" href="#跨会话共享记忆" aria-label="Permalink to “跨会话共享记忆”">&#8203;</a></h2>
<p>对于跨会话共享记忆，最好的方法是使用一个技能或命令来总结和检查进度，然后保存到 <code>.claude</code> 文件夹中的 <code>.tmp</code> 文件，并在会话结束前持续追加内容。第二天它可以以此为上下文，从上次停下的地方继续。为每个会话创建一个新文件，这样就不会将旧上下文污染到新工作中。最终你会积累一大堆会话日志——定期备份或清理不需要的会话对话。</p>
<p>Claude 创建一个总结当前状态的文件。检查它，如果需要可以要求修改，然后重新开始。对于新对话，只需提供文件路径。这在碰到上下文限制需要继续复杂工作时特别有用。这些文件应包含：</p>
<ul>
<li>哪些方法有效（有证据可验证）</li>
<li>尝试过但无效的方法</li>
<li>尚未尝试的方法以及待办事项</li>
</ul>
<h3 id="战略性清除上下文" tabindex="-1">战略性清除上下文 <a class="header-anchor" href="#战略性清除上下文" aria-label="Permalink to “战略性清除上下文”">&#8203;</a></h3>
<p>一旦计划确定并清除了上下文（现在是 Claude Code 计划模式的默认选项），你就可以基于计划工作。这在积累了大量探索性上下文但已不再与执行相关时非常有用。对于战略性压缩，禁用自动压缩。在逻辑间隔点手动压缩，或创建一个技能来为你执行或根据定义的条件建议压缩。</p>
<div class="language-bash"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">#!/bin/bash</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Strategic Compact Suggester</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 在 PreToolUse 上运行，在逻辑间隔建议手动压缩</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">#</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 为什么手动优于自动压缩：</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># - 自动压缩在任意时间点发生，经常在任务中途</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># - 战略性压缩通过逻辑阶段保留上下文</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># - 在探索后、执行前压缩</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># - 在完成里程碑后、开始下一个前压缩</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">COUNTER_FILE</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"/tmp/claude-tool-count-</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">$$</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">THRESHOLD</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">${COMPACT_THRESHOLD</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">50}</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 初始化或递增计数器</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> [ </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-f</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$COUNTER_FILE</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> ]; </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">then</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  count</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$(</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">cat</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$COUNTER_FILE</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  count</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$((</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">count</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> +</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">))</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  echo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$count</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> ></span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$COUNTER_FILE</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">else</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  echo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "1"</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> ></span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$COUNTER_FILE</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  count</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">1</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">fi</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 达到阈值工具调用后建议压缩</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> [ </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$count</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -eq</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$THRESHOLD</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> ]; </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">then</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  echo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "[StrategicCompact] </span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$THRESHOLD</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> tool calls reached - consider /compact if transitioning phases"</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> >&#x26;2</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">fi</span></span></code></pre>
</div><p>将它挂载到 Edit/Write 操作的 PreToolUse 上——当你积累了足够的上下文需要压缩时，它会提醒你。</p>
<hr>
<h2 id="高级-动态系统提示注入" tabindex="-1">高级：动态系统提示注入 <a class="header-anchor" href="#高级-动态系统提示注入" aria-label="Permalink to “高级：动态系统提示注入”">&#8203;</a></h2>
<p>我采纳并正在试用的一种模式是：不<strong>仅仅</strong>将所有内容放在 <code>CLAUDE.md</code>（用户范围）或 <code>.claude/rules/</code>（项目范围，每次会话都加载），而是使用 CLI 标志动态注入上下文。</p>
<div class="language-bash"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">claude</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> --system-prompt</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "$(</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">cat</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> memory.md)"</span></span></code></pre>
</div><p>这让你能更精确地控制何时加载什么上下文。你可以根据正在做的工作在每个会话中注入不同的上下文。</p>
<p><strong>为什么这比 <code>@ file</code> 引用更重要：</strong></p>
<p>当你使用 <code>@ file.md</code> 或将内容放在 <code>.claude/rules/</code> 中时，Claude 在对话过程中通过 Read 工具读取——它作为工具输出进入。当你使用 <code>--system-prompt</code> 时，内容在对话开始前被注入到实际的系统提示中。</p>
<p>区别在于<strong>指令层级</strong>。系统提示内容的权威性高于用户消息，用户消息的权威性高于工具结果。对于大多数日常工作来说，这个差异是微小的。但对于严格的行为规则、项目特定约束或你绝对需要 Claude 优先处理的上下文——系统提示注入确保了它被适当地加权。</p>
<h3 id="实用设置" tabindex="-1">实用设置 <a class="header-anchor" href="#实用设置" aria-label="Permalink to “实用设置”">&#8203;</a></h3>
<p>一种有效的做法是利用 <code>.claude/rules/</code> 作为基线项目规则，然后为特定场景创建 CLI 别名：</p>
<div class="language-bash"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 日常开发</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">alias</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> claude-dev</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'claude --system-prompt "$(cat ~/.claude/contexts/dev.md)"'</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># PR 审查模式</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">alias</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> claude-review</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'claude --system-prompt "$(cat ~/.claude/contexts/review.md)"'</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 研究/探索模式</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">alias</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> claude-research</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'claude --system-prompt "$(cat ~/.claude/contexts/research.md)"'</span></span></code></pre>
</div><ul>
<li><code>dev.md</code> 专注于实现</li>
<li><code>review.md</code> 专注于代码质量/安全</li>
<li><code>research.md</code> 专注于行动前的探索</li>
</ul>
<p>同样，对于大多数情况，使用 <code>.claude/rules/context1.md</code> 和直接将内容追加到系统提示之间的差异是微小的。CLI 方法更快（无需工具调用）、更可靠（系统级权威）、且稍微更节省 token。但这是一个小优化，对很多人来说可能得不偿失。</p>
<hr>
<h2 id="高级-记忆持久化钩子" tabindex="-1">高级：记忆持久化钩子 <a class="header-anchor" href="#高级-记忆持久化钩子" aria-label="Permalink to “高级：记忆持久化钩子”">&#8203;</a></h2>
<p>有一些大多数人不知道或知道但没有真正利用的钩子可以帮助记忆：</p>
<div class="language-"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span>SESSION 1                          SESSION 2</span></span>
<span class="line"><span>──────────                         ──────────</span></span>
<span class="line"><span>[Start]                            [Start]</span></span>
<span class="line"><span>    │                                  │</span></span>
<span class="line"><span>    ▼                                  ▼</span></span>
<span class="line"><span>┌──────────────┐              ┌──────────────┐</span></span>
<span class="line"><span>│ SessionStart │ ◄── reads ───│ SessionStart │◄── 加载之前的</span></span>
<span class="line"><span>│    Hook      │  nothing yet │    Hook      │    上下文</span></span>
<span class="line"><span>└──────┬───────┘              └──────┬───────┘</span></span>
<span class="line"><span>       │                              │</span></span>
<span class="line"><span>       ▼                              ▼</span></span>
<span class="line"><span>   [Working]                      [Working]</span></span>
<span class="line"><span>       │                          (有信息的)</span></span>
<span class="line"><span>       ▼                              │</span></span>
<span class="line"><span>┌──────────────┐                      ▼</span></span>
<span class="line"><span>│ PreCompact   │──► 保存状态     [继续...]</span></span>
<span class="line"><span>│    Hook      │   压缩前</span></span>
<span class="line"><span>└──────┬───────┘</span></span>
<span class="line"><span>       │</span></span>
<span class="line"><span>       ▼</span></span>
<span class="line"><span>  [Compressed]</span></span>
<span class="line"><span>       │</span></span>
<span class="line"><span>       ▼</span></span>
<span class="line"><span>┌──────────────┐</span></span>
<span class="line"><span>│  Stop Hook   │──► 持久化到 ──────────►</span></span>
<span class="line"><span>│ (session-end)│   ~/.claude/sessions/</span></span>
<span class="line"><span>└──────────────┘</span></span></code></pre>
</div><ul>
<li><strong>PreCompact 钩子</strong>：在上下文压缩发生前，将重要状态保存到文件</li>
<li><strong>SessionComplete 钩子</strong>：会话结束时，将学习成果持久化到文件</li>
<li><strong>SessionStart 钩子</strong>：新会话开始时，自动加载之前的上下文</li>
</ul>
<p>钩子配置：</p>
<div class="language-json"><button title="Copy Code" class="copy"></button><span class="lang">json</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">{</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  "hooks"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: {</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    "PreCompact"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: [{</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">      "matcher"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"*"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">      "hooks"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: [{</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">        "type"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"command"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">        "command"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"~/.claude/hooks/memory-persistence/pre-compact.sh"</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      }]</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    }],</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    "SessionStart"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: [{</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">      "matcher"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"*"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">      "hooks"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: [{</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">        "type"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"command"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">        "command"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"~/.claude/hooks/memory-persistence/session-start.sh"</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      }]</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    }],</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    "Stop"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: [{</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">      "matcher"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"*"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">      "hooks"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: [{</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">        "type"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"command"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">        "command"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"~/.claude/hooks/memory-persistence/session-end.sh"</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      }]</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    }]</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre>
</div><p>这些脚本的功能：</p>
<ul>
<li><strong>pre-compact.sh</strong>：记录压缩事件，用压缩时间戳更新活跃会话文件</li>
<li><strong>session-start.sh</strong>：检查最近的会话文件（最近 7 天），通知可用的上下文和已学习的技能</li>
<li><strong>session-end.sh</strong>：用模板创建/更新每日会话文件，跟踪开始/结束时间</li>
</ul>
<p>将这些链接在一起实现无需手动干预的跨会话持续记忆。这建立在第一篇文章中的钩子类型（PreToolUse、PostToolUse、Stop）之上，但专门针对会话生命周期。</p>
<hr>
<h2 id="持续学习" tabindex="-1">持续学习 <a class="header-anchor" href="#持续学习" aria-label="Permalink to “持续学习”">&#8203;</a></h2>
<p>我们讨论过以更新代码地图的形式进行持续记忆更新，但这同样适用于其他方面，比如<strong>从错误中学习</strong>。如果你不得不多次重复一个提示，而 Claude 遇到相同的问题或给了你之前听过的回答，这就适用于你。</p>
<p>最可能你需要发出第二个提示来&quot;重新引导&quot;并校准 Claude 的方向。这适用于任何此类场景——那些模式必须被追加到技能中。</p>
<p>你可以通过简单地告诉 Claude 记住它或将其添加到你的规则中来自动完成这个操作，或者你可以有一个专门做这件事的技能。</p>
<p><strong>问题</strong>：浪费 token、浪费上下文、浪费时间，你的皮质醇水平飙升，因为你沮丧地对 Claude 大喊不要做你已经在之前会话中告诉它不要做的事情。</p>
<p><strong>解决方案</strong>：当 Claude Code 发现非琐碎的东西——一种调试技术、一个变通方案、某个项目特定的模式——它将该知识保存为新技能。下次类似问题出现时，技能会被自动加载。</p>
<p><strong>为什么用 Stop 钩子而不是 UserPromptSubmit？</strong> UserPromptSubmit 在你发送的每条消息上运行——这开销很大，给每个提示增加延迟，坦率地说对此目的是杀鸡用牛刀。Stop 在会话结束时运行一次——轻量级，不会在会话中拖慢你，并且评估完整会话而非零散片段。</p>
<p>安装方法：</p>
<div class="language-bash"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 克隆到 skills 文件夹</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">git</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> clone</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> https://github.com/affaan-m/everything-claude-code.git</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> ~/.claude/skills/everything-claude-code</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 或者只获取持续学习技能</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">mkdir</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -p</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> ~/.claude/skills/continuous-learning</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">curl</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -sL</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> https://raw.githubusercontent.com/affaan-m/everything-claude-code/main/skills/continuous-learning/evaluate-session.sh</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> ></span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> ~/.claude/skills/continuous-learning/evaluate-session.sh</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">chmod</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> +x</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> ~/.claude/skills/continuous-learning/evaluate-session.sh</span></span></code></pre>
</div><div class="language-json"><button title="Copy Code" class="copy"></button><span class="lang">json</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">{</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  "hooks"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: {</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    "Stop"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: [</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      {</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">        "matcher"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"*"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">        "hooks"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: [</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">          {</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">            "type"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"command"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">            "command"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"~/.claude/skills/continuous-learning/evaluate-session.sh"</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">          }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        ]</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    ]</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre>
</div><p>Stop 钩子在你的会话结束时触发——脚本分析会话中值得提取的模式（错误解决方案、调试技术、变通方案、项目特定模式等），并将它们保存为可复用技能到 <code>~/.claude/skills/learned/</code>。</p>
<h3 id="使用-learn-手动提取" tabindex="-1">使用 <code>/learn</code> 手动提取 <a class="header-anchor" href="#使用-learn-手动提取" aria-label="Permalink to “使用 /learn 手动提取”">&#8203;</a></h3>
<p>你不必等到会话结束。该仓库还包括一个 <code>/learn</code> 命令，你可以在会话中刚解决了非琐碎问题时运行。它会提示你立即提取模式，起草技能文件，并在保存前要求确认。</p>
<h3 id="会话日志模式" tabindex="-1">会话日志模式 <a class="header-anchor" href="#会话日志模式" aria-label="Permalink to “会话日志模式”">&#8203;</a></h3>
<p>该技能期望 <code>.tmp</code> 文件中的会话日志。模式是：<code>~/.claude/sessions/YYYY-MM-DD-topic.tmp</code>——每个会话一个文件，包含当前状态、已完成项目、阻塞项、关键决策和下次会话的上下文。</p>
<h3 id="其他自我改进记忆模式" tabindex="-1">其他自我改进记忆模式 <a class="header-anchor" href="#其他自我改进记忆模式" aria-label="Permalink to “其他自我改进记忆模式”">&#8203;</a></h3>
<p>一种方法涉及对会话日志进行反思，提炼用户偏好——本质上是建立一本关于什么有效什么无效的&quot;日记&quot;。每次会话后，反思代理提取什么顺利、什么失败、你做了什么纠正。这些学习成果更新一个在后续会话中加载的记忆文件。</p>
<p>另一种方法让系统每 15 分钟主动建议改进，而不是等你发现模式。代理审查最近的交互，提出记忆更新建议，你批准或拒绝。随着时间推移，它从你的批准模式中学习。</p>
<hr>
<h2 id="token-优化" tabindex="-1">Token 优化 <a class="header-anchor" href="#token-优化" aria-label="Permalink to “Token 优化”">&#8203;</a></h2>
<p>我从价格敏感的用户或作为高级用户经常遇到限制问题的人那里收到了很多问题。在 token 优化方面有几个技巧。</p>
<h3 id="主要策略-子代理架构" tabindex="-1">主要策略：子代理架构 <a class="header-anchor" href="#主要策略-子代理架构" aria-label="Permalink to “主要策略：子代理架构”">&#8203;</a></h3>
<p>主要优化你使用的工具和设计为将最便宜的足够完成任务的模型分配工作的子代理架构来减少浪费。你有几个选择——你可以尝试试错法并随着时间适应。一旦你了解了什么是什么，你可以委托给 Haiku 而不是 Sonnet，委托给 Sonnet 而不是 Opus。</p>
<h3 id="基准测试方法-更复杂" tabindex="-1">基准测试方法（更复杂） <a class="header-anchor" href="#基准测试方法-更复杂" aria-label="Permalink to “基准测试方法（更复杂）”">&#8203;</a></h3>
<p>另一种更复杂的方法是让 Claude 设置一个基准测试，你有一个定义明确的目标和任务的仓库，以及一个定义明确的计划。在每个 git worktree 中，让所有子代理都使用同一个模型。在完成任务时记录日志——理想情况下在你的计划和任务中。你至少需要使用每个子代理一次。</p>
<p>完成一整轮并从 Claude 计划中勾选任务后，停止并审计进度。你可以通过比较 diff、创建在所有 worktree 中统一的对单元、集成和 E2E 测试来实现。这将根据通过的用例与失败的用例给你一个数字基准。如果所有测试在所有 worktree 上都通过，你需要添加更多测试边缘情况或增加测试的复杂性。这是否值得取决于这对你的真正重要性。</p>
<h3 id="模型选择快速参考" tabindex="-1">模型选择快速参考 <a class="header-anchor" href="#模型选择快速参考" aria-label="Permalink to “模型选择快速参考”">&#8203;</a></h3>
<p>默认使用 Sonnet 完成 90% 的编码任务。在以下情况升级到 Opus：首次尝试失败、任务跨越 5 个以上文件、架构决策或安全关键代码。在以下情况降级到 Haiku：任务重复、指令非常清晰，或在多代理设置中用作&quot;工作者&quot;。</p>
<p>坦率地说，Sonnet 4.5 目前处于一个奇怪的位置，每百万输入 token 3 美元，每百万输出 token 15 美元，与 Opus 相比节省约 66.7%，绝对来说这是一个不错的节省，但相对而言对大多数人来说微不足道。Haiku 和 Opus 的组合最有意义，因为 Haiku 与 Opus 相比有 5 倍的成本差异，而与 Sonnet 相比只有 1.67 倍的价格差异。</p>
<p>在你的代理定义中，指定模型：</p>
<div class="language-yaml"><button title="Copy Code" class="copy"></button><span class="lang">yaml</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">---</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">name</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">quick-search</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">description</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">Fast file search</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">tools</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">Glob, Grep</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">model</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">haiku</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"> # Cheap and fast</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">---</span></span></code></pre>
</div><h3 id="工具特定优化" tabindex="-1">工具特定优化 <a class="header-anchor" href="#工具特定优化" aria-label="Permalink to “工具特定优化”">&#8203;</a></h3>
<p>考虑 Claude 最频繁调用的工具。例如，用 mgrep 替换 grep——在各种任务中，与传统 grep 或 ripgrep（Claude 默认使用的）相比，平均 token 减少约一半。</p>
<h3 id="后台进程" tabindex="-1">后台进程 <a class="header-anchor" href="#后台进程" aria-label="Permalink to “后台进程”">&#8203;</a></h3>
<p>在适用时，如果你不需要 Claude 处理整个输出并实时流式传输，可以在 Claude 之外运行后台进程。这可以通过 tmux 轻松实现。获取终端输出然后仅总结或复制你需要的部分。这将节省大量输入 token——Opus 4.5 每百万 token 5 美元（输入），输出每百万 token 25 美元。</p>
<h3 id="模块化代码库的收益" tabindex="-1">模块化代码库的收益 <a class="header-anchor" href="#模块化代码库的收益" aria-label="Permalink to “模块化代码库的收益”">&#8203;</a></h3>
<p>拥有更模块化的代码库，具有可复用的工具、函数、钩子等——主文件在数百行而不是数千行——既有助于 token 优化成本，又有助于第一次就正确完成任务，两者是相关的。如果你不得不多次提示 Claude，你就在消耗 token，特别是当它在很长的文件上反复阅读时。你会注意到它需要做很多工具调用来完成文件读取。在中间过程中，它让你知道文件很长并会继续读取。在这个过程中的某个环节，Claude 可能会丢失一些信息。而且停止并重新读取会消耗额外的 token。这可以通过拥有更模块化的代码库来避免。</p>
<div class="language-"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span>root/</span></span>
<span class="line"><span>├── docs/              # 全局文档</span></span>
<span class="line"><span>├── scripts/           # CI/CD 和构建脚本</span></span>
<span class="line"><span>├── src/</span></span>
<span class="line"><span>│   ├── apps/          # 入口点 (API, CLI, Workers)</span></span>
<span class="line"><span>│   │   ├── api-gateway/  # 路由请求到模块</span></span>
<span class="line"><span>│   │   └── cron-jobs/</span></span>
<span class="line"><span>│   │</span></span>
<span class="line"><span>│   ├── modules/       # 系统核心</span></span>
<span class="line"><span>│   │   ├── ordering/  # 自包含的"订单"模块</span></span>
<span class="line"><span>│   │   │   ├── api/         # 面向其他模块的公共接口</span></span>
<span class="line"><span>│   │   │   ├── domain/      # 业务逻辑与实体（纯）</span></span>
<span class="line"><span>│   │   │   ├── infrastructure/  # DB、外部客户端、仓储</span></span>
<span class="line"><span>│   │   │   ├── use-cases/   # 应用逻辑（编排）</span></span>
<span class="line"><span>│   │   │   └── tests/       # 单元和集成测试</span></span>
<span class="line"><span>│   │   │</span></span>
<span class="line"><span>│   │   ├── catalog/   # 自包含的"目录"模块</span></span>
<span class="line"><span>│   │   │   ├── domain/</span></span>
<span class="line"><span>│   │   │   └── ...</span></span>
<span class="line"><span>│   │   │</span></span>
<span class="line"><span>│   │   └── identity/  # 自包含的"认证/用户"模块</span></span>
<span class="line"><span>│   │       ├── domain/</span></span>
<span class="line"><span>│   │       └── ...</span></span>
<span class="line"><span>│   │</span></span>
<span class="line"><span>│   ├── shared/        # 每个模块都使用的代码</span></span>
<span class="line"><span>│   │   ├── kernel/    # 基类 (Entity, ValueObject)</span></span>
<span class="line"><span>│   │   ├── events/    # 全局事件总线定义</span></span>
<span class="line"><span>│   │   └── utils/     # 深度通用辅助函数</span></span>
<span class="line"><span>│   │</span></span>
<span class="line"><span>│   └── main.ts        # 应用引导</span></span>
<span class="line"><span>├── tests/             # 端到端 (E2E) 全局测试</span></span>
<span class="line"><span>├── package.json</span></span>
<span class="line"><span>└── README.md</span></span></code></pre>
</div><h3 id="精简代码库-更便宜的-token" tabindex="-1">精简代码库 = 更便宜的 Token <a class="header-anchor" href="#精简代码库-更便宜的-token" aria-label="Permalink to “精简代码库 = 更便宜的 Token”">&#8203;</a></h3>
<p>这可能是显而易见的，但你的代码库越精简，token 成本就越低。使用技能持续清理代码库、通过重构来识别死代码至关重要。在某些时候，我喜欢通览整个代码库，寻找突出或看起来重复的内容，手动拼凑那个上下文，然后连同重构技能和死代码技能一起喂给 Claude。</p>
<h3 id="系统提示瘦身-高级" tabindex="-1">系统提示瘦身（高级） <a class="header-anchor" href="#系统提示瘦身-高级" aria-label="Permalink to “系统提示瘦身（高级）”">&#8203;</a></h3>
<p>对于真正关注成本的人：Claude Code 的系统提示占用约 18k token（200k 上下文的约 9%）。这可以通过补丁减少到约 10k token，节省约 7,300 token（静态开销的 41%）。如果你想走这条路，参见 YK 的指南。个人我不做这个。</p>
<hr>
<h2 id="评估与-harness-调优" tabindex="-1">评估与 Harness 调优 <a class="header-anchor" href="#评估与-harness-调优" aria-label="Permalink to “评估与 Harness 调优”">&#8203;</a></h2>
<p>根据项目，你会想要使用某种形式的可观测性和标准化。</p>
<h3 id="可观测性方法" tabindex="-1">可观测性方法 <a class="header-anchor" href="#可观测性方法" aria-label="Permalink to “可观测性方法”">&#8203;</a></h3>
<p>一种方法是将 tmux 进程挂接到跟踪思维流并在技能触发时输出。另一种方法是使用 PostToolUse 钩子记录 Claude 具体执行了什么以及确切的更改和输出。</p>
<h3 id="基准测试工作流" tabindex="-1">基准测试工作流 <a class="header-anchor" href="#基准测试工作流" aria-label="Permalink to “基准测试工作流”">&#8203;</a></h3>
<p>与在没有技能的情况下要求同样的事情并检查输出差异来基准测试相对性能：</p>
<div class="language-"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span>[Same Task]</span></span>
<span class="line"><span>        │</span></span>
<span class="line"><span>   ┌────┴────┐</span></span>
<span class="line"><span>   ▼         ▼</span></span>
<span class="line"><span>┌────────┐ ┌────────┐</span></span>
<span class="line"><span>│Worktree│ │Worktree│</span></span>
<span class="line"><span>│  A     │ │  B     │</span></span>
<span class="line"><span>│有技能  │ │无技能  │</span></span>
<span class="line"><span>└───┬────┘ └───┬────┘</span></span>
<span class="line"><span>    │          │</span></span>
<span class="line"><span>    ▼          ▼</span></span>
<span class="line"><span>[Output A] [Output B]</span></span>
<span class="line"><span>    │          │</span></span>
<span class="line"><span>    └─────┬────┘</span></span>
<span class="line"><span>          ▼</span></span>
<span class="line"><span>      [git diff]</span></span>
<span class="line"><span>          │</span></span>
<span class="line"><span>          ▼</span></span>
<span class="line"><span>   ┌──────────────┐</span></span>
<span class="line"><span>   │比较日志、     │</span></span>
<span class="line"><span>   │token 使用、   │</span></span>
<span class="line"><span>   │输出质量       │</span></span>
<span class="line"><span>   └──────────────┘</span></span></code></pre>
</div><p>分叉对话，在其中一个中启动一个没有技能的新 worktree，最后拉出 diff，看看记录了什么。这与持续学习和记忆部分相关联。</p>
<h3 id="评估模式类型" tabindex="-1">评估模式类型 <a class="header-anchor" href="#评估模式类型" aria-label="Permalink to “评估模式类型”">&#8203;</a></h3>
<p>更高级的评估和循环协议在此进入。分为基于检查点的评估和基于 RL 任务的持续评估。</p>
<p><strong>基于检查点的评估</strong>：</p>
<ul>
<li>在工作流中设置显式检查点</li>
<li>在每个检查点根据定义的标准验证</li>
<li>如果验证失败，Claude 必须在继续之前修复</li>
<li>适用于有清晰里程碑的线性工作流</li>
</ul>
<p><strong>持续评估</strong>：</p>
<ul>
<li>每 N 分钟或重大更改后运行</li>
<li>完整测试套件、构建状态、代码检查</li>
<li>立即报告回归</li>
<li>在继续之前停止并修复</li>
<li>适用于长时间运行的会话、探索性重构或维护</li>
</ul>
<p>决定因素是你工作的性质。基于检查点适用于有清晰阶段的功能实现。持续适用于探索性重构或没有清晰里程碑的维护。</p>
<p>我想说通过一些干预，验证方法足以避免大多数技术债。让 Claude 在完成任务后通过运行技能和 PostToolUse 钩子来验证有助于此。持续的代码地图更新也有帮助，因为它保留了变更日志以及代码地图如何随时间演变，作为仓库本身之外的真相来源。通过严格的规则，Claude 会避免创建随意的 <code>.md</code> 文件弄得一团糟，以及相似代码的重复文件和留下死代码的荒原。</p>
<h3 id="评分器类型" tabindex="-1">评分器类型 <a class="header-anchor" href="#评分器类型" aria-label="Permalink to “评分器类型”">&#8203;</a></h3>
<ul>
<li><strong>基于代码的评分器</strong>：字符串匹配、二进制测试、静态分析、结果验证。快速、便宜、客观，但对有效变化脆弱。</li>
<li><strong>基于模型的评分器</strong>：评分标准、自然语言断言、成对比较。灵活且能处理细微差别，但不具确定性且更昂贵。</li>
<li><strong>人工评分器</strong>：主题专家审查、众包判断、抽查抽样。黄金标准质量，但昂贵且缓慢。</li>
</ul>
<h3 id="关键指标" tabindex="-1">关键指标 <a class="header-anchor" href="#关键指标" aria-label="Permalink to “关键指标”">&#8203;</a></h3>
<p><strong>pass@k</strong>：k 次尝试中至少有一次成功</p>
<table tabindex="0">
<thead>
<tr>
<th>k 值</th>
<th>通过率</th>
</tr>
</thead>
<tbody>
<tr>
<td>k=1</td>
<td>70%</td>
</tr>
<tr>
<td>k=3</td>
<td>91%</td>
</tr>
<tr>
<td>k=5</td>
<td>97%</td>
</tr>
</tbody>
</table>
<p>k 越高 = 成功概率越高</p>
<p><strong>pass^k</strong>：k 次尝试必须全部成功</p>
<table tabindex="0">
<thead>
<tr>
<th>k 值</th>
<th>通过率</th>
</tr>
</thead>
<tbody>
<tr>
<td>k=1</td>
<td>70%</td>
</tr>
<tr>
<td>k=3</td>
<td>34%</td>
</tr>
<tr>
<td>k=5</td>
<td>17%</td>
</tr>
</tbody>
</table>
<p>k 越高 = 越难（一致性）</p>
<p>当你只需要它工作且任何验证反馈就够时使用 <code>pass@k</code>。当一致性至关重要且你需要近乎确定性的输出一致性（在结果/质量/风格方面）时使用 <code>pass^k</code>。</p>
<h3 id="构建评估路线图" tabindex="-1">构建评估路线图 <a class="header-anchor" href="#构建评估路线图" aria-label="Permalink to “构建评估路线图”">&#8203;</a></h3>
<ol>
<li><strong>尽早开始</strong>——从真实失败中获取 20-50 个简单任务</li>
<li><strong>将用户报告的失败转换为测试用例</strong></li>
<li><strong>编写明确的任务</strong>——两位专家应达成相同结论</li>
<li><strong>构建平衡的问题集</strong>——测试行为应该和不应该发生的情况</li>
<li><strong>构建稳健的 harness</strong>——每次试验从干净环境开始</li>
<li><strong>评估代理产生了什么，而不是它采取的路径</strong></li>
<li><strong>阅读多次试验的记录</strong></li>
<li><strong>监控饱和度</strong>——100% 通过率意味着需要添加更多测试</li>
</ol>
<hr>
<h2 id="并行化策略" tabindex="-1">并行化策略 <a class="header-anchor" href="#并行化策略" aria-label="Permalink to “并行化策略”">&#8203;</a></h2>
<p>在多 Claude 终端设置中分叉对话时，确保分叉和原始对话中的操作范围定义明确。在代码更改方面争取最小重叠。选择彼此正交的任务以防止干扰的可能性。</p>
<h3 id="我的偏好模式" tabindex="-1">我的偏好模式 <a class="header-anchor" href="#我的偏好模式" aria-label="Permalink to “我的偏好模式”">&#8203;</a></h3>
<p>个人而言，我更喜欢让主聊天处理代码更改，而我做的分叉用于我对代码库及其当前状态的问题，或研究外部服务（如拉取文档、搜索 GitHub 寻找有帮助的开源仓库），或其他有帮助的通用研究。</p>
<h3 id="关于任意终端数量" tabindex="-1">关于任意终端数量 <a class="header-anchor" href="#关于任意终端数量" aria-label="Permalink to “关于任意终端数量”">&#8203;</a></h3>
<p>Boris（Claude Code 的创建者，传奇人物）有一些关于并行化的建议，我有些同意有些不同意。他建议过像本地运行 5 个 Claude 实例和 5 个上游实例这样的事情。我建议<strong>不要</strong>设置像这样的任意终端数量。添加终端和添加实例应该是出于真正的必要性和目的。如果你能用脚本完成任务，就用脚本。如果你能在主聊天中让 Claude 在 tmux 中启动一个实例并在单独的终端中流式传输，就那样做。</p>
<p>你的目标应该是：<strong>用最少的可行并行化完成最多的事情。</strong></p>
<p>对于大多数新手，我甚至建议远离并行化，直到你掌握了只运行单个实例并在其中管理一切的技巧。我不是在提倡限制自己——我是在说要小心。大多数时候，甚至我也总共只使用 4 个终端左右。我发现通常用 2 或 3 个 Claude 实例就能完成大部分事情。</p>
<h3 id="扩展实例时" tabindex="-1">扩展实例时 <a class="header-anchor" href="#扩展实例时" aria-label="Permalink to “扩展实例时”">&#8203;</a></h3>
<p>如果你确实要开始扩展实例<strong>并且</strong>有多个 Claude 实例处理彼此重叠的代码，使用 git worktree 并为每个实例制定非常明确的计划是必须的。此外，为了避免在恢复会话时对哪个 git worktree 用于什么感到困惑（除了树的名称），使用 <code>/rename &lt;name&gt;</code> 命名为你的所有聊天命名。</p>
<h3 id="使用-git-worktree-进行并行工作" tabindex="-1">使用 Git Worktree 进行并行工作 <a class="header-anchor" href="#使用-git-worktree-进行并行工作" aria-label="Permalink to “使用 Git Worktree 进行并行工作”">&#8203;</a></h3>
<div class="language-bash"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 为并行工作创建 worktree</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">git</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> worktree</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> add</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> ../project-feature-a</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> feature-a</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">git</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> worktree</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> add</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> ../project-feature-b</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> feature-b</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">git</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> worktree</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> add</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> ../project-refactor</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> refactor-branch</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 每个 worktree 获得自己的 Claude 实例</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">cd</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> ../project-feature-a</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> &#x26;&#x26; </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">claude</span></span></code></pre>
</div><p>好处：</p>
<ul>
<li>实例之间没有 git 冲突</li>
<li>每个都有干净的工作目录</li>
<li>容易比较输出</li>
<li>可以在不同方法间基准测试相同任务</li>
</ul>
<h3 id="级联方法" tabindex="-1">级联方法 <a class="header-anchor" href="#级联方法" aria-label="Permalink to “级联方法”">&#8203;</a></h3>
<p>运行多个 Claude Code 实例时，用&quot;级联&quot;模式组织：</p>
<ul>
<li>在右边的新标签页中打开新任务</li>
<li>从左到右扫描，从最旧到最新</li>
<li>保持一致的方向流</li>
<li>根据需要检查特定任务</li>
<li>一次最多关注 3-4 个任务——超过这个，心智负担增长速度比生产力更快</li>
</ul>
<hr>
<h2 id="从头开始-两实例启动模式" tabindex="-1">从头开始：两实例启动模式 <a class="header-anchor" href="#从头开始-两实例启动模式" aria-label="Permalink to “从头开始：两实例启动模式”">&#8203;</a></h2>
<p>从头开始时，实际的基础很重要。这应该是显而易见的，但随着代码库复杂度和规模增加，技术债也会增加。管理它非常重要，如果你遵循一些规则并不那么困难。</p>
<h3 id="两实例启动模式" tabindex="-1">两实例启动模式 <a class="header-anchor" href="#两实例启动模式" aria-label="Permalink to “两实例启动模式”">&#8203;</a></h3>
<p>对于我自己的工作流管理（不是必须的但有帮助），我喜欢用 2 个打开的 Claude 实例启动一个空仓库。</p>
<p><strong>实例 1：脚手架代理</strong></p>
<ul>
<li>搭建脚手架和基础工作</li>
<li>创建项目结构</li>
<li>设置配置（<code>CLAUDE.md</code>、规则、代理——速查指南中的所有内容）</li>
<li>建立约定</li>
<li>搭建骨架</li>
</ul>
<p><strong>实例 2：深度研究代理</strong></p>
<ul>
<li>连接到你所有的服务、网络搜索等</li>
<li>创建详细的 PRD</li>
<li>创建架构 mermaid 图</li>
<li>编译来自实际文档的参考</li>
</ul>
<p>启动设置：左终端用于编码，右终端用于提问——使用 <code>/rename</code> 和 <code>/fork</code>。</p>
<p>你最初需要的最低限度就够了——这比每次都使用 Context7 或喂入链接让它抓取或使用 Firecrawl MCP 站点更快。当你在某事中已经深陷其中，Claude 明显在语法上出错或使用过时的函数或端点时，所有这些方法都有效。</p>
<h3 id="llms-txt-模式" tabindex="-1">llms.txt 模式 <a class="header-anchor" href="#llms-txt-模式" aria-label="Permalink to “llms.txt 模式”">&#8203;</a></h3>
<p>如果可用，你可以在许多文档参考上找到 llms.txt，方法是到达它们的文档页面后加上 <code>/llms.txt</code>。这会给你一个干净的、LLM 优化的文档版本，你可以直接喂给 Claude。</p>
<hr>
<h2 id="哲学-构建可复用模式" tabindex="-1">哲学：构建可复用模式 <a class="header-anchor" href="#哲学-构建可复用模式" aria-label="Permalink to “哲学：构建可复用模式”">&#8203;</a></h2>
<p>我完全认同的一个洞察：&quot;早期，我花时间构建可复用工作流/模式。构建很繁琐，但随着模型和代理 harness 改进，这产生了疯狂的复合效应。&quot;</p>
<p>值得投资的：</p>
<ul>
<li>子代理（速查指南）</li>
<li>技能（速查指南）</li>
<li>命令（速查指南）</li>
<li>规划模式</li>
<li>MCP 工具（速查指南）</li>
<li>上下文工程模式</li>
</ul>
<p>为什么它会复合：&quot;最好的部分是所有这些工作流都可以转移到 Codex 等其他代理。&quot; 一旦构建，它们跨模型升级工作。<strong>对模式的投资 &gt; 对特定模型技巧的投资。</strong></p>
<h3 id="子代理上下文问题" tabindex="-1">子代理上下文问题 <a class="header-anchor" href="#子代理上下文问题" aria-label="Permalink to “子代理上下文问题”">&#8203;</a></h3>
<p>子代理的存在是为了通过返回摘要而不是转储所有内容来节省上下文。但编排器拥有子代理缺少的语义上下文。子代理只知道字面查询，不知道请求背后的<strong>目的/推理</strong>。摘要经常遗漏关键细节。</p>
<p>比喻：&quot;你的老板派你去开会并要求一份摘要。你回来给了他一个概要。十有八九，他会有后续问题。你的摘要不会包含他需要的一切，因为你没有他拥有的隐式上下文。&quot;</p>
<h3 id="迭代检索模式" tabindex="-1">迭代检索模式 <a class="header-anchor" href="#迭代检索模式" aria-label="Permalink to “迭代检索模式”">&#8203;</a></h3>
<div class="language-"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span>┌─────────────────┐</span></span>
<span class="line"><span>│   ORCHESTRATOR  │</span></span>
<span class="line"><span>│  (has context)  │</span></span>
<span class="line"><span>└────────┬────────┘</span></span>
<span class="line"><span>         │ dispatch with query + objective</span></span>
<span class="line"><span>         ▼</span></span>
<span class="line"><span>┌─────────────────┐</span></span>
<span class="line"><span>│   SUB-AGENT     │</span></span>
<span class="line"><span>│ (lacks context) │</span></span>
<span class="line"><span>└────────┬────────┘</span></span>
<span class="line"><span>         │ returns summary</span></span>
<span class="line"><span>         ▼</span></span>
<span class="line"><span>┌─────────────────┐    ┌─────────────┐</span></span>
<span class="line"><span>│   EVALUATE      │──no─►│ FOLLOW-UP   │</span></span>
<span class="line"><span>│  Sufficient?    │       │  QUESTIONS  │</span></span>
<span class="line"><span>└────────┬────────┘    └──────┬──────┘</span></span>
<span class="line"><span>         │ yes               │</span></span>
<span class="line"><span>         ▼                   │ sub-agent</span></span>
<span class="line"><span>      [ACCEPT]          fetches answers</span></span>
<span class="line"><span>         │                   │</span></span>
<span class="line"><span>         ◄───────────────────┘</span></span>
<span class="line"><span>                         (max 3 cycles)</span></span></code></pre>
</div><p>修复方法是让编排器：</p>
<ul>
<li>评估每个子代理的返回</li>
<li>在接受之前提出后续问题</li>
<li>子代理回到源，获取答案，返回</li>
<li>循环直到足够（最多 3 个循环以防止无限循环）</li>
</ul>
<p>传递<strong>目标上下文</strong>，而不仅仅是查询。分派子代理时，包含特定查询和更广泛的目标。这有助于子代理在摘要中优先包含什么。</p>
<h3 id="编排器顺序阶段模式" tabindex="-1">编排器顺序阶段模式 <a class="header-anchor" href="#编排器顺序阶段模式" aria-label="Permalink to “编排器顺序阶段模式”">&#8203;</a></h3>
<div class="language-"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span>Phase 1: RESEARCH (use Explore agent)</span></span>
<span class="line"><span>- 收集上下文</span></span>
<span class="line"><span>- 识别模式</span></span>
<span class="line"><span>- 输出: research-summary.md</span></span>
<span class="line"><span></span></span>
<span class="line"><span>Phase 2: PLAN (use planner agent)</span></span>
<span class="line"><span>- 阅读 research-summary.md</span></span>
<span class="line"><span>- 创建实现计划</span></span>
<span class="line"><span>- 输出: plan.md</span></span>
<span class="line"><span></span></span>
<span class="line"><span>Phase 3: IMPLEMENT (use tdd-guide agent)</span></span>
<span class="line"><span>- 阅读 plan.md</span></span>
<span class="line"><span>- 先写测试</span></span>
<span class="line"><span>- 实现代码</span></span>
<span class="line"><span>- 输出: code changes</span></span>
<span class="line"><span></span></span>
<span class="line"><span>Phase 4: REVIEW (use code-reviewer agent)</span></span>
<span class="line"><span>- 审查所有更改</span></span>
<span class="line"><span>- 输出: review-comments.md</span></span>
<span class="line"><span></span></span>
<span class="line"><span>Phase 5: VERIFY (use build-error-resolver if needed)</span></span>
<span class="line"><span>- 运行测试</span></span>
<span class="line"><span>- 修复问题</span></span>
<span class="line"><span>- 输出: done 或 loop back</span></span></code></pre>
</div><p>关键规则：</p>
<ol>
<li>每个代理获得一个清晰的输入并产生一个清晰的输出</li>
<li>输出成为下一阶段的输入</li>
<li>永远不要跳过阶段——每个都增加价值</li>
<li>在代理之间使用 <code>/clear</code> 保持上下文新鲜</li>
<li>将中间输出存储在文件中（不仅仅是内存）</li>
</ol>
<h3 id="代理抽象层级" tabindex="-1">代理抽象层级 <a class="header-anchor" href="#代理抽象层级" aria-label="Permalink to “代理抽象层级”">&#8203;</a></h3>
<p><strong>第一层：直接增益（易于使用）</strong></p>
<ul>
<li><strong>子代理</strong>——防止上下文腐化和临时专业化的直接增益。效果约为多代理的一半，但复杂度低得多</li>
<li><strong>元提示</strong>——&quot;我花 3 分钟提示一个 20 分钟的任务。&quot; 直接增益——提高稳定性并验证假设</li>
<li><strong>一开始多问用户</strong>——通常是增益，虽然你需要在计划模式中回答问题</li>
</ul>
<p><strong>第二层：高技能门槛（更难用好）</strong></p>
<ul>
<li><strong>长时间运行的代理</strong>——需要理解 15 分钟任务与 1.5 小时与 4 小时任务的形状和权衡。需要一些调整，显然是非常长的试错过程</li>
<li><strong>并行多代理</strong>——方差很高，只对高度复杂或良好分割的任务有用。&quot;如果 2 个任务各需要 10 分钟，而你花任意时间提示或者更糟的合并更改，那是适得其反的&quot;</li>
<li><strong>基于角色的多代理</strong>——&quot;模型演进太快，除非套利非常高，否则硬编码的启发式规则不适用。&quot; 难以测试</li>
<li><strong>计算机使用代理</strong>——非常早期的范式，需要磨合。&quot;你让模型做它们一年前绝对不是设计来做的事情&quot;</li>
</ul>
<p><strong>要点</strong>：从第一层模式开始。只有在掌握了基础并有真正需求时才晋升到第二层。</p>
<hr>
<h2 id="mcp-替代策略" tabindex="-1">MCP 替代策略 <a class="header-anchor" href="#mcp-替代策略" aria-label="Permalink to “MCP 替代策略”">&#8203;</a></h2>
<p>一些 MCP 是可替代的，会释放你的上下文窗口。方法如下。</p>
<p>对于版本控制（GitHub）、数据库（Supabase）、部署（Vercel、Railway）等 MCP——这些平台大多数已经有强大的 CLI，MCP 本质上只是在包装它们。MCP 是一个不错的包装器，但需要付出代价。</p>
<p>要让 CLI 像 MCP 一样运行而不实际使用 MCP（以及随之而来的减少上下文窗口），考虑将功能打包到技能和命令中。将 MCP 暴露的工具剥离出来，把它们变成命令。</p>
<p>例如：与其一直加载 GitHub MCP，不如创建一个包装 <code>gh pr create</code> 的 <code>/gh-pr</code> 命令，加上你偏好的选项。与其让 Supabase MCP 消耗上下文，不如创建直接使用 Supabase CLI 的技能。功能相同，便利性类似，但你的上下文窗口被释放用于实际工作。</p>
<p>自从我发布原文以来的过去几天，Boris 和 Claude Code 团队在记忆管理和优化方面取得了很多进展，主要是 MCP 的<strong>延迟加载</strong>，这样它们不再从一开始就消耗你的窗口。之前我会建议尽可能将 MCP 转换为技能，通过以下两种方式卸载执行 MCP 的功能：在当时启用它（不太理想，因为需要离开并恢复会话）或拥有使用 MCP 的 CLI 类似物的技能（如果存在）并让技能成为它的包装器——本质上是让它充当伪 MCP。</p>
<p>有了延迟加载，上下文窗口问题基本解决了。但 token 使用和成本并没有以同样的方式解决。CLI + 技能方法仍然是一种 token 优化方法，效果可能与使用 MCP 相当或接近。此外，你可以通过 CLI 而不是在上下文中运行 MCP 操作，这显著减少了 token 使用，特别适用于重型 MCP 操作如数据库查询或部署。</p>
<hr>
<h2 id="参考资源" tabindex="-1">参考资源 <a class="header-anchor" href="#参考资源" aria-label="Permalink to “参考资源”">&#8203;</a></h2>
<ul>
<li>Anthropic：《Demystifying evals for AI agents》（2026 年 1 月）</li>
<li>Anthropic：《Claude Code Best Practices》（2025 年 4 月）</li>
<li>Fireworks AI：《Eval Driven Development with Claude Code》（2025 年 8 月）</li>
<li>YK：《32 Claude Code Tips》（2025 年 12 月）</li>
<li>Addy Osmani：《My LLM coding workflow going into 2026》</li>
<li>子代理上下文协商模式</li>
<li>代理抽象层级</li>
<li>复合效应哲学</li>
<li>RLanceMartin：Session Reflection Pattern</li>
<li>自我改进记忆系统</li>
</ul>
]]></content:encoded></item><item><title><![CDATA[Claude Code 速查指南（Everything Claude Code）]]></title><description><![CDATA[经过 10 个月日常使用后，关于 Claude Code 的完整配置总结：技能、钩子、子代理、MCP、插件，以及真正有效的工作流。]]></description><link>https://www.myls.top/posts/2026-03-30-shorthand-guide-claude-code</link><guid isPermaLink="true">https://www.myls.top/posts/2026-03-30-shorthand-guide-claude-code</guid><category><![CDATA[Claude Code]]></category><category><![CDATA[AI]]></category><category><![CDATA[开发工具]]></category><category><![CDATA[效率]]></category><pubDate>Mon, 30 Mar 2026 00:00:00 GMT</pubDate><content:encoded><![CDATA[<blockquote>
<p><strong>转载声明</strong>：本文翻译转载自 Affaan Mustafa（@affaanmustafa）的推文《The Shorthand Guide to Everything Claude Code》。</p>
<p>原文链接：<a href="https://x.com/affaanmustafa/status/2012378465664745795" target="_blank" rel="noreferrer">https://x.com/affaanmustafa/status/2012378465664745795</a></p>
</blockquote>
<h1 id="claude-code-速查指南" tabindex="-1">Claude Code 速查指南 <a class="header-anchor" href="#claude-code-速查指南" aria-label="Permalink to “Claude Code 速查指南”">&#8203;</a></h1>
<p>这是我经过 10 个月日常使用后的完整配置：技能（Skills）、钩子（Hooks）、子代理（Subagents）、MCP、插件（Plugins），以及真正有效的工作流。</p>
<p>我从 2025 年 2 月实验性推出时就开始使用 Claude Code。从那时起，我用它构建了自主交易代理（其中一个达到了 3800 万美元 FDV，7 万并发观众看我直播编码）、为 elizaOS（17000+ Star 框架）做出了贡献，并在 2025 年 9 月赢得了 Anthropic × Forum Ventures 在纽约举办的黑客马拉松。</p>
<p>以下是我真正在用的配置。</p>
<hr>
<h2 id="技能与命令-skills-commands" tabindex="-1">技能与命令（Skills &amp; Commands） <a class="header-anchor" href="#技能与命令-skills-commands" aria-label="Permalink to “技能与命令（Skills &amp; Commands）”">&#8203;</a></h2>
<p>技能是 Markdown 文件，为 Claude 提供特定工作流的专业知识。可以理解为可复用的提示词。</p>
<ul>
<li><strong>全局技能</strong>存放在 <code>~/.claude/skills/</code></li>
<li><strong>项目级技能</strong>存放在 <code>.claude/skills/</code></li>
<li>可以在单次提示中链式调用</li>
</ul>
<div class="language-"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span># 技能目录结构示例</span></span>
<span class="line"><span>~/.claude/skills/</span></span>
<span class="line"><span>  coding-standards.md    # 编码最佳实践</span></span>
<span class="line"><span>  tdd-workflow/          # 多文件技能，包含 README.md</span></span>
<span class="line"><span>  security-review/       # 基于检查清单的技能</span></span></code></pre>
</div><p><strong>实际用法</strong>：长时间编码会话后，运行 <code>/refactor-clean</code> 自动清理死代码和松散的 Markdown 文件。</p>
<h2 id="钩子-hooks" tabindex="-1">钩子（Hooks） <a class="header-anchor" href="#钩子-hooks" aria-label="Permalink to “钩子（Hooks）”">&#8203;</a></h2>
<p>钩子是基于事件触发的自动化。技能提供知识，钩子执行动作。</p>
<p>共有 6 种钩子类型：</p>
<ol>
<li><strong>PreToolUse</strong> — 工具执行前（验证、提醒）</li>
<li><strong>PostToolUse</strong> — 工具执行后（格式化、类型检查）</li>
<li><strong>UserPromptSubmit</strong> — 发送消息时触发</li>
<li><strong>Stop</strong> — Claude 完成响应时触发</li>
<li><strong>PreCompact</strong> — 上下文压缩前</li>
<li><strong>Notification</strong> — 处理权限请求</li>
</ol>
<p><strong>实际示例</strong>：一个钩子提醒你在运行 <code>npm install</code> 或 <code>pytest</code> 等长命令前使用 tmux。</p>
<div class="language-json"><button title="Copy Code" class="copy"></button><span class="lang">json</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">{</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  "PreToolUse"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: [</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    {</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">      "matcher"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"tool == </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">\"</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">Bash</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">\"</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> &#x26;&#x26; tool_input.command matches </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">\"</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">(npm|pnpm|yarn|cargo|pytest)</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">\"</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">      "hooks"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: [</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        {</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">          "type"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"command"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">          "command"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"if [ -z </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">\"</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">$TMUX</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">\"</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> ]; then echo '[Hook] 建议使用 tmux 保持会话持久' >&#x26;2; fi"</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      ]</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  ]</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre>
</div><p><strong>进阶技巧</strong>：使用 <code>hookify</code> 插件通过对话方式创建钩子，无需手动编写 JSON。</p>
<h2 id="子代理-subagents" tabindex="-1">子代理（Subagents） <a class="header-anchor" href="#子代理-subagents" aria-label="Permalink to “子代理（Subagents）”">&#8203;</a></h2>
<p>子代理是你的主 Claude 实例可以委派任务的独立进程。它们运行在有限的作用域内，拥有独立的上下文，让主代理专注于编排。</p>
<div class="language-"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span># 子代理目录结构</span></span>
<span class="line"><span>~/.claude/agents/</span></span>
<span class="line"><span>  planner.md           # 功能实现规划</span></span>
<span class="line"><span>  architect.md         # 系统设计决策</span></span>
<span class="line"><span>  tdd-guide.md         # 测试驱动开发</span></span>
<span class="line"><span>  code-reviewer.md     # 代码质量/安全审查</span></span>
<span class="line"><span>  security-reviewer.md # 漏洞分析</span></span>
<span class="line"><span>  build-error-resolver.md</span></span>
<span class="line"><span>  e2e-runner.md</span></span>
<span class="line"><span>  refactor-cleaner.md</span></span></code></pre>
</div><p><strong>关键原则</strong>：限制子代理的工具权限。一个拥有 5 个工具的子代理比一个拥有 50 个工具的更快、更聚焦。</p>
<h2 id="规则与记忆-rules-memory" tabindex="-1">规则与记忆（Rules &amp; Memory） <a class="header-anchor" href="#规则与记忆-rules-memory" aria-label="Permalink to “规则与记忆（Rules &amp; Memory）”">&#8203;</a></h2>
<p>规则是你的护栏。用 <code>.rules</code> 文件夹中的 Markdown 文件定义 Claude 应始终遵循的最佳实践。</p>
<div class="language-"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span>~/.claude/rules/</span></span>
<span class="line"><span>  security.md      # 禁止硬编码密钥，验证输入</span></span>
<span class="line"><span>  coding-style.md  # 不可变性，文件组织</span></span>
<span class="line"><span>  testing.md       # TDD 工作流，80% 覆盖率</span></span>
<span class="line"><span>  git-workflow.md  # 提交格式，PR 流程</span></span>
<span class="line"><span>  agents.md        # 何时委派给子代理</span></span>
<span class="line"><span>  performance.md   # 模型选择，上下文管理</span></span></code></pre>
</div><p>记忆系统通过 CLAUDE.md 文件在三个层级工作：</p>
<ul>
<li><strong>项目级</strong>：<code>./CLAUDE.md</code>（与团队共享）</li>
<li><strong>用户级</strong>：<code>~/.claude/CLAUDE.md</code>（个人，适用于所有项目）</li>
<li><strong>项目级用户</strong>：<code>.claude/CLAUDE.md</code></li>
</ul>
<h2 id="mcp-模型上下文协议" tabindex="-1">MCP（模型上下文协议） <a class="header-anchor" href="#mcp-模型上下文协议" aria-label="Permalink to “MCP（模型上下文协议）”">&#8203;</a></h2>
<p>MCP 将 Claude 连接到外部服务。不是 API 的替代品，而是一个更灵活的提示词驱动封装。</p>
<p><strong>最重要的洞察</strong>：</p>
<blockquote>
<p>你 200k 的上下文窗口在压缩前可能只有 70k —— 如果启用了太多工具的话。性能会显著下降。</p>
</blockquote>
<p><strong>经验法则</strong>：配置 20-30 个 MCP，但任何时刻保持启用不超过 10 个。活跃工具数不超过 80 个。</p>
<div class="language-json"><button title="Copy Code" class="copy"></button><span class="lang">json</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">{</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  "github"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: { </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">"command"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"npx"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">"args"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"-y"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"@modelcontextprotocol/server-github"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">] },</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  "firecrawl"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: { </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">"command"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"npx"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">"args"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"-y"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"firecrawl-mcp"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">] },</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  "memory"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: { </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">"command"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"npx"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">"args"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"-y"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"@modelcontextprotocol/server-memory"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">] },</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  "sequential-thinking"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: {</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    "command"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"npx"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    "args"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"-y"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"@modelcontextprotocol/server-sequential-thinking"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">]</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre>
</div><h2 id="插件-plugins" tabindex="-1">插件（Plugins） <a class="header-anchor" href="#插件-plugins" aria-label="Permalink to “插件（Plugins）”">&#8203;</a></h2>
<p>插件将工具打包以便安装。一个插件可以是技能 + MCP 的组合，也可以是钩子和工具的捆绑。</p>
<div class="language-bash"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 添加插件市场</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">claude</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> plugin</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> marketplace</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> add</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> https://github.com/mixedbread-ai/mgrep</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 然后在 Claude 中运行 /plugins，找到新的市场并安装</span></span></code></pre>
</div><p>LSP 插件特别有用 —— 如果你不在编辑器中运行 Claude Code，Language Server Protocol 可以提供实时的类型检查、跳转到定义和智能补全。</p>
<hr>
<h2 id="键盘快捷键" tabindex="-1">键盘快捷键 <a class="header-anchor" href="#键盘快捷键" aria-label="Permalink to “键盘快捷键”">&#8203;</a></h2>
<table tabindex="0">
<thead>
<tr>
<th>快捷键</th>
<th>功能</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>Ctrl+U</code></td>
<td>删除整行输入</td>
</tr>
<tr>
<td><code>!</code></td>
<td>快速执行 Bash 命令前缀</td>
</tr>
<tr>
<td><code>@</code></td>
<td>搜索文件</td>
</tr>
<tr>
<td><code>/</code></td>
<td>发起斜杠命令</td>
</tr>
<tr>
<td><code>Shift+Enter</code></td>
<td>多行输入</td>
</tr>
<tr>
<td><code>Tab</code></td>
<td>切换思考过程显示</td>
</tr>
<tr>
<td><code>Esc Esc</code></td>
<td>中断 Claude 或恢复代码</td>
</tr>
</tbody>
</table>
<h2 id="并行工作流" tabindex="-1">并行工作流 <a class="header-anchor" href="#并行工作流" aria-label="Permalink to “并行工作流”">&#8203;</a></h2>
<p>两种方法同时运行多个 Claude 实例：</p>
<p><strong>1. <code>/fork</code></strong> — 分叉对话，并行执行不重叠的任务</p>
<p><strong>2. Git Worktrees</strong> — 用于重叠的并行工作，每个 worktree 是独立的检出</p>
<div class="language-bash"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">git</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> worktree</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> add</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> ../feature-branch</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> feature-branch</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 现在在每个 worktree 中运行独立的 Claude 实例</span></span></code></pre>
</div><h2 id="tmux-用于长运行命令" tabindex="-1">tmux 用于长运行命令 <a class="header-anchor" href="#tmux-用于长运行命令" aria-label="Permalink to “tmux 用于长运行命令”">&#8203;</a></h2>
<div class="language-bash"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">tmux</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> new</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -s</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> dev</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Claude 在这里运行命令，你可以分离和重新连接</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">tmux</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> attach</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -t</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> dev</span></span></code></pre>
</div><h2 id="其他实用命令" tabindex="-1">其他实用命令 <a class="header-anchor" href="#其他实用命令" aria-label="Permalink to “其他实用命令”">&#8203;</a></h2>
<ul>
<li><code>/rewind</code> — 回到之前的状态</li>
<li><code>/statusline</code> — 自定义显示分支、上下文百分比、待办事项</li>
<li><code>/checkpoints</code> — 文件级撤销点</li>
<li><code>/compact</code> — 手动触发上下文压缩</li>
</ul>
<hr>
<h2 id="我的实际配置" tabindex="-1">我的实际配置 <a class="header-anchor" href="#我的实际配置" aria-label="Permalink to “我的实际配置”">&#8203;</a></h2>
<h3 id="插件-通常同时启用-4-5-个" tabindex="-1">插件（通常同时启用 4-5 个） <a class="header-anchor" href="#插件-通常同时启用-4-5-个" aria-label="Permalink to “插件（通常同时启用 4-5 个）”">&#8203;</a></h3>
<div class="language-"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span>ralph-wiggum@claude-code-plugins       # 循环自动化</span></span>
<span class="line"><span>frontend-design@claude-code-plugins    # UI/UX 模式</span></span>
<span class="line"><span>commit-commands@claude-code-plugins    # Git 工作流</span></span>
<span class="line"><span>security-guidance@claude-code-plugins  # 安全检查</span></span>
<span class="line"><span>code-review@claude-code-plugins        # 代码审查</span></span>
<span class="line"><span>context7@claude-plugins-official       # 实时文档</span></span>
<span class="line"><span>mgrep@Mixedbread-Grep                  # 更好的搜索</span></span></code></pre>
</div><h3 id="关键钩子配置" tabindex="-1">关键钩子配置 <a class="header-anchor" href="#关键钩子配置" aria-label="Permalink to “关键钩子配置”">&#8203;</a></h3>
<div class="language-json"><button title="Copy Code" class="copy"></button><span class="lang">json</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">{</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  "PreToolUse"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: [</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    { </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">"matcher"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"npm|pnpm|yarn|cargo|pytest"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">"hooks"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"tmux 提醒"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">] },</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    { </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">"matcher"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"Write &#x26;&#x26; .md file"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">"hooks"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"除非是 README/CLAUDE 否则阻止"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">] },</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    { </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">"matcher"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"git push"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">"hooks"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"打开编辑器审查"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">] }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  ],</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  "PostToolUse"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: [</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    { </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">"matcher"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"Edit &#x26;&#x26; .ts/.tsx/.js/.jsx"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">"hooks"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"prettier --write"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">] },</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    { </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">"matcher"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"Edit &#x26;&#x26; .ts/.tsx"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">"hooks"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"tsc --noEmit"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">] },</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    { </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">"matcher"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"Edit"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">"hooks"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"grep console.log 警告"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">] }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  ],</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  "Stop"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: [</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    { </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">"matcher"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"*"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">"hooks"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"检查修改文件中的 console.log"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">] }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  ]</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre>
</div><hr>
<h2 id="关于编辑器" tabindex="-1">关于编辑器 <a class="header-anchor" href="#关于编辑器" aria-label="Permalink to “关于编辑器”">&#8203;</a></h2>
<p>我使用 Zed —— 一个基于 Rust 的轻量级编辑器。</p>
<p>工作流：</p>
<ol>
<li>分屏：一边终端运行 Claude Code，另一边编辑器</li>
<li><code>Ctrl+G</code> 快速打开 Claude 正在编辑的文件</li>
<li>启用自动保存，确保 Claude 读取的文件始终是最新的</li>
<li>使用编辑器的 Git 功能在提交前审查变更</li>
</ol>
<p>VSCode 和 Cursor 也可以正常工作。</p>
<hr>
<h2 id="核心原则" tabindex="-1">核心原则 <a class="header-anchor" href="#核心原则" aria-label="Permalink to “核心原则”">&#8203;</a></h2>
<ol>
<li><strong>不要过度复杂化</strong> — 把配置当作微调，不是架构设计</li>
<li><strong>上下文窗口很宝贵</strong> — 禁用未使用的 MCP 和插件</li>
<li><strong>并行执行</strong> — 分叉对话，使用 Git Worktrees</li>
<li><strong>自动化重复任务</strong> — 用钩子处理格式化、Lint、提醒</li>
<li><strong>限定子代理的作用域</strong> — 有限的工具 = 聚焦的执行</li>
</ol>
<hr>
<blockquote>
<p><strong>相关资源</strong>：</p>
<ul>
<li>速查指南原文：<a href="https://x.com/affaanmustafa/status/2012378465664745795" target="_blank" rel="noreferrer">x.com/affaanmustafa/status/2012378465664745795</a></li>
<li>长篇指南原文：<a href="https://x.com/affaanmustafa/article/2014040193557471352" target="_blank" rel="noreferrer">x.com/affaanmustafa/article/2014040193557471352</a></li>
<li>GitHub 仓库：<a href="https://github.com/affaan-m/everything-claude-code" target="_blank" rel="noreferrer">github.com/affaan-m/everything-claude-code</a></li>
</ul>
</blockquote>
]]></content:encoded></item><item><title><![CDATA[用 VitePress + Tailwind 搭一个更适合 AI 的博客]]></title><description><![CDATA[一套适合开发者和 AI 写作工作流的博客模板。]]></description><link>https://www.myls.top/posts/2026-03-28-hello-vitepress-tailwind</link><guid isPermaLink="true">https://www.myls.top/posts/2026-03-28-hello-vitepress-tailwind</guid><category><![CDATA[VitePress]]></category><category><![CDATA[TailwindCSS]]></category><category><![CDATA[Codex]]></category><pubDate>Sat, 28 Mar 2026 00:00:00 GMT</pubDate><content:encoded><![CDATA[<h1 id="用-vitepress-tailwind-搭一个更适合-ai-的博客" tabindex="-1">用 VitePress + Tailwind 搭一个更适合 AI 的博客 <a class="header-anchor" href="#用-vitepress-tailwind-搭一个更适合-ai-的博客" aria-label="Permalink to “用 VitePress + Tailwind 搭一个更适合 AI 的博客”">&#8203;</a></h1>
<h2 id="为什么不是-notionnext" tabindex="-1">为什么不是 NotionNext <a class="header-anchor" href="#为什么不是-notionnext" aria-label="Permalink to “为什么不是 NotionNext”">&#8203;</a></h2>
<p>NotionNext 更像内容同步方案，不像源码优先方案。</p>
<h2 id="为什么是-vitepress" tabindex="-1">为什么是 VitePress <a class="header-anchor" href="#为什么是-vitepress" aria-label="Permalink to “为什么是 VitePress”">&#8203;</a></h2>
<p>因为它对 Markdown 和 Git 工作流更友好，也更容易让 AI 直接修改文件。</p>
<h2 id="tailwind-在这里的作用" tabindex="-1">Tailwind 在这里的作用 <a class="header-anchor" href="#tailwind-在这里的作用" aria-label="Permalink to “Tailwind 在这里的作用”">&#8203;</a></h2>
<p>它不负责&quot;提供现成博客系统&quot;，它负责让页面更容易做出你想要的视觉风格。</p>
]]></content:encoded></item><item><title><![CDATA[我为什么放弃 NotionNext，转向 Obsidian + Codex + VitePress + ESA]]></title><description><![CDATA[一套更适合 AI 时代开发者的博客写作与发布方案：Obsidian 写作、Codex 辅助、VitePress 构建、ESA 部署。]]></description><link>https://www.myls.top/posts/2026-03-28-obsidian-codex-vitepress-esa-blog</link><guid isPermaLink="true">https://www.myls.top/posts/2026-03-28-obsidian-codex-vitepress-esa-blog</guid><category><![CDATA[Obsidian]]></category><category><![CDATA[Codex]]></category><category><![CDATA[VitePress]]></category><category><![CDATA[TailwindCSS]]></category><category><![CDATA[博客]]></category><pubDate>Sat, 28 Mar 2026 00:00:00 GMT</pubDate><content:encoded><![CDATA[<h1 id="我为什么放弃-notionnext-转向-obsidian-codex-vitepress-esa" tabindex="-1">我为什么放弃 NotionNext，转向 Obsidian + Codex + VitePress + ESA <a class="header-anchor" href="#我为什么放弃-notionnext-转向-obsidian-codex-vitepress-esa" aria-label="Permalink to “我为什么放弃 NotionNext，转向 Obsidian + Codex + VitePress + ESA”">&#8203;</a></h1>
<p>过去一段时间，我一直在用 NotionNext 写博客。
它并不是不能用，但越往后用，越能感觉到一个问题：</p>
<p><strong>它更像&quot;内容同步方案&quot;，而不是&quot;源码优先的博客方案&quot;。</strong></p>
<p>尤其是现在已经进入 AI 编码时代，像 Codex 这样的工具真正发挥价值的前提，不是内容放在哪里都行，而是：</p>
<ul>
<li>内容最好是纯文本</li>
<li>结构最好稳定</li>
<li>AI 能直接批量改</li>
<li>发布链路尽量短</li>
<li>工程化能力要足够强</li>
</ul>
<p>从这个角度看，NotionNext 并不算最合适的选择。
所以我最后把博客方案切换成了：</p>
<blockquote>
<p><strong>Obsidian 写作 + Codex 辅助 + VitePress 构建 + 阿里云 ESA 部署</strong></p>
</blockquote>
<p>这套组合用下来，最大的感受就是：<strong>AI 终于能真正参与博客生产，而不是只能帮我写一段文案。</strong></p>
<hr>
<h2 id="为什么我觉得-notionnext-不够顺手" tabindex="-1">为什么我觉得 NotionNext 不够顺手 <a class="header-anchor" href="#为什么我觉得-notionnext-不够顺手" aria-label="Permalink to “为什么我觉得 NotionNext 不够顺手”">&#8203;</a></h2>
<p>NotionNext 的优点很明显：</p>
<ul>
<li>上手快</li>
<li>Notion 写作体验还不错</li>
<li>对非技术用户友好</li>
<li>主题和现成方案很多</li>
</ul>
<p>但它的问题也很明显。</p>
<h3 id="_1-内容不是-真正的源码资产" tabindex="-1">1. 内容不是&quot;真正的源码资产&quot; <a class="header-anchor" href="#_1-内容不是-真正的源码资产" aria-label="Permalink to “1. 内容不是&quot;真正的源码资产&quot;”">&#8203;</a></h3>
<p>虽然最终博客会生成静态页面，但平时写作的内容核心还是在 Notion 里。
这意味着：</p>
<ul>
<li>内容结构依赖 Notion block</li>
<li>迁移成本不算低</li>
<li>AI 很难精确修改</li>
<li>批量处理文章不方便</li>
</ul>
<p>对于普通写作者，这可能不是大问题。
但对于开发者来说，这会越来越别扭。</p>
<p>因为开发者真正想要的是：</p>
<blockquote>
<p><strong>文章就是 Markdown 文件，文件就是资产，Git 就是版本历史。</strong></p>
</blockquote>
<hr>
<h3 id="_2-ai-不适合改-block-型内容" tabindex="-1">2. AI 不适合改 block 型内容 <a class="header-anchor" href="#_2-ai-不适合改-block-型内容" aria-label="Permalink to “2. AI 不适合改 block 型内容”">&#8203;</a></h3>
<p>现在很多人都在说 AI 写作很强，但这句话有个前提：</p>
<blockquote>
<p><strong>AI 最擅长处理的是&quot;结构清晰、纯文本、规则明确&quot;的内容。</strong></p>
</blockquote>
<p>Markdown 就非常符合这个特点。</p>
<p>Notion 的 block 结构更适合&quot;编辑器体验&quot;，但不适合 AI 精细化地做这些事：</p>
<ul>
<li>批量补 frontmatter</li>
<li>统一 tags</li>
<li>统一标题层级</li>
<li>修复图片路径</li>
<li>自动生成归档页</li>
<li>自动生成 RSS</li>
<li>自动做 SEO 优化</li>
</ul>
<p>这些操作一旦换成 Markdown 文件，Codex 的发挥空间会大很多。</p>
<hr>
<h3 id="_3-发布链路长-调试不够直接" tabindex="-1">3. 发布链路长，调试不够直接 <a class="header-anchor" href="#_3-发布链路长-调试不够直接" aria-label="Permalink to “3. 发布链路长，调试不够直接”">&#8203;</a></h3>
<p>NotionNext 的工作流通常会变成这样：</p>
<div class="language-text"><button title="Copy Code" class="copy"></button><span class="lang">text</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span>Notion</span></span>
<span class="line"><span>→ API 拉取内容</span></span>
<span class="line"><span>→ 转换</span></span>
<span class="line"><span>→ 构建</span></span>
<span class="line"><span>→ 发布</span></span></code></pre>
</div><p>这个链路不是不能接受，但一旦哪一步有问题，排查起来就不够&quot;源码直觉&quot;。</p>
<p>而我更喜欢的是：</p>
<div class="language-text"><button title="Copy Code" class="copy"></button><span class="lang">text</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span>Markdown</span></span>
<span class="line"><span>→ Git</span></span>
<span class="line"><span>→ 构建</span></span>
<span class="line"><span>→ 发布</span></span></code></pre>
</div><p>简单、明确、可控。</p>
<hr>
<h2 id="我最后选择的博客方案" tabindex="-1">我最后选择的博客方案 <a class="header-anchor" href="#我最后选择的博客方案" aria-label="Permalink to “我最后选择的博客方案”">&#8203;</a></h2>
<p>最后我定下来的方案是：</p>
<div class="language-text"><button title="Copy Code" class="copy"></button><span class="lang">text</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span>Obsidian（写作）</span></span>
<span class="line"><span>+ Codex（生成、优化、批量处理）</span></span>
<span class="line"><span>+ VitePress（站点构建）</span></span>
<span class="line"><span>+ TailwindCSS（界面样式）</span></span>
<span class="line"><span>+ 阿里云 ESA（部署）</span></span></code></pre>
</div><p>这套方案不是为了&quot;追新&quot;，而是因为它刚好解决了我最在意的几个问题：</p>
<ul>
<li>写作要舒服</li>
<li>AI 要能参与</li>
<li>页面要能改</li>
<li>部署要简单</li>
<li>后期要能持续扩展</li>
</ul>
<hr>
<h2 id="为什么是-obsidian-而不是继续用-notion" tabindex="-1">为什么是 Obsidian，而不是继续用 Notion <a class="header-anchor" href="#为什么是-obsidian-而不是继续用-notion" aria-label="Permalink to “为什么是 Obsidian，而不是继续用 Notion”">&#8203;</a></h2>
<p>我现在更愿意把 Obsidian 理解成：</p>
<blockquote>
<p><strong>本地 Markdown 写作 IDE</strong></p>
</blockquote>
<p>它最适合的地方，不是&quot;知识管理有多强&quot;，而是它天然兼容 Git 和文本工作流。</p>
<h3 id="对我来说-obsidian-有几个好处" tabindex="-1">对我来说，Obsidian 有几个好处 <a class="header-anchor" href="#对我来说-obsidian-有几个好处" aria-label="Permalink to “对我来说，Obsidian 有几个好处”">&#8203;</a></h3>
<h4 id="_1-写的就是-markdown-源文件" tabindex="-1">1. 写的就是 Markdown 源文件 <a class="header-anchor" href="#_1-写的就是-markdown-源文件" aria-label="Permalink to “1. 写的就是 Markdown 源文件”">&#8203;</a></h4>
<p>这一点特别重要。</p>
<p>文章不是&quot;同步出来的结果&quot;，而是从一开始就是博客源码的一部分。</p>
<h4 id="_2-本地写作速度快" tabindex="-1">2. 本地写作速度快 <a class="header-anchor" href="#_2-本地写作速度快" aria-label="Permalink to “2. 本地写作速度快”">&#8203;</a></h4>
<p>没有网络依赖，没有 block 层层嵌套，也没有复杂的内容同步。</p>
<h4 id="_3-和-ai-配合更自然" tabindex="-1">3. 和 AI 配合更自然 <a class="header-anchor" href="#_3-和-ai-配合更自然" aria-label="Permalink to “3. 和 AI 配合更自然”">&#8203;</a></h4>
<p>我可以直接让 Codex：</p>
<ul>
<li>帮我扩写大纲</li>
<li>帮我补 frontmatter</li>
<li>帮我统一格式</li>
<li>批量扫描 <code>docs/posts/*.md</code></li>
<li>自动生成标签页、分类页、RSS</li>
</ul>
<p>这一套放在 Notion 里会非常拧巴，放在 Obsidian + Markdown 里就非常顺。</p>
<hr>
<h2 id="为什么是-vitepress-而不是其他博客框架" tabindex="-1">为什么是 VitePress，而不是其他博客框架 <a class="header-anchor" href="#为什么是-vitepress-而不是其他博客框架" aria-label="Permalink to “为什么是 VitePress，而不是其他博客框架”">&#8203;</a></h2>
<p>我不是没看过别的方案，比如 Astro、Rspress、Docusaurus。
但最后还是选了 VitePress，原因很简单：</p>
<blockquote>
<p><strong>它是我现阶段最稳、最轻、最适合 AI 改造的方案。</strong></p>
</blockquote>
<h3 id="vitepress-最适合我的几个点" tabindex="-1">VitePress 最适合我的几个点 <a class="header-anchor" href="#vitepress-最适合我的几个点" aria-label="Permalink to “VitePress 最适合我的几个点”">&#8203;</a></h3>
<h4 id="_1-markdown-驱动-非常适合博客" tabindex="-1">1. Markdown 驱动，非常适合博客 <a class="header-anchor" href="#_1-markdown-驱动-非常适合博客" aria-label="Permalink to “1. Markdown 驱动，非常适合博客”">&#8203;</a></h4>
<p>文章天然就是 Markdown，不需要额外心智负担。</p>
<h4 id="_2-上手快" tabindex="-1">2. 上手快 <a class="header-anchor" href="#_2-上手快" aria-label="Permalink to “2. 上手快”">&#8203;</a></h4>
<p>你不需要一上来就进入完整前端框架开发状态。
配置和目录结构都比较轻。</p>
<h4 id="_3-支持-vue-组件嵌入-markdown" tabindex="-1">3. 支持 Vue 组件嵌入 Markdown <a class="header-anchor" href="#_3-支持-vue-组件嵌入-markdown" aria-label="Permalink to “3. 支持 Vue 组件嵌入 Markdown”">&#8203;</a></h4>
<p>这点很关键。
它意味着首页、文章列表、标签页这些地方，我可以：</p>
<ul>
<li>继续写 Markdown</li>
<li>但在需要的时候插入 Vue 组件</li>
</ul>
<p>这让博客不会&quot;死板&quot;，又不至于太重。</p>
<h4 id="_4-ai-很容易理解和修改" tabindex="-1">4. AI 很容易理解和修改 <a class="header-anchor" href="#_4-ai-很容易理解和修改" aria-label="Permalink to “4. AI 很容易理解和修改”">&#8203;</a></h4>
<p>VitePress 的项目结构通常很清晰：</p>
<div class="language-text"><button title="Copy Code" class="copy"></button><span class="lang">text</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span>docs/</span></span>
<span class="line"><span>  .vitepress/</span></span>
<span class="line"><span>  posts/</span></span>
<span class="line"><span>  index.md</span></span>
<span class="line"><span>  about.md</span></span></code></pre>
</div><p>Codex 非常容易理解这种目录结构，也很适合做批量修改。</p>
<hr>
<h2 id="为什么还要加-tailwindcss" tabindex="-1">为什么还要加 TailwindCSS <a class="header-anchor" href="#为什么还要加-tailwindcss" aria-label="Permalink to “为什么还要加 TailwindCSS”">&#8203;</a></h2>
<p>VitePress 默认主题是够用的，但如果你想把博客做得更像&quot;自己的站&quot;，就需要做一层样式增强。</p>
<p>我最后没有选 Element 这种组件库，而是用 TailwindCSS，原因也很明确：</p>
<blockquote>
<p><strong>博客站的核心需求是&quot;样式定制&quot;，不是&quot;重型业务组件&quot;。</strong></p>
</blockquote>
<p>博客真正需要的是：</p>
<ul>
<li>卡片列表</li>
<li>Hero 区</li>
<li>标签样式</li>
<li>分类区块</li>
<li>深色模式兼容</li>
<li>内容页细节优化</li>
</ul>
<p>这些事情，TailwindCSS 比组件库更灵活，也更适合 AI 生成和修改。</p>
<p>对 Codex 来说，下面这种代码是很好处理的：</p>
<div class="language-html"><button title="Copy Code" class="copy"></button><span class="lang">html</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">&#x3C;</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">div</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> class</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"rounded-2xl border bg-white p-5 shadow-sm dark:bg-slate-900"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">></span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  ...</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">&#x3C;/</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">div</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">></span></span></code></pre>
</div><p>它比&quot;套一层组件库 API 再二次改样式&quot;更直接。</p>
<hr>
<h2 id="这套方案里-codex-到底解决了什么问题" tabindex="-1">这套方案里，Codex 到底解决了什么问题 <a class="header-anchor" href="#这套方案里-codex-到底解决了什么问题" aria-label="Permalink to “这套方案里，Codex 到底解决了什么问题”">&#8203;</a></h2>
<p>很多人说 AI 可以写博客，但我现在更在意的是：</p>
<blockquote>
<p><strong>AI 能不能参与整个博客工程，而不是只写段正文。</strong></p>
</blockquote>
<p>在这套方案里，Codex 最有价值的地方，不是&quot;帮我凭空写一篇文章&quot;，而是能真正承担这些工作：</p>
<h3 id="_1-生成文章初稿" tabindex="-1">1. 生成文章初稿 <a class="header-anchor" href="#_1-生成文章初稿" aria-label="Permalink to “1. 生成文章初稿”">&#8203;</a></h3>
<p>我给一个主题和结构，它可以先出完整 Markdown。</p>
<h3 id="_2-批量补-frontmatter" tabindex="-1">2. 批量补 frontmatter <a class="header-anchor" href="#_2-批量补-frontmatter" aria-label="Permalink to “2. 批量补 frontmatter”">&#8203;</a></h3>
<p>比如统一补：</p>
<ul>
<li><code>title</code></li>
<li><code>description</code></li>
<li><code>tags</code></li>
<li><code>category</code></li>
<li><code>draft</code></li>
</ul>
<h3 id="_3-改博客模板" tabindex="-1">3. 改博客模板 <a class="header-anchor" href="#_3-改博客模板" aria-label="Permalink to “3. 改博客模板”">&#8203;</a></h3>
<p>比如直接让它：</p>
<ul>
<li>增加标签页</li>
<li>增加分类页</li>
<li>增加 RSS</li>
<li>增加评论系统</li>
<li>增加搜索</li>
<li>优化首页布局</li>
</ul>
<h3 id="_4-批量整理历史文章" tabindex="-1">4. 批量整理历史文章 <a class="header-anchor" href="#_4-批量整理历史文章" aria-label="Permalink to “4. 批量整理历史文章”">&#8203;</a></h3>
<p>像这些机械活，AI 非常适合：</p>
<ul>
<li>统一标题层级</li>
<li>检查文章摘要</li>
<li>修复路径</li>
<li>过滤草稿</li>
<li>归类标签</li>
</ul>
<p>所以我越来越觉得，AI 对博客最大的价值，不是&quot;代写&quot;，而是：</p>
<blockquote>
<p><strong>把博客从&quot;手工维护&quot;变成&quot;可工程化维护&quot;。</strong></p>
</blockquote>
<hr>
<h2 id="我现在的博客项目长什么样" tabindex="-1">我现在的博客项目长什么样 <a class="header-anchor" href="#我现在的博客项目长什么样" aria-label="Permalink to “我现在的博客项目长什么样”">&#8203;</a></h2>
<p>我现在更倾向于这样的结构：</p>
<div class="language-text"><button title="Copy Code" class="copy"></button><span class="lang">text</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span>blog/</span></span>
<span class="line"><span>├─ docs/</span></span>
<span class="line"><span>│  ├─ .vitepress/</span></span>
<span class="line"><span>│  │  ├─ config.mts</span></span>
<span class="line"><span>│  │  ├─ data/</span></span>
<span class="line"><span>│  │  │  ├─ posts.data.ts</span></span>
<span class="line"><span>│  │  │  ├─ tags.data.ts</span></span>
<span class="line"><span>│  │  │  └─ categories.data.ts</span></span>
<span class="line"><span>│  │  └─ theme/</span></span>
<span class="line"><span>│  │     ├─ index.ts</span></span>
<span class="line"><span>│  │     ├─ style.css</span></span>
<span class="line"><span>│  │     └─ components/</span></span>
<span class="line"><span>│  ├─ index.md</span></span>
<span class="line"><span>│  ├─ about.md</span></span>
<span class="line"><span>│  ├─ posts/</span></span>
<span class="line"><span>│  ├─ tags/</span></span>
<span class="line"><span>│  └─ categories/</span></span>
<span class="line"><span>├─ scripts/</span></span>
<span class="line"><span>│  └─ gen-rss.mjs</span></span>
<span class="line"><span>├─ package.json</span></span>
<span class="line"><span>└─ esa.jsonc</span></span></code></pre>
</div><p>这个结构最大的好处就是：</p>
<ul>
<li>文章层很清晰</li>
<li>主题层很清晰</li>
<li>数据层很清晰</li>
<li>构建脚本很清晰</li>
</ul>
<p>不管是我自己维护，还是让 Codex 介入，都不容易乱。</p>
<hr>
<h2 id="为什么部署选阿里云-esa" tabindex="-1">为什么部署选阿里云 ESA <a class="header-anchor" href="#为什么部署选阿里云-esa" aria-label="Permalink to “为什么部署选阿里云 ESA”">&#8203;</a></h2>
<p>部署这一层，我最后更倾向于选边缘静态托管，而不是继续折腾一堆中间环节。</p>
<p>VitePress 的产物本质上就是静态文件：</p>
<div class="language-text"><button title="Copy Code" class="copy"></button><span class="lang">text</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span>docs/.vitepress/dist</span></span></code></pre>
</div><p>这意味着它非常适合直接部署到边缘 Pages 平台。</p>
<p>我现在更喜欢的链路是：</p>
<div class="language-text"><button title="Copy Code" class="copy"></button><span class="lang">text</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span>Git Push</span></span>
<span class="line"><span>→ ESA 自动构建</span></span>
<span class="line"><span>→ 边缘节点发布</span></span>
<span class="line"><span>→ 域名访问</span></span></code></pre>
</div><p>这样做的好处是：</p>
<ul>
<li>不需要单独维护服务器</li>
<li>不需要自己手工上传静态文件</li>
<li>发布流程短</li>
<li>静态站点和 CDN 模式天然契合</li>
</ul>
<p>这和我想要的博客形态是匹配的：</p>
<blockquote>
<p><strong>博客应该轻、快、稳定，而不是再养一个服务端系统。</strong></p>
</blockquote>
<hr>
<h2 id="这套方案的真正优势-不是-新-而是-顺" tabindex="-1">这套方案的真正优势，不是&quot;新&quot;，而是&quot;顺&quot; <a class="header-anchor" href="#这套方案的真正优势-不是-新-而是-顺" aria-label="Permalink to “这套方案的真正优势，不是&quot;新&quot;，而是&quot;顺&quot;”">&#8203;</a></h2>
<p>回头看这次切换，我觉得最大的收获不是换了工具，而是整个博客链路终于顺了。</p>
<p>以前更像是：</p>
<ul>
<li>我在内容平台里写</li>
<li>再想办法同步成博客</li>
<li>AI 只能帮一点点局部内容</li>
</ul>
<p>现在变成了：</p>
<ul>
<li>我在 Obsidian 里直接写 Markdown</li>
<li>Codex 可以直接读写文章和站点代码</li>
<li>VitePress 直接构建</li>
<li>ESA 直接发布</li>
</ul>
<p>整条链路都更贴近&quot;开发者工作流&quot;。</p>
<p>这时候 AI 才不再是一个&quot;会聊天的辅助工具&quot;，而是真的成了项目协作者。</p>
<hr>
<h2 id="适合谁用这套方案" tabindex="-1">适合谁用这套方案 <a class="header-anchor" href="#适合谁用这套方案" aria-label="Permalink to “适合谁用这套方案”">&#8203;</a></h2>
<p>如果你符合下面这些情况，这套方案大概率会比 NotionNext 更适合你：</p>
<ul>
<li>你本身就是开发者</li>
<li>你愿意把博客当成代码仓库维护</li>
<li>你希望 AI 能参与批量处理和工程化工作</li>
<li>你想要更高的页面可控性</li>
<li>你不想让内容绑定在某个平台结构里</li>
</ul>
<p>反过来说，如果你更看重的是：</p>
<ul>
<li>零门槛</li>
<li>完全不碰代码</li>
<li>团队协作式文档编辑</li>
<li>所见即所得编辑体验</li>
</ul>
<p>那 Notion 系方案依然有它的合理性。</p>
<p>所以这不是谁一定更高级，而是：</p>
<blockquote>
<p><strong>你到底是把博客当&quot;内容平台&quot;，还是当&quot;可维护的项目&quot;。</strong></p>
</blockquote>
<hr>
<h2 id="我接下来会继续补的东西" tabindex="-1">我接下来会继续补的东西 <a class="header-anchor" href="#我接下来会继续补的东西" aria-label="Permalink to “我接下来会继续补的东西”">&#8203;</a></h2>
<p>目前这套方案已经能满足日常写作和发布，但还有几个方向很值得继续补：</p>
<h3 id="_1-pagefind-搜索" tabindex="-1">1. Pagefind 搜索 <a class="header-anchor" href="#_1-pagefind-搜索" aria-label="Permalink to “1. Pagefind 搜索”">&#8203;</a></h3>
<p>让博客具备静态全文搜索能力。</p>
<h3 id="_2-sitemap-和-seo-细节" tabindex="-1">2. sitemap 和 SEO 细节 <a class="header-anchor" href="#_2-sitemap-和-seo-细节" aria-label="Permalink to “2. sitemap 和 SEO 细节”">&#8203;</a></h3>
<p>方便搜索引擎收录和社交平台展示。</p>
<h3 id="_3-og-图自动生成" tabindex="-1">3. OG 图自动生成 <a class="header-anchor" href="#_3-og-图自动生成" aria-label="Permalink to “3. OG 图自动生成”">&#8203;</a></h3>
<p>让每篇文章都能有更统一的分享封面。</p>
<h3 id="_4-obsidian-模板-codex-prompt-模板" tabindex="-1">4. Obsidian 模板 + Codex Prompt 模板 <a class="header-anchor" href="#_4-obsidian-模板-codex-prompt-模板" aria-label="Permalink to “4. Obsidian 模板 + Codex Prompt 模板”">&#8203;</a></h3>
<p>把&quot;写一篇博客&quot;进一步流程化。</p>
<p>这些东西一旦继续补齐，这套博客就不只是&quot;能用&quot;，而是真正能长期维护。</p>
<hr>
<h2 id="最后的结论" tabindex="-1">最后的结论 <a class="header-anchor" href="#最后的结论" aria-label="Permalink to “最后的结论”">&#8203;</a></h2>
<p>我不是单纯因为 NotionNext 不好，才转向这套方案。</p>
<p>更准确地说，是因为当我开始真正把 AI 纳入日常写作和站点维护之后，我发现：</p>
<blockquote>
<p><strong>Markdown、Git、静态站点、可脚本化，这些东西的重要性一下子被放大了。</strong></p>
</blockquote>
<p>所以最后我选择了：</p>
<ul>
<li><strong>Obsidian</strong> 负责写作</li>
<li><strong>Codex</strong> 负责生成、整理、改造</li>
<li><strong>VitePress</strong> 负责构建</li>
<li><strong>TailwindCSS</strong> 负责样式</li>
<li><strong>ESA</strong> 负责部署</li>
</ul>
<p>这套方案未必适合所有人，但对一个希望把博客做成&quot;长期项目&quot;的开发者来说，它确实比 NotionNext 更舒服，也更适合 AI 时代。</p>
<p>如果你也正在折腾博客，而且已经开始用 Codex、Claude Code 这类工具，那我很建议你试一次：</p>
<p><strong>把博客彻底 Markdown 化、Git 化、工程化。</strong></p>
<p>你会发现，整个写作和发布过程都会轻很多。</p>
]]></content:encoded></item><item><title><![CDATA[中兴5228F解决IPV6问题]]></title><description><![CDATA[中兴5228F交换机配置IPv6后设备无法获取地址的解决方法。]]></description><link>https://www.myls.top/posts/2025-02-01-zte-5228f-ipv6</link><guid isPermaLink="true">https://www.myls.top/posts/2025-02-01-zte-5228f-ipv6</guid><category><![CDATA[中兴]]></category><category><![CDATA[IPv6]]></category><category><![CDATA[交换机]]></category><category><![CDATA[网络]]></category><pubDate>Sat, 01 Feb 2025 00:00:00 GMT</pubDate><content:encoded><![CDATA[<h1 id="中兴5228f解决ipv6问题" tabindex="-1">中兴5228F解决IPV6问题 <a class="header-anchor" href="#中兴5228f解决ipv6问题" aria-label="Permalink to “中兴5228F解决IPV6问题”">&#8203;</a></h1>
<p>最近配了IPV6，发现中兴5228F上的设备无法获取IPV6地址，网上搜刮了两条指令，解决IPV6无法使用问题。</p>
<div class="language-"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span>ZXR10(config)#ipv6 nd-snooping link-local enable</span></span>
<span class="line"><span></span></span>
<span class="line"><span>ZXR10(config)#ipv6 nd-snooping global enable</span></span></code></pre>
</div><p>配置完记得输入 <code>write</code> 保存</p>
<hr>
<h2 id="参考" tabindex="-1">参考 <a class="header-anchor" href="#参考" aria-label="Permalink to “参考”">&#8203;</a></h2>
<p>设备的用户手册。根据设备背面的说明，上 ZTE 的 support 网站，用提供的用户名密码登录，然后下载对应的用户手册/说明书。<code>.zed</code> 格式的，需要额外再下载<a href="https://support.zte.com.cn/support/DownloadZTEeReader.aspx" target="_blank" rel="noreferrer">中兴e读</a>来进行阅读。（其实 <code>.zed</code> 解压缩出来就是 HTML 文档，应急时可以解压后打开阅读。小技巧，从内部人士获知）</p>
<ul>
<li>ZXR10 5200F系列（V3.05.10）全千兆智能交换机用户手册文档包：<a href="https://support.zte.com.cn/support/docCenter/ItemdocumentList.aspx?sid=179665&amp;id=30648281" target="_blank" rel="noreferrer">https://support.zte.com.cn/support/docCenter/ItemdocumentList.aspx?sid=179665&amp;id=30648281</a></li>
<li>中兴e读下载：<a href="https://support.zte.com.cn/support/DownloadZTEeReader.aspx" target="_blank" rel="noreferrer">https://support.zte.com.cn/support/DownloadZTEeReader.aspx</a></li>
</ul>
<p>网站的登录用户名密码贴在交换机的背面（<code>switchzte</code> / <code>Switch_99895960</code>）</p>
]]></content:encoded></item><item><title><![CDATA[PlayCover和金铲铲之战下载地址分享]]></title><description><![CDATA[PlayCover和金铲铲之战在Mac上的下载地址分享。]]></description><link>https://www.myls.top/posts/2024-08-22-playcover-jinchantang</link><guid isPermaLink="true">https://www.myls.top/posts/2024-08-22-playcover-jinchantang</guid><category><![CDATA[PlayCover]]></category><category><![CDATA[macOS]]></category><category><![CDATA[iOS应用]]></category><category><![CDATA[游戏]]></category><pubDate>Thu, 22 Aug 2024 00:00:00 GMT</pubDate><content:encoded><![CDATA[<h1 id="playcover和金铲铲之战下载地址分享" tabindex="-1">PlayCover和金铲铲之战下载地址分享 <a class="header-anchor" href="#playcover和金铲铲之战下载地址分享" aria-label="Permalink to “PlayCover和金铲铲之战下载地址分享”">&#8203;</a></h1>
<h2 id="playcover" tabindex="-1">PlayCover <a class="header-anchor" href="#playcover" aria-label="Permalink to “PlayCover”">&#8203;</a></h2>
<p>PlayCover的Github页面地址：<a href="https://github.com/PlayCover/PlayCover" target="_blank" rel="noreferrer">https://github.com/PlayCover/PlayCover</a></p>
<p>百度网盘下载地址：</p>
<p>通过网盘分享的文件：金铲铲之战
链接: <a href="https://pan.baidu.com/s/1HXbFBnVDLBUdMwg1MViy8w?pwd=tdkv" target="_blank" rel="noreferrer">https://pan.baidu.com/s/1HXbFBnVDLBUdMwg1MViy8w?pwd=tdkv</a> 提取码: tdkv</p>
<h2 id="金铲铲之战" tabindex="-1">金铲铲之战 <a class="header-anchor" href="#金铲铲之战" aria-label="Permalink to “金铲铲之战”">&#8203;</a></h2>
<p>金铲铲之战IPA文件下载地址：<a href="https://decrypt.day/app/id1478101301" target="_blank" rel="noreferrer">https://decrypt.day/app/id1478101301</a></p>
<p>百度网盘下载地址（2025年06月19日更新）：</p>
<p>通过网盘分享的文件：com.tencent.jkchess_1.10.26_1108_und3fined.ipa
链接: <a href="https://pan.baidu.com/s/15l9uzYFsUUUsgigxWMMzcA?pwd=61iv" target="_blank" rel="noreferrer">https://pan.baidu.com/s/15l9uzYFsUUUsgigxWMMzcA?pwd=61iv</a> 提取码: 61iv</p>
]]></content:encoded></item></channel></rss>