@fanchao8609/agent_brain_sync 1.13.2 → 1.13.3

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/README.md CHANGED
@@ -188,8 +188,12 @@ agent_brain_sync/
188
188
  ├── bin/mcp.js MCP server (stdio)
189
189
  ├── src/index.js 图谱定位(只认当前目录的 .brain/)+ 全局技术日志目录
190
190
  ├── src/lock.js 并发写保护(原子锁 + 排队 + SKIP)
191
- ├── src/todo.js todo.md 分区读写
191
+ ├── src/todo.js todo.md 分区读写 + 格式闸门
192
192
  ├── src/store.js CLI 命令实现
193
+ ├── src/lint.js 图谱体检(死链/孤岛/超尺寸/堆积;同类问题折叠计数)
194
+ ├── src/query.js 检索知识页(多词 OR)
195
+ ├── src/relevant.js 相关页推荐(按"当前在干什么"挑该读的页)
196
+ ├── src/codegraph.js 借本机 CodeGraph 取"代码影响面",写回图谱
193
197
  ├── src/hosts.js 四宿主接入定义
194
198
  ├── src/install.js 安装/卸载(分区共存合并)
195
199
  ├── src/userconfig.js 使用者姓名配置(作者标记;占位名如 tester/foo 会被拒)
@@ -197,7 +201,7 @@ agent_brain_sync/
197
201
  ├── hooks/event.sh hook 模板
198
202
  ├── hooks/abs.pi.ts pi 扩展模板(含 todo 面板 / 随机昵称 / 常驻指引)
199
203
  ├── skill/<名称>/SKILL.md 技能(每个子目录 = 一个 skill,装到各智能体)
