@fozikio/reflex 0.1.1 → 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/README.md CHANGED
@@ -185,11 +185,16 @@ const config: ReflexConfig = {
185
185
  };
186
186
  ```
187
187
 
188
+ ## Contributing
189
+
190
+ See the [Contributing Guide](https://github.com/Fozikio/.github/blob/main/CONTRIBUTING.md). Report security issues via [SECURITY.md](https://github.com/Fozikio/.github/blob/main/SECURITY.md).
191
+
188
192
  ## Related Projects
189
193
 
190
194
  - [cortex-engine](https://github.com/Fozikio/cortex-engine) — Cognitive memory layer for AI agents (ships with Reflex rules)
191
195
  - [sigil](https://github.com/Fozikio/sigil) — Agent control surface
192
196
  - [fozikio.com](https://www.fozikio.com) — Documentation and guides
197
+ - [r/fozikio](https://www.reddit.com/r/Fozikio/) — Community
193
198
 
194
199
  ## Background
195
200
 
@@ -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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"}
package/package.json CHANGED
@@ -1,58 +1,62 @@
1
- {
2
- "name": "@fozikio/reflex",
3
- "version": "0.1.1",
4
- "description": "Portable guardrails for any agent runtime — safety rules as data, not code",
5
- "type": "module",
6
- "main": "dist/index.js",
7
- "types": "dist/index.d.ts",
8
- "bin": {
9
- "reflex": "dist/cli/index.js"
10
- },
11
- "scripts": {
12
- "build": "tsc",
13
- "dev": "tsc --watch",
14
- "test": "vitest run"
15
- },
16
- "engines": {
17
- "node": ">=20"
18
- },
19
- "dependencies": {
20
- "yaml": "^2.7.0"
21
- },
22
- "devDependencies": {
23
- "@types/node": "^22.10.0",
24
- "typescript": "^5.7.0",
25
- "vitest": "^3.0.0"
26
- },
27
- "files": [
28
- "dist",
29
- "rules",
30
- "LICENSE",
31
- "README.md"
32
- ],
33
- "exports": {
34
- ".": {
35
- "import": "./dist/index.js",
36
- "types": "./dist/index.d.ts"
37
- }
38
- },
39
- "keywords": [
40
- "reflex",
41
- "guardrails",
42
- "safety",
43
- "ai-agent",
44
- "hooks",
45
- "mcp"
46
- ],
47
- "license": "MIT",
48
- "author": "Fozikio <hello@fozikio.com>",
49
- "repository": {
50
- "type": "git",
51
- "url": "https://github.com/Fozikio/reflex.git"
52
- },
53
- "homepage": "https://github.com/Fozikio/reflex#readme",
54
- "funding": {
55
- "type": "github",
56
- "url": "https://github.com/sponsors/Fozikio"
57
- }
58
- }
1
+ {
2
+ "name": "@fozikio/reflex",
3
+ "version": "0.2.0",
4
+ "description": "Portable guardrails for any agent runtime — safety rules as data, not code",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "bin": {
9
+ "reflex": "dist/cli/index.js"
10
+ },
11
+ "scripts": {
12
+ "build": "tsc",
13
+ "dev": "tsc --watch",
14
+ "test": "vitest run"
15
+ },
16
+ "engines": {
17
+ "node": ">=20"
18
+ },
19
+ "dependencies": {
20
+ "yaml": "^2.7.0"
21
+ },
22
+ "devDependencies": {
23
+ "@types/node": "^22.10.0",
24
+ "typescript": "^5.7.0",
25
+ "vitest": "^3.0.0"
26
+ },
27
+ "files": [
28
+ "dist",
29
+ "rules",
30
+ "LICENSE",
31
+ "README.md"
32
+ ],
33
+ "exports": {
34
+ ".": {
35
+ "import": "./dist/index.js",
36
+ "types": "./dist/index.d.ts"
37
+ }
38
+ },
39
+ "keywords": [
40
+ "reflex",
41
+ "guardrails",
42
+ "safety",
43
+ "ai-agent",
44
+ "hooks",
45
+ "mcp",
46
+ "fozikio",
47
+ "rules-engine",
48
+ "agent-safety",
49
+ "yaml-rules"
50
+ ],
51
+ "license": "MIT",
52
+ "author": "Fozikio <hello@fozikio.com>",
53
+ "repository": {
54
+ "type": "git",
55
+ "url": "https://github.com/Fozikio/reflex.git"
56
+ },
57
+ "homepage": "https://github.com/Fozikio/reflex#readme",
58
+ "funding": {
59
+ "type": "github",
60
+ "url": "https://github.com/sponsors/idapixl"
61
+ }
62
+ }