From 6e948732d1bbb4dfeaf76110e5c3c77f8c3bbfca Mon Sep 17 00:00:00 2001 From: Tianyi Cui <53024+tianyicui@users.noreply.github.com> Date: Fri, 2 Oct 2026 11:53:56 +0800 Subject: [PATCH] test(experimental): cover the mods bridge's process cwd fallback on Windows and list the package in the release family Also narrow the mod tool's rendered value to the string its schema admits and bind the registration's catch before calling it untyped. --- packages/experimental/claude-code-mods/src/host-ops.ts | 4 ++-- packages/experimental/claude-code-mods/tests/host-ops.spec.ts | 2 ++ packages/experimental/claude-code-mods/tests/module.spec.ts | 3 ++- scripts/release/families.spec.ts | 1 + 4 files changed, 7 insertions(+), 3 deletions(-) diff --git a/packages/experimental/claude-code-mods/src/host-ops.ts b/packages/experimental/claude-code-mods/src/host-ops.ts index 01f451e52d..c4ee68d1bc 100644 --- a/packages/experimental/claude-code-mods/src/host-ops.ts +++ b/packages/experimental/claude-code-mods/src/host-ops.ts @@ -293,9 +293,9 @@ export function createHostOps(options: HostOpsOptions): OpTable { description, parameters: inputSchema, output: { - // The answering hook's result text. + // The answering hook's result text; the schema admits only a string. schema: { type: 'string' }, - render: (_args, value) => [{ type: 'text', text: String(value) }], + render: (_args, value) => [{ type: 'text', text: value as string }], }, execute() { return Promise.reject(new Error(`${mod.name} registered ${fullName} but no tool.call hook answered it; add on('tool.call', { tool: '${fullName}' }, hook)`)) 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 1ee2e1bdce..cf9857db46 100644 --- a/packages/experimental/claude-code-mods/tests/host-ops.spec.ts +++ b/packages/experimental/claude-code-mods/tests/host-ops.spec.ts @@ -178,6 +178,8 @@ 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) + const bare = await call('process.run', { argv: ['node', '-e', 'process.stdout.write(process.cwd())'] }) as { exitCode: number; stdout: string } + expect(bare).toEqual({ exitCode: 0, stdout: process.cwd(), stderr: '' }) // 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/) diff --git a/packages/experimental/claude-code-mods/tests/module.spec.ts b/packages/experimental/claude-code-mods/tests/module.spec.ts index c66388fa6d..7f717343d5 100644 --- a/packages/experimental/claude-code-mods/tests/module.spec.ts +++ b/packages/experimental/claude-code-mods/tests/module.spec.ts @@ -35,7 +35,8 @@ describe('createOn', () => { expect(() => on('session.start', { cwd: '/x' }, noop)).not.toThrow() expect(() => loose('turn.start', 'nope')).toThrow(/needs a hook function/) expect(() => loose('turn.start', 'nope', noop)).toThrow(/matcher must be an object/) - const attach = on('turn.complete', noop).catch as (handler: unknown) => void + const registration = on('turn.complete', noop) + const attach = registration.catch.bind(registration) as (handler: unknown) => void expect(() => { attach('nope') }).toThrow(/needs a handler function/) }) }) diff --git a/scripts/release/families.spec.ts b/scripts/release/families.spec.ts index 0cbba9d3c8..52704e8655 100644 --- a/scripts/release/families.spec.ts +++ b/scripts/release/families.spec.ts @@ -56,6 +56,7 @@ describe('release families', () => { '@deepseek-ai/dsh-experimental-browser-use-playwright-mcp', '@deepseek-ai/dsh-experimental-browser-use-runtime', '@deepseek-ai/dsh-experimental-browser-use-stagehand-native', + '@deepseek-ai/dsh-experimental-claude-code-mods', '@deepseek-ai/dsh-experimental-client-ui-agent-team', '@deepseek-ai/dsh-experimental-client-ui-voice-input', '@deepseek-ai/dsh-experimental-computer-use-cua-driver-mcp',