@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.
Files changed (82) hide show
  1. package/README.md +125 -23
  2. package/dist/cli.d.ts +20 -4
  3. package/dist/cli.d.ts.map +1 -1
  4. package/dist/cli.js +392 -143
  5. package/dist/cli.js.map +1 -1
  6. package/dist/errors.d.ts +25 -0
  7. package/dist/errors.d.ts.map +1 -1
  8. package/dist/errors.js +72 -6
  9. package/dist/errors.js.map +1 -1
  10. package/dist/flag-name.d.ts +12 -0
  11. package/dist/flag-name.d.ts.map +1 -0
  12. package/dist/flag-name.js +19 -0
  13. package/dist/flag-name.js.map +1 -0
  14. package/dist/help.d.ts +21 -0
  15. package/dist/help.d.ts.map +1 -0
  16. package/dist/help.js +151 -0
  17. package/dist/help.js.map +1 -0
  18. package/dist/index.d.ts +2 -1
  19. package/dist/index.d.ts.map +1 -1
  20. package/dist/index.js.map +1 -1
  21. package/dist/internal.d.ts +10 -0
  22. package/dist/internal.d.ts.map +1 -0
  23. package/dist/internal.js +9 -0
  24. package/dist/internal.js.map +1 -0
  25. package/dist/introspect.d.ts.map +1 -1
  26. package/dist/introspect.js +10 -3
  27. package/dist/introspect.js.map +1 -1
  28. package/dist/lifecycle.d.ts.map +1 -1
  29. package/dist/lifecycle.js +5 -3
  30. package/dist/lifecycle.js.map +1 -1
  31. package/dist/parse/adapters/zod-v4.d.ts +3 -0
  32. package/dist/parse/adapters/zod-v4.d.ts.map +1 -0
  33. package/dist/parse/adapters/zod-v4.js +106 -0
  34. package/dist/parse/adapters/zod-v4.js.map +1 -0
  35. package/dist/parse/deprecated.d.ts +12 -0
  36. package/dist/parse/deprecated.d.ts.map +1 -0
  37. package/dist/parse/deprecated.js +21 -0
  38. package/dist/parse/deprecated.js.map +1 -0
  39. package/dist/parse/parseargs-bridge.d.ts +10 -0
  40. package/dist/parse/parseargs-bridge.d.ts.map +1 -1
  41. package/dist/parse/parseargs-bridge.js +20 -6
  42. package/dist/parse/parseargs-bridge.js.map +1 -1
  43. package/dist/parse/resolve.d.ts +44 -1
  44. package/dist/parse/resolve.d.ts.map +1 -1
  45. package/dist/parse/resolve.js +151 -73
  46. package/dist/parse/resolve.js.map +1 -1
  47. package/dist/parse/schema-adapter.d.ts +42 -0
  48. package/dist/parse/schema-adapter.d.ts.map +1 -0
  49. package/dist/parse/schema-adapter.js +4 -0
  50. package/dist/parse/schema-adapter.js.map +1 -0
  51. package/dist/parse/schema-walker.d.ts +3 -3
  52. package/dist/parse/schema-walker.d.ts.map +1 -1
  53. package/dist/parse/schema-walker.js +13 -104
  54. package/dist/parse/schema-walker.js.map +1 -1
  55. package/dist/parse/strict.d.ts +52 -0
  56. package/dist/parse/strict.d.ts.map +1 -0
  57. package/dist/parse/strict.js +68 -0
  58. package/dist/parse/strict.js.map +1 -0
  59. package/dist/parse/variadic.d.ts +2 -1
  60. package/dist/parse/variadic.d.ts.map +1 -1
  61. package/dist/parse/variadic.js +4 -24
  62. package/dist/parse/variadic.js.map +1 -1
  63. package/dist/plugin.d.ts +41 -1
  64. package/dist/plugin.d.ts.map +1 -1
  65. package/dist/plugin.js +189 -0
  66. package/dist/plugin.js.map +1 -1
  67. package/dist/stop.d.ts +25 -0
  68. package/dist/stop.d.ts.map +1 -0
  69. package/dist/stop.js +110 -0
  70. package/dist/stop.js.map +1 -0
  71. package/dist/suggest.d.ts +18 -0
  72. package/dist/suggest.d.ts.map +1 -0
  73. package/dist/suggest.js +56 -0
  74. package/dist/suggest.js.map +1 -0
  75. package/dist/tool-channel.d.ts +48 -0
  76. package/dist/tool-channel.d.ts.map +1 -0
  77. package/dist/tool-channel.js +46 -0
  78. package/dist/tool-channel.js.map +1 -0
  79. package/dist/types.d.ts +51 -7
  80. package/dist/types.d.ts.map +1 -1
  81. package/dist/types.js.map +1 -1
  82. 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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"}
@@ -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
- * Unwraps optional/default/nullable wrappers to find the base type.
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;AAsBnC;;;GAGG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAyBnD;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAsCxE"}
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"}
@@ -1,33 +1,13 @@
1
1
  import { RunaError } from '../errors.js';
2
- function getDefType(schema) {
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
- * Unwraps optional/default/nullable wrappers to find the base type.
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
- let current = schema;
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":"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"}
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.
@@ -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;AAEnC,OAAO,KAAK,EACX,SAAS,EAET,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,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;CAC3B;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC9B,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,kBAAkB,GAAG,SAAS,EAC5C,IAAI,EAAE,cAAc,GAClB,SAAS,CAkDX;AAID;;GAEG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAKjG;AAID;;;;GAIG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,CAiBhF"}
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.
@@ -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
@@ -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