runspec-node 0.22.0 → 0.24.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/dist/cli.d.ts CHANGED
@@ -1,4 +1,24 @@
1
1
  import type { ScriptSpec } from './models';
2
2
  export declare function main(): void;
3
+ /**
4
+ * Generate a venv-shaped `bin/` for the runnables declared in `{projectRoot}/
5
+ * runspec.toml`: a `bin/runspec` shim plus one `bin/<runnable>` per runnable.
6
+ * The shims resolve their own location, so the folder stays relocatable and
7
+ * works from any cwd (paired with caller-relative findConfig). Returns a
8
+ * summary; performs the filesystem writes. Exported for testing.
9
+ */
10
+ export declare function scaffoldBin(projectRoot: string): {
11
+ written: Array<{
12
+ name: string;
13
+ target: string;
14
+ }>;
15
+ warnings: string[];
16
+ };
17
+ /** Resolve a runnable's script: package.json bin first, then ./<name>.{js,cjs,mjs}. */
18
+ export declare function resolveScript(projectRoot: string, name: string, binMap: Record<string, string>): string | null;
19
+ /** package.json `bin` as a {name: relPath} map. A string bin maps the package name. */
20
+ export declare function readBinMap(projectRoot: string): Record<string, string>;
21
+ /** POSIX shim that resolves the project root relative to itself, then execs node. */
22
+ export declare function shimContent(relPath: string): string;
3
23
  export declare function buildSchema(name: string, script: ScriptSpec, fmt: string): Record<string, unknown>;
4
24
  //# sourceMappingURL=cli.d.ts.map
