universal-dev-standards 6.2.6 → 6.2.8
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 +14 -2
- package/bundled/locales/zh-CN/README.md +1 -1
- package/bundled/locales/zh-CN/SECURITY.md +1 -1
- package/bundled/locales/zh-TW/CHANGELOG.md +14 -2
- package/bundled/locales/zh-TW/README.md +1 -1
- package/bundled/locales/zh-TW/SECURITY.md +1 -1
- package/package.json +1 -1
- package/src/reconciler/plan-executor.js +37 -20
- package/src/utils/github.js +26 -7
- package/standards-registry.json +7 -7
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
source: ../../CHANGELOG.md
|
|
3
|
-
source_version: 6.2.
|
|
4
|
-
translation_version: 6.2.
|
|
3
|
+
source_version: 6.2.8
|
|
4
|
+
translation_version: 6.2.8
|
|
5
5
|
last_synced: 2026-07-31
|
|
6
6
|
status: current
|
|
7
7
|
---
|
|
@@ -17,6 +17,18 @@ status: current
|
|
|
17
17
|
|
|
18
18
|
## [Unreleased]
|
|
19
19
|
|
|
20
|
+
## [6.2.8] - 2026-07-31
|
|
21
|
+
|
|
22
|
+
### 修复
|
|
23
|
+
|
|
24
|
+
- **下载回来的标准,中文是坏的。** HTTPS 响应以 `data += chunk` 累积,而那会对每一个分块各自解码——于是任何字节跨在分块边界上的字符都变成替换字符(`日期` → `日�期`)。单字节的拉丁文不受影响;三字节的中日韩文字受影响。**过程中没有任何一步失败**:传输完成、文件写入、动作报告成功,损坏只有读文字才看得见。在一台机器上实测,**11 个项目的已安装标准里共约 278 个替换字符**。损害集中在 `requirement-checklist.md`、`requirement-template.md`、`requirement-document-template.md` 与 locale 包——也就是发布包不出货的那些文件(`files` 不含 `templates/` 与 `extensions/`),它们只可能靠下载取得。**若你的标准里有 `�`,请在 6.2.8 以上跑 `uds update --force`——重新下载的内容是正确的,会覆盖掉它们。**
|
|
25
|
+
|
|
26
|
+
## [6.2.7] - 2026-07-31
|
|
27
|
+
|
|
28
|
+
### 修复
|
|
29
|
+
|
|
30
|
+
- **reconciler 在任何 npm 安装下都取不到 extension。** `manifest.extensions` 的条目(locale 包之类)抵达 executor 时没有已解析的来源路径,因为发布包的 `files` 清单不含 `extensions/` 目录——于是 `uds update --force` 对它们报告 `No source path available`,而 `uds update` 却更新了同一个文件。executor 现在改以 `copyStandard` 解析 extension,那是它处理 registry entry 时本来就在用的 bundled → repo → download fallback,也正是 legacy 路径一直在用的那一条。完全没有任何来源的条目仍然会失败,本来就该如此。
|
|
31
|
+
|
|
20
32
|
## [6.2.6] - 2026-07-31
|
|
21
33
|
|
|
22
34
|
### 新增
|
|
@@ -15,7 +15,7 @@ status: current
|
|
|
15
15
|
|
|
16
16
|
> **语言**: [English](../../README.md) | [繁體中文](../zh-TW/README.md) | 简体中文
|
|
17
17
|
|
|
18
|
-
**版本**: 6.2.
|
|
18
|
+
**版本**: 6.2.8 | **发布日期**: 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.2.
|
|
4
|
-
translation_version: 6.2.
|
|
3
|
+
source_version: 6.2.8
|
|
4
|
+
translation_version: 6.2.8
|
|
5
5
|
last_synced: 2026-07-31
|
|
6
6
|
status: current
|
|
7
7
|
---
|
|
@@ -17,6 +17,18 @@ status: current
|
|
|
17
17
|
|
|
18
18
|
## [Unreleased]
|
|
19
19
|
|
|
20
|
+
## [6.2.8] - 2026-07-31
|
|
21
|
+
|
|
22
|
+
### 修復
|
|
23
|
+
|
|
24
|
+
- **下載回來的標準,中文是壞的。** HTTPS 回應以 `data += chunk` 累積,而那會對每一個分塊各自解碼——於是任何位元組跨在分塊邊界上的字元都變成替換字元(`日期` → `日�期`)。單位元組的拉丁文不受影響;三位元組的中日韓文字受影響。**過程中沒有任何一步失敗**:傳輸完成、檔案寫入、動作回報成功,損壞只有讀文字才看得見。在一台機器上實測,**11 個專案的已安裝標準裡共約 278 個替換字元**。損害集中在 `requirement-checklist.md`、`requirement-template.md`、`requirement-document-template.md` 與 locale 包——也就是發布包不出貨的那些檔(`files` 不含 `templates/` 與 `extensions/`),它們只可能靠下載取得。**若你的標準裡有 `�`,請在 6.2.8 以上跑 `uds update --force`——重新下載的內容是正確的,會覆蓋掉它們。**
|
|
25
|
+
|
|
26
|
+
## [6.2.7] - 2026-07-31
|
|
27
|
+
|
|
28
|
+
### 修復
|
|
29
|
+
|
|
30
|
+
- **reconciler 在任何 npm 安裝下都取不到 extension。** `manifest.extensions` 的項目(locale 包之類)抵達 executor 時沒有已解析的來源路徑,因為發布包的 `files` 清單不含 `extensions/` 目錄——於是 `uds update --force` 對它們回報 `No source path available`,而 `uds update` 卻更新了同一個檔案。executor 現在改以 `copyStandard` 解析 extension,那是它處理 registry entry 時本來就在用的 bundled → repo → download fallback,也正是 legacy 路徑一直在用的那一條。完全沒有任何來源的項目仍然會失敗,本來就該如此。
|
|
31
|
+
|
|
20
32
|
## [6.2.6] - 2026-07-31
|
|
21
33
|
|
|
22
34
|
### 新增
|
|
@@ -15,7 +15,7 @@ status: current
|
|
|
15
15
|
|
|
16
16
|
> **語言**: [English](../../README.md) | 繁體中文 | [简体中文](../zh-CN/README.md)
|
|
17
17
|
|
|
18
|
-
**版本**: 6.2.
|
|
18
|
+
**版本**: 6.2.8 | **發布日期**: 2026-07-31 | **授權**: [雙重授權](../../LICENSE) (CC BY 4.0 + MIT)
|
|
19
19
|
|
|
20
20
|
語言無關、框架無關的軟體專案文件標準。透過 AI 原生工作流,確保不同技術堆疊之間的一致性、品質和可維護性。
|
|
21
21
|
|
package/package.json
CHANGED
|
@@ -221,32 +221,49 @@ async function executeCreateOrUpdate(projectPath, action, manifest) {
|
|
|
221
221
|
if (action.category === 'standard' || action.category === 'option') {
|
|
222
222
|
const sourcePath = action.details?.sourcePath;
|
|
223
223
|
if (!sourcePath) {
|
|
224
|
-
//
|
|
224
|
+
// No absolute path was resolved, so fall back to copyStandard, which walks
|
|
225
|
+
// bundled → repo → download. Two kinds of entry arrive here.
|
|
225
226
|
const metadata = action.details?.metadata;
|
|
226
|
-
|
|
227
|
+
let sourceStr = null;
|
|
228
|
+
let targetDir = '.standards';
|
|
229
|
+
|
|
230
|
+
if (metadata?.extensionSource) {
|
|
231
|
+
// An entry from `manifest.extensions`. PathResolver cannot resolve these
|
|
232
|
+
// from an npm install: the published package's `files` list is bin, src,
|
|
233
|
+
// bundled, standards-registry.json and README.md — no `extensions/`. So
|
|
234
|
+
// `sourcePath` is null for every adopter who did not install from a
|
|
235
|
+
// source checkout, and this function answered "No source path available"
|
|
236
|
+
// for a file it was perfectly able to fetch.
|
|
237
|
+
//
|
|
238
|
+
// The legacy update path never had the bug because it calls copyStandard
|
|
239
|
+
// directly (`update.js`, "Update extensions"). The same upgrade therefore
|
|
240
|
+
// refreshed `.standards/zh-tw.md` under `uds update` and failed under the
|
|
241
|
+
// reconciler — the two paths disagreed about whether the file was
|
|
242
|
+
// reachable, and only one of them was right. (XSPEC-343)
|
|
243
|
+
sourceStr = metadata.extensionSource;
|
|
244
|
+
} else if (metadata?.registryEntry) {
|
|
227
245
|
const source = metadata.registryEntry.source;
|
|
228
|
-
|
|
246
|
+
sourceStr = typeof source === 'string'
|
|
229
247
|
? source
|
|
230
248
|
: (source?.[metadata.format] || source?.ai || source?.human);
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
}
|
|
246
|
-
return { action, success: true };
|
|
249
|
+
targetDir = action.category === 'option' ? dirname(action.path) : '.standards';
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
if (sourceStr) {
|
|
253
|
+
const result = await copyStandard(sourceStr, targetDir, projectPath);
|
|
254
|
+
if (result.success) {
|
|
255
|
+
// Update hash in manifest
|
|
256
|
+
const hashInfo = computeFileHash(join(projectPath, action.path));
|
|
257
|
+
if (hashInfo) {
|
|
258
|
+
const normalizedPath = action.path.replace(/\\/g, '/');
|
|
259
|
+
manifest.fileHashes[normalizedPath] = {
|
|
260
|
+
...hashInfo,
|
|
261
|
+
installedAt: new Date().toISOString()
|
|
262
|
+
};
|
|
247
263
|
}
|
|
248
|
-
return { action, success:
|
|
264
|
+
return { action, success: true };
|
|
249
265
|
}
|
|
266
|
+
return { action, success: false, error: result.error };
|
|
250
267
|
}
|
|
251
268
|
return { action, success: false, error: 'No source path available' };
|
|
252
269
|
}
|
package/src/utils/github.js
CHANGED
|
@@ -90,13 +90,32 @@ function httpGet(url) {
|
|
|
90
90
|
return;
|
|
91
91
|
}
|
|
92
92
|
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
93
|
+
// Collect Buffers and decode once at the end. `data += chunk` decoded each
|
|
94
|
+
// chunk on its own, so any character whose bytes straddled a chunk boundary
|
|
95
|
+
// became U+FFFD on both sides of the split. Latin text survived because its
|
|
96
|
+
// characters are one byte; Chinese standards are three bytes each and did
|
|
97
|
+
// not. `uds update --force` on one project downloaded four files and wrote
|
|
98
|
+
// 30 replacement characters into them — `日期` → `日�期`, `結構` → `結�構`
|
|
99
|
+
// — and reported every action as succeeded, because as far as the CLI was
|
|
100
|
+
// concerned the transfer completed and the file was written. (XSPEC-343)
|
|
101
|
+
const chunks = [];
|
|
102
|
+
res.on('data', chunk => chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk)));
|
|
103
|
+
res.on('end', () => {
|
|
104
|
+
// try/catch because a throw inside an event handler does not reject the
|
|
105
|
+
// enclosing promise — it escapes, and the caller's await hangs forever.
|
|
106
|
+
// The first draft of this fix passed strings to Buffer.concat and the
|
|
107
|
+
// test run simply stopped, with no error to read. A hang is a worse
|
|
108
|
+
// failure than an exception: there is nothing to grep for.
|
|
109
|
+
try {
|
|
110
|
+
resolve({
|
|
111
|
+
data: Buffer.concat(chunks).toString('utf8'),
|
|
112
|
+
statusCode: res.statusCode,
|
|
113
|
+
headers: res.headers
|
|
114
|
+
});
|
|
115
|
+
} catch (err) {
|
|
116
|
+
reject(err);
|
|
117
|
+
}
|
|
118
|
+
});
|
|
100
119
|
res.on('error', reject);
|
|
101
120
|
}).on('error', reject);
|
|
102
121
|
});
|
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.2.
|
|
3
|
+
"version": "6.2.8",
|
|
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.2.
|
|
61
|
+
"version": "6.2.8"
|
|
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.2.
|
|
68
|
+
"version": "6.2.8",
|
|
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.2.
|
|
2239
|
+
"version": "6.2.8",
|
|
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.2.
|
|
2251
|
+
"version": "6.2.8",
|
|
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.2.
|
|
2263
|
+
"version": "6.2.8",
|
|
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.2.
|
|
2275
|
+
"version": "6.2.8",
|
|
2276
2276
|
"source": {
|
|
2277
2277
|
"human": "core/resource-cost-boundary.md",
|
|
2278
2278
|
"ai": "ai/standards/resource-cost-boundary.ai.yaml"
|