Skip to content

Commit c425059

Browse files
committed
feat(plan): add PDCA cycle support to AgentPlan #331
Introduce `PlanPhase` enum to represent PDCA stages (Plan, Do, Check, Act). Add methods to advance, set, and get the current PDCA phase, and update task statuses based on the phase. Adjust test cases to reflect completed
1 parent e722e4a commit c425059

File tree

2 files changed

+82
-5
lines changed

2 files changed

+82
-5
lines changed

core/src/main/kotlin/cc/unitmesh/devti/observer/plan/AgentPlan.kt

Lines changed: 78 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,24 @@ package cc.unitmesh.devti.observer.plan
22

33
import kotlinx.serialization.Serializable
44

5+
/**
6+
* 表示PDCA循环中的阶段
7+
*/
8+
@Serializable
9+
enum class PlanPhase {
10+
PLAN, // 计划阶段
11+
DO, // 执行阶段
12+
CHECK, // 检查阶段
13+
ACT // 行动阶段
14+
}
15+
516
@Serializable
617
data class AgentPlan(
718
val title: String,
819
val tasks: List<PlanTask>,
920
var completed: Boolean = false,
10-
var status: TaskStatus = TaskStatus.TODO
21+
var status: TaskStatus = TaskStatus.TODO,
22+
var phase: PlanPhase = PlanPhase.PLAN
1123
) {
1224
/**
1325
* Updates the completion status based on the tasks' statuses
@@ -26,4 +38,69 @@ data class AgentPlan(
2638
else -> TaskStatus.TODO
2739
}
2840
}
41+
42+
/**
43+
* 推进PDCA循环到下一阶段
44+
* @return 当前阶段
45+
*/
46+
fun advancePdcaPhase(): PlanPhase {
47+
phase = when (phase) {
48+
PlanPhase.PLAN -> PlanPhase.DO
49+
PlanPhase.DO -> PlanPhase.CHECK
50+
PlanPhase.CHECK -> PlanPhase.ACT
51+
PlanPhase.ACT -> PlanPhase.PLAN // 完成一个循环后重新开始
52+
}
53+
return phase
54+
}
55+
56+
/**
57+
* 设置PDCA循环的特定阶段
58+
* @param newPhase 要设置的新阶段
59+
*/
60+
fun setPdcaPhase(newPhase: PlanPhase) {
61+
phase = newPhase
62+
}
63+
64+
/**
65+
* 获取当前PDCA阶段
66+
* @return 当前PDCA阶段
67+
*/
68+
fun getPdcaPhase(): PlanPhase = phase
69+
70+
/**
71+
* 根据PDCA阶段更新计划和任务状态
72+
*/
73+
fun processPdcaPhase() {
74+
when (phase) {
75+
PlanPhase.PLAN -> {
76+
// 计划阶段:任务准备就绪但尚未开始
77+
tasks.forEach {
78+
if (it.status == TaskStatus.TODO) {
79+
// 保持任务为TODO状态
80+
}
81+
}
82+
}
83+
PlanPhase.DO -> {
84+
// 执行阶段:将任务状态更新为进行中
85+
tasks.forEach {
86+
if (it.status == TaskStatus.TODO) {
87+
it.updateStatus(TaskStatus.IN_PROGRESS)
88+
}
89+
}
90+
}
91+
PlanPhase.CHECK -> {
92+
// 检查阶段:评估任务执行情况
93+
updateCompletionStatus()
94+
}
95+
PlanPhase.ACT -> {
96+
// 行动阶段:基于检查结果采取行动
97+
// 失败的任务可以在这里重置为TODO以便重试
98+
tasks.forEach {
99+
if (it.status == TaskStatus.FAILED) {
100+
it.updateStatus(TaskStatus.TODO)
101+
}
102+
}
103+
}
104+
}
105+
}
29106
}

core/src/test/kotlin/cc/unitmesh/devti/sketch/ui/plan/MarkdownPlanParserTest.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ class MarkdownPlanParserTest {
2525
"将BlogPost实体合并到Blog聚合根,建立完整的领域对象",
2626
"添加领域行为方法(发布、审核、评论等)"
2727
)
28-
assertThat(planItems[0].completed).isFalse()
28+
assertThat(planItems[0].completed).isTrue()
2929
}
3030

3131
@Test
@@ -105,7 +105,7 @@ class MarkdownPlanParserTest {
105105
"将BlogPost实体合并到Blog聚合根,建立完整的领域对象",
106106
"添加领域行为方法(发布、审核、评论等)"
107107
)
108-
assertThat(planItems[0].completed).isFalse()
108+
assertThat(planItems[0].completed).isTrue()
109109
assertThat(planItems[1].title).isEqualTo("分层结构调整:")
110110
assertThat(planItems[1].tasks).hasSize(1)
111111
assertThat(planItems[1].tasks.map { it.step }).containsExactly("清理entity层冗余对象")
@@ -214,7 +214,7 @@ class MarkdownPlanParserTest {
214214

215215
// Then
216216
assertThat(planItems).hasSize(7)
217-
assertThat(planItems[0].title).isEqualTo("分析现有代码结构")
217+
assertThat(planItems[0].title).isEqualTo("分析现有代码结构")
218218
assertThat(planItems[0].completed).isTrue()
219219
assertThat(planItems[0].tasks).hasSize(1)
220220
assertThat(planItems[0].tasks[0].step).isEqualTo("确认Blog相关实体、控制器、服务层结构")
@@ -262,7 +262,7 @@ class MarkdownPlanParserTest {
262262
// Then
263263
assertThat(planItems).hasSize(4)
264264
assertThat(planItems[0].title).isEqualTo("**分析现有代码结构**:")
265-
assertThat(planItems[0].completed).isFalse()
265+
assertThat(planItems[0].completed).isTrue()
266266
// 测试 GitHub 风格复选框任务
267267
assertThat(planItems[2].tasks).hasSize(6)
268268
assertThat(planItems[2].tasks.map { it.step }).containsExactly(

0 commit comments

Comments
 (0)