package/dist/cli.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,UAAU,EAAW,MAAM,UAAU,CAAC;AAMpD,wBAAgB,IAAI,IAAI,IAAI,CAsC3B;AAuHD,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAqBlG"}
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,UAAU,EAAW,MAAM,UAAU,CAAC;AAMpD,wBAAgB,IAAI,IAAI,IAAI,CAuC3B;AAqFD;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;CAAE,CAiCzH;AAQD,uFAAuF;AACvF,wBAAgB,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,GAAG,IAAI,CAU9G;AAED,uFAAuF;AACvF,wBAAgB,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAStE;AAUD,qFAAqF;AACrF,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEnD;AAmED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAqBlG"}
package/dist/cli.js CHANGED
@@ -34,6 +34,10 @@ var __importStar = (this && this.__importStar) || (function () {
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
36
  exports.main = main;
37
+ exports.scaffoldBin = scaffoldBin;
38
+ exports.resolveScript = resolveScript;
39
+ exports.readBinMap = readBinMap;
40
+ exports.shimContent = shimContent;
37
41
  exports.buildSchema = buildSchema;
38
42
  const fs = __importStar(require("fs"));
39
43
  const path = __importStar(require("path"));
@@ -59,6 +63,7 @@ function main() {
59
63
  const commands = {
60
64
  init: cmdInit,
61
65
  local: cmdLocal,
66
+ bin: cmdBin,
62
67
  jump: cmdJump,
63
68
  serve: cmdServe,
64
69
  };
@@ -128,6 +133,118 @@ function cmdLocal(args) {
128
133
  process.exit(1);
129
134
  }
130
135
  }
136
+ function cmdBin(_args) {
137
+ let configPath;
138
+ try {
139
+ configPath = (0, finder_1.findConfig)(process.cwd()).configPath;
140
+ }
141
+ catch {
142
+ console.log("✗ No runspec.toml found. Run 'runspec init' first.");
143
+ process.exit(1);
144
+ }
145
+ const projectRoot = path.dirname(configPath);
146
+ const result = scaffoldBin(projectRoot);
147
+ console.log(`Wrote ${result.written.length} shim(s) to ${path.join(projectRoot, 'bin')}/:\n`);
148
+ for (const w of result.written)
149
+ console.log(` ✓ bin/${w.name}${w.target ? ` → ${w.target}` : ''}`);
150
+ if (result.warnings.length) {
151
+ console.log('\nIssues:\n');
152
+ for (const msg of result.warnings)
153
+ console.log(` ✗ ${msg}`);
154
+ }
155
+ console.log('\nThis folder is now venv-shaped — a controller can invoke bin/<runnable> and');
156
+ console.log('discover/manage it via bin/runspec, from any working directory.');
157
+ if (result.warnings.length)
158
+ process.exit(1);
159
+ }
160
+ /**
161
+ * Generate a venv-shaped `bin/` for the runnables declared in `{projectRoot}/
162
+ * runspec.toml`: a `bin/runspec` shim plus one `bin/<runnable>` per runnable.
163
+ * The shims resolve their own location, so the folder stays relocatable and
164
+ * works from any cwd (paired with caller-relative findConfig). Returns a
165
+ * summary; performs the filesystem writes. Exported for testing.
166
+ */
167
+ function scaffoldBin(projectRoot) {
168
+ const raw = (0, loader_1.loadRaw)(configPathOf(projectRoot));
169
+ const runnables = Object.keys(raw.runnables);
170
+ const binMap = readBinMap(projectRoot);
171
+ const binDir = path.join(projectRoot, 'bin');
172
+ fs.mkdirSync(binDir, { recursive: true });
173
+ // The venv shape includes a logs/ dir (created lazily on first run anyway).
174
+ fs.mkdirSync(path.join(projectRoot, 'logs'), { recursive: true });
175
+ const written = [];
176
+ const warnings = [];
177
+ // bin/runspec — the CLI a controller shells for discovery + log management.
178
+ const cliTarget = resolveRunspecCli(projectRoot);
179
+ if (cliTarget) {
180
+ writeShim(path.join(binDir, 'runspec'), toPosix(path.relative(projectRoot, cliTarget)));
181
+ written.push({ name: 'runspec', target: toPosix(path.relative(projectRoot, cliTarget)) });
182
+ }
183
+ else {
184
+ warnings.push("runspec-node is not installed — run 'npm install runspec-node', then 'runspec bin' again (bin/runspec skipped)");
185
+ }
186
+ // bin/<runnable> — one per declared runnable.
187
+ for (const name of runnables) {
188
+ const script = resolveScript(projectRoot, name, binMap);
189
+ if (!script) {
190
+ warnings.push(`${name}: no script found — add package.json bin["${name}"] or create ./${name}.js`);
191
+ continue;
192
+ }
193
+ const rel = toPosix(path.relative(projectRoot, script));
194
+ writeShim(path.join(binDir, name), rel);
195
+ written.push({ name, target: rel });
196
+ }
197
+ return { written, warnings };
198
+ }
199
+ const SCRIPT_EXTS = ['.js', '.cjs', '.mjs'];
200
+ function configPathOf(projectRoot) {
201
+ return path.join(projectRoot, 'runspec.toml');
202
+ }
203
+ /** Resolve a runnable's script: package.json bin first, then ./<name>.{js,cjs,mjs}. */
204
+ function resolveScript(projectRoot, name, binMap) {
205
+ if (binMap[name]) {
206
+ const p = path.resolve(projectRoot, binMap[name]);
207
+ return fs.existsSync(p) ? p : null;
208
+ }
209
+ for (const ext of SCRIPT_EXTS) {
210
+ const p = path.join(projectRoot, name + ext);
211
+ if (fs.existsSync(p))
212
+ return p;
213
+ }
214
+ return null;
215
+ }
216
+ /** package.json `bin` as a {name: relPath} map. A string bin maps the package name. */
217
+ function readBinMap(projectRoot) {
218
+ try {
219
+ const pkg = JSON.parse(fs.readFileSync(path.join(projectRoot, 'package.json'), 'utf-8'));
220
+ if (typeof pkg.bin === 'string')
221
+ return pkg.name ? { [pkg.name]: pkg.bin } : {};
222
+ if (pkg.bin && typeof pkg.bin === 'object')
223
+ return pkg.bin;
224
+ }
225
+ catch {
226
+ // no package.json / unparseable — fall back to the file-name convention
227
+ }
228
+ return {};
229
+ }
230
+ function resolveRunspecCli(projectRoot) {
231
+ const candidates = [
232
+ path.join(projectRoot, 'node_modules', 'runspec-node', 'bin', 'runspec.js'),
233
+ path.join(projectRoot, 'node_modules', '.bin', 'runspec'),
234
+ ];
235
+ return candidates.find((c) => fs.existsSync(c)) ?? null;
236
+ }
237
+ /** POSIX shim that resolves the project root relative to itself, then execs node. */
238
+ function shimContent(relPath) {
239
+ return ['#!/bin/sh', '# Generated by `runspec bin` — do not edit.', 'DIR=$(CDPATH= cd -- "$(dirname -- "$0")/.." && pwd)', `exec node "$DIR/${relPath}" "$@"`, ''].join('\n');
240
+ }
241
+ function writeShim(shimPath, relPath) {
242
+ fs.writeFileSync(shimPath, shimContent(relPath), 'utf-8');
243
+ fs.chmodSync(shimPath, 0o755);
244
+ }
245
+ function toPosix(p) {
246
+ return p.split(path.sep).join('/');
247
+ }
131
248
  async function cmdJump(args) {
132
249
  const parsed = (0, parser_1.parse)({ scriptName: 'runspec', argv: ['jump', ...args], configPath: _CLI_CONFIG });
133
250
  const fmt = String(parsed['format'] ?? 'text');
@@ -625,6 +742,7 @@ Usage:
625
742
  Commands:
626
743
  init Create runspec.toml and a code stub
627
744
  local List runnables and emit tool schemas
745
+ bin Generate a venv-shaped bin/ so a controller can run this folder
628
746
  jump Execute a runnable on a remote host via SSH
629
747
  serve Start the MCP stdio server for local runnables
630
748
 
@@ -635,6 +753,7 @@ Examples:
635
753
  runspec init --example
636
754
  runspec local
637
755
  runspec local --format mcp
756
+ runspec bin
638
757
  runspec serve`);
639
758
  }
640
759
  function printCommandHelp(command) {
@@ -662,6 +781,19 @@ Examples:
662
781
  runspec local --format mcp
663
782
  runspec local --format mcp --script deploy
664
783
  runspec local --format json`,
784
+ bin: `runspec bin — Generate a venv-shaped bin/ for this folder's runnables
785
+
786
+ Writes bin/runspec plus one bin/<runnable> shim per runnable in runspec.toml,
787
+ so a controller (e.g. runspec-console) can invoke bin/<runnable> and discover
788
+ the folder via bin/runspec — from any working directory, including over SSH.
789
+
790
+ Each runnable's script is resolved from package.json "bin", falling back to
791
+ ./<runnable>.js | .cjs | .mjs next to runspec.toml. Re-run after adding a
792
+ runnable or 'npm install'. (POSIX shims; Windows support is a follow-up.)
793
+
794
+ Examples:
795
+ npm install runspec-node
796
+ runspec bin`,
665
797
  jump: `runspec jump — Execute a runnable on a remote host via SSH
666
798
 
667
799
  Not yet implemented in the Node package.
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
package/dist/finder.d.ts CHANGED
@@ -1,4 +1,36 @@
1
+ /**
2
+ * Locate the governing `runspec.toml`.
3
+ *
4
+ * Resolution order mirrors the Python `parse()`:
5
+ * 1. `RUNSPEC_CONFIG` env var — explicit override.
6
+ * 2. an explicit `start` directory, when one is passed.
7
+ * 3. **caller-relative** — walk up from the entry script's directory
8
+ * (`require.main` / `process.argv[1]`). This is what lets an installed
9
+ * runnable find its own config from *any* working directory — e.g. when a
10
+ * controller launches `bin/greet` over SSH with `cwd` = the login home,
11
+ * not the package. Mirrors Python resolving relative to the installed
12
+ * package, "what makes installed entry points work from any working
13
+ * directory".
14
+ * 4. **cwd-relative** — walk up from `process.cwd()` (the historical
15
+ * behaviour, kept as the final fallback).
16
+ *
17
+ * A `runspec.toml` found *inside* a `node_modules` path is ignored: those
18
+ * belong to installed dependencies (including runspec-node's own bundled CLI
19
+ * spec), never the project being discovered.
20
+ */
1
21
  export declare function findConfig(start?: string): {
2
22
  configPath: string;
3
23
  };
24
+ /**
25
+ * Ordered, de-duplicated list of directories to walk up from, mirroring the
26
+ * resolution order documented on `findConfig`. Pure (no I/O) so the priority
27
+ * logic is unit-testable without a filesystem fixture.
28
+ */
29
+ export declare function searchStarts(start: string | undefined, entryDir: string | undefined, cwd: string): string[];
30
+ /**
31
+ * Walk up from `start` looking for a `runspec.toml`, skipping any found under a
32
+ * `node_modules` path (a dependency's spec, not the project's). Returns the
33
+ * path or null. Exported for testing.
34
+ */
35
+ export declare function walkUp(start: string): string | null;
4
36
  //# sourceMappingURL=finder.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"finder.d.ts","sourceRoot":"","sources":["../src/finder.ts"],"names":[],"mappings":"AAGA,wBAAgB,UAAU,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG;IAAE,UAAU,EAAE,MAAM,CAAA;CAAE,CAiBjE"}
1
+ {"version":3,"file":"finder.d.ts","sourceRoot":"","sources":["../src/finder.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,UAAU,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG;IAAE,UAAU,EAAE,MAAM,CAAA;CAAE,CAoBjE;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG,SAAS,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAM3G;AAED;;;;GAIG;AACH,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAWnD"}
package/dist/finder.js CHANGED
@@ -34,20 +34,81 @@ var __importStar = (this && this.__importStar) || (function () {
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
36
  exports.findConfig = findConfig;
37
+ exports.searchStarts = searchStarts;
38
+ exports.walkUp = walkUp;
37
39
  const fs = __importStar(require("fs"));
38
40
  const path = __importStar(require("path"));
41
+ /**
42
+ * Locate the governing `runspec.toml`.
43
+ *
44
+ * Resolution order mirrors the Python `parse()`:
45
+ * 1. `RUNSPEC_CONFIG` env var — explicit override.
46
+ * 2. an explicit `start` directory, when one is passed.
47
+ * 3. **caller-relative** — walk up from the entry script's directory
48
+ * (`require.main` / `process.argv[1]`). This is what lets an installed
49
+ * runnable find its own config from *any* working directory — e.g. when a
50
+ * controller launches `bin/greet` over SSH with `cwd` = the login home,
51
+ * not the package. Mirrors Python resolving relative to the installed
52
+ * package, "what makes installed entry points work from any working
53
+ * directory".
54
+ * 4. **cwd-relative** — walk up from `process.cwd()` (the historical
55
+ * behaviour, kept as the final fallback).
56
+ *
57
+ * A `runspec.toml` found *inside* a `node_modules` path is ignored: those
58
+ * belong to installed dependencies (including runspec-node's own bundled CLI
59
+ * spec), never the project being discovered.
60
+ */
39
61
  function findConfig(start) {
40
- let dir = path.resolve(start ?? process.cwd());
62
+ const env = process.env.RUNSPEC_CONFIG;
63
+ if (env && fs.existsSync(env))
64
+ return { configPath: path.resolve(env) };
65
+ // process.argv[1] over require.main.filename: the latter realpath-resolves
66
+ // symlinks, which under `npm link` / workspaces / a local install jumps the
67
+ // entry *out* of the project (to the linked source) and breaks the walk.
68
+ // process.argv[1] preserves the path the binary was actually invoked at —
69
+ // inside the project's node_modules — which is what we want to walk up from.
70
+ const entry = process.argv[1] ?? require.main?.filename;
71
+ const entryDir = entry ? path.dirname(entry) : undefined;
72
+ for (const dir of searchStarts(start, entryDir, process.cwd())) {
73
+ const found = walkUp(dir);
74
+ if (found)
75
+ return { configPath: found };
76
+ }
77
+ throw new Error("No runspec configuration found.\nExpected runspec.toml inside your package directory.\n\nRun 'runspec init' to create one.");
78
+ }
79
+ /**
80
+ * Ordered, de-duplicated list of directories to walk up from, mirroring the
81
+ * resolution order documented on `findConfig`. Pure (no I/O) so the priority
82
+ * logic is unit-testable without a filesystem fixture.
83
+ */
84
+ function searchStarts(start, entryDir, cwd) {
85
+ const out = [];
86
+ if (start)
87
+ out.push(path.resolve(start));
88
+ if (entryDir)
89
+ out.push(path.resolve(entryDir));
90
+ out.push(path.resolve(cwd));
91
+ return [...new Set(out)];
92
+ }
93
+ /**
94
+ * Walk up from `start` looking for a `runspec.toml`, skipping any found under a
95
+ * `node_modules` path (a dependency's spec, not the project's). Returns the
96
+ * path or null. Exported for testing.
97
+ */
98
+ function walkUp(start) {
99
+ let dir = path.resolve(start);
41
100
  while (true) {
42
101
  const runspecToml = path.join(dir, 'runspec.toml');
43
- if (fs.existsSync(runspecToml)) {
44
- return { configPath: runspecToml };
102
+ if (fs.existsSync(runspecToml) && !isInNodeModules(dir)) {
103
+ return runspecToml;
45
104
  }
46
105
  const parent = path.dirname(dir);
47
106
  if (parent === dir)
48
- break;
107
+ return null;
49
108
  dir = parent;
50
109
  }
51
- throw new Error("No runspec configuration found.\nExpected runspec.toml inside your package directory.\n\nRun 'runspec init' to create one.");
110
+ }
111
+ function isInNodeModules(dir) {
112
+ return dir.split(path.sep).includes('node_modules');
52
113
  }
53
114
  //# sourceMappingURL=finder.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"finder.js","sourceRoot":"","sources":["../src/finder.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAGA,gCAiBC;AApBD,uCAAyB;AACzB,2CAA6B;AAE7B,SAAgB,UAAU,CAAC,KAAc;IACvC,IAAI,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAE/C,OAAO,IAAI,EAAE,CAAC;QACZ,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;QACnD,IAAI,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YAC/B,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC;QACrC,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACjC,IAAI,MAAM,KAAK,GAAG;YAAE,MAAM;QAC1B,GAAG,GAAG,MAAM,CAAC;IACf,CAAC;IAED,MAAM,IAAI,KAAK,CACb,4HAA4H,CAC7H,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"finder.js","sourceRoot":"","sources":["../src/finder.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuBA,gCAoBC;AAOD,oCAMC;AAOD,wBAWC;AA1ED,uCAAyB;AACzB,2CAA6B;AAE7B;;;;;;;;;;;;;;;;;;;GAmBG;AACH,SAAgB,UAAU,CAAC,KAAc;IACvC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;IACvC,IAAI,GAAG,IAAI,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,EAAE,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;IAExE,2EAA2E;IAC3E,4EAA4E;IAC5E,yEAAyE;IACzE,0EAA0E;IAC1E,6EAA6E;IAC7E,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxD,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAEzD,KAAK,MAAM,GAAG,IAAI,YAAY,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC;QAC/D,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QAC1B,IAAI,KAAK;YAAE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;IAC1C,CAAC;IAED,MAAM,IAAI,KAAK,CACb,4HAA4H,CAC7H,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,SAAgB,YAAY,CAAC,KAAyB,EAAE,QAA4B,EAAE,GAAW;IAC/F,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,IAAI,KAAK;QAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;IACzC,IAAI,QAAQ;QAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC/C,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5B,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;AAC3B,CAAC;AAED;;;;GAIG;AACH,SAAgB,MAAM,CAAC,KAAa;IAClC,IAAI,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAC9B,OAAO,IAAI,EAAE,CAAC;QACZ,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;QACnD,IAAI,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC;YACxD,OAAO,WAAW,CAAC;QACrB,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACjC,IAAI,MAAM,KAAK,GAAG;YAAE,OAAO,IAAI,CAAC;QAChC,GAAG,GAAG,MAAM,CAAC;IACf,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,GAAW;IAClC,OAAO,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;AACtD,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "runspec-node",
3
- "version": "0.22.0",
3
+ "version": "0.24.0",
4
4
  "description": "Node/TypeScript language pack for runspec",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
package/src/cli.ts CHANGED
@@ -32,6 +32,7 @@ export function main(): void {
32
32
  const commands: Record<string, (args: string[]) => void | Promise<void>> = {
33
33
  init: cmdInit,
34
34
  local: cmdLocal,
35
+ bin: cmdBin,
35
36
  jump: cmdJump,
36
37
  serve: cmdServe,
37
38
  };
@@ -112,6 +113,123 @@ function cmdLocal(args: string[]): void {
112
113
  }
113
114
  }
114
115
 
116
+ function cmdBin(_args: string[]): void {
117
+ let configPath: string;
118
+ try {
119
+ configPath = findConfig(process.cwd()).configPath;
120
+ } catch {
121
+ console.log("✗ No runspec.toml found. Run 'runspec init' first.");
122
+ process.exit(1);
123
+ }
124
+ const projectRoot = path.dirname(configPath);
125
+ const result = scaffoldBin(projectRoot);
126
+
127
+ console.log(`Wrote ${result.written.length} shim(s) to ${path.join(projectRoot, 'bin')}/:\n`);
128
+ for (const w of result.written) console.log(` ✓ bin/${w.name}${w.target ? ` → ${w.target}` : ''}`);
129
+ if (result.warnings.length) {
130
+ console.log('\nIssues:\n');
131
+ for (const msg of result.warnings) console.log(` ✗ ${msg}`);
132
+ }
133
+ console.log('\nThis folder is now venv-shaped — a controller can invoke bin/<runnable> and');
134
+ console.log('discover/manage it via bin/runspec, from any working directory.');
135
+ if (result.warnings.length) process.exit(1);
136
+ }
137
+
138
+ /**
139
+ * Generate a venv-shaped `bin/` for the runnables declared in `{projectRoot}/
140
+ * runspec.toml`: a `bin/runspec` shim plus one `bin/<runnable>` per runnable.
141
+ * The shims resolve their own location, so the folder stays relocatable and
142
+ * works from any cwd (paired with caller-relative findConfig). Returns a
143
+ * summary; performs the filesystem writes. Exported for testing.
144
+ */
145
+ export function scaffoldBin(projectRoot: string): { written: Array<{ name: string; target: string }>; warnings: string[] } {
146
+ const raw = loadRaw(configPathOf(projectRoot));
147
+ const runnables = Object.keys(raw.runnables);
148
+ const binMap = readBinMap(projectRoot);
149
+ const binDir = path.join(projectRoot, 'bin');
150
+ fs.mkdirSync(binDir, { recursive: true });
151
+ // The venv shape includes a logs/ dir (created lazily on first run anyway).
152
+ fs.mkdirSync(path.join(projectRoot, 'logs'), { recursive: true });
153
+
154
+ const written: Array<{ name: string; target: string }> = [];
155
+ const warnings: string[] = [];
156
+
157
+ // bin/runspec — the CLI a controller shells for discovery + log management.
158
+ const cliTarget = resolveRunspecCli(projectRoot);
159
+ if (cliTarget) {
160
+ writeShim(path.join(binDir, 'runspec'), toPosix(path.relative(projectRoot, cliTarget)));
161
+ written.push({ name: 'runspec', target: toPosix(path.relative(projectRoot, cliTarget)) });
162
+ } else {
163
+ warnings.push("runspec-node is not installed — run 'npm install runspec-node', then 'runspec bin' again (bin/runspec skipped)");
164
+ }
165
+
166
+ // bin/<runnable> — one per declared runnable.
167
+ for (const name of runnables) {
168
+ const script = resolveScript(projectRoot, name, binMap);
169
+ if (!script) {
170
+ warnings.push(`${name}: no script found — add package.json bin["${name}"] or create ./${name}.js`);
171
+ continue;
172
+ }
173
+ const rel = toPosix(path.relative(projectRoot, script));
174
+ writeShim(path.join(binDir, name), rel);
175
+ written.push({ name, target: rel });
176
+ }
177
+ return { written, warnings };
178
+ }
179
+
180
+ const SCRIPT_EXTS = ['.js', '.cjs', '.mjs'];
181
+
182
+ function configPathOf(projectRoot: string): string {
183
+ return path.join(projectRoot, 'runspec.toml');
184
+ }
185
+
186
+ /** Resolve a runnable's script: package.json bin first, then ./<name>.{js,cjs,mjs}. */
187
+ export function resolveScript(projectRoot: string, name: string, binMap: Record<string, string>): string | null {
188
+ if (binMap[name]) {
189
+ const p = path.resolve(projectRoot, binMap[name]);
190
+ return fs.existsSync(p) ? p : null;
191
+ }
192
+ for (const ext of SCRIPT_EXTS) {
193
+ const p = path.join(projectRoot, name + ext);
194
+ if (fs.existsSync(p)) return p;
195
+ }
196
+ return null;
197
+ }
198
+
199
+ /** package.json `bin` as a {name: relPath} map. A string bin maps the package name. */
200
+ export function readBinMap(projectRoot: string): Record<string, string> {
201
+ try {
202
+ const pkg = JSON.parse(fs.readFileSync(path.join(projectRoot, 'package.json'), 'utf-8'));
203
+ if (typeof pkg.bin === 'string') return pkg.name ? { [pkg.name]: pkg.bin } : {};
204
+ if (pkg.bin && typeof pkg.bin === 'object') return pkg.bin as Record<string, string>;
205
+ } catch {
206
+ // no package.json / unparseable — fall back to the file-name convention
207
+ }
208
+ return {};
209
+ }
210
+
211
+ function resolveRunspecCli(projectRoot: string): string | null {
212
+ const candidates = [
213
+ path.join(projectRoot, 'node_modules', 'runspec-node', 'bin', 'runspec.js'),
214
+ path.join(projectRoot, 'node_modules', '.bin', 'runspec'),
215
+ ];
216
+ return candidates.find((c) => fs.existsSync(c)) ?? null;
217
+ }
218
+
219
+ /** POSIX shim that resolves the project root relative to itself, then execs node. */
220
+ export function shimContent(relPath: string): string {
221
+ return ['#!/bin/sh', '# Generated by `runspec bin` — do not edit.', 'DIR=$(CDPATH= cd -- "$(dirname -- "$0")/.." && pwd)', `exec node "$DIR/${relPath}" "$@"`, ''].join('\n');
222
+ }
223
+
224
+ function writeShim(shimPath: string, relPath: string): void {
225
+ fs.writeFileSync(shimPath, shimContent(relPath), 'utf-8');
226
+ fs.chmodSync(shimPath, 0o755);
227
+ }
228
+
229
+ function toPosix(p: string): string {
230
+ return p.split(path.sep).join('/');
231
+ }
232
+
115
233
  async function cmdJump(args: string[]): Promise<void> {
116
234
  const parsed = parse({ scriptName: 'runspec', argv: ['jump', ...args], configPath: _CLI_CONFIG });
117
235
  const fmt = String(parsed['format'] ?? 'text');
@@ -632,6 +750,7 @@ Usage:
632
750
  Commands:
633
751
  init Create runspec.toml and a code stub
634
752
  local List runnables and emit tool schemas
753
+ bin Generate a venv-shaped bin/ so a controller can run this folder
635
754
  jump Execute a runnable on a remote host via SSH
636
755
  serve Start the MCP stdio server for local runnables
637
756
 
@@ -642,6 +761,7 @@ Examples:
642
761
  runspec init --example
643
762
  runspec local
644
763
  runspec local --format mcp
764
+ runspec bin
645
765
  runspec serve`);
646
766
  }
647
767
 
@@ -672,6 +792,20 @@ Examples:
672
792
  runspec local --format mcp --script deploy
673
793
  runspec local --format json`,
674
794
 
795
+ bin: `runspec bin — Generate a venv-shaped bin/ for this folder's runnables
796
+
797
+ Writes bin/runspec plus one bin/<runnable> shim per runnable in runspec.toml,
798
+ so a controller (e.g. runspec-console) can invoke bin/<runnable> and discover
799
+ the folder via bin/runspec — from any working directory, including over SSH.
800
+
801
+ Each runnable's script is resolved from package.json "bin", falling back to
802
+ ./<runnable>.js | .cjs | .mjs next to runspec.toml. Re-run after adding a
803
+ runnable or 'npm install'. (POSIX shims; Windows support is a follow-up.)
804
+
805
+ Examples:
806
+ npm install runspec-node
807
+ runspec bin`,
808
+
675
809
  jump: `runspec jump — Execute a runnable on a remote host via SSH
676
810
 
677
811
  Not yet implemented in the Node package.
package/src/finder.ts CHANGED
@@ -1,21 +1,79 @@
1
1
  import * as fs from 'fs';
2
2
  import * as path from 'path';
3
3
 
4
+ /**
5
+ * Locate the governing `runspec.toml`.
6
+ *
7
+ * Resolution order mirrors the Python `parse()`:
8
+ * 1. `RUNSPEC_CONFIG` env var — explicit override.
9
+ * 2. an explicit `start` directory, when one is passed.
10
+ * 3. **caller-relative** — walk up from the entry script's directory
11
+ * (`require.main` / `process.argv[1]`). This is what lets an installed
12
+ * runnable find its own config from *any* working directory — e.g. when a
13
+ * controller launches `bin/greet` over SSH with `cwd` = the login home,
14
+ * not the package. Mirrors Python resolving relative to the installed
15
+ * package, "what makes installed entry points work from any working
16
+ * directory".
17
+ * 4. **cwd-relative** — walk up from `process.cwd()` (the historical
18
+ * behaviour, kept as the final fallback).
19
+ *
20
+ * A `runspec.toml` found *inside* a `node_modules` path is ignored: those
21
+ * belong to installed dependencies (including runspec-node's own bundled CLI
22
+ * spec), never the project being discovered.
23
+ */
4
24
  export function findConfig(start?: string): { configPath: string } {
5
- let dir = path.resolve(start ?? process.cwd());
25
+ const env = process.env.RUNSPEC_CONFIG;
26
+ if (env && fs.existsSync(env)) return { configPath: path.resolve(env) };
6
27
 
28
+ // process.argv[1] over require.main.filename: the latter realpath-resolves
29
+ // symlinks, which under `npm link` / workspaces / a local install jumps the
30
+ // entry *out* of the project (to the linked source) and breaks the walk.
31
+ // process.argv[1] preserves the path the binary was actually invoked at —
32
+ // inside the project's node_modules — which is what we want to walk up from.
33
+ const entry = process.argv[1] ?? require.main?.filename;
34
+ const entryDir = entry ? path.dirname(entry) : undefined;
35
+
36
+ for (const dir of searchStarts(start, entryDir, process.cwd())) {
37
+ const found = walkUp(dir);
38
+ if (found) return { configPath: found };
39
+ }
40
+
41
+ throw new Error(
42
+ "No runspec configuration found.\nExpected runspec.toml inside your package directory.\n\nRun 'runspec init' to create one.",
43
+ );
44
+ }
45
+
46
+ /**
47
+ * Ordered, de-duplicated list of directories to walk up from, mirroring the
48
+ * resolution order documented on `findConfig`. Pure (no I/O) so the priority
49
+ * logic is unit-testable without a filesystem fixture.
50
+ */
51
+ export function searchStarts(start: string | undefined, entryDir: string | undefined, cwd: string): string[] {
52
+ const out: string[] = [];
53
+ if (start) out.push(path.resolve(start));
54
+ if (entryDir) out.push(path.resolve(entryDir));
55
+ out.push(path.resolve(cwd));
56
+ return [...new Set(out)];
57
+ }
58
+
59
+ /**
60
+ * Walk up from `start` looking for a `runspec.toml`, skipping any found under a
61
+ * `node_modules` path (a dependency's spec, not the project's). Returns the
62
+ * path or null. Exported for testing.
63
+ */
64
+ export function walkUp(start: string): string | null {
65
+ let dir = path.resolve(start);
7
66
  while (true) {
8
67
  const runspecToml = path.join(dir, 'runspec.toml');
9
- if (fs.existsSync(runspecToml)) {
10
- return { configPath: runspecToml };
68
+ if (fs.existsSync(runspecToml) && !isInNodeModules(dir)) {
69
+ return runspecToml;
11
70
  }
12
-
13
71
  const parent = path.dirname(dir);
14
- if (parent === dir) break;
72
+ if (parent === dir) return null;
15
73
  dir = parent;
16
74
  }
75
+ }
17
76
 
18
- throw new Error(
19
- "No runspec configuration found.\nExpected runspec.toml inside your package directory.\n\nRun 'runspec init' to create one.",
20
- );
77
+ function isInNodeModules(dir: string): boolean {
78
+ return dir.split(path.sep).includes('node_modules');
21
79
  }
@@ -0,0 +1,126 @@
1
+ import * as fs from 'fs';
2
+ import * as os from 'os';
3
+ import * as path from 'path';
4
+ import { scaffoldBin, resolveScript, readBinMap, shimContent } from '../src/cli';
5
+
6
+ function tmp(): string {
7
+ return fs.mkdtempSync(path.join(fs.realpathSync(os.tmpdir()), 'runspec-bin-'));
8
+ }
9
+
10
+ function project(files: Record<string, string>): string {
11
+ const dir = tmp();
12
+ for (const [rel, content] of Object.entries(files)) {
13
+ const p = path.join(dir, rel);
14
+ fs.mkdirSync(path.dirname(p), { recursive: true });
15
+ fs.writeFileSync(p, content);
16
+ }
17
+ return dir;
18
+ }
19
+
20
+ const cleanups: string[] = [];
21
+ afterEach(() => {
22
+ while (cleanups.length) fs.rmSync(cleanups.pop()!, { recursive: true, force: true });
23
+ });
24
+ function track(dir: string): string {
25
+ cleanups.push(dir);
26
+ return dir;
27
+ }
28
+
29
+ describe('shimContent', () => {
30
+ it('is an executable POSIX shim that resolves its own root and execs node', () => {
31
+ const s = shimContent('greet.js');
32
+ expect(s.startsWith('#!/bin/sh')).toBe(true);
33
+ expect(s).toContain('dirname');
34
+ expect(s).toContain('exec node "$DIR/greet.js" "$@"');
35
+ });
36
+ });
37
+
38
+ describe('readBinMap', () => {
39
+ it('reads an object bin map', () => {
40
+ const dir = track(project({ 'package.json': JSON.stringify({ name: 'x', bin: { greet: './g.js' } }) }));
41
+ expect(readBinMap(dir)).toEqual({ greet: './g.js' });
42
+ });
43
+
44
+ it('maps the package name for a string bin', () => {
45
+ const dir = track(project({ 'package.json': JSON.stringify({ name: 'mytool', bin: './m.js' }) }));
46
+ expect(readBinMap(dir)).toEqual({ mytool: './m.js' });
47
+ });
48
+
49
+ it('returns {} when no package.json', () => {
50
+ const dir = track(tmp());
51
+ expect(readBinMap(dir)).toEqual({});
52
+ });
53
+ });
54
+
55
+ describe('resolveScript', () => {
56
+ it('prefers package.json bin when the target exists', () => {
57
+ const dir = track(project({ 'src/greet.js': '' }));
58
+ expect(resolveScript(dir, 'greet', { greet: './src/greet.js' })).toBe(path.join(dir, 'src/greet.js'));
59
+ });
60
+
61
+ it('returns null when a bin entry points at a missing file', () => {
62
+ const dir = track(tmp());
63
+ expect(resolveScript(dir, 'greet', { greet: './nope.js' })).toBeNull();
64
+ });
65
+
66
+ it('falls back to ./<name>.{js,cjs,mjs} by convention', () => {
67
+ const dir = track(project({ 'greet.cjs': '' }));
68
+ expect(resolveScript(dir, 'greet', {})).toBe(path.join(dir, 'greet.cjs'));
69
+ });
70
+
71
+ it('returns null when no script can be found', () => {
72
+ const dir = track(tmp());
73
+ expect(resolveScript(dir, 'greet', {})).toBeNull();
74
+ });
75
+ });
76
+
77
+ describe('scaffoldBin', () => {
78
+ const TOML = '[greet]\ndescription = "g"\n[greet.args]\nname = {type="str", default="world"}\n[backup]\ndescription = "b"\n';
79
+
80
+ it('writes bin/runspec + one bin/<runnable> per runnable, executable', () => {
81
+ const dir = track(
82
+ project({
83
+ 'runspec.toml': TOML,
84
+ 'greet.js': 'x',
85
+ 'backup.js': 'x',
86
+ 'node_modules/runspec-node/bin/runspec.js': '#!/usr/bin/env node\n',
87
+ }),
88
+ );
89
+ const res = scaffoldBin(dir);
90
+ expect(res.warnings).toEqual([]);
91
+ expect(res.written.map((w) => w.name).sort()).toEqual(['backup', 'greet', 'runspec']);
92
+
93
+ for (const name of ['runspec', 'greet', 'backup']) {
94
+ const p = path.join(dir, 'bin', name);
95
+ expect(fs.existsSync(p)).toBe(true);
96
+ expect(fs.statSync(p).mode & 0o111).toBeTruthy(); // executable bit
97
+ }
98
+ // bin/runspec points at the installed CLI; bin/greet at the runnable script.
99
+ expect(fs.readFileSync(path.join(dir, 'bin', 'runspec'), 'utf-8')).toContain('node_modules/runspec-node/bin/runspec.js');
100
+ expect(fs.readFileSync(path.join(dir, 'bin', 'greet'), 'utf-8')).toContain('exec node "$DIR/greet.js"');
101
+ // venv shape includes logs/
102
+ expect(fs.existsSync(path.join(dir, 'logs'))).toBe(true);
103
+ });
104
+
105
+ it('warns (and skips) when a runnable has no script, and when runspec-node is absent', () => {
106
+ const dir = track(project({ 'runspec.toml': TOML, 'greet.js': 'x' })); // no backup.js, no node_modules
107
+ const res = scaffoldBin(dir);
108
+ expect(res.written.map((w) => w.name)).toEqual(['greet']);
109
+ expect(res.warnings.some((w) => w.includes('backup'))).toBe(true);
110
+ expect(res.warnings.some((w) => w.includes('runspec-node is not installed'))).toBe(true);
111
+ });
112
+
113
+ it('honours a package.json bin path over the convention', () => {
114
+ const dir = track(
115
+ project({
116
+ 'runspec.toml': '[greet]\ndescription = "g"\n',
117
+ 'package.json': JSON.stringify({ name: 'x', bin: { greet: './cmd/greet.js' } }),
118
+ 'cmd/greet.js': 'x',
119
+ 'node_modules/runspec-node/bin/runspec.js': '#!/usr/bin/env node\n',
120
+ }),
121
+ );
122
+ const res = scaffoldBin(dir);
123
+ expect(res.warnings).toEqual([]);
124
+ expect(fs.readFileSync(path.join(dir, 'bin', 'greet'), 'utf-8')).toContain('exec node "$DIR/cmd/greet.js"');
125
+ });
126
+ });
@@ -0,0 +1,94 @@
1
+ import * as fs from 'fs';
2
+ import * as os from 'os';
3
+ import * as path from 'path';
4
+ import { findConfig, searchStarts, walkUp } from '../src/finder';
5
+
6
+ function tmpdir(): string {
7
+ return fs.mkdtempSync(path.join(fs.realpathSync(os.tmpdir()), 'runspec-finder-'));
8
+ }
9
+
10
+ function writeToml(dir: string): string {
11
+ fs.mkdirSync(dir, { recursive: true });
12
+ const p = path.join(dir, 'runspec.toml');
13
+ fs.writeFileSync(p, '[greet]\ndescription = "x"\n');
14
+ return p;
15
+ }
16
+
17
+ describe('searchStarts — resolution priority', () => {
18
+ it('orders explicit start, then entry dir, then cwd', () => {
19
+ expect(searchStarts('/a', '/b', '/c')).toEqual([path.resolve('/a'), path.resolve('/b'), path.resolve('/c')]);
20
+ });
21
+
22
+ it('omits a missing explicit start / entry dir', () => {
23
+ expect(searchStarts(undefined, undefined, '/c')).toEqual([path.resolve('/c')]);
24
+ expect(searchStarts(undefined, '/b', '/c')).toEqual([path.resolve('/b'), path.resolve('/c')]);
25
+ });
26
+
27
+ it('de-duplicates while preserving order (cwd === entry dir)', () => {
28
+ expect(searchStarts(undefined, '/same', '/same')).toEqual([path.resolve('/same')]);
29
+ });
30
+ });
31
+
32
+ describe('walkUp', () => {
33
+ let dir: string;
34
+ afterEach(() => {
35
+ if (dir) fs.rmSync(dir, { recursive: true, force: true });
36
+ });
37
+
38
+ it('finds runspec.toml walking up from a nested dir', () => {
39
+ dir = tmpdir();
40
+ const toml = writeToml(dir);
41
+ const nested = path.join(dir, 'a', 'b', 'c');
42
+ fs.mkdirSync(nested, { recursive: true });
43
+ expect(walkUp(nested)).toBe(toml);
44
+ });
45
+
46
+ it('ignores a runspec.toml that lives under node_modules', () => {
47
+ dir = tmpdir();
48
+ const projectToml = writeToml(dir); // {root}/runspec.toml — the project's
49
+ // A dependency ships its own runspec.toml (e.g. runspec-node's CLI spec).
50
+ const depDir = path.join(dir, 'node_modules', 'runspec-node', 'dist');
51
+ writeToml(depDir);
52
+ // Walking up from inside node_modules must skip the dep's toml and resolve
53
+ // the project's — this is the installed-CLI discovery case.
54
+ expect(walkUp(depDir)).toBe(projectToml);
55
+ });
56
+
57
+ it('returns null when no runspec.toml exists up the tree', () => {
58
+ dir = tmpdir();
59
+ const nested = path.join(dir, 'x', 'y');
60
+ fs.mkdirSync(nested, { recursive: true });
61
+ expect(walkUp(nested)).toBeNull();
62
+ });
63
+ });
64
+
65
+ describe('findConfig', () => {
66
+ let dir: string;
67
+ const savedEnv = process.env.RUNSPEC_CONFIG;
68
+ afterEach(() => {
69
+ if (savedEnv === undefined) delete process.env.RUNSPEC_CONFIG;
70
+ else process.env.RUNSPEC_CONFIG = savedEnv;
71
+ if (dir) fs.rmSync(dir, { recursive: true, force: true });
72
+ });
73
+
74
+ it('honours RUNSPEC_CONFIG when set', () => {
75
+ dir = tmpdir();
76
+ const toml = writeToml(path.join(dir, 'custom'));
77
+ process.env.RUNSPEC_CONFIG = toml;
78
+ // cwd has no toml, but the env var wins regardless.
79
+ expect(findConfig(dir).configPath).toBe(path.resolve(toml));
80
+ });
81
+
82
+ it('resolves from an explicit start dir', () => {
83
+ delete process.env.RUNSPEC_CONFIG;
84
+ dir = tmpdir();
85
+ const toml = writeToml(dir);
86
+ expect(findConfig(path.join(dir, 'sub', 'dir')).configPath).toBe(toml);
87
+ });
88
+
89
+ it('throws a helpful error when nothing is found', () => {
90
+ delete process.env.RUNSPEC_CONFIG;
91
+ dir = tmpdir(); // empty, no runspec.toml anywhere up the chain inside the tmp root
92
+ expect(() => findConfig(dir)).toThrow(/No runspec configuration found/);
93
+ });
94
+ });