ccguard
Version:
Automated enforcement of net-negative LOC, complexity constraints, and quality standards for Claude code
137 lines • 5.49 kB
JavaScript
"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