incur 0.0.0 → 0.0.2

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 (120) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +141 -0
  3. package/SKILL.md +664 -0
  4. package/dist/Cli.d.ts +255 -0
  5. package/dist/Cli.d.ts.map +1 -0
  6. package/dist/Cli.js +900 -0
  7. package/dist/Cli.js.map +1 -0
  8. package/dist/Errors.d.ts +92 -0
  9. package/dist/Errors.d.ts.map +1 -0
  10. package/dist/Errors.js +75 -0
  11. package/dist/Errors.js.map +1 -0
  12. package/dist/Formatter.d.ts +5 -0
  13. package/dist/Formatter.d.ts.map +1 -0
  14. package/dist/Formatter.js +91 -0
  15. package/dist/Formatter.js.map +1 -0
  16. package/dist/Help.d.ts +53 -0
  17. package/dist/Help.d.ts.map +1 -0
  18. package/dist/Help.js +231 -0
  19. package/dist/Help.js.map +1 -0
  20. package/dist/Mcp.d.ts +13 -0
  21. package/dist/Mcp.d.ts.map +1 -0
  22. package/dist/Mcp.js +140 -0
  23. package/dist/Mcp.js.map +1 -0
  24. package/dist/Parser.d.ts +24 -0
  25. package/dist/Parser.d.ts.map +1 -0
  26. package/dist/Parser.js +215 -0
  27. package/dist/Parser.js.map +1 -0
  28. package/dist/Register.d.ts +19 -0
  29. package/dist/Register.d.ts.map +1 -0
  30. package/dist/Register.js +2 -0
  31. package/dist/Register.js.map +1 -0
  32. package/dist/Schema.d.ts +4 -0
  33. package/dist/Schema.d.ts.map +1 -0
  34. package/dist/Schema.js +8 -0
  35. package/dist/Schema.js.map +1 -0
  36. package/dist/Skill.d.ts +29 -0
  37. package/dist/Skill.d.ts.map +1 -0
  38. package/dist/Skill.js +196 -0
  39. package/dist/Skill.js.map +1 -0
  40. package/dist/Skillgen.d.ts +3 -0
  41. package/dist/Skillgen.d.ts.map +1 -0
  42. package/dist/Skillgen.js +67 -0
  43. package/dist/Skillgen.js.map +1 -0
  44. package/dist/SyncMcp.d.ts +23 -0
  45. package/dist/SyncMcp.d.ts.map +1 -0
  46. package/dist/SyncMcp.js +100 -0
  47. package/dist/SyncMcp.js.map +1 -0
  48. package/dist/SyncSkills.d.ts +38 -0
  49. package/dist/SyncSkills.d.ts.map +1 -0
  50. package/dist/SyncSkills.js +163 -0
  51. package/dist/SyncSkills.js.map +1 -0
  52. package/dist/Typegen.d.ts +6 -0
  53. package/dist/Typegen.d.ts.map +1 -0
  54. package/dist/Typegen.js +92 -0
  55. package/dist/Typegen.js.map +1 -0
  56. package/dist/bin.d.ts +14 -0
  57. package/dist/bin.d.ts.map +1 -0
  58. package/dist/bin.js +30 -0
  59. package/dist/bin.js.map +1 -0
  60. package/dist/index.d.ts +15 -0
  61. package/dist/index.d.ts.map +1 -0
  62. package/dist/index.js +14 -0
  63. package/dist/index.js.map +1 -0
  64. package/dist/internal/pm.d.ts +3 -0
  65. package/dist/internal/pm.d.ts.map +1 -0
  66. package/dist/internal/pm.js +11 -0
  67. package/dist/internal/pm.js.map +1 -0
  68. package/dist/internal/types.d.ts +11 -0
  69. package/dist/internal/types.d.ts.map +1 -0
  70. package/dist/internal/types.js +2 -0
  71. package/dist/internal/types.js.map +1 -0
  72. package/dist/internal/utils.d.ts +8 -0
  73. package/dist/internal/utils.d.ts.map +1 -0
  74. package/dist/internal/utils.js +51 -0
  75. package/dist/internal/utils.js.map +1 -0
  76. package/examples/npm/cli.ts +180 -0
  77. package/examples/npm/node_modules/.bin/incur.src +21 -0
  78. package/examples/npm/node_modules/.bin/tsx +21 -0
  79. package/examples/npm/package.json +14 -0
  80. package/examples/npm/tsconfig.json +9 -0
  81. package/examples/presto/cli.ts +246 -0
  82. package/examples/presto/node_modules/.bin/incur.src +21 -0
  83. package/examples/presto/node_modules/.bin/tsx +21 -0
  84. package/examples/presto/package.json +14 -0
  85. package/examples/presto/tsconfig.json +9 -0
  86. package/package.json +53 -2
  87. package/src/Cli.test-d.ts +135 -0
  88. package/src/Cli.test.ts +1373 -0
  89. package/src/Cli.ts +1470 -0
  90. package/src/Errors.test.ts +96 -0
  91. package/src/Errors.ts +139 -0
  92. package/src/Formatter.test.ts +245 -0
  93. package/src/Formatter.ts +106 -0
  94. package/src/Help.test.ts +124 -0
  95. package/src/Help.ts +302 -0
  96. package/src/Mcp.test.ts +254 -0
  97. package/src/Mcp.ts +195 -0
  98. package/src/Parser.test-d.ts +45 -0
  99. package/src/Parser.test.ts +118 -0
  100. package/src/Parser.ts +247 -0
  101. package/src/Register.ts +18 -0
  102. package/src/Schema.test.ts +125 -0
  103. package/src/Schema.ts +8 -0
  104. package/src/Skill.test.ts +293 -0
  105. package/src/Skill.ts +253 -0
  106. package/src/Skillgen.ts +66 -0
  107. package/src/SyncMcp.test.ts +75 -0
  108. package/src/SyncMcp.ts +132 -0
  109. package/src/SyncSkills.test.ts +92 -0
  110. package/src/SyncSkills.ts +205 -0
  111. package/src/Typegen.test.ts +150 -0
  112. package/src/Typegen.ts +107 -0
  113. package/src/bin.ts +33 -0
  114. package/src/e2e.test.ts +1710 -0
  115. package/src/index.ts +14 -0
  116. package/src/internal/pm.test.ts +38 -0
  117. package/src/internal/pm.ts +8 -0
  118. package/src/internal/types.ts +22 -0
  119. package/src/internal/utils.ts +50 -0
  120. package/src/tsconfig.json +8 -0
