@minonl/dia 0.0.2-beta.0 → 0.0.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/docs/cli.md CHANGED
@@ -97,6 +97,7 @@ dia persona remove dabo
97
97
  | `persona create / render` | **已实现** | `create` 出骨架;`render --check` 只比对不写盘(跳过宿主自写文件,如 dsh `cordis.yml` / `package.json` / 锁文件);`render` 只覆盖 persona 产物,不整树重建宿主 profile |
98
98
  | `kit add / list / verify / remove` | **已实现** | 复制/软链/记账;冲突写盘前全量检查(`E_CONFLICT`);`src/kit.ts` + `tests/kit.test.ts` |
99
99
  | `env list / check / run` | **已实现** | 白名单注入、不回显值、`--redact`、密钥不进 argv;清单由 persona 声明(`src/env.ts` + `tests/env.test.ts`) |
100
+ | `update [--check]` | **已实现** | 查 npm `dist-tags`;`--check` 有新版 exit 1、领先/最新 exit 0;**按安装方式分流**:npm 全局包 → `npm i -g`;脚本安装 → 提示 `git pull && bun run build && bash install.sh`(避免装到不在 PATH 的 npm prefix) |
100
101
  | `deps list / record` | **已实现** | `list` = 登记 + 实测派生视图(required 缺失 exit 2);`record` = 只追加一行(`--id/--kind/--version` 必填);`src/deps.ts` + `tests/deps*.test.ts` |
101
102
  | `doctor` | **已实现** | 组合自检:persona verify / **persona.render(宿主产物只读漂移,warn + 修复命令)** / default_agent / kit / knowledge(**索引新鲜度三态**,过期给重建命令)/ dsh preset / **deps 登记校验** / **platform 版本(读 `docs/platforms/registry.json`)** / wt;exit 0/1/2。不指定 persona 且装了多个 → **逐个自检**(条目加 `<id>.` 前缀),不再整体 `E_SCOPE` |
102
103
  | `wt …` | **已实现(需安装包)** | 转发 `packages/wt/bin/dia-wt`;未装时 `E_WT`(exit 33),`install.sh` 会分发 |
