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.
- package/LICENSE +21 -0
- package/README.md +141 -0
- package/SKILL.md +664 -0
- package/dist/Cli.d.ts +255 -0
- package/dist/Cli.d.ts.map +1 -0
- package/dist/Cli.js +900 -0
- package/dist/Cli.js.map +1 -0
- package/dist/Errors.d.ts +92 -0
- package/dist/Errors.d.ts.map +1 -0
- package/dist/Errors.js +75 -0
- package/dist/Errors.js.map +1 -0
- package/dist/Formatter.d.ts +5 -0
- package/dist/Formatter.d.ts.map +1 -0
- package/dist/Formatter.js +91 -0
- package/dist/Formatter.js.map +1 -0
- package/dist/Help.d.ts +53 -0
- package/dist/Help.d.ts.map +1 -0
- package/dist/Help.js +231 -0
- package/dist/Help.js.map +1 -0
- package/dist/Mcp.d.ts +13 -0
- package/dist/Mcp.d.ts.map +1 -0
- package/dist/Mcp.js +140 -0
- package/dist/Mcp.js.map +1 -0
- package/dist/Parser.d.ts +24 -0
- package/dist/Parser.d.ts.map +1 -0
- package/dist/Parser.js +215 -0
- package/dist/Parser.js.map +1 -0
- package/dist/Register.d.ts +19 -0
- package/dist/Register.d.ts.map +1 -0
- package/dist/Register.js +2 -0
- package/dist/Register.js.map +1 -0
- package/dist/Schema.d.ts +4 -0
- package/dist/Schema.d.ts.map +1 -0
- package/dist/Schema.js +8 -0
- package/dist/Schema.js.map +1 -0
- package/dist/Skill.d.ts +29 -0
- package/dist/Skill.d.ts.map +1 -0
- package/dist/Skill.js +196 -0
- package/dist/Skill.js.map +1 -0
- package/dist/Skillgen.d.ts +3 -0
- package/dist/Skillgen.d.ts.map +1 -0
- package/dist/Skillgen.js +67 -0
- package/dist/Skillgen.js.map +1 -0
- package/dist/SyncMcp.d.ts +23 -0
- package/dist/SyncMcp.d.ts.map +1 -0
- package/dist/SyncMcp.js +100 -0
- package/dist/SyncMcp.js.map +1 -0
- package/dist/SyncSkills.d.ts +38 -0
- package/dist/SyncSkills.d.ts.map +1 -0
- package/dist/SyncSkills.js +163 -0
- package/dist/SyncSkills.js.map +1 -0
- package/dist/Typegen.d.ts +6 -0
- package/dist/Typegen.d.ts.map +1 -0
- package/dist/Typegen.js +92 -0
- package/dist/Typegen.js.map +1 -0
- package/dist/bin.d.ts +14 -0
- package/dist/bin.d.ts.map +1 -0
- package/dist/bin.js +30 -0
- package/dist/bin.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -0
- package/dist/internal/pm.d.ts +3 -0
- package/dist/internal/pm.d.ts.map +1 -0
- package/dist/internal/pm.js +11 -0
- package/dist/internal/pm.js.map +1 -0
- package/dist/internal/types.d.ts +11 -0
- package/dist/internal/types.d.ts.map +1 -0
- package/dist/internal/types.js +2 -0
- package/dist/internal/types.js.map +1 -0
- package/dist/internal/utils.d.ts +8 -0
- package/dist/internal/utils.d.ts.map +1 -0
- package/dist/internal/utils.js +51 -0
- package/dist/internal/utils.js.map +1 -0
- package/examples/npm/cli.ts +180 -0
- package/examples/npm/node_modules/.bin/incur.src +21 -0
- package/examples/npm/node_modules/.bin/tsx +21 -0
- package/examples/npm/package.json +14 -0
- package/examples/npm/tsconfig.json +9 -0
- package/examples/presto/cli.ts +246 -0
- package/examples/presto/node_modules/.bin/incur.src +21 -0
- package/examples/presto/node_modules/.bin/tsx +21 -0
- package/examples/presto/package.json +14 -0
- package/examples/presto/tsconfig.json +9 -0
- package/package.json +53 -2
- package/src/Cli.test-d.ts +135 -0
- package/src/Cli.test.ts +1373 -0
- package/src/Cli.ts +1470 -0
- package/src/Errors.test.ts +96 -0
- package/src/Errors.ts +139 -0
- package/src/Formatter.test.ts +245 -0
- package/src/Formatter.ts +106 -0
- package/src/Help.test.ts +124 -0
- package/src/Help.ts +302 -0
- package/src/Mcp.test.ts +254 -0
- package/src/Mcp.ts +195 -0
- package/src/Parser.test-d.ts +45 -0
- package/src/Parser.test.ts +118 -0
- package/src/Parser.ts +247 -0
- package/src/Register.ts +18 -0
- package/src/Schema.test.ts +125 -0
- package/src/Schema.ts +8 -0
- package/src/Skill.test.ts +293 -0
- package/src/Skill.ts +253 -0
- package/src/Skillgen.ts +66 -0
- package/src/SyncMcp.test.ts +75 -0
- package/src/SyncMcp.ts +132 -0
- package/src/SyncSkills.test.ts +92 -0
- package/src/SyncSkills.ts +205 -0
- package/src/Typegen.test.ts +150 -0
- package/src/Typegen.ts +107 -0
- package/src/bin.ts +33 -0
- package/src/e2e.test.ts +1710 -0
- package/src/index.ts +14 -0
- package/src/internal/pm.test.ts +38 -0
- package/src/internal/pm.ts +8 -0
- package/src/internal/types.ts +22 -0
- package/src/internal/utils.ts +50 -0
- package/src/tsconfig.json +8 -0
package/src/index.ts
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 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'
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { detectRunner } from './pm.js'
|
|
2
|
+
|
|
3
|
+
test('detects pnpm from user agent', () => {
|
|
4
|
+
const saved = process.env.npm_config_user_agent
|
|
5
|
+
process.env.npm_config_user_agent = 'pnpm/10.0.0 node/v22.0.0'
|
|
6
|
+
expect(detectRunner()).toBe('pnpx')
|
|
7
|
+
process.env.npm_config_user_agent = saved
|
|
8
|
+
})
|
|
9
|
+
|
|
10
|
+
test('detects bun from user agent', () => {
|
|
11
|
+
const savedAgent = process.env.npm_config_user_agent
|
|
12
|
+
const savedExec = process.env.npm_execpath
|
|
13
|
+
process.env.npm_config_user_agent = 'bun/1.0.0'
|
|
14
|
+
delete process.env.npm_execpath
|
|
15
|
+
expect(detectRunner()).toBe('bunx')
|
|
16
|
+
process.env.npm_config_user_agent = savedAgent
|
|
17
|
+
process.env.npm_execpath = savedExec
|
|
18
|
+
})
|
|
19
|
+
|
|
20
|
+
test('detects pnpm from exec path', () => {
|
|
21
|
+
const savedAgent = process.env.npm_config_user_agent
|
|
22
|
+
const savedExec = process.env.npm_execpath
|
|
23
|
+
delete process.env.npm_config_user_agent
|
|
24
|
+
process.env.npm_execpath = '/usr/local/lib/node_modules/pnpm/bin/pnpm.cjs'
|
|
25
|
+
expect(detectRunner()).toBe('pnpx')
|
|
26
|
+
process.env.npm_config_user_agent = savedAgent
|
|
27
|
+
process.env.npm_execpath = savedExec
|
|
28
|
+
})
|
|
29
|
+
|
|
30
|
+
test('falls back to npx', () => {
|
|
31
|
+
const savedAgent = process.env.npm_config_user_agent
|
|
32
|
+
const savedExec = process.env.npm_execpath
|
|
33
|
+
delete process.env.npm_config_user_agent
|
|
34
|
+
delete process.env.npm_execpath
|
|
35
|
+
expect(detectRunner()).toBe('npx')
|
|
36
|
+
process.env.npm_config_user_agent = savedAgent
|
|
37
|
+
process.env.npm_execpath = savedExec
|
|
38
|
+
})
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/** Detects the package manager runner (`npx`, `pnpx`, `bunx`) from the current process environment. */
|
|
2
|
+
export function detectRunner(): string {
|
|
3
|
+
const userAgent = process.env.npm_config_user_agent ?? ''
|
|
4
|
+
const execPath = process.env.npm_execpath ?? ''
|
|
5
|
+
if (userAgent.includes('pnpm') || execPath.includes('pnpm')) return 'pnpx'
|
|
6
|
+
if (userAgent.includes('bun') || execPath.includes('bun')) return 'bunx'
|
|
7
|
+
return 'npx'
|
|
8
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/** Combines members of an intersection into a readable type. */
|
|
2
|
+
export type Compute<type> = { [key in keyof type]: type[key] } & unknown
|
|
3
|
+
|
|
4
|
+
/** Collects all keys across every member of a union. */
|
|
5
|
+
export type KeyofUnion<type> = type extends type ? keyof type : never
|
|
6
|
+
|
|
7
|
+
/** Creates a mutually exclusive union where each variant's missing keys are `?: undefined`. */
|
|
8
|
+
export type OneOf<
|
|
9
|
+
union extends object,
|
|
10
|
+
fallback extends object | undefined = undefined,
|
|
11
|
+
keys extends KeyofUnion<union> = KeyofUnion<union>,
|
|
12
|
+
> = union extends infer item
|
|
13
|
+
? Compute<
|
|
14
|
+
item & {
|
|
15
|
+
[key in Exclude<keys, keyof item>]?: fallback extends object
|
|
16
|
+
? key extends keyof fallback
|
|
17
|
+
? fallback[key]
|
|
18
|
+
: undefined
|
|
19
|
+
: undefined
|
|
20
|
+
}
|
|
21
|
+
>
|
|
22
|
+
: never
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import fs from 'node:fs/promises'
|
|
2
|
+
import path from 'node:path'
|
|
3
|
+
import url from 'node:url'
|
|
4
|
+
|
|
5
|
+
import * as Cli from '../Cli.js'
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Dynamically imports a module and extracts its default-exported CLI instance.
|
|
9
|
+
* Temporarily replaces `process.argv` and `process.exit` to prevent imported
|
|
10
|
+
* modules that call `.serve()` at the top level from interfering.
|
|
11
|
+
*/
|
|
12
|
+
export async function importCli(input: string): Promise<Cli.Cli> {
|
|
13
|
+
const resolved = path.resolve(input)
|
|
14
|
+
const stat = await fs.stat(resolved)
|
|
15
|
+
const file = stat.isDirectory() ? await resolveEntry(resolved) : resolved
|
|
16
|
+
const href = url.pathToFileURL(file).href
|
|
17
|
+
|
|
18
|
+
const savedArgv = process.argv
|
|
19
|
+
const savedExit = process.exit
|
|
20
|
+
const savedWrite = process.stdout.write
|
|
21
|
+
process.argv = [savedArgv[0]!]
|
|
22
|
+
process.exit = (() => {}) as never
|
|
23
|
+
process.stdout.write = (() => true) as never
|
|
24
|
+
try {
|
|
25
|
+
const mod = await import(href)
|
|
26
|
+
const cli = mod.default as Cli.Cli
|
|
27
|
+
if (!cli || !Cli.toCommands.has(cli))
|
|
28
|
+
throw new Error(`Expected default export to be a \`Cli\` instance: ${input}`)
|
|
29
|
+
return cli
|
|
30
|
+
} finally {
|
|
31
|
+
process.argv = savedArgv
|
|
32
|
+
process.exit = savedExit
|
|
33
|
+
process.stdout.write = savedWrite
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/** Resolves the CLI entry file from a directory by checking `package.json` `bin`, then falling back to `cli.ts`. */
|
|
38
|
+
async function resolveEntry(dir: string): Promise<string> {
|
|
39
|
+
try {
|
|
40
|
+
const pkg = JSON.parse(await fs.readFile(path.join(dir, 'package.json'), 'utf8'))
|
|
41
|
+
if (pkg.bin) {
|
|
42
|
+
const entries = typeof pkg.bin === 'string' ? [pkg.bin] : (Object.values(pkg.bin) as string[])
|
|
43
|
+
const src = entries.find((e) => e.endsWith('.ts'))
|
|
44
|
+
const entry = src ?? entries[0]
|
|
45
|
+
if (entry) return path.join(dir, entry)
|
|
46
|
+
}
|
|
47
|
+
if (pkg.main) return path.join(dir, pkg.main)
|
|
48
|
+
} catch {}
|
|
49
|
+
return path.join(dir, 'cli.ts')
|
|
50
|
+
}
|