@minonl/dia 0.0.0-stage → 0.0.2-beta.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/LICENSE +21 -0
- package/README.md +253 -2
- package/bin/dia.js +5 -0
- package/dist/cli.js +7408 -0
- package/docs/acp-integration.md +136 -0
- package/docs/architecture.md +166 -0
- package/docs/cli.md +117 -0
- package/docs/dependency-registry.md +105 -0
- package/docs/deps.jsonl +7 -0
- package/docs/ecosystem-integration.md +155 -0
- package/docs/ecosystem-positioning.md +95 -0
- package/docs/entrypoints.md +83 -0
- package/docs/evolution-process.md +298 -0
- package/docs/history/framework-bootstrap.md +109 -0
- package/docs/host-control-surface.md +213 -0
- package/docs/index.md +80 -0
- package/docs/kit-install.md +339 -0
- package/docs/migrations/kb-golden.md +32 -0
- package/docs/migrations/llm-migration.md +49 -0
- package/docs/migrations/no-python.md +52 -0
- package/docs/migrations/yan-agent-current.md +52 -0
- package/docs/migrations/yan-agent-next.md +168 -0
- package/docs/migrations/yan-kb-parity.md +159 -0
- package/docs/migrations/yan-kb.md +120 -0
- package/docs/model-baseline-sidecar.md +220 -0
- package/docs/model-behavior.md +229 -0
- package/docs/monorepo.md +83 -0
- package/docs/overview.md +126 -0
- package/docs/patching.md +91 -0
- package/docs/persona-install.md +264 -0
- package/docs/platforms/index.md +66 -0
- package/docs/platforms/registry.json +54 -0
- package/docs/pricing.md +43 -0
- package/docs/proposals.md +76 -0
- package/docs/research/benchmarks-survey.md +96 -0
- package/docs/research/collaboration-theory.md +85 -0
- package/docs/research/dsh-superagent.md +97 -0
- package/docs/research/frameworks-survey-2.md +75 -0
- package/docs/research/h0/report.md +135 -0
- package/docs/research/h0/sample.json +34 -0
- package/docs/research/model-boundary-patterns.md +99 -0
- package/docs/research/opencode-session-scoping.md +84 -0
- package/docs/review/reuse-review.md +105 -0
- package/docs/review/verification-2026-10-28.md +49 -0
- package/docs/security/audits/2026-11-04.json +44 -0
- package/docs/security/credentials.md +95 -0
- package/docs/security/public-release.md +108 -0
- package/docs/security-sandbox.md +157 -0
- package/docs/status.md +158 -0
- package/docs/team-automation.md +169 -0
- package/docs/team.md +112 -0
- package/docs/versioning.md +237 -0
- package/docs/vision.md +161 -0
- package/package.json +45 -4
- package/packages/job/README.md +98 -0
- package/packages/job/bin/dia-job +1283 -0
- package/packages/job/config.example +5 -0
- package/packages/job/install.sh +37 -0
- package/packages/job/lib/config.sh +18 -0
- package/packages/job/lib/json.mjs +130 -0
- package/packages/job/lib/policy.sh +103 -0
- package/packages/job/package.json +10 -0
- package/packages/job/shim/yan-task +24 -0
- package/packages/job/tests/bootstrap.test.sh +115 -0
- package/packages/job/tests/install.test.sh +30 -0
- package/packages/job/tests/linux.test.sh +130 -0
- package/packages/job/tests/p2.test.sh +46 -0
- package/packages/job/tests/policy.test.sh +38 -0
- package/packages/wt/bin/dia-wt +1148 -0
- package/packages/wt/tests/check.test.sh +126 -0
- package/packages/wt/tests/clean.test.sh +126 -0
- package/packages/wt/tests/prune-merged.test.sh +169 -0
- package/packages/wt/tests/route.test.sh +112 -0
- package/packages/wt/tests/scope.test.sh +69 -0
|
@@ -0,0 +1,339 @@
|
|
|
1
|
+
# Kit:内容包安装(persona 的第二个半边)
|
|
2
|
+
|
|
3
|
+
> 日期 2026-10-30。前置:`docs/persona-install.md`(persona = 人格,kit = 内容)。
|
|
4
|
+
> 本文只定 **kit 的清单格式、渲染规则、生命周期、边界**;实现拆到 P1/P2/P3。
|
|
5
|
+
>
|
|
6
|
+
> **2026-11-03 实现状态**:只有 `dia kit add / list / verify / remove`;本文出现的 `kit show`、`kit update`、
|
|
7
|
+
> `kit gc`、`kit create` 仍是设计。persona 自带的 `files/skills/dirs/config` 内联内容已由 `persona add` 承担。
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## 0. 一句话
|
|
12
|
+
|
|
13
|
+
**persona 决定「你是谁」,kit 决定「你会什么」**:人格 md 之外的一切静态内容——知识树、skill、PATH 命令、
|
|
14
|
+
宿主配置文件、运行时目录——都由 kit 声明式分发,dia 负责复制、记账、校验、回滚。
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## 1. 现状缺口(为什么需要它)
|
|
19
|
+
|
|
20
|
+
`dia persona add yan` 现在的产物只有 `~/.config/opencode/agents/yan.md`(3522 字节)。而 yan 的最小可用状态还差:
|
|
21
|
+
|
|
22
|
+
| 缺的东西 | 现在由谁做 | 后果(干净机器上) |
|
|
23
|
+
|---|---|---|
|
|
24
|
+
| `core/knowledge`(2.3M) | `install.sh` 软链 `core/AGENTS.md` | 人格里写的「先查库」查不到 |
|
|
25
|
+
| `yan-kb` / `yan-worktree` 等 PATH 命令 | `install.sh` → `scripts/install-cli` | `yan-kb --scene S1` 直接 command not found |
|
|
26
|
+
| `core/skills/yan-onboarding` | 软链到各宿主 skill 目录 | onboarding 不会触发 |
|
|
27
|
+
| `~/.config/opencode/AGENTS.md` | 软链 `core/AGENTS.md` | 全局规则不生效 |
|
|
28
|
+
| 宿主配置(default_agent / permission) | `ensure-permission.py` 改 JSON | 权限白名单缺,读写被拦 |
|
|
29
|
+
| 数据根目录树 | `install.sh` mkdir | 首次运行写失败 |
|
|
30
|
+
|
|
31
|
+
结论:**persona 装完是"哑"的**;kit 就是把这些补上,且要能 `verify` / `remove`。
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
## 2. 清单:`dia.json`(kind=kit)
|
|
36
|
+
|
|
37
|
+
```json
|
|
38
|
+
{
|
|
39
|
+
"schema": 1,
|
|
40
|
+
"kind": "kit",
|
|
41
|
+
"id": "yan-core",
|
|
42
|
+
"version": "0.1.0",
|
|
43
|
+
"root": ".",
|
|
44
|
+
"files": [
|
|
45
|
+
{ "from": "core/AGENTS.md", "to": "~/.config/opencode/AGENTS.md" },
|
|
46
|
+
{ "from": "core/AGENTS.md", "to": "~/.codex/AGENTS.md" }
|
|
47
|
+
],
|
|
48
|
+
"skills": [
|
|
49
|
+
{ "from": "core/skills/yan-onboarding", "name": "yan-onboarding", "mode": "link" }
|
|
50
|
+
],
|
|
51
|
+
"bin": [
|
|
52
|
+
{ "from": "scripts/yan-kb", "name": "yan-kb" },
|
|
53
|
+
{ "from": "scripts/yan-worktree", "name": "yan-worktree" }
|
|
54
|
+
],
|
|
55
|
+
"dirs": [
|
|
56
|
+
"~/.yan-agent/cache",
|
|
57
|
+
"~/.yan-agent/backups",
|
|
58
|
+
"~/.yan-agent/tasks",
|
|
59
|
+
"~/.yan-agent/observability"
|
|
60
|
+
],
|
|
61
|
+
"config": [
|
|
62
|
+
{
|
|
63
|
+
"file": "~/.config/opencode/opencode.json",
|
|
64
|
+
"jsonc": true,
|
|
65
|
+
"set": { "permission.external_directory": { "~/.yan-agent/**": "allow" } }
|
|
66
|
+
}
|
|
67
|
+
],
|
|
68
|
+
"knowledge": ["core/knowledge"],
|
|
69
|
+
"requires": { "dia": ">=0.1.0" }
|
|
70
|
+
}
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
字段语义:
|
|
74
|
+
|
|
75
|
+
| 字段 | 语义 | 渲染方式 |
|
|
76
|
+
|---|---|---|
|
|
77
|
+
| `root` | 包内**运行根**:bin / knowledge / AGENTS.md 相对它解析 | 安装后 rider 根 = `<DATA>/kits/<id>/<version>/<root>` |
|
|
78
|
+
| `files` | 单文件 → 目标路径 | **复制**(内容哈希记账) |
|
|
79
|
+
| `skills` | 目录 → 宿主 skill 目录 | `mode: link` 软链回 kit 根(单源);`copy` 独立复制 |
|
|
80
|
+
| `bin` | 脚本 → `~/.local/bin/<name>` | **软链**回 kit 根(脚本靠自身 realpath 推根,见 §3.2) |
|
|
81
|
+
| `dirs` | 运行时目录 | `mkdir -p`,**remove 时不删**(可能已有用户数据) |
|
|
82
|
+
| `config` | 宿主 JSON 配置合并 | P2 实现;写前记录原值,remove 按记录还原 |
|
|
83
|
+
| `knowledge` | 声明给 `dia kb` 用的知识根 | 不复制,只在 `dia kit show` 里暴露绝对路径 |
|
|
84
|
+
|
|
85
|
+
**为什么 `root` 而不是逐文件列**:yan 的脚本自己解析 `REPO_DIR`(`scripts/yan-kb` 靠 `SELF_DIR/..`),
|
|
86
|
+
如果只把 `scripts/yan-kb` 单文件搬到 `~/.local/bin`,它找不到 `core/knowledge`。整棵树进 kit 根,软链回原处,脚本零改动。
|
|
87
|
+
|
|
88
|
+
---
|
|
89
|
+
|
|
90
|
+
### 2.1 persona 可自带内容(内联 kit)——已定案(2026-10-30)
|
|
91
|
+
|
|
92
|
+
```json
|
|
93
|
+
{
|
|
94
|
+
"schema": 1, "kind": "persona", "id": "yan", "version": "0.1.0",
|
|
95
|
+
"entry": { "opencode": "platform/opencode/files/opencode-agent-yan.md" },
|
|
96
|
+
"files": [{ "from": "core/AGENTS.md", "to": "~/.config/opencode/AGENTS.md" }],
|
|
97
|
+
"skills": [{ "from": "core/skills/yan-onboarding", "name": "yan-onboarding", "mode": "link" }],
|
|
98
|
+
"dirs": ["~/.yan-agent/cache", "~/.yan-agent/tasks"],
|
|
99
|
+
"knowledge": ["core/knowledge"],
|
|
100
|
+
"data_root": "~/.yan-agent",
|
|
101
|
+
"commands": [{ "name": "scene", "entry": "scripts/kb-domain.mjs", "env": { "YAN_DATA_ROOT": "~/.yan-agent" } }],
|
|
102
|
+
"kits": ["../shared/leyan-skills"]
|
|
103
|
+
}
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
persona 与 kit 用**同一套内容字段**(`files/skills/bin/dirs/commands/knowledge/data_root`),差别只在所有者:
|
|
107
|
+
|
|
108
|
+
| | 谁的内容 | 路径基准 | 生命周期 |
|
|
109
|
+
|---|---|---|---|
|
|
110
|
+
| persona 自带 | 该人格专属(规则、知识、域命令) | persona 根 | 随 persona 装/卸 |
|
|
111
|
+
| 独立 kit | 跨人格/第三方复用(共享 skill 包) | kit 根 | 独立装/卸,可被多 persona 引用 |
|
|
112
|
+
|
|
113
|
+
**为什么要有这一层**:把 `core/knowledge` 搬进 `kits/yan-core/` 要改 46 处脚本、65 个 md 的硬编码路径,
|
|
114
|
+
收益只是"目录好看"。内联后 persona 根就是内容根,历史路径零改动;复用需求一旦出现,再拆独立 kit 即可。
|
|
115
|
+
|
|
116
|
+
实现上两者共用 `kit.renderContent(baseDir, targetDir, manifest)`:persona 传 `baseDir = targetDir = persona 树`,
|
|
117
|
+
kit 传 `baseDir = 包内目录, targetDir = DATA/kits/<id>/<version>`。
|
|
118
|
+
|
|
119
|
+
---
|
|
120
|
+
|
|
121
|
+
## 3. 安装管线
|
|
122
|
+
|
|
123
|
+
```mermaid
|
|
124
|
+
flowchart TD
|
|
125
|
+
A[dia persona add yan --from git+... --ref sha] --> B[clone 到缓存, 校验 dia.json]
|
|
126
|
+
B --> C{persona.kits 引用?}
|
|
127
|
+
C -- 无 --> D[渲染人格 md]
|
|
128
|
+
C -- 有 --> E[对每个 kit 解析: 包内相对路径 / git+ URL]
|
|
129
|
+
E --> F[校验 kit 清单: schema/id/version/路径不越界]
|
|
130
|
+
F --> G[复制整棵树到 DATA/kits/id/version]
|
|
131
|
+
G --> H{冲突检查: 目标存在且非 dia 管理?}
|
|
132
|
+
H -- 冲突 --> X[E_CONFLICT, 不写任何文件]
|
|
133
|
+
H -- 干净 --> I[files 复制 / skills 软链 / bin 软链 / dirs mkdir / config 合并]
|
|
134
|
+
I --> J[写 kit.lock: 每产物 sha256 + 原值快照]
|
|
135
|
+
J --> D
|
|
136
|
+
D --> K[写 persona dia.lock, 记录 kits 版本]
|
|
137
|
+
K --> L[dia persona verify: 内容哈希 + 产物哈希全对]
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
### 3.1 复制还是软链
|
|
141
|
+
|
|
142
|
+
| 类别 | 选择 | 理由 |
|
|
143
|
+
|---|---|---|
|
|
144
|
+
| kit 内容树 | **复制**到 `DATA/kits/` | 与 persona 一致;源仓可移动/删除;`verify` 有稳定基准 |
|
|
145
|
+
| `bin` | **软链**到 kit 根 | 脚本必须能反推 `REPO_DIR`;复制单文件会打断 |
|
|
146
|
+
| 内部 skill | **软链**到 kit 根 | 与 `install.sh` 现有行为一致(`core/skills/yan-onboarding`) |
|
|
147
|
+
| `files`(AGENTS.md 等) | **复制** | 宿主只读文件;软链会让宿主读到 `.git` 里的脏状态 |
|
|
148
|
+
|
|
149
|
+
### 3.2 bin 软链为什么能工作
|
|
150
|
+
|
|
151
|
+
`scripts/yan-kb` 解析真实路径链(`while [ -L ... ]`)→ `<DATA>/kits/yan-core/0.1.0/scripts/yan-kb`,
|
|
152
|
+
`SELF_DIR/..` 即 kit 根,`core/knowledge` 就地可读。**不需要**任何 `YAN_REPO_DIR` 环境变量,也不需要 install-cli 生成启动器。
|
|
153
|
+
|
|
154
|
+
### 3.3 幂等与升级
|
|
155
|
+
|
|
156
|
+
- 同 `<id>@<version>` 重装:内容哈希一致 → 无写入,返回 `unchanged`;
|
|
157
|
+
- 换版本(`dia kit update`):旧目录保留(多版本共存),产物按 lock 备份后重写,`dia kit gc` 清理非当前版本;
|
|
158
|
+
- persona 与 kit 版本联动:persona 的 `dia.lock` 记录 `kits: {"yan-core": "0.1.0"}`,`persona verify` 一并校验。
|
|
159
|
+
|
|
160
|
+
---
|
|
161
|
+
|
|
162
|
+
## 4. 生命周期与退出码
|
|
163
|
+
|
|
164
|
+
| 命令 | 行为 | 关键约束 |
|
|
165
|
+
|---|---|---|
|
|
166
|
+
| `dia kit add <src> [--ref]` | 取回 → 校验 → 复制 → 渲染 → lock | 不执行任何脚本 |
|
|
167
|
+
| `dia kit list` | 已装 kit + 版本 + 产物数 | 只读 |
|
|
168
|
+
| `dia kit verify <id> [--version]` | 内容哈希 + 每个产物哈希 | 不一致 → exit 21(`E_HASH`) |
|
|
169
|
+
| `dia kit update <id> --ref` | 新版本 → 备份旧产物 → 重渲染 | 破坏性变更提示 |
|
|
170
|
+
| `dia kit remove <id>` | 只删 hash 匹配的产物;手改过的**拒绝删并列出** | exit 0 附 `skipped[]` |
|
|
171
|
+
|
|
172
|
+
沿用 persona 的退出码:`E_MANIFEST` 20 / `E_HASH` 21 / `E_CONFLICT` 32 / `E_HOST` 33 / `E_SOURCE` 34(新增:源不可达)。
|
|
173
|
+
|
|
174
|
+
---
|
|
175
|
+
|
|
176
|
+
## 5. 边界(明确不做)
|
|
177
|
+
|
|
178
|
+
1. **不执行安装脚本**:kit 里写 `install.sh` 也不跑(与 persona 同)。
|
|
179
|
+
2. **不装第三方包**:`npx skills add` 出来的 leyan-skills 等**不由 kit 管**;kit 只声明 `requires.npx` 并在缺失时 `W_` 告警。
|
|
180
|
+
3. **不管卸载服务**:launchd/cron 任务归 `dia job`,kit 不创建任务。
|
|
181
|
+
4. **不写默认 agent**:`default_agent` 只允许通过 `config` 显式声明(P2),且必须可回滚;kit 不猜。
|
|
182
|
+
5. **不碰用户手改**:产物哈希不匹配一律 skip,不覆盖、不删除。
|
|
183
|
+
|
|
184
|
+
安全(沿用 persona §4):来源白名单(git host + owner)、`--ref` 解析成 commit sha 落 lock、路径不得越出包根、`--dry-run` 列出将写入的每个路径。
|
|
185
|
+
|
|
186
|
+
---
|
|
187
|
+
|
|
188
|
+
## 6. 命令面:装完之后的命令不是 `yan-kb`
|
|
189
|
+
|
|
190
|
+
安装只是让内容到位;**入口也要归一**,否则 kit 只是把旧脚本换个地方放。
|
|
191
|
+
|
|
192
|
+
### 6.1 原则:一个入口 `dia`,加 persona 作用域
|
|
193
|
+
|
|
194
|
+
```bash
|
|
195
|
+
dia --persona yan kb query "MR 合并" # 显式作用域
|
|
196
|
+
DIA_PERSONA=yan dia kb query "MR 合并" # 会议/脚本里设一次
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
作用域解析链(`--persona` > `DIA_PERSONA` > 唯一已装 persona):
|
|
200
|
+
|
|
201
|
+
```text
|
|
202
|
+
--persona yan
|
|
203
|
+
→ DATA/personas/yan/<ver>/dia.lock.kits # 该人格引用了哪些 kit
|
|
204
|
+
→ kit.knowledge → <kitroot>/core/knowledge # 知识根
|
|
205
|
+
→ kit.data_root → ~/.yan-agent # 运行时数据(db/backups/tasks)
|
|
206
|
+
→ 不在 persona 作用域里时,退回 `--root` / cwd(旧行为)
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
**为什么要 `--persona` 而不是 `--root`**:`--root` 只解决"读哪棵树",解决不了"用哪个数据根、哪些域命令可用、
|
|
210
|
+
哪个 db 文件"。这些是人格的属性,不是目录的属性。
|
|
211
|
+
|
|
212
|
+
### 6.2 映射表(旧 → 新)
|
|
213
|
+
|
|
214
|
+
| 旧命令 | 新命令 | 备注 |
|
|
215
|
+
|---|---|---|
|
|
216
|
+
| `yan-kb "意图"` | `dia kb query "意图"` | 默认 path:KB 物理进 dia,命令名跟着进 |
|
|
217
|
+
| `yan-kb --scene S1` | `dia kb scene S1` | 域语义,经委派(§6.3) |
|
|
218
|
+
| `yan-kb --rule R25` | `dia kb rule R25` | 同上 |
|
|
219
|
+
| `yan-kb --auto "…"` | `dia kb auto "…"` | 同上;UNKNOWN 仍 exit 5 |
|
|
220
|
+
| `yan-kb record gap\|decision\|note` | `dia kb record …` | 委派到 yan 实现(写入目标文件是域事实) |
|
|
221
|
+
| `yan-kb report` / `path` / `claims` / `baseline` / `alerts` | `dia kb <同名>` | 前两个内置,其余委派 |
|
|
222
|
+
| `yan-kb doctor` | `dia doctor --persona yan` | 组合自检归 dia |
|
|
223
|
+
| `yan-worktree create\|clean\|check\|scope\|route` | `dia wt create\|clean\|check\|…` | `packages/wt`,§7 |
|
|
224
|
+
| `yan-task list\|status\|install…` | `dia job <同名>` | 已完成(`packages/job`) |
|
|
225
|
+
| `yan-version` | `dia persona show yan` | 版本 = persona 版本 + lock 里的 commit |
|
|
226
|
+
|
|
227
|
+
### 6.3 域语义怎么落:子命令委派(`git-foo` 机制)
|
|
228
|
+
|
|
229
|
+
内置子命令之外,`dia kb` 查 persona 已装 kit 的 `commands` 声明,命中就委派:
|
|
230
|
+
|
|
231
|
+
```json
|
|
232
|
+
"commands": [
|
|
233
|
+
{ "name": "scene", "entry": "core/knowledge/scripts/kb-scene.mjs", "runtime": "bun|node" },
|
|
234
|
+
{ "name": "rule", "entry": "core/knowledge/scripts/kb-rule.mjs" },
|
|
235
|
+
{ "name": "auto", "entry": "core/knowledge/scripts/kb-auto.mjs" },
|
|
236
|
+
{ "name": "record", "entry": "core/knowledge/scripts/kb-record.mjs" }
|
|
237
|
+
]
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
行为约定:`argv` 原样透传、`cwd` 不变、`YAN_*` 等 persona 环境变量由 dia 注入、**子进程 exit code 原样返回**
|
|
241
|
+
(`--auto` 的 UNKNOWN=5 语义不能丢)。
|
|
242
|
+
|
|
243
|
+
好处:`dia` 不需要认识 scene/rule/claims;域实现仍住在 yan 仓,随 kit 版本走;命令面只有一个。
|
|
244
|
+
|
|
245
|
+
### 6.4 不做 shim:一步切换
|
|
246
|
+
|
|
247
|
+
**决策(2026-10-30,用户拍板)**:不留 `yan-*` 转发 shim,安装产物里**没有任何 `yan-` 前缀命令**。
|
|
248
|
+
|
|
249
|
+
1. `yan-kb` / `yan-worktree` / `yan-task` / `yan-doctor` 等脚本从 yan 仓**删除**,逻辑进 dia(`packages/*`)或作为
|
|
250
|
+
kit 的 `commands` 扩展;不是保留转发。
|
|
251
|
+
2. 因此迁移验证只在**开发侧**做一次对照(同一份数据新旧各跑一遍,比对输出),对照脚本随老代码一起删,不随包分发。
|
|
252
|
+
3. 文档引用就地改写(`yan-kb` 131 处 / `yan-worktree` 99 处 / `yan-task` 282 处),与代码删除同一个 MR/commit。
|
|
253
|
+
4. **扫描门禁**:yan 仓 CI 加一条 `grep -rE "\byan-(kb|worktree|task|doctor|env|ref|mr|schedule|version)\b"`
|
|
254
|
+
白名单外命中即失败——防止回潮。
|
|
255
|
+
|
|
256
|
+
---
|
|
257
|
+
|
|
258
|
+
## 7. worktree:`dia wt`(`packages/wt`)
|
|
259
|
+
|
|
260
|
+
`yan-worktree` 1160 行、5 套测试(`check`/`clean`/`prune-merged`/`route`/`scope`)。归属 `packages/wt`(monorepo 先例:`packages/job`)。
|
|
261
|
+
|
|
262
|
+
| 抽取项 | 处理 |
|
|
263
|
+
|---|---|
|
|
264
|
+
| `YAN_DATA_ROOT` / `tasks/scopes` | 参数化为 `DIA_WT_DATA_ROOT`(persona 注入 `~/.yan-agent`) |
|
|
265
|
+
| `~/repos/leyan` 默认 | `DIA_WT_REPOS_ROOT`,缺失时不猜、报错 |
|
|
266
|
+
| `YAN_SESSION_ID` | `DIA_SESSION` |
|
|
267
|
+
| 直推 vs MR(`my_namespaces`/`direct`/`mr`) | **留 yan 域**,经 §6.3 委派(`dia wt route` → yan 扩展) |
|
|
268
|
+
| `route_config_json` 里的 python3 heredoc | 换 Node JSON(`packages/job` 同款,dia 禁止 python) |
|
|
269
|
+
|
|
270
|
+
**已落地(2026-10-30)**:`packages/wt/bin/dia-wt`(bash,与 `packages/job` 同模式)+ `packages/cli` 的 `dia wt` 转发 + `install.sh` 分发。
|
|
271
|
+
env 全部改 `DIA_WT_*` / `DIA_SESSION`;7 处 python3 全部换成 Node(含 node_modules 扫描器),包内 python 归零。
|
|
272
|
+
测试 4 套原样迁移全绿(check 27 / clean 20 / prune-merged 31 / route 26);`scope` 16 项全绿,**其中「与 yan 权限层串联判定」1 项已移出**——
|
|
273
|
+
那是 yan 域契约,不属于 dia wt。levm 上 `create → status → clean` 实跑通过。
|
|
274
|
+
|
|
275
|
+
验收:**开发侧一次性对照**(旧脚本 vs `dia wt`,同仓同分支跑一遍
|
|
276
|
+
`create/check/clean` 比对输出与 `git worktree list`)——因为 worktree 有分支与文件系统副作用,切错不便宜。
|
|
277
|
+
对照完成后旧脚本即删,不随包分发。
|
|
278
|
+
|
|
279
|
+
---
|
|
280
|
+
|
|
281
|
+
## 8. 与 yan-agent@next 的对接(迁移顺序)
|
|
282
|
+
|
|
283
|
+
```mermaid
|
|
284
|
+
flowchart LR
|
|
285
|
+
subgraph 现在
|
|
286
|
+
Y1[yan-agent@next<br/>install.sh 装全部]
|
|
287
|
+
end
|
|
288
|
+
subgraph 目标
|
|
289
|
+
P[dia.json persona: yan<br/>entry = 人格 md]
|
|
290
|
+
K[dia.json kit: yan-core<br/>files/skills/bin/dirs/config]
|
|
291
|
+
D[dia persona add yan]
|
|
292
|
+
D --> P
|
|
293
|
+
D --> K
|
|
294
|
+
end
|
|
295
|
+
Y1 -.拆.-> P
|
|
296
|
+
Y1 -.拆.-> K
|
|
297
|
+
```
|
|
298
|
+
|
|
299
|
+
| 阶段 | 动作 | 门禁 |
|
|
300
|
+
|---|---|---|
|
|
301
|
+
| **K1** | kit 清单 + 复制/软链/记账/verify/remove(不含 `config`) | 隔离 HOME:`kit add` → `verify` → `remove` 无残留 |
|
|
302
|
+
| **K2** | `config` 合并(opencode.json permission / default_agent),带原值快照回滚 | remove 后 opencode.json 与装前逐字节一致 |
|
|
303
|
+
| **K3** | yan@next 落地 `dia.json`(persona) + `kits/yan-core/dia.json`(含 `commands` 委派) | 干净 VM:`dia persona add yan --from <gitlab> --ref <sha>` 后 `dia --persona yan kb scene S1` 可跑 |
|
|
304
|
+
| **K4** | 删 `install.sh` / `uninstall.sh` / `scripts/yan-*`,入口只剩 `dia persona add` + `dia job bootstrap` | 仓内 `grep -rE "\byan-(kb|worktree|task)\"` 仅剩知识文档里的新命令名 |
|
|
305
|
+
|
|
306
|
+
**验收(K3 定义「装好了」)**:
|
|
307
|
+
1. 干净 HOME(无 `~/.yan-agent`、无 `yan-kb`、无 `agents/yan.md`);
|
|
308
|
+
2. `dia persona add yan --from <gitlab-url> --ref <sha>` 单命令完成;
|
|
309
|
+
3. `cd /tmp && dia --persona yan kb scene S1` 出场景卡(证明知识根 + 数据根 + 委派都对);
|
|
310
|
+
4. `dia persona verify yan` → ok;`dia kit verify yan-core` → ok;
|
|
311
|
+
5. `dia persona remove yan` → `~/.yan-agent` 运行数据保留、所有渲染产物消失、无断链。
|
|
312
|
+
|
|
313
|
+
---
|
|
314
|
+
|
|
315
|
+
## 9. 实施状态(2026-10-30)
|
|
316
|
+
|
|
317
|
+
| 阶段 | 状态 | 证据 |
|
|
318
|
+
|---|---|---|
|
|
319
|
+
| K1 kit 安装器 | ✅ | `src/kit.ts` + 9 例单测 |
|
|
320
|
+
| K1.5 作用域 + 委派 | ✅ | `src/scope.ts`、`dia --persona yan kb scene S1` |
|
|
321
|
+
| K2 persona 内联内容 | ✅ | `renderContent(baseDir, targetDir)` 两处复用 |
|
|
322
|
+
| K3 yan@next 形态 | ✅ | `feat/dia-persona` 分支;levm 实装通过 |
|
|
323
|
+
| K4 worktree → `packages/wt` | ✅ | 7 处 python→node;5 套测试;`dia wt create/status/clean` levm 通过 |
|
|
324
|
+
| K4 删旧命令面 | ✅(部分) | 删 yan-kb / yan-worktree / yan-task / 旧安装器;CI 门禁上线 |
|
|
325
|
+
| K4 未迁移项 | ⏳ | `yan-mr` / `yan-release` / `yan-env` / `yan-ref` / `yan-schedule` / `yan-doctor` / `yan-version` / `yan-data-root` 仍在仓内、不随 persona 安装 |
|
|
326
|
+
| P2 默认 agent | ✅ | `dia persona default <id>`(备份 + 原值记录 + `--unset`) |
|
|
327
|
+
| P2 生效版本指针 | ✅ | `dia persona use <id>[@ver]` + `state/active.jsonl` 审计;scope 先读指针 |
|
|
328
|
+
| P2 组合自检 | ✅ | `dia doctor`(0 全绿 / 1 warn / 2 fail) |
|
|
329
|
+
| P2 凭据注入 | ✅ | `dia env list\|check\|run`(白名单、不回显、redact、不进 argv) |
|
|
330
|
+
| P2 上游比对 | ✅ | `dia persona check`(same/differs/unknown/local-only)+ `update` 从记录源重装 |
|
|
331
|
+
|
|
332
|
+
---
|
|
333
|
+
|
|
334
|
+
## 10. 待拍板(实现前需要人确认)
|
|
335
|
+
|
|
336
|
+
1. **kit 与 persona 是否同仓**:本文假设同仓、persona 用相对路径引用(`"kits": ["./kits/yan-core"]`)。若要支持独立 kit 仓(`git+…`),清单里就写 URL,实现多一条解析分支。
|
|
337
|
+
2. **`config` 合并放 P1 还是 P2**:放 P1 能一次装到「开箱可用」,但要引入 JSONC 读写与回滚记账;放 P2 则先装内容、权限靠用户手动或旧 install.sh 兜一次。
|
|
338
|
+
3. ~~命令面切换的节奏~~ **已定**:不留 shim,一步切(§6.4)。
|
|
339
|
+
4. **`dirs` 的 remove 语义**:本文取「不删」(可能已有任务/备份数据)。若要删,需 `--purge-data` 且二次确认。
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# K0:kb 查询 golden(20 条)
|
|
2
|
+
|
|
3
|
+
> 2026-10-30。原始 query 只落在 yan 数据根,不提交到 dia 仓。
|
|
4
|
+
|
|
5
|
+
- 来源:`~/.yan-agent/observability/kb-calls-2026-10.jsonl`(3002 条)
|
|
6
|
+
- 抽样:`seed=30`,按 mode 分层(query/scene/rule/auto)
|
|
7
|
+
- 输出:`~/.yan-agent/observability/kb-golden-20.json`
|
|
8
|
+
- 本仓只记录方法、计数、哈希:
|
|
9
|
+
- 数量:20
|
|
10
|
+
- mode:query 9 / scene 6 / rule 3 / auto 2
|
|
11
|
+
- `query_hash`:`7279ffeea514…`
|
|
12
|
+
- 用途:K1 `dia kb query` 的 parity 基准;**不是** CI 固定夹具(避免把工作域文本带进 public 仓)。
|
|
13
|
+
|
|
14
|
+
复现:
|
|
15
|
+
|
|
16
|
+
```sh
|
|
17
|
+
bun experiments/kb-golden.ts <kb-calls.jsonl> <out.json>
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
## K2.2 100 条基准(2026-10-30)
|
|
22
|
+
|
|
23
|
+
- 命令:`bun experiments/kb-bench.ts <kb-calls.jsonl> 100`
|
|
24
|
+
- 样本:100 条真实 query;原始数据只在 `~/.yan-agent/observability/kb-bench-100.json`
|
|
25
|
+
- 结果:
|
|
26
|
+
- answerable 87
|
|
27
|
+
- 规则召回 **121/132 = 91.67%**
|
|
28
|
+
- answerable zero-hit **0**
|
|
29
|
+
- top1 与旧实现一致 **75/87 = 86.21%**
|
|
30
|
+
- dia top1 落在旧命中集合 **84/87 = 96.55%**
|
|
31
|
+
- CLI p50/p95:旧 51.0/114.6ms,dia 57.1/82.2ms
|
|
32
|
+
- 结论:召回/排序达到 K2.2 质量门槛;绝对 p95 60ms 未达,但相对旧实现更快,延迟门槛需按环境改为相对基线,不能静默改口径。
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# 配置迁移:用 LLM 任务,不写 migration 代码
|
|
2
|
+
|
|
3
|
+
> 2026-11-04。适用:dia / persona / kit 的**声明式格式**升级(`dia.json`、`lock`、`registry.json`、`deps.jsonl` 等)。
|
|
4
|
+
> 原则:**升级 = 改声明 + 文档;旧数据迁移交给带判据的 LLM 任务**,不在代码里堆版本分支。
|
|
5
|
+
|
|
6
|
+
## 1. 为什么
|
|
7
|
+
|
|
8
|
+
- migration 代码要长期背兼容矩阵,测试面指数增长;
|
|
9
|
+
- 声明式格式的迁移大多是"文本改写 + 语义校验",正是 LLM 擅长的;
|
|
10
|
+
- 用任务 + 判据驱动,迁移过程本身可审计、可回滚。
|
|
11
|
+
|
|
12
|
+
## 2. 流程(每版一次)
|
|
13
|
+
|
|
14
|
+
1. **定版**:在 `docs/` 写清「旧格式 → 新格式」的对照表与判据(机器可执行命令优先)。
|
|
15
|
+
2. **生成迁移任务**(模板见 §3):一个版本一个任务,**幂等**、带 `--dry-run` 演练。
|
|
16
|
+
3. **LLM 执行**:任务只允许改声明文件(`dia.json` / `dia.lock` / `projects/*.json`),不改代码。
|
|
17
|
+
4. **判据校验**:`dia persona verify <id>` + `dia doctor --persona <id>` + 目标命令自检。
|
|
18
|
+
5. **回滚**:迁移前 `dia persona use <id>@<old>` 或保留 `backups/`;失败即回滚,不半迁移。
|
|
19
|
+
|
|
20
|
+
## 3. 任务模板
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
dia task add "迁移 <persona> 到 <schema vN>" --judge "dia persona verify <id> && dia doctor --persona <id> && bun run test"
|
|
24
|
+
# 任务描述里必须带:
|
|
25
|
+
# - 旧格式样例(脱敏)
|
|
26
|
+
# - 新格式要求(字段/必填/默认值)
|
|
27
|
+
# - 只允许改的文件清单
|
|
28
|
+
# - dry-run 方式 + 回滚方式
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
LLM 侧执行约束(写进任务描述):
|
|
32
|
+
|
|
33
|
+
- 只改清单里列出的文件;**不碰** 代码、`docs/`、其它 persona;
|
|
34
|
+
- 每步先 `--dry-run` 或 `git diff` 自证,再落盘;
|
|
35
|
+
- 遇到无法判定的字段 → 停,不猜;
|
|
36
|
+
- 完成后贴判据命令与输出。
|
|
37
|
+
|
|
38
|
+
## 4. 禁止 / 要求
|
|
39
|
+
|
|
40
|
+
| 禁止 | 要求 |
|
|
41
|
+
|---|---|
|
|
42
|
+
| 在代码里写 `if (schema === 1) ... else if (schema === 2)` 链 | schema 只做**校验**(不认识的版本直接报错) |
|
|
43
|
+
| 迁移脚本自动改用户数据 | 迁移必须是一次显式任务,人可见 |
|
|
44
|
+
| 迁移不可逆 | 先备份 + 记录旧版本指针 |
|
|
45
|
+
| 一次迁多个版本 | 一版一任务,逐版迁移 |
|
|
46
|
+
|
|
47
|
+
## 5. 例外
|
|
48
|
+
|
|
49
|
+
当迁移是**安全敏感**(凭据、路径越界检查)或**必须原子**(审计链格式)时,才写代码,并在本文件登记理由与判据。
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# Python 清理:Node/Bun 项目不收 Python
|
|
2
|
+
|
|
3
|
+
> 日期 2026-10-30。目标:dia 仓库不把 Python 作为运行时/工具链依赖。
|
|
4
|
+
|
|
5
|
+
## 现状
|
|
6
|
+
|
|
7
|
+
| 区域 | 状态 |
|
|
8
|
+
|---|---|
|
|
9
|
+
| `experiments/*.py` | ✅ 已迁到 `experiments/*.ts`(Bun) |
|
|
10
|
+
| `src/` / `packages/kb` / `packages/cli` | ✅ 无 Python |
|
|
11
|
+
| `packages/job/bin/dia-job` | ✅ 已改用 `lib/json.mjs`(Node/Bun 内置 JSON) |
|
|
12
|
+
| `packages/job/tests` | ✅ 测试夹具已改 Node |
|
|
13
|
+
|
|
14
|
+
## 迁移记录
|
|
15
|
+
|
|
16
|
+
`packages/job` 是从 bash 调度器继承的 OS 适配层,原先用 `python3` 做 JSON 解析。
|
|
17
|
+
现已改为 `lib/json.mjs`:只用 Node/Bun 内置 JSON,不新增 workspace 包/解析器。
|
|
18
|
+
|
|
19
|
+
## P3 完成(2026-10-30)
|
|
20
|
+
|
|
21
|
+
1. ✅ `packages/job/lib/json.mjs`:labels/entries/get/set/del/rows/fields/backfill/selfcheck-rows/expected/bootstrap-rows;
|
|
22
|
+
2. ✅ `packages/job/bin/dia-job` 无 `python3`;
|
|
23
|
+
3. ✅ `packages/job/tests` 夹具改 Node;
|
|
24
|
+
4. ✅ `rg -n 'python3?|\.py\b' packages/job` 为 0;
|
|
25
|
+
5. 运行时要求:Node 或 Bun(`engines` 已声明)。
|
|
26
|
+
|
|
27
|
+
## 当前结论
|
|
28
|
+
|
|
29
|
+
- dia 全部 Python 清零(含 job);
|
|
30
|
+
- JSON 适配层不新增包,只用内置 JSON;
|
|
31
|
+
- JSONC/JSON5 未默认引入,按 `no-python` 策略按需 opt-in。
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
## JSON / JSONC / JSON5 兼容策略
|
|
35
|
+
|
|
36
|
+
不新写 JSON 解析器,也不把 JSON 支持做成 workspace 包;只用 Node/Bun 内置 JSON + 一层薄适配。
|
|
37
|
+
|
|
38
|
+
| 文件 | 规则 |
|
|
39
|
+
|---|---|
|
|
40
|
+
| `*.json`(registry/state/`dia.json`) | **严格 JSON**;机器写入,不接受注释/尾逗号 |
|
|
41
|
+
| `*.jsonc`(人工配置,若引入) | 允许注释/尾逗号;读取兼容,写回 canonical JSON 并提示“注释会丢失” |
|
|
42
|
+
| `*.json5` | **不默认支持**;单引号/无引号键/NaN 会扩大歧义面,只在明确需求时 opt-in |
|
|
43
|
+
| `key=value` 配置 | 继续用现有 env/config 格式,不改成 JSON |
|
|
44
|
+
|
|
45
|
+
实现约束:
|
|
46
|
+
|
|
47
|
+
- 不写自定义 parser,不用 `eval`;
|
|
48
|
+
- JSONC 若落地,使用固定版本的成熟解析器(如 `jsonc-parser`),并只对 `.jsonc` 生效;
|
|
49
|
+
- job 的 `registry.json` / `state.jsonl` 永远 strict JSON,JSONC 只用于用户配置;
|
|
50
|
+
- 写入始终原子化,不能因为兼容格式破坏状态文件。
|
|
51
|
+
|
|
52
|
+
**结论**:兼容优先做 `JSON` + `JSONC`;`JSON5` 先不做,避免为了“宽松”把机器状态也弄脏。
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# yan-agent 切到 dia:本机现状与剩余迁移
|
|
2
|
+
|
|
3
|
+
> 2026-11-02 初版,**2026-11-03 复核**。yan-agent 远端 main 已合入 `yan-agent@next`(dia persona 形态)。
|
|
4
|
+
> 本文记录本机切换结果和**还没迁完**的部分;事实源仍是本机实际路径。
|
|
5
|
+
|
|
6
|
+
## 已完成
|
|
7
|
+
|
|
8
|
+
- yan-agent 本地备份:`~/.yan-agent/backups/yan-agent-<ts>/repo.bundle`
|
|
9
|
+
- `dia persona add yan --from ~/.yan-agent/repos/yan-agent` 成功
|
|
10
|
+
- `~/.config/opencode/agents/yan.md` 为 dia 渲染版
|
|
11
|
+
- `~/.config/opencode/AGENTS.md`、`~/.codex/AGENTS.md` 已切到 dia 版
|
|
12
|
+
- `opencode default_agent` 仍为 `yan`
|
|
13
|
+
- `dia doctor --persona yan`:`verdict: ok`
|
|
14
|
+
- `dia --persona yan kb scene S1/S2`、`query` 实测可用
|
|
15
|
+
- 本地兼容 shim(不进仓库):
|
|
16
|
+
- `yan-kb` → `dia --persona yan kb`
|
|
17
|
+
- `yan-worktree` → `dia wt`
|
|
18
|
+
- `yan-mr` / `yan-release` / `yan-schedule` → `dia --persona yan cmd ...`
|
|
19
|
+
- `yan-task` → `dia-job`
|
|
20
|
+
|
|
21
|
+
## 还没完成
|
|
22
|
+
|
|
23
|
+
| # | 缺口 | 影响 | 下一步 |
|
|
24
|
+
|---|---|---|---|
|
|
25
|
+
| 1 | ✅ dsh host 已补:`platform/dsh/yan-persona`(端口 3091),`doctor` preset 可加载 | — | — |
|
|
26
|
+
| 2 | `yan-env` 仍是旧实现 | 凭据注入仍走旧脚本,未接 `dia env`(`dia env list/check/run` 已可用,白名单/redact/不进 argv) | 评估 `dia env` 后 shim/迁移 |
|
|
27
|
+
| 3 | `yan-version` / `yan-ref` 仍是旧实现 | `dia persona show/use/path` 已覆盖"生效版本";旧脚本未收口 | 按 `active-ref-design.md` 的剩余消费方迁移 |
|
|
28
|
+
| 4 | `yan-data-root` / `yan-data-sync` 仍是旧脚本 | 数据根契约未统一(`dia` 的 scope 已能注入 `DIA_DATA_ROOT_SCOPE`) | 评估是否进 dia 或保留域脚本 |
|
|
29
|
+
| 5 | 本地 untracked `scripts/yan-kb|yan-task|yan-worktree` | 旧文件仍可能被误用 | 观察一轮后删除,统一走 shim |
|
|
30
|
+
| 6 | 仓库 README/rules 仍写旧命令 | 文档与 AGENTS 漂移 | 批量改 `yan-kb`→`dia --persona yan kb`、`yan-worktree`→`dia wt` |
|
|
31
|
+
| 7 | ✅ launchd 已复核:清 `--help`/`demo-isolated`,selfcheck 指向稳定 shim | 缺失 0;`dia job list` 无测试残留 | — |
|
|
32
|
+
| 8 | `dia persona check` 显示 local-only | 未跟踪上游 commit | 需要上游 ref/更新策略 |
|
|
33
|
+
| 9 | **安装落后来源仓**:persona 装的是 `83fbaa9`,`~/.yan-agent/repos/yan-agent` main 已是 `8d10cc5` | 差的提交是 dsh profile 根 `cordis.yml` 修复 | `dia persona add yan --from ~/.yan-agent/repos/yan-agent --force`(先备份) |
|
|
34
|
+
|
|
35
|
+
## 本机验证命令
|
|
36
|
+
|
|
37
|
+
```sh
|
|
38
|
+
dia persona list
|
|
39
|
+
dia persona show yan
|
|
40
|
+
dia doctor --persona yan
|
|
41
|
+
dia --persona yan kb scene S1
|
|
42
|
+
dia --persona yan kb query "评审请求"
|
|
43
|
+
dia --persona yan cmd mr --help
|
|
44
|
+
dia wt status
|
|
45
|
+
dia job list
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## 原则
|
|
49
|
+
|
|
50
|
+
- 不再恢复 legacy-yan-cli;已经切到 dia。
|
|
51
|
+
- 旧命令只保留稳定 shim,不直接依赖仓库里的 untracked 文件。
|
|
52
|
+
- 每次迁移一项,跑上面的验证命令,不一次改完。
|