@runa-cmd/core 0.1.0 → 0.2.0-beta.1
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 +125 -23
- package/dist/cli.d.ts +20 -4
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +392 -143
- package/dist/cli.js.map +1 -1
- package/dist/errors.d.ts +25 -0
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +72 -6
- package/dist/errors.js.map +1 -1
- package/dist/flag-name.d.ts +12 -0
- package/dist/flag-name.d.ts.map +1 -0
- package/dist/flag-name.js +19 -0
- package/dist/flag-name.js.map +1 -0
- package/dist/help.d.ts +21 -0
- package/dist/help.d.ts.map +1 -0
- package/dist/help.js +151 -0
- package/dist/help.js.map +1 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/internal.d.ts +10 -0
- package/dist/internal.d.ts.map +1 -0
- package/dist/internal.js +9 -0
- package/dist/internal.js.map +1 -0
- package/dist/introspect.d.ts.map +1 -1
- package/dist/introspect.js +10 -3
- package/dist/introspect.js.map +1 -1
- package/dist/lifecycle.d.ts.map +1 -1
- package/dist/lifecycle.js +5 -3
- package/dist/lifecycle.js.map +1 -1
- package/dist/parse/adapters/zod-v4.d.ts +3 -0
- package/dist/parse/adapters/zod-v4.d.ts.map +1 -0
- package/dist/parse/adapters/zod-v4.js +106 -0
- package/dist/parse/adapters/zod-v4.js.map +1 -0
- package/dist/parse/deprecated.d.ts +12 -0
- package/dist/parse/deprecated.d.ts.map +1 -0
- package/dist/parse/deprecated.js +21 -0
- package/dist/parse/deprecated.js.map +1 -0
- package/dist/parse/parseargs-bridge.d.ts +10 -0
- package/dist/parse/parseargs-bridge.d.ts.map +1 -1
- package/dist/parse/parseargs-bridge.js +20 -6
- package/dist/parse/parseargs-bridge.js.map +1 -1
- package/dist/parse/resolve.d.ts +44 -1
- package/dist/parse/resolve.d.ts.map +1 -1
- package/dist/parse/resolve.js +151 -73
- package/dist/parse/resolve.js.map +1 -1
- package/dist/parse/schema-adapter.d.ts +42 -0
- package/dist/parse/schema-adapter.d.ts.map +1 -0
- package/dist/parse/schema-adapter.js +4 -0
- package/dist/parse/schema-adapter.js.map +1 -0
- package/dist/parse/schema-walker.d.ts +3 -3
- package/dist/parse/schema-walker.d.ts.map +1 -1
- package/dist/parse/schema-walker.js +13 -104
- package/dist/parse/schema-walker.js.map +1 -1
- package/dist/parse/strict.d.ts +52 -0
- package/dist/parse/strict.d.ts.map +1 -0
- package/dist/parse/strict.js +68 -0
- package/dist/parse/strict.js.map +1 -0
- package/dist/parse/variadic.d.ts +2 -1
- package/dist/parse/variadic.d.ts.map +1 -1
- package/dist/parse/variadic.js +4 -24
- package/dist/parse/variadic.js.map +1 -1
- package/dist/plugin.d.ts +41 -1
- package/dist/plugin.d.ts.map +1 -1
- package/dist/plugin.js +189 -0
- package/dist/plugin.js.map +1 -1
- package/dist/stop.d.ts +25 -0
- package/dist/stop.d.ts.map +1 -0
- package/dist/stop.js +110 -0
- package/dist/stop.js.map +1 -0
- package/dist/suggest.d.ts +18 -0
- package/dist/suggest.d.ts.map +1 -0
- package/dist/suggest.js +56 -0
- package/dist/suggest.js.map +1 -0
- package/dist/tool-channel.d.ts +48 -0
- package/dist/tool-channel.d.ts.map +1 -0
- package/dist/tool-channel.js +46 -0
- package/dist/tool-channel.js.map +1 -0
- package/dist/types.d.ts +51 -7
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +6 -2
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { ValidationError } from '../errors.js';
|
|
2
|
+
import { flagName, longFlag } from '../flag-name.js';
|
|
3
|
+
import { findSuggestion } from '../suggest.js';
|
|
4
|
+
// ─── Helpers ────────────────────────────────────────────────
|
|
5
|
+
/** Render a parseArgs value key as the flag the user typed: `-x` or `--xyz`. */
|
|
6
|
+
function renderFlag(key) {
|
|
7
|
+
return key.length === 1 ? `-${key}` : `--${key}`;
|
|
8
|
+
}
|
|
9
|
+
/** Every token that would be read as one of these options. */
|
|
10
|
+
function registeredFlags(options) {
|
|
11
|
+
const flags = new Set();
|
|
12
|
+
for (const [name, option] of Object.entries(options)) {
|
|
13
|
+
flags.add(`--${name}`);
|
|
14
|
+
if (option.type === 'boolean')
|
|
15
|
+
flags.add(`--no-${name}`);
|
|
16
|
+
if (option.short)
|
|
17
|
+
flags.add(`-${option.short}`);
|
|
18
|
+
}
|
|
19
|
+
return flags;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Throw a ValidationError (exit 2) on the first option that takes a value but
|
|
23
|
+
* got none. Tokens tell the cases apart: with `--tag --force`, parseArgs takes
|
|
24
|
+
* `--force` as the value and silently drops the flag, while `--tag=--force`
|
|
25
|
+
* and `--tag -text` are values the user meant.
|
|
26
|
+
*/
|
|
27
|
+
export function assertOptionValues(input) {
|
|
28
|
+
const { tokens = [], options, longAliasMap, optionMeta } = input;
|
|
29
|
+
const flags = registeredFlags(options);
|
|
30
|
+
for (const { kind, name: key = '', value, inlineValue } of tokens) {
|
|
31
|
+
if (kind !== 'option' || options[key]?.type !== 'string')
|
|
32
|
+
continue;
|
|
33
|
+
if (value !== undefined && (inlineValue || !flags.has(value)))
|
|
34
|
+
continue;
|
|
35
|
+
const name = longAliasMap[key] ?? key;
|
|
36
|
+
const names = [...(optionMeta?.[name]?.alias ?? []), longFlag(name)].join(', ');
|
|
37
|
+
throw new ValidationError([
|
|
38
|
+
{ code: 'custom', message: `Option ${names} requires a value`, path: [] },
|
|
39
|
+
]);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Throw a ValidationError (exit 2) on the first parseArgs-produced key that
|
|
44
|
+
* is not registered, with a did-you-mean suggestion when a candidate is close.
|
|
45
|
+
*/
|
|
46
|
+
export function assertKnownOptions(input) {
|
|
47
|
+
const { producedKeys, knownKeys, booleanKeys, suggestionCandidates } = input;
|
|
48
|
+
for (const key of producedKeys) {
|
|
49
|
+
if (knownKeys.has(key))
|
|
50
|
+
continue;
|
|
51
|
+
// Defensive allowance: on Node 24, parseArgs folds `--no-x` into
|
|
52
|
+
// `x: false` even for unregistered keys (see parseargs-negation.test.ts),
|
|
53
|
+
// so `no-*` keys never appear today — this guards a future Node line
|
|
54
|
+
// surfacing the negation token un-folded.
|
|
55
|
+
if (key.startsWith('no-') && booleanKeys.has(key.slice(3)))
|
|
56
|
+
continue;
|
|
57
|
+
const flag = renderFlag(key);
|
|
58
|
+
// `--darkColor` isn't a typo: it's the right name in the wrong form.
|
|
59
|
+
const suggestion = suggestionCandidates.includes(flagName(key))
|
|
60
|
+
? flagName(key)
|
|
61
|
+
: findSuggestion(key, suggestionCandidates);
|
|
62
|
+
const message = suggestion
|
|
63
|
+
? `Unknown option: ${flag}. Did you mean '${renderFlag(suggestion)}'?`
|
|
64
|
+
: `Unknown option: ${flag}`;
|
|
65
|
+
throw new ValidationError([{ code: 'custom', message, path: [] }]);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=strict.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"strict.js","sourceRoot":"","sources":["../../src/parse/strict.ts"],"names":[],"mappings":"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"}
|
package/dist/parse/variadic.d.ts
CHANGED
|
@@ -8,7 +8,8 @@
|
|
|
8
8
|
import type { ZodType } from 'zod';
|
|
9
9
|
/**
|
|
10
10
|
* Check if a Zod schema is a z.array() type.
|
|
11
|
-
*
|
|
11
|
+
* Wrapper unwrapping (optional/default/nullable) is handled by the
|
|
12
|
+
* SchemaAdapter seam — this is a thin delegate over `describe()`.
|
|
12
13
|
*/
|
|
13
14
|
export declare function isVariadic(schema: ZodType): boolean;
|
|
14
15
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"variadic.d.ts","sourceRoot":"","sources":["../../src/parse/variadic.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"variadic.d.ts","sourceRoot":"","sources":["../../src/parse/variadic.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,KAAK,CAAC;AAMnC;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAEnD;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAsCxE"}
|
package/dist/parse/variadic.js
CHANGED
|
@@ -1,33 +1,13 @@
|
|
|
1
1
|
import { RunaError } from '../errors.js';
|
|
2
|
-
|
|
3
|
-
const s = schema;
|
|
4
|
-
return s._zod?.def?.type ?? 'unknown';
|
|
5
|
-
}
|
|
2
|
+
import { defaultAdapter } from './schema-adapter.js';
|
|
6
3
|
// ─── Public API ─────────────────────────────────────────────
|
|
7
4
|
/**
|
|
8
5
|
* Check if a Zod schema is a z.array() type.
|
|
9
|
-
*
|
|
6
|
+
* Wrapper unwrapping (optional/default/nullable) is handled by the
|
|
7
|
+
* SchemaAdapter seam — this is a thin delegate over `describe()`.
|
|
10
8
|
*/
|
|
11
9
|
export function isVariadic(schema) {
|
|
12
|
-
|
|
13
|
-
const maxDepth = 10;
|
|
14
|
-
for (let i = 0; i < maxDepth; i++) {
|
|
15
|
-
const defType = getDefType(current);
|
|
16
|
-
if (defType === 'array') {
|
|
17
|
-
return true;
|
|
18
|
-
}
|
|
19
|
-
// Unwrap wrappers
|
|
20
|
-
if (defType === 'optional' || defType === 'default' || defType === 'nullable') {
|
|
21
|
-
const s = current;
|
|
22
|
-
const inner = s._zod?.def?.innerType;
|
|
23
|
-
if (inner) {
|
|
24
|
-
current = inner;
|
|
25
|
-
continue;
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
return false;
|
|
29
|
-
}
|
|
30
|
-
return false;
|
|
10
|
+
return defaultAdapter.describe(schema).kind === 'array';
|
|
31
11
|
}
|
|
32
12
|
/**
|
|
33
13
|
* Validate variadic arg constraints:
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"variadic.js","sourceRoot":"","sources":["../../src/parse/variadic.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"variadic.js","sourceRoot":"","sources":["../../src/parse/variadic.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,+DAA+D;AAE/D;;;;GAIG;AACH,MAAM,UAAU,UAAU,CAAC,MAAe;IACzC,OAAO,cAAc,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC;AACzD,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,oBAAoB,CAAC,IAA6B;IACjE,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/B,MAAM,YAAY,GAA2C,EAAE,CAAC;IAEhE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,IAAI,CAAC,GAAG;YAAE,SAAS;QACnB,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;QACzB,IAAI,MAAM,IAAI,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YAClC,YAAY,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;QAC5C,CAAC;IACF,CAAC;IAED,oBAAoB;IACpB,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/B,OAAO;IACR,CAAC;IAED,4BAA4B;IAC5B,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7B,MAAM,KAAK,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChE,MAAM,IAAI,SAAS,CAAC,wDAAwD,KAAK,GAAG,EAAE;YACrF,IAAI,EAAE,uBAAuB;YAC7B,QAAQ,EAAE,CAAC;SACX,CAAC,CAAC;IACJ,CAAC;IAED,kDAAkD;IAClD,MAAM,UAAU,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;IACnC,IAAI,UAAU,IAAI,UAAU,CAAC,KAAK,KAAK,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxD,MAAM,IAAI,SAAS,CAClB,iBAAiB,UAAU,CAAC,IAAI,0CAA0C;YACzE,qBAAqB,UAAU,CAAC,KAAK,OAAO,IAAI,CAAC,MAAM,GAAG,EAC3D,EAAE,IAAI,EAAE,2BAA2B,EAAE,QAAQ,EAAE,CAAC,EAAE,CAClD,CAAC;IACH,CAAC;IAED,wCAAwC;AACzC,CAAC"}
|
package/dist/plugin.d.ts
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* Capability validation via PluginAPI proxy
|
|
7
7
|
*/
|
|
8
8
|
import type { ZodType } from 'zod';
|
|
9
|
-
import type { CLISchema, CommandTree, HookHandler, HookName, Middleware, OptionMeta, PluginAPI, PluginCapabilities, PluginConfig } from './types.js';
|
|
9
|
+
import type { CLISchema, CommandTree, HelpHandler, HookHandler, HookName, Middleware, OptionMeta, PluginAPI, PluginCapabilities, PluginConfig } from './types.js';
|
|
10
10
|
/**
|
|
11
11
|
* Validate and return a PluginConfig.
|
|
12
12
|
* Passthrough with shape validation — ensures required fields exist.
|
|
@@ -25,6 +25,10 @@ export declare function resolvePlugins(plugins: PluginInput[]): Promise<PluginCo
|
|
|
25
25
|
* Detects circular dependencies and missing dependencies.
|
|
26
26
|
*/
|
|
27
27
|
export declare function topologicalSort(plugins: PluginConfig[]): PluginConfig[];
|
|
28
|
+
export interface HelpSlot {
|
|
29
|
+
owner?: string;
|
|
30
|
+
show?: HelpHandler;
|
|
31
|
+
}
|
|
28
32
|
export interface PluginHostRefs {
|
|
29
33
|
commands: CommandTree;
|
|
30
34
|
globalOptions: Record<string, ZodType>;
|
|
@@ -34,6 +38,17 @@ export interface PluginHostRefs {
|
|
|
34
38
|
middleware: Middleware[];
|
|
35
39
|
hookRegister: (name: HookName, handler: HookHandler) => void;
|
|
36
40
|
getSchema: () => CLISchema;
|
|
41
|
+
getConfigValues?: () => Promise<Record<string, unknown> | undefined>;
|
|
42
|
+
/** Who replaced the built-in help, and how it's shown now */
|
|
43
|
+
help: HelpSlot;
|
|
44
|
+
/**
|
|
45
|
+
* Registrant(s) per global option name, for collision attribution
|
|
46
|
+
* (ADR-0014). Statically-declared `config.globalOptions` are
|
|
47
|
+
* seeded with STATIC_GLOBAL_OPTION_SOURCE; `addGlobalOption` appends the
|
|
48
|
+
* registering plugin's name. More than one registrant = a collision that
|
|
49
|
+
* `validateOptionCollisions()` reports.
|
|
50
|
+
*/
|
|
51
|
+
globalOptionSources?: Map<string, string[]>;
|
|
37
52
|
}
|
|
38
53
|
/**
|
|
39
54
|
* Create a PluginAPI for a specific plugin, enforcing capability checks.
|
|
@@ -43,6 +58,31 @@ export declare function createPluginAPI(pluginName: string, capabilities: Plugin
|
|
|
43
58
|
* Call setup(api) for each plugin in topological order.
|
|
44
59
|
*/
|
|
45
60
|
export declare function runPluginSetup(plugins: PluginConfig[], refs: PluginHostRefs): Promise<void>;
|
|
61
|
+
/**
|
|
62
|
+
* Sentinel registrant for global options declared statically in
|
|
63
|
+
* `config.globalOptions` (as opposed to plugin-registered ones).
|
|
64
|
+
*/
|
|
65
|
+
export declare const STATIC_GLOBAL_OPTION_SOURCE = "<cli-config>";
|
|
66
|
+
/** Keys that can't become a usable flag fail at startup, not on the first use. */
|
|
67
|
+
export declare function validateOptionNames(commands: CommandTree, globalOptions: Record<string, ZodType>): void;
|
|
68
|
+
/**
|
|
69
|
+
* Single validation pass over the full option surface (ADR-0014).
|
|
70
|
+
* Called once per `cli.run()`, immediately after plugin setup — the earliest
|
|
71
|
+
* point where plugin-registered globals AND plugin-added commands both exist.
|
|
72
|
+
*
|
|
73
|
+
* Detects, in deterministic order:
|
|
74
|
+
* 1. Global-vs-global same-name registrations (two plugins, or config + plugin)
|
|
75
|
+
* 2. Global-vs-global alias overlaps (name or alias claimed by two globals)
|
|
76
|
+
* 3. Global-vs-command collisions (names + aliases, full nested command tree)
|
|
77
|
+
*
|
|
78
|
+
* Throws `RunaError` code `OPTION_COLLISION`, exit 1 (CLI-author defect, not a
|
|
79
|
+
* usage error) on the FIRST collision found. This function is the ONLY place
|
|
80
|
+
* the check lives — the proposal's rollback path (downgrade throw to
|
|
81
|
+
* `console.warn`) is a one-line change here.
|
|
82
|
+
*/
|
|
83
|
+
export declare function validateOptionCollisions(commands: CommandTree, globalOptions: Record<string, ZodType>, globalMeta: {
|
|
84
|
+
options: Record<string, OptionMeta>;
|
|
85
|
+
}, sources?: Map<string, string[]>): void;
|
|
46
86
|
/**
|
|
47
87
|
* Call cleanup() for each plugin in REVERSE topological order.
|
|
48
88
|
* Each cleanup is wrapped in try/catch — failures don't prevent others from running.
|
package/dist/plugin.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,KAAK,CAAC;AAInC,OAAO,KAAK,EACX,SAAS,EAET,WAAW,EACX,WAAW,EACX,WAAW,EACX,QAAQ,EACR,UAAU,EACV,UAAU,EACV,SAAS,EACT,kBAAkB,EAClB,YAAY,EACZ,MAAM,YAAY,CAAC;AAIpB;;;GAGG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,YAAY,GAAG,YAAY,CAc/D;AAID,KAAK,WAAW,GAAG,YAAY,GAAG,CAAC,MAAM,OAAO,CAAC;IAAE,OAAO,EAAE,YAAY,CAAA;CAAE,CAAC,CAAC,CAAC;AAE7E;;;GAGG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CA2BpF;AAID;;;GAGG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,YAAY,EAAE,CAmEvE;AAID,MAAM,WAAW,QAAQ;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,WAAW,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC9B,QAAQ,EAAE,WAAW,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,UAAU,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAA;KAAE,CAAC;IACpD,UAAU,EAAE,UAAU,EAAE,CAAC;IACzB,YAAY,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,KAAK,IAAI,CAAC;IAC7D,SAAS,EAAE,MAAM,SAAS,CAAC;IAC3B,eAAe,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC,CAAC;IACrE,6DAA6D;IAC7D,IAAI,EAAE,QAAQ,CAAC;IACf;;;;;;OAMG;IACH,mBAAmB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;CAC5C;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC9B,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,kBAAkB,GAAG,SAAS,EAC5C,IAAI,EAAE,cAAc,GAClB,SAAS,CAkFX;AAID;;GAEG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAKjG;AAID;;;GAGG;AACH,eAAO,MAAM,2BAA2B,iBAAiB,CAAC;AA+B1D,kFAAkF;AAClF,wBAAgB,mBAAmB,CAClC,QAAQ,EAAE,WAAW,EACrB,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACpC,IAAI,CAaN;AAyCD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,wBAAwB,CACvC,QAAQ,EAAE,WAAW,EACrB,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACtC,UAAU,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAA;CAAE,EACnD,OAAO,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,GAC7B,IAAI,CAiGN;AAID;;;;GAIG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,CAiBhF"}
|
package/dist/plugin.js
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import { RunaError } from './errors.js';
|
|
2
|
+
import { flagName, longFlag } from './flag-name.js';
|
|
3
|
+
import { walkSchema } from './parse/schema-walker.js';
|
|
2
4
|
// ─── Public builder ─────────────────────────────────────────
|
|
3
5
|
/**
|
|
4
6
|
* Validate and return a PluginConfig.
|
|
@@ -140,6 +142,18 @@ export function createPluginAPI(pluginName, capabilities, refs) {
|
|
|
140
142
|
if (meta) {
|
|
141
143
|
refs.globalMeta.options[name] = meta;
|
|
142
144
|
}
|
|
145
|
+
// Record the registrant for collision attribution (ADR-0014).
|
|
146
|
+
// A duplicate registration is NOT rejected here — the single
|
|
147
|
+
// validation pass after setup reports it (order-independent).
|
|
148
|
+
if (refs.globalOptionSources) {
|
|
149
|
+
const registrants = refs.globalOptionSources.get(name);
|
|
150
|
+
if (registrants) {
|
|
151
|
+
registrants.push(pluginName);
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
154
|
+
refs.globalOptionSources.set(name, [pluginName]);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
143
157
|
},
|
|
144
158
|
addMiddleware(middleware) {
|
|
145
159
|
if (!caps.addMiddleware) {
|
|
@@ -157,6 +171,19 @@ export function createPluginAPI(pluginName, capabilities, refs) {
|
|
|
157
171
|
getCommands() {
|
|
158
172
|
return refs.commands;
|
|
159
173
|
},
|
|
174
|
+
async getConfigValues() {
|
|
175
|
+
return refs.getConfigValues?.();
|
|
176
|
+
},
|
|
177
|
+
replaceHelp(show) {
|
|
178
|
+
if (!caps.replaceHelp) {
|
|
179
|
+
throw new RunaError(`Plugin '${pluginName}' called replaceHelp() but did not declare replaceHelp capability.`, { code: 'PLUGIN_CAPABILITY_VIOLATION', exitCode: 1 });
|
|
180
|
+
}
|
|
181
|
+
if (refs.help.owner) {
|
|
182
|
+
throw new RunaError(`Plugins '${refs.help.owner}' and '${pluginName}' both replace the help.`, { code: 'HELP_ALREADY_REPLACED', exitCode: 1 });
|
|
183
|
+
}
|
|
184
|
+
refs.help.owner = pluginName;
|
|
185
|
+
refs.help.show = show;
|
|
186
|
+
},
|
|
160
187
|
};
|
|
161
188
|
}
|
|
162
189
|
// ─── Setup orchestration ────────────────────────────────────
|
|
@@ -169,6 +196,168 @@ export async function runPluginSetup(plugins, refs) {
|
|
|
169
196
|
await plugin.setup(api);
|
|
170
197
|
}
|
|
171
198
|
}
|
|
199
|
+
// ─── Option collision detection (ADR-0014) ────────────────
|
|
200
|
+
/**
|
|
201
|
+
* Sentinel registrant for global options declared statically in
|
|
202
|
+
* `config.globalOptions` (as opposed to plugin-registered ones).
|
|
203
|
+
*/
|
|
204
|
+
export const STATIC_GLOBAL_OPTION_SOURCE = '<cli-config>';
|
|
205
|
+
/** A key that reads as the negation of another one: `noCache`, `no-cache`. */
|
|
206
|
+
const NEGATED_KEY = /^no(?:-|(?=[A-Z]))(.+)$/;
|
|
207
|
+
function assertUsableNames(options, owner) {
|
|
208
|
+
const keysByFlag = new Map();
|
|
209
|
+
for (const { name, zodType } of walkSchema(options)) {
|
|
210
|
+
const flag = flagName(name);
|
|
211
|
+
const other = keysByFlag.get(flag);
|
|
212
|
+
if (other) {
|
|
213
|
+
throw new RunaError(`Options '${other}' and '${name}' of ${owner} are both '--${flag}'.`, {
|
|
214
|
+
code: 'OPTION_NAME',
|
|
215
|
+
exitCode: 1,
|
|
216
|
+
});
|
|
217
|
+
}
|
|
218
|
+
keysByFlag.set(flag, name);
|
|
219
|
+
const positive = NEGATED_KEY.exec(name)?.[1];
|
|
220
|
+
if (positive && zodType === 'boolean') {
|
|
221
|
+
const key = `${positive[0]?.toLowerCase()}${positive.slice(1)}`;
|
|
222
|
+
throw new RunaError(`Boolean option '${name}' of ${owner} would clash with '--no-${flagName(key)}', ` +
|
|
223
|
+
`which already negates '${key}'. Declare '${key}' instead, with .default(true).`, { code: 'OPTION_NAME', exitCode: 1 });
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
/** Keys that can't become a usable flag fail at startup, not on the first use. */
|
|
228
|
+
export function validateOptionNames(commands, globalOptions) {
|
|
229
|
+
assertUsableNames(globalOptions, 'the CLI');
|
|
230
|
+
const walk = (tree, path) => {
|
|
231
|
+
for (const [key, entry] of Object.entries(tree)) {
|
|
232
|
+
if (isCommandNode(entry)) {
|
|
233
|
+
assertUsableNames(entry.options ?? {}, `command '${[...path, key].join(' ')}'`);
|
|
234
|
+
}
|
|
235
|
+
else {
|
|
236
|
+
walk(entry, [...path, key]);
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
};
|
|
240
|
+
walk(commands, []);
|
|
241
|
+
}
|
|
242
|
+
/** Human label for a registrant in collision messages. */
|
|
243
|
+
function sourceLabel(registrant) {
|
|
244
|
+
return registrant === undefined || registrant === STATIC_GLOBAL_OPTION_SOURCE
|
|
245
|
+
? 'declared in config.globalOptions'
|
|
246
|
+
: `from plugin '${registrant}'`;
|
|
247
|
+
}
|
|
248
|
+
/** Render a token for messages: long names as `--name`, short chars as `-c`. */
|
|
249
|
+
const renderLong = longFlag;
|
|
250
|
+
function renderShort(char) {
|
|
251
|
+
return `-${char}`;
|
|
252
|
+
}
|
|
253
|
+
/** Split OptionMeta aliases into long names (without `--`) and short chars (without `-`). */
|
|
254
|
+
function splitAliases(meta) {
|
|
255
|
+
const longs = [];
|
|
256
|
+
const shorts = [];
|
|
257
|
+
for (const alias of meta?.alias ?? []) {
|
|
258
|
+
if (alias.startsWith('--')) {
|
|
259
|
+
longs.push(alias.slice(2));
|
|
260
|
+
}
|
|
261
|
+
else if (alias.startsWith('-') && alias.length === 2) {
|
|
262
|
+
shorts.push(alias.slice(1));
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
return { longs, shorts };
|
|
266
|
+
}
|
|
267
|
+
function isCommandNode(value) {
|
|
268
|
+
return '_type' in value && value._type === 'runa:command';
|
|
269
|
+
}
|
|
270
|
+
/**
|
|
271
|
+
* Single validation pass over the full option surface (ADR-0014).
|
|
272
|
+
* Called once per `cli.run()`, immediately after plugin setup — the earliest
|
|
273
|
+
* point where plugin-registered globals AND plugin-added commands both exist.
|
|
274
|
+
*
|
|
275
|
+
* Detects, in deterministic order:
|
|
276
|
+
* 1. Global-vs-global same-name registrations (two plugins, or config + plugin)
|
|
277
|
+
* 2. Global-vs-global alias overlaps (name or alias claimed by two globals)
|
|
278
|
+
* 3. Global-vs-command collisions (names + aliases, full nested command tree)
|
|
279
|
+
*
|
|
280
|
+
* Throws `RunaError` code `OPTION_COLLISION`, exit 1 (CLI-author defect, not a
|
|
281
|
+
* usage error) on the FIRST collision found. This function is the ONLY place
|
|
282
|
+
* the check lives — the proposal's rollback path (downgrade throw to
|
|
283
|
+
* `console.warn`) is a one-line change here.
|
|
284
|
+
*/
|
|
285
|
+
export function validateOptionCollisions(commands, globalOptions, globalMeta, sources) {
|
|
286
|
+
// 1. Same global name registered more than once (config counts as a registrant).
|
|
287
|
+
if (sources) {
|
|
288
|
+
for (const [name, registrants] of sources) {
|
|
289
|
+
if (registrants.length > 1) {
|
|
290
|
+
const labels = registrants
|
|
291
|
+
.map((r) => (r === STATIC_GLOBAL_OPTION_SOURCE ? 'the CLI config' : `plugin '${r}'`))
|
|
292
|
+
.join(' and ');
|
|
293
|
+
throw new RunaError(`Global option '${renderLong(name)}' is registered by both ${labels}.`, { code: 'OPTION_COLLISION', exitCode: 1 });
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
// 2. Build the global token surface; overlapping claims between two
|
|
298
|
+
// different globals throw here. Long names and short chars are
|
|
299
|
+
// separate namespaces (`--h` and `-h` are different tokens).
|
|
300
|
+
const globalLong = new Map();
|
|
301
|
+
const globalShort = new Map();
|
|
302
|
+
const claim = (map, key, owner) => {
|
|
303
|
+
const existing = map.get(key);
|
|
304
|
+
if (existing && existing.canonical !== owner.canonical) {
|
|
305
|
+
throw new RunaError(`Global option '${renderLong(owner.canonical)}' (${sourceLabel(sources?.get(owner.canonical)?.[0])}) ` +
|
|
306
|
+
`collides with global option '${renderLong(existing.canonical)}' (${sourceLabel(sources?.get(existing.canonical)?.[0])}): ` +
|
|
307
|
+
`both use '${owner.token}'.`, { code: 'OPTION_COLLISION', exitCode: 1 });
|
|
308
|
+
}
|
|
309
|
+
map.set(key, owner);
|
|
310
|
+
};
|
|
311
|
+
for (const name of Object.keys(globalOptions)) {
|
|
312
|
+
claim(globalLong, flagName(name), { canonical: name, token: renderLong(name) });
|
|
313
|
+
const { longs, shorts } = splitAliases(globalMeta.options[name]);
|
|
314
|
+
for (const long of longs) {
|
|
315
|
+
claim(globalLong, long, { canonical: name, token: renderLong(long) });
|
|
316
|
+
}
|
|
317
|
+
for (const short of shorts) {
|
|
318
|
+
claim(globalShort, short, { canonical: name, token: renderShort(short) });
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
if (globalLong.size === 0 && globalShort.size === 0)
|
|
322
|
+
return;
|
|
323
|
+
// 3. Walk the FULL command tree (including plugin-added commands and
|
|
324
|
+
// nested subcommands) comparing option names + aliases.
|
|
325
|
+
const walk = (tree, path) => {
|
|
326
|
+
for (const [key, entry] of Object.entries(tree)) {
|
|
327
|
+
if (!isCommandNode(entry)) {
|
|
328
|
+
walk(entry, [...path, key]);
|
|
329
|
+
continue;
|
|
330
|
+
}
|
|
331
|
+
const commandPath = [...path, key].join(' ');
|
|
332
|
+
const optionMeta = entry.meta.options;
|
|
333
|
+
for (const optName of Object.keys(entry.options ?? {})) {
|
|
334
|
+
const { longs, shorts } = splitAliases(optionMeta?.[optName]);
|
|
335
|
+
const collide = (owner) => {
|
|
336
|
+
const viaAlias = owner.token === renderLong(owner.canonical) && owner.token === renderLong(optName)
|
|
337
|
+
? ''
|
|
338
|
+
: ` Both use '${owner.token}'.`;
|
|
339
|
+
throw new RunaError(`Global option '${renderLong(owner.canonical)}' (${sourceLabel(sources?.get(owner.canonical)?.[0])}) ` +
|
|
340
|
+
`collides with option '${renderLong(optName)}' of command '${commandPath}'.${viaAlias}`, { code: 'OPTION_COLLISION', exitCode: 1 });
|
|
341
|
+
};
|
|
342
|
+
for (const long of [flagName(optName), ...longs]) {
|
|
343
|
+
const owner = globalLong.get(long);
|
|
344
|
+
if (owner) {
|
|
345
|
+
// Re-render the token from the command's side when the
|
|
346
|
+
// collision came through the command's long alias.
|
|
347
|
+
const isOwnFlag = long === flagName(owner.canonical);
|
|
348
|
+
collide(isOwnFlag ? owner : { ...owner, token: renderLong(long) });
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
for (const short of shorts) {
|
|
352
|
+
const owner = globalShort.get(short);
|
|
353
|
+
if (owner)
|
|
354
|
+
collide(owner);
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
};
|
|
359
|
+
walk(commands, []);
|
|
360
|
+
}
|
|
172
361
|
// ─── Cleanup orchestration ──────────────────────────────────
|
|
173
362
|
/**
|
|
174
363
|
* Call cleanup() for each plugin in REVERSE topological order.
|
package/dist/plugin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"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"}
|
package/dist/stop.d.ts
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/** How long run() has to end once told to stop. */
|
|
2
|
+
export declare const RUN_GRACE_MS = 2000;
|
|
3
|
+
/** How long after that notice the process ends anyway, with cleanup or without it. */
|
|
4
|
+
export declare const STOP_DEADLINE_MS = 5000;
|
|
5
|
+
/**
|
|
6
|
+
* End a process and those it started. It reaches the group on Unix, so the
|
|
7
|
+
* process must lead one, and the tree on Windows, where it must still be alive.
|
|
8
|
+
*/
|
|
9
|
+
export declare function killProcessTree(pid: number): void;
|
|
10
|
+
export interface RunStop {
|
|
11
|
+
readonly signal: AbortSignal;
|
|
12
|
+
/** The exit code a stop asks for, once there was one */
|
|
13
|
+
readonly exitCode: number | undefined;
|
|
14
|
+
/** Run the command, giving up on it once its grace period is over */
|
|
15
|
+
guard(run: () => Promise<void>): Promise<void>;
|
|
16
|
+
/** The run ended: stop listening, and end what a stopped tool left behind */
|
|
17
|
+
finish(): void;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Start listening for a stop.
|
|
21
|
+
*
|
|
22
|
+
* @param isTool - This process leads its own group, and has a server above it
|
|
23
|
+
*/
|
|
24
|
+
export declare function watchForStop(isTool: boolean): RunStop;
|
|
25
|
+
//# sourceMappingURL=stop.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stop.d.ts","sourceRoot":"","sources":["../src/stop.ts"],"names":[],"mappings":"AAUA,mDAAmD;AACnD,eAAO,MAAM,YAAY,OAAO,CAAC;AACjC,sFAAsF;AACtF,eAAO,MAAM,gBAAgB,OAAO,CAAC;AAarC;;;GAGG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAajD;AAED,MAAM,WAAW,OAAO;IACvB,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,wDAAwD;IACxD,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IACtC,qEAAqE;IACrE,KAAK,CAAC,GAAG,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/C,6EAA6E;IAC7E,MAAM,IAAI,IAAI,CAAC;CACf;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CA+DrD"}
|
package/dist/stop.js
ADDED
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @runa-cmd/core — Stopping a run (ADR-0033)
|
|
3
|
+
*
|
|
4
|
+
* A signal and a cut channel with the server enter here and go the same way:
|
|
5
|
+
* tell the command, give it a moment, run cleanup, and leave. Nothing in that
|
|
6
|
+
* path depends on the command cooperating, except how fast it ends.
|
|
7
|
+
*/
|
|
8
|
+
import { spawnSync } from 'node:child_process';
|
|
9
|
+
import { InterruptedError } from './errors.js';
|
|
10
|
+
/** How long run() has to end once told to stop. */
|
|
11
|
+
export const RUN_GRACE_MS = 2000;
|
|
12
|
+
/** How long after that notice the process ends anyway, with cleanup or without it. */
|
|
13
|
+
export const STOP_DEADLINE_MS = 5000;
|
|
14
|
+
/** 128 + the signal number. A cancelled tool ends as if it got SIGTERM. */
|
|
15
|
+
const EXIT_CODES = { SIGINT: 130, SIGTERM: 143, cancelled: 143 };
|
|
16
|
+
const STOP_MESSAGES = {
|
|
17
|
+
SIGINT: 'Interrupted.',
|
|
18
|
+
SIGTERM: 'Interrupted.',
|
|
19
|
+
cancelled: 'Cancelled.',
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* End a process and those it started. It reaches the group on Unix, so the
|
|
23
|
+
* process must lead one, and the tree on Windows, where it must still be alive.
|
|
24
|
+
*/
|
|
25
|
+
export function killProcessTree(pid) {
|
|
26
|
+
try {
|
|
27
|
+
if (process.platform === 'win32') {
|
|
28
|
+
spawnSync('taskkill', ['/pid', String(pid), '/T', '/F'], {
|
|
29
|
+
stdio: 'ignore',
|
|
30
|
+
windowsHide: true,
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
process.kill(-pid, 'SIGKILL');
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
// Already gone
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Start listening for a stop.
|
|
43
|
+
*
|
|
44
|
+
* @param isTool - This process leads its own group, and has a server above it
|
|
45
|
+
*/
|
|
46
|
+
export function watchForStop(isTool) {
|
|
47
|
+
const controller = new AbortController();
|
|
48
|
+
let cause;
|
|
49
|
+
let graceOver = () => { };
|
|
50
|
+
const gracePeriod = new Promise((_, reject) => {
|
|
51
|
+
graceOver = reject;
|
|
52
|
+
});
|
|
53
|
+
gracePeriod.catch(() => { }); // Nobody is listening unless a command is running
|
|
54
|
+
const interrupted = () => new InterruptedError(STOP_MESSAGES[cause ?? 'SIGINT']);
|
|
55
|
+
const leave = () => {
|
|
56
|
+
if (isTool)
|
|
57
|
+
killProcessTree(process.pid);
|
|
58
|
+
process.exit(EXIT_CODES[cause ?? 'SIGINT']);
|
|
59
|
+
};
|
|
60
|
+
const stop = (next) => {
|
|
61
|
+
if (cause) {
|
|
62
|
+
leave();
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
cause = next;
|
|
66
|
+
controller.abort(interrupted());
|
|
67
|
+
setTimeout(() => graceOver(interrupted()), RUN_GRACE_MS).unref();
|
|
68
|
+
setTimeout(leave, STOP_DEADLINE_MS).unref();
|
|
69
|
+
};
|
|
70
|
+
const onSigint = () => stop('SIGINT');
|
|
71
|
+
const onSigterm = () => stop('SIGTERM');
|
|
72
|
+
const onDisconnect = () => stop('cancelled');
|
|
73
|
+
process.on('SIGINT', onSigint);
|
|
74
|
+
process.on('SIGTERM', onSigterm);
|
|
75
|
+
if (isTool) {
|
|
76
|
+
process.on('disconnect', onDisconnect);
|
|
77
|
+
// With the server gone, a write finds a closed pipe: that must not end
|
|
78
|
+
// the process before its cleanup does.
|
|
79
|
+
for (const stream of [process.stdout, process.stderr])
|
|
80
|
+
stream.on('error', () => { });
|
|
81
|
+
}
|
|
82
|
+
return {
|
|
83
|
+
signal: controller.signal,
|
|
84
|
+
get exitCode() {
|
|
85
|
+
return cause && EXIT_CODES[cause];
|
|
86
|
+
},
|
|
87
|
+
async guard(run) {
|
|
88
|
+
if (cause)
|
|
89
|
+
throw interrupted();
|
|
90
|
+
try {
|
|
91
|
+
await Promise.race([run(), gracePeriod]);
|
|
92
|
+
}
|
|
93
|
+
catch (error) {
|
|
94
|
+
if (cause)
|
|
95
|
+
throw interrupted();
|
|
96
|
+
throw error;
|
|
97
|
+
}
|
|
98
|
+
if (cause)
|
|
99
|
+
throw interrupted();
|
|
100
|
+
},
|
|
101
|
+
finish() {
|
|
102
|
+
process.off('SIGINT', onSigint);
|
|
103
|
+
process.off('SIGTERM', onSigterm);
|
|
104
|
+
process.off('disconnect', onDisconnect);
|
|
105
|
+
if (cause && isTool)
|
|
106
|
+
killProcessTree(process.pid);
|
|
107
|
+
},
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=stop.js.map
|
package/dist/stop.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stop.js","sourceRoot":"","sources":["../src/stop.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @runa-cmd/core — "Did you mean" suggestion helpers
|
|
3
|
+
*
|
|
4
|
+
* Shared by the command-not-found path (cli.ts) and the unknown-option
|
|
5
|
+
* strict check (parse/strict.ts). Internal module — not exported from
|
|
6
|
+
* the package barrel (index.ts).
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Levenshtein distance for "did you mean" suggestions.
|
|
10
|
+
*/
|
|
11
|
+
export declare function levenshtein(a: string, b: string): number;
|
|
12
|
+
/**
|
|
13
|
+
* Find the best suggestion for a misspelled name, or undefined if none is
|
|
14
|
+
* close. The allowed distance grows with the input, up to 3: on a short name,
|
|
15
|
+
* a distance of 3 means nothing in common, and a wrong suggestion misleads.
|
|
16
|
+
*/
|
|
17
|
+
export declare function findSuggestion(input: string, candidates: string[]): string | undefined;
|
|
18
|
+
//# sourceMappingURL=suggest.d.ts.map
|