<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>SuperDevSpace 博客</title>
    <link>https://superdevspace.com/zh-hans/blog</link>
    <description>SuperDevSpace 的开发笔记：用你自己的 CLI 订阅运行 AI 智能体团队、git worktree、引导式设置等。</description>
    <language>zh-hans</language>
    <lastBuildDate>Sun, 25 Oct 2026 10:00:00 GMT</lastBuildDate>
    <atom:link href="https://superdevspace.com/zh-hans/blog/rss.xml" rel="self" type="application/rss+xml"/>
    <item>
      <title>引导式设置：带你走完任何网站流程的智能体</title>
      <link>https://superdevspace.com/zh-hans/blog/guided-setup-agent-any-website</link>
      <guid isPermaLink="true">https://superdevspace.com/zh-hans/blog/guided-setup-agent-any-website</guid>
      <pubDate>Sun, 25 Oct 2026 10:00:00 GMT</pubDate>
      <dc:creator>SuperDevSpace</dc:creator>
      <category>guided-setup</category>
      <category>browser</category>
      <category>agents</category>
      <description>智能体在控制台里操作，遇到密码、验证码和付款时把页面交给你，并把需要的 API 密钥存好。来看看它是如何运作的。</description>
      <content:encoded><![CDATA[<p>每个项目迟早都需要从某个网站上拿点东西：支付服务商的 API 密钥、一个 webhook 密钥、藏在控制台三级菜单深处的客户端令牌。智能体几分钟就能写好集成代码，然后停下来，让你自己去控制台里点——因为那一步发生在浏览器里，在你的登录之后。</p>
<p>引导式设置就是 SuperDevSpace 填补这个空缺的方式。智能体在应用自带的浏览器里打开网站，完成它被允许做的点击，等到下一步该你来做时，再附上一个指示和一句话，把页面交给你。</p>
<figure class="blog-figure"><img src="https://superdevspace.com/blog/shots/inspector-chain.webp" alt="应用内置浏览器面板中显示一个网页，选中的元素旁列出带文件和行号的组件链" loading="lazy" decoding="async"><figcaption>应用内的浏览器面板——引导式设置驱动的正是这个面板，此处与 Inspector 一起展示（真实应用，界面为土耳其语）。</figcaption></figure>
<h2 id="为什么-全交给智能体-是错误答案">为什么&quot;全交给智能体&quot;是错误答案</h2>
<p>这个功能最省事的做法，是把整个浏览器交给智能体：读每个字段、填每个输入框、按每个按钮。这样很快，但很糟糕。设置流程里到处都是智能体绝不该碰的东西：</p>
<ul>
<li>你的密码和手机收到的一次性验证码；</li>
<li>卡号、银行信息和身份证件；</li>
<li>你同意的条款和你批准的付款。</li>
</ul>
<p>所以设计从另一端出发。智能体负责例行工作——跳转、找到正确的页面、填写项目名称、点击<strong>创建</strong>——所有私人或具有约束力的事都留给你。</p>
<div class="table-scroll"><table><thead><tr><th>设置流程中的步骤</th><th>智能体</th><th>你</th></tr></thead><tbody><tr><td>打开控制台并找到正确的页面</td><td><span class="blog-yes" role="img" aria-label="是">✓</span></td><td></td></tr>
<tr><td>填写项目名称、URL、列表中的选项</td><td><span class="blog-yes" role="img" aria-label="是">✓</span></td><td></td></tr>
<tr><td>输入你的密码或手机验证码</td><td><span class="blog-no" role="img" aria-label="否">✗</span></td><td><span class="blog-yes" role="img" aria-label="是">✓</span></td></tr>
<tr><td>输入卡片、银行或身份信息</td><td><span class="blog-no" role="img" aria-label="否">✗</span></td><td><span class="blog-yes" role="img" aria-label="是">✓</span></td></tr>
<tr><td>勾选条款，点击&quot;付款&quot;或&quot;下单&quot;</td><td><span class="blog-no" role="img" aria-label="否">✗</span></td><td><span class="blog-yes" role="img" aria-label="是">✓</span></td></tr>
<tr><td>读取新的 API 密钥并存入 <code>.env</code></td><td><span class="blog-yes" role="img" aria-label="是">✓</span></td><td></td></tr></tbody></table></div>
<aside class="blog-callout blog-callout-note" role="note" aria-label="注意"><p class="blog-callout-title"><svg class="blog-icon" viewBox="0 0 24 24" width="18" height="18" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><circle cx="12" cy="12" r="10"/><path d="M12 16v-4"/><path d="M12 8h.01"/></svg><span>守住这条线的是应用本身</span></p><p>这些不是写在提示词里的建议。智能体试图越线的操作会被应用拒绝；它没法靠说服绕过去。</p>
</aside>
<h2 id="一次引导式设置如何进行">一次引导式设置如何进行</h2>
<p>在任何网站上，这个循环都一样，包括没人写过说明的网站。</p>
<div class="blog-steps"><ol>
<li><strong>打开页面。</strong> 智能体在应用内打开一个浏览器标签页。这个浏览器里的登录状态在重启后依然保留，所以你可能已经登录了。</li>
<li><strong>先看再动。</strong> 智能体获取页面概要：每个标题、按钮、链接、字段和框架各占一行。敏感字段只按类型列出——密码、卡片、银行、一次性验证码、身份——并标注&quot;已填写&quot;或&quot;空&quot;，绝不显示其值。</li>
<li><strong>做它那一半。</strong> 它点击、填写普通字段、读取文字；每次操作改变页面后都会重新读取。</li>
<li><strong>把你那一半交给你。</strong> 下一步轮到你时，智能体会在页面上显示一张引导卡片：一个简短标题、一条具体指示，并高亮它所指的字段或按钮。你完成这一步后，点击<strong>完成——交还</strong>。卡住了就点<strong>我需要帮助</strong>，写下你看到的内容，智能体会在页面上回答。</li>
<li><strong>在同一轮里等待。</strong> 引导卡片显示期间，智能体会等你。在你交还页面之前，它的点击和输入都会被拒绝；你随时可以点击<strong>停止 / 接管控制</strong>。</li>
<li><strong>把成果带回来。</strong> 当页面显示出你要的东西——API 密钥、令牌、webhook 密钥——智能体会将其作为机密读取，并放到该放的地方，例如项目的 <code>.env</code>。它报告的是密钥<em>在哪里</em>，而不是密钥本身。</li>
</ol>
</div>
<figure class="blog-diagram" data-diagram><img class="blog-diagram-img blog-diagram-light" src="https://superdevspace.com/blog/diagrams/9eeb4de2957689e5d9e2-light.svg" width="895" height="481" alt="一次引导式设置：从第一个页面到保存好的密钥" loading="lazy" decoding="async"><figcaption>一次引导式设置：从第一个页面到保存好的密钥</figcaption></figure>
<p>完成之后，你可以在不把任何机密打印到屏幕上的前提下检查结果：</p>
<pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">$</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> grep</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -o</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> '^PADDLE_[A-Z_]*='</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> .env</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">PADDLE_API_KEY</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">PADDLE_CLIENT_TOKEN</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">PADDLE_WEBHOOK_SECRET</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">PADDLE_ENVIRONMENT</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span></span></code></pre>
<h2 id="应用强制执行的规则">应用强制执行的规则</h2>
<p>这些是应用里的检查，智能体无法关闭：</p>
<ul>
<li><strong>机密不进也不出。</strong> 智能体不能在密码、卡号、CVC、IBAN、一次性验证码或身份证件字段中输入。它读取页面或截取快照时，这些值会被隐藏，并从它读到的任何文字中清除。</li>
<li><strong>截图会被涂盖。</strong> 敏感字段和所有跨源框架——比如银行卡组件、&quot;使用 Google 登录&quot;框——都会在智能体看到图像之前被遮住。</li>
<li><strong>敏感页面不运行脚本。</strong> 只要页面上出现这类字段，在页面中执行 JavaScript 就会被拒绝。</li>
<li><strong>同意和付款属于你。</strong> 点击条款复选框或&quot;付款&quot;/&quot;下单&quot;按钮会被拒绝。</li>
<li><strong>一切都可见。</strong> 智能体在浏览器面板里的操作，会实时显示在面板的横幅上。</li>
<li><strong>机密不进入对话。</strong> 作为机密读取的值会被标记为敏感，智能体被要求绝不在聊天、报告、任务备注或通知中复述。</li>
</ul>
<aside class="blog-callout blog-callout-warning" role="note" aria-label="警告"><p class="blog-callout-title"><svg class="blog-icon" viewBox="0 0 24 24" width="18" height="18" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3"/><path d="M12 9v4"/><path d="M12 17h.01"/></svg><span>警告</span></p><p>批准付款或接受条款，永远由你亲手点击。如果流程不经过这一步就无法继续，智能体会把页面交给你并等待。</p>
</aside>
<h2 id="适用于任何网站-而不是一份集成清单">适用于任何网站，而不是一份集成清单</h2>
<p>引导式设置是一个循环，而不是一套脚本库。即使是没人写过提示的网站它也能用，因为智能体读的是眼前真实的页面。我们为少数服务附带了简短的提示文件——例如 Paddle 的沙盒控制台和 RevenueCat——告诉智能体开发者设置通常在哪里。控制台的菜单经常变动，所以提示里写得很明白：页面和提示不一致时，以页面为准。</p>
<p>这比听起来更重要。智能体写的集成代码只是一个功能的一半；另一半是别人网站上的账户、密钥和 webhook。有了引导式设置，两半都在同一个会话里、由同一个智能体完成，而你只需把时间花在只有你能做的步骤上。</p>
<h2 id="它在整体中的位置">它在整体中的位置</h2>
<p>引导式设置和 SuperDevSpace 的其他一切都在同一个工作区里：为你编写支付集成的智能体，也正是在它终端旁的浏览器面板里带你创建密钥的那个。如果你是第一次来，<a href="https://superdevspace.com/zh-hans/blog/why-we-built-superdevspace">我们为什么做 SuperDevSpace</a> 介绍了它周围的整支团队。</p>
<h2 id="试一试">试一试</h2>
<p>试用期为 14 天 Premium，无需绑卡。<a href="https://superdevspace.com/download">下载 SuperDevSpace</a>，让智能体为你的项目设置一个支付或分析服务商，轮到你时，它会把页面交给你。</p>
]]></content:encoded>
    </item>
    <item>
      <title>用 git worktree 并行运行多个编码智能体</title>
      <link>https://superdevspace.com/zh-hans/blog/parallel-coding-agents-git-worktrees</link>
      <guid isPermaLink="true">https://superdevspace.com/zh-hans/blog/parallel-coding-agents-git-worktrees</guid>
      <pubDate>Sun, 25 Oct 2026 09:00:00 GMT</pubDate>
      <dc:creator>SuperDevSpace</dc:creator>
      <category>git-worktrees</category>
      <category>agents</category>
      <category>workflow</category>
      <description>SuperDevSpace 如何在同一个仓库里隔离多个编码智能体：每个 worker 独立的 git worktree 和分支、每轮自动提交、squash merge 合并。</description>
      <content:encoded><![CDATA[<p>在同一份检出里同时跑两个编码智能体，你很快就会明白软件团队为什么要用分支。一个智能体正在给模块改名，另一个却拿改了一半的代码去跑测试。一个把另一个刚删掉的文件加进了暂存区。它们谁都没错，只是共用了一张桌子。</p>
<p>SuperDevSpace 会在同一个仓库里同时运行一个 manager 和多个 worker。本文介绍让它们彼此隔离的机制——git worktree——以及应用围绕它遵守的具体规则。</p>
<h2 id="什么是-git-worktree">什么是 git worktree</h2>
<p>一个 git 仓库通常只有一个工作目录。<code>git worktree</code> 让同一个仓库拥有多个工作目录，每个检出在自己的分支上，所有目录共享同一个对象库。没有第二个克隆，也没有第二份历史：新建一个 worktree 只占用一份检出的文件，别无其他。</p>
<p>你可以在任何仓库里手动试一试。命令在哪儿都一样，只是 shell 不同：</p>
<div class="blog-tabs" data-tabs><section class="blog-tab-panel" id="blog-tab-1-0" data-tab-label="macOS / Linux"><p class="blog-tab-label">macOS / Linux</p><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">git</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> worktree</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> add</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -b</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> agent/frontend-demo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> ../myrepo-frontend</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">git</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> worktree</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> list</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">cd</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> ../myrepo-frontend</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> &#x26;&#x26; </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">git</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> status</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">cd</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> &#x26;&#x26; </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">git</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> worktree</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> remove</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> ../myrepo-frontend</span></span></code></pre>
</section><section class="blog-tab-panel" id="blog-tab-1-1" data-tab-label="Windows (PowerShell)"><p class="blog-tab-label">Windows (PowerShell)</p><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">git worktree add </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">b agent</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">/</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">frontend</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">demo ..\myrepo</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">frontend</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">git worktree list</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">cd ..\myrepo</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">frontend; git status</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">cd ..\myrepo; git worktree remove ..\myrepo</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">frontend</span></span></code></pre>
</section></div>
<p>每个 worktree 都有自己的 <code>HEAD</code>、自己的索引和自己的文件。两个进程可以同时在两个 worktree 里编辑、构建和测试，互相看不到对方改到一半的内容。这正是一支智能体团队需要的特性。</p>
<aside class="blog-callout blog-callout-note" role="note" aria-label="注意"><p class="blog-callout-title"><svg class="blog-icon" viewBox="0 0 24 24" width="18" height="18" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><circle cx="12" cy="12" r="10"/><path d="M12 16v-4"/><path d="M12 8h.01"/></svg><span>注意</span></p><p>删除 worktree 并不会删除它的分支。在你亲手删除分支之前，提交都会留在仓库里。</p>
</aside>
<h2 id="superdevspace-如何使用它们">SuperDevSpace 如何使用它们</h2>
<p>规则很简单，对每个组织都一样：</p>
<ul>
<li><strong>manager 在你的主检出里工作。</strong> 它负责规划、审查和合并；那是各分支汇合的唯一地方。</li>
<li><strong>每个 worker 在自己的分支上拥有自己的 worktree。</strong> manager 招聘 worker 时，应用会为它运行 <code>git worktree add -b &lt;branch&gt; &lt;path&gt;</code>。除非你自己命名，分支名为 <code>agent/&lt;worker 名&gt;-&lt;时间戳&gt;</code>。</li>
<li><strong>worktree 存放在应用自己的数据目录里</strong>，位于 <code>worktrees/&lt;组织&gt;/&lt;worker&gt;</code> 下，绝不放进你的仓库。你的项目文件夹不会被智能体的目录塞满。</li>
<li><strong>每一轮都会提交。</strong> worker 完成一轮后，应用会把它 worktree 里的所有改动提交（<code>agent(&lt;name&gt;): turn</code>）。worker 做过的任何事，都不会只停留在未提交的工作目录里。</li>
<li><strong>合并采用 squash merge。</strong> manager 接受某个 worker 的报告后，分支会通过 <code>git merge --squash</code> 以一个提交并入你的主线。如果合并冲突，应用会中止合并，把仓库恢复干净以便下一步操作，而不是把你丢在冲突的合并中间。</li>
<li><strong>每个仓库同一时间只执行一个 git 操作。</strong> worktree 目录隔离了文件；每个仓库一条队列，把 git 命令本身串行化，所以两个 worker 同时完成时，也不会争抢 git 的元数据。</li>
</ul>
<figure class="blog-diagram" data-diagram><img class="blog-diagram-img blog-diagram-light" src="https://superdevspace.com/blog/diagrams/bd28e40fbf5675286a02-light.svg" width="471" height="266" alt="两个 worker、两条分支、两次 squash merge" loading="lazy" decoding="async"><figcaption>两个 worker、两条分支、两次 squash merge</figcaption></figure>
<p>在看板上，这表现为几项任务同时在推进，每项属于不同的 worker，每项下面都有自己的分支。</p>
<figure class="blog-figure"><img src="https://superdevspace.com/blog/shots/board-sprint.webp" alt="一个冲刺看板，任务分布在待做、进行中、待审批、审查中和已完成等列" loading="lazy" decoding="async"><figcaption>组织看板上并行推进的任务——每个 worker 都在自己的分支上（真实应用，界面为土耳其语）。</figcaption></figure>
<h2 id="让它真正好用的细节">让它真正好用的细节</h2>
<p>新建的 worktree 只包含 git 跟踪的文件。这通常不足以把项目跑起来：<code>node_modules</code>、本地的 <code>.env</code>、生成的文件都没有。下面两个细节解决了这个问题。</p>
<h3 id="每个仓库一个初始化脚本">每个仓库一个初始化脚本</h3>
<p>如果你的仓库里有 <code>.super/scripts/setup-worktree.sh</code>，应用会在 worker 启动前，在每个新 worktree 里运行它，并用 <code>SUPERDEV_MAIN_REPO</code> 指向你的主检出。它的输出会实时显示，漫长的安装不再是盲等，而且你可以随时取消。</p>
<pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">#!/usr/bin/env bash</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">set</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -euo</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> pipefail</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 从主检出复制仅存在于本地的文件</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">cp</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$SUPERDEV_MAIN_REPO</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">/.env"</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> .env</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> 2></span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">/dev/null</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> ||</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> true</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 安装依赖（pnpm 从共享存储建立链接，所以很快）</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">pnpm</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> install</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> --frozen-lockfile</span></span></code></pre>
<aside class="blog-callout blog-callout-tip" role="note" aria-label="提示"><p class="blog-callout-title"><svg class="blog-icon" viewBox="0 0 24 24" width="18" height="18" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M15 14c.2-1 .7-1.7 1.5-2.5 1-.9 1.5-2.2 1.5-3.5A6 6 0 0 0 6 8c0 1 .2 2.2 1.5 3.5.7.7 1.3 1.5 1.5 2.5"/><path d="M9 18h6"/><path d="M10 22h4"/></svg><span>让初始化脚本保持轻快</span></p><p>脚本跑完之后 worker 才会启动；脚本失败则会中止启动，而不是让智能体在准备了一半的目录里干活。使用带共享存储的包管理器，每个新 worktree 的代价都很低。</p>
</aside>
<h3 id="子模块">子模块</h3>
<p><code>git worktree add</code> 不会填充子模块。如果新 worktree 里有 <code>.gitmodules</code> 文件，应用会在其中运行 <code>git submodule update --init --recursive</code>，避免 worker 在悄悄缺失依赖的情况下构建。</p>
<h2 id="清理时不丢失工作">清理时不丢失工作</h2>
<p>worktree 会越积越多。应用会回收它们，但非常谨慎：</p>
<figure class="blog-diagram" data-diagram><img class="blog-diagram-img blog-diagram-light" src="https://superdevspace.com/blog/diagrams/0aef79ecdc839e9b4dab-light.svg" width="367" height="656" alt="什么时候可以删除 worker 的 worktree" loading="lazy" decoding="async"><figcaption>什么时候可以删除 worker 的 worktree</figcaption></figure>
<p>有未提交改动的 worktree，或者其分支上还有尚未进入你主线的工作，都会原样保留。删掉的文件夹可以重建，丢掉的工作却回不来。对分支也一样谨慎：应用会记录自己创建的分支，并且只动这些分支。</p>
<h2 id="这对你意味着什么">这对你意味着什么</h2>
<p>每个 worker 都有自己的分支之后，&quot;同时跑四个智能体&quot;就不再是一场赌博。你可以：</p>
<ul>
<li>给 manager 一条能拆成独立任务的指令，让 worker 们并行工作；</li>
<li>单独阅读任何一个 worker 的 diff，旁边就是产生它的对话；</li>
<li>拒绝某个 worker 的改动，而不影响其他人；</li>
<li>团队工作时，你自己照常使用主检出。</li>
</ul>
<p>这和人类团队遵守的纪律是一样的，只是用在了那些不会提醒你&quot;我们快踩到对方脚了&quot;的智能体身上。如果你好奇我们为什么要围绕这件事做一整个应用，<a href="https://superdevspace.com/zh-hans/blog/why-we-built-superdevspace">第一篇文章</a>讲了这个故事。</p>
<h2 id="试一试">试一试</h2>
<p>14 天试用为 Premium，无需绑卡。<a href="https://superdevspace.com/download">下载 SuperDevSpace</a>，把一个新组织指向某个仓库，看着 manager 招聘第一批 worker 时一个个 worktree 随之出现。</p>
]]></content:encoded>
    </item>
    <item>
      <title>我们为什么做 SuperDevSpace：跑在你自己 CLI 订阅上的 AI 团队</title>
      <link>https://superdevspace.com/zh-hans/blog/why-we-built-superdevspace</link>
      <guid isPermaLink="true">https://superdevspace.com/zh-hans/blog/why-we-built-superdevspace</guid>
      <pubDate>Sun, 25 Oct 2026 08:00:00 GMT</pubDate>
      <dc:creator>SuperDevSpace</dc:creator>
      <category>launch</category>
      <category>agents</category>
      <category>claude-code</category>
      <description>manager 负责规划，worker 负责实现，各自拥有独立的终端和 git worktree，运行在你已付费的智能体 CLI 上。这是我们做它的原因。</description>
      <content:encoded><![CDATA[<p>如果你已经在为 Claude Code 这样的智能体 CLI 付费，那么你手里的能力远超一个终端窗口能用到的。模型会规划、会写代码、会跑测试，也能解释自己做了什么。它独自做不到的，是同时变成五个人、记清楚谁在做什么，并在一天结束时交给你一份如实的报告。</p>
<p>我们正是为了填补这个空缺才做了 SuperDevSpace。它是一款桌面应用，把你已有的 CLI 变成一支小团队：一个负责规划的 manager，加上负责干活的 worker，每个都有自己的终端和自己的 git worktree。</p>
<aside class="blog-callout blog-callout-note" role="note" aria-label="注意"><p class="blog-callout-title"><svg class="blog-icon" viewBox="0 0 24 24" width="18" height="18" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><circle cx="12" cy="12" r="10"/><path d="M12 16v-4"/><path d="M12 8h.01"/></svg><span>我们卖的是乐团，不是乐手</span></p><p>SuperDevSpace 不卖模型，也不卖 token。它驱动的是你已经付费的智能体 CLI，适用的是你与其提供方之间的协议。</p>
</aside>
<h2 id="一个终端-一个智能体的问题">一个终端、一个智能体的问题</h2>
<p>和单个编码智能体协作，做一件事时体验很好。可一旦同一个仓库里有三件事要做，就乱套了：</p>
<ul>
<li>你可以再开一个终端，但两个智能体会改同一份检出。一个在跑测试，另一个正重构到一半。</li>
<li>你成了项目经理。拆分工作的是你，记住哪个终端在做哪项任务的是你，在会话之间来回搬上下文的也是你。</li>
<li>没有人记录发生了什么。午饭回来，唯一的记录就是终端的滚动缓冲区。</li>
</ul>
<p>这些都不是模型的问题，而是组织的问题——而组织恰恰是软件擅长的事。</p>
<div class="table-scroll"><table><thead><tr><th></th><th>一个终端，一个智能体</th><th>一个 SuperDevSpace 组织</th></tr></thead><tbody><tr><td>并行工作且互不冲突</td><td><span class="blog-no" role="img" aria-label="否">✗</span></td><td><span class="blog-yes" role="img" aria-label="是">✓</span></td></tr>
<tr><td>每个 worker 独立的 worktree 和分支</td><td><span class="blog-no" role="img" aria-label="否">✗</span></td><td><span class="blog-yes" role="img" aria-label="是">✓</span></td></tr>
<tr><td>工作拆成看板上的任务</td><td><span class="blog-no" role="img" aria-label="否">✗</span></td><td><span class="blog-yes" role="img" aria-label="是">✓</span></td></tr>
<tr><td>每项任务一份书面报告</td><td><span class="blog-no" role="img" aria-label="否">✗</span></td><td><span class="blog-yes" role="img" aria-label="是">✓</span></td></tr>
<tr><td>合入前由你审阅 diff</td><td><span class="blog-yes" role="img" aria-label="是">✓</span></td><td><span class="blog-yes" role="img" aria-label="是">✓</span></td></tr>
<tr><td>运行在你已付费的 CLI 上</td><td><span class="blog-yes" role="img" aria-label="是">✓</span></td><td><span class="blog-yes" role="img" aria-label="是">✓</span></td></tr></tbody></table></div>
<h2 id="superdevspace-实际做了什么">SuperDevSpace 实际做了什么</h2>
<p>在 SuperDevSpace 里，每个仓库就是一个<strong>组织</strong>。每个组织都有一个 <strong>manager</strong>：一个运行在真实终端里的真实智能体 CLI 会话，你能看到它，也能直接在里面输入。你用日常语言给 manager 下达一条指令——打字也行，用语音输入口述也行。</p>
<figure class="blog-diagram" data-diagram><img class="blog-diagram-img blog-diagram-light" src="https://superdevspace.com/blog/diagrams/5103c27c383a20d63995-light.svg" width="423" height="640" alt="一条指令如何变成合并好的成果" loading="lazy" decoding="async"><figcaption>一条指令如何变成合并好的成果</figcaption></figure>
<p>接着，manager 会做一个团队负责人会做的事：</p>
<div class="blog-steps"><ol>
<li><strong>规划。</strong> 它开启一个冲刺，把指令拆成看板上的任务，每项任务附一份简短的说明。</li>
<li><strong>招人。</strong> 它为这些任务招聘 worker。每个 worker 都是另一个真实的 CLI 会话，运行在自己可见的终端标签页里，并带有一个角色——前端开发、QA 工程师等等。</li>
<li><strong>隔离。</strong> 每个 worker 在自己的分支上拥有自己的 git worktree，并行的工作永远不会在同一份检出里相撞。另一篇文章解释了<a href="https://superdevspace.com/zh-hans/blog/parallel-coding-agents-git-worktrees">它是怎么做到的</a>。</li>
<li><strong>审查。</strong> worker 完成后提交报告。manager 审查报告、合并分支，发现问题就要求修改。</li>
<li><strong>汇报。</strong> 你收到的是一份汇总报告，而不是五段滚动记录。</li>
</ol>
</div>
<figure class="blog-figure"><img src="https://superdevspace.com/blog/shots/team-roles.webp" alt="“添加你的智能体”对话框：前端、后端、QA 工程师、代码审查、设计师、DevOps 等角色组成的网格，以及名称栏和可选的额外指示" loading="lazy" decoding="async"><figcaption>组建团队时为 worker 选择角色（真实应用，界面为土耳其语）。</figcaption></figure>
<p>你随时可以插手。每个智能体都有聊天视图和它真实的终端——同一个会话，两种看法。每处改动都会以 diff 的形式出现在产生它的对话旁边，所以在进入你的主线之前，你都能先审阅。</p>
<figure class="blog-figure"><img src="https://superdevspace.com/blog/shots/board-sprint.webp" alt="一个组织的冲刺看板，包含待办池、待做、进行中、待审批、审查中和已完成等列，以及按泳道标注的任务卡片" loading="lazy" decoding="async"><figcaption>团队工作时，一个演示组织的冲刺看板（真实应用，界面为土耳其语）。</figcaption></figure>
<h2 id="你的订阅-你的机器-你的代码">你的订阅、你的机器、你的代码</h2>
<p>最重要的设计决定也是最简单的：<strong>SuperDevSpace 驱动的是你已经付费的 CLI。</strong> 我们从不转售模型访问，所以除了 SuperDevSpace 订阅本身，你运行的任何东西都不会出现在我们的账单上。</p>
<p>这个决定带来了一些我们喜欢的结果：</p>
<ul>
<li><strong>智能体作为本地进程运行在你的机器上</strong>，操作的是你的本地仓库。你的源代码、提示词、终端输出和文件路径永远不会发送到我们的服务器。我们的账户服务只保存一个账户、一个订阅状态和一份设备列表。</li>
<li><strong>CLI 按组织选择。</strong> Claude Code、OpenAI Codex、Gemini CLI、Aider、Qwen Code、Cursor CLI 和 OpenCode 都可以选。目前应用支持最完整的是 Claude Code——hooks、会话恢复、MCP 工具、权限应答。其余六个也能启动和运行；应用会把它们标为实验性，并告诉你哪些附加功能还没接通，而不是悄悄失败。</li>
<li><strong>没有任何东西被锁在我们的云里</strong>，因为根本没有云在替你干活。</li>
</ul>
<p>在下达第一条指令之前，不妨先确认 CLI 和仓库都在你预期的位置：</p>
<pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">$</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> claude</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> --version</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">$</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> cd</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> ~/code/your-project</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">$</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> git</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> status</span></span></code></pre>
<h2 id="团队周边的配套">团队周边的配套</h2>
<p>一支团队需要的不只是终端。每个套餐都包含的几样东西：</p>
<ul>
<li><strong>说实话的看板。</strong> 冲刺、任务、说明和报告。报告会写明哪里失败了，而不只是哪里通过了。</li>
<li><strong>Inspector。</strong> 在正在运行的网页上点击一个元素，就能把它连同组件、文件和行号一起发给智能体。支持 Vite、Next.js 和静态网站。</li>
<li><strong>在手机上审批。</strong> 智能体需要你做决定时会来问你。手机应用会显示看板、智能体和待处理的审批，离开工位也能回应权限请求。</li>
<li><strong>每个组织一块白板</strong>（Excalidraw），智能体可以阅读，也可以在上面画图。</li>
</ul>
<figure class="blog-figure blog-figure-video"><video class="blog-video" muted loop playsinline controls preload="metadata" data-autoplay aria-label="产品导览中的一段无声短循环：创建组织以及最初的几步"><source src="https://superdevspace.com/media/superdevspace-tanitim-loop.mp4" type="video/mp4"></video><figcaption>真实产品导览中的几秒钟（界面为土耳其语）。</figcaption></figure>
<p>Premium 还加入了走得更远的功能：基于 Penpot 的设计模式，配有直接在文件里绘图的 Designer 智能体；按时间表执行指令的定时任务；以及让你 Mac 上的 manager 把工作交给 Windows 电脑上的 manager 的对等连接。完整对比见<a href="https://superdevspace.com/pricing">价格页面</a>。</p>
<h2 id="我们不承诺的事">我们不承诺的事</h2>
<aside class="blog-callout blog-callout-warning" role="note" aria-label="警告"><p class="blog-callout-title"><svg class="blog-icon" viewBox="0 0 24 24" width="18" height="18" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3"/><path d="M12 9v4"/><path d="M12 17h.01"/></svg><span>宁可准确，也不要唬人</span></p><p>SuperDevSpace 不会让模型变得更聪明，它只是给模型一个工作的结构。它运行在 macOS（Apple 芯片）和 Windows（64 位）上；Linux 版还没有日期，我们也不会编一个。</p>
</aside>
<p>一支智能体团队仍然需要一个老板：做什么由你决定，什么能进入主分支由你批准。</p>
<h2 id="试一试">试一试</h2>
<p>试用期为 14 天 Premium，无需绑卡。你的 CLI 订阅仍然是你的，你的代码也是。想看看这支团队在你自己的仓库里干活，就<a href="https://superdevspace.com/download">下载 SuperDevSpace</a>，给 manager 下达第一条指令。</p>
]]></content:encoded>
    </item>
  </channel>
</rss>
