@fanchao8609/agent_brain_sync 1.26.0 → 1.26.1
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.
- package/bin/abs.js +7 -0
- package/bin/mcp.js +2 -2
- package/package.json +1 -1
- package/skill/abs-agent-brain-sync/SKILL.md +4 -1
- package/src/todo/task-cmd.js +39 -0
package/bin/abs.js
CHANGED
|
@@ -351,6 +351,7 @@ const subUsage = {
|
|
|
351
351
|
' abs todo child-undone <id> [--n N] 取消勾',
|
|
352
352
|
' abs todo memo <id> "随手记(可多句)" 任务笔记 → sessions/,不上看板;无文字=查看',
|
|
353
353
|
' abs todo state <id> --note 进行中|讨论中|滞留中|搁置',
|
|
354
|
+
' abs todo remove <id> 删除任务(连子项,不可恢复;只是先不做请用 state 搁置)',
|
|
354
355
|
' abs todo done <id> [--as 落地|否决|仅方案] [结语文字]',
|
|
355
356
|
' abs todo archive [--keep-days N] [--dry-run]',
|
|
356
357
|
'',
|
|
@@ -431,6 +432,12 @@ const TODO_ACTIONS = {
|
|
|
431
432
|
state: 'state', // 改行首状态标记:进行中|讨论中|滞留中|搁置(原地,不搬区)
|
|
432
433
|
rename: 'rename', // 改任务 id:人工起错名、或旧 id 不可读时用
|
|
433
434
|
done: 'done',
|
|
435
|
+
// 删除任务(2026-11-05 用户要求):连子项一起移除,不可恢复。
|
|
436
|
+
// 与 state=搁置 语义不同 —— 搁置是「先不做,还留在看板上」,删除是「从未登记过」。
|
|
437
|
+
// rm 是别名:用户说「删除」时想敲的通常是 rm/del。
|
|
438
|
+
remove: 'remove',
|
|
439
|
+
rm: 'remove',
|
|
440
|
+
del: 'remove',
|
|
434
441
|
};
|
|
435
442
|
|
|
436
443
|
/** abs config —— 读/写用户设置(目前只有 user)。 */
|
package/bin/mcp.js
CHANGED
|
@@ -117,10 +117,10 @@ tool(
|
|
|
117
117
|
'abs_task',
|
|
118
118
|
'任务实时落盘(幂等键 = id)。start 登记进 Todo / note 补子项(**追加**,标准 md 嵌套列表,`abs todo note`)/ child_done、child_undone 勾/取消勾子项(n=第几条,缺省最后一条)/ memo 任务随手记(多句/追加/不上看板)/ state 改状态 / done 完成归位 Done(done 时 note=结语文字,as=结语类型:落地|否决|仅方案)。必填: cwd, action, id。多会话并行时,start/add 带上 session(值见 system prompt 的 [会话] 段)以标记「这条任务谁在做」。',
|
|
119
119
|
{
|
|
120
|
-
action: z.enum(['add', 'start', 'done', 'note', 'child_done', 'child_undone', 'memo', 'state']),
|
|
120
|
+
action: z.enum(['add', 'start', 'done', 'note', 'child_done', 'child_undone', 'memo', 'state', 'remove']),
|
|
121
121
|
id: z.string().describe('任务幂等键,如 TASK-xxx 或子任务名'),
|
|
122
122
|
n: z.number().int().positive().optional().describe('child_done/child_undone 用:第几条子项(1-based,缺省=最后一条)'),
|
|
123
|
-
cwd: z.string().describe('项目根目录(.brain/ 所在处)'), note: z.string().optional().describe('add/start=做什么; note=追加一条子项(改到哪/下一步,一句话); memo=随手记(可多句、不定长,追加式;不传=查看已有笔记); state=进行中|讨论中|滞留中|搁置(搁置=用户改方向/不做了;滞留中=还要做只是卡住); done
|
|
123
|
+
cwd: z.string().describe('项目根目录(.brain/ 所在处)'), note: z.string().optional().describe('add/start=做什么; note=追加一条子项(改到哪/下一步,一句话); memo=随手记(可多句、不定长,追加式;不传=查看已有笔记); state=进行中|讨论中|滞留中|搁置(搁置=用户改方向/不做了;滞留中=还要做只是卡住); done=结语文字(remove 不用此字段)'),
|
|
124
124
|
as: z.enum(['落地', '否决', '仅方案']).optional().describe('仅 done:结语类型。默认 落地。做了又撤/评估后不做用 否决,只设计过用 仅方案 —— 别让假【落地】污染看板'),
|
|
125
125
|
// 会话 id:多会话并行时标记「这条任务是谁在做」。
|
|
126
126
|
// 值取自 system prompt 里的 `[会话] 本会话 id = xxx`(hook 注入),由模型原样回传。
|
package/package.json
CHANGED
|
@@ -40,7 +40,7 @@ MCP 侧走 `abs_search`(等价于 `abs db search --no-rules`)—— 比 `abs
|
|
|
40
40
|
```bash
|
|
41
41
|
abs load # 开机读状态
|
|
42
42
|
abs query <词> # 字面 OR 命中,输出短;MCP 侧更推荐 abs_search(更准)
|
|
43
|
-
abs todo add <id> --note "做什么" # 登记;note/memo/state/done 见「进行中」
|
|
43
|
+
abs todo add <id> --note "做什么" # 登记;note/memo/state/done/remove 见「进行中」
|
|
44
44
|
abs capture [--layer 1-6] [--kind …] "…" # 按七层判定落点后写入(L7 走 abs note)
|
|
45
45
|
abs summon # 列出没落页的会话(只读,不写盘)
|
|
46
46
|
abs ingest <会话文件或 id> # 把一场 pi 会话落成会话页(带 session id 双向回溯)
|
|
@@ -200,6 +200,9 @@ todo 是随改随写的活看板,和 git commit 同反射。
|
|
|
200
200
|
|
|
201
201
|
**四个落点的区别**:
|
|
202
202
|
|
|
203
|
+
- `remove` = **删除**,连子项一起移除,**不可恢复**。记错了/重复了/与事实不符时用。
|
|
204
|
+
与 `state 搁置` 的区别:搁置是「先不做,任务还留在看板上」,下个会话还会问你;
|
|
205
|
+
删除是「当作从未登记过」。Done 区的条目删不掉(历史不许篡改)。
|
|
203
206
|
- `note` = **子项**,一句话**追加式**(每次多一条,不覆盖),上看板。
|
|
204
207
|
- `memo` = **随手记**,可多句**追加式**,不占看板。
|
|
205
208
|
- `abs_note` = 提炼过的**经验/坑**,一句话结论 → `sources/` 待提炼。
|
package/src/todo/task-cmd.js
CHANGED
|
@@ -137,6 +137,45 @@ export async function cmdTask({ dir, action, id, section, note, as, session, n }
|
|
|
137
137
|
});
|
|
138
138
|
return cc.length ? `✓ ${id} 状态 → [${note}]` : `[NO_MATCH] 未找到含 "${id}" 的未完成任务行,或状态未变`;
|
|
139
139
|
}
|
|
140
|
+
// 删除任务(2026-11-05 用户要求「每次删除任务可烦人了」)。
|
|
141
|
+
// 与 state=搁置 的区别(别混):
|
|
142
|
+
// 搁置 = 先不做,任务**留在看板上**,下个会话还会看见它并问你要不要接着干
|
|
143
|
+
// 删除 = 从看板移除,当作从未登记过(记错了/重复了/与事实不符)
|
|
144
|
+
// 为何必须连子项一起删:只删任务行会留下无主的缩进子项,
|
|
145
|
+
// normalizeTodo 重建分区时它们会被当孤儿清掉 —— 那种「清掉」是静默的,
|
|
146
|
+
// 而这里要让整块消失是**显式**的,且报告删了几条。
|
|
147
|
+
if (action === 'remove') {
|
|
148
|
+
const f = brainPath(root, 'todo.md');
|
|
149
|
+
let removed = null;
|
|
150
|
+
await editFile(f, (cur) => {
|
|
151
|
+
if (cur === null) return SKIP;
|
|
152
|
+
const lines = cur.split('\n');
|
|
153
|
+
const wantId = String(id).replace(/[\u200b\u200c\u200d\ufeff]/g, '');
|
|
154
|
+
for (let i = 0; i < lines.length; i++) {
|
|
155
|
+
if (idOfTaskLine(lines[i]) !== wantId) continue;
|
|
156
|
+
// 收集这一行 + 紧跟的所有子项行(缩进列表项 / 旧 ↳ 写法)
|
|
157
|
+
const block = [lines[i]];
|
|
158
|
+
let j = i + 1;
|
|
159
|
+
while (j < lines.length) {
|
|
160
|
+
const nx = lines[j];
|
|
161
|
+
if (!nx.trim()) break;
|
|
162
|
+
const kid = parseChild(nx);
|
|
163
|
+
const legacy = /^\s+↳\s/.test(nx);
|
|
164
|
+
if ((kid && kid.indent > 0) || legacy) { block.push(nx); j++; continue; }
|
|
165
|
+
break;
|
|
166
|
+
}
|
|
167
|
+
removed = { body: lines[i], kids: block.length - 1 };
|
|
168
|
+
lines.splice(i, block.length);
|
|
169
|
+
return { text: lines.join('\n') };
|
|
170
|
+
}
|
|
171
|
+
return SKIP;
|
|
172
|
+
});
|
|
173
|
+
if (!removed) return `[NO_MATCH] 未找到含 "${id}" 的未完成任务行`;
|
|
174
|
+
// 只删未完成区:Done 区的条目是历史,删了等于篡改记录。
|
|
175
|
+
// idOfTaskLine 只认 `- [ ]`,所以到这里的一定是未完成的。
|
|
176
|
+
const kidNote = removed.kids ? `(连同 ${removed.kids} 条子项)` : '';
|
|
177
|
+
return `✓ 已删除任务 ${id}${kidNote}\n 原行: ${removed.body.trim().slice(0, 90)}\n 说明: 删除是不可恢复的移除;只是「先不做」请用 abs todo state ${id} --note 搁置`;
|
|
178
|
+
}
|
|
140
179
|
if (action === 'note') {
|
|
141
180
|
if (!note) return '用法: abs todo note <id> --note "进度"\n 建议前缀(load 会把它们单独抽出来,让人一眼看到):\n 验证: <跑过的命令/结果>\n 边界: <这方案治不了什么>\n 阻塞: <在等什么,卡在哪>';
|
|
142
181
|
const r = await setBreakpoint(root, { id, text: note });
|