diff --git a/.release-please-manifest.json b/.release-please-manifest.json index b2ddd21..13093da 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "0.55.0" + ".": "0.56.0" } diff --git a/.stats.yml b/.stats.yml index d5c81f7..f69b48b 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ -configured_endpoints: 55 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/smithery%2Fsmithery-8f89ae4612e134edd6727145a66b20b2bd6e77e41fdaef9eed4b8ae885e87425.yml -openapi_spec_hash: d0eca3c5b0cd0bd9bdf33de288067fb9 -config_hash: be5393e7788ba802a675b6422639e436 +configured_endpoints: 56 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/smithery%2Fsmithery-43d4f10825448402040e5849e1a990221129d3628397d1a3938ae41f872f6623.yml +openapi_spec_hash: d2babb21cf900087915b765c86d6e100 +config_hash: c892f4a037284a6cd640f6ff0e04a6bf diff --git a/CHANGELOG.md b/CHANGELOG.md index d367b91..bb8c7e9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +## 0.56.0 (2026-03-13) + +Full Changelog: [v0.55.0...v0.56.0](https://github.com/smithery-ai/typescript-api/compare/v0.55.0...v0.56.0) + +### Features + +* **SMI-1461:** support uploaded skill bundles ([#1786](https://github.com/smithery-ai/typescript-api/issues/1786)) ([3e01756](https://github.com/smithery-ai/typescript-api/commit/3e0175627acf6e10f161f812cdf0ed4eed7a74d5)) + ## 0.55.0 (2026-03-12) Full Changelog: [v0.54.0...v0.55.0](https://github.com/smithery-ai/typescript-api/compare/v0.54.0...v0.55.0) diff --git a/api.md b/api.md index 0185336..024240e 100644 --- a/api.md +++ b/api.md @@ -142,6 +142,7 @@ Types: - SkillGetResponse - SkillSetResponse - SkillSyncResponse +- SkillUploadResponse Methods: @@ -152,6 +153,7 @@ Methods: - client.skills.get(slug, { ...params }) -> SkillGetResponse - client.skills.set(slug, { ...params }) -> SkillSetResponse - client.skills.sync(slug, { ...params }) -> SkillSyncResponse +- client.skills.upload(slug, { ...params }) -> SkillUploadResponse ## Votes diff --git a/package-lock.json b/package-lock.json index 9089476..12bc520 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@smithery/api", - "version": "0.55.0", + "version": "0.56.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@smithery/api", - "version": "0.55.0", + "version": "0.56.0", "license": "Apache-2.0", "devDependencies": { "@arethetypeswrong/cli": "^0.17.0", diff --git a/package.json b/package.json index 337e9c1..b2bc0cc 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@smithery/api", - "version": "0.55.0", + "version": "0.56.0", "description": "The official TypeScript library for the Smithery API", "author": "Smithery ", "types": "dist/index.d.ts", diff --git a/src/client.ts b/src/client.ts index 61dbe82..d6932f9 100644 --- a/src/client.ts +++ b/src/client.ts @@ -91,6 +91,8 @@ import { SkillSetResponse, SkillSyncParams, SkillSyncResponse, + SkillUploadParams, + SkillUploadResponse, Skills, } from './resources/skills/skills'; import { type Fetch } from './internal/builtin-types'; @@ -889,6 +891,7 @@ export declare namespace Smithery { type SkillGetResponse as SkillGetResponse, type SkillSetResponse as SkillSetResponse, type SkillSyncResponse as SkillSyncResponse, + type SkillUploadResponse as SkillUploadResponse, type SkillListResponsesSkillsPage as SkillListResponsesSkillsPage, type SkillCreateParams as SkillCreateParams, type SkillListParams as SkillListParams, @@ -897,6 +900,7 @@ export declare namespace Smithery { type SkillGetParams as SkillGetParams, type SkillSetParams as SkillSetParams, type SkillSyncParams as SkillSyncParams, + type SkillUploadParams as SkillUploadParams, }; export { diff --git a/src/resources/index.ts b/src/resources/index.ts index 7cd7914..a6c687c 100644 --- a/src/resources/index.ts +++ b/src/resources/index.ts @@ -45,6 +45,7 @@ export { type SkillGetResponse, type SkillSetResponse, type SkillSyncResponse, + type SkillUploadResponse, type SkillCreateParams, type SkillListParams, type SkillDeleteParams, @@ -52,6 +53,7 @@ export { type SkillGetParams, type SkillSetParams, type SkillSyncParams, + type SkillUploadParams, type SkillListResponsesSkillsPage, } from './skills/skills'; export { diff --git a/src/resources/skills/index.ts b/src/resources/skills/index.ts index ba7dc01..22f0719 100644 --- a/src/resources/skills/index.ts +++ b/src/resources/skills/index.ts @@ -24,6 +24,7 @@ export { type SkillGetResponse, type SkillSetResponse, type SkillSyncResponse, + type SkillUploadResponse, type SkillCreateParams, type SkillListParams, type SkillDeleteParams, @@ -31,6 +32,7 @@ export { type SkillGetParams, type SkillSetParams, type SkillSyncParams, + type SkillUploadParams, type SkillListResponsesSkillsPage, } from './skills'; export { diff --git a/src/resources/skills/skills.ts b/src/resources/skills/skills.ts index 3593aac..f8af1d2 100644 --- a/src/resources/skills/skills.ts +++ b/src/resources/skills/skills.ts @@ -31,8 +31,10 @@ import { } from './votes'; import { APIPromise } from '../../core/api-promise'; import { PagePromise, SkillsPage, type SkillsPageParams } from '../../core/pagination'; +import { type Uploadable } from '../../core/uploads'; import { buildHeaders } from '../../internal/headers'; import { RequestOptions } from '../../internal/request-options'; +import { multipartFormRequestOptions } from '../../internal/uploads'; import { path } from '../../internal/utils/path'; /** @@ -72,8 +74,7 @@ export class Skills extends APIResource { } /** - * Download a ZIP bundle containing all skill files, fetched via well-known - * endpoints. + * Download a ZIP bundle containing all skill files. */ download(slug: string, params: SkillDownloadParams, options?: RequestOptions): APIPromise { const { namespace } = params; @@ -93,13 +94,12 @@ export class Skills extends APIResource { } /** - * Idempotent endpoint to create or sync a skill. If the skill does not exist, - * creates it. If it exists, updates displayName, description, and externalStars - * from GitHub. + * Idempotent endpoint to create or update a GitHub-backed skill. Send + * application/json with `gitUrl`. */ set(slug: string, params: SkillSetParams, options?: RequestOptions): APIPromise { - const { namespace, ...body } = params; - return this._client.put(path`/skills/${namespace}/${slug}`, { body, ...options }); + const { namespace, body } = params; + return this._client.put(path`/skills/${namespace}/${slug}`, { body: body, ...options }); } /** @@ -112,6 +112,17 @@ export class Skills extends APIResource { const { namespace } = params; return this._client.post(path`/skills/${namespace}/${slug}/sync`, options); } + + /** + * Upload or replace a skill bundle via multipart/form-data with an `archive` file. + */ + upload(slug: string, params: SkillUploadParams, options?: RequestOptions): APIPromise { + const { namespace, ...body } = params; + return this._client.put( + path`/skills/${namespace}/${slug}/upload`, + multipartFormRequestOptions({ body, ...options }, this._client), + ); + } } export type SkillListResponsesSkillsPage = SkillsPage; @@ -199,7 +210,7 @@ export interface SkillListResponse { /** * URL to the skill's source repository. */ - gitUrl?: string; + gitUrl?: string | null; /** * Number of reviews for this skill. @@ -250,7 +261,7 @@ export interface SkillGetResponse { externalStars: number; - gitUrl: string; + gitUrl: string | null; listed: boolean; @@ -294,7 +305,7 @@ export interface SkillSetResponse { externalStars: number; - gitUrl: string; + gitUrl: string | null; listed: boolean; @@ -323,6 +334,28 @@ export interface SkillSyncResponse { updatedAt: string; } +export interface SkillUploadResponse { + id: string; + + createdAt: string; + + description: string; + + displayName: string; + + externalStars: number; + + gitUrl: string | null; + + listed: boolean; + + namespace: string; + + slug: string; + + updatedAt: string; +} + export interface SkillCreateParams { /** * GitHub URL pointing to a repository with SKILL.md @@ -404,15 +437,28 @@ export interface SkillSetParams { namespace: string; /** - * Body param: GitHub URL pointing to a repository with SKILL.md + * Body param */ - gitUrl: string; + body: unknown; } export interface SkillSyncParams { namespace: string; } +export interface SkillUploadParams { + /** + * Path param + */ + namespace: string; + + /** + * Body param: ZIP file upload containing a skill folder with SKILL.md and any + * scripts, references, or assets. + */ + archive: Uploadable; +} + Skills.Votes = Votes; Skills.Reviews = Reviews; @@ -424,6 +470,7 @@ export declare namespace Skills { type SkillGetResponse as SkillGetResponse, type SkillSetResponse as SkillSetResponse, type SkillSyncResponse as SkillSyncResponse, + type SkillUploadResponse as SkillUploadResponse, type SkillListResponsesSkillsPage as SkillListResponsesSkillsPage, type SkillCreateParams as SkillCreateParams, type SkillListParams as SkillListParams, @@ -432,6 +479,7 @@ export declare namespace Skills { type SkillGetParams as SkillGetParams, type SkillSetParams as SkillSetParams, type SkillSyncParams as SkillSyncParams, + type SkillUploadParams as SkillUploadParams, }; export { diff --git a/src/version.ts b/src/version.ts index 7c47df5..2d175e1 100644 --- a/src/version.ts +++ b/src/version.ts @@ -1 +1 @@ -export const VERSION = '0.55.0'; // x-release-please-version +export const VERSION = '0.56.0'; // x-release-please-version diff --git a/tests/api-resources/skills/skills.test.ts b/tests/api-resources/skills/skills.test.ts index bd1fd48..020bab6 100644 --- a/tests/api-resources/skills/skills.test.ts +++ b/tests/api-resources/skills/skills.test.ts @@ -1,6 +1,6 @@ // File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. -import Smithery from '@smithery/api'; +import Smithery, { toFile } from '@smithery/api'; const client = new Smithery({ apiKey: 'My API Key', @@ -110,7 +110,7 @@ describe('resource skills', () => { test.skip('set: only required params', async () => { const responsePromise = client.skills.set('slug', { namespace: 'namespace', - gitUrl: 'https://example.com', + body: {}, }); const rawResponse = await responsePromise.asResponse(); expect(rawResponse).toBeInstanceOf(Response); @@ -125,7 +125,7 @@ describe('resource skills', () => { test.skip('set: required and optional params', async () => { const response = await client.skills.set('slug', { namespace: 'namespace', - gitUrl: 'https://example.com', + body: {}, }); }); @@ -145,4 +145,27 @@ describe('resource skills', () => { test.skip('sync: required and optional params', async () => { const response = await client.skills.sync('slug', { namespace: 'namespace' }); }); + + // Mock server tests are disabled + test.skip('upload: only required params', async () => { + const responsePromise = client.skills.upload('slug', { + namespace: 'namespace', + archive: await toFile(Buffer.from('Example data'), 'README.md'), + }); + const rawResponse = await responsePromise.asResponse(); + expect(rawResponse).toBeInstanceOf(Response); + const response = await responsePromise; + expect(response).not.toBeInstanceOf(Response); + const dataAndResponse = await responsePromise.withResponse(); + expect(dataAndResponse.data).toBe(response); + expect(dataAndResponse.response).toBe(rawResponse); + }); + + // Mock server tests are disabled + test.skip('upload: required and optional params', async () => { + const response = await client.skills.upload('slug', { + namespace: 'namespace', + archive: await toFile(Buffer.from('Example data'), 'README.md'), + }); + }); });