universal-dev-standards 6.3.1 → 6.3.2
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/locales/zh-CN/CHANGELOG.md +8 -2
- package/bundled/locales/zh-CN/README.md +1 -1
- package/bundled/locales/zh-TW/CHANGELOG.md +8 -2
- package/bundled/locales/zh-TW/README.md +1 -1
- package/package.json +1 -1
- package/src/commands/deps.js +24 -5
- package/src/utils/dependency-resolution.js +14 -4
- package/standards-registry.json +7 -7
|
@@ -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.2
|
|
4
|
+
translation_version: 6.3.2
|
|
5
5
|
last_synced: 2026-08-06
|
|
6
6
|
status: current
|
|
7
7
|
---
|
|
@@ -17,6 +17,12 @@ status: current
|
|
|
17
17
|
|
|
18
18
|
## [Unreleased]
|
|
19
19
|
|
|
20
|
+
## [6.3.2] - 2026-08-06
|
|
21
|
+
|
|
22
|
+
### 修复
|
|
23
|
+
|
|
24
|
+
- **`uds deps` 断言了一个它无从得知的出货渠道。** 报告结尾写着「consumers resolve the range themselves, because a published package does not ship a lockfile」,第三列标为 `users get=`。对一个以 `npm ci` 构建、出货 Docker image 的产品,这两句都是错的——它的用户拿到的正是 `tested=` 那一列,而解析出的那一列实际代表的是「下一次 lockfile 重新生成时会被无人审阅地拉进来的东西」。发现方式是拿这个命令去跑一个出货 Docker image、根本没发到 npm 的闭源产品。列名改为 `resolves=`,报告同时陈述两种读法——因为单独读一行时,它不能说出与事实相反的话。这与 1.1.0 对 Lock Strategy 条目所做的修正是同一件事:在一句误导的话下面补「但是……」,那句话仍然误导,而报告和标准表格一样,多半是一次读一行。现在有三个测试把措辞钉住,此前一个都没有。
|
|
25
|
+
|
|
20
26
|
## [6.3.1] - 2026-08-06
|
|
21
27
|
|
|
22
28
|
### 修复
|
|
@@ -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.2 | **发布日期**: 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.2
|
|
4
|
+
translation_version: 6.3.2
|
|
5
5
|
last_synced: 2026-08-06
|
|
6
6
|
status: current
|
|
7
7
|
---
|
|
@@ -17,6 +17,12 @@ status: current
|
|
|
17
17
|
|
|
18
18
|
## [Unreleased]
|
|
19
19
|
|
|
20
|
+
## [6.3.2] - 2026-08-06
|
|
21
|
+
|
|
22
|
+
### 修復
|
|
23
|
+
|
|
24
|
+
- **`uds deps` 斷言了一個它無從得知的出貨管道。** 報告結尾寫著「consumers resolve the range themselves, because a published package does not ship a lockfile」,第三欄標為 `users get=`。對一個以 `npm ci` 建置、出貨 Docker image 的產品,這兩句都是錯的——它的使用者拿到的正是 `tested=` 那一欄,而解析出的那一欄實際代表的是「下一次 lockfile 重新產生時會被無人審閱地拉進來的東西」。發現方式是拿這個指令去跑一個出貨 Docker image、根本沒發到 npm 的閉源產品。欄位改為 `resolves=`,報告同時陳述兩種讀法——因為單獨讀一列時,它不能說出與事實相反的話。這與 1.1.0 對 Lock Strategy 條目所做的修正是同一件事:在一句誤導的話下面補「但是……」,那句話仍然誤導,而報告和標準表格一樣,多半是一次讀一行。現在有三個測試把措辭釘住,先前一個都沒有。
|
|
25
|
+
|
|
20
26
|
## [6.3.1] - 2026-08-06
|
|
21
27
|
|
|
22
28
|
### 修復
|
|
@@ -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.2 | **發布日期**: 2026-07-31 | **授權**: [雙重授權](../../LICENSE) (CC BY 4.0 + MIT)
|
|
19
19
|
|
|
20
20
|
語言無關、框架無關的軟體專案文件標準。透過 AI 原生工作流,確保不同技術堆疊之間的一致性、品質和可維護性。
|
|
21
21
|
|
package/package.json
CHANGED
package/src/commands/deps.js
CHANGED
|
@@ -23,7 +23,7 @@ import { measureResolutionDrift } from '../utils/dependency-resolution.js';
|
|
|
23
23
|
* denominator is still printed, because "no drift" and "nothing was checked"
|
|
24
24
|
* produce the same silence otherwise, and only one of them is good news.
|
|
25
25
|
*/
|
|
26
|
-
function render(result) {
|
|
26
|
+
export function render(result) {
|
|
27
27
|
const lines = [];
|
|
28
28
|
const label = result.packageName ? chalk.bold(result.packageName) : result.root;
|
|
29
29
|
|
|
@@ -40,12 +40,31 @@ function render(result) {
|
|
|
40
40
|
for (const d of result.drifted) {
|
|
41
41
|
lines.push(
|
|
42
42
|
` ${chalk.bold(d.name)} ${chalk.dim(d.range)}` +
|
|
43
|
-
` tested=${chalk.cyan(d.locked)}
|
|
43
|
+
` tested=${chalk.cyan(d.locked)} resolves=${chalk.yellow(d.resolved)}`
|
|
44
44
|
);
|
|
45
45
|
}
|
|
46
46
|
lines.push('');
|
|
47
|
-
|
|
48
|
-
|
|
47
|
+
// Which of these two readings applies depends on how the project ships,
|
|
48
|
+
// and this command cannot know that — so it states both rather than
|
|
49
|
+
// asserting one. The first draft said only "consumers resolve the range
|
|
50
|
+
// themselves, because a published package does not ship a lockfile",
|
|
51
|
+
// which is plainly false for a product distributed as a container image
|
|
52
|
+
// built with `npm ci`. The standard this command implements scopes itself
|
|
53
|
+
// to published artifacts; the command did not, and a check that overstates
|
|
54
|
+
// its own conclusion is the thing it exists to catch.
|
|
55
|
+
// The column is labelled `resolves=`, not `users get=`. The second reads
|
|
56
|
+
// correctly on its own only for a published package; for a container image
|
|
57
|
+
// its users get the `tested=` column exactly, and a row read alone would
|
|
58
|
+
// then say the opposite of the truth. Leaving the label and explaining it
|
|
59
|
+
// underneath is the "but note…" this project's own supply-chain standard
|
|
60
|
+
// was rewritten to stop doing — a line of a report, like a line of a
|
|
61
|
+
// standards table, is mostly read one line at a time.
|
|
62
|
+
lines.push(chalk.dim(' Your lockfile pins the tested column.'));
|
|
63
|
+
lines.push(chalk.dim(' If you publish this package, that column reaches nobody — a published'));
|
|
64
|
+
lines.push(chalk.dim(' package ships no lockfile, so consumers resolve the ranges themselves.'));
|
|
65
|
+
lines.push(chalk.dim(' If instead you ship the lockfile with the artifact (a container image,'));
|
|
66
|
+
lines.push(chalk.dim(' a deployed service), the third column is what the next lockfile'));
|
|
67
|
+
lines.push(chalk.dim(' regeneration pulls in — unreviewed, and by whoever happens to run it.'));
|
|
49
68
|
}
|
|
50
69
|
|
|
51
70
|
if (result.unpinnedNative.length > 0) {
|
|
@@ -62,7 +81,7 @@ function render(result) {
|
|
|
62
81
|
lines.push(chalk.dim(' promise about native ABI compatibility, and this ecosystem has'));
|
|
63
82
|
lines.push(chalk.dim(' broken it inside a minor range. A range that matches one published'));
|
|
64
83
|
lines.push(chalk.dim(' version is safe because upstream has not published again — waiting'));
|
|
65
|
-
lines.push(chalk.dim(' for drift means waiting until
|
|
84
|
+
lines.push(chalk.dim(' for drift means waiting until it is already inside something you ship.'));
|
|
66
85
|
}
|
|
67
86
|
|
|
68
87
|
if (result.unverifiable.length > 0) {
|
|
@@ -2,10 +2,20 @@
|
|
|
2
2
|
* Shipped dependency resolution integrity. // implements XSPEC-366 R1
|
|
3
3
|
*
|
|
4
4
|
* **The problem this measures.** A published npm package does not carry its
|
|
5
|
-
* lockfile. Your CI tests the versions `package-lock.json` pins;
|
|
6
|
-
* whatever the declared ranges resolve to at their
|
|
7
|
-
* differ, the entire test suite is green about a
|
|
8
|
-
* and that green is indistinguishable from a
|
|
5
|
+
* lockfile. Your CI tests the versions `package-lock.json` pins; whoever
|
|
6
|
+
* installs the package gets whatever the declared ranges resolve to at their
|
|
7
|
+
* install time. When those two differ, the entire test suite is green about a
|
|
8
|
+
* combination nobody installs — and that green is indistinguishable from a
|
|
9
|
+
* real one.
|
|
10
|
+
*
|
|
11
|
+
* **Who "whoever" is depends on how the project ships, and this module cannot
|
|
12
|
+
* know that.** For a published package it is every consumer. For a product
|
|
13
|
+
* distributed as a container image built with `npm ci`, its users get the
|
|
14
|
+
* pinned column exactly, and the resolved column is instead what the next
|
|
15
|
+
* lockfile regeneration will pull in — unreviewed, whenever someone happens to
|
|
16
|
+
* run it. Both are worth knowing; neither is safe to assert as the other. The
|
|
17
|
+
* report says both rather than picking one, and labels the column `resolves=`
|
|
18
|
+
* for the same reason.
|
|
9
19
|
*
|
|
10
20
|
* This is not hypothetical. `engramgraph` declared
|
|
11
21
|
* `"tree-sitter-c-sharp": "^0.23.1"`. Three published versions satisfy that
|
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.2",
|
|
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.2"
|
|
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.2",
|
|
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.2",
|
|
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.2",
|
|
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.2",
|
|
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.2",
|
|
2276
2276
|
"source": {
|
|
2277
2277
|
"human": "core/resource-cost-boundary.md",
|
|
2278
2278
|
"ai": "ai/standards/resource-cost-boundary.ai.yaml"
|