@rcrsr/rill-cli 0.7.2 → 0.8.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.
Files changed (60) hide show
  1. package/dist/cli-check.js +0 -0
  2. package/dist/cli-eval.js +0 -0
  3. package/dist/cli-exec.js +0 -0
  4. package/dist/cli-shared.d.ts.map +1 -1
  5. package/dist/cli-shared.js +3 -1
  6. package/dist/cli-shared.js.map +1 -1
  7. package/package.json +26 -11
  8. package/src/check/config.ts +0 -202
  9. package/src/check/fixer.ts +0 -174
  10. package/src/check/index.ts +0 -39
  11. package/src/check/rules/anti-patterns.ts +0 -585
  12. package/src/check/rules/closures.ts +0 -445
  13. package/src/check/rules/collections.ts +0 -437
  14. package/src/check/rules/conditionals.ts +0 -155
  15. package/src/check/rules/flow.ts +0 -262
  16. package/src/check/rules/formatting.ts +0 -811
  17. package/src/check/rules/helpers.ts +0 -89
  18. package/src/check/rules/index.ts +0 -140
  19. package/src/check/rules/loops.ts +0 -372
  20. package/src/check/rules/naming.ts +0 -242
  21. package/src/check/rules/strings.ts +0 -104
  22. package/src/check/rules/types.ts +0 -213
  23. package/src/check/types.ts +0 -163
  24. package/src/check/validator.ts +0 -136
  25. package/src/check/visitor.ts +0 -338
  26. package/src/cli-check.ts +0 -456
  27. package/src/cli-error-enrichment.ts +0 -274
  28. package/src/cli-error-formatter.ts +0 -313
  29. package/src/cli-eval.ts +0 -145
  30. package/src/cli-exec.ts +0 -408
  31. package/src/cli-explain.ts +0 -76
  32. package/src/cli-lsp-diagnostic.ts +0 -132
  33. package/src/cli-module-loader.ts +0 -101
  34. package/src/cli-shared.ts +0 -187
  35. package/tests/check/cli-check.test.ts +0 -189
  36. package/tests/check/config.test.ts +0 -350
  37. package/tests/check/fixer.test.ts +0 -373
  38. package/tests/check/format-diagnostics.test.ts +0 -327
  39. package/tests/check/rules/anti-patterns.test.ts +0 -467
  40. package/tests/check/rules/closures.test.ts +0 -192
  41. package/tests/check/rules/collections.test.ts +0 -380
  42. package/tests/check/rules/conditionals.test.ts +0 -185
  43. package/tests/check/rules/flow.test.ts +0 -250
  44. package/tests/check/rules/formatting.test.ts +0 -755
  45. package/tests/check/rules/loops.test.ts +0 -334
  46. package/tests/check/rules/naming.test.ts +0 -336
  47. package/tests/check/rules/strings.test.ts +0 -129
  48. package/tests/check/rules/types.test.ts +0 -233
  49. package/tests/check/validator.test.ts +0 -444
  50. package/tests/check/visitor.test.ts +0 -171
  51. package/tests/cli/check.test.ts +0 -801
  52. package/tests/cli/error-enrichment.test.ts +0 -510
  53. package/tests/cli/error-formatter.test.ts +0 -631
  54. package/tests/cli/eval.test.ts +0 -85
  55. package/tests/cli/exec.test.ts +0 -537
  56. package/tests/cli-explain.test.ts +0 -249
  57. package/tests/cli-lsp-diagnostic.test.ts +0 -202
  58. package/tests/cli-shared.test.ts +0 -439
  59. package/tsconfig.json +0 -9
  60. package/tsconfig.tsbuildinfo +0 -1
