specops 0.2.5 → 0.3.2

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 (201) hide show
  1. package/.opencode/agent/specops-codebase-mapper.md +764 -0
  2. package/.opencode/agent/specops-debugger.md +1246 -0
  3. package/.opencode/agent/specops-executor.md +475 -0
  4. package/.opencode/agent/specops-integration-checker.md +443 -0
  5. package/.opencode/agent/specops-phase-researcher.md +547 -0
  6. package/.opencode/agent/specops-plan-checker.md +690 -0
  7. package/.opencode/agent/specops-planner.md +581 -0
  8. package/.opencode/agent/specops-project-researcher.md +354 -0
  9. package/.opencode/agent/specops-research-synthesizer.md +242 -0
  10. package/.opencode/agent/specops-roadmapper.md +642 -0
  11. package/.opencode/agent/specops-work-verifier.md +573 -0
  12. package/.opencode/references/checkpoints.md +776 -0
  13. package/.opencode/references/continuation-format.md +249 -0
  14. package/.opencode/references/decimal-phase-calculation.md +65 -0
  15. package/.opencode/references/git-integration.md +248 -0
  16. package/.opencode/references/git-planning-commit.md +38 -0
  17. package/.opencode/references/model-profile-resolution.md +34 -0
  18. package/.opencode/references/model-profiles.md +92 -0
  19. package/.opencode/references/phase-argument-parsing.md +61 -0
  20. package/.opencode/references/planning-config.md +196 -0
  21. package/.opencode/references/questioning.md +145 -0
  22. package/.opencode/references/tdd.md +263 -0
  23. package/.opencode/references/ui-brand.md +160 -0
  24. package/.opencode/references/verification-patterns.md +612 -0
  25. package/.opencode/templates/DEBUG.md +164 -0
  26. package/.opencode/templates/UAT.md +180 -0
  27. package/.opencode/templates/VALIDATION.md +76 -0
  28. package/.opencode/templates/codebase/architecture.md +255 -0
  29. package/.opencode/templates/codebase/concerns.md +310 -0
  30. package/.opencode/templates/codebase/conventions.md +307 -0
  31. package/.opencode/templates/codebase/integrations.md +280 -0
  32. package/.opencode/templates/codebase/stack.md +186 -0
  33. package/.opencode/templates/codebase/structure.md +285 -0
  34. package/.opencode/templates/codebase/testing.md +480 -0
  35. package/.opencode/templates/context.md +221 -0
  36. package/.opencode/templates/continue-here.md +78 -0
  37. package/.opencode/templates/debug-subagent-prompt.md +91 -0
  38. package/.opencode/templates/discovery.md +147 -0
  39. package/.opencode/templates/milestone-archive.md +123 -0
  40. package/.opencode/templates/milestone.md +115 -0
  41. package/.opencode/templates/phase-prompt.md +333 -0
  42. package/.opencode/templates/planner-subagent-prompt.md +117 -0
  43. package/.opencode/templates/project.md +184 -0
  44. package/.opencode/templates/requirements.md +130 -0
  45. package/.opencode/templates/research-project/ARCHITECTURE.md +204 -0
  46. package/.opencode/templates/research-project/FEATURES.md +147 -0
  47. package/.opencode/templates/research-project/PITFALLS.md +200 -0
  48. package/.opencode/templates/research-project/STACK.md +120 -0
  49. package/.opencode/templates/research-project/SUMMARY.md +170 -0
  50. package/.opencode/templates/research.md +278 -0
  51. package/.opencode/templates/retrospective.md +54 -0
  52. package/.opencode/templates/roadmap.md +202 -0
  53. package/.opencode/templates/state.md +176 -0
  54. package/.opencode/templates/summary-complex.md +59 -0
  55. package/.opencode/templates/summary-minimal.md +41 -0
  56. package/.opencode/templates/summary-standard.md +48 -0
  57. package/.opencode/templates/summary.md +248 -0
  58. package/.opencode/templates/user-setup.md +311 -0
  59. package/.opencode/templates/verification-report.md +322 -0
  60. package/.opencode/workflows/add-phase.md +111 -0
  61. package/.opencode/workflows/add-tests.md +350 -0
  62. package/.opencode/workflows/add-todo.md +157 -0
  63. package/.opencode/workflows/audit-milestone.md +297 -0
  64. package/.opencode/workflows/check-todos.md +176 -0
  65. package/.opencode/workflows/cleanup.md +152 -0
  66. package/.opencode/workflows/complete-milestone.md +763 -0
  67. package/.opencode/workflows/diagnose-issues.md +219 -0
  68. package/.opencode/workflows/discovery-phase.md +288 -0
  69. package/.opencode/workflows/discuss-phase.md +542 -0
  70. package/.opencode/workflows/execute-phase.md +449 -0
  71. package/.opencode/workflows/execute-plan.md +447 -0
  72. package/.opencode/workflows/health.md +156 -0
  73. package/.opencode/workflows/help.md +489 -0
  74. package/.opencode/workflows/insert-phase.md +129 -0
  75. package/.opencode/workflows/list-phase-assumptions.md +178 -0
  76. package/.opencode/workflows/map-codebase.md +315 -0
  77. package/.opencode/workflows/new-milestone.md +382 -0
  78. package/.opencode/workflows/new-project.md +1116 -0
  79. package/.opencode/workflows/pause-work.md +122 -0
  80. package/.opencode/workflows/plan-milestone-gaps.md +274 -0
  81. package/.opencode/workflows/plan-phase.md +569 -0
  82. package/.opencode/workflows/progress.md +381 -0
  83. package/.opencode/workflows/quick.md +453 -0
  84. package/.opencode/workflows/remove-phase.md +154 -0
  85. package/.opencode/workflows/research-phase.md +73 -0
  86. package/.opencode/workflows/resume-project.md +304 -0
  87. package/.opencode/workflows/set-profile.md +80 -0
  88. package/.opencode/workflows/settings.md +213 -0
  89. package/.opencode/workflows/transition.md +544 -0
  90. package/.opencode/workflows/update.md +219 -0
  91. package/.opencode/workflows/verify-phase.md +242 -0
  92. package/.opencode/workflows/verify-work.md +569 -0
  93. package/commands/specops/add-phase.md +43 -0
  94. package/commands/specops/add-tests.md +41 -0
  95. package/commands/specops/add-todo.md +47 -0
  96. package/commands/specops/audit-milestone.md +36 -0
  97. package/commands/specops/check-todos.md +45 -0
  98. package/commands/specops/cleanup.md +18 -0
  99. package/commands/specops/complete-milestone.md +136 -0
  100. package/commands/specops/debug.md +167 -0
  101. package/commands/specops/discuss-phase.md +83 -0
  102. package/commands/specops/execute-phase.md +41 -0
  103. package/commands/specops/health.md +22 -0
  104. package/commands/specops/help.md +22 -0
  105. package/commands/specops/insert-phase.md +32 -0
  106. package/commands/specops/join-discord.md +18 -0
  107. package/commands/specops/list-phase-assumptions.md +46 -0
  108. package/commands/specops/map-codebase.md +71 -0
  109. package/commands/specops/new-milestone.md +44 -0
  110. package/commands/specops/new-project.md +42 -0
  111. package/commands/specops/pause-work.md +38 -0
  112. package/commands/specops/plan-milestone-gaps.md +34 -0
  113. package/commands/specops/plan-phase.md +45 -0
  114. package/commands/specops/progress.md +24 -0
  115. package/commands/specops/quick.md +41 -0
  116. package/commands/specops/reapply-patches.md +111 -0
  117. package/commands/specops/remove-phase.md +31 -0
  118. package/commands/specops/research-phase.md +189 -0
  119. package/commands/specops/resume-work.md +40 -0
  120. package/commands/specops/set-profile.md +34 -0
  121. package/commands/specops/settings.md +36 -0
  122. package/commands/specops/update.md +37 -0
  123. package/commands/specops/verify-work.md +38 -0
  124. package/dist/__integration__/fixtures/generator.d.ts +4 -0
  125. package/dist/__integration__/fixtures/generator.js +1 -0
  126. package/dist/__integration__/mocks/server.d.ts +7 -0
  127. package/dist/__integration__/mocks/server.js +1 -0
  128. package/dist/__integration__/setup.d.ts +6 -0
  129. package/dist/__integration__/setup.js +1 -0
  130. package/dist/acceptance/lazyDetector.js +1 -1
  131. package/dist/acceptance/reporter.js +1 -1
  132. package/dist/acceptance/runner.js +1 -1
  133. package/dist/cli.js +1 -1
  134. package/dist/context/index.js +1 -1
  135. package/dist/context/promptTemplate.js +1 -1
  136. package/dist/context/techContextLoader.js +1 -1
  137. package/dist/engine.d.ts +1 -0
  138. package/dist/engine.js +1 -1
  139. package/dist/evolution/distiller.js +1 -1
  140. package/dist/evolution/index.js +1 -1
  141. package/dist/evolution/memoryGraph.js +1 -1
  142. package/dist/evolution/selector.js +1 -1
  143. package/dist/evolution/signals.js +1 -1
  144. package/dist/evolution/solidify.js +1 -1
  145. package/dist/evolution/store.js +1 -1
  146. package/dist/evolution/types.js +1 -1
  147. package/dist/init.d.ts +4 -3
  148. package/dist/init.js +1 -1
  149. package/dist/machines/agentMachine.js +1 -1
  150. package/dist/machines/supervisorMachine.js +1 -1
  151. package/dist/persistence/schema.js +1 -1
  152. package/dist/persistence/stateFile.js +1 -1
  153. package/dist/plugin-engine.js +1 -1
  154. package/dist/plugin.js +1 -1
  155. package/dist/requirement-analysis/analyzers/repository-parser.d.ts +121 -0
  156. package/dist/requirement-analysis/analyzers/repository-parser.js +1 -0
  157. package/dist/requirement-analysis/generators/prd-generator.d.ts +90 -0
  158. package/dist/requirement-analysis/generators/prd-generator.js +1 -0
  159. package/dist/requirement-analysis/integrations/v1-integration.d.ts +73 -0
  160. package/dist/requirement-analysis/integrations/v1-integration.js +1 -0
  161. package/dist/requirement-analysis/tools/analyze-requirements.js +1 -0
  162. package/dist/requirement-analysis/types/analysis-result.d.ts +326 -0
  163. package/dist/requirement-analysis/types/analysis-result.js +1 -0
  164. package/dist/requirement-analysis/types/feature-mapping.d.ts +294 -0
  165. package/dist/requirement-analysis/types/feature-mapping.js +1 -0
  166. package/dist/requirement-analysis/types/index.d.ts +171 -0
  167. package/dist/requirement-analysis/types/index.js +1 -0
  168. package/dist/requirement-analysis/types/tech-stack.d.ts +213 -0
  169. package/dist/requirement-analysis/types/tech-stack.js +1 -0
  170. package/dist/requirement-analysis/utils/error-handler.d.ts +112 -0
  171. package/dist/requirement-analysis/utils/error-handler.js +1 -0
  172. package/dist/types/index.d.ts +4 -2
  173. package/dist/types/index.js +1 -1
  174. package/dist/utils/id.js +1 -1
  175. package/package.json +4 -2
  176. package/skills/competitor-search/SKILL.md +169 -0
  177. package/skills/demand-analysis/SKILL.md +307 -0
  178. package/skills/feature-search/SKILL.md +182 -0
  179. package/skills/requirement-analysis/README.md +464 -0
  180. package/skills/requirement-analysis/SKILL.md +224 -0
  181. package/skills/requirement-analysis/templates/feature-mapping-template.json +210 -0
  182. package/skills/requirement-analysis/templates/prd-template.md +104 -0
  183. package/skills/tech-selection/SKILL.md +198 -0
  184. package/dist/__e2e__/01-state-engine.e2e.test.d.ts +0 -10
  185. package/dist/__e2e__/01-state-engine.e2e.test.js +0 -1
  186. package/dist/acceptance/lazyDetector.test.d.ts +0 -1
  187. package/dist/acceptance/lazyDetector.test.js +0 -1
  188. package/dist/acceptance/reporter.test.d.ts +0 -1
  189. package/dist/acceptance/reporter.test.js +0 -1
  190. package/dist/acceptance/runner.test.d.ts +0 -1
  191. package/dist/acceptance/runner.test.js +0 -1
  192. package/dist/context/promptTemplate.test.d.ts +0 -1
  193. package/dist/context/promptTemplate.test.js +0 -1
  194. package/dist/context/techContextLoader.test.d.ts +0 -1
  195. package/dist/context/techContextLoader.test.js +0 -1
  196. package/dist/machines/agentMachine.test.d.ts +0 -1
  197. package/dist/machines/agentMachine.test.js +0 -1
  198. package/dist/machines/supervisorMachine.test.d.ts +0 -1
  199. package/dist/machines/supervisorMachine.test.js +0 -1
  200. package/dist/persistence/stateFile.test.d.ts +0 -1
  201. package/dist/persistence/stateFile.test.js +0 -1
