From f1fafe087271aad4281c3fb546795080bb83eb2c Mon Sep 17 00:00:00 2001 From: Tianyi Cui <53024+tianyicui@users.noreply.github.com> Date: Sun, 9 Aug 2026 13:25:18 +0800 Subject: [PATCH] test(windows): keep repository helpers in git subpath --- ...8-08-native-windows-pull-request-ci.i18n.yaml | 4 ++-- .../2026-08-08-native-windows-pull-request-ci.md | 2 ++ ...26-08-08-native-windows-pull-request-ci.zh.md | 2 ++ .../boot/app-boot/tests/repository-cache.spec.ts | 16 ++++++++-------- 4 files changed, 14 insertions(+), 10 deletions(-) diff --git a/.agents/notes/implemented/process/2026-08-08-native-windows-pull-request-ci.i18n.yaml b/.agents/notes/implemented/process/2026-08-08-native-windows-pull-request-ci.i18n.yaml index f37e927efb..fb0210cbe8 100644 --- a/.agents/notes/implemented/process/2026-08-08-native-windows-pull-request-ci.i18n.yaml +++ b/.agents/notes/implemented/process/2026-08-08-native-windows-pull-request-ci.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write .agents/notes/implemented/process/2026-08-08-native-windows-pull-request-ci.md -2026-08-08-native-windows-pull-request-ci.md: 162f7ae3d9fbe6e099f7fb1e8840ac1bdc4a853f -2026-08-08-native-windows-pull-request-ci.zh.md: 347239384fa5ea04b09f9a2de35975f72d1eadc5 +2026-08-08-native-windows-pull-request-ci.md: 1ef1cd906299a601a1d9f4cd95bb29c6935e5a10 +2026-08-08-native-windows-pull-request-ci.zh.md: 073ff1c2856c310ff52eb73ef53f0f34e1b841c9 diff --git a/.agents/notes/implemented/process/2026-08-08-native-windows-pull-request-ci.md b/.agents/notes/implemented/process/2026-08-08-native-windows-pull-request-ci.md index 162f7ae3d9..1ef1cd9062 100644 --- a/.agents/notes/implemented/process/2026-08-08-native-windows-pull-request-ci.md +++ b/.agents/notes/implemented/process/2026-08-08-native-windows-pull-request-ci.md @@ -52,6 +52,8 @@ The next run reached the repaired branches but one real PowerShell executor comp The following exact-head run passed all 10,938 instrumented tests and isolated four remaining locations whose existing fixtures depended on host scheduling. The E2B service retains its real surviving-group cleanup fixture and separately injects and observes an immediate automatic terminal-release rejection before proving disposal retries it. The pi-ai discovery fixture drives cancellation from a controlled response body read instead of racing a local socket timer, and the persistent-bash fixture makes an incremental PTY delta the only recoverable output before asserting the rendered fallback. These cases exercise the supported branches directly on every host; the coverage inventory and denominator remain unchanged. +After a newer `master` added exact Git-subpath package preparation, native coverage showed that the repository fixture's `file:` development dependencies outside the selected `.dsh-plugin` subpath did not expose their command shims on Windows. The fixture now keeps both helper packages inside that selected package and declares them through `file:./...`; the enclosing workspace remains excluded, while `prepack` still proves that ordinary bins from package-owned dependencies can build and prepare the installed repository. No production path, coverage threshold, or asserted artifact changed. + POSIX mode bits, chmod-based unreadability, and chmod-based writer-lock refusal do not exist as equivalent Windows facilities. Those acceptance cases remain enforced on POSIX and are skipped on Windows; content, atomic replacement, symlink safety, rollback and recovery through platform-independent filesystem conflicts, and native Windows long-path behavior remain covered. Only intrinsically POSIX source arms carry narrow, explained denominator ignores; no source file or platform-independent branch is excluded from Windows coverage to accommodate these differences. ## Alternatives considered diff --git a/.agents/notes/implemented/process/2026-08-08-native-windows-pull-request-ci.zh.md b/.agents/notes/implemented/process/2026-08-08-native-windows-pull-request-ci.zh.md index 347239384f..073ff1c285 100644 --- a/.agents/notes/implemented/process/2026-08-08-native-windows-pull-request-ci.zh.md +++ b/.agents/notes/implemented/process/2026-08-08-native-windows-pull-request-ci.zh.md @@ -52,6 +52,8 @@ Status: implemented 随后的分支头精确运行通过了全部 10,938 项插桩测试,并隔离出 4 个现有 fixture 依赖宿主调度的剩余位置。E2B 服务会保留真实的存活进程组清理 fixture,并另行注入并观察一次立即发生的终端自动释放拒绝,再证明服务释放会重试该终端。pi-ai 发现 fixture 改为从受控响应 body 的读取过程触发取消,不再与本地 socket 定时器竞速;persistent-bash fixture 则让 PTY 增量片段成为唯一可恢复输出,再断言渲染后的回退结果。这些用例会在每种宿主上直接执行受支持分支;覆盖率清单与分母均未改变。 +更新后的 `master` 新增针对精确 Git 子路径的包准备流程后,原生覆盖率表明,repository fixture 中位于所选 `.dsh-plugin` 子路径之外的 `file:` 开发依赖不会在 Windows 上暴露其命令包装脚本。现在,该 fixture 将两个辅助包都保留在所选包内,并通过 `file:./...` 声明它们;外层 workspace 仍被排除,而 `prepack` 仍会证明,来自包自有依赖的常规 bin 能够构建并准备已安装的 repository。生产路径、覆盖率阈值与断言所涉及的产物均未改变。 + POSIX 模式位、基于 chmod 的不可读状态和基于 chmod 的 writer lock 拒绝在 Windows 上没有等价机制。这些验收场景继续在 POSIX 上强制执行,并在 Windows 上跳过;内容、原子替换、符号链接安全、通过平台无关文件系统冲突验证的回滚与恢复,以及原生 Windows 长路径行为仍保有覆盖。只有本质上属于 POSIX 的源码分支带有窄范围且说明明确的分母忽略;没有任何源码文件或平台无关分支为适应这些差异而从 Windows 覆盖率中排除。 ## 曾考虑的替代方案 diff --git a/packages/boot/app-boot/tests/repository-cache.spec.ts b/packages/boot/app-boot/tests/repository-cache.spec.ts index fac3610b58..af23681e17 100644 --- a/packages/boot/app-boot/tests/repository-cache.spec.ts +++ b/packages/boot/app-boot/tests/repository-cache.spec.ts @@ -119,8 +119,8 @@ describe('RepositoryCache', () => { const root = await temporaryRoot('repository-pnpm') const repository = join(root, 'source') await mkdir(join(repository, '.dsh-plugin'), { recursive: true }) - await mkdir(join(repository, 'build-helper'), { recursive: true }) - await mkdir(join(repository, 'prepare-helper'), { recursive: true }) + await mkdir(join(repository, '.dsh-plugin', 'build-helper'), { recursive: true }) + await mkdir(join(repository, '.dsh-plugin', 'prepare-helper'), { recursive: true }) await mkdir(join(repository, 'skills', 'fixture'), { recursive: true }) await writeFile(join(repository, 'package.json'), `${JSON.stringify({ name: 'repository-fixture', @@ -138,22 +138,22 @@ describe('RepositoryCache', () => { ' .: {}', '', ].join('\n')) - await writeFile(join(repository, 'build-helper', 'package.json'), `${JSON.stringify({ + await writeFile(join(repository, '.dsh-plugin', 'build-helper', 'package.json'), `${JSON.stringify({ name: 'repository-build-helper', version: '1.0.0', bin: 'index.js', })}\n`) - await writeFile(join(repository, 'build-helper', 'index.js'), [ + await writeFile(join(repository, '.dsh-plugin', 'build-helper', 'index.js'), [ '#!/usr/bin/env node', "require('node:fs').writeFileSync('dependency-built.txt', 'dependency available\\n')", '', ].join('\n'), { mode: 0o700 }) - await writeFile(join(repository, 'prepare-helper', 'package.json'), `${JSON.stringify({ + await writeFile(join(repository, '.dsh-plugin', 'prepare-helper', 'package.json'), `${JSON.stringify({ name: 'repository-prepare-helper', version: '1.0.0', bin: { 'dsh-plugin-prepare': 'index.js' }, })}\n`) - await writeFile(join(repository, 'prepare-helper', 'index.js'), [ + await writeFile(join(repository, '.dsh-plugin', 'prepare-helper', 'index.js'), [ '#!/usr/bin/env node', "const { cpSync, mkdirSync, writeFileSync } = require('node:fs')", "mkdirSync('dsh-plugin-assets/skills', { recursive: true })", @@ -168,8 +168,8 @@ describe('RepositoryCache', () => { version: '1.0.0', scripts: { prepack: 'repository-build-helper && dsh-plugin-prepare' }, devDependencies: { - 'repository-build-helper': 'file:../build-helper', - 'repository-prepare-helper': 'file:../prepare-helper', + 'repository-build-helper': 'file:./build-helper', + 'repository-prepare-helper': 'file:./prepare-helper', }, dsh: { skills: ['../skills'] }, })}\n`)