Fix Claude user rule skipping for disabled hooks
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
This commit is contained in:
@@ -0,0 +1,66 @@
|
|||||||
|
import { beforeEach, describe, expect, it, mock } from "bun:test"
|
||||||
|
import type { OhMyOpenCodeConfig } from "../../config"
|
||||||
|
import type { ModelCacheState } from "../../plugin-state"
|
||||||
|
import type { PluginContext } from "../types"
|
||||||
|
|
||||||
|
const mockContext = {
|
||||||
|
directory: "/tmp",
|
||||||
|
} as PluginContext
|
||||||
|
|
||||||
|
const mockModelCacheState = {
|
||||||
|
anthropicContext1MEnabled: false,
|
||||||
|
} satisfies ModelCacheState
|
||||||
|
|
||||||
|
let capturedRulesInjectorOptions: { skipClaudeUserRules?: boolean } | undefined
|
||||||
|
|
||||||
|
mock.module("../../hooks", () => ({
|
||||||
|
createCommentCheckerHooks: () => ({ name: "comment-checker" }),
|
||||||
|
createToolOutputTruncatorHook: () => ({ name: "tool-output-truncator" }),
|
||||||
|
createDirectoryAgentsInjectorHook: () => ({ name: "directory-agents-injector" }),
|
||||||
|
createDirectoryReadmeInjectorHook: () => ({ name: "directory-readme-injector" }),
|
||||||
|
createEmptyTaskResponseDetectorHook: () => ({ name: "empty-task-response-detector" }),
|
||||||
|
createRulesInjectorHook: (
|
||||||
|
_ctx: PluginContext,
|
||||||
|
_modelCacheState: ModelCacheState,
|
||||||
|
options?: { skipClaudeUserRules?: boolean },
|
||||||
|
) => {
|
||||||
|
capturedRulesInjectorOptions = options
|
||||||
|
return { name: "rules-injector" }
|
||||||
|
},
|
||||||
|
createTasksTodowriteDisablerHook: () => ({ name: "tasks-todowrite-disabler" }),
|
||||||
|
createWriteExistingFileGuardHook: () => ({ name: "write-existing-file-guard" }),
|
||||||
|
createBashFileReadGuardHook: () => ({ name: "bash-file-read-guard" }),
|
||||||
|
createHashlineReadEnhancerHook: () => ({ name: "hashline-read-enhancer" }),
|
||||||
|
createReadImageResizerHook: () => ({ name: "read-image-resizer" }),
|
||||||
|
createJsonErrorRecoveryHook: () => ({ name: "json-error-recovery" }),
|
||||||
|
createTodoDescriptionOverrideHook: () => ({ name: "todo-description-override" }),
|
||||||
|
createWebFetchRedirectGuardHook: () => ({ name: "webfetch-redirect-guard" }),
|
||||||
|
}))
|
||||||
|
|
||||||
|
describe("createToolGuardHooks", () => {
|
||||||
|
beforeEach(() => {
|
||||||
|
capturedRulesInjectorOptions = undefined
|
||||||
|
})
|
||||||
|
|
||||||
|
it("skips Claude user rules when claude_code.hooks is false", async () => {
|
||||||
|
// given
|
||||||
|
const pluginConfig = {
|
||||||
|
claude_code: {
|
||||||
|
hooks: false,
|
||||||
|
},
|
||||||
|
} as OhMyOpenCodeConfig
|
||||||
|
const { createToolGuardHooks } = await import("./create-tool-guard-hooks")
|
||||||
|
|
||||||
|
// when
|
||||||
|
createToolGuardHooks({
|
||||||
|
ctx: mockContext,
|
||||||
|
pluginConfig,
|
||||||
|
modelCacheState: mockModelCacheState,
|
||||||
|
isHookEnabled: (hookName) => hookName === "rules-injector",
|
||||||
|
safeHookEnabled: true,
|
||||||
|
})
|
||||||
|
|
||||||
|
// then
|
||||||
|
expect(capturedRulesInjectorOptions).toEqual({ skipClaudeUserRules: true })
|
||||||
|
})
|
||||||
|
})
|
||||||
@@ -92,14 +92,11 @@ export function createToolGuardHooks(args: {
|
|||||||
: null
|
: null
|
||||||
|
|
||||||
const cc = pluginConfig.claude_code
|
const cc = pluginConfig.claude_code
|
||||||
const claudeCodeDisabled = cc != null
|
const skipClaudeUserRules = cc?.hooks === false
|
||||||
&& cc.hooks === false
|
|
||||||
&& cc.skills === false
|
|
||||||
&& cc.agents === false
|
|
||||||
const rulesInjector = isHookEnabled("rules-injector")
|
const rulesInjector = isHookEnabled("rules-injector")
|
||||||
? safeHook("rules-injector", () =>
|
? safeHook("rules-injector", () =>
|
||||||
createRulesInjectorHook(ctx, modelCacheState, {
|
createRulesInjectorHook(ctx, modelCacheState, {
|
||||||
skipClaudeUserRules: claudeCodeDisabled ?? false,
|
skipClaudeUserRules,
|
||||||
}))
|
}))
|
||||||
: null
|
: null
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user