@rcrsr/rill-cli 0.6.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 (171) hide show
  1. package/LICENSE +21 -0
  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 +481 -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 +370 -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 +134 -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 +143 -0
  35. package/dist/check/rules/formatting.d.ts.map +1 -0
  36. package/dist/check/rules/formatting.js +656 -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 +77 -0
  47. package/dist/check/rules/loops.d.ts.map +1 -0
  48. package/dist/check/rules/loops.js +310 -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 +174 -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 +79 -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 +167 -0
  61. package/dist/check/rules/types.js.map +1 -0
  62. package/dist/check/types.d.ts +112 -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 +110 -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 +259 -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 +366 -0
  77. package/dist/cli-check.js.map +1 -0
  78. package/dist/cli-error-enrichment.d.ts +73 -0
  79. package/dist/cli-error-enrichment.d.ts.map +1 -0
  80. package/dist/cli-error-enrichment.js +205 -0
  81. package/dist/cli-error-enrichment.js.map +1 -0
  82. package/dist/cli-error-formatter.d.ts +45 -0
  83. package/dist/cli-error-formatter.d.ts.map +1 -0
  84. package/dist/cli-error-formatter.js +218 -0
  85. package/dist/cli-error-formatter.js.map +1 -0
  86. package/dist/cli-eval.d.ts +15 -0
  87. package/dist/cli-eval.d.ts.map +1 -0
  88. package/dist/cli-eval.js +116 -0
  89. package/dist/cli-eval.js.map +1 -0
  90. package/dist/cli-exec.d.ts +58 -0
  91. package/dist/cli-exec.d.ts.map +1 -0
  92. package/dist/cli-exec.js +326 -0
  93. package/dist/cli-exec.js.map +1 -0
  94. package/dist/cli-explain.d.ts +24 -0
  95. package/dist/cli-explain.d.ts.map +1 -0
  96. package/dist/cli-explain.js +68 -0
  97. package/dist/cli-explain.js.map +1 -0
  98. package/dist/cli-lsp-diagnostic.d.ts +35 -0
  99. package/dist/cli-lsp-diagnostic.d.ts.map +1 -0
  100. package/dist/cli-lsp-diagnostic.js +98 -0
  101. package/dist/cli-lsp-diagnostic.js.map +1 -0
  102. package/dist/cli-module-loader.d.ts +19 -0
  103. package/dist/cli-module-loader.d.ts.map +1 -0
  104. package/dist/cli-module-loader.js +83 -0
  105. package/dist/cli-module-loader.js.map +1 -0
  106. package/dist/cli-shared.d.ts +62 -0
  107. package/dist/cli-shared.d.ts.map +1 -0
  108. package/dist/cli-shared.js +158 -0
  109. package/dist/cli-shared.js.map +1 -0
  110. package/dist/cli.d.ts +13 -0
  111. package/dist/cli.d.ts.map +1 -0
  112. package/dist/cli.js +62 -0
  113. package/dist/cli.js.map +1 -0
  114. package/dist/test-internal-import.d.ts +2 -0
  115. package/dist/test-internal-import.d.ts.map +1 -0
  116. package/dist/test-internal-import.js +7 -0
  117. package/dist/test-internal-import.js.map +1 -0
  118. package/package.json +24 -0
  119. package/src/check/config.ts +202 -0
  120. package/src/check/fixer.ts +174 -0
  121. package/src/check/index.ts +39 -0
  122. package/src/check/rules/anti-patterns.ts +585 -0
  123. package/src/check/rules/closures.ts +445 -0
  124. package/src/check/rules/collections.ts +437 -0
  125. package/src/check/rules/conditionals.ts +155 -0
  126. package/src/check/rules/flow.ts +262 -0
  127. package/src/check/rules/formatting.ts +811 -0
  128. package/src/check/rules/helpers.ts +89 -0
  129. package/src/check/rules/index.ts +140 -0
  130. package/src/check/rules/loops.ts +372 -0
  131. package/src/check/rules/naming.ts +242 -0
  132. package/src/check/rules/strings.ts +104 -0
  133. package/src/check/rules/types.ts +214 -0
  134. package/src/check/types.ts +163 -0
  135. package/src/check/validator.ts +136 -0
  136. package/src/check/visitor.ts +338 -0
  137. package/src/cli-check.ts +456 -0
  138. package/src/cli-error-enrichment.ts +274 -0
  139. package/src/cli-error-formatter.ts +313 -0
  140. package/src/cli-eval.ts +145 -0
  141. package/src/cli-exec.ts +408 -0
  142. package/src/cli-explain.ts +76 -0
  143. package/src/cli-lsp-diagnostic.ts +132 -0
  144. package/src/cli-module-loader.ts +101 -0
  145. package/src/cli-shared.ts +187 -0
  146. package/tests/check/cli-check.test.ts +189 -0
  147. package/tests/check/config.test.ts +350 -0
  148. package/tests/check/fixer.test.ts +373 -0
  149. package/tests/check/format-diagnostics.test.ts +327 -0
  150. package/tests/check/rules/anti-patterns.test.ts +467 -0
  151. package/tests/check/rules/closures.test.ts +192 -0
  152. package/tests/check/rules/collections.test.ts +380 -0
  153. package/tests/check/rules/conditionals.test.ts +185 -0
  154. package/tests/check/rules/flow.test.ts +250 -0
  155. package/tests/check/rules/formatting.test.ts +755 -0
  156. package/tests/check/rules/loops.test.ts +334 -0
  157. package/tests/check/rules/naming.test.ts +336 -0
  158. package/tests/check/rules/strings.test.ts +129 -0
  159. package/tests/check/rules/types.test.ts +257 -0
  160. package/tests/check/validator.test.ts +444 -0
  161. package/tests/check/visitor.test.ts +171 -0
  162. package/tests/cli/check.test.ts +801 -0
  163. package/tests/cli/error-enrichment.test.ts +510 -0
  164. package/tests/cli/error-formatter.test.ts +631 -0
  165. package/tests/cli/eval.test.ts +85 -0
  166. package/tests/cli/exec.test.ts +537 -0
  167. package/tests/cli-explain.test.ts +249 -0
  168. package/tests/cli-lsp-diagnostic.test.ts +202 -0
  169. package/tests/cli-shared.test.ts +439 -0
  170. package/tsconfig.json +9 -0
  171. package/tsconfig.tsbuildinfo +1 -0
