@minonl/dia 0.0.17 → 0.0.18

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
@@ -72,19 +72,15 @@ dia update --check # 查 npm 最新版;dia update 按安装方式升级(
72
72
  git clone https://github.com/minonl/dia ~/repos/github/dia
73
73
  cd ~/repos/github/dia
74
74
  bun install && bun run build # 或 npm ci + npm run build(Node ≥ 24)
75
- bash install.sh # → ~/.local/share/dia + ~/.local/bin/dia
75
+ npm i -g . # 仍然走 npm 全局安装(与正式安装同一条路径)
76
76
  dia version && dia doctor
77
77
  ```
78
78
 
79
79
  - 依赖:Node ≥ 24 或 Bun ≥ 1.2(见 `package.json` 的 `engines`)。
80
80
  - 安装只落盘:**不启停服务、不改宿主默认 agent**。
81
- - **安装守卫**:`~/.local/bin/dia` 当前属于包管理器全局安装(npm/bun 的 `node_modules/@minonl/dia` 软链,
82
- pnpm/yarn 的 shim 脚本,volta 的 bin —— 即会被脚本安装抢走)时,`install.sh` **拒绝并 exit 3,不改动任何文件**;
83
- 确实想换脚本安装用 `DIA_ALLOW_SCRIPT_INSTALL=1 bash install.sh`,想留在 npm 安装用
84
- `ln -sfn "$(npm prefix -g)/bin/dia" ~/.local/bin/dia`。只装到别处(不碰生效链接)用
85
- `bash install.sh --home DIR --bin BINDIR`——`--home` 单独用只改安装目录,链接仍写默认 bin,守卫照旧生效。
86
- 装完会打印 `effective: <实际生效的 dia> (<version>)`,顺带暴露 PATH 顺序问题。
87
- - `install.sh` = **开发 / 离线通道**(从仓库构建时用);日常安装/升级一律 `npm i -g @minonl/dia@latest`。
81
+ - **升级只有一条路**:`npm i -g @minonl/dia@latest`(`dia update` 会走这条)。
82
+ - `bash install.sh` 仅用于**开发 / 离线**:它把包内容拷到 `~/.local/share/dia` 并改 `~/.local/bin/dia`;
83
+ 当那条链接已属于包管理器安装时会被守卫拒绝(exit 3,零改动)。细节见 [install-guard-design.md](docs/install-guard-design.md)。
88
84
  - 内置能力(`dia-msg`)无需手动安装:首次 `persona add/render` 或 `dia collab enable` 自动装配,`dia doctor` 的 `bootstrap` 项会显示是否跟随包版本。
89
85
  - 装 persona(示例 dabo):`dia persona add dabo --from git+https://github.com/minonl/dabo-agent.git`
90
86
  - 卸载:`dia persona remove dabo`(只删带 `.dia-managed` 的产物)。
