Skip to content

Commit 8140eff

Browse files
authored
Merge pull request #23 from stack-wuh/fix/20260918-fix-installer-ci-cmd-assert
fix(installer): .cmd 断言补平台门,恢复 linux/macos CI 门禁
2 parents 6122240 + 6a507ee commit 8140eff

3 files changed

Lines changed: 80 additions & 3 deletions

File tree

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
---
2+
{
3+
"schema": "shadow-dev/v1",
4+
"name": "20260918-fix-installer-ci-cmd-assert",
5+
"type": "fix",
6+
"scope": null,
7+
"status": "branched",
8+
"baseBranch": "main",
9+
"branch": "fix/20260918-fix-installer-ci-cmd-assert",
10+
"files": [],
11+
"github": {
12+
"repository": "stack-wuh/shadow-dev-cli",
13+
"issue": 22,
14+
"issueUrl": "https://github.com/stack-wuh/shadow-dev-cli/issues/22",
15+
"pullRequest": null,
16+
"pullRequestUrl": null
17+
},
18+
"review": {
19+
"conclusion": "pending",
20+
"verifiedCommit": null,
21+
"verifiedAt": null
22+
},
23+
"workflow": {
24+
"operation": null,
25+
"checkpoint": "issue:22",
26+
"planHash": "de68a5b25e152b369e06ce10b5bedfa40cf9888b26eaacb1bacbef49b7e7af05",
27+
"updatedAt": null,
28+
"lastError": null,
29+
"issuePlan": {
30+
"title": "[fix] 安装器契约测试 Linux/macOS 恒红:.cmd 断言补平台门",
31+
"titleRaw": null,
32+
"supplement": "",
33+
"body": "## 动机\n`test/install.test.mjs` 用例 53 无条件断言 `$BIN/shadow-dev.cmd` 存在,但 `.cmd` 按设计只在 MINGW/MSYS/CYGWIN 下生成(`gen_shims` 的 uname 分支)。结果 ubuntu/macos 矩阵自 38b1364(安装器引入)起 **main 分支 CI 持续红色**——红 CI 掩盖真实回归、让后续所有 PR 在坏门禁下合并(#18/#21 均如此)。本变更修复断言本身,恢复 CI 门禁价值。\n\n## 引用规范\n- shadow-docs/knowledge/install-distribution.md\n - 当前结论: 托管 shim 为 `.sh` 全平台 + `.cmd` 仅 Windows;验证方式登记 8 用例\n - 适用 scope: scripts/install-cli.sh, test/install.test.mjs\n- norms/tdd-verification.md\n - 当前结论: 完成前必须有可查验证;本变更的\"红\"在 CI 非 Windows 矩阵(本地 win 恒真无法复现),PR 上 CI 矩阵转绿即验证\n\n## 决策\n- **选型:** 平台门:`platform() === 'win32'` 时才断言 `.cmd` 存在(单行修复,非 win 环境断言 `.cmd` 不存在反而更贴合设计——顺带钉住\"不越平台生成\")。\n- **对比方案:** 让 `gen_shims` 在 unix 也生成 `.cmd` 被否——unix 下 `.cmd` 无运行语义,为迁就错误断言改正确行为是反模式。\n- **理由:** 断言错、行为对;测试向契约对齐,不是相反。\n\n## 任务\n- [ ] task-1 — `test/install.test.mjs` — 用例 53 的 `.cmd` 断言加平台门(win32 存在 / 其他平台不存在)\n- [ ] task-2 — `scripts/install-cli.sh` 无改动(确认边界);`shadow-docs/knowledge/install-distribution.md` — 验证方式登记平台分支语义,source 追加本 brief\n\n完整 brief:shadow-docs/changes/20260918-fix-installer-ci-cmd-assert/brief.md\n\n<!-- shadow-dev:issue-metadata {\"name\":\"20260918-fix-installer-ci-cmd-assert\",\"type\":\"fix\",\"scope\":null,\"status\":\"proposed\",\"branch\":null,\"baseBranch\":\"main\",\"briefPath\":\"shadow-docs/changes/20260918-fix-installer-ci-cmd-assert/brief.md\",\"cliVersion\":\"1.2.0\",\"prUrl\":null,\"issueNumber\":null} -->\n",
34+
"labels": [
35+
"fix"
36+
]
37+
}
38+
}
39+
}
40+
---
41+
42+
# 安装器契约测试 Linux/macOS 恒红:.cmd 断言补平台门
43+
44+
## 动机
45+
46+
`test/install.test.mjs` 用例 53 无条件断言 `$BIN/shadow-dev.cmd` 存在,但 `.cmd` 按设计只在 MINGW/MSYS/CYGWIN 下生成(`gen_shims` 的 uname 分支)。结果 ubuntu/macos 矩阵自 38b1364(安装器引入)起 **main 分支 CI 持续红色**——红 CI 掩盖真实回归、让后续所有 PR 在坏门禁下合并(#18/#21 均如此)。本变更修复断言本身,恢复 CI 门禁价值。
47+
48+
## 引用规范
49+
50+
- shadow-docs/knowledge/install-distribution.md
51+
- 当前结论: 托管 shim 为 `.sh` 全平台 + `.cmd` 仅 Windows;验证方式登记 8 用例
52+
- 适用 scope: scripts/install-cli.sh, test/install.test.mjs
53+
- norms/tdd-verification.md
54+
- 当前结论: 完成前必须有可查验证;本变更的"红"在 CI 非 Windows 矩阵(本地 win 恒真无法复现),PR 上 CI 矩阵转绿即验证
55+
56+
## 决策
57+
58+
- **选型:** 平台门:`platform() === 'win32'` 时才断言 `.cmd` 存在(单行修复,非 win 环境断言 `.cmd` 不存在反而更贴合设计——顺带钉住"不越平台生成")。
59+
- **对比方案:** 让 `gen_shims` 在 unix 也生成 `.cmd` 被否——unix 下 `.cmd` 无运行语义,为迁就错误断言改正确行为是反模式。
60+
- **理由:** 断言错、行为对;测试向契约对齐,不是相反。
61+
62+
## 任务
63+
64+
- [x] task-1 — `test/install.test.mjs` — 用例 53 的 `.cmd` 断言加平台门(win32 存在 / 其他平台不存在)
65+
- [x] task-2 — `scripts/install-cli.sh` 无改动(确认边界);`shadow-docs/knowledge/install-distribution.md` — 验证方式登记平台分支语义,source 追加本 brief
66+
67+
## 结果
68+
69+
- 实际耗时: —
70+
- 验证: —
71+
72+
## 知识评估
73+
74+
- **预期影响:** 更新
75+
- **候选卡片:** shadow-docs/knowledge/install-distribution.md
76+
- **理由:** 卡片验证方式需钉住 `.cmd` 平台分支语义,防再次写出跨平台恒假断言

‎shadow-docs/knowledge/install-distribution.md‎

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@ source:
88
- changes/20260917-feature-install-cli-script/brief.md
99
- changes/20260917-fix-installer-url-taint/brief.md
1010
- changes/20260917-feature-install-link-mode/brief.md
11-
verified: 2026-09-17
11+
- changes/20260918-fix-installer-ci-cmd-assert/brief.md
12+
verified: 2026-09-18
1213
---
1314

1415
# shadow-dev CLI 安装与分发模型
@@ -32,7 +33,7 @@ verified: 2026-09-17
3233

3334
## 验证方式
3435

35-
`node --test test/install.test.mjs` 全绿即契约成立(8 用例:离线物化+shim 运行、幂等/--force、非托管 shim 保护、回滚往返、坏产物、link 映射/优先/回退、link 校验与 guard、dry-run+status+参数拒绝)。手工复验:`bash scripts/install-cli.sh link <本仓库>` 后 `shadow-dev change list --archived` 立即可用且 `install --json` 后仍走 link(LINK 优先);`unlink` 后回物化版本;`status --json` 的 `linked`/`current` 如实反映。
36+
`node --test test/install.test.mjs` 全绿即契约成立(8 用例:离线物化+shim 运行、幂等/--force、非托管 shim 保护、回滚往返、坏产物、link 映射/优先/回退、link 校验与 guard、dry-run+status+参数拒绝)。shim 面是**平台分支**的:`.sh` 全平台生成,`.cmd` 仅 MINGW/MSYS/CYGWIN——测试断言 `.cmd` 必须带 `platform() === 'win32'` 平台门,恒真/恒假的跨平台断言会让 CI 门禁失真(历史上 main 因此连红一天)。手工复验:`bash scripts/install-cli.sh link <本仓库>` 后 `shadow-dev change list --archived` 立即可用且 `install --json` 后仍走 link(LINK 优先);`unlink` 后回物化版本;`status --json` 的 `linked`/`current` 如实反映。
3637

3738
## 关联知识
3839

‎test/install.test.mjs‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ test('offline install: pointer, managed shims, installed shim runs', skip, () =>
5353
assert.equal(readFileSync(join(prefix, 'CURRENT'), 'utf8').trim(), '9.9.9')
5454
const shim = readFileSync(join(bin, 'shadow-dev'), 'utf8')
5555
assert.match(shim, /managed-by: shadow-dev-cli-installer/)
56-
assert.ok(existsSync(join(bin, 'shadow-dev.cmd')))
56+
assert.equal(existsSync(join(bin, 'shadow-dev.cmd')), platform() === 'win32', '.cmd shim is generated on Windows only')
5757
const viaShim = spawnSync('bash', [toUnix(join(bin, 'shadow-dev')), 'help'], { encoding: 'utf8' })
5858
assert.equal(viaShim.status, 0, viaShim.stderr)
5959
assert.match(viaShim.stdout, /"ok":true/)

0 commit comments

Comments
 (0)