@seedcli/core 0.1.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.
Files changed (90) hide show
  1. package/LICENSE +21 -0
  2. package/dist/command/help.d.ts +59 -0
  3. package/dist/command/help.d.ts.map +1 -0
  4. package/dist/command/help.js +216 -0
  5. package/dist/command/help.js.map +1 -0
  6. package/dist/command/parser.d.ts +27 -0
  7. package/dist/command/parser.d.ts.map +1 -0
  8. package/dist/command/parser.js +259 -0
  9. package/dist/command/parser.js.map +1 -0
  10. package/dist/command/router.d.ts +34 -0
  11. package/dist/command/router.d.ts.map +1 -0
  12. package/dist/command/router.js +90 -0
  13. package/dist/command/router.js.map +1 -0
  14. package/dist/discovery/auto-discover.d.ts +26 -0
  15. package/dist/discovery/auto-discover.d.ts.map +1 -0
  16. package/dist/discovery/auto-discover.js +138 -0
  17. package/dist/discovery/auto-discover.js.map +1 -0
  18. package/dist/discovery/index.d.ts +3 -0
  19. package/dist/discovery/index.d.ts.map +1 -0
  20. package/dist/discovery/index.js +2 -0
  21. package/dist/discovery/index.js.map +1 -0
  22. package/dist/index.d.ts +32 -0
  23. package/dist/index.d.ts.map +1 -0
  24. package/dist/index.js +30 -0
  25. package/dist/index.js.map +1 -0
  26. package/dist/plugin/errors.d.ts +23 -0
  27. package/dist/plugin/errors.d.ts.map +1 -0
  28. package/dist/plugin/errors.js +45 -0
  29. package/dist/plugin/errors.js.map +1 -0
  30. package/dist/plugin/index.d.ts +6 -0
  31. package/dist/plugin/index.d.ts.map +1 -0
  32. package/dist/plugin/index.js +6 -0
  33. package/dist/plugin/index.js.map +1 -0
  34. package/dist/plugin/loader.d.ts +12 -0
  35. package/dist/plugin/loader.d.ts.map +1 -0
  36. package/dist/plugin/loader.js +33 -0
  37. package/dist/plugin/loader.js.map +1 -0
  38. package/dist/plugin/registry.d.ts +32 -0
  39. package/dist/plugin/registry.d.ts.map +1 -0
  40. package/dist/plugin/registry.js +101 -0
  41. package/dist/plugin/registry.js.map +1 -0
  42. package/dist/plugin/topo-sort.d.ts +8 -0
  43. package/dist/plugin/topo-sort.d.ts.map +1 -0
  44. package/dist/plugin/topo-sort.js +60 -0
  45. package/dist/plugin/topo-sort.js.map +1 -0
  46. package/dist/plugin/validator.d.ts +17 -0
  47. package/dist/plugin/validator.d.ts.map +1 -0
  48. package/dist/plugin/validator.js +58 -0
  49. package/dist/plugin/validator.js.map +1 -0
  50. package/dist/runtime/builder.d.ts +70 -0
  51. package/dist/runtime/builder.d.ts.map +1 -0
  52. package/dist/runtime/builder.js +108 -0
  53. package/dist/runtime/builder.js.map +1 -0
  54. package/dist/runtime/runtime.d.ts +53 -0
  55. package/dist/runtime/runtime.d.ts.map +1 -0
  56. package/dist/runtime/runtime.js +424 -0
  57. package/dist/runtime/runtime.js.map +1 -0
  58. package/dist/types/args.d.ts +93 -0
  59. package/dist/types/args.d.ts.map +1 -0
  60. package/dist/types/args.js +9 -0
  61. package/dist/types/args.js.map +1 -0
  62. package/dist/types/command.d.ts +60 -0
  63. package/dist/types/command.d.ts.map +1 -0
  64. package/dist/types/command.js +26 -0
  65. package/dist/types/command.js.map +1 -0
  66. package/dist/types/config.d.ts +61 -0
  67. package/dist/types/config.d.ts.map +1 -0
  68. package/dist/types/config.js +17 -0
  69. package/dist/types/config.js.map +1 -0
  70. package/dist/types/extension.d.ts +30 -0
  71. package/dist/types/extension.d.ts.map +1 -0
  72. package/dist/types/extension.js +16 -0
  73. package/dist/types/extension.js.map +1 -0
  74. package/dist/types/index.d.ts +14 -0
  75. package/dist/types/index.d.ts.map +1 -0
  76. package/dist/types/index.js +8 -0
  77. package/dist/types/index.js.map +1 -0
  78. package/dist/types/modules.d.ts +47 -0
  79. package/dist/types/modules.d.ts.map +1 -0
  80. package/dist/types/modules.js +5 -0
  81. package/dist/types/modules.js.map +1 -0
  82. package/dist/types/plugin.d.ts +40 -0
  83. package/dist/types/plugin.d.ts.map +1 -0
  84. package/dist/types/plugin.js +17 -0
  85. package/dist/types/plugin.js.map +1 -0
  86. package/dist/types/toolbox.d.ts +54 -0
  87. package/dist/types/toolbox.d.ts.map +1 -0
  88. package/dist/types/toolbox.js +2 -0
  89. package/dist/types/toolbox.js.map +1 -0
  90. package/package.json +60 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Seed CLI Contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,59 @@
