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.
- package/.opencode/agent/specops-codebase-mapper.md +764 -0
- package/.opencode/agent/specops-debugger.md +1246 -0
- package/.opencode/agent/specops-executor.md +475 -0
- package/.opencode/agent/specops-integration-checker.md +443 -0
- package/.opencode/agent/specops-phase-researcher.md +547 -0
- package/.opencode/agent/specops-plan-checker.md +690 -0
- package/.opencode/agent/specops-planner.md +581 -0
- package/.opencode/agent/specops-project-researcher.md +354 -0
- package/.opencode/agent/specops-research-synthesizer.md +242 -0
- package/.opencode/agent/specops-roadmapper.md +642 -0
- package/.opencode/agent/specops-work-verifier.md +573 -0
- package/.opencode/references/checkpoints.md +776 -0
- package/.opencode/references/continuation-format.md +249 -0
- package/.opencode/references/decimal-phase-calculation.md +65 -0
- package/.opencode/references/git-integration.md +248 -0
- package/.opencode/references/git-planning-commit.md +38 -0
- package/.opencode/references/model-profile-resolution.md +34 -0
- package/.opencode/references/model-profiles.md +92 -0
- package/.opencode/references/phase-argument-parsing.md +61 -0
- package/.opencode/references/planning-config.md +196 -0
- package/.opencode/references/questioning.md +145 -0
- package/.opencode/references/tdd.md +263 -0
- package/.opencode/references/ui-brand.md +160 -0
- package/.opencode/references/verification-patterns.md +612 -0
- package/.opencode/templates/DEBUG.md +164 -0
- package/.opencode/templates/UAT.md +180 -0
- package/.opencode/templates/VALIDATION.md +76 -0
- package/.opencode/templates/codebase/architecture.md +255 -0
- package/.opencode/templates/codebase/concerns.md +310 -0
- package/.opencode/templates/codebase/conventions.md +307 -0
- package/.opencode/templates/codebase/integrations.md +280 -0
- package/.opencode/templates/codebase/stack.md +186 -0
- package/.opencode/templates/codebase/structure.md +285 -0
- package/.opencode/templates/codebase/testing.md +480 -0
- package/.opencode/templates/context.md +221 -0
- package/.opencode/templates/continue-here.md +78 -0
- package/.opencode/templates/debug-subagent-prompt.md +91 -0
- package/.opencode/templates/discovery.md +147 -0
- package/.opencode/templates/milestone-archive.md +123 -0
- package/.opencode/templates/milestone.md +115 -0
- package/.opencode/templates/phase-prompt.md +333 -0
- package/.opencode/templates/planner-subagent-prompt.md +117 -0
- package/.opencode/templates/project.md +184 -0
- package/.opencode/templates/requirements.md +130 -0
- package/.opencode/templates/research-project/ARCHITECTURE.md +204 -0
- package/.opencode/templates/research-project/FEATURES.md +147 -0
- package/.opencode/templates/research-project/PITFALLS.md +200 -0
- package/.opencode/templates/research-project/STACK.md +120 -0
- package/.opencode/templates/research-project/SUMMARY.md +170 -0
- package/.opencode/templates/research.md +278 -0
- package/.opencode/templates/retrospective.md +54 -0
- package/.opencode/templates/roadmap.md +202 -0
- package/.opencode/templates/state.md +176 -0
- package/.opencode/templates/summary-complex.md +59 -0
- package/.opencode/templates/summary-minimal.md +41 -0
- package/.opencode/templates/summary-standard.md +48 -0
- package/.opencode/templates/summary.md +248 -0
- package/.opencode/templates/user-setup.md +311 -0
- package/.opencode/templates/verification-report.md +322 -0
- package/.opencode/workflows/add-phase.md +111 -0
- package/.opencode/workflows/add-tests.md +350 -0
- package/.opencode/workflows/add-todo.md +157 -0
- package/.opencode/workflows/audit-milestone.md +297 -0
- package/.opencode/workflows/check-todos.md +176 -0
- package/.opencode/workflows/cleanup.md +152 -0
- package/.opencode/workflows/complete-milestone.md +763 -0
- package/.opencode/workflows/diagnose-issues.md +219 -0
- package/.opencode/workflows/discovery-phase.md +288 -0
- package/.opencode/workflows/discuss-phase.md +542 -0
- package/.opencode/workflows/execute-phase.md +449 -0
- package/.opencode/workflows/execute-plan.md +447 -0
- package/.opencode/workflows/health.md +156 -0
- package/.opencode/workflows/help.md +489 -0
- package/.opencode/workflows/insert-phase.md +129 -0
- package/.opencode/workflows/list-phase-assumptions.md +178 -0
- package/.opencode/workflows/map-codebase.md +315 -0
- package/.opencode/workflows/new-milestone.md +382 -0
- package/.opencode/workflows/new-project.md +1116 -0
- package/.opencode/workflows/pause-work.md +122 -0
- package/.opencode/workflows/plan-milestone-gaps.md +274 -0
- package/.opencode/workflows/plan-phase.md +569 -0
- package/.opencode/workflows/progress.md +381 -0
- package/.opencode/workflows/quick.md +453 -0
- package/.opencode/workflows/remove-phase.md +154 -0
- package/.opencode/workflows/research-phase.md +73 -0
- package/.opencode/workflows/resume-project.md +304 -0
- package/.opencode/workflows/set-profile.md +80 -0
- package/.opencode/workflows/settings.md +213 -0
- package/.opencode/workflows/transition.md +544 -0
- package/.opencode/workflows/update.md +219 -0
- package/.opencode/workflows/verify-phase.md +242 -0
- package/.opencode/workflows/verify-work.md +569 -0
- package/commands/specops/add-phase.md +43 -0
- package/commands/specops/add-tests.md +41 -0
- package/commands/specops/add-todo.md +47 -0
- package/commands/specops/audit-milestone.md +36 -0
- package/commands/specops/check-todos.md +45 -0
- package/commands/specops/cleanup.md +18 -0
- package/commands/specops/complete-milestone.md +136 -0
- package/commands/specops/debug.md +167 -0
- package/commands/specops/discuss-phase.md +83 -0
- package/commands/specops/execute-phase.md +41 -0
- package/commands/specops/health.md +22 -0
- package/commands/specops/help.md +22 -0
- package/commands/specops/insert-phase.md +32 -0
- package/commands/specops/join-discord.md +18 -0
- package/commands/specops/list-phase-assumptions.md +46 -0
- package/commands/specops/map-codebase.md +71 -0
- package/commands/specops/new-milestone.md +44 -0
- package/commands/specops/new-project.md +42 -0
- package/commands/specops/pause-work.md +38 -0
- package/commands/specops/plan-milestone-gaps.md +34 -0
- package/commands/specops/plan-phase.md +45 -0
- package/commands/specops/progress.md +24 -0
- package/commands/specops/quick.md +41 -0
- package/commands/specops/reapply-patches.md +111 -0
- package/commands/specops/remove-phase.md +31 -0
- package/commands/specops/research-phase.md +189 -0
- package/commands/specops/resume-work.md +40 -0
- package/commands/specops/set-profile.md +34 -0
- package/commands/specops/settings.md +36 -0
- package/commands/specops/update.md +37 -0
- package/commands/specops/verify-work.md +38 -0
- package/dist/__integration__/fixtures/generator.d.ts +4 -0
- package/dist/__integration__/fixtures/generator.js +1 -0
- package/dist/__integration__/mocks/server.d.ts +7 -0
- package/dist/__integration__/mocks/server.js +1 -0
- package/dist/__integration__/setup.d.ts +6 -0
- package/dist/__integration__/setup.js +1 -0
- package/dist/acceptance/lazyDetector.js +1 -1
- package/dist/acceptance/reporter.js +1 -1
- package/dist/acceptance/runner.js +1 -1
- package/dist/cli.js +1 -1
- package/dist/context/index.js +1 -1
- package/dist/context/promptTemplate.js +1 -1
- package/dist/context/techContextLoader.js +1 -1
- package/dist/engine.d.ts +1 -0
- package/dist/engine.js +1 -1
- package/dist/evolution/distiller.js +1 -1
- package/dist/evolution/index.js +1 -1
- package/dist/evolution/memoryGraph.js +1 -1
- package/dist/evolution/selector.js +1 -1
- package/dist/evolution/signals.js +1 -1
- package/dist/evolution/solidify.js +1 -1
- package/dist/evolution/store.js +1 -1
- package/dist/evolution/types.js +1 -1
- package/dist/init.d.ts +4 -3
- package/dist/init.js +1 -1
- package/dist/machines/agentMachine.js +1 -1
- package/dist/machines/supervisorMachine.js +1 -1
- package/dist/persistence/schema.js +1 -1
- package/dist/persistence/stateFile.js +1 -1
- package/dist/plugin-engine.js +1 -1
- package/dist/plugin.js +1 -1
- package/dist/requirement-analysis/analyzers/repository-parser.d.ts +121 -0
- package/dist/requirement-analysis/analyzers/repository-parser.js +1 -0
- package/dist/requirement-analysis/generators/prd-generator.d.ts +90 -0
- package/dist/requirement-analysis/generators/prd-generator.js +1 -0
- package/dist/requirement-analysis/integrations/v1-integration.d.ts +73 -0
- package/dist/requirement-analysis/integrations/v1-integration.js +1 -0
- package/dist/requirement-analysis/tools/analyze-requirements.js +1 -0
- package/dist/requirement-analysis/types/analysis-result.d.ts +326 -0
- package/dist/requirement-analysis/types/analysis-result.js +1 -0
- package/dist/requirement-analysis/types/feature-mapping.d.ts +294 -0
- package/dist/requirement-analysis/types/feature-mapping.js +1 -0
- package/dist/requirement-analysis/types/index.d.ts +171 -0
- package/dist/requirement-analysis/types/index.js +1 -0
- package/dist/requirement-analysis/types/tech-stack.d.ts +213 -0
- package/dist/requirement-analysis/types/tech-stack.js +1 -0
- package/dist/requirement-analysis/utils/error-handler.d.ts +112 -0
- package/dist/requirement-analysis/utils/error-handler.js +1 -0
- package/dist/types/index.d.ts +4 -2
- package/dist/types/index.js +1 -1
- package/dist/utils/id.js +1 -1
- package/package.json +4 -2
- package/skills/competitor-search/SKILL.md +169 -0
- package/skills/demand-analysis/SKILL.md +307 -0
- package/skills/feature-search/SKILL.md +182 -0
- package/skills/requirement-analysis/README.md +464 -0
- package/skills/requirement-analysis/SKILL.md +224 -0
- package/skills/requirement-analysis/templates/feature-mapping-template.json +210 -0
- package/skills/requirement-analysis/templates/prd-template.md +104 -0
- package/skills/tech-selection/SKILL.md +198 -0
- package/dist/__e2e__/01-state-engine.e2e.test.d.ts +0 -10
- package/dist/__e2e__/01-state-engine.e2e.test.js +0 -1
- package/dist/acceptance/lazyDetector.test.d.ts +0 -1
- package/dist/acceptance/lazyDetector.test.js +0 -1
- package/dist/acceptance/reporter.test.d.ts +0 -1
- package/dist/acceptance/reporter.test.js +0 -1
- package/dist/acceptance/runner.test.d.ts +0 -1
- package/dist/acceptance/runner.test.js +0 -1
- package/dist/context/promptTemplate.test.d.ts +0 -1
- package/dist/context/promptTemplate.test.js +0 -1
- package/dist/context/techContextLoader.test.d.ts +0 -1
- package/dist/context/techContextLoader.test.js +0 -1
- package/dist/machines/agentMachine.test.d.ts +0 -1
- package/dist/machines/agentMachine.test.js +0 -1
- package/dist/machines/supervisorMachine.test.d.ts +0 -1
- package/dist/machines/supervisorMachine.test.js +0 -1
- package/dist/persistence/stateFile.test.d.ts +0 -1
- 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 +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 {};
|