<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="atom.xsl"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <id>https://binggg.github.io/blog</id>
    <title>Booker Zhao Blog</title>
    <updated>2026-07-18T00:00:00.000Z</updated>
    <generator>https://github.com/jpmonette/feed</generator>
    <link rel="alternate" href="https://binggg.github.io/blog"/>
    <subtitle>Booker Zhao Blog</subtitle>
    <icon>https://binggg.github.io/img/favicon.ico</icon>
    <entry>
        <title type="html"><![CDATA[Open Plugins：AI 编程助手的插件标准]]></title>
        <id>https://binggg.github.io/blog/2026/07/18/open-plugins-standard</id>
        <link href="https://binggg.github.io/blog/2026/07/18/open-plugins-standard"/>
        <updated>2026-07-18T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Vercel Labs 维护的开放标准——一个插件，七种工具，一次编写到处运行。从协议规范到 CloudBase MCP 改造实战，一文讲透。]]></summary>
        <content type="html"><![CDATA[<blockquote>
<p>一个插件标准，七个工具共用</p>
</blockquote>
<p><img decoding="async" loading="lazy" src="https://binggg.github.io/assets/images/cover-e264de029af45e36602de1e5b3abb4fd.png" width="1312" height="736" class="img_ev3q">
<em>图：Open Plugins 标准——装一个就能在七个工具里用</em></p>
<p>最近 AI 编程工具越来越多：Cursor、Claude Code、Codex、Grok Build……每个一套插件格式。然后冒出了个 <strong>Open Plugins</strong>。</p>
<p>它是 Vercel Labs 维护的一个开放标准。装一个插件，就能在七个工具里跑。</p>
<!-- -->
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="现状ai-编程工具的插件战国">现状：AI 编程工具的"插件战国"<a href="https://binggg.github.io/blog/2026/07/18/open-plugins-standard#%E7%8E%B0%E7%8A%B6ai-%E7%BC%96%E7%A8%8B%E5%B7%A5%E5%85%B7%E7%9A%84%E6%8F%92%E4%BB%B6%E6%88%98%E5%9B%BD" class="hash-link" aria-label="现状：AI 编程工具的&quot;插件战国&quot;的直接链接" title="现状：AI 编程工具的&quot;插件战国&quot;的直接链接" translate="no">​</a></h2>
<p>先说问题。</p>
<p><img decoding="async" loading="lazy" src="https://binggg.github.io/assets/images/plugin-fragmentation-6a7a8dde5b528e53002b92009a36fc4a.png" width="1312" height="736" class="img_ev3q">
<em>图：各工具各说各话，夹不到一起</em></p>
<p>假设你有一组很好用的 AI 编程辅助工具：</p>
<ul>
<li class="">一个代码审查 skill，每次提交前自动审查变更</li>
<li class="">一个 MCP 服务器，连接到公司的 API 文档</li>
<li class="">一个钩子脚本，保存文件时自动格式化</li>
</ul>
<p>在 Claude Code 里配一遍，换到 Cursor 又得重新配，换到 Codex 格式可能还不一样。这就像 npm 出现之前的 JavaScript——每个库有自己的模块格式，想复用就得手动折腾。</p>
<!-- -->
<p>Open Plugins 的目的就是终结这种割裂：<strong>定一套标准，所有工具共用</strong>。</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="npx-plugins怎么装">npx plugins：怎么装<a href="https://binggg.github.io/blog/2026/07/18/open-plugins-standard#npx-plugins%E6%80%8E%E4%B9%88%E8%A3%85" class="hash-link" aria-label="npx plugins：怎么装的直接链接" title="npx plugins：怎么装的直接链接" translate="no">​</a></h2>
<p>怎么用？一条命令：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain"># 从 GitHub 安装插件（短格式）</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">npx plugins add vercel/vercel-plugin</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># 完整 HTTPS URL</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">npx plugins add https://github.com/vercel/vercel-plugin</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># 从本地目录安装</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">npx plugins add ./my-plugin</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># 先看看有哪些组件，不实际安装</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">npx plugins discover owner/repo</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># 查看本地已检测到的工具</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">npx plugins targets</span><br></div></code></pre></div></div>
<p>这个 <code>plugins</code> 包（v1.3.4）就是 Open Plugins 生态的"安装器"。安装后的存储路径统一走 <code>.agents/plugins/</code>。</p>
<p>它的工作流程可以看作一条流水线：</p>
<!-- -->
<p>支持的安装 scope 分为三档：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">npx plugins add repo --scope user     # 用户级（~/.agents/plugins/）</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">npx plugins add repo --scope project  # 项目级（./.agents/plugins/）</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">npx plugins add repo --scope local    # 仅本地开发测试</span><br></div></code></pre></div></div>
<p>还可以指定安装到某个特定工具：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">npx plugins add owner/repo -t grok     # 只装到 Grok Build</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">npx plugins add owner/repo -t vscode   # 只装到 VS Code</span><br></div></code></pre></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="支持七种-ai-编程工具">支持七种 AI 编程工具<a href="https://binggg.github.io/blog/2026/07/18/open-plugins-standard#%E6%94%AF%E6%8C%81%E4%B8%83%E7%A7%8D-ai-%E7%BC%96%E7%A8%8B%E5%B7%A5%E5%85%B7" class="hash-link" aria-label="支持七种 AI 编程工具的直接链接" title="支持七种 AI 编程工具的直接链接" translate="no">​</a></h2>
<p><code>npx plugins targets</code> 会检测你机器上安装了哪些工具，然后自动安装到所有检测到的目标。</p>
<p><img decoding="async" loading="lazy" src="https://binggg.github.io/assets/images/plugin-7-tools-4af01d231da2c6f56b45c12dd70aab87.png" width="1312" height="736" class="img_ev3q">
<em>图：七种 AI 编程工具，一个插件标准全支持</em></p>
<p>不过，装完不等于每个组件都在所有工具里能用。这里有个关键认知——<strong>Open Plugin Spec v1 保证的只有两类组件：Skills 和 MCP</strong>。其他组件（Hooks、Commands、Agents）不在 v1 规范里，支不支持完全看宿主工具。</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">Spec v1 保证 → Skills + MCP（装完就能用）</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Spec v1 不保证 → Hooks / Commands / Agents（宿主不认识就忽略，不报错）</span><br></div></code></pre></div></div>
<p>来看看各工具的实际情况：</p>
<table><thead><tr><th>工具</th><th style="text-align:center">Skills</th><th style="text-align:center">MCP</th><th style="text-align:center">Hooks</th><th style="text-align:center">Agents</th><th style="text-align:center">Commands</th><th>备注</th></tr></thead><tbody><tr><td><strong>Claude Code</strong></td><td style="text-align:center">⭐ v1</td><td style="text-align:center">⭐ v1</td><td style="text-align:center">✅ 原生</td><td style="text-align:center">✅ 原生</td><td style="text-align:center">✅ 原生</td><td>最全面的宿主</td></tr><tr><td><strong>Cursor</strong></td><td style="text-align:center">⭐ v1</td><td style="text-align:center">⭐ v1</td><td style="text-align:center">✅</td><td style="text-align:center">❌</td><td style="text-align:center">❌</td><td></td></tr><tr><td><strong>Codex</strong></td><td style="text-align:center">⭐ v1</td><td style="text-align:center">⭐ v1</td><td style="text-align:center">✅</td><td style="text-align:center">✅</td><td style="text-align:center">✅</td><td></td></tr><tr><td><strong>Grok Build</strong></td><td style="text-align:center">⭐ v1</td><td style="text-align:center">⭐ v1</td><td style="text-align:center">✅</td><td style="text-align:center">❌</td><td style="text-align:center">❌</td><td></td></tr><tr><td><strong>Kimi Code</strong></td><td style="text-align:center">⭐ v1</td><td style="text-align:center">⭐ v1</td><td style="text-align:center">❌</td><td style="text-align:center">❌</td><td style="text-align:center">❌</td><td></td></tr><tr><td><strong>GitHub Copilot CLI</strong></td><td style="text-align:center">⭐ v1</td><td style="text-align:center">⭐ v1</td><td style="text-align:center">✅</td><td style="text-align:center">✅</td><td style="text-align:center">✅</td><td></td></tr><tr><td><strong>VS Code</strong></td><td style="text-align:center">⭐ v1</td><td style="text-align:center">⭐ v1</td><td style="text-align:center">❌</td><td style="text-align:center">❌</td><td style="text-align:center">❌</td><td>Preview</td></tr></tbody></table>
<blockquote>
<p>⭐ v1 = Spec v1 标准保证；✅ = 宿主额外支持；❌ = 不支持（宿主会静默忽略）</p>
</blockquote>
<p>关键要点：</p>
<ul>
<li class=""><strong>Skills + MCP 是跨 IDE 通用协议</strong>，装到哪个工具都能用——这是我们推荐 <code>npx plugins add</code> 的根本原因</li>
<li class=""><strong>Hooks 不是全员标配</strong>。Claude Code 和 Copilot CLI 支持最完整，VS Code 和 Kimi Code 就不认</li>
<li class="">Claude Code 通过原生 marketplace 机制支持最全（hooks + commands + agents），但那是宿主能力，不是 v1 标准</li>
<li class="">不支持 Hooks 的工具会静默忽略，不会报错，插件仍然能正常工作</li>
</ul>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="协议拆解">协议拆解<a href="https://binggg.github.io/blog/2026/07/18/open-plugins-standard#%E5%8D%8F%E8%AE%AE%E6%8B%86%E8%A7%A3" class="hash-link" aria-label="协议拆解的直接链接" title="协议拆解的直接链接" translate="no">​</a></h2>
<p>一个插件其实就是按约定结构放了一堆文件的目录。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="标准目录结构">标准目录结构<a href="https://binggg.github.io/blog/2026/07/18/open-plugins-standard#%E6%A0%87%E5%87%86%E7%9B%AE%E5%BD%95%E7%BB%93%E6%9E%84" class="hash-link" aria-label="标准目录结构的直接链接" title="标准目录结构的直接链接" translate="no">​</a></h3>
<!-- -->
<p>安装后的存储路径分两个 scope：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">~/.agents/plugins/          # 用户级</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">&lt;project&gt;/.agents/plugins/  # 项目级</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="pluginjson-清单文件">plugin.json 清单文件<a href="https://binggg.github.io/blog/2026/07/18/open-plugins-standard#pluginjson-%E6%B8%85%E5%8D%95%E6%96%87%E4%BB%B6" class="hash-link" aria-label="plugin.json 清单文件的直接链接" title="plugin.json 清单文件的直接链接" translate="no">​</a></h3>
<p>清单文件<strong>是可选的</strong>。如果省略，插件名称从目录名派生，组件只在默认位置发现。</p>
<p>如果提供，<code>name</code> 是<strong>唯一必填字段</strong>：</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"my-plugin"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"version"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"1.2.0"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"description"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"插件描述"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"author"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Author"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"email"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"author@example.com"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"homepage"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"https://example.com"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"repository"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"https://github.com/author/plugin"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"license"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"MIT"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"keywords"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"code-review"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"automation"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p><code>name</code> 的命名约束：1-64 字符，小写字母/数字/连字符/点号，字母数字开头结尾，禁止 <code>--</code> 或 <code>..</code>。✅ <code>deployment-tools</code>、<code>code-reviewer</code>、<code>prompts.chat</code> ❌ <code>My-Plugin</code>、<code>-tools</code>、<code>my--plugin</code></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="组件发现算法">组件发现算法<a href="https://binggg.github.io/blog/2026/07/18/open-plugins-standard#%E7%BB%84%E4%BB%B6%E5%8F%91%E7%8E%B0%E7%AE%97%E6%B3%95" class="hash-link" aria-label="组件发现算法的直接链接" title="组件发现算法的直接链接" translate="no">​</a></h3>
<p>这是协议最核心的部分。工具扫描插件的完整流程：</p>
<!-- -->
<p>插件的四步生命周期——从安装到激活：</p>
<p><img decoding="async" loading="lazy" src="https://binggg.github.io/assets/images/plugin-workflow-2be702241eb12779cd5adb85185b083a.png" width="1312" height="736" class="img_ev3q">
<em>图：插件的安装、发现、命名空间和激活流程</em></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="plugin_root-路径展开"><code>${PLUGIN_ROOT}</code> 路径展开<a href="https://binggg.github.io/blog/2026/07/18/open-plugins-standard#plugin_root-%E8%B7%AF%E5%BE%84%E5%B1%95%E5%BC%80" class="hash-link" aria-label="plugin_root-路径展开的直接链接" title="plugin_root-路径展开的直接链接" translate="no">​</a></h3>
<p>插件内的所有配置文件中都可以使用 <code>${PLUGIN_ROOT}</code>，工具加载时自动替换为插件根目录的绝对路径。这个机制让插件可以<strong>自包含</strong>——所有路径引用都相对于自身，装到任何位置都能工作。</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"mcpServers"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"db-server"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"command"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"${PLUGIN_ROOT}/servers/db-server"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"args"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"--config"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"${PLUGIN_ROOT}/config.json"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"env"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token property" style="color:#36acaa">"DB_PATH"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"${PLUGIN_ROOT}/data"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p>扩展规则：递归展开，嵌套引用也会被替换；逃逸检查保证路径不超出插件目录。</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="实战把-cloudbase-mcp-改成-open-plugins-插件">实战：把 CloudBase MCP 改成 Open Plugins 插件<a href="https://binggg.github.io/blog/2026/07/18/open-plugins-standard#%E5%AE%9E%E6%88%98%E6%8A%8A-cloudbase-mcp-%E6%94%B9%E6%88%90-open-plugins-%E6%8F%92%E4%BB%B6" class="hash-link" aria-label="实战：把 CloudBase MCP 改成 Open Plugins 插件的直接链接" title="实战：把 CloudBase MCP 改成 Open Plugins 插件的直接链接" translate="no">​</a></h2>
<p>前面讲了一堆理论，来点真实的。</p>
<p>我们最近在维护一个叫 <strong><a href="https://github.com/TencentCloudBase/CloudBase-MCP" target="_blank" rel="noopener noreferrer" class="">CloudBase MCP</a></strong> 的开源项目，给 AI 编程工具提供云接入能力——AI 模型调用、NoSQL/PostgreSQL 数据库、云函数、云托管、云存储、微信小程序对接等等。以前手动配 <code>.claude-plugin/</code>、<code>.codex-plugin/</code>、<code>.mcp.json</code>，每个工具一个配置，维护起来头大。这次正好借 Open Plugins 标准的东风，做了一次改造。</p>
<p>完整改造 PR：<a href="https://github.com/TencentCloudBase/CloudBase-MCP/pull/808" target="_blank" rel="noopener noreferrer" class="">TencentCloudBase/CloudBase-MCP#808</a>（+818 / -34）</p>
<blockquote>
<p><img decoding="async" loading="lazy" src="https://binggg.github.io/assets/images/plugin-pr808-e0ca91754dba9fb0bc5cd223d9173e41.png" width="1312" height="736" class="img_ev3q">
<em>图：PR #808 改造前后对比——从 vendor 专属格式到通用插件标准</em></p>
</blockquote>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="改造前后对比">改造前后对比<a href="https://binggg.github.io/blog/2026/07/18/open-plugins-standard#%E6%94%B9%E9%80%A0%E5%89%8D%E5%90%8E%E5%AF%B9%E6%AF%94" class="hash-link" aria-label="改造前后对比的直接链接" title="改造前后对比的直接链接" translate="no">​</a></h3>
<!-- -->
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="pluginjson">plugin.json<a href="https://binggg.github.io/blog/2026/07/18/open-plugins-standard#pluginjson" class="hash-link" aria-label="plugin.json的直接链接" title="plugin.json的直接链接" translate="no">​</a></h3>
<p>按照 Open Plugins 规范 v1.0.0 的 closed schema，只保留规范允许的元数据字段：</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"$schema"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"https://open-plugins.com/schemas/1.0.0/plugin.schema.json"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"cloudbase"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"version"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"0.2.0"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"description"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Tencent CloudBase — AI models, authentication, NoSQL/PostgreSQL databases, cloud functions, cloud storage, CloudRun backend services, and WeChat Mini Program integration."</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"author"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Tencent CloudBase"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"url"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"https://cloudbase.net"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"homepage"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"https://github.com/TencentCloudBase/cloudbase-mcp"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"license"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"MIT"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"keywords"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token string" style="color:#e3116c">"cloudbase"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"tencent-cloud"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"baas"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token string" style="color:#e3116c">"ai-model"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"database"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"cloud-function"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token string" style="color:#e3116c">"authentication"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"storage"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"cloudrun"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="mcpjson">mcp.json<a href="https://binggg.github.io/blog/2026/07/18/open-plugins-standard#mcpjson" class="hash-link" aria-label="mcp.json的直接链接" title="mcp.json的直接链接" translate="no">​</a></h3>
<p>MCP 服务器配置从 <code>.mcp.json</code> 复制到规范路径 <code>mcp.json</code>：</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"mcpServers"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"cloudbase-mcp"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"command"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"npx"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"args"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"-y"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"@cloudbase/cloudbase-mcp@latest"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"env"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="自动化构建">自动化构建<a href="https://binggg.github.io/blog/2026/07/18/open-plugins-standard#%E8%87%AA%E5%8A%A8%E5%8C%96%E6%9E%84%E5%BB%BA" class="hash-link" aria-label="自动化构建的直接链接" title="自动化构建的直接链接" translate="no">​</a></h3>
<p>写了 <code>build-open-plugin-spec.mjs</code> 构建脚本，从 <code>.claude-plugin/plugin.json</code> 自动生成产物。还加了 <code>--check</code> 模式跑在 CI 里——每次 PR 自动校验，防止改源码忘了更新。</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain"># 生成产物</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">node scripts/build-open-plugin-spec.mjs</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># CI 模式：只检查不写入</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">node scripts/build-open-plugin-spec.mjs --check</span><br></div></code></pre></div></div>
<p>配了 GitHub Actions workflow（<code>.github/workflows/open-plugin-spec-check.yml</code>），PR 自动跑检查。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="验收结果">验收结果<a href="https://binggg.github.io/blog/2026/07/18/open-plugins-standard#%E9%AA%8C%E6%94%B6%E7%BB%93%E6%9E%9C" class="hash-link" aria-label="验收结果的直接链接" title="验收结果的直接链接" translate="no">​</a></h3>
<!-- -->
<p>最大的成就感是一行命令装到所有工具：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">npx plugins add TencentCloudBase/cloudbase-plugin</span><br></div></code></pre></div></div>
<p>而且因为之前就已经在 <code>skills/</code> 目录下放了 4 个 Skill，<code>npx plugins discover</code> 自动把它们注册为命名空间下的命令：</p>
<table><thead><tr><th>组件</th><th>用户调用方式</th></tr></thead><tbody><tr><td><code>skills/ai-model/</code></td><td><code>/cloudbase:ai-model</code></td></tr><tr><td><code>skills/cloudbase-data/</code></td><td><code>/cloudbase:cloudbase-data</code></td></tr><tr><td><code>skills/cloud-functions/</code></td><td><code>/cloudbase:cloud-functions</code></td></tr><tr><td><code>skills/mini-program/</code></td><td><code>/cloudbase:mini-program</code></td></tr></tbody></table>
<p>不用多写一行配置，按规范放目录就行。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="第一个坑marketplacejson-冲突">第一个坑：marketplace.json 冲突<a href="https://binggg.github.io/blog/2026/07/18/open-plugins-standard#%E7%AC%AC%E4%B8%80%E4%B8%AA%E5%9D%91marketplacejson-%E5%86%B2%E7%AA%81" class="hash-link" aria-label="第一个坑：marketplace.json 冲突的直接链接" title="第一个坑：marketplace.json 冲突的直接链接" translate="no">​</a></h3>
<p>PR #808 合进去之后，兴冲冲跑 <code>npx plugins add TencentCloudBase/CloudBase-MCP</code>，结果：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">No plugins found. 2 remote plugin(s) not shown.</span><br></div></code></pre></div></div>
<p>插件就在仓库里，但 CLI 说找不到。</p>
<p>查了半天发现原因：主仓库根目录有一个 <code>marketplace.json</code>，这是给 Claude Code 和 Codex 的 marketplace add 用的索引文件。<code>npx plugins</code> CLI 检测到它后，把整个仓库识别为 <strong>marketplace</strong>（多插件集合），拒绝安装其中的子目录插件。</p>
<!-- -->
<p><strong>解决方案：创建专门插件仓库</strong></p>
<p>参考 Vercel（<code>vercel/vercel-plugin</code>）和 Supabase（<code>supabase-community/supabase-plugin</code>）的做法——建专门的插件仓库，根目录只有 <code>.plugin/plugin.json</code>，没有 <code>marketplace.json</code>，让 CLI 识别为单插件。</p>
<p>创建了两个仓库：</p>
<table><thead><tr><th>仓库</th><th>安装命令</th><th>内容</th></tr></thead><tbody><tr><td><code>TencentCloudBase/cloudbase-plugin</code></td><td><code>npx plugins add TencentCloudBase/cloudbase-plugin</code></td><td>28 skills + MCP + 5 commands + 2 agents + hooks</td></tr><tr><td><code>TencentCloudBase/cloudbase-sites-plugin</code></td><td><code>npx plugins add TencentCloudBase/cloudbase-sites-plugin</code></td><td>1 skill + MCP + hooks</td></tr></tbody></table>
<p>内容从主仓库 <code>plugin/cloudbase/</code> 和 <code>plugin/cloudbase-sites/</code> 自动同步，<strong>同步时排除 <code>marketplace.json</code></strong>——这是关键。</p>
<p><strong>自动化同步机制</strong></p>
<!-- -->
<p>新增了这些文件：</p>
<table><thead><tr><th>文件</th><th>作用</th></tr></thead><tbody><tr><td><code>scripts/push-plugin-repos.mjs</code></td><td>构建插件仓库产物到 <code>.plugin-repo-output/</code></td></tr><tr><td><code>.github/workflows/push-plugin-repos.yaml</code></td><td>CI 自动同步 workflow</td></tr><tr><td><code>scripts/build-open-plugin-spec.mjs</code>（扩展）</td><td>同时处理 cloudbase + cloudbase-sites</td></tr><tr><td><code>plugin/cloudbase-sites/.plugin/plugin.json</code></td><td>cloudbase-sites 的 Open Plugin Spec manifest</td></tr><tr><td><code>plugin/cloudbase-sites/mcp.json</code></td><td>cloudbase-sites 的 MCP 配置</td></tr></tbody></table>
<p>验证全部通过：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">npx plugins discover TencentCloudBase/cloudbase-plugin --remote</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># → ✅ Found 1 local plugin(s), 28 skills, 5 cmds, 2 agents, hooks</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">npx plugins add TencentCloudBase/cloudbase-plugin --target cursor --scope local</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># → ✅ Installed</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">npx plugins discover TencentCloudBase/cloudbase-sites-plugin --remote</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># → ✅ Found 1 local plugin(s), 1 skill, hooks</span><br></div></code></pre></div></div>
<p>现在的安装命令统一指向专门仓库：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain"># 主插件</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">npx plugins add TencentCloudBase/cloudbase-plugin</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Sites 插件</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">npx plugins add TencentCloudBase/cloudbase-sites-plugin</span><br></div></code></pre></div></div>
<p>这个坑的核心教训是：<strong>Open Plugins 会把根目录有 <code>marketplace.json</code> 的仓库当作插件集合，而非单插件。</strong> 如果你的仓库本身就有多个发布物（像 CloudBase-MCP 既有 MCP 服务器又有插件），需要建专门的插件仓库。Vercel 和 Supabase 也是这样做的。</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="hook-系统">Hook 系统<a href="https://binggg.github.io/blog/2026/07/18/open-plugins-standard#hook-%E7%B3%BB%E7%BB%9F" class="hash-link" aria-label="Hook 系统的直接链接" title="Hook 系统的直接链接" translate="no">​</a></h2>
<p>我看规范时觉得最值钱的部分是这个——Hook 能在 agent 工作流的各个生命周期点插一脚。不过注意：<strong>Hook 不在 Spec v1 标准里</strong>，支不支持全看宿主工具。Claude Code 和 Copilot CLI 支持最全，VS Code 和 Kimi Code 就不认（静默忽略，不报错）。</p>
<p>下面讲的事件模型来自 Open Plugin Spec 的 Hooks 组件规范——如果你的宿主工具支持 Hooks，这就是它的工作方式。</p>
<blockquote>
<p><img decoding="async" loading="lazy" src="https://binggg.github.io/assets/images/plugin-hooks-52abc4f9a605089e98de7b12a1f49d96.png" width="1312" height="736" class="img_ev3q">
<em>图：Hook 系统——从 SessionStart 到 SessionEnd 的完整事件链</em></p>
</blockquote>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="事件全景">事件全景<a href="https://binggg.github.io/blog/2026/07/18/open-plugins-standard#%E4%BA%8B%E4%BB%B6%E5%85%A8%E6%99%AF" class="hash-link" aria-label="事件全景的直接链接" title="事件全景的直接链接" translate="no">​</a></h3>
<!-- -->
<table><thead><tr><th>事件</th><th>触发时机</th><th>匹配器作用域</th></tr></thead><tbody><tr><td><code>PreToolUse</code></td><td>agent 调用工具<strong>前</strong></td><td>工具名</td></tr><tr><td><code>PostToolUse</code></td><td>工具调用<strong>成功后</strong></td><td>工具名</td></tr><tr><td><code>PostToolUseFailure</code></td><td>工具调用<strong>出错时</strong></td><td>工具名</td></tr><tr><td><code>BeforeReadFile</code></td><td>读取文件<strong>前</strong></td><td>文件路径</td></tr><tr><td><code>AfterFileEdit</code></td><td>文件写入<strong>后</strong></td><td>文件路径</td></tr><tr><td><code>BeforeShellExecution</code></td><td>执行 shell 命令<strong>前</strong></td><td>命令字符串</td></tr><tr><td><code>AfterShellExecution</code></td><td>shell 命令<strong>完成后</strong></td><td>命令字符串</td></tr><tr><td><code>SessionStart</code></td><td>会话<strong>开始时</strong></td><td>—</td></tr><tr><td><code>SessionEnd</code></td><td>会话<strong>结束时</strong></td><td>—</td></tr><tr><td><code>UserPromptSubmit</code></td><td>用户<strong>提交提示词</strong></td><td>—</td></tr><tr><td><code>Stop</code></td><td>agent <strong>尝试停止</strong></td><td>—</td></tr><tr><td><code>SubagentStart</code></td><td>子 agent <strong>启动</strong></td><td>—</td></tr><tr><td><code>SubagentStop</code></td><td>子 agent <strong>结束</strong></td><td>—</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="三种-action-类型">三种 Action 类型<a href="https://binggg.github.io/blog/2026/07/18/open-plugins-standard#%E4%B8%89%E7%A7%8D-action-%E7%B1%BB%E5%9E%8B" class="hash-link" aria-label="三种 Action 类型的直接链接" title="三种 Action 类型的直接链接" translate="no">​</a></h3>
<!-- -->
<p><strong>command</strong> — 执行外部脚本，事件上下文通过 stdin JSON 传入：</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"type"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"command"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"command"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"${PLUGIN_ROOT}/scripts/lint.sh"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p><strong>prompt</strong> — 向 LLM 发送提示词，<code>$ARGUMENTS</code> 替换为事件上下文：</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"type"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"prompt"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"prompt"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Review the change: $ARGUMENTS"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p><strong>agent</strong> — 类似 prompt 但带工具访问权限，可以做多步验证：</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"type"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"agent"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"prompt"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Verify style guide compliance: $ARGUMENTS"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="执行模型">执行模型<a href="https://binggg.github.io/blog/2026/07/18/open-plugins-standard#%E6%89%A7%E8%A1%8C%E6%A8%A1%E5%9E%8B" class="hash-link" aria-label="执行模型的直接链接" title="执行模型的直接链接" translate="no">​</a></h3>
<!-- -->
<ul>
<li class="">多个规则可以匹配同一个事件，<strong>全部执行</strong></li>
<li class="">同一规则内的 hooks <strong>按数组顺序串行执行</strong></li>
<li class="">实现端<strong>应该设置超时</strong></li>
<li class="">失败<strong>不能 crash 宿主工具</strong></li>
</ul>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="给你的工具加上-open-plugins-支持">给你的工具加上 Open Plugins 支持<a href="https://binggg.github.io/blog/2026/07/18/open-plugins-standard#%E7%BB%99%E4%BD%A0%E7%9A%84%E5%B7%A5%E5%85%B7%E5%8A%A0%E4%B8%8A-open-plugins-%E6%94%AF%E6%8C%81" class="hash-link" aria-label="给你的工具加上 Open Plugins 支持的直接链接" title="给你的工具加上 Open Plugins 支持的直接链接" translate="no">​</a></h2>
<p>如果你自己做 AI 编程工具、想让插件生态兼容 Open Plugins，需要实现五条：</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="五大核心能力">五大核心能力<a href="https://binggg.github.io/blog/2026/07/18/open-plugins-standard#%E4%BA%94%E5%A4%A7%E6%A0%B8%E5%BF%83%E8%83%BD%E5%8A%9B" class="hash-link" aria-label="五大核心能力的直接链接" title="五大核心能力的直接链接" translate="no">​</a></h3>
<!-- -->
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="不同工具的集成方式">不同工具的集成方式<a href="https://binggg.github.io/blog/2026/07/18/open-plugins-standard#%E4%B8%8D%E5%90%8C%E5%B7%A5%E5%85%B7%E7%9A%84%E9%9B%86%E6%88%90%E6%96%B9%E5%BC%8F" class="hash-link" aria-label="不同工具的集成方式的直接链接" title="不同工具的集成方式的直接链接" translate="no">​</a></h3>
<p>每个工具现有的插件机制不同，<code>npx plugins</code> 在安装时做了一层翻译——把通用 <code>.plugin/</code> 格式转成各工具自己的原生格式：</p>
<table><thead><tr><th>工具</th><th>安装目标</th><th>集成机制</th></tr></thead><tbody><tr><td><strong>Claude Code</strong></td><td><code>.claude/plugins/</code></td><td>Skills 和配置直接兼容</td></tr><tr><td><strong>Cursor</strong></td><td><code>.cursor/plugins/</code></td><td>通过 Rules + MCP 机制注册</td></tr><tr><td><strong>Codex</strong></td><td>市场入口 <code>vercel@openai-curated</code></td><td>通过内置 Vercel 集成</td></tr><tr><td><strong>Grok Build</strong></td><td><code>grok plugin install</code></td><td>原生插件命令 + Claude Code 兼容层</td></tr><tr><td><strong>Kimi Code</strong></td><td>Kimi 插件存储</td><td><code>/plugins</code> TUI 重载后可见</td></tr><tr><td><strong>GitHub Copilot CLI</strong></td><td><code>copilot plugin marketplace add</code></td><td>注册源后 <code>plugin add plugin@marketplace</code></td></tr><tr><td><strong>VS Code</strong></td><td><code>chat.pluginLocations</code> 设置</td><td>需开启 <code>chat.plugins.enabled</code>（Preview）</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="安全防护模型">安全防护模型<a href="https://binggg.github.io/blog/2026/07/18/open-plugins-standard#%E5%AE%89%E5%85%A8%E9%98%B2%E6%8A%A4%E6%A8%A1%E5%9E%8B" class="hash-link" aria-label="安全防护模型的直接链接" title="安全防护模型的直接链接" translate="no">​</a></h3>
<!-- -->
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="一些感受">一些感受<a href="https://binggg.github.io/blog/2026/07/18/open-plugins-standard#%E4%B8%80%E4%BA%9B%E6%84%9F%E5%8F%97" class="hash-link" aria-label="一些感受的直接链接" title="一些感受的直接链接" translate="no">​</a></h2>
<p>Open Plugins 让我想起十年前 npm 刚流行的时候。JavaScript 的包管理也是一团乱麻：AMD、CommonJS、UMD、IIFE……每个项目有自己的一套。后来 npm + ES Modules 统一了标准，整个生态起飞了。AI 编程工具的插件生态，现在就处在那"前 npm"时代。</p>
<p>这次给 CloudBase MCP 做改造是个挺有意思的过程。从 <code>npx plugins discover</code> 识别出插件，到一行命令装到所有工具，那种"写一次到处用"的感觉，恰好就是这个标准想解决的问题。</p>
<blockquote>
<p><img decoding="async" loading="lazy" src="https://binggg.github.io/assets/images/plugin-install-all-5ab1b0459e43b78c8ecedfeb958c15a0.png" width="1312" height="736" class="img_ev3q">
<em>图：npx plugins add TencentCloudBase/cloudbase-plugin——一行命令装到所有工具</em></p>
</blockquote>
<!-- -->
<p>如果你也在做 AI 编程工具的扩展，推荐看看 Open Plugins 规范。好消息是不用搞多复杂——项目里加个 <code>.plugin/plugin.json</code>，你的插件就能被 7 种工具识别。我们的改造也就四百来行代码，两天不到搞完。</p>
<p>CloudBase-MCP 对应的插件在这两个仓库，供参考：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">npx plugins add TencentCloudBase/cloudbase-plugin</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">npx plugins add TencentCloudBase/cloudbase-sites-plugin</span><br></div></code></pre></div></div>
<p>Open Plugins 还没到"成熟"那一步，但方向是对的。能让同一份插件在不同工具之间跑，这个问题本身值得被认真解决。剩下的就看社区怎么长出来了。</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="参考链接">参考链接<a href="https://binggg.github.io/blog/2026/07/18/open-plugins-standard#%E5%8F%82%E8%80%83%E9%93%BE%E6%8E%A5" class="hash-link" aria-label="参考链接的直接链接" title="参考链接的直接链接" translate="no">​</a></h2>
<ul>
<li class=""><a href="https://open-plugins.com/" target="_blank" rel="noopener noreferrer" class="">Open Plugins 官网</a></li>
<li class=""><a href="https://www.npmjs.com/package/plugins" target="_blank" rel="noopener noreferrer" class="">plugins npm 包</a> — <code>npx plugins add</code> 的安装器</li>
<li class=""><a href="https://agentskills.io/" target="_blank" rel="noopener noreferrer" class="">Agent Skills 规范</a></li>
<li class=""><a href="https://modelcontextprotocol.io/" target="_blank" rel="noopener noreferrer" class="">Model Context Protocol</a></li>
<li class=""><a href="https://github.com/TencentCloudBase/cloudbase-plugin" target="_blank" rel="noopener noreferrer" class="">CloudBase Plugin</a> — Open Plugins 标准插件仓库</li>
<li class=""><a href="https://github.com/TencentCloudBase/cloudbase-sites-plugin" target="_blank" rel="noopener noreferrer" class="">CloudBase Sites Plugin</a> — Sites 插件仓库</li>
<li class=""><a href="https://github.com/TencentCloudBase/CloudBase-MCP" target="_blank" rel="noopener noreferrer" class="">CloudBase MCP</a> — 腾讯云开发 MCP 插件</li>
<li class=""><a href="https://github.com/TencentCloudBase/CloudBase-MCP/pull/808" target="_blank" rel="noopener noreferrer" class="">PR #808: CloudBase MCP 集成 Open Plugin 规范</a></li>
</ul>]]></content>
        <author>
            <name>Booker Zhao</name>
            <uri>https://binggg.github.io</uri>
        </author>
        <category label="AI" term="AI"/>
        <category label="开源" term="开源"/>
        <category label="全栈" term="全栈"/>
        <category label="CloudBase" term="CloudBase"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[解放双手——Claude Code 五种"放手"机制的底层逻辑]]></title>
        <id>https://binggg.github.io/blog/claude-code-five-mechanisms</id>
        <link href="https://binggg.github.io/blog/claude-code-five-mechanisms"/>
        <updated>2026-07-06T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[从 /goal 到 Workflows，五个机制解决同一个问题：怎么让 AI 在回合制下做到"持续运行、自主决策、并行协作"。]]></summary>
        <content type="html"><![CDATA[<p>用过 Claude Code 做复杂任务的，八成遇到过这种事——</p>
<p>让 AI 把 fetch 全换成 axios，泡了杯咖啡回来，发现它改了三四个文件就停下来等你点头。反复七八次，一杯咖啡都凉了</p>
<p>或者睡前跑了 /loop 盯 PR，早上发现它凌晨两点卡在 git merge 冲突上，窗口占了一整夜</p>
<p>或者开了三个 sub-agent 各查各的——完事三个结论互相矛盾，因为它们都没看到对方在做什么</p>
<p>根不在 AI 不够聪明。Claude Code 是回合制的——每轮只能做一件事，做完等你决定下一步。想让它持续运行、自动决策、并行工作，就得靠产品层面的编排机制来弥补</p>
<p>Claude Code 给了五个：/goal、/loop、sub-agent、Agent Teams、Workflows</p>
<p>选错了不仅浪费 token，还会把事情搞得更复杂</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="痛点一我在等它它在等我">痛点一：我在等它，它在等我<a href="https://binggg.github.io/blog/claude-code-five-mechanisms#%E7%97%9B%E7%82%B9%E4%B8%80%E6%88%91%E5%9C%A8%E7%AD%89%E5%AE%83%E5%AE%83%E5%9C%A8%E7%AD%89%E6%88%91" class="hash-link" aria-label="痛点一：我在等它，它在等我的直接链接" title="痛点一：我在等它，它在等我的直接链接" translate="no">​</a></h2>
<p><img decoding="async" loading="lazy" alt="/goal——条件引导的自主轮询" src="https://binggg.github.io/assets/images/scene-02-goal-c6e7a1ad36fdf9a03e5313a384ca0887.png" width="1312" height="736" class="img_ev3q"></p>
<p>你给 AI 一个明确目标，它有能力完成，但每一轮做完都停下来等你批准。这就是 /goal 要解决的问题</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="goal--条件引导的自主轮询">/goal — 条件引导的自主轮询<a href="https://binggg.github.io/blog/claude-code-five-mechanisms#goal--%E6%9D%A1%E4%BB%B6%E5%BC%95%E5%AF%BC%E7%9A%84%E8%87%AA%E4%B8%BB%E8%BD%AE%E8%AF%A2" class="hash-link" aria-label="/goal — 条件引导的自主轮询的直接链接" title="/goal — 条件引导的自主轮询的直接链接" translate="no">​</a></h3>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">/goal 完成 data-editor 的测试经验泛化为全模块标准测试框架，分三步：</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  Step 1: 创建共享 test-utils.sh</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  Step 2: 为每个模块创建 verify-*.sh</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  Step 3: 更新验收标准</span><br></div></code></pre></div></div>
<p>底层是轻量级的 Stop Hook：往 <code>sessionHooksRegistry</code> 注册一个 <code>type: 'prompt'</code> 的 hook，每个 turn 结束后触发一次评估</p>
<p>评估模型拿到三样东西：</p>
<ol>
<li class=""><strong>目标条件</strong>——你写的 /goal 描述</li>
<li class=""><strong>对话 transcript</strong>——从 goal 设定时刻之后的所有对话</li>
<li class=""><strong>元信息</strong>——session ID、时间戳、权限模式等</li>
</ol>
<p>输出是结构化 JSON：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">{"ok": false, "reason": "Step 1 已完成，test-utils.sh 已创建，但 Step 2 还未开始"}</span><br></div></code></pre></div></div>
<p><code>ok: true</code> → stop，<code>ok: false</code> → 带着 reason 继续下一轮</p>
<p>关键设计：<strong>干活的和做检查的是两个模型</strong>，避免了主模型一边干活一边给自己打分。评估器只看 transcript，不做执行，所以能客观判断</p>
<p>局限也很明显：</p>
<ul>
<li class="">串行的——一次跑一个 turn，只是省了手动回车</li>
<li class="">评估器不可观测——没日志告诉你为什么判定通过或失败</li>
<li class="">每个 turn 的 transcript 都传给评估器，对话越长评估成本越高</li>
<li class="">评估模型延迟叠加到每个 turn 上，选 Haiku 省时间，选 Sonnet 保准确</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="适用边界">适用边界<a href="https://binggg.github.io/blog/claude-code-five-mechanisms#%E9%80%82%E7%94%A8%E8%BE%B9%E7%95%8C" class="hash-link" aria-label="适用边界的直接链接" title="适用边界的直接链接" translate="no">​</a></h4>
<p><strong>适合</strong>：目标有明确终态的任务，过程可能跨多轮，你不想坐在旁边看着</p>
<p><strong>不适合</strong>：需要持续监控的（用 /loop），目标是发散探索性质的</p>
<p>有个细节：评估模型可以换。目标复杂度高就用 Sonnet 做评估，反之用更小的模型省成本</p>
<p>需要 v2.1.139+</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="痛点二项目放着不管就长草">痛点二：项目放着不管就长草<a href="https://binggg.github.io/blog/claude-code-five-mechanisms#%E7%97%9B%E7%82%B9%E4%BA%8C%E9%A1%B9%E7%9B%AE%E6%94%BE%E7%9D%80%E4%B8%8D%E7%AE%A1%E5%B0%B1%E9%95%BF%E8%8D%89" class="hash-link" aria-label="痛点二：项目放着不管就长草的直接链接" title="痛点二：项目放着不管就长草的直接链接" translate="no">​</a></h2>
<p><img decoding="async" loading="lazy" alt="/loop——自适应调度器" src="https://binggg.github.io/assets/images/scene-03-loop-2a9ed21462b64275681407e6dc2f4cd5.png" width="1312" height="736" class="img_ev3q"></p>
<p>很多场景没终点——PR 需要持续关注、CI 挂了要处理、依赖要升级。你不可能一直盯着终端。但一个不盯着，就可能卡一整夜</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="loop--自适应调度器">/loop — 自适应调度器<a href="https://binggg.github.io/blog/claude-code-five-mechanisms#loop--%E8%87%AA%E9%80%82%E5%BA%94%E8%B0%83%E5%BA%A6%E5%99%A8" class="hash-link" aria-label="/loop — 自适应调度器的直接链接" title="/loop — 自适应调度器的直接链接" translate="no">​</a></h3>
<p>/goal 关心"做完了没"，/loop 关心"现在有什么需要做"</p>
<p>不加参数执行三段式管线：</p>
<ol>
<li class="">把没做完的收尾</li>
<li class="">检查当前 PR 评论、CI 状态、合并冲突</li>
<li class="">跑 lint、类型检查、格式化</li>
</ol>
<p>间隔动态调整：状态活跃时 1 分钟一轮，闲下来慢慢延长到 1 小时</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">/loop          # 自适应模式（日常推荐）</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">/loop 15m      # 固定 15 分钟</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">/loop 2h       # 固定 2 小时</span><br></div></code></pre></div></div>
<p>三段式不是硬编码逻辑，是内置 prompt 模板，Claude 自己决定该执行哪一步。自适应间隔也靠 Claude 对"刚才发生了什么"的感知，不是外部指标（CI、CPU、日志）</p>
<p>这个限制解释了为什么 Bedrock、Vertex AI、Azure Foundry 上自适应不可用——退化为固定 10 分钟。这些平台的 API 不支持"由模型决定间隔"的通信模式</p>
<p><strong>代价</strong>：/loop 跑在<strong>同一个 session</strong> 里。第 10 轮的上下文比第 1 轮臃肿得多——塞了前 9 轮的产物。开销在递增，注意力在被稀释。不是 loop 本身费钱，是 session 在老化</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="痛点三主上下文被灌了一堆垃圾">痛点三：主上下文被灌了一堆垃圾<a href="https://binggg.github.io/blog/claude-code-five-mechanisms#%E7%97%9B%E7%82%B9%E4%B8%89%E4%B8%BB%E4%B8%8A%E4%B8%8B%E6%96%87%E8%A2%AB%E7%81%8C%E4%BA%86%E4%B8%80%E5%A0%86%E5%9E%83%E5%9C%BE" class="hash-link" aria-label="痛点三：主上下文被灌了一堆垃圾的直接链接" title="痛点三：主上下文被灌了一堆垃圾的直接链接" translate="no">​</a></h2>
<p><img decoding="async" loading="lazy" alt="Sub-Agent——上下文隔离的工人" src="https://binggg.github.io/assets/images/scene-04-subagent-b00bc9e128752664b1b252bbeb69fdcc.png" width="1312" height="736" class="img_ev3q"></p>
<p>一个 session 跑久了，上下文里塞满中间产物——查过的文档、试过的方案、反复修正的路径。token 越花越多，模型越来越"笨"。但你的辅助工作（查 API、调研库、验证猜想）不该污染主线</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="sub-agent--上下文隔离的工人">Sub-Agent — 上下文隔离的工人<a href="https://binggg.github.io/blog/claude-code-five-mechanisms#sub-agent--%E4%B8%8A%E4%B8%8B%E6%96%87%E9%9A%94%E7%A6%BB%E7%9A%84%E5%B7%A5%E4%BA%BA" class="hash-link" aria-label="Sub-Agent — 上下文隔离的工人的直接链接" title="Sub-Agent — 上下文隔离的工人的直接链接" translate="no">​</a></h3>
<p>sub-agent 解决的是"主上下文宝贵"的问题。每个 sub-agent 启动时拥有<strong>全新的 context window</strong>，看不到你的对话历史，做完只返回摘要，不污染主会话。嵌套限制 5 层，硬编码不可配置</p>
<p><strong>隔离机制</strong>（源码来自 <code>forkedAgent.ts</code>）：</p>
<ul>
<li class=""><strong>独立的 AbortController</strong>：父会话取消不影响 sub-agent，反之亦然</li>
<li class=""><strong>无状态传播（no-op state propagation）</strong>：父会话不传递任何内部状态。sub-agent 连父会话用了哪些工具都不知道。想让 sub-agent 知道某个上下文，必须显式通过 prompt 传入</li>
</ul>
<p>5 层限制的理由很实际——每层嵌套开一个新 LLM session，深度 5 意味着同时维护 5 个 session 的 token 开销。超出深度的 sub-agent 不会收到 Agent 工具，等于被静默拒绝</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="三种创建方式">三种创建方式<a href="https://binggg.github.io/blog/claude-code-five-mechanisms#%E4%B8%89%E7%A7%8D%E5%88%9B%E5%BB%BA%E6%96%B9%E5%BC%8F" class="hash-link" aria-label="三种创建方式的直接链接" title="三种创建方式的直接链接" translate="no">​</a></h4>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain"># 方式一：一次性的</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">/agent 去调研下这个函数的调用链路</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># 方式二：配置文件（持久化）</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># .claude/agents/researcher.yaml</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">name: researcher</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">description: 专门做技术调研的 agent，擅长读源码、查文档</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">prompt: 你专注于调研...</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">model: claude-sonnet-4-20260514</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">disallowedTools: [Write, Edit]</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># 方式三：SDK 创建</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">const agent = claude.subAgent({ prompt: "..." });</span><br></div></code></pre></div></div>
<p>配置文件的 <code>description</code> 字段有特殊作用——Claude 会根据描述内容自动决定什么时候该委派任务</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="什么时候用">什么时候用<a href="https://binggg.github.io/blog/claude-code-five-mechanisms#%E4%BB%80%E4%B9%88%E6%97%B6%E5%80%99%E7%94%A8" class="hash-link" aria-label="什么时候用的直接链接" title="什么时候用的直接链接" translate="no">​</a></h4>
<table><thead><tr><th>场景</th><th>用不用 sub-agent</th></tr></thead><tbody><tr><td>查一个函数调用链路</td><td>用 <code>/agent</code>，一次性，省事</td></tr><tr><td>频繁做的调研任务</td><td>写 YAML 文件持久化，可复用</td></tr><tr><td>并行调研多个方案</td><td>各开一个 sub-agent，互不干扰</td></tr><tr><td>只是简单 grep 一下</td><td>不用，主会话直接跑更快</td></tr></tbody></table>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="团队里的-sub-agent">团队里的 sub-agent<a href="https://binggg.github.io/blog/claude-code-five-mechanisms#%E5%9B%A2%E9%98%9F%E9%87%8C%E7%9A%84-sub-agent" class="hash-link" aria-label="团队里的 sub-agent的直接链接" title="团队里的 sub-agent的直接链接" translate="no">​</a></h4>
<p>多人协作时，项目级 <code>.claude/agents/</code> 目录可以 git 共享。团队成员 push 自己配的 agent，其他人 pull 下来就能用。这个机制让 agent 配置变成了工程资产——跟 <code>.claude/rules/</code> 一样，是项目的一部分</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="痛点四十个活挤在一起干">痛点四：十个活挤在一起干<a href="https://binggg.github.io/blog/claude-code-five-mechanisms#%E7%97%9B%E7%82%B9%E5%9B%9B%E5%8D%81%E4%B8%AA%E6%B4%BB%E6%8C%A4%E5%9C%A8%E4%B8%80%E8%B5%B7%E5%B9%B2" class="hash-link" aria-label="痛点四：十个活挤在一起干的直接链接" title="痛点四：十个活挤在一起干的直接链接" translate="no">​</a></h2>
<p><img decoding="async" loading="lazy" alt="Agent Teams——可观察的并行" src="https://binggg.github.io/assets/images/scene-05-teams-657d6ec10dbdab612320fcd971ef8fa8.png" width="1312" height="736" class="img_ev3q"></p>
<p>/goal 跑一个任务，sub-agent 处理一个子任务。但你有十个活要干——修 bug、重构模块、写文档、准备 demo。不可能一个一个来，也不能让它们互相踩</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="agent-teams--可观察的并行">Agent Teams — 可观察的并行<a href="https://binggg.github.io/blog/claude-code-five-mechanisms#agent-teams--%E5%8F%AF%E8%A7%82%E5%AF%9F%E7%9A%84%E5%B9%B6%E8%A1%8C" class="hash-link" aria-label="Agent Teams — 可观察的并行的直接链接" title="Agent Teams — 可观察的并行的直接链接" translate="no">​</a></h3>
<p>Claude Code v2.1.166+ 引入的功能。核心是用独立 session 跑每个任务，互不干扰。主 session 创建任务时指定 agenda（类似 job description），Team 层负责调度</p>
<p><strong>关键行为</strong>：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">Task → sub-Agent session（独立，不可见）</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       ↕</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Task → sub-Agent session（独立，不可见）</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       ↕</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Main session ← 可观测 ← 各 Agent 汇报</span><br></div></code></pre></div></div>
<p>相比 sub-agent，Teams 多了三层：</p>
<ol>
<li class=""><strong>可观测性</strong>——主 session 能看到各个 Agent 的实时进展</li>
<li class=""><strong>并行执行</strong>——各 Agent 跑在各自的 session 里，真正的并行</li>
<li class=""><strong>被动调度</strong>——不用显式写什么时候做什么，系统自动决定</li>
</ol>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="子任务分配规则">子任务分配规则<a href="https://binggg.github.io/blog/claude-code-five-mechanisms#%E5%AD%90%E4%BB%BB%E5%8A%A1%E5%88%86%E9%85%8D%E8%A7%84%E5%88%99" class="hash-link" aria-label="子任务分配规则的直接链接" title="子任务分配规则的直接链接" translate="no">​</a></h4>
<p>主 session 拆解任务并分发，拆法不是固定的提示工程，是模型自己的判断。给一个 agenda 说"重构 user 模块"，它自己决定怎么拆</p>
<p>对主任务的"理解"就来自拆解的粒度：粗就代表它没真正理解，细就代表它理清了依赖关系</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="调试难题">调试难题<a href="https://binggg.github.io/blog/claude-code-five-mechanisms#%E8%B0%83%E8%AF%95%E9%9A%BE%E9%A2%98" class="hash-link" aria-label="调试难题的直接链接" title="调试难题的直接链接" translate="no">​</a></h4>
<p>独立的 session 也意味着独立的 token 消耗。不出问题还好，出问题你根本不知道是哪个 Agent、哪一步、为什么。没有全局日志，每个 session 的输入输出只能单独看</p>
<p>官方在同一个 TUI 里展示，但独立的 session 数据只能通过主 session 间接查看，没有中心化的调试视图。这是并行化天然要付出的代价</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="痛点五一个复杂任务靠纯对话推不动">痛点五：一个复杂任务靠纯对话推不动<a href="https://binggg.github.io/blog/claude-code-five-mechanisms#%E7%97%9B%E7%82%B9%E4%BA%94%E4%B8%80%E4%B8%AA%E5%A4%8D%E6%9D%82%E4%BB%BB%E5%8A%A1%E9%9D%A0%E7%BA%AF%E5%AF%B9%E8%AF%9D%E6%8E%A8%E4%B8%8D%E5%8A%A8" class="hash-link" aria-label="痛点五：一个复杂任务靠纯对话推不动的直接链接" title="痛点五：一个复杂任务靠纯对话推不动的直接链接" translate="no">​</a></h2>
<p><img decoding="async" loading="lazy" alt="Workflows——确定性的工作流" src="https://binggg.github.io/assets/images/scene-06-workflow-081322957cb8565a141ecbb1a840e4e4.png" width="1312" height="736" class="img_ev3q"></p>
<p>有些任务不是"干就完了"，而是多个步骤环环相扣——先调研，再设计，再编码，再测试。任何一个步骤出偏差，后面全歪。没有个框架约束，纯靠模型自由发挥，结果就是"第一次成功，第二次不行"</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="workflows--确定性的工作流">Workflows — 确定性的工作流<a href="https://binggg.github.io/blog/claude-code-five-mechanisms#workflows--%E7%A1%AE%E5%AE%9A%E6%80%A7%E7%9A%84%E5%B7%A5%E4%BD%9C%E6%B5%81" class="hash-link" aria-label="Workflows — 确定性的工作流的直接链接" title="Workflows — 确定性的工作流的直接链接" translate="no">​</a></h3>
<p>Workflows 是 Claude Code 最近推的机制，用声明式 YAML 定义多 Agent 协作的拓扑结构。跟 Teams 的区别不在谁厉害，在<strong>编排哲学不同</strong>：</p>
<table><thead><tr><th></th><th>Teams</th><th>Workflows</th></tr></thead><tbody><tr><td>拓扑</td><td>Hub-and-Spoke（星型）</td><td>有向图（DAG）</td></tr><tr><td>调度</td><td>被动——Task 创建后系统自动</td><td>显式——Step 执行顺序你定</td></tr><tr><td>通信</td><td>主 session 单向看汇报</td><td>上一步输出是下一步输入</td></tr><tr><td>确定性</td><td>低——看模型发挥</td><td>高——调参可复现</td></tr><tr><td>适合</td><td>探索性、不确定性高的任务</td><td>确定性、质量要求稳定的任务</td></tr></tbody></table>
<p>Workflows 的阶段定义：</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"feature-dev"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">agents</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">design</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">model</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> claude</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">sonnet</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">4</span><span class="token punctuation" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">20260514</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">prompt</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"你负责技术设计..."</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">implement</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">model</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> claude</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">sonnet</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">4</span><span class="token punctuation" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">20260514</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">prompt</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"你负责实现..."</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">review</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">model</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> claude</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">sonnet</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">4</span><span class="token punctuation" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">20260514</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">prompt</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"你负责代码审查..."</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">steps</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">agent</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> design</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">output</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> DESIGN</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">agent</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> implement</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">input</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> DESIGN</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">output</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> CODE</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">agent</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> review</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">input</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> CODE</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">output</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> REVIEW</span><br></div></code></pre></div></div>
<p>每个 step 的 <code>output</code> 是上个 step 的输出路径，<code>input</code> 是当前 step 的输入。链条清晰，出了问题知道在哪一步断的</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="workflows-里的任务类型">Workflows 里的任务类型<a href="https://binggg.github.io/blog/claude-code-five-mechanisms#workflows-%E9%87%8C%E7%9A%84%E4%BB%BB%E5%8A%A1%E7%B1%BB%E5%9E%8B" class="hash-link" aria-label="Workflows 里的任务类型的直接链接" title="Workflows 里的任务类型的直接链接" translate="no">​</a></h4>
<p>内置三种：</p>
<ul>
<li class=""><strong>feature</strong> — 串行步进</li>
<li class=""><strong>swe</strong> — 专门针对软件工程的多轮循环（设计→编码→测试→修复→审查）</li>
<li class=""><strong>research</strong> — 探索性研究（不是多步，是让 agent 自己探索）</li>
</ul>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="决策指南什么场景用什么">决策指南：什么场景用什么？<a href="https://binggg.github.io/blog/claude-code-five-mechanisms#%E5%86%B3%E7%AD%96%E6%8C%87%E5%8D%97%E4%BB%80%E4%B9%88%E5%9C%BA%E6%99%AF%E7%94%A8%E4%BB%80%E4%B9%88" class="hash-link" aria-label="决策指南：什么场景用什么？的直接链接" title="决策指南：什么场景用什么？的直接链接" translate="no">​</a></h2>
<p><img decoding="async" loading="lazy" alt="决策树：五种机制选哪个" src="https://binggg.github.io/assets/images/scene-07-decision-6d075467f1c5ad27ec92c4f64f589d4a.png" width="1312" height="736" class="img_ev3q"></p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">                    你的痛点是什么？</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                           │</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          ┌────────────────┼────────────────┐</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          ▼                ▼                ▼</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  每轮确认太烦        不能一直盯着         任务太复杂</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   /goal               /loop               Workflows</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          │                │</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          ▼                ▼</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   主上下文爆了        十个活挤一起</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   sub-agent           Agent Teams</span><br></div></code></pre></div></div>
<p>具体来说：</p>
<ul>
<li class=""><strong>单个明确目标，过程可能跨多轮</strong> → /goal（串行自主，最轻量）</li>
<li class=""><strong>没终点，需要持续关注</strong> → /loop（自适应，但注意 session 老化）</li>
<li class=""><strong>辅助工作不应污染主上下文</strong> → sub-agent（隔离最彻底）</li>
<li class=""><strong>同时做多件事，互不依赖</strong> → Agent Teams（真正的并行）</li>
<li class=""><strong>质量要求稳定，步骤环环相扣</strong> → Workflows（确定性最高）</li>
</ul>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="写在后面">写在后面<a href="https://binggg.github.io/blog/claude-code-five-mechanisms#%E5%86%99%E5%9C%A8%E5%90%8E%E9%9D%A2" class="hash-link" aria-label="写在后面的直接链接" title="写在后面的直接链接" translate="no">​</a></h2>
<p>这些痛点的共同来源不是 Claude Code 的功能缺陷，而是<strong>我们让 AI 做它设计上不擅长的事</strong>——持续运行、自主决策、并行协作。/goal 把回合制伪装成持续执行，/loop 把等待包装成自适应调度，sub-agent 用隔离对抗膨胀。每个机制都在弥补回合制模型的局限</p>
<p>补丁思维看，它们确实是 hook 和 session 层面的包装。但换个角度，Claude Code 没有重新发明运行时，而是在回合制上用最轻量的方式（hook、新 session、JS 沙箱）递进出编排能力的光谱——从简单到复杂，从串行到并行</p>
<p><strong>回合制不是缺陷，是约束</strong>。每次 turn 交回控制权，意味着可中断、可审计、可干预。持续执行的系统出问题很难喊停。回合制给了一个天然的安全边界</p>
<p><strong>编排是妥协的艺术</strong>。想要可预测性？用 Workflows，放弃灵活性。想要隔离性？用 sub-agent，接受上下文同步成本。没有完美机制，只有取舍</p>
<p><strong>最贵的不是 token，是你的注意力</strong>。省掉你盯着终端的时间，比省几个 token 更有价值。释放认知带宽才是这些机制真正的价值</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="彩蛋一份可以直接用的-agent-配置包">彩蛋：一份可以直接用的 agent 配置包<a href="https://binggg.github.io/blog/claude-code-five-mechanisms#%E5%BD%A9%E8%9B%8B%E4%B8%80%E4%BB%BD%E5%8F%AF%E4%BB%A5%E7%9B%B4%E6%8E%A5%E7%94%A8%E7%9A%84-agent-%E9%85%8D%E7%BD%AE%E5%8C%85" class="hash-link" aria-label="彩蛋：一份可以直接用的 agent 配置包的直接链接" title="彩蛋：一份可以直接用的 agent 配置包的直接链接" translate="no">​</a></h2>
<p>上面讲了五种机制，但最有用的事情是帮你配好。这是我目前在用的 <code>.claude/agents/</code> 配置——三个配置好的 Agent，各自管一件事：</p>
<p><strong>1. researcher — 纯调研，不改代码</strong></p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># .claude/agents/researcher.yaml</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> researcher</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">description</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 专门做技术调研的 agent，擅长读源码、查文档、验证猜想</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">prompt</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">|</span><span class="token scalar string" style="color:#e3116c"></span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">  你是一个技术调研助手。</span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">  你的工具权限限制为只读：可以 Read、Grep、Glob，但不能 Edit、Write、Bash（除了非破坏性命令）。</span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">  你收到的任务格式是：</span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">    ## 调研目标</span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">    [要搞清楚的问题]</span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">    </span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">    ## 背景</span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">    [相关代码/文档的定位]</span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">  调研完成后输出：</span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">    - 核心发现（3-5 条）</span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">    - 证据来源（文件路径 + 行号）</span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">    - 推荐方案或下一步</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">model</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> claude</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">sonnet</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">4</span><span class="token punctuation" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">20260514</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">disallowedTools</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">Write</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> Edit</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> Bash</span><span class="token punctuation" style="color:#393A34">]</span><br></div></code></pre></div></div>
<p><strong>2. reviewer — 代码审查，不改代码</strong></p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># .claude/agents/reviewer.yaml</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> reviewer</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">description</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 代码审查，侧重安全、性能、可维护性</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">prompt</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">|</span><span class="token scalar string" style="color:#e3116c"></span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">  你是一个代码审查助手。</span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">  你只读不改。收到 PR diff 或代码块后，按以下维度审查：</span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">  1. 安全隐患（SQL 注入、XSS、凭据泄露）</span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">  2. 性能问题（N+1 查询、不必要的循环、内存泄漏）</span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">  3. 可维护性（重复代码、命名、复杂度）</span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">  4. 测试覆盖（缺什么测试、怎么补）</span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">  每条问题标注严重程度：P0(必须修) / P1(建议修) / P2(可以以后修)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">model</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> claude</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">sonnet</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">4</span><span class="token punctuation" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">20260514</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">disallowedTools</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">Write</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> Edit</span><span class="token punctuation" style="color:#393A34">]</span><br></div></code></pre></div></div>
<p><strong>3. refactorer — 专注重构，全权限</strong></p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># .claude/agents/refactorer.yaml</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> refactorer  </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">description</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 代码重构 agent，处理有明确范围的重构任务</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">prompt</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">|</span><span class="token scalar string" style="color:#e3116c"></span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">  你是一个重构助手。</span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">  你接收一个明确的模块路径 + 重构目标。</span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">  规则：</span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">  - 重构前必须先在当前目录跑一次测试，确认基线通过</span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">  - 每次修改后跑相关测试，失败立即回退</span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">  - 不改模块边界之外的文件</span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">  - 重构完成后输出变更摘要</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">allowedTools</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">Read</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> Write</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> Edit</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> Bash</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> Glob</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> Grep</span><span class="token punctuation" style="color:#393A34">]</span><br></div></code></pre></div></div>
<p><strong>用法：</strong> 把这些文件放到项目根目录的 <code>.claude/agents/</code> 下，然后在 Claude Code 里用 <code>/agent researcher</code> 或 <code>/agent reviewer</code> 直接调。配置文件 Push 到仓库后团队都能用。</p>
<hr>
<p><strong>你现在用什么场景在用这些机制？踩过什么坑？评论区聊聊 :)</strong></p>
<hr>
<p><em>全文基于 Claude Code 实际使用 + 源码分析（forkedAgent.ts / sessionHooksRegistry / DynamicWorkflow testing 等），持续更新</em></p>]]></content>
        <author>
            <name>Booker Zhao</name>
            <uri>https://binggg.github.io</uri>
        </author>
        <category label="Claude Code" term="Claude Code"/>
        <category label="AI 编程" term="AI 编程"/>
        <category label="Agent" term="Agent"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[半年涨了 7 倍、连非程序员都在用的 Codex，从零到上线一个多人对战游戏]]></title>
        <id>https://binggg.github.io/blog/codex-getting-started-cloudbase</id>
        <link href="https://binggg.github.io/blog/codex-getting-started-cloudbase"/>
        <updated>2026-06-28T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Codex 从零上手到部署上线全攻略——五分钟做贪吃蛇、搞懂权限和插件、用国产模型省钱、CloudBase 一键部署多人对战游戏。]]></summary>
        <content type="html"><![CDATA[<blockquote>
<p>这篇文章帮你搞懂四件事：① Codex 是什么、能干什么 → ② 五分钟上手做个能玩的小游戏 → ③ 基本用法和核心功能 → ④ 接低成本的国产开源模型，把做好的应用发布上线，让别人能访问。</p>
<p><strong>赶时间？</strong> Codex 现在能接 DeepSeek、GLM 这些便宜模型了。<strong>想省钱 + 一键部署的，跳到第四步</strong>复制一段配置就行。想从头搞懂的，往下读。</p>
</blockquote>
<p><img decoding="async" loading="lazy" src="https://tcb-advanced-a656fc-1257967285.tcloudbaseapp.com/codex-article/images/scenes/codex-longform.png" alt="一图看懂 Codex：从它是什么，到配模型、装插件、写完上线" class="img_ev3q"></p>
<!-- -->
<p><img decoding="async" loading="lazy" src="https://binggg.github.io/assets/images/cover-6861aa1d80f56fc997360807c6d420c2.png" width="1312" height="736" class="img_ev3q">
<em>图：文章配图</em></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="第一步--先认识它">第一步 · 先认识它<a href="https://binggg.github.io/blog/codex-getting-started-cloudbase#%E7%AC%AC%E4%B8%80%E6%AD%A5--%E5%85%88%E8%AE%A4%E8%AF%86%E5%AE%83" class="hash-link" aria-label="第一步 · 先认识它的直接链接" title="第一步 · 先认识它的直接链接" translate="no">​</a></h2>
<p>Codex 是 OpenAI 推出的 AI 编程桌面工具，2026 年上半年周活从 60 万涨到了 <strong>500 万</strong>。涨得快，4 月 Sam Altman 直接在 X 上发帖"重置所有用户限额，每多 100 万再重置一次"。最值得注意的是：现在大约 <strong>20% 的用户根本不写代码</strong>，是产品、运营、做投资的人。</p>
<p>跟你的关系直接：6 月 18 日 OpenAI 放开了第三方模型，DeepSeek、GLM、Kimi 都能接——用便宜的国产模型跑，成本能压下来一大截。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="它跟-chatgpt-有啥不一样">它跟 ChatGPT 有啥不一样？<a href="https://binggg.github.io/blog/codex-getting-started-cloudbase#%E5%AE%83%E8%B7%9F-chatgpt-%E6%9C%89%E5%95%A5%E4%B8%8D%E4%B8%80%E6%A0%B7" class="hash-link" aria-label="它跟 ChatGPT 有啥不一样？的直接链接" title="它跟 ChatGPT 有啥不一样？的直接链接" translate="no">​</a></h3>
<p>不少人第一反应："这不就是个会写代码的 ChatGPT 吗？"差远了。</p>
<p>ChatGPT 是对话式的——你问它答，它给你建议，但活还得你自己干。Codex 直接在文件系统上工作。你告诉它"写一个贪吃蛇游戏"，它自己创建文件、装依赖、运行调试。</p>
<p>举个例子：你让 ChatGPT 写贪吃蛇，它给你一段代码，你得自己新建文件、粘贴、装库、运行、找错。你让 Codex 写贪吃蛇，它直接创建一个项目文件夹，生成代码，安装依赖，运行游戏。如果报错了，它会自己读错误信息，改完再跑，直到能玩为止。</p>
<p><strong>ChatGPT 是顾问，Codex 是帮你干活的。</strong></p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="第二步--五分钟上手做个能玩的小游戏">第二步 · 五分钟上手，做个能玩的小游戏<a href="https://binggg.github.io/blog/codex-getting-started-cloudbase#%E7%AC%AC%E4%BA%8C%E6%AD%A5--%E4%BA%94%E5%88%86%E9%92%9F%E4%B8%8A%E6%89%8B%E5%81%9A%E4%B8%AA%E8%83%BD%E7%8E%A9%E7%9A%84%E5%B0%8F%E6%B8%B8%E6%88%8F" class="hash-link" aria-label="第二步 · 五分钟上手，做个能玩的小游戏的直接链接" title="第二步 · 五分钟上手，做个能玩的小游戏的直接链接" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="装好它下载--登录--认识界面">装好它：下载 · 登录 · 认识界面<a href="https://binggg.github.io/blog/codex-getting-started-cloudbase#%E8%A3%85%E5%A5%BD%E5%AE%83%E4%B8%8B%E8%BD%BD--%E7%99%BB%E5%BD%95--%E8%AE%A4%E8%AF%86%E7%95%8C%E9%9D%A2" class="hash-link" aria-label="装好它：下载 · 登录 · 认识界面的直接链接" title="装好它：下载 · 登录 · 认识界面的直接链接" translate="no">​</a></h3>
<p>去 <a href="https://codex.com/" target="_blank" rel="noopener noreferrer" class="">codex.com</a> 下载桌面 App，用 OpenAI 账号登录。</p>
<p>界面不复杂，就三块：</p>
<ul>
<li class=""><strong>左侧</strong>：项目文件列表</li>
<li class=""><strong>中间</strong>：对话窗口 + 代码编辑器</li>
<li class=""><strong>右下</strong>：终端（能看到它在干什么）</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="第一个任务一句话让它做个贪吃蛇">第一个任务：一句话，让它做个贪吃蛇<a href="https://binggg.github.io/blog/codex-getting-started-cloudbase#%E7%AC%AC%E4%B8%80%E4%B8%AA%E4%BB%BB%E5%8A%A1%E4%B8%80%E5%8F%A5%E8%AF%9D%E8%AE%A9%E5%AE%83%E5%81%9A%E4%B8%AA%E8%B4%AA%E5%90%83%E8%9B%87" class="hash-link" aria-label="第一个任务：一句话，让它做个贪吃蛇的直接链接" title="第一个任务：一句话，让它做个贪吃蛇的直接链接" translate="no">​</a></h3>
<p>打开 Codex，在对话框里输入：</p>
<blockquote>
<p>用 Python 写一个贪吃蛇游戏，要用 pygame，能直接运行</p>
</blockquote>
<p>说完它就开始干了。注意看中间区域——它会先创建文件、写代码，然后自动运行。</p>
<p>可能第一次报错（比如没装 pygame），它会自己发现问题，装好依赖再试一次。最终你会看到一个窗口弹出来，贪吃蛇已经能跑了。</p>
<p>从打开 Codex 到玩上游戏，快的话 <strong>五分钟</strong>。</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="第三步--动手之前先搞懂这些">第三步 · 动手之前，先搞懂这些<a href="https://binggg.github.io/blog/codex-getting-started-cloudbase#%E7%AC%AC%E4%B8%89%E6%AD%A5--%E5%8A%A8%E6%89%8B%E4%B9%8B%E5%89%8D%E5%85%88%E6%90%9E%E6%87%82%E8%BF%99%E4%BA%9B" class="hash-link" aria-label="第三步 · 动手之前，先搞懂这些的直接链接" title="第三步 · 动手之前，先搞懂这些的直接链接" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-三档权限决定它能动你多少东西">① 三档权限：决定它能动你多少东西<a href="https://binggg.github.io/blog/codex-getting-started-cloudbase#-%E4%B8%89%E6%A1%A3%E6%9D%83%E9%99%90%E5%86%B3%E5%AE%9A%E5%AE%83%E8%83%BD%E5%8A%A8%E4%BD%A0%E5%A4%9A%E5%B0%91%E4%B8%9C%E8%A5%BF" class="hash-link" aria-label="① 三档权限：决定它能动你多少东西的直接链接" title="① 三档权限：决定它能动你多少东西的直接链接" translate="no">​</a></h3>
<p>Codex 有三档权限来控制它的行动范围：</p>
<ul>
<li class=""><strong>Clipboard Only</strong>：只读剪贴板，啥也动不了，安全但没用</li>
<li class=""><strong>Read &amp; Write Files</strong>：能读写文件，干活的基本盘</li>
<li class=""><strong>Admin</strong>：能装软件、改系统设置</li>
</ul>
<p>默认是 Read &amp; Write，日常够用了。做游戏、写代码、部署都用这个。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-插件--技能--mcp三个最容易搞混的词">② 插件 · 技能 · MCP：三个最容易搞混的词<a href="https://binggg.github.io/blog/codex-getting-started-cloudbase#-%E6%8F%92%E4%BB%B6--%E6%8A%80%E8%83%BD--mcp%E4%B8%89%E4%B8%AA%E6%9C%80%E5%AE%B9%E6%98%93%E6%90%9E%E6%B7%B7%E7%9A%84%E8%AF%8D" class="hash-link" aria-label="② 插件 · 技能 · MCP：三个最容易搞混的词的直接链接" title="② 插件 · 技能 · MCP：三个最容易搞混的词的直接链接" translate="no">​</a></h3>
<p>这三个不是同一个东西：</p>
<ul>
<li class=""><strong>插件（Plugin）</strong>：Codex 能调用的外部 API，比如连数据库、发消息、查天气。Codex 自己就内置了几十个。</li>
<li class=""><strong>Skill</strong>：教 Codex 怎么干活的一套指令。你写好一个 Skill，下次吩咐一句话，它就知道整套流程怎么走。</li>
<li class=""><strong>MCP Server</strong>：一个通用接口，让 Codex 能跟外部工具通信。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-招牌技能-skill教它一次以后一句话复用">③ 招牌技能 Skill：教它一次，以后一句话复用<a href="https://binggg.github.io/blog/codex-getting-started-cloudbase#-%E6%8B%9B%E7%89%8C%E6%8A%80%E8%83%BD-skill%E6%95%99%E5%AE%83%E4%B8%80%E6%AC%A1%E4%BB%A5%E5%90%8E%E4%B8%80%E5%8F%A5%E8%AF%9D%E5%A4%8D%E7%94%A8" class="hash-link" aria-label="③ 招牌技能 Skill：教它一次，以后一句话复用的直接链接" title="③ 招牌技能 Skill：教它一次，以后一句话复用的直接链接" translate="no">​</a></h3>
<p>举个例子，你想让 Codex 每次写代码时都跑测试、检查类型、格式化代码。写一个 Skill：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">## 代码质量规则</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">在完成任何代码修改后：</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">1. 运行 `npm test`，确保所有测试通过</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">2. 运行 `npx tsc --noEmit`，确保没有类型错误</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">3. 运行 `npx prettier --write .`，格式化代码</span><br></div></code></pre></div></div>
<p>存成 Skill，下次说"用我的质量规则跑一遍"，它就按你说的做。</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="插曲--它远不止写代码">插曲 · 它远不止写代码<a href="https://binggg.github.io/blog/codex-getting-started-cloudbase#%E6%8F%92%E6%9B%B2--%E5%AE%83%E8%BF%9C%E4%B8%8D%E6%AD%A2%E5%86%99%E4%BB%A3%E7%A0%81" class="hash-link" aria-label="插曲 · 它远不止写代码的直接链接" title="插曲 · 它远不止写代码的直接链接" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-定时自动干活">⏰ 定时自动干活<a href="https://binggg.github.io/blog/codex-getting-started-cloudbase#-%E5%AE%9A%E6%97%B6%E8%87%AA%E5%8A%A8%E5%B9%B2%E6%B4%BB" class="hash-link" aria-label="⏰ 定时自动干活的直接链接" title="⏰ 定时自动干活的直接链接" translate="no">​</a></h3>
<p>Codex 可以设定时任务：每天早上 9 点跑测试，每周一更新依赖。你睡觉的时候它帮你做这些杂活。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-一键部署网站">🚀 一键部署网站<a href="https://binggg.github.io/blog/codex-getting-started-cloudbase#-%E4%B8%80%E9%94%AE%E9%83%A8%E7%BD%B2%E7%BD%91%E7%AB%99" class="hash-link" aria-label="🚀 一键部署网站的直接链接" title="🚀 一键部署网站的直接链接" translate="no">​</a></h3>
<p>写好的网页，跟 Codex 说一声它就能部署。配上 MCP 插件，它能直接连云服务。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-手机远程遥控">📱 手机远程遥控<a href="https://binggg.github.io/blog/codex-getting-started-cloudbase#-%E6%89%8B%E6%9C%BA%E8%BF%9C%E7%A8%8B%E9%81%A5%E6%8E%A7" class="hash-link" aria-label="📱 手机远程遥控的直接链接" title="📱 手机远程遥控的直接链接" translate="no">​</a></h3>
<p>Codex 有手机 App，能随时看任务进度、发新指令。通勤路上看到 bug，直接手机发指令让它修。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-顺手生成文档和图片">📄 顺手生成文档和图片<a href="https://binggg.github.io/blog/codex-getting-started-cloudbase#-%E9%A1%BA%E6%89%8B%E7%94%9F%E6%88%90%E6%96%87%E6%A1%A3%E5%92%8C%E5%9B%BE%E7%89%87" class="hash-link" aria-label="📄 顺手生成文档和图片的直接链接" title="📄 顺手生成文档和图片的直接链接" translate="no">​</a></h3>
<p>画架构图、写更新日志、生成配图——都能干。</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="第四步--用便宜的国产模型把游戏部署上线">第四步 · 用便宜的国产模型，把游戏部署上线<a href="https://binggg.github.io/blog/codex-getting-started-cloudbase#%E7%AC%AC%E5%9B%9B%E6%AD%A5--%E7%94%A8%E4%BE%BF%E5%AE%9C%E7%9A%84%E5%9B%BD%E4%BA%A7%E6%A8%A1%E5%9E%8B%E6%8A%8A%E6%B8%B8%E6%88%8F%E9%83%A8%E7%BD%B2%E4%B8%8A%E7%BA%BF" class="hash-link" aria-label="第四步 · 用便宜的国产模型，把游戏部署上线的直接链接" title="第四步 · 用便宜的国产模型，把游戏部署上线的直接链接" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="先说那个坑想接国产模型省钱却卡住了">先说那个坑：想接国产模型省钱，却卡住了<a href="https://binggg.github.io/blog/codex-getting-started-cloudbase#%E5%85%88%E8%AF%B4%E9%82%A3%E4%B8%AA%E5%9D%91%E6%83%B3%E6%8E%A5%E5%9B%BD%E4%BA%A7%E6%A8%A1%E5%9E%8B%E7%9C%81%E9%92%B1%E5%8D%B4%E5%8D%A1%E4%BD%8F%E4%BA%86" class="hash-link" aria-label="先说那个坑：想接国产模型省钱，却卡住了的直接链接" title="先说那个坑：想接国产模型省钱，却卡住了的直接链接" translate="no">​</a></h3>
<p>Codex 默认用 OpenAI 自己的模型，对于日常开发完全够用。但如果你想跑大量自动化任务或者团队协作，Token 消耗很快就上去了。</p>
<p>6 月 18 日 Codex 开放了第三方模型接入。但有个问题：你要自己搞定 API Key、模型配置、部署环境。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="解法cloudbase配模型--装插件">解法：CloudBase（配模型 + 装插件）<a href="https://binggg.github.io/blog/codex-getting-started-cloudbase#%E8%A7%A3%E6%B3%95cloudbase%E9%85%8D%E6%A8%A1%E5%9E%8B--%E8%A3%85%E6%8F%92%E4%BB%B6" class="hash-link" aria-label="解法：CloudBase（配模型 + 装插件）的直接链接" title="解法：CloudBase（配模型 + 装插件）的直接链接" translate="no">​</a></h3>
<p>CloudBase 是腾讯云的 Serverless 平台，它的 AI Toolkit 正好解决了这个问题。</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="配模型5-分钟">配模型（5 分钟）<a href="https://binggg.github.io/blog/codex-getting-started-cloudbase#%E9%85%8D%E6%A8%A1%E5%9E%8B5-%E5%88%86%E9%92%9F" class="hash-link" aria-label="配模型（5 分钟）的直接链接" title="配模型（5 分钟）的直接链接" translate="no">​</a></h4>
<p>CloudBase 兼容 OpenAI 的和 Anthropic 的协议，DeepSeek、GLM、Kimi 用一个 Key 打通。配置好之后，Codex 里直接选国产模型就行，Token 成本能降到原来的十分之一以下。</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="装插件让它能直接部署">装插件（让它能直接部署）<a href="https://binggg.github.io/blog/codex-getting-started-cloudbase#%E8%A3%85%E6%8F%92%E4%BB%B6%E8%AE%A9%E5%AE%83%E8%83%BD%E7%9B%B4%E6%8E%A5%E9%83%A8%E7%BD%B2" class="hash-link" aria-label="装插件（让它能直接部署）的直接链接" title="装插件（让它能直接部署）的直接链接" translate="no">​</a></h4>
<p>CloudBase MCP 插件装了之后，Codex 就能直接在对话里把应用部署上线。不需要手动登录云控制台、配置域名、传文件。说一句"帮我部署到线上"，它就自动办完。</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="写在最后">写在最后<a href="https://binggg.github.io/blog/codex-getting-started-cloudbase#%E5%86%99%E5%9C%A8%E6%9C%80%E5%90%8E" class="hash-link" aria-label="写在最后的直接链接" title="写在最后的直接链接" translate="no">​</a></h2>
<p>Codex 这半年证明的事：<strong>AI 工具拼的早就不是"能不能答题"，而是"能不能把活干完、把东西交付出来"。</strong></p>
<p>对我这种普通人，真正的坎也不是"有没有便宜模型"，而是接进来麻烦、做完没地方部署。协议要对得上，上线要有地方落。踩完一圈，我现在的答案就是 CloudBase：三种协议都兼容，国产模型一个 Key 全打通，写完还能在同一个窗口里部署。</p>
<p><strong>别处的 Token Plan 只给你 Token，CloudBase 还给你上线的地方。</strong></p>
<hr>
<blockquote>
<p>你用过 Codex 吗？是拿它写代码，还是干别的活？评论区聊聊，我都会回。</p>
</blockquote>]]></content>
        <author>
            <name>Booker Zhao</name>
            <uri>https://binggg.github.io</uri>
        </author>
        <category label="AI" term="AI"/>
        <category label="全栈" term="全栈"/>
        <category label="CloudBase" term="CloudBase"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[你的 Agent 在云端需要认证？Device Flow 协议拆解]]></title>
        <id>https://binggg.github.io/blog/github-device-flow-deep-dive</id>
        <link href="https://binggg.github.io/blog/github-device-flow-deep-dive"/>
        <updated>2026-02-26T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[没有浏览器、没有 sudo，怎么在一台裸机上完成 GitHub 认证？这篇文章从一次踩坑出发拆了 RFC 8628 全协议。]]></summary>
        <content type="html"><![CDATA[<p>前阵子在一台 TencentOS 服务器上配 GitHub CLI——AI Agent 跑在上面，需要通过手机 IM 跟它对话。遇到了一个经典场景：</p>
<ul>
<li class="">没有浏览器（远程服务器，没图形界面）</li>
<li class="">没有 sudo 权限（只能装到自己 <code>~/bin</code>）</li>
<li class="">需要 <code>gh</code> 能正常认证、创建 PR</li>
<li class=""><strong>关键：不能把 Token 直接发给 Agent</strong>——不管走什么通道，Token 一旦进了 Agent 的上下文就会被记录、可能被写入日志、甚至出现在训练数据里</li>
</ul>
<p>传统 OAuth 流程要在浏览器里跳转。这里行不通。</p>
<p>第一个直觉是手动生成 Personal Access Token，<code>gh auth login --with-token</code> 灌进去。能用，但很麻烦——你要打开 GitHub 设置页、找到 Token 生成页面、选权限、复制、回到终端粘贴。隔几个月 Token 过期了，再来一遍。</p>
<p>我翻了翻 GitHub CLI 文档，发现它默认走的是一条不同的路：<strong>Device Flow</strong>（设备授权流）。执行 <code>gh auth login --web</code>，终端打印一串验证码，你去另外一台设备上打开 <code>github.com/login/device</code> 输入它，这边自动完成认证。</p>
<p>整个流程不到两分钟。当时觉得——这东西挺聪明的，值得拆开看看里面怎么跑的。</p>
<!-- -->
<p><img decoding="async" loading="lazy" src="https://binggg.github.io/assets/images/cover-1cecb518c48912355322e03adae4e4b7.png" width="1312" height="736" class="img_ev3q">
<em>图：文章配图</em></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="部署场景无-sudo-装-gh">部署场景：无 sudo 装 gh<a href="https://binggg.github.io/blog/github-device-flow-deep-dive#%E9%83%A8%E7%BD%B2%E5%9C%BA%E6%99%AF%E6%97%A0-sudo-%E8%A3%85-gh" class="hash-link" aria-label="部署场景：无 sudo 装 gh的直接链接" title="部署场景：无 sudo 装 gh的直接链接" translate="no">​</a></h2>
<p>先把环境搭起来。这台服务器的情况很典型：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain"># 无 sudo，手动装 gh</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">mkdir -p ~/bin</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">cd /tmp</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">curl -fsSL https://github.com/cli/cli/releases/download/v2.62.0/gh_2.62.0_linux_amd64.tar.gz -o gh.tar.gz</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">tar -xzf gh.tar.gz</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">cp gh_2.62.0_linux_amd64/bin/gh ~/bin/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo 'export PATH="$HOME/bin:$PATH"' &gt;&gt; ~/.bashrc</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">export PATH="$HOME/bin:$PATH"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">gh --version</span><br></div></code></pre></div></div>
<p>装完之后跑认证：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">gh auth login --web --hostname github.com --git-protocol https</span><br></div></code></pre></div></div>
<p>终端输出：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">! First copy your one-time code: BFEE-895F</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Open this URL to continue in your web browser: https://github.com/login/device</span><br></div></code></pre></div></div>
<p>我在笔记本上打开链接，输入验证码，点击授权。回到终端按回车——</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">✓ Authentication complete.</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">✓ Logged in as binggg</span><br></div></code></pre></div></div>
<p>结束了。没有配 SSH 密钥，没有手动填 Token，没有 <code>sudo</code>。</p>
<p>但这里有个细节我盯了很久：<strong>终端只是打印了一串验证码然后开始轮询，是怎么知道我在浏览器上完成了授权的？</strong> 这一段通信完全发生在客户端和 GitHub 服务器之间，浏览器全程没跟终端说过一句话。</p>
<p>这就是 Device Flow 有意思的地方。</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="设备授权把登录从设备上抽走">设备授权：把"登录"从设备上抽走<a href="https://binggg.github.io/blog/github-device-flow-deep-dive#%E8%AE%BE%E5%A4%87%E6%8E%88%E6%9D%83%E6%8A%8A%E7%99%BB%E5%BD%95%E4%BB%8E%E8%AE%BE%E5%A4%87%E4%B8%8A%E6%8A%BD%E8%B5%B0" class="hash-link" aria-label="设备授权：把&quot;登录&quot;从设备上抽走的直接链接" title="设备授权：把&quot;登录&quot;从设备上抽走的直接链接" translate="no">​</a></h2>
<p>Device Flow 的核心想法其实很简单。</p>
<p>传统 OAuth 授权码流程假设用户有一个浏览器，应用可以重定向用户到授权页面再跳回来。但智能电视、CLI 工具、IoT 设备——这些设备根本没有浏览器，或者有浏览器但输入 URL 极其痛苦。</p>
<p>解决方式：<strong>让用户在另一台设备上完成授权，设备自己轮询等结果。</strong></p>
<p>我后来翻了 RFC 8628 标准文档，发现整个流程可以拆成四个步骤：</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-1设备请求验证码">Step 1：设备请求验证码<a href="https://binggg.github.io/blog/github-device-flow-deep-dive#step-1%E8%AE%BE%E5%A4%87%E8%AF%B7%E6%B1%82%E9%AA%8C%E8%AF%81%E7%A0%81" class="hash-link" aria-label="Step 1：设备请求验证码的直接链接" title="Step 1：设备请求验证码的直接链接" translate="no">​</a></h3>
<p>CLI 向授权服务器发一个 POST，告诉它"我想走设备流认证"：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">POST https://github.com/login/device/code</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">client_id=xxx&amp;scope=repo,gist</span><br></div></code></pre></div></div>
<p>服务器返回一堆东西：</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"device_code"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"3584d83530557fdd1f46af8289938c8ef79f9dc5"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"user_code"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"BFEE-895F"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"verification_uri"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"https://github.com/login/device"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"expires_in"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">900</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"interval"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">5</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p>关键就三个字段：</p>
<ul>
<li class=""><strong><code>user_code</code></strong>（BFEE-895F）— 你要手动输入的那个验证码，8 字符，人类友好</li>
<li class=""><strong><code>device_code</code></strong>（40 字符）— 客户端内部用的，不展示给用户</li>
<li class=""><strong><code>interval</code></strong>（5 秒）— 服务器建议的轮询间隔</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-2你去浏览器干活">Step 2：你去浏览器干活<a href="https://binggg.github.io/blog/github-device-flow-deep-dive#step-2%E4%BD%A0%E5%8E%BB%E6%B5%8F%E8%A7%88%E5%99%A8%E5%B9%B2%E6%B4%BB" class="hash-link" aria-label="Step 2：你去浏览器干活的直接链接" title="Step 2：你去浏览器干活的直接链接" translate="no">​</a></h3>
<p>终端打印验证码，你在手机上打开 <code>github.com/login/device</code>，输入它。这时候浏览器和 GitHub 服务器之间走了完整的 OAuth 授权——你登录、看权限、点 Authorize。</p>
<p>注意：<strong>这一步跟终端没有任何直接通信</strong>。你手机浏览器不知道终端的存在，终端也不知道你在手机上干了什么。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-3设备不断轮询">Step 3：设备不断轮询<a href="https://binggg.github.io/blog/github-device-flow-deep-dive#step-3%E8%AE%BE%E5%A4%87%E4%B8%8D%E6%96%AD%E8%BD%AE%E8%AF%A2" class="hash-link" aria-label="Step 3：设备不断轮询的直接链接" title="Step 3：设备不断轮询的直接链接" translate="no">​</a></h3>
<p>这是最巧妙的一步。终端不知道你什么时候点完授权，所以它每隔 5 秒问一次服务器："他点了吗？"</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">POST /login/oauth/access_token</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">device_code=xxx&amp;grant_type=urn:ietf:params:oauth:grant-type:device_code</span><br></div></code></pre></div></div>
<p>没点完：</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token property" style="color:#36acaa">"error"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"authorization_pending"</span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p>你点了：</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token property" style="color:#36acaa">"access_token"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"gho_16C7e42F292c6912E7710c838347Ae178B4a"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"scope"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"repo,gist"</span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p>轮询不是无线循环。<code>device_code</code> 只有 15 分钟有效期，超时了要重新来。客户端收到 <code>expired_token</code> 错误就必须停下来报错。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-4拿着-token-干活">Step 4：拿着 Token 干活<a href="https://binggg.github.io/blog/github-device-flow-deep-dive#step-4%E6%8B%BF%E7%9D%80-token-%E5%B9%B2%E6%B4%BB" class="hash-link" aria-label="Step 4：拿着 Token 干活的直接链接" title="Step 4：拿着 Token 干活的直接链接" translate="no">​</a></h3>
<p>拿到 token 之后就跟普通 OAuth 一样了：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">curl -H "Authorization: Bearer gho_xxx" https://api.github.com/user</span><br></div></code></pre></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="轮询策略客户端的礼貌有多重要">轮询策略：客户端的"礼貌"有多重要？<a href="https://binggg.github.io/blog/github-device-flow-deep-dive#%E8%BD%AE%E8%AF%A2%E7%AD%96%E7%95%A5%E5%AE%A2%E6%88%B7%E7%AB%AF%E7%9A%84%E7%A4%BC%E8%B2%8C%E6%9C%89%E5%A4%9A%E9%87%8D%E8%A6%81" class="hash-link" aria-label="轮询策略：客户端的&quot;礼貌&quot;有多重要？的直接链接" title="轮询策略：客户端的&quot;礼貌&quot;有多重要？的直接链接" translate="no">​</a></h2>
<p>实际写轮询代码时，<code>interval</code> 和错误处理上有一些我没想到的门道。</p>
<p>RFC 8628 定义了 5 种错误码，每个对应不同的客户端行为：</p>
<table><thead><tr><th>错误码</th><th>含义</th><th>客户端该怎么处理</th></tr></thead><tbody><tr><td><code>authorization_pending</code></td><td>用户还没点</td><td>等 <code>interval</code> 秒再试</td></tr><tr><td><code>slow_down</code></td><td>你问太快了</td><td><strong>额外等 5 秒</strong>，后续用新间隔</td></tr><tr><td><code>expired_token</code></td><td>15 分钟超时</td><td>停下来，告诉用户要重新开始</td></tr><tr><td><code>access_denied</code></td><td>用户点了拒绝</td><td>停下来，别继续了</td></tr><tr><td><code>invalid_grant</code></td><td>设备码无效</td><td>可能是 bug，报错</td></tr></tbody></table>
<p><code>slow_down</code> 是我觉得最体贴的设计——很多协议限流就直接 429 断连接了，Device Flow 专门留了一个错误码告诉客户端"不是不让你问，是慢一点问"。实现时收到这个错误要在当前间隔基础上加 5 秒。</p>
<p>正确的轮询代码大概长这样：</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> time</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> requests</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">def</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">poll_for_token</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">device_code</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> client_id</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> interval</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">5</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    timeout </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">900</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    elapsed </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">while</span><span class="token plain"> elapsed </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain"> timeout</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        r </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> requests</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">post</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token string" style="color:#e3116c">"https://github.com/login/oauth/access_token"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            data</span><span class="token operator" style="color:#393A34">=</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token string" style="color:#e3116c">"client_id"</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> client_id</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token string" style="color:#e3116c">"device_code"</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> device_code</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token string" style="color:#e3116c">"grant_type"</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"urn:ietf:params:oauth:grant-type:device_code"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            headers</span><span class="token operator" style="color:#393A34">=</span><span class="token punctuation" style="color:#393A34">{</span><span class="token string" style="color:#e3116c">"Accept"</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"application/json"</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        data </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> r</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">json</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"access_token"</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">in</span><span class="token plain"> data</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> data</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"access_token"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        err </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> data</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">get</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"error"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> err </span><span class="token operator" style="color:#393A34">==</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"authorization_pending"</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            time</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sleep</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">interval</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            elapsed </span><span class="token operator" style="color:#393A34">+=</span><span class="token plain"> interval</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">elif</span><span class="token plain"> err </span><span class="token operator" style="color:#393A34">==</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"slow_down"</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            interval </span><span class="token operator" style="color:#393A34">+=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">5</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># 加 5 秒</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            time</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sleep</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">interval</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            elapsed </span><span class="token operator" style="color:#393A34">+=</span><span class="token plain"> interval</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">elif</span><span class="token plain"> err </span><span class="token keyword" style="color:#00009f">in</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"expired_token"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"access_denied"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token keyword" style="color:#00009f">raise</span><span class="token plain"> Exception</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string-interpolation string" style="color:#e3116c">f"授权失败: </span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">{</span><span class="token string-interpolation interpolation">err</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">}</span><span class="token string-interpolation string" style="color:#e3116c">"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">else</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token keyword" style="color:#00009f">raise</span><span class="token plain"> Exception</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string-interpolation string" style="color:#e3116c">f"未知错误: </span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">{</span><span class="token string-interpolation interpolation">err</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">}</span><span class="token string-interpolation string" style="color:#e3116c">"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">raise</span><span class="token plain"> Exception</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"授权超时"</span><span class="token punctuation" style="color:#393A34">)</span><br></div></code></pre></div></div>
<p>有两个点容易被忽略：</p>
<ol>
<li class=""><strong>收到 <code>slow_down</code> 后，新增的 5 秒是永久累加的</strong>。不是恢复原来的间隔，而是从 <code>interval + 5</code> 开始。这是 RFC 8628 的要求。</li>
<li class=""><strong>轮询期间理论上可以展示进度反馈</strong>。<code>gh auth login</code> 默认是在等，实现里可以加个 spinner 或者倒计时，至少让人知道程序还在跑。</li>
</ol>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="device-flow-vs-传统-oauth">Device Flow vs 传统 OAuth<a href="https://binggg.github.io/blog/github-device-flow-deep-dive#device-flow-vs-%E4%BC%A0%E7%BB%9F-oauth" class="hash-link" aria-label="Device Flow vs 传统 OAuth的直接链接" title="Device Flow vs 传统 OAuth的直接链接" translate="no">​</a></h2>
<p>读完 RFC 8628 后我画了一张对比表：</p>
<table><thead><tr><th></th><th>授权码流程</th><th>Device Flow</th></tr></thead><tbody><tr><td>适用场景</td><td>Web/移动 App</td><td>CLI / IoT / 无头设备</td></tr><tr><td>要不要浏览器</td><td>必须，在同一台设备</td><td>不需要，可在另一台设备</td></tr><tr><td>授权方式</td><td>浏览器自动跳转</td><td>用户手动输入验证码</td></tr><tr><td>回调机制</td><td>服务器接 code 参数</td><td>客户端轮询</td></tr><tr><td><code>client_secret</code></td><td>必需</td><td>不需要（公开客户端）</td></tr><tr><td>用户体验</td><td>流畅，无感</td><td>多设备切换，需手动输入</td></tr></tbody></table>
<p>GitHub CLI 选择 Device Flow 的理由很实际：CLI 可能跑在 Docker 容器、CI 环境、跳板机——这些地方没有浏览器，配回调 URL 也麻烦。Device Flow 不需要注册回调地址，也不需要保管 <code>client_secret</code>（CLI 二进制的 <code>client_secret</code> 本来也保不住），对 CLI 工具来说是最省心的方案。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="安全问题验证码只有-8-位够吗">安全问题：验证码只有 8 位，够吗？<a href="https://binggg.github.io/blog/github-device-flow-deep-dive#%E5%AE%89%E5%85%A8%E9%97%AE%E9%A2%98%E9%AA%8C%E8%AF%81%E7%A0%81%E5%8F%AA%E6%9C%89-8-%E4%BD%8D%E5%A4%9F%E5%90%97" class="hash-link" aria-label="安全问题：验证码只有 8 位，够吗？的直接链接" title="安全问题：验证码只有 8 位，够吗？的直接链接" translate="no">​</a></h2>
<p>第一反应是觉得 8 位验证码太短了。但读了 RFC 8628 的设计理由之后，理解了这个长度的权衡。</p>
<p>8 位字符的熵是 20^8 ≈ 2^34.5 位（字符集只用了大写字母去掉易混淆字符，共 20 个）。单独看不算高，但配合几个限制就够用了：</p>
<ol>
<li class=""><strong>有效期 15 分钟</strong> — 窗口很短</li>
<li class=""><strong>提交限流</strong> — 每小时最多 50 次验证码尝试</li>
<li class=""><strong><code>device_code</code> 一次性</strong> — 一个设备码对应一个令牌，用完即废</li>
</ol>
<p>真正的安全风险不在验证码长度，而在<strong>远程钓鱼</strong>。攻击者可以伪造一个页面让人输入验证码，然后用自己的账号完成授权。GitHub 的缓解方式是授权页面上显示设备类型、IP 地址、权限列表，让用户有信息做判断。</p>
<p>Token 存储是另一个容易被忽略的点。<code>gh</code> 把 Token 存到 <code>~/.config/gh/hosts.yml</code>，权限设 <code>chmod 600</code>。如果你自己写工具调用 Device Flow，不要往 shell 历史里塞 token，也不要明文存文件。macOS 可以用 Keychain，Linux 可以用 Secret Service：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain"># macOS</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">security add-generic-password -a "$USER" -s "github_token" -w "gho_xxx"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Linux</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">secret-tool store --label="GitHub Token" service github user "$USER"</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="device-flow-为什么是-ai-agent-的最佳认证方案">Device Flow 为什么是 AI Agent 的最佳认证方案<a href="https://binggg.github.io/blog/github-device-flow-deep-dive#device-flow-%E4%B8%BA%E4%BB%80%E4%B9%88%E6%98%AF-ai-agent-%E7%9A%84%E6%9C%80%E4%BD%B3%E8%AE%A4%E8%AF%81%E6%96%B9%E6%A1%88" class="hash-link" aria-label="Device Flow 为什么是 AI Agent 的最佳认证方案的直接链接" title="Device Flow 为什么是 AI Agent 的最佳认证方案的直接链接" translate="no">​</a></h2>
<p>写这篇文章的时候我其实在解决另一个问题：Agent 跑在远端服务器上，我通过微信跟它对话。Agent 要调用 GitHub API 来操作仓库、创建 PR、管理 issues——但怎么安全地给它授权？</p>
<p>最直觉的做法是把 Token 发到微信聊天里。这也是最危险的。</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">IM 发 Token 的路径：</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  你 → [ 微信服务器 ] → [ 聊天记录 ] → [ Agent 上下文 ]</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                                            ↓</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                                     每一层都能看到你的 Token</span><br></div></code></pre></div></div>
<p>Token 一旦进了聊天记录，IM 服务器有一份、本地聊天记录有一份、Agent 的消息上下文里也有一份。而且 Token 不会过期——拿到一次就能一直用。</p>
<p>Device Flow 解决了这个问题：<strong>你的机器从不接触 Token。</strong></p>
<p>它的思路是这样的：</p>
<ol>
<li class="">Agent 打印一串验证码（<code>BFEE-895F</code>）到聊天里</li>
<li class="">你打开 <code>github.com/login/device</code>——这是 GitHub 的官方授权页，不是 Agent 给你的链接</li>
<li class="">输入验证码，在 GitHub 的页面上完成授权</li>
<li class="">Token 直接从 GitHub 服务器发给 Agent（server-to-server）</li>
</ol>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">Device Flow 的路径：</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  Agent 打印验证码 → 你看到</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        ↓</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  你打开 github.com/login/device → 输入验证码 → 完成 OAuth</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        ↓</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  Token 直接从 GitHub 到 Agent（server-to-server，不经过任何中间层）</span><br></div></code></pre></div></div>
<p>你的 IM 里只有一段 8 位验证码（15 分钟有效，用完作废）。Token 从头到尾没有经过你的聊天记录。</p>
<p>后来想想，如果你的 Agent 也需要在远端认证——Device Flow 差不多是唯一不用把密钥喂进聊天记录的办法了。</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-彩蛋">🥚 彩蛋<a href="https://binggg.github.io/blog/github-device-flow-deep-dive#-%E5%BD%A9%E8%9B%8B" class="hash-link" aria-label="🥚 彩蛋的直接链接" title="🥚 彩蛋的直接链接" translate="no">​</a></h2>
<p>如果你也经常需要配远程服务器的 GitHub 认证，我写了一段脚本——一条命令走完"下载 gh + 认证 + 配置 git 用户"全流程：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain"># remote-gh-setup.sh</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># 在远程服务器上跑：curl -fsSL https://gist.github.com/binggg/xxx/remote-gh-setup.sh | bash</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># 然后在你自己的电脑上打开 https://github.com/login/device 输入验证码</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">set -e</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># 1. 装 gh 到 ~/bin</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">mkdir -p ~/bin</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">curl -fsSL https://github.com/cli/cli/releases/latest/download/gh_*_linux_amd64.tar.gz \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  | tar -xz -C /tmp</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">cp /tmp/gh_*/bin/gh ~/bin/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo 'export PATH="$HOME/bin:$PATH"' &gt;&gt; ~/.bashrc</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">export PATH="$HOME/bin:$PATH"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># 2. 启动 Device Flow 认证</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">gh auth login --web --git-protocol https</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># 3. 配 git user</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">gh api user --jq '.login' | xargs -I{} git config --global user.name "{}"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">gh api user --jq '.email // .login + "@users.noreply.github.com"' | xargs -I{} git config --global user.email "{}"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo "✅ Done! Logged in as $(gh api user --jq '.login')"</span><br></div></code></pre></div></div>
<p>这个脚本覆盖了我上一篇踩坑的全部流程。如果你那里还有我没遇到过的环境限制，评论区聊聊。</p>
<hr>
<p>你的 Agent 在远端怎么认证的？是自己配的 Token 还是走了 Device Flow？评论区聊聊 👇</p>
<p><em>全文基于 GitHub CLI v2.62.0、RFC 8628（2019年8月发布）和一次实际部署验证。</em></p>]]></content>
        <author>
            <name>Booker Zhao</name>
            <uri>https://binggg.github.io</uri>
        </author>
        <category label="GitHub" term="GitHub"/>
        <category label="OAuth" term="OAuth"/>
        <category label="Device Flow" term="Device Flow"/>
        <category label="CLI" term="CLI"/>
        <category label="RFC" term="RFC"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[AI 编程的下半场：别让 AI 写的代码只活在 localhost 里]]></title>
        <id>https://binggg.github.io/blog/2026/01/22/agent-skills-practice</id>
        <link href="https://binggg.github.io/blog/2026/01/22/agent-skills-practice"/>
        <updated>2026-01-22T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[给 AI 配了 Skills 还是只管自己写？踩了几个月坑，我发现最折磨人的不是 AI 不会写代码，而是它写的代码只能活在本地。分享怎么把技能激活率从 20% 拉到 84%。]]></summary>
        <content type="html"><![CDATA[<p>最近折腾 Agent Skills 有一阵子了。实战下来最折磨人的不是 AI 不会写代码，而是它写的代码**"只能活在本地"<strong>，以及它</strong>总是不听规矩**。</p>
<p>这篇文章主要分享两件事：</p>
<ol>
<li class=""><strong>让 AI 生成的代码能真正上线</strong> — AI 写的代码 Demo 感十足，一上线就全是安全隐患。问题是 AI 不感知真实的后端底座。</li>
<li class=""><strong>解决"AI 有 Skill 却不爱用"的毛病</strong> — 明明配好了 Skills，AI 却视而不见，非要凭直觉盲干。技能激活率从 20% 硬拉到 84% 的方法。</li>
</ol>
<!-- -->
<p><img decoding="async" loading="lazy" src="https://binggg.github.io/assets/images/cover-338afdfb305981990354dce6a3b19076.png" width="1312" height="736" class="img_ev3q">
<em>图：文章配图</em></p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="vibe-coding-的本地舒适区">Vibe Coding 的"本地舒适区"<a href="https://binggg.github.io/blog/2026/01/22/agent-skills-practice#vibe-coding-%E7%9A%84%E6%9C%AC%E5%9C%B0%E8%88%92%E9%80%82%E5%8C%BA" class="hash-link" aria-label="Vibe Coding 的&quot;本地舒适区&quot;的直接链接" title="Vibe Coding 的&quot;本地舒适区&quot;的直接链接" translate="no">​</a></h2>
<p>最近大家都在享受 Vibe Coding 的快感。在 <code>localhost</code> 一顿操作，UI 漂亮得像成品，但魔法往往在"上线"瞬间戛然而止。</p>
<p>AI 的代码逻辑还不错，但它无法感知真实的生产环境，导致生成的"局部最优解"难以落地。</p>
<p><strong>世界上最遥远的距离，是从 <code>localhost</code> 到真实访问的距离。</strong> AI 填补了代码量的空白，却填补不了工程底座的断层。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="什么是-skills">什么是 Skills<a href="https://binggg.github.io/blog/2026/01/22/agent-skills-practice#%E4%BB%80%E4%B9%88%E6%98%AF-skills" class="hash-link" aria-label="什么是 Skills的直接链接" title="什么是 Skills的直接链接" translate="no">​</a></h2>
<p>Skills 最早是 Anthropic 在 2025 年 10 月给 Claude Code 加的一个功能。它是一套包含指令、脚本和资源的能力包——<strong>把专业知识、步骤、代码打包成"技能包"。</strong></p>
<div class="language-directory codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-directory codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">my-skill/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">├── SKILL.md          # 核心：指令 + 元数据</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">├── scripts/          # 可选：可执行代码</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">├── references/       # 可选：参考文档</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">└── assets/           # 可选：模板、资源</span><br></div></code></pre></div></div>
<p>如果把 AI 比作高材生，Skills 就是他的<strong>岗位操作手册</strong>。它不改变 AI 的智商，但通过注入程序性知识（Procedural Knowledge），让 AI 知道在你的特定环境下，"正确且高效"的操作标准是什么。</p>
<p>Agent Skills 在 2025 年 12 月正式成为开放规范，目前 Claude、Cursor、VS Code、GitHub Copilot、OpenCode 等主流 AI 开发工具都已宣布兼容支持。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="渐进式加载">渐进式加载<a href="https://binggg.github.io/blog/2026/01/22/agent-skills-practice#%E6%B8%90%E8%BF%9B%E5%BC%8F%E5%8A%A0%E8%BD%BD" class="hash-link" aria-label="渐进式加载的直接链接" title="渐进式加载的直接链接" translate="no">​</a></h3>
<p>Skills 通过<strong>渐进式加载</strong>来高效管理上下文：</p>
<ol>
<li class=""><strong>发现阶段</strong>：启动时，Agent 仅加载每个 Skill 的名称和描述。这足以判断哪些 Skill 相关，而不耗尽上下文窗口。</li>
<li class=""><strong>激活阶段</strong>：当任务匹配描述时，Agent 按需将完整 <code>SKILL.md</code> 读入上下文。</li>
<li class=""><strong>执行阶段</strong>：Agent 遵循指令执行，按需加载引用文件或运行脚本。</li>
</ol>
<p>这种设计让 Agent 保持高速响应的同时，像"随身携带百科全书"——用的时候再翻开。</p>
<p>行业里已经有团队在推动这件事。Vercel 发布了 <code>react-best-practices</code> 解决 AI 乱写 React 的问题；Remotion 推出了视频制作 Skill 让 AI 学会用代码"剪辑"视频。这些 Skills 解决的核心问题是：<strong>让 AI 拥有特定领域的"工程直觉"。</strong></p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="最大难题ai-为什么会装死">最大难题：AI 为什么会"装死"？<a href="https://binggg.github.io/blog/2026/01/22/agent-skills-practice#%E6%9C%80%E5%A4%A7%E9%9A%BE%E9%A2%98ai-%E4%B8%BA%E4%BB%80%E4%B9%88%E4%BC%9A%E8%A3%85%E6%AD%BB" class="hash-link" aria-label="最大难题：AI 为什么会&quot;装死&quot;？的直接链接" title="最大难题：AI 为什么会&quot;装死&quot;？的直接链接" translate="no">​</a></h2>
<p>给 AI 配了 Skill，它视而不见。这是几个月里最让我头疼的事。背后的原因其实涉及大模型的两个底层逻辑：</p>
<p><strong>注意力稀释</strong>：在大模型的 Transformer 架构里，它根据你的 Prompt 实时计算每个词的权重。对话越深入，业务需求的权重越高，作为背景板的 Skills 权重就会被"稀释"。</p>
<p><strong>决策惰性</strong>：调用 Skill 本质上是一次工具调用。模型在推理时会算账：如果它觉得自己脑子里的预训练数据就能生成一段"看起来正确"的代码，它就会为了省推理资源而跳过外部工具调用。</p>
<p><strong>结果很残酷</strong>：在我们的回归测试中，如果不加干预，AI 的主动 Skill 调用率只有 <strong>20%</strong> 左右。它宁愿"盲目裸奔"，也不愿意翻书。</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="驯服-ai-的三套解法">"驯服" AI 的三套解法<a href="https://binggg.github.io/blog/2026/01/22/agent-skills-practice#%E9%A9%AF%E6%9C%8D-ai-%E7%9A%84%E4%B8%89%E5%A5%97%E8%A7%A3%E6%B3%95" class="hash-link" aria-label="&quot;驯服&quot; AI 的三套解法的直接链接" title="&quot;驯服&quot; AI 的三套解法的直接链接" translate="no">​</a></h2>
<p>既然 AI 有决策惰性，就得用工程手段拉高它的"警觉性"。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-首行注入最土但最稳">1. 首行注入（最土但最稳）<a href="https://binggg.github.io/blog/2026/01/22/agent-skills-practice#1-%E9%A6%96%E8%A1%8C%E6%B3%A8%E5%85%A5%E6%9C%80%E5%9C%9F%E4%BD%86%E6%9C%80%E7%A8%B3" class="hash-link" aria-label="1. 首行注入（最土但最稳）的直接链接" title="1. 首行注入（最土但最稳）的直接链接" translate="no">​</a></h3>
<p>如果项目不容许犯错，在提问的最开头带上这句"咒语"：</p>
<blockquote>
<p><strong>You MUST read the guideline skill FIRST when working with this project.</strong></p>
</blockquote>
<p><strong>原理</strong>：利用首因效应。模型对输入序列最前端的信息有天然的高关注度。这种强行注入能把 Skill 的激活率拉到可用水平。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-项目级家法system-rules">2. 项目级"家法"（System Rules）<a href="https://binggg.github.io/blog/2026/01/22/agent-skills-practice#2-%E9%A1%B9%E7%9B%AE%E7%BA%A7%E5%AE%B6%E6%B3%95system-rules" class="hash-link" aria-label="2. 项目级&quot;家法&quot;（System Rules）的直接链接" title="2. 项目级&quot;家法&quot;（System Rules）的直接链接" translate="no">​</a></h3>
<p>在项目根目录创建 <code>CLAUDE.md</code> 或 <code>AGENT.md</code>，增加项目级别的约束规则：</p>
<div class="language-markdown codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-markdown codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token title important punctuation" style="color:#393A34">#</span><span class="token title important"> Project Workflow</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">0.</span><span class="token plain"> You MUST read the guideline skill FIRST when working with this project.</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">1.</span><span class="token plain"> 评估：写代码前，必须显式评估可用 Skills 列表。</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">2.</span><span class="token plain"> 承诺：必须在输出中陈述"我需要调用某个 Skill"的理由。</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">3.</span><span class="token plain"> 执行：禁止跳过规矩直接写代码。</span><br></div></code></pre></div></div>
<p>这个方法不用每次都在 prompt 里写"咒语"了，但缺陷也很明显：随着对话上下文变长，AI 仍然可能忽略规则。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-强制拦截forced-eval-hook">3. 强制拦截（Forced Eval Hook）<a href="https://binggg.github.io/blog/2026/01/22/agent-skills-practice#3-%E5%BC%BA%E5%88%B6%E6%8B%A6%E6%88%AAforced-eval-hook" class="hash-link" aria-label="3. 强制拦截（Forced Eval Hook）的直接链接" title="3. 强制拦截（Forced Eval Hook）的直接链接" translate="no">​</a></h3>
<p>如果前两个方案是靠"嘴"叮嘱 AI，那方案 3 就是<strong>物理拦截</strong>。</p>
<p>技术专家 Scott Spence 在他的实测中发现，最有效的方式是利用编辑器的 Hook（钩子）机制。配置一个 <code>.claude/settings.json</code>，脚本会在你按下回车的那一刻，自动拦截并"魔改"你的问题——强制 AI 在输出任何代码前，必须先写一段评估报告：</p>
<ul>
<li class="">当前有哪些 Skill 可用？</li>
<li class="">针对这个需求，需不需要调用它们？理由是什么？</li>
</ul>
<p>AI 有个毛病：只要觉得脑子里的旧数据能糊弄过去，它就不会翻书。这种 Hook 强迫 AI 白纸黑字写下"我要用这个工具"，一旦它在开头表了态，后面的代码生成就会严格遵守。</p>
<p><strong>效果</strong>：Skill 激活率从 <strong>20% 暴力拉升到 84%</strong>。</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="架构复盘一个总纲--n-个独立-skill">架构复盘：一个总纲 + N 个独立 Skill<a href="https://binggg.github.io/blog/2026/01/22/agent-skills-practice#%E6%9E%B6%E6%9E%84%E5%A4%8D%E7%9B%98%E4%B8%80%E4%B8%AA%E6%80%BB%E7%BA%B2--n-%E4%B8%AA%E7%8B%AC%E7%AB%8B-skill" class="hash-link" aria-label="架构复盘：一个总纲 + N 个独立 Skill的直接链接" title="架构复盘：一个总纲 + N 个独立 Skill的直接链接" translate="no">​</a></h2>
<p>在开发 Skills 的过程中，我发现 AI 最大的毛病是**"环境不分"**——它分不清 Web、小程序和 Node.js 的边界。没有搞"全家桶"式的单体 Skill，而是采用了 <strong>1 个总纲 + N 个独立 Skill</strong> 的分布式架构。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="解决语义污染">解决"语义污染"<a href="https://binggg.github.io/blog/2026/01/22/agent-skills-practice#%E8%A7%A3%E5%86%B3%E8%AF%AD%E4%B9%89%E6%B1%A1%E6%9F%93" class="hash-link" aria-label="解决&quot;语义污染&quot;的直接链接" title="解决&quot;语义污染&quot;的直接链接" translate="no">​</a></h3>
<p>Web、小程序、Node.js 的 SDK 方法名极其相似。如果全塞进一个 Skill，AI 经常在写小程序逻辑时掏出 Web 端的语法。这种<strong>语义污染</strong>是代码无法上线的元凶。</p>
<p>解法是按端物理拆分。配合一个总纲 Skill 作为入口点，先指挥 AI 判定项目环境。环境判定后，AI 只会加载相关的子 Skill，干扰项直接屏蔽掉。<strong>搜索空间缩小了 90%，推理精度自然大幅提升。</strong></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="支持精准点菜">支持"精准点菜"<a href="https://binggg.github.io/blog/2026/01/22/agent-skills-practice#%E6%94%AF%E6%8C%81%E7%B2%BE%E5%87%86%E7%82%B9%E8%8F%9C" class="hash-link" aria-label="支持&quot;精准点菜&quot;的直接链接" title="支持&quot;精准点菜&quot;的直接链接" translate="no">​</a></h3>
<p>全能包太重了。当你想让 AI 专门解决一个特定问题时（比如"微信支付"或"安全规则"），AI 的注意力会被庞大的全量手册稀释。</p>
<p>独立插件支持局部强化。你可以直接下令："调用 auth 插件看怎么实现手机号登录"。这种设计允许直接干预 AI 的决策路径——在 AI 逻辑混乱时，通过唤起特定子 Skill 强行把它的思维拉回到正确的窄道上。</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="写在最后">写在最后<a href="https://binggg.github.io/blog/2026/01/22/agent-skills-practice#%E5%86%99%E5%9C%A8%E6%9C%80%E5%90%8E" class="hash-link" aria-label="写在最后的直接链接" title="写在最后的直接链接" translate="no">​</a></h2>
<p>折腾了这么久的 Skills，最大的感触是：<strong>AI 编程的生产力，不取决于模型能写出多么精妙的逻辑，而取决于你对它生成的代码具备多少工程约束力。</strong></p>
<p>几点观察：</p>
<p><strong>核心本质：把隐性经验转化为程序性知识。</strong> 目前的 Agent 是博学的实习生，对真实生产环境缺乏敬畏。Skills 的本质是给它注入一套工程化的"肌肉记忆"——把多年积累的填坑经验转化为 AI 的前置判定条件。</p>
<p><strong>范式转换：Agent 必须具备环境感知力。</strong> Agent 进化的下一站，不仅仅是推理能力的增强，更是对基础设施感知力的补齐。Skills 守住工程下限，底座承载逻辑上限。</p>
<p><strong>确定性是唯一度量衡。</strong> 不应该期待 AI 自动变得"完美"，而应该通过工程手段让它变得"稳定"。AI 提供逻辑的上限，工程约束守住交付的下限。</p>
<p>如果你也在折腾 Skills，最有价值的一件事就是：<strong>先测一下你的 AI 到底有没有真的在用它们。</strong> 20% 的默认激活率不丢人，但不知道这个数字才丢人。</p>]]></content>
        <author>
            <name>Booker Zhao</name>
            <uri>https://binggg.github.io</uri>
        </author>
        <category label="AI" term="AI"/>
        <category label="agent" term="agent"/>
        <category label="skills" term="skills"/>
        <category label="prompt-engineering" term="prompt-engineering"/>
        <category label="claude-code" term="claude-code"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[如何生成"不油腻"的 AI 图片：3 套去油风格方案]]></title>
        <id>https://binggg.github.io/blog/2026/01/13/ai-image-deoiling-guide</id>
        <link href="https://binggg.github.io/blog/2026/01/13/ai-image-deoiling-guide"/>
        <updated>2026-01-13T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[自己做了 AI 生图大半年，踩过最多的坑不是模型不好用，而是图片一眼能看出来是 AI 画的。这篇总结了三套经过验证的去油方案。]]></summary>
        <content type="html"><![CDATA[<p>一开始用 AI 生图的时候，我自己没有太在意风格。Midjourney 默认输出什么样，我就用什么样：光影浓郁、细节饱满、色彩鲜艳。结果配到文章里怎么看怎么不对——不是画得不好，是<strong>太像 AI 画的了</strong>。</p>
<p>后来我花了不少时间在 prompt 里调参数做减法，试了好几套风格方案，慢慢摸索出一些规律。回头想想，去掉 AI 味的核心其实很简单：<strong>做减法、加纹理、扁平化、低饱和度。</strong></p>
<p>下面这三套方案是实战下来最稳的，直接贴 prompt 后缀就能用。</p>
<!-- -->
<p><img decoding="async" loading="lazy" src="https://binggg.github.io/assets/images/cover-c6ca999b30ee5d4476c2b49ea67500a4.png" width="1312" height="736" class="img_ev3q">
<em>图：文章配图</em></p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="为什么-ai-图片会油腻">为什么 AI 图片会"油腻"？<a href="https://binggg.github.io/blog/2026/01/13/ai-image-deoiling-guide#%E4%B8%BA%E4%BB%80%E4%B9%88-ai-%E5%9B%BE%E7%89%87%E4%BC%9A%E6%B2%B9%E8%85%BB" class="hash-link" aria-label="为什么 AI 图片会&quot;油腻&quot;？的直接链接" title="为什么 AI 图片会&quot;油腻&quot;？的直接链接" translate="no">​</a></h2>
<p>你有没有发现，很多 AI 生成的图片虽然看起来很"完美"，但总有一种说不出的"塑料感"？</p>
<p>这就是我们常说的"AI 味道"和"油腻感"。它们通常来自于：</p>
<ul>
<li class=""><strong>过度的光影渲染</strong>：高光、反光、阴影太刻意</li>
<li class=""><strong>过于完美的细节</strong>：每个像素都太精致，缺少真实感</li>
<li class=""><strong>高饱和度的色彩</strong>：颜色太鲜艳，显得不自然</li>
<li class=""><strong>典型的 3D 建模感</strong>：像游戏引擎渲染出来的，而不是人画的</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="举个常见的例子">举个常见的例子<a href="https://binggg.github.io/blog/2026/01/13/ai-image-deoiling-guide#%E4%B8%BE%E4%B8%AA%E5%B8%B8%E8%A7%81%E7%9A%84%E4%BE%8B%E5%AD%90" class="hash-link" aria-label="举个常见的例子的直接链接" title="举个常见的例子的直接链接" translate="no">​</a></h3>
<p>假设你要为"读书"主题配图，如果使用默认的 AI 提示词，可能会生成这样的图片：</p>
<p><img decoding="async" loading="lazy" src="https://lowcode-7ga9n95g35f90bf2-1306394842.tcloudbaseapp.com/ralph-article/reading-oily.png" alt="" class="img_ev3q"></p>
<p><strong>问题在哪里？</strong></p>
<ul>
<li class="">光影太戏剧化，像电影海报</li>
<li class="">细节过于完美，每个角落都很精致</li>
<li class="">3D 渲染感太强，像游戏场景</li>
<li class="">整体感觉"太假"，缺少真实感</li>
</ul>
<p><strong>想要去"油"且友好？核心策略很简单：做减法、加纹理、扁平化、低饱和度。</strong></p>
<p>下面为你整理了 <strong>3 套可以直接用的风格方案</strong>，用同样的"读书"主题，看看不油腻的版本：</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="方案一极简矢量扁平风">方案一：极简矢量扁平风<a href="https://binggg.github.io/blog/2026/01/13/ai-image-deoiling-guide#%E6%96%B9%E6%A1%88%E4%B8%80%E6%9E%81%E7%AE%80%E7%9F%A2%E9%87%8F%E6%89%81%E5%B9%B3%E9%A3%8E" class="hash-link" aria-label="方案一：极简矢量扁平风的直接链接" title="方案一：极简矢量扁平风的直接链接" translate="no">​</a></h2>
<p><strong>适合：</strong> 科技博客、职场干货、产品介绍</p>
<p>这是最安全、最现代的风格。它去除了所有不必要的立体感，就像 Notion 的插画或者大厂 UI 设计那样，干净、简洁、专业。</p>
<p><strong>看起来像什么：</strong> 干净、大面积留白、几何形状、哑光质感，就像你在 Apple 官网或者 Notion 里看到的那些插画。</p>
<p><strong>通用提示词后缀 (Prompt Suffix)：</strong></p>
<blockquote>
<p><strong>English:</strong> <code>flat vector illustration, minimal style, corporate memphis, simple shapes, 2D, white background, wide margins, clean lines, matte finish, low saturation, soft pastel colors, no shading, Behance style --ar 16:9</code></p>
</blockquote>
<blockquote>
<p><strong>中文释义：</strong> 扁平矢量插画，极简风格，企业孟菲斯风格，简单形状，2D，白底，宽边距，线条干净，哑光表面，低饱和度，柔和的粉彩色，无阴影，Behance 风格。</p>
</blockquote>
<p><strong>示例对比：</strong></p>
<p>同样的"读书"主题，使用扁平风格后：</p>
<p><img decoding="async" loading="lazy" src="https://lowcode-7ga9n95g35f90bf2-1306394842.tcloudbaseapp.com/ralph-article/reading-flat.png" alt="" class="img_ev3q"></p>
<p><strong>对比油腻版本：</strong> 去掉了 3D 渲染感，没有复杂的光影，简洁干净，专业感强。</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="方案二手绘蜡笔水彩风">方案二：手绘蜡笔/水彩风<a href="https://binggg.github.io/blog/2026/01/13/ai-image-deoiling-guide#%E6%96%B9%E6%A1%88%E4%BA%8C%E6%89%8B%E7%BB%98%E8%9C%A1%E7%AC%94%E6%B0%B4%E5%BD%A9%E9%A3%8E" class="hash-link" aria-label="方案二：手绘蜡笔/水彩风的直接链接" title="方案二：手绘蜡笔/水彩风的直接链接" translate="no">​</a></h2>
<p><strong>适合：</strong> 生活感悟、读书笔记、情感故事</p>
<p>这种风格通过模拟真实的画材（蜡笔、铅笔、水彩），引入人为的"瑕疵感"和"噪点"，彻底消除 AI 的塑料光滑感，显得非常有温度。</p>
<p><strong>看起来像什么：</strong> 就像你在儿童绘本里看到的那种插画，粗糙的纹理、温暖的色调、有点不完美的边缘，但特别有亲和力。</p>
<p><strong>通用提示词后缀 (Prompt Suffix)：</strong></p>
<blockquote>
<p><strong>English:</strong> <code>hand-drawn sketch, crayon texture, watercolor style, children's book illustration, rough edges, textured paper, visible brush strokes, warm tones, cozy atmosphere, simple composition, cute and friendly --ar 16:9</code></p>
</blockquote>
<blockquote>
<p><strong>中文释义：</strong> 手绘素描，蜡笔纹理，水彩风格，儿童绘本插画，边缘粗糙，纹理纸张，可见笔触，暖色调，舒适氛围，构图简单，可爱友好。</p>
</blockquote>
<p><strong>示例对比：</strong></p>
<p>同样的"读书"主题，使用手绘风格后：</p>
<p><img decoding="async" loading="lazy" src="https://lowcode-7ga9n95g35f90bf2-1306394842.tcloudbaseapp.com/ralph-article/reading-handdrawn.png" alt="" class="img_ev3q"></p>
<p><strong>对比油腻版本：</strong> 有了真实的纹理和笔触，温暖的色调，就像真的手绘作品，特别有亲和力。</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="方案三复古孔版印刷风-risograph">方案三：复古孔版印刷风 (Risograph)<a href="https://binggg.github.io/blog/2026/01/13/ai-image-deoiling-guide#%E6%96%B9%E6%A1%88%E4%B8%89%E5%A4%8D%E5%8F%A4%E5%AD%94%E7%89%88%E5%8D%B0%E5%88%B7%E9%A3%8E-risograph" class="hash-link" aria-label="方案三：复古孔版印刷风 (Risograph)的直接链接" title="方案三：复古孔版印刷风 (Risograph)的直接链接" translate="no">​</a></h2>
<p><strong>适合：</strong> 观点文章、文艺评论、创意设计</p>
<p>这是目前去 AI 味的大杀器。Risograph（孔版印刷）风格强制使用有限的色彩和颗粒感，会让图片看起来像是有年代感的印刷品，非常高级且完全不油腻。</p>
<p><strong>看起来像什么：</strong> 就像独立杂志或者艺术海报，有颗粒感、双色或三色套印、复古的错位感，特别有文艺范儿。</p>
<p><strong>通用提示词后缀 (Prompt Suffix)：</strong></p>
<blockquote>
<p><strong>English:</strong> <code>Risograph style, grain and noise, screen print texture, limited color palette (blue and orange), halftone pattern, abstract minimalism, vintage aesthetic, matte paper texture, high contrast, flat illustration --ar 16:9</code></p>
</blockquote>
<blockquote>
<p><strong>中文释义：</strong> 孔版印刷风格，颗粒和噪点，丝网印刷纹理，限制色板（如蓝和橙），半调图案，抽象极简，复古美学，哑光纸质感，高对比度，扁平插画。</p>
</blockquote>
<p><strong>示例对比：</strong></p>
<p>同样的"读书"主题，使用 Risograph 风格后：</p>
<p><img decoding="async" loading="lazy" src="https://lowcode-7ga9n95g35f90bf2-1306394842.tcloudbaseapp.com/ralph-article/reading-risograph.png" alt="" class="img_ev3q"></p>
<p><strong>对比油腻版本：</strong> 有了颗粒感和印刷质感，限定的色彩让画面更高级，完全摆脱了 3D 渲染的塑料感。</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-核心去油魔法词">💡 核心"去油"魔法词<a href="https://binggg.github.io/blog/2026/01/13/ai-image-deoiling-guide#-%E6%A0%B8%E5%BF%83%E5%8E%BB%E6%B2%B9%E9%AD%94%E6%B3%95%E8%AF%8D" class="hash-link" aria-label="💡 核心&quot;去油&quot;魔法词的直接链接" title="💡 核心&quot;去油&quot;魔法词的直接链接" translate="no">​</a></h2>
<p>如果你想自己微调风格，下面这些词是必用的"去油神器"：</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-材质控制-必选">1. 材质控制 (必选)<a href="https://binggg.github.io/blog/2026/01/13/ai-image-deoiling-guide#1-%E6%9D%90%E8%B4%A8%E6%8E%A7%E5%88%B6-%E5%BF%85%E9%80%89" class="hash-link" aria-label="1. 材质控制 (必选)的直接链接" title="1. 材质控制 (必选)的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><code>Matte</code> (哑光，去反光)</li>
<li class=""><code>Grainy / Noise</code> (噪点，增加真实感)</li>
<li class=""><code>Textured paper</code> (纸张纹理)</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-光影控制">2. 光影控制<a href="https://binggg.github.io/blog/2026/01/13/ai-image-deoiling-guide#2-%E5%85%89%E5%BD%B1%E6%8E%A7%E5%88%B6" class="hash-link" aria-label="2. 光影控制的直接链接" title="2. 光影控制的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><code>Flat lighting</code> (平光，避免戏剧性光影)</li>
<li class=""><code>Soft shadows</code> (柔和阴影)</li>
<li class=""><code>Natural light</code> (自然光)</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-负向提示词告诉-ai-不要画什么">3. 负向提示词（告诉 AI 不要画什么）<a href="https://binggg.github.io/blog/2026/01/13/ai-image-deoiling-guide#3-%E8%B4%9F%E5%90%91%E6%8F%90%E7%A4%BA%E8%AF%8D%E5%91%8A%E8%AF%89-ai-%E4%B8%8D%E8%A6%81%E7%94%BB%E4%BB%80%E4%B9%88" class="hash-link" aria-label="3. 负向提示词（告诉 AI 不要画什么）的直接链接" title="3. 负向提示词（告诉 AI 不要画什么）的直接链接" translate="no">​</a></h3>
<p>这非常重要！把这些词填入 Negative Prompt 框，告诉 AI 避免这些"油腻"元素：</p>
<blockquote>
<p><code>photorealistic, 3d render, octane render, unreal engine, shiny, glossy, reflection, hyper detailed, neon lights, cyberpunk, plastic looking, oily skin, complex background</code></p>
</blockquote>
<p><strong>简单理解：</strong> 就是告诉 AI "不要画得太真实、太 3D、太闪亮、太复杂"。</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="实战示例同一个主题三种风格">实战示例：同一个主题，三种风格<a href="https://binggg.github.io/blog/2026/01/13/ai-image-deoiling-guide#%E5%AE%9E%E6%88%98%E7%A4%BA%E4%BE%8B%E5%90%8C%E4%B8%80%E4%B8%AA%E4%B8%BB%E9%A2%98%E4%B8%89%E7%A7%8D%E9%A3%8E%E6%A0%BC" class="hash-link" aria-label="实战示例：同一个主题，三种风格的直接链接" title="实战示例：同一个主题，三种风格的直接链接" translate="no">​</a></h2>
<p>假设你要写一篇关于 <strong>"如何高效管理时间"</strong> 的文章，来看看三种风格的区别：</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="使用方案一-扁平风-的组合方式">使用方案一 (扁平风) 的组合方式：<a href="https://binggg.github.io/blog/2026/01/13/ai-image-deoiling-guide#%E4%BD%BF%E7%94%A8%E6%96%B9%E6%A1%88%E4%B8%80-%E6%89%81%E5%B9%B3%E9%A3%8E-%E7%9A%84%E7%BB%84%E5%90%88%E6%96%B9%E5%BC%8F" class="hash-link" aria-label="使用方案一 (扁平风) 的组合方式：的直接链接" title="使用方案一 (扁平风) 的组合方式：的直接链接" translate="no">​</a></h3>
<blockquote>
<p><strong>Prompt:</strong> <code>A person organizing giant clock gears, happy expression, working on a desk</code> + <code>flat vector illustration, minimal style, simple shapes, 2D, white background, clean lines, matte finish, soft pastel colors, no shading --ar 16:9</code></p>
</blockquote>
<p><img decoding="async" loading="lazy" src="https://lowcode-7ga9n95g35f90bf2-1306394842.tcloudbaseapp.com/ralph-article/time-management-flat.png" alt="" class="img_ev3q"></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="使用方案二-手绘风-的组合方式">使用方案二 (手绘风) 的组合方式：<a href="https://binggg.github.io/blog/2026/01/13/ai-image-deoiling-guide#%E4%BD%BF%E7%94%A8%E6%96%B9%E6%A1%88%E4%BA%8C-%E6%89%8B%E7%BB%98%E9%A3%8E-%E7%9A%84%E7%BB%84%E5%90%88%E6%96%B9%E5%BC%8F" class="hash-link" aria-label="使用方案二 (手绘风) 的组合方式：的直接链接" title="使用方案二 (手绘风) 的组合方式：的直接链接" translate="no">​</a></h3>
<blockquote>
<p><strong>Prompt:</strong> <code>A cute clock and a cup of coffee on a wooden table, sunlight</code> + <code>hand-drawn sketch, crayon texture, children's book illustration, rough edges, textured paper, warm tones, cozy atmosphere --ar 16:9</code></p>
</blockquote>
<p><img decoding="async" loading="lazy" src="https://lowcode-7ga9n95g35f90bf2-1306394842.tcloudbaseapp.com/ralph-article/time-management-handdrawn.png" alt="" class="img_ev3q"></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="使用方案三-risograph-风-的组合方式">使用方案三 (Risograph 风) 的组合方式：<a href="https://binggg.github.io/blog/2026/01/13/ai-image-deoiling-guide#%E4%BD%BF%E7%94%A8%E6%96%B9%E6%A1%88%E4%B8%89-risograph-%E9%A3%8E-%E7%9A%84%E7%BB%84%E5%90%88%E6%96%B9%E5%BC%8F" class="hash-link" aria-label="使用方案三 (Risograph 风) 的组合方式：的直接链接" title="使用方案三 (Risograph 风) 的组合方式：的直接链接" translate="no">​</a></h3>
<blockquote>
<p><strong>Prompt:</strong> <code>Abstract clock design with calendar elements</code> + <code>Risograph style, grain and noise, screen print texture, limited color palette (blue and orange), halftone pattern, abstract minimalism, vintage aesthetic --ar 16:9</code></p>
</blockquote>
<p><img decoding="async" loading="lazy" src="https://lowcode-7ga9n95g35f90bf2-1306394842.tcloudbaseapp.com/ralph-article/time-management-risograph.png" alt="" class="img_ev3q"></p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="实用技巧">实用技巧<a href="https://binggg.github.io/blog/2026/01/13/ai-image-deoiling-guide#%E5%AE%9E%E7%94%A8%E6%8A%80%E5%B7%A7" class="hash-link" aria-label="实用技巧的直接链接" title="实用技巧的直接链接" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-混搭风格">1. 混搭风格<a href="https://binggg.github.io/blog/2026/01/13/ai-image-deoiling-guide#1-%E6%B7%B7%E6%90%AD%E9%A3%8E%E6%A0%BC" class="hash-link" aria-label="1. 混搭风格的直接链接" title="1. 混搭风格的直接链接" translate="no">​</a></h3>
<p>你可以把不同风格的提示词组合起来，创造出独特的视觉效果：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">主体描述 + 风格A的关键词 + 风格B的材质词</span><br></div></code></pre></div></div>
<p><strong>举个例子：</strong></p>
<blockquote>
<p><code>A person reading a book</code> + <code>flat vector illustration</code> + <code>crayon texture, rough edges</code></p>
</blockquote>
<p>这样就能得到"扁平风格但带手绘质感"的图片。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-如果颜色还是太鲜艳">2. 如果颜色还是太鲜艳<a href="https://binggg.github.io/blog/2026/01/13/ai-image-deoiling-guide#2-%E5%A6%82%E6%9E%9C%E9%A2%9C%E8%89%B2%E8%BF%98%E6%98%AF%E5%A4%AA%E9%B2%9C%E8%89%B3" class="hash-link" aria-label="2. 如果颜色还是太鲜艳的直接链接" title="2. 如果颜色还是太鲜艳的直接链接" translate="no">​</a></h3>
<p>可以加上这些词：</p>
<ul>
<li class=""><code>desaturated</code> (去饱和)</li>
<li class=""><code>muted colors</code> (柔和色彩)</li>
<li class=""><code>pastel palette</code> (粉彩色板)</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-避免过度细节">3. 避免过度细节<a href="https://binggg.github.io/blog/2026/01/13/ai-image-deoiling-guide#3-%E9%81%BF%E5%85%8D%E8%BF%87%E5%BA%A6%E7%BB%86%E8%8A%82" class="hash-link" aria-label="3. 避免过度细节的直接链接" title="3. 避免过度细节的直接链接" translate="no">​</a></h3>
<p>如果 AI 画得太复杂，加上这些：</p>
<ul>
<li class=""><code>simple composition</code> (简单构图)</li>
<li class=""><code>minimal details</code> (最少细节)</li>
<li class=""><code>focus on main subject</code> (聚焦主体)</li>
</ul>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="总结5-个去油原则">总结：5 个去油原则<a href="https://binggg.github.io/blog/2026/01/13/ai-image-deoiling-guide#%E6%80%BB%E7%BB%935-%E4%B8%AA%E5%8E%BB%E6%B2%B9%E5%8E%9F%E5%88%99" class="hash-link" aria-label="总结：5 个去油原则的直接链接" title="总结：5 个去油原则的直接链接" translate="no">​</a></h2>
<p>去"AI 味道"的核心其实很简单：<strong>让图片看起来像人画的，而不是机器渲染的</strong>。</p>
<p>记住这 5 个原则：</p>
<ol>
<li class="">✅ <strong>加纹理</strong>：纸张、画布、噪点，增加真实感</li>
<li class="">✅ <strong>减细节</strong>：不要过度完美，留点"瑕疵"</li>
<li class="">✅ <strong>降饱和度</strong>：柔和色彩比鲜艳色彩更友好</li>
<li class="">✅ <strong>扁平化</strong>：避免 3D 立体感，2D 更自然</li>
<li class="">✅ <strong>哑光处理</strong>：去除高光和反光，避免"塑料感"</li>
</ol>
<p><strong>记住：不完美才是真实，真实才最友好。</strong></p>]]></content>
        <author>
            <name>Booker Zhao</name>
            <uri>https://binggg.github.io</uri>
        </author>
        <category label="AI" term="AI"/>
        <category label="image-generation" term="image-generation"/>
        <category label="prompt-engineering" term="prompt-engineering"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Vibe Coding 不是迷思：非技术人员也能用 AI 做出真正可用的应用]]></title>
        <id>https://binggg.github.io/blog/vibe-coding-non-technical</id>
        <link href="https://binggg.github.io/blog/vibe-coding-non-technical"/>
        <updated>2026-01-09T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[你是否遇到过这样的困扰：用 AI 生成应用时，代码出错了却不知道问什么问题？AI 给了 N 个解决方案，但不知道哪个是对的？]]></summary>
        <content type="html"><![CDATA[<p><strong>你是否遇到过这样的困扰：用 AI 生成应用时，代码出错了却不知道问什么问题？AI 给了 N 个解决方案，但不知道哪个是对的？</strong></p>
<p>很多非技术人员在用 AI 编程时都会遇到这样的痛点：</p>
<ul>
<li class=""><strong>Debug 困难</strong>：页面显示异常，但不知道问题出在哪一层（前端？后端？还是部署？）</li>
<li class=""><strong>提问不准确</strong>：不知道如何描述问题，让 AI 能理解并给出准确答案</li>
<li class=""><strong>学习路径模糊</strong>：知道需要学一些基础，但不知道从哪开始，学什么才够用</li>
</ul>
<p><strong>今天，我将为你分享一套系统的方法，从基础概念到调试技巧，再到后端方案，让你从"能生成应用"到"能做出真正可用的应用"。</strong></p>
<!-- -->
<p><img decoding="async" loading="lazy" src="https://binggg.github.io/assets/images/cover-57fef602b8f9b9bfcd2dbd69b7edc7dc.png" width="1312" height="736" class="img_ev3q">
<em>图：文章配图</em></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="问题的本质为什么-debug-这么难">问题的本质：为什么 Debug 这么难？<a href="https://binggg.github.io/blog/vibe-coding-non-technical#%E9%97%AE%E9%A2%98%E7%9A%84%E6%9C%AC%E8%B4%A8%E4%B8%BA%E4%BB%80%E4%B9%88-debug-%E8%BF%99%E4%B9%88%E9%9A%BE" class="hash-link" aria-label="问题的本质：为什么 Debug 这么难？的直接链接" title="问题的本质：为什么 Debug 这么难？的直接链接" translate="no">​</a></h2>
<p>你遇到的问题其实是一个问题的两面：<strong>debug 困难，不知道问什么问题</strong>。</p>
<p>这是因为：</p>
<ol>
<li class=""><strong>不知道问题出在哪一层</strong>：前端？后端？还是部署？</li>
<li class=""><strong>不知道如何描述问题</strong>：让 AI 能理解你的真实情况</li>
<li class=""><strong>不知道该怎么学习</strong>：可能也知道一些调试方法，但不够系统</li>
</ol>
<p><strong>核心问题</strong>：缺乏系统的基础概念，导致无法准确诊断和描述问题。</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="解决方案一系统学习基础概念">解决方案一：系统学习基础概念<a href="https://binggg.github.io/blog/vibe-coding-non-technical#%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88%E4%B8%80%E7%B3%BB%E7%BB%9F%E5%AD%A6%E4%B9%A0%E5%9F%BA%E7%A1%80%E6%A6%82%E5%BF%B5" class="hash-link" aria-label="解决方案一：系统学习基础概念的直接链接" title="解决方案一：系统学习基础概念的直接链接" translate="no">​</a></h2>
<p>这是最关键的。很多人用 AI 编程，直接就开始写代码，但不知道基础概念，出错了也不知道问什么问题。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="为什么需要学习基础概念">为什么需要学习基础概念？<a href="https://binggg.github.io/blog/vibe-coding-non-technical#%E4%B8%BA%E4%BB%80%E4%B9%88%E9%9C%80%E8%A6%81%E5%AD%A6%E4%B9%A0%E5%9F%BA%E7%A1%80%E6%A6%82%E5%BF%B5" class="hash-link" aria-label="为什么需要学习基础概念？的直接链接" title="为什么需要学习基础概念？的直接链接" translate="no">​</a></h3>
<p>你不需要成为专家，但需要理解：</p>
<ol>
<li class=""><strong>前端 vs 后端</strong>：用户看到的是前端，处理数据的是后端</li>
<li class=""><strong>请求 vs 响应</strong>：你的浏览器向服务器请求数据，服务器返回结果</li>
<li class=""><strong>本地 vs 线上</strong>：在你电脑上跑的叫"本地"，在服务器上跑的才叫"线上"</li>
</ol>
<p>这些概念不懂，出错了你连描述都描述不清。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="具体做法">具体做法<a href="https://binggg.github.io/blog/vibe-coding-non-technical#%E5%85%B7%E4%BD%93%E5%81%9A%E6%B3%95" class="hash-link" aria-label="具体做法的直接链接" title="具体做法的直接链接" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-打开-frontend-roadmap">1. 打开 Frontend Roadmap<a href="https://binggg.github.io/blog/vibe-coding-non-technical#1-%E6%89%93%E5%BC%80-frontend-roadmap" class="hash-link" aria-label="1. 打开 Frontend Roadmap的直接链接" title="1. 打开 Frontend Roadmap的直接链接" translate="no">​</a></h4>
<p>访问 <a href="https://roadmap.sh/frontend" target="_blank" rel="noopener noreferrer" class="">developer-roadmap</a>，这不是让你去学所有东西，而是用来<strong>了解全貌</strong>。</p>
<ul>
<li class="">看一遍，不需要全部理解</li>
<li class="">用 AI 解释你不懂的概念</li>
<li class="">重点理解：HTML/CSS/JavaScript/浏览器如何工作</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-用-ai-帮你理解概念">2. 用 AI 帮你理解概念<a href="https://binggg.github.io/blog/vibe-coding-non-technical#2-%E7%94%A8-ai-%E5%B8%AE%E4%BD%A0%E7%90%86%E8%A7%A3%E6%A6%82%E5%BF%B5" class="hash-link" aria-label="2. 用 AI 帮你理解概念的直接链接" title="2. 用 AI 帮你理解概念的直接链接" translate="no">​</a></h4>
<p>不理解 HTTP 请求是什么？直接问 AI：</p>
<blockquote>
<p>"请用最简单的语言解释 HTTP 请求是什么，用餐厅点餐做比喻"</p>
</blockquote>
<p>AI 会结合你的经验，给你最贴切的解释。</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-边学边实践">3. 边学边实践<a href="https://binggg.github.io/blog/vibe-coding-non-technical#3-%E8%BE%B9%E5%AD%A6%E8%BE%B9%E5%AE%9E%E8%B7%B5" class="hash-link" aria-label="3. 边学边实践的直接链接" title="3. 边学边实践的直接链接" translate="no">​</a></h4>
<ul>
<li class="">不要求全部学完再开始</li>
<li class="">遇到问题就回头查</li>
<li class=""><strong>用项目驱动学习</strong></li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="核心概念前端阶段">核心概念（前端阶段）<a href="https://binggg.github.io/blog/vibe-coding-non-technical#%E6%A0%B8%E5%BF%83%E6%A6%82%E5%BF%B5%E5%89%8D%E7%AB%AF%E9%98%B6%E6%AE%B5" class="hash-link" aria-label="核心概念（前端阶段）的直接链接" title="核心概念（前端阶段）的直接链接" translate="no">​</a></h3>
<ol>
<li class=""><strong>HTML 结构</strong>：网页骨架，标签语义</li>
<li class=""><strong>CSS 样式</strong>：颜色、布局、响应式</li>
<li class=""><strong>JavaScript 行为</strong>：交互、数据请求</li>
<li class=""><strong>浏览器开发者工具</strong>：调试利器，查看错误和网络请求</li>
<li class=""><strong>控制台错误</strong>：理解错误信息</li>
<li class=""><strong>网络请求</strong>：前端如何和后端交互</li>
</ol>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="为什么这样做有效">为什么这样做有效？<a href="https://binggg.github.io/blog/vibe-coding-non-technical#%E4%B8%BA%E4%BB%80%E4%B9%88%E8%BF%99%E6%A0%B7%E5%81%9A%E6%9C%89%E6%95%88" class="hash-link" aria-label="为什么这样做有效？的直接链接" title="为什么这样做有效？的直接链接" translate="no">​</a></h3>
<p>当你理解了这些基础概念，你就能：</p>
<ul>
<li class="">准确描述问题："我的前端页面发起的请求，后端返回了 500 错误"</li>
<li class="">理解 AI 给出的解决方案："AI 说要在后端添加 CORS 配置，我理解这是跨域问题"</li>
<li class="">判断哪个方案适合你：而不是让 AI 给 N 个方案，你猜哪个对</li>
</ul>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="解决方案二系统掌握调试技巧">解决方案二：系统掌握调试技巧<a href="https://binggg.github.io/blog/vibe-coding-non-technical#%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88%E4%BA%8C%E7%B3%BB%E7%BB%9F%E6%8E%8C%E6%8F%A1%E8%B0%83%E8%AF%95%E6%8A%80%E5%B7%A7" class="hash-link" aria-label="解决方案二：系统掌握调试技巧的直接链接" title="解决方案二：系统掌握调试技巧的直接链接" translate="no">​</a></h2>
<p>有了基础概念，下一步是学会调试。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="调试方法体系">调试方法体系<a href="https://binggg.github.io/blog/vibe-coding-non-technical#%E8%B0%83%E8%AF%95%E6%96%B9%E6%B3%95%E4%BD%93%E7%B3%BB" class="hash-link" aria-label="调试方法体系的直接链接" title="调试方法体系的直接链接" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-查看控制台错误">1. 查看控制台错误<a href="https://binggg.github.io/blog/vibe-coding-non-technical#1-%E6%9F%A5%E7%9C%8B%E6%8E%A7%E5%88%B6%E5%8F%B0%E9%94%99%E8%AF%AF" class="hash-link" aria-label="1. 查看控制台错误的直接链接" title="1. 查看控制台错误的直接链接" translate="no">​</a></h4>
<p>按 F12 或者右键 → 检查 → Console</p>
<p>控制台会显示红色的错误信息，<strong>这是最直接的调试入口</strong>。</p>
<p>常见错误：</p>
<ul>
<li class=""><code>Uncaught ReferenceError: xxx is not defined</code> — 某个变量没定义</li>
<li class=""><code>Cannot read properties of undefined</code> — 尝试读取未定义的对象属性</li>
<li class=""><code>NetworkError</code> — 网络请求失败</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-截图反馈">2. 截图反馈<a href="https://binggg.github.io/blog/vibe-coding-non-technical#2-%E6%88%AA%E5%9B%BE%E5%8F%8D%E9%A6%88" class="hash-link" aria-label="2. 截图反馈的直接链接" title="2. 截图反馈的直接链接" translate="no">​</a></h4>
<p>遇到问题时，截图 + 控制台错误信息一起发给 AI。</p>
<p><strong>好的提问方式</strong>：</p>
<blockquote>
<p>"我的页面在点击登录按钮后没有反应，控制台显示 'Uncaught TypeError: Cannot read properties of null (reading 'addEventListener')'，这是什么问题？"</p>
</blockquote>
<p><strong>不好的提问方式</strong>：</p>
<blockquote>
<p>"我的页面出错了，帮我看看。"</p>
</blockquote>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-系统化调试流程">3. 系统化调试流程<a href="https://binggg.github.io/blog/vibe-coding-non-technical#3-%E7%B3%BB%E7%BB%9F%E5%8C%96%E8%B0%83%E8%AF%95%E6%B5%81%E7%A8%8B" class="hash-link" aria-label="3. 系统化调试流程的直接链接" title="3. 系统化调试流程的直接链接" translate="no">​</a></h4>
<ol>
<li class=""><strong>观察现象</strong>：发生了什么？截图 + 描述</li>
<li class=""><strong>查看控制台</strong>：按 F12，看 Console 有没有红色错误</li>
<li class=""><strong>复制错误</strong>：把控制台的错误信息复制出来</li>
<li class=""><strong>提供上下文</strong>：告诉 AI 你在做什么、期望什么、实际发生了什么</li>
<li class=""><strong>尝试修复</strong>：根据 AI 的建议，逐步修复</li>
</ol>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="解决方案三进阶后端方案">解决方案三：进阶后端方案<a href="https://binggg.github.io/blog/vibe-coding-non-technical#%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88%E4%B8%89%E8%BF%9B%E9%98%B6%E5%90%8E%E7%AB%AF%E6%96%B9%E6%A1%88" class="hash-link" aria-label="解决方案三：进阶后端方案的直接链接" title="解决方案三：进阶后端方案的直接链接" translate="no">​</a></h2>
<p>前端做好了，下一步是后端。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="后端挑战">后端挑战<a href="https://binggg.github.io/blog/vibe-coding-non-technical#%E5%90%8E%E7%AB%AF%E6%8C%91%E6%88%98" class="hash-link" aria-label="后端挑战的直接链接" title="后端挑战的直接链接" translate="no">​</a></h3>
<p>很多人把前端做好了，却卡在了后端：</p>
<ul>
<li class="">不会 MySQL/MongoDB</li>
<li class="">不会写 API</li>
<li class="">不会部署服务器</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="更简单的方案baasbackend-as-a-service">更简单的方案：BaaS（Backend as a Service）<a href="https://binggg.github.io/blog/vibe-coding-non-technical#%E6%9B%B4%E7%AE%80%E5%8D%95%E7%9A%84%E6%96%B9%E6%A1%88baasbackend-as-a-service" class="hash-link" aria-label="更简单的方案：BaaS（Backend as a Service）的直接链接" title="更简单的方案：BaaS（Backend as a Service）的直接链接" translate="no">​</a></h3>
<p><strong>什么是 BaaS？</strong></p>
<p>BaaS（后端即服务）把后端能力封装成简单 API：</p>
<table><thead><tr><th>能力</th><th>传统方式</th><th>BaaS 方式</th></tr></thead><tbody><tr><td>数据库</td><td>安装 MySQL，配置连接，写 SQL</td><td>调用 <code>db.collection('users').add()</code></td></tr><tr><td>用户系统</td><td>写注册/登录/权限逻辑</td><td>调用 <code>auth.signIn()</code></td></tr><tr><td>文件存储</td><td>搭建 OSS，配置权限</td><td>调用 <code>storage.upload()</code></td></tr></tbody></table>
<p>你需要的后端功能，其实大部分都已经做好了，直接用就行。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="更进一步ai-自动化的后端方案">更进一步：AI 自动化的后端方案<a href="https://binggg.github.io/blog/vibe-coding-non-technical#%E6%9B%B4%E8%BF%9B%E4%B8%80%E6%AD%A5ai-%E8%87%AA%E5%8A%A8%E5%8C%96%E7%9A%84%E5%90%8E%E7%AB%AF%E6%96%B9%E6%A1%88" class="hash-link" aria-label="更进一步：AI 自动化的后端方案的直接链接" title="更进一步：AI 自动化的后端方案的直接链接" translate="no">​</a></h3>
<p>如果 BaaS 还不够，现在有了更新的方案：<strong>MCP 协议</strong>。</p>
<p>MCP（Model Context Protocol）让 AI 可以直接调用云服务。你只需要告诉 AI 你要什么，AI 自动帮你完成所有操作。</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="特别篇设计岗转技术的快速提升路径">特别篇：设计岗转技术的快速提升路径<a href="https://binggg.github.io/blog/vibe-coding-non-technical#%E7%89%B9%E5%88%AB%E7%AF%87%E8%AE%BE%E8%AE%A1%E5%B2%97%E8%BD%AC%E6%8A%80%E6%9C%AF%E7%9A%84%E5%BF%AB%E9%80%9F%E6%8F%90%E5%8D%87%E8%B7%AF%E5%BE%84" class="hash-link" aria-label="特别篇：设计岗转技术的快速提升路径的直接链接" title="特别篇：设计岗转技术的快速提升路径的直接链接" translate="no">​</a></h2>
<p>如果你是设计师，想用 AI 做出真正的应用，你的路径和纯新手不太一样。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="设计思维-vs-编程思维">设计思维 vs 编程思维<a href="https://binggg.github.io/blog/vibe-coding-non-technical#%E8%AE%BE%E8%AE%A1%E6%80%9D%E7%BB%B4-vs-%E7%BC%96%E7%A8%8B%E6%80%9D%E7%BB%B4" class="hash-link" aria-label="设计思维 vs 编程思维的直接链接" title="设计思维 vs 编程思维的直接链接" translate="no">​</a></h3>
<p><strong>你的优势</strong>：</p>
<ul>
<li class="">理解用户体验，知道什么样的界面好用</li>
<li class="">有设计规范意识，不会弄出"AI 味"界面</li>
<li class="">理解交互逻辑，知道用户操作流程</li>
</ul>
<p><strong>需要补充的</strong>：</p>
<ul>
<li class="">知道设计稿怎么变成代码</li>
<li class="">理解数据如何流动</li>
<li class="">学会调试和排查问题</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="快速提升方法">快速提升方法<a href="https://binggg.github.io/blog/vibe-coding-non-technical#%E5%BF%AB%E9%80%9F%E6%8F%90%E5%8D%87%E6%96%B9%E6%B3%95" class="hash-link" aria-label="快速提升方法的直接链接" title="快速提升方法的直接链接" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-利用设计优势">1. 利用设计优势<a href="https://binggg.github.io/blog/vibe-coding-non-technical#1-%E5%88%A9%E7%94%A8%E8%AE%BE%E8%AE%A1%E4%BC%98%E5%8A%BF" class="hash-link" aria-label="1. 利用设计优势的直接链接" title="1. 利用设计优势的直接链接" translate="no">​</a></h4>
<ul>
<li class="">你的设计规范可以直接告诉 AI</li>
<li class="">你的设计稿可以截图给 AI，让它生成对应的代码</li>
<li class="">你的用户视角是巨大的优势</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-重点补充编程逻辑">2. 重点补充编程逻辑<a href="https://binggg.github.io/blog/vibe-coding-non-technical#2-%E9%87%8D%E7%82%B9%E8%A1%A5%E5%85%85%E7%BC%96%E7%A8%8B%E9%80%BB%E8%BE%91" class="hash-link" aria-label="2. 重点补充编程逻辑的直接链接" title="2. 重点补充编程逻辑的直接链接" translate="no">​</a></h4>
<ul>
<li class="">条件判断：if/else</li>
<li class="">数据循环：for/forEach</li>
<li class="">事件处理：点击、输入、提交</li>
<li class="">数据请求：fetch/axios</li>
</ul>
<p>这些是理解 AI 生成代码的关键。</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-实践项目驱动学习">3. 实践项目驱动学习<a href="https://binggg.github.io/blog/vibe-coding-non-technical#3-%E5%AE%9E%E8%B7%B5%E9%A1%B9%E7%9B%AE%E9%A9%B1%E5%8A%A8%E5%AD%A6%E4%B9%A0" class="hash-link" aria-label="3. 实践项目驱动学习的直接链接" title="3. 实践项目驱动学习的直接链接" translate="no">​</a></h4>
<p><strong>建议项目路径</strong>：</p>
<ol>
<li class=""><strong>个人作品集网站</strong>：展示你的设计作品</li>
<li class=""><strong>交互式原型</strong>：把设计稿变成可交互的页面</li>
<li class=""><strong>小型工具应用</strong>：解决实际问题的工具</li>
</ol>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="总结">总结<a href="https://binggg.github.io/blog/vibe-coding-non-technical#%E6%80%BB%E7%BB%93" class="hash-link" aria-label="总结的直接链接" title="总结的直接链接" translate="no">​</a></h2>
<p><strong>Vibe Coding 不是迷思，但需要正确的方法：</strong></p>
<ol>
<li class=""><strong>系统学习基础概念</strong> - 结合 developer-roadmap 和 AI，了解前端开发的基础概念</li>
<li class=""><strong>系统掌握调试技巧</strong> - 截图反馈、控制台错误、提供完整上下文</li>
<li class=""><strong>进阶：后端方案</strong> - 前端做好后，用 BaaS 降低后端门槛</li>
</ol>
<p><strong>最重要的是</strong>：不要急于求成，先把前端基础打好。系统学习概念，系统掌握调试方法，再考虑进阶。</p>
<p><strong>对于设计岗转技术的朋友</strong>：利用你的设计优势，重点补充编程逻辑，通过实践项目驱动学习，建立调试习惯。</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="重要术语表">重要术语表<a href="https://binggg.github.io/blog/vibe-coding-non-technical#%E9%87%8D%E8%A6%81%E6%9C%AF%E8%AF%AD%E8%A1%A8" class="hash-link" aria-label="重要术语表的直接链接" title="重要术语表的直接链接" translate="no">​</a></h2>
<table><thead><tr><th>术语</th><th>英文</th><th>说明</th></tr></thead><tbody><tr><td>Vibe Coding</td><td>Vibe Coding</td><td>用 AI 生成代码的编程方式</td></tr><tr><td>Debug</td><td>Debug</td><td>调试，找出并修复代码中的错误</td></tr><tr><td>DOM</td><td>Document Object Model</td><td>文档对象模型，网页元素的编程接口</td></tr><tr><td>BaaS</td><td>Backend as a Service</td><td>后端即服务</td></tr><tr><td>MCP</td><td>Model Context Protocol</td><td>模型上下文协议</td></tr><tr><td>前端</td><td>Frontend</td><td>用户直接看到和交互的部分</td></tr><tr><td>后端</td><td>Backend</td><td>服务器端，处理数据存储、业务逻辑</td></tr><tr><td>部署</td><td>Deployment</td><td>将代码发布到服务器</td></tr></tbody></table>]]></content>
        <author>
            <name>Booker Zhao</name>
            <uri>https://binggg.github.io</uri>
        </author>
        <category label="AI" term="AI"/>
        <category label="全栈" term="全栈"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[AI 编程，怎么从玩具到产品？]]></title>
        <id>https://binggg.github.io/blog/ai-toy-to-product</id>
        <link href="https://binggg.github.io/blog/ai-toy-to-product"/>
        <updated>2025-11-27T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[最近帮朋友看了几个用 AI 做的项目，发现一个有意思的现象：]]></summary>
        <content type="html"><![CDATA[<p>最近帮朋友看了几个用 AI 做的项目，发现一个有意思的现象：</p>
<p>代码能跑，功能也有，但就是...不能用。</p>
<p>不是技术问题，是别的问题。</p>
<!-- -->
<p><img decoding="async" loading="lazy" src="https://binggg.github.io/assets/images/cover-1d90153db90c135b9a00e1dc9e1ff1db.png" width="1312" height="736" class="img_ev3q">
<em>图：文章配图</em></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="一个典型的场景">一个典型的场景<a href="https://binggg.github.io/blog/ai-toy-to-product#%E4%B8%80%E4%B8%AA%E5%85%B8%E5%9E%8B%E7%9A%84%E5%9C%BA%E6%99%AF" class="hash-link" aria-label="一个典型的场景的直接链接" title="一个典型的场景的直接链接" translate="no">​</a></h2>
<p>朋友兴冲冲地发来一个链接："你看我用 AI 做的，三小时搞定！"</p>
<p>打开一看：</p>
<ul>
<li class="">页面是有的，圆角卡片、渐变按钮、紫色配色——一眼 AI 味</li>
<li class="">登录功能点了没反应</li>
<li class="">数据是写死的假数据</li>
<li class="">只能在他电脑上跑</li>
</ul>
<p>我问："这个怎么给用户用？"</p>
<p>他愣了一下："...还没想到那一步。"</p>
<p>这不是个例。我观察了很多用 AI 做的项目，发现大部分都卡在同一个地方：<strong>从 demo 到产品的鸿沟</strong>。</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="vibe-coding-的五个坑">vibe coding 的五个坑<a href="https://binggg.github.io/blog/ai-toy-to-product#vibe-coding-%E7%9A%84%E4%BA%94%E4%B8%AA%E5%9D%91" class="hash-link" aria-label="vibe coding 的五个坑的直接链接" title="vibe coding 的五个坑的直接链接" translate="no">​</a></h2>
<p>仔细分析这些项目，问题可以归结为五个：</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-需求是个谜">1. 需求是个谜<a href="https://binggg.github.io/blog/ai-toy-to-product#1-%E9%9C%80%E6%B1%82%E6%98%AF%E4%B8%AA%E8%B0%9C" class="hash-link" aria-label="1. 需求是个谜的直接链接" title="1. 需求是个谜的直接链接" translate="no">​</a></h3>
<p>"帮我做一个任务管理应用"——这是大多数人给 AI 的提示词。</p>
<p>问题是，AI 不知道：</p>
<ul>
<li class="">任务要不要分优先级？</li>
<li class="">要不要支持多人协作？</li>
<li class="">数据存本地还是云端？</li>
<li class="">要不要提醒功能？</li>
</ul>
<p>AI 只能猜。猜对了是运气，猜错了就是返工。</p>
<p><strong>本质问题</strong>：没有 Spec 思维。需求不清晰，AI 再聪明也白搭。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-ui-一眼假">2. UI 一眼假<a href="https://binggg.github.io/blog/ai-toy-to-product#2-ui-%E4%B8%80%E7%9C%BC%E5%81%87" class="hash-link" aria-label="2. UI 一眼假的直接链接" title="2. UI 一眼假的直接链接" translate="no">​</a></h3>
<p>为什么 AI 生成的界面总有一种说不出的"AI 味"？</p>
<ul>
<li class="">圆角用得太多太大</li>
<li class="">渐变色滥用</li>
<li class="">紫色 + 蓝色的万年配色</li>
<li class="">布局千篇一律</li>
</ul>
<p>不是 AI 不会设计，是你没告诉它什么是好设计。</p>
<p><strong>本质问题</strong>：缺乏设计规范。AI 只是在模仿它见过的"平均水平"。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-后端是空的">3. 后端是空的<a href="https://binggg.github.io/blog/ai-toy-to-product#3-%E5%90%8E%E7%AB%AF%E6%98%AF%E7%A9%BA%E7%9A%84" class="hash-link" aria-label="3. 后端是空的的直接链接" title="3. 后端是空的的直接链接" translate="no">​</a></h3>
<p>前端页面做得再漂亮，点击登录按钮——没反应。</p>
<p>因为：</p>
<ul>
<li class="">没有用户系统</li>
<li class="">没有数据库</li>
<li class="">没有 API 接口</li>
<li class="">没有服务器</li>
</ul>
<p>很多人以为 AI 编程就是做前端页面。但一个能用的产品，后端才是大头。</p>
<p><strong>本质问题</strong>：不懂架构选型。不知道用什么技术栈，干脆就不做了。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-部署是玄学">4. 部署是玄学<a href="https://binggg.github.io/blog/ai-toy-to-product#4-%E9%83%A8%E7%BD%B2%E6%98%AF%E7%8E%84%E5%AD%A6" class="hash-link" aria-label="4. 部署是玄学的直接链接" title="4. 部署是玄学的直接链接" translate="no">​</a></h3>
<p>代码写完了，然后呢？</p>
<ul>
<li class="">域名怎么买？</li>
<li class="">HTTPS 怎么配？</li>
<li class="">服务器怎么选？</li>
<li class="">数据库怎么部署？</li>
</ul>
<p>对于没有运维经验的人，这些问题每一个都是拦路虎。</p>
<p><strong>本质问题</strong>：不了解部署。代码能跑和产品能用是两回事。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="5-改一行崩全部">5. 改一行崩全部<a href="https://binggg.github.io/blog/ai-toy-to-product#5-%E6%94%B9%E4%B8%80%E8%A1%8C%E5%B4%A9%E5%85%A8%E9%83%A8" class="hash-link" aria-label="5. 改一行崩全部的直接链接" title="5. 改一行崩全部的直接链接" translate="no">​</a></h3>
<p>好不容易跑起来了，想加个小功能。</p>
<p>改了一行代码，整个项目报错。</p>
<p>AI 生成的代码往往是"一次性"的——能跑，但不能改。因为：</p>
<ul>
<li class="">没有模块化</li>
<li class="">没有类型检查</li>
<li class="">没有测试</li>
<li class="">到处是硬编码</li>
</ul>
<p><strong>本质问题</strong>：缺乏工程化。代码是写给机器跑的，不是给人维护的。</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="怎么破">怎么破？<a href="https://binggg.github.io/blog/ai-toy-to-product#%E6%80%8E%E4%B9%88%E7%A0%B4" class="hash-link" aria-label="怎么破？的直接链接" title="怎么破？的直接链接" translate="no">​</a></h2>
<p>分析完问题，解决思路就清晰了。下面是我总结的五个具体方法：</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="方法-1先写-spec再写代码">方法 1：先写 Spec，再写代码<a href="https://binggg.github.io/blog/ai-toy-to-product#%E6%96%B9%E6%B3%95-1%E5%85%88%E5%86%99-spec%E5%86%8D%E5%86%99%E4%BB%A3%E7%A0%81" class="hash-link" aria-label="方法 1：先写 Spec，再写代码的直接链接" title="方法 1：先写 Spec，再写代码的直接链接" translate="no">​</a></h3>
<p>我之前写过一篇关于 Kiro Spec 工作流的文章，核心观点是：</p>
<blockquote>
<p><strong>vibe coding 最大的问题是：它让开发变成了"碰运气"，而不是"可控的工程"。</strong></p>
</blockquote>
<p>解决方案是在让 AI 写代码之前，先让它帮你梳理需求。具体来说，生成三个文件：</p>
<ol>
<li class=""><strong>requirements.md</strong> —— 需求文档（用 EARS 语法写用户故事和验收标准）</li>
<li class=""><strong>design.md</strong> —— 技术方案（架构、流程、注意事项）</li>
<li class=""><strong>tasks.md</strong> —— 任务清单（todolist，便于跟踪）</li>
</ol>
<p>这和大厂的研发流程、敏捷开发的拆解方式如出一辙，但 Kiro 把它和 AI IDE 深度结合，极大提升了落地效率。</p>
<p><strong>什么是 EARS 需求语法？</strong></p>
<p>EARS（简易需求语法）最早用于喷气发动机控制系统，后来被软件工程广泛采用。它用简单句式约束需求，避免"模糊表达"：</p>
<table><thead><tr><th>类型</th><th>句式</th><th>示例</th></tr></thead><tbody><tr><td>普遍性</td><td>The system shall...</td><td>系统应当支持用户登录</td></tr><tr><td>事件驱动</td><td>When [trigger], the system shall...</td><td>当用户点击登录按钮，系统应当验证凭证</td></tr><tr><td>状态驱动</td><td>While [state], the system shall...</td><td>当用户已登录时，系统应当显示用户头像</td></tr><tr><td>可选功能</td><td>Where [feature], the system shall...</td><td>如果启用了双因素认证，系统应当发送验证码</td></tr><tr><td>复杂条件</td><td>If [condition], then the system shall...</td><td>如果密码错误超过 3 次，系统应当锁定账户</td></tr></tbody></table>
<p>需求清晰了，AI 才能精准输出。</p>
<p><strong>怎么在其他 AI IDE 里用？</strong></p>
<p>即使没有 Kiro，其他 AI IDE 也能复刻这套流程：</p>
<ul>
<li class="">Claude Code：在项目下建立 <code>CLAUDE.md</code>，写入 Spec 工作流规则</li>
<li class="">Cursor：使用 <code>.cursor/rules/project.mdc</code></li>
<li class="">Augment：使用 <code>.augment-guidelines</code></li>
</ul>
<p>整个流程下来，AI 不再是"黑箱"式地帮你生成代码，而是和你像搭档一样，<strong>步步确认、逐步推进</strong>。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="方法-2用-skill-约束-ai-的设计输出">方法 2：用 Skill 约束 AI 的设计输出<a href="https://binggg.github.io/blog/ai-toy-to-product#%E6%96%B9%E6%B3%95-2%E7%94%A8-skill-%E7%BA%A6%E6%9D%9F-ai-%E7%9A%84%E8%AE%BE%E8%AE%A1%E8%BE%93%E5%87%BA" class="hash-link" aria-label="方法 2：用 Skill 约束 AI 的设计输出的直接链接" title="方法 2：用 Skill 约束 AI 的设计输出的直接链接" translate="no">​</a></h3>
<p>不要让 AI 自由发挥，给它一套设计规范。</p>
<p>这里介绍一个概念：<strong>Skill（技能）</strong>。</p>
<p>Skill 是一种可复用的提示词模板，封装了特定领域的专业知识。比如 Anthropic 官方开源的 <code>frontend-design</code> Skill，专门用来解决"AI 味"问题：</p>
<p>有了这个 Skill，AI 生成的 UI 就不会那么"AI 味"了。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="方法-3选-baas不要从零搭">方法 3：选 BaaS，不要从零搭<a href="https://binggg.github.io/blog/ai-toy-to-product#%E6%96%B9%E6%B3%95-3%E9%80%89-baas%E4%B8%8D%E8%A6%81%E4%BB%8E%E9%9B%B6%E6%90%AD" class="hash-link" aria-label="方法 3：选 BaaS，不要从零搭的直接链接" title="方法 3：选 BaaS，不要从零搭的直接链接" translate="no">​</a></h3>
<p>后端是大多数人的拦路虎。但其实不需要自己搭。</p>
<p><strong>什么是 BaaS？</strong></p>
<p>BaaS（Backend as a Service）是一种云服务模式，把后端能力封装成 API，开发者只需调用 SDK：</p>
<table><thead><tr><th>能力</th><th>传统方式</th><th>BaaS 方式</th></tr></thead><tbody><tr><td>数据库</td><td>安装 MySQL，配置连接，写 SQL</td><td>调用 <code>db.collection('users').add()</code></td></tr><tr><td>用户系统</td><td>写注册/登录/权限逻辑</td><td>调用 <code>auth.signIn()</code></td></tr><tr><td>文件存储</td><td>搭建 OSS，配置权限</td><td>调用 <code>storage.upload()</code></td></tr><tr><td>API 接口</td><td>写 Express/Nest.js 路由</td><td>云函数自动生成 HTTP 端点</td></tr></tbody></table>
<p>这比自己用 Express/Nest.js 从零搭建简单 10 倍。</p>
<p><strong>国内外主流 BaaS 平台</strong>：</p>
<ul>
<li class="">国外：Supabase、Firebase</li>
<li class="">国内：CloudBase（腾讯云开发）</li>
</ul>
<p>BaaS 的核心理念是：<strong>开箱即用</strong>。创建项目时，数据库、认证、存储就已经准备好了，不需要你操心底层基础设施。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="方法-4用平台托管不碰服务器">方法 4：用平台托管，不碰服务器<a href="https://binggg.github.io/blog/ai-toy-to-product#%E6%96%B9%E6%B3%95-4%E7%94%A8%E5%B9%B3%E5%8F%B0%E6%89%98%E7%AE%A1%E4%B8%8D%E7%A2%B0%E6%9C%8D%E5%8A%A1%E5%99%A8" class="hash-link" aria-label="方法 4：用平台托管，不碰服务器的直接链接" title="方法 4：用平台托管，不碰服务器的直接链接" translate="no">​</a></h3>
<p>部署也不需要自己折腾。</p>
<p>现在有很多平台可以帮你搞定部署：</p>
<table><thead><tr><th>平台类型</th><th>代表产品</th><th>特点</th></tr></thead><tbody><tr><td>静态托管</td><td>Vercel、Netlify、Cloudflare Pages</td><td>前端项目一键部署，自动 HTTPS</td></tr><tr><td>Serverless</td><td>AWS Lambda、Cloudflare Workers</td><td>函数即服务，按调用计费</td></tr><tr><td>BaaS 全栈</td><td>CloudBase、Supabase、Firebase</td><td>前后端一体，数据库+函数+托管</td></tr><tr><td>容器平台</td><td>Railway、Render、Fly.io</td><td>支持任意语言，更灵活</td></tr></tbody></table>
<p>如果你用的是 BaaS 平台（比如 CloudBase），部署就更简单了——前端静态托管、后端云函数、数据库，都在一个平台里，不用到处开账号。</p>
<p>把代码推上去，平台自动帮你搞定一切。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="方法-5工程化思维">方法 5：工程化思维<a href="https://binggg.github.io/blog/ai-toy-to-product#%E6%96%B9%E6%B3%95-5%E5%B7%A5%E7%A8%8B%E5%8C%96%E6%80%9D%E7%BB%B4" class="hash-link" aria-label="方法 5：工程化思维的直接链接" title="方法 5：工程化思维的直接链接" translate="no">​</a></h3>
<p>让 AI 生成代码时，要求它：</p>
<table><thead><tr><th>要求</th><th>具体做法</th></tr></thead><tbody><tr><td>模块化</td><td>一个文件做一件事，职责清晰</td></tr><tr><td>类型化</td><td>用 TypeScript，类型即文档</td></tr><tr><td>可测试</td><td>关键逻辑有单元测试</td></tr><tr><td>可配置</td><td>环境变量、配置文件，不要硬编码</td></tr></tbody></table>
<p>这样生成的代码才能维护和迭代。</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="我的实践">我的实践<a href="https://binggg.github.io/blog/ai-toy-to-product#%E6%88%91%E7%9A%84%E5%AE%9E%E8%B7%B5" class="hash-link" aria-label="我的实践的直接链接" title="我的实践的直接链接" translate="no">​</a></h2>
<p>说了这么多方法，我自己是怎么做的呢？</p>
<p>经过一段时间的摸索，我沉淀出一套方案，把上面五个方法整合在一起：</p>
<p><strong>1. Spec 工作流</strong> — 每次开始一个项目，先让 AI 帮我生成 <code>requirements.md</code> → <code>design.md</code> → <code>tasks.md</code>。需求清晰了，后面写代码就顺了。</p>
<p><strong>2. Skill 技能体系</strong> — 整理了一套设计规范，封装成 Skill。每次生成 UI 时调用，就不会有 AI 味了。</p>
<p><strong>3. BaaS 架构</strong> — 后端用云开发平台，不碰服务器。数据库、云函数、用户登录、文件存储——都是现成的。</p>
<p><strong>4. MCP 协议</strong> — 用 MCP 让 AI 直接调用云服务。创建数据库、部署函数、配置域名——都不用手动操作了。</p>
<p>这套方案我打包成了 <strong>CloudBase AI Toolkit</strong>，开源在 GitHub。</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="写在最后">写在最后<a href="https://binggg.github.io/blog/ai-toy-to-product#%E5%86%99%E5%9C%A8%E6%9C%80%E5%90%8E" class="hash-link" aria-label="写在最后的直接链接" title="写在最后的直接链接" translate="no">​</a></h2>
<p>vibe coding 不是不能用，而是只能用来做 demo。</p>
<p>从 demo 到产品，需要的不是更强的 AI，而是<strong>工程化的思维</strong>：</p>
<ul>
<li class="">需求要清晰（Spec 工作流）</li>
<li class="">设计要规范（Skill 技能体系）</li>
<li class="">架构要合理（BaaS 服务）</li>
<li class="">开发要智能（MCP 协议）</li>
<li class="">代码要可维护（工程化）</li>
</ul>
<p>AI 是工具，但工具需要正确的使用方式。</p>
<p>就像有了电钻，不代表人人都能做木工。关键是你知道怎么用，用在哪里。</p>
<blockquote>
<p><strong>记住：AI 不是替代人，而是让人更强大。</strong></p>
</blockquote>
<hr>
<p><em>如果你也有 AI 编程的实践经验，欢迎交流。</em></p>]]></content>
        <author>
            <name>Booker Zhao</name>
            <uri>https://binggg.github.io</uri>
        </author>
        <category label="AI" term="AI"/>
        <category label="全栈" term="全栈"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[为什么你的 AI 编程总是返工？SBE 方法论给出了答案]]></title>
        <id>https://binggg.github.io/blog/sbe-methodology</id>
        <link href="https://binggg.github.io/blog/sbe-methodology"/>
        <updated>2025-08-05T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[最近我的《Kiro Spec 工作流复刻全攻略》爆了，很多朋友私信问我："为什么 Spec 模式这么有效？背后有什么理论支撑吗？"]]></summary>
        <content type="html"><![CDATA[<p>最近我的<a class="" href="https://binggg.github.io/blog/kiro-spec-workflow">《Kiro Spec 工作流复刻全攻略》</a>爆了，很多朋友私信问我：<strong>"为什么 Spec 模式这么有效？背后有什么理论支撑吗？"</strong></p>
<p>说实话，这个问题我也思考了很久。直到我看到了 Gojko Adzic 的《实例化需求：团队如何交付正确的软件》这本书，才恍然大悟。</p>
<p>原来，Kiro 的 Spec 工作流背后，是 SBE（Specification by Example）方法论的完美实践。<strong>今天就来揭秘这套方法论，解决你的 AI 编程返工问题。</strong></p>
<!-- -->
<p><img decoding="async" loading="lazy" src="https://binggg.github.io/assets/images/cover-7010b9e105af6d464a2b074434185932.png" width="1312" height="736" class="img_ev3q">
<em>图：文章配图</em></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="你的-ai-编程为什么总是返工">你的 AI 编程为什么总是返工？<a href="https://binggg.github.io/blog/sbe-methodology#%E4%BD%A0%E7%9A%84-ai-%E7%BC%96%E7%A8%8B%E4%B8%BA%E4%BB%80%E4%B9%88%E6%80%BB%E6%98%AF%E8%BF%94%E5%B7%A5" class="hash-link" aria-label="你的 AI 编程为什么总是返工？的直接链接" title="你的 AI 编程为什么总是返工？的直接链接" translate="no">​</a></h2>
<p>你有没有遇到过这样的情况：</p>
<ul>
<li class="">让 AI 生成一个登录功能，结果生成了注册页面</li>
<li class="">要求实现数据导出，AI 却给你一个数据导入功能</li>
<li class="">想要一个简单的 API，AI 却生成了复杂的微服务架构</li>
</ul>
<p><strong>这些问题的根源是什么？</strong></p>
<p>不是 AI 不够聪明，而是我们的需求表达太模糊了。就像和一个外国朋友交流，如果你说"我要吃饭"，他可能理解成"我要吃米饭"、"我要去餐厅"或者"我要点外卖"。</p>
<p>在 AI 编程中，这种模糊性被放大了。AI 只能根据你的描述来"猜"你想要什么，猜对了皆大欢喜，猜错了就要返工重来。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="传统需求管理的困境">传统需求管理的困境<a href="https://binggg.github.io/blog/sbe-methodology#%E4%BC%A0%E7%BB%9F%E9%9C%80%E6%B1%82%E7%AE%A1%E7%90%86%E7%9A%84%E5%9B%B0%E5%A2%83" class="hash-link" aria-label="传统需求管理的困境的直接链接" title="传统需求管理的困境的直接链接" translate="no">​</a></h3>
<p>在传统软件工程中，我们早就发现了类似的问题：</p>
<ol>
<li class=""><strong>需求歧义</strong>：同一个需求，不同人理解不同</li>
<li class=""><strong>后期返工</strong>：开发完成后发现理解偏差</li>
<li class=""><strong>文档滞后</strong>：需求文档跟不上实际变化</li>
<li class=""><strong>沟通成本</strong>：反复确认需求，效率低下</li>
</ol>
<p>这些问题在 AI 编程中被进一步放大。当需求不清晰时，AI 就像在黑暗中摸索，只能靠"运气"来生成符合期望的代码。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="传统软件工程早就有了解决方案">传统软件工程早就有了解决方案<a href="https://binggg.github.io/blog/sbe-methodology#%E4%BC%A0%E7%BB%9F%E8%BD%AF%E4%BB%B6%E5%B7%A5%E7%A8%8B%E6%97%A9%E5%B0%B1%E6%9C%89%E4%BA%86%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88" class="hash-link" aria-label="传统软件工程早就有了解决方案的直接链接" title="传统软件工程早就有了解决方案的直接链接" translate="no">​</a></h2>
<p>Gojko Adzic 在《实例化需求：团队如何交付正确的软件》中提出的 SBE（Specification by Example）方法论，正是为了解决这些问题而生。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="sbe-的核心原则">SBE 的核心原则<a href="https://binggg.github.io/blog/sbe-methodology#sbe-%E7%9A%84%E6%A0%B8%E5%BF%83%E5%8E%9F%E5%88%99" class="hash-link" aria-label="SBE 的核心原则的直接链接" title="SBE 的核心原则的直接链接" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-以实例为中心的需求定义">1. 以实例为中心的需求定义<a href="https://binggg.github.io/blog/sbe-methodology#1-%E4%BB%A5%E5%AE%9E%E4%BE%8B%E4%B8%BA%E4%B8%AD%E5%BF%83%E7%9A%84%E9%9C%80%E6%B1%82%E5%AE%9A%E4%B9%89" class="hash-link" aria-label="1. 以实例为中心的需求定义的直接链接" title="1. 以实例为中心的需求定义的直接链接" translate="no">​</a></h4>
<p>用<strong>具体、真实的例子</strong>替代抽象的需求描述。比如：</p>
<p>❌ <strong>抽象描述</strong>：用户登录功能要安全可靠
✅ <strong>实例化描述</strong>：</p>
<ul>
<li class="">Given 用户输入正确的用户名和密码</li>
<li class="">When 点击登录按钮</li>
<li class="">Then 系统显示欢迎页面</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-协作式需求澄清">2. 协作式需求澄清<a href="https://binggg.github.io/blog/sbe-methodology#2-%E5%8D%8F%E4%BD%9C%E5%BC%8F%E9%9C%80%E6%B1%82%E6%BE%84%E6%B8%85" class="hash-link" aria-label="2. 协作式需求澄清的直接链接" title="2. 协作式需求澄清的直接链接" translate="no">​</a></h4>
<p>强调<strong>跨角色协作</strong>，通过共同讨论实例避免"需求孤岛"。在 AI 编程中，这就是人机协作的过程。</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-从需求到可执行测试的转化">3. 从需求到可执行测试的转化<a href="https://binggg.github.io/blog/sbe-methodology#3-%E4%BB%8E%E9%9C%80%E6%B1%82%E5%88%B0%E5%8F%AF%E6%89%A7%E8%A1%8C%E6%B5%8B%E8%AF%95%E7%9A%84%E8%BD%AC%E5%8C%96" class="hash-link" aria-label="3. 从需求到可执行测试的转化的直接链接" title="3. 从需求到可执行测试的转化的直接链接" translate="no">​</a></h4>
<p>将实例转化为<strong>自动化测试用例</strong>，实现"需求即测试"。这是 Spec 模式中基于 requirement 生成测试用例的理论基础。</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-活文档living-documentation">4. 活文档（Living Documentation）<a href="https://binggg.github.io/blog/sbe-methodology#4-%E6%B4%BB%E6%96%87%E6%A1%A3living-documentation" class="hash-link" aria-label="4. 活文档（Living Documentation）的直接链接" title="4. 活文档（Living Documentation）的直接链接" translate="no">​</a></h4>
<p>实例化需求的结果是一套<strong>动态更新的文档系统</strong>，随需求变更自动同步。这正是 Spec 模式中持续更新的 requirements.md 和 design.md。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="sbe-与-spec-模式的完美映射">SBE 与 Spec 模式的完美映射<a href="https://binggg.github.io/blog/sbe-methodology#sbe-%E4%B8%8E-spec-%E6%A8%A1%E5%BC%8F%E7%9A%84%E5%AE%8C%E7%BE%8E%E6%98%A0%E5%B0%84" class="hash-link" aria-label="SBE 与 Spec 模式的完美映射的直接链接" title="SBE 与 Spec 模式的完美映射的直接链接" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="需求澄清--requirementsmd-的迭代">需求澄清 → requirements.md 的迭代<a href="https://binggg.github.io/blog/sbe-methodology#%E9%9C%80%E6%B1%82%E6%BE%84%E6%B8%85--requirementsmd-%E7%9A%84%E8%BF%AD%E4%BB%A3" class="hash-link" aria-label="需求澄清 → requirements.md 的迭代的直接链接" title="需求澄清 → requirements.md 的迭代的直接链接" translate="no">​</a></h3>
<p><strong>SBE 原则</strong>：用具体实例澄清需求，确保团队理解一致。</p>
<p><strong>Spec 实践</strong>：</p>
<div class="language-markdown codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-markdown codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token title important punctuation" style="color:#393A34">###</span><span class="token title important"> 需求 1 - 用户登录功能</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token bold punctuation" style="color:#393A34">**</span><span class="token bold content">用户故事：</span><span class="token bold punctuation" style="color:#393A34">**</span><span class="token plain"> 作为用户，我希望能够安全登录系统，以便访问我的个人数据。</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token title important punctuation" style="color:#393A34">####</span><span class="token title important"> 验收标准</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">1.</span><span class="token plain"> When 用户输入正确的用户名和密码时，the 系统 shall 显示欢迎页面</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">2.</span><span class="token plain"> When 用户输入错误的密码时，the 系统 shall 显示错误提示</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">3.</span><span class="token plain"> When 用户连续输入错误密码3次时，the 系统 shall 锁定账户30分钟</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="技术设计--designmd-的协作">技术设计 → design.md 的协作<a href="https://binggg.github.io/blog/sbe-methodology#%E6%8A%80%E6%9C%AF%E8%AE%BE%E8%AE%A1--designmd-%E7%9A%84%E5%8D%8F%E4%BD%9C" class="hash-link" aria-label="技术设计 → design.md 的协作的直接链接" title="技术设计 → design.md 的协作的直接链接" translate="no">​</a></h3>
<p><strong>SBE 原则</strong>：避免技术陷阱，聚焦业务功能。</p>
<p><strong>Spec 实践</strong>：</p>
<div class="language-markdown codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-markdown codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token title important punctuation" style="color:#393A34">##</span><span class="token title important"> 技术方案设计</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token title important punctuation" style="color:#393A34">###</span><span class="token title important"> 架构设计</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> 前端：React + TypeScript</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> 后端：Node.js + Express</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> 数据库：MongoDB</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> 认证：JWT Token</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="测试驱动--基于需求的测试生成">测试驱动 → 基于需求的测试生成<a href="https://binggg.github.io/blog/sbe-methodology#%E6%B5%8B%E8%AF%95%E9%A9%B1%E5%8A%A8--%E5%9F%BA%E4%BA%8E%E9%9C%80%E6%B1%82%E7%9A%84%E6%B5%8B%E8%AF%95%E7%94%9F%E6%88%90" class="hash-link" aria-label="测试驱动 → 基于需求的测试生成的直接链接" title="测试驱动 → 基于需求的测试生成的直接链接" translate="no">​</a></h3>
<p><strong>SBE 原则</strong>：需求即测试，确保实现符合预期。</p>
<p><strong>Spec 实践</strong>：</p>
<div class="language-javascript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-javascript codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// 基于 requirements.md 自动生成的测试用例</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">describe</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'用户登录功能'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token function" style="color:#d73a49">test</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'正确密码登录成功'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">async</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> response </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:#00009f">await</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">login</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'user@example.com'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'correctPassword'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">expect</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">response</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">status</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">toBe</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">200</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">expect</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">response</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">data</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">message</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">toBe</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'欢迎页面'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="实践经验sbe-方法论在-ai-编程中的落地">实践经验：SBE 方法论在 AI 编程中的落地<a href="https://binggg.github.io/blog/sbe-methodology#%E5%AE%9E%E8%B7%B5%E7%BB%8F%E9%AA%8Csbe-%E6%96%B9%E6%B3%95%E8%AE%BA%E5%9C%A8-ai-%E7%BC%96%E7%A8%8B%E4%B8%AD%E7%9A%84%E8%90%BD%E5%9C%B0" class="hash-link" aria-label="实践经验：SBE 方法论在 AI 编程中的落地的直接链接" title="实践经验：SBE 方法论在 AI 编程中的落地的直接链接" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="我的实践心得">我的实践心得<a href="https://binggg.github.io/blog/sbe-methodology#%E6%88%91%E7%9A%84%E5%AE%9E%E8%B7%B5%E5%BF%83%E5%BE%97" class="hash-link" aria-label="我的实践心得的直接链接" title="我的实践心得的直接链接" translate="no">​</a></h3>
<p>经过在多个项目中的实践，我发现 SBE 方法论在 AI 编程中确实很有效：</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-需求迭代和澄清最重要">1. 需求迭代和澄清最重要<a href="https://binggg.github.io/blog/sbe-methodology#1-%E9%9C%80%E6%B1%82%E8%BF%AD%E4%BB%A3%E5%92%8C%E6%BE%84%E6%B8%85%E6%9C%80%E9%87%8D%E8%A6%81" class="hash-link" aria-label="1. 需求迭代和澄清最重要的直接链接" title="1. 需求迭代和澄清最重要的直接链接" translate="no">​</a></h4>
<p><strong>关键发现</strong>：<code>requirements.md</code> 和 <code>design.md</code> 的不断迭代和澄清是整个流程的核心。</p>
<p><strong>实践案例</strong>：</p>
<ul>
<li class="">在 <code>CloudBase-AI-ToolKit</code> 项目中，我们每个新功能都采用 Spec 模式</li>
<li class="">通过反复迭代 requirements.md，需求清晰度提升了 80%</li>
<li class="">返工率从原来的 60% 降低到 15%</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-基于需求生成测试用例">2. 基于需求生成测试用例<a href="https://binggg.github.io/blog/sbe-methodology#2-%E5%9F%BA%E4%BA%8E%E9%9C%80%E6%B1%82%E7%94%9F%E6%88%90%E6%B5%8B%E8%AF%95%E7%94%A8%E4%BE%8B" class="hash-link" aria-label="2. 基于需求生成测试用例的直接链接" title="2. 基于需求生成测试用例的直接链接" translate="no">​</a></h4>
<p><strong>关键发现</strong>：基于 requirements.md 生成的测试用例，让 AI 编程变得可验证。</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-在存量项目中的应用">3. 在存量项目中的应用<a href="https://binggg.github.io/blog/sbe-methodology#3-%E5%9C%A8%E5%AD%98%E9%87%8F%E9%A1%B9%E7%9B%AE%E4%B8%AD%E7%9A%84%E5%BA%94%E7%94%A8" class="hash-link" aria-label="3. 在存量项目中的应用的直接链接" title="3. 在存量项目中的应用的直接链接" translate="no">​</a></h4>
<p><strong>关键发现</strong>：Spec 模式不仅适用于新项目，在存量项目中同样有效。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="粒度拆分的最佳实践">粒度拆分的最佳实践<a href="https://binggg.github.io/blog/sbe-methodology#%E7%B2%92%E5%BA%A6%E6%8B%86%E5%88%86%E7%9A%84%E6%9C%80%E4%BD%B3%E5%AE%9E%E8%B7%B5" class="hash-link" aria-label="粒度拆分的最佳实践的直接链接" title="粒度拆分的最佳实践的直接链接" translate="no">​</a></h3>
<p>关于大家关心的粒度拆分问题，我的经验是：</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="按功能模块拆分">按功能模块拆分<a href="https://binggg.github.io/blog/sbe-methodology#%E6%8C%89%E5%8A%9F%E8%83%BD%E6%A8%A1%E5%9D%97%E6%8B%86%E5%88%86" class="hash-link" aria-label="按功能模块拆分的直接链接" title="按功能模块拆分的直接链接" translate="no">​</a></h4>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">specs/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">├── user-management/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│   ├── requirements.md</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│   ├── design.md</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│   └── tasks.md</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">├── file-upload/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│   ├── requirements.md</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│   ├── design.md</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│   └── tasks.md</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">└── data-export/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    ├── requirements.md</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    ├── design.md</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    └── tasks.md</span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="按迭代拆分">按迭代拆分<a href="https://binggg.github.io/blog/sbe-methodology#%E6%8C%89%E8%BF%AD%E4%BB%A3%E6%8B%86%E5%88%86" class="hash-link" aria-label="按迭代拆分的直接链接" title="按迭代拆分的直接链接" translate="no">​</a></h4>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">specs/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">├── v1.0-basic-features/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">├── v1.1-advanced-features/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">└── v1.2-optimization/</span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="按复杂度拆分">按复杂度拆分<a href="https://binggg.github.io/blog/sbe-methodology#%E6%8C%89%E5%A4%8D%E6%9D%82%E5%BA%A6%E6%8B%86%E5%88%86" class="hash-link" aria-label="按复杂度拆分的直接链接" title="按复杂度拆分的直接链接" translate="no">​</a></h4>
<ul>
<li class=""><strong>简单功能</strong>：单个 spec 文件</li>
<li class=""><strong>中等功能</strong>：独立的 spec 文件夹</li>
<li class=""><strong>复杂功能</strong>：多个关联的 spec 文件夹</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="那么sbe-方法论到底有多香">那么，SBE 方法论到底有多香？<a href="https://binggg.github.io/blog/sbe-methodology#%E9%82%A3%E4%B9%88sbe-%E6%96%B9%E6%B3%95%E8%AE%BA%E5%88%B0%E5%BA%95%E6%9C%89%E5%A4%9A%E9%A6%99" class="hash-link" aria-label="那么，SBE 方法论到底有多香？的直接链接" title="那么，SBE 方法论到底有多香？的直接链接" translate="no">​</a></h2>
<p>看到这里，你可能会问：<strong>"这套方法论真的这么有效吗？会不会太复杂了？"</strong></p>
<p>说实话，我一开始也有同样的担心。但实践下来发现，SBE 方法论在 AI 编程中确实很"香"：</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="为什么-sbe-方法论这么有效">为什么 SBE 方法论这么有效？<a href="https://binggg.github.io/blog/sbe-methodology#%E4%B8%BA%E4%BB%80%E4%B9%88-sbe-%E6%96%B9%E6%B3%95%E8%AE%BA%E8%BF%99%E4%B9%88%E6%9C%89%E6%95%88" class="hash-link" aria-label="为什么 SBE 方法论这么有效？的直接链接" title="为什么 SBE 方法论这么有效？的直接链接" translate="no">​</a></h3>
<ol>
<li class=""><strong>需求清晰了</strong>：用具体例子替代抽象描述，AI 理解更准确</li>
<li class=""><strong>返工率低了</strong>：基于清晰需求生成的代码，质量更高</li>
<li class=""><strong>协作更顺畅了</strong>：团队成员对需求理解一致，沟通成本降低</li>
<li class=""><strong>文档不过时了</strong>：活文档随需求变化自动更新</li>
</ol>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="适用场景和注意事项">适用场景和注意事项<a href="https://binggg.github.io/blog/sbe-methodology#%E9%80%82%E7%94%A8%E5%9C%BA%E6%99%AF%E5%92%8C%E6%B3%A8%E6%84%8F%E4%BA%8B%E9%A1%B9" class="hash-link" aria-label="适用场景和注意事项的直接链接" title="适用场景和注意事项的直接链接" translate="no">​</a></h3>
<p><strong>适合的场景</strong>：</p>
<ul>
<li class="">✅ 复杂项目，涉及多个模块</li>
<li class="">✅ 团队协作，需要统一标准</li>
<li class="">✅ 质量要求高，需要可追溯性</li>
</ul>
<p><strong>不太适合的场景</strong>：</p>
<ul>
<li class="">❌ 快速原型，验证想法</li>
<li class="">❌ 个人项目，简单功能</li>
<li class="">❌ 时间极其紧迫的项目</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="总结让-ai-编程从碰运气变成可控工程">总结：让 AI 编程从"碰运气"变成"可控工程"<a href="https://binggg.github.io/blog/sbe-methodology#%E6%80%BB%E7%BB%93%E8%AE%A9-ai-%E7%BC%96%E7%A8%8B%E4%BB%8E%E7%A2%B0%E8%BF%90%E6%B0%94%E5%8F%98%E6%88%90%E5%8F%AF%E6%8E%A7%E5%B7%A5%E7%A8%8B" class="hash-link" aria-label="总结：让 AI 编程从&quot;碰运气&quot;变成&quot;可控工程&quot;的直接链接" title="总结：让 AI 编程从&quot;碰运气&quot;变成&quot;可控工程&quot;的直接链接" translate="no">​</a></h2>
<p>SBE 方法论为 AI 编程提供了一套经过验证的理论基础和实践框架。通过实例化需求、协作式澄清、测试驱动开发和活文档管理，我们可以让 AI 编程变得更加可控、高效和可靠。</p>
<p>记住：<strong>AI 不是替代人，而是让人更专注于决策和把控方向，把繁琐的细节交给 AI。</strong></p>
<p>这样，你的 AI 编程就不再是"碰运气"，而是真正变成了"可控工程"。</p>
<hr>
<p><strong>互动话题</strong>：</p>
<ol>
<li class="">你目前使用的是哪种开发模式？</li>
<li class="">你觉得 Spec 模式在你的项目中可行吗？</li>
<li class="">分享一下你的 AI 编程经验！</li>
</ol>]]></content>
        <author>
            <name>Booker Zhao</name>
            <uri>https://binggg.github.io</uri>
        </author>
        <category label="AI" term="AI"/>
        <category label="全栈" term="全栈"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[AI 编程不靠运气，Kiro Spec 工作流复刻全攻略]]></title>
        <id>https://binggg.github.io/blog/2025/07/21/kiro-spec-workflow</id>
        <link href="https://binggg.github.io/blog/2025/07/21/kiro-spec-workflow"/>
        <updated>2025-07-21T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[一文复刻 Kiro Spec 工作流到任意 AI IDE——用 EARS 语法写需求、技术方案设计、任务拆分，从 vibe coding 到工程化 AI 开发。]]></summary>
        <content type="html"><![CDATA[<p>最近研究 Kiro 的推文又爆了，很多朋友私信问细节，所以再来整理一篇文章，系统分享下具体内容和实操方法。</p>
<!-- -->
<p><img decoding="async" loading="lazy" src="https://binggg.github.io/assets/images/cover-c2f3d68d337f871dd2eda7a48680b828.png" width="1312" height="736" class="img_ev3q">
<em>图：文章配图</em></p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="拉霸式-vibe-coding真的靠谱吗">拉霸式 vibe coding，真的靠谱吗？<a href="https://binggg.github.io/blog/2025/07/21/kiro-spec-workflow#%E6%8B%89%E9%9C%B8%E5%BC%8F-vibe-coding%E7%9C%9F%E7%9A%84%E9%9D%A0%E8%B0%B1%E5%90%97" class="hash-link" aria-label="拉霸式 vibe coding，真的靠谱吗？的直接链接" title="拉霸式 vibe coding，真的靠谱吗？的直接链接" translate="no">​</a></h2>
<p>你是否有过这样的体验：在 AI IDE 里输入一句模糊的需求，点击"生成"，满怀期待地等着 AI 给你一个完美的程序？结果却像在拉霸机前拉动拉杆——有时中个小奖，大多数时候却一无所获。</p>
<blockquote>
<p>拉霸游戏和 vibe coding 的异同：</p>
<p>拉霸游戏：买代币，拉拉杆，偶尔中大奖，更多时候是"再来一次"，最终庄家总是赢家。</p>
<p>氛围编程（vibe coding）：买 Tokens，写模糊提示，点"生成"，有时得完美代码，有时一团乱麻。AI 鼓励你"再试一次"，你安慰自己"这次一定能修好 bug"，但最终模型厂商总是赢家。偶尔你觉得自己赚到了，回头却发现花了更多时间。</p>
</blockquote>
<p>vibe coding 最大的问题是：它让开发变成了"碰运气"，而不是"可控的工程"。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="常见的-vibe-coding-流程示意图">常见的 vibe coding 流程示意图<a href="https://binggg.github.io/blog/2025/07/21/kiro-spec-workflow#%E5%B8%B8%E8%A7%81%E7%9A%84-vibe-coding-%E6%B5%81%E7%A8%8B%E7%A4%BA%E6%84%8F%E5%9B%BE" class="hash-link" aria-label="常见的 vibe coding 流程示意图的直接链接" title="常见的 vibe coding 流程示意图的直接链接" translate="no">​</a></h3>
<!-- -->
<blockquote>
<p>黄色节点为"人"操作，蓝色为 AI 产出，红色为不理想结果。</p>
</blockquote>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="有没有更好的办法传统研发流程是怎么做的">有没有更好的办法？——传统研发流程是怎么做的<a href="https://binggg.github.io/blog/2025/07/21/kiro-spec-workflow#%E6%9C%89%E6%B2%A1%E6%9C%89%E6%9B%B4%E5%A5%BD%E7%9A%84%E5%8A%9E%E6%B3%95%E4%BC%A0%E7%BB%9F%E7%A0%94%E5%8F%91%E6%B5%81%E7%A8%8B%E6%98%AF%E6%80%8E%E4%B9%88%E5%81%9A%E7%9A%84" class="hash-link" aria-label="有没有更好的办法？——传统研发流程是怎么做的的直接链接" title="有没有更好的办法？——传统研发流程是怎么做的的直接链接" translate="no">​</a></h2>
<p>传统软件工程强调需求澄清、技术设计、任务拆分、过程可追溯。这样做虽然"慢"，但能让项目稳步推进、可复盘、可协作。</p>
<p>Kiro AI IDE 就把这种流程做成了"Spec 工作流"，让 AI 编程也能像工程师一样靠谱。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="传统研发流程示意图">传统研发流程示意图<a href="https://binggg.github.io/blog/2025/07/21/kiro-spec-workflow#%E4%BC%A0%E7%BB%9F%E7%A0%94%E5%8F%91%E6%B5%81%E7%A8%8B%E7%A4%BA%E6%84%8F%E5%9B%BE" class="hash-link" aria-label="传统研发流程示意图的直接链接" title="传统研发流程示意图的直接链接" translate="no">​</a></h3>
<!-- -->
<blockquote>
<p>该流程强调需求评审和迭代反馈，体现传统软件工程的闭环和持续优化。</p>
</blockquote>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="kiro-的-spec-工作流有多香">Kiro 的 Spec 工作流有多香？<a href="https://binggg.github.io/blog/2025/07/21/kiro-spec-workflow#kiro-%E7%9A%84-spec-%E5%B7%A5%E4%BD%9C%E6%B5%81%E6%9C%89%E5%A4%9A%E9%A6%99" class="hash-link" aria-label="Kiro 的 Spec 工作流有多香？的直接链接" title="Kiro 的 Spec 工作流有多香？的直接链接" translate="no">​</a></h2>
<p>Kiro 是 AWS 推出的 AI IDE，除了免费集成 Claude 4，更大的亮点是它的 Spec 工作流：</p>
<ul>
<li class="">每个项目下有 3 个核心文件：<!-- -->
<ol>
<li class=""><code>requirements.md</code> —— 需求文档（用 EARS 语法写用户故事和验收标准）</li>
<li class=""><code>design.md</code> —— 技术方案（架构、流程、注意事项）</li>
<li class=""><code>tasks.md</code> —— 任务清单（todolist，便于跟踪）</li>
</ol>
</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="什么是-ears-需求语法">什么是 EARS 需求语法？<a href="https://binggg.github.io/blog/2025/07/21/kiro-spec-workflow#%E4%BB%80%E4%B9%88%E6%98%AF-ears-%E9%9C%80%E6%B1%82%E8%AF%AD%E6%B3%95" class="hash-link" aria-label="什么是 EARS 需求语法？的直接链接" title="什么是 EARS 需求语法？的直接链接" translate="no">​</a></h3>
<p>EARS（简易需求语法）最早用于喷气发动机控制系统，后来被软件工程广泛采用。它用简单句式约束需求，避免"模糊表达"。</p>
<blockquote>
<p>例：When 用户点击"静音"，系统应当抑制所有音频输出。</p>
</blockquote>
<p>参考资料：<a href="https://alistairmavin.com/ears/" target="_blank" rel="noopener noreferrer" class="">EARS 语法指南</a> | <a href="https://v0-ears-syntax-guide-bd8ywxbxo-booker-zhaos-projects.vercel.app/" target="_blank" rel="noopener noreferrer" class="">v0.dev Cheat Sheet</a></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="claude-code-也能玩-spec-流程含实操演示和对话示例">Claude Code 也能玩 Spec 流程！（含实操演示和对话示例）<a href="https://binggg.github.io/blog/2025/07/21/kiro-spec-workflow#claude-code-%E4%B9%9F%E8%83%BD%E7%8E%A9-spec-%E6%B5%81%E7%A8%8B%E5%90%AB%E5%AE%9E%E6%93%8D%E6%BC%94%E7%A4%BA%E5%92%8C%E5%AF%B9%E8%AF%9D%E7%A4%BA%E4%BE%8B" class="hash-link" aria-label="Claude Code 也能玩 Spec 流程！（含实操演示和对话示例）的直接链接" title="Claude Code 也能玩 Spec 流程！（含实操演示和对话示例）的直接链接" translate="no">​</a></h2>
<p>即使没有 Kiro，其他 AI IDE 也能复刻这套流程。以 Claude Code 为例，整个过程可以非常丝滑：</p>
<ol>
<li class=""><strong>在项目下建立 CLAUDE.md</strong>
<ul>
<li class="">你可以把下面的提示词模板直接写进 CLAUDE.md，作为 AI 协作的"工作说明书"。</li>
<li class="">示例（可根据实际需求调整）：</li>
</ul>
</li>
</ol>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain"># CLAUDE.md</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">你是一个专业的 AI 编程助手，协助我用标准软件工程流程推进项目。请严格按照 Spec 工作流推进：</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">1. 需求澄清与确认，输出 requirements.md，采用 EARS 语法。</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">2. 技术方案设计，输出 design.md，包含架构、技术选型、接口、测试策略。</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">3. 任务拆分，输出 tasks.md，细化为可执行的 todolist。</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">4. 按照任务清单协助编码、测试，输出过程产物到 output/。</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">5. 重要：每一步都要和我确认，只有我确认后才能进入下一步。</span><br></div></code></pre></div></div>
<ol start="2">
<li class="">
<p><strong>启动 Claude Code，输入原始需求</strong></p>
<ul>
<li class="">直接把你的想法、用户故事写进对话框。</li>
<li class="">Claude 会自动读取 CLAUDE.md，开始和你进行需求澄清和确认。</li>
</ul>
</li>
<li class="">
<p><strong>需求确认后，Claude 输出 requirements.md</strong></p>
<ul>
<li class="">Claude 会用 EARS 语法梳理需求，生成标准的 requirements.md。</li>
<li class="">你可以随时补充、修改，Claude 会持续和你对齐。</li>
</ul>
</li>
<li class="">
<p><strong>技术方案设计</strong></p>
<ul>
<li class="">需求确认后，Claude 会自动进入 design.md 阶段，输出详细的技术方案。</li>
<li class="">包括架构、技术选型、接口、测试策略等。</li>
</ul>
</li>
<li class="">
<p><strong>任务拆分</strong></p>
<ul>
<li class="">Claude 会根据 design.md 自动生成 tasks.md，把方案拆分为可执行的 todolist。</li>
</ul>
</li>
<li class="">
<p><strong>逐步实现与验收</strong></p>
<ul>
<li class="">Claude 会按照 tasks.md 协助你逐步实现代码、测试，并输出所有过程产物到 output/ 目录。</li>
<li class="">你只需参与需求、设计、验收等关键评审环节。</li>
</ul>
</li>
</ol>
<blockquote>
<p>推荐 CLAUDE.md 提示词模板：
"你是一个专业的 AI 编程助手，协助我用标准软件工程流程推进项目。请严格按照 Spec 工作流推进，每一步都要和我确认，只有我确认后才能进入下一步。"</p>
</blockquote>
<p>这样，哪怕没有 Kiro，借助 Claude Code 也能轻松复刻 Spec 工作流，让 AI 编程变得高效、可控、可复盘。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="vibe-coding-与-spec-工作流对比流程图">vibe coding 与 Spec 工作流对比流程图<a href="https://binggg.github.io/blog/2025/07/21/kiro-spec-workflow#vibe-coding-%E4%B8%8E-spec-%E5%B7%A5%E4%BD%9C%E6%B5%81%E5%AF%B9%E6%AF%94%E6%B5%81%E7%A8%8B%E5%9B%BE" class="hash-link" aria-label="vibe coding 与 Spec 工作流对比流程图的直接链接" title="vibe coding 与 Spec 工作流对比流程图的直接链接" translate="no">​</a></h3>
<!-- -->
<blockquote>
<p>黄色节点为"人"参与评审，蓝色为 AI 产出，红色为不理想结果，绿色为高质量结果，灰色为流程分组。</p>
</blockquote>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="claude-code-复刻-spec-工作流对话示例">Claude Code 复刻 Spec 工作流对话示例<a href="https://binggg.github.io/blog/2025/07/21/kiro-spec-workflow#claude-code-%E5%A4%8D%E5%88%BB-spec-%E5%B7%A5%E4%BD%9C%E6%B5%81%E5%AF%B9%E8%AF%9D%E7%A4%BA%E4%BE%8B" class="hash-link" aria-label="Claude Code 复刻 Spec 工作流对话示例的直接链接" title="Claude Code 复刻 Spec 工作流对话示例的直接链接" translate="no">​</a></h3>
<div class="language-markdown codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-markdown codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token bold punctuation" style="color:#393A34">**</span><span class="token bold content">用户</span><span class="token bold punctuation" style="color:#393A34">**</span><span class="token plain">：我想做一个"AI 帮我自动整理会议纪要"的小工具，能帮我规划一下吗？</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token bold punctuation" style="color:#393A34">**</span><span class="token bold content">Claude</span><span class="token bold punctuation" style="color:#393A34">**</span><span class="token plain">（读取 CLAUDE.md 后自动响应）：</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">当然可以！我们将采用标准 Spec 工作流推进。首先，我会帮你澄清需求并输出 requirements.md。请问你希望支持哪些输入方式？比如：语音、文字、文件上传等？</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token bold punctuation" style="color:#393A34">**</span><span class="token bold content">用户</span><span class="token bold punctuation" style="color:#393A34">**</span><span class="token plain">：主要是上传录音文件，最好还能支持多种音频格式。</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token bold punctuation" style="color:#393A34">**</span><span class="token bold content">Claude</span><span class="token bold punctuation" style="color:#393A34">**</span><span class="token plain">：</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">明白了。还有输出格式有要求吗？比如纯文本、Markdown、Word 文档等？</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token bold punctuation" style="color:#393A34">**</span><span class="token bold content">用户</span><span class="token bold punctuation" style="color:#393A34">**</span><span class="token plain">：最好能导出 Markdown 和 Word。</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token bold punctuation" style="color:#393A34">**</span><span class="token bold content">Claude</span><span class="token bold punctuation" style="color:#393A34">**</span><span class="token plain">：</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">好的，需求已澄清。下面是基于 EARS 语法梳理的 requirements.md 草稿：</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token hr punctuation" style="color:#393A34">---</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token title important punctuation" style="color:#393A34">#</span><span class="token title important"> requirements.md</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token title important punctuation" style="color:#393A34">##</span><span class="token title important"> 用户故事</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">作为一名经常开会的用户，我希望能上传会议录音，自动生成结构化的会议纪要，并能导出为 Markdown 或 Word 文档，提升整理效率。</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token title important punctuation" style="color:#393A34">##</span><span class="token title important"> 验收标准</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">1.</span><span class="token plain"> When 用户上传音频文件时，the 系统 shall 支持多种主流音频格式（如 mp3, wav, m4a）。</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">2.</span><span class="token plain"> When 音频上传完成时，the 系统 shall 自动将音频转为文本并提取会议要点。</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">3.</span><span class="token plain"> When 用户点击导出时，the 系统 shall 支持导出为 Markdown 和 Word 文档。</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token hr punctuation" style="color:#393A34">---</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">请确认需求内容，或补充修改。确认后我将进入技术方案设计阶段。</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token bold punctuation" style="color:#393A34">**</span><span class="token bold content">用户</span><span class="token bold punctuation" style="color:#393A34">**</span><span class="token plain">：确认，没问题。</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token bold punctuation" style="color:#393A34">**</span><span class="token bold content">Claude</span><span class="token bold punctuation" style="color:#393A34">**</span><span class="token plain">：</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">收到！接下来输出 design.md：</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token hr punctuation" style="color:#393A34">---</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token title important punctuation" style="color:#393A34">#</span><span class="token title important"> design.md</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token title important punctuation" style="color:#393A34">##</span><span class="token title important"> 架构概述</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> 前端：文件上传、进度显示、导出按钮</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> 后端：音频转文本（调用 ASR 服务）、要点提取（大模型）、文档格式转换</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> 存储：临时存储音频和文本</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token title important punctuation" style="color:#393A34">##</span><span class="token title important"> 技术选型</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> 前端：React</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> 后端：Node.js + OpenAI/Claude API</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> ASR 服务：Whisper API</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> 文档导出：jsdocx、markdown-it</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token title important punctuation" style="color:#393A34">##</span><span class="token title important"> 流程</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">1.</span><span class="token plain"> 用户上传音频</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">2.</span><span class="token plain"> 后端转写为文本</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">3.</span><span class="token plain"> 调用大模型提取要点</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">4.</span><span class="token plain"> 前端展示并支持导出</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token title important punctuation" style="color:#393A34">##</span><span class="token title important"> 安全性</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> 文件仅临时存储，处理后自动删除</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token hr punctuation" style="color:#393A34">---</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">请确认技术方案，或补充修改。确认后我将拆分任务清单。</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token bold punctuation" style="color:#393A34">**</span><span class="token bold content">用户</span><span class="token bold punctuation" style="color:#393A34">**</span><span class="token plain">：确认。</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token bold punctuation" style="color:#393A34">**</span><span class="token bold content">Claude</span><span class="token bold punctuation" style="color:#393A34">**</span><span class="token plain">：</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">好的，下面是 tasks.md：</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token hr punctuation" style="color:#393A34">---</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token title important punctuation" style="color:#393A34">#</span><span class="token title important"> tasks.md</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> [ ] 搭建前端上传页面</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> [ ] 实现音频文件上传接口</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> [ ] 集成 ASR 服务实现音频转文本</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> [ ] 调用大模型提取会议要点</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> [ ] 实现导出 Markdown/Word 功能</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> [ ] 前后端联调与测试</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> [ ] 文档与验收</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token hr punctuation" style="color:#393A34">---</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">请确认任务清单，确认后我将协助你逐步实现每个任务。</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="cloudbase-ai-toolkit一站式复刻-spec-工作流">CloudBase AI ToolKit：一站式复刻 Spec 工作流<a href="https://binggg.github.io/blog/2025/07/21/kiro-spec-workflow#cloudbase-ai-toolkit%E4%B8%80%E7%AB%99%E5%BC%8F%E5%A4%8D%E5%88%BB-spec-%E5%B7%A5%E4%BD%9C%E6%B5%81" class="hash-link" aria-label="CloudBase AI ToolKit：一站式复刻 Spec 工作流的直接链接" title="CloudBase AI ToolKit：一站式复刻 Spec 工作流的直接链接" translate="no">​</a></h2>
<p>如果你想要更开箱即用的体验，可以试试 CloudBase AI ToolKit：</p>
<ul>
<li class="">支持多种 AI IDE</li>
<li class="">自带 Spec 工作流模板</li>
<li class="">一键生成、部署、托管全栈应用，无需运维</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="人机协作才是正解">人机协作，才是正解<a href="https://binggg.github.io/blog/2025/07/21/kiro-spec-workflow#%E4%BA%BA%E6%9C%BA%E5%8D%8F%E4%BD%9C%E6%89%8D%E6%98%AF%E6%AD%A3%E8%A7%A3" class="hash-link" aria-label="人机协作，才是正解的直接链接" title="人机协作，才是正解的直接链接" translate="no">​</a></h2>
<p>在 Spec 工作流下，AI 负责：</p>
<ul>
<li class="">模糊需求 → 需求方案</li>
<li class="">技术设计文档</li>
<li class="">任务清单</li>
<li class="">编码实现</li>
<li class="">验收测试</li>
</ul>
<p>人类只需参与：</p>
<ul>
<li class="">需求输入</li>
<li class="">需求/技术/排期/测试评审</li>
</ul>
<p>这样既能发挥 AI 的高效，又能保证工程质量。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="标准软件工程流程示意图">标准软件工程流程示意图<a href="https://binggg.github.io/blog/2025/07/21/kiro-spec-workflow#%E6%A0%87%E5%87%86%E8%BD%AF%E4%BB%B6%E5%B7%A5%E7%A8%8B%E6%B5%81%E7%A8%8B%E7%A4%BA%E6%84%8F%E5%9B%BE" class="hash-link" aria-label="标准软件工程流程示意图的直接链接" title="标准软件工程流程示意图的直接链接" translate="no">​</a></h3>
<!-- -->
<blockquote>
<p>黄色节点为"人"参与评审，蓝色为工程活动（可由 AI 或人协作完成），绿色为高质量结果。</p>
</blockquote>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="总结让-ai-编程更快更稳更靠谱">总结：让 AI 编程更快、更稳、更靠谱<a href="https://binggg.github.io/blog/2025/07/21/kiro-spec-workflow#%E6%80%BB%E7%BB%93%E8%AE%A9-ai-%E7%BC%96%E7%A8%8B%E6%9B%B4%E5%BF%AB%E6%9B%B4%E7%A8%B3%E6%9B%B4%E9%9D%A0%E8%B0%B1" class="hash-link" aria-label="总结：让 AI 编程更快、更稳、更靠谱的直接链接" title="总结：让 AI 编程更快、更稳、更靠谱的直接链接" translate="no">​</a></h2>
<p>Spec 工作流让 AI 编程不再是"碰运气"，而是"有章可循"。人类工程师的经验和判断，配合 AI 的高效执行，才能让开发真正提速、提质、可复盘。</p>
<blockquote>
<p>记住：AI 不是替代人，而是让人更强大。</p>
</blockquote>]]></content>
        <author>
            <name>Booker Zhao</name>
            <uri>https://binggg.github.io</uri>
        </author>
        <category label="AI" term="AI"/>
        <category label="全栈" term="全栈"/>
        <category label="开源" term="开源"/>
    </entry>
</feed>