@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
@@ -0,0 +1,101 @@
1
+ import { PluginValidationError } from "./errors.js";
2
+ import { validatePeerDependencies, validatePlugin } from "./validator.js";
3
+ /**
4
+ * In-memory registry for loaded and validated plugins.
5
+ */
6
+ export class PluginRegistry {
7
+ plugins = new Map();
8
+ /**
9
+ * Register a plugin after validation.
10
+ * Silently deduplicates if a plugin with the same name is already registered.
11
+ * Validates command and extension name conflicts across all plugins.
12
+ */
13
+ register(plugin) {
14
+ const validated = validatePlugin(plugin);
15
+ // Edge case #11: Duplicate plugin → silently deduplicate
16
+ if (this.plugins.has(validated.name)) {
17
+ return;
18
+ }
19
+ // Edge case #1: Command name/alias conflicts
20
+ if (validated.commands) {
21
+ const existingCommands = this.commands();
22
+ for (const cmd of validated.commands) {
23
+ const conflicting = existingCommands.find((existing) => existing.name === cmd.name ||
24
+ (cmd.alias && existing.alias && cmd.alias.some((a) => existing.alias?.includes(a))));
25
+ if (conflicting) {
26
+ const conflictPlugin = this.findPluginByCommand(conflicting.name);
27
+ throw new PluginValidationError(`Command name conflict: Both "${conflictPlugin}" and "${validated.name}" define a command named "${cmd.name}". Rename one of the commands or use aliases to resolve the conflict.`, validated.name);
28
+ }
29
+ }
30
+ }
31
+ // Edge case #2: Extension name conflicts
32
+ if (validated.extensions) {
33
+ const existingExtensions = this.extensions();
34
+ for (const ext of validated.extensions) {
35
+ const conflicting = existingExtensions.find((existing) => existing.name === ext.name);
36
+ if (conflicting) {
37
+ const conflictPlugin = this.findPluginByExtension(conflicting.name);
38
+ throw new PluginValidationError(`Extension name conflict: Both "${conflictPlugin}" and "${validated.name}" register an extension named "${ext.name}". Each extension must have a unique name.`, validated.name);
39
+ }
40
+ }
41
+ }
42
+ this.plugins.set(validated.name, validated);
43
+ }
44
+ /** Get a plugin by name. */
45
+ get(name) {
46
+ return this.plugins.get(name);
47
+ }
48
+ /** Check if a plugin is registered. */
49
+ has(name) {
50
+ return this.plugins.has(name);
51
+ }
52
+ /** Get all registered plugins. */
53
+ all() {
54
+ return [...this.plugins.values()];
55
+ }
56
+ /** Aggregate all commands from all registered plugins. */
57
+ commands() {
58
+ const cmds = [];
59
+ for (const plugin of this.plugins.values()) {
60
+ if (plugin.commands) {
61
+ cmds.push(...plugin.commands);
62
+ }
63
+ }
64
+ return cmds;
65
+ }
66
+ /** Aggregate all extensions from all registered plugins. */
67
+ extensions() {
68
+ const exts = [];
69
+ for (const plugin of this.plugins.values()) {
70
+ if (plugin.extensions) {
71
+ exts.push(...plugin.extensions);
72
+ }
73
+ }
74
+ return exts;
75
+ }
76
+ /** Validate peer dependencies across all registered plugins. */
77
+ validateAll() {
78
+ for (const plugin of this.plugins.values()) {
79
+ validatePeerDependencies(plugin, this.plugins);
80
+ }
81
+ }
82
+ /** Find which plugin registered a given command name. */
83
+ findPluginByCommand(cmdName) {
84
+ for (const plugin of this.plugins.values()) {
85
+ if (plugin.commands?.some((c) => c.name === cmdName)) {
86
+ return plugin.name;
87
+ }
88
+ }
89
+ return undefined;
90
+ }
91
+ /** Find which plugin registered a given extension name. */
92
+ findPluginByExtension(extName) {
93
+ for (const plugin of this.plugins.values()) {
94
+ if (plugin.extensions?.some((e) => e.name === extName)) {
95
+ return plugin.name;
96
+ }
97
+ }
98
+ return undefined;
99
+ }
100
+ }
101
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/plugin/registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { ExtensionConfig } from "../types/extension.js";
2
+ /**
3
+ * Topologically sort extensions by their dependencies using Kahn's algorithm.
4
+ * Extensions with no dependencies come first.
5
+ * Throws ExtensionCycleError if a circular dependency is detected.
6
+ */
7
+ export declare function topoSort(extensions: ExtensionConfig[]): ExtensionConfig[];
8
+ //# sourceMappingURL=topo-sort.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"topo-sort.d.ts","sourceRoot":"","sources":["../../src/plugin/topo-sort.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAG7D;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,UAAU,EAAE,eAAe,EAAE,GAAG,eAAe,EAAE,CA4DzE"}
@@ -0,0 +1,60 @@
1
+ import { ExtensionCycleError } from "./errors.js";
2
+ /**
3
+ * Topologically sort extensions by their dependencies using Kahn's algorithm.
4
+ * Extensions with no dependencies come first.
5
+ * Throws ExtensionCycleError if a circular dependency is detected.
6
+ */
7
+ export function topoSort(extensions) {
8
+ const byName = new Map();
9
+ for (const ext of extensions) {
10
+ byName.set(ext.name, ext);
11
+ }
12
+ // Build adjacency list and in-degree count
13
+ // Only count dependencies that are in the provided set
14
+ const inDegree = new Map();
15
+ const dependents = new Map(); // dep -> things that depend on it
16
+ for (const ext of extensions) {
17
+ if (!inDegree.has(ext.name)) {
18
+ inDegree.set(ext.name, 0);
19
+ }
20
+ for (const dep of ext.dependencies ?? []) {
21
+ if (byName.has(dep)) {
22
+ inDegree.set(ext.name, (inDegree.get(ext.name) ?? 0) + 1);
23
+ const list = dependents.get(dep) ?? [];
24
+ list.push(ext.name);
25
+ dependents.set(dep, list);
26
+ }
27
+ // deps not in the set are ignored (they may be satisfied externally)
28
+ }
29
+ }
30
+ // Collect nodes with zero in-degree
31
+ const queue = [];
32
+ for (const [name, degree] of inDegree) {
33
+ if (degree === 0) {
34
+ queue.push(name);
35
+ }
36
+ }
37
+ const sorted = [];
38
+ while (queue.length > 0) {
39
+ // biome-ignore lint/style/noNonNullAssertion: queue.length > 0 guarantees shift() returns a value
40
+ const name = queue.shift();
41
+ // biome-ignore lint/style/noNonNullAssertion: name was inserted from byName keys
42
+ const ext = byName.get(name);
43
+ sorted.push(ext);
44
+ for (const dependent of dependents.get(name) ?? []) {
45
+ const newDegree = (inDegree.get(dependent) ?? 1) - 1;
46
+ inDegree.set(dependent, newDegree);
47
+ if (newDegree === 0) {
48
+ queue.push(dependent);
49
+ }
50
+ }
51
+ }
52
+ if (sorted.length !== extensions.length) {
53
+ const remaining = extensions
54
+ .filter((e) => !sorted.some((s) => s.name === e.name))
55
+ .map((e) => e.name);
56
+ throw new ExtensionCycleError(remaining);
57
+ }
58
+ return sorted;
59
+ }
60
+ //# sourceMappingURL=topo-sort.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"topo-sort.js","sourceRoot":"","sources":["../../src/plugin/topo-sort.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { PluginConfig } from "../types/plugin.js";
2
+ /**
3
+ * Validate a plugin configuration object.
4
+ * Throws PluginValidationError if the config is invalid.
5
+ */
6
+ export declare function validatePlugin(config: unknown): PluginConfig;
7
+ /**
8
+ * Validate that a plugin's seedcli version requirement is satisfied.
9
+ * Throws PluginValidationError if the running version doesn't satisfy the constraint.
10
+ */
11
+ export declare function validateSeedcliVersion(plugin: PluginConfig, runtimeVersion: string): void;
12
+ /**
13
+ * Validate that a plugin's peer dependencies are satisfied by the loaded plugins.
14
+ * Throws PluginDependencyError if a peer is missing or incompatible.
15
+ */
16
+ export declare function validatePeerDependencies(plugin: PluginConfig, loaded: Map<string, PluginConfig>): void;
17
+ //# sourceMappingURL=validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validator.d.ts","sourceRoot":"","sources":["../../src/plugin/validator.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAKvD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,OAAO,GAAG,YAAY,CAqC5D;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,GAAG,IAAI,CASzF;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CACvC,MAAM,EAAE,YAAY,EACpB,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,GAC/B,IAAI,CAsBN"}
@@ -0,0 +1,58 @@
1
+ import { satisfies, valid } from "@seedcli/semver";
2
+ import { PluginDependencyError, PluginValidationError } from "./errors.js";
3
+ const NAME_PATTERN = /^[a-z0-9][a-z0-9-]*$/;
4
+ /**
5
+ * Validate a plugin configuration object.
6
+ * Throws PluginValidationError if the config is invalid.
7
+ */
8
+ export function validatePlugin(config) {
9
+ if (!config || typeof config !== "object") {
10
+ throw new PluginValidationError("Plugin config must be a non-null object", "unknown");
11
+ }
12
+ const c = config;
13
+ if (typeof c.name !== "string" || c.name.length === 0) {
14
+ throw new PluginValidationError("Plugin must have a non-empty string 'name'.\n\nA valid plugin must export a definePlugin() result:\n\n export default definePlugin({\n name: \"my-plugin\",\n commands: [...],\n });", String(c.name ?? "unknown"));
15
+ }
16
+ if (!NAME_PATTERN.test(c.name)) {
17
+ throw new PluginValidationError(`Plugin name "${c.name}" is invalid. Must be lowercase alphanumeric and hyphens, cannot start with hyphen.`, c.name);
18
+ }
19
+ if (typeof c.version !== "string" || !valid(c.version)) {
20
+ throw new PluginValidationError(`Plugin "${c.name}" has invalid version "${String(c.version)}". Must be valid semver.`, c.name);
21
+ }
22
+ if (c.commands !== undefined && !Array.isArray(c.commands)) {
23
+ throw new PluginValidationError(`Plugin "${c.name}" commands must be an array`, c.name);
24
+ }
25
+ if (c.extensions !== undefined && !Array.isArray(c.extensions)) {
26
+ throw new PluginValidationError(`Plugin "${c.name}" extensions must be an array`, c.name);
27
+ }
28
+ return config;
29
+ }
30
+ /**
31
+ * Validate that a plugin's seedcli version requirement is satisfied.
32
+ * Throws PluginValidationError if the running version doesn't satisfy the constraint.
33
+ */
34
+ export function validateSeedcliVersion(plugin, runtimeVersion) {
35
+ if (!plugin.seedcli)
36
+ return;
37
+ if (!satisfies(runtimeVersion, plugin.seedcli)) {
38
+ throw new PluginValidationError(`Plugin "${plugin.name}" requires Seed CLI ${plugin.seedcli}\n\n Current Seed CLI version: ${runtimeVersion}\n Required by plugin: ${plugin.seedcli}\n\n Upgrade Seed CLI:\n bun update @seedcli/core`, plugin.name);
39
+ }
40
+ }
41
+ /**
42
+ * Validate that a plugin's peer dependencies are satisfied by the loaded plugins.
43
+ * Throws PluginDependencyError if a peer is missing or incompatible.
44
+ */
45
+ export function validatePeerDependencies(plugin, loaded) {
46
+ if (!plugin.peerPlugins)
47
+ return;
48
+ for (const [peerName, versionRange] of Object.entries(plugin.peerPlugins)) {
49
+ const peer = loaded.get(peerName);
50
+ if (!peer) {
51
+ throw new PluginDependencyError(`Plugin "${plugin.name}" requires peer plugin "${peerName}" but it is not loaded.\n\n Install the required plugin:\n bun add @mycli/plugin-${peerName}`, plugin.name, peerName);
52
+ }
53
+ if (!satisfies(peer.version, versionRange)) {
54
+ throw new PluginDependencyError(`Plugin "${plugin.name}" requires "${peerName}@${versionRange}" but found "${peer.version}".\n\n Upgrade the plugin:\n bun update @mycli/plugin-${peerName}`, plugin.name, peerName);
55
+ }
56
+ }
57
+ }
58
+ //# sourceMappingURL=validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validator.js","sourceRoot":"","sources":["../../src/plugin/validator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,70 @@
1
+ import type { HelpOptions } from "../command/help.js";
2
+ import type { Command, Middleware } from "../types/command.js";
3
+ import type { ExtensionConfig } from "../types/extension.js";
4
+ import type { PluginConfig } from "../types/plugin.js";
5
+ import { Runtime } from "./runtime.js";
6
+ export interface PluginScanOptions {
7
+ matching?: string;
8
+ }
9
+ export interface ConfigOptions {
10
+ configName?: string;
11
+ defaults?: Record<string, unknown>;
12
+ cwd?: string;
13
+ }
14
+ export interface BuilderConfig {
15
+ brand: string;
16
+ version?: string;
17
+ commands: Command[];
18
+ defaultCommand?: Command;
19
+ middleware: Middleware[];
20
+ extensions: ExtensionConfig[];
21
+ plugins: Array<string | PluginConfig>;
22
+ pluginDirs: Array<{
23
+ dir: string;
24
+ options?: PluginScanOptions;
25
+ }>;
26
+ srcDir?: string;
27
+ excludeModules?: string[];
28
+ configOptions?: ConfigOptions;
29
+ helpOptions?: HelpOptions;
30
+ helpEnabled: boolean;
31
+ versionEnabled: boolean;
32
+ completionsEnabled: boolean;
33
+ onReady?: (toolbox: unknown) => Promise<void> | void;
34
+ onError?: (error: Error, toolbox: unknown) => Promise<void> | void;
35
+ }
36
+ export declare class Builder {
37
+ private cfg;
38
+ constructor(brand: string);
39
+ command(cmd: Command): this;
40
+ commands(cmds: Command[]): this;
41
+ defaultCommand(cmd: Command): this;
42
+ middleware(fn: Middleware): this;
43
+ extension(ext: ExtensionConfig): this;
44
+ plugin(source: string | string[] | PluginConfig): this;
45
+ plugins(dir: string, options?: PluginScanOptions): this;
46
+ src(dir: string): this;
47
+ exclude(modules: string[]): this;
48
+ config(options?: ConfigOptions): this;
49
+ help(options?: HelpOptions): this;
50
+ version(version?: string): this;
51
+ completions(): this;
52
+ onReady(fn: (toolbox: unknown) => Promise<void> | void): this;
53
+ onError(fn: (error: Error, toolbox: unknown) => Promise<void> | void): this;
54
+ create(): Runtime;
55
+ }
56
+ /**
57
+ * Create a new CLI builder.
58
+ *
59
+ * ```ts
60
+ * const cli = build("mycli")
61
+ * .command(helloCommand)
62
+ * .help()
63
+ * .version("1.0.0")
64
+ * .create();
65
+ *
66
+ * await cli.run();
67
+ * ```
68
+ */
69
+ export declare function build(brand: string): Builder;
70
+ //# sourceMappingURL=builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../../src/runtime/builder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,108 @@
1
+ import { Runtime } from "./runtime.js";
2
+ // ─── Builder ───
3
+ export class Builder {
4
+ cfg;
5
+ constructor(brand) {
6
+ this.cfg = {
7
+ brand,
8
+ commands: [],
9
+ middleware: [],
10
+ extensions: [],
11
+ plugins: [],
12
+ pluginDirs: [],
13
+ helpEnabled: false,
14
+ versionEnabled: false,
15
+ completionsEnabled: false,
16
+ };
17
+ }
18
+ command(cmd) {
19
+ this.cfg.commands.push(cmd);
20
+ return this;
21
+ }
22
+ commands(cmds) {
23
+ this.cfg.commands.push(...cmds);
24
+ return this;
25
+ }
26
+ defaultCommand(cmd) {
27
+ this.cfg.defaultCommand = cmd;
28
+ return this;
29
+ }
30
+ middleware(fn) {
31
+ this.cfg.middleware.push(fn);
32
+ return this;
33
+ }
34
+ extension(ext) {
35
+ this.cfg.extensions.push(ext);
36
+ return this;
37
+ }
38
+ plugin(source) {
39
+ if (Array.isArray(source)) {
40
+ this.cfg.plugins.push(...source);
41
+ }
42
+ else {
43
+ this.cfg.plugins.push(source);
44
+ }
45
+ return this;
46
+ }
47
+ plugins(dir, options) {
48
+ this.cfg.pluginDirs.push({ dir, options });
49
+ return this;
50
+ }
51
+ src(dir) {
52
+ this.cfg.srcDir = dir;
53
+ return this;
54
+ }
55
+ exclude(modules) {
56
+ this.cfg.excludeModules = modules;
57
+ return this;
58
+ }
59
+ config(options) {
60
+ this.cfg.configOptions = options;
61
+ return this;
62
+ }
63
+ help(options) {
64
+ this.cfg.helpEnabled = true;
65
+ this.cfg.helpOptions = options;
66
+ return this;
67
+ }
68
+ version(version) {
69
+ this.cfg.versionEnabled = true;
70
+ if (version) {
71
+ this.cfg.version = version;
72
+ }
73
+ return this;
74
+ }
75
+ completions() {
76
+ this.cfg.completionsEnabled = true;
77
+ return this;
78
+ }
79
+ onReady(fn) {
80
+ this.cfg.onReady = fn;
81
+ return this;
82
+ }
83
+ onError(fn) {
84
+ this.cfg.onError = fn;
85
+ return this;
86
+ }
87
+ create() {
88
+ return new Runtime(this.cfg);
89
+ }
90
+ }
91
+ // ─── Public API ───
92
+ /**
93
+ * Create a new CLI builder.
94
+ *
95
+ * ```ts
96
+ * const cli = build("mycli")
97
+ * .command(helloCommand)
98
+ * .help()
99
+ * .version("1.0.0")
100
+ * .create();
101
+ *
102
+ * await cli.run();
103
+ * ```
104
+ */
105
+ export function build(brand) {
106
+ return new Builder(brand);
107
+ }
108
+ //# sourceMappingURL=builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builder.js","sourceRoot":"","sources":["../../src/runtime/builder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ import type { Command } from "../types/command.js";
2
+ import type { BuilderConfig } from "./builder.js";
3
+ /**
4
+ * Quick-start config for the `run()` convenience function.
5
+ */
6
+ export interface RunConfig {
7
+ name: string;
8
+ version?: string;
9
+ commands: Command[];
10
+ defaultCommand?: Command;
11
+ }
12
+ /**
13
+ * Quick-start function for simple CLIs without the builder pattern.
14
+ *
15
+ * ```ts
16
+ * import { run } from "@seedcli/core";
17
+ *
18
+ * await run({
19
+ * name: "mycli",
20
+ * version: "1.0.0",
21
+ * commands: [hello, deploy],
22
+ * });
23
+ * ```
24
+ */
25
+ export declare function run(config: RunConfig): Promise<void>;
26
+ /**
27
+ * The CLI runtime — executes the full lifecycle:
28
+ * 1. Load and validate plugins
29
+ * 2. Parse argv
30
+ * 3. Route to command
31
+ * 4. Run extensions setup (topological order)
32
+ * 5. Execute middleware chain
33
+ * 6. Run command handler
34
+ * 7. Run extensions teardown (reverse order)
35
+ */
36
+ export declare class Runtime {
37
+ private config;
38
+ private registry;
39
+ private initialized;
40
+ constructor(config: BuilderConfig);
41
+ run(argv?: string[]): Promise<void>;
42
+ private initPlugins;
43
+ private scanPluginDir;
44
+ private executeCommand;
45
+ private runExtensionSetup;
46
+ private runMiddleware;
47
+ private assembleToolbox;
48
+ private extractCompletionInfo;
49
+ private createCompletionsCommand;
50
+ private printGlobalHelp;
51
+ private handleError;
52
+ }
53
+ //# sourceMappingURL=runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/runtime/runtime.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAGnD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAElD;;GAEG;AACH,MAAM,WAAW,SAAS;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,cAAc,CAAC,EAAE,OAAO,CAAC;CACzB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,GAAG,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAU1D;AAID;;;;;;;;;GASG;AACH,qBAAa,OAAO;IACnB,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,QAAQ,CAAwB;IACxC,OAAO,CAAC,WAAW,CAAS;gBAEhB,MAAM,EAAE,aAAa;IAI3B,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;YA2E3B,WAAW;YAwDX,aAAa;YAsBb,cAAc;YAoDd,iBAAiB;YAqBjB,aAAa;IAmB3B,OAAO,CAAC,eAAe;IAwEvB,OAAO,CAAC,qBAAqB;IA0C7B,OAAO,CAAC,wBAAwB;IAmDhC,OAAO,CAAC,eAAe;YAST,WAAW;CAiBzB"}