@liangjie559567/ultrapower 5.0.21 → 5.0.23

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/.claude-plugin/plugin.json +1 -1
  2. package/commands/ax-analyze-error.md +0 -1
  3. package/commands/ax-context.md +0 -1
  4. package/commands/ax-decompose.md +0 -1
  5. package/commands/ax-draft.md +0 -1
  6. package/commands/ax-evolution.md +0 -1
  7. package/commands/ax-evolve.md +0 -1
  8. package/commands/ax-export.md +0 -1
  9. package/commands/ax-implement.md +0 -1
  10. package/commands/ax-knowledge.md +0 -1
  11. package/commands/ax-reflect.md +0 -1
  12. package/commands/ax-review.md +0 -1
  13. package/commands/ax-rollback.md +0 -1
  14. package/commands/ax-status.md +0 -1
  15. package/commands/ax-suspend.md +0 -1
  16. package/commands/brainstorm.md +0 -1
  17. package/commands/execute-plan.md +0 -1
  18. package/commands/write-plan.md +0 -1
  19. package/dist/__tests__/validateMode.test.d.ts +2 -0
  20. package/dist/__tests__/validateMode.test.d.ts.map +1 -0
  21. package/dist/__tests__/validateMode.test.js +100 -0
  22. package/dist/__tests__/validateMode.test.js.map +1 -0
  23. package/dist/lib/validateMode.d.ts +49 -0
  24. package/dist/lib/validateMode.d.ts.map +1 -0
  25. package/dist/lib/validateMode.js +68 -0
  26. package/dist/lib/validateMode.js.map +1 -0
  27. package/docs/CLAUDE.md +1 -1
  28. package/docs/prd/ultrapower-standards-draft.md +191 -0
  29. package/docs/prd/ultrapower-standards-rough.md +560 -0
  30. package/docs/reviews/ultrapower-standards/review_critic.md +230 -0
  31. package/docs/reviews/ultrapower-standards/review_domain.md +243 -0
  32. package/docs/reviews/ultrapower-standards/review_product.md +102 -0
  33. package/docs/reviews/ultrapower-standards/review_tech.md +142 -0
  34. package/docs/reviews/ultrapower-standards/review_ux.md +110 -0
  35. package/docs/reviews/ultrapower-standards/summary.md +85 -0
  36. package/docs/standards/README.md +85 -0
  37. package/docs/standards/agent-lifecycle.md +445 -0
  38. package/docs/standards/anti-patterns.md +365 -0
  39. package/docs/standards/audit-report.md +388 -0
  40. package/docs/standards/contribution-guide.md +208 -0
  41. package/docs/standards/hook-execution-order.md +320 -0
  42. package/docs/standards/runtime-protection.md +336 -0
  43. package/docs/standards/state-machine.md +316 -0
  44. package/docs/standards/templates/agent-template.md +63 -0
  45. package/docs/standards/templates/hook-template.md +74 -0
  46. package/docs/standards/templates/skill-template.md +48 -0
  47. package/docs/standards/user-guide.md +290 -0
  48. package/docs/tasks/ultrapower-standards/manifest.md +441 -0
  49. package/package.json +1 -1
