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
@@ -0,0 +1,163 @@
1
+ import { execFile } from 'node:child_process';
2
+ import fsSync from 'node:fs';
3
+ import fs from 'node:fs/promises';
4
+ import os from 'node:os';
5
+ import path from 'node:path';
6
+ import { formatExamples } from './Cli.js';
7
+ import { detectRunner } from './internal/pm.js';
8
+ import * as Skill from './Skill.js';
9
+ /** Generates skill files from a command map and installs them via `skills add`. */
10
+ export async function sync(name, commands, options = {}) {
11
+ const cwd = options.cwd ?? resolvePackageRoot();
12
+ const { depth = 1, description, global = true } = options;
13
+ const groups = new Map();
14
+ if (description)
15
+ groups.set(name, description);
16
+ const entries = collectEntries(commands, [], groups);
17
+ const files = Skill.split(name, entries, depth, groups);
18
+ const tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), `incur-skills-${name}-`));
19
+ try {
20
+ const skills = [];
21
+ for (const file of files) {
22
+ const filePath = file.dir
23
+ ? path.join(tmpDir, file.dir, 'SKILL.md')
24
+ : path.join(tmpDir, 'SKILL.md');
25
+ await fs.mkdir(path.dirname(filePath), { recursive: true });
26
+ await fs.writeFile(filePath, `${file.content}\n`);
27
+ const descMatch = file.content.match(/^description:\s*(.+)$/m);
28
+ skills.push({ name: file.dir || name, description: descMatch?.[1] });
29
+ }
30
+ // Include additional SKILL.md files matched by glob patterns
31
+ if (options.include) {
32
+ for (const pattern of options.include) {
33
+ const globPattern = pattern === '_root' ? 'SKILL.md' : path.join(pattern, 'SKILL.md');
34
+ for await (const match of fs.glob(globPattern, { cwd })) {
35
+ try {
36
+ const content = await fs.readFile(path.resolve(cwd, match), 'utf8');
37
+ const nameMatch = content.match(/^name:\s*(.+)$/m);
38
+ const skillName = pattern === '_root' ? (nameMatch?.[1] ?? name) : path.basename(path.dirname(match));
39
+ const dest = path.join(tmpDir, skillName, 'SKILL.md');
40
+ await fs.mkdir(path.dirname(dest), { recursive: true });
41
+ await fs.writeFile(dest, content);
42
+ if (!skills.some((s) => s.name === skillName)) {
43
+ const descMatch = content.match(/^description:\s*(.+)$/m);
44
+ skills.push({ name: skillName, description: descMatch?.[1], external: true });
45
+ }
46
+ }
47
+ catch { }
48
+ }
49
+ }
50
+ }
51
+ const runner = options.runner ?? detectRunner();
52
+ const [cmd, ...prefix] = runner.split(' ');
53
+ const flags = ['--yes', ...(global ? ['--global'] : [])];
54
+ const { stdout } = await exec(cmd, [...prefix, 'skills', 'add', tmpDir, ...flags]);
55
+ // Extract installed paths from `skills add` output (lines like "✓ ~/path/to/skill")
56
+ const paths = stdout
57
+ .split('\n')
58
+ .filter((l) => l.includes('✓'))
59
+ .map((l) => l
60
+ .replace(/.*✓\s*/, '')
61
+ .replace(/[│┃|]/g, '')
62
+ .trim())
63
+ .filter(Boolean);
64
+ // Write skills hash for staleness detection
65
+ const entries = collectEntries(commands, []);
66
+ writeHash(name, Skill.hash(entries));
67
+ return { skills, paths };
68
+ }
69
+ finally {
70
+ await fs.rm(tmpDir, { recursive: true, force: true });
71
+ }
72
+ }
73
+ /** Recursively collects leaf commands as `Skill.CommandInfo`. */
74
+ function collectEntries(commands, prefix, groups = new Map()) {
75
+ const result = [];
76
+ for (const [name, entry] of commands) {
77
+ const entryPath = [...prefix, name];
78
+ if ('_group' in entry && entry._group) {
79
+ if (entry.description)
80
+ groups.set(entryPath.join(' '), entry.description);
81
+ result.push(...collectEntries(entry.commands, entryPath, groups));
82
+ }
83
+ else {
84
+ const cmd = { name: entryPath.join(' ') };
85
+ if (entry.description)
86
+ cmd.description = entry.description;
87
+ if (entry.args)
88
+ cmd.args = entry.args;
89
+ if (entry.env)
90
+ cmd.env = entry.env;
91
+ if (entry.hint)
92
+ cmd.hint = entry.hint;
93
+ if (entry.options)
94
+ cmd.options = entry.options;
95
+ if (entry.output)
96
+ cmd.output = entry.output;
97
+ const examples = formatExamples(entry.examples);
98
+ if (examples) {
99
+ const cmdName = entryPath.join(' ');
100
+ cmd.examples = examples.map((e) => ({
101
+ ...e,
102
+ command: e.command ? `${cmdName} ${e.command}` : cmdName,
103
+ }));
104
+ }
105
+ result.push(cmd);
106
+ }
107
+ }
108
+ return result.sort((a, b) => a.name.localeCompare(b.name));
109
+ }
110
+ /** Resolves the package root from the executing bin script (`process.argv[1]`). Walks up from the bin's directory looking for `package.json`. Falls back to `process.cwd()`. */
111
+ function resolvePackageRoot() {
112
+ const bin = process.argv[1];
113
+ if (!bin)
114
+ return process.cwd();
115
+ let dir = path.dirname(fsSync.realpathSync(bin));
116
+ const root = path.parse(dir).root;
117
+ while (dir !== root) {
118
+ try {
119
+ fsSync.accessSync(path.join(dir, 'package.json'));
120
+ return dir;
121
+ }
122
+ catch { }
123
+ dir = path.dirname(dir);
124
+ }
125
+ return process.cwd();
126
+ }
127
+ /** Returns the hash file path for a CLI. */
128
+ function hashPath(name) {
129
+ const dir = process.env.XDG_DATA_HOME || path.join(os.homedir(), '.local', 'share');
130
+ return path.join(dir, 'incur', `${name}.json`);
131
+ }
132
+ /** @internal Writes the skills hash for staleness detection. */
133
+ function writeHash(name, hash) {
134
+ const file = hashPath(name);
135
+ const dir = path.dirname(file);
136
+ if (!fsSync.existsSync(dir))
137
+ fsSync.mkdirSync(dir, { recursive: true });
138
+ fsSync.writeFileSync(file, JSON.stringify({ hash, at: new Date().toISOString() }) + '\n');
139
+ }
140
+ /** Reads the stored skills hash for a CLI. Returns `undefined` if no hash exists. */
141
+ export function readHash(name) {
142
+ try {
143
+ const data = JSON.parse(fsSync.readFileSync(hashPath(name), 'utf-8'));
144
+ return data.hash;
145
+ }
146
+ catch {
147
+ return undefined;
148
+ }
149
+ }
150
+ /** Promisified execFile with stderr in error message. */
151
+ function exec(cmd, args) {
152
+ return new Promise((resolve, reject) => {
153
+ execFile(cmd, args, (error, stdout, stderr) => {
154
+ if (error) {
155
+ const msg = stderr?.trim() || stdout?.trim() || error.message;
156
+ reject(new Error(msg));
157
+ }
158
+ else
159
+ resolve({ stdout, stderr });
160
+ });
161
+ });
162
+ }
163
+ //# sourceMappingURL=SyncSkills.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SyncSkills.js","sourceRoot":"","sources":["../src/SyncSkills.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import * as Cli from './Cli.js';
2
+ /** Imports a CLI from `input` (must `export default` a `Cli`), generates the `.d.ts`, and writes it to `output`. */
3
+ export declare function generate(input: string, output: string): Promise<void>;
4
+ /** Generates a `.d.ts` declaration string for the `incur` module augmentation. */
5
+ export declare function fromCli(cli: Cli.Cli): string;
6
+ //# sourceMappingURL=Typegen.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Typegen.d.ts","sourceRoot":"","sources":["../src/Typegen.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,GAAG,MAAM,UAAU,CAAA;AAG/B,oHAAoH;AACpH,wBAAsB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAG3E;AAED,kFAAkF;AAClF,wBAAgB,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,GAAG,MAAM,CAe5C"}
@@ -0,0 +1,92 @@
1
+ import fs from 'node:fs/promises';
2
+ import { z } from 'zod';
3
+ import * as Cli from './Cli.js';
4
+ import { importCli } from './internal/utils.js';
5
+ /** Imports a CLI from `input` (must `export default` a `Cli`), generates the `.d.ts`, and writes it to `output`. */
6
+ export async function generate(input, output) {
7
+ const cli = await importCli(input);
8
+ await fs.writeFile(output, fromCli(cli));
9
+ }
10
+ /** Generates a `.d.ts` declaration string for the `incur` module augmentation. */
11
+ export function fromCli(cli) {
12
+ const commands = Cli.toCommands.get(cli);
13
+ if (!commands)
14
+ throw new Error('No commands registered on this CLI instance');
15
+ const entries = collectEntries(commands, []);
16
+ const lines = ["declare module 'incur' {", ' interface Register {', ' commands: {'];
17
+ for (const { name, args, options } of entries)
18
+ lines.push(` '${name}': { args: ${schemaToType(args)}; options: ${schemaToType(options)} }`);
19
+ lines.push(' }', ' }', '}', '');
20
+ return lines.join('\n');
21
+ }
22
+ /** Recursively collects leaf commands with their full paths and schemas. */
23
+ function collectEntries(commands, prefix) {
24
+ const result = [];
25
+ for (const [name, entry] of commands) {
26
+ const path = [...prefix, name];
27
+ if ('_group' in entry && entry._group)
28
+ result.push(...collectEntries(entry.commands, path));
29
+ else
30
+ result.push({ name: path.join(' '), args: entry.args, options: entry.options });
31
+ }
32
+ return result.sort((a, b) => a.name.localeCompare(b.name));
33
+ }
34
+ /** Converts a Zod object schema to a TypeScript type string. Returns `{}` for undefined schemas. */
35
+ function schemaToType(schema) {
36
+ if (!schema)
37
+ return '{}';
38
+ const json = z.toJSONSchema(schema);
39
+ const defs = (json.$defs ?? {});
40
+ const properties = json.properties;
41
+ if (!properties || Object.keys(properties).length === 0)
42
+ return '{}';
43
+ const entries = Object.entries(properties).map(([key, value]) => `${key}: ${resolveType(value, defs)}`);
44
+ return `{ ${entries.join('; ')} }`;
45
+ }
46
+ /** Recursively resolves a JSON Schema node to a TypeScript type string. */
47
+ function resolveType(schema, defs) {
48
+ if (schema.$ref) {
49
+ const ref = schema.$ref.replace('#/$defs/', '');
50
+ const resolved = defs[ref];
51
+ if (resolved)
52
+ return resolveType(resolved, defs);
53
+ return 'unknown';
54
+ }
55
+ if ('const' in schema)
56
+ return JSON.stringify(schema.const);
57
+ if (schema.enum)
58
+ return schema.enum.map((v) => JSON.stringify(v)).join(' | ');
59
+ if (schema.anyOf)
60
+ return schema.anyOf.map((s) => resolveType(s, defs)).join(' | ');
61
+ const type = schema.type;
62
+ if (Array.isArray(type))
63
+ return type
64
+ .map((t) => (t === 'null' ? 'null' : resolveType({ ...schema, type: t }, defs)))
65
+ .join(' | ');
66
+ switch (type) {
67
+ case 'string':
68
+ return 'string';
69
+ case 'number':
70
+ case 'integer':
71
+ return 'number';
72
+ case 'boolean':
73
+ return 'boolean';
74
+ case 'null':
75
+ return 'null';
76
+ case 'array': {
77
+ const items = schema.items;
78
+ const itemType = items ? resolveType(items, defs) : 'unknown';
79
+ return itemType.includes(' | ') ? `(${itemType})[]` : `${itemType}[]`;
80
+ }
81
+ case 'object': {
82
+ const properties = schema.properties;
83
+ if (!properties || Object.keys(properties).length === 0)
84
+ return '{}';
85
+ const entries = Object.entries(properties).map(([key, value]) => `${key}: ${resolveType(value, defs)}`);
86
+ return `{ ${entries.join('; ')} }`;
87
+ }
88
+ default:
89
+ return 'unknown';
90
+ }
91
+ }
92
+ //# sourceMappingURL=Typegen.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Typegen.js","sourceRoot":"","sources":["../src/Typegen.ts"],"names":[],"mappings":"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"}
package/dist/bin.d.ts ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env node
2
+ import * as Cli from './Cli.js';
3
+ declare const cli: Cli.Cli<{
4
+ gen: {
5
+ args: {};
6
+ options: {
7
+ dir?: string | undefined;
8
+ entry?: string | undefined;
9
+ output?: string | undefined;
10
+ };
11
+ };
12
+ }>;
13
+ export default cli;
14
+ //# sourceMappingURL=bin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bin.d.ts","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":";AAIA,OAAO,KAAK,GAAG,MAAM,UAAU,CAAA;AAG/B,QAAA,MAAM,GAAG;;;;;;;;;EAqBP,CAAA;AAIF,eAAe,GAAG,CAAA"}
package/dist/bin.js ADDED
@@ -0,0 +1,30 @@
1
+ #!/usr/bin/env node
2
+ import path from 'node:path';
3
+ import { z } from 'zod';
4
+ import * as Cli from './Cli.js';
5
+ import * as Typegen from './Typegen.js';
6
+ const cli = Cli.create('incur', {
7
+ description: 'CLI for incur',
8
+ sync: {
9
+ depth: 1,
10
+ include: ['_root'],
11
+ suggestions: ['build a cli with incur', 'generate incur types'],
12
+ },
13
+ }).command('gen', {
14
+ description: 'Generate type definitions for development.',
15
+ options: z.object({
16
+ dir: z.string().optional().describe('Project root directory'),
17
+ entry: z.string().optional().describe('Entrypoint path (absolute)'),
18
+ output: z.string().optional().describe('Output path (absolute)'),
19
+ }),
20
+ async run({ options }) {
21
+ const dir = options.dir ?? '.';
22
+ const entry = options.entry ?? dir;
23
+ const output = options.output ?? path.join(dir, 'incur.generated.ts');
24
+ await Typegen.generate(entry, output);
25
+ return { dir, entry, output };
26
+ },
27
+ });
28
+ cli.serve();
29
+ export default cli;
30
+ //# sourceMappingURL=bin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bin.js","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":";AACA,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,OAAO,KAAK,GAAG,MAAM,UAAU,CAAA;AAC/B,OAAO,KAAK,OAAO,MAAM,cAAc,CAAA;AAEvC,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,OAAO,EAAE;IAC9B,WAAW,EAAE,eAAe;IAC5B,IAAI,EAAE;QACJ,KAAK,EAAE,CAAC;QACR,OAAO,EAAE,CAAC,OAAO,CAAC;QAClB,WAAW,EAAE,CAAC,wBAAwB,EAAE,sBAAsB,CAAC;KAChE;CACF,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE;IAChB,WAAW,EAAE,4CAA4C;IACzD,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC;QAChB,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wBAAwB,CAAC;QAC7D,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,4BAA4B,CAAC;QACnE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wBAAwB,CAAC;KACjE,CAAC;IACF,KAAK,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE;QACnB,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,GAAG,CAAA;QAC9B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,GAAG,CAAA;QAClC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,oBAAoB,CAAC,CAAA;QACrE,MAAM,OAAO,CAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;QACrC,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,CAAA;IAC/B,CAAC;CACF,CAAC,CAAA;AAEF,GAAG,CAAC,KAAK,EAAE,CAAA;AAEX,eAAe,GAAG,CAAA"}
@@ -0,0 +1,15 @@
1
+ export { z } from 'zod';
2
+ export * as Cli from './Cli.js';
3
+ export * as Errors from './Errors.js';
4
+ export * as Formatter from './Formatter.js';
5
+ export * as Help from './Help.js';
6
+ export * as Mcp from './Mcp.js';
7
+ export * as Parser from './Parser.js';
8
+ export type { Register } from './Register.js';
9
+ export * as Schema from './Schema.js';
10
+ export * as Skill from './Skill.js';
11
+ export * as Skillgen from './Skillgen.js';
12
+ export * as SyncMcp from './SyncMcp.js';
13
+ export * as SyncSkills from './SyncSkills.js';
14
+ export * as Typegen from './Typegen.js';
15
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,KAAK,GAAG,MAAM,UAAU,CAAA;AAC/B,OAAO,KAAK,MAAM,MAAM,aAAa,CAAA;AACrC,OAAO,KAAK,SAAS,MAAM,gBAAgB,CAAA;AAC3C,OAAO,KAAK,IAAI,MAAM,WAAW,CAAA;AACjC,OAAO,KAAK,GAAG,MAAM,UAAU,CAAA;AAC/B,OAAO,KAAK,MAAM,MAAM,aAAa,CAAA;AACrC,YAAY,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAC7C,OAAO,KAAK,MAAM,MAAM,aAAa,CAAA;AACrC,OAAO,KAAK,KAAK,MAAM,YAAY,CAAA;AACnC,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAA;AACzC,OAAO,KAAK,OAAO,MAAM,cAAc,CAAA;AACvC,OAAO,KAAK,UAAU,MAAM,iBAAiB,CAAA;AAC7C,OAAO,KAAK,OAAO,MAAM,cAAc,CAAA"}
package/dist/index.js ADDED
@@ -0,0 +1,14 @@
1
+ export { z } from 'zod';
2
+ export * as Cli from './Cli.js';
3
+ export * as Errors from './Errors.js';
4
+ export * as Formatter from './Formatter.js';
5
+ export * as Help from './Help.js';
6
+ export * as Mcp from './Mcp.js';
7
+ export * as Parser from './Parser.js';
8
+ export * as Schema from './Schema.js';
9
+ export * as Skill from './Skill.js';
10
+ export * as Skillgen from './Skillgen.js';
11
+ export * as SyncMcp from './SyncMcp.js';
12
+ export * as SyncSkills from './SyncSkills.js';
13
+ export * as Typegen from './Typegen.js';
14
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,KAAK,GAAG,MAAM,UAAU,CAAA;AAC/B,OAAO,KAAK,MAAM,MAAM,aAAa,CAAA;AACrC,OAAO,KAAK,SAAS,MAAM,gBAAgB,CAAA;AAC3C,OAAO,KAAK,IAAI,MAAM,WAAW,CAAA;AACjC,OAAO,KAAK,GAAG,MAAM,UAAU,CAAA;AAC/B,OAAO,KAAK,MAAM,MAAM,aAAa,CAAA;AAErC,OAAO,KAAK,MAAM,MAAM,aAAa,CAAA;AACrC,OAAO,KAAK,KAAK,MAAM,YAAY,CAAA;AACnC,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAA;AACzC,OAAO,KAAK,OAAO,MAAM,cAAc,CAAA;AACvC,OAAO,KAAK,UAAU,MAAM,iBAAiB,CAAA;AAC7C,OAAO,KAAK,OAAO,MAAM,cAAc,CAAA"}
@@ -0,0 +1,3 @@
1
+ /** Detects the package manager runner (`npx`, `pnpx`, `bunx`) from the current process environment. */
2
+ export declare function detectRunner(): string;
3
+ //# sourceMappingURL=pm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pm.d.ts","sourceRoot":"","sources":["../../src/internal/pm.ts"],"names":[],"mappings":"AAAA,uGAAuG;AACvG,wBAAgB,YAAY,IAAI,MAAM,CAMrC"}
@@ -0,0 +1,11 @@
1
+ /** Detects the package manager runner (`npx`, `pnpx`, `bunx`) from the current process environment. */
2
+ export function detectRunner() {
3
+ const userAgent = process.env.npm_config_user_agent ?? '';
4
+ const execPath = process.env.npm_execpath ?? '';
5
+ if (userAgent.includes('pnpm') || execPath.includes('pnpm'))
6
+ return 'pnpx';
7
+ if (userAgent.includes('bun') || execPath.includes('bun'))
8
+ return 'bunx';
9
+ return 'npx';
10
+ }
11
+ //# sourceMappingURL=pm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pm.js","sourceRoot":"","sources":["../../src/internal/pm.ts"],"names":[],"mappings":"AAAA,uGAAuG;AACvG,MAAM,UAAU,YAAY;IAC1B,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,EAAE,CAAA;IACzD,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,EAAE,CAAA;IAC/C,IAAI,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,MAAM,CAAA;IAC1E,IAAI,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,MAAM,CAAA;IACxE,OAAO,KAAK,CAAA;AACd,CAAC"}
@@ -0,0 +1,11 @@
1
+ /** Combines members of an intersection into a readable type. */
2
+ export type Compute<type> = {
3
+ [key in keyof type]: type[key];
4
+ } & unknown;
5
+ /** Collects all keys across every member of a union. */
6
+ export type KeyofUnion<type> = type extends type ? keyof type : never;
7
+ /** Creates a mutually exclusive union where each variant's missing keys are `?: undefined`. */
8
+ export type OneOf<union extends object, fallback extends object | undefined = undefined, keys extends KeyofUnion<union> = KeyofUnion<union>> = union extends infer item ? Compute<item & {
9
+ [key in Exclude<keys, keyof item>]?: fallback extends object ? key extends keyof fallback ? fallback[key] : undefined : undefined;
10
+ }> : never;
11
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/internal/types.ts"],"names":[],"mappings":"AAAA,gEAAgE;AAChE,MAAM,MAAM,OAAO,CAAC,IAAI,IAAI;KAAG,GAAG,IAAI,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC;CAAE,GAAG,OAAO,CAAA;AAExE,wDAAwD;AACxD,MAAM,MAAM,UAAU,CAAC,IAAI,IAAI,IAAI,SAAS,IAAI,GAAG,MAAM,IAAI,GAAG,KAAK,CAAA;AAErE,+FAA+F;AAC/F,MAAM,MAAM,KAAK,CACf,KAAK,SAAS,MAAM,EACpB,QAAQ,SAAS,MAAM,GAAG,SAAS,GAAG,SAAS,EAC/C,IAAI,SAAS,UAAU,CAAC,KAAK,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,IAChD,KAAK,SAAS,MAAM,IAAI,GACxB,OAAO,CACL,IAAI,GAAG;KACJ,GAAG,IAAI,OAAO,CAAC,IAAI,EAAE,MAAM,IAAI,CAAC,CAAC,CAAC,EAAE,QAAQ,SAAS,MAAM,GACxD,GAAG,SAAS,MAAM,QAAQ,GACxB,QAAQ,CAAC,GAAG,CAAC,GACb,SAAS,GACX,SAAS;CACd,CACF,GACD,KAAK,CAAA"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/internal/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,8 @@
1
+ import * as Cli from '../Cli.js';
2
+ /**
3
+ * Dynamically imports a module and extracts its default-exported CLI instance.
4
+ * Temporarily replaces `process.argv` and `process.exit` to prevent imported
5
+ * modules that call `.serve()` at the top level from interfering.
6
+ */
7
+ export declare function importCli(input: string): Promise<Cli.Cli>;
8
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/internal/utils.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,GAAG,MAAM,WAAW,CAAA;AAEhC;;;;GAIG;AACH,wBAAsB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAuB/D"}
@@ -0,0 +1,51 @@
1
+ import fs from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import url from 'node:url';
4
+ import * as Cli from '../Cli.js';
5
+ /**
6
+ * Dynamically imports a module and extracts its default-exported CLI instance.
7
+ * Temporarily replaces `process.argv` and `process.exit` to prevent imported
8
+ * modules that call `.serve()` at the top level from interfering.
9
+ */
10
+ export async function importCli(input) {
11
+ const resolved = path.resolve(input);
12
+ const stat = await fs.stat(resolved);
13
+ const file = stat.isDirectory() ? await resolveEntry(resolved) : resolved;
14
+ const href = url.pathToFileURL(file).href;
15
+ const savedArgv = process.argv;
16
+ const savedExit = process.exit;
17
+ const savedWrite = process.stdout.write;
18
+ process.argv = [savedArgv[0]];
19
+ process.exit = (() => { });
20
+ process.stdout.write = (() => true);
21
+ try {
22
+ const mod = await import(href);
23
+ const cli = mod.default;
24
+ if (!cli || !Cli.toCommands.has(cli))
25
+ throw new Error(`Expected default export to be a \`Cli\` instance: ${input}`);
26
+ return cli;
27
+ }
28
+ finally {
29
+ process.argv = savedArgv;
30
+ process.exit = savedExit;
31
+ process.stdout.write = savedWrite;
32
+ }
33
+ }
34
+ /** Resolves the CLI entry file from a directory by checking `package.json` `bin`, then falling back to `cli.ts`. */
35
+ async function resolveEntry(dir) {
36
+ try {
37
+ const pkg = JSON.parse(await fs.readFile(path.join(dir, 'package.json'), 'utf8'));
38
+ if (pkg.bin) {
39
+ const entries = typeof pkg.bin === 'string' ? [pkg.bin] : Object.values(pkg.bin);
40
+ const src = entries.find((e) => e.endsWith('.ts'));
41
+ const entry = src ?? entries[0];
42
+ if (entry)
43
+ return path.join(dir, entry);
44
+ }
45
+ if (pkg.main)
46
+ return path.join(dir, pkg.main);
47
+ }
48
+ catch { }
49
+ return path.join(dir, 'cli.ts');
50
+ }
51
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/internal/utils.ts"],"names":[],"mappings":"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"}