案例:开发 Svelte Todo 应用
项目背景
本案例演示如何使用 Superpowers 的 subagent-driven-development 技能开发一个完整的 Web 应用。项目是一个 Svelte Todo 应用,包含:
- 任务列表展示
- 添加/删除/完成任务
- 数据持久化
- 响应式设计
工作流程演示
阶段一:设计(brainstorming)
触发: 需要开发一个任务管理应用
AI 行为:
- 探索需求:需要哪些功能?用户是谁?
- 技术选型:Svelte vs React?本地存储 vs 后端 API?
- 设计文档:
docs/design.md
设计文档片段:
markdown
# Todo 应用设计
## 核心功能
- 添加任务
- 完成任务(勾选)
- 删除任务
- 任务计数
## 技术栈
- Svelte(轻量级响应式框架)
- LocalStorage(数据持久化)
## 组件结构
- App.svelte - 主容器
- TodoList.svelte - 任务列表
- TodoItem.svelte - 单个任务
- AddTodo.svelte - 添加表单阶段二:计划(writing-plans)
AI 将设计分解为独立任务:
markdown
## Task 1: 项目初始化
- 文件:`package.json`, `rollup.config.js`
- 验证:`npm run dev` 启动成功
## Task 2: 创建基础组件
- 文件:`src/App.svelte`
- 验证:页面显示 "Todo App" 标题
## Task 3: 实现任务列表
- 文件:`src/TodoList.svelte`, `src/TodoItem.svelte`
- 验证:显示 3 个硬编码任务
## Task 4: 添加任务功能
- 文件:`src/AddTodo.svelte`
- 验证:可以添加新任务
## Task 5: 完成和删除
- 文件:更新相关组件
- 验证:勾选、删除功能正常
## Task 6: 数据持久化
- 文件:`src/stores/todos.js`
- 验证:刷新页面后任务保留阶段三:子代理驱动开发
subagent-driven-development 技能的工作方式:
┌─────────────┐
│ 主会话 │
│ (协调者) │
└──────┬──────┘
│
├──► Task 1 ──► Spec Review ──► Code Review ──► ✓
│
├──► Task 2 ──► Spec Review ──► Code Review ──► ✓
│
├──► Task 3 ──► Spec Review ──► ✗ ──► 修复 ──► ✓
│
└──► ...每个任务的流程:
- 子代理接收任务描述
- 实现功能
- Spec Review:检查是否符合计划
- Code Review:检查代码质量
- 通过则继续下一个任务
阶段四:验证
验证清单:
- [ ] 所有任务按计划完成
- [ ] 功能测试通过
- [ ] 代码审查无严重问题
- [ ] 文档更新
阶段五:完成
Git Worktree 使用:
bash
# 创建隔离工作区
git worktree add ../todo-feature feature/todo-app
# 在隔离环境中开发
cd ../todo-feature
# 完成后合并
git worktree remove ../todo-feature关键代码
Svelte Store(状态管理)
javascript
// src/stores/todos.js
import { writable } from 'svelte/store';
import { browser } from '$app/environment';
const initial = browser
? JSON.parse(localStorage.getItem('todos') || '[]')
: [];
export const todos = writable(initial);
todos.subscribe(value => {
if (browser) {
localStorage.setItem('todos', JSON.stringify(value));
}
});
export function addTodo(text) {
todos.update(list => [...list, {
id: Date.now(),
text,
completed: false
}]);
}
export function toggleTodo(id) {
todos.update(list => list.map(todo =>
todo.id === id
? { ...todo, completed: !todo.completed }
: todo
));
}
export function deleteTodo(id) {
todos.update(list => list.filter(todo => todo.id !== id));
}TodoList 组件
svelte
<!-- src/lib/TodoList.svelte -->
<script>
import { todos, toggleTodo, deleteTodo } from '../stores/todos.js';
import TodoItem from './TodoItem.svelte';
</script>
<div class="todo-list">
{#each $todos as todo (todo.id)}
<TodoItem
{todo}
on:toggle={() => toggleTodo(todo.id)}
on:delete={() => deleteTodo(todo.id)}
/>
{:else}
<p class="empty">No tasks yet. Add one above!</p>
{/each}
</div>
<style>
.todo-list {
margin-top: 1rem;
}
.empty {
color: #888;
text-align: center;
}
</style>TodoItem 组件
svelte
<!-- src/lib/TodoItem.svelte -->
<script>
export let todo;
import { createEventDispatcher } from 'svelte';
const dispatch = createEventDispatcher();
</script>
<div class="todo-item" class:completed={todo.completed}>
<input
type="checkbox"
checked={todo.completed}
on:change={() => dispatch('toggle')}
/>
<span>{todo.text}</span>
<button on:click={() => dispatch('delete')}>×</button>
</div>
<style>
.todo-item {
display: flex;
align-items: center;
padding: 0.5rem;
border-bottom: 1px solid #eee;
}
.completed span {
text-decoration: line-through;
color: #888;
}
button {
margin-left: auto;
background: none;
border: none;
color: #dc3545;
font-size: 1.5rem;
cursor: pointer;
}
</style>关键学习点
1. subagent-driven-development 流程
- 任务自动分发到子代理
- 两阶段审查确保质量
- 失败任务自动重试
2. 多代理协作
- 主会话负责协调
- 子代理专注单一任务
- 审查代理独立验证
3. Git Worktree 使用
- 隔离开发环境
- 并行处理多个功能
- 安全的分支管理
4. TDD 与审查结合
- Spec Review:功能对齐
- Code Review:代码质量
- 双重保障
扩展练习
- 添加分类:为任务添加标签/分类功能
- 到期日期:添加任务截止日期
- 拖拽排序:实现任务拖拽重排
- 云同步:添加后端 API 同步
相关技能
- subagent-driven-development - 子代理驱动开发
- brainstorming - 需求探索与设计
- writing-plans - 任务分解
- using-git-worktrees - Git Worktree 使用
- finishing-a-development-branch - 分支完成流程