package/dist/cli.js CHANGED
@@ -7037,7 +7037,7 @@ function jobRootResolved() {
7037
7037
  function runJobCapture(argv) {
7038
7038
  const { bin, error } = jobBin();
7039
7039
  if (!bin) {
7040
- process.stderr.write(`dia job: ${error || "未找到 dia-job;先跑 packages/job/install.sh 或设置 DIA_JOB_BIN"}
7040
+ process.stderr.write(`dia job: ${error || "未找到 dia-job;npm 包不完整?`npm i -g @minonl/dia@latest` 重装;或设置 DIA_JOB_BIN"}
7041
7041
  `);
7042
7042
  return { status: 2, stdout: "", stderr: "" };
7043
7043
  }
@@ -7056,7 +7056,7 @@ function runJobCapture(argv) {
7056
7056
  function runJob(argv) {
7057
7057
  const { bin, error } = jobBin();
7058
7058
  if (!bin) {
7059
- process.stderr.write(`dia job: ${error || "未找到 dia-job;先跑 packages/job/install.sh 或设置 DIA_JOB_BIN"}
7059
+ process.stderr.write(`dia job: ${error || "未找到 dia-job;npm 包不完整?`npm i -g @minonl/dia@latest` 重装;或设置 DIA_JOB_BIN"}
7060
7060
  `);
7061
7061
  return 2;
7062
7062
  }
@@ -7165,7 +7165,7 @@ function installShadowCheck() {
7165
7165
  if (installNpm === binNpm) {
7166
7166
  return { name, status: "ok", detail: `一致(${kind(installNpm)}):install=${install};PATH dia=${binReal}` };
7167
7167
  }
7168
- const fix = installNpm ? `ln -sfn "$(npm prefix -g)/bin/dia" ${quoteArg(bin)}` : `ln -sfn ${quoteArg(join25(install, "bin/dia.js"))} ${quoteArg(bin)}`;
7168
+ const fix = `npm i -g @minonl/dia@latest && ln -sfn "$(npm prefix -g)/bin/dia" ${quoteArg(bin)}`;
7169
7169
  return {
7170
7170
  name,
7171
7171
  status: "warn",
@@ -7330,7 +7330,7 @@ async function run(opts = {}) {
7330
7330
  checks.push(installShadowCheck());
7331
7331
  checks.push(bootstrapCheck());
7332
7332
  const wt = join25(install, "packages/wt/bin/dia-wt");
7333
- checks.push({ name: "wt", status: existsSync23(wt) ? "ok" : "warn", detail: existsSync23(wt) ? wt : "dia wt 未安装(dia install.sh)" });
7333
+ checks.push({ name: "wt", status: existsSync23(wt) ? "ok" : "warn", detail: existsSync23(wt) ? wt : "dia wt 未安装(npm 包不完整?npm i -g @minonl/dia@latest 重装)" });
7334
7334
  const jobRoot = jobRootResolved();
7335
7335
  checks.push({
7336
7336
  name: "job",
@@ -11678,7 +11678,7 @@ function wtCli(argv) {
11678
11678
  ].filter(Boolean);
11679
11679
  const bin = candidates.find((c) => existsSync30(c));
11680
11680
  if (!bin) {
11681
- err("E_WT: dia-wt 未安装(先跑 dia install.sh,或设 DIA_WT_BIN)");
11681
+ err("E_WT: dia-wt 未安装(npm 包不完整?`npm i -g @minonl/dia@latest` 重装;或设 DIA_WT_BIN)");
11682
11682
  return 33;
11683
11683
  }
11684
11684
  const r = spawnSync5("bash", [bin, ...argv], { stdio: "inherit", env: process.env });
@@ -11958,9 +11958,10 @@ async function main(rawArgv) {
11958
11958
  try {
11959
11959
  source = String(JSON.parse(readFileSync26(join32(install, "install.json"), "utf8")).source || "");
11960
11960
  } catch {}
11961
- out(`这是脚本安装,不走 npm 升级。升级方式:`);
11962
- out(` cd ${source || "<dia 仓库>"} && git pull && bun run build && bash install.sh`);
11963
- out(`(或改用 npm 全局安装:npm i -g @minonl/dia@latest)`);
11961
+ out(`当前是脚本安装(${install})。推荐切到 npm 全局安装,之后升级都走 npm:`);
11962
+ out(` npm i -g @minonl/dia@latest`);
11963
+ out(` ln -sfn "$(npm prefix -g)/bin/dia" ~/.local/bin/dia # 让稳定路径指向 npm 安装`);
11964
+ out(`(仍要脚本安装:cd ${source || "<dia 仓库>"} && git pull && bun run build && bash install.sh —— 已降级为开发/离线通道)`);
11964
11965
  return 0;
11965
11966
  }
11966
11967
  const r = spawnSync5("npm", ["i", "-g", "@minonl/dia@latest"], { stdio: "inherit" });
package/docs/cli.md CHANGED
@@ -97,7 +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`);**空清单/空内容拒绝**(`E_MANIFEST`/`E_KIT_EMPTY`);`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
+ | `update [--check]` | **已实现** | 查 npm `dist-tags`;`--check` 有新版 exit 1、领先/最新 exit 0;**按安装方式分流**:npm 全局包 → `npm i -g`;脚本安装 → **统一引导切到 npm**(`npm i -g` + 回链),`bash install.sh` 只作为「开发/离线通道」备选 |
101
101
  | `deps list / record` | **已实现** | `list` = 登记 + 实测派生视图(required 缺失 exit 2);`record` = 只追加一行(`--id/--kind/--version` 必填);`src/deps.ts` + `tests/deps*.test.ts` |
102
102
  | `doctor` | **已实现** | 组合自检:persona verify / **persona.render(宿主产物只读漂移,warn + 修复命令)** / default_agent / kit(**只查该 persona 引用的**,孤儿 kit 不拖红)/ knowledge(**索引新鲜度三态**,过期给重建命令)/ dsh preset / **deps 登记校验** / **platform 版本(读 `docs/platforms/registry.json`)** / wt / **install_shadow(遮蔽提示,warn)** / **bootstrap(内置能力是否跟随包版本)**(脚本安装 vs 包管理器全局安装互相遮挡:双向一致判定,不一致 fail + 一行修复命令;shim 形态按内容识别)**;exit 0/1/2。不指定 persona 且装了多个 → **逐个自检**(条目加 `<id>.` 前缀),不再整体 `E_SCOPE` |
103
103
  | `wt …` | **已实现(需安装包)** | 转发 `packages/wt/bin/dia-wt`(create/adopt/doctor/gate/list/status/check/clean/prune-merged;详见 [worktree.md](worktree.md));未装时 `E_WT`(exit 33),`install.sh` 会分发 |
package/docs/status.md CHANGED
@@ -91,6 +91,7 @@
91
91
  | D0.21 | worktree 抽取 `packages/wt` | **完成** | 7 处 python→node;`dia wt`;4 套测试原样迁移全绿 |
92
92
  | D0.23 | doctor 平台版本自检 | **完成** | `platform:opencode` / `platform:dsh` 报版本(缺宿主 = warn,不判红);`tests/active-doctor.test.ts` |
93
93
  | D0.44 | 配置迁移走 LLM 任务 | **完成** | `docs/migrations/llm-migration.md`:升级只改声明;迁移=任务+判据+回滚;禁止代码里堆版本分支(安全敏感/原子场景例外) |
94
+ | D0.67 | npm 单一安装通道(收口) | **完成** | `dia update` 脚本安装分支统一引导 `npm i -g` + 回链;`E_WT`/`job`/`doctor wt` 报错不再让人跑 `install.sh`;`install_shadow` 修复命令统一 npm;README 主流程只留 npm,`install.sh` 降为开发/离线 |
94
95
  | D0.66 | 内置能力分层(dia-msg 用户零操作) | **完成** | `kit.install` 原子换入 + 数据根锁;版本 semver 排序;`installDir()` 校验;`collab enable` 失败退 32;自举戳 `~/.dia/state/bootstrap.json` + `doctor bootstrap` 检查;`install_shadow` 降 warn;设计见 [builtin-kit-design.md](builtin-kit-design.md) |
95
96
  | D0.65 | 安装防呆:脚本安装不抢包管理器全局安装 | **完成** | `install.sh` 守卫(目标 bin 属于包管理器全局安装且为 `command -v dia` 命中项 → exit 3,零改动):npm/bun 软链看 `node_modules/@minonl/dia`,pnpm/yarn shim 看内容,volta 看 bin 目录;放行 = `DIA_ALLOW_SCRIPT_INSTALL=1` / `--dry-run` / **bin 目录被重定向**(`--home` 等只改安装目录不算沙箱);装完打印 `effective:`;`doctor install_shadow` 双向一致判定(含 shim);`tests/install-guard.test.sh` + `tests/install-guard-strict.test.sh` |
96
97
  | D0.64 | 复制过滤按相对路径判断 | **完成** | 绝对路径匹配 `node_modules` 会误伤 npm 全局安装(kit 整树被过滤 → `E_KIT_EMPTY`);改 `copyFilter(base)` 用相对路径,persona/kit 共用 |
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@minonl/dia",
3
- "version": "0.0.17",
3
+ "version": "0.0.18",
4
4
  "type": "module",
5
5
  "description": "dia (嗲) — lightweight agent framework: knowledge index, audit, session ingest",
6
6
  "bin": {