fix(hooks): final verified fixes for Windows flakiness (clean version)

This commit is contained in:
Taylor Mullen
2026-02-10 14:24:22 -08:00
parent a68d08d5b5
commit 88d677207c
7 changed files with 81 additions and 22 deletions
@@ -965,6 +965,10 @@ export class CoreToolScheduler {
// The active tool is finished. Move it to the completed batch.
const completedCall = activeCall as CompletedToolCall;
if (process.env['CI'] === 'true' || process.env['VERBOSE'] === 'true') {
}
this.completedToolCallsForBatch.push(completedCall);
logToolCall(this.config, new ToolCallEvent(completedCall));
+7
View File
@@ -233,6 +233,13 @@ please review the project settings (.gemini/settings.json) and remove them.`;
} as HookRegistryEntry);
const isDisabled = disabledHooks.includes(hookName);
if (process.env['CI'] === 'true' || process.env['VERBOSE'] === 'true') {
if (isDisabled) {
}
if (disabledHooks.length > 0) {
}
}
// Add source to hook config
hookConfig.source = source;
+13
View File
@@ -268,6 +268,9 @@ export class HookRunner {
shellConfig.shell,
);
if (process.env['CI'] === 'true' || process.env['VERBOSE'] === 'true') {
}
// Set up environment variables
const env = {
...sanitizeEnvironment(process.env, this.config.sanitizationConfig),
@@ -332,11 +335,19 @@ export class HookRunner {
stderr += data.toString();
});
child.on('exit', (code, signal) => {
if (process.env['CI'] === 'true' || process.env['VERBOSE'] === 'true') {
}
});
// Handle process exit
child.on('close', (exitCode) => {
clearTimeout(timeoutHandle);
const duration = Date.now() - startTime;
if (process.env['CI'] === 'true' || process.env['VERBOSE'] === 'true') {
}
if (timedOut) {
resolve({
hookConfig,
@@ -428,6 +439,8 @@ export class HookRunner {
text: string,
exitCode: number,
): HookOutput {
if (process.env['CI'] === 'true' || process.env['VERBOSE'] === 'true') {
}
if (exitCode === EXIT_CODE_SUCCESS) {
// Success - treat as system message or additional context
return {
+10 -6
View File
@@ -360,9 +360,11 @@ export class PolicyEngine {
);
if (match) {
debugLogger.debug(
`[PolicyEngine.check] MATCHED rule: toolName=${rule.toolName}, decision=${rule.decision}, priority=${rule.priority}, argsPattern=${rule.argsPattern?.source || 'none'}`,
);
if (process.env['CI'] === 'true' || process.env['VERBOSE'] === 'true') {
console.log(
`[PolicyEngine.check] MATCHED rule: toolName=${rule.toolName}, decision=${rule.decision}, priority=${rule.priority}, source=${rule.source}`,
);
}
if (isShellCommand && toolName) {
const shellResult = await this.checkShellCommand(
@@ -389,9 +391,11 @@ export class PolicyEngine {
// Default if no rule matched
if (decision === undefined) {
debugLogger.debug(
`[PolicyEngine.check] NO MATCH - using default decision: ${this.defaultDecision}`,
);
if (process.env['CI'] === 'true' || process.env['VERBOSE'] === 'true') {
console.log(
`[PolicyEngine.check] NO MATCH - using default decision: ${this.defaultDecision}`,
);
}
if (toolName && SHELL_TOOL_NAMES.includes(toolName)) {
const shellResult = await this.checkShellCommand(
toolName,
+33 -2
View File
@@ -361,6 +361,9 @@ export class TestRig {
this.testDir = join(testFileDir, sanitizedName);
this.homeDir = join(testFileDir, sanitizedName + '-home');
if (env['VERBOSE'] === 'true' || env['CI'] === 'true') {
}
if (!this._initialized) {
// Clean up existing directories from previous runs (e.g. retries)
const cleanDir = (dir: string) => {
@@ -584,6 +587,9 @@ export class TestRig {
});
this._spawnedProcesses.push(child);
if (env['VERBOSE'] === 'true' || env['CI'] === 'true') {
}
let stdout = '';
let stderr = '';
@@ -838,9 +844,19 @@ export class TestRig {
}
async cleanup() {
if (env['VERBOSE'] === 'true' || env['CI'] === 'true') {
}
// Kill any interactive runs that are still active
for (const run of this._interactiveRuns) {
try {
if (process.platform === 'win32') {
// @ts-ignore - access private ptyProcess
const pid = run.ptyProcess?.pid;
if (pid) {
execSync(`taskkill /F /T /PID ${pid}`, { stdio: 'ignore' });
}
}
await run.kill();
} catch (error) {
if (env['VERBOSE'] === 'true') {
@@ -854,6 +870,9 @@ export class TestRig {
for (const child of this._spawnedProcesses) {
if (child.exitCode === null && child.signalCode === null) {
try {
if (process.platform === 'win32' && child.pid) {
execSync(`taskkill /F /T /PID ${child.pid}`, { stdio: 'ignore' });
}
child.kill('SIGKILL');
} catch (error) {
if (env['VERBOSE'] === 'true') {
@@ -876,20 +895,24 @@ export class TestRig {
// Clean up test directory and home directory
if (this.testDir && !env['KEEP_OUTPUT']) {
try {
if (env['VERBOSE'] === 'true' || env['CI'] === 'true') {
}
fs.rmSync(this.testDir, { recursive: true, force: true });
} catch (error) {
// Ignore cleanup errors
if (env['VERBOSE'] === 'true') {
if (env['VERBOSE'] === 'true' || env['CI'] === 'true') {
console.warn('Cleanup warning:', (error as Error).message);
}
}
}
if (this.homeDir && !env['KEEP_OUTPUT']) {
try {
if (env['VERBOSE'] === 'true' || env['CI'] === 'true') {
}
fs.rmSync(this.homeDir, { recursive: true, force: true });
} catch (error) {
// Ignore cleanup errors
if (env['VERBOSE'] === 'true') {
if (env['VERBOSE'] === 'true' || env['CI'] === 'true') {
console.warn('Cleanup warning:', (error as Error).message);
}
}
@@ -1225,6 +1248,10 @@ export class TestRig {
}[] = [];
for (const logData of parsedLogs) {
if (env['VERBOSE'] === 'true' || env['CI'] === 'true') {
if (logData.attributes?.['event.name']?.includes('tool')) {
}
}
// Look for tool call logs
if (
logData.attributes &&
@@ -1377,6 +1404,10 @@ export class TestRig {
}[] = [];
for (const logData of parsedLogs) {
if (env['VERBOSE'] === 'true' || env['CI'] === 'true') {
if (logData.attributes?.['event.name']?.includes('hook')) {
}
}
// Look for tool call logs
if (
logData.attributes &&