@gallop.software/canon 1.0.0 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,7 @@
1
+ interface AuditOptions {
2
+ strict: boolean;
3
+ json: boolean;
4
+ fix: boolean;
5
+ }
6
+ export declare function audit(path: string, options: AuditOptions): Promise<void>;
7
+ export {};
@@ -0,0 +1,172 @@
1
+ import { spawn } from 'child_process';
2
+ import { version, patterns, getPattern } from '../../index.js';
3
+ // Colors for terminal output
4
+ const c = {
5
+ reset: '\x1b[0m',
6
+ bold: '\x1b[1m',
7
+ dim: '\x1b[2m',
8
+ red: '\x1b[31m',
9
+ green: '\x1b[32m',
10
+ yellow: '\x1b[33m',
11
+ blue: '\x1b[34m',
12
+ cyan: '\x1b[36m',
13
+ };
14
+ // Build rule-to-pattern mapping from Canon schema (single source of truth)
15
+ const ruleToPattern = {};
16
+ for (const pattern of patterns) {
17
+ if (pattern.rule) {
18
+ ruleToPattern[pattern.rule] = pattern.id;
19
+ }
20
+ }
21
+ function parseCanonFromMessage(message) {
22
+ const match = message.match(/\[Canon (\d{3})\]/);
23
+ return match ? match[1] : null;
24
+ }
25
+ function extractViolations(eslintOutput) {
26
+ const violations = [];
27
+ const lines = eslintOutput.split('\n');
28
+ let currentFile = '';
29
+ for (const line of lines) {
30
+ // File path line (starts with /)
31
+ if (line.startsWith('/') && !line.includes(':')) {
32
+ currentFile = line.trim();
33
+ continue;
34
+ }
35
+ // Violation line (starts with spaces, has line:col pattern)
36
+ const match = line.match(/^\s+(\d+):(\d+)\s+(warning|error)\s+(.+?)\s{2,}([\w/-]+)$/);
37
+ if (match && currentFile) {
38
+ const [, lineNum, column, , message, ruleId] = match;
39
+ const canonPattern = ruleToPattern[ruleId] || parseCanonFromMessage(message);
40
+ const pattern = canonPattern ? getPattern(canonPattern) : null;
41
+ violations.push({
42
+ file: currentFile,
43
+ line: parseInt(lineNum, 10),
44
+ column: parseInt(column, 10),
45
+ message: message.trim(),
46
+ ruleId,
47
+ canonPattern,
48
+ patternTitle: pattern?.title || null,
49
+ });
50
+ }
51
+ }
52
+ return violations;
53
+ }
54
+ function countByPattern(violations) {
55
+ const counts = {};
56
+ for (const v of violations) {
57
+ const key = v.canonPattern || 'other';
58
+ counts[key] = (counts[key] || 0) + 1;
59
+ }
60
+ return counts;
61
+ }
62
+ function groupByFile(violations) {
63
+ const groups = new Map();
64
+ for (const v of violations) {
65
+ const existing = groups.get(v.file) || [];
66
+ existing.push(v);
67
+ groups.set(v.file, existing);
68
+ }
69
+ return groups;
70
+ }
71
+ function printReport(result, options) {
72
+ if (options.json) {
73
+ console.log(JSON.stringify(result, null, 2));
74
+ return;
75
+ }
76
+ // Header
77
+ console.log('');
78
+ console.log(`${c.bold}╔════════════════════════════════════════════════════════════╗${c.reset}`);
79
+ console.log(`${c.bold}║${c.reset} ${c.cyan}Gallop Canon${c.reset} ${c.dim}v${result.version}${c.reset} ${c.bold}Compliance Report${c.reset} ${c.bold}║${c.reset}`);
80
+ console.log(`${c.bold}╚════════════════════════════════════════════════════════════╝${c.reset}`);
81
+ console.log('');
82
+ if (result.violations.length === 0) {
83
+ console.log(` ${c.green}✓${c.reset} ${c.bold}All files pass Canon compliance checks${c.reset}`);
84
+ console.log(` ${c.dim}Path: ${result.path}${c.reset}`);
85
+ console.log('');
86
+ return;
87
+ }
88
+ // Summary
89
+ const filesWithViolations = new Set(result.violations.map(v => v.file)).size;
90
+ console.log(` ${c.red}✗${c.reset} ${c.bold}${result.violations.length} violation${result.violations.length === 1 ? '' : 's'}${c.reset} in ${filesWithViolations} file${filesWithViolations === 1 ? '' : 's'}`);
91
+ console.log(` ${c.dim}Path: ${result.path}${c.reset}`);
92
+ console.log('');
93
+ // Violations by pattern
94
+ console.log(`${c.bold} Violations by Pattern:${c.reset}`);
95
+ for (const [patternId, count] of Object.entries(result.summary.byPattern).sort()) {
96
+ const pattern = getPattern(patternId);
97
+ const title = pattern?.title || 'Other';
98
+ console.log(` ${c.yellow}${patternId}${c.reset} ${title}: ${c.bold}${count}${c.reset}`);
99
+ }
100
+ console.log('');
101
+ // Detailed violations by file
102
+ console.log(`${c.bold} Details:${c.reset}`);
103
+ console.log('');
104
+ const byFile = groupByFile(result.violations);
105
+ for (const [file, violations] of byFile) {
106
+ // Shorten file path for display
107
+ const shortPath = file.replace(process.cwd() + '/', '');
108
+ console.log(` ${c.cyan}${shortPath}${c.reset}`);
109
+ for (const v of violations) {
110
+ const patternLabel = v.canonPattern
111
+ ? `${c.yellow}[${v.canonPattern}]${c.reset}`
112
+ : `${c.dim}[---]${c.reset}`;
113
+ const location = `${c.dim}${v.line}:${v.column}${c.reset}`;
114
+ // Clean up message (remove [Canon XXX] prefix since we show it separately)
115
+ const cleanMessage = v.message.replace(/\[Canon \d{3}\]\s*/, '');
116
+ console.log(` ${location} ${patternLabel} ${cleanMessage}`);
117
+ }
118
+ console.log('');
119
+ }
120
+ // Footer
121
+ console.log(`${c.dim} ─────────────────────────────────────────────────────────${c.reset}`);
122
+ console.log(` ${c.dim}Fix violations manually following the Canon patterns${c.reset}`);
123
+ console.log('');
124
+ }
125
+ export async function audit(path, options) {
126
+ return new Promise((resolve, reject) => {
127
+ const args = [
128
+ 'eslint',
129
+ path,
130
+ '--format', 'stylish',
131
+ ];
132
+ if (options.fix) {
133
+ args.push('--fix');
134
+ }
135
+ const eslint = spawn('npx', args, {
136
+ cwd: process.cwd(),
137
+ stdio: ['inherit', 'pipe', 'pipe'],
138
+ shell: true,
139
+ });
140
+ let stdout = '';
141
+ let stderr = '';
142
+ eslint.stdout?.on('data', (data) => {
143
+ stdout += data.toString();
144
+ });
145
+ eslint.stderr?.on('data', (data) => {
146
+ stderr += data.toString();
147
+ });
148
+ eslint.on('close', (code) => {
149
+ const violations = extractViolations(stdout);
150
+ const result = {
151
+ version,
152
+ timestamp: new Date().toISOString(),
153
+ path,
154
+ totalFiles: 0, // ESLint stylish format doesn't give us this easily
155
+ violations,
156
+ summary: {
157
+ total: violations.length,
158
+ byPattern: countByPattern(violations),
159
+ },
160
+ };
161
+ printReport(result, options);
162
+ if (options.strict && violations.length > 0) {
163
+ process.exit(1);
164
+ }
165
+ resolve();
166
+ });
167
+ eslint.on('error', (error) => {
168
+ reject(error);
169
+ });
170
+ });
171
+ }
172
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXVkaXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY2xpL2NvbW1hbmRzL2F1ZGl0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFDckMsT0FBTyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUE4QjlELDZCQUE2QjtBQUM3QixNQUFNLENBQUMsR0FBRztJQUNSLEtBQUssRUFBRSxTQUFTO0lBQ2hCLElBQUksRUFBRSxTQUFTO0lBQ2YsR0FBRyxFQUFFLFNBQVM7SUFDZCxHQUFHLEVBQUUsVUFBVTtJQUNmLEtBQUssRUFBRSxVQUFVO0lBQ2pCLE1BQU0sRUFBRSxVQUFVO0lBQ2xCLElBQUksRUFBRSxVQUFVO0lBQ2hCLElBQUksRUFBRSxVQUFVO0NBQ2pCLENBQUE7QUFFRCwyRUFBMkU7QUFDM0UsTUFBTSxhQUFhLEdBQTJCLEVBQUUsQ0FBQTtBQUNoRCxLQUFLLE1BQU0sT0FBTyxJQUFJLFFBQVEsRUFBRSxDQUFDO0lBQy9CLElBQUksT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2pCLGFBQWEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsT0FBTyxDQUFDLEVBQUUsQ0FBQTtJQUMxQyxDQUFDO0FBQ0gsQ0FBQztBQUVELFNBQVMscUJBQXFCLENBQUMsT0FBZTtJQUM1QyxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLG1CQUFtQixDQUFDLENBQUE7SUFDaEQsT0FBTyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFBO0FBQ2hDLENBQUM7QUFFRCxTQUFTLGlCQUFpQixDQUFDLFlBQW9CO0lBQzdDLE1BQU0sVUFBVSxHQUFnQixFQUFFLENBQUE7SUFDbEMsTUFBTSxLQUFLLEdBQUcsWUFBWSxDQUFDLEtB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LENBQUMsQ0FBQyxDQUFBO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHNwYXduIH0gZnJvbSAnY2hpbGRfcHJvY2VzcydcbmltcG9ydCB7IHZlcnNpb24sIHBhdHRlcm5zLCBnZXRQYXR0ZXJuIH0gZnJvbSAnLi4vLi4vaW5kZXguanMnXG5cbmludGVyZmFjZSBBdWRpdE9wdGlvbnMge1xuICBzdHJpY3Q6IGJvb2xlYW5cbiAganNvbjogYm9vbGVhblxuICBmaXg6IGJvb2xlYW5cbn1cblxuaW50ZXJmYWNlIFZpb2xhdGlvbiB7XG4gIGZpbGU6IHN0cmluZ1xuICBsaW5lOiBudW1iZXJcbiAgY29sdW1uOiBudW1iZXJcbiAgbWVzc2FnZTogc3RyaW5nXG4gIHJ1bGVJZDogc3RyaW5nXG4gIGNhbm9uUGF0dGVybjogc3RyaW5nIHwgbnVsbFxuICBwYXR0ZXJuVGl0bGU6IHN0cmluZyB8IG51bGxcbn1cblxuaW50ZXJmYWNlIEF1ZGl0UmVzdWx0IHtcbiAgdmVyc2lvbjogc3RyaW5nXG4gIHRpbWVzdGFtcDogc3RyaW5nXG4gIHBhdGg6IHN0cmluZ1xuICB0b3RhbEZpbGVzOiBudW1iZXJcbiAgdmlvbGF0aW9uczogVmlvbGF0aW9uW11cbiAgc3VtbWFyeToge1xuICAgIHRvdGFsOiBudW1iZXJcbiAgICBieVBhdHRlcm46IFJlY29yZDxzdHJpbmcsIG51bWJlcj5cbiAgfVxufVxuXG4vLyBDb2xvcnMgZm9yIHRlcm1pbmFsIG91dHB1dFxuY29uc3QgYyA9IHtcbiAgcmVzZXQ6ICdcXHgxYlswbScsXG4gIGJvbGQ6ICdcXHgxYlsxbScsXG4gIGRpbTogJ1xceDFiWzJtJyxcbiAgcmVkOiAnXFx4MWJbMzFtJyxcbiAgZ3JlZW46ICdcXHgxYlszMm0nLFxuICB5ZWxsb3c6ICdcXHgxYlszM20nLFxuICBibHVlOiAnXFx4MWJbMzRtJyxcbiAgY3lhbjogJ1xceDFiWzM2bScsXG59XG5cbi8vIEJ1aWxkIHJ1bGUtdG8tcGF0dGVybiBtYXBwaW5nIGZyb20gQ2Fub24gc2NoZW1hIChzaW5nbGUgc291cmNlIG9mIHRydXRoKVxuY29uc3QgcnVsZVRvUGF0dGVybjogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9XG5mb3IgKGNvbnN0IHBhdHRlcm4gb2YgcGF0dGVybnMpIHtcbiAgaWYgKHBhdHRlcm4ucnVsZSkge1xuICAgIHJ1bGVUb1BhdHRlcm5bcGF0dGVybi5ydWxlXSA9IHBhdHRlcm4uaWRcbiAgfVxufVxuXG5mdW5jdGlvbiBwYXJzZUNhbm9uRnJvbU1lc3NhZ2UobWVzc2FnZTogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IG1hdGNoID0gbWVzc2FnZS5tYXRjaCgvXFxbQ2Fub24gKFxcZHszfSlcXF0vKVxuICByZXR1cm4gbWF0Y2ggPyBtYXRjaFsxXSA6IG51bGxcbn1cblxuZnVuY3Rpb24gZXh0cmFjdFZpb2xhdGlvbnMoZXNsaW50T3V0cHV0OiBzdHJpbmcpOiBWaW9sYXRpb25bXSB7XG4gIGNvbnN0IHZpb2xhdGlvbnM6IFZpb2xhdGlvbltdID0gW11cbiAgY29uc3QgbGluZXMgPSBlc2xpbnRPdXRwdXQuc3BsaXQoJ1xcbicpXG4gIFxuICBsZXQgY3VycmVudEZpbGUgPSAnJ1xuICBcbiAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7XG4gICAgLy8gRmlsZSBwYXRoIGxpbmUgKHN0YXJ0cyB3aXRoIC8pXG4gICAgaWYgKGxpbmUuc3RhcnRzV2l0aCgnLycpICYmICFsaW5lLmluY2x1ZGVzKCc6JykpIHtcbiAgICAgIGN1cnJlbnRGaWxlID0gbGluZS50cmltKClcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgIFxuICAgIC8vIFZpb2xhdGlvbiBsaW5lIChzdGFydHMgd2l0aCBzcGFjZXMsIGhhcyBsaW5lOmNvbCBwYXR0ZXJuKVxuICAgIGNvbnN0IG1hdGNoID0gbGluZS5tYXRjaCgvXlxccysoXFxkKyk6KFxcZCspXFxzKyh3YXJuaW5nfGVycm9yKVxccysoLis/KVxcc3syLH0oW1xcdy8tXSspJC8pXG4gICAgaWYgKG1hdGNoICYmIGN1cnJlbnRGaWxlKSB7XG4gICAgICBjb25zdCBbLCBsaW5lTnVtLCBjb2x1bW4sICwgbWVzc2FnZSwgcnVsZUlkXSA9IG1hdGNoXG4gICAgICBjb25zdCBjYW5vblBhdHRlcm4gPSBydWxlVG9QYXR0ZXJuW3J1bGVJZF0gfHwgcGFyc2VDYW5vbkZyb21NZXNzYWdlKG1lc3NhZ2UpXG4gICAgICBjb25zdCBwYXR0ZXJuID0gY2Fub25QYXR0ZXJuID8gZ2V0UGF0dGVybihjYW5vblBhdHRlcm4pIDogbnVsbFxuICAgICAgXG4gICAgICB2aW9sYXRpb25zLnB1c2goe1xuICAgICAgICBmaWxlOiBjdXJyZW50RmlsZSxcbiAgICAgICAgbGluZTogcGFyc2VJbnQobGluZU51bSwgMTApLFxuICAgICAgICBjb2x1bW46IHBhcnNlSW50KGNvbHVtbiwgMTApLFxuICAgICAgICBtZXNzYWdlOiBtZXNzYWdlLnRyaW0oKSxcbiAgICAgICAgcnVsZUlkLFxuICAgICAgICBjYW5vblBhdHRlcm4sXG4gICAgICAgIHBhdHRlcm5UaXRsZTogcGF0dGVybj8udGl0bGUgfHwgbnVsbCxcbiAgICAgIH0pXG4gICAgfVxuICB9XG4gIFxuICByZXR1cm4gdmlvbGF0aW9uc1xufVxuXG5mdW5jdGlvbiBjb3VudEJ5UGF0dGVybih2aW9sYXRpb25zOiBWaW9sYXRpb25bXSk6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4ge1xuICBjb25zdCBjb3VudHM6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gPSB7fVxuICBmb3IgKGNvbnN0IHYgb2YgdmlvbGF0aW9ucykge1xuICAgIGNvbnN0IGtleSA9IHYuY2Fub25QYXR0ZXJuIHx8ICdvdGhlcidcbiAgICBjb3VudHNba2V5XSA9IChjb3VudHNba2V5XSB8fCAwKSArIDFcbiAgfVxuICByZXR1cm4gY291bnRzXG59XG5cbmZ1bmN0aW9uIGdyb3VwQnlGaWxlKHZpb2xhdGlvbnM6IFZpb2xhdGlvbltdKTogTWFwPHN0cmluZywgVmlvbGF0aW9uW10+IHtcbiAgY29uc3QgZ3JvdXBzID0gbmV3IE1hcDxzdHJpbmcsIFZpb2xhdGlvbltdPigpXG4gIGZvciAoY29uc3QgdiBvZiB2aW9sYXRpb25zKSB7XG4gICAgY29uc3QgZXhpc3RpbmcgPSBncm91cHMuZ2V0KHYuZmlsZSkgfHwgW11cbiAgICBleGlzdGluZy5wdXNoKHYpXG4gICAgZ3JvdXBzLnNldCh2LmZpbGUsIGV4aXN0aW5nKVxuICB9XG4gIHJldHVybiBncm91cHNcbn1cblxuZnVuY3Rpb24gcHJpbnRSZXBvcnQocmVzdWx0OiBBdWRpdFJlc3VsdCwgb3B0aW9uczogQXVkaXRPcHRpb25zKSB7XG4gIGlmIChvcHRpb25zLmpzb24pIHtcbiAgICBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeShyZXN1bHQsIG51bGwsIDIpKVxuICAgIHJldHVyblxuICB9XG5cbiAgLy8gSGVhZGVyXG4gIGNvbnNvbGUubG9nKCcnKVxuICBjb25zb2xlLmxvZyhgJHtjLmJvbGR94pWU4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWXJHtjLnJlc2V0fWApXG4gIGNvbnNvbGUubG9nKGAke2MuYm9sZH3ilZEke2MucmVzZXR9ICAgICAgICAgICAke2MuY3lhbn1HYWxsb3AgQ2Fub24ke2MucmVzZXR9ICR7Yy5kaW19diR7cmVzdWx0LnZlcnNpb259JHtjLnJlc2V0fSAke2MuYm9sZH1Db21wbGlhbmNlIFJlcG9ydCR7Yy5yZXNldH0gICAgICAgICAgICR7Yy5ib2xkfeKVkSR7Yy5yZXNldH1gKVxuICBjb25zb2xlLmxvZyhgJHtjLmJvbGR94pWa4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWdJHtjLnJlc2V0fWApXG4gIGNvbnNvbGUubG9nKCcnKVxuXG4gIGlmIChyZXN1bHQudmlvbGF0aW9ucy5sZW5ndGggPT09IDApIHtcbiAgICBjb25zb2xlLmxvZyhgICAke2MuZ3JlZW594pyTJHtjLnJlc2V0fSAke2MuYm9sZH1BbGwgZmlsZXMgcGFzcyBDYW5vbiBjb21wbGlhbmNlIGNoZWNrcyR7Yy5yZXNldH1gKVxuICAgIGNvbnNvbGUubG9nKGAgICR7Yy5kaW19UGF0aDogJHtyZXN1bHQucGF0aH0ke2MucmVzZXR9YClcbiAgICBjb25zb2xlLmxvZygnJylcbiAgICByZXR1cm5cbiAgfVxuXG4gIC8vIFN1bW1hcnlcbiAgY29uc3QgZmlsZXNXaXRoVmlvbGF0aW9ucyA9IG5ldyBTZXQocmVzdWx0LnZpb2xhdGlvbnMubWFwKHYgPT4gdi5maWxlKSkuc2l6ZVxuICBjb25zb2xlLmxvZyhgICAke2MucmVkfeKclyR7Yy5yZXNldH0gJHtjLmJvbGR9JHtyZXN1bHQudmlvbGF0aW9ucy5sZW5ndGh9IHZpb2xhdGlvbiR7cmVzdWx0LnZpb2xhdGlvbnMubGVuZ3RoID09PSAxID8gJycgOiAncyd9JHtjLnJlc2V0fSBpbiAke2ZpbGVzV2l0aFZpb2xhdGlvbnN9IGZpbGUke2ZpbGVzV2l0aFZpb2xhdGlvbnMgPT09IDEgPyAnJyA6ICdzJ31gKVxuICBjb25zb2xlLmxvZyhgICAke2MuZGltfVBhdGg6ICR7cmVzdWx0LnBhdGh9JHtjLnJlc2V0fWApXG4gIGNvbnNvbGUubG9nKCcnKVxuXG4gIC8vIFZpb2xhdGlvbnMgYnkgcGF0dGVyblxuICBjb25zb2xlLmxvZyhgJHtjLmJvbGR9ICBWaW9sYXRpb25zIGJ5IFBhdHRlcm46JHtjLnJlc2V0fWApXG4gIGZvciAoY29uc3QgW3BhdHRlcm5JZCwgY291bnRdIG9mIE9iamVjdC5lbnRyaWVzKHJlc3VsdC5zdW1tYXJ5LmJ5UGF0dGVybikuc29ydCgpKSB7XG4gICAgY29uc3QgcGF0dGVybiA9IGdldFBhdHRlcm4ocGF0dGVybklkKVxuICAgIGNvbnN0IHRpdGxlID0gcGF0dGVybj8udGl0bGUgfHwgJ090aGVyJ1xuICAgIGNvbnNvbGUubG9nKGAgICAgJHtjLnllbGxvd30ke3BhdHRlcm5JZH0ke2MucmVzZXR9ICR7dGl0bGV9OiAke2MuYm9sZH0ke2NvdW50fSR7Yy5yZXNldH1gKVxuICB9XG4gIGNvbnNvbGUubG9nKCcnKVxuXG4gIC8vIERldGFpbGVkIHZpb2xhdGlvbnMgYnkgZmlsZVxuICBjb25zb2xlLmxvZyhgJHtjLmJvbGR9ICBEZXRhaWxzOiR7Yy5yZXNldH1gKVxuICBjb25zb2xlLmxvZygnJylcblxuICBjb25zdCBieUZpbGUgPSBncm91cEJ5RmlsZShyZXN1bHQudmlvbGF0aW9ucylcbiAgZm9yIChjb25zdCBbZmlsZSwgdmlvbGF0aW9uc10gb2YgYnlGaWxlKSB7XG4gICAgLy8gU2hvcnRlbiBmaWxlIHBhdGggZm9yIGRpc3BsYXlcbiAgICBjb25zdCBzaG9ydFBhdGggPSBmaWxlLnJlcGxhY2UocHJvY2Vzcy5jd2QoKSArICcvJywgJycpXG4gICAgY29uc29sZS5sb2coYCAgJHtjLmN5YW59JHtzaG9ydFBhdGh9JHtjLnJlc2V0fWApXG4gICAgXG4gICAgZm9yIChjb25zdCB2IG9mIHZpb2xhdGlvbnMpIHtcbiAgICAgIGNvbnN0IHBhdHRlcm5MYWJlbCA9IHYuY2Fub25QYXR0ZXJuIFxuICAgICAgICA/IGAke2MueWVsbG93fVske3YuY2Fub25QYXR0ZXJufV0ke2MucmVzZXR9YCBcbiAgICAgICAgOiBgJHtjLmRpbX1bLS0tXSR7Yy5yZXNldH1gXG4gICAgICBjb25zdCBsb2NhdGlvbiA9IGAke2MuZGltfSR7di5saW5lfToke3YuY29sdW1ufSR7Yy5yZXNldH1gXG4gICAgICBcbiAgICAgIC8vIENsZWFuIHVwIG1lc3NhZ2UgKHJlbW92ZSBbQ2Fub24gWFhYXSBwcmVmaXggc2luY2Ugd2Ugc2hvdyBpdCBzZXBhcmF0ZWx5KVxuICAgICAgY29uc3QgY2xlYW5NZXNzYWdlID0gdi5tZXNzYWdlLnJlcGxhY2UoL1xcW0Nhbm9uIFxcZHszfVxcXVxccyovLCAnJylcbiAgICAgIFxuICAgICAgY29uc29sZS5sb2coYCAgICAke2xvY2F0aW9ufSAke3BhdHRlcm5MYWJlbH0gJHtjbGVhbk1lc3NhZ2V9YClcbiAgICB9XG4gICAgY29uc29sZS5sb2coJycpXG4gIH1cblxuICAvLyBGb290ZXJcbiAgY29uc29sZS5sb2coYCR7Yy5kaW19ICDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAke2MucmVzZXR9YClcbiAgY29uc29sZS5sb2coYCAgJHtjLmRpbX1GaXggdmlvbGF0aW9ucyBtYW51YWxseSBmb2xsb3dpbmcgdGhlIENhbm9uIHBhdHRlcm5zJHtjLnJlc2V0fWApXG4gIGNvbnNvbGUubG9nKCcnKVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYXVkaXQocGF0aDogc3RyaW5nLCBvcHRpb25zOiBBdWRpdE9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjb25zdCBhcmdzID0gW1xuICAgICAgJ2VzbGludCcsXG4gICAgICBwYXRoLFxuICAgICAgJy0tZm9ybWF0JywgJ3N0eWxpc2gnLFxuICAgIF1cblxuICAgIGlmIChvcHRpb25zLmZpeCkge1xuICAgICAgYXJncy5wdXNoKCctLWZpeCcpXG4gICAgfVxuXG4gICAgY29uc3QgZXNsaW50ID0gc3Bhd24oJ25weCcsIGFyZ3MsIHtcbiAgICAgIGN3ZDogcHJvY2Vzcy5jd2QoKSxcbiAgICAgIHN0ZGlvOiBbJ2luaGVyaXQnLCAncGlwZScsICdwaXBlJ10sXG4gICAgICBzaGVsbDogdHJ1ZSxcbiAgICB9KVxuXG4gICAgbGV0IHN0ZG91dCA9ICcnXG4gICAgbGV0IHN0ZGVyciA9ICcnXG5cbiAgICBlc2xpbnQuc3Rkb3V0Py5vbignZGF0YScsIChkYXRhKSA9PiB7XG4gICAgICBzdGRvdXQgKz0gZGF0YS50b1N0cmluZygpXG4gICAgfSlcblxuICAgIGVzbGludC5zdGRlcnI/Lm9uKCdkYXRhJywgKGRhdGEpID0+IHtcbiAgICAgIHN0ZGVyciArPSBkYXRhLnRvU3RyaW5nKClcbiAgICB9KVxuXG4gICAgZXNsaW50Lm9uKCdjbG9zZScsIChjb2RlKSA9PiB7XG4gICAgICBjb25zdCB2aW9sYXRpb25zID0gZXh0cmFjdFZpb2xhdGlvbnMoc3Rkb3V0KVxuICAgICAgXG4gICAgICBjb25zdCByZXN1bHQ6IEF1ZGl0UmVzdWx0ID0ge1xuICAgICAgICB2ZXJzaW9uLFxuICAgICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgcGF0aCxcbiAgICAgICAgdG90YWxGaWxlczogMCwgLy8gRVNMaW50IHN0eWxpc2ggZm9ybWF0IGRvZXNuJ3QgZ2l2ZSB1cyB0aGlzIGVhc2lseVxuICAgICAgICB2aW9sYXRpb25zLFxuICAgICAgICBzdW1tYXJ5OiB7XG4gICAgICAgICAgdG90YWw6IHZpb2xhdGlvbnMubGVuZ3RoLFxuICAgICAgICAgIGJ5UGF0dGVybjogY291bnRCeVBhdHRlcm4odmlvbGF0aW9ucyksXG4gICAgICAgIH0sXG4gICAgICB9XG5cbiAgICAgIHByaW50UmVwb3J0KHJlc3VsdCwgb3B0aW9ucylcblxuICAgICAgaWYgKG9wdGlvbnMuc3RyaWN0ICYmIHZpb2xhdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICBwcm9jZXNzLmV4aXQoMSlcbiAgICAgIH1cblxuICAgICAgcmVzb2x2ZSgpXG4gICAgfSlcblxuICAgIGVzbGludC5vbignZXJyb3InLCAoZXJyb3IpID0+IHtcbiAgICAgIHJlamVjdChlcnJvcilcbiAgICB9KVxuICB9KVxufVxuIl19
@@ -0,0 +1,6 @@
1
+ interface GenerateOptions {
2
+ output: string;
3
+ format: 'cursorrules' | 'markdown';
4
+ }
5
+ export declare function generate(options: GenerateOptions): Promise<void>;
6
+ export {};
@@ -0,0 +1,170 @@
1
+ import * as fs from 'fs';
2
+ import * as path from 'path';
3
+ import { version, patterns, guarantees } from '../../index.js';
4
+ /**
5
+ * Read a pattern markdown file and extract sections
6
+ */
7
+ function readPatternFile(patternFile) {
8
+ // Try to find the canon package patterns directory
9
+ const possiblePaths = [
10
+ path.join(process.cwd(), 'node_modules/@gallop.software/canon', patternFile),
11
+ // Fallback for development
12
+ path.join(import.meta.dirname, '../../../', patternFile),
13
+ ];
14
+ for (const filePath of possiblePaths) {
15
+ if (fs.existsSync(filePath)) {
16
+ return fs.readFileSync(filePath, 'utf-8');
17
+ }
18
+ }
19
+ return null;
20
+ }
21
+ /**
22
+ * Extract examples from pattern markdown
23
+ */
24
+ function extractExamples(content) {
25
+ const good = [];
26
+ const bad = [];
27
+ // Find code blocks after "### Good" or "### Bad" headers
28
+ const goodMatch = content.match(/### Good\s*\n```[\s\S]*?```/g);
29
+ const badMatch = content.match(/### Bad\s*\n```[\s\S]*?```/g);
30
+ if (goodMatch) {
31
+ for (const match of goodMatch) {
32
+ const code = match.replace(/### Good\s*\n/, '').trim();
33
+ good.push(code);
34
+ }
35
+ }
36
+ if (badMatch) {
37
+ for (const match of badMatch) {
38
+ const code = match.replace(/### Bad\s*\n/, '').trim();
39
+ bad.push(code);
40
+ }
41
+ }
42
+ return { good, bad };
43
+ }
44
+ /**
45
+ * Generate .cursorrules content from Canon
46
+ */
47
+ function generateCursorrules() {
48
+ const lines = [];
49
+ // Header
50
+ lines.push(`# Gallop Canon v${version} - AI Rules`);
51
+ lines.push('');
52
+ lines.push('This file is auto-generated from @gallop.software/canon. Do not edit manually.');
53
+ lines.push('Regenerate with: npm run generate:ai-rules');
54
+ lines.push('');
55
+ // Tech stack (from speedwell context)
56
+ lines.push('## Tech Stack');
57
+ lines.push('');
58
+ lines.push('- Next.js 16 with App Router');
59
+ lines.push('- React 19');
60
+ lines.push('- TypeScript');
61
+ lines.push('- Tailwind CSS v4');
62
+ lines.push('- clsx for conditional class names');
63
+ lines.push('');
64
+ // Enforced patterns (ESLint rules)
65
+ lines.push('## Enforced Patterns (ESLint)');
66
+ lines.push('');
67
+ lines.push('These patterns are enforced by `@gallop.software/canon/eslint`. Violations will be flagged.');
68
+ lines.push('');
69
+ const enforcedPatterns = patterns.filter(p => p.enforcement === 'eslint' && p.rule);
70
+ for (const pattern of enforcedPatterns) {
71
+ lines.push(`### ${pattern.id}: ${pattern.title}`);
72
+ lines.push('');
73
+ lines.push(pattern.summary);
74
+ lines.push('');
75
+ lines.push(`- **ESLint Rule:** \`${pattern.rule}\``);
76
+ lines.push(`- **Category:** ${pattern.category}`);
77
+ lines.push('');
78
+ // Try to read and include examples
79
+ const content = readPatternFile(pattern.file);
80
+ if (content) {
81
+ const { good, bad } = extractExamples(content);
82
+ if (bad.length > 0) {
83
+ lines.push('**Bad:**');
84
+ lines.push('');
85
+ lines.push(bad[0]);
86
+ lines.push('');
87
+ }
88
+ if (good.length > 0) {
89
+ lines.push('**Good:**');
90
+ lines.push('');
91
+ lines.push(good[0]);
92
+ lines.push('');
93
+ }
94
+ }
95
+ }
96
+ // Documentation patterns
97
+ lines.push('## Documentation Patterns');
98
+ lines.push('');
99
+ lines.push('These patterns are not enforced by ESLint but should be followed.');
100
+ lines.push('');
101
+ const docPatterns = patterns.filter(p => p.enforcement === 'documentation');
102
+ for (const pattern of docPatterns) {
103
+ lines.push(`### ${pattern.id}: ${pattern.title}`);
104
+ lines.push('');
105
+ lines.push(pattern.summary);
106
+ lines.push('');
107
+ }
108
+ // Guarantees
109
+ lines.push('## Canon Guarantees');
110
+ lines.push('');
111
+ lines.push('Following these patterns provides these guarantees:');
112
+ lines.push('');
113
+ for (const guarantee of guarantees) {
114
+ lines.push(`- **${guarantee.name}** (${guarantee.id}): Patterns ${guarantee.patterns.join(', ')}`);
115
+ }
116
+ lines.push('');
117
+ // Quick reference for components
118
+ lines.push('## Component Quick Reference');
119
+ lines.push('');
120
+ lines.push('### Typography');
121
+ lines.push('- `Heading` - props: `as`, `color`, `margin`, `fontSize`, `fontWeight`, `textAlign`');
122
+ lines.push('- `Paragraph` - props: `color`, `margin`, `fontSize`, `lineHeight`, `textAlign`');
123
+ lines.push('- `Span` - props: `color`, `margin`, `fontSize` (inline text, mb-0 default)');
124
+ lines.push('- `Label` - props: `color`, `margin`, `fontSize`, `fontWeight`, `textAlign`');
125
+ lines.push('');
126
+ lines.push('### Layout');
127
+ lines.push('- `Section` - semantic section wrapper');
128
+ lines.push('- `Columns` - grid layout, props: `cols`, `gap`, `align`');
129
+ lines.push('- `Column` - column child');
130
+ lines.push('');
131
+ lines.push('### Interactive');
132
+ lines.push('- `Button` - props: `href`, `variant`, `icon`, `iconPlacement`, `margin`');
133
+ lines.push('- `Icon` - Iconify icon wrapper');
134
+ lines.push('');
135
+ // Do NOT section
136
+ lines.push('## Do NOT');
137
+ lines.push('');
138
+ lines.push('- Use `\'use client\'` in blocks - extract to components');
139
+ lines.push('- Use raw `<p>` or `<span>` - use Paragraph/Span components');
140
+ lines.push('- Use className for margin/color/fontSize when component has props');
141
+ lines.push('- Use Container inside Section - Section already provides containment');
142
+ lines.push('- Use `classnames` package - use `clsx` instead');
143
+ lines.push('- Use inline styles for hover states - use Tailwind classes');
144
+ lines.push('');
145
+ // Post-edit verification
146
+ lines.push('## Post-Edit Verification');
147
+ lines.push('');
148
+ lines.push('After editing files:');
149
+ lines.push('1. Run `npm run lint` to check for errors');
150
+ lines.push('2. Fix any violations before committing');
151
+ lines.push('');
152
+ lines.push('Note: Only lint files you edited, not the entire codebase.');
153
+ lines.push('');
154
+ return lines.join('\n');
155
+ }
156
+ export async function generate(options) {
157
+ const content = generateCursorrules();
158
+ if (options.output === '-') {
159
+ // Output to stdout
160
+ console.log(content);
161
+ }
162
+ else {
163
+ // Write to file
164
+ const outputPath = path.resolve(process.cwd(), options.output);
165
+ fs.writeFileSync(outputPath, content, 'utf-8');
166
+ console.log(`✓ Generated ${options.output} from Canon v${version}`);
167
+ console.log(` ${patterns.length} patterns, ${guarantees.length} guarantees`);
168
+ }
169
+ }
170
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY2xpL2NvbW1hbmRzL2dlbmVyYXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLE1BQU0sSUFBSSxDQUFBO0FBQ3hCLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFBO0FBQzVCLE9BQU8sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFjLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFBO0FBTzFFOztHQUVHO0FBQ0gsU0FBUyxlQUFlLENBQUMsV0FBbUI7SUFDMUMsbURBQW1EO0lBQ25ELE1BQU0sYUFBYSxHQUFHO1FBQ3BCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLHFDQUFxQyxFQUFFLFdBQVcsQ0FBQztRQUM1RSwyQkFBMkI7UUFDM0IsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxXQUFXLEVBQUUsV0FBVyxDQUFDO0tBQ3pELENBQUE7SUFFRCxLQUFLLE1BQU0sUUFBUSxJQUFJLGFBQWEsRUFBRSxDQUFDO1FBQ3JDLElBQUksRUFBRSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1lBQzVCLE9BQU8sRUFBRSxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUE7UUFDM0MsQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPLElBQUksQ0FBQTtBQUNiLENBQUM7QUFFRDs7R0FFRztBQUNILFNBQVMsZUFBZSxDQUFDLE9BQWU7SUFDdEMsTUFBTSxJQUFJLEdBQWEsRUFBRSxDQUFBO0lBQ3pCLE1BQU0sR0FBRyxHQUFhLEVBQUUsQ0FBQTtJQUV4Qix5REFBeUQ7SUFDekQsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyw4QkFBOEIsQ0FBQyxDQUFBO0lBQy9ELE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FB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UUFDbkUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLFFBQVEsQ0FBQyxNQUFNLGNBQWMsVUFBVSxDQUFDLE1BQU0sYUFBYSxDQUFDLENBQUE7SUFDL0UsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBmcyBmcm9tICdmcydcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCdcbmltcG9ydCB7IHZlcnNpb24sIHBhdHRlcm5zLCBjYXRlZ29yaWVzLCBndWFyYW50ZWVzIH0gZnJvbSAnLi4vLi4vaW5kZXguanMnXG5cbmludGVyZmFjZSBHZW5lcmF0ZU9wdGlvbnMge1xuICBvdXRwdXQ6IHN0cmluZ1xuICBmb3JtYXQ6ICdjdXJzb3JydWxlcycgfCAnbWFya2Rvd24nXG59XG5cbi8qKlxuICogUmVhZCBhIHBhdHRlcm4gbWFya2Rvd24gZmlsZSBhbmQgZXh0cmFjdCBzZWN0aW9uc1xuICovXG5mdW5jdGlvbiByZWFkUGF0dGVybkZpbGUocGF0dGVybkZpbGU6IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xuICAvLyBUcnkgdG8gZmluZCB0aGUgY2Fub24gcGFja2FnZSBwYXR0ZXJucyBkaXJlY3RvcnlcbiAgY29uc3QgcG9zc2libGVQYXRocyA9IFtcbiAgICBwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgJ25vZGVfbW9kdWxlcy9AZ2FsbG9wLnNvZnR3YXJlL2Nhbm9uJywgcGF0dGVybkZpbGUpLFxuICAgIC8vIEZhbGxiYWNrIGZvciBkZXZlbG9wbWVudFxuICAgIHBhdGguam9pbihpbXBvcnQubWV0YS5kaXJuYW1lLCAnLi4vLi4vLi4vJywgcGF0dGVybkZpbGUpLFxuICBdXG5cbiAgZm9yIChjb25zdCBmaWxlUGF0aCBvZiBwb3NzaWJsZVBhdGhzKSB7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpKSB7XG4gICAgICByZXR1cm4gZnMucmVhZEZpbGVTeW5jKGZpbGVQYXRoLCAndXRmLTgnKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsXG59XG5cbi8qKlxuICogRXh0cmFjdCBleGFtcGxlcyBmcm9tIHBhdHRlcm4gbWFya2Rvd25cbiAqL1xuZnVuY3Rpb24gZXh0cmFjdEV4YW1wbGVzKGNvbnRlbnQ6IHN0cmluZyk6IHsgZ29vZDogc3RyaW5nW107IGJhZDogc3RyaW5nW10gfSB7XG4gIGNvbnN0IGdvb2Q6IHN0cmluZ1tdID0gW11cbiAgY29uc3QgYmFkOiBzdHJpbmdbXSA9IFtdXG5cbiAgLy8gRmluZCBjb2RlIGJsb2NrcyBhZnRlciBcIiMjIyBHb29kXCIgb3IgXCIjIyMgQmFkXCIgaGVhZGVyc1xuICBjb25zdCBnb29kTWF0Y2ggPSBjb250ZW50Lm1hdGNoKC8jIyMgR29vZFxccypcXG5gYGBbXFxzXFxTXSo/YGBgL2cpXG4gIGNvbnN0IGJhZE1hdGNoID0gY29udGVudC5tYXRjaCgvIyMjIEJhZFxccypcXG5gYGBbXFxzXFxTXSo/YGBgL2cpXG5cbiAgaWYgKGdvb2RNYXRjaCkge1xuICAgIGZvciAoY29uc3QgbWF0Y2ggb2YgZ29vZE1hdGNoKSB7XG4gICAgICBjb25zdCBjb2RlID0gbWF0Y2gucmVwbGFjZSgvIyMjIEdvb2RcXHMqXFxuLywgJycpLnRyaW0oKVxuICAgICAgZ29vZC5wdXNoKGNvZGUpXG4gICAgfVxuICB9XG5cbiAgaWYgKGJhZE1hdGNoKSB7XG4gICAgZm9yIChjb25zdCBtYXRjaCBvZiBiYWRNYXRjaCkge1xuICAgICAgY29uc3QgY29kZSA9IG1hdGNoLnJlcGxhY2UoLyMjIyBCYWRcXHMqXFxuLywgJycpLnRyaW0oKVxuICAgICAgYmFkLnB1c2goY29kZSlcbiAgICB9XG4gIH1cblxuICByZXR1cm4geyBnb29kLCBiYWQgfVxufVxuXG4vKipcbiAqIEdlbmVyYXRlIC5jdXJzb3JydWxlcyBjb250ZW50IGZyb20gQ2Fub25cbiAqL1xuZnVuY3Rpb24gZ2VuZXJhdGVDdXJzb3JydWxlcygpOiBzdHJpbmcge1xuICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXVxuXG4gIC8vIEhlYWRlclxuICBsaW5lcy5wdXNoKGAjIEdhbGxvcCBDYW5vbiB2JHt2ZXJzaW9ufSAtIEFJIFJ1bGVzYClcbiAgbGluZXMucHVzaCgnJylcbiAgbGluZXMucHVzaCgnVGhpcyBmaWxlIGlzIGF1dG8tZ2VuZXJhdGVkIGZyb20gQGdhbGxvcC5zb2Z0d2FyZS9jYW5vbi4gRG8gbm90IGVkaXQgbWFudWFsbHkuJylcbiAgbGluZXMucHVzaCgnUmVnZW5lcmF0ZSB3aXRoOiBucG0gcnVuIGdlbmVyYXRlOmFpLXJ1bGVzJylcbiAgbGluZXMucHVzaCgnJylcblxuICAvLyBUZWNoIHN0YWNrIChmcm9tIHNwZWVkd2VsbCBjb250ZXh0KVxuICBsaW5lcy5wdXNoKCcjIyBUZWNoIFN0YWNrJylcbiAgbGluZXMucHVzaCgnJylcbiAgbGluZXMucHVzaCgnLSBOZXh0LmpzIDE2IHdpdGggQXBwIFJvdXRlcicpXG4gIGxpbmVzLnB1c2goJy0gUmVhY3QgMTknKVxuICBsaW5lcy5wdXNoKCctIFR5cGVTY3JpcHQnKVxuICBsaW5lcy5wdXNoKCctIFRhaWx3aW5kIENTUyB2NCcpXG4gIGxpbmVzLnB1c2goJy0gY2xzeCBmb3IgY29uZGl0aW9uYWwgY2xhc3MgbmFtZXMnKVxuICBsaW5lcy5wdXNoKCcnKVxuXG4gIC8vIEVuZm9yY2VkIHBhdHRlcm5zIChFU0xpbnQgcnVsZXMpXG4gIGxpbmVzLnB1c2goJyMjIEVuZm9yY2VkIFBhdHRlcm5zIChFU0xpbnQpJylcbiAgbGluZXMucHVzaCgnJylcbiAgbGluZXMucHVzaCgnVGhlc2UgcGF0dGVybnMgYXJlIGVuZm9yY2VkIGJ5IGBAZ2FsbG9wLnNvZnR3YXJlL2Nhbm9uL2VzbGludGAuIFZpb2xhdGlvbnMgd2lsbCBiZSBmbGFnZ2VkLicpXG4gIGxpbmVzLnB1c2goJycpXG5cbiAgY29uc3QgZW5mb3JjZWRQYXR0ZXJucyA9IHBhdHRlcm5zLmZpbHRlcihwID0+IHAuZW5mb3JjZW1lbnQgPT09ICdlc2xpbnQnICYmIHAucnVsZSlcbiAgZm9yIChjb25zdCBwYXR0ZXJuIG9mIGVuZm9yY2VkUGF0dGVybnMpIHtcbiAgICBsaW5lcy5wdXNoKGAjIyMgJHtwYXR0ZXJuLmlkfTogJHtwYXR0ZXJuLnRpdGxlfWApXG4gICAgbGluZXMucHVzaCgnJylcbiAgICBsaW5lcy5wdXNoKHBhdHRlcm4uc3VtbWFyeSlcbiAgICBsaW5lcy5wdXNoKCcnKVxuICAgIGxpbmVzLnB1c2goYC0gKipFU0xpbnQgUnVsZToqKiBcXGAke3BhdHRlcm4ucnVsZX1cXGBgKVxuICAgIGxpbmVzLnB1c2goYC0gKipDYXRlZ29yeToqKiAke3BhdHRlcm4uY2F0ZWdvcnl9YClcbiAgICBsaW5lcy5wdXNoKCcnKVxuXG4gICAgLy8gVHJ5IHRvIHJlYWQgYW5kIGluY2x1ZGUgZXhhbXBsZXNcbiAgICBjb25zdCBjb250ZW50ID0gcmVhZFBhdHRlcm5GaWxlKHBhdHRlcm4uZmlsZSlcbiAgICBpZiAoY29udGVudCkge1xuICAgICAgY29uc3QgeyBnb29kLCBiYWQgfSA9IGV4dHJhY3RFeGFtcGxlcyhjb250ZW50KVxuICAgICAgaWYgKGJhZC5sZW5ndGggPiAwKSB7XG4gICAgICAgIGxpbmVzLnB1c2goJyoqQmFkOioqJylcbiAgICAgICAgbGluZXMucHVzaCgnJylcbiAgICAgICAgbGluZXMucHVzaChiYWRbMF0pXG4gICAgICAgIGxpbmVzLnB1c2goJycpXG4gICAgICB9XG4gICAgICBpZiAoZ29vZC5sZW5ndGggPiAwKSB7XG4gICAgICAgIGxpbmVzLnB1c2goJyoqR29vZDoqKicpXG4gICAgICAgIGxpbmVzLnB1c2goJycpXG4gICAgICAgIGxpbmVzLnB1c2goZ29vZFswXSlcbiAgICAgICAgbGluZXMucHVzaCgnJylcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBEb2N1bWVudGF0aW9uIHBhdHRlcm5zXG4gIGxpbmVzLnB1c2goJyMjIERvY3VtZW50YXRpb24gUGF0dGVybnMnKVxuICBsaW5lcy5wdXNoKCcnKVxuICBsaW5lcy5wdXNoKCdUaGVzZSBwYXR0ZXJucyBhcmUgbm90IGVuZm9yY2VkIGJ5IEVTTGludCBidXQgc2hvdWxkIGJlIGZvbGxvd2VkLicpXG4gIGxpbmVzLnB1c2goJycpXG5cbiAgY29uc3QgZG9jUGF0dGVybnMgPSBwYXR0ZXJucy5maWx0ZXIocCA9PiBwLmVuZm9yY2VtZW50ID09PSAnZG9jdW1lbnRhdGlvbicpXG4gIGZvciAoY29uc3QgcGF0dGVybiBvZiBkb2NQYXR0ZXJucykge1xuICAgIGxpbmVzLnB1c2goYCMjIyAke3BhdHRlcm4uaWR9OiAke3BhdHRlcm4udGl0bGV9YClcbiAgICBsaW5lcy5wdXNoKCcnKVxuICAgIGxpbmVzLnB1c2gocGF0dGVybi5zdW1tYXJ5KVxuICAgIGxpbmVzLnB1c2goJycpXG4gIH1cblxuICAvLyBHdWFyYW50ZWVzXG4gIGxpbmVzLnB1c2goJyMjIENhbm9uIEd1YXJhbnRlZXMnKVxuICBsaW5lcy5wdXNoKCcnKVxuICBsaW5lcy5wdXNoKCdGb2xsb3dpbmcgdGhlc2UgcGF0dGVybnMgcHJvdmlkZXMgdGhlc2UgZ3VhcmFudGVlczonKVxuICBsaW5lcy5wdXNoKCcnKVxuXG4gIGZvciAoY29uc3QgZ3VhcmFudGVlIG9mIGd1YXJhbnRlZXMpIHtcbiAgICBsaW5lcy5wdXNoKGAtICoqJHtndWFyYW50ZWUubmFtZX0qKiAoJHtndWFyYW50ZWUuaWR9KTogUGF0dGVybnMgJHtndWFyYW50ZWUucGF0dGVybnMuam9pbignLCAnKX1gKVxuICB9XG4gIGxpbmVzLnB1c2goJycpXG5cbiAgLy8gUXVpY2sgcmVmZXJlbmNlIGZvciBjb21wb25lbnRzXG4gIGxpbmVzLnB1c2goJyMjIENvbXBvbmVudCBRdWljayBSZWZlcmVuY2UnKVxuICBsaW5lcy5wdXNoKCcnKVxuICBsaW5lcy5wdXNoKCcjIyMgVHlwb2dyYXBoeScpXG4gIGxpbmVzLnB1c2goJy0gYEhlYWRpbmdgIC0gcHJvcHM6IGBhc2AsIGBjb2xvcmAsIGBtYXJnaW5gLCBgZm9udFNpemVgLCBgZm9udFdlaWdodGAsIGB0ZXh0QWxpZ25gJylcbiAgbGluZXMucHVzaCgnLSBgUGFyYWdyYXBoYCAtIHByb3BzOiBgY29sb3JgLCBgbWFyZ2luYCwgYGZvbnRTaXplYCwgYGxpbmVIZWlnaHRgLCBgdGV4dEFsaWduYCcpXG4gIGxpbmVzLnB1c2goJy0gYFNwYW5gIC0gcHJvcHM6IGBjb2xvcmAsIGBtYXJnaW5gLCBgZm9udFNpemVgIChpbmxpbmUgdGV4dCwgbWItMCBkZWZhdWx0KScpXG4gIGxpbmVzLnB1c2goJy0gYExhYmVsYCAtIHByb3BzOiBgY29sb3JgLCBgbWFyZ2luYCwgYGZvbnRTaXplYCwgYGZvbnRXZWlnaHRgLCBgdGV4dEFsaWduYCcpXG4gIGxpbmVzLnB1c2goJycpXG4gIGxpbmVzLnB1c2goJyMjIyBMYXlvdXQnKVxuICBsaW5lcy5wdXNoKCctIGBTZWN0aW9uYCAtIHNlbWFudGljIHNlY3Rpb24gd3JhcHBlcicpXG4gIGxpbmVzLnB1c2goJy0gYENvbHVtbnNgIC0gZ3JpZCBsYXlvdXQsIHByb3BzOiBgY29sc2AsIGBnYXBgLCBgYWxpZ25gJylcbiAgbGluZXMucHVzaCgnLSBgQ29sdW1uYCAtIGNvbHVtbiBjaGlsZCcpXG4gIGxpbmVzLnB1c2goJycpXG4gIGxpbmVzLnB1c2goJyMjIyBJbnRlcmFjdGl2ZScpXG4gIGxpbmVzLnB1c2goJy0gYEJ1dHRvbmAgLSBwcm9wczogYGhyZWZgLCBgdmFyaWFudGAsIGBpY29uYCwgYGljb25QbGFjZW1lbnRgLCBgbWFyZ2luYCcpXG4gIGxpbmVzLnB1c2goJy0gYEljb25gIC0gSWNvbmlmeSBpY29uIHdyYXBwZXInKVxuICBsaW5lcy5wdXNoKCcnKVxuXG4gIC8vIERvIE5PVCBzZWN0aW9uXG4gIGxpbmVzLnB1c2goJyMjIERvIE5PVCcpXG4gIGxpbmVzLnB1c2goJycpXG4gIGxpbmVzLnB1c2goJy0gVXNlIGBcXCd1c2UgY2xpZW50XFwnYCBpbiBibG9ja3MgLSBleHRyYWN0IHRvIGNvbXBvbmVudHMnKVxuICBsaW5lcy5wdXNoKCctIFVzZSByYXcgYDxwPmAgb3IgYDxzcGFuPmAgLSB1c2UgUGFyYWdyYXBoL1NwYW4gY29tcG9uZW50cycpXG4gIGxpbmVzLnB1c2goJy0gVXNlIGNsYXNzTmFtZSBmb3IgbWFyZ2luL2NvbG9yL2ZvbnRTaXplIHdoZW4gY29tcG9uZW50IGhhcyBwcm9wcycpXG4gIGxpbmVzLnB1c2goJy0gVXNlIENvbnRhaW5lciBpbnNpZGUgU2VjdGlvbiAtIFNlY3Rpb24gYWxyZWFkeSBwcm92aWRlcyBjb250YWlubWVudCcpXG4gIGxpbmVzLnB1c2goJy0gVXNlIGBjbGFzc25hbWVzYCBwYWNrYWdlIC0gdXNlIGBjbHN4YCBpbnN0ZWFkJylcbiAgbGluZXMucHVzaCgnLSBVc2UgaW5saW5lIHN0eWxlcyBmb3IgaG92ZXIgc3RhdGVzIC0gdXNlIFRhaWx3aW5kIGNsYXNzZXMnKVxuICBsaW5lcy5wdXNoKCcnKVxuXG4gIC8vIFBvc3QtZWRpdCB2ZXJpZmljYXRpb25cbiAgbGluZXMucHVzaCgnIyMgUG9zdC1FZGl0IFZlcmlmaWNhdGlvbicpXG4gIGxpbmVzLnB1c2goJycpXG4gIGxpbmVzLnB1c2goJ0FmdGVyIGVkaXRpbmcgZmlsZXM6JylcbiAgbGluZXMucHVzaCgnMS4gUnVuIGBucG0gcnVuIGxpbnRgIHRvIGNoZWNrIGZvciBlcnJvcnMnKVxuICBsaW5lcy5wdXNoKCcyLiBGaXggYW55IHZpb2xhdGlvbnMgYmVmb3JlIGNvbW1pdHRpbmcnKVxuICBsaW5lcy5wdXNoKCcnKVxuICBsaW5lcy5wdXNoKCdOb3RlOiBPbmx5IGxpbnQgZmlsZXMgeW91IGVkaXRlZCwgbm90IHRoZSBlbnRpcmUgY29kZWJhc2UuJylcbiAgbGluZXMucHVzaCgnJylcblxuICByZXR1cm4gbGluZXMuam9pbignXFxuJylcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlKG9wdGlvbnM6IEdlbmVyYXRlT3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBjb250ZW50ID0gZ2VuZXJhdGVDdXJzb3JydWxlcygpXG5cbiAgaWYgKG9wdGlvbnMub3V0cHV0ID09PSAnLScpIHtcbiAgICAvLyBPdXRwdXQgdG8gc3Rkb3V0XG4gICAgY29uc29sZS5sb2coY29udGVudClcbiAgfSBlbHNlIHtcbiAgICAvLyBXcml0ZSB0byBmaWxlXG4gICAgY29uc3Qgb3V0cHV0UGF0aCA9IHBhdGgucmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCBvcHRpb25zLm91dHB1dClcbiAgICBmcy53cml0ZUZpbGVTeW5jKG91dHB1dFBhdGgsIGNvbnRlbnQsICd1dGYtOCcpXG4gICAgY29uc29sZS5sb2coYOKckyBHZW5lcmF0ZWQgJHtvcHRpb25zLm91dHB1dH0gZnJvbSBDYW5vbiB2JHt2ZXJzaW9ufWApXG4gICAgY29uc29sZS5sb2coYCAgJHtwYXR0ZXJucy5sZW5ndGh9IHBhdHRlcm5zLCAke2d1YXJhbnRlZXMubGVuZ3RofSBndWFyYW50ZWVzYClcbiAgfVxufVxuIl19
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
@@ -0,0 +1,104 @@
1
+ #!/usr/bin/env node
2
+ import { audit } from './commands/audit.js';
3
+ import { generate } from './commands/generate.js';
4
+ import { version } from '../index.js';
5
+ const args = process.argv.slice(2);
6
+ const command = args[0];
7
+ // Colors for terminal output
8
+ const colors = {
9
+ reset: '\x1b[0m',
10
+ bold: '\x1b[1m',
11
+ dim: '\x1b[2m',
12
+ red: '\x1b[31m',
13
+ green: '\x1b[32m',
14
+ yellow: '\x1b[33m',
15
+ blue: '\x1b[34m',
16
+ magenta: '\x1b[35m',
17
+ cyan: '\x1b[36m',
18
+ };
19
+ function showHelp() {
20
+ console.log(`
21
+ ${colors.bold}Gallop CLI${colors.reset} - Canon Compliance Tooling
22
+ ${colors.dim}Canon Version: ${version}${colors.reset}
23
+
24
+ ${colors.bold}Usage:${colors.reset}
25
+ gallop <command> [options]
26
+
27
+ ${colors.bold}Commands:${colors.reset}
28
+ audit [path] Check Canon compliance (default: src/blocks/)
29
+ generate [output] Generate AI rules from Canon (default: .cursorrules)
30
+ version Show version information
31
+ help Show this help message
32
+
33
+ ${colors.bold}Audit Options:${colors.reset}
34
+ --strict Exit with error code on violations
35
+ --json Output as JSON
36
+
37
+ ${colors.bold}Generate Options:${colors.reset}
38
+ --output, -o Output file path (default: .cursorrules)
39
+
40
+ ${colors.bold}Examples:${colors.reset}
41
+ gallop audit
42
+ gallop audit src/blocks/ --strict
43
+ gallop generate
44
+ gallop generate .cursorrules
45
+ gallop generate --output .github/copilot-instructions.md
46
+ `);
47
+ }
48
+ function showVersion() {
49
+ console.log(`Gallop CLI v1.0.0`);
50
+ console.log(`Canon v${version}`);
51
+ }
52
+ async function main() {
53
+ switch (command) {
54
+ case 'audit':
55
+ const auditPath = args[1] && !args[1].startsWith('--') ? args[1] : 'src/blocks/';
56
+ const auditOptions = {
57
+ strict: args.includes('--strict'),
58
+ json: args.includes('--json'),
59
+ fix: args.includes('--fix'),
60
+ };
61
+ await audit(auditPath, auditOptions);
62
+ break;
63
+ case 'generate':
64
+ // Find output path from args
65
+ let outputPath = '.cursorrules';
66
+ const outputIndex = args.indexOf('--output');
67
+ const outputIndexShort = args.indexOf('-o');
68
+ if (outputIndex !== -1 && args[outputIndex + 1]) {
69
+ outputPath = args[outputIndex + 1];
70
+ }
71
+ else if (outputIndexShort !== -1 && args[outputIndexShort + 1]) {
72
+ outputPath = args[outputIndexShort + 1];
73
+ }
74
+ else if (args[1] && !args[1].startsWith('--')) {
75
+ outputPath = args[1];
76
+ }
77
+ const generateOptions = {
78
+ output: outputPath,
79
+ format: 'cursorrules',
80
+ };
81
+ await generate(generateOptions);
82
+ break;
83
+ case 'version':
84
+ case '-v':
85
+ case '--version':
86
+ showVersion();
87
+ break;
88
+ case 'help':
89
+ case '-h':
90
+ case '--help':
91
+ case undefined:
92
+ showHelp();
93
+ break;
94
+ default:
95
+ console.error(`Unknown command: ${command}`);
96
+ console.error(`Run 'gallop help' for usage information.`);
97
+ process.exit(1);
98
+ }
99
+ }
100
+ main().catch((error) => {
101
+ console.error('Error:', error.message);
102
+ process.exit(1);
103
+ });
104
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY2xpL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFFQSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0scUJBQXFCLENBQUE7QUFDM0MsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHdCQUF3QixDQUFBO0FBQ2pELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxhQUFhLENBQUE7QUFFckMsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUE7QUFDbEMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBO0FBRXZCLDZCQUE2QjtBQUM3QixNQUFNLE1BQU0sR0FBRztJQUNiLEtBQUssRUFBRSxTQUFTO0lBQ2hCLElBQUksRUFBRSxTQUFTO0lBQ2YsR0FBRyxFQUFFLFNBQVM7SUFDZCxHQUFHLEVBQUUsVUFBVTtJQUNmLEtBQUssRUFBRSxVQUFVO0lBQ2pCLE1BQU0sRUFBRSxVQUFVO0lBQ2xCLElBQUksRUFBRSxVQUFVO0lBQ2hCLE9BQU8sRUFBRSxVQUFVO0lBQ25CLElBQUksRUFBRSxVQUFVO0NBQ2pCLENBQUE7QUFFRCxTQUFTLFFBQVE7SUFDZixPQUFPLENBQUMsR0FBRyxDQUFDO0VBQ1osTUFBTSxDQUFDLElBQUksYUFBYSxNQUFNLENBQUMsS0FBSztFQUNwQyxNQUFNLENBQUMsR0FBRyxrQkFBa0IsT0FBTyxHQUFHLE1BQU0sQ0FBQyxLQUFLOztFQUVsRCxNQUFNLENBQUMsSUFBSSxTQUFTLE1BQU0sQ0FBQyxLQUFLOzs7RUFHaEMsTUFBTSxDQUFDLElBQUksWUFBWSxNQUFNLENBQUMsS0FBSzs7Ozs7O0VBTW5DLE1BQU0sQ0FBQyxJQUFJLGlCQUFpQixNQUFNLENBQUMsS0FBSzs7OztFQUl4QyxNQUFNLENBQUMsSUFBSSxvQkFBb0IsTUFBTSxDQUFDLEtBQUs7OztFQUczQyxNQUFN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QUMsT0FBTyxDQUFDLENBQUE7SUFDdEMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQTtBQUNqQixDQUFDLENBQUMsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbIiMhL3Vzci9iaW4vZW52IG5vZGVcblxuaW1wb3J0IHsgYXVkaXQgfSBmcm9tICcuL2NvbW1hbmRzL2F1ZGl0LmpzJ1xuaW1wb3J0IHsgZ2VuZXJhdGUgfSBmcm9tICcuL2NvbW1hbmRzL2dlbmVyYXRlLmpzJ1xuaW1wb3J0IHsgdmVyc2lvbiB9IGZyb20gJy4uL2luZGV4LmpzJ1xuXG5jb25zdCBhcmdzID0gcHJvY2Vzcy5hcmd2LnNsaWNlKDIpXG5jb25zdCBjb21tYW5kID0gYXJnc1swXVxuXG4vLyBDb2xvcnMgZm9yIHRlcm1pbmFsIG91dHB1dFxuY29uc3QgY29sb3JzID0ge1xuICByZXNldDogJ1xceDFiWzBtJyxcbiAgYm9sZDogJ1xceDFiWzFtJyxcbiAgZGltOiAnXFx4MWJbMm0nLFxuICByZWQ6ICdcXHgxYlszMW0nLFxuICBncmVlbjogJ1xceDFiWzMybScsXG4gIHllbGxvdzogJ1xceDFiWzMzbScsXG4gIGJsdWU6ICdcXHgxYlszNG0nLFxuICBtYWdlbnRhOiAnXFx4MWJbMzVtJyxcbiAgY3lhbjogJ1xceDFiWzM2bScsXG59XG5cbmZ1bmN0aW9uIHNob3dIZWxwKCkge1xuICBjb25zb2xlLmxvZyhgXG4ke2NvbG9ycy5ib2xkfUdhbGxvcCBDTEkke2NvbG9ycy5yZXNldH0gLSBDYW5vbiBDb21wbGlhbmNlIFRvb2xpbmdcbiR7Y29sb3JzLmRpbX1DYW5vbiBWZXJzaW9uOiAke3ZlcnNpb259JHtjb2xvcnMucmVzZXR9XG5cbiR7Y29sb3JzLmJvbGR9VXNhZ2U6JHtjb2xvcnMucmVzZXR9XG4gIGdhbGxvcCA8Y29tbWFuZD4gW29wdGlvbnNdXG5cbiR7Y29sb3JzLmJvbGR9Q29tbWFuZHM6JHtjb2xvcnMucmVzZXR9XG4gIGF1ZGl0IFtwYXRoXSAgICAgICBDaGVjayBDYW5vbiBjb21wbGlhbmNlIChkZWZhdWx0OiBzcmMvYmxvY2tzLylcbiAgZ2VuZXJhdGUgW291dHB1dF0gIEdlbmVyYXRlIEFJIHJ1bGVzIGZyb20gQ2Fub24gKGRlZmF1bHQ6IC5jdXJzb3JydWxlcylcbiAgdmVyc2lvbiAgICAgICAgICAgIFNob3cgdmVyc2lvbiBpbmZvcm1hdGlvblxuICBoZWxwICAgICAgICAgICAgICAgU2hvdyB0aGlzIGhlbHAgbWVzc2FnZVxuXG4ke2NvbG9ycy5ib2xkfUF1ZGl0IE9wdGlvbnM6JHtjb2xvcnMucmVzZXR9XG4gIC0tc3RyaWN0ICAgICAgICAgICBFeGl0IHdpdGggZXJyb3IgY29kZSBvbiB2aW9sYXRpb25zXG4gIC0tanNvbiAgICAgICAgICAgICBPdXRwdXQgYXMgSlNPTlxuXG4ke2NvbG9ycy5ib2xkfUdlbmVyYXRlIE9wdGlvbnM6JHtjb2xvcnMucmVzZXR9XG4gIC0tb3V0cHV0LCAtbyAgICAgICBPdXRwdXQgZmlsZSBwYXRoIChkZWZhdWx0OiAuY3Vyc29ycnVsZXMpXG5cbiR7Y29sb3JzLmJvbGR9RXhhbXBsZXM6JHtjb2xvcnMucmVzZXR9XG4gIGdhbGxvcCBhdWRpdFxuICBnYWxsb3AgYXVkaXQgc3JjL2Jsb2Nrcy8gLS1zdHJpY3RcbiAgZ2FsbG9wIGdlbmVyYXRlXG4gIGdhbGxvcCBnZW5lcmF0ZSAuY3Vyc29ycnVsZXNcbiAgZ2FsbG9wIGdlbmVyYXRlIC0tb3V0cHV0IC5naXRodWIvY29waWxvdC1pbnN0cnVjdGlvbnMubWRcbmApXG59XG5cbmZ1bmN0aW9uIHNob3dWZXJzaW9uKCkge1xuICBjb25zb2xlLmxvZyhgR2FsbG9wIENMSSB2MS4wLjBgKVxuICBjb25zb2xlLmxvZyhgQ2Fub24gdiR7dmVyc2lvbn1gKVxufVxuXG5hc3luYyBmdW5jdGlvbiBtYWluKCkge1xuICBzd2l0Y2ggKGNvbW1hbmQpIHtcbiAgICBjYXNlICdhdWRpdCc6XG4gICAgICBjb25zdCBhdWRpdFBhdGggPVxuICAgICAgICBhcmdzWzFdICYmICFhcmdzWzFdLnN0YXJ0c1dpdGgoJy0tJykgPyBhcmdzWzFdIDogJ3NyYy9ibG9ja3MvJ1xuICAgICAgY29uc3QgYXVkaXRPcHRpb25zID0ge1xuICAgICAgICBzdHJpY3Q6IGFyZ3MuaW5jbHVkZXMoJy0tc3RyaWN0JyksXG4gICAgICAgIGpzb246IGFyZ3MuaW5jbHVkZXMoJy0tanNvbicpLFxuICAgICAgICBmaXg6IGFyZ3MuaW5jbHVkZXMoJy0tZml4JyksXG4gICAgICB9XG4gICAgICBhd2FpdCBhdWRpdChhdWRpdFBhdGgsIGF1ZGl0T3B0aW9ucylcbiAgICAgIGJyZWFrXG5cbiAgICBjYXNlICdnZW5lcmF0ZSc6XG4gICAgICAvLyBGaW5kIG91dHB1dCBwYXRoIGZyb20gYXJnc1xuICAgICAgbGV0IG91dHB1dFBhdGggPSAnLmN1cnNvcnJ1bGVzJ1xuICAgICAgY29uc3Qgb3V0cHV0SW5kZXggPSBhcmdzLmluZGV4T2YoJy0tb3V0cHV0JylcbiAgICAgIGNvbnN0IG91dHB1dEluZGV4U2hvcnQgPSBhcmdzLmluZGV4T2YoJy1vJylcbiAgICAgIGlmIChvdXRwdXRJbmRleCAhPT0gLTEgJiYgYXJnc1tvdXRwdXRJbmRleCArIDFdKSB7XG4gICAgICAgIG91dHB1dFBhdGggPSBhcmdzW291dHB1dEluZGV4ICsgMV1cbiAgICAgIH0gZWxzZSBpZiAob3V0cHV0SW5kZXhTaG9ydCAhPT0gLTEgJiYgYXJnc1tvdXRwdXRJbmRleFNob3J0ICsgMV0pIHtcbiAgICAgICAgb3V0cHV0UGF0aCA9IGFyZ3Nbb3V0cHV0SW5kZXhTaG9ydCArIDFdXG4gICAgICB9IGVsc2UgaWYgKGFyZ3NbMV0gJiYgIWFyZ3NbMV0uc3RhcnRzV2l0aCgnLS0nKSkge1xuICAgICAgICBvdXRwdXRQYXRoID0gYXJnc1sxXVxuICAgICAgfVxuICAgICAgY29uc3QgZ2VuZXJhdGVPcHRpb25zID0ge1xuICAgICAgICBvdXRwdXQ6IG91dHB1dFBhdGgsXG4gICAgICAgIGZvcm1hdDogJ2N1cnNvcnJ1bGVzJyBhcyBjb25zdCxcbiAgICAgIH1cbiAgICAgIGF3YWl0IGdlbmVyYXRlKGdlbmVyYXRlT3B0aW9ucylcbiAgICAgIGJyZWFrXG5cbiAgICBjYXNlICd2ZXJzaW9uJzpcbiAgICBjYXNlICctdic6XG4gICAgY2FzZSAnLS12ZXJzaW9uJzpcbiAgICAgIHNob3dWZXJzaW9uKClcbiAgICAgIGJyZWFrXG5cbiAgICBjYXNlICdoZWxwJzpcbiAgICBjYXNlICctaCc6XG4gICAgY2FzZSAnLS1oZWxwJzpcbiAgICBjYXNlIHVuZGVmaW5lZDpcbiAgICAgIHNob3dIZWxwKClcbiAgICAgIGJyZWFrXG5cbiAgICBkZWZhdWx0OlxuICAgICAgY29uc29sZS5lcnJvcihgVW5rbm93biBjb21tYW5kOiAke2NvbW1hbmR9YClcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFJ1biAnZ2FsbG9wIGhlbHAnIGZvciB1c2FnZSBpbmZvcm1hdGlvbi5gKVxuICAgICAgcHJvY2Vzcy5leGl0KDEpXG4gIH1cbn1cblxubWFpbigpLmNhdGNoKChlcnJvcikgPT4ge1xuICBjb25zb2xlLmVycm9yKCdFcnJvcjonLCBlcnJvci5tZXNzYWdlKVxuICBwcm9jZXNzLmV4aXQoMSlcbn0pXG4iXX0=
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Recommended configuration
3
+ * A sensible default for any Gallop-based template
4
+ */
5
+ declare const recommendedConfig: {
6
+ plugins: string[];
7
+ rules: {
8
+ 'gallop/no-client-blocks': string;
9
+ 'gallop/no-container-in-section': string;
10
+ 'gallop/prefer-component-props': string;
11
+ };
12
+ };
13
+ export default recommendedConfig;
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Recommended configuration
3
+ * A sensible default for any Gallop-based template
4
+ */
5
+ const recommendedConfig = {
6
+ plugins: ['gallop'],
7
+ rules: {
8
+ // Core rules that apply to most templates
9
+ 'gallop/no-client-blocks': 'warn',
10
+ 'gallop/no-container-in-section': 'warn',
11
+ 'gallop/prefer-component-props': 'warn',
12
+ },
13
+ };
14
+ export default recommendedConfig;
15
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjb21tZW5kZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZXNsaW50L2NvbmZpZ3MvcmVjb21tZW5kZWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBQ0gsTUFBTSxpQkFBaUIsR0FBRztJQUN4QixPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUM7SUFDbkIsS0FBSyxFQUFFO1FBQ0wsMENBQTBDO1FBQzFDLHlCQUF5QixFQUFFLE1BQU07UUFDakMsZ0NBQWdDLEVBQUUsTUFBTTtRQUN4QywrQkFBK0IsRUFBRSxNQUFNO0tBQ3hDO0NBQ0YsQ0FBQTtBQUVELGVBQWUsaUJBQWlCLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFJlY29tbWVuZGVkIGNvbmZpZ3VyYXRpb25cbiAqIEEgc2Vuc2libGUgZGVmYXVsdCBmb3IgYW55IEdhbGxvcC1iYXNlZCB0ZW1wbGF0ZVxuICovXG5jb25zdCByZWNvbW1lbmRlZENvbmZpZyA9IHtcbiAgcGx1Z2luczogWydnYWxsb3AnXSxcbiAgcnVsZXM6IHtcbiAgICAvLyBDb3JlIHJ1bGVzIHRoYXQgYXBwbHkgdG8gbW9zdCB0ZW1wbGF0ZXNcbiAgICAnZ2FsbG9wL25vLWNsaWVudC1ibG9ja3MnOiAnd2FybicsXG4gICAgJ2dhbGxvcC9uby1jb250YWluZXItaW4tc2VjdGlvbic6ICd3YXJuJyxcbiAgICAnZ2FsbG9wL3ByZWZlci1jb21wb25lbnQtcHJvcHMnOiAnd2FybicsXG4gIH0sXG59XG5cbmV4cG9ydCBkZWZhdWx0IHJlY29tbWVuZGVkQ29uZmlnXG4iXX0=
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Speedwell template configuration
3
+ * Enables all Gallop rules relevant to the Speedwell architecture
4
+ */
5
+ declare const speedwellConfig: {
6
+ plugins: string[];
7
+ rules: {
8
+ 'gallop/no-client-blocks': string;
9
+ 'gallop/no-container-in-section': string;
10
+ 'gallop/prefer-component-props': string;
11
+ };
12
+ };
13
+ export default speedwellConfig;
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Speedwell template configuration
3
+ * Enables all Gallop rules relevant to the Speedwell architecture
4
+ */
5
+ const speedwellConfig = {
6
+ plugins: ['gallop'],
7
+ rules: {
8
+ // Blocks should be server components - extract client logic to components
9
+ 'gallop/no-client-blocks': 'warn',
10
+ // Section already provides containment
11
+ 'gallop/no-container-in-section': 'warn',
12
+ // Use component props instead of className for style values
13
+ 'gallop/prefer-component-props': 'warn',
14
+ },
15
+ };
16
+ export default speedwellConfig;
17
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BlZWR3ZWxsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2VzbGludC9jb25maWdzL3NwZWVkd2VsbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFDSCxNQUFNLGVBQWUsR0FBRztJQUN0QixPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUM7SUFDbkIsS0FBSyxFQUFFO1FBQ0wsMEVBQTBFO1FBQzFFLHlCQUF5QixFQUFFLE1BQU07UUFFakMsdUNBQXVDO1FBQ3ZDLGdDQUFnQyxFQUFFLE1BQU07UUFFeEMsNERBQTREO1FBQzVELCtCQUErQixFQUFFLE1BQU07S0FDeEM7Q0FDRixDQUFBO0FBRUQsZUFBZSxlQUFlLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFNwZWVkd2VsbCB0ZW1wbGF0ZSBjb25maWd1cmF0aW9uXG4gKiBFbmFibGVzIGFsbCBHYWxsb3AgcnVsZXMgcmVsZXZhbnQgdG8gdGhlIFNwZWVkd2VsbCBhcmNoaXRlY3R1cmVcbiAqL1xuY29uc3Qgc3BlZWR3ZWxsQ29uZmlnID0ge1xuICBwbHVnaW5zOiBbJ2dhbGxvcCddLFxuICBydWxlczoge1xuICAgIC8vIEJsb2NrcyBzaG91bGQgYmUgc2VydmVyIGNvbXBvbmVudHMgLSBleHRyYWN0IGNsaWVudCBsb2dpYyB0byBjb21wb25lbnRzXG4gICAgJ2dhbGxvcC9uby1jbGllbnQtYmxvY2tzJzogJ3dhcm4nLFxuXG4gICAgLy8gU2VjdGlvbiBhbHJlYWR5IHByb3ZpZGVzIGNvbnRhaW5tZW50XG4gICAgJ2dhbGxvcC9uby1jb250YWluZXItaW4tc2VjdGlvbic6ICd3YXJuJyxcblxuICAgIC8vIFVzZSBjb21wb25lbnQgcHJvcHMgaW5zdGVhZCBvZiBjbGFzc05hbWUgZm9yIHN0eWxlIHZhbHVlc1xuICAgICdnYWxsb3AvcHJlZmVyLWNvbXBvbmVudC1wcm9wcyc6ICd3YXJuJyxcbiAgfSxcbn1cblxuZXhwb3J0IGRlZmF1bHQgc3BlZWR3ZWxsQ29uZmlnXG4iXX0=