usepaso 0.3.1 → 0.4.1
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/README.md +29 -9
- package/dist/cli.js +42 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/connect.d.ts +4 -0
- package/dist/commands/connect.d.ts.map +1 -0
- package/dist/commands/connect.js +199 -0
- package/dist/commands/connect.js.map +1 -0
- package/dist/commands/doctor.d.ts +3 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +134 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +177 -11
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/inspect.d.ts.map +1 -1
- package/dist/commands/inspect.js +14 -7
- package/dist/commands/inspect.js.map +1 -1
- package/dist/commands/serve.d.ts.map +1 -1
- package/dist/commands/serve.js +25 -7
- package/dist/commands/serve.js.map +1 -1
- package/dist/commands/shared.d.ts +2 -1
- package/dist/commands/shared.d.ts.map +1 -1
- package/dist/commands/shared.js +20 -27
- package/dist/commands/shared.js.map +1 -1
- package/dist/commands/test.d.ts +0 -1
- package/dist/commands/test.d.ts.map +1 -1
- package/dist/commands/test.js +63 -39
- package/dist/commands/test.js.map +1 -1
- package/dist/commands/validate.d.ts.map +1 -1
- package/dist/commands/validate.js +44 -3
- package/dist/commands/validate.js.map +1 -1
- package/dist/executor.d.ts +15 -0
- package/dist/executor.d.ts.map +1 -1
- package/dist/executor.js +102 -5
- package/dist/executor.js.map +1 -1
- package/dist/generators/mcp.d.ts +11 -3
- package/dist/generators/mcp.d.ts.map +1 -1
- package/dist/generators/mcp.js +210 -30
- package/dist/generators/mcp.js.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/openapi.d.ts +1 -1
- package/dist/openapi.d.ts.map +1 -1
- package/dist/openapi.js +4 -4
- package/dist/openapi.js.map +1 -1
- package/dist/parser.d.ts.map +1 -1
- package/dist/parser.js +15 -0
- package/dist/parser.js.map +1 -1
- package/dist/utils/coerce.d.ts +2 -0
- package/dist/utils/coerce.d.ts.map +1 -0
- package/dist/utils/coerce.js +33 -0
- package/dist/utils/coerce.js.map +1 -0
- package/dist/utils/color.d.ts +19 -0
- package/dist/utils/color.d.ts.map +1 -0
- package/dist/utils/color.js +46 -0
- package/dist/utils/color.js.map +1 -0
- package/dist/utils/env.d.ts +17 -0
- package/dist/utils/env.d.ts.map +1 -0
- package/dist/utils/env.js +73 -0
- package/dist/utils/env.js.map +1 -0
- package/dist/utils/redact.d.ts +6 -0
- package/dist/utils/redact.d.ts.map +1 -0
- package/dist/utils/redact.js +37 -0
- package/dist/utils/redact.js.map +1 -0
- package/dist/validator.d.ts.map +1 -1
- package/dist/validator.js +82 -4
- package/dist/validator.js.map +1 -1
- package/package.json +2 -10
package/dist/commands/init.js
CHANGED
|
@@ -5,7 +5,106 @@ const path_1 = require("path");
|
|
|
5
5
|
const fs_1 = require("fs");
|
|
6
6
|
const openapi_1 = require("../openapi");
|
|
7
7
|
const yaml_1 = require("yaml");
|
|
8
|
-
const
|
|
8
|
+
const color_1 = require("../utils/color");
|
|
9
|
+
const env_1 = require("../utils/env");
|
|
10
|
+
const MAX_SPEC_SIZE = 50 * 1024 * 1024; // 50MB
|
|
11
|
+
const ENV_EXAMPLE = `# paso auth token. Never commit .env to version control.
|
|
12
|
+
USEPASO_AUTH_TOKEN=your-token-here
|
|
13
|
+
`;
|
|
14
|
+
function scaffoldEnv(outDir) {
|
|
15
|
+
const examplePath = (0, path_1.join)(outDir, '.env.example');
|
|
16
|
+
if (!(0, fs_1.existsSync)(examplePath)) {
|
|
17
|
+
(0, fs_1.writeFileSync)(examplePath, ENV_EXAMPLE, 'utf-8');
|
|
18
|
+
}
|
|
19
|
+
(0, env_1.ensureGitignore)(outDir);
|
|
20
|
+
}
|
|
21
|
+
const FALLBACK_TEMPLATE = `# yaml-language-server: $schema=https://raw.githubusercontent.com/5h1vmani/usepaso/main/spec/usepaso.schema.json\nversion: "1.0"\n\nservice:\n name: __SERVICE_NAME__\n description: TODO: describe what your service does\n base_url: https://api.example.com\n auth:\n type: bearer\n\ncapabilities:\n - name: example_action\n description: TODO: describe what this action does\n method: GET\n path: /example\n permission: read\n inputs:\n id:\n type: string\n required: true\n description: TODO: describe this parameter\n in: query\n output:\n result:\n type: string\n description: TODO: describe the output\n\npermissions:\n read:\n - example_action\n`;
|
|
22
|
+
const EXAMPLE_TEMPLATE = `# A working example using JSONPlaceholder (free, public, no auth).
|
|
23
|
+
# Run "usepaso validate" and "usepaso serve" right now. No edits needed.
|
|
24
|
+
# When you are ready, replace the values below with your own API.
|
|
25
|
+
|
|
26
|
+
version: "1.0"
|
|
27
|
+
|
|
28
|
+
service:
|
|
29
|
+
name: JSONPlaceholder
|
|
30
|
+
description: Free fake REST API for testing and prototyping
|
|
31
|
+
base_url: https://jsonplaceholder.typicode.com
|
|
32
|
+
auth:
|
|
33
|
+
type: none # Explicit. Change to "bearer" when you connect a real API.
|
|
34
|
+
|
|
35
|
+
capabilities:
|
|
36
|
+
# A read capability with a query parameter filter
|
|
37
|
+
- name: list_posts
|
|
38
|
+
description: List all posts, optionally filtered by author
|
|
39
|
+
method: GET
|
|
40
|
+
path: /posts
|
|
41
|
+
permission: read
|
|
42
|
+
inputs:
|
|
43
|
+
userId:
|
|
44
|
+
type: integer
|
|
45
|
+
description: Filter posts by this author ID
|
|
46
|
+
in: query
|
|
47
|
+
|
|
48
|
+
# A read capability with a path parameter
|
|
49
|
+
- name: get_post
|
|
50
|
+
description: Get a single post by ID
|
|
51
|
+
method: GET
|
|
52
|
+
path: /posts/{id}
|
|
53
|
+
permission: read
|
|
54
|
+
inputs:
|
|
55
|
+
id:
|
|
56
|
+
type: integer
|
|
57
|
+
required: true
|
|
58
|
+
description: The post ID
|
|
59
|
+
in: path
|
|
60
|
+
|
|
61
|
+
# A write capability with a request body
|
|
62
|
+
- name: create_post
|
|
63
|
+
description: Create a new post
|
|
64
|
+
method: POST
|
|
65
|
+
path: /posts
|
|
66
|
+
permission: write
|
|
67
|
+
inputs:
|
|
68
|
+
title:
|
|
69
|
+
type: string
|
|
70
|
+
required: true
|
|
71
|
+
description: Post title
|
|
72
|
+
in: body
|
|
73
|
+
body:
|
|
74
|
+
type: string
|
|
75
|
+
required: true
|
|
76
|
+
description: Post content
|
|
77
|
+
in: body
|
|
78
|
+
userId:
|
|
79
|
+
type: integer
|
|
80
|
+
required: true
|
|
81
|
+
description: Author ID
|
|
82
|
+
in: body
|
|
83
|
+
|
|
84
|
+
# A destructive action. consent_required means the agent must ask the user first.
|
|
85
|
+
- name: delete_post
|
|
86
|
+
description: Delete a post permanently
|
|
87
|
+
method: DELETE
|
|
88
|
+
path: /posts/{id}
|
|
89
|
+
permission: write
|
|
90
|
+
consent_required: true
|
|
91
|
+
inputs:
|
|
92
|
+
id:
|
|
93
|
+
type: integer
|
|
94
|
+
required: true
|
|
95
|
+
description: The post ID to delete
|
|
96
|
+
in: path
|
|
97
|
+
|
|
98
|
+
# Permission groups control which capabilities agents can access.
|
|
99
|
+
# "read" actions are safe. "write" actions modify data.
|
|
100
|
+
permissions:
|
|
101
|
+
read:
|
|
102
|
+
- list_posts
|
|
103
|
+
- get_post
|
|
104
|
+
write:
|
|
105
|
+
- create_post
|
|
106
|
+
- delete_post
|
|
107
|
+
`;
|
|
9
108
|
function loadTemplate() {
|
|
10
109
|
const candidates = [
|
|
11
110
|
(0, path_1.join)(__dirname, '..', '..', '..', '..', 'examples', 'template', 'usepaso.yaml'),
|
|
@@ -23,13 +122,20 @@ function registerInit(program) {
|
|
|
23
122
|
.command('init')
|
|
24
123
|
.description('Create a usepaso.yaml template in the current directory')
|
|
25
124
|
.option('-n, --name <name>', 'Service name')
|
|
125
|
+
.option('--blank', 'Generate a blank template (instead of the default working example)')
|
|
126
|
+
.option('--example', 'Generate a working example using JSONPlaceholder (same as default)')
|
|
26
127
|
.option('--from-openapi <path>', 'Generate from an OpenAPI 3.x spec (JSON, YAML, or URL)')
|
|
128
|
+
.option('--max-capabilities <n>', 'Max capabilities to generate from OpenAPI (default: 20)', '20')
|
|
27
129
|
.action(async (opts) => {
|
|
28
130
|
const outPath = (0, path_1.resolve)('usepaso.yaml');
|
|
29
131
|
if ((0, fs_1.existsSync)(outPath)) {
|
|
30
132
|
console.error('usepaso.yaml already exists in this directory.');
|
|
31
133
|
process.exit(1);
|
|
32
134
|
}
|
|
135
|
+
if (opts.blank && opts.fromOpenapi) {
|
|
136
|
+
console.error('Cannot use --blank and --from-openapi together.');
|
|
137
|
+
process.exit(1);
|
|
138
|
+
}
|
|
33
139
|
if (opts.fromOpenapi) {
|
|
34
140
|
const source = opts.fromOpenapi;
|
|
35
141
|
try {
|
|
@@ -40,7 +146,34 @@ function registerInit(program) {
|
|
|
40
146
|
console.error(`Failed to fetch OpenAPI spec: ${res.status} ${res.statusText}`);
|
|
41
147
|
process.exit(1);
|
|
42
148
|
}
|
|
43
|
-
|
|
149
|
+
// Fast reject if Content-Length exceeds limit
|
|
150
|
+
const contentLength = res.headers.get('content-length');
|
|
151
|
+
if (contentLength && parseInt(contentLength, 10) > MAX_SPEC_SIZE) {
|
|
152
|
+
const sizeMb = Math.round(parseInt(contentLength, 10) / 1024 / 1024);
|
|
153
|
+
console.error(`OpenAPI spec exceeds 50MB limit (${sizeMb}MB). Check the URL or use a local file.`);
|
|
154
|
+
process.exit(1);
|
|
155
|
+
}
|
|
156
|
+
// Stream with size guard (servers can omit or lie about Content-Length)
|
|
157
|
+
const reader = res.body?.getReader();
|
|
158
|
+
if (!reader) {
|
|
159
|
+
console.error('Failed to read response body.');
|
|
160
|
+
process.exit(1);
|
|
161
|
+
}
|
|
162
|
+
const chunks = [];
|
|
163
|
+
let totalBytes = 0;
|
|
164
|
+
while (true) {
|
|
165
|
+
const { done, value } = await reader.read();
|
|
166
|
+
if (done)
|
|
167
|
+
break;
|
|
168
|
+
totalBytes += value.byteLength;
|
|
169
|
+
if (totalBytes > MAX_SPEC_SIZE) {
|
|
170
|
+
reader.cancel();
|
|
171
|
+
console.error(`OpenAPI spec exceeds 50MB limit. Check the URL or use a local file.`);
|
|
172
|
+
process.exit(1);
|
|
173
|
+
}
|
|
174
|
+
chunks.push(value);
|
|
175
|
+
}
|
|
176
|
+
specContent = Buffer.concat(chunks).toString('utf-8');
|
|
44
177
|
}
|
|
45
178
|
else {
|
|
46
179
|
const specPath = (0, path_1.resolve)(source);
|
|
@@ -57,16 +190,27 @@ function registerInit(program) {
|
|
|
57
190
|
catch {
|
|
58
191
|
spec = (0, yaml_1.parse)(specContent);
|
|
59
192
|
}
|
|
60
|
-
const
|
|
193
|
+
const maxCaps = parseInt(opts.maxCapabilities, 10);
|
|
194
|
+
if (isNaN(maxCaps) || maxCaps < 1) {
|
|
195
|
+
console.error('--max-capabilities must be a positive integer.');
|
|
196
|
+
process.exit(1);
|
|
197
|
+
}
|
|
198
|
+
const result = (0, openapi_1.generateFromOpenApi)(spec, maxCaps);
|
|
61
199
|
(0, fs_1.writeFileSync)(outPath, result.yaml, 'utf-8');
|
|
62
|
-
|
|
63
|
-
console.log(`
|
|
200
|
+
scaffoldEnv((0, path_1.dirname)(outPath));
|
|
201
|
+
console.log((0, color_1.green)(`Generated usepaso.yaml from ${source}`));
|
|
202
|
+
console.log(` Service: ${(0, color_1.cyan)(result.serviceName)}`);
|
|
64
203
|
console.log(` Capabilities: ${result.generatedCount} (${result.readCount} read, ${result.writeCount} write, ${result.adminCount} admin)`);
|
|
65
204
|
console.log(` Auth: ${result.authType}`);
|
|
66
205
|
if (result.totalOperations > result.generatedCount) {
|
|
67
206
|
console.log(` Note: ${result.totalOperations} operations found, capped at ${result.generatedCount}. Edit usepaso.yaml to add more.`);
|
|
68
207
|
}
|
|
69
|
-
console.log('
|
|
208
|
+
console.log('');
|
|
209
|
+
console.log((0, color_1.dim)('Next steps:'));
|
|
210
|
+
console.log((0, color_1.dim)(" 1. Review the generated capabilities. Remove any you don't want exposed"));
|
|
211
|
+
console.log((0, color_1.dim)(' 2. usepaso validate Check for issues'));
|
|
212
|
+
console.log((0, color_1.dim)(' 3. usepaso test --dry-run Preview what agents will see'));
|
|
213
|
+
console.log((0, color_1.dim)(' 4. usepaso serve Start the MCP server'));
|
|
70
214
|
}
|
|
71
215
|
catch (err) {
|
|
72
216
|
console.error(`Failed to convert OpenAPI spec: ${err instanceof Error ? err.message : err}`);
|
|
@@ -74,11 +218,33 @@ function registerInit(program) {
|
|
|
74
218
|
}
|
|
75
219
|
return;
|
|
76
220
|
}
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
221
|
+
if (opts.blank || opts.name) {
|
|
222
|
+
const name = opts.name || 'MyService';
|
|
223
|
+
const template = loadTemplate().replaceAll('__SERVICE_NAME__', name);
|
|
224
|
+
(0, fs_1.writeFileSync)(outPath, template, 'utf-8');
|
|
225
|
+
scaffoldEnv((0, path_1.dirname)(outPath));
|
|
226
|
+
console.log((0, color_1.green)(`Created usepaso.yaml for "${name}".`));
|
|
227
|
+
console.log('');
|
|
228
|
+
console.log((0, color_1.dim)('Next steps:'));
|
|
229
|
+
console.log((0, color_1.dim)(' 1. Declare your capabilities in usepaso.yaml'));
|
|
230
|
+
console.log((0, color_1.dim)(' 2. Copy .env.example to .env and add your API token'));
|
|
231
|
+
console.log((0, color_1.dim)(' 3. usepaso validate Check for issues'));
|
|
232
|
+
console.log((0, color_1.dim)(' 4. usepaso test --dry-run Preview what agents will see'));
|
|
233
|
+
console.log((0, color_1.dim)(' 5. usepaso serve Start the MCP server'));
|
|
234
|
+
return;
|
|
235
|
+
}
|
|
236
|
+
// Default: working example (JSONPlaceholder)
|
|
237
|
+
(0, fs_1.writeFileSync)(outPath, EXAMPLE_TEMPLATE, 'utf-8');
|
|
238
|
+
console.log((0, color_1.green)('Created usepaso.yaml with a working JSONPlaceholder example.'));
|
|
239
|
+
console.log((0, color_1.dim)('No auth needed. No edits needed. Try it now:'));
|
|
240
|
+
console.log('');
|
|
241
|
+
console.log((0, color_1.dim)(' usepaso validate'));
|
|
242
|
+
console.log((0, color_1.dim)(' usepaso test list_posts --dry-run'));
|
|
243
|
+
console.log((0, color_1.dim)(' usepaso test get_post --param id=1 --dry-run'));
|
|
244
|
+
console.log((0, color_1.dim)(' usepaso serve'));
|
|
245
|
+
console.log((0, color_1.dim)(' usepaso connect cursor Wire up your IDE'));
|
|
246
|
+
console.log('');
|
|
247
|
+
console.log((0, color_1.dim)('When you are ready, replace the JSONPlaceholder values with your own API.'));
|
|
82
248
|
});
|
|
83
249
|
}
|
|
84
250
|
//# sourceMappingURL=init.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":";;AA4HA,oCAwJC;AAnRD,+BAA8C;AAC9C,2BAA6D;AAC7D,wCAAiD;AACjD,+BAA0C;AAC1C,0CAAkD;AAClD,sCAA+C;AAE/C,MAAM,aAAa,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,OAAO;AAE/C,MAAM,WAAW,GAAG;;CAEnB,CAAC;AAEF,SAAS,WAAW,CAAC,MAAc;IACjC,MAAM,WAAW,GAAG,IAAA,WAAI,EAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IACjD,IAAI,CAAC,IAAA,eAAU,EAAC,WAAW,CAAC,EAAE,CAAC;QAC7B,IAAA,kBAAa,EAAC,WAAW,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;IACnD,CAAC;IACD,IAAA,qBAAe,EAAC,MAAM,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,iBAAiB,GAAG,2tBAA2tB,CAAC;AAEtvB,MAAM,gBAAgB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqFxB,CAAC;AAEF,SAAS,YAAY;IACnB,MAAM,UAAU,GAAG;QACjB,IAAA,WAAI,EAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,cAAc,CAAC;QAC/E,IAAA,WAAI,EAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,cAAc,CAAC;KAC1E,CAAC;IACF,KAAK,MAAM,EAAE,IAAI,UAAU,EAAE,CAAC;QAC5B,IAAI,IAAA,eAAU,EAAC,EAAE,CAAC,EAAE,CAAC;YACnB,OAAO,IAAA,iBAAY,EAAC,EAAE,EAAE,OAAO,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;IACD,OAAO,iBAAiB,CAAC;AAC3B,CAAC;AAED,SAAgB,YAAY,CAAC,OAAgB;IAC3C,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,yDAAyD,CAAC;SACtE,MAAM,CAAC,mBAAmB,EAAE,cAAc,CAAC;SAC3C,MAAM,CAAC,SAAS,EAAE,oEAAoE,CAAC;SACvF,MAAM,CAAC,WAAW,EAAE,oEAAoE,CAAC;SACzF,MAAM,CAAC,uBAAuB,EAAE,wDAAwD,CAAC;SACzF,MAAM,CACL,wBAAwB,EACxB,yDAAyD,EACzD,IAAI,CACL;SACA,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACrB,MAAM,OAAO,GAAG,IAAA,cAAO,EAAC,cAAc,CAAC,CAAC;QACxC,IAAI,IAAA,eAAU,EAAC,OAAO,CAAC,EAAE,CAAC;YACxB,OAAO,CAAC,KAAK,CAAC,gDAAgD,CAAC,CAAC;YAChE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACnC,OAAO,CAAC,KAAK,CAAC,iDAAiD,CAAC,CAAC;YACjE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,MAAM,MAAM,GAAG,IAAI,CAAC,WAAqB,CAAC;YAE1C,IAAI,CAAC;gBACH,IAAI,WAAmB,CAAC;gBAExB,IAAI,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;oBAClE,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,CAAC;oBAChC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;wBACZ,OAAO,CAAC,KAAK,CAAC,iCAAiC,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;wBAC/E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;oBAClB,CAAC;oBAED,8CAA8C;oBAC9C,MAAM,aAAa,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;oBACxD,IAAI,aAAa,IAAI,QAAQ,CAAC,aAAa,EAAE,EAAE,CAAC,GAAG,aAAa,EAAE,CAAC;wBACjE,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,aAAa,EAAE,EAAE,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC;wBACrE,OAAO,CAAC,KAAK,CACX,oCAAoC,MAAM,yCAAyC,CACpF,CAAC;wBACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;oBAClB,CAAC;oBAED,wEAAwE;oBACxE,MAAM,MAAM,GAAG,GAAG,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC;oBACrC,IAAI,CAAC,MAAM,EAAE,CAAC;wBACZ,OAAO,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;wBAC/C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;oBAClB,CAAC;oBACD,MAAM,MAAM,GAAiB,EAAE,CAAC;oBAChC,IAAI,UAAU,GAAG,CAAC,CAAC;oBACnB,OAAO,IAAI,EAAE,CAAC;wBACZ,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;wBAC5C,IAAI,IAAI;4BAAE,MAAM;wBAChB,UAAU,IAAI,KAAK,CAAC,UAAU,CAAC;wBAC/B,IAAI,UAAU,GAAG,aAAa,EAAE,CAAC;4BAC/B,MAAM,CAAC,MAAM,EAAE,CAAC;4BAChB,OAAO,CAAC,KAAK,CACX,qEAAqE,CACtE,CAAC;4BACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;wBAClB,CAAC;wBACD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBACrB,CAAC;oBACD,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;gBACxD,CAAC;qBAAM,CAAC;oBACN,MAAM,QAAQ,GAAG,IAAA,cAAO,EAAC,MAAM,CAAC,CAAC;oBACjC,IAAI,CAAC,IAAA,eAAU,EAAC,QAAQ,CAAC,EAAE,CAAC;wBAC1B,OAAO,CAAC,KAAK,CAAC,2BAA2B,QAAQ,EAAE,CAAC,CAAC;wBACrD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;oBAClB,CAAC;oBACD,WAAW,GAAG,IAAA,iBAAY,EAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;gBAChD,CAAC;gBAED,IAAI,IAAY,CAAC;gBACjB,IAAI,CAAC;oBACH,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;gBACjC,CAAC;gBAAC,MAAM,CAAC;oBACP,IAAI,GAAG,IAAA,YAAS,EAAC,WAAW,CAAC,CAAC;gBAChC,CAAC;gBAED,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC;gBACnD,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;oBAClC,OAAO,CAAC,KAAK,CAAC,gDAAgD,CAAC,CAAC;oBAChE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAClB,CAAC;gBACD,MAAM,MAAM,GAAG,IAAA,6BAAmB,EAAC,IAAI,EAAE,OAAO,CAAC,CAAC;gBAClD,IAAA,kBAAa,EAAC,OAAO,EAAE,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;gBAE7C,WAAW,CAAC,IAAA,cAAO,EAAC,OAAO,CAAC,CAAC,CAAC;gBAC9B,OAAO,CAAC,GAAG,CAAC,IAAA,aAAK,EAAC,+BAA+B,MAAM,EAAE,CAAC,CAAC,CAAC;gBAC5D,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAA,YAAI,EAAC,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;gBAC3D,OAAO,CAAC,GAAG,CACT,mBAAmB,MAAM,CAAC,cAAc,KAAK,MAAM,CAAC,SAAS,UAAU,MAAM,CAAC,UAAU,WAAW,MAAM,CAAC,UAAU,SAAS,CAC9H,CAAC;gBACF,OAAO,CAAC,GAAG,CAAC,mBAAmB,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;gBAClD,IAAI,MAAM,CAAC,eAAe,GAAG,MAAM,CAAC,cAAc,EAAE,CAAC;oBACnD,OAAO,CAAC,GAAG,CACT,WAAW,MAAM,CAAC,eAAe,gCAAgC,MAAM,CAAC,cAAc,kCAAkC,CACzH,CAAC;gBACJ,CAAC;gBACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAChB,OAAO,CAAC,GAAG,CAAC,IAAA,WAAG,EAAC,aAAa,CAAC,CAAC,CAAC;gBAChC,OAAO,CAAC,GAAG,CACT,IAAA,WAAG,EAAC,2EAA2E,CAAC,CACjF,CAAC;gBACF,OAAO,CAAC,GAAG,CAAC,IAAA,WAAG,EAAC,gDAAgD,CAAC,CAAC,CAAC;gBACnE,OAAO,CAAC,GAAG,CAAC,IAAA,WAAG,EAAC,6DAA6D,CAAC,CAAC,CAAC;gBAChF,OAAO,CAAC,GAAG,CAAC,IAAA,WAAG,EAAC,qDAAqD,CAAC,CAAC,CAAC;YAC1E,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,CAAC,KAAK,CACX,mCAAmC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,CAC9E,CAAC;gBACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,OAAO;QACT,CAAC;QAED,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,WAAW,CAAC;YACtC,MAAM,QAAQ,GAAG,YAAY,EAAE,CAAC,UAAU,CAAC,kBAAkB,EAAE,IAAI,CAAC,CAAC;YACrE,IAAA,kBAAa,EAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;YAC1C,WAAW,CAAC,IAAA,cAAO,EAAC,OAAO,CAAC,CAAC,CAAC;YAC9B,OAAO,CAAC,GAAG,CAAC,IAAA,aAAK,EAAC,6BAA6B,IAAI,IAAI,CAAC,CAAC,CAAC;YAC1D,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,IAAA,WAAG,EAAC,aAAa,CAAC,CAAC,CAAC;YAChC,OAAO,CAAC,GAAG,CAAC,IAAA,WAAG,EAAC,gDAAgD,CAAC,CAAC,CAAC;YACnE,OAAO,CAAC,GAAG,CAAC,IAAA,WAAG,EAAC,uDAAuD,CAAC,CAAC,CAAC;YAC1E,OAAO,CAAC,GAAG,CAAC,IAAA,WAAG,EAAC,gDAAgD,CAAC,CAAC,CAAC;YACnE,OAAO,CAAC,GAAG,CAAC,IAAA,WAAG,EAAC,6DAA6D,CAAC,CAAC,CAAC;YAChF,OAAO,CAAC,GAAG,CAAC,IAAA,WAAG,EAAC,qDAAqD,CAAC,CAAC,CAAC;YACxE,OAAO;QACT,CAAC;QAED,6CAA6C;QAC7C,IAAA,kBAAa,EAAC,OAAO,EAAE,gBAAgB,EAAE,OAAO,CAAC,CAAC;QAClD,OAAO,CAAC,GAAG,CAAC,IAAA,aAAK,EAAC,8DAA8D,CAAC,CAAC,CAAC;QACnF,OAAO,CAAC,GAAG,CAAC,IAAA,WAAG,EAAC,8CAA8C,CAAC,CAAC,CAAC;QACjE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,IAAA,WAAG,EAAC,oBAAoB,CAAC,CAAC,CAAC;QACvC,OAAO,CAAC,GAAG,CAAC,IAAA,WAAG,EAAC,qCAAqC,CAAC,CAAC,CAAC;QACxD,OAAO,CAAC,GAAG,CAAC,IAAA,WAAG,EAAC,gDAAgD,CAAC,CAAC,CAAC;QACnE,OAAO,CAAC,GAAG,CAAC,IAAA,WAAG,EAAC,iBAAiB,CAAC,CAAC,CAAC;QACpC,OAAO,CAAC,GAAG,CAAC,IAAA,WAAG,EAAC,mDAAmD,CAAC,CAAC,CAAC;QACtE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,IAAA,WAAG,EAAC,2EAA2E,CAAC,CAAC,CAAC;IAChG,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inspect.d.ts","sourceRoot":"","sources":["../../src/commands/inspect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"inspect.d.ts","sourceRoot":"","sources":["../../src/commands/inspect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAqGtD"}
|
package/dist/commands/inspect.js
CHANGED
|
@@ -6,6 +6,7 @@ const fs_1 = require("fs");
|
|
|
6
6
|
const parser_1 = require("../parser");
|
|
7
7
|
const validator_1 = require("../validator");
|
|
8
8
|
const shared_1 = require("./shared");
|
|
9
|
+
const color_1 = require("../utils/color");
|
|
9
10
|
function registerInspect(program) {
|
|
10
11
|
program
|
|
11
12
|
.command('inspect')
|
|
@@ -62,23 +63,29 @@ function registerInspect(program) {
|
|
|
62
63
|
const decl = (0, shared_1.loadAndValidate)(filePath);
|
|
63
64
|
const forbidden = new Set(decl.permissions?.forbidden || []);
|
|
64
65
|
const tools = decl.capabilities.filter((c) => !forbidden.has(c.name));
|
|
65
|
-
console.log(`Service: ${decl.service.name}`);
|
|
66
|
+
console.log(`Service: ${(0, color_1.cyan)(decl.service.name)}`);
|
|
66
67
|
console.log(`Tools: ${tools.length}`);
|
|
67
68
|
console.log(`Auth: ${decl.service.auth?.type || 'none'}`);
|
|
68
69
|
console.log('');
|
|
69
|
-
for (
|
|
70
|
+
for (let i = 0; i < tools.length; i++) {
|
|
71
|
+
const tool = tools[i];
|
|
72
|
+
const isLast = i === tools.length - 1;
|
|
73
|
+
const connector = i === 0 ? '┌' : isLast ? '└' : '├';
|
|
74
|
+
const cont = isLast ? ' ' : '│';
|
|
70
75
|
const badge = tool.consent_required ? ' [consent required]' : '';
|
|
71
|
-
console.log(` ${tool.name} (${tool.permission})${badge}`);
|
|
72
|
-
console.log(`
|
|
73
|
-
console.log(`
|
|
76
|
+
console.log(` ${(0, color_1.dim)(connector)} ${(0, color_1.cyan)(tool.name)} ${(0, color_1.dim)(`(${tool.permission})`)}${badge}`);
|
|
77
|
+
console.log(` ${(0, color_1.dim)(cont)} ${(0, color_1.dim)(`${tool.method} ${tool.path}`)}`);
|
|
78
|
+
console.log(` ${(0, color_1.dim)(cont)} ${tool.description}`);
|
|
74
79
|
if (tool.inputs) {
|
|
75
80
|
const params = Object.entries(tool.inputs)
|
|
76
81
|
.map(([k, v]) => `${k}${v.required ? '*' : ''}: ${v.type}`)
|
|
77
82
|
.join(', ');
|
|
78
|
-
console.log(`
|
|
83
|
+
console.log(` ${(0, color_1.dim)(cont)} params: ${params}`);
|
|
79
84
|
}
|
|
80
|
-
|
|
85
|
+
if (!isLast)
|
|
86
|
+
console.log(` ${(0, color_1.dim)('│')}`);
|
|
81
87
|
}
|
|
88
|
+
console.log('');
|
|
82
89
|
if (decl.permissions?.forbidden?.length) {
|
|
83
90
|
console.log(`Forbidden: ${decl.permissions.forbidden.join(', ')}`);
|
|
84
91
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inspect.js","sourceRoot":"","sources":["../../src/commands/inspect.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"inspect.js","sourceRoot":"","sources":["../../src/commands/inspect.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../../src/commands/serve.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../../src/commands/serve.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASpC,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAiGpD"}
|
package/dist/commands/serve.js
CHANGED
|
@@ -5,34 +5,51 @@ const path_1 = require("path");
|
|
|
5
5
|
const fs_1 = require("fs");
|
|
6
6
|
const shared_1 = require("./shared");
|
|
7
7
|
const mcp_1 = require("../generators/mcp");
|
|
8
|
+
const color_1 = require("../utils/color");
|
|
9
|
+
const redact_1 = require("../utils/redact");
|
|
10
|
+
const env_1 = require("../utils/env");
|
|
8
11
|
function registerServe(program) {
|
|
9
12
|
program
|
|
10
13
|
.command('serve')
|
|
11
14
|
.description('Start an MCP server from a usepaso.yaml declaration')
|
|
12
15
|
.option('-f, --file <path>', 'Path to usepaso.yaml', 'usepaso.yaml')
|
|
16
|
+
.option('--env <path>', 'Path to .env file (default: .env next to usepaso.yaml)')
|
|
13
17
|
.option('-v, --verbose', 'Log all requests to stderr')
|
|
14
18
|
.option('-w, --watch', 'Notify when usepaso.yaml changes (requires manual restart)')
|
|
19
|
+
.option('--strict', 'Enforce consent gates server-side (for headless/untrusted agents)')
|
|
15
20
|
.action(async (opts) => {
|
|
16
21
|
const filePath = (0, path_1.resolve)(opts.file);
|
|
17
22
|
try {
|
|
18
23
|
const decl = (0, shared_1.loadAndValidate)(filePath);
|
|
24
|
+
// Load .env file if present (does not override existing env vars)
|
|
25
|
+
const loaded = (0, env_1.loadEnvFile)(filePath, opts.env);
|
|
26
|
+
if (loaded) {
|
|
27
|
+
console.error((0, color_1.dim)(`Loaded environment from ${opts.env || '.env'}`));
|
|
28
|
+
}
|
|
19
29
|
// Auth notices (logged once at startup, not per-request)
|
|
20
30
|
const authToken = process.env.USEPASO_AUTH_TOKEN;
|
|
21
31
|
if (authToken !== undefined && authToken === '') {
|
|
22
|
-
console.error(`Warning: USEPASO_AUTH_TOKEN is set but empty. API requests will likely fail.`);
|
|
32
|
+
console.error((0, color_1.yellow)(`Warning: USEPASO_AUTH_TOKEN is set but empty. API requests will likely fail.`));
|
|
23
33
|
}
|
|
24
34
|
if (decl.service.auth) {
|
|
25
35
|
if (decl.service.auth.type === 'none' && authToken) {
|
|
26
|
-
console.error(`Note: auth.type is "none"
|
|
36
|
+
console.error((0, color_1.yellow)(`Note: auth.type is "none", ignoring USEPASO_AUTH_TOKEN`));
|
|
27
37
|
}
|
|
28
38
|
else if (decl.service.auth.type !== 'none' && !authToken) {
|
|
29
|
-
console.error(`Warning: auth type "${decl.service.auth.type}" is configured but USEPASO_AUTH_TOKEN is not set. API requests will likely fail with 401.`);
|
|
39
|
+
console.error((0, color_1.yellow)(`Warning: auth type "${decl.service.auth.type}" is configured but USEPASO_AUTH_TOKEN is not set. API requests will likely fail with 401.`));
|
|
30
40
|
}
|
|
31
41
|
}
|
|
32
|
-
|
|
42
|
+
// Security: warn if base_url uses plain HTTP
|
|
43
|
+
if (decl.service.base_url.startsWith('http://')) {
|
|
44
|
+
console.error((0, color_1.yellow)(`Warning: base_url uses http://. Auth tokens will be sent in plain text.`));
|
|
45
|
+
}
|
|
46
|
+
if (opts.strict) {
|
|
47
|
+
console.error((0, color_1.yellow)('Strict mode: consent-gated tools require two-phase confirmation.'));
|
|
48
|
+
}
|
|
49
|
+
console.error(`${(0, color_1.green)('usepaso serving')} "${(0, color_1.cyan)(decl.service.name)}" (${decl.capabilities.length} capabilities). Agents welcome.`);
|
|
33
50
|
console.error('Transport: stdio. Waiting for an MCP client...');
|
|
34
51
|
// Show MCP config snippet
|
|
35
|
-
console.error((0, shared_1.mcpConfigSnippet)(
|
|
52
|
+
console.error((0, shared_1.mcpConfigSnippet)(decl.service.name));
|
|
36
53
|
console.error('');
|
|
37
54
|
// Verbose logging callback
|
|
38
55
|
const onLog = opts.verbose
|
|
@@ -42,7 +59,8 @@ function registerServe(program) {
|
|
|
42
59
|
console.error(`[${now}] ${capName} → ERROR: ${result.error}`);
|
|
43
60
|
}
|
|
44
61
|
else {
|
|
45
|
-
|
|
62
|
+
const safeUrl = (0, redact_1.redactUrl)(result.request.url);
|
|
63
|
+
console.error(`[${now}] ${capName} → ${result.request.method} ${safeUrl} ← ${result.status} (${result.durationMs}ms)`);
|
|
46
64
|
}
|
|
47
65
|
}
|
|
48
66
|
: undefined;
|
|
@@ -53,7 +71,7 @@ function registerServe(program) {
|
|
|
53
71
|
console.error(`\nFile changed. Restart the server to pick up changes.`);
|
|
54
72
|
});
|
|
55
73
|
}
|
|
56
|
-
await (0, mcp_1.serveMcp)(decl, onLog);
|
|
74
|
+
await (0, mcp_1.serveMcp)(decl, { onLog, strict: opts.strict });
|
|
57
75
|
}
|
|
58
76
|
catch (err) {
|
|
59
77
|
console.error(`Failed to start: ${err instanceof Error ? err.message : err}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serve.js","sourceRoot":"","sources":["../../src/commands/serve.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"serve.js","sourceRoot":"","sources":["../../src/commands/serve.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { PasoDeclaration } from '../types';
|
|
2
2
|
export declare function loadAndValidate(filePath: string): PasoDeclaration;
|
|
3
|
-
export declare function
|
|
3
|
+
export declare function slugify(name: string): string;
|
|
4
|
+
export declare function mcpConfigSnippet(serviceName: string): string;
|
|
4
5
|
//# sourceMappingURL=shared.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../src/commands/shared.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../src/commands/shared.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAG3C,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,eAAe,CAuBjE;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAO5C;AAED,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAW5D"}
|
package/dist/commands/shared.js
CHANGED
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.loadAndValidate = loadAndValidate;
|
|
4
|
+
exports.slugify = slugify;
|
|
4
5
|
exports.mcpConfigSnippet = mcpConfigSnippet;
|
|
5
|
-
const path_1 = require("path");
|
|
6
6
|
const fs_1 = require("fs");
|
|
7
7
|
const parser_1 = require("../parser");
|
|
8
8
|
const validator_1 = require("../validator");
|
|
9
|
+
const color_1 = require("../utils/color");
|
|
9
10
|
function loadAndValidate(filePath) {
|
|
10
11
|
if (!(0, fs_1.existsSync)(filePath)) {
|
|
11
|
-
console.error(`File not found: ${filePath}`);
|
|
12
|
+
console.error((0, color_1.red)(`File not found: ${filePath}`) + (0, color_1.dim)(` Run usepaso init to create one.`));
|
|
12
13
|
process.exit(1);
|
|
13
14
|
}
|
|
14
15
|
const decl = (0, parser_1.parseFile)(filePath);
|
|
@@ -16,41 +17,33 @@ function loadAndValidate(filePath) {
|
|
|
16
17
|
const errors = results.filter((e) => e.level !== 'warning');
|
|
17
18
|
const warnings = results.filter((e) => e.level === 'warning');
|
|
18
19
|
if (errors.length > 0) {
|
|
19
|
-
console.error(`Validation failed with ${errors.length} error(s):`);
|
|
20
|
+
console.error((0, color_1.red)(`Validation failed with ${errors.length} error(s):`));
|
|
20
21
|
for (const err of errors) {
|
|
21
|
-
console.error(` ${err.path}: ${err.message}`);
|
|
22
|
+
console.error(` ${(0, color_1.red)(err.path)}: ${err.message}`);
|
|
22
23
|
}
|
|
23
24
|
process.exit(1);
|
|
24
25
|
}
|
|
25
26
|
for (const w of warnings) {
|
|
26
|
-
console.error(` warning: ${w.path}: ${w.message}`);
|
|
27
|
+
console.error(` ${(0, color_1.yellow)('warning')}: ${w.path}: ${w.message}`);
|
|
27
28
|
}
|
|
28
29
|
return decl;
|
|
29
30
|
}
|
|
30
|
-
function
|
|
31
|
-
|
|
32
|
-
|
|
31
|
+
function slugify(name) {
|
|
32
|
+
return (name
|
|
33
|
+
.toLowerCase()
|
|
34
|
+
.replace(/[^a-z0-9]+/g, '-')
|
|
35
|
+
.replace(/^-|-$/g, '') || 'usepaso-service');
|
|
36
|
+
}
|
|
37
|
+
function mcpConfigSnippet(serviceName) {
|
|
38
|
+
const slug = slugify(serviceName);
|
|
33
39
|
return `
|
|
34
|
-
|
|
40
|
+
Connect to an MCP client:
|
|
35
41
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
"command": "npx",
|
|
41
|
-
"args": ["usepaso", "serve", "-f", "${absPath}"],
|
|
42
|
-
"env": { "USEPASO_AUTH_TOKEN": "your-token" }
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
}
|
|
42
|
+
usepaso connect claude-desktop
|
|
43
|
+
usepaso connect cursor
|
|
44
|
+
usepaso connect vscode
|
|
45
|
+
usepaso connect windsurf
|
|
46
46
|
|
|
47
|
-
|
|
48
|
-
{
|
|
49
|
-
"${slug}": {
|
|
50
|
-
"command": "npx",
|
|
51
|
-
"args": ["usepaso", "serve", "-f", "${absPath}"],
|
|
52
|
-
"env": { "USEPASO_AUTH_TOKEN": "your-token" }
|
|
53
|
-
}
|
|
54
|
-
}`;
|
|
47
|
+
Or add "${slug}" manually to your client config. See: usepaso connect --help`;
|
|
55
48
|
}
|
|
56
49
|
//# sourceMappingURL=shared.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/commands/shared.ts"],"names":[],"mappings":";;AAMA,0CAuBC;AAED,
|
|
1
|
+
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/commands/shared.ts"],"names":[],"mappings":";;AAMA,0CAuBC;AAED,0BAOC;AAED,4CAWC;AAnDD,2BAAgC;AAChC,sCAAsC;AACtC,4CAAwC;AAExC,0CAAkD;AAElD,SAAgB,eAAe,CAAC,QAAgB;IAC9C,IAAI,CAAC,IAAA,eAAU,EAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,OAAO,CAAC,KAAK,CAAC,IAAA,WAAG,EAAC,mBAAmB,QAAQ,EAAE,CAAC,GAAG,IAAA,WAAG,EAAC,kCAAkC,CAAC,CAAC,CAAC;QAC5F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,MAAM,IAAI,GAAG,IAAA,kBAAS,EAAC,QAAQ,CAAC,CAAC;IACjC,MAAM,OAAO,GAAG,IAAA,oBAAQ,EAAC,IAAI,CAAC,CAAC;IAC/B,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC;IAC5D,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC;IAE9D,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,OAAO,CAAC,KAAK,CAAC,IAAA,WAAG,EAAC,0BAA0B,MAAM,CAAC,MAAM,YAAY,CAAC,CAAC,CAAC;QACxE,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;YACzB,OAAO,CAAC,KAAK,CAAC,KAAK,IAAA,WAAG,EAAC,GAAG,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QACtD,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,OAAO,CAAC,KAAK,CAAC,KAAK,IAAA,cAAM,EAAC,SAAS,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;IACnE,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAgB,OAAO,CAAC,IAAY;IAClC,OAAO,CACL,IAAI;SACD,WAAW,EAAE;SACb,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;SAC3B,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,IAAI,iBAAiB,CAC9C,CAAC;AACJ,CAAC;AAED,SAAgB,gBAAgB,CAAC,WAAmB;IAClD,MAAM,IAAI,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IAClC,OAAO;;;;;;;;UAQC,IAAI,+DAA+D,CAAC;AAC9E,CAAC"}
|
package/dist/commands/test.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"test.d.ts","sourceRoot":"","sources":["../../src/commands/test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,wBAAgB,
|
|
1
|
+
{"version":3,"file":"test.d.ts","sourceRoot":"","sources":["../../src/commands/test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAsLnD"}
|