@rcrsr/claude-code-runner 0.4.0 → 0.5.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 (79) hide show
  1. package/README.md +103 -30
  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 +83 -41
  11. package/dist/index.js.map +1 -1
  12. package/dist/output/colors.d.ts +5 -11
  13. package/dist/output/colors.d.ts.map +1 -1
  14. package/dist/output/colors.js +7 -59
  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 +4 -0
  21. package/dist/output/formatter.d.ts.map +1 -1
  22. package/dist/output/formatter.js +20 -17
  23. package/dist/output/formatter.js.map +1 -1
  24. package/dist/process/pty.d.ts.map +1 -1
  25. package/dist/process/pty.js +3 -2
  26. package/dist/process/pty.js.map +1 -1
  27. package/dist/script/index.d.ts +8 -0
  28. package/dist/script/index.d.ts.map +1 -0
  29. package/dist/script/index.js +10 -0
  30. package/dist/script/index.js.map +1 -0
  31. package/dist/script/loader.d.ts +13 -0
  32. package/dist/script/loader.d.ts.map +1 -0
  33. package/dist/script/loader.js +66 -0
  34. package/dist/script/loader.js.map +1 -0
  35. package/dist/script/parser.d.ts +63 -0
  36. package/dist/script/parser.d.ts.map +1 -0
  37. package/dist/script/parser.js +349 -0
  38. package/dist/script/parser.js.map +1 -0
  39. package/dist/script/types.d.ts +49 -0
  40. package/dist/script/types.d.ts.map +1 -0
  41. package/dist/script/types.js +5 -0
  42. package/dist/script/types.js.map +1 -0
  43. package/dist/script/variables.d.ts +27 -0
  44. package/dist/script/variables.d.ts.map +1 -0
  45. package/dist/script/variables.js +74 -0
  46. package/dist/script/variables.js.map +1 -0
  47. package/dist/templates/command.d.ts +18 -20
  48. package/dist/templates/command.d.ts.map +1 -1
  49. package/dist/templates/command.js +40 -61
  50. package/dist/templates/command.js.map +1 -1
  51. package/dist/types/index.d.ts +1 -0
  52. package/dist/types/index.d.ts.map +1 -1
  53. package/dist/types/index.js +1 -0
  54. package/dist/types/index.js.map +1 -1
  55. package/dist/types/runner.d.ts +12 -0
  56. package/dist/types/runner.d.ts.map +1 -1
  57. package/dist/types/runner.js +4 -3
  58. package/dist/types/runner.js.map +1 -1
  59. package/dist/types/tools.d.ts +64 -0
  60. package/dist/types/tools.d.ts.map +1 -0
  61. package/dist/types/tools.js +12 -0
  62. package/dist/types/tools.js.map +1 -0
  63. package/dist/utils/arguments.d.ts +19 -0
  64. package/dist/utils/arguments.d.ts.map +1 -0
  65. package/dist/utils/arguments.js +31 -0
  66. package/dist/utils/arguments.js.map +1 -0
  67. package/dist/utils/constants.d.ts +49 -0
  68. package/dist/utils/constants.d.ts.map +1 -0
  69. package/dist/utils/constants.js +54 -0
  70. package/dist/utils/constants.js.map +1 -0
  71. package/dist/utils/formatting.d.ts +10 -0
  72. package/dist/utils/formatting.d.ts.map +1 -0
  73. package/dist/utils/formatting.js +19 -0
  74. package/dist/utils/formatting.js.map +1 -0
  75. package/dist/utils/index.d.ts +7 -0
  76. package/dist/utils/index.d.ts.map +1 -0
  77. package/dist/utils/index.js +7 -0
  78. package/dist/utils/index.js.map +1 -0
  79. package/package.json +1 -1
