@anytio/pspm 0.0.4 → 0.0.5
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/dist/index.js +5 -4
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -542,9 +542,9 @@ async function add(specifier, _options) {
|
|
|
542
542
|
process.exit(1);
|
|
543
543
|
}
|
|
544
544
|
const versionInfo = versionResponse.data;
|
|
545
|
-
const
|
|
546
|
-
const tarballResponse = await fetch(downloadUrl, {
|
|
547
|
-
headers: {
|
|
545
|
+
const isPresignedUrl = versionInfo.downloadUrl.includes(".r2.cloudflarestorage.com") || versionInfo.downloadUrl.includes("X-Amz-Signature");
|
|
546
|
+
const tarballResponse = await fetch(versionInfo.downloadUrl, {
|
|
547
|
+
headers: isPresignedUrl ? {} : {
|
|
548
548
|
Authorization: `Bearer ${apiKey}`
|
|
549
549
|
},
|
|
550
550
|
redirect: "follow"
|
|
@@ -686,8 +686,9 @@ async function install(options) {
|
|
|
686
686
|
}
|
|
687
687
|
const [, username, name] = match;
|
|
688
688
|
console.log(`Installing ${fullName}@${entry.version}...`);
|
|
689
|
+
const isPresignedUrl = entry.resolved.includes(".r2.cloudflarestorage.com") || entry.resolved.includes("X-Amz-Signature");
|
|
689
690
|
const response = await fetch(entry.resolved, {
|
|
690
|
-
headers: {
|
|
691
|
+
headers: isPresignedUrl ? {} : {
|
|
691
692
|
Authorization: `Bearer ${apiKey}`
|
|
692
693
|
},
|
|
693
694
|
redirect: "follow"
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../packages/shared/pspm-types/src/integrity.ts","../../../packages/shared/pspm-types/src/specifier.ts","../../../packages/shared/pspm-types/src/version.ts","../../../packages/sdk/src/fetchers/cli-fetcher.ts","../../../packages/sdk/src/generated/fetch/index.ts","../src/api-client.ts","../src/errors.ts","../src/config.ts","../src/lockfile.ts","../src/commands/add.ts","../src/commands/config/init.ts","../src/commands/config/show.ts","../src/commands/install.ts","../src/commands/list.ts","../src/commands/login.ts","../src/commands/logout.ts","../src/commands/publish.ts","../src/commands/remove.ts","../src/commands/unpublish.ts","../src/commands/update.ts","../src/commands/whoami.ts","../src/index.ts"],"names":["version","configure","config","readFile","mkdir","dirname","writeFile","join","exec","promisify","stat","createHash","rm","exchangeCliToken","execCb","packageJson","semver","match","__dirname"],"mappings":"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","file":"index.js","sourcesContent":["import { createHash } from \"node:crypto\";\n\n/**\n * Calculate integrity hash for a buffer.\n * Uses SHA-256 with base64 encoding, prefixed with \"sha256-\".\n *\n * @param data - The buffer to hash\n * @returns Integrity string (e.g., \"sha256-abc123...\")\n */\nexport function calculateIntegrity(data: Buffer): string {\n\tconst hash = createHash(\"sha256\").update(data).digest(\"base64\");\n\treturn `sha256-${hash}`;\n}\n\n/**\n * Verify that a buffer matches an expected integrity hash.\n *\n * @param data - The buffer to verify\n * @param expectedIntegrity - The expected integrity string\n * @returns True if the integrity matches\n */\nexport function verifyIntegrity(\n\tdata: Buffer,\n\texpectedIntegrity: string,\n): boolean {\n\tconst match = expectedIntegrity.match(/^sha256-(.+)$/);\n\tif (!match) {\n\t\treturn false;\n\t}\n\n\tconst actualHash = createHash(\"sha256\").update(data).digest(\"base64\");\n\treturn actualHash === match[1];\n}\n","/**\n * Parsed skill specifier (from CLI input)\n * e.g., \"@user/bsheng/vite_slides@^2.0.0\"\n */\nexport interface SkillSpecifier {\n\tusername: string;\n\tname: string;\n\tversionRange?: string;\n}\n\n/**\n * Skill specifier regex pattern\n * Matches: @user/{username}/{name}[@{version}]\n */\nconst SPECIFIER_PATTERN =\n\t/^@user\\/([a-zA-Z0-9_-]+)\\/([a-z][a-z0-9_-]*)(?:@(.+))?$/;\n\n/**\n * Parse a skill specifier string.\n *\n * @param specifier - The specifier string (e.g., \"@user/bsheng/vite_slides@^2.0.0\")\n * @returns Parsed specifier or null if invalid\n *\n * @example\n * ```typescript\n * parseSkillSpecifier(\"@user/bsheng/my-skill@^1.0.0\")\n * // => { username: \"bsheng\", name: \"my-skill\", versionRange: \"^1.0.0\" }\n *\n * parseSkillSpecifier(\"@user/bsheng/my-skill\")\n * // => { username: \"bsheng\", name: \"my-skill\", versionRange: undefined }\n * ```\n */\nexport function parseSkillSpecifier(specifier: string): SkillSpecifier | null {\n\tconst match = specifier.match(SPECIFIER_PATTERN);\n\n\tif (!match) {\n\t\treturn null;\n\t}\n\n\treturn {\n\t\tusername: match[1],\n\t\tname: match[2],\n\t\tversionRange: match[3],\n\t};\n}\n\n/**\n * Generate a full skill identifier string.\n *\n * @param username - The owner's username\n * @param name - The skill name\n * @param version - Optional version string\n * @returns Full identifier (e.g., \"@user/bsheng/my-skill@1.0.0\")\n */\nexport function generateSkillIdentifier(\n\tusername: string,\n\tname: string,\n\tversion?: string,\n): string {\n\tconst base = `@user/${username}/${name}`;\n\treturn version ? `${base}@${version}` : base;\n}\n","import * as semver from \"semver\";\n\n/**\n * Resolve the best matching version from a list of available versions.\n *\n * @param range - The version range to match (e.g., \"^1.0.0\", \"~2.1.0\", \"*\")\n * @param availableVersions - List of available version strings\n * @returns The best matching version or null if none found\n */\nexport function resolveVersion(\n\trange: string,\n\tavailableVersions: string[],\n): string | null {\n\tconst sorted = availableVersions\n\t\t.filter((v) => semver.valid(v))\n\t\t.sort((a, b) => semver.rcompare(a, b));\n\n\tif (!range || range === \"latest\" || range === \"*\") {\n\t\treturn sorted[0] ?? null;\n\t}\n\n\treturn semver.maxSatisfying(sorted, range);\n}\n\n/**\n * Check if a version satisfies a given range.\n */\nexport function versionSatisfies(version: string, range: string): boolean {\n\treturn semver.satisfies(version, range);\n}\n\n/**\n * Normalize a version range string.\n * Converts \"latest\" or empty to \"*\".\n */\nexport function normalizeVersionRange(range?: string): string {\n\tif (!range || range === \"latest\") {\n\t\treturn \"*\";\n\t}\n\treturn range;\n}\n\n/**\n * Compare two versions.\n * Returns: -1 if a < b, 0 if a === b, 1 if a > b\n */\nexport function compareVersions(a: string, b: string): number {\n\treturn semver.compare(a, b);\n}\n\n/**\n * Check if version a is greater than version b.\n */\nexport function isNewerVersion(a: string, b: string): boolean {\n\treturn semver.gt(a, b);\n}\n\n/**\n * Get the latest version from a list.\n */\nexport function getLatestVersion(versions: string[]): string | null {\n\tconst valid = versions.filter((v) => semver.valid(v));\n\tif (valid.length === 0) return null;\n\treturn valid.sort((a, b) => semver.rcompare(a, b))[0];\n}\n","/**\n * Custom fetch wrapper for Orval-generated SDK\n *\n * Handles authentication and base URL configuration.\n */\n\nexport interface SDKConfig {\n\tbaseUrl: string;\n\tapiKey: string;\n}\n\nlet config: SDKConfig | null = null;\n\n/**\n * Configure the SDK with base URL and API key.\n * Must be called before making any API requests.\n *\n * @example\n * ```typescript\n * import { configure } from \"@repo/sdk\";\n *\n * configure({\n * baseUrl: \"http://localhost:5600\",\n * apiKey: \"your-api-key\"\n * });\n * ```\n */\nexport function configure(options: SDKConfig): void {\n\tconfig = options;\n}\n\n/**\n * Get the current SDK configuration.\n * @throws Error if not configured\n */\nexport function getConfig(): SDKConfig {\n\tif (!config) {\n\t\tthrow new Error(\"SDK not configured. Call configure() first.\");\n\t}\n\treturn config;\n}\n\n/**\n * Check if the SDK is configured.\n */\nexport function isConfigured(): boolean {\n\treturn config !== null;\n}\n\n/**\n * Error class for SDK API errors\n */\nexport class SDKError extends Error {\n\tconstructor(\n\t\tmessage: string,\n\t\tpublic readonly status: number,\n\t\tpublic readonly body?: string,\n\t) {\n\t\tsuper(message);\n\t\tthis.name = \"SDKError\";\n\t}\n}\n\n/**\n * Response structure returned by all SDK functions\n */\nexport interface SDKResponse<T> {\n\tdata: T;\n\tstatus: number;\n\theaders: Headers;\n}\n\n/**\n * Custom fetch function for Orval\n *\n * This is used by all generated API functions to make HTTP requests.\n * It handles authentication, error handling, and response parsing.\n *\n * Returns { data, status, headers } structure expected by Orval v8.\n */\nexport async function customFetch<T>(\n\turl: string,\n\toptions: RequestInit,\n): Promise<T> {\n\tconst { baseUrl, apiKey } = getConfig();\n\n\t// The URL from Orval will be like \"/api/skills/me\"\n\t// We need to prepend the baseUrl\n\tconst fullUrl = `${baseUrl}${url}`;\n\n\tconst response = await fetch(fullUrl, {\n\t\t...options,\n\t\theaders: {\n\t\t\t...options.headers,\n\t\t\tAuthorization: `Bearer ${apiKey}`,\n\t\t\t\"Content-Type\": \"application/json\",\n\t\t},\n\t});\n\n\tconst text = await response.text();\n\tlet data: unknown = null;\n\n\tif (text) {\n\t\ttry {\n\t\t\tdata = JSON.parse(text);\n\t\t} catch {\n\t\t\tdata = text;\n\t\t}\n\t}\n\n\t// Return the structure expected by Orval v8: { data, status, headers }\n\treturn {\n\t\tdata,\n\t\tstatus: response.status,\n\t\theaders: response.headers,\n\t} as T;\n}\n","/**\n * Generated by orval v8.0.2 🍺\n * Do not edit manually.\n * PSPM API\n * Backend API for PSPM - Private Skill Package Manager for Claude Code\n * OpenAPI spec version: 1.0.0\n */\nimport { customFetch } from '../../fetchers/cli-fetcher';\n/**\n * API key record (without the key value)\n */\nexport interface ApiKey {\n id: string;\n name: string;\n keyPrefix: string;\n userId: string;\n expiresAt: string | null;\n lastUsedAt: string | null;\n createdAt: string | null;\n}\n\nexport type ApiKeyListResponse = ApiKey[];\n\nexport type Item = {\n path: (string | number)[];\n message: string;\n};\n\nexport type ApiErrorCode = typeof ApiErrorCode[keyof typeof ApiErrorCode];\n\n\nexport const ApiErrorCode = {\n BAD_REQUEST: 'BAD_REQUEST',\n UNAUTHORIZED: 'UNAUTHORIZED',\n FORBIDDEN: 'FORBIDDEN',\n NOT_FOUND: 'NOT_FOUND',\n CONFLICT: 'CONFLICT',\n VALIDATION_ERROR: 'VALIDATION_ERROR',\n INTERNAL_ERROR: 'INTERNAL_ERROR',\n} as const;\n\nexport type ApiErrorDetails = {[key: string]: unknown | null};\n\nexport interface ApiError {\n code: ApiErrorCode;\n message: string;\n details?: ApiErrorDetails;\n requestId?: string;\n timestamp: string;\n}\n\nexport type ValidationError = ApiError & {\n code?: 'VALIDATION_ERROR';\n details: {\n issues: Item[];\n};\n};\n\n/**\n * Created API key with the plain key (only shown once)\n */\nexport interface CreateApiKeyResponse {\n apiKey: ApiKey;\n plainKey: string;\n}\n\n/**\n * Input for creating a new API key\n */\nexport interface CreateApiKeyInput {\n /**\n * @minLength 1\n * @maxLength 100\n */\n name: string;\n expiresAt?: string | null;\n}\n\nexport interface SuccessResponse {\n success: boolean;\n}\n\nexport interface DeleteApiKeyInput {\n id: string;\n}\n\nexport interface UpdateApiKeyInput {\n id: string;\n /**\n * @minLength 1\n * @maxLength 100\n */\n name: string;\n}\n\nexport interface CreateCliTokenResponse {\n token: string;\n}\n\nexport interface CreateCliTokenInput {\n /** @minLength 1 */\n state: string;\n /** @minLength 1 */\n port: string;\n}\n\nexport interface ExchangeCliTokenResponse {\n apiKey: string;\n username: string;\n}\n\nexport interface ExchangeCliTokenInput {\n /** @minLength 1 */\n token: string;\n}\n\n/**\n * User's username information\n */\nexport interface UsernameInfo {\n username: string | null;\n canChange: boolean;\n usernameChangedAt: string | null;\n}\n\nexport interface CheckUsernameOutput {\n available: boolean;\n error: string | null;\n}\n\nexport interface UpdateUsernameOutput {\n success: boolean;\n username: string | null;\n error: string | null;\n}\n\nexport interface UpdateUsernameInput {\n /**\n * @minLength 3\n * @maxLength 39\n */\n username: string;\n}\n\nexport interface GetSuggestionsOutput {\n suggestions: string[];\n}\n\n/**\n * Current user info\n */\nexport type MeResponseData = {\n userId: string;\n username: string;\n} | null\n\n/**\n * Skill metadata\n */\nexport interface Skill {\n id: string;\n name: string;\n userId: string;\n description: string | null;\n createdAt: string | null;\n updatedAt: string | null;\n}\n\n/**\n * Skill metadata with owner username\n */\nexport type SkillWithUser = Skill & {\n username: string;\n};\n\n/**\n * List of skills\n */\nexport type SkillListResponse = SkillWithUser[];\n\n/**\n * User's username\n * @minLength 1\n * @maxLength 50\n * @pattern ^[a-zA-Z0-9_-]+$\n */\nexport type Username = string;\n\n/**\n * Skill name identifier\n * @minLength 1\n * @maxLength 100\n * @pattern ^[a-z][a-z0-9-]*$\n */\nexport type SkillName = string;\n\n/**\n * Semantic version string (e.g., 1.0.0)\n */\nexport type Semver = string;\n\nexport type PspmMetadataType = typeof PspmMetadataType[keyof typeof PspmMetadataType];\n\n\nexport const PspmMetadataType = {\n skill: 'skill',\n} as const;\n\nexport type PspmMetadataRequirements = {\n claude?: string;\n node?: string;\n};\n\n/**\n * PSPM-specific metadata for the skill package\n */\nexport interface PspmMetadata {\n type: PspmMetadataType;\n capabilities?: string[];\n requirements?: PspmMetadataRequirements;\n}\n\n/**\n * Skill package manifest (package.json)\n */\nexport interface SkillManifest {\n name: SkillName;\n version: Semver;\n /** @maxLength 500 */\n description?: string;\n files?: string[];\n pspm?: PspmMetadata;\n}\n\n/**\n * Skill version metadata\n */\nexport interface SkillVersion {\n id: string;\n skillId: string;\n version: string;\n r2Key: string;\n checksum: string;\n manifest: SkillManifest;\n publishedAt: string | null;\n}\n\n/**\n * Skill version metadata with download URL\n */\nexport type SkillVersionWithDownload = SkillVersion & {\n downloadUrl: string;\n} | null;\n\n/**\n * Published skill with version info\n */\nexport interface PublishSkillResponse {\n skill: SkillWithUser;\n version: SkillVersion;\n}\n\n/**\n * Input for publishing a skill\n */\nexport interface PublishSkillInput {\n manifest: SkillManifest;\n /** @maxLength 73400320 */\n tarballBase64: string;\n}\n\nexport type CapturedErrorSource = typeof CapturedErrorSource[keyof typeof CapturedErrorSource];\n\n\nexport const CapturedErrorSource = {\n hydration: 'hydration',\n loader: 'loader',\n action: 'action',\n render: 'render',\n streaming: 'streaming',\n network: 'network',\n global: 'global',\n unknown: 'unknown',\n} as const;\n\nexport type CapturedErrorSeverity = typeof CapturedErrorSeverity[keyof typeof CapturedErrorSeverity];\n\n\nexport const CapturedErrorSeverity = {\n fatal: 'fatal',\n error: 'error',\n warning: 'warning',\n info: 'info',\n} as const;\n\nexport type CapturedErrorContext = {[key: string]: unknown | null};\n\n/**\n * A captured client error\n */\nexport interface CapturedError {\n id: string;\n message: string;\n stack?: string;\n componentStack?: string;\n source: CapturedErrorSource;\n severity: CapturedErrorSeverity;\n route?: string;\n timestamp: number;\n context?: CapturedErrorContext;\n digest?: string;\n}\n\n/**\n * Payload for reporting client errors\n */\nexport interface ErrorReportPayload {\n errors: CapturedError[];\n userAgent: string;\n url: string;\n timestamp: number;\n}\n\nexport type CheckUsernameAvailabilityParams = {\n/**\n * @minLength 3\n * @maxLength 39\n */\nusername: string;\n};\n\n/**\n * Retrieve all API keys for the authenticated user\n * @summary List all API keys\n */\nexport type listApiKeysResponse200 = {\n data: ApiKeyListResponse\n status: 200\n}\n\nexport type listApiKeysResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type listApiKeysResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type listApiKeysResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type listApiKeysResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type listApiKeysResponse500 = {\n data: ApiError\n status: 500\n}\n \nexport type listApiKeysResponseSuccess = (listApiKeysResponse200) & {\n headers: Headers;\n};\nexport type listApiKeysResponseError = (listApiKeysResponse400 | listApiKeysResponse401 | listApiKeysResponse403 | listApiKeysResponse404 | listApiKeysResponse500) & {\n headers: Headers;\n};\n\nexport type listApiKeysResponse = (listApiKeysResponseSuccess | listApiKeysResponseError)\n\nexport const getListApiKeysUrl = () => {\n\n\n \n\n return `/api/api-keys/api-keys`\n}\n\nexport const listApiKeys = async ( options?: RequestInit): Promise<listApiKeysResponse> => {\n \n return customFetch<listApiKeysResponse>(getListApiKeysUrl(),\n { \n ...options,\n method: 'GET'\n \n \n }\n);}\n\n\n\n/**\n * Create a new API key with optional expiration\n * @summary Create a new API key\n */\nexport type createApiKeyResponse200 = {\n data: CreateApiKeyResponse\n status: 200\n}\n\nexport type createApiKeyResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type createApiKeyResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type createApiKeyResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type createApiKeyResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type createApiKeyResponse500 = {\n data: ApiError\n status: 500\n}\n \nexport type createApiKeyResponseSuccess = (createApiKeyResponse200) & {\n headers: Headers;\n};\nexport type createApiKeyResponseError = (createApiKeyResponse400 | createApiKeyResponse401 | createApiKeyResponse403 | createApiKeyResponse404 | createApiKeyResponse500) & {\n headers: Headers;\n};\n\nexport type createApiKeyResponse = (createApiKeyResponseSuccess | createApiKeyResponseError)\n\nexport const getCreateApiKeyUrl = () => {\n\n\n \n\n return `/api/api-keys/api-keys`\n}\n\nexport const createApiKey = async (createApiKeyInput: CreateApiKeyInput, options?: RequestInit): Promise<createApiKeyResponse> => {\n \n return customFetch<createApiKeyResponse>(getCreateApiKeyUrl(),\n { \n ...options,\n method: 'POST',\n headers: { 'Content-Type': 'application/json', ...options?.headers },\n body: JSON.stringify(\n createApiKeyInput,)\n }\n);}\n\n\n\n/**\n * Revoke and delete an API key\n * @summary Delete an API key\n */\nexport type deleteApiKeyResponse200 = {\n data: SuccessResponse\n status: 200\n}\n\nexport type deleteApiKeyResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type deleteApiKeyResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type deleteApiKeyResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type deleteApiKeyResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type deleteApiKeyResponse500 = {\n data: ApiError\n status: 500\n}\n \nexport type deleteApiKeyResponseSuccess = (deleteApiKeyResponse200) & {\n headers: Headers;\n};\nexport type deleteApiKeyResponseError = (deleteApiKeyResponse400 | deleteApiKeyResponse401 | deleteApiKeyResponse403 | deleteApiKeyResponse404 | deleteApiKeyResponse500) & {\n headers: Headers;\n};\n\nexport type deleteApiKeyResponse = (deleteApiKeyResponseSuccess | deleteApiKeyResponseError)\n\nexport const getDeleteApiKeyUrl = () => {\n\n\n \n\n return `/api/api-keys/api-keys`\n}\n\nexport const deleteApiKey = async (deleteApiKeyInput: DeleteApiKeyInput, options?: RequestInit): Promise<deleteApiKeyResponse> => {\n \n return customFetch<deleteApiKeyResponse>(getDeleteApiKeyUrl(),\n { \n ...options,\n method: 'DELETE',\n headers: { 'Content-Type': 'application/json', ...options?.headers },\n body: JSON.stringify(\n deleteApiKeyInput,)\n }\n);}\n\n\n\n/**\n * Update the name/description of an API key\n * @summary Update API key name\n */\nexport type updateApiKeyNameResponse200 = {\n data: ApiKey\n status: 200\n}\n\nexport type updateApiKeyNameResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type updateApiKeyNameResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type updateApiKeyNameResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type updateApiKeyNameResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type updateApiKeyNameResponse500 = {\n data: ApiError\n status: 500\n}\n \nexport type updateApiKeyNameResponseSuccess = (updateApiKeyNameResponse200) & {\n headers: Headers;\n};\nexport type updateApiKeyNameResponseError = (updateApiKeyNameResponse400 | updateApiKeyNameResponse401 | updateApiKeyNameResponse403 | updateApiKeyNameResponse404 | updateApiKeyNameResponse500) & {\n headers: Headers;\n};\n\nexport type updateApiKeyNameResponse = (updateApiKeyNameResponseSuccess | updateApiKeyNameResponseError)\n\nexport const getUpdateApiKeyNameUrl = () => {\n\n\n \n\n return `/api/api-keys/api-keys`\n}\n\nexport const updateApiKeyName = async (updateApiKeyInput: UpdateApiKeyInput, options?: RequestInit): Promise<updateApiKeyNameResponse> => {\n \n return customFetch<updateApiKeyNameResponse>(getUpdateApiKeyNameUrl(),\n { \n ...options,\n method: 'PUT',\n headers: { 'Content-Type': 'application/json', ...options?.headers },\n body: JSON.stringify(\n updateApiKeyInput,)\n }\n);}\n\n\n\n/**\n * Create a short-lived token for CLI browser-based authentication\n * @summary Create a CLI login token\n */\nexport type createCliTokenResponse200 = {\n data: CreateCliTokenResponse\n status: 200\n}\n\nexport type createCliTokenResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type createCliTokenResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type createCliTokenResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type createCliTokenResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type createCliTokenResponse500 = {\n data: ApiError\n status: 500\n}\n \nexport type createCliTokenResponseSuccess = (createCliTokenResponse200) & {\n headers: Headers;\n};\nexport type createCliTokenResponseError = (createCliTokenResponse400 | createCliTokenResponse401 | createCliTokenResponse403 | createCliTokenResponse404 | createCliTokenResponse500) & {\n headers: Headers;\n};\n\nexport type createCliTokenResponse = (createCliTokenResponseSuccess | createCliTokenResponseError)\n\nexport const getCreateCliTokenUrl = () => {\n\n\n \n\n return `/api/api-keys/cli-token`\n}\n\nexport const createCliToken = async (createCliTokenInput: CreateCliTokenInput, options?: RequestInit): Promise<createCliTokenResponse> => {\n \n return customFetch<createCliTokenResponse>(getCreateCliTokenUrl(),\n { \n ...options,\n method: 'POST',\n headers: { 'Content-Type': 'application/json', ...options?.headers },\n body: JSON.stringify(\n createCliTokenInput,)\n }\n);}\n\n\n\n/**\n * Exchange a CLI login token for an API key (called by CLI after browser redirect)\n * @summary Exchange CLI token for API key\n */\nexport type exchangeCliTokenResponse200 = {\n data: ExchangeCliTokenResponse\n status: 200\n}\n\nexport type exchangeCliTokenResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type exchangeCliTokenResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type exchangeCliTokenResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type exchangeCliTokenResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type exchangeCliTokenResponse500 = {\n data: ApiError\n status: 500\n}\n \nexport type exchangeCliTokenResponseSuccess = (exchangeCliTokenResponse200) & {\n headers: Headers;\n};\nexport type exchangeCliTokenResponseError = (exchangeCliTokenResponse400 | exchangeCliTokenResponse401 | exchangeCliTokenResponse403 | exchangeCliTokenResponse404 | exchangeCliTokenResponse500) & {\n headers: Headers;\n};\n\nexport type exchangeCliTokenResponse = (exchangeCliTokenResponseSuccess | exchangeCliTokenResponseError)\n\nexport const getExchangeCliTokenUrl = () => {\n\n\n \n\n return `/api/api-keys/cli-token-exchange`\n}\n\nexport const exchangeCliToken = async (exchangeCliTokenInput: ExchangeCliTokenInput, options?: RequestInit): Promise<exchangeCliTokenResponse> => {\n \n return customFetch<exchangeCliTokenResponse>(getExchangeCliTokenUrl(),\n { \n ...options,\n method: 'POST',\n headers: { 'Content-Type': 'application/json', ...options?.headers },\n body: JSON.stringify(\n exchangeCliTokenInput,)\n }\n);}\n\n\n\n/**\n * Get current user's username and whether they can change it\n * @summary Get username info\n */\nexport type getUsernameInfoResponse200 = {\n data: UsernameInfo\n status: 200\n}\n\nexport type getUsernameInfoResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type getUsernameInfoResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type getUsernameInfoResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type getUsernameInfoResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type getUsernameInfoResponse500 = {\n data: ApiError\n status: 500\n}\n \nexport type getUsernameInfoResponseSuccess = (getUsernameInfoResponse200) & {\n headers: Headers;\n};\nexport type getUsernameInfoResponseError = (getUsernameInfoResponse400 | getUsernameInfoResponse401 | getUsernameInfoResponse403 | getUsernameInfoResponse404 | getUsernameInfoResponse500) & {\n headers: Headers;\n};\n\nexport type getUsernameInfoResponse = (getUsernameInfoResponseSuccess | getUsernameInfoResponseError)\n\nexport const getGetUsernameInfoUrl = () => {\n\n\n \n\n return `/api/auth/username`\n}\n\nexport const getUsernameInfo = async ( options?: RequestInit): Promise<getUsernameInfoResponse> => {\n \n return customFetch<getUsernameInfoResponse>(getGetUsernameInfoUrl(),\n { \n ...options,\n method: 'GET'\n \n \n }\n);}\n\n\n\n/**\n * Update the current user's username. Can only be done once.\n * @summary Update username\n */\nexport type updateUsernameResponse200 = {\n data: UpdateUsernameOutput\n status: 200\n}\n\nexport type updateUsernameResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type updateUsernameResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type updateUsernameResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type updateUsernameResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type updateUsernameResponse500 = {\n data: ApiError\n status: 500\n}\n \nexport type updateUsernameResponseSuccess = (updateUsernameResponse200) & {\n headers: Headers;\n};\nexport type updateUsernameResponseError = (updateUsernameResponse400 | updateUsernameResponse401 | updateUsernameResponse403 | updateUsernameResponse404 | updateUsernameResponse500) & {\n headers: Headers;\n};\n\nexport type updateUsernameResponse = (updateUsernameResponseSuccess | updateUsernameResponseError)\n\nexport const getUpdateUsernameUrl = () => {\n\n\n \n\n return `/api/auth/username`\n}\n\nexport const updateUsername = async (updateUsernameInput: UpdateUsernameInput, options?: RequestInit): Promise<updateUsernameResponse> => {\n \n return customFetch<updateUsernameResponse>(getUpdateUsernameUrl(),\n { \n ...options,\n method: 'PUT',\n headers: { 'Content-Type': 'application/json', ...options?.headers },\n body: JSON.stringify(\n updateUsernameInput,)\n }\n);}\n\n\n\n/**\n * Check if a username is available for use\n * @summary Check username availability\n */\nexport type checkUsernameAvailabilityResponse200 = {\n data: CheckUsernameOutput\n status: 200\n}\n\nexport type checkUsernameAvailabilityResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type checkUsernameAvailabilityResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type checkUsernameAvailabilityResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type checkUsernameAvailabilityResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type checkUsernameAvailabilityResponse500 = {\n data: ApiError\n status: 500\n}\n \nexport type checkUsernameAvailabilityResponseSuccess = (checkUsernameAvailabilityResponse200) & {\n headers: Headers;\n};\nexport type checkUsernameAvailabilityResponseError = (checkUsernameAvailabilityResponse400 | checkUsernameAvailabilityResponse401 | checkUsernameAvailabilityResponse403 | checkUsernameAvailabilityResponse404 | checkUsernameAvailabilityResponse500) & {\n headers: Headers;\n};\n\nexport type checkUsernameAvailabilityResponse = (checkUsernameAvailabilityResponseSuccess | checkUsernameAvailabilityResponseError)\n\nexport const getCheckUsernameAvailabilityUrl = (params: CheckUsernameAvailabilityParams,) => {\n const normalizedParams = new URLSearchParams();\n\n Object.entries(params || {}).forEach(([key, value]) => {\n \n if (value !== undefined) {\n normalizedParams.append(key, value === null ? 'null' : value.toString())\n }\n });\n\n const stringifiedParams = normalizedParams.toString();\n\n return stringifiedParams.length > 0 ? `/api/auth/username/check?${stringifiedParams}` : `/api/auth/username/check`\n}\n\nexport const checkUsernameAvailability = async (params: CheckUsernameAvailabilityParams, options?: RequestInit): Promise<checkUsernameAvailabilityResponse> => {\n \n return customFetch<checkUsernameAvailabilityResponse>(getCheckUsernameAvailabilityUrl(params),\n { \n ...options,\n method: 'GET'\n \n \n }\n);}\n\n\n\n/**\n * Get available username suggestions based on user's email and name\n * @summary Get username suggestions\n */\nexport type getUsernameSuggestionsResponse200 = {\n data: GetSuggestionsOutput\n status: 200\n}\n\nexport type getUsernameSuggestionsResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type getUsernameSuggestionsResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type getUsernameSuggestionsResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type getUsernameSuggestionsResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type getUsernameSuggestionsResponse500 = {\n data: ApiError\n status: 500\n}\n \nexport type getUsernameSuggestionsResponseSuccess = (getUsernameSuggestionsResponse200) & {\n headers: Headers;\n};\nexport type getUsernameSuggestionsResponseError = (getUsernameSuggestionsResponse400 | getUsernameSuggestionsResponse401 | getUsernameSuggestionsResponse403 | getUsernameSuggestionsResponse404 | getUsernameSuggestionsResponse500) & {\n headers: Headers;\n};\n\nexport type getUsernameSuggestionsResponse = (getUsernameSuggestionsResponseSuccess | getUsernameSuggestionsResponseError)\n\nexport const getGetUsernameSuggestionsUrl = () => {\n\n\n \n\n return `/api/auth/username/suggestions`\n}\n\nexport const getUsernameSuggestions = async ( options?: RequestInit): Promise<getUsernameSuggestionsResponse> => {\n \n return customFetch<getUsernameSuggestionsResponse>(getGetUsernameSuggestionsUrl(),\n { \n ...options,\n method: 'GET'\n \n \n }\n);}\n\n\n\n/**\n * Get the current authenticated user's info\n * @summary Get current user\n */\nexport type meResponse200 = {\n data: MeResponseData | null\n status: 200\n}\n\nexport type meResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type meResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type meResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type meResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type meResponse500 = {\n data: ApiError\n status: 500\n}\n \nexport type meResponseSuccess = (meResponse200) & {\n headers: Headers;\n};\nexport type meResponseError = (meResponse400 | meResponse401 | meResponse403 | meResponse404 | meResponse500) & {\n headers: Headers;\n};\n\nexport type meResponse = (meResponseSuccess | meResponseError)\n\nexport const getMeUrl = () => {\n\n\n \n\n return `/api/skills/me`\n}\n\nexport const me = async ( options?: RequestInit): Promise<meResponse> => {\n \n return customFetch<meResponse>(getMeUrl(),\n { \n ...options,\n method: 'GET'\n \n \n }\n);}\n\n\n\n/**\n * List all skills owned by the authenticated user\n * @summary List my skills\n */\nexport type listMySkillsResponse200 = {\n data: SkillListResponse\n status: 200\n}\n\nexport type listMySkillsResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type listMySkillsResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type listMySkillsResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type listMySkillsResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type listMySkillsResponse500 = {\n data: ApiError\n status: 500\n}\n \nexport type listMySkillsResponseSuccess = (listMySkillsResponse200) & {\n headers: Headers;\n};\nexport type listMySkillsResponseError = (listMySkillsResponse400 | listMySkillsResponse401 | listMySkillsResponse403 | listMySkillsResponse404 | listMySkillsResponse500) & {\n headers: Headers;\n};\n\nexport type listMySkillsResponse = (listMySkillsResponseSuccess | listMySkillsResponseError)\n\nexport const getListMySkillsUrl = () => {\n\n\n \n\n return `/api/skills`\n}\n\nexport const listMySkills = async ( options?: RequestInit): Promise<listMySkillsResponse> => {\n \n return customFetch<listMySkillsResponse>(getListMySkillsUrl(),\n { \n ...options,\n method: 'GET'\n \n \n }\n);}\n\n\n\n/**\n * List all skills for a specific user\n * @summary List user skills\n */\nexport type listUserSkillsResponse200 = {\n data: SkillListResponse\n status: 200\n}\n\nexport type listUserSkillsResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type listUserSkillsResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type listUserSkillsResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type listUserSkillsResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type listUserSkillsResponse500 = {\n data: ApiError\n status: 500\n}\n \nexport type listUserSkillsResponseSuccess = (listUserSkillsResponse200) & {\n headers: Headers;\n};\nexport type listUserSkillsResponseError = (listUserSkillsResponse400 | listUserSkillsResponse401 | listUserSkillsResponse403 | listUserSkillsResponse404 | listUserSkillsResponse500) & {\n headers: Headers;\n};\n\nexport type listUserSkillsResponse = (listUserSkillsResponseSuccess | listUserSkillsResponseError)\n\nexport const getListUserSkillsUrl = (username: Username,) => {\n\n\n \n\n return `/api/skills/@user/${username}`\n}\n\nexport const listUserSkills = async (username: Username, options?: RequestInit): Promise<listUserSkillsResponse> => {\n \n return customFetch<listUserSkillsResponse>(getListUserSkillsUrl(username),\n { \n ...options,\n method: 'GET'\n \n \n }\n);}\n\n\n\n/**\n * Get a specific skill by username and name\n * @summary Get skill\n */\nexport type getSkillResponse200 = {\n data: SkillWithUser\n status: 200\n}\n\nexport type getSkillResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type getSkillResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type getSkillResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type getSkillResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type getSkillResponse500 = {\n data: ApiError\n status: 500\n}\n \nexport type getSkillResponseSuccess = (getSkillResponse200) & {\n headers: Headers;\n};\nexport type getSkillResponseError = (getSkillResponse400 | getSkillResponse401 | getSkillResponse403 | getSkillResponse404 | getSkillResponse500) & {\n headers: Headers;\n};\n\nexport type getSkillResponse = (getSkillResponseSuccess | getSkillResponseError)\n\nexport const getGetSkillUrl = (username: Username,\n name: SkillName,) => {\n\n\n \n\n return `/api/skills/@user/${username}/${name}`\n}\n\nexport const getSkill = async (username: Username,\n name: SkillName, options?: RequestInit): Promise<getSkillResponse> => {\n \n return customFetch<getSkillResponse>(getGetSkillUrl(username,name),\n { \n ...options,\n method: 'GET'\n \n \n }\n);}\n\n\n\n/**\n * List all versions for a specific skill\n * @summary List skill versions\n */\nexport type listSkillVersionsResponse200 = {\n data: SkillVersion[]\n status: 200\n}\n\nexport type listSkillVersionsResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type listSkillVersionsResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type listSkillVersionsResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type listSkillVersionsResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type listSkillVersionsResponse500 = {\n data: ApiError\n status: 500\n}\n \nexport type listSkillVersionsResponseSuccess = (listSkillVersionsResponse200) & {\n headers: Headers;\n};\nexport type listSkillVersionsResponseError = (listSkillVersionsResponse400 | listSkillVersionsResponse401 | listSkillVersionsResponse403 | listSkillVersionsResponse404 | listSkillVersionsResponse500) & {\n headers: Headers;\n};\n\nexport type listSkillVersionsResponse = (listSkillVersionsResponseSuccess | listSkillVersionsResponseError)\n\nexport const getListSkillVersionsUrl = (username: Username,\n name: SkillName,) => {\n\n\n \n\n return `/api/skills/@user/${username}/${name}/versions`\n}\n\nexport const listSkillVersions = async (username: Username,\n name: SkillName, options?: RequestInit): Promise<listSkillVersionsResponse> => {\n \n return customFetch<listSkillVersionsResponse>(getListSkillVersionsUrl(username,name),\n { \n ...options,\n method: 'GET'\n \n \n }\n);}\n\n\n\n/**\n * Get metadata for a specific skill version\n * @summary Get skill version\n */\nexport type getSkillVersionResponse200 = {\n data: SkillVersionWithDownload\n status: 200\n}\n\nexport type getSkillVersionResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type getSkillVersionResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type getSkillVersionResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type getSkillVersionResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type getSkillVersionResponse500 = {\n data: ApiError\n status: 500\n}\n \nexport type getSkillVersionResponseSuccess = (getSkillVersionResponse200) & {\n headers: Headers;\n};\nexport type getSkillVersionResponseError = (getSkillVersionResponse400 | getSkillVersionResponse401 | getSkillVersionResponse403 | getSkillVersionResponse404 | getSkillVersionResponse500) & {\n headers: Headers;\n};\n\nexport type getSkillVersionResponse = (getSkillVersionResponseSuccess | getSkillVersionResponseError)\n\nexport const getGetSkillVersionUrl = (username: Username,\n name: SkillName,\n version: Semver,) => {\n\n\n \n\n return `/api/skills/@user/${username}/${name}/${version}`\n}\n\nexport const getSkillVersion = async (username: Username,\n name: SkillName,\n version: Semver, options?: RequestInit): Promise<getSkillVersionResponse> => {\n \n return customFetch<getSkillVersionResponse>(getGetSkillVersionUrl(username,name,version),\n { \n ...options,\n method: 'GET'\n \n \n }\n);}\n\n\n\n/**\n * Publish a new skill or a new version of an existing skill\n * @summary Publish skill\n */\nexport type publishSkillResponse200 = {\n data: PublishSkillResponse\n status: 200\n}\n\nexport type publishSkillResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type publishSkillResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type publishSkillResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type publishSkillResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type publishSkillResponse500 = {\n data: ApiError\n status: 500\n}\n \nexport type publishSkillResponseSuccess = (publishSkillResponse200) & {\n headers: Headers;\n};\nexport type publishSkillResponseError = (publishSkillResponse400 | publishSkillResponse401 | publishSkillResponse403 | publishSkillResponse404 | publishSkillResponse500) & {\n headers: Headers;\n};\n\nexport type publishSkillResponse = (publishSkillResponseSuccess | publishSkillResponseError)\n\nexport const getPublishSkillUrl = () => {\n\n\n \n\n return `/api/skills/publish`\n}\n\nexport const publishSkill = async (publishSkillInput: PublishSkillInput, options?: RequestInit): Promise<publishSkillResponse> => {\n \n return customFetch<publishSkillResponse>(getPublishSkillUrl(),\n { \n ...options,\n method: 'POST',\n headers: { 'Content-Type': 'application/json', ...options?.headers },\n body: JSON.stringify(\n publishSkillInput,)\n }\n);}\n\n\n\n/**\n * Delete a skill and all its versions (owner only)\n * @summary Delete skill\n */\nexport type deleteSkillResponse200 = {\n data: SuccessResponse & unknown\n status: 200\n}\n\nexport type deleteSkillResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type deleteSkillResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type deleteSkillResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type deleteSkillResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type deleteSkillResponse500 = {\n data: ApiError\n status: 500\n}\n \nexport type deleteSkillResponseSuccess = (deleteSkillResponse200) & {\n headers: Headers;\n};\nexport type deleteSkillResponseError = (deleteSkillResponse400 | deleteSkillResponse401 | deleteSkillResponse403 | deleteSkillResponse404 | deleteSkillResponse500) & {\n headers: Headers;\n};\n\nexport type deleteSkillResponse = (deleteSkillResponseSuccess | deleteSkillResponseError)\n\nexport const getDeleteSkillUrl = (name: SkillName,) => {\n\n\n \n\n return `/api/skills/${name}`\n}\n\nexport const deleteSkill = async (name: SkillName, options?: RequestInit): Promise<deleteSkillResponse> => {\n \n return customFetch<deleteSkillResponse>(getDeleteSkillUrl(name),\n { \n ...options,\n method: 'DELETE'\n \n \n }\n);}\n\n\n\n/**\n * Delete a specific version of a skill (owner only)\n * @summary Delete skill version\n */\nexport type deleteSkillVersionResponse200 = {\n data: SuccessResponse & unknown\n status: 200\n}\n\nexport type deleteSkillVersionResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type deleteSkillVersionResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type deleteSkillVersionResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type deleteSkillVersionResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type deleteSkillVersionResponse500 = {\n data: ApiError\n status: 500\n}\n \nexport type deleteSkillVersionResponseSuccess = (deleteSkillVersionResponse200) & {\n headers: Headers;\n};\nexport type deleteSkillVersionResponseError = (deleteSkillVersionResponse400 | deleteSkillVersionResponse401 | deleteSkillVersionResponse403 | deleteSkillVersionResponse404 | deleteSkillVersionResponse500) & {\n headers: Headers;\n};\n\nexport type deleteSkillVersionResponse = (deleteSkillVersionResponseSuccess | deleteSkillVersionResponseError)\n\nexport const getDeleteSkillVersionUrl = (name: SkillName,\n version: Semver,) => {\n\n\n \n\n return `/api/skills/${name}/${version}`\n}\n\nexport const deleteSkillVersion = async (name: SkillName,\n version: Semver, options?: RequestInit): Promise<deleteSkillVersionResponse> => {\n \n return customFetch<deleteSkillVersionResponse>(getDeleteSkillVersionUrl(name,version),\n { \n ...options,\n method: 'DELETE'\n \n \n }\n);}\n\n\n\n/**\n * Submit client-side errors for logging and monitoring. Used by the frontend error capture service.\n * @summary Report client errors\n */\nexport type reportErrorsResponse200 = {\n data: SuccessResponse\n status: 200\n}\n\nexport type reportErrorsResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type reportErrorsResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type reportErrorsResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type reportErrorsResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type reportErrorsResponse500 = {\n data: ApiError\n status: 500\n}\n \nexport type reportErrorsResponseSuccess = (reportErrorsResponse200) & {\n headers: Headers;\n};\nexport type reportErrorsResponseError = (reportErrorsResponse400 | reportErrorsResponse401 | reportErrorsResponse403 | reportErrorsResponse404 | reportErrorsResponse500) & {\n headers: Headers;\n};\n\nexport type reportErrorsResponse = (reportErrorsResponseSuccess | reportErrorsResponseError)\n\nexport const getReportErrorsUrl = () => {\n\n\n \n\n return `/errors/report`\n}\n\nexport const reportErrors = async (errorReportPayload: ErrorReportPayload, options?: RequestInit): Promise<reportErrorsResponse> => {\n \n return customFetch<reportErrorsResponse>(getReportErrorsUrl(),\n { \n ...options,\n method: 'POST',\n headers: { 'Content-Type': 'application/json', ...options?.headers },\n body: JSON.stringify(\n errorReportPayload,)\n }\n);}\n","/**\n * API Client for PSPM CLI\n *\n * This module re-exports the SDK functions and provides the\n * initialization logic for the CLI.\n */\n\nimport {\n\tdeleteSkill,\n\tdeleteSkillVersion,\n\texchangeCliToken,\n\tgetConfig,\n\tgetSkill,\n\tgetSkillVersion,\n\tisConfigured,\n\tlistMySkills,\n\tlistSkillVersions,\n\tlistUserSkills,\n\tme,\n\tpublishSkill,\n\ttype SDKConfig,\n\tSDKError,\n\tconfigure as sdkConfigure,\n} from \"@repo/sdk\";\n\n/**\n * Convert a registry URL to the base server URL for the SDK.\n *\n * The CLI stores registry URLs like \"https://pspm.dev\". This function\n * normalizes the URL by removing any trailing /api/skills path if present\n * (for backwards compatibility with older configs).\n */\nfunction registryUrlToBaseUrl(registryUrl: string): string {\n\treturn registryUrl.replace(/\\/api\\/skills\\/?$/, \"\");\n}\n\n/**\n * Configure the SDK with registry URL and API key.\n *\n * This wrapper handles converting the CLI's registry URL format to the\n * base URL format expected by the SDK.\n */\nexport function configure(options: {\n\tregistryUrl: string;\n\tapiKey: string;\n}): void {\n\tconst baseUrl = registryUrlToBaseUrl(options.registryUrl);\n\tsdkConfigure({ baseUrl, apiKey: options.apiKey });\n}\n\n// Re-export SDK functions for convenience\nexport {\n\tdeleteSkill,\n\tdeleteSkillVersion,\n\texchangeCliToken,\n\tgetConfig,\n\tgetSkill,\n\tgetSkillVersion,\n\tisConfigured,\n\tlistMySkills,\n\tlistSkillVersions,\n\tlistUserSkills,\n\tme,\n\tpublishSkill,\n\tSDKError,\n};\n\n// Re-export types\nexport type { SDKConfig };\n\n/**\n * Get user info from the API using the /me endpoint.\n * Returns null if not authenticated.\n */\nexport async function whoamiRequest(\n\tregistryUrl: string,\n\tapiKey: string,\n): Promise<{ username: string; userId: string } | null> {\n\ttry {\n\t\t// Use direct REST endpoints (not oRPC /rpc prefix)\n\t\tconfigure({ registryUrl, apiKey });\n\t\tconst response = await me();\n\t\t// Check for successful response before accessing user data\n\t\tif (response.status !== 200 || !response.data) {\n\t\t\treturn null;\n\t\t}\n\t\tconst user = response.data;\n\t\treturn {\n\t\t\tusername: user.username,\n\t\t\tuserId: user.userId,\n\t\t};\n\t} catch {\n\t\treturn null;\n\t}\n}\n","/**\n * Base error class for PSPM configuration errors\n */\nexport class ConfigError extends Error {\n\tconstructor(message: string) {\n\t\tsuper(message);\n\t\tthis.name = \"ConfigError\";\n\t}\n}\n\n/**\n * Error thrown when the user is not logged in\n */\nexport class NotLoggedInError extends ConfigError {\n\tconstructor() {\n\t\tsuper(\n\t\t\t\"Not logged in. Run 'pspm login --api-key <key>' first, or set PSPM_API_KEY env var.\",\n\t\t);\n\t\tthis.name = \"NotLoggedInError\";\n\t}\n}\n\n/**\n * API error response structure from OpenAPI spec\n */\ninterface ApiErrorResponse {\n\tcode?: string;\n\tmessage?: string;\n\tdetails?:\n\t\t| {\n\t\t\t\tissues?: Array<{ path?: Array<string | number>; message?: string }>;\n\t\t }\n\t\t| Record<string, unknown>;\n\trequestId?: string;\n\ttimestamp?: string;\n}\n\n/**\n * Extract a human-readable error message from an API response\n * Handles both ApiError and ValidationError types\n */\nexport function extractApiErrorMessage(\n\tresponse: { status: number; data: unknown },\n\tfallbackMessage: string,\n): string {\n\tconst errorData = response.data as ApiErrorResponse | null;\n\n\tif (process.env.PSPM_DEBUG) {\n\t\tconsole.log(`[debug] API response status: ${response.status}`);\n\t\tconsole.log(\n\t\t\t`[debug] API response data:`,\n\t\t\tJSON.stringify(errorData, null, 2),\n\t\t);\n\t}\n\n\tif (!errorData) {\n\t\treturn `${fallbackMessage} (HTTP ${response.status})`;\n\t}\n\n\t// Start with the message field or fallback\n\tlet errorMessage = errorData.message || fallbackMessage;\n\n\t// For validation errors, format the issues\n\tif (errorData.code === \"VALIDATION_ERROR\" && errorData.details) {\n\t\tconst issues = (\n\t\t\terrorData.details as {\n\t\t\t\tissues?: Array<{ path?: Array<string | number>; message?: string }>;\n\t\t\t}\n\t\t).issues;\n\t\tif (issues && Array.isArray(issues)) {\n\t\t\tconst issueMessages = issues\n\t\t\t\t.map((issue) => {\n\t\t\t\t\tconst path = issue.path?.join(\".\") || \"input\";\n\t\t\t\t\tconst msg = issue.message || \"invalid value\";\n\t\t\t\t\treturn ` - ${path}: ${msg}`;\n\t\t\t\t})\n\t\t\t\t.join(\"\\n\");\n\t\t\terrorMessage = `Validation failed:\\n${issueMessages}`;\n\t\t}\n\t}\n\n\t// Add error code prefix if available and not already in message\n\tif (errorData.code && !errorMessage.includes(errorData.code)) {\n\t\terrorMessage = `[${errorData.code}] ${errorMessage}`;\n\t}\n\n\t// Add request ID for debugging\n\tif (errorData.requestId) {\n\t\terrorMessage += `\\n(Request ID: ${errorData.requestId})`;\n\t}\n\n\treturn errorMessage;\n}\n","import { mkdir, readFile, stat, unlink, writeFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\nimport * as ini from \"ini\";\nimport { NotLoggedInError } from \"./errors.js\";\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/**\n * User config stored in ~/.pspmrc (INI format)\n */\nexport interface UserConfig {\n\tregistry?: string;\n\tauthToken?: string;\n\tusername?: string;\n}\n\n/**\n * Project config stored in .pspmrc (INI format)\n */\nexport interface ProjectConfig {\n\tregistry?: string;\n}\n\n/**\n * Fully resolved configuration (after cascade)\n */\nexport interface ResolvedConfig {\n\tregistryUrl: string;\n\tapiKey?: string;\n\tusername?: string;\n}\n\n/**\n * Legacy V1 config schema (for migration)\n */\ninterface LegacyConfigV1 {\n\tregistryUrl?: string;\n\tapiKey?: string;\n\tusername?: string;\n}\n\n/**\n * Legacy V2 config schema (for migration)\n */\ninterface LegacyConfigV2 {\n\tversion: 2;\n\tdefaultProfile: string;\n\tprofiles: Record<\n\t\tstring,\n\t\t{\n\t\t\tregistryUrl?: string;\n\t\t\tapiKey?: string;\n\t\t\tusername?: string;\n\t\t}\n\t>;\n}\n\n// =============================================================================\n// Constants\n// =============================================================================\n\nconst DEFAULT_REGISTRY_URL = \"https://pspm.dev\";\n\n/**\n * Get the user config file path (~/.pspmrc)\n */\nexport function getConfigPath(): string {\n\treturn join(homedir(), \".pspmrc\");\n}\n\n/**\n * Get the legacy config file path (~/.pspm/config.json) for migration\n */\nfunction getLegacyConfigPath(): string {\n\treturn join(homedir(), \".pspm\", \"config.json\");\n}\n\n/**\n * Get the skills directory path (for current project)\n */\nexport function getSkillsDir(): string {\n\treturn join(process.cwd(), \".skills\");\n}\n\n/**\n * Get the lockfile path (for current project)\n */\nexport function getLockfilePath(): string {\n\treturn join(process.cwd(), \"skill-lock.json\");\n}\n\n// =============================================================================\n// INI Config Functions\n// =============================================================================\n\n/**\n * Read the user config file (~/.pspmrc, INI format)\n */\nexport async function readUserConfig(): Promise<UserConfig> {\n\tconst configPath = getConfigPath();\n\n\tif (process.env.PSPM_DEBUG) {\n\t\tconsole.log(`[config] Reading config from: ${configPath}`);\n\t}\n\n\ttry {\n\t\tconst content = await readFile(configPath, \"utf-8\");\n\t\tconst parsed = ini.parse(content);\n\n\t\tif (process.env.PSPM_DEBUG) {\n\t\t\tconsole.log(`[config] Parsed config:`, JSON.stringify(parsed, null, 2));\n\t\t}\n\n\t\treturn {\n\t\t\tregistry: parsed.registry as string | undefined,\n\t\t\tauthToken: parsed.authToken as string | undefined,\n\t\t\tusername: parsed.username as string | undefined,\n\t\t};\n\t} catch (error) {\n\t\tif (process.env.PSPM_DEBUG) {\n\t\t\tconsole.log(\n\t\t\t\t`[config] Error reading config: ${\n\t\t\t\t\terror instanceof Error ? error.message : String(error)\n\t\t\t\t}`,\n\t\t\t);\n\t\t}\n\t\treturn {};\n\t}\n}\n\n/**\n * Write the user config file (~/.pspmrc, INI format)\n */\nexport async function writeUserConfig(config: UserConfig): Promise<void> {\n\tconst configPath = getConfigPath();\n\n\t// Build INI content with comments\n\tconst lines: string[] = [\"; PSPM Configuration\", \"\"];\n\n\tif (config.registry) {\n\t\tlines.push(`registry = ${config.registry}`);\n\t}\n\tif (config.authToken) {\n\t\tlines.push(`authToken = ${config.authToken}`);\n\t}\n\tif (config.username) {\n\t\tlines.push(`username = ${config.username}`);\n\t}\n\n\t// Always end with a newline\n\tlines.push(\"\");\n\n\tawait mkdir(dirname(configPath), { recursive: true });\n\tawait writeFile(configPath, lines.join(\"\\n\"));\n\n\tif (process.env.PSPM_DEBUG) {\n\t\tconsole.log(`[config] Wrote config to: ${configPath}`);\n\t}\n}\n\n/**\n * Find and read project config (.pspmrc) by searching up directory tree\n */\nexport async function findProjectConfig(): Promise<ProjectConfig | null> {\n\tlet currentDir = process.cwd();\n\tconst root = dirname(currentDir);\n\n\twhile (currentDir !== root) {\n\t\tconst configPath = join(currentDir, \".pspmrc\");\n\t\ttry {\n\t\t\tconst stats = await stat(configPath);\n\t\t\tif (stats.isFile()) {\n\t\t\t\tconst content = await readFile(configPath, \"utf-8\");\n\t\t\t\t// Try parsing as INI first\n\t\t\t\ttry {\n\t\t\t\t\tconst parsed = ini.parse(content);\n\t\t\t\t\tif (process.env.PSPM_DEBUG) {\n\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t`[config] Found project config at ${configPath}:`,\n\t\t\t\t\t\t\tJSON.stringify(parsed, null, 2),\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\treturn {\n\t\t\t\t\t\tregistry: parsed.registry as string | undefined,\n\t\t\t\t\t};\n\t\t\t\t} catch {\n\t\t\t\t\t// Fall back to JSON for backward compatibility during migration\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst jsonConfig = JSON.parse(content);\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tregistry: jsonConfig.registryUrl,\n\t\t\t\t\t\t};\n\t\t\t\t\t} catch {\n\t\t\t\t\t\t// Unparseable, skip\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} catch {\n\t\t\t// File doesn't exist, continue searching\n\t\t}\n\t\tcurrentDir = dirname(currentDir);\n\t}\n\n\treturn null;\n}\n\n/**\n * Migrate from legacy config format (~/.pspm/config.json) if it exists\n */\nasync function migrateFromLegacyConfig(): Promise<UserConfig | null> {\n\tconst legacyPath = getLegacyConfigPath();\n\n\ttry {\n\t\tconst content = await readFile(legacyPath, \"utf-8\");\n\t\tconst parsed = JSON.parse(content);\n\n\t\tlet config: UserConfig = {};\n\n\t\t// Check if V2 format (with profiles)\n\t\tif (parsed.version === 2 && parsed.profiles) {\n\t\t\tconst v2Config = parsed as LegacyConfigV2;\n\t\t\tconst defaultProfileName = v2Config.defaultProfile || \"default\";\n\t\t\tconst profile = v2Config.profiles[defaultProfileName];\n\n\t\t\tif (profile) {\n\t\t\t\tconfig = {\n\t\t\t\t\tregistry:\n\t\t\t\t\t\tprofile.registryUrl !== DEFAULT_REGISTRY_URL\n\t\t\t\t\t\t\t? profile.registryUrl\n\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\tauthToken: profile.apiKey,\n\t\t\t\t\tusername: profile.username,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tconsole.log(\n\t\t\t\t`Migrating from legacy config (profile: ${defaultProfileName})...`,\n\t\t\t);\n\t\t} else {\n\t\t\t// V1 format (flat)\n\t\t\tconst v1Config = parsed as LegacyConfigV1;\n\t\t\tconfig = {\n\t\t\t\tregistry:\n\t\t\t\t\tv1Config.registryUrl !== DEFAULT_REGISTRY_URL\n\t\t\t\t\t\t? v1Config.registryUrl\n\t\t\t\t\t\t: undefined,\n\t\t\t\tauthToken: v1Config.apiKey,\n\t\t\t\tusername: v1Config.username,\n\t\t\t};\n\n\t\t\tconsole.log(\"Migrating from legacy config...\");\n\t\t}\n\n\t\t// Write new format\n\t\tawait writeUserConfig(config);\n\t\tconsole.log(`Created new config at: ${getConfigPath()}`);\n\n\t\t// Remove old config directory\n\t\tawait unlink(legacyPath);\n\t\tconsole.log(`Removed legacy config: ${legacyPath}`);\n\n\t\treturn config;\n\t} catch {\n\t\t// Legacy config doesn't exist or couldn't be read\n\t\treturn null;\n\t}\n}\n\n/**\n * Resolve the full configuration using cascade priority:\n * 1. Environment variables (PSPM_REGISTRY_URL, PSPM_API_KEY)\n * 2. Project config (.pspmrc in project directory)\n * 3. User config (~/.pspmrc)\n * 4. Defaults\n */\nexport async function resolveConfig(): Promise<ResolvedConfig> {\n\t// Check for legacy config and migrate if needed\n\tconst newConfigPath = getConfigPath();\n\ttry {\n\t\tawait stat(newConfigPath);\n\t} catch {\n\t\t// New config doesn't exist, try migrating from legacy\n\t\tawait migrateFromLegacyConfig();\n\t}\n\n\tconst userConfig = await readUserConfig();\n\tconst projectConfig = await findProjectConfig();\n\n\t// Build resolved config with cascade priority\n\tlet registryUrl = DEFAULT_REGISTRY_URL;\n\tlet apiKey = userConfig.authToken;\n\tconst username = userConfig.username;\n\n\t// User config\n\tif (userConfig.registry) {\n\t\tregistryUrl = userConfig.registry;\n\t}\n\n\t// Project config can override registryUrl (but not apiKey for security)\n\tif (projectConfig?.registry) {\n\t\tregistryUrl = projectConfig.registry;\n\t}\n\n\t// Environment variables always win\n\tif (process.env.PSPM_REGISTRY_URL) {\n\t\tregistryUrl = process.env.PSPM_REGISTRY_URL;\n\t}\n\tif (process.env.PSPM_API_KEY) {\n\t\tapiKey = process.env.PSPM_API_KEY;\n\t}\n\n\tif (process.env.PSPM_DEBUG) {\n\t\tconsole.log(`[config] Resolved config:`);\n\t\tconsole.log(`[config] registryUrl: ${registryUrl}`);\n\t\tconsole.log(`[config] apiKey: ${apiKey ? \"***\" : \"(not set)\"}`);\n\t\tconsole.log(`[config] username: ${username || \"(not set)\"}`);\n\t}\n\n\treturn {\n\t\tregistryUrl,\n\t\tapiKey,\n\t\tusername,\n\t};\n}\n\n// =============================================================================\n// Credential Management\n// =============================================================================\n\n/**\n * Set credentials (authToken and optionally username/registry)\n */\nexport async function setCredentials(\n\tauthToken: string,\n\tusername?: string,\n\tregistry?: string,\n): Promise<void> {\n\tconst config = await readUserConfig();\n\n\tconfig.authToken = authToken;\n\tif (username) {\n\t\tconfig.username = username;\n\t}\n\tif (registry && registry !== DEFAULT_REGISTRY_URL) {\n\t\tconfig.registry = registry;\n\t}\n\n\tawait writeUserConfig(config);\n}\n\n/**\n * Clear credentials (authToken and username)\n */\nexport async function clearCredentials(): Promise<void> {\n\tconst config = await readUserConfig();\n\n\tdelete config.authToken;\n\tdelete config.username;\n\n\tawait writeUserConfig(config);\n}\n\n/**\n * Check if user is logged in\n */\nexport async function isLoggedIn(): Promise<boolean> {\n\ttry {\n\t\tconst resolved = await resolveConfig();\n\t\treturn !!resolved.apiKey;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\n/**\n * Get the API key (throws if not logged in)\n */\nexport async function requireApiKey(): Promise<string> {\n\tconst resolved = await resolveConfig();\n\n\tif (!resolved.apiKey) {\n\t\tif (process.env.PSPM_DEBUG) {\n\t\t\tconsole.log(`[config] requireApiKey: No API key found`);\n\t\t}\n\t\tthrow new NotLoggedInError();\n\t}\n\n\tif (process.env.PSPM_DEBUG) {\n\t\tconsole.log(\n\t\t\t`[config] requireApiKey: Got API key (${resolved.apiKey.substring(0, 10)}...)`,\n\t\t);\n\t}\n\n\treturn resolved.apiKey;\n}\n\n/**\n * Get the registry URL\n */\nexport async function getRegistryUrl(): Promise<string> {\n\tconst resolved = await resolveConfig();\n\treturn resolved.registryUrl;\n}\n\n// =============================================================================\n// Legacy Exports (for backward compatibility during transition)\n// =============================================================================\n\n// Legacy type alias\nexport type PspmConfig = {\n\tregistryUrl: string;\n\tapiKey?: string;\n\tusername?: string;\n};\n\n/**\n * Read config (legacy - wraps resolveConfig)\n */\nexport async function readConfig(): Promise<PspmConfig> {\n\tconst resolved = await resolveConfig();\n\treturn {\n\t\tregistryUrl: resolved.registryUrl,\n\t\tapiKey: resolved.apiKey,\n\t\tusername: resolved.username,\n\t};\n}\n\n/**\n * Write config (legacy - wraps setCredentials)\n */\nexport async function writeConfig(config: Partial<PspmConfig>): Promise<void> {\n\tif (config.apiKey) {\n\t\tawait setCredentials(config.apiKey, config.username, config.registryUrl);\n\t} else {\n\t\tconst current = await readUserConfig();\n\t\tif (config.registryUrl && config.registryUrl !== DEFAULT_REGISTRY_URL) {\n\t\t\tcurrent.registry = config.registryUrl;\n\t\t}\n\t\tif (config.username) {\n\t\t\tcurrent.username = config.username;\n\t\t}\n\t\tawait writeUserConfig(current);\n\t}\n}\n\n/**\n * Clear config (legacy - wraps clearCredentials)\n */\nexport async function clearConfig(): Promise<void> {\n\tawait clearCredentials();\n}\n","import { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\nimport type { SkillLockfile, SkillLockfileEntry } from \"@repo/pspm-types\";\nimport { getLockfilePath, getRegistryUrl } from \"./config\";\n\n/**\n * Read the lockfile\n */\nexport async function readLockfile(): Promise<SkillLockfile | null> {\n\tconst lockfilePath = getLockfilePath();\n\n\ttry {\n\t\tconst content = await readFile(lockfilePath, \"utf-8\");\n\t\treturn JSON.parse(content) as SkillLockfile;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\n/**\n * Write the lockfile\n */\nexport async function writeLockfile(lockfile: SkillLockfile): Promise<void> {\n\tconst lockfilePath = getLockfilePath();\n\tawait mkdir(dirname(lockfilePath), { recursive: true });\n\tawait writeFile(lockfilePath, `${JSON.stringify(lockfile, null, 2)}\\n`);\n}\n\n/**\n * Create a new empty lockfile\n */\nexport async function createEmptyLockfile(): Promise<SkillLockfile> {\n\tconst registryUrl = await getRegistryUrl();\n\treturn {\n\t\tlockfileVersion: 1,\n\t\tregistryUrl,\n\t\tskills: {},\n\t};\n}\n\n/**\n * Add a skill to the lockfile\n */\nexport async function addToLockfile(\n\tfullName: string,\n\tentry: SkillLockfileEntry,\n): Promise<void> {\n\tlet lockfile = await readLockfile();\n\tif (!lockfile) {\n\t\tlockfile = await createEmptyLockfile();\n\t}\n\n\tlockfile.skills[fullName] = entry;\n\tawait writeLockfile(lockfile);\n}\n\n/**\n * Remove a skill from the lockfile\n */\nexport async function removeFromLockfile(fullName: string): Promise<boolean> {\n\tconst lockfile = await readLockfile();\n\tif (!lockfile || !lockfile.skills[fullName]) {\n\t\treturn false;\n\t}\n\n\tdelete lockfile.skills[fullName];\n\tawait writeLockfile(lockfile);\n\treturn true;\n}\n\n/**\n * Get a skill entry from the lockfile\n */\nexport async function getFromLockfile(\n\tfullName: string,\n): Promise<SkillLockfileEntry | null> {\n\tconst lockfile = await readLockfile();\n\tif (!lockfile || !lockfile.skills[fullName]) {\n\t\treturn null;\n\t}\n\treturn lockfile.skills[fullName];\n}\n\n/**\n * List all skills in the lockfile\n */\nexport async function listLockfileSkills(): Promise<\n\tArray<{ name: string; entry: SkillLockfileEntry }>\n> {\n\tconst lockfile = await readLockfile();\n\tif (!lockfile) {\n\t\treturn [];\n\t}\n\n\treturn Object.entries(lockfile.skills).map(([name, entry]) => ({\n\t\tname,\n\t\tentry: entry as SkillLockfileEntry,\n\t}));\n}\n","import { mkdir, rm } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport {\n\tcalculateIntegrity,\n\tparseSkillSpecifier,\n\tresolveVersion,\n} from \"@repo/pspm-types\";\nimport {\n\tconfigure,\n\tgetSkillVersion,\n\tlistSkillVersions,\n} from \"../api-client.js\";\nimport { getRegistryUrl, getSkillsDir, requireApiKey } from \"../config.js\";\nimport { extractApiErrorMessage } from \"../errors.js\";\nimport { addToLockfile } from \"../lockfile.js\";\n\nexport interface AddOptions {\n\tsave?: boolean;\n}\n\nexport async function add(\n\tspecifier: string,\n\t_options: AddOptions,\n): Promise<void> {\n\ttry {\n\t\tconst apiKey = await requireApiKey();\n\t\tconst registryUrl = await getRegistryUrl();\n\n\t\t// Parse the specifier\n\t\tconst parsed = parseSkillSpecifier(specifier);\n\t\tif (!parsed) {\n\t\t\tconsole.error(\n\t\t\t\t`Error: Invalid skill specifier \"${specifier}\". Use format: @user/{username}/{name}[@{version}]`,\n\t\t\t);\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\tconst { username, name, versionRange } = parsed;\n\n\t\t// Configure SDK (use direct REST endpoints, not oRPC)\n\t\tconfigure({ registryUrl, apiKey });\n\n\t\tconsole.log(`Resolving ${specifier}...`);\n\n\t\t// Get available versions\n\t\tconst versionsResponse = await listSkillVersions(username, name);\n\t\tif (versionsResponse.status !== 200) {\n\t\t\tconst errorMessage = extractApiErrorMessage(\n\t\t\t\tversionsResponse,\n\t\t\t\t`Skill @user/${username}/${name} not found`,\n\t\t\t);\n\t\t\tconsole.error(`Error: ${errorMessage}`);\n\t\t\tprocess.exit(1);\n\t\t}\n\t\tconst versions = versionsResponse.data;\n\t\tif (versions.length === 0) {\n\t\t\tconsole.error(`Error: Skill @user/${username}/${name} not found`);\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\t// Resolve version\n\t\tconst versionStrings = versions.map((v: { version: string }) => v.version);\n\t\tconst resolved = resolveVersion(versionRange || \"*\", versionStrings);\n\n\t\tif (!resolved) {\n\t\t\tconsole.error(\n\t\t\t\t`Error: No version matching \"${versionRange || \"latest\"}\" found for @user/${username}/${name}`,\n\t\t\t);\n\t\t\tconsole.error(`Available versions: ${versionStrings.join(\", \")}`);\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\tconsole.log(`Installing @user/${username}/${name}@${resolved}...`);\n\n\t\t// Get version details with download URL\n\t\tconst versionResponse = await getSkillVersion(username, name, resolved);\n\t\tif (versionResponse.status !== 200 || !versionResponse.data) {\n\t\t\tconst errorMessage = extractApiErrorMessage(\n\t\t\t\tversionResponse,\n\t\t\t\t`Version ${resolved} not found`,\n\t\t\t);\n\t\t\tconsole.error(`Error: ${errorMessage}`);\n\t\t\tprocess.exit(1);\n\t\t}\n\t\tconst versionInfo = versionResponse.data;\n\n\t\t// Download the tarball via the API endpoint\n\t\t// Use the API download endpoint for reliability (handles redirects)\n\t\tconst downloadUrl = `${registryUrl}/@user/${username}/${name}/${resolved}/download`;\n\n\t\tconst tarballResponse = await fetch(downloadUrl, {\n\t\t\theaders: {\n\t\t\t\tAuthorization: `Bearer ${apiKey}`,\n\t\t\t},\n\t\t\tredirect: \"follow\",\n\t\t});\n\n\t\tif (!tarballResponse.ok) {\n\t\t\tconsole.error(\n\t\t\t\t`Error: Failed to download tarball (${tarballResponse.status})`,\n\t\t\t);\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\tconst tarballBuffer = Buffer.from(await tarballResponse.arrayBuffer());\n\n\t\t// Calculate integrity\n\t\tconst integrity = calculateIntegrity(tarballBuffer);\n\n\t\t// Verify checksum matches\n\t\tconst expectedIntegrity = `sha256-${Buffer.from(versionInfo.checksum, \"hex\").toString(\"base64\")}`;\n\t\tif (integrity !== expectedIntegrity) {\n\t\t\tconsole.error(\"Error: Checksum verification failed\");\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\t// Create skills directory\n\t\tconst skillsDir = getSkillsDir();\n\t\tconst destDir = join(skillsDir, username, name);\n\t\tawait mkdir(destDir, { recursive: true });\n\n\t\t// Extract tarball\n\t\tconst { writeFile } = await import(\"node:fs/promises\");\n\t\tconst tempFile = join(destDir, \".temp.tgz\");\n\t\tawait writeFile(tempFile, tarballBuffer);\n\n\t\tconst { exec } = await import(\"node:child_process\");\n\t\tconst { promisify } = await import(\"node:util\");\n\t\tconst execAsync = promisify(exec);\n\n\t\ttry {\n\t\t\t// Clear destination and extract\n\t\t\tawait rm(destDir, { recursive: true, force: true });\n\t\t\tawait mkdir(destDir, { recursive: true });\n\t\t\tawait writeFile(tempFile, tarballBuffer);\n\t\t\tawait execAsync(\n\t\t\t\t`tar -xzf \"${tempFile}\" -C \"${destDir}\" --strip-components=1`,\n\t\t\t);\n\t\t} finally {\n\t\t\tawait rm(tempFile, { force: true });\n\t\t}\n\n\t\t// Update lockfile\n\t\tconst fullName = `@user/${username}/${name}`;\n\t\tawait addToLockfile(fullName, {\n\t\t\tversion: resolved,\n\t\t\tresolved: versionInfo.downloadUrl,\n\t\t\tintegrity,\n\t\t});\n\n\t\tconsole.log(`Installed @user/${username}/${name}@${resolved}`);\n\t\tconsole.log(`Location: ${destDir}`);\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : \"Unknown error\";\n\t\tconsole.error(`Error: ${message}`);\n\t\tprocess.exit(1);\n\t}\n}\n","import { stat, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\nexport interface ConfigInitOptions {\n\tregistry?: string;\n}\n\n/**\n * Create a .pspmrc file in the current directory (INI format)\n */\nexport async function configInit(options: ConfigInitOptions): Promise<void> {\n\ttry {\n\t\tconst configPath = join(process.cwd(), \".pspmrc\");\n\n\t\t// Check if file already exists\n\t\ttry {\n\t\t\tawait stat(configPath);\n\t\t\tconsole.error(\"Error: .pspmrc already exists in this directory.\");\n\t\t\tprocess.exit(1);\n\t\t} catch {\n\t\t\t// File doesn't exist, good\n\t\t}\n\n\t\t// Build INI content\n\t\tconst lines: string[] = [\"; Project-specific PSPM configuration\", \"\"];\n\n\t\tif (options.registry) {\n\t\t\tlines.push(`registry = ${options.registry}`);\n\t\t} else {\n\t\t\tlines.push(\"; Uncomment to use a custom registry:\");\n\t\t\tlines.push(\"; registry = https://custom-registry.example.com\");\n\t\t}\n\n\t\tlines.push(\"\");\n\n\t\t// Write the file\n\t\tawait writeFile(configPath, lines.join(\"\\n\"));\n\n\t\tconsole.log(\"Created .pspmrc\");\n\t\tconsole.log(\"\");\n\t\tconsole.log(\"Contents:\");\n\t\tconsole.log(lines.join(\"\\n\"));\n\t\tconsole.log(\"Note: .pspmrc should be committed to version control.\");\n\t\tconsole.log(\"API keys should NOT be stored here - use pspm login instead.\");\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : \"Unknown error\";\n\t\tconsole.error(`Error: ${message}`);\n\t\tprocess.exit(1);\n\t}\n}\n","import {\n\tfindProjectConfig,\n\tgetConfigPath,\n\tresolveConfig,\n} from \"../../config.js\";\n\n/**\n * Show resolved configuration\n */\nexport async function configShow(): Promise<void> {\n\ttry {\n\t\tconst resolved = await resolveConfig();\n\t\tconst projectConfig = await findProjectConfig();\n\t\tconst configPath = getConfigPath();\n\n\t\tconsole.log(\"Resolved Configuration:\\n\");\n\t\tconsole.log(` Registry URL: ${resolved.registryUrl}`);\n\t\tconsole.log(` API Key: ${resolved.apiKey ? \"***\" : \"(not set)\"}`);\n\t\tconsole.log(` Username: ${resolved.username || \"(not set)\"}`);\n\t\tconsole.log(\"\");\n\t\tconsole.log(\"Config Locations:\");\n\t\tconsole.log(` User config: ${configPath}`);\n\t\tconsole.log(` Project config: ${projectConfig ? \".pspmrc\" : \"(none)\"}`);\n\t\tconsole.log(\"\");\n\t\tconsole.log(\"Environment Variables:\");\n\t\tconsole.log(\n\t\t\t` PSPM_REGISTRY_URL: ${process.env.PSPM_REGISTRY_URL || \"(not set)\"}`,\n\t\t);\n\t\tconsole.log(\n\t\t\t` PSPM_API_KEY: ${process.env.PSPM_API_KEY ? \"***\" : \"(not set)\"}`,\n\t\t);\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : \"Unknown error\";\n\t\tconsole.error(`Error: ${message}`);\n\t\tprocess.exit(1);\n\t}\n}\n","import { mkdir, rm } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { SkillLockfileEntry } from \"@repo/pspm-types\";\nimport { getRegistryUrl, getSkillsDir, requireApiKey } from \"../config.js\";\nimport { readLockfile } from \"../lockfile.js\";\n\nexport interface InstallOptions {\n\tfrozenLockfile?: boolean;\n\tdir?: string;\n}\n\nexport async function install(options: InstallOptions): Promise<void> {\n\ttry {\n\t\tconst apiKey = await requireApiKey();\n\t\tawait getRegistryUrl(); // Validate we have a registry configured\n\t\tconst skillsDir = options.dir || getSkillsDir();\n\n\t\tconst lockfile = await readLockfile();\n\t\tif (!lockfile) {\n\t\t\tif (options.frozenLockfile) {\n\t\t\t\tconsole.error(\n\t\t\t\t\t\"Error: No lockfile found. Cannot install with --frozen-lockfile\",\n\t\t\t\t);\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\t\t\tconsole.log(\"No lockfile found. Nothing to install.\");\n\t\t\treturn;\n\t\t}\n\n\t\tconst skillCount = Object.keys(lockfile.skills).length;\n\t\tif (skillCount === 0) {\n\t\t\tconsole.log(\"No skills in lockfile. Nothing to install.\");\n\t\t\treturn;\n\t\t}\n\n\t\tconsole.log(`Installing ${skillCount} skill(s)...\\n`);\n\n\t\tconst entries = Object.entries(lockfile.skills) as [\n\t\t\tstring,\n\t\t\tSkillLockfileEntry,\n\t\t][];\n\n\t\tfor (const [fullName, entry] of entries) {\n\t\t\tconst match = fullName.match(/^@user\\/([^/]+)\\/([^/]+)$/);\n\t\t\tif (!match) {\n\t\t\t\tconsole.warn(`Warning: Invalid skill name in lockfile: ${fullName}`);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst [, username, name] = match;\n\t\t\tconsole.log(`Installing ${fullName}@${entry.version}...`);\n\n\t\t\t// Download the tarball\n\t\t\tconst response = await fetch(entry.resolved, {\n\t\t\t\theaders: {\n\t\t\t\t\tAuthorization: `Bearer ${apiKey}`,\n\t\t\t\t},\n\t\t\t\tredirect: \"follow\",\n\t\t\t});\n\n\t\t\tif (!response.ok) {\n\t\t\t\tconsole.error(\n\t\t\t\t\t` Error: Failed to download ${fullName} (${response.status})`,\n\t\t\t\t);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst tarballBuffer = Buffer.from(await response.arrayBuffer());\n\n\t\t\t// Verify checksum\n\t\t\tconst { createHash } = await import(\"node:crypto\");\n\t\t\tconst actualIntegrity = `sha256-${createHash(\"sha256\").update(tarballBuffer).digest(\"base64\")}`;\n\n\t\t\tif (actualIntegrity !== entry.integrity) {\n\t\t\t\tconsole.error(` Error: Checksum verification failed for ${fullName}`);\n\t\t\t\tif (options.frozenLockfile) {\n\t\t\t\t\tprocess.exit(1);\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Extract tarball\n\t\t\tconst destDir = join(skillsDir, username, name);\n\t\t\tawait rm(destDir, { recursive: true, force: true });\n\t\t\tawait mkdir(destDir, { recursive: true });\n\n\t\t\tconst tempFile = join(destDir, \".temp.tgz\");\n\t\t\tconst { writeFile } = await import(\"node:fs/promises\");\n\t\t\tawait writeFile(tempFile, tarballBuffer);\n\n\t\t\tconst { exec } = await import(\"node:child_process\");\n\t\t\tconst { promisify } = await import(\"node:util\");\n\t\t\tconst execAsync = promisify(exec);\n\n\t\t\ttry {\n\t\t\t\tawait execAsync(\n\t\t\t\t\t`tar -xzf \"${tempFile}\" -C \"${destDir}\" --strip-components=1`,\n\t\t\t\t);\n\t\t\t} finally {\n\t\t\t\tawait rm(tempFile, { force: true });\n\t\t\t}\n\n\t\t\tconsole.log(` Installed to ${destDir}`);\n\t\t}\n\n\t\tconsole.log(`\\nAll ${skillCount} skill(s) installed.`);\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : \"Unknown error\";\n\t\tconsole.error(`Error: ${message}`);\n\t\tprocess.exit(1);\n\t}\n}\n","import { access } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { getSkillsDir } from \"../config.js\";\nimport { listLockfileSkills } from \"../lockfile.js\";\n\nexport interface ListOptions {\n\tjson?: boolean;\n}\n\nexport async function list(options: ListOptions): Promise<void> {\n\ttry {\n\t\tconst skills = await listLockfileSkills();\n\n\t\tif (skills.length === 0) {\n\t\t\tconsole.log(\"No skills installed.\");\n\t\t\treturn;\n\t\t}\n\n\t\tif (options.json) {\n\t\t\tconsole.log(JSON.stringify(skills, null, 2));\n\t\t\treturn;\n\t\t}\n\n\t\tconst skillsDir = getSkillsDir();\n\n\t\tconsole.log(\"Installed skills:\\n\");\n\n\t\tfor (const { name, entry } of skills) {\n\t\t\tconst match = name.match(/^@user\\/([^/]+)\\/([^/]+)$/);\n\t\t\tif (!match) continue;\n\n\t\t\tconst [, username, skillName] = match;\n\t\t\tconst skillPath = join(skillsDir, username, skillName);\n\n\t\t\t// Check if skill is actually installed on disk\n\t\t\tlet status = \"installed\";\n\t\t\ttry {\n\t\t\t\tawait access(skillPath);\n\t\t\t} catch {\n\t\t\t\tstatus = \"missing\";\n\t\t\t}\n\n\t\t\tconsole.log(` ${name}@${entry.version}`);\n\t\t\tif (status === \"missing\") {\n\t\t\t\tconsole.log(` Status: MISSING (run 'pspm install' to restore)`);\n\t\t\t}\n\t\t}\n\n\t\tconsole.log(`\\nTotal: ${skills.length} skill(s)`);\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : \"Unknown error\";\n\t\tconsole.error(`Error: ${message}`);\n\t\tprocess.exit(1);\n\t}\n}\n","import { randomBytes } from \"node:crypto\";\nimport http from \"node:http\";\nimport { URL } from \"node:url\";\nimport open from \"open\";\nimport { whoamiRequest } from \"../api-client.js\";\nimport { getRegistryUrl, setCredentials } from \"../config.js\";\n\nexport interface LoginOptions {\n\tapiKey?: string;\n}\n\nconst DEFAULT_WEB_APP_URL = \"https://pspm.dev\";\n\n/**\n * Get the web app URL.\n * Priority:\n * 1. PSPM_WEB_URL environment variable (for local dev where web and server run on different ports)\n * 2. Derived from registry URL (for production where they share the same origin)\n *\n * Local dev example:\n * PSPM_WEB_URL=http://localhost:5500 pspm login\n *\n * The registry URL is like https://pspm.dev\n * The web app URL is the same: https://pspm.dev\n */\nfunction getWebAppUrl(registryUrl: string): string {\n\t// Environment variable takes priority (for local dev)\n\tif (process.env.PSPM_WEB_URL) {\n\t\treturn process.env.PSPM_WEB_URL.replace(/\\/$/, \"\"); // Remove trailing slash\n\t}\n\n\ttry {\n\t\tconst url = new URL(registryUrl);\n\t\treturn `${url.protocol}//${url.host}`;\n\t} catch {\n\t\treturn DEFAULT_WEB_APP_URL;\n\t}\n}\n\n/**\n * Get the server/API base URL from the registry URL\n * The registry URL is like https://pspm.dev\n * The server URL is the same: https://pspm.dev\n */\nfunction getServerUrl(registryUrl: string): string {\n\ttry {\n\t\tconst url = new URL(registryUrl);\n\t\treturn `${url.protocol}//${url.host}`;\n\t} catch {\n\t\treturn DEFAULT_WEB_APP_URL;\n\t}\n}\n\n/**\n * Exchange a CLI token for an API key using fetch\n */\nasync function exchangeCliToken(\n\tregistryUrl: string,\n\ttoken: string,\n): Promise<{ apiKey: string; username: string }> {\n\tconst serverUrl = getServerUrl(registryUrl);\n\t// Use direct REST endpoint (not oRPC) for CLI compatibility\n\tconst rpcUrl = `${serverUrl}/api/api-keys/cli-token-exchange`;\n\n\tconst response = await fetch(rpcUrl, {\n\t\tmethod: \"POST\",\n\t\theaders: {\n\t\t\t\"Content-Type\": \"application/json\",\n\t\t},\n\t\tbody: JSON.stringify({ token }),\n\t});\n\n\tif (!response.ok) {\n\t\tconst errorText = await response.text();\n\t\tthrow new Error(`Failed to exchange token: ${errorText}`);\n\t}\n\n\treturn response.json() as Promise<{ apiKey: string; username: string }>;\n}\n\n/**\n * Start a local HTTP server to receive the OAuth callback\n */\nfunction startCallbackServer(expectedState: string): Promise<{\n\tport: number;\n\ttokenPromise: Promise<string>;\n\tcleanup: () => void;\n}> {\n\treturn new Promise((resolveServer, rejectServer) => {\n\t\tlet resolveToken: (token: string) => void;\n\t\tlet rejectToken: (error: Error) => void;\n\t\tlet timeoutId: NodeJS.Timeout;\n\n\t\tconst tokenPromise = new Promise<string>((resolve, reject) => {\n\t\t\tresolveToken = resolve;\n\t\t\trejectToken = reject;\n\t\t});\n\n\t\tconst server = http.createServer((req, res) => {\n\t\t\tconst url = new URL(req.url || \"/\", `http://localhost`);\n\n\t\t\tif (url.pathname === \"/callback\") {\n\t\t\t\tconst token = url.searchParams.get(\"token\");\n\t\t\t\tconst state = url.searchParams.get(\"state\");\n\n\t\t\t\tif (state !== expectedState) {\n\t\t\t\t\tres.writeHead(400, { \"Content-Type\": \"text/html\" });\n\t\t\t\t\tres.end(`\n\t\t\t\t\t\t<html>\n\t\t\t\t\t\t\t<body style=\"font-family: system-ui; text-align: center; padding: 40px;\">\n\t\t\t\t\t\t\t\t<h1 style=\"color: #dc2626;\">Security Error</h1>\n\t\t\t\t\t\t\t\t<p>State mismatch - this may be a security issue.</p>\n\t\t\t\t\t\t\t\t<p>Please try running <code>pspm login</code> again.</p>\n\t\t\t\t\t\t\t</body>\n\t\t\t\t\t\t</html>\n\t\t\t\t\t`);\n\t\t\t\t\trejectToken(new Error(\"State mismatch - possible CSRF attack\"));\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (!token) {\n\t\t\t\t\tres.writeHead(400, { \"Content-Type\": \"text/html\" });\n\t\t\t\t\tres.end(`\n\t\t\t\t\t\t<html>\n\t\t\t\t\t\t\t<body style=\"font-family: system-ui; text-align: center; padding: 40px;\">\n\t\t\t\t\t\t\t\t<h1 style=\"color: #dc2626;\">Error</h1>\n\t\t\t\t\t\t\t\t<p>No token received from the server.</p>\n\t\t\t\t\t\t\t\t<p>Please try running <code>pspm login</code> again.</p>\n\t\t\t\t\t\t\t</body>\n\t\t\t\t\t\t</html>\n\t\t\t\t\t`);\n\t\t\t\t\trejectToken(new Error(\"No token received\"));\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tres.writeHead(200, { \"Content-Type\": \"text/html\" });\n\t\t\t\tres.end(`\n\t\t\t\t\t<html>\n\t\t\t\t\t\t<head>\n\t\t\t\t\t\t\t<script>\n\t\t\t\t\t\t\t\t// Try to close the window after a short delay\n\t\t\t\t\t\t\t\tsetTimeout(function() {\n\t\t\t\t\t\t\t\t\twindow.close();\n\t\t\t\t\t\t\t\t}, 1500);\n\t\t\t\t\t\t\t</script>\n\t\t\t\t\t\t</head>\n\t\t\t\t\t\t<body style=\"font-family: system-ui; text-align: center; padding: 40px;\">\n\t\t\t\t\t\t\t<h1 style=\"color: #16a34a;\">Success!</h1>\n\t\t\t\t\t\t\t<p>You are now logged in to PSPM.</p>\n\t\t\t\t\t\t\t<p style=\"color: #666; font-size: 14px;\">This window will close automatically, or you can close it manually.</p>\n\t\t\t\t\t\t</body>\n\t\t\t\t\t</html>\n\t\t\t\t`);\n\n\t\t\t\tresolveToken(token);\n\t\t\t} else {\n\t\t\t\tres.writeHead(404, { \"Content-Type\": \"text/plain\" });\n\t\t\t\tres.end(\"Not found\");\n\t\t\t}\n\t\t});\n\n\t\t// Cleanup function to close server and clear timeout\n\t\tconst cleanup = () => {\n\t\t\tclearTimeout(timeoutId);\n\t\t\tserver.close();\n\t\t};\n\n\t\t// Use port 0 to let the OS assign an available port\n\t\tserver.listen(0, \"127.0.0.1\", () => {\n\t\t\tconst address = server.address();\n\t\t\tif (typeof address === \"object\" && address !== null) {\n\t\t\t\tresolveServer({ port: address.port, tokenPromise, cleanup });\n\t\t\t} else {\n\t\t\t\trejectServer(new Error(\"Failed to get server address\"));\n\t\t\t}\n\t\t});\n\n\t\tserver.on(\"error\", (err) => {\n\t\t\trejectServer(err);\n\t\t});\n\n\t\t// Timeout after 5 minutes\n\t\ttimeoutId = setTimeout(\n\t\t\t() => {\n\t\t\t\trejectToken(new Error(\"Login timed out - please try again\"));\n\t\t\t\tserver.close();\n\t\t\t},\n\t\t\t5 * 60 * 1000,\n\t\t);\n\t});\n}\n\n/**\n * Login using browser-based OAuth flow\n */\nasync function browserLogin(): Promise<void> {\n\tconst registryUrl = await getRegistryUrl();\n\tconst webAppUrl = getWebAppUrl(registryUrl);\n\n\t// Generate state for CSRF protection\n\tconst state = randomBytes(32).toString(\"base64url\");\n\n\tconsole.log(\"Starting browser-based login...\");\n\n\t// Start local callback server\n\tconst { port, tokenPromise, cleanup } = await startCallbackServer(state);\n\n\t// Build the login URL\n\tconst loginUrl = `${webAppUrl}/cli/login?port=${port}&state=${encodeURIComponent(state)}`;\n\n\tconsole.log(`Opening browser to authenticate...`);\n\tconsole.log(`If the browser doesn't open, visit: ${loginUrl}`);\n\n\t// Open the browser\n\ttry {\n\t\tawait open(loginUrl);\n\t} catch {\n\t\tconsole.log(\"Could not open browser automatically.\");\n\t\tconsole.log(`Please visit: ${loginUrl}`);\n\t}\n\n\tconsole.log(\"Waiting for authentication...\");\n\n\t// Wait for the callback with the token\n\tconst token = await tokenPromise;\n\n\t// Clean up server and timeout immediately after receiving token\n\tcleanup();\n\n\tconsole.log(\"Received token, exchanging for API key...\");\n\n\t// Exchange the token for an API key\n\tconst { apiKey, username } = await exchangeCliToken(registryUrl, token);\n\n\t// Store credentials\n\tawait setCredentials(apiKey, username, registryUrl);\n\n\tconsole.log(`Logged in as ${username}`);\n\tconsole.log(`Registry: ${registryUrl}`);\n}\n\n/**\n * Login using direct API key (fallback method)\n */\nasync function directLogin(apiKey: string): Promise<void> {\n\tconsole.log(\"Verifying API key...\");\n\n\tconst registryUrl = await getRegistryUrl();\n\n\tconst user = await whoamiRequest(registryUrl, apiKey);\n\tif (!user) {\n\t\tconsole.error(\"Error: Invalid API key or not authenticated\");\n\t\tprocess.exit(1);\n\t}\n\n\t// Store credentials\n\tawait setCredentials(apiKey, user.username, registryUrl);\n\tconsole.log(`Logged in as ${user.username}`);\n\tconsole.log(`Registry: ${registryUrl}`);\n}\n\nexport async function login(options: LoginOptions): Promise<void> {\n\ttry {\n\t\tif (options.apiKey) {\n\t\t\t// Direct login with API key\n\t\t\tawait directLogin(options.apiKey);\n\t\t} else {\n\t\t\t// Browser-based OAuth flow\n\t\t\tawait browserLogin();\n\t\t}\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : \"Unknown error\";\n\t\tconsole.error(`Error: ${message}`);\n\t\tprocess.exit(1);\n\t}\n}\n","import { clearCredentials, isLoggedIn } from \"../config.js\";\n\nexport async function logout(): Promise<void> {\n\ttry {\n\t\tconst loggedIn = await isLoggedIn();\n\n\t\tif (!loggedIn) {\n\t\t\tconsole.log(\"Not logged in.\");\n\t\t\treturn;\n\t\t}\n\n\t\tawait clearCredentials();\n\t\tconsole.log(\"Logged out successfully.\");\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : \"Unknown error\";\n\t\tconsole.error(`Error: ${message}`);\n\t\tprocess.exit(1);\n\t}\n}\n","import { exec as execCb } from \"node:child_process\";\nimport { createHash } from \"node:crypto\";\nimport { readdir, readFile, stat } from \"node:fs/promises\";\nimport { join, relative } from \"node:path\";\nimport { promisify } from \"node:util\";\nimport type { SkillManifest } from \"@repo/sdk\";\nimport { configure, publishSkill } from \"../api-client.js\";\nimport { getRegistryUrl, requireApiKey } from \"../config.js\";\nimport { extractApiErrorMessage } from \"../errors.js\";\n\nconst exec = promisify(execCb);\n\n/**\n * Format bytes to human readable string\n */\nfunction formatBytes(bytes: number): string {\n\tif (bytes < 1024) return `${bytes}B`;\n\tif (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)}kB`;\n\treturn `${(bytes / (1024 * 1024)).toFixed(1)}MB`;\n}\n\n/**\n * Recursively get all files in a directory with their sizes\n */\nasync function getFilesWithSizes(\n\tdir: string,\n\tbaseDir: string,\n): Promise<Array<{ path: string; size: number }>> {\n\tconst results: Array<{ path: string; size: number }> = [];\n\n\ttry {\n\t\tconst entries = await readdir(dir, { withFileTypes: true });\n\n\t\tfor (const entry of entries) {\n\t\t\tconst fullPath = join(dir, entry.name);\n\t\t\tconst relativePath = relative(baseDir, fullPath);\n\n\t\t\t// Skip node_modules and .git\n\t\t\tif (entry.name === \"node_modules\" || entry.name === \".git\") {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (entry.isDirectory()) {\n\t\t\t\tconst subFiles = await getFilesWithSizes(fullPath, baseDir);\n\t\t\t\tresults.push(...subFiles);\n\t\t\t} else {\n\t\t\t\tconst fileStat = await stat(fullPath);\n\t\t\t\tresults.push({ path: relativePath, size: fileStat.size });\n\t\t\t}\n\t\t}\n\t} catch {\n\t\t// Directory doesn't exist or can't be read\n\t}\n\n\treturn results;\n}\n\nexport interface PublishOptions {\n\tbump?: \"major\" | \"minor\" | \"patch\";\n\ttag?: string;\n}\n\nexport async function publishCommand(options: PublishOptions): Promise<void> {\n\ttry {\n\t\tconst apiKey = await requireApiKey();\n\t\tconst registryUrl = await getRegistryUrl();\n\n\t\t// Read package.json from current directory\n\t\tconst packageJsonPath = join(process.cwd(), \"package.json\");\n\t\tlet packageJson: SkillManifest;\n\n\t\ttry {\n\t\t\tconst content = await readFile(packageJsonPath, \"utf-8\");\n\t\t\tpackageJson = JSON.parse(content);\n\t\t} catch {\n\t\t\tconsole.error(\"Error: No package.json found in current directory\");\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\t// Validate required fields\n\t\tif (!packageJson.name) {\n\t\t\tconsole.error(\"Error: package.json must have a 'name' field\");\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\tif (!packageJson.version) {\n\t\t\tconsole.error(\"Error: package.json must have a 'version' field\");\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\t// Handle version bump if requested\n\t\tif (options.bump) {\n\t\t\tconst semver = await import(\"semver\");\n\t\t\tconst newVersion = semver.default.inc(packageJson.version, options.bump);\n\t\t\tif (!newVersion) {\n\t\t\t\tconsole.error(\n\t\t\t\t\t`Error: Failed to bump version from ${packageJson.version}`,\n\t\t\t\t);\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\t\t\tpackageJson.version = newVersion;\n\t\t\tconsole.log(`Bumped version to ${newVersion}`);\n\t\t}\n\n\t\t// Create tarball using npm pack (or tar directly)\n\t\t// Sanitize name for filename (replace @ and / with -)\n\t\tconst safeName = packageJson.name.replace(/[@/]/g, \"-\").replace(/^-+/, \"\");\n\t\tconst tarballName = `${safeName}-${packageJson.version}.tgz`;\n\t\tconst tempDir = join(process.cwd(), \".pspm-publish\");\n\n\t\t// Create tarball\n\t\ttry {\n\t\t\tawait exec(`rm -rf \"${tempDir}\" && mkdir -p \"${tempDir}\"`);\n\n\t\t\t// Get files to include (use 'files' from package.json or default)\n\t\t\tconst files = packageJson.files || [\n\t\t\t\t\"package.json\",\n\t\t\t\t\"SKILL.md\",\n\t\t\t\t\"runtime\",\n\t\t\t\t\"scripts\",\n\t\t\t\t\"data\",\n\t\t\t];\n\n\t\t\t// Create the tarball structure: package/{files}\n\t\t\tawait exec(`mkdir -p \"${tempDir}/package\"`);\n\n\t\t\tfor (const file of files) {\n\t\t\t\ttry {\n\t\t\t\t\t// Use rsync to copy while excluding node_modules\n\t\t\t\t\tawait exec(\n\t\t\t\t\t\t`rsync -a --exclude='node_modules' --exclude='.git' \"${file}\" \"${tempDir}/package/\" 2>/dev/null || true`,\n\t\t\t\t\t);\n\t\t\t\t} catch {\n\t\t\t\t\t// Ignore files that don't exist\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Always include package.json\n\t\t\tawait exec(`cp package.json \"${tempDir}/package/\"`);\n\n\t\t\t// Get list of files that will be included and their sizes\n\t\t\tconst packageDir = join(tempDir, \"package\");\n\t\t\tconst tarballContents = await getFilesWithSizes(packageDir, packageDir);\n\t\t\tconst unpackedSize = tarballContents.reduce((acc, f) => acc + f.size, 0);\n\n\t\t\t// Create tarball (excluding node_modules just in case)\n\t\t\tconst tarballPath = join(tempDir, tarballName);\n\t\t\tawait exec(\n\t\t\t\t`tar -czf \"${tarballPath}\" -C \"${tempDir}\" --exclude='node_modules' --exclude='.git' package`,\n\t\t\t);\n\n\t\t\t// Read tarball and calculate hashes\n\t\t\tconst tarballBuffer = await readFile(tarballPath);\n\t\t\tconst tarballBase64 = tarballBuffer.toString(\"base64\");\n\t\t\tconst tarballSize = tarballBuffer.length;\n\n\t\t\t// Calculate shasum (sha1) and integrity (sha512)\n\t\t\tconst shasum = createHash(\"sha1\").update(tarballBuffer).digest(\"hex\");\n\t\t\tconst integrityHash = createHash(\"sha512\")\n\t\t\t\t.update(tarballBuffer)\n\t\t\t\t.digest(\"base64\");\n\t\t\tconst integrity = `sha512-${integrityHash}`;\n\n\t\t\t// Print npm-style publish notice\n\t\t\tconsole.log(\"\");\n\t\t\tconsole.log(`pspm notice`);\n\t\t\tconsole.log(`pspm notice 📦 ${packageJson.name}@${packageJson.version}`);\n\t\t\tconsole.log(`pspm notice Tarball Contents`);\n\n\t\t\t// Sort files by size descending for display\n\t\t\ttarballContents.sort((a, b) => b.size - a.size);\n\t\t\tfor (const file of tarballContents) {\n\t\t\t\tconsole.log(\n\t\t\t\t\t`pspm notice ${formatBytes(file.size).padStart(8)} ${file.path}`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconsole.log(`pspm notice Tarball Details`);\n\t\t\tconsole.log(`pspm notice name: ${packageJson.name}`);\n\t\t\tconsole.log(`pspm notice version: ${packageJson.version}`);\n\t\t\tconsole.log(`pspm notice filename: ${tarballName}`);\n\t\t\tconsole.log(`pspm notice package size: ${formatBytes(tarballSize)}`);\n\t\t\tconsole.log(`pspm notice unpacked size: ${formatBytes(unpackedSize)}`);\n\t\t\tconsole.log(`pspm notice shasum: ${shasum}`);\n\t\t\tconsole.log(\n\t\t\t\t`pspm notice integrity: ${integrity.substring(0, 50)}...`,\n\t\t\t);\n\t\t\tconsole.log(`pspm notice total files: ${tarballContents.length}`);\n\t\t\tconsole.log(`pspm notice`);\n\t\t\tconsole.log(`pspm notice Publishing to ${registryUrl} with tag latest`);\n\n\t\t\t// Configure SDK and publish (use direct REST endpoints, not oRPC)\n\t\t\tconfigure({ registryUrl, apiKey });\n\t\t\tconst response = await publishSkill({\n\t\t\t\tmanifest: packageJson,\n\t\t\t\ttarballBase64,\n\t\t\t});\n\n\t\t\tif (response.status !== 200) {\n\t\t\t\tconst errorMessage = extractApiErrorMessage(response, \"Publish failed\");\n\n\t\t\t\t// Check for version conflict errors\n\t\t\t\tif (\n\t\t\t\t\terrorMessage.includes(\"must be greater than\") ||\n\t\t\t\t\terrorMessage.includes(\"already exists\")\n\t\t\t\t) {\n\t\t\t\t\tconsole.error(`pspm error code E403`);\n\t\t\t\t\tconsole.error(\n\t\t\t\t\t\t`pspm error 403 403 Forbidden - You cannot publish over the previously published versions: ${packageJson.version}.`,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tthrow new Error(errorMessage);\n\t\t\t}\n\n\t\t\tconst result = response.data;\n\t\t\tconsole.log(\n\t\t\t\t`+ @user/${result.skill.username}/${result.skill.name}@${result.version.version}`,\n\t\t\t);\n\t\t\tconsole.log(`Checksum: ${result.version.checksum}`);\n\t\t} finally {\n\t\t\t// Cleanup\n\t\t\tawait exec(`rm -rf \"${tempDir}\"`).catch(() => {});\n\t\t}\n\t} catch (error) {\n\t\tif (error instanceof Error) {\n\t\t\tconsole.error(`Error: ${error.message}`);\n\t\t} else {\n\t\t\tconsole.error(`Error: ${String(error)}`);\n\t\t}\n\t\tprocess.exit(1);\n\t}\n}\n\n// Keep old export name for backwards compatibility\nexport { publishCommand as publish };\n","import { rm } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { getSkillsDir, requireApiKey } from \"../config.js\";\nimport { listLockfileSkills, removeFromLockfile } from \"../lockfile.js\";\n\nexport async function remove(nameOrSpecifier: string): Promise<void> {\n\ttry {\n\t\tawait requireApiKey();\n\n\t\t// Normalize the name\n\t\tlet fullName: string;\n\t\tlet username: string;\n\t\tlet name: string;\n\n\t\tif (nameOrSpecifier.startsWith(\"@user/\")) {\n\t\t\t// Full specifier: @user/{username}/{name}\n\t\t\tconst match = nameOrSpecifier.match(/^@user\\/([^/]+)\\/([^@/]+)/);\n\t\t\tif (!match) {\n\t\t\t\tconsole.error(`Error: Invalid skill specifier: ${nameOrSpecifier}`);\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\t\t\tfullName = `@user/${match[1]}/${match[2]}`;\n\t\t\tusername = match[1];\n\t\t\tname = match[2];\n\t\t} else {\n\t\t\t// Short name - find in lockfile\n\t\t\tconst skills = await listLockfileSkills();\n\t\t\tconst found = skills.find((s) => {\n\t\t\t\tconst match = s.name.match(/^@user\\/([^/]+)\\/([^/]+)$/);\n\t\t\t\treturn match && match[2] === nameOrSpecifier;\n\t\t\t});\n\n\t\t\tif (!found) {\n\t\t\t\tconsole.error(\n\t\t\t\t\t`Error: Skill \"${nameOrSpecifier}\" not found in lockfile`,\n\t\t\t\t);\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\n\t\t\tfullName = found.name;\n\t\t\tconst match = fullName.match(/^@user\\/([^/]+)\\/([^/]+)$/);\n\t\t\tif (!match) {\n\t\t\t\tconsole.error(`Error: Invalid skill name in lockfile: ${fullName}`);\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\t\t\tusername = match[1];\n\t\t\tname = match[2];\n\t\t}\n\n\t\tconsole.log(`Removing ${fullName}...`);\n\n\t\t// Remove from lockfile\n\t\tconst removed = await removeFromLockfile(fullName);\n\t\tif (!removed) {\n\t\t\tconsole.error(`Error: ${fullName} not found in lockfile`);\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\t// Remove from disk\n\t\tconst skillsDir = getSkillsDir();\n\t\tconst destDir = join(skillsDir, username, name);\n\n\t\ttry {\n\t\t\tawait rm(destDir, { recursive: true, force: true });\n\t\t} catch {\n\t\t\t// Ignore errors if directory doesn't exist\n\t\t}\n\n\t\tconsole.log(`Removed ${fullName}`);\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : \"Unknown error\";\n\t\tconsole.error(`Error: ${message}`);\n\t\tprocess.exit(1);\n\t}\n}\n","import { parseSkillSpecifier } from \"@repo/pspm-types\";\nimport { configure, deleteSkill, deleteSkillVersion } from \"../api-client.js\";\nimport { getRegistryUrl, requireApiKey } from \"../config.js\";\nimport { extractApiErrorMessage } from \"../errors.js\";\n\nexport interface UnpublishOptions {\n\tforce?: boolean;\n}\n\nexport async function unpublish(\n\tspecifier: string,\n\toptions: UnpublishOptions,\n): Promise<void> {\n\ttry {\n\t\tconst apiKey = await requireApiKey();\n\t\tconst registryUrl = await getRegistryUrl();\n\n\t\t// Parse the specifier\n\t\tconst parsed = parseSkillSpecifier(specifier);\n\t\tif (!parsed) {\n\t\t\tconsole.error(\n\t\t\t\t`Error: Invalid skill specifier \"${specifier}\". Use format: @user/{username}/{name}[@{version}]`,\n\t\t\t);\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\tconst { username, name, versionRange } = parsed;\n\n\t\t// Configure SDK (use direct REST endpoints, not oRPC)\n\t\tconfigure({ registryUrl, apiKey });\n\n\t\tif (versionRange) {\n\t\t\t// Delete specific version\n\t\t\tconsole.log(`Unpublishing ${specifier}...`);\n\n\t\t\tif (!options.force) {\n\t\t\t\tconsole.error(\n\t\t\t\t\t\"Warning: This action is irreversible. Use --force to confirm.\",\n\t\t\t\t);\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\n\t\t\tconst response = await deleteSkillVersion(name, versionRange);\n\t\t\tif (response.status !== 200) {\n\t\t\t\tconst errorMessage = extractApiErrorMessage(\n\t\t\t\t\tresponse,\n\t\t\t\t\t\"Failed to unpublish. Version may not exist.\",\n\t\t\t\t);\n\t\t\t\tconsole.error(`Error: ${errorMessage}`);\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\t\t\tconsole.log(`Unpublished @user/${username}/${name}@${versionRange}`);\n\t\t} else {\n\t\t\t// Delete entire skill\n\t\t\tconsole.log(`Unpublishing all versions of @user/${username}/${name}...`);\n\n\t\t\tif (!options.force) {\n\t\t\t\tconsole.error(\n\t\t\t\t\t\"Warning: This will delete ALL versions. Use --force to confirm.\",\n\t\t\t\t);\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\n\t\t\tconst response = await deleteSkill(name);\n\t\t\tif (response.status !== 200) {\n\t\t\t\tconst errorMessage = extractApiErrorMessage(\n\t\t\t\t\tresponse,\n\t\t\t\t\t\"Failed to unpublish. Skill may not exist.\",\n\t\t\t\t);\n\t\t\t\tconsole.error(`Error: ${errorMessage}`);\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\t\t\tconsole.log(`Unpublished @user/${username}/${name} (all versions)`);\n\t\t}\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : \"Unknown error\";\n\t\tconsole.error(`Error: ${message}`);\n\t\tprocess.exit(1);\n\t}\n}\n","import { resolveVersion } from \"@repo/pspm-types\";\nimport { configure, listSkillVersions } from \"../api-client.js\";\nimport { getRegistryUrl, requireApiKey } from \"../config.js\";\nimport { extractApiErrorMessage } from \"../errors.js\";\nimport { listLockfileSkills } from \"../lockfile.js\";\nimport { add } from \"./add.js\";\n\nexport interface UpdateOptions {\n\tdryRun?: boolean;\n}\n\nexport async function update(options: UpdateOptions): Promise<void> {\n\ttry {\n\t\tconst apiKey = await requireApiKey();\n\t\tconst registryUrl = await getRegistryUrl();\n\n\t\tconst skills = await listLockfileSkills();\n\n\t\tif (skills.length === 0) {\n\t\t\tconsole.log(\"No skills installed.\");\n\t\t\treturn;\n\t\t}\n\n\t\t// Configure SDK (use direct REST endpoints, not oRPC)\n\t\tconfigure({ registryUrl, apiKey });\n\n\t\tconst updates: Array<{\n\t\t\tname: string;\n\t\t\tcurrent: string;\n\t\t\tlatest: string;\n\t\t}> = [];\n\n\t\tconsole.log(\"Checking for updates...\\n\");\n\n\t\tfor (const { name, entry } of skills) {\n\t\t\tconst match = name.match(/^@user\\/([^/]+)\\/([^/]+)$/);\n\t\t\tif (!match) continue;\n\n\t\t\tconst [, username, skillName] = match;\n\n\t\t\ttry {\n\t\t\t\tconst versionsResponse = await listSkillVersions(username, skillName);\n\t\t\t\tif (versionsResponse.status !== 200) {\n\t\t\t\t\tconst errorMessage = extractApiErrorMessage(\n\t\t\t\t\t\tversionsResponse,\n\t\t\t\t\t\t\"Failed to fetch versions\",\n\t\t\t\t\t);\n\t\t\t\t\tconsole.warn(` Warning: ${name}: ${errorMessage}`);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconst versions = versionsResponse.data;\n\t\t\t\tif (versions.length === 0) continue;\n\n\t\t\t\tconst versionStrings = versions.map(\n\t\t\t\t\t(v: { version: string }) => v.version,\n\t\t\t\t);\n\t\t\t\tconst latest = resolveVersion(\"*\", versionStrings);\n\n\t\t\t\tif (latest && latest !== entry.version) {\n\t\t\t\t\tupdates.push({\n\t\t\t\t\t\tname,\n\t\t\t\t\t\tcurrent: entry.version,\n\t\t\t\t\t\tlatest,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\tconsole.warn(` Warning: Could not check updates for ${name}`);\n\t\t\t}\n\t\t}\n\n\t\tif (updates.length === 0) {\n\t\t\tconsole.log(\"All skills are up to date.\");\n\t\t\treturn;\n\t\t}\n\n\t\tconsole.log(\"Updates available:\\n\");\n\t\tfor (const { name, current, latest } of updates) {\n\t\t\tconsole.log(` ${name}: ${current} -> ${latest}`);\n\t\t}\n\n\t\tif (options.dryRun) {\n\t\t\tconsole.log(\"\\nDry run - no changes made.\");\n\t\t\treturn;\n\t\t}\n\n\t\tconsole.log(\"\\nUpdating...\\n\");\n\n\t\tfor (const { name, latest } of updates) {\n\t\t\tconst match = name.match(/^@user\\/([^/]+)\\/([^/]+)$/);\n\t\t\tif (!match) continue;\n\n\t\t\tconst [, username, skillName] = match;\n\t\t\tconst specifier = `@user/${username}/${skillName}@${latest}`;\n\n\t\t\tawait add(specifier, {});\n\t\t}\n\n\t\tconsole.log(\"\\nAll skills updated.\");\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : \"Unknown error\";\n\t\tconsole.error(`Error: ${message}`);\n\t\tprocess.exit(1);\n\t}\n}\n","import { whoamiRequest } from \"../api-client.js\";\nimport { getRegistryUrl, requireApiKey, resolveConfig } from \"../config.js\";\n\nexport async function whoami(): Promise<void> {\n\ttry {\n\t\tconst resolved = await resolveConfig();\n\t\tconst apiKey = await requireApiKey();\n\t\tconst registryUrl = await getRegistryUrl();\n\n\t\tconst user = await whoamiRequest(registryUrl, apiKey);\n\n\t\tif (user) {\n\t\t\tconsole.log(`Username: ${user.username}`);\n\t\t\tconsole.log(`User ID: ${user.userId}`);\n\t\t\tconsole.log(`Registry: ${registryUrl}`);\n\t\t} else if (resolved.username) {\n\t\t\t// Use cached username if API call fails\n\t\t\tconsole.log(`Username: ${resolved.username} (cached)`);\n\t\t\tconsole.log(`Registry: ${registryUrl}`);\n\t\t} else {\n\t\t\tconsole.error(\"Could not determine current user.\");\n\t\t\tprocess.exit(1);\n\t\t}\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : \"Unknown error\";\n\t\tconsole.error(`Error: ${message}`);\n\t\tprocess.exit(1);\n\t}\n}\n","#!/usr/bin/env node\n\nimport { readFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { Command } from \"commander\";\nimport {\n\tadd,\n\tconfigInit,\n\tconfigShow,\n\tinstall,\n\tlist,\n\tlogin,\n\tlogout,\n\tpublish,\n\tremove,\n\tunpublish,\n\tupdate,\n\twhoami,\n} from \"./commands/index.js\";\n\n// Read version from package.json\nconst __dirname = dirname(fileURLToPath(import.meta.url));\nconst packageJson = JSON.parse(\n\treadFileSync(join(__dirname, \"..\", \"package.json\"), \"utf-8\"),\n);\nconst version: string = packageJson.version;\n\nconst program = new Command();\n\nprogram\n\t.name(\"pspm\")\n\t.description(\"Prompt Skill Package Manager for AnyT\")\n\t.version(version);\n\n// =============================================================================\n// Config commands\n// =============================================================================\n\nconst configCmd = program\n\t.command(\"config\")\n\t.description(\"Manage PSPM configuration\");\n\nconfigCmd\n\t.command(\"show\")\n\t.description(\"Show resolved configuration\")\n\t.action(async () => {\n\t\tawait configShow();\n\t});\n\nconfigCmd\n\t.command(\"init\")\n\t.description(\"Create a .pspmrc file in the current directory\")\n\t.option(\"--registry <url>\", \"Registry URL override\")\n\t.action(async (options) => {\n\t\tawait configInit({\n\t\t\tregistry: options.registry,\n\t\t});\n\t});\n\n// =============================================================================\n// Authentication commands\n// =============================================================================\n\nprogram\n\t.command(\"login\")\n\t.description(\"Log in via browser or with an API key\")\n\t.option(\n\t\t\"--api-key <key>\",\n\t\t\"API key for direct authentication (skips browser)\",\n\t)\n\t.action(async (options) => {\n\t\tawait login({ apiKey: options.apiKey });\n\t});\n\nprogram\n\t.command(\"logout\")\n\t.description(\"Log out and clear stored credentials\")\n\t.action(async () => {\n\t\tawait logout();\n\t});\n\nprogram\n\t.command(\"whoami\")\n\t.description(\"Show current user information\")\n\t.action(async () => {\n\t\tawait whoami();\n\t});\n\n// =============================================================================\n// Skill management commands\n// =============================================================================\n\nprogram\n\t.command(\"add <specifier>\")\n\t.description(\"Add a skill (e.g., @user/bsheng/vite_slides@^2.0.0)\")\n\t.option(\"--save\", \"Save to lockfile (default)\")\n\t.action(async (specifier, options) => {\n\t\tawait add(specifier, { save: options.save ?? true });\n\t});\n\nprogram\n\t.command(\"remove <name>\")\n\t.alias(\"rm\")\n\t.description(\"Remove an installed skill\")\n\t.action(async (name) => {\n\t\tawait remove(name);\n\t});\n\nprogram\n\t.command(\"list\")\n\t.alias(\"ls\")\n\t.description(\"List installed skills\")\n\t.option(\"--json\", \"Output as JSON\")\n\t.action(async (options) => {\n\t\tawait list({ json: options.json });\n\t});\n\nprogram\n\t.command(\"install\")\n\t.alias(\"i\")\n\t.description(\"Install all skills from lockfile\")\n\t.option(\"--frozen-lockfile\", \"Fail if lockfile is missing or outdated\")\n\t.option(\"--dir <path>\", \"Install skills to a specific directory\")\n\t.action(async (options) => {\n\t\tawait install({\n\t\t\tfrozenLockfile: options.frozenLockfile,\n\t\t\tdir: options.dir,\n\t\t});\n\t});\n\nprogram\n\t.command(\"update\")\n\t.description(\"Update all skills to latest compatible versions\")\n\t.option(\"--dry-run\", \"Show what would be updated without making changes\")\n\t.action(async (options) => {\n\t\tawait update({ dryRun: options.dryRun });\n\t});\n\n// =============================================================================\n// Publishing commands\n// =============================================================================\n\nprogram\n\t.command(\"publish\")\n\t.description(\"Publish current directory as a skill\")\n\t.option(\"--bump <level>\", \"Bump version (major, minor, patch)\")\n\t.option(\"--tag <tag>\", \"Tag for the release\")\n\t.action(async (options) => {\n\t\tawait publish({\n\t\t\tbump: options.bump as \"major\" | \"minor\" | \"patch\" | undefined,\n\t\t\ttag: options.tag,\n\t\t});\n\t});\n\nprogram\n\t.command(\"unpublish <specifier>\")\n\t.description(\"Remove a published skill version\")\n\t.option(\"--force\", \"Confirm destructive action\")\n\t.action(async (specifier, options) => {\n\t\tawait unpublish(specifier, { force: options.force });\n\t});\n\nprogram.parse();\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../packages/shared/pspm-types/src/integrity.ts","../../../packages/shared/pspm-types/src/specifier.ts","../../../packages/shared/pspm-types/src/version.ts","../../../packages/sdk/src/fetchers/cli-fetcher.ts","../../../packages/sdk/src/generated/fetch/index.ts","../src/api-client.ts","../src/errors.ts","../src/config.ts","../src/lockfile.ts","../src/commands/add.ts","../src/commands/config/init.ts","../src/commands/config/show.ts","../src/commands/install.ts","../src/commands/list.ts","../src/commands/login.ts","../src/commands/logout.ts","../src/commands/publish.ts","../src/commands/remove.ts","../src/commands/unpublish.ts","../src/commands/update.ts","../src/commands/whoami.ts","../src/index.ts"],"names":["version","configure","config","readFile","mkdir","dirname","writeFile","join","exec","promisify","stat","createHash","rm","exchangeCliToken","execCb","packageJson","semver","match","__dirname"],"mappings":"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","file":"index.js","sourcesContent":["import { createHash } from \"node:crypto\";\n\n/**\n * Calculate integrity hash for a buffer.\n * Uses SHA-256 with base64 encoding, prefixed with \"sha256-\".\n *\n * @param data - The buffer to hash\n * @returns Integrity string (e.g., \"sha256-abc123...\")\n */\nexport function calculateIntegrity(data: Buffer): string {\n\tconst hash = createHash(\"sha256\").update(data).digest(\"base64\");\n\treturn `sha256-${hash}`;\n}\n\n/**\n * Verify that a buffer matches an expected integrity hash.\n *\n * @param data - The buffer to verify\n * @param expectedIntegrity - The expected integrity string\n * @returns True if the integrity matches\n */\nexport function verifyIntegrity(\n\tdata: Buffer,\n\texpectedIntegrity: string,\n): boolean {\n\tconst match = expectedIntegrity.match(/^sha256-(.+)$/);\n\tif (!match) {\n\t\treturn false;\n\t}\n\n\tconst actualHash = createHash(\"sha256\").update(data).digest(\"base64\");\n\treturn actualHash === match[1];\n}\n","/**\n * Parsed skill specifier (from CLI input)\n * e.g., \"@user/bsheng/vite_slides@^2.0.0\"\n */\nexport interface SkillSpecifier {\n\tusername: string;\n\tname: string;\n\tversionRange?: string;\n}\n\n/**\n * Skill specifier regex pattern\n * Matches: @user/{username}/{name}[@{version}]\n */\nconst SPECIFIER_PATTERN =\n\t/^@user\\/([a-zA-Z0-9_-]+)\\/([a-z][a-z0-9_-]*)(?:@(.+))?$/;\n\n/**\n * Parse a skill specifier string.\n *\n * @param specifier - The specifier string (e.g., \"@user/bsheng/vite_slides@^2.0.0\")\n * @returns Parsed specifier or null if invalid\n *\n * @example\n * ```typescript\n * parseSkillSpecifier(\"@user/bsheng/my-skill@^1.0.0\")\n * // => { username: \"bsheng\", name: \"my-skill\", versionRange: \"^1.0.0\" }\n *\n * parseSkillSpecifier(\"@user/bsheng/my-skill\")\n * // => { username: \"bsheng\", name: \"my-skill\", versionRange: undefined }\n * ```\n */\nexport function parseSkillSpecifier(specifier: string): SkillSpecifier | null {\n\tconst match = specifier.match(SPECIFIER_PATTERN);\n\n\tif (!match) {\n\t\treturn null;\n\t}\n\n\treturn {\n\t\tusername: match[1],\n\t\tname: match[2],\n\t\tversionRange: match[3],\n\t};\n}\n\n/**\n * Generate a full skill identifier string.\n *\n * @param username - The owner's username\n * @param name - The skill name\n * @param version - Optional version string\n * @returns Full identifier (e.g., \"@user/bsheng/my-skill@1.0.0\")\n */\nexport function generateSkillIdentifier(\n\tusername: string,\n\tname: string,\n\tversion?: string,\n): string {\n\tconst base = `@user/${username}/${name}`;\n\treturn version ? `${base}@${version}` : base;\n}\n","import * as semver from \"semver\";\n\n/**\n * Resolve the best matching version from a list of available versions.\n *\n * @param range - The version range to match (e.g., \"^1.0.0\", \"~2.1.0\", \"*\")\n * @param availableVersions - List of available version strings\n * @returns The best matching version or null if none found\n */\nexport function resolveVersion(\n\trange: string,\n\tavailableVersions: string[],\n): string | null {\n\tconst sorted = availableVersions\n\t\t.filter((v) => semver.valid(v))\n\t\t.sort((a, b) => semver.rcompare(a, b));\n\n\tif (!range || range === \"latest\" || range === \"*\") {\n\t\treturn sorted[0] ?? null;\n\t}\n\n\treturn semver.maxSatisfying(sorted, range);\n}\n\n/**\n * Check if a version satisfies a given range.\n */\nexport function versionSatisfies(version: string, range: string): boolean {\n\treturn semver.satisfies(version, range);\n}\n\n/**\n * Normalize a version range string.\n * Converts \"latest\" or empty to \"*\".\n */\nexport function normalizeVersionRange(range?: string): string {\n\tif (!range || range === \"latest\") {\n\t\treturn \"*\";\n\t}\n\treturn range;\n}\n\n/**\n * Compare two versions.\n * Returns: -1 if a < b, 0 if a === b, 1 if a > b\n */\nexport function compareVersions(a: string, b: string): number {\n\treturn semver.compare(a, b);\n}\n\n/**\n * Check if version a is greater than version b.\n */\nexport function isNewerVersion(a: string, b: string): boolean {\n\treturn semver.gt(a, b);\n}\n\n/**\n * Get the latest version from a list.\n */\nexport function getLatestVersion(versions: string[]): string | null {\n\tconst valid = versions.filter((v) => semver.valid(v));\n\tif (valid.length === 0) return null;\n\treturn valid.sort((a, b) => semver.rcompare(a, b))[0];\n}\n","/**\n * Custom fetch wrapper for Orval-generated SDK\n *\n * Handles authentication and base URL configuration.\n */\n\nexport interface SDKConfig {\n\tbaseUrl: string;\n\tapiKey: string;\n}\n\nlet config: SDKConfig | null = null;\n\n/**\n * Configure the SDK with base URL and API key.\n * Must be called before making any API requests.\n *\n * @example\n * ```typescript\n * import { configure } from \"@repo/sdk\";\n *\n * configure({\n * baseUrl: \"http://localhost:5600\",\n * apiKey: \"your-api-key\"\n * });\n * ```\n */\nexport function configure(options: SDKConfig): void {\n\tconfig = options;\n}\n\n/**\n * Get the current SDK configuration.\n * @throws Error if not configured\n */\nexport function getConfig(): SDKConfig {\n\tif (!config) {\n\t\tthrow new Error(\"SDK not configured. Call configure() first.\");\n\t}\n\treturn config;\n}\n\n/**\n * Check if the SDK is configured.\n */\nexport function isConfigured(): boolean {\n\treturn config !== null;\n}\n\n/**\n * Error class for SDK API errors\n */\nexport class SDKError extends Error {\n\tconstructor(\n\t\tmessage: string,\n\t\tpublic readonly status: number,\n\t\tpublic readonly body?: string,\n\t) {\n\t\tsuper(message);\n\t\tthis.name = \"SDKError\";\n\t}\n}\n\n/**\n * Response structure returned by all SDK functions\n */\nexport interface SDKResponse<T> {\n\tdata: T;\n\tstatus: number;\n\theaders: Headers;\n}\n\n/**\n * Custom fetch function for Orval\n *\n * This is used by all generated API functions to make HTTP requests.\n * It handles authentication, error handling, and response parsing.\n *\n * Returns { data, status, headers } structure expected by Orval v8.\n */\nexport async function customFetch<T>(\n\turl: string,\n\toptions: RequestInit,\n): Promise<T> {\n\tconst { baseUrl, apiKey } = getConfig();\n\n\t// The URL from Orval will be like \"/api/skills/me\"\n\t// We need to prepend the baseUrl\n\tconst fullUrl = `${baseUrl}${url}`;\n\n\tconst response = await fetch(fullUrl, {\n\t\t...options,\n\t\theaders: {\n\t\t\t...options.headers,\n\t\t\tAuthorization: `Bearer ${apiKey}`,\n\t\t\t\"Content-Type\": \"application/json\",\n\t\t},\n\t});\n\n\tconst text = await response.text();\n\tlet data: unknown = null;\n\n\tif (text) {\n\t\ttry {\n\t\t\tdata = JSON.parse(text);\n\t\t} catch {\n\t\t\tdata = text;\n\t\t}\n\t}\n\n\t// Return the structure expected by Orval v8: { data, status, headers }\n\treturn {\n\t\tdata,\n\t\tstatus: response.status,\n\t\theaders: response.headers,\n\t} as T;\n}\n","/**\n * Generated by orval v8.0.2 🍺\n * Do not edit manually.\n * PSPM API\n * Backend API for PSPM - Private Skill Package Manager for Claude Code\n * OpenAPI spec version: 1.0.0\n */\nimport { customFetch } from '../../fetchers/cli-fetcher';\n/**\n * API key record (without the key value)\n */\nexport interface ApiKey {\n id: string;\n name: string;\n keyPrefix: string;\n userId: string;\n expiresAt: string | null;\n lastUsedAt: string | null;\n createdAt: string | null;\n}\n\nexport type ApiKeyListResponse = ApiKey[];\n\nexport type Item = {\n path: (string | number)[];\n message: string;\n};\n\nexport type ApiErrorCode = typeof ApiErrorCode[keyof typeof ApiErrorCode];\n\n\nexport const ApiErrorCode = {\n BAD_REQUEST: 'BAD_REQUEST',\n UNAUTHORIZED: 'UNAUTHORIZED',\n FORBIDDEN: 'FORBIDDEN',\n NOT_FOUND: 'NOT_FOUND',\n CONFLICT: 'CONFLICT',\n VALIDATION_ERROR: 'VALIDATION_ERROR',\n INTERNAL_ERROR: 'INTERNAL_ERROR',\n} as const;\n\nexport type ApiErrorDetails = {[key: string]: unknown | null};\n\nexport interface ApiError {\n code: ApiErrorCode;\n message: string;\n details?: ApiErrorDetails;\n requestId?: string;\n timestamp: string;\n}\n\nexport type ValidationError = ApiError & {\n code?: 'VALIDATION_ERROR';\n details: {\n issues: Item[];\n};\n};\n\n/**\n * Created API key with the plain key (only shown once)\n */\nexport interface CreateApiKeyResponse {\n apiKey: ApiKey;\n plainKey: string;\n}\n\n/**\n * Input for creating a new API key\n */\nexport interface CreateApiKeyInput {\n /**\n * @minLength 1\n * @maxLength 100\n */\n name: string;\n expiresAt?: string | null;\n}\n\nexport interface SuccessResponse {\n success: boolean;\n}\n\nexport interface DeleteApiKeyInput {\n id: string;\n}\n\nexport interface UpdateApiKeyInput {\n id: string;\n /**\n * @minLength 1\n * @maxLength 100\n */\n name: string;\n}\n\nexport interface CreateCliTokenResponse {\n token: string;\n}\n\nexport interface CreateCliTokenInput {\n /** @minLength 1 */\n state: string;\n /** @minLength 1 */\n port: string;\n}\n\nexport interface ExchangeCliTokenResponse {\n apiKey: string;\n username: string;\n}\n\nexport interface ExchangeCliTokenInput {\n /** @minLength 1 */\n token: string;\n}\n\n/**\n * User's username information\n */\nexport interface UsernameInfo {\n username: string | null;\n canChange: boolean;\n usernameChangedAt: string | null;\n}\n\nexport interface CheckUsernameOutput {\n available: boolean;\n error: string | null;\n}\n\nexport interface UpdateUsernameOutput {\n success: boolean;\n username: string | null;\n error: string | null;\n}\n\nexport interface UpdateUsernameInput {\n /**\n * @minLength 3\n * @maxLength 39\n */\n username: string;\n}\n\nexport interface GetSuggestionsOutput {\n suggestions: string[];\n}\n\n/**\n * Current user info\n */\nexport type MeResponseData = {\n userId: string;\n username: string;\n} | null\n\n/**\n * Skill metadata\n */\nexport interface Skill {\n id: string;\n name: string;\n userId: string;\n description: string | null;\n createdAt: string | null;\n updatedAt: string | null;\n}\n\n/**\n * Skill metadata with owner username\n */\nexport type SkillWithUser = Skill & {\n username: string;\n};\n\n/**\n * List of skills\n */\nexport type SkillListResponse = SkillWithUser[];\n\n/**\n * User's username\n * @minLength 1\n * @maxLength 50\n * @pattern ^[a-zA-Z0-9_-]+$\n */\nexport type Username = string;\n\n/**\n * Skill name identifier\n * @minLength 1\n * @maxLength 100\n * @pattern ^[a-z][a-z0-9-]*$\n */\nexport type SkillName = string;\n\n/**\n * Semantic version string (e.g., 1.0.0)\n */\nexport type Semver = string;\n\nexport type PspmMetadataType = typeof PspmMetadataType[keyof typeof PspmMetadataType];\n\n\nexport const PspmMetadataType = {\n skill: 'skill',\n} as const;\n\nexport type PspmMetadataRequirements = {\n claude?: string;\n node?: string;\n};\n\n/**\n * PSPM-specific metadata for the skill package\n */\nexport interface PspmMetadata {\n type: PspmMetadataType;\n capabilities?: string[];\n requirements?: PspmMetadataRequirements;\n}\n\n/**\n * Skill package manifest (package.json)\n */\nexport interface SkillManifest {\n name: SkillName;\n version: Semver;\n /** @maxLength 500 */\n description?: string;\n files?: string[];\n pspm?: PspmMetadata;\n}\n\n/**\n * Skill version metadata\n */\nexport interface SkillVersion {\n id: string;\n skillId: string;\n version: string;\n r2Key: string;\n checksum: string;\n manifest: SkillManifest;\n publishedAt: string | null;\n}\n\n/**\n * Skill version metadata with download URL\n */\nexport type SkillVersionWithDownload = SkillVersion & {\n downloadUrl: string;\n} | null;\n\n/**\n * Published skill with version info\n */\nexport interface PublishSkillResponse {\n skill: SkillWithUser;\n version: SkillVersion;\n}\n\n/**\n * Input for publishing a skill\n */\nexport interface PublishSkillInput {\n manifest: SkillManifest;\n /** @maxLength 73400320 */\n tarballBase64: string;\n}\n\nexport type CapturedErrorSource = typeof CapturedErrorSource[keyof typeof CapturedErrorSource];\n\n\nexport const CapturedErrorSource = {\n hydration: 'hydration',\n loader: 'loader',\n action: 'action',\n render: 'render',\n streaming: 'streaming',\n network: 'network',\n global: 'global',\n unknown: 'unknown',\n} as const;\n\nexport type CapturedErrorSeverity = typeof CapturedErrorSeverity[keyof typeof CapturedErrorSeverity];\n\n\nexport const CapturedErrorSeverity = {\n fatal: 'fatal',\n error: 'error',\n warning: 'warning',\n info: 'info',\n} as const;\n\nexport type CapturedErrorContext = {[key: string]: unknown | null};\n\n/**\n * A captured client error\n */\nexport interface CapturedError {\n id: string;\n message: string;\n stack?: string;\n componentStack?: string;\n source: CapturedErrorSource;\n severity: CapturedErrorSeverity;\n route?: string;\n timestamp: number;\n context?: CapturedErrorContext;\n digest?: string;\n}\n\n/**\n * Payload for reporting client errors\n */\nexport interface ErrorReportPayload {\n errors: CapturedError[];\n userAgent: string;\n url: string;\n timestamp: number;\n}\n\nexport type CheckUsernameAvailabilityParams = {\n/**\n * @minLength 3\n * @maxLength 39\n */\nusername: string;\n};\n\n/**\n * Retrieve all API keys for the authenticated user\n * @summary List all API keys\n */\nexport type listApiKeysResponse200 = {\n data: ApiKeyListResponse\n status: 200\n}\n\nexport type listApiKeysResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type listApiKeysResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type listApiKeysResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type listApiKeysResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type listApiKeysResponse500 = {\n data: ApiError\n status: 500\n}\n \nexport type listApiKeysResponseSuccess = (listApiKeysResponse200) & {\n headers: Headers;\n};\nexport type listApiKeysResponseError = (listApiKeysResponse400 | listApiKeysResponse401 | listApiKeysResponse403 | listApiKeysResponse404 | listApiKeysResponse500) & {\n headers: Headers;\n};\n\nexport type listApiKeysResponse = (listApiKeysResponseSuccess | listApiKeysResponseError)\n\nexport const getListApiKeysUrl = () => {\n\n\n \n\n return `/api/api-keys/api-keys`\n}\n\nexport const listApiKeys = async ( options?: RequestInit): Promise<listApiKeysResponse> => {\n \n return customFetch<listApiKeysResponse>(getListApiKeysUrl(),\n { \n ...options,\n method: 'GET'\n \n \n }\n);}\n\n\n\n/**\n * Create a new API key with optional expiration\n * @summary Create a new API key\n */\nexport type createApiKeyResponse200 = {\n data: CreateApiKeyResponse\n status: 200\n}\n\nexport type createApiKeyResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type createApiKeyResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type createApiKeyResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type createApiKeyResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type createApiKeyResponse500 = {\n data: ApiError\n status: 500\n}\n \nexport type createApiKeyResponseSuccess = (createApiKeyResponse200) & {\n headers: Headers;\n};\nexport type createApiKeyResponseError = (createApiKeyResponse400 | createApiKeyResponse401 | createApiKeyResponse403 | createApiKeyResponse404 | createApiKeyResponse500) & {\n headers: Headers;\n};\n\nexport type createApiKeyResponse = (createApiKeyResponseSuccess | createApiKeyResponseError)\n\nexport const getCreateApiKeyUrl = () => {\n\n\n \n\n return `/api/api-keys/api-keys`\n}\n\nexport const createApiKey = async (createApiKeyInput: CreateApiKeyInput, options?: RequestInit): Promise<createApiKeyResponse> => {\n \n return customFetch<createApiKeyResponse>(getCreateApiKeyUrl(),\n { \n ...options,\n method: 'POST',\n headers: { 'Content-Type': 'application/json', ...options?.headers },\n body: JSON.stringify(\n createApiKeyInput,)\n }\n);}\n\n\n\n/**\n * Revoke and delete an API key\n * @summary Delete an API key\n */\nexport type deleteApiKeyResponse200 = {\n data: SuccessResponse\n status: 200\n}\n\nexport type deleteApiKeyResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type deleteApiKeyResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type deleteApiKeyResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type deleteApiKeyResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type deleteApiKeyResponse500 = {\n data: ApiError\n status: 500\n}\n \nexport type deleteApiKeyResponseSuccess = (deleteApiKeyResponse200) & {\n headers: Headers;\n};\nexport type deleteApiKeyResponseError = (deleteApiKeyResponse400 | deleteApiKeyResponse401 | deleteApiKeyResponse403 | deleteApiKeyResponse404 | deleteApiKeyResponse500) & {\n headers: Headers;\n};\n\nexport type deleteApiKeyResponse = (deleteApiKeyResponseSuccess | deleteApiKeyResponseError)\n\nexport const getDeleteApiKeyUrl = () => {\n\n\n \n\n return `/api/api-keys/api-keys`\n}\n\nexport const deleteApiKey = async (deleteApiKeyInput: DeleteApiKeyInput, options?: RequestInit): Promise<deleteApiKeyResponse> => {\n \n return customFetch<deleteApiKeyResponse>(getDeleteApiKeyUrl(),\n { \n ...options,\n method: 'DELETE',\n headers: { 'Content-Type': 'application/json', ...options?.headers },\n body: JSON.stringify(\n deleteApiKeyInput,)\n }\n);}\n\n\n\n/**\n * Update the name/description of an API key\n * @summary Update API key name\n */\nexport type updateApiKeyNameResponse200 = {\n data: ApiKey\n status: 200\n}\n\nexport type updateApiKeyNameResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type updateApiKeyNameResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type updateApiKeyNameResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type updateApiKeyNameResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type updateApiKeyNameResponse500 = {\n data: ApiError\n status: 500\n}\n \nexport type updateApiKeyNameResponseSuccess = (updateApiKeyNameResponse200) & {\n headers: Headers;\n};\nexport type updateApiKeyNameResponseError = (updateApiKeyNameResponse400 | updateApiKeyNameResponse401 | updateApiKeyNameResponse403 | updateApiKeyNameResponse404 | updateApiKeyNameResponse500) & {\n headers: Headers;\n};\n\nexport type updateApiKeyNameResponse = (updateApiKeyNameResponseSuccess | updateApiKeyNameResponseError)\n\nexport const getUpdateApiKeyNameUrl = () => {\n\n\n \n\n return `/api/api-keys/api-keys`\n}\n\nexport const updateApiKeyName = async (updateApiKeyInput: UpdateApiKeyInput, options?: RequestInit): Promise<updateApiKeyNameResponse> => {\n \n return customFetch<updateApiKeyNameResponse>(getUpdateApiKeyNameUrl(),\n { \n ...options,\n method: 'PUT',\n headers: { 'Content-Type': 'application/json', ...options?.headers },\n body: JSON.stringify(\n updateApiKeyInput,)\n }\n);}\n\n\n\n/**\n * Create a short-lived token for CLI browser-based authentication\n * @summary Create a CLI login token\n */\nexport type createCliTokenResponse200 = {\n data: CreateCliTokenResponse\n status: 200\n}\n\nexport type createCliTokenResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type createCliTokenResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type createCliTokenResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type createCliTokenResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type createCliTokenResponse500 = {\n data: ApiError\n status: 500\n}\n \nexport type createCliTokenResponseSuccess = (createCliTokenResponse200) & {\n headers: Headers;\n};\nexport type createCliTokenResponseError = (createCliTokenResponse400 | createCliTokenResponse401 | createCliTokenResponse403 | createCliTokenResponse404 | createCliTokenResponse500) & {\n headers: Headers;\n};\n\nexport type createCliTokenResponse = (createCliTokenResponseSuccess | createCliTokenResponseError)\n\nexport const getCreateCliTokenUrl = () => {\n\n\n \n\n return `/api/api-keys/cli-token`\n}\n\nexport const createCliToken = async (createCliTokenInput: CreateCliTokenInput, options?: RequestInit): Promise<createCliTokenResponse> => {\n \n return customFetch<createCliTokenResponse>(getCreateCliTokenUrl(),\n { \n ...options,\n method: 'POST',\n headers: { 'Content-Type': 'application/json', ...options?.headers },\n body: JSON.stringify(\n createCliTokenInput,)\n }\n);}\n\n\n\n/**\n * Exchange a CLI login token for an API key (called by CLI after browser redirect)\n * @summary Exchange CLI token for API key\n */\nexport type exchangeCliTokenResponse200 = {\n data: ExchangeCliTokenResponse\n status: 200\n}\n\nexport type exchangeCliTokenResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type exchangeCliTokenResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type exchangeCliTokenResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type exchangeCliTokenResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type exchangeCliTokenResponse500 = {\n data: ApiError\n status: 500\n}\n \nexport type exchangeCliTokenResponseSuccess = (exchangeCliTokenResponse200) & {\n headers: Headers;\n};\nexport type exchangeCliTokenResponseError = (exchangeCliTokenResponse400 | exchangeCliTokenResponse401 | exchangeCliTokenResponse403 | exchangeCliTokenResponse404 | exchangeCliTokenResponse500) & {\n headers: Headers;\n};\n\nexport type exchangeCliTokenResponse = (exchangeCliTokenResponseSuccess | exchangeCliTokenResponseError)\n\nexport const getExchangeCliTokenUrl = () => {\n\n\n \n\n return `/api/api-keys/cli-token-exchange`\n}\n\nexport const exchangeCliToken = async (exchangeCliTokenInput: ExchangeCliTokenInput, options?: RequestInit): Promise<exchangeCliTokenResponse> => {\n \n return customFetch<exchangeCliTokenResponse>(getExchangeCliTokenUrl(),\n { \n ...options,\n method: 'POST',\n headers: { 'Content-Type': 'application/json', ...options?.headers },\n body: JSON.stringify(\n exchangeCliTokenInput,)\n }\n);}\n\n\n\n/**\n * Get current user's username and whether they can change it\n * @summary Get username info\n */\nexport type getUsernameInfoResponse200 = {\n data: UsernameInfo\n status: 200\n}\n\nexport type getUsernameInfoResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type getUsernameInfoResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type getUsernameInfoResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type getUsernameInfoResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type getUsernameInfoResponse500 = {\n data: ApiError\n status: 500\n}\n \nexport type getUsernameInfoResponseSuccess = (getUsernameInfoResponse200) & {\n headers: Headers;\n};\nexport type getUsernameInfoResponseError = (getUsernameInfoResponse400 | getUsernameInfoResponse401 | getUsernameInfoResponse403 | getUsernameInfoResponse404 | getUsernameInfoResponse500) & {\n headers: Headers;\n};\n\nexport type getUsernameInfoResponse = (getUsernameInfoResponseSuccess | getUsernameInfoResponseError)\n\nexport const getGetUsernameInfoUrl = () => {\n\n\n \n\n return `/api/auth/username`\n}\n\nexport const getUsernameInfo = async ( options?: RequestInit): Promise<getUsernameInfoResponse> => {\n \n return customFetch<getUsernameInfoResponse>(getGetUsernameInfoUrl(),\n { \n ...options,\n method: 'GET'\n \n \n }\n);}\n\n\n\n/**\n * Update the current user's username. Can only be done once.\n * @summary Update username\n */\nexport type updateUsernameResponse200 = {\n data: UpdateUsernameOutput\n status: 200\n}\n\nexport type updateUsernameResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type updateUsernameResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type updateUsernameResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type updateUsernameResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type updateUsernameResponse500 = {\n data: ApiError\n status: 500\n}\n \nexport type updateUsernameResponseSuccess = (updateUsernameResponse200) & {\n headers: Headers;\n};\nexport type updateUsernameResponseError = (updateUsernameResponse400 | updateUsernameResponse401 | updateUsernameResponse403 | updateUsernameResponse404 | updateUsernameResponse500) & {\n headers: Headers;\n};\n\nexport type updateUsernameResponse = (updateUsernameResponseSuccess | updateUsernameResponseError)\n\nexport const getUpdateUsernameUrl = () => {\n\n\n \n\n return `/api/auth/username`\n}\n\nexport const updateUsername = async (updateUsernameInput: UpdateUsernameInput, options?: RequestInit): Promise<updateUsernameResponse> => {\n \n return customFetch<updateUsernameResponse>(getUpdateUsernameUrl(),\n { \n ...options,\n method: 'PUT',\n headers: { 'Content-Type': 'application/json', ...options?.headers },\n body: JSON.stringify(\n updateUsernameInput,)\n }\n);}\n\n\n\n/**\n * Check if a username is available for use\n * @summary Check username availability\n */\nexport type checkUsernameAvailabilityResponse200 = {\n data: CheckUsernameOutput\n status: 200\n}\n\nexport type checkUsernameAvailabilityResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type checkUsernameAvailabilityResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type checkUsernameAvailabilityResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type checkUsernameAvailabilityResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type checkUsernameAvailabilityResponse500 = {\n data: ApiError\n status: 500\n}\n \nexport type checkUsernameAvailabilityResponseSuccess = (checkUsernameAvailabilityResponse200) & {\n headers: Headers;\n};\nexport type checkUsernameAvailabilityResponseError = (checkUsernameAvailabilityResponse400 | checkUsernameAvailabilityResponse401 | checkUsernameAvailabilityResponse403 | checkUsernameAvailabilityResponse404 | checkUsernameAvailabilityResponse500) & {\n headers: Headers;\n};\n\nexport type checkUsernameAvailabilityResponse = (checkUsernameAvailabilityResponseSuccess | checkUsernameAvailabilityResponseError)\n\nexport const getCheckUsernameAvailabilityUrl = (params: CheckUsernameAvailabilityParams,) => {\n const normalizedParams = new URLSearchParams();\n\n Object.entries(params || {}).forEach(([key, value]) => {\n \n if (value !== undefined) {\n normalizedParams.append(key, value === null ? 'null' : value.toString())\n }\n });\n\n const stringifiedParams = normalizedParams.toString();\n\n return stringifiedParams.length > 0 ? `/api/auth/username/check?${stringifiedParams}` : `/api/auth/username/check`\n}\n\nexport const checkUsernameAvailability = async (params: CheckUsernameAvailabilityParams, options?: RequestInit): Promise<checkUsernameAvailabilityResponse> => {\n \n return customFetch<checkUsernameAvailabilityResponse>(getCheckUsernameAvailabilityUrl(params),\n { \n ...options,\n method: 'GET'\n \n \n }\n);}\n\n\n\n/**\n * Get available username suggestions based on user's email and name\n * @summary Get username suggestions\n */\nexport type getUsernameSuggestionsResponse200 = {\n data: GetSuggestionsOutput\n status: 200\n}\n\nexport type getUsernameSuggestionsResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type getUsernameSuggestionsResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type getUsernameSuggestionsResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type getUsernameSuggestionsResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type getUsernameSuggestionsResponse500 = {\n data: ApiError\n status: 500\n}\n \nexport type getUsernameSuggestionsResponseSuccess = (getUsernameSuggestionsResponse200) & {\n headers: Headers;\n};\nexport type getUsernameSuggestionsResponseError = (getUsernameSuggestionsResponse400 | getUsernameSuggestionsResponse401 | getUsernameSuggestionsResponse403 | getUsernameSuggestionsResponse404 | getUsernameSuggestionsResponse500) & {\n headers: Headers;\n};\n\nexport type getUsernameSuggestionsResponse = (getUsernameSuggestionsResponseSuccess | getUsernameSuggestionsResponseError)\n\nexport const getGetUsernameSuggestionsUrl = () => {\n\n\n \n\n return `/api/auth/username/suggestions`\n}\n\nexport const getUsernameSuggestions = async ( options?: RequestInit): Promise<getUsernameSuggestionsResponse> => {\n \n return customFetch<getUsernameSuggestionsResponse>(getGetUsernameSuggestionsUrl(),\n { \n ...options,\n method: 'GET'\n \n \n }\n);}\n\n\n\n/**\n * Get the current authenticated user's info\n * @summary Get current user\n */\nexport type meResponse200 = {\n data: MeResponseData | null\n status: 200\n}\n\nexport type meResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type meResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type meResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type meResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type meResponse500 = {\n data: ApiError\n status: 500\n}\n \nexport type meResponseSuccess = (meResponse200) & {\n headers: Headers;\n};\nexport type meResponseError = (meResponse400 | meResponse401 | meResponse403 | meResponse404 | meResponse500) & {\n headers: Headers;\n};\n\nexport type meResponse = (meResponseSuccess | meResponseError)\n\nexport const getMeUrl = () => {\n\n\n \n\n return `/api/skills/me`\n}\n\nexport const me = async ( options?: RequestInit): Promise<meResponse> => {\n \n return customFetch<meResponse>(getMeUrl(),\n { \n ...options,\n method: 'GET'\n \n \n }\n);}\n\n\n\n/**\n * List all skills owned by the authenticated user\n * @summary List my skills\n */\nexport type listMySkillsResponse200 = {\n data: SkillListResponse\n status: 200\n}\n\nexport type listMySkillsResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type listMySkillsResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type listMySkillsResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type listMySkillsResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type listMySkillsResponse500 = {\n data: ApiError\n status: 500\n}\n \nexport type listMySkillsResponseSuccess = (listMySkillsResponse200) & {\n headers: Headers;\n};\nexport type listMySkillsResponseError = (listMySkillsResponse400 | listMySkillsResponse401 | listMySkillsResponse403 | listMySkillsResponse404 | listMySkillsResponse500) & {\n headers: Headers;\n};\n\nexport type listMySkillsResponse = (listMySkillsResponseSuccess | listMySkillsResponseError)\n\nexport const getListMySkillsUrl = () => {\n\n\n \n\n return `/api/skills`\n}\n\nexport const listMySkills = async ( options?: RequestInit): Promise<listMySkillsResponse> => {\n \n return customFetch<listMySkillsResponse>(getListMySkillsUrl(),\n { \n ...options,\n method: 'GET'\n \n \n }\n);}\n\n\n\n/**\n * List all skills for a specific user\n * @summary List user skills\n */\nexport type listUserSkillsResponse200 = {\n data: SkillListResponse\n status: 200\n}\n\nexport type listUserSkillsResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type listUserSkillsResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type listUserSkillsResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type listUserSkillsResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type listUserSkillsResponse500 = {\n data: ApiError\n status: 500\n}\n \nexport type listUserSkillsResponseSuccess = (listUserSkillsResponse200) & {\n headers: Headers;\n};\nexport type listUserSkillsResponseError = (listUserSkillsResponse400 | listUserSkillsResponse401 | listUserSkillsResponse403 | listUserSkillsResponse404 | listUserSkillsResponse500) & {\n headers: Headers;\n};\n\nexport type listUserSkillsResponse = (listUserSkillsResponseSuccess | listUserSkillsResponseError)\n\nexport const getListUserSkillsUrl = (username: Username,) => {\n\n\n \n\n return `/api/skills/@user/${username}`\n}\n\nexport const listUserSkills = async (username: Username, options?: RequestInit): Promise<listUserSkillsResponse> => {\n \n return customFetch<listUserSkillsResponse>(getListUserSkillsUrl(username),\n { \n ...options,\n method: 'GET'\n \n \n }\n);}\n\n\n\n/**\n * Get a specific skill by username and name\n * @summary Get skill\n */\nexport type getSkillResponse200 = {\n data: SkillWithUser\n status: 200\n}\n\nexport type getSkillResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type getSkillResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type getSkillResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type getSkillResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type getSkillResponse500 = {\n data: ApiError\n status: 500\n}\n \nexport type getSkillResponseSuccess = (getSkillResponse200) & {\n headers: Headers;\n};\nexport type getSkillResponseError = (getSkillResponse400 | getSkillResponse401 | getSkillResponse403 | getSkillResponse404 | getSkillResponse500) & {\n headers: Headers;\n};\n\nexport type getSkillResponse = (getSkillResponseSuccess | getSkillResponseError)\n\nexport const getGetSkillUrl = (username: Username,\n name: SkillName,) => {\n\n\n \n\n return `/api/skills/@user/${username}/${name}`\n}\n\nexport const getSkill = async (username: Username,\n name: SkillName, options?: RequestInit): Promise<getSkillResponse> => {\n \n return customFetch<getSkillResponse>(getGetSkillUrl(username,name),\n { \n ...options,\n method: 'GET'\n \n \n }\n);}\n\n\n\n/**\n * List all versions for a specific skill\n * @summary List skill versions\n */\nexport type listSkillVersionsResponse200 = {\n data: SkillVersion[]\n status: 200\n}\n\nexport type listSkillVersionsResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type listSkillVersionsResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type listSkillVersionsResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type listSkillVersionsResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type listSkillVersionsResponse500 = {\n data: ApiError\n status: 500\n}\n \nexport type listSkillVersionsResponseSuccess = (listSkillVersionsResponse200) & {\n headers: Headers;\n};\nexport type listSkillVersionsResponseError = (listSkillVersionsResponse400 | listSkillVersionsResponse401 | listSkillVersionsResponse403 | listSkillVersionsResponse404 | listSkillVersionsResponse500) & {\n headers: Headers;\n};\n\nexport type listSkillVersionsResponse = (listSkillVersionsResponseSuccess | listSkillVersionsResponseError)\n\nexport const getListSkillVersionsUrl = (username: Username,\n name: SkillName,) => {\n\n\n \n\n return `/api/skills/@user/${username}/${name}/versions`\n}\n\nexport const listSkillVersions = async (username: Username,\n name: SkillName, options?: RequestInit): Promise<listSkillVersionsResponse> => {\n \n return customFetch<listSkillVersionsResponse>(getListSkillVersionsUrl(username,name),\n { \n ...options,\n method: 'GET'\n \n \n }\n);}\n\n\n\n/**\n * Get metadata for a specific skill version\n * @summary Get skill version\n */\nexport type getSkillVersionResponse200 = {\n data: SkillVersionWithDownload\n status: 200\n}\n\nexport type getSkillVersionResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type getSkillVersionResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type getSkillVersionResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type getSkillVersionResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type getSkillVersionResponse500 = {\n data: ApiError\n status: 500\n}\n \nexport type getSkillVersionResponseSuccess = (getSkillVersionResponse200) & {\n headers: Headers;\n};\nexport type getSkillVersionResponseError = (getSkillVersionResponse400 | getSkillVersionResponse401 | getSkillVersionResponse403 | getSkillVersionResponse404 | getSkillVersionResponse500) & {\n headers: Headers;\n};\n\nexport type getSkillVersionResponse = (getSkillVersionResponseSuccess | getSkillVersionResponseError)\n\nexport const getGetSkillVersionUrl = (username: Username,\n name: SkillName,\n version: Semver,) => {\n\n\n \n\n return `/api/skills/@user/${username}/${name}/${version}`\n}\n\nexport const getSkillVersion = async (username: Username,\n name: SkillName,\n version: Semver, options?: RequestInit): Promise<getSkillVersionResponse> => {\n \n return customFetch<getSkillVersionResponse>(getGetSkillVersionUrl(username,name,version),\n { \n ...options,\n method: 'GET'\n \n \n }\n);}\n\n\n\n/**\n * Publish a new skill or a new version of an existing skill\n * @summary Publish skill\n */\nexport type publishSkillResponse200 = {\n data: PublishSkillResponse\n status: 200\n}\n\nexport type publishSkillResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type publishSkillResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type publishSkillResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type publishSkillResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type publishSkillResponse500 = {\n data: ApiError\n status: 500\n}\n \nexport type publishSkillResponseSuccess = (publishSkillResponse200) & {\n headers: Headers;\n};\nexport type publishSkillResponseError = (publishSkillResponse400 | publishSkillResponse401 | publishSkillResponse403 | publishSkillResponse404 | publishSkillResponse500) & {\n headers: Headers;\n};\n\nexport type publishSkillResponse = (publishSkillResponseSuccess | publishSkillResponseError)\n\nexport const getPublishSkillUrl = () => {\n\n\n \n\n return `/api/skills/publish`\n}\n\nexport const publishSkill = async (publishSkillInput: PublishSkillInput, options?: RequestInit): Promise<publishSkillResponse> => {\n \n return customFetch<publishSkillResponse>(getPublishSkillUrl(),\n { \n ...options,\n method: 'POST',\n headers: { 'Content-Type': 'application/json', ...options?.headers },\n body: JSON.stringify(\n publishSkillInput,)\n }\n);}\n\n\n\n/**\n * Delete a skill and all its versions (owner only)\n * @summary Delete skill\n */\nexport type deleteSkillResponse200 = {\n data: SuccessResponse & unknown\n status: 200\n}\n\nexport type deleteSkillResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type deleteSkillResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type deleteSkillResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type deleteSkillResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type deleteSkillResponse500 = {\n data: ApiError\n status: 500\n}\n \nexport type deleteSkillResponseSuccess = (deleteSkillResponse200) & {\n headers: Headers;\n};\nexport type deleteSkillResponseError = (deleteSkillResponse400 | deleteSkillResponse401 | deleteSkillResponse403 | deleteSkillResponse404 | deleteSkillResponse500) & {\n headers: Headers;\n};\n\nexport type deleteSkillResponse = (deleteSkillResponseSuccess | deleteSkillResponseError)\n\nexport const getDeleteSkillUrl = (name: SkillName,) => {\n\n\n \n\n return `/api/skills/${name}`\n}\n\nexport const deleteSkill = async (name: SkillName, options?: RequestInit): Promise<deleteSkillResponse> => {\n \n return customFetch<deleteSkillResponse>(getDeleteSkillUrl(name),\n { \n ...options,\n method: 'DELETE'\n \n \n }\n);}\n\n\n\n/**\n * Delete a specific version of a skill (owner only)\n * @summary Delete skill version\n */\nexport type deleteSkillVersionResponse200 = {\n data: SuccessResponse & unknown\n status: 200\n}\n\nexport type deleteSkillVersionResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type deleteSkillVersionResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type deleteSkillVersionResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type deleteSkillVersionResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type deleteSkillVersionResponse500 = {\n data: ApiError\n status: 500\n}\n \nexport type deleteSkillVersionResponseSuccess = (deleteSkillVersionResponse200) & {\n headers: Headers;\n};\nexport type deleteSkillVersionResponseError = (deleteSkillVersionResponse400 | deleteSkillVersionResponse401 | deleteSkillVersionResponse403 | deleteSkillVersionResponse404 | deleteSkillVersionResponse500) & {\n headers: Headers;\n};\n\nexport type deleteSkillVersionResponse = (deleteSkillVersionResponseSuccess | deleteSkillVersionResponseError)\n\nexport const getDeleteSkillVersionUrl = (name: SkillName,\n version: Semver,) => {\n\n\n \n\n return `/api/skills/${name}/${version}`\n}\n\nexport const deleteSkillVersion = async (name: SkillName,\n version: Semver, options?: RequestInit): Promise<deleteSkillVersionResponse> => {\n \n return customFetch<deleteSkillVersionResponse>(getDeleteSkillVersionUrl(name,version),\n { \n ...options,\n method: 'DELETE'\n \n \n }\n);}\n\n\n\n/**\n * Submit client-side errors for logging and monitoring. Used by the frontend error capture service.\n * @summary Report client errors\n */\nexport type reportErrorsResponse200 = {\n data: SuccessResponse\n status: 200\n}\n\nexport type reportErrorsResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type reportErrorsResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type reportErrorsResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type reportErrorsResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type reportErrorsResponse500 = {\n data: ApiError\n status: 500\n}\n \nexport type reportErrorsResponseSuccess = (reportErrorsResponse200) & {\n headers: Headers;\n};\nexport type reportErrorsResponseError = (reportErrorsResponse400 | reportErrorsResponse401 | reportErrorsResponse403 | reportErrorsResponse404 | reportErrorsResponse500) & {\n headers: Headers;\n};\n\nexport type reportErrorsResponse = (reportErrorsResponseSuccess | reportErrorsResponseError)\n\nexport const getReportErrorsUrl = () => {\n\n\n \n\n return `/errors/report`\n}\n\nexport const reportErrors = async (errorReportPayload: ErrorReportPayload, options?: RequestInit): Promise<reportErrorsResponse> => {\n \n return customFetch<reportErrorsResponse>(getReportErrorsUrl(),\n { \n ...options,\n method: 'POST',\n headers: { 'Content-Type': 'application/json', ...options?.headers },\n body: JSON.stringify(\n errorReportPayload,)\n }\n);}\n","/**\n * API Client for PSPM CLI\n *\n * This module re-exports the SDK functions and provides the\n * initialization logic for the CLI.\n */\n\nimport {\n\tdeleteSkill,\n\tdeleteSkillVersion,\n\texchangeCliToken,\n\tgetConfig,\n\tgetSkill,\n\tgetSkillVersion,\n\tisConfigured,\n\tlistMySkills,\n\tlistSkillVersions,\n\tlistUserSkills,\n\tme,\n\tpublishSkill,\n\ttype SDKConfig,\n\tSDKError,\n\tconfigure as sdkConfigure,\n} from \"@repo/sdk\";\n\n/**\n * Convert a registry URL to the base server URL for the SDK.\n *\n * The CLI stores registry URLs like \"https://pspm.dev\". This function\n * normalizes the URL by removing any trailing /api/skills path if present\n * (for backwards compatibility with older configs).\n */\nfunction registryUrlToBaseUrl(registryUrl: string): string {\n\treturn registryUrl.replace(/\\/api\\/skills\\/?$/, \"\");\n}\n\n/**\n * Configure the SDK with registry URL and API key.\n *\n * This wrapper handles converting the CLI's registry URL format to the\n * base URL format expected by the SDK.\n */\nexport function configure(options: {\n\tregistryUrl: string;\n\tapiKey: string;\n}): void {\n\tconst baseUrl = registryUrlToBaseUrl(options.registryUrl);\n\tsdkConfigure({ baseUrl, apiKey: options.apiKey });\n}\n\n// Re-export SDK functions for convenience\nexport {\n\tdeleteSkill,\n\tdeleteSkillVersion,\n\texchangeCliToken,\n\tgetConfig,\n\tgetSkill,\n\tgetSkillVersion,\n\tisConfigured,\n\tlistMySkills,\n\tlistSkillVersions,\n\tlistUserSkills,\n\tme,\n\tpublishSkill,\n\tSDKError,\n};\n\n// Re-export types\nexport type { SDKConfig };\n\n/**\n * Get user info from the API using the /me endpoint.\n * Returns null if not authenticated.\n */\nexport async function whoamiRequest(\n\tregistryUrl: string,\n\tapiKey: string,\n): Promise<{ username: string; userId: string } | null> {\n\ttry {\n\t\t// Use direct REST endpoints (not oRPC /rpc prefix)\n\t\tconfigure({ registryUrl, apiKey });\n\t\tconst response = await me();\n\t\t// Check for successful response before accessing user data\n\t\tif (response.status !== 200 || !response.data) {\n\t\t\treturn null;\n\t\t}\n\t\tconst user = response.data;\n\t\treturn {\n\t\t\tusername: user.username,\n\t\t\tuserId: user.userId,\n\t\t};\n\t} catch {\n\t\treturn null;\n\t}\n}\n","/**\n * Base error class for PSPM configuration errors\n */\nexport class ConfigError extends Error {\n\tconstructor(message: string) {\n\t\tsuper(message);\n\t\tthis.name = \"ConfigError\";\n\t}\n}\n\n/**\n * Error thrown when the user is not logged in\n */\nexport class NotLoggedInError extends ConfigError {\n\tconstructor() {\n\t\tsuper(\n\t\t\t\"Not logged in. Run 'pspm login --api-key <key>' first, or set PSPM_API_KEY env var.\",\n\t\t);\n\t\tthis.name = \"NotLoggedInError\";\n\t}\n}\n\n/**\n * API error response structure from OpenAPI spec\n */\ninterface ApiErrorResponse {\n\tcode?: string;\n\tmessage?: string;\n\tdetails?:\n\t\t| {\n\t\t\t\tissues?: Array<{ path?: Array<string | number>; message?: string }>;\n\t\t }\n\t\t| Record<string, unknown>;\n\trequestId?: string;\n\ttimestamp?: string;\n}\n\n/**\n * Extract a human-readable error message from an API response\n * Handles both ApiError and ValidationError types\n */\nexport function extractApiErrorMessage(\n\tresponse: { status: number; data: unknown },\n\tfallbackMessage: string,\n): string {\n\tconst errorData = response.data as ApiErrorResponse | null;\n\n\tif (process.env.PSPM_DEBUG) {\n\t\tconsole.log(`[debug] API response status: ${response.status}`);\n\t\tconsole.log(\n\t\t\t`[debug] API response data:`,\n\t\t\tJSON.stringify(errorData, null, 2),\n\t\t);\n\t}\n\n\tif (!errorData) {\n\t\treturn `${fallbackMessage} (HTTP ${response.status})`;\n\t}\n\n\t// Start with the message field or fallback\n\tlet errorMessage = errorData.message || fallbackMessage;\n\n\t// For validation errors, format the issues\n\tif (errorData.code === \"VALIDATION_ERROR\" && errorData.details) {\n\t\tconst issues = (\n\t\t\terrorData.details as {\n\t\t\t\tissues?: Array<{ path?: Array<string | number>; message?: string }>;\n\t\t\t}\n\t\t).issues;\n\t\tif (issues && Array.isArray(issues)) {\n\t\t\tconst issueMessages = issues\n\t\t\t\t.map((issue) => {\n\t\t\t\t\tconst path = issue.path?.join(\".\") || \"input\";\n\t\t\t\t\tconst msg = issue.message || \"invalid value\";\n\t\t\t\t\treturn ` - ${path}: ${msg}`;\n\t\t\t\t})\n\t\t\t\t.join(\"\\n\");\n\t\t\terrorMessage = `Validation failed:\\n${issueMessages}`;\n\t\t}\n\t}\n\n\t// Add error code prefix if available and not already in message\n\tif (errorData.code && !errorMessage.includes(errorData.code)) {\n\t\terrorMessage = `[${errorData.code}] ${errorMessage}`;\n\t}\n\n\t// Add request ID for debugging\n\tif (errorData.requestId) {\n\t\terrorMessage += `\\n(Request ID: ${errorData.requestId})`;\n\t}\n\n\treturn errorMessage;\n}\n","import { mkdir, readFile, stat, unlink, writeFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\nimport * as ini from \"ini\";\nimport { NotLoggedInError } from \"./errors.js\";\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/**\n * User config stored in ~/.pspmrc (INI format)\n */\nexport interface UserConfig {\n\tregistry?: string;\n\tauthToken?: string;\n\tusername?: string;\n}\n\n/**\n * Project config stored in .pspmrc (INI format)\n */\nexport interface ProjectConfig {\n\tregistry?: string;\n}\n\n/**\n * Fully resolved configuration (after cascade)\n */\nexport interface ResolvedConfig {\n\tregistryUrl: string;\n\tapiKey?: string;\n\tusername?: string;\n}\n\n/**\n * Legacy V1 config schema (for migration)\n */\ninterface LegacyConfigV1 {\n\tregistryUrl?: string;\n\tapiKey?: string;\n\tusername?: string;\n}\n\n/**\n * Legacy V2 config schema (for migration)\n */\ninterface LegacyConfigV2 {\n\tversion: 2;\n\tdefaultProfile: string;\n\tprofiles: Record<\n\t\tstring,\n\t\t{\n\t\t\tregistryUrl?: string;\n\t\t\tapiKey?: string;\n\t\t\tusername?: string;\n\t\t}\n\t>;\n}\n\n// =============================================================================\n// Constants\n// =============================================================================\n\nconst DEFAULT_REGISTRY_URL = \"https://pspm.dev\";\n\n/**\n * Get the user config file path (~/.pspmrc)\n */\nexport function getConfigPath(): string {\n\treturn join(homedir(), \".pspmrc\");\n}\n\n/**\n * Get the legacy config file path (~/.pspm/config.json) for migration\n */\nfunction getLegacyConfigPath(): string {\n\treturn join(homedir(), \".pspm\", \"config.json\");\n}\n\n/**\n * Get the skills directory path (for current project)\n */\nexport function getSkillsDir(): string {\n\treturn join(process.cwd(), \".skills\");\n}\n\n/**\n * Get the lockfile path (for current project)\n */\nexport function getLockfilePath(): string {\n\treturn join(process.cwd(), \"skill-lock.json\");\n}\n\n// =============================================================================\n// INI Config Functions\n// =============================================================================\n\n/**\n * Read the user config file (~/.pspmrc, INI format)\n */\nexport async function readUserConfig(): Promise<UserConfig> {\n\tconst configPath = getConfigPath();\n\n\tif (process.env.PSPM_DEBUG) {\n\t\tconsole.log(`[config] Reading config from: ${configPath}`);\n\t}\n\n\ttry {\n\t\tconst content = await readFile(configPath, \"utf-8\");\n\t\tconst parsed = ini.parse(content);\n\n\t\tif (process.env.PSPM_DEBUG) {\n\t\t\tconsole.log(`[config] Parsed config:`, JSON.stringify(parsed, null, 2));\n\t\t}\n\n\t\treturn {\n\t\t\tregistry: parsed.registry as string | undefined,\n\t\t\tauthToken: parsed.authToken as string | undefined,\n\t\t\tusername: parsed.username as string | undefined,\n\t\t};\n\t} catch (error) {\n\t\tif (process.env.PSPM_DEBUG) {\n\t\t\tconsole.log(\n\t\t\t\t`[config] Error reading config: ${\n\t\t\t\t\terror instanceof Error ? error.message : String(error)\n\t\t\t\t}`,\n\t\t\t);\n\t\t}\n\t\treturn {};\n\t}\n}\n\n/**\n * Write the user config file (~/.pspmrc, INI format)\n */\nexport async function writeUserConfig(config: UserConfig): Promise<void> {\n\tconst configPath = getConfigPath();\n\n\t// Build INI content with comments\n\tconst lines: string[] = [\"; PSPM Configuration\", \"\"];\n\n\tif (config.registry) {\n\t\tlines.push(`registry = ${config.registry}`);\n\t}\n\tif (config.authToken) {\n\t\tlines.push(`authToken = ${config.authToken}`);\n\t}\n\tif (config.username) {\n\t\tlines.push(`username = ${config.username}`);\n\t}\n\n\t// Always end with a newline\n\tlines.push(\"\");\n\n\tawait mkdir(dirname(configPath), { recursive: true });\n\tawait writeFile(configPath, lines.join(\"\\n\"));\n\n\tif (process.env.PSPM_DEBUG) {\n\t\tconsole.log(`[config] Wrote config to: ${configPath}`);\n\t}\n}\n\n/**\n * Find and read project config (.pspmrc) by searching up directory tree\n */\nexport async function findProjectConfig(): Promise<ProjectConfig | null> {\n\tlet currentDir = process.cwd();\n\tconst root = dirname(currentDir);\n\n\twhile (currentDir !== root) {\n\t\tconst configPath = join(currentDir, \".pspmrc\");\n\t\ttry {\n\t\t\tconst stats = await stat(configPath);\n\t\t\tif (stats.isFile()) {\n\t\t\t\tconst content = await readFile(configPath, \"utf-8\");\n\t\t\t\t// Try parsing as INI first\n\t\t\t\ttry {\n\t\t\t\t\tconst parsed = ini.parse(content);\n\t\t\t\t\tif (process.env.PSPM_DEBUG) {\n\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t`[config] Found project config at ${configPath}:`,\n\t\t\t\t\t\t\tJSON.stringify(parsed, null, 2),\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\treturn {\n\t\t\t\t\t\tregistry: parsed.registry as string | undefined,\n\t\t\t\t\t};\n\t\t\t\t} catch {\n\t\t\t\t\t// Fall back to JSON for backward compatibility during migration\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst jsonConfig = JSON.parse(content);\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tregistry: jsonConfig.registryUrl,\n\t\t\t\t\t\t};\n\t\t\t\t\t} catch {\n\t\t\t\t\t\t// Unparseable, skip\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} catch {\n\t\t\t// File doesn't exist, continue searching\n\t\t}\n\t\tcurrentDir = dirname(currentDir);\n\t}\n\n\treturn null;\n}\n\n/**\n * Migrate from legacy config format (~/.pspm/config.json) if it exists\n */\nasync function migrateFromLegacyConfig(): Promise<UserConfig | null> {\n\tconst legacyPath = getLegacyConfigPath();\n\n\ttry {\n\t\tconst content = await readFile(legacyPath, \"utf-8\");\n\t\tconst parsed = JSON.parse(content);\n\n\t\tlet config: UserConfig = {};\n\n\t\t// Check if V2 format (with profiles)\n\t\tif (parsed.version === 2 && parsed.profiles) {\n\t\t\tconst v2Config = parsed as LegacyConfigV2;\n\t\t\tconst defaultProfileName = v2Config.defaultProfile || \"default\";\n\t\t\tconst profile = v2Config.profiles[defaultProfileName];\n\n\t\t\tif (profile) {\n\t\t\t\tconfig = {\n\t\t\t\t\tregistry:\n\t\t\t\t\t\tprofile.registryUrl !== DEFAULT_REGISTRY_URL\n\t\t\t\t\t\t\t? profile.registryUrl\n\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\tauthToken: profile.apiKey,\n\t\t\t\t\tusername: profile.username,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tconsole.log(\n\t\t\t\t`Migrating from legacy config (profile: ${defaultProfileName})...`,\n\t\t\t);\n\t\t} else {\n\t\t\t// V1 format (flat)\n\t\t\tconst v1Config = parsed as LegacyConfigV1;\n\t\t\tconfig = {\n\t\t\t\tregistry:\n\t\t\t\t\tv1Config.registryUrl !== DEFAULT_REGISTRY_URL\n\t\t\t\t\t\t? v1Config.registryUrl\n\t\t\t\t\t\t: undefined,\n\t\t\t\tauthToken: v1Config.apiKey,\n\t\t\t\tusername: v1Config.username,\n\t\t\t};\n\n\t\t\tconsole.log(\"Migrating from legacy config...\");\n\t\t}\n\n\t\t// Write new format\n\t\tawait writeUserConfig(config);\n\t\tconsole.log(`Created new config at: ${getConfigPath()}`);\n\n\t\t// Remove old config directory\n\t\tawait unlink(legacyPath);\n\t\tconsole.log(`Removed legacy config: ${legacyPath}`);\n\n\t\treturn config;\n\t} catch {\n\t\t// Legacy config doesn't exist or couldn't be read\n\t\treturn null;\n\t}\n}\n\n/**\n * Resolve the full configuration using cascade priority:\n * 1. Environment variables (PSPM_REGISTRY_URL, PSPM_API_KEY)\n * 2. Project config (.pspmrc in project directory)\n * 3. User config (~/.pspmrc)\n * 4. Defaults\n */\nexport async function resolveConfig(): Promise<ResolvedConfig> {\n\t// Check for legacy config and migrate if needed\n\tconst newConfigPath = getConfigPath();\n\ttry {\n\t\tawait stat(newConfigPath);\n\t} catch {\n\t\t// New config doesn't exist, try migrating from legacy\n\t\tawait migrateFromLegacyConfig();\n\t}\n\n\tconst userConfig = await readUserConfig();\n\tconst projectConfig = await findProjectConfig();\n\n\t// Build resolved config with cascade priority\n\tlet registryUrl = DEFAULT_REGISTRY_URL;\n\tlet apiKey = userConfig.authToken;\n\tconst username = userConfig.username;\n\n\t// User config\n\tif (userConfig.registry) {\n\t\tregistryUrl = userConfig.registry;\n\t}\n\n\t// Project config can override registryUrl (but not apiKey for security)\n\tif (projectConfig?.registry) {\n\t\tregistryUrl = projectConfig.registry;\n\t}\n\n\t// Environment variables always win\n\tif (process.env.PSPM_REGISTRY_URL) {\n\t\tregistryUrl = process.env.PSPM_REGISTRY_URL;\n\t}\n\tif (process.env.PSPM_API_KEY) {\n\t\tapiKey = process.env.PSPM_API_KEY;\n\t}\n\n\tif (process.env.PSPM_DEBUG) {\n\t\tconsole.log(`[config] Resolved config:`);\n\t\tconsole.log(`[config] registryUrl: ${registryUrl}`);\n\t\tconsole.log(`[config] apiKey: ${apiKey ? \"***\" : \"(not set)\"}`);\n\t\tconsole.log(`[config] username: ${username || \"(not set)\"}`);\n\t}\n\n\treturn {\n\t\tregistryUrl,\n\t\tapiKey,\n\t\tusername,\n\t};\n}\n\n// =============================================================================\n// Credential Management\n// =============================================================================\n\n/**\n * Set credentials (authToken and optionally username/registry)\n */\nexport async function setCredentials(\n\tauthToken: string,\n\tusername?: string,\n\tregistry?: string,\n): Promise<void> {\n\tconst config = await readUserConfig();\n\n\tconfig.authToken = authToken;\n\tif (username) {\n\t\tconfig.username = username;\n\t}\n\tif (registry && registry !== DEFAULT_REGISTRY_URL) {\n\t\tconfig.registry = registry;\n\t}\n\n\tawait writeUserConfig(config);\n}\n\n/**\n * Clear credentials (authToken and username)\n */\nexport async function clearCredentials(): Promise<void> {\n\tconst config = await readUserConfig();\n\n\tdelete config.authToken;\n\tdelete config.username;\n\n\tawait writeUserConfig(config);\n}\n\n/**\n * Check if user is logged in\n */\nexport async function isLoggedIn(): Promise<boolean> {\n\ttry {\n\t\tconst resolved = await resolveConfig();\n\t\treturn !!resolved.apiKey;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\n/**\n * Get the API key (throws if not logged in)\n */\nexport async function requireApiKey(): Promise<string> {\n\tconst resolved = await resolveConfig();\n\n\tif (!resolved.apiKey) {\n\t\tif (process.env.PSPM_DEBUG) {\n\t\t\tconsole.log(`[config] requireApiKey: No API key found`);\n\t\t}\n\t\tthrow new NotLoggedInError();\n\t}\n\n\tif (process.env.PSPM_DEBUG) {\n\t\tconsole.log(\n\t\t\t`[config] requireApiKey: Got API key (${resolved.apiKey.substring(0, 10)}...)`,\n\t\t);\n\t}\n\n\treturn resolved.apiKey;\n}\n\n/**\n * Get the registry URL\n */\nexport async function getRegistryUrl(): Promise<string> {\n\tconst resolved = await resolveConfig();\n\treturn resolved.registryUrl;\n}\n\n// =============================================================================\n// Legacy Exports (for backward compatibility during transition)\n// =============================================================================\n\n// Legacy type alias\nexport type PspmConfig = {\n\tregistryUrl: string;\n\tapiKey?: string;\n\tusername?: string;\n};\n\n/**\n * Read config (legacy - wraps resolveConfig)\n */\nexport async function readConfig(): Promise<PspmConfig> {\n\tconst resolved = await resolveConfig();\n\treturn {\n\t\tregistryUrl: resolved.registryUrl,\n\t\tapiKey: resolved.apiKey,\n\t\tusername: resolved.username,\n\t};\n}\n\n/**\n * Write config (legacy - wraps setCredentials)\n */\nexport async function writeConfig(config: Partial<PspmConfig>): Promise<void> {\n\tif (config.apiKey) {\n\t\tawait setCredentials(config.apiKey, config.username, config.registryUrl);\n\t} else {\n\t\tconst current = await readUserConfig();\n\t\tif (config.registryUrl && config.registryUrl !== DEFAULT_REGISTRY_URL) {\n\t\t\tcurrent.registry = config.registryUrl;\n\t\t}\n\t\tif (config.username) {\n\t\t\tcurrent.username = config.username;\n\t\t}\n\t\tawait writeUserConfig(current);\n\t}\n}\n\n/**\n * Clear config (legacy - wraps clearCredentials)\n */\nexport async function clearConfig(): Promise<void> {\n\tawait clearCredentials();\n}\n","import { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\nimport type { SkillLockfile, SkillLockfileEntry } from \"@repo/pspm-types\";\nimport { getLockfilePath, getRegistryUrl } from \"./config\";\n\n/**\n * Read the lockfile\n */\nexport async function readLockfile(): Promise<SkillLockfile | null> {\n\tconst lockfilePath = getLockfilePath();\n\n\ttry {\n\t\tconst content = await readFile(lockfilePath, \"utf-8\");\n\t\treturn JSON.parse(content) as SkillLockfile;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\n/**\n * Write the lockfile\n */\nexport async function writeLockfile(lockfile: SkillLockfile): Promise<void> {\n\tconst lockfilePath = getLockfilePath();\n\tawait mkdir(dirname(lockfilePath), { recursive: true });\n\tawait writeFile(lockfilePath, `${JSON.stringify(lockfile, null, 2)}\\n`);\n}\n\n/**\n * Create a new empty lockfile\n */\nexport async function createEmptyLockfile(): Promise<SkillLockfile> {\n\tconst registryUrl = await getRegistryUrl();\n\treturn {\n\t\tlockfileVersion: 1,\n\t\tregistryUrl,\n\t\tskills: {},\n\t};\n}\n\n/**\n * Add a skill to the lockfile\n */\nexport async function addToLockfile(\n\tfullName: string,\n\tentry: SkillLockfileEntry,\n): Promise<void> {\n\tlet lockfile = await readLockfile();\n\tif (!lockfile) {\n\t\tlockfile = await createEmptyLockfile();\n\t}\n\n\tlockfile.skills[fullName] = entry;\n\tawait writeLockfile(lockfile);\n}\n\n/**\n * Remove a skill from the lockfile\n */\nexport async function removeFromLockfile(fullName: string): Promise<boolean> {\n\tconst lockfile = await readLockfile();\n\tif (!lockfile || !lockfile.skills[fullName]) {\n\t\treturn false;\n\t}\n\n\tdelete lockfile.skills[fullName];\n\tawait writeLockfile(lockfile);\n\treturn true;\n}\n\n/**\n * Get a skill entry from the lockfile\n */\nexport async function getFromLockfile(\n\tfullName: string,\n): Promise<SkillLockfileEntry | null> {\n\tconst lockfile = await readLockfile();\n\tif (!lockfile || !lockfile.skills[fullName]) {\n\t\treturn null;\n\t}\n\treturn lockfile.skills[fullName];\n}\n\n/**\n * List all skills in the lockfile\n */\nexport async function listLockfileSkills(): Promise<\n\tArray<{ name: string; entry: SkillLockfileEntry }>\n> {\n\tconst lockfile = await readLockfile();\n\tif (!lockfile) {\n\t\treturn [];\n\t}\n\n\treturn Object.entries(lockfile.skills).map(([name, entry]) => ({\n\t\tname,\n\t\tentry: entry as SkillLockfileEntry,\n\t}));\n}\n","import { mkdir, rm } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport {\n\tcalculateIntegrity,\n\tparseSkillSpecifier,\n\tresolveVersion,\n} from \"@repo/pspm-types\";\nimport {\n\tconfigure,\n\tgetSkillVersion,\n\tlistSkillVersions,\n} from \"../api-client.js\";\nimport { getRegistryUrl, getSkillsDir, requireApiKey } from \"../config.js\";\nimport { extractApiErrorMessage } from \"../errors.js\";\nimport { addToLockfile } from \"../lockfile.js\";\n\nexport interface AddOptions {\n\tsave?: boolean;\n}\n\nexport async function add(\n\tspecifier: string,\n\t_options: AddOptions,\n): Promise<void> {\n\ttry {\n\t\tconst apiKey = await requireApiKey();\n\t\tconst registryUrl = await getRegistryUrl();\n\n\t\t// Parse the specifier\n\t\tconst parsed = parseSkillSpecifier(specifier);\n\t\tif (!parsed) {\n\t\t\tconsole.error(\n\t\t\t\t`Error: Invalid skill specifier \"${specifier}\". Use format: @user/{username}/{name}[@{version}]`,\n\t\t\t);\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\tconst { username, name, versionRange } = parsed;\n\n\t\t// Configure SDK (use direct REST endpoints, not oRPC)\n\t\tconfigure({ registryUrl, apiKey });\n\n\t\tconsole.log(`Resolving ${specifier}...`);\n\n\t\t// Get available versions\n\t\tconst versionsResponse = await listSkillVersions(username, name);\n\t\tif (versionsResponse.status !== 200) {\n\t\t\tconst errorMessage = extractApiErrorMessage(\n\t\t\t\tversionsResponse,\n\t\t\t\t`Skill @user/${username}/${name} not found`,\n\t\t\t);\n\t\t\tconsole.error(`Error: ${errorMessage}`);\n\t\t\tprocess.exit(1);\n\t\t}\n\t\tconst versions = versionsResponse.data;\n\t\tif (versions.length === 0) {\n\t\t\tconsole.error(`Error: Skill @user/${username}/${name} not found`);\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\t// Resolve version\n\t\tconst versionStrings = versions.map((v: { version: string }) => v.version);\n\t\tconst resolved = resolveVersion(versionRange || \"*\", versionStrings);\n\n\t\tif (!resolved) {\n\t\t\tconsole.error(\n\t\t\t\t`Error: No version matching \"${versionRange || \"latest\"}\" found for @user/${username}/${name}`,\n\t\t\t);\n\t\t\tconsole.error(`Available versions: ${versionStrings.join(\", \")}`);\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\tconsole.log(`Installing @user/${username}/${name}@${resolved}...`);\n\n\t\t// Get version details with download URL\n\t\tconst versionResponse = await getSkillVersion(username, name, resolved);\n\t\tif (versionResponse.status !== 200 || !versionResponse.data) {\n\t\t\tconst errorMessage = extractApiErrorMessage(\n\t\t\t\tversionResponse,\n\t\t\t\t`Version ${resolved} not found`,\n\t\t\t);\n\t\t\tconsole.error(`Error: ${errorMessage}`);\n\t\t\tprocess.exit(1);\n\t\t}\n\t\tconst versionInfo = versionResponse.data;\n\n\t\t// Download the tarball using the URL from version info\n\t\t// This may be a presigned R2 URL or an API endpoint\n\t\t// Note: Presigned URLs already contain auth in URL params,\n\t\t// so we only add Bearer token for API endpoint URLs\n\t\tconst isPresignedUrl =\n\t\t\tversionInfo.downloadUrl.includes(\".r2.cloudflarestorage.com\") ||\n\t\t\tversionInfo.downloadUrl.includes(\"X-Amz-Signature\");\n\n\t\tconst tarballResponse = await fetch(versionInfo.downloadUrl, {\n\t\t\theaders: isPresignedUrl\n\t\t\t\t? {}\n\t\t\t\t: {\n\t\t\t\t\t\tAuthorization: `Bearer ${apiKey}`,\n\t\t\t\t\t},\n\t\t\tredirect: \"follow\",\n\t\t});\n\n\t\tif (!tarballResponse.ok) {\n\t\t\tconsole.error(\n\t\t\t\t`Error: Failed to download tarball (${tarballResponse.status})`,\n\t\t\t);\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\tconst tarballBuffer = Buffer.from(await tarballResponse.arrayBuffer());\n\n\t\t// Calculate integrity\n\t\tconst integrity = calculateIntegrity(tarballBuffer);\n\n\t\t// Verify checksum matches\n\t\tconst expectedIntegrity = `sha256-${Buffer.from(versionInfo.checksum, \"hex\").toString(\"base64\")}`;\n\t\tif (integrity !== expectedIntegrity) {\n\t\t\tconsole.error(\"Error: Checksum verification failed\");\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\t// Create skills directory\n\t\tconst skillsDir = getSkillsDir();\n\t\tconst destDir = join(skillsDir, username, name);\n\t\tawait mkdir(destDir, { recursive: true });\n\n\t\t// Extract tarball\n\t\tconst { writeFile } = await import(\"node:fs/promises\");\n\t\tconst tempFile = join(destDir, \".temp.tgz\");\n\t\tawait writeFile(tempFile, tarballBuffer);\n\n\t\tconst { exec } = await import(\"node:child_process\");\n\t\tconst { promisify } = await import(\"node:util\");\n\t\tconst execAsync = promisify(exec);\n\n\t\ttry {\n\t\t\t// Clear destination and extract\n\t\t\tawait rm(destDir, { recursive: true, force: true });\n\t\t\tawait mkdir(destDir, { recursive: true });\n\t\t\tawait writeFile(tempFile, tarballBuffer);\n\t\t\tawait execAsync(\n\t\t\t\t`tar -xzf \"${tempFile}\" -C \"${destDir}\" --strip-components=1`,\n\t\t\t);\n\t\t} finally {\n\t\t\tawait rm(tempFile, { force: true });\n\t\t}\n\n\t\t// Update lockfile\n\t\tconst fullName = `@user/${username}/${name}`;\n\t\tawait addToLockfile(fullName, {\n\t\t\tversion: resolved,\n\t\t\tresolved: versionInfo.downloadUrl,\n\t\t\tintegrity,\n\t\t});\n\n\t\tconsole.log(`Installed @user/${username}/${name}@${resolved}`);\n\t\tconsole.log(`Location: ${destDir}`);\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : \"Unknown error\";\n\t\tconsole.error(`Error: ${message}`);\n\t\tprocess.exit(1);\n\t}\n}\n","import { stat, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\nexport interface ConfigInitOptions {\n\tregistry?: string;\n}\n\n/**\n * Create a .pspmrc file in the current directory (INI format)\n */\nexport async function configInit(options: ConfigInitOptions): Promise<void> {\n\ttry {\n\t\tconst configPath = join(process.cwd(), \".pspmrc\");\n\n\t\t// Check if file already exists\n\t\ttry {\n\t\t\tawait stat(configPath);\n\t\t\tconsole.error(\"Error: .pspmrc already exists in this directory.\");\n\t\t\tprocess.exit(1);\n\t\t} catch {\n\t\t\t// File doesn't exist, good\n\t\t}\n\n\t\t// Build INI content\n\t\tconst lines: string[] = [\"; Project-specific PSPM configuration\", \"\"];\n\n\t\tif (options.registry) {\n\t\t\tlines.push(`registry = ${options.registry}`);\n\t\t} else {\n\t\t\tlines.push(\"; Uncomment to use a custom registry:\");\n\t\t\tlines.push(\"; registry = https://custom-registry.example.com\");\n\t\t}\n\n\t\tlines.push(\"\");\n\n\t\t// Write the file\n\t\tawait writeFile(configPath, lines.join(\"\\n\"));\n\n\t\tconsole.log(\"Created .pspmrc\");\n\t\tconsole.log(\"\");\n\t\tconsole.log(\"Contents:\");\n\t\tconsole.log(lines.join(\"\\n\"));\n\t\tconsole.log(\"Note: .pspmrc should be committed to version control.\");\n\t\tconsole.log(\"API keys should NOT be stored here - use pspm login instead.\");\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : \"Unknown error\";\n\t\tconsole.error(`Error: ${message}`);\n\t\tprocess.exit(1);\n\t}\n}\n","import {\n\tfindProjectConfig,\n\tgetConfigPath,\n\tresolveConfig,\n} from \"../../config.js\";\n\n/**\n * Show resolved configuration\n */\nexport async function configShow(): Promise<void> {\n\ttry {\n\t\tconst resolved = await resolveConfig();\n\t\tconst projectConfig = await findProjectConfig();\n\t\tconst configPath = getConfigPath();\n\n\t\tconsole.log(\"Resolved Configuration:\\n\");\n\t\tconsole.log(` Registry URL: ${resolved.registryUrl}`);\n\t\tconsole.log(` API Key: ${resolved.apiKey ? \"***\" : \"(not set)\"}`);\n\t\tconsole.log(` Username: ${resolved.username || \"(not set)\"}`);\n\t\tconsole.log(\"\");\n\t\tconsole.log(\"Config Locations:\");\n\t\tconsole.log(` User config: ${configPath}`);\n\t\tconsole.log(` Project config: ${projectConfig ? \".pspmrc\" : \"(none)\"}`);\n\t\tconsole.log(\"\");\n\t\tconsole.log(\"Environment Variables:\");\n\t\tconsole.log(\n\t\t\t` PSPM_REGISTRY_URL: ${process.env.PSPM_REGISTRY_URL || \"(not set)\"}`,\n\t\t);\n\t\tconsole.log(\n\t\t\t` PSPM_API_KEY: ${process.env.PSPM_API_KEY ? \"***\" : \"(not set)\"}`,\n\t\t);\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : \"Unknown error\";\n\t\tconsole.error(`Error: ${message}`);\n\t\tprocess.exit(1);\n\t}\n}\n","import { mkdir, rm } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { SkillLockfileEntry } from \"@repo/pspm-types\";\nimport { getRegistryUrl, getSkillsDir, requireApiKey } from \"../config.js\";\nimport { readLockfile } from \"../lockfile.js\";\n\nexport interface InstallOptions {\n\tfrozenLockfile?: boolean;\n\tdir?: string;\n}\n\nexport async function install(options: InstallOptions): Promise<void> {\n\ttry {\n\t\tconst apiKey = await requireApiKey();\n\t\tawait getRegistryUrl(); // Validate we have a registry configured\n\t\tconst skillsDir = options.dir || getSkillsDir();\n\n\t\tconst lockfile = await readLockfile();\n\t\tif (!lockfile) {\n\t\t\tif (options.frozenLockfile) {\n\t\t\t\tconsole.error(\n\t\t\t\t\t\"Error: No lockfile found. Cannot install with --frozen-lockfile\",\n\t\t\t\t);\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\t\t\tconsole.log(\"No lockfile found. Nothing to install.\");\n\t\t\treturn;\n\t\t}\n\n\t\tconst skillCount = Object.keys(lockfile.skills).length;\n\t\tif (skillCount === 0) {\n\t\t\tconsole.log(\"No skills in lockfile. Nothing to install.\");\n\t\t\treturn;\n\t\t}\n\n\t\tconsole.log(`Installing ${skillCount} skill(s)...\\n`);\n\n\t\tconst entries = Object.entries(lockfile.skills) as [\n\t\t\tstring,\n\t\t\tSkillLockfileEntry,\n\t\t][];\n\n\t\tfor (const [fullName, entry] of entries) {\n\t\t\tconst match = fullName.match(/^@user\\/([^/]+)\\/([^/]+)$/);\n\t\t\tif (!match) {\n\t\t\t\tconsole.warn(`Warning: Invalid skill name in lockfile: ${fullName}`);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst [, username, name] = match;\n\t\t\tconsole.log(`Installing ${fullName}@${entry.version}...`);\n\n\t\t\t// Download the tarball\n\t\t\t// Note: Presigned URLs already contain auth in URL params,\n\t\t\t// so we only add Bearer token for API endpoint URLs\n\t\t\tconst isPresignedUrl =\n\t\t\t\tentry.resolved.includes(\".r2.cloudflarestorage.com\") ||\n\t\t\t\tentry.resolved.includes(\"X-Amz-Signature\");\n\n\t\t\tconst response = await fetch(entry.resolved, {\n\t\t\t\theaders: isPresignedUrl\n\t\t\t\t\t? {}\n\t\t\t\t\t: {\n\t\t\t\t\t\t\tAuthorization: `Bearer ${apiKey}`,\n\t\t\t\t\t\t},\n\t\t\t\tredirect: \"follow\",\n\t\t\t});\n\n\t\t\tif (!response.ok) {\n\t\t\t\tconsole.error(\n\t\t\t\t\t` Error: Failed to download ${fullName} (${response.status})`,\n\t\t\t\t);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst tarballBuffer = Buffer.from(await response.arrayBuffer());\n\n\t\t\t// Verify checksum\n\t\t\tconst { createHash } = await import(\"node:crypto\");\n\t\t\tconst actualIntegrity = `sha256-${createHash(\"sha256\").update(tarballBuffer).digest(\"base64\")}`;\n\n\t\t\tif (actualIntegrity !== entry.integrity) {\n\t\t\t\tconsole.error(` Error: Checksum verification failed for ${fullName}`);\n\t\t\t\tif (options.frozenLockfile) {\n\t\t\t\t\tprocess.exit(1);\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Extract tarball\n\t\t\tconst destDir = join(skillsDir, username, name);\n\t\t\tawait rm(destDir, { recursive: true, force: true });\n\t\t\tawait mkdir(destDir, { recursive: true });\n\n\t\t\tconst tempFile = join(destDir, \".temp.tgz\");\n\t\t\tconst { writeFile } = await import(\"node:fs/promises\");\n\t\t\tawait writeFile(tempFile, tarballBuffer);\n\n\t\t\tconst { exec } = await import(\"node:child_process\");\n\t\t\tconst { promisify } = await import(\"node:util\");\n\t\t\tconst execAsync = promisify(exec);\n\n\t\t\ttry {\n\t\t\t\tawait execAsync(\n\t\t\t\t\t`tar -xzf \"${tempFile}\" -C \"${destDir}\" --strip-components=1`,\n\t\t\t\t);\n\t\t\t} finally {\n\t\t\t\tawait rm(tempFile, { force: true });\n\t\t\t}\n\n\t\t\tconsole.log(` Installed to ${destDir}`);\n\t\t}\n\n\t\tconsole.log(`\\nAll ${skillCount} skill(s) installed.`);\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : \"Unknown error\";\n\t\tconsole.error(`Error: ${message}`);\n\t\tprocess.exit(1);\n\t}\n}\n","import { access } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { getSkillsDir } from \"../config.js\";\nimport { listLockfileSkills } from \"../lockfile.js\";\n\nexport interface ListOptions {\n\tjson?: boolean;\n}\n\nexport async function list(options: ListOptions): Promise<void> {\n\ttry {\n\t\tconst skills = await listLockfileSkills();\n\n\t\tif (skills.length === 0) {\n\t\t\tconsole.log(\"No skills installed.\");\n\t\t\treturn;\n\t\t}\n\n\t\tif (options.json) {\n\t\t\tconsole.log(JSON.stringify(skills, null, 2));\n\t\t\treturn;\n\t\t}\n\n\t\tconst skillsDir = getSkillsDir();\n\n\t\tconsole.log(\"Installed skills:\\n\");\n\n\t\tfor (const { name, entry } of skills) {\n\t\t\tconst match = name.match(/^@user\\/([^/]+)\\/([^/]+)$/);\n\t\t\tif (!match) continue;\n\n\t\t\tconst [, username, skillName] = match;\n\t\t\tconst skillPath = join(skillsDir, username, skillName);\n\n\t\t\t// Check if skill is actually installed on disk\n\t\t\tlet status = \"installed\";\n\t\t\ttry {\n\t\t\t\tawait access(skillPath);\n\t\t\t} catch {\n\t\t\t\tstatus = \"missing\";\n\t\t\t}\n\n\t\t\tconsole.log(` ${name}@${entry.version}`);\n\t\t\tif (status === \"missing\") {\n\t\t\t\tconsole.log(` Status: MISSING (run 'pspm install' to restore)`);\n\t\t\t}\n\t\t}\n\n\t\tconsole.log(`\\nTotal: ${skills.length} skill(s)`);\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : \"Unknown error\";\n\t\tconsole.error(`Error: ${message}`);\n\t\tprocess.exit(1);\n\t}\n}\n","import { randomBytes } from \"node:crypto\";\nimport http from \"node:http\";\nimport { URL } from \"node:url\";\nimport open from \"open\";\nimport { whoamiRequest } from \"../api-client.js\";\nimport { getRegistryUrl, setCredentials } from \"../config.js\";\n\nexport interface LoginOptions {\n\tapiKey?: string;\n}\n\nconst DEFAULT_WEB_APP_URL = \"https://pspm.dev\";\n\n/**\n * Get the web app URL.\n * Priority:\n * 1. PSPM_WEB_URL environment variable (for local dev where web and server run on different ports)\n * 2. Derived from registry URL (for production where they share the same origin)\n *\n * Local dev example:\n * PSPM_WEB_URL=http://localhost:5500 pspm login\n *\n * The registry URL is like https://pspm.dev\n * The web app URL is the same: https://pspm.dev\n */\nfunction getWebAppUrl(registryUrl: string): string {\n\t// Environment variable takes priority (for local dev)\n\tif (process.env.PSPM_WEB_URL) {\n\t\treturn process.env.PSPM_WEB_URL.replace(/\\/$/, \"\"); // Remove trailing slash\n\t}\n\n\ttry {\n\t\tconst url = new URL(registryUrl);\n\t\treturn `${url.protocol}//${url.host}`;\n\t} catch {\n\t\treturn DEFAULT_WEB_APP_URL;\n\t}\n}\n\n/**\n * Get the server/API base URL from the registry URL\n * The registry URL is like https://pspm.dev\n * The server URL is the same: https://pspm.dev\n */\nfunction getServerUrl(registryUrl: string): string {\n\ttry {\n\t\tconst url = new URL(registryUrl);\n\t\treturn `${url.protocol}//${url.host}`;\n\t} catch {\n\t\treturn DEFAULT_WEB_APP_URL;\n\t}\n}\n\n/**\n * Exchange a CLI token for an API key using fetch\n */\nasync function exchangeCliToken(\n\tregistryUrl: string,\n\ttoken: string,\n): Promise<{ apiKey: string; username: string }> {\n\tconst serverUrl = getServerUrl(registryUrl);\n\t// Use direct REST endpoint (not oRPC) for CLI compatibility\n\tconst rpcUrl = `${serverUrl}/api/api-keys/cli-token-exchange`;\n\n\tconst response = await fetch(rpcUrl, {\n\t\tmethod: \"POST\",\n\t\theaders: {\n\t\t\t\"Content-Type\": \"application/json\",\n\t\t},\n\t\tbody: JSON.stringify({ token }),\n\t});\n\n\tif (!response.ok) {\n\t\tconst errorText = await response.text();\n\t\tthrow new Error(`Failed to exchange token: ${errorText}`);\n\t}\n\n\treturn response.json() as Promise<{ apiKey: string; username: string }>;\n}\n\n/**\n * Start a local HTTP server to receive the OAuth callback\n */\nfunction startCallbackServer(expectedState: string): Promise<{\n\tport: number;\n\ttokenPromise: Promise<string>;\n\tcleanup: () => void;\n}> {\n\treturn new Promise((resolveServer, rejectServer) => {\n\t\tlet resolveToken: (token: string) => void;\n\t\tlet rejectToken: (error: Error) => void;\n\t\tlet timeoutId: NodeJS.Timeout;\n\n\t\tconst tokenPromise = new Promise<string>((resolve, reject) => {\n\t\t\tresolveToken = resolve;\n\t\t\trejectToken = reject;\n\t\t});\n\n\t\tconst server = http.createServer((req, res) => {\n\t\t\tconst url = new URL(req.url || \"/\", `http://localhost`);\n\n\t\t\tif (url.pathname === \"/callback\") {\n\t\t\t\tconst token = url.searchParams.get(\"token\");\n\t\t\t\tconst state = url.searchParams.get(\"state\");\n\n\t\t\t\tif (state !== expectedState) {\n\t\t\t\t\tres.writeHead(400, { \"Content-Type\": \"text/html\" });\n\t\t\t\t\tres.end(`\n\t\t\t\t\t\t<html>\n\t\t\t\t\t\t\t<body style=\"font-family: system-ui; text-align: center; padding: 40px;\">\n\t\t\t\t\t\t\t\t<h1 style=\"color: #dc2626;\">Security Error</h1>\n\t\t\t\t\t\t\t\t<p>State mismatch - this may be a security issue.</p>\n\t\t\t\t\t\t\t\t<p>Please try running <code>pspm login</code> again.</p>\n\t\t\t\t\t\t\t</body>\n\t\t\t\t\t\t</html>\n\t\t\t\t\t`);\n\t\t\t\t\trejectToken(new Error(\"State mismatch - possible CSRF attack\"));\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (!token) {\n\t\t\t\t\tres.writeHead(400, { \"Content-Type\": \"text/html\" });\n\t\t\t\t\tres.end(`\n\t\t\t\t\t\t<html>\n\t\t\t\t\t\t\t<body style=\"font-family: system-ui; text-align: center; padding: 40px;\">\n\t\t\t\t\t\t\t\t<h1 style=\"color: #dc2626;\">Error</h1>\n\t\t\t\t\t\t\t\t<p>No token received from the server.</p>\n\t\t\t\t\t\t\t\t<p>Please try running <code>pspm login</code> again.</p>\n\t\t\t\t\t\t\t</body>\n\t\t\t\t\t\t</html>\n\t\t\t\t\t`);\n\t\t\t\t\trejectToken(new Error(\"No token received\"));\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tres.writeHead(200, { \"Content-Type\": \"text/html\" });\n\t\t\t\tres.end(`\n\t\t\t\t\t<html>\n\t\t\t\t\t\t<head>\n\t\t\t\t\t\t\t<script>\n\t\t\t\t\t\t\t\t// Try to close the window after a short delay\n\t\t\t\t\t\t\t\tsetTimeout(function() {\n\t\t\t\t\t\t\t\t\twindow.close();\n\t\t\t\t\t\t\t\t}, 1500);\n\t\t\t\t\t\t\t</script>\n\t\t\t\t\t\t</head>\n\t\t\t\t\t\t<body style=\"font-family: system-ui; text-align: center; padding: 40px;\">\n\t\t\t\t\t\t\t<h1 style=\"color: #16a34a;\">Success!</h1>\n\t\t\t\t\t\t\t<p>You are now logged in to PSPM.</p>\n\t\t\t\t\t\t\t<p style=\"color: #666; font-size: 14px;\">This window will close automatically, or you can close it manually.</p>\n\t\t\t\t\t\t</body>\n\t\t\t\t\t</html>\n\t\t\t\t`);\n\n\t\t\t\tresolveToken(token);\n\t\t\t} else {\n\t\t\t\tres.writeHead(404, { \"Content-Type\": \"text/plain\" });\n\t\t\t\tres.end(\"Not found\");\n\t\t\t}\n\t\t});\n\n\t\t// Cleanup function to close server and clear timeout\n\t\tconst cleanup = () => {\n\t\t\tclearTimeout(timeoutId);\n\t\t\tserver.close();\n\t\t};\n\n\t\t// Use port 0 to let the OS assign an available port\n\t\tserver.listen(0, \"127.0.0.1\", () => {\n\t\t\tconst address = server.address();\n\t\t\tif (typeof address === \"object\" && address !== null) {\n\t\t\t\tresolveServer({ port: address.port, tokenPromise, cleanup });\n\t\t\t} else {\n\t\t\t\trejectServer(new Error(\"Failed to get server address\"));\n\t\t\t}\n\t\t});\n\n\t\tserver.on(\"error\", (err) => {\n\t\t\trejectServer(err);\n\t\t});\n\n\t\t// Timeout after 5 minutes\n\t\ttimeoutId = setTimeout(\n\t\t\t() => {\n\t\t\t\trejectToken(new Error(\"Login timed out - please try again\"));\n\t\t\t\tserver.close();\n\t\t\t},\n\t\t\t5 * 60 * 1000,\n\t\t);\n\t});\n}\n\n/**\n * Login using browser-based OAuth flow\n */\nasync function browserLogin(): Promise<void> {\n\tconst registryUrl = await getRegistryUrl();\n\tconst webAppUrl = getWebAppUrl(registryUrl);\n\n\t// Generate state for CSRF protection\n\tconst state = randomBytes(32).toString(\"base64url\");\n\n\tconsole.log(\"Starting browser-based login...\");\n\n\t// Start local callback server\n\tconst { port, tokenPromise, cleanup } = await startCallbackServer(state);\n\n\t// Build the login URL\n\tconst loginUrl = `${webAppUrl}/cli/login?port=${port}&state=${encodeURIComponent(state)}`;\n\n\tconsole.log(`Opening browser to authenticate...`);\n\tconsole.log(`If the browser doesn't open, visit: ${loginUrl}`);\n\n\t// Open the browser\n\ttry {\n\t\tawait open(loginUrl);\n\t} catch {\n\t\tconsole.log(\"Could not open browser automatically.\");\n\t\tconsole.log(`Please visit: ${loginUrl}`);\n\t}\n\n\tconsole.log(\"Waiting for authentication...\");\n\n\t// Wait for the callback with the token\n\tconst token = await tokenPromise;\n\n\t// Clean up server and timeout immediately after receiving token\n\tcleanup();\n\n\tconsole.log(\"Received token, exchanging for API key...\");\n\n\t// Exchange the token for an API key\n\tconst { apiKey, username } = await exchangeCliToken(registryUrl, token);\n\n\t// Store credentials\n\tawait setCredentials(apiKey, username, registryUrl);\n\n\tconsole.log(`Logged in as ${username}`);\n\tconsole.log(`Registry: ${registryUrl}`);\n}\n\n/**\n * Login using direct API key (fallback method)\n */\nasync function directLogin(apiKey: string): Promise<void> {\n\tconsole.log(\"Verifying API key...\");\n\n\tconst registryUrl = await getRegistryUrl();\n\n\tconst user = await whoamiRequest(registryUrl, apiKey);\n\tif (!user) {\n\t\tconsole.error(\"Error: Invalid API key or not authenticated\");\n\t\tprocess.exit(1);\n\t}\n\n\t// Store credentials\n\tawait setCredentials(apiKey, user.username, registryUrl);\n\tconsole.log(`Logged in as ${user.username}`);\n\tconsole.log(`Registry: ${registryUrl}`);\n}\n\nexport async function login(options: LoginOptions): Promise<void> {\n\ttry {\n\t\tif (options.apiKey) {\n\t\t\t// Direct login with API key\n\t\t\tawait directLogin(options.apiKey);\n\t\t} else {\n\t\t\t// Browser-based OAuth flow\n\t\t\tawait browserLogin();\n\t\t}\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : \"Unknown error\";\n\t\tconsole.error(`Error: ${message}`);\n\t\tprocess.exit(1);\n\t}\n}\n","import { clearCredentials, isLoggedIn } from \"../config.js\";\n\nexport async function logout(): Promise<void> {\n\ttry {\n\t\tconst loggedIn = await isLoggedIn();\n\n\t\tif (!loggedIn) {\n\t\t\tconsole.log(\"Not logged in.\");\n\t\t\treturn;\n\t\t}\n\n\t\tawait clearCredentials();\n\t\tconsole.log(\"Logged out successfully.\");\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : \"Unknown error\";\n\t\tconsole.error(`Error: ${message}`);\n\t\tprocess.exit(1);\n\t}\n}\n","import { exec as execCb } from \"node:child_process\";\nimport { createHash } from \"node:crypto\";\nimport { readdir, readFile, stat } from \"node:fs/promises\";\nimport { join, relative } from \"node:path\";\nimport { promisify } from \"node:util\";\nimport type { SkillManifest } from \"@repo/sdk\";\nimport { configure, publishSkill } from \"../api-client.js\";\nimport { getRegistryUrl, requireApiKey } from \"../config.js\";\nimport { extractApiErrorMessage } from \"../errors.js\";\n\nconst exec = promisify(execCb);\n\n/**\n * Format bytes to human readable string\n */\nfunction formatBytes(bytes: number): string {\n\tif (bytes < 1024) return `${bytes}B`;\n\tif (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)}kB`;\n\treturn `${(bytes / (1024 * 1024)).toFixed(1)}MB`;\n}\n\n/**\n * Recursively get all files in a directory with their sizes\n */\nasync function getFilesWithSizes(\n\tdir: string,\n\tbaseDir: string,\n): Promise<Array<{ path: string; size: number }>> {\n\tconst results: Array<{ path: string; size: number }> = [];\n\n\ttry {\n\t\tconst entries = await readdir(dir, { withFileTypes: true });\n\n\t\tfor (const entry of entries) {\n\t\t\tconst fullPath = join(dir, entry.name);\n\t\t\tconst relativePath = relative(baseDir, fullPath);\n\n\t\t\t// Skip node_modules and .git\n\t\t\tif (entry.name === \"node_modules\" || entry.name === \".git\") {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (entry.isDirectory()) {\n\t\t\t\tconst subFiles = await getFilesWithSizes(fullPath, baseDir);\n\t\t\t\tresults.push(...subFiles);\n\t\t\t} else {\n\t\t\t\tconst fileStat = await stat(fullPath);\n\t\t\t\tresults.push({ path: relativePath, size: fileStat.size });\n\t\t\t}\n\t\t}\n\t} catch {\n\t\t// Directory doesn't exist or can't be read\n\t}\n\n\treturn results;\n}\n\nexport interface PublishOptions {\n\tbump?: \"major\" | \"minor\" | \"patch\";\n\ttag?: string;\n}\n\nexport async function publishCommand(options: PublishOptions): Promise<void> {\n\ttry {\n\t\tconst apiKey = await requireApiKey();\n\t\tconst registryUrl = await getRegistryUrl();\n\n\t\t// Read package.json from current directory\n\t\tconst packageJsonPath = join(process.cwd(), \"package.json\");\n\t\tlet packageJson: SkillManifest;\n\n\t\ttry {\n\t\t\tconst content = await readFile(packageJsonPath, \"utf-8\");\n\t\t\tpackageJson = JSON.parse(content);\n\t\t} catch {\n\t\t\tconsole.error(\"Error: No package.json found in current directory\");\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\t// Validate required fields\n\t\tif (!packageJson.name) {\n\t\t\tconsole.error(\"Error: package.json must have a 'name' field\");\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\tif (!packageJson.version) {\n\t\t\tconsole.error(\"Error: package.json must have a 'version' field\");\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\t// Handle version bump if requested\n\t\tif (options.bump) {\n\t\t\tconst semver = await import(\"semver\");\n\t\t\tconst newVersion = semver.default.inc(packageJson.version, options.bump);\n\t\t\tif (!newVersion) {\n\t\t\t\tconsole.error(\n\t\t\t\t\t`Error: Failed to bump version from ${packageJson.version}`,\n\t\t\t\t);\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\t\t\tpackageJson.version = newVersion;\n\t\t\tconsole.log(`Bumped version to ${newVersion}`);\n\t\t}\n\n\t\t// Create tarball using npm pack (or tar directly)\n\t\t// Sanitize name for filename (replace @ and / with -)\n\t\tconst safeName = packageJson.name.replace(/[@/]/g, \"-\").replace(/^-+/, \"\");\n\t\tconst tarballName = `${safeName}-${packageJson.version}.tgz`;\n\t\tconst tempDir = join(process.cwd(), \".pspm-publish\");\n\n\t\t// Create tarball\n\t\ttry {\n\t\t\tawait exec(`rm -rf \"${tempDir}\" && mkdir -p \"${tempDir}\"`);\n\n\t\t\t// Get files to include (use 'files' from package.json or default)\n\t\t\tconst files = packageJson.files || [\n\t\t\t\t\"package.json\",\n\t\t\t\t\"SKILL.md\",\n\t\t\t\t\"runtime\",\n\t\t\t\t\"scripts\",\n\t\t\t\t\"data\",\n\t\t\t];\n\n\t\t\t// Create the tarball structure: package/{files}\n\t\t\tawait exec(`mkdir -p \"${tempDir}/package\"`);\n\n\t\t\tfor (const file of files) {\n\t\t\t\ttry {\n\t\t\t\t\t// Use rsync to copy while excluding node_modules\n\t\t\t\t\tawait exec(\n\t\t\t\t\t\t`rsync -a --exclude='node_modules' --exclude='.git' \"${file}\" \"${tempDir}/package/\" 2>/dev/null || true`,\n\t\t\t\t\t);\n\t\t\t\t} catch {\n\t\t\t\t\t// Ignore files that don't exist\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Always include package.json\n\t\t\tawait exec(`cp package.json \"${tempDir}/package/\"`);\n\n\t\t\t// Get list of files that will be included and their sizes\n\t\t\tconst packageDir = join(tempDir, \"package\");\n\t\t\tconst tarballContents = await getFilesWithSizes(packageDir, packageDir);\n\t\t\tconst unpackedSize = tarballContents.reduce((acc, f) => acc + f.size, 0);\n\n\t\t\t// Create tarball (excluding node_modules just in case)\n\t\t\tconst tarballPath = join(tempDir, tarballName);\n\t\t\tawait exec(\n\t\t\t\t`tar -czf \"${tarballPath}\" -C \"${tempDir}\" --exclude='node_modules' --exclude='.git' package`,\n\t\t\t);\n\n\t\t\t// Read tarball and calculate hashes\n\t\t\tconst tarballBuffer = await readFile(tarballPath);\n\t\t\tconst tarballBase64 = tarballBuffer.toString(\"base64\");\n\t\t\tconst tarballSize = tarballBuffer.length;\n\n\t\t\t// Calculate shasum (sha1) and integrity (sha512)\n\t\t\tconst shasum = createHash(\"sha1\").update(tarballBuffer).digest(\"hex\");\n\t\t\tconst integrityHash = createHash(\"sha512\")\n\t\t\t\t.update(tarballBuffer)\n\t\t\t\t.digest(\"base64\");\n\t\t\tconst integrity = `sha512-${integrityHash}`;\n\n\t\t\t// Print npm-style publish notice\n\t\t\tconsole.log(\"\");\n\t\t\tconsole.log(`pspm notice`);\n\t\t\tconsole.log(`pspm notice 📦 ${packageJson.name}@${packageJson.version}`);\n\t\t\tconsole.log(`pspm notice Tarball Contents`);\n\n\t\t\t// Sort files by size descending for display\n\t\t\ttarballContents.sort((a, b) => b.size - a.size);\n\t\t\tfor (const file of tarballContents) {\n\t\t\t\tconsole.log(\n\t\t\t\t\t`pspm notice ${formatBytes(file.size).padStart(8)} ${file.path}`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconsole.log(`pspm notice Tarball Details`);\n\t\t\tconsole.log(`pspm notice name: ${packageJson.name}`);\n\t\t\tconsole.log(`pspm notice version: ${packageJson.version}`);\n\t\t\tconsole.log(`pspm notice filename: ${tarballName}`);\n\t\t\tconsole.log(`pspm notice package size: ${formatBytes(tarballSize)}`);\n\t\t\tconsole.log(`pspm notice unpacked size: ${formatBytes(unpackedSize)}`);\n\t\t\tconsole.log(`pspm notice shasum: ${shasum}`);\n\t\t\tconsole.log(\n\t\t\t\t`pspm notice integrity: ${integrity.substring(0, 50)}...`,\n\t\t\t);\n\t\t\tconsole.log(`pspm notice total files: ${tarballContents.length}`);\n\t\t\tconsole.log(`pspm notice`);\n\t\t\tconsole.log(`pspm notice Publishing to ${registryUrl} with tag latest`);\n\n\t\t\t// Configure SDK and publish (use direct REST endpoints, not oRPC)\n\t\t\tconfigure({ registryUrl, apiKey });\n\t\t\tconst response = await publishSkill({\n\t\t\t\tmanifest: packageJson,\n\t\t\t\ttarballBase64,\n\t\t\t});\n\n\t\t\tif (response.status !== 200) {\n\t\t\t\tconst errorMessage = extractApiErrorMessage(response, \"Publish failed\");\n\n\t\t\t\t// Check for version conflict errors\n\t\t\t\tif (\n\t\t\t\t\terrorMessage.includes(\"must be greater than\") ||\n\t\t\t\t\terrorMessage.includes(\"already exists\")\n\t\t\t\t) {\n\t\t\t\t\tconsole.error(`pspm error code E403`);\n\t\t\t\t\tconsole.error(\n\t\t\t\t\t\t`pspm error 403 403 Forbidden - You cannot publish over the previously published versions: ${packageJson.version}.`,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tthrow new Error(errorMessage);\n\t\t\t}\n\n\t\t\tconst result = response.data;\n\t\t\tconsole.log(\n\t\t\t\t`+ @user/${result.skill.username}/${result.skill.name}@${result.version.version}`,\n\t\t\t);\n\t\t\tconsole.log(`Checksum: ${result.version.checksum}`);\n\t\t} finally {\n\t\t\t// Cleanup\n\t\t\tawait exec(`rm -rf \"${tempDir}\"`).catch(() => {});\n\t\t}\n\t} catch (error) {\n\t\tif (error instanceof Error) {\n\t\t\tconsole.error(`Error: ${error.message}`);\n\t\t} else {\n\t\t\tconsole.error(`Error: ${String(error)}`);\n\t\t}\n\t\tprocess.exit(1);\n\t}\n}\n\n// Keep old export name for backwards compatibility\nexport { publishCommand as publish };\n","import { rm } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { getSkillsDir, requireApiKey } from \"../config.js\";\nimport { listLockfileSkills, removeFromLockfile } from \"../lockfile.js\";\n\nexport async function remove(nameOrSpecifier: string): Promise<void> {\n\ttry {\n\t\tawait requireApiKey();\n\n\t\t// Normalize the name\n\t\tlet fullName: string;\n\t\tlet username: string;\n\t\tlet name: string;\n\n\t\tif (nameOrSpecifier.startsWith(\"@user/\")) {\n\t\t\t// Full specifier: @user/{username}/{name}\n\t\t\tconst match = nameOrSpecifier.match(/^@user\\/([^/]+)\\/([^@/]+)/);\n\t\t\tif (!match) {\n\t\t\t\tconsole.error(`Error: Invalid skill specifier: ${nameOrSpecifier}`);\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\t\t\tfullName = `@user/${match[1]}/${match[2]}`;\n\t\t\tusername = match[1];\n\t\t\tname = match[2];\n\t\t} else {\n\t\t\t// Short name - find in lockfile\n\t\t\tconst skills = await listLockfileSkills();\n\t\t\tconst found = skills.find((s) => {\n\t\t\t\tconst match = s.name.match(/^@user\\/([^/]+)\\/([^/]+)$/);\n\t\t\t\treturn match && match[2] === nameOrSpecifier;\n\t\t\t});\n\n\t\t\tif (!found) {\n\t\t\t\tconsole.error(\n\t\t\t\t\t`Error: Skill \"${nameOrSpecifier}\" not found in lockfile`,\n\t\t\t\t);\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\n\t\t\tfullName = found.name;\n\t\t\tconst match = fullName.match(/^@user\\/([^/]+)\\/([^/]+)$/);\n\t\t\tif (!match) {\n\t\t\t\tconsole.error(`Error: Invalid skill name in lockfile: ${fullName}`);\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\t\t\tusername = match[1];\n\t\t\tname = match[2];\n\t\t}\n\n\t\tconsole.log(`Removing ${fullName}...`);\n\n\t\t// Remove from lockfile\n\t\tconst removed = await removeFromLockfile(fullName);\n\t\tif (!removed) {\n\t\t\tconsole.error(`Error: ${fullName} not found in lockfile`);\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\t// Remove from disk\n\t\tconst skillsDir = getSkillsDir();\n\t\tconst destDir = join(skillsDir, username, name);\n\n\t\ttry {\n\t\t\tawait rm(destDir, { recursive: true, force: true });\n\t\t} catch {\n\t\t\t// Ignore errors if directory doesn't exist\n\t\t}\n\n\t\tconsole.log(`Removed ${fullName}`);\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : \"Unknown error\";\n\t\tconsole.error(`Error: ${message}`);\n\t\tprocess.exit(1);\n\t}\n}\n","import { parseSkillSpecifier } from \"@repo/pspm-types\";\nimport { configure, deleteSkill, deleteSkillVersion } from \"../api-client.js\";\nimport { getRegistryUrl, requireApiKey } from \"../config.js\";\nimport { extractApiErrorMessage } from \"../errors.js\";\n\nexport interface UnpublishOptions {\n\tforce?: boolean;\n}\n\nexport async function unpublish(\n\tspecifier: string,\n\toptions: UnpublishOptions,\n): Promise<void> {\n\ttry {\n\t\tconst apiKey = await requireApiKey();\n\t\tconst registryUrl = await getRegistryUrl();\n\n\t\t// Parse the specifier\n\t\tconst parsed = parseSkillSpecifier(specifier);\n\t\tif (!parsed) {\n\t\t\tconsole.error(\n\t\t\t\t`Error: Invalid skill specifier \"${specifier}\". Use format: @user/{username}/{name}[@{version}]`,\n\t\t\t);\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\tconst { username, name, versionRange } = parsed;\n\n\t\t// Configure SDK (use direct REST endpoints, not oRPC)\n\t\tconfigure({ registryUrl, apiKey });\n\n\t\tif (versionRange) {\n\t\t\t// Delete specific version\n\t\t\tconsole.log(`Unpublishing ${specifier}...`);\n\n\t\t\tif (!options.force) {\n\t\t\t\tconsole.error(\n\t\t\t\t\t\"Warning: This action is irreversible. Use --force to confirm.\",\n\t\t\t\t);\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\n\t\t\tconst response = await deleteSkillVersion(name, versionRange);\n\t\t\tif (response.status !== 200) {\n\t\t\t\tconst errorMessage = extractApiErrorMessage(\n\t\t\t\t\tresponse,\n\t\t\t\t\t\"Failed to unpublish. Version may not exist.\",\n\t\t\t\t);\n\t\t\t\tconsole.error(`Error: ${errorMessage}`);\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\t\t\tconsole.log(`Unpublished @user/${username}/${name}@${versionRange}`);\n\t\t} else {\n\t\t\t// Delete entire skill\n\t\t\tconsole.log(`Unpublishing all versions of @user/${username}/${name}...`);\n\n\t\t\tif (!options.force) {\n\t\t\t\tconsole.error(\n\t\t\t\t\t\"Warning: This will delete ALL versions. Use --force to confirm.\",\n\t\t\t\t);\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\n\t\t\tconst response = await deleteSkill(name);\n\t\t\tif (response.status !== 200) {\n\t\t\t\tconst errorMessage = extractApiErrorMessage(\n\t\t\t\t\tresponse,\n\t\t\t\t\t\"Failed to unpublish. Skill may not exist.\",\n\t\t\t\t);\n\t\t\t\tconsole.error(`Error: ${errorMessage}`);\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\t\t\tconsole.log(`Unpublished @user/${username}/${name} (all versions)`);\n\t\t}\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : \"Unknown error\";\n\t\tconsole.error(`Error: ${message}`);\n\t\tprocess.exit(1);\n\t}\n}\n","import { resolveVersion } from \"@repo/pspm-types\";\nimport { configure, listSkillVersions } from \"../api-client.js\";\nimport { getRegistryUrl, requireApiKey } from \"../config.js\";\nimport { extractApiErrorMessage } from \"../errors.js\";\nimport { listLockfileSkills } from \"../lockfile.js\";\nimport { add } from \"./add.js\";\n\nexport interface UpdateOptions {\n\tdryRun?: boolean;\n}\n\nexport async function update(options: UpdateOptions): Promise<void> {\n\ttry {\n\t\tconst apiKey = await requireApiKey();\n\t\tconst registryUrl = await getRegistryUrl();\n\n\t\tconst skills = await listLockfileSkills();\n\n\t\tif (skills.length === 0) {\n\t\t\tconsole.log(\"No skills installed.\");\n\t\t\treturn;\n\t\t}\n\n\t\t// Configure SDK (use direct REST endpoints, not oRPC)\n\t\tconfigure({ registryUrl, apiKey });\n\n\t\tconst updates: Array<{\n\t\t\tname: string;\n\t\t\tcurrent: string;\n\t\t\tlatest: string;\n\t\t}> = [];\n\n\t\tconsole.log(\"Checking for updates...\\n\");\n\n\t\tfor (const { name, entry } of skills) {\n\t\t\tconst match = name.match(/^@user\\/([^/]+)\\/([^/]+)$/);\n\t\t\tif (!match) continue;\n\n\t\t\tconst [, username, skillName] = match;\n\n\t\t\ttry {\n\t\t\t\tconst versionsResponse = await listSkillVersions(username, skillName);\n\t\t\t\tif (versionsResponse.status !== 200) {\n\t\t\t\t\tconst errorMessage = extractApiErrorMessage(\n\t\t\t\t\t\tversionsResponse,\n\t\t\t\t\t\t\"Failed to fetch versions\",\n\t\t\t\t\t);\n\t\t\t\t\tconsole.warn(` Warning: ${name}: ${errorMessage}`);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconst versions = versionsResponse.data;\n\t\t\t\tif (versions.length === 0) continue;\n\n\t\t\t\tconst versionStrings = versions.map(\n\t\t\t\t\t(v: { version: string }) => v.version,\n\t\t\t\t);\n\t\t\t\tconst latest = resolveVersion(\"*\", versionStrings);\n\n\t\t\t\tif (latest && latest !== entry.version) {\n\t\t\t\t\tupdates.push({\n\t\t\t\t\t\tname,\n\t\t\t\t\t\tcurrent: entry.version,\n\t\t\t\t\t\tlatest,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\tconsole.warn(` Warning: Could not check updates for ${name}`);\n\t\t\t}\n\t\t}\n\n\t\tif (updates.length === 0) {\n\t\t\tconsole.log(\"All skills are up to date.\");\n\t\t\treturn;\n\t\t}\n\n\t\tconsole.log(\"Updates available:\\n\");\n\t\tfor (const { name, current, latest } of updates) {\n\t\t\tconsole.log(` ${name}: ${current} -> ${latest}`);\n\t\t}\n\n\t\tif (options.dryRun) {\n\t\t\tconsole.log(\"\\nDry run - no changes made.\");\n\t\t\treturn;\n\t\t}\n\n\t\tconsole.log(\"\\nUpdating...\\n\");\n\n\t\tfor (const { name, latest } of updates) {\n\t\t\tconst match = name.match(/^@user\\/([^/]+)\\/([^/]+)$/);\n\t\t\tif (!match) continue;\n\n\t\t\tconst [, username, skillName] = match;\n\t\t\tconst specifier = `@user/${username}/${skillName}@${latest}`;\n\n\t\t\tawait add(specifier, {});\n\t\t}\n\n\t\tconsole.log(\"\\nAll skills updated.\");\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : \"Unknown error\";\n\t\tconsole.error(`Error: ${message}`);\n\t\tprocess.exit(1);\n\t}\n}\n","import { whoamiRequest } from \"../api-client.js\";\nimport { getRegistryUrl, requireApiKey, resolveConfig } from \"../config.js\";\n\nexport async function whoami(): Promise<void> {\n\ttry {\n\t\tconst resolved = await resolveConfig();\n\t\tconst apiKey = await requireApiKey();\n\t\tconst registryUrl = await getRegistryUrl();\n\n\t\tconst user = await whoamiRequest(registryUrl, apiKey);\n\n\t\tif (user) {\n\t\t\tconsole.log(`Username: ${user.username}`);\n\t\t\tconsole.log(`User ID: ${user.userId}`);\n\t\t\tconsole.log(`Registry: ${registryUrl}`);\n\t\t} else if (resolved.username) {\n\t\t\t// Use cached username if API call fails\n\t\t\tconsole.log(`Username: ${resolved.username} (cached)`);\n\t\t\tconsole.log(`Registry: ${registryUrl}`);\n\t\t} else {\n\t\t\tconsole.error(\"Could not determine current user.\");\n\t\t\tprocess.exit(1);\n\t\t}\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : \"Unknown error\";\n\t\tconsole.error(`Error: ${message}`);\n\t\tprocess.exit(1);\n\t}\n}\n","#!/usr/bin/env node\n\nimport { readFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { Command } from \"commander\";\nimport {\n\tadd,\n\tconfigInit,\n\tconfigShow,\n\tinstall,\n\tlist,\n\tlogin,\n\tlogout,\n\tpublish,\n\tremove,\n\tunpublish,\n\tupdate,\n\twhoami,\n} from \"./commands/index.js\";\n\n// Read version from package.json\nconst __dirname = dirname(fileURLToPath(import.meta.url));\nconst packageJson = JSON.parse(\n\treadFileSync(join(__dirname, \"..\", \"package.json\"), \"utf-8\"),\n);\nconst version: string = packageJson.version;\n\nconst program = new Command();\n\nprogram\n\t.name(\"pspm\")\n\t.description(\"Prompt Skill Package Manager for AnyT\")\n\t.version(version);\n\n// =============================================================================\n// Config commands\n// =============================================================================\n\nconst configCmd = program\n\t.command(\"config\")\n\t.description(\"Manage PSPM configuration\");\n\nconfigCmd\n\t.command(\"show\")\n\t.description(\"Show resolved configuration\")\n\t.action(async () => {\n\t\tawait configShow();\n\t});\n\nconfigCmd\n\t.command(\"init\")\n\t.description(\"Create a .pspmrc file in the current directory\")\n\t.option(\"--registry <url>\", \"Registry URL override\")\n\t.action(async (options) => {\n\t\tawait configInit({\n\t\t\tregistry: options.registry,\n\t\t});\n\t});\n\n// =============================================================================\n// Authentication commands\n// =============================================================================\n\nprogram\n\t.command(\"login\")\n\t.description(\"Log in via browser or with an API key\")\n\t.option(\n\t\t\"--api-key <key>\",\n\t\t\"API key for direct authentication (skips browser)\",\n\t)\n\t.action(async (options) => {\n\t\tawait login({ apiKey: options.apiKey });\n\t});\n\nprogram\n\t.command(\"logout\")\n\t.description(\"Log out and clear stored credentials\")\n\t.action(async () => {\n\t\tawait logout();\n\t});\n\nprogram\n\t.command(\"whoami\")\n\t.description(\"Show current user information\")\n\t.action(async () => {\n\t\tawait whoami();\n\t});\n\n// =============================================================================\n// Skill management commands\n// =============================================================================\n\nprogram\n\t.command(\"add <specifier>\")\n\t.description(\"Add a skill (e.g., @user/bsheng/vite_slides@^2.0.0)\")\n\t.option(\"--save\", \"Save to lockfile (default)\")\n\t.action(async (specifier, options) => {\n\t\tawait add(specifier, { save: options.save ?? true });\n\t});\n\nprogram\n\t.command(\"remove <name>\")\n\t.alias(\"rm\")\n\t.description(\"Remove an installed skill\")\n\t.action(async (name) => {\n\t\tawait remove(name);\n\t});\n\nprogram\n\t.command(\"list\")\n\t.alias(\"ls\")\n\t.description(\"List installed skills\")\n\t.option(\"--json\", \"Output as JSON\")\n\t.action(async (options) => {\n\t\tawait list({ json: options.json });\n\t});\n\nprogram\n\t.command(\"install\")\n\t.alias(\"i\")\n\t.description(\"Install all skills from lockfile\")\n\t.option(\"--frozen-lockfile\", \"Fail if lockfile is missing or outdated\")\n\t.option(\"--dir <path>\", \"Install skills to a specific directory\")\n\t.action(async (options) => {\n\t\tawait install({\n\t\t\tfrozenLockfile: options.frozenLockfile,\n\t\t\tdir: options.dir,\n\t\t});\n\t});\n\nprogram\n\t.command(\"update\")\n\t.description(\"Update all skills to latest compatible versions\")\n\t.option(\"--dry-run\", \"Show what would be updated without making changes\")\n\t.action(async (options) => {\n\t\tawait update({ dryRun: options.dryRun });\n\t});\n\n// =============================================================================\n// Publishing commands\n// =============================================================================\n\nprogram\n\t.command(\"publish\")\n\t.description(\"Publish current directory as a skill\")\n\t.option(\"--bump <level>\", \"Bump version (major, minor, patch)\")\n\t.option(\"--tag <tag>\", \"Tag for the release\")\n\t.action(async (options) => {\n\t\tawait publish({\n\t\t\tbump: options.bump as \"major\" | \"minor\" | \"patch\" | undefined,\n\t\t\ttag: options.tag,\n\t\t});\n\t});\n\nprogram\n\t.command(\"unpublish <specifier>\")\n\t.description(\"Remove a published skill version\")\n\t.option(\"--force\", \"Confirm destructive action\")\n\t.action(async (specifier, options) => {\n\t\tawait unpublish(specifier, { force: options.force });\n\t});\n\nprogram.parse();\n"]}
|