@nimblebrain/mpak 0.1.0 → 0.3.0

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 (151) hide show
  1. package/README.md +50 -383
  2. package/dist/index.d.ts +0 -2
  3. package/dist/index.js +2117 -4
  4. package/dist/index.js.map +1 -1
  5. package/package.json +26 -23
  6. package/.claude/settings.local.json +0 -19
  7. package/.env.example +0 -13
  8. package/.github/workflows/ci.yml +0 -27
  9. package/CLAUDE.md +0 -283
  10. package/LICENSE +0 -201
  11. package/dist/commands/config.d.ts +0 -31
  12. package/dist/commands/config.d.ts.map +0 -1
  13. package/dist/commands/config.js +0 -129
  14. package/dist/commands/config.js.map +0 -1
  15. package/dist/commands/packages/pull.d.ts +0 -11
  16. package/dist/commands/packages/pull.d.ts.map +0 -1
  17. package/dist/commands/packages/pull.js +0 -72
  18. package/dist/commands/packages/pull.js.map +0 -1
  19. package/dist/commands/packages/run.d.ts +0 -47
  20. package/dist/commands/packages/run.d.ts.map +0 -1
  21. package/dist/commands/packages/run.js +0 -419
  22. package/dist/commands/packages/run.js.map +0 -1
  23. package/dist/commands/packages/search.d.ts +0 -12
  24. package/dist/commands/packages/search.d.ts.map +0 -1
  25. package/dist/commands/packages/search.js +0 -63
  26. package/dist/commands/packages/search.js.map +0 -1
  27. package/dist/commands/packages/show.d.ts +0 -8
  28. package/dist/commands/packages/show.d.ts.map +0 -1
  29. package/dist/commands/packages/show.js +0 -109
  30. package/dist/commands/packages/show.js.map +0 -1
  31. package/dist/commands/search.d.ts +0 -12
  32. package/dist/commands/search.d.ts.map +0 -1
  33. package/dist/commands/search.js +0 -144
  34. package/dist/commands/search.js.map +0 -1
  35. package/dist/commands/skills/index.d.ts +0 -8
  36. package/dist/commands/skills/index.d.ts.map +0 -1
  37. package/dist/commands/skills/index.js +0 -8
  38. package/dist/commands/skills/index.js.map +0 -1
  39. package/dist/commands/skills/install.d.ts +0 -9
  40. package/dist/commands/skills/install.d.ts.map +0 -1
  41. package/dist/commands/skills/install.js +0 -110
  42. package/dist/commands/skills/install.js.map +0 -1
  43. package/dist/commands/skills/list.d.ts +0 -8
  44. package/dist/commands/skills/list.d.ts.map +0 -1
  45. package/dist/commands/skills/list.js +0 -89
  46. package/dist/commands/skills/list.js.map +0 -1
  47. package/dist/commands/skills/pack.d.ts +0 -22
  48. package/dist/commands/skills/pack.d.ts.map +0 -1
  49. package/dist/commands/skills/pack.js +0 -116
  50. package/dist/commands/skills/pack.js.map +0 -1
  51. package/dist/commands/skills/pull.d.ts +0 -9
  52. package/dist/commands/skills/pull.d.ts.map +0 -1
  53. package/dist/commands/skills/pull.js +0 -68
  54. package/dist/commands/skills/pull.js.map +0 -1
  55. package/dist/commands/skills/search.d.ts +0 -14
  56. package/dist/commands/skills/search.d.ts.map +0 -1
  57. package/dist/commands/skills/search.js +0 -53
  58. package/dist/commands/skills/search.js.map +0 -1
  59. package/dist/commands/skills/show.d.ts +0 -8
  60. package/dist/commands/skills/show.d.ts.map +0 -1
  61. package/dist/commands/skills/show.js +0 -64
  62. package/dist/commands/skills/show.js.map +0 -1
  63. package/dist/commands/skills/validate.d.ts +0 -25
  64. package/dist/commands/skills/validate.d.ts.map +0 -1
  65. package/dist/commands/skills/validate.js +0 -191
  66. package/dist/commands/skills/validate.js.map +0 -1
  67. package/dist/index.d.ts.map +0 -1
  68. package/dist/lib/api/registry-client.d.ts +0 -63
  69. package/dist/lib/api/registry-client.d.ts.map +0 -1
  70. package/dist/lib/api/registry-client.js +0 -167
  71. package/dist/lib/api/registry-client.js.map +0 -1
  72. package/dist/lib/api/skills-client.d.ts +0 -30
  73. package/dist/lib/api/skills-client.d.ts.map +0 -1
  74. package/dist/lib/api/skills-client.js +0 -110
  75. package/dist/lib/api/skills-client.js.map +0 -1
  76. package/dist/program.d.ts +0 -12
  77. package/dist/program.d.ts.map +0 -1
  78. package/dist/program.js +0 -186
  79. package/dist/program.js.map +0 -1
  80. package/dist/schemas/generated/api-responses.d.ts +0 -541
  81. package/dist/schemas/generated/api-responses.d.ts.map +0 -1
  82. package/dist/schemas/generated/api-responses.js +0 -313
  83. package/dist/schemas/generated/api-responses.js.map +0 -1
  84. package/dist/schemas/generated/auth.d.ts +0 -18
  85. package/dist/schemas/generated/auth.d.ts.map +0 -1
  86. package/dist/schemas/generated/auth.js +0 -18
  87. package/dist/schemas/generated/auth.js.map +0 -1
  88. package/dist/schemas/generated/index.d.ts +0 -5
  89. package/dist/schemas/generated/index.d.ts.map +0 -1
  90. package/dist/schemas/generated/index.js +0 -6
  91. package/dist/schemas/generated/index.js.map +0 -1
  92. package/dist/schemas/generated/package.d.ts +0 -43
  93. package/dist/schemas/generated/package.d.ts.map +0 -1
  94. package/dist/schemas/generated/package.js +0 -20
  95. package/dist/schemas/generated/package.js.map +0 -1
  96. package/dist/schemas/generated/skill.d.ts +0 -381
  97. package/dist/schemas/generated/skill.d.ts.map +0 -1
  98. package/dist/schemas/generated/skill.js +0 -216
  99. package/dist/schemas/generated/skill.js.map +0 -1
  100. package/dist/utils/config-manager.d.ts +0 -66
  101. package/dist/utils/config-manager.d.ts.map +0 -1
  102. package/dist/utils/config-manager.js +0 -193
  103. package/dist/utils/config-manager.js.map +0 -1
  104. package/dist/utils/errors.d.ts +0 -12
  105. package/dist/utils/errors.d.ts.map +0 -1
  106. package/dist/utils/errors.js +0 -27
  107. package/dist/utils/errors.js.map +0 -1
  108. package/dist/utils/version.d.ts +0 -5
  109. package/dist/utils/version.d.ts.map +0 -1
  110. package/dist/utils/version.js +0 -19
  111. package/dist/utils/version.js.map +0 -1
  112. package/eslint.config.js +0 -63
  113. package/src/commands/config.ts +0 -162
  114. package/src/commands/packages/pull.ts +0 -96
  115. package/src/commands/packages/run.test.ts +0 -261
  116. package/src/commands/packages/run.ts +0 -536
  117. package/src/commands/packages/search.ts +0 -83
  118. package/src/commands/packages/show.ts +0 -128
  119. package/src/commands/search.ts +0 -191
  120. package/src/commands/skills/index.ts +0 -7
  121. package/src/commands/skills/install.ts +0 -129
  122. package/src/commands/skills/list.ts +0 -116
  123. package/src/commands/skills/pack.test.ts +0 -260
  124. package/src/commands/skills/pack.ts +0 -145
  125. package/src/commands/skills/pull.ts +0 -88
  126. package/src/commands/skills/search.ts +0 -73
  127. package/src/commands/skills/show.ts +0 -72
  128. package/src/commands/skills/validate.test.ts +0 -466
  129. package/src/commands/skills/validate.ts +0 -227
  130. package/src/index.ts +0 -11
  131. package/src/lib/api/registry-client.ts +0 -223
  132. package/src/lib/api/schema.d.ts +0 -520
  133. package/src/lib/api/skills-client.ts +0 -148
  134. package/src/program.test.ts +0 -22
  135. package/src/program.ts +0 -226
  136. package/src/schemas/config.v1.schema.json +0 -37
  137. package/src/schemas/generated/api-responses.ts +0 -386
  138. package/src/schemas/generated/auth.ts +0 -21
  139. package/src/schemas/generated/index.ts +0 -5
  140. package/src/schemas/generated/package.ts +0 -29
  141. package/src/schemas/generated/skill.ts +0 -271
  142. package/src/utils/config-manager.test.ts +0 -330
  143. package/src/utils/config-manager.ts +0 -272
  144. package/src/utils/errors.test.ts +0 -25
  145. package/src/utils/errors.ts +0 -33
  146. package/src/utils/version.test.ts +0 -16
  147. package/src/utils/version.ts +0 -18
  148. package/test/integration/registry-client.test.ts +0 -180
  149. package/tsconfig.check.json +0 -9
  150. package/tsconfig.json +0 -25
  151. package/vitest.config.ts +0 -14
