Files
2026-07-13 12:12:33 +08:00

52 lines
1.6 KiB
JavaScript

/* eslint-disable no-console */
// .claude/hooks.mjs
import {execSync} from "child_process";
import path from "path";
// Hook that runs before editing files
export async function preEdit({filePath}) {
// Check if editing TypeScript/JavaScript files
if (filePath.match(/\.(ts|tsx|js|jsx)$/)) {
// Ensure file is properly formatted before edit
try {
execSync(`pnpm prettier --check "${filePath}"`, {stdio: "pipe"});
} catch (e) {
console.log("⚠️ File needs formatting - will format after edit");
}
}
// Prevent editing of certain protected files
const protectedFiles = ["yarn.lock", "package-lock.json", ".env.production", "firebase.json"];
const fileName = path.basename(filePath);
if (protectedFiles.includes(fileName)) {
throw new Error(`❌ Cannot edit protected file: ${fileName}`);
}
return {proceed: true};
}
// Hook that runs after editing files
export async function postEdit({filePath, success}) {
if (!success) return;
// Run linting and auto-fix on TypeScript/JavaScript files
if (filePath.match(/\.(ts|tsx|js|jsx)$/)) {
try {
execSync(`pnpm lint --fix "${filePath}"`, {stdio: "pipe"});
console.log("✅ Lint fixes applied");
} catch (e) {
console.log("⚠️ Lint errors detected - please review");
}
}
// Run type checking on TypeScript files
if (filePath.match(/\.(ts|tsx)$/)) {
try {
execSync(`npx tsc --noEmit --skipLibCheck "${filePath}"`, {stdio: "pipe"});
} catch (e) {
console.log("⚠️ TypeScript errors detected - please review");
}
}
}