tdd-guard
Version:
TDD Guard enforces Test-Driven Development principles using Claude Code hooks
96 lines (95 loc) • 4.05 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.isFileModification = exports.isTodoWriteOperation = exports.isWriteOperation = exports.isMultiEditOperation = exports.isEditOperation = exports.FileModificationSchema = exports.ToolOperationSchema = exports.TodoWriteOperationSchema = exports.WriteOperationSchema = exports.MultiEditOperationSchema = exports.EditOperationSchema = exports.TodoWriteSchema = exports.WriteSchema = exports.MultiEditSchema = exports.EditSchema = exports.TodoSchema = exports.SessionStartSchema = exports.UserPromptSubmitSchema = exports.HookDataSchema = exports.HookContextSchema = void 0;
const zod_1 = require("zod");
// Base Hook Context
exports.HookContextSchema = zod_1.z.object({
session_id: zod_1.z.string(),
transcript_path: zod_1.z.string(),
hook_event_name: zod_1.z.string(),
});
exports.HookDataSchema = exports.HookContextSchema.extend({
tool_name: zod_1.z.string(),
tool_input: zod_1.z.unknown(),
});
// UserPromptSubmit Schema
exports.UserPromptSubmitSchema = exports.HookContextSchema.extend({
prompt: zod_1.z.string(),
cwd: zod_1.z.string(),
}).refine((data) => data.hook_event_name === 'UserPromptSubmit');
// SessionStart Schema
exports.SessionStartSchema = exports.HookContextSchema.extend({
hook_event_name: zod_1.z.literal('SessionStart'),
source: zod_1.z.enum(['startup', 'resume', 'clear']),
});
// Tool Input Schemas
exports.TodoSchema = zod_1.z.object({
content: zod_1.z.string(),
status: zod_1.z.enum(['pending', 'in_progress', 'completed']),
priority: zod_1.z.enum(['high', 'medium', 'low']),
id: zod_1.z.string(),
});
exports.EditSchema = zod_1.z.object({
file_path: zod_1.z.string(),
old_string: zod_1.z.string(),
new_string: zod_1.z.string(),
replace_all: zod_1.z.boolean().optional(),
});
const EditEntrySchema = zod_1.z.object({
old_string: zod_1.z.string(),
new_string: zod_1.z.string(),
replace_all: zod_1.z.boolean().optional(),
});
exports.MultiEditSchema = zod_1.z.object({
file_path: zod_1.z.string(),
edits: zod_1.z.array(EditEntrySchema).min(1),
});
exports.WriteSchema = zod_1.z.object({
file_path: zod_1.z.string(),
content: zod_1.z.string(),
});
exports.TodoWriteSchema = zod_1.z.object({
todos: zod_1.z.array(exports.TodoSchema).min(1),
});
// Tool Operation Schemas
exports.EditOperationSchema = exports.HookContextSchema.extend({
tool_name: zod_1.z.literal('Edit'),
tool_input: exports.EditSchema,
});
exports.MultiEditOperationSchema = exports.HookContextSchema.extend({
tool_name: zod_1.z.literal('MultiEdit'),
tool_input: exports.MultiEditSchema,
});
exports.WriteOperationSchema = exports.HookContextSchema.extend({
tool_name: zod_1.z.literal('Write'),
tool_input: exports.WriteSchema,
});
exports.TodoWriteOperationSchema = exports.HookContextSchema.extend({
tool_name: zod_1.z.literal('TodoWrite'),
tool_input: exports.TodoWriteSchema,
});
// Discriminated Unions
exports.ToolOperationSchema = zod_1.z.discriminatedUnion('tool_name', [
exports.EditOperationSchema,
exports.MultiEditOperationSchema,
exports.WriteOperationSchema,
exports.TodoWriteOperationSchema,
]);
exports.FileModificationSchema = zod_1.z.discriminatedUnion('tool_name', [
exports.EditOperationSchema,
exports.MultiEditOperationSchema,
exports.WriteOperationSchema,
]);
// Type Guards
const isEditOperation = (op) => op.tool_name === 'Edit';
exports.isEditOperation = isEditOperation;
const isMultiEditOperation = (op) => op.tool_name === 'MultiEdit';
exports.isMultiEditOperation = isMultiEditOperation;
const isWriteOperation = (op) => op.tool_name === 'Write';
exports.isWriteOperation = isWriteOperation;
const isTodoWriteOperation = (op) => op.tool_name === 'TodoWrite';
exports.isTodoWriteOperation = isTodoWriteOperation;
const isFileModification = (op) => op.tool_name === 'Edit' ||
op.tool_name === 'MultiEdit' ||
op.tool_name === 'Write';
exports.isFileModification = isFileModification;