@rcrsr/claude-code-runner 0.3.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 +29 -8
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +23 -5
- package/dist/cli/args.js.map +1 -1
- package/dist/core/runner.d.ts +1 -0
- package/dist/core/runner.d.ts.map +1 -1
- package/dist/core/runner.js +16 -11
- 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 +41 -12
- package/dist/index.js.map +1 -1
- package/dist/output/colors.d.ts +31 -5
- package/dist/output/colors.d.ts.map +1 -1
- package/dist/output/colors.js +85 -14
- 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 +5 -6
- package/dist/output/formatter.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 +1 -0
- package/dist/types/runner.d.ts.map +1 -1
- package/dist/types/runner.js +1 -0
- package/dist/types/runner.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -58,7 +58,26 @@ Review the code in $1 for:
|
|
|
58
58
|
Output findings as a numbered list.
|
|
59
59
|
```
|
|
60
60
|
|
|
61
|
-
|
|
61
|
+
**Template variables:**
|
|
62
|
+
|
|
63
|
+
- `$1`, `$2`, `$3`... — Positional arguments
|
|
64
|
+
- `$ARGUMENTS` — All arguments joined with spaces
|
|
65
|
+
|
|
66
|
+
**Frontmatter support:**
|
|
67
|
+
|
|
68
|
+
```markdown
|
|
69
|
+
---
|
|
70
|
+
description: Review code for issues
|
|
71
|
+
argument-hint: <file> [severity]
|
|
72
|
+
model: claude-sonnet-4-20250514
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
Review $1 with severity level $2...
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
- `argument-hint` — Defines required `<arg>` and optional `[arg]` arguments
|
|
79
|
+
- `model` — Default model for this command (CLI `--model` takes precedence)
|
|
80
|
+
- `description` — Command description
|
|
62
81
|
|
|
63
82
|
### script — Run multiple commands in sequence
|
|
64
83
|
|
|
@@ -81,13 +100,15 @@ Scripts stop on `BLOCKED` or `ERROR` signals, letting you catch issues before co
|
|
|
81
100
|
|
|
82
101
|
### Options
|
|
83
102
|
|
|
84
|
-
| Option
|
|
85
|
-
|
|
|
86
|
-
| `--
|
|
87
|
-
| `--
|
|
88
|
-
| `--
|
|
89
|
-
| `--
|
|
90
|
-
| `--
|
|
103
|
+
| Option | Description |
|
|
104
|
+
| ----------------- | ------------------------------------------------------ |
|
|
105
|
+
| `--version`, `-V` | Print version number |
|
|
106
|
+
| `--model`, `-m` | Specify Claude model (e.g., `sonnet`, `opus`, `haiku`) |
|
|
107
|
+
| `--quiet` | Minimal output (errors only) |
|
|
108
|
+
| `--normal` | Default output level |
|
|
109
|
+
| `--verbose` | Full output with details |
|
|
110
|
+
| `--no-log` | Disable file logging |
|
|
111
|
+
| `--deaddrop` | Enable [DeadDrop](https://deaddrop.sh) streaming |
|
|
91
112
|
|
|
92
113
|
**Example with model selection:**
|
|
93
114
|
|
package/dist/cli/args.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"args.d.ts","sourceRoot":"","sources":["../../src/cli/args.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"args.d.ts","sourceRoot":"","sources":["../../src/cli/args.ts"],"names":[],"mappings":"AAAA;;GAEG;AASH,OAAO,KAAK,EACV,UAAU,EAIX,MAAM,mBAAmB,CAAC;AAkD3B;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,CAmBjE;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,CAsEpD;AAED;;GAEG;AACH,wBAAgB,UAAU,IAAI,IAAI,CA2BjC"}
|
package/dist/cli/args.js
CHANGED
|
@@ -2,14 +2,23 @@
|
|
|
2
2
|
* CLI argument parsing
|
|
3
3
|
*/
|
|
4
4
|
import * as fs from 'fs';
|
|
5
|
+
import { createRequire } from 'module';
|
|
5
6
|
import { loadCommandTemplate } from '../templates/command.js';
|
|
7
|
+
const require = createRequire(import.meta.url);
|
|
8
|
+
const pkg = require('../../package.json');
|
|
6
9
|
/**
|
|
7
10
|
* Extract options from raw args, returning positional args and config
|
|
8
11
|
*/
|
|
9
12
|
function extractOptions(args) {
|
|
13
|
+
// Handle --version early
|
|
14
|
+
if (args.includes('--version') || args.includes('-V')) {
|
|
15
|
+
console.log(pkg.version);
|
|
16
|
+
process.exit(0);
|
|
17
|
+
}
|
|
10
18
|
let verbosity = 'normal';
|
|
11
19
|
let enableLog = true;
|
|
12
20
|
let model = null;
|
|
21
|
+
let deaddrop = false;
|
|
13
22
|
const positionalArgs = [];
|
|
14
23
|
for (let i = 0; i < args.length; i++) {
|
|
15
24
|
const arg = args[i];
|
|
@@ -25,6 +34,9 @@ function extractOptions(args) {
|
|
|
25
34
|
else if (arg === '--no-log') {
|
|
26
35
|
enableLog = false;
|
|
27
36
|
}
|
|
37
|
+
else if (arg === '--deaddrop') {
|
|
38
|
+
deaddrop = true;
|
|
39
|
+
}
|
|
28
40
|
else if (arg === '--model' || arg === '-m') {
|
|
29
41
|
model = args[++i] ?? null;
|
|
30
42
|
}
|
|
@@ -35,7 +47,7 @@ function extractOptions(args) {
|
|
|
35
47
|
positionalArgs.push(arg ?? '');
|
|
36
48
|
}
|
|
37
49
|
}
|
|
38
|
-
return { positionalArgs, verbosity, enableLog, model };
|
|
50
|
+
return { positionalArgs, verbosity, enableLog, model, deaddrop };
|
|
39
51
|
}
|
|
40
52
|
/**
|
|
41
53
|
* Parse a command line into a prompt
|
|
@@ -52,7 +64,8 @@ export function parseCommandLine(line) {
|
|
|
52
64
|
if (!cmdName) {
|
|
53
65
|
throw new Error('command requires a name');
|
|
54
66
|
}
|
|
55
|
-
|
|
67
|
+
const { prompt } = loadCommandTemplate(cmdName, parts.slice(2));
|
|
68
|
+
return { prompt };
|
|
56
69
|
}
|
|
57
70
|
else if (cmd === 'script') {
|
|
58
71
|
throw new Error('script cannot be nested');
|
|
@@ -66,12 +79,13 @@ export function parseCommandLine(line) {
|
|
|
66
79
|
* Parse CLI arguments
|
|
67
80
|
*/
|
|
68
81
|
export function parseArgs(args) {
|
|
69
|
-
const { positionalArgs, verbosity, enableLog, model } = extractOptions(args);
|
|
82
|
+
const { positionalArgs, verbosity, enableLog, model, deaddrop } = extractOptions(args);
|
|
70
83
|
const subcommand = (positionalArgs[0] ?? 'prompt');
|
|
71
84
|
let prompt = '';
|
|
72
85
|
let displayCommand = '';
|
|
73
86
|
let scriptMode = false;
|
|
74
87
|
let scriptLines = [];
|
|
88
|
+
let frontmatterModel = null;
|
|
75
89
|
switch (subcommand) {
|
|
76
90
|
case 'command': {
|
|
77
91
|
const commandName = positionalArgs[1];
|
|
@@ -80,7 +94,9 @@ export function parseArgs(args) {
|
|
|
80
94
|
console.error('Usage: claude-code-runner command <name> [args...]');
|
|
81
95
|
process.exit(1);
|
|
82
96
|
}
|
|
83
|
-
|
|
97
|
+
const template = loadCommandTemplate(commandName, positionalArgs.slice(2));
|
|
98
|
+
prompt = template.prompt;
|
|
99
|
+
frontmatterModel = template.frontmatter.model ?? null;
|
|
84
100
|
displayCommand = positionalArgs.slice(1).join(' ');
|
|
85
101
|
break;
|
|
86
102
|
}
|
|
@@ -113,7 +129,8 @@ export function parseArgs(args) {
|
|
|
113
129
|
const config = {
|
|
114
130
|
verbosity,
|
|
115
131
|
enableLog,
|
|
116
|
-
model,
|
|
132
|
+
model: model ?? frontmatterModel,
|
|
133
|
+
deaddrop,
|
|
117
134
|
};
|
|
118
135
|
return {
|
|
119
136
|
subcommand: scriptMode ? 'script' : subcommand,
|
|
@@ -152,6 +169,7 @@ Options:
|
|
|
152
169
|
--verbose Full output with all details
|
|
153
170
|
--no-log Disable logging to file (enabled by default)
|
|
154
171
|
--model, -m <model> Specify Claude model (e.g., sonnet, opus, haiku)
|
|
172
|
+
--deaddrop Send messages to Deaddrop (requires DEADDROP_API_KEY env var)
|
|
155
173
|
`);
|
|
156
174
|
}
|
|
157
175
|
//# sourceMappingURL=args.js.map
|
package/dist/cli/args.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"args.js","sourceRoot":"","sources":["../../src/cli/args.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"args.js","sourceRoot":"","sources":["../../src/cli/args.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AAEvC,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAE9D,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,GAAG,GAAG,OAAO,CAAC,oBAAoB,CAAwB,CAAC;AAgBjE;;GAEG;AACH,SAAS,cAAc,CAAC,IAAc;IACpC,yBAAyB;IACzB,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACtD,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACzB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,SAAS,GAAc,QAAQ,CAAC;IACpC,IAAI,SAAS,GAAG,IAAI,CAAC;IACrB,IAAI,KAAK,GAAkB,IAAI,CAAC;IAChC,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,MAAM,cAAc,GAAa,EAAE,CAAC;IAEpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YACtB,SAAS,GAAG,OAAO,CAAC;QACtB,CAAC;aAAM,IAAI,GAAG,KAAK,UAAU,EAAE,CAAC;YAC9B,SAAS,GAAG,QAAQ,CAAC;QACvB,CAAC;aAAM,IAAI,GAAG,KAAK,WAAW,EAAE,CAAC;YAC/B,SAAS,GAAG,SAAS,CAAC;QACxB,CAAC;aAAM,IAAI,GAAG,KAAK,UAAU,EAAE,CAAC;YAC9B,SAAS,GAAG,KAAK,CAAC;QACpB,CAAC;aAAM,IAAI,GAAG,KAAK,YAAY,EAAE,CAAC;YAChC,QAAQ,GAAG,IAAI,CAAC;QAClB,CAAC;aAAM,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YAC7C,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC;QAC5B,CAAC;aAAM,IAAI,GAAG,EAAE,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YACvC,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACvB,CAAC;aAAM,CAAC;YACN,cAAc,CAAC,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;IAED,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;AACnE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACvC,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IAErB,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;QACrB,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;IAC9C,CAAC;SAAM,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QAC7B,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACzB,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;QAC7C,CAAC;QACD,MAAM,EAAE,MAAM,EAAE,GAAG,mBAAmB,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAChE,OAAO,EAAE,MAAM,EAAE,CAAC;IACpB,CAAC;SAAM,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAC7C,CAAC;SAAM,CAAC;QACN,sBAAsB;QACtB,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;IACjC,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,IAAc;IACtC,MAAM,EAAE,cAAc,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,GAC7D,cAAc,CAAC,IAAI,CAAC,CAAC;IAEvB,MAAM,UAAU,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAe,CAAC;IACjE,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,IAAI,cAAc,GAAG,EAAE,CAAC;IACxB,IAAI,UAAU,GAAG,KAAK,CAAC;IACvB,IAAI,WAAW,GAAa,EAAE,CAAC;IAC/B,IAAI,gBAAgB,GAAkB,IAAI,CAAC;IAE3C,QAAQ,UAAU,EAAE,CAAC;QACnB,KAAK,SAAS,CAAC,CAAC,CAAC;YACf,MAAM,WAAW,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;YACtC,IAAI,CAAC,WAAW,EAAE,CAAC;gBACjB,OAAO,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;gBAC9C,OAAO,CAAC,KAAK,CAAC,oDAAoD,CAAC,CAAC;gBACpE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,MAAM,QAAQ,GAAG,mBAAmB,CAClC,WAAW,EACX,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,CACxB,CAAC;YACF,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;YACzB,gBAAgB,GAAG,QAAQ,CAAC,WAAW,CAAC,KAAK,IAAI,IAAI,CAAC;YACtD,cAAc,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACnD,MAAM;QACR,CAAC;QACD,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,UAAU,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;YACrC,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,OAAO,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;gBAC7C,OAAO,CAAC,KAAK,CAAC,yCAAyC,CAAC,CAAC;gBACzD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC/B,OAAO,CAAC,KAAK,CAAC,iCAAiC,UAAU,EAAE,CAAC,CAAC;gBAC7D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,WAAW,GAAG,EAAE;iBACb,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC;iBACjC,KAAK,CAAC,IAAI,CAAC;iBACX,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;iBACpB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,gCAAgC;YAC3E,UAAU,GAAG,IAAI,CAAC;YAClB,cAAc,GAAG,UAAU,UAAU,EAAE,CAAC;YACxC,MAAM;QACR,CAAC;QACD,KAAK,QAAQ;YACX,MAAM;gBACJ,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,4BAA4B,CAAC;YACpE,cAAc,GAAG,IAAI,MAAM,GAAG,CAAC;YAC/B,MAAM;IACV,CAAC;IAED,MAAM,MAAM,GAA0B;QACpC,SAAS;QACT,SAAS;QACT,KAAK,EAAE,KAAK,IAAI,gBAAgB;QAChC,QAAQ;KACT,CAAC;IAEF,OAAO;QACL,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU;QAC9C,MAAM;QACN,cAAc;QACd,WAAW;QACX,UAAU;QACV,MAAM;KACP,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU;IACxB,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;CAyBb,CAAC,CAAC;AACH,CAAC"}
|
package/dist/core/runner.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/core/runner.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAGlD,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAErE,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,YAAY,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,cAAc,CAAC;IAC/B,GAAG,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/core/runner.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAGlD,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAErE,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,YAAY,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,cAAc,CAAC;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAClC,UAAU,EAAE,MAAM,EAClB,cAAc,EAAE,MAAM,EACtB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,YAAY,CAAC,CAwFvB"}
|
package/dist/core/runner.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Core runner with iteration control and signal detection
|
|
3
3
|
*/
|
|
4
|
-
import { colors,
|
|
4
|
+
import { colors, formatDuration, printRunner } from '../output/colors.js';
|
|
5
5
|
import { detectRunnerSignal } from '../parsers/signals.js';
|
|
6
6
|
import { spawnClaude } from '../process/pty.js';
|
|
7
7
|
/**
|
|
@@ -9,7 +9,7 @@ import { spawnClaude } from '../process/pty.js';
|
|
|
9
9
|
* Handles iteration loop and signal detection
|
|
10
10
|
*/
|
|
11
11
|
export async function runWithSignals(promptText, displayCommand, startTime, context) {
|
|
12
|
-
const { config, logger, formatterState, cwd } = context;
|
|
12
|
+
const { config, logger, formatterState, cwd, runId } = context;
|
|
13
13
|
const { verbosity, maxIterations, parallelThresholdMs, iterationPauseMs, model, } = config;
|
|
14
14
|
let iteration = 0;
|
|
15
15
|
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- intentional infinite loop with internal exits
|
|
@@ -17,8 +17,8 @@ export async function runWithSignals(promptText, displayCommand, startTime, cont
|
|
|
17
17
|
iteration++;
|
|
18
18
|
// Check max iterations
|
|
19
19
|
if (iteration > maxIterations) {
|
|
20
|
-
const totalDuration =
|
|
21
|
-
printRunner(`${colors.red}Run stopped${colors.reset} max iterations (${maxIterations}) in ${
|
|
20
|
+
const totalDuration = Date.now() - startTime;
|
|
21
|
+
printRunner(`${colors.red}Run stopped${colors.reset} max iterations (${maxIterations}) in ${formatDuration(totalDuration)}`);
|
|
22
22
|
logger.log(`\nMAX ITERATIONS reached after ${maxIterations}`);
|
|
23
23
|
return 'error';
|
|
24
24
|
}
|
|
@@ -28,8 +28,10 @@ export async function runWithSignals(promptText, displayCommand, startTime, cont
|
|
|
28
28
|
}
|
|
29
29
|
// Print running message
|
|
30
30
|
if (verbosity !== 'quiet') {
|
|
31
|
-
printRunner(`Running step
|
|
31
|
+
printRunner(`Running step ${iteration}: ${displayCommand}`);
|
|
32
32
|
}
|
|
33
|
+
// Update formatter with current step
|
|
34
|
+
formatterState.currentStep = iteration;
|
|
33
35
|
// Run Claude
|
|
34
36
|
const { exitCode, claudeText } = await spawnClaude({
|
|
35
37
|
prompt: promptText,
|
|
@@ -41,15 +43,18 @@ export async function runWithSignals(promptText, displayCommand, startTime, cont
|
|
|
41
43
|
model,
|
|
42
44
|
});
|
|
43
45
|
const status = detectRunnerSignal(claudeText);
|
|
44
|
-
const totalDuration =
|
|
46
|
+
const totalDuration = Date.now() - startTime;
|
|
47
|
+
const totalSeconds = Math.round(totalDuration / 1000);
|
|
48
|
+
const runLabel = runId ? ` ${runId}` : '';
|
|
49
|
+
const stepLabel = ` (${iteration} step${iteration > 1 ? 's' : ''})`;
|
|
45
50
|
if (status === 'blocked') {
|
|
46
|
-
printRunner(`${colors.red}
|
|
47
|
-
logger.log(`\nBLOCKED after ${iteration} iterations, ${
|
|
51
|
+
printRunner(`${colors.red}Blocked run${runLabel}${colors.reset}${stepLabel} in ${formatDuration(totalDuration)}`);
|
|
52
|
+
logger.log(`\nBLOCKED after ${iteration} iterations, ${totalSeconds}s total`);
|
|
48
53
|
return 'blocked';
|
|
49
54
|
}
|
|
50
55
|
else if (status === 'error') {
|
|
51
|
-
printRunner(`${colors.red}
|
|
52
|
-
logger.log(`\nERROR after ${iteration} iterations, ${
|
|
56
|
+
printRunner(`${colors.red}Failed run${runLabel}${colors.reset}${stepLabel} in ${formatDuration(totalDuration)}`);
|
|
57
|
+
logger.log(`\nERROR after ${iteration} iterations, ${totalSeconds}s total`);
|
|
53
58
|
return 'error';
|
|
54
59
|
}
|
|
55
60
|
else if (status === 'repeat_step') {
|
|
@@ -60,7 +65,7 @@ export async function runWithSignals(promptText, displayCommand, startTime, cont
|
|
|
60
65
|
else {
|
|
61
66
|
// No status signal - treat as successful single run
|
|
62
67
|
const exitStatus = exitCode === 0 ? 'ok' : 'error';
|
|
63
|
-
printRunner(`${exitCode === 0 ? colors.green + '
|
|
68
|
+
printRunner(`${exitCode === 0 ? colors.green + 'Completed run' : colors.red + 'Failed run'}${runLabel}${colors.reset}${stepLabel} in ${formatDuration(totalDuration)}`);
|
|
64
69
|
logger.log(`\nCompleted after ${iteration} iteration(s), exit=${exitCode}`);
|
|
65
70
|
return exitStatus;
|
|
66
71
|
}
|
package/dist/core/runner.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/core/runner.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/core/runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DeadDrop client for sending messages to a Deaddrop endpoint
|
|
3
|
+
* https://deaddrop.sh
|
|
4
|
+
*/
|
|
5
|
+
export interface DeadDropConfig {
|
|
6
|
+
apiKey: string;
|
|
7
|
+
host: string;
|
|
8
|
+
runId: string;
|
|
9
|
+
}
|
|
10
|
+
export type DeadDropUser = 'Runner' | 'Claude Code';
|
|
11
|
+
export interface DeadDropClient {
|
|
12
|
+
send(content: string, user: DeadDropUser): Promise<void>;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Create a DeadDrop client from environment variables
|
|
16
|
+
* Returns null if DEADDROP_API_KEY is not set
|
|
17
|
+
*/
|
|
18
|
+
export declare function createDeadDropClientFromEnv(runId: string): DeadDropClient | null;
|
|
19
|
+
/**
|
|
20
|
+
* Create a DeadDrop client with the given configuration
|
|
21
|
+
*/
|
|
22
|
+
export declare function createDeadDropClient(config: DeadDropConfig): DeadDropClient;
|
|
23
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/deaddrop/client.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,aAAa,CAAC;AAEpD,MAAM,WAAW,cAAc;IAC7B,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1D;AAID;;;GAGG;AACH,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,MAAM,GACZ,cAAc,GAAG,IAAI,CAQvB;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,cAAc,GAAG,cAAc,CA4B3E"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DeadDrop client for sending messages to a Deaddrop endpoint
|
|
3
|
+
* https://deaddrop.sh
|
|
4
|
+
*/
|
|
5
|
+
const DEFAULT_HOST = 'https://deaddrop.bezoan.com';
|
|
6
|
+
/**
|
|
7
|
+
* Create a DeadDrop client from environment variables
|
|
8
|
+
* Returns null if DEADDROP_API_KEY is not set
|
|
9
|
+
*/
|
|
10
|
+
export function createDeadDropClientFromEnv(runId) {
|
|
11
|
+
const apiKey = process.env['DEADDROP_API_KEY'];
|
|
12
|
+
if (!apiKey) {
|
|
13
|
+
return null;
|
|
14
|
+
}
|
|
15
|
+
const host = process.env['DEADDROP_HOST'] ?? DEFAULT_HOST;
|
|
16
|
+
return createDeadDropClient({ apiKey, host, runId });
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Create a DeadDrop client with the given configuration
|
|
20
|
+
*/
|
|
21
|
+
export function createDeadDropClient(config) {
|
|
22
|
+
const host = config.host.replace(/\/+$/, ''); // Remove trailing slashes
|
|
23
|
+
const url = `${host}/v1/messages`;
|
|
24
|
+
return {
|
|
25
|
+
async send(content, user) {
|
|
26
|
+
try {
|
|
27
|
+
const response = await fetch(url, {
|
|
28
|
+
method: 'POST',
|
|
29
|
+
headers: {
|
|
30
|
+
'Content-Type': 'text/markdown',
|
|
31
|
+
'X-API-Key': config.apiKey,
|
|
32
|
+
'X-DeadDrop-User': user,
|
|
33
|
+
'X-DeadDrop-Subject': config.runId,
|
|
34
|
+
},
|
|
35
|
+
body: content,
|
|
36
|
+
});
|
|
37
|
+
if (!response.ok) {
|
|
38
|
+
console.warn(`[DEADDROP] Warning: Failed to send message (${response.status})`);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
catch (err) {
|
|
42
|
+
console.warn(`[DEADDROP] Warning: ${err.message}`);
|
|
43
|
+
}
|
|
44
|
+
},
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/deaddrop/client.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAcH,MAAM,YAAY,GAAG,6BAA6B,CAAC;AAEnD;;;GAGG;AACH,MAAM,UAAU,2BAA2B,CACzC,KAAa;IAEb,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;IAC/C,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,YAAY,CAAC;IAC1D,OAAO,oBAAoB,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;AACvD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,MAAsB;IACzD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,0BAA0B;IACxE,MAAM,GAAG,GAAG,GAAG,IAAI,cAAc,CAAC;IAElC,OAAO;QACL,KAAK,CAAC,IAAI,CAAC,OAAe,EAAE,IAAkB;YAC5C,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;oBAChC,MAAM,EAAE,MAAM;oBACd,OAAO,EAAE;wBACP,cAAc,EAAE,eAAe;wBAC/B,WAAW,EAAE,MAAM,CAAC,MAAM;wBAC1B,iBAAiB,EAAE,IAAI;wBACvB,oBAAoB,EAAE,MAAM,CAAC,KAAK;qBACnC;oBACD,IAAI,EAAE,OAAO;iBACd,CAAC,CAAC;gBAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;oBACjB,OAAO,CAAC,IAAI,CACV,+CAA+C,QAAQ,CAAC,MAAM,GAAG,CAClE,CAAC;gBACJ,CAAC;YACH,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,CAAC,IAAI,CAAC,uBAAwB,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;YAChE,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/deaddrop/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/deaddrop/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -3,21 +3,40 @@
|
|
|
3
3
|
* Claude Code Runner - executes claude CLI with proper TTY handling
|
|
4
4
|
* Shows intermediate tool calls and responses in real-time
|
|
5
5
|
*/
|
|
6
|
+
import { randomBytes } from 'crypto';
|
|
6
7
|
import { parseArgs, parseCommandLine } from './cli/args.js';
|
|
7
8
|
import { runWithSignals } from './core/runner.js';
|
|
8
|
-
import {
|
|
9
|
+
import { createDeadDropClientFromEnv } from './deaddrop/index.js';
|
|
10
|
+
import { colors, configureDeadDrop, flushDeadDrop, formatDuration, printRunner, printRunnerInfo, } from './output/colors.js';
|
|
9
11
|
import { createFormatterState } from './output/formatter.js';
|
|
10
12
|
import { createLogger } from './output/logger.js';
|
|
11
13
|
import { DEFAULT_CONFIG } from './types/runner.js';
|
|
14
|
+
/**
|
|
15
|
+
* Generate a short unique run ID (8 chars, uppercase)
|
|
16
|
+
*/
|
|
17
|
+
function generateRunId() {
|
|
18
|
+
return randomBytes(4).toString('hex').toUpperCase();
|
|
19
|
+
}
|
|
12
20
|
async function main() {
|
|
13
21
|
const totalStart = Date.now();
|
|
14
22
|
const args = process.argv.slice(2);
|
|
15
23
|
const parsed = parseArgs(args);
|
|
24
|
+
// Generate run ID for this session
|
|
25
|
+
const runId = generateRunId();
|
|
16
26
|
// Merge config with defaults
|
|
17
27
|
const config = {
|
|
18
28
|
...DEFAULT_CONFIG,
|
|
19
29
|
...parsed.config,
|
|
20
30
|
};
|
|
31
|
+
// Configure deaddrop if enabled
|
|
32
|
+
if (config.deaddrop) {
|
|
33
|
+
const client = createDeadDropClientFromEnv(runId);
|
|
34
|
+
if (!client) {
|
|
35
|
+
console.error('Error: --deaddrop requires DEADDROP_API_KEY environment variable');
|
|
36
|
+
process.exit(1);
|
|
37
|
+
}
|
|
38
|
+
configureDeadDrop(client.send.bind(client));
|
|
39
|
+
}
|
|
21
40
|
// Create logger
|
|
22
41
|
const commandName = parsed.scriptMode
|
|
23
42
|
? 'script'
|
|
@@ -33,14 +52,20 @@ async function main() {
|
|
|
33
52
|
logger,
|
|
34
53
|
formatterState,
|
|
35
54
|
cwd: process.cwd(),
|
|
55
|
+
runId,
|
|
36
56
|
};
|
|
37
|
-
//
|
|
38
|
-
printRunner(`
|
|
57
|
+
// Emit starting run message first (operational, sent to deaddrop)
|
|
58
|
+
printRunner(`Starting run ${runId}`);
|
|
59
|
+
// Print config with [RUNNER] messages (informational, not sent to deaddrop)
|
|
60
|
+
printRunnerInfo(`Mode: ${parsed.subcommand} | Verbosity: ${config.verbosity}`);
|
|
39
61
|
if (config.model) {
|
|
40
|
-
|
|
62
|
+
printRunnerInfo(`Model: ${config.model}`);
|
|
63
|
+
}
|
|
64
|
+
if (config.deaddrop) {
|
|
65
|
+
printRunnerInfo(`Deaddrop: enabled`);
|
|
41
66
|
}
|
|
42
67
|
if (logger.filePath) {
|
|
43
|
-
|
|
68
|
+
printRunnerInfo(`Log: ${logger.filePath}`);
|
|
44
69
|
}
|
|
45
70
|
logger.log(`Started: ${new Date().toISOString()}`);
|
|
46
71
|
if (parsed.scriptMode) {
|
|
@@ -59,6 +84,7 @@ async function runSingleMode(prompt, subcommand, displayCommand, context, startT
|
|
|
59
84
|
context.logger.log(`${subcommand}: ${displayCommand}\n`);
|
|
60
85
|
const result = await runWithSignals(prompt, displayCommand, startTime, context);
|
|
61
86
|
context.logger.close();
|
|
87
|
+
await flushDeadDrop();
|
|
62
88
|
process.exit(result === 'ok' ? 0 : 1);
|
|
63
89
|
}
|
|
64
90
|
/**
|
|
@@ -79,23 +105,26 @@ async function runScriptMode(scriptLines, context, startTime) {
|
|
|
79
105
|
result = 'error';
|
|
80
106
|
}
|
|
81
107
|
if (result === 'blocked' || result === 'error') {
|
|
82
|
-
const totalDuration =
|
|
83
|
-
printRunner(`${colors.red}Script stopped${colors.reset} [${i + 1}/${scriptLines.length}] steps in ${
|
|
84
|
-
context.logger.log(`\nSCRIPT STOPPED at step ${i + 1}, ${totalDuration}s total`);
|
|
108
|
+
const totalDuration = Date.now() - startTime;
|
|
109
|
+
printRunner(`${colors.red}Script stopped${colors.reset} [${i + 1}/${scriptLines.length}] steps in ${formatDuration(totalDuration)}`);
|
|
110
|
+
context.logger.log(`\nSCRIPT STOPPED at step ${i + 1}, ${Math.round(totalDuration / 1000)}s total`);
|
|
85
111
|
context.logger.close();
|
|
112
|
+
await flushDeadDrop();
|
|
86
113
|
process.exit(1);
|
|
87
114
|
}
|
|
88
115
|
}
|
|
89
116
|
// All commands completed
|
|
90
|
-
const totalDuration =
|
|
91
|
-
printRunner(`${colors.green}Script completed${colors.reset} [${scriptLines.length}] steps in ${
|
|
92
|
-
context.logger.log(`\nSCRIPT COMPLETE, ${scriptLines.length} commands, ${totalDuration}s total`);
|
|
117
|
+
const totalDuration = Date.now() - startTime;
|
|
118
|
+
printRunner(`${colors.green}Script completed${colors.reset} [${scriptLines.length}] steps in ${formatDuration(totalDuration)}`);
|
|
119
|
+
context.logger.log(`\nSCRIPT COMPLETE, ${scriptLines.length} commands, ${Math.round(totalDuration / 1000)}s total`);
|
|
93
120
|
context.logger.close();
|
|
121
|
+
await flushDeadDrop();
|
|
94
122
|
process.exit(0);
|
|
95
123
|
}
|
|
96
124
|
// Run main
|
|
97
125
|
main().catch((err) => {
|
|
98
|
-
|
|
126
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
127
|
+
console.error(`Error: ${message}`);
|
|
99
128
|
process.exit(1);
|
|
100
129
|
});
|
|
101
130
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAC5D,OAAO,EAAsB,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/output/colors.d.ts
CHANGED
|
@@ -24,6 +24,7 @@ export declare function colorize(text: string, color: ColorName): string;
|
|
|
24
24
|
export declare function truncate(str: string, len: number): string;
|
|
25
25
|
/**
|
|
26
26
|
* Format duration in human-readable form
|
|
27
|
+
* Examples: 450ms, 2.5s, 1m30s, 1h2m3s
|
|
27
28
|
*/
|
|
28
29
|
export declare function formatDuration(ms: number): string;
|
|
29
30
|
/**
|
|
@@ -34,16 +35,41 @@ export declare function shortenPath(filePath: string): string;
|
|
|
34
35
|
* Format current timestamp as HH:MM:SS.mmm
|
|
35
36
|
*/
|
|
36
37
|
export declare function formatTimestamp(date?: Date): string;
|
|
37
|
-
/**
|
|
38
|
-
* Format elapsed seconds as hh:mm:ss
|
|
39
|
-
*/
|
|
40
|
-
export declare function formatElapsed(seconds: number): string;
|
|
41
38
|
/**
|
|
42
39
|
* Get a timestamped prefix for output lines
|
|
43
40
|
*/
|
|
44
41
|
export declare function timestampPrefix(): string;
|
|
45
42
|
/**
|
|
46
|
-
*
|
|
43
|
+
* Deaddrop user type
|
|
44
|
+
*/
|
|
45
|
+
export type DeadDropUser = 'Runner' | 'Claude Code';
|
|
46
|
+
/**
|
|
47
|
+
* Deaddrop send function type (to avoid circular imports)
|
|
48
|
+
*/
|
|
49
|
+
export type DeadDropSender = (content: string, user: DeadDropUser) => Promise<void>;
|
|
50
|
+
/**
|
|
51
|
+
* Configure the deaddrop sender for all output functions
|
|
52
|
+
* Call once at startup when --deaddrop is enabled
|
|
53
|
+
*/
|
|
54
|
+
export declare function configureDeadDrop(sender: DeadDropSender | null): void;
|
|
55
|
+
/**
|
|
56
|
+
* Flush all pending deaddrop sends
|
|
57
|
+
* Call before process.exit to ensure all messages are sent
|
|
58
|
+
*/
|
|
59
|
+
export declare function flushDeadDrop(): Promise<void>;
|
|
60
|
+
/**
|
|
61
|
+
* Print a [RUNNER] operational message with timestamp
|
|
62
|
+
* Automatically sends to Deaddrop if configured (without prefix)
|
|
47
63
|
*/
|
|
48
64
|
export declare function printRunner(message: string): void;
|
|
65
|
+
/**
|
|
66
|
+
* Print a [RUNNER] informational message with timestamp
|
|
67
|
+
* Does NOT send to Deaddrop (used for startup config, debug info)
|
|
68
|
+
*/
|
|
69
|
+
export declare function printRunnerInfo(message: string): void;
|
|
70
|
+
/**
|
|
71
|
+
* Print a [CLAUDE] message with timestamp
|
|
72
|
+
* Automatically sends to Deaddrop if configured (without prefix)
|
|
73
|
+
*/
|
|
74
|
+
export declare function printClaude(message: string): void;
|
|
49
75
|
//# sourceMappingURL=colors.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"colors.d.ts","sourceRoot":"","sources":["../../src/output/colors.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,eAAO,MAAM,MAAM;;;;;;;;;;CAUT,CAAC;AAEX,MAAM,MAAM,SAAS,GAAG,MAAM,OAAO,MAAM,CAAC;AAQ5C,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE7C;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,GAAG,MAAM,CAE/D;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAKzD;AAED
|
|
1
|
+
{"version":3,"file":"colors.d.ts","sourceRoot":"","sources":["../../src/output/colors.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,eAAO,MAAM,MAAM;;;;;;;;;;CAUT,CAAC;AAEX,MAAM,MAAM,SAAS,GAAG,MAAM,OAAO,MAAM,CAAC;AAQ5C,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE7C;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,GAAG,MAAM,CAE/D;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAKzD;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAejD;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAOpD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,GAAE,IAAiB,GAAG,MAAM,CAM/D;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,aAAa,CAAC;AAEpD;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG,CAC3B,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,YAAY,KACf,OAAO,CAAC,IAAI,CAAC,CAAC;AAkBnB;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI,GAAG,IAAI,CAErE;AAwBD;;;GAGG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAUnD;AAYD;;;GAGG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAKjD;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAIrD;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAKjD"}
|
package/dist/output/colors.js
CHANGED
|
@@ -37,16 +37,22 @@ export function truncate(str, len) {
|
|
|
37
37
|
}
|
|
38
38
|
/**
|
|
39
39
|
* Format duration in human-readable form
|
|
40
|
+
* Examples: 450ms, 2.5s, 1m30s, 1h2m3s
|
|
40
41
|
*/
|
|
41
42
|
export function formatDuration(ms) {
|
|
42
43
|
if (ms < 1000) {
|
|
43
44
|
return `${ms}ms`;
|
|
44
45
|
}
|
|
45
|
-
|
|
46
|
-
|
|
46
|
+
const totalSeconds = ms / 1000;
|
|
47
|
+
if (totalSeconds < 60) {
|
|
48
|
+
return `${totalSeconds.toFixed(1)}s`;
|
|
49
|
+
}
|
|
50
|
+
const hours = Math.floor(totalSeconds / 3600);
|
|
51
|
+
const mins = Math.floor((totalSeconds % 3600) / 60);
|
|
52
|
+
const secs = Math.round(totalSeconds % 60);
|
|
53
|
+
if (hours > 0) {
|
|
54
|
+
return `${hours}h${mins}m${secs}s`;
|
|
47
55
|
}
|
|
48
|
-
const mins = Math.floor(ms / 60000);
|
|
49
|
-
const secs = ((ms % 60000) / 1000).toFixed(0);
|
|
50
56
|
return `${mins}m${secs}s`;
|
|
51
57
|
}
|
|
52
58
|
/**
|
|
@@ -70,15 +76,6 @@ export function formatTimestamp(date = new Date()) {
|
|
|
70
76
|
const ms = date.getMilliseconds().toString().padStart(3, '0');
|
|
71
77
|
return `${h}:${m}:${s}.${ms}`;
|
|
72
78
|
}
|
|
73
|
-
/**
|
|
74
|
-
* Format elapsed seconds as hh:mm:ss
|
|
75
|
-
*/
|
|
76
|
-
export function formatElapsed(seconds) {
|
|
77
|
-
const h = Math.floor(seconds / 3600);
|
|
78
|
-
const m = Math.floor((seconds % 3600) / 60);
|
|
79
|
-
const s = seconds % 60;
|
|
80
|
-
return `${h.toString().padStart(2, '0')}:${m.toString().padStart(2, '0')}:${s.toString().padStart(2, '0')}`;
|
|
81
|
-
}
|
|
82
79
|
/**
|
|
83
80
|
* Get a timestamped prefix for output lines
|
|
84
81
|
*/
|
|
@@ -86,9 +83,83 @@ export function timestampPrefix() {
|
|
|
86
83
|
return `${colors.dim}${formatTimestamp()}${colors.reset} `;
|
|
87
84
|
}
|
|
88
85
|
/**
|
|
89
|
-
*
|
|
86
|
+
* Module-level deaddrop sender, configured once at startup
|
|
87
|
+
*/
|
|
88
|
+
let deadDropSender = null;
|
|
89
|
+
const messageQueue = [];
|
|
90
|
+
let isProcessing = false;
|
|
91
|
+
let flushResolve = null;
|
|
92
|
+
/**
|
|
93
|
+
* Configure the deaddrop sender for all output functions
|
|
94
|
+
* Call once at startup when --deaddrop is enabled
|
|
95
|
+
*/
|
|
96
|
+
export function configureDeadDrop(sender) {
|
|
97
|
+
deadDropSender = sender;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Process queued messages one at a time
|
|
101
|
+
*/
|
|
102
|
+
async function processQueue() {
|
|
103
|
+
if (isProcessing || !deadDropSender)
|
|
104
|
+
return;
|
|
105
|
+
isProcessing = true;
|
|
106
|
+
let msg = messageQueue.shift();
|
|
107
|
+
while (msg) {
|
|
108
|
+
await deadDropSender(msg.content, msg.user);
|
|
109
|
+
msg = messageQueue.shift();
|
|
110
|
+
}
|
|
111
|
+
isProcessing = false;
|
|
112
|
+
// Resolve flush promise if waiting
|
|
113
|
+
if (flushResolve && messageQueue.length === 0) {
|
|
114
|
+
flushResolve();
|
|
115
|
+
flushResolve = null;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Flush all pending deaddrop sends
|
|
120
|
+
* Call before process.exit to ensure all messages are sent
|
|
121
|
+
*/
|
|
122
|
+
export async function flushDeadDrop() {
|
|
123
|
+
if (messageQueue.length === 0 && !isProcessing)
|
|
124
|
+
return;
|
|
125
|
+
return new Promise((resolve) => {
|
|
126
|
+
flushResolve = resolve;
|
|
127
|
+
// If not already processing, start
|
|
128
|
+
if (!isProcessing) {
|
|
129
|
+
void processQueue();
|
|
130
|
+
}
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Send a message to deaddrop if configured
|
|
135
|
+
*/
|
|
136
|
+
function sendToDeadDrop(message, user) {
|
|
137
|
+
if (deadDropSender) {
|
|
138
|
+
messageQueue.push({ content: message, user });
|
|
139
|
+
void processQueue();
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Print a [RUNNER] operational message with timestamp
|
|
144
|
+
* Automatically sends to Deaddrop if configured (without prefix)
|
|
90
145
|
*/
|
|
91
146
|
export function printRunner(message) {
|
|
92
147
|
console.log(`${timestampPrefix()}${colors.magenta}[RUNNER]${colors.reset} ${message}`);
|
|
148
|
+
sendToDeadDrop(stripAnsi(message), 'Runner');
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Print a [RUNNER] informational message with timestamp
|
|
152
|
+
* Does NOT send to Deaddrop (used for startup config, debug info)
|
|
153
|
+
*/
|
|
154
|
+
export function printRunnerInfo(message) {
|
|
155
|
+
console.log(`${timestampPrefix()}${colors.magenta}[RUNNER]${colors.reset} ${message}`);
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Print a [CLAUDE] message with timestamp
|
|
159
|
+
* Automatically sends to Deaddrop if configured (without prefix)
|
|
160
|
+
*/
|
|
161
|
+
export function printClaude(message) {
|
|
162
|
+
console.log(`${timestampPrefix()}${colors.green}[CLAUDE]${colors.reset} ${message}`);
|
|
163
|
+
sendToDeadDrop(stripAnsi(message), 'Claude Code');
|
|
93
164
|
}
|
|
94
165
|
//# sourceMappingURL=colors.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"colors.js","sourceRoot":"","sources":["../../src/output/colors.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,KAAK,EAAE,SAAS;IAChB,GAAG,EAAE,SAAS;IACd,IAAI,EAAE,SAAS;IACf,IAAI,EAAE,UAAU;IAChB,MAAM,EAAE,UAAU;IAClB,KAAK,EAAE,UAAU;IACjB,GAAG,EAAE,UAAU;IACf,OAAO,EAAE,UAAU;IACnB,IAAI,EAAE,UAAU;CACR,CAAC;AAIX;;GAEG;AACH,4FAA4F;AAC5F,MAAM,UAAU,GAAG,wBAAwB,CAAC;AAE5C,MAAM,UAAU,SAAS,CAAC,GAAW;IACnC,OAAO,GAAG,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;AACrC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,QAAQ,CAAC,IAAY,EAAE,KAAgB;IACrD,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC;AAClD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,QAAQ,CAAC,GAAW,EAAE,GAAW;IAC/C,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG,EAAE,CAAC;QACtB,OAAO,GAAG,CAAC;IACb,CAAC;IACD,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,KAAK,CAAC;AACnC,CAAC;AAED
|
|
1
|
+
{"version":3,"file":"colors.js","sourceRoot":"","sources":["../../src/output/colors.ts"],"names":[],"mappings":"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"}
|
|
@@ -12,6 +12,7 @@ export interface FormatterState {
|
|
|
12
12
|
lastToolTime: number | null;
|
|
13
13
|
activeTask: ActiveTask | null;
|
|
14
14
|
toolStartTimes: Map<string, number>;
|
|
15
|
+
currentStep: number;
|
|
15
16
|
}
|
|
16
17
|
export declare function createFormatterState(): FormatterState;
|
|
17
18
|
export declare function resetFormatterState(state: FormatterState): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"formatter.d.ts","sourceRoot":"","sources":["../../src/output/formatter.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,KAAK,aAAa,EASnB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,KAAK,UAAU,EAEf,KAAK,WAAW,EAChB,KAAK,SAAS,EACf,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"formatter.d.ts","sourceRoot":"","sources":["../../src/output/formatter.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,KAAK,aAAa,EASnB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,KAAK,UAAU,EAEf,KAAK,WAAW,EAChB,KAAK,SAAS,EACf,MAAM,oBAAoB,CAAC;AAU5B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,YAAY,EAAE,WAAW,EAAE,CAAC;IAC5B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,UAAU,EAAE,UAAU,GAAG,IAAI,CAAC;IAC9B,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,oBAAoB,IAAI,cAAc,CAQrD;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI,CAK/D;AAwED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,cAAc,EACrB,SAAS,EAAE,SAAS,GACnB,IAAI,CAuBN;AAoFD;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,GAAG,EAAE,aAAa,EAClB,KAAK,EAAE,cAAc,EACrB,SAAS,EAAE,SAAS,EACpB,OAAO,EAAE,MAAM,EAAE,sCAAsC;AACvD,mBAAmB,EAAE,MAAM,GAC1B,MAAM,CA2GR"}
|
package/dist/output/formatter.js
CHANGED
|
@@ -3,13 +3,14 @@
|
|
|
3
3
|
*/
|
|
4
4
|
import { isAssistantMessage, isResultMessage, isSystemInitMessage, isTextBlock, isToolResultBlock, isToolUseBlock, isUserMessage, } from '../types/claude.js';
|
|
5
5
|
import { NOISE_PATTERNS, } from '../types/runner.js';
|
|
6
|
-
import { colors, formatDuration, printRunner, shortenPath, timestampPrefix, truncate, } from './colors.js';
|
|
6
|
+
import { colors, formatDuration, printClaude, printRunner, shortenPath, timestampPrefix, truncate, } from './colors.js';
|
|
7
7
|
export function createFormatterState() {
|
|
8
8
|
return {
|
|
9
9
|
pendingTools: [],
|
|
10
10
|
lastToolTime: null,
|
|
11
11
|
activeTask: null,
|
|
12
12
|
toolStartTimes: new Map(),
|
|
13
|
+
currentStep: 1,
|
|
13
14
|
};
|
|
14
15
|
}
|
|
15
16
|
export function resetFormatterState(state) {
|
|
@@ -179,7 +180,7 @@ parallelThresholdMs) {
|
|
|
179
180
|
}
|
|
180
181
|
else {
|
|
181
182
|
const text = block.text.replace(/[\r\n]+/g, ' ').trim();
|
|
182
|
-
|
|
183
|
+
printClaude(text);
|
|
183
184
|
}
|
|
184
185
|
}
|
|
185
186
|
else if (isToolUseBlock(block)) {
|
|
@@ -244,10 +245,8 @@ parallelThresholdMs) {
|
|
|
244
245
|
else if (isResultMessage(msg)) {
|
|
245
246
|
flushPendingTools(state, verbosity);
|
|
246
247
|
if (verbosity !== 'quiet') {
|
|
247
|
-
const duration = msg.duration_ms
|
|
248
|
-
|
|
249
|
-
: '?';
|
|
250
|
-
printRunner(`Claude completed step in ${duration}`);
|
|
248
|
+
const duration = msg.duration_ms ? formatDuration(msg.duration_ms) : '?';
|
|
249
|
+
printRunner(`Completed step ${state.currentStep} in ${duration}`);
|
|
251
250
|
}
|
|
252
251
|
}
|
|
253
252
|
else {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"formatter.js","sourceRoot":"","sources":["../../src/output/formatter.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAEL,kBAAkB,EAClB,eAAe,EACf,mBAAmB,EACnB,WAAW,EACX,iBAAiB,EACjB,cAAc,EACd,aAAa,GAEd,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAEL,cAAc,GAGf,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,MAAM,EACN,cAAc,EACd,WAAW,EACX,WAAW,EACX,eAAe,EACf,QAAQ,GACT,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"formatter.js","sourceRoot":"","sources":["../../src/output/formatter.ts"],"names":[],"mappings":"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"}
|
|
@@ -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
|
@@ -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;
|
|
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
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,WAAW,EAAE,2BAA2B;IACxC,OAAO,EAAE,uBAAuB;IAChC,KAAK,EAAE,qBAAqB;CACpB,CAAC;
|
|
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