@xgjktech/xg-openclaw-harness-tools 0.4.8 → 0.4.9
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.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plan-write-tool.d.ts","sourceRoot":"","sources":["../src/plan-write-tool.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,KAAK,MAAM,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EAIL,KAAK,UAAU,EACf,KAAK,SAAS,EAGf,MAAM,8BAA8B,CAAC;AAkCtC,eAAO,MAAM,eAAe;;;;;;;;;EAwB3B,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG,MAAM,CAAC,OAAO,eAAe,CAAC,CAAC;AAE9D,eAAO,MAAM,sBAAsB,
|
|
1
|
+
{"version":3,"file":"plan-write-tool.d.ts","sourceRoot":"","sources":["../src/plan-write-tool.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,KAAK,MAAM,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EAIL,KAAK,UAAU,EACf,KAAK,SAAS,EAGf,MAAM,8BAA8B,CAAC;AAkCtC,eAAO,MAAM,eAAe;;;;;;;;;EAwB3B,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG,MAAM,CAAC,OAAO,eAAe,CAAC,CAAC;AAE9D,eAAO,MAAM,sBAAsB,QA6BvB,CAAC;AA+Gb,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,CAAC,EAAE,UAAU,GAAG,YAAY,CA4ItF"}
|
package/dist/plan-write-tool.js
CHANGED
|
@@ -62,6 +62,7 @@ export const PLAN_WRITE_DESCRIPTION = [
|
|
|
62
62
|
"- 更新计划内容时必须重新提交 goal 和所有要保留的 tasks,包括未变化任务及其当前 status/note。只提交变化项会删除其他任务;记不清时先用 xg_plan_view 查看。",
|
|
63
63
|
"- goal 用一句话;tasks 通常 3-7 项,每项是能判断是否完成的具体动作,不写 TODO、待定或内部思考。",
|
|
64
64
|
"- status 为 pending、in_progress、completed 或 blocked。通常只有一项 in_progress,确实并行时可以有多项;blocked 时必须用 note 写明原因和继续所需条件。",
|
|
65
|
+
"- 已完成任务不可回退:一旦某项标记 completed,后续回写必须保持 completed,禁止改回 pending/in_progress/blocked。若执行中发现此前完成结论不成立或需返工,保留该 completed 项(可在 note 中说明返工原因),新增一条后续任务承接返工/补做,并相应调整其后的步骤。",
|
|
65
66
|
"- 同一件工作只维护一份计划;任务方向变化时,先取消不再推进的旧计划({planId, cancel:true})再新建。",
|
|
66
67
|
].join("\n");
|
|
67
68
|
function toTask(input) {
|
|
@@ -74,6 +75,32 @@ function toTask(input) {
|
|
|
74
75
|
}
|
|
75
76
|
return task;
|
|
76
77
|
}
|
|
78
|
+
function normalizeTaskTitle(title) {
|
|
79
|
+
return title.trim();
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* 检测"已完成任务被回退":以规范化标题对齐旧任务与新提交任务,
|
|
83
|
+
* 凡旧任务为 completed 而新提交同名任务状态不再是 completed,即为回退。
|
|
84
|
+
* 同名任务整体删除属于整张覆盖语义(未提交即删除),不算回退。
|
|
85
|
+
*/
|
|
86
|
+
function findTaskStatusRegressions(existing, nextTasks) {
|
|
87
|
+
const completedTitles = new Set();
|
|
88
|
+
for (const task of existing.tasks) {
|
|
89
|
+
if (task.status === "completed") {
|
|
90
|
+
completedTitles.add(normalizeTaskTitle(task.title));
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
const regressions = [];
|
|
94
|
+
for (const task of nextTasks) {
|
|
95
|
+
const nextStatus = (task.status ?? "pending");
|
|
96
|
+
if (nextStatus === "completed")
|
|
97
|
+
continue;
|
|
98
|
+
if (completedTitles.has(normalizeTaskTitle(task.title))) {
|
|
99
|
+
regressions.push({ title: task.title, from: "completed", to: nextStatus });
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
return regressions;
|
|
103
|
+
}
|
|
77
104
|
function buildPlan(goal, tasks, existing, planId, origin, now) {
|
|
78
105
|
const plan = {
|
|
79
106
|
planId,
|
|
@@ -191,6 +218,21 @@ export function buildPlanWriteTool(store, origin) {
|
|
|
191
218
|
return toolJsonResult(result);
|
|
192
219
|
}
|
|
193
220
|
}
|
|
221
|
+
if (existing !== undefined) {
|
|
222
|
+
const regressions = findTaskStatusRegressions(existing, params.tasks);
|
|
223
|
+
if (regressions.length > 0) {
|
|
224
|
+
const detail = `${regressions
|
|
225
|
+
.map((regression) => `「${compactText(regression.title)}」${regression.from} → ${regression.to}`)
|
|
226
|
+
.join(";")}。` +
|
|
227
|
+
"已完成任务禁止回退:若执行中发现此前完成结论不成立或需返工,请保留该 completed 项," +
|
|
228
|
+
"新增一条后续任务说明补救/返工动作并相应调整后续步骤,而不是把已完成项改回未完成。";
|
|
229
|
+
const result = {
|
|
230
|
+
ok: false,
|
|
231
|
+
error: { code: "TASK_STATUS_REGRESSION", detail },
|
|
232
|
+
};
|
|
233
|
+
return toolJsonResult(result);
|
|
234
|
+
}
|
|
235
|
+
}
|
|
194
236
|
let warnings;
|
|
195
237
|
if (planIdParam === undefined && scope !== undefined) {
|
|
196
238
|
const warning = unfinishedPlanWarning(store.listPlansByOrigin(scope), Date.now());
|