This commit is contained in:
@@ -0,0 +1,48 @@
|
||||
// SPDX-License-Identifier: LicenseRef-ConusAI-Template-1.0
|
||||
//
|
||||
// The format-on-edit hook of a coding agent (`.claude/settings.json`, PostToolUse on Edit and Write): it reads
|
||||
// the hook's JSON from stdin and formats the one file the agent changed with this repository's Biome, so the
|
||||
// gate reports real problems instead of whitespace. It never fails the agent's edit: a file Biome does not
|
||||
// handle, or a missing install, is skipped silently.
|
||||
//
|
||||
// echo '{"tool_input":{"file_path":"modules/notes/core/x.ts"}}' | node scripts/agent-format.mjs
|
||||
|
||||
import { spawnSync } from "node:child_process"
|
||||
import { existsSync } from "node:fs"
|
||||
import { dirname, extname, join, relative, resolve } from "node:path"
|
||||
import { fileURLToPath } from "node:url"
|
||||
|
||||
const ROOT = join(dirname(fileURLToPath(import.meta.url)), "..")
|
||||
const FORMATTED = new Set([".ts", ".tsx", ".mts", ".cts", ".js", ".mjs", ".cjs", ".json", ".jsonc", ".css"])
|
||||
|
||||
/** The repository-relative path the hook names, or null when there is nothing for Biome to format. */
|
||||
export function fileToFormat(input, root = ROOT) {
|
||||
const path = input?.tool_input?.file_path
|
||||
if (typeof path !== "string" || path === "") return null
|
||||
const absolute = resolve(root, path)
|
||||
const rel = relative(root, absolute)
|
||||
if (rel.startsWith("..") || rel.split(/[\\/]/).includes("node_modules")) return null
|
||||
if (!FORMATTED.has(extname(rel)) || !existsSync(absolute)) return null
|
||||
return rel
|
||||
}
|
||||
|
||||
if (process.argv[1] && fileURLToPath(import.meta.url) === process.argv[1]) {
|
||||
let text = ""
|
||||
process.stdin.setEncoding("utf8")
|
||||
process.stdin.on("data", (chunk) => {
|
||||
text += chunk
|
||||
})
|
||||
process.stdin.on("end", () => {
|
||||
let input = null
|
||||
try {
|
||||
input = JSON.parse(text)
|
||||
} catch {
|
||||
process.exit(0)
|
||||
}
|
||||
const file = fileToFormat(input)
|
||||
const biome = join(ROOT, "node_modules", ".bin", "biome")
|
||||
if (file === null || !existsSync(biome)) process.exit(0)
|
||||
spawnSync(biome, ["format", "--write", "--no-errors-on-unmatched", file], { cwd: ROOT, stdio: "ignore" })
|
||||
process.exit(0)
|
||||
})
|
||||
}
|
||||
Reference in New Issue
Block a user