1
+ import type { Command } from "../types/command.js";
2
+ export interface HelpOptions {
3
+ /** Custom header text */
4
+ header?: string;
5
+ /** Show command aliases (default: true) */
6
+ showAliases?: boolean;
7
+ /** Show hidden commands (default: false) */
8
+ showHidden?: boolean;
9
+ /** Alphabetical sort (default: true) */
10
+ sortCommands?: boolean;
11
+ /** CLI brand name */
12
+ brand?: string;
13
+ /** CLI version */
14
+ version?: string;
15
+ }
16
+ /**
17
+ * Generate help text for the entire CLI (global help).
18
+ *
19
+ * Output format:
20
+ * ```
21
+ * mycli v1.0.0
22
+ *
23
+ * USAGE
24
+ * mycli <command> [options]
25
+ *
26
+ * COMMANDS
27
+ * deploy Deploy the application
28
+ * dev Start development mode
29
+ * db Database commands
30
+ *
31
+ * FLAGS
32
+ * --help, -h Show help
33
+ * --version, -v Show version
34
+ * ```
35
+ */
36
+ export declare function renderGlobalHelp(commands: Command[], options?: HelpOptions): string;
37
+ /**
38
+ * Generate help text for a specific command.
39
+ *
40
+ * Output format:
41
+ * ```
42
+ * Deploy the application
43
+ *
44
+ * USAGE
45
+ * mycli deploy <environment> [options]
46
+ *
47
+ * ARGUMENTS
48
+ * environment Target environment (required)
49
+ *
50
+ * FLAGS
51
+ * --force, -f Force deployment (default: false)
52
+ * --replicas, -r <n> Number of replicas
53
+ *
54
+ * SUBCOMMANDS
55
+ * rollback Rollback the deployment
56
+ * ```
57
+ */
58
+ export declare function renderCommandHelp(cmd: Command, options?: HelpOptions): string;
59
+ //# sourceMappingURL=help.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"help.d.ts","sourceRoot":"","sources":["../../src/command/help.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAInD,MAAM,WAAW,WAAW;IAC3B,yBAAyB;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,2CAA2C;IAC3C,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,4CAA4C;IAC5C,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,wCAAwC;IACxC,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,qBAAqB;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kBAAkB;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CACjB;AAID;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,OAAO,GAAE,WAAgB,GAAG,MAAM,CAyDvF;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,GAAE,WAAgB,GAAG,MAAM,CAyEjF"}
@@ -0,0 +1,216 @@
1
+ // ─── Help Renderer ───
2
+ /**
3
+ * Generate help text for the entire CLI (global help).
4
+ *
5
+ * Output format:
6
+ * ```
7
+ * mycli v1.0.0
8
+ *
9
+ * USAGE
10
+ * mycli <command> [options]
11
+ *
12
+ * COMMANDS
13
+ * deploy Deploy the application
14
+ * dev Start development mode
15
+ * db Database commands
16
+ *
17
+ * FLAGS
18
+ * --help, -h Show help
19
+ * --version, -v Show version
20
+ * ```
21
+ */
22
+ export function renderGlobalHelp(commands, options = {}) {
23
+ const { header, showAliases = true, showHidden = false, sortCommands = true, brand = "cli", version, } = options;
24
+ const lines = [];
25
+ // Header
26
+ if (header) {
27
+ lines.push(header);
28
+ }
29
+ else if (version) {
30
+ lines.push(`${brand} v${version}`);
31
+ }
32
+ else {
33
+ lines.push(brand);
34
+ }
35
+ lines.push("");
36
+ // Usage
37
+ lines.push("USAGE");
38
+ lines.push(` ${brand} <command> [options]`);
39
+ lines.push("");
40
+ // Commands
41
+ const visibleCmds = commands.filter((cmd) => showHidden || !cmd.hidden);
42
+ if (sortCommands) {
43
+ visibleCmds.sort((a, b) => a.name.localeCompare(b.name));
44
+ }
45
+ if (visibleCmds.length > 0) {
46
+ lines.push("COMMANDS");
47
+ // Calculate padding for alignment
48
+ const maxNameLen = Math.max(...visibleCmds.map((cmd) => formatCommandName(cmd, showAliases).length));
49
+ for (const cmd of visibleCmds) {
50
+ const name = formatCommandName(cmd, showAliases);
51
+ const padding = " ".repeat(Math.max(2, maxNameLen - name.length + 4));
52
+ const desc = cmd.description ?? "";
53
+ lines.push(` ${name}${padding}${desc}`);
54
+ }
55
+ lines.push("");
56
+ }
57
+ // Global flags
58
+ lines.push("FLAGS");
59
+ lines.push(" --help, -h Show help");
60
+ lines.push(" --version, -v Show version");
61
+ lines.push("");
62
+ return lines.join("\n");
63
+ }
64
+ /**
65
+ * Generate help text for a specific command.
66
+ *
67
+ * Output format:
68
+ * ```
69
+ * Deploy the application
70
+ *
71
+ * USAGE
72
+ * mycli deploy <environment> [options]
73
+ *
74
+ * ARGUMENTS
75
+ * environment Target environment (required)
76
+ *
77
+ * FLAGS
78
+ * --force, -f Force deployment (default: false)
79
+ * --replicas, -r <n> Number of replicas
80
+ *
81
+ * SUBCOMMANDS
82
+ * rollback Rollback the deployment
83
+ * ```
84
+ */
85
+ export function renderCommandHelp(cmd, options = {}) {
86
+ const { brand = "cli", showAliases = true, showHidden = false } = options;
87
+ const lines = [];
88
+ // Description
89
+ if (cmd.description) {
90
+ lines.push(cmd.description);
91
+ lines.push("");
92
+ }
93
+ // Aliases
94
+ if (showAliases && cmd.alias && cmd.alias.length > 0) {
95
+ lines.push(`ALIASES`);
96
+ lines.push(` ${cmd.alias.join(", ")}`);
97
+ lines.push("");
98
+ }
99
+ // Usage line
100
+ lines.push("USAGE");
101
+ lines.push(` ${brand} ${buildUsageLine(cmd)}`);
102
+ lines.push("");
103
+ // Arguments
104
+ const argEntries = Object.entries(cmd.args ?? {});
105
+ if (argEntries.length > 0) {
106
+ lines.push("ARGUMENTS");
107
+ const maxNameLen = Math.max(...argEntries.map(([name]) => name.length));
108
+ for (const [name, def] of argEntries) {
109
+ const padding = " ".repeat(Math.max(2, maxNameLen - name.length + 4));
110
+ const meta = formatArgMeta(def);
111
+ lines.push(` ${name}${padding}${meta}`);
112
+ }
113
+ lines.push("");
114
+ }
115
+ // Flags
116
+ const flagEntries = Object.entries(cmd.flags ?? {}).filter(([, def]) => !def.hidden);
117
+ if (flagEntries.length > 0) {
118
+ lines.push("FLAGS");
119
+ const formattedFlags = flagEntries.map(([name, def]) => ({
120
+ label: formatFlagLabel(name, def),
121
+ meta: formatFlagMeta(def),
122
+ }));
123
+ const maxLabelLen = Math.max(...formattedFlags.map((f) => f.label.length));
124
+ for (const { label, meta } of formattedFlags) {
125
+ const padding = " ".repeat(Math.max(2, maxLabelLen - label.length + 4));
126
+ lines.push(` ${label}${padding}${meta}`);
127
+ }
128
+ lines.push("");
129
+ }
130
+ // Subcommands
131
+ const subcommands = (cmd.subcommands ?? []).filter((sub) => showHidden || !sub.hidden);
132
+ if (subcommands.length > 0) {
133
+ lines.push("SUBCOMMANDS");
134
+ const maxNameLen = Math.max(...subcommands.map((sub) => sub.name.length));
135
+ for (const sub of subcommands) {
136
+ const padding = " ".repeat(Math.max(2, maxNameLen - sub.name.length + 4));
137
+ const desc = sub.description ?? "";
138
+ lines.push(` ${sub.name}${padding}${desc}`);
139
+ }
140
+ lines.push("");
141
+ }
142
+ return lines.join("\n");
143
+ }
144
+ // ─── Formatting Helpers ───
145
+ function formatCommandName(cmd, showAliases) {
146
+ let name = cmd.name;
147
+ if (showAliases && cmd.alias && cmd.alias.length > 0) {
148
+ name += ` (${cmd.alias.join(", ")})`;
149
+ }
150
+ return name;
151
+ }
152
+ function buildUsageLine(cmd) {
153
+ const parts = [cmd.name];
154
+ // Add positional args
155
+ for (const [name, def] of Object.entries(cmd.args ?? {})) {
156
+ if (def.required) {
157
+ parts.push(`<${name}>`);
158
+ }
159
+ else {
160
+ parts.push(`[${name}]`);
161
+ }
162
+ }
163
+ // Add [options] if there are flags
164
+ const flagCount = Object.keys(cmd.flags ?? {}).length;
165
+ if (flagCount > 0) {
166
+ parts.push("[options]");
167
+ }
168
+ return parts.join(" ");
169
+ }
170
+ function formatArgMeta(def) {
171
+ const parts = [];
172
+ if (def.description) {
173
+ parts.push(def.description);
174
+ }
175
+ const argMetaChoices = def.choices;
176
+ if (argMetaChoices && argMetaChoices.length > 0) {
177
+ parts.push(`(${argMetaChoices.join(" | ")})`);
178
+ }
179
+ if (def.required) {
180
+ parts.push("(required)");
181
+ }
182
+ if (def.default !== undefined) {
183
+ parts.push(`(default: ${def.default})`);
184
+ }
185
+ return parts.join(" ");
186
+ }
187
+ function formatFlagLabel(name, def) {
188
+ let label = `--${name}`;
189
+ if (def.alias) {
190
+ label = `-${def.alias}, ${label}`;
191
+ }
192
+ // Add value placeholder
193
+ if (def.type !== "boolean") {
194
+ const placeholder = def.type === "number" || def.type === "number[]" ? "<n>" : "<value>";
195
+ label += ` ${placeholder}`;
196
+ }
197
+ return label;
198
+ }
199
+ function formatFlagMeta(def) {
200
+ const parts = [];
201
+ if (def.description) {
202
+ parts.push(def.description);
203
+ }
204
+ const flagMetaChoices = def.choices;
205
+ if (flagMetaChoices && flagMetaChoices.length > 0) {
206
+ parts.push(`(${flagMetaChoices.join(" | ")})`);
207
+ }
208
+ if (def.required) {
209
+ parts.push("(required)");
210
+ }
211
+ if (def.default !== undefined) {
212
+ parts.push(`(default: ${def.default})`);
213
+ }
214
+ return parts.join(" ");
215
+ }
216
+ //# sourceMappingURL=help.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"help.js","sourceRoot":"","sources":["../../src/command/help.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import type { Command } from "../types/command.js";
2
+ export declare class ParseError extends Error {
3
+ constructor(message: string);
4
+ }
5
+ export interface ParseResult {
6
+ args: Record<string, unknown>;
7
+ flags: Record<string, unknown>;
8
+ command: string | undefined;
9
+ argv: string[];
10
+ raw: string[];
11
+ }
12
+ /**
13
+ * Parse raw argv against a command's arg/flag definitions.
14
+ *
15
+ * Flow:
16
+ * 1. Separate positional args from flags using node:util parseArgs
17
+ * 2. Coerce types (string → number where needed)
18
+ * 3. Apply defaults for missing optional values
19
+ * 4. Validate required, choices, custom validators
20
+ * 5. Return typed { args, flags } object
21
+ */
22
+ export declare function parse(argv: string[], cmd: Command): ParseResult;
23
+ /**
24
+ * Levenshtein distance between two strings.
25
+ */
26
+ export declare function levenshtein(a: string, b: string): number;
27
+ //# sourceMappingURL=parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../src/command/parser.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAInD,qBAAa,UAAW,SAAQ,KAAK;gBACxB,OAAO,EAAE,MAAM;CAI3B;AAID,MAAM,WAAW,WAAW;IAC3B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,GAAG,EAAE,MAAM,EAAE,CAAC;CACd;AAID;;;;;;;;;GASG;AACH,wBAAgB,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,OAAO,GAAG,WAAW,CAqG/D;AAmKD;;GAEG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAuBxD"}
@@ -0,0 +1,259 @@
1
+ import { parseArgs } from "node:util";
2
+ // ─── Error Types ───
3
+ export class ParseError extends Error {
4
+ constructor(message) {
5
+ super(message);
6
+ this.name = "ParseError";
7
+ }
8
+ }
9
+ // ─── Parser ───
10
+ /**
11
+ * Parse raw argv against a command's arg/flag definitions.
12
+ *
13
+ * Flow:
14
+ * 1. Separate positional args from flags using node:util parseArgs
15
+ * 2. Coerce types (string → number where needed)
16
+ * 3. Apply defaults for missing optional values
17
+ * 4. Validate required, choices, custom validators
18
+ * 5. Return typed { args, flags } object
19
+ */
20
+ export function parse(argv, cmd) {
21
+ const argDefs = cmd.args ?? {};
22
+ const flagDefs = cmd.flags ?? {};
23
+ // Build parseArgs options from flag definitions
24
+ const options = {};
25
+ for (const [name, def] of Object.entries(flagDefs)) {
26
+ const flagType = def.type;
27
+ if (flagType === "boolean") {
28
+ options[name] = { type: "boolean" };
29
+ }
30
+ else if (flagType === "string[]" || flagType === "number[]") {
31
+ // Arrays are "string" with multiple: true (we coerce number[] later)
32
+ options[name] = { type: "string", multiple: true };
33
+ }
34
+ else {
35
+ // string, number — parseArgs treats both as "string" (we coerce number later)
36
+ options[name] = { type: "string" };
37
+ }
38
+ if (def.alias) {
39
+ options[name].short = def.alias;
40
+ }
41
+ }
42
+ // Parse with node:util parseArgs
43
+ let parsed;
44
+ try {
45
+ parsed = parseArgs({
46
+ args: argv,
47
+ options,
48
+ strict: true,
49
+ allowPositionals: true,
50
+ });
51
+ }
52
+ catch (err) {
53
+ if (err instanceof Error) {
54
+ throw new ParseError(err.message);
55
+ }
56
+ throw err;
57
+ }
58
+ // ─── Process positional args ───
59
+ const argEntries = Object.entries(argDefs);
60
+ const args = {};
61
+ for (let i = 0; i < argEntries.length; i++) {
62
+ const [name, def] = argEntries[i];
63
+ const raw = parsed.positionals[i];
64
+ if (raw === undefined) {
65
+ if (def.default !== undefined) {
66
+ args[name] = def.default;
67
+ }
68
+ else if (def.required) {
69
+ throw new ParseError(formatMissingArg(name, def, cmd));
70
+ }
71
+ else {
72
+ args[name] = undefined;
73
+ }
74
+ continue;
75
+ }
76
+ args[name] = coerceArgValue(name, raw, def);
77
+ validateArg(name, args[name], def);
78
+ }
79
+ // ─── Process flags ───
80
+ const flags = {};
81
+ for (const [name, def] of Object.entries(flagDefs)) {
82
+ const raw = parsed.values[name];
83
+ if (raw === undefined) {
84
+ if (def.default !== undefined) {
85
+ flags[name] = def.default;
86
+ }
87
+ else if (def.required) {
88
+ throw new ParseError(formatMissingFlag(name, def));
89
+ }
90
+ else {
91
+ flags[name] = undefined;
92
+ }
93
+ continue;
94
+ }
95
+ flags[name] = coerceFlagValue(name, raw, def);
96
+ validateFlag(name, flags[name], def);
97
+ }
98
+ return {
99
+ args,
100
+ flags,
101
+ command: cmd.name,
102
+ argv: parsed.positionals,
103
+ raw: argv,
104
+ };
105
+ }
106
+ // ─── Type Coercion ───
107
+ function coerceArgValue(name, raw, def) {
108
+ if (def.type === "number") {
109
+ const num = Number(raw);
110
+ if (Number.isNaN(num)) {
111
+ throw new ParseError(`Invalid value for argument "${name}"\n\n Expected: number\n Received: "${raw}"`);
112
+ }
113
+ return num;
114
+ }
115
+ return raw;
116
+ }
117
+ function coerceFlagValue(name, raw, def) {
118
+ switch (def.type) {
119
+ case "boolean":
120
+ return raw;
121
+ case "number": {
122
+ const num = Number(raw);
123
+ if (Number.isNaN(num)) {
124
+ throw new ParseError(`Invalid value for flag "--${name}"\n\n Expected: number\n Received: "${raw}"`);
125
+ }
126
+ return num;
127
+ }
128
+ case "string":
129
+ return raw;
130
+ case "string[]":
131
+ if (Array.isArray(raw)) {
132
+ return raw.map(String);
133
+ }
134
+ return [String(raw)];
135
+ case "number[]": {
136
+ const items = Array.isArray(raw) ? raw : [raw];
137
+ return items.map((item) => {
138
+ const num = Number(item);
139
+ if (Number.isNaN(num)) {
140
+ throw new ParseError(`Invalid value for flag "--${name}"\n\n Expected: number[]\n Received item: "${item}"`);
141
+ }
142
+ return num;
143
+ });
144
+ }
145
+ default:
146
+ return raw;
147
+ }
148
+ }
149
+ // ─── Validation ───
150
+ function validateArg(name, value, def) {
151
+ // Choices validation
152
+ const argChoices = def.choices;
153
+ if (argChoices && argChoices.length > 0) {
154
+ if (!argChoices.includes(String(value))) {
155
+ const choicesStr = argChoices.map((c) => `"${c}"`).join(", ");
156
+ const suggestion = findClosest(String(value), argChoices);
157
+ let msg = `Invalid value for argument "${name}"\n\n Expected one of: ${choicesStr}\n Received: "${value}"`;
158
+ if (suggestion) {
159
+ msg += `\n\n Did you mean "${suggestion}"?`;
160
+ }
161
+ throw new ParseError(msg);
162
+ }
163
+ }
164
+ // Custom validator
165
+ if (def.validate) {
166
+ const result = def.validate(value);
167
+ if (result === false) {
168
+ throw new ParseError(`Validation failed for argument "${name}"`);
169
+ }
170
+ if (typeof result === "string") {
171
+ throw new ParseError(`Validation failed for argument "${name}": ${result}`);
172
+ }
173
+ }
174
+ }
175
+ function validateFlag(name, value, def) {
176
+ // Choices validation (only for string flags)
177
+ const flagChoices = def.choices;
178
+ if (flagChoices && flagChoices.length > 0) {
179
+ if (!flagChoices.includes(String(value))) {
180
+ const choicesStr = flagChoices.map((c) => `"${c}"`).join(", ");
181
+ const suggestion = findClosest(String(value), flagChoices);
182
+ let msg = `Invalid value for flag "--${name}"\n\n Expected one of: ${choicesStr}\n Received: "${value}"`;
183
+ if (suggestion) {
184
+ msg += `\n\n Did you mean "${suggestion}"?`;
185
+ }
186
+ throw new ParseError(msg);
187
+ }
188
+ }
189
+ // Custom validator
190
+ if (def.validate) {
191
+ const result = def.validate(value);
192
+ if (result === false) {
193
+ throw new ParseError(`Validation failed for flag "--${name}"`);
194
+ }
195
+ if (typeof result === "string") {
196
+ throw new ParseError(`Validation failed for flag "--${name}": ${result}`);
197
+ }
198
+ }
199
+ }
200
+ // ─── Error Formatting ───
201
+ function formatMissingArg(name, def, cmd) {
202
+ let msg = `Missing required argument "${name}"`;
203
+ if (def.description) {
204
+ msg += `\n\n ${def.description}`;
205
+ }
206
+ const missingArgChoices = def.choices;
207
+ if (missingArgChoices && missingArgChoices.length > 0) {
208
+ msg += `\n Expected one of: ${missingArgChoices.join(", ")}`;
209
+ }
210
+ msg += `\n\n Usage: ${cmd.name} <${name}>`;
211
+ return msg;
212
+ }
213
+ function formatMissingFlag(name, def) {
214
+ let msg = `Missing required flag "--${name}"`;
215
+ if (def.description) {
216
+ msg += `\n\n ${def.description}`;
217
+ }
218
+ return msg;
219
+ }
220
+ // ─── Utilities ───
221
+ /**
222
+ * Find the closest match to `input` from `candidates` using Levenshtein distance.
223
+ * Returns null if no candidate is close enough (distance > 3).
224
+ */
225
+ function findClosest(input, candidates) {
226
+ let bestMatch = null;
227
+ let bestDistance = Number.POSITIVE_INFINITY;
228
+ for (const candidate of candidates) {
229
+ const dist = levenshtein(input.toLowerCase(), candidate.toLowerCase());
230
+ if (dist < bestDistance) {
231
+ bestDistance = dist;
232
+ bestMatch = candidate;
233
+ }
234
+ }
235
+ return bestDistance <= 3 ? bestMatch : null;
236
+ }
237
+ /**
238
+ * Levenshtein distance between two strings.
239
+ */
240
+ export function levenshtein(a, b) {
241
+ const m = a.length;
242
+ const n = b.length;
243
+ // Use a single-row DP approach for space efficiency
244
+ const row = Array.from({ length: n + 1 }, (_, i) => i);
245
+ for (let i = 1; i <= m; i++) {
246
+ let prev = i;
247
+ for (let j = 1; j <= n; j++) {
248
+ const cost = a[i - 1] === b[j - 1] ? 0 : 1;
249
+ const val = Math.min(row[j] + 1, // deletion
250
+ prev + 1, // insertion
251
+ row[j - 1] + cost);
252
+ row[j - 1] = prev;
253
+ prev = val;
254
+ }
255
+ row[n] = prev;
256
+ }
257
+ return row[n];
258
+ }
259
+ //# sourceMappingURL=parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/command/parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import type { Command } from "../types/command.js";
2
+ export interface RouteResult {
3
+ /** The matched command (null if not found) */
4
+ command: Command | null;
5
+ /** Remaining argv after stripping command tokens */
6
+ argv: string[];
7
+ /** Suggestions if command was not found */
8
+ suggestions: CommandSuggestion[];
9
+ }
10
+ export interface CommandSuggestion {
11
+ name: string;
12
+ description?: string;
13
+ distance: number;
14
+ }
15
+ /**
16
+ * Route argv to a registered command.
17
+ *
18
+ * Algorithm:
19
+ * 1. Split argv into tokens
20
+ * 2. Try exact match (including aliases)
21
+ * 3. Try subcommand matching (e.g., ["db", "migrate"] → db.subcommands.migrate)
22
+ * 4. If no match, compute fuzzy suggestions
23
+ * 5. Return { command, argv, suggestions }
24
+ */
25
+ export declare function route(argv: string[], commands: Command[]): RouteResult;
26
+ /**
27
+ * Flatten all commands (including subcommands) into a flat list.
28
+ * Useful for help generation.
29
+ */
30
+ export declare function flattenCommands(commands: Command[], prefix?: string): Array<{
31
+ fullName: string;
32
+ command: Command;
33
+ }>;
34
+ //# sourceMappingURL=router.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../src/command/router.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAKnD,MAAM,WAAW,WAAW;IAC3B,8CAA8C;IAC9C,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IACxB,oDAAoD;IACpD,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,2CAA2C;IAC3C,WAAW,EAAE,iBAAiB,EAAE,CAAC;CACjC;AAED,MAAM,WAAW,iBAAiB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;CACjB;AAID;;;;;;;;;GASG;AACH,wBAAgB,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,WAAW,CA4BtE;AA+CD;;;GAGG;AACH,wBAAgB,eAAe,CAC9B,QAAQ,EAAE,OAAO,EAAE,EACnB,MAAM,SAAK,GACT,KAAK,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC,CAa/C"}