@rcrsr/claude-code-runner 0.4.0 → 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 (92) hide show
  1. package/README.md +104 -31
  2. package/dist/cli/args.d.ts +0 -3
  3. package/dist/cli/args.d.ts.map +1 -1
  4. package/dist/cli/args.js +51 -20
  5. package/dist/cli/args.js.map +1 -1
  6. package/dist/core/runner.d.ts +5 -2
  7. package/dist/core/runner.d.ts.map +1 -1
  8. package/dist/core/runner.js +27 -24
  9. package/dist/core/runner.js.map +1 -1
  10. package/dist/index.js +85 -42
  11. package/dist/index.js.map +1 -1
  12. package/dist/output/colors.d.ts +16 -12
  13. package/dist/output/colors.d.ts.map +1 -1
  14. package/dist/output/colors.js +27 -65
  15. package/dist/output/colors.js.map +1 -1
  16. package/dist/output/deaddrop-queue.d.ts +45 -0
  17. package/dist/output/deaddrop-queue.d.ts.map +1 -0
  18. package/dist/output/deaddrop-queue.js +82 -0
  19. package/dist/output/deaddrop-queue.js.map +1 -0
  20. package/dist/output/formatter.d.ts +23 -0
  21. package/dist/output/formatter.d.ts.map +1 -1
  22. package/dist/output/formatter.js +83 -42
  23. package/dist/output/formatter.js.map +1 -1
  24. package/dist/output/index.d.ts +1 -0
  25. package/dist/output/index.d.ts.map +1 -1
  26. package/dist/output/index.js +1 -0
  27. package/dist/output/index.js.map +1 -1
  28. package/dist/output/logger.js +2 -2
  29. package/dist/output/logger.js.map +1 -1
  30. package/dist/output/stats.d.ts +73 -0
  31. package/dist/output/stats.d.ts.map +1 -0
  32. package/dist/output/stats.js +154 -0
  33. package/dist/output/stats.js.map +1 -0
  34. package/dist/process/pty.d.ts.map +1 -1
  35. package/dist/process/pty.js +3 -2
  36. package/dist/process/pty.js.map +1 -1
  37. package/dist/script/index.d.ts +8 -0
  38. package/dist/script/index.d.ts.map +1 -0
  39. package/dist/script/index.js +10 -0
  40. package/dist/script/index.js.map +1 -0
  41. package/dist/script/loader.d.ts +13 -0
  42. package/dist/script/loader.d.ts.map +1 -0
  43. package/dist/script/loader.js +66 -0
  44. package/dist/script/loader.js.map +1 -0
  45. package/dist/script/parser.d.ts +63 -0
  46. package/dist/script/parser.d.ts.map +1 -0
  47. package/dist/script/parser.js +349 -0
  48. package/dist/script/parser.js.map +1 -0
  49. package/dist/script/types.d.ts +49 -0
  50. package/dist/script/types.d.ts.map +1 -0
  51. package/dist/script/types.js +5 -0
  52. package/dist/script/types.js.map +1 -0
  53. package/dist/script/variables.d.ts +27 -0
  54. package/dist/script/variables.d.ts.map +1 -0
  55. package/dist/script/variables.js +74 -0
  56. package/dist/script/variables.js.map +1 -0
  57. package/dist/templates/command.d.ts +18 -20
  58. package/dist/templates/command.d.ts.map +1 -1
  59. package/dist/templates/command.js +40 -61
  60. package/dist/templates/command.js.map +1 -1
  61. package/dist/types/claude.d.ts +12 -0
  62. package/dist/types/claude.d.ts.map +1 -1
  63. package/dist/types/claude.js.map +1 -1
  64. package/dist/types/index.d.ts +1 -0
  65. package/dist/types/index.d.ts.map +1 -1
  66. package/dist/types/index.js +1 -0
  67. package/dist/types/index.js.map +1 -1
  68. package/dist/types/runner.d.ts +12 -0
  69. package/dist/types/runner.d.ts.map +1 -1
  70. package/dist/types/runner.js +4 -3
  71. package/dist/types/runner.js.map +1 -1
  72. package/dist/types/tools.d.ts +64 -0
  73. package/dist/types/tools.d.ts.map +1 -0
  74. package/dist/types/tools.js +12 -0
  75. package/dist/types/tools.js.map +1 -0
  76. package/dist/utils/arguments.d.ts +19 -0
  77. package/dist/utils/arguments.d.ts.map +1 -0
  78. package/dist/utils/arguments.js +31 -0
  79. package/dist/utils/arguments.js.map +1 -0
  80. package/dist/utils/constants.d.ts +51 -0
  81. package/dist/utils/constants.d.ts.map +1 -0
  82. package/dist/utils/constants.js +56 -0
  83. package/dist/utils/constants.js.map +1 -0
  84. package/dist/utils/formatting.d.ts +10 -0
  85. package/dist/utils/formatting.d.ts.map +1 -0
  86. package/dist/utils/formatting.js +19 -0
  87. package/dist/utils/formatting.js.map +1 -0
  88. package/dist/utils/index.d.ts +7 -0
  89. package/dist/utils/index.d.ts.map +1 -0
  90. package/dist/utils/index.js +7 -0
  91. package/dist/utils/index.js.map +1 -0
  92. package/package.json +1 -1
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Script module - parsing, loading, and variable management
3
+ */
4
+ // Loader
5
+ export { loadScript } from './loader.js';
6
+ // Parser (for direct use if needed)
7
+ export { extractScriptLines, parseCommandLine, parsePromptLine, parseScriptLine, } from './parser.js';
8
+ // Variables
9
+ export { captureOutput, createVariableStore, getCaptureLogMessage, getSubstitutionList, substituteVariables, } from './variables.js';
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/script/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAYH,SAAS;AACT,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,oCAAoC;AACpC,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAChB,eAAe,EACf,eAAe,GAChB,MAAM,aAAa,CAAC;AAErB,YAAY;AACZ,OAAO,EACL,aAAa,EACb,mBAAmB,EACnB,oBAAoB,EACpB,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Script file loading with frontmatter and argument validation
3
+ */
4
+ import type { ParsedScript } from './types.js';
5
+ /**
6
+ * Load and parse a script file
7
+ *
8
+ * @param scriptFile - Path to the script file
9
+ * @param scriptArgs - Arguments passed to the script (for validation only)
10
+ * @returns Parsed script with lines and frontmatter
11
+ */
12
+ export declare function loadScript(scriptFile: string, scriptArgs?: string[]): ParsedScript;
13
+ //# sourceMappingURL=loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/script/loader.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH,OAAO,KAAK,EAAE,YAAY,EAAiC,MAAM,YAAY,CAAC;AA+B9E;;;;;;GAMG;AACH,wBAAgB,UAAU,CACxB,UAAU,EAAE,MAAM,EAClB,UAAU,GAAE,MAAM,EAAO,GACxB,YAAY,CAmCd"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * Script file loading with frontmatter and argument validation
3
+ */
4
+ import * as fs from 'fs';
5
+ import { parseFrontmatter } from '../templates/command.js';
6
+ import { parseArgumentHint } from '../utils/arguments.js';
7
+ import { extractScriptLines, parseScriptLine } from './parser.js';
8
+ /**
9
+ * Validate script arguments against argument-hint
10
+ */
11
+ function validateArguments(frontmatter, args) {
12
+ const { requiredCount, optionalPositions } = parseArgumentHint(frontmatter.argumentHint);
13
+ if (args.length < requiredCount) {
14
+ const missing = [];
15
+ for (let i = args.length + 1; i <= requiredCount; i++) {
16
+ if (!optionalPositions.has(i)) {
17
+ missing.push(`$${i}`);
18
+ }
19
+ }
20
+ if (missing.length > 0) {
21
+ const hint = frontmatter.argumentHint
22
+ ? ` (usage: ${frontmatter.argumentHint})`
23
+ : '';
24
+ throw new Error(`Missing required arguments: ${missing.join(', ')}${hint}`);
25
+ }
26
+ }
27
+ }
28
+ /**
29
+ * Load and parse a script file
30
+ *
31
+ * @param scriptFile - Path to the script file
32
+ * @param scriptArgs - Arguments passed to the script (for validation only)
33
+ * @returns Parsed script with lines and frontmatter
34
+ */
35
+ export function loadScript(scriptFile, scriptArgs = []) {
36
+ if (!fs.existsSync(scriptFile)) {
37
+ throw new Error(`Script not found: ${scriptFile}`);
38
+ }
39
+ const content = fs.readFileSync(scriptFile, 'utf-8');
40
+ // Parse frontmatter (reuse from templates/command.ts)
41
+ const { frontmatter: rawFrontmatter, body } = parseFrontmatter(content);
42
+ // Convert to ScriptFrontmatter (handle exactOptionalPropertyTypes)
43
+ const frontmatter = {};
44
+ if (rawFrontmatter.model)
45
+ frontmatter.model = rawFrontmatter.model;
46
+ if (rawFrontmatter.description)
47
+ frontmatter.description = rawFrontmatter.description;
48
+ if (rawFrontmatter.argumentHint)
49
+ frontmatter.argumentHint = rawFrontmatter.argumentHint;
50
+ // Validate arguments
51
+ validateArguments(frontmatter, scriptArgs);
52
+ // Extract raw lines (handling heredocs)
53
+ const rawLines = extractScriptLines(body);
54
+ // Parse each line
55
+ const lines = rawLines.map((line, index) => {
56
+ try {
57
+ return parseScriptLine(line);
58
+ }
59
+ catch (error) {
60
+ const msg = error instanceof Error ? error.message : String(error);
61
+ throw new Error(`Script parse error on line ${index + 1}: ${msg}`);
62
+ }
63
+ });
64
+ return { lines, frontmatter };
65
+ }
66
+ //# sourceMappingURL=loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/script/loader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Script line parser
3
+ *
4
+ * Parses the new script syntax:
5
+ * - prompt("text") -> $var
6
+ * - prompt(<<EOF ... EOF) -> $var
7
+ * - command("name", ["arg1", "arg2"]) -> $var
8
+ */
9
+ import type { CommandLine, PromptLine, ScriptLine } from './types.js';
10
+ /**
11
+ * Parse a quoted string, handling escape sequences
12
+ * Returns the parsed string and the position after the closing quote
13
+ */
14
+ export declare function parseQuotedString(input: string, startPos: number): {
15
+ value: string;
16
+ endPos: number;
17
+ };
18
+ /**
19
+ * Parse a heredoc block
20
+ * Input should start at << position
21
+ * Returns the content and position after the closing delimiter
22
+ */
23
+ export declare function parseHeredoc(input: string, startPos: number): {
24
+ value: string;
25
+ endPos: number;
26
+ };
27
+ /**
28
+ * Parse an array of strings: ["arg1", "arg2"]
29
+ */
30
+ export declare function parseStringArray(input: string, startPos: number): {
31
+ values: string[];
32
+ endPos: number;
33
+ };
34
+ /**
35
+ * Parse capture syntax: -> $varname
36
+ * Returns variable name (without $) or undefined
37
+ */
38
+ export declare function parseCapture(input: string, startPos: number): {
39
+ capture?: string;
40
+ endPos: number;
41
+ };
42
+ /**
43
+ * Parse a prompt line: prompt("text") or prompt(<<EOF...EOF)
44
+ */
45
+ export declare function parsePromptLine(input: string): PromptLine;
46
+ /**
47
+ * Parse a command line: command("name") or command("name", ["args"])
48
+ */
49
+ export declare function parseCommandLine(input: string): CommandLine;
50
+ /**
51
+ * Parse a single script line
52
+ */
53
+ export declare function parseScriptLine(line: string): ScriptLine;
54
+ /**
55
+ * Check if a line is a comment or empty
56
+ */
57
+ export declare function isCommentOrEmpty(line: string): boolean;
58
+ /**
59
+ * Parse script content into lines, handling multi-line heredocs
60
+ * Returns raw line strings (not parsed) for further processing
61
+ */
62
+ export declare function extractScriptLines(content: string): string[];
63
+ //# sourceMappingURL=parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../src/script/parser.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAOtE;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,GACf;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAyCnC;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,GACf;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CA+CnC;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,GACf;IAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CA6CtC;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,GACf;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAiCtC;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,CA6CzD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,CAsD3D;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,CAUxD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAGtD;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAyD5D"}
@@ -0,0 +1,349 @@
1
+ /**
2
+ * Script line parser
3
+ *
4
+ * Parses the new script syntax:
5
+ * - prompt("text") -> $var
6
+ * - prompt(<<EOF ... EOF) -> $var
7
+ * - command("name", ["arg1", "arg2"]) -> $var
8
+ */
9
+ /** Get character at position, or empty string if out of bounds */
10
+ function charAt(input, pos) {
11
+ return input[pos] ?? '';
12
+ }
13
+ /**
14
+ * Parse a quoted string, handling escape sequences
15
+ * Returns the parsed string and the position after the closing quote
16
+ */
17
+ export function parseQuotedString(input, startPos) {
18
+ if (charAt(input, startPos) !== '"') {
19
+ throw new Error(`Expected opening quote at position ${startPos}`);
20
+ }
21
+ let result = '';
22
+ let i = startPos + 1;
23
+ while (i < input.length) {
24
+ const char = charAt(input, i);
25
+ if (char === '\\' && i + 1 < input.length) {
26
+ // Escape sequence
27
+ const next = charAt(input, i + 1);
28
+ if (next === 'n') {
29
+ result += '\n';
30
+ i += 2;
31
+ }
32
+ else if (next === 't') {
33
+ result += '\t';
34
+ i += 2;
35
+ }
36
+ else if (next === '"') {
37
+ result += '"';
38
+ i += 2;
39
+ }
40
+ else if (next === '\\') {
41
+ result += '\\';
42
+ i += 2;
43
+ }
44
+ else {
45
+ // Unknown escape, keep as-is
46
+ result += char;
47
+ i++;
48
+ }
49
+ }
50
+ else if (char === '"') {
51
+ // End of string
52
+ return { value: result, endPos: i + 1 };
53
+ }
54
+ else {
55
+ result += char;
56
+ i++;
57
+ }
58
+ }
59
+ throw new Error('Unterminated string: missing closing quote');
60
+ }
61
+ /**
62
+ * Parse a heredoc block
63
+ * Input should start at << position
64
+ * Returns the content and position after the closing delimiter
65
+ */
66
+ export function parseHeredoc(input, startPos) {
67
+ if (input.slice(startPos, startPos + 2) !== '<<') {
68
+ throw new Error(`Expected << at position ${startPos}`);
69
+ }
70
+ // Find delimiter (word after <<)
71
+ let delimStart = startPos + 2;
72
+ while (delimStart < input.length && charAt(input, delimStart) === ' ') {
73
+ delimStart++;
74
+ }
75
+ let delimEnd = delimStart;
76
+ while (delimEnd < input.length && /\w/.test(charAt(input, delimEnd))) {
77
+ delimEnd++;
78
+ }
79
+ if (delimEnd === delimStart) {
80
+ throw new Error('Heredoc requires a delimiter (e.g., <<EOF)');
81
+ }
82
+ const delimiter = input.slice(delimStart, delimEnd);
83
+ // Find the newline after delimiter
84
+ let contentStart = delimEnd;
85
+ while (contentStart < input.length && charAt(input, contentStart) !== '\n') {
86
+ contentStart++;
87
+ }
88
+ contentStart++; // Skip the newline
89
+ // Find closing delimiter (must be on its own line)
90
+ const closingPattern = new RegExp(`^${delimiter}\\s*$`, 'm');
91
+ const remaining = input.slice(contentStart);
92
+ const match = closingPattern.exec(remaining);
93
+ if (!match) {
94
+ throw new Error(`Heredoc missing closing delimiter: ${delimiter}`);
95
+ }
96
+ const content = remaining.slice(0, match.index);
97
+ // Remove trailing newline if present
98
+ const trimmedContent = content.endsWith('\n')
99
+ ? content.slice(0, -1)
100
+ : content;
101
+ const endPos = contentStart + match.index + match[0].length;
102
+ return { value: trimmedContent, endPos };
103
+ }
104
+ /**
105
+ * Parse an array of strings: ["arg1", "arg2"]
106
+ */
107
+ export function parseStringArray(input, startPos) {
108
+ if (charAt(input, startPos) !== '[') {
109
+ throw new Error(`Expected [ at position ${startPos}`);
110
+ }
111
+ const values = [];
112
+ let i = startPos + 1;
113
+ // Skip whitespace
114
+ while (i < input.length && /\s/.test(charAt(input, i)))
115
+ i++;
116
+ // Empty array
117
+ if (charAt(input, i) === ']') {
118
+ return { values: [], endPos: i + 1 };
119
+ }
120
+ while (i < input.length) {
121
+ // Skip whitespace
122
+ while (i < input.length && /\s/.test(charAt(input, i)))
123
+ i++;
124
+ if (charAt(input, i) === ']') {
125
+ return { values, endPos: i + 1 };
126
+ }
127
+ // Parse string element
128
+ if (charAt(input, i) !== '"') {
129
+ throw new Error(`Expected string in array at position ${i}`);
130
+ }
131
+ const { value, endPos } = parseQuotedString(input, i);
132
+ values.push(value);
133
+ i = endPos;
134
+ // Skip whitespace
135
+ while (i < input.length && /\s/.test(charAt(input, i)))
136
+ i++;
137
+ // Expect comma or closing bracket
138
+ if (charAt(input, i) === ',') {
139
+ i++;
140
+ }
141
+ else if (charAt(input, i) !== ']') {
142
+ throw new Error(`Expected , or ] at position ${i}`);
143
+ }
144
+ }
145
+ throw new Error('Unterminated array: missing ]');
146
+ }
147
+ /**
148
+ * Parse capture syntax: -> $varname
149
+ * Returns variable name (without $) or undefined
150
+ */
151
+ export function parseCapture(input, startPos) {
152
+ let i = startPos;
153
+ // Skip whitespace
154
+ while (i < input.length && /\s/.test(charAt(input, i)))
155
+ i++;
156
+ // Check for ->
157
+ if (input.slice(i, i + 2) !== '->') {
158
+ return { endPos: i };
159
+ }
160
+ i += 2;
161
+ // Skip whitespace
162
+ while (i < input.length && /\s/.test(charAt(input, i)))
163
+ i++;
164
+ // Expect $
165
+ if (charAt(input, i) !== '$') {
166
+ throw new Error(`Expected $ after -> at position ${i}`);
167
+ }
168
+ i++;
169
+ // Parse variable name
170
+ let varName = '';
171
+ while (i < input.length && /\w/.test(charAt(input, i))) {
172
+ varName += charAt(input, i);
173
+ i++;
174
+ }
175
+ if (!varName) {
176
+ throw new Error('Variable name required after $');
177
+ }
178
+ return { capture: varName, endPos: i };
179
+ }
180
+ /**
181
+ * Parse a prompt line: prompt("text") or prompt(<<EOF...EOF)
182
+ */
183
+ export function parsePromptLine(input) {
184
+ const trimmed = input.trim();
185
+ if (!trimmed.startsWith('prompt(')) {
186
+ throw new Error('Expected prompt(');
187
+ }
188
+ let pos = 7; // After 'prompt('
189
+ // Skip whitespace
190
+ while (pos < trimmed.length && /\s/.test(charAt(trimmed, pos)))
191
+ pos++;
192
+ let text;
193
+ let endPos;
194
+ if (charAt(trimmed, pos) === '"') {
195
+ // Quoted string
196
+ const result = parseQuotedString(trimmed, pos);
197
+ text = result.value;
198
+ endPos = result.endPos;
199
+ }
200
+ else if (trimmed.slice(pos, pos + 2) === '<<') {
201
+ // Heredoc
202
+ const result = parseHeredoc(trimmed, pos);
203
+ text = result.value;
204
+ endPos = result.endPos;
205
+ }
206
+ else {
207
+ throw new Error('Expected quoted string or heredoc after prompt(');
208
+ }
209
+ // Skip whitespace
210
+ while (endPos < trimmed.length && /\s/.test(charAt(trimmed, endPos)))
211
+ endPos++;
212
+ // Expect closing paren
213
+ if (charAt(trimmed, endPos) !== ')') {
214
+ throw new Error(`Expected ) at position ${endPos}`);
215
+ }
216
+ endPos++;
217
+ // Parse optional capture
218
+ const { capture } = parseCapture(trimmed, endPos);
219
+ const result = { type: 'prompt', text };
220
+ if (capture)
221
+ result.capture = capture;
222
+ return result;
223
+ }
224
+ /**
225
+ * Parse a command line: command("name") or command("name", ["args"])
226
+ */
227
+ export function parseCommandLine(input) {
228
+ const trimmed = input.trim();
229
+ if (!trimmed.startsWith('command(')) {
230
+ throw new Error('Expected command(');
231
+ }
232
+ let pos = 8; // After 'command('
233
+ // Skip whitespace
234
+ while (pos < trimmed.length && /\s/.test(charAt(trimmed, pos)))
235
+ pos++;
236
+ // Parse command name
237
+ if (charAt(trimmed, pos) !== '"') {
238
+ throw new Error('Expected quoted command name');
239
+ }
240
+ const nameResult = parseQuotedString(trimmed, pos);
241
+ const name = nameResult.value;
242
+ pos = nameResult.endPos;
243
+ // Skip whitespace
244
+ while (pos < trimmed.length && /\s/.test(charAt(trimmed, pos)))
245
+ pos++;
246
+ let args = [];
247
+ // Check for comma (args follow)
248
+ if (charAt(trimmed, pos) === ',') {
249
+ pos++;
250
+ // Skip whitespace
251
+ while (pos < trimmed.length && /\s/.test(charAt(trimmed, pos)))
252
+ pos++;
253
+ // Parse args array
254
+ const argsResult = parseStringArray(trimmed, pos);
255
+ args = argsResult.values;
256
+ pos = argsResult.endPos;
257
+ }
258
+ // Skip whitespace
259
+ while (pos < trimmed.length && /\s/.test(charAt(trimmed, pos)))
260
+ pos++;
261
+ // Expect closing paren
262
+ if (charAt(trimmed, pos) !== ')') {
263
+ throw new Error(`Expected ) at position ${pos}`);
264
+ }
265
+ pos++;
266
+ // Parse optional capture
267
+ const { capture } = parseCapture(trimmed, pos);
268
+ const result = { type: 'command', name, args };
269
+ if (capture)
270
+ result.capture = capture;
271
+ return result;
272
+ }
273
+ /**
274
+ * Parse a single script line
275
+ */
276
+ export function parseScriptLine(line) {
277
+ const trimmed = line.trim();
278
+ if (trimmed.startsWith('prompt(')) {
279
+ return parsePromptLine(trimmed);
280
+ }
281
+ else if (trimmed.startsWith('command(')) {
282
+ return parseCommandLine(trimmed);
283
+ }
284
+ else {
285
+ throw new Error(`Unknown script line type: ${trimmed.slice(0, 20)}...`);
286
+ }
287
+ }
288
+ /**
289
+ * Check if a line is a comment or empty
290
+ */
291
+ export function isCommentOrEmpty(line) {
292
+ const trimmed = line.trim();
293
+ return trimmed === '' || trimmed.startsWith('#');
294
+ }
295
+ /**
296
+ * Parse script content into lines, handling multi-line heredocs
297
+ * Returns raw line strings (not parsed) for further processing
298
+ */
299
+ export function extractScriptLines(content) {
300
+ const lines = [];
301
+ const contentLines = content.split('\n');
302
+ let i = 0;
303
+ while (i < contentLines.length) {
304
+ const line = contentLines[i] ?? '';
305
+ const trimmed = line.trim();
306
+ // Skip comments and empty lines
307
+ if (isCommentOrEmpty(trimmed)) {
308
+ i++;
309
+ continue;
310
+ }
311
+ // Check for heredoc
312
+ if (trimmed.includes('<<')) {
313
+ // Find the delimiter
314
+ const heredocMatch = /<<(\w+)/.exec(trimmed);
315
+ if (heredocMatch) {
316
+ const delimiter = heredocMatch[1];
317
+ let fullLine = line;
318
+ i++;
319
+ // Collect lines until we find the closing delimiter
320
+ while (i < contentLines.length) {
321
+ const nextLine = contentLines[i] ?? '';
322
+ fullLine += '\n' + nextLine;
323
+ if (nextLine.trim() === delimiter) {
324
+ i++;
325
+ // Also capture closing paren (and optional capture) if on next line(s)
326
+ if (i < contentLines.length) {
327
+ const parenLine = contentLines[i] ?? '';
328
+ const parenTrimmed = parenLine.trim();
329
+ // Match ) or ) -> $var
330
+ if (parenTrimmed === ')' || parenTrimmed.startsWith(') ->')) {
331
+ fullLine += '\n' + parenLine;
332
+ i++;
333
+ }
334
+ }
335
+ break;
336
+ }
337
+ i++;
338
+ }
339
+ lines.push(fullLine);
340
+ continue;
341
+ }
342
+ }
343
+ // Regular single line
344
+ lines.push(line);
345
+ i++;
346
+ }
347
+ return lines;
348
+ }
349
+ //# sourceMappingURL=parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/script/parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Types for parsed script lines
3
+ */
4
+ /**
5
+ * A prompt line: prompt("text") -> $var
6
+ */
7
+ export interface PromptLine {
8
+ type: 'prompt';
9
+ text: string;
10
+ capture?: string;
11
+ }
12
+ /**
13
+ * A command line: command("name", ["arg1", "arg2"]) -> $var
14
+ */
15
+ export interface CommandLine {
16
+ type: 'command';
17
+ name: string;
18
+ args: string[];
19
+ capture?: string;
20
+ }
21
+ /**
22
+ * Union of all script line types
23
+ */
24
+ export type ScriptLine = PromptLine | CommandLine;
25
+ /**
26
+ * Result of parsing a script file
27
+ */
28
+ export interface ParsedScript {
29
+ lines: ScriptLine[];
30
+ frontmatter: ScriptFrontmatter;
31
+ }
32
+ /**
33
+ * Frontmatter metadata from script files
34
+ */
35
+ export interface ScriptFrontmatter {
36
+ model?: string;
37
+ description?: string;
38
+ argumentHint?: string;
39
+ }
40
+ /**
41
+ * Variable store for captured outputs
42
+ */
43
+ export interface VariableStore {
44
+ /** Named captures: $name -> value */
45
+ named: Map<string, string>;
46
+ /** Last output: $_ */
47
+ last: string;
48
+ }
49
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/script/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,QAAQ,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,SAAS,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,MAAM,UAAU,GAAG,UAAU,GAAG,WAAW,CAAC;AAElD;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,WAAW,EAAE,iBAAiB,CAAC;CAChC;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,qCAAqC;IACrC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3B,sBAAsB;IACtB,IAAI,EAAE,MAAM,CAAC;CACd"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Types for parsed script lines
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/script/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Variable store and substitution for script execution
3
+ */
4
+ import type { VariableStore } from './types.js';
5
+ /**
6
+ * Create an empty variable store
7
+ */
8
+ export declare function createVariableStore(): VariableStore;
9
+ /**
10
+ * Capture output into the variable store
11
+ * Updates both the named variable (if provided) and $_
12
+ */
13
+ export declare function captureOutput(store: VariableStore, output: string, varName?: string): void;
14
+ /**
15
+ * Get capture log message for [RUNNER] output
16
+ */
17
+ export declare function getCaptureLogMessage(output: string, varName?: string): string;
18
+ /**
19
+ * Substitute variables in a string
20
+ * Handles: $_, $varname, $1, $2, etc.
21
+ */
22
+ export declare function substituteVariables(text: string, store: VariableStore, scriptArgs?: string[]): string;
23
+ /**
24
+ * Get list of variables being substituted (for logging)
25
+ */
26
+ export declare function getSubstitutionList(text: string, store: VariableStore): string[];
27
+ //# sourceMappingURL=variables.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"variables.d.ts","sourceRoot":"","sources":["../../src/script/variables.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,aAAa,CAKnD;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,aAAa,EACpB,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,MAAM,GACf,IAAI,CAQN;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAM7E;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,aAAa,EACpB,UAAU,GAAE,MAAM,EAAO,GACxB,MAAM,CAyBR;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,aAAa,GACnB,MAAM,EAAE,CAgBV"}