fix(hashline-edit): use instanceof for hash mismatch error detection

This commit is contained in:
YeonGyu-Kim 2026-02-24 18:21:05 +09:00
parent 1785313f3b
commit 365d863e3a
2 changed files with 21 additions and 1 deletions

View File

@ -5,6 +5,7 @@ import { countLineDiffs, generateUnifiedDiff } from "./diff-utils"
import { canonicalizeFileText, restoreFileText } from "./file-text-canonicalization"
import { normalizeHashlineEdits, type RawHashlineEdit } from "./normalize-edits"
import type { HashlineEdit } from "./types"
import { HashlineMismatchError } from "./validation"
interface HashlineEditArgs {
filePath: string
@ -158,7 +159,7 @@ export async function executeHashlineEditTool(args: HashlineEditArgs, context: T
return `Updated ${effectivePath}`
} catch (error) {
const message = error instanceof Error ? error.message : String(error)
if (message.toLowerCase().includes("hash")) {
if (error instanceof HashlineMismatchError) {
return `Error: hash mismatch - ${message}\nTip: reuse LINE#ID entries from the latest read/edit output, or batch related edits in one call.`
}
return `Error: ${message}`

View File

@ -103,6 +103,25 @@ describe("createHashlineEditTool", () => {
expect(result).toContain(">>>")
})
it("does not classify invalid pos format as hash mismatch", async () => {
//#given
const filePath = path.join(tempDir, "invalid-format.txt")
fs.writeFileSync(filePath, "line1\nline2")
//#when
const result = await tool.execute(
{
filePath,
edits: [{ op: "replace", pos: "42", lines: "updated" }],
},
createMockContext(),
)
//#then
expect(result).toContain("Error")
expect(result.toLowerCase()).not.toContain("hash mismatch")
})
it("preserves literal backslash-n and supports string[] payload", async () => {
//#given
const filePath = path.join(tempDir, "test.txt")