universal-dev-standards 6.14.0-beta.3 → 6.14.0-beta.5
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/bin/uds.js +7 -1
- package/bundled/ai/standards/ai-response-navigation.ai.yaml +43 -3
- package/bundled/ai/standards/checkin-standards.ai.yaml +25 -6
- package/bundled/ai/standards/full-coverage-testing.ai.yaml +46 -5
- package/bundled/ai/standards/pipeline-security-gates.ai.yaml +5 -1
- package/bundled/core/ai-response-navigation.md +128 -12
- package/bundled/core/full-coverage-testing.md +57 -3
- package/bundled/extensions/frameworks/fat-free-patterns.md +937 -0
- package/bundled/extensions/languages/csharp-style.md +464 -0
- package/bundled/extensions/languages/php-style.md +700 -0
- package/bundled/extensions/locales/zh-cn.md +717 -0
- package/bundled/extensions/locales/zh-tw.md +717 -0
- package/bundled/locales/COVERAGE.md +5 -4
- package/bundled/locales/zh-CN/CHANGELOG.md +54 -3
- package/bundled/locales/zh-CN/README.md +2 -2
- package/bundled/locales/zh-CN/SECURITY.md +1 -1
- package/bundled/locales/zh-CN/core/ai-response-navigation.md +110 -12
- package/bundled/locales/zh-CN/core/full-coverage-testing.md +61 -7
- package/bundled/locales/zh-CN/docs/CHEATSHEET.md +3 -1
- package/bundled/locales/zh-CN/docs/FEATURE-REFERENCE.md +8 -5
- package/bundled/locales/zh-CN/skills/README.md +1 -0
- package/bundled/locales/zh-CN/skills/comprehension-ladder/SKILL.md +289 -0
- package/bundled/locales/zh-CN/skills/comprehension-ladder/eval-cases.md +261 -0
- package/bundled/locales/zh-TW/CHANGELOG.md +54 -3
- package/bundled/locales/zh-TW/README.md +2 -2
- package/bundled/locales/zh-TW/SECURITY.md +1 -1
- package/bundled/locales/zh-TW/core/ai-response-navigation.md +110 -12
- package/bundled/locales/zh-TW/core/full-coverage-testing.md +61 -7
- package/bundled/locales/zh-TW/docs/CHEATSHEET.md +3 -1
- package/bundled/locales/zh-TW/docs/FEATURE-REFERENCE.md +8 -5
- package/bundled/locales/zh-TW/skills/README.md +1 -0
- package/bundled/locales/zh-TW/skills/comprehension-ladder/SKILL.md +289 -0
- package/bundled/locales/zh-TW/skills/comprehension-ladder/eval-cases.md +261 -0
- package/bundled/skills/README.md +1 -0
- package/bundled/skills/comprehension-ladder/SKILL.md +283 -0
- package/bundled/skills/comprehension-ladder/eval-cases.md +255 -0
- package/bundled/templates/gates/check-anti-fake-tests.mjs +991 -0
- package/bundled/templates/gates/check-stubs.mjs +644 -0
- package/package.json +3 -3
- package/src/commands/audit.js +11 -0
- package/src/commands/check.js +124 -24
- package/src/commands/init.js +45 -9
- package/src/commands/update.js +183 -21
- package/src/core/install-records.js +2 -1
- package/src/i18n/messages.js +50 -9
- package/src/installers/standards-installer.js +16 -23
- package/src/reconciler/backup-manager.js +418 -82
- package/src/reconciler/index.js +27 -5
- package/src/reconciler/install-roots.js +90 -0
- package/src/reconciler/plan-executor.js +33 -13
- package/src/uninstallers/hook-uninstaller.js +7 -4
- package/src/utils/command-hash-ownership.js +103 -0
- package/src/utils/copier.js +78 -1
- package/src/utils/gate-scripts.js +141 -0
- package/src/utils/git-hooks.js +8 -4
- package/src/utils/health-scorer.js +10 -7
- package/src/utils/locale.js +19 -0
- package/src/utils/skill-hash-ownership.js +64 -0
- package/src/utils/skills-installer.js +12 -1
- package/src/utils/test-change-check.js +160 -0
- package/src/utils/test-policy.js +214 -0
- package/src/utils/update-summary.js +29 -0
- package/standards-registry.json +21 -7
|
@@ -3,9 +3,9 @@
|
|
|
3
3
|
> Auto-generated by `scripts/generate-locale-coverage.mjs` on 2026-07-16.
|
|
4
4
|
> Do not edit manually — re-run the script.
|
|
5
5
|
|
|
6
|
-
> **Canonical**: `skills/` (
|
|
6
|
+
> **Canonical**: `skills/` (56) + `core/` (149). **Locales tracked**: `zh-CN`, `zh-TW`.
|
|
7
7
|
|
|
8
|
-
## Skills (
|
|
8
|
+
## Skills (56 canonical)
|
|
9
9
|
|
|
10
10
|
| Skill | zh-CN | zh-TW |
|
|
11
11
|
| :-- | :-: | :-: |
|
|
@@ -24,6 +24,7 @@
|
|
|
24
24
|
| ci-cd-assistant | :white_check_mark: 1.0.0 | :white_check_mark: 1.0.0 |
|
|
25
25
|
| code-review-assistant | :white_check_mark: 1.0.0 | :white_check_mark: 1.0.0 |
|
|
26
26
|
| commit-standards | :white_check_mark: 1.0.0 | :white_check_mark: 1.0.0 |
|
|
27
|
+
| comprehension-ladder | :white_check_mark: 1.0.0 | :white_check_mark: 1.0.0 |
|
|
27
28
|
| contract-test-assistant | :white_check_mark: 1.0.0 | :white_check_mark: 1.0.0 |
|
|
28
29
|
| database-assistant | :white_check_mark: 1.0.0 | :white_check_mark: 1.0.0 |
|
|
29
30
|
| deploy-assistant | :white_check_mark: 1.0.0 | :white_check_mark: 1.0.0 |
|
|
@@ -65,8 +66,8 @@
|
|
|
65
66
|
| test-coverage-assistant | :white_check_mark: 1.1.0 | :white_check_mark: 1.1.0 |
|
|
66
67
|
| testing-guide | :white_check_mark: 1.2.0 | :white_check_mark: 1.2.0 |
|
|
67
68
|
|
|
68
|
-
**zh-CN skills coverage**:
|
|
69
|
-
**zh-TW skills coverage**:
|
|
69
|
+
**zh-CN skills coverage**: 56/56 (100%)
|
|
70
|
+
**zh-TW skills coverage**: 56/56 (100%)
|
|
70
71
|
|
|
71
72
|
## Standards (`core/` — 149 canonical)
|
|
72
73
|
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
---
|
|
2
2
|
source: ../../CHANGELOG.md
|
|
3
|
-
source_version: 6.14.0-beta.
|
|
4
|
-
translation_version: 6.14.0-beta.
|
|
5
|
-
last_synced: 2026-
|
|
3
|
+
source_version: 6.14.0-beta.5
|
|
4
|
+
translation_version: 6.14.0-beta.5
|
|
5
|
+
last_synced: 2026-10-06
|
|
6
6
|
status: current
|
|
7
7
|
---
|
|
8
8
|
|
|
@@ -17,6 +17,57 @@ status: current
|
|
|
17
17
|
|
|
18
18
|
## [Unreleased]
|
|
19
19
|
|
|
20
|
+
## [6.14.0-beta.5] - 2026-10-06
|
|
21
|
+
|
|
22
|
+
> **测试版**——以 `npm install -g universal-dev-standards@beta` 安装。要测什么、如何退回正式版:[docs/PRE-RELEASE.md](../../docs/PRE-RELEASE.md)。
|
|
23
|
+
>
|
|
24
|
+
> **行为改变:**`uds check` 计入技能与命令文件的缺失或修改(`--ci` 以 1 结束);`uds check --diff` 以所装包为原稿,不再抓取 GitHub `main`;`uds init` 会加入两个在提交时警告的扫描脚本。
|
|
25
|
+
|
|
26
|
+
### Changed
|
|
27
|
+
|
|
28
|
+
- **行为改变——`uds check --diff` 现在以你所安装的 UDS 包内的文件为原稿,不再对照 GitHub `main`。** 这个差异回答的是“我改了 UDS 给我的哪些地方”;它过去从 GitHub `main` 下载原稿,所以离线会失败(扩展文件也一样),而且 UDS 在你安装后自己改过的内容,会被列成你改的差异。现在原稿一律从所装包读取——标准、选项、扩展文件皆同——不下载任何内容。命令会打印比对基准(`installed UDS package (version X)`),并提示查看 UDS 之后的变更请用 `uds update --plan`。若项目内的标准是从另一个 UDS 版本安装的、与当前安装的包版本不同,也会明说,因为两个版本之间 UDS 改过的文件会显示成差异。包内找不到某个受追踪文件的原稿时,命令会**点名**该文件、不下载、以退出码 1 结束;不再退回 GitHub,也不再静默跳过。没有被修改的文件时,`--diff` 现在会说“没有差异可显示”,而不是什么都不打印。**谁会看到不同:**执行 `uds check --diff`(或在交互式 `uds check` 中选择“查看”)的人——凡是 `main` 与你所装版本不同之处,差异可能与以往不同;而原本在包缺原稿时读到退出码 0 的脚本,现在会读到 1。**要做什么:**无需任何操作;要查看上游有什么新内容,请执行 `uds update --plan`。落实 dev-platform XSPEC-453 R1。
|
|
29
|
+
|
|
30
|
+
### Removed
|
|
31
|
+
|
|
32
|
+
- **移除 `extensions/languages/php/`**——两个没有任何东西引用的文件(`php-style.md`、`fat-free-patterns.md`,约 37 KB);安装器、registry 与文档使用的是 `extensions/languages/php-style.md` 与 `extensions/frameworks/fat-free-patterns.md`,两者不变。npm 包因此少了这两个文件,现在恰好只含安装器装得到的 5 个扩展文件;新增的测试会在有未声明的扩展文件被打包时变红。`uds init --lang php` 与 `--framework fat-free` 安装的文件与先前相同。落实 dev-platform XSPEC-453 R2。
|
|
33
|
+
|
|
34
|
+
### 修复
|
|
35
|
+
|
|
36
|
+
- **健康分数的覆盖度维度不再报告永远是 0 的 `has_tests`。**`calculateCoverage` 声明了 `hasTests = 0` 却从未改动它,所以 `uds audit --score` 打印出一个看起来像“标准有没有测试”的度量、实际上不会动的数字。它已从加总与 `details` 移除;**任何项目的覆盖度分数都不变**(分母本来就是每个标准两份——`check-<id>.sh` 与 `check-<id>-sync.sh`)。(XSPEC-444 R5)
|
|
37
|
+
- **行为改变——`uds check` 现在会把缺失或被改过的技能文件计入判定。它以前会打出红色 ✗,结尾却仍说「项目符合标准」、exit 0。** Skills 完整性检查的结果算出来之后被丢掉了。现在删掉或改过技能文件,`uds check` 会说「检测到一些问题」并点名该文件,`uds check --ci` 会 exit 1(不带 `--ci` 时 exit code 仍是 0,与其他各类发现一致;UDS 写的 pre-commit hook 运行的是不带参数的 `uds check`,所以不会因此被挡)。**谁会看到差别:**技能文件夹被改过或丢了文件的项目。**怎么处理:**运行消息打印出的命令 `uds update --apply --skills`。**幽灵记录先处理,所以已有项目不会突然开始失败:**项目的 manifest 可能列着 UDS 从未安装的技能文件——采用者自己的技能,以及旧版 UDS 因为哈希整个文件夹而误拷进技能文件夹的 `agents/`、`workflows/`、`_shared/`,后来 `uds update` 把它们删了却没忘掉记录(有个项目显示 26 个「缺失」,6.11.0 与 6.14.0-beta.4 相同)。现在安装器只记录自己装的技能(也不记录自己的 `.manifest.json`);`uds update` 删掉技能文件夹时一并删掉它的记录;`uds check` 忽略不描述任何发布技能的记录并说出有几条(`N skill record(s) ignored`);`uds update`(`--apply`、`--skills`,或已是最新版的路径)会把它们从 `.standards/manifest.json` 永久清掉。**斜杠命令文件同样适用**——它的检查结果原本也被丢弃:命令文件被删或被改,`uds check` 现在会点名,`--ci` 会 exit 1(修复:`uds update --apply --commands`)。UDS 不发布的命令记录由 `uds update` 清掉;装在用户级(所有项目共用,本项目无从背书)的命令记录,检查会忽略并说明。另外,当「改代码没动测试」或「假测试」检查设为 `"mode": "block"` 时,`uds check` 打印 BLOCKED 后不再以「符合标准」收尾。落实 dev-platform XSPEC-454 R2。
|
|
38
|
+
- **`uds update --rollback` 现在还原整个升级,而不只是标准文件。** 依次运行 `update --apply`、`update --apply --skills`、`update --apply --commands` 后,一次 `--rollback` 只还原标准文件与 `CLAUDE.md`/`AGENTS.md`,新增的技能文件夹(`comprehension-ladder`)、技能与命令的 `.manifest.json`、以及 `.standards/manifest.json` 里的哈希记录都留在新版,于是 `uds check` 报修改过的文件,项目同时不符合两个版本。原因:备份只记录计划要覆盖的文件(没有更新所创建的文件,也没有 `.standards/manifest.json`);`--skills` 与 `--commands` 写文件时完全没有备份;还原用的 `copyFileSync` 还原不了文件夹。现在 `--apply`、`--apply --skills`、`--apply --commands` 的每一步都创建备份,并记录它所创建的文件(`--skills`/`--commands` 自己创建备份,没有备份就不写;只备份 UDS 发布的技能与命令,不碰你自己的);不带 `--apply` 的一般 `uds update` 仍和以前一样不创建备份;连续的步骤以 `.standards/manifest.json` 前后的哈希串起来,所以一次 `--rollback` 会一路退过整串没有被打断的升级,并在中间有别的变更处停下来、明说;还原后会读回验证;命令会打印还原了什么、移除了什么,若有任何失败,**不会以「成功」收尾**(exit 1,并说明怎么重试)。**没有涵盖、并会如实打印:**用户级的技能/命令(`~/.claude/skills`,由所有项目共用),以及旧版本做的备份(它们从未记录所创建的文件与 manifest)。落实 dev-platform XSPEC-454 R1。
|
|
39
|
+
- **`uds update --commands` 把命令数打成了工具数**(只有一个 OpenCode 却打「为 51 个 AI 工具更新」)。该消息键在每个语言都写成「N 个 AI 工具」,却被填入命令文件数。现在有独立的消息,两个字段各放各的数字:「Updated 51 commands for 1 AI tool(s)」/「已為 1 個 AI 工具更新 51 個斜線命令」/「已为 1 个 AI 工具更新 51 个斜线命令」。旧键的其他用法本来就传工具数,不变。落实 dev-platform XSPEC-454 R4。
|
|
40
|
+
|
|
41
|
+
### 新增
|
|
42
|
+
|
|
43
|
+
- **`uds init` 现在会附上 `full-coverage-testing` 一直要你自己写的假测试与空壳扫描脚本,`uds check` 会把它们找到的东西以警告打印。**标准一直写着“新增 `scripts/check-stubs.sh` 与 `scripts/check-anti-fake-tests.sh`”,验证器也只检查这两个文件存在——但 UDS 两个都没附,这条指示根本照做不了。`uds init` 现在会写入 `scripts/check-anti-fake-tests.mjs`(找**没有断言**的测试、唯一的断言是 `expect(true).toBe(true)` 或 `assert 200 == 200` 这类**恒真式**的测试、**每个测试都被跳过或标 todo** 的测试文件)与 `scripts/check-stubs.mjs`(`// WARNING: STUB` 标记、声称**尚未实现**而旁边没有标记的函数体、函数体**为空**而旁边没有标记的具名函数)。纯 Node、零依赖、不预设测试框架;它们是你的文件。单独运行时,找到东西就以非 0 退出。**`uds check`——pre-commit hook 执行的命令——会运行它们并把找到的东西打印成警告;不拦任何东西**,除非你在 `.standards/test-policy.json` 设 `"mode": "block"`。有暂存文件时扫描那些文件;没有暂存任何东西时(CI 运行)扫描整个项目。**测试文件规则覆盖 JavaScript/TypeScript、Python、Java/Kotlin/Scala/C#、Go、Rust、Ruby、Elixir、PHP、Swift、Dart、Lua 与 C/C++;其他语言的测试文件会被列为“未扫描”,绝不当成干净。**它们读的是文本、不运行你的测试,所以用扫描器认不出的名称做断言的辅助函数会被报为“no-assertion”(请命名为 `assert*`/`verify*`/`expect*`,或把模式列在 `assertionPatterns`)。每次运行都先拿已知的假测试与好测试检验自己,失败就以 `2`(“无法判定”,绝不算通过)退出。已存在的文件绝不覆盖;`uds uninstall` 只移除 `uds init` 写入且未被改动的文件;较早初始化的项目由 `uds update` 询问是否写入(提示的默认为否;**`uds update -y` 会直接回答是**,所以升级命令是 `uds update -y` 的项目,下次更新就会多这两个文件)。**谁会看到差别:**本版之后每次 `uds init` 会在 `scripts/` 多两个文件,每次提交 `uds check` 会多打印两行(或找到的东西)。**怎么处理:**读它的发现;想让某类文件不再被报,加一份 `test-policy.json`;想强制执行,设 `"mode": "block"` 或在 CI 跑这两个脚本。`uds check --standard full-coverage-testing` 现在会运行这两个脚本,不再只检查它们存在。(XSPEC-444 R5)
|
|
44
|
+
- **`uds check` 在一次提交改了代码却没动任何测试时发出警告。**有文件暂存时,`uds check` 会在“改了代码文件、同一次提交没有测试文件变动”时列出那些代码文件,并列出它不认识类型的变更文件(绝不当成没事,也绝不拦)。删除不需要测试;纯重命名(git `R100`)与匹配 `exempt` 条目的路径可免,输出会记下理由。哪些路径是测试、哪些是代码,是带有常见生态默认值的数据——`*.test.*`、`*_test.go`、`test_*.py`、`*Test.java`、`tests/` 等——由 `.standards/test-policy.json`(`testDirs`、`testPatterns`、`sourceExtensions`、`nonCodeExtensions`、`ignore`,以及每条都必须附 `reason` 否则不生效的 `exempt`)**加进**而不是取代。**它只警告、放行提交。**同一份文件里的 `"mode": "block"` 会让它拦下提交;这是目前提供的唯一收紧步骤。**没有做,因为规格没有定义:**未配测试的变更数棘轮(基线放在哪、以什么计数),以及逐次提交的豁免理由(pre-commit hook 读不到提交信息)。(XSPEC-444 R2)
|
|
45
|
+
- **`uds audit --offline`。** `check` 与 `update` 早就有,`audit` 却回「unknown option」。加上它之后,`audit` 不发任何网络请求——包含每个命令结束后的「有新版本」提示(它对 `check`、`update` 也忽略 `--offline`,现在都遵守);`--report` 会说「离线模式:不提交回报。」(并指出出路 `--dry-run`),而不是去启动 `gh`、浏览器或剪贴板。落实 dev-platform XSPEC-454 R3。
|
|
46
|
+
|
|
47
|
+
## [6.14.0-beta.4] - 2026-10-06
|
|
48
|
+
|
|
49
|
+
> **测试版**——以 `npm install -g universal-dev-standards@beta` 安装。要测什么、如何退回正式版:[docs/PRE-RELEASE.md](../../docs/PRE-RELEASE.md)。
|
|
50
|
+
>
|
|
51
|
+
> **行为改变:**`uds check --standard checkin-standards` 在 lint 或测试失败时会失败;非 Node 项目的原生 pre-commit hook 现在能拦住提交。见下方 Fixed 的相关条目。
|
|
52
|
+
|
|
53
|
+
### 修复
|
|
54
|
+
- **`extensions/` 现在放进 npm 包,`uds init`、`uds update` 与 reconciler 只从包内安装扩展文件——三者都不再从 GitHub 下载。** 6.13.1 版包里 `extensions/` 下的 7 个文件(语言风格规范、框架模式、繁中与简中语系包)一个都没有,所以 `uds init --lang csharp`、`--lang php`、`--framework fat-free`、`--locale zh-tw`/`zh-cn` 安装时是去 GitHub `main` 下载。后果有两个:离线或公司内网装不了这些扩展;而且拿到的是 `main` 当天的内容,不是你所装版本对应的那个文件。同一个后备也把缺少的 `zh-cn.md` 藏了好几个月。现在 `cli/scripts/prepack.mjs` 会把整个目录打包;包内容一致性检查会逐文件、逐字节比对 `extensions/` 与包(以前只比对 `.ai.yaml` 标准,所以一个扩展文件都没有的包也会显示“bundle parity holds”);声明的扩展文件若不在包内,安装会**失败并指出该文件**——不下载、也不静默跳过。**谁会看到差别:**从 npm 安装的人多拿到 7 个文件(约 152 KB),且这些文件不再发出任何网络请求;`uds update` 也从包内更新 `manifest.extensions` 的条目。**没有改的:**其他在本地缺文件时仍会尝试 GitHub 的地方(标准、选项、集成文件、技能),以及 `uds check --diff`——它仍会从 GitHub `main` 抓任何追踪文件(含扩展文件)的原稿来比对。这份清单列在规格里,本次不动。新增的测试会运行 `npm pack`、把压缩包装进一次性目录、封锁并记录网络,对已安装包声明的每一个扩展选项运行 `uds init`,再逐字节读回每个已安装的文件;第二个测试从包中移除一个声明的文件,要求安装以该文件的名称失败,且没有任何下载尝试。落实 dev-platform XSPEC-452 的 R1、R2、R3。
|
|
55
|
+
- **`uds init --locale` 不区分大小写,且不支持的语言会明确提示**:`--locale zh-CN` 以前会安装英文并报告成功,现在会安装简体中文。不支持的值(例如 `fr`)仍改用英文安装,但会打印警告,不再静默。(dev-platform XSPEC-451 后续)
|
|
56
|
+
|
|
57
|
+
- **行为改变——`uds check --standard checkin-standards` 在你的 lint 或测试失败时现在会失败;它以前会说“通过”。** 该验证器原本是 `(npm test --if-present || echo "No test script")`。`--if-present` 本来就处理“没有测试脚本”的情况;`|| echo` 因此只做了一件事:把失败的 `npm test` 或 `npm run lint` 变成 exit 0。UDS 自己的 `test-governance` 标准要求闸门 fail-closed,它自己发布的检查却没做到。现在:lint 或测试脚本失败会返回非 0,并指出是哪一个(`FAILED: npm run test exited with 1`,后面接该脚本自己的输出);真的没有该脚本不算失败,并且**只有这时**才打印 `No lint script`/`No test script`;`npm init` 为 `test` 写的默认占位(`echo "Error: no test specified" && exit 1`)视为没有;没有 `package.json` 的项目通过,并打印 lint 与测试**没有**被执行;`package.json` 存在却无法解析会失败,不会被当成“没有脚本”。缺 `CHANGELOG.md` 仍只是提示。**谁会看到差别:**pre-commit hook 执行 `check --standard checkin-standards` 的项目(UDS 在 2026-02-04 至 2026-03-04 写的 hook,`uds update` 会把它保留成区块的参数),以及在 CI 或脚本里执行该命令的人。过去带着失败的测试也能提交成功的 commit,现在会被拦下——这正是目的。**怎么处理:**执行 `npm test`/`npm run lint`,修掉它们报告的问题。没有测试的项目不受影响。全新的 `uds init` 所写的 hook 执行的是不带参数的 `uds check`,它不评估这个验证器;它该不该评估是另一个决定,本次不变。验证器现在会执行 `node`,凡是在运行 `uds` CLI 的项目本来就有。
|
|
58
|
+
- **`pipeline-security-gates` 验证器不再在没有任何 pipeline 提到安全闸门时通过。**它把 `grep` 接到 `head -1`,再以 `|| echo 'no-ci-pipeline'` 兜底;`head` 永远返回 0,所以兜底从不执行,这个检查不可能失败。现在改用 `grep -q`,除非 `.github/workflows/`、`.gitlab-ci.yml` 或 `Jenkinsfile` 提到 `secrets`、`sast`、`sca` 或 `dast`,否则返回非 0。只有 `uds check --standard pipeline-security-gates` 会执行它。
|
|
59
|
+
- **`uds init` 为非 Node 项目写的原生 `.git/hooks/pre-commit` 现在真的能拦下 commit。**它原本把每个 linter 都写成 `... 2>/dev/null || true`,把 `uds check 2>/dev/null || true` 也是,最后打印“Pre-commit checks passed”——什么都拦不了,还把自己的错误藏起来。现在:已安装的 linter(`ruff`、`go vet`、`cargo clippy`)失败会拦下 commit,没安装的 linter 则跳过;UDS 检查改用与 husky hook 相同的标记区块,所以它的退出码会拦下 commit,而找不到 `universal-dev-standards` CLI 时会说明如何安装并拦下,不再静默跳过。`uds uninstall` 会整段移除该区块,连你改过的脚本也一样。**磁盘上既有的 hook 维持原样**——UDS 无法证明一个被改过的文件是自己写的,这一项也没有随本次变更附上迁移。
|
|
60
|
+
- **`uds init --locale zh-cn` 现在可用。它以前会失败并把整个安装回滚。** 安装程序声明了 `zh-cn`,并会复制 `extensions/locales/zh-cn.md`,但这个文件不存在(只有 `zh-tw.md`),所以安装以 `extensions/locales/zh-cn.md: File not available` 收场,并移除它装过的所有东西——没有人能用简体中文安装 UDS,而且没有任何测试用简体中文跑过安装,所以一直坏着。现在这个文件存在了:它是以大陆通行术语写成的简体中文语系包(不是把繁体版逐字转换——它的术语表写“Performance → 性能”,繁体版写的正好相反)。它以 `zh-cn-locale` 登记在 `zh-tw-locale` 旁边。新增的测试对安装程序声明的每一个语系实际运行真正的 `uds init`(列表从安装程序读出,不写在测试里),并读回语系包、manifest 与已安装的技能;有语系声明了却没有对应文件,测试就会变红并指出是哪个语系。理解阶梯的安装测试现在也让 zh-CN 走 `uds init`。**npm 安装的注意事项:**写下这一条时 `extensions/` 不在 npm 包里,语系包是安装时从 GitHub(`main`)下载的;现在它已放进包内(见上方 `extensions/` 那一条)。落实 dev-platform XSPEC-451 的 R1、R2。
|
|
61
|
+
|
|
62
|
+
### 新增
|
|
63
|
+
|
|
64
|
+
- **`ai-response-navigation` 1.3.0 → 1.4.0——R12 受控语言,其中一条为必须。** 把文字简化会让它更好读,而最好读的句子是肯定的句子,所以「简化」会朝肯定的方向漂移:「可能」变成「是」。R12 把答案分成两半。**12.1 属必须**:为非原作者的读者缩短、简化、改写或翻译文字时,要保留写作者的不确定语气(might、could、probably、可能、推断、尚未确认),不可把不确定的论断改成确定的,也不可加入原文没说的事实。只有这一部分的失败会让读者相信不真实的事,而且不需要校准:检查就是拿改写前后比对,任何语言都做得到。**12.2 属可选**,理由已写进标准:以该语言自己的单位计句长(起始范围,按语言校准)、同物同名、主动语态、一步一动作、少用分号、数字带单位。R10 现在指向 R12。
|
|
65
|
+
- **不附英文词典,并在标准里明说。** 这些原则取自 ASD-STE100,但它的核可词表与时态限制依赖英文,不适用于中文或其他非英文文字。标准只取原则、不附任何词表,并警告:以空白分词的计数器会把一整段中文看成一个词,永远通过。
|
|
66
|
+
- **一组中文示例**:同一段文字的原文、约 80%、严格三个版本,全部保留不确定语气,外加第四个更短却错误的改写(把「可能」改成直接陈述的原因、把「尚未复现」改成「已确认」)。同步 zh-TW 与 zh-CN、两份 `.ai.yaml`,以及一个读取实际出货文件的测试——必须条款被削弱或删除时它会变红。
|
|
67
|
+
- **新增技能 `comprehension-ladder`(`/comprehend`)1.0.0 — 把一段难懂的 AI 输出换成较好懂的形式,而且不改变事实。** 技能先从原文建立一份大纲,再从大纲做出最多三阶:受控文字、Mermaid 图、单文件 HTML 解说页(可离线打开,不从网络加载任何东西)。没有视频阶。**三条防护为必须**,各附正例与反例:不加原文没有的事实、保留每一个不确定语气(「可能」仍是「可能」)、每一项都附对应原文的位置与「没涵盖」注记。技能本身依 [ai-response-navigation](../../core/ai-response-navigation.md) 第 12 条(受控语言)写成,防护 G2 就是 12.1 条。
|
|
68
|
+
- **尚未证明有帮助。** `skills/comprehension-ladder/eval-cases.md` 有 5 段为此撰写的原文,各附理解题与标准答案,并附一套跑法,会产出两个数字:前后的答对率,以及防护违反次数。实跑需要模型调用,目前还没做。做完之前,技能不宣称有效。
|
|
69
|
+
- 提供 `zh-TW` 与 `zh-CN` 版本,并登记于 registry、manifest、`llms.txt` 与技能索引。有一支测试会在抛弃式项目里运行真正的 `uds init`,读回安装后的技能:三条防护都在、且标为必须,HTML 阶禁止外部资源,也没有视频阶。
|
|
70
|
+
|
|
20
71
|
## [6.14.0-beta.3] - 2026-09-30
|
|
21
72
|
|
|
22
73
|
> **测试版**——以 `npm install -g universal-dev-standards@beta` 安装。要测什么、如何退回正式版:[docs/PRE-RELEASE.md](../../docs/PRE-RELEASE.md)。
|
|
@@ -15,7 +15,7 @@ status: current
|
|
|
15
15
|
|
|
16
16
|
> **语言**: [English](../../README.md) | [繁體中文](../zh-TW/README.md) | 简体中文
|
|
17
17
|
|
|
18
|
-
**版本**: 6.14.0-beta.
|
|
18
|
+
**版本**: 6.14.0-beta.5 (Pre-release) | **发布日期**: 2026-10-06 | **授权**: [双重授权](../../LICENSE) (CC BY 4.0 + MIT)
|
|
19
19
|
|
|
20
20
|
语言无关、框架无关的软件项目文档标准。通过 AI 原生工作流,确保不同技术栈之间的一致性、质量和可维护性。
|
|
21
21
|
|
|
@@ -77,7 +77,7 @@ npx universal-dev-standards init
|
|
|
77
77
|
| 类别 | 数量 | 说明 |
|
|
78
78
|
|----------|-------|-------------|
|
|
79
79
|
| **核心标准** | 153 | 通用开发准则 |
|
|
80
|
-
| **AI Skills** |
|
|
80
|
+
| **AI Skills** | 56 | 互动式技能 |
|
|
81
81
|
| **斜线命令** | 51 | 快速操作 |
|
|
82
82
|
| **CLI 命令** | 24 | 项目设置与维护 |
|
|
83
83
|
<!-- UDS_STATS_TABLE_END -->
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
---
|
|
2
2
|
source: ../../../core/ai-response-navigation.md
|
|
3
|
-
source_version: 1.
|
|
4
|
-
translation_version: 1.
|
|
5
|
-
last_synced: 2026-
|
|
3
|
+
source_version: 1.4.0
|
|
4
|
+
translation_version: 1.4.0
|
|
5
|
+
last_synced: 2026-10-05
|
|
6
6
|
status: current
|
|
7
7
|
---
|
|
8
8
|
|
|
@@ -10,8 +10,8 @@ status: current
|
|
|
10
10
|
|
|
11
11
|
> **语言**: [English](../../../core/ai-response-navigation.md) | [繁體中文](../../zh-TW/core/ai-response-navigation.md) | 简体中文
|
|
12
12
|
|
|
13
|
-
**版本**: 1.
|
|
14
|
-
**最后更新**: 2026-
|
|
13
|
+
**版本**: 1.4.0
|
|
14
|
+
**最后更新**: 2026-10-05
|
|
15
15
|
**适用范围**: 所有使用 AI 辅助开发的项目
|
|
16
16
|
**范围**: universal
|
|
17
17
|
**行业标准**: 无(新兴 AI 工具实践)
|
|
@@ -27,10 +27,13 @@ status: current
|
|
|
27
27
|
|
|
28
28
|
**解决方案**:在每个实质性 AI 响应结尾附加标准化的「导航区块」,包含情境模板、推荐标记和弹性选项数量。
|
|
29
29
|
|
|
30
|
-
**范围注记(v1.2.0,v1.3.0 扩充)**:规则 1–6 管的是答案**之后**要附什么。
|
|
31
|
-
规则 7–
|
|
32
|
-
白话是主语(R10)、每个选项都要带自己的利弊而非只有推荐项有(R11
|
|
33
|
-
|
|
30
|
+
**范围注记(v1.2.0,v1.3.0、v1.4.0 扩充)**:规则 1–6 管的是答案**之后**要附什么。
|
|
31
|
+
规则 7–12 管的是答案本身:先讲发现(R7)、每轮重述进度(R8)、不要开场白(R9)、
|
|
32
|
+
白话是主语(R10)、每个选项都要带自己的利弊而非只有推荐项有(R11)、受控语言(R12)。
|
|
33
|
+
规则 7–11 **属可选**。**规则 12 是唯一的例外,而且只有一部分**:其中「简化后的文字要保留写作者的不确定语气」
|
|
34
|
+
这一条**属必须**,其余部分属可选。新增的理由是——
|
|
35
|
+
一个响应可以满足规则 1–6 的每一条,同时把结论埋起来、用只有作者持有的词汇讲它、列出读者还得自己比较的选项,
|
|
36
|
+
或是靠「比证据更肯定」来变得好读;
|
|
34
37
|
**而找不到答案的读者,不会因为结尾有一个正确的导航区块被告知下一步而得到帮助。**
|
|
35
38
|
|
|
36
39
|
---
|
|
@@ -109,11 +112,13 @@ status: current
|
|
|
109
112
|
|
|
110
113
|
---
|
|
111
114
|
|
|
112
|
-
## 导航之前的那个答案(规则 7–
|
|
115
|
+
## 导航之前的那个答案(规则 7–12)
|
|
113
116
|
|
|
114
117
|
> **规则 7–9 借鉴自**:[`ayghri/i-have-adhd`](https://github.com/ayghri/i-have-adhd)(MIT),十条中取三条。
|
|
115
118
|
> **规则 10–11 于 1.3.0 新增**,来源不同——用户在同一次工作会话中两度指出,
|
|
116
119
|
> 一个正确且完整的回答读不懂。当时规则 7–9 已经出货且正在被遵守。
|
|
120
|
+
> **规则 12 于 1.4.0 新增**,来源又不同:一则公开的建议——请 LLM 写到「大约达到 ASD-STE100 的 80%」
|
|
121
|
+
> (ASD-STE100 是技术文档用的受控英文标准)。只取它的原则;它的英文词典与时态规则不取(见规则 12)。
|
|
117
122
|
> 其余七条删去:两条已被上方规则 1–2 涵盖,五条与本标准冲突
|
|
118
123
|
> (它的「不要 recap/不要结语」与规则 1 的导航区块直接矛盾;它的「列表上限 5 项」
|
|
119
124
|
> 会截断证据表格与遍历分母)或与 [estimation-standards](estimation-standards.md) 重复。
|
|
@@ -122,8 +127,9 @@ status: current
|
|
|
122
127
|
一个响应可以把结论埋在一整面证据底下,只要结尾附上正确的导航区块,
|
|
123
128
|
它仍然满足本标准的每一条。**找不到答案的读者,不会因为被告知下一步而得到帮助。**
|
|
124
129
|
|
|
125
|
-
|
|
126
|
-
|
|
130
|
+
**规则 7–11 是可选的**,语义同规则 6:采用项目不必启用,既有 skill 也不需回头补。
|
|
131
|
+
项目**可以**在自己的配置中把任一条提升为必须。**规则 12 有一条必须(12.1)**,其余(12.2)可选;
|
|
132
|
+
为什么这样分,规则内部有论证。**任何一条都不可选的是它们必须有精确的触发条件**——
|
|
127
133
|
一条松到永远不会启动的规则,与没有这条规则无从分辨。
|
|
128
134
|
|
|
129
135
|
### 规则 7:先讲发现,不要先讲过程(可选)
|
|
@@ -181,6 +187,9 @@ status: current
|
|
|
181
187
|
**为什么它与 R7 是两条**:R7 规范的是**先讲发现再给证据**的顺序。R10 规范的是**语域**——
|
|
182
188
|
一个响应可以先讲发现,却仍然用只有作者持有的词汇讲那个发现。两者都让读者无法行动,但它们是不同的失效。
|
|
183
189
|
|
|
190
|
+
**白话不可以拿肯定语气来换。** 把说明改成读者的话就是一次改写,而改写正是「可能」悄悄变成「是」的地方。
|
|
191
|
+
当 R10 用在写作者原本就有保留的论断上,由[规则 12](#规则-12受控语言部分必须) 的 12.1(必须)管:不确定语气要留着。
|
|
192
|
+
|
|
184
193
|
### 规则 11:每个选项都要带自己的利弊(可选)
|
|
185
194
|
|
|
186
195
|
**触发条件**:要求读者在两个以上做法之间选择的响应。
|
|
@@ -204,6 +213,93 @@ status: current
|
|
|
204
213
|
|
|
205
214
|
**与规则 4 相辅**:选项数维持在 1–5。利弊让每个选项读起来更花力气,所以这条规则让规则 4 的上限**更**要紧,不是更不要紧。
|
|
206
215
|
|
|
216
|
+
### 规则 12:受控语言(部分必须)
|
|
217
|
+
|
|
218
|
+
**触发条件**:为「不是原作者」的读者撰写、改写、缩短、简化或翻译文字——典型是一位非专业的读者,要靠这段文字做判断或审批。
|
|
219
|
+
|
|
220
|
+
受控语言(用变化换可预测性的写作规则)让文字更好读。它有一个已知的失败方式:最好读的句子是肯定的句子,
|
|
221
|
+
所以「简化」会朝肯定的方向漂移。本规则取受控写作的原则,并对这个漂移设一道硬性的止损。
|
|
222
|
+
|
|
223
|
+
#### 12.1 简化后的文字要保留不确定语气(必须)
|
|
224
|
+
|
|
225
|
+
不确定语气是一个告诉读者「这个论断可以信到什么程度」的词:*可能、推断、大概、尚未确认*——
|
|
226
|
+
*might、could、probably、appears to、not yet confirmed*。它是信息,不是赘词。
|
|
227
|
+
|
|
228
|
+
缩短、简化、改写或翻译时:
|
|
229
|
+
|
|
230
|
+
- **不可把不确定的论断改成确定的。** 原文说「可能」,结果就说「可能」(或结果语言里对等的说法)。
|
|
231
|
+
- **不可为了省字而删掉不确定语气。** 目标是更短的句子;更肯定的句子不被允许。
|
|
232
|
+
- **不可加入原文没说的事实**——编出来的原因、编出来的「已确认」,是同一种失败的另一个样子。
|
|
233
|
+
- 只有在论断之后**已经被验证**时,不确定语气才可以拿掉;而且要由验证(查了什么、结果是什么)取代它的位置。
|
|
234
|
+
只删掉不确定语气,不算验证。
|
|
235
|
+
|
|
236
|
+
**为什么只有这一条是必须的**:只有它的失败会让读者**相信不真实的事**,而不只是让文字更难读。
|
|
237
|
+
它也不需要校准——检查就是拿改写前后两份文字比对,人或模型在任何语言都做得到;
|
|
238
|
+
而下面每一个阈值都取决于语言与读者。
|
|
239
|
+
|
|
240
|
+
#### 12.2 白话写作原则(可选)
|
|
241
|
+
|
|
242
|
+
读者是非专业人士时使用。它们与语言无关:每一条都用该语言自己的单位来表达,不附任何词表。
|
|
243
|
+
|
|
244
|
+
| 原则 | 要求什么 |
|
|
245
|
+
|------|----------|
|
|
246
|
+
| **句子短,以该语言自己的单位计** | 一句一个意思。**起始范围**,不是上限:英文大约 15–25 个词,中文大约 25–40 个字。远超过范围是「该拆句」的信号,不是要计数的缺陷。按语言与读者校准 |
|
|
247
|
+
| **同一个东西只用一个名称** | 每个东西选定一个名称,全文都用它。不要为了文采换说法:读者看到第二个名称,会以为是第二个东西 |
|
|
248
|
+
| **主语明确、主动语态** | 说清楚谁做了什么。施事者不明或不重要时,才用被动 |
|
|
249
|
+
| **一步一动作** | 流程是编号列表,每项一个动作,不是一段文字 |
|
|
250
|
+
| **少用分号** | 分号把读者必须同时记住的两个意思接在一起。拆成两句或一份列表 |
|
|
251
|
+
| **数字带单位** | 「30 秒」「3 个文件」「NT$1,200」——不要只写「30」 |
|
|
252
|
+
|
|
253
|
+
**为什么是可选**:上面的范围只是起始点,**没有**对照读者实际理解度校准过,也没有检查器在执行。
|
|
254
|
+
一条**必须**的规则若附带没人能验证的阈值,会产生机械式的遵守——句子被拆到不再像句子——
|
|
255
|
+
而专家读者可能反而更适合比较密的文字。这些原则是写作者凭判断使用的指引;12.1 才是不会弯的那一部分。
|
|
256
|
+
|
|
257
|
+
#### 本规则不取 ASD-STE100 的什么
|
|
258
|
+
|
|
259
|
+
ASD-STE100 的**核可词典**(每个核可的英文单词只有一个意思,并有一份封闭的允许词表)与它的**时态限制**,
|
|
260
|
+
都依赖英文这个语言。它们**不适用于中文**或其他非英文文字,本标准**不附任何形式的词表**。
|
|
261
|
+
只取 12.2 的原则,并改写成每一条都能在任何语言使用。
|
|
262
|
+
|
|
263
|
+
同理,不要用「以空白或 ASCII 字符分词」的计数器去衡量非英文文字:它把一整段中文看成一个「词」,
|
|
264
|
+
不论多长都通过。一把在某个语言上永远是绿灯的量尺,在那个语言上什么也没量到。
|
|
265
|
+
|
|
266
|
+
#### 示例:同一段文字、三种改写,以及一个不被允许的改写
|
|
267
|
+
|
|
268
|
+
示例刻意用中文:本规则与语言无关,而中文正是只靠英文做法行不通的地方。三个有效版本都保留不确定语气
|
|
269
|
+
「可能」、「推断」、「尚未」,且没有加入原文没有的事实。
|
|
270
|
+
|
|
271
|
+
**原文**
|
|
272
|
+
|
|
273
|
+
```text
|
|
274
|
+
经过检查,登录页面在高流量时段响应变慢,这个问题可能是数据库连接池被耗尽所造成的,我们推断是因为上周的改版新增了一个会长时间占用连接的查询;目前尚未在测试环境复现,所以修复后的效果还需要被确认,建议在确认之前先不要对外宣布已经解决。
|
|
275
|
+
```
|
|
276
|
+
|
|
277
|
+
**约 80%**——句子较短,读起来仍像一段文字
|
|
278
|
+
|
|
279
|
+
```text
|
|
280
|
+
登录页面在高流量时段响应变慢。原因可能是数据库连接池被耗尽。我们推断,上周改版新增了一个查询,它会长时间占用连接。这一点尚未在测试环境复现,修复后有没有效,也还没确认。确认之前,建议先不要对外宣布已经解决。
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
**严格**——一行一个意思、加标签、保留不确定语气
|
|
284
|
+
|
|
285
|
+
```text
|
|
286
|
+
登录页面在高流量时段响应变慢。
|
|
287
|
+
1. 原因:可能是数据库连接池被耗尽。
|
|
288
|
+
2. 推断:上周改版新增了一个查询,这个查询可能长时间占用连接。
|
|
289
|
+
3. 状态:尚未在测试环境复现。
|
|
290
|
+
4. 修复效果:尚未确认。
|
|
291
|
+
5. 建议:确认之前,不要对外宣布已解决。
|
|
292
|
+
```
|
|
293
|
+
|
|
294
|
+
**不是有效的改写**——最短,而且是错的
|
|
295
|
+
|
|
296
|
+
```text
|
|
297
|
+
登录页面变慢,原因是数据库连接池被耗尽,已确认由上周改版造成。
|
|
298
|
+
```
|
|
299
|
+
|
|
300
|
+
最后这一版最短、也最好读,却两度违反 12.1:「可能」变成直接陈述的原因,「尚未复现」变成「已确认」,
|
|
301
|
+
而原文从没说过这件事。读者若凭它批准一个修复,就是被给了一件不真实的事。
|
|
302
|
+
|
|
207
303
|
---
|
|
208
304
|
|
|
209
305
|
## 情境模板
|
|
@@ -398,6 +494,7 @@ AI 需要用户做出选择或提供信息时使用。
|
|
|
398
494
|
| R9 | *(可选)* 不要开场白。结语仍为必须——见 R1 |
|
|
399
495
|
| R10 | *(可选)* 白话是主语;标识符放在论断之后当佐证 |
|
|
400
496
|
| R11 | *(可选)* 每个选项都要说明换到什么、代价是什么——不只推荐那一个 |
|
|
497
|
+
| R12 | **12.1 *(必须)***:简化、缩短或翻译时,保留不确定语气——不可把「可能」改成「是」。12.2 *(可选)*:句子短(以该语言自己的单位计)、同物同名、主动语态、一步一动作、少用分号、数字带单位。不附英文词典——它无法移到其他语言 |
|
|
401
498
|
|
|
402
499
|
| 豁免 | 不豁免 |
|
|
403
500
|
|------|--------|
|
|
@@ -421,6 +518,7 @@ AI 需要用户做出选择或提供信息时使用。
|
|
|
421
518
|
|
|
422
519
|
| 版本 | 日期 | 变更 |
|
|
423
520
|
|------|------|------|
|
|
521
|
+
| 1.4.0 | 2026-10-05 | 新增 R12 受控语言(语言中立)。一条必须(12.1:简化后的文字要保留写作者的不确定语气——「可能」不会变成「是」、也不新增原文没有的事实);其余(12.2:以该语言自己的单位计句长、同物同名、主动语态、一步一动作、少用分号、数字带单位)属可选,理由已写进标准。取 ASD-STE100 的原则、不取它的英文词典与时态规则,并在标准里明说。附一组中文改写对照(三种严格度),外加一个更短却错误的改写。R10 现在指向 R12,因为把论断改成白话就是一次改写,而改写正是不确定语气流失的地方 |
|
|
424
522
|
| 1.3.0 | 2026-08-17 | 新增可选规则 R10–R11。R10 管语域:白话是句子的主语、标识符当佐证——与 R7 不同,R7 管的是「先发现后证据」的顺序,而一个响应可以先讲发现却仍用只有作者持有的词汇讲它。R11 把规则 2 从推荐选项扩及全部:只论证推荐项的清单等于把比较丢回给读者,而没标代价的选项读起来像没有代价 |
|
|
425
523
|
| 1.2.0 | 2026-08-17 | 新增可选规则 R7–R9,管答案本身(先讲发现、重述进度、不要开场白)。借鉴自 `ayghri/i-have-adhd`(MIT),十条取三;其余七条因已被 R1–R2 涵盖、与 R1 冲突、或与 estimation-standards 重复而删去。规则 1–6 全部可以被一个把结论埋起来的响应满足——R7–R9 补上这个缺口 |
|
|
426
524
|
| 1.1.0 | 2026-06-10 | 新增规则 R6 可选模型级别标注(`〔模型:Fast|Standard|Capable〕`);与厂商无关;不强制既有技能回改 |
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
---
|
|
2
2
|
source: ../../../core/full-coverage-testing.md
|
|
3
|
-
source_version: 1.
|
|
4
|
-
translation_version: 1.
|
|
5
|
-
last_synced: 2026-
|
|
6
|
-
source_hash:
|
|
3
|
+
source_version: 1.2.0
|
|
4
|
+
translation_version: 1.2.0
|
|
5
|
+
last_synced: 2026-10-06
|
|
6
|
+
source_hash: 1fe2966d8684
|
|
7
7
|
status: current
|
|
8
8
|
---
|
|
9
9
|
|
|
@@ -12,7 +12,7 @@ status: current
|
|
|
12
12
|
> **Language**: [English](../../../core/full-coverage-testing.md) | [繁體中文](../../zh-TW/core/full-coverage-testing.md) | 简体中文
|
|
13
13
|
|
|
14
14
|
> **AI 最优化版本**: `ai/standards/full-coverage-testing.ai.yaml`
|
|
15
|
-
> **XSPEC**: XSPEC-178
|
|
15
|
+
> **XSPEC**: XSPEC-178、XSPEC-444(R2、R5——提交前警告与随附闸门脚本)
|
|
16
16
|
> **取代**: 金字塔门槛模型(UT≥80%、IT≥70%、E2E 仅 happy-path)
|
|
17
17
|
|
|
18
18
|
## 概述
|
|
@@ -239,6 +239,60 @@ legacy 降级模式(外部服务失败时的 fallback、重试、部分结果
|
|
|
239
239
|
|
|
240
240
|
---
|
|
241
241
|
|
|
242
|
+
## UDS 随附的提交前警告与闸门脚本(XSPEC-444 R2、R5)
|
|
243
|
+
|
|
244
|
+
上面的规则过去要靠标准让你自己写的脚本来执行。现在 `uds init` 会直接把扫描脚本写进你的项目,而 `uds check`——UDS 的 pre-commit hook 执行的命令——会打印这些脚本和另一项检查找到的东西。**默认一律只警告、不拦任何东西**;要收紧是可选的(见“先警告,之后再收紧”)。
|
|
245
|
+
|
|
246
|
+
### 两个扫描脚本(`uds init` 写到 `scripts/`)
|
|
247
|
+
|
|
248
|
+
| 脚本 | 找什么 |
|
|
249
|
+
|------|--------|
|
|
250
|
+
| `scripts/check-anti-fake-tests.mjs` | **没有断言**的测试;唯一的断言是**恒真式**的测试(`expect(true).toBe(true)`、`assert 200 == 200`);**每个测试都被跳过或标为 todo** 的测试文件 |
|
|
251
|
+
| `scripts/check-stubs.mjs` | `// WARNING: STUB` 标记;声称**尚未实现**的函数体(`raise NotImplementedError`、`todo!()`、`TODO()` 等)而旁边没有标记;函数体**为空**的具名函数而旁边没有标记 |
|
|
252
|
+
|
|
253
|
+
- 纯 Node、零依赖、不预设任何测试框架。它们是**你的文件**:可以改、可以接入 CI。单独运行时,找到东西就以非 0 退出——`node scripts/check-stubs.mjs` 就是本标准部署闸门所说的 pre-push/部署闸门。
|
|
254
|
+
- `uds init` 不会覆盖已存在的文件,`uds update` 也不会;较早初始化的项目,`uds update` 会询问是否写入(提示的默认为否;`uds update -y` 会直接回答是)。
|
|
255
|
+
- 有暂存文件时只读那些文件;没有暂存任何东西时(CI 运行、手动 `uds check`)每个都会遍历整个项目——遍历最多 200,000 个文件,`uds check` 给每个 120 秒(超过就报告“无法判定”,绝不算通过)——所以在很大的仓库里,请在 CI 运行,不要期待立刻完成。
|
|
256
|
+
- 同一行或上面三行内出现 `STUB` 或 `COVERAGE_EXEMPT`,该临时实现就算已**声明**;已声明的只以标记报告一次。
|
|
257
|
+
- **语言范围。**测试文件规则覆盖 JavaScript/TypeScript、Python、Java/Kotlin/Scala/C#、Go、Rust、Ruby、Elixir、PHP、Swift、Dart、Lua 与 C/C++。其他语言的测试文件会被列为“未扫描”——绝不当成干净。空函数规则覆盖 JavaScript/TypeScript、Python、Go、Rust、Ruby 与 PHP;其他语言仍会找标记与“尚未实现”的函数体,输出也会写明哪些语言没有空函数规则。
|
|
258
|
+
- 它们读的是文本,不运行你的测试。若某个辅助函数用扫描器认不出的名称做断言,会被报为“no-assertion”:把它命名为 `assert*`/`verify*`/`expect*`,或把它的模式列在策略文件的 `assertionPatterns`。
|
|
259
|
+
- 每次运行都先拿已知的假测试与已知的好测试检验自己;检验失败就以 `2`(“无法判定”)退出,这绝不算通过。
|
|
260
|
+
|
|
261
|
+
### 改了代码却没动测试(`uds check`,针对已暂存的变更)
|
|
262
|
+
|
|
263
|
+
有文件暂存准备提交时,`uds check` 会比对变更内容:
|
|
264
|
+
|
|
265
|
+
- 改了代码文件,**同一次提交没有任何测试文件变动** → 警告,并列出代码文件;
|
|
266
|
+
- 变更中有 UDS 不认识的文件类型 → 警告,列出它并说明如何分类(绝不当成没事,也绝不拦);
|
|
267
|
+
- 删除不算需要测试的变更;**纯重命名**(git 的 `R100`)与匹配 `exempt` 条目的路径可免,输出会记下理由。
|
|
268
|
+
|
|
269
|
+
没有暂存任何东西时(CI 运行、手动 `uds check`),差异检查不出声;两个扫描脚本则改为扫整个项目。
|
|
270
|
+
|
|
271
|
+
### 策略文件 `.standards/test-policy.json`(可选)
|
|
272
|
+
|
|
273
|
+
哪些路径是测试、哪些是代码,是带有常见生态默认值的数据,不是一份框架清单。每个列表都是**加进**默认值:
|
|
274
|
+
|
|
275
|
+
```json
|
|
276
|
+
{
|
|
277
|
+
"mode": "warn",
|
|
278
|
+
"testDirs": ["integration"],
|
|
279
|
+
"testPatterns": ["*.itest.*"],
|
|
280
|
+
"sourceExtensions": ["zig"],
|
|
281
|
+
"nonCodeExtensions": ["gradle"],
|
|
282
|
+
"ignore": ["generated/**"],
|
|
283
|
+
"exempt": [{ "pattern": "src/gen/**", "reason": "generated by protoc" }],
|
|
284
|
+
"assertionPatterns": ["\\bmustMatch\\w*\\s*\\("]
|
|
285
|
+
}
|
|
286
|
+
```
|
|
287
|
+
|
|
288
|
+
没有 `reason` 的 `exempt` 条目不会生效,并会被报告:豁免必须说明原因。
|
|
289
|
+
|
|
290
|
+
### 先警告,之后再收紧
|
|
291
|
+
|
|
292
|
+
`"mode": "warn"`(默认)只打印警告、放行提交。`"mode": "block"` 会让 `uds check` 在以下情况以非 0 退出,因此拦下提交:扫描脚本找到东西、扫描脚本无法判定、或改了代码却没动测试。UDS 不认识的文件类型永远不会拦。**尚未实现**(规格没有定义基线放在哪里、以什么计数):未配测试的变更数棘轮,以及逐次提交的豁免理由(pre-commit hook 读不到提交信息)。
|
|
293
|
+
|
|
294
|
+
---
|
|
295
|
+
|
|
242
296
|
## 从金字塔模型迁移
|
|
243
297
|
|
|
244
298
|
若你的项目先前使用金字塔门槛:
|
|
@@ -246,8 +300,8 @@ legacy 降级模式(外部服务失败时的 fallback、重试、部分结果
|
|
|
246
300
|
1. **删除** `jest.config.js` / `vitest.config.ts` 中任何硬编码的覆盖率门槛(`coverageThreshold` 选项)
|
|
247
301
|
2. **安装** `.coverage-baseline.json`,以当前的覆盖率作为棘轮起点
|
|
248
302
|
3. **新增** `scripts/check-coverage-ratchet.sh` 到 CI
|
|
249
|
-
4. **新增** `scripts/check-stubs.
|
|
250
|
-
5. **新增** `scripts/check-anti-fake-tests.
|
|
303
|
+
4. **新增** `scripts/check-stubs.mjs` 到 deploy.sh 与 pre-push hook(由 `uds init` 写入;已有项目由 `uds update` 提供)
|
|
304
|
+
5. **新增** `scripts/check-anti-fake-tests.mjs` 到 pre-commit 或 CI(由 `uds init` 写入;`uds check` 已会运行并警告)
|
|
251
305
|
|
|
252
306
|
棘轮从你当前的覆盖率开始。从那一刻起,它只能上升。
|
|
253
307
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# UDS 速查表
|
|
2
2
|
|
|
3
|
-
> Quick reference for all UDS features | Last updated: 2026-
|
|
3
|
+
> Quick reference for all UDS features | Last updated: 2026-10-06
|
|
4
4
|
|
|
5
5
|
**Language**: [English](../../../docs/user/CHEATSHEET.md) | [繁體中文](../../zh-TW/docs/CHEATSHEET.md) | 简体中文
|
|
6
6
|
|
|
@@ -110,6 +110,7 @@
|
|
|
110
110
|
| `ci-cd-assistant` | 引导 CI/CD 流水线的设计、配置与优化。 |
|
|
111
111
|
| `code-review-assistant` | [UDS] 系统性代码审查的参考资料:八大审查类别,以及 BLOCKING/IMPORTANT/SUGGESTION 评 |
|
|
112
112
|
| `commit-standards` | [UDS] 生成符合 Conventional Commits 规范的 commit message,包含双语格式。 |
|
|
113
|
+
| `comprehension-ladder` | [UDS] 把一段难懂的 AI 输出换成较好懂的形式:受控文字、Mermaid 图、单文件 HTML 解说页。所有形式都 |
|
|
113
114
|
| `contract-test-assistant` | [UDS] 引导 API 与微服务的契约测试策略。 |
|
|
114
115
|
| `database-assistant` | 引导数据库设计、迁移与查询优化。 |
|
|
115
116
|
| `deploy-assistant` | 引导在没有 CI/CD 平台(GitHub Actions/GitLab CI)的情况下完成可靠部署。 |
|
|
@@ -388,6 +389,7 @@
|
|
|
388
389
|
| `generate-version-manifest.mjs` | Generate Version Manifest (SPEC-SELFDIAG-001 REQ-9 |
|
|
389
390
|
| `install-hooks.mjs` | Install Hooks |
|
|
390
391
|
| `install-hooks.sh` | Thin wrapper — scripts/install-hooks.mjs is the on |
|
|
392
|
+
| `npm-pack-files.mjs` | @param {string} stdout @returns {string[]} package |
|
|
391
393
|
| `pre-commit.mjs` | Build a platform-aware shell command for a .sh scr |
|
|
392
394
|
| `pre-release-check.ps1` | Pre Release Check |
|
|
393
395
|
| `pre-release-check.sh` | Pre-release Check Script |
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# UDS 功能参考手册
|
|
2
2
|
|
|
3
3
|
> Universal Development Standards - 完整功能文档
|
|
4
|
-
> Auto-generated | Last updated: 2026-
|
|
4
|
+
> Auto-generated | Last updated: 2026-10-06
|
|
5
5
|
|
|
6
6
|
**Language**: [English](../../../docs/reference/FEATURE-REFERENCE.md) | [繁體中文](../../zh-TW/docs/FEATURE-REFERENCE.md) | 简体中文
|
|
7
7
|
|
|
@@ -11,13 +11,13 @@
|
|
|
11
11
|
|
|
12
12
|
1. [CLI 指令](#cli-commands) (24)
|
|
13
13
|
2. [斜线命令](#slash-commands) (51)
|
|
14
|
-
3. [技能](#skills) (
|
|
14
|
+
3. [技能](#skills) (56)
|
|
15
15
|
4. [代理](#agents) (5)
|
|
16
16
|
5. [工作流程](#workflows) (5)
|
|
17
17
|
6. [核心规范](#core-standards) (153)
|
|
18
|
-
7. [脚本](#scripts) (
|
|
18
|
+
7. [脚本](#scripts) (64)
|
|
19
19
|
|
|
20
|
-
**Total Features:
|
|
20
|
+
**Total Features: 358**
|
|
21
21
|
|
|
22
22
|
---
|
|
23
23
|
|
|
@@ -181,6 +181,7 @@
|
|
|
181
181
|
| `--gh` | Force gh CLI for submission |
|
|
182
182
|
| `--format` | Output format (json) |
|
|
183
183
|
| `--quiet` | Summary only |
|
|
184
|
+
| `--offline` | No network access at all: no CLI version check, and --report does not submit |
|
|
184
185
|
| `--score` | Run multi-dimensional health score analysis |
|
|
185
186
|
| `--self` | Self mode: analyze UDS repo itself (use with --score) |
|
|
186
187
|
| `--save` | Save score snapshot for trend tracking (use with --score) |
|
|
@@ -365,6 +366,7 @@
|
|
|
365
366
|
| `ci-cd-assistant` | 引导 CI/CD 流水线的设计、配置与优化。 |
|
|
366
367
|
| `code-review-assistant` | [UDS] 系统性代码审查的参考资料:八大审查类别,以及 BLOCKING/IMPORTANT/SUGGESTION 评论前缀。 |
|
|
367
368
|
| `commit-standards` | [UDS] 生成符合 Conventional Commits 规范的 commit message,包含双语格式。 |
|
|
369
|
+
| `comprehension-ladder` | [UDS] 把一段难懂的 AI 输出换成较好懂的形式:受控文字、Mermaid 图、单文件 HTML 解说页。所有形式都来自同一份大纲,所以形式会变,事实不会变。 |
|
|
368
370
|
| `contract-test-assistant` | [UDS] 引导 API 与微服务的契约测试策略。 |
|
|
369
371
|
| `database-assistant` | 引导数据库设计、迁移与查询优化。 |
|
|
370
372
|
| `deploy-assistant` | 引导在没有 CI/CD 平台(GitHub Actions/GitLab CI)的情况下完成可靠部署。 |
|
|
@@ -448,7 +450,7 @@
|
|
|
448
450
|
| `ai-command-behavior` | 1.0.0 | This standard defines a structure for specifying AI Agent runtime behavior in co |
|
|
449
451
|
| `ai-friendly-architecture` | 1.0.0 | This standard defines architecture and documentation practices that maximize the |
|
|
450
452
|
| `ai-instruction-standards` | 1.1.1 | This standard defines best practices for creating and maintaining AI instruction |
|
|
451
|
-
| `ai-response-navigation` | 1.
|
|
453
|
+
| `ai-response-navigation` | 1.4.0 | This standard defines navigation behavior for AI responses: every substantive AI |
|
|
452
454
|
| `alerting-standards` | 1.0.0 | |
|
|
453
455
|
| `anti-hallucination` | 1.5.1 | This standard defines strict guidelines for AI assistants to prevent hallucinati |
|
|
454
456
|
| `anti-sycophancy-prompting` | 1.0.0 | This standard defines techniques and rules for designing prompts that elicit gen |
|
|
@@ -651,6 +653,7 @@
|
|
|
651
653
|
| `generate-version-manifest.mjs` | Generate Version Manifest (SPEC-SELFDIAG-001 REQ-9, AC-14) |
|
|
652
654
|
| `install-hooks.mjs` | Install Hooks |
|
|
653
655
|
| `install-hooks.sh` | Thin wrapper — scripts/install-hooks.mjs is the only copy of the installer |
|
|
656
|
+
| `npm-pack-files.mjs` | @param {string} stdout @returns {string[]} package-relative file paths |
|
|
654
657
|
| `pre-commit.mjs` | Build a platform-aware shell command for a .sh script. |
|
|
655
658
|
| `pre-release-check.ps1` | Pre Release Check |
|
|
656
659
|
| `pre-release-check.sh` | Pre-release Check Script |
|
|
@@ -59,6 +59,7 @@ skills/
|
|
|
59
59
|
| `refactoring-assistant` | `/refactor` | [UDS] 重构指引 |
|
|
60
60
|
| `project-discovery` | `/discover` | [UDS] 评估项目健康度与风险 |
|
|
61
61
|
| `brainstorm-assistant` | `/brainstorm` | [UDS] 结构化 AI 辅助构思 |
|
|
62
|
+
| `comprehension-ladder` | `/comprehend` | [UDS] 把难懂的 AI 输出换成受控文字、Mermaid 图或离线 HTML 解说页,不改变事实 |
|
|
62
63
|
| `changelog-guide` | `/changelog` | [UDS] 生成 changelog 条目 |
|
|
63
64
|
| `dev-workflow-guide` | `/dev-workflow` | [UDS] 将开发阶段对应到 UDS 命令 |
|
|
64
65
|
| `docs-generator` | `/docgen` | [UDS] 生成使用文档 |
|