universal-dev-standards 6.3.3 → 6.3.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/bundled/ai/standards/agent-behavior-discipline.ai.yaml +1 -1
- package/bundled/ai/standards/container-security.ai.yaml +1 -1
- package/bundled/ai/standards/full-coverage-testing.ai.yaml +5 -5
- package/bundled/ai/standards/knowledge-graph-memory.ai.yaml +1 -1
- package/bundled/locales/zh-CN/CHANGELOG.md +19 -2
- package/bundled/locales/zh-CN/README.md +1 -1
- package/bundled/locales/zh-TW/CHANGELOG.md +19 -2
- package/bundled/locales/zh-TW/README.md +1 -1
- package/package.json +1 -1
- package/src/utils/dependency-resolution.js +50 -15
- package/standards-registry.json +7 -7
|
@@ -59,7 +59,7 @@ principles:
|
|
|
59
59
|
triggers:
|
|
60
60
|
- Any edit or refactor task
|
|
61
61
|
do:
|
|
62
|
-
- Declare scope before editing ("I will modify: X. I will not touch: Y.")
|
|
62
|
+
- 'Declare scope before editing ("I will modify: X. I will not touch: Y.")'
|
|
63
63
|
- Match the local code style rather than enforcing personal preferences
|
|
64
64
|
- Flag pre-existing issues found out-of-scope with a verbal note only
|
|
65
65
|
do_not:
|
|
@@ -93,7 +93,7 @@ categories:
|
|
|
93
93
|
required_settings:
|
|
94
94
|
- readOnlyRootFilesystem: true
|
|
95
95
|
- allowPrivilegeEscalation: false
|
|
96
|
-
- drop: [ALL] capabilities
|
|
96
|
+
- drop: "[ALL] capabilities"
|
|
97
97
|
seccomp:
|
|
98
98
|
profile: RuntimeDefault (or custom restricted profile)
|
|
99
99
|
audit_mode: allowed for profiling only; not for production
|
|
@@ -161,23 +161,23 @@ standard:
|
|
|
161
161
|
deployment_gates:
|
|
162
162
|
pre_push_to_main:
|
|
163
163
|
action: block
|
|
164
|
-
trigger: "// WARNING: STUB" marker found in src/
|
|
164
|
+
trigger: '"// WARNING: STUB" marker found in src/'
|
|
165
165
|
message: "[STUB-BLOCK] STUB markers detected. Push to main rejected."
|
|
166
166
|
deploy_to_uat:
|
|
167
167
|
action: block
|
|
168
|
-
trigger: "// WARNING: STUB" marker found in src/
|
|
168
|
+
trigger: '"// WARNING: STUB" marker found in src/'
|
|
169
169
|
message: "[DEPLOY-BLOCK] STUB markers detected. UAT deployment aborted."
|
|
170
170
|
deploy_to_production:
|
|
171
171
|
action: block
|
|
172
|
-
trigger: "// WARNING: STUB" marker found in src/
|
|
172
|
+
trigger: '"// WARNING: STUB" marker found in src/'
|
|
173
173
|
message: "[CRITICAL] Production deployment with STUB markers is strictly prohibited."
|
|
174
174
|
deploy_to_staging:
|
|
175
175
|
action: warn
|
|
176
|
-
trigger: "// WARNING: STUB" marker found in src/
|
|
176
|
+
trigger: '"// WARNING: STUB" marker found in src/'
|
|
177
177
|
message: "[STUB-WARN] Deploying with STUB markers to staging. NOT permitted in UAT/production."
|
|
178
178
|
feature_branch_push:
|
|
179
179
|
action: warn
|
|
180
|
-
trigger: "// WARNING: STUB" marker found in src/
|
|
180
|
+
trigger: '"// WARNING: STUB" marker found in src/'
|
|
181
181
|
message: "[STUB-WARN] STUB markers found. Must remove before merging to main."
|
|
182
182
|
|
|
183
183
|
migration_from_pyramid:
|
|
@@ -54,7 +54,7 @@ standard:
|
|
|
54
54
|
- rule: "Spec impacted_by:[DEC] => IMPACTS (Decision -> Spec)"
|
|
55
55
|
- rule: "Decision supersedes:[DEC] => SUPERSEDES (Decision -> Decision)"
|
|
56
56
|
- rule: "[[XSPEC-NNN]] link in a Decision body => IMPACTS (Decision -> Spec)"
|
|
57
|
-
idempotent: "Declaring a relationship from both ends yields one edge, not two"
|
|
57
|
+
- idempotent: "Declaring a relationship from both ends yields one edge, not two"
|
|
58
58
|
|
|
59
59
|
modes:
|
|
60
60
|
degraded:
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
source: ../../CHANGELOG.md
|
|
3
|
-
source_version: 6.3.
|
|
4
|
-
translation_version: 6.3.
|
|
3
|
+
source_version: 6.3.5
|
|
4
|
+
translation_version: 6.3.5
|
|
5
5
|
last_synced: 2026-08-07
|
|
6
6
|
status: current
|
|
7
7
|
---
|
|
@@ -17,6 +17,23 @@ status: current
|
|
|
17
17
|
|
|
18
18
|
## [Unreleased]
|
|
19
19
|
|
|
20
|
+
## [6.3.5] - 2026-08-07
|
|
21
|
+
|
|
22
|
+
### Fixed
|
|
23
|
+
|
|
24
|
+
- **四份出货的 `.ai.yaml` 标准无法解析。** 6.3.4 交付了 141 份机器可读标准,其中 `agent-behavior-discipline`、`container-security`、`full-coverage-testing`、`knowledge-graph-memory` 是语法无效的 YAML。同样四份也在 `.standards/`——那正是 `uds init` 放进采用者目录的东西。**agent 读它们得到的是异常而非空内容**,而下游若 catch 掉,得到的沉默与「这份标准没有规则」无从分辨。四份的失败方式相同:未加引号的纯量带着 YAML 语义字符——括号内的冒号、flow 序列后接散文、在值中途结束的引号、与兄弟项不同缩进的键。以加引号或调缩进修正,不重构结构。
|
|
25
|
+
|
|
26
|
+
### Added
|
|
27
|
+
|
|
28
|
+
- **`npm run check:ai-yaml`——每一份 `.ai.yaml` 都必须可解析,并已接上 pre-commit 与发版流程。** 上述四份之所以进得了发版,是因为有八个脚本会读那个目录而**没有一个解析全集**;`check-standards-sync.sh` 比对的是版本与注册表项目,一份无法解析的文件能安然通过。此检查读 `ai/`、`.standards/` 与 `cli/bundled/` 三处,且**无条件执行**而非藏在路径 glob 后面——一个窄到会跳过这次的 glob 就是同一个错误换个位置。**exit 2 保留给「检查跑不起来」**:读不到的目录、里面没有 `.ai.yaml` 的目录、载不到的 YAML 库。那不算通过,而且会挡下发版——因为一个「没问题」与「查不了」输出相同的检查,会把未知转成安心。
|
|
29
|
+
|
|
30
|
+
## [6.3.4] - 2026-08-07
|
|
31
|
+
|
|
32
|
+
### Fixed
|
|
33
|
+
|
|
34
|
+
- **`uds deps` 指名了一个 npm 不会安装的版本。** 解析字段原本取「所有已发布版本中满足声明范围的最高版本」。那是 semver 的规则,不是 npm 的:`npm-pick-manifest` 在 `latest` dist-tag 满足范围时优先采用它,存在的目的正是不让带着普通版本号的 `next` 或 `beta` 发布落到只要了一个 caret 的人身上。以 `@anthropic-ai/claude-agent-sdk` 实测(`latest = 0.3.223`、`next = 0.3.224`):命令回报 0.3.224,而 `npm install …@^0.3` 实际装 0.3.223。**那个字段存在的全部目的就是说出「安装会拿到什么」,而它指名了没有任何安装会拿到的东西。** 现改为单次 `npm view` 同时取版本清单与 dist-tags,套用 npm 自己的优先顺序;`latest` 落在范围外时退回「范围内最高版本」——锁在旧 major 的项目仍得到诚实的答案。两个分支各有测试覆盖。
|
|
35
|
+
- 前两个版本修的是这个命令的**措辞**,这一版修的是它的**算术**。值得直说:先前那些修正只是让一个错的数字变得更好读。
|
|
36
|
+
|
|
20
37
|
## [6.3.3] - 2026-08-07
|
|
21
38
|
|
|
22
39
|
### Fixed
|
|
@@ -15,7 +15,7 @@ status: current
|
|
|
15
15
|
|
|
16
16
|
> **语言**: [English](../../README.md) | [繁體中文](../zh-TW/README.md) | 简体中文
|
|
17
17
|
|
|
18
|
-
**版本**: 6.3.
|
|
18
|
+
**版本**: 6.3.5 | **发布日期**: 2026-07-31 | **授权**: [双重授权](../../LICENSE) (CC BY 4.0 + MIT)
|
|
19
19
|
|
|
20
20
|
语言无关、框架无关的软件项目文档标准。通过 AI 原生工作流,确保不同技术栈之间的一致性、质量和可维护性。
|
|
21
21
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
source: ../../CHANGELOG.md
|
|
3
|
-
source_version: 6.3.
|
|
4
|
-
translation_version: 6.3.
|
|
3
|
+
source_version: 6.3.5
|
|
4
|
+
translation_version: 6.3.5
|
|
5
5
|
last_synced: 2026-08-07
|
|
6
6
|
status: current
|
|
7
7
|
---
|
|
@@ -17,6 +17,23 @@ status: current
|
|
|
17
17
|
|
|
18
18
|
## [Unreleased]
|
|
19
19
|
|
|
20
|
+
## [6.3.5] - 2026-08-07
|
|
21
|
+
|
|
22
|
+
### Fixed
|
|
23
|
+
|
|
24
|
+
- **四份出貨的 `.ai.yaml` 標準無法解析。** 6.3.4 交付了 141 份機器可讀標準,其中 `agent-behavior-discipline`、`container-security`、`full-coverage-testing`、`knowledge-graph-memory` 是語法無效的 YAML。同樣四份也在 `.standards/`——那正是 `uds init` 放進採用者目錄的東西。**agent 讀它們得到的是例外而非空內容**,而下游若 catch 掉,得到的沉默與「這份標準沒有規則」無從分辨。四份的失敗方式相同:未加引號的純量帶著 YAML 語意字元——括號內的冒號、flow 序列後接散文、在值中途結束的引號、與兄弟項不同縮排的鍵。以加引號或調縮排修正,不重構結構。
|
|
25
|
+
|
|
26
|
+
### Added
|
|
27
|
+
|
|
28
|
+
- **`npm run check:ai-yaml`——每一份 `.ai.yaml` 都必須可解析,並已接上 pre-commit 與發版流程。** 上述四份之所以進得了發版,是因為有八個腳本會讀那個目錄而**沒有一個解析全集**;`check-standards-sync.sh` 比對的是版本與註冊表項目,一份無法解析的檔案能安然通過。此檢查讀 `ai/`、`.standards/` 與 `cli/bundled/` 三處,且**無條件執行**而非藏在路徑 glob 後面——一個窄到會跳過這次的 glob 就是同一個錯誤換個位置。**exit 2 保留給「檢查跑不起來」**:讀不到的目錄、裡面沒有 `.ai.yaml` 的目錄、載不到的 YAML 函式庫。那不算通過,而且會擋下發版——因為一個「沒問題」與「查不了」輸出相同的檢查,會把未知轉成安心。
|
|
29
|
+
|
|
30
|
+
## [6.3.4] - 2026-08-07
|
|
31
|
+
|
|
32
|
+
### Fixed
|
|
33
|
+
|
|
34
|
+
- **`uds deps` 指名了一個 npm 不會安裝的版本。** 解析欄位原本取「所有已發布版本中滿足宣告範圍的最高版本」。那是 semver 的規則,不是 npm 的:`npm-pick-manifest` 在 `latest` dist-tag 滿足範圍時優先採用它,存在的目的正是不讓帶著普通版本號的 `next` 或 `beta` 發布落到只要了一個 caret 的人身上。以 `@anthropic-ai/claude-agent-sdk` 實測(`latest = 0.3.223`、`next = 0.3.224`):指令回報 0.3.224,而 `npm install …@^0.3` 實際裝 0.3.223。**那個欄位存在的全部目的就是說出「安裝會拿到什麼」,而它指名了沒有任何安裝會拿到的東西。** 現改為單次 `npm view` 同時取版本清單與 dist-tags,套用 npm 自己的優先順序;`latest` 落在範圍外時退回「範圍內最高版本」——鎖在舊 major 的專案仍得到誠實的答案。兩個分支各有測試覆蓋。
|
|
35
|
+
- 前兩個版本修的是這個指令的**措辭**,這一版修的是它的**算術**。值得直說:先前那些修正只是讓一個錯的數字變得更好讀。
|
|
36
|
+
|
|
20
37
|
## [6.3.3] - 2026-08-07
|
|
21
38
|
|
|
22
39
|
### Fixed
|
|
@@ -15,7 +15,7 @@ status: current
|
|
|
15
15
|
|
|
16
16
|
> **語言**: [English](../../README.md) | 繁體中文 | [简体中文](../zh-CN/README.md)
|
|
17
17
|
|
|
18
|
-
**版本**: 6.3.
|
|
18
|
+
**版本**: 6.3.5 | **發布日期**: 2026-07-31 | **授權**: [雙重授權](../../LICENSE) (CC BY 4.0 + MIT)
|
|
19
19
|
|
|
20
20
|
語言無關、框架無關的軟體專案文件標準。透過 AI 原生工作流,確保不同技術堆疊之間的一致性、品質和可維護性。
|
|
21
21
|
|
package/package.json
CHANGED
|
@@ -38,6 +38,12 @@
|
|
|
38
38
|
* silently answer a different question for anyone who does not install from
|
|
39
39
|
* the public registry, and would answer it confidently.
|
|
40
40
|
*
|
|
41
|
+
* **And it applies npm's resolution rule, not semver's.** The highest version
|
|
42
|
+
* satisfying a range is *not* what npm installs: npm prefers the `latest`
|
|
43
|
+
* dist-tag whenever it satisfies, so a `next` or `beta` publish carrying an
|
|
44
|
+
* ordinary version number does not land on people. Getting this wrong made the
|
|
45
|
+
* tool name a version no consumer receives — see `resolveViaNpm`.
|
|
46
|
+
*
|
|
41
47
|
* **A registry lookup that fails is never folded into "consistent".** It
|
|
42
48
|
* becomes `unverifiable` and makes the whole check non-zero. A tool whose
|
|
43
49
|
* "everything is fine" and "I could not find out" look the same is worse than
|
|
@@ -68,18 +74,30 @@ import semver from 'semver';
|
|
|
68
74
|
const DEFAULT_CONCURRENCY = 8;
|
|
69
75
|
|
|
70
76
|
/**
|
|
71
|
-
*
|
|
72
|
-
*
|
|
77
|
+
* Return the version an install of `range` would actually receive.
|
|
78
|
+
*
|
|
79
|
+
* **This deliberately reproduces npm's rule, not semver's.** The obvious
|
|
80
|
+
* implementation — take the highest published version satisfying the range —
|
|
81
|
+
* is wrong, and wrong in the direction this module exists to catch. npm's
|
|
82
|
+
* resolver (`npm-pick-manifest`) prefers the `latest` dist-tag whenever it
|
|
83
|
+
* satisfies the range, and only falls back to the maximum otherwise. That rule
|
|
84
|
+
* exists so a `next` or `beta` publish does not land on people who asked for a
|
|
85
|
+
* caret.
|
|
86
|
+
*
|
|
87
|
+
* Measured on 2026-08-07: `@anthropic-ai/claude-agent-sdk` published
|
|
88
|
+
* `latest = 0.3.223` and `next = 0.3.224`, both ordinary semver strings, both
|
|
89
|
+
* satisfying `^0.3`. The maximum-satisfying rule named 0.3.224;
|
|
90
|
+
* `npm install @anthropic-ai/claude-agent-sdk@^0.3` installs 0.3.223. **The
|
|
91
|
+
* earlier implementation reported a version no consumer receives** — in the one
|
|
92
|
+
* column whose entire purpose is to say what they receive.
|
|
73
93
|
*
|
|
74
|
-
*
|
|
75
|
-
*
|
|
76
|
-
*
|
|
77
|
-
*
|
|
78
|
-
* final element. Guessing here would produce a confident wrong answer, which
|
|
79
|
-
* is the failure mode this whole module exists to detect.
|
|
94
|
+
* Versions and tags are read in a single `npm view` call. The version list is
|
|
95
|
+
* in publish order, **not** semver order — a backport released after a major
|
|
96
|
+
* bump appears last while being the lowest version — so the fallback maximum is
|
|
97
|
+
* computed with semver rather than by taking the final element.
|
|
80
98
|
*/
|
|
81
99
|
async function resolveViaNpm(name, range, run) {
|
|
82
|
-
const { code, stdout, stderr } = await run(['view',
|
|
100
|
+
const { code, stdout, stderr } = await run(['view', name, 'versions', 'dist-tags', '--json']);
|
|
83
101
|
|
|
84
102
|
if (code !== 0) {
|
|
85
103
|
const detail = (stderr || stdout || '').split('\n').find((l) => l.trim()) ?? '';
|
|
@@ -93,13 +111,30 @@ async function resolveViaNpm(name, range, run) {
|
|
|
93
111
|
throw new Error(`npm view returned output that is not JSON: ${stdout.slice(0, 120)}`);
|
|
94
112
|
}
|
|
95
113
|
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
114
|
+
// npm flattens the response when only one of the requested fields exists on
|
|
115
|
+
// the package, so neither key can be assumed present. A package with exactly
|
|
116
|
+
// one published version reports `versions` as a bare string.
|
|
117
|
+
const versions = Array.isArray(parsed?.versions)
|
|
118
|
+
? parsed.versions
|
|
119
|
+
: typeof parsed?.versions === 'string'
|
|
120
|
+
? [parsed.versions]
|
|
121
|
+
: Array.isArray(parsed)
|
|
122
|
+
? parsed
|
|
123
|
+
: typeof parsed === 'string'
|
|
124
|
+
? [parsed]
|
|
125
|
+
: [];
|
|
126
|
+
const tags = parsed?.['dist-tags'] ?? {};
|
|
127
|
+
|
|
128
|
+
if (versions.length === 0) throw new Error('npm view returned no versions');
|
|
129
|
+
|
|
130
|
+
const latest = tags.latest;
|
|
131
|
+
if (typeof latest === 'string' && semver.valid(latest) && semver.satisfies(latest, range)) {
|
|
132
|
+
return latest;
|
|
101
133
|
}
|
|
102
|
-
|
|
134
|
+
|
|
135
|
+
const max = semver.maxSatisfying(versions, range);
|
|
136
|
+
if (max) return max;
|
|
137
|
+
throw new Error(`no published version of ${name} satisfies ${range}`);
|
|
103
138
|
}
|
|
104
139
|
|
|
105
140
|
/**
|
package/standards-registry.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
-
"version": "6.3.
|
|
3
|
+
"version": "6.3.5",
|
|
4
4
|
"lastUpdated": "2026-05-13",
|
|
5
5
|
"description": "Standards registry for universal-dev-standards with integrated skills and AI-optimized formats",
|
|
6
6
|
"formats": {
|
|
@@ -58,14 +58,14 @@
|
|
|
58
58
|
"standards": {
|
|
59
59
|
"name": "universal-dev-standards",
|
|
60
60
|
"url": "https://github.com/AsiaOstrich/universal-dev-standards",
|
|
61
|
-
"version": "6.3.
|
|
61
|
+
"version": "6.3.5"
|
|
62
62
|
},
|
|
63
63
|
"skills": {
|
|
64
64
|
"name": "universal-dev-standards",
|
|
65
65
|
"url": "https://github.com/AsiaOstrich/universal-dev-standards",
|
|
66
66
|
"localPath": "skills",
|
|
67
67
|
"rawUrl": "https://raw.githubusercontent.com/AsiaOstrich/universal-dev-standards/main/skills",
|
|
68
|
-
"version": "6.3.
|
|
68
|
+
"version": "6.3.5",
|
|
69
69
|
"note": "Skills are now included in the main repository under skills/"
|
|
70
70
|
}
|
|
71
71
|
},
|
|
@@ -2236,7 +2236,7 @@
|
|
|
2236
2236
|
"id": "license-compliance",
|
|
2237
2237
|
"name": "License Compliance Standards",
|
|
2238
2238
|
"nameZh": "授權合規標準",
|
|
2239
|
-
"version": "6.3.
|
|
2239
|
+
"version": "6.3.5",
|
|
2240
2240
|
"source": {
|
|
2241
2241
|
"human": "core/license-compliance.md",
|
|
2242
2242
|
"ai": "ai/standards/license-compliance.ai.yaml"
|
|
@@ -2248,7 +2248,7 @@
|
|
|
2248
2248
|
"id": "verification-oracle",
|
|
2249
2249
|
"name": "Verification Oracle Standards",
|
|
2250
2250
|
"nameZh": "驗證 Oracle 標準",
|
|
2251
|
-
"version": "6.3.
|
|
2251
|
+
"version": "6.3.5",
|
|
2252
2252
|
"source": {
|
|
2253
2253
|
"human": "core/verification-oracle.md",
|
|
2254
2254
|
"ai": "ai/standards/verification-oracle.ai.yaml"
|
|
@@ -2260,7 +2260,7 @@
|
|
|
2260
2260
|
"id": "model-provenance",
|
|
2261
2261
|
"name": "Model Provenance Policy Standards",
|
|
2262
2262
|
"nameZh": "模型來源政策標準",
|
|
2263
|
-
"version": "6.3.
|
|
2263
|
+
"version": "6.3.5",
|
|
2264
2264
|
"source": {
|
|
2265
2265
|
"human": "core/model-provenance.md",
|
|
2266
2266
|
"ai": "ai/standards/model-provenance.ai.yaml"
|
|
@@ -2272,7 +2272,7 @@
|
|
|
2272
2272
|
"id": "resource-cost-boundary",
|
|
2273
2273
|
"name": "Resource / Cost Boundary Declaration Standards",
|
|
2274
2274
|
"nameZh": "資源/成本邊界宣告標準",
|
|
2275
|
-
"version": "6.3.
|
|
2275
|
+
"version": "6.3.5",
|
|
2276
2276
|
"source": {
|
|
2277
2277
|
"human": "core/resource-cost-boundary.md",
|
|
2278
2278
|
"ai": "ai/standards/resource-cost-boundary.ai.yaml"
|