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/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
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "extends": "../tsconfig.base.json",
3
+ "compilerOptions": {
4
+ "types": ["node"]
5
+ },
6
+ "include": ["./**/*.ts"],
7
+ "exclude": ["./**/*.test.ts", "./**/*.test-d.ts"]
8
+ }