ygl-trees 0.80.0 → 0.82.0
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/CHANGELOG.md +17 -0
- package/README.md +25 -15
- package/dist/apps/cli/src/bin.js +4 -1
- package/dist/bundle/bin.cjs +955 -629
- package/dist/packages/knowledge/skills/src/cmds.js +27 -0
- package/dist/packages/ops/tools/src/db-cmds.js +29 -4
- package/dist/packages/ops/tools/src/doctor.js +48 -11
- package/dist/packages/ops/tools/src/rels.js +16 -2
- package/dist/packages/research/pipeline/src/cmds.js +18 -4
- package/dist/packages/research/produce/src/produce-cmds.js +23 -8
- package/dist/packages/techtree/model/src/cmds.js +136 -5
- package/dist/packages/techtree/model/src/writes.js +23 -0
- package/package.json +3 -3
- package/skills/ygl-trees-quickstart/SKILL.md +4 -2
- package/skills/ygl-trees-research/SKILL.md +4 -2
- package/skills/ygl-trees-techtree/SKILL.md +9 -3
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,22 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.82.0(2026-10-17)跨树巡检 + 临期 eval 门槛 + 幻影对账一键修复
|
|
4
|
+
- **`node ready --all`**(用户建议②:12 棵树巡检要 24 条命令——每树 tree use + ready):一次进程扫全部树的就绪集,无需 tree use / `-t`;`--json` 返回 `[{tree, ready[]}]`,人类输出按树分节
|
|
5
|
+
- **`node cond --due [--days N] [--eval]`**(建议③:w1/d90 检验依赖人记得看):扫描全部 eval 族条件,提取问题文本中的 `YYYY-MM-DD` 期限,列出 N 天内到期(含逾期)的条件(树/节点/deadline/剩余天数);`--days` 放宽窗口(默认 7);`--eval` 逐条组装上下文包送判定模型(三题型按 op 自动选择,离线安全回落 pending)——**判定只报告不仲裁**,通过 ≠ 自动解锁,resolve/unlock 保持人工(与 predict audit 同纪律);跨树扫描前置于树解析,无当前树也能跑
|
|
6
|
+
- **`doctor --fix` 覆盖 write_integrity**(上报①:幻影写入事件只能围观不能修):`--fix` 把已知幻影事件标记 `reconciled`(payload 增补时间戳,扫描豁免),审计轨迹保留不删事件;warn 文案指路。实测真实工作区:10-16 恢复实验造成的 10 个幻影(kb 47d0d78b18、source f0ad79350f 等)一键对账回 pass
|
|
7
|
+
- 测试:demo 5i 段 7 断言(跨树 ready / 期限提取 / --days 窗口 / --eval 离线 pending / 幻影 warn→fix→pass 全循环)→ 101;`readme-verify.sh` +2(ready --all、cond --due)→ 41
|
|
8
|
+
|
|
9
|
+
## 0.81.0(2026-10-17)命令面五处修正 + task 挂树 + 事件流对账
|
|
10
|
+
- **doctor write_integrity 误报修复**(用户上报①:合法 `kb remove` 后 doctor 报 phantom write fail):`kb rm` 现在落 `kb.rm` 事件(与 source/evidence 对齐);check 10 的幽灵扫描加 `NOT EXISTS rm 事件` 豁免,且整体降级 fail→warn——无 rm 事件的缺行可能是 0.81 前的合法删除或 db sql 手工清理,不值得炸掉脚本门禁
|
|
11
|
+
- **`--url` 收任意 scheme**(上报②:a2a:// 被拒,跨 Agent 引用被迫落盘):正则放宽为 RFC-3986 `<scheme>://`,https/file/session/a2a/… 均可;url_hash 去重照常兜底
|
|
12
|
+
- **`node list` 未知旗标点名 rc=2**(上报③:`node list --tree X` 静默吞 flag 列出当前树——冻结契约⑤违约):允许集 {t, json, no-color},其余旗标点名拒绝并指路 `-t <tree>`
|
|
13
|
+
- **`node cond add|rm` 动作词**(上报④:`cond add p0` 被解析成 key="add" 报 node not found):add/rm/remove 动作词前置,与 link/unlock 风格一致;**新增 `node cond rm <key> --name <n>`**(此前只能 db sql 手工清理)——事务删除 + `node.cond-rm` 事件 + 缺失时点名并列出该节点剩余条件名
|
|
14
|
+
- **rel 节点引用的错误指引**(上报⑤:裸 `node:<key>` 在 current_tree 未设时报泛型 not found):无当前树 →「qualify as node:<tree>/<key> 或先 tree use」;有当前树但未命中 → 附「searched current tree 'X'」
|
|
15
|
+
- **`claim add --confidence` 数值档**(建议⑥):A|B|C 之外收 0-1 小数与 0-100(%)(0.92 / 85% 原样入库,列仍 TEXT);nonsense 仍 rc=2
|
|
16
|
+
- **`task add --node <tree>/<key>`**(建议⑦:task 与 rel 织物脱节):建任务同时挂 `tracked-by` 关系;`task:<id|title>` 成为第九类引用类型(REL_TYPES 8→9)
|
|
17
|
+
- **`db timeline --actor <a> --session <s>`**(建议⑧:多 Agent 并发对账):按 events.actor / payload.session 过滤增长视图,过滤时附最近 20 条原始事件尾
|
|
18
|
+
- 测试:`condrm.spec.ts` 3 例(自然键删除+事件 / 点名+剩余条件 / node not found)、`rels.test.ts` +1(task 引用解析)→ 单测 172;demo 5h 段 12 断言(含 doctor warn 降级、a2a://、confidence 三态、task --node、timeline actor、无树指路)→ 94;README 修复 db 命令表被 PG 段落吞并的排版缺陷 + `db timeline --actor` 文档
|
|
19
|
+
|
|
3
20
|
## 0.80.0(2026-10-17)rel 织物并入 eval 上下文 + 会话内裁决载体
|
|
4
21
|
- **eval 上下文包并入 rel 挂接摘要**(用户实测发现:裁决已 `decided-by` 挂链,P 仍 0.30,必须 `--state k=v` 手动携带事实才 0.92):`evalContext` 新增 `attachments`——节点挂接的 relations 双向查询(≤12 条),claim 摘录 text+status+confidence、evidence 摘录 quote(截 120 字)、kb/source 标题、node key+name、其余 id-only;无挂接时字段缺省(与旧形状逐字节兼容)
|
|
5
22
|
- **`research source add --adjudication "<裁决摘要>"`**:会话内裁决原生载体——url 自动 `session://adjudication/<yyyymmddhhmm>`,摘要兼作缺省标题;`--url` 校验放宽收 `session://`;裸 `--adjudication` 旗标缺值 rc=2
|
package/README.md
CHANGED
|
@@ -60,9 +60,10 @@ node dist/bundle/bin.cjs db init # 发布产物(bin 字段指向它;比
|
|
|
60
60
|
|
|
61
61
|
```bash
|
|
62
62
|
ygl-trees node add steel # 先有节点
|
|
63
|
-
ygl-trees node cond steel --name research_lab_level --kind level --value 3
|
|
64
|
-
ygl-trees node cond steel --name has_engineer --kind flag --op has \
|
|
65
|
-
|
|
63
|
+
ygl-trees node cond add steel --name research_lab_level --kind level --value 3 # 必检
|
|
64
|
+
ygl-trees node cond add steel --name has_engineer --kind flag --op has \
|
|
65
|
+
--optional --effect cost_mul --weight 0.8 # 可选,打八折
|
|
66
|
+
ygl-trees node cond rm steel --name research_lab_level # 按自然键删除
|
|
66
67
|
```
|
|
67
68
|
|
|
68
69
|
### 索引:查询不再递归
|
|
@@ -90,6 +91,9 @@ ygl-trees node link a b --rel excludes # 互斥分支
|
|
|
90
91
|
ygl-trees node can steel --state "research_lab_level=3,has_engineer=1"
|
|
91
92
|
ygl-trees node can a b c --state-file probe.json # 批量判定:一进程测 N 节点(探针冷启动 1s×N → 1s)
|
|
92
93
|
ygl-trees node ready # 当前可解锁集合
|
|
94
|
+
ygl-trees node ready --all # 跨树扫描就绪集(无需逐树 tree use)
|
|
95
|
+
ygl-trees node cond --due # 临期 eval 门槛(问题文本带 YYYY-MM-DD 期限)
|
|
96
|
+
ygl-trees node cond --due --days 30 # 放宽窗口;--eval 到期自动送判定模型
|
|
93
97
|
ygl-trees node path advanced-alloy # 到目标的最省顺序 + 累计成本
|
|
94
98
|
ygl-trees node ancestors bronze # 闭包索引,直接父 depth=1
|
|
95
99
|
ygl-trees node timeline demo # 单树成长时间线(add/link/unlock 倒序)
|
|
@@ -103,6 +107,8 @@ ygl-trees node import --file tree.json --tree copy # 严格校验、事务导
|
|
|
103
107
|
|
|
104
108
|
**批量判定 + `--state-file`(0.79.1)**:`node can k1 k2 k3` 一次进程判定多节点(多键自动进批模式,`--json` 返回数组);`--state-file <json>` 喂状态袋,两种形状——**扁平计数** `{"y_imported": 40}` 全节点共享,或**按节点** `{"a": {"y_imported": 40}, "b": {...}}` 各取各袋。探针脚本从此每树起一次进程而非每节点。
|
|
105
109
|
|
|
110
|
+
**跨树巡检 + 临期门槛(0.82)**:`node ready --all` 一次扫全部树(12 棵树 24 条命令 → 1 条);`node cond --due [--days N]` 列出问题文本带 `YYYY-MM-DD` 期限且 N 天内到期(含逾期)的 eval 条件——w1/d90 预测门槛不再依赖人记得看;`--eval` 逐条送判定模型(离线安全回落 pending),**判定只报告不仲裁**(通过 ≠ 自动解锁,resolve/unlock 保持人工,与 predict audit 同纪律)。
|
|
111
|
+
|
|
106
112
|
**决策模型评估门(spec R8;0.14 布尔 → 0.26 三题型 → 0.27 混批 → 0.80 织物并入)**:语义型必检条件用 eval 题型声明,`node can <key> --eval` 会把**节点元数据 + 直接父(关联)+ 祖先链(闭包索引)+ 条件组 + 已解锁集 + --state 袋 + rel 挂接摘要**组装为上下文包,交给评估模型(TypeSafe jev,经 Vercel AI Gateway)判定:
|
|
107
113
|
|
|
108
114
|
- **rel 织物并入(0.80)**:节点挂接的 evidence(quote 摘要)/ claim(text+status+confidence)/ kb/source(标题)等 rel 关系(双向,≤12 条,文本截 120 字)自动进上下文包的 `attachments`——「证据挂链」纪律从此对语义门槛可见,不必再 `--state k=v` 手动携带裁决事实(实测 P 0.30 → 0.92 的差距由挂链补平)
|
|
@@ -126,10 +132,10 @@ ygl-trees node import --file tree.json --tree copy # 严格校验、事务导
|
|
|
126
132
|
query add 登记检索式
|
|
127
133
|
query attach 检索式 ↔ 来源关联(query list 显示召回数)
|
|
128
134
|
source add 收来源,按 (project, url_hash) 去重;--query 顺带关联
|
|
129
|
-
--adjudication "<裁决摘要>":会话内裁决原生载体(url 自动 session://adjudication/<时刻>,摘要兼作标题);--url
|
|
135
|
+
--adjudication "<裁决摘要>":会话内裁决原生载体(url 自动 session://adjudication/<时刻>,摘要兼作标题);--url 收任意 <scheme>://(https/file/session/a2a/… 跨 Agent 引用免落盘)
|
|
130
136
|
source fetch <url> 直接抓取网页入库:title/meta description/去标签正文;15s 超时、非 html 拒收、失败零副作用,正文过薄自动打 needs_review
|
|
131
137
|
evidence add 从来源摘原文片段,带 locator(页码/章节);长摘录用 --file <path> 免转义
|
|
132
|
-
claim add
|
|
138
|
+
claim add 写下断言;--confidence 收 A|B|C 或数值档(0.92 / 85% 原样入库)
|
|
133
139
|
claim link 断言 ↔ 证据,自动算 supported / refuted / contested
|
|
134
140
|
--by-source:传来源 id 一次挂齐其全部证据;误传来源 id 会列出该来源的证据 id
|
|
135
141
|
claim resolve 人工仲裁出口:--as supported|refuted|contested,事件留痕;后续新证据链接会重新推导
|
|
@@ -188,17 +194,18 @@ ygl-trees rel add node:steel artifact:<id> --rel tracked-by # 产出/任
|
|
|
188
194
|
ygl-trees rel list --src node:steel # 双向浏览(对端解析成显示名)
|
|
189
195
|
```
|
|
190
196
|
|
|
191
|
-
`<type>:<ref>` 词表:`node claim evidence source query kb artifact skill`。`/api/node` 同时返回双向 `related[]`,WebUI 节点详情直接可见。
|
|
197
|
+
`<type>:<ref>` 词表:`node claim evidence source query kb artifact task skill`。`/api/node` 同时返回双向 `related[]`,WebUI 节点详情直接可见。
|
|
192
198
|
|
|
193
199
|
### task:任务状态机(todo → doing → done)
|
|
194
200
|
|
|
195
201
|
```bash
|
|
196
|
-
ygl-trees task add "<标题>" [--note ...]
|
|
202
|
+
ygl-trees task add "<标题>" [--note ...] # 建任务(todo)
|
|
203
|
+
ygl-trees task add "验证 X" --node <tree>/<key> # 建任务并挂到树节点(tracked-by)
|
|
197
204
|
ygl-trees task list [--status todo|doing|done]
|
|
198
205
|
ygl-trees task doing <id> | task done <id> # 推进(每次状态变更留痕 events)
|
|
199
206
|
```
|
|
200
207
|
|
|
201
|
-
任务本体是 `artifacts` 的 `kind='task'` + meta 状态信封(**没有独立的 tasks 表**)——与产出工件同源,可被 `rel ... tracked-by`
|
|
208
|
+
任务本体是 `artifacts` 的 `kind='task'` + meta 状态信封(**没有独立的 tasks 表**)——与产出工件同源,可被 `rel ... tracked-by` 挂到节点(`task add --node` 一步到位,`task:<id>` 也是合法引用类型)。
|
|
202
209
|
|
|
203
210
|
### produce spec / design:工程产出形态
|
|
204
211
|
|
|
@@ -246,15 +253,18 @@ CJK 检索是个坑:FTS5 默认 `unicode61` 会把整句中文当成一个 tok
|
|
|
246
253
|
|
|
247
254
|
- **写入幂等**:`claim / evidence / query / kb / job` 的写命令按内容 hash 判重,重复执行返回已存在行(`! duplicate, kept existing`),Agent 重试不产生脏数据;`--force` 显式保留重复(job 用标题序号后缀)
|
|
248
255
|
- **完整备份**:`db export <file>` 覆盖全部数据表(含七张科技树表)并输出逐表行数摘要;dump 自带 `PRAGMA foreign_keys` 开关,可直接重放恢复。`--lean` 跳过闭包/拓扑等派生表数据
|
|
249
|
-
- **PostgreSQL 镜像/迁移**:`db
|
|
250
|
-
db timeline growth visualization (events/day)
|
|
251
|
-
db workspace list|create multi-workspace management
|
|
252
|
-
db obsidian [dir] export as Obsidian markdown vault
|
|
253
|
-
db sync pg <url>` 把整库单向全量镜像到 PG(可刷新,供 SQL 工具/团队分析);`db migrate pg <url> [--fresh]` 一次性完整保真迁移(FK/UNIQUE/索引约束齐全,目标库可独立持有)。两者都不做双后端同写,中文检索在 PG 侧用 tsvector+GIN 等价召回(详见 docs/pg-compat.md)。url 可走环境变量 `YGL_PG_URL`;`pg` 为可选依赖,不用 PG 则零影响
|
|
256
|
+
- **PostgreSQL 镜像/迁移**:`db sync pg <url>` 把整库单向全量镜像到 PG(可刷新,供 SQL 工具/团队分析);`db migrate pg <url> [--fresh]` 一次性完整保真迁移(FK/UNIQUE/索引约束齐全,目标库可独立持有)。两者都不做双后端同写,中文检索在 PG 侧用 tsvector+GIN 等价召回(详见 docs/pg-compat.md)。url 可走环境变量 `YGL_PG_URL`;`pg` 为可选依赖,不用 PG 则零影响
|
|
254
257
|
- **TypeORM 查询层**(0.8.0 起,研究域试点 `project show`):实体是 schema v8 的类型化快照(`synchronize` 永久 false,迁移权威仍在 user_version 轨道;FTS5/PRAGMA 路径保持裸 SQL)。依赖 typeorm + better-sqlite3 + reflect-metadata
|
|
255
258
|
- **重复可见**:`db dups` 列出同内容多行(含迁移前存量重复)
|
|
256
259
|
- **自动迁移**:v2 老库首次打开自动升级 schema v3(补 content_hash 列 + 回填 + 唯一索引),无人工介入
|
|
257
260
|
|
|
261
|
+
```bash
|
|
262
|
+
db time-travel "<ts>" # 工作区在历史时刻的状态
|
|
263
|
+
db timeline [--actor <a>] [--session <s>] # events/day 增长视图;过滤时附最近 20 条原始事件(多 Agent 对账)
|
|
264
|
+
db workspace list|create # 多工作区管理
|
|
265
|
+
db obsidian [dir] # 导出 Obsidian markdown vault
|
|
266
|
+
```
|
|
267
|
+
|
|
258
268
|
---
|
|
259
269
|
|
|
260
270
|
## 四、调度
|
|
@@ -284,7 +294,7 @@ ygl-trees agent ask "<question>" natural language interface
|
|
|
284
294
|
## 五b、开发与运维工具
|
|
285
295
|
|
|
286
296
|
```bash
|
|
287
|
-
pnpm test # 四段制回归:unit (vitest
|
|
297
|
+
pnpm test # 四段制回归:unit (vitest 172 例) + build (tsc + tsdown) + demo(101 条断言)+ contract:audit(86 项)
|
|
288
298
|
pnpm bench # 性能基准七席(startup/写路径/检索/索引),每席含 RSS 内存端点 → tmp/bench-results.json
|
|
289
299
|
node benchmarks/bench.js --quick # 缩小规模快速跑
|
|
290
300
|
pnpm pack:check # 发布就绪门禁:打包 → 隔离安装 → 驱动发布产物跑命令面 + --json 纯净性
|
|
@@ -308,7 +318,7 @@ serve。serve 从不取写锁(WAL 并发读写安全),`db unlock` 也以
|
|
|
308
318
|
**多会话安全(0.79)**:`tree use` / `project use` 全部落 `tree.use` / `project.use` 事件(带
|
|
309
319
|
`YGL_SESSION` 会话标识);`agent brief` 的 `selection_changed` 字段暴露最近 10 分钟的选择变更,
|
|
310
320
|
跨会话变更会置顶提示命令带 `-t/-p` 固定上下文。`kb add` 回执自带 `verified` 自检与工作区回显,
|
|
311
|
-
`doctor` 第 10 项回放近 2 天 kb/source/evidence
|
|
321
|
+
`doctor` 第 10 项回放近 2 天 kb/source/evidence 写事件对账基表,幻影写入当场点名。`doctor --fix`(0.82)把已知幻影标记 `reconciled`(payload 留痕、扫描跳过、审计轨迹保留)——db 恢复/导入实验造成的旧幻影一键对账。
|
|
312
322
|
|
|
313
323
|
**提交门禁(无 CI 环境的等效方案)**:`.githooks/pre-push` —— push 分支跑 `pnpm test`,
|
|
314
324
|
**push tag 追加 `pnpm pack:check`**;旁路只能显式 `YGL_SKIP_HOOKS=1`。安装一次:
|
package/dist/apps/cli/src/bin.js
CHANGED
|
@@ -210,6 +210,8 @@ ${(0, fmt_1.paint)(fmt_1.C.bold, "tree / node", true)} tech-tree node model
|
|
|
210
210
|
(--eval: eval 题型经决策模型判定;
|
|
211
211
|
boolean P / choice P(期望答案) / score ±1 灰带)
|
|
212
212
|
node ready [--state k=v] [--eval] currently unlockable set
|
|
213
|
+
(--all: sweep every tree — no tree use needed)
|
|
214
|
+
node cond --due [--days n] [--eval] eval gates with YYYY-MM-DD deadlines due in n days
|
|
213
215
|
node path <key> dependency-order path to target (all locked ancestors; OR branches not optimized)
|
|
214
216
|
node parents|children <key> direct relations
|
|
215
217
|
node ancestors|descendants <key> transitive, via closure index
|
|
@@ -694,7 +696,8 @@ function generateLlmsManifest() {
|
|
|
694
696
|
["node cond <key> --name <c> --kind <k> [--op eval] [--value \"<question>\"]", "add condition (eval = decision model gate)"],
|
|
695
697
|
["node index", "rebuild closure + topo order"],
|
|
696
698
|
["node can <key> [--state k=v] [--eval]", "can unlock? (required vs optional + cost)"],
|
|
697
|
-
["node ready", "currently unlockable set"],
|
|
699
|
+
["node ready [--all]", "currently unlockable set (--all: every tree)"],
|
|
700
|
+
["node cond --due [--days n] [--eval]", "eval gates with deadlines due in n days"],
|
|
698
701
|
["node path <key>", "dependency-order path (OR branches not optimized)"],
|
|
699
702
|
["node unlock <key>", "mark unlocked"],
|
|
700
703
|
["node list", "list with state column (locked/unlocked)"],
|