动机
现有安装模型是"release 物化":每次代码更新必须发布新 GitHub Release 再重跑 install。实际痛点:change list 等能力已合并进 main,但装的 v1.1.0 没有该命令,用户终端报"没有这个指令";而 CLI 开发者本人每次改 cli.mjs/lib/ 都要走发版链路才能生效。需要一条"装一次、映射指向真实仓库目录、代码即改即生效"的开发直通入口,同时插件钩子依赖的 release 链路原封不动。
引用规范
- norms/code-style.md
- 当前结论: 渐进式治理(link 是新增模式,不重构 release 路径);同一字段不复用双语义
- 适用 scope: scripts/install-cli.sh
- norms/tdd-verification.md
- 当前结论: 先写失败契约测试再实现(test/install.test.mjs 已有 6 项安装器契约先例)
- 适用 scope: test/install.test.mjs
- 文件头接缝契约(install-cli.sh:3-12,README「安装与分发」同源)
- 当前结论: commands/options/exit/layout/信任边界是对外契约,新增子命令必须同步登记两处
- 适用 scope: scripts/install-cli.sh, README.md
决策
- 选型: 方案 A——独立
LINK 指针文件 + shim 两段解析。link <path> 校验目标(cli.mjs+package.json 存在、help --json 冒烟)通过后把绝对路径写入 $PREFIX/LINK;shim 运行时优先读 LINK,命中则 node <LINK>/cli.mjs,否则按 CURRENT 走物化版本。unlink 删除 LINK(回 release 轨)。status 输出增加 linked 字段。冲突保护复用 shim_guard。
- 对比方案: B 复用 CURRENT 存绝对路径——值域重载(版本号 OR 路径),所有解析方需适配,违背不复用语义原则;C 生成内嵌路径的 shim——relink 必须重写 shim 文件,违背"更新不动 shim"既有原则且 status 不可读。
- 理由: 双指针各有唯一语义:LINK=开发直通(存在即最高优先),CURRENT/PREVIOUS=release 物化;双轨切换各一条命令;信任边界不扩——link 目标由用户显式给出本机路径,不引入下载面;rollback/status 现有语义不破坏(status 仅 additive 字段)。
- 非目标: 不新增 PowerShell profile 入口(现有
.cmd 托管 shim 已覆盖 PowerShell/cmd,"ps1 入口"是用户对形态的类比);不改插件钩子契约;不在本次实现"link 目标的自动 git pull 同步"(仓库主人自己拉代码)。
任务
Phase 1(TDD:红 → 绿)
Phase 2(知识治理)
完整 brief:shadow-docs/changes/20260917-feature-install-link-mode/brief.md
动机
现有安装模型是"release 物化":每次代码更新必须发布新 GitHub Release 再重跑 install。实际痛点:
change list等能力已合并进 main,但装的 v1.1.0 没有该命令,用户终端报"没有这个指令";而 CLI 开发者本人每次改cli.mjs/lib/都要走发版链路才能生效。需要一条"装一次、映射指向真实仓库目录、代码即改即生效"的开发直通入口,同时插件钩子依赖的 release 链路原封不动。引用规范
决策
LINK指针文件 + shim 两段解析。link <path>校验目标(cli.mjs+package.json存在、help --json冒烟)通过后把绝对路径写入$PREFIX/LINK;shim 运行时优先读 LINK,命中则node <LINK>/cli.mjs,否则按 CURRENT 走物化版本。unlink删除 LINK(回 release 轨)。status输出增加linked字段。冲突保护复用shim_guard。.cmd托管 shim 已覆盖 PowerShell/cmd,"ps1 入口"是用户对形态的类比);不改插件钩子契约;不在本次实现"link 目标的自动 git pull 同步"(仓库主人自己拉代码)。任务
Phase 1(TDD:红 → 绿)
test/install.test.mjs— 新增失败契约用例:①link校验失败(缺 cli.mjs / 冒烟不过)不落指针、exit 3/1;②link成功后 shim 解析走 LINK 目标(以目标仓库版本输出为证)、status含linked;③unlink后 shim 回退 CURRENT 物化版本;跑一遍确认红scripts/install-cli.sh— 实现link <path>/unlink子命令与$PREFIX/LINK指针;LINK 校验与自校验复用verof/help --json冒烟;statusJSON additive 输出linked;shim(sh 与 .cmd 两模板)改为 LINK 优先两段解析;文件头接缝契约注释同步更新README.md— 「安装与分发」命令块补link/unlink用法与双轨说明(更新免重装的开发者直通语义)Phase 2(知识治理)
shadow-docs/knowledge/install-distribution.md、shadow-docs/menu.md— 新增 active 卡片:安装/分发域(指针文件集、shim 托管协议、release/link 双轨语义、信任边界、接缝契约与测试对应关系),menu 追加路由;source 指向本 brief 与两个已归档安装 briefbash scripts/install-cli.sh link D:/works/shadow-dev-cli后终端shadow-dev change list --archived立即可用;改一行代码再跑确认即时生效;unlink后回 v1.1.0 行为(记录到结果字段)完整 brief:shadow-docs/changes/20260917-feature-install-link-mode/brief.md