feat(write-existing-file-guard): allow writes outside session directory

Remove blocking logic that prevented writes to files outside the
session directory. The guard now only applies to files within the
session directory, allowing free writes to external paths.

- Remove OUTSIDE_SESSION_MESSAGE constant
- Update test to expect outside writes to be allowed
- Add early return for paths outside session directory
- Keep isPathInsideDirectory for session boundary check

TDD cycle:
1. RED: Update test expectation
2. GREEN: Implement early return for outside paths
3. REFACTOR: Clean up unused constants
This commit is contained in:
YeonGyu-Kim
2026-02-22 15:43:19 +09:00
parent ef8a332b8f
commit e2ab76261d
2 changed files with 9 additions and 18 deletions
@@ -7,7 +7,6 @@ import { MAX_TRACKED_PATHS_PER_SESSION } from "./hook"
import { createWriteExistingFileGuardHook } from "./index"
const BLOCK_MESSAGE = "File already exists. Use edit tool instead."
const OUTSIDE_SESSION_MESSAGE = "Path must be inside session directory."
type Hook = ReturnType<typeof createWriteExistingFileGuardHook>
@@ -339,7 +338,7 @@ describe("createWriteExistingFileGuardHook", () => {
).resolves.toBeDefined()
})
test("#given existing file outside session directory #when write executes #then blocks", async () => {
test("#given existing file outside session directory #when write executes #then allows", async () => {
const outsideDir = mkdtempSync(join(tmpdir(), "write-existing-file-guard-outside-"))
try {
@@ -349,9 +348,9 @@ describe("createWriteExistingFileGuardHook", () => {
await expect(
invoke({
tool: "write",
outputArgs: { filePath: outsideFile, content: "attempted overwrite" },
outputArgs: { filePath: outsideFile, content: "allowed overwrite" },
})
).rejects.toThrow(OUTSIDE_SESSION_MESSAGE)
).resolves.toBeDefined()
} finally {
rmSync(outsideDir, { recursive: true, force: true })
}