200
- └── test/ 单测(400+,node:test)
204
+ └── test/ 单测(448,node:test,零外部测试依赖)
201
205
  ```
202
206
 
203
207
  MIT
@@ -3,6 +3,10 @@
3
3
  * 纯触发: 生命周期事件 → 技术日志一行 (~/.abs/log/hooks.log, ABS_LOG_DIR 可覆盖)。fire-and-forget。
4
4
  * 纪律: hook 事件只进技术日志, 不进图谱 log.md (log.md 只收工作成果沉淀, 与 event.sh 同纪律)。
5
5
  * Op​encode 事件: session.created / session.idle / session.deleted (idle = 每轮结束, 对应 pi 的 agent_end)。
6
+ * Opencode v2 API: 默认导出 { id, setup }, setup(api) 里用 api.event.subscribe 订阅。
7
+ * (v1 的 { id, server } + return { event } 在 v2 已移除, 会让插件加载失败报
8
+ * "Plugin failed", 见 concept host-plugin-silent-failure。本文件与
9
+ * ~/.config/opencode/plugins/abs.ts 必须同改, 否则下次 abs install 覆盖回去。)
6
10
  * 收尾注入已删除(2026-09-18):曾用 session.idle + promptAsync 推一条收尾提醒, 用户实报
7
11
  * 「每次干活干一会就出来, 任务就中断了」。根因同 pi 侧: 主动往对话里插 turn = 打断,
8
12
  * 不是频率问题(2026-09-15 删登记注入时已得出同一结论)。保留 session.idle:seen 埋点。
@@ -10,32 +14,32 @@
10
14
  import { appendFile, mkdir, stat } from "node:fs/promises"
11
15
  import { homedir } from "node:os"
12
16
  import { join } from "node:path"
13
- const server = async ({ directory }) => {
17
+ // 定位当前项目的 .brain/:只看 cwd 本身,不向上搜索(防爬到家目录图谱)
18
+ async function findBrain(cwd) {
19
+ const d = cwd || process.cwd()
20
+ try { const st = await stat(join(d, ".brain")); return st.isDirectory() ? join(d, ".brain") : null } catch { return null }
21
+ }
22
+
23
+ const setup = async (api) => {
14
24
  // 本会话首次 idle 是否已埋点
15
25
  let idleSeen = false
16
- async function logHook(evt) {
17
- try {
18
- const dir = process.env.ABS_LOG_DIR || join(homedir(), ".abs", "log")
19
- const d = new Date()
20
- const pad = (n) => String(n).padStart(2, "0")
21
- const stamp = d.getFullYear() + "-" + pad(d.getMonth() + 1) + "-" + pad(d.getDate()) + " " + pad(d.getHours()) + ":" + pad(d.getMinutes()) + ":" + pad(d.getSeconds())
22
- await mkdir(dir, { recursive: true })
23
- await appendFile(join(dir, "hooks.log"), "[" + stamp + "] opencode:" + evt + "\n")
24
- } catch {} // fire-and-forget: 永不阻塞宿主
25
- }
26
+ async function logHook(evt) {
27
+ try {
28
+ const dir = process.env.ABS_LOG_DIR || join(homedir(), ".abs", "log")
29
+ const d = new Date()
30
+ const pad = (n) => String(n).padStart(2, "0")
31
+ const stamp = d.getFullYear() + "-" + pad(d.getMonth() + 1) + "-" + pad(d.getDate()) + " " + pad(d.getHours()) + ":" + pad(d.getMinutes()) + ":" + pad(d.getSeconds())
32
+ await mkdir(dir, { recursive: true })
33
+ await appendFile(join(dir, "hooks.log"), "[" + stamp + "] opencode:" + evt + "\n")
34
+ } catch {} // fire-and-forget: 永不阻塞宿主
35
+ }
26
36
 
27
- // 定位当前项目的 .brain/:只看 cwd 本身,不向上搜索(防爬到家目录图谱)
28
- async function findBrain(cwd) {
29
- const d = cwd || process.cwd()
30
- try { const st = await stat(join(d, ".brain")); return st.isDirectory() ? join(d, ".brain") : null } catch { return null }
31
- }
32
-
33
- // 收尾注入已停用(2026-09-18):promptAsync 会在每轮 idle 抢一个 turn,用户实报
34
- // 「每次干活干一会就出来, 任务就中断了」。wroteFiles / nudged / READONLY_CMD /
35
- // tool.execute.after / loggedToday 随注入一起删除(注入没了,它们已无消费方)。
36
- // 保留 session.idle:seen 埋点:区分「事件没触发」与「被守卫拦下」。
37
- return {
38
- event: async ({ event }) => {
37
+ // 收尾注入已停用(2026-09-18):promptAsync 会在每轮 idle 抢一个 turn,用户实报
38
+ // 「每次干活干一会就出来, 任务就中断了」。wroteFiles / nudged / READONLY_CMD /
39
+ // tool.execute.after / loggedToday 随注入一起删除(注入没了,它们已无消费方)。
40
+ // 保留 session.idle:seen 埋点:区分「事件没触发」与「被守卫拦下」。
41
+ api.event.subscribe(async (event) => {
42
+ try {
39
43
  const type = event && event.type
40
44
  if (!type) return
41
45
  if (type === "session.created" || type === "session.deleted") {
@@ -49,19 +53,19 @@ const server = async ({ directory }) => {
49
53
  return
50
54
  }
51
55
  if (type !== "session.idle") return // idle = 每轮结束, 不记日志(太吵), 只做可观测性埋点
52
- const cwd = directory || process.cwd()
56
+ const cwd = api.location?.directory || process.cwd()
53
57
  const brain = await findBrain(cwd)
54
58
  // 可观测性: 首次 idle 留一行痕(否则无法区分“事件没触发”与“被守卫拦下”)
55
59
  if (!idleSeen) {
56
60
  idleSeen = true
57
61
  await logHook(`session.idle:seen cwd=${cwd} brain=${brain || 'none'}`)
58
62
  }
59
- },
60
- }
63
+ } catch {} // 订阅回调抛错会污染宿主, 一律吞掉
64
+ })
61
65
  }
62
66
 
63
67
  export default {
64
68
  id: "abs",
65
- server,
69
+ setup,
66
70
  }
67
71
  @@MARK@@
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fanchao8609/agent_brain_sync",
3
- "version": "1.13.2",
3
+ "version": "1.13.3",
4
4
  "description": "agent-brain-sync: 跨会话 AI 编码记忆 — hook 纯触发 + CLI/MCP 读写 .brain markdown 图谱, 防并发写保护。",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: abs-agent-brain-sync
3
- description: abs (agent-brain-sync) 跨会话记忆与任务续接。适用于「开工续接状态」「沉淀会话收获」「任务登记不丢」「经验落成知识页」「图谱体检」等任务。
3
+ description: "USE FOR abs / agent-brain-sync 跨会话记忆与任务续接。触发词:用户直接输入 abs(单独一个词,或 abs + 命令,如 'abs 开工'、'abs 沉淀');以及「开工续接状态」「沉淀会话收获」「任务登记不丢」「经验落成知识页」「图谱体检」等任务。"
4
4
  ---
5
5
 
6
6
  # abs — 跨会话记忆 (agent-brain-sync)
@@ -9,6 +9,8 @@ description: abs (agent-brain-sync) 跨会话记忆与任务续接。适用于
9
9
 
10
10
  **关键词不是触发器,意图才是。**句子里出现 abs 词(收尾/todo/沉淀/load/log/note)不等于要执行 abs 动作:谈论、提问、吐槽、定规则("太啰嗦""这个设计怎样")**只回应,不执行动作**;明确让我做事才执行。
11
11
 
12
+ **例外(唯一):用户直接输入 `abs`** —— 单独一个词、或 `abs` 后跟命令/意图(如 `abs`、`abs 开工`、`abs 沉淀`、`abs load`)。这是明确的"我要用 abs",不算关键词误触发,**直接按 abs 流程执行**(无子命令时默认走开工续接)。
13
+
12
14
  - 拿不准时**先问**。规则变更("以后简短点")写入本文,不执行动作。
13
15
  - 输出简短:收尾/提示/todo 汇报一两句。本总则适用于所有工具。
14
16