Files
claude-code-mirror/claude-code-中文Wiki/09-状态与任务管理.md
2026-04-03 13:01:19 +08:00

391 lines
8.6 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 状态与任务管理
Claude Code 提供了强大的状态管理和任务管理系统来协调复杂的操作流程。
## 1. 状态管理 (state/)
### 1.1 状态存储机制
**核心文件:**
- `/src/state/store.ts` - 状态存储基础实现
- `/src/state/AppStateStore.ts` - 应用状态存储
- `/src/state/onChangeAppState.ts` - 状态变更处理
- `/src/state/selectors.ts` - 状态选择器
**Store 模式实现:**
```typescript
// 位置:/src/state/store.ts
export type Store<T> = {
getState: () => T // 获取当前状态
setState: (updater: (prev: T) => T) => void // 更新状态
subscribe: (listener: Listener) => () => void // 订阅变更
}
export function createStore<T>(
initialState: T,
onChange?: OnChange<T>
): Store<T>
```
**特性:**
- 不可变性Immutability状态更新采用函数式风格
- 订阅机制:支持多个监听器,变更时自动通知
- 变更回调:`onChange` 回调在状态变更后执行
### 1.2 AppState 结构
**位置:** `/src/state/AppStateStore.ts`
`AppState` 是全局状态的核心结构,包含以下主要部分:
```typescript
export type AppState = {
// 设置与配置
settings: SettingsJson
verbose: boolean
mainLoopModel: ModelSetting
// 任务管理
tasks: { [taskId: string]: TaskState }
agentNameRegistry: Map<string, AgentId>
foregroundedTaskId?: string
viewingAgentTaskId?: string
// MCP 状态
mcp: {
clients: MCPServerConnection[]
tools: Tool[]
commands: Command[]
resources: Record<string, ServerResource[]>
pluginReconnectKey: number
}
// 插件状态
plugins: {
enabled: LoadedPlugin[]
disabled: LoadedPlugin[]
commands: Command[]
errors: PluginError[]
installationStatus: {...}
needsRefresh: boolean
}
// Agent 定义
agentDefinitions: AgentDefinitionsResult
// 团队上下文
teamContext?: {
teamName: string
teamFilePath: string
leadAgentId: string
selfAgentId?: string
selfAgentName?: string
isLeader?: boolean
selfAgentColor?: string
teammates: {...}
}
// 推理状态
speculation: SpeculationState
thinkingEnabled: boolean | undefined
}
```
### 1.3 状态持久化
**持久化策略:**
- 设置存储在 `~/.claude/settings.json`
- 任务状态存储在 `~/.claude/tasks/{taskListId}/`
- 团队配置存储在 `~/.claude/teams/{team-name}/`
**状态恢复:**
- 应用启动时从磁盘加载设置
- 团队成员重新连接时恢复上下文
- 任务队列在会话间持久化
### 1.4 状态变更处理
**onChangeAppState.ts**
```typescript
// 状态变更时的处理逻辑
-
-
- UI
```
## 2. 任务管理 (tasks/)
### 2.1 任务类型
**位置:** `/src/tasks/types.ts`
Claude Code 支持多种任务类型:
```typescript
export type TaskState =
| LocalShellTaskState // 本地 Shell 任务
| LocalAgentTaskState // 本地 Agent 任务
| RemoteAgentTaskState // 远程 Agent 任务
| InProcessTeammateTaskState // 进程中队友任务
| LocalWorkflowTaskState // 本地工作流任务
| MonitorMcpTaskState // MCP 监控任务
| DreamTaskState // 异步任务
```
### 2.2 任务状态机
**任务状态流转:**
```
pending → in_progress → completed
↓ ↓ ↓
blocked blocked blocked
↓ ↓
cancelled cancelled
```
**状态定义:**
```typescript
type TaskStatus = 'pending' | 'in_progress' | 'completed' | 'cancelled' | 'blocked'
interface TaskState {
id: string
status: TaskStatus
subject: string
description?: string
activeForm?: string // 进行中的操作描述
owner?: string // 任务负责人
blocks: string[] // 此任务阻止的任务
blockedBy: string[] // 阻止此任务的任务
metadata?: Record<string, unknown>
}
```
### 2.3 任务工具
Claude Code 提供四个主要任务工具:
#### TaskCreateTool
**位置:** `/src/tools/TaskCreateTool/TaskCreateTool.ts`
```typescript
input: {
subject: string // 任务标题
description: string // 任务描述
activeForm?: string // 进行中显示文本
metadata?: Record<string, unknown> // 元数据
}
output: {
task: {
id: string
subject: string
}
}
```
**特性:**
- 创建任务后自动展开任务列表
- 支持任务创建钩子 (`TaskCreated` hooks)
- 阻止错误的钩子可取消创建
#### TaskUpdateTool
**位置:** `/src/tools/TaskUpdateTool/TaskUpdateTool.ts`
```typescript
input: {
taskId: string
subject?: string
description?: string
activeForm?: string
status?: TaskStatus | 'deleted'
addBlocks?: string[] // 此任务阻止的任务
addBlockedBy?: string[] // 阻止此任务的任务
owner?: string
metadata?: Record<string, unknown>
}
output: {
success: boolean
taskId: string
updatedFields: string[]
statusChange?: { from: string; to: string }
verificationNudgeNeeded?: boolean
}
```
**特性:**
- 支持原子字段更新
- 任务完成时触发 `TaskCompleted` 钩子
- 所有权变更时通知新负责人
- 阻止依赖任务处理
#### TaskListTool
列出所有任务,支持过滤和排序。
#### TaskStopTool
停止正在运行的任务。
### 2.4 任务间依赖
**依赖管理:**
```typescript
// 阻止关系
task.blocks = ['task-id-1', 'task-id-2'] // 此任务阻止这些任务
task.blockedBy = ['task-id-3'] // 此任务被这些任务阻止
// 依赖检查
function canStartTask(task: TaskState): boolean {
return task.blockedBy.every(id => isTaskCompleted(id))
}
```
### 2.5 任务输出 (TaskOutputTool)
**位置:** `/src/tools/TaskOutputTool/`
用于检索任务的执行输出和结果。
## 3. 任务与状态的集成
### 3.1 AppState 中的任务管理
```typescript
// 任务存储在 AppState.tasks 中
tasks: { [taskId: string]: TaskState }
// 任务 ID 注册表(用于按名称查找)
agentNameRegistry: Map<string, AgentId>
// 前台任务 ID
foregroundedTaskId?: string
// 查看中的 Agent 任务 ID
viewingAgentTaskId?: string
```
### 3.2 任务状态变更与 UI 更新
```typescript
// TaskCreateTool 和 TaskUpdateTool 自动更新 expandedView
context.setAppState(prev => {
if (prev.expandedView === 'tasks') return prev
return { ...prev, expandedView: 'tasks' as const }
})
```
## 4. 后台任务管理
### 4.1 背景任务识别
```typescript
export function isBackgroundTask(task: TaskState): boolean {
if (task.status !== 'running' && task.status !== 'pending') {
return false
}
// 前台任务isBackgrounded === false不是后台任务
if ('isBackgrounded' in task && task.isBackgrounded === false) {
return false
}
return true
}
```
### 4.2 任务清理
**Shell 任务清理:**
```typescript
// 位置:/src/tasks/LocalShellTask/killShellTasks.ts
export function killShellTasksForAgent(
agentId: AgentId,
getAppState: () => AppState,
setAppState: (updater: (prev: AppState) => AppState) => void
): void
```
### 4.3 任务与 Hooks 的集成
```typescript
// 任务创建钩子
executeTaskCreatedHooks(
taskId: string,
subject: string,
description: string,
agentName: string | undefined,
teamName: string | undefined,
// ...
)
// 任务完成钩子
executeTaskCompletedHooks(
taskId: string,
subject: string,
description: string,
agentName: string | undefined,
teamName: string | undefined,
// ...
)
```
## 5. 工作流集成
### 5.1 DreamTask
用于异步长时间运行的任务:
```typescript
// 位置:/src/tasks/DreamTask/DreamTask.ts
export type DreamTaskState = {
// 异步任务状态
}
```
### 5.2 InProcessTeammateTask
用于进程中队友通信的任务类型:
```typescript
// 位置:/src/tasks/InProcessTeammateTask/types.ts
export type InProcessTeammateTaskState = {
identity: TeammateIdentity
abortController?: AbortController
shutdownRequested?: boolean
// ...
}
```
## 6. 任务列表管理
### 6.1 任务列表 ID
```typescript
function getTaskListId(): string {
// 基于团队名称或会话 ID
}
```
### 6.2 任务通知
```typescript
// 任务更新通知
notifyTasksUpdated()
// 任务目录
getTasksDir(taskListId: string): string
```
## 7. 验证与提醒
当完成任务列表时,系统会检查是否需要进行验证:
```typescript
// 在 TaskUpdateTool 中
if (allTasks.length >= 3 && !allTasks.some(t => /verif/i.test(t.subject))) {
verificationNudgeNeeded = true
}
```
这提醒主线程 Agent 在没有验证步骤的情况下关闭了 3+ 个任务列表。