@@ -1,520 +0,0 @@
1
- /**
2
- * This file was auto-generated by openapi-typescript.
3
- * Do not make direct changes to the file.
4
- */
5
-
6
- export interface paths {
7
- "/v1/bundles/search": {
8
- parameters: {
9
- query?: never;
10
- header?: never;
11
- path?: never;
12
- cookie?: never;
13
- };
14
- /** @description Search for bundles */
15
- get: {
16
- parameters: {
17
- query?: {
18
- /** @description Search query */
19
- q?: string;
20
- /** @description Filter by server type */
21
- type?: string;
22
- sort?: "downloads" | "recent" | "name";
23
- limit?: number;
24
- offset?: number;
25
- };
26
- header?: never;
27
- path?: never;
28
- cookie?: never;
29
- };
30
- requestBody?: never;
31
- responses: {
32
- /** @description Default Response */
33
- 200: {
34
- headers: {
35
- [name: string]: unknown;
36
- };
37
- content: {
38
- "application/json": {
39
- bundles: {
40
- name: string;
41
- display_name?: string | null;
42
- description?: string | null;
43
- author?: {
44
- name: string;
45
- } | null;
46
- latest_version: string;
47
- icon?: string | null;
48
- server_type?: string | null;
49
- tools?: {
50
- name: string;
51
- description?: string;
52
- }[];
53
- downloads: number;
54
- published_at: string | unknown;
55
- verified: boolean;
56
- provenance?: {
57
- schema_version: string;
58
- provider: string;
59
- repository: string;
60
- sha: string;
61
- } | null;
62
- }[];
63
- total: number;
64
- pagination: {
65
- limit: number;
66
- offset: number;
67
- has_more: boolean;
68
- };
69
- };
70
- };
71
- };
72
- };
73
- };
74
- put?: never;
75
- post?: never;
76
- delete?: never;
77
- options?: never;
78
- head?: never;
79
- patch?: never;
80
- trace?: never;
81
- };
82
- "/v1/bundles/@{scope}/{package}": {
83
- parameters: {
84
- query?: never;
85
- header?: never;
86
- path?: never;
87
- cookie?: never;
88
- };
89
- /** @description Get detailed bundle information */
90
- get: {
91
- parameters: {
92
- query?: never;
93
- header?: never;
94
- path: {
95
- scope: string;
96
- package: string;
97
- };
98
- cookie?: never;
99
- };
100
- requestBody?: never;
101
- responses: {
102
- /** @description Default Response */
103
- 200: {
104
- headers: {
105
- [name: string]: unknown;
106
- };
107
- content: {
108
- "application/json": {
109
- name: string;
110
- display_name?: string | null;
111
- description?: string | null;
112
- author?: {
113
- name: string;
114
- } | null;
115
- latest_version: string;
116
- icon?: string | null;
117
- server_type?: string | null;
118
- tools?: {
119
- name: string;
120
- description?: string;
121
- }[];
122
- downloads: number;
123
- published_at: string | unknown;
124
- verified: boolean;
125
- provenance?: {
126
- schema_version: string;
127
- provider: string;
128
- repository: string;
129
- sha: string;
130
- } | null;
131
- homepage?: string | null;
132
- license?: string | null;
133
- versions: {
134
- version: string;
135
- published_at: string | unknown;
136
- downloads: number;
137
- }[];
138
- };
139
- };
140
- };
141
- };
142
- };
143
- put?: never;
144
- post?: never;
145
- delete?: never;
146
- options?: never;
147
- head?: never;
148
- patch?: never;
149
- trace?: never;
150
- };
151
- "/v1/bundles/@{scope}/{package}/index.json": {
152
- parameters: {
153
- query?: never;
154
- header?: never;
155
- path?: never;
156
- cookie?: never;
157
- };
158
- /** @description Get multi-platform distribution index for a bundle (MCPB Index spec) */
159
- get: {
160
- parameters: {
161
- query?: never;
162
- header?: never;
163
- path: {
164
- scope: string;
165
- package: string;
166
- };
167
- cookie?: never;
168
- };
169
- requestBody?: never;
170
- responses: {
171
- /** @description Default Response */
172
- 200: {
173
- headers: {
174
- [name: string]: unknown;
175
- };
176
- content: {
177
- "application/json": {
178
- index_version: string;
179
- mimeType: string;
180
- name: string;
181
- version: string;
182
- description: string | null;
183
- bundles: {
184
- mimeType: string | null;
185
- digest: string;
186
- size: number;
187
- platform: {
188
- os: string;
189
- arch: string;
190
- };
191
- urls: string[];
192
- }[];
193
- annotations?: {
194
- [key: string]: string;
195
- };
196
- };
197
- };
198
- };
199
- };
200
- };
201
- put?: never;
202
- post?: never;
203
- delete?: never;
204
- options?: never;
205
- head?: never;
206
- patch?: never;
207
- trace?: never;
208
- };
209
- "/v1/bundles/@{scope}/{package}/versions": {
210
- parameters: {
211
- query?: never;
212
- header?: never;
213
- path?: never;
214
- cookie?: never;
215
- };
216
- /** @description List all versions of a bundle */
217
- get: {
218
- parameters: {
219
- query?: never;
220
- header?: never;
221
- path: {
222
- scope: string;
223
- package: string;
224
- };
225
- cookie?: never;
226
- };
227
- requestBody?: never;
228
- responses: {
229
- /** @description Default Response */
230
- 200: {
231
- headers: {
232
- [name: string]: unknown;
233
- };
234
- content: {
235
- "application/json": {
236
- name: string;
237
- latest: string;
238
- versions: {
239
- version: string;
240
- artifacts_count: number;
241
- platforms: {
242
- os: string;
243
- arch: string;
244
- }[];
245
- published_at: string | unknown;
246
- downloads: number;
247
- publish_method: string | null;
248
- provenance?: {
249
- schema_version: string;
250
- provider: string;
251
- repository: string;
252
- sha: string;
253
- } | null;
254
- }[];
255
- };
256
- };
257
- };
258
- };
259
- };
260
- put?: never;
261
- post?: never;
262
- delete?: never;
263
- options?: never;
264
- head?: never;
265
- patch?: never;
266
- trace?: never;
267
- };
268
- "/v1/bundles/@{scope}/{package}/versions/{version}": {
269
- parameters: {
270
- query?: never;
271
- header?: never;
272
- path?: never;
273
- cookie?: never;
274
- };
275
- /** @description Get information about a specific version */
276
- get: {
277
- parameters: {
278
- query?: never;
279
- header?: never;
280
- path: {
281
- scope: string;
282
- package: string;
283
- version: string;
284
- };
285
- cookie?: never;
286
- };
287
- requestBody?: never;
288
- responses: {
289
- /** @description Default Response */
290
- 200: {
291
- headers: {
292
- [name: string]: unknown;
293
- };
294
- content: {
295
- "application/json": {
296
- name: string;
297
- version: string;
298
- published_at: string | unknown;
299
- downloads: number;
300
- artifacts: {
301
- platform: {
302
- os: string;
303
- arch: string;
304
- };
305
- digest: string;
306
- size: number;
307
- download_url: string;
308
- source_url?: string;
309
- }[];
310
- manifest: {
311
- [key: string]: unknown;
312
- };
313
- release?: {
314
- tag: string | null;
315
- url: string | null;
316
- };
317
- publish_method: string | null;
318
- provenance: {
319
- schema_version: string;
320
- provider: string;
321
- repository: string;
322
- sha: string;
323
- } | null;
324
- };
325
- };
326
- };
327
- };
328
- };
329
- put?: never;
330
- post?: never;
331
- delete?: never;
332
- options?: never;
333
- head?: never;
334
- patch?: never;
335
- trace?: never;
336
- };
337
- "/v1/bundles/@{scope}/{package}/versions/{version}/download": {
338
- parameters: {
339
- query?: never;
340
- header?: never;
341
- path?: never;
342
- cookie?: never;
343
- };
344
- /** @description Download a specific version of a bundle */
345
- get: {
346
- parameters: {
347
- query?: {
348
- /** @description Target OS (darwin, linux, win32, any) */
349
- os?: string;
350
- /** @description Target arch (x64, arm64, any) */
351
- arch?: string;
352
- };
353
- header?: never;
354
- path: {
355
- scope: string;
356
- package: string;
357
- version: string;
358
- };
359
- cookie?: never;
360
- };
361
- requestBody?: never;
362
- responses: {
363
- /** @description Default Response */
364
- 200: {
365
- headers: {
366
- [name: string]: unknown;
367
- };
368
- content: {
369
- "application/json": {
370
- url: string;
371
- bundle: {
372
- name: string;
373
- version: string;
374
- platform: {
375
- os: string;
376
- arch: string;
377
- };
378
- sha256: string;
379
- size: number;
380
- };
381
- expires_at?: string;
382
- };
383
- };
384
- };
385
- /** @description Redirect to download URL */
386
- 302: {
387
- headers: {
388
- [name: string]: unknown;
389
- };
390
- content?: never;
391
- };
392
- };
393
- };
394
- put?: never;
395
- post?: never;
396
- delete?: never;
397
- options?: never;
398
- head?: never;
399
- patch?: never;
400
- trace?: never;
401
- };
402
- "/v1/bundles/announce": {
403
- parameters: {
404
- query?: never;
405
- header?: never;
406
- path?: never;
407
- cookie?: never;
408
- };
409
- get?: never;
410
- put?: never;
411
- /** @description Announce a single artifact for a bundle version from a GitHub release (OIDC only). Idempotent - can be called multiple times for different artifacts of the same version. */
412
- post: {
413
- parameters: {
414
- query?: never;
415
- header?: never;
416
- path?: never;
417
- cookie?: never;
418
- };
419
- requestBody: {
420
- content: {
421
- "application/json": {
422
- name: string;
423
- version: string;
424
- manifest: {
425
- [key: string]: unknown;
426
- };
427
- release_tag: string;
428
- /** @default false */
429
- prerelease: boolean;
430
- artifact: {
431
- filename: string;
432
- os: string;
433
- arch: string;
434
- sha256: string;
435
- size: number;
436
- };
437
- };
438
- };
439
- };
440
- responses: {
441
- /** @description Default Response */
442
- 200: {
443
- headers: {
444
- [name: string]: unknown;
445
- };
446
- content: {
447
- "application/json": {
448
- package: string;
449
- version: string;
450
- artifact: {
451
- os: string;
452
- arch: string;
453
- filename: string;
454
- };
455
- total_artifacts: number;
456
- /** @enum {string} */
457
- status: "created" | "updated";
458
- };
459
- };
460
- };
461
- };
462
- };
463
- delete?: never;
464
- options?: never;
465
- head?: never;
466
- patch?: never;
467
- trace?: never;
468
- };
469
- "/health": {
470
- parameters: {
471
- query?: never;
472
- header?: never;
473
- path?: never;
474
- cookie?: never;
475
- };
476
- /** @description Health check endpoint */
477
- get: {
478
- parameters: {
479
- query?: never;
480
- header?: never;
481
- path?: never;
482
- cookie?: never;
483
- };
484
- requestBody?: never;
485
- responses: {
486
- /** @description Default Response */
487
- 200: {
488
- headers: {
489
- [name: string]: unknown;
490
- };
491
- content: {
492
- "application/json": {
493
- status?: string;
494
- /** Format: date-time */
495
- timestamp?: string;
496
- };
497
- };
498
- };
499
- };
500
- };
501
- put?: never;
502
- post?: never;
503
- delete?: never;
504
- options?: never;
505
- head?: never;
506
- patch?: never;
507
- trace?: never;
508
- };
509
- }
510
- export type webhooks = Record<string, never>;
511
- export interface components {
512
- schemas: never;
513
- responses: never;
514
- parameters: never;
515
- requestBodies: never;
516
- headers: never;
517
- pathItems: never;
518
- }
519
- export type $defs = Record<string, never>;
520
- export type operations = Record<string, never>;
@@ -1,148 +0,0 @@
1
- /**
2
- * Skills API client for mpak registry
3
- */
4
-
5
- import type {
6
- SkillSearchResponse,
7
- SkillDetail,
8
- SkillDownloadInfo,
9
- } from '../../schemas/generated/skill.js';
10
-
11
- const DEFAULT_REGISTRY_URL = 'https://api.mpak.dev';
12
-
13
- function getRegistryUrl(): string {
14
- return process.env.MPAK_REGISTRY_URL || DEFAULT_REGISTRY_URL;
15
- }
16
-
17
- /**
18
- * Parse a scoped name into scope and name parts
19
- * Handles both @scope/name and scope/name formats
20
- */
21
- function parseScopedName(name: string): { scope: string; skillName: string } {
22
- const normalizedName = name.startsWith('@') ? name.slice(1) : name;
23
- const [scope, skillName] = normalizedName.split('/');
24
- if (!scope || !skillName) {
25
- throw new Error(`Invalid skill name format: ${name}. Expected @scope/name or scope/name`);
26
- }
27
- return { scope, skillName };
28
- }
29
-
30
- export interface SkillSearchOptions {
31
- q?: string;
32
- tags?: string;
33
- category?: string;
34
- surface?: string;
35
- sort?: 'downloads' | 'recent' | 'name';
36
- limit?: number;
37
- offset?: number;
38
- }
39
-
40
- /**
41
- * Search for skills in the registry
42
- */
43
- export async function searchSkills(options: SkillSearchOptions): Promise<SkillSearchResponse> {
44
- const baseUrl = getRegistryUrl();
45
- const params = new URLSearchParams();
46
-
47
- if (options.q) params.set('q', options.q);
48
- if (options.tags) params.set('tags', options.tags);
49
- if (options.category) params.set('category', options.category);
50
- if (options.surface) params.set('surface', options.surface);
51
- if (options.sort) params.set('sort', options.sort);
52
- if (options.limit) params.set('limit', options.limit.toString());
53
- if (options.offset) params.set('offset', options.offset.toString());
54
-
55
- const url = `${baseUrl}/v1/skills/search?${params.toString()}`;
56
-
57
- const response = await fetch(url, {
58
- headers: { Accept: 'application/json' },
59
- });
60
-
61
- if (!response.ok) {
62
- const text = await response.text();
63
- throw new Error(`Search failed (${response.status}): ${text}`);
64
- }
65
-
66
- return response.json() as Promise<SkillSearchResponse>;
67
- }
68
-
69
- /**
70
- * Get skill details from the registry
71
- */
72
- export async function getSkillDetails(name: string): Promise<SkillDetail> {
73
- const baseUrl = getRegistryUrl();
74
- const { scope, skillName } = parseScopedName(name);
75
-
76
- // Server expects: /v1/skills/@scope/name
77
- const url = `${baseUrl}/v1/skills/@${scope}/${skillName}`;
78
-
79
- const response = await fetch(url, {
80
- headers: { Accept: 'application/json' },
81
- });
82
-
83
- if (!response.ok) {
84
- if (response.status === 404) {
85
- throw new Error(`Skill not found: ${name}`);
86
- }
87
- const text = await response.text();
88
- throw new Error(`Failed to get skill details (${response.status}): ${text}`);
89
- }
90
-
91
- return response.json() as Promise<SkillDetail>;
92
- }
93
-
94
- /**
95
- * Get download info for a skill
96
- */
97
- export async function getSkillDownloadInfo(
98
- name: string,
99
- version?: string
100
- ): Promise<SkillDownloadInfo> {
101
- const baseUrl = getRegistryUrl();
102
- const { scope, skillName } = parseScopedName(name);
103
-
104
- // Server expects: /v1/skills/@scope/name/download or /v1/skills/@scope/name/versions/x.y.z/download
105
- const versionPath = version ? `/versions/${version}` : '';
106
- const url = `${baseUrl}/v1/skills/@${scope}/${skillName}${versionPath}/download`;
107
-
108
- const response = await fetch(url, {
109
- headers: { Accept: 'application/json' },
110
- });
111
-
112
- if (!response.ok) {
113
- if (response.status === 404) {
114
- throw new Error(`Skill not found: ${name}${version ? `@${version}` : ''}`);
115
- }
116
- const text = await response.text();
117
- throw new Error(`Failed to get download info (${response.status}): ${text}`);
118
- }
119
-
120
- return response.json() as Promise<SkillDownloadInfo>;
121
- }
122
-
123
- /**
124
- * Download a skill bundle
125
- */
126
- export async function downloadSkillBundle(
127
- downloadUrl: string,
128
- expectedSha256?: string
129
- ): Promise<Buffer> {
130
- const response = await fetch(downloadUrl);
131
-
132
- if (!response.ok) {
133
- throw new Error(`Download failed (${response.status})`);
134
- }
135
-
136
- const buffer = Buffer.from(await response.arrayBuffer());
137
-
138
- // Verify SHA256 if provided
139
- if (expectedSha256) {
140
- const { createHash } = await import('crypto');
141
- const hash = createHash('sha256').update(buffer).digest('hex');
142
- if (hash !== expectedSha256) {
143
- throw new Error(`SHA256 mismatch: expected ${expectedSha256}, got ${hash}`);
144
- }
145
- }
146
-
147
- return buffer;
148
- }
@@ -1,22 +0,0 @@
1
- import { describe, it, expect } from 'vitest';
2
- import { createProgram } from './program.js';
3
-
4
- describe('createProgram', () => {
5
- it('should create a program with correct name', () => {
6
- const program = createProgram();
7
- expect(program.name()).toBe('mpak');
8
- });
9
-
10
- it('should have a description', () => {
11
- const program = createProgram();
12
- expect(program.description()).toBe('CLI for MCP bundles and Agent Skills');
13
- });
14
-
15
- it('should have version option', () => {
16
- const program = createProgram();
17
- const versionOption = program.options.find(
18
- (opt) => opt.short === '-v' || opt.long === '--version'
19
- );
20
- expect(versionOption).toBeDefined();
21
- });
22
- });