revert: split hook transcript locator cases

This commit is contained in:
Yichen Jiang
2026-07-10 20:56:24 +08:00
parent c204451995
commit 869f94d9d8
2 changed files with 34 additions and 40 deletions

View File

@@ -58,29 +58,26 @@ async function waitFor(predicate: () => boolean, timeout = 5000, interval = 10):
} }
describe('hooks-claude coverage — config option arms + substitution + skip warning', () => { describe('hooks-claude coverage — config option arms + substitution + skip warning', () => {
async function captureTranscriptPath(sessionRoot?: string): Promise<{ payload: { transcript_path: string }; expected: string | undefined }> { it('uses the persistence locator for transcript_path and an empty string without one', async () => {
const d = dir() async function capture(sessionRoot?: string): Promise<{ payload: { transcript_path: string }; expected: string | undefined }> {
const cap = join(d, 'payload') const d = dir()
const path = hooks(d, { PreToolUse: [{ hooks: [{ type: 'command', command: sh(d, 'capture.sh', `#!/usr/bin/env bash\ncat > "${cap}"\n`) }] }] }) const cap = join(d, 'payload')
const adapter = new MockAdapter([toolCallResponse('c1', 'echo', {}), textResponse('done')]) const path = hooks(d, { PreToolUse: [{ hooks: [{ type: 'command', command: sh(d, 'capture.sh', `#!/usr/bin/env bash\ncat > "${cap}"\n`) }] }] })
const ctx = await harness(path, adapter, { ...sessionRoot !== undefined ? { sessionRoot } : {} }) const adapter = new MockAdapter([toolCallResponse('c1', 'echo', {}), textResponse('done')])
ctx.tools.register(defineTool({ name: 'echo', description: 'e', parameters: {}, async execute() { return [{ type: 'text', text: 'ok' }] } })) const ctx = await harness(path, adapter, { ...sessionRoot !== undefined ? { sessionRoot } : {} })
const agent = ctx.agentLoop.create(AgentId('transcript'), { model: 'mock' }) ctx.tools.register(defineTool({ name: 'echo', description: 'e', parameters: {}, async execute() { return [{ type: 'text', text: 'ok' }] } }))
agent.send([{ type: 'text', text: 'go' }]) const agent = ctx.agentLoop.create(AgentId('transcript'), { model: 'mock' })
await waitForIdle(ctx, agent) agent.send([{ type: 'text', text: 'go' }])
return { await waitForIdle(ctx, agent)
payload: JSON.parse(readFileSync(cap, 'utf8')) as { transcript_path: string }, return {
expected: ctx.get('sessionPersistence')?.locate(agent.session.header)?.path, payload: JSON.parse(readFileSync(cap, 'utf8')) as { transcript_path: string },
expected: ctx.get('sessionPersistence')?.locate(agent.session.header)?.path,
}
} }
}
it('uses the persistence locator for transcript_path', async () => { const located = await capture(dir())
const located = await captureTranscriptPath(dir())
expect(located.payload.transcript_path).toBe(located.expected) expect(located.payload.transcript_path).toBe(located.expected)
}) expect((await capture()).payload.transcript_path).toBe('')
it('uses an empty transcript_path without a persistence locator', async () => {
expect((await captureTranscriptPath()).payload.transcript_path).toBe('')
}) })
it('honors pluginRoot + projectDir substitution and warns on a skipped non-command hook', async () => { it('honors pluginRoot + projectDir substitution and warns on a skipped non-command hook', async () => {

View File

@@ -51,29 +51,26 @@ async function waitFor(predicate: () => boolean, timeout = 5000, interval = 10):
} }
describe('hooks-codex coverage — decision mapping paths', () => { describe('hooks-codex coverage — decision mapping paths', () => {
async function captureTranscriptPath(sessionRoot?: string): Promise<{ payload: { transcript_path: string | null }; expected: string | undefined }> { it('uses the persistence locator for transcript_path and null without one', async () => {
const d = dir() async function capture(sessionRoot?: string): Promise<{ payload: { transcript_path: string | null }; expected: string | undefined }> {
const cap = join(d, 'payload') const d = dir()
const path = hooks(d, { PreToolUse: [{ hooks: [{ type: 'command', command: sh(d, 'capture.sh', `#!/usr/bin/env bash\ncat > "${cap}"\n`) }] }] }) const cap = join(d, 'payload')
const adapter = new MockAdapter([toolCallResponse('c1', 'echo', {}), textResponse('done')]) const path = hooks(d, { PreToolUse: [{ hooks: [{ type: 'command', command: sh(d, 'capture.sh', `#!/usr/bin/env bash\ncat > "${cap}"\n`) }] }] })
const ctx = await harness(path, adapter, { ...sessionRoot !== undefined ? { sessionRoot } : {} }) const adapter = new MockAdapter([toolCallResponse('c1', 'echo', {}), textResponse('done')])
ctx.tools.register(defineTool({ name: 'echo', description: 'e', parameters: {}, async execute() { return [{ type: 'text', text: 'ok' }] } })) const ctx = await harness(path, adapter, { ...sessionRoot !== undefined ? { sessionRoot } : {} })
const agent = ctx.agentLoop.create(AgentId('transcript'), { model: 'mock' }) ctx.tools.register(defineTool({ name: 'echo', description: 'e', parameters: {}, async execute() { return [{ type: 'text', text: 'ok' }] } }))
agent.send([{ type: 'text', text: 'go' }]) const agent = ctx.agentLoop.create(AgentId('transcript'), { model: 'mock' })
await waitForIdle(ctx, agent) agent.send([{ type: 'text', text: 'go' }])
return { await waitForIdle(ctx, agent)
payload: JSON.parse(readFileSync(cap, 'utf8')) as { transcript_path: string | null }, return {
expected: ctx.get('sessionPersistence')?.locate(agent.session.header)?.path, payload: JSON.parse(readFileSync(cap, 'utf8')) as { transcript_path: string | null },
expected: ctx.get('sessionPersistence')?.locate(agent.session.header)?.path,
}
} }
}
it('uses the persistence locator for transcript_path', async () => { const located = await capture(dir())
const located = await captureTranscriptPath(dir())
expect(located.payload.transcript_path).toBe(located.expected) expect(located.payload.transcript_path).toBe(located.expected)
}) expect((await capture()).payload.transcript_path).toBeNull()
it('uses null transcript_path without a persistence locator', async () => {
expect((await captureTranscriptPath()).payload.transcript_path).toBeNull()
}) })
it('UserPromptSubmit block (exit 2) → rejected turn; default reason on empty stderr', async () => { it('UserPromptSubmit block (exit 2) → rejected turn; default reason on empty stderr', async () => {