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
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
import { Cli, z } from 'incur'
|
|
2
|
+
|
|
3
|
+
const cli = Cli.create('npm', {
|
|
4
|
+
version: '10.9.2',
|
|
5
|
+
description: 'The package manager for JavaScript.',
|
|
6
|
+
sync: {
|
|
7
|
+
suggestions: ['install react as a dependency', 'check for outdated packages', 'audit my repo'],
|
|
8
|
+
},
|
|
9
|
+
})
|
|
10
|
+
|
|
11
|
+
cli.command('install', {
|
|
12
|
+
description: 'Install a package',
|
|
13
|
+
args: z.object({
|
|
14
|
+
package: z.string().optional().describe('Package name to install'),
|
|
15
|
+
}),
|
|
16
|
+
options: z.object({
|
|
17
|
+
saveDev: z.boolean().optional().describe('Save as dev dependency'),
|
|
18
|
+
saveExact: z.boolean().optional().describe('Save exact version'),
|
|
19
|
+
global: z.boolean().optional().describe('Install globally'),
|
|
20
|
+
}),
|
|
21
|
+
alias: { saveDev: 'D', global: 'g', saveExact: 'E' },
|
|
22
|
+
output: z.object({
|
|
23
|
+
added: z.number().describe('Number of packages added'),
|
|
24
|
+
removed: z.number().describe('Number of packages removed'),
|
|
25
|
+
changed: z.number().describe('Number of packages changed'),
|
|
26
|
+
packages: z.number().describe('Total packages in node_modules'),
|
|
27
|
+
}),
|
|
28
|
+
examples: [
|
|
29
|
+
{ args: { package: 'express' }, description: 'Install a package' },
|
|
30
|
+
{
|
|
31
|
+
args: { package: 'vitest' },
|
|
32
|
+
options: { saveDev: true },
|
|
33
|
+
description: 'Install as dev dependency',
|
|
34
|
+
},
|
|
35
|
+
{ options: { global: true }, args: { package: 'tsx' }, description: 'Install globally' },
|
|
36
|
+
],
|
|
37
|
+
run({ args }) {
|
|
38
|
+
if (!args.package) return { added: 120, removed: 0, changed: 0, packages: 450 }
|
|
39
|
+
return { added: 1, removed: 0, changed: 0, packages: 451 }
|
|
40
|
+
},
|
|
41
|
+
})
|
|
42
|
+
|
|
43
|
+
cli.command('info', {
|
|
44
|
+
description: 'View registry info for a package',
|
|
45
|
+
args: z.object({
|
|
46
|
+
package: z.string().describe('Package name'),
|
|
47
|
+
}),
|
|
48
|
+
output: z.object({
|
|
49
|
+
name: z.string(),
|
|
50
|
+
version: z.string().describe('Latest version'),
|
|
51
|
+
description: z.string(),
|
|
52
|
+
license: z.string(),
|
|
53
|
+
homepage: z.string(),
|
|
54
|
+
}),
|
|
55
|
+
examples: [{ args: { package: 'express' }, description: 'View info for express' }],
|
|
56
|
+
run({ args }) {
|
|
57
|
+
return {
|
|
58
|
+
name: args.package,
|
|
59
|
+
version: '4.21.2',
|
|
60
|
+
description: 'Fast, unopinionated, minimalist web framework',
|
|
61
|
+
license: 'MIT',
|
|
62
|
+
homepage: 'https://expressjs.com/',
|
|
63
|
+
}
|
|
64
|
+
},
|
|
65
|
+
})
|
|
66
|
+
|
|
67
|
+
cli.command('init', {
|
|
68
|
+
description: 'Create a package.json file',
|
|
69
|
+
options: z.object({
|
|
70
|
+
yes: z.boolean().describe('Skip prompts and use defaults'),
|
|
71
|
+
scope: z.string().optional().describe('Package scope'),
|
|
72
|
+
}),
|
|
73
|
+
alias: { yes: 'y' },
|
|
74
|
+
output: z.object({
|
|
75
|
+
created: z.string().describe('Path to created package.json'),
|
|
76
|
+
}),
|
|
77
|
+
examples: [{ options: { yes: true }, description: 'Create with defaults' }],
|
|
78
|
+
run() {
|
|
79
|
+
return { created: './package.json' }
|
|
80
|
+
},
|
|
81
|
+
})
|
|
82
|
+
|
|
83
|
+
cli.command('publish', {
|
|
84
|
+
description: 'Publish a package to the registry',
|
|
85
|
+
env: z.object({
|
|
86
|
+
NPM_TOKEN: z.string().optional().describe('Authentication token'),
|
|
87
|
+
NPM_REGISTRY: z.string().default('https://registry.npmjs.org').describe('Registry URL'),
|
|
88
|
+
}),
|
|
89
|
+
options: z.object({
|
|
90
|
+
tag: z.string().default('latest').describe('Distribution tag'),
|
|
91
|
+
access: z.enum(['public', 'restricted']).default('public').describe('Package access level'),
|
|
92
|
+
dryRun: z.boolean().describe('Report what would be published'),
|
|
93
|
+
otp: z.string().optional().describe('One-time password for 2FA'),
|
|
94
|
+
}),
|
|
95
|
+
output: z.object({
|
|
96
|
+
name: z.string(),
|
|
97
|
+
version: z.string(),
|
|
98
|
+
tag: z.string(),
|
|
99
|
+
}),
|
|
100
|
+
examples: [
|
|
101
|
+
{ description: 'Publish with latest tag' },
|
|
102
|
+
{ options: { tag: 'beta' }, description: 'Publish as beta' },
|
|
103
|
+
{ options: { dryRun: true }, description: 'Dry run' },
|
|
104
|
+
],
|
|
105
|
+
run({ options }) {
|
|
106
|
+
return { name: 'my-package', version: '1.0.0', tag: options.tag }
|
|
107
|
+
},
|
|
108
|
+
})
|
|
109
|
+
|
|
110
|
+
cli.command('run', {
|
|
111
|
+
description: 'Run a script defined in package.json',
|
|
112
|
+
args: z.object({
|
|
113
|
+
script: z.string().describe('Script name to run'),
|
|
114
|
+
}),
|
|
115
|
+
output: z.object({
|
|
116
|
+
script: z.string(),
|
|
117
|
+
exitCode: z.number(),
|
|
118
|
+
}),
|
|
119
|
+
examples: [
|
|
120
|
+
{ args: { script: 'test' }, description: 'Run tests' },
|
|
121
|
+
{ args: { script: 'build' }, description: 'Run build' },
|
|
122
|
+
],
|
|
123
|
+
run({ args }) {
|
|
124
|
+
return { script: args.script, exitCode: 0 }
|
|
125
|
+
},
|
|
126
|
+
})
|
|
127
|
+
|
|
128
|
+
cli.command('uninstall', {
|
|
129
|
+
description: 'Remove a package',
|
|
130
|
+
args: z.object({
|
|
131
|
+
package: z.string().describe('Package name to remove'),
|
|
132
|
+
}),
|
|
133
|
+
options: z.object({
|
|
134
|
+
global: z.boolean().describe('Remove global package'),
|
|
135
|
+
}),
|
|
136
|
+
alias: { global: 'g' },
|
|
137
|
+
output: z.object({
|
|
138
|
+
removed: z.number(),
|
|
139
|
+
packages: z.number().describe('Remaining packages'),
|
|
140
|
+
}),
|
|
141
|
+
examples: [{ args: { package: 'express' }, description: 'Remove a package' }],
|
|
142
|
+
run() {
|
|
143
|
+
return { removed: 1, packages: 449 }
|
|
144
|
+
},
|
|
145
|
+
})
|
|
146
|
+
|
|
147
|
+
cli.command('outdated', {
|
|
148
|
+
description: 'Check for outdated packages',
|
|
149
|
+
options: z.object({
|
|
150
|
+
global: z.boolean().describe('Check global packages'),
|
|
151
|
+
long: z.boolean().describe('Show extended information'),
|
|
152
|
+
}),
|
|
153
|
+
alias: { global: 'g', long: 'l' },
|
|
154
|
+
output: z.object({
|
|
155
|
+
packages: z.array(
|
|
156
|
+
z.object({
|
|
157
|
+
name: z.string(),
|
|
158
|
+
current: z.string(),
|
|
159
|
+
wanted: z.string(),
|
|
160
|
+
latest: z.string(),
|
|
161
|
+
}),
|
|
162
|
+
),
|
|
163
|
+
}),
|
|
164
|
+
examples: [
|
|
165
|
+
{ description: 'Check for outdated packages' },
|
|
166
|
+
{ options: { global: true }, description: 'Check global packages' },
|
|
167
|
+
],
|
|
168
|
+
run() {
|
|
169
|
+
return {
|
|
170
|
+
packages: [
|
|
171
|
+
{ name: 'express', current: '4.18.0', wanted: '4.21.2', latest: '4.21.2' },
|
|
172
|
+
{ name: 'typescript', current: '5.3.0', wanted: '5.7.3', latest: '5.7.3' },
|
|
173
|
+
],
|
|
174
|
+
}
|
|
175
|
+
},
|
|
176
|
+
})
|
|
177
|
+
|
|
178
|
+
cli.serve()
|
|
179
|
+
|
|
180
|
+
export default cli
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
#!/bin/sh
|
|
2
|
+
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
|
|
3
|
+
|
|
4
|
+
case `uname` in
|
|
5
|
+
*CYGWIN*|*MINGW*|*MSYS*)
|
|
6
|
+
if command -v cygpath > /dev/null 2>&1; then
|
|
7
|
+
basedir=`cygpath -w "$basedir"`
|
|
8
|
+
fi
|
|
9
|
+
;;
|
|
10
|
+
esac
|
|
11
|
+
|
|
12
|
+
if [ -z "$NODE_PATH" ]; then
|
|
13
|
+
export NODE_PATH="/home/runner/work/incur/incur/node_modules/.pnpm/node_modules"
|
|
14
|
+
else
|
|
15
|
+
export NODE_PATH="/home/runner/work/incur/incur/node_modules/.pnpm/node_modules:$NODE_PATH"
|
|
16
|
+
fi
|
|
17
|
+
if [ -x "$basedir/node" ]; then
|
|
18
|
+
exec "$basedir/node" "$basedir/../incur/src/bin.ts" "$@"
|
|
19
|
+
else
|
|
20
|
+
exec node "$basedir/../incur/src/bin.ts" "$@"
|
|
21
|
+
fi
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
#!/bin/sh
|
|
2
|
+
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
|
|
3
|
+
|
|
4
|
+
case `uname` in
|
|
5
|
+
*CYGWIN*|*MINGW*|*MSYS*)
|
|
6
|
+
if command -v cygpath > /dev/null 2>&1; then
|
|
7
|
+
basedir=`cygpath -w "$basedir"`
|
|
8
|
+
fi
|
|
9
|
+
;;
|
|
10
|
+
esac
|
|
11
|
+
|
|
12
|
+
if [ -z "$NODE_PATH" ]; then
|
|
13
|
+
export NODE_PATH="/home/runner/work/incur/incur/node_modules/.pnpm/tsx@4.21.0/node_modules/tsx/node_modules:/home/runner/work/incur/incur/node_modules/.pnpm/tsx@4.21.0/node_modules:/home/runner/work/incur/incur/node_modules/.pnpm/node_modules"
|
|
14
|
+
else
|
|
15
|
+
export NODE_PATH="/home/runner/work/incur/incur/node_modules/.pnpm/tsx@4.21.0/node_modules/tsx/node_modules:/home/runner/work/incur/incur/node_modules/.pnpm/tsx@4.21.0/node_modules:/home/runner/work/incur/incur/node_modules/.pnpm/node_modules:$NODE_PATH"
|
|
16
|
+
fi
|
|
17
|
+
if [ -x "$basedir/node" ]; then
|
|
18
|
+
exec "$basedir/node" "$basedir/../tsx/dist/cli.mjs" "$@"
|
|
19
|
+
else
|
|
20
|
+
exec node "$basedir/../tsx/dist/cli.mjs" "$@"
|
|
21
|
+
fi
|
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
import { Cli, z } from 'incur'
|
|
2
|
+
|
|
3
|
+
const cli = Cli.create('presto', {
|
|
4
|
+
version: '0.4.1',
|
|
5
|
+
description: 'A command-line HTTP client with built-in MPP payment support.',
|
|
6
|
+
})
|
|
7
|
+
|
|
8
|
+
// query (root-level URL request) — modeled as an explicit subcommand
|
|
9
|
+
cli.command('query', {
|
|
10
|
+
description: 'Make an HTTP request with optional payment',
|
|
11
|
+
args: z.object({
|
|
12
|
+
url: z.string().describe('URL to request'),
|
|
13
|
+
}),
|
|
14
|
+
options: z.object({
|
|
15
|
+
dryRun: z.boolean().optional().describe('Show what would be paid without executing'),
|
|
16
|
+
method: z.string().optional().describe('Custom request method (GET, POST, PUT, DELETE, ...)'),
|
|
17
|
+
header: z
|
|
18
|
+
.array(z.string())
|
|
19
|
+
.optional()
|
|
20
|
+
.describe("Add custom header (e.g. 'Accept: text/plain')"),
|
|
21
|
+
data: z.array(z.string()).optional().describe('POST data (use @filename or @- for stdin)'),
|
|
22
|
+
json: z.string().optional().describe('Send JSON data with Content-Type header'),
|
|
23
|
+
include: z.boolean().optional().describe('Include HTTP response headers in output'),
|
|
24
|
+
output: z.string().optional().describe('Write output to file'),
|
|
25
|
+
timeout: z.number().optional().describe('Maximum time for the request in seconds'),
|
|
26
|
+
noRedirect: z.boolean().optional().describe('Disable following redirects'),
|
|
27
|
+
network: z.string().optional().describe('Restrict to a specific network'),
|
|
28
|
+
}),
|
|
29
|
+
alias: {
|
|
30
|
+
method: 'X',
|
|
31
|
+
header: 'H',
|
|
32
|
+
data: 'd',
|
|
33
|
+
include: 'i',
|
|
34
|
+
output: 'o',
|
|
35
|
+
timeout: 'm',
|
|
36
|
+
network: 'n',
|
|
37
|
+
},
|
|
38
|
+
examples: [
|
|
39
|
+
{ args: { url: 'https://api.example.com/data' }, description: 'Simple GET' },
|
|
40
|
+
{
|
|
41
|
+
args: { url: 'https://api.example.com/data' },
|
|
42
|
+
options: { method: 'POST', json: '{"key":"value"}' },
|
|
43
|
+
description: 'POST with JSON body',
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
args: { url: 'https://api.example.com/data' },
|
|
47
|
+
options: { dryRun: true },
|
|
48
|
+
description: 'Preview payment without executing',
|
|
49
|
+
},
|
|
50
|
+
],
|
|
51
|
+
run({ error }) {
|
|
52
|
+
const loggedIn = true
|
|
53
|
+
if (!loggedIn)
|
|
54
|
+
return error({
|
|
55
|
+
code: 'NOT_AUTHENTICATED',
|
|
56
|
+
message: 'No wallet connected. Log in first.',
|
|
57
|
+
retryable: true,
|
|
58
|
+
cta: {
|
|
59
|
+
description: 'To authenticate:',
|
|
60
|
+
commands: [{ command: 'login', description: 'Sign up or log in to your Tempo wallet' }],
|
|
61
|
+
},
|
|
62
|
+
})
|
|
63
|
+
return {
|
|
64
|
+
id: 'chatcmpl-abc123',
|
|
65
|
+
object: 'chat.completion',
|
|
66
|
+
model: 'gpt-4o-mini',
|
|
67
|
+
choices: [
|
|
68
|
+
{
|
|
69
|
+
index: 0,
|
|
70
|
+
message: { role: 'assistant', content: 'Hello! How can I help you today?' },
|
|
71
|
+
finish_reason: 'stop',
|
|
72
|
+
},
|
|
73
|
+
],
|
|
74
|
+
usage: { prompt_tokens: 8, completion_tokens: 9, total_tokens: 17 },
|
|
75
|
+
}
|
|
76
|
+
},
|
|
77
|
+
})
|
|
78
|
+
|
|
79
|
+
cli.command('login', {
|
|
80
|
+
description: 'Sign up or log in to your Tempo wallet',
|
|
81
|
+
run({ ok }) {
|
|
82
|
+
return ok(
|
|
83
|
+
{ status: 'logged_in' },
|
|
84
|
+
{
|
|
85
|
+
cta: {
|
|
86
|
+
description: 'Next steps:',
|
|
87
|
+
commands: [
|
|
88
|
+
{ command: 'whoami', description: 'Check your wallet address and balances' },
|
|
89
|
+
{
|
|
90
|
+
command: 'query',
|
|
91
|
+
args: { url: 'https://api.example.com/data' },
|
|
92
|
+
description: 'Make your first paid request',
|
|
93
|
+
},
|
|
94
|
+
],
|
|
95
|
+
},
|
|
96
|
+
},
|
|
97
|
+
)
|
|
98
|
+
},
|
|
99
|
+
})
|
|
100
|
+
|
|
101
|
+
cli.command('logout', {
|
|
102
|
+
description: 'Log out and disconnect your wallet',
|
|
103
|
+
options: z.object({
|
|
104
|
+
yes: z.boolean().optional().describe('Skip confirmation prompt'),
|
|
105
|
+
}),
|
|
106
|
+
run() {
|
|
107
|
+
return { status: 'logged_out' }
|
|
108
|
+
},
|
|
109
|
+
})
|
|
110
|
+
|
|
111
|
+
cli.command('whoami', {
|
|
112
|
+
description: 'Show wallet address, balances, and access keys',
|
|
113
|
+
output: z.object({
|
|
114
|
+
address: z.string(),
|
|
115
|
+
balances: z.array(
|
|
116
|
+
z.object({
|
|
117
|
+
network: z.string(),
|
|
118
|
+
amount: z.string(),
|
|
119
|
+
}),
|
|
120
|
+
),
|
|
121
|
+
}),
|
|
122
|
+
run() {
|
|
123
|
+
return {
|
|
124
|
+
address: '0x1234...abcd',
|
|
125
|
+
balances: [{ network: 'tempo', amount: '100.00 TEMPO' }],
|
|
126
|
+
}
|
|
127
|
+
},
|
|
128
|
+
})
|
|
129
|
+
|
|
130
|
+
// session subcommand group
|
|
131
|
+
const session = Cli.create('session', { description: 'Manage payment sessions' })
|
|
132
|
+
|
|
133
|
+
session.command('list', {
|
|
134
|
+
description: 'List active payment sessions',
|
|
135
|
+
options: z.object({
|
|
136
|
+
all: z.boolean().optional().describe('Show all channels: active, orphaned, and closing'),
|
|
137
|
+
orphaned: z.boolean().optional().describe('Scan on-chain for orphaned channels'),
|
|
138
|
+
closed: z.boolean().optional().describe('Show channels pending finalization'),
|
|
139
|
+
network: z.string().optional().describe('Filter by network'),
|
|
140
|
+
}),
|
|
141
|
+
run() {
|
|
142
|
+
return { sessions: [] }
|
|
143
|
+
},
|
|
144
|
+
})
|
|
145
|
+
|
|
146
|
+
session.command('close', {
|
|
147
|
+
description: 'Close a payment session',
|
|
148
|
+
args: z.object({
|
|
149
|
+
url: z.string().optional().describe('URL, origin, or channel ID (0x...) to close'),
|
|
150
|
+
}),
|
|
151
|
+
options: z.object({
|
|
152
|
+
all: z.boolean().optional().describe('Close all active sessions'),
|
|
153
|
+
orphaned: z.boolean().optional().describe('Close only orphaned on-chain channels'),
|
|
154
|
+
closed: z.boolean().optional().describe('Finalize channels pending close'),
|
|
155
|
+
}),
|
|
156
|
+
run({ ok }) {
|
|
157
|
+
return ok(
|
|
158
|
+
{ closed: true },
|
|
159
|
+
{
|
|
160
|
+
cta: {
|
|
161
|
+
description: 'Suggested commands:',
|
|
162
|
+
commands: [
|
|
163
|
+
{ command: 'session list', description: 'View remaining sessions' },
|
|
164
|
+
{ command: 'whoami', description: 'Check updated balances' },
|
|
165
|
+
],
|
|
166
|
+
},
|
|
167
|
+
},
|
|
168
|
+
)
|
|
169
|
+
},
|
|
170
|
+
})
|
|
171
|
+
|
|
172
|
+
session.command('recover', {
|
|
173
|
+
description: 'Recover a session from on-chain state',
|
|
174
|
+
run() {
|
|
175
|
+
return { recovered: true }
|
|
176
|
+
},
|
|
177
|
+
})
|
|
178
|
+
|
|
179
|
+
cli.command(session)
|
|
180
|
+
|
|
181
|
+
// key subcommand group
|
|
182
|
+
const key = Cli.create('key', { description: 'Manage access keys' })
|
|
183
|
+
|
|
184
|
+
key.command('list', {
|
|
185
|
+
description: 'List all access keys and their spending limits',
|
|
186
|
+
run() {
|
|
187
|
+
return { keys: [] }
|
|
188
|
+
},
|
|
189
|
+
})
|
|
190
|
+
|
|
191
|
+
key.command('create', {
|
|
192
|
+
description: 'Create a new access key for a local wallet',
|
|
193
|
+
options: z.object({
|
|
194
|
+
name: z.string().optional().describe('Wallet name'),
|
|
195
|
+
}),
|
|
196
|
+
run() {
|
|
197
|
+
return { created: true }
|
|
198
|
+
},
|
|
199
|
+
})
|
|
200
|
+
|
|
201
|
+
cli.command(key)
|
|
202
|
+
|
|
203
|
+
// wallet subcommand group
|
|
204
|
+
const wallet = Cli.create('wallet', { description: 'Manage wallets' })
|
|
205
|
+
|
|
206
|
+
wallet.command('create', {
|
|
207
|
+
description: 'Create a new wallet',
|
|
208
|
+
options: z.object({
|
|
209
|
+
name: z.string().optional().describe('Name for the wallet'),
|
|
210
|
+
passkey: z.boolean().optional().describe('Create a passkey-based wallet via browser auth'),
|
|
211
|
+
}),
|
|
212
|
+
run() {
|
|
213
|
+
return { created: true }
|
|
214
|
+
},
|
|
215
|
+
})
|
|
216
|
+
|
|
217
|
+
wallet.command('import', {
|
|
218
|
+
description: 'Import an existing private key as a local wallet',
|
|
219
|
+
options: z.object({
|
|
220
|
+
name: z.string().optional().describe('Name for the wallet'),
|
|
221
|
+
stdinKey: z.boolean().optional().describe('Read the private key from stdin'),
|
|
222
|
+
}),
|
|
223
|
+
run() {
|
|
224
|
+
return { imported: true }
|
|
225
|
+
},
|
|
226
|
+
})
|
|
227
|
+
|
|
228
|
+
wallet.command('delete', {
|
|
229
|
+
description: 'Delete a wallet',
|
|
230
|
+
args: z.object({
|
|
231
|
+
name: z.string().optional().describe('Wallet name to delete'),
|
|
232
|
+
}),
|
|
233
|
+
options: z.object({
|
|
234
|
+
passkey: z.boolean().optional().describe('Delete the passkey wallet'),
|
|
235
|
+
yes: z.boolean().optional().describe('Skip confirmation prompt'),
|
|
236
|
+
}),
|
|
237
|
+
run() {
|
|
238
|
+
return { deleted: true }
|
|
239
|
+
},
|
|
240
|
+
})
|
|
241
|
+
|
|
242
|
+
cli.command(wallet)
|
|
243
|
+
|
|
244
|
+
cli.serve()
|
|
245
|
+
|
|
246
|
+
export default cli
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
#!/bin/sh
|
|
2
|
+
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
|
|
3
|
+
|
|
4
|
+
case `uname` in
|
|
5
|
+
*CYGWIN*|*MINGW*|*MSYS*)
|
|
6
|
+
if command -v cygpath > /dev/null 2>&1; then
|
|
7
|
+
basedir=`cygpath -w "$basedir"`
|
|
8
|
+
fi
|
|
9
|
+
;;
|
|
10
|
+
esac
|
|
11
|
+
|
|
12
|
+
if [ -z "$NODE_PATH" ]; then
|
|
13
|
+
export NODE_PATH="/home/runner/work/incur/incur/node_modules/.pnpm/node_modules"
|
|
14
|
+
else
|
|
15
|
+
export NODE_PATH="/home/runner/work/incur/incur/node_modules/.pnpm/node_modules:$NODE_PATH"
|
|
16
|
+
fi
|
|
17
|
+
if [ -x "$basedir/node" ]; then
|
|
18
|
+
exec "$basedir/node" "$basedir/../incur/src/bin.ts" "$@"
|
|
19
|
+
else
|
|
20
|
+
exec node "$basedir/../incur/src/bin.ts" "$@"
|
|
21
|
+
fi
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
#!/bin/sh
|
|
2
|
+
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
|
|
3
|
+
|
|
4
|
+
case `uname` in
|
|
5
|
+
*CYGWIN*|*MINGW*|*MSYS*)
|
|
6
|
+
if command -v cygpath > /dev/null 2>&1; then
|
|
7
|
+
basedir=`cygpath -w "$basedir"`
|
|
8
|
+
fi
|
|
9
|
+
;;
|
|
10
|
+
esac
|
|
11
|
+
|
|
12
|
+
if [ -z "$NODE_PATH" ]; then
|
|
13
|
+
export NODE_PATH="/home/runner/work/incur/incur/node_modules/.pnpm/tsx@4.21.0/node_modules/tsx/node_modules:/home/runner/work/incur/incur/node_modules/.pnpm/tsx@4.21.0/node_modules:/home/runner/work/incur/incur/node_modules/.pnpm/node_modules"
|
|
14
|
+
else
|
|
15
|
+
export NODE_PATH="/home/runner/work/incur/incur/node_modules/.pnpm/tsx@4.21.0/node_modules/tsx/node_modules:/home/runner/work/incur/incur/node_modules/.pnpm/tsx@4.21.0/node_modules:/home/runner/work/incur/incur/node_modules/.pnpm/node_modules:$NODE_PATH"
|
|
16
|
+
fi
|
|
17
|
+
if [ -x "$basedir/node" ]; then
|
|
18
|
+
exec "$basedir/node" "$basedir/../tsx/dist/cli.mjs" "$@"
|
|
19
|
+
else
|
|
20
|
+
exec node "$basedir/../tsx/dist/cli.mjs" "$@"
|
|
21
|
+
fi
|
package/package.json
CHANGED
|
@@ -1,4 +1,55 @@
|
|
|
1
1
|
{
|
|
2
|
+
"devDependencies": {
|
|
3
|
+
"@changesets/cli": "latest",
|
|
4
|
+
"@types/node": "latest",
|
|
5
|
+
"oxfmt": "^0.35.0",
|
|
6
|
+
"oxlint": "^1.50.0",
|
|
7
|
+
"tsx": "^4.21.0",
|
|
8
|
+
"typescript": "latest",
|
|
9
|
+
"vitest": "latest",
|
|
10
|
+
"zile": "latest"
|
|
11
|
+
},
|
|
12
|
+
"[!start-pkg]": "",
|
|
2
13
|
"name": "incur",
|
|
3
|
-
"
|
|
4
|
-
|
|
14
|
+
"type": "module",
|
|
15
|
+
"version": "0.0.2",
|
|
16
|
+
"license": "MIT",
|
|
17
|
+
"files": [
|
|
18
|
+
"examples",
|
|
19
|
+
"dist",
|
|
20
|
+
"src",
|
|
21
|
+
"SKILL.md"
|
|
22
|
+
],
|
|
23
|
+
"dependencies": {
|
|
24
|
+
"@modelcontextprotocol/sdk": "^1.27.1",
|
|
25
|
+
"@toon-format/toon": "^2.1.0",
|
|
26
|
+
"yaml": "^2.8.2",
|
|
27
|
+
"zod": "^4.3.6"
|
|
28
|
+
},
|
|
29
|
+
"sideEffects": false,
|
|
30
|
+
"bin": {
|
|
31
|
+
"incur": "./dist/bin.js",
|
|
32
|
+
"incur.src": "./src/bin.ts"
|
|
33
|
+
},
|
|
34
|
+
"main": "./dist/index.js",
|
|
35
|
+
"module": "./dist/index.js",
|
|
36
|
+
"types": "./dist/index.d.ts",
|
|
37
|
+
"exports": {
|
|
38
|
+
".": {
|
|
39
|
+
"types": "./dist/index.d.ts",
|
|
40
|
+
"src": "./src/index.ts",
|
|
41
|
+
"default": "./dist/index.js"
|
|
42
|
+
}
|
|
43
|
+
},
|
|
44
|
+
"scripts": {
|
|
45
|
+
"build": "zile",
|
|
46
|
+
"changeset:publish": "zile publish:prepare && changeset publish && zile publish:post",
|
|
47
|
+
"changeset:version": "changeset version",
|
|
48
|
+
"check": "oxlint --fix --ignore-pattern package.json && oxfmt",
|
|
49
|
+
"check:types": "tsc -b",
|
|
50
|
+
"incur": "node --import tsx src/bin.ts",
|
|
51
|
+
"cli:skills": "pnpm incur skills add",
|
|
52
|
+
"dev": "zile dev",
|
|
53
|
+
"test": "vitest"
|
|
54
|
+
}
|
|
55
|
+
}
|