feat(write-existing-file-guard): add hook to prevent write tool from overwriting existing files

Adds a PreToolUse hook that intercepts write operations and throws an error
if the target file already exists, guiding users to use the edit tool instead.

- Throws error: 'File already exists. Use edit tool instead.'
- Hook is enabled by default, can be disabled via disabled_hooks
- Includes comprehensive test suite with BDD-style comments
This commit is contained in:
YeonGyu-Kim
2026-02-04 16:05:00 +09:00
parent 8049ceb947
commit ddf878e53c
5 changed files with 246 additions and 0 deletions
+5
View File
@@ -37,6 +37,7 @@ import {
createUnstableAgentBabysitterHook,
createPreemptiveCompactionHook,
createTasksTodowriteDisablerHook,
createWriteExistingFileGuardHook,
} from "./hooks";
import {
contextCollector,
@@ -280,6 +281,9 @@ const OhMyOpenCodePlugin: Plugin = async (ctx) => {
const questionLabelTruncator = createQuestionLabelTruncatorHook();
const subagentQuestionBlocker = createSubagentQuestionBlockerHook();
const writeExistingFileGuard = isHookEnabled("write-existing-file-guard")
? createWriteExistingFileGuardHook(ctx)
: null;
const taskResumeInfo = createTaskResumeInfoHook();
@@ -720,6 +724,7 @@ const OhMyOpenCodePlugin: Plugin = async (ctx) => {
"tool.execute.before": async (input, output) => {
await subagentQuestionBlocker["tool.execute.before"]?.(input, output);
await writeExistingFileGuard?.["tool.execute.before"]?.(input, output);
await questionLabelTruncator["tool.execute.before"]?.(input, output);
await claudeCodeHooks["tool.execute.before"](input, output);
await nonInteractiveEnv?.["tool.execute.before"](input, output);