@@ -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"}
@@ -0,0 +1,74 @@
1
+ /**
2
+ * Variable store and substitution for script execution
3
+ */
4
+ import { formatSize } from '../utils/formatting.js';
5
+ /**
6
+ * Create an empty variable store
7
+ */
8
+ export function createVariableStore() {
9
+ return {
10
+ named: new Map(),
11
+ last: '',
12
+ };
13
+ }
14
+ /**
15
+ * Capture output into the variable store
16
+ * Updates both the named variable (if provided) and $_
17
+ */
18
+ export function captureOutput(store, output, varName) {
19
+ // Always update $_
20
+ store.last = output;
21
+ // Update named variable if provided
22
+ if (varName) {
23
+ store.named.set(varName, output);
24
+ }
25
+ }
26
+ /**
27
+ * Get capture log message for [RUNNER] output
28
+ */
29
+ export function getCaptureLogMessage(output, varName) {
30
+ const size = formatSize(output.length);
31
+ if (varName) {
32
+ return `$${varName} captured (${size})`;
33
+ }
34
+ return `$_ captured (${size})`;
35
+ }
36
+ /**
37
+ * Substitute variables in a string
38
+ * Handles: $_, $varname, $1, $2, etc.
39
+ */
40
+ export function substituteVariables(text, store, scriptArgs = []) {
41
+ let result = text;
42
+ // Substitute $_ (last output)
43
+ result = result.replace(/\$_/g, store.last);
44
+ // Substitute $ARGUMENTS BEFORE named variables (otherwise regex catches it)
45
+ result = result.replace(/\$ARGUMENTS/g, scriptArgs.join(' '));
46
+ // Substitute positional args ($1, $2, etc.) BEFORE named variables
47
+ for (const [i, arg] of scriptArgs.entries()) {
48
+ result = result.replace(new RegExp(`\\$${i + 1}`, 'g'), arg);
49
+ }
50
+ // Remove any remaining unmatched $N placeholders
51
+ result = result.replace(/\$\d+/g, '');
52
+ // Substitute named variables ($varname) LAST
53
+ // Match $word but not $1, $2, etc. (already handled above)
54
+ result = result.replace(/\$([a-zA-Z_][a-zA-Z0-9_]*)/g, (_match, name) => store.named.get(name) ?? '');
55
+ return result;
56
+ }
57
+ /**
58
+ * Get list of variables being substituted (for logging)
59
+ */
60
+ export function getSubstitutionList(text, store) {
61
+ const vars = [];
62
+ // Check for $_
63
+ if (text.includes('$_') && store.last) {
64
+ vars.push('$_');
65
+ }
66
+ // Check for named variables
67
+ for (const name of store.named.keys()) {
68
+ if (text.includes(`$${name}`)) {
69
+ vars.push(`$${name}`);
70
+ }
71
+ }
72
+ return vars;
73
+ }
74
+ //# sourceMappingURL=variables.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"variables.js","sourceRoot":"","sources":["../../src/script/variables.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAGpD;;GAEG;AACH,MAAM,UAAU,mBAAmB;IACjC,OAAO;QACL,KAAK,EAAE,IAAI,GAAG,EAAE;QAChB,IAAI,EAAE,EAAE;KACT,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa,CAC3B,KAAoB,EACpB,MAAc,EACd,OAAgB;IAEhB,mBAAmB;IACnB,KAAK,CAAC,IAAI,GAAG,MAAM,CAAC;IAEpB,oCAAoC;IACpC,IAAI,OAAO,EAAE,CAAC;QACZ,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IACnC,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,MAAc,EAAE,OAAgB;IACnE,MAAM,IAAI,GAAG,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACvC,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,IAAI,OAAO,cAAc,IAAI,GAAG,CAAC;IAC1C,CAAC;IACD,OAAO,gBAAgB,IAAI,GAAG,CAAC;AACjC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CACjC,IAAY,EACZ,KAAoB,EACpB,aAAuB,EAAE;IAEzB,IAAI,MAAM,GAAG,IAAI,CAAC;IAElB,8BAA8B;IAC9B,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;IAE5C,4EAA4E;IAC5E,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,cAAc,EAAE,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAE9D,mEAAmE;IACnE,KAAK,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC;QAC5C,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;IAC/D,CAAC;IAED,iDAAiD;IACjD,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IAEtC,6CAA6C;IAC7C,2DAA2D;IAC3D,MAAM,GAAG,MAAM,CAAC,OAAO,CACrB,6BAA6B,EAC7B,CAAC,MAAM,EAAE,IAAY,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CACtD,CAAC;IAEF,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CACjC,IAAY,EACZ,KAAoB;IAEpB,MAAM,IAAI,GAAa,EAAE,CAAC;IAE1B,eAAe;IACf,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;QACtC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClB,CAAC;IAED,4BAA4B;IAC5B,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;QACtC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI,EAAE,CAAC,EAAE,CAAC;YAC9B,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -1,10 +1,10 @@
1
1
  /**
2
- * Command template loading and variable substitution
2
+ * Template loading and variable substitution for commands and scripts
3
3
  */
4
4
  /**
5
- * Frontmatter metadata from command template
5
+ * Frontmatter metadata from template files
6
6
  */
