# 变更日志 遵循 [语义化版本](https://semver.org/lang/zh-CN/):`主版本.次版本.修订号` - **主版本**:规则格式或目录结构发生不兼容变更(升级需手工迁移) - **次版本**:新增能力(新流程、新模板、新分层、新的协作机制) - **修订号**:规则内容与文案修正 --- ## [0.26.8] - 2026-10-05 ### 发版脚本给出的登录命令会登录到镜像源 **原因**:`scripts/release.ps1` 结尾提示 `npm login`(不带 registry), 而本机 `~/.npmrc` 默认 registry 是国内镜像。 **问题**:照提示执行会**登录到镜像**,随后的发布也落到镜像上 —— 命令"成功",但 npm 官方源上永远没有这个包。 (与 0.26.7 修的是同一件事的两半:一个改发布目标,一个改登录指引。) **解决方法**:提示改为 `npm login --registry https://registry.npmjs.org/`, 并注明"必须带 --registry,否则会登录到镜像"。 --- ## [0.26.7] - 2026-10-05 ### 发布目标指向镜像源,`npm publish` 不会发到 npm **原因**:本机 `~/.npmrc` 配置为 `registry=https://registry.npmmirror.com`(国内镜像), `npm publish` 默认使用该配置。 **问题**:`npm publish --dry-run` 显示 `Publishing to https://registry.npmmirror.com` —— 镜像对普通用户是只读的, 即使命令"成功",包也不会出现在 npm 官方源上, 用户执行 `npx agent-development-constraints` 依然找不到。 **解决方法**:`package.json` 增加 ```json "publishConfig": { "registry": "https://registry.npmjs.org/", "access": "public" } ``` 只影响**本包的发布目标**,不改变本机镜像配置(安装仍走镜像,速度不受影响)。 干跑确认:`Publishing to https://registry.npmjs.org/ with tag latest and public access`。 --- ## [0.26.6] - 2026-10-05 ### 脚本把 CHANGELOG 写成 0 字节 **原因**:用 PowerShell 给 CHANGELOG 插条目时, `[System.IO.File]::ReadAllText("CHANGELOG.md")` 按**进程 CWD** (不是 PowerShell 的 `cd` 位置)解析相对路径而抛异常,变量为 null; 而 PowerShell 对非终止性错误**继续执行后续语句**。 **问题**:随后的 `WriteAllText($null)` 把 **654 行的 CHANGELOG 覆盖为 0 字节**。 靠 `git checkout -- CHANGELOG.md` 恢复(内容已提交,无实际损失)。 **解决方法**: - 新增规则 **R-017**(用变量"读 → 改 → 写回"文件前必须确认非空), 并在「构建 / 命令 / 环境」症状表中加入「文件被写空 / 内容丢失」 - 教训一并写入规则:PowerShell 里给 .NET API 传路径**一律用绝对路径** (`cd` 不改 `[System.IO.*]` 的当前目录);这类破坏**不受文件版本守卫保护** --- ## [0.26.5] - 2026-10-05 ### hooks 命令是「假安装」:装了钩子却不装检查脚本 **原因**:`bin/cli.js` 的 `installHooks()` 只复制 `.githooks/` 并设置 `core.hooksPath`,未复制 `sanitize-check.ps1` / `.sh` 与 `.sanitize-deny.txt`; 而 `pre-commit` 找不到检查脚本时打印提示后 **exit 0**(放行)。 **问题**:在 python2 博客项目上实测 —— `hooks` 报告"✓ git hooks 已启用", 但每次提交只打印「⚠️ 找不到脱敏检查脚本,跳过」,**一条规则都没执行**。 提交里的凭据不会被拦,而用户以为自动化已生效。 **解决方法**: - `installHooks()` 一并安装 `scripts/sanitize-check.ps1`、 `scripts/sanitize-check.sh`、`.sanitize-deny.txt`; 已存在的一律不覆盖(保留用户按自己项目改过的黑名单) - 新增测试:断言这 4 个文件必须就位,且钩子里含 `-ExecutionPolicy Bypass` ### 钩子在非 C: 盘上每次提交都被拒 **原因**:`pre-commit` 调用 PowerShell 时未指定执行策略。实测同一份未签名脚本 在 C: 盘可运行,在 F: 盘被按"来源不可信"拦下(实际生效策略为 RemoteSigned)。 **问题**:脚本被拦 → 退出码 1 → 钩子判定"检查不通过" → **每次提交都被拒绝**, 且报错内容是执行策略而非命中的规则,很难定位。 **解决方法**:两处调用加 `-ExecutionPolicy Bypass`(开发钩子的标准做法)。 ### 检查脚本读不了文件即崩溃 **原因**:`scripts/sanitize-check.ps1` 用 `[System.IO.File]::ReadAllLines` 直读, 没有异常处理。 **问题**:`-All` 模式扫到 PyInstaller 的 `_MEI` 临时目录(文件被占用)时抛 `Access to the path ... is denied`,整次检查以异常结束 —— 一个与检查无关的文件就能让检查没有结论。 **解决方法**:读取包在 try/catch 中,读不了就跳过并打印提示。 --- ## [0.26.4] - 2026-10-05 ### 发版脚本被 PowerShell 的 stderr 误判中断 **原因**:`scripts/release.ps1` 开头是 `$ErrorActionPreference = 'Stop'`, 而 `git push` 会把进度写到 **stderr**;PowerShell 在该设置下把原生命令的 stderr 当作 `NativeCommandError` 抛出并中断脚本。 (规则库 `stacks/shell.md` 已记录此类症状:退出码 1,但命令实际成功了。) **问题**:0.26.3 发版时 `git push origin main` **实际成功**,脚本却报失败并停在 打标签之前 —— 远端 `main` 已更新而标签缺失,分支与标签不一致。 **解决方法**: - 改为 `$ErrorActionPreference = 'Continue'`;正确性由每步显式 `$LASTEXITCODE` 判断 + `Fail()` 退出保证;PS 7.3+ 另关闭 `$PSNativeCommandUseErrorActionPreference` - 脱敏检查的调用改用 `*>&1`,接住所有输出流 - 补打 `v0.26.3` 标签并推送 - 本次发版(0.26.4)用它真跑一遍,验证修复有效 --- ## [0.26.3] - 2026-10-05 ### 改动只进了源码,没进宿主实际加载的那一份 **原因**:插件以 `"agent-development-constraints": "file:F:/agent-constraints"` 装入 DSH profile。npm 对 `file:` 依赖是**安装时拷贝一份**(非软链), 之后源码改动不会同步到 `node_modules`;且宿主进程已把旧 `index.mjs` 载入内存。 **问题**:连续 6 个提交(新增 `action=symptom`、注入改成目录、R-013~C-015) 全部提交并推送、源码版本已到 0.26.2,而宿主加载的仍是 **0.24.0** —— 本次会话内所有插件改动实际未生效。用户以 "我都安装插件了 应该更新到插件里了"指出。 **解决方法**: - 用 `npm pack`(尊重 `package.json` 的 `files` 白名单)重新打包并覆盖 `~\.dsh\profiles\desktop\node_modules\agent-development-constraints`, 旧版备份为 `…bak-0.24.0` - 核对安装态:版本号、`extractSymptomIndex`、`symptom` 动作、 R-013 ~ R-016 均已存在 - 新增规则 **R-016**(改插件/依赖源码后必须更新安装态副本并重启宿主), 并把「插件 / 宿主集成」症状表中原本只指向 R-008 的那一行 改为同时指向 R-016(症状:改了插件/依赖代码但行为没变) - 交付说明中写明:新插件代码需**重启 DSH** 才加载(本次无法自行重启, 会话正运行在该宿主内) --- ## [0.26.2] - 2026-10-05 ### 变更日志写成叙事文 **原因**:变更日志没有可执行的格式约束。规则库 C-004(记录要沉淀成规则, 不能只写故事)是原则性规定,没有对应的检查。 **问题**:0.25.0 ~ 0.26.1 的条目以叙事结构书写(用户原话、排查经过、自我检讨), 原因机制、可验证后果与具体改法散落在段落中,难以检索与复用。 **解决方法**: - 0.25.0 ~ 0.26.1 四个条目按「原因 / 问题 / 解决方法」重写; 该三项之外的补充信息改放引用块,不单开小节 - 新增 `templates/changelog-entry.md`:规定结构、写作要求与反例 - 新增两条测试:0.25.0 起每个 `###` 小节必须含三个要素; 条目中不得出现叙事化措辞(引用块豁免) - 已知阳性验证:删掉一处 `**原因**` → 报 `[0.26.1] 安装指令不可用 —— 缺 原因`; 插入叙事措辞 → 对应测试失败 ### 发版脚本未推送主分支 **原因**:`scripts/release.ps1` 只执行 `git push origin `。 **问题**:打标签后远端 `main` 仍停留在上一个提交,分支内容与标签不一致。 **解决方法**:改为先 `git push origin main`,再推送标签。 --- ## [0.26.1] - 2026-10-05 ### 安装指令不可用 **原因**:`package.json` 从未发布到 npm(`npm view agent-development-constraints` 返回 404),而 README、插件未安装提示、`bin/cli.js` 注释、`docs/verify-in-dsh.md` 共 12 处给出的是 npm 短形式安装命令;同时仓库只有 `v0.6.0` / `v0.7.0` 两个标签。 **问题**:`npx agent-development-constraints install` 必然失败, 用户照文档装不上插件;GitHub 首页只显示旧版本。 **解决方法**: - 12 处改用实测可用的 `npx github:962599627/agent-development-constraints `; README 注明"必须带 `github:` 前缀"及原因 - 新增发布一致性测试:`VERSION` / `package.json` / `CHANGELOG` 首条三处必须一致; 文档不得出现短形式命令;README 列出的 CLI 子命令必须是 `bin/cli.js` 真支持的; 所有 `.ps1` 必须带 UTF-8 BOM - 新增 `scripts/release.ps1` / `scripts/release.sh`: 测试 → 脱敏 → 三处版本一致性 → 工作区干净 → 打标签并推送 → 打印发布步骤 - 打标签 `v0.26.0` / `v0.26.1` 并推送 ### `scripts/release.ps1` 无法执行 **原因**:文件存为无 BOM 的 UTF-8,Windows PowerShell 5.1 对无 BOM 的 `.ps1` 按 ANSI/GBK 读取。 **问题**:中文注释变成乱码,脚本报「字符串缺少终止符」,无法运行。 (规则库 `stacks/shell.md` 已记录此类症状。) **解决方法**:补 UTF-8 BOM;新增测试要求所有 `.ps1` 带 BOM, 并修掉脚本内部用 `pwsh -File` 调外部脚本的写法(多数 Windows 只有 `powershell.exe`)。 > **仍需账号持有人操作**:`npm login` + `npm publish`(包未发布); > GitHub Release 条目需在网页创建(`gh` CLI 未安装,标签已推送)。 --- ## [0.26.0] - 2026-10-05 ### 规则库缺少可检索入口 **原因**:插件注入的内容是一句「请调用 constraints 工具」,而规则库虽然已有 `## 快速定位 · 按症状查` 目录,但工具没有查询该目录的动作。 **问题**:出问题时无法按症状定位;AI 不主动调用工具时规则完全不生效 —— 实测连续多轮把规则库里已记录的 C-005(面向人的命令不要有长等待循环)踩了一遍。 **解决方法**: - 注入内容改为**目录**(10 个分类 + 条目数 + 检索提示,149 字符 ≈ 93 tokens, 每会话一次) - 新增 `constraints action=symptom`:不带 `q` 返回完整目录;带 `q` 返回命中条目 **及对应规则全文**;查不到时给出可用分类 - 检索用**字符二元组重合度**(中文无词边界),并把"换个说法也要命中"写成测试 - 新增 5 条测试:目录可解析、paraphrase 命中、命中给全文、未命中不抛错、 注入体积 < 400 字符且每 agent 只注入一次 ### 检索漏命中 **原因**:第一版按空格切词 + 子串匹配。 **问题**:与表内原文措辞不同的查询全部失败,例如 「没反应也不报错」(表内为「没反应、也不报错」,差一个顿号)、 「扫描报0」(表内为「扫描报告"0 处问题",但实际有」)、 「未登录返回email」(表内为「未登录接口返回 email / username」)。 **解决方法**:改为忽略标点的字符二元组重合度;补齐目录中只有英文写法的条目。 ### 注入体积超预算 **原因**:第一版把目录的全部症状逐条注入。 **问题**:1261 字符 ≈ 788 tokens,超过此前被否决的方案(约 280 tokens), 而该消息会进入会话历史并被每轮重发。 **解决方法**:注入改为章级目录(分类 + 计数),细目按需查询 —— 降至 93 tokens。 ### 文档与检查器 **原因**:README 的「分四组」未随目录扩充更新;`parameters.enum` 测试钉死了动作清单。 **问题**:README 描述与实际(10 类)不符;新增动作后该测试失败。 **解决方法**:README 中英双份更新为真实分类并补充用法;同步更新 enum 断言。 括号配平检查器不识别正则字面量,改掉两处含引号/反引号的正则写法, 并在检查器旁注明该局限。 --- ## [0.25.1] - 2026-10-05 ### README 显示过期版本号 **原因**:`README.md` / `README.zh-CN.md` 正文硬编码 `Version: 0.7.0`, 而版本一致性测试只覆盖 `index.mjs` 与 `dsh/client.js`,未覆盖文档。 **问题**:仓库首页长期显示 `0.7.0`,实际版本已到 `0.25.0`。 **解决方法**:README 不再复述版本号,改为指向 `VERSION`; 新增测试扫描 `README*.md` / `CONTRIBUTING.md` / `docs/*.md`(引用块豁免) 中的硬编码版本号。 --- ## [0.25.0] - 2026-10-05 ### 测试夹具使用生产级密码哈希 **原因**:`settings.py` 未在测试时替换 `PASSWORD_HASHERS`, 而 Django 的 `setup_test_environment()` 不会自动降级 (`PBKDF2 iterations = 1,200,000`,单次 `make_password` 0.250 秒)。 测试用例与登录流程累计产生大量哈希运算。 **问题**:511 个用例耗时 150 秒(对照实验:换用 `MD5PasswordHasher` 后 5.5 秒, 相差 27 倍)。 **解决方法**:`if "test" in sys.argv` 时改用 `MD5PasswordHasher`, 并保留 `KEEP_SLOW_HASHERS` 环境变量以便需要真实哈希时切回; 记入 R-013(含"耗时是某常数整数倍即为哈希/加密成本"的诊断方法)。 ### 检测脚本产生假阴性 **原因**:脚本用 `getattr(模型类, 字段)` 取模型字段,得到的是描述符而非 `FileField` 实例;另有非贪婪 `