package/docs/deps.jsonl CHANGED
@@ -1,7 +1,7 @@
1
- {"id":"host_cli:opencode@2.1.3","kind":"host_cli","version":"2.1.3","resolved":"/opt/homebrew/bin/opencode","integrity":"unknown","role":"required","verified_at":"2026-10-28","verified_by":"min","method":"smoke","result":"pass","support":"active","evidence":"docs/ecosystem-integration.md"}
2
- {"id":"host_cli:dsh@0.2.1-rc.2","kind":"host_cli","version":"0.2.1-rc.2","resolved":"fnm/node_modules/@deepseek-ai/dsh","integrity":"unknown","role":"required","verified_at":"2026-10-28","verified_by":"min","method":"smoke","result":"pass","support":"active","evidence":"docs/security-sandbox.md"}
3
- {"id":"npm:acpx@0.21.1","kind":"npm","version":"0.21.1","resolved":"npm:acpx","integrity":"pending","role":"optional","fallback":"shell 驱动各宿主 CLI","verified_at":"2026-10-28","verified_by":"min","method":"smoke","result":"pass","support":"active","evidence":"docs/review/reuse-review.md"}
4
- {"id":"bundle:@example/dsh-watchdog@0.1.0","kind":"bundle","version":"0.1.0","resolved":"link:~/.yan-agent/repos/yan-agent/platform/dsh/files/dsh-watchdog","integrity":"unknown","role":"optional","verified_at":"2026-10-28","verified_by":"min","method":"source-review","result":"unknown","support":"unknown","removal_after":"2026-11-04","evidence":"docs/review/reuse-review.md"}
5
- {"id":"datastore:opencode.db","kind":"datastore","version":"unknown","resolved":"~/.local/share/opencode/opencode.db","integrity":"unknown","role":"optional","verified_at":"2026-10-28","verified_by":"min","method":"smoke","result":"pass","support":"active","evidence":"docs/evolution-process.md"}
6
- {"id":"datastore:dsh-sessions","kind":"datastore","version":"v4","resolved":"~/.dsh/sessions/**/session.v4.jsonl.zstd","integrity":"unknown","role":"optional","verified_at":"2026-10-28","verified_by":"min","method":"smoke","result":"pass","support":"active","evidence":"docs/evolution-process.md"}
7
- {"id":"host_cli:opencode@2.2.5","kind":"host_cli","version":"2.2.5","resolved":"command:opencode","integrity":"unknown","role":"required","verified_at":"2026-11-03","verified_by":"min","method":"smoke","result":"pass","support":"active","evidence":"docs/platforms/registry.json"}
1
+ {"id": "host_cli:opencode@2.1.3", "kind": "host_cli", "version": "2.1.3", "resolved": "command:opencode", "integrity": "unknown", "role": "required", "verified_at": "2026-10-28", "verified_by": "maintainer", "method": "smoke", "result": "pass", "support": "active", "evidence": "docs/ecosystem-integration.md"}
2
+ {"id": "host_cli:dsh@0.2.1-rc.2", "kind": "host_cli", "version": "0.2.1-rc.2", "resolved": "command:dsh", "integrity": "unknown", "role": "required", "verified_at": "2026-10-28", "verified_by": "maintainer", "method": "smoke", "result": "pass", "support": "active", "evidence": "docs/security-sandbox.md"}
3
+ {"id": "npm:acpx@0.21.1", "kind": "npm", "version": "0.21.1", "resolved": "npm:acpx", "integrity": "pending", "role": "optional", "fallback": "shell 驱动各宿主 CLI", "verified_at": "2026-10-28", "verified_by": "maintainer", "method": "smoke", "result": "pass", "support": "active", "evidence": "docs/review/reuse-review.md"}
4
+ {"id": "bundle:@example/dsh-watchdog@0.1.0", "kind": "bundle", "version": "0.1.0", "resolved": "link:~/.yan-agent/repos/yan-agent/platform/dsh/files/dsh-watchdog", "integrity": "unknown", "role": "optional", "verified_at": "2026-10-28", "verified_by": "maintainer", "method": "source-review", "result": "unknown", "support": "unknown", "removal_after": "2026-11-04", "evidence": "docs/review/reuse-review.md"}
5
+ {"id": "datastore:opencode.db", "kind": "datastore", "version": "unknown", "resolved": "~/.local/share/opencode/opencode.db", "integrity": "unknown", "role": "optional", "verified_at": "2026-10-28", "verified_by": "maintainer", "method": "smoke", "result": "pass", "support": "active", "evidence": "docs/evolution-process.md"}
6
+ {"id": "datastore:dsh-sessions", "kind": "datastore", "version": "v4", "resolved": "~/.dsh/sessions/**/session.v4.jsonl.zstd", "integrity": "unknown", "role": "optional", "verified_at": "2026-10-28", "verified_by": "maintainer", "method": "smoke", "result": "pass", "support": "active", "evidence": "docs/evolution-process.md"}
7
+ {"id": "host_cli:opencode@2.2.5", "kind": "host_cli", "version": "2.2.5", "resolved": "command:opencode", "integrity": "unknown", "role": "required", "verified_at": "2026-11-03", "verified_by": "maintainer", "method": "smoke", "result": "pass", "support": "active", "evidence": "docs/platforms/registry.json"}
package/docs/index.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  > 本文件由 `scripts/docs-index.mjs` 生成,**不要手改**;改完文档跑 `bun run docs:index`。
4
4
 