7
- export interface CommandFrontmatter {
7
+ export interface TemplateFrontmatter {
8
8
  model?: string;
9
9
  description?: string;
10
10
  argumentHint?: string;
@@ -14,14 +14,21 @@ export interface CommandFrontmatter {
14
14
  */
15
15
  export interface CommandTemplate {
16
16
  prompt: string;
17
- frontmatter: CommandFrontmatter;
17
+ frontmatter: TemplateFrontmatter;
18
18
  }
19
+ /**
20
+ * Result of loading a script template
21
+ */
22
+ export interface ScriptTemplate {
23
+ lines: string[];
24
+ frontmatter: TemplateFrontmatter;
25
+ }
26
+ export type CommandFrontmatter = TemplateFrontmatter;
19
27
  /**
20
28
  * Parse YAML frontmatter from markdown content
21
- * Returns the frontmatter object and remaining content
22
29
  */
23
30
  export declare function parseFrontmatter(content: string): {
24
- frontmatter: CommandFrontmatter;
31
+ frontmatter: TemplateFrontmatter;
25
32
  body: string;
26
33
  };
27
34
  /**
@@ -29,20 +36,11 @@ export declare function parseFrontmatter(content: string): {
29
36
  */
30
37
  export declare function stripFrontmatter(content: string): string;
31
38
  /**
32
- * Load a command template and substitute positional arguments
33
- * Templates are loaded from .claude/commands/<name>.md
34
- *
35
- * Supports:
36
- * - $ARGUMENTS: all arguments joined with spaces
37
- * - $1, $2, $3...: positional arguments
38
- *
39
- * Frontmatter fields:
40
- * - model: default model for this command (CLI arg takes precedence)
41
- * - description: command description
42
- * - argument-hint: defines required <arg> and optional [arg] arguments
43
- *
44
- * @param commandName - Name of the command (without .md extension)
45
- * @param cmdArgs - Positional arguments to substitute
39
+ * Load a command template from .claude/commands/<name>.md
46
40
  */
47
41
  export declare function loadCommandTemplate(commandName: string, cmdArgs: string[]): CommandTemplate;
42
+ /**
43
+ * Load a script template and substitute arguments
44
+ */
45
+ export declare function loadScriptTemplate(scriptFile: string, scriptArgs: string[]): ScriptTemplate;
48
46
  //# sourceMappingURL=command.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../../src/templates/command.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,kBAAkB,CAAC;CACjC;AAkCD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG;IACjD,WAAW,EAAE,kBAAkB,CAAC;IAChC,IAAI,EAAE,MAAM,CAAC;CACd,CA+BA;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAExD;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,mBAAmB,CACjC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EAAE,GAChB,eAAe,CAkDjB"}
1
+ {"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../../src/templates/command.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAUD;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,mBAAmB,CAAC;CAClC;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,WAAW,EAAE,mBAAmB,CAAC;CAClC;AAGD,MAAM,MAAM,kBAAkB,GAAG,mBAAmB,CAAC;AAErD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG;IACjD,WAAW,EAAE,mBAAmB,CAAC;IACjC,IAAI,EAAE,MAAM,CAAC;CACd,CA8BA;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAExD;AAwCD;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EAAE,GAChB,eAAe,CAgBjB;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAAE,GACnB,cAAc,CAchB"}
@@ -1,37 +1,11 @@
1
1
  /**
2
- * Command template loading and variable substitution
2
+ * Template loading and variable substitution for commands and scripts
3
3
  */
4
4
  import * as fs from 'fs';
5
5
  import * as path from 'path';
6
- /**
7
- * Parse argument-hint to determine required vs optional args
8
- * Convention: <arg> = required, [arg] = optional
9
- * Returns set of optional argument positions (1-indexed)
10
- */
11
- function parseArgumentHint(hint) {
12
- if (!hint) {
13
- return { requiredCount: 0, optionalPositions: new Set() };
14
- }
15
- const optionalPositions = new Set();
16
- let position = 0;
17
- let requiredCount = 0;
18
- // Match <required> or [optional] patterns
19
- const argPattern = /<[^>]+>|\[[^\]]+\]/g;
20
- let match;
21
- while ((match = argPattern.exec(hint)) !== null) {
22
- position++;
23
- if (match[0].startsWith('[')) {
24
- optionalPositions.add(position);
25
- }
26
- else {
27
- requiredCount = position;
28
- }
29
- }
30
- return { requiredCount, optionalPositions };
31
- }
6
+ import { parseArgumentHint } from '../utils/arguments.js';
32
7
  /**
33
8
  * Parse YAML frontmatter from markdown content
34
- * Returns the frontmatter object and remaining content
35
9
  */
36
10
  export function parseFrontmatter(content) {
37
11
  if (!content.startsWith('---')) {
@@ -43,7 +17,6 @@ export function parseFrontmatter(content) {
43
17
  }
44
18
  const yamlContent = content.slice(4, endIndex);
45
19
  const body = content.slice(endIndex + 4).trimStart();
46
- // Simple YAML parsing for known fields
47
20
  const frontmatter = {};
48
21
  const keyValueRegex = /^(\S+):\s*(.*)$/;
49
22
  for (const line of yamlContent.split('\n')) {
@@ -71,34 +44,15 @@ export function stripFrontmatter(content) {
71
44
  return parseFrontmatter(content).body;
72
45
  }
73
46
  /**
74
- * Load a command template and substitute positional arguments
75
- * Templates are loaded from .claude/commands/<name>.md
76
- *
77
- * Supports:
78
- * - $ARGUMENTS: all arguments joined with spaces
79
- * - $1, $2, $3...: positional arguments
80
- *
81
- * Frontmatter fields:
82
- * - model: default model for this command (CLI arg takes precedence)
83
- * - description: command description
84
- * - argument-hint: defines required <arg> and optional [arg] arguments
85
- *
86
- * @param commandName - Name of the command (without .md extension)
87
- * @param cmdArgs - Positional arguments to substitute
47
+ * Process template content: parse frontmatter, validate and substitute arguments
88
48
  */
89
- export function loadCommandTemplate(commandName, cmdArgs) {
90
- const commandFile = path.join(process.cwd(), '.claude', 'commands', `${commandName}.md`);
91
- if (!fs.existsSync(commandFile)) {
92
- throw new Error(`Command not found: ${commandFile}`);
93
- }
94
- const content = fs.readFileSync(commandFile, 'utf-8');
49
+ function processTemplate(content, args) {
95
50
  const { frontmatter, body } = parseFrontmatter(content);
96
- // Parse argument hints to determine required vs optional
51
+ // Validate required arguments
97
52
  const { requiredCount, optionalPositions } = parseArgumentHint(frontmatter.argumentHint);
98
- // Check for missing required arguments
99
- if (cmdArgs.length < requiredCount) {
53
+ if (args.length < requiredCount) {
100
54
  const missing = [];
101
- for (let i = cmdArgs.length + 1; i <= requiredCount; i++) {
55
+ for (let i = args.length + 1; i <= requiredCount; i++) {
102
56
  if (!optionalPositions.has(i)) {
103
57
  missing.push(`$${i}`);
104
58
  }
@@ -110,14 +64,39 @@ export function loadCommandTemplate(commandName, cmdArgs) {
110
64
  throw new Error(`Missing required arguments: ${missing.join(', ')}${hint}`);
111
65
  }
112
66
  }
113
- // Substitute $ARGUMENTS with all args joined
114
- let prompt = body.replace(/\$ARGUMENTS/g, cmdArgs.join(' '));
115
- // Substitute $1, $2, $3, ... with positional args
116
- for (const [i, arg] of cmdArgs.entries()) {
117
- prompt = prompt.replace(new RegExp(`\\$${i + 1}`, 'g'), arg);
67
+ // Substitute arguments
68
+ let result = body.replace(/\$ARGUMENTS/g, args.join(' '));
69
+ for (const [i, arg] of args.entries()) {
70
+ result = result.replace(new RegExp(`\\$${i + 1}`, 'g'), arg);
71
+ }
72
+ result = result.replace(/\$\d+/g, '');
73
+ return { body: result, frontmatter };
74
+ }
75
+ /**
76
+ * Load a command template from .claude/commands/<name>.md
77
+ */
78
+ export function loadCommandTemplate(commandName, cmdArgs) {
79
+ const commandFile = path.join(process.cwd(), '.claude', 'commands', `${commandName}.md`);
80
+ if (!fs.existsSync(commandFile)) {
81
+ throw new Error(`Command not found: ${commandFile}`);
82
+ }
83
+ const content = fs.readFileSync(commandFile, 'utf-8');
84
+ const { body, frontmatter } = processTemplate(content, cmdArgs);
85
+ return { prompt: body, frontmatter };
86
+ }
87
+ /**
88
+ * Load a script template and substitute arguments
89
+ */
90
+ export function loadScriptTemplate(scriptFile, scriptArgs) {
91
+ if (!fs.existsSync(scriptFile)) {
92
+ throw new Error(`Script not found: ${scriptFile}`);
118
93
  }
119
- // Replace any remaining $N with empty string (optional args)
120
- prompt = prompt.replace(/\$\d+/g, '');
121
- return { prompt, frontmatter };
94
+ const content = fs.readFileSync(scriptFile, 'utf-8');
95
+ const { body, frontmatter } = processTemplate(content, scriptArgs);
96
+ const lines = body
97
+ .split('\n')
98
+ .map((l) => l.trim())
99
+ .filter((l) => l && !l.startsWith('#'));
100
+ return { lines, frontmatter };
122
101
  }
123
102
  //# sourceMappingURL=command.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"command.js","sourceRoot":"","sources":["../../src/templates/command.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAmB7B;;;;GAIG;AACH,SAAS,iBAAiB,CAAC,IAAwB;IAIjD,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,EAAE,aAAa,EAAE,CAAC,EAAE,iBAAiB,EAAE,IAAI,GAAG,EAAE,EAAE,CAAC;IAC5D,CAAC;IAED,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAAU,CAAC;IAC5C,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,IAAI,aAAa,GAAG,CAAC,CAAC;IAEtB,0CAA0C;IAC1C,MAAM,UAAU,GAAG,qBAAqB,CAAC;IACzC,IAAI,KAAK,CAAC;IACV,OAAO,CAAC,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QAChD,QAAQ,EAAE,CAAC;QACX,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC7B,iBAAiB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAClC,CAAC;aAAM,CAAC;YACN,aAAa,GAAG,QAAQ,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,CAAC;AAC9C,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAAe;IAI9C,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QAC/B,OAAO,EAAE,WAAW,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;IAC5C,CAAC;IACD,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IAC7C,IAAI,QAAQ,KAAK,CAAC,CAAC,EAAE,CAAC;QACpB,OAAO,EAAE,WAAW,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;IAC5C,CAAC;IAED,MAAM,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;IAC/C,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;IAErD,uCAAuC;IACvC,MAAM,WAAW,GAAuB,EAAE,CAAC;IAC3C,MAAM,aAAa,GAAG,iBAAiB,CAAC;IACxC,KAAK,MAAM,IAAI,IAAI,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3C,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvC,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,KAAK,CAAC;YAC7B,MAAM,YAAY,GAAG,KAAK,EAAE,IAAI,EAAE,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC;YACrE,IAAI,GAAG,KAAK,OAAO,IAAI,YAAY,EAAE,CAAC;gBACpC,WAAW,CAAC,KAAK,GAAG,YAAY,CAAC;YACnC,CAAC;iBAAM,IAAI,GAAG,KAAK,aAAa,IAAI,YAAY,EAAE,CAAC;gBACjD,WAAW,CAAC,WAAW,GAAG,YAAY,CAAC;YACzC,CAAC;iBAAM,IAAI,GAAG,KAAK,eAAe,IAAI,YAAY,EAAE,CAAC;gBACnD,WAAW,CAAC,YAAY,GAAG,YAAY,CAAC;YAC1C,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;AAC/B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAAe;IAC9C,OAAO,gBAAgB,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC;AACxC,CAAC;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,mBAAmB,CACjC,WAAmB,EACnB,OAAiB;IAEjB,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAC3B,OAAO,CAAC,GAAG,EAAE,EACb,SAAS,EACT,UAAU,EACV,GAAG,WAAW,KAAK,CACpB,CAAC;IAEF,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CAAC,sBAAsB,WAAW,EAAE,CAAC,CAAC;IACvD,CAAC;IAED,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IACtD,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAExD,yDAAyD;IACzD,MAAM,EAAE,aAAa,EAAE,iBAAiB,EAAE,GAAG,iBAAiB,CAC5D,WAAW,CAAC,YAAY,CACzB,CAAC;IAEF,uCAAuC;IACvC,IAAI,OAAO,CAAC,MAAM,GAAG,aAAa,EAAE,CAAC;QACnC,MAAM,OAAO,GAAG,EAAE,CAAC;QACnB,KAAK,IAAI,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,aAAa,EAAE,CAAC,EAAE,EAAE,CAAC;YACzD,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC9B,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACxB,CAAC;QACH,CAAC;QACD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,MAAM,IAAI,GAAG,WAAW,CAAC,YAAY;gBACnC,CAAC,CAAC,YAAY,WAAW,CAAC,YAAY,GAAG;gBACzC,CAAC,CAAC,EAAE,CAAC;YACP,MAAM,IAAI,KAAK,CACb,+BAA+B,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,EAAE,CAC3D,CAAC;QACJ,CAAC;IACH,CAAC;IAED,6CAA6C;IAC7C,IAAI,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAE7D,kDAAkD;IAClD,KAAK,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;QACzC,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;IAC/D,CAAC;IAED,6DAA6D;IAC7D,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IAEtC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;AACjC,CAAC"}
1
+ {"version":3,"file":"command.js","sourceRoot":"","sources":["../../src/templates/command.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
1
  export * from './claude.js';
2
2
  export * from './runner.js';
3
+ export * from './tools.js';
3
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC"}
@@ -1,3 +1,4 @@
1
1
  export * from './claude.js';
2
2
  export * from './runner.js';
3
+ export * from './tools.js';
3
4
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC"}
@@ -25,6 +25,13 @@ export interface RunResult {
25
25
  * Result of running with signal support (may involve multiple iterations)
26
26
  */
27
27
  export type SignalResult = 'ok' | 'blocked' | 'error';
28
+ /**
29
+ * Extended result from runWithSignals including output text
30
+ */
31
+ export interface SignalRunResult {
32
+ status: SignalResult;
33
+ claudeText: string;
34
+ }
28
35
  /**
29
36
  * Runner configuration
30
37
  */
@@ -49,9 +56,14 @@ export interface ParsedArgs {
49
56
  subcommand: Subcommand;
50
57
  prompt: string;
51
58
  displayCommand: string;
59
+ /** Display strings for script lines (for logging) */
52
60
  scriptLines: string[];
53
61
  scriptMode: boolean;
54
62
  config: Partial<RunnerConfig>;
63
+ /** Script file path (when scriptMode is true) */
64
+ scriptFile: string | null;
65
+ /** Script arguments (passed to script file for variable substitution) */
66
+ scriptArgs: string[];
55
67
  }
56
68
  /**
57
69
  * Tool call tracking
@@ -1 +1 @@
1
- {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/types/runner.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,QAAQ,GAAG,SAAS,CAAC;AAEvD,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,SAAS,GAAG,QAAQ,CAAC;AAEzD;;;GAGG;AACH,MAAM,MAAM,YAAY,GAAG,aAAa,GAAG,SAAS,GAAG,OAAO,CAAC;AAE/D,eAAO,MAAM,cAAc;;;;CAIjB,CAAC;AAEX;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAAC;AAEtD;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,SAAS,CAAC;IACrB,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;IACtB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,gBAAgB,EAAE,MAAM,CAAC;IACzB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED;;GAEG;AACH,eAAO,MAAM,cAAc,EAAE,YAS5B,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,UAAU,EAAE,UAAU,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,UAAU,EAAE,OAAO,CAAC;IACpB,MAAM,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;CAC/B;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,EAAE,EAAE,MAAM,CAAC;CACZ;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,EAAE,EAAE,MAAM,CAAC;CACZ;AAED;;GAEG;AACH,eAAO,MAAM,cAAc,EAAE,MAAM,EAMlC,CAAC"}
1
+ {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/types/runner.ts"],"names":[],"mappings":"AAAA;;GAEG;AAQH,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,QAAQ,GAAG,SAAS,CAAC;AAEvD,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,SAAS,GAAG,QAAQ,CAAC;AAEzD;;;GAGG;AACH,MAAM,MAAM,YAAY,GAAG,aAAa,GAAG,SAAS,GAAG,OAAO,CAAC;AAE/D,eAAO,MAAM,cAAc;;;;CAIjB,CAAC;AAEX;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAAC;AAEtD;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,YAAY,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,SAAS,CAAC;IACrB,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;IACtB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,gBAAgB,EAAE,MAAM,CAAC;IACzB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED;;GAEG;AACH,eAAO,MAAM,cAAc,EAAE,YAS5B,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,UAAU,EAAE,UAAU,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;IACvB,qDAAqD;IACrD,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,UAAU,EAAE,OAAO,CAAC;IACpB,MAAM,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;IAC9B,iDAAiD;IACjD,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,yEAAyE;IACzE,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,EAAE,EAAE,MAAM,CAAC;CACZ;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,EAAE,EAAE,MAAM,CAAC;CACZ;AAED;;GAEG;AACH,eAAO,MAAM,cAAc,EAAE,MAAM,EAMlC,CAAC"}
@@ -1,6 +1,7 @@
1
1
  /**
2
2
  * Runner configuration and state types
3
3
  */
4
+ import { DEFAULT_ITERATION_PAUSE_MS, DEFAULT_MAX_ITERATIONS, DEFAULT_PARALLEL_THRESHOLD_MS, } from '../utils/constants.js';
4
5
  export const RUNNER_SIGNALS = {
5
6
  REPEAT_STEP: ':::RUNNER::REPEAT_STEP:::',
6
7
  BLOCKED: ':::RUNNER::BLOCKED:::',
@@ -13,9 +14,9 @@ export const DEFAULT_CONFIG = {
13
14
  verbosity: 'normal',
14
15
  enableLog: true,
15
16
  logDir: 'logs',
16
- maxIterations: 10,
17
- parallelThresholdMs: 100,
18
- iterationPauseMs: 2000,
17
+ maxIterations: DEFAULT_MAX_ITERATIONS,
18
+ parallelThresholdMs: DEFAULT_PARALLEL_THRESHOLD_MS,
19
+ iterationPauseMs: DEFAULT_ITERATION_PAUSE_MS,
19
20
  model: null,
20
21
  deaddrop: false,
21
22
  };
@@ -1 +1 @@
1
- {"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/types/runner.ts"],"names":[],"mappings":"AAAA;;GAEG;AAYH,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,WAAW,EAAE,2BAA2B;IACxC,OAAO,EAAE,uBAAuB;IAChC,KAAK,EAAE,qBAAqB;CACpB,CAAC;AA8BX;;GAEG;AACH,MAAM,CAAC,MAAM,cAAc,GAAiB;IAC1C,SAAS,EAAE,QAAQ;IACnB,SAAS,EAAE,IAAI;IACf,MAAM,EAAE,MAAM;IACd,aAAa,EAAE,EAAE;IACjB,mBAAmB,EAAE,GAAG;IACxB,gBAAgB,EAAE,IAAI;IACtB,KAAK,EAAE,IAAI;IACX,QAAQ,EAAE,KAAK;CAChB,CAAC;AAgCF;;GAEG;AACH,MAAM,CAAC,MAAM,cAAc,GAAa;IACtC,UAAU;IACV,gBAAgB;IAChB,UAAU;IACV,eAAe;IACf,QAAQ;CACT,CAAC"}
1
+ {"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/types/runner.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,0BAA0B,EAC1B,sBAAsB,EACtB,6BAA6B,GAC9B,MAAM,uBAAuB,CAAC;AAY/B,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,WAAW,EAAE,2BAA2B;IACxC,OAAO,EAAE,uBAAuB;IAChC,KAAK,EAAE,qBAAqB;CACpB,CAAC;AAsCX;;GAEG;AACH,MAAM,CAAC,MAAM,cAAc,GAAiB;IAC1C,SAAS,EAAE,QAAQ;IACnB,SAAS,EAAE,IAAI;IACf,MAAM,EAAE,MAAM;IACd,aAAa,EAAE,sBAAsB;IACrC,mBAAmB,EAAE,6BAA6B;IAClD,gBAAgB,EAAE,0BAA0B;IAC5C,KAAK,EAAE,IAAI;IACX,QAAQ,EAAE,KAAK;CAChB,CAAC;AAqCF;;GAEG;AACH,MAAM,CAAC,MAAM,cAAc,GAAa;IACtC,UAAU;IACV,gBAAgB;IAChB,UAAU;IACV,eAAe;IACf,QAAQ;CACT,CAAC"}
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Type-safe tool input handling
3
+ * Provides discriminated union types for tool inputs
4
+ */
5
+ /**
6
+ * Read tool input
7
+ */
8
+ export interface ReadToolInput {
9
+ file_path: string;
10
+ offset?: number;
11
+ limit?: number;
12
+ }
13
+ /**
14
+ * Glob tool input
15
+ */
16
+ export interface GlobToolInput {
17
+ pattern: string;
18
+ path?: string;
19
+ }
20
+ /**
21
+ * Grep tool input
22
+ */
23
+ export interface GrepToolInput {
24
+ pattern: string;
25
+ path?: string;
26
+ glob?: string;
27
+ type?: string;
28
+ }
29
+ /**
30
+ * Bash tool input
31
+ */
32
+ export interface BashToolInput {
33
+ command: string;
34
+ description?: string;
35
+ timeout?: number;
36
+ }
37
+ /**
38
+ * Task tool input
39
+ */
40
+ export interface TaskToolInput {
41
+ description?: string;
42
+ prompt?: string;
43
+ subagent_type?: string;
44
+ }
45
+ /**
46
+ * Write tool input
47
+ */
48
+ export interface WriteToolInput {
49
+ file_path: string;
50
+ content: string;
51
+ }
52
+ /**
53
+ * Edit tool input
54
+ */
55
+ export interface EditToolInput {
56
+ file_path: string;
57
+ old_string: string;
58
+ new_string: string;
59
+ }
60
+ /**
61
+ * Get a string field from tool input with safe fallback
62
+ */
63
+ export declare function getToolInputString(input: Record<string, unknown>, field: string, defaultValue?: string): string;
64
+ //# sourceMappingURL=tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../src/types/tools.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,KAAK,EAAE,MAAM,EACb,YAAY,SAAK,GAChB,MAAM,CAGR"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Type-safe tool input handling
3
+ * Provides discriminated union types for tool inputs
4
+ */
5
+ /**
6
+ * Get a string field from tool input with safe fallback
7
+ */
8
+ export function getToolInputString(input, field, defaultValue = '') {
9
+ const value = input[field];
10
+ return typeof value === 'string' ? value : defaultValue;
11
+ }
12
+ //# sourceMappingURL=tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/types/tools.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAgEH;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAChC,KAA8B,EAC9B,KAAa,EACb,YAAY,GAAG,EAAE;IAEjB,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;IAC3B,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC;AAC1D,CAAC"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Shared argument parsing utilities
3
+ */
4
+ /**
5
+ * Parsed argument hint result
6
+ */
7
+ export interface ArgumentHintResult {
8
+ requiredCount: number;
9
+ optionalPositions: Set<number>;
10
+ }
11
+ /**
12
+ * Parse argument-hint to determine required vs optional args
13
+ * Convention: <arg> = required, [arg] = optional
14
+ *
15
+ * @param hint - Argument hint string like "<file> [options]"
16
+ * @returns Object with requiredCount and set of optional positions
17
+ */
18
+ export declare function parseArgumentHint(hint: string | undefined): ArgumentHintResult;
19
+ //# sourceMappingURL=arguments.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"arguments.d.ts","sourceRoot":"","sources":["../../src/utils/arguments.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,aAAa,EAAE,MAAM,CAAC;IACtB,iBAAiB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CAChC;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,MAAM,GAAG,SAAS,GACvB,kBAAkB,CAqBpB"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Shared argument parsing utilities
3
+ */
4
+ /**
5
+ * Parse argument-hint to determine required vs optional args
6
+ * Convention: <arg> = required, [arg] = optional
7
+ *
8
+ * @param hint - Argument hint string like "<file> [options]"
9
+ * @returns Object with requiredCount and set of optional positions
10
+ */
11
+ export function parseArgumentHint(hint) {
12
+ if (!hint) {
13
+ return { requiredCount: 0, optionalPositions: new Set() };
14
+ }
15
+ const optionalPositions = new Set();
16
+ let position = 0;
17
+ let requiredCount = 0;
18
+ const argPattern = /<[^>]+>|\[[^\]]+\]/g;
19
+ let match;
20
+ while ((match = argPattern.exec(hint)) !== null) {
21
+ position++;
22
+ if (match[0].startsWith('[')) {
23
+ optionalPositions.add(position);
24
+ }
25
+ else {
26
+ requiredCount = position;
27
+ }
28
+ }
29
+ return { requiredCount, optionalPositions };
30
+ }
31
+ //# sourceMappingURL=arguments.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"arguments.js","sourceRoot":"","sources":["../../src/utils/arguments.ts"],"names":[],"mappings":"AAAA;;GAEG;AAUH;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAC/B,IAAwB;IAExB,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,EAAE,aAAa,EAAE,CAAC,EAAE,iBAAiB,EAAE,IAAI,GAAG,EAAE,EAAE,CAAC;IAC5D,CAAC;IAED,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAAU,CAAC;IAC5C,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,IAAI,aAAa,GAAG,CAAC,CAAC;IAEtB,MAAM,UAAU,GAAG,qBAAqB,CAAC;IACzC,IAAI,KAAK,CAAC;IACV,OAAO,CAAC,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QAChD,QAAQ,EAAE,CAAC;QACX,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC7B,iBAAiB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAClC,CAAC;aAAM,CAAC;YACN,aAAa,GAAG,QAAQ,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,CAAC;AAC9C,CAAC"}