UNPKG

ccguard

Version:

Automated enforcement of net-negative LOC, complexity constraints, and quality standards for Claude code

137 lines 5.49 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.isWriteOperation = exports.isMultiEditOperation = exports.isEditOperation = exports.LockedFilesSchema = exports.OperationHistorySchema = exports.OperationRecordSchema = exports.HotConfigSchema = exports.GuardConfigSchema = exports.GuardStateSchema = exports.SessionStatsSchema = exports.ToolOperationSchema = exports.WriteOperationSchema = exports.MultiEditOperationSchema = exports.EditOperationSchema = exports.WriteSchema = exports.MultiEditSchema = exports.EditSchema = exports.UserPromptSubmitSchema = exports.HookDataSchema = exports.HookContextSchema = void 0; const zod_1 = require("zod"); // Base schemas 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'); // Tool input schemas 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(), }); // 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, }); // Discriminated union for tool operations exports.ToolOperationSchema = zod_1.z.discriminatedUnion('tool_name', [ exports.EditOperationSchema, exports.MultiEditOperationSchema, exports.WriteOperationSchema, ]); // Session stats schema exports.SessionStatsSchema = zod_1.z.object({ totalLinesAdded: zod_1.z.number(), totalLinesRemoved: zod_1.z.number(), netChange: zod_1.z.number(), operationCount: zod_1.z.number(), lastUpdated: zod_1.z.string(), }); // Guard state schema exports.GuardStateSchema = zod_1.z.object({ enabled: zod_1.z.boolean(), lastUpdated: zod_1.z.string(), }); // Config schema exports.GuardConfigSchema = zod_1.z.object({ enforcement: zod_1.z.object({ mode: zod_1.z.enum(['session-wide', 'per-operation']).default('session-wide'), strategy: zod_1.z.enum(['cumulative', 'snapshot']).default('cumulative'), ignoreEmptyLines: zod_1.z.boolean().default(true), limitType: zod_1.z.enum(['hard', 'soft']).optional().default('hard'), // Default to hard limit for backward compatibility }).default({ mode: 'session-wide', strategy: 'cumulative', ignoreEmptyLines: true, }), whitelist: zod_1.z.object({ patterns: zod_1.z.array(zod_1.z.string()).default([]), extensions: zod_1.z.array(zod_1.z.string()).default([]), }).default({ patterns: [], extensions: [], }), thresholds: zod_1.z.object({ allowedPositiveLines: zod_1.z.number().default(0), }).optional(), }); // Hot config schema exports.HotConfigSchema = zod_1.z.object({ enforcement: zod_1.z.object({ mode: zod_1.z.enum(['session-wide', 'per-operation']).optional(), strategy: zod_1.z.enum(['cumulative', 'snapshot']).optional(), limitType: zod_1.z.enum(['hard', 'soft']).optional(), }).optional(), thresholds: zod_1.z.object({ allowedPositiveLines: zod_1.z.number().optional(), }).optional(), lastUpdated: zod_1.z.string(), sessionId: zod_1.z.string().optional(), }); // Operation record schema exports.OperationRecordSchema = zod_1.z.object({ timestamp: zod_1.z.string(), toolName: zod_1.z.enum(['Edit', 'MultiEdit', 'Write']), filePath: zod_1.z.string(), linesAdded: zod_1.z.number(), linesRemoved: zod_1.z.number(), netChange: zod_1.z.number(), decision: zod_1.z.enum(['approve', 'block']), reason: zod_1.z.string().optional(), }); // Operation history schema exports.OperationHistorySchema = zod_1.z.object({ records: zod_1.z.array(exports.OperationRecordSchema), maxRecords: zod_1.z.number(), lastUpdated: zod_1.z.string(), }); // Locked files schema exports.LockedFilesSchema = zod_1.z.object({ files: zod_1.z.array(zod_1.z.string()), lastUpdated: zod_1.z.string(), }); // 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; //# sourceMappingURL=schemas.js.map