specops 0.3.0 → 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 (88) hide show
  1. package/.opencode/agent/specops-codebase-mapper.md +1 -1
  2. package/.opencode/agent/specops-debugger.md +1 -1
  3. package/.opencode/agent/specops-executor.md +9 -3
  4. package/.opencode/agent/specops-integration-checker.md +1 -1
  5. package/.opencode/agent/specops-phase-researcher.md +1 -1
  6. package/.opencode/agent/specops-plan-checker.md +1 -1
  7. package/.opencode/agent/specops-planner.md +9 -3
  8. package/.opencode/agent/specops-project-researcher.md +1 -1
  9. package/.opencode/agent/specops-research-synthesizer.md +6 -3
  10. package/.opencode/agent/specops-roadmapper.md +1 -1
  11. package/.opencode/agent/specops-work-verifier.md +1 -1
  12. package/dist/__integration__/fixtures/generator.d.ts +4 -0
  13. package/dist/__integration__/fixtures/generator.js +1 -0
  14. package/dist/__integration__/mocks/server.d.ts +7 -0
  15. package/dist/__integration__/mocks/server.js +1 -0
  16. package/dist/__integration__/setup.d.ts +6 -0
  17. package/dist/__integration__/setup.js +1 -0
  18. package/dist/acceptance/lazyDetector.js +1 -1
  19. package/dist/acceptance/reporter.js +1 -1
  20. package/dist/acceptance/runner.js +1 -1
  21. package/dist/cli.js +1 -1
  22. package/dist/context/index.js +1 -1
  23. package/dist/context/promptTemplate.js +1 -1
  24. package/dist/context/techContextLoader.js +1 -1
  25. package/dist/engine.d.ts +1 -0
  26. package/dist/engine.js +1 -1
  27. package/dist/evolution/distiller.js +1 -1
  28. package/dist/evolution/index.js +1 -1
  29. package/dist/evolution/memoryGraph.js +1 -1
  30. package/dist/evolution/selector.js +1 -1
  31. package/dist/evolution/signals.js +1 -1
  32. package/dist/evolution/solidify.js +1 -1
  33. package/dist/evolution/store.js +1 -1
  34. package/dist/evolution/types.js +1 -1
  35. package/dist/init.js +1 -1
  36. package/dist/machines/agentMachine.js +1 -1
  37. package/dist/machines/supervisorMachine.js +1 -1
  38. package/dist/persistence/schema.js +1 -1
  39. package/dist/persistence/stateFile.js +1 -1
  40. package/dist/plugin-engine.js +1 -1
  41. package/dist/plugin.js +1 -1
  42. package/dist/requirement-analysis/analyzers/repository-parser.d.ts +121 -0
  43. package/dist/requirement-analysis/analyzers/repository-parser.js +1 -0
  44. package/dist/requirement-analysis/generators/prd-generator.d.ts +90 -0
  45. package/dist/requirement-analysis/generators/prd-generator.js +1 -0
  46. package/dist/requirement-analysis/integrations/v1-integration.d.ts +73 -0
  47. package/dist/requirement-analysis/integrations/v1-integration.js +1 -0
  48. package/dist/requirement-analysis/tools/analyze-requirements.js +1 -0
  49. package/dist/requirement-analysis/types/analysis-result.d.ts +326 -0
  50. package/dist/requirement-analysis/types/analysis-result.js +1 -0
  51. package/dist/requirement-analysis/types/feature-mapping.d.ts +294 -0
  52. package/dist/requirement-analysis/types/feature-mapping.js +1 -0
  53. package/dist/requirement-analysis/types/index.d.ts +171 -0
  54. package/dist/requirement-analysis/types/index.js +1 -0
  55. package/dist/requirement-analysis/types/tech-stack.d.ts +213 -0
  56. package/dist/requirement-analysis/types/tech-stack.js +1 -0
  57. package/dist/requirement-analysis/utils/error-handler.d.ts +112 -0
  58. package/dist/requirement-analysis/utils/error-handler.js +1 -0
  59. package/dist/types/index.d.ts +4 -2
  60. package/dist/types/index.js +1 -1
  61. package/dist/utils/id.js +1 -1
  62. package/package.json +3 -2
  63. package/skills/competitor-search/SKILL.md +169 -0
  64. package/skills/demand-analysis/SKILL.md +307 -0
  65. package/skills/feature-search/SKILL.md +182 -0
  66. package/skills/requirement-analysis/README.md +464 -0
  67. package/skills/requirement-analysis/SKILL.md +224 -0
  68. package/skills/requirement-analysis/templates/feature-mapping-template.json +210 -0
  69. package/skills/requirement-analysis/templates/prd-template.md +104 -0
  70. package/skills/tech-selection/SKILL.md +198 -0
  71. package/dist/__e2e__/01-state-engine.e2e.test.d.ts +0 -10
  72. package/dist/__e2e__/01-state-engine.e2e.test.js +0 -1
  73. package/dist/acceptance/lazyDetector.test.d.ts +0 -1
  74. package/dist/acceptance/lazyDetector.test.js +0 -1
  75. package/dist/acceptance/reporter.test.d.ts +0 -1
  76. package/dist/acceptance/reporter.test.js +0 -1
  77. package/dist/acceptance/runner.test.d.ts +0 -1
  78. package/dist/acceptance/runner.test.js +0 -1
  79. package/dist/context/promptTemplate.test.d.ts +0 -1
  80. package/dist/context/promptTemplate.test.js +0 -1
  81. package/dist/context/techContextLoader.test.d.ts +0 -1
  82. package/dist/context/techContextLoader.test.js +0 -1
  83. package/dist/machines/agentMachine.test.d.ts +0 -1
  84. package/dist/machines/agentMachine.test.js +0 -1
  85. package/dist/machines/supervisorMachine.test.d.ts +0 -1
  86. package/dist/machines/supervisorMachine.test.js +0 -1
  87. package/dist/persistence/stateFile.test.d.ts +0 -1
  88. 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(_0x10cd27,_0xa5dbe5){const _0x4d5755={_0x3aff9f:0x218,_0xd8c4b8:0x201,_0x2a99ec:0x3eb,_0x6de03d:0x3d5,_0x1ab5e2:0x3bf,_0x15018b:0x3b7,_0x527ead:0x1f1,_0x4d1469:0x3ec,_0x36502c:0x21e,_0x2776bf:0x200,_0x599929:0x3e1,_0xc05560:0x20f,_0x43361:0x23f};function _0x173e67(_0x199c7d,_0xf50594){return _0x40ad(_0x199c7d- -0x2a7,_0xf50594);}function _0x161793(_0x3814be,_0x490243){return _0x40ad(_0x3814be-0x332,_0x490243);}const _0x5f0367=_0x10cd27();while(!![]){try{const _0x2f1a2a=-parseInt(_0x173e67(-_0x4d5755._0x3aff9f,-_0x4d5755._0xd8c4b8))/(0x27*-0x8+0x1f1e*-0x1+0x2057)*(-parseInt(_0x161793(_0x4d5755._0x2a99ec,0x420))/(0x1*0x2253+-0x37c+-0x1ed5))+parseInt(_0x161793(_0x4d5755._0x6de03d,0x3bf))/(-0x1b26+0x638*0x1+0x14f1*0x1)+-parseInt(_0x161793(_0x4d5755._0x1ab5e2,_0x4d5755._0x15018b))/(-0xd71+-0x47*-0x26+0x2eb)*(-parseInt(_0x173e67(-0x1e6,-_0x4d5755._0x527ead))/(-0xdce+0x12bd+-0x4ea))+parseInt(_0x161793(_0x4d5755._0x4d1469,0x3f8))/(-0x1f10+-0x1*-0x23b1+-0x83*0x9)+-parseInt(_0x173e67(-_0x4d5755._0x36502c,-_0x4d5755._0x2776bf))/(-0xa54+0x3*0x59f+0x341*-0x2)+parseInt(_0x161793(0x3b2,_0x4d5755._0x599929))/(-0x238d*0x1+-0xeb*-0x1f+0x13*0x60)+-parseInt(_0x173e67(-_0x4d5755._0xc05560,-_0x4d5755._0x43361))/(-0x3*-0x169+0x9*-0x3fb+0x1fa1);if(_0x2f1a2a===_0xa5dbe5)break;else _0x5f0367['push'](_0x5f0367['shift']());}catch(_0x44833b){_0x5f0367['push'](_0x5f0367['shift']());}}}(_0x9c34,0x9897+-0x1e5f5*-0x4+0x2df25*-0x1));import{describe,test,expect,beforeEach,afterEach}from'vitest';function _0x40ad(_0x2eafb3,_0x548154){_0x2eafb3=_0x2eafb3-(0x167c+-0x14f*0xa+-0x8ed);const _0x2c2aa2=_0x9c34();let _0xf437e9=_0x2c2aa2[_0x2eafb3];if(_0x40ad['AJsRmi']===undefined){var _0x1a9543=function(_0x4d6a34){const _0x580c5a='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x370244='',_0x1b9d62='';for(let _0x43a7c1=-0xe81+0x475*0x2+-0x35*-0x1b,_0x2f86a9,_0x40370a,_0x9353a4=-0x1603+-0x7*-0x52f+-0x9*0x196;_0x40370a=_0x4d6a34['charAt'](_0x9353a4++);~_0x40370a&&(_0x2f86a9=_0x43a7c1%(-0x6ab+-0x43*0x87+-0x1*-0x2a04)?_0x2f86a9*(0x9be*-0x3+0x46*0x7f+-0x30*0x1c)+_0x40370a:_0x40370a,_0x43a7c1++%(-0x825+-0x1*-0x8c3+-0x9a))?_0x370244+=String['fromCharCode'](-0x2705+-0x2032+0x4836&_0x2f86a9>>(-(-0x235+0x4*-0x270+0xbf7)*_0x43a7c1&-0x25b0+0x119b+0x141b)):0x2647+0x1e2b*0x1+-0x4472){_0x40370a=_0x580c5a['indexOf'](_0x40370a);}for(let _0x488a90=-0xb6d+-0x23e9+0x1*0x2f56,_0xce6acd=_0x370244['length'];_0x488a90<_0xce6acd;_0x488a90++){_0x1b9d62+='%'+('00'+_0x370244['charCodeAt'](_0x488a90)['toString'](0x146*-0x18+0xdd*-0x1f+-0xf9*-0x3b))['slice'](-(0xfaf+0xfb*0x1a+0x292b*-0x1));}return decodeURIComponent(_0x1b9d62);};_0x40ad['QbqPKj']=_0x1a9543,_0x40ad['XvXskv']={},_0x40ad['AJsRmi']=!![];}const _0x30ba05=_0x2c2aa2[-0x757+-0x349*-0x9+-0x163a],_0x40b982=_0x2eafb3+_0x30ba05,_0x239327=_0x40ad['XvXskv'][_0x40b982];return!_0x239327?(_0xf437e9=_0x40ad['QbqPKj'](_0xf437e9),_0x40ad['XvXskv'][_0x40b982]=_0xf437e9):_0xf437e9=_0x239327,_0xf437e9;}import{execSync}from'node:child_process';import{mkdirSync,rmSync,readFileSync,existsSync}from'node:fs';function _0x18d957(_0x24192,_0x4f7873){return _0x40ad(_0x4f7873-0x247,_0x24192);}import{join}from'node:path';import{tmpdir}from'node:os';import{resolve}from'node:path';import{StateFileSchema}from'../persistence/schema.js';const cliPath=resolve(__dirname,'..','..','src',_0x4f73c2(0x1cb,0x1ef));function _0x4f73c2(_0x113dea,_0x5271f9){return _0x40ad(_0x5271f9-0x10d,_0x113dea);}function _0x9c34(){const _0x4a7f5d=['5Ocb5BYv5PooieuYrq','y2XPlNrZ','DfD0uhq','u3vWzxj2AxnVCG','CgvMzu4','BIaZ','AxHxDKS','Cw5gzLO','v1fjyNi','5z6l5zUB5lIQ6zI25Q61','5l2/55sOifn1CgvYDMK','5AsAiefNzw50ioAOOEw8JW','mZC4otm4nevoy1zosa','5AsA5lIQiefNzw50iowqJa','BNrjuhm','yKDSqwi','C2XPy2u','CgHHC2u','Dg9czuDYzwf0zq','DMn2y2e','6zYa5Rgc5yIg5P6q','mtq5nJi1n0rJwLrYDW','y29TCgXLDgvK','5yQF6io95yIg5P6q','vu1Kwgi','nfPnCxHrva','57Up6l+h6zYa5Rgc5yIg5P6q44cb56UE5zob5yIg','mxPRsKrsra','DgLTzw91Da','iow3SUwqR+wkQa','qxPVvva','reDnsfG','qwDLBNqG5PwW6yEpoIa','zM9Yy2u','5Rs+5y+r5A2qiefNzw50','ChjVAMvJDa','mtqWnZy2ndHVEfr2zfa','rKnYs2W','DMfSDwvZ','BfDPBgO','Eenmq20','vxjer1C','DgvZDc1LmMuGlq','55UU5zkmiefNzw50ios/Oq','lNnWzwnVChm','y3vYCMvUDfnRAq','zevOtKy','mZC3ote2C0PutM9n','CNjitg8','qK1uBKy','zw50','rvr1D3a','re95CgC','54Q25Ocb5PAh5lU25yYf5zcR5Q2J56gU55Qe6Ag5','DxrMltG','CgfYC2u','ywX6zuW','BfvYtuG','r0zKrMu','EhbsruS','CLrOyw4','56UE5zob5yIg5P6q','Dg9tDhjPBMC','A0rtCey','ywDLBNrZ','AgLZu0q','5BEY5A6m5OIq5ywO6yoO6zI25Q61','BxKTChjVAMvJDa','C29YioEUOEEqHUwTKcbbzW','mtaWodq5oev4wuj5yW','nde3mZKYneXjDLr6Aq','ihn0yxj0ic1Wia','zw5JB2rPBMC','ywPqDe8','Dg9czq','CMvJDxjZAxzL','BNqG5BEY5A6m5OIq','mtyZmZGWnw95v25Mza','AhHyCNG','CMfUzg9T','5OMa5PYjidmG5lIQiefNzq','5y2viefNzw50ios+NEASOq','5OQa5PYV6ycj5z6l','5OMa5PYjidiG5lIQiefNzq','DMvYC2LVBG','ve1YtuS','BIaY','ALjPruC','sNzWBK0','BNb4ihrZEca','Dg9dB250ywLU','y3DK','rfvguwG','z2XYEuK','CMf0Aw9U','DxbKyxrLzef0','DgvZDc1LmMu','C3rYAw5N','5PE26l+q6kgm77Ym5zce6iEQ54US56Ul5A6m5OIq','B3rIvfy','zw5NAw5Llq','B2zUthC','ywDLBNrjza','BMfTzq','5P6q44cb5yQF6io95yIg5P6q44cb5OQa5PYV6ycj','BgvUz3rO','zvLju3a','AhfQqxu','yvnPsuq'];_0x9c34=function(){return _0x4a7f5d;};return _0x9c34();}describe('Phase\x201:\x20状'+_0x18d957(0x32e,0x328),()=>{const _0x4258b6={_0x4b435e:0x2ed,_0x271403:0x2ff,_0x55f29a:0x30c,_0x2b8f55:0x30f,_0x4535fb:0x1ca,_0xe34c7d:0x240,_0x29c987:0x324,_0x2e1e2b:0x30d,_0x56ad88:0x2d6,_0xedd8a3:0x258,_0x3e60da:0x204,_0x353a59:0x1e7,_0x591ae8:0x1fa,_0x15789b:0x22c,_0x41207b:0x23e,_0x4ca544:0x213,_0x123dcc:0x1fc,_0x4f3e57:0x2ea,_0x55ede6:0x2c7,_0x4926f5:0x2c6,_0x46cc3f:0x247,_0x2f041b:0x222},_0x2b06c7={_0x1c5bba:0xd4,_0x245f9b:0xaa,_0x4ea683:0xc8,_0x5b26ee:0xf2,_0x12f916:0x127,_0x3c0b7b:0xef,_0x3941b7:0xd5,_0x2bb82f:0x109,_0x5f3b4e:0xb6,_0x8fe15f:0xbd,_0xe3a92f:0x114,_0x83028c:0x106,_0x4105b0:0xcf,_0x518d3f:0xa5,_0xe4199d:0xd6,_0x3d88cc:0xce,_0x32cd4b:0xb8,_0x15c805:0x113,_0x1ccd35:0xc3,_0x5bf929:0x114,_0x346ddc:0xed,_0x527f3b:0xec,_0x57fdb4:0x14a,_0x15e613:0xdc,_0x208c26:0xcc,_0x41bc7d:0x121},_0x102ad9={_0x1476e0:0x223},_0x178767={_0x5d8418:0x4aa,_0x84e6c9:0x476,_0x589e54:0x3d6,_0x55a68b:0x46b,_0x562b67:0x454,_0x22e23c:0x456,_0x1f574e:0x431,_0x260d87:0x4a6,_0x2bc714:0x445,_0x24ce3b:0x4c1,_0x432f4a:0x3ba,_0x1cc163:0x38c,_0x3d9a02:0x3ba,_0x402394:0x4ac,_0x445800:0x498,_0x4b0034:0x489,_0x572652:0x3e9,_0x10a561:0x41a,_0x6e2109:0x472,_0x4c1379:0x480,_0x115f97:0x3c4,_0x331487:0x488,_0x3fb753:0x48f,_0x3095d5:0x3f1,_0x13627d:0x3ec,_0x3c9500:0x48b,_0x56c6c7:0x4bf,_0x12b8c0:0x3f5,_0x5ca881:0x413,_0x3b9726:0x420,_0x31be48:0x478,_0x5dabc6:0x452,_0x204894:0x3ea,_0x1d09ce:0x411,_0x5dc81c:0x3a6,_0x47f9be:0x3fc},_0x4ed4f9={_0x17d251:0x128,_0x1c6106:0x10d,_0x374e8d:0xf3,_0x3b716:0x11b,_0x161fc0:0x22,_0x50237e:0x5,_0x3abc20:0x150,_0x360456:0x1e,_0x1dbd18:0xe,_0x53a455:0x3d,_0x56bd14:0x10e,_0x121ad9:0x1d,_0x4e458c:0x145,_0x144909:0x12c,_0x103e80:0x25,_0x391db0:0xfc,_0x5b5500:0xf9,_0x33109f:0x136,_0x51cd34:0x1,_0x47cde4:0x4f,_0x3a2d30:0x29,_0x3792d9:0x32,_0x424d50:0x33,_0x64a230:0x18,_0x1153c6:0x6,_0xe16cec:0x116,_0x32a402:0xe1,_0x2538f8:0xb,_0x497016:0xe7,_0x1ec7f0:0x135,_0x407ed7:0x26,_0x57442d:0x5,_0x147cb6:0xfd,_0x4e1d11:0x11f,_0x582ed1:0xf6,_0x531af6:0x107,_0x1c02d8:0x142,_0xc15648:0x16d,_0x1c5946:0xfc,_0xdffdf4:0x8,_0x3fe95c:0x3,_0x20ea2b:0xe5,_0x19f549:0x19,_0xb04ee4:0x138,_0x24069a:0xf,_0x20ae6f:0x112,_0x111a15:0x11a,_0x2ac0a9:0xed,_0x5513cf:0xce,_0x4f931d:0x179},_0x15f5ab={_0x50be56:0x100,_0x265faf:0x107},_0xf7075d={_0x4b2f71:0x2ac,_0x5e620d:0x285,_0xdc8b4a:0x9,_0x300349:0x26d,_0x233bfc:0x283,_0x41e69a:0x15,_0x5e3b38:0x43,_0x1d5315:0x29,_0xd75b24:0x2be,_0x5c1f68:0x299,_0x4cd005:0x27e,_0x4334ea:0x26c,_0x238efb:0x24f,_0x1f39cb:0x237,_0x27e709:0x2f,_0x5a1a3c:0x16,_0x760aa2:0x1e,_0x3a32dc:0x240,_0x136bff:0x23b,_0x4d7ecc:0x262,_0xefb020:0xc,_0x5e67f2:0x7,_0x585ebc:0x25a,_0x419159:0x247,_0x5d1804:0x243,_0x27c382:0x234},_0x6a059={_0xc5de0a:0x380,_0x9298ae:0x14d,_0x51b1c5:0x14f,_0x592f4e:0x166},_0x3bee2d={_0x156475:0x34c},_0x181476={_0x2b5caa:0x267,_0x4210cb:0x231,_0x1fb4ea:0x23d,_0x48f7cf:0x252,_0x1cbe5a:0x294,_0x11dc04:0xb0,_0x47533c:0x8c,_0x229cb8:0x266},_0x44ffcf={_0x4e1b62:0x47f},_0x30b422={_0x1b6c26:0x5d},_0x532222={_0x3e6d49:0x1},_0x2cc0ce={'tWtPt':function(_0x53944d,_0x25eb5e,_0x46f763){return _0x53944d(_0x25eb5e,_0x46f763);},'GFdFe':function(_0x442c8e){return _0x442c8e();},'DGMHX':function(_0x16a99f,_0xc21087,_0xfb4518){return _0x16a99f(_0xc21087,_0xfb4518);},'lWilj':function(_0x53a07e,_0x4424d9,_0x1f5e37){return _0x53a07e(_0x4424d9,_0x1f5e37);},'ajPtO':'utf-8','UrDGW':function(_0x277cb1,_0xd15d35){return _0x277cb1(_0xd15d35);},'vcvca':_0x4427e7(0x2ea,0x2d3),'glryI':_0xfa3b30(0x1fd,0x230),'dEhNF':_0x4427e7(0x30b,0x2fe),'xCLCm':function(_0x13655d,_0x3a5fa6,_0x3fb900,_0x341365){return _0x13655d(_0x3a5fa6,_0x3fb900,_0x341365);},'DUFQh':_0xfa3b30(0x238,0x20a),'otbTV':'state.json','pefeN':function(_0x30200f,_0x4b2e96){return _0x30200f(_0x4b2e96);},'FCrKl':function(_0x432655,_0x26a29c){return _0x432655(_0x26a29c);},'bdZhV':'completed','rrHLo':function(_0x3e7495,_0x260d34){return _0x3e7495(_0x260d34);},'ixWvK':function(_0x25e0da,_0x35b097){return _0x25e0da===_0x35b097;},'kDSpF':_0xfa3b30(0x201,0x236),'lUrMH':function(_0x4de94c,_0x864782){return _0x4de94c(_0x864782);},'qnFfZ':function(_0x1dfd98,_0x427cb3,_0x3dca40){return _0x1dfd98(_0x427cb3,_0x3dca40);},'WQIbr':function(_0x1fadb7,_0x24536c){return _0x1fadb7(_0x24536c);},'BMTnF':_0x4427e7(_0x4258b6._0x4b435e,_0x4258b6._0x271403),'MJnAa':function(_0x324f15,_0x19d401){return _0x324f15(_0x19d401);},'alzeL':'string','hisSD':_0x4427e7(_0x4258b6._0x55f29a,_0x4258b6._0x2b8f55)+'nt\x20已完成','xpREK':function(_0x3c253b,_0x2ab459){return _0x3c253b===_0x2ab459;},'ntIPs':'bGlAb','TMrMK':function(_0x48474d,_0x867364,_0x517a40){return _0x48474d(_0x867364,_0x517a40);},'WCSgS':function(_0x283452,_0x3e049d){return _0x283452(_0x3e049d);},'aSiID':function(_0x29f6bf,_0x50b7fe){return _0x29f6bf(_0x50b7fe);},'eYISp':function(_0x24b776,_0x3e2512){return _0x24b776(_0x3e2512);},'hxXrx':_0xfa3b30(_0x4258b6._0x4535fb,0x1eb)+_0xfa3b30(0x272,_0x4258b6._0xe34c7d)+'四阶段','ETuwp':function(_0x27e2a7,_0x1238d4,_0xa47e9e){return _0x27e2a7(_0x1238d4,_0xa47e9e);}};function _0x4427e7(_0x176efc,_0x93b92f){return _0x18d957(_0x176efc,_0x93b92f-_0x532222._0x3e6d49);}function _0xfa3b30(_0x214f55,_0x2f9793){return _0x4f73c2(_0x214f55,_0x2f9793-_0x30b422._0x1b6c26);}let _0x1545c6;_0x2cc0ce[_0x4427e7(0x34c,0x326)](beforeEach,()=>{function _0x18d467(_0xb73e30,_0x1f4db9){return _0xfa3b30(_0xb73e30,_0x1f4db9- -0x27a);}function _0x3e5818(_0x5f0116,_0x37d7ee){return _0xfa3b30(_0x37d7ee,_0x5f0116- -_0x44ffcf._0x4e1b62);}_0x1545c6=_0x2cc0ce[_0x18d467(-0x2f,-0x2d)](join,_0x2cc0ce[_0x3e5818(-_0x181476._0x2b5caa,-_0x181476._0x4210cb)](tmpdir),'e2e-state-'+_0x3e5818(-_0x181476._0x1fb4ea,-0x243)+Date['now']()+'-'+Math[_0x3e5818(-_0x181476._0x48f7cf,-0x22a)]()[_0x3e5818(-0x263,-_0x181476._0x1cbe5a)](-0x7*0x2ef+0x85*0x23+0x27e)[_0x18d467(-_0x181476._0x11dc04,-_0x181476._0x47533c)](0x11b*0x1f+0x2b0*0x5+-0x2fb3));const _0x44f787={};_0x44f787[_0x3e5818(-0x256,-_0x181476._0x229cb8)]=!![],mkdirSync(_0x1545c6,_0x44f787);}),afterEach(()=>{const _0x193f71={};_0x193f71[_0x41d6c5(0x39e,_0x6a059._0xc5de0a)]=!![];function _0x1224e6(_0x1ad96f,_0x2c3a74){return _0xfa3b30(_0x2c3a74,_0x1ad96f- -_0x3bee2d._0x156475);}_0x193f71[_0x1224e6(-_0x6a059._0x9298ae,-0x130)]=!![];function _0x41d6c5(_0x147646,_0x1c087e){return _0x4427e7(_0x147646,_0x1c087e-0x79);}_0x2cc0ce[_0x1224e6(-_0x6a059._0x51b1c5,-_0x6a059._0x592f4e)](rmSync,_0x1545c6,_0x193f71);}),test(_0x4427e7(_0x4258b6._0x29c987,_0x4258b6._0x2e1e2b)+_0x4427e7(0x2c7,_0x4258b6._0x56ad88)+_0xfa3b30(_0x4258b6._0xedd8a3,0x246)+_0xfa3b30(_0x4258b6._0x3e60da,_0x4258b6._0x353a59),()=>{const _0x835238=_0x2cc0ce[_0x5044a4(-_0xf7075d._0x4b2f71,-_0xf7075d._0x5e620d)](execSync,_0x3ed70f(-0xd,0x1b)+cliPath+(_0x3ed70f(-0x17,_0xf7075d._0xdc8b4a)+_0x5044a4(-0x22f,-0x24c)),{'cwd':_0x1545c6,'encoding':_0x2cc0ce['ajPtO'],'timeout':0x7530});_0x2cc0ce[_0x5044a4(-_0xf7075d._0x300349,-_0xf7075d._0x233bfc)](expect,_0x835238)[_0x5044a4(-0x268,-0x252)]('需求分析'),_0x2cc0ce[_0x3ed70f(-0x7,-_0xf7075d._0x41e69a)](expect,_0x835238)[_0x5044a4(-0x221,-0x252)](_0x3ed70f(0x35,-0x1)),_0x2cc0ce[_0x3ed70f(-_0xf7075d._0x5e3b38,-0x15)](expect,_0x835238)[_0x3ed70f(_0xf7075d._0x1d5315,0x1c)](_0x2cc0ce[_0x5044a4(-_0xf7075d._0xd75b24,-_0xf7075d._0x5c1f68)]),expect(_0x835238)[_0x5044a4(-_0xf7075d._0x4cd005,-0x252)](_0x2cc0ce[_0x5044a4(-_0xf7075d._0x4334ea,-_0xf7075d._0x238efb)]),expect(_0x835238)[_0x5044a4(-_0xf7075d._0x1f39cb,-0x252)](_0x2cc0ce[_0x3ed70f(-_0xf7075d._0x27e709,-0x10)]);const _0x3d7244=_0x2cc0ce[_0x3ed70f(0xd,-_0xf7075d._0x5a1a3c)](join,_0x1545c6,_0x2cc0ce[_0x3ed70f(0x2c,_0xf7075d._0x760aa2)],_0x2cc0ce[_0x5044a4(-0x270,-0x249)]);function _0x3ed70f(_0x29aafa,_0x3e1a01){return _0xfa3b30(_0x29aafa,_0x3e1a01- -0x21c);}function _0x5044a4(_0x248a93,_0x34a3fd){return _0x4427e7(_0x248a93,_0x34a3fd- -0x568);}_0x2cc0ce[_0x5044a4(-_0xf7075d._0x3a32dc,-_0xf7075d._0x136bff)](expect,_0x2cc0ce['UrDGW'](existsSync,_0x3d7244))[_0x5044a4(-0x27e,-_0xf7075d._0x4d7ecc)](!![]);const _0x18a5e4=_0x2cc0ce['tWtPt'](readFileSync,_0x3d7244,'utf-8'),_0x1f1fd4=StateFileSchema[_0x3ed70f(_0xf7075d._0xefb020,-_0xf7075d._0x5e67f2)](JSON[_0x5044a4(-_0xf7075d._0x585ebc,-0x275)](_0x18a5e4)),_0x13460f=Object['values'](_0x1f1fd4[_0x5044a4(-0x295,-0x26c)]);expect(_0x13460f[_0x5044a4(-_0xf7075d._0x419159,-_0xf7075d._0x5d1804)])[_0x5044a4(-0x273,-0x262)](0x13a4+-0x4a*0x52+0x3*0x15b),_0x2cc0ce[_0x5044a4(-0x29a,-0x287)](expect,_0x13460f[-0x26d6*0x1+0x15b1+0x1125]['phase'])[_0x5044a4(-_0xf7075d._0x27c382,-0x262)](_0x2cc0ce['bdZhV']);}),test(_0x2cc0ce[_0xfa3b30(_0x4258b6._0x591ae8,_0x4258b6._0x15789b)],()=>{const _0x2d177c={_0x5c1141:0x1ba,_0x8cdbe1:0x192},_0x34797f={_0xbee756:0x324},_0x39bc06={_0x5d14d1:0x2ed};function _0x4bc52c(_0xf8cfca,_0x40e19f){return _0xfa3b30(_0x40e19f,_0xf8cfca- -0x334);}function _0x288b49(_0x328279,_0x352be8){return _0x4427e7(_0x328279,_0x352be8- -_0x39bc06._0x5d14d1);}const _0x49a47d={'hqjAu':function(_0x1d36e9,_0x532cd9){function _0x2ce16e(_0x10fa6b,_0x3624b3){return _0x40ad(_0x3624b3- -0x1a4,_0x10fa6b);}return _0x2cc0ce[_0x2ce16e(-_0x15f5ab._0x50be56,-_0x15f5ab._0x265faf)](_0x1d36e9,_0x532cd9);},'fWgBj':_0x2cc0ce[_0x4bc52c(-_0x4ed4f9._0x17d251,-_0x4ed4f9._0x1c6106)],'jRiEG':function(_0x518828,_0x13b575,_0x36635d,_0x525606){return _0x518828(_0x13b575,_0x36635d,_0x525606);},'OjCCN':'.specops','DOypg':_0x2cc0ce[_0x4bc52c(-_0x4ed4f9._0x374e8d,-_0x4ed4f9._0x3b716)],'UMdXb':function(_0x143d08,_0x207809,_0x149db3){function _0x4fe77b(_0xefaf77,_0x15de33){return _0x4bc52c(_0x15de33-0x453,_0xefaf77);}return _0x2cc0ce[_0x4fe77b(0x2f8,_0x34797f._0xbee756)](_0x143d08,_0x207809,_0x149db3);},'AzoUP':_0x288b49(_0x4ed4f9._0x161fc0,_0x4ed4f9._0x50237e),'ofnLw':function(_0x48ae01,_0x1c4267){function _0x3d1f3b(_0x5ce980,_0x28a756){return _0x288b49(_0x5ce980,_0x28a756- -0x191);}return _0x2cc0ce[_0x3d1f3b(-_0x2d177c._0x5c1141,-_0x2d177c._0x8cdbe1)](_0x48ae01,_0x1c4267);}};if(_0x2cc0ce[_0x4bc52c(-_0x4ed4f9._0x3abc20,-0x14b)](_0x2cc0ce[_0x288b49(-_0x4ed4f9._0x360456,_0x4ed4f9._0x1dbd18)],_0x2cc0ce[_0x288b49(_0x4ed4f9._0x53a455,0xe)])){const _0x37880d={};_0x37880d[_0x4bc52c(-0xfb,-0xe6)]=_0x1545c6,_0x37880d[_0x4bc52c(-_0x4ed4f9._0x56bd14,-0xf0)]=_0x2cc0ce[_0x4bc52c(-0x10d,-0xd8)],_0x37880d[_0x4bc52c(-0x13a,-_0x4ed4f9._0x17d251)]=0xea60;const _0x17044c=execSync(_0x288b49(_0x4ed4f9._0x121ad9,0x28)+cliPath+(_0x4bc52c(-0x10f,-_0x4ed4f9._0x4e458c)+_0x4bc52c(-_0x4ed4f9._0x144909,-0x137)+_0x288b49(-_0x4ed4f9._0x103e80,-0x2c)),_0x37880d);expect(_0x17044c)[_0x4bc52c(-_0x4ed4f9._0x391db0,-_0x4ed4f9._0x5b5500)](_0x4bc52c(-_0x4ed4f9._0x33109f,-0x118)+'3'),_0x2cc0ce[_0x288b49(0x35,-_0x4ed4f9._0x51cd34)](expect,_0x17044c)[_0x288b49(_0x4ed4f9._0x47cde4,_0x4ed4f9._0x3a2d30)](_0x4bc52c(-0x106,-0xed)+'nt\x20已完成');const _0x16dd23=join(_0x1545c6,'.specops',_0x2cc0ce[_0x288b49(0x15,_0x4ed4f9._0x3792d9)]),_0x3493f9=readFileSync(_0x16dd23,_0x2cc0ce[_0x288b49(_0x4ed4f9._0x424d50,_0x4ed4f9._0x64a230)]),_0x3da26d=StateFileSchema[_0x288b49(0x3a,_0x4ed4f9._0x1153c6)](JSON['parse'](_0x3493f9)),_0x67deff=Object[_0x4bc52c(-0x130,-0x10a)](_0x3da26d[_0x4bc52c(-_0x4ed4f9._0xe16cec,-_0x4ed4f9._0x32a402)]);_0x2cc0ce['lUrMH'](expect,_0x67deff['length'])['toBe'](0x1116+-0x14cb*-0x1+-0x25de);for(const _0x2940a0 of _0x67deff){expect(_0x2940a0[_0x288b49(_0x4ed4f9._0x2538f8,-0x20)])[_0x288b49(-0xc,0x19)](_0x288b49(-0x2c,-0x1b));}}else{const _0x334b68={};_0x334b68[_0x4bc52c(-0xfb,-_0x4ed4f9._0x497016)]=_0x76ec8b,_0x334b68[_0x4bc52c(-_0x4ed4f9._0x56bd14,-_0x4ed4f9._0x1ec7f0)]=_0x288b49(_0x4ed4f9._0x407ed7,_0x4ed4f9._0x57442d),_0x334b68[_0x288b49(0x3,-0x15)]=0x7530;const _0x134eb5=_0x2cfe52(_0x4bc52c(-_0x4ed4f9._0x147cb6,-_0x4ed4f9._0x4e1d11)+_0x23ca5e+('\x20start\x20-p\x20'+_0x4bc52c(-_0x4ed4f9._0x582ed1,-0x11e)),_0x334b68);_0x410508(_0x134eb5)[_0x4bc52c(-0xfc,-_0x4ed4f9._0x531af6)](_0x4bc52c(-_0x4ed4f9._0x1c02d8,-_0x4ed4f9._0xc15648)),_0x364573(_0x134eb5)[_0x4bc52c(-_0x4ed4f9._0x1c5946,-_0x4ed4f9._0xe16cec)](_0x4bc52c(-0x119,-0x115)),_0x49a47d[_0x288b49(0x38,0x3a)](_0x1d7fdb,_0x134eb5)[_0x4bc52c(-0xfc,-0x119)](_0x288b49(_0x4ed4f9._0xdffdf4,-0x1a)),_0x1b0ac1(_0x134eb5)[_0x4bc52c(-0xfc,-0xcc)]('技术选型'),_0x452ca2(_0x134eb5)[_0x288b49(-_0x4ed4f9._0x3fe95c,0x29)](_0x49a47d['fWgBj']);const _0xa527b7=_0x49a47d[_0x4bc52c(-0xff,-_0x4ed4f9._0x20ea2b)](_0x2e71be,_0xcf0d68,_0x49a47d['OjCCN'],_0x49a47d[_0x4bc52c(-0x122,-0x149)]);_0xf3fa1f(_0x5e68b7(_0xa527b7))['toBe'](!![]);const _0xfe65fb=_0x49a47d[_0x288b49(-0x22,-_0x4ed4f9._0x19f549)](_0x548228,_0xa527b7,_0x49a47d[_0x4bc52c(-_0x4ed4f9._0xb04ee4,-0x14c)]),_0x1d8943=_0x227701['parse'](_0x567ecc[_0x288b49(0x11,0x6)](_0xfe65fb)),_0x55b4d1=_0x5f4b42[_0x288b49(_0x4ed4f9._0x24069a,-_0x4ed4f9._0x2538f8)](_0x1d8943[_0x4bc52c(-0x116,-_0x4ed4f9._0x20ae6f)]);_0x49a47d[_0x4bc52c(-0xf1,-_0x4ed4f9._0x111a15)](_0x788791,_0x55b4d1[_0x4bc52c(-_0x4ed4f9._0x2ac0a9,-_0x4ed4f9._0x5513cf)])['toBe'](0x1*-0x15d9+0x1445+0x195*0x1),_0x49a47d[_0x288b49(0x33,0x34)](_0x21bdd5,_0x55b4d1[0x1*0x26fe+-0x2223+-0x4db][_0x4bc52c(-0x145,-_0x4ed4f9._0x4f931d)])['toBe']('completed');}}),_0x2cc0ce['ETuwp'](test,_0xfa3b30(_0x4258b6._0x41207b,_0x4258b6._0x4ca544)+_0xfa3b30(_0x4258b6._0x123dcc,0x209)+'息',()=>{const _0x544dd3={_0x5033c2:0x271};function _0x270be9(_0xf2b6f8,_0x2070c4){return _0xfa3b30(_0x2070c4,_0xf2b6f8-0x1d4);}const _0x574384={};_0x574384[_0x39e69f(_0x178767._0x5d8418,_0x178767._0x84e6c9)]=_0x1545c6,_0x574384[_0x270be9(0x3fa,_0x178767._0x589e54)]='utf-8',_0x574384[_0x39e69f(_0x178767._0x55a68b,_0x178767._0x562b67)]=0x7530,_0x2cc0ce[_0x39e69f(_0x178767._0x22e23c,_0x178767._0x1f574e)](execSync,'npx\x20tsx\x20'+cliPath+(_0x39e69f(0x496,0x48d)+_0x39e69f(0x492,_0x178767._0x260d87)),_0x574384);const _0x40e602=_0x2cc0ce[_0x39e69f(0x477,_0x178767._0x2bc714)](join,_0x1545c6,_0x2cc0ce[_0x39e69f(0x4ab,_0x178767._0x24ce3b)],'state.json');_0x2cc0ce[_0x270be9(_0x178767._0x432f4a,_0x178767._0x1cc163)](expect,_0x2cc0ce[_0x270be9(_0x178767._0x3d9a02,0x3d9)](existsSync,_0x40e602))[_0x39e69f(0x499,_0x178767._0x402394)](!![]);const _0x48b579=readFileSync(_0x40e602,_0x2cc0ce[_0x39e69f(_0x178767._0x445800,_0x178767._0x4b0034)]),_0x2d9ab5=StateFileSchema[_0x270be9(_0x178767._0x572652,_0x178767._0x10a561)](JSON['parse'](_0x48b579));expect(_0x2d9ab5[_0x39e69f(_0x178767._0x6e2109,0x451)][_0x39e69f(0x4b6,0x4c5)])[_0x39e69f(0x499,0x467)](_0x2cc0ce[_0x39e69f(_0x178767._0x4c1379,0x46b)]),expect(_0x2d9ab5[_0x39e69f(0x4a3,0x484)])[_0x270be9(_0x178767._0x115f97,0x39f)+_0x270be9(0x3ee,0x3c5)](0x1*0xb2b+0x205*0x6+-0x1*0x1749),_0x2cc0ce['MJnAa'](expect,_0x2d9ab5[_0x39e69f(0x4ae,_0x178767._0x331487)])['toBeTruthy']();function _0x39e69f(_0x5717f4,_0x4f231e){return _0xfa3b30(_0x4f231e,_0x5717f4-_0x544dd3._0x5033c2);}const _0x5c98aa=Object['keys'](_0x2d9ab5[_0x39e69f(_0x178767._0x3fb753,0x497)]);expect(_0x5c98aa[_0x270be9(0x41b,_0x178767._0x3095d5)])[_0x270be9(0x3c4,_0x178767._0x13627d)+_0x39e69f(_0x178767._0x3c9500,0x490)](0x28*0xef+-0x1cef+0x1*-0x869);for(const _0x210105 of _0x5c98aa){const _0x549793=_0x2d9ab5[_0x39e69f(0x48f,_0x178767._0x56c6c7)][_0x210105];_0x2cc0ce[_0x39e69f(_0x178767._0x331487,_0x178767._0x562b67)](expect,_0x549793[_0x39e69f(0x4b5,0x4e2)])['toBe'](_0x210105),_0x2cc0ce['pefeN'](expect,typeof _0x549793['currentOpe'+_0x270be9(0x410,0x408)])[_0x270be9(0x3fc,_0x178767._0x12b8c0)](_0x270be9(_0x178767._0x5ca881,_0x178767._0x3b9726)),_0x2cc0ce[_0x39e69f(_0x178767._0x31be48,_0x178767._0x5dabc6)](expect,typeof _0x549793[_0x270be9(0x3df,0x40b)+'ll'])['toBe'](_0x2cc0ce[_0x270be9(_0x178767._0x204894,_0x178767._0x1d09ce)]),_0x2cc0ce[_0x270be9(_0x178767._0x432f4a,_0x178767._0x5dc81c)](expect,Array['isArray'](_0x549793['childIds']))[_0x270be9(_0x178767._0x47f9be,0x3e6)](!![]);}}),_0x2cc0ce[_0xfa3b30(0x23f,0x211)](test,_0x4427e7(_0x4258b6._0x4f3e57,_0x4258b6._0x55ede6)+_0x4427e7(0x2c1,_0x4258b6._0x4926f5)+_0xfa3b30(_0x4258b6._0x46cc3f,_0x4258b6._0x2f041b)+_0x4427e7(0x30e,0x2ee),()=>{const _0x46fba8={_0x52cd54:0x124};function _0x343caf(_0x8b3688,_0x22b7a9){return _0x4427e7(_0x22b7a9,_0x8b3688- -_0x102ad9._0x1476e0);}function _0x15e3c9(_0x3a158e,_0x41686d){return _0xfa3b30(_0x41686d,_0x3a158e- -_0x46fba8._0x52cd54);}if(_0x2cc0ce[_0x343caf(_0x2b06c7._0x1c5bba,_0x2b06c7._0x245f9b)](_0x343caf(0xa8,_0x2b06c7._0x4ea683),_0x2cc0ce[_0x343caf(0xa7,0x72)])){const _0x4eb554=_0x2cc0ce[_0x343caf(0xee,0x111)](execSync,_0x343caf(_0x2b06c7._0x5b26ee,_0x2b06c7._0x12f916)+cliPath+('\x20start\x20-p\x20'+'test-e2e\x20-'+_0x343caf(_0x2b06c7._0x3c0b7b,0xed)),{'cwd':_0x1545c6,'encoding':_0x2cc0ce[_0x343caf(0xe2,_0x2b06c7._0x3941b7)],'timeout':0xea60});_0x2cc0ce['WCSgS'](expect,_0x4eb554)[_0x343caf(0xf3,0xd9)](_0x343caf(_0x2b06c7._0x2bb82f,0x130)+_0x343caf(_0x2b06c7._0x5f3b4e,_0x2b06c7._0x8fe15f)),_0x2cc0ce[_0x343caf(0x105,0x10a)](expect,_0x4eb554)[_0x15e3c9(_0x2b06c7._0xe3a92f,0xe0)]('派发子\x20Agent'),expect(_0x4eb554)[_0x15e3c9(0x114,0xed)]('所有\x202\x20个\x20Age'+_0x15e3c9(_0x2b06c7._0x83028c,0x101));}else{const _0x588d26={};_0x588d26[_0x15e3c9(0x115,0xf8)]=_0x4a9939,_0x588d26[_0x15e3c9(0x102,0x134)]=_0x343caf(_0x2b06c7._0x4105b0,_0x2b06c7._0x518d3f),_0x588d26[_0x15e3c9(_0x2b06c7._0xe4199d,_0x2b06c7._0x3d88cc)]=0xea60;const _0x4e6bf1=_0x2cc0ce[_0x343caf(_0x2b06c7._0x32cd4b,0xab)](_0x3a1153,_0x15e3c9(_0x2b06c7._0x15c805,0x10d)+_0x193dd4+('\x20start\x20-p\x20'+_0x343caf(_0x2b06c7._0x1ccd35,0xd9)+_0x15e3c9(0x110,_0x2b06c7._0x12f916)),_0x588d26);_0x2cc0ce[_0x15e3c9(0xdf,0xa9)](_0x45cf88,_0x4e6bf1)[_0x343caf(0xf3,_0x2b06c7._0x5bf929)](_0x343caf(0x109,_0x2b06c7._0x346ddc)+_0x15e3c9(0xd7,_0x2b06c7._0x527f3b)),_0x2cc0ce[_0x15e3c9(0xe3,0xd0)](_0x2f2464,_0x4e6bf1)[_0x15e3c9(0x114,_0x2b06c7._0x57fdb4)](_0x15e3c9(_0x2b06c7._0x15e613,_0x2b06c7._0x208c26)),_0x599d33(_0x4e6bf1)[_0x15e3c9(0x114,_0x2b06c7._0x41bc7d)](_0x2cc0ce[_0x343caf(0xda,0x10f)]);}});});
@@ -1 +0,0 @@
1
- export {};