Coverage for aceflow_mcp_server/resources.py: 92%
64 statements
« prev ^ index » next coverage.py v7.10.1, created at 2025-08-02 16:56 +0800
« prev ^ index » next coverage.py v7.10.1, created at 2025-08-02 16:56 +0800
1"""AceFlow MCP Resources implementation."""
3try:
4 from fastmcp.resources import resource
5except ImportError:
6 # Mock implementation for testing
7 def resource(uri):
8 def decorator(func):
9 return func
10 return decorator
11from typing import Dict, Any
12import json
13from pathlib import Path
14import os
17class AceFlowResources:
18 """AceFlow MCP Resources collection."""
20 def __init__(self):
21 """Initialize resources."""
22 pass
24 def _get_current_directory(self) -> Path:
25 """Get current working directory."""
26 return Path.cwd()
28 def _find_aceflow_project_root(self, start_path: Path = None) -> Path:
29 """Find the AceFlow project root directory."""
30 if start_path is None:
31 start_path = self._get_current_directory()
33 current = start_path.resolve()
35 # Look for AceFlow indicators
36 while current != current.parent:
37 if (current / ".aceflow").exists() or (current / ".clinerules").exists():
38 return current
39 current = current.parent
41 # If not found, return current directory
42 return start_path
44 @resource("aceflow://project/state")
45 def project_state(self) -> str:
46 """Get current project state."""
47 try:
48 project_root = self._find_aceflow_project_root()
49 state_file = project_root / ".aceflow" / "current_state.json"
51 if state_file.exists():
52 with open(state_file, 'r', encoding='utf-8') as f:
53 state = json.load(f)
54 return json.dumps(state, indent=2, ensure_ascii=False)
55 else:
56 # Return default state if no project found
57 default_state = {
58 "project": {
59 "name": "unknown",
60 "mode": "UNKNOWN",
61 "status": "not_initialized"
62 },
63 "flow": {
64 "current_stage": "unknown",
65 "completed_stages": [],
66 "progress_percentage": 0
67 },
68 "metadata": {
69 "message": "No AceFlow project found in current directory",
70 "suggestion": "Use aceflow_init tool to initialize a project"
71 }
72 }
73 return json.dumps(default_state, indent=2, ensure_ascii=False)
75 except Exception as e:
76 error_state = {
77 "error": str(e),
78 "message": "Failed to get project state",
79 "suggestion": "Check if you're in an AceFlow project directory"
80 }
81 return json.dumps(error_state, indent=2, ensure_ascii=False)
83 @resource("aceflow://workflow/config")
84 def workflow_config(self) -> str:
85 """Get workflow configuration."""
86 try:
87 project_root = self._find_aceflow_project_root()
88 template_file = project_root / ".aceflow" / "template.yaml"
90 if template_file.exists():
91 with open(template_file, 'r', encoding='utf-8') as f:
92 config_content = f.read()
94 # Also include some parsed information
95 config_info = {
96 "template_file": str(template_file),
97 "project_root": str(project_root),
98 "template_content": config_content,
99 "status": "found"
100 }
101 return json.dumps(config_info, indent=2, ensure_ascii=False)
102 else:
103 default_config = {
104 "message": "No workflow configuration found",
105 "template_file": str(project_root / ".aceflow" / "template.yaml"),
106 "status": "not_found",
107 "suggestion": "Initialize project with aceflow_init tool"
108 }
109 return json.dumps(default_config, indent=2, ensure_ascii=False)
111 except Exception as e:
112 error_config = {
113 "error": str(e),
114 "message": "Failed to get workflow config",
115 "suggestion": "Check if you're in an AceFlow project directory"
116 }
117 return json.dumps(error_config, indent=2, ensure_ascii=False)
119 @resource("aceflow://stage/guide/{stage}")
120 def stage_guide(self, stage: str) -> str:
121 """Get stage-specific guidance."""
122 try:
123 # Stage guides based on common AceFlow stages
124 stage_guides = {
125 "user_stories": """# 用户故事分析阶段指南
127## 目标
128分析和定义用户需求,创建清晰的用户故事。
130## 主要任务
1311. **用户角色识别**
132 - 确定主要用户群体
133 - 分析用户特征和需求
134 - 创建用户画像
1362. **用户故事编写**
137 - 使用标准格式:作为[用户角色],我希望[功能],以便[价值]
138 - 确保故事具体、可测试、有价值
139 - 添加验收标准
1413. **优先级排序**
142 - 评估商业价值
143 - 考虑技术实现难度
144 - 确定开发顺序
146## 输出要求
147- 用户故事列表 (aceflow_result/user_stories.md)
148- 用户画像文档 (aceflow_result/user_personas.md)
149- 需求优先级矩阵 (aceflow_result/priority_matrix.md)
151## 质量标准
152- 每个用户故事包含明确的验收标准
153- 故事之间逻辑清晰,无重叠
154- 覆盖主要业务场景
156## 下一阶段
157完成后进入"任务分解"阶段,将用户故事转化为具体开发任务。""",
159 "task_breakdown": """# 任务分解阶段指南
161## 目标
162将用户故事分解为可执行的开发任务。
164## 主要任务
1651. **技术分析**
166 - 确定技术实现方案
167 - 识别技术依赖和风险
168 - 评估开发工作量
1702. **任务创建**
171 - 将用户故事分解为具体任务
172 - 确保任务颗粒度适中(1-3天完成)
173 - 定义任务之间的依赖关系
1753. **资源规划**
176 - 评估所需技能和人力
177 - 安排开发时间线
178 - 识别潜在瓶颈
180## 输出要求
181- 任务分解文档 (aceflow_result/task_breakdown.md)
182- 技术实现方案 (aceflow_result/technical_approach.md)
183- 开发计划 (aceflow_result/development_plan.md)
185## 质量标准
186- 任务定义明确,可量化完成
187- 工作量估算合理
188- 依赖关系清晰
190## 下一阶段
191完成后进入"测试用例设计"阶段。""",
193 "test_design": """# 测试用例设计阶段指南
195## 目标
196设计全面的测试用例,确保质量保证。
198## 主要任务
1991. **测试策略制定**
200 - 确定测试类型和范围
201 - 制定测试环境要求
202 - 定义通过标准
2042. **测试用例编写**
205 - 基于用户故事创建功能测试用例
206 - 设计边界条件和异常场景测试
207 - 编写自动化测试脚本
2093. **测试数据准备**
210 - 准备测试数据集
211 - 设计数据验证方案
212 - 确保数据安全性
214## 输出要求
215- 测试计划 (aceflow_result/test_plan.md)
216- 测试用例文档 (aceflow_result/test_cases.md)
217- 自动化测试脚本 (aceflow_result/automated_tests/)
219## 质量标准
220- 测试覆盖率达到设计要求
221- 测试用例具体可执行
222- 自动化程度符合项目需求
224## 下一阶段
225完成后进入"功能实现"阶段。""",
227 "implementation": """# 功能实现阶段指南
229## 目标
230根据设计和任务分解实现核心功能。
232## 主要任务
2331. **代码开发**
234 - 按照任务分解进行编码
235 - 遵循代码规范和最佳实践
236 - 实现核心业务逻辑
2382. **代码质量**
239 - 编写清晰的注释和文档
240 - 进行代码自检和重构
241 - 确保代码可维护性
2433. **集成开发**
244 - 模块间接口对接
245 - 处理系统集成问题
246 - 确保整体功能一致性
248## 输出要求
249- 源代码 (aceflow_result/src/)
250- 技术文档 (aceflow_result/technical_docs/)
251- API文档 (aceflow_result/api_docs/)
253## 质量标准
254- 代码符合规范,注释完整
255- 核心功能正常工作
256- 模块间接口稳定
258## 下一阶段
259完成后进入"单元测试"阶段。""",
261 "unit_test": """# 单元测试阶段指南
263## 目标
264对实现的功能进行单元测试验证。
266## 主要任务
2671. **测试执行**
268 - 运行设计的测试用例
269 - 执行自动化测试脚本
270 - 验证功能正确性
2722. **问题修复**
273 - 记录和分析测试失败
274 - 修复发现的缺陷
275 - 重新测试验证修复
2773. **覆盖率分析**
278 - 统计测试覆盖率
279 - 补充遗漏的测试场景
280 - 确保质量标准达成
282## 输出要求
283- 测试执行报告 (aceflow_result/test_report.md)
284- 缺陷修复记录 (aceflow_result/bug_fixes.md)
285- 测试覆盖率报告 (aceflow_result/coverage_report.md)
287## 质量标准
288- 主要功能测试通过
289- 测试覆盖率达到要求
290- 关键缺陷已修复
292## 下一阶段
293完成后进入"集成测试"阶段。""",
295 "integration_test": """# 集成测试阶段指南
297## 目标
298验证系统各部分的集成和整体功能。
300## 主要任务
3011. **系统集成**
302 - 验证模块间集成
303 - 测试端到端流程
304 - 检查数据流转
3062. **环境测试**
307 - 在目标环境中测试
308 - 验证部署配置
309 - 检查性能表现
3113. **用户验收**
312 - 基于用户故事验收
313 - 收集用户反馈
314 - 确认业务价值实现
316## 输出要求
317- 集成测试报告 (aceflow_result/integration_report.md)
318- 性能测试结果 (aceflow_result/performance_report.md)
319- 用户验收记录 (aceflow_result/acceptance_record.md)
321## 质量标准
322- 集成功能正常工作
323- 性能指标达到要求
324- 用户验收通过
326## 下一阶段
327完成后进入"代码审查"阶段。""",
329 "code_review": """# 代码审查阶段指南
331## 目标
332全面审查代码质量和设计合理性。
334## 主要任务
3351. **代码质量审查**
336 - 检查代码规范遵循
337 - 评估代码可读性
338 - 验证最佳实践应用
3402. **架构设计审查**
341 - 评估设计合理性
342 - 检查扩展性和维护性
343 - 确认安全性考虑
3453. **文档完整性**
346 - 检查技术文档完整性
347 - 验证API文档准确性
348 - 确保注释清晰有用
350## 输出要求
351- 代码审查报告 (aceflow_result/code_review.md)
352- 改进建议 (aceflow_result/improvement_suggestions.md)
353- 最终代码版本 (aceflow_result/final_code/)
355## 质量标准
356- 代码质量达到团队标准
357- 设计问题已解决
358- 文档完整准确
360## 下一阶段
361完成后进入"功能演示"阶段。""",
363 "demo": """# 功能演示阶段指南
365## 目标
366准备和执行项目功能演示。
368## 主要任务
3691. **演示准备**
370 - 准备演示脚本和数据
371 - 设置演示环境
372 - 预演和优化流程
3742. **功能展示**
375 - 演示核心功能
376 - 突出项目价值
377 - 收集反馈意见
3793. **项目总结**
380 - 整理项目成果
381 - 总结经验教训
382 - 制定后续计划
384## 输出要求
385- 演示脚本 (aceflow_result/demo_script.md)
386- 演示录制/截图 (aceflow_result/demo_materials/)
387- 项目总结报告 (aceflow_result/project_summary.md)
389## 质量标准
390- 演示流程顺畅
391- 功能展示完整
392- 项目价值清晰
394## 项目完成
395这是标准工作流的最后阶段,项目完成!"""
396 }
398 guide = stage_guides.get(stage.lower())
399 if guide:
400 return guide
401 else:
402 return f"""# {stage.title()} 阶段指南
404## 说明
405暂未找到阶段 '{stage}' 的详细指南。
407## 可用阶段指南
408- user_stories (用户故事分析)
409- task_breakdown (任务分解)
410- test_design (测试用例设计)
411- implementation (功能实现)
412- unit_test (单元测试)
413- integration_test (集成测试)
414- code_review (代码审查)
415- demo (功能演示)
417## 建议
418请使用正确的阶段名称,或联系管理员添加新的阶段指南。"""
420 except Exception as e:
421 return f"""# 错误
423获取阶段 '{stage}' 指南时发生错误: {str(e)}
425请检查阶段名称是否正确,或重试操作。"""