@@ -0,0 +1,316 @@
1
+ # 状态机规范
2
+
3
+ > **ultrapower-version**: 5.0.21
4
+ > **优先级**: P0(必须遵守)
5
+ > **真理之源**: `docs/standards/audit-report.md`
6
+ > **覆盖范围**: T-05(Agent 状态机 + Team Pipeline 转换矩阵)
7
+
8
+ ---
9
+
10
+ ## 目录
11
+
12
+ 1. [Agent 完整状态机](#1-agent-完整状态机)
13
+ - 1.1 状态定义
14
+ - 1.2 状态转换图
15
+ - 1.3 死状态说明(TIMEOUT / ZOMBIE)
16
+ 2. [Team Pipeline 状态转换矩阵](#2-team-pipeline-状态转换矩阵)
17
+ - 2.1 阶段定义
18
+ - 2.2 阶段转换规则
19
+ - 2.3 终态处理
20
+ 3. [各模式状态文件路径](#3-各模式状态文件路径)
21
+ 4. [Stale 检测规则](#4-stale-检测规则)
22
+ 5. [互斥模式检测规则](#5-互斥模式检测规则)
23
+
24
+ ---
25
+
26
+ ## 1. Agent 完整状态机
27
+
28
+ ### 1.1 状态定义
29
+
30
+ 来源:`src/hooks/subagent-tracker/index.ts`
31
+
32
+ | 状态 | 描述 | 是否终态 |
33
+ |------|------|----------|
34
+ | `SPAWNED` | Agent 已创建,等待首次工具调用 | 否 |
35
+ | `RUNNING` | Agent 正在执行工具调用 | 否 |
36
+ | `WAITING` | Agent 等待用户输入 | 否 |
37
+ | `IDLE` | 当前 turn 结束,等待新消息 | 否 |
38
+ | `TIMEOUT` | 等待超时(5 分钟),强制退出 | **死状态** |
39
+ | `ERROR` | 执行异常,进入错误处理 | 否 |
40
+ | `ZOMBIE` | 错误处理超时(30 秒),无法正常退出 | **死状态** |
41
+ | `SHUTDOWN` | 正常关闭流程 | **终态** |
42
+
43
+ ### 1.2 状态转换图
44
+
45
+ ```
46
+ [*] --> SPAWNED : Task() 调用
47
+
48
+ SPAWNED --> RUNNING : 工具调用开始
49
+
50
+ RUNNING --> WAITING : 等待用户输入
51
+ RUNNING --> IDLE : 当前 turn 结束
52
+ RUNNING --> ERROR : 异常/超时
53
+
54
+ WAITING --> RUNNING : 收到输入
55
+ WAITING --> TIMEOUT : 等待超时(5 分钟)
56
+
57
+ IDLE --> RUNNING : 收到新消息
58
+ IDLE --> SHUTDOWN : shutdown_request 或最大存活时间到期
59
+
60
+ TIMEOUT --> SHUTDOWN : 超时强制退出
61
+
62
+ ERROR --> SHUTDOWN : 错误处理完成
63
+ ERROR --> ZOMBIE : 错误处理超时(30 秒)
64
+
65
+ ZOMBIE --> [*] : 状态文件清理完成
66
+ SHUTDOWN --> [*]
67
+ ```
68
+
69
+ ### 1.3 死状态说明
70
+
71
+ **TIMEOUT(超时死状态)**:
72
+
73
+ | 参数 | 值 | 来源 |
74
+ |------|-----|------|
75
+ | 触发阈值 | 5 分钟 | `STALE_THRESHOLD_MS = 5 * 60 * 1000` |
76
+ | 触发条件 | WAITING 状态超过 5 分钟无响应 | `subagent-tracker/index.ts` |
77
+ | 处理策略 | 标记为 stale,触发清理,强制转 SHUTDOWN | subagent-tracker |
78
+ | 记录位置 | `last-tool-error.json` | `.omc/state/` |
79
+
80
+ **ZOMBIE(僵尸死状态)**:
81
+
82
+ | 参数 | 值 | 来源 |
83
+ |------|-----|------|
84
+ | 触发阈值 | 30 秒 | 规范要求(代码中未见明确常量) |
85
+ | 触发条件 | ERROR 状态超过 30 秒未完成错误处理 | 规范要求 |
86
+ | 处理策略 | 强制清理状态文件,记录到 last-tool-error.json | 规范要求 |
87
+ | 恢复方式 | 无法自动恢复,需人工介入 | — |
88
+
89
+ > **注意**:ZOMBIE 状态的 30 秒阈值来自规范要求,当前代码中未见明确的 `ZOMBIE_TIMEOUT_MS` 常量定义。实现者应在 v2 中添加此常量。
90
+
91
+ ---
92
+
93
+ ## 2. Team Pipeline 状态转换矩阵
94
+
95
+ ### 2.1 阶段定义
96
+
97
+ 来源:`docs/CLAUDE.md`(team_pipeline 章节)
98
+
99
+ | 阶段 | 描述 | 主要 Agent |
100
+ |------|------|-----------|
101
+ | `team-plan` | 规划与分解 | `explore` (haiku) + `planner` (opus) |
102
+ | `team-prd` | 验收标准与范围确认 | `analyst` (opus) |
103
+ | `team-exec` | 任务执行 | `executor` (sonnet) + 专家 agents |
104
+ | `team-verify` | 验证与质量检查 | `verifier` (sonnet) + 审查 agents |
105
+ | `team-fix` | 缺陷修复(循环) | `executor`/`build-fixer`/`debugger` |
106
+
107
+ **终态**:`complete`、`failed`、`cancelled`
108
+
109
+ ### 2.2 阶段转换规则
110
+
111
+ ```
112
+ team-plan
113
+ ↓ 规划/分解完成
114
+ team-prd
115
+ ↓ 验收标准和范围已明确
116
+ team-exec
117
+ ↓ 所有执行任务达到终态
118
+ team-verify
119
+ ↓ 验证通过 ↓ 发现缺陷
120
+ complete team-fix
121
+ ↓ 修复完成
122
+ team-exec(重新执行)
123
+
124
+ team-verify(重新验证)
125
+
126
+ complete / failed(终止)
127
+ ```
128
+
129
+ **转换条件详表**:
130
+
131
+ | 从 | 到 | 触发条件 |
132
+ |----|-----|---------|
133
+ | `team-plan` | `team-prd` | 规划/分解完成,任务列表已生成 |
134
+ | `team-prd` | `team-exec` | 验收标准和范围已明确,用户确认 |
135
+ | `team-exec` | `team-verify` | 所有执行任务达到终态(complete/failed) |
136
+ | `team-verify` | `team-fix` | 验证发现缺陷 |
137
+ | `team-verify` | `complete` | 验证全部通过 |
138
+ | `team-verify` | `failed` | 验证失败且无法修复 |
139
+ | `team-fix` | `team-exec` | 修复完成,需重新执行 |
140
+ | `team-fix` | `team-verify` | 修复完成,直接重新验证 |
141
+ | `team-fix` | `complete` | 修复后验证通过 |
142
+ | `team-fix` | `failed` | 超过最大修复次数 |
143
+
144
+ ### 2.3 终态处理
145
+
146
+ **`team-fix` 循环限制**:
147
+
148
+ ```typescript
149
+ // team-fix 循环受最大尝试次数限制
150
+ // 超出限制则转换为 failed
151
+ if (fix_loop_count >= MAX_FIX_ATTEMPTS) {
152
+ transition('failed');
153
+ }
154
+ ```
155
+
156
+ **取消处理**:
157
+
158
+ ```typescript
159
+ // /ultrapower:cancel 触发
160
+ // 1. 请求所有队友关闭
161
+ // 2. 将当前阶段标记为 cancelled(active=false)
162
+ // 3. 记录取消元数据
163
+ // 4. 运行清理
164
+ state_write(mode="team", {
165
+ current_phase: "cancelled",
166
+ active: false,
167
+ cancelled_at: timestamp
168
+ });
169
+ ```
170
+
171
+ **状态持久化字段**:
172
+
173
+ ```typescript
174
+ // state_write(mode="team") 写入的字段
175
+ {
176
+ current_phase: string, // 当前阶段
177
+ team_name: string, // 团队名称
178
+ fix_loop_count: number, // 修复循环次数
179
+ linked_ralph: string | null, // 关联的 ralph 状态文件
180
+ stage_history: string[], // 阶段历史记录
181
+ active: boolean, // 是否活跃
182
+ }
183
+ ```
184
+
185
+ ---
186
+
187
+ ## 3. 各模式状态文件路径
188
+
189
+ 来源:`src/hooks/mode-registry/index.ts`
190
+
191
+ | 模式 | 状态文件路径 | 并发保护级别 |
192
+ |------|------------|------------|
193
+ | `autopilot` | `.omc/state/autopilot-state.json` | 中(atomicWriteJsonSync) |
194
+ | `ultrapilot` | `.omc/state/ultrapilot-state.json` | 中(atomicWriteJsonSync) |
195
+ | `team` | `.omc/state/team-state.json` | 中(atomicWriteJsonSync) |
196
+ | `pipeline` | `.omc/state/pipeline-state.json` | 中(atomicWriteJsonSync) |
197
+ | `ralph` | `.omc/state/ralph-state.json` | 中(atomicWriteJsonSync) |
198
+ | `ultrawork` | `.omc/state/ultrawork-state.json` | 中(atomicWriteJsonSync) |
199
+ | `ultraqa` | `.omc/state/ultraqa-state.json` | 中(atomicWriteJsonSync) |
200
+ | `swarm` | `.omc/state/swarm-state.json` | 中(atomicWriteJsonSync) |
201
+ | subagent 追踪 | `.omc/state/subagent-tracking.json` | **最高**(四层保护) |
202
+
203
+ **路径构建规则**(安全边界,不可协商):
204
+
205
+ ```typescript
206
+ // ✅ 正确:先校验再拼接
207
+ import { assertValidMode } from '../lib/validateMode';
208
+ const validMode = assertValidMode(mode);
209
+ const stateFilePath = `.omc/state/${validMode}-state.json`;
210
+
211
+ // ❌ 禁止:未校验直接拼接(路径遍历风险)
212
+ const stateFilePath = `.omc/state/${mode}-state.json`;
213
+ ```
214
+
215
+ **会话级状态路径**(有 sessionId 时优先使用):
216
+
217
+ ```
218
+ .omc/state/sessions/{sessionId}/{mode}-state.json
219
+ ```
220
+
221
+ ---
222
+
223
+ ## 4. Stale 检测规则
224
+
225
+ > **重要(差异点 D-09)**:系统中存在两个不同概念的 stale 阈值,含义不同,不得混淆。
226
+
227
+ ### 4.1 Agent Stale 阈值
228
+
229
+ | 参数 | 值 | 来源 |
230
+ |------|-----|------|
231
+ | 常量名 | `STALE_THRESHOLD_MS` | `src/hooks/subagent-tracker/index.ts` |
232
+ | 值 | `5 * 60 * 1000`(5 分钟) | 代码定义 |
233
+ | 用途 | 检测 agent 运行状态是否过期 | subagent-tracker |
234
+ | 触发后行为 | 标记为 stale,触发清理,强制 SHUTDOWN | subagent-tracker |
235
+
236
+ ### 4.2 Mode Stale Marker 阈值
237
+
238
+ | 参数 | 值 | 来源 |
239
+ |------|-----|------|
240
+ | 常量名 | `STALE_MARKER_THRESHOLD` | `src/hooks/mode-registry/index.ts` |
241
+ | 值 | `60 * 60 * 1000`(1 小时) | 代码定义 |
242
+ | 用途 | 检测模式状态文件的 stale marker | mode-registry |
243
+ | 触发后行为 | 清理 stale marker,允许模式重新激活 | mode-registry |
244
+
245
+ **对比总结**:
246
+
247
+ | 维度 | Agent Stale | Mode Stale Marker |
248
+ |------|------------|-------------------|
249
+ | 阈值 | **5 分钟** | **1 小时** |
250
+ | 检测对象 | agent 运行状态 | 模式状态文件 |
251
+ | 触发后果 | agent 被强制终止 | stale marker 被清理 |
252
+ | 所在文件 | `subagent-tracker/index.ts` | `mode-registry/index.ts` |
253
+
254
+ ---
255
+
256
+ ## 5. 互斥模式检测规则
257
+
258
+ 来源:`src/hooks/mode-registry/index.ts`
259
+
260
+ ### 5.1 互斥模式列表
261
+
262
+ ```typescript
263
+ // 互斥模式(见差异点 D-04)
264
+ const EXCLUSIVE_MODES = ['autopilot', 'ultrapilot', 'swarm', 'pipeline'];
265
+ ```
266
+
267
+ > **注意(差异点 D-04)**:互斥模式为 4 个,PRD 原描述仅提及 `autopilot` 与 `ultrapilot` 互斥。实际上 `swarm` 和 `pipeline` 也在互斥列表中。
268
+
269
+ ### 5.2 互斥检测逻辑
270
+
271
+ ```typescript
272
+ // 伪代码:互斥检测
273
+ function checkExclusiveConflict(newMode: string): boolean {
274
+ if (!EXCLUSIVE_MODES.includes(newMode)) {
275
+ return false; // 非互斥模式,无冲突
276
+ }
277
+ const activeExclusiveModes = EXCLUSIVE_MODES.filter(
278
+ mode => isActive(mode) && mode !== newMode
279
+ );
280
+ return activeExclusiveModes.length > 0; // 有冲突返回 true
281
+ }
282
+ ```
283
+
284
+ ### 5.3 非互斥模式
285
+
286
+ 以下模式**不在**互斥列表中,可与其他模式组合使用:
287
+
288
+ | 模式 | 可组合示例 |
289
+ |------|-----------|
290
+ | `ralph` | `team ralph`(ralph + team 组合) |
291
+ | `ultrawork` | 可与 ralph 组合 |
292
+ | `ultraqa` | 由 autopilot 激活,不独立互斥 |
293
+ | `team` | 可与 ralph 组合(`team ralph`) |
294
+
295
+ ### 5.4 Team + Ralph 组合状态
296
+
297
+ 当同时检测到 `team` 和 `ralph` 关键词时:
298
+
299
+ ```typescript
300
+ // 两者都写入关联状态文件
301
+ state_write(mode="team", { linked_ralph: "ralph-state.json" });
302
+ state_write(mode="ralph", { linked_team: "team-state.json" });
303
+
304
+ // 取消任一模式会同时取消两者
305
+ // /ultrapower:cancel 触发时检查 linked_* 字段
306
+ ```
307
+
308
+ ---
309
+
310
+ ## 差异点说明
311
+
312
+ | 差异点 | 描述 | 当前状态 | 规范要求 |
313
+ |--------|------|---------|---------|
314
+ | D-03 | 合法 mode 数量 | 8 个(含 swarm) | 以 8 个为准 |
315
+ | D-04 | 互斥模式范围 | 4 个互斥模式(autopilot、ultrapilot、swarm、pipeline) | 以 4 个为准 |
316
+ | D-09 | stale 阈值含义 | 两个不同概念:mode stale(1 小时)vs agent stale(5 分钟) | 必须区分,不得混淆 |
@@ -0,0 +1,63 @@
1
+ # Agent 模板
2
+
3
+ > 复制此模板创建新 agent。删除所有 `<!-- 注释 -->` 后提交。
4
+
5
+ ---
6
+
7
+ ```markdown
8
+ # Agent 名称
9
+
10
+ <!-- 一句话描述此 agent 的职责 -->
11
+
12
+ ## 角色定义
13
+
14
+ 你是 ultrapower 的 [角色名称],专注于 [核心职责]。
15
+
16
+ ## 核心职责
17
+
18
+ <!-- 列出此 agent 的主要职责,3-5 条 -->
19
+
20
+ 1. 职责一
21
+ 2. 职责二
22
+ 3. 职责三
23
+
24
+ ## 工作流程
25
+
26
+ <!-- 描述 agent 的标准工作流程 -->
27
+
28
+ 1. 接收任务
29
+ 2. 分析输入
30
+ 3. 执行核心逻辑
31
+ 4. 输出结果
32
+
33
+ ## 输出格式
34
+
35
+ <!-- 描述 agent 的标准输出格式 -->
36
+
37
+ ## 约束条件
38
+
39
+ <!-- 列出 agent 不应做的事情 -->
40
+
41
+ - 不做 X
42
+ - 不做 Y
43
+ ```
44
+
45
+ ---
46
+
47
+ ## 填写说明
48
+
49
+ | 字段 | 要求 |
50
+ |------|------|
51
+ | 角色定义 | 明确角色名称和核心职责 |
52
+ | 核心职责 | 3-5 条,具体可操作 |
53
+ | 工作流程 | 有序步骤,可引用其他 agent |
54
+ | 输出格式 | 明确输出结构,便于下游 agent 解析 |
55
+ | 约束条件 | 明确边界,防止越权操作 |
56
+
57
+ ## 模型路由建议
58
+
59
+ | 复杂度 | 推荐模型 |
60
+ |--------|---------|
61
+ | 简单查找/扫描 | `haiku` |
62
+ | 标准实现/审查 | `sonnet` |
63
+ | 架构/深度分析 | `opus` |
@@ -0,0 +1,74 @@
1
+ # Hook 模板
2
+
3
+ > 复制此模板创建新 hook。删除所有 `<!-- 注释 -->` 后提交。
4
+
5
+ ---
6
+
7
+ ## 目录结构
8
+
9
+ ```
10
+ src/hooks/hook-name/
11
+ ├── index.ts # Hook 主逻辑
12
+ └── README.md # Hook 说明(可选)
13
+ ```
14
+
15
+ ## index.ts 模板
16
+
17
+ ```typescript
18
+ /**
19
+ * hook-name hook
20
+ *
21
+ * 触发事件:HookEventName
22
+ * 职责:一句话描述此 hook 的职责
23
+ */
24
+
25
+ import type { HookInput } from '../types';
26
+
27
+ // Hook 输入类型(根据事件类型定义)
28
+ export interface HookNameInput {
29
+ session_id: string;
30
+ cwd: string;
31
+ hook_event_name: 'HookEventName';
32
+ // 添加其他字段
33
+ }
34
+
35
+ /**
36
+ * Hook 主处理函数
37
+ */
38
+ export async function processHookName(input: HookNameInput): Promise<void> {
39
+ // 1. 验证输入
40
+ if (!input.session_id) {
41
+ throw new Error('Missing required field: session_id');
42
+ }
43
+
44
+ // 2. 核心逻辑
45
+ // ...
46
+
47
+ // 3. 输出结果(如需要)
48
+ }
49
+ ```
50
+
51
+ ---
52
+
53
+ ## 填写说明
54
+
55
+ | 字段 | 要求 |
56
+ |------|------|
57
+ | 触发事件 | 对应 Claude Code SDK 的 hook 事件名 |
58
+ | 输入类型 | 使用 snake_case 字段名(SDK 规范) |
59
+ | 必需字段验证 | 在函数入口验证所有必需字段 |
60
+
61
+ ## Hook 事件类型参考
62
+
63
+ | 事件 | 触发时机 | 必需字段 |
64
+ |------|---------|---------|
65
+ | `PreToolUse` | 工具调用前 | `tool_name`, `tool_input` |
66
+ | `PostToolUse` | 工具调用后 | `tool_name`, `tool_response` |
67
+ | `SubagentStop` | Subagent 停止 | `agent_id`, `agent_type` |
68
+ | `SessionEnd` | 会话结束 | `session_id`, `directory` |
69
+
70
+ ## 安全注意事项
71
+
72
+ - 敏感 hook 字段通过 bridge-normalize 白名单过滤,未知字段被丢弃
73
+ - 不在白名单中的字段不可依赖
74
+ - `SubagentStop` 事件的 `success` 字段已废弃,使用 `input.success !== false` 推断
@@ -0,0 +1,48 @@
1
+ # Skill 模板
2
+
3
+ > 复制此模板创建新 skill。删除所有 `<!-- 注释 -->` 后提交。
4
+
5
+ ---
6
+
7
+ ```markdown
8
+ ---
9
+ name: skill-name
10
+ description: 一句话描述此 skill 的用途和触发时机
11
+ triggers:
12
+ - "触发词1"
13
+ - "触发词2"
14
+ ---
15
+
16
+ # Skill 名称
17
+
18
+ ## 触发条件
19
+
20
+ <!-- 描述何时应该调用此 skill -->
21
+
22
+ ## 执行步骤
23
+
24
+ <!-- 列出 skill 的执行步骤,使用有序列表 -->
25
+
26
+ 1. 第一步
27
+ 2. 第二步
28
+ 3. 第三步
29
+
30
+ ## 输出格式
31
+
32
+ <!-- 描述 skill 的预期输出 -->
33
+
34
+ ## 注意事项
35
+
36
+ <!-- 列出使用此 skill 时的注意事项 -->
37
+ ```
38
+
39
+ ---
40
+
41
+ ## 填写说明
42
+
43
+ | 字段 | 要求 |
44
+ |------|------|
45
+ | `name` | kebab-case,与文件名一致 |
46
+ | `description` | 一句话,说明用途和触发时机 |
47
+ | `triggers` | 用户输入中触发此 skill 的关键词列表 |
48
+ | 执行步骤 | 有序列表,每步骤可调用 agent 或工具 |