@rcrsr/rill 0.1.0 → 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.
Files changed (260) hide show
  1. package/README.md +16 -8
  2. package/dist/check/config.d.ts +20 -0
  3. package/dist/check/config.d.ts.map +1 -0
  4. package/dist/check/config.js +151 -0
  5. package/dist/check/config.js.map +1 -0
  6. package/dist/check/fixer.d.ts +39 -0
  7. package/dist/check/fixer.d.ts.map +1 -0
  8. package/dist/check/fixer.js +119 -0
  9. package/dist/check/fixer.js.map +1 -0
  10. package/dist/check/index.d.ts +10 -0
  11. package/dist/check/index.d.ts.map +1 -0
  12. package/dist/check/index.js +21 -0
  13. package/dist/check/index.js.map +1 -0
  14. package/dist/check/rules/anti-patterns.d.ts +65 -0
  15. package/dist/check/rules/anti-patterns.d.ts.map +1 -0
  16. package/dist/check/rules/anti-patterns.js +427 -0
  17. package/dist/check/rules/anti-patterns.js.map +1 -0
  18. package/dist/check/rules/closures.d.ts +66 -0
  19. package/dist/check/rules/closures.d.ts.map +1 -0
  20. package/dist/check/rules/closures.js +373 -0
  21. package/dist/check/rules/closures.js.map +1 -0
  22. package/dist/check/rules/collections.d.ts +90 -0
  23. package/dist/check/rules/collections.d.ts.map +1 -0
  24. package/dist/check/rules/collections.js +373 -0
  25. package/dist/check/rules/collections.js.map +1 -0
  26. package/dist/check/rules/conditionals.d.ts +41 -0
  27. package/dist/check/rules/conditionals.d.ts.map +1 -0
  28. package/dist/check/rules/conditionals.js +106 -0
  29. package/dist/check/rules/conditionals.js.map +1 -0
  30. package/dist/check/rules/flow.d.ts +46 -0
  31. package/dist/check/rules/flow.d.ts.map +1 -0
  32. package/dist/check/rules/flow.js +206 -0
  33. package/dist/check/rules/flow.js.map +1 -0
  34. package/dist/check/rules/formatting.d.ts +133 -0
  35. package/dist/check/rules/formatting.d.ts.map +1 -0
  36. package/dist/check/rules/formatting.js +639 -0
  37. package/dist/check/rules/formatting.js.map +1 -0
  38. package/dist/check/rules/helpers.d.ts +26 -0
  39. package/dist/check/rules/helpers.d.ts.map +1 -0
  40. package/dist/check/rules/helpers.js +66 -0
  41. package/dist/check/rules/helpers.js.map +1 -0
  42. package/dist/check/rules/index.d.ts +21 -0
  43. package/dist/check/rules/index.d.ts.map +1 -0
  44. package/dist/check/rules/index.js +78 -0
  45. package/dist/check/rules/index.js.map +1 -0
  46. package/dist/check/rules/loops.d.ts +70 -0
  47. package/dist/check/rules/loops.d.ts.map +1 -0
  48. package/dist/check/rules/loops.js +227 -0
  49. package/dist/check/rules/loops.js.map +1 -0
  50. package/dist/check/rules/naming.d.ts +21 -0
  51. package/dist/check/rules/naming.d.ts.map +1 -0
  52. package/dist/check/rules/naming.js +167 -0
  53. package/dist/check/rules/naming.js.map +1 -0
  54. package/dist/check/rules/strings.d.ts +28 -0
  55. package/dist/check/rules/strings.d.ts.map +1 -0
  56. package/dist/check/rules/strings.js +80 -0
  57. package/dist/check/rules/strings.js.map +1 -0
  58. package/dist/check/rules/types.d.ts +41 -0
  59. package/dist/check/rules/types.d.ts.map +1 -0
  60. package/dist/check/rules/types.js +162 -0
  61. package/dist/check/rules/types.js.map +1 -0
  62. package/dist/check/types.d.ts +106 -0
  63. package/dist/check/types.d.ts.map +1 -0
  64. package/dist/check/types.js +6 -0
  65. package/dist/check/types.js.map +1 -0
  66. package/dist/check/validator.d.ts +18 -0
  67. package/dist/check/validator.d.ts.map +1 -0
  68. package/dist/check/validator.js +88 -0
  69. package/dist/check/validator.js.map +1 -0
  70. package/dist/check/visitor.d.ts +33 -0
  71. package/dist/check/visitor.d.ts.map +1 -0
  72. package/dist/check/visitor.js +243 -0
  73. package/dist/check/visitor.js.map +1 -0
  74. package/dist/cli-check.d.ts +43 -0
  75. package/dist/cli-check.d.ts.map +1 -0
  76. package/dist/cli-check.js +356 -0
  77. package/dist/cli-check.js.map +1 -0
  78. package/dist/cli-eval.d.ts +15 -0
  79. package/dist/cli-eval.d.ts.map +1 -0
  80. package/dist/cli-eval.js +120 -0
  81. package/dist/cli-eval.js.map +1 -0
  82. package/dist/cli-exec.d.ts +49 -0
  83. package/dist/cli-exec.d.ts.map +1 -0
  84. package/dist/cli-exec.js +191 -0
  85. package/dist/cli-exec.js.map +1 -0
  86. package/dist/cli-module-loader.d.ts +19 -0
  87. package/dist/cli-module-loader.d.ts.map +1 -0
  88. package/dist/cli-module-loader.js +83 -0
  89. package/dist/cli-module-loader.js.map +1 -0
  90. package/dist/cli-shared.d.ts +36 -0
  91. package/dist/cli-shared.d.ts.map +1 -0
  92. package/dist/cli-shared.js +101 -0
  93. package/dist/cli-shared.js.map +1 -0
  94. package/dist/cli.d.ts +2 -0
  95. package/dist/cli.d.ts.map +1 -1
  96. package/dist/cli.js +4 -11
  97. package/dist/cli.js.map +1 -1
  98. package/dist/index.d.ts +1 -1
  99. package/dist/index.d.ts.map +1 -1
  100. package/dist/index.js +1 -1
  101. package/dist/index.js.map +1 -1
  102. package/dist/lexer/readers.d.ts +1 -1
  103. package/dist/lexer/readers.d.ts.map +1 -1
  104. package/dist/lexer/readers.js +62 -32
  105. package/dist/lexer/readers.js.map +1 -1
  106. package/dist/lexer/tokenizer.d.ts.map +1 -1
  107. package/dist/lexer/tokenizer.js +5 -6
  108. package/dist/lexer/tokenizer.js.map +1 -1
  109. package/dist/parser/index.js +1 -1
  110. package/dist/parser/index.js.map +1 -1
  111. package/dist/parser/parser-expr.js +23 -5
  112. package/dist/parser/parser-expr.js.map +1 -1
  113. package/dist/parser/parser-functions.d.ts +2 -2
  114. package/dist/parser/parser-functions.d.ts.map +1 -1
  115. package/dist/parser/parser-functions.js +2 -1
  116. package/dist/parser/parser-functions.js.map +1 -1
  117. package/dist/parser/parser-literals.js +2 -2
  118. package/dist/parser/parser-literals.js.map +1 -1
  119. package/dist/parser/parser-script.js +9 -7
  120. package/dist/parser/parser-script.js.map +1 -1
  121. package/dist/parser/parser-variables.js +4 -3
  122. package/dist/parser/parser-variables.js.map +1 -1
  123. package/dist/runtime/core/callable.d.ts +5 -6
  124. package/dist/runtime/core/callable.d.ts.map +1 -1
  125. package/dist/runtime/core/callable.js.map +1 -1
  126. package/dist/runtime/core/context.d.ts.map +1 -1
  127. package/dist/runtime/core/context.js +19 -32
  128. package/dist/runtime/core/context.js.map +1 -1
  129. package/dist/runtime/core/equals.js +1 -1
  130. package/dist/runtime/core/equals.js.map +1 -1
  131. package/dist/runtime/core/eval/evaluator.d.ts +78 -0
  132. package/dist/runtime/core/eval/evaluator.d.ts.map +1 -1
  133. package/dist/runtime/core/eval/evaluator.js +78 -0
  134. package/dist/runtime/core/eval/evaluator.js.map +1 -1
  135. package/dist/runtime/core/eval/mixins/closures.d.ts.map +1 -1
  136. package/dist/runtime/core/eval/mixins/closures.js +9 -1
  137. package/dist/runtime/core/eval/mixins/closures.js.map +1 -1
  138. package/dist/runtime/core/eval/mixins/variables.d.ts.map +1 -1
  139. package/dist/runtime/core/eval/mixins/variables.js +143 -2
  140. package/dist/runtime/core/eval/mixins/variables.js.map +1 -1
  141. package/dist/runtime/core/types.d.ts +15 -2
  142. package/dist/runtime/core/types.d.ts.map +1 -1
  143. package/dist/runtime/core/types.js.map +1 -1
  144. package/dist/runtime/ext/extensions.d.ts +51 -0
  145. package/dist/runtime/ext/extensions.d.ts.map +1 -0
  146. package/dist/runtime/ext/extensions.js +67 -0
  147. package/dist/runtime/ext/extensions.js.map +1 -0
  148. package/dist/runtime/index.d.ts +3 -0
  149. package/dist/runtime/index.d.ts.map +1 -1
  150. package/dist/runtime/index.js +1 -0
  151. package/dist/runtime/index.js.map +1 -1
  152. package/dist/types.d.ts +8 -4
  153. package/dist/types.d.ts.map +1 -1
  154. package/dist/types.js +5 -4
  155. package/dist/types.js.map +1 -1
  156. package/docs/00_INDEX.md +1 -0
  157. package/docs/01_guide.md +3 -3
  158. package/docs/02_types.md +8 -10
  159. package/docs/03_variables.md +10 -0
  160. package/docs/04_operators.md +3 -3
  161. package/docs/05_control-flow.md +21 -0
  162. package/docs/07_collections.md +2 -0
  163. package/docs/10_parsing.md +9 -9
  164. package/docs/11_reference.md +1 -1
  165. package/docs/12_examples.md +36 -62
  166. package/docs/14_host-integration.md +116 -111
  167. package/docs/15_grammar.ebnf +1 -5
  168. package/docs/16_conventions.md +3 -4
  169. package/docs/17_cli-tools.md +184 -0
  170. package/docs/99_llm-reference.txt +46 -5
  171. package/package.json +13 -4
  172. package/dist/demo.d.ts +0 -6
  173. package/dist/demo.d.ts.map +0 -1
  174. package/dist/demo.js +0 -121
  175. package/dist/demo.js.map +0 -1
  176. package/dist/lexer.d.ts +0 -19
  177. package/dist/lexer.d.ts.map +0 -1
  178. package/dist/lexer.js +0 -344
  179. package/dist/lexer.js.map +0 -1
  180. package/dist/parser/arithmetic.d.ts +0 -16
  181. package/dist/parser/arithmetic.d.ts.map +0 -1
  182. package/dist/parser/arithmetic.js +0 -128
  183. package/dist/parser/arithmetic.js.map +0 -1
  184. package/dist/parser/boolean.d.ts +0 -15
  185. package/dist/parser/boolean.d.ts.map +0 -1
  186. package/dist/parser/boolean.js +0 -20
  187. package/dist/parser/boolean.js.map +0 -1
  188. package/dist/parser/control-flow.d.ts +0 -56
  189. package/dist/parser/control-flow.d.ts.map +0 -1
  190. package/dist/parser/control-flow.js +0 -167
  191. package/dist/parser/control-flow.js.map +0 -1
  192. package/dist/parser/expressions.d.ts +0 -23
  193. package/dist/parser/expressions.d.ts.map +0 -1
  194. package/dist/parser/expressions.js +0 -950
  195. package/dist/parser/expressions.js.map +0 -1
  196. package/dist/parser/extraction.d.ts +0 -48
  197. package/dist/parser/extraction.d.ts.map +0 -1
  198. package/dist/parser/extraction.js +0 -279
  199. package/dist/parser/extraction.js.map +0 -1
  200. package/dist/parser/functions.d.ts +0 -20
  201. package/dist/parser/functions.d.ts.map +0 -1
  202. package/dist/parser/functions.js +0 -96
  203. package/dist/parser/functions.js.map +0 -1
  204. package/dist/parser/literals.d.ts +0 -37
  205. package/dist/parser/literals.d.ts.map +0 -1
  206. package/dist/parser/literals.js +0 -373
  207. package/dist/parser/literals.js.map +0 -1
  208. package/dist/parser/script.d.ts +0 -14
  209. package/dist/parser/script.d.ts.map +0 -1
  210. package/dist/parser/script.js +0 -196
  211. package/dist/parser/script.js.map +0 -1
  212. package/dist/parser/variables.d.ts +0 -10
  213. package/dist/parser/variables.d.ts.map +0 -1
  214. package/dist/parser/variables.js +0 -215
  215. package/dist/parser/variables.js.map +0 -1
  216. package/dist/runtime/ast-equals.d.ts +0 -13
  217. package/dist/runtime/ast-equals.d.ts.map +0 -1
  218. package/dist/runtime/ast-equals.js +0 -447
  219. package/dist/runtime/ast-equals.js.map +0 -1
  220. package/dist/runtime/builtins.d.ts +0 -13
  221. package/dist/runtime/builtins.d.ts.map +0 -1
  222. package/dist/runtime/builtins.js +0 -180
  223. package/dist/runtime/builtins.js.map +0 -1
  224. package/dist/runtime/callable.d.ts +0 -88
  225. package/dist/runtime/callable.d.ts.map +0 -1
  226. package/dist/runtime/callable.js +0 -98
  227. package/dist/runtime/callable.js.map +0 -1
  228. package/dist/runtime/context.d.ts +0 -13
  229. package/dist/runtime/context.d.ts.map +0 -1
  230. package/dist/runtime/context.js +0 -73
  231. package/dist/runtime/context.js.map +0 -1
  232. package/dist/runtime/core/evaluate.d.ts +0 -42
  233. package/dist/runtime/core/evaluate.d.ts.map +0 -1
  234. package/dist/runtime/core/evaluate.debug.js +0 -1251
  235. package/dist/runtime/core/evaluate.js +0 -1913
  236. package/dist/runtime/core/evaluate.js.map +0 -1
  237. package/dist/runtime/evaluate.d.ts +0 -32
  238. package/dist/runtime/evaluate.d.ts.map +0 -1
  239. package/dist/runtime/evaluate.js +0 -1111
  240. package/dist/runtime/evaluate.js.map +0 -1
  241. package/dist/runtime/execute.d.ts +0 -26
  242. package/dist/runtime/execute.d.ts.map +0 -1
  243. package/dist/runtime/execute.js +0 -121
  244. package/dist/runtime/execute.js.map +0 -1
  245. package/dist/runtime/signals.d.ts +0 -19
  246. package/dist/runtime/signals.d.ts.map +0 -1
  247. package/dist/runtime/signals.js +0 -26
  248. package/dist/runtime/signals.js.map +0 -1
  249. package/dist/runtime/types.d.ts +0 -169
  250. package/dist/runtime/types.d.ts.map +0 -1
  251. package/dist/runtime/types.js +0 -50
  252. package/dist/runtime/types.js.map +0 -1
  253. package/dist/runtime/values.d.ts +0 -50
  254. package/dist/runtime/values.d.ts.map +0 -1
  255. package/dist/runtime/values.js +0 -209
  256. package/dist/runtime/values.js.map +0 -1
  257. package/dist/runtime.d.ts +0 -254
  258. package/dist/runtime.d.ts.map +0 -1
  259. package/dist/runtime.js +0 -2014
  260. package/dist/runtime.js.map +0 -1
