371 lines
25 KiB
HTML
371 lines
25 KiB
HTML
<!DOCTYPE html>
|
||
<html lang="zh-CN">
|
||
<head>
|
||
<meta charset="UTF-8">
|
||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||
<title>CodeStable 深度解析 — github-learn</title>
|
||
<script src="https://cdn.jsdelivr.net/npm/mermaid/dist/mermaid.min.js"></script>
|
||
<style>
|
||
*,*::before,*::after{box-sizing:border-box;margin:0;padding:0}
|
||
html{scroll-behavior:smooth}
|
||
body{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI","Noto Sans SC",Roboto,"Helvetica Neue",sans-serif;background:#f8fafc;color:#1e293b;line-height:1.75;font-size:16px}
|
||
.wrapper{max-width:860px;margin:0 auto;padding:0 24px}
|
||
.article-header{background:linear-gradient(135deg,#0f172a 0%,#1e3a5f 100%);color:#f1f5f9;padding:64px 0 48px;margin-bottom:48px}
|
||
.article-header h1{font-size:2rem;font-weight:700;line-height:1.3;margin-bottom:16px;letter-spacing:-0.02em}
|
||
.article-header .meta{display:flex;gap:16px;flex-wrap:wrap;font-size:.875rem;color:#94a3b8}
|
||
.article-header .tags{display:flex;gap:8px;flex-wrap:wrap;margin-top:12px}
|
||
.article-header .tag{background:rgba(255,255,255,0.1);border:1px solid rgba(255,255,255,0.2);padding:2px 10px;border-radius:12px;font-size:.75rem;color:#cbd5e1}
|
||
.module{margin-bottom:48px}
|
||
.module-title{font-size:1.35rem;font-weight:700;color:#0f172a;padding-bottom:8px;border-bottom:3px solid #3b82f6;margin-bottom:24px;display:flex;align-items:center;gap:8px}
|
||
.tldr-box{background:linear-gradient(135deg,#eff6ff,#dbeafe);border-left:4px solid #3b82f6;border-radius:8px;padding:24px;margin-bottom:32px}
|
||
.tldr-box .core{font-size:1.1rem;font-weight:600;margin-bottom:12px}
|
||
.tldr-box .hook{background:#fff;border:1px dashed #93c5fd;border-radius:6px;padding:12px 16px;margin-bottom:12px;font-size:.95rem}
|
||
.tldr-box .anchor{font-style:italic;color:#475569;font-size:.9rem}
|
||
.mnemonic-card{background:#fffbeb;border:2px dashed #f59e0b;border-radius:8px;padding:20px 24px;margin:24px 0;font-family:"Courier New",monospace;font-size:.95rem;line-height:1.8;white-space:pre-wrap}
|
||
.mnemonic-card::before{content:"🧠 巧记卡片";display:block;font-family:-apple-system,sans-serif;font-weight:700;color:#b45309;margin-bottom:8px;font-size:.85rem}
|
||
.story-box{background:#f1f5f9;border-radius:8px;padding:20px 24px;margin:24px 0;border-left:3px solid #64748b}
|
||
.story-box .story-label{font-size:.8rem;font-weight:700;color:#64748b;text-transform:uppercase;letter-spacing:.05em;margin-bottom:8px}
|
||
.ascii-box{background:#0f172a;color:#a5f3fc;border-radius:8px;padding:20px 24px;margin:24px 0;font-family:"Courier New",monospace;font-size:.85rem;line-height:1.6;overflow-x:auto;white-space:pre}
|
||
.mermaid-box{background:#fff;border:1px solid #e2e8f0;border-radius:8px;padding:24px;margin:24px 0;text-align:center}
|
||
.table-wrap{overflow-x:auto;margin:24px 0}
|
||
table{width:100%;border-collapse:collapse;font-size:.9rem}
|
||
th{background:#f1f5f9;text-align:left;padding:10px 14px;border-bottom:2px solid #cbd5e1;font-weight:600}
|
||
td{padding:10px 14px;border-bottom:1px solid #e2e8f0}
|
||
tr:hover td{background:#f8fafc}
|
||
.fission-section{background:#fef2f2;border-left:4px solid #dc2626;border-radius:8px;padding:24px;margin:32px 0}
|
||
.fission-section .fission-title{font-size:1.05rem;font-weight:700;color:#991b1b;margin-bottom:16px}
|
||
.fission-section .fission-label{display:inline-block;background:#dc2626;color:#fff;font-size:.7rem;font-weight:700;padding:2px 8px;border-radius:4px;margin-bottom:12px}
|
||
.fission-section .search-internal{display:inline-block;background:#f1f5f9;border:1px solid #cbd5e1;font-size:.75rem;padding:2px 8px;border-radius:4px;color:#475569;margin-bottom:12px}
|
||
.faq-box{margin:24px 0}
|
||
details{border:1px solid #e2e8f0;border-radius:6px;margin-bottom:8px;overflow:hidden;transition:border-color .2s}
|
||
details:hover{border-color:#94a3b8}
|
||
details[open]{border-color:#3b82f6}
|
||
summary{padding:14px 18px;cursor:pointer;font-weight:500;background:#f8fafc;user-select:none}
|
||
details[open] summary{border-bottom:1px solid #e2e8f0;background:#eff6ff}
|
||
details .faq-body{padding:16px 18px;font-size:.95rem;line-height:1.7}
|
||
.quiz-box{counter-reset:quiz;margin:24px 0}
|
||
.quiz-item{background:#f8fafc;border:1px solid #e2e8f0;border-radius:6px;padding:14px 18px;margin-bottom:10px;font-size:.95rem;counter-increment:quiz}
|
||
.quiz-item::before{content:counter(quiz) ". ";font-weight:700;color:#3b82f6}
|
||
pre{background:#0f172a;color:#e2e8f0;border-radius:8px;padding:18px 20px;overflow-x:auto;font-size:.85rem;line-height:1.6;margin:20px 0}
|
||
code{font-family:"JetBrains Mono","Fira Code","Consolas",monospace}
|
||
p code,li code{background:#f1f5f9;padding:2px 6px;border-radius:4px;font-size:.85em;color:#b91c1c}
|
||
p{margin-bottom:16px}
|
||
ul,ol{margin-bottom:16px;padding-left:24px}
|
||
li{margin-bottom:6px}
|
||
h2{font-size:1.25rem;margin:28px 0 12px;color:#0f172a}
|
||
h3{font-size:1.1rem;margin:24px 0 10px;color:#1e293b}
|
||
h4{font-size:1rem;margin:20px 0 8px;color:#334155}
|
||
blockquote{border-left:3px solid #3b82f6;padding:12px 18px;margin:20px 0;background:#f8fafc;border-radius:0 6px 6px 0;color:#475569}
|
||
.roi-grid{display:grid;grid-template-columns:1fr 1fr;gap:16px;margin:24px 0}
|
||
.roi-card{background:#f0fdf4;border:1px solid #bbf7d0;border-radius:8px;padding:16px}
|
||
.roi-card .roi-label{font-size:.75rem;font-weight:700;color:#16a34a;text-transform:uppercase;margin-bottom:4px}
|
||
.roi-card .roi-value{font-weight:600;font-size:1rem}
|
||
.anti-pattern td:first-child{color:#dc2626}
|
||
.anti-pattern td:last-child{color:#16a34a}
|
||
.article-footer{text-align:center;padding:32px 0;margin-top:48px;border-top:1px solid #e2e8f0;color:#94a3b8;font-size:.85rem}
|
||
#search-input{width:100%;padding:12px 16px;border:2px solid #e2e8f0;border-radius:8px;font-size:.95rem;margin-bottom:32px;outline:none;transition:border-color .2s;font-family:inherit}
|
||
#search-input:focus{border-color:#3b82f6}
|
||
.hidden{display:none !important}
|
||
@media(max-width:640px){.article-header h1{font-size:1.5rem}.roi-grid{grid-template-columns:1fr}.wrapper{padding:0 16px}}
|
||
@media print{.article-header{background:#fff !important;color:#000 !important;padding:24px 0}.article-header h1{color:#000}#search-input{display:none}}
|
||
</style>
|
||
</head>
|
||
<body>
|
||
|
||
<header class="article-header">
|
||
<div class="wrapper">
|
||
<h1>CodeStable 深度解析:编排软件生命周期,而非编排 Agent</h1>
|
||
<div class="meta"><span>叫我小杨同学的小码酱</span><span>2026-05-19</span></div>
|
||
<div class="tags">
|
||
<span class="tag">CodeStable</span><span class="tag">AI Engineering</span><span class="tag">Agent Skills</span><span class="tag">Harness Engineering</span><span class="tag">Human-in-the-Loop</span><span class="tag">工作流</span>
|
||
</div>
|
||
</div>
|
||
</header>
|
||
|
||
<div class="wrapper" id="content-area">
|
||
|
||
<input type="text" id="search-input" placeholder="搜索知识点..." autocomplete="off">
|
||
|
||
<section class="module">
|
||
<h2 class="module-title">📌 核心摘要</h2>
|
||
<div class="tldr-box">
|
||
<p class="core">CodeStable 是首个将 AI 编码工作流的建模对象从"Agent 怎么协作"翻转为"软件要素怎么组织"的框架——它管的不再是 Agent,而是需求、架构、特性、问题、知识这六个实体的完整生命周期。</p>
|
||
<div class="hook"><strong>认知挂钩</strong>:想象你在管一个图书馆。SuperPowers 和 OpenSpec 在优化"管理员怎么工作得更高效"。CodeStable 在问一个更根本的问题——书有没有被正确分类、编目、放在对的书架上?管理员再高效,书是乱的,三年后谁也找不到东西。CodeStable 就是那个图书分类法。</div>
|
||
<div class="anchor"><strong>真理锚点</strong>:"软件工程的混乱本质上不是 Agent 不够强,而是要素没被组织好。" —— liuzhengdong</div>
|
||
</div>
|
||
</section>
|
||
|
||
<section class="module">
|
||
<h2 class="module-title">🧊 概念破冰</h2>
|
||
|
||
<div class="mnemonic-card">AI 框架两派分:
|
||
Agent 编排派 → 管的是"谁干什么、怎么配合"
|
||
软件要素派 → 管的是"需求架构特性问题知识,每样都放对位置"
|
||
|
||
CodeStable 选了后者。记住6+3:
|
||
6 实体(Req, Arch, Roadmap, Feature, Issue, Compound)
|
||
3 流程(特性引入、问题修复、代码重构)</div>
|
||
|
||
<div class="story-box">
|
||
<div class="story-label">📖 故事引入</div>
|
||
<p>2026 年初,开发者 liuzhengdong 正在开发一套新的 Harness Agent。一开始他用 VibeCoding——只写设计和需求,代码由 AI 改。这样撑了大部分特性开发。</p>
|
||
<p>直到有一天,Codex 反复解决不了一个"他认为比较简单"的问题,<strong>反复在同一个地方犯错</strong>。</p>
|
||
<p>他意识到:项目变大了,AI 开始迷失。不是因为 AI 不够聪明,而是因为之前的那些需求、设计决策、架构约束全忘了——这些信息散落在对话历史里,每次都丢失。</p>
|
||
<p>他调研了 OpenSpec、SuperPowers、Oh-My-OpenAgent,没一个让他满意。于是从零写了 CodeStable。2026 年 4 月发布,不到两个月,781 stars。</p>
|
||
</div>
|
||
|
||
<div class="ascii-box">Agent 编排派(SuperPowers / OpenSpec / OMO):
|
||
┌─────┐ ┌─────┐ ┌─────┐
|
||
│Agent1│←→│Agent2│←→│Agent3│ ← 编排的是 Agent
|
||
└─────┘ └─────┘ └─────┘
|
||
↓ ↓ ↓
|
||
[代码] [代码] [代码] ← 软件要素在对话中丢失
|
||
|
||
软件要素派(CodeStable):
|
||
┌──────────┐ ┌──────────┐ ┌──────────┐
|
||
│Requirement│ │Architecture│ │ Feature │ ← 编排的是软件要素
|
||
└──────────┘ └──────────┘ └──────────┘
|
||
↑ ↑ ↑
|
||
└────────────┼────────────┘
|
||
│
|
||
[Agent 们] ← Agent 是执行体,不是建模对象
|
||
│
|
||
codestable/ ← 所有产物持久化在文件系统</div>
|
||
</section>
|
||
|
||
<section class="module">
|
||
<h2 class="module-title">🔬 深度解析</h2>
|
||
|
||
<h3>哲学内核:为什么"人在环"不是弱点而是设计选择</h3>
|
||
<p>CodeStable 最受争议的点,也是它与主流框架最根本的分歧:<strong>它认为程序员必须是"在环对象"</strong>。</p>
|
||
<p>2026 年 2 月,Hashicorp 联合创始人 Mitchell Hashimoto 提出了 <strong>Harness Engineering(驾驭工程)</strong> 概念——"人类掌舵,Agent 执行"。CodeStable 是这一范式在"编码工作流"领域的具体实现。</p>
|
||
<p>它不反对自动化。它反对的是<strong>不留下痕迹的自动化</strong>。当 AI 自主完成一个 feature 后,三个月后另一个 developer 面对这段代码时,为什么这么设计?当时有哪些备选方案?这些设计依赖了什么约束?——全部丢失了。</p>
|
||
<p>CodeStable 的回答:<strong>每做一个决定,就在 codestable/ 目录里写下来。</strong> 给人读的,不是给 AI 自嗨的。</p>
|
||
|
||
<h3>6 个实体 + 3 个流程</h3>
|
||
|
||
<div class="mermaid-box">
|
||
<div class="mermaid">
|
||
flowchart TD
|
||
CS["cs 根入口"] --> ONBOARD["cs-onboard 初始化"]
|
||
ONBOARD --> REQ["cs-req: 需求实体"]
|
||
ONBOARD --> ARCH["cs-arch: 架构实体"]
|
||
REQ --> ROADMAP["cs-roadmap: 路线图实体"]
|
||
ARCH --> ROADMAP
|
||
ROADMAP --> FEAT["cs-feat: 特性流程"]
|
||
ROADMAP --> ISSUE["cs-issue: 问题流程"]
|
||
ROADMAP --> REFACTOR["cs-refactor: 重构流程"]
|
||
FEAT --> FEAT_D["cs-feat-design"]
|
||
FEAT_D --> FEAT_I["cs-feat-impl"]
|
||
FEAT_I --> FEAT_A["cs-feat-accept"]
|
||
ISSUE --> ISSUE_R["cs-issue-report"]
|
||
ISSUE_R --> ISSUE_A["cs-issue-analyze"]
|
||
ISSUE_A --> ISSUE_F["cs-issue-fix"]
|
||
FEAT_A --> COMPOUND["compound: 知识沉淀"]
|
||
ISSUE_F --> COMPOUND
|
||
REFACTOR --> COMPOUND
|
||
COMPOUND --> LEARN["cs-learn: 经验"]
|
||
COMPOUND --> TRICK["cs-trick: 模式"]
|
||
COMPOUND --> DECIDE["cs-decide: 决策"]
|
||
COMPOUND --> EXPLORE["cs-explore: 探索"]
|
||
LEARN -. "下次被检索" .-> ARCH
|
||
TRICK -. "下次被检索" .-> FEAT_D
|
||
DECIDE -. "下次被检索" .-> ISSUE_A
|
||
EXPLORE -. "下次被检索" .-> ROADMAP
|
||
</div>
|
||
</div>
|
||
|
||
<div class="table-wrap">
|
||
<table>
|
||
<tr><th>实体</th><th>英文</th><th>核心用途</th></tr>
|
||
<tr><td><strong>需求</strong></td><td>requirements</td><td>原始用户故事、讨论与权衡。代码烂掉时最终的逃生通道</td></tr>
|
||
<tr><td><strong>架构</strong></td><td>architecture</td><td>系统编排层文档,精简统一,<strong>给人读的</strong></td></tr>
|
||
<tr><td><strong>路线图</strong></td><td>roadmap</td><td>大需求拆解——模块拆分 + 接口契约 + 子 feature 清单</td></tr>
|
||
<tr><td><strong>特性</strong></td><td>feature</td><td>实际工程执行,design → impl → accept 三步闭环</td></tr>
|
||
<tr><td><strong>问题</strong></td><td>issue</td><td>Bug 单,report → analyze → fix,analyze 和 fix 强制分离</td></tr>
|
||
<tr><td><strong>知识</strong></td><td>compound</td><td>复利工程:经验 / 模式 / 决策 / 探索,四种知识类型</td></tr>
|
||
</table>
|
||
</div>
|
||
|
||
<h3>分层架构:不是流水线,是"分层 + 事件驱动"</h3>
|
||
|
||
<div class="table-wrap">
|
||
<table>
|
||
<tr><th>层</th><th>内容</th><th>触发时机</th></tr>
|
||
<tr><td><strong>阶段 0</strong></td><td>cs-onboard 初始化骨架</td><td>新项目接入(一次)</td></tr>
|
||
<tr><td><strong>第 1 层</strong></td><td>cs-req / cs-arch 长效档案</td><td>需求/架构变更(反复刷新)</td></tr>
|
||
<tr><td><strong>第 2 层</strong></td><td>cs-roadmap 规划</td><td>大需求拆解(按需进入)</td></tr>
|
||
<tr><td><strong>讨论入口</strong></td><td>cs-brainstorm 分诊</td><td>想法模糊时(可选)</td></tr>
|
||
<tr><td><strong>第 3 层</strong></td><td>cs-feat-* / cs-issue-* / cs-refactor-*</td><td>事件驱动</td></tr>
|
||
<tr><td><strong>横切层</strong></td><td>cs-learn / cs-trick / cs-decide / cs-explore</td><td>任意时刻觉得"值得记下来"</td></tr>
|
||
</table>
|
||
</div>
|
||
|
||
<h3>运行时结构:codestable/ 目录设计</h3>
|
||
<pre><code>你的项目/
|
||
├── codestable/
|
||
│ ├── requirements/ # 需求("为什么要有这个能力")
|
||
│ ├── architecture/ # 架构("用什么结构实现")
|
||
│ ├── roadmap/ # 路线图("接下来怎么走")
|
||
│ ├── features/YYYY-MM-DD-{slug}/ # 特性执行
|
||
│ ├── issues/YYYY-MM-DD-{slug}/ # 问题修复
|
||
│ ├── refactors/YYYY-MM-DD-{slug}/ # 重构(beta)
|
||
│ ├── compound/ # 知识沉淀(复利工程)
|
||
│ │ └── YYYY-MM-DD-{type}-{slug}.md
|
||
│ ├── tools/ # 共享脚本
|
||
│ └── reference/ # 共享参考文档
|
||
└── AGENTS.md</code></pre>
|
||
|
||
<h3>硬约束:Skill 隔离与依赖注入</h3>
|
||
<p>每个 skill 运行时只能看到自己包内的文件。跨 skill 共享的文档由 cs-onboard 从技能包<strong>复制</strong>到项目的 codestable/reference/,其他 skill 通过项目相对路径读取。这本质上是一个<strong>依赖注入</strong>模式——skill 是通用逻辑,codestable/ 是注入的运行时上下文。</p>
|
||
</section>
|
||
|
||
<section class="module">
|
||
<h2 class="module-title">💥 深度裂变</h2>
|
||
|
||
<div class="fission-section">
|
||
<div class="fission-label">颠覆认知</div>
|
||
<div class="fission-title">"编排软件要素"是真的范式创新,还是旧酒新瓶?</div>
|
||
|
||
<p>对 CodeStable 最尖锐的批判性审视。</p>
|
||
|
||
<h4>正方:确实在范式层面做了翻转</h4>
|
||
<p>所有主流 AI 编码框架都在"Agent 编排"范式下工作。CodeStable 问的是另一个问题:<strong>软件的需求、约束、决策怎么被记下来、被检索、被复用?</strong></p>
|
||
<p>实践后果:知识沉淀从"副作用"变成"一等公民"。SuperPowers 跑完 TDD → 得到代码和测试。CodeStable 跑完 feature → 得到代码 + design + acceptance + compound。后者在"三个月后还能被理解"上有结构性优势。</p>
|
||
|
||
<h4>反方:四个没有解决的问题</h4>
|
||
<ol>
|
||
<li><strong>知识检索依赖 AI 上下文窗口</strong>:compound/ 积累 200 个文件后,AI 能一次读完吗?没有索引或向量检索。</li>
|
||
<li><strong>没有强制执行机制</strong>:SuperPowers 的 TDD 是铁律,CodeStable 的 accept 执行深度取决于人。人把关不严,质量门形同虚设。</li>
|
||
<li><strong>cs-brainstorm 的分诊能力受限</strong>:让 AI 判断模糊想法"该走哪个流程",这个判断本身就需要很高的理解力。</li>
|
||
<li><strong>对竞品的批评不完全公平</strong>:OpenSpec 的 Spec 文件设计目标就是人机双读。很多用户的实际体验并非"人类没法读"。</li>
|
||
</ol>
|
||
|
||
<div class="search-internal">🔍 搜索内化:V2EX 和 LINUX DO 社区反馈——"正确性对我来说够了,按照流程生成完手动审查,不复杂的需求基本一次性搞定"——但也指出"上下文一长就会忘"的知识检索问题。作者在 Roadmap 中坦承多个模块仍在 beta。</div>
|
||
|
||
<h4>一个被忽略的关键信号:CodeStable 承认自己会"过时"</h4>
|
||
<blockquote>"CodeStable 会根据模型能力的发展进行调整。如果未来某个模型做到某个模块的稳定产出,那么这个模块就可以删除。"</blockquote>
|
||
<p>这让它区别于绝大多数 AI 框架——不是试图建立永恒的体系,而是承认自己是<strong>过渡性工具</strong>。这种"自我消解的诚实"在 AI 工具领域极为罕见。</p>
|
||
</div>
|
||
</section>
|
||
|
||
<section class="module">
|
||
<h2 class="module-title">🎯 实战指南</h2>
|
||
|
||
<h3>快速开始</h3>
|
||
<pre><code># 安装
|
||
npx skills add https://github.com/liuzhengdongfortest/CodeStable
|
||
|
||
# 初始化项目
|
||
/cs-onboard
|
||
|
||
# 日常使用——不知道用哪个就喊根入口
|
||
/cs</code></pre>
|
||
|
||
<h3>典型工作流</h3>
|
||
<pre><code># 场景 A:新增功能
|
||
/cs-feat → /cs-feat-design → /cs-feat-impl → /cs-feat-accept
|
||
|
||
# 场景 B:修 Bug
|
||
/cs-issue → /cs-issue-report → /cs-issue-analyze → /cs-issue-fix
|
||
|
||
# 场景 C:快速小改动
|
||
/cs-feat-ff # 超轻量通道
|
||
|
||
# 场景 D:沉淀知识
|
||
/cs-learn # 踩坑经验
|
||
/cs-trick # 可复用模式
|
||
/cs-decide # 技术决策</code></pre>
|
||
|
||
<h3>避坑指南</h3>
|
||
<div class="table-wrap">
|
||
<table class="anti-pattern">
|
||
<tr><th>🔴 反模式</th><th>✅ 正确做法</th></tr>
|
||
<tr><td>跳过 cs-onboard,手动创建 codestable/</td><td>必须用 cs-onboard 初始化,确保 reference/ 被正确复制</td></tr>
|
||
<tr><td>cs-feat-impl 中不看 design 自己脑补</td><td>design 是唯一输入,偏离 design 必须回退更新 design</td></tr>
|
||
<tr><td>所有改动都走 cs-feat(太重)</td><td>小改动用 cs-feat-ff,大功能走完整流程</td></tr>
|
||
<tr><td>compound 文件乱命名</td><td>严格遵循 YYYY-MM-DD-{type}-{slug}.md 格式</td></tr>
|
||
<tr><td>不写 acceptance 报告</td><td>acceptance 报告是"三个月后能理解"的关键</td></tr>
|
||
</table>
|
||
</div>
|
||
|
||
<h3>CodeStable 与你现有 dev-flow 的融合点</h3>
|
||
<div class="table-wrap">
|
||
<table>
|
||
<tr><th>dev-flow 阶段</th><th>CodeStable 替代/增强</th></tr>
|
||
<tr><td>Phase 0 初始 PRD</td><td>cs-req 沉淀为需求文档(更持久)</td></tr>
|
||
<tr><td>Phase 1.5 结构化 PRD</td><td>cs-feat-design 作为 design 文档</td></tr>
|
||
<tr><td>Phase 2 grill-with-docs</td><td>cs-brainstorm 作为讨论入口</td></tr>
|
||
<tr><td>Phase 2.5 zoom-out</td><td>cs-arch 单独维护架构文档</td></tr>
|
||
<tr><td>Phase 3 执行</td><td>cs-feat-impl + cs-feat-accept</td></tr>
|
||
<tr><td>Phase 4 收尾</td><td>cs-learn / cs-decide 沉淀知识</td></tr>
|
||
</table>
|
||
</div>
|
||
|
||
<h3>ROI 分析</h3>
|
||
<div class="roi-grid">
|
||
<div class="roi-card"><div class="roi-label">初始化</div><div class="roi-value">cs-onboard 2 分钟 → 建好所有目录骨架</div></div>
|
||
<div class="roi-card"><div class="roi-label">Feature 流程</div><div class="roi-value">比 OpenSpec 多 5-10 分钟 → 留下 design + acceptance + compound</div></div>
|
||
<div class="roi-card"><div class="roi-label">学习成本</div><div class="roi-value">30-45 分钟熟悉 22 技能 → 覆盖完整软件生命周期</div></div>
|
||
<div class="roi-card"><div class="roi-label">长期收益</div><div class="roi-value">3 个月后 feature 设计可回溯 → 消除隐知识丢失</div></div>
|
||
</div>
|
||
</section>
|
||
|
||
<section class="module">
|
||
<h2 class="module-title">📝 温故知新</h2>
|
||
|
||
<h3>FAQ</h3>
|
||
<div class="faq-box">
|
||
<details><summary>CodeStable 和 dev-flow 谁更好?</summary><div class="faq-body">不是替代关系。dev-flow 是流程编排元技能,CodeStable 是软件生命周期建模体系。可组合使用:dev-flow 的 grill-with-docs 补充 CodeStable 缺少的术语对齐;CodeStable 的 compound 补充 dev-flow 缺少的结构化知识沉淀。</div></details>
|
||
<details><summary>CodeStable 适合一个人用吗?</summary><div class="faq-body">非常适合。设计前提就是"一个人在环"——没有团队角色、没有多 Agent 协作。如果是一个人维护的长期项目,CodeStable 是目前最合适的框架。</div></details>
|
||
<details><summary>CodeStable 和 SuperPowers 能一起用吗?</summary><div class="faq-body">理论上可以,但不推荐。哲学对立——SuperPowers 希望人少介入,CodeStable 要求人在环。建议根据项目类型选一个主线。</div></details>
|
||
<details><summary>codestable/ 目录会变得很臃肿吗?</summary><div class="faq-body">会,这是有意为之。"臃肿"的文档目录好过"干净"的失忆。日期前缀使按时间浏览很自然,compound 通过 type 字段做聚合。</div></details>
|
||
<details><summary>轻量通道 cs-feat-ff 什么时候用?</summary><div class="faq-body">非常明确的小改动——"把按钮颜色改蓝"、"加一个表单字段"。不确定该不该走 ff,就走完整流程。</div></details>
|
||
<details><summary>如果不想用全部 22 个技能怎么办?</summary><div class="faq-body">技能是松耦合的。最精简子集:cs-onboard + cs-req + cs-feat + cs-issue。</div></details>
|
||
<details><summary>知识检索能力有多强?</summary><div class="faq-body">目前是"文件命名约定 + AI 选择性读取",非向量语义检索。compound/ 积累 50+ 文件后需要引导 AI 只读相关的。</div></details>
|
||
<details><summary>和 mattpocock/skills 的关系?</summary><div class="faq-body">同样 Skills 封装形式,建模哲学不同。mattpocock 是"小工具"——每个解决特定问题。CodeStable 是"体系"——每个是软件生命周期中的一个步骤。</div></details>
|
||
</div>
|
||
|
||
<h3>自测题</h3>
|
||
<div class="quiz-box">
|
||
<div class="quiz-item">CodeStable 的 6 个软件实体是哪 6 个?每个的核心用途是什么?</div>
|
||
<div class="quiz-item">"编排 Agent"和"编排软件要素"的根本区别是什么?在工程实践上会产生什么不同的后果?</div>
|
||
<div class="quiz-item">CodeStable 的 3 个核心流程分别是什么?每个流程的技能链是什么?</div>
|
||
<div class="quiz-item">cs-feat-design 为什么被设计为"后续所有步骤的唯一输入"?这种设计避免了什么问题?</div>
|
||
<div class="quiz-item">compound/ 目录下的 4 种知识类型分别是什么?它们会在什么时机被 AI 重新检索?</div>
|
||
<div class="quiz-item">CodeStable 为什么要求每个 skill 运行时只能看到自己包内的文件?这个硬约束解决了什么问题?</div>
|
||
<div class="quiz-item">CodeStable 作者所说的"复利工程"(Compound Engineering)具体指什么?</div>
|
||
<div class="quiz-item">如果你要将 CodeStable 集成到你现有的 dev-flow 中,哪些 Phase 可以保留、哪些可以用 CodeStable 替换?</div>
|
||
</div>
|
||
|
||
<h3>参考资源</h3>
|
||
<ul>
|
||
<li>GitHub:<a href="https://github.com/liuzhengdongfortest/CodeStable">liuzhengdongfortest/CodeStable</a></li>
|
||
<li>作者的项目 MA:<a href="https://github.com/liuzhengdongfortest/MA">liuzhengdongfortest/MA</a></li>
|
||
<li>Harness Engineering (Mitchell Hashimoto, 2026.02)</li>
|
||
<li>V2EX 讨论:<a href="https://global.v2ex.co/t/1208525">厌倦了 OpenSpec、OMO、SuperPowers?试试 CodeStable</a></li>
|
||
</ul>
|
||
</section>
|
||
|
||
</div>
|
||
|
||
<footer class="article-footer">
|
||
<div class="wrapper"><p>© 2026 叫我小杨同学的小码酱 | 知识吸收器 v3.0 | 真理锚定已通过</p></div>
|
||
</footer>
|
||
|
||
<script>
|
||
mermaid.initialize({startOnLoad:true,theme:'base',themeVariables:{primaryColor:'#3b82f6',primaryBorderColor:'#1d4ed8',primaryTextColor:'#1e293b',lineColor:'#64748b',secondaryColor:'#f1f5f9',tertiaryColor:'#eff6ff',fontFamily:'-apple-system,BlinkMacSystemFont,"Segoe UI","Noto Sans SC",sans-serif',fontSize:'14px'},flowchart:{useMaxWidth:true,htmlLabels:true,curve:'basis'}});
|
||
window.onload=function(){
|
||
const input=document.getElementById('search-input');
|
||
if(!input)return;
|
||
input.addEventListener('input',(e)=>{
|
||
const term=e.target.value.toLowerCase().trim();
|
||
const contentArea=document.getElementById('content-area');
|
||
const blocks=contentArea.querySelectorAll('p,li,blockquote,.fission-section,.mnemonic-card,details,.mermaid-box,.ascii-box,.story-box,.tldr-box,.table-wrap,pre,.quiz-item,.roi-card,.faq-box details');
|
||
if(term.length===0){blocks.forEach(el=>el.classList.remove('hidden'));document.querySelectorAll('h1,h2,h3,h4').forEach(el=>el.classList.remove('hidden'));return}
|
||
blocks.forEach(el=>el.classList.add('hidden'));document.querySelectorAll('h1,h2,h3,h4').forEach(el=>el.classList.add('hidden'));
|
||
blocks.forEach(el=>{if(el.innerText.toLowerCase().includes(term))el.classList.remove('hidden')})})};
|
||
</script>
|
||
</body>
|
||
</html>
|