@@ -0,0 +1,210 @@
1
+ {
2
+ "metadata": {
3
+ "templateVersion": "1.0",
4
+ "description": "功能映射模板,用于标准化功能分析结果",
5
+ "lastUpdated": "2024-01-01",
6
+ "author": "v1需求分析技能"
7
+ },
8
+ "featureTemplate": {
9
+ "id": "string - 功能唯一标识符",
10
+ "name": "string - 功能名称",
11
+ "description": "string - 功能详细描述",
12
+ "priority": "number - 优先级 (1-5, 5最高)",
13
+ "complexity": "number - 复杂度 (1-5, 5最复杂)",
14
+ "dependencies": "array - 依赖的其他功能ID列表",
15
+ "techRequirements": "array - 技术栈要求列表",
16
+ "estimatedHours": "number - 预估工作量(小时)",
17
+ "category": "enum - 功能分类: core|feature|enhancement|integration",
18
+ "userStories": "array - 用户故事列表",
19
+ "acceptanceCriteria": "array - 验收标准列表",
20
+ "tags": "array - 功能标签",
21
+ "status": "enum - 状态: planned|in-progress|completed|cancelled",
22
+ "assignee": "string - 负责人",
23
+ "createdAt": "string - 创建时间 (ISO 8601)",
24
+ "updatedAt": "string - 更新时间 (ISO 8601)"
25
+ },
26
+ "userStoryTemplate": {
27
+ "id": "string - 用户故事唯一标识符",
28
+ "asA": "string - 作为什么角色",
29
+ "iWant": "string - 想要什么功能",
30
+ "soThat": "string - 为了什么目的",
31
+ "priority": "number - 优先级 (1-5)",
32
+ "acceptanceCriteria": "array - 验收标准",
33
+ "estimatedPoints": "number - 故事点数",
34
+ "status": "enum - 状态: backlog|in-progress|testing|done"
35
+ },
36
+ "categoryDefinitions": {
37
+ "core": {
38
+ "name": "核心功能",
39
+ "description": "系统的基础功能,必须实现",
40
+ "priority": "high",
41
+ "examples": ["用户认证", "数据存储", "基础API"]
42
+ },
43
+ "feature": {
44
+ "name": "特性功能",
45
+ "description": "增强用户体验的功能特性",
46
+ "priority": "medium",
47
+ "examples": ["搜索功能", "数据导出", "通知系统"]
48
+ },
49
+ "enhancement": {
50
+ "name": "增强功能",
51
+ "description": "优化现有功能的改进",
52
+ "priority": "low",
53
+ "examples": ["性能优化", "UI改进", "用户体验提升"]
54
+ },
55
+ "integration": {
56
+ "name": "集成功能",
57
+ "description": "与外部系统的集成",
58
+ "priority": "medium",
59
+ "examples": ["第三方API", "数据同步", "外部服务"]
60
+ }
61
+ },
62
+ "priorityLevels": {
63
+ "5": {
64
+ "name": "关键",
65
+ "description": "必须立即实现,影响核心业务",
66
+ "color": "#FF4444"
67
+ },
68
+ "4": {
69
+ "name": "高",
70
+ "description": "重要功能,应优先实现",
71
+ "color": "#FF8800"
72
+ },
73
+ "3": {
74
+ "name": "中",
75
+ "description": "标准功能,按计划实现",
76
+ "color": "#FFCC00"
77
+ },
78
+ "2": {
79
+ "name": "低",
80
+ "description": "可选功能,资源允许时实现",
81
+ "color": "#88CC00"
82
+ },
83
+ "1": {
84
+ "name": "最低",
85
+ "description": "未来考虑的功能",
86
+ "color": "#44CC44"
87
+ }
88
+ },
89
+ "complexityLevels": {
90
+ "5": {
91
+ "name": "极高",
92
+ "description": "需要深度技术研究,风险很高",
93
+ "estimatedDays": "20-30",
94
+ "skillLevel": "专家级"
95
+ },
96
+ "4": {
97
+ "name": "高",
98
+ "description": "技术复杂,需要高级技能",
99
+ "estimatedDays": "10-20",
100
+ "skillLevel": "高级"
101
+ },
102
+ "3": {
103
+ "name": "中",
104
+ "description": "标准复杂度,需要中级技能",
105
+ "estimatedDays": "5-10",
106
+ "skillLevel": "中级"
107
+ },
108
+ "2": {
109
+ "name": "低",
110
+ "description": "相对简单,初级技能可完成",
111
+ "estimatedDays": "2-5",
112
+ "skillLevel": "初级"
113
+ },
114
+ "1": {
115
+ "name": "极低",
116
+ "description": "非常简单,快速实现",
117
+ "estimatedDays": "0.5-2",
118
+ "skillLevel": "入门级"
119
+ }
120
+ },
121
+ "estimationGuidelines": {
122
+ "factors": [
123
+ "功能复杂度",
124
+ "技术难度",
125
+ "依赖关系",
126
+ "测试要求",
127
+ "文档需求",
128
+ "团队经验"
129
+ ],
130
+ "baseHours": {
131
+ "simple": 8,
132
+ "medium": 24,
133
+ "complex": 40,
134
+ "veryComplex": 80
135
+ },
136
+ "multipliers": {
137
+ "newTechnology": 1.5,
138
+ "highDependency": 1.3,
139
+ "criticalFeature": 1.2,
140
+ "wellKnownPattern": 0.8,
141
+ "existingCode": 0.6
142
+ }
143
+ },
144
+ "validationRules": {
145
+ "required": ["id", "name", "description", "priority", "complexity", "category"],
146
+ "constraints": {
147
+ "priority": "1 <= priority <= 5",
148
+ "complexity": "1 <= complexity <= 5",
149
+ "estimatedHours": "estimatedHours > 0",
150
+ "category": "category in ['core', 'feature', 'enhancement', 'integration']"
151
+ },
152
+ "dependencies": {
153
+ "noCycles": "依赖关系不能形成循环",
154
+ "validIds": "依赖的功能ID必须存在"
155
+ }
156
+ },
157
+ "exampleFeature": {
158
+ "id": "user-auth-system",
159
+ "name": "用户认证系统",
160
+ "description": "实现用户注册、登录、权限管理等核心认证功能,支持多种认证方式",
161
+ "priority": 5,
162
+ "complexity": 3,
163
+ "dependencies": [],
164
+ "techRequirements": ["JWT", "bcrypt", "Redis", "PostgreSQL"],
165
+ "estimatedHours": 40,
166
+ "category": "core",
167
+ "userStories": [
168
+ {
169
+ "id": "auth-register",
170
+ "asA": "新用户",
171
+ "iWant": "能够注册账户",
172
+ "soThat": "可以使用系统功能",
173
+ "priority": 5,
174
+ "acceptanceCriteria": [
175
+ "用户可以使用邮箱注册",
176
+ "密码需要满足安全要求",
177
+ "注册成功后发送确认邮件"
178
+ ],
179
+ "estimatedPoints": 3,
180
+ "status": "backlog"
181
+ },
182
+ {
183
+ "id": "auth-login",
184
+ "asA": "注册用户",
185
+ "iWant": "能够登录系统",
186
+ "soThat": "访问个人功能",
187
+ "priority": 5,
188
+ "acceptanceCriteria": [
189
+ "用户可以使用邮箱和密码登录",
190
+ "登录失败时显示错误信息",
191
+ "登录成功后跳转到主页"
192
+ ],
193
+ "estimatedPoints": 2,
194
+ "status": "backlog"
195
+ }
196
+ ],
197
+ "acceptanceCriteria": [
198
+ "支持邮箱密码登录",
199
+ "支持第三方OAuth登录",
200
+ "实现会话管理",
201
+ "提供权限控制机制",
202
+ "通过安全测试"
203
+ ],
204
+ "tags": ["authentication", "security", "core"],
205
+ "status": "planned",
206
+ "assignee": "backend-team",
207
+ "createdAt": "2024-01-01T00:00:00Z",
208
+ "updatedAt": "2024-01-01T00:00:00Z"
209
+ }
210
+ }
@@ -0,0 +1,104 @@
1
+ # {{projectName}} 产品需求文档 (PRD)
2
+
3
+ > **文档版本**: 1.0
4
+ > **生成时间**: {{timestamp}}
5
+ > **项目路径**: {{projectPath}}
6
+ > **分析工具**: v1需求分析技能
7
+
8
+ ---
9
+
10
+ ## 文档概述
11
+
12
+ 本文档基于代码库自动分析生成,包含项目的功能需求、技术需求、实施计划等关键信息。文档旨在为项目开发、管理和决策提供全面的需求参考。
13
+
14
+ ### 文档结构
15
+ - [项目概述](#项目概述) - 项目基本信息和目标
16
+ - [功能需求](#功能需求) - 详细功能列表和用户故事
17
+ - [技术需求](#技术需求) - 技术栈要求和架构建议
18
+ - [实施时间线](#实施时间线) - 开发阶段和里程碑
19
+ - [资源需求](#资源需求) - 人力资源和技术资源需求
20
+
21
+ ---
22
+
23
+ {{overviewSection}}
24
+
25
+ ---
26
+
27
+ {{featuresSection}}
28
+
29
+ ---
30
+
31
+ {{technicalSection}}
32
+
33
+ ---
34
+
35
+ {{timelineSection}}
36
+
37
+ ---
38
+
39
+ {{resourcesSection}}
40
+
41
+ ---
42
+
43
+ ## 质量保证
44
+
45
+ ### 需求质量评分
46
+ - **总体评分**: {{qualityScore}}/100
47
+ - **功能完整性**: {{featureCompleteness}}/100
48
+ - **技术可行性**: {{technicalFeasibility}}/100
49
+ - **需求清晰度**: {{requirementClarity}}/100
50
+ - **复杂度合理性**: {{complexityReasonableness}}/100
51
+
52
+ ### 风险评估
53
+ {{riskAssessment}}
54
+
55
+ ### 改进建议
56
+ {{improvements}}
57
+
58
+ ---
59
+
60
+ ## 附录
61
+
62
+ ### A. 功能依赖关系图
63
+ ```
64
+ {{dependencyGraph}}
65
+ ```
66
+
67
+ ### B. 技术栈兼容性矩阵
68
+ {{compatibilityMatrix}}
69
+
70
+ ### C. 工作量分解结构 (WBS)
71
+ {{workBreakdownStructure}}
72
+
73
+ ### D. 术语表
74
+ - **PRD**: Product Requirements Document,产品需求文档
75
+ - **MVP**: Minimum Viable Product,最小可行产品
76
+ - **API**: Application Programming Interface,应用程序编程接口
77
+ - **CI/CD**: Continuous Integration/Continuous Deployment,持续集成/持续部署
78
+ - **UI/UX**: User Interface/User Experience,用户界面/用户体验
79
+
80
+ ---
81
+
82
+ ## 文档维护
83
+
84
+ ### 版本历史
85
+ | 版本 | 日期 | 修改内容 | 修改人 |
86
+ |------|------|----------|--------|
87
+ | 1.0 | {{timestamp}} | 初始版本,基于代码分析生成 | 需求分析工具 |
88
+
89
+ ### 审核记录
90
+ - [ ] 产品经理审核
91
+ - [ ] 技术负责人审核
92
+ - [ ] 项目经理审核
93
+ - [ ] 利益相关者确认
94
+
95
+ ### 更新说明
96
+ 本文档为自动生成文档,如需修改请:
97
+ 1. 更新源代码或配置
98
+ 2. 重新运行需求分析工具
99
+ 3. 人工审核和补充细节
100
+ 4. 更新版本记录
101
+
102
+ ---
103
+
104
+ *本文档由 v1 需求分析技能自动生成。如有疑问或建议,请联系项目团队。*
@@ -0,0 +1,198 @@
1
+ ---
2
+ name: tech-selection
3
+ description: "技术选型 Skill — 基于需求分析和竞品/功能搜索结果,进行技术栈选型。对比多个方案,输出技术选型文档。触发词:'技术选型'、'选技术栈'、'tech selection'、'评估技术方案'。"
4
+ ---
5
+
6
+ # 技术选型 Skill
7
+
8
+ <role>
9
+ 你是一个技术选型专家。你的工作是基于需求分析结果、竞品调研、功能搜索报告,为项目选择最合适的技术栈。你需要对比多个候选方案,分析优劣,给出有理有据的推荐。
10
+ </role>
11
+
12
+ ---
13
+
14
+ ## 核心原则
15
+
16
+ 1. **数据驱动** — 不凭感觉,用 Star 数、下载量、更新频率、社区活跃度等数据支撑
17
+ 2. **场景匹配** — 技术选择要匹配项目规模、团队能力、时间约束
18
+ 3. **竞品参考** — 看竞品用什么技术,有现成验证的方案优先
19
+ 4. **风险评估** — 评估每个选型的潜在风险和迁移成本
20
+ 5. **锁定机制** — 选型完成后生成 TECH-CONTEXT.md 锁定决策,防止后期跑偏
21
+
22
+ ---
23
+
24
+ ## 选型流程
25
+
26
+ ### 第一步:收集输入
27
+
28
+ ```
29
+ 需要的输入:
30
+ 1. 需求分析报告(来自 demand-analysis skill)
31
+ 2. 竞品搜索报告(来自 competitor-search skill)
32
+ 3. 功能搜索报告(来自 feature-search skill)
33
+ 4. 项目约束条件:
34
+ - 团队技术栈偏好
35
+ - 时间约束
36
+ - 性能要求
37
+ - 部署环境
38
+ ```
39
+
40
+ ### 第二步:技术维度拆分
41
+
42
+ ```
43
+ 对项目的每个技术维度:
44
+
45
+ 前端:
46
+ - UI 框架: React / Vue / Svelte / ...
47
+ - 样式方案: Tailwind / CSS Modules / styled-components / ...
48
+ - 状态管理: Zustand / Redux / Jotai / ...
49
+ - 构建工具: Vite / Webpack / ...
50
+
51
+ 后端:
52
+ - 语言: TypeScript / Rust / Go / Python / ...
53
+ - 框架: Express / Fastify / Actix / ...
54
+ - 数据库: PostgreSQL / SQLite / MongoDB / ...
55
+ - ORM: Prisma / Drizzle / TypeORM / ...
56
+
57
+ 基础设施:
58
+ - 部署: Docker / Serverless / 裸机 / ...
59
+ - CI/CD: GitHub Actions / ...
60
+ - 监控: ...
61
+
62
+ AI/Agent 相关:
63
+ - LLM Provider: ai-sdk / langchain / 原生 API / ...
64
+ - Agent 框架: XState / 自研 / ...
65
+ - 工具协议: MCP / 自定义 / ...
66
+ ```
67
+
68
+ ### 第三步:候选方案对比
69
+
70
+ 对每个维度,列出 2-3 个候选方案进行对比:
71
+
72
+ ```markdown
73
+ ### [维度名称] 选型对比
74
+
75
+ | 维度 | 方案A | 方案B | 方案C |
76
+ |------|-------|-------|-------|
77
+ | 名称 | React | Vue 3 | Svelte |
78
+ | Star 数 | 230k | 48k | 82k |
79
+ | npm 周下载 | 25M | 4.5M | 800k |
80
+ | 最近更新 | 2天前 | 1周前 | 3天前 |
81
+ | 学习曲线 | 中 | 低 | 低 |
82
+ | 生态丰富度 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐ |
83
+ | 竞品使用情况 | 竞品A、竞品B | 竞品C | 无 |
84
+ | 团队熟悉度 | [需用户确认] | [需用户确认] | [需用户确认] |
85
+
86
+ **推荐: 方案A**
87
+ **理由: [具体理由,引用数据]**
88
+ ```
89
+
90
+ ### 第四步:查看竞品技术栈
91
+
92
+ ```
93
+ 对竞品搜索报告中的 Top 5 竞品:
94
+ - 分析其技术栈(从 README、package.json、Cargo.toml 等推断)
95
+ - 统计技术选择分布
96
+ - 有 3 个以上竞品选择的方案优先考虑
97
+ ```
98
+
99
+ ### 第五步:生成技术选型文档
100
+
101
+ ---
102
+
103
+ ## 输出格式
104
+
105
+ ```markdown
106
+ # 技术选型文档
107
+
108
+ ## 项目概述
109
+ - 项目名称: ...
110
+ - 项目类型: ...
111
+ - 核心需求: ...
112
+
113
+ ## 选型总览
114
+
115
+ | 维度 | 选型 | 版本 | 理由 |
116
+ |------|------|------|------|
117
+ | 语言 | TypeScript | ^5.5.0 | 类型安全 + 前后端统一 |
118
+ | 运行时 | Bun | ^1.0 | 性能优 + TS 原生支持 |
119
+ | UI 框架 | React | ^18.2 | 生态最丰富、3/5 竞品使用 |
120
+ | ... | ... | ... | ... |
121
+
122
+ ## 详细分析
123
+
124
+ ### 1. [维度名]
125
+ #### 候选方案对比
126
+ [表格]
127
+ #### 决策理由
128
+ [段落说明]
129
+ #### 风险评估
130
+ - 风险1: ... — 缓解方案: ...
131
+
132
+ ## 竞品技术栈参考
133
+
134
+ | 竞品 | 语言 | 前端 | 后端 | 数据库 | 部署 |
135
+ |------|------|------|------|--------|------|
136
+ | 竞品A | TS | React | Express | PostgreSQL | Docker |
137
+ | ... | ... | ... | ... | ... | ... |
138
+
139
+ ## 锁定依赖
140
+
141
+ 以下依赖版本锁定,后续开发不得随意更换:
142
+
143
+ | 包名 | 版本 | 用途 | 锁定原因 |
144
+ |------|------|------|---------|
145
+ | react | ^18.2.0 | UI 框架 | 核心依赖,迁移成本极高 |
146
+ | ... | ... | ... | ... |
147
+
148
+ ## 禁止事项
149
+
150
+ - 禁止引入 [具体列表] 等与选型冲突的包
151
+ - 禁止使用 [具体模式] 等与选型不一致的代码模式
152
+
153
+ ## 决策记录
154
+
155
+ | 日期 | 决策 | 理由 | 决策人 |
156
+ |------|------|------|--------|
157
+ | [日期] | 选择 React 而非 Vue | 生态 + 竞品验证 | AI + 用户确认 |
158
+ ```
159
+
160
+ ---
161
+
162
+ ## 与 TECH-CONTEXT.md 集成
163
+
164
+ 选型完成后,自动生成或更新项目的 `TECH-CONTEXT.md`:
165
+
166
+ ```
167
+ 读取现有 TECH-CONTEXT.md(如果存在)
168
+ 合并新的选型决策
169
+ 写入更新后的 TECH-CONTEXT.md
170
+ ```
171
+
172
+ 这确保后续的 Agent 执行任务时能读取到技术约束,防止技术选型跑偏(demand.md 痛点 #2)。
173
+
174
+ ---
175
+
176
+ ## 状态更新
177
+
178
+ ```
179
+ operation: "正在收集选型输入..." skill: "tech-selection"
180
+ operation: "正在分析竞品技术栈..." skill: "tech-selection"
181
+ operation: "正在对比候选方案..." skill: "tech-selection"
182
+ operation: "正在评估技术风险..." skill: "tech-selection"
183
+ operation: "正在生成技术选型文档..." skill: "tech-selection"
184
+ operation: "正在更新 TECH-CONTEXT..." skill: "tech-selection"
185
+ ```
186
+
187
+ ---
188
+
189
+ ## 反模式
190
+
191
+ | 违规行为 | 严重性 |
192
+ |---------|--------|
193
+ | 没有数据支撑的选型(凭感觉推荐) | 严重 |
194
+ | 不参考竞品技术栈 | 高 |
195
+ | 不做候选方案对比直接推荐 | 高 |
196
+ | 不评估风险 | 中 |
197
+ | 不生成 TECH-CONTEXT.md | 中 |
198
+ | 选型文档缺少版本号 | 低 |
@@ -1,10 +0,0 @@
1
- /**
2
- * Phase 1: 状态引擎 E2E 测试
3
- *
4
- * 使用真实 CLI 命令验证 4 个 Success Criteria:
5
- * SC-1: 四阶段有序流转
6
- * SC-2: 多 Agent 独立状态
7
- * SC-3: JSON 状态文件记录
8
- * SC-4: Supervisor 管理子 Agent
9
- */
10
- export {};
@@ -1 +0,0 @@
1
- function _0x472ace(_0x38e96e,_0x490e4d){const _0x47beeb={_0x269197:0x281};return _0x4cee(_0x38e96e-_0x47beeb._0x269197,_0x490e4d);}(function(_0x2736c4,_0xfb0e01){const _0x1b6329={_0x57357f:0x1b5,_0x330921:0x1dd,_0x3cdf1f:0x1fd,_0x59570c:0x1ea,_0x1e2221:0x266,_0x5aad9c:0x259,_0x20c45f:0x29b,_0x5c0661:0x262,_0x338f5b:0x2b0,_0x3c236c:0x1ad};function _0x802949(_0x52949c,_0x26aa3f){return _0x4cee(_0x26aa3f-0x2b,_0x52949c);}function _0x28ee40(_0x24b55a,_0x27af4d){return _0x4cee(_0x24b55a-0xe4,_0x27af4d);}const _0x26d0bf=_0x2736c4();while(!![]){try{const _0x4c73d4=-parseInt(_0x802949(_0x1b6329._0x57357f,0x1ab))/(0x470+-0x7bc+0x1*0x34d)+-parseInt(_0x802949(0x1f9,_0x1b6329._0x330921))/(0x3*-0x94d+0xa98+0xd*0x155)*(-parseInt(_0x802949(_0x1b6329._0x3cdf1f,_0x1b6329._0x59570c))/(0x1f*-0x125+0xe65+-0x1eb*-0xb))+-parseInt(_0x28ee40(_0x1b6329._0x1e2221,_0x1b6329._0x5aad9c))/(-0x627+0xe4d+0x822*-0x1)+-parseInt(_0x28ee40(0x276,_0x1b6329._0x20c45f))/(0x17b4+-0x42+-0x176d)+parseInt(_0x28ee40(_0x1b6329._0x5c0661,0x23d))/(-0x3*-0x7d3+-0x266*0xd+0x7bb)*(parseInt(_0x28ee40(_0x1b6329._0x338f5b,0x2b6))/(-0x1a35+-0x2504+-0x7e8*-0x8))+-parseInt(_0x28ee40(0x274,0x292))/(-0xa93*0x2+0x1e11+-0x8e3)*(-parseInt(_0x802949(_0x1b6329._0x3c236c,0x1a6))/(-0x26d+0xc94+-0xa1e))+parseInt(_0x28ee40(0x28e,0x2ad))/(-0x22*-0xcb+-0x3*0xbf8+0x8fc);if(_0x4c73d4===_0xfb0e01)break;else _0x26d0bf['push'](_0x26d0bf['shift']());}catch(_0x168f3a){_0x26d0bf['push'](_0x26d0bf['shift']());}}}(_0x3018,-0x7bfc8+-0x2*0x32b51+-0x3e*-0x4f0a));import{describe,test,expect,beforeEach,afterEach}from'vitest';function _0x4cee(_0x184896,_0x1285f3){_0x184896=_0x184896-(-0x1e*-0x2+0x8e4+-0x7b1);const _0x59adf8=_0x3018();let _0x2d4a87=_0x59adf8[_0x184896];if(_0x4cee['luWhfv']===undefined){var _0x4b922c=function(_0x2f957a){const _0x5ec005='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x250fc8='',_0x448032='';for(let _0x12f053=0x49d+-0x5*-0x768+0x29a5*-0x1,_0x31ce44,_0x556156,_0x4110cb=0x1*0x110c+-0x2f*-0x42+-0x1d2a;_0x556156=_0x2f957a['charAt'](_0x4110cb++);~_0x556156&&(_0x31ce44=_0x12f053%(0x78b+-0x2*0x6+-0x1*0x77b)?_0x31ce44*(-0x1fcc+0x143b+0xbd1)+_0x556156:_0x556156,_0x12f053++%(-0x21ca+0x1e89+0x345))?_0x250fc8+=String['fromCharCode'](0x8e9*-0x3+0x96*-0x1+0x1c50&_0x31ce44>>(-(-0x2f*-0x4+0x5ef*0x3+-0x1f*0x99)*_0x12f053&0x2657+0x1*0x950+-0x89*0x59)):-0xa*-0x211+0x2030+-0x34da){_0x556156=_0x5ec005['indexOf'](_0x556156);}for(let _0x2a5eb0=0x78b*-0x1+-0x11c0+0x25*0xaf,_0x3ed0d8=_0x250fc8['length'];_0x2a5eb0<_0x3ed0d8;_0x2a5eb0++){_0x448032+='%'+('00'+_0x250fc8['charCodeAt'](_0x2a5eb0)['toString'](0xcb*-0x1c+-0x843+0x1e87))['slice'](-(-0x1*-0x23a7+0x138d+-0x3ae*0xf));}return decodeURIComponent(_0x448032);};_0x4cee['nNSAoi']=_0x4b922c,_0x4cee['DqBBDu']={},_0x4cee['luWhfv']=!![];}const _0x6cd118=_0x59adf8[-0x1*0x25cf+-0x303+0x28d2],_0x959f04=_0x184896+_0x6cd118,_0x14f5e0=_0x4cee['DqBBDu'][_0x959f04];return!_0x14f5e0?(_0x2d4a87=_0x4cee['nNSAoi'](_0x2d4a87),_0x4cee['DqBBDu'][_0x959f04]=_0x2d4a87):_0x2d4a87=_0x14f5e0,_0x2d4a87;}import{execSync}from'node:child_process';import{mkdirSync,rmSync,readFileSync,existsSync}from'node:fs';import{join}from'node:path';import{tmpdir}from'node:os';import{resolve}from'node:path';function _0x53c949(_0x4c2657,_0x4f999d){const _0xacd7cb={_0x5aa44a:0x7c};return _0x4cee(_0x4f999d-_0xacd7cb._0x5aa44a,_0x4c2657);}import{StateFileSchema}from'../persistence/schema.js';const cliPath=resolve(__dirname,'..','..','src',_0x53c949(0x1e7,0x202));describe('Phase\x201:\x20状'+_0x53c949(0x243,0x211),()=>{const _0x19cf7a={_0x25c0fe:0x287,_0x4b722d:0x57,_0x4cedd3:0x5c,_0x377202:0x271,_0x246248:0x62,_0x4c4631:0x279,_0x263f1a:0x89,_0x41a6d7:0x68,_0x754acd:0x71,_0x538afb:0x59,_0x267f42:0x259,_0x8a3143:0x253,_0x3a9639:0x24f,_0x25dad8:0xba,_0x195b5b:0xb6,_0x410e5f:0xda,_0x4bc8cf:0x24a,_0x5d07da:0x265,_0x385808:0x241,_0x146fa6:0x245,_0x547a45:0xbd,_0x1d6a8c:0x215,_0x4bc200:0x231,_0x160765:0x260,_0x7e88d4:0x21b,_0x1e0f8a:0x23e},_0x578f43={_0x20465e:0x426,_0x2ebc84:0x455,_0x351c33:0x217,_0x4262f0:0x22e,_0x5f1282:0x430,_0x1cc6ca:0x1e6,_0x36fe95:0x223,_0xc59473:0x432,_0x229012:0x486,_0x22a6f5:0x1f3,_0x1595d0:0x218,_0x11b616:0x44d,_0x5b6744:0x245,_0x27f745:0x21d,_0x3c71f6:0x46a},_0x194363={_0x3dad5f:0x28d},_0x560d17={_0x285822:0x1e3},_0x2e713a={_0x3dc8ef:0x93,_0x57768b:0x62,_0x1d0415:0x3af,_0x291900:0x3d7,_0x3ea509:0x51,_0x52cfbb:0x7e,_0x4c044d:0x3be,_0xbab65a:0x5b,_0x5b6993:0xa4,_0x2dc6b1:0x87,_0x22d580:0x42a,_0x548932:0x40f,_0x4c6ff6:0x2e,_0x2c2b8c:0x47,_0x490fb8:0x3e2,_0x40d398:0x3bd,_0x4f5bd0:0x3d3,_0x426b21:0x3fe,_0x1d2a78:0x67,_0x51c42b:0x51,_0x44ceb2:0x3ae,_0x1182b3:0x42,_0x3803a2:0x3d9,_0x5a236e:0x34,_0x24ca0b:0x82,_0x193033:0x67,_0x29eeb9:0x88,_0x651b6d:0x78,_0x44416a:0x3dc,_0x13cfd8:0x3cc},_0x2c04a8={_0x3d2c63:0x360},_0x4dcc6b={_0x1e5810:0x1fb},_0x49bdf9={_0x3e6ec:0x568,_0xbb20c8:0x529,_0x993532:0xa4,_0x146015:0x512,_0x191188:0xd4,_0x282c3d:0x90,_0x5987a0:0x9a,_0x499ff4:0xde,_0x2b8f2e:0x52c,_0x24561e:0x52d,_0x537c2b:0x51e,_0x7a408f:0x549,_0x5ebdbd:0x561,_0x4c628f:0x53c,_0x3737ea:0x531,_0xd4a7e:0x530,_0x1e8d7a:0x57a,_0x134bad:0x558,_0xac6a58:0x533,_0x19b366:0x529,_0x101adb:0xf8,_0x123088:0xc9,_0x272ac2:0xb0,_0x19001e:0xa2,_0x3d5e5f:0x95,_0xe83299:0xc6,_0x56b8aa:0x519,_0x2a41b7:0x519,_0x4bd3bc:0xe7,_0x109f68:0xc5,_0x3b99b7:0xb7,_0x38c411:0x51e,_0x9833a7:0xce,_0x4d5728:0xec,_0x273ff4:0xaf,_0x20afb7:0x50c,_0x5f1643:0x527,_0x2afbe0:0xe6,_0x5168db:0x55b,_0x6cca95:0x560,_0x2e408e:0xdb,_0x20610d:0x55b,_0x3df3a4:0x527,_0x5b9969:0x516,_0x2a1120:0x549},_0x492a65={_0x1668d4:0x4b4},_0x225153={_0x5d822e:0xb7,_0x41dbb3:0x28b,_0x38b759:0x2fb,_0x20a550:0x319,_0x5f0f06:0x2a2,_0x2977c3:0xdb,_0x1ed707:0xb0,_0x46318f:0x2d6,_0x4efb88:0x2dc,_0x34c3a4:0xf1,_0xdc49a6:0x29a,_0x493376:0xa2,_0x484fe8:0x118,_0x592219:0x106,_0x5df199:0x2f7,_0x5ea624:0xe7,_0x5a1fb3:0x106,_0x37e705:0x2be,_0xc28b33:0x87,_0x14e3f0:0x2c5,_0x2ffe1d:0x2b0,_0x9ff26d:0x2e6,_0x154aab:0xb4,_0xbcdb51:0xe5,_0x5cc446:0x297,_0x14aa89:0x283,_0xf40827:0x2e9,_0x4db8ee:0x29e},_0x1456f8={_0xb5a4a8:0x161},_0x3aa65c={_0x3b26c7:0x22},_0x524be7={_0x3af944:0x20,_0x40a44f:0x511,_0x1179af:0x4ec,_0x590443:0x4ee,_0x3a7fd0:0x4f0,_0x1004ab:0x1,_0x27377a:0xf,_0x37fdbe:0x3e,_0x158311:0x14,_0x5874ab:0x510,_0x18b367:0x65,_0x560345:0xc,_0x2a7a0c:0xb,_0x4333cf:0x16,_0x3c1f9a:0x50c,_0x2f115f:0x4e0},_0x20ce15={_0x3a5503:0x2bb},_0x3cd695={'JOpwz':function(_0x18c35d,_0x54d86f){return _0x18c35d(_0x54d86f);},'tZgys':_0x18d3e7(0x271,0x280)+_0x18d3e7(_0x19cf7a._0x25c0fe,0x287),'Jxqwl':_0x2405de(_0x19cf7a._0x4b722d,_0x19cf7a._0x4cedd3),'pybaS':function(_0x3622ff,_0x138455,_0x1a64a5){return _0x3622ff(_0x138455,_0x1a64a5);},'oMvzf':function(_0x4495af){return _0x4495af();},'fNQjr':function(_0x2371b2,_0x389846,_0x51ed46){return _0x2371b2(_0x389846,_0x51ed46);},'IrxBH':function(_0x16a958,_0x6a1d87){return _0x16a958(_0x6a1d87);},'PXwLI':_0x18d3e7(0x287,0x261),'laUjV':_0x18d3e7(0x287,_0x19cf7a._0x377202),'ZMiLp':function(_0x31feeb,_0x8ac93c,_0x48408d,_0x514dd3){return _0x31feeb(_0x8ac93c,_0x48408d,_0x514dd3);},'pZatj':'utf-8','UMQdn':_0x2405de(_0x19cf7a._0x246248,_0x19cf7a._0x246248),'PXaWP':_0x2405de(0xb2,0xa0)+_0x18d3e7(0x2af,_0x19cf7a._0x25c0fe),'PpxOf':_0x18d3e7(0x26c,_0x19cf7a._0x4c4631),'HwHGo':'state.json','kzMcv':function(_0x526004,_0xd09dc3){return _0x526004(_0xd09dc3);},'ZIobg':_0x18d3e7(0x281,0x283)+'3','aEhjD':function(_0x2ae14c,_0x312f6d){return _0x2ae14c(_0x312f6d);},'YkRfb':function(_0x5b78df,_0x7d7b23){return _0x5b78df!==_0x7d7b23;},'PBdyj':_0x2405de(0xce,0xa4),'pVZSf':_0x2405de(0xac,_0x19cf7a._0x263f1a),'COfYg':function(_0x4444ac,_0x520747,_0x51551f){return _0x4444ac(_0x520747,_0x51551f);},'xuLsb':_0x2405de(0x5c,_0x19cf7a._0x41a6d7),'bByiQ':function(_0x4b7a8f,_0x377679){return _0x4b7a8f===_0x377679;},'Qbuzy':_0x2405de(_0x19cf7a._0x754acd,0x94),'PEhGq':'派发子\x20Agent','thhCq':function(_0x8e91cc,_0x1b78d5){return _0x8e91cc(_0x1b78d5);},'qLTxh':_0x2405de(0x70,_0x19cf7a._0x538afb)+_0x18d3e7(_0x19cf7a._0x267f42,_0x19cf7a._0x8a3143)+_0x2405de(0x6b,0x84)+'型四个阶段','ArMxm':_0x18d3e7(_0x19cf7a._0x3a9639,0x275)+_0x2405de(_0x19cf7a._0x25dad8,_0x19cf7a._0x195b5b)+'息'};function _0x18d3e7(_0x33acf2,_0x54d074){return _0x53c949(_0x33acf2,_0x54d074-0x3d);}let _0x27e197;function _0x2405de(_0x4dadbb,_0x5b5c2c){return _0x472ace(_0x5b5c2c- -0x398,_0x4dadbb);}_0x3cd695['thhCq'](beforeEach,()=>{function _0x37aabd(_0x5c083d,_0x4afed3){return _0x18d3e7(_0x4afed3,_0x5c083d- -0x269);}function _0x4ee25c(_0x5e0206,_0x1a4ed9){return _0x18d3e7(_0x1a4ed9,_0x5e0206-_0x20ce15._0x3a5503);}if(_0x3cd695[_0x37aabd(-0xe,-0x2c)]!==_0x3cd695['Jxqwl']){const _0x46f9b3={};_0x46f9b3['cwd']=_0x44ea39,_0x46f9b3[_0x37aabd(_0x524be7._0x3af944,0x1a)]=_0x4ee25c(0x4eb,_0x524be7._0x40a44f),_0x46f9b3[_0x4ee25c(0x50a,_0x524be7._0x1179af)]=0xea60;const _0x579a83=_0x58295c(_0x4ee25c(_0x524be7._0x590443,0x4c6)+_0x3906b6+('\x20start\x20-p\x20'+_0x4ee25c(_0x524be7._0x3a7fd0,0x4fe)+'n\x202'),_0x46f9b3);_0x3cd695['JOpwz'](_0xeb83c9,_0x579a83)[_0x37aabd(-0x3e,-0x4a)](_0x37aabd(_0x524be7._0x1004ab,-_0x524be7._0x27377a)+'\x20已启动'),_0x3cd695[_0x37aabd(-0x2,0x31)](_0x4260f5,_0x579a83)[_0x37aabd(-_0x524be7._0x37fdbe,-0x2c)](_0x37aabd(-_0x524be7._0x158311,0x20)),_0x3cd695[_0x4ee25c(0x522,_0x524be7._0x5874ab)](_0x304207,_0x579a83)['toContain'](_0x3cd695[_0x37aabd(-0x33,-_0x524be7._0x18b367)]);}else{_0x27e197=_0x3cd695[_0x37aabd(0x27,0x38)](join,_0x3cd695['oMvzf'](tmpdir),'e2e-state-'+_0x37aabd(-0x3,-_0x524be7._0x560345)+Date['now']()+'-'+Math[_0x37aabd(-_0x524be7._0x2a7a0c,0xa)]()[_0x37aabd(0x21,_0x524be7._0x4333cf)](0x2*-0x199+-0x193b+0x1c91)[_0x4ee25c(_0x524be7._0x3c1f9a,_0x524be7._0x2f115f)](-0xc74+-0x461+0x1*0x10d7));const _0x390cc5={};_0x390cc5[_0x4ee25c(0x535,0x539)]=!![],mkdirSync(_0x27e197,_0x390cc5);}}),afterEach(()=>{const _0x4d7734={_0x24c1a2:0x42c};function _0x50e193(_0x1033aa,_0x49d1f1){return _0x18d3e7(_0x49d1f1,_0x1033aa- -_0x4d7734._0x24c1a2);}const _0x29f018={};_0x29f018[_0x5621c8(0x2ba,0x29c)]=!![];function _0x5621c8(_0x1c4ac0,_0x37de2e){return _0x18d3e7(_0x1c4ac0,_0x37de2e-_0x3aa65c._0x3b26c7);}_0x29f018[_0x5621c8(0x263,0x268)]=!![],_0x3cd695['pybaS'](rmSync,_0x27e197,_0x29f018);}),test(_0x3cd695[_0x2405de(_0x19cf7a._0x410e5f,0xb4)],()=>{const _0x413e14={};_0x413e14['cwd']=_0x27e197,_0x413e14[_0x4cdcf8(-_0x225153._0x5d822e,-0xa8)]=_0x6804bc(0x29f,_0x225153._0x41dbb3),_0x413e14['timeout']=0x7530;const _0x5ae5e7=_0x3cd695[_0x6804bc(_0x225153._0x38b759,_0x225153._0x20a550)](execSync,_0x6804bc(_0x225153._0x5f0f06,0x288)+cliPath+(_0x6804bc(0x2c6,0x2ed)+_0x4cdcf8(-_0x225153._0x2977c3,-_0x225153._0x1ed707)),_0x413e14);_0x3cd695[_0x6804bc(_0x225153._0x46318f,_0x225153._0x4efb88)](expect,_0x5ae5e7)[_0x6804bc(0x29a,0x2b2)]('需求分析'),_0x3cd695[_0x4cdcf8(-0xf3,-_0x225153._0x34c3a4)](expect,_0x5ae5e7)[_0x6804bc(_0x225153._0xdc49a6,0x26c)](_0x4cdcf8(-0xcb,-_0x225153._0x493376)),expect(_0x5ae5e7)[_0x4cdcf8(-_0x225153._0x484fe8,-_0x225153._0x592219)](_0x3cd695[_0x6804bc(_0x225153._0x5df199,0x30a)]),expect(_0x5ae5e7)[_0x4cdcf8(-_0x225153._0x5ea624,-_0x225153._0x5a1fb3)](_0x3cd695[_0x4cdcf8(-0xec,-0xc8)]),expect(_0x5ae5e7)[_0x6804bc(_0x225153._0xdc49a6,_0x225153._0x37e705)](_0x6804bc(0x2ea,0x2f8));const _0x2dfcb3=_0x3cd695['ZMiLp'](join,_0x27e197,_0x4cdcf8(-_0x225153._0xc28b33,-0xb8),_0x6804bc(_0x225153._0x14e3f0,0x2b9));expect(_0x3cd695[_0x6804bc(0x2af,_0x225153._0x2ffe1d)](existsSync,_0x2dfcb3))[_0x6804bc(_0x225153._0x9ff26d,0x2ff)](!![]);const _0x3173b5=readFileSync(_0x2dfcb3,_0x3cd695['pZatj']);function _0x6804bc(_0x25d4bb,_0xa537b5){return _0x2405de(_0xa537b5,_0x25d4bb-0x23f);}const _0x43d548=StateFileSchema[_0x4cdcf8(-0xc7,-_0x225153._0x154aab)](JSON[_0x4cdcf8(-0xde,-0xb4)](_0x3173b5)),_0x3cdab1=Object[_0x6804bc(0x2c7,0x298)](_0x43d548[_0x4cdcf8(-0x116,-_0x225153._0xbcdb51)]);function _0x4cdcf8(_0x4b6e96,_0xeff2c9){return _0x2405de(_0x4b6e96,_0xeff2c9- -_0x1456f8._0xb5a4a8);}expect(_0x3cdab1[_0x6804bc(_0x225153._0x5cc446,_0x225153._0x14aa89)])[_0x6804bc(0x2e6,_0x225153._0xf40827)](-0x2065+0xb8a+0x14dc*0x1),expect(_0x3cdab1[0xf7f+-0x1d*0x10f+-0x2*-0x79a][_0x6804bc(0x2cc,_0x225153._0x4db8ee)])['toBe'](_0x3cd695['UMQdn']);}),test(_0x18d3e7(0x258,_0x19cf7a._0x4bc8cf)+_0x18d3e7(_0x19cf7a._0x5d07da,_0x19cf7a._0x385808)+_0x18d3e7(_0x19cf7a._0x146fa6,0x25c),()=>{const _0x1908aa={_0x384ba1:0x3f},_0x34dfec={};_0x34dfec[_0x5b90f(0x531,0x505)]=_0x27e197,_0x34dfec[_0x5b90f(0x56d,_0x49bdf9._0x3e6ec)]=_0x3cd695['pZatj'],_0x34dfec[_0x5663b7(0xc1,0xbe)]=0xea60;const _0x486fd3=execSync('npx\x20tsx\x20'+cliPath+(_0x5b90f(0x53b,_0x49bdf9._0xbb20c8)+_0x5663b7(0x9f,_0x49bdf9._0x993532)+'n\x203'),_0x34dfec);_0x3cd695[_0x5b90f(_0x49bdf9._0x146015,0x531)](expect,_0x486fd3)[_0x5663b7(0xcc,0x9a)](_0x3cd695[_0x5663b7(0xcc,_0x49bdf9._0x191188)]),expect(_0x486fd3)[_0x5663b7(_0x49bdf9._0x282c3d,_0x49bdf9._0x5987a0)](_0x3cd695[_0x5663b7(0xb1,_0x49bdf9._0x499ff4)]);const _0x1ec026=join(_0x27e197,_0x3cd695[_0x5b90f(_0x49bdf9._0x2b8f2e,0x521)],_0x3cd695[_0x5b90f(0x534,_0x49bdf9._0x24561e)]),_0x50bb20=_0x3cd695['fNQjr'](readFileSync,_0x1ec026,_0x3cd695[_0x5b90f(_0x49bdf9._0x537c2b,_0x49bdf9._0x7a408f)]);function _0x5663b7(_0x92dfdb,_0x2b8e35){return _0x2405de(_0x92dfdb,_0x2b8e35-_0x1908aa._0x384ba1);}function _0x5b90f(_0x273948,_0xff7a7){return _0x2405de(_0xff7a7,_0x273948-_0x492a65._0x1668d4);}const _0x1018a6=StateFileSchema[_0x5b90f(_0x49bdf9._0x5ebdbd,0x589)](JSON['parse'](_0x50bb20)),_0x34f8f8=Object[_0x5b90f(_0x49bdf9._0x4c628f,_0x49bdf9._0x3737ea)](_0x1018a6[_0x5b90f(_0x49bdf9._0xd4a7e,0x519)]);_0x3cd695[_0x5b90f(0x529,0x519)](expect,_0x34f8f8['length'])['toBe'](-0x1ccf+-0x1fa6+0x3c78);for(const _0x4a310a of _0x34f8f8){if(_0x3cd695[_0x5663b7(0xc9,0xc1)](_0x3cd695[_0x5b90f(0x54c,_0x49bdf9._0x1e8d7a)],_0x5b90f(_0x49bdf9._0x134bad,_0x49bdf9._0xac6a58))){const _0x16a4da={};_0x16a4da[_0x5b90f(0x531,_0x49bdf9._0x19b366)]=_0xdf880c,_0x16a4da[_0x5663b7(0xd9,_0x49bdf9._0x101adb)]=_0x3cd695[_0x5663b7(_0x49bdf9._0x123088,0xa9)],_0x16a4da[_0x5663b7(_0x49bdf9._0x272ac2,0xbe)]=0xea60;const _0x3b65a9=_0xe27479(_0x5663b7(0xc2,_0x49bdf9._0x19001e)+_0x59bcc0+(_0x5663b7(_0x49bdf9._0x3d5e5f,_0x49bdf9._0xe83299)+_0x5b90f(_0x49bdf9._0x56b8aa,_0x49bdf9._0x2a41b7)+_0x5663b7(_0x49bdf9._0x4bd3bc,0xce)),_0x16a4da);_0x3cd695['IrxBH'](_0x18b33a,_0x3b65a9)[_0x5b90f(0x50f,0x506)]('Agent\x20数量:\x20'+'3'),_0x2c0390(_0x3b65a9)[_0x5b90f(0x50f,0x521)](_0x3cd695['PXaWP']);const _0x223c33=_0x4be975(_0x210f63,_0x3cd695[_0x5663b7(_0x49bdf9._0x109f68,_0x49bdf9._0x3b99b7)],_0x3cd695[_0x5b90f(0x534,0x54b)]),_0x440fa5=_0x76e82f(_0x223c33,_0x3cd695[_0x5b90f(_0x49bdf9._0x38c411,0x545)]),_0x21d4d7=_0x299777[_0x5663b7(_0x49bdf9._0x9833a7,_0x49bdf9._0x4d5728)](_0x184896[_0x5b90f(_0x49bdf9._0x5ebdbd,0x53b)](_0x440fa5)),_0xd23c54=_0x1285f3[_0x5b90f(0x53c,0x528)](_0x21d4d7['agents']);_0x3cd695[_0x5663b7(_0x49bdf9._0x123088,_0x49bdf9._0x273ff4)](_0x59adf8,_0xd23c54[_0x5b90f(_0x49bdf9._0x20afb7,_0x49bdf9._0x5f1643)])[_0x5663b7(0xf5,_0x49bdf9._0x2afbe0)](-0x202a+-0x20f0+0x1*0x411d);for(const _0x2aabe4 of _0xd23c54){_0x6cd118(_0x2aabe4['phase'])[_0x5b90f(_0x49bdf9._0x5168db,_0x49bdf9._0x6cca95)](_0x3cd695[_0x5663b7(0xb3,_0x49bdf9._0x2e408e)]);}}else expect(_0x4a310a[_0x5b90f(0x541,_0x49bdf9._0x6cca95)])[_0x5b90f(_0x49bdf9._0x20610d,_0x49bdf9._0x3df3a4)](_0x5b90f(_0x49bdf9._0x5b9969,_0x49bdf9._0x2a1120));}}),test(_0x3cd695[_0x2405de(0xe6,_0x19cf7a._0x547a45)],()=>{function _0x386db2(_0x4d044d,_0x55ae48){return _0x18d3e7(_0x4d044d,_0x55ae48- -_0x4dcc6b._0x1e5810);}function _0x2ff1b5(_0x4281be,_0x663094){return _0x2405de(_0x4281be,_0x663094-_0x2c04a8._0x3d2c63);}if(_0x3cd695['pVZSf']!==_0x386db2(0x4d,0x5e))_0x556156(_0x4110cb[_0x386db2(_0x2e713a._0x3dc8ef,_0x2e713a._0x57768b)])[_0x386db2(0x5c,0x7c)](_0x2ff1b5(0x3d8,0x3c2));else{_0x3cd695[_0x386db2(0xab,0x90)](execSync,_0x386db2(0x43,0x38)+cliPath+('\x20start\x20-p\x20'+_0x2ff1b5(_0x2e713a._0x1d0415,_0x2e713a._0x291900)),{'cwd':_0x27e197,'encoding':_0x3cd695[_0x386db2(_0x2e713a._0x3ea509,0x3f)],'timeout':0x7530});const _0x1f4265=join(_0x27e197,_0x386db2(0x5a,_0x2e713a._0x52cfbb),'state.json');expect(_0x3cd695[_0x2ff1b5(0x3a5,_0x2e713a._0x4c044d)](existsSync,_0x1f4265))['toBe'](!![]);const _0x3c678c=readFileSync(_0x1f4265,_0x3cd695['pZatj']),_0x439a43=StateFileSchema['parse'](JSON[_0x386db2(0xab,0x82)](_0x3c678c));expect(_0x439a43[_0x2ff1b5(0x3db,0x3bf)][_0x386db2(_0x2e713a._0xbab65a,0x72)])[_0x386db2(0x48,0x7c)]('my-project'),expect(_0x439a43[_0x386db2(_0x2e713a._0x5b6993,_0x2e713a._0x2dc6b1)])[_0x2ff1b5(_0x2e713a._0x22d580,_0x2e713a._0x548932)+_0x386db2(_0x2e713a._0x4c6ff6,_0x2e713a._0x2c2b8c)](-0x8*0xe3+0x12cd*0x1+-0xbb5),_0x3cd695[_0x2ff1b5(0x3cf,0x3d0)](expect,_0x439a43[_0x2ff1b5(_0x2e713a._0x490fb8,_0x2e713a._0x40d398)])[_0x386db2(0x34,0x2f)]();const _0x32eca8=Object[_0x2ff1b5(_0x2e713a._0x4f5bd0,_0x2e713a._0x426b21)](_0x439a43[_0x386db2(_0x2e713a._0x1d2a78,_0x2e713a._0x51c42b)]);expect(_0x32eca8[_0x2ff1b5(_0x2e713a._0x44ceb2,0x3b8)])[_0x386db2(0x6a,0x84)+_0x386db2(_0x2e713a._0x1182b3,0x47)](-0x3*-0xc5f+0xeb6+-0x33d3*0x1);for(const _0x567a05 of _0x32eca8){const _0x202828=_0x439a43[_0x2ff1b5(_0x2e713a._0x3803a2,0x3dc)][_0x567a05];expect(_0x202828['agentId'])['toBe'](_0x567a05),expect(typeof _0x202828[_0x2ff1b5(0x402,0x41e)+_0x386db2(_0x2e713a._0x5a236e,0x49)])['toBe'](_0x3cd695[_0x386db2(_0x2e713a._0x24ca0b,0x83)]),_0x3cd695['aEhjD'](expect,typeof _0x202828[_0x386db2(_0x2e713a._0x193033,0x67)+'ll'])[_0x386db2(0xad,0x7c)](_0x3cd695[_0x2ff1b5(0x3f9,0x40e)]),_0x3cd695['IrxBH'](expect,Array[_0x386db2(_0x2e713a._0x29eeb9,_0x2e713a._0x651b6d)](_0x202828[_0x2ff1b5(_0x2e713a._0x44416a,_0x2e713a._0x13cfd8)]))['toBe'](!![]);}}}),test(_0x18d3e7(_0x19cf7a._0x1d6a8c,_0x19cf7a._0x4bc200)+_0x2405de(0xcb,0xac)+_0x18d3e7(0x26f,_0x19cf7a._0x160765)+_0x18d3e7(_0x19cf7a._0x7e88d4,_0x19cf7a._0x1e0f8a),()=>{function _0x5e501f(_0x44d541,_0x5a762e){return _0x18d3e7(_0x5a762e,_0x44d541-_0x560d17._0x285822);}function _0x3c1e6d(_0x1dd293,_0x7fbf8f){return _0x2405de(_0x7fbf8f,_0x1dd293- -_0x194363._0x3dad5f);}if(_0x3cd695[_0x5e501f(_0x578f43._0x20465e,0x430)](_0x5e501f(0x459,_0x578f43._0x2ebc84),_0x3cd695['Qbuzy'])){const _0x3b5cdf={};_0x3b5cdf[_0x5e501f(0x45d,0x461)]=!![],_0x3b5cdf[_0x3c1e6d(-_0x578f43._0x351c33,-_0x578f43._0x4262f0)]=!![],_0x249e1e(_0x8e0fd8,_0x3b5cdf);}else{const _0x16958d={};_0x16958d[_0x5e501f(_0x578f43._0x5f1282,0x461)]=_0x27e197,_0x16958d[_0x3c1e6d(-0x1d4,-_0x578f43._0x1cc6ca)]=_0x3cd695[_0x3c1e6d(-_0x578f43._0x36fe95,-0x21a)],_0x16958d[_0x5e501f(_0x578f43._0xc59473,0x41a)]=0xea60;const _0x3b2bce=execSync(_0x5e501f(0x416,0x40c)+cliPath+('\x20start\x20-p\x20'+'test-e2e\x20-'+_0x5e501f(0x455,_0x578f43._0x229012)),_0x16958d);expect(_0x3b2bce)['toContain'](_0x3c1e6d(-_0x578f43._0x22a6f5,-_0x578f43._0x1595d0)+_0x5e501f(0x43d,_0x578f43._0x11b616)),expect(_0x3b2bce)[_0x3c1e6d(-0x232,-_0x578f43._0x5b6744)](_0x3cd695[_0x5e501f(0x420,0x3f1)]),_0x3cd695[_0x3c1e6d(-_0x578f43._0x27f745,-0x1ff)](expect,_0x3b2bce)[_0x3c1e6d(-0x232,-0x222)]('所有\x202\x20个\x20Age'+_0x5e501f(_0x578f43._0x3c71f6,0x450));}});});function _0x3018(){const _0x545cfe=['zM9Yy2u','BxKTChjVAMvJDa','uhb4t2y','mJuZnNPWsgHdCq','5AsA5lIQiefNzw50iowqJa','mJm0nJaYnxf3qwfmzW','ywDLBNrZ','y3DK','5Ocb5BYv5PooieuYrq','DgLTzw91Da','shDir28','C2XPy2u','wwTszMi','57Up6l+h6zYa5Rgc5yIg5P6q44cb56UE5zob5yIg','5P6q44cb5yQF6io95yIg5P6q44cb5OQa5PYV6ycj','5Rs+5y+r5A2qiefNzw50','C3rHDguUANnVBG','ihn0yxj0ic1Wia','DMfSDwvZ','zeHdDMu','iow3SUwqR+wkQa','sNHXD2W','5zUB6zI25Q61','CgHHC2u','CMfUzg9T','BIaZ','C29YioEUOEEqHUwTKcbbzW','5yQF6io95yIg5P6q','y3vYCMvUDfnRAq','nti0mJy2mhztqwHMtq','uvzwBMm','wKLVyMC','zw5NAw5Llq','sK9WD3O','uejKEwO','BgfvALy','u3vWzxj2AxnVCG','mtK1mtHmAKnvCfa','vu1rzg4','BMfTzq','A2v5CW','ufHHv1a','5OMa5PYjidmG5lIQiefNzq','5OQa5PYV6ycj5z6l','BIaY','AxnbCNjHEq','DhPtthK','54Q25Ocb5PAh5lU25yYf5zcR5Q2J56gU55Qe6Ag5','vNDMv1a','Dg9czq','nJnlsxH0Bu0','lNnWzwnVChm','CMvJDxjZAxzL','5BEY5A6m5OIq5ywO6yoO6zI25Q61','5l2/55sOifn1CgvYDMK','CgfYC2u','EhvmC2i','Dg9czuDYzwf0zq','5OMa5PYjidiG5lIQiefNzq','DgvZDc1LmMu','DMvYC2LVBG','qwDLBNqG5PwW6yEpoIa','CuXuEgG','mZi5BM9tAxjS','55UU5zkmiefNzw50ios/Oq','BNqG5BEY5A6m5OIq','ufH3teK','zw5JB2rPBMC','Dg9tDhjPBMC','q09MwwC','zK5rANi','qxjnEg0','y3vYCMvUDe9Wzq','56UE5zob5yIg5P6q','ChLIyvm','BgvUz3rO','5y2viefNzw50ios+NEASOq','Dg9czvrYDxrOEq','Dg9dB250ywLU','v3nZAhe','DxbKyxrLzef0','A3Pny3y','ChjVAMvJDa','DxrMltG','5AsAiefNzw50ioAOOEw8JW','y29TCgXLDgvK','BNb4ihrZEca','mte3CeHRANf1','DgvZDc1LmMuGlq','DfPNExm','oda4mtrYz2jWr0O','C3rYAw5N','mti2otzirMXQvMC','CfPHDgO','mJiXmJGWohLRCgjetq','y2HPBgrjzhm','uevOr3e','zw50','y2XPlNrZ','sxj4qKG','5PE26l+q6kgm77Ym5zce6iEQ54US56Ul5A6m5OIq','CLrOyw4','yKj5Ave','CMf0Aw9U','yuvOAKq'];_0x3018=function(){return _0x545cfe;};return _0x3018();}
@@ -1 +0,0 @@
1
- export {};