@@ -1,250 +0,0 @@
1
- /**
2
- * Flow and Capture Rules Tests
3
- * Verify flow and capture convention enforcement.
4
- */
5
-
6
- import { describe, it, expect } from 'vitest';
7
- import { parse } from '@rcrsr/rill';
8
- import { validateScript } from '../../../src/check/validator.js';
9
- import type { CheckConfig } from '../../../src/check/types.js';
10
-
11
- // ============================================================
12
- // TEST HELPERS
13
- // ============================================================
14
-
15
- /**
16
- * Create a config with flow rules enabled.
17
- */
18
- function createConfig(rules: Record<string, 'on' | 'off'> = {}): CheckConfig {
19
- return {
20
- rules: {
21
- CAPTURE_INLINE_CHAIN: 'on',
22
- CAPTURE_BEFORE_BRANCH: 'on',
23
- ...rules,
24
- },
25
- severity: {},
26
- };
27
- }
28
-
29
- /**
30
- * Validate source and extract diagnostic messages.
31
- */
32
- function getDiagnostics(source: string, config?: CheckConfig): string[] {
33
- const ast = parse(source);
34
- const diagnostics = validateScript(ast, source, config ?? createConfig());
35
- return diagnostics.map((d) => d.message);
36
- }
37
-
38
- /**
39
- * Validate source and check for violations.
40
- */
41
- function hasViolations(source: string, config?: CheckConfig): boolean {
42
- const ast = parse(source);
43
- const diagnostics = validateScript(ast, source, config ?? createConfig());
44
- return diagnostics.length > 0;
45
- }
46
-
47
- /**
48
- * Validate source and get diagnostic codes.
49
- */
50
- function getCodes(source: string, config?: CheckConfig): string[] {
51
- const ast = parse(source);
52
- const diagnostics = validateScript(ast, source, config ?? createConfig());
53
- return diagnostics.map((d) => d.code);
54
- }
55
-
56
- // ============================================================
57
- // CAPTURE_INLINE_CHAIN TESTS
58
- // ============================================================
59
-
60
- describe('CAPTURE_INLINE_CHAIN', () => {
61
- const config = createConfig({ CAPTURE_BEFORE_BRANCH: 'off' });
62
-
63
- it('accepts inline capture with continuation', () => {
64
- expect(hasViolations('prompt("test") => $raw -> log', config)).toBe(false);
65
- expect(
66
- hasViolations('prompt("test") => $raw -> .contains("ERROR")', config)
67
- ).toBe(false);
68
- });
69
-
70
- it('accepts capture without immediate continuation', () => {
71
- expect(hasViolations('prompt("test") => $raw', config)).toBe(false);
72
- });
73
-
74
- it('detects separate capture and usage on next line', () => {
75
- const source = `
76
- prompt("Read file") => $raw
77
- $raw -> log
78
- `.trim();
79
-
80
- const messages = getDiagnostics(source, config);
81
- expect(messages.length).toBeGreaterThan(0);
82
- expect(messages[0]).toContain('inline capture');
83
- expect(messages[0]).toContain('=> $raw ->');
84
- });
85
-
86
- it('detects separate capture followed by method chain', () => {
87
- const source = `
88
- checkStatus() => $result
89
- $result -> .contains("OK")
90
- `.trim();
91
-
92
- const messages = getDiagnostics(source, config);
93
- expect(messages.length).toBeGreaterThan(0);
94
- expect(messages[0]).toContain('inline capture');
95
- });
96
-
97
- it('accepts capture with different variable used next', () => {
98
- const source = `
99
- prompt("test") => $raw
100
- $other -> log
101
- `.trim();
102
-
103
- expect(hasViolations(source, config)).toBe(false);
104
- });
105
-
106
- it('accepts capture when next statement is not a pipe chain', () => {
107
- const source = `
108
- prompt("test") => $raw
109
- "constant"
110
- `.trim();
111
-
112
- expect(hasViolations(source, config)).toBe(false);
113
- });
114
-
115
- it('accepts capture at end of script', () => {
116
- const source = 'prompt("test") => $raw';
117
- expect(hasViolations(source, config)).toBe(false);
118
- });
119
-
120
- it('has info severity', () => {
121
- const source = `
122
- prompt("test") => $raw
123
- $raw -> log
124
- `.trim();
125
-
126
- const ast = parse(source);
127
- const diagnostics = validateScript(ast, source, config);
128
- expect(diagnostics[0]?.severity).toBe('info');
129
- });
130
- });
131
-
132
- // ============================================================
133
- // CAPTURE_BEFORE_BRANCH TESTS
134
- // ============================================================
135
-
136
- describe('CAPTURE_BEFORE_BRANCH', () => {
137
- const config = createConfig({ CAPTURE_INLINE_CHAIN: 'off' });
138
-
139
- it('accepts simple variable in conditional input', () => {
140
- const source = `
141
- checkStatus() => $result
142
- $result -> .contains("OK") ? { "Success" } ! { "Failed" }
143
- `.trim();
144
-
145
- expect(hasViolations(source, config)).toBe(false);
146
- });
147
-
148
- it('detects piped value used in both branches', () => {
149
- const source = `
150
- checkStatus() -> .contains("OK") ? {
151
- $ -> log
152
- } ! {
153
- $ -> log
154
- }
155
- `.trim();
156
-
157
- const messages = getDiagnostics(source, config);
158
- expect(messages.length).toBeGreaterThan(0);
159
- expect(messages[0]).toContain('capturing value before conditional');
160
- expect(messages[0]).toContain('multiple branches');
161
- });
162
-
163
- it('accepts conditional with single branch', () => {
164
- const source = `
165
- checkStatus() -> .contains("OK") ? { $ -> log }
166
- `.trim();
167
-
168
- expect(hasViolations(source, config)).toBe(false);
169
- });
170
-
171
- it('accepts conditional without input expression', () => {
172
- const source = `
173
- true ? { "yes" } ! { "no" }
174
- `.trim();
175
-
176
- expect(hasViolations(source, config)).toBe(false);
177
- });
178
-
179
- it('accepts branches that do not reference piped value', () => {
180
- const source = `
181
- checkStatus() -> .contains("OK") ? { "Success" } ! { "Failed" }
182
- `.trim();
183
-
184
- expect(hasViolations(source, config)).toBe(false);
185
- });
186
-
187
- it('detects value used in then branch only', () => {
188
- const source = `
189
- checkStatus() -> .contains("OK") ? {
190
- $ -> log
191
- } ! {
192
- "other"
193
- }
194
- `.trim();
195
-
196
- // Should not trigger - only in one branch
197
- expect(hasViolations(source, config)).toBe(false);
198
- });
199
-
200
- it('has info severity', () => {
201
- const source = `
202
- checkStatus() -> .contains("OK") ? {
203
- $ -> log
204
- } ! {
205
- $ -> log
206
- }
207
- `.trim();
208
-
209
- const ast = parse(source);
210
- const diagnostics = validateScript(ast, source, config);
211
- if (diagnostics.length > 0) {
212
- expect(diagnostics[0]?.severity).toBe('info');
213
- }
214
- });
215
- });
216
-
217
- // ============================================================
218
- // COMBINED RULES TESTS
219
- // ============================================================
220
-
221
- describe('flow rules combined', () => {
222
- it('can detect both rules in same source', () => {
223
- const source = `
224
- prompt("test") => $raw
225
- $raw -> .contains("OK") ? {
226
- $ -> log
227
- } ! {
228
- $ -> log
229
- }
230
- `.trim();
231
-
232
- const codes = getCodes(source);
233
- // May trigger CAPTURE_INLINE_CHAIN
234
- expect(codes.length).toBeGreaterThan(0);
235
- });
236
-
237
- it('respects rule configuration', () => {
238
- const source = `
239
- prompt("test") => $raw
240
- $raw -> log
241
- `.trim();
242
-
243
- const disabledConfig = createConfig({
244
- CAPTURE_INLINE_CHAIN: 'off',
245
- CAPTURE_BEFORE_BRANCH: 'off',
246
- });
247
-
248
- expect(hasViolations(source, disabledConfig)).toBe(false);
249
- });
250
- });