@@ -0,0 +1,326 @@
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 * as fs from 'fs/promises';
9
+ import * as fsSync from 'fs';
10
+ import * as path from 'path';
11
+ import * as yaml from 'yaml';
12
+ import { parse, execute, createRuntimeContext } from '@rcrsr/rill';
13
+ import { formatOutput, formatError, determineExitCode, VERSION, detectHelpVersionFlag, } from './cli-shared.js';
14
+ import { loadModule } from './cli-module-loader.js';
15
+ import { explainError } from './cli-explain.js';
16
+ /**
17
+ * Parse command-line arguments into structured command
18
+ *
19
+ * @param argv - Raw command-line arguments (typically process.argv.slice(2))
20
+ * @returns Parsed command object
21
+ */
22
+ export function parseArgs(argv) {
23
+ // Check for --help or --version flags in any position
24
+ const helpVersionFlag = detectHelpVersionFlag(argv);
25
+ if (helpVersionFlag !== null) {
26
+ return helpVersionFlag;
27
+ }
28
+ // Check for --explain flag (IC-11)
29
+ const explainIndex = argv.findIndex((arg) => arg === '--explain');
30
+ if (explainIndex !== -1) {
31
+ const errorId = argv[explainIndex + 1];
32
+ if (!errorId) {
33
+ throw new Error('Missing error ID after --explain');
34
+ }
35
+ return { mode: 'explain', errorId };
36
+ }
37
+ // Parse format, verbose, and max-stack-depth flags (IC-11)
38
+ let format = 'human';
39
+ let verbose = false;
40
+ let maxStackDepth = 10;
41
+ const formatIndex = argv.findIndex((arg) => arg === '--format');
42
+ if (formatIndex !== -1) {
43
+ const formatValue = argv[formatIndex + 1];
44
+ // AC-15: Unknown --format value
45
+ if (formatValue !== 'human' &&
46
+ formatValue !== 'json' &&
47
+ formatValue !== 'compact') {
48
+ throw new Error(`Invalid --format value: ${formatValue}. Must be one of: human, json, compact`);
49
+ }
50
+ format = formatValue;
51
+ }
52
+ if (argv.includes('--verbose')) {
53
+ verbose = true;
54
+ }
55
+ const maxStackDepthIndex = argv.findIndex((arg) => arg === '--max-stack-depth');
56
+ if (maxStackDepthIndex !== -1) {
57
+ const depthValue = argv[maxStackDepthIndex + 1];
58
+ if (!depthValue) {
59
+ throw new Error('Missing value after --max-stack-depth');
60
+ }
61
+ const depth = parseInt(depthValue, 10);
62
+ if (isNaN(depth) || depth < 1 || depth > 100) {
63
+ throw new Error('--max-stack-depth must be a number between 1 and 100');
64
+ }
65
+ maxStackDepth = depth;
66
+ }
67
+ // Check for unknown flags
68
+ const knownFlags = [
69
+ '--help',
70
+ '-h',
71
+ '--version',
72
+ '-v',
73
+ '--explain',
74
+ '--format',
75
+ '--verbose',
76
+ '--max-stack-depth',
77
+ ];
78
+ for (let i = 0; i < argv.length; i++) {
79
+ const arg = argv[i];
80
+ if (arg && arg.startsWith('--')) {
81
+ if (!knownFlags.includes(arg)) {
82
+ throw new Error(`Unknown option: ${arg}`);
83
+ }
84
+ // Skip next argument if this is a flag that takes a value
85
+ if (arg === '--format' ||
86
+ arg === '--max-stack-depth' ||
87
+ arg === '--explain') {
88
+ i++;
89
+ }
90
+ }
91
+ else if (arg && arg.startsWith('-') && arg !== '-') {
92
+ if (!knownFlags.includes(arg)) {
93
+ throw new Error(`Unknown option: ${arg}`);
94
+ }
95
+ }
96
+ }
97
+ // Determine mode from first positional argument (skip flags and their values)
98
+ let firstArg;
99
+ const positionalArgs = [];
100
+ for (let i = 0; i < argv.length; i++) {
101
+ const arg = argv[i];
102
+ if (!arg)
103
+ continue;
104
+ // Skip flags
105
+ if (knownFlags.includes(arg)) {
106
+ // Skip the flag's value if it takes one
107
+ if (arg === '--format' ||
108
+ arg === '--max-stack-depth' ||
109
+ arg === '--explain') {
110
+ i++;
111
+ }
112
+ continue;
113
+ }
114
+ // This is a positional argument
115
+ if (!firstArg) {
116
+ firstArg = arg;
117
+ }
118
+ positionalArgs.push(arg);
119
+ }
120
+ if (!firstArg) {
121
+ throw new Error('Missing file argument');
122
+ }
123
+ // Eval mode is not supported in rill-exec (only rill-eval)
124
+ // This function is shared but context determines valid modes
125
+ if (firstArg === '-e') {
126
+ if (positionalArgs.length < 2) {
127
+ throw new Error('Missing expression after -e');
128
+ }
129
+ return { mode: 'eval', expression: positionalArgs[1] };
130
+ }
131
+ // Exec mode (file or stdin)
132
+ const file = firstArg;
133
+ const args = positionalArgs.slice(1);
134
+ return { mode: 'exec', file, args, format, verbose, maxStackDepth };
135
+ }
136
+ /**
137
+ * Execute a Rill script file with arguments and module support
138
+ *
139
+ * @param file - File path or '-' for stdin
140
+ * @param args - Command-line arguments to pass as $ pipe value
141
+ * @param options - Execution options
142
+ * @returns Execution result with value, variables, and source text
143
+ * @throws Error if file not found or execution fails
144
+ */
145
+ export async function executeScript(file, args, options) {
146
+ // Use pre-read source if provided, otherwise read from file or stdin
147
+ let source;
148
+ let scriptPath;
149
+ if (options?.source !== undefined) {
150
+ source = options.source;
151
+ scriptPath =
152
+ file === '-'
153
+ ? path.resolve(process.cwd(), '<stdin>')
154
+ : path.resolve(file);
155
+ }
156
+ else if (file === '-' || options?.stdin) {
157
+ // Read from stdin (must use sync API for stdin)
158
+ source = fsSync.readFileSync(0, 'utf-8');
159
+ scriptPath = path.resolve(process.cwd(), '<stdin>');
160
+ }
161
+ else {
162
+ // Check if file exists
163
+ try {
164
+ await fs.access(file);
165
+ }
166
+ catch {
167
+ throw new Error(`File not found: ${file}`);
168
+ }
169
+ // Read from file
170
+ source = await fs.readFile(file, 'utf-8');
171
+ scriptPath = path.resolve(file);
172
+ }
173
+ // Parse the script
174
+ const ast = parse(source);
175
+ // Extract frontmatter for use: declarations
176
+ const frontmatter = ast.frontmatter
177
+ ? (yaml.parse(ast.frontmatter.content) ?? {})
178
+ : {};
179
+ // Load modules if use: declarations exist
180
+ const variables = {};
181
+ if (frontmatter['use'] && Array.isArray(frontmatter['use'])) {
182
+ const cache = new Map();
183
+ for (const entry of frontmatter['use']) {
184
+ if (typeof entry === 'object' && entry !== null) {
185
+ const [name, modulePath] = Object.entries(entry)[0];
186
+ variables[name] = await loadModule(modulePath, scriptPath, cache);
187
+ }
188
+ }
189
+ }
190
+ // Create runtime context with modules
191
+ const ctx = createRuntimeContext({
192
+ variables,
193
+ callbacks: {
194
+ onLog: (value) => console.log(formatOutput(value)),
195
+ },
196
+ });
197
+ // Set pipe value to arguments (string array)
198
+ ctx.pipeValue = args;
199
+ // Execute the script and return with source
200
+ const result = await execute(ast, ctx);
201
+ return { ...result, source };
202
+ }
203
+ /**
204
+ * Entry point for rill-exec and rill-eval binaries
205
+ *
206
+ * Parses command-line arguments, executes scripts, and handles errors.
207
+ * Writes results to stdout and errors to stderr.
208
+ * Sets process.exit(1) on any error.
209
+ */
210
+ export async function main() {
211
+ let source;
212
+ let formatOptions;
213
+ try {
214
+ const parsed = parseArgs(process.argv.slice(2));
215
+ switch (parsed.mode) {
216
+ case 'help':
217
+ console.log(`Usage:
218
+ rill-exec <script.rill> [args...] Execute a Rill script file
219
+ rill-exec - Read script from stdin
220
+ rill-exec --help Show this help message
221
+ rill-exec --version Show version information
222
+ rill-exec --explain RILL-XXXX Show error documentation
223
+
224
+ Options:
225
+ --format <format> Output format: human, json, compact (default: human)
226
+ --verbose Include additional error details
227
+ --max-stack-depth <n> Maximum call stack depth to display (default: 10, range: 1-100)
228
+
229
+ Arguments:
230
+ args are passed to the script as a list of strings in $ (pipe value)
231
+
232
+ Examples:
233
+ rill-exec script.rill
234
+ rill-exec script.rill arg1 arg2
235
+ rill-exec --format json script.rill
236
+ rill-exec --verbose --max-stack-depth 20 script.rill
237
+ rill-exec --explain RILL-R009
238
+ echo "log(\\"hello\\")" | rill-exec -`);
239
+ return;
240
+ case 'version': {
241
+ console.log(VERSION);
242
+ return;
243
+ }
244
+ case 'explain': {
245
+ // AC-16: Handle --explain command
246
+ const documentation = explainError(parsed.errorId);
247
+ if (documentation === null) {
248
+ // AC-16: Malformed errorId shows usage help
249
+ console.error(`Invalid error ID: ${parsed.errorId}`);
250
+ console.error('Error ID must be in format RILL-{L|P|R|C}{3-digit}, e.g., RILL-R009');
251
+ process.exit(1);
252
+ return;
253
+ }
254
+ console.log(documentation);
255
+ return;
256
+ }
257
+ case 'eval':
258
+ // This shouldn't happen in rill-exec, but handle it anyway
259
+ console.error('Eval mode not supported in rill-exec. Use rill-eval instead.');
260
+ process.exit(1);
261
+ return;
262
+ case 'exec': {
263
+ // Store format options for error handling
264
+ formatOptions = {
265
+ format: parsed.format,
266
+ verbose: parsed.verbose,
267
+ maxStackDepth: parsed.maxStackDepth,
268
+ };
269
+ // Read source early so it's available for error enrichment even if parsing fails
270
+ if (parsed.file === '-') {
271
+ source = fsSync.readFileSync(0, 'utf-8');
272
+ }
273
+ else {
274
+ try {
275
+ source = await fs.readFile(parsed.file, 'utf-8');
276
+ }
277
+ catch {
278
+ throw new Error(`File not found: ${parsed.file}`);
279
+ }
280
+ }
281
+ // Execute mode
282
+ const result = await executeScript(parsed.file, parsed.args, {
283
+ source,
284
+ });
285
+ const { code, message } = determineExitCode(result.value);
286
+ // Output message if present, otherwise output the result value
287
+ if (message !== undefined) {
288
+ console.log(message);
289
+ }
290
+ else {
291
+ console.log(formatOutput(result.value));
292
+ }
293
+ // Exit with computed code
294
+ process.exit(code);
295
+ }
296
+ }
297
+ }
298
+ catch (err) {
299
+ if (err instanceof Error) {
300
+ // IC-11: Pass source text and format options to formatError
301
+ console.error(formatError(err, source, {
302
+ format: formatOptions?.format ?? 'human',
303
+ verbose: formatOptions?.verbose ?? false,
304
+ includeCallStack: true,
305
+ maxCallStackDepth: formatOptions?.maxStackDepth ?? 10,
306
+ }));
307
+ }
308
+ else {
309
+ console.error(formatError(new Error(String(err)), source, {
310
+ format: formatOptions?.format ?? 'human',
311
+ verbose: formatOptions?.verbose ?? false,
312
+ includeCallStack: true,
313
+ maxCallStackDepth: formatOptions?.maxStackDepth ?? 10,
314
+ }));
315
+ }
316
+ process.exit(1);
317
+ }
318
+ }
319
+ // Only run main if not in test environment
320
+ const shouldRunMain = process.env['NODE_ENV'] !== 'test' &&
321
+ !process.env['VITEST'] &&
322
+ !process.env['VITEST_WORKER_ID'];
323
+ if (shouldRunMain) {
324
+ main();
325
+ }
326
+ //# sourceMappingURL=cli-exec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-exec.js","sourceRoot":"","sources":["../src/cli-exec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * CLI Error Explanation
3
+ * Function for rendering full error documentation
4
+ */
5
+ /**
6
+ * Render full error documentation for --explain command.
7
+ *
8
+ * Constraints:
9
+ * - Lookup from ERROR_REGISTRY
10
+ * - Renders cause, resolution, examples sections
11
+ *
12
+ * @param errorId - Error identifier (format: RILL-{category}{3-digit})
13
+ * @returns Formatted documentation string, or null if errorId is invalid/unknown
14
+ *
15
+ * @example
16
+ * explainError("RILL-R009")
17
+ * // Returns: formatted documentation with cause, resolution, examples
18
+ *
19
+ * @example
20
+ * explainError("invalid")
21
+ * // Returns: null
22
+ */
23
+ export declare function explainError(errorId: string): string | null;
24
+ //# sourceMappingURL=cli-explain.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-explain.d.ts","sourceRoot":"","sources":["../src/cli-explain.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAkD3D"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * CLI Error Explanation
3
+ * Function for rendering full error documentation
4
+ */
5
+ import { ERROR_REGISTRY } from '@rcrsr/rill';
6
+ /**
7
+ * Render full error documentation for --explain command.
8
+ *
9
+ * Constraints:
10
+ * - Lookup from ERROR_REGISTRY
11
+ * - Renders cause, resolution, examples sections
12
+ *
13
+ * @param errorId - Error identifier (format: RILL-{category}{3-digit})
14
+ * @returns Formatted documentation string, or null if errorId is invalid/unknown
15
+ *
16
+ * @example
17
+ * explainError("RILL-R009")
18
+ * // Returns: formatted documentation with cause, resolution, examples
19
+ *
20
+ * @example
21
+ * explainError("invalid")
22
+ * // Returns: null
23
+ */
24
+ export function explainError(errorId) {
25
+ // EC-12: Invalid errorId format returns null
26
+ const errorIdPattern = /^RILL-[LPRC]\d{3}$/;
27
+ if (!errorIdPattern.test(errorId)) {
28
+ return null;
29
+ }
30
+ // EC-13: Unknown errorId returns null
31
+ const definition = ERROR_REGISTRY.get(errorId);
32
+ if (!definition) {
33
+ return null;
34
+ }
35
+ // Build documentation sections
36
+ const sections = [];
37
+ // Header: errorId and description
38
+ sections.push(`${definition.errorId}: ${definition.description}`);
39
+ sections.push('');
40
+ // Cause section (if present)
41
+ if (definition.cause) {
42
+ sections.push('Cause:');
43
+ sections.push(` ${definition.cause}`);
44
+ sections.push('');
45
+ }
46
+ // Resolution section (if present)
47
+ if (definition.resolution) {
48
+ sections.push('Resolution:');
49
+ sections.push(` ${definition.resolution}`);
50
+ sections.push('');
51
+ }
52
+ // Examples section (if present)
53
+ if (definition.examples && definition.examples.length > 0) {
54
+ sections.push('Examples:');
55
+ for (const example of definition.examples) {
56
+ sections.push(` ${example.description}`);
57
+ sections.push('');
58
+ // Indent code block
59
+ const codeLines = example.code.split('\n');
60
+ for (const line of codeLines) {
61
+ sections.push(` ${line}`);
62
+ }
63
+ sections.push('');
64
+ }
65
+ }
66
+ return sections.join('\n').trimEnd();
67
+ }
68
+ //# sourceMappingURL=cli-explain.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-explain.js","sourceRoot":"","sources":["../src/cli-explain.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,YAAY,CAAC,OAAe;IAC1C,6CAA6C;IAC7C,MAAM,cAAc,GAAG,oBAAoB,CAAC;IAC5C,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAClC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,sCAAsC;IACtC,MAAM,UAAU,GAAG,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAC/C,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,+BAA+B;IAC/B,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,kCAAkC;IAClC,QAAQ,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,OAAO,KAAK,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC;IAClE,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAElB,6BAA6B;IAC7B,IAAI,UAAU,CAAC,KAAK,EAAE,CAAC;QACrB,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACxB,QAAQ,CAAC,IAAI,CAAC,KAAK,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC;QACvC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC;IAED,kCAAkC;IAClC,IAAI,UAAU,CAAC,UAAU,EAAE,CAAC;QAC1B,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAC7B,QAAQ,CAAC,IAAI,CAAC,KAAK,UAAU,CAAC,UAAU,EAAE,CAAC,CAAC;QAC5C,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC;IAED,gCAAgC;IAChC,IAAI,UAAU,CAAC,QAAQ,IAAI,UAAU,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1D,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC3B,KAAK,MAAM,OAAO,IAAI,UAAU,CAAC,QAAQ,EAAE,CAAC;YAC1C,QAAQ,CAAC,IAAI,CAAC,KAAK,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;YAC1C,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAClB,oBAAoB;YACpB,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC3C,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;gBAC7B,QAAQ,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;YAC/B,CAAC;YACD,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACpB,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;AACvC,CAAC"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * CLI LSP Diagnostic Conversion
3
+ * Convert RillError to LSP Diagnostic format
4
+ */
5
+ import type { RillError } from '@rcrsr/rill';
6
+ export interface LspDiagnostic {
7
+ readonly range: LspRange | null;
8
+ readonly severity: 1 | 2 | 3;
9
+ readonly code: string;
10
+ readonly source: 'rill';
11
+ readonly message: string;
12
+ readonly suggestions?: string[] | undefined;
13
+ }
14
+ export interface LspRange {
15
+ readonly start: LspPosition;
16
+ readonly end: LspPosition;
17
+ }
18
+ export interface LspPosition {
19
+ readonly line: number;
20
+ readonly character: number;
21
+ }
22
+ /**
23
+ * Convert RillError to LSP Diagnostic format.
24
+ *
25
+ * Constraints:
26
+ * - LSP uses zero-based line/character positions
27
+ * - Severity mapping: Error=1, Warning=2, Info=3
28
+ * - Source is always 'rill'
29
+ * - Returns diagnostic with null range when error has no span
30
+ *
31
+ * @param error - RillError to convert
32
+ * @returns LSP Diagnostic
33
+ */
34
+ export declare function toLspDiagnostic(error: RillError): LspDiagnostic;
35
+ //# sourceMappingURL=cli-lsp-diagnostic.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-lsp-diagnostic.d.ts","sourceRoot":"","sources":["../src/cli-lsp-diagnostic.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAiC,MAAM,aAAa,CAAC;AAO5E,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI,CAAC;IAChC,QAAQ,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;CAC7C;AAED,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;IAC5B,QAAQ,CAAC,GAAG,EAAE,WAAW,CAAC;CAC3B;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAMD;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,SAAS,GAAG,aAAa,CA8C/D"}
@@ -0,0 +1,98 @@
1
+ /**
2
+ * CLI LSP Diagnostic Conversion
3
+ * Convert RillError to LSP Diagnostic format
4
+ */
5
+ import { ERROR_REGISTRY } from '@rcrsr/rill';
6
+ // ============================================================
7
+ // LSP DIAGNOSTIC CONVERSION
8
+ // ============================================================
9
+ /**
10
+ * Convert RillError to LSP Diagnostic format.
11
+ *
12
+ * Constraints:
13
+ * - LSP uses zero-based line/character positions
14
+ * - Severity mapping: Error=1, Warning=2, Info=3
15
+ * - Source is always 'rill'
16
+ * - Returns diagnostic with null range when error has no span
17
+ *
18
+ * @param error - RillError to convert
19
+ * @returns LSP Diagnostic
20
+ */
21
+ export function toLspDiagnostic(error) {
22
+ // Get error definition for severity mapping
23
+ const definition = ERROR_REGISTRY.get(error.errorId);
24
+ const errorSeverity = definition?.severity ?? 'error';
25
+ // Map ErrorSeverity to LSP severity (Error=1, Warning=2, Info=3)
26
+ const severity = mapSeverityToLsp(errorSeverity);
27
+ // Extract message without location suffix
28
+ const message = error.message.replace(/ at \d+:\d+$/, '');
29
+ // Convert span to LSP range (zero-based positions)
30
+ // EC-11: Missing span returns diagnostic with null range
31
+ const range = error.location
32
+ ? {
33
+ start: sourceLocationToLspPosition(error.location),
34
+ end: sourceLocationToLspPosition(error.location),
35
+ }
36
+ : null;
37
+ // Extract suggestions if present (max 3)
38
+ const errorData = error.toData();
39
+ const contextSuggestions = errorData.context?.['suggestions'];
40
+ let suggestions;
41
+ if (contextSuggestions) {
42
+ if (Array.isArray(contextSuggestions) && contextSuggestions.length > 0) {
43
+ const filtered = contextSuggestions
44
+ .slice(0, 3)
45
+ .map((s) => String(s))
46
+ .filter((s) => s.length > 0);
47
+ if (filtered.length > 0) {
48
+ suggestions = filtered;
49
+ }
50
+ }
51
+ }
52
+ // Build diagnostic
53
+ return {
54
+ range,
55
+ severity,
56
+ code: error.errorId,
57
+ source: 'rill',
58
+ message,
59
+ ...(suggestions ? { suggestions } : {}),
60
+ };
61
+ }
62
+ /**
63
+ * Convert SourceLocation to zero-based LspPosition.
64
+ *
65
+ * Rill uses 1-based line and column numbers; LSP uses 0-based.
66
+ *
67
+ * @param location - Source location (1-based line, 1-based column)
68
+ * @returns LSP position (0-based line, 0-based character)
69
+ */
70
+ function sourceLocationToLspPosition(location) {
71
+ return {
72
+ line: location.line - 1, // Convert 1-based to 0-based
73
+ character: location.column - 1, // Convert 1-based to 0-based
74
+ };
75
+ }
76
+ /**
77
+ * Map ErrorSeverity to LSP severity code.
78
+ *
79
+ * Mapping:
80
+ * - 'error' -> 1 (Error)
81
+ * - 'warning' -> 2 (Warning)
82
+ * - (future) 'info' -> 3 (Information)
83
+ *
84
+ * @param severity - Error severity level
85
+ * @returns LSP severity code (1, 2, or 3)
86
+ */
87
+ function mapSeverityToLsp(severity) {
88
+ switch (severity) {
89
+ case 'error':
90
+ return 1;
91
+ case 'warning':
92
+ return 2;
93
+ default:
94
+ // Future-proof: if other severities are added, default to error
95
+ return 1;
96
+ }
97
+ }
98
+ //# sourceMappingURL=cli-lsp-diagnostic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-lsp-diagnostic.js","sourceRoot":"","sources":["../src/cli-lsp-diagnostic.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAyB7C,+DAA+D;AAC/D,4BAA4B;AAC5B,+DAA+D;AAE/D;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,eAAe,CAAC,KAAgB;IAC9C,4CAA4C;IAC5C,MAAM,UAAU,GAAG,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACrD,MAAM,aAAa,GAAkB,UAAU,EAAE,QAAQ,IAAI,OAAO,CAAC;IAErE,iEAAiE;IACjE,MAAM,QAAQ,GAAG,gBAAgB,CAAC,aAAa,CAAC,CAAC;IAEjD,0CAA0C;IAC1C,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;IAE1D,mDAAmD;IACnD,yDAAyD;IACzD,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ;QAC1B,CAAC,CAAC;YACE,KAAK,EAAE,2BAA2B,CAAC,KAAK,CAAC,QAAQ,CAAC;YAClD,GAAG,EAAE,2BAA2B,CAAC,KAAK,CAAC,QAAQ,CAAC;SACjD;QACH,CAAC,CAAC,IAAI,CAAC;IAET,yCAAyC;IACzC,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;IACjC,MAAM,kBAAkB,GAAG,SAAS,CAAC,OAAO,EAAE,CAAC,aAAa,CAAC,CAAC;IAC9D,IAAI,WAAiC,CAAC;IAEtC,IAAI,kBAAkB,EAAE,CAAC;QACvB,IAAI,KAAK,CAAC,OAAO,CAAC,kBAAkB,CAAC,IAAI,kBAAkB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvE,MAAM,QAAQ,GAAG,kBAAkB;iBAChC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;iBACX,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;iBACrB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAC/B,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACxB,WAAW,GAAG,QAAQ,CAAC;YACzB,CAAC;QACH,CAAC;IACH,CAAC;IAED,mBAAmB;IACnB,OAAO;QACL,KAAK;QACL,QAAQ;QACR,IAAI,EAAE,KAAK,CAAC,OAAO;QACnB,MAAM,EAAE,MAAM;QACd,OAAO;QACP,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACxC,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,2BAA2B,CAAC,QAAwB;IAC3D,OAAO;QACL,IAAI,EAAE,QAAQ,CAAC,IAAI,GAAG,CAAC,EAAE,6BAA6B;QACtD,SAAS,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,6BAA6B;KAC9D,CAAC;AACJ,CAAC;AAED;;;;;;;;;;GAUG;AACH,SAAS,gBAAgB,CAAC,QAAuB;IAC/C,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,OAAO;YACV,OAAO,CAAC,CAAC;QACX,KAAK,SAAS;YACZ,OAAO,CAAC,CAAC;QACX;YACE,gEAAgE;YAChE,OAAO,CAAC,CAAC;IACb,CAAC;AACH,CAAC"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * CLI Module Loader
3
+ *
4
+ * Implements module loading for the Rill CLI with circular dependency detection.
5
+ * See docs/integration-modules.md for module convention specification.
6
+ */
7
+ import type { RillValue } from '@rcrsr/rill';
8
+ /**
9
+ * Load a module and its dependencies recursively.
10
+ *
11
+ * @param specifier - Module path (relative or absolute)
12
+ * @param fromPath - Path of the importing file
13
+ * @param cache - Module cache keyed by canonical path
14
+ * @param chain - Set of paths in current import chain for circular detection
15
+ * @returns Dict of exported values
16
+ * @throws Error if module not found or circular dependency detected
17
+ */
18
+ export declare function loadModule(specifier: string, fromPath: string, cache: Map<string, Record<string, RillValue>>, chain?: Set<string>): Promise<Record<string, RillValue>>;
19
+ //# sourceMappingURL=cli-module-loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-module-loader.d.ts","sourceRoot":"","sources":["../src/cli-module-loader.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C;;;;;;;;;GASG;AACH,wBAAsB,UAAU,CAC9B,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,EAC7C,KAAK,GAAE,GAAG,CAAC,MAAM,CAAa,GAC7B,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAuEpC"}