@@ -0,0 +1,356 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * CLI Check Entry Point
4
+ *
5
+ * Implements argument parsing for rill-check.
6
+ * Validates Rill source files against linting rules.
7
+ */
8
+ import { VALIDATION_RULES, loadConfig, createDefaultConfig, validateScript, applyFixes, } from './check/index.js';
9
+ import { parse } from './parser/index.js';
10
+ import { ParseError } from './types.js';
11
+ /**
12
+ * Parse command-line arguments for rill-check
13
+ *
14
+ * @param argv - Raw command-line arguments (typically process.argv.slice(2))
15
+ * @returns Parsed command object
16
+ */
17
+ export function parseCheckArgs(argv) {
18
+ // Check for --help or --version flags in any position
19
+ if (argv.includes('--help') || argv.includes('-h')) {
20
+ return { mode: 'help' };
21
+ }
22
+ if (argv.includes('--version') || argv.includes('-v')) {
23
+ return { mode: 'version' };
24
+ }
25
+ // Extract flags
26
+ const fix = argv.includes('--fix');
27
+ const verbose = argv.includes('--verbose');
28
+ // Extract format flag
29
+ let format = 'text';
30
+ const formatIndex = argv.indexOf('--format');
31
+ if (formatIndex !== -1) {
32
+ const formatValue = argv[formatIndex + 1];
33
+ if (formatValue === 'text' || formatValue === 'json') {
34
+ format = formatValue;
35
+ }
36
+ else if (!formatValue || formatValue.startsWith('-')) {
37
+ throw new Error('--format requires argument: text or json');
38
+ }
39
+ else {
40
+ throw new Error(`Invalid format: ${formatValue}. Expected text or json`);
41
+ }
42
+ }
43
+ // Check for unknown flags
44
+ const knownFlags = new Set([
45
+ '--help',
46
+ '-h',
47
+ '--version',
48
+ '-v',
49
+ '--fix',
50
+ '--verbose',
51
+ '--format',
52
+ ]);
53
+ for (let i = 0; i < argv.length; i++) {
54
+ const arg = argv[i];
55
+ if (!arg)
56
+ continue;
57
+ // Skip non-flag arguments
58
+ if (!arg.startsWith('-')) {
59
+ continue;
60
+ }
61
+ // Skip format value argument
62
+ if (i > 0 && argv[i - 1] === '--format') {
63
+ continue;
64
+ }
65
+ // Check if unknown flag
66
+ if (!knownFlags.has(arg)) {
67
+ throw new Error(`Unknown option: ${arg}`);
68
+ }
69
+ }
70
+ // Extract file path (first non-flag argument)
71
+ let file;
72
+ for (let i = 0; i < argv.length; i++) {
73
+ const arg = argv[i];
74
+ if (!arg)
75
+ continue;
76
+ // Skip flags
77
+ if (arg.startsWith('-')) {
78
+ // Skip --format and its value
79
+ if (arg === '--format') {
80
+ i++; // Skip next argument (the format value)
81
+ }
82
+ continue;
83
+ }
84
+ // First non-flag argument is the file
85
+ file = arg;
86
+ break;
87
+ }
88
+ if (!file) {
89
+ throw new Error('Missing file argument');
90
+ }
91
+ return { mode: 'check', file, fix, verbose, format };
92
+ }
93
+ // ============================================================
94
+ // DIAGNOSTIC FORMATTING
95
+ // ============================================================
96
+ /**
97
+ * Format diagnostics for output
98
+ *
99
+ * Adapts pattern from cli-shared.ts formatError function.
100
+ * Text format: file:line:col: severity: message (code)
101
+ * JSON format: complete schema with errors array and summary
102
+ * Verbose mode: adds category field to diagnostics
103
+ *
104
+ * @param file - File path being checked
105
+ * @param diagnostics - Array of diagnostics to format
106
+ * @param format - Output format ('text' or 'json')
107
+ * @param verbose - Whether to include category and doc references
108
+ * @returns Formatted output string
109
+ */
110
+ export function formatDiagnostics(file, diagnostics, format, verbose) {
111
+ if (format === 'json') {
112
+ return formatDiagnosticsJSON(file, diagnostics, verbose);
113
+ }
114
+ return formatDiagnosticsText(file, diagnostics);
115
+ }
116
+ /**
117
+ * Format diagnostics as text
118
+ * Pattern: file:line:col: severity: message (code)
119
+ */
120
+ function formatDiagnosticsText(file, diagnostics) {
121
+ return diagnostics
122
+ .map((d) => {
123
+ const { line, column } = d.location;
124
+ return `${file}:${line}:${column}: ${d.severity}: ${d.message} (${d.code})`;
125
+ })
126
+ .join('\n');
127
+ }
128
+ /**
129
+ * Format diagnostics as JSON
130
+ * Includes file, errors array, and summary
131
+ */
132
+ function formatDiagnosticsJSON(file, diagnostics, verbose) {
133
+ // Build category lookup map from validation rules
134
+ const categoryMap = new Map();
135
+ for (const rule of VALIDATION_RULES) {
136
+ categoryMap.set(rule.code, rule.category);
137
+ }
138
+ // Format each diagnostic
139
+ const errors = diagnostics.map((d) => {
140
+ const error = {
141
+ location: {
142
+ line: d.location.line,
143
+ column: d.location.column,
144
+ offset: d.location.offset,
145
+ },
146
+ severity: d.severity,
147
+ code: d.code,
148
+ message: d.message,
149
+ context: d.context,
150
+ };
151
+ // Add category if verbose mode
152
+ if (verbose) {
153
+ const category = categoryMap.get(d.code);
154
+ if (category) {
155
+ error['category'] = category;
156
+ }
157
+ }
158
+ // Add fix if present
159
+ if (d.fix) {
160
+ error['fix'] = {
161
+ description: d.fix.description,
162
+ applicable: d.fix.applicable,
163
+ range: {
164
+ start: {
165
+ line: d.fix.range.start.line,
166
+ column: d.fix.range.start.column,
167
+ offset: d.fix.range.start.offset,
168
+ },
169
+ end: {
170
+ line: d.fix.range.end.line,
171
+ column: d.fix.range.end.column,
172
+ offset: d.fix.range.end.offset,
173
+ },
174
+ },
175
+ replacement: d.fix.replacement,
176
+ };
177
+ }
178
+ return error;
179
+ });
180
+ // Count diagnostics by severity
181
+ const summary = {
182
+ total: diagnostics.length,
183
+ errors: diagnostics.filter((d) => d.severity === 'error').length,
184
+ warnings: diagnostics.filter((d) => d.severity === 'warning').length,
185
+ info: diagnostics.filter((d) => d.severity === 'info').length,
186
+ };
187
+ const output = {
188
+ file,
189
+ errors,
190
+ summary,
191
+ };
192
+ return JSON.stringify(output, null, 2);
193
+ }
194
+ // ============================================================
195
+ // MAIN ENTRY POINT
196
+ // ============================================================
197
+ /**
198
+ * Main entry point for rill-check CLI.
199
+ * Orchestrates argument parsing, file reading, validation, fixing, and output.
200
+ */
201
+ async function main() {
202
+ try {
203
+ // Parse command-line arguments
204
+ const args = parseCheckArgs(process.argv.slice(2));
205
+ // Handle help mode
206
+ if (args.mode === 'help') {
207
+ console.log(`rill-check - Validate Rill scripts
208
+
209
+ Usage: rill-check [options] <file>
210
+
211
+ Options:
212
+ --fix Apply automatic fixes
213
+ --format <fmt> Output format: text (default) or json
214
+ --verbose Include category and documentation references
215
+ -h, --help Show this help message
216
+ -v, --version Show version number`);
217
+ process.exit(0);
218
+ }
219
+ // Handle version mode
220
+ if (args.mode === 'version') {
221
+ console.log('0.1.0');
222
+ process.exit(0);
223
+ }
224
+ // At this point, args.mode must be 'check'
225
+ // TypeScript needs explicit assertion after early returns
226
+ if (args.mode !== 'check') {
227
+ throw new Error('Unexpected mode');
228
+ }
229
+ // Load configuration from cwd (null if not present)
230
+ const config = loadConfig(process.cwd()) ?? createDefaultConfig();
231
+ // Read source file
232
+ let source;
233
+ try {
234
+ const fs = await import('node:fs');
235
+ // Check if file exists
236
+ if (!fs.existsSync(args.file)) {
237
+ console.error(`Error: File not found: ${args.file}`);
238
+ process.exit(2);
239
+ }
240
+ // Check if path is a directory
241
+ const stats = fs.statSync(args.file);
242
+ if (stats.isDirectory()) {
243
+ console.error(`Error: Path is a directory: ${args.file}`);
244
+ process.exit(2);
245
+ }
246
+ // Read file contents
247
+ source = fs.readFileSync(args.file, 'utf-8');
248
+ }
249
+ catch (err) {
250
+ // Handle read errors (permissions, etc.)
251
+ if (err instanceof Error &&
252
+ 'code' in err &&
253
+ typeof err.code === 'string') {
254
+ const code = err.code;
255
+ if (code === 'ENOENT') {
256
+ console.error(`Error: File not found: ${args.file}`);
257
+ }
258
+ else if (code === 'EISDIR') {
259
+ console.error(`Error: Path is a directory: ${args.file}`);
260
+ }
261
+ else {
262
+ console.error(`Error: Cannot read file: ${args.file}`);
263
+ }
264
+ }
265
+ else {
266
+ console.error(`Error: Cannot read file: ${args.file}`);
267
+ }
268
+ process.exit(2);
269
+ }
270
+ // Parse AST
271
+ let ast;
272
+ try {
273
+ ast = parse(source);
274
+ }
275
+ catch (err) {
276
+ // Handle parse errors
277
+ if (err instanceof ParseError) {
278
+ const location = err.location;
279
+ if (location) {
280
+ console.error(`${args.file}:${location.line}:${location.column}: parse error: ${err.message}`);
281
+ }
282
+ else {
283
+ console.error(`${args.file}: parse error: ${err.message}`);
284
+ }
285
+ // If --fix was requested, report that fixes cannot be applied
286
+ if (args.fix) {
287
+ console.error('Cannot apply fixes: file has parse errors');
288
+ }
289
+ process.exit(3);
290
+ }
291
+ throw err; // Re-throw unexpected errors
292
+ }
293
+ // Run validation
294
+ const diagnostics = validateScript(ast, source, config);
295
+ // Apply fixes if requested
296
+ if (args.fix && diagnostics.length > 0) {
297
+ const result = applyFixes(source, diagnostics, {
298
+ source,
299
+ ast,
300
+ config,
301
+ diagnostics: [],
302
+ variables: new Map(),
303
+ });
304
+ // Write fixed source back to file
305
+ if (result.applied > 0) {
306
+ const fs = await import('node:fs');
307
+ fs.writeFileSync(args.file, result.modified, 'utf-8');
308
+ }
309
+ // Report fix results to stderr
310
+ if (result.applied > 0 || result.skipped > 0) {
311
+ if (result.applied > 0) {
312
+ console.error(`Applied ${result.applied} fix${result.applied === 1 ? '' : 'es'}`);
313
+ }
314
+ if (result.skipped > 0) {
315
+ console.error(`Skipped ${result.skipped} fix${result.skipped === 1 ? '' : 'es'}`);
316
+ }
317
+ }
318
+ }
319
+ // Format and output diagnostics
320
+ if (diagnostics.length === 0) {
321
+ // No errors - success
322
+ if (args.format === 'json') {
323
+ console.log(JSON.stringify({
324
+ file: args.file,
325
+ errors: [],
326
+ summary: { total: 0, errors: 0, warnings: 0, info: 0 },
327
+ }, null, 2));
328
+ }
329
+ else {
330
+ console.log('No issues found');
331
+ }
332
+ process.exit(0);
333
+ }
334
+ else {
335
+ // Output diagnostics
336
+ const output = formatDiagnostics(args.file, diagnostics, args.format, args.verbose);
337
+ console.log(output);
338
+ process.exit(1);
339
+ }
340
+ }
341
+ catch (err) {
342
+ // Handle unexpected errors
343
+ if (err instanceof Error) {
344
+ console.error(`Error: ${err.message}`);
345
+ }
346
+ else {
347
+ console.error(`Error: ${String(err)}`);
348
+ }
349
+ process.exit(1);
350
+ }
351
+ }
352
+ // Only run main if this is the entry point (not imported)
353
+ if (import.meta.url === `file://${process.argv[1]}`) {
354
+ main();
355
+ }
356
+ //# sourceMappingURL=cli-check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-check.js","sourceRoot":"","sources":["../src/cli-check.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Rill CLI - Evaluate rill expressions
4
+ *
5
+ * Usage:
6
+ * rill-eval '"hello".len'
7
+ * rill-eval --help
8
+ * rill-eval --version
9
+ */
10
+ import { type ExecutionResult } from './index.js';
11
+ /**
12
+ * Evaluate a Rill expression without file context
13
+ */
14
+ export declare function evaluateExpression(expression: string): Promise<ExecutionResult>;
15
+ //# sourceMappingURL=cli-eval.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-eval.d.ts","sourceRoot":"","sources":["../src/cli-eval.ts"],"names":[],"mappings":";AACA;;;;;;;GAOG;AAEH,OAAO,EAIL,KAAK,eAAe,EACrB,MAAM,YAAY,CAAC;AAwCpB;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,eAAe,CAAC,CAY1B"}
@@ -0,0 +1,120 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Rill CLI - Evaluate rill expressions
4
+ *
5
+ * Usage:
6
+ * rill-eval '"hello".len'
7
+ * rill-eval --help
8
+ * rill-eval --version
9
+ */
10
+ import { createRuntimeContext, execute, parse, } from './index.js';
11
+ import { formatOutput, determineExitCode } from './cli-shared.js';
12
+ import * as fs from 'fs';
13
+ /**
14
+ * Parse command-line arguments into structured command
15
+ */
16
+ function parseArgs(argv) {
17
+ // Check for --help and --version in any position
18
+ if (argv.includes('--help')) {
19
+ return { mode: 'help' };
20
+ }
21
+ if (argv.includes('--version')) {
22
+ return { mode: 'version' };
23
+ }
24
+ // Check for unknown flags (anything starting with -)
25
+ for (const arg of argv) {
26
+ if (arg.startsWith('-') && arg !== '-') {
27
+ throw new Error(`Unknown option: ${arg}`);
28
+ }
29
+ }
30
+ // If no arguments, default to help
31
+ if (argv.length === 0) {
32
+ return { mode: 'help' };
33
+ }
34
+ // First positional arg determines mode
35
+ const firstArg = argv[0];
36
+ // Eval mode: direct expression
37
+ return { mode: 'eval', expression: firstArg };
38
+ }
39
+ /**
40
+ * Evaluate a Rill expression without file context
41
+ */
42
+ export async function evaluateExpression(expression) {
43
+ const ctx = createRuntimeContext({
44
+ callbacks: {
45
+ onLog: (value) => console.log(formatOutput(value)),
46
+ },
47
+ });
48
+ // Set pipeValue to empty list (Rill has no null concept per language spec)
49
+ ctx.pipeValue = [];
50
+ const ast = parse(expression);
51
+ return execute(ast, ctx);
52
+ }
53
+ /**
54
+ * Display help information
55
+ */
56
+ function showHelp() {
57
+ console.log(`Rill Expression Evaluator
58
+
59
+ Usage:
60
+ rill-eval <expression> Evaluate a Rill expression
61
+ rill-eval --help Show this help message
62
+ rill-eval --version Show version information
63
+
64
+ Examples:
65
+ rill-eval '"hello".len'
66
+ rill-eval '5 + 3'
67
+ rill-eval '[1, 2, 3] -> map |x|($x * 2)'`);
68
+ }
69
+ /**
70
+ * Display version information
71
+ */
72
+ function showVersion() {
73
+ // Read version from package.json
74
+ const packageJsonPath = new URL('../package.json', import.meta.url);
75
+ const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'));
76
+ console.log(`rill-eval ${packageJson.version}`);
77
+ }
78
+ /**
79
+ * Entry point for rill-eval binary
80
+ */
81
+ async function main() {
82
+ try {
83
+ const args = process.argv.slice(2);
84
+ const command = parseArgs(args);
85
+ if (command.mode === 'help') {
86
+ showHelp();
87
+ return;
88
+ }
89
+ if (command.mode === 'version') {
90
+ showVersion();
91
+ return;
92
+ }
93
+ if (command.mode === 'eval') {
94
+ const result = await evaluateExpression(command.expression);
95
+ const { code, message } = determineExitCode(result.value);
96
+ if (message !== undefined) {
97
+ console.log(message);
98
+ }
99
+ else {
100
+ console.log(formatOutput(result.value));
101
+ }
102
+ process.exit(code);
103
+ }
104
+ // Unreachable - exec mode not supported in rill-eval
105
+ console.error('Unexpected command mode');
106
+ process.exit(1);
107
+ }
108
+ catch (err) {
109
+ console.error(err instanceof Error ? err.message : String(err));
110
+ process.exit(1);
111
+ }
112
+ }
113
+ // Only run main if this is the entry point (not imported)
114
+ const shouldRunMain = process.env['NODE_ENV'] !== 'test' &&
115
+ !process.env['VITEST'] &&
116
+ !process.env['VITEST_WORKER_ID'];
117
+ if (shouldRunMain) {
118
+ main();
119
+ }
120
+ //# sourceMappingURL=cli-eval.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-eval.js","sourceRoot":"","sources":["../src/cli-eval.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * CLI Execution Entry Point
4
+ *
5
+ * Implements main(), parseArgs(), and executeScript() for rill-exec and rill-eval binaries.
6
+ * Handles file execution, stdin input, and module loading.
7
+ */
8
+ import type { ExecutionResult } from './index.js';
9
+ /**
10
+ * Parsed command-line arguments
11
+ */
12
+ export type ParsedArgs = {
13
+ mode: 'exec';
14
+ file: string;
15
+ args: string[];
16
+ } | {
17
+ mode: 'eval';
18
+ expression: string;
19
+ } | {
20
+ mode: 'help' | 'version';
21
+ };
22
+ /**
23
+ * Parse command-line arguments into structured command
24
+ *
25
+ * @param argv - Raw command-line arguments (typically process.argv.slice(2))
26
+ * @returns Parsed command object
27
+ */
28
+ export declare function parseArgs(argv: string[]): ParsedArgs;
29
+ /**
30
+ * Execute a Rill script file with arguments and module support
31
+ *
32
+ * @param file - File path or '-' for stdin
33
+ * @param args - Command-line arguments to pass as $ pipe value
34
+ * @param options - Execution options
35
+ * @returns Execution result with value and variables
36
+ * @throws Error if file not found or execution fails
37
+ */
38
+ export declare function executeScript(file: string, args: string[], options?: {
39
+ stdin?: boolean;
40
+ }): Promise<ExecutionResult>;
41
+ /**
42
+ * Entry point for rill-exec and rill-eval binaries
43
+ *
44
+ * Parses command-line arguments, executes scripts, and handles errors.
45
+ * Writes results to stdout and errors to stderr.
46
+ * Sets process.exit(1) on any error.
47
+ */
48
+ export declare function main(): Promise<void>;
49
+ //# sourceMappingURL=cli-exec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-exec.d.ts","sourceRoot":"","sources":["../src/cli-exec.ts"],"names":[],"mappings":";AACA;;;;;GAKG;AAOH,OAAO,KAAK,EAAa,eAAe,EAAE,MAAM,YAAY,CAAC;AAI7D;;GAEG;AACH,MAAM,MAAM,UAAU,GAClB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,GAC9C;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GACpC;IAAE,IAAI,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,CAAC;AAEjC;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,CAuCpD;AAED;;;;;;;;GAQG;AACH,wBAAsB,aAAa,CACjC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,GAC5B,OAAO,CAAC,eAAe,CAAC,CA0D1B;AAED;;;;;;GAMG;AACH,wBAAsB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAsE1C"}