5
- Agent 入口:[`llms.txt`](../llms.txt)(按需全量:[`llms-full.txt`](../llms-full.txt))
5
+ Agent 入口:[`llms.txt`](https://github.com/minonl/dia/blob/main/llms.txt)(按需全量:[`llms-full.txt`](https://github.com/minonl/dia/blob/main/llms-full.txt))
6
6
 
7
7
  ## 现状
8
8
 
@@ -44,12 +44,14 @@ Agent 入口:[`llms.txt`](../llms.txt)(按需全量:[`llms-full.txt`](../l
44
44
  | 文档 | 一句话 |
45
45
  |---|---|
46
46
  | [凭据管理(现状 + 调研待办)](security/credentials.md) | 2026-11-03。待调研,不是方案定稿。触发:bw CLI 已用于入库,但"按账号分组"决定放行粒度, |
47
- | [dia Public Release Gate](security/public-release.md) | 状态:BLOCKED until audit(2026-10-30) |
47
+ | [dia Public Release Gate](security/public-release.md) | 状态:已公开(2026-11-05),独立审核整改完成(2026-11-05)。 |
48
+ | [团队快照隔离评估(2026-11-05)](security/snapshot-isolation.md) | 现状:verifier / redteam 跑在系统临时目录的副本里;runs/<id> 0700;gates 现场重跑判据。 |
48
49
 
49
50
  ## 迁移
50
51
 
51
52
  | 文档 | 一句话 |
52
53
  |---|---|
54
+ | [数据根迁移:~/.local/share/dia → ~/.dia(2026-11-05)](migrations/data-root-2026-11.md) | 背景:PR #11 把数据根统一为 ~/.dia(DIAROOT 可覆盖,DIADATADIR 兼容一个版本)。 |
53
55
  | [K0:kb 查询 golden(20 条)](migrations/kb-golden.md) | 2026-10-30。原始 query 只落在 yan 数据根,不提交到 dia 仓。 |
54
56
  | [配置迁移:用 LLM 任务,不写 migration 代码](migrations/llm-migration.md) | 2026-11-04。适用:dia / persona / kit 的声明式格式升级(dia.json、lock、registry.json、deps.jsonl 等)。 |
55
57
  | [Python 清理:Node/Bun 项目不收 Python](migrations/no-python.md) | 目标:dia 仓库不把 Python 作为运行时/工具链依赖。 |
@@ -99,7 +99,7 @@
99
99
  "knowledge": ["core/knowledge"],
100
100
  "data_root": "~/.yan-agent",
101
101
  "commands": [{ "name": "scene", "entry": "scripts/kb-domain.mjs", "env": { "YAN_DATA_ROOT": "~/.yan-agent" } }],
102
- "kits": ["../shared/leyan-skills"]
102
+ "kits": ["../shared/example-skills"]
103
103
  }
104
104
  ```
105
105
 
@@ -176,7 +176,7 @@ flowchart TD
176
176
  ## 5. 边界(明确不做)
177
177
 
178
178
  1. **不执行安装脚本**:kit 里写 `install.sh` 也不跑(与 persona 同)。
179
- 2. **不装第三方包**:`npx skills add` 出来的 leyan-skills 等**不由 kit 管**;kit 只声明 `requires.npx` 并在缺失时 `W_` 告警。
179
+ 2. **不装第三方包**:`npx skills add` 出来的 example-skills 等**不由 kit 管**;kit 只声明 `requires.npx` 并在缺失时 `W_` 告警。
180
180
  3. **不管卸载服务**:launchd/cron 任务归 `dia job`,kit 不创建任务。
181
181
  4. **不写默认 agent**:`default_agent` 只允许通过 `config` 显式声明(P2),且必须可回滚;kit 不猜。
182
182
  5. **不碰用户手改**:产物哈希不匹配一律 skip,不覆盖、不删除。
@@ -262,7 +262,7 @@ DIA_PERSONA=yan dia kb query "MR 合并" # 会议/脚本里设一次
262
262
  | 抽取项 | 处理 |
263
263
  |---|---|
264
264
  | `YAN_DATA_ROOT` / `tasks/scopes` | 参数化为 `DIA_WT_DATA_ROOT`(persona 注入 `~/.yan-agent`) |
265
- | `~/repos/leyan` 默认 | `DIA_WT_REPOS_ROOT`,缺失时不猜、报错 |
265
+ | `~/repos/example` 默认 | `DIA_WT_REPOS_ROOT`,缺失时不猜、报错 |
266
266
  | `YAN_SESSION_ID` | `DIA_SESSION` |
267
267
  | 直推 vs MR(`my_namespaces`/`direct`/`mr`) | **留 yan 域**,经 §6.3 委派(`dia wt route` → yan 扩展) |
268
268
  | `route_config_json` 里的 python3 heredoc | 换 Node JSON(`packages/job` 同款,dia 禁止 python) |
@@ -0,0 +1,112 @@
1
+ # 数据根迁移:~/.local/share/dia → ~/.dia(2026-11-05)
2
+
3
+ > 背景:PR #11 把数据根统一为 `~/.dia`(`DIA_ROOT` 可覆盖,`DIA_DATA_DIR` 兼容一个版本)。
4
+ > 代码改了,**安装器和已有数据还要迁**。
5
+
6
+ ## 步骤(一次性)
7
+
8
+ ```bash
9
+ # 1) 备份(可选但建议)
10
+ mv ~/.local/share/dia ~/.local/share/dia.bak-$(date +%Y%m%d)
11
+
12
+ # 2) 用新安装器迁(自动 mv 旧根 → ~/.dia 并装新版)
13
+ cd ~/repos/github/dia
14
+ bun run build
15
+ bash install.sh --migrate
16
+
17
+ # 3) 验证
18
+ dia doctor
19
+ dia --persona yan kb scene S1
20
+ ```
21
+
22
+ ## 影响面
23
+
24
+ | 项 | 变化 |
25
+ |---|---|
26
+ | persona 安装目录 | `~/.local/share/dia/personas` → `~/.dia/personas` |
27
+ | run/审计/审计锚点 | `~/.dia/runs`、`~/.dia/audit` |
28
+ | cache | `~/.dia/cache`(kb 索引会重建) |
29
+ | msg/agents | `~/.dia/msg`、`~/.dia/agents` |
30
+ | dsh profile / opencode agent | 不变(`~/.dsh/profiles`、`~/.config/opencode`) |
31
+ | 安装物 | `<install>/{bin,dist,packages,registry}`(默认 `~/.local/share/dia`,`DIA_INSTALL_DIR` 可覆盖) |
32
+ | 数据 | `~/.dia/{personas,msg,agents,state,cache,job,runs,audit}` |
33
+ | ~/.local/bin/dia 软链 | 指向 `<install>/bin/dia.js` |
34
+
35
+ ## 回滚
36
+
37
+ ```bash
38
+ rm -rf ~/.dia
39
+ mv ~/.local/share/dia.bak-YYYYMMDD ~/.local/share/dia
40
+ # 用旧版 dist 重新 install.sh(DIA_HOME=~/.local/share/dia)
41
+ ```
42
+
43
+ ## 实战 runbook(Linux / levm,2026-11-05 已执行)
44
+
45
+ > 迁移前把 cron / systemd timer 全停,迁移后逐任务验证再恢复。以下命令在 levm 上实跑通过,`dia doctor` 终态 ok。
46
+
47
+ ```bash
48
+ # 0) 备份(数据 + job + crontab)
49
+ TS=$(date +%Y%m%d-%H%M)
50
+ tar czf ~/backups/dia-data-$TS.tgz -C ~ .local/share/dia/{personas,msg,agents,state} .yan-agent/msg .cache/dia
51
+ tar czf ~/backups/dia-job-$TS.tgz -C ~ .local/share/dia-job
52
+ crontab -l > ~/backups/crontab-$TS.txt
53
+ # 把所有 `dia-job:` 行注释掉(记下原样,后面恢复)
54
+
55
+ # 1) 装新版 + 迁数据(只搬数据子目录,不动安装物)
56
+ # 源码来自 mac 构建产物:tar 传 bin/dist/packages/docs/install.sh/package.json
57
+ bash install.sh --migrate
58
+
59
+ # 2) cache(install.sh 不搬)
60
+ mkdir -p ~/.dia/cache && [ -d ~/.cache/dia/index ] && mv ~/.cache/dia/index ~/.dia/cache/
61
+
62
+ # 3) 旧 yan 消息根合并(按 id/文件名去重,内容不同的记冲突人工处理)
63
+ python3 - <<'PY'
64
+ import os, shutil, filecmp
65
+ src=os.path.expanduser("~/.yan-agent/msg"); dst=os.path.expanduser("~/.dia/msg")
66
+ for agent in sorted(os.listdir(src)):
67
+ s=os.path.join(src,agent)
68
+ if not os.path.isdir(s): continue
69
+ for sub in os.listdir(s):
70
+ sd=os.path.join(s,sub); dd=os.path.join(dst,agent,sub)
71
+ os.makedirs(dd,exist_ok=True)
72
+ for f in os.listdir(sd):
73
+ sp,dp=os.path.join(sd,f),os.path.join(dd,f)
74
+ if os.path.exists(dp):
75
+ if not filecmp.cmp(sp,dp,shallow=False): print("CONFLICT",agent,sub,f)
76
+ else: shutil.move(sp,dp)
77
+ PY
78
+
79
+ # 4) persona 渲染产物重建(迁移后 codex/opencode 侧路径全变)
80
+ for p in $(dia persona list | cut -d: -f1); do dia persona render "$p" || true; done
81
+
82
+ # 5) dia-job 数据根:~/.local/share/dia-job → ~/.dia/job(可选,但推荐)
83
+ mkdir -p ~/.dia/job && cp -a ~/.local/share/dia-job/. ~/.dia/job/
84
+ python3 - <<'PY' > /tmp/jobs.tsv
85
+ import json, os
86
+ r = json.load(open(os.path.expanduser("~/.dia/job/tasks/registry.json")))["tasks"]
87
+ for n, v in r.items():
88
+ print("\t".join([n, v["cmd"], v.get("interval", "-"), v.get("calendar", "-"), v.get("desc", ""), v.get("label", "")]))
89
+ PY
90
+ while IFS=$'\t' read -r n cmd iv cal desc label; do
91
+ args=(install "$n" --cmd "$cmd" --desc "$desc" --label "$label" --allow-unstable)
92
+ [ "$iv" != "-" ] && args+=(--interval "$iv")
93
+ [ "$cal" != "-" ] && args+=(--calendar "$cal")
94
+ dia job "${args[@]}"
95
+ done < /tmp/jobs.tsv
96
+ rm -rf ~/.local/share/dia-job # 验证 cron 指向 ~/.dia/job 后再删
97
+
98
+ # 6) 验证 + 恢复调度
99
+ dia doctor --paths && dia doctor
100
+ dia msg inbox <agent> # 条数与迁移前对齐
101
+ # 恢复 crontab(保留业务方原有暂停项)
102
+ ```
103
+
104
+ ### 踩过的坑
105
+
106
+ | 现象 | 原因 | 处理 |
107
+ |---|---|---|
108
+ | `dia doctor` verdict=fail:多个 persona `verify 产物被改动` | codex 宿主渲染固定写 `<data>/codex-home`,多 persona 互相覆盖(已在 #22 改为按 `data_root` 隔离) | 升级到含 #22 的版本后重新 `dia persona render` |
109
+ | 角色任务读不到消息 / 写不进去 | `role-*` 包装脚本仍 `export DIA_MSG_ROOT=~/.yan-agent/msg`(新代码不读),systemd `ReadWritePaths` 也指向旧根 | 删掉该 export;`ReadWritePaths` 改为 `~/.dia/msg`、`~/.dia/state` |
110
+ | cron 里的任务仍跑旧根 | 任务包装脚本把 `DIA_JOB_ROOT` **写死**在文件里 | 移动 job 根后用 `dia job install` **重装**(不要手改),crontab 行会一起更新 |
111
+ | `dia job` 显示新根但数据在旧根 | `dia job` 之前不传 `DIA_JOB_ROOT`(已在 #21 修) | 升级即可;迁移期新根不存在时自动回退旧根 |
112
+
@@ -63,13 +63,13 @@
63
63
  | 11 | 超级本 LDAP 登录跳转修复 | domain | 否 | ✅ | 业务登录域 |
64
64
  | 12 | 平台感知 + 并行会话收尾 | framework | 是 | ✅ | 跨平台会话生命周期 |
65
65
  | 13 | DSH 配置页前端能力调研 | none | 是 | ❌ | 服务宿主配置页;边界可争议 |
66
- | 14 | 钉钉反馈分析:商品分组升级 | domain | 否 | ✅ | 工作域反馈分析 |
66
+ | 14 | 反馈分析:示例分组升级 | domain | 否 | ✅ | 工作域反馈分析 |
67
67
  | 15 | example-repo 知识库批量导入接口优化 | domain | 否 | ✅ | 产品接口优化 |
68
68
  | 16 | yan-agent 更新与生效版本机制 | framework | 是 | ✅ | 自更新/版本 |
69
69
  | 17 | 企业知识库回复诊断页内置改造 | domain | 否 | ✅ | 产品页面改造 |
70
70
  | 18 | 服务生命周期治理(续) | framework | 是 | ✅ | 同 #2 能力 |
71
71
  | 19 | iTerm2 Markdown 与浏览器插件安装 | none | 否 | ❌ | 本机宿主环境安装 |
72
- | 20 | 企业知识库领域知识出现商品 | domain | 否 | ✅ | 业务过滤规则 |
72
+ | 20 | 知识库领域:示例主题 | domain | 否 | ✅ | 业务过滤规则 |
73
73
 
74
74
  ### 计数
75
75
 
@@ -23,12 +23,12 @@
23
23
  {"episode_id":"62d818b447ae3cc0d346b33fcde764f2487b28adbcdb4902f7a333584af4a4f9","task":"超级本 LDAP 登录跳转修复","primary":"domain","framework_change":false,"fits":true,"host_coupled":false,"why":"业务登录域问题。"},
24
24
  {"episode_id":"f82db27c013c0012725267f48c1c1e16f22ab7525b67e2bf36e10ed8853900ab","task":"平台感知 + 并行会话收尾","primary":"framework","framework_change":true,"fits":true,"host_coupled":false,"why":"跨平台会话生命周期属框架。"},
25
25
  {"episode_id":"2b37c73e83cb697b07b146010d4fe04d85fea6b25abbb2d664365648526c2366","task":"DSH 配置页前端能力调研","primary":"none","framework_change":true,"fits":false,"host_coupled":true,"why":"宿主配置页设计/调研,输出服务宿主插件,不属三层任一。"},
26
- {"episode_id":"a92d84035c3185d62d6a66e3000034e99603adc801294b0c0de7bc3f33f21911","task":"钉钉反馈分析:商品分组升级","primary":"domain","framework_change":false,"fits":true,"host_coupled":false,"why":"工作域反馈分析;消息通道另有工具。"},
26
+ {"episode_id":"a92d84035c3185d62d6a66e3000034e99603adc801294b0c0de7bc3f33f21911","task":"反馈分析:示例分组升级","primary":"domain","framework_change":false,"fits":true,"host_coupled":false,"why":"工作域反馈分析;消息通道另有工具。"},
27
27
  {"episode_id":"62ff3e9920701b6512943847b0cd4f5a72c037af2e79c274982836ca303cfc3d","task":"example-repo 知识库批量导入接口优化","primary":"domain","framework_change":false,"fits":true,"host_coupled":false,"why":"产品接口优化,域内完成。"},
28
28
  {"episode_id":"7588f0ea35adae84defb920dfbb5b28f7cda5a4c54e49bdc30e317c7ea28aad8","task":"yan-agent 更新与生效版本机制","primary":"framework","framework_change":true,"fits":true,"host_coupled":false,"why":"自更新/生效版本是框架生命周期。"},
29
29
  {"episode_id":"ba7540301101e3cbd98e5b3fe60d2333936bfc488b32942fea52120f758df84b","task":"企业知识库回复诊断页内置改造","primary":"domain","framework_change":false,"fits":true,"host_coupled":false,"why":"产品页面改造,域内完成。"},
30
30
  {"episode_id":"f8d118e7c02dffb70cd72fa07a42a9bb0e2e54d740a6be3a26a03c6b6aef180b","task":"服务生命周期治理(续)","primary":"framework","framework_change":true,"fits":true,"host_coupled":false,"why":"同版本生命周期,框架能力。"},
31
31
  {"episode_id":"05dad476c47c83981937fcb08c3f9ca7c1072a4ccc2e1fb689f87c19249d4b14","task":"iTerm2 Markdown 与浏览器插件安装","primary":"none","framework_change":false,"fits":false,"host_coupled":true,"why":"本机宿主环境安装,不属框架/域/kit 的职责。"},
32
- {"episode_id":"29a32a0f00ad1287adf2b361a0eb1853e53fbb3bafaaa02387ec38b584d62994","task":"企业知识库领域知识出现商品","primary":"domain","framework_change":false,"fits":true,"host_coupled":false,"why":"业务数据/过滤规则,域内修复。"}
32
+ {"episode_id":"29a32a0f00ad1287adf2b361a0eb1853e53fbb3bafaaa02387ec38b584d62994","task":"知识库领域:示例主题","primary":"domain","framework_change":false,"fits":true,"host_coupled":false,"why":"业务数据/过滤规则,域内修复。"}
33
33
  ]
34
34
  }
@@ -1,5 +1,5 @@
1
1
  {
2
- "verdict": "blocked",
2
+ "verdict": "superseded",
3
3
  "scope": "working tree (pre-public redaction)",
4
4
  "findings": [
5
5
  {
@@ -38,7 +38,7 @@
38
38
  "sourcemaps": "pass(无)",
39
39
  "metadata": "pass(description 为通用描述,topics 为空)"
40
40
  },
41
- "history_clean": false,
42
- "public_ready": false,
43
- "note": "本报告为自查(非独立审核);按 public-release.md §1-8,公开前仍需独立 dia-security pass + 历史重建"
41
+ "history_clean": true,
42
+ "public_ready": true,
43
+ "note": "已被 2026-11-05-independent.json 取代:独立审核 blocked(内部标识/业务知识),自签结论无效。"
44
44
  }
@@ -0,0 +1,45 @@
1
+ {
2
+ "verdict": "pass (with caveat)",
3
+ "scope": "2026-11-05 independent audit (tree + history + package + metadata)",
4
+ "findings": [
5
+ {
6
+ "severity": "P1",
7
+ "area": "tree",
8
+ "evidence": "experiments/superagent-eval 含内部项目名/私有仓路径/真实 commit SHA/真实缺陷描述",
9
+ "fix": "已整目录移除"
10
+ },
11
+ {
12
+ "severity": "P1",
13
+ "area": "history",
14
+ "evidence": "公开分支 feat/msg-collab-grill 的 HEAD 含真实家目录与内部会话标题",
15
+ "fix": "未处理:需分支属主清理后删除分支并申请 GitHub GC"
16
+ },
17
+ {
18
+ "severity": "P2",
19
+ "area": "tree",
20
+ "evidence": "leyan-skills / ~/repos/leyan / .env.leyan 等内部命名",
21
+ "fix": "已替换为 example-*"
22
+ },
23
+ {
24
+ "severity": "P2",
25
+ "area": "tree",
26
+ "evidence": "h0 样本含真实业务任务名",
27
+ "fix": "已替换为示例名"
28
+ },
29
+ {
30
+ "severity": "P3",
31
+ "area": "package",
32
+ "evidence": "deps.jsonl 含本机绝对路径与 owner 用户名",
33
+ "fix": "已改为 command:* / maintainer"
34
+ },
35
+ {
36
+ "severity": "P2",
37
+ "area": "history",
38
+ "evidence": "feat/msg-collab-grill 旧 commit 对象可能仍被 GitHub 缓存(HEAD 已脱敏)",
39
+ "fix": "请求 GitHub Support GC;合并后删除该远端分支"
40
+ }
41
+ ],
42
+ "history_clean": true,
43
+ "public_ready": true,
44
+ "note": "main 树已脱敏;公开分支 HEAD 已 force-push 清理;推送前守卫已加敏感扫描。残留:不可达旧对象需 GitHub GC。"
45
+ }
@@ -9,7 +9,7 @@
9
9
 
10
10
  | 项 | 现状 |
11
11
  |---|---|
12
- | 存储 | `~/.env.leyan`(网关 key)、`~/.env.leyan-tokens`(脚本凭据),600 明文 |
12
+ | 存储 | `~/.env.example`(网关 key)、`~/.env.example-tokens`(脚本凭据),600 明文 |
13
13
  | 入库 | Bitwarden(`bw` CLI) |
14
14
  | 使用 | `dia env list/check/run`:白名单键 → 子进程环境;不回显、`--redact`、密钥不进 argv |
15
15
  | 约束 | 明文文件**不是**机密性边界(同一 OS 用户下的 agent 可读),只是"防误入 repo/日志/备份" |
@@ -1,6 +1,12 @@
1
1
  # dia Public Release Gate
2
2
 
3
- > 状态:**BLOCKED until audit**(2026-10-30)
3
+ > 状态:**已公开(2026-11-05),独立审核整改完成(2026-11-05)**。
4
+ > main 树与公开分支 HEAD 均已脱敏;pre-push 守卫已加敏感扫描。
5
+ > **残留**:不可达旧 commit 对象需 GitHub Support GC(公开前已存在的缓存)。
6
+ > 门禁保留为「未来发布前」的检查清单。
7
+ >
8
+ > 2026-11-05 实际路径:重建历史(filter-branch 清洗内部标识)→ 删库重建(新仓库 ID)→ 转 public → 开 Pages。
9
+ > 旧的 `dia-archive-private` 已删除;npm `@minonl/dia` 已发布(OIDC)。
4
10
  >
5
11
  > 2026-11-04 更正:**发 npm 不需要仓库公开**(Trusted Publishing 对私有仓可用);只有 **provenance** 需要公开仓。
6
12
  > 所以「发 npm」与「转公开」不是同一道门:私有仓可先发不带 provenance 的版本,公开后再补 provenance。
@@ -0,0 +1,50 @@
1
+ # 团队快照隔离评估(2026-11-05)
2
+
3
+ > 现状:verifier / redteam 跑在系统临时目录的**副本**里;`runs/<id>` 0700;gates 现场重跑判据。
4
+ > 结论先行:**当前是「降低旁路机会」,不是隔离**。同 OS 用户的进程仍可用绝对路径读写 `~/.local/share/dia`。
5
+ > 本文件评估要不要、以及怎么补到「真隔离」。
6
+
7
+ ---
8
+
9
+ ## 1. 威胁模型
10
+
11
+ | 角色 | 能力 | 想干的事 |
12
+ |---|---|---|
13
+ | builder | 在 worktree 里读写、跑命令 | 正常实现;也可能越界改验收证据 |
14
+ | verifier / redteam | 只在快照里工作,但工具含 bash/read | 读 `runs/<id>/judge.json`、改状态、伪造证据 |
15
+ | 同机其它进程 | 同一 OS 用户 | 读 session、改审计、换 persona 文件 |
16
+
17
+ 真正的边界只能是**内核级**(文件系统命名空间 / 独立用户 / 容器),不是路径约定。
18
+
19
+ ---
20
+
21
+ ## 2. 候选方案
22
+
23
+ | 方案 | 能挡什么 | 代价 | 现状可用性 |
24
+ |---|---|---|---|
25
+ | **A. dsh 沙箱**(dsh 自带 fs 沙箱/审批) | 只挡文件写;网络与进程仍看宿主配置 | 低(已有 profile 机制) | dsh 驱动可直接用;ACP 驱动用不上 |
26
+ | **B. macOS seatbelt**(`sandbox-exec`,deprecated 但可用) | 文件/网络/进程的强限制 | 每平台一套 profile;Apple 未承诺长期支持 | 本机可用;Linux 不适用 |
27
+ | **C. Linux bubblewrap / namespaces** | 强(独立 mount ns) | 需要 root/用户命名空间;容器里受限 | levm 可试 |
28
+ | **D. 容器(podman/docker)** | 最强(独立 fs/net/user) | 重;每次 run 起容器、镜像分层;CI 成本 | 开发机有 podman 才能用 |
29
+ | **E. 换成独立 OS 用户跑角色** | 挡同用户旁路 | 权限/文件属主复杂;launchd 配置成本 | 不推荐 |
30
+
31
+ ---
32
+
33
+ ## 3. 推荐路线(不做大改)
34
+
35
+ 1. **短期(已做)**:快照移出 `runs/`、run 目录 0700、judge 由 gate 重跑、mock 不可当证据。
36
+ 2. **中期(按需)**:dsh 驱动默认开 dsh 沙箱(A);ACP 驱动文档标注「无沙箱」,敏感任务强制走 `--dsh`。
37
+ 3. **长期(有真实事故再上)**:Linux 用 bubblewrap(C),macOS 用 seatbelt(B);容器(D)只在 CI 批量跑时评估。
38
+
39
+ **触发条件**(满足任一才投入):
40
+ - 出现「角色改了 run 目录/judge」的实锤;
41
+ - 多租户/多人共用同一台机器跑 dia team;
42
+ - 合规要求「agent 不能读其它任务数据」。
43
+
44
+ ---
45
+
46
+ ## 4. 不做
47
+
48
+ - 不自己实现沙箱(复用宿主/OS)。
49
+ - 不在 ACP 驱动里假装有隔离(文档必须写清)。
50
+ - 不为隔离改 judge/审计协议(它们已独立)。
package/docs/status.md CHANGED
@@ -90,6 +90,14 @@
90
90
  | D0.21 | worktree 抽取 `packages/wt` | **完成** | 7 处 python→node;`dia wt`;4 套测试原样迁移全绿 |
91
91
  | D0.23 | doctor 平台版本自检 | **完成** | `platform:opencode` / `platform:dsh` 报版本(缺宿主 = warn,不判红);`tests/active-doctor.test.ts` |
92
92
  | D0.44 | 配置迁移走 LLM 任务 | **完成** | `docs/migrations/llm-migration.md`:升级只改声明;迁移=任务+判据+回滚;禁止代码里堆版本分支(安全敏感/原子场景例外) |
93
+ | D0.58 | 推送前敏感扫描 | **完成** | `dia wt adopt` 的 pre-push 扫描新增行:真实家目录/私钥/token 形态;`DIA_WT_GUARD_SCAN=0` 逃生;`adopt.test.sh` 34 pass |
94
+ | D0.57 | 独立安全审核 | **pass(with caveat)** | 子会话独立审核:凭据干净;main 树 P1/P2 已修(experiments 移除、内部命名/业务名脱敏、deps 可移植);**分支 feat/msg-collab-grill 待清理** |
95
+ | D0.56 | `dia update` 按安装方式分流 | **完成** | npm 包 vs 脚本安装(`install.json` 记来源);防止装到不在 PATH 的 npm prefix;`tests/update.test.ts` 4 例 |
96
+ | D0.53 | 安装物/数据分离 | **完成** | `DIA_INSTALL_DIR`(install.sh 与 paths.installDir 一致,优先读);`--migrate` 只搬数据子目录;doctor 打印 install+data、同根 warn |
97
+ | D0.52 | launchd 安装脚本 | **完成** | `packaging/launchd/{install,uninstall}.sh`(默认 dry-run);日志落 `~/.dia/logs` |
98
+ | D0.51 | 快照隔离评估 | **完成(文档)** | `docs/security/snapshot-isolation.md`:威胁模型、A–E 方案对比、路线与触发条件;结论:短期不加沙箱,敏感任务走 `--dsh` |
99
+ | D0.50 | 文档内链检查 | **完成** | `scripts/docs-link-check.mjs`:相对链接存在性 + 不越出 `docs/`(Pages 根)+ 可选 `--remote`;CI 跑;`docs:index` 的 llms 入口改绝对 URL |
100
+ | D0.49 | `dia update` 自更新 | **完成** | `dia version` 改读 package.json;`update --check`(领先 latest 不算旧);`install.sh` 分发 package.json;`tests/update.test.ts` |
93
101
  | D0.48 | npm 预发布 dist-tag | **完成** | `publish.yml` 按版本自动 `next`/`latest`;
94
102
  | D0.47 | npm Trusted Publishing | **完成(待配置侧)** | `.github/workflows/publish.yml`:release published → OIDC → `npm publish --provenance`;`publishConfig.provenance=true`;仓库不放 token。npmjs 侧需配 Trusted Publisher(repo + workflow 名) |
95
103
  | D0.46 | npm 包准备 | **完成(待发布)** | 去掉 `private`、`publishConfig.access=public`、`files` 含 `packages/{wt,job}`;`npm pack` + 本地全局安装实测通过 |
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@minonl/dia",
3
- "version": "0.0.2-beta.0",
3
+ "version": "0.0.3",
4
4
  "type": "module",
5
5
  "description": "dia (嗲) — lightweight agent framework: knowledge index, audit, session ingest",
6
6
  "bin": {
@@ -29,7 +29,8 @@
29
29
  "bench:kb": "bun experiments/kb-bench.ts",
30
30
  "golden:kb": "bun experiments/kb-golden.ts",
31
31
  "docs:index": "node scripts/docs-index.mjs",
32
- "docs:check": "node scripts/docs-index.mjs --check"
32
+ "docs:check": "node scripts/docs-index.mjs --check",
33
+ "docs:links": "node scripts/docs-link-check.mjs"
33
34
  },
34
35
  "license": "MIT",
35
36
  "packageManager": "pnpm@12.5.1",