package/dist/Help.js ADDED
@@ -0,0 +1,231 @@
1
+ import { z } from 'zod';
2
+ /** Formats help text for a router CLI or command group. */
3
+ export function formatRoot(name, options = {}) {
4
+ const { description, version, commands = [], root = false } = options;
5
+ const lines = [];
6
+ // Header
7
+ lines.push(description ? `${name} \u2014 ${description}` : name);
8
+ if (version)
9
+ lines.push(`v${version}`);
10
+ lines.push('');
11
+ // Synopsis
12
+ lines.push(`Usage: ${name} <command>`);
13
+ // Commands
14
+ if (commands.length > 0) {
15
+ lines.push('');
16
+ lines.push('Commands:');
17
+ const maxLen = Math.max(...commands.map((c) => c.name.length));
18
+ for (const cmd of commands) {
19
+ if (cmd.description) {
20
+ const padding = ' '.repeat(maxLen - cmd.name.length);
21
+ lines.push(` ${cmd.name}${padding} ${cmd.description}`);
22
+ }
23
+ else
24
+ lines.push(` ${cmd.name}`);
25
+ }
26
+ }
27
+ lines.push(...globalOptionsLines(root));
28
+ return lines.join('\n');
29
+ }
30
+ /** Formats help text for a leaf command. */
31
+ export function formatCommand(name, options = {}) {
32
+ const { alias, description, version, args, env, hint, root = false, options: opts, examples, } = options;
33
+ const lines = [];
34
+ // Header
35
+ lines.push(description ? `${name} \u2014 ${description}` : name);
36
+ if (version)
37
+ lines.push(`v${version}`);
38
+ lines.push('');
39
+ // Synopsis
40
+ const { usage } = options;
41
+ if (usage && usage.length > 0) {
42
+ const usageLines = usage.map((u) => {
43
+ const parts = [];
44
+ if (u.prefix)
45
+ parts.push(u.prefix);
46
+ parts.push(name);
47
+ if (u.args)
48
+ for (const key of Object.keys(u.args))
49
+ parts.push(`<${key}>`);
50
+ if (u.options)
51
+ for (const key of Object.keys(u.options))
52
+ parts.push(`--${key} <${key}>`);
53
+ if (u.suffix)
54
+ parts.push(u.suffix);
55
+ return parts.join(' ');
56
+ });
57
+ const pad = ' '.repeat('Usage: '.length);
58
+ lines.push(`Usage: ${usageLines[0]}`);
59
+ for (const line of usageLines.slice(1))
60
+ lines.push(`${pad}${line}`);
61
+ }
62
+ else {
63
+ const synopsis = buildSynopsis(name, args);
64
+ lines.push(`Usage: ${synopsis}${opts ? ' [options]' : ''}`);
65
+ }
66
+ // Arguments
67
+ if (args) {
68
+ const entries = argsEntries(args);
69
+ if (entries.length > 0) {
70
+ lines.push('');
71
+ lines.push('Arguments:');
72
+ const maxLen = Math.max(...entries.map((e) => e.name.length));
73
+ for (const entry of entries)
74
+ lines.push(` ${entry.name}${' '.repeat(maxLen - entry.name.length)} ${entry.description}`);
75
+ }
76
+ }
77
+ // Options
78
+ if (opts) {
79
+ const entries = optionEntries(opts, alias);
80
+ if (entries.length > 0) {
81
+ lines.push('');
82
+ lines.push('Options:');
83
+ const maxLen = Math.max(...entries.map((e) => e.flag.length));
84
+ for (const entry of entries) {
85
+ const padding = ' '.repeat(maxLen - entry.flag.length);
86
+ const desc = entry.defaultValue !== undefined
87
+ ? `${entry.description} (default: ${entry.defaultValue})`
88
+ : entry.description;
89
+ lines.push(` ${entry.flag}${padding} ${desc}`);
90
+ }
91
+ }
92
+ }
93
+ // Environment Variables
94
+ if (env) {
95
+ const entries = envEntries(env);
96
+ if (entries.length > 0) {
97
+ lines.push('');
98
+ lines.push('Environment Variables:');
99
+ const maxLen = Math.max(...entries.map((e) => e.name.length));
100
+ for (const entry of entries) {
101
+ const padding = ' '.repeat(maxLen - entry.name.length);
102
+ const desc = entry.defaultValue !== undefined
103
+ ? `${entry.description} (default: ${entry.defaultValue})`
104
+ : entry.description;
105
+ lines.push(` ${entry.name}${padding} ${desc}`);
106
+ }
107
+ }
108
+ }
109
+ // Examples
110
+ if (examples && examples.length > 0) {
111
+ lines.push('');
112
+ lines.push('Examples:');
113
+ const maxLen = Math.max(...examples.map((e) => (e.command ? `$ ${name} ${e.command}` : `$ ${name}`).length));
114
+ for (const ex of examples) {
115
+ const cmd = ex.command ? `$ ${name} ${ex.command}` : `$ ${name}`;
116
+ if (ex.description)
117
+ lines.push(` ${cmd}${' '.repeat(maxLen - cmd.length)} ${ex.description}`);
118
+ else
119
+ lines.push(` ${cmd}`);
120
+ }
121
+ }
122
+ // Hint
123
+ if (hint) {
124
+ lines.push('');
125
+ lines.push(hint);
126
+ }
127
+ lines.push(...globalOptionsLines(root));
128
+ return lines.join('\n');
129
+ }
130
+ /** Builds the synopsis string with `<required>` and `[optional]` placeholders. */
131
+ function buildSynopsis(name, args) {
132
+ if (!args)
133
+ return name;
134
+ const parts = [name];
135
+ for (const [key, schema] of Object.entries(args.shape))
136
+ parts.push(schema.isOptional() ? `[${key}]` : `<${key}>`);
137
+ return parts.join(' ');
138
+ }
139
+ /** Extracts arg entries from a Zod object schema. */
140
+ function argsEntries(schema) {
141
+ const entries = [];
142
+ for (const [key, field] of Object.entries(schema.shape))
143
+ entries.push({ name: key, description: field.description ?? '' });
144
+ return entries;
145
+ }
146
+ /** Extracts env var entries from a Zod object schema. */
147
+ function envEntries(schema) {
148
+ const entries = [];
149
+ for (const [key, field] of Object.entries(schema.shape)) {
150
+ const defaultValue = extractDefault(field);
151
+ entries.push({ name: key, description: field.description ?? '', defaultValue });
152
+ }
153
+ return entries;
154
+ }
155
+ /** Extracts option entries from a Zod object schema. */
156
+ function optionEntries(schema, alias) {
157
+ const entries = [];
158
+ for (const [key, field] of Object.entries(schema.shape)) {
159
+ const type = resolveTypeName(field);
160
+ const short = alias?.[key];
161
+ const kebab = toKebab(key);
162
+ const flag = short ? `--${kebab}, -${short} <${type}>` : `--${kebab} <${type}>`;
163
+ const defaultValue = extractDefault(field);
164
+ entries.push({ flag, description: field.description ?? '', defaultValue });
165
+ }
166
+ return entries;
167
+ }
168
+ /** Resolves a human-readable type name from a Zod schema. */
169
+ function resolveTypeName(schema) {
170
+ const unwrapped = unwrap(schema);
171
+ if (unwrapped instanceof z.ZodString)
172
+ return 'string';
173
+ if (unwrapped instanceof z.ZodNumber)
174
+ return 'number';
175
+ if (unwrapped instanceof z.ZodBoolean)
176
+ return 'boolean';
177
+ if (unwrapped instanceof z.ZodArray)
178
+ return 'array';
179
+ return 'value';
180
+ }
181
+ /** Unwraps optional/default/nullable wrappers to get the inner type. */
182
+ function unwrap(schema) {
183
+ if (schema instanceof z.ZodOptional)
184
+ return unwrap(schema.unwrap());
185
+ if (schema instanceof z.ZodDefault)
186
+ return unwrap(schema.removeDefault());
187
+ if (schema instanceof z.ZodNullable)
188
+ return unwrap(schema.unwrap());
189
+ return schema;
190
+ }
191
+ /** Extracts the default value from a Zod schema, if any. */
192
+ function extractDefault(schema) {
193
+ if (schema instanceof z.ZodDefault) {
194
+ const raw = schema._def.defaultValue;
195
+ const value = typeof raw === 'function' ? raw() : raw;
196
+ if (Array.isArray(value) && value.length === 0)
197
+ return undefined;
198
+ return value;
199
+ }
200
+ if (schema instanceof z.ZodOptional)
201
+ return extractDefault(schema.unwrap());
202
+ return undefined;
203
+ }
204
+ /** Converts a camelCase string to kebab-case. */
205
+ function toKebab(str) {
206
+ return str.replace(/[A-Z]/g, (c) => `-${c.toLowerCase()}`);
207
+ }
208
+ /** Renders the built-in commands and global options block. Root-only items are hidden for subcommands. */
209
+ function globalOptionsLines(root = false) {
210
+ const lines = [];
211
+ if (root) {
212
+ const builtins = [
213
+ { name: 'mcp add', desc: 'Register as an MCP server' },
214
+ { name: 'skills add', desc: 'Sync skill files to your agent' },
215
+ ];
216
+ const maxCmd = Math.max(...builtins.map((b) => b.name.length));
217
+ lines.push('', 'Built-in Commands:', ...builtins.map((b) => ` ${b.name}${' '.repeat(maxCmd - b.name.length)} ${b.desc}`));
218
+ }
219
+ const flags = [
220
+ { flag: '--format <toon|json|yaml|md|jsonl>', desc: 'Output format' },
221
+ { flag: '--help', desc: 'Show help' },
222
+ { flag: '--llms', desc: 'Print LLM-readable manifest' },
223
+ ...(root ? [{ flag: '--mcp', desc: 'Start as MCP stdio server' }] : []),
224
+ { flag: '--verbose', desc: 'Show full output envelope' },
225
+ ...(root ? [{ flag: '--version', desc: 'Show version' }] : []),
226
+ ];
227
+ const maxLen = Math.max(...flags.map((f) => f.flag.length));
228
+ lines.push('', 'Global Options:', ...flags.map((f) => ` ${f.flag}${' '.repeat(maxLen - f.flag.length)} ${f.desc}`));
229
+ return lines;
230
+ }
231
+ //# sourceMappingURL=Help.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Help.js","sourceRoot":"","sources":["../src/Help.ts"],"names":[],"mappings":"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"}
package/dist/Mcp.d.ts ADDED
@@ -0,0 +1,13 @@
1
+ import type { Readable, Writable } from 'node:stream';
2
+ /** Starts a stdio MCP server that exposes commands as tools. */
3
+ export declare function serve(name: string, version: string, commands: Map<string, any>, options?: serve.Options): Promise<void>;
4
+ export declare namespace serve {
5
+ /** Options for the MCP server. */
6
+ type Options = {
7
+ /** Override input stream. Defaults to `process.stdin`. */
8
+ input?: Readable | undefined;
9
+ /** Override output stream. Defaults to `process.stdout`. */
10
+ output?: Writable | undefined;
11
+ };
12
+ }
13
+ //# sourceMappingURL=Mcp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Mcp.d.ts","sourceRoot":"","sources":["../src/Mcp.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAIrD,gEAAgE;AAChE,wBAAsB,KAAK,CACzB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,EAC1B,OAAO,GAAE,KAAK,CAAC,OAAY,GAC1B,OAAO,CAAC,IAAI,CAAC,CA6Bf;AAED,MAAM,CAAC,OAAO,WAAW,KAAK,CAAC;IAC7B,kCAAkC;IAClC,KAAK,OAAO,GAAG;QACb,0DAA0D;QAC1D,KAAK,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAA;QAC5B,4DAA4D;QAC5D,MAAM,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAA;KAC9B,CAAA;CACF"}
package/dist/Mcp.js ADDED
@@ -0,0 +1,140 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
3
+ import * as Schema from './Schema.js';
4
+ /** Starts a stdio MCP server that exposes commands as tools. */
5
+ export async function serve(name, version, commands, options = {}) {
6
+ const server = new McpServer({ name, version });
7
+ for (const tool of collectTools(commands, [])) {
8
+ const mergedShape = {
9
+ ...tool.command.args?.shape,
10
+ ...tool.command.options?.shape,
11
+ };
12
+ const hasInput = Object.keys(mergedShape).length > 0;
13
+ server.registerTool(tool.name, {
14
+ ...(tool.description ? { description: tool.description } : undefined),
15
+ ...(hasInput ? { inputSchema: mergedShape } : undefined),
16
+ }, async (...callArgs) => {
17
+ // registerTool passes (args, extra) when inputSchema is set, (extra) when not
18
+ const params = hasInput ? callArgs[0] : {};
19
+ const extra = hasInput ? callArgs[1] : callArgs[0];
20
+ return callTool(tool, params, extra);
21
+ });
22
+ }
23
+ const input = options.input ?? process.stdin;
24
+ const output = options.output ?? process.stdout;
25
+ const transport = new StdioServerTransport(input, output);
26
+ await server.connect(transport);
27
+ }
28
+ /** @internal Executes a tool call and returns a CallToolResult. */
29
+ async function callTool(tool, params, extra) {
30
+ try {
31
+ const { args, options } = splitParams(params, tool.command);
32
+ const parsedArgs = tool.command.args ? tool.command.args.parse(args) : {};
33
+ const parsedOptions = tool.command.options ? tool.command.options.parse(options) : {};
34
+ const parsedEnv = tool.command.env ? tool.command.env.parse(process.env) : {};
35
+ const sentinel = Symbol.for('incur.sentinel');
36
+ const okFn = (data) => ({ [sentinel]: 'ok', data });
37
+ const errorFn = (opts) => ({ [sentinel]: 'error', ...opts });
38
+ const raw = tool.command.run({
39
+ args: parsedArgs,
40
+ env: parsedEnv,
41
+ options: parsedOptions,
42
+ ok: okFn,
43
+ error: errorFn,
44
+ });
45
+ // Streaming: send progress notifications per chunk, then return buffered result
46
+ if (isAsyncGenerator(raw)) {
47
+ const chunks = [];
48
+ const progressToken = extra?._meta?.progressToken;
49
+ let i = 0;
50
+ for await (const chunk of raw) {
51
+ if (typeof chunk === 'object' && chunk !== null && sentinel in chunk) {
52
+ const tagged = chunk;
53
+ if (tagged[sentinel] === 'error')
54
+ return {
55
+ content: [{ type: 'text', text: tagged.message ?? 'Command failed' }],
56
+ isError: true,
57
+ };
58
+ }
59
+ chunks.push(chunk);
60
+ if (progressToken !== undefined && extra?.sendNotification)
61
+ await extra.sendNotification({
62
+ method: 'notifications/progress',
63
+ params: { progressToken, progress: ++i, message: JSON.stringify(chunk) },
64
+ });
65
+ }
66
+ return { content: [{ type: 'text', text: JSON.stringify(chunks) }] };
67
+ }
68
+ const awaited = await raw;
69
+ if (typeof awaited === 'object' && awaited !== null && sentinel in awaited) {
70
+ const tagged = awaited;
71
+ if (tagged[sentinel] === 'error')
72
+ return {
73
+ content: [{ type: 'text', text: tagged.message ?? 'Command failed' }],
74
+ isError: true,
75
+ };
76
+ return { content: [{ type: 'text', text: JSON.stringify(tagged.data) }] };
77
+ }
78
+ return { content: [{ type: 'text', text: JSON.stringify(awaited) }] };
79
+ }
80
+ catch (err) {
81
+ return {
82
+ content: [{ type: 'text', text: err instanceof Error ? err.message : String(err) }],
83
+ isError: true,
84
+ };
85
+ }
86
+ }
87
+ /** @internal Type guard for async generators. */
88
+ function isAsyncGenerator(value) {
89
+ return (typeof value === 'object' &&
90
+ value !== null &&
91
+ Symbol.asyncIterator in value &&
92
+ typeof value.next === 'function');
93
+ }
94
+ /** @internal Recursively collects leaf commands as tool entries. */
95
+ function collectTools(commands, prefix) {
96
+ const result = [];
97
+ for (const [name, entry] of commands) {
98
+ const path = [...prefix, name];
99
+ if ('_group' in entry && entry._group)
100
+ result.push(...collectTools(entry.commands, path));
101
+ else {
102
+ result.push({
103
+ name: path.join('_'),
104
+ description: entry.description,
105
+ inputSchema: buildToolSchema(entry.args, entry.options),
106
+ command: entry,
107
+ });
108
+ }
109
+ }
110
+ return result.sort((a, b) => a.name.localeCompare(b.name));
111
+ }
112
+ /** @internal Builds a merged JSON Schema from args and options Zod schemas. */
113
+ function buildToolSchema(args, options) {
114
+ const properties = {};
115
+ const required = [];
116
+ for (const schema of [args, options]) {
117
+ if (!schema)
118
+ continue;
119
+ const json = Schema.toJsonSchema(schema);
120
+ Object.assign(properties, json.properties ?? {});
121
+ required.push(...(json.required ?? []));
122
+ }
123
+ if (required.length > 0)
124
+ return { type: 'object', properties, required };
125
+ return { type: 'object', properties };
126
+ }
127
+ /** @internal Splits flat params into args vs options using schema shapes. */
128
+ function splitParams(params, command) {
129
+ const argKeys = new Set(command.args ? Object.keys(command.args.shape) : []);
130
+ const a = {};
131
+ const o = {};
132
+ for (const [key, value] of Object.entries(params)) {
133
+ if (argKeys.has(key))
134
+ a[key] = value;
135
+ else
136
+ o[key] = value;
137
+ }
138
+ return { args: a, options: o };
139
+ }
140
+ //# sourceMappingURL=Mcp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Mcp.js","sourceRoot":"","sources":["../src/Mcp.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import type { z } from 'zod';
2
+ /** Parses raw argv tokens against Zod schemas for args and options. */
3
+ export declare function parse<const args extends z.ZodObject<any> | undefined = undefined, const options extends z.ZodObject<any> | undefined = undefined>(argv: string[], options?: parse.Options<args, options>): parse.ReturnType<args, options>;
4
+ export declare namespace parse {
5
+ /** Options for parsing. */
6
+ type Options<args extends z.ZodObject<any> | undefined = undefined, options extends z.ZodObject<any> | undefined = undefined> = {
7
+ /** Zod schema for positional arguments. Keys define order. */
8
+ args?: args;
9
+ /** Zod schema for named options/flags. */
10
+ options?: options;
11
+ /** Map of option names to single-char aliases. */
12
+ alias?: Record<string, string> | undefined;
13
+ };
14
+ /** Parsed result with args and options. */
15
+ type ReturnType<args extends z.ZodObject<any> | undefined = undefined, options extends z.ZodObject<any> | undefined = undefined> = {
16
+ /** Parsed positional arguments. */
17
+ args: args extends z.ZodObject<any> ? z.output<args> : {};
18
+ /** Parsed named options. */
19
+ options: options extends z.ZodObject<any> ? z.output<options> : {};
20
+ };
21
+ }
22
+ /** Parses environment variables against a Zod schema. Falls back to `process.env` → `Deno.env` when no source is provided. */
23
+ export declare function parseEnv<const env extends z.ZodObject<any>>(schema: env, source?: Record<string, string | undefined>): z.output<env>;
24
+ //# sourceMappingURL=Parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Parser.d.ts","sourceRoot":"","sources":["../src/Parser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAK5B,uEAAuE;AACvE,wBAAgB,KAAK,CACnB,KAAK,CAAC,IAAI,SAAS,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,SAAS,GAAG,SAAS,EAC3D,KAAK,CAAC,OAAO,SAAS,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,SAAS,GAAG,SAAS,EAC9D,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,GAAE,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAM,GAAG,KAAK,CAAC,UAAU,CAAC,IAAI,EAAE,OAAO,CAAC,CAsG7F;AAED,MAAM,CAAC,OAAO,WAAW,KAAK,CAAC;IAC7B,2BAA2B;IAC3B,KAAK,OAAO,CACV,IAAI,SAAS,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,SAAS,GAAG,SAAS,EACrD,OAAO,SAAS,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,SAAS,GAAG,SAAS,IACtD;QACF,8DAA8D;QAC9D,IAAI,CAAC,EAAE,IAAI,CAAA;QACX,0CAA0C;QAC1C,OAAO,CAAC,EAAE,OAAO,CAAA;QACjB,kDAAkD;QAClD,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAA;KAC3C,CAAA;IACD,2CAA2C;IAC3C,KAAK,UAAU,CACb,IAAI,SAAS,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,SAAS,GAAG,SAAS,EACrD,OAAO,SAAS,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,SAAS,GAAG,SAAS,IACtD;QACF,mCAAmC;QACnC,IAAI,EAAE,IAAI,SAAS,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAA;QACzD,4BAA4B;QAC5B,OAAO,EAAE,OAAO,SAAS,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,CAAA;KACnE,CAAA;CACF;AAgED,8HAA8H;AAC9H,wBAAgB,QAAQ,CAAC,KAAK,CAAC,GAAG,SAAS,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,EACzD,MAAM,EAAE,GAAG,EACX,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAsB,GAC9D,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAOf"}
package/dist/Parser.js ADDED
@@ -0,0 +1,215 @@
1
+ import { ParseError, ValidationError } from './Errors.js';
2
+ /** Parses raw argv tokens against Zod schemas for args and options. */
3
+ export function parse(argv, options = {}) {
4
+ const { args: argsSchema, options: optionsSchema, alias } = options;
5
+ // Build reverse alias map: short char → long name
6
+ const aliasToName = new Map();
7
+ if (alias)
8
+ for (const [name, short] of Object.entries(alias))
9
+ aliasToName.set(short, name);
10
+ // Known option names from schema, plus kebab-case → camelCase map
11
+ const knownOptions = new Set(optionsSchema ? Object.keys(optionsSchema.shape) : []);
12
+ const kebabToCamel = new Map();
13
+ for (const name of knownOptions) {
14
+ const kebab = name.replace(/[A-Z]/g, (c) => `-${c.toLowerCase()}`);
15
+ if (kebab !== name)
16
+ kebabToCamel.set(kebab, name);
17
+ }
18
+ // First pass: split argv into positional tokens and raw option values
19
+ const positionals = [];
20
+ const rawOptions = {};
21
+ let i = 0;
22
+ while (i < argv.length) {
23
+ const token = argv[i];
24
+ if (token.startsWith('--no-') && token.length > 5) {
25
+ // --no-flag negation
26
+ const raw = token.slice(5);
27
+ const name = kebabToCamel.get(raw) ?? raw;
28
+ if (!knownOptions.has(name))
29
+ throw new ParseError({ message: `Unknown flag: ${token}` });
30
+ rawOptions[name] = false;
31
+ i++;
32
+ }
33
+ else if (token.startsWith('--')) {
34
+ const eqIdx = token.indexOf('=');
35
+ if (eqIdx !== -1) {
36
+ // --flag=value
37
+ const raw = token.slice(2, eqIdx);
38
+ const name = kebabToCamel.get(raw) ?? raw;
39
+ if (!knownOptions.has(name))
40
+ throw new ParseError({ message: `Unknown flag: --${raw}` });
41
+ setOption(rawOptions, name, token.slice(eqIdx + 1), optionsSchema);
42
+ i++;
43
+ }
44
+ else {
45
+ // --flag [value]
46
+ const raw = token.slice(2);
47
+ const name = kebabToCamel.get(raw) ?? raw;
48
+ if (!knownOptions.has(name))
49
+ throw new ParseError({ message: `Unknown flag: ${token}` });
50
+ if (isBooleanOption(name, optionsSchema)) {
51
+ rawOptions[name] = true;
52
+ i++;
53
+ }
54
+ else {
55
+ const value = argv[i + 1];
56
+ if (value === undefined)
57
+ throw new ParseError({ message: `Missing value for flag: ${token}` });
58
+ setOption(rawOptions, name, value, optionsSchema);
59
+ i += 2;
60
+ }
61
+ }
62
+ }
63
+ else if (token.startsWith('-') && token.length === 2) {
64
+ // -f [value]
65
+ const short = token.slice(1);
66
+ const name = aliasToName.get(short);
67
+ if (!name)
68
+ throw new ParseError({ message: `Unknown flag: ${token}` });
69
+ if (isBooleanOption(name, optionsSchema)) {
70
+ rawOptions[name] = true;
71
+ i++;
72
+ }
73
+ else {
74
+ const value = argv[i + 1];
75
+ if (value === undefined)
76
+ throw new ParseError({ message: `Missing value for flag: ${token}` });
77
+ setOption(rawOptions, name, value, optionsSchema);
78
+ i += 2;
79
+ }
80
+ }
81
+ else {
82
+ positionals.push(token);
83
+ i++;
84
+ }
85
+ }
86
+ // Assign positionals to args schema keys in order
87
+ const rawArgs = {};
88
+ if (argsSchema) {
89
+ const keys = Object.keys(argsSchema.shape);
90
+ for (let j = 0; j < keys.length; j++) {
91
+ const key = keys[j];
92
+ if (positionals[j] !== undefined) {
93
+ rawArgs[key] = positionals[j];
94
+ }
95
+ }
96
+ }
97
+ // Validate args through zod
98
+ const args = argsSchema ? zodParse(argsSchema, rawArgs) : {};
99
+ // Coerce raw option values before zod validation
100
+ if (optionsSchema) {
101
+ for (const [name, value] of Object.entries(rawOptions)) {
102
+ rawOptions[name] = coerce(value, name, optionsSchema);
103
+ }
104
+ }
105
+ // Validate options through zod
106
+ const parsedOptions = optionsSchema ? zodParse(optionsSchema, rawOptions) : {};
107
+ return { args, options: parsedOptions };
108
+ }
109
+ /** Unwraps ZodDefault/ZodOptional to get the inner type. */
110
+ function unwrap(schema) {
111
+ let s = schema;
112
+ while (s._zod?.def?.innerType)
113
+ s = s._zod.def.innerType;
114
+ return s;
115
+ }
116
+ /** Checks if an option's inner type is boolean. */
117
+ function isBooleanOption(name, schema) {
118
+ if (!schema)
119
+ return false;
120
+ const field = schema.shape[name];
121
+ if (!field)
122
+ return false;
123
+ return unwrap(field).constructor.name === 'ZodBoolean';
124
+ }
125
+ /** Checks if an option's inner type is an array. */
126
+ function isArrayOption(name, schema) {
127
+ if (!schema)
128
+ return false;
129
+ const field = schema.shape[name];
130
+ if (!field)
131
+ return false;
132
+ return unwrap(field).constructor.name === 'ZodArray';
133
+ }
134
+ /** Sets an option value, collecting into arrays for array schemas. */
135
+ function setOption(raw, name, value, schema) {
136
+ if (isArrayOption(name, schema)) {
137
+ const existing = raw[name];
138
+ if (Array.isArray(existing)) {
139
+ existing.push(value);
140
+ }
141
+ else {
142
+ raw[name] = [value];
143
+ }
144
+ }
145
+ else {
146
+ raw[name] = value;
147
+ }
148
+ }
149
+ /** Wraps zod schema.parse(), converting ZodError to ValidationError. */
150
+ function zodParse(schema, data) {
151
+ try {
152
+ return schema.parse(data);
153
+ }
154
+ catch (err) {
155
+ const issues = err?.issues ?? err?.error?.issues ?? [];
156
+ const fieldErrors = issues.map((issue) => ({
157
+ path: (issue.path ?? []).join('.'),
158
+ expected: issue.expected ?? '',
159
+ received: issue.received ?? '',
160
+ message: issue.message ?? '',
161
+ }));
162
+ throw new ValidationError({
163
+ message: issues.map((i) => i.message).join('; ') || 'Validation failed',
164
+ fieldErrors,
165
+ cause: err instanceof Error ? err : undefined,
166
+ });
167
+ }
168
+ }
169
+ /** Parses environment variables against a Zod schema. Falls back to `process.env` → `Deno.env` when no source is provided. */
170
+ export function parseEnv(schema, source = defaultEnvSource()) {
171
+ const raw = {};
172
+ for (const [key, field] of Object.entries(schema.shape)) {
173
+ const value = source[key];
174
+ if (value !== undefined)
175
+ raw[key] = coerceEnv(value, field);
176
+ }
177
+ return zodParse(schema, raw);
178
+ }
179
+ /** Coerces an env var string to the type expected by the schema field. */
180
+ function coerceEnv(value, field) {
181
+ const inner = unwrap(field);
182
+ const typeName = inner.constructor.name;
183
+ if (typeName === 'ZodNumber')
184
+ return Number(value);
185
+ if (typeName === 'ZodBoolean')
186
+ return value === 'true' || value === '1';
187
+ return value;
188
+ }
189
+ /** Coerces a raw string value to the type expected by the schema. */
190
+ function coerce(value, name, schema) {
191
+ const field = schema.shape[name];
192
+ if (!field)
193
+ return value;
194
+ const inner = unwrap(field);
195
+ const typeName = inner.constructor.name;
196
+ if (typeName === 'ZodNumber' && typeof value === 'string') {
197
+ return Number(value);
198
+ }
199
+ if (typeName === 'ZodBoolean' && typeof value === 'string') {
200
+ return value === 'true';
201
+ }
202
+ return value;
203
+ }
204
+ /** Returns the best available env source for the current runtime. */
205
+ function defaultEnvSource() {
206
+ if (typeof globalThis !== 'undefined') {
207
+ const g = globalThis;
208
+ if (g.process?.env)
209
+ return g.process.env;
210
+ if (g.Deno?.env)
211
+ return new Proxy({}, { get: (_, key) => g.Deno.env.get(key) });
212
+ }
213
+ return {};
214
+ }
215
+ //# sourceMappingURL=Parser.js.map