From ca83aecbc853b2a7151af71c9727efd789371f3b Mon Sep 17 00:00:00 2001 From: Tianyi Cui <53024+tianyicui@users.noreply.github.com> Date: Fri, 2 Oct 2026 11:36:41 +0800 Subject: [PATCH] test(experimental): keep mods bridge specs platform-stable Resolve expected module paths through the platform path module and keep the signal-termination assertion to POSIX, where a self-killed child has no exit code. --- packages/experimental/claude-code-mods/src/host-ops.ts | 1 + .../experimental/claude-code-mods/tests/host-ops.spec.ts | 5 ++++- .../experimental/claude-code-mods/tests/manifest.spec.ts | 7 ++++--- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/packages/experimental/claude-code-mods/src/host-ops.ts b/packages/experimental/claude-code-mods/src/host-ops.ts index e4e7da0b61..01f451e52d 100644 --- a/packages/experimental/claude-code-mods/src/host-ops.ts +++ b/packages/experimental/claude-code-mods/src/host-ops.ts @@ -450,6 +450,7 @@ export function createHostOps(options: HostOpsOptions): OpTable { }) const outcome = await handle.done if (deadline.aborted) throw new Error(`$.process.run: ${argv[0]} did not exit within ${timeoutMs} ms`) + /* v8 ignore next -- a Windows child reports an exit code even when terminated; POSIX coverage owns this branch */ if (outcome.exitCode === null) throw new Error(`$.process.run: ${argv[0]} was terminated by signal ${String(outcome.signal)}`) return { exitCode: outcome.exitCode, diff --git a/packages/experimental/claude-code-mods/tests/host-ops.spec.ts b/packages/experimental/claude-code-mods/tests/host-ops.spec.ts index 845a12d4ca..1ee2e1bdce 100644 --- a/packages/experimental/claude-code-mods/tests/host-ops.spec.ts +++ b/packages/experimental/claude-code-mods/tests/host-ops.spec.ts @@ -178,7 +178,10 @@ describe('processes through the subprocess seam', () => { expect(run.stdout.endsWith('|set')).toBe(true) const viaAgent = await call('process.run', { argv: ['node', '-e', 'process.stdout.write(process.cwd())'] }, fakeAgent(ctx, { cwd })) as { stdout: string } expect(viaAgent.stdout.length).toBeGreaterThan(0) - await expect(call('process.run', { argv: ['node', '-e', 'process.kill(process.pid, "SIGKILL")'] })).rejects.toThrow(/was terminated by signal SIGKILL/) + // A Windows child that kills itself still reports an exit code, so the signal branch is POSIX evidence. + if (process.platform !== 'win32') { + await expect(call('process.run', { argv: ['node', '-e', 'process.kill(process.pid, "SIGKILL")'] })).rejects.toThrow(/was terminated by signal SIGKILL/) + } await expect(call('process.run', { argv: [] })).rejects.toThrow(/non-empty argv/) await expect(call('process.run', { argv: ['node', 1] })).rejects.toThrow(/non-empty argv/) }) diff --git a/packages/experimental/claude-code-mods/tests/manifest.spec.ts b/packages/experimental/claude-code-mods/tests/manifest.spec.ts index 88b9383b47..974ca0d165 100644 --- a/packages/experimental/claude-code-mods/tests/manifest.spec.ts +++ b/packages/experimental/claude-code-mods/tests/manifest.spec.ts @@ -41,11 +41,12 @@ describe('parseModManifest', () => { }) describe('parseHooksJson', () => { - const hooksJson = '/plugins/demo/hooks/hooks.json' + const root = resolve('/plugins/demo') + const hooksJson = join(root, 'hooks', 'hooks.json') it('resolves the one module path against hooks.json and notes settings hooks', () => { - expect(parseHooksJson({ modules: ['./register.js'] }, hooksJson)).toEqual({ modulePath: '/plugins/demo/hooks/register.js', hasSettingsHooks: false }) - expect(parseHooksJson({ modules: ['../lib/mod.mts'], hooks: {} }, hooksJson)).toEqual({ modulePath: '/plugins/demo/lib/mod.mts', hasSettingsHooks: true }) + expect(parseHooksJson({ modules: ['./register.js'] }, hooksJson)).toEqual({ modulePath: join(root, 'hooks', 'register.js'), hasSettingsHooks: false }) + expect(parseHooksJson({ modules: ['../lib/mod.mts'], hooks: {} }, hooksJson)).toEqual({ modulePath: join(root, 'lib', 'mod.mts'), hasSettingsHooks: true }) expect(HOOKS_MODULE_EXTENSIONS).toContain('.tsx') })