@anytio/pspm 0.6.0 → 0.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/sdk/fetcher.ts","../src/sdk/generated/index.ts","../src/api-client.ts","../src/errors.ts","../src/config.ts","../src/lib/ignore.ts","../src/lib/integrity.ts","../src/lib/lockfile.ts","../src/lib/manifest.ts","../src/lib/version.ts","../src/lib/resolver.ts","../src/lib/specifier.ts","../src/lib/index.ts","../src/agents.ts","../src/github.ts","../src/lockfile.ts","../src/manifest.ts","../src/symlinks.ts","../src/commands/add.ts","../src/commands/access.ts","../src/commands/index.ts","../src/commands/config/init.ts","../src/commands/config/show.ts","../src/commands/deprecate.ts","../src/commands/init.ts","../src/commands/install.ts","../src/commands/link.ts","../src/commands/list.ts","../src/commands/login.ts","../src/commands/logout.ts","../src/commands/migrate.ts","../src/commands/publish.ts","../src/commands/remove.ts","../src/commands/unpublish.ts","../src/commands/update.ts","../src/commands/version.ts","../src/commands/whoami.ts","../src/index.ts"],"names":["version","configure","config","join","readFile","mkdir","writeFile","exec","promisify","stat","dirname","init_lockfile","init_manifest","lstat","rm","isLocalSpecifier","relative","symlink","resolve","basename","confirm","createHash","add","access","URL","exchangeCliToken","readdir","execCb","createInterface","packageJson","semver","__dirname"],"mappings":"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","file":"index.js","sourcesContent":["/**\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\t/** API key for authentication. Optional for public package access. */\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 \"./sdk/fetcher\";\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 * 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\t// Build headers - only include Authorization if apiKey is provided\n\tconst headers: Record<string, string> = {\n\t\t...((options.headers as Record<string, string>) ?? {}),\n\t\t\"Content-Type\": \"application/json\",\n\t};\n\tif (apiKey) {\n\t\theaders.Authorization = `Bearer ${apiKey}`;\n\t}\n\n\tconst response = await fetch(fullUrl, {\n\t\t...options,\n\t\theaders,\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.2.0 🍺\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 '../fetcher';\nexport type ApiKeyPermissionsItem = typeof ApiKeyPermissionsItem[keyof typeof ApiKeyPermissionsItem];\n\n\nexport const ApiKeyPermissionsItem = {\n read: 'read',\n write: 'write',\n delete: 'delete',\n} as const;\n\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 permissions: ApiKeyPermissionsItem[] | null;\n expiresAt: string | null;\n lastUsedAt: string | null;\n createdAt: string | null;\n}\n\nexport type ApiKeyListResponse = ApiKey[];\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: ({\n path: (string | number)[];\n message: string;\n})[];\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\nexport type CreateApiKeyInputPermissionsItem = typeof CreateApiKeyInputPermissionsItem[keyof typeof CreateApiKeyInputPermissionsItem];\n\n\nexport const CreateApiKeyInputPermissionsItem = {\n read: 'read',\n write: 'write',\n delete: 'delete',\n} as const;\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 permissions?: CreateApiKeyInputPermissionsItem[] | 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. Username is immutable once set.\n */\nexport interface UsernameInfo {\n username: string | null;\n isSet: boolean;\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 * Package visibility (private or public)\n */\nexport type Visibility = typeof Visibility[keyof typeof Visibility];\n\n\nexport const Visibility = {\n private: 'private',\n public: 'public',\n} as const;\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 visibility: Visibility;\n}\n\n/**\n * Skill metadata with owner username\n */\nexport type SkillWithUser = Skill & {\n username: string;\n};\n\n/**\n * Skill with download stats for explore/marketplace view\n */\nexport type ExploreSkill = SkillWithUser & {\n weeklyDownloads: number;\n totalDownloads: number;\n};\n\n/**\n * Paginated list of public skills for the marketplace\n */\nexport interface ExploreResponse {\n skills: ExploreSkill[];\n total: number;\n page: number;\n limit: number;\n totalPages: number;\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 metadata with SKILL.md content from latest version\n */\nexport type SkillDetailResponse = SkillWithUser & ({\n skillMd: string | null;\n} | null);\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\nexport type SkillManifestDependencies = {[key: string]: string};\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 dependencies?: SkillManifestDependencies;\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 deprecatedAt?: string | null;\n deprecationMessage?: string | null;\n}\n\n/**\n * A single data point for download statistics\n */\nexport interface DownloadDataPoint {\n date: string | null;\n count: number;\n}\n\n/**\n * Download count for a specific version\n */\nexport interface VersionDownload {\n version: string;\n downloads: number;\n}\n\n/**\n * Download statistics for a skill package\n */\nexport interface SkillStatsResponse {\n totalDownloads: number;\n weeklyDownloads: number;\n monthlyDownloads: number;\n downloadTrend: DownloadDataPoint[];\n versionDownloads: VersionDownload[];\n}\n\n/**\n * Skill version metadata with download URL\n */\nexport type SkillVersionWithDownload = SkillVersion & ({\n downloadUrl: string;\n skillMd?: string | null;\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 14680064 */\n tarballBase64: string;\n visibility?: Visibility;\n}\n\n/**\n * Input for deprecating a skill version\n */\nexport interface DeprecateVersionInput {\n /**\n * @minLength 1\n * @maxLength 500\n */\n message: string;\n}\n\n/**\n * Updated skill after changing visibility\n */\nexport type ChangeAccessResponse = Skill & {\n username: string;\n};\n\n/**\n * Input for changing package visibility\n */\nexport interface ChangeAccessInput {\n visibility: Visibility;\n}\n\n/**\n * Subscription tier level\n */\nexport type SubscriptionTier = typeof SubscriptionTier[keyof typeof SubscriptionTier];\n\n\nexport const SubscriptionTier = {\n free: 'free',\n pro: 'pro',\n} as const;\n\n/**\n * Stripe subscription status\n */\nexport type SubscriptionStatus = typeof SubscriptionStatus[keyof typeof SubscriptionStatus] | null;\n\n\nexport const SubscriptionStatus = {\n active: 'active',\n canceled: 'canceled',\n past_due: 'past_due',\n trialing: 'trialing',\n incomplete: 'incomplete',\n incomplete_expired: 'incomplete_expired',\n unpaid: 'unpaid',\n paused: 'paused',\n} as const;\n\n/**\n * User subscription information\n */\nexport interface SubscriptionInfo {\n tier: SubscriptionTier;\n status: SubscriptionStatus | null;\n priceId: string | null;\n currentPeriodEnd: string | null;\n cancelAtPeriodEnd: boolean;\n}\n\n/**\n * Stripe checkout session URL\n */\nexport interface CheckoutSessionResponse {\n url: string;\n}\n\n/**\n * Billing interval for subscription\n */\nexport type BillingInterval = typeof BillingInterval[keyof typeof BillingInterval];\n\n\nexport const BillingInterval = {\n month: 'month',\n year: 'year',\n} as const;\n\n/**\n * Input for creating a Stripe checkout session\n */\nexport interface CreateCheckoutInput {\n interval: BillingInterval;\n successUrl?: string;\n cancelUrl?: string;\n}\n\n/**\n * Stripe customer portal URL\n */\nexport interface PortalSessionResponse {\n url: string;\n}\n\n/**\n * Input for creating a Stripe customer portal session\n */\nexport interface CreatePortalInput {\n returnUrl?: 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\nexport type ExplorePublicSkillsParams = {\nsearch?: string;\nsort?: ExplorePublicSkillsSort;\n/**\n * @minimum 1\n */\npage?: number;\n/**\n * @minimum 1\n * @maximum 100\n */\nlimit?: number;\n};\n\nexport type ExplorePublicSkillsSort = typeof ExplorePublicSkillsSort[keyof typeof ExplorePublicSkillsSort];\n\n\nexport const ExplorePublicSkillsSort = {\n downloads: 'downloads',\n recent: 'recent',\n name: 'name',\n} as const;\n\nexport type GetSkillStatsParams = {\nperiod?: GetSkillStatsPeriod;\n};\n\nexport type GetSkillStatsPeriod = typeof GetSkillStatsPeriod[keyof typeof GetSkillStatsPeriod];\n\n\nexport const GetSkillStatsPeriod = {\n day: 'day',\n week: 'week',\n month: 'month',\n year: 'year',\n} as const;\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 it has been set\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 * Set the current user's username. This is a one-time operation - username cannot be changed after being set (npm-style).\n * @summary Set username (one-time)\n */\nexport type setUsernameResponse200 = {\n data: UpdateUsernameOutput\n status: 200\n}\n\nexport type setUsernameResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type setUsernameResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type setUsernameResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type setUsernameResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type setUsernameResponse500 = {\n data: ApiError\n status: 500\n}\n \nexport type setUsernameResponseSuccess = (setUsernameResponse200) & {\n headers: Headers;\n};\nexport type setUsernameResponseError = (setUsernameResponse400 | setUsernameResponse401 | setUsernameResponse403 | setUsernameResponse404 | setUsernameResponse500) & {\n headers: Headers;\n};\n\nexport type setUsernameResponse = (setUsernameResponseSuccess | setUsernameResponseError)\n\nexport const getSetUsernameUrl = () => {\n\n\n \n\n return `/api/auth/username`\n}\n\nexport const setUsername = async (updateUsernameInput: UpdateUsernameInput, options?: RequestInit): Promise<setUsernameResponse> => {\n \n return customFetch<setUsernameResponse>(getSetUsernameUrl(),\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. This endpoint is public and can be called during signup.\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 * Browse and search all public skills. No authentication required.\n * @summary Explore public skills\n */\nexport type explorePublicSkillsResponse200 = {\n data: ExploreResponse\n status: 200\n}\n\nexport type explorePublicSkillsResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type explorePublicSkillsResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type explorePublicSkillsResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type explorePublicSkillsResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type explorePublicSkillsResponse500 = {\n data: ApiError\n status: 500\n}\n \nexport type explorePublicSkillsResponseSuccess = (explorePublicSkillsResponse200) & {\n headers: Headers;\n};\nexport type explorePublicSkillsResponseError = (explorePublicSkillsResponse400 | explorePublicSkillsResponse401 | explorePublicSkillsResponse403 | explorePublicSkillsResponse404 | explorePublicSkillsResponse500) & {\n headers: Headers;\n};\n\nexport type explorePublicSkillsResponse = (explorePublicSkillsResponseSuccess | explorePublicSkillsResponseError)\n\nexport const getExplorePublicSkillsUrl = (params?: ExplorePublicSkillsParams,) => {\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/skills/-/explore?${stringifiedParams}` : `/api/skills/-/explore`\n}\n\nexport const explorePublicSkills = async (params?: ExplorePublicSkillsParams, options?: RequestInit): Promise<explorePublicSkillsResponse> => {\n \n return customFetch<explorePublicSkillsResponse>(getExplorePublicSkillsUrl(params),\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/-/mine`\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: SkillDetailResponse\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 * 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 = (username: Username,\n name: SkillName,) => {\n\n\n \n\n return `/api/skills/@user/${username}/${name}`\n}\n\nexport const deleteSkill = async (username: Username,\n name: SkillName, options?: RequestInit): Promise<deleteSkillResponse> => {\n \n return customFetch<deleteSkillResponse>(getDeleteSkillUrl(username,name),\n { \n ...options,\n method: 'DELETE'\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 download statistics for a skill package, including total downloads, weekly/monthly counts, and download trends over time.\n * @summary Get skill download statistics\n */\nexport type getSkillStatsResponse200 = {\n data: SkillStatsResponse\n status: 200\n}\n\nexport type getSkillStatsResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type getSkillStatsResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type getSkillStatsResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type getSkillStatsResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type getSkillStatsResponse500 = {\n data: ApiError\n status: 500\n}\n \nexport type getSkillStatsResponseSuccess = (getSkillStatsResponse200) & {\n headers: Headers;\n};\nexport type getSkillStatsResponseError = (getSkillStatsResponse400 | getSkillStatsResponse401 | getSkillStatsResponse403 | getSkillStatsResponse404 | getSkillStatsResponse500) & {\n headers: Headers;\n};\n\nexport type getSkillStatsResponse = (getSkillStatsResponseSuccess | getSkillStatsResponseError)\n\nexport const getGetSkillStatsUrl = (username: Username,\n name: SkillName,\n params?: GetSkillStatsParams,) => {\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/skills/@user/${username}/${name}/stats?${stringifiedParams}` : `/api/skills/@user/${username}/${name}/stats`\n}\n\nexport const getSkillStats = async (username: Username,\n name: SkillName,\n params?: GetSkillStatsParams, options?: RequestInit): Promise<getSkillStatsResponse> => {\n \n return customFetch<getSkillStatsResponse>(getGetSkillStatsUrl(username,name,params),\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}/versions/${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 * Delete a specific version of a skill (owner only). Only allowed within 72 hours of publishing. After that, use deprecate instead.\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 = (username: Username,\n name: SkillName,\n version: Semver,) => {\n\n\n \n\n return `/api/skills/@user/${username}/${name}/versions/${version}`\n}\n\nexport const deleteSkillVersion = async (username: Username,\n name: SkillName,\n version: Semver, options?: RequestInit): Promise<deleteSkillVersionResponse> => {\n \n return customFetch<deleteSkillVersionResponse>(getDeleteSkillVersionUrl(username,name,version),\n { \n ...options,\n method: 'DELETE'\n \n \n }\n);}\n\n\n\n/**\n * Download the tarball for a specific skill version. Redirects to a presigned URL.\n * @summary Download skill version\n */\nexport type downloadSkillVersionResponse302 = {\n data: void\n status: 302\n}\n\nexport type downloadSkillVersionResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type downloadSkillVersionResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type downloadSkillVersionResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type downloadSkillVersionResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type downloadSkillVersionResponse500 = {\n data: ApiError\n status: 500\n}\n \n;\nexport type downloadSkillVersionResponseError = (downloadSkillVersionResponse302 | downloadSkillVersionResponse400 | downloadSkillVersionResponse401 | downloadSkillVersionResponse403 | downloadSkillVersionResponse404 | downloadSkillVersionResponse500) & {\n headers: Headers;\n};\n\nexport type downloadSkillVersionResponse = (downloadSkillVersionResponseError)\n\nexport const getDownloadSkillVersionUrl = (username: Username,\n name: SkillName,\n version: Semver,) => {\n\n\n \n\n return `/api/skills/@user/${username}/${name}/versions/${version}/download`\n}\n\nexport const downloadSkillVersion = async (username: Username,\n name: SkillName,\n version: Semver, options?: RequestInit): Promise<downloadSkillVersionResponse> => {\n \n return customFetch<downloadSkillVersionResponse>(getDownloadSkillVersionUrl(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 * Mark a skill version as deprecated with a message. Deprecated versions are still downloadable but show warnings to users.\n * @summary Deprecate skill version\n */\nexport type deprecateSkillVersionResponse200 = {\n data: SkillVersion\n status: 200\n}\n\nexport type deprecateSkillVersionResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type deprecateSkillVersionResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type deprecateSkillVersionResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type deprecateSkillVersionResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type deprecateSkillVersionResponse500 = {\n data: ApiError\n status: 500\n}\n \nexport type deprecateSkillVersionResponseSuccess = (deprecateSkillVersionResponse200) & {\n headers: Headers;\n};\nexport type deprecateSkillVersionResponseError = (deprecateSkillVersionResponse400 | deprecateSkillVersionResponse401 | deprecateSkillVersionResponse403 | deprecateSkillVersionResponse404 | deprecateSkillVersionResponse500) & {\n headers: Headers;\n};\n\nexport type deprecateSkillVersionResponse = (deprecateSkillVersionResponseSuccess | deprecateSkillVersionResponseError)\n\nexport const getDeprecateSkillVersionUrl = (username: Username,\n name: SkillName,\n version: Semver,) => {\n\n\n \n\n return `/api/skills/@user/${username}/${name}/versions/${version}/deprecate`\n}\n\nexport const deprecateSkillVersion = async (username: Username,\n name: SkillName,\n version: Semver,\n deprecateVersionInput: DeprecateVersionInput, options?: RequestInit): Promise<deprecateSkillVersionResponse> => {\n \n return customFetch<deprecateSkillVersionResponse>(getDeprecateSkillVersionUrl(username,name,version),\n { \n ...options,\n method: 'POST',\n headers: { 'Content-Type': 'application/json', ...options?.headers },\n body: JSON.stringify(\n deprecateVersionInput,)\n }\n);}\n\n\n\n/**\n * Remove the deprecation status from a skill version.\n * @summary Remove deprecation from skill version\n */\nexport type undeprecateSkillVersionResponse200 = {\n data: SkillVersion\n status: 200\n}\n\nexport type undeprecateSkillVersionResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type undeprecateSkillVersionResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type undeprecateSkillVersionResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type undeprecateSkillVersionResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type undeprecateSkillVersionResponse500 = {\n data: ApiError\n status: 500\n}\n \nexport type undeprecateSkillVersionResponseSuccess = (undeprecateSkillVersionResponse200) & {\n headers: Headers;\n};\nexport type undeprecateSkillVersionResponseError = (undeprecateSkillVersionResponse400 | undeprecateSkillVersionResponse401 | undeprecateSkillVersionResponse403 | undeprecateSkillVersionResponse404 | undeprecateSkillVersionResponse500) & {\n headers: Headers;\n};\n\nexport type undeprecateSkillVersionResponse = (undeprecateSkillVersionResponseSuccess | undeprecateSkillVersionResponseError)\n\nexport const getUndeprecateSkillVersionUrl = (username: Username,\n name: SkillName,\n version: Semver,) => {\n\n\n \n\n return `/api/skills/@user/${username}/${name}/versions/${version}/deprecate`\n}\n\nexport const undeprecateSkillVersion = async (username: Username,\n name: SkillName,\n version: Semver, options?: RequestInit): Promise<undeprecateSkillVersionResponse> => {\n \n return customFetch<undeprecateSkillVersionResponse>(getUndeprecateSkillVersionUrl(username,name,version),\n { \n ...options,\n method: 'DELETE'\n \n \n }\n);}\n\n\n\n/**\n * Change the visibility of a skill. Private packages can be made public, but public packages cannot be made private (this is irreversible, like npm).\n * @summary Change skill visibility\n */\nexport type changeSkillAccessResponse200 = {\n data: ChangeAccessResponse\n status: 200\n}\n\nexport type changeSkillAccessResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type changeSkillAccessResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type changeSkillAccessResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type changeSkillAccessResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type changeSkillAccessResponse500 = {\n data: ApiError\n status: 500\n}\n \nexport type changeSkillAccessResponseSuccess = (changeSkillAccessResponse200) & {\n headers: Headers;\n};\nexport type changeSkillAccessResponseError = (changeSkillAccessResponse400 | changeSkillAccessResponse401 | changeSkillAccessResponse403 | changeSkillAccessResponse404 | changeSkillAccessResponse500) & {\n headers: Headers;\n};\n\nexport type changeSkillAccessResponse = (changeSkillAccessResponseSuccess | changeSkillAccessResponseError)\n\nexport const getChangeSkillAccessUrl = (username: Username,\n name: SkillName,) => {\n\n\n \n\n return `/api/skills/@user/${username}/${name}/access`\n}\n\nexport const changeSkillAccess = async (username: Username,\n name: SkillName,\n changeAccessInput: ChangeAccessInput, options?: RequestInit): Promise<changeSkillAccessResponse> => {\n \n return customFetch<changeSkillAccessResponse>(getChangeSkillAccessUrl(username,name),\n { \n ...options,\n method: 'POST',\n headers: { 'Content-Type': 'application/json', ...options?.headers },\n body: JSON.stringify(\n changeAccessInput,)\n }\n);}\n\n\n\n/**\n * Retrieve the current user's subscription information\n * @summary Get current subscription\n */\nexport type getSubscriptionResponse200 = {\n data: SubscriptionInfo\n status: 200\n}\n\nexport type getSubscriptionResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type getSubscriptionResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type getSubscriptionResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type getSubscriptionResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type getSubscriptionResponse500 = {\n data: ApiError\n status: 500\n}\n \nexport type getSubscriptionResponseSuccess = (getSubscriptionResponse200) & {\n headers: Headers;\n};\nexport type getSubscriptionResponseError = (getSubscriptionResponse400 | getSubscriptionResponse401 | getSubscriptionResponse403 | getSubscriptionResponse404 | getSubscriptionResponse500) & {\n headers: Headers;\n};\n\nexport type getSubscriptionResponse = (getSubscriptionResponseSuccess | getSubscriptionResponseError)\n\nexport const getGetSubscriptionUrl = () => {\n\n\n \n\n return `/api/billing/subscription`\n}\n\nexport const getSubscription = async ( options?: RequestInit): Promise<getSubscriptionResponse> => {\n \n return customFetch<getSubscriptionResponse>(getGetSubscriptionUrl(),\n { \n ...options,\n method: 'GET'\n \n \n }\n);}\n\n\n\n/**\n * Create a Stripe checkout session for upgrading to Pro\n * @summary Create checkout session\n */\nexport type createCheckoutSessionResponse200 = {\n data: CheckoutSessionResponse\n status: 200\n}\n\nexport type createCheckoutSessionResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type createCheckoutSessionResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type createCheckoutSessionResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type createCheckoutSessionResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type createCheckoutSessionResponse500 = {\n data: ApiError\n status: 500\n}\n \nexport type createCheckoutSessionResponseSuccess = (createCheckoutSessionResponse200) & {\n headers: Headers;\n};\nexport type createCheckoutSessionResponseError = (createCheckoutSessionResponse400 | createCheckoutSessionResponse401 | createCheckoutSessionResponse403 | createCheckoutSessionResponse404 | createCheckoutSessionResponse500) & {\n headers: Headers;\n};\n\nexport type createCheckoutSessionResponse = (createCheckoutSessionResponseSuccess | createCheckoutSessionResponseError)\n\nexport const getCreateCheckoutSessionUrl = () => {\n\n\n \n\n return `/api/billing/checkout`\n}\n\nexport const createCheckoutSession = async (createCheckoutInput: CreateCheckoutInput, options?: RequestInit): Promise<createCheckoutSessionResponse> => {\n \n return customFetch<createCheckoutSessionResponse>(getCreateCheckoutSessionUrl(),\n { \n ...options,\n method: 'POST',\n headers: { 'Content-Type': 'application/json', ...options?.headers },\n body: JSON.stringify(\n createCheckoutInput,)\n }\n);}\n\n\n\n/**\n * Create a Stripe customer portal session for managing subscription\n * @summary Create customer portal session\n */\nexport type createPortalSessionResponse200 = {\n data: PortalSessionResponse\n status: 200\n}\n\nexport type createPortalSessionResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type createPortalSessionResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type createPortalSessionResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type createPortalSessionResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type createPortalSessionResponse500 = {\n data: ApiError\n status: 500\n}\n \nexport type createPortalSessionResponseSuccess = (createPortalSessionResponse200) & {\n headers: Headers;\n};\nexport type createPortalSessionResponseError = (createPortalSessionResponse400 | createPortalSessionResponse401 | createPortalSessionResponse403 | createPortalSessionResponse404 | createPortalSessionResponse500) & {\n headers: Headers;\n};\n\nexport type createPortalSessionResponse = (createPortalSessionResponseSuccess | createPortalSessionResponseError)\n\nexport const getCreatePortalSessionUrl = () => {\n\n\n \n\n return `/api/billing/portal`\n}\n\nexport const createPortalSession = async (createPortalInput: CreatePortalInput, options?: RequestInit): Promise<createPortalSessionResponse> => {\n \n return customFetch<createPortalSessionResponse>(getCreatePortalSessionUrl(),\n { \n ...options,\n method: 'POST',\n headers: { 'Content-Type': 'application/json', ...options?.headers },\n body: JSON.stringify(\n createPortalInput,)\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\tgetConfig,\n\tisConfigured,\n\ttype SDKConfig,\n\tSDKError,\n\tconfigure as sdkConfigure,\n} from \"./sdk/fetcher\";\nimport {\n\tdeleteSkill,\n\tdeleteSkillVersion,\n\texchangeCliToken,\n\tgetSkill,\n\tgetSkillVersion,\n\tlistMySkills,\n\tlistSkillVersions,\n\tlistUserSkills,\n\tme,\n\tpublishSkill,\n} from \"./sdk/generated\";\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/**\n * Deprecate a skill version\n */\nexport async function deprecateSkillVersion(\n\tusername: string,\n\tskillName: string,\n\tversion: string,\n\tmessage: string,\n): Promise<{ status: number; data?: unknown; error?: string }> {\n\tconst config = getConfig();\n\tif (!config) {\n\t\treturn { status: 401, error: \"SDK not configured\" };\n\t}\n\n\ttry {\n\t\tconst response = await fetch(\n\t\t\t`${config.baseUrl}/api/skills/@user/${username}/${skillName}/versions/${version}/deprecate`,\n\t\t\t{\n\t\t\t\tmethod: \"POST\",\n\t\t\t\theaders: {\n\t\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\t\tAuthorization: `Bearer ${config.apiKey}`,\n\t\t\t\t},\n\t\t\t\tbody: JSON.stringify({ message }),\n\t\t\t},\n\t\t);\n\n\t\tif (!response.ok) {\n\t\t\tconst error = await response.text();\n\t\t\treturn { status: response.status, error };\n\t\t}\n\n\t\tconst data = await response.json();\n\t\treturn { status: response.status, data };\n\t} catch (error) {\n\t\treturn {\n\t\t\tstatus: 500,\n\t\t\terror: error instanceof Error ? error.message : \"Unknown error\",\n\t\t};\n\t}\n}\n\n/**\n * Remove deprecation from a skill version\n */\nexport async function undeprecateSkillVersion(\n\tusername: string,\n\tskillName: string,\n\tversion: string,\n): Promise<{ status: number; data?: unknown; error?: string }> {\n\tconst config = getConfig();\n\tif (!config) {\n\t\treturn { status: 401, error: \"SDK not configured\" };\n\t}\n\n\ttry {\n\t\tconst response = await fetch(\n\t\t\t`${config.baseUrl}/api/skills/@user/${username}/${skillName}/versions/${version}/deprecate`,\n\t\t\t{\n\t\t\t\tmethod: \"DELETE\",\n\t\t\t\theaders: {\n\t\t\t\t\tAuthorization: `Bearer ${config.apiKey}`,\n\t\t\t\t},\n\t\t\t},\n\t\t);\n\n\t\tif (!response.ok) {\n\t\t\tconst error = await response.text();\n\t\t\treturn { status: response.status, error };\n\t\t}\n\n\t\tconst data = await response.json();\n\t\treturn { status: response.status, data };\n\t} catch (error) {\n\t\treturn {\n\t\t\tstatus: 500,\n\t\t\terror: error instanceof Error ? error.message : \"Unknown error\",\n\t\t};\n\t}\n}\n\n/**\n * Change skill visibility (public/private)\n */\nexport async function changeSkillAccess(\n\tusername: string,\n\tskillName: string,\n\tinput: { visibility: \"public\" | \"private\" },\n): Promise<{\n\tstatus: number;\n\tdata?: {\n\t\tid: string;\n\t\tname: string;\n\t\tusername: string;\n\t\tdescription: string | null;\n\t\tvisibility: \"public\" | \"private\";\n\t\tcreatedAt: string;\n\t\tupdatedAt: string;\n\t};\n\terror?: string;\n}> {\n\tconst config = getConfig();\n\tif (!config) {\n\t\treturn { status: 401, error: \"SDK not configured\" };\n\t}\n\n\ttry {\n\t\tconst response = await fetch(\n\t\t\t`${config.baseUrl}/api/skills/@user/${username}/${skillName}/access`,\n\t\t\t{\n\t\t\t\tmethod: \"POST\",\n\t\t\t\theaders: {\n\t\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\t\tAuthorization: `Bearer ${config.apiKey}`,\n\t\t\t\t},\n\t\t\t\tbody: JSON.stringify(input),\n\t\t\t},\n\t\t);\n\n\t\tif (!response.ok) {\n\t\t\tconst error = await response.text();\n\t\t\ttry {\n\t\t\t\tconst errorJson = JSON.parse(error);\n\t\t\t\treturn {\n\t\t\t\t\tstatus: response.status,\n\t\t\t\t\terror: errorJson.message || errorJson.error || error,\n\t\t\t\t};\n\t\t\t} catch {\n\t\t\t\treturn { status: response.status, error };\n\t\t\t}\n\t\t}\n\n\t\tconst data = (await response.json()) as {\n\t\t\tid: string;\n\t\t\tname: string;\n\t\t\tusername: string;\n\t\t\tdescription: string | null;\n\t\t\tvisibility: \"public\" | \"private\";\n\t\t\tcreatedAt: string;\n\t\t\tupdatedAt: string;\n\t\t};\n\t\treturn { status: response.status, data };\n\t} catch (error) {\n\t\treturn {\n\t\t\tstatus: 500,\n\t\t\terror: error instanceof Error ? error.message : \"Unknown error\",\n\t\t};\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 * Get a human-readable description for common HTTP status codes\n */\nfunction getHttpStatusDescription(status: number): string {\n\tconst descriptions: Record<number, string> = {\n\t\t400: \"Bad Request - The request was malformed\",\n\t\t401: \"Unauthorized - Please run 'pspm login' first\",\n\t\t403: \"Forbidden - You don't have permission for this action\",\n\t\t404: \"Not Found - The endpoint or resource doesn't exist\",\n\t\t409: \"Conflict - The resource already exists or there's a version conflict\",\n\t\t422: \"Validation Error - The request data is invalid\",\n\t\t429: \"Too Many Requests - Please slow down and try again\",\n\t\t500: \"Internal Server Error - Something went wrong on the server\",\n\t\t502: \"Bad Gateway - The server is temporarily unavailable\",\n\t\t503: \"Service Unavailable - The server is temporarily unavailable\",\n\t};\n\treturn descriptions[status] || `HTTP Error ${status}`;\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\t// Handle cases where errorData is a string (like \"Not Found\" from 404)\n\tif (typeof errorData === \"string\") {\n\t\tif (response.status === 404) {\n\t\t\treturn `${fallbackMessage}: ${getHttpStatusDescription(404)}\\nThe registry endpoint may be unavailable or misconfigured.`;\n\t\t}\n\t\treturn `${fallbackMessage}: ${errorData} (HTTP ${response.status})`;\n\t}\n\n\t// Handle empty or null response\n\tif (!errorData || typeof errorData !== \"object\") {\n\t\tconst statusDesc = getHttpStatusDescription(response.status);\n\t\tif (response.status === 404) {\n\t\t\treturn `${fallbackMessage}: ${statusDesc}\\nCheck that the registry URL is correct in your config.`;\n\t\t}\n\t\treturn `${fallbackMessage}: ${statusDesc}`;\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 HTTP status context for non-200 responses\n\tif (response.status >= 400) {\n\t\terrorMessage += ` (HTTP ${response.status})`;\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\";\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/**\n * User config stored in ~/.pspmrc (INI format)\n *\n * Supports npm-style configuration:\n * - registry = https://pspm.dev (default registry)\n * - authToken = sk_default (default auth token)\n * - @scope:registry = https://corp.pspm.io (scope to registry mapping)\n * - //host:authToken = sk_token (per-registry tokens)\n */\nexport interface UserConfig {\n\tregistry?: string;\n\tauthToken?: string;\n\tusername?: string;\n\t/** Scope to registry URL mappings (e.g., @myorg -> https://corp.pspm.io) */\n\tscopedRegistries?: Record<string, string>;\n\t/** Host to auth token mappings (e.g., pspm.dev -> sk_xxx) */\n\tregistryTokens?: Record<string, 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\t/** Scope to registry URL mappings */\n\tscopedRegistries: Record<string, string>;\n\t/** Host to auth token mappings */\n\tregistryTokens: Record<string, 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://registry.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 .pspm directory path (for current project)\n */\nexport function getPspmDir(): string {\n\treturn join(process.cwd(), \".pspm\");\n}\n\n/**\n * Get the skills directory path (for current project)\n * New path: .pspm/skills/\n */\nexport function getSkillsDir(): string {\n\treturn join(process.cwd(), \".pspm\", \"skills\");\n}\n\n/**\n * Get the cache directory path (for current project)\n * Used for tarball caching: .pspm/cache/\n */\nexport function getCacheDir(): string {\n\treturn join(process.cwd(), \".pspm\", \"cache\");\n}\n\n/**\n * Get the lockfile path (for current project)\n * New path: pspm-lock.json (at project root, npm-style)\n */\nexport function getLockfilePath(): string {\n\treturn join(process.cwd(), \"pspm-lock.json\");\n}\n\n/**\n * Get the legacy lockfile path (for migration)\n */\nexport function getLegacyLockfilePath(): string {\n\treturn join(process.cwd(), \"skill-lock.json\");\n}\n\n/**\n * Get the legacy skills directory path (for migration)\n */\nexport function getLegacySkillsDir(): string {\n\treturn join(process.cwd(), \".skills\");\n}\n\n// =============================================================================\n// INI Config Functions\n// =============================================================================\n\n/**\n * Read the user config file (~/.pspmrc, INI format)\n *\n * Supports npm-style configuration:\n * ```ini\n * ; Default registry and auth\n * registry = https://pspm.dev\n * authToken = sk_default\n *\n * ; Scope mappings\n * @myorg:registry = https://corp.pspm.io\n *\n * ; Per-registry tokens\n * //pspm.dev:authToken = sk_public\n * //corp.pspm.io:authToken = sk_corp\n * ```\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\t// Extract scoped registries (@scope:registry = url)\n\t\tconst scopedRegistries: Record<string, string> = {};\n\t\tfor (const key of Object.keys(parsed)) {\n\t\t\tconst scopeMatch = key.match(/^(@[^:]+):registry$/);\n\t\t\tif (scopeMatch) {\n\t\t\t\tconst scope = scopeMatch[1];\n\t\t\t\tscopedRegistries[scope] = parsed[key] as string;\n\t\t\t}\n\t\t}\n\n\t\t// Extract per-registry tokens (//host:authToken = token)\n\t\t// INI parser may nest these under a key like \"//host\"\n\t\tconst registryTokens: Record<string, string> = {};\n\t\tfor (const key of Object.keys(parsed)) {\n\t\t\t// Check for //host:authToken format\n\t\t\tconst tokenMatch = key.match(/^\\/\\/([^:]+):authToken$/);\n\t\t\tif (tokenMatch) {\n\t\t\t\tconst host = tokenMatch[1];\n\t\t\t\tregistryTokens[host] = parsed[key] as string;\n\t\t\t}\n\t\t\t// Also check for nested format (ini parser may parse //host as a section)\n\t\t\tif (key.startsWith(\"//\") && typeof parsed[key] === \"object\") {\n\t\t\t\tconst host = key.slice(2);\n\t\t\t\tconst section = parsed[key] as Record<string, string>;\n\t\t\t\tif (section.authToken) {\n\t\t\t\t\tregistryTokens[host] = section.authToken;\n\t\t\t\t}\n\t\t\t}\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\tscopedRegistries:\n\t\t\t\tObject.keys(scopedRegistries).length > 0 ? scopedRegistries : undefined,\n\t\t\tregistryTokens:\n\t\t\t\tObject.keys(registryTokens).length > 0 ? registryTokens : 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\tconst scopedRegistries = userConfig.scopedRegistries ?? {};\n\tconst registryTokens = userConfig.registryTokens ?? {};\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\tconsole.log(\n\t\t\t`[config] scopedRegistries: ${JSON.stringify(scopedRegistries)}`,\n\t\t);\n\t\tconsole.log(\n\t\t\t`[config] registryTokens: ${Object.keys(registryTokens).length} configured`,\n\t\t);\n\t}\n\n\treturn {\n\t\tregistryUrl,\n\t\tapiKey,\n\t\tusername,\n\t\tscopedRegistries,\n\t\tregistryTokens,\n\t};\n}\n\n// =============================================================================\n// Multi-Registry Helpers\n// =============================================================================\n\n/**\n * Get the auth token for a given registry URL.\n * Falls back to the default API key if no registry-specific token is configured.\n *\n * @param config - The resolved configuration\n * @param registryUrl - The registry URL\n * @returns The auth token to use, or undefined if none available\n */\nexport function getTokenForRegistry(\n\tconfig: ResolvedConfig,\n\tregistryUrl: string,\n): string | undefined {\n\ttry {\n\t\tconst url = new URL(registryUrl);\n\t\tconst host = url.host;\n\n\t\t// Check for host-specific token first\n\t\tif (config.registryTokens[host]) {\n\t\t\treturn config.registryTokens[host];\n\t\t}\n\n\t\t// Fall back to default API key\n\t\treturn config.apiKey;\n\t} catch {\n\t\t// Invalid URL, fall back to default\n\t\treturn config.apiKey;\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\tconfig.authToken = undefined;\n\tconfig.username = undefined;\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 * Ignore file handling for PSPM publish/pack\n *\n * Similar to npm's .npmignore behavior:\n * - If .pspmignore exists, use it\n * - Otherwise, fallback to .gitignore\n * - Always ignore node_modules and .git regardless\n */\n\nimport { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport ignore, { type Ignore } from \"ignore\";\n\n/**\n * Files/directories that are always ignored regardless of ignore file contents\n */\nconst ALWAYS_IGNORED = [\n\t\"node_modules\",\n\t\".git\",\n\t\".pspm-publish\", // temp directory used during publish\n];\n\n/**\n * Result of loading ignore patterns\n */\nexport interface IgnoreLoadResult {\n\t/** The ignore instance with loaded patterns */\n\tig: Ignore;\n\t/** Which file the patterns came from (null if using defaults only) */\n\tsource: \".pspmignore\" | \".gitignore\" | null;\n\t/** Raw patterns loaded from the file (excluding defaults) */\n\tpatterns: string[];\n}\n\n/**\n * Load ignore patterns from .pspmignore or .gitignore\n *\n * Priority:\n * 1. .pspmignore (if exists)\n * 2. .gitignore (if exists)\n * 3. Default patterns only (node_modules, .git)\n *\n * @param cwd - The directory to look for ignore files (defaults to process.cwd())\n * @returns An ignore instance and the source file used\n */\nexport async function loadIgnorePatterns(\n\tcwd: string = process.cwd(),\n): Promise<IgnoreLoadResult> {\n\tconst ig = ignore();\n\n\t// Always add default ignores\n\tig.add(ALWAYS_IGNORED);\n\n\t// Try .pspmignore first\n\tconst pspmIgnorePath = join(cwd, \".pspmignore\");\n\ttry {\n\t\tconst content = await readFile(pspmIgnorePath, \"utf-8\");\n\t\tconst patterns = parseIgnorePatterns(content);\n\t\tig.add(patterns);\n\t\treturn { ig, source: \".pspmignore\", patterns };\n\t} catch {\n\t\t// .pspmignore not found, try .gitignore\n\t}\n\n\t// Fallback to .gitignore\n\tconst gitIgnorePath = join(cwd, \".gitignore\");\n\ttry {\n\t\tconst content = await readFile(gitIgnorePath, \"utf-8\");\n\t\tconst patterns = parseIgnorePatterns(content);\n\t\tig.add(patterns);\n\t\treturn { ig, source: \".gitignore\", patterns };\n\t} catch {\n\t\t// No .gitignore either, use defaults only\n\t}\n\n\treturn { ig, source: null, patterns: [] };\n}\n\n/**\n * Create rsync exclude arguments from ignore patterns\n *\n * @param ig - The ignore instance\n * @returns Array of --exclude='pattern' arguments for rsync\n */\nexport function getExcludeArgsForRsync(patterns: string[]): string {\n\t// Always include the essential excludes\n\tconst allPatterns = [...new Set([...ALWAYS_IGNORED, ...patterns])];\n\n\treturn allPatterns.map((p) => `--exclude='${p}'`).join(\" \");\n}\n\n/**\n * Create tar exclude arguments from ignore patterns\n *\n * @param patterns - Array of patterns to exclude\n * @returns String of --exclude='pattern' arguments for tar\n */\nexport function getExcludeArgsForTar(patterns: string[]): string {\n\t// Same as rsync\n\tconst allPatterns = [...new Set([...ALWAYS_IGNORED, ...patterns])];\n\n\treturn allPatterns.map((p) => `--exclude='${p}'`).join(\" \");\n}\n\n/**\n * Parse an ignore file content into an array of patterns\n * Filters out comments and empty lines\n *\n * @param content - The content of an ignore file\n * @returns Array of patterns\n */\nexport function parseIgnorePatterns(content: string): string[] {\n\treturn content\n\t\t.split(\"\\n\")\n\t\t.map((line) => line.trim())\n\t\t.filter((line) => line && !line.startsWith(\"#\"));\n}\n\n/**\n * Read patterns from an ignore file\n *\n * @param filePath - Path to the ignore file\n * @returns Array of patterns, or empty array if file doesn't exist\n */\nexport async function readIgnoreFile(filePath: string): Promise<string[]> {\n\ttry {\n\t\tconst content = await readFile(filePath, \"utf-8\");\n\t\treturn parseIgnorePatterns(content);\n\t} catch {\n\t\treturn [];\n\t}\n}\n\nexport { ALWAYS_IGNORED };\n","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 * PSPM Lockfile Schema URL for IDE validation\n */\nexport const PSPM_LOCKFILE_SCHEMA_URL =\n\t\"https://pspm.dev/schema/v1/pspm-lock.json\";\n\n/**\n * PSPM Lockfile format (pspm-lock.json)\n * Similar to package-lock.json for npm.\n *\n * Migration notes:\n * - v1 used \"skill-lock.json\" with `skills` key.\n * - v2 uses \"pspm-lock.json\" with `packages` key.\n * - v3 adds `githubPackages` key for GitHub dependencies.\n * - v4 adds `dependencies` field to entries for recursive resolution.\n * Also adds `localPackages` for local file: protocol packages.\n */\nexport interface PspmLockfile {\n\t/** JSON Schema URL for IDE validation */\n\t$schema?: string;\n\t/** Lockfile format version */\n\tlockfileVersion: 1 | 2 | 3 | 4;\n\t/** Registry URL used for resolution */\n\tregistryUrl: string;\n\t/** Installed packages from registry (v2+ format) */\n\tpackages?: Record<string, PspmLockfileEntry>;\n\t/** Installed packages from GitHub (v3+ format) */\n\tgithubPackages?: Record<string, GitHubLockfileEntry>;\n\t/** Installed packages from local directories (v4+ format) */\n\tlocalPackages?: Record<string, LocalLockfileEntry>;\n\t/** Installed skills (v1 format, deprecated) */\n\tskills?: Record<string, PspmLockfileEntry>;\n}\n\n/**\n * Lockfile entry for a local package.\n * Key format in localPackages: \"file:../path\" or \"file:/absolute/path\"\n */\nexport interface LocalLockfileEntry {\n\t/** Always \"local\" for local packages */\n\tversion: \"local\";\n\t/** Original path from the specifier (relative or absolute) */\n\tpath: string;\n\t/** Resolved absolute path to the local skill directory */\n\tresolvedPath: string;\n\t/** Skill name (last segment of path) */\n\tname: string;\n}\n\n/**\n * Lockfile entry for a single package from registry.\n */\nexport interface PspmLockfileEntry {\n\t/** Resolved version */\n\tversion: string;\n\t/** Download URL used to fetch the package */\n\tresolved: string;\n\t/** Integrity hash for verification (sha256-...) */\n\tintegrity: string;\n\t/** Deprecation message if this version is deprecated */\n\tdeprecated?: string;\n\t/** Dependencies: package name -> resolved version (v4+) */\n\tdependencies?: Record<string, string>;\n}\n\n/**\n * Lockfile entry for a GitHub package.\n * Key format in githubPackages: \"github:owner/repo[/path]\"\n */\nexport interface GitHubLockfileEntry extends PspmLockfileEntry {\n\t/** Resolved Git commit SHA */\n\tgitCommit: string;\n\t/** Original Git ref (branch, tag, or \"latest\") */\n\tgitRef: string;\n}\n","/**\n * PSPM Manifest format (pspm.json)\n *\n * This is the dedicated manifest format for prompt skill packages,\n * separate from package.json used for npm/node dependencies.\n */\n\n/**\n * Version requirements for the skill\n */\nexport interface PspmManifestRequirements {\n\t/** Minimum Claude model version required (e.g., \">=3.5\") */\n\tclaude?: string;\n\t/** Minimum PSPM CLI version required (e.g., \">=0.1.0\") */\n\tpspm?: string;\n}\n\n/**\n * Agent configuration for skill symlinks\n */\nexport interface AgentConfig {\n\t/** Directory where skills should be symlinked (e.g., \".claude/skills\") */\n\tskillsDir: string;\n}\n\n/**\n * Built-in agent types with predefined configurations\n */\nexport type BuiltInAgent =\n\t| \"claude-code\"\n\t| \"codex\"\n\t| \"cursor\"\n\t| \"gemini\"\n\t| \"kiro\"\n\t| \"opencode\";\n\n/**\n * PSPM Manifest schema for pspm.json\n *\n * @example\n * ```json\n * {\n * \"$schema\": \"https://pspm.dev/schema/pspm.json\",\n * \"name\": \"my-skill\",\n * \"version\": \"1.0.0\",\n * \"description\": \"A skill for code reviews\",\n * \"author\": \"username\",\n * \"license\": \"MIT\",\n * \"type\": \"skill\",\n * \"capabilities\": [\"code-review\", \"typescript\"],\n * \"main\": \"SKILL.md\",\n * \"requirements\": {\n * \"claude\": \">=3.5\",\n * \"pspm\": \">=0.1.0\"\n * },\n * \"files\": [\"SKILL.md\", \"runtime/\", \"scripts/\", \"data/\"],\n * \"dependencies\": {},\n * \"private\": false\n * }\n * ```\n */\nexport interface PspmManifest {\n\t/** JSON Schema URL for validation */\n\t$schema?: string;\n\n\t/** Package name (no @ prefix needed, username is derived from logged-in user) */\n\tname: string;\n\n\t/** Semantic version string */\n\tversion: string;\n\n\t/** Human-readable description */\n\tdescription?: string;\n\n\t/** Package author */\n\tauthor?: string;\n\n\t/** License identifier (e.g., \"MIT\", \"Apache-2.0\") */\n\tlicense?: string;\n\n\t/** Package type (always \"skill\" for prompt skill packages) */\n\ttype?: \"skill\";\n\n\t/** List of capabilities/tags for discovery */\n\tcapabilities?: string[];\n\n\t/** Main entry point file (default: \"SKILL.md\") */\n\tmain?: string;\n\n\t/** Version requirements */\n\trequirements?: PspmManifestRequirements;\n\n\t/** Files to include in the published package */\n\tfiles?: string[];\n\n\t/** Skill dependencies (format: \"@user/{username}/{name}\": \"^1.0.0\") */\n\tdependencies?: Record<string, string>;\n\n\t/**\n\t * GitHub skill dependencies (format: \"github:owner/repo/path\": \"ref\")\n\t *\n\t * @example\n\t * ```json\n\t * {\n\t * \"githubDependencies\": {\n\t * \"github:vercel-labs/agent-skills/skills/react-best-practices\": \"main\",\n\t * \"github:myorg/prompts/team/frontend/linter\": \"v2.0.0\"\n\t * }\n\t * }\n\t * ```\n\t */\n\tgithubDependencies?: Record<string, string>;\n\n\t/**\n\t * Local skill dependencies (format: \"file:../path\": \"*\")\n\t *\n\t * Used for local development and testing before publishing.\n\t * Creates symlinks for instant updates during development.\n\t *\n\t * @example\n\t * ```json\n\t * {\n\t * \"localDependencies\": {\n\t * \"file:../my-local-skill\": \"*\",\n\t * \"file:/absolute/path/to/skill\": \"*\"\n\t * }\n\t * }\n\t * ```\n\t */\n\tlocalDependencies?: Record<string, string>;\n\n\t/**\n\t * Custom agent configuration overrides.\n\t * Built-in agents (claude-code, cursor, codex) have default configs.\n\t * Custom agents can also be defined here.\n\t *\n\t * @example\n\t * ```json\n\t * {\n\t * \"agents\": {\n\t * \"claude-code\": { \"skillsDir\": \".claude/skills\" },\n\t * \"my-custom\": { \"skillsDir\": \".myagent/prompts\" }\n\t * }\n\t * }\n\t * ```\n\t */\n\tagents?: Partial<Record<BuiltInAgent, AgentConfig>> &\n\t\tRecord<string, AgentConfig>;\n\n\t/** If true, prevents publishing to registry */\n\tprivate?: boolean;\n}\n\n/**\n * Result of detecting and reading a manifest\n */\nexport interface ManifestDetectionResult {\n\t/** The detected manifest type */\n\ttype: \"pspm.json\" | \"package.json\";\n\n\t/** The parsed manifest content */\n\tmanifest: PspmManifest;\n\n\t/** The file path that was read */\n\tpath: string;\n}\n\n/**\n * Default file patterns to include when publishing\n */\nexport const DEFAULT_SKILL_FILES = [\n\t\"SKILL.md\",\n\t\"runtime\",\n\t\"scripts\",\n\t\"data\",\n] as const;\n\n/**\n * Default main entry point\n */\nexport const DEFAULT_MAIN = \"SKILL.md\";\n\n/**\n * Schema URL for pspm.json (versioned)\n */\nexport const PSPM_SCHEMA_URL = \"https://pspm.dev/schema/v1/pspm.json\";\n\n/**\n * Validate that a manifest has required fields\n */\nexport function validateManifest(\n\tmanifest: Partial<PspmManifest>,\n): { valid: true } | { valid: false; error: string } {\n\tif (!manifest.name) {\n\t\treturn { valid: false, error: \"Manifest must have a 'name' field\" };\n\t}\n\n\tif (!manifest.version) {\n\t\treturn { valid: false, error: \"Manifest must have a 'version' field\" };\n\t}\n\n\t// Validate name format (lowercase, alphanumeric, hyphens, underscores)\n\tif (!/^[a-z][a-z0-9_-]*$/.test(manifest.name)) {\n\t\treturn {\n\t\t\tvalid: false,\n\t\t\terror:\n\t\t\t\t\"Name must start with a lowercase letter and contain only lowercase letters, numbers, hyphens, and underscores\",\n\t\t};\n\t}\n\n\t// Validate version is valid semver (basic check)\n\tif (!/^\\d+\\.\\d+\\.\\d+/.test(manifest.version)) {\n\t\treturn {\n\t\t\tvalid: false,\n\t\t\terror: \"Version must be a valid semantic version (e.g., 1.0.0)\",\n\t\t};\n\t}\n\n\treturn { valid: true };\n}\n\n/**\n * Normalize a manifest by filling in defaults\n */\nexport function normalizeManifest(manifest: PspmManifest): PspmManifest {\n\treturn {\n\t\t...manifest,\n\t\ttype: manifest.type ?? \"skill\",\n\t\tmain: manifest.main ?? DEFAULT_MAIN,\n\t\tfiles: manifest.files ?? [...DEFAULT_SKILL_FILES],\n\t\tdependencies: manifest.dependencies ?? {},\n\t\tgithubDependencies: manifest.githubDependencies ?? {},\n\t\tlocalDependencies: manifest.localDependencies ?? {},\n\t\tprivate: manifest.private ?? false,\n\t};\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] ?? null;\n}\n\n/**\n * Find the highest version that satisfies ALL given ranges.\n * Used for pnpm-style dependency resolution where multiple dependents\n * may require the same package with different version constraints.\n *\n * @param ranges - Array of semver ranges to satisfy (e.g., [\"^1.0.0\", \">=1.2.0\"])\n * @param availableVersions - List of available version strings\n * @returns The highest version satisfying all ranges, or null if none found\n */\nexport function findHighestSatisfying(\n\tranges: 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 (sorted.length === 0) return null;\n\n\t// Normalize ranges\n\tconst normalizedRanges = ranges.map((r) =>\n\t\t!r || r === \"latest\" || r === \"*\" ? \"*\" : r,\n\t);\n\n\t// Find highest version satisfying all ranges\n\tfor (const version of sorted) {\n\t\tconst satisfiesAll = normalizedRanges.every((range) =>\n\t\t\tsemver.satisfies(version, range),\n\t\t);\n\t\tif (satisfiesAll) {\n\t\t\treturn version;\n\t\t}\n\t}\n\n\treturn null;\n}\n\n/**\n * Intersect multiple semver ranges to find if they're compatible.\n * Returns true if there exists at least one version that could satisfy all ranges.\n *\n * @param ranges - Array of semver ranges to check\n * @returns True if ranges can be satisfied together\n */\nexport function rangesIntersect(ranges: string[]): boolean {\n\tif (ranges.length === 0) return true;\n\tif (ranges.length === 1) return true;\n\n\t// Normalize ranges\n\tconst normalizedRanges = ranges.map((r) =>\n\t\t!r || r === \"latest\" || r === \"*\" ? \"*\" : r,\n\t);\n\n\t// Check if all ranges intersect by seeing if any version could satisfy all\n\t// We use a subset of the range to find intersections\n\ttry {\n\t\tconst intersection = normalizedRanges.reduce((acc, range) => {\n\t\t\tif (acc === \"*\") return range;\n\t\t\tif (range === \"*\") return acc;\n\t\t\treturn semver.intersects(acc, range) ? `${acc} ${range}` : \"\";\n\t\t}, \"*\");\n\t\treturn intersection !== \"\";\n\t} catch {\n\t\treturn false;\n\t}\n}\n","/**\n * Recursive Dependency Resolver for PSPM\n *\n * Implements pnpm-style dependency resolution:\n * - Highest satisfying version strategy\n * - 5-depth limit to prevent deep trees\n * - Circular dependency detection\n * - Topological sort for installation order\n */\n\nimport { configure, getSkillVersion, listSkillVersions } from \"@/api-client\";\nimport { findHighestSatisfying } from \"./version\";\n\n// =============================================================================\n// Constants\n// =============================================================================\n\n/** Maximum depth for transitive dependency resolution */\nexport const MAX_DEPENDENCY_DEPTH = 5;\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface ResolverConfig {\n\t/** Maximum depth for resolution (default: 5) */\n\tmaxDepth: number;\n\t/** Registry URL */\n\tregistryUrl: string;\n\t/** API key for authentication */\n\tapiKey?: string;\n}\n\nexport interface DependencyNode {\n\t/** Full package name (e.g., @user/alice/skill) */\n\tname: string;\n\t/** Resolved version (e.g., 1.2.3) */\n\tversion: string;\n\t/** Original version range requested (e.g., ^1.0.0) */\n\tversionRange: string;\n\t/** Download URL for the package */\n\tdownloadUrl: string;\n\t/** Integrity hash for verification */\n\tintegrity: string;\n\t/** Depth in dependency tree (0 = direct dependency) */\n\tdepth: number;\n\t/** Dependencies: name -> resolved version */\n\tdependencies: Record<string, string>;\n\t/** Packages that depend on this one */\n\tdependents: string[];\n\t/** Whether this is a direct dependency (from pspm.json) */\n\tisDirect: boolean;\n\t/** Deprecation message if deprecated */\n\tdeprecated?: string;\n}\n\nexport interface DependencyGraph {\n\t/** All resolved nodes: name -> node */\n\tnodes: Map<string, DependencyNode>;\n\t/** Root package names (direct dependencies) */\n\troots: string[];\n\t/** Resolution errors */\n\terrors: ResolutionError[];\n\t/** Version conflicts (multiple packages need incompatible versions) */\n\tconflicts: VersionConflict[];\n}\n\nexport interface ResolutionResult {\n\t/** Whether resolution completed successfully */\n\tsuccess: boolean;\n\t/** The dependency graph */\n\tgraph: DependencyGraph;\n\t/** Topologically sorted install order */\n\tinstallOrder: string[];\n}\n\nexport type ResolutionErrorType =\n\t| \"circular_dependency\"\n\t| \"max_depth_exceeded\"\n\t| \"no_satisfying_version\"\n\t| \"package_not_found\"\n\t| \"fetch_error\";\n\nexport interface ResolutionError {\n\ttype: ResolutionErrorType;\n\tpackage: string;\n\tmessage: string;\n\t/** Path that led to this error */\n\tpath?: string[];\n}\n\nexport interface VersionConflict {\n\t/** Package name */\n\tpackage: string;\n\t/** Ranges requested by different dependents */\n\tranges: Array<{ dependent: string; range: string }>;\n\t/** Available versions that were checked */\n\tavailableVersions: string[];\n}\n\n// =============================================================================\n// Internal Types\n// =============================================================================\n\ninterface QueueItem {\n\tname: string;\n\tversionRange: string;\n\tdepth: number;\n\tdependent: string;\n\tpath: string[];\n}\n\ninterface CollectedRange {\n\trange: string;\n\tdependent: string;\n\tdepth: number;\n}\n\n// =============================================================================\n// Main Resolution Function\n// =============================================================================\n\n/**\n * Resolve dependencies recursively using BFS.\n *\n * Algorithm:\n * 1. Queue root dependencies at depth=0\n * 2. For each package, collect all version ranges from dependents\n * 3. Find highest version satisfying ALL ranges\n * 4. Fetch package details including its dependencies\n * 5. Queue transitive dependencies at depth+1\n * 6. Topologically sort for installation order\n *\n * @param rootDeps - Direct dependencies: name -> version range\n * @param config - Resolver configuration\n * @returns Resolution result with graph and install order\n */\nexport async function resolveRecursive(\n\trootDeps: Record<string, string>,\n\tconfig: ResolverConfig,\n): Promise<ResolutionResult> {\n\tconst graph: DependencyGraph = {\n\t\tnodes: new Map(),\n\t\troots: Object.keys(rootDeps),\n\t\terrors: [],\n\t\tconflicts: [],\n\t};\n\n\t// Configure API client - apiKey may be undefined for public packages\n\tconfigure({\n\t\tregistryUrl: config.registryUrl,\n\t\tapiKey: config.apiKey,\n\t});\n\n\t// Collect version ranges for each package\n\tconst rangesByPackage = new Map<string, CollectedRange[]>();\n\n\t// Queue for BFS traversal\n\tconst queue: QueueItem[] = [];\n\n\t// Initialize queue with root dependencies\n\tfor (const [name, range] of Object.entries(rootDeps)) {\n\t\tqueue.push({\n\t\t\tname,\n\t\t\tversionRange: range,\n\t\t\tdepth: 0,\n\t\t\tdependent: \"root\",\n\t\t\tpath: [],\n\t\t});\n\t}\n\n\t// Set of packages being processed (for cycle detection)\n\tconst processing = new Set<string>();\n\n\t// Phase 1: Collect all version ranges using BFS\n\twhile (queue.length > 0) {\n\t\tconst item = queue.shift();\n\t\tif (!item) continue;\n\t\tconst { name, versionRange, depth, dependent, path } = item;\n\n\t\t// Check depth limit\n\t\tif (depth > config.maxDepth) {\n\t\t\tgraph.errors.push({\n\t\t\t\ttype: \"max_depth_exceeded\",\n\t\t\t\tpackage: name,\n\t\t\t\tmessage: `Maximum dependency depth (${config.maxDepth}) exceeded at: ${[...path, name].join(\" -> \")}`,\n\t\t\t\tpath: [...path, name],\n\t\t\t});\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Check for circular dependency\n\t\tif (path.includes(name)) {\n\t\t\tgraph.errors.push({\n\t\t\t\ttype: \"circular_dependency\",\n\t\t\t\tpackage: name,\n\t\t\t\tmessage: `Circular dependency detected: ${[...path, name].join(\" -> \")}`,\n\t\t\t\tpath: [...path, name],\n\t\t\t});\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Collect range for this package\n\t\tif (!rangesByPackage.has(name)) {\n\t\t\trangesByPackage.set(name, []);\n\t\t}\n\t\trangesByPackage.get(name)?.push({\n\t\t\trange: versionRange,\n\t\t\tdependent,\n\t\t\tdepth,\n\t\t});\n\n\t\t// Only process each package once for fetching\n\t\tif (processing.has(name)) {\n\t\t\tcontinue;\n\t\t}\n\t\tprocessing.add(name);\n\n\t\t// Parse package name\n\t\tconst match = name.match(/^@user\\/([^/]+)\\/([^/]+)$/);\n\t\tif (!match) {\n\t\t\tgraph.errors.push({\n\t\t\t\ttype: \"package_not_found\",\n\t\t\t\tpackage: name,\n\t\t\t\tmessage: `Invalid package name format: ${name}`,\n\t\t\t});\n\t\t\tcontinue;\n\t\t}\n\t\tconst [, username, skillName] = match;\n\n\t\t// Fetch available versions\n\t\ttry {\n\t\t\tconst versionsResponse = await listSkillVersions(username, skillName);\n\t\t\tif (versionsResponse.status !== 200) {\n\t\t\t\tgraph.errors.push({\n\t\t\t\t\ttype: \"package_not_found\",\n\t\t\t\t\tpackage: name,\n\t\t\t\t\tmessage: `Package ${name} not found in registry`,\n\t\t\t\t});\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst versions = versionsResponse.data as Array<{ version: string }>;\n\t\t\tif (versions.length === 0) {\n\t\t\t\tgraph.errors.push({\n\t\t\t\t\ttype: \"package_not_found\",\n\t\t\t\t\tpackage: name,\n\t\t\t\t\tmessage: `Package ${name} has no versions`,\n\t\t\t\t});\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst availableVersions = versions.map((v) => v.version);\n\n\t\t\t// Find highest satisfying version (will be finalized in phase 2)\n\t\t\tconst resolvedVersion = findHighestSatisfying(\n\t\t\t\t[versionRange],\n\t\t\t\tavailableVersions,\n\t\t\t);\n\n\t\t\tif (!resolvedVersion) {\n\t\t\t\tgraph.errors.push({\n\t\t\t\t\ttype: \"no_satisfying_version\",\n\t\t\t\t\tpackage: name,\n\t\t\t\t\tmessage: `No version of ${name} satisfies: ${versionRange}`,\n\t\t\t\t});\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Fetch package details for dependencies\n\t\t\tconst versionResponse = await getSkillVersion(\n\t\t\t\tusername,\n\t\t\t\tskillName,\n\t\t\t\tresolvedVersion,\n\t\t\t);\n\t\t\tif (versionResponse.status !== 200 || !versionResponse.data) {\n\t\t\t\tgraph.errors.push({\n\t\t\t\t\ttype: \"fetch_error\",\n\t\t\t\t\tpackage: name,\n\t\t\t\t\tmessage: `Failed to fetch ${name}@${resolvedVersion}`,\n\t\t\t\t});\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst versionInfo = versionResponse.data;\n\t\t\tconst manifest = versionInfo.manifest as\n\t\t\t\t| { dependencies?: Record<string, string> }\n\t\t\t\t| undefined;\n\t\t\tconst dependencies = manifest?.dependencies ?? {};\n\n\t\t\t// Create node (may be updated in phase 2 with final version)\n\t\t\tconst node: DependencyNode = {\n\t\t\t\tname,\n\t\t\t\tversion: resolvedVersion,\n\t\t\t\tversionRange,\n\t\t\t\tdownloadUrl: versionInfo.downloadUrl,\n\t\t\t\tintegrity: `sha256-${Buffer.from(versionInfo.checksum, \"hex\").toString(\"base64\")}`,\n\t\t\t\tdepth,\n\t\t\t\tdependencies,\n\t\t\t\tdependents: [dependent],\n\t\t\t\tisDirect: depth === 0,\n\t\t\t\tdeprecated: versionInfo.deprecationMessage ?? undefined,\n\t\t\t};\n\t\t\tgraph.nodes.set(name, node);\n\n\t\t\t// Queue transitive dependencies\n\t\t\tfor (const [depName, depRange] of Object.entries(dependencies)) {\n\t\t\t\tqueue.push({\n\t\t\t\t\tname: depName,\n\t\t\t\t\tversionRange: depRange,\n\t\t\t\t\tdepth: depth + 1,\n\t\t\t\t\tdependent: name,\n\t\t\t\t\tpath: [...path, name],\n\t\t\t\t});\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconst message = error instanceof Error ? error.message : \"Unknown error\";\n\t\t\tgraph.errors.push({\n\t\t\t\ttype: \"fetch_error\",\n\t\t\t\tpackage: name,\n\t\t\t\tmessage: `Error fetching ${name}: ${message}`,\n\t\t\t});\n\t\t}\n\t}\n\n\t// Phase 2: Resolve final versions considering all collected ranges\n\tfor (const [name, ranges] of rangesByPackage.entries()) {\n\t\tconst node = graph.nodes.get(name);\n\t\tif (!node) continue;\n\n\t\t// Update dependents list\n\t\tconst uniqueDependents = [...new Set(ranges.map((r) => r.dependent))];\n\t\tnode.dependents = uniqueDependents;\n\n\t\t// Check if all ranges can be satisfied\n\t\tconst allRanges = ranges.map((r) => r.range);\n\t\tconst match = name.match(/^@user\\/([^/]+)\\/([^/]+)$/);\n\t\tif (!match) continue;\n\n\t\tconst [, username, skillName] = match;\n\n\t\ttry {\n\t\t\tconst versionsResponse = await listSkillVersions(username, skillName);\n\t\t\tif (versionsResponse.status !== 200) continue;\n\n\t\t\tconst versions = versionsResponse.data as Array<{ version: string }>;\n\t\t\tconst availableVersions = versions.map((v) => v.version);\n\n\t\t\tconst finalVersion = findHighestSatisfying(allRanges, availableVersions);\n\n\t\t\tif (!finalVersion) {\n\t\t\t\t// Record conflict\n\t\t\t\tgraph.conflicts.push({\n\t\t\t\t\tpackage: name,\n\t\t\t\t\tranges: ranges.map((r) => ({\n\t\t\t\t\t\tdependent: r.dependent,\n\t\t\t\t\t\trange: r.range,\n\t\t\t\t\t})),\n\t\t\t\t\tavailableVersions,\n\t\t\t\t});\n\n\t\t\t\tgraph.errors.push({\n\t\t\t\t\ttype: \"no_satisfying_version\",\n\t\t\t\t\tpackage: name,\n\t\t\t\t\tmessage: `No version of ${name} satisfies all requirements: ${allRanges.join(\", \")}`,\n\t\t\t\t});\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Update node if version changed\n\t\t\tif (finalVersion !== node.version) {\n\t\t\t\tconst versionResponse = await getSkillVersion(\n\t\t\t\t\tusername,\n\t\t\t\t\tskillName,\n\t\t\t\t\tfinalVersion,\n\t\t\t\t);\n\t\t\t\tif (versionResponse.status === 200 && versionResponse.data) {\n\t\t\t\t\tconst versionInfo = versionResponse.data;\n\t\t\t\t\tnode.version = finalVersion;\n\t\t\t\t\tnode.downloadUrl = versionInfo.downloadUrl;\n\t\t\t\t\tnode.integrity = `sha256-${Buffer.from(versionInfo.checksum, \"hex\").toString(\"base64\")}`;\n\t\t\t\t\tnode.deprecated = versionInfo.deprecationMessage ?? undefined;\n\n\t\t\t\t\tconst manifest = versionInfo.manifest as\n\t\t\t\t\t\t| { dependencies?: Record<string, string> }\n\t\t\t\t\t\t| undefined;\n\t\t\t\t\tnode.dependencies = manifest?.dependencies ?? {};\n\t\t\t\t}\n\t\t\t}\n\t\t} catch {\n\t\t\t// Already have a node, keep it\n\t\t}\n\t}\n\n\t// Phase 3: Compute topological sort\n\tconst installOrder = topologicalSort(graph);\n\n\t// Determine success\n\tconst success = graph.errors.length === 0 && graph.conflicts.length === 0;\n\n\treturn {\n\t\tsuccess,\n\t\tgraph,\n\t\tinstallOrder,\n\t};\n}\n\n// =============================================================================\n// Topological Sort\n// =============================================================================\n\n/**\n * Topologically sort packages using Kahn's algorithm.\n * Packages with no dependencies are installed first.\n *\n * @param graph - The dependency graph\n * @returns Sorted list of package names\n */\nexport function topologicalSort(graph: DependencyGraph): string[] {\n\t// in-degree: number of dependencies a node has (within the graph)\n\tconst inDegree = new Map<string, number>();\n\t// dependents: nodes that depend on this node (reverse edges)\n\tconst dependents = new Map<string, string[]>();\n\n\t// Initialize all nodes\n\tfor (const name of graph.nodes.keys()) {\n\t\tinDegree.set(name, 0);\n\t\tdependents.set(name, []);\n\t}\n\n\t// Build the graph\n\tfor (const [name, node] of graph.nodes.entries()) {\n\t\tfor (const depName of Object.keys(node.dependencies)) {\n\t\t\t// Only count dependencies that exist in our graph\n\t\t\tif (graph.nodes.has(depName)) {\n\t\t\t\t// Increment in-degree of current node (it has a dependency)\n\t\t\t\tinDegree.set(name, (inDegree.get(name) ?? 0) + 1);\n\t\t\t\t// Add reverse edge: depName is depended on by name\n\t\t\t\tif (!dependents.has(depName)) {\n\t\t\t\t\tdependents.set(depName, []);\n\t\t\t\t}\n\t\t\t\tdependents.get(depName)?.push(name);\n\t\t\t}\n\t\t}\n\t}\n\n\t// Find nodes with in-degree 0 (no dependencies within our graph)\n\tconst queue: string[] = [];\n\tfor (const [name, degree] of inDegree.entries()) {\n\t\tif (degree === 0) {\n\t\t\tqueue.push(name);\n\t\t}\n\t}\n\n\tconst sorted: string[] = [];\n\twhile (queue.length > 0) {\n\t\tconst current = queue.shift();\n\t\tif (!current) continue;\n\t\tsorted.push(current);\n\n\t\t// For each node that depends on current, decrease its in-degree\n\t\tconst deps = dependents.get(current) ?? [];\n\t\tfor (const dependent of deps) {\n\t\t\tconst newDegree = (inDegree.get(dependent) ?? 1) - 1;\n\t\t\tinDegree.set(dependent, newDegree);\n\t\t\tif (newDegree === 0 && !sorted.includes(dependent)) {\n\t\t\t\tqueue.push(dependent);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn sorted;\n}\n\n/**\n * Compute installation order from lockfile packages.\n * Dependencies are installed before dependents.\n *\n * @param packages - Lockfile packages with dependencies field\n * @returns Sorted list of package names\n */\nexport function computeInstallOrder(\n\tpackages: Record<string, { dependencies?: Record<string, string> }>,\n): string[] {\n\tconst visited = new Set<string>();\n\tconst order: string[] = [];\n\n\tfunction visit(name: string) {\n\t\tif (visited.has(name)) return;\n\t\tvisited.add(name);\n\n\t\tconst entry = packages[name];\n\t\tif (entry?.dependencies) {\n\t\t\tfor (const dep of Object.keys(entry.dependencies)) {\n\t\t\t\tvisit(dep);\n\t\t\t}\n\t\t}\n\t\torder.push(name);\n\t}\n\n\tfor (const name of Object.keys(packages)) {\n\t\tvisit(name);\n\t}\n\n\treturn order;\n}\n\n// =============================================================================\n// Utility Functions\n// =============================================================================\n\n/**\n * Format resolution errors for display.\n *\n * @param errors - Resolution errors\n * @returns Formatted error messages\n */\nexport function formatResolutionErrors(errors: ResolutionError[]): string[] {\n\treturn errors.map((error) => {\n\t\tswitch (error.type) {\n\t\t\tcase \"circular_dependency\":\n\t\t\t\treturn `Circular dependency: ${error.path?.join(\" -> \") ?? error.package}`;\n\t\t\tcase \"max_depth_exceeded\":\n\t\t\t\treturn `Max depth exceeded at: ${error.path?.join(\" -> \") ?? error.package}`;\n\t\t\tcase \"no_satisfying_version\":\n\t\t\t\treturn error.message;\n\t\t\tcase \"package_not_found\":\n\t\t\t\treturn `Package not found: ${error.package}`;\n\t\t\tcase \"fetch_error\":\n\t\t\t\treturn error.message;\n\t\t\tdefault:\n\t\t\t\treturn error.message;\n\t\t}\n\t});\n}\n\n/**\n * Format version conflicts for display.\n *\n * @param conflicts - Version conflicts\n * @returns Formatted conflict messages\n */\nexport function formatVersionConflicts(conflicts: VersionConflict[]): string[] {\n\treturn conflicts.map((conflict) => {\n\t\tconst requirements = conflict.ranges\n\t\t\t.map((r) => `${r.dependent} needs ${r.range}`)\n\t\t\t.join(\", \");\n\t\treturn `No version of ${conflict.package} satisfies: ${requirements}`;\n\t});\n}\n\n/**\n * Print resolution errors to console.\n *\n * @param errors - Resolution errors\n * @param conflicts - Version conflicts\n */\nexport function printResolutionErrors(\n\terrors: ResolutionError[],\n\tconflicts: VersionConflict[] = [],\n): void {\n\tif (errors.length > 0) {\n\t\tconsole.error(\"\\nResolution errors:\");\n\t\tfor (const msg of formatResolutionErrors(errors)) {\n\t\t\tconsole.error(` - ${msg}`);\n\t\t}\n\t}\n\n\tif (conflicts.length > 0) {\n\t\tconsole.error(\"\\nVersion conflicts:\");\n\t\tfor (const msg of formatVersionConflicts(conflicts)) {\n\t\t\tconsole.error(` - ${msg}`);\n\t\t}\n\t}\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\tconst username = match[1];\n\tconst name = match[2];\n\tif (!username || !name) {\n\t\treturn null;\n\t}\n\n\treturn {\n\t\tusername,\n\t\tname,\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\n// =============================================================================\n// GitHub Specifier Support\n// =============================================================================\n\n/**\n * Parsed GitHub specifier\n *\n * Format: github:{owner}/{repo}[/{path}][@{ref}]\n *\n * @example\n * - github:vercel-labs/agent-skills\n * - github:vercel-labs/agent-skills@main\n * - github:vercel-labs/agent-skills/skills/react-best-practices\n * - github:vercel-labs/agent-skills/skills/react-best-practices@main\n * - github:myorg/prompts/team/frontend/code-review@v2.0.0\n */\nexport interface GitHubSpecifier {\n\t/** Repository owner */\n\towner: string;\n\t/** Repository name */\n\trepo: string;\n\t/** Optional path within the repository (e.g., \"skills/react-best-practices\") */\n\tpath?: string;\n\t/** Git ref (branch, tag, or commit SHA). Defaults to default branch if not specified. */\n\tref?: string;\n}\n\n/**\n * GitHub specifier regex pattern\n * Matches: github:{owner}/{repo}[/{path}][@{ref}]\n *\n * Group 1: owner\n * Group 2: repo\n * Group 3: optional /path (with leading slash)\n * Group 4: optional @ref\n */\nconst GITHUB_SPECIFIER_PATTERN =\n\t/^github:([a-zA-Z0-9_-]+)\\/([a-zA-Z0-9_.-]+)(\\/[^@]+)?(?:@(.+))?$/;\n\n/**\n * Parse a GitHub specifier string.\n *\n * @param specifier - The specifier string (e.g., \"github:owner/repo/path@ref\")\n * @returns Parsed specifier or null if invalid\n *\n * @example\n * ```typescript\n * parseGitHubSpecifier(\"github:vercel-labs/agent-skills/skills/react@main\")\n * // => { owner: \"vercel-labs\", repo: \"agent-skills\", path: \"skills/react\", ref: \"main\" }\n *\n * parseGitHubSpecifier(\"github:myorg/prompts\")\n * // => { owner: \"myorg\", repo: \"prompts\", path: undefined, ref: undefined }\n * ```\n */\nexport function parseGitHubSpecifier(\n\tspecifier: string,\n): GitHubSpecifier | null {\n\tconst match = specifier.match(GITHUB_SPECIFIER_PATTERN);\n\n\tif (!match) {\n\t\treturn null;\n\t}\n\n\tconst [, owner, repo, pathWithSlash, ref] = match;\n\tif (!owner || !repo) {\n\t\treturn null;\n\t}\n\n\treturn {\n\t\towner,\n\t\trepo,\n\t\t// Remove leading slash from path\n\t\tpath: pathWithSlash ? pathWithSlash.slice(1) : undefined,\n\t\tref: ref || undefined,\n\t};\n}\n\n/**\n * Format a GitHubSpecifier back to string format.\n *\n * @param spec - The GitHub specifier object\n * @returns Formatted string (e.g., \"github:owner/repo/path@ref\")\n */\nexport function formatGitHubSpecifier(spec: GitHubSpecifier): string {\n\tlet result = `github:${spec.owner}/${spec.repo}`;\n\tif (spec.path) {\n\t\tresult += `/${spec.path}`;\n\t}\n\tif (spec.ref) {\n\t\tresult += `@${spec.ref}`;\n\t}\n\treturn result;\n}\n\n/**\n * Extract skill name from GitHub specifier.\n * Uses the last segment of the path, or the repo name if no path.\n *\n * @param spec - The GitHub specifier object\n * @returns Skill name (e.g., \"react-best-practices\" or \"prompts\")\n *\n * @example\n * ```typescript\n * getGitHubSkillName({ owner: \"vercel-labs\", repo: \"agent-skills\", path: \"skills/react\" })\n * // => \"react\"\n *\n * getGitHubSkillName({ owner: \"myorg\", repo: \"prompts\" })\n * // => \"prompts\"\n * ```\n */\nexport function getGitHubSkillName(spec: GitHubSpecifier): string {\n\tif (spec.path) {\n\t\tconst segments = spec.path.split(\"/\").filter(Boolean);\n\t\tconst lastSegment = segments[segments.length - 1];\n\t\tif (lastSegment) {\n\t\t\treturn lastSegment;\n\t\t}\n\t}\n\treturn spec.repo;\n}\n\n/**\n * Check if a string is a GitHub specifier\n */\nexport function isGitHubSpecifier(specifier: string): boolean {\n\treturn specifier.startsWith(\"github:\");\n}\n","/**\n * PSPM Types - CLI-specific types for PSPM\n *\n * This module contains types and utilities used by the PSPM CLI\n * that are not part of the API contract (SDK).\n */\n\n// Ignore file utilities\nexport {\n\tALWAYS_IGNORED,\n\tgetExcludeArgsForRsync,\n\tgetExcludeArgsForTar,\n\ttype IgnoreLoadResult,\n\tloadIgnorePatterns,\n\tparseIgnorePatterns,\n\treadIgnoreFile,\n} from \"./ignore\";\n\n// Integrity utilities\nexport { calculateIntegrity, verifyIntegrity } from \"./integrity\";\n// Lockfile types\n// Legacy lockfile types (deprecated, use Pspm* versions)\nexport {\n\ttype GitHubLockfileEntry,\n\ttype LocalLockfileEntry,\n\tPSPM_LOCKFILE_SCHEMA_URL,\n\ttype PspmLockfile,\n\ttype PspmLockfile as SkillLockfile,\n\ttype PspmLockfileEntry,\n\ttype PspmLockfileEntry as SkillLockfileEntry,\n} from \"./lockfile\";\n\n// Manifest types (pspm.json)\nexport {\n\ttype AgentConfig,\n\ttype BuiltInAgent,\n\tDEFAULT_MAIN,\n\tDEFAULT_SKILL_FILES,\n\ttype ManifestDetectionResult,\n\tnormalizeManifest,\n\tPSPM_SCHEMA_URL,\n\ttype PspmManifest,\n\ttype PspmManifestRequirements,\n\tvalidateManifest,\n} from \"./manifest\";\n// Resolver utilities\nexport {\n\tcomputeInstallOrder,\n\ttype DependencyGraph,\n\ttype DependencyNode,\n\tformatResolutionErrors,\n\tformatVersionConflicts,\n\tMAX_DEPENDENCY_DEPTH,\n\tprintResolutionErrors,\n\ttype ResolutionError,\n\ttype ResolutionErrorType,\n\ttype ResolutionResult,\n\ttype ResolverConfig,\n\tresolveRecursive,\n\ttopologicalSort,\n\ttype VersionConflict,\n} from \"./resolver\";\n// Skill specifier parsing\nexport {\n\tformatGitHubSpecifier,\n\ttype GitHubSpecifier,\n\tgenerateSkillIdentifier,\n\tgetGitHubSkillName,\n\tisGitHubSpecifier,\n\tparseGitHubSpecifier,\n\tparseSkillSpecifier,\n\ttype SkillSpecifier,\n} from \"./specifier\";\n// Version utilities\nexport {\n\tcompareVersions,\n\tfindHighestSatisfying,\n\tgetLatestVersion,\n\tisNewerVersion,\n\tnormalizeVersionRange,\n\trangesIntersect,\n\tresolveVersion,\n\tversionSatisfies,\n} from \"./version\";\n","/**\n * Agent configuration for skill symlinks.\n *\n * Defines where different AI coding agents expect skills to be located.\n */\n\nimport { checkbox } from \"@inquirer/prompts\";\nimport type { AgentConfig, BuiltInAgent } from \"./lib/index\";\n\n/**\n * Agent metadata for display purposes.\n */\nexport interface AgentInfo {\n\t/** Human-readable name for display */\n\tdisplayName: string;\n\t/** Skills directory path */\n\tskillsDir: string;\n}\n\n/**\n * Default agent configurations with display names.\n * These can be overridden in pspm.json under the \"agents\" key.\n */\nexport const AGENT_INFO: Record<BuiltInAgent, AgentInfo> = {\n\t\"claude-code\": {\n\t\tdisplayName: \"Claude Code\",\n\t\tskillsDir: \".claude/skills\",\n\t},\n\tcodex: {\n\t\tdisplayName: \"Codex\",\n\t\tskillsDir: \".codex/skills\",\n\t},\n\tcursor: {\n\t\tdisplayName: \"Cursor\",\n\t\tskillsDir: \".cursor/skills\",\n\t},\n\tgemini: {\n\t\tdisplayName: \"Gemini CLI\",\n\t\tskillsDir: \".gemini/skills\",\n\t},\n\tkiro: {\n\t\tdisplayName: \"Kiro CLI\",\n\t\tskillsDir: \".kiro/skills\",\n\t},\n\topencode: {\n\t\tdisplayName: \"OpenCode\",\n\t\tskillsDir: \".opencode/skills\",\n\t},\n};\n\n/**\n * Default agent configurations (AgentConfig format).\n */\nexport const DEFAULT_AGENT_CONFIGS: Record<BuiltInAgent, AgentConfig> = {\n\t\"claude-code\": { skillsDir: AGENT_INFO[\"claude-code\"].skillsDir },\n\tcodex: { skillsDir: AGENT_INFO.codex.skillsDir },\n\tcursor: { skillsDir: AGENT_INFO.cursor.skillsDir },\n\tgemini: { skillsDir: AGENT_INFO.gemini.skillsDir },\n\tkiro: { skillsDir: AGENT_INFO.kiro.skillsDir },\n\topencode: { skillsDir: AGENT_INFO.opencode.skillsDir },\n};\n\n/**\n * All built-in agent names in display order.\n */\nexport const ALL_AGENTS: BuiltInAgent[] = [\n\t\"claude-code\",\n\t\"codex\",\n\t\"cursor\",\n\t\"gemini\",\n\t\"kiro\",\n\t\"opencode\",\n];\n\n/**\n * Resolve agent configuration by name.\n *\n * @param name - Agent name (built-in or custom)\n * @param overrides - Custom agent configurations from pspm.json\n * @returns Agent configuration or null if not found\n *\n * @example\n * ```typescript\n * resolveAgentConfig(\"claude-code\")\n * // => { skillsDir: \".claude/skills\" }\n *\n * resolveAgentConfig(\"my-custom\", { \"my-custom\": { skillsDir: \".myagent/prompts\" } })\n * // => { skillsDir: \".myagent/prompts\" }\n * ```\n */\nexport function resolveAgentConfig(\n\tname: string,\n\toverrides?: Record<string, AgentConfig>,\n): AgentConfig | null {\n\t// Check overrides first\n\tif (overrides?.[name]) {\n\t\treturn overrides[name];\n\t}\n\n\t// Check built-in defaults\n\tif (name in DEFAULT_AGENT_CONFIGS) {\n\t\treturn DEFAULT_AGENT_CONFIGS[name as BuiltInAgent];\n\t}\n\n\treturn null;\n}\n\n/**\n * Parse comma-separated agent names from CLI argument.\n *\n * @param agentArg - Comma-separated agent names (e.g., \"claude-code,cursor\")\n * @returns Array of agent names, or [\"none\"] if skipping symlinks\n *\n * @example\n * ```typescript\n * parseAgentArg(\"claude-code,cursor\")\n * // => [\"claude-code\", \"cursor\"]\n *\n * parseAgentArg(\"none\")\n * // => [\"none\"]\n *\n * parseAgentArg(undefined)\n * // => [\"claude-code\", \"codex\", \"cursor\", \"gemini\", \"kiro\", \"opencode\"]\n * ```\n */\nexport function parseAgentArg(agentArg?: string): string[] {\n\tif (!agentArg) {\n\t\treturn [...ALL_AGENTS];\n\t}\n\n\tif (agentArg === \"none\") {\n\t\treturn [\"none\"];\n\t}\n\n\treturn agentArg\n\t\t.split(\",\")\n\t\t.map((a) => a.trim())\n\t\t.filter(Boolean);\n}\n\n/**\n * Get all available agent names (built-in + custom).\n */\nexport function getAvailableAgents(\n\toverrides?: Record<string, AgentConfig>,\n): string[] {\n\tconst builtIn = Object.keys(DEFAULT_AGENT_CONFIGS);\n\tconst custom = overrides ? Object.keys(overrides) : [];\n\treturn [...new Set([...builtIn, ...custom])];\n}\n\n/**\n * Prompt user to select which agents to install skills to.\n *\n * @returns Array of selected agent names\n */\nexport async function promptForAgents(): Promise<string[]> {\n\tconst choices = ALL_AGENTS.map((agent) => ({\n\t\tname: `${AGENT_INFO[agent].displayName} (${AGENT_INFO[agent].skillsDir})`,\n\t\tvalue: agent,\n\t\tchecked: true, // All selected by default\n\t}));\n\n\tconst selected = await checkbox({\n\t\tmessage: \"Select agents to install skills to\",\n\t\tchoices,\n\t});\n\n\tif (selected.length === 0) {\n\t\treturn [\"none\"];\n\t}\n\n\treturn selected;\n}\n","/**\n * GitHub package download and extraction support.\n *\n * Downloads skill packages from GitHub repositories and extracts them\n * to .pspm/skills/_github/{owner}/{repo}/{path}/\n */\n\nimport { cp, lstat, mkdir, readdir, rm, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { GitHubSpecifier } from \"./lib/index\";\nimport { calculateIntegrity } from \"./lib/index\";\n\n/**\n * Result of downloading a GitHub package.\n */\nexport interface GitHubDownloadResult {\n\t/** Downloaded tarball as buffer */\n\tbuffer: Buffer;\n\t/** Resolved commit SHA */\n\tcommit: string;\n\t/** Integrity hash (sha256-...) */\n\tintegrity: string;\n}\n\n/**\n * Error thrown when GitHub API rate limit is hit.\n */\nexport class GitHubRateLimitError extends Error {\n\tconstructor() {\n\t\tsuper(\n\t\t\t\"GitHub API rate limit exceeded. Set GITHUB_TOKEN environment variable for higher limits.\",\n\t\t);\n\t\tthis.name = \"GitHubRateLimitError\";\n\t}\n}\n\n/**\n * Error thrown when GitHub repository/ref is not found.\n */\nexport class GitHubNotFoundError extends Error {\n\tconstructor(spec: GitHubSpecifier) {\n\t\tconst path = spec.path ? `/${spec.path}` : \"\";\n\t\tconst ref = spec.ref ? `@${spec.ref}` : \"\";\n\t\tsuper(\n\t\t\t`GitHub repository not found: ${spec.owner}/${spec.repo}${path}${ref}`,\n\t\t);\n\t\tthis.name = \"GitHubNotFoundError\";\n\t}\n}\n\n/**\n * Error thrown when the specified path doesn't exist in the repository.\n */\nexport class GitHubPathNotFoundError extends Error {\n\tconstructor(spec: GitHubSpecifier, availablePaths?: string[]) {\n\t\tconst pathInfo = availablePaths?.length\n\t\t\t? `\\nAvailable paths in repository root:\\n ${availablePaths.join(\"\\n \")}`\n\t\t\t: \"\";\n\t\tsuper(\n\t\t\t`Path \"${spec.path}\" not found in ${spec.owner}/${spec.repo}${pathInfo}`,\n\t\t);\n\t\tthis.name = \"GitHubPathNotFoundError\";\n\t}\n}\n\n/**\n * Get GitHub API headers, including authentication if available.\n */\nfunction getGitHubHeaders(): Record<string, string> {\n\tconst headers: Record<string, string> = {\n\t\tAccept: \"application/vnd.github+json\",\n\t\t\"X-GitHub-Api-Version\": \"2022-11-28\",\n\t\t\"User-Agent\": \"pspm-cli\",\n\t};\n\n\tconst token = process.env.GITHUB_TOKEN;\n\tif (token) {\n\t\theaders.Authorization = `Bearer ${token}`;\n\t}\n\n\treturn headers;\n}\n\n/**\n * Resolve a Git ref (branch/tag) to a commit SHA.\n *\n * @param owner - Repository owner\n * @param repo - Repository name\n * @param ref - Branch, tag, or commit SHA (defaults to default branch)\n * @returns Resolved commit SHA\n */\nexport async function resolveGitHubRef(\n\towner: string,\n\trepo: string,\n\tref?: string,\n): Promise<string> {\n\tconst headers = getGitHubHeaders();\n\n\t// Use a local variable to avoid parameter reassignment\n\tlet resolvedRef = ref;\n\n\t// If no ref specified, get the default branch first\n\tif (!resolvedRef || resolvedRef === \"latest\") {\n\t\tconst repoUrl = `https://api.github.com/repos/${owner}/${repo}`;\n\t\tconst repoResponse = await fetch(repoUrl, { headers });\n\n\t\tif (repoResponse.status === 404) {\n\t\t\tthrow new GitHubNotFoundError({ owner, repo });\n\t\t}\n\n\t\tif (repoResponse.status === 403) {\n\t\t\tconst remaining = repoResponse.headers.get(\"x-ratelimit-remaining\");\n\t\t\tif (remaining === \"0\") {\n\t\t\t\tthrow new GitHubRateLimitError();\n\t\t\t}\n\t\t}\n\n\t\tif (!repoResponse.ok) {\n\t\t\tthrow new Error(`GitHub API error: ${repoResponse.status}`);\n\t\t}\n\n\t\tconst repoData = (await repoResponse.json()) as { default_branch: string };\n\t\tresolvedRef = repoData.default_branch;\n\t}\n\n\t// Get the commit SHA for the ref\n\tconst commitUrl = `https://api.github.com/repos/${owner}/${repo}/commits/${resolvedRef}`;\n\tconst commitResponse = await fetch(commitUrl, { headers });\n\n\tif (commitResponse.status === 404) {\n\t\tthrow new GitHubNotFoundError({ owner, repo, ref });\n\t}\n\n\tif (commitResponse.status === 403) {\n\t\tconst remaining = commitResponse.headers.get(\"x-ratelimit-remaining\");\n\t\tif (remaining === \"0\") {\n\t\t\tthrow new GitHubRateLimitError();\n\t\t}\n\t}\n\n\tif (!commitResponse.ok) {\n\t\tthrow new Error(`GitHub API error: ${commitResponse.status}`);\n\t}\n\n\tconst commitData = (await commitResponse.json()) as { sha: string };\n\treturn commitData.sha;\n}\n\n/**\n * Download a GitHub repository tarball.\n *\n * @param spec - GitHub specifier with owner, repo, and optional ref\n * @returns Download result with buffer, commit SHA, and integrity hash\n */\nexport async function downloadGitHubPackage(\n\tspec: GitHubSpecifier,\n): Promise<GitHubDownloadResult> {\n\tconst headers = getGitHubHeaders();\n\n\t// Resolve the ref to a commit SHA\n\tconst commit = await resolveGitHubRef(spec.owner, spec.repo, spec.ref);\n\n\t// Download the tarball\n\tconst tarballUrl = `https://api.github.com/repos/${spec.owner}/${spec.repo}/tarball/${commit}`;\n\tconst response = await fetch(tarballUrl, {\n\t\theaders,\n\t\tredirect: \"follow\",\n\t});\n\n\tif (response.status === 404) {\n\t\tthrow new GitHubNotFoundError(spec);\n\t}\n\n\tif (response.status === 403) {\n\t\tconst remaining = response.headers.get(\"x-ratelimit-remaining\");\n\t\tif (remaining === \"0\") {\n\t\t\tthrow new GitHubRateLimitError();\n\t\t}\n\t}\n\n\tif (!response.ok) {\n\t\tthrow new Error(`Failed to download GitHub tarball: ${response.status}`);\n\t}\n\n\tconst buffer = Buffer.from(await response.arrayBuffer());\n\tconst integrity = calculateIntegrity(buffer);\n\n\treturn { buffer, commit, integrity };\n}\n\n/**\n * Extract a GitHub package to the skills directory.\n *\n * For subpath specifiers, extracts only the specified subdirectory.\n * Full path structure is preserved under .pspm/skills/_github/.\n *\n * @param spec - GitHub specifier\n * @param buffer - Downloaded tarball buffer\n * @param skillsDir - Base skills directory (.pspm/skills)\n * @returns Path to extracted skill (relative to project root)\n */\nexport async function extractGitHubPackage(\n\tspec: GitHubSpecifier,\n\tbuffer: Buffer,\n\tskillsDir: string,\n): Promise<string> {\n\t// Determine destination path\n\tconst destPath = spec.path\n\t\t? join(skillsDir, \"_github\", spec.owner, spec.repo, spec.path)\n\t\t: join(skillsDir, \"_github\", spec.owner, spec.repo);\n\n\t// Create a temp directory for extraction\n\tconst tempDir = join(skillsDir, \"_github\", \".temp\", `${Date.now()}`);\n\tawait mkdir(tempDir, { recursive: true });\n\n\tconst tempFile = join(tempDir, \"archive.tgz\");\n\n\ttry {\n\t\t// Write tarball to temp file\n\t\tawait writeFile(tempFile, buffer);\n\n\t\t// Extract tarball\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\tawait execAsync(`tar -xzf \"${tempFile}\" -C \"${tempDir}\"`);\n\n\t\t// Find the extracted directory (GitHub tarballs have a top-level dir like \"owner-repo-sha\")\n\t\tconst entries = await readdir(tempDir);\n\t\tconst extractedDir = entries.find(\n\t\t\t(e) => e !== \"archive.tgz\" && !e.startsWith(\".\"),\n\t\t);\n\n\t\tif (!extractedDir) {\n\t\t\tthrow new Error(\"Failed to find extracted directory in tarball\");\n\t\t}\n\n\t\tconst sourcePath = join(tempDir, extractedDir);\n\n\t\t// Determine what to copy - either a subpath or the entire repo\n\t\tconst copySource = spec.path ? join(sourcePath, spec.path) : sourcePath;\n\n\t\t// If a subpath is specified, verify it exists in the repo\n\t\tif (spec.path) {\n\t\t\tconst pathExists = await lstat(copySource).catch(() => null);\n\t\t\tif (!pathExists) {\n\t\t\t\t// List available directories in repo root for helpful error message\n\t\t\t\tconst rootEntries = await readdir(sourcePath);\n\t\t\t\tconst dirs = [];\n\t\t\t\tfor (const entry of rootEntries) {\n\t\t\t\t\tconst stat = await lstat(join(sourcePath, entry)).catch(() => null);\n\t\t\t\t\tif (stat?.isDirectory() && !entry.startsWith(\".\")) {\n\t\t\t\t\t\tdirs.push(entry);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tthrow new GitHubPathNotFoundError(spec, dirs);\n\t\t\t}\n\t\t}\n\n\t\t// Remove existing destination and create fresh\n\t\tawait rm(destPath, { recursive: true, force: true });\n\t\tawait mkdir(destPath, { recursive: true });\n\n\t\t// Copy the contents\n\t\tawait cp(copySource, destPath, { recursive: true });\n\n\t\t// Return the relative path from project root\n\t\treturn spec.path\n\t\t\t? `.pspm/skills/_github/${spec.owner}/${spec.repo}/${spec.path}`\n\t\t\t: `.pspm/skills/_github/${spec.owner}/${spec.repo}`;\n\t} finally {\n\t\t// Clean up temp directory\n\t\tawait rm(tempDir, { recursive: true, force: true });\n\t}\n}\n\n/**\n * Get a short display name for a GitHub package.\n *\n * @param spec - GitHub specifier\n * @param commit - Resolved commit SHA (first 7 chars will be shown)\n * @returns Display string like \"github:owner/repo/path (ref@abc1234)\"\n */\nexport function getGitHubDisplayName(\n\tspec: GitHubSpecifier,\n\tcommit?: string,\n): string {\n\tlet name = `github:${spec.owner}/${spec.repo}`;\n\tif (spec.path) {\n\t\tname += `/${spec.path}`;\n\t}\n\n\tif (spec.ref || commit) {\n\t\tconst ref = spec.ref || \"HEAD\";\n\t\tconst shortCommit = commit ? commit.slice(0, 7) : \"\";\n\t\tname += ` (${ref}${shortCommit ? `@${shortCommit}` : \"\"})`;\n\t}\n\n\treturn name;\n}\n","import { mkdir, readFile, stat, writeFile } from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\nimport {\n\tgetLegacyLockfilePath,\n\tgetLockfilePath,\n\tgetRegistryUrl,\n} from \"./config\";\nimport {\n\ttype GitHubLockfileEntry,\n\ttype LocalLockfileEntry,\n\tPSPM_LOCKFILE_SCHEMA_URL,\n\ttype PspmLockfile,\n\ttype PspmLockfileEntry,\n} from \"./lib/index\";\n\n// Re-export types for backward compatibility\nexport type {\n\tGitHubLockfileEntry,\n\tLocalLockfileEntry,\n\tPspmLockfile,\n\tPspmLockfileEntry,\n};\n\n/**\n * Check if legacy lockfile exists (skill-lock.json)\n */\nasync function hasLegacyLockfile(): Promise<boolean> {\n\ttry {\n\t\tawait stat(getLegacyLockfilePath());\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\n/**\n * Migrate legacy lockfile (skill-lock.json) to new format (pspm-lock.json)\n * Returns true if migration was performed\n */\nexport async function migrateLockfileIfNeeded(): Promise<boolean> {\n\tconst legacyPath = getLegacyLockfilePath();\n\tconst newPath = getLockfilePath();\n\n\t// Check if legacy exists and new doesn't\n\ttry {\n\t\tawait stat(legacyPath);\n\t} catch {\n\t\t// No legacy file, nothing to migrate\n\t\treturn false;\n\t}\n\n\ttry {\n\t\tawait stat(newPath);\n\t\t// New file already exists, don't overwrite\n\t\treturn false;\n\t} catch {\n\t\t// New file doesn't exist, migrate\n\t}\n\n\ttry {\n\t\tconst content = await readFile(legacyPath, \"utf-8\");\n\t\tconst oldLockfile = JSON.parse(content) as PspmLockfile;\n\n\t\t// Convert v1 to v2 format\n\t\tconst newLockfile: PspmLockfile = {\n\t\t\tlockfileVersion: 2,\n\t\t\tregistryUrl: oldLockfile.registryUrl,\n\t\t\tpackages: oldLockfile.skills ?? {},\n\t\t};\n\n\t\tawait writeFile(newPath, `${JSON.stringify(newLockfile, null, 2)}\\n`);\n\t\tconsole.log(\"Migrated lockfile: skill-lock.json → pspm-lock.json\");\n\n\t\t// Keep the old file for safety (user can delete it)\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\n/**\n * Read the lockfile, automatically checking for legacy format\n */\nexport async function readLockfile(): Promise<PspmLockfile | null> {\n\tconst lockfilePath = getLockfilePath();\n\n\ttry {\n\t\tconst content = await readFile(lockfilePath, \"utf-8\");\n\t\tconst lockfile = JSON.parse(content) as PspmLockfile;\n\n\t\t// Normalize v1 -> v2 in memory (skills -> packages)\n\t\tif (\n\t\t\tlockfile.lockfileVersion === 1 &&\n\t\t\tlockfile.skills &&\n\t\t\t!lockfile.packages\n\t\t) {\n\t\t\treturn {\n\t\t\t\t...lockfile,\n\t\t\t\tlockfileVersion: 2,\n\t\t\t\tpackages: lockfile.skills,\n\t\t\t};\n\t\t}\n\n\t\treturn lockfile;\n\t} catch {\n\t\t// Try legacy path\n\t\tif (await hasLegacyLockfile()) {\n\t\t\ttry {\n\t\t\t\tconst content = await readFile(getLegacyLockfilePath(), \"utf-8\");\n\t\t\t\tconst legacyLockfile = JSON.parse(content) as PspmLockfile;\n\t\t\t\t// Return normalized v2 format\n\t\t\t\treturn {\n\t\t\t\t\tlockfileVersion: 2,\n\t\t\t\t\tregistryUrl: legacyLockfile.registryUrl,\n\t\t\t\t\tpackages: legacyLockfile.skills ?? {},\n\t\t\t\t};\n\t\t\t} catch {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n}\n\n/**\n * Write the lockfile (v4 format if any package has dependencies, otherwise v3)\n */\nexport async function writeLockfile(lockfile: PspmLockfile): Promise<void> {\n\tconst lockfilePath = getLockfilePath();\n\tawait mkdir(dirname(lockfilePath), { recursive: true });\n\n\tconst packages = lockfile.packages ?? lockfile.skills ?? {};\n\n\t// Check if any package has dependencies to determine version\n\tconst hasDependencies = Object.values(packages).some(\n\t\t(pkg) => pkg.dependencies && Object.keys(pkg.dependencies).length > 0,\n\t);\n\tconst version = hasDependencies ? 4 : 3;\n\n\tconst normalized: PspmLockfile = {\n\t\t$schema: PSPM_LOCKFILE_SCHEMA_URL,\n\t\tlockfileVersion: version,\n\t\tregistryUrl: lockfile.registryUrl,\n\t\tpackages,\n\t};\n\n\t// Only include githubPackages if there are entries\n\tif (\n\t\tlockfile.githubPackages &&\n\t\tObject.keys(lockfile.githubPackages).length > 0\n\t) {\n\t\tnormalized.githubPackages = lockfile.githubPackages;\n\t}\n\n\t// Only include localPackages if there are entries\n\tif (\n\t\tlockfile.localPackages &&\n\t\tObject.keys(lockfile.localPackages).length > 0\n\t) {\n\t\tnormalized.localPackages = lockfile.localPackages;\n\t}\n\n\tawait writeFile(lockfilePath, `${JSON.stringify(normalized, null, 2)}\\n`);\n}\n\n/**\n * Create a new empty lockfile (v4 format)\n */\nexport async function createEmptyLockfile(): Promise<PspmLockfile> {\n\tconst registryUrl = await getRegistryUrl();\n\treturn {\n\t\tlockfileVersion: 4,\n\t\tregistryUrl,\n\t\tpackages: {},\n\t};\n}\n\n/**\n * Get packages from lockfile (handles both v1 and v2)\n */\nfunction getPackages(\n\tlockfile: PspmLockfile,\n): Record<string, PspmLockfileEntry> {\n\treturn lockfile.packages ?? lockfile.skills ?? {};\n}\n\n/**\n * Add a skill to the lockfile\n */\nexport async function addToLockfile(\n\tfullName: string,\n\tentry: PspmLockfileEntry,\n): Promise<void> {\n\tlet lockfile = await readLockfile();\n\tif (!lockfile) {\n\t\tlockfile = await createEmptyLockfile();\n\t}\n\n\tconst packages = getPackages(lockfile);\n\tpackages[fullName] = entry;\n\tlockfile.packages = packages;\n\n\tawait writeLockfile(lockfile);\n}\n\n/**\n * Add a skill to the lockfile with dependencies (v4 format)\n */\nexport async function addToLockfileWithDeps(\n\tfullName: string,\n\tentry: PspmLockfileEntry,\n\tdependencies?: Record<string, string>,\n): Promise<void> {\n\tlet lockfile = await readLockfile();\n\tif (!lockfile) {\n\t\tlockfile = await createEmptyLockfile();\n\t}\n\n\tconst packages = getPackages(lockfile);\n\tconst entryWithDeps = { ...entry };\n\tif (dependencies && Object.keys(dependencies).length > 0) {\n\t\tentryWithDeps.dependencies = dependencies;\n\t}\n\tpackages[fullName] = entryWithDeps;\n\tlockfile.packages = packages;\n\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) {\n\t\treturn false;\n\t}\n\n\tconst packages = getPackages(lockfile);\n\tif (!packages[fullName]) {\n\t\treturn false;\n\t}\n\n\tdelete packages[fullName];\n\tlockfile.packages = packages;\n\tawait writeLockfile(lockfile);\n\treturn true;\n}\n\n/**\n * List all skills in the lockfile\n */\nexport async function listLockfileSkills(): Promise<\n\tArray<{ name: string; entry: PspmLockfileEntry }>\n> {\n\tconst lockfile = await readLockfile();\n\tif (!lockfile) {\n\t\treturn [];\n\t}\n\n\tconst packages = getPackages(lockfile);\n\treturn Object.entries(packages).map(([name, entry]) => ({\n\t\tname,\n\t\tentry: entry as PspmLockfileEntry,\n\t}));\n}\n\n// =============================================================================\n// GitHub Package Support\n// =============================================================================\n\n/**\n * Add a GitHub package to the lockfile\n */\nexport async function addGitHubToLockfile(\n\tspecifier: string,\n\tentry: GitHubLockfileEntry,\n): Promise<void> {\n\tlet lockfile = await readLockfile();\n\tif (!lockfile) {\n\t\tlockfile = await createEmptyLockfile();\n\t}\n\n\tif (!lockfile.githubPackages) {\n\t\tlockfile.githubPackages = {};\n\t}\n\n\tlockfile.githubPackages[specifier] = entry;\n\tawait writeLockfile(lockfile);\n}\n\n/**\n * Remove a GitHub package from the lockfile\n */\nexport async function removeGitHubFromLockfile(\n\tspecifier: string,\n): Promise<boolean> {\n\tconst lockfile = await readLockfile();\n\tif (!lockfile?.githubPackages?.[specifier]) {\n\t\treturn false;\n\t}\n\n\tdelete lockfile.githubPackages[specifier];\n\tawait writeLockfile(lockfile);\n\treturn true;\n}\n\n/**\n * List all GitHub packages in the lockfile\n */\nexport async function listLockfileGitHubPackages(): Promise<\n\tArray<{ specifier: string; entry: GitHubLockfileEntry }>\n> {\n\tconst lockfile = await readLockfile();\n\tif (!lockfile?.githubPackages) {\n\t\treturn [];\n\t}\n\n\treturn Object.entries(lockfile.githubPackages).map(([specifier, entry]) => ({\n\t\tspecifier,\n\t\tentry: entry as GitHubLockfileEntry,\n\t}));\n}\n\n// =============================================================================\n// Local Package Support\n// =============================================================================\n\n/**\n * Add a local package to the lockfile\n */\nexport async function addLocalToLockfile(\n\tspecifier: string,\n\tentry: LocalLockfileEntry,\n): Promise<void> {\n\tlet lockfile = await readLockfile();\n\tif (!lockfile) {\n\t\tlockfile = await createEmptyLockfile();\n\t}\n\n\tif (!lockfile.localPackages) {\n\t\tlockfile.localPackages = {};\n\t}\n\n\tlockfile.localPackages[specifier] = entry;\n\tawait writeLockfile(lockfile);\n}\n\n/**\n * Remove a local package from the lockfile\n */\nexport async function removeLocalFromLockfile(\n\tspecifier: string,\n): Promise<boolean> {\n\tconst lockfile = await readLockfile();\n\tif (!lockfile?.localPackages?.[specifier]) {\n\t\treturn false;\n\t}\n\n\tdelete lockfile.localPackages[specifier];\n\tawait writeLockfile(lockfile);\n\treturn true;\n}\n\n/**\n * List all local packages in the lockfile\n */\nexport async function listLockfileLocalPackages(): Promise<\n\tArray<{ specifier: string; entry: LocalLockfileEntry }>\n> {\n\tconst lockfile = await readLockfile();\n\tif (!lockfile?.localPackages) {\n\t\treturn [];\n\t}\n\n\treturn Object.entries(lockfile.localPackages).map(([specifier, entry]) => ({\n\t\tspecifier,\n\t\tentry: entry as LocalLockfileEntry,\n\t}));\n}\n","import { readFile, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { PspmManifest } from \"./lib/index\";\n\n/**\n * Get the manifest file path (pspm.json in current directory)\n */\nexport function getManifestPath(): string {\n\treturn join(process.cwd(), \"pspm.json\");\n}\n\n/**\n * Read the manifest file (pspm.json)\n * Returns null if file doesn't exist\n */\nexport async function readManifest(): Promise<PspmManifest | null> {\n\ttry {\n\t\tconst content = await readFile(getManifestPath(), \"utf-8\");\n\t\treturn JSON.parse(content) as PspmManifest;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\n/**\n * Write the manifest file (pspm.json)\n */\nexport async function writeManifest(manifest: PspmManifest): Promise<void> {\n\tconst content = JSON.stringify(manifest, null, 2);\n\tawait writeFile(getManifestPath(), `${content}\\n`);\n}\n\n/**\n * Create a minimal manifest with just dependencies\n * Similar to how npm creates package.json with just dependencies when you run `npm add`\n * This is for consuming packages, not publishing - so only dependencies are needed\n */\nexport async function createMinimalManifest(): Promise<PspmManifest> {\n\treturn {\n\t\tdependencies: {},\n\t} as PspmManifest;\n}\n\n/**\n * Ensure manifest exists, creating a minimal one if needed\n * Returns the manifest (existing or newly created)\n */\nexport async function ensureManifest(): Promise<PspmManifest> {\n\tlet manifest = await readManifest();\n\n\tif (!manifest) {\n\t\tmanifest = await createMinimalManifest();\n\t\tawait writeManifest(manifest);\n\t}\n\n\treturn manifest;\n}\n\n/**\n * Add a dependency to the manifest\n * Creates the manifest if it doesn't exist\n *\n * @param skillName - Full skill name (e.g., \"@user/alice/my-skill\")\n * @param versionRange - Version range to save (e.g., \"^1.0.0\")\n */\nexport async function addDependency(\n\tskillName: string,\n\tversionRange: string,\n): Promise<void> {\n\tconst manifest = await ensureManifest();\n\n\t// Initialize dependencies if not present\n\tif (!manifest.dependencies) {\n\t\tmanifest.dependencies = {};\n\t}\n\n\t// Add or update the dependency\n\tmanifest.dependencies[skillName] = versionRange;\n\n\tawait writeManifest(manifest);\n}\n\n/**\n * Remove a dependency from the manifest\n *\n * @param skillName - Full skill name (e.g., \"@user/alice/my-skill\")\n * @returns true if dependency was removed, false if it didn't exist\n */\nexport async function removeDependency(skillName: string): Promise<boolean> {\n\tconst manifest = await readManifest();\n\n\tif (!manifest?.dependencies?.[skillName]) {\n\t\treturn false;\n\t}\n\n\tdelete manifest.dependencies[skillName];\n\tawait writeManifest(manifest);\n\treturn true;\n}\n\n/**\n * Get all dependencies from the manifest\n * Returns empty object if manifest doesn't exist or has no dependencies\n */\nexport async function getDependencies(): Promise<Record<string, string>> {\n\tconst manifest = await readManifest();\n\treturn manifest?.dependencies ?? {};\n}\n\n/**\n * Get all GitHub dependencies from the manifest\n * Returns empty object if manifest doesn't exist or has no GitHub dependencies\n */\nexport async function getGitHubDependencies(): Promise<Record<string, string>> {\n\tconst manifest = await readManifest();\n\treturn manifest?.githubDependencies ?? {};\n}\n\n/**\n * Add a GitHub dependency to the manifest\n * Creates the manifest if it doesn't exist\n *\n * @param specifier - GitHub specifier (e.g., \"github:owner/repo/path\")\n * @param ref - Git ref (branch, tag, or \"latest\")\n */\nexport async function addGitHubDependency(\n\tspecifier: string,\n\tref: string,\n): Promise<void> {\n\tconst manifest = await ensureManifest();\n\n\t// Initialize githubDependencies if not present\n\tif (!manifest.githubDependencies) {\n\t\tmanifest.githubDependencies = {};\n\t}\n\n\t// Add or update the dependency\n\tmanifest.githubDependencies[specifier] = ref;\n\n\tawait writeManifest(manifest);\n}\n\n/**\n * Remove a GitHub dependency from the manifest\n *\n * @param specifier - GitHub specifier (e.g., \"github:owner/repo/path\")\n * @returns true if dependency was removed, false if it didn't exist\n */\nexport async function removeGitHubDependency(\n\tspecifier: string,\n): Promise<boolean> {\n\tconst manifest = await readManifest();\n\n\tif (!manifest?.githubDependencies?.[specifier]) {\n\t\treturn false;\n\t}\n\n\tdelete manifest.githubDependencies[specifier];\n\tawait writeManifest(manifest);\n\treturn true;\n}\n\n// =============================================================================\n// Local Dependency Support\n// =============================================================================\n\n/**\n * Get all local dependencies from the manifest\n * Returns empty object if manifest doesn't exist or has no local dependencies\n */\nexport async function getLocalDependencies(): Promise<Record<string, string>> {\n\tconst manifest = await readManifest();\n\treturn manifest?.localDependencies ?? {};\n}\n\n/**\n * Add a local dependency to the manifest\n * Creates the manifest if it doesn't exist\n *\n * @param specifier - Local specifier (e.g., \"file:../my-skill\")\n * @param version - Always \"*\" for local packages\n */\nexport async function addLocalDependency(\n\tspecifier: string,\n\tversion = \"*\",\n): Promise<void> {\n\tconst manifest = await ensureManifest();\n\n\t// Initialize localDependencies if not present\n\tif (!manifest.localDependencies) {\n\t\tmanifest.localDependencies = {};\n\t}\n\n\t// Add or update the dependency\n\tmanifest.localDependencies[specifier] = version;\n\n\tawait writeManifest(manifest);\n}\n\n/**\n * Remove a local dependency from the manifest\n *\n * @param specifier - Local specifier (e.g., \"file:../my-skill\")\n * @returns true if dependency was removed, false if it didn't exist\n */\nexport async function removeLocalDependency(\n\tspecifier: string,\n): Promise<boolean> {\n\tconst manifest = await readManifest();\n\n\tif (!manifest?.localDependencies?.[specifier]) {\n\t\treturn false;\n\t}\n\n\tdelete manifest.localDependencies[specifier];\n\tawait writeManifest(manifest);\n\treturn true;\n}\n","/**\n * Symlink management for agent skill directories.\n *\n * Creates relative symlinks from agent-specific directories (e.g., .claude/skills/)\n * to the central .pspm/skills/ directory for portability.\n */\n\nimport { lstat, mkdir, readlink, rm, symlink } from \"node:fs/promises\";\nimport { dirname, join, relative } from \"node:path\";\nimport { resolveAgentConfig } from \"./agents\";\nimport type { AgentConfig } from \"./lib/index\";\n\n/**\n * Options for creating agent symlinks.\n */\nexport interface CreateSymlinksOptions {\n\t/** Agent names to create symlinks for */\n\tagents: string[];\n\t/** Project root directory */\n\tprojectRoot: string;\n\t/** Custom agent configuration overrides from pspm.json */\n\tagentConfigs?: Record<string, AgentConfig>;\n}\n\n/**\n * Information about an installed skill for symlinking.\n */\nexport interface SkillInfo {\n\t/** Skill name (used as symlink name) */\n\tname: string;\n\t/** Path to skill within .pspm/skills/ (relative to project root) */\n\tsourcePath: string;\n}\n\n/**\n * Create symlinks for all skills to specified agent directories.\n *\n * @param skills - List of skills to create symlinks for\n * @param options - Symlink creation options\n */\nexport async function createAgentSymlinks(\n\tskills: SkillInfo[],\n\toptions: CreateSymlinksOptions,\n): Promise<void> {\n\tconst { agents, projectRoot, agentConfigs } = options;\n\n\t// Skip if \"none\" agent\n\tif (agents.length === 1 && agents[0] === \"none\") {\n\t\treturn;\n\t}\n\n\tfor (const agentName of agents) {\n\t\tconst config = resolveAgentConfig(agentName, agentConfigs);\n\n\t\tif (!config) {\n\t\t\tconsole.warn(`Warning: Unknown agent \"${agentName}\", skipping symlinks`);\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst agentSkillsDir = join(projectRoot, config.skillsDir);\n\n\t\t// Create agent skills directory\n\t\tawait mkdir(agentSkillsDir, { recursive: true });\n\n\t\tfor (const skill of skills) {\n\t\t\tconst symlinkPath = join(agentSkillsDir, skill.name);\n\t\t\tconst targetPath = join(projectRoot, skill.sourcePath);\n\n\t\t\t// Calculate relative path from symlink location to target\n\t\t\tconst relativeTarget = relative(dirname(symlinkPath), targetPath);\n\n\t\t\tawait createSymlink(symlinkPath, relativeTarget, skill.name);\n\t\t}\n\t}\n}\n\n/**\n * Create a single symlink, handling existing files/symlinks.\n *\n * @param symlinkPath - Absolute path where symlink will be created\n * @param target - Relative path to target (relative to symlink's parent dir)\n * @param skillName - Name for logging\n */\nasync function createSymlink(\n\tsymlinkPath: string,\n\ttarget: string,\n\tskillName: string,\n): Promise<void> {\n\ttry {\n\t\t// Check if something exists at the symlink path\n\t\tconst stats = await lstat(symlinkPath).catch(() => null);\n\n\t\tif (stats) {\n\t\t\tif (stats.isSymbolicLink()) {\n\t\t\t\t// Check if it points to the correct target\n\t\t\t\tconst existingTarget = await readlink(symlinkPath);\n\t\t\t\tif (existingTarget === target) {\n\t\t\t\t\t// Already correct, nothing to do\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t// Remove incorrect symlink\n\t\t\t\tawait rm(symlinkPath);\n\t\t\t} else {\n\t\t\t\t// Regular file or directory exists - warn and skip\n\t\t\t\tconsole.warn(\n\t\t\t\t\t`Warning: File exists at symlink path for \"${skillName}\", skipping: ${symlinkPath}`,\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\t// Create the symlink\n\t\tawait symlink(target, symlinkPath);\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\tconsole.warn(\n\t\t\t`Warning: Failed to create symlink for \"${skillName}\": ${message}`,\n\t\t);\n\t}\n}\n\n/**\n * Remove symlinks for a skill from all agent directories.\n *\n * @param skillName - Name of the skill (symlink name)\n * @param options - Symlink options\n */\nexport async function removeAgentSymlinks(\n\tskillName: string,\n\toptions: CreateSymlinksOptions,\n): Promise<void> {\n\tconst { agents, projectRoot, agentConfigs } = options;\n\n\t// Skip if \"none\" agent\n\tif (agents.length === 1 && agents[0] === \"none\") {\n\t\treturn;\n\t}\n\n\tfor (const agentName of agents) {\n\t\tconst config = resolveAgentConfig(agentName, agentConfigs);\n\n\t\tif (!config) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst symlinkPath = join(projectRoot, config.skillsDir, skillName);\n\n\t\ttry {\n\t\t\tconst stats = await lstat(symlinkPath).catch(() => null);\n\n\t\t\tif (stats?.isSymbolicLink()) {\n\t\t\t\tawait rm(symlinkPath);\n\t\t\t}\n\t\t} catch {\n\t\t\t// Ignore errors - symlink may not exist\n\t\t}\n\t}\n}\n\n/**\n * Get the source path for a registry skill within .pspm/skills/.\n *\n * @param username - Skill author username\n * @param skillName - Skill name\n * @returns Relative path from project root (e.g., \".pspm/skills/alice/my-skill\")\n */\nexport function getRegistrySkillPath(\n\tusername: string,\n\tskillName: string,\n): string {\n\treturn `.pspm/skills/${username}/${skillName}`;\n}\n\n/**\n * Get the source path for a GitHub skill within .pspm/skills/.\n *\n * @param owner - GitHub repository owner\n * @param repo - GitHub repository name\n * @param path - Optional path within the repository\n * @returns Relative path from project root (e.g., \".pspm/skills/_github/owner/repo/path\")\n */\nexport function getGitHubSkillPath(\n\towner: string,\n\trepo: string,\n\tpath?: string,\n): string {\n\tif (path) {\n\t\treturn `.pspm/skills/_github/${owner}/${repo}/${path}`;\n\t}\n\treturn `.pspm/skills/_github/${owner}/${repo}`;\n}\n\n/**\n * Get the source path for a local skill within .pspm/skills/.\n *\n * @param skillName - Skill name\n * @returns Relative path from project root (e.g., \".pspm/skills/_local/my-skill\")\n */\nexport function getLocalSkillPath(skillName: string): string {\n\treturn `.pspm/skills/_local/${skillName}`;\n}\n\n/**\n * Check which agents have symlinks for a given skill.\n *\n * @param skillName - Name of the skill (symlink name)\n * @param agents - Agent names to check\n * @param projectRoot - Project root directory\n * @param agentConfigs - Custom agent configurations\n * @returns Array of agent names that have valid symlinks\n */\nexport async function getLinkedAgents(\n\tskillName: string,\n\tagents: string[],\n\tprojectRoot: string,\n\tagentConfigs?: Record<string, AgentConfig>,\n): Promise<string[]> {\n\tconst linkedAgents: string[] = [];\n\n\tfor (const agentName of agents) {\n\t\tconst config = resolveAgentConfig(agentName, agentConfigs);\n\t\tif (!config) continue;\n\n\t\tconst symlinkPath = join(projectRoot, config.skillsDir, skillName);\n\n\t\ttry {\n\t\t\tconst stats = await lstat(symlinkPath);\n\t\t\tif (stats.isSymbolicLink()) {\n\t\t\t\tlinkedAgents.push(agentName);\n\t\t\t}\n\t\t} catch {\n\t\t\t// Symlink doesn't exist\n\t\t}\n\t}\n\n\treturn linkedAgents;\n}\n","import { mkdir, rm, stat, symlink } from \"node:fs/promises\";\nimport { basename, dirname, join, relative, resolve } from \"node:path\";\nimport { parseAgentArg, promptForAgents } from \"@/agents\";\nimport { configure, getSkillVersion, listSkillVersions } from \"@/api-client\";\nimport { getSkillsDir, getTokenForRegistry, resolveConfig } from \"@/config\";\nimport { extractApiErrorMessage } from \"@/errors\";\nimport {\n\tdownloadGitHubPackage,\n\textractGitHubPackage,\n\tgetGitHubDisplayName,\n} from \"@/github\";\nimport {\n\tcalculateIntegrity,\n\ttype DependencyNode,\n\tformatGitHubSpecifier,\n\ttype GitHubLockfileEntry,\n\tgetGitHubSkillName,\n\tisGitHubSpecifier,\n\ttype LocalLockfileEntry,\n\tMAX_DEPENDENCY_DEPTH,\n\tparseGitHubSpecifier,\n\tparseSkillSpecifier,\n\tprintResolutionErrors,\n\tresolveRecursive,\n\tresolveVersion,\n} from \"@/lib/index\";\nimport {\n\taddGitHubToLockfile,\n\taddLocalToLockfile,\n\taddToLockfileWithDeps,\n} from \"@/lockfile\";\nimport {\n\taddDependency,\n\taddGitHubDependency,\n\taddLocalDependency,\n\treadManifest,\n} from \"@/manifest\";\nimport {\n\tcreateAgentSymlinks,\n\tgetGitHubSkillPath,\n\tgetLocalSkillPath,\n\tgetRegistrySkillPath,\n\ttype SkillInfo,\n} from \"@/symlinks\";\n\n/**\n * Check if a specifier is a local file reference\n */\nfunction isLocalSpecifier(specifier: string): boolean {\n\treturn (\n\t\tspecifier.startsWith(\"file:\") ||\n\t\tspecifier.startsWith(\"./\") ||\n\t\tspecifier.startsWith(\"../\")\n\t);\n}\n\n/**\n * Parse a local specifier and return the path\n */\nfunction parseLocalPath(specifier: string): string {\n\tif (specifier.startsWith(\"file:\")) {\n\t\treturn specifier.slice(5); // Remove \"file:\" prefix\n\t}\n\treturn specifier;\n}\n\n/**\n * Normalize a path to a file: specifier\n */\nfunction normalizeToFileSpecifier(path: string): string {\n\tif (path.startsWith(\"file:\")) {\n\t\treturn path;\n\t}\n\treturn `file:${path}`;\n}\n\nexport interface AddOptions {\n\tsave?: boolean;\n\tagent?: string;\n\tyes?: boolean;\n}\n\n/** Resolved package info from validation phase */\ninterface ResolvedRegistryPackage {\n\ttype: \"registry\";\n\tspecifier: string;\n\tusername: string;\n\tname: string;\n\tversionRange: string | undefined;\n\tresolvedVersion: string;\n\tversionInfo: {\n\t\tdownloadUrl: string;\n\t\tchecksum: string;\n\t};\n}\n\ninterface ResolvedGitHubPackage {\n\ttype: \"github\";\n\tspecifier: string;\n\tparsed: ReturnType<typeof parseGitHubSpecifier> & object;\n\tref: string;\n\tdownloadResult: {\n\t\tbuffer: Buffer;\n\t\tcommit: string;\n\t\tintegrity: string;\n\t};\n}\n\ninterface ResolvedLocalPackage {\n\ttype: \"local\";\n\t/** Original specifier (e.g., \"file:../my-skill\" or \"../my-skill\") */\n\tspecifier: string;\n\t/** Normalized specifier with file: prefix */\n\tnormalizedSpecifier: string;\n\t/** Original path from specifier */\n\tpath: string;\n\t/** Resolved absolute path */\n\tresolvedPath: string;\n\t/** Skill name (last segment of path) */\n\tname: string;\n}\n\ntype ResolvedPackage =\n\t| ResolvedRegistryPackage\n\t| ResolvedGitHubPackage\n\t| ResolvedLocalPackage;\n\nexport async function add(\n\tspecifiers: string[],\n\toptions: AddOptions,\n): Promise<void> {\n\t// Phase 1: Validate and resolve all packages first\n\tconsole.log(\"Resolving packages...\\n\");\n\n\tconst resolvedPackages: ResolvedPackage[] = [];\n\tconst validationErrors: { specifier: string; error: string }[] = [];\n\n\tfor (const specifier of specifiers) {\n\t\ttry {\n\t\t\tif (isLocalSpecifier(specifier)) {\n\t\t\t\tconst resolved = await validateLocalPackage(specifier);\n\t\t\t\tresolvedPackages.push(resolved);\n\t\t\t} else if (isGitHubSpecifier(specifier)) {\n\t\t\t\tconst resolved = await validateGitHubPackage(specifier);\n\t\t\t\tresolvedPackages.push(resolved);\n\t\t\t} else {\n\t\t\t\tconst resolved = await validateRegistryPackage(specifier);\n\t\t\t\tresolvedPackages.push(resolved);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconst message = error instanceof Error ? error.message : \"Unknown error\";\n\t\t\tvalidationErrors.push({ specifier, error: message });\n\t\t\tconsole.error(`Failed to resolve ${specifier}: ${message}\\n`);\n\t\t}\n\t}\n\n\t// If all packages failed validation, exit early\n\tif (resolvedPackages.length === 0) {\n\t\tconsole.error(\"No packages could be resolved.\");\n\t\tprocess.exit(1);\n\t}\n\n\t// Show validation summary if there were failures\n\tif (validationErrors.length > 0) {\n\t\tconsole.log(\n\t\t\t`Resolved ${resolvedPackages.length} of ${specifiers.length} packages.\\n`,\n\t\t);\n\t}\n\n\t// Phase 2: Resolve recursive dependencies for registry packages\n\tconst config = await resolveConfig();\n\tconst apiKey = getTokenForRegistry(config, config.registryUrl);\n\n\t// Build root deps from validated registry packages\n\tconst registryPackages = resolvedPackages.filter(\n\t\t(p): p is ResolvedRegistryPackage => p.type === \"registry\",\n\t);\n\tconst githubPackages = resolvedPackages.filter(\n\t\t(p): p is ResolvedGitHubPackage => p.type === \"github\",\n\t);\n\tconst localPackages = resolvedPackages.filter(\n\t\t(p): p is ResolvedLocalPackage => p.type === \"local\",\n\t);\n\n\tlet resolutionResult: Awaited<ReturnType<typeof resolveRecursive>> | null =\n\t\tnull;\n\n\tif (registryPackages.length > 0) {\n\t\tconst rootDeps: Record<string, string> = {};\n\t\tfor (const pkg of registryPackages) {\n\t\t\tconst fullName = `@user/${pkg.username}/${pkg.name}`;\n\t\t\trootDeps[fullName] = pkg.versionRange || `^${pkg.resolvedVersion}`;\n\t\t}\n\n\t\t// Resolve recursively\n\t\tconsole.log(\"Resolving dependencies...\");\n\t\tresolutionResult = await resolveRecursive(rootDeps, {\n\t\t\tmaxDepth: MAX_DEPENDENCY_DEPTH,\n\t\t\tregistryUrl: config.registryUrl,\n\t\t\tapiKey,\n\t\t});\n\n\t\t// Handle resolution errors\n\t\tif (!resolutionResult.success) {\n\t\t\tprintResolutionErrors(\n\t\t\t\tresolutionResult.graph.errors,\n\t\t\t\tresolutionResult.graph.conflicts,\n\t\t\t);\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\tconst transitiveDeps = resolutionResult.installOrder.filter(\n\t\t\t(name) => !rootDeps[name],\n\t\t);\n\t\tif (transitiveDeps.length > 0) {\n\t\t\tconsole.log(\n\t\t\t\t`Resolved ${transitiveDeps.length} transitive dependencies.\\n`,\n\t\t\t);\n\t\t} else {\n\t\t\tconsole.log();\n\t\t}\n\t}\n\n\t// Phase 3: Determine which agents to use (after validation)\n\tlet agents: string[];\n\tconst manifest = await readManifest();\n\n\tif (options.agent) {\n\t\t// If --agent flag is provided, use it\n\t\tagents = parseAgentArg(options.agent);\n\t} else if (manifest) {\n\t\t// If pspm.json exists, use default agent (respect manifest's agent config)\n\t\tagents = parseAgentArg(undefined);\n\t} else if (options.yes) {\n\t\t// If -y flag is used, use default agent without prompting\n\t\tagents = parseAgentArg(undefined);\n\t} else {\n\t\t// No pspm.json exists, prompt user to select agents\n\t\tconsole.log(\"No pspm.json found. Let's set up your project.\\n\");\n\t\tagents = await promptForAgents();\n\t\tconsole.log(); // Add newline after selection\n\t}\n\n\t// Phase 4: Install all resolved packages\n\tconst results: { specifier: string; success: boolean; error?: string }[] = [];\n\n\t// Install registry packages in topological order (dependencies first)\n\tif (resolutionResult) {\n\t\tfor (const name of resolutionResult.installOrder) {\n\t\t\tconst node = resolutionResult.graph.nodes.get(name);\n\t\t\tif (!node) continue;\n\n\t\t\ttry {\n\t\t\t\tawait installFromNode(node, {\n\t\t\t\t\t...options,\n\t\t\t\t\tresolvedAgents: agents,\n\t\t\t\t\tisDirect: node.isDirect,\n\t\t\t\t});\n\t\t\t\tresults.push({ specifier: name, success: true });\n\t\t\t} catch (error) {\n\t\t\t\tconst message =\n\t\t\t\t\terror instanceof Error ? error.message : \"Unknown error\";\n\t\t\t\tresults.push({\n\t\t\t\t\tspecifier: name,\n\t\t\t\t\tsuccess: false,\n\t\t\t\t\terror: message,\n\t\t\t\t});\n\t\t\t\tconsole.error(`Failed to install ${name}: ${message}\\n`);\n\t\t\t}\n\t\t}\n\t}\n\n\t// Install GitHub packages (no recursive resolution for now)\n\tfor (const resolved of githubPackages) {\n\t\ttry {\n\t\t\tawait installGitHubPackage(resolved, {\n\t\t\t\t...options,\n\t\t\t\tresolvedAgents: agents,\n\t\t\t});\n\t\t\tresults.push({ specifier: resolved.specifier, success: true });\n\t\t} catch (error) {\n\t\t\tconst message = error instanceof Error ? error.message : \"Unknown error\";\n\t\t\tresults.push({\n\t\t\t\tspecifier: resolved.specifier,\n\t\t\t\tsuccess: false,\n\t\t\t\terror: message,\n\t\t\t});\n\t\t\tconsole.error(`Failed to install ${resolved.specifier}: ${message}\\n`);\n\t\t}\n\t}\n\n\t// Install local packages (symlink to local directory)\n\tfor (const resolved of localPackages) {\n\t\ttry {\n\t\t\tawait installLocalPackage(resolved, {\n\t\t\t\t...options,\n\t\t\t\tresolvedAgents: agents,\n\t\t\t});\n\t\t\tresults.push({ specifier: resolved.specifier, success: true });\n\t\t} catch (error) {\n\t\t\tconst message = error instanceof Error ? error.message : \"Unknown error\";\n\t\t\tresults.push({\n\t\t\t\tspecifier: resolved.specifier,\n\t\t\t\tsuccess: false,\n\t\t\t\terror: message,\n\t\t\t});\n\t\t\tconsole.error(`Failed to install ${resolved.specifier}: ${message}\\n`);\n\t\t}\n\t}\n\n\t// Print summary if multiple packages were requested\n\tif (specifiers.length > 1) {\n\t\tconst succeeded = results.filter((r) => r.success).length;\n\t\tconst failed =\n\t\t\tresults.filter((r) => !r.success).length + validationErrors.length;\n\t\tconsole.log(`\\nSummary: ${succeeded} added, ${failed} failed`);\n\n\t\tif (failed > 0) {\n\t\t\tprocess.exit(1);\n\t\t}\n\t}\n}\n\ninterface InternalAddOptions extends AddOptions {\n\tresolvedAgents: string[];\n}\n\ninterface InternalAddOptionsWithDirect extends InternalAddOptions {\n\t/** Whether this is a direct dependency (from command line) */\n\tisDirect: boolean;\n}\n\n/**\n * Install a package from a DependencyNode (resolved from resolver)\n */\nasync function installFromNode(\n\tnode: DependencyNode,\n\toptions: InternalAddOptionsWithDirect,\n): Promise<void> {\n\t// Parse package name\n\tconst match = node.name.match(/^@user\\/([^/]+)\\/([^/]+)$/);\n\tif (!match) {\n\t\tthrow new Error(`Invalid package name: ${node.name}`);\n\t}\n\tconst [, username, name] = match;\n\n\tconsole.log(`Installing ${node.name}@${node.version}...`);\n\n\t// Get config for download\n\tconst config = await resolveConfig();\n\tconst apiKey = getTokenForRegistry(config, config.registryUrl);\n\n\t// Download the tarball\n\tconst isPresignedUrl =\n\t\tnode.downloadUrl.includes(\".r2.cloudflarestorage.com\") ||\n\t\tnode.downloadUrl.includes(\"X-Amz-Signature\");\n\n\tconst downloadHeaders: Record<string, string> = {};\n\tif (!isPresignedUrl && apiKey) {\n\t\tdownloadHeaders.Authorization = `Bearer ${apiKey}`;\n\t}\n\n\tconst tarballResponse = await fetch(node.downloadUrl, {\n\t\theaders: downloadHeaders,\n\t\tredirect: \"follow\",\n\t});\n\n\tif (!tarballResponse.ok) {\n\t\tthrow new Error(`Failed to download tarball (${tarballResponse.status})`);\n\t}\n\n\tconst tarballBuffer = Buffer.from(await tarballResponse.arrayBuffer());\n\n\t// Calculate integrity\n\tconst integrity = calculateIntegrity(tarballBuffer);\n\n\t// Verify checksum matches\n\tif (integrity !== node.integrity) {\n\t\tthrow new Error(\"Checksum verification failed\");\n\t}\n\n\t// Create skills directory\n\tconst skillsDir = getSkillsDir();\n\tconst destDir = join(skillsDir, username, name);\n\tawait mkdir(destDir, { recursive: true });\n\n\t// Extract tarball\n\tconst { writeFile } = await import(\"node:fs/promises\");\n\tconst tempFile = join(destDir, \".temp.tgz\");\n\tawait writeFile(tempFile, tarballBuffer);\n\n\tconst { exec } = await import(\"node:child_process\");\n\tconst { promisify } = await import(\"node:util\");\n\tconst execAsync = promisify(exec);\n\n\ttry {\n\t\t// Clear destination and extract\n\t\tawait rm(destDir, { recursive: true, force: true });\n\t\tawait mkdir(destDir, { recursive: true });\n\t\tawait writeFile(tempFile, tarballBuffer);\n\t\tawait execAsync(\n\t\t\t`tar -xzf \"${tempFile}\" -C \"${destDir}\" --strip-components=1`,\n\t\t);\n\t} finally {\n\t\tawait rm(tempFile, { force: true });\n\t}\n\n\t// Update lockfile with dependencies\n\t// Convert dependencies to resolved version format\n\tconst resolvedDeps: Record<string, string> = {};\n\tfor (const [depName, _range] of Object.entries(node.dependencies)) {\n\t\t// The resolver already resolved the version, but we need to look it up\n\t\t// from the graph. For now, store the range; install.ts will use resolved versions\n\t\tresolvedDeps[depName] = _range;\n\t}\n\n\tawait addToLockfileWithDeps(\n\t\tnode.name,\n\t\t{\n\t\t\tversion: node.version,\n\t\t\tresolved: node.downloadUrl,\n\t\t\tintegrity,\n\t\t\tdeprecated: node.deprecated,\n\t\t},\n\t\tObject.keys(resolvedDeps).length > 0 ? resolvedDeps : undefined,\n\t);\n\n\t// Only add direct dependencies to pspm.json\n\tif (options.isDirect) {\n\t\tconst dependencyRange = node.versionRange || `^${node.version}`;\n\t\tawait addDependency(node.name, dependencyRange);\n\t}\n\n\t// Create agent symlinks\n\tconst agents = options.resolvedAgents;\n\tif (agents[0] !== \"none\") {\n\t\tconst skillManifest = await readManifest();\n\t\tconst skillInfo: SkillInfo = {\n\t\t\tname,\n\t\t\tsourcePath: getRegistrySkillPath(username, name),\n\t\t};\n\n\t\tawait createAgentSymlinks([skillInfo], {\n\t\t\tagents,\n\t\t\tprojectRoot: process.cwd(),\n\t\t\tagentConfigs: skillManifest?.agents,\n\t\t});\n\t}\n\n\tconsole.log(`Installed ${node.name}@${node.version}`);\n\tconsole.log(`Location: ${destDir}`);\n}\n\n/**\n * Validate and resolve a registry package (without downloading)\n */\nasync function validateRegistryPackage(\n\tspecifier: string,\n): Promise<ResolvedRegistryPackage> {\n\t// Get config - auth may be optional for public packages\n\tconst config = await resolveConfig();\n\tconst registryUrl = config.registryUrl;\n\tconst apiKey = getTokenForRegistry(config, registryUrl);\n\n\t// Parse the specifier\n\tconst parsed = parseSkillSpecifier(specifier);\n\tif (!parsed) {\n\t\tthrow new Error(\n\t\t\t`Invalid skill specifier \"${specifier}\". Use format: @user/{username}/{name}[@{version}]`,\n\t\t);\n\t}\n\n\tconst { username, name, versionRange } = parsed;\n\n\t// Configure SDK - apiKey may be undefined for public packages\n\tconfigure({ registryUrl, apiKey });\n\n\tconsole.log(`Resolving ${specifier}...`);\n\n\t// Get available versions\n\tconst versionsResponse = await listSkillVersions(username, name);\n\tif (versionsResponse.status !== 200) {\n\t\tif (versionsResponse.status === 401) {\n\t\t\tif (!apiKey) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Package @user/${username}/${name} requires authentication. Please run 'pspm login' to authenticate`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tthrow new Error(\n\t\t\t\t`Access denied to @user/${username}/${name}. You may not have permission to access this private package.`,\n\t\t\t);\n\t\t}\n\t\tconst errorMessage = extractApiErrorMessage(\n\t\t\tversionsResponse,\n\t\t\t`Skill @user/${username}/${name} not found`,\n\t\t);\n\t\tthrow new Error(errorMessage);\n\t}\n\tconst versions = versionsResponse.data;\n\tif (versions.length === 0) {\n\t\tthrow new Error(`Skill @user/${username}/${name} not found`);\n\t}\n\n\t// Resolve version\n\tconst versionStrings = versions.map((v: { version: string }) => v.version);\n\tconst resolvedVersion = resolveVersion(versionRange || \"*\", versionStrings);\n\n\tif (!resolvedVersion) {\n\t\tthrow new Error(\n\t\t\t`No version matching \"${versionRange || \"latest\"}\" found for @user/${username}/${name}. Available versions: ${versionStrings.join(\", \")}`,\n\t\t);\n\t}\n\n\t// Get version details with download URL\n\tconst versionResponse = await getSkillVersion(\n\t\tusername,\n\t\tname,\n\t\tresolvedVersion,\n\t);\n\tif (versionResponse.status !== 200 || !versionResponse.data) {\n\t\tconst errorMessage = extractApiErrorMessage(\n\t\t\tversionResponse,\n\t\t\t`Version ${resolvedVersion} not found`,\n\t\t);\n\t\tthrow new Error(errorMessage);\n\t}\n\n\tconsole.log(`Resolved @user/${username}/${name}@${resolvedVersion}`);\n\n\treturn {\n\t\ttype: \"registry\",\n\t\tspecifier,\n\t\tusername,\n\t\tname,\n\t\tversionRange,\n\t\tresolvedVersion,\n\t\tversionInfo: {\n\t\t\tdownloadUrl: versionResponse.data.downloadUrl,\n\t\t\tchecksum: versionResponse.data.checksum,\n\t\t},\n\t};\n}\n\n/**\n * Validate and download a GitHub package\n */\nasync function validateGitHubPackage(\n\tspecifier: string,\n): Promise<ResolvedGitHubPackage> {\n\tconst parsed = parseGitHubSpecifier(specifier);\n\tif (!parsed) {\n\t\tthrow new Error(\n\t\t\t`Invalid GitHub specifier \"${specifier}\". Use format: github:{owner}/{repo}[/{path}][@{ref}]`,\n\t\t);\n\t}\n\n\tconst ref = parsed.ref || \"HEAD\";\n\tconsole.log(`Resolving ${getGitHubDisplayName(parsed)}...`);\n\n\t// Download from GitHub (also validates existence)\n\tconst result = await downloadGitHubPackage(parsed);\n\n\tconsole.log(`Resolved ${specifier} (${ref}@${result.commit.slice(0, 7)})`);\n\n\treturn {\n\t\ttype: \"github\",\n\t\tspecifier,\n\t\tparsed,\n\t\tref,\n\t\tdownloadResult: result,\n\t};\n}\n\n/**\n * Install a pre-validated GitHub package\n */\nasync function installGitHubPackage(\n\tresolved: ResolvedGitHubPackage,\n\toptions: InternalAddOptions,\n): Promise<void> {\n\tconst { specifier, parsed, ref, downloadResult } = resolved;\n\n\tconsole.log(\n\t\t`Installing ${specifier} (${ref}@${downloadResult.commit.slice(0, 7)})...`,\n\t);\n\n\t// Extract to skills directory\n\tconst skillsDir = getSkillsDir();\n\tconst destPath = await extractGitHubPackage(\n\t\tparsed,\n\t\tdownloadResult.buffer,\n\t\tskillsDir,\n\t);\n\n\t// Add to lockfile\n\tconst lockfileSpecifier = formatGitHubSpecifier({\n\t\towner: parsed.owner,\n\t\trepo: parsed.repo,\n\t\tpath: parsed.path,\n\t\t// Don't include ref in the specifier key, it's stored in gitRef\n\t});\n\n\tconst entry: GitHubLockfileEntry = {\n\t\tversion: downloadResult.commit.slice(0, 7),\n\t\tresolved: `https://github.com/${parsed.owner}/${parsed.repo}`,\n\t\tintegrity: downloadResult.integrity,\n\t\tgitCommit: downloadResult.commit,\n\t\tgitRef: ref,\n\t};\n\n\tawait addGitHubToLockfile(lockfileSpecifier, entry);\n\n\t// Add to pspm.json githubDependencies\n\tawait addGitHubDependency(lockfileSpecifier, ref);\n\n\t// Create agent symlinks\n\tconst agents = options.resolvedAgents;\n\tif (agents[0] !== \"none\") {\n\t\tconst manifest = await readManifest();\n\t\tconst skillName = getGitHubSkillName(parsed);\n\t\tconst skillInfo: SkillInfo = {\n\t\t\tname: skillName,\n\t\t\tsourcePath: getGitHubSkillPath(parsed.owner, parsed.repo, parsed.path),\n\t\t};\n\n\t\tawait createAgentSymlinks([skillInfo], {\n\t\t\tagents,\n\t\t\tprojectRoot: process.cwd(),\n\t\t\tagentConfigs: manifest?.agents,\n\t\t});\n\t}\n\n\tconsole.log(\n\t\t`Installed ${specifier} (${ref}@${downloadResult.commit.slice(0, 7)})`,\n\t);\n\tconsole.log(`Location: ${destPath}`);\n}\n\n// =============================================================================\n// Local Package Support\n// =============================================================================\n\n/**\n * Validate a local package path exists and contains a valid skill\n */\nasync function validateLocalPackage(\n\tspecifier: string,\n): Promise<ResolvedLocalPackage> {\n\tconst path = parseLocalPath(specifier);\n\tconst resolvedPath = resolve(process.cwd(), path);\n\tconst normalizedSpecifier = normalizeToFileSpecifier(path);\n\n\tconsole.log(`Resolving ${specifier}...`);\n\n\t// Check if directory exists\n\ttry {\n\t\tconst stats = await stat(resolvedPath);\n\t\tif (!stats.isDirectory()) {\n\t\t\tthrow new Error(`Path is not a directory: ${resolvedPath}`);\n\t\t}\n\t} catch (error) {\n\t\tif ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n\t\t\tthrow new Error(\n\t\t\t\t`Directory not found: ${resolvedPath}\\n Check that the path exists and is accessible.`,\n\t\t\t);\n\t\t}\n\t\tthrow error;\n\t}\n\n\t// Check for SKILL.md or pspm.json\n\tlet hasSkillMd = false;\n\tlet hasPspmJson = false;\n\n\ttry {\n\t\tawait stat(join(resolvedPath, \"SKILL.md\"));\n\t\thasSkillMd = true;\n\t} catch {\n\t\t// SKILL.md not found\n\t}\n\n\ttry {\n\t\tawait stat(join(resolvedPath, \"pspm.json\"));\n\t\thasPspmJson = true;\n\t} catch {\n\t\t// pspm.json not found\n\t}\n\n\tif (!hasSkillMd && !hasPspmJson) {\n\t\tthrow new Error(\n\t\t\t`Not a valid skill directory: ${resolvedPath}\\n Missing both SKILL.md and pspm.json. At least one is required.`,\n\t\t);\n\t}\n\n\t// Get skill name from the last segment of the path\n\tconst name = basename(resolvedPath);\n\n\tconsole.log(`Resolved ${specifier} -> ${resolvedPath}`);\n\n\treturn {\n\t\ttype: \"local\",\n\t\tspecifier,\n\t\tnormalizedSpecifier,\n\t\tpath,\n\t\tresolvedPath,\n\t\tname,\n\t};\n}\n\n/**\n * Install a local package by creating a symlink\n */\nasync function installLocalPackage(\n\tresolved: ResolvedLocalPackage,\n\toptions: InternalAddOptions,\n): Promise<void> {\n\tconst { specifier, normalizedSpecifier, path, resolvedPath, name } = resolved;\n\n\tconsole.log(`Installing ${specifier}...`);\n\n\t// Create .pspm/skills/_local directory\n\tconst skillsDir = getSkillsDir();\n\tconst localSkillsDir = join(skillsDir, \"_local\");\n\tawait mkdir(localSkillsDir, { recursive: true });\n\n\t// Create symlink from .pspm/skills/_local/{name} -> resolved path\n\tconst symlinkPath = join(localSkillsDir, name);\n\n\t// Calculate relative path from symlink location to target\n\tconst relativeTarget = relative(dirname(symlinkPath), resolvedPath);\n\n\t// Remove existing symlink if it exists\n\ttry {\n\t\tawait rm(symlinkPath, { force: true });\n\t} catch {\n\t\t// Ignore errors\n\t}\n\n\t// Create the symlink\n\tawait symlink(relativeTarget, symlinkPath);\n\n\t// Add to lockfile\n\tconst entry: LocalLockfileEntry = {\n\t\tversion: \"local\",\n\t\tpath,\n\t\tresolvedPath,\n\t\tname,\n\t};\n\tawait addLocalToLockfile(normalizedSpecifier, entry);\n\n\t// Add to pspm.json localDependencies\n\tawait addLocalDependency(normalizedSpecifier);\n\n\t// Create agent symlinks\n\tconst agents = options.resolvedAgents;\n\tif (agents[0] !== \"none\") {\n\t\tconst manifest = await readManifest();\n\t\tconst skillInfo: SkillInfo = {\n\t\t\tname,\n\t\t\tsourcePath: getLocalSkillPath(name),\n\t\t};\n\n\t\tawait createAgentSymlinks([skillInfo], {\n\t\t\tagents,\n\t\t\tprojectRoot: process.cwd(),\n\t\t\tagentConfigs: manifest?.agents,\n\t\t});\n\t}\n\n\tconsole.log(`Installed ${specifier} (local)`);\n\tconsole.log(`Location: ${symlinkPath} -> ${resolvedPath}`);\n}\n","import { changeSkillAccess, configure } from \"@/api-client\";\nimport { getRegistryUrl, requireApiKey, resolveConfig } from \"@/config\";\nimport {\n\tisGitHubSpecifier,\n\tparseGitHubSpecifier,\n\tparseSkillSpecifier,\n} from \"@/lib/index\";\n\n/** Check if specifier is a local file reference */\nfunction isLocalSpecifier(specifier: string): boolean {\n\treturn (\n\t\tspecifier.startsWith(\"file:\") ||\n\t\tspecifier.startsWith(\"./\") ||\n\t\tspecifier.startsWith(\"../\")\n\t);\n}\n\nexport interface AccessOptions {\n\tpublic?: boolean;\n\tprivate?: boolean;\n}\n\n/**\n * Change the visibility of a skill package.\n *\n * Usage:\n * pspm access --public # Make current package public\n * pspm access @user/bob/skill --public # Make specific package public\n *\n * Note: Making a package public is irreversible (like npm).\n */\nexport async function access(\n\tspecifier: string | undefined,\n\toptions: AccessOptions,\n): Promise<void> {\n\ttry {\n\t\tconst apiKey = await requireApiKey();\n\t\tconst registryUrl = await getRegistryUrl();\n\n\t\t// Determine visibility from options\n\t\tif (options.public && options.private) {\n\t\t\tconsole.error(\"Error: Cannot specify both --public and --private\");\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\tif (!options.public && !options.private) {\n\t\t\tconsole.error(\"Error: Must specify either --public or --private\");\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\tconst visibility = options.public ? \"public\" : \"private\";\n\n\t\t// Parse package name - either from specifier or from current directory's pspm.json\n\t\tlet packageName: string;\n\t\tlet packageUsername: string | undefined;\n\n\t\tif (specifier) {\n\t\t\t// Check for GitHub specifiers - not supported for access command\n\t\t\tif (isGitHubSpecifier(specifier)) {\n\t\t\t\tconst ghSpec = parseGitHubSpecifier(specifier);\n\t\t\t\tif (ghSpec) {\n\t\t\t\t\tconsole.error(`Error: Cannot change visibility of GitHub packages.`);\n\t\t\t\t\tconsole.error(\n\t\t\t\t\t\t` \"${specifier}\" is hosted on GitHub, not the PSPM registry.`,\n\t\t\t\t\t);\n\t\t\t\t\tconsole.error(\n\t\t\t\t\t\t` Visibility can only be changed for packages published to the registry.`,\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tconsole.error(`Error: Invalid GitHub specifier \"${specifier}\".`);\n\t\t\t\t\tconsole.error(` Use format: github:{owner}/{repo}[/{path}][@{ref}]`);\n\t\t\t\t}\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\n\t\t\t// Check for local file specifiers - not supported for access command\n\t\t\tif (isLocalSpecifier(specifier)) {\n\t\t\t\tconsole.error(`Error: Cannot change visibility of local packages.`);\n\t\t\t\tconsole.error(\n\t\t\t\t\t` \"${specifier}\" is a local directory, not a registry package.`,\n\t\t\t\t);\n\t\t\t\tconsole.error(\n\t\t\t\t\t` Visibility can only be changed for packages published to the registry.`,\n\t\t\t\t);\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\n\t\t\t// Parse as registry specifier\n\t\t\tconst parsed = parseSkillSpecifier(specifier);\n\t\t\tif (!parsed) {\n\t\t\t\tconsole.error(`Error: Invalid package specifier \"${specifier}\".`);\n\t\t\t\tconsole.error(` Use format: @user/{username}/{name}`);\n\t\t\t\tconsole.error(``);\n\t\t\t\tconsole.error(` Examples:`);\n\t\t\t\tconsole.error(` pspm access @user/myname/my-skill --public`);\n\t\t\t\tconsole.error(\n\t\t\t\t\t` pspm access --public (uses current directory's pspm.json)`,\n\t\t\t\t);\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\t\t\tpackageName = parsed.name;\n\t\t\tpackageUsername = parsed.username;\n\t\t} else {\n\t\t\t// Read from current directory's pspm.json or package.json\n\t\t\tconst { readFile } = await import(\"node:fs/promises\");\n\t\t\tconst { join } = await import(\"node:path\");\n\n\t\t\tlet manifest: { name: string } | null = null;\n\n\t\t\t// Try pspm.json first\n\t\t\ttry {\n\t\t\t\tconst content = await readFile(\n\t\t\t\t\tjoin(process.cwd(), \"pspm.json\"),\n\t\t\t\t\t\"utf-8\",\n\t\t\t\t);\n\t\t\t\tmanifest = JSON.parse(content);\n\t\t\t} catch {\n\t\t\t\t// Try package.json\n\t\t\t\ttry {\n\t\t\t\t\tconst content = await readFile(\n\t\t\t\t\t\tjoin(process.cwd(), \"package.json\"),\n\t\t\t\t\t\t\"utf-8\",\n\t\t\t\t\t);\n\t\t\t\t\tmanifest = JSON.parse(content);\n\t\t\t\t} catch {\n\t\t\t\t\tconsole.error(\n\t\t\t\t\t\t\"Error: No pspm.json or package.json found in current directory\",\n\t\t\t\t\t);\n\t\t\t\t\tconsole.error(\n\t\t\t\t\t\t\"Either run this command in a package directory or specify a package name\",\n\t\t\t\t\t);\n\t\t\t\t\tprocess.exit(1);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (!manifest?.name) {\n\t\t\t\tconsole.error(\"Error: Package manifest is missing 'name' field\");\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\n\t\t\tpackageName = manifest.name;\n\t\t}\n\n\t\t// If username not from specifier, get from config\n\t\tif (!packageUsername) {\n\t\t\tconst config = await resolveConfig();\n\t\t\tpackageUsername = config.username;\n\t\t}\n\n\t\tif (!packageUsername) {\n\t\t\tconsole.error(\n\t\t\t\t\"Error: Could not determine username. Please use the full specifier: @user/{username}/{name}\",\n\t\t\t);\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\t// Configure SDK and make API call\n\t\tconfigure({ registryUrl, apiKey });\n\n\t\tconsole.log(`Setting ${packageName} to ${visibility}...`);\n\n\t\tconst response = await changeSkillAccess(packageUsername, packageName, {\n\t\t\tvisibility,\n\t\t});\n\n\t\tif (response.status !== 200 || !response.data) {\n\t\t\tconst errorMessage = response.error ?? \"Failed to change visibility\";\n\t\t\tconsole.error(`Error: ${errorMessage}`);\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\tconst result = response.data;\n\t\tconsole.log(\n\t\t\t`+ @user/${result.username}/${result.name} is now ${result.visibility}`,\n\t\t);\n\n\t\tif (visibility === \"public\") {\n\t\t\tconsole.log(\"\");\n\t\t\tconsole.log(\n\t\t\t\t\"Note: This action is irreversible. Public packages cannot be made private.\",\n\t\t\t);\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","export { type AccessOptions, access } from \"./access\";\nexport { type AddOptions, add } from \"./add\";\nexport {\n\ttype ConfigInitOptions,\n\tconfigInit,\n\tconfigShow,\n} from \"./config/index\";\nexport { type DeprecateOptions, deprecate } from \"./deprecate\";\nexport { type InitOptions, init } from \"./init\";\nexport { type InstallOptions, install } from \"./install\";\nexport { type LinkOptions, link } from \"./link\";\nexport { type ListOptions, list } from \"./list\";\nexport { type LoginOptions, login } from \"./login\";\nexport { logout } from \"./logout\";\nexport { type MigrateOptions, migrate } from \"./migrate\";\nexport { type PublishOptions, publish } from \"./publish\";\nexport { remove } from \"./remove\";\nexport { type UnpublishOptions, unpublish } from \"./unpublish\";\nexport { type UpdateOptions, update } from \"./update\";\nexport { type VersionBump, type VersionOptions, version } from \"./version\";\nexport { whoami } from \"./whoami\";\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 { findProjectConfig, getConfigPath, resolveConfig } from \"@/config\";\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 {\n\tconfigure,\n\tdeprecateSkillVersion,\n\tundeprecateSkillVersion,\n} from \"@/api-client\";\nimport { getRegistryUrl, requireApiKey } from \"@/config\";\nimport { parseSkillSpecifier } from \"@/lib/index\";\n\nexport interface DeprecateOptions {\n\tundo?: boolean;\n}\n\n/**\n * Deprecate or undeprecate a skill version\n *\n * Usage:\n * pspm deprecate @user/bob/skill@1.0.0 \"Use v2.0.0 instead\"\n * pspm deprecate @user/bob/skill@1.0.0 --undo\n */\nexport async function deprecate(\n\tspecifier: string,\n\tmessage: string | undefined,\n\toptions: DeprecateOptions,\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\tif (!versionRange) {\n\t\t\tconsole.error(\n\t\t\t\t\"Error: Version is required for deprecation. Use format: @user/{username}/{name}@{version}\",\n\t\t\t);\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\t// Configure SDK\n\t\tconfigure({ registryUrl, apiKey });\n\n\t\tif (options.undo) {\n\t\t\t// Remove deprecation\n\t\t\tconsole.log(\n\t\t\t\t`Removing deprecation from @user/${username}/${name}@${versionRange}...`,\n\t\t\t);\n\n\t\t\tconst response = await undeprecateSkillVersion(\n\t\t\t\tusername,\n\t\t\t\tname,\n\t\t\t\tversionRange,\n\t\t\t);\n\t\t\tif (response.status !== 200) {\n\t\t\t\tconsole.error(\n\t\t\t\t\t`Error: ${response.error || \"Failed to remove deprecation\"}`,\n\t\t\t\t);\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\n\t\t\tconsole.log(\n\t\t\t\t`Removed deprecation from @user/${username}/${name}@${versionRange}`,\n\t\t\t);\n\t\t} else {\n\t\t\t// Add deprecation\n\t\t\tif (!message) {\n\t\t\t\tconsole.error(\n\t\t\t\t\t\"Error: Deprecation message is required. Usage: pspm deprecate <specifier> <message>\",\n\t\t\t\t);\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\n\t\t\tconsole.log(`Deprecating @user/${username}/${name}@${versionRange}...`);\n\n\t\t\tconst response = await deprecateSkillVersion(\n\t\t\t\tusername,\n\t\t\t\tname,\n\t\t\t\tversionRange,\n\t\t\t\tmessage,\n\t\t\t);\n\t\t\tif (response.status !== 200) {\n\t\t\t\tconsole.error(\n\t\t\t\t\t`Error: ${response.error || \"Failed to deprecate version\"}`,\n\t\t\t\t);\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\n\t\t\tconsole.log(`Deprecated @user/${username}/${name}@${versionRange}`);\n\t\t\tconsole.log(`Message: ${message}`);\n\t\t\tconsole.log(\"\");\n\t\t\tconsole.log(\n\t\t\t\t\"Users installing this version will see a deprecation warning.\",\n\t\t\t);\n\t\t\tconsole.log(\"The package is still available for download.\");\n\t\t}\n\t} catch (error) {\n\t\tconst errorMessage =\n\t\t\terror instanceof Error ? error.message : \"Unknown error\";\n\t\tconsole.error(`Error: ${errorMessage}`);\n\t\tprocess.exit(1);\n\t}\n}\n","import { readFile, stat, writeFile } from \"node:fs/promises\";\nimport { basename, join } from \"node:path\";\nimport { createInterface } from \"node:readline\";\nimport {\n\tDEFAULT_SKILL_FILES,\n\tPSPM_SCHEMA_URL,\n\ttype PspmManifest,\n} from \"@/lib/index\";\n\nexport interface InitOptions {\n\tname?: string;\n\tdescription?: string;\n\tauthor?: string;\n\tyes?: boolean;\n\tforce?: boolean;\n}\n\n/**\n * Simple readline prompt that mimics npm's style\n */\nfunction prompt(\n\trl: ReturnType<typeof createInterface>,\n\tquestion: string,\n\tdefaultValue: string,\n): Promise<string> {\n\treturn new Promise((resolve) => {\n\t\tconst displayDefault = defaultValue ? ` (${defaultValue})` : \"\";\n\t\trl.question(`${question}${displayDefault} `, (answer) => {\n\t\t\tresolve(answer.trim() || defaultValue);\n\t\t});\n\t});\n}\n\n/**\n * Try to read existing package.json to extract some defaults\n */\nasync function readExistingPackageJson(): Promise<Partial<PspmManifest> | null> {\n\ttry {\n\t\tconst content = await readFile(\n\t\t\tjoin(process.cwd(), \"package.json\"),\n\t\t\t\"utf-8\",\n\t\t);\n\t\tconst pkg = JSON.parse(content);\n\t\treturn {\n\t\t\tname: pkg.name,\n\t\t\tversion: pkg.version,\n\t\t\tdescription: pkg.description,\n\t\t\tauthor: typeof pkg.author === \"string\" ? pkg.author : pkg.author?.name,\n\t\t\tlicense: pkg.license,\n\t\t};\n\t} catch {\n\t\treturn null;\n\t}\n}\n\n/**\n * Try to detect author from git config\n */\nasync function getGitAuthor(): Promise<string | null> {\n\ttry {\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\tconst [nameResult, emailResult] = await Promise.all([\n\t\t\texecAsync(\"git config user.name\").catch(() => ({ stdout: \"\" })),\n\t\t\texecAsync(\"git config user.email\").catch(() => ({ stdout: \"\" })),\n\t\t]);\n\n\t\tconst name = nameResult.stdout.trim();\n\t\tconst email = emailResult.stdout.trim();\n\n\t\tif (name && email) {\n\t\t\treturn `${name} <${email}>`;\n\t\t}\n\t\tif (name) {\n\t\t\treturn name;\n\t\t}\n\t\treturn null;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\n/**\n * Sanitize a name for use as skill name\n * - Remove @ prefix and scope\n * - Convert to lowercase\n * - Replace invalid characters with hyphens\n */\nfunction sanitizeName(name: string): string {\n\t// Remove npm scope if present (e.g., @user/package -> package)\n\tconst withoutScope = name.replace(/^@[^/]+\\//, \"\");\n\t// Lowercase and replace invalid chars\n\treturn withoutScope\n\t\t.toLowerCase()\n\t\t.replace(/[^a-z0-9_-]/g, \"-\")\n\t\t.replace(/^-+|-+$/g, \"\")\n\t\t.replace(/-+/g, \"-\");\n}\n\n/**\n * Validate skill name format\n */\nfunction isValidName(name: string): boolean {\n\treturn /^[a-z][a-z0-9_-]*$/.test(name);\n}\n\n/**\n * Validate semver format\n */\nfunction isValidVersion(version: string): boolean {\n\treturn /^\\d+\\.\\d+\\.\\d+(-[a-zA-Z0-9.-]+)?(\\+[a-zA-Z0-9.-]+)?$/.test(version);\n}\n\n/**\n * Initialize a new pspm.json manifest in the current directory\n */\nexport async function init(options: InitOptions): Promise<void> {\n\ttry {\n\t\tconst pspmJsonPath = join(process.cwd(), \"pspm.json\");\n\n\t\t// Check if pspm.json already exists\n\t\tlet exists = false;\n\t\ttry {\n\t\t\tawait stat(pspmJsonPath);\n\t\t\texists = true;\n\t\t} catch {\n\t\t\t// File doesn't exist, good\n\t\t}\n\n\t\tif (exists && !options.force) {\n\t\t\tconsole.error(\"Error: pspm.json already exists in this directory.\");\n\t\t\tconsole.error(\"Use --force to overwrite.\");\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\t// Try to read defaults from existing package.json and git\n\t\tconst existingPkg = await readExistingPackageJson();\n\t\tconst gitAuthor = await getGitAuthor();\n\n\t\t// Determine default values\n\t\tconst defaultName = sanitizeName(\n\t\t\toptions.name || existingPkg?.name || basename(process.cwd()),\n\t\t);\n\t\tconst defaultVersion = existingPkg?.version || \"0.1.0\";\n\t\tconst defaultDescription =\n\t\t\toptions.description || existingPkg?.description || \"\";\n\t\tconst defaultAuthor =\n\t\t\toptions.author || existingPkg?.author || gitAuthor || \"\";\n\t\tconst defaultLicense = existingPkg?.license || \"MIT\";\n\t\tconst defaultMain = \"SKILL.md\";\n\t\tconst defaultCapabilities = \"\";\n\n\t\tlet manifest: PspmManifest;\n\n\t\tif (options.yes) {\n\t\t\t// Non-interactive mode: use all defaults\n\t\t\tmanifest = {\n\t\t\t\t$schema: PSPM_SCHEMA_URL,\n\t\t\t\tname: defaultName,\n\t\t\t\tversion: defaultVersion,\n\t\t\t\tdescription: defaultDescription || undefined,\n\t\t\t\tauthor: defaultAuthor || undefined,\n\t\t\t\tlicense: defaultLicense,\n\t\t\t\ttype: \"skill\",\n\t\t\t\tcapabilities: [],\n\t\t\t\tmain: defaultMain,\n\t\t\t\trequirements: {\n\t\t\t\t\tpspm: \">=0.1.0\",\n\t\t\t\t},\n\t\t\t\tfiles: [...DEFAULT_SKILL_FILES],\n\t\t\t\tdependencies: {},\n\t\t\t\tprivate: false,\n\t\t\t};\n\t\t} else {\n\t\t\t// Interactive mode: prompt for each field\n\t\t\tconsole.log(\n\t\t\t\t\"This utility will walk you through creating a pspm.json file.\",\n\t\t\t);\n\t\t\tconsole.log(\n\t\t\t\t\"It only covers the most common items, and tries to guess sensible defaults.\",\n\t\t\t);\n\t\t\tconsole.log(\"\");\n\t\t\tconsole.log(\n\t\t\t\t\"See `pspm init --help` for definitive documentation on these fields\",\n\t\t\t);\n\t\t\tconsole.log(\"and exactly what they do.\");\n\t\t\tconsole.log(\"\");\n\t\t\tconsole.log(\"Press ^C at any time to quit.\");\n\n\t\t\tconst rl = createInterface({\n\t\t\t\tinput: process.stdin,\n\t\t\t\toutput: process.stdout,\n\t\t\t});\n\n\t\t\ttry {\n\t\t\t\t// Prompt for each field\n\t\t\t\tlet name = await prompt(rl, \"skill name:\", defaultName);\n\n\t\t\t\t// Validate name and re-prompt if invalid\n\t\t\t\twhile (!isValidName(name)) {\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\" Name must start with a lowercase letter and contain only lowercase letters, numbers, hyphens, and underscores.\",\n\t\t\t\t\t);\n\t\t\t\t\tname = await prompt(rl, \"skill name:\", sanitizeName(name));\n\t\t\t\t}\n\n\t\t\t\tlet version = await prompt(rl, \"version:\", defaultVersion);\n\n\t\t\t\t// Validate version and re-prompt if invalid\n\t\t\t\twhile (!isValidVersion(version)) {\n\t\t\t\t\tconsole.log(\" Version must be valid semver (e.g., 1.0.0)\");\n\t\t\t\t\tversion = await prompt(rl, \"version:\", \"0.1.0\");\n\t\t\t\t}\n\n\t\t\t\tconst description = await prompt(\n\t\t\t\t\trl,\n\t\t\t\t\t\"description:\",\n\t\t\t\t\tdefaultDescription,\n\t\t\t\t);\n\t\t\t\tconst main = await prompt(rl, \"entry point:\", defaultMain);\n\t\t\t\tconst capabilitiesStr = await prompt(\n\t\t\t\t\trl,\n\t\t\t\t\t\"capabilities (comma-separated):\",\n\t\t\t\t\tdefaultCapabilities,\n\t\t\t\t);\n\t\t\t\tconst author = await prompt(rl, \"author:\", defaultAuthor);\n\t\t\t\tconst license = await prompt(rl, \"license:\", defaultLicense);\n\n\t\t\t\trl.close();\n\n\t\t\t\t// Parse capabilities\n\t\t\t\tconst capabilities = capabilitiesStr\n\t\t\t\t\t? capabilitiesStr\n\t\t\t\t\t\t\t.split(\",\")\n\t\t\t\t\t\t\t.map((s) => s.trim())\n\t\t\t\t\t\t\t.filter(Boolean)\n\t\t\t\t\t: [];\n\n\t\t\t\tmanifest = {\n\t\t\t\t\t$schema: PSPM_SCHEMA_URL,\n\t\t\t\t\tname,\n\t\t\t\t\tversion,\n\t\t\t\t\tdescription: description || undefined,\n\t\t\t\t\tauthor: author || undefined,\n\t\t\t\t\tlicense,\n\t\t\t\t\ttype: \"skill\",\n\t\t\t\t\tcapabilities,\n\t\t\t\t\tmain,\n\t\t\t\t\trequirements: {\n\t\t\t\t\t\tpspm: \">=0.1.0\",\n\t\t\t\t\t},\n\t\t\t\t\tfiles: [...DEFAULT_SKILL_FILES],\n\t\t\t\t\tdependencies: {},\n\t\t\t\t\tprivate: false,\n\t\t\t\t};\n\t\t\t} catch (error) {\n\t\t\t\trl.close();\n\t\t\t\t// User pressed Ctrl+C\n\t\t\t\tif (\n\t\t\t\t\terror instanceof Error &&\n\t\t\t\t\terror.message.includes(\"readline was closed\")\n\t\t\t\t) {\n\t\t\t\t\tconsole.log(\"\\nAborted.\");\n\t\t\t\t\tprocess.exit(0);\n\t\t\t\t}\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t}\n\n\t\t// Remove undefined/empty fields for cleaner output\n\t\tif (!manifest.description) manifest.description = undefined;\n\t\tif (!manifest.author) manifest.author = undefined;\n\t\tif (manifest.capabilities?.length === 0) manifest.capabilities = undefined;\n\n\t\t// Show preview\n\t\tconst content = JSON.stringify(manifest, null, 2);\n\n\t\tconsole.log(\"\");\n\t\tconsole.log(`About to write to ${pspmJsonPath}:`);\n\t\tconsole.log(\"\");\n\t\tconsole.log(content);\n\t\tconsole.log(\"\");\n\n\t\t// In interactive mode, confirm before writing\n\t\tif (!options.yes) {\n\t\t\tconst rl = createInterface({\n\t\t\t\tinput: process.stdin,\n\t\t\t\toutput: process.stdout,\n\t\t\t});\n\n\t\t\tconst confirm = await prompt(rl, \"Is this OK?\", \"yes\");\n\t\t\trl.close();\n\n\t\t\tif (confirm.toLowerCase() !== \"yes\" && confirm.toLowerCase() !== \"y\") {\n\t\t\t\tconsole.log(\"Aborted.\");\n\t\t\t\tprocess.exit(0);\n\t\t\t}\n\t\t}\n\n\t\t// Write the manifest\n\t\tawait writeFile(pspmJsonPath, `${content}\\n`);\n\n\t\t// Check if SKILL.md exists\n\t\ttry {\n\t\t\tawait stat(join(process.cwd(), \"SKILL.md\"));\n\t\t} catch {\n\t\t\tconsole.log(\n\t\t\t\t\"Note: Create a SKILL.md file with your skill's prompt content.\",\n\t\t\t);\n\t\t}\n\n\t\tif (existingPkg) {\n\t\t\tconsole.log(\"Note: Values were derived from existing package.json.\");\n\t\t\tconsole.log(\" pspm.json is for publishing to PSPM registry.\");\n\t\t\tconsole.log(\" package.json can still be used for npm dependencies.\");\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 { createHash } from \"node:crypto\";\nimport { mkdir, readFile, rm, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { parseAgentArg, promptForAgents } from \"@/agents\";\nimport { configure, getSkillVersion, listSkillVersions } from \"@/api-client\";\nimport {\n\tgetCacheDir,\n\tgetSkillsDir,\n\tgetTokenForRegistry,\n\tresolveConfig,\n} from \"@/config\";\nimport { extractApiErrorMessage } from \"@/errors\";\nimport {\n\tdownloadGitHubPackage,\n\textractGitHubPackage,\n\tGitHubNotFoundError,\n\tGitHubPathNotFoundError,\n\tGitHubRateLimitError,\n\tgetGitHubDisplayName,\n} from \"@/github\";\nimport {\n\tcalculateIntegrity,\n\tcomputeInstallOrder,\n\ttype GitHubLockfileEntry,\n\tgetGitHubSkillName,\n\ttype PspmLockfileEntry,\n\tparseGitHubSpecifier,\n\tparseSkillSpecifier,\n\tresolveVersion,\n} from \"@/lib/index\";\nimport {\n\taddGitHubToLockfile,\n\taddToLockfile,\n\tmigrateLockfileIfNeeded,\n\treadLockfile,\n} from \"@/lockfile\";\nimport {\n\tgetDependencies,\n\tgetGitHubDependencies,\n\treadManifest,\n} from \"@/manifest\";\nimport {\n\tcreateAgentSymlinks,\n\tgetGitHubSkillPath,\n\tgetRegistrySkillPath,\n\ttype SkillInfo,\n} from \"@/symlinks\";\n\n/**\n * Get cache file path from integrity hash\n */\nfunction getCacheFilePath(cacheDir: string, integrity: string): string {\n\t// integrity is \"sha256-{base64hash}\"\n\t// Convert to safe filename: sha256-{hex}.tgz\n\tconst match = integrity.match(/^sha256-(.+)$/);\n\tif (!match) {\n\t\tthrow new Error(`Invalid integrity format: ${integrity}`);\n\t}\n\t// Convert base64 to hex for safe filename\n\tconst base64Hash = match[1];\n\tconst hexHash = Buffer.from(base64Hash, \"base64\").toString(\"hex\");\n\treturn join(cacheDir, `sha256-${hexHash}.tgz`);\n}\n\n/**\n * Try to read tarball from cache\n */\nasync function readFromCache(\n\tcacheDir: string,\n\tintegrity: string,\n): Promise<Buffer | null> {\n\ttry {\n\t\tconst cachePath = getCacheFilePath(cacheDir, integrity);\n\t\tconst data = await readFile(cachePath);\n\n\t\t// Verify integrity\n\t\tconst actualIntegrity = `sha256-${createHash(\"sha256\").update(data).digest(\"base64\")}`;\n\t\tif (actualIntegrity !== integrity) {\n\t\t\t// Cache corrupted, remove it\n\t\t\tawait rm(cachePath, { force: true });\n\t\t\treturn null;\n\t\t}\n\n\t\treturn data;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\n/**\n * Write tarball to cache\n */\nasync function writeToCache(\n\tcacheDir: string,\n\tintegrity: string,\n\tdata: Buffer,\n): Promise<void> {\n\ttry {\n\t\tawait mkdir(cacheDir, { recursive: true });\n\t\tconst cachePath = getCacheFilePath(cacheDir, integrity);\n\t\tawait writeFile(cachePath, data);\n\t} catch {\n\t\t// Cache write failures are non-fatal\n\t}\n}\n\nexport interface InstallOptions {\n\tfrozenLockfile?: boolean;\n\tdir?: string;\n\tagent?: string;\n\tyes?: boolean;\n}\n\nexport async function install(\n\tspecifiers: string[],\n\toptions: InstallOptions,\n): Promise<void> {\n\t// If specifiers are provided, delegate to add command\n\tif (specifiers.length > 0) {\n\t\tconst { add } = await import(\"./add.js\");\n\t\tawait add(specifiers, {\n\t\t\tsave: true,\n\t\t\tagent: options.agent,\n\t\t\tyes: options.yes,\n\t\t});\n\t\treturn;\n\t}\n\n\t// Otherwise, install from lockfile\n\tawait installFromLockfile(options);\n}\n\nasync function installFromLockfile(options: InstallOptions): Promise<void> {\n\ttry {\n\t\t// Get config - auth may be optional for public packages\n\t\tconst config = await resolveConfig();\n\t\tconst registryUrl = config.registryUrl;\n\t\tconst apiKey = getTokenForRegistry(config, registryUrl);\n\t\tconst skillsDir = options.dir || getSkillsDir();\n\t\tconst cacheDir = getCacheDir();\n\n\t\t// Migrate legacy lockfile if needed\n\t\tawait migrateLockfileIfNeeded();\n\n\t\t// Read lockfile and dependencies from pspm.json\n\t\tlet lockfile = await readLockfile();\n\t\tconst manifestDeps = await getDependencies();\n\t\tconst manifestGitHubDeps = await getGitHubDependencies();\n\t\tconst lockfilePackages = lockfile?.packages ?? lockfile?.skills ?? {};\n\t\tconst lockfileGitHubPackages = lockfile?.githubPackages ?? {};\n\n\t\t// Track all installed skills for symlink creation\n\t\tconst installedSkills: SkillInfo[] = [];\n\n\t\t// =================================================================\n\t\t// Phase 1: Resolve missing registry dependencies\n\t\t// =================================================================\n\t\tconst missingDeps: Array<{ fullName: string; versionRange: string }> = [];\n\t\tfor (const [fullName, versionRange] of Object.entries(manifestDeps)) {\n\t\t\tif (!lockfilePackages[fullName]) {\n\t\t\t\tmissingDeps.push({ fullName, versionRange });\n\t\t\t}\n\t\t}\n\n\t\tif (missingDeps.length > 0) {\n\t\t\tif (options.frozenLockfile) {\n\t\t\t\tconsole.error(\n\t\t\t\t\t\"Error: Dependencies in pspm.json are not in lockfile. Cannot install with --frozen-lockfile\",\n\t\t\t\t);\n\t\t\t\tconsole.error(\"Missing dependencies:\");\n\t\t\t\tfor (const dep of missingDeps) {\n\t\t\t\t\tconsole.error(` - ${dep.fullName}@${dep.versionRange}`);\n\t\t\t\t}\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\n\t\t\tconsole.log(`Resolving ${missingDeps.length} new dependency(ies)...\\n`);\n\t\t\tconfigure({ registryUrl, apiKey });\n\n\t\t\tfor (const { fullName, versionRange } of missingDeps) {\n\t\t\t\tconst parsed = parseSkillSpecifier(fullName);\n\t\t\t\tif (!parsed) {\n\t\t\t\t\tconsole.error(`Error: Invalid dependency specifier: ${fullName}`);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst { username, name } = parsed;\n\t\t\t\tconsole.log(`Resolving ${fullName}@${versionRange}...`);\n\n\t\t\t\t// Get available versions\n\t\t\t\tconst versionsResponse = await listSkillVersions(username, name);\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`Skill ${fullName} not found`,\n\t\t\t\t\t);\n\t\t\t\t\tconsole.error(`Error: ${errorMessage}`);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst versions = versionsResponse.data;\n\t\t\t\tif (versions.length === 0) {\n\t\t\t\t\tconsole.error(`Error: Skill ${fullName} not found`);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Resolve version\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 resolved = resolveVersion(versionRange || \"*\", versionStrings);\n\n\t\t\t\tif (!resolved) {\n\t\t\t\t\tconsole.error(\n\t\t\t\t\t\t`Error: No version matching \"${versionRange}\" for ${fullName}`,\n\t\t\t\t\t);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Get version details with download URL\n\t\t\t\tconst versionResponse = await getSkillVersion(username, name, resolved);\n\t\t\t\tif (versionResponse.status !== 200 || !versionResponse.data) {\n\t\t\t\t\tconst errorMessage = extractApiErrorMessage(\n\t\t\t\t\t\tversionResponse,\n\t\t\t\t\t\t`Version ${resolved} not found`,\n\t\t\t\t\t);\n\t\t\t\t\tconsole.error(`Error: ${errorMessage}`);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconst versionInfo = versionResponse.data;\n\n\t\t\t\t// Download the tarball\n\t\t\t\tconst isPresignedUrl =\n\t\t\t\t\tversionInfo.downloadUrl.includes(\".r2.cloudflarestorage.com\") ||\n\t\t\t\t\tversionInfo.downloadUrl.includes(\"X-Amz-Signature\");\n\n\t\t\t\tconst downloadHeaders: Record<string, string> = {};\n\t\t\t\tif (!isPresignedUrl && apiKey) {\n\t\t\t\t\tdownloadHeaders.Authorization = `Bearer ${apiKey}`;\n\t\t\t\t}\n\n\t\t\t\tconst tarballResponse = await fetch(versionInfo.downloadUrl, {\n\t\t\t\t\theaders: downloadHeaders,\n\t\t\t\t\tredirect: \"follow\",\n\t\t\t\t});\n\n\t\t\t\tif (!tarballResponse.ok) {\n\t\t\t\t\tconsole.error(\n\t\t\t\t\t\t`Error: Failed to download tarball for ${fullName} (${tarballResponse.status})`,\n\t\t\t\t\t);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst tarballBuffer = Buffer.from(await tarballResponse.arrayBuffer());\n\t\t\t\tconst integrity = calculateIntegrity(tarballBuffer);\n\n\t\t\t\t// Add to lockfile\n\t\t\t\tawait addToLockfile(fullName, {\n\t\t\t\t\tversion: resolved,\n\t\t\t\t\tresolved: versionInfo.downloadUrl,\n\t\t\t\t\tintegrity,\n\t\t\t\t});\n\n\t\t\t\t// Cache the tarball\n\t\t\t\tawait writeToCache(cacheDir, integrity, tarballBuffer);\n\n\t\t\t\tconsole.log(` Resolved ${fullName}@${resolved}`);\n\t\t\t}\n\n\t\t\t// Re-read lockfile after adding new entries\n\t\t\tlockfile = await readLockfile();\n\t\t}\n\n\t\t// =================================================================\n\t\t// Phase 2: Resolve missing GitHub dependencies\n\t\t// =================================================================\n\t\tconst missingGitHubDeps: Array<{ specifier: string; ref: string }> = [];\n\t\tfor (const [specifier, ref] of Object.entries(manifestGitHubDeps)) {\n\t\t\tif (!lockfileGitHubPackages[specifier]) {\n\t\t\t\tmissingGitHubDeps.push({ specifier, ref });\n\t\t\t}\n\t\t}\n\n\t\tif (missingGitHubDeps.length > 0) {\n\t\t\tif (options.frozenLockfile) {\n\t\t\t\tconsole.error(\n\t\t\t\t\t\"Error: GitHub dependencies in pspm.json are not in lockfile. Cannot install with --frozen-lockfile\",\n\t\t\t\t);\n\t\t\t\tconsole.error(\"Missing GitHub dependencies:\");\n\t\t\t\tfor (const dep of missingGitHubDeps) {\n\t\t\t\t\tconsole.error(` - ${dep.specifier}@${dep.ref}`);\n\t\t\t\t}\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\n\t\t\tconsole.log(\n\t\t\t\t`\\nResolving ${missingGitHubDeps.length} GitHub dependency(ies)...\\n`,\n\t\t\t);\n\n\t\t\tfor (const { specifier, ref } of missingGitHubDeps) {\n\t\t\t\tconst parsed = parseGitHubSpecifier(specifier);\n\t\t\t\tif (!parsed) {\n\t\t\t\t\tconsole.error(`Error: Invalid GitHub specifier: ${specifier}`);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Set the ref from manifest if not in specifier\n\t\t\t\tparsed.ref = parsed.ref || ref;\n\n\t\t\t\tconsole.log(`Resolving ${getGitHubDisplayName(parsed)}...`);\n\n\t\t\t\ttry {\n\t\t\t\t\tconst result = await downloadGitHubPackage(parsed);\n\n\t\t\t\t\t// Extract to skills directory\n\t\t\t\t\tawait extractGitHubPackage(parsed, result.buffer, skillsDir);\n\n\t\t\t\t\t// Add to lockfile\n\t\t\t\t\tconst entry: GitHubLockfileEntry = {\n\t\t\t\t\t\tversion: result.commit.slice(0, 7),\n\t\t\t\t\t\tresolved: `https://github.com/${parsed.owner}/${parsed.repo}`,\n\t\t\t\t\t\tintegrity: result.integrity,\n\t\t\t\t\t\tgitCommit: result.commit,\n\t\t\t\t\t\tgitRef: ref || \"HEAD\",\n\t\t\t\t\t};\n\n\t\t\t\t\tawait addGitHubToLockfile(specifier, entry);\n\n\t\t\t\t\t// Cache the tarball\n\t\t\t\t\tawait writeToCache(cacheDir, result.integrity, result.buffer);\n\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t` Resolved ${specifier} (${ref}@${result.commit.slice(0, 7)})`,\n\t\t\t\t\t);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tif (error instanceof GitHubRateLimitError) {\n\t\t\t\t\t\tconsole.error(`Error: ${error.message}`);\n\t\t\t\t\t} else if (error instanceof GitHubPathNotFoundError) {\n\t\t\t\t\t\tconsole.error(`Error: ${error.message}`);\n\t\t\t\t\t} else if (error instanceof GitHubNotFoundError) {\n\t\t\t\t\t\tconsole.error(`Error: ${error.message}`);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst message =\n\t\t\t\t\t\t\terror instanceof Error ? error.message : String(error);\n\t\t\t\t\t\tconsole.error(`Error resolving ${specifier}: ${message}`);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Re-read lockfile after adding new entries\n\t\t\tlockfile = await readLockfile();\n\t\t}\n\n\t\t// =================================================================\n\t\t// Determine which agents to use (after resolution, before installation)\n\t\t// =================================================================\n\t\tconst manifest = await readManifest();\n\t\tconst agentConfigs = manifest?.agents;\n\n\t\tlet agents: string[];\n\t\tif (options.agent) {\n\t\t\t// If --agent flag is provided, use it\n\t\t\tagents = parseAgentArg(options.agent);\n\t\t} else if (manifest) {\n\t\t\t// If pspm.json exists, use default agent\n\t\t\tagents = parseAgentArg(undefined);\n\t\t} else if (options.yes) {\n\t\t\t// If -y flag is used, use default agent without prompting\n\t\t\tagents = parseAgentArg(undefined);\n\t\t} else {\n\t\t\t// No pspm.json exists, prompt user to select agents\n\t\t\tconsole.log(\"\\nNo pspm.json found. Let's set up your project.\\n\");\n\t\t\tagents = await promptForAgents();\n\t\t\tconsole.log(); // Add newline after selection\n\t\t}\n\n\t\t// =================================================================\n\t\t// Phase 3: Install registry packages from lockfile (topological order)\n\t\t// =================================================================\n\t\tconst packages = lockfile?.packages ?? lockfile?.skills ?? {};\n\t\tconst packageCount = Object.keys(packages).length;\n\n\t\tif (packageCount > 0) {\n\t\t\tconsole.log(`\\nInstalling ${packageCount} registry skill(s)...\\n`);\n\n\t\t\t// Compute topological install order (dependencies first)\n\t\t\tconst installOrder = computeInstallOrder(packages);\n\t\t\tconst entries: [string, PspmLockfileEntry][] = installOrder\n\t\t\t\t.filter((name) => packages[name])\n\t\t\t\t.map((name) => [name, packages[name]]);\n\n\t\t\tfor (const [fullName, entry] of entries) {\n\t\t\t\tconst match = fullName.match(/^@user\\/([^/]+)\\/([^/]+)$/);\n\t\t\t\tif (!match) {\n\t\t\t\t\tconsole.warn(`Warning: Invalid skill name in lockfile: ${fullName}`);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst [, username, name] = match;\n\t\t\t\tconsole.log(`Installing ${fullName}@${entry.version}...`);\n\n\t\t\t\tlet tarballBuffer: Buffer;\n\t\t\t\tlet fromCache = false;\n\n\t\t\t\t// Try to read from cache first\n\t\t\t\tconst cachedTarball = await readFromCache(cacheDir, entry.integrity);\n\t\t\t\tif (cachedTarball) {\n\t\t\t\t\ttarballBuffer = cachedTarball;\n\t\t\t\t\tfromCache = true;\n\t\t\t\t} else {\n\t\t\t\t\t// Download the tarball\n\t\t\t\t\tconst isPresignedUrl =\n\t\t\t\t\t\tentry.resolved.includes(\".r2.cloudflarestorage.com\") ||\n\t\t\t\t\t\tentry.resolved.includes(\"X-Amz-Signature\");\n\n\t\t\t\t\tconst downloadHeaders: Record<string, string> = {};\n\t\t\t\t\tif (!isPresignedUrl && apiKey) {\n\t\t\t\t\t\tdownloadHeaders.Authorization = `Bearer ${apiKey}`;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst response = await fetch(entry.resolved, {\n\t\t\t\t\t\theaders: downloadHeaders,\n\t\t\t\t\t\tredirect: \"follow\",\n\t\t\t\t\t});\n\n\t\t\t\t\tif (!response.ok) {\n\t\t\t\t\t\tif (response.status === 401) {\n\t\t\t\t\t\t\tif (!apiKey) {\n\t\t\t\t\t\t\t\tconsole.error(\n\t\t\t\t\t\t\t\t\t` Error: ${fullName} requires authentication. Run 'pspm login' first.`,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tconsole.error(\n\t\t\t\t\t\t\t\t\t` Error: Access denied to ${fullName}. You may not have permission to access this private package.`,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconsole.error(\n\t\t\t\t\t\t\t\t` Error: Failed to download ${fullName} (${response.status})`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\ttarballBuffer = Buffer.from(await response.arrayBuffer());\n\n\t\t\t\t\t// Verify checksum\n\t\t\t\t\tconst actualIntegrity = `sha256-${createHash(\"sha256\").update(tarballBuffer).digest(\"base64\")}`;\n\n\t\t\t\t\tif (actualIntegrity !== entry.integrity) {\n\t\t\t\t\t\tconsole.error(\n\t\t\t\t\t\t\t` Error: Checksum verification failed for ${fullName}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (options.frozenLockfile) {\n\t\t\t\t\t\t\tprocess.exit(1);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Cache the verified tarball\n\t\t\t\t\tawait writeToCache(cacheDir, entry.integrity, tarballBuffer);\n\t\t\t\t}\n\n\t\t\t\t// Extract tarball\n\t\t\t\tconst destDir = join(skillsDir, username, name);\n\t\t\t\tawait rm(destDir, { recursive: true, force: true });\n\t\t\t\tawait mkdir(destDir, { recursive: true });\n\n\t\t\t\tconst tempFile = join(destDir, \".temp.tgz\");\n\t\t\t\tawait writeFile(tempFile, tarballBuffer);\n\n\t\t\t\tconst { exec } = await import(\"node:child_process\");\n\t\t\t\tconst { promisify } = await import(\"node:util\");\n\t\t\t\tconst execAsync = promisify(exec);\n\n\t\t\t\ttry {\n\t\t\t\t\tawait execAsync(\n\t\t\t\t\t\t`tar -xzf \"${tempFile}\" -C \"${destDir}\" --strip-components=1`,\n\t\t\t\t\t);\n\t\t\t\t} finally {\n\t\t\t\t\tawait rm(tempFile, { force: true });\n\t\t\t\t}\n\n\t\t\t\tconsole.log(\n\t\t\t\t\t` Installed to ${destDir}${fromCache ? \" (from cache)\" : \"\"}`,\n\t\t\t\t);\n\n\t\t\t\t// Track for symlinks\n\t\t\t\tinstalledSkills.push({\n\t\t\t\t\tname,\n\t\t\t\t\tsourcePath: getRegistrySkillPath(username, name),\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\t// =================================================================\n\t\t// Phase 4: Install GitHub packages from lockfile\n\t\t// =================================================================\n\t\tconst githubPackages = lockfile?.githubPackages ?? {};\n\t\tconst githubCount = Object.keys(githubPackages).length;\n\n\t\tif (githubCount > 0) {\n\t\t\tconsole.log(`\\nInstalling ${githubCount} GitHub skill(s)...\\n`);\n\n\t\t\tfor (const [specifier, entry] of Object.entries(githubPackages)) {\n\t\t\t\tconst parsed = parseGitHubSpecifier(specifier);\n\t\t\t\tif (!parsed) {\n\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\t`Warning: Invalid GitHub specifier in lockfile: ${specifier}`,\n\t\t\t\t\t);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst ghEntry = entry as GitHubLockfileEntry;\n\t\t\t\tconsole.log(\n\t\t\t\t\t`Installing ${specifier} (${ghEntry.gitRef}@${ghEntry.gitCommit.slice(0, 7)})...`,\n\t\t\t\t);\n\n\t\t\t\tlet tarballBuffer: Buffer;\n\t\t\t\tlet fromCache = false;\n\n\t\t\t\t// Try to read from cache first\n\t\t\t\tconst cachedTarball = await readFromCache(cacheDir, ghEntry.integrity);\n\t\t\t\tif (cachedTarball) {\n\t\t\t\t\ttarballBuffer = cachedTarball;\n\t\t\t\t\tfromCache = true;\n\t\t\t\t} else {\n\t\t\t\t\t// Download from GitHub\n\t\t\t\t\ttry {\n\t\t\t\t\t\t// Use the locked commit\n\t\t\t\t\t\tconst specWithCommit = { ...parsed, ref: ghEntry.gitCommit };\n\t\t\t\t\t\tconst result = await downloadGitHubPackage(specWithCommit);\n\t\t\t\t\t\ttarballBuffer = result.buffer;\n\n\t\t\t\t\t\t// Verify integrity\n\t\t\t\t\t\tif (result.integrity !== ghEntry.integrity) {\n\t\t\t\t\t\t\tconsole.error(\n\t\t\t\t\t\t\t\t` Error: Checksum verification failed for ${specifier}`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tif (options.frozenLockfile) {\n\t\t\t\t\t\t\t\tprocess.exit(1);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Cache the verified tarball\n\t\t\t\t\t\tawait writeToCache(cacheDir, ghEntry.integrity, tarballBuffer);\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tif (error instanceof GitHubRateLimitError) {\n\t\t\t\t\t\t\tconsole.error(` Error: ${error.message}`);\n\t\t\t\t\t\t} else if (error instanceof GitHubPathNotFoundError) {\n\t\t\t\t\t\t\tconsole.error(` Error: ${error.message}`);\n\t\t\t\t\t\t} else if (error instanceof GitHubNotFoundError) {\n\t\t\t\t\t\t\tconsole.error(` Error: ${error.message}`);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconst message =\n\t\t\t\t\t\t\t\terror instanceof Error ? error.message : String(error);\n\t\t\t\t\t\t\tconsole.error(` Error downloading ${specifier}: ${message}`);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Extract the package\n\t\t\t\ttry {\n\t\t\t\t\tconst destPath = await extractGitHubPackage(\n\t\t\t\t\t\tparsed,\n\t\t\t\t\t\ttarballBuffer,\n\t\t\t\t\t\tskillsDir,\n\t\t\t\t\t);\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t` Installed to ${destPath}${fromCache ? \" (from cache)\" : \"\"}`,\n\t\t\t\t\t);\n\n\t\t\t\t\t// Track for symlinks\n\t\t\t\t\tconst skillName = getGitHubSkillName(parsed);\n\t\t\t\t\tinstalledSkills.push({\n\t\t\t\t\t\tname: skillName,\n\t\t\t\t\t\tsourcePath: getGitHubSkillPath(\n\t\t\t\t\t\t\tparsed.owner,\n\t\t\t\t\t\t\tparsed.repo,\n\t\t\t\t\t\t\tparsed.path,\n\t\t\t\t\t\t),\n\t\t\t\t\t});\n\t\t\t\t} catch (error) {\n\t\t\t\t\tconst message =\n\t\t\t\t\t\terror instanceof Error ? error.message : String(error);\n\t\t\t\t\tconsole.error(` Error extracting ${specifier}: ${message}`);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// =================================================================\n\t\t// Phase 5: Create agent symlinks\n\t\t// =================================================================\n\t\tif (installedSkills.length > 0 && agents[0] !== \"none\") {\n\t\t\tconsole.log(`\\nCreating symlinks for agent(s): ${agents.join(\", \")}...`);\n\n\t\t\tawait createAgentSymlinks(installedSkills, {\n\t\t\t\tagents,\n\t\t\t\tprojectRoot: process.cwd(),\n\t\t\t\tagentConfigs,\n\t\t\t});\n\n\t\t\tconsole.log(\" Symlinks created.\");\n\t\t}\n\n\t\t// =================================================================\n\t\t// Summary\n\t\t// =================================================================\n\t\tconst totalCount = packageCount + githubCount;\n\t\tif (totalCount === 0) {\n\t\t\tconsole.log(\"No skills to install.\");\n\t\t} else {\n\t\t\tconsole.log(`\\nAll ${totalCount} skill(s) installed.`);\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","/**\n * Link command - Recreate agent symlinks without reinstalling.\n *\n * Useful after:\n * - Adding new agents to pspm.json\n * - Changing agent configuration\n * - Recovering from accidentally deleted symlinks\n */\n\nimport { parseAgentArg, promptForAgents } from \"@/agents\";\nimport {\n\tgetGitHubSkillName,\n\tparseGitHubSpecifier,\n\tparseSkillSpecifier,\n} from \"@/lib/index\";\nimport { listLockfileGitHubPackages, listLockfileSkills } from \"@/lockfile\";\nimport { readManifest } from \"@/manifest\";\nimport {\n\tcreateAgentSymlinks,\n\tgetGitHubSkillPath,\n\tgetRegistrySkillPath,\n\ttype SkillInfo,\n} from \"@/symlinks\";\n\nexport interface LinkOptions {\n\tagent?: string;\n\tyes?: boolean;\n}\n\nexport async function link(options: LinkOptions): Promise<void> {\n\ttry {\n\t\t// Read manifest for agent config overrides\n\t\tconst manifest = await readManifest();\n\t\tconst agentConfigs = manifest?.agents;\n\n\t\t// Determine which agents to use\n\t\tlet agents: string[];\n\t\tif (options.agent) {\n\t\t\t// If --agent flag is provided, use it\n\t\t\tagents = parseAgentArg(options.agent);\n\t\t} else if (manifest) {\n\t\t\t// If pspm.json exists, use default agent (respect manifest's agent config)\n\t\t\tagents = parseAgentArg(undefined);\n\t\t} else if (options.yes) {\n\t\t\t// If -y flag is used, use default agent without prompting\n\t\t\tagents = parseAgentArg(undefined);\n\t\t} else {\n\t\t\t// No pspm.json exists, prompt user to select agents\n\t\t\tconsole.log(\"No pspm.json found. Let's set up your project.\\n\");\n\t\t\tagents = await promptForAgents();\n\t\t}\n\n\t\t// Skip if \"none\" agent\n\t\tif (agents.length === 1 && agents[0] === \"none\") {\n\t\t\tconsole.log(\"Skipping symlink creation (--agent none)\");\n\t\t\treturn;\n\t\t}\n\n\t\t// Collect all installed skills\n\t\tconst skills: SkillInfo[] = [];\n\n\t\t// Get registry skills from lockfile\n\t\tconst registrySkills = await listLockfileSkills();\n\t\tfor (const { name } of registrySkills) {\n\t\t\tconst parsed = parseSkillSpecifier(name);\n\t\t\tif (!parsed) {\n\t\t\t\tconsole.warn(`Warning: Invalid skill name in lockfile: ${name}`);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tskills.push({\n\t\t\t\tname: parsed.name,\n\t\t\t\tsourcePath: getRegistrySkillPath(parsed.username, parsed.name),\n\t\t\t});\n\t\t}\n\n\t\t// Get GitHub skills from lockfile\n\t\tconst githubSkills = await listLockfileGitHubPackages();\n\t\tfor (const { specifier } of githubSkills) {\n\t\t\tconst parsed = parseGitHubSpecifier(specifier);\n\t\t\tif (!parsed) {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t`Warning: Invalid GitHub specifier in lockfile: ${specifier}`,\n\t\t\t\t);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst skillName = getGitHubSkillName(parsed);\n\t\t\tskills.push({\n\t\t\t\tname: skillName,\n\t\t\t\tsourcePath: getGitHubSkillPath(parsed.owner, parsed.repo, parsed.path),\n\t\t\t});\n\t\t}\n\n\t\tif (skills.length === 0) {\n\t\t\tconsole.log(\"No skills found in lockfile. Nothing to link.\");\n\t\t\treturn;\n\t\t}\n\n\t\tconsole.log(\n\t\t\t`Creating symlinks for ${skills.length} skill(s) to agent(s): ${agents.join(\", \")}...`,\n\t\t);\n\n\t\tawait createAgentSymlinks(skills, {\n\t\t\tagents,\n\t\t\tprojectRoot: process.cwd(),\n\t\t\tagentConfigs,\n\t\t});\n\n\t\tconsole.log(\"Symlinks created successfully.\");\n\n\t\t// List created symlinks\n\t\tconsole.log(\"\\nLinked skills:\");\n\t\tfor (const skill of skills) {\n\t\t\tconsole.log(` ${skill.name} -> ${skill.sourcePath}`);\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","/**\n * List command - Show installed skills.\n *\n * Displays:\n * - Registry and GitHub skills\n * - Source type\n * - Version / commit info\n * - Linked agent paths\n */\n\nimport { access } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { getAvailableAgents, resolveAgentConfig } from \"@/agents\";\nimport {\n\ttype GitHubLockfileEntry,\n\tgetGitHubSkillName,\n\tparseGitHubSpecifier,\n} from \"@/lib/index\";\nimport { listLockfileGitHubPackages, listLockfileSkills } from \"@/lockfile\";\nimport { readManifest } from \"@/manifest\";\nimport {\n\tgetGitHubSkillPath,\n\tgetLinkedAgents,\n\tgetRegistrySkillPath,\n} from \"@/symlinks\";\n\nexport interface ListOptions {\n\tjson?: boolean;\n}\n\ninterface SkillListItem {\n\tname: string;\n\tfullName: string;\n\tversion: string;\n\tsource: \"registry\" | \"github\";\n\tsourcePath: string;\n\tstatus: \"installed\" | \"missing\";\n\tlinkedAgents: string[];\n\tgitRef?: string;\n\tgitCommit?: string;\n}\n\nexport async function list(options: ListOptions): Promise<void> {\n\ttry {\n\t\t// Get all skills from lockfile\n\t\tconst registrySkills = await listLockfileSkills();\n\t\tconst githubSkills = await listLockfileGitHubPackages();\n\n\t\t// Read manifest for agent configs\n\t\tconst manifest = await readManifest();\n\t\tconst agentConfigs = manifest?.agents;\n\t\tconst availableAgents = getAvailableAgents(agentConfigs);\n\t\tconst projectRoot = process.cwd();\n\n\t\t// Build list of all skills\n\t\tconst skills: SkillListItem[] = [];\n\n\t\t// Add registry skills\n\t\tfor (const { name: fullName, entry } of registrySkills) {\n\t\t\tconst match = fullName.match(/^@user\\/([^/]+)\\/([^/]+)$/);\n\t\t\tif (!match) continue;\n\n\t\t\tconst [, username, skillName] = match;\n\t\t\tconst sourcePath = getRegistrySkillPath(username, skillName);\n\t\t\tconst absolutePath = join(projectRoot, sourcePath);\n\n\t\t\t// Check if installed on disk\n\t\t\tlet status: \"installed\" | \"missing\" = \"installed\";\n\t\t\ttry {\n\t\t\t\tawait access(absolutePath);\n\t\t\t} catch {\n\t\t\t\tstatus = \"missing\";\n\t\t\t}\n\n\t\t\t// Check which agents have symlinks\n\t\t\tconst linkedAgents = await getLinkedAgents(\n\t\t\t\tskillName,\n\t\t\t\tavailableAgents,\n\t\t\t\tprojectRoot,\n\t\t\t\tagentConfigs,\n\t\t\t);\n\n\t\t\tskills.push({\n\t\t\t\tname: skillName,\n\t\t\t\tfullName,\n\t\t\t\tversion: entry.version,\n\t\t\t\tsource: \"registry\",\n\t\t\t\tsourcePath,\n\t\t\t\tstatus,\n\t\t\t\tlinkedAgents,\n\t\t\t});\n\t\t}\n\n\t\t// Add GitHub skills\n\t\tfor (const { specifier, entry } of githubSkills) {\n\t\t\tconst parsed = parseGitHubSpecifier(specifier);\n\t\t\tif (!parsed) continue;\n\n\t\t\tconst ghEntry = entry as GitHubLockfileEntry;\n\t\t\tconst skillName = getGitHubSkillName(parsed);\n\t\t\tconst sourcePath = getGitHubSkillPath(\n\t\t\t\tparsed.owner,\n\t\t\t\tparsed.repo,\n\t\t\t\tparsed.path,\n\t\t\t);\n\t\t\tconst absolutePath = join(projectRoot, sourcePath);\n\n\t\t\t// Check if installed on disk\n\t\t\tlet status: \"installed\" | \"missing\" = \"installed\";\n\t\t\ttry {\n\t\t\t\tawait access(absolutePath);\n\t\t\t} catch {\n\t\t\t\tstatus = \"missing\";\n\t\t\t}\n\n\t\t\t// Check which agents have symlinks\n\t\t\tconst linkedAgents = await getLinkedAgents(\n\t\t\t\tskillName,\n\t\t\t\tavailableAgents,\n\t\t\t\tprojectRoot,\n\t\t\t\tagentConfigs,\n\t\t\t);\n\n\t\t\tskills.push({\n\t\t\t\tname: skillName,\n\t\t\t\tfullName: specifier,\n\t\t\t\tversion: ghEntry.gitCommit.slice(0, 7),\n\t\t\t\tsource: \"github\",\n\t\t\t\tsourcePath,\n\t\t\t\tstatus,\n\t\t\t\tlinkedAgents,\n\t\t\t\tgitRef: ghEntry.gitRef,\n\t\t\t\tgitCommit: ghEntry.gitCommit,\n\t\t\t});\n\t\t}\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\tconsole.log(\"Installed skills:\\n\");\n\n\t\tfor (const skill of skills) {\n\t\t\t// Header line: name@version (source)\n\t\t\tif (skill.source === \"registry\") {\n\t\t\t\tconsole.log(` ${skill.fullName}@${skill.version} (registry)`);\n\t\t\t} else {\n\t\t\t\tconst refInfo = skill.gitRef\n\t\t\t\t\t? `${skill.gitRef}@${skill.gitCommit?.slice(0, 7)}`\n\t\t\t\t\t: skill.version;\n\t\t\t\tconsole.log(` ${skill.fullName} (${refInfo})`);\n\t\t\t}\n\n\t\t\t// Status line if missing\n\t\t\tif (skill.status === \"missing\") {\n\t\t\t\tconsole.log(` Status: MISSING (run 'pspm install' to restore)`);\n\t\t\t}\n\n\t\t\t// Symlink line\n\t\t\tif (skill.linkedAgents.length > 0) {\n\t\t\t\tfor (const agent of skill.linkedAgents) {\n\t\t\t\t\tconst config = resolveAgentConfig(agent, agentConfigs);\n\t\t\t\t\tif (config) {\n\t\t\t\t\t\tconsole.log(` -> ${config.skillsDir}/${skill.name}`);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Summary\n\t\tconst registryCount = skills.filter((s) => s.source === \"registry\").length;\n\t\tconst githubCount = skills.filter((s) => s.source === \"github\").length;\n\t\tconst parts: string[] = [];\n\t\tif (registryCount > 0) parts.push(`${registryCount} registry`);\n\t\tif (githubCount > 0) parts.push(`${githubCount} github`);\n\n\t\tconsole.log(`\\nTotal: ${skills.length} skill(s) (${parts.join(\", \")})`);\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\";\nimport { getRegistryUrl, setCredentials } from \"@/config\";\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 can be:\n * - https://registry.pspm.dev (registry subdomain) -> web app is https://pspm.dev\n * - https://pspm.dev (main domain) -> web app is 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\tlet host = url.host;\n\n\t\t// Strip \"registry.\" subdomain prefix if present\n\t\t// e.g., registry.pspm.dev -> pspm.dev\n\t\tif (host.startsWith(\"registry.\")) {\n\t\t\thost = host.slice(\"registry.\".length);\n\t\t}\n\n\t\treturn `${url.protocol}//${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 * Used for auth-related API calls (token exchange, etc.)\n *\n * The registry URL can be:\n * - https://registry.pspm.dev -> server is https://pspm.dev\n * - https://pspm.dev -> server is https://pspm.dev\n */\nfunction getServerUrl(registryUrl: string): string {\n\ttry {\n\t\tconst url = new URL(registryUrl);\n\t\tlet host = url.host;\n\n\t\t// Strip \"registry.\" subdomain prefix if present\n\t\tif (host.startsWith(\"registry.\")) {\n\t\t\thost = host.slice(\"registry.\".length);\n\t\t}\n\n\t\treturn `${url.protocol}//${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\";\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 { mkdir, readdir, rename, rm, stat } from \"node:fs/promises\";\nimport {\n\tgetLegacyLockfilePath,\n\tgetLegacySkillsDir,\n\tgetLockfilePath,\n\tgetPspmDir,\n\tgetSkillsDir,\n} from \"@/config\";\nimport { migrateLockfileIfNeeded } from \"@/lockfile\";\n\nexport interface MigrateOptions {\n\tdryRun?: boolean;\n}\n\n/**\n * Migrate from old directory structure to new:\n * - .skills/ → .pspm/skills/\n * - skill-lock.json → pspm-lock.json\n */\nexport async function migrate(options: MigrateOptions): Promise<void> {\n\ttry {\n\t\tconst legacySkillsDir = getLegacySkillsDir();\n\t\tconst newSkillsDir = getSkillsDir();\n\t\tconst legacyLockfilePath = getLegacyLockfilePath();\n\t\tconst newLockfilePath = getLockfilePath();\n\t\tconst pspmDir = getPspmDir();\n\n\t\tlet migrationNeeded = false;\n\t\tconst actions: string[] = [];\n\n\t\t// Check for legacy .skills directory\n\t\ttry {\n\t\t\tconst legacyStats = await stat(legacySkillsDir);\n\t\t\tif (legacyStats.isDirectory()) {\n\t\t\t\t// Check if it has any content\n\t\t\t\tconst contents = await readdir(legacySkillsDir);\n\t\t\t\tif (contents.length > 0) {\n\t\t\t\t\tmigrationNeeded = true;\n\t\t\t\t\tactions.push(\"Move .skills/ → .pspm/skills/\");\n\t\t\t\t}\n\t\t\t}\n\t\t} catch {\n\t\t\t// Legacy directory doesn't exist\n\t\t}\n\n\t\t// Check for legacy lockfile\n\t\ttry {\n\t\t\tawait stat(legacyLockfilePath);\n\t\t\t// Check if new lockfile already exists\n\t\t\ttry {\n\t\t\t\tawait stat(newLockfilePath);\n\t\t\t\t// Both exist - suggest manual resolution\n\t\t\t\tactions.push(\n\t\t\t\t\t\"Note: Both skill-lock.json and pspm-lock.json exist. Manual merge may be needed.\",\n\t\t\t\t);\n\t\t\t} catch {\n\t\t\t\tmigrationNeeded = true;\n\t\t\t\tactions.push(\"Migrate skill-lock.json → pspm-lock.json\");\n\t\t\t}\n\t\t} catch {\n\t\t\t// Legacy lockfile doesn't exist\n\t\t}\n\n\t\tif (!migrationNeeded && actions.length === 0) {\n\t\t\tconsole.log(\n\t\t\t\t\"No migration needed. Project is already using the new structure.\",\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tif (options.dryRun) {\n\t\t\tconsole.log(\"Migration plan (dry run):\");\n\t\t\tconsole.log(\"\");\n\t\t\tfor (const action of actions) {\n\t\t\t\tconsole.log(` - ${action}`);\n\t\t\t}\n\t\t\tconsole.log(\"\");\n\t\t\tconsole.log(\"Run without --dry-run to perform migration.\");\n\t\t\treturn;\n\t\t}\n\n\t\tconsole.log(\"Migrating project structure...\\n\");\n\n\t\t// Migrate lockfile first\n\t\tconst lockfileMigrated = await migrateLockfileIfNeeded();\n\t\tif (lockfileMigrated) {\n\t\t\tconsole.log(\" ✓ Migrated skill-lock.json → pspm-lock.json\");\n\t\t}\n\n\t\t// Migrate .skills directory\n\t\ttry {\n\t\t\tconst legacyStats = await stat(legacySkillsDir);\n\t\t\tif (legacyStats.isDirectory()) {\n\t\t\t\tconst contents = await readdir(legacySkillsDir);\n\t\t\t\tif (contents.length > 0) {\n\t\t\t\t\t// Create .pspm directory\n\t\t\t\t\tawait mkdir(pspmDir, { recursive: true });\n\n\t\t\t\t\t// Check if new skills dir exists and has content\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst newStats = await stat(newSkillsDir);\n\t\t\t\t\t\tif (newStats.isDirectory()) {\n\t\t\t\t\t\t\tconst newContents = await readdir(newSkillsDir);\n\t\t\t\t\t\t\tif (newContents.length > 0) {\n\t\t\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t\t\t\" ! Both .skills/ and .pspm/skills/ have content. Manual merge required.\",\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t// New dir exists but empty, remove it first\n\t\t\t\t\t\t\t\tawait rm(newSkillsDir, { recursive: true, force: true });\n\t\t\t\t\t\t\t\tawait rename(legacySkillsDir, newSkillsDir);\n\t\t\t\t\t\t\t\tconsole.log(\" ✓ Moved .skills/ → .pspm/skills/\");\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch {\n\t\t\t\t\t\t// New skills dir doesn't exist, safe to move\n\t\t\t\t\t\tawait rename(legacySkillsDir, newSkillsDir);\n\t\t\t\t\t\tconsole.log(\" ✓ Moved .skills/ → .pspm/skills/\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} catch {\n\t\t\t// Legacy directory doesn't exist\n\t\t}\n\n\t\tconsole.log(\"\");\n\t\tconsole.log(\"Migration complete!\");\n\t\tconsole.log(\"\");\n\t\tconsole.log(\n\t\t\t\"You can safely delete these legacy files if they still exist:\",\n\t\t);\n\t\tconsole.log(\" - skill-lock.json (replaced by pspm-lock.json)\");\n\t\tconsole.log(\" - .skills/ (replaced by .pspm/skills/)\");\n\t\tconsole.log(\"\");\n\t\tconsole.log(\"Update your .gitignore to include:\");\n\t\tconsole.log(\" .pspm/cache/\");\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 { createInterface } from \"node:readline\";\nimport { promisify } from \"node:util\";\nimport { configure, publishSkill } from \"@/api-client\";\nimport { getRegistryUrl, requireApiKey } from \"@/config\";\nimport { extractApiErrorMessage } from \"@/errors\";\nimport {\n\tALWAYS_IGNORED,\n\tDEFAULT_SKILL_FILES,\n\tgetExcludeArgsForRsync,\n\ttype IgnoreLoadResult,\n\tloadIgnorePatterns,\n\ttype ManifestDetectionResult,\n\ttype PspmManifest,\n\tvalidateManifest,\n} from \"@/lib/index\";\nimport type { SkillManifest } from \"@/sdk/generated\";\n\nconst exec = promisify(execCb);\n\n/**\n * Prompt user for yes/no confirmation\n */\nfunction confirm(question: string): Promise<boolean> {\n\treturn new Promise((resolve) => {\n\t\tconst rl = createInterface({\n\t\t\tinput: process.stdin,\n\t\t\toutput: process.stdout,\n\t\t});\n\n\t\trl.question(`${question} (y/N) `, (answer) => {\n\t\t\trl.close();\n\t\t\tconst normalized = answer.trim().toLowerCase();\n\t\t\tresolve(normalized === \"y\" || normalized === \"yes\");\n\t\t});\n\t});\n}\n\n/**\n * Detect and read manifest file (pspm.json or package.json)\n */\nasync function detectManifest(): Promise<ManifestDetectionResult> {\n\tconst cwd = process.cwd();\n\n\t// Try pspm.json first (preferred)\n\tconst pspmJsonPath = join(cwd, \"pspm.json\");\n\ttry {\n\t\tconst content = await readFile(pspmJsonPath, \"utf-8\");\n\t\tconst manifest = JSON.parse(content) as PspmManifest;\n\t\treturn { type: \"pspm.json\", manifest, path: pspmJsonPath };\n\t} catch {\n\t\t// pspm.json not found, try package.json\n\t}\n\n\t// Fall back to package.json\n\tconst packageJsonPath = join(cwd, \"package.json\");\n\ttry {\n\t\tconst content = await readFile(packageJsonPath, \"utf-8\");\n\t\tconst packageJson = JSON.parse(content);\n\n\t\t// Convert package.json to PspmManifest format\n\t\tconst manifest: PspmManifest = {\n\t\t\tname: packageJson.name,\n\t\t\tversion: packageJson.version,\n\t\t\tdescription: packageJson.description,\n\t\t\tauthor:\n\t\t\t\ttypeof packageJson.author === \"string\"\n\t\t\t\t\t? packageJson.author\n\t\t\t\t\t: packageJson.author?.name,\n\t\t\tlicense: packageJson.license,\n\t\t\tfiles: packageJson.files,\n\t\t\tdependencies: packageJson.dependencies,\n\t\t};\n\n\t\treturn { type: \"package.json\", manifest, path: packageJsonPath };\n\t} catch {\n\t\tthrow new Error(\"No pspm.json or package.json found in current directory\");\n\t}\n}\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\tignoreResult?: IgnoreLoadResult,\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 always-ignored directories (node_modules, .git, etc.)\n\t\t\tif (ALWAYS_IGNORED.includes(entry.name)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Check against ignore patterns if available\n\t\t\tif (ignoreResult?.ig) {\n\t\t\t\t// For directories, add trailing slash for proper matching\n\t\t\t\tconst pathToCheck = entry.isDirectory()\n\t\t\t\t\t? `${relativePath}/`\n\t\t\t\t\t: relativePath;\n\t\t\t\tif (ignoreResult.ig.ignores(pathToCheck)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (entry.isDirectory()) {\n\t\t\t\tconst subFiles = await getFilesWithSizes(\n\t\t\t\t\tfullPath,\n\t\t\t\t\tbaseDir,\n\t\t\t\t\tignoreResult,\n\t\t\t\t);\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\t/** Set package visibility during publish */\n\taccess?: \"public\" | \"private\";\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// Detect and read manifest (pspm.json preferred, package.json fallback)\n\t\tconst detection = await detectManifest();\n\t\tconst manifest = detection.manifest;\n\n\t\t// Warn if using package.json instead of pspm.json\n\t\tif (detection.type === \"package.json\") {\n\t\t\tconsole.log(\"pspm warn Using package.json instead of pspm.json\");\n\t\t\tconsole.log(\n\t\t\t\t\"pspm warn Run 'pspm init' to create a dedicated pspm.json manifest\",\n\t\t\t);\n\t\t\tconsole.log(\"\");\n\t\t}\n\n\t\t// Validate manifest\n\t\tconst validation = validateManifest(manifest);\n\t\tif (!validation.valid) {\n\t\t\tconsole.error(`Error: ${validation.error}`);\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\t// Validate SKILL.md exists\n\t\tconst skillMdPath = join(process.cwd(), \"SKILL.md\");\n\t\ttry {\n\t\t\tawait stat(skillMdPath);\n\t\t} catch {\n\t\t\tconsole.error(\n\t\t\t\t\"Error: SKILL.md is required. Create a SKILL.md file with your skill's documentation before publishing.\",\n\t\t\t);\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\t// Warn and confirm if publishing as public\n\t\tif (options.access === \"public\") {\n\t\t\tconsole.log(\"\");\n\t\t\tconsole.log(\"⚠️ Warning: You are about to publish this skill as PUBLIC.\");\n\t\t\tconsole.log(\n\t\t\t\t\" Once a skill is public, it CANNOT be made private again.\",\n\t\t\t);\n\t\t\tconsole.log(\" This action is irreversible.\");\n\t\t\tconsole.log(\"\");\n\n\t\t\tconst confirmed = await confirm(\"Do you want to continue?\");\n\t\t\tif (!confirmed) {\n\t\t\t\tconsole.log(\"Publish cancelled.\");\n\t\t\t\tprocess.exit(0);\n\t\t\t}\n\t\t\tconsole.log(\"\");\n\t\t}\n\n\t\t// Create a mutable copy for version bumping\n\t\tconst packageJson: SkillManifest = {\n\t\t\tname: manifest.name,\n\t\t\tversion: manifest.version,\n\t\t\tdescription: manifest.description,\n\t\t\tfiles: manifest.files,\n\t\t\tdependencies: manifest.dependencies,\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// Load ignore patterns (.pspmignore or .gitignore fallback)\n\t\tconst ignoreResult = await loadIgnorePatterns();\n\t\tif (ignoreResult.source) {\n\t\t\tconsole.log(\n\t\t\t\t`pspm notice Using ${ignoreResult.source} for ignore patterns`,\n\t\t\t);\n\t\t}\n\n\t\t// Build exclude arguments for rsync and tar using loaded patterns\n\t\tconst excludeArgs = getExcludeArgsForRsync(ignoreResult.patterns);\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 manifest or default)\n\t\t\tconst files = packageJson.files || [...DEFAULT_SKILL_FILES];\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 ignored patterns\n\t\t\t\t\tawait exec(\n\t\t\t\t\t\t`rsync -a ${excludeArgs} \"${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 the manifest file used for publishing\n\t\t\tif (detection.type === \"pspm.json\") {\n\t\t\t\tawait exec(`cp pspm.json \"${tempDir}/package/\"`);\n\t\t\t\t// Also include package.json if it exists (for npm compatibility)\n\t\t\t\ttry {\n\t\t\t\t\tawait stat(join(process.cwd(), \"package.json\"));\n\t\t\t\t\tawait exec(\n\t\t\t\t\t\t`cp package.json \"${tempDir}/package/\" 2>/dev/null || true`,\n\t\t\t\t\t);\n\t\t\t\t} catch {\n\t\t\t\t\t// No package.json, that's fine\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Using package.json as manifest\n\t\t\t\tawait exec(`cp package.json \"${tempDir}/package/\"`);\n\t\t\t}\n\n\t\t\t// Get list of files that will be included and their sizes\n\t\t\t// Apply ignore patterns to filter out ignored files\n\t\t\tconst packageDir = join(tempDir, \"package\");\n\t\t\tconst tarballContents = await getFilesWithSizes(\n\t\t\t\tpackageDir,\n\t\t\t\tpackageDir,\n\t\t\t\tignoreResult,\n\t\t\t);\n\t\t\tconst unpackedSize = tarballContents.reduce((acc, f) => acc + f.size, 0);\n\n\t\t\t// Create tarball (excluding ignored patterns)\n\t\t\tconst tarballPath = join(tempDir, tarballName);\n\t\t\tawait exec(\n\t\t\t\t`tar -czf \"${tarballPath}\" -C \"${tempDir}\" ${excludeArgs} 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// Enforce max tarball size (10MB)\n\t\t\tconst MAX_TARBALL_SIZE = 10 * 1024 * 1024;\n\t\t\tif (tarballSize > MAX_TARBALL_SIZE) {\n\t\t\t\tconsole.error(\"\");\n\t\t\t\tconsole.error(\n\t\t\t\t\t`Error: Package size ${formatBytes(tarballSize)} exceeds the maximum allowed size of ${formatBytes(MAX_TARBALL_SIZE)}.`,\n\t\t\t\t);\n\t\t\t\tconsole.error(\"\");\n\t\t\t\tconsole.error(\"To reduce the package size:\");\n\t\t\t\tconsole.error(\n\t\t\t\t\t' - Add a \"files\" field in your manifest to include only necessary files',\n\t\t\t\t);\n\t\t\t\tconsole.error(\" - Add patterns to .pspmignore to exclude large files\");\n\t\t\t\tconsole.error(\n\t\t\t\t\t\" - Remove build artifacts, tests, and documentation from the package\",\n\t\t\t\t);\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\n\t\t\t// Print publish preview\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\n\t\t\t// Ask user to confirm before publishing\n\t\t\tconst confirmed = await confirm(\n\t\t\t\t`Publish ${packageJson.name}@${packageJson.version} to ${registryUrl}?`,\n\t\t\t);\n\t\t\tif (!confirmed) {\n\t\t\t\tconsole.log(\"Publish cancelled.\");\n\t\t\t\tprocess.exit(0);\n\t\t\t}\n\n\t\t\tconsole.log(\"\");\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\tvisibility: options.access,\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\tconst visibility = result.skill.visibility;\n\t\t\tconst visibilityIcon = visibility === \"public\" ? \"🌐\" : \"🔒\";\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\tconsole.log(`Visibility: ${visibilityIcon} ${visibility}`);\n\n\t\t\tif (visibility === \"public\") {\n\t\t\t\tconsole.log(\n\t\t\t\t\t\"Note: Public packages cannot be made private. This is irreversible.\",\n\t\t\t\t);\n\t\t\t}\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","/**\n * Remove command - Remove an installed skill.\n *\n * Supports:\n * - Registry skills (by full specifier or short name)\n * - GitHub skills (by specifier or skill name)\n */\n\nimport { rm } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { getAvailableAgents } from \"@/agents\";\nimport { getSkillsDir } from \"@/config\";\nimport {\n\tgetGitHubSkillName,\n\tisGitHubSpecifier,\n\tparseGitHubSpecifier,\n} from \"@/lib/index\";\nimport {\n\tlistLockfileGitHubPackages,\n\tlistLockfileSkills,\n\tremoveFromLockfile,\n\tremoveGitHubFromLockfile,\n} from \"@/lockfile\";\nimport {\n\treadManifest,\n\tremoveDependency,\n\tremoveGitHubDependency,\n} from \"@/manifest\";\nimport { getGitHubSkillPath, removeAgentSymlinks } from \"@/symlinks\";\n\nexport async function remove(nameOrSpecifier: string): Promise<void> {\n\ttry {\n\t\t// Read manifest for agent config overrides\n\t\tconst manifest = await readManifest();\n\t\tconst agentConfigs = manifest?.agents;\n\t\tconst agents = getAvailableAgents(agentConfigs);\n\n\t\t// Determine type of specifier\n\t\tif (isGitHubSpecifier(nameOrSpecifier)) {\n\t\t\tawait removeGitHub(nameOrSpecifier, agents, agentConfigs);\n\t\t} else if (nameOrSpecifier.startsWith(\"@user/\")) {\n\t\t\tawait removeRegistry(nameOrSpecifier, agents, agentConfigs);\n\t\t} else {\n\t\t\t// Short name - try to find in either registry or GitHub skills\n\t\t\tawait removeByShortName(nameOrSpecifier, agents, agentConfigs);\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\n/**\n * Remove a registry skill by full specifier.\n */\nasync function removeRegistry(\n\tspecifier: string,\n\tagents: string[],\n\tagentConfigs?: Record<string, { skillsDir: string }>,\n): Promise<void> {\n\tconst match = specifier.match(/^@user\\/([^/]+)\\/([^@/]+)/);\n\tif (!match) {\n\t\tconsole.error(`Error: Invalid skill specifier: ${specifier}`);\n\t\tprocess.exit(1);\n\t}\n\n\tconst fullName = `@user/${match[1]}/${match[2]}`;\n\tconst username = match[1];\n\tconst name = match[2];\n\n\tconsole.log(`Removing ${fullName}...`);\n\n\t// Remove from lockfile\n\tconst removedFromLockfile = await removeFromLockfile(fullName);\n\n\t// Remove from pspm.json dependencies\n\tconst removedFromManifest = await removeDependency(fullName);\n\n\tif (!removedFromLockfile && !removedFromManifest) {\n\t\tconsole.error(`Error: ${fullName} not found in lockfile or pspm.json`);\n\t\tprocess.exit(1);\n\t}\n\n\t// Remove symlinks from all agents\n\tawait removeAgentSymlinks(name, {\n\t\tagents,\n\t\tprojectRoot: process.cwd(),\n\t\tagentConfigs,\n\t});\n\n\t// Remove from disk\n\tconst skillsDir = getSkillsDir();\n\tconst destDir = join(skillsDir, username, name);\n\n\ttry {\n\t\tawait rm(destDir, { recursive: true, force: true });\n\t} catch {\n\t\t// Ignore errors if directory doesn't exist\n\t}\n\n\tconsole.log(`Removed ${fullName}`);\n}\n\n/**\n * Remove a GitHub skill by specifier.\n */\nasync function removeGitHub(\n\tspecifier: string,\n\tagents: string[],\n\tagentConfigs?: Record<string, { skillsDir: string }>,\n): Promise<void> {\n\tconst parsed = parseGitHubSpecifier(specifier);\n\tif (!parsed) {\n\t\tconsole.error(`Error: Invalid GitHub specifier: ${specifier}`);\n\t\tprocess.exit(1);\n\t}\n\n\t// Build the lockfile key (without ref)\n\tconst lockfileKey = parsed.path\n\t\t? `github:${parsed.owner}/${parsed.repo}/${parsed.path}`\n\t\t: `github:${parsed.owner}/${parsed.repo}`;\n\n\tconsole.log(`Removing ${lockfileKey}...`);\n\n\t// Remove from lockfile\n\tconst removedFromLockfile = await removeGitHubFromLockfile(lockfileKey);\n\n\t// Remove from pspm.json githubDependencies\n\tconst removedFromManifest = await removeGitHubDependency(lockfileKey);\n\n\tif (!removedFromLockfile && !removedFromManifest) {\n\t\tconsole.error(`Error: ${lockfileKey} not found in lockfile or pspm.json`);\n\t\tprocess.exit(1);\n\t}\n\n\t// Remove symlinks from all agents\n\tconst skillName = getGitHubSkillName(parsed);\n\tawait removeAgentSymlinks(skillName, {\n\t\tagents,\n\t\tprojectRoot: process.cwd(),\n\t\tagentConfigs,\n\t});\n\n\t// Remove from disk\n\tconst skillsDir = getSkillsDir();\n\tconst destPath = getGitHubSkillPath(parsed.owner, parsed.repo, parsed.path);\n\tconst destDir = join(skillsDir, \"..\", destPath);\n\n\ttry {\n\t\tawait rm(destDir, { recursive: true, force: true });\n\t} catch {\n\t\t// Ignore errors if directory doesn't exist\n\t}\n\n\tconsole.log(`Removed ${lockfileKey}`);\n}\n\n/**\n * Remove a skill by short name (searches both registry and GitHub skills).\n */\nasync function removeByShortName(\n\tshortName: string,\n\tagents: string[],\n\tagentConfigs?: Record<string, { skillsDir: string }>,\n): Promise<void> {\n\t// First try to find in registry skills\n\tconst registrySkills = await listLockfileSkills();\n\tconst foundRegistry = registrySkills.find((s) => {\n\t\tconst match = s.name.match(/^@user\\/([^/]+)\\/([^/]+)$/);\n\t\treturn match && match[2] === shortName;\n\t});\n\n\tif (foundRegistry) {\n\t\tawait removeRegistry(foundRegistry.name, agents, agentConfigs);\n\t\treturn;\n\t}\n\n\t// Try to find in GitHub skills\n\tconst githubSkills = await listLockfileGitHubPackages();\n\tconst foundGitHub = githubSkills.find((s) => {\n\t\tconst parsed = parseGitHubSpecifier(s.specifier);\n\t\tif (!parsed) return false;\n\t\treturn getGitHubSkillName(parsed) === shortName;\n\t});\n\n\tif (foundGitHub) {\n\t\tawait removeGitHub(foundGitHub.specifier, agents, agentConfigs);\n\t\treturn;\n\t}\n\n\tconsole.error(`Error: Skill \"${shortName}\" not found in lockfile`);\n\tprocess.exit(1);\n}\n","import { configure, deleteSkill, deleteSkillVersion } from \"@/api-client\";\nimport { getRegistryUrl, requireApiKey } from \"@/config\";\nimport { extractApiErrorMessage } from \"@/errors\";\nimport { parseSkillSpecifier } from \"@/lib/index\";\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(username, 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(username, 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 { configure, listSkillVersions } from \"@/api-client\";\nimport { getTokenForRegistry, resolveConfig } from \"@/config\";\nimport { extractApiErrorMessage } from \"@/errors\";\nimport { resolveVersion } from \"@/lib/index\";\nimport { listLockfileSkills } from \"@/lockfile\";\nimport { add } from \"./add\";\n\nexport interface UpdateOptions {\n\tdryRun?: boolean;\n}\n\nexport async function update(options: UpdateOptions): Promise<void> {\n\ttry {\n\t\tconst config = await resolveConfig();\n\t\tconst registryUrl = config.registryUrl;\n\t\tconst apiKey = getTokenForRegistry(config, registryUrl);\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 - apiKey may be undefined for public packages\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 semver from \"semver\";\nimport { getManifestPath, readManifest, writeManifest } from \"@/manifest\";\n\nexport type VersionBump = \"major\" | \"minor\" | \"patch\";\n\nexport interface VersionOptions {\n\t/** If true, don't actually write the file (just show what would happen) */\n\tdryRun?: boolean;\n}\n\n/**\n * Bump the version in pspm.json\n *\n * Similar to `npm version major|minor|patch`\n */\nexport async function version(\n\tbump: VersionBump,\n\toptions: VersionOptions = {},\n): Promise<void> {\n\ttry {\n\t\t// Read existing manifest\n\t\tconst manifest = await readManifest();\n\n\t\tif (!manifest) {\n\t\t\tconsole.error(\"Error: No pspm.json found in current directory.\");\n\t\t\tconsole.error(\"Run 'pspm init' to create one.\");\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\tif (!manifest.version) {\n\t\t\tconsole.error(\"Error: pspm.json does not have a version field.\");\n\t\t\tconsole.error(\n\t\t\t\t'Add a version field (e.g., \"version\": \"0.1.0\") to your pspm.json.',\n\t\t\t);\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\t// Validate current version\n\t\tif (!semver.valid(manifest.version)) {\n\t\t\tconsole.error(\n\t\t\t\t`Error: Current version \"${manifest.version}\" is not valid semver.`,\n\t\t\t);\n\t\t\tconsole.error(\n\t\t\t\t'Fix the version in pspm.json to be valid semver (e.g., \"1.0.0\").',\n\t\t\t);\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\t// Bump the version\n\t\tconst newVersion = semver.inc(manifest.version, bump);\n\n\t\tif (!newVersion) {\n\t\t\tconsole.error(`Error: Failed to bump version from ${manifest.version}`);\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\tif (options.dryRun) {\n\t\t\tconsole.log(`Would bump version: ${manifest.version} → ${newVersion}`);\n\t\t\treturn;\n\t\t}\n\n\t\t// Update manifest with new version\n\t\tmanifest.version = newVersion;\n\t\tawait writeManifest(manifest);\n\n\t\tconsole.log(`v${newVersion}`);\n\t\tconsole.log(`Updated ${getManifestPath()}`);\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\";\nimport { getRegistryUrl, requireApiKey, resolveConfig } from \"@/config\";\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\taccess,\n\tadd,\n\tconfigInit,\n\tconfigShow,\n\tdeprecate,\n\tinit,\n\tinstall,\n\tlink,\n\tlist,\n\tlogin,\n\tlogout,\n\tmigrate,\n\tpublish,\n\tremove,\n\tunpublish,\n\tupdate,\n\tversion as versionCommand,\n\twhoami,\n} from \"./commands/index\";\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 AI coding agents\")\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// Project initialization commands\n// =============================================================================\n\nprogram\n\t.command(\"init\")\n\t.description(\"Create a new pspm.json manifest in the current directory\")\n\t.option(\"-n, --name <name>\", \"Skill name\")\n\t.option(\"-d, --description <desc>\", \"Skill description\")\n\t.option(\"-a, --author <author>\", \"Author name\")\n\t.option(\"-y, --yes\", \"Skip prompts and use defaults\")\n\t.option(\"-f, --force\", \"Overwrite existing pspm.json\")\n\t.action(async (options) => {\n\t\tawait init({\n\t\t\tname: options.name,\n\t\t\tdescription: options.description,\n\t\t\tauthor: options.author,\n\t\t\tyes: options.yes,\n\t\t\tforce: options.force,\n\t\t});\n\t});\n\nprogram\n\t.command(\"migrate\")\n\t.description(\n\t\t\"Migrate from old directory structure (.skills/, skill-lock.json)\",\n\t)\n\t.option(\"--dry-run\", \"Show what would be migrated without making changes\")\n\t.action(async (options) => {\n\t\tawait migrate({ dryRun: options.dryRun });\n\t});\n\n// =============================================================================\n// Skill management commands\n// =============================================================================\n\nprogram\n\t.command(\"add <specifiers...>\")\n\t.description(\n\t\t\"Add one or more skills (e.g., @user/bsheng/vite_slides@^2.0.0 or github:owner/repo/path@ref)\",\n\t)\n\t.option(\"--save\", \"Save to lockfile (default)\")\n\t.option(\n\t\t\"--agent <agents>\",\n\t\t'Comma-separated agents for symlinks (default: all agents, use \"none\" to skip)',\n\t)\n\t.option(\"-y, --yes\", \"Skip agent selection prompt and use defaults\")\n\t.action(async (specifiers, options) => {\n\t\tawait add(specifiers, {\n\t\t\tsave: options.save ?? true,\n\t\t\tagent: options.agent,\n\t\t\tyes: options.yes,\n\t\t});\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 [specifiers...]\")\n\t.alias(\"i\")\n\t.description(\n\t\t\"Install skills from lockfile, or add and install specific packages\",\n\t)\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.option(\n\t\t\"--agent <agents>\",\n\t\t'Comma-separated agents for symlinks (default: all agents, use \"none\" to skip)',\n\t)\n\t.option(\"-y, --yes\", \"Skip agent selection prompt and use defaults\")\n\t.action(async (specifiers, options) => {\n\t\tawait install(specifiers, {\n\t\t\tfrozenLockfile: options.frozenLockfile,\n\t\t\tdir: options.dir,\n\t\t\tagent: options.agent,\n\t\t\tyes: options.yes,\n\t\t});\n\t});\n\nprogram\n\t.command(\"link\")\n\t.description(\"Recreate agent symlinks without reinstalling\")\n\t.option(\n\t\t\"--agent <agents>\",\n\t\t'Comma-separated agents for symlinks (default: all agents, use \"none\" to skip)',\n\t)\n\t.option(\"-y, --yes\", \"Skip agent selection prompt and use defaults\")\n\t.action(async (options) => {\n\t\tawait link({ agent: options.agent, yes: options.yes });\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(\"version <bump>\")\n\t.description(\"Bump package version (major, minor, patch)\")\n\t.option(\"--dry-run\", \"Show what would be changed without writing\")\n\t.action(async (bump: string, options) => {\n\t\tconst validBumps = [\"major\", \"minor\", \"patch\"];\n\t\tif (!validBumps.includes(bump)) {\n\t\t\tconsole.error(`Error: Invalid version bump \"${bump}\".`);\n\t\t\tconsole.error(\"Must be one of: major, minor, patch\");\n\t\t\tprocess.exit(1);\n\t\t}\n\t\tawait versionCommand(bump as \"major\" | \"minor\" | \"patch\", {\n\t\t\tdryRun: options.dryRun,\n\t\t});\n\t});\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.option(\"--access <level>\", \"Set package visibility (public or private)\")\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\taccess: options.access as \"public\" | \"private\" | undefined,\n\t\t});\n\t});\n\nprogram\n\t.command(\"unpublish <specifier>\")\n\t.description(\n\t\t\"Remove a published skill version (only within 72 hours of publishing)\",\n\t)\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\n\t.command(\"access [specifier]\")\n\t.description(\"Change package visibility (public/private)\")\n\t.option(\"--public\", \"Make the package public (irreversible)\")\n\t.option(\"--private\", \"Make the package private (only for private packages)\")\n\t.action(async (specifier, options) => {\n\t\tawait access(specifier, {\n\t\t\tpublic: options.public,\n\t\t\tprivate: options.private,\n\t\t});\n\t});\n\nprogram\n\t.command(\"deprecate <specifier> [message]\")\n\t.description(\n\t\t\"Mark a skill version as deprecated (alternative to unpublish after 72 hours)\",\n\t)\n\t.option(\"--undo\", \"Remove deprecation status\")\n\t.action(async (specifier, message, options) => {\n\t\tawait deprecate(specifier, message, { undo: options.undo });\n\t});\n\nprogram.parse();\n"]}
1
+ {"version":3,"sources":["../src/sdk/fetcher.ts","../src/sdk/generated/index.ts","../src/api-client.ts","../src/errors.ts","../src/config.ts","../src/lib/ignore.ts","../src/lib/integrity.ts","../src/lib/lockfile.ts","../src/lib/manifest.ts","../src/lib/version.ts","../src/lib/resolver.ts","../src/lib/specifier.ts","../src/lib/index.ts","../src/agents.ts","../src/github.ts","../src/lockfile.ts","../src/manifest.ts","../src/symlinks.ts","../src/commands/add.ts","../src/commands/access.ts","../src/commands/index.ts","../src/commands/config/init.ts","../src/commands/config/show.ts","../src/commands/deprecate.ts","../src/commands/init.ts","../src/commands/install.ts","../src/commands/link.ts","../src/commands/list.ts","../src/commands/login.ts","../src/commands/logout.ts","../src/commands/migrate.ts","../../../packages/server/skill-registry/src/client/resolver.ts","../../../packages/server/skill-registry/src/client/outdated.ts","../src/commands/outdated.ts","../src/commands/publish.ts","../src/commands/remove.ts","../src/commands/unpublish.ts","../src/commands/update.ts","../src/commands/version.ts","../src/commands/whoami.ts","../src/index.ts"],"names":["version","configure","config","join","readFile","mkdir","writeFile","exec","promisify","stat","dirname","init_lockfile","init_manifest","lstat","rm","isLocalSpecifier","relative","symlink","resolve","basename","confirm","createHash","add","access","URL","exchangeCliToken","readdir","resolveVersion","semver2","compareVersions","getLatestVersion","valid","checkOutdated","execCb","createInterface","packageJson","semver","__dirname"],"mappings":"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","file":"index.js","sourcesContent":["/**\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\t/** API key for authentication. Optional for public package access. */\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 \"./sdk/fetcher\";\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 * 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\t// Build headers - only include Authorization if apiKey is provided\n\tconst headers: Record<string, string> = {\n\t\t...((options.headers as Record<string, string>) ?? {}),\n\t\t\"Content-Type\": \"application/json\",\n\t};\n\tif (apiKey) {\n\t\theaders.Authorization = `Bearer ${apiKey}`;\n\t}\n\n\tconst response = await fetch(fullUrl, {\n\t\t...options,\n\t\theaders,\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.2.0 🍺\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 '../fetcher';\nexport type ApiKeyPermissionsItem = typeof ApiKeyPermissionsItem[keyof typeof ApiKeyPermissionsItem];\n\n\nexport const ApiKeyPermissionsItem = {\n read: 'read',\n write: 'write',\n delete: 'delete',\n} as const;\n\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 permissions: ApiKeyPermissionsItem[] | null;\n expiresAt: string | null;\n lastUsedAt: string | null;\n createdAt: string | null;\n}\n\nexport type ApiKeyListResponse = ApiKey[];\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: ({\n path: (string | number)[];\n message: string;\n})[];\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\nexport type CreateApiKeyInputPermissionsItem = typeof CreateApiKeyInputPermissionsItem[keyof typeof CreateApiKeyInputPermissionsItem];\n\n\nexport const CreateApiKeyInputPermissionsItem = {\n read: 'read',\n write: 'write',\n delete: 'delete',\n} as const;\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 permissions?: CreateApiKeyInputPermissionsItem[] | 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. Username is immutable once set.\n */\nexport interface UsernameInfo {\n username: string | null;\n isSet: boolean;\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 * Package visibility (private or public)\n */\nexport type Visibility = typeof Visibility[keyof typeof Visibility];\n\n\nexport const Visibility = {\n private: 'private',\n public: 'public',\n} as const;\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 visibility: Visibility;\n}\n\n/**\n * Skill metadata with owner username\n */\nexport type SkillWithUser = Skill & {\n username: string;\n};\n\n/**\n * Skill with download stats for explore/marketplace view\n */\nexport type ExploreSkill = SkillWithUser & {\n weeklyDownloads: number;\n totalDownloads: number;\n};\n\n/**\n * Paginated list of public skills for the marketplace\n */\nexport interface ExploreResponse {\n skills: ExploreSkill[];\n total: number;\n page: number;\n limit: number;\n totalPages: number;\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 metadata with SKILL.md content from latest version\n */\nexport type SkillDetailResponse = SkillWithUser & ({\n skillMd: string | null;\n} | null);\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\nexport type SkillManifestDependencies = {[key: string]: string};\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 dependencies?: SkillManifestDependencies;\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 deprecatedAt?: string | null;\n deprecationMessage?: string | null;\n}\n\n/**\n * A single data point for download statistics\n */\nexport interface DownloadDataPoint {\n date: string | null;\n count: number;\n}\n\n/**\n * Download count for a specific version\n */\nexport interface VersionDownload {\n version: string;\n downloads: number;\n}\n\n/**\n * Download statistics for a skill package\n */\nexport interface SkillStatsResponse {\n totalDownloads: number;\n weeklyDownloads: number;\n monthlyDownloads: number;\n downloadTrend: DownloadDataPoint[];\n versionDownloads: VersionDownload[];\n}\n\n/**\n * Skill version metadata with download URL\n */\nexport type SkillVersionWithDownload = SkillVersion & ({\n downloadUrl: string;\n skillMd?: string | null;\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 14680064 */\n tarballBase64: string;\n visibility?: Visibility;\n}\n\n/**\n * Input for deprecating a skill version\n */\nexport interface DeprecateVersionInput {\n /**\n * @minLength 1\n * @maxLength 500\n */\n message: string;\n}\n\n/**\n * Updated skill after changing visibility\n */\nexport type ChangeAccessResponse = Skill & {\n username: string;\n};\n\n/**\n * Input for changing package visibility\n */\nexport interface ChangeAccessInput {\n visibility: Visibility;\n}\n\n/**\n * Subscription tier level\n */\nexport type SubscriptionTier = typeof SubscriptionTier[keyof typeof SubscriptionTier];\n\n\nexport const SubscriptionTier = {\n free: 'free',\n pro: 'pro',\n} as const;\n\n/**\n * Stripe subscription status\n */\nexport type SubscriptionStatus = typeof SubscriptionStatus[keyof typeof SubscriptionStatus] | null;\n\n\nexport const SubscriptionStatus = {\n active: 'active',\n canceled: 'canceled',\n past_due: 'past_due',\n trialing: 'trialing',\n incomplete: 'incomplete',\n incomplete_expired: 'incomplete_expired',\n unpaid: 'unpaid',\n paused: 'paused',\n} as const;\n\n/**\n * User subscription information\n */\nexport interface SubscriptionInfo {\n tier: SubscriptionTier;\n status: SubscriptionStatus | null;\n priceId: string | null;\n currentPeriodEnd: string | null;\n cancelAtPeriodEnd: boolean;\n}\n\n/**\n * Stripe checkout session URL\n */\nexport interface CheckoutSessionResponse {\n url: string;\n}\n\n/**\n * Billing interval for subscription\n */\nexport type BillingInterval = typeof BillingInterval[keyof typeof BillingInterval];\n\n\nexport const BillingInterval = {\n month: 'month',\n year: 'year',\n} as const;\n\n/**\n * Input for creating a Stripe checkout session\n */\nexport interface CreateCheckoutInput {\n interval: BillingInterval;\n successUrl?: string;\n cancelUrl?: string;\n}\n\n/**\n * Stripe customer portal URL\n */\nexport interface PortalSessionResponse {\n url: string;\n}\n\n/**\n * Input for creating a Stripe customer portal session\n */\nexport interface CreatePortalInput {\n returnUrl?: 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\nexport type ExplorePublicSkillsParams = {\nsearch?: string;\nsort?: ExplorePublicSkillsSort;\n/**\n * @minimum 1\n */\npage?: number;\n/**\n * @minimum 1\n * @maximum 100\n */\nlimit?: number;\n};\n\nexport type ExplorePublicSkillsSort = typeof ExplorePublicSkillsSort[keyof typeof ExplorePublicSkillsSort];\n\n\nexport const ExplorePublicSkillsSort = {\n downloads: 'downloads',\n recent: 'recent',\n name: 'name',\n} as const;\n\nexport type GetSkillStatsParams = {\nperiod?: GetSkillStatsPeriod;\n};\n\nexport type GetSkillStatsPeriod = typeof GetSkillStatsPeriod[keyof typeof GetSkillStatsPeriod];\n\n\nexport const GetSkillStatsPeriod = {\n day: 'day',\n week: 'week',\n month: 'month',\n year: 'year',\n} as const;\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 it has been set\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 * Set the current user's username. This is a one-time operation - username cannot be changed after being set (npm-style).\n * @summary Set username (one-time)\n */\nexport type setUsernameResponse200 = {\n data: UpdateUsernameOutput\n status: 200\n}\n\nexport type setUsernameResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type setUsernameResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type setUsernameResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type setUsernameResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type setUsernameResponse500 = {\n data: ApiError\n status: 500\n}\n \nexport type setUsernameResponseSuccess = (setUsernameResponse200) & {\n headers: Headers;\n};\nexport type setUsernameResponseError = (setUsernameResponse400 | setUsernameResponse401 | setUsernameResponse403 | setUsernameResponse404 | setUsernameResponse500) & {\n headers: Headers;\n};\n\nexport type setUsernameResponse = (setUsernameResponseSuccess | setUsernameResponseError)\n\nexport const getSetUsernameUrl = () => {\n\n\n \n\n return `/api/auth/username`\n}\n\nexport const setUsername = async (updateUsernameInput: UpdateUsernameInput, options?: RequestInit): Promise<setUsernameResponse> => {\n \n return customFetch<setUsernameResponse>(getSetUsernameUrl(),\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. This endpoint is public and can be called during signup.\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 * Browse and search all public skills. No authentication required.\n * @summary Explore public skills\n */\nexport type explorePublicSkillsResponse200 = {\n data: ExploreResponse\n status: 200\n}\n\nexport type explorePublicSkillsResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type explorePublicSkillsResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type explorePublicSkillsResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type explorePublicSkillsResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type explorePublicSkillsResponse500 = {\n data: ApiError\n status: 500\n}\n \nexport type explorePublicSkillsResponseSuccess = (explorePublicSkillsResponse200) & {\n headers: Headers;\n};\nexport type explorePublicSkillsResponseError = (explorePublicSkillsResponse400 | explorePublicSkillsResponse401 | explorePublicSkillsResponse403 | explorePublicSkillsResponse404 | explorePublicSkillsResponse500) & {\n headers: Headers;\n};\n\nexport type explorePublicSkillsResponse = (explorePublicSkillsResponseSuccess | explorePublicSkillsResponseError)\n\nexport const getExplorePublicSkillsUrl = (params?: ExplorePublicSkillsParams,) => {\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/skills/-/explore?${stringifiedParams}` : `/api/skills/-/explore`\n}\n\nexport const explorePublicSkills = async (params?: ExplorePublicSkillsParams, options?: RequestInit): Promise<explorePublicSkillsResponse> => {\n \n return customFetch<explorePublicSkillsResponse>(getExplorePublicSkillsUrl(params),\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/-/mine`\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: SkillDetailResponse\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 * 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 = (username: Username,\n name: SkillName,) => {\n\n\n \n\n return `/api/skills/@user/${username}/${name}`\n}\n\nexport const deleteSkill = async (username: Username,\n name: SkillName, options?: RequestInit): Promise<deleteSkillResponse> => {\n \n return customFetch<deleteSkillResponse>(getDeleteSkillUrl(username,name),\n { \n ...options,\n method: 'DELETE'\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 download statistics for a skill package, including total downloads, weekly/monthly counts, and download trends over time.\n * @summary Get skill download statistics\n */\nexport type getSkillStatsResponse200 = {\n data: SkillStatsResponse\n status: 200\n}\n\nexport type getSkillStatsResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type getSkillStatsResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type getSkillStatsResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type getSkillStatsResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type getSkillStatsResponse500 = {\n data: ApiError\n status: 500\n}\n \nexport type getSkillStatsResponseSuccess = (getSkillStatsResponse200) & {\n headers: Headers;\n};\nexport type getSkillStatsResponseError = (getSkillStatsResponse400 | getSkillStatsResponse401 | getSkillStatsResponse403 | getSkillStatsResponse404 | getSkillStatsResponse500) & {\n headers: Headers;\n};\n\nexport type getSkillStatsResponse = (getSkillStatsResponseSuccess | getSkillStatsResponseError)\n\nexport const getGetSkillStatsUrl = (username: Username,\n name: SkillName,\n params?: GetSkillStatsParams,) => {\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/skills/@user/${username}/${name}/stats?${stringifiedParams}` : `/api/skills/@user/${username}/${name}/stats`\n}\n\nexport const getSkillStats = async (username: Username,\n name: SkillName,\n params?: GetSkillStatsParams, options?: RequestInit): Promise<getSkillStatsResponse> => {\n \n return customFetch<getSkillStatsResponse>(getGetSkillStatsUrl(username,name,params),\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}/versions/${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 * Delete a specific version of a skill (owner only). Only allowed within 72 hours of publishing. After that, use deprecate instead.\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 = (username: Username,\n name: SkillName,\n version: Semver,) => {\n\n\n \n\n return `/api/skills/@user/${username}/${name}/versions/${version}`\n}\n\nexport const deleteSkillVersion = async (username: Username,\n name: SkillName,\n version: Semver, options?: RequestInit): Promise<deleteSkillVersionResponse> => {\n \n return customFetch<deleteSkillVersionResponse>(getDeleteSkillVersionUrl(username,name,version),\n { \n ...options,\n method: 'DELETE'\n \n \n }\n);}\n\n\n\n/**\n * Download the tarball for a specific skill version. Redirects to a presigned URL.\n * @summary Download skill version\n */\nexport type downloadSkillVersionResponse302 = {\n data: void\n status: 302\n}\n\nexport type downloadSkillVersionResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type downloadSkillVersionResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type downloadSkillVersionResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type downloadSkillVersionResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type downloadSkillVersionResponse500 = {\n data: ApiError\n status: 500\n}\n \n;\nexport type downloadSkillVersionResponseError = (downloadSkillVersionResponse302 | downloadSkillVersionResponse400 | downloadSkillVersionResponse401 | downloadSkillVersionResponse403 | downloadSkillVersionResponse404 | downloadSkillVersionResponse500) & {\n headers: Headers;\n};\n\nexport type downloadSkillVersionResponse = (downloadSkillVersionResponseError)\n\nexport const getDownloadSkillVersionUrl = (username: Username,\n name: SkillName,\n version: Semver,) => {\n\n\n \n\n return `/api/skills/@user/${username}/${name}/versions/${version}/download`\n}\n\nexport const downloadSkillVersion = async (username: Username,\n name: SkillName,\n version: Semver, options?: RequestInit): Promise<downloadSkillVersionResponse> => {\n \n return customFetch<downloadSkillVersionResponse>(getDownloadSkillVersionUrl(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 * Mark a skill version as deprecated with a message. Deprecated versions are still downloadable but show warnings to users.\n * @summary Deprecate skill version\n */\nexport type deprecateSkillVersionResponse200 = {\n data: SkillVersion\n status: 200\n}\n\nexport type deprecateSkillVersionResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type deprecateSkillVersionResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type deprecateSkillVersionResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type deprecateSkillVersionResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type deprecateSkillVersionResponse500 = {\n data: ApiError\n status: 500\n}\n \nexport type deprecateSkillVersionResponseSuccess = (deprecateSkillVersionResponse200) & {\n headers: Headers;\n};\nexport type deprecateSkillVersionResponseError = (deprecateSkillVersionResponse400 | deprecateSkillVersionResponse401 | deprecateSkillVersionResponse403 | deprecateSkillVersionResponse404 | deprecateSkillVersionResponse500) & {\n headers: Headers;\n};\n\nexport type deprecateSkillVersionResponse = (deprecateSkillVersionResponseSuccess | deprecateSkillVersionResponseError)\n\nexport const getDeprecateSkillVersionUrl = (username: Username,\n name: SkillName,\n version: Semver,) => {\n\n\n \n\n return `/api/skills/@user/${username}/${name}/versions/${version}/deprecate`\n}\n\nexport const deprecateSkillVersion = async (username: Username,\n name: SkillName,\n version: Semver,\n deprecateVersionInput: DeprecateVersionInput, options?: RequestInit): Promise<deprecateSkillVersionResponse> => {\n \n return customFetch<deprecateSkillVersionResponse>(getDeprecateSkillVersionUrl(username,name,version),\n { \n ...options,\n method: 'POST',\n headers: { 'Content-Type': 'application/json', ...options?.headers },\n body: JSON.stringify(\n deprecateVersionInput,)\n }\n);}\n\n\n\n/**\n * Remove the deprecation status from a skill version.\n * @summary Remove deprecation from skill version\n */\nexport type undeprecateSkillVersionResponse200 = {\n data: SkillVersion\n status: 200\n}\n\nexport type undeprecateSkillVersionResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type undeprecateSkillVersionResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type undeprecateSkillVersionResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type undeprecateSkillVersionResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type undeprecateSkillVersionResponse500 = {\n data: ApiError\n status: 500\n}\n \nexport type undeprecateSkillVersionResponseSuccess = (undeprecateSkillVersionResponse200) & {\n headers: Headers;\n};\nexport type undeprecateSkillVersionResponseError = (undeprecateSkillVersionResponse400 | undeprecateSkillVersionResponse401 | undeprecateSkillVersionResponse403 | undeprecateSkillVersionResponse404 | undeprecateSkillVersionResponse500) & {\n headers: Headers;\n};\n\nexport type undeprecateSkillVersionResponse = (undeprecateSkillVersionResponseSuccess | undeprecateSkillVersionResponseError)\n\nexport const getUndeprecateSkillVersionUrl = (username: Username,\n name: SkillName,\n version: Semver,) => {\n\n\n \n\n return `/api/skills/@user/${username}/${name}/versions/${version}/deprecate`\n}\n\nexport const undeprecateSkillVersion = async (username: Username,\n name: SkillName,\n version: Semver, options?: RequestInit): Promise<undeprecateSkillVersionResponse> => {\n \n return customFetch<undeprecateSkillVersionResponse>(getUndeprecateSkillVersionUrl(username,name,version),\n { \n ...options,\n method: 'DELETE'\n \n \n }\n);}\n\n\n\n/**\n * Change the visibility of a skill. Private packages can be made public, but public packages cannot be made private (this is irreversible, like npm).\n * @summary Change skill visibility\n */\nexport type changeSkillAccessResponse200 = {\n data: ChangeAccessResponse\n status: 200\n}\n\nexport type changeSkillAccessResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type changeSkillAccessResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type changeSkillAccessResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type changeSkillAccessResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type changeSkillAccessResponse500 = {\n data: ApiError\n status: 500\n}\n \nexport type changeSkillAccessResponseSuccess = (changeSkillAccessResponse200) & {\n headers: Headers;\n};\nexport type changeSkillAccessResponseError = (changeSkillAccessResponse400 | changeSkillAccessResponse401 | changeSkillAccessResponse403 | changeSkillAccessResponse404 | changeSkillAccessResponse500) & {\n headers: Headers;\n};\n\nexport type changeSkillAccessResponse = (changeSkillAccessResponseSuccess | changeSkillAccessResponseError)\n\nexport const getChangeSkillAccessUrl = (username: Username,\n name: SkillName,) => {\n\n\n \n\n return `/api/skills/@user/${username}/${name}/access`\n}\n\nexport const changeSkillAccess = async (username: Username,\n name: SkillName,\n changeAccessInput: ChangeAccessInput, options?: RequestInit): Promise<changeSkillAccessResponse> => {\n \n return customFetch<changeSkillAccessResponse>(getChangeSkillAccessUrl(username,name),\n { \n ...options,\n method: 'POST',\n headers: { 'Content-Type': 'application/json', ...options?.headers },\n body: JSON.stringify(\n changeAccessInput,)\n }\n);}\n\n\n\n/**\n * Retrieve the current user's subscription information\n * @summary Get current subscription\n */\nexport type getSubscriptionResponse200 = {\n data: SubscriptionInfo\n status: 200\n}\n\nexport type getSubscriptionResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type getSubscriptionResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type getSubscriptionResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type getSubscriptionResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type getSubscriptionResponse500 = {\n data: ApiError\n status: 500\n}\n \nexport type getSubscriptionResponseSuccess = (getSubscriptionResponse200) & {\n headers: Headers;\n};\nexport type getSubscriptionResponseError = (getSubscriptionResponse400 | getSubscriptionResponse401 | getSubscriptionResponse403 | getSubscriptionResponse404 | getSubscriptionResponse500) & {\n headers: Headers;\n};\n\nexport type getSubscriptionResponse = (getSubscriptionResponseSuccess | getSubscriptionResponseError)\n\nexport const getGetSubscriptionUrl = () => {\n\n\n \n\n return `/api/billing/subscription`\n}\n\nexport const getSubscription = async ( options?: RequestInit): Promise<getSubscriptionResponse> => {\n \n return customFetch<getSubscriptionResponse>(getGetSubscriptionUrl(),\n { \n ...options,\n method: 'GET'\n \n \n }\n);}\n\n\n\n/**\n * Create a Stripe checkout session for upgrading to Pro\n * @summary Create checkout session\n */\nexport type createCheckoutSessionResponse200 = {\n data: CheckoutSessionResponse\n status: 200\n}\n\nexport type createCheckoutSessionResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type createCheckoutSessionResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type createCheckoutSessionResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type createCheckoutSessionResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type createCheckoutSessionResponse500 = {\n data: ApiError\n status: 500\n}\n \nexport type createCheckoutSessionResponseSuccess = (createCheckoutSessionResponse200) & {\n headers: Headers;\n};\nexport type createCheckoutSessionResponseError = (createCheckoutSessionResponse400 | createCheckoutSessionResponse401 | createCheckoutSessionResponse403 | createCheckoutSessionResponse404 | createCheckoutSessionResponse500) & {\n headers: Headers;\n};\n\nexport type createCheckoutSessionResponse = (createCheckoutSessionResponseSuccess | createCheckoutSessionResponseError)\n\nexport const getCreateCheckoutSessionUrl = () => {\n\n\n \n\n return `/api/billing/checkout`\n}\n\nexport const createCheckoutSession = async (createCheckoutInput: CreateCheckoutInput, options?: RequestInit): Promise<createCheckoutSessionResponse> => {\n \n return customFetch<createCheckoutSessionResponse>(getCreateCheckoutSessionUrl(),\n { \n ...options,\n method: 'POST',\n headers: { 'Content-Type': 'application/json', ...options?.headers },\n body: JSON.stringify(\n createCheckoutInput,)\n }\n);}\n\n\n\n/**\n * Create a Stripe customer portal session for managing subscription\n * @summary Create customer portal session\n */\nexport type createPortalSessionResponse200 = {\n data: PortalSessionResponse\n status: 200\n}\n\nexport type createPortalSessionResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type createPortalSessionResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type createPortalSessionResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type createPortalSessionResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type createPortalSessionResponse500 = {\n data: ApiError\n status: 500\n}\n \nexport type createPortalSessionResponseSuccess = (createPortalSessionResponse200) & {\n headers: Headers;\n};\nexport type createPortalSessionResponseError = (createPortalSessionResponse400 | createPortalSessionResponse401 | createPortalSessionResponse403 | createPortalSessionResponse404 | createPortalSessionResponse500) & {\n headers: Headers;\n};\n\nexport type createPortalSessionResponse = (createPortalSessionResponseSuccess | createPortalSessionResponseError)\n\nexport const getCreatePortalSessionUrl = () => {\n\n\n \n\n return `/api/billing/portal`\n}\n\nexport const createPortalSession = async (createPortalInput: CreatePortalInput, options?: RequestInit): Promise<createPortalSessionResponse> => {\n \n return customFetch<createPortalSessionResponse>(getCreatePortalSessionUrl(),\n { \n ...options,\n method: 'POST',\n headers: { 'Content-Type': 'application/json', ...options?.headers },\n body: JSON.stringify(\n createPortalInput,)\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\tgetConfig,\n\tisConfigured,\n\ttype SDKConfig,\n\tSDKError,\n\tconfigure as sdkConfigure,\n} from \"./sdk/fetcher\";\nimport {\n\tdeleteSkill,\n\tdeleteSkillVersion,\n\texchangeCliToken,\n\tgetSkill,\n\tgetSkillVersion,\n\tlistMySkills,\n\tlistSkillVersions,\n\tlistUserSkills,\n\tme,\n\tpublishSkill,\n} from \"./sdk/generated\";\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/**\n * Deprecate a skill version\n */\nexport async function deprecateSkillVersion(\n\tusername: string,\n\tskillName: string,\n\tversion: string,\n\tmessage: string,\n): Promise<{ status: number; data?: unknown; error?: string }> {\n\tconst config = getConfig();\n\tif (!config) {\n\t\treturn { status: 401, error: \"SDK not configured\" };\n\t}\n\n\ttry {\n\t\tconst response = await fetch(\n\t\t\t`${config.baseUrl}/api/skills/@user/${username}/${skillName}/versions/${version}/deprecate`,\n\t\t\t{\n\t\t\t\tmethod: \"POST\",\n\t\t\t\theaders: {\n\t\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\t\tAuthorization: `Bearer ${config.apiKey}`,\n\t\t\t\t},\n\t\t\t\tbody: JSON.stringify({ message }),\n\t\t\t},\n\t\t);\n\n\t\tif (!response.ok) {\n\t\t\tconst error = await response.text();\n\t\t\treturn { status: response.status, error };\n\t\t}\n\n\t\tconst data = await response.json();\n\t\treturn { status: response.status, data };\n\t} catch (error) {\n\t\treturn {\n\t\t\tstatus: 500,\n\t\t\terror: error instanceof Error ? error.message : \"Unknown error\",\n\t\t};\n\t}\n}\n\n/**\n * Remove deprecation from a skill version\n */\nexport async function undeprecateSkillVersion(\n\tusername: string,\n\tskillName: string,\n\tversion: string,\n): Promise<{ status: number; data?: unknown; error?: string }> {\n\tconst config = getConfig();\n\tif (!config) {\n\t\treturn { status: 401, error: \"SDK not configured\" };\n\t}\n\n\ttry {\n\t\tconst response = await fetch(\n\t\t\t`${config.baseUrl}/api/skills/@user/${username}/${skillName}/versions/${version}/deprecate`,\n\t\t\t{\n\t\t\t\tmethod: \"DELETE\",\n\t\t\t\theaders: {\n\t\t\t\t\tAuthorization: `Bearer ${config.apiKey}`,\n\t\t\t\t},\n\t\t\t},\n\t\t);\n\n\t\tif (!response.ok) {\n\t\t\tconst error = await response.text();\n\t\t\treturn { status: response.status, error };\n\t\t}\n\n\t\tconst data = await response.json();\n\t\treturn { status: response.status, data };\n\t} catch (error) {\n\t\treturn {\n\t\t\tstatus: 500,\n\t\t\terror: error instanceof Error ? error.message : \"Unknown error\",\n\t\t};\n\t}\n}\n\n/**\n * Change skill visibility (public/private)\n */\nexport async function changeSkillAccess(\n\tusername: string,\n\tskillName: string,\n\tinput: { visibility: \"public\" | \"private\" },\n): Promise<{\n\tstatus: number;\n\tdata?: {\n\t\tid: string;\n\t\tname: string;\n\t\tusername: string;\n\t\tdescription: string | null;\n\t\tvisibility: \"public\" | \"private\";\n\t\tcreatedAt: string;\n\t\tupdatedAt: string;\n\t};\n\terror?: string;\n}> {\n\tconst config = getConfig();\n\tif (!config) {\n\t\treturn { status: 401, error: \"SDK not configured\" };\n\t}\n\n\ttry {\n\t\tconst response = await fetch(\n\t\t\t`${config.baseUrl}/api/skills/@user/${username}/${skillName}/access`,\n\t\t\t{\n\t\t\t\tmethod: \"POST\",\n\t\t\t\theaders: {\n\t\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\t\tAuthorization: `Bearer ${config.apiKey}`,\n\t\t\t\t},\n\t\t\t\tbody: JSON.stringify(input),\n\t\t\t},\n\t\t);\n\n\t\tif (!response.ok) {\n\t\t\tconst error = await response.text();\n\t\t\ttry {\n\t\t\t\tconst errorJson = JSON.parse(error);\n\t\t\t\treturn {\n\t\t\t\t\tstatus: response.status,\n\t\t\t\t\terror: errorJson.message || errorJson.error || error,\n\t\t\t\t};\n\t\t\t} catch {\n\t\t\t\treturn { status: response.status, error };\n\t\t\t}\n\t\t}\n\n\t\tconst data = (await response.json()) as {\n\t\t\tid: string;\n\t\t\tname: string;\n\t\t\tusername: string;\n\t\t\tdescription: string | null;\n\t\t\tvisibility: \"public\" | \"private\";\n\t\t\tcreatedAt: string;\n\t\t\tupdatedAt: string;\n\t\t};\n\t\treturn { status: response.status, data };\n\t} catch (error) {\n\t\treturn {\n\t\t\tstatus: 500,\n\t\t\terror: error instanceof Error ? error.message : \"Unknown error\",\n\t\t};\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 * Get a human-readable description for common HTTP status codes\n */\nfunction getHttpStatusDescription(status: number): string {\n\tconst descriptions: Record<number, string> = {\n\t\t400: \"Bad Request - The request was malformed\",\n\t\t401: \"Unauthorized - Please run 'pspm login' first\",\n\t\t403: \"Forbidden - You don't have permission for this action\",\n\t\t404: \"Not Found - The endpoint or resource doesn't exist\",\n\t\t409: \"Conflict - The resource already exists or there's a version conflict\",\n\t\t422: \"Validation Error - The request data is invalid\",\n\t\t429: \"Too Many Requests - Please slow down and try again\",\n\t\t500: \"Internal Server Error - Something went wrong on the server\",\n\t\t502: \"Bad Gateway - The server is temporarily unavailable\",\n\t\t503: \"Service Unavailable - The server is temporarily unavailable\",\n\t};\n\treturn descriptions[status] || `HTTP Error ${status}`;\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\t// Handle cases where errorData is a string (like \"Not Found\" from 404)\n\tif (typeof errorData === \"string\") {\n\t\tif (response.status === 404) {\n\t\t\treturn `${fallbackMessage}: ${getHttpStatusDescription(404)}\\nThe registry endpoint may be unavailable or misconfigured.`;\n\t\t}\n\t\treturn `${fallbackMessage}: ${errorData} (HTTP ${response.status})`;\n\t}\n\n\t// Handle empty or null response\n\tif (!errorData || typeof errorData !== \"object\") {\n\t\tconst statusDesc = getHttpStatusDescription(response.status);\n\t\tif (response.status === 404) {\n\t\t\treturn `${fallbackMessage}: ${statusDesc}\\nCheck that the registry URL is correct in your config.`;\n\t\t}\n\t\treturn `${fallbackMessage}: ${statusDesc}`;\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 HTTP status context for non-200 responses\n\tif (response.status >= 400) {\n\t\terrorMessage += ` (HTTP ${response.status})`;\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\";\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/**\n * User config stored in ~/.pspmrc (INI format)\n *\n * Supports npm-style configuration:\n * - registry = https://pspm.dev (default registry)\n * - authToken = sk_default (default auth token)\n * - @scope:registry = https://corp.pspm.io (scope to registry mapping)\n * - //host:authToken = sk_token (per-registry tokens)\n */\nexport interface UserConfig {\n\tregistry?: string;\n\tauthToken?: string;\n\tusername?: string;\n\t/** Scope to registry URL mappings (e.g., @myorg -> https://corp.pspm.io) */\n\tscopedRegistries?: Record<string, string>;\n\t/** Host to auth token mappings (e.g., pspm.dev -> sk_xxx) */\n\tregistryTokens?: Record<string, 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\t/** Scope to registry URL mappings */\n\tscopedRegistries: Record<string, string>;\n\t/** Host to auth token mappings */\n\tregistryTokens: Record<string, 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://registry.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 .pspm directory path (for current project)\n */\nexport function getPspmDir(): string {\n\treturn join(process.cwd(), \".pspm\");\n}\n\n/**\n * Get the skills directory path (for current project)\n * New path: .pspm/skills/\n */\nexport function getSkillsDir(): string {\n\treturn join(process.cwd(), \".pspm\", \"skills\");\n}\n\n/**\n * Get the cache directory path (for current project)\n * Used for tarball caching: .pspm/cache/\n */\nexport function getCacheDir(): string {\n\treturn join(process.cwd(), \".pspm\", \"cache\");\n}\n\n/**\n * Get the lockfile path (for current project)\n * New path: pspm-lock.json (at project root, npm-style)\n */\nexport function getLockfilePath(): string {\n\treturn join(process.cwd(), \"pspm-lock.json\");\n}\n\n/**\n * Get the legacy lockfile path (for migration)\n */\nexport function getLegacyLockfilePath(): string {\n\treturn join(process.cwd(), \"skill-lock.json\");\n}\n\n/**\n * Get the legacy skills directory path (for migration)\n */\nexport function getLegacySkillsDir(): string {\n\treturn join(process.cwd(), \".skills\");\n}\n\n// =============================================================================\n// INI Config Functions\n// =============================================================================\n\n/**\n * Read the user config file (~/.pspmrc, INI format)\n *\n * Supports npm-style configuration:\n * ```ini\n * ; Default registry and auth\n * registry = https://pspm.dev\n * authToken = sk_default\n *\n * ; Scope mappings\n * @myorg:registry = https://corp.pspm.io\n *\n * ; Per-registry tokens\n * //pspm.dev:authToken = sk_public\n * //corp.pspm.io:authToken = sk_corp\n * ```\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\t// Extract scoped registries (@scope:registry = url)\n\t\tconst scopedRegistries: Record<string, string> = {};\n\t\tfor (const key of Object.keys(parsed)) {\n\t\t\tconst scopeMatch = key.match(/^(@[^:]+):registry$/);\n\t\t\tif (scopeMatch) {\n\t\t\t\tconst scope = scopeMatch[1];\n\t\t\t\tscopedRegistries[scope] = parsed[key] as string;\n\t\t\t}\n\t\t}\n\n\t\t// Extract per-registry tokens (//host:authToken = token)\n\t\t// INI parser may nest these under a key like \"//host\"\n\t\tconst registryTokens: Record<string, string> = {};\n\t\tfor (const key of Object.keys(parsed)) {\n\t\t\t// Check for //host:authToken format\n\t\t\tconst tokenMatch = key.match(/^\\/\\/([^:]+):authToken$/);\n\t\t\tif (tokenMatch) {\n\t\t\t\tconst host = tokenMatch[1];\n\t\t\t\tregistryTokens[host] = parsed[key] as string;\n\t\t\t}\n\t\t\t// Also check for nested format (ini parser may parse //host as a section)\n\t\t\tif (key.startsWith(\"//\") && typeof parsed[key] === \"object\") {\n\t\t\t\tconst host = key.slice(2);\n\t\t\t\tconst section = parsed[key] as Record<string, string>;\n\t\t\t\tif (section.authToken) {\n\t\t\t\t\tregistryTokens[host] = section.authToken;\n\t\t\t\t}\n\t\t\t}\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\tscopedRegistries:\n\t\t\t\tObject.keys(scopedRegistries).length > 0 ? scopedRegistries : undefined,\n\t\t\tregistryTokens:\n\t\t\t\tObject.keys(registryTokens).length > 0 ? registryTokens : 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\tconst scopedRegistries = userConfig.scopedRegistries ?? {};\n\tconst registryTokens = userConfig.registryTokens ?? {};\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\tconsole.log(\n\t\t\t`[config] scopedRegistries: ${JSON.stringify(scopedRegistries)}`,\n\t\t);\n\t\tconsole.log(\n\t\t\t`[config] registryTokens: ${Object.keys(registryTokens).length} configured`,\n\t\t);\n\t}\n\n\treturn {\n\t\tregistryUrl,\n\t\tapiKey,\n\t\tusername,\n\t\tscopedRegistries,\n\t\tregistryTokens,\n\t};\n}\n\n// =============================================================================\n// Multi-Registry Helpers\n// =============================================================================\n\n/**\n * Get the auth token for a given registry URL.\n * Falls back to the default API key if no registry-specific token is configured.\n *\n * @param config - The resolved configuration\n * @param registryUrl - The registry URL\n * @returns The auth token to use, or undefined if none available\n */\nexport function getTokenForRegistry(\n\tconfig: ResolvedConfig,\n\tregistryUrl: string,\n): string | undefined {\n\ttry {\n\t\tconst url = new URL(registryUrl);\n\t\tconst host = url.host;\n\n\t\t// Check for host-specific token first\n\t\tif (config.registryTokens[host]) {\n\t\t\treturn config.registryTokens[host];\n\t\t}\n\n\t\t// Fall back to default API key\n\t\treturn config.apiKey;\n\t} catch {\n\t\t// Invalid URL, fall back to default\n\t\treturn config.apiKey;\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\tconfig.authToken = undefined;\n\tconfig.username = undefined;\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 * Ignore file handling for PSPM publish/pack\n *\n * Similar to npm's .npmignore behavior:\n * - If .pspmignore exists, use it\n * - Otherwise, fallback to .gitignore\n * - Always ignore node_modules and .git regardless\n */\n\nimport { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport ignore, { type Ignore } from \"ignore\";\n\n/**\n * Files/directories that are always ignored regardless of ignore file contents\n */\nconst ALWAYS_IGNORED = [\n\t\"node_modules\",\n\t\".git\",\n\t\".pspm-publish\", // temp directory used during publish\n];\n\n/**\n * Result of loading ignore patterns\n */\nexport interface IgnoreLoadResult {\n\t/** The ignore instance with loaded patterns */\n\tig: Ignore;\n\t/** Which file the patterns came from (null if using defaults only) */\n\tsource: \".pspmignore\" | \".gitignore\" | null;\n\t/** Raw patterns loaded from the file (excluding defaults) */\n\tpatterns: string[];\n}\n\n/**\n * Load ignore patterns from .pspmignore or .gitignore\n *\n * Priority:\n * 1. .pspmignore (if exists)\n * 2. .gitignore (if exists)\n * 3. Default patterns only (node_modules, .git)\n *\n * @param cwd - The directory to look for ignore files (defaults to process.cwd())\n * @returns An ignore instance and the source file used\n */\nexport async function loadIgnorePatterns(\n\tcwd: string = process.cwd(),\n): Promise<IgnoreLoadResult> {\n\tconst ig = ignore();\n\n\t// Always add default ignores\n\tig.add(ALWAYS_IGNORED);\n\n\t// Try .pspmignore first\n\tconst pspmIgnorePath = join(cwd, \".pspmignore\");\n\ttry {\n\t\tconst content = await readFile(pspmIgnorePath, \"utf-8\");\n\t\tconst patterns = parseIgnorePatterns(content);\n\t\tig.add(patterns);\n\t\treturn { ig, source: \".pspmignore\", patterns };\n\t} catch {\n\t\t// .pspmignore not found, try .gitignore\n\t}\n\n\t// Fallback to .gitignore\n\tconst gitIgnorePath = join(cwd, \".gitignore\");\n\ttry {\n\t\tconst content = await readFile(gitIgnorePath, \"utf-8\");\n\t\tconst patterns = parseIgnorePatterns(content);\n\t\tig.add(patterns);\n\t\treturn { ig, source: \".gitignore\", patterns };\n\t} catch {\n\t\t// No .gitignore either, use defaults only\n\t}\n\n\treturn { ig, source: null, patterns: [] };\n}\n\n/**\n * Create rsync exclude arguments from ignore patterns\n *\n * @param ig - The ignore instance\n * @returns Array of --exclude='pattern' arguments for rsync\n */\nexport function getExcludeArgsForRsync(patterns: string[]): string {\n\t// Always include the essential excludes\n\tconst allPatterns = [...new Set([...ALWAYS_IGNORED, ...patterns])];\n\n\treturn allPatterns.map((p) => `--exclude='${p}'`).join(\" \");\n}\n\n/**\n * Create tar exclude arguments from ignore patterns\n *\n * @param patterns - Array of patterns to exclude\n * @returns String of --exclude='pattern' arguments for tar\n */\nexport function getExcludeArgsForTar(patterns: string[]): string {\n\t// Same as rsync\n\tconst allPatterns = [...new Set([...ALWAYS_IGNORED, ...patterns])];\n\n\treturn allPatterns.map((p) => `--exclude='${p}'`).join(\" \");\n}\n\n/**\n * Parse an ignore file content into an array of patterns\n * Filters out comments and empty lines\n *\n * @param content - The content of an ignore file\n * @returns Array of patterns\n */\nexport function parseIgnorePatterns(content: string): string[] {\n\treturn content\n\t\t.split(\"\\n\")\n\t\t.map((line) => line.trim())\n\t\t.filter((line) => line && !line.startsWith(\"#\"));\n}\n\n/**\n * Read patterns from an ignore file\n *\n * @param filePath - Path to the ignore file\n * @returns Array of patterns, or empty array if file doesn't exist\n */\nexport async function readIgnoreFile(filePath: string): Promise<string[]> {\n\ttry {\n\t\tconst content = await readFile(filePath, \"utf-8\");\n\t\treturn parseIgnorePatterns(content);\n\t} catch {\n\t\treturn [];\n\t}\n}\n\nexport { ALWAYS_IGNORED };\n","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 * PSPM Lockfile Schema URL for IDE validation\n */\nexport const PSPM_LOCKFILE_SCHEMA_URL =\n\t\"https://pspm.dev/schema/v1/pspm-lock.json\";\n\n/**\n * PSPM Lockfile format (pspm-lock.json)\n * Similar to package-lock.json for npm.\n *\n * Migration notes:\n * - v1 used \"skill-lock.json\" with `skills` key.\n * - v2 uses \"pspm-lock.json\" with `packages` key.\n * - v3 adds `githubPackages` key for GitHub dependencies.\n * - v4 adds `dependencies` field to entries for recursive resolution.\n * Also adds `localPackages` for local file: protocol packages.\n */\nexport interface PspmLockfile {\n\t/** JSON Schema URL for IDE validation */\n\t$schema?: string;\n\t/** Lockfile format version */\n\tlockfileVersion: 1 | 2 | 3 | 4;\n\t/** Registry URL used for resolution */\n\tregistryUrl: string;\n\t/** Installed packages from registry (v2+ format) */\n\tpackages?: Record<string, PspmLockfileEntry>;\n\t/** Installed packages from GitHub (v3+ format) */\n\tgithubPackages?: Record<string, GitHubLockfileEntry>;\n\t/** Installed packages from local directories (v4+ format) */\n\tlocalPackages?: Record<string, LocalLockfileEntry>;\n\t/** Installed skills (v1 format, deprecated) */\n\tskills?: Record<string, PspmLockfileEntry>;\n}\n\n/**\n * Lockfile entry for a local package.\n * Key format in localPackages: \"file:../path\" or \"file:/absolute/path\"\n */\nexport interface LocalLockfileEntry {\n\t/** Always \"local\" for local packages */\n\tversion: \"local\";\n\t/** Original path from the specifier (relative or absolute) */\n\tpath: string;\n\t/** Resolved absolute path to the local skill directory */\n\tresolvedPath: string;\n\t/** Skill name (last segment of path) */\n\tname: string;\n}\n\n/**\n * Lockfile entry for a single package from registry.\n */\nexport interface PspmLockfileEntry {\n\t/** Resolved version */\n\tversion: string;\n\t/** Download URL used to fetch the package */\n\tresolved: string;\n\t/** Integrity hash for verification (sha256-...) */\n\tintegrity: string;\n\t/** Deprecation message if this version is deprecated */\n\tdeprecated?: string;\n\t/** Dependencies: package name -> resolved version (v4+) */\n\tdependencies?: Record<string, string>;\n}\n\n/**\n * Lockfile entry for a GitHub package.\n * Key format in githubPackages: \"github:owner/repo[/path]\"\n */\nexport interface GitHubLockfileEntry extends PspmLockfileEntry {\n\t/** Resolved Git commit SHA */\n\tgitCommit: string;\n\t/** Original Git ref (branch, tag, or \"latest\") */\n\tgitRef: string;\n}\n","/**\n * PSPM Manifest format (pspm.json)\n *\n * This is the dedicated manifest format for prompt skill packages,\n * separate from package.json used for npm/node dependencies.\n */\n\n/**\n * Version requirements for the skill\n */\nexport interface PspmManifestRequirements {\n\t/** Minimum Claude model version required (e.g., \">=3.5\") */\n\tclaude?: string;\n\t/** Minimum PSPM CLI version required (e.g., \">=0.1.0\") */\n\tpspm?: string;\n}\n\n/**\n * Agent configuration for skill symlinks\n */\nexport interface AgentConfig {\n\t/** Directory where skills should be symlinked (e.g., \".claude/skills\") */\n\tskillsDir: string;\n}\n\n/**\n * Built-in agent types with predefined configurations\n */\nexport type BuiltInAgent =\n\t| \"claude-code\"\n\t| \"codex\"\n\t| \"cursor\"\n\t| \"gemini\"\n\t| \"kiro\"\n\t| \"opencode\";\n\n/**\n * PSPM Manifest schema for pspm.json\n *\n * @example\n * ```json\n * {\n * \"$schema\": \"https://pspm.dev/schema/pspm.json\",\n * \"name\": \"my-skill\",\n * \"version\": \"1.0.0\",\n * \"description\": \"A skill for code reviews\",\n * \"author\": \"username\",\n * \"license\": \"MIT\",\n * \"type\": \"skill\",\n * \"capabilities\": [\"code-review\", \"typescript\"],\n * \"main\": \"SKILL.md\",\n * \"requirements\": {\n * \"claude\": \">=3.5\",\n * \"pspm\": \">=0.1.0\"\n * },\n * \"files\": [\"SKILL.md\", \"runtime/\", \"scripts/\", \"data/\"],\n * \"dependencies\": {},\n * \"private\": false\n * }\n * ```\n */\nexport interface PspmManifest {\n\t/** JSON Schema URL for validation */\n\t$schema?: string;\n\n\t/** Package name (no @ prefix needed, username is derived from logged-in user) */\n\tname: string;\n\n\t/** Semantic version string */\n\tversion: string;\n\n\t/** Human-readable description */\n\tdescription?: string;\n\n\t/** Package author */\n\tauthor?: string;\n\n\t/** License identifier (e.g., \"MIT\", \"Apache-2.0\") */\n\tlicense?: string;\n\n\t/** Package type (always \"skill\" for prompt skill packages) */\n\ttype?: \"skill\";\n\n\t/** List of capabilities/tags for discovery */\n\tcapabilities?: string[];\n\n\t/** Main entry point file (default: \"SKILL.md\") */\n\tmain?: string;\n\n\t/** Version requirements */\n\trequirements?: PspmManifestRequirements;\n\n\t/** Files to include in the published package */\n\tfiles?: string[];\n\n\t/** Skill dependencies (format: \"@user/{username}/{name}\": \"^1.0.0\") */\n\tdependencies?: Record<string, string>;\n\n\t/**\n\t * GitHub skill dependencies (format: \"github:owner/repo/path\": \"ref\")\n\t *\n\t * @example\n\t * ```json\n\t * {\n\t * \"githubDependencies\": {\n\t * \"github:vercel-labs/agent-skills/skills/react-best-practices\": \"main\",\n\t * \"github:myorg/prompts/team/frontend/linter\": \"v2.0.0\"\n\t * }\n\t * }\n\t * ```\n\t */\n\tgithubDependencies?: Record<string, string>;\n\n\t/**\n\t * Local skill dependencies (format: \"file:../path\": \"*\")\n\t *\n\t * Used for local development and testing before publishing.\n\t * Creates symlinks for instant updates during development.\n\t *\n\t * @example\n\t * ```json\n\t * {\n\t * \"localDependencies\": {\n\t * \"file:../my-local-skill\": \"*\",\n\t * \"file:/absolute/path/to/skill\": \"*\"\n\t * }\n\t * }\n\t * ```\n\t */\n\tlocalDependencies?: Record<string, string>;\n\n\t/**\n\t * Custom agent configuration overrides.\n\t * Built-in agents (claude-code, cursor, codex) have default configs.\n\t * Custom agents can also be defined here.\n\t *\n\t * @example\n\t * ```json\n\t * {\n\t * \"agents\": {\n\t * \"claude-code\": { \"skillsDir\": \".claude/skills\" },\n\t * \"my-custom\": { \"skillsDir\": \".myagent/prompts\" }\n\t * }\n\t * }\n\t * ```\n\t */\n\tagents?: Partial<Record<BuiltInAgent, AgentConfig>> &\n\t\tRecord<string, AgentConfig>;\n\n\t/** If true, prevents publishing to registry */\n\tprivate?: boolean;\n}\n\n/**\n * Result of detecting and reading a manifest\n */\nexport interface ManifestDetectionResult {\n\t/** The detected manifest type */\n\ttype: \"pspm.json\" | \"package.json\";\n\n\t/** The parsed manifest content */\n\tmanifest: PspmManifest;\n\n\t/** The file path that was read */\n\tpath: string;\n}\n\n/**\n * Default file patterns to include when publishing\n */\nexport const DEFAULT_SKILL_FILES = [\n\t\"SKILL.md\",\n\t\"runtime\",\n\t\"scripts\",\n\t\"data\",\n] as const;\n\n/**\n * Default main entry point\n */\nexport const DEFAULT_MAIN = \"SKILL.md\";\n\n/**\n * Schema URL for pspm.json (versioned)\n */\nexport const PSPM_SCHEMA_URL = \"https://pspm.dev/schema/v1/pspm.json\";\n\n/**\n * Validate that a manifest has required fields\n */\nexport function validateManifest(\n\tmanifest: Partial<PspmManifest>,\n): { valid: true } | { valid: false; error: string } {\n\tif (!manifest.name) {\n\t\treturn { valid: false, error: \"Manifest must have a 'name' field\" };\n\t}\n\n\tif (!manifest.version) {\n\t\treturn { valid: false, error: \"Manifest must have a 'version' field\" };\n\t}\n\n\t// Validate name format (lowercase, alphanumeric, hyphens, underscores)\n\tif (!/^[a-z][a-z0-9_-]*$/.test(manifest.name)) {\n\t\treturn {\n\t\t\tvalid: false,\n\t\t\terror:\n\t\t\t\t\"Name must start with a lowercase letter and contain only lowercase letters, numbers, hyphens, and underscores\",\n\t\t};\n\t}\n\n\t// Validate version is valid semver (basic check)\n\tif (!/^\\d+\\.\\d+\\.\\d+/.test(manifest.version)) {\n\t\treturn {\n\t\t\tvalid: false,\n\t\t\terror: \"Version must be a valid semantic version (e.g., 1.0.0)\",\n\t\t};\n\t}\n\n\treturn { valid: true };\n}\n\n/**\n * Normalize a manifest by filling in defaults\n */\nexport function normalizeManifest(manifest: PspmManifest): PspmManifest {\n\treturn {\n\t\t...manifest,\n\t\ttype: manifest.type ?? \"skill\",\n\t\tmain: manifest.main ?? DEFAULT_MAIN,\n\t\tfiles: manifest.files ?? [...DEFAULT_SKILL_FILES],\n\t\tdependencies: manifest.dependencies ?? {},\n\t\tgithubDependencies: manifest.githubDependencies ?? {},\n\t\tlocalDependencies: manifest.localDependencies ?? {},\n\t\tprivate: manifest.private ?? false,\n\t};\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] ?? null;\n}\n\n/**\n * Find the highest version that satisfies ALL given ranges.\n * Used for pnpm-style dependency resolution where multiple dependents\n * may require the same package with different version constraints.\n *\n * @param ranges - Array of semver ranges to satisfy (e.g., [\"^1.0.0\", \">=1.2.0\"])\n * @param availableVersions - List of available version strings\n * @returns The highest version satisfying all ranges, or null if none found\n */\nexport function findHighestSatisfying(\n\tranges: 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 (sorted.length === 0) return null;\n\n\t// Normalize ranges\n\tconst normalizedRanges = ranges.map((r) =>\n\t\t!r || r === \"latest\" || r === \"*\" ? \"*\" : r,\n\t);\n\n\t// Find highest version satisfying all ranges\n\tfor (const version of sorted) {\n\t\tconst satisfiesAll = normalizedRanges.every((range) =>\n\t\t\tsemver.satisfies(version, range),\n\t\t);\n\t\tif (satisfiesAll) {\n\t\t\treturn version;\n\t\t}\n\t}\n\n\treturn null;\n}\n\n/**\n * Intersect multiple semver ranges to find if they're compatible.\n * Returns true if there exists at least one version that could satisfy all ranges.\n *\n * @param ranges - Array of semver ranges to check\n * @returns True if ranges can be satisfied together\n */\nexport function rangesIntersect(ranges: string[]): boolean {\n\tif (ranges.length === 0) return true;\n\tif (ranges.length === 1) return true;\n\n\t// Normalize ranges\n\tconst normalizedRanges = ranges.map((r) =>\n\t\t!r || r === \"latest\" || r === \"*\" ? \"*\" : r,\n\t);\n\n\t// Check if all ranges intersect by seeing if any version could satisfy all\n\t// We use a subset of the range to find intersections\n\ttry {\n\t\tconst intersection = normalizedRanges.reduce((acc, range) => {\n\t\t\tif (acc === \"*\") return range;\n\t\t\tif (range === \"*\") return acc;\n\t\t\treturn semver.intersects(acc, range) ? `${acc} ${range}` : \"\";\n\t\t}, \"*\");\n\t\treturn intersection !== \"\";\n\t} catch {\n\t\treturn false;\n\t}\n}\n","/**\n * Recursive Dependency Resolver for PSPM\n *\n * Implements pnpm-style dependency resolution:\n * - Highest satisfying version strategy\n * - 5-depth limit to prevent deep trees\n * - Circular dependency detection\n * - Topological sort for installation order\n */\n\nimport { configure, getSkillVersion, listSkillVersions } from \"@/api-client\";\nimport { findHighestSatisfying } from \"./version\";\n\n// =============================================================================\n// Constants\n// =============================================================================\n\n/** Maximum depth for transitive dependency resolution */\nexport const MAX_DEPENDENCY_DEPTH = 5;\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface ResolverConfig {\n\t/** Maximum depth for resolution (default: 5) */\n\tmaxDepth: number;\n\t/** Registry URL */\n\tregistryUrl: string;\n\t/** API key for authentication */\n\tapiKey?: string;\n}\n\nexport interface DependencyNode {\n\t/** Full package name (e.g., @user/alice/skill) */\n\tname: string;\n\t/** Resolved version (e.g., 1.2.3) */\n\tversion: string;\n\t/** Original version range requested (e.g., ^1.0.0) */\n\tversionRange: string;\n\t/** Download URL for the package */\n\tdownloadUrl: string;\n\t/** Integrity hash for verification */\n\tintegrity: string;\n\t/** Depth in dependency tree (0 = direct dependency) */\n\tdepth: number;\n\t/** Dependencies: name -> resolved version */\n\tdependencies: Record<string, string>;\n\t/** Packages that depend on this one */\n\tdependents: string[];\n\t/** Whether this is a direct dependency (from pspm.json) */\n\tisDirect: boolean;\n\t/** Deprecation message if deprecated */\n\tdeprecated?: string;\n}\n\nexport interface DependencyGraph {\n\t/** All resolved nodes: name -> node */\n\tnodes: Map<string, DependencyNode>;\n\t/** Root package names (direct dependencies) */\n\troots: string[];\n\t/** Resolution errors */\n\terrors: ResolutionError[];\n\t/** Version conflicts (multiple packages need incompatible versions) */\n\tconflicts: VersionConflict[];\n}\n\nexport interface ResolutionResult {\n\t/** Whether resolution completed successfully */\n\tsuccess: boolean;\n\t/** The dependency graph */\n\tgraph: DependencyGraph;\n\t/** Topologically sorted install order */\n\tinstallOrder: string[];\n}\n\nexport type ResolutionErrorType =\n\t| \"circular_dependency\"\n\t| \"max_depth_exceeded\"\n\t| \"no_satisfying_version\"\n\t| \"package_not_found\"\n\t| \"fetch_error\";\n\nexport interface ResolutionError {\n\ttype: ResolutionErrorType;\n\tpackage: string;\n\tmessage: string;\n\t/** Path that led to this error */\n\tpath?: string[];\n}\n\nexport interface VersionConflict {\n\t/** Package name */\n\tpackage: string;\n\t/** Ranges requested by different dependents */\n\tranges: Array<{ dependent: string; range: string }>;\n\t/** Available versions that were checked */\n\tavailableVersions: string[];\n}\n\n// =============================================================================\n// Internal Types\n// =============================================================================\n\ninterface QueueItem {\n\tname: string;\n\tversionRange: string;\n\tdepth: number;\n\tdependent: string;\n\tpath: string[];\n}\n\ninterface CollectedRange {\n\trange: string;\n\tdependent: string;\n\tdepth: number;\n}\n\n// =============================================================================\n// Main Resolution Function\n// =============================================================================\n\n/**\n * Resolve dependencies recursively using BFS.\n *\n * Algorithm:\n * 1. Queue root dependencies at depth=0\n * 2. For each package, collect all version ranges from dependents\n * 3. Find highest version satisfying ALL ranges\n * 4. Fetch package details including its dependencies\n * 5. Queue transitive dependencies at depth+1\n * 6. Topologically sort for installation order\n *\n * @param rootDeps - Direct dependencies: name -> version range\n * @param config - Resolver configuration\n * @returns Resolution result with graph and install order\n */\nexport async function resolveRecursive(\n\trootDeps: Record<string, string>,\n\tconfig: ResolverConfig,\n): Promise<ResolutionResult> {\n\tconst graph: DependencyGraph = {\n\t\tnodes: new Map(),\n\t\troots: Object.keys(rootDeps),\n\t\terrors: [],\n\t\tconflicts: [],\n\t};\n\n\t// Configure API client - apiKey may be undefined for public packages\n\tconfigure({\n\t\tregistryUrl: config.registryUrl,\n\t\tapiKey: config.apiKey,\n\t});\n\n\t// Collect version ranges for each package\n\tconst rangesByPackage = new Map<string, CollectedRange[]>();\n\n\t// Queue for BFS traversal\n\tconst queue: QueueItem[] = [];\n\n\t// Initialize queue with root dependencies\n\tfor (const [name, range] of Object.entries(rootDeps)) {\n\t\tqueue.push({\n\t\t\tname,\n\t\t\tversionRange: range,\n\t\t\tdepth: 0,\n\t\t\tdependent: \"root\",\n\t\t\tpath: [],\n\t\t});\n\t}\n\n\t// Set of packages being processed (for cycle detection)\n\tconst processing = new Set<string>();\n\n\t// Phase 1: Collect all version ranges using BFS\n\twhile (queue.length > 0) {\n\t\tconst item = queue.shift();\n\t\tif (!item) continue;\n\t\tconst { name, versionRange, depth, dependent, path } = item;\n\n\t\t// Check depth limit\n\t\tif (depth > config.maxDepth) {\n\t\t\tgraph.errors.push({\n\t\t\t\ttype: \"max_depth_exceeded\",\n\t\t\t\tpackage: name,\n\t\t\t\tmessage: `Maximum dependency depth (${config.maxDepth}) exceeded at: ${[...path, name].join(\" -> \")}`,\n\t\t\t\tpath: [...path, name],\n\t\t\t});\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Check for circular dependency\n\t\tif (path.includes(name)) {\n\t\t\tgraph.errors.push({\n\t\t\t\ttype: \"circular_dependency\",\n\t\t\t\tpackage: name,\n\t\t\t\tmessage: `Circular dependency detected: ${[...path, name].join(\" -> \")}`,\n\t\t\t\tpath: [...path, name],\n\t\t\t});\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Collect range for this package\n\t\tif (!rangesByPackage.has(name)) {\n\t\t\trangesByPackage.set(name, []);\n\t\t}\n\t\trangesByPackage.get(name)?.push({\n\t\t\trange: versionRange,\n\t\t\tdependent,\n\t\t\tdepth,\n\t\t});\n\n\t\t// Only process each package once for fetching\n\t\tif (processing.has(name)) {\n\t\t\tcontinue;\n\t\t}\n\t\tprocessing.add(name);\n\n\t\t// Parse package name\n\t\tconst match = name.match(/^@user\\/([^/]+)\\/([^/]+)$/);\n\t\tif (!match) {\n\t\t\tgraph.errors.push({\n\t\t\t\ttype: \"package_not_found\",\n\t\t\t\tpackage: name,\n\t\t\t\tmessage: `Invalid package name format: ${name}`,\n\t\t\t});\n\t\t\tcontinue;\n\t\t}\n\t\tconst [, username, skillName] = match;\n\n\t\t// Fetch available versions\n\t\ttry {\n\t\t\tconst versionsResponse = await listSkillVersions(username, skillName);\n\t\t\tif (versionsResponse.status !== 200) {\n\t\t\t\tgraph.errors.push({\n\t\t\t\t\ttype: \"package_not_found\",\n\t\t\t\t\tpackage: name,\n\t\t\t\t\tmessage: `Package ${name} not found in registry`,\n\t\t\t\t});\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst versions = versionsResponse.data as Array<{ version: string }>;\n\t\t\tif (versions.length === 0) {\n\t\t\t\tgraph.errors.push({\n\t\t\t\t\ttype: \"package_not_found\",\n\t\t\t\t\tpackage: name,\n\t\t\t\t\tmessage: `Package ${name} has no versions`,\n\t\t\t\t});\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst availableVersions = versions.map((v) => v.version);\n\n\t\t\t// Find highest satisfying version (will be finalized in phase 2)\n\t\t\tconst resolvedVersion = findHighestSatisfying(\n\t\t\t\t[versionRange],\n\t\t\t\tavailableVersions,\n\t\t\t);\n\n\t\t\tif (!resolvedVersion) {\n\t\t\t\tgraph.errors.push({\n\t\t\t\t\ttype: \"no_satisfying_version\",\n\t\t\t\t\tpackage: name,\n\t\t\t\t\tmessage: `No version of ${name} satisfies: ${versionRange}`,\n\t\t\t\t});\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Fetch package details for dependencies\n\t\t\tconst versionResponse = await getSkillVersion(\n\t\t\t\tusername,\n\t\t\t\tskillName,\n\t\t\t\tresolvedVersion,\n\t\t\t);\n\t\t\tif (versionResponse.status !== 200 || !versionResponse.data) {\n\t\t\t\tgraph.errors.push({\n\t\t\t\t\ttype: \"fetch_error\",\n\t\t\t\t\tpackage: name,\n\t\t\t\t\tmessage: `Failed to fetch ${name}@${resolvedVersion}`,\n\t\t\t\t});\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst versionInfo = versionResponse.data;\n\t\t\tconst manifest = versionInfo.manifest as\n\t\t\t\t| { dependencies?: Record<string, string> }\n\t\t\t\t| undefined;\n\t\t\tconst dependencies = manifest?.dependencies ?? {};\n\n\t\t\t// Create node (may be updated in phase 2 with final version)\n\t\t\tconst node: DependencyNode = {\n\t\t\t\tname,\n\t\t\t\tversion: resolvedVersion,\n\t\t\t\tversionRange,\n\t\t\t\tdownloadUrl: versionInfo.downloadUrl,\n\t\t\t\tintegrity: `sha256-${Buffer.from(versionInfo.checksum, \"hex\").toString(\"base64\")}`,\n\t\t\t\tdepth,\n\t\t\t\tdependencies,\n\t\t\t\tdependents: [dependent],\n\t\t\t\tisDirect: depth === 0,\n\t\t\t\tdeprecated: versionInfo.deprecationMessage ?? undefined,\n\t\t\t};\n\t\t\tgraph.nodes.set(name, node);\n\n\t\t\t// Queue transitive dependencies\n\t\t\tfor (const [depName, depRange] of Object.entries(dependencies)) {\n\t\t\t\tqueue.push({\n\t\t\t\t\tname: depName,\n\t\t\t\t\tversionRange: depRange,\n\t\t\t\t\tdepth: depth + 1,\n\t\t\t\t\tdependent: name,\n\t\t\t\t\tpath: [...path, name],\n\t\t\t\t});\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconst message = error instanceof Error ? error.message : \"Unknown error\";\n\t\t\tgraph.errors.push({\n\t\t\t\ttype: \"fetch_error\",\n\t\t\t\tpackage: name,\n\t\t\t\tmessage: `Error fetching ${name}: ${message}`,\n\t\t\t});\n\t\t}\n\t}\n\n\t// Phase 2: Resolve final versions considering all collected ranges\n\tfor (const [name, ranges] of rangesByPackage.entries()) {\n\t\tconst node = graph.nodes.get(name);\n\t\tif (!node) continue;\n\n\t\t// Update dependents list\n\t\tconst uniqueDependents = [...new Set(ranges.map((r) => r.dependent))];\n\t\tnode.dependents = uniqueDependents;\n\n\t\t// Check if all ranges can be satisfied\n\t\tconst allRanges = ranges.map((r) => r.range);\n\t\tconst match = name.match(/^@user\\/([^/]+)\\/([^/]+)$/);\n\t\tif (!match) continue;\n\n\t\tconst [, username, skillName] = match;\n\n\t\ttry {\n\t\t\tconst versionsResponse = await listSkillVersions(username, skillName);\n\t\t\tif (versionsResponse.status !== 200) continue;\n\n\t\t\tconst versions = versionsResponse.data as Array<{ version: string }>;\n\t\t\tconst availableVersions = versions.map((v) => v.version);\n\n\t\t\tconst finalVersion = findHighestSatisfying(allRanges, availableVersions);\n\n\t\t\tif (!finalVersion) {\n\t\t\t\t// Record conflict\n\t\t\t\tgraph.conflicts.push({\n\t\t\t\t\tpackage: name,\n\t\t\t\t\tranges: ranges.map((r) => ({\n\t\t\t\t\t\tdependent: r.dependent,\n\t\t\t\t\t\trange: r.range,\n\t\t\t\t\t})),\n\t\t\t\t\tavailableVersions,\n\t\t\t\t});\n\n\t\t\t\tgraph.errors.push({\n\t\t\t\t\ttype: \"no_satisfying_version\",\n\t\t\t\t\tpackage: name,\n\t\t\t\t\tmessage: `No version of ${name} satisfies all requirements: ${allRanges.join(\", \")}`,\n\t\t\t\t});\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Update node if version changed\n\t\t\tif (finalVersion !== node.version) {\n\t\t\t\tconst versionResponse = await getSkillVersion(\n\t\t\t\t\tusername,\n\t\t\t\t\tskillName,\n\t\t\t\t\tfinalVersion,\n\t\t\t\t);\n\t\t\t\tif (versionResponse.status === 200 && versionResponse.data) {\n\t\t\t\t\tconst versionInfo = versionResponse.data;\n\t\t\t\t\tnode.version = finalVersion;\n\t\t\t\t\tnode.downloadUrl = versionInfo.downloadUrl;\n\t\t\t\t\tnode.integrity = `sha256-${Buffer.from(versionInfo.checksum, \"hex\").toString(\"base64\")}`;\n\t\t\t\t\tnode.deprecated = versionInfo.deprecationMessage ?? undefined;\n\n\t\t\t\t\tconst manifest = versionInfo.manifest as\n\t\t\t\t\t\t| { dependencies?: Record<string, string> }\n\t\t\t\t\t\t| undefined;\n\t\t\t\t\tnode.dependencies = manifest?.dependencies ?? {};\n\t\t\t\t}\n\t\t\t}\n\t\t} catch {\n\t\t\t// Already have a node, keep it\n\t\t}\n\t}\n\n\t// Phase 3: Compute topological sort\n\tconst installOrder = topologicalSort(graph);\n\n\t// Determine success\n\tconst success = graph.errors.length === 0 && graph.conflicts.length === 0;\n\n\treturn {\n\t\tsuccess,\n\t\tgraph,\n\t\tinstallOrder,\n\t};\n}\n\n// =============================================================================\n// Topological Sort\n// =============================================================================\n\n/**\n * Topologically sort packages using Kahn's algorithm.\n * Packages with no dependencies are installed first.\n *\n * @param graph - The dependency graph\n * @returns Sorted list of package names\n */\nexport function topologicalSort(graph: DependencyGraph): string[] {\n\t// in-degree: number of dependencies a node has (within the graph)\n\tconst inDegree = new Map<string, number>();\n\t// dependents: nodes that depend on this node (reverse edges)\n\tconst dependents = new Map<string, string[]>();\n\n\t// Initialize all nodes\n\tfor (const name of graph.nodes.keys()) {\n\t\tinDegree.set(name, 0);\n\t\tdependents.set(name, []);\n\t}\n\n\t// Build the graph\n\tfor (const [name, node] of graph.nodes.entries()) {\n\t\tfor (const depName of Object.keys(node.dependencies)) {\n\t\t\t// Only count dependencies that exist in our graph\n\t\t\tif (graph.nodes.has(depName)) {\n\t\t\t\t// Increment in-degree of current node (it has a dependency)\n\t\t\t\tinDegree.set(name, (inDegree.get(name) ?? 0) + 1);\n\t\t\t\t// Add reverse edge: depName is depended on by name\n\t\t\t\tif (!dependents.has(depName)) {\n\t\t\t\t\tdependents.set(depName, []);\n\t\t\t\t}\n\t\t\t\tdependents.get(depName)?.push(name);\n\t\t\t}\n\t\t}\n\t}\n\n\t// Find nodes with in-degree 0 (no dependencies within our graph)\n\tconst queue: string[] = [];\n\tfor (const [name, degree] of inDegree.entries()) {\n\t\tif (degree === 0) {\n\t\t\tqueue.push(name);\n\t\t}\n\t}\n\n\tconst sorted: string[] = [];\n\twhile (queue.length > 0) {\n\t\tconst current = queue.shift();\n\t\tif (!current) continue;\n\t\tsorted.push(current);\n\n\t\t// For each node that depends on current, decrease its in-degree\n\t\tconst deps = dependents.get(current) ?? [];\n\t\tfor (const dependent of deps) {\n\t\t\tconst newDegree = (inDegree.get(dependent) ?? 1) - 1;\n\t\t\tinDegree.set(dependent, newDegree);\n\t\t\tif (newDegree === 0 && !sorted.includes(dependent)) {\n\t\t\t\tqueue.push(dependent);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn sorted;\n}\n\n/**\n * Compute installation order from lockfile packages.\n * Dependencies are installed before dependents.\n *\n * @param packages - Lockfile packages with dependencies field\n * @returns Sorted list of package names\n */\nexport function computeInstallOrder(\n\tpackages: Record<string, { dependencies?: Record<string, string> }>,\n): string[] {\n\tconst visited = new Set<string>();\n\tconst order: string[] = [];\n\n\tfunction visit(name: string) {\n\t\tif (visited.has(name)) return;\n\t\tvisited.add(name);\n\n\t\tconst entry = packages[name];\n\t\tif (entry?.dependencies) {\n\t\t\tfor (const dep of Object.keys(entry.dependencies)) {\n\t\t\t\tvisit(dep);\n\t\t\t}\n\t\t}\n\t\torder.push(name);\n\t}\n\n\tfor (const name of Object.keys(packages)) {\n\t\tvisit(name);\n\t}\n\n\treturn order;\n}\n\n// =============================================================================\n// Utility Functions\n// =============================================================================\n\n/**\n * Format resolution errors for display.\n *\n * @param errors - Resolution errors\n * @returns Formatted error messages\n */\nexport function formatResolutionErrors(errors: ResolutionError[]): string[] {\n\treturn errors.map((error) => {\n\t\tswitch (error.type) {\n\t\t\tcase \"circular_dependency\":\n\t\t\t\treturn `Circular dependency: ${error.path?.join(\" -> \") ?? error.package}`;\n\t\t\tcase \"max_depth_exceeded\":\n\t\t\t\treturn `Max depth exceeded at: ${error.path?.join(\" -> \") ?? error.package}`;\n\t\t\tcase \"no_satisfying_version\":\n\t\t\t\treturn error.message;\n\t\t\tcase \"package_not_found\":\n\t\t\t\treturn `Package not found: ${error.package}`;\n\t\t\tcase \"fetch_error\":\n\t\t\t\treturn error.message;\n\t\t\tdefault:\n\t\t\t\treturn error.message;\n\t\t}\n\t});\n}\n\n/**\n * Format version conflicts for display.\n *\n * @param conflicts - Version conflicts\n * @returns Formatted conflict messages\n */\nexport function formatVersionConflicts(conflicts: VersionConflict[]): string[] {\n\treturn conflicts.map((conflict) => {\n\t\tconst requirements = conflict.ranges\n\t\t\t.map((r) => `${r.dependent} needs ${r.range}`)\n\t\t\t.join(\", \");\n\t\treturn `No version of ${conflict.package} satisfies: ${requirements}`;\n\t});\n}\n\n/**\n * Print resolution errors to console.\n *\n * @param errors - Resolution errors\n * @param conflicts - Version conflicts\n */\nexport function printResolutionErrors(\n\terrors: ResolutionError[],\n\tconflicts: VersionConflict[] = [],\n): void {\n\tif (errors.length > 0) {\n\t\tconsole.error(\"\\nResolution errors:\");\n\t\tfor (const msg of formatResolutionErrors(errors)) {\n\t\t\tconsole.error(` - ${msg}`);\n\t\t}\n\t}\n\n\tif (conflicts.length > 0) {\n\t\tconsole.error(\"\\nVersion conflicts:\");\n\t\tfor (const msg of formatVersionConflicts(conflicts)) {\n\t\t\tconsole.error(` - ${msg}`);\n\t\t}\n\t}\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\tconst username = match[1];\n\tconst name = match[2];\n\tif (!username || !name) {\n\t\treturn null;\n\t}\n\n\treturn {\n\t\tusername,\n\t\tname,\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\n// =============================================================================\n// GitHub Specifier Support\n// =============================================================================\n\n/**\n * Parsed GitHub specifier\n *\n * Format: github:{owner}/{repo}[/{path}][@{ref}]\n *\n * @example\n * - github:vercel-labs/agent-skills\n * - github:vercel-labs/agent-skills@main\n * - github:vercel-labs/agent-skills/skills/react-best-practices\n * - github:vercel-labs/agent-skills/skills/react-best-practices@main\n * - github:myorg/prompts/team/frontend/code-review@v2.0.0\n */\nexport interface GitHubSpecifier {\n\t/** Repository owner */\n\towner: string;\n\t/** Repository name */\n\trepo: string;\n\t/** Optional path within the repository (e.g., \"skills/react-best-practices\") */\n\tpath?: string;\n\t/** Git ref (branch, tag, or commit SHA). Defaults to default branch if not specified. */\n\tref?: string;\n}\n\n/**\n * GitHub specifier regex pattern\n * Matches: github:{owner}/{repo}[/{path}][@{ref}]\n *\n * Group 1: owner\n * Group 2: repo\n * Group 3: optional /path (with leading slash)\n * Group 4: optional @ref\n */\nconst GITHUB_SPECIFIER_PATTERN =\n\t/^github:([a-zA-Z0-9_-]+)\\/([a-zA-Z0-9_.-]+)(\\/[^@]+)?(?:@(.+))?$/;\n\n/**\n * Parse a GitHub specifier string.\n *\n * @param specifier - The specifier string (e.g., \"github:owner/repo/path@ref\")\n * @returns Parsed specifier or null if invalid\n *\n * @example\n * ```typescript\n * parseGitHubSpecifier(\"github:vercel-labs/agent-skills/skills/react@main\")\n * // => { owner: \"vercel-labs\", repo: \"agent-skills\", path: \"skills/react\", ref: \"main\" }\n *\n * parseGitHubSpecifier(\"github:myorg/prompts\")\n * // => { owner: \"myorg\", repo: \"prompts\", path: undefined, ref: undefined }\n * ```\n */\nexport function parseGitHubSpecifier(\n\tspecifier: string,\n): GitHubSpecifier | null {\n\tconst match = specifier.match(GITHUB_SPECIFIER_PATTERN);\n\n\tif (!match) {\n\t\treturn null;\n\t}\n\n\tconst [, owner, repo, pathWithSlash, ref] = match;\n\tif (!owner || !repo) {\n\t\treturn null;\n\t}\n\n\treturn {\n\t\towner,\n\t\trepo,\n\t\t// Remove leading slash from path\n\t\tpath: pathWithSlash ? pathWithSlash.slice(1) : undefined,\n\t\tref: ref || undefined,\n\t};\n}\n\n/**\n * Format a GitHubSpecifier back to string format.\n *\n * @param spec - The GitHub specifier object\n * @returns Formatted string (e.g., \"github:owner/repo/path@ref\")\n */\nexport function formatGitHubSpecifier(spec: GitHubSpecifier): string {\n\tlet result = `github:${spec.owner}/${spec.repo}`;\n\tif (spec.path) {\n\t\tresult += `/${spec.path}`;\n\t}\n\tif (spec.ref) {\n\t\tresult += `@${spec.ref}`;\n\t}\n\treturn result;\n}\n\n/**\n * Extract skill name from GitHub specifier.\n * Uses the last segment of the path, or the repo name if no path.\n *\n * @param spec - The GitHub specifier object\n * @returns Skill name (e.g., \"react-best-practices\" or \"prompts\")\n *\n * @example\n * ```typescript\n * getGitHubSkillName({ owner: \"vercel-labs\", repo: \"agent-skills\", path: \"skills/react\" })\n * // => \"react\"\n *\n * getGitHubSkillName({ owner: \"myorg\", repo: \"prompts\" })\n * // => \"prompts\"\n * ```\n */\nexport function getGitHubSkillName(spec: GitHubSpecifier): string {\n\tif (spec.path) {\n\t\tconst segments = spec.path.split(\"/\").filter(Boolean);\n\t\tconst lastSegment = segments[segments.length - 1];\n\t\tif (lastSegment) {\n\t\t\treturn lastSegment;\n\t\t}\n\t}\n\treturn spec.repo;\n}\n\n/**\n * Check if a string is a GitHub specifier\n */\nexport function isGitHubSpecifier(specifier: string): boolean {\n\treturn specifier.startsWith(\"github:\");\n}\n","/**\n * PSPM Types - CLI-specific types for PSPM\n *\n * This module contains types and utilities used by the PSPM CLI\n * that are not part of the API contract (SDK).\n */\n\n// Ignore file utilities\nexport {\n\tALWAYS_IGNORED,\n\tgetExcludeArgsForRsync,\n\tgetExcludeArgsForTar,\n\ttype IgnoreLoadResult,\n\tloadIgnorePatterns,\n\tparseIgnorePatterns,\n\treadIgnoreFile,\n} from \"./ignore\";\n\n// Integrity utilities\nexport { calculateIntegrity, verifyIntegrity } from \"./integrity\";\n// Lockfile types\n// Legacy lockfile types (deprecated, use Pspm* versions)\nexport {\n\ttype GitHubLockfileEntry,\n\ttype LocalLockfileEntry,\n\tPSPM_LOCKFILE_SCHEMA_URL,\n\ttype PspmLockfile,\n\ttype PspmLockfile as SkillLockfile,\n\ttype PspmLockfileEntry,\n\ttype PspmLockfileEntry as SkillLockfileEntry,\n} from \"./lockfile\";\n\n// Manifest types (pspm.json)\nexport {\n\ttype AgentConfig,\n\ttype BuiltInAgent,\n\tDEFAULT_MAIN,\n\tDEFAULT_SKILL_FILES,\n\ttype ManifestDetectionResult,\n\tnormalizeManifest,\n\tPSPM_SCHEMA_URL,\n\ttype PspmManifest,\n\ttype PspmManifestRequirements,\n\tvalidateManifest,\n} from \"./manifest\";\n// Resolver utilities\nexport {\n\tcomputeInstallOrder,\n\ttype DependencyGraph,\n\ttype DependencyNode,\n\tformatResolutionErrors,\n\tformatVersionConflicts,\n\tMAX_DEPENDENCY_DEPTH,\n\tprintResolutionErrors,\n\ttype ResolutionError,\n\ttype ResolutionErrorType,\n\ttype ResolutionResult,\n\ttype ResolverConfig,\n\tresolveRecursive,\n\ttopologicalSort,\n\ttype VersionConflict,\n} from \"./resolver\";\n// Skill specifier parsing\nexport {\n\tformatGitHubSpecifier,\n\ttype GitHubSpecifier,\n\tgenerateSkillIdentifier,\n\tgetGitHubSkillName,\n\tisGitHubSpecifier,\n\tparseGitHubSpecifier,\n\tparseSkillSpecifier,\n\ttype SkillSpecifier,\n} from \"./specifier\";\n// Version utilities\nexport {\n\tcompareVersions,\n\tfindHighestSatisfying,\n\tgetLatestVersion,\n\tisNewerVersion,\n\tnormalizeVersionRange,\n\trangesIntersect,\n\tresolveVersion,\n\tversionSatisfies,\n} from \"./version\";\n","/**\n * Agent configuration for skill symlinks.\n *\n * Defines where different AI coding agents expect skills to be located.\n */\n\nimport { checkbox } from \"@inquirer/prompts\";\nimport type { AgentConfig, BuiltInAgent } from \"./lib/index\";\n\n/**\n * Agent metadata for display purposes.\n */\nexport interface AgentInfo {\n\t/** Human-readable name for display */\n\tdisplayName: string;\n\t/** Skills directory path */\n\tskillsDir: string;\n}\n\n/**\n * Default agent configurations with display names.\n * These can be overridden in pspm.json under the \"agents\" key.\n */\nexport const AGENT_INFO: Record<BuiltInAgent, AgentInfo> = {\n\t\"claude-code\": {\n\t\tdisplayName: \"Claude Code\",\n\t\tskillsDir: \".claude/skills\",\n\t},\n\tcodex: {\n\t\tdisplayName: \"Codex\",\n\t\tskillsDir: \".codex/skills\",\n\t},\n\tcursor: {\n\t\tdisplayName: \"Cursor\",\n\t\tskillsDir: \".cursor/skills\",\n\t},\n\tgemini: {\n\t\tdisplayName: \"Gemini CLI\",\n\t\tskillsDir: \".gemini/skills\",\n\t},\n\tkiro: {\n\t\tdisplayName: \"Kiro CLI\",\n\t\tskillsDir: \".kiro/skills\",\n\t},\n\topencode: {\n\t\tdisplayName: \"OpenCode\",\n\t\tskillsDir: \".opencode/skills\",\n\t},\n};\n\n/**\n * Default agent configurations (AgentConfig format).\n */\nexport const DEFAULT_AGENT_CONFIGS: Record<BuiltInAgent, AgentConfig> = {\n\t\"claude-code\": { skillsDir: AGENT_INFO[\"claude-code\"].skillsDir },\n\tcodex: { skillsDir: AGENT_INFO.codex.skillsDir },\n\tcursor: { skillsDir: AGENT_INFO.cursor.skillsDir },\n\tgemini: { skillsDir: AGENT_INFO.gemini.skillsDir },\n\tkiro: { skillsDir: AGENT_INFO.kiro.skillsDir },\n\topencode: { skillsDir: AGENT_INFO.opencode.skillsDir },\n};\n\n/**\n * All built-in agent names in display order.\n */\nexport const ALL_AGENTS: BuiltInAgent[] = [\n\t\"claude-code\",\n\t\"codex\",\n\t\"cursor\",\n\t\"gemini\",\n\t\"kiro\",\n\t\"opencode\",\n];\n\n/**\n * Resolve agent configuration by name.\n *\n * @param name - Agent name (built-in or custom)\n * @param overrides - Custom agent configurations from pspm.json\n * @returns Agent configuration or null if not found\n *\n * @example\n * ```typescript\n * resolveAgentConfig(\"claude-code\")\n * // => { skillsDir: \".claude/skills\" }\n *\n * resolveAgentConfig(\"my-custom\", { \"my-custom\": { skillsDir: \".myagent/prompts\" } })\n * // => { skillsDir: \".myagent/prompts\" }\n * ```\n */\nexport function resolveAgentConfig(\n\tname: string,\n\toverrides?: Record<string, AgentConfig>,\n): AgentConfig | null {\n\t// Check overrides first\n\tif (overrides?.[name]) {\n\t\treturn overrides[name];\n\t}\n\n\t// Check built-in defaults\n\tif (name in DEFAULT_AGENT_CONFIGS) {\n\t\treturn DEFAULT_AGENT_CONFIGS[name as BuiltInAgent];\n\t}\n\n\treturn null;\n}\n\n/**\n * Parse comma-separated agent names from CLI argument.\n *\n * @param agentArg - Comma-separated agent names (e.g., \"claude-code,cursor\")\n * @returns Array of agent names, or [\"none\"] if skipping symlinks\n *\n * @example\n * ```typescript\n * parseAgentArg(\"claude-code,cursor\")\n * // => [\"claude-code\", \"cursor\"]\n *\n * parseAgentArg(\"none\")\n * // => [\"none\"]\n *\n * parseAgentArg(undefined)\n * // => [\"claude-code\", \"codex\", \"cursor\", \"gemini\", \"kiro\", \"opencode\"]\n * ```\n */\nexport function parseAgentArg(agentArg?: string): string[] {\n\tif (!agentArg) {\n\t\treturn [...ALL_AGENTS];\n\t}\n\n\tif (agentArg === \"none\") {\n\t\treturn [\"none\"];\n\t}\n\n\treturn agentArg\n\t\t.split(\",\")\n\t\t.map((a) => a.trim())\n\t\t.filter(Boolean);\n}\n\n/**\n * Get all available agent names (built-in + custom).\n */\nexport function getAvailableAgents(\n\toverrides?: Record<string, AgentConfig>,\n): string[] {\n\tconst builtIn = Object.keys(DEFAULT_AGENT_CONFIGS);\n\tconst custom = overrides ? Object.keys(overrides) : [];\n\treturn [...new Set([...builtIn, ...custom])];\n}\n\n/**\n * Prompt user to select which agents to install skills to.\n *\n * @returns Array of selected agent names\n */\nexport async function promptForAgents(): Promise<string[]> {\n\tconst choices = ALL_AGENTS.map((agent) => ({\n\t\tname: `${AGENT_INFO[agent].displayName} (${AGENT_INFO[agent].skillsDir})`,\n\t\tvalue: agent,\n\t\tchecked: true, // All selected by default\n\t}));\n\n\tconst selected = await checkbox({\n\t\tmessage: \"Select agents to install skills to\",\n\t\tchoices,\n\t});\n\n\tif (selected.length === 0) {\n\t\treturn [\"none\"];\n\t}\n\n\treturn selected;\n}\n","/**\n * GitHub package download and extraction support.\n *\n * Downloads skill packages from GitHub repositories and extracts them\n * to .pspm/skills/_github/{owner}/{repo}/{path}/\n */\n\nimport { cp, lstat, mkdir, readdir, rm, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { GitHubSpecifier } from \"./lib/index\";\nimport { calculateIntegrity } from \"./lib/index\";\n\n/**\n * Result of downloading a GitHub package.\n */\nexport interface GitHubDownloadResult {\n\t/** Downloaded tarball as buffer */\n\tbuffer: Buffer;\n\t/** Resolved commit SHA */\n\tcommit: string;\n\t/** Integrity hash (sha256-...) */\n\tintegrity: string;\n}\n\n/**\n * Error thrown when GitHub API rate limit is hit.\n */\nexport class GitHubRateLimitError extends Error {\n\tconstructor() {\n\t\tsuper(\n\t\t\t\"GitHub API rate limit exceeded. Set GITHUB_TOKEN environment variable for higher limits.\",\n\t\t);\n\t\tthis.name = \"GitHubRateLimitError\";\n\t}\n}\n\n/**\n * Error thrown when GitHub repository/ref is not found.\n */\nexport class GitHubNotFoundError extends Error {\n\tconstructor(spec: GitHubSpecifier) {\n\t\tconst path = spec.path ? `/${spec.path}` : \"\";\n\t\tconst ref = spec.ref ? `@${spec.ref}` : \"\";\n\t\tsuper(\n\t\t\t`GitHub repository not found: ${spec.owner}/${spec.repo}${path}${ref}`,\n\t\t);\n\t\tthis.name = \"GitHubNotFoundError\";\n\t}\n}\n\n/**\n * Error thrown when the specified path doesn't exist in the repository.\n */\nexport class GitHubPathNotFoundError extends Error {\n\tconstructor(spec: GitHubSpecifier, availablePaths?: string[]) {\n\t\tconst pathInfo = availablePaths?.length\n\t\t\t? `\\nAvailable paths in repository root:\\n ${availablePaths.join(\"\\n \")}`\n\t\t\t: \"\";\n\t\tsuper(\n\t\t\t`Path \"${spec.path}\" not found in ${spec.owner}/${spec.repo}${pathInfo}`,\n\t\t);\n\t\tthis.name = \"GitHubPathNotFoundError\";\n\t}\n}\n\n/**\n * Get GitHub API headers, including authentication if available.\n */\nfunction getGitHubHeaders(): Record<string, string> {\n\tconst headers: Record<string, string> = {\n\t\tAccept: \"application/vnd.github+json\",\n\t\t\"X-GitHub-Api-Version\": \"2022-11-28\",\n\t\t\"User-Agent\": \"pspm-cli\",\n\t};\n\n\tconst token = process.env.GITHUB_TOKEN;\n\tif (token) {\n\t\theaders.Authorization = `Bearer ${token}`;\n\t}\n\n\treturn headers;\n}\n\n/**\n * Resolve a Git ref (branch/tag) to a commit SHA.\n *\n * @param owner - Repository owner\n * @param repo - Repository name\n * @param ref - Branch, tag, or commit SHA (defaults to default branch)\n * @returns Resolved commit SHA\n */\nexport async function resolveGitHubRef(\n\towner: string,\n\trepo: string,\n\tref?: string,\n): Promise<string> {\n\tconst headers = getGitHubHeaders();\n\n\t// Use a local variable to avoid parameter reassignment\n\tlet resolvedRef = ref;\n\n\t// If no ref specified, get the default branch first\n\tif (!resolvedRef || resolvedRef === \"latest\") {\n\t\tconst repoUrl = `https://api.github.com/repos/${owner}/${repo}`;\n\t\tconst repoResponse = await fetch(repoUrl, { headers });\n\n\t\tif (repoResponse.status === 404) {\n\t\t\tthrow new GitHubNotFoundError({ owner, repo });\n\t\t}\n\n\t\tif (repoResponse.status === 403) {\n\t\t\tconst remaining = repoResponse.headers.get(\"x-ratelimit-remaining\");\n\t\t\tif (remaining === \"0\") {\n\t\t\t\tthrow new GitHubRateLimitError();\n\t\t\t}\n\t\t}\n\n\t\tif (!repoResponse.ok) {\n\t\t\tthrow new Error(`GitHub API error: ${repoResponse.status}`);\n\t\t}\n\n\t\tconst repoData = (await repoResponse.json()) as { default_branch: string };\n\t\tresolvedRef = repoData.default_branch;\n\t}\n\n\t// Get the commit SHA for the ref\n\tconst commitUrl = `https://api.github.com/repos/${owner}/${repo}/commits/${resolvedRef}`;\n\tconst commitResponse = await fetch(commitUrl, { headers });\n\n\tif (commitResponse.status === 404) {\n\t\tthrow new GitHubNotFoundError({ owner, repo, ref });\n\t}\n\n\tif (commitResponse.status === 403) {\n\t\tconst remaining = commitResponse.headers.get(\"x-ratelimit-remaining\");\n\t\tif (remaining === \"0\") {\n\t\t\tthrow new GitHubRateLimitError();\n\t\t}\n\t}\n\n\tif (!commitResponse.ok) {\n\t\tthrow new Error(`GitHub API error: ${commitResponse.status}`);\n\t}\n\n\tconst commitData = (await commitResponse.json()) as { sha: string };\n\treturn commitData.sha;\n}\n\n/**\n * Download a GitHub repository tarball.\n *\n * @param spec - GitHub specifier with owner, repo, and optional ref\n * @returns Download result with buffer, commit SHA, and integrity hash\n */\nexport async function downloadGitHubPackage(\n\tspec: GitHubSpecifier,\n): Promise<GitHubDownloadResult> {\n\tconst headers = getGitHubHeaders();\n\n\t// Resolve the ref to a commit SHA\n\tconst commit = await resolveGitHubRef(spec.owner, spec.repo, spec.ref);\n\n\t// Download the tarball\n\tconst tarballUrl = `https://api.github.com/repos/${spec.owner}/${spec.repo}/tarball/${commit}`;\n\tconst response = await fetch(tarballUrl, {\n\t\theaders,\n\t\tredirect: \"follow\",\n\t});\n\n\tif (response.status === 404) {\n\t\tthrow new GitHubNotFoundError(spec);\n\t}\n\n\tif (response.status === 403) {\n\t\tconst remaining = response.headers.get(\"x-ratelimit-remaining\");\n\t\tif (remaining === \"0\") {\n\t\t\tthrow new GitHubRateLimitError();\n\t\t}\n\t}\n\n\tif (!response.ok) {\n\t\tthrow new Error(`Failed to download GitHub tarball: ${response.status}`);\n\t}\n\n\tconst buffer = Buffer.from(await response.arrayBuffer());\n\tconst integrity = calculateIntegrity(buffer);\n\n\treturn { buffer, commit, integrity };\n}\n\n/**\n * Extract a GitHub package to the skills directory.\n *\n * For subpath specifiers, extracts only the specified subdirectory.\n * Full path structure is preserved under .pspm/skills/_github/.\n *\n * @param spec - GitHub specifier\n * @param buffer - Downloaded tarball buffer\n * @param skillsDir - Base skills directory (.pspm/skills)\n * @returns Path to extracted skill (relative to project root)\n */\nexport async function extractGitHubPackage(\n\tspec: GitHubSpecifier,\n\tbuffer: Buffer,\n\tskillsDir: string,\n): Promise<string> {\n\t// Determine destination path\n\tconst destPath = spec.path\n\t\t? join(skillsDir, \"_github\", spec.owner, spec.repo, spec.path)\n\t\t: join(skillsDir, \"_github\", spec.owner, spec.repo);\n\n\t// Create a temp directory for extraction\n\tconst tempDir = join(skillsDir, \"_github\", \".temp\", `${Date.now()}`);\n\tawait mkdir(tempDir, { recursive: true });\n\n\tconst tempFile = join(tempDir, \"archive.tgz\");\n\n\ttry {\n\t\t// Write tarball to temp file\n\t\tawait writeFile(tempFile, buffer);\n\n\t\t// Extract tarball\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\tawait execAsync(`tar -xzf \"${tempFile}\" -C \"${tempDir}\"`);\n\n\t\t// Find the extracted directory (GitHub tarballs have a top-level dir like \"owner-repo-sha\")\n\t\tconst entries = await readdir(tempDir);\n\t\tconst extractedDir = entries.find(\n\t\t\t(e) => e !== \"archive.tgz\" && !e.startsWith(\".\"),\n\t\t);\n\n\t\tif (!extractedDir) {\n\t\t\tthrow new Error(\"Failed to find extracted directory in tarball\");\n\t\t}\n\n\t\tconst sourcePath = join(tempDir, extractedDir);\n\n\t\t// Determine what to copy - either a subpath or the entire repo\n\t\tconst copySource = spec.path ? join(sourcePath, spec.path) : sourcePath;\n\n\t\t// If a subpath is specified, verify it exists in the repo\n\t\tif (spec.path) {\n\t\t\tconst pathExists = await lstat(copySource).catch(() => null);\n\t\t\tif (!pathExists) {\n\t\t\t\t// List available directories in repo root for helpful error message\n\t\t\t\tconst rootEntries = await readdir(sourcePath);\n\t\t\t\tconst dirs = [];\n\t\t\t\tfor (const entry of rootEntries) {\n\t\t\t\t\tconst stat = await lstat(join(sourcePath, entry)).catch(() => null);\n\t\t\t\t\tif (stat?.isDirectory() && !entry.startsWith(\".\")) {\n\t\t\t\t\t\tdirs.push(entry);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tthrow new GitHubPathNotFoundError(spec, dirs);\n\t\t\t}\n\t\t}\n\n\t\t// Remove existing destination and create fresh\n\t\tawait rm(destPath, { recursive: true, force: true });\n\t\tawait mkdir(destPath, { recursive: true });\n\n\t\t// Copy the contents\n\t\tawait cp(copySource, destPath, { recursive: true });\n\n\t\t// Return the relative path from project root\n\t\treturn spec.path\n\t\t\t? `.pspm/skills/_github/${spec.owner}/${spec.repo}/${spec.path}`\n\t\t\t: `.pspm/skills/_github/${spec.owner}/${spec.repo}`;\n\t} finally {\n\t\t// Clean up temp directory\n\t\tawait rm(tempDir, { recursive: true, force: true });\n\t}\n}\n\n/**\n * Get a short display name for a GitHub package.\n *\n * @param spec - GitHub specifier\n * @param commit - Resolved commit SHA (first 7 chars will be shown)\n * @returns Display string like \"github:owner/repo/path (ref@abc1234)\"\n */\nexport function getGitHubDisplayName(\n\tspec: GitHubSpecifier,\n\tcommit?: string,\n): string {\n\tlet name = `github:${spec.owner}/${spec.repo}`;\n\tif (spec.path) {\n\t\tname += `/${spec.path}`;\n\t}\n\n\tif (spec.ref || commit) {\n\t\tconst ref = spec.ref || \"HEAD\";\n\t\tconst shortCommit = commit ? commit.slice(0, 7) : \"\";\n\t\tname += ` (${ref}${shortCommit ? `@${shortCommit}` : \"\"})`;\n\t}\n\n\treturn name;\n}\n","import { mkdir, readFile, stat, writeFile } from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\nimport {\n\tgetLegacyLockfilePath,\n\tgetLockfilePath,\n\tgetRegistryUrl,\n} from \"./config\";\nimport {\n\ttype GitHubLockfileEntry,\n\ttype LocalLockfileEntry,\n\tPSPM_LOCKFILE_SCHEMA_URL,\n\ttype PspmLockfile,\n\ttype PspmLockfileEntry,\n} from \"./lib/index\";\n\n// Re-export types for backward compatibility\nexport type {\n\tGitHubLockfileEntry,\n\tLocalLockfileEntry,\n\tPspmLockfile,\n\tPspmLockfileEntry,\n};\n\n/**\n * Check if legacy lockfile exists (skill-lock.json)\n */\nasync function hasLegacyLockfile(): Promise<boolean> {\n\ttry {\n\t\tawait stat(getLegacyLockfilePath());\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\n/**\n * Migrate legacy lockfile (skill-lock.json) to new format (pspm-lock.json)\n * Returns true if migration was performed\n */\nexport async function migrateLockfileIfNeeded(): Promise<boolean> {\n\tconst legacyPath = getLegacyLockfilePath();\n\tconst newPath = getLockfilePath();\n\n\t// Check if legacy exists and new doesn't\n\ttry {\n\t\tawait stat(legacyPath);\n\t} catch {\n\t\t// No legacy file, nothing to migrate\n\t\treturn false;\n\t}\n\n\ttry {\n\t\tawait stat(newPath);\n\t\t// New file already exists, don't overwrite\n\t\treturn false;\n\t} catch {\n\t\t// New file doesn't exist, migrate\n\t}\n\n\ttry {\n\t\tconst content = await readFile(legacyPath, \"utf-8\");\n\t\tconst oldLockfile = JSON.parse(content) as PspmLockfile;\n\n\t\t// Convert v1 to v2 format\n\t\tconst newLockfile: PspmLockfile = {\n\t\t\tlockfileVersion: 2,\n\t\t\tregistryUrl: oldLockfile.registryUrl,\n\t\t\tpackages: oldLockfile.skills ?? {},\n\t\t};\n\n\t\tawait writeFile(newPath, `${JSON.stringify(newLockfile, null, 2)}\\n`);\n\t\tconsole.log(\"Migrated lockfile: skill-lock.json → pspm-lock.json\");\n\n\t\t// Keep the old file for safety (user can delete it)\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\n/**\n * Read the lockfile, automatically checking for legacy format\n */\nexport async function readLockfile(): Promise<PspmLockfile | null> {\n\tconst lockfilePath = getLockfilePath();\n\n\ttry {\n\t\tconst content = await readFile(lockfilePath, \"utf-8\");\n\t\tconst lockfile = JSON.parse(content) as PspmLockfile;\n\n\t\t// Normalize v1 -> v2 in memory (skills -> packages)\n\t\tif (\n\t\t\tlockfile.lockfileVersion === 1 &&\n\t\t\tlockfile.skills &&\n\t\t\t!lockfile.packages\n\t\t) {\n\t\t\treturn {\n\t\t\t\t...lockfile,\n\t\t\t\tlockfileVersion: 2,\n\t\t\t\tpackages: lockfile.skills,\n\t\t\t};\n\t\t}\n\n\t\treturn lockfile;\n\t} catch {\n\t\t// Try legacy path\n\t\tif (await hasLegacyLockfile()) {\n\t\t\ttry {\n\t\t\t\tconst content = await readFile(getLegacyLockfilePath(), \"utf-8\");\n\t\t\t\tconst legacyLockfile = JSON.parse(content) as PspmLockfile;\n\t\t\t\t// Return normalized v2 format\n\t\t\t\treturn {\n\t\t\t\t\tlockfileVersion: 2,\n\t\t\t\t\tregistryUrl: legacyLockfile.registryUrl,\n\t\t\t\t\tpackages: legacyLockfile.skills ?? {},\n\t\t\t\t};\n\t\t\t} catch {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n}\n\n/**\n * Write the lockfile (v4 format if any package has dependencies, otherwise v3)\n */\nexport async function writeLockfile(lockfile: PspmLockfile): Promise<void> {\n\tconst lockfilePath = getLockfilePath();\n\tawait mkdir(dirname(lockfilePath), { recursive: true });\n\n\tconst packages = lockfile.packages ?? lockfile.skills ?? {};\n\n\t// Check if any package has dependencies to determine version\n\tconst hasDependencies = Object.values(packages).some(\n\t\t(pkg) => pkg.dependencies && Object.keys(pkg.dependencies).length > 0,\n\t);\n\tconst version = hasDependencies ? 4 : 3;\n\n\tconst normalized: PspmLockfile = {\n\t\t$schema: PSPM_LOCKFILE_SCHEMA_URL,\n\t\tlockfileVersion: version,\n\t\tregistryUrl: lockfile.registryUrl,\n\t\tpackages,\n\t};\n\n\t// Only include githubPackages if there are entries\n\tif (\n\t\tlockfile.githubPackages &&\n\t\tObject.keys(lockfile.githubPackages).length > 0\n\t) {\n\t\tnormalized.githubPackages = lockfile.githubPackages;\n\t}\n\n\t// Only include localPackages if there are entries\n\tif (\n\t\tlockfile.localPackages &&\n\t\tObject.keys(lockfile.localPackages).length > 0\n\t) {\n\t\tnormalized.localPackages = lockfile.localPackages;\n\t}\n\n\tawait writeFile(lockfilePath, `${JSON.stringify(normalized, null, 2)}\\n`);\n}\n\n/**\n * Create a new empty lockfile (v4 format)\n */\nexport async function createEmptyLockfile(): Promise<PspmLockfile> {\n\tconst registryUrl = await getRegistryUrl();\n\treturn {\n\t\tlockfileVersion: 4,\n\t\tregistryUrl,\n\t\tpackages: {},\n\t};\n}\n\n/**\n * Get packages from lockfile (handles both v1 and v2)\n */\nfunction getPackages(\n\tlockfile: PspmLockfile,\n): Record<string, PspmLockfileEntry> {\n\treturn lockfile.packages ?? lockfile.skills ?? {};\n}\n\n/**\n * Add a skill to the lockfile\n */\nexport async function addToLockfile(\n\tfullName: string,\n\tentry: PspmLockfileEntry,\n): Promise<void> {\n\tlet lockfile = await readLockfile();\n\tif (!lockfile) {\n\t\tlockfile = await createEmptyLockfile();\n\t}\n\n\tconst packages = getPackages(lockfile);\n\tpackages[fullName] = entry;\n\tlockfile.packages = packages;\n\n\tawait writeLockfile(lockfile);\n}\n\n/**\n * Add a skill to the lockfile with dependencies (v4 format)\n */\nexport async function addToLockfileWithDeps(\n\tfullName: string,\n\tentry: PspmLockfileEntry,\n\tdependencies?: Record<string, string>,\n): Promise<void> {\n\tlet lockfile = await readLockfile();\n\tif (!lockfile) {\n\t\tlockfile = await createEmptyLockfile();\n\t}\n\n\tconst packages = getPackages(lockfile);\n\tconst entryWithDeps = { ...entry };\n\tif (dependencies && Object.keys(dependencies).length > 0) {\n\t\tentryWithDeps.dependencies = dependencies;\n\t}\n\tpackages[fullName] = entryWithDeps;\n\tlockfile.packages = packages;\n\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) {\n\t\treturn false;\n\t}\n\n\tconst packages = getPackages(lockfile);\n\tif (!packages[fullName]) {\n\t\treturn false;\n\t}\n\n\tdelete packages[fullName];\n\tlockfile.packages = packages;\n\tawait writeLockfile(lockfile);\n\treturn true;\n}\n\n/**\n * List all skills in the lockfile\n */\nexport async function listLockfileSkills(): Promise<\n\tArray<{ name: string; entry: PspmLockfileEntry }>\n> {\n\tconst lockfile = await readLockfile();\n\tif (!lockfile) {\n\t\treturn [];\n\t}\n\n\tconst packages = getPackages(lockfile);\n\treturn Object.entries(packages).map(([name, entry]) => ({\n\t\tname,\n\t\tentry: entry as PspmLockfileEntry,\n\t}));\n}\n\n// =============================================================================\n// GitHub Package Support\n// =============================================================================\n\n/**\n * Add a GitHub package to the lockfile\n */\nexport async function addGitHubToLockfile(\n\tspecifier: string,\n\tentry: GitHubLockfileEntry,\n): Promise<void> {\n\tlet lockfile = await readLockfile();\n\tif (!lockfile) {\n\t\tlockfile = await createEmptyLockfile();\n\t}\n\n\tif (!lockfile.githubPackages) {\n\t\tlockfile.githubPackages = {};\n\t}\n\n\tlockfile.githubPackages[specifier] = entry;\n\tawait writeLockfile(lockfile);\n}\n\n/**\n * Remove a GitHub package from the lockfile\n */\nexport async function removeGitHubFromLockfile(\n\tspecifier: string,\n): Promise<boolean> {\n\tconst lockfile = await readLockfile();\n\tif (!lockfile?.githubPackages?.[specifier]) {\n\t\treturn false;\n\t}\n\n\tdelete lockfile.githubPackages[specifier];\n\tawait writeLockfile(lockfile);\n\treturn true;\n}\n\n/**\n * List all GitHub packages in the lockfile\n */\nexport async function listLockfileGitHubPackages(): Promise<\n\tArray<{ specifier: string; entry: GitHubLockfileEntry }>\n> {\n\tconst lockfile = await readLockfile();\n\tif (!lockfile?.githubPackages) {\n\t\treturn [];\n\t}\n\n\treturn Object.entries(lockfile.githubPackages).map(([specifier, entry]) => ({\n\t\tspecifier,\n\t\tentry: entry as GitHubLockfileEntry,\n\t}));\n}\n\n// =============================================================================\n// Local Package Support\n// =============================================================================\n\n/**\n * Add a local package to the lockfile\n */\nexport async function addLocalToLockfile(\n\tspecifier: string,\n\tentry: LocalLockfileEntry,\n): Promise<void> {\n\tlet lockfile = await readLockfile();\n\tif (!lockfile) {\n\t\tlockfile = await createEmptyLockfile();\n\t}\n\n\tif (!lockfile.localPackages) {\n\t\tlockfile.localPackages = {};\n\t}\n\n\tlockfile.localPackages[specifier] = entry;\n\tawait writeLockfile(lockfile);\n}\n\n/**\n * Remove a local package from the lockfile\n */\nexport async function removeLocalFromLockfile(\n\tspecifier: string,\n): Promise<boolean> {\n\tconst lockfile = await readLockfile();\n\tif (!lockfile?.localPackages?.[specifier]) {\n\t\treturn false;\n\t}\n\n\tdelete lockfile.localPackages[specifier];\n\tawait writeLockfile(lockfile);\n\treturn true;\n}\n\n/**\n * List all local packages in the lockfile\n */\nexport async function listLockfileLocalPackages(): Promise<\n\tArray<{ specifier: string; entry: LocalLockfileEntry }>\n> {\n\tconst lockfile = await readLockfile();\n\tif (!lockfile?.localPackages) {\n\t\treturn [];\n\t}\n\n\treturn Object.entries(lockfile.localPackages).map(([specifier, entry]) => ({\n\t\tspecifier,\n\t\tentry: entry as LocalLockfileEntry,\n\t}));\n}\n","import { readFile, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { PspmManifest } from \"./lib/index\";\n\n/**\n * Get the manifest file path (pspm.json in current directory)\n */\nexport function getManifestPath(): string {\n\treturn join(process.cwd(), \"pspm.json\");\n}\n\n/**\n * Read the manifest file (pspm.json)\n * Returns null if file doesn't exist\n */\nexport async function readManifest(): Promise<PspmManifest | null> {\n\ttry {\n\t\tconst content = await readFile(getManifestPath(), \"utf-8\");\n\t\treturn JSON.parse(content) as PspmManifest;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\n/**\n * Write the manifest file (pspm.json)\n */\nexport async function writeManifest(manifest: PspmManifest): Promise<void> {\n\tconst content = JSON.stringify(manifest, null, 2);\n\tawait writeFile(getManifestPath(), `${content}\\n`);\n}\n\n/**\n * Create a minimal manifest with just dependencies\n * Similar to how npm creates package.json with just dependencies when you run `npm add`\n * This is for consuming packages, not publishing - so only dependencies are needed\n */\nexport async function createMinimalManifest(): Promise<PspmManifest> {\n\treturn {\n\t\tdependencies: {},\n\t} as PspmManifest;\n}\n\n/**\n * Ensure manifest exists, creating a minimal one if needed\n * Returns the manifest (existing or newly created)\n */\nexport async function ensureManifest(): Promise<PspmManifest> {\n\tlet manifest = await readManifest();\n\n\tif (!manifest) {\n\t\tmanifest = await createMinimalManifest();\n\t\tawait writeManifest(manifest);\n\t}\n\n\treturn manifest;\n}\n\n/**\n * Add a dependency to the manifest\n * Creates the manifest if it doesn't exist\n *\n * @param skillName - Full skill name (e.g., \"@user/alice/my-skill\")\n * @param versionRange - Version range to save (e.g., \"^1.0.0\")\n */\nexport async function addDependency(\n\tskillName: string,\n\tversionRange: string,\n): Promise<void> {\n\tconst manifest = await ensureManifest();\n\n\t// Initialize dependencies if not present\n\tif (!manifest.dependencies) {\n\t\tmanifest.dependencies = {};\n\t}\n\n\t// Add or update the dependency\n\tmanifest.dependencies[skillName] = versionRange;\n\n\tawait writeManifest(manifest);\n}\n\n/**\n * Remove a dependency from the manifest\n *\n * @param skillName - Full skill name (e.g., \"@user/alice/my-skill\")\n * @returns true if dependency was removed, false if it didn't exist\n */\nexport async function removeDependency(skillName: string): Promise<boolean> {\n\tconst manifest = await readManifest();\n\n\tif (!manifest?.dependencies?.[skillName]) {\n\t\treturn false;\n\t}\n\n\tdelete manifest.dependencies[skillName];\n\tawait writeManifest(manifest);\n\treturn true;\n}\n\n/**\n * Get all dependencies from the manifest\n * Returns empty object if manifest doesn't exist or has no dependencies\n */\nexport async function getDependencies(): Promise<Record<string, string>> {\n\tconst manifest = await readManifest();\n\treturn manifest?.dependencies ?? {};\n}\n\n/**\n * Get all GitHub dependencies from the manifest\n * Returns empty object if manifest doesn't exist or has no GitHub dependencies\n */\nexport async function getGitHubDependencies(): Promise<Record<string, string>> {\n\tconst manifest = await readManifest();\n\treturn manifest?.githubDependencies ?? {};\n}\n\n/**\n * Add a GitHub dependency to the manifest\n * Creates the manifest if it doesn't exist\n *\n * @param specifier - GitHub specifier (e.g., \"github:owner/repo/path\")\n * @param ref - Git ref (branch, tag, or \"latest\")\n */\nexport async function addGitHubDependency(\n\tspecifier: string,\n\tref: string,\n): Promise<void> {\n\tconst manifest = await ensureManifest();\n\n\t// Initialize githubDependencies if not present\n\tif (!manifest.githubDependencies) {\n\t\tmanifest.githubDependencies = {};\n\t}\n\n\t// Add or update the dependency\n\tmanifest.githubDependencies[specifier] = ref;\n\n\tawait writeManifest(manifest);\n}\n\n/**\n * Remove a GitHub dependency from the manifest\n *\n * @param specifier - GitHub specifier (e.g., \"github:owner/repo/path\")\n * @returns true if dependency was removed, false if it didn't exist\n */\nexport async function removeGitHubDependency(\n\tspecifier: string,\n): Promise<boolean> {\n\tconst manifest = await readManifest();\n\n\tif (!manifest?.githubDependencies?.[specifier]) {\n\t\treturn false;\n\t}\n\n\tdelete manifest.githubDependencies[specifier];\n\tawait writeManifest(manifest);\n\treturn true;\n}\n\n// =============================================================================\n// Local Dependency Support\n// =============================================================================\n\n/**\n * Get all local dependencies from the manifest\n * Returns empty object if manifest doesn't exist or has no local dependencies\n */\nexport async function getLocalDependencies(): Promise<Record<string, string>> {\n\tconst manifest = await readManifest();\n\treturn manifest?.localDependencies ?? {};\n}\n\n/**\n * Add a local dependency to the manifest\n * Creates the manifest if it doesn't exist\n *\n * @param specifier - Local specifier (e.g., \"file:../my-skill\")\n * @param version - Always \"*\" for local packages\n */\nexport async function addLocalDependency(\n\tspecifier: string,\n\tversion = \"*\",\n): Promise<void> {\n\tconst manifest = await ensureManifest();\n\n\t// Initialize localDependencies if not present\n\tif (!manifest.localDependencies) {\n\t\tmanifest.localDependencies = {};\n\t}\n\n\t// Add or update the dependency\n\tmanifest.localDependencies[specifier] = version;\n\n\tawait writeManifest(manifest);\n}\n\n/**\n * Remove a local dependency from the manifest\n *\n * @param specifier - Local specifier (e.g., \"file:../my-skill\")\n * @returns true if dependency was removed, false if it didn't exist\n */\nexport async function removeLocalDependency(\n\tspecifier: string,\n): Promise<boolean> {\n\tconst manifest = await readManifest();\n\n\tif (!manifest?.localDependencies?.[specifier]) {\n\t\treturn false;\n\t}\n\n\tdelete manifest.localDependencies[specifier];\n\tawait writeManifest(manifest);\n\treturn true;\n}\n","/**\n * Symlink management for agent skill directories.\n *\n * Creates relative symlinks from agent-specific directories (e.g., .claude/skills/)\n * to the central .pspm/skills/ directory for portability.\n */\n\nimport { lstat, mkdir, readlink, rm, symlink } from \"node:fs/promises\";\nimport { dirname, join, relative } from \"node:path\";\nimport { resolveAgentConfig } from \"./agents\";\nimport type { AgentConfig } from \"./lib/index\";\n\n/**\n * Options for creating agent symlinks.\n */\nexport interface CreateSymlinksOptions {\n\t/** Agent names to create symlinks for */\n\tagents: string[];\n\t/** Project root directory */\n\tprojectRoot: string;\n\t/** Custom agent configuration overrides from pspm.json */\n\tagentConfigs?: Record<string, AgentConfig>;\n}\n\n/**\n * Information about an installed skill for symlinking.\n */\nexport interface SkillInfo {\n\t/** Skill name (used as symlink name) */\n\tname: string;\n\t/** Path to skill within .pspm/skills/ (relative to project root) */\n\tsourcePath: string;\n}\n\n/**\n * Create symlinks for all skills to specified agent directories.\n *\n * @param skills - List of skills to create symlinks for\n * @param options - Symlink creation options\n */\nexport async function createAgentSymlinks(\n\tskills: SkillInfo[],\n\toptions: CreateSymlinksOptions,\n): Promise<void> {\n\tconst { agents, projectRoot, agentConfigs } = options;\n\n\t// Skip if \"none\" agent\n\tif (agents.length === 1 && agents[0] === \"none\") {\n\t\treturn;\n\t}\n\n\tfor (const agentName of agents) {\n\t\tconst config = resolveAgentConfig(agentName, agentConfigs);\n\n\t\tif (!config) {\n\t\t\tconsole.warn(`Warning: Unknown agent \"${agentName}\", skipping symlinks`);\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst agentSkillsDir = join(projectRoot, config.skillsDir);\n\n\t\t// Create agent skills directory\n\t\tawait mkdir(agentSkillsDir, { recursive: true });\n\n\t\tfor (const skill of skills) {\n\t\t\tconst symlinkPath = join(agentSkillsDir, skill.name);\n\t\t\tconst targetPath = join(projectRoot, skill.sourcePath);\n\n\t\t\t// Calculate relative path from symlink location to target\n\t\t\tconst relativeTarget = relative(dirname(symlinkPath), targetPath);\n\n\t\t\tawait createSymlink(symlinkPath, relativeTarget, skill.name);\n\t\t}\n\t}\n}\n\n/**\n * Create a single symlink, handling existing files/symlinks.\n *\n * @param symlinkPath - Absolute path where symlink will be created\n * @param target - Relative path to target (relative to symlink's parent dir)\n * @param skillName - Name for logging\n */\nasync function createSymlink(\n\tsymlinkPath: string,\n\ttarget: string,\n\tskillName: string,\n): Promise<void> {\n\ttry {\n\t\t// Check if something exists at the symlink path\n\t\tconst stats = await lstat(symlinkPath).catch(() => null);\n\n\t\tif (stats) {\n\t\t\tif (stats.isSymbolicLink()) {\n\t\t\t\t// Check if it points to the correct target\n\t\t\t\tconst existingTarget = await readlink(symlinkPath);\n\t\t\t\tif (existingTarget === target) {\n\t\t\t\t\t// Already correct, nothing to do\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t// Remove incorrect symlink\n\t\t\t\tawait rm(symlinkPath);\n\t\t\t} else {\n\t\t\t\t// Regular file or directory exists - warn and skip\n\t\t\t\tconsole.warn(\n\t\t\t\t\t`Warning: File exists at symlink path for \"${skillName}\", skipping: ${symlinkPath}`,\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\t// Create the symlink\n\t\tawait symlink(target, symlinkPath);\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\tconsole.warn(\n\t\t\t`Warning: Failed to create symlink for \"${skillName}\": ${message}`,\n\t\t);\n\t}\n}\n\n/**\n * Remove symlinks for a skill from all agent directories.\n *\n * @param skillName - Name of the skill (symlink name)\n * @param options - Symlink options\n */\nexport async function removeAgentSymlinks(\n\tskillName: string,\n\toptions: CreateSymlinksOptions,\n): Promise<void> {\n\tconst { agents, projectRoot, agentConfigs } = options;\n\n\t// Skip if \"none\" agent\n\tif (agents.length === 1 && agents[0] === \"none\") {\n\t\treturn;\n\t}\n\n\tfor (const agentName of agents) {\n\t\tconst config = resolveAgentConfig(agentName, agentConfigs);\n\n\t\tif (!config) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst symlinkPath = join(projectRoot, config.skillsDir, skillName);\n\n\t\ttry {\n\t\t\tconst stats = await lstat(symlinkPath).catch(() => null);\n\n\t\t\tif (stats?.isSymbolicLink()) {\n\t\t\t\tawait rm(symlinkPath);\n\t\t\t}\n\t\t} catch {\n\t\t\t// Ignore errors - symlink may not exist\n\t\t}\n\t}\n}\n\n/**\n * Get the source path for a registry skill within .pspm/skills/.\n *\n * @param username - Skill author username\n * @param skillName - Skill name\n * @returns Relative path from project root (e.g., \".pspm/skills/alice/my-skill\")\n */\nexport function getRegistrySkillPath(\n\tusername: string,\n\tskillName: string,\n): string {\n\treturn `.pspm/skills/${username}/${skillName}`;\n}\n\n/**\n * Get the source path for a GitHub skill within .pspm/skills/.\n *\n * @param owner - GitHub repository owner\n * @param repo - GitHub repository name\n * @param path - Optional path within the repository\n * @returns Relative path from project root (e.g., \".pspm/skills/_github/owner/repo/path\")\n */\nexport function getGitHubSkillPath(\n\towner: string,\n\trepo: string,\n\tpath?: string,\n): string {\n\tif (path) {\n\t\treturn `.pspm/skills/_github/${owner}/${repo}/${path}`;\n\t}\n\treturn `.pspm/skills/_github/${owner}/${repo}`;\n}\n\n/**\n * Get the source path for a local skill within .pspm/skills/.\n *\n * @param skillName - Skill name\n * @returns Relative path from project root (e.g., \".pspm/skills/_local/my-skill\")\n */\nexport function getLocalSkillPath(skillName: string): string {\n\treturn `.pspm/skills/_local/${skillName}`;\n}\n\n/**\n * Check which agents have symlinks for a given skill.\n *\n * @param skillName - Name of the skill (symlink name)\n * @param agents - Agent names to check\n * @param projectRoot - Project root directory\n * @param agentConfigs - Custom agent configurations\n * @returns Array of agent names that have valid symlinks\n */\nexport async function getLinkedAgents(\n\tskillName: string,\n\tagents: string[],\n\tprojectRoot: string,\n\tagentConfigs?: Record<string, AgentConfig>,\n): Promise<string[]> {\n\tconst linkedAgents: string[] = [];\n\n\tfor (const agentName of agents) {\n\t\tconst config = resolveAgentConfig(agentName, agentConfigs);\n\t\tif (!config) continue;\n\n\t\tconst symlinkPath = join(projectRoot, config.skillsDir, skillName);\n\n\t\ttry {\n\t\t\tconst stats = await lstat(symlinkPath);\n\t\t\tif (stats.isSymbolicLink()) {\n\t\t\t\tlinkedAgents.push(agentName);\n\t\t\t}\n\t\t} catch {\n\t\t\t// Symlink doesn't exist\n\t\t}\n\t}\n\n\treturn linkedAgents;\n}\n","import { mkdir, rm, stat, symlink } from \"node:fs/promises\";\nimport { basename, dirname, join, relative, resolve } from \"node:path\";\nimport { parseAgentArg, promptForAgents } from \"@/agents\";\nimport { configure, getSkillVersion, listSkillVersions } from \"@/api-client\";\nimport { getSkillsDir, getTokenForRegistry, resolveConfig } from \"@/config\";\nimport { extractApiErrorMessage } from \"@/errors\";\nimport {\n\tdownloadGitHubPackage,\n\textractGitHubPackage,\n\tgetGitHubDisplayName,\n} from \"@/github\";\nimport {\n\tcalculateIntegrity,\n\ttype DependencyNode,\n\tformatGitHubSpecifier,\n\ttype GitHubLockfileEntry,\n\tgetGitHubSkillName,\n\tisGitHubSpecifier,\n\ttype LocalLockfileEntry,\n\tMAX_DEPENDENCY_DEPTH,\n\tparseGitHubSpecifier,\n\tparseSkillSpecifier,\n\tprintResolutionErrors,\n\tresolveRecursive,\n\tresolveVersion,\n} from \"@/lib/index\";\nimport {\n\taddGitHubToLockfile,\n\taddLocalToLockfile,\n\taddToLockfileWithDeps,\n} from \"@/lockfile\";\nimport {\n\taddDependency,\n\taddGitHubDependency,\n\taddLocalDependency,\n\treadManifest,\n} from \"@/manifest\";\nimport {\n\tcreateAgentSymlinks,\n\tgetGitHubSkillPath,\n\tgetLocalSkillPath,\n\tgetRegistrySkillPath,\n\ttype SkillInfo,\n} from \"@/symlinks\";\n\n/**\n * Check if a specifier is a local file reference\n */\nfunction isLocalSpecifier(specifier: string): boolean {\n\treturn (\n\t\tspecifier.startsWith(\"file:\") ||\n\t\tspecifier.startsWith(\"./\") ||\n\t\tspecifier.startsWith(\"../\")\n\t);\n}\n\n/**\n * Parse a local specifier and return the path\n */\nfunction parseLocalPath(specifier: string): string {\n\tif (specifier.startsWith(\"file:\")) {\n\t\treturn specifier.slice(5); // Remove \"file:\" prefix\n\t}\n\treturn specifier;\n}\n\n/**\n * Normalize a path to a file: specifier\n */\nfunction normalizeToFileSpecifier(path: string): string {\n\tif (path.startsWith(\"file:\")) {\n\t\treturn path;\n\t}\n\treturn `file:${path}`;\n}\n\nexport interface AddOptions {\n\tsave?: boolean;\n\tagent?: string;\n\tyes?: boolean;\n}\n\n/** Resolved package info from validation phase */\ninterface ResolvedRegistryPackage {\n\ttype: \"registry\";\n\tspecifier: string;\n\tusername: string;\n\tname: string;\n\tversionRange: string | undefined;\n\tresolvedVersion: string;\n\tversionInfo: {\n\t\tdownloadUrl: string;\n\t\tchecksum: string;\n\t};\n}\n\ninterface ResolvedGitHubPackage {\n\ttype: \"github\";\n\tspecifier: string;\n\tparsed: ReturnType<typeof parseGitHubSpecifier> & object;\n\tref: string;\n\tdownloadResult: {\n\t\tbuffer: Buffer;\n\t\tcommit: string;\n\t\tintegrity: string;\n\t};\n}\n\ninterface ResolvedLocalPackage {\n\ttype: \"local\";\n\t/** Original specifier (e.g., \"file:../my-skill\" or \"../my-skill\") */\n\tspecifier: string;\n\t/** Normalized specifier with file: prefix */\n\tnormalizedSpecifier: string;\n\t/** Original path from specifier */\n\tpath: string;\n\t/** Resolved absolute path */\n\tresolvedPath: string;\n\t/** Skill name (last segment of path) */\n\tname: string;\n}\n\ntype ResolvedPackage =\n\t| ResolvedRegistryPackage\n\t| ResolvedGitHubPackage\n\t| ResolvedLocalPackage;\n\nexport async function add(\n\tspecifiers: string[],\n\toptions: AddOptions,\n): Promise<void> {\n\t// Phase 1: Validate and resolve all packages first\n\tconsole.log(\"Resolving packages...\\n\");\n\n\tconst resolvedPackages: ResolvedPackage[] = [];\n\tconst validationErrors: { specifier: string; error: string }[] = [];\n\n\tfor (const specifier of specifiers) {\n\t\ttry {\n\t\t\tif (isLocalSpecifier(specifier)) {\n\t\t\t\tconst resolved = await validateLocalPackage(specifier);\n\t\t\t\tresolvedPackages.push(resolved);\n\t\t\t} else if (isGitHubSpecifier(specifier)) {\n\t\t\t\tconst resolved = await validateGitHubPackage(specifier);\n\t\t\t\tresolvedPackages.push(resolved);\n\t\t\t} else {\n\t\t\t\tconst resolved = await validateRegistryPackage(specifier);\n\t\t\t\tresolvedPackages.push(resolved);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconst message = error instanceof Error ? error.message : \"Unknown error\";\n\t\t\tvalidationErrors.push({ specifier, error: message });\n\t\t\tconsole.error(`Failed to resolve ${specifier}: ${message}\\n`);\n\t\t}\n\t}\n\n\t// If all packages failed validation, exit early\n\tif (resolvedPackages.length === 0) {\n\t\tconsole.error(\"No packages could be resolved.\");\n\t\tprocess.exit(1);\n\t}\n\n\t// Show validation summary if there were failures\n\tif (validationErrors.length > 0) {\n\t\tconsole.log(\n\t\t\t`Resolved ${resolvedPackages.length} of ${specifiers.length} packages.\\n`,\n\t\t);\n\t}\n\n\t// Phase 2: Resolve recursive dependencies for registry packages\n\tconst config = await resolveConfig();\n\tconst apiKey = getTokenForRegistry(config, config.registryUrl);\n\n\t// Build root deps from validated registry packages\n\tconst registryPackages = resolvedPackages.filter(\n\t\t(p): p is ResolvedRegistryPackage => p.type === \"registry\",\n\t);\n\tconst githubPackages = resolvedPackages.filter(\n\t\t(p): p is ResolvedGitHubPackage => p.type === \"github\",\n\t);\n\tconst localPackages = resolvedPackages.filter(\n\t\t(p): p is ResolvedLocalPackage => p.type === \"local\",\n\t);\n\n\tlet resolutionResult: Awaited<ReturnType<typeof resolveRecursive>> | null =\n\t\tnull;\n\n\tif (registryPackages.length > 0) {\n\t\tconst rootDeps: Record<string, string> = {};\n\t\tfor (const pkg of registryPackages) {\n\t\t\tconst fullName = `@user/${pkg.username}/${pkg.name}`;\n\t\t\trootDeps[fullName] = pkg.versionRange || `^${pkg.resolvedVersion}`;\n\t\t}\n\n\t\t// Resolve recursively\n\t\tconsole.log(\"Resolving dependencies...\");\n\t\tresolutionResult = await resolveRecursive(rootDeps, {\n\t\t\tmaxDepth: MAX_DEPENDENCY_DEPTH,\n\t\t\tregistryUrl: config.registryUrl,\n\t\t\tapiKey,\n\t\t});\n\n\t\t// Handle resolution errors\n\t\tif (!resolutionResult.success) {\n\t\t\tprintResolutionErrors(\n\t\t\t\tresolutionResult.graph.errors,\n\t\t\t\tresolutionResult.graph.conflicts,\n\t\t\t);\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\tconst transitiveDeps = resolutionResult.installOrder.filter(\n\t\t\t(name) => !rootDeps[name],\n\t\t);\n\t\tif (transitiveDeps.length > 0) {\n\t\t\tconsole.log(\n\t\t\t\t`Resolved ${transitiveDeps.length} transitive dependencies.\\n`,\n\t\t\t);\n\t\t} else {\n\t\t\tconsole.log();\n\t\t}\n\t}\n\n\t// Phase 3: Determine which agents to use (after validation)\n\tlet agents: string[];\n\tconst manifest = await readManifest();\n\n\tif (options.agent) {\n\t\t// If --agent flag is provided, use it\n\t\tagents = parseAgentArg(options.agent);\n\t} else if (manifest) {\n\t\t// If pspm.json exists, use default agent (respect manifest's agent config)\n\t\tagents = parseAgentArg(undefined);\n\t} else if (options.yes) {\n\t\t// If -y flag is used, use default agent without prompting\n\t\tagents = parseAgentArg(undefined);\n\t} else {\n\t\t// No pspm.json exists, prompt user to select agents\n\t\tconsole.log(\"No pspm.json found. Let's set up your project.\\n\");\n\t\tagents = await promptForAgents();\n\t\tconsole.log(); // Add newline after selection\n\t}\n\n\t// Phase 4: Install all resolved packages\n\tconst results: { specifier: string; success: boolean; error?: string }[] = [];\n\n\t// Install registry packages in topological order (dependencies first)\n\tif (resolutionResult) {\n\t\tfor (const name of resolutionResult.installOrder) {\n\t\t\tconst node = resolutionResult.graph.nodes.get(name);\n\t\t\tif (!node) continue;\n\n\t\t\ttry {\n\t\t\t\tawait installFromNode(node, {\n\t\t\t\t\t...options,\n\t\t\t\t\tresolvedAgents: agents,\n\t\t\t\t\tisDirect: node.isDirect,\n\t\t\t\t});\n\t\t\t\tresults.push({ specifier: name, success: true });\n\t\t\t} catch (error) {\n\t\t\t\tconst message =\n\t\t\t\t\terror instanceof Error ? error.message : \"Unknown error\";\n\t\t\t\tresults.push({\n\t\t\t\t\tspecifier: name,\n\t\t\t\t\tsuccess: false,\n\t\t\t\t\terror: message,\n\t\t\t\t});\n\t\t\t\tconsole.error(`Failed to install ${name}: ${message}\\n`);\n\t\t\t}\n\t\t}\n\t}\n\n\t// Install GitHub packages (no recursive resolution for now)\n\tfor (const resolved of githubPackages) {\n\t\ttry {\n\t\t\tawait installGitHubPackage(resolved, {\n\t\t\t\t...options,\n\t\t\t\tresolvedAgents: agents,\n\t\t\t});\n\t\t\tresults.push({ specifier: resolved.specifier, success: true });\n\t\t} catch (error) {\n\t\t\tconst message = error instanceof Error ? error.message : \"Unknown error\";\n\t\t\tresults.push({\n\t\t\t\tspecifier: resolved.specifier,\n\t\t\t\tsuccess: false,\n\t\t\t\terror: message,\n\t\t\t});\n\t\t\tconsole.error(`Failed to install ${resolved.specifier}: ${message}\\n`);\n\t\t}\n\t}\n\n\t// Install local packages (symlink to local directory)\n\tfor (const resolved of localPackages) {\n\t\ttry {\n\t\t\tawait installLocalPackage(resolved, {\n\t\t\t\t...options,\n\t\t\t\tresolvedAgents: agents,\n\t\t\t});\n\t\t\tresults.push({ specifier: resolved.specifier, success: true });\n\t\t} catch (error) {\n\t\t\tconst message = error instanceof Error ? error.message : \"Unknown error\";\n\t\t\tresults.push({\n\t\t\t\tspecifier: resolved.specifier,\n\t\t\t\tsuccess: false,\n\t\t\t\terror: message,\n\t\t\t});\n\t\t\tconsole.error(`Failed to install ${resolved.specifier}: ${message}\\n`);\n\t\t}\n\t}\n\n\t// Print summary if multiple packages were requested\n\tif (specifiers.length > 1) {\n\t\tconst succeeded = results.filter((r) => r.success).length;\n\t\tconst failed =\n\t\t\tresults.filter((r) => !r.success).length + validationErrors.length;\n\t\tconsole.log(`\\nSummary: ${succeeded} added, ${failed} failed`);\n\n\t\tif (failed > 0) {\n\t\t\tprocess.exit(1);\n\t\t}\n\t}\n}\n\ninterface InternalAddOptions extends AddOptions {\n\tresolvedAgents: string[];\n}\n\ninterface InternalAddOptionsWithDirect extends InternalAddOptions {\n\t/** Whether this is a direct dependency (from command line) */\n\tisDirect: boolean;\n}\n\n/**\n * Install a package from a DependencyNode (resolved from resolver)\n */\nasync function installFromNode(\n\tnode: DependencyNode,\n\toptions: InternalAddOptionsWithDirect,\n): Promise<void> {\n\t// Parse package name\n\tconst match = node.name.match(/^@user\\/([^/]+)\\/([^/]+)$/);\n\tif (!match) {\n\t\tthrow new Error(`Invalid package name: ${node.name}`);\n\t}\n\tconst [, username, name] = match;\n\n\tconsole.log(`Installing ${node.name}@${node.version}...`);\n\n\t// Get config for download\n\tconst config = await resolveConfig();\n\tconst apiKey = getTokenForRegistry(config, config.registryUrl);\n\n\t// Download the tarball\n\tconst isPresignedUrl =\n\t\tnode.downloadUrl.includes(\".r2.cloudflarestorage.com\") ||\n\t\tnode.downloadUrl.includes(\"X-Amz-Signature\");\n\n\tconst downloadHeaders: Record<string, string> = {};\n\tif (!isPresignedUrl && apiKey) {\n\t\tdownloadHeaders.Authorization = `Bearer ${apiKey}`;\n\t}\n\n\tconst tarballResponse = await fetch(node.downloadUrl, {\n\t\theaders: downloadHeaders,\n\t\tredirect: \"follow\",\n\t});\n\n\tif (!tarballResponse.ok) {\n\t\tthrow new Error(`Failed to download tarball (${tarballResponse.status})`);\n\t}\n\n\tconst tarballBuffer = Buffer.from(await tarballResponse.arrayBuffer());\n\n\t// Calculate integrity\n\tconst integrity = calculateIntegrity(tarballBuffer);\n\n\t// Verify checksum matches\n\tif (integrity !== node.integrity) {\n\t\tthrow new Error(\"Checksum verification failed\");\n\t}\n\n\t// Create skills directory\n\tconst skillsDir = getSkillsDir();\n\tconst destDir = join(skillsDir, username, name);\n\tawait mkdir(destDir, { recursive: true });\n\n\t// Extract tarball\n\tconst { writeFile } = await import(\"node:fs/promises\");\n\tconst tempFile = join(destDir, \".temp.tgz\");\n\tawait writeFile(tempFile, tarballBuffer);\n\n\tconst { exec } = await import(\"node:child_process\");\n\tconst { promisify } = await import(\"node:util\");\n\tconst execAsync = promisify(exec);\n\n\ttry {\n\t\t// Clear destination and extract\n\t\tawait rm(destDir, { recursive: true, force: true });\n\t\tawait mkdir(destDir, { recursive: true });\n\t\tawait writeFile(tempFile, tarballBuffer);\n\t\tawait execAsync(\n\t\t\t`tar -xzf \"${tempFile}\" -C \"${destDir}\" --strip-components=1`,\n\t\t);\n\t} finally {\n\t\tawait rm(tempFile, { force: true });\n\t}\n\n\t// Update lockfile with dependencies\n\t// Convert dependencies to resolved version format\n\tconst resolvedDeps: Record<string, string> = {};\n\tfor (const [depName, _range] of Object.entries(node.dependencies)) {\n\t\t// The resolver already resolved the version, but we need to look it up\n\t\t// from the graph. For now, store the range; install.ts will use resolved versions\n\t\tresolvedDeps[depName] = _range;\n\t}\n\n\tawait addToLockfileWithDeps(\n\t\tnode.name,\n\t\t{\n\t\t\tversion: node.version,\n\t\t\tresolved: node.downloadUrl,\n\t\t\tintegrity,\n\t\t\tdeprecated: node.deprecated,\n\t\t},\n\t\tObject.keys(resolvedDeps).length > 0 ? resolvedDeps : undefined,\n\t);\n\n\t// Only add direct dependencies to pspm.json\n\tif (options.isDirect) {\n\t\tconst dependencyRange = node.versionRange || `^${node.version}`;\n\t\tawait addDependency(node.name, dependencyRange);\n\t}\n\n\t// Create agent symlinks\n\tconst agents = options.resolvedAgents;\n\tif (agents[0] !== \"none\") {\n\t\tconst skillManifest = await readManifest();\n\t\tconst skillInfo: SkillInfo = {\n\t\t\tname,\n\t\t\tsourcePath: getRegistrySkillPath(username, name),\n\t\t};\n\n\t\tawait createAgentSymlinks([skillInfo], {\n\t\t\tagents,\n\t\t\tprojectRoot: process.cwd(),\n\t\t\tagentConfigs: skillManifest?.agents,\n\t\t});\n\t}\n\n\tconsole.log(`Installed ${node.name}@${node.version}`);\n\tconsole.log(`Location: ${destDir}`);\n}\n\n/**\n * Validate and resolve a registry package (without downloading)\n */\nasync function validateRegistryPackage(\n\tspecifier: string,\n): Promise<ResolvedRegistryPackage> {\n\t// Get config - auth may be optional for public packages\n\tconst config = await resolveConfig();\n\tconst registryUrl = config.registryUrl;\n\tconst apiKey = getTokenForRegistry(config, registryUrl);\n\n\t// Parse the specifier\n\tconst parsed = parseSkillSpecifier(specifier);\n\tif (!parsed) {\n\t\tthrow new Error(\n\t\t\t`Invalid skill specifier \"${specifier}\". Use format: @user/{username}/{name}[@{version}]`,\n\t\t);\n\t}\n\n\tconst { username, name, versionRange } = parsed;\n\n\t// Configure SDK - apiKey may be undefined for public packages\n\tconfigure({ registryUrl, apiKey });\n\n\tconsole.log(`Resolving ${specifier}...`);\n\n\t// Get available versions\n\tconst versionsResponse = await listSkillVersions(username, name);\n\tif (versionsResponse.status !== 200) {\n\t\tif (versionsResponse.status === 401) {\n\t\t\tif (!apiKey) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Package @user/${username}/${name} requires authentication. Please run 'pspm login' to authenticate`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tthrow new Error(\n\t\t\t\t`Access denied to @user/${username}/${name}. You may not have permission to access this private package.`,\n\t\t\t);\n\t\t}\n\t\tconst errorMessage = extractApiErrorMessage(\n\t\t\tversionsResponse,\n\t\t\t`Skill @user/${username}/${name} not found`,\n\t\t);\n\t\tthrow new Error(errorMessage);\n\t}\n\tconst versions = versionsResponse.data;\n\tif (versions.length === 0) {\n\t\tthrow new Error(`Skill @user/${username}/${name} not found`);\n\t}\n\n\t// Resolve version\n\tconst versionStrings = versions.map((v: { version: string }) => v.version);\n\tconst resolvedVersion = resolveVersion(versionRange || \"*\", versionStrings);\n\n\tif (!resolvedVersion) {\n\t\tthrow new Error(\n\t\t\t`No version matching \"${versionRange || \"latest\"}\" found for @user/${username}/${name}. Available versions: ${versionStrings.join(\", \")}`,\n\t\t);\n\t}\n\n\t// Get version details with download URL\n\tconst versionResponse = await getSkillVersion(\n\t\tusername,\n\t\tname,\n\t\tresolvedVersion,\n\t);\n\tif (versionResponse.status !== 200 || !versionResponse.data) {\n\t\tconst errorMessage = extractApiErrorMessage(\n\t\t\tversionResponse,\n\t\t\t`Version ${resolvedVersion} not found`,\n\t\t);\n\t\tthrow new Error(errorMessage);\n\t}\n\n\tconsole.log(`Resolved @user/${username}/${name}@${resolvedVersion}`);\n\n\treturn {\n\t\ttype: \"registry\",\n\t\tspecifier,\n\t\tusername,\n\t\tname,\n\t\tversionRange,\n\t\tresolvedVersion,\n\t\tversionInfo: {\n\t\t\tdownloadUrl: versionResponse.data.downloadUrl,\n\t\t\tchecksum: versionResponse.data.checksum,\n\t\t},\n\t};\n}\n\n/**\n * Validate and download a GitHub package\n */\nasync function validateGitHubPackage(\n\tspecifier: string,\n): Promise<ResolvedGitHubPackage> {\n\tconst parsed = parseGitHubSpecifier(specifier);\n\tif (!parsed) {\n\t\tthrow new Error(\n\t\t\t`Invalid GitHub specifier \"${specifier}\". Use format: github:{owner}/{repo}[/{path}][@{ref}]`,\n\t\t);\n\t}\n\n\tconst ref = parsed.ref || \"HEAD\";\n\tconsole.log(`Resolving ${getGitHubDisplayName(parsed)}...`);\n\n\t// Download from GitHub (also validates existence)\n\tconst result = await downloadGitHubPackage(parsed);\n\n\tconsole.log(`Resolved ${specifier} (${ref}@${result.commit.slice(0, 7)})`);\n\n\treturn {\n\t\ttype: \"github\",\n\t\tspecifier,\n\t\tparsed,\n\t\tref,\n\t\tdownloadResult: result,\n\t};\n}\n\n/**\n * Install a pre-validated GitHub package\n */\nasync function installGitHubPackage(\n\tresolved: ResolvedGitHubPackage,\n\toptions: InternalAddOptions,\n): Promise<void> {\n\tconst { specifier, parsed, ref, downloadResult } = resolved;\n\n\tconsole.log(\n\t\t`Installing ${specifier} (${ref}@${downloadResult.commit.slice(0, 7)})...`,\n\t);\n\n\t// Extract to skills directory\n\tconst skillsDir = getSkillsDir();\n\tconst destPath = await extractGitHubPackage(\n\t\tparsed,\n\t\tdownloadResult.buffer,\n\t\tskillsDir,\n\t);\n\n\t// Add to lockfile\n\tconst lockfileSpecifier = formatGitHubSpecifier({\n\t\towner: parsed.owner,\n\t\trepo: parsed.repo,\n\t\tpath: parsed.path,\n\t\t// Don't include ref in the specifier key, it's stored in gitRef\n\t});\n\n\tconst entry: GitHubLockfileEntry = {\n\t\tversion: downloadResult.commit.slice(0, 7),\n\t\tresolved: `https://github.com/${parsed.owner}/${parsed.repo}`,\n\t\tintegrity: downloadResult.integrity,\n\t\tgitCommit: downloadResult.commit,\n\t\tgitRef: ref,\n\t};\n\n\tawait addGitHubToLockfile(lockfileSpecifier, entry);\n\n\t// Add to pspm.json githubDependencies\n\tawait addGitHubDependency(lockfileSpecifier, ref);\n\n\t// Create agent symlinks\n\tconst agents = options.resolvedAgents;\n\tif (agents[0] !== \"none\") {\n\t\tconst manifest = await readManifest();\n\t\tconst skillName = getGitHubSkillName(parsed);\n\t\tconst skillInfo: SkillInfo = {\n\t\t\tname: skillName,\n\t\t\tsourcePath: getGitHubSkillPath(parsed.owner, parsed.repo, parsed.path),\n\t\t};\n\n\t\tawait createAgentSymlinks([skillInfo], {\n\t\t\tagents,\n\t\t\tprojectRoot: process.cwd(),\n\t\t\tagentConfigs: manifest?.agents,\n\t\t});\n\t}\n\n\tconsole.log(\n\t\t`Installed ${specifier} (${ref}@${downloadResult.commit.slice(0, 7)})`,\n\t);\n\tconsole.log(`Location: ${destPath}`);\n}\n\n// =============================================================================\n// Local Package Support\n// =============================================================================\n\n/**\n * Validate a local package path exists and contains a valid skill\n */\nasync function validateLocalPackage(\n\tspecifier: string,\n): Promise<ResolvedLocalPackage> {\n\tconst path = parseLocalPath(specifier);\n\tconst resolvedPath = resolve(process.cwd(), path);\n\tconst normalizedSpecifier = normalizeToFileSpecifier(path);\n\n\tconsole.log(`Resolving ${specifier}...`);\n\n\t// Check if directory exists\n\ttry {\n\t\tconst stats = await stat(resolvedPath);\n\t\tif (!stats.isDirectory()) {\n\t\t\tthrow new Error(`Path is not a directory: ${resolvedPath}`);\n\t\t}\n\t} catch (error) {\n\t\tif ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n\t\t\tthrow new Error(\n\t\t\t\t`Directory not found: ${resolvedPath}\\n Check that the path exists and is accessible.`,\n\t\t\t);\n\t\t}\n\t\tthrow error;\n\t}\n\n\t// Check for SKILL.md or pspm.json\n\tlet hasSkillMd = false;\n\tlet hasPspmJson = false;\n\n\ttry {\n\t\tawait stat(join(resolvedPath, \"SKILL.md\"));\n\t\thasSkillMd = true;\n\t} catch {\n\t\t// SKILL.md not found\n\t}\n\n\ttry {\n\t\tawait stat(join(resolvedPath, \"pspm.json\"));\n\t\thasPspmJson = true;\n\t} catch {\n\t\t// pspm.json not found\n\t}\n\n\tif (!hasSkillMd && !hasPspmJson) {\n\t\tthrow new Error(\n\t\t\t`Not a valid skill directory: ${resolvedPath}\\n Missing both SKILL.md and pspm.json. At least one is required.`,\n\t\t);\n\t}\n\n\t// Get skill name from the last segment of the path\n\tconst name = basename(resolvedPath);\n\n\tconsole.log(`Resolved ${specifier} -> ${resolvedPath}`);\n\n\treturn {\n\t\ttype: \"local\",\n\t\tspecifier,\n\t\tnormalizedSpecifier,\n\t\tpath,\n\t\tresolvedPath,\n\t\tname,\n\t};\n}\n\n/**\n * Install a local package by creating a symlink\n */\nasync function installLocalPackage(\n\tresolved: ResolvedLocalPackage,\n\toptions: InternalAddOptions,\n): Promise<void> {\n\tconst { specifier, normalizedSpecifier, path, resolvedPath, name } = resolved;\n\n\tconsole.log(`Installing ${specifier}...`);\n\n\t// Create .pspm/skills/_local directory\n\tconst skillsDir = getSkillsDir();\n\tconst localSkillsDir = join(skillsDir, \"_local\");\n\tawait mkdir(localSkillsDir, { recursive: true });\n\n\t// Create symlink from .pspm/skills/_local/{name} -> resolved path\n\tconst symlinkPath = join(localSkillsDir, name);\n\n\t// Calculate relative path from symlink location to target\n\tconst relativeTarget = relative(dirname(symlinkPath), resolvedPath);\n\n\t// Remove existing symlink if it exists\n\ttry {\n\t\tawait rm(symlinkPath, { force: true });\n\t} catch {\n\t\t// Ignore errors\n\t}\n\n\t// Create the symlink\n\tawait symlink(relativeTarget, symlinkPath);\n\n\t// Add to lockfile\n\tconst entry: LocalLockfileEntry = {\n\t\tversion: \"local\",\n\t\tpath,\n\t\tresolvedPath,\n\t\tname,\n\t};\n\tawait addLocalToLockfile(normalizedSpecifier, entry);\n\n\t// Add to pspm.json localDependencies\n\tawait addLocalDependency(normalizedSpecifier);\n\n\t// Create agent symlinks\n\tconst agents = options.resolvedAgents;\n\tif (agents[0] !== \"none\") {\n\t\tconst manifest = await readManifest();\n\t\tconst skillInfo: SkillInfo = {\n\t\t\tname,\n\t\t\tsourcePath: getLocalSkillPath(name),\n\t\t};\n\n\t\tawait createAgentSymlinks([skillInfo], {\n\t\t\tagents,\n\t\t\tprojectRoot: process.cwd(),\n\t\t\tagentConfigs: manifest?.agents,\n\t\t});\n\t}\n\n\tconsole.log(`Installed ${specifier} (local)`);\n\tconsole.log(`Location: ${symlinkPath} -> ${resolvedPath}`);\n}\n","import { changeSkillAccess, configure } from \"@/api-client\";\nimport { getRegistryUrl, requireApiKey, resolveConfig } from \"@/config\";\nimport {\n\tisGitHubSpecifier,\n\tparseGitHubSpecifier,\n\tparseSkillSpecifier,\n} from \"@/lib/index\";\n\n/** Check if specifier is a local file reference */\nfunction isLocalSpecifier(specifier: string): boolean {\n\treturn (\n\t\tspecifier.startsWith(\"file:\") ||\n\t\tspecifier.startsWith(\"./\") ||\n\t\tspecifier.startsWith(\"../\")\n\t);\n}\n\nexport interface AccessOptions {\n\tpublic?: boolean;\n\tprivate?: boolean;\n}\n\n/**\n * Change the visibility of a skill package.\n *\n * Usage:\n * pspm access --public # Make current package public\n * pspm access @user/bob/skill --public # Make specific package public\n *\n * Note: Making a package public is irreversible (like npm).\n */\nexport async function access(\n\tspecifier: string | undefined,\n\toptions: AccessOptions,\n): Promise<void> {\n\ttry {\n\t\tconst apiKey = await requireApiKey();\n\t\tconst registryUrl = await getRegistryUrl();\n\n\t\t// Determine visibility from options\n\t\tif (options.public && options.private) {\n\t\t\tconsole.error(\"Error: Cannot specify both --public and --private\");\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\tif (!options.public && !options.private) {\n\t\t\tconsole.error(\"Error: Must specify either --public or --private\");\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\tconst visibility = options.public ? \"public\" : \"private\";\n\n\t\t// Parse package name - either from specifier or from current directory's pspm.json\n\t\tlet packageName: string;\n\t\tlet packageUsername: string | undefined;\n\n\t\tif (specifier) {\n\t\t\t// Check for GitHub specifiers - not supported for access command\n\t\t\tif (isGitHubSpecifier(specifier)) {\n\t\t\t\tconst ghSpec = parseGitHubSpecifier(specifier);\n\t\t\t\tif (ghSpec) {\n\t\t\t\t\tconsole.error(`Error: Cannot change visibility of GitHub packages.`);\n\t\t\t\t\tconsole.error(\n\t\t\t\t\t\t` \"${specifier}\" is hosted on GitHub, not the PSPM registry.`,\n\t\t\t\t\t);\n\t\t\t\t\tconsole.error(\n\t\t\t\t\t\t` Visibility can only be changed for packages published to the registry.`,\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tconsole.error(`Error: Invalid GitHub specifier \"${specifier}\".`);\n\t\t\t\t\tconsole.error(` Use format: github:{owner}/{repo}[/{path}][@{ref}]`);\n\t\t\t\t}\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\n\t\t\t// Check for local file specifiers - not supported for access command\n\t\t\tif (isLocalSpecifier(specifier)) {\n\t\t\t\tconsole.error(`Error: Cannot change visibility of local packages.`);\n\t\t\t\tconsole.error(\n\t\t\t\t\t` \"${specifier}\" is a local directory, not a registry package.`,\n\t\t\t\t);\n\t\t\t\tconsole.error(\n\t\t\t\t\t` Visibility can only be changed for packages published to the registry.`,\n\t\t\t\t);\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\n\t\t\t// Parse as registry specifier\n\t\t\tconst parsed = parseSkillSpecifier(specifier);\n\t\t\tif (!parsed) {\n\t\t\t\tconsole.error(`Error: Invalid package specifier \"${specifier}\".`);\n\t\t\t\tconsole.error(` Use format: @user/{username}/{name}`);\n\t\t\t\tconsole.error(``);\n\t\t\t\tconsole.error(` Examples:`);\n\t\t\t\tconsole.error(` pspm access @user/myname/my-skill --public`);\n\t\t\t\tconsole.error(\n\t\t\t\t\t` pspm access --public (uses current directory's pspm.json)`,\n\t\t\t\t);\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\t\t\tpackageName = parsed.name;\n\t\t\tpackageUsername = parsed.username;\n\t\t} else {\n\t\t\t// Read from current directory's pspm.json or package.json\n\t\t\tconst { readFile } = await import(\"node:fs/promises\");\n\t\t\tconst { join } = await import(\"node:path\");\n\n\t\t\tlet manifest: { name: string } | null = null;\n\n\t\t\t// Try pspm.json first\n\t\t\ttry {\n\t\t\t\tconst content = await readFile(\n\t\t\t\t\tjoin(process.cwd(), \"pspm.json\"),\n\t\t\t\t\t\"utf-8\",\n\t\t\t\t);\n\t\t\t\tmanifest = JSON.parse(content);\n\t\t\t} catch {\n\t\t\t\t// Try package.json\n\t\t\t\ttry {\n\t\t\t\t\tconst content = await readFile(\n\t\t\t\t\t\tjoin(process.cwd(), \"package.json\"),\n\t\t\t\t\t\t\"utf-8\",\n\t\t\t\t\t);\n\t\t\t\t\tmanifest = JSON.parse(content);\n\t\t\t\t} catch {\n\t\t\t\t\tconsole.error(\n\t\t\t\t\t\t\"Error: No pspm.json or package.json found in current directory\",\n\t\t\t\t\t);\n\t\t\t\t\tconsole.error(\n\t\t\t\t\t\t\"Either run this command in a package directory or specify a package name\",\n\t\t\t\t\t);\n\t\t\t\t\tprocess.exit(1);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (!manifest?.name) {\n\t\t\t\tconsole.error(\"Error: Package manifest is missing 'name' field\");\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\n\t\t\tpackageName = manifest.name;\n\t\t}\n\n\t\t// If username not from specifier, get from config\n\t\tif (!packageUsername) {\n\t\t\tconst config = await resolveConfig();\n\t\t\tpackageUsername = config.username;\n\t\t}\n\n\t\tif (!packageUsername) {\n\t\t\tconsole.error(\n\t\t\t\t\"Error: Could not determine username. Please use the full specifier: @user/{username}/{name}\",\n\t\t\t);\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\t// Configure SDK and make API call\n\t\tconfigure({ registryUrl, apiKey });\n\n\t\tconsole.log(`Setting ${packageName} to ${visibility}...`);\n\n\t\tconst response = await changeSkillAccess(packageUsername, packageName, {\n\t\t\tvisibility,\n\t\t});\n\n\t\tif (response.status !== 200 || !response.data) {\n\t\t\tconst errorMessage = response.error ?? \"Failed to change visibility\";\n\t\t\tconsole.error(`Error: ${errorMessage}`);\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\tconst result = response.data;\n\t\tconsole.log(\n\t\t\t`+ @user/${result.username}/${result.name} is now ${result.visibility}`,\n\t\t);\n\n\t\tif (visibility === \"public\") {\n\t\t\tconsole.log(\"\");\n\t\t\tconsole.log(\n\t\t\t\t\"Note: This action is irreversible. Public packages cannot be made private.\",\n\t\t\t);\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","export { type AccessOptions, access } from \"./access\";\nexport { type AddOptions, add } from \"./add\";\nexport {\n\ttype ConfigInitOptions,\n\tconfigInit,\n\tconfigShow,\n} from \"./config/index\";\nexport { type DeprecateOptions, deprecate } from \"./deprecate\";\nexport { type InitOptions, init } from \"./init\";\nexport { type InstallOptions, install } from \"./install\";\nexport { type LinkOptions, link } from \"./link\";\nexport { type ListOptions, list } from \"./list\";\nexport { type LoginOptions, login } from \"./login\";\nexport { logout } from \"./logout\";\nexport { type MigrateOptions, migrate } from \"./migrate\";\nexport { type OutdatedOptions, outdated } from \"./outdated\";\nexport { type PublishOptions, publish } from \"./publish\";\nexport { remove } from \"./remove\";\nexport { type UnpublishOptions, unpublish } from \"./unpublish\";\nexport { type UpdateOptions, update } from \"./update\";\nexport { type VersionBump, type VersionOptions, version } from \"./version\";\nexport { whoami } from \"./whoami\";\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 { findProjectConfig, getConfigPath, resolveConfig } from \"@/config\";\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 {\n\tconfigure,\n\tdeprecateSkillVersion,\n\tundeprecateSkillVersion,\n} from \"@/api-client\";\nimport { getRegistryUrl, requireApiKey } from \"@/config\";\nimport { parseSkillSpecifier } from \"@/lib/index\";\n\nexport interface DeprecateOptions {\n\tundo?: boolean;\n}\n\n/**\n * Deprecate or undeprecate a skill version\n *\n * Usage:\n * pspm deprecate @user/bob/skill@1.0.0 \"Use v2.0.0 instead\"\n * pspm deprecate @user/bob/skill@1.0.0 --undo\n */\nexport async function deprecate(\n\tspecifier: string,\n\tmessage: string | undefined,\n\toptions: DeprecateOptions,\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\tif (!versionRange) {\n\t\t\tconsole.error(\n\t\t\t\t\"Error: Version is required for deprecation. Use format: @user/{username}/{name}@{version}\",\n\t\t\t);\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\t// Configure SDK\n\t\tconfigure({ registryUrl, apiKey });\n\n\t\tif (options.undo) {\n\t\t\t// Remove deprecation\n\t\t\tconsole.log(\n\t\t\t\t`Removing deprecation from @user/${username}/${name}@${versionRange}...`,\n\t\t\t);\n\n\t\t\tconst response = await undeprecateSkillVersion(\n\t\t\t\tusername,\n\t\t\t\tname,\n\t\t\t\tversionRange,\n\t\t\t);\n\t\t\tif (response.status !== 200) {\n\t\t\t\tconsole.error(\n\t\t\t\t\t`Error: ${response.error || \"Failed to remove deprecation\"}`,\n\t\t\t\t);\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\n\t\t\tconsole.log(\n\t\t\t\t`Removed deprecation from @user/${username}/${name}@${versionRange}`,\n\t\t\t);\n\t\t} else {\n\t\t\t// Add deprecation\n\t\t\tif (!message) {\n\t\t\t\tconsole.error(\n\t\t\t\t\t\"Error: Deprecation message is required. Usage: pspm deprecate <specifier> <message>\",\n\t\t\t\t);\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\n\t\t\tconsole.log(`Deprecating @user/${username}/${name}@${versionRange}...`);\n\n\t\t\tconst response = await deprecateSkillVersion(\n\t\t\t\tusername,\n\t\t\t\tname,\n\t\t\t\tversionRange,\n\t\t\t\tmessage,\n\t\t\t);\n\t\t\tif (response.status !== 200) {\n\t\t\t\tconsole.error(\n\t\t\t\t\t`Error: ${response.error || \"Failed to deprecate version\"}`,\n\t\t\t\t);\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\n\t\t\tconsole.log(`Deprecated @user/${username}/${name}@${versionRange}`);\n\t\t\tconsole.log(`Message: ${message}`);\n\t\t\tconsole.log(\"\");\n\t\t\tconsole.log(\n\t\t\t\t\"Users installing this version will see a deprecation warning.\",\n\t\t\t);\n\t\t\tconsole.log(\"The package is still available for download.\");\n\t\t}\n\t} catch (error) {\n\t\tconst errorMessage =\n\t\t\terror instanceof Error ? error.message : \"Unknown error\";\n\t\tconsole.error(`Error: ${errorMessage}`);\n\t\tprocess.exit(1);\n\t}\n}\n","import { readFile, stat, writeFile } from \"node:fs/promises\";\nimport { basename, join } from \"node:path\";\nimport { createInterface } from \"node:readline\";\nimport {\n\tDEFAULT_SKILL_FILES,\n\tPSPM_SCHEMA_URL,\n\ttype PspmManifest,\n} from \"@/lib/index\";\n\nexport interface InitOptions {\n\tname?: string;\n\tdescription?: string;\n\tauthor?: string;\n\tyes?: boolean;\n\tforce?: boolean;\n}\n\n/**\n * Simple readline prompt that mimics npm's style\n */\nfunction prompt(\n\trl: ReturnType<typeof createInterface>,\n\tquestion: string,\n\tdefaultValue: string,\n): Promise<string> {\n\treturn new Promise((resolve) => {\n\t\tconst displayDefault = defaultValue ? ` (${defaultValue})` : \"\";\n\t\trl.question(`${question}${displayDefault} `, (answer) => {\n\t\t\tresolve(answer.trim() || defaultValue);\n\t\t});\n\t});\n}\n\n/**\n * Try to read existing package.json to extract some defaults\n */\nasync function readExistingPackageJson(): Promise<Partial<PspmManifest> | null> {\n\ttry {\n\t\tconst content = await readFile(\n\t\t\tjoin(process.cwd(), \"package.json\"),\n\t\t\t\"utf-8\",\n\t\t);\n\t\tconst pkg = JSON.parse(content);\n\t\treturn {\n\t\t\tname: pkg.name,\n\t\t\tversion: pkg.version,\n\t\t\tdescription: pkg.description,\n\t\t\tauthor: typeof pkg.author === \"string\" ? pkg.author : pkg.author?.name,\n\t\t\tlicense: pkg.license,\n\t\t};\n\t} catch {\n\t\treturn null;\n\t}\n}\n\n/**\n * Try to detect author from git config\n */\nasync function getGitAuthor(): Promise<string | null> {\n\ttry {\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\tconst [nameResult, emailResult] = await Promise.all([\n\t\t\texecAsync(\"git config user.name\").catch(() => ({ stdout: \"\" })),\n\t\t\texecAsync(\"git config user.email\").catch(() => ({ stdout: \"\" })),\n\t\t]);\n\n\t\tconst name = nameResult.stdout.trim();\n\t\tconst email = emailResult.stdout.trim();\n\n\t\tif (name && email) {\n\t\t\treturn `${name} <${email}>`;\n\t\t}\n\t\tif (name) {\n\t\t\treturn name;\n\t\t}\n\t\treturn null;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\n/**\n * Sanitize a name for use as skill name\n * - Remove @ prefix and scope\n * - Convert to lowercase\n * - Replace invalid characters with hyphens\n */\nfunction sanitizeName(name: string): string {\n\t// Remove npm scope if present (e.g., @user/package -> package)\n\tconst withoutScope = name.replace(/^@[^/]+\\//, \"\");\n\t// Lowercase and replace invalid chars\n\treturn withoutScope\n\t\t.toLowerCase()\n\t\t.replace(/[^a-z0-9_-]/g, \"-\")\n\t\t.replace(/^-+|-+$/g, \"\")\n\t\t.replace(/-+/g, \"-\");\n}\n\n/**\n * Validate skill name format\n */\nfunction isValidName(name: string): boolean {\n\treturn /^[a-z][a-z0-9_-]*$/.test(name);\n}\n\n/**\n * Validate semver format\n */\nfunction isValidVersion(version: string): boolean {\n\treturn /^\\d+\\.\\d+\\.\\d+(-[a-zA-Z0-9.-]+)?(\\+[a-zA-Z0-9.-]+)?$/.test(version);\n}\n\n/**\n * Initialize a new pspm.json manifest in the current directory\n */\nexport async function init(options: InitOptions): Promise<void> {\n\ttry {\n\t\tconst pspmJsonPath = join(process.cwd(), \"pspm.json\");\n\n\t\t// Check if pspm.json already exists\n\t\tlet exists = false;\n\t\ttry {\n\t\t\tawait stat(pspmJsonPath);\n\t\t\texists = true;\n\t\t} catch {\n\t\t\t// File doesn't exist, good\n\t\t}\n\n\t\tif (exists && !options.force) {\n\t\t\tconsole.error(\"Error: pspm.json already exists in this directory.\");\n\t\t\tconsole.error(\"Use --force to overwrite.\");\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\t// Try to read defaults from existing package.json and git\n\t\tconst existingPkg = await readExistingPackageJson();\n\t\tconst gitAuthor = await getGitAuthor();\n\n\t\t// Determine default values\n\t\tconst defaultName = sanitizeName(\n\t\t\toptions.name || existingPkg?.name || basename(process.cwd()),\n\t\t);\n\t\tconst defaultVersion = existingPkg?.version || \"0.1.0\";\n\t\tconst defaultDescription =\n\t\t\toptions.description || existingPkg?.description || \"\";\n\t\tconst defaultAuthor =\n\t\t\toptions.author || existingPkg?.author || gitAuthor || \"\";\n\t\tconst defaultLicense = existingPkg?.license || \"MIT\";\n\t\tconst defaultMain = \"SKILL.md\";\n\t\tconst defaultCapabilities = \"\";\n\n\t\tlet manifest: PspmManifest;\n\n\t\tif (options.yes) {\n\t\t\t// Non-interactive mode: use all defaults\n\t\t\tmanifest = {\n\t\t\t\t$schema: PSPM_SCHEMA_URL,\n\t\t\t\tname: defaultName,\n\t\t\t\tversion: defaultVersion,\n\t\t\t\tdescription: defaultDescription || undefined,\n\t\t\t\tauthor: defaultAuthor || undefined,\n\t\t\t\tlicense: defaultLicense,\n\t\t\t\ttype: \"skill\",\n\t\t\t\tcapabilities: [],\n\t\t\t\tmain: defaultMain,\n\t\t\t\trequirements: {\n\t\t\t\t\tpspm: \">=0.1.0\",\n\t\t\t\t},\n\t\t\t\tfiles: [...DEFAULT_SKILL_FILES],\n\t\t\t\tdependencies: {},\n\t\t\t\tprivate: false,\n\t\t\t};\n\t\t} else {\n\t\t\t// Interactive mode: prompt for each field\n\t\t\tconsole.log(\n\t\t\t\t\"This utility will walk you through creating a pspm.json file.\",\n\t\t\t);\n\t\t\tconsole.log(\n\t\t\t\t\"It only covers the most common items, and tries to guess sensible defaults.\",\n\t\t\t);\n\t\t\tconsole.log(\"\");\n\t\t\tconsole.log(\n\t\t\t\t\"See `pspm init --help` for definitive documentation on these fields\",\n\t\t\t);\n\t\t\tconsole.log(\"and exactly what they do.\");\n\t\t\tconsole.log(\"\");\n\t\t\tconsole.log(\"Press ^C at any time to quit.\");\n\n\t\t\tconst rl = createInterface({\n\t\t\t\tinput: process.stdin,\n\t\t\t\toutput: process.stdout,\n\t\t\t});\n\n\t\t\ttry {\n\t\t\t\t// Prompt for each field\n\t\t\t\tlet name = await prompt(rl, \"skill name:\", defaultName);\n\n\t\t\t\t// Validate name and re-prompt if invalid\n\t\t\t\twhile (!isValidName(name)) {\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\" Name must start with a lowercase letter and contain only lowercase letters, numbers, hyphens, and underscores.\",\n\t\t\t\t\t);\n\t\t\t\t\tname = await prompt(rl, \"skill name:\", sanitizeName(name));\n\t\t\t\t}\n\n\t\t\t\tlet version = await prompt(rl, \"version:\", defaultVersion);\n\n\t\t\t\t// Validate version and re-prompt if invalid\n\t\t\t\twhile (!isValidVersion(version)) {\n\t\t\t\t\tconsole.log(\" Version must be valid semver (e.g., 1.0.0)\");\n\t\t\t\t\tversion = await prompt(rl, \"version:\", \"0.1.0\");\n\t\t\t\t}\n\n\t\t\t\tconst description = await prompt(\n\t\t\t\t\trl,\n\t\t\t\t\t\"description:\",\n\t\t\t\t\tdefaultDescription,\n\t\t\t\t);\n\t\t\t\tconst main = await prompt(rl, \"entry point:\", defaultMain);\n\t\t\t\tconst capabilitiesStr = await prompt(\n\t\t\t\t\trl,\n\t\t\t\t\t\"capabilities (comma-separated):\",\n\t\t\t\t\tdefaultCapabilities,\n\t\t\t\t);\n\t\t\t\tconst author = await prompt(rl, \"author:\", defaultAuthor);\n\t\t\t\tconst license = await prompt(rl, \"license:\", defaultLicense);\n\n\t\t\t\trl.close();\n\n\t\t\t\t// Parse capabilities\n\t\t\t\tconst capabilities = capabilitiesStr\n\t\t\t\t\t? capabilitiesStr\n\t\t\t\t\t\t\t.split(\",\")\n\t\t\t\t\t\t\t.map((s) => s.trim())\n\t\t\t\t\t\t\t.filter(Boolean)\n\t\t\t\t\t: [];\n\n\t\t\t\tmanifest = {\n\t\t\t\t\t$schema: PSPM_SCHEMA_URL,\n\t\t\t\t\tname,\n\t\t\t\t\tversion,\n\t\t\t\t\tdescription: description || undefined,\n\t\t\t\t\tauthor: author || undefined,\n\t\t\t\t\tlicense,\n\t\t\t\t\ttype: \"skill\",\n\t\t\t\t\tcapabilities,\n\t\t\t\t\tmain,\n\t\t\t\t\trequirements: {\n\t\t\t\t\t\tpspm: \">=0.1.0\",\n\t\t\t\t\t},\n\t\t\t\t\tfiles: [...DEFAULT_SKILL_FILES],\n\t\t\t\t\tdependencies: {},\n\t\t\t\t\tprivate: false,\n\t\t\t\t};\n\t\t\t} catch (error) {\n\t\t\t\trl.close();\n\t\t\t\t// User pressed Ctrl+C\n\t\t\t\tif (\n\t\t\t\t\terror instanceof Error &&\n\t\t\t\t\terror.message.includes(\"readline was closed\")\n\t\t\t\t) {\n\t\t\t\t\tconsole.log(\"\\nAborted.\");\n\t\t\t\t\tprocess.exit(0);\n\t\t\t\t}\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t}\n\n\t\t// Remove undefined/empty fields for cleaner output\n\t\tif (!manifest.description) manifest.description = undefined;\n\t\tif (!manifest.author) manifest.author = undefined;\n\t\tif (manifest.capabilities?.length === 0) manifest.capabilities = undefined;\n\n\t\t// Show preview\n\t\tconst content = JSON.stringify(manifest, null, 2);\n\n\t\tconsole.log(\"\");\n\t\tconsole.log(`About to write to ${pspmJsonPath}:`);\n\t\tconsole.log(\"\");\n\t\tconsole.log(content);\n\t\tconsole.log(\"\");\n\n\t\t// In interactive mode, confirm before writing\n\t\tif (!options.yes) {\n\t\t\tconst rl = createInterface({\n\t\t\t\tinput: process.stdin,\n\t\t\t\toutput: process.stdout,\n\t\t\t});\n\n\t\t\tconst confirm = await prompt(rl, \"Is this OK?\", \"yes\");\n\t\t\trl.close();\n\n\t\t\tif (confirm.toLowerCase() !== \"yes\" && confirm.toLowerCase() !== \"y\") {\n\t\t\t\tconsole.log(\"Aborted.\");\n\t\t\t\tprocess.exit(0);\n\t\t\t}\n\t\t}\n\n\t\t// Write the manifest\n\t\tawait writeFile(pspmJsonPath, `${content}\\n`);\n\n\t\t// Check if SKILL.md exists\n\t\ttry {\n\t\t\tawait stat(join(process.cwd(), \"SKILL.md\"));\n\t\t} catch {\n\t\t\tconsole.log(\n\t\t\t\t\"Note: Create a SKILL.md file with your skill's prompt content.\",\n\t\t\t);\n\t\t}\n\n\t\tif (existingPkg) {\n\t\t\tconsole.log(\"Note: Values were derived from existing package.json.\");\n\t\t\tconsole.log(\" pspm.json is for publishing to PSPM registry.\");\n\t\t\tconsole.log(\" package.json can still be used for npm dependencies.\");\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 { createHash } from \"node:crypto\";\nimport { mkdir, readFile, rm, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { parseAgentArg, promptForAgents } from \"@/agents\";\nimport { configure, getSkillVersion, listSkillVersions } from \"@/api-client\";\nimport {\n\tgetCacheDir,\n\tgetSkillsDir,\n\tgetTokenForRegistry,\n\tresolveConfig,\n} from \"@/config\";\nimport { extractApiErrorMessage } from \"@/errors\";\nimport {\n\tdownloadGitHubPackage,\n\textractGitHubPackage,\n\tGitHubNotFoundError,\n\tGitHubPathNotFoundError,\n\tGitHubRateLimitError,\n\tgetGitHubDisplayName,\n} from \"@/github\";\nimport {\n\tcalculateIntegrity,\n\tcomputeInstallOrder,\n\ttype GitHubLockfileEntry,\n\tgetGitHubSkillName,\n\ttype PspmLockfileEntry,\n\tparseGitHubSpecifier,\n\tparseSkillSpecifier,\n\tresolveVersion,\n} from \"@/lib/index\";\nimport {\n\taddGitHubToLockfile,\n\taddToLockfile,\n\tmigrateLockfileIfNeeded,\n\treadLockfile,\n} from \"@/lockfile\";\nimport {\n\tgetDependencies,\n\tgetGitHubDependencies,\n\treadManifest,\n} from \"@/manifest\";\nimport {\n\tcreateAgentSymlinks,\n\tgetGitHubSkillPath,\n\tgetRegistrySkillPath,\n\ttype SkillInfo,\n} from \"@/symlinks\";\n\n/**\n * Get cache file path from integrity hash\n */\nfunction getCacheFilePath(cacheDir: string, integrity: string): string {\n\t// integrity is \"sha256-{base64hash}\"\n\t// Convert to safe filename: sha256-{hex}.tgz\n\tconst match = integrity.match(/^sha256-(.+)$/);\n\tif (!match) {\n\t\tthrow new Error(`Invalid integrity format: ${integrity}`);\n\t}\n\t// Convert base64 to hex for safe filename\n\tconst base64Hash = match[1];\n\tconst hexHash = Buffer.from(base64Hash, \"base64\").toString(\"hex\");\n\treturn join(cacheDir, `sha256-${hexHash}.tgz`);\n}\n\n/**\n * Try to read tarball from cache\n */\nasync function readFromCache(\n\tcacheDir: string,\n\tintegrity: string,\n): Promise<Buffer | null> {\n\ttry {\n\t\tconst cachePath = getCacheFilePath(cacheDir, integrity);\n\t\tconst data = await readFile(cachePath);\n\n\t\t// Verify integrity\n\t\tconst actualIntegrity = `sha256-${createHash(\"sha256\").update(data).digest(\"base64\")}`;\n\t\tif (actualIntegrity !== integrity) {\n\t\t\t// Cache corrupted, remove it\n\t\t\tawait rm(cachePath, { force: true });\n\t\t\treturn null;\n\t\t}\n\n\t\treturn data;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\n/**\n * Write tarball to cache\n */\nasync function writeToCache(\n\tcacheDir: string,\n\tintegrity: string,\n\tdata: Buffer,\n): Promise<void> {\n\ttry {\n\t\tawait mkdir(cacheDir, { recursive: true });\n\t\tconst cachePath = getCacheFilePath(cacheDir, integrity);\n\t\tawait writeFile(cachePath, data);\n\t} catch {\n\t\t// Cache write failures are non-fatal\n\t}\n}\n\nexport interface InstallOptions {\n\tfrozenLockfile?: boolean;\n\tdir?: string;\n\tagent?: string;\n\tyes?: boolean;\n}\n\nexport async function install(\n\tspecifiers: string[],\n\toptions: InstallOptions,\n): Promise<void> {\n\t// If specifiers are provided, delegate to add command\n\tif (specifiers.length > 0) {\n\t\tconst { add } = await import(\"./add.js\");\n\t\tawait add(specifiers, {\n\t\t\tsave: true,\n\t\t\tagent: options.agent,\n\t\t\tyes: options.yes,\n\t\t});\n\t\treturn;\n\t}\n\n\t// Otherwise, install from lockfile\n\tawait installFromLockfile(options);\n}\n\nasync function installFromLockfile(options: InstallOptions): Promise<void> {\n\ttry {\n\t\t// Get config - auth may be optional for public packages\n\t\tconst config = await resolveConfig();\n\t\tconst registryUrl = config.registryUrl;\n\t\tconst apiKey = getTokenForRegistry(config, registryUrl);\n\t\tconst skillsDir = options.dir || getSkillsDir();\n\t\tconst cacheDir = getCacheDir();\n\n\t\t// Migrate legacy lockfile if needed\n\t\tawait migrateLockfileIfNeeded();\n\n\t\t// Read lockfile and dependencies from pspm.json\n\t\tlet lockfile = await readLockfile();\n\t\tconst manifestDeps = await getDependencies();\n\t\tconst manifestGitHubDeps = await getGitHubDependencies();\n\t\tconst lockfilePackages = lockfile?.packages ?? lockfile?.skills ?? {};\n\t\tconst lockfileGitHubPackages = lockfile?.githubPackages ?? {};\n\n\t\t// Track all installed skills for symlink creation\n\t\tconst installedSkills: SkillInfo[] = [];\n\n\t\t// =================================================================\n\t\t// Phase 1: Resolve missing registry dependencies\n\t\t// =================================================================\n\t\tconst missingDeps: Array<{ fullName: string; versionRange: string }> = [];\n\t\tfor (const [fullName, versionRange] of Object.entries(manifestDeps)) {\n\t\t\tif (!lockfilePackages[fullName]) {\n\t\t\t\tmissingDeps.push({ fullName, versionRange });\n\t\t\t}\n\t\t}\n\n\t\tif (missingDeps.length > 0) {\n\t\t\tif (options.frozenLockfile) {\n\t\t\t\tconsole.error(\n\t\t\t\t\t\"Error: Dependencies in pspm.json are not in lockfile. Cannot install with --frozen-lockfile\",\n\t\t\t\t);\n\t\t\t\tconsole.error(\"Missing dependencies:\");\n\t\t\t\tfor (const dep of missingDeps) {\n\t\t\t\t\tconsole.error(` - ${dep.fullName}@${dep.versionRange}`);\n\t\t\t\t}\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\n\t\t\tconsole.log(`Resolving ${missingDeps.length} new dependency(ies)...\\n`);\n\t\t\tconfigure({ registryUrl, apiKey });\n\n\t\t\tfor (const { fullName, versionRange } of missingDeps) {\n\t\t\t\tconst parsed = parseSkillSpecifier(fullName);\n\t\t\t\tif (!parsed) {\n\t\t\t\t\tconsole.error(`Error: Invalid dependency specifier: ${fullName}`);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst { username, name } = parsed;\n\t\t\t\tconsole.log(`Resolving ${fullName}@${versionRange}...`);\n\n\t\t\t\t// Get available versions\n\t\t\t\tconst versionsResponse = await listSkillVersions(username, name);\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`Skill ${fullName} not found`,\n\t\t\t\t\t);\n\t\t\t\t\tconsole.error(`Error: ${errorMessage}`);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst versions = versionsResponse.data;\n\t\t\t\tif (versions.length === 0) {\n\t\t\t\t\tconsole.error(`Error: Skill ${fullName} not found`);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Resolve version\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 resolved = resolveVersion(versionRange || \"*\", versionStrings);\n\n\t\t\t\tif (!resolved) {\n\t\t\t\t\tconsole.error(\n\t\t\t\t\t\t`Error: No version matching \"${versionRange}\" for ${fullName}`,\n\t\t\t\t\t);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Get version details with download URL\n\t\t\t\tconst versionResponse = await getSkillVersion(username, name, resolved);\n\t\t\t\tif (versionResponse.status !== 200 || !versionResponse.data) {\n\t\t\t\t\tconst errorMessage = extractApiErrorMessage(\n\t\t\t\t\t\tversionResponse,\n\t\t\t\t\t\t`Version ${resolved} not found`,\n\t\t\t\t\t);\n\t\t\t\t\tconsole.error(`Error: ${errorMessage}`);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconst versionInfo = versionResponse.data;\n\n\t\t\t\t// Download the tarball\n\t\t\t\tconst isPresignedUrl =\n\t\t\t\t\tversionInfo.downloadUrl.includes(\".r2.cloudflarestorage.com\") ||\n\t\t\t\t\tversionInfo.downloadUrl.includes(\"X-Amz-Signature\");\n\n\t\t\t\tconst downloadHeaders: Record<string, string> = {};\n\t\t\t\tif (!isPresignedUrl && apiKey) {\n\t\t\t\t\tdownloadHeaders.Authorization = `Bearer ${apiKey}`;\n\t\t\t\t}\n\n\t\t\t\tconst tarballResponse = await fetch(versionInfo.downloadUrl, {\n\t\t\t\t\theaders: downloadHeaders,\n\t\t\t\t\tredirect: \"follow\",\n\t\t\t\t});\n\n\t\t\t\tif (!tarballResponse.ok) {\n\t\t\t\t\tconsole.error(\n\t\t\t\t\t\t`Error: Failed to download tarball for ${fullName} (${tarballResponse.status})`,\n\t\t\t\t\t);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst tarballBuffer = Buffer.from(await tarballResponse.arrayBuffer());\n\t\t\t\tconst integrity = calculateIntegrity(tarballBuffer);\n\n\t\t\t\t// Add to lockfile\n\t\t\t\tawait addToLockfile(fullName, {\n\t\t\t\t\tversion: resolved,\n\t\t\t\t\tresolved: versionInfo.downloadUrl,\n\t\t\t\t\tintegrity,\n\t\t\t\t});\n\n\t\t\t\t// Cache the tarball\n\t\t\t\tawait writeToCache(cacheDir, integrity, tarballBuffer);\n\n\t\t\t\tconsole.log(` Resolved ${fullName}@${resolved}`);\n\t\t\t}\n\n\t\t\t// Re-read lockfile after adding new entries\n\t\t\tlockfile = await readLockfile();\n\t\t}\n\n\t\t// =================================================================\n\t\t// Phase 2: Resolve missing GitHub dependencies\n\t\t// =================================================================\n\t\tconst missingGitHubDeps: Array<{ specifier: string; ref: string }> = [];\n\t\tfor (const [specifier, ref] of Object.entries(manifestGitHubDeps)) {\n\t\t\tif (!lockfileGitHubPackages[specifier]) {\n\t\t\t\tmissingGitHubDeps.push({ specifier, ref });\n\t\t\t}\n\t\t}\n\n\t\tif (missingGitHubDeps.length > 0) {\n\t\t\tif (options.frozenLockfile) {\n\t\t\t\tconsole.error(\n\t\t\t\t\t\"Error: GitHub dependencies in pspm.json are not in lockfile. Cannot install with --frozen-lockfile\",\n\t\t\t\t);\n\t\t\t\tconsole.error(\"Missing GitHub dependencies:\");\n\t\t\t\tfor (const dep of missingGitHubDeps) {\n\t\t\t\t\tconsole.error(` - ${dep.specifier}@${dep.ref}`);\n\t\t\t\t}\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\n\t\t\tconsole.log(\n\t\t\t\t`\\nResolving ${missingGitHubDeps.length} GitHub dependency(ies)...\\n`,\n\t\t\t);\n\n\t\t\tfor (const { specifier, ref } of missingGitHubDeps) {\n\t\t\t\tconst parsed = parseGitHubSpecifier(specifier);\n\t\t\t\tif (!parsed) {\n\t\t\t\t\tconsole.error(`Error: Invalid GitHub specifier: ${specifier}`);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Set the ref from manifest if not in specifier\n\t\t\t\tparsed.ref = parsed.ref || ref;\n\n\t\t\t\tconsole.log(`Resolving ${getGitHubDisplayName(parsed)}...`);\n\n\t\t\t\ttry {\n\t\t\t\t\tconst result = await downloadGitHubPackage(parsed);\n\n\t\t\t\t\t// Extract to skills directory\n\t\t\t\t\tawait extractGitHubPackage(parsed, result.buffer, skillsDir);\n\n\t\t\t\t\t// Add to lockfile\n\t\t\t\t\tconst entry: GitHubLockfileEntry = {\n\t\t\t\t\t\tversion: result.commit.slice(0, 7),\n\t\t\t\t\t\tresolved: `https://github.com/${parsed.owner}/${parsed.repo}`,\n\t\t\t\t\t\tintegrity: result.integrity,\n\t\t\t\t\t\tgitCommit: result.commit,\n\t\t\t\t\t\tgitRef: ref || \"HEAD\",\n\t\t\t\t\t};\n\n\t\t\t\t\tawait addGitHubToLockfile(specifier, entry);\n\n\t\t\t\t\t// Cache the tarball\n\t\t\t\t\tawait writeToCache(cacheDir, result.integrity, result.buffer);\n\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t` Resolved ${specifier} (${ref}@${result.commit.slice(0, 7)})`,\n\t\t\t\t\t);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tif (error instanceof GitHubRateLimitError) {\n\t\t\t\t\t\tconsole.error(`Error: ${error.message}`);\n\t\t\t\t\t} else if (error instanceof GitHubPathNotFoundError) {\n\t\t\t\t\t\tconsole.error(`Error: ${error.message}`);\n\t\t\t\t\t} else if (error instanceof GitHubNotFoundError) {\n\t\t\t\t\t\tconsole.error(`Error: ${error.message}`);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst message =\n\t\t\t\t\t\t\terror instanceof Error ? error.message : String(error);\n\t\t\t\t\t\tconsole.error(`Error resolving ${specifier}: ${message}`);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Re-read lockfile after adding new entries\n\t\t\tlockfile = await readLockfile();\n\t\t}\n\n\t\t// =================================================================\n\t\t// Determine which agents to use (after resolution, before installation)\n\t\t// =================================================================\n\t\tconst manifest = await readManifest();\n\t\tconst agentConfigs = manifest?.agents;\n\n\t\tlet agents: string[];\n\t\tif (options.agent) {\n\t\t\t// If --agent flag is provided, use it\n\t\t\tagents = parseAgentArg(options.agent);\n\t\t} else if (manifest) {\n\t\t\t// If pspm.json exists, use default agent\n\t\t\tagents = parseAgentArg(undefined);\n\t\t} else if (options.yes) {\n\t\t\t// If -y flag is used, use default agent without prompting\n\t\t\tagents = parseAgentArg(undefined);\n\t\t} else {\n\t\t\t// No pspm.json exists, prompt user to select agents\n\t\t\tconsole.log(\"\\nNo pspm.json found. Let's set up your project.\\n\");\n\t\t\tagents = await promptForAgents();\n\t\t\tconsole.log(); // Add newline after selection\n\t\t}\n\n\t\t// =================================================================\n\t\t// Phase 3: Install registry packages from lockfile (topological order)\n\t\t// =================================================================\n\t\tconst packages = lockfile?.packages ?? lockfile?.skills ?? {};\n\t\tconst packageCount = Object.keys(packages).length;\n\n\t\tif (packageCount > 0) {\n\t\t\tconsole.log(`\\nInstalling ${packageCount} registry skill(s)...\\n`);\n\n\t\t\t// Compute topological install order (dependencies first)\n\t\t\tconst installOrder = computeInstallOrder(packages);\n\t\t\tconst entries: [string, PspmLockfileEntry][] = installOrder\n\t\t\t\t.filter((name) => packages[name])\n\t\t\t\t.map((name) => [name, packages[name]]);\n\n\t\t\tfor (const [fullName, entry] of entries) {\n\t\t\t\tconst match = fullName.match(/^@user\\/([^/]+)\\/([^/]+)$/);\n\t\t\t\tif (!match) {\n\t\t\t\t\tconsole.warn(`Warning: Invalid skill name in lockfile: ${fullName}`);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst [, username, name] = match;\n\t\t\t\tconsole.log(`Installing ${fullName}@${entry.version}...`);\n\n\t\t\t\tlet tarballBuffer: Buffer;\n\t\t\t\tlet fromCache = false;\n\n\t\t\t\t// Try to read from cache first\n\t\t\t\tconst cachedTarball = await readFromCache(cacheDir, entry.integrity);\n\t\t\t\tif (cachedTarball) {\n\t\t\t\t\ttarballBuffer = cachedTarball;\n\t\t\t\t\tfromCache = true;\n\t\t\t\t} else {\n\t\t\t\t\t// Download the tarball\n\t\t\t\t\tconst isPresignedUrl =\n\t\t\t\t\t\tentry.resolved.includes(\".r2.cloudflarestorage.com\") ||\n\t\t\t\t\t\tentry.resolved.includes(\"X-Amz-Signature\");\n\n\t\t\t\t\tconst downloadHeaders: Record<string, string> = {};\n\t\t\t\t\tif (!isPresignedUrl && apiKey) {\n\t\t\t\t\t\tdownloadHeaders.Authorization = `Bearer ${apiKey}`;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst response = await fetch(entry.resolved, {\n\t\t\t\t\t\theaders: downloadHeaders,\n\t\t\t\t\t\tredirect: \"follow\",\n\t\t\t\t\t});\n\n\t\t\t\t\tif (!response.ok) {\n\t\t\t\t\t\tif (response.status === 401) {\n\t\t\t\t\t\t\tif (!apiKey) {\n\t\t\t\t\t\t\t\tconsole.error(\n\t\t\t\t\t\t\t\t\t` Error: ${fullName} requires authentication. Run 'pspm login' first.`,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tconsole.error(\n\t\t\t\t\t\t\t\t\t` Error: Access denied to ${fullName}. You may not have permission to access this private package.`,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconsole.error(\n\t\t\t\t\t\t\t\t` Error: Failed to download ${fullName} (${response.status})`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\ttarballBuffer = Buffer.from(await response.arrayBuffer());\n\n\t\t\t\t\t// Verify checksum\n\t\t\t\t\tconst actualIntegrity = `sha256-${createHash(\"sha256\").update(tarballBuffer).digest(\"base64\")}`;\n\n\t\t\t\t\tif (actualIntegrity !== entry.integrity) {\n\t\t\t\t\t\tconsole.error(\n\t\t\t\t\t\t\t` Error: Checksum verification failed for ${fullName}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (options.frozenLockfile) {\n\t\t\t\t\t\t\tprocess.exit(1);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Cache the verified tarball\n\t\t\t\t\tawait writeToCache(cacheDir, entry.integrity, tarballBuffer);\n\t\t\t\t}\n\n\t\t\t\t// Extract tarball\n\t\t\t\tconst destDir = join(skillsDir, username, name);\n\t\t\t\tawait rm(destDir, { recursive: true, force: true });\n\t\t\t\tawait mkdir(destDir, { recursive: true });\n\n\t\t\t\tconst tempFile = join(destDir, \".temp.tgz\");\n\t\t\t\tawait writeFile(tempFile, tarballBuffer);\n\n\t\t\t\tconst { exec } = await import(\"node:child_process\");\n\t\t\t\tconst { promisify } = await import(\"node:util\");\n\t\t\t\tconst execAsync = promisify(exec);\n\n\t\t\t\ttry {\n\t\t\t\t\tawait execAsync(\n\t\t\t\t\t\t`tar -xzf \"${tempFile}\" -C \"${destDir}\" --strip-components=1`,\n\t\t\t\t\t);\n\t\t\t\t} finally {\n\t\t\t\t\tawait rm(tempFile, { force: true });\n\t\t\t\t}\n\n\t\t\t\tconsole.log(\n\t\t\t\t\t` Installed to ${destDir}${fromCache ? \" (from cache)\" : \"\"}`,\n\t\t\t\t);\n\n\t\t\t\t// Track for symlinks\n\t\t\t\tinstalledSkills.push({\n\t\t\t\t\tname,\n\t\t\t\t\tsourcePath: getRegistrySkillPath(username, name),\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\t// =================================================================\n\t\t// Phase 4: Install GitHub packages from lockfile\n\t\t// =================================================================\n\t\tconst githubPackages = lockfile?.githubPackages ?? {};\n\t\tconst githubCount = Object.keys(githubPackages).length;\n\n\t\tif (githubCount > 0) {\n\t\t\tconsole.log(`\\nInstalling ${githubCount} GitHub skill(s)...\\n`);\n\n\t\t\tfor (const [specifier, entry] of Object.entries(githubPackages)) {\n\t\t\t\tconst parsed = parseGitHubSpecifier(specifier);\n\t\t\t\tif (!parsed) {\n\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\t`Warning: Invalid GitHub specifier in lockfile: ${specifier}`,\n\t\t\t\t\t);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst ghEntry = entry as GitHubLockfileEntry;\n\t\t\t\tconsole.log(\n\t\t\t\t\t`Installing ${specifier} (${ghEntry.gitRef}@${ghEntry.gitCommit.slice(0, 7)})...`,\n\t\t\t\t);\n\n\t\t\t\tlet tarballBuffer: Buffer;\n\t\t\t\tlet fromCache = false;\n\n\t\t\t\t// Try to read from cache first\n\t\t\t\tconst cachedTarball = await readFromCache(cacheDir, ghEntry.integrity);\n\t\t\t\tif (cachedTarball) {\n\t\t\t\t\ttarballBuffer = cachedTarball;\n\t\t\t\t\tfromCache = true;\n\t\t\t\t} else {\n\t\t\t\t\t// Download from GitHub\n\t\t\t\t\ttry {\n\t\t\t\t\t\t// Use the locked commit\n\t\t\t\t\t\tconst specWithCommit = { ...parsed, ref: ghEntry.gitCommit };\n\t\t\t\t\t\tconst result = await downloadGitHubPackage(specWithCommit);\n\t\t\t\t\t\ttarballBuffer = result.buffer;\n\n\t\t\t\t\t\t// Verify integrity\n\t\t\t\t\t\tif (result.integrity !== ghEntry.integrity) {\n\t\t\t\t\t\t\tconsole.error(\n\t\t\t\t\t\t\t\t` Error: Checksum verification failed for ${specifier}`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tif (options.frozenLockfile) {\n\t\t\t\t\t\t\t\tprocess.exit(1);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Cache the verified tarball\n\t\t\t\t\t\tawait writeToCache(cacheDir, ghEntry.integrity, tarballBuffer);\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tif (error instanceof GitHubRateLimitError) {\n\t\t\t\t\t\t\tconsole.error(` Error: ${error.message}`);\n\t\t\t\t\t\t} else if (error instanceof GitHubPathNotFoundError) {\n\t\t\t\t\t\t\tconsole.error(` Error: ${error.message}`);\n\t\t\t\t\t\t} else if (error instanceof GitHubNotFoundError) {\n\t\t\t\t\t\t\tconsole.error(` Error: ${error.message}`);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconst message =\n\t\t\t\t\t\t\t\terror instanceof Error ? error.message : String(error);\n\t\t\t\t\t\t\tconsole.error(` Error downloading ${specifier}: ${message}`);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Extract the package\n\t\t\t\ttry {\n\t\t\t\t\tconst destPath = await extractGitHubPackage(\n\t\t\t\t\t\tparsed,\n\t\t\t\t\t\ttarballBuffer,\n\t\t\t\t\t\tskillsDir,\n\t\t\t\t\t);\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t` Installed to ${destPath}${fromCache ? \" (from cache)\" : \"\"}`,\n\t\t\t\t\t);\n\n\t\t\t\t\t// Track for symlinks\n\t\t\t\t\tconst skillName = getGitHubSkillName(parsed);\n\t\t\t\t\tinstalledSkills.push({\n\t\t\t\t\t\tname: skillName,\n\t\t\t\t\t\tsourcePath: getGitHubSkillPath(\n\t\t\t\t\t\t\tparsed.owner,\n\t\t\t\t\t\t\tparsed.repo,\n\t\t\t\t\t\t\tparsed.path,\n\t\t\t\t\t\t),\n\t\t\t\t\t});\n\t\t\t\t} catch (error) {\n\t\t\t\t\tconst message =\n\t\t\t\t\t\terror instanceof Error ? error.message : String(error);\n\t\t\t\t\tconsole.error(` Error extracting ${specifier}: ${message}`);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// =================================================================\n\t\t// Phase 5: Create agent symlinks\n\t\t// =================================================================\n\t\tif (installedSkills.length > 0 && agents[0] !== \"none\") {\n\t\t\tconsole.log(`\\nCreating symlinks for agent(s): ${agents.join(\", \")}...`);\n\n\t\t\tawait createAgentSymlinks(installedSkills, {\n\t\t\t\tagents,\n\t\t\t\tprojectRoot: process.cwd(),\n\t\t\t\tagentConfigs,\n\t\t\t});\n\n\t\t\tconsole.log(\" Symlinks created.\");\n\t\t}\n\n\t\t// =================================================================\n\t\t// Summary\n\t\t// =================================================================\n\t\tconst totalCount = packageCount + githubCount;\n\t\tif (totalCount === 0) {\n\t\t\tconsole.log(\"No skills to install.\");\n\t\t} else {\n\t\t\tconsole.log(`\\nAll ${totalCount} skill(s) installed.`);\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","/**\n * Link command - Recreate agent symlinks without reinstalling.\n *\n * Useful after:\n * - Adding new agents to pspm.json\n * - Changing agent configuration\n * - Recovering from accidentally deleted symlinks\n */\n\nimport { parseAgentArg, promptForAgents } from \"@/agents\";\nimport {\n\tgetGitHubSkillName,\n\tparseGitHubSpecifier,\n\tparseSkillSpecifier,\n} from \"@/lib/index\";\nimport { listLockfileGitHubPackages, listLockfileSkills } from \"@/lockfile\";\nimport { readManifest } from \"@/manifest\";\nimport {\n\tcreateAgentSymlinks,\n\tgetGitHubSkillPath,\n\tgetRegistrySkillPath,\n\ttype SkillInfo,\n} from \"@/symlinks\";\n\nexport interface LinkOptions {\n\tagent?: string;\n\tyes?: boolean;\n}\n\nexport async function link(options: LinkOptions): Promise<void> {\n\ttry {\n\t\t// Read manifest for agent config overrides\n\t\tconst manifest = await readManifest();\n\t\tconst agentConfigs = manifest?.agents;\n\n\t\t// Determine which agents to use\n\t\tlet agents: string[];\n\t\tif (options.agent) {\n\t\t\t// If --agent flag is provided, use it\n\t\t\tagents = parseAgentArg(options.agent);\n\t\t} else if (manifest) {\n\t\t\t// If pspm.json exists, use default agent (respect manifest's agent config)\n\t\t\tagents = parseAgentArg(undefined);\n\t\t} else if (options.yes) {\n\t\t\t// If -y flag is used, use default agent without prompting\n\t\t\tagents = parseAgentArg(undefined);\n\t\t} else {\n\t\t\t// No pspm.json exists, prompt user to select agents\n\t\t\tconsole.log(\"No pspm.json found. Let's set up your project.\\n\");\n\t\t\tagents = await promptForAgents();\n\t\t}\n\n\t\t// Skip if \"none\" agent\n\t\tif (agents.length === 1 && agents[0] === \"none\") {\n\t\t\tconsole.log(\"Skipping symlink creation (--agent none)\");\n\t\t\treturn;\n\t\t}\n\n\t\t// Collect all installed skills\n\t\tconst skills: SkillInfo[] = [];\n\n\t\t// Get registry skills from lockfile\n\t\tconst registrySkills = await listLockfileSkills();\n\t\tfor (const { name } of registrySkills) {\n\t\t\tconst parsed = parseSkillSpecifier(name);\n\t\t\tif (!parsed) {\n\t\t\t\tconsole.warn(`Warning: Invalid skill name in lockfile: ${name}`);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tskills.push({\n\t\t\t\tname: parsed.name,\n\t\t\t\tsourcePath: getRegistrySkillPath(parsed.username, parsed.name),\n\t\t\t});\n\t\t}\n\n\t\t// Get GitHub skills from lockfile\n\t\tconst githubSkills = await listLockfileGitHubPackages();\n\t\tfor (const { specifier } of githubSkills) {\n\t\t\tconst parsed = parseGitHubSpecifier(specifier);\n\t\t\tif (!parsed) {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t`Warning: Invalid GitHub specifier in lockfile: ${specifier}`,\n\t\t\t\t);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst skillName = getGitHubSkillName(parsed);\n\t\t\tskills.push({\n\t\t\t\tname: skillName,\n\t\t\t\tsourcePath: getGitHubSkillPath(parsed.owner, parsed.repo, parsed.path),\n\t\t\t});\n\t\t}\n\n\t\tif (skills.length === 0) {\n\t\t\tconsole.log(\"No skills found in lockfile. Nothing to link.\");\n\t\t\treturn;\n\t\t}\n\n\t\tconsole.log(\n\t\t\t`Creating symlinks for ${skills.length} skill(s) to agent(s): ${agents.join(\", \")}...`,\n\t\t);\n\n\t\tawait createAgentSymlinks(skills, {\n\t\t\tagents,\n\t\t\tprojectRoot: process.cwd(),\n\t\t\tagentConfigs,\n\t\t});\n\n\t\tconsole.log(\"Symlinks created successfully.\");\n\n\t\t// List created symlinks\n\t\tconsole.log(\"\\nLinked skills:\");\n\t\tfor (const skill of skills) {\n\t\t\tconsole.log(` ${skill.name} -> ${skill.sourcePath}`);\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","/**\n * List command - Show installed skills.\n *\n * Displays:\n * - Registry and GitHub skills\n * - Source type\n * - Version / commit info\n * - Linked agent paths\n */\n\nimport { access } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { getAvailableAgents, resolveAgentConfig } from \"@/agents\";\nimport {\n\ttype GitHubLockfileEntry,\n\tgetGitHubSkillName,\n\tparseGitHubSpecifier,\n} from \"@/lib/index\";\nimport { listLockfileGitHubPackages, listLockfileSkills } from \"@/lockfile\";\nimport { readManifest } from \"@/manifest\";\nimport {\n\tgetGitHubSkillPath,\n\tgetLinkedAgents,\n\tgetRegistrySkillPath,\n} from \"@/symlinks\";\n\nexport interface ListOptions {\n\tjson?: boolean;\n}\n\ninterface SkillListItem {\n\tname: string;\n\tfullName: string;\n\tversion: string;\n\tsource: \"registry\" | \"github\";\n\tsourcePath: string;\n\tstatus: \"installed\" | \"missing\";\n\tlinkedAgents: string[];\n\tgitRef?: string;\n\tgitCommit?: string;\n}\n\nexport async function list(options: ListOptions): Promise<void> {\n\ttry {\n\t\t// Get all skills from lockfile\n\t\tconst registrySkills = await listLockfileSkills();\n\t\tconst githubSkills = await listLockfileGitHubPackages();\n\n\t\t// Read manifest for agent configs\n\t\tconst manifest = await readManifest();\n\t\tconst agentConfigs = manifest?.agents;\n\t\tconst availableAgents = getAvailableAgents(agentConfigs);\n\t\tconst projectRoot = process.cwd();\n\n\t\t// Build list of all skills\n\t\tconst skills: SkillListItem[] = [];\n\n\t\t// Add registry skills\n\t\tfor (const { name: fullName, entry } of registrySkills) {\n\t\t\tconst match = fullName.match(/^@user\\/([^/]+)\\/([^/]+)$/);\n\t\t\tif (!match) continue;\n\n\t\t\tconst [, username, skillName] = match;\n\t\t\tconst sourcePath = getRegistrySkillPath(username, skillName);\n\t\t\tconst absolutePath = join(projectRoot, sourcePath);\n\n\t\t\t// Check if installed on disk\n\t\t\tlet status: \"installed\" | \"missing\" = \"installed\";\n\t\t\ttry {\n\t\t\t\tawait access(absolutePath);\n\t\t\t} catch {\n\t\t\t\tstatus = \"missing\";\n\t\t\t}\n\n\t\t\t// Check which agents have symlinks\n\t\t\tconst linkedAgents = await getLinkedAgents(\n\t\t\t\tskillName,\n\t\t\t\tavailableAgents,\n\t\t\t\tprojectRoot,\n\t\t\t\tagentConfigs,\n\t\t\t);\n\n\t\t\tskills.push({\n\t\t\t\tname: skillName,\n\t\t\t\tfullName,\n\t\t\t\tversion: entry.version,\n\t\t\t\tsource: \"registry\",\n\t\t\t\tsourcePath,\n\t\t\t\tstatus,\n\t\t\t\tlinkedAgents,\n\t\t\t});\n\t\t}\n\n\t\t// Add GitHub skills\n\t\tfor (const { specifier, entry } of githubSkills) {\n\t\t\tconst parsed = parseGitHubSpecifier(specifier);\n\t\t\tif (!parsed) continue;\n\n\t\t\tconst ghEntry = entry as GitHubLockfileEntry;\n\t\t\tconst skillName = getGitHubSkillName(parsed);\n\t\t\tconst sourcePath = getGitHubSkillPath(\n\t\t\t\tparsed.owner,\n\t\t\t\tparsed.repo,\n\t\t\t\tparsed.path,\n\t\t\t);\n\t\t\tconst absolutePath = join(projectRoot, sourcePath);\n\n\t\t\t// Check if installed on disk\n\t\t\tlet status: \"installed\" | \"missing\" = \"installed\";\n\t\t\ttry {\n\t\t\t\tawait access(absolutePath);\n\t\t\t} catch {\n\t\t\t\tstatus = \"missing\";\n\t\t\t}\n\n\t\t\t// Check which agents have symlinks\n\t\t\tconst linkedAgents = await getLinkedAgents(\n\t\t\t\tskillName,\n\t\t\t\tavailableAgents,\n\t\t\t\tprojectRoot,\n\t\t\t\tagentConfigs,\n\t\t\t);\n\n\t\t\tskills.push({\n\t\t\t\tname: skillName,\n\t\t\t\tfullName: specifier,\n\t\t\t\tversion: ghEntry.gitCommit.slice(0, 7),\n\t\t\t\tsource: \"github\",\n\t\t\t\tsourcePath,\n\t\t\t\tstatus,\n\t\t\t\tlinkedAgents,\n\t\t\t\tgitRef: ghEntry.gitRef,\n\t\t\t\tgitCommit: ghEntry.gitCommit,\n\t\t\t});\n\t\t}\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\tconsole.log(\"Installed skills:\\n\");\n\n\t\tfor (const skill of skills) {\n\t\t\t// Header line: name@version (source)\n\t\t\tif (skill.source === \"registry\") {\n\t\t\t\tconsole.log(` ${skill.fullName}@${skill.version} (registry)`);\n\t\t\t} else {\n\t\t\t\tconst refInfo = skill.gitRef\n\t\t\t\t\t? `${skill.gitRef}@${skill.gitCommit?.slice(0, 7)}`\n\t\t\t\t\t: skill.version;\n\t\t\t\tconsole.log(` ${skill.fullName} (${refInfo})`);\n\t\t\t}\n\n\t\t\t// Status line if missing\n\t\t\tif (skill.status === \"missing\") {\n\t\t\t\tconsole.log(` Status: MISSING (run 'pspm install' to restore)`);\n\t\t\t}\n\n\t\t\t// Symlink line\n\t\t\tif (skill.linkedAgents.length > 0) {\n\t\t\t\tfor (const agent of skill.linkedAgents) {\n\t\t\t\t\tconst config = resolveAgentConfig(agent, agentConfigs);\n\t\t\t\t\tif (config) {\n\t\t\t\t\t\tconsole.log(` -> ${config.skillsDir}/${skill.name}`);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Summary\n\t\tconst registryCount = skills.filter((s) => s.source === \"registry\").length;\n\t\tconst githubCount = skills.filter((s) => s.source === \"github\").length;\n\t\tconst parts: string[] = [];\n\t\tif (registryCount > 0) parts.push(`${registryCount} registry`);\n\t\tif (githubCount > 0) parts.push(`${githubCount} github`);\n\n\t\tconsole.log(`\\nTotal: ${skills.length} skill(s) (${parts.join(\", \")})`);\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\";\nimport { getRegistryUrl, setCredentials } from \"@/config\";\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 can be:\n * - https://registry.pspm.dev (registry subdomain) -> web app is https://pspm.dev\n * - https://pspm.dev (main domain) -> web app is 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\tlet host = url.host;\n\n\t\t// Strip \"registry.\" subdomain prefix if present\n\t\t// e.g., registry.pspm.dev -> pspm.dev\n\t\tif (host.startsWith(\"registry.\")) {\n\t\t\thost = host.slice(\"registry.\".length);\n\t\t}\n\n\t\treturn `${url.protocol}//${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 * Used for auth-related API calls (token exchange, etc.)\n *\n * The registry URL can be:\n * - https://registry.pspm.dev -> server is https://pspm.dev\n * - https://pspm.dev -> server is https://pspm.dev\n */\nfunction getServerUrl(registryUrl: string): string {\n\ttry {\n\t\tconst url = new URL(registryUrl);\n\t\tlet host = url.host;\n\n\t\t// Strip \"registry.\" subdomain prefix if present\n\t\tif (host.startsWith(\"registry.\")) {\n\t\t\thost = host.slice(\"registry.\".length);\n\t\t}\n\n\t\treturn `${url.protocol}//${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\";\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 { mkdir, readdir, rename, rm, stat } from \"node:fs/promises\";\nimport {\n\tgetLegacyLockfilePath,\n\tgetLegacySkillsDir,\n\tgetLockfilePath,\n\tgetPspmDir,\n\tgetSkillsDir,\n} from \"@/config\";\nimport { migrateLockfileIfNeeded } from \"@/lockfile\";\n\nexport interface MigrateOptions {\n\tdryRun?: boolean;\n}\n\n/**\n * Migrate from old directory structure to new:\n * - .skills/ → .pspm/skills/\n * - skill-lock.json → pspm-lock.json\n */\nexport async function migrate(options: MigrateOptions): Promise<void> {\n\ttry {\n\t\tconst legacySkillsDir = getLegacySkillsDir();\n\t\tconst newSkillsDir = getSkillsDir();\n\t\tconst legacyLockfilePath = getLegacyLockfilePath();\n\t\tconst newLockfilePath = getLockfilePath();\n\t\tconst pspmDir = getPspmDir();\n\n\t\tlet migrationNeeded = false;\n\t\tconst actions: string[] = [];\n\n\t\t// Check for legacy .skills directory\n\t\ttry {\n\t\t\tconst legacyStats = await stat(legacySkillsDir);\n\t\t\tif (legacyStats.isDirectory()) {\n\t\t\t\t// Check if it has any content\n\t\t\t\tconst contents = await readdir(legacySkillsDir);\n\t\t\t\tif (contents.length > 0) {\n\t\t\t\t\tmigrationNeeded = true;\n\t\t\t\t\tactions.push(\"Move .skills/ → .pspm/skills/\");\n\t\t\t\t}\n\t\t\t}\n\t\t} catch {\n\t\t\t// Legacy directory doesn't exist\n\t\t}\n\n\t\t// Check for legacy lockfile\n\t\ttry {\n\t\t\tawait stat(legacyLockfilePath);\n\t\t\t// Check if new lockfile already exists\n\t\t\ttry {\n\t\t\t\tawait stat(newLockfilePath);\n\t\t\t\t// Both exist - suggest manual resolution\n\t\t\t\tactions.push(\n\t\t\t\t\t\"Note: Both skill-lock.json and pspm-lock.json exist. Manual merge may be needed.\",\n\t\t\t\t);\n\t\t\t} catch {\n\t\t\t\tmigrationNeeded = true;\n\t\t\t\tactions.push(\"Migrate skill-lock.json → pspm-lock.json\");\n\t\t\t}\n\t\t} catch {\n\t\t\t// Legacy lockfile doesn't exist\n\t\t}\n\n\t\tif (!migrationNeeded && actions.length === 0) {\n\t\t\tconsole.log(\n\t\t\t\t\"No migration needed. Project is already using the new structure.\",\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tif (options.dryRun) {\n\t\t\tconsole.log(\"Migration plan (dry run):\");\n\t\t\tconsole.log(\"\");\n\t\t\tfor (const action of actions) {\n\t\t\t\tconsole.log(` - ${action}`);\n\t\t\t}\n\t\t\tconsole.log(\"\");\n\t\t\tconsole.log(\"Run without --dry-run to perform migration.\");\n\t\t\treturn;\n\t\t}\n\n\t\tconsole.log(\"Migrating project structure...\\n\");\n\n\t\t// Migrate lockfile first\n\t\tconst lockfileMigrated = await migrateLockfileIfNeeded();\n\t\tif (lockfileMigrated) {\n\t\t\tconsole.log(\" ✓ Migrated skill-lock.json → pspm-lock.json\");\n\t\t}\n\n\t\t// Migrate .skills directory\n\t\ttry {\n\t\t\tconst legacyStats = await stat(legacySkillsDir);\n\t\t\tif (legacyStats.isDirectory()) {\n\t\t\t\tconst contents = await readdir(legacySkillsDir);\n\t\t\t\tif (contents.length > 0) {\n\t\t\t\t\t// Create .pspm directory\n\t\t\t\t\tawait mkdir(pspmDir, { recursive: true });\n\n\t\t\t\t\t// Check if new skills dir exists and has content\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst newStats = await stat(newSkillsDir);\n\t\t\t\t\t\tif (newStats.isDirectory()) {\n\t\t\t\t\t\t\tconst newContents = await readdir(newSkillsDir);\n\t\t\t\t\t\t\tif (newContents.length > 0) {\n\t\t\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t\t\t\" ! Both .skills/ and .pspm/skills/ have content. Manual merge required.\",\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t// New dir exists but empty, remove it first\n\t\t\t\t\t\t\t\tawait rm(newSkillsDir, { recursive: true, force: true });\n\t\t\t\t\t\t\t\tawait rename(legacySkillsDir, newSkillsDir);\n\t\t\t\t\t\t\t\tconsole.log(\" ✓ Moved .skills/ → .pspm/skills/\");\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch {\n\t\t\t\t\t\t// New skills dir doesn't exist, safe to move\n\t\t\t\t\t\tawait rename(legacySkillsDir, newSkillsDir);\n\t\t\t\t\t\tconsole.log(\" ✓ Moved .skills/ → .pspm/skills/\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} catch {\n\t\t\t// Legacy directory doesn't exist\n\t\t}\n\n\t\tconsole.log(\"\");\n\t\tconsole.log(\"Migration complete!\");\n\t\tconsole.log(\"\");\n\t\tconsole.log(\n\t\t\t\"You can safely delete these legacy files if they still exist:\",\n\t\t);\n\t\tconsole.log(\" - skill-lock.json (replaced by pspm-lock.json)\");\n\t\tconsole.log(\" - .skills/ (replaced by .pspm/skills/)\");\n\t\tconsole.log(\"\");\n\t\tconsole.log(\"Update your .gitignore to include:\");\n\t\tconsole.log(\" .pspm/cache/\");\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 * as semver from \"semver\";\nimport type { SkillVersion } from \"../shared/types\";\n\n/**\n * Resolve the best matching version from a list of available versions\n */\nexport function resolveVersion(\n\trange: string,\n\tavailableVersions: string[],\n): string | null {\n\t// Sort versions in descending order\n\tconst sorted = availableVersions\n\t\t.filter((v) => semver.valid(v))\n\t\t.sort((a, b) => semver.rcompare(a, b));\n\n\t// If no range or \"latest\" specified, return the highest version\n\tif (!range || range === \"latest\") {\n\t\treturn sorted[0] ?? null;\n\t}\n\n\t// Find the highest version that satisfies the range\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 * Parse version range from a specifier string\n * Examples:\n * \"^1.0.0\" -> \"^1.0.0\"\n * \"~2.1.0\" -> \"~2.1.0\"\n * \">=1.0.0 <2.0.0\" -> \">=1.0.0 <2.0.0\"\n * \"1.2.3\" -> \"1.2.3\"\n * \"\" or undefined -> \"*\" (any version)\n */\nexport function normalizeVersionRange(range?: string): string {\n\tif (!range || range === \"latest\") {\n\t\treturn \"*\";\n\t}\n\treturn range;\n}\n\n/**\n * Select the best version from a list based on a range\n */\nexport function selectVersion(\n\tversions: SkillVersion[],\n\trange?: string,\n): SkillVersion | null {\n\tconst normalizedRange = normalizeVersionRange(range);\n\tconst versionStrings = versions.map((v) => v.version);\n\tconst resolved = resolveVersion(normalizedRange, versionStrings);\n\n\tif (!resolved) {\n\t\treturn null;\n\t}\n\n\treturn versions.find((v) => v.version === resolved) ?? null;\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","import type {\n\tGitHubLockfileEntry,\n\tLocalLockfileEntry,\n\tPspmLockfile,\n\tPspmLockfileEntry,\n\tPspmManifest,\n} from \"@repo/pspm-types\";\nimport { compareVersions, getLatestVersion, resolveVersion } from \"./resolver\";\n\n/**\n * Package type for outdated checking\n */\nexport type OutdatedPackageType = \"registry\" | \"github\" | \"local\";\n\n/**\n * Result of checking a single package for updates\n */\nexport interface OutdatedResult {\n\t/** Full specifier (e.g., \"@user/alice/my-skill\", \"github:org/repo/path\") */\n\tname: string;\n\t/** Currently installed version */\n\tcurrent: string;\n\t/** Latest version satisfying the version range from manifest */\n\twanted: string | null;\n\t/** Absolute latest version available */\n\tlatest: string | null;\n\t/** Package type */\n\ttype: OutdatedPackageType;\n\t/** Whether the package is outdated (current < wanted or current < latest) */\n\tisOutdated: boolean;\n\t/** Whether wanted version is outdated compared to latest */\n\twantedBehindLatest: boolean;\n\t/** Version range from manifest (if available) */\n\tversionRange?: string;\n\t/** Deprecation message if current version is deprecated */\n\tdeprecated?: string;\n}\n\n/**\n * Configuration for the outdated checker\n */\nexport interface OutdatedConfig {\n\t/** Base registry URL */\n\tregistryUrl: string;\n\t/** Optional API key for authentication */\n\tapiKey?: string;\n\t/** Optional GitHub token for checking GitHub packages */\n\tgithubToken?: string;\n}\n\n/**\n * Options for checking outdated packages\n */\nexport interface CheckOutdatedOptions {\n\t/** The lockfile to check */\n\tlockfile: PspmLockfile;\n\t/** Optional manifest with version ranges */\n\tmanifest?: PspmManifest;\n\t/** Whether to include up-to-date packages in results */\n\tincludeUpToDate?: boolean;\n\t/** Whether to include local packages in results */\n\tincludeLocal?: boolean;\n\t/** Specific packages to check (if not provided, checks all) */\n\tpackages?: string[];\n}\n\n/**\n * API response for skill versions endpoint\n */\ninterface SkillVersionResponse {\n\tid: string;\n\tskillId: string;\n\tversion: string;\n\tr2Key: string;\n\tchecksum: string;\n\tmanifest: Record<string, unknown>;\n\tpublishedAt: string;\n\tdeprecatedAt?: string | null;\n\tdeprecationMessage?: string | null;\n}\n\n/**\n * Create an outdated checker instance\n */\nexport function createOutdatedChecker(config: OutdatedConfig) {\n\tconst { registryUrl, apiKey, githubToken } = config;\n\n\tasync function fetchWithAuth(url: string, token?: string): Promise<Response> {\n\t\tconst headers: Record<string, string> = {};\n\t\tif (token) {\n\t\t\theaders.Authorization = `Bearer ${token}`;\n\t\t}\n\n\t\tconst response = await fetch(url, { headers });\n\n\t\tif (!response.ok) {\n\t\t\tconst text = await response.text();\n\t\t\tthrow new Error(`Request failed (${response.status}): ${text}`);\n\t\t}\n\n\t\treturn response;\n\t}\n\n\t/**\n\t * Fetch available versions for a registry package\n\t */\n\tasync function fetchRegistryVersions(\n\t\tusername: string,\n\t\tname: string,\n\t): Promise<SkillVersionResponse[]> {\n\t\tconst url = `${registryUrl}/@user/${username}/${name}/versions`;\n\t\tconst response = await fetchWithAuth(url, apiKey);\n\t\treturn (await response.json()) as SkillVersionResponse[];\n\t}\n\n\t/**\n\t * Check a single registry package for updates\n\t */\n\tasync function checkRegistryPackage(\n\t\tspecifier: string,\n\t\tentry: PspmLockfileEntry,\n\t\tversionRange?: string,\n\t): Promise<OutdatedResult> {\n\t\t// Parse @user/{username}/{name}\n\t\tconst match = specifier.match(/^@user\\/([^/]+)\\/([^/]+)$/);\n\t\tif (!match) {\n\t\t\tthrow new Error(`Invalid registry specifier: ${specifier}`);\n\t\t}\n\n\t\tconst [, username, name] = match;\n\n\t\ttry {\n\t\t\tconst versions = await fetchRegistryVersions(username, name);\n\t\t\tconst versionStrings = versions.map((v) => v.version);\n\n\t\t\t// Resolve wanted (best matching range) and latest\n\t\t\tconst range = versionRange || \"*\";\n\t\t\tconst wanted = resolveVersion(range, versionStrings);\n\t\t\tconst latest = getLatestVersion(versionStrings);\n\n\t\t\t// Check if current version is deprecated\n\t\t\tconst currentVersionInfo = versions.find(\n\t\t\t\t(v) => v.version === entry.version,\n\t\t\t);\n\t\t\tconst deprecated = currentVersionInfo?.deprecationMessage ?? undefined;\n\n\t\t\t// Determine if outdated\n\t\t\tconst isOutdated =\n\t\t\t\t(wanted !== null && compareVersions(entry.version, wanted) < 0) ||\n\t\t\t\t(latest !== null && compareVersions(entry.version, latest) < 0);\n\n\t\t\tconst wantedBehindLatest =\n\t\t\t\twanted !== null &&\n\t\t\t\tlatest !== null &&\n\t\t\t\tcompareVersions(wanted, latest) < 0;\n\n\t\t\treturn {\n\t\t\t\tname: specifier,\n\t\t\t\tcurrent: entry.version,\n\t\t\t\twanted,\n\t\t\t\tlatest,\n\t\t\t\ttype: \"registry\",\n\t\t\t\tisOutdated,\n\t\t\t\twantedBehindLatest,\n\t\t\t\tversionRange: range,\n\t\t\t\tdeprecated,\n\t\t\t};\n\t\t} catch {\n\t\t\t// If we can't fetch versions, return unknown state\n\t\t\treturn {\n\t\t\t\tname: specifier,\n\t\t\t\tcurrent: entry.version,\n\t\t\t\twanted: null,\n\t\t\t\tlatest: null,\n\t\t\t\ttype: \"registry\",\n\t\t\t\tisOutdated: false,\n\t\t\t\twantedBehindLatest: false,\n\t\t\t\tversionRange,\n\t\t\t};\n\t\t}\n\t}\n\n\t/**\n\t * Fetch latest commit for a GitHub ref\n\t */\n\tasync function fetchGitHubLatestCommit(\n\t\towner: string,\n\t\trepo: string,\n\t\tref: string,\n\t): Promise<string | null> {\n\t\ttry {\n\t\t\tconst url = `https://api.github.com/repos/${owner}/${repo}/commits/${ref}`;\n\t\t\tconst response = await fetchWithAuth(url, githubToken);\n\t\t\tconst data = (await response.json()) as { sha: string };\n\t\t\treturn data.sha;\n\t\t} catch {\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * Check a single GitHub package for updates\n\t */\n\tasync function checkGitHubPackage(\n\t\tspecifier: string,\n\t\tentry: GitHubLockfileEntry,\n\t): Promise<OutdatedResult> {\n\t\t// Parse github:{owner}/{repo}[/{path}]\n\t\tconst match = specifier.match(\n\t\t\t/^github:([a-zA-Z0-9_-]+)\\/([a-zA-Z0-9_.-]+)/,\n\t\t);\n\t\tif (!match) {\n\t\t\tthrow new Error(`Invalid GitHub specifier: ${specifier}`);\n\t\t}\n\n\t\tconst [, owner, repo] = match;\n\t\tconst ref = entry.gitRef || \"HEAD\";\n\n\t\tconst latestCommit = await fetchGitHubLatestCommit(owner, repo, ref);\n\t\tconst currentShort = entry.gitCommit.slice(0, 7);\n\t\tconst latestShort = latestCommit?.slice(0, 7) ?? null;\n\n\t\tconst isOutdated =\n\t\t\tlatestCommit !== null && entry.gitCommit !== latestCommit;\n\n\t\treturn {\n\t\t\tname: specifier,\n\t\t\tcurrent: currentShort,\n\t\t\twanted: latestShort,\n\t\t\tlatest: latestShort,\n\t\t\ttype: \"github\",\n\t\t\tisOutdated,\n\t\t\twantedBehindLatest: false,\n\t\t\tversionRange: ref,\n\t\t};\n\t}\n\n\t/**\n\t * Check a local package (always up-to-date)\n\t */\n\tfunction checkLocalPackage(\n\t\tspecifier: string,\n\t\t_entry: LocalLockfileEntry,\n\t): OutdatedResult {\n\t\treturn {\n\t\t\tname: specifier,\n\t\t\tcurrent: \"local\",\n\t\t\twanted: null,\n\t\t\tlatest: null,\n\t\t\ttype: \"local\",\n\t\t\tisOutdated: false,\n\t\t\twantedBehindLatest: false,\n\t\t};\n\t}\n\n\t/**\n\t * Check all packages for updates\n\t */\n\tasync function checkOutdated(\n\t\toptions: CheckOutdatedOptions,\n\t): Promise<OutdatedResult[]> {\n\t\tconst {\n\t\t\tlockfile,\n\t\t\tmanifest,\n\t\t\tincludeUpToDate = false,\n\t\t\tincludeLocal = false,\n\t\t\tpackages: filterPackages,\n\t\t} = options;\n\n\t\tconst results: OutdatedResult[] = [];\n\n\t\t// Check registry packages\n\t\tconst registryPackages = lockfile.packages || lockfile.skills || {};\n\t\tconst registryDeps = manifest?.dependencies || {};\n\n\t\tconst registryEntries = Object.entries(registryPackages).filter(\n\t\t\t([specifier]) => !filterPackages || filterPackages.includes(specifier),\n\t\t);\n\n\t\tconst registryResults = await Promise.all(\n\t\t\tregistryEntries.map(([specifier, entry]) =>\n\t\t\t\tcheckRegistryPackage(\n\t\t\t\t\tspecifier,\n\t\t\t\t\tentry as PspmLockfileEntry,\n\t\t\t\t\tregistryDeps[specifier],\n\t\t\t\t),\n\t\t\t),\n\t\t);\n\t\tresults.push(...registryResults);\n\n\t\t// Check GitHub packages\n\t\tconst githubPackages = lockfile.githubPackages || {};\n\n\t\tconst githubEntries = Object.entries(githubPackages).filter(\n\t\t\t([specifier]) => !filterPackages || filterPackages.includes(specifier),\n\t\t);\n\n\t\tconst githubResults = await Promise.all(\n\t\t\tgithubEntries.map(([specifier, entry]) =>\n\t\t\t\tcheckGitHubPackage(specifier, entry as GitHubLockfileEntry),\n\t\t\t),\n\t\t);\n\t\tresults.push(...githubResults);\n\n\t\t// Check local packages (if requested)\n\t\tif (includeLocal) {\n\t\t\tconst localPackages = lockfile.localPackages || {};\n\n\t\t\tconst localEntries = Object.entries(localPackages).filter(\n\t\t\t\t([specifier]) => !filterPackages || filterPackages.includes(specifier),\n\t\t\t);\n\n\t\t\tfor (const [specifier, entry] of localEntries) {\n\t\t\t\tresults.push(checkLocalPackage(specifier, entry as LocalLockfileEntry));\n\t\t\t}\n\t\t}\n\n\t\t// Filter results\n\t\tif (!includeUpToDate) {\n\t\t\treturn results.filter((r) => r.isOutdated);\n\t\t}\n\n\t\treturn results;\n\t}\n\n\treturn {\n\t\tcheckOutdated,\n\t\tcheckRegistryPackage,\n\t\tcheckGitHubPackage,\n\t\tcheckLocalPackage,\n\t\tfetchRegistryVersions,\n\t};\n}\n\n/**\n * Convenience function to check outdated packages\n */\nexport async function checkOutdated(\n\tconfig: OutdatedConfig,\n\toptions: CheckOutdatedOptions,\n): Promise<OutdatedResult[]> {\n\tconst checker = createOutdatedChecker(config);\n\treturn checker.checkOutdated(options);\n}\n","import {\n\tcheckOutdated as checkOutdatedFn,\n\ttype OutdatedResult,\n} from \"@repo/skill-registry/client\";\nimport { getTokenForRegistry, resolveConfig } from \"@/config\";\nimport { readLockfile } from \"@/lockfile\";\nimport { readManifest } from \"@/manifest\";\n\nexport interface OutdatedOptions {\n\tjson?: boolean;\n\tall?: boolean;\n}\n\nexport async function outdated(\n\tpackages: string[],\n\toptions: OutdatedOptions,\n): Promise<void> {\n\ttry {\n\t\tconst lockfile = await readLockfile();\n\t\tif (!lockfile) {\n\t\t\tconsole.log(\"No skills installed.\");\n\t\t\treturn;\n\t\t}\n\n\t\tconst hasPackages =\n\t\t\tObject.keys(lockfile.packages ?? lockfile.skills ?? {}).length > 0 ||\n\t\t\tObject.keys(lockfile.githubPackages ?? {}).length > 0 ||\n\t\t\tObject.keys(lockfile.localPackages ?? {}).length > 0;\n\n\t\tif (!hasPackages) {\n\t\t\tconsole.log(\"No skills installed.\");\n\t\t\treturn;\n\t\t}\n\n\t\tconst config = await resolveConfig();\n\t\tconst registryUrl = config.registryUrl;\n\t\tconst apiKey = getTokenForRegistry(config, registryUrl);\n\t\tconst githubToken = process.env.GITHUB_TOKEN;\n\n\t\tconst manifest = await readManifest();\n\n\t\tconsole.log(\"Checking for outdated packages...\\n\");\n\n\t\tconst results = await checkOutdatedFn(\n\t\t\t{ registryUrl, apiKey, githubToken },\n\t\t\t{\n\t\t\t\tlockfile,\n\t\t\t\tmanifest: manifest ?? undefined,\n\t\t\t\tincludeUpToDate: options.all,\n\t\t\t\tpackages: packages.length > 0 ? packages : undefined,\n\t\t\t},\n\t\t);\n\n\t\tif (results.length === 0) {\n\t\t\tconsole.log(\"All skills are up to date.\");\n\t\t\treturn;\n\t\t}\n\n\t\tif (options.json) {\n\t\t\tconsole.log(JSON.stringify(results, null, 2));\n\t\t} else {\n\t\t\tprintTable(results);\n\t\t}\n\n\t\t// Show deprecation warnings\n\t\tconst deprecated = results.filter((r) => r.deprecated);\n\t\tif (deprecated.length > 0) {\n\t\t\tconsole.log(\"\");\n\t\t\tfor (const r of deprecated) {\n\t\t\t\tconsole.log(`\\x1b[33m⚠ ${r.name}: ${r.deprecated}\\x1b[0m`);\n\t\t\t}\n\t\t}\n\n\t\t// Exit code 1 if any outdated packages (useful for CI)\n\t\tconst hasOutdated = results.some((r) => r.isOutdated);\n\t\tif (hasOutdated) {\n\t\t\tprocess.exitCode = 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\nfunction printTable(results: OutdatedResult[]): void {\n\t// Calculate column widths\n\tconst headers = [\"Package\", \"Current\", \"Wanted\", \"Latest\", \"Type\"];\n\tconst rows = results.map((r) => [\n\t\tr.name,\n\t\tr.current,\n\t\tr.wanted ?? \"—\",\n\t\tr.latest ?? \"—\",\n\t\tr.type,\n\t]);\n\n\tconst widths = headers.map((h, i) =>\n\t\tMath.max(h.length, ...rows.map((row) => row[i].length)),\n\t);\n\n\t// Print header\n\tconst headerLine = headers.map((h, i) => h.padEnd(widths[i])).join(\" \");\n\tconsole.log(headerLine);\n\tconsole.log(widths.map((w) => \"─\".repeat(w)).join(\"──\"));\n\n\t// Print rows\n\tfor (const row of rows) {\n\t\tconst line = row.map((cell, i) => cell.padEnd(widths[i])).join(\" \");\n\t\tconsole.log(line);\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 { createInterface } from \"node:readline\";\nimport { promisify } from \"node:util\";\nimport { configure, publishSkill } from \"@/api-client\";\nimport { getRegistryUrl, requireApiKey } from \"@/config\";\nimport { extractApiErrorMessage } from \"@/errors\";\nimport {\n\tALWAYS_IGNORED,\n\tDEFAULT_SKILL_FILES,\n\tgetExcludeArgsForRsync,\n\ttype IgnoreLoadResult,\n\tloadIgnorePatterns,\n\ttype ManifestDetectionResult,\n\ttype PspmManifest,\n\tvalidateManifest,\n} from \"@/lib/index\";\nimport type { SkillManifest } from \"@/sdk/generated\";\n\nconst exec = promisify(execCb);\n\n/**\n * Prompt user for yes/no confirmation\n */\nfunction confirm(question: string): Promise<boolean> {\n\treturn new Promise((resolve) => {\n\t\tconst rl = createInterface({\n\t\t\tinput: process.stdin,\n\t\t\toutput: process.stdout,\n\t\t});\n\n\t\trl.question(`${question} (y/N) `, (answer) => {\n\t\t\trl.close();\n\t\t\tconst normalized = answer.trim().toLowerCase();\n\t\t\tresolve(normalized === \"y\" || normalized === \"yes\");\n\t\t});\n\t});\n}\n\n/**\n * Detect and read manifest file (pspm.json or package.json)\n */\nasync function detectManifest(): Promise<ManifestDetectionResult> {\n\tconst cwd = process.cwd();\n\n\t// Try pspm.json first (preferred)\n\tconst pspmJsonPath = join(cwd, \"pspm.json\");\n\ttry {\n\t\tconst content = await readFile(pspmJsonPath, \"utf-8\");\n\t\tconst manifest = JSON.parse(content) as PspmManifest;\n\t\treturn { type: \"pspm.json\", manifest, path: pspmJsonPath };\n\t} catch {\n\t\t// pspm.json not found, try package.json\n\t}\n\n\t// Fall back to package.json\n\tconst packageJsonPath = join(cwd, \"package.json\");\n\ttry {\n\t\tconst content = await readFile(packageJsonPath, \"utf-8\");\n\t\tconst packageJson = JSON.parse(content);\n\n\t\t// Convert package.json to PspmManifest format\n\t\tconst manifest: PspmManifest = {\n\t\t\tname: packageJson.name,\n\t\t\tversion: packageJson.version,\n\t\t\tdescription: packageJson.description,\n\t\t\tauthor:\n\t\t\t\ttypeof packageJson.author === \"string\"\n\t\t\t\t\t? packageJson.author\n\t\t\t\t\t: packageJson.author?.name,\n\t\t\tlicense: packageJson.license,\n\t\t\tfiles: packageJson.files,\n\t\t\tdependencies: packageJson.dependencies,\n\t\t};\n\n\t\treturn { type: \"package.json\", manifest, path: packageJsonPath };\n\t} catch {\n\t\tthrow new Error(\"No pspm.json or package.json found in current directory\");\n\t}\n}\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\tignoreResult?: IgnoreLoadResult,\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 always-ignored directories (node_modules, .git, etc.)\n\t\t\tif (ALWAYS_IGNORED.includes(entry.name)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Check against ignore patterns if available\n\t\t\tif (ignoreResult?.ig) {\n\t\t\t\t// For directories, add trailing slash for proper matching\n\t\t\t\tconst pathToCheck = entry.isDirectory()\n\t\t\t\t\t? `${relativePath}/`\n\t\t\t\t\t: relativePath;\n\t\t\t\tif (ignoreResult.ig.ignores(pathToCheck)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (entry.isDirectory()) {\n\t\t\t\tconst subFiles = await getFilesWithSizes(\n\t\t\t\t\tfullPath,\n\t\t\t\t\tbaseDir,\n\t\t\t\t\tignoreResult,\n\t\t\t\t);\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\t/** Set package visibility during publish (required) */\n\taccess: \"public\" | \"private\";\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// Detect and read manifest (pspm.json preferred, package.json fallback)\n\t\tconst detection = await detectManifest();\n\t\tconst manifest = detection.manifest;\n\n\t\t// Warn if using package.json instead of pspm.json\n\t\tif (detection.type === \"package.json\") {\n\t\t\tconsole.log(\"pspm warn Using package.json instead of pspm.json\");\n\t\t\tconsole.log(\n\t\t\t\t\"pspm warn Run 'pspm init' to create a dedicated pspm.json manifest\",\n\t\t\t);\n\t\t\tconsole.log(\"\");\n\t\t}\n\n\t\t// Validate manifest\n\t\tconst validation = validateManifest(manifest);\n\t\tif (!validation.valid) {\n\t\t\tconsole.error(`Error: ${validation.error}`);\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\t// Validate SKILL.md exists\n\t\tconst skillMdPath = join(process.cwd(), \"SKILL.md\");\n\t\ttry {\n\t\t\tawait stat(skillMdPath);\n\t\t} catch {\n\t\t\tconsole.error(\n\t\t\t\t\"Error: SKILL.md is required. Create a SKILL.md file with your skill's documentation before publishing.\",\n\t\t\t);\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\t// Warn and confirm if publishing as public\n\t\tif (options.access === \"public\") {\n\t\t\tconsole.log(\"\");\n\t\t\tconsole.log(\"⚠️ Warning: You are about to publish this skill as PUBLIC.\");\n\t\t\tconsole.log(\n\t\t\t\t\" Once a skill is public, it CANNOT be made private again.\",\n\t\t\t);\n\t\t\tconsole.log(\" This action is irreversible.\");\n\t\t\tconsole.log(\"\");\n\n\t\t\tconst confirmed = await confirm(\"Do you want to continue?\");\n\t\t\tif (!confirmed) {\n\t\t\t\tconsole.log(\"Publish cancelled.\");\n\t\t\t\tprocess.exit(0);\n\t\t\t}\n\t\t\tconsole.log(\"\");\n\t\t}\n\n\t\t// Create a mutable copy for version bumping\n\t\tconst packageJson: SkillManifest = {\n\t\t\tname: manifest.name,\n\t\t\tversion: manifest.version,\n\t\t\tdescription: manifest.description,\n\t\t\tfiles: manifest.files,\n\t\t\tdependencies: manifest.dependencies,\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// Load ignore patterns (.pspmignore or .gitignore fallback)\n\t\tconst ignoreResult = await loadIgnorePatterns();\n\t\tif (ignoreResult.source) {\n\t\t\tconsole.log(\n\t\t\t\t`pspm notice Using ${ignoreResult.source} for ignore patterns`,\n\t\t\t);\n\t\t}\n\n\t\t// Build exclude arguments for rsync and tar using loaded patterns\n\t\tconst excludeArgs = getExcludeArgsForRsync(ignoreResult.patterns);\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 manifest or default)\n\t\t\tconst files = packageJson.files || [...DEFAULT_SKILL_FILES];\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 ignored patterns\n\t\t\t\t\tawait exec(\n\t\t\t\t\t\t`rsync -a ${excludeArgs} \"${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 the manifest file used for publishing\n\t\t\tif (detection.type === \"pspm.json\") {\n\t\t\t\tawait exec(`cp pspm.json \"${tempDir}/package/\"`);\n\t\t\t\t// Also include package.json if it exists (for npm compatibility)\n\t\t\t\ttry {\n\t\t\t\t\tawait stat(join(process.cwd(), \"package.json\"));\n\t\t\t\t\tawait exec(\n\t\t\t\t\t\t`cp package.json \"${tempDir}/package/\" 2>/dev/null || true`,\n\t\t\t\t\t);\n\t\t\t\t} catch {\n\t\t\t\t\t// No package.json, that's fine\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Using package.json as manifest\n\t\t\t\tawait exec(`cp package.json \"${tempDir}/package/\"`);\n\t\t\t}\n\n\t\t\t// Get list of files that will be included and their sizes\n\t\t\t// Apply ignore patterns to filter out ignored files\n\t\t\tconst packageDir = join(tempDir, \"package\");\n\t\t\tconst tarballContents = await getFilesWithSizes(\n\t\t\t\tpackageDir,\n\t\t\t\tpackageDir,\n\t\t\t\tignoreResult,\n\t\t\t);\n\t\t\tconst unpackedSize = tarballContents.reduce((acc, f) => acc + f.size, 0);\n\n\t\t\t// Create tarball (excluding ignored patterns)\n\t\t\tconst tarballPath = join(tempDir, tarballName);\n\t\t\tawait exec(\n\t\t\t\t`tar -czf \"${tarballPath}\" -C \"${tempDir}\" ${excludeArgs} 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// Enforce max tarball size (10MB)\n\t\t\tconst MAX_TARBALL_SIZE = 10 * 1024 * 1024;\n\t\t\tif (tarballSize > MAX_TARBALL_SIZE) {\n\t\t\t\tconsole.error(\"\");\n\t\t\t\tconsole.error(\n\t\t\t\t\t`Error: Package size ${formatBytes(tarballSize)} exceeds the maximum allowed size of ${formatBytes(MAX_TARBALL_SIZE)}.`,\n\t\t\t\t);\n\t\t\t\tconsole.error(\"\");\n\t\t\t\tconsole.error(\"To reduce the package size:\");\n\t\t\t\tconsole.error(\n\t\t\t\t\t' - Add a \"files\" field in your manifest to include only necessary files',\n\t\t\t\t);\n\t\t\t\tconsole.error(\" - Add patterns to .pspmignore to exclude large files\");\n\t\t\t\tconsole.error(\n\t\t\t\t\t\" - Remove build artifacts, tests, and documentation from the package\",\n\t\t\t\t);\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\n\t\t\t// Print publish preview\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\n\t\t\t// Ask user to confirm before publishing\n\t\t\tconst confirmed = await confirm(\n\t\t\t\t`Publish ${packageJson.name}@${packageJson.version} to ${registryUrl}?`,\n\t\t\t);\n\t\t\tif (!confirmed) {\n\t\t\t\tconsole.log(\"Publish cancelled.\");\n\t\t\t\tprocess.exit(0);\n\t\t\t}\n\n\t\t\tconsole.log(\"\");\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\tvisibility: options.access,\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\tconst visibility = result.skill.visibility;\n\t\t\tconst visibilityIcon = visibility === \"public\" ? \"🌐\" : \"🔒\";\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\tconsole.log(`Visibility: ${visibilityIcon} ${visibility}`);\n\n\t\t\tif (visibility === \"public\") {\n\t\t\t\tconsole.log(\n\t\t\t\t\t\"Note: Public packages cannot be made private. This is irreversible.\",\n\t\t\t\t);\n\t\t\t}\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","/**\n * Remove command - Remove an installed skill.\n *\n * Supports:\n * - Registry skills (by full specifier or short name)\n * - GitHub skills (by specifier or skill name)\n */\n\nimport { rm } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { getAvailableAgents } from \"@/agents\";\nimport { getSkillsDir } from \"@/config\";\nimport {\n\tgetGitHubSkillName,\n\tisGitHubSpecifier,\n\tparseGitHubSpecifier,\n} from \"@/lib/index\";\nimport {\n\tlistLockfileGitHubPackages,\n\tlistLockfileSkills,\n\tremoveFromLockfile,\n\tremoveGitHubFromLockfile,\n} from \"@/lockfile\";\nimport {\n\treadManifest,\n\tremoveDependency,\n\tremoveGitHubDependency,\n} from \"@/manifest\";\nimport { getGitHubSkillPath, removeAgentSymlinks } from \"@/symlinks\";\n\nexport async function remove(nameOrSpecifier: string): Promise<void> {\n\ttry {\n\t\t// Read manifest for agent config overrides\n\t\tconst manifest = await readManifest();\n\t\tconst agentConfigs = manifest?.agents;\n\t\tconst agents = getAvailableAgents(agentConfigs);\n\n\t\t// Determine type of specifier\n\t\tif (isGitHubSpecifier(nameOrSpecifier)) {\n\t\t\tawait removeGitHub(nameOrSpecifier, agents, agentConfigs);\n\t\t} else if (nameOrSpecifier.startsWith(\"@user/\")) {\n\t\t\tawait removeRegistry(nameOrSpecifier, agents, agentConfigs);\n\t\t} else {\n\t\t\t// Short name - try to find in either registry or GitHub skills\n\t\t\tawait removeByShortName(nameOrSpecifier, agents, agentConfigs);\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\n/**\n * Remove a registry skill by full specifier.\n */\nasync function removeRegistry(\n\tspecifier: string,\n\tagents: string[],\n\tagentConfigs?: Record<string, { skillsDir: string }>,\n): Promise<void> {\n\tconst match = specifier.match(/^@user\\/([^/]+)\\/([^@/]+)/);\n\tif (!match) {\n\t\tconsole.error(`Error: Invalid skill specifier: ${specifier}`);\n\t\tprocess.exit(1);\n\t}\n\n\tconst fullName = `@user/${match[1]}/${match[2]}`;\n\tconst username = match[1];\n\tconst name = match[2];\n\n\tconsole.log(`Removing ${fullName}...`);\n\n\t// Remove from lockfile\n\tconst removedFromLockfile = await removeFromLockfile(fullName);\n\n\t// Remove from pspm.json dependencies\n\tconst removedFromManifest = await removeDependency(fullName);\n\n\tif (!removedFromLockfile && !removedFromManifest) {\n\t\tconsole.error(`Error: ${fullName} not found in lockfile or pspm.json`);\n\t\tprocess.exit(1);\n\t}\n\n\t// Remove symlinks from all agents\n\tawait removeAgentSymlinks(name, {\n\t\tagents,\n\t\tprojectRoot: process.cwd(),\n\t\tagentConfigs,\n\t});\n\n\t// Remove from disk\n\tconst skillsDir = getSkillsDir();\n\tconst destDir = join(skillsDir, username, name);\n\n\ttry {\n\t\tawait rm(destDir, { recursive: true, force: true });\n\t} catch {\n\t\t// Ignore errors if directory doesn't exist\n\t}\n\n\tconsole.log(`Removed ${fullName}`);\n}\n\n/**\n * Remove a GitHub skill by specifier.\n */\nasync function removeGitHub(\n\tspecifier: string,\n\tagents: string[],\n\tagentConfigs?: Record<string, { skillsDir: string }>,\n): Promise<void> {\n\tconst parsed = parseGitHubSpecifier(specifier);\n\tif (!parsed) {\n\t\tconsole.error(`Error: Invalid GitHub specifier: ${specifier}`);\n\t\tprocess.exit(1);\n\t}\n\n\t// Build the lockfile key (without ref)\n\tconst lockfileKey = parsed.path\n\t\t? `github:${parsed.owner}/${parsed.repo}/${parsed.path}`\n\t\t: `github:${parsed.owner}/${parsed.repo}`;\n\n\tconsole.log(`Removing ${lockfileKey}...`);\n\n\t// Remove from lockfile\n\tconst removedFromLockfile = await removeGitHubFromLockfile(lockfileKey);\n\n\t// Remove from pspm.json githubDependencies\n\tconst removedFromManifest = await removeGitHubDependency(lockfileKey);\n\n\tif (!removedFromLockfile && !removedFromManifest) {\n\t\tconsole.error(`Error: ${lockfileKey} not found in lockfile or pspm.json`);\n\t\tprocess.exit(1);\n\t}\n\n\t// Remove symlinks from all agents\n\tconst skillName = getGitHubSkillName(parsed);\n\tawait removeAgentSymlinks(skillName, {\n\t\tagents,\n\t\tprojectRoot: process.cwd(),\n\t\tagentConfigs,\n\t});\n\n\t// Remove from disk\n\tconst skillsDir = getSkillsDir();\n\tconst destPath = getGitHubSkillPath(parsed.owner, parsed.repo, parsed.path);\n\tconst destDir = join(skillsDir, \"..\", destPath);\n\n\ttry {\n\t\tawait rm(destDir, { recursive: true, force: true });\n\t} catch {\n\t\t// Ignore errors if directory doesn't exist\n\t}\n\n\tconsole.log(`Removed ${lockfileKey}`);\n}\n\n/**\n * Remove a skill by short name (searches both registry and GitHub skills).\n */\nasync function removeByShortName(\n\tshortName: string,\n\tagents: string[],\n\tagentConfigs?: Record<string, { skillsDir: string }>,\n): Promise<void> {\n\t// First try to find in registry skills\n\tconst registrySkills = await listLockfileSkills();\n\tconst foundRegistry = registrySkills.find((s) => {\n\t\tconst match = s.name.match(/^@user\\/([^/]+)\\/([^/]+)$/);\n\t\treturn match && match[2] === shortName;\n\t});\n\n\tif (foundRegistry) {\n\t\tawait removeRegistry(foundRegistry.name, agents, agentConfigs);\n\t\treturn;\n\t}\n\n\t// Try to find in GitHub skills\n\tconst githubSkills = await listLockfileGitHubPackages();\n\tconst foundGitHub = githubSkills.find((s) => {\n\t\tconst parsed = parseGitHubSpecifier(s.specifier);\n\t\tif (!parsed) return false;\n\t\treturn getGitHubSkillName(parsed) === shortName;\n\t});\n\n\tif (foundGitHub) {\n\t\tawait removeGitHub(foundGitHub.specifier, agents, agentConfigs);\n\t\treturn;\n\t}\n\n\tconsole.error(`Error: Skill \"${shortName}\" not found in lockfile`);\n\tprocess.exit(1);\n}\n","import { configure, deleteSkill, deleteSkillVersion } from \"@/api-client\";\nimport { getRegistryUrl, requireApiKey } from \"@/config\";\nimport { extractApiErrorMessage } from \"@/errors\";\nimport { parseSkillSpecifier } from \"@/lib/index\";\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(username, 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(username, 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 { configure, listSkillVersions } from \"@/api-client\";\nimport { getTokenForRegistry, resolveConfig } from \"@/config\";\nimport { extractApiErrorMessage } from \"@/errors\";\nimport { resolveVersion } from \"@/lib/index\";\nimport { listLockfileSkills } from \"@/lockfile\";\nimport { add } from \"./add\";\n\nexport interface UpdateOptions {\n\tdryRun?: boolean;\n}\n\nexport async function update(options: UpdateOptions): Promise<void> {\n\ttry {\n\t\tconst config = await resolveConfig();\n\t\tconst registryUrl = config.registryUrl;\n\t\tconst apiKey = getTokenForRegistry(config, registryUrl);\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 - apiKey may be undefined for public packages\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 semver from \"semver\";\nimport { getManifestPath, readManifest, writeManifest } from \"@/manifest\";\n\nexport type VersionBump = \"major\" | \"minor\" | \"patch\";\n\nexport interface VersionOptions {\n\t/** If true, don't actually write the file (just show what would happen) */\n\tdryRun?: boolean;\n}\n\n/**\n * Bump the version in pspm.json\n *\n * Similar to `npm version major|minor|patch`\n */\nexport async function version(\n\tbump: VersionBump,\n\toptions: VersionOptions = {},\n): Promise<void> {\n\ttry {\n\t\t// Read existing manifest\n\t\tconst manifest = await readManifest();\n\n\t\tif (!manifest) {\n\t\t\tconsole.error(\"Error: No pspm.json found in current directory.\");\n\t\t\tconsole.error(\"Run 'pspm init' to create one.\");\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\tif (!manifest.version) {\n\t\t\tconsole.error(\"Error: pspm.json does not have a version field.\");\n\t\t\tconsole.error(\n\t\t\t\t'Add a version field (e.g., \"version\": \"0.1.0\") to your pspm.json.',\n\t\t\t);\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\t// Validate current version\n\t\tif (!semver.valid(manifest.version)) {\n\t\t\tconsole.error(\n\t\t\t\t`Error: Current version \"${manifest.version}\" is not valid semver.`,\n\t\t\t);\n\t\t\tconsole.error(\n\t\t\t\t'Fix the version in pspm.json to be valid semver (e.g., \"1.0.0\").',\n\t\t\t);\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\t// Bump the version\n\t\tconst newVersion = semver.inc(manifest.version, bump);\n\n\t\tif (!newVersion) {\n\t\t\tconsole.error(`Error: Failed to bump version from ${manifest.version}`);\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\tif (options.dryRun) {\n\t\t\tconsole.log(`Would bump version: ${manifest.version} → ${newVersion}`);\n\t\t\treturn;\n\t\t}\n\n\t\t// Update manifest with new version\n\t\tmanifest.version = newVersion;\n\t\tawait writeManifest(manifest);\n\n\t\tconsole.log(`v${newVersion}`);\n\t\tconsole.log(`Updated ${getManifestPath()}`);\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\";\nimport { getRegistryUrl, requireApiKey, resolveConfig } from \"@/config\";\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\taccess,\n\tadd,\n\tconfigInit,\n\tconfigShow,\n\tdeprecate,\n\tinit,\n\tinstall,\n\tlink,\n\tlist,\n\tlogin,\n\tlogout,\n\tmigrate,\n\toutdated,\n\tpublish,\n\tremove,\n\tunpublish,\n\tupdate,\n\tversion as versionCommand,\n\twhoami,\n} from \"./commands/index\";\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 AI coding agents\")\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// Project initialization commands\n// =============================================================================\n\nprogram\n\t.command(\"init\")\n\t.description(\"Create a new pspm.json manifest in the current directory\")\n\t.option(\"-n, --name <name>\", \"Skill name\")\n\t.option(\"-d, --description <desc>\", \"Skill description\")\n\t.option(\"-a, --author <author>\", \"Author name\")\n\t.option(\"-y, --yes\", \"Skip prompts and use defaults\")\n\t.option(\"-f, --force\", \"Overwrite existing pspm.json\")\n\t.action(async (options) => {\n\t\tawait init({\n\t\t\tname: options.name,\n\t\t\tdescription: options.description,\n\t\t\tauthor: options.author,\n\t\t\tyes: options.yes,\n\t\t\tforce: options.force,\n\t\t});\n\t});\n\nprogram\n\t.command(\"migrate\")\n\t.description(\n\t\t\"Migrate from old directory structure (.skills/, skill-lock.json)\",\n\t)\n\t.option(\"--dry-run\", \"Show what would be migrated without making changes\")\n\t.action(async (options) => {\n\t\tawait migrate({ dryRun: options.dryRun });\n\t});\n\n// =============================================================================\n// Skill management commands\n// =============================================================================\n\nprogram\n\t.command(\"add <specifiers...>\")\n\t.description(\n\t\t\"Add one or more skills (e.g., @user/bsheng/vite_slides@^2.0.0 or github:owner/repo/path@ref)\",\n\t)\n\t.option(\"--save\", \"Save to lockfile (default)\")\n\t.option(\n\t\t\"--agent <agents>\",\n\t\t'Comma-separated agents for symlinks (default: all agents, use \"none\" to skip)',\n\t)\n\t.option(\"-y, --yes\", \"Skip agent selection prompt and use defaults\")\n\t.action(async (specifiers, options) => {\n\t\tawait add(specifiers, {\n\t\t\tsave: options.save ?? true,\n\t\t\tagent: options.agent,\n\t\t\tyes: options.yes,\n\t\t});\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 [specifiers...]\")\n\t.alias(\"i\")\n\t.description(\n\t\t\"Install skills from lockfile, or add and install specific packages\",\n\t)\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.option(\n\t\t\"--agent <agents>\",\n\t\t'Comma-separated agents for symlinks (default: all agents, use \"none\" to skip)',\n\t)\n\t.option(\"-y, --yes\", \"Skip agent selection prompt and use defaults\")\n\t.action(async (specifiers, options) => {\n\t\tawait install(specifiers, {\n\t\t\tfrozenLockfile: options.frozenLockfile,\n\t\t\tdir: options.dir,\n\t\t\tagent: options.agent,\n\t\t\tyes: options.yes,\n\t\t});\n\t});\n\nprogram\n\t.command(\"link\")\n\t.description(\"Recreate agent symlinks without reinstalling\")\n\t.option(\n\t\t\"--agent <agents>\",\n\t\t'Comma-separated agents for symlinks (default: all agents, use \"none\" to skip)',\n\t)\n\t.option(\"-y, --yes\", \"Skip agent selection prompt and use defaults\")\n\t.action(async (options) => {\n\t\tawait link({ agent: options.agent, yes: options.yes });\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\nprogram\n\t.command(\"outdated [packages...]\")\n\t.description(\"Check for outdated skills\")\n\t.option(\"--json\", \"Output as JSON\")\n\t.option(\"--all\", \"Include up-to-date packages\")\n\t.action(async (packages: string[], options) => {\n\t\tawait outdated(packages, { json: options.json, all: options.all });\n\t});\n\n// =============================================================================\n// Publishing commands\n// =============================================================================\n\nprogram\n\t.command(\"version <bump>\")\n\t.description(\"Bump package version (major, minor, patch)\")\n\t.option(\"--dry-run\", \"Show what would be changed without writing\")\n\t.action(async (bump: string, options) => {\n\t\tconst validBumps = [\"major\", \"minor\", \"patch\"];\n\t\tif (!validBumps.includes(bump)) {\n\t\t\tconsole.error(`Error: Invalid version bump \"${bump}\".`);\n\t\t\tconsole.error(\"Must be one of: major, minor, patch\");\n\t\t\tprocess.exit(1);\n\t\t}\n\t\tawait versionCommand(bump as \"major\" | \"minor\" | \"patch\", {\n\t\t\tdryRun: options.dryRun,\n\t\t});\n\t});\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.requiredOption(\n\t\t\"--access <level>\",\n\t\t\"Set package visibility (public or private)\",\n\t)\n\t.action(async (options) => {\n\t\tconst access = options.access as string;\n\t\tif (access !== \"public\" && access !== \"private\") {\n\t\t\tconsole.error('Error: --access must be \"public\" or \"private\"');\n\t\t\tprocess.exit(1);\n\t\t}\n\t\tawait publish({\n\t\t\tbump: options.bump as \"major\" | \"minor\" | \"patch\" | undefined,\n\t\t\ttag: options.tag,\n\t\t\taccess,\n\t\t});\n\t});\n\nprogram\n\t.command(\"unpublish <specifier>\")\n\t.description(\n\t\t\"Remove a published skill version (only within 72 hours of publishing)\",\n\t)\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\n\t.command(\"access [specifier]\")\n\t.description(\"Change package visibility (public/private)\")\n\t.option(\"--public\", \"Make the package public (irreversible)\")\n\t.option(\"--private\", \"Make the package private (only for private packages)\")\n\t.action(async (specifier, options) => {\n\t\tawait access(specifier, {\n\t\t\tpublic: options.public,\n\t\t\tprivate: options.private,\n\t\t});\n\t});\n\nprogram\n\t.command(\"deprecate <specifier> [message]\")\n\t.description(\n\t\t\"Mark a skill version as deprecated (alternative to unpublish after 72 hours)\",\n\t)\n\t.option(\"--undo\", \"Remove deprecation status\")\n\t.action(async (specifier, message, options) => {\n\t\tawait deprecate(specifier, message, { undo: options.undo });\n\t});\n\nprogram.parse();\n"]}