第 7 章:功能迭代 — 搜索与分类的实现
💡 进群学习加 wx: agentupdate
(申请发送: agentupdate)
(申请发送: agentupdate)
你将学到什么
- 在已有代码基础上迭代新功能
/subagent-driven-developmentvs/executing-plans两种执行模式对比- 迭代开发中的上下文管理
7.1 从 P0 到 P1
前面几章我们实现了 P0 功能(笔记 CRUD + localStorage)。现在进入 P1:搜索和分类。
迭代新功能和从零开始不同:
| 从零开始 | 迭代新功能 |
|---|---|
| 没有现有代码约束 | 必须兼容已有代码 |
| 可以自由选架构 | 要遵循已定的模式 |
| 出错只影响自己 | 改错可能破坏已有功能 |
所以迭代时更依赖测试——已有测试是你的安全网。
7.2 为 P1 功能写计划
跟第 4 章一样,先写计划:
/writing-plans
在 NoteFlow P0 基础上实现 P1 功能:
搜索功能:
- 实时搜索(输入即搜索)
- 按标题和内容搜索
- 搜索结果高亮
分类标签:
- 预设标签:工作、生活、学习
- 点击标签筛选笔记
- 笔记可添加/移除标签
已有代码:
- src/utils/storage.js(localStorage 工具)
- src/hooks/useNotes.js(笔记数据管理)
- src/hooks/useSearch.js(搜索 Hook)
- src/components/(NoteList、NoteEditor、SearchBar)
技术约束:与 P0 保持一致
7.3 两种执行模式对比
superpowers 提供两种执行计划的方式:
flowchart TB
P[实施计划] --> Q{选哪种模式?}
Q --> A["/subagent-driven-development
━━━━━━━━━━━━━━━
逐个任务执行
每完成一个做两轮 review
串行,不并行"]
Q --> B["/executing-plans
━━━━━━━━━━━━━━━
批量执行
设置 checkpoint 定期检查
可并行子任务"]
A --> A1["适合:任务之间有依赖
需要严格质量把关"]
B --> B1["适合:任务互相独立
追求速度"]
style A fill:#dbeafe,stroke:#2563eb
style B fill:#fef3c7,stroke:#d97706| 对比维度 | subagent-driven | executing-plans |
|---|---|---|
| 执行方式 | 一个任务做完再做下一个 | 可以多个任务同时进行 |
| 质量把关 | 每个任务做完自动 review | 设置 checkpoint 统一 review |
| 速度 | 较慢(每步都 review) | 较快(并行 + 少 review) |
| 适合 | 首次实现、高风险任务 | 独立任务、低风险改动 |
| 模型选择 | implementer + 2 个 reviewer | 统一模型执行 |
本次选择
搜索和分类功能互相独立(搜索不依赖分类,分类不依赖搜索),可以用 /executing-plans。但我们选择 /subagent-driven-development——因为这是教程,让你看清每一步。
7.4 实战:迭代搜索功能
启动
/subagent-driven-development docs/superpowers/plans/noteflow-p1.md
搜索功能实现要点
implementer subagent 在已有 useSearch Hook 基础上增加高亮功能:
// src/utils/search.js — 新增高亮函数
export function highlightText(text, query) {
if (!query.trim()) return text;
const regex = new RegExp(`(${escapeRegex(query)})`, 'gi');
const parts = text.split(regex);
return parts.map((part, index) =>
part.toLowerCase() === query.toLowerCase()
? { type: 'highlight', text: part, key: index }
: { type: 'text', text: part, key: index }
);
}
function escapeRegex(string) {
return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
}
测试:
test('highlightText 标记匹配文本', () => {
const result = highlightText('Hello World', 'world');
expect(result).toEqual([
{ type: 'text', text: 'Hello ', key: 0 },
{ type: 'highlight', text: 'World', key: 1 },
{ type: 'text', text: '', key: 2 },
]);
});
test('highlightText 空搜索返回原文', () => {
const result = highlightText('Hello', '');
expect(result).toEqual([{ type: 'text', text: 'Hello', key: 0 }]);
});
spec reviewer 发现的问题
❌ Spec 不通过
- 缺失:搜索结果数量显示(spec 要求"显示 X 条结果")
- 缺失:搜索无结果时的空状态提示
implementer 修复
添加搜索结果计数和空状态:
// src/components/SearchBar.jsx — 增加
<div className="search-info">
{query && (
<span className="search-count">
找到 {filteredNotes.length} 条结果
</span>
)}
</div>
// src/components/NoteList.jsx — 增加空状态
{filteredNotes.length === 0 && query && (
<div className="empty-state">
<p>没有找到包含 "{query}" 的笔记</p>
<p className="empty-hint">试试其他关键词?</p>
</div>
)}
spec reviewer 复查
✅ 通过 — 所有需求均已实现
7.5 实战:迭代分类标签
分类功能的实现独立于搜索。implementer subagent 需要:
- 扩展数据结构:给笔记添加
tags字段 - 创建标签组件:
TagSelector.jsx - 实现筛选逻辑:
useTagFilter.js
关键代码:数据迁移
已有笔记没有 tags 字段,需要迁移:
// src/utils/migration.js
export function migrateNotes(notes) {
return notes.map(note => ({
...note,
tags: note.tags || [], // 旧笔记补充空标签数组
}));
}
测试:
test('旧笔记数据迁移', () => {
const oldNotes = [
{ id: '1', title: 'Test', content: 'Hi', createdAt: 1, updatedAt: 1 },
];
const migrated = migrateNotes(oldNotes);
expect(migrated[0].tags).toEqual([]);
});
test('已有标签的笔记不变', () => {
const notes = [
{ id: '1', title: 'Test', content: 'Hi', tags: ['工作'], createdAt: 1, updatedAt: 1 },
];
const migrated = migrateNotes(notes);
expect(migrated[0].tags).toEqual(['工作']);
});
7.6 上下文管理:/compact
到了这一步,对话可能已经很长了。Claude Code 的上下文窗口有限,太长的对话会影响性能。
用 /compact 压缩对话:
/compact
它会:
- 总结之前的对话内容
- 保留关键信息(代码决策、测试结果)
- 丢弃冗余内容(重复的审查输出)
- 释放上下文空间给后续任务
什么时候该 compact:
- 对话超过 20 轮
- Claude 开始"忘记"前面的代码
- 响应变慢或质量下降
7.7 两种模式的实际选择建议
flowchart TB
Q{任务之间有依赖吗?}
Q -- "有依赖" --> A["/subagent-driven-development
串行执行,每步 review"]
Q -- "互相独立" --> R{质量要求高吗?}
R -- "高(首次实现)" --> A
R -- "低(重复模式)" --> B["/executing-plans
批量执行,checkpoint 检查"]
style A fill:#dbeafe,stroke:#2563eb
style B fill:#fef3c7,stroke:#d97706动手做
- 为 P1 功能写一份实施计划
- 用
/subagent-driven-development执行搜索功能 - 观察搜索的 review 循环
- 继续执行分类功能
- 运行
/compact压缩对话 - 运行全量测试确认没有回归
本章小结
| 概念 | 说明 |
|---|---|
| 功能迭代 | 在已有代码上添加新功能,测试是安全网 |
| subagent-driven | 串行执行,每步两轮 review,质量优先 |
| executing-plans | 批量执行,checkpoint 检查,速度优先 |
| /compact | 压缩对话释放上下文空间 |
| 数据迁移 | 新增字段时需要处理旧数据 |
核心原则: 迭代开发时测试比从零开始更重要。每个新功能都应该跑全量测试,确认没有破坏已有功能。