state_engine.py 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. import json
  2. import os
  3. from datetime import datetime
  4. from utils.config_loader import load_config
  5. class PATEOASStateEngine:
  6. def __init__(self, project_root='.'):
  7. self.project_root = project_root
  8. self.config = load_config('dynamic_thresholds.json')
  9. self.state_file = os.path.join(project_root, '.aceflow', 'current_state.json')
  10. self.stage_definitions = {
  11. 'S1': {'name': '用户故事细化', 'next_stage': 'S2'},
  12. 'S2': {'name': '任务拆分', 'next_stage': 'S3'},
  13. 'S3': {'name': '测试用例设计', 'next_stage': 'S4'},
  14. 'S4': {'name': '功能实现', 'next_stage': 'S5'},
  15. 'S5': {'name': '测试报告', 'next_stage': 'S6'},
  16. 'S6': {'name': '代码评审', 'next_stage': 'S7'},
  17. 'S7': {'name': '演示与反馈', 'next_stage': 'S8'},
  18. 'S8': {'name': '进度汇总', 'next_stage': None}
  19. }
  20. # 初始化状态目录
  21. os.makedirs(os.path.dirname(self.state_file), exist_ok=True)
  22. # 初始化状态文件
  23. if not os.path.exists(self.state_file):
  24. self.initialize_state()
  25. def initialize_state(self):
  26. """初始化项目状态"""
  27. initial_state = {
  28. 'current_stage': 'S1',
  29. 'stage_status': {stage_id: 'not_started' for stage_id in self.stage_definitions.keys()},
  30. 'progress': {stage_id: 0 for stage_id in self.stage_definitions.keys()},
  31. 'memory_ids': [],
  32. 'last_updated': datetime.now().isoformat(),
  33. 'abnormalities': []
  34. }
  35. initial_state['stage_status']['S1'] = 'in_progress'
  36. self.save_state(initial_state)
  37. return initial_state
  38. def get_current_state(self):
  39. """获取当前状态"""
  40. with open(self.state_file, 'r', encoding='utf-8') as f:
  41. return json.load(f)
  42. def save_state(self, state_data):
  43. """保存状态数据"""
  44. state_data['last_updated'] = datetime.now().isoformat()
  45. with open(self.state_file, 'w', encoding='utf-8') as f:
  46. json.dump(state_data, f, ensure_ascii=False, indent=2)
  47. def update_stage_progress(self, stage_id, progress, memory_ids=None):
  48. """更新阶段进度"""
  49. state = self.get_current_state()
  50. if stage_id not in state['progress']:
  51. raise ValueError(f"无效的阶段ID: {stage_id}")
  52. state['progress'][stage_id] = progress
  53. state['current_stage'] = stage_id
  54. # 更新状态
  55. if progress >= 100:
  56. state['stage_status'][stage_id] = 'completed'
  57. # 自动进入下一阶段
  58. next_stage = self.stage_definitions[stage_id]['next_stage']
  59. if next_stage:
  60. state['current_stage'] = next_stage
  61. state['stage_status'][next_stage] = 'in_progress'
  62. else:
  63. state['stage_status'][stage_id] = 'in_progress'
  64. # 添加记忆ID
  65. if memory_ids:
  66. for mem_id in memory_ids:
  67. if mem_id not in state['memory_ids']:
  68. state['memory_ids'].append(mem_id)
  69. self.save_state(state)
  70. return state
  71. def record_abnormality(self, stage_id, issue_description, severity='medium'):
  72. """记录异常状态"""
  73. state = self.get_current_state()
  74. abnormality = {
  75. 'id': f"ABN-{datetime.now().strftime('%Y%m%d%H%M%S')}",
  76. 'stage_id': stage_id,
  77. 'description': issue_description,
  78. 'severity': severity,
  79. 'detected_at': datetime.now().isoformat(),
  80. 'status': 'unresolved'
  81. }
  82. state['abnormalities'].append(abnormality)
  83. self.save_state(state)
  84. return abnormality
  85. def resolve_abnormality(self, abnormality_id):
  86. """解决异常状态"""
  87. state = self.get_current_state()
  88. for abn in state['abnormalities']:
  89. if abn['id'] == abnormality_id:
  90. abn['status'] = 'resolved'
  91. abn['resolved_at'] = datetime.now().isoformat()
  92. self.save_state(state)
  93. return True
  94. return False
  95. def get_navigation_suggestion(self):
  96. """获取导航建议,明确区分状态描述与操作建议"""
  97. state = self.get_current_state()
  98. current_stage = state['current_stage']
  99. progress = state['progress'].get(current_stage, 0)
  100. abnormalities = [a for a in state['abnormalities'] if a['status'] == 'unresolved' and a['stage_id'] == current_stage]
  101. suggestions = []
  102. # 异常处理建议
  103. if abnormalities:
  104. for abn in abnormalities:
  105. suggestions.append({
  106. 'type': 'abnormality',
  107. 'priority': 'high' if abn['severity'] == 'high' else 'medium',
  108. 'message': f"【状态提示】需要处理异常: {abn['description']}", # 添加明确标识
  109. 'action_suggestion': f"resolve_abnormality('{abn['id']}')", # 重命名key,明确为建议
  110. 'requires_confirmation': True # 添加是否需要确认的标记
  111. })
  112. return suggestions
  113. # 进度建议
  114. if progress < 100:
  115. remaining = 100 - progress
  116. suggestions.append({
  117. 'type': 'progress',
  118. 'priority': 'medium',
  119. 'message': f"【状态提示】当前阶段 {current_stage} 进度: {progress}%,还需完成 {remaining}%", # 添加明确标识
  120. 'action_suggestion': f"update_stage_progress('{current_stage}', {min(progress + 10, 100)})", # 明确为建议
  121. 'requires_confirmation': True,
  122. 'rationale': f"建议逐步更新进度,每次增加不超过10%" # 添加建议理由
  123. })
  124. else:
  125. next_stage = self.stage_definitions[current_stage]['next_stage']
  126. if next_stage:
  127. suggestions.append({
  128. 'type': 'transition',
  129. 'priority': 'high',
  130. 'message': f"【状态提示】阶段 {current_stage} 已完成,准备进入 {next_stage}",
  131. 'action_suggestion': f"update_stage_progress('{next_stage}', 0)",
  132. 'requires_confirmation': True,
  133. 'rationale': "请确认是否已完成当前阶段所有工作"
  134. })
  135. return suggestions