@rcrsr/claude-code-runner 0.1.0 → 0.4.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.
- package/README.md +45 -17
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +58 -27
- package/dist/cli/args.js.map +1 -1
- package/dist/core/runner.d.ts +2 -1
- package/dist/core/runner.d.ts.map +1 -1
- package/dist/core/runner.js +27 -54
- package/dist/core/runner.js.map +1 -1
- package/dist/deaddrop/client.d.ts +23 -0
- package/dist/deaddrop/client.d.ts.map +1 -0
- package/dist/deaddrop/client.js +47 -0
- package/dist/deaddrop/client.js.map +1 -0
- package/dist/deaddrop/index.d.ts +2 -0
- package/dist/deaddrop/index.d.ts.map +1 -0
- package/dist/deaddrop/index.js +2 -0
- package/dist/deaddrop/index.js.map +1 -0
- package/dist/index.js +52 -47
- package/dist/index.js.map +1 -1
- package/dist/output/colors.d.ts +42 -0
- package/dist/output/colors.d.ts.map +1 -1
- package/dist/output/colors.js +106 -4
- package/dist/output/colors.js.map +1 -1
- package/dist/output/formatter.d.ts +1 -0
- package/dist/output/formatter.d.ts.map +1 -1
- package/dist/output/formatter.js +21 -37
- package/dist/output/formatter.js.map +1 -1
- package/dist/output/logger.d.ts.map +1 -1
- package/dist/output/logger.js +3 -2
- package/dist/output/logger.js.map +1 -1
- package/dist/parsers/signals.d.ts.map +1 -1
- package/dist/parsers/signals.js +2 -5
- package/dist/parsers/signals.js.map +1 -1
- package/dist/process/pty.d.ts +1 -0
- package/dist/process/pty.d.ts.map +1 -1
- package/dist/process/pty.js +7 -3
- package/dist/process/pty.js.map +1 -1
- package/dist/templates/command.d.ts +35 -4
- package/dist/templates/command.d.ts.map +1 -1
- package/dist/templates/command.js +95 -20
- package/dist/templates/command.js.map +1 -1
- package/dist/types/runner.d.ts +5 -3
- package/dist/types/runner.d.ts.map +1 -1
- package/dist/types/runner.js +3 -2
- package/dist/types/runner.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/output/logger.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAQxC;;GAEG;AACH,MAAM,UAAU,YAAY,CAC1B,OAAgB,EAChB,MAAc,EACd,WAAmB;IAEnB,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO;YACL,GAAG,EAAE,GAAG,EAAE,CAAC,SAAS;YACpB,KAAK,EAAE,GAAG,EAAE,CAAC,SAAS;YACtB,QAAQ,EAAE,IAAI;SACf,CAAC;IACJ,CAAC;IAED,8BAA8B;IAC9B,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3B,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED,8BAA8B;IAC9B,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC9E,MAAM,aAAa,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IACzD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,aAAa,IAAI,SAAS,MAAM,CAAC,CAAC;IACvE,MAAM,SAAS,GAAG,EAAE,CAAC,iBAAiB,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;IAEhE,OAAO;QACL,GAAG,CAAC,GAAW;YACb,
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/output/logger.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAQxC;;GAEG;AACH,MAAM,UAAU,YAAY,CAC1B,OAAgB,EAChB,MAAc,EACd,WAAmB;IAEnB,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO;YACL,GAAG,EAAE,GAAG,EAAE,CAAC,SAAS;YACpB,KAAK,EAAE,GAAG,EAAE,CAAC,SAAS;YACtB,QAAQ,EAAE,IAAI;SACf,CAAC;IACJ,CAAC;IAED,8BAA8B;IAC9B,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3B,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED,8BAA8B;IAC9B,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC9E,MAAM,aAAa,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IACzD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,aAAa,IAAI,SAAS,MAAM,CAAC,CAAC;IACvE,MAAM,SAAS,GAAG,EAAE,CAAC,iBAAiB,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;IAEhE,OAAO;QACL,GAAG,CAAC,GAAW;YACb,6CAA6C;YAC7C,MAAM,KAAK,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YAChD,SAAS,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC;QAChC,CAAC;QACD,KAAK;YACH,SAAS,CAAC,GAAG,EAAE,CAAC;QAClB,CAAC;QACD,QAAQ,EAAE,OAAO;KAClB,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"signals.d.ts","sourceRoot":"","sources":["../../src/parsers/signals.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAkB,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvE;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"signals.d.ts","sourceRoot":"","sources":["../../src/parsers/signals.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAkB,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvE;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAWpE"}
|
package/dist/parsers/signals.js
CHANGED
|
@@ -7,11 +7,8 @@ import { RUNNER_SIGNALS } from '../types/runner.js';
|
|
|
7
7
|
* Returns null if no signal found
|
|
8
8
|
*/
|
|
9
9
|
export function detectRunnerSignal(text) {
|
|
10
|
-
if (text.includes(RUNNER_SIGNALS.
|
|
11
|
-
return '
|
|
12
|
-
}
|
|
13
|
-
if (text.includes(RUNNER_SIGNALS.CONTINUE)) {
|
|
14
|
-
return 'continue';
|
|
10
|
+
if (text.includes(RUNNER_SIGNALS.REPEAT_STEP)) {
|
|
11
|
+
return 'repeat_step';
|
|
15
12
|
}
|
|
16
13
|
if (text.includes(RUNNER_SIGNALS.BLOCKED)) {
|
|
17
14
|
return 'blocked';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"signals.js","sourceRoot":"","sources":["../../src/parsers/signals.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,cAAc,EAAqB,MAAM,oBAAoB,CAAC;AAEvE;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,IAAI,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,
|
|
1
|
+
{"version":3,"file":"signals.js","sourceRoot":"","sources":["../../src/parsers/signals.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,cAAc,EAAqB,MAAM,oBAAoB,CAAC;AAEvE;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,IAAI,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,WAAW,CAAC,EAAE,CAAC;QAC9C,OAAO,aAAa,CAAC;IACvB,CAAC;IACD,IAAI,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,CAAC;QAC1C,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IAAI,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC;QACxC,OAAO,OAAO,CAAC;IACjB,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
|
package/dist/process/pty.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pty.d.ts","sourceRoot":"","sources":["../../src/process/pty.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAM7D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAElD,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAE/D,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,SAAS,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,cAAc,CAAC;IAC/B,mBAAmB,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"pty.d.ts","sourceRoot":"","sources":["../../src/process/pty.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAM7D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAElD,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAE/D,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,SAAS,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,cAAc,CAAC;IAC/B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,SAAS,CAAC,CA8D7E"}
|
package/dist/process/pty.js
CHANGED
|
@@ -8,21 +8,25 @@ import { createStreamParser } from '../parsers/stream.js';
|
|
|
8
8
|
* Spawn Claude CLI process with PTY
|
|
9
9
|
*/
|
|
10
10
|
export function spawnClaude(options) {
|
|
11
|
-
const { prompt, cwd, verbosity, logger, formatterState, parallelThresholdMs, } = options;
|
|
11
|
+
const { prompt, cwd, verbosity, logger, formatterState, parallelThresholdMs, model, } = options;
|
|
12
12
|
return new Promise((resolve) => {
|
|
13
13
|
// Reset state for new run
|
|
14
14
|
resetFormatterState(formatterState);
|
|
15
15
|
const runStart = Date.now();
|
|
16
16
|
let claudeText = '';
|
|
17
17
|
const parser = createStreamParser();
|
|
18
|
-
const
|
|
18
|
+
const args = [
|
|
19
19
|
'-p',
|
|
20
20
|
prompt,
|
|
21
21
|
'--dangerously-skip-permissions',
|
|
22
22
|
'--verbose',
|
|
23
23
|
'--output-format',
|
|
24
24
|
'stream-json',
|
|
25
|
-
]
|
|
25
|
+
];
|
|
26
|
+
if (model) {
|
|
27
|
+
args.push('--model', model);
|
|
28
|
+
}
|
|
29
|
+
const ptyProcess = pty.spawn('claude', args, {
|
|
26
30
|
name: 'xterm-256color',
|
|
27
31
|
cols: 200,
|
|
28
32
|
rows: 50,
|
package/dist/process/pty.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pty.js","sourceRoot":"","sources":["../../src/process/pty.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,GAAG,MAAM,UAAU,CAAC;AAGhC,OAAO,EACL,iBAAiB,EACjB,aAAa,EACb,mBAAmB,GACpB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"pty.js","sourceRoot":"","sources":["../../src/process/pty.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,GAAG,MAAM,UAAU,CAAC;AAGhC,OAAO,EACL,iBAAiB,EACjB,aAAa,EACb,mBAAmB,GACpB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAa1D;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,OAA6B;IACvD,MAAM,EACJ,MAAM,EACN,GAAG,EACH,SAAS,EACT,MAAM,EACN,cAAc,EACd,mBAAmB,EACnB,KAAK,GACN,GAAG,OAAO,CAAC;IAEZ,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,0BAA0B;QAC1B,mBAAmB,CAAC,cAAc,CAAC,CAAC;QAEpC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC5B,IAAI,UAAU,GAAG,EAAE,CAAC;QACpB,MAAM,MAAM,GAAG,kBAAkB,EAAE,CAAC;QAEpC,MAAM,IAAI,GAAG;YACX,IAAI;YACJ,MAAM;YACN,gCAAgC;YAChC,WAAW;YACX,iBAAiB;YACjB,aAAa;SACd,CAAC;QAEF,IAAI,KAAK,EAAE,CAAC;YACV,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QAC9B,CAAC;QAED,MAAM,UAAU,GAAS,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE;YACjD,IAAI,EAAE,gBAAgB;YACtB,IAAI,EAAE,GAAG;YACT,IAAI,EAAE,EAAE;YACR,GAAG;YACH,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE;SACxB,CAAC,CAAC;QAEH,UAAU,CAAC,MAAM,CAAC,CAAC,IAAY,EAAE,EAAE;YACjC,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAEtC,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;gBAC3B,MAAM,IAAI,GAAG,aAAa,CACxB,GAAG,EACH,cAAc,EACd,SAAS,EACT,MAAM,EACN,mBAAmB,CACpB,CAAC;gBACF,UAAU,IAAI,IAAI,CAAC;gBACnB,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;YAClC,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,UAAU,CAAC,MAAM,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE;YACjC,iBAAiB,CAAC,cAAc,EAAE,SAAS,CAAC,CAAC;YAC7C,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,CAAC,GAAG,IAAI,CAAC,CAAC;YAC5D,OAAO,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC,CAAC;QAC9C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -2,16 +2,47 @@
|
|
|
2
2
|
* Command template loading and variable substitution
|
|
3
3
|
*/
|
|
4
4
|
/**
|
|
5
|
-
*
|
|
6
|
-
|
|
5
|
+
* Frontmatter metadata from command template
|
|
6
|
+
*/
|
|
7
|
+
export interface CommandFrontmatter {
|
|
8
|
+
model?: string;
|
|
9
|
+
description?: string;
|
|
10
|
+
argumentHint?: string;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Result of loading a command template
|
|
14
|
+
*/
|
|
15
|
+
export interface CommandTemplate {
|
|
16
|
+
prompt: string;
|
|
17
|
+
frontmatter: CommandFrontmatter;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Parse YAML frontmatter from markdown content
|
|
21
|
+
* Returns the frontmatter object and remaining content
|
|
22
|
+
*/
|
|
23
|
+
export declare function parseFrontmatter(content: string): {
|
|
24
|
+
frontmatter: CommandFrontmatter;
|
|
25
|
+
body: string;
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* Strip YAML frontmatter from markdown content (legacy helper)
|
|
7
29
|
*/
|
|
8
30
|
export declare function stripFrontmatter(content: string): string;
|
|
9
31
|
/**
|
|
10
32
|
* Load a command template and substitute positional arguments
|
|
11
33
|
* Templates are loaded from .claude/commands/<name>.md
|
|
12
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
|
+
*
|
|
13
44
|
* @param commandName - Name of the command (without .md extension)
|
|
14
|
-
* @param cmdArgs - Positional arguments to substitute
|
|
45
|
+
* @param cmdArgs - Positional arguments to substitute
|
|
15
46
|
*/
|
|
16
|
-
export declare function loadCommandTemplate(commandName: string, cmdArgs: string[]):
|
|
47
|
+
export declare function loadCommandTemplate(commandName: string, cmdArgs: string[]): CommandTemplate;
|
|
17
48
|
//# 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;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,
|
|
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"}
|
|
@@ -4,45 +4,120 @@
|
|
|
4
4
|
import * as fs from 'fs';
|
|
5
5
|
import * as path from 'path';
|
|
6
6
|
/**
|
|
7
|
-
*
|
|
8
|
-
*
|
|
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)
|
|
9
10
|
*/
|
|
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
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Parse YAML frontmatter from markdown content
|
|
34
|
+
* Returns the frontmatter object and remaining content
|
|
35
|
+
*/
|
|
36
|
+
export function parseFrontmatter(content) {
|
|
11
37
|
if (!content.startsWith('---')) {
|
|
12
|
-
return content;
|
|
38
|
+
return { frontmatter: {}, body: content };
|
|
13
39
|
}
|
|
14
40
|
const endIndex = content.indexOf('\n---', 3);
|
|
15
41
|
if (endIndex === -1) {
|
|
16
|
-
return content;
|
|
42
|
+
return { frontmatter: {}, body: content };
|
|
17
43
|
}
|
|
18
|
-
|
|
44
|
+
const yamlContent = content.slice(4, endIndex);
|
|
45
|
+
const body = content.slice(endIndex + 4).trimStart();
|
|
46
|
+
// Simple YAML parsing for known fields
|
|
47
|
+
const frontmatter = {};
|
|
48
|
+
const keyValueRegex = /^(\S+):\s*(.*)$/;
|
|
49
|
+
for (const line of yamlContent.split('\n')) {
|
|
50
|
+
const match = keyValueRegex.exec(line);
|
|
51
|
+
if (match) {
|
|
52
|
+
const [, key, value] = match;
|
|
53
|
+
const trimmedValue = value?.trim().replace(/^["']|["']$/g, '') ?? '';
|
|
54
|
+
if (key === 'model' && trimmedValue) {
|
|
55
|
+
frontmatter.model = trimmedValue;
|
|
56
|
+
}
|
|
57
|
+
else if (key === 'description' && trimmedValue) {
|
|
58
|
+
frontmatter.description = trimmedValue;
|
|
59
|
+
}
|
|
60
|
+
else if (key === 'argument-hint' && trimmedValue) {
|
|
61
|
+
frontmatter.argumentHint = trimmedValue;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return { frontmatter, body };
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Strip YAML frontmatter from markdown content (legacy helper)
|
|
69
|
+
*/
|
|
70
|
+
export function stripFrontmatter(content) {
|
|
71
|
+
return parseFrontmatter(content).body;
|
|
19
72
|
}
|
|
20
73
|
/**
|
|
21
74
|
* Load a command template and substitute positional arguments
|
|
22
75
|
* Templates are loaded from .claude/commands/<name>.md
|
|
23
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
|
+
*
|
|
24
86
|
* @param commandName - Name of the command (without .md extension)
|
|
25
|
-
* @param cmdArgs - Positional arguments to substitute
|
|
87
|
+
* @param cmdArgs - Positional arguments to substitute
|
|
26
88
|
*/
|
|
27
89
|
export function loadCommandTemplate(commandName, cmdArgs) {
|
|
28
90
|
const commandFile = path.join(process.cwd(), '.claude', 'commands', `${commandName}.md`);
|
|
29
91
|
if (!fs.existsSync(commandFile)) {
|
|
30
|
-
|
|
31
|
-
|
|
92
|
+
throw new Error(`Command not found: ${commandFile}`);
|
|
93
|
+
}
|
|
94
|
+
const content = fs.readFileSync(commandFile, 'utf-8');
|
|
95
|
+
const { frontmatter, body } = parseFrontmatter(content);
|
|
96
|
+
// Parse argument hints to determine required vs optional
|
|
97
|
+
const { requiredCount, optionalPositions } = parseArgumentHint(frontmatter.argumentHint);
|
|
98
|
+
// Check for missing required arguments
|
|
99
|
+
if (cmdArgs.length < requiredCount) {
|
|
100
|
+
const missing = [];
|
|
101
|
+
for (let i = cmdArgs.length + 1; i <= requiredCount; i++) {
|
|
102
|
+
if (!optionalPositions.has(i)) {
|
|
103
|
+
missing.push(`$${i}`);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
if (missing.length > 0) {
|
|
107
|
+
const hint = frontmatter.argumentHint
|
|
108
|
+
? ` (usage: ${frontmatter.argumentHint})`
|
|
109
|
+
: '';
|
|
110
|
+
throw new Error(`Missing required arguments: ${missing.join(', ')}${hint}`);
|
|
111
|
+
}
|
|
32
112
|
}
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
template = stripFrontmatter(template);
|
|
113
|
+
// Substitute $ARGUMENTS with all args joined
|
|
114
|
+
let prompt = body.replace(/\$ARGUMENTS/g, cmdArgs.join(' '));
|
|
36
115
|
// Substitute $1, $2, $3, ... with positional args
|
|
37
116
|
for (const [i, arg] of cmdArgs.entries()) {
|
|
38
|
-
|
|
39
|
-
}
|
|
40
|
-
// Warn about unsubstituted variables
|
|
41
|
-
const unsubstituted = template.match(/\$\d+/g);
|
|
42
|
-
if (unsubstituted) {
|
|
43
|
-
const unique = [...new Set(unsubstituted)];
|
|
44
|
-
console.error(`Warning: unsubstituted variables: ${unique.join(', ')}`);
|
|
117
|
+
prompt = prompt.replace(new RegExp(`\\$${i + 1}`, 'g'), arg);
|
|
45
118
|
}
|
|
46
|
-
|
|
119
|
+
// Replace any remaining $N with empty string (optional args)
|
|
120
|
+
prompt = prompt.replace(/\$\d+/g, '');
|
|
121
|
+
return { prompt, frontmatter };
|
|
47
122
|
}
|
|
48
123
|
//# 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;
|
|
1
|
+
{"version":3,"file":"command.js","sourceRoot":"","sources":["../../src/templates/command.ts"],"names":[],"mappings":"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"}
|
package/dist/types/runner.d.ts
CHANGED
|
@@ -7,10 +7,9 @@ export type Subcommand = 'prompt' | 'command' | 'script';
|
|
|
7
7
|
* Runner signals for iteration control
|
|
8
8
|
* Claude outputs these to control the runner loop
|
|
9
9
|
*/
|
|
10
|
-
export type RunnerSignal = '
|
|
10
|
+
export type RunnerSignal = 'repeat_step' | 'blocked' | 'error';
|
|
11
11
|
export declare const RUNNER_SIGNALS: {
|
|
12
|
-
readonly
|
|
13
|
-
readonly CONTINUE: ":::RUNNER::CONTINUE:::";
|
|
12
|
+
readonly REPEAT_STEP: ":::RUNNER::REPEAT_STEP:::";
|
|
14
13
|
readonly BLOCKED: ":::RUNNER::BLOCKED:::";
|
|
15
14
|
readonly ERROR: ":::RUNNER::ERROR:::";
|
|
16
15
|
};
|
|
@@ -36,6 +35,8 @@ export interface RunnerConfig {
|
|
|
36
35
|
maxIterations: number;
|
|
37
36
|
parallelThresholdMs: number;
|
|
38
37
|
iterationPauseMs: number;
|
|
38
|
+
model: string | null;
|
|
39
|
+
deaddrop: boolean;
|
|
39
40
|
}
|
|
40
41
|
/**
|
|
41
42
|
* Default runner configuration
|
|
@@ -47,6 +48,7 @@ export declare const DEFAULT_CONFIG: RunnerConfig;
|
|
|
47
48
|
export interface ParsedArgs {
|
|
48
49
|
subcommand: Subcommand;
|
|
49
50
|
prompt: string;
|
|
51
|
+
displayCommand: string;
|
|
50
52
|
scriptLines: string[];
|
|
51
53
|
scriptMode: boolean;
|
|
52
54
|
config: Partial<RunnerConfig>;
|
|
@@ -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,
|
|
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"}
|
package/dist/types/runner.js
CHANGED
|
@@ -2,8 +2,7 @@
|
|
|
2
2
|
* Runner configuration and state types
|
|
3
3
|
*/
|
|
4
4
|
export const RUNNER_SIGNALS = {
|
|
5
|
-
|
|
6
|
-
CONTINUE: ':::RUNNER::CONTINUE:::',
|
|
5
|
+
REPEAT_STEP: ':::RUNNER::REPEAT_STEP:::',
|
|
7
6
|
BLOCKED: ':::RUNNER::BLOCKED:::',
|
|
8
7
|
ERROR: ':::RUNNER::ERROR:::',
|
|
9
8
|
};
|
|
@@ -17,6 +16,8 @@ export const DEFAULT_CONFIG = {
|
|
|
17
16
|
maxIterations: 10,
|
|
18
17
|
parallelThresholdMs: 100,
|
|
19
18
|
iterationPauseMs: 2000,
|
|
19
|
+
model: null,
|
|
20
|
+
deaddrop: false,
|
|
20
21
|
};
|
|
21
22
|
/**
|
|
22
23
|
* Noise patterns to filter from output
|
package/dist/types/runner.js.map
CHANGED
|
@@ -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,
|
|
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"}
|
package/package.json
CHANGED