@fozikio/reflex 0.1.2 → 0.2.0
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.
- package/dist/cli/index.d.ts +13 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +383 -0
- package/dist/cli/index.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* reflex CLI — validate, test, and inspect safety rules.
|
|
4
|
+
*
|
|
5
|
+
* Usage:
|
|
6
|
+
* reflex validate <rules-dir> Validate all YAML rules for correctness
|
|
7
|
+
* reflex list [rules-dir] List loaded rules (includes core rules)
|
|
8
|
+
* reflex test <rules-dir> <event-json> Test an event against rules
|
|
9
|
+
* reflex init [dir] Scaffold a rules directory with examples
|
|
10
|
+
* reflex help Show this help message
|
|
11
|
+
*/
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;GASG"}
|
|
@@ -0,0 +1,383 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* reflex CLI — validate, test, and inspect safety rules.
|
|
4
|
+
*
|
|
5
|
+
* Usage:
|
|
6
|
+
* reflex validate <rules-dir> Validate all YAML rules for correctness
|
|
7
|
+
* reflex list [rules-dir] List loaded rules (includes core rules)
|
|
8
|
+
* reflex test <rules-dir> <event-json> Test an event against rules
|
|
9
|
+
* reflex init [dir] Scaffold a rules directory with examples
|
|
10
|
+
* reflex help Show this help message
|
|
11
|
+
*/
|
|
12
|
+
import { readFile, mkdir, writeFile } from 'node:fs/promises';
|
|
13
|
+
import { resolve, relative } from 'node:path';
|
|
14
|
+
import { RuleEngine } from '../core/rule-engine.js';
|
|
15
|
+
import { loadRuleFile, loadRuleDirectory } from '../core/rule-loader.js';
|
|
16
|
+
import { CORE_RULES } from '../core/defaults.js';
|
|
17
|
+
const HELP = `
|
|
18
|
+
reflex — portable guardrails for any agent runtime
|
|
19
|
+
|
|
20
|
+
Usage:
|
|
21
|
+
reflex validate <rules-dir> Validate YAML rules
|
|
22
|
+
reflex list [rules-dir] List all rules (core + custom)
|
|
23
|
+
reflex test <rules-dir> <event.json> Test event against rules
|
|
24
|
+
reflex test <rules-dir> --event <type> [--field value ...]
|
|
25
|
+
Test inline event against rules
|
|
26
|
+
reflex init [dir] Scaffold example rules directory
|
|
27
|
+
reflex help Show this help
|
|
28
|
+
|
|
29
|
+
Options:
|
|
30
|
+
--var key=value Set a template variable (repeatable)
|
|
31
|
+
--json Output as JSON
|
|
32
|
+
--no-core Exclude built-in core rules
|
|
33
|
+
|
|
34
|
+
Examples:
|
|
35
|
+
reflex validate ./rules
|
|
36
|
+
reflex list ./rules --json
|
|
37
|
+
reflex test ./rules --event bash_command --command "rm -rf /"
|
|
38
|
+
reflex test ./rules event.json --var allowed_roots=D:/projects
|
|
39
|
+
reflex init ./my-rules
|
|
40
|
+
`.trim();
|
|
41
|
+
// --- Helpers ---
|
|
42
|
+
function die(message) {
|
|
43
|
+
console.error(`Error: ${message}`);
|
|
44
|
+
process.exit(1);
|
|
45
|
+
}
|
|
46
|
+
function parseArgs(argv) {
|
|
47
|
+
const command = argv[0] ?? 'help';
|
|
48
|
+
const positionals = [];
|
|
49
|
+
const flags = {};
|
|
50
|
+
const vars = {};
|
|
51
|
+
let i = 1;
|
|
52
|
+
while (i < argv.length) {
|
|
53
|
+
const arg = argv[i];
|
|
54
|
+
if (arg === '--var' && argv[i + 1]) {
|
|
55
|
+
const [key, ...rest] = argv[i + 1].split('=');
|
|
56
|
+
if (key)
|
|
57
|
+
vars[key] = rest.join('=');
|
|
58
|
+
i += 2;
|
|
59
|
+
}
|
|
60
|
+
else if (arg.startsWith('--')) {
|
|
61
|
+
const name = arg.slice(2);
|
|
62
|
+
const next = argv[i + 1];
|
|
63
|
+
if (next && !next.startsWith('--')) {
|
|
64
|
+
flags[name] = next;
|
|
65
|
+
i += 2;
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
flags[name] = true;
|
|
69
|
+
i += 1;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
positionals.push(arg);
|
|
74
|
+
i += 1;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return { command, positionals, flags, vars };
|
|
78
|
+
}
|
|
79
|
+
const SEVERITY_ORDER = {
|
|
80
|
+
critical: 0, high: 1, medium: 2, low: 3, info: 4,
|
|
81
|
+
};
|
|
82
|
+
const TIER_BADGE = {
|
|
83
|
+
core: '[core]', recommended: '[recommended]', custom: '[custom]',
|
|
84
|
+
};
|
|
85
|
+
const ACTION_SYMBOL = {
|
|
86
|
+
block: 'BLOCK', warn: 'WARN', log: 'LOG',
|
|
87
|
+
};
|
|
88
|
+
function formatRule(rule) {
|
|
89
|
+
const badge = TIER_BADGE[rule.tier] ?? rule.tier;
|
|
90
|
+
const action = ACTION_SYMBOL[rule.action] ?? rule.action;
|
|
91
|
+
const events = rule.events.join(', ');
|
|
92
|
+
const conditions = rule.conditions.map(c => `${c.field} ${c.op} "${c.pattern}"`).join(' AND ');
|
|
93
|
+
const disableable = rule.override.allow_disable ? 'yes' : 'no';
|
|
94
|
+
return [
|
|
95
|
+
` ${rule.name} ${badge}`,
|
|
96
|
+
` ${rule.description}`,
|
|
97
|
+
` Action: ${action} | Severity: ${rule.severity} | Events: ${events}`,
|
|
98
|
+
` Conditions: ${conditions}`,
|
|
99
|
+
` Can disable: ${disableable}`,
|
|
100
|
+
].join('\n');
|
|
101
|
+
}
|
|
102
|
+
function formatResult(result) {
|
|
103
|
+
const icon = result.action === 'block' ? 'BLOCKED' : result.action === 'warn' ? 'WARNING' : 'LOG';
|
|
104
|
+
return [
|
|
105
|
+
` [${icon}] ${result.rule} (${result.severity})`,
|
|
106
|
+
` ${result.message.trim()}`,
|
|
107
|
+
` Matched: ${result.matched_conditions.join(', ')}`,
|
|
108
|
+
].join('\n');
|
|
109
|
+
}
|
|
110
|
+
// --- Commands ---
|
|
111
|
+
async function cmdValidate(dir, asJson) {
|
|
112
|
+
const absDir = resolve(dir);
|
|
113
|
+
const { readdir } = await import('node:fs/promises');
|
|
114
|
+
const { extname, join } = await import('node:path');
|
|
115
|
+
const errors = [];
|
|
116
|
+
const valid = [];
|
|
117
|
+
async function walk(d) {
|
|
118
|
+
const entries = await readdir(d, { withFileTypes: true });
|
|
119
|
+
for (const entry of entries) {
|
|
120
|
+
const fullPath = join(d, entry.name);
|
|
121
|
+
if (entry.isDirectory()) {
|
|
122
|
+
await walk(fullPath);
|
|
123
|
+
}
|
|
124
|
+
else if (entry.isFile() && (extname(entry.name) === '.yaml' || extname(entry.name) === '.yml')) {
|
|
125
|
+
try {
|
|
126
|
+
const rule = await loadRuleFile(fullPath);
|
|
127
|
+
// Validate required fields
|
|
128
|
+
const missing = [];
|
|
129
|
+
if (!rule.name)
|
|
130
|
+
missing.push('name');
|
|
131
|
+
if (!rule.events.length)
|
|
132
|
+
missing.push('events');
|
|
133
|
+
if (!rule.conditions.length)
|
|
134
|
+
missing.push('conditions');
|
|
135
|
+
if (!rule.message)
|
|
136
|
+
missing.push('message');
|
|
137
|
+
if (missing.length > 0) {
|
|
138
|
+
errors.push({ file: relative(absDir, fullPath), error: `Missing fields: ${missing.join(', ')}` });
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
valid.push({ file: relative(absDir, fullPath), name: rule.name });
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
catch (e) {
|
|
145
|
+
errors.push({ file: relative(absDir, fullPath), error: String(e) });
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
await walk(absDir);
|
|
151
|
+
if (asJson) {
|
|
152
|
+
console.log(JSON.stringify({ valid: valid.length, errors: errors.length, details: { valid, errors } }, null, 2));
|
|
153
|
+
}
|
|
154
|
+
else {
|
|
155
|
+
console.log(`\nValidated ${valid.length + errors.length} rule files in ${dir}\n`);
|
|
156
|
+
if (valid.length > 0) {
|
|
157
|
+
console.log(` ${valid.length} valid:`);
|
|
158
|
+
for (const v of valid)
|
|
159
|
+
console.log(` OK ${v.file} (${v.name})`);
|
|
160
|
+
}
|
|
161
|
+
if (errors.length > 0) {
|
|
162
|
+
console.log(`\n ${errors.length} errors:`);
|
|
163
|
+
for (const e of errors)
|
|
164
|
+
console.log(` ERR ${e.file}: ${e.error}`);
|
|
165
|
+
}
|
|
166
|
+
console.log('');
|
|
167
|
+
}
|
|
168
|
+
process.exit(errors.length > 0 ? 1 : 0);
|
|
169
|
+
}
|
|
170
|
+
async function cmdList(dir, includeCore, asJson) {
|
|
171
|
+
const rules = [];
|
|
172
|
+
if (includeCore) {
|
|
173
|
+
rules.push(...CORE_RULES);
|
|
174
|
+
}
|
|
175
|
+
if (dir) {
|
|
176
|
+
const customRules = await loadRuleDirectory(resolve(dir));
|
|
177
|
+
rules.push(...customRules);
|
|
178
|
+
}
|
|
179
|
+
if (rules.length === 0) {
|
|
180
|
+
console.log('No rules loaded.');
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
183
|
+
// Sort by tier (core first), then severity
|
|
184
|
+
rules.sort((a, b) => {
|
|
185
|
+
const tierOrder = { core: 0, recommended: 1, custom: 2 };
|
|
186
|
+
const td = (tierOrder[a.tier] ?? 2) - (tierOrder[b.tier] ?? 2);
|
|
187
|
+
if (td !== 0)
|
|
188
|
+
return td;
|
|
189
|
+
return (SEVERITY_ORDER[a.severity] ?? 4) - (SEVERITY_ORDER[b.severity] ?? 4);
|
|
190
|
+
});
|
|
191
|
+
if (asJson) {
|
|
192
|
+
console.log(JSON.stringify(rules, null, 2));
|
|
193
|
+
}
|
|
194
|
+
else {
|
|
195
|
+
console.log(`\n${rules.length} rules loaded:\n`);
|
|
196
|
+
for (const rule of rules) {
|
|
197
|
+
console.log(formatRule(rule));
|
|
198
|
+
console.log('');
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
async function cmdTest(dir, eventSource, flags, vars, includeCore, asJson) {
|
|
203
|
+
// Build the event
|
|
204
|
+
let event;
|
|
205
|
+
if (eventSource && !eventSource.startsWith('--')) {
|
|
206
|
+
// It's a file path
|
|
207
|
+
const content = await readFile(resolve(eventSource), 'utf-8');
|
|
208
|
+
event = JSON.parse(content);
|
|
209
|
+
}
|
|
210
|
+
else {
|
|
211
|
+
// Build from flags
|
|
212
|
+
const eventType = flags['event'];
|
|
213
|
+
if (typeof eventType !== 'string') {
|
|
214
|
+
die('Provide an event JSON file or use --event <type> --field value');
|
|
215
|
+
}
|
|
216
|
+
event = { event: eventType };
|
|
217
|
+
for (const [key, value] of Object.entries(flags)) {
|
|
218
|
+
if (key === 'event' || key === 'json' || key === 'no-core')
|
|
219
|
+
continue;
|
|
220
|
+
event[key] = value;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
// Load rules
|
|
224
|
+
const engine = new RuleEngine(vars);
|
|
225
|
+
if (includeCore)
|
|
226
|
+
engine.addRules(CORE_RULES);
|
|
227
|
+
const customRules = await loadRuleDirectory(resolve(dir));
|
|
228
|
+
engine.addRules(customRules);
|
|
229
|
+
// Evaluate
|
|
230
|
+
const results = engine.evaluate(event);
|
|
231
|
+
const blocks = results.filter(r => r.action === 'block');
|
|
232
|
+
const warnings = results.filter(r => r.action === 'warn');
|
|
233
|
+
const logs = results.filter(r => r.action === 'log');
|
|
234
|
+
if (asJson) {
|
|
235
|
+
console.log(JSON.stringify({
|
|
236
|
+
event,
|
|
237
|
+
allowed: blocks.length === 0,
|
|
238
|
+
blocks: blocks.length,
|
|
239
|
+
warnings: warnings.length,
|
|
240
|
+
logs: logs.length,
|
|
241
|
+
results,
|
|
242
|
+
}, null, 2));
|
|
243
|
+
}
|
|
244
|
+
else {
|
|
245
|
+
console.log(`\nTesting event: ${event.event}`);
|
|
246
|
+
for (const [key, value] of Object.entries(event)) {
|
|
247
|
+
if (key === 'event')
|
|
248
|
+
continue;
|
|
249
|
+
const display = typeof value === 'string' && value.length > 80 ? value.slice(0, 77) + '...' : value;
|
|
250
|
+
console.log(` ${key}: ${display}`);
|
|
251
|
+
}
|
|
252
|
+
console.log('');
|
|
253
|
+
if (results.length === 0) {
|
|
254
|
+
console.log(' No rules triggered. Event is allowed.\n');
|
|
255
|
+
}
|
|
256
|
+
else {
|
|
257
|
+
if (blocks.length > 0) {
|
|
258
|
+
console.log(` ${blocks.length} BLOCKED:`);
|
|
259
|
+
for (const r of blocks)
|
|
260
|
+
console.log(formatResult(r));
|
|
261
|
+
console.log('');
|
|
262
|
+
}
|
|
263
|
+
if (warnings.length > 0) {
|
|
264
|
+
console.log(` ${warnings.length} WARNINGS:`);
|
|
265
|
+
for (const r of warnings)
|
|
266
|
+
console.log(formatResult(r));
|
|
267
|
+
console.log('');
|
|
268
|
+
}
|
|
269
|
+
if (logs.length > 0) {
|
|
270
|
+
console.log(` ${logs.length} LOGGED:`);
|
|
271
|
+
for (const r of logs)
|
|
272
|
+
console.log(formatResult(r));
|
|
273
|
+
console.log('');
|
|
274
|
+
}
|
|
275
|
+
const verdict = blocks.length > 0 ? 'BLOCKED' : 'ALLOWED';
|
|
276
|
+
console.log(` Verdict: ${verdict}\n`);
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
process.exit(blocks.length > 0 ? 2 : 0);
|
|
280
|
+
}
|
|
281
|
+
async function cmdInit(dir) {
|
|
282
|
+
const absDir = resolve(dir);
|
|
283
|
+
await mkdir(absDir, { recursive: true });
|
|
284
|
+
const exampleRule = `name: warn-debug-code
|
|
285
|
+
version: 1
|
|
286
|
+
tier: recommended
|
|
287
|
+
category: quality
|
|
288
|
+
description: Warn when debug statements are left in code
|
|
289
|
+
events: [file_write, file_edit]
|
|
290
|
+
conditions:
|
|
291
|
+
- field: content
|
|
292
|
+
op: regex
|
|
293
|
+
pattern: "(console\\\\.log|debugger|TODO.*HACK)"
|
|
294
|
+
action: warn
|
|
295
|
+
severity: low
|
|
296
|
+
message: "Debug code detected in {{file_path}}"
|
|
297
|
+
override:
|
|
298
|
+
allow_disable: true
|
|
299
|
+
allow_downgrade: true
|
|
300
|
+
`;
|
|
301
|
+
const blockExample = `name: block-env-commit
|
|
302
|
+
version: 1
|
|
303
|
+
tier: recommended
|
|
304
|
+
category: safety
|
|
305
|
+
description: Block writing secrets to .env files that might get committed
|
|
306
|
+
events: [file_write]
|
|
307
|
+
conditions:
|
|
308
|
+
- field: file_path
|
|
309
|
+
op: regex
|
|
310
|
+
pattern: "\\\\.env$"
|
|
311
|
+
- field: content
|
|
312
|
+
op: regex
|
|
313
|
+
pattern: "(API_KEY|SECRET|TOKEN|PASSWORD)\\\\s*=\\\\s*[^$]"
|
|
314
|
+
action: block
|
|
315
|
+
severity: high
|
|
316
|
+
message: "Potential secret in {{file_path}} — use environment variables instead"
|
|
317
|
+
override:
|
|
318
|
+
allow_disable: true
|
|
319
|
+
allow_downgrade: true
|
|
320
|
+
`;
|
|
321
|
+
await writeFile(resolve(absDir, 'warn-debug-code.yaml'), exampleRule);
|
|
322
|
+
await writeFile(resolve(absDir, 'block-env-commit.yaml'), blockExample);
|
|
323
|
+
console.log(`\nInitialized reflex rules directory: ${dir}\n`);
|
|
324
|
+
console.log(' Created:');
|
|
325
|
+
console.log(' warn-debug-code.yaml (recommended, quality)');
|
|
326
|
+
console.log(' block-env-commit.yaml (recommended, safety)');
|
|
327
|
+
console.log('');
|
|
328
|
+
console.log(' Next steps:');
|
|
329
|
+
console.log(' reflex validate ' + dir);
|
|
330
|
+
console.log(' reflex list ' + dir);
|
|
331
|
+
console.log(' reflex test ' + dir + ' --event file_write --file_path app.ts --content "console.log(x)"');
|
|
332
|
+
console.log('');
|
|
333
|
+
}
|
|
334
|
+
// --- Main ---
|
|
335
|
+
async function main() {
|
|
336
|
+
const args = process.argv.slice(2);
|
|
337
|
+
if (args.length === 0) {
|
|
338
|
+
console.log(HELP);
|
|
339
|
+
process.exit(0);
|
|
340
|
+
}
|
|
341
|
+
const { command, positionals, flags, vars } = parseArgs(args);
|
|
342
|
+
const asJson = flags['json'] === true;
|
|
343
|
+
const includeCore = flags['no-core'] !== true;
|
|
344
|
+
switch (command) {
|
|
345
|
+
case 'validate': {
|
|
346
|
+
const dir = positionals[0];
|
|
347
|
+
if (!dir)
|
|
348
|
+
die('Usage: reflex validate <rules-dir>');
|
|
349
|
+
await cmdValidate(dir, asJson);
|
|
350
|
+
break;
|
|
351
|
+
}
|
|
352
|
+
case 'list': {
|
|
353
|
+
const dir = positionals[0];
|
|
354
|
+
await cmdList(dir, includeCore, asJson);
|
|
355
|
+
break;
|
|
356
|
+
}
|
|
357
|
+
case 'test': {
|
|
358
|
+
const dir = positionals[0];
|
|
359
|
+
if (!dir)
|
|
360
|
+
die('Usage: reflex test <rules-dir> [event.json] [--event <type> --field value]');
|
|
361
|
+
const eventSource = positionals[1];
|
|
362
|
+
await cmdTest(dir, eventSource, flags, vars, includeCore, asJson);
|
|
363
|
+
break;
|
|
364
|
+
}
|
|
365
|
+
case 'init': {
|
|
366
|
+
const dir = positionals[0] ?? './reflex-rules';
|
|
367
|
+
await cmdInit(dir);
|
|
368
|
+
break;
|
|
369
|
+
}
|
|
370
|
+
case 'help':
|
|
371
|
+
case '--help':
|
|
372
|
+
case '-h':
|
|
373
|
+
console.log(HELP);
|
|
374
|
+
break;
|
|
375
|
+
default:
|
|
376
|
+
die(`Unknown command: ${command}. Run "reflex help" for usage.`);
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
main().catch(e => {
|
|
380
|
+
console.error(e);
|
|
381
|
+
process.exit(1);
|
|
382
|
+
});
|
|
383
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
|