@anytio/pspm 0.9.0 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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/wellknown.ts","../src/commands/add.ts","../src/commands/access.ts","../src/commands/index.ts","../src/commands/audit.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/search.ts","../src/commands/unpublish.ts","../src/commands/update.ts","../src/commands/upgrade.ts","../src/commands/version.ts","../src/commands/whoami.ts","../src/update-notifier.ts","../src/index.ts"],"names":["version","configure","config","join","readFile","mkdir","writeFile","exec","promisify","pathExists","stat","dirname","init_lockfile","homedir","init_manifest","lstat","rm","isLocalSpecifier","relative","symlink","totalPackages","resolve","basename","confirm","createHash","setGlobalMode","add","access","URL","exchangeCliToken","readdir","resolveVersion","semver2","compareVersions","getLatestVersion","valid","checkOutdated","execCb","createInterface","packageJson","semver","execSync","__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// Global Mode\n// =============================================================================\n\nlet _globalMode = false;\n\n/**\n * Set global mode. When enabled, all path functions return\n * home-directory paths (~/.pspm/) instead of project-relative paths.\n */\nexport function setGlobalMode(global: boolean): void {\n\t_globalMode = global;\n}\n\n/**\n * Check if global mode is enabled.\n */\nexport function isGlobalMode(): boolean {\n\treturn _globalMode;\n}\n\n/**\n * Get the .pspm directory path\n * Global: ~/.pspm/\n * Project: ./.pspm/\n */\nexport function getPspmDir(): string {\n\tif (_globalMode) return join(homedir(), \".pspm\");\n\treturn join(process.cwd(), \".pspm\");\n}\n\n/**\n * Get the skills directory path\n * Global: ~/.pspm/skills/\n * Project: ./.pspm/skills/\n */\nexport function getSkillsDir(): string {\n\treturn join(getPspmDir(), \"skills\");\n}\n\n/**\n * Get the cache directory path\n * Global: ~/.pspm/cache/\n * Project: ./.pspm/cache/\n */\nexport function getCacheDir(): string {\n\treturn join(getPspmDir(), \"cache\");\n}\n\n/**\n * Get the lockfile path\n * Global: ~/.pspm/pspm-lock.json\n * Project: ./pspm-lock.json\n */\nexport function getLockfilePath(): string {\n\tif (_globalMode) return join(homedir(), \".pspm\", \"pspm-lock.json\");\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 | 5;\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 packages from well-known endpoints (v5+ format) */\n\twellKnownPackages?: Record<string, WellKnownLockfileEntry>;\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/**\n * Lockfile entry for a well-known package.\n * Key format in wellKnownPackages: \"https://hostname#skill-name\"\n */\nexport interface WellKnownLockfileEntry {\n\t/** Always \"well-known\" for well-known packages */\n\tversion: \"well-known\";\n\t/** URL to the SKILL.md file */\n\tresolved: string;\n\t/** Integrity hash of all file contents */\n\tintegrity: string;\n\t/** Source hostname */\n\thostname: string;\n\t/** Skill name */\n\tname: string;\n\t/** List of files included */\n\tfiles: 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| \"adal\"\n\t| \"amp\"\n\t| \"antigravity\"\n\t| \"augment\"\n\t| \"claude-code\"\n\t| \"cline\"\n\t| \"codebuddy\"\n\t| \"codex\"\n\t| \"command-code\"\n\t| \"continue\"\n\t| \"cortex\"\n\t| \"crush\"\n\t| \"cursor\"\n\t| \"droid\"\n\t| \"gemini-cli\"\n\t| \"github-copilot\"\n\t| \"goose\"\n\t| \"iflow-cli\"\n\t| \"junie\"\n\t| \"kilo\"\n\t| \"kimi-cli\"\n\t| \"kiro-cli\"\n\t| \"kode\"\n\t| \"mcpjam\"\n\t| \"mistral-vibe\"\n\t| \"mux\"\n\t| \"neovate\"\n\t| \"openclaw\"\n\t| \"opencode\"\n\t| \"openhands\"\n\t| \"pi\"\n\t| \"pochi\"\n\t| \"qoder\"\n\t| \"qwen-code\"\n\t| \"replit\"\n\t| \"roo\"\n\t| \"trae\"\n\t| \"trae-cn\"\n\t| \"universal\"\n\t| \"windsurf\"\n\t| \"zencoder\";\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 * Well-known skill dependencies from HTTPS domains.\n\t *\n\t * Skills hosted at /.well-known/skills/ on any domain.\n\t * Key is the base URL, value is an array of skill names (or \"*\" for all).\n\t *\n\t * @example\n\t * ```json\n\t * {\n\t * \"wellKnownDependencies\": {\n\t * \"https://acme.com\": [\"code-review\", \"api-design\"],\n\t * \"https://docs.stripe.com\": \"*\"\n\t * }\n\t * }\n\t * ```\n\t */\n\twellKnownDependencies?: Record<string, 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\twellKnownDependencies: manifest.wellKnownDependencies ?? {},\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 (github: prefix)\n */\nexport function isGitHubSpecifier(specifier: string): boolean {\n\treturn specifier.startsWith(\"github:\");\n}\n\n// =============================================================================\n// GitHub URL and Shorthand Support\n// =============================================================================\n\n/**\n * GitHub URL patterns\n *\n * Matches:\n * - https://github.com/owner/repo/tree/branch/path/to/skill\n * - https://github.com/owner/repo/tree/branch\n * - https://github.com/owner/repo\n * - https://github.com/owner/repo.git\n */\nconst GITHUB_URL_TREE_PATTERN =\n\t/^https?:\\/\\/github\\.com\\/([^/]+)\\/([^/]+)\\/tree\\/([^/]+)(?:\\/(.+))?$/;\nconst GITHUB_URL_PATTERN =\n\t/^https?:\\/\\/github\\.com\\/([^/]+)\\/([^/]+?)(?:\\.git)?\\/?$/;\n\n/**\n * GitHub shorthand pattern: owner/repo or owner/repo/path\n * Must not contain :, not start with . / or @\n */\nconst GITHUB_SHORTHAND_PATTERN =\n\t/^([a-zA-Z0-9_-]+)\\/([a-zA-Z0-9_.-]+)(?:\\/(.+))?$/;\n\n/**\n * Check if a string is a GitHub URL (https://github.com/...)\n */\nexport function isGitHubUrl(input: string): boolean {\n\treturn /^https?:\\/\\/github\\.com\\/[^/]+\\/[^/]+/.test(input);\n}\n\n/**\n * Parse a GitHub URL into a GitHubSpecifier.\n *\n * Supports:\n * - https://github.com/owner/repo\n * - https://github.com/owner/repo.git\n * - https://github.com/owner/repo/tree/branch\n * - https://github.com/owner/repo/tree/branch/path/to/skill\n *\n * @example\n * ```typescript\n * parseGitHubUrl(\"https://github.com/vercel-labs/agent-skills/tree/main/skills/web-design\")\n * // => { owner: \"vercel-labs\", repo: \"agent-skills\", ref: \"main\", path: \"skills/web-design\" }\n *\n * parseGitHubUrl(\"https://github.com/vercel-labs/agent-skills\")\n * // => { owner: \"vercel-labs\", repo: \"agent-skills\" }\n * ```\n */\nexport function parseGitHubUrl(input: string): GitHubSpecifier | null {\n\t// Try tree URL first (more specific)\n\tconst treeMatch = input.match(GITHUB_URL_TREE_PATTERN);\n\tif (treeMatch) {\n\t\tconst [, owner, repo, ref, path] = treeMatch;\n\t\tif (!owner || !repo || !ref) return null;\n\t\treturn {\n\t\t\towner,\n\t\t\trepo,\n\t\t\tref,\n\t\t\tpath: path || undefined,\n\t\t};\n\t}\n\n\t// Plain repo URL\n\tconst repoMatch = input.match(GITHUB_URL_PATTERN);\n\tif (repoMatch) {\n\t\tconst [, owner, repo] = repoMatch;\n\t\tif (!owner || !repo) return null;\n\t\treturn { owner, repo };\n\t}\n\n\treturn null;\n}\n\n/**\n * Check if a string is a GitHub shorthand (owner/repo or owner/repo/path).\n *\n * Must not contain colons (protocol prefix), not start with `.`, `/`, or `@`.\n * This avoids conflicts with local paths, registry specifiers, and URLs.\n */\nexport function isGitHubShorthand(input: string): boolean {\n\tif (\n\t\tinput.includes(\":\") ||\n\t\tinput.startsWith(\".\") ||\n\t\tinput.startsWith(\"/\") ||\n\t\tinput.startsWith(\"@\")\n\t) {\n\t\treturn false;\n\t}\n\treturn GITHUB_SHORTHAND_PATTERN.test(input);\n}\n\n/**\n * Parse a GitHub shorthand into a GitHubSpecifier.\n *\n * Supports:\n * - owner/repo\n * - owner/repo/path/to/skill\n *\n * @example\n * ```typescript\n * parseGitHubShorthand(\"vercel-labs/agent-skills\")\n * // => { owner: \"vercel-labs\", repo: \"agent-skills\" }\n *\n * parseGitHubShorthand(\"vercel-labs/agent-skills/skills/web-design\")\n * // => { owner: \"vercel-labs\", repo: \"agent-skills\", path: \"skills/web-design\" }\n * ```\n */\nexport function parseGitHubShorthand(input: string): GitHubSpecifier | null {\n\tif (\n\t\tinput.includes(\":\") ||\n\t\tinput.startsWith(\".\") ||\n\t\tinput.startsWith(\"/\") ||\n\t\tinput.startsWith(\"@\")\n\t) {\n\t\treturn null;\n\t}\n\n\tconst match = input.match(GITHUB_SHORTHAND_PATTERN);\n\tif (!match) return null;\n\n\tconst [, owner, repo, path] = match;\n\tif (!owner || !repo) return null;\n\n\treturn {\n\t\towner,\n\t\trepo,\n\t\tpath: path || undefined,\n\t};\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\ttype WellKnownLockfileEntry,\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\tisGitHubShorthand,\n\tisGitHubSpecifier,\n\tisGitHubUrl,\n\tparseGitHubShorthand,\n\tparseGitHubSpecifier,\n\tparseGitHubUrl,\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 (project-level, relative to project root) */\n\tskillsDir: string;\n\t/** Global skills directory path (relative to home directory) */\n\tglobalSkillsDir: 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\tadal: {\n\t\tdisplayName: \"AdaL\",\n\t\tskillsDir: \".adal/skills\",\n\t\tglobalSkillsDir: \".adal/skills\",\n\t},\n\tamp: {\n\t\tdisplayName: \"Amp\",\n\t\tskillsDir: \".agents/skills\",\n\t\tglobalSkillsDir: \".config/agents/skills\",\n\t},\n\tantigravity: {\n\t\tdisplayName: \"Antigravity\",\n\t\tskillsDir: \".agent/skills\",\n\t\tglobalSkillsDir: \".gemini/antigravity/skills\",\n\t},\n\taugment: {\n\t\tdisplayName: \"Augment\",\n\t\tskillsDir: \".augment/skills\",\n\t\tglobalSkillsDir: \".augment/skills\",\n\t},\n\t\"claude-code\": {\n\t\tdisplayName: \"Claude Code\",\n\t\tskillsDir: \".claude/skills\",\n\t\tglobalSkillsDir: \".claude/skills\",\n\t},\n\tcline: {\n\t\tdisplayName: \"Cline\",\n\t\tskillsDir: \".agents/skills\",\n\t\tglobalSkillsDir: \".agents/skills\",\n\t},\n\tcodebuddy: {\n\t\tdisplayName: \"CodeBuddy\",\n\t\tskillsDir: \".codebuddy/skills\",\n\t\tglobalSkillsDir: \".codebuddy/skills\",\n\t},\n\tcodex: {\n\t\tdisplayName: \"Codex\",\n\t\tskillsDir: \".agents/skills\",\n\t\tglobalSkillsDir: \".codex/skills\",\n\t},\n\t\"command-code\": {\n\t\tdisplayName: \"Command Code\",\n\t\tskillsDir: \".commandcode/skills\",\n\t\tglobalSkillsDir: \".commandcode/skills\",\n\t},\n\tcontinue: {\n\t\tdisplayName: \"Continue\",\n\t\tskillsDir: \".continue/skills\",\n\t\tglobalSkillsDir: \".continue/skills\",\n\t},\n\tcortex: {\n\t\tdisplayName: \"Cortex Code\",\n\t\tskillsDir: \".cortex/skills\",\n\t\tglobalSkillsDir: \".snowflake/cortex/skills\",\n\t},\n\tcrush: {\n\t\tdisplayName: \"Crush\",\n\t\tskillsDir: \".crush/skills\",\n\t\tglobalSkillsDir: \".config/crush/skills\",\n\t},\n\tcursor: {\n\t\tdisplayName: \"Cursor\",\n\t\tskillsDir: \".agents/skills\",\n\t\tglobalSkillsDir: \".cursor/skills\",\n\t},\n\tdroid: {\n\t\tdisplayName: \"Droid\",\n\t\tskillsDir: \".factory/skills\",\n\t\tglobalSkillsDir: \".factory/skills\",\n\t},\n\t\"gemini-cli\": {\n\t\tdisplayName: \"Gemini CLI\",\n\t\tskillsDir: \".agents/skills\",\n\t\tglobalSkillsDir: \".gemini/skills\",\n\t},\n\t\"github-copilot\": {\n\t\tdisplayName: \"GitHub Copilot\",\n\t\tskillsDir: \".agents/skills\",\n\t\tglobalSkillsDir: \".copilot/skills\",\n\t},\n\tgoose: {\n\t\tdisplayName: \"Goose\",\n\t\tskillsDir: \".goose/skills\",\n\t\tglobalSkillsDir: \".config/goose/skills\",\n\t},\n\t\"iflow-cli\": {\n\t\tdisplayName: \"iFlow CLI\",\n\t\tskillsDir: \".iflow/skills\",\n\t\tglobalSkillsDir: \".iflow/skills\",\n\t},\n\tjunie: {\n\t\tdisplayName: \"Junie\",\n\t\tskillsDir: \".junie/skills\",\n\t\tglobalSkillsDir: \".junie/skills\",\n\t},\n\tkilo: {\n\t\tdisplayName: \"Kilo Code\",\n\t\tskillsDir: \".kilocode/skills\",\n\t\tglobalSkillsDir: \".kilocode/skills\",\n\t},\n\t\"kimi-cli\": {\n\t\tdisplayName: \"Kimi Code CLI\",\n\t\tskillsDir: \".agents/skills\",\n\t\tglobalSkillsDir: \".config/agents/skills\",\n\t},\n\t\"kiro-cli\": {\n\t\tdisplayName: \"Kiro CLI\",\n\t\tskillsDir: \".kiro/skills\",\n\t\tglobalSkillsDir: \".kiro/skills\",\n\t},\n\tkode: {\n\t\tdisplayName: \"Kode\",\n\t\tskillsDir: \".kode/skills\",\n\t\tglobalSkillsDir: \".kode/skills\",\n\t},\n\tmcpjam: {\n\t\tdisplayName: \"MCPJam\",\n\t\tskillsDir: \".mcpjam/skills\",\n\t\tglobalSkillsDir: \".mcpjam/skills\",\n\t},\n\t\"mistral-vibe\": {\n\t\tdisplayName: \"Mistral Vibe\",\n\t\tskillsDir: \".vibe/skills\",\n\t\tglobalSkillsDir: \".vibe/skills\",\n\t},\n\tmux: {\n\t\tdisplayName: \"Mux\",\n\t\tskillsDir: \".mux/skills\",\n\t\tglobalSkillsDir: \".mux/skills\",\n\t},\n\tneovate: {\n\t\tdisplayName: \"Neovate\",\n\t\tskillsDir: \".neovate/skills\",\n\t\tglobalSkillsDir: \".neovate/skills\",\n\t},\n\topenclaw: {\n\t\tdisplayName: \"OpenClaw\",\n\t\tskillsDir: \"skills\",\n\t\tglobalSkillsDir: \".openclaw/skills\",\n\t},\n\topencode: {\n\t\tdisplayName: \"OpenCode\",\n\t\tskillsDir: \".agents/skills\",\n\t\tglobalSkillsDir: \".config/opencode/skills\",\n\t},\n\topenhands: {\n\t\tdisplayName: \"OpenHands\",\n\t\tskillsDir: \".openhands/skills\",\n\t\tglobalSkillsDir: \".openhands/skills\",\n\t},\n\tpi: {\n\t\tdisplayName: \"Pi\",\n\t\tskillsDir: \".pi/skills\",\n\t\tglobalSkillsDir: \".pi/agent/skills\",\n\t},\n\tpochi: {\n\t\tdisplayName: \"Pochi\",\n\t\tskillsDir: \".pochi/skills\",\n\t\tglobalSkillsDir: \".pochi/skills\",\n\t},\n\tqoder: {\n\t\tdisplayName: \"Qoder\",\n\t\tskillsDir: \".qoder/skills\",\n\t\tglobalSkillsDir: \".qoder/skills\",\n\t},\n\t\"qwen-code\": {\n\t\tdisplayName: \"Qwen Code\",\n\t\tskillsDir: \".qwen/skills\",\n\t\tglobalSkillsDir: \".qwen/skills\",\n\t},\n\treplit: {\n\t\tdisplayName: \"Replit\",\n\t\tskillsDir: \".agents/skills\",\n\t\tglobalSkillsDir: \".config/agents/skills\",\n\t},\n\troo: {\n\t\tdisplayName: \"Roo Code\",\n\t\tskillsDir: \".roo/skills\",\n\t\tglobalSkillsDir: \".roo/skills\",\n\t},\n\ttrae: {\n\t\tdisplayName: \"Trae\",\n\t\tskillsDir: \".trae/skills\",\n\t\tglobalSkillsDir: \".trae/skills\",\n\t},\n\t\"trae-cn\": {\n\t\tdisplayName: \"Trae CN\",\n\t\tskillsDir: \".trae/skills\",\n\t\tglobalSkillsDir: \".trae-cn/skills\",\n\t},\n\tuniversal: {\n\t\tdisplayName: \"Universal\",\n\t\tskillsDir: \".agents/skills\",\n\t\tglobalSkillsDir: \".config/agents/skills\",\n\t},\n\twindsurf: {\n\t\tdisplayName: \"Windsurf\",\n\t\tskillsDir: \".windsurf/skills\",\n\t\tglobalSkillsDir: \".codeium/windsurf/skills\",\n\t},\n\tzencoder: {\n\t\tdisplayName: \"Zencoder\",\n\t\tskillsDir: \".zencoder/skills\",\n\t\tglobalSkillsDir: \".zencoder/skills\",\n\t},\n};\n\n/**\n * Default agent configurations (AgentConfig format).\n */\nexport const DEFAULT_AGENT_CONFIGS: Record<BuiltInAgent, AgentConfig> =\n\tObject.fromEntries(\n\t\tObject.entries(AGENT_INFO).map(([key, info]) => [\n\t\t\tkey,\n\t\t\t{ skillsDir: info.skillsDir },\n\t\t]),\n\t) as Record<BuiltInAgent, AgentConfig>;\n\n/**\n * All built-in agent names in display order.\n */\nexport const ALL_AGENTS: BuiltInAgent[] = Object.keys(\n\tAGENT_INFO,\n).sort() as BuiltInAgent[];\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 * @param global - If true, return global paths instead of project paths\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(\"claude-code\", undefined, true)\n * // => { skillsDir: \".claude/skills\" } (global path, used relative to ~)\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\tglobal?: boolean,\n): AgentConfig | null {\n\t// Check overrides first (not applicable for global)\n\tif (!global && overrides?.[name]) {\n\t\treturn overrides[name];\n\t}\n\n\t// Check built-in defaults\n\tif (name in AGENT_INFO) {\n\t\tconst info = AGENT_INFO[name as BuiltInAgent];\n\t\treturn {\n\t\t\tskillsDir: global ? info.globalSkillsDir : info.skillsDir,\n\t\t};\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 * // => [...ALL_AGENTS]\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\ttype WellKnownLockfileEntry,\n} from \"./lib/index\";\n\n// Re-export types for backward compatibility\nexport type {\n\tGitHubLockfileEntry,\n\tLocalLockfileEntry,\n\tPspmLockfile,\n\tPspmLockfileEntry,\n\tWellKnownLockfileEntry,\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\t// Only include wellKnownPackages if there are entries\n\tif (\n\t\tlockfile.wellKnownPackages &&\n\t\tObject.keys(lockfile.wellKnownPackages).length > 0\n\t) {\n\t\tnormalized.wellKnownPackages = lockfile.wellKnownPackages;\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\n// =============================================================================\n// Well-Known Package Support\n// =============================================================================\n\n/**\n * Add a well-known package to the lockfile\n */\nexport async function addWellKnownToLockfile(\n\tspecifier: string,\n\tentry: WellKnownLockfileEntry,\n): Promise<void> {\n\tlet lockfile = await readLockfile();\n\tif (!lockfile) {\n\t\tlockfile = await createEmptyLockfile();\n\t}\n\n\tif (!lockfile.wellKnownPackages) {\n\t\tlockfile.wellKnownPackages = {};\n\t}\n\n\tlockfile.wellKnownPackages[specifier] = entry;\n\tawait writeLockfile(lockfile);\n}\n\n/**\n * Remove a well-known package from the lockfile\n */\nexport async function removeWellKnownFromLockfile(\n\tspecifier: string,\n): Promise<boolean> {\n\tconst lockfile = await readLockfile();\n\tif (!lockfile?.wellKnownPackages?.[specifier]) {\n\t\treturn false;\n\t}\n\n\tdelete lockfile.wellKnownPackages[specifier];\n\tawait writeLockfile(lockfile);\n\treturn true;\n}\n\n/**\n * List all well-known packages in the lockfile\n */\nexport async function listLockfileWellKnownPackages(): Promise<\n\tArray<{ specifier: string; entry: WellKnownLockfileEntry }>\n> {\n\tconst lockfile = await readLockfile();\n\tif (!lockfile?.wellKnownPackages) {\n\t\treturn [];\n\t}\n\n\treturn Object.entries(lockfile.wellKnownPackages).map(\n\t\t([specifier, entry]) => ({\n\t\t\tspecifier,\n\t\t\tentry: entry as WellKnownLockfileEntry,\n\t\t}),\n\t);\n}\n","import { readFile, writeFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { isGlobalMode } from \"./config\";\nimport type { PspmManifest } from \"./lib/index\";\n\n/**\n * Get the manifest file path\n * Global: ~/.pspm/pspm.json\n * Project: ./pspm.json\n */\nexport function getManifestPath(): string {\n\tif (isGlobalMode()) {\n\t\treturn join(homedir(), \".pspm\", \"pspm.json\");\n\t}\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// =============================================================================\n// Well-Known Dependency Support\n// =============================================================================\n\n/**\n * Get all well-known dependencies from the manifest\n */\nexport async function getWellKnownDependencies(): Promise<\n\tRecord<string, string[] | string>\n> {\n\tconst manifest = await readManifest();\n\treturn manifest?.wellKnownDependencies ?? {};\n}\n\n/**\n * Add a well-known dependency to the manifest\n *\n * @param baseUrl - The well-known base URL (e.g., \"https://acme.com\")\n * @param skillNames - Skill names to add (e.g., [\"code-review\"])\n */\nexport async function addWellKnownDependency(\n\tbaseUrl: string,\n\tskillNames: string[],\n): Promise<void> {\n\tconst manifest = await ensureManifest();\n\n\tif (!manifest.wellKnownDependencies) {\n\t\tmanifest.wellKnownDependencies = {};\n\t}\n\n\tconst existing = manifest.wellKnownDependencies[baseUrl];\n\tif (Array.isArray(existing)) {\n\t\t// Merge with existing, dedup\n\t\tconst merged = [...new Set([...existing, ...skillNames])];\n\t\tmanifest.wellKnownDependencies[baseUrl] = merged;\n\t} else {\n\t\tmanifest.wellKnownDependencies[baseUrl] = skillNames;\n\t}\n\n\tawait writeManifest(manifest);\n}\n\n/**\n * Remove a well-known dependency from the manifest\n */\nexport async function removeWellKnownDependency(\n\tbaseUrl: string,\n\tskillName?: string,\n): Promise<boolean> {\n\tconst manifest = await readManifest();\n\n\tif (!manifest?.wellKnownDependencies?.[baseUrl]) {\n\t\treturn false;\n\t}\n\n\tif (skillName) {\n\t\tconst existing = manifest.wellKnownDependencies[baseUrl];\n\t\tif (Array.isArray(existing)) {\n\t\t\tmanifest.wellKnownDependencies[baseUrl] = existing.filter(\n\t\t\t\t(n) => n !== skillName,\n\t\t\t);\n\t\t\tif ((manifest.wellKnownDependencies[baseUrl] as string[]).length === 0) {\n\t\t\t\tdelete manifest.wellKnownDependencies[baseUrl];\n\t\t\t}\n\t\t}\n\t} else {\n\t\tdelete manifest.wellKnownDependencies[baseUrl];\n\t}\n\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 (or home directory for global installs) */\n\tprojectRoot: string;\n\t/** Custom agent configuration overrides from pspm.json */\n\tagentConfigs?: Record<string, AgentConfig>;\n\t/** If true, use global agent paths (relative to home directory) */\n\tglobal?: boolean;\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, options.global);\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 * Get the source path for a well-known skill within .pspm/skills/.\n *\n * @param hostname - Source hostname (e.g., \"acme.com\")\n * @param skillName - Skill name\n * @returns Relative path from project root (e.g., \".pspm/skills/_wellknown/acme.com/my-skill\")\n */\nexport function getWellKnownSkillPath(\n\thostname: string,\n\tskillName: string,\n): string {\n\treturn `.pspm/skills/_wellknown/${hostname}/${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","/**\n * Well-Known Skills Discovery (RFC 8615)\n *\n * Fetches skills from any HTTPS domain that serves a\n * /.well-known/skills/index.json endpoint.\n */\n\nimport { mkdir, rm, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { calculateIntegrity } from \"./lib/index\";\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/**\n * A single skill entry in the well-known index.json\n */\nexport interface WellKnownSkillEntry {\n\t/** Skill identifier (directory name). Lowercase alphanumeric + hyphens, 1-64 chars. */\n\tname: string;\n\t/** Brief description */\n\tdescription: string;\n\t/** List of files in the skill directory. Must include SKILL.md. */\n\tfiles: string[];\n}\n\n/**\n * The /.well-known/skills/index.json structure\n */\nexport interface WellKnownIndex {\n\tskills: WellKnownSkillEntry[];\n}\n\n/**\n * A fetched well-known skill with all its file contents\n */\nexport interface WellKnownSkill {\n\t/** Skill name from index */\n\tname: string;\n\t/** Description from index */\n\tdescription: string;\n\t/** SKILL.md content */\n\tcontent: string;\n\t/** All files keyed by relative path */\n\tfiles: Map<string, string>;\n\t/** Source URL for this skill */\n\tsourceUrl: string;\n\t/** The index entry */\n\tindexEntry: WellKnownSkillEntry;\n}\n\n/**\n * Result of extracting a well-known skill to disk\n */\nexport interface WellKnownDownloadResult {\n\t/** All skills fetched from the endpoint */\n\tskills: WellKnownSkill[];\n\t/** The resolved base URL where the index was found */\n\tresolvedBaseUrl: string;\n\t/** Hostname for identification */\n\thostname: string;\n}\n\n// =============================================================================\n// Constants\n// =============================================================================\n\nconst WELL_KNOWN_PATH = \".well-known/skills\";\nconst INDEX_FILE = \"index.json\";\nconst SKILL_NAME_PATTERN = /^[a-z0-9]([a-z0-9-]{0,62}[a-z0-9])?$/;\n\n/** Hosts that should NOT be treated as well-known (they have dedicated providers) */\nconst EXCLUDED_HOSTS = [\n\t\"github.com\",\n\t\"gitlab.com\",\n\t\"raw.githubusercontent.com\",\n];\n\n// =============================================================================\n// Detection\n// =============================================================================\n\n/**\n * Check if a string looks like a well-known skills URL.\n * Must be HTTP(S) and not a known git host.\n */\nexport function isWellKnownSpecifier(input: string): boolean {\n\tif (!input.startsWith(\"http://\") && !input.startsWith(\"https://\")) {\n\t\treturn false;\n\t}\n\n\ttry {\n\t\tconst parsed = new URL(input);\n\t\tif (EXCLUDED_HOSTS.includes(parsed.hostname)) {\n\t\t\treturn false;\n\t\t}\n\t\tif (input.endsWith(\".git\")) {\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\n/**\n * Extract hostname from a well-known URL (strips www. prefix).\n */\nexport function getWellKnownHostname(url: string): string {\n\ttry {\n\t\tconst parsed = new URL(url);\n\t\treturn parsed.hostname.replace(/^www\\./, \"\");\n\t} catch {\n\t\treturn url;\n\t}\n}\n\n// =============================================================================\n// Validation\n// =============================================================================\n\n/**\n * Validate a single skill entry from the index.\n */\nfunction isValidSkillEntry(entry: unknown): entry is WellKnownSkillEntry {\n\tif (!entry || typeof entry !== \"object\") return false;\n\n\tconst e = entry as Record<string, unknown>;\n\n\t// Required string fields\n\tif (typeof e.name !== \"string\" || e.name.length === 0) return false;\n\tif (typeof e.description !== \"string\" || e.description.length === 0)\n\t\treturn false;\n\n\t// Name must match pattern\n\tif (!SKILL_NAME_PATTERN.test(e.name)) return false;\n\n\t// Files must be a non-empty array of strings\n\tif (!Array.isArray(e.files) || e.files.length === 0) return false;\n\n\tlet hasSkillMd = false;\n\tfor (const file of e.files) {\n\t\tif (typeof file !== \"string\") return false;\n\t\t// No absolute paths\n\t\tif (file.startsWith(\"/\") || file.startsWith(\"\\\\\")) return false;\n\t\t// No path traversal\n\t\tif (file.includes(\"..\")) return false;\n\t\t// Check for SKILL.md\n\t\tif (file.toLowerCase() === \"skill.md\") hasSkillMd = true;\n\t}\n\n\tif (!hasSkillMd) return false;\n\n\treturn true;\n}\n\n/**\n * Validate a well-known index structure.\n */\nfunction isValidIndex(data: unknown): data is WellKnownIndex {\n\tif (!data || typeof data !== \"object\") return false;\n\tconst d = data as Record<string, unknown>;\n\tif (!Array.isArray(d.skills)) return false;\n\treturn d.skills.every(isValidSkillEntry);\n}\n\n// =============================================================================\n// Fetching\n// =============================================================================\n\n/**\n * Fetch the well-known index from a URL.\n *\n * Tries path-relative first, then root:\n * 1. {baseUrl}/.well-known/skills/index.json\n * 2. {protocol}://{host}/.well-known/skills/index.json\n */\nexport async function fetchWellKnownIndex(\n\tbaseUrl: string,\n): Promise<{ index: WellKnownIndex; resolvedBaseUrl: string } | null> {\n\tconst parsed = new URL(baseUrl);\n\n\t// Try 1: path-relative\n\tconst pathRelativeUrl = `${baseUrl.replace(/\\/$/, \"\")}/${WELL_KNOWN_PATH}/${INDEX_FILE}`;\n\tconst pathRelativeBase = `${baseUrl.replace(/\\/$/, \"\")}/${WELL_KNOWN_PATH}`;\n\n\ttry {\n\t\tconst response = await fetch(pathRelativeUrl, {\n\t\t\tsignal: AbortSignal.timeout(10000),\n\t\t});\n\t\tif (response.ok) {\n\t\t\tconst data = await response.json();\n\t\t\tif (isValidIndex(data)) {\n\t\t\t\treturn { index: data, resolvedBaseUrl: pathRelativeBase };\n\t\t\t}\n\t\t}\n\t} catch {\n\t\t// Try next\n\t}\n\n\t// Try 2: root well-known (skip if URL has no path)\n\tconst rootUrl = `${parsed.protocol}//${parsed.host}/${WELL_KNOWN_PATH}/${INDEX_FILE}`;\n\tconst rootBase = `${parsed.protocol}//${parsed.host}/${WELL_KNOWN_PATH}`;\n\n\t// Avoid duplicate request if path-relative already tried the root\n\tif (rootUrl !== pathRelativeUrl) {\n\t\ttry {\n\t\t\tconst response = await fetch(rootUrl, {\n\t\t\t\tsignal: AbortSignal.timeout(10000),\n\t\t\t});\n\t\t\tif (response.ok) {\n\t\t\t\tconst data = await response.json();\n\t\t\t\tif (isValidIndex(data)) {\n\t\t\t\t\treturn { index: data, resolvedBaseUrl: rootBase };\n\t\t\t\t}\n\t\t\t}\n\t\t} catch {\n\t\t\t// No index found\n\t\t}\n\t}\n\n\treturn null;\n}\n\n/**\n * Fetch a single skill's files from a well-known endpoint.\n */\nasync function fetchSkillFiles(\n\tbaseUrl: string,\n\tentry: WellKnownSkillEntry,\n): Promise<WellKnownSkill | null> {\n\tconst skillBaseUrl = `${baseUrl}/${entry.name}`;\n\tconst files = new Map<string, string>();\n\tlet skillMdContent = \"\";\n\n\t// Fetch all files in parallel\n\tconst results = await Promise.allSettled(\n\t\tentry.files.map(async (filePath) => {\n\t\t\tconst fileUrl = `${skillBaseUrl}/${filePath}`;\n\t\t\tconst response = await fetch(fileUrl, {\n\t\t\t\tsignal: AbortSignal.timeout(10000),\n\t\t\t});\n\t\t\tif (!response.ok) {\n\t\t\t\tthrow new Error(`Failed to fetch ${fileUrl}: ${response.status}`);\n\t\t\t}\n\t\t\tconst content = await response.text();\n\t\t\treturn { filePath, content };\n\t\t}),\n\t);\n\n\tfor (const result of results) {\n\t\tif (result.status === \"fulfilled\") {\n\t\t\tfiles.set(result.value.filePath, result.value.content);\n\t\t\tif (result.value.filePath.toLowerCase() === \"skill.md\") {\n\t\t\t\tskillMdContent = result.value.content;\n\t\t\t}\n\t\t}\n\t\t// Skip failed files (non-fatal except SKILL.md)\n\t}\n\n\t// SKILL.md is required\n\tif (!skillMdContent) {\n\t\treturn null;\n\t}\n\n\treturn {\n\t\tname: entry.name,\n\t\tdescription: entry.description,\n\t\tcontent: skillMdContent,\n\t\tfiles,\n\t\tsourceUrl: `${skillBaseUrl}/SKILL.md`,\n\t\tindexEntry: entry,\n\t};\n}\n\n/**\n * Fetch all skills from a well-known endpoint.\n */\nexport async function fetchWellKnownSkills(\n\turl: string,\n): Promise<WellKnownDownloadResult | null> {\n\tconst result = await fetchWellKnownIndex(url);\n\tif (!result) return null;\n\n\tconst { index, resolvedBaseUrl } = result;\n\tconst hostname = getWellKnownHostname(url);\n\n\t// Fetch all skills in parallel\n\tconst skillResults = await Promise.allSettled(\n\t\tindex.skills.map((entry) => fetchSkillFiles(resolvedBaseUrl, entry)),\n\t);\n\n\tconst skills: WellKnownSkill[] = [];\n\tfor (const r of skillResults) {\n\t\tif (r.status === \"fulfilled\" && r.value) {\n\t\t\tskills.push(r.value);\n\t\t}\n\t}\n\n\tif (skills.length === 0) return null;\n\n\treturn { skills, resolvedBaseUrl, hostname };\n}\n\n// =============================================================================\n// Extraction\n// =============================================================================\n\n/**\n * Extract a well-known skill to the .pspm/skills/_wellknown/ directory.\n *\n * @param skill - The fetched skill\n * @param hostname - Source hostname (for directory namespacing)\n * @param skillsDir - Base skills directory (.pspm/skills)\n * @returns Path to extracted skill (relative to project root)\n */\nexport async function extractWellKnownSkill(\n\tskill: WellKnownSkill,\n\thostname: string,\n\tskillsDir: string,\n): Promise<string> {\n\tconst destPath = join(skillsDir, \"_wellknown\", hostname, skill.name);\n\n\t// Clean and recreate\n\tawait rm(destPath, { recursive: true, force: true });\n\tawait mkdir(destPath, { recursive: true });\n\n\t// Write all files\n\tfor (const [filePath, content] of skill.files) {\n\t\t// Security: validate path doesn't escape\n\t\tconst fullPath = join(destPath, filePath);\n\t\tif (!fullPath.startsWith(destPath)) {\n\t\t\tcontinue; // Skip files that would escape the directory\n\t\t}\n\n\t\t// Create parent directories\n\t\tconst { dirname } = await import(\"node:path\");\n\t\tawait mkdir(dirname(fullPath), { recursive: true });\n\t\tawait writeFile(fullPath, content, \"utf-8\");\n\t}\n\n\treturn `.pspm/skills/_wellknown/${hostname}/${skill.name}`;\n}\n\n/**\n * Calculate integrity hash for a well-known skill (hash of all file contents).\n */\nexport function calculateWellKnownIntegrity(skill: WellKnownSkill): string {\n\t// Sort files by path for deterministic hashing\n\tconst sortedEntries = [...skill.files.entries()].sort(([a], [b]) =>\n\t\ta.localeCompare(b),\n\t);\n\tconst combined = sortedEntries\n\t\t.map(([path, content]) => `${path}:${content}`)\n\t\t.join(\"\\n\");\n\treturn calculateIntegrity(Buffer.from(combined, \"utf-8\"));\n}\n\n/**\n * Get the source path for a well-known skill within .pspm/skills/.\n */\nexport function getWellKnownSkillPath(\n\thostname: string,\n\tskillName: string,\n): string {\n\treturn `.pspm/skills/_wellknown/${hostname}/${skillName}`;\n}\n\n/**\n * Get display name for a well-known skill.\n */\nexport function getWellKnownDisplayName(\n\thostname: string,\n\tskillName: string,\n): string {\n\treturn `${hostname}/${skillName} (well-known)`;\n}\n","import { mkdir, rm, stat, symlink } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { basename, dirname, join, relative, resolve } from \"node:path\";\nimport { parseAgentArg, promptForAgents } from \"@/agents\";\nimport { configure, getSkillVersion, listSkillVersions } from \"@/api-client\";\nimport {\n\tgetSkillsDir,\n\tgetTokenForRegistry,\n\tisGlobalMode,\n\tresolveConfig,\n\tsetGlobalMode,\n} 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\tisGitHubShorthand,\n\tisGitHubSpecifier,\n\tisGitHubUrl,\n\ttype LocalLockfileEntry,\n\tMAX_DEPENDENCY_DEPTH,\n\tparseGitHubShorthand,\n\tparseGitHubSpecifier,\n\tparseGitHubUrl,\n\tparseSkillSpecifier,\n\tprintResolutionErrors,\n\tresolveRecursive,\n\tresolveVersion,\n\ttype WellKnownLockfileEntry,\n} from \"@/lib/index\";\nimport {\n\taddGitHubToLockfile,\n\taddLocalToLockfile,\n\taddToLockfileWithDeps,\n\taddWellKnownToLockfile,\n} from \"@/lockfile\";\nimport {\n\taddDependency,\n\taddGitHubDependency,\n\taddLocalDependency,\n\taddWellKnownDependency,\n\treadManifest,\n} from \"@/manifest\";\nimport {\n\tcreateAgentSymlinks,\n\tgetGitHubSkillPath,\n\tgetLocalSkillPath,\n\tgetRegistrySkillPath,\n\tgetWellKnownSkillPath,\n\ttype SkillInfo,\n} from \"@/symlinks\";\nimport {\n\tcalculateWellKnownIntegrity,\n\textractWellKnownSkill,\n\tfetchWellKnownSkills,\n\tgetWellKnownDisplayName,\n\tgetWellKnownHostname,\n\tisWellKnownSpecifier,\n\ttype WellKnownSkill,\n} from \"@/wellknown\";\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\t/** Install globally (to ~/.pspm/ with global agent paths) */\n\tglobal?: 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\ninterface ResolvedWellKnownPackage {\n\ttype: \"wellknown\";\n\tspecifier: string;\n\thostname: string;\n\tskills: WellKnownSkill[];\n\tresolvedBaseUrl: string;\n}\n\ntype ResolvedPackage =\n\t| ResolvedRegistryPackage\n\t| ResolvedGitHubPackage\n\t| ResolvedLocalPackage\n\t| ResolvedWellKnownPackage;\n\nexport async function add(\n\tspecifiers: string[],\n\toptions: AddOptions,\n): Promise<void> {\n\t// Set up global mode if requested\n\tif (options.global) {\n\t\tsetGlobalMode(true);\n\t\tconsole.log(\"Installing globally to ~/.pspm/\\n\");\n\t}\n\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 (\n\t\t\t\tisGitHubSpecifier(specifier) ||\n\t\t\t\tisGitHubUrl(specifier) ||\n\t\t\t\tisGitHubShorthand(specifier)\n\t\t\t) {\n\t\t\t\tconst resolved = await validateGitHubPackage(specifier);\n\t\t\t\tresolvedPackages.push(resolved);\n\t\t\t} else if (isWellKnownSpecifier(specifier)) {\n\t\t\t\tconst resolved = await validateWellKnownPackage(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\tconst wellKnownPackages = resolvedPackages.filter(\n\t\t(p): p is ResolvedWellKnownPackage => p.type === \"wellknown\",\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// Install well-known packages (fetch from HTTPS domains)\n\tfor (const resolved of wellKnownPackages) {\n\t\ttry {\n\t\t\tawait installWellKnownPackage(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\n/**\n * Get the root directory for symlink creation.\n * Global: home directory. Project: current working directory.\n */\nfunction getSymlinkRoot(): string {\n\treturn isGlobalMode() ? homedir() : process.cwd();\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: getSymlinkRoot(),\n\t\t\tagentConfigs: skillManifest?.agents,\n\t\t\tglobal: isGlobalMode(),\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 * Parse any GitHub input format into a GitHubSpecifier.\n *\n * Accepts:\n * - github:owner/repo[/path][@ref] (canonical prefix format)\n * - https://github.com/owner/repo (full URL)\n * - https://github.com/owner/repo/tree/branch/path (tree URL)\n * - owner/repo[/path] (shorthand)\n */\nfunction parseAnyGitHubFormat(\n\tspecifier: string,\n): ReturnType<typeof parseGitHubSpecifier> {\n\t// Try canonical github: prefix first\n\tif (isGitHubSpecifier(specifier)) {\n\t\treturn parseGitHubSpecifier(specifier);\n\t}\n\n\t// Try GitHub URL (https://github.com/...)\n\tif (isGitHubUrl(specifier)) {\n\t\treturn parseGitHubUrl(specifier);\n\t}\n\n\t// Try shorthand (owner/repo[/path])\n\tif (isGitHubShorthand(specifier)) {\n\t\treturn parseGitHubShorthand(specifier);\n\t}\n\n\treturn null;\n}\n\n/**\n * Validate and download a GitHub package\n */\nasync function validateGitHubPackage(\n\tspecifier: string,\n): Promise<ResolvedGitHubPackage> {\n\tconst parsed = parseAnyGitHubFormat(specifier);\n\tif (!parsed) {\n\t\tthrow new Error(\n\t\t\t`Invalid GitHub specifier \"${specifier}\". Supported formats:\\n` +\n\t\t\t\t` github:owner/repo[/path][@ref]\\n` +\n\t\t\t\t` https://github.com/owner/repo[/tree/branch/path]\\n` +\n\t\t\t\t` owner/repo[/path]`,\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: getSymlinkRoot(),\n\t\t\tagentConfigs: manifest?.agents,\n\t\t\tglobal: isGlobalMode(),\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: getSymlinkRoot(),\n\t\t\tagentConfigs: manifest?.agents,\n\t\t\tglobal: isGlobalMode(),\n\t\t});\n\t}\n\n\tconsole.log(`Installed ${specifier} (local)`);\n\tconsole.log(`Location: ${symlinkPath} -> ${resolvedPath}`);\n}\n\n// =============================================================================\n// Well-Known Package Support\n// =============================================================================\n\n/**\n * Validate and fetch skills from a well-known endpoint\n */\nasync function validateWellKnownPackage(\n\tspecifier: string,\n): Promise<ResolvedWellKnownPackage> {\n\tconst hostname = getWellKnownHostname(specifier);\n\tconsole.log(`Discovering skills from ${hostname}...`);\n\n\tconst result = await fetchWellKnownSkills(specifier);\n\tif (!result) {\n\t\tthrow new Error(\n\t\t\t`No well-known skills found at ${specifier}\\n Expected: ${specifier}/.well-known/skills/index.json`,\n\t\t);\n\t}\n\n\tconsole.log(\n\t\t`Found ${result.skills.length} skill(s) from ${hostname}: ${result.skills.map((s) => s.name).join(\", \")}`,\n\t);\n\n\treturn {\n\t\ttype: \"wellknown\",\n\t\tspecifier,\n\t\thostname: result.hostname,\n\t\tskills: result.skills,\n\t\tresolvedBaseUrl: result.resolvedBaseUrl,\n\t};\n}\n\n/**\n * Install pre-validated well-known skills\n */\nasync function installWellKnownPackage(\n\tresolved: ResolvedWellKnownPackage,\n\toptions: InternalAddOptions,\n): Promise<void> {\n\tconst { specifier, hostname, skills } = resolved;\n\tconst skillsDir = getSkillsDir();\n\n\tfor (const skill of skills) {\n\t\tconsole.log(\n\t\t\t`Installing ${getWellKnownDisplayName(hostname, skill.name)}...`,\n\t\t);\n\n\t\t// Extract to .pspm/skills/_wellknown/{hostname}/{skill-name}/\n\t\tconst destPath = await extractWellKnownSkill(skill, hostname, skillsDir);\n\n\t\t// Calculate integrity hash\n\t\tconst integrity = calculateWellKnownIntegrity(skill);\n\n\t\t// Add to lockfile\n\t\tconst lockfileKey = `${specifier}#${skill.name}`;\n\t\tconst entry: WellKnownLockfileEntry = {\n\t\t\tversion: \"well-known\",\n\t\t\tresolved: skill.sourceUrl,\n\t\t\tintegrity,\n\t\t\thostname,\n\t\t\tname: skill.name,\n\t\t\tfiles: [...skill.files.keys()],\n\t\t};\n\t\tawait addWellKnownToLockfile(lockfileKey, entry);\n\n\t\t// Add to pspm.json wellKnownDependencies\n\t\tawait addWellKnownDependency(specifier, [skill.name]);\n\n\t\t// Create agent symlinks\n\t\tconst agents = options.resolvedAgents;\n\t\tif (agents[0] !== \"none\") {\n\t\t\tconst manifest = await readManifest();\n\t\t\tconst skillInfo: SkillInfo = {\n\t\t\t\tname: skill.name,\n\t\t\t\tsourcePath: getWellKnownSkillPath(hostname, skill.name),\n\t\t\t};\n\n\t\t\tawait createAgentSymlinks([skillInfo], {\n\t\t\t\tagents,\n\t\t\t\tprojectRoot: process.cwd(),\n\t\t\t\tagentConfigs: manifest?.agents,\n\t\t\t});\n\t\t}\n\n\t\tconsole.log(`Installed ${getWellKnownDisplayName(hostname, skill.name)}`);\n\t\tconsole.log(`Location: ${destPath}`);\n\t}\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 { type AuditOptions, audit } from \"./audit\";\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 SearchOptions, search } from \"./search\";\nexport { type UnpublishOptions, unpublish } from \"./unpublish\";\nexport { type UpdateOptions, update } from \"./update\";\nexport { upgrade } from \"./upgrade\";\nexport { type VersionBump, type VersionOptions, version } from \"./version\";\nexport { whoami } from \"./whoami\";\n","/**\n * Audit command - Verify integrity of installed skills and check for issues.\n *\n * Checks:\n * 1. Integrity verification: re-hash installed files and compare with lockfile\n * 2. Deprecated packages: flag any deprecated versions\n * 3. Missing packages: flag packages in lockfile but not on disk\n */\n\nimport { stat } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { getSkillsDir } from \"@/config\";\nimport { parseGitHubSpecifier, type WellKnownLockfileEntry } from \"@/lib/index\";\nimport {\n\tlistLockfileGitHubPackages,\n\tlistLockfileSkills,\n\tlistLockfileWellKnownPackages,\n\treadLockfile,\n} from \"@/lockfile\";\n\nexport interface AuditOptions {\n\t/** Output as JSON */\n\tjson?: boolean;\n}\n\ninterface AuditIssue {\n\tname: string;\n\tsource: \"registry\" | \"github\" | \"well-known\";\n\tseverity: \"error\" | \"warning\" | \"info\";\n\ttype: \"integrity\" | \"deprecated\" | \"missing\" | \"no-lockfile\";\n\tmessage: string;\n}\n\nexport async function audit(options: AuditOptions): Promise<void> {\n\ttry {\n\t\tconst lockfile = await readLockfile();\n\n\t\tif (!lockfile) {\n\t\t\tif (options.json) {\n\t\t\t\tconsole.log(\n\t\t\t\t\tJSON.stringify({\n\t\t\t\t\t\tok: false,\n\t\t\t\t\t\tissues: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tname: \"-\",\n\t\t\t\t\t\t\t\tsource: \"-\",\n\t\t\t\t\t\t\t\tseverity: \"error\",\n\t\t\t\t\t\t\t\ttype: \"no-lockfile\",\n\t\t\t\t\t\t\t\tmessage: \"No lockfile found. Run 'pspm install' first.\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tconsole.error(\"No lockfile found. Run 'pspm install' to create one.\");\n\t\t\t}\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\tconst issues: AuditIssue[] = [];\n\t\tconst skillsDir = getSkillsDir();\n\t\tconst projectRoot = process.cwd();\n\n\t\tif (!options.json) {\n\t\t\tconsole.log(\"Auditing installed skills...\\n\");\n\t\t}\n\n\t\t// =================================================================\n\t\t// Check registry packages\n\t\t// =================================================================\n\t\tconst registrySkills = await listLockfileSkills();\n\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 destDir = join(projectRoot, skillsDir, username, skillName);\n\n\t\t\t// Check if installed on disk\n\t\t\tconst exists = await pathExists(destDir);\n\t\t\tif (!exists) {\n\t\t\t\tissues.push({\n\t\t\t\t\tname: fullName,\n\t\t\t\t\tsource: \"registry\",\n\t\t\t\t\tseverity: \"error\",\n\t\t\t\t\ttype: \"missing\",\n\t\t\t\t\tmessage: `Not installed on disk. Run 'pspm install' to restore.`,\n\t\t\t\t});\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Check for deprecation\n\t\t\tif (entry.deprecated) {\n\t\t\t\tissues.push({\n\t\t\t\t\tname: fullName,\n\t\t\t\t\tsource: \"registry\",\n\t\t\t\t\tseverity: \"warning\",\n\t\t\t\t\ttype: \"deprecated\",\n\t\t\t\t\tmessage: `Deprecated: ${entry.deprecated}`,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// Verify tarball integrity would require re-downloading;\n\t\t\t// instead check that the installed directory exists and has SKILL.md\n\t\t\tconst skillMdExists = await pathExists(join(destDir, \"SKILL.md\"));\n\t\t\tif (!skillMdExists) {\n\t\t\t\tissues.push({\n\t\t\t\t\tname: fullName,\n\t\t\t\t\tsource: \"registry\",\n\t\t\t\t\tseverity: \"warning\",\n\t\t\t\t\ttype: \"integrity\",\n\t\t\t\t\tmessage:\n\t\t\t\t\t\t\"Missing SKILL.md in installed directory. Package may be corrupted.\",\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\t// =================================================================\n\t\t// Check GitHub packages\n\t\t// =================================================================\n\t\tconst githubSkills = await listLockfileGitHubPackages();\n\n\t\tfor (const { specifier } of githubSkills) {\n\t\t\tconst parsed = parseGitHubSpecifier(specifier);\n\t\t\tif (!parsed) continue;\n\n\t\t\tconst destDir = parsed.path\n\t\t\t\t? join(\n\t\t\t\t\t\tprojectRoot,\n\t\t\t\t\t\tskillsDir,\n\t\t\t\t\t\t\"_github\",\n\t\t\t\t\t\tparsed.owner,\n\t\t\t\t\t\tparsed.repo,\n\t\t\t\t\t\tparsed.path,\n\t\t\t\t\t)\n\t\t\t\t: join(projectRoot, skillsDir, \"_github\", parsed.owner, parsed.repo);\n\n\t\t\tconst exists = await pathExists(destDir);\n\t\t\tif (!exists) {\n\t\t\t\tissues.push({\n\t\t\t\t\tname: specifier,\n\t\t\t\t\tsource: \"github\",\n\t\t\t\t\tseverity: \"error\",\n\t\t\t\t\ttype: \"missing\",\n\t\t\t\t\tmessage: `Not installed on disk. Run 'pspm install' to restore.`,\n\t\t\t\t});\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Check SKILL.md exists\n\t\t\tconst skillMdExists = await pathExists(join(destDir, \"SKILL.md\"));\n\t\t\tif (!skillMdExists) {\n\t\t\t\tissues.push({\n\t\t\t\t\tname: specifier,\n\t\t\t\t\tsource: \"github\",\n\t\t\t\t\tseverity: \"warning\",\n\t\t\t\t\ttype: \"integrity\",\n\t\t\t\t\tmessage:\n\t\t\t\t\t\t\"Missing SKILL.md in installed directory. Package may be corrupted.\",\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\t// =================================================================\n\t\t// Check well-known packages\n\t\t// =================================================================\n\t\tconst wellKnownSkills = await listLockfileWellKnownPackages();\n\n\t\tfor (const { specifier, entry } of wellKnownSkills) {\n\t\t\tconst wkEntry = entry as WellKnownLockfileEntry;\n\t\t\tconst destDir = join(\n\t\t\t\tprojectRoot,\n\t\t\t\tskillsDir,\n\t\t\t\t\"_wellknown\",\n\t\t\t\twkEntry.hostname,\n\t\t\t\twkEntry.name,\n\t\t\t);\n\n\t\t\tconst exists = await pathExists(destDir);\n\t\t\tif (!exists) {\n\t\t\t\tissues.push({\n\t\t\t\t\tname: specifier,\n\t\t\t\t\tsource: \"well-known\",\n\t\t\t\t\tseverity: \"error\",\n\t\t\t\t\ttype: \"missing\",\n\t\t\t\t\tmessage: `Not installed on disk. Run 'pspm install' to restore.`,\n\t\t\t\t});\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Verify SKILL.md exists\n\t\t\tconst skillMdExists = await pathExists(join(destDir, \"SKILL.md\"));\n\t\t\tif (!skillMdExists) {\n\t\t\t\tissues.push({\n\t\t\t\t\tname: specifier,\n\t\t\t\t\tsource: \"well-known\",\n\t\t\t\t\tseverity: \"warning\",\n\t\t\t\t\ttype: \"integrity\",\n\t\t\t\t\tmessage:\n\t\t\t\t\t\t\"Missing SKILL.md in installed directory. Package may be corrupted.\",\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\t// =================================================================\n\t\t// Report results\n\t\t// =================================================================\n\t\tconst errorCount = issues.filter((i) => i.severity === \"error\").length;\n\t\tconst warningCount = issues.filter((i) => i.severity === \"warning\").length;\n\n\t\tif (options.json) {\n\t\t\tconsole.log(\n\t\t\t\tJSON.stringify(\n\t\t\t\t\t{\n\t\t\t\t\t\tok: errorCount === 0,\n\t\t\t\t\t\ttotalPackages:\n\t\t\t\t\t\t\tregistrySkills.length +\n\t\t\t\t\t\t\tgithubSkills.length +\n\t\t\t\t\t\t\twellKnownSkills.length,\n\t\t\t\t\t\tissues,\n\t\t\t\t\t},\n\t\t\t\t\tnull,\n\t\t\t\t\t2,\n\t\t\t\t),\n\t\t\t);\n\t\t\tif (errorCount > 0) process.exit(1);\n\t\t\treturn;\n\t\t}\n\n\t\tif (issues.length === 0) {\n\t\t\tconst totalPackages =\n\t\t\t\tregistrySkills.length + githubSkills.length + wellKnownSkills.length;\n\t\t\tconsole.log(`Audited ${totalPackages} package(s). No issues found.`);\n\t\t\treturn;\n\t\t}\n\n\t\t// Print issues grouped by severity\n\t\tconst errors = issues.filter((i) => i.severity === \"error\");\n\t\tconst warnings = issues.filter((i) => i.severity === \"warning\");\n\n\t\tif (errors.length > 0) {\n\t\t\tconsole.log(\"Errors:\");\n\t\t\tfor (const issue of errors) {\n\t\t\t\tconsole.log(\n\t\t\t\t\t` [${issue.type.toUpperCase()}] ${issue.name} (${issue.source})`,\n\t\t\t\t);\n\t\t\t\tconsole.log(` ${issue.message}`);\n\t\t\t}\n\t\t\tconsole.log();\n\t\t}\n\n\t\tif (warnings.length > 0) {\n\t\t\tconsole.log(\"Warnings:\");\n\t\t\tfor (const issue of warnings) {\n\t\t\t\tconsole.log(\n\t\t\t\t\t` [${issue.type.toUpperCase()}] ${issue.name} (${issue.source})`,\n\t\t\t\t);\n\t\t\t\tconsole.log(` ${issue.message}`);\n\t\t\t}\n\t\t\tconsole.log();\n\t\t}\n\n\t\tconst totalPackages =\n\t\t\tregistrySkills.length + githubSkills.length + wellKnownSkills.length;\n\t\tconsole.log(\n\t\t\t`Audited ${totalPackages} package(s): ${errorCount} error(s), ${warningCount} warning(s).`,\n\t\t);\n\n\t\tif (errorCount > 0) {\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\nasync function pathExists(path: string): Promise<boolean> {\n\ttry {\n\t\tawait stat(path);\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n}\n","import { stat, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\nexport interface ConfigInitOptions {\n\tregistry?: string;\n}\n\n/**\n * Create a .pspmrc file in the current directory (INI format)\n */\nexport async function configInit(options: ConfigInitOptions): Promise<void> {\n\ttry {\n\t\tconst configPath = join(process.cwd(), \".pspmrc\");\n\n\t\t// Check if file already exists\n\t\ttry {\n\t\t\tawait stat(configPath);\n\t\t\tconsole.error(\"Error: .pspmrc already exists in this directory.\");\n\t\t\tprocess.exit(1);\n\t\t} catch {\n\t\t\t// File doesn't exist, good\n\t\t}\n\n\t\t// Build INI content\n\t\tconst lines: string[] = [\"; Project-specific PSPM configuration\", \"\"];\n\n\t\tif (options.registry) {\n\t\t\tlines.push(`registry = ${options.registry}`);\n\t\t} else {\n\t\t\tlines.push(\"; Uncomment to use a custom registry:\");\n\t\t\tlines.push(\"; registry = https://custom-registry.example.com\");\n\t\t}\n\n\t\tlines.push(\"\");\n\n\t\t// Write the file\n\t\tawait writeFile(configPath, lines.join(\"\\n\"));\n\n\t\tconsole.log(\"Created .pspmrc\");\n\t\tconsole.log(\"\");\n\t\tconsole.log(\"Contents:\");\n\t\tconsole.log(lines.join(\"\\n\"));\n\t\tconsole.log(\"Note: .pspmrc should be committed to version control.\");\n\t\tconsole.log(\"API keys should NOT be stored here - use pspm login instead.\");\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : \"Unknown error\";\n\t\tconsole.error(`Error: ${message}`);\n\t\tprocess.exit(1);\n\t}\n}\n","import { 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 { homedir } from \"node:os\";\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\tisGlobalMode,\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\t/** Install globally (to ~/.pspm/ with global agent paths) */\n\tglobal?: boolean;\n}\n\nexport async function install(\n\tspecifiers: string[],\n\toptions: InstallOptions,\n): Promise<void> {\n\t// Set up global mode if requested\n\tif (options.global) {\n\t\tconst { setGlobalMode } = await import(\"@/config\");\n\t\tsetGlobalMode(true);\n\t}\n\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\tglobal: options.global,\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\tconst globalMode = isGlobalMode();\n\t\t\tconsole.log(\n\t\t\t\t`\\nCreating symlinks for agent(s): ${agents.join(\", \")}${globalMode ? \" (global)\" : \"\"}...`,\n\t\t\t);\n\n\t\t\tawait createAgentSymlinks(installedSkills, {\n\t\t\t\tagents,\n\t\t\t\tprojectRoot: globalMode ? homedir() : process.cwd(),\n\t\t\t\tagentConfigs,\n\t\t\t\tglobal: globalMode,\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\t/** Recreate global agent symlinks */\n\tglobal?: boolean;\n}\n\nexport async function link(options: LinkOptions): Promise<void> {\n\ttry {\n\t\t// Set up global mode if requested\n\t\tif (options.global) {\n\t\t\tconst { setGlobalMode } = await import(\"@/config\");\n\t\t\tsetGlobalMode(true);\n\t\t}\n\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\tconst globalMode = options.global ?? false;\n\t\tawait createAgentSymlinks(skills, {\n\t\t\tagents,\n\t\t\tprojectRoot: globalMode\n\t\t\t\t? (await import(\"node:os\")).homedir()\n\t\t\t\t: process.cwd(),\n\t\t\tagentConfigs,\n\t\t\tglobal: globalMode,\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\ttype WellKnownLockfileEntry,\n} from \"@/lib/index\";\nimport {\n\tlistLockfileGitHubPackages,\n\tlistLockfileSkills,\n\tlistLockfileWellKnownPackages,\n} from \"@/lockfile\";\nimport { readManifest } from \"@/manifest\";\nimport {\n\tgetGitHubSkillPath,\n\tgetLinkedAgents,\n\tgetRegistrySkillPath,\n\tgetWellKnownSkillPath,\n} from \"@/symlinks\";\n\nexport interface ListOptions {\n\tjson?: boolean;\n\t/** List globally installed skills */\n\tglobal?: boolean;\n}\n\ninterface SkillListItem {\n\tname: string;\n\tfullName: string;\n\tversion: string;\n\tsource: \"registry\" | \"github\" | \"well-known\";\n\tsourcePath: string;\n\tstatus: \"installed\" | \"missing\";\n\tlinkedAgents: string[];\n\tgitRef?: string;\n\tgitCommit?: string;\n\thostname?: string;\n}\n\nexport async function list(options: ListOptions): Promise<void> {\n\ttry {\n\t\t// Set up global mode if requested\n\t\tif (options.global) {\n\t\t\tconst { setGlobalMode } = await import(\"@/config\");\n\t\t\tsetGlobalMode(true);\n\t\t}\n\n\t\t// Get all skills from lockfile\n\t\tconst registrySkills = await listLockfileSkills();\n\t\tconst githubSkills = await listLockfileGitHubPackages();\n\t\tconst wellKnownSkills = await listLockfileWellKnownPackages();\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\t// Add well-known skills\n\t\tfor (const { specifier, entry } of wellKnownSkills) {\n\t\t\tconst wkEntry = entry as WellKnownLockfileEntry;\n\t\t\tconst skillName = wkEntry.name;\n\t\t\tconst sourcePath = getWellKnownSkillPath(wkEntry.hostname, 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: specifier,\n\t\t\t\tversion: \"well-known\",\n\t\t\t\tsource: \"well-known\",\n\t\t\t\tsourcePath,\n\t\t\t\tstatus,\n\t\t\t\tlinkedAgents,\n\t\t\t\thostname: wkEntry.hostname,\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 if (skill.source === \"well-known\") {\n\t\t\t\tconsole.log(` ${skill.name} (well-known: ${skill.hostname})`);\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 wellKnownCount = skills.filter(\n\t\t\t(s) => s.source === \"well-known\",\n\t\t).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\t\tif (wellKnownCount > 0) parts.push(`${wellKnownCount} well-known`);\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","/**\n * Search command - Search and discover skills from the registry.\n *\n * Queries the public explore API with optional search term and\n * displays results in a formatted table.\n */\n\nimport { configure } from \"@/api-client\";\nimport { getTokenForRegistry, resolveConfig } from \"@/config\";\nimport { explorePublicSkills } from \"@/sdk/generated\";\n\nexport interface SearchOptions {\n\t/** Sort results: downloads, recent, name */\n\tsort?: \"downloads\" | \"recent\" | \"name\";\n\t/** Maximum number of results */\n\tlimit?: number;\n\t/** Output as JSON */\n\tjson?: boolean;\n}\n\nexport async function search(\n\tquery: string | undefined,\n\toptions: SearchOptions,\n): Promise<void> {\n\ttry {\n\t\t// Configure SDK (no auth needed for public explore)\n\t\tconst config = await resolveConfig();\n\t\tconst apiKey = getTokenForRegistry(config, config.registryUrl);\n\t\tconfigure({ registryUrl: config.registryUrl, apiKey });\n\n\t\tconst limit = options.limit ?? 20;\n\t\tconst sort = options.sort ?? \"downloads\";\n\n\t\tif (!options.json) {\n\t\t\tif (query) {\n\t\t\t\tconsole.log(`Searching for \"${query}\"...\\n`);\n\t\t\t} else {\n\t\t\t\tconsole.log(\"Browsing skills...\\n\");\n\t\t\t}\n\t\t}\n\n\t\tconst response = await explorePublicSkills({\n\t\t\tsearch: query,\n\t\t\tsort,\n\t\t\tlimit,\n\t\t\tpage: 1,\n\t\t});\n\n\t\tif (response.status !== 200) {\n\t\t\tconsole.error(\"Error: Failed to search skills\");\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\tconst { skills, total } = response.data;\n\n\t\tif (skills.length === 0) {\n\t\t\tif (query) {\n\t\t\t\tconsole.log(`No skills found matching \"${query}\".`);\n\t\t\t} else {\n\t\t\t\tconsole.log(\"No skills published yet.\");\n\t\t\t}\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\t// Display results\n\t\tfor (const skill of skills) {\n\t\t\tconst name = `@user/${skill.username}/${skill.name}`;\n\t\t\tconst desc = skill.description\n\t\t\t\t? ` - ${skill.description.slice(0, 80)}${skill.description.length > 80 ? \"...\" : \"\"}`\n\t\t\t\t: \"\";\n\t\t\tconst downloads =\n\t\t\t\tskill.totalDownloads > 0\n\t\t\t\t\t? ` (${formatDownloads(skill.totalDownloads)} downloads)`\n\t\t\t\t\t: \"\";\n\n\t\t\tconsole.log(` ${name}${downloads}`);\n\t\t\tif (desc) {\n\t\t\t\tconsole.log(` ${desc.trim()}`);\n\t\t\t}\n\t\t}\n\n\t\t// Summary\n\t\tconst showing = Math.min(skills.length, limit);\n\t\tif (total > showing) {\n\t\t\tconsole.log(`\\nShowing ${showing} of ${total} results.`);\n\t\t} else {\n\t\t\tconsole.log(`\\n${total} skill(s) found.`);\n\t\t}\n\n\t\t// Hint for install\n\t\tif (skills.length > 0) {\n\t\t\tconst first = skills[0];\n\t\t\tconsole.log(\n\t\t\t\t`\\nInstall with: pspm add @user/${first.username}/${first.name}`,\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\n/**\n * Format download count for display (e.g., 1234 -> \"1.2k\")\n */\nfunction formatDownloads(count: number): string {\n\tif (count >= 1_000_000) {\n\t\treturn `${(count / 1_000_000).toFixed(1)}M`;\n\t}\n\tif (count >= 1_000) {\n\t\treturn `${(count / 1_000).toFixed(1)}k`;\n\t}\n\treturn String(count);\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 { execSync } from \"node:child_process\";\n\nexport async function upgrade(): Promise<void> {\n\tconst packageName = \"@anytio/pspm\";\n\n\ttry {\n\t\t// Get current version from package.json (already loaded at startup)\n\t\tconst currentVersion = getCurrentVersion();\n\n\t\t// Check latest version from npm registry\n\t\tconsole.log(\"Checking for updates...\\n\");\n\t\tconst latestVersion = getLatestVersion(packageName);\n\n\t\tif (!latestVersion) {\n\t\t\tconsole.error(\"Error: Could not fetch latest version from registry.\");\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\tif (currentVersion === latestVersion) {\n\t\t\tconsole.log(`Already on the latest version: ${currentVersion}`);\n\t\t\treturn;\n\t\t}\n\n\t\tconsole.log(` Current version: ${currentVersion}`);\n\t\tconsole.log(` Latest version: ${latestVersion}\\n`);\n\n\t\t// Detect which package manager was used to install\n\t\tconst pm = detectPackageManager();\n\t\tconst installCmd = getInstallCommand(pm, packageName, latestVersion);\n\n\t\tconsole.log(`Upgrading via ${pm}...\\n`);\n\t\tconsole.log(` $ ${installCmd}\\n`);\n\n\t\texecSync(installCmd, { stdio: \"inherit\" });\n\n\t\tconsole.log(`\\nSuccessfully upgraded to ${latestVersion}`);\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 getCurrentVersion(): string {\n\ttry {\n\t\tconst output = execSync(\"pspm --version\", {\n\t\t\tencoding: \"utf-8\",\n\t\t\tstdio: [\"pipe\", \"pipe\", \"pipe\"],\n\t\t}).trim();\n\t\treturn output;\n\t} catch {\n\t\treturn \"unknown\";\n\t}\n}\n\nfunction getLatestVersion(packageName: string): string | null {\n\ttry {\n\t\tconst output = execSync(`npm view ${packageName} version`, {\n\t\t\tencoding: \"utf-8\",\n\t\t\tstdio: [\"pipe\", \"pipe\", \"pipe\"],\n\t\t}).trim();\n\t\treturn output || null;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nfunction detectPackageManager(): \"pnpm\" | \"npm\" | \"yarn\" | \"bun\" {\n\t// Check if installed globally via specific package managers\n\ttry {\n\t\tconst pnpmList = execSync(\"pnpm list -g --depth=0 2>/dev/null\", {\n\t\t\tencoding: \"utf-8\",\n\t\t\tstdio: [\"pipe\", \"pipe\", \"pipe\"],\n\t\t});\n\t\tif (pnpmList.includes(\"@anytio/pspm\")) return \"pnpm\";\n\t} catch {}\n\n\ttry {\n\t\tconst bunList = execSync(\"bun pm ls -g 2>/dev/null\", {\n\t\t\tencoding: \"utf-8\",\n\t\t\tstdio: [\"pipe\", \"pipe\", \"pipe\"],\n\t\t});\n\t\tif (bunList.includes(\"@anytio/pspm\")) return \"bun\";\n\t} catch {}\n\n\ttry {\n\t\tconst yarnList = execSync(\"yarn global list 2>/dev/null\", {\n\t\t\tencoding: \"utf-8\",\n\t\t\tstdio: [\"pipe\", \"pipe\", \"pipe\"],\n\t\t});\n\t\tif (yarnList.includes(\"@anytio/pspm\")) return \"yarn\";\n\t} catch {}\n\n\t// Default to npm\n\treturn \"npm\";\n}\n\nfunction getInstallCommand(\n\tpm: \"pnpm\" | \"npm\" | \"yarn\" | \"bun\",\n\tpackageName: string,\n\tversion: string,\n): string {\n\tswitch (pm) {\n\t\tcase \"pnpm\":\n\t\t\treturn `pnpm add -g ${packageName}@${version}`;\n\t\tcase \"yarn\":\n\t\t\treturn `yarn global add ${packageName}@${version}`;\n\t\tcase \"bun\":\n\t\t\treturn `bun add -g ${packageName}@${version}`;\n\t\tcase \"npm\":\n\t\t\treturn `npm install -g ${packageName}@${version}`;\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","import { execSync } from \"node:child_process\";\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\n\nconst PACKAGE_NAME = \"@anytio/pspm\";\nconst CHECK_INTERVAL_MS = 24 * 60 * 60 * 1000; // 24 hours\nconst CACHE_DIR = join(homedir(), \".pspm\");\nconst CACHE_FILE = join(CACHE_DIR, \"update-check.json\");\n\ninterface UpdateCache {\n\tlastCheck: number;\n\tlatestVersion: string;\n}\n\n/**\n * Check for updates in the background and print a warning if outdated.\n * This is non-blocking — it reads from cache and spawns a background check.\n */\nexport async function checkForUpdates(currentVersion: string): Promise<void> {\n\ttry {\n\t\tconst cache = await readCache();\n\n\t\t// If cache exists and is fresh, show warning if needed\n\t\tif (cache && Date.now() - cache.lastCheck < CHECK_INTERVAL_MS) {\n\t\t\tif (cache.latestVersion !== currentVersion) {\n\t\t\t\tprintUpdateWarning(currentVersion, cache.latestVersion);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\t// Cache is stale or missing — fetch in background\n\t\tfetchAndCache(currentVersion);\n\t} catch {\n\t\t// Never let update checking break the CLI\n\t}\n}\n\nasync function readCache(): Promise<UpdateCache | null> {\n\ttry {\n\t\tconst content = await readFile(CACHE_FILE, \"utf-8\");\n\t\treturn JSON.parse(content) as UpdateCache;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nasync function writeCache(cache: UpdateCache): Promise<void> {\n\tawait mkdir(CACHE_DIR, { recursive: true });\n\tawait writeFile(CACHE_FILE, JSON.stringify(cache));\n}\n\n/**\n * Fetch latest version and update cache.\n * Runs synchronously but is called after command execution so it doesn't block UX.\n */\nfunction fetchAndCache(currentVersion: string): void {\n\ttry {\n\t\tconst latestVersion = execSync(`npm view ${PACKAGE_NAME} version`, {\n\t\t\tencoding: \"utf-8\",\n\t\t\ttimeout: 5000,\n\t\t\tstdio: [\"pipe\", \"pipe\", \"pipe\"],\n\t\t}).trim();\n\n\t\tif (!latestVersion) return;\n\n\t\tconst cache: UpdateCache = {\n\t\t\tlastCheck: Date.now(),\n\t\t\tlatestVersion,\n\t\t};\n\n\t\t// Write cache (fire and forget)\n\t\twriteCache(cache).catch(() => {});\n\n\t\tif (latestVersion !== currentVersion) {\n\t\t\tprintUpdateWarning(currentVersion, latestVersion);\n\t\t}\n\t} catch {\n\t\t// Network error or npm not available — silently ignore\n\t}\n}\n\nfunction printUpdateWarning(\n\tcurrentVersion: string,\n\tlatestVersion: string,\n): void {\n\tconsole.warn(\n\t\t`\\n Update available: ${currentVersion} → ${latestVersion}` +\n\t\t\t\"\\n Run `pspm upgrade` to update\\n\",\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\taudit,\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\tsearch,\n\tunpublish,\n\tupdate,\n\tupgrade,\n\tversion as versionCommand,\n\twhoami,\n} from \"./commands/index\";\nimport { checkForUpdates } from \"./update-notifier\";\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// Self-upgrade\n// =============================================================================\n\nprogram\n\t.command(\"upgrade\")\n\t.description(\"Upgrade pspm to the latest version\")\n\t.action(async () => {\n\t\tawait upgrade();\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 skills from registry, GitHub, local paths, or well-known URLs\",\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(\"-g, --global\", \"Install to user home directory instead of project\")\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\tglobal: options.global,\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.option(\"-g, --global\", \"List globally installed skills\")\n\t.action(async (options) => {\n\t\tawait list({ json: options.json, global: options.global });\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(\"-g, --global\", \"Install to user home directory instead of project\")\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\tglobal: options.global,\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(\"-g, --global\", \"Recreate global agent symlinks\")\n\t.option(\"-y, --yes\", \"Skip agent selection prompt and use defaults\")\n\t.action(async (options) => {\n\t\tawait link({\n\t\t\tagent: options.agent,\n\t\t\tyes: options.yes,\n\t\t\tglobal: options.global,\n\t\t});\n\t});\n\nprogram\n\t.command(\"update\")\n\t.description(\"Update all skills to latest compatible versions\")\n\t.option(\"--dry-run\", \"Show what would be updated without making changes\")\n\t.action(async (options) => {\n\t\tawait update({ dryRun: options.dryRun });\n\t});\n\nprogram\n\t.command(\"search [query]\")\n\t.alias(\"find\")\n\t.description(\"Search and discover skills from the registry\")\n\t.option(\n\t\t\"-s, --sort <sort>\",\n\t\t\"Sort by: downloads, recent, name (default: downloads)\",\n\t)\n\t.option(\"-l, --limit <n>\", \"Maximum results (default: 20)\", Number.parseInt)\n\t.option(\"--json\", \"Output as JSON\")\n\t.action(async (query: string | undefined, options) => {\n\t\tawait search(query, {\n\t\t\tsort: options.sort,\n\t\t\tlimit: options.limit,\n\t\t\tjson: options.json,\n\t\t});\n\t});\n\nprogram\n\t.command(\"audit\")\n\t.description(\"Verify integrity of installed skills and check for issues\")\n\t.option(\"--json\", \"Output as JSON\")\n\t.action(async (options) => {\n\t\tawait audit({ json: options.json });\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\n// Parse and execute command, then check for updates\nawait program.parseAsync();\nawait checkForUpdates(version);\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","../../../packages/shared/pspm-types/src/integrity.ts","../../../packages/shared/pspm-types/src/local.ts","../../../packages/shared/pspm-types/src/lockfile.ts","../../../packages/shared/pspm-types/src/manifest.ts","../../../packages/shared/pspm-types/src/specifier.ts","../../../packages/shared/pspm-types/src/version.ts","../../../packages/shared/pspm-types/src/index.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/wellknown.ts","../src/commands/add.ts","../src/commands/access.ts","../src/commands/index.ts","../src/commands/audit.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/search.ts","../src/commands/unpublish.ts","../src/commands/update.ts","../src/commands/upgrade.ts","../src/commands/version.ts","../src/commands/whoami.ts","../src/update-notifier.ts","../src/index.ts"],"names":["version","configure","config","join","readFile","init_integrity","init_lockfile","init_manifest","resolveVersion","isNewerVersion","init_version","parseRegistrySpecifier","REGISTRY_SPECIFIER_PATTERN","generateRegistryIdentifier","isRegistrySpecifier","parseGitHubSpecifier","formatGitHubSpecifier","getGitHubSkillName","isGitHubSpecifier","init_specifier","mkdir","writeFile","exec","promisify","pathExists","stat","dirname","homedir","lstat","rm","isLocalSpecifier","normalizeToFileSpecifier","relative","symlink","totalPackages","resolve","basename","confirm","createHash","setGlobalMode","add","access","URL","exchangeCliToken","readdir","semver3","compareVersions","getLatestVersion","valid","checkOutdated","execCb","createInterface","packageJson","semver","semver4","execSync","__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 baseUrl: string;\n /** API key for authentication. Optional for public package access. */\n apiKey?: 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 config = options;\n}\n\n/**\n * Get the current SDK configuration.\n * @throws Error if not configured\n */\nexport function getConfig(): SDKConfig {\n if (!config) {\n throw new Error(\"SDK not configured. Call configure() first.\");\n }\n return config;\n}\n\n/**\n * Check if the SDK is configured.\n */\nexport function isConfigured(): boolean {\n return config !== null;\n}\n\n/**\n * Error class for SDK API errors\n */\nexport class SDKError extends Error {\n constructor(\n message: string,\n public readonly status: number,\n public readonly body?: string,\n ) {\n super(message);\n this.name = \"SDKError\";\n }\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 url: string,\n options: RequestInit,\n): Promise<T> {\n const { baseUrl, apiKey } = getConfig();\n\n // The URL from Orval will be like \"/api/skills/me\"\n // We need to prepend the baseUrl\n const fullUrl = `${baseUrl}${url}`;\n\n // Build headers - only include Authorization if apiKey is provided\n const headers: Record<string, string> = {\n ...((options.headers as Record<string, string>) ?? {}),\n \"Content-Type\": \"application/json\",\n };\n if (apiKey) {\n headers.Authorization = `Bearer ${apiKey}`;\n }\n\n const response = await fetch(fullUrl, {\n ...options,\n headers,\n });\n\n const text = await response.text();\n let data: unknown = null;\n\n if (text) {\n try {\n data = JSON.parse(text);\n } catch {\n data = text;\n }\n }\n\n // Return the structure expected by Orval v8: { data, status, headers }\n return {\n data,\n status: response.status,\n headers: response.headers,\n } as T;\n}\n","/**\n * Generated by orval v8.5.3 🍺\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';\n/**\n * User list item for admin dashboard\n */\nexport interface AdminUserListItem {\n id: string;\n name: string;\n email: string;\n username: string | null;\n role: string;\n tier: string;\n createdAt: string | null;\n}\n\n/**\n * Paginated user list response\n */\nexport interface AdminUserListResponse {\n users: AdminUserListItem[];\n total: number;\n page: number;\n limit: number;\n}\n\nexport type ValidationErrorCode = typeof ValidationErrorCode[keyof typeof ValidationErrorCode];\n\n\nexport const ValidationErrorCode = {\n VALIDATION_ERROR: 'VALIDATION_ERROR',\n} as const;\n\nexport type ValidationErrorDetailsIssuesItem = {\n path: (string | number)[];\n message: string;\n};\n\nexport type ValidationErrorDetails = {\n issues: ValidationErrorDetailsIssuesItem[];\n};\n\nexport type ApiErrorCode = typeof ApiErrorCode[keyof typeof ApiErrorCode];\n\n\nexport const ApiErrorCode = {\n BAD_REQUEST: 'BAD_REQUEST',\n UNAUTHORIZED: 'UNAUTHORIZED',\n FORBIDDEN: 'FORBIDDEN',\n NOT_FOUND: 'NOT_FOUND',\n CONFLICT: 'CONFLICT',\n VALIDATION_ERROR: 'VALIDATION_ERROR',\n INTERNAL_ERROR: 'INTERNAL_ERROR',\n} as const;\n\nexport type ApiErrorDetails = {[key: string]: unknown | null};\n\nexport interface ApiError {\n code: ApiErrorCode;\n message: string;\n details?: ApiErrorDetails;\n requestId?: string;\n timestamp: string;\n}\n\nexport type ValidationError = ApiError & {\n code?: ValidationErrorCode;\n details: ValidationErrorDetails;\n};\n\n/**\n * Admin dashboard stats\n */\nexport interface AdminStats {\n totalUsers: number;\n proUsers: number;\n newUsersThisMonth: number;\n}\n\n/**\n * Updated user role response\n */\nexport interface UpdateUserRoleResponse {\n id: string;\n role: string;\n}\n\nexport type UpdateUserRoleInputRole = typeof UpdateUserRoleInputRole[keyof typeof UpdateUserRoleInputRole];\n\n\nexport const UpdateUserRoleInputRole = {\n user: 'user',\n admin: 'admin',\n} as const;\n\n/**\n * Input for updating a user's role\n */\nexport interface UpdateUserRoleInput {\n role: UpdateUserRoleInputRole;\n}\n\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\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\nexport interface ContactSuccessResponse {\n success: boolean;\n}\n\n/**\n * Input for creating a contact message\n */\nexport interface CreateContactMessage {\n /**\n * @minLength 1\n * @maxLength 200\n */\n name: string;\n /** @maxLength 320 */\n email: string;\n /**\n * @minLength 1\n * @maxLength 5000\n */\n message: string;\n}\n\n/**\n * A contact message\n */\nexport interface ContactMessage {\n id: string;\n name: string;\n email: string;\n message: string;\n isRead: boolean;\n createdAt: string | null;\n}\n\n/**\n * Paginated contact message list\n */\nexport interface ContactMessageListResponse {\n messages: ContactMessage[];\n total: number;\n page: number;\n limit: number;\n}\n\nexport interface Organization {\n id: string;\n name: string;\n displayName: string | null;\n description: string | null;\n avatarUrl: string | null;\n createdAt: string | null;\n updatedAt: string | null;\n}\n\nexport interface CreateOrgInput {\n /**\n * @minLength 3\n * @maxLength 39\n * @pattern ^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$\n */\n name: string;\n /** @maxLength 100 */\n displayName?: string;\n /** @maxLength 500 */\n description?: string;\n}\n\nexport type OrgMemberRole = typeof OrgMemberRole[keyof typeof OrgMemberRole];\n\n\nexport const OrgMemberRole = {\n owner: 'owner',\n admin: 'admin',\n member: 'member',\n} as const;\n\nexport interface OrgMember {\n id: string;\n orgId: string;\n userId: string;\n role: OrgMemberRole;\n joinedAt: string | null;\n username?: string | null;\n email?: string | null;\n}\n\nexport type AddMemberInputRole = typeof AddMemberInputRole[keyof typeof AddMemberInputRole];\n\n\nexport const AddMemberInputRole = {\n owner: 'owner',\n admin: 'admin',\n member: 'member',\n} as const;\n\nexport interface AddMemberInput {\n userId: string;\n role?: AddMemberInputRole;\n}\n\nexport type UpdateMemberRoleInputRole = typeof UpdateMemberRoleInputRole[keyof typeof UpdateMemberRoleInputRole];\n\n\nexport const UpdateMemberRoleInputRole = {\n owner: 'owner',\n admin: 'admin',\n member: 'member',\n} as const;\n\nexport interface UpdateMemberRoleInput {\n role: UpdateMemberRoleInputRole;\n}\n\nexport interface OrgSuccessResponse {\n success: boolean;\n}\n\nexport type OrgInvitationRole = typeof OrgInvitationRole[keyof typeof OrgInvitationRole];\n\n\nexport const OrgInvitationRole = {\n owner: 'owner',\n admin: 'admin',\n member: 'member',\n} as const;\n\nexport type OrgInvitationStatus = typeof OrgInvitationStatus[keyof typeof OrgInvitationStatus];\n\n\nexport const OrgInvitationStatus = {\n pending: 'pending',\n accepted: 'accepted',\n expired: 'expired',\n} as const;\n\nexport interface OrgInvitation {\n id: string;\n orgId: string;\n email: string;\n role: OrgInvitationRole;\n status: OrgInvitationStatus;\n createdAt: string | null;\n expiresAt: string | null;\n inviterUsername?: string | null;\n}\n\nexport type CreateInvitationInputRole = typeof CreateInvitationInputRole[keyof typeof CreateInvitationInputRole];\n\n\nexport const CreateInvitationInputRole = {\n owner: 'owner',\n admin: 'admin',\n member: 'member',\n} as const;\n\nexport interface CreateInvitationInput {\n email: string;\n role?: CreateInvitationInputRole;\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 (owner only), team (org members), or public (everyone)\n */\nexport type Visibility = typeof Visibility[keyof typeof Visibility];\n\n\nexport const Visibility = {\n private: 'private',\n team: 'team',\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 * GitHub repository metadata for indexed skills\n */\nexport type GithubRepoInfo = {\n owner: string;\n repo: string;\n stars: number;\n forks: number;\n avatarUrl: string | null;\n htmlUrl: string | null;\n license: string | null;\n githubPath: string | null;\n} | null\n\n/**\n * Skill with download stats for explore/marketplace view\n */\nexport type ExploreSkill = SkillWithUser & ({\n totalDownloads: number;\n namespace?: string;\n userImage?: string | null;\n github?: GithubRepoInfo | null;\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 namespace?: string;\n github?: GithubRepoInfo | null;\n userImage?: 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 * Download statistics for a skill package\n */\nexport interface SkillStatsResponse {\n totalDownloads: number;\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\nexport type UserProfileType = typeof UserProfileType[keyof typeof UserProfileType];\n\n\nexport const UserProfileType = {\n user: 'user',\n} as const;\n\nexport interface UserProfile {\n type: UserProfileType;\n username: string;\n image: string | null;\n memberSince: string | null;\n}\n\nexport type GithubOwnerProfileType = typeof GithubOwnerProfileType[keyof typeof GithubOwnerProfileType];\n\n\nexport const GithubOwnerProfileType = {\n github_owner: 'github_owner',\n} as const;\n\nexport type GithubOwnerProfileReposItem = {\n repo: string;\n stars: number;\n description: string | null;\n};\n\nexport interface GithubOwnerProfile {\n type: GithubOwnerProfileType;\n owner: string;\n avatarUrl: string | null;\n repos: GithubOwnerProfileReposItem[];\n}\n\nexport type GithubRepoProfileType = typeof GithubRepoProfileType[keyof typeof GithubRepoProfileType];\n\n\nexport const GithubRepoProfileType = {\n github_repo: 'github_repo',\n} as const;\n\nexport interface GithubRepoProfile {\n type: GithubRepoProfileType;\n owner: string;\n repo: string;\n avatarUrl: string | null;\n htmlUrl: string | null;\n stars: number;\n forks: number;\n license: string | null;\n description: string | null;\n}\n\n/**\n * Profile metadata with paginated skills list\n */\nexport interface ProfileResponse {\n profile: UserProfile | GithubOwnerProfile | GithubRepoProfile;\n skills: ExploreSkill[];\n total: number;\n page: number;\n limit: number;\n totalPages: number;\n}\n\nexport interface IndexedRepo {\n id: string;\n owner: string;\n repo: string;\n defaultRef: string | null;\n lastIndexedAt: string | null;\n lastCommitSha: string | null;\n indexStatus: string | null;\n skillCount: number | null;\n createdAt: string;\n}\n\nexport interface AddRepoInput {\n /** @minLength 1 */\n owner: string;\n /** @minLength 1 */\n repo: string;\n ref?: string;\n}\n\nexport interface JobEnqueued {\n jobId: string;\n status: string;\n message: string;\n}\n\nexport interface IndexResult {\n owner: string;\n repo: string;\n ref: string;\n commitSha: string;\n skillsDiscovered: number;\n skillsCreated: number;\n skillsUpdated: number;\n skillsSkipped: number;\n errors: string[];\n}\n\nexport interface BulkActionResult {\n action: string;\n affected: number;\n message: string;\n}\n\nexport type BulkActionInputAction = typeof BulkActionInputAction[keyof typeof BulkActionInputAction];\n\n\nexport const BulkActionInputAction = {\n 'index-pending': 'index-pending',\n 'index-failed': 'index-failed',\n 'reset-status': 'reset-status',\n 'purge-jobs': 'purge-jobs',\n} as const;\n\nexport interface BulkActionInput {\n action: BulkActionInputAction;\n}\n\nexport interface JobStatus {\n id: string;\n type: string;\n repoId: string | null;\n status: string;\n totalSkills: number | null;\n completedSkills: number | null;\n failedSkills: number | null;\n result?: unknown | null;\n error: string | null;\n createdAt: string;\n startedAt: string | null;\n completedAt: string | null;\n}\n\nexport interface PaginatedJobs {\n jobs: JobStatus[];\n total: number;\n page: number;\n limit: number;\n totalPages: number;\n}\n\nexport interface RepoSkill {\n id: string;\n name: string;\n description: string | null;\n githubPath: string | null;\n visibility: string;\n downloadCount: number;\n versionCount: number;\n createdAt: string;\n updatedAt: string;\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 AdminListUsersParams = {\n/**\n * @minimum 1\n */\npage?: number;\n/**\n * @minimum 1\n * @maximum 100\n */\nlimit?: number;\nsearch?: string;\nsort?: AdminListUsersSort;\norder?: AdminListUsersOrder;\n};\n\nexport type AdminListUsersSort = typeof AdminListUsersSort[keyof typeof AdminListUsersSort];\n\n\nexport const AdminListUsersSort = {\n name: 'name',\n email: 'email',\n role: 'role',\n tier: 'tier',\n createdAt: 'createdAt',\n} as const;\n\nexport type AdminListUsersOrder = typeof AdminListUsersOrder[keyof typeof AdminListUsersOrder];\n\n\nexport const AdminListUsersOrder = {\n asc: 'asc',\n desc: 'desc',\n} as const;\n\nexport type CheckUsernameAvailabilityParams = {\n/**\n * @minLength 3\n * @maxLength 39\n */\nusername: string;\n};\n\nexport type ListContactMessagesParams = {\n/**\n * @minimum 1\n */\npage?: number;\n/**\n * @minimum 1\n * @maximum 100\n */\nlimit?: number;\nunreadOnly?: string;\n};\n\nexport type ListMyOrganizations200Item = Organization & {\n role: string;\n};\n\nexport type ExplorePublicSkillsParams = {\nsearch?: string;\nsort?: ExplorePublicSkillsSort;\nnamespace?: ExplorePublicSkillsNamespace;\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 stars: 'stars',\n} as const;\n\nexport type ExplorePublicSkillsNamespace = typeof ExplorePublicSkillsNamespace[keyof typeof ExplorePublicSkillsNamespace];\n\n\nexport const ExplorePublicSkillsNamespace = {\n user: 'user',\n org: 'org',\n github: 'github',\n} as const;\n\nexport type GetUserProfileParams = {\nsearch?: string;\nsort?: GetUserProfileSort;\nnamespace?: GetUserProfileNamespace;\n/**\n * @minimum 1\n */\npage?: number;\n/**\n * @minimum 1\n * @maximum 100\n */\nlimit?: number;\n};\n\nexport type GetUserProfileSort = typeof GetUserProfileSort[keyof typeof GetUserProfileSort];\n\n\nexport const GetUserProfileSort = {\n downloads: 'downloads',\n recent: 'recent',\n name: 'name',\n stars: 'stars',\n} as const;\n\nexport type GetUserProfileNamespace = typeof GetUserProfileNamespace[keyof typeof GetUserProfileNamespace];\n\n\nexport const GetUserProfileNamespace = {\n user: 'user',\n org: 'org',\n github: 'github',\n} as const;\n\nexport type GetGithubOwnerProfileParams = {\nsearch?: string;\nsort?: GetGithubOwnerProfileSort;\nnamespace?: GetGithubOwnerProfileNamespace;\n/**\n * @minimum 1\n */\npage?: number;\n/**\n * @minimum 1\n * @maximum 100\n */\nlimit?: number;\n};\n\nexport type GetGithubOwnerProfileSort = typeof GetGithubOwnerProfileSort[keyof typeof GetGithubOwnerProfileSort];\n\n\nexport const GetGithubOwnerProfileSort = {\n downloads: 'downloads',\n recent: 'recent',\n name: 'name',\n stars: 'stars',\n} as const;\n\nexport type GetGithubOwnerProfileNamespace = typeof GetGithubOwnerProfileNamespace[keyof typeof GetGithubOwnerProfileNamespace];\n\n\nexport const GetGithubOwnerProfileNamespace = {\n user: 'user',\n org: 'org',\n github: 'github',\n} as const;\n\nexport type GetGithubRepoProfileParams = {\nsearch?: string;\nsort?: GetGithubRepoProfileSort;\nnamespace?: GetGithubRepoProfileNamespace;\n/**\n * @minimum 1\n */\npage?: number;\n/**\n * @minimum 1\n * @maximum 100\n */\nlimit?: number;\n};\n\nexport type GetGithubRepoProfileSort = typeof GetGithubRepoProfileSort[keyof typeof GetGithubRepoProfileSort];\n\n\nexport const GetGithubRepoProfileSort = {\n downloads: 'downloads',\n recent: 'recent',\n name: 'name',\n stars: 'stars',\n} as const;\n\nexport type GetGithubRepoProfileNamespace = typeof GetGithubRepoProfileNamespace[keyof typeof GetGithubRepoProfileNamespace];\n\n\nexport const GetGithubRepoProfileNamespace = {\n user: 'user',\n org: 'org',\n github: 'github',\n} as const;\n\nexport type DeleteIndexedRepo200 = {\n success: boolean;\n};\n\nexport type ListIndexerJobsParams = {\n/**\n * @minimum 1\n */\npage?: number;\n/**\n * @minimum 1\n * @maximum 100\n */\nlimit?: number;\nstatus?: ListIndexerJobsStatus;\nsort?: ListIndexerJobsSort;\norder?: ListIndexerJobsOrder;\n};\n\nexport type ListIndexerJobsStatus = typeof ListIndexerJobsStatus[keyof typeof ListIndexerJobsStatus];\n\n\nexport const ListIndexerJobsStatus = {\n queued: 'queued',\n active: 'active',\n completed: 'completed',\n failed: 'failed',\n} as const;\n\nexport type ListIndexerJobsSort = typeof ListIndexerJobsSort[keyof typeof ListIndexerJobsSort];\n\n\nexport const ListIndexerJobsSort = {\n createdAt: 'createdAt',\n status: 'status',\n type: 'type',\n} as const;\n\nexport type ListIndexerJobsOrder = typeof ListIndexerJobsOrder[keyof typeof ListIndexerJobsOrder];\n\n\nexport const ListIndexerJobsOrder = {\n asc: 'asc',\n desc: 'desc',\n} as const;\n\nexport type DeleteRepoSkill200 = {\n success: boolean;\n};\n\n/**\n * List all users with pagination and search (admin only)\n * @summary List all users\n */\nexport type adminListUsersResponse200 = {\n data: AdminUserListResponse\n status: 200\n}\n\nexport type adminListUsersResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type adminListUsersResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type adminListUsersResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type adminListUsersResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type adminListUsersResponse500 = {\n data: ApiError\n status: 500\n}\n\nexport type adminListUsersResponseSuccess = (adminListUsersResponse200) & {\n headers: Headers;\n};\nexport type adminListUsersResponseError = (adminListUsersResponse400 | adminListUsersResponse401 | adminListUsersResponse403 | adminListUsersResponse404 | adminListUsersResponse500) & {\n headers: Headers;\n};\n\nexport type adminListUsersResponse = (adminListUsersResponseSuccess | adminListUsersResponseError)\n\nexport const getAdminListUsersUrl = (params?: AdminListUsersParams,) => {\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/admin/users?${stringifiedParams}` : `/api/admin/users`\n}\n\nexport const adminListUsers = async (params?: AdminListUsersParams, options?: RequestInit): Promise<adminListUsersResponse> => {\n \n return customFetch<adminListUsersResponse>(getAdminListUsersUrl(params),\n { \n ...options,\n method: 'GET'\n \n \n }\n);}\n \n\n\n/**\n * Get aggregate user statistics (admin only)\n * @summary Get admin stats\n */\nexport type adminGetStatsResponse200 = {\n data: AdminStats\n status: 200\n}\n\nexport type adminGetStatsResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type adminGetStatsResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type adminGetStatsResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type adminGetStatsResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type adminGetStatsResponse500 = {\n data: ApiError\n status: 500\n}\n\nexport type adminGetStatsResponseSuccess = (adminGetStatsResponse200) & {\n headers: Headers;\n};\nexport type adminGetStatsResponseError = (adminGetStatsResponse400 | adminGetStatsResponse401 | adminGetStatsResponse403 | adminGetStatsResponse404 | adminGetStatsResponse500) & {\n headers: Headers;\n};\n\nexport type adminGetStatsResponse = (adminGetStatsResponseSuccess | adminGetStatsResponseError)\n\nexport const getAdminGetStatsUrl = () => {\n\n\n \n\n return `/api/admin/stats`\n}\n\nexport const adminGetStats = async ( options?: RequestInit): Promise<adminGetStatsResponse> => {\n \n return customFetch<adminGetStatsResponse>(getAdminGetStatsUrl(),\n { \n ...options,\n method: 'GET'\n \n \n }\n);}\n \n\n\n/**\n * Update a user's role (admin only)\n * @summary Update user role\n */\nexport type adminUpdateUserRoleResponse200 = {\n data: UpdateUserRoleResponse\n status: 200\n}\n\nexport type adminUpdateUserRoleResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type adminUpdateUserRoleResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type adminUpdateUserRoleResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type adminUpdateUserRoleResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type adminUpdateUserRoleResponse500 = {\n data: ApiError\n status: 500\n}\n\nexport type adminUpdateUserRoleResponseSuccess = (adminUpdateUserRoleResponse200) & {\n headers: Headers;\n};\nexport type adminUpdateUserRoleResponseError = (adminUpdateUserRoleResponse400 | adminUpdateUserRoleResponse401 | adminUpdateUserRoleResponse403 | adminUpdateUserRoleResponse404 | adminUpdateUserRoleResponse500) & {\n headers: Headers;\n};\n\nexport type adminUpdateUserRoleResponse = (adminUpdateUserRoleResponseSuccess | adminUpdateUserRoleResponseError)\n\nexport const getAdminUpdateUserRoleUrl = (id: string,) => {\n\n\n \n\n return `/api/admin/users/${id}/role`\n}\n\nexport const adminUpdateUserRole = async (id: string,\n updateUserRoleInput: UpdateUserRoleInput, options?: RequestInit): Promise<adminUpdateUserRoleResponse> => {\n \n return customFetch<adminUpdateUserRoleResponse>(getAdminUpdateUserRoleUrl(id),\n { \n ...options,\n method: 'PATCH',\n headers: { 'Content-Type': 'application/json', ...options?.headers },\n body: JSON.stringify(\n updateUserRoleInput,)\n }\n);}\n \n\n\n/**\n * Retrieve all API keys for the authenticated user\n * @summary List all API keys\n */\nexport type listApiKeysResponse200 = {\n data: ApiKeyListResponse\n status: 200\n}\n\nexport type listApiKeysResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type listApiKeysResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type listApiKeysResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type listApiKeysResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type listApiKeysResponse500 = {\n data: ApiError\n status: 500\n}\n\nexport type listApiKeysResponseSuccess = (listApiKeysResponse200) & {\n headers: Headers;\n};\nexport type listApiKeysResponseError = (listApiKeysResponse400 | listApiKeysResponse401 | listApiKeysResponse403 | listApiKeysResponse404 | listApiKeysResponse500) & {\n headers: Headers;\n};\n\nexport type listApiKeysResponse = (listApiKeysResponseSuccess | listApiKeysResponseError)\n\nexport const getListApiKeysUrl = () => {\n\n\n \n\n return `/api/api-keys/api-keys`\n}\n\nexport const listApiKeys = async ( options?: RequestInit): Promise<listApiKeysResponse> => {\n \n return customFetch<listApiKeysResponse>(getListApiKeysUrl(),\n { \n ...options,\n method: 'GET'\n \n \n }\n);}\n \n\n\n/**\n * Create a new API key with optional expiration\n * @summary Create a new API key\n */\nexport type createApiKeyResponse200 = {\n data: CreateApiKeyResponse\n status: 200\n}\n\nexport type createApiKeyResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type createApiKeyResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type createApiKeyResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type createApiKeyResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type createApiKeyResponse500 = {\n data: ApiError\n status: 500\n}\n\nexport type createApiKeyResponseSuccess = (createApiKeyResponse200) & {\n headers: Headers;\n};\nexport type createApiKeyResponseError = (createApiKeyResponse400 | createApiKeyResponse401 | createApiKeyResponse403 | createApiKeyResponse404 | createApiKeyResponse500) & {\n headers: Headers;\n};\n\nexport type createApiKeyResponse = (createApiKeyResponseSuccess | createApiKeyResponseError)\n\nexport const getCreateApiKeyUrl = () => {\n\n\n \n\n return `/api/api-keys/api-keys`\n}\n\nexport const createApiKey = async (createApiKeyInput: CreateApiKeyInput, options?: RequestInit): Promise<createApiKeyResponse> => {\n \n return customFetch<createApiKeyResponse>(getCreateApiKeyUrl(),\n { \n ...options,\n method: 'POST',\n headers: { 'Content-Type': 'application/json', ...options?.headers },\n body: JSON.stringify(\n createApiKeyInput,)\n }\n);}\n \n\n\n/**\n * Revoke and delete an API key\n * @summary Delete an API key\n */\nexport type deleteApiKeyResponse200 = {\n data: SuccessResponse\n status: 200\n}\n\nexport type deleteApiKeyResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type deleteApiKeyResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type deleteApiKeyResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type deleteApiKeyResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type deleteApiKeyResponse500 = {\n data: ApiError\n status: 500\n}\n\nexport type deleteApiKeyResponseSuccess = (deleteApiKeyResponse200) & {\n headers: Headers;\n};\nexport type deleteApiKeyResponseError = (deleteApiKeyResponse400 | deleteApiKeyResponse401 | deleteApiKeyResponse403 | deleteApiKeyResponse404 | deleteApiKeyResponse500) & {\n headers: Headers;\n};\n\nexport type deleteApiKeyResponse = (deleteApiKeyResponseSuccess | deleteApiKeyResponseError)\n\nexport const getDeleteApiKeyUrl = () => {\n\n\n \n\n return `/api/api-keys/api-keys`\n}\n\nexport const deleteApiKey = async (deleteApiKeyInput: DeleteApiKeyInput, options?: RequestInit): Promise<deleteApiKeyResponse> => {\n \n return customFetch<deleteApiKeyResponse>(getDeleteApiKeyUrl(),\n { \n ...options,\n method: 'DELETE',\n headers: { 'Content-Type': 'application/json', ...options?.headers },\n body: JSON.stringify(\n deleteApiKeyInput,)\n }\n);}\n \n\n\n/**\n * Update the name/description of an API key\n * @summary Update API key name\n */\nexport type updateApiKeyNameResponse200 = {\n data: ApiKey\n status: 200\n}\n\nexport type updateApiKeyNameResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type updateApiKeyNameResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type updateApiKeyNameResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type updateApiKeyNameResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type updateApiKeyNameResponse500 = {\n data: ApiError\n status: 500\n}\n\nexport type updateApiKeyNameResponseSuccess = (updateApiKeyNameResponse200) & {\n headers: Headers;\n};\nexport type updateApiKeyNameResponseError = (updateApiKeyNameResponse400 | updateApiKeyNameResponse401 | updateApiKeyNameResponse403 | updateApiKeyNameResponse404 | updateApiKeyNameResponse500) & {\n headers: Headers;\n};\n\nexport type updateApiKeyNameResponse = (updateApiKeyNameResponseSuccess | updateApiKeyNameResponseError)\n\nexport const getUpdateApiKeyNameUrl = () => {\n\n\n \n\n return `/api/api-keys/api-keys`\n}\n\nexport const updateApiKeyName = async (updateApiKeyInput: UpdateApiKeyInput, options?: RequestInit): Promise<updateApiKeyNameResponse> => {\n \n return customFetch<updateApiKeyNameResponse>(getUpdateApiKeyNameUrl(),\n { \n ...options,\n method: 'PUT',\n headers: { 'Content-Type': 'application/json', ...options?.headers },\n body: JSON.stringify(\n updateApiKeyInput,)\n }\n);}\n \n\n\n/**\n * Create a short-lived token for CLI browser-based authentication\n * @summary Create a CLI login token\n */\nexport type createCliTokenResponse200 = {\n data: CreateCliTokenResponse\n status: 200\n}\n\nexport type createCliTokenResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type createCliTokenResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type createCliTokenResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type createCliTokenResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type createCliTokenResponse500 = {\n data: ApiError\n status: 500\n}\n\nexport type createCliTokenResponseSuccess = (createCliTokenResponse200) & {\n headers: Headers;\n};\nexport type createCliTokenResponseError = (createCliTokenResponse400 | createCliTokenResponse401 | createCliTokenResponse403 | createCliTokenResponse404 | createCliTokenResponse500) & {\n headers: Headers;\n};\n\nexport type createCliTokenResponse = (createCliTokenResponseSuccess | createCliTokenResponseError)\n\nexport const getCreateCliTokenUrl = () => {\n\n\n \n\n return `/api/api-keys/cli-token`\n}\n\nexport const createCliToken = async (createCliTokenInput: CreateCliTokenInput, options?: RequestInit): Promise<createCliTokenResponse> => {\n \n return customFetch<createCliTokenResponse>(getCreateCliTokenUrl(),\n { \n ...options,\n method: 'POST',\n headers: { 'Content-Type': 'application/json', ...options?.headers },\n body: JSON.stringify(\n createCliTokenInput,)\n }\n);}\n \n\n\n/**\n * Exchange a CLI login token for an API key (called by CLI after browser redirect)\n * @summary Exchange CLI token for API key\n */\nexport type exchangeCliTokenResponse200 = {\n data: ExchangeCliTokenResponse\n status: 200\n}\n\nexport type exchangeCliTokenResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type exchangeCliTokenResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type exchangeCliTokenResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type exchangeCliTokenResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type exchangeCliTokenResponse500 = {\n data: ApiError\n status: 500\n}\n\nexport type exchangeCliTokenResponseSuccess = (exchangeCliTokenResponse200) & {\n headers: Headers;\n};\nexport type exchangeCliTokenResponseError = (exchangeCliTokenResponse400 | exchangeCliTokenResponse401 | exchangeCliTokenResponse403 | exchangeCliTokenResponse404 | exchangeCliTokenResponse500) & {\n headers: Headers;\n};\n\nexport type exchangeCliTokenResponse = (exchangeCliTokenResponseSuccess | exchangeCliTokenResponseError)\n\nexport const getExchangeCliTokenUrl = () => {\n\n\n \n\n return `/api/api-keys/cli-token-exchange`\n}\n\nexport const exchangeCliToken = async (exchangeCliTokenInput: ExchangeCliTokenInput, options?: RequestInit): Promise<exchangeCliTokenResponse> => {\n \n return customFetch<exchangeCliTokenResponse>(getExchangeCliTokenUrl(),\n { \n ...options,\n method: 'POST',\n headers: { 'Content-Type': 'application/json', ...options?.headers },\n body: JSON.stringify(\n exchangeCliTokenInput,)\n }\n);}\n \n\n\n/**\n * Get current user's username and whether 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 * Submit a contact message (public, no authentication required)\n * @summary Submit a contact message\n */\nexport type submitContactMessageResponse200 = {\n data: ContactSuccessResponse\n status: 200\n}\n\nexport type submitContactMessageResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type submitContactMessageResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type submitContactMessageResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type submitContactMessageResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type submitContactMessageResponse500 = {\n data: ApiError\n status: 500\n}\n\nexport type submitContactMessageResponseSuccess = (submitContactMessageResponse200) & {\n headers: Headers;\n};\nexport type submitContactMessageResponseError = (submitContactMessageResponse400 | submitContactMessageResponse401 | submitContactMessageResponse403 | submitContactMessageResponse404 | submitContactMessageResponse500) & {\n headers: Headers;\n};\n\nexport type submitContactMessageResponse = (submitContactMessageResponseSuccess | submitContactMessageResponseError)\n\nexport const getSubmitContactMessageUrl = () => {\n\n\n \n\n return `/api/contact`\n}\n\nexport const submitContactMessage = async (createContactMessage: CreateContactMessage, options?: RequestInit): Promise<submitContactMessageResponse> => {\n \n return customFetch<submitContactMessageResponse>(getSubmitContactMessageUrl(),\n { \n ...options,\n method: 'POST',\n headers: { 'Content-Type': 'application/json', ...options?.headers },\n body: JSON.stringify(\n createContactMessage,)\n }\n);}\n \n\n\n/**\n * List all contact messages with pagination (admin only)\n * @summary List contact messages\n */\nexport type listContactMessagesResponse200 = {\n data: ContactMessageListResponse\n status: 200\n}\n\nexport type listContactMessagesResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type listContactMessagesResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type listContactMessagesResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type listContactMessagesResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type listContactMessagesResponse500 = {\n data: ApiError\n status: 500\n}\n\nexport type listContactMessagesResponseSuccess = (listContactMessagesResponse200) & {\n headers: Headers;\n};\nexport type listContactMessagesResponseError = (listContactMessagesResponse400 | listContactMessagesResponse401 | listContactMessagesResponse403 | listContactMessagesResponse404 | listContactMessagesResponse500) & {\n headers: Headers;\n};\n\nexport type listContactMessagesResponse = (listContactMessagesResponseSuccess | listContactMessagesResponseError)\n\nexport const getListContactMessagesUrl = (params?: ListContactMessagesParams,) => {\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/contact/messages?${stringifiedParams}` : `/api/contact/messages`\n}\n\nexport const listContactMessages = async (params?: ListContactMessagesParams, options?: RequestInit): Promise<listContactMessagesResponse> => {\n \n return customFetch<listContactMessagesResponse>(getListContactMessagesUrl(params),\n { \n ...options,\n method: 'GET'\n \n \n }\n);}\n \n\n\n/**\n * Mark a contact message as read (admin only)\n * @summary Mark message as read\n */\nexport type markContactMessageReadResponse200 = {\n data: ContactMessage\n status: 200\n}\n\nexport type markContactMessageReadResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type markContactMessageReadResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type markContactMessageReadResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type markContactMessageReadResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type markContactMessageReadResponse500 = {\n data: ApiError\n status: 500\n}\n\nexport type markContactMessageReadResponseSuccess = (markContactMessageReadResponse200) & {\n headers: Headers;\n};\nexport type markContactMessageReadResponseError = (markContactMessageReadResponse400 | markContactMessageReadResponse401 | markContactMessageReadResponse403 | markContactMessageReadResponse404 | markContactMessageReadResponse500) & {\n headers: Headers;\n};\n\nexport type markContactMessageReadResponse = (markContactMessageReadResponseSuccess | markContactMessageReadResponseError)\n\nexport const getMarkContactMessageReadUrl = (id: string,) => {\n\n\n \n\n return `/api/contact/messages/${id}/read`\n}\n\nexport const markContactMessageRead = async (id: string, options?: RequestInit): Promise<markContactMessageReadResponse> => {\n \n return customFetch<markContactMessageReadResponse>(getMarkContactMessageReadUrl(id),\n { \n ...options,\n method: 'PATCH'\n \n \n }\n);}\n \n\n\n/**\n * Delete a contact message (admin only)\n * @summary Delete a contact message\n */\nexport type deleteContactMessageResponse200 = {\n data: ContactSuccessResponse\n status: 200\n}\n\nexport type deleteContactMessageResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type deleteContactMessageResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type deleteContactMessageResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type deleteContactMessageResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type deleteContactMessageResponse500 = {\n data: ApiError\n status: 500\n}\n\nexport type deleteContactMessageResponseSuccess = (deleteContactMessageResponse200) & {\n headers: Headers;\n};\nexport type deleteContactMessageResponseError = (deleteContactMessageResponse400 | deleteContactMessageResponse401 | deleteContactMessageResponse403 | deleteContactMessageResponse404 | deleteContactMessageResponse500) & {\n headers: Headers;\n};\n\nexport type deleteContactMessageResponse = (deleteContactMessageResponseSuccess | deleteContactMessageResponseError)\n\nexport const getDeleteContactMessageUrl = (id: string,) => {\n\n\n \n\n return `/api/contact/messages/${id}`\n}\n\nexport const deleteContactMessage = async (id: string, options?: RequestInit): Promise<deleteContactMessageResponse> => {\n \n return customFetch<deleteContactMessageResponse>(getDeleteContactMessageUrl(id),\n { \n ...options,\n method: 'DELETE'\n \n \n }\n);}\n \n\n\n/**\n * Create a new organization. Admin only.\n * @summary Create organization\n */\nexport type createOrganizationResponse200 = {\n data: Organization\n status: 200\n}\n\nexport type createOrganizationResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type createOrganizationResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type createOrganizationResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type createOrganizationResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type createOrganizationResponse500 = {\n data: ApiError\n status: 500\n}\n\nexport type createOrganizationResponseSuccess = (createOrganizationResponse200) & {\n headers: Headers;\n};\nexport type createOrganizationResponseError = (createOrganizationResponse400 | createOrganizationResponse401 | createOrganizationResponse403 | createOrganizationResponse404 | createOrganizationResponse500) & {\n headers: Headers;\n};\n\nexport type createOrganizationResponse = (createOrganizationResponseSuccess | createOrganizationResponseError)\n\nexport const getCreateOrganizationUrl = () => {\n\n\n \n\n return `/api/orgs`\n}\n\nexport const createOrganization = async (createOrgInput: CreateOrgInput, options?: RequestInit): Promise<createOrganizationResponse> => {\n \n return customFetch<createOrganizationResponse>(getCreateOrganizationUrl(),\n { \n ...options,\n method: 'POST',\n headers: { 'Content-Type': 'application/json', ...options?.headers },\n body: JSON.stringify(\n createOrgInput,)\n }\n);}\n \n\n\n/**\n * Get organization details by name\n * @summary Get organization\n */\nexport type getOrganizationResponse200 = {\n data: Organization\n status: 200\n}\n\nexport type getOrganizationResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type getOrganizationResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type getOrganizationResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type getOrganizationResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type getOrganizationResponse500 = {\n data: ApiError\n status: 500\n}\n\nexport type getOrganizationResponseSuccess = (getOrganizationResponse200) & {\n headers: Headers;\n};\nexport type getOrganizationResponseError = (getOrganizationResponse400 | getOrganizationResponse401 | getOrganizationResponse403 | getOrganizationResponse404 | getOrganizationResponse500) & {\n headers: Headers;\n};\n\nexport type getOrganizationResponse = (getOrganizationResponseSuccess | getOrganizationResponseError)\n\nexport const getGetOrganizationUrl = (orgname: string,) => {\n\n\n \n\n return `/api/orgs/${orgname}`\n}\n\nexport const getOrganization = async (orgname: string, options?: RequestInit): Promise<getOrganizationResponse> => {\n \n return customFetch<getOrganizationResponse>(getGetOrganizationUrl(orgname),\n { \n ...options,\n method: 'GET'\n \n \n }\n);}\n \n\n\n/**\n * List all members of an organization\n * @summary List members\n */\nexport type listOrgMembersResponse200 = {\n data: OrgMember[]\n status: 200\n}\n\nexport type listOrgMembersResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type listOrgMembersResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type listOrgMembersResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type listOrgMembersResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type listOrgMembersResponse500 = {\n data: ApiError\n status: 500\n}\n\nexport type listOrgMembersResponseSuccess = (listOrgMembersResponse200) & {\n headers: Headers;\n};\nexport type listOrgMembersResponseError = (listOrgMembersResponse400 | listOrgMembersResponse401 | listOrgMembersResponse403 | listOrgMembersResponse404 | listOrgMembersResponse500) & {\n headers: Headers;\n};\n\nexport type listOrgMembersResponse = (listOrgMembersResponseSuccess | listOrgMembersResponseError)\n\nexport const getListOrgMembersUrl = (orgname: string,) => {\n\n\n \n\n return `/api/orgs/${orgname}/members`\n}\n\nexport const listOrgMembers = async (orgname: string, options?: RequestInit): Promise<listOrgMembersResponse> => {\n \n return customFetch<listOrgMembersResponse>(getListOrgMembersUrl(orgname),\n { \n ...options,\n method: 'GET'\n \n \n }\n);}\n \n\n\n/**\n * Add a member to the organization. Owner/admin only.\n * @summary Add member\n */\nexport type addOrgMemberResponse200 = {\n data: OrgMember\n status: 200\n}\n\nexport type addOrgMemberResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type addOrgMemberResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type addOrgMemberResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type addOrgMemberResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type addOrgMemberResponse500 = {\n data: ApiError\n status: 500\n}\n\nexport type addOrgMemberResponseSuccess = (addOrgMemberResponse200) & {\n headers: Headers;\n};\nexport type addOrgMemberResponseError = (addOrgMemberResponse400 | addOrgMemberResponse401 | addOrgMemberResponse403 | addOrgMemberResponse404 | addOrgMemberResponse500) & {\n headers: Headers;\n};\n\nexport type addOrgMemberResponse = (addOrgMemberResponseSuccess | addOrgMemberResponseError)\n\nexport const getAddOrgMemberUrl = (orgname: string,) => {\n\n\n \n\n return `/api/orgs/${orgname}/members`\n}\n\nexport const addOrgMember = async (orgname: string,\n addMemberInput: AddMemberInput, options?: RequestInit): Promise<addOrgMemberResponse> => {\n \n return customFetch<addOrgMemberResponse>(getAddOrgMemberUrl(orgname),\n { \n ...options,\n method: 'POST',\n headers: { 'Content-Type': 'application/json', ...options?.headers },\n body: JSON.stringify(\n addMemberInput,)\n }\n);}\n \n\n\n/**\n * Change the role of an organization member. Owner only.\n * @summary Update member role\n */\nexport type updateOrgMemberRoleResponse200 = {\n data: OrgMember\n status: 200\n}\n\nexport type updateOrgMemberRoleResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type updateOrgMemberRoleResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type updateOrgMemberRoleResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type updateOrgMemberRoleResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type updateOrgMemberRoleResponse500 = {\n data: ApiError\n status: 500\n}\n\nexport type updateOrgMemberRoleResponseSuccess = (updateOrgMemberRoleResponse200) & {\n headers: Headers;\n};\nexport type updateOrgMemberRoleResponseError = (updateOrgMemberRoleResponse400 | updateOrgMemberRoleResponse401 | updateOrgMemberRoleResponse403 | updateOrgMemberRoleResponse404 | updateOrgMemberRoleResponse500) & {\n headers: Headers;\n};\n\nexport type updateOrgMemberRoleResponse = (updateOrgMemberRoleResponseSuccess | updateOrgMemberRoleResponseError)\n\nexport const getUpdateOrgMemberRoleUrl = (orgname: string,\n memberId: string,) => {\n\n\n \n\n return `/api/orgs/${orgname}/members/${memberId}`\n}\n\nexport const updateOrgMemberRole = async (orgname: string,\n memberId: string,\n updateMemberRoleInput: UpdateMemberRoleInput, options?: RequestInit): Promise<updateOrgMemberRoleResponse> => {\n \n return customFetch<updateOrgMemberRoleResponse>(getUpdateOrgMemberRoleUrl(orgname,memberId),\n { \n ...options,\n method: 'PATCH',\n headers: { 'Content-Type': 'application/json', ...options?.headers },\n body: JSON.stringify(\n updateMemberRoleInput,)\n }\n);}\n \n\n\n/**\n * Remove a member from the organization. Owner/admin only.\n * @summary Remove member\n */\nexport type removeOrgMemberResponse200 = {\n data: OrgSuccessResponse\n status: 200\n}\n\nexport type removeOrgMemberResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type removeOrgMemberResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type removeOrgMemberResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type removeOrgMemberResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type removeOrgMemberResponse500 = {\n data: ApiError\n status: 500\n}\n\nexport type removeOrgMemberResponseSuccess = (removeOrgMemberResponse200) & {\n headers: Headers;\n};\nexport type removeOrgMemberResponseError = (removeOrgMemberResponse400 | removeOrgMemberResponse401 | removeOrgMemberResponse403 | removeOrgMemberResponse404 | removeOrgMemberResponse500) & {\n headers: Headers;\n};\n\nexport type removeOrgMemberResponse = (removeOrgMemberResponseSuccess | removeOrgMemberResponseError)\n\nexport const getRemoveOrgMemberUrl = (orgname: string,\n memberId: string,) => {\n\n\n \n\n return `/api/orgs/${orgname}/members/${memberId}`\n}\n\nexport const removeOrgMember = async (orgname: string,\n memberId: string, options?: RequestInit): Promise<removeOrgMemberResponse> => {\n \n return customFetch<removeOrgMemberResponse>(getRemoveOrgMemberUrl(orgname,memberId),\n { \n ...options,\n method: 'DELETE'\n \n \n }\n);}\n \n\n\n/**\n * Invite a user by email to join the organization. Admin/owner only.\n * @summary Create invitation\n */\nexport type createOrgInvitationResponse200 = {\n data: OrgInvitation\n status: 200\n}\n\nexport type createOrgInvitationResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type createOrgInvitationResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type createOrgInvitationResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type createOrgInvitationResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type createOrgInvitationResponse500 = {\n data: ApiError\n status: 500\n}\n\nexport type createOrgInvitationResponseSuccess = (createOrgInvitationResponse200) & {\n headers: Headers;\n};\nexport type createOrgInvitationResponseError = (createOrgInvitationResponse400 | createOrgInvitationResponse401 | createOrgInvitationResponse403 | createOrgInvitationResponse404 | createOrgInvitationResponse500) & {\n headers: Headers;\n};\n\nexport type createOrgInvitationResponse = (createOrgInvitationResponseSuccess | createOrgInvitationResponseError)\n\nexport const getCreateOrgInvitationUrl = (orgname: string,) => {\n\n\n \n\n return `/api/orgs/${orgname}/invitations`\n}\n\nexport const createOrgInvitation = async (orgname: string,\n createInvitationInput: CreateInvitationInput, options?: RequestInit): Promise<createOrgInvitationResponse> => {\n \n return customFetch<createOrgInvitationResponse>(getCreateOrgInvitationUrl(orgname),\n { \n ...options,\n method: 'POST',\n headers: { 'Content-Type': 'application/json', ...options?.headers },\n body: JSON.stringify(\n createInvitationInput,)\n }\n);}\n \n\n\n/**\n * List all pending invitations for the organization.\n * @summary List pending invitations\n */\nexport type listOrgInvitationsResponse200 = {\n data: OrgInvitation[]\n status: 200\n}\n\nexport type listOrgInvitationsResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type listOrgInvitationsResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type listOrgInvitationsResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type listOrgInvitationsResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type listOrgInvitationsResponse500 = {\n data: ApiError\n status: 500\n}\n\nexport type listOrgInvitationsResponseSuccess = (listOrgInvitationsResponse200) & {\n headers: Headers;\n};\nexport type listOrgInvitationsResponseError = (listOrgInvitationsResponse400 | listOrgInvitationsResponse401 | listOrgInvitationsResponse403 | listOrgInvitationsResponse404 | listOrgInvitationsResponse500) & {\n headers: Headers;\n};\n\nexport type listOrgInvitationsResponse = (listOrgInvitationsResponseSuccess | listOrgInvitationsResponseError)\n\nexport const getListOrgInvitationsUrl = (orgname: string,) => {\n\n\n \n\n return `/api/orgs/${orgname}/invitations`\n}\n\nexport const listOrgInvitations = async (orgname: string, options?: RequestInit): Promise<listOrgInvitationsResponse> => {\n \n return customFetch<listOrgInvitationsResponse>(getListOrgInvitationsUrl(orgname),\n { \n ...options,\n method: 'GET'\n \n \n }\n);}\n \n\n\n/**\n * Cancel a pending invitation. Admin/owner only.\n * @summary Cancel invitation\n */\nexport type cancelOrgInvitationResponse200 = {\n data: OrgSuccessResponse\n status: 200\n}\n\nexport type cancelOrgInvitationResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type cancelOrgInvitationResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type cancelOrgInvitationResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type cancelOrgInvitationResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type cancelOrgInvitationResponse500 = {\n data: ApiError\n status: 500\n}\n\nexport type cancelOrgInvitationResponseSuccess = (cancelOrgInvitationResponse200) & {\n headers: Headers;\n};\nexport type cancelOrgInvitationResponseError = (cancelOrgInvitationResponse400 | cancelOrgInvitationResponse401 | cancelOrgInvitationResponse403 | cancelOrgInvitationResponse404 | cancelOrgInvitationResponse500) & {\n headers: Headers;\n};\n\nexport type cancelOrgInvitationResponse = (cancelOrgInvitationResponseSuccess | cancelOrgInvitationResponseError)\n\nexport const getCancelOrgInvitationUrl = (orgname: string,\n invitationId: string,) => {\n\n\n \n\n return `/api/orgs/${orgname}/invitations/${invitationId}`\n}\n\nexport const cancelOrgInvitation = async (orgname: string,\n invitationId: string, options?: RequestInit): Promise<cancelOrgInvitationResponse> => {\n \n return customFetch<cancelOrgInvitationResponse>(getCancelOrgInvitationUrl(orgname,invitationId),\n { \n ...options,\n method: 'DELETE'\n \n \n }\n);}\n \n\n\n/**\n * Accept an invitation using the invite token. Requires authentication.\n * @summary Accept invitation\n */\nexport type acceptOrgInvitationResponse200 = {\n data: OrgMember\n status: 200\n}\n\nexport type acceptOrgInvitationResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type acceptOrgInvitationResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type acceptOrgInvitationResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type acceptOrgInvitationResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type acceptOrgInvitationResponse500 = {\n data: ApiError\n status: 500\n}\n\nexport type acceptOrgInvitationResponseSuccess = (acceptOrgInvitationResponse200) & {\n headers: Headers;\n};\nexport type acceptOrgInvitationResponseError = (acceptOrgInvitationResponse400 | acceptOrgInvitationResponse401 | acceptOrgInvitationResponse403 | acceptOrgInvitationResponse404 | acceptOrgInvitationResponse500) & {\n headers: Headers;\n};\n\nexport type acceptOrgInvitationResponse = (acceptOrgInvitationResponseSuccess | acceptOrgInvitationResponseError)\n\nexport const getAcceptOrgInvitationUrl = (token: string,) => {\n\n\n \n\n return `/api/orgs/-/invitations/${token}/accept`\n}\n\nexport const acceptOrgInvitation = async (token: string, options?: RequestInit): Promise<acceptOrgInvitationResponse> => {\n \n return customFetch<acceptOrgInvitationResponse>(getAcceptOrgInvitationUrl(token),\n { \n ...options,\n method: 'POST'\n \n \n }\n);}\n \n\n\n/**\n * List all organizations the authenticated user belongs to.\n * @summary List my organizations\n */\nexport type listMyOrganizationsResponse200 = {\n data: ListMyOrganizations200Item[]\n status: 200\n}\n\nexport type listMyOrganizationsResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type listMyOrganizationsResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type listMyOrganizationsResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type listMyOrganizationsResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type listMyOrganizationsResponse500 = {\n data: ApiError\n status: 500\n}\n\nexport type listMyOrganizationsResponseSuccess = (listMyOrganizationsResponse200) & {\n headers: Headers;\n};\nexport type listMyOrganizationsResponseError = (listMyOrganizationsResponse400 | listMyOrganizationsResponse401 | listMyOrganizationsResponse403 | listMyOrganizationsResponse404 | listMyOrganizationsResponse500) & {\n headers: Headers;\n};\n\nexport type listMyOrganizationsResponse = (listMyOrganizationsResponseSuccess | listMyOrganizationsResponseError)\n\nexport const getListMyOrganizationsUrl = () => {\n\n\n \n\n return `/api/orgs/-/mine`\n}\n\nexport const listMyOrganizations = async ( options?: RequestInit): Promise<listMyOrganizationsResponse> => {\n \n return customFetch<listMyOrganizationsResponse>(getListMyOrganizationsUrl(),\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 total download count for a skill package.\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\n\n \n\n return `/api/skills/@user/${username}/${name}/stats`\n}\n\nexport const getSkillStats = async (username: Username,\n name: SkillName, options?: RequestInit): Promise<getSkillStatsResponse> => {\n \n return customFetch<getSkillStatsResponse>(getGetSkillStatsUrl(username,name),\n { \n ...options,\n method: 'GET'\n \n \n }\n);}\n \n\n\n/**\n * Get metadata for a specific skill version\n * @summary Get skill version\n */\nexport type getSkillVersionResponse200 = {\n data: SkillVersionWithDownload\n status: 200\n}\n\nexport type getSkillVersionResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type getSkillVersionResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type getSkillVersionResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type getSkillVersionResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type getSkillVersionResponse500 = {\n data: ApiError\n status: 500\n}\n\nexport type getSkillVersionResponseSuccess = (getSkillVersionResponse200) & {\n headers: Headers;\n};\nexport type getSkillVersionResponseError = (getSkillVersionResponse400 | getSkillVersionResponse401 | getSkillVersionResponse403 | getSkillVersionResponse404 | getSkillVersionResponse500) & {\n headers: Headers;\n};\n\nexport type getSkillVersionResponse = (getSkillVersionResponseSuccess | getSkillVersionResponseError)\n\nexport const getGetSkillVersionUrl = (username: Username,\n name: SkillName,\n version: Semver,) => {\n\n\n \n\n return `/api/skills/@user/${username}/${name}/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 * List skills published under an organization. Org members see team + public skills. Others see only public.\n * @summary List organization skills\n */\nexport type listOrgSkillsResponse200 = {\n data: SkillListResponse\n status: 200\n}\n\nexport type listOrgSkillsResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type listOrgSkillsResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type listOrgSkillsResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type listOrgSkillsResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type listOrgSkillsResponse500 = {\n data: ApiError\n status: 500\n}\n\nexport type listOrgSkillsResponseSuccess = (listOrgSkillsResponse200) & {\n headers: Headers;\n};\nexport type listOrgSkillsResponseError = (listOrgSkillsResponse400 | listOrgSkillsResponse401 | listOrgSkillsResponse403 | listOrgSkillsResponse404 | listOrgSkillsResponse500) & {\n headers: Headers;\n};\n\nexport type listOrgSkillsResponse = (listOrgSkillsResponseSuccess | listOrgSkillsResponseError)\n\nexport const getListOrgSkillsUrl = (orgname: Username,) => {\n\n\n \n\n return `/api/skills/@org/${orgname}`\n}\n\nexport const listOrgSkills = async (orgname: Username, options?: RequestInit): Promise<listOrgSkillsResponse> => {\n \n return customFetch<listOrgSkillsResponse>(getListOrgSkillsUrl(orgname),\n { \n ...options,\n method: 'GET'\n \n \n }\n);}\n \n\n\n/**\n * Get a specific skill published under an organization.\n * @summary Get organization skill\n */\nexport type getOrgSkillResponse200 = {\n data: SkillDetailResponse\n status: 200\n}\n\nexport type getOrgSkillResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type getOrgSkillResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type getOrgSkillResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type getOrgSkillResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type getOrgSkillResponse500 = {\n data: ApiError\n status: 500\n}\n\nexport type getOrgSkillResponseSuccess = (getOrgSkillResponse200) & {\n headers: Headers;\n};\nexport type getOrgSkillResponseError = (getOrgSkillResponse400 | getOrgSkillResponse401 | getOrgSkillResponse403 | getOrgSkillResponse404 | getOrgSkillResponse500) & {\n headers: Headers;\n};\n\nexport type getOrgSkillResponse = (getOrgSkillResponseSuccess | getOrgSkillResponseError)\n\nexport const getGetOrgSkillUrl = (orgname: Username,\n name: SkillName,) => {\n\n\n \n\n return `/api/skills/@org/${orgname}/${name}`\n}\n\nexport const getOrgSkill = async (orgname: Username,\n name: SkillName, options?: RequestInit): Promise<getOrgSkillResponse> => {\n \n return customFetch<getOrgSkillResponse>(getGetOrgSkillUrl(orgname,name),\n { \n ...options,\n method: 'GET'\n \n \n }\n);}\n \n\n\n/**\n * Delete an organization skill and all its versions. Requires admin or owner role.\n * @summary Delete org skill\n */\nexport type deleteOrgSkillResponse200 = {\n data: SuccessResponse & unknown\n status: 200\n}\n\nexport type deleteOrgSkillResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type deleteOrgSkillResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type deleteOrgSkillResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type deleteOrgSkillResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type deleteOrgSkillResponse500 = {\n data: ApiError\n status: 500\n}\n\nexport type deleteOrgSkillResponseSuccess = (deleteOrgSkillResponse200) & {\n headers: Headers;\n};\nexport type deleteOrgSkillResponseError = (deleteOrgSkillResponse400 | deleteOrgSkillResponse401 | deleteOrgSkillResponse403 | deleteOrgSkillResponse404 | deleteOrgSkillResponse500) & {\n headers: Headers;\n};\n\nexport type deleteOrgSkillResponse = (deleteOrgSkillResponseSuccess | deleteOrgSkillResponseError)\n\nexport const getDeleteOrgSkillUrl = (orgname: Username,\n name: SkillName,) => {\n\n\n \n\n return `/api/skills/@org/${orgname}/${name}`\n}\n\nexport const deleteOrgSkill = async (orgname: Username,\n name: SkillName, options?: RequestInit): Promise<deleteOrgSkillResponse> => {\n \n return customFetch<deleteOrgSkillResponse>(getDeleteOrgSkillUrl(orgname,name),\n { \n ...options,\n method: 'DELETE'\n \n \n }\n);}\n \n\n\n/**\n * List all versions of an organization skill.\n * @summary List org skill versions\n */\nexport type listOrgSkillVersionsResponse200 = {\n data: SkillVersion[]\n status: 200\n}\n\nexport type listOrgSkillVersionsResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type listOrgSkillVersionsResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type listOrgSkillVersionsResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type listOrgSkillVersionsResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type listOrgSkillVersionsResponse500 = {\n data: ApiError\n status: 500\n}\n\nexport type listOrgSkillVersionsResponseSuccess = (listOrgSkillVersionsResponse200) & {\n headers: Headers;\n};\nexport type listOrgSkillVersionsResponseError = (listOrgSkillVersionsResponse400 | listOrgSkillVersionsResponse401 | listOrgSkillVersionsResponse403 | listOrgSkillVersionsResponse404 | listOrgSkillVersionsResponse500) & {\n headers: Headers;\n};\n\nexport type listOrgSkillVersionsResponse = (listOrgSkillVersionsResponseSuccess | listOrgSkillVersionsResponseError)\n\nexport const getListOrgSkillVersionsUrl = (orgname: Username,\n name: SkillName,) => {\n\n\n \n\n return `/api/skills/@org/${orgname}/${name}/versions`\n}\n\nexport const listOrgSkillVersions = async (orgname: Username,\n name: SkillName, options?: RequestInit): Promise<listOrgSkillVersionsResponse> => {\n \n return customFetch<listOrgSkillVersionsResponse>(getListOrgSkillVersionsUrl(orgname,name),\n { \n ...options,\n method: 'GET'\n \n \n }\n);}\n \n\n\n/**\n * Get metadata for a specific version of an organization skill.\n * @summary Get org skill version\n */\nexport type getOrgSkillVersionResponse200 = {\n data: SkillVersionWithDownload\n status: 200\n}\n\nexport type getOrgSkillVersionResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type getOrgSkillVersionResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type getOrgSkillVersionResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type getOrgSkillVersionResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type getOrgSkillVersionResponse500 = {\n data: ApiError\n status: 500\n}\n\nexport type getOrgSkillVersionResponseSuccess = (getOrgSkillVersionResponse200) & {\n headers: Headers;\n};\nexport type getOrgSkillVersionResponseError = (getOrgSkillVersionResponse400 | getOrgSkillVersionResponse401 | getOrgSkillVersionResponse403 | getOrgSkillVersionResponse404 | getOrgSkillVersionResponse500) & {\n headers: Headers;\n};\n\nexport type getOrgSkillVersionResponse = (getOrgSkillVersionResponseSuccess | getOrgSkillVersionResponseError)\n\nexport const getGetOrgSkillVersionUrl = (orgname: Username,\n name: SkillName,\n version: string,) => {\n\n\n \n\n return `/api/skills/@org/${orgname}/${name}/versions/${version}`\n}\n\nexport const getOrgSkillVersion = async (orgname: Username,\n name: SkillName,\n version: string, options?: RequestInit): Promise<getOrgSkillVersionResponse> => {\n \n return customFetch<getOrgSkillVersionResponse>(getGetOrgSkillVersionUrl(orgname,name,version),\n { \n ...options,\n method: 'GET'\n \n \n }\n);}\n \n\n\n/**\n * Download the tarball for an organization skill version. Team skills require org membership. Private skills require the publisher or admin.\n * @summary Download org skill version\n */\nexport type downloadOrgSkillVersionResponse302 = {\n data: void\n status: 302\n}\n\nexport type downloadOrgSkillVersionResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type downloadOrgSkillVersionResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type downloadOrgSkillVersionResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type downloadOrgSkillVersionResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type downloadOrgSkillVersionResponse500 = {\n data: ApiError\n status: 500\n}\n\n;\nexport type downloadOrgSkillVersionResponseError = (downloadOrgSkillVersionResponse302 | downloadOrgSkillVersionResponse400 | downloadOrgSkillVersionResponse401 | downloadOrgSkillVersionResponse403 | downloadOrgSkillVersionResponse404 | downloadOrgSkillVersionResponse500) & {\n headers: Headers;\n};\n\nexport type downloadOrgSkillVersionResponse = (downloadOrgSkillVersionResponseError)\n\nexport const getDownloadOrgSkillVersionUrl = (orgname: Username,\n name: SkillName,\n version: string,) => {\n\n\n \n\n return `/api/skills/@org/${orgname}/${name}/versions/${version}/download`\n}\n\nexport const downloadOrgSkillVersion = async (orgname: Username,\n name: SkillName,\n version: string, options?: RequestInit): Promise<downloadOrgSkillVersionResponse> => {\n \n return customFetch<downloadOrgSkillVersionResponse>(getDownloadOrgSkillVersionUrl(orgname,name,version),\n { \n ...options,\n method: 'GET'\n \n \n }\n);}\n \n\n\n/**\n * Publish a skill under an organization namespace. Requires admin or owner role.\n * @summary Publish org skill\n */\nexport type publishOrgSkillResponse200 = {\n data: PublishSkillResponse\n status: 200\n}\n\nexport type publishOrgSkillResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type publishOrgSkillResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type publishOrgSkillResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type publishOrgSkillResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type publishOrgSkillResponse500 = {\n data: ApiError\n status: 500\n}\n\nexport type publishOrgSkillResponseSuccess = (publishOrgSkillResponse200) & {\n headers: Headers;\n};\nexport type publishOrgSkillResponseError = (publishOrgSkillResponse400 | publishOrgSkillResponse401 | publishOrgSkillResponse403 | publishOrgSkillResponse404 | publishOrgSkillResponse500) & {\n headers: Headers;\n};\n\nexport type publishOrgSkillResponse = (publishOrgSkillResponseSuccess | publishOrgSkillResponseError)\n\nexport const getPublishOrgSkillUrl = (orgname: Username,) => {\n\n\n \n\n return `/api/skills/@org/${orgname}/publish`\n}\n\nexport const publishOrgSkill = async (orgname: Username,\n publishSkillInput: PublishSkillInput, options?: RequestInit): Promise<publishOrgSkillResponse> => {\n \n return customFetch<publishOrgSkillResponse>(getPublishOrgSkillUrl(orgname),\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 * Change the visibility of an org skill. Requires admin or owner role.\n * @summary Change org skill visibility\n */\nexport type changeOrgSkillAccessResponse200 = {\n data: ChangeAccessResponse\n status: 200\n}\n\nexport type changeOrgSkillAccessResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type changeOrgSkillAccessResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type changeOrgSkillAccessResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type changeOrgSkillAccessResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type changeOrgSkillAccessResponse500 = {\n data: ApiError\n status: 500\n}\n\nexport type changeOrgSkillAccessResponseSuccess = (changeOrgSkillAccessResponse200) & {\n headers: Headers;\n};\nexport type changeOrgSkillAccessResponseError = (changeOrgSkillAccessResponse400 | changeOrgSkillAccessResponse401 | changeOrgSkillAccessResponse403 | changeOrgSkillAccessResponse404 | changeOrgSkillAccessResponse500) & {\n headers: Headers;\n};\n\nexport type changeOrgSkillAccessResponse = (changeOrgSkillAccessResponseSuccess | changeOrgSkillAccessResponseError)\n\nexport const getChangeOrgSkillAccessUrl = (orgname: Username,\n name: SkillName,) => {\n\n\n \n\n return `/api/skills/@org/${orgname}/${name}/access`\n}\n\nexport const changeOrgSkillAccess = async (orgname: Username,\n name: SkillName,\n changeAccessInput: ChangeAccessInput, options?: RequestInit): Promise<changeOrgSkillAccessResponse> => {\n \n return customFetch<changeOrgSkillAccessResponse>(getChangeOrgSkillAccessUrl(orgname,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 * Get total download count for an org skill.\n * @summary Get org skill download statistics\n */\nexport type getOrgSkillStatsResponse200 = {\n data: SkillStatsResponse\n status: 200\n}\n\nexport type getOrgSkillStatsResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type getOrgSkillStatsResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type getOrgSkillStatsResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type getOrgSkillStatsResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type getOrgSkillStatsResponse500 = {\n data: ApiError\n status: 500\n}\n\nexport type getOrgSkillStatsResponseSuccess = (getOrgSkillStatsResponse200) & {\n headers: Headers;\n};\nexport type getOrgSkillStatsResponseError = (getOrgSkillStatsResponse400 | getOrgSkillStatsResponse401 | getOrgSkillStatsResponse403 | getOrgSkillStatsResponse404 | getOrgSkillStatsResponse500) & {\n headers: Headers;\n};\n\nexport type getOrgSkillStatsResponse = (getOrgSkillStatsResponseSuccess | getOrgSkillStatsResponseError)\n\nexport const getGetOrgSkillStatsUrl = (orgname: Username,\n name: SkillName,) => {\n\n\n \n\n return `/api/skills/@org/${orgname}/${name}/stats`\n}\n\nexport const getOrgSkillStats = async (orgname: Username,\n name: SkillName, options?: RequestInit): Promise<getOrgSkillStatsResponse> => {\n \n return customFetch<getOrgSkillStatsResponse>(getGetOrgSkillStatsUrl(orgname,name),\n { \n ...options,\n method: 'GET'\n \n \n }\n);}\n \n\n\n/**\n * Get a user's public profile and their published public skills.\n * @summary Get user profile with skills\n */\nexport type getUserProfileResponse200 = {\n data: ProfileResponse\n status: 200\n}\n\nexport type getUserProfileResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type getUserProfileResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type getUserProfileResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type getUserProfileResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type getUserProfileResponse500 = {\n data: ApiError\n status: 500\n}\n\nexport type getUserProfileResponseSuccess = (getUserProfileResponse200) & {\n headers: Headers;\n};\nexport type getUserProfileResponseError = (getUserProfileResponse400 | getUserProfileResponse401 | getUserProfileResponse403 | getUserProfileResponse404 | getUserProfileResponse500) & {\n headers: Headers;\n};\n\nexport type getUserProfileResponse = (getUserProfileResponseSuccess | getUserProfileResponseError)\n\nexport const getGetUserProfileUrl = (username: Username,\n params?: GetUserProfileParams,) => {\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/-/profile/user/${username}?${stringifiedParams}` : `/api/skills/-/profile/user/${username}`\n}\n\nexport const getUserProfile = async (username: Username,\n params?: GetUserProfileParams, options?: RequestInit): Promise<getUserProfileResponse> => {\n \n return customFetch<getUserProfileResponse>(getGetUserProfileUrl(username,params),\n { \n ...options,\n method: 'GET'\n \n \n }\n);}\n \n\n\n/**\n * Get all public skills indexed from a GitHub owner across all their repos.\n * @summary Get GitHub owner profile with skills\n */\nexport type getGithubOwnerProfileResponse200 = {\n data: ProfileResponse\n status: 200\n}\n\nexport type getGithubOwnerProfileResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type getGithubOwnerProfileResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type getGithubOwnerProfileResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type getGithubOwnerProfileResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type getGithubOwnerProfileResponse500 = {\n data: ApiError\n status: 500\n}\n\nexport type getGithubOwnerProfileResponseSuccess = (getGithubOwnerProfileResponse200) & {\n headers: Headers;\n};\nexport type getGithubOwnerProfileResponseError = (getGithubOwnerProfileResponse400 | getGithubOwnerProfileResponse401 | getGithubOwnerProfileResponse403 | getGithubOwnerProfileResponse404 | getGithubOwnerProfileResponse500) & {\n headers: Headers;\n};\n\nexport type getGithubOwnerProfileResponse = (getGithubOwnerProfileResponseSuccess | getGithubOwnerProfileResponseError)\n\nexport const getGetGithubOwnerProfileUrl = (owner: Username,\n params?: GetGithubOwnerProfileParams,) => {\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/-/profile/github/${owner}?${stringifiedParams}` : `/api/skills/-/profile/github/${owner}`\n}\n\nexport const getGithubOwnerProfile = async (owner: Username,\n params?: GetGithubOwnerProfileParams, options?: RequestInit): Promise<getGithubOwnerProfileResponse> => {\n \n return customFetch<getGithubOwnerProfileResponse>(getGetGithubOwnerProfileUrl(owner,params),\n { \n ...options,\n method: 'GET'\n \n \n }\n);}\n \n\n\n/**\n * Get all public skills indexed from a specific GitHub repo.\n * @summary Get GitHub repo profile with skills\n */\nexport type getGithubRepoProfileResponse200 = {\n data: ProfileResponse\n status: 200\n}\n\nexport type getGithubRepoProfileResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type getGithubRepoProfileResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type getGithubRepoProfileResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type getGithubRepoProfileResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type getGithubRepoProfileResponse500 = {\n data: ApiError\n status: 500\n}\n\nexport type getGithubRepoProfileResponseSuccess = (getGithubRepoProfileResponse200) & {\n headers: Headers;\n};\nexport type getGithubRepoProfileResponseError = (getGithubRepoProfileResponse400 | getGithubRepoProfileResponse401 | getGithubRepoProfileResponse403 | getGithubRepoProfileResponse404 | getGithubRepoProfileResponse500) & {\n headers: Headers;\n};\n\nexport type getGithubRepoProfileResponse = (getGithubRepoProfileResponseSuccess | getGithubRepoProfileResponseError)\n\nexport const getGetGithubRepoProfileUrl = (owner: Username,\n repo: string,\n params?: GetGithubRepoProfileParams,) => {\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/-/profile/github/${owner}/${repo}?${stringifiedParams}` : `/api/skills/-/profile/github/${owner}/${repo}`\n}\n\nexport const getGithubRepoProfile = async (owner: Username,\n repo: string,\n params?: GetGithubRepoProfileParams, options?: RequestInit): Promise<getGithubRepoProfileResponse> => {\n \n return customFetch<getGithubRepoProfileResponse>(getGetGithubRepoProfileUrl(owner,repo,params),\n { \n ...options,\n method: 'GET'\n \n \n }\n);}\n \n\n\n/**\n * List all indexed skills from a GitHub repository.\n * @summary List skills in a GitHub repo\n */\nexport type listGithubRepoSkillsResponse200 = {\n data: SkillListResponse\n status: 200\n}\n\nexport type listGithubRepoSkillsResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type listGithubRepoSkillsResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type listGithubRepoSkillsResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type listGithubRepoSkillsResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type listGithubRepoSkillsResponse500 = {\n data: ApiError\n status: 500\n}\n\nexport type listGithubRepoSkillsResponseSuccess = (listGithubRepoSkillsResponse200) & {\n headers: Headers;\n};\nexport type listGithubRepoSkillsResponseError = (listGithubRepoSkillsResponse400 | listGithubRepoSkillsResponse401 | listGithubRepoSkillsResponse403 | listGithubRepoSkillsResponse404 | listGithubRepoSkillsResponse500) & {\n headers: Headers;\n};\n\nexport type listGithubRepoSkillsResponse = (listGithubRepoSkillsResponseSuccess | listGithubRepoSkillsResponseError)\n\nexport const getListGithubRepoSkillsUrl = (owner: Username,\n repo: string,) => {\n\n\n \n\n return `/api/skills/@github/${owner}/${repo}`\n}\n\nexport const listGithubRepoSkills = async (owner: Username,\n repo: string, options?: RequestInit): Promise<listGithubRepoSkillsResponse> => {\n \n return customFetch<listGithubRepoSkillsResponse>(getListGithubRepoSkillsUrl(owner,repo),\n { \n ...options,\n method: 'GET'\n \n \n }\n);}\n \n\n\n/**\n * Get details for a specific indexed GitHub skill.\n * @summary Get GitHub skill\n */\nexport type getGithubSkillResponse200 = {\n data: SkillDetailResponse\n status: 200\n}\n\nexport type getGithubSkillResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type getGithubSkillResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type getGithubSkillResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type getGithubSkillResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type getGithubSkillResponse500 = {\n data: ApiError\n status: 500\n}\n\nexport type getGithubSkillResponseSuccess = (getGithubSkillResponse200) & {\n headers: Headers;\n};\nexport type getGithubSkillResponseError = (getGithubSkillResponse400 | getGithubSkillResponse401 | getGithubSkillResponse403 | getGithubSkillResponse404 | getGithubSkillResponse500) & {\n headers: Headers;\n};\n\nexport type getGithubSkillResponse = (getGithubSkillResponseSuccess | getGithubSkillResponseError)\n\nexport const getGetGithubSkillUrl = (owner: Username,\n repo: string,\n name: SkillName,) => {\n\n\n \n\n return `/api/skills/@github/${owner}/${repo}/${name}`\n}\n\nexport const getGithubSkill = async (owner: Username,\n repo: string,\n name: SkillName, options?: RequestInit): Promise<getGithubSkillResponse> => {\n \n return customFetch<getGithubSkillResponse>(getGetGithubSkillUrl(owner,repo,name),\n { \n ...options,\n method: 'GET'\n \n \n }\n);}\n \n\n\n/**\n * List all versions for an indexed GitHub skill.\n * @summary List GitHub skill versions\n */\nexport type listGithubSkillVersionsResponse200 = {\n data: SkillVersion[]\n status: 200\n}\n\nexport type listGithubSkillVersionsResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type listGithubSkillVersionsResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type listGithubSkillVersionsResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type listGithubSkillVersionsResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type listGithubSkillVersionsResponse500 = {\n data: ApiError\n status: 500\n}\n\nexport type listGithubSkillVersionsResponseSuccess = (listGithubSkillVersionsResponse200) & {\n headers: Headers;\n};\nexport type listGithubSkillVersionsResponseError = (listGithubSkillVersionsResponse400 | listGithubSkillVersionsResponse401 | listGithubSkillVersionsResponse403 | listGithubSkillVersionsResponse404 | listGithubSkillVersionsResponse500) & {\n headers: Headers;\n};\n\nexport type listGithubSkillVersionsResponse = (listGithubSkillVersionsResponseSuccess | listGithubSkillVersionsResponseError)\n\nexport const getListGithubSkillVersionsUrl = (owner: Username,\n repo: string,\n name: SkillName,) => {\n\n\n \n\n return `/api/skills/@github/${owner}/${repo}/${name}/versions`\n}\n\nexport const listGithubSkillVersions = async (owner: Username,\n repo: string,\n name: SkillName, options?: RequestInit): Promise<listGithubSkillVersionsResponse> => {\n \n return customFetch<listGithubSkillVersionsResponse>(getListGithubSkillVersionsUrl(owner,repo,name),\n { \n ...options,\n method: 'GET'\n \n \n }\n);}\n \n\n\n/**\n * Get metadata for a specific version of an indexed GitHub skill.\n * @summary Get GitHub skill version\n */\nexport type getGithubSkillVersionResponse200 = {\n data: SkillVersionWithDownload\n status: 200\n}\n\nexport type getGithubSkillVersionResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type getGithubSkillVersionResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type getGithubSkillVersionResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type getGithubSkillVersionResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type getGithubSkillVersionResponse500 = {\n data: ApiError\n status: 500\n}\n\nexport type getGithubSkillVersionResponseSuccess = (getGithubSkillVersionResponse200) & {\n headers: Headers;\n};\nexport type getGithubSkillVersionResponseError = (getGithubSkillVersionResponse400 | getGithubSkillVersionResponse401 | getGithubSkillVersionResponse403 | getGithubSkillVersionResponse404 | getGithubSkillVersionResponse500) & {\n headers: Headers;\n};\n\nexport type getGithubSkillVersionResponse = (getGithubSkillVersionResponseSuccess | getGithubSkillVersionResponseError)\n\nexport const getGetGithubSkillVersionUrl = (owner: Username,\n repo: string,\n name: SkillName,\n version: string,) => {\n\n\n \n\n return `/api/skills/@github/${owner}/${repo}/${name}/versions/${version}`\n}\n\nexport const getGithubSkillVersion = async (owner: Username,\n repo: string,\n name: SkillName,\n version: string, options?: RequestInit): Promise<getGithubSkillVersionResponse> => {\n \n return customFetch<getGithubSkillVersionResponse>(getGetGithubSkillVersionUrl(owner,repo,name,version),\n { \n ...options,\n method: 'GET'\n \n \n }\n);}\n \n\n\n/**\n * Download the tarball for a specific version. Redirects to presigned URL.\n * @summary Download GitHub skill version\n */\nexport type downloadGithubSkillVersionResponse302 = {\n data: void\n status: 302\n}\n\nexport type downloadGithubSkillVersionResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type downloadGithubSkillVersionResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type downloadGithubSkillVersionResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type downloadGithubSkillVersionResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type downloadGithubSkillVersionResponse500 = {\n data: ApiError\n status: 500\n}\n\n;\nexport type downloadGithubSkillVersionResponseError = (downloadGithubSkillVersionResponse302 | downloadGithubSkillVersionResponse400 | downloadGithubSkillVersionResponse401 | downloadGithubSkillVersionResponse403 | downloadGithubSkillVersionResponse404 | downloadGithubSkillVersionResponse500) & {\n headers: Headers;\n};\n\nexport type downloadGithubSkillVersionResponse = (downloadGithubSkillVersionResponseError)\n\nexport const getDownloadGithubSkillVersionUrl = (owner: Username,\n repo: string,\n name: SkillName,\n version: string,) => {\n\n\n \n\n return `/api/skills/@github/${owner}/${repo}/${name}/versions/${version}/download`\n}\n\nexport const downloadGithubSkillVersion = async (owner: Username,\n repo: string,\n name: SkillName,\n version: string, options?: RequestInit): Promise<downloadGithubSkillVersionResponse> => {\n \n return customFetch<downloadGithubSkillVersionResponse>(getDownloadGithubSkillVersionUrl(owner,repo,name,version),\n { \n ...options,\n method: 'GET'\n \n \n }\n);}\n \n\n\n/**\n * Get download statistics for an indexed GitHub skill.\n * @summary Get GitHub skill stats\n */\nexport type getGithubSkillStatsResponse200 = {\n data: SkillStatsResponse\n status: 200\n}\n\nexport type getGithubSkillStatsResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type getGithubSkillStatsResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type getGithubSkillStatsResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type getGithubSkillStatsResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type getGithubSkillStatsResponse500 = {\n data: ApiError\n status: 500\n}\n\nexport type getGithubSkillStatsResponseSuccess = (getGithubSkillStatsResponse200) & {\n headers: Headers;\n};\nexport type getGithubSkillStatsResponseError = (getGithubSkillStatsResponse400 | getGithubSkillStatsResponse401 | getGithubSkillStatsResponse403 | getGithubSkillStatsResponse404 | getGithubSkillStatsResponse500) & {\n headers: Headers;\n};\n\nexport type getGithubSkillStatsResponse = (getGithubSkillStatsResponseSuccess | getGithubSkillStatsResponseError)\n\nexport const getGetGithubSkillStatsUrl = (owner: Username,\n repo: string,\n name: SkillName,) => {\n\n\n \n\n return `/api/skills/@github/${owner}/${repo}/${name}/stats`\n}\n\nexport const getGithubSkillStats = async (owner: Username,\n repo: string,\n name: SkillName, options?: RequestInit): Promise<getGithubSkillStatsResponse> => {\n \n return customFetch<getGithubSkillStatsResponse>(getGetGithubSkillStatsUrl(owner,repo,name),\n { \n ...options,\n method: 'GET'\n \n \n }\n);}\n \n\n\n/**\n * Add a GitHub repository for skill indexing (admin only).\n * @summary Add repo to index\n */\nexport type addIndexedRepoResponse200 = {\n data: IndexedRepo\n status: 200\n}\n\nexport type addIndexedRepoResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type addIndexedRepoResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type addIndexedRepoResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type addIndexedRepoResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type addIndexedRepoResponse500 = {\n data: ApiError\n status: 500\n}\n\nexport type addIndexedRepoResponseSuccess = (addIndexedRepoResponse200) & {\n headers: Headers;\n};\nexport type addIndexedRepoResponseError = (addIndexedRepoResponse400 | addIndexedRepoResponse401 | addIndexedRepoResponse403 | addIndexedRepoResponse404 | addIndexedRepoResponse500) & {\n headers: Headers;\n};\n\nexport type addIndexedRepoResponse = (addIndexedRepoResponseSuccess | addIndexedRepoResponseError)\n\nexport const getAddIndexedRepoUrl = () => {\n\n\n \n\n return `/api/skills/-/indexer/repos`\n}\n\nexport const addIndexedRepo = async (addRepoInput: AddRepoInput, options?: RequestInit): Promise<addIndexedRepoResponse> => {\n \n return customFetch<addIndexedRepoResponse>(getAddIndexedRepoUrl(),\n { \n ...options,\n method: 'POST',\n headers: { 'Content-Type': 'application/json', ...options?.headers },\n body: JSON.stringify(\n addRepoInput,)\n }\n);}\n \n\n\n/**\n * List all GitHub repositories being indexed (admin only).\n * @summary List indexed repos\n */\nexport type listIndexedReposResponse200 = {\n data: IndexedRepo[]\n status: 200\n}\n\nexport type listIndexedReposResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type listIndexedReposResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type listIndexedReposResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type listIndexedReposResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type listIndexedReposResponse500 = {\n data: ApiError\n status: 500\n}\n\nexport type listIndexedReposResponseSuccess = (listIndexedReposResponse200) & {\n headers: Headers;\n};\nexport type listIndexedReposResponseError = (listIndexedReposResponse400 | listIndexedReposResponse401 | listIndexedReposResponse403 | listIndexedReposResponse404 | listIndexedReposResponse500) & {\n headers: Headers;\n};\n\nexport type listIndexedReposResponse = (listIndexedReposResponseSuccess | listIndexedReposResponseError)\n\nexport const getListIndexedReposUrl = () => {\n\n\n \n\n return `/api/skills/-/indexer/repos`\n}\n\nexport const listIndexedRepos = async ( options?: RequestInit): Promise<listIndexedReposResponse> => {\n \n return customFetch<listIndexedReposResponse>(getListIndexedReposUrl(),\n { \n ...options,\n method: 'GET'\n \n \n }\n);}\n \n\n\n/**\n * Trigger async indexing for a specific GitHub repository (admin only). Returns a job ID for progress tracking.\n * @summary Run indexer for a specific repo\n */\nexport type runIndexerForRepoResponse200 = {\n data: JobEnqueued | IndexResult\n status: 200\n}\n\nexport type runIndexerForRepoResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type runIndexerForRepoResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type runIndexerForRepoResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type runIndexerForRepoResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type runIndexerForRepoResponse500 = {\n data: ApiError\n status: 500\n}\n\nexport type runIndexerForRepoResponseSuccess = (runIndexerForRepoResponse200) & {\n headers: Headers;\n};\nexport type runIndexerForRepoResponseError = (runIndexerForRepoResponse400 | runIndexerForRepoResponse401 | runIndexerForRepoResponse403 | runIndexerForRepoResponse404 | runIndexerForRepoResponse500) & {\n headers: Headers;\n};\n\nexport type runIndexerForRepoResponse = (runIndexerForRepoResponseSuccess | runIndexerForRepoResponseError)\n\nexport const getRunIndexerForRepoUrl = (id: string,) => {\n\n\n \n\n return `/api/skills/-/indexer/repos/${id}/run`\n}\n\nexport const runIndexerForRepo = async (id: string, options?: RequestInit): Promise<runIndexerForRepoResponse> => {\n \n return customFetch<runIndexerForRepoResponse>(getRunIndexerForRepoUrl(id),\n { \n ...options,\n method: 'POST'\n \n \n }\n);}\n \n\n\n/**\n * Trigger async indexing for all tracked GitHub repositories (admin only).\n * @summary Re-index all repos\n */\nexport type runIndexerAllResponse200 = {\n data: JobEnqueued[] | IndexResult[]\n status: 200\n}\n\nexport type runIndexerAllResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type runIndexerAllResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type runIndexerAllResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type runIndexerAllResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type runIndexerAllResponse500 = {\n data: ApiError\n status: 500\n}\n\nexport type runIndexerAllResponseSuccess = (runIndexerAllResponse200) & {\n headers: Headers;\n};\nexport type runIndexerAllResponseError = (runIndexerAllResponse400 | runIndexerAllResponse401 | runIndexerAllResponse403 | runIndexerAllResponse404 | runIndexerAllResponse500) & {\n headers: Headers;\n};\n\nexport type runIndexerAllResponse = (runIndexerAllResponseSuccess | runIndexerAllResponseError)\n\nexport const getRunIndexerAllUrl = () => {\n\n\n \n\n return `/api/skills/-/indexer/run`\n}\n\nexport const runIndexerAll = async ( options?: RequestInit): Promise<runIndexerAllResponse> => {\n \n return customFetch<runIndexerAllResponse>(getRunIndexerAllUrl(),\n { \n ...options,\n method: 'POST'\n \n \n }\n);}\n \n\n\n/**\n * Remove a GitHub repository from indexing (admin only). Does not delete already-indexed skills.\n * @summary Remove indexed repo\n */\nexport type deleteIndexedRepoResponse200 = {\n data: DeleteIndexedRepo200\n status: 200\n}\n\nexport type deleteIndexedRepoResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type deleteIndexedRepoResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type deleteIndexedRepoResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type deleteIndexedRepoResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type deleteIndexedRepoResponse500 = {\n data: ApiError\n status: 500\n}\n\nexport type deleteIndexedRepoResponseSuccess = (deleteIndexedRepoResponse200) & {\n headers: Headers;\n};\nexport type deleteIndexedRepoResponseError = (deleteIndexedRepoResponse400 | deleteIndexedRepoResponse401 | deleteIndexedRepoResponse403 | deleteIndexedRepoResponse404 | deleteIndexedRepoResponse500) & {\n headers: Headers;\n};\n\nexport type deleteIndexedRepoResponse = (deleteIndexedRepoResponseSuccess | deleteIndexedRepoResponseError)\n\nexport const getDeleteIndexedRepoUrl = (id: string,) => {\n\n\n \n\n return `/api/skills/-/indexer/repos/${id}`\n}\n\nexport const deleteIndexedRepo = async (id: string, options?: RequestInit): Promise<deleteIndexedRepoResponse> => {\n \n return customFetch<deleteIndexedRepoResponse>(getDeleteIndexedRepoUrl(id),\n { \n ...options,\n method: 'DELETE'\n \n \n }\n);}\n \n\n\n/**\n * Perform bulk operations on the indexer: index pending/failed repos, reset stuck statuses, purge stale jobs (admin only).\n * @summary Perform bulk indexer action\n */\nexport type indexerBulkActionResponse200 = {\n data: BulkActionResult\n status: 200\n}\n\nexport type indexerBulkActionResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type indexerBulkActionResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type indexerBulkActionResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type indexerBulkActionResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type indexerBulkActionResponse500 = {\n data: ApiError\n status: 500\n}\n\nexport type indexerBulkActionResponseSuccess = (indexerBulkActionResponse200) & {\n headers: Headers;\n};\nexport type indexerBulkActionResponseError = (indexerBulkActionResponse400 | indexerBulkActionResponse401 | indexerBulkActionResponse403 | indexerBulkActionResponse404 | indexerBulkActionResponse500) & {\n headers: Headers;\n};\n\nexport type indexerBulkActionResponse = (indexerBulkActionResponseSuccess | indexerBulkActionResponseError)\n\nexport const getIndexerBulkActionUrl = () => {\n\n\n \n\n return `/api/skills/-/indexer/bulk-action`\n}\n\nexport const indexerBulkAction = async (bulkActionInput: BulkActionInput, options?: RequestInit): Promise<indexerBulkActionResponse> => {\n \n return customFetch<indexerBulkActionResponse>(getIndexerBulkActionUrl(),\n { \n ...options,\n method: 'POST',\n headers: { 'Content-Type': 'application/json', ...options?.headers },\n body: JSON.stringify(\n bulkActionInput,)\n }\n);}\n \n\n\n/**\n * Get the status and progress of an indexer job (admin only).\n * @summary Get job status\n */\nexport type getIndexerJobStatusResponse200 = {\n data: JobStatus\n status: 200\n}\n\nexport type getIndexerJobStatusResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type getIndexerJobStatusResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type getIndexerJobStatusResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type getIndexerJobStatusResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type getIndexerJobStatusResponse500 = {\n data: ApiError\n status: 500\n}\n\nexport type getIndexerJobStatusResponseSuccess = (getIndexerJobStatusResponse200) & {\n headers: Headers;\n};\nexport type getIndexerJobStatusResponseError = (getIndexerJobStatusResponse400 | getIndexerJobStatusResponse401 | getIndexerJobStatusResponse403 | getIndexerJobStatusResponse404 | getIndexerJobStatusResponse500) & {\n headers: Headers;\n};\n\nexport type getIndexerJobStatusResponse = (getIndexerJobStatusResponseSuccess | getIndexerJobStatusResponseError)\n\nexport const getGetIndexerJobStatusUrl = (id: string,) => {\n\n\n \n\n return `/api/skills/-/indexer/jobs/${id}`\n}\n\nexport const getIndexerJobStatus = async (id: string, options?: RequestInit): Promise<getIndexerJobStatusResponse> => {\n \n return customFetch<getIndexerJobStatusResponse>(getGetIndexerJobStatusUrl(id),\n { \n ...options,\n method: 'GET'\n \n \n }\n);}\n \n\n\n/**\n * List recent indexer jobs with status and pagination (admin only).\n * @summary List recent indexer jobs\n */\nexport type listIndexerJobsResponse200 = {\n data: PaginatedJobs\n status: 200\n}\n\nexport type listIndexerJobsResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type listIndexerJobsResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type listIndexerJobsResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type listIndexerJobsResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type listIndexerJobsResponse500 = {\n data: ApiError\n status: 500\n}\n\nexport type listIndexerJobsResponseSuccess = (listIndexerJobsResponse200) & {\n headers: Headers;\n};\nexport type listIndexerJobsResponseError = (listIndexerJobsResponse400 | listIndexerJobsResponse401 | listIndexerJobsResponse403 | listIndexerJobsResponse404 | listIndexerJobsResponse500) & {\n headers: Headers;\n};\n\nexport type listIndexerJobsResponse = (listIndexerJobsResponseSuccess | listIndexerJobsResponseError)\n\nexport const getListIndexerJobsUrl = (params?: ListIndexerJobsParams,) => {\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/-/indexer/jobs?${stringifiedParams}` : `/api/skills/-/indexer/jobs`\n}\n\nexport const listIndexerJobs = async (params?: ListIndexerJobsParams, options?: RequestInit): Promise<listIndexerJobsResponse> => {\n \n return customFetch<listIndexerJobsResponse>(getListIndexerJobsUrl(params),\n { \n ...options,\n method: 'GET'\n \n \n }\n);}\n \n\n\n/**\n * List all skills indexed from a specific GitHub repository (admin only).\n * @summary List skills in an indexed repo\n */\nexport type listRepoSkillsResponse200 = {\n data: RepoSkill[]\n status: 200\n}\n\nexport type listRepoSkillsResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type listRepoSkillsResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type listRepoSkillsResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type listRepoSkillsResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type listRepoSkillsResponse500 = {\n data: ApiError\n status: 500\n}\n\nexport type listRepoSkillsResponseSuccess = (listRepoSkillsResponse200) & {\n headers: Headers;\n};\nexport type listRepoSkillsResponseError = (listRepoSkillsResponse400 | listRepoSkillsResponse401 | listRepoSkillsResponse403 | listRepoSkillsResponse404 | listRepoSkillsResponse500) & {\n headers: Headers;\n};\n\nexport type listRepoSkillsResponse = (listRepoSkillsResponseSuccess | listRepoSkillsResponseError)\n\nexport const getListRepoSkillsUrl = (id: string,) => {\n\n\n \n\n return `/api/skills/-/indexer/repos/${id}/skills`\n}\n\nexport const listRepoSkills = async (id: string, options?: RequestInit): Promise<listRepoSkillsResponse> => {\n \n return customFetch<listRepoSkillsResponse>(getListRepoSkillsUrl(id),\n { \n ...options,\n method: 'GET'\n \n \n }\n);}\n \n\n\n/**\n * Delete a specific skill from an indexed GitHub repository (admin only).\n * @summary Delete a skill from an indexed repo\n */\nexport type deleteRepoSkillResponse200 = {\n data: DeleteRepoSkill200\n status: 200\n}\n\nexport type deleteRepoSkillResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type deleteRepoSkillResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type deleteRepoSkillResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type deleteRepoSkillResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type deleteRepoSkillResponse500 = {\n data: ApiError\n status: 500\n}\n\nexport type deleteRepoSkillResponseSuccess = (deleteRepoSkillResponse200) & {\n headers: Headers;\n};\nexport type deleteRepoSkillResponseError = (deleteRepoSkillResponse400 | deleteRepoSkillResponse401 | deleteRepoSkillResponse403 | deleteRepoSkillResponse404 | deleteRepoSkillResponse500) & {\n headers: Headers;\n};\n\nexport type deleteRepoSkillResponse = (deleteRepoSkillResponseSuccess | deleteRepoSkillResponseError)\n\nexport const getDeleteRepoSkillUrl = (id: string,\n skillId: string,) => {\n\n\n \n\n return `/api/skills/-/indexer/repos/${id}/skills/${skillId}`\n}\n\nexport const deleteRepoSkill = async (id: string,\n skillId: string, options?: RequestInit): Promise<deleteRepoSkillResponse> => {\n \n return customFetch<deleteRepoSkillResponse>(getDeleteRepoSkillUrl(id,skillId),\n { \n ...options,\n method: 'DELETE'\n \n \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 getConfig,\n isConfigured,\n type SDKConfig,\n SDKError,\n configure as sdkConfigure,\n} from \"./sdk/fetcher\";\nimport {\n deleteSkill,\n deleteSkillVersion,\n exchangeCliToken,\n getOrgSkillVersion,\n getSkill,\n getSkillVersion,\n listMySkills,\n listOrgSkillVersions,\n listSkillVersions,\n listUserSkills,\n me,\n publishOrgSkill,\n publishSkill,\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 return 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 registryUrl: string;\n apiKey?: string;\n}): void {\n const baseUrl = registryUrlToBaseUrl(options.registryUrl);\n sdkConfigure({ baseUrl, apiKey: options.apiKey });\n}\n\n// Re-export SDK functions for convenience\nexport {\n deleteSkill,\n deleteSkillVersion,\n exchangeCliToken,\n getConfig,\n getOrgSkillVersion,\n getSkill,\n getSkillVersion,\n isConfigured,\n listMySkills,\n listOrgSkillVersions,\n listSkillVersions,\n listUserSkills,\n me,\n publishOrgSkill,\n publishSkill,\n SDKError,\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 registryUrl: string,\n apiKey: string,\n): Promise<{ username: string; userId: string } | null> {\n try {\n // Use direct REST endpoints (not oRPC /rpc prefix)\n configure({ registryUrl, apiKey });\n const response = await me();\n // Check for successful response before accessing user data\n if (response.status !== 200 || !response.data) {\n return null;\n }\n const user = response.data;\n return {\n username: user.username,\n userId: user.userId,\n };\n } catch {\n return null;\n }\n}\n\n/**\n * Deprecate a skill version\n */\nexport async function deprecateSkillVersion(\n username: string,\n skillName: string,\n version: string,\n message: string,\n): Promise<{ status: number; data?: unknown; error?: string }> {\n const config = getConfig();\n if (!config) {\n return { status: 401, error: \"SDK not configured\" };\n }\n\n try {\n const response = await fetch(\n `${config.baseUrl}/api/skills/@user/${username}/${skillName}/versions/${version}/deprecate`,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${config.apiKey}`,\n },\n body: JSON.stringify({ message }),\n },\n );\n\n if (!response.ok) {\n const error = await response.text();\n return { status: response.status, error };\n }\n\n const data = await response.json();\n return { status: response.status, data };\n } catch (error) {\n return {\n status: 500,\n error: error instanceof Error ? error.message : \"Unknown error\",\n };\n }\n}\n\n/**\n * Remove deprecation from a skill version\n */\nexport async function undeprecateSkillVersion(\n username: string,\n skillName: string,\n version: string,\n): Promise<{ status: number; data?: unknown; error?: string }> {\n const config = getConfig();\n if (!config) {\n return { status: 401, error: \"SDK not configured\" };\n }\n\n try {\n const response = await fetch(\n `${config.baseUrl}/api/skills/@user/${username}/${skillName}/versions/${version}/deprecate`,\n {\n method: \"DELETE\",\n headers: {\n Authorization: `Bearer ${config.apiKey}`,\n },\n },\n );\n\n if (!response.ok) {\n const error = await response.text();\n return { status: response.status, error };\n }\n\n const data = await response.json();\n return { status: response.status, data };\n } catch (error) {\n return {\n status: 500,\n error: error instanceof Error ? error.message : \"Unknown error\",\n };\n }\n}\n\n// =============================================================================\n// @github Namespace API Functions\n// =============================================================================\n\n/**\n * List versions for a @github skill.\n * Calls GET /api/skills/@github/{owner}/{repo}/{name}/versions\n */\nexport async function listGithubSkillVersions(\n owner: string,\n repo: string,\n name: string,\n): Promise<{ status: number; data?: { version: string }[]; error?: string }> {\n const config = getConfig();\n try {\n const response = await fetch(\n `${config.baseUrl}/api/skills/@github/${owner}/${repo}/${name}/versions`,\n {\n method: \"GET\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...(config.apiKey\n ? { Authorization: `Bearer ${config.apiKey}` }\n : {}),\n },\n },\n );\n if (!response.ok) {\n const error = await response.text();\n return { status: response.status, error };\n }\n const data = (await response.json()) as { version: string }[];\n return { status: response.status, data };\n } catch (error) {\n return {\n status: 500,\n error: error instanceof Error ? error.message : \"Unknown error\",\n };\n }\n}\n\n/**\n * Get a specific version of a @github skill (with download URL).\n * Calls GET /api/skills/@github/{owner}/{repo}/{name}/versions/{version}\n */\nexport async function getGithubSkillVersion(\n owner: string,\n repo: string,\n name: string,\n version: string,\n): Promise<{\n status: number;\n data?: { downloadUrl: string; checksum: string; version: string };\n error?: string;\n}> {\n const config = getConfig();\n try {\n const response = await fetch(\n `${config.baseUrl}/api/skills/@github/${owner}/${repo}/${name}/versions/${version}`,\n {\n method: \"GET\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...(config.apiKey\n ? { Authorization: `Bearer ${config.apiKey}` }\n : {}),\n },\n },\n );\n if (!response.ok) {\n const error = await response.text();\n return { status: response.status, error };\n }\n const data = (await response.json()) as {\n downloadUrl: string;\n checksum: string;\n version: string;\n };\n return { status: response.status, data };\n } catch (error) {\n return {\n status: 500,\n error: error instanceof Error ? error.message : \"Unknown error\",\n };\n }\n}\n\n/**\n * Change skill visibility (public/private)\n */\nexport async function changeSkillAccess(\n username: string,\n skillName: string,\n input: { visibility: \"public\" | \"private\" },\n): Promise<{\n status: number;\n data?: {\n id: string;\n name: string;\n username: string;\n description: string | null;\n visibility: \"public\" | \"private\";\n createdAt: string;\n updatedAt: string;\n };\n error?: string;\n}> {\n const config = getConfig();\n if (!config) {\n return { status: 401, error: \"SDK not configured\" };\n }\n\n try {\n const response = await fetch(\n `${config.baseUrl}/api/skills/@user/${username}/${skillName}/access`,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${config.apiKey}`,\n },\n body: JSON.stringify(input),\n },\n );\n\n if (!response.ok) {\n const error = await response.text();\n try {\n const errorJson = JSON.parse(error);\n return {\n status: response.status,\n error: errorJson.message || errorJson.error || error,\n };\n } catch {\n return { status: response.status, error };\n }\n }\n\n const data = (await response.json()) as {\n id: string;\n name: string;\n username: string;\n description: string | null;\n visibility: \"public\" | \"private\";\n createdAt: string;\n updatedAt: string;\n };\n return { status: response.status, data };\n } catch (error) {\n return {\n status: 500,\n error: error instanceof Error ? error.message : \"Unknown error\",\n };\n }\n}\n","/**\n * Base error class for PSPM configuration errors\n */\nexport class ConfigError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"ConfigError\";\n }\n}\n\n/**\n * Error thrown when the user is not logged in\n */\nexport class NotLoggedInError extends ConfigError {\n constructor() {\n super(\n \"Not logged in. Run 'pspm login --api-key <key>' first, or set PSPM_API_KEY env var.\",\n );\n this.name = \"NotLoggedInError\";\n }\n}\n\n/**\n * API error response structure from OpenAPI spec\n */\ninterface ApiErrorResponse {\n code?: string;\n message?: string;\n details?:\n | {\n issues?: Array<{ path?: Array<string | number>; message?: string }>;\n }\n | Record<string, unknown>;\n requestId?: string;\n timestamp?: string;\n}\n\n/**\n * Get a human-readable description for common HTTP status codes\n */\nfunction getHttpStatusDescription(status: number): string {\n const descriptions: Record<number, string> = {\n 400: \"Bad Request - The request was malformed\",\n 401: \"Unauthorized - Please run 'pspm login' first\",\n 403: \"Forbidden - You don't have permission for this action\",\n 404: \"Not Found - The endpoint or resource doesn't exist\",\n 409: \"Conflict - The resource already exists or there's a version conflict\",\n 422: \"Validation Error - The request data is invalid\",\n 429: \"Too Many Requests - Please slow down and try again\",\n 500: \"Internal Server Error - Something went wrong on the server\",\n 502: \"Bad Gateway - The server is temporarily unavailable\",\n 503: \"Service Unavailable - The server is temporarily unavailable\",\n };\n return 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 response: { status: number; data: unknown },\n fallbackMessage: string,\n): string {\n const errorData = response.data as ApiErrorResponse | null;\n\n if (process.env.PSPM_DEBUG) {\n console.log(`[debug] API response status: ${response.status}`);\n console.log(\n \"[debug] API response data:\",\n JSON.stringify(errorData, null, 2),\n );\n }\n\n // Handle cases where errorData is a string (like \"Not Found\" from 404)\n if (typeof errorData === \"string\") {\n if (response.status === 404) {\n return `${fallbackMessage}: ${getHttpStatusDescription(404)}\\nThe registry endpoint may be unavailable or misconfigured.`;\n }\n return `${fallbackMessage}: ${errorData} (HTTP ${response.status})`;\n }\n\n // Handle empty or null response\n if (!errorData || typeof errorData !== \"object\") {\n const statusDesc = getHttpStatusDescription(response.status);\n if (response.status === 404) {\n return `${fallbackMessage}: ${statusDesc}\\nCheck that the registry URL is correct in your config.`;\n }\n return `${fallbackMessage}: ${statusDesc}`;\n }\n\n // Start with the message field or fallback\n let errorMessage = errorData.message || fallbackMessage;\n\n // For validation errors, format the issues\n if (errorData.code === \"VALIDATION_ERROR\" && errorData.details) {\n const issues = (\n errorData.details as {\n issues?: Array<{ path?: Array<string | number>; message?: string }>;\n }\n ).issues;\n if (issues && Array.isArray(issues)) {\n const issueMessages = issues\n .map((issue) => {\n const path = issue.path?.join(\".\") || \"input\";\n const msg = issue.message || \"invalid value\";\n return ` - ${path}: ${msg}`;\n })\n .join(\"\\n\");\n errorMessage = `Validation failed:\\n${issueMessages}`;\n }\n }\n\n // Add error code prefix if available and not already in message\n if (errorData.code && !errorMessage.includes(errorData.code)) {\n errorMessage = `[${errorData.code}] ${errorMessage}`;\n }\n\n // Add HTTP status context for non-200 responses\n if (response.status >= 400) {\n errorMessage += ` (HTTP ${response.status})`;\n }\n\n // Add request ID for debugging\n if (errorData.requestId) {\n errorMessage += `\\n(Request ID: ${errorData.requestId})`;\n }\n\n return 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 registry?: string;\n authToken?: string;\n username?: string;\n /** Scope to registry URL mappings (e.g., @myorg -> https://corp.pspm.io) */\n scopedRegistries?: Record<string, string>;\n /** Host to auth token mappings (e.g., pspm.dev -> sk_xxx) */\n registryTokens?: Record<string, string>;\n}\n\n/**\n * Project config stored in .pspmrc (INI format)\n */\nexport interface ProjectConfig {\n registry?: string;\n}\n\n/**\n * Fully resolved configuration (after cascade)\n */\nexport interface ResolvedConfig {\n registryUrl: string;\n apiKey?: string;\n username?: string;\n /** Scope to registry URL mappings */\n scopedRegistries: Record<string, string>;\n /** Host to auth token mappings */\n registryTokens: Record<string, string>;\n}\n\n/**\n * Legacy V1 config schema (for migration)\n */\ninterface LegacyConfigV1 {\n registryUrl?: string;\n apiKey?: string;\n username?: string;\n}\n\n/**\n * Legacy V2 config schema (for migration)\n */\ninterface LegacyConfigV2 {\n version: 2;\n defaultProfile: string;\n profiles: Record<\n string,\n {\n registryUrl?: string;\n apiKey?: string;\n username?: string;\n }\n >;\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 return join(homedir(), \".pspmrc\");\n}\n\n/**\n * Get the legacy config file path (~/.pspm/config.json) for migration\n */\nfunction getLegacyConfigPath(): string {\n return join(homedir(), \".pspm\", \"config.json\");\n}\n\n// =============================================================================\n// Global Mode\n// =============================================================================\n\nlet _globalMode = false;\n\n/**\n * Set global mode. When enabled, all path functions return\n * home-directory paths (~/.pspm/) instead of project-relative paths.\n */\nexport function setGlobalMode(global: boolean): void {\n _globalMode = global;\n}\n\n/**\n * Check if global mode is enabled.\n */\nexport function isGlobalMode(): boolean {\n return _globalMode;\n}\n\n/**\n * Get the .pspm directory path\n * Global: ~/.pspm/\n * Project: ./.pspm/\n */\nexport function getPspmDir(): string {\n if (_globalMode) return join(homedir(), \".pspm\");\n return join(process.cwd(), \".pspm\");\n}\n\n/**\n * Get the skills directory path\n * Global: ~/.pspm/skills/\n * Project: ./.pspm/skills/\n */\nexport function getSkillsDir(): string {\n return join(getPspmDir(), \"skills\");\n}\n\n/**\n * Get the cache directory path\n * Global: ~/.pspm/cache/\n * Project: ./.pspm/cache/\n */\nexport function getCacheDir(): string {\n return join(getPspmDir(), \"cache\");\n}\n\n/**\n * Get the lockfile path\n * Global: ~/.pspm/pspm-lock.json\n * Project: ./pspm-lock.json\n */\nexport function getLockfilePath(): string {\n if (_globalMode) return join(homedir(), \".pspm\", \"pspm-lock.json\");\n return join(process.cwd(), \"pspm-lock.json\");\n}\n\n/**\n * Get the legacy lockfile path (for migration)\n */\nexport function getLegacyLockfilePath(): string {\n return join(process.cwd(), \"skill-lock.json\");\n}\n\n/**\n * Get the legacy skills directory path (for migration)\n */\nexport function getLegacySkillsDir(): string {\n return 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 const configPath = getConfigPath();\n\n if (process.env.PSPM_DEBUG) {\n console.log(`[config] Reading config from: ${configPath}`);\n }\n\n try {\n const content = await readFile(configPath, \"utf-8\");\n const parsed = ini.parse(content);\n\n if (process.env.PSPM_DEBUG) {\n console.log(\"[config] Parsed config:\", JSON.stringify(parsed, null, 2));\n }\n\n // Extract scoped registries (@scope:registry = url)\n const scopedRegistries: Record<string, string> = {};\n for (const key of Object.keys(parsed)) {\n const scopeMatch = key.match(/^(@[^:]+):registry$/);\n if (scopeMatch) {\n const scope = scopeMatch[1];\n scopedRegistries[scope] = parsed[key] as string;\n }\n }\n\n // Extract per-registry tokens (//host:authToken = token)\n // INI parser may nest these under a key like \"//host\"\n const registryTokens: Record<string, string> = {};\n for (const key of Object.keys(parsed)) {\n // Check for //host:authToken format\n const tokenMatch = key.match(/^\\/\\/([^:]+):authToken$/);\n if (tokenMatch) {\n const host = tokenMatch[1];\n registryTokens[host] = parsed[key] as string;\n }\n // Also check for nested format (ini parser may parse //host as a section)\n if (key.startsWith(\"//\") && typeof parsed[key] === \"object\") {\n const host = key.slice(2);\n const section = parsed[key] as Record<string, string>;\n if (section.authToken) {\n registryTokens[host] = section.authToken;\n }\n }\n }\n\n return {\n registry: parsed.registry as string | undefined,\n authToken: parsed.authToken as string | undefined,\n username: parsed.username as string | undefined,\n scopedRegistries:\n Object.keys(scopedRegistries).length > 0 ? scopedRegistries : undefined,\n registryTokens:\n Object.keys(registryTokens).length > 0 ? registryTokens : undefined,\n };\n } catch (error) {\n if (process.env.PSPM_DEBUG) {\n console.log(\n `[config] Error reading config: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n return {};\n }\n}\n\n/**\n * Write the user config file (~/.pspmrc, INI format)\n */\nexport async function writeUserConfig(config: UserConfig): Promise<void> {\n const configPath = getConfigPath();\n\n // Build INI content with comments\n const lines: string[] = [\"; PSPM Configuration\", \"\"];\n\n if (config.registry) {\n lines.push(`registry = ${config.registry}`);\n }\n if (config.authToken) {\n lines.push(`authToken = ${config.authToken}`);\n }\n if (config.username) {\n lines.push(`username = ${config.username}`);\n }\n\n // Always end with a newline\n lines.push(\"\");\n\n await mkdir(dirname(configPath), { recursive: true });\n await writeFile(configPath, lines.join(\"\\n\"));\n\n if (process.env.PSPM_DEBUG) {\n console.log(`[config] Wrote config to: ${configPath}`);\n }\n}\n\n/**\n * Find and read project config (.pspmrc) by searching up directory tree\n */\nexport async function findProjectConfig(): Promise<ProjectConfig | null> {\n let currentDir = process.cwd();\n const root = dirname(currentDir);\n\n while (currentDir !== root) {\n const configPath = join(currentDir, \".pspmrc\");\n try {\n const stats = await stat(configPath);\n if (stats.isFile()) {\n const content = await readFile(configPath, \"utf-8\");\n // Try parsing as INI first\n try {\n const parsed = ini.parse(content);\n if (process.env.PSPM_DEBUG) {\n console.log(\n `[config] Found project config at ${configPath}:`,\n JSON.stringify(parsed, null, 2),\n );\n }\n return {\n registry: parsed.registry as string | undefined,\n };\n } catch {\n // Fall back to JSON for backward compatibility during migration\n try {\n const jsonConfig = JSON.parse(content);\n return {\n registry: jsonConfig.registryUrl,\n };\n } catch {\n // Unparseable, skip\n }\n }\n }\n } catch {\n // File doesn't exist, continue searching\n }\n currentDir = dirname(currentDir);\n }\n\n return null;\n}\n\n/**\n * Migrate from legacy config format (~/.pspm/config.json) if it exists\n */\nasync function migrateFromLegacyConfig(): Promise<UserConfig | null> {\n const legacyPath = getLegacyConfigPath();\n\n try {\n const content = await readFile(legacyPath, \"utf-8\");\n const parsed = JSON.parse(content);\n\n let config: UserConfig = {};\n\n // Check if V2 format (with profiles)\n if (parsed.version === 2 && parsed.profiles) {\n const v2Config = parsed as LegacyConfigV2;\n const defaultProfileName = v2Config.defaultProfile || \"default\";\n const profile = v2Config.profiles[defaultProfileName];\n\n if (profile) {\n config = {\n registry:\n profile.registryUrl !== DEFAULT_REGISTRY_URL\n ? profile.registryUrl\n : undefined,\n authToken: profile.apiKey,\n username: profile.username,\n };\n }\n\n console.log(\n `Migrating from legacy config (profile: ${defaultProfileName})...`,\n );\n } else {\n // V1 format (flat)\n const v1Config = parsed as LegacyConfigV1;\n config = {\n registry:\n v1Config.registryUrl !== DEFAULT_REGISTRY_URL\n ? v1Config.registryUrl\n : undefined,\n authToken: v1Config.apiKey,\n username: v1Config.username,\n };\n\n console.log(\"Migrating from legacy config...\");\n }\n\n // Write new format\n await writeUserConfig(config);\n console.log(`Created new config at: ${getConfigPath()}`);\n\n // Remove old config directory\n await unlink(legacyPath);\n console.log(`Removed legacy config: ${legacyPath}`);\n\n return config;\n } catch {\n // Legacy config doesn't exist or couldn't be read\n return null;\n }\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 // Check for legacy config and migrate if needed\n const newConfigPath = getConfigPath();\n try {\n await stat(newConfigPath);\n } catch {\n // New config doesn't exist, try migrating from legacy\n await migrateFromLegacyConfig();\n }\n\n const userConfig = await readUserConfig();\n const projectConfig = await findProjectConfig();\n\n // Build resolved config with cascade priority\n let registryUrl = DEFAULT_REGISTRY_URL;\n let apiKey = userConfig.authToken;\n const username = userConfig.username;\n const scopedRegistries = userConfig.scopedRegistries ?? {};\n const registryTokens = userConfig.registryTokens ?? {};\n\n // User config\n if (userConfig.registry) {\n registryUrl = userConfig.registry;\n }\n\n // Project config can override registryUrl (but not apiKey for security)\n if (projectConfig?.registry) {\n registryUrl = projectConfig.registry;\n }\n\n // Environment variables always win\n if (process.env.PSPM_REGISTRY_URL) {\n registryUrl = process.env.PSPM_REGISTRY_URL;\n }\n if (process.env.PSPM_API_KEY) {\n apiKey = process.env.PSPM_API_KEY;\n }\n\n if (process.env.PSPM_DEBUG) {\n console.log(\"[config] Resolved config:\");\n console.log(`[config] registryUrl: ${registryUrl}`);\n console.log(`[config] apiKey: ${apiKey ? \"***\" : \"(not set)\"}`);\n console.log(`[config] username: ${username || \"(not set)\"}`);\n console.log(\n `[config] scopedRegistries: ${JSON.stringify(scopedRegistries)}`,\n );\n console.log(\n `[config] registryTokens: ${Object.keys(registryTokens).length} configured`,\n );\n }\n\n return {\n registryUrl,\n apiKey,\n username,\n scopedRegistries,\n registryTokens,\n };\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 config: ResolvedConfig,\n registryUrl: string,\n): string | undefined {\n try {\n const url = new URL(registryUrl);\n const host = url.host;\n\n // Check for host-specific token first\n if (config.registryTokens[host]) {\n return config.registryTokens[host];\n }\n\n // Fall back to default API key\n return config.apiKey;\n } catch {\n // Invalid URL, fall back to default\n return config.apiKey;\n }\n}\n\n// =============================================================================\n// Credential Management\n// =============================================================================\n\n/**\n * Set credentials (authToken and optionally username/registry)\n */\nexport async function setCredentials(\n authToken: string,\n username?: string,\n registry?: string,\n): Promise<void> {\n const config = await readUserConfig();\n\n config.authToken = authToken;\n if (username) {\n config.username = username;\n }\n if (registry && registry !== DEFAULT_REGISTRY_URL) {\n config.registry = registry;\n }\n\n await writeUserConfig(config);\n}\n\n/**\n * Clear credentials (authToken and username)\n */\nexport async function clearCredentials(): Promise<void> {\n const config = await readUserConfig();\n\n config.authToken = undefined;\n config.username = undefined;\n\n await writeUserConfig(config);\n}\n\n/**\n * Check if user is logged in\n */\nexport async function isLoggedIn(): Promise<boolean> {\n try {\n const resolved = await resolveConfig();\n return !!resolved.apiKey;\n } catch {\n return false;\n }\n}\n\n/**\n * Get the API key (throws if not logged in)\n */\nexport async function requireApiKey(): Promise<string> {\n const resolved = await resolveConfig();\n\n if (!resolved.apiKey) {\n if (process.env.PSPM_DEBUG) {\n console.log(\"[config] requireApiKey: No API key found\");\n }\n throw new NotLoggedInError();\n }\n\n if (process.env.PSPM_DEBUG) {\n console.log(\n `[config] requireApiKey: Got API key (${resolved.apiKey.substring(0, 10)}...)`,\n );\n }\n\n return resolved.apiKey;\n}\n\n/**\n * Get the registry URL\n */\nexport async function getRegistryUrl(): Promise<string> {\n const resolved = await resolveConfig();\n return 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 \"node_modules\",\n \".git\",\n \".pspm-publish\", // temp directory used during publish\n];\n\n/**\n * Result of loading ignore patterns\n */\nexport interface IgnoreLoadResult {\n /** The ignore instance with loaded patterns */\n ig: Ignore;\n /** Which file the patterns came from (null if using defaults only) */\n source: \".pspmignore\" | \".gitignore\" | null;\n /** Raw patterns loaded from the file (excluding defaults) */\n patterns: 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 cwd: string = process.cwd(),\n): Promise<IgnoreLoadResult> {\n const ig = ignore();\n\n // Always add default ignores\n ig.add(ALWAYS_IGNORED);\n\n // Try .pspmignore first\n const pspmIgnorePath = join(cwd, \".pspmignore\");\n try {\n const content = await readFile(pspmIgnorePath, \"utf-8\");\n const patterns = parseIgnorePatterns(content);\n ig.add(patterns);\n return { ig, source: \".pspmignore\", patterns };\n } catch {\n // .pspmignore not found, try .gitignore\n }\n\n // Fallback to .gitignore\n const gitIgnorePath = join(cwd, \".gitignore\");\n try {\n const content = await readFile(gitIgnorePath, \"utf-8\");\n const patterns = parseIgnorePatterns(content);\n ig.add(patterns);\n return { ig, source: \".gitignore\", patterns };\n } catch {\n // No .gitignore either, use defaults only\n }\n\n return { 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 // Always include the essential excludes\n const allPatterns = [...new Set([...ALWAYS_IGNORED, ...patterns])];\n\n return 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 // Same as rsync\n const allPatterns = [...new Set([...ALWAYS_IGNORED, ...patterns])];\n\n return 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 return content\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter((line) => line && !line.startsWith(\"#\"));\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 const hash = createHash(\"sha256\").update(data).digest(\"base64\");\n return `sha256-${hash}`;\n}\n","/**\n * PSPM Lockfile Schema URL for IDE validation\n */\nexport const PSPM_LOCKFILE_SCHEMA_URL =\n \"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 /** JSON Schema URL for IDE validation */\n $schema?: string;\n /** Lockfile format version */\n lockfileVersion: 1 | 2 | 3 | 4 | 5;\n /** Registry URL used for resolution */\n registryUrl: string;\n /** Installed packages from registry (v2+ format) */\n packages?: Record<string, PspmLockfileEntry>;\n /** Installed packages from GitHub (v3+ format) */\n githubPackages?: Record<string, GitHubLockfileEntry>;\n /** Installed packages from local directories (v4+ format) */\n localPackages?: Record<string, LocalLockfileEntry>;\n /** Installed packages from well-known endpoints (v5+ format) */\n wellKnownPackages?: Record<string, WellKnownLockfileEntry>;\n /** Installed skills (v1 format, deprecated) */\n skills?: 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 /** Always \"local\" for local packages */\n version: \"local\";\n /** Original path from the specifier (relative or absolute) */\n path: string;\n /** Resolved absolute path to the local skill directory */\n resolvedPath: string;\n /** Skill name (last segment of path) */\n name: string;\n}\n\n/**\n * Lockfile entry for a single package from registry.\n */\nexport interface PspmLockfileEntry {\n /** Resolved version */\n version: string;\n /** Download URL used to fetch the package */\n resolved: string;\n /** Integrity hash for verification (sha256-...) */\n integrity: string;\n /** Deprecation message if this version is deprecated */\n deprecated?: string;\n /** Dependencies: package name -> resolved version (v4+) */\n dependencies?: 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 /** Resolved Git commit SHA */\n gitCommit: string;\n /** Original Git ref (branch, tag, or \"latest\") */\n gitRef: string;\n}\n\n/**\n * Lockfile entry for a well-known package.\n * Key format in wellKnownPackages: \"https://hostname#skill-name\"\n */\nexport interface WellKnownLockfileEntry {\n /** Always \"well-known\" for well-known packages */\n version: \"well-known\";\n /** URL to the SKILL.md file */\n resolved: string;\n /** Integrity hash of all file contents */\n integrity: string;\n /** Source hostname */\n hostname: string;\n /** Skill name */\n name: string;\n /** List of files included */\n files: 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 /** Minimum Claude model version required (e.g., \">=3.5\") */\n claude?: string;\n /** Minimum PSPM CLI version required (e.g., \">=0.1.0\") */\n pspm?: string;\n}\n\n/**\n * Agent configuration for skill symlinks\n */\nexport interface AgentConfig {\n /** Directory where skills should be symlinked (e.g., \".claude/skills\") */\n skillsDir: string;\n}\n\n/**\n * Built-in agent types with predefined configurations\n */\nexport type BuiltInAgent =\n | \"adal\"\n | \"amp\"\n | \"antigravity\"\n | \"augment\"\n | \"claude-code\"\n | \"cline\"\n | \"codebuddy\"\n | \"codex\"\n | \"command-code\"\n | \"continue\"\n | \"cortex\"\n | \"crush\"\n | \"cursor\"\n | \"droid\"\n | \"gemini-cli\"\n | \"github-copilot\"\n | \"goose\"\n | \"iflow-cli\"\n | \"junie\"\n | \"kilo\"\n | \"kimi-cli\"\n | \"kiro-cli\"\n | \"kode\"\n | \"mcpjam\"\n | \"mistral-vibe\"\n | \"mux\"\n | \"neovate\"\n | \"openclaw\"\n | \"opencode\"\n | \"openhands\"\n | \"pi\"\n | \"pochi\"\n | \"qoder\"\n | \"qwen-code\"\n | \"replit\"\n | \"roo\"\n | \"trae\"\n | \"trae-cn\"\n | \"universal\"\n | \"windsurf\"\n | \"zencoder\";\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 /** JSON Schema URL for validation */\n $schema?: string;\n\n /** Package name (no @ prefix needed, username is derived from logged-in user) */\n name: string;\n\n /** Semantic version string */\n version: string;\n\n /** Human-readable description */\n description?: string;\n\n /** Package author */\n author?: string;\n\n /** License identifier (e.g., \"MIT\", \"Apache-2.0\") */\n license?: string;\n\n /** Package type (always \"skill\" for prompt skill packages) */\n type?: \"skill\";\n\n /** List of capabilities/tags for discovery */\n capabilities?: string[];\n\n /** Main entry point file (default: \"SKILL.md\") */\n main?: string;\n\n /** Version requirements */\n requirements?: PspmManifestRequirements;\n\n /** Files to include in the published package */\n files?: string[];\n\n /** Skill dependencies (format: \"@user/{username}/{name}\": \"^1.0.0\") */\n dependencies?: Record<string, string>;\n\n /**\n * GitHub skill dependencies (format: \"github:owner/repo/path\": \"ref\")\n *\n * @example\n * ```json\n * {\n * \"githubDependencies\": {\n * \"github:vercel-labs/agent-skills/skills/react-best-practices\": \"main\",\n * \"github:myorg/prompts/team/frontend/linter\": \"v2.0.0\"\n * }\n * }\n * ```\n */\n githubDependencies?: Record<string, string>;\n\n /**\n * Local skill dependencies (format: \"file:../path\": \"*\")\n *\n * Used for local development and testing before publishing.\n * Creates symlinks for instant updates during development.\n *\n * @example\n * ```json\n * {\n * \"localDependencies\": {\n * \"file:../my-local-skill\": \"*\",\n * \"file:/absolute/path/to/skill\": \"*\"\n * }\n * }\n * ```\n */\n localDependencies?: Record<string, string>;\n\n /**\n * Well-known skill dependencies from HTTPS domains.\n *\n * Skills hosted at /.well-known/skills/ on any domain.\n * Key is the base URL, value is an array of skill names (or \"*\" for all).\n *\n * @example\n * ```json\n * {\n * \"wellKnownDependencies\": {\n * \"https://acme.com\": [\"code-review\", \"api-design\"],\n * \"https://docs.stripe.com\": \"*\"\n * }\n * }\n * ```\n */\n wellKnownDependencies?: Record<string, string[] | string>;\n\n /**\n * Custom agent configuration overrides.\n * Built-in agents (claude-code, cursor, codex) have default configs.\n * Custom agents can also be defined here.\n *\n * @example\n * ```json\n * {\n * \"agents\": {\n * \"claude-code\": { \"skillsDir\": \".claude/skills\" },\n * \"my-custom\": { \"skillsDir\": \".myagent/prompts\" }\n * }\n * }\n * ```\n */\n agents?: Partial<Record<BuiltInAgent, AgentConfig>> &\n Record<string, AgentConfig>;\n\n /** If true, prevents publishing to registry */\n private?: boolean;\n}\n\n/**\n * Result of detecting and reading a manifest\n */\nexport interface ManifestDetectionResult {\n /** The detected manifest type */\n type: \"pspm.json\" | \"package.json\";\n\n /** The parsed manifest content */\n manifest: PspmManifest;\n\n /** The file path that was read */\n path: string;\n}\n\n/**\n * Default file patterns to include when publishing\n */\nexport const DEFAULT_SKILL_FILES = [\n \"SKILL.md\",\n \"runtime\",\n \"scripts\",\n \"data\",\n] as const;\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 manifest: Partial<PspmManifest>,\n): { valid: true } | { valid: false; error: string } {\n if (!manifest.name) {\n return { valid: false, error: \"Manifest must have a 'name' field\" };\n }\n\n if (!manifest.version) {\n return { valid: false, error: \"Manifest must have a 'version' field\" };\n }\n\n // Validate name format (lowercase, alphanumeric, hyphens, underscores)\n if (!/^[a-z][a-z0-9_-]*$/.test(manifest.name)) {\n return {\n valid: false,\n error:\n \"Name must start with a lowercase letter and contain only lowercase letters, numbers, hyphens, and underscores\",\n };\n }\n\n // Validate version is valid semver (basic check)\n if (!/^\\d+\\.\\d+\\.\\d+/.test(manifest.version)) {\n return {\n valid: false,\n error: \"Version must be a valid semantic version (e.g., 1.0.0)\",\n };\n }\n\n return { valid: true };\n}\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 const hash = createHash(\"sha256\").update(data).digest(\"base64\");\n return `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 data: Buffer,\n expectedIntegrity: string,\n): boolean {\n const match = expectedIntegrity.match(/^sha256-(.+)$/);\n if (!match) {\n return false;\n }\n\n const actualHash = createHash(\"sha256\").update(data).digest(\"base64\");\n return actualHash === match[1];\n}\n","/**\n * Local specifier support for PSPM\n *\n * Format: file:{path}\n *\n * Supports both relative and absolute paths:\n * - file:../my-skill\n * - file:./local-skill\n * - file:/absolute/path/to/skill\n *\n * Similar to npm/pnpm's file: protocol, but creates symlinks\n * for instant updates during development.\n */\n\n/**\n * Parsed local specifier\n *\n * @example\n * - file:../my-skill\n * - file:./local-skill\n * - file:/absolute/path/to/skill\n */\nexport interface LocalSpecifier {\n /** The path (relative or absolute) */\n path: string;\n /** Whether path is absolute (starts with /) */\n isAbsolute: boolean;\n}\n\n/**\n * Local specifier regex pattern\n * Matches: file:{path}\n *\n * Path can be:\n * - Relative: ./path, ../path\n * - Absolute: /path/to/skill\n */\nconst LOCAL_SPECIFIER_PATTERN = /^file:(.+)$/;\n\n/**\n * Check if a string is a local specifier\n *\n * @param specifier - The specifier string to check\n * @returns true if the specifier starts with \"file:\"\n */\nexport function isLocalSpecifier(specifier: string): boolean {\n return specifier.startsWith(\"file:\");\n}\n\n/**\n * Check if a string looks like a bare local path (no file: prefix)\n *\n * Used to auto-detect local paths like \"../my-skill\" or \"./skill\"\n *\n * @param specifier - The specifier string to check\n * @returns true if the specifier looks like a relative path\n */\nexport function isBareLocalPath(specifier: string): boolean {\n return specifier.startsWith(\"./\") || specifier.startsWith(\"../\");\n}\n\n/**\n * Parse a local specifier string.\n *\n * @param specifier - The specifier string (e.g., \"file:../my-skill\")\n * @returns Parsed specifier or null if invalid\n *\n * @example\n * ```typescript\n * parseLocalSpecifier(\"file:../my-skill\")\n * // => { path: \"../my-skill\", isAbsolute: false }\n *\n * parseLocalSpecifier(\"file:/absolute/path/to/skill\")\n * // => { path: \"/absolute/path/to/skill\", isAbsolute: true }\n * ```\n */\nexport function parseLocalSpecifier(specifier: string): LocalSpecifier | null {\n const match = specifier.match(LOCAL_SPECIFIER_PATTERN);\n\n if (!match) {\n return null;\n }\n\n const path = match[1];\n\n // Validate the path is not empty and looks valid\n if (!path || path.trim() === \"\") {\n return null;\n }\n\n return {\n path,\n isAbsolute: path.startsWith(\"/\"),\n };\n}\n\n/**\n * Format a LocalSpecifier back to string format.\n *\n * @param spec - The local specifier object\n * @returns Formatted string (e.g., \"file:../my-skill\")\n */\nexport function formatLocalSpecifier(spec: LocalSpecifier): string {\n return `file:${spec.path}`;\n}\n\n/**\n * Extract skill name from local specifier.\n * Uses the last segment of the path.\n *\n * @param spec - The local specifier object\n * @returns Skill name (e.g., \"my-skill\")\n *\n * @example\n * ```typescript\n * getLocalSkillName({ path: \"../my-skill\", isAbsolute: false })\n * // => \"my-skill\"\n *\n * getLocalSkillName({ path: \"/path/to/awesome-skill\", isAbsolute: true })\n * // => \"awesome-skill\"\n * ```\n */\nexport function getLocalSkillName(spec: LocalSpecifier): string {\n // Remove trailing slashes and get the last segment\n const normalizedPath = spec.path.replace(/\\/+$/, \"\");\n const segments = normalizedPath.split(\"/\").filter(Boolean);\n return segments[segments.length - 1] || spec.path;\n}\n\n/**\n * Normalize a bare path to a file: specifier\n *\n * @param path - A bare path like \"../my-skill\" or \"./skill\"\n * @returns File specifier string like \"file:../my-skill\"\n */\nexport function normalizeToFileSpecifier(path: string): string {\n if (isLocalSpecifier(path)) {\n return path;\n }\n return `file:${path}`;\n}\n","/**\n * PSPM Lockfile Schema URL for IDE validation\n */\nexport const PSPM_LOCKFILE_SCHEMA_URL =\n \"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 `localPackages` key for local development dependencies.\n * - v5 adds `wellKnownPackages` key for well-known endpoint dependencies.\n */\nexport interface PspmLockfile {\n /** JSON Schema URL for IDE validation */\n $schema?: string;\n /** Lockfile format version */\n lockfileVersion: 1 | 2 | 3 | 4 | 5;\n /** Registry URL used for resolution */\n registryUrl: string;\n /** Installed packages from registry (v2+ format) */\n packages?: Record<string, PspmLockfileEntry>;\n /** Installed packages from GitHub (v3+ format) */\n githubPackages?: Record<string, GitHubLockfileEntry>;\n /** Installed packages from local directories (v4+ format) */\n localPackages?: Record<string, LocalLockfileEntry>;\n /** Installed packages from well-known endpoints (v5+ format) */\n wellKnownPackages?: Record<string, WellKnownLockfileEntry>;\n /** Installed skills (v1 format, deprecated) */\n skills?: Record<string, PspmLockfileEntry>;\n}\n\n/**\n * Lockfile entry for a single package from registry.\n */\nexport interface PspmLockfileEntry {\n /** Resolved version */\n version: string;\n /** Download URL used to fetch the package */\n resolved: string;\n /** Integrity hash for verification (sha256-...) */\n integrity: string;\n /** Deprecation message if this version is deprecated */\n deprecated?: 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 /** Resolved Git commit SHA */\n gitCommit: string;\n /** Original Git ref (branch, tag, or \"latest\") */\n gitRef: string;\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 /** Always \"local\" for local packages */\n version: \"local\";\n /** Original path from the specifier (relative or absolute) */\n path: string;\n /** Resolved absolute path to the local skill directory */\n resolvedPath: string;\n /** Skill name (last segment of path) */\n name: string;\n}\n\n/**\n * Lockfile entry for a well-known package.\n * Key format in wellKnownPackages: \"https://hostname#skill-name\"\n */\nexport interface WellKnownLockfileEntry {\n /** Always \"well-known\" for well-known packages */\n version: \"well-known\";\n /** URL to the SKILL.md file */\n resolved: string;\n /** Integrity hash of all file contents */\n integrity: string;\n /** Source hostname */\n hostname: string;\n /** Skill name */\n name: string;\n /** List of files included */\n files: 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 /** Minimum Claude model version required (e.g., \">=3.5\") */\n claude?: string;\n /** Minimum PSPM CLI version required (e.g., \">=0.1.0\") */\n pspm?: string;\n}\n\n/**\n * Agent configuration for skill symlinks\n */\nexport interface AgentConfig {\n /** Directory where skills should be symlinked (e.g., \".claude/skills\") */\n skillsDir: string;\n}\n\n/**\n * Built-in agent types with predefined configurations\n */\nexport type BuiltInAgent =\n | \"adal\"\n | \"amp\"\n | \"antigravity\"\n | \"augment\"\n | \"claude-code\"\n | \"cline\"\n | \"codebuddy\"\n | \"codex\"\n | \"command-code\"\n | \"continue\"\n | \"cortex\"\n | \"crush\"\n | \"cursor\"\n | \"droid\"\n | \"gemini-cli\"\n | \"github-copilot\"\n | \"goose\"\n | \"iflow-cli\"\n | \"junie\"\n | \"kilo\"\n | \"kimi-cli\"\n | \"kiro-cli\"\n | \"kode\"\n | \"mcpjam\"\n | \"mistral-vibe\"\n | \"mux\"\n | \"neovate\"\n | \"openclaw\"\n | \"opencode\"\n | \"openhands\"\n | \"pi\"\n | \"pochi\"\n | \"qoder\"\n | \"qwen-code\"\n | \"replit\"\n | \"roo\"\n | \"trae\"\n | \"trae-cn\"\n | \"universal\"\n | \"windsurf\"\n | \"zencoder\";\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 /** JSON Schema URL for validation */\n $schema?: string;\n\n /** Package name (no @ prefix needed, username is derived from logged-in user) */\n name: string;\n\n /** Semantic version string */\n version: string;\n\n /** Human-readable description */\n description?: string;\n\n /** Package author */\n author?: string;\n\n /** License identifier (e.g., \"MIT\", \"Apache-2.0\") */\n license?: string;\n\n /** Package type (always \"skill\" for prompt skill packages) */\n type?: \"skill\";\n\n /** List of capabilities/tags for discovery */\n capabilities?: string[];\n\n /** Main entry point file (default: \"SKILL.md\") */\n main?: string;\n\n /** Version requirements */\n requirements?: PspmManifestRequirements;\n\n /** Files to include in the published package */\n files?: string[];\n\n /** Skill dependencies (format: \"@user/{username}/{name}\": \"^1.0.0\") */\n dependencies?: Record<string, string>;\n\n /**\n * GitHub skill dependencies (format: \"github:owner/repo/path\": \"ref\")\n *\n * @example\n * ```json\n * {\n * \"githubDependencies\": {\n * \"github:vercel-labs/agent-skills/skills/react-best-practices\": \"main\",\n * \"github:myorg/prompts/team/frontend/linter\": \"v2.0.0\"\n * }\n * }\n * ```\n */\n githubDependencies?: Record<string, string>;\n\n /**\n * Local skill dependencies (format: \"file:../path\": \"*\")\n *\n * Used for local development and testing before publishing.\n * Creates symlinks for instant updates during development.\n *\n * @example\n * ```json\n * {\n * \"localDependencies\": {\n * \"file:../my-local-skill\": \"*\",\n * \"file:/absolute/path/to/skill\": \"*\"\n * }\n * }\n * ```\n */\n localDependencies?: Record<string, string>;\n\n /**\n * Custom agent configuration overrides.\n * Built-in agents (claude-code, cursor, codex) have default configs.\n * Custom agents can also be defined here.\n *\n * @example\n * ```json\n * {\n * \"agents\": {\n * \"claude-code\": { \"skillsDir\": \".claude/skills\" },\n * \"my-custom\": { \"skillsDir\": \".myagent/prompts\" }\n * }\n * }\n * ```\n */\n agents?: Partial<Record<BuiltInAgent, AgentConfig>> &\n Record<string, AgentConfig>;\n\n /** If true, prevents publishing to registry */\n private?: boolean;\n}\n\n/**\n * Result of detecting and reading a manifest\n */\nexport interface ManifestDetectionResult {\n /** The detected manifest type */\n type: \"pspm.json\" | \"package.json\";\n\n /** The parsed manifest content */\n manifest: PspmManifest;\n\n /** The file path that was read */\n path: string;\n}\n\n/**\n * Default file patterns to include when publishing\n */\nexport const DEFAULT_SKILL_FILES = [\n \"SKILL.md\",\n \"runtime\",\n \"scripts\",\n \"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 manifest: Partial<PspmManifest>,\n): { valid: true } | { valid: false; error: string } {\n if (!manifest.name) {\n return { valid: false, error: \"Manifest must have a 'name' field\" };\n }\n\n if (!manifest.version) {\n return { valid: false, error: \"Manifest must have a 'version' field\" };\n }\n\n // Validate name format (lowercase, alphanumeric, hyphens, underscores)\n if (!/^[a-z][a-z0-9_-]*$/.test(manifest.name)) {\n return {\n valid: false,\n error:\n \"Name must start with a lowercase letter and contain only lowercase letters, numbers, hyphens, and underscores\",\n };\n }\n\n // Validate version is valid semver (basic check)\n if (!/^\\d+\\.\\d+\\.\\d+/.test(manifest.version)) {\n return {\n valid: false,\n error: \"Version must be a valid semantic version (e.g., 1.0.0)\",\n };\n }\n\n return { valid: true };\n}\n\n/**\n * Normalize a manifest by filling in defaults\n */\nexport function normalizeManifest(manifest: PspmManifest): PspmManifest {\n return {\n ...manifest,\n type: manifest.type ?? \"skill\",\n main: manifest.main ?? DEFAULT_MAIN,\n files: manifest.files ?? [...DEFAULT_SKILL_FILES],\n dependencies: manifest.dependencies ?? {},\n githubDependencies: manifest.githubDependencies ?? {},\n localDependencies: manifest.localDependencies ?? {},\n private: manifest.private ?? false,\n };\n}\n","// =============================================================================\n// Registry Namespace Types\n// =============================================================================\n\n/**\n * Supported registry namespace types.\n *\n * - \"user\" — Individual user skills: @user/{username}/{skillname}\n * - \"org\" — Organization skills: @org/{orgname}/{skillname}\n * - \"github\" — GitHub-indexed skills: @github/{owner}/{repo}/{skillname}\n */\nexport type NamespaceType = \"user\" | \"org\" | \"github\";\n\n/**\n * Parsed registry specifier (unified across all namespaces).\n *\n * @example\n * - @user/bsheng/vite-slides -> { namespace: \"user\", owner: \"bsheng\", name: \"vite-slides\" }\n * - @org/anyt/code-review@^2.0.0 -> { namespace: \"org\", owner: \"anyt\", name: \"code-review\", versionRange: \"^2.0.0\" }\n * - @github/microsoft/skills/azure-ai -> { namespace: \"github\", owner: \"microsoft\", name: \"skills\", subname: \"azure-ai\" }\n */\nexport interface RegistrySpecifier {\n namespace: NamespaceType;\n /** username for @user, orgname for @org, GitHub owner for @github */\n owner: string;\n /** skill name for @user/@org, repo name for @github */\n name: string;\n /** skill name within the repo (only for @github) */\n subname?: string;\n versionRange?: string;\n}\n\n// =============================================================================\n// Registry Specifier Parsing\n// =============================================================================\n\n/**\n * Unified registry specifier regex pattern.\n *\n * Matches:\n * - @user/{owner}/{name}[@version]\n * - @org/{owner}/{name}[@version]\n * - @github/{owner}/{repo}/{skillname}[@version]\n *\n * Group 1: namespace (user|org|github)\n * Group 2: owner\n * Group 3: name (skill name for user/org, repo name for github)\n * Group 4: optional subname (skill name within repo, github only)\n * Group 5: optional @version\n */\nconst REGISTRY_SPECIFIER_PATTERN =\n /^@(user|org|github)\\/([a-zA-Z0-9_-]+)\\/([a-zA-Z0-9._-]+)(?:\\/([a-z][a-z0-9-]*))?(?:@(.+))?$/;\n\n/**\n * Parse a registry specifier string (any namespace).\n *\n * @param specifier - The specifier string\n * @returns Parsed specifier or null if invalid\n *\n * @example\n * ```typescript\n * parseRegistrySpecifier(\"@user/bsheng/my-skill@^1.0.0\")\n * // => { namespace: \"user\", owner: \"bsheng\", name: \"my-skill\", versionRange: \"^1.0.0\" }\n *\n * parseRegistrySpecifier(\"@org/anyt/code-review\")\n * // => { namespace: \"org\", owner: \"anyt\", name: \"code-review\" }\n *\n * parseRegistrySpecifier(\"@github/microsoft/skills/azure-ai@1.0.0\")\n * // => { namespace: \"github\", owner: \"microsoft\", name: \"skills\", subname: \"azure-ai\", versionRange: \"1.0.0\" }\n * ```\n */\nexport function parseRegistrySpecifier(\n specifier: string,\n): RegistrySpecifier | null {\n const match = specifier.match(REGISTRY_SPECIFIER_PATTERN);\n\n if (!match) {\n return null;\n }\n\n const namespace = match[1] as NamespaceType;\n const owner = match[2];\n const name = match[3];\n const subname = match[4];\n const versionRange = match[5];\n\n if (!owner || !name) {\n return null;\n }\n\n // @github requires a subname (skill within repo)\n if (namespace === \"github\" && !subname) {\n return null;\n }\n\n // @user and @org should not have a subname\n if (namespace !== \"github\" && subname) {\n return null;\n }\n\n return {\n namespace,\n owner,\n name,\n subname: subname || undefined,\n versionRange: versionRange || undefined,\n };\n}\n\n/**\n * Generate a full registry identifier string.\n *\n * @example\n * ```typescript\n * generateRegistryIdentifier({ namespace: \"user\", owner: \"bsheng\", name: \"my-skill\" })\n * // => \"@user/bsheng/my-skill\"\n *\n * generateRegistryIdentifier({ namespace: \"github\", owner: \"microsoft\", name: \"skills\", subname: \"azure-ai\", versionRange: \"1.0.0\" })\n * // => \"@github/microsoft/skills/azure-ai@1.0.0\"\n * ```\n */\nexport function generateRegistryIdentifier(\n spec: Pick<\n RegistrySpecifier,\n \"namespace\" | \"owner\" | \"name\" | \"subname\" | \"versionRange\"\n >,\n): string {\n let base = `@${spec.namespace}/${spec.owner}/${spec.name}`;\n if (spec.subname) {\n base += `/${spec.subname}`;\n }\n if (spec.versionRange) {\n base += `@${spec.versionRange}`;\n }\n return base;\n}\n\n/**\n * Check if a string is a registry specifier (starts with @user/, @org/, or @github/).\n */\nexport function isRegistrySpecifier(specifier: string): boolean {\n return (\n specifier.startsWith(\"@user/\") ||\n specifier.startsWith(\"@org/\") ||\n specifier.startsWith(\"@github/\")\n );\n}\n\n/**\n * Get the effective skill name from a registry specifier.\n * For @user/@org this is `name`, for @github this is `subname`.\n */\nexport function getRegistrySkillName(spec: RegistrySpecifier): string {\n return spec.subname ?? spec.name;\n}\n\n// =============================================================================\n// Backward-Compatible Aliases (@user namespace only)\n// =============================================================================\n\n/**\n * Parsed skill specifier (@user namespace only).\n * @deprecated Use `RegistrySpecifier` instead for multi-namespace support.\n */\nexport interface SkillSpecifier {\n username: string;\n name: string;\n versionRange?: string;\n}\n\n/**\n * Parse a skill specifier string (@user namespace only, backward compat).\n * @deprecated Use `parseRegistrySpecifier` instead.\n */\nexport function parseSkillSpecifier(specifier: string): SkillSpecifier | null {\n const result = parseRegistrySpecifier(specifier);\n if (!result || result.namespace !== \"user\") {\n return null;\n }\n return {\n username: result.owner,\n name: result.name,\n versionRange: result.versionRange,\n };\n}\n\n/**\n * Generate a full skill identifier string (@user namespace).\n * @deprecated Use `generateRegistryIdentifier` instead.\n */\nexport function generateSkillIdentifier(\n username: string,\n name: string,\n version?: string,\n): string {\n return generateRegistryIdentifier({\n namespace: \"user\",\n owner: username,\n name,\n versionRange: version,\n });\n}\n\n// =============================================================================\n// GitHub Specifier Support (github: protocol, direct download)\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 /** Repository owner */\n owner: string;\n /** Repository name */\n repo: string;\n /** Optional path within the repository (e.g., \"skills/react-best-practices\") */\n path?: string;\n /** Git ref (branch, tag, or commit SHA). Defaults to default branch if not specified. */\n ref?: 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 /^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 specifier: string,\n): GitHubSpecifier | null {\n const match = specifier.match(GITHUB_SPECIFIER_PATTERN);\n\n if (!match) {\n return null;\n }\n\n const owner = match[1];\n const repo = match[2];\n const pathWithSlash = match[3];\n const ref = match[4];\n\n if (!owner || !repo) {\n return null;\n }\n\n return {\n owner,\n repo,\n // Remove leading slash from path\n path: pathWithSlash ? pathWithSlash.slice(1) : undefined,\n ref: ref || undefined,\n };\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 let result = `github:${spec.owner}/${spec.repo}`;\n if (spec.path) {\n result += `/${spec.path}`;\n }\n if (spec.ref) {\n result += `@${spec.ref}`;\n }\n return 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 if (spec.path) {\n const segments = spec.path.split(\"/\").filter(Boolean);\n return segments[segments.length - 1];\n }\n return spec.repo;\n}\n\n/**\n * Check if a string is a GitHub specifier\n */\nexport function isGitHubSpecifier(specifier: string): boolean {\n return specifier.startsWith(\"github:\");\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 range: string,\n availableVersions: string[],\n): string | null {\n const sorted = availableVersions\n .filter((v) => semver.valid(v))\n .sort((a, b) => semver.rcompare(a, b));\n\n if (!range || range === \"latest\" || range === \"*\") {\n return sorted[0] ?? null;\n }\n\n return 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 return 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 if (!range || range === \"latest\") {\n return \"*\";\n }\n return 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 return 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 return semver.gt(a, b);\n}\n\n/**\n * Get the latest version from a list.\n */\nexport function getLatestVersion(versions: string[]): string | null {\n const valid = versions.filter((v) => semver.valid(v));\n if (valid.length === 0) return null;\n return valid.sort((a, b) => semver.rcompare(a, b))[0];\n}\n","/**\n * @repo/pspm-types - CLI-specific types for PSPM\n *\n * This package contains types and utilities used by the PSPM CLI\n * that are not part of the API contract (SDK).\n */\n\n// Integrity utilities\nexport { calculateIntegrity, verifyIntegrity } from \"./integrity\";\n// Local specifier support\nexport {\n formatLocalSpecifier,\n getLocalSkillName,\n isBareLocalPath,\n isLocalSpecifier,\n type LocalSpecifier,\n normalizeToFileSpecifier,\n parseLocalSpecifier,\n} from \"./local\";\n// Lockfile types\n// Legacy lockfile types (deprecated, use Pspm* versions)\nexport {\n type GitHubLockfileEntry,\n type LocalLockfileEntry,\n PSPM_LOCKFILE_SCHEMA_URL,\n type PspmLockfile,\n type PspmLockfile as SkillLockfile,\n type PspmLockfileEntry,\n type PspmLockfileEntry as SkillLockfileEntry,\n type WellKnownLockfileEntry,\n} from \"./lockfile\";\n\n// Manifest types (pspm.json)\nexport {\n type AgentConfig,\n type BuiltInAgent,\n DEFAULT_MAIN,\n DEFAULT_SKILL_FILES,\n type ManifestDetectionResult,\n normalizeManifest,\n PSPM_SCHEMA_URL,\n type PspmManifest,\n type PspmManifestRequirements,\n validateManifest,\n} from \"./manifest\";\n// Skill specifier parsing (registry namespaces + GitHub protocol)\nexport {\n formatGitHubSpecifier,\n type GitHubSpecifier,\n generateRegistryIdentifier,\n generateSkillIdentifier,\n getGitHubSkillName,\n getRegistrySkillName,\n isGitHubSpecifier,\n isRegistrySpecifier,\n type NamespaceType,\n parseGitHubSpecifier,\n parseRegistrySpecifier,\n parseSkillSpecifier,\n type RegistrySpecifier,\n type SkillSpecifier,\n} from \"./specifier\";\n// Version utilities\nexport {\n compareVersions,\n getLatestVersion,\n isNewerVersion,\n normalizeVersionRange,\n resolveVersion,\n versionSatisfies,\n} from \"./version\";\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 range: string,\n availableVersions: string[],\n): string | null {\n const sorted = availableVersions\n .filter((v) => semver.valid(v))\n .sort((a, b) => semver.rcompare(a, b));\n\n if (!range || range === \"latest\" || range === \"*\") {\n return sorted[0] ?? null;\n }\n\n return 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 return 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 if (!range || range === \"latest\") {\n return \"*\";\n }\n return 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 return 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 return semver.gt(a, b);\n}\n\n/**\n * Get the latest version from a list.\n */\nexport function getLatestVersion(versions: string[]): string | null {\n const valid = versions.filter((v) => semver.valid(v));\n if (valid.length === 0) return null;\n return 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 ranges: string[],\n availableVersions: string[],\n): string | null {\n const sorted = availableVersions\n .filter((v) => semver.valid(v))\n .sort((a, b) => semver.rcompare(a, b));\n\n if (sorted.length === 0) return null;\n\n // Normalize ranges\n const normalizedRanges = ranges.map((r) =>\n !r || r === \"latest\" || r === \"*\" ? \"*\" : r,\n );\n\n // Find highest version satisfying all ranges\n for (const version of sorted) {\n const satisfiesAll = normalizedRanges.every((range) =>\n semver.satisfies(version, range),\n );\n if (satisfiesAll) {\n return version;\n }\n }\n\n return 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 if (ranges.length === 0) return true;\n if (ranges.length === 1) return true;\n\n // Normalize ranges\n const normalizedRanges = ranges.map((r) =>\n !r || r === \"latest\" || r === \"*\" ? \"*\" : r,\n );\n\n // Check if all ranges intersect by seeing if any version could satisfy all\n // We use a subset of the range to find intersections\n try {\n const intersection = normalizedRanges.reduce((acc, range) => {\n if (acc === \"*\") return range;\n if (range === \"*\") return acc;\n return semver.intersects(acc, range) ? `${acc} ${range}` : \"\";\n }, \"*\");\n return intersection !== \"\";\n } catch {\n return false;\n }\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 { parseRegistrySpecifier } from \"@repo/pspm-types\";\nimport {\n configure,\n getGithubSkillVersion,\n getOrgSkillVersion,\n getSkillVersion,\n listGithubSkillVersions,\n listOrgSkillVersions,\n listSkillVersions,\n} 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 /** Maximum depth for resolution (default: 5) */\n maxDepth: number;\n /** Registry URL */\n registryUrl: string;\n /** API key for authentication */\n apiKey?: string;\n}\n\nexport interface DependencyNode {\n /** Full package name (e.g., @user/alice/skill) */\n name: string;\n /** Resolved version (e.g., 1.2.3) */\n version: string;\n /** Original version range requested (e.g., ^1.0.0) */\n versionRange: string;\n /** Download URL for the package */\n downloadUrl: string;\n /** Integrity hash for verification */\n integrity: string;\n /** Depth in dependency tree (0 = direct dependency) */\n depth: number;\n /** Dependencies: name -> resolved version */\n dependencies: Record<string, string>;\n /** Packages that depend on this one */\n dependents: string[];\n /** Whether this is a direct dependency (from pspm.json) */\n isDirect: boolean;\n /** Deprecation message if deprecated */\n deprecated?: string;\n}\n\nexport interface DependencyGraph {\n /** All resolved nodes: name -> node */\n nodes: Map<string, DependencyNode>;\n /** Root package names (direct dependencies) */\n roots: string[];\n /** Resolution errors */\n errors: ResolutionError[];\n /** Version conflicts (multiple packages need incompatible versions) */\n conflicts: VersionConflict[];\n}\n\nexport interface ResolutionResult {\n /** Whether resolution completed successfully */\n success: boolean;\n /** The dependency graph */\n graph: DependencyGraph;\n /** Topologically sorted install order */\n installOrder: string[];\n}\n\nexport type ResolutionErrorType =\n | \"circular_dependency\"\n | \"max_depth_exceeded\"\n | \"no_satisfying_version\"\n | \"package_not_found\"\n | \"fetch_error\";\n\nexport interface ResolutionError {\n type: ResolutionErrorType;\n package: string;\n message: string;\n /** Path that led to this error */\n path?: string[];\n}\n\nexport interface VersionConflict {\n /** Package name */\n package: string;\n /** Ranges requested by different dependents */\n ranges: Array<{ dependent: string; range: string }>;\n /** Available versions that were checked */\n availableVersions: string[];\n}\n\n// =============================================================================\n// Internal Types\n// =============================================================================\n\ninterface QueueItem {\n name: string;\n versionRange: string;\n depth: number;\n dependent: string;\n path: string[];\n}\n\ninterface CollectedRange {\n range: string;\n dependent: string;\n depth: 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 rootDeps: Record<string, string>,\n config: ResolverConfig,\n): Promise<ResolutionResult> {\n const graph: DependencyGraph = {\n nodes: new Map(),\n roots: Object.keys(rootDeps),\n errors: [],\n conflicts: [],\n };\n\n // Configure API client - apiKey may be undefined for public packages\n configure({\n registryUrl: config.registryUrl,\n apiKey: config.apiKey,\n });\n\n // Collect version ranges for each package\n const rangesByPackage = new Map<string, CollectedRange[]>();\n\n // Queue for BFS traversal\n const queue: QueueItem[] = [];\n\n // Initialize queue with root dependencies\n for (const [name, range] of Object.entries(rootDeps)) {\n queue.push({\n name,\n versionRange: range,\n depth: 0,\n dependent: \"root\",\n path: [],\n });\n }\n\n // Set of packages being processed (for cycle detection)\n const processing = new Set<string>();\n\n // Phase 1: Collect all version ranges using BFS\n while (queue.length > 0) {\n const item = queue.shift();\n if (!item) continue;\n const { name, versionRange, depth, dependent, path } = item;\n\n // Check depth limit\n if (depth > config.maxDepth) {\n graph.errors.push({\n type: \"max_depth_exceeded\",\n package: name,\n message: `Maximum dependency depth (${config.maxDepth}) exceeded at: ${[...path, name].join(\" -> \")}`,\n path: [...path, name],\n });\n continue;\n }\n\n // Check for circular dependency\n if (path.includes(name)) {\n graph.errors.push({\n type: \"circular_dependency\",\n package: name,\n message: `Circular dependency detected: ${[...path, name].join(\" -> \")}`,\n path: [...path, name],\n });\n continue;\n }\n\n // Collect range for this package\n if (!rangesByPackage.has(name)) {\n rangesByPackage.set(name, []);\n }\n rangesByPackage.get(name)?.push({\n range: versionRange,\n dependent,\n depth,\n });\n\n // Only process each package once for fetching\n if (processing.has(name)) {\n continue;\n }\n processing.add(name);\n\n // Parse package name (supports @user, @org, @github namespaces)\n const parsed = parseRegistrySpecifier(name);\n if (!parsed) {\n graph.errors.push({\n type: \"package_not_found\",\n package: name,\n message: `Invalid package name format: ${name}`,\n });\n continue;\n }\n\n // Fetch available versions\n try {\n let versionsData: { version: string }[] | undefined;\n let versionsStatus: number;\n if (parsed.namespace === \"github\" && parsed.subname) {\n const resp = await listGithubSkillVersions(\n parsed.owner,\n parsed.name,\n parsed.subname,\n );\n versionsStatus = resp.status;\n versionsData = resp.data;\n } else if (parsed.namespace === \"org\") {\n const resp = await listOrgSkillVersions(parsed.owner, parsed.name);\n versionsStatus = resp.status;\n versionsData =\n resp.status === 200\n ? (resp.data as { version: string }[])\n : undefined;\n } else {\n const resp = await listSkillVersions(parsed.owner, parsed.name);\n versionsStatus = resp.status;\n versionsData =\n resp.status === 200\n ? (resp.data as { version: string }[])\n : undefined;\n }\n if (versionsStatus !== 200 || !versionsData) {\n graph.errors.push({\n type: \"package_not_found\",\n package: name,\n message: `Package ${name} not found in registry`,\n });\n continue;\n }\n\n if (versionsData.length === 0) {\n graph.errors.push({\n type: \"package_not_found\",\n package: name,\n message: `Package ${name} has no versions`,\n });\n continue;\n }\n\n const availableVersions = versionsData.map((v) => v.version);\n\n // Find highest satisfying version (will be finalized in phase 2)\n const resolvedVersion = findHighestSatisfying(\n [versionRange],\n availableVersions,\n );\n\n if (!resolvedVersion) {\n graph.errors.push({\n type: \"no_satisfying_version\",\n package: name,\n message: `No version of ${name} satisfies: ${versionRange}`,\n });\n continue;\n }\n\n // Fetch package details for dependencies\n let versionData: {\n downloadUrl: string;\n checksum: string;\n manifest?: unknown;\n deprecationMessage?: string | null;\n } | null = null;\n if (parsed.namespace === \"github\" && parsed.subname) {\n const resp = await getGithubSkillVersion(\n parsed.owner,\n parsed.name,\n parsed.subname,\n resolvedVersion,\n );\n if (resp.status === 200 && resp.data) {\n versionData = resp.data;\n }\n } else if (parsed.namespace === \"org\") {\n const resp = await getOrgSkillVersion(\n parsed.owner,\n parsed.name,\n resolvedVersion,\n );\n if (resp.status === 200 && resp.data) {\n versionData = resp.data;\n }\n } else {\n const resp = await getSkillVersion(\n parsed.owner,\n parsed.name,\n resolvedVersion,\n );\n if (resp.status === 200 && resp.data) {\n versionData = resp.data as unknown as NonNullable<typeof versionData>;\n }\n }\n if (!versionData) {\n graph.errors.push({\n type: \"fetch_error\",\n package: name,\n message: `Failed to fetch ${name}@${resolvedVersion}`,\n });\n continue;\n }\n\n const manifest = versionData.manifest as\n | { dependencies?: Record<string, string> }\n | undefined;\n const dependencies = manifest?.dependencies ?? {};\n\n // Create node (may be updated in phase 2 with final version)\n const node: DependencyNode = {\n name,\n version: resolvedVersion,\n versionRange,\n downloadUrl: versionData.downloadUrl,\n integrity: `sha256-${Buffer.from(versionData.checksum, \"hex\").toString(\"base64\")}`,\n depth,\n dependencies,\n dependents: [dependent],\n isDirect: depth === 0,\n deprecated: versionData.deprecationMessage ?? undefined,\n };\n graph.nodes.set(name, node);\n\n // Queue transitive dependencies\n for (const [depName, depRange] of Object.entries(dependencies)) {\n queue.push({\n name: depName,\n versionRange: depRange,\n depth: depth + 1,\n dependent: name,\n path: [...path, name],\n });\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n graph.errors.push({\n type: \"fetch_error\",\n package: name,\n message: `Error fetching ${name}: ${message}`,\n });\n }\n }\n\n // Phase 2: Resolve final versions considering all collected ranges\n for (const [name, ranges] of rangesByPackage.entries()) {\n const node = graph.nodes.get(name);\n if (!node) continue;\n\n // Update dependents list\n const uniqueDependents = [...new Set(ranges.map((r) => r.dependent))];\n node.dependents = uniqueDependents;\n\n // Check if all ranges can be satisfied\n const allRanges = ranges.map((r) => r.range);\n const p2Parsed = parseRegistrySpecifier(name);\n if (!p2Parsed) continue;\n\n try {\n let p2Versions: { version: string }[] | undefined;\n if (p2Parsed.namespace === \"github\" && p2Parsed.subname) {\n const resp = await listGithubSkillVersions(\n p2Parsed.owner,\n p2Parsed.name,\n p2Parsed.subname,\n );\n p2Versions = resp.status === 200 ? resp.data : undefined;\n } else if (p2Parsed.namespace === \"org\") {\n const resp = await listOrgSkillVersions(p2Parsed.owner, p2Parsed.name);\n p2Versions =\n resp.status === 200\n ? (resp.data as { version: string }[])\n : undefined;\n } else {\n const resp = await listSkillVersions(p2Parsed.owner, p2Parsed.name);\n p2Versions =\n resp.status === 200\n ? (resp.data as { version: string }[])\n : undefined;\n }\n if (!p2Versions) continue;\n\n const availableVersions = p2Versions.map((v) => v.version);\n\n const finalVersion = findHighestSatisfying(allRanges, availableVersions);\n\n if (!finalVersion) {\n // Record conflict\n graph.conflicts.push({\n package: name,\n ranges: ranges.map((r) => ({\n dependent: r.dependent,\n range: r.range,\n })),\n availableVersions,\n });\n\n graph.errors.push({\n type: \"no_satisfying_version\",\n package: name,\n message: `No version of ${name} satisfies all requirements: ${allRanges.join(\", \")}`,\n });\n continue;\n }\n\n // Update node if version changed\n if (finalVersion !== node.version) {\n let p2VersionData: {\n downloadUrl: string;\n checksum: string;\n manifest?: unknown;\n deprecationMessage?: string | null;\n } | null = null;\n if (p2Parsed.namespace === \"github\" && p2Parsed.subname) {\n const resp = await getGithubSkillVersion(\n p2Parsed.owner,\n p2Parsed.name,\n p2Parsed.subname,\n finalVersion,\n );\n if (resp.status === 200 && resp.data) {\n p2VersionData = resp.data;\n }\n } else if (p2Parsed.namespace === \"org\") {\n const resp = await getOrgSkillVersion(\n p2Parsed.owner,\n p2Parsed.name,\n finalVersion,\n );\n if (resp.status === 200 && resp.data) {\n p2VersionData = resp.data;\n }\n } else {\n const resp = await getSkillVersion(\n p2Parsed.owner,\n p2Parsed.name,\n finalVersion,\n );\n if (resp.status === 200 && resp.data) {\n p2VersionData = resp.data as unknown as NonNullable<\n typeof p2VersionData\n >;\n }\n }\n if (p2VersionData) {\n node.version = finalVersion;\n node.downloadUrl = p2VersionData.downloadUrl;\n node.integrity = `sha256-${Buffer.from(p2VersionData.checksum, \"hex\").toString(\"base64\")}`;\n node.deprecated = p2VersionData.deprecationMessage ?? undefined;\n\n const manifest = p2VersionData.manifest as\n | { dependencies?: Record<string, string> }\n | undefined;\n node.dependencies = manifest?.dependencies ?? {};\n }\n }\n } catch {\n // Already have a node, keep it\n }\n }\n\n // Phase 3: Compute topological sort\n const installOrder = topologicalSort(graph);\n\n // Determine success\n const success = graph.errors.length === 0 && graph.conflicts.length === 0;\n\n return {\n success,\n graph,\n installOrder,\n };\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 // in-degree: number of dependencies a node has (within the graph)\n const inDegree = new Map<string, number>();\n // dependents: nodes that depend on this node (reverse edges)\n const dependents = new Map<string, string[]>();\n\n // Initialize all nodes\n for (const name of graph.nodes.keys()) {\n inDegree.set(name, 0);\n dependents.set(name, []);\n }\n\n // Build the graph\n for (const [name, node] of graph.nodes.entries()) {\n for (const depName of Object.keys(node.dependencies)) {\n // Only count dependencies that exist in our graph\n if (graph.nodes.has(depName)) {\n // Increment in-degree of current node (it has a dependency)\n inDegree.set(name, (inDegree.get(name) ?? 0) + 1);\n // Add reverse edge: depName is depended on by name\n if (!dependents.has(depName)) {\n dependents.set(depName, []);\n }\n dependents.get(depName)?.push(name);\n }\n }\n }\n\n // Find nodes with in-degree 0 (no dependencies within our graph)\n const queue: string[] = [];\n for (const [name, degree] of inDegree.entries()) {\n if (degree === 0) {\n queue.push(name);\n }\n }\n\n const sorted: string[] = [];\n while (queue.length > 0) {\n const current = queue.shift();\n if (!current) continue;\n sorted.push(current);\n\n // For each node that depends on current, decrease its in-degree\n const deps = dependents.get(current) ?? [];\n for (const dependent of deps) {\n const newDegree = (inDegree.get(dependent) ?? 1) - 1;\n inDegree.set(dependent, newDegree);\n if (newDegree === 0 && !sorted.includes(dependent)) {\n queue.push(dependent);\n }\n }\n }\n\n return 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 packages: Record<string, { dependencies?: Record<string, string> }>,\n): string[] {\n const visited = new Set<string>();\n const order: string[] = [];\n\n function visit(name: string) {\n if (visited.has(name)) return;\n visited.add(name);\n\n const entry = packages[name];\n if (entry?.dependencies) {\n for (const dep of Object.keys(entry.dependencies)) {\n visit(dep);\n }\n }\n order.push(name);\n }\n\n for (const name of Object.keys(packages)) {\n visit(name);\n }\n\n return 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 return errors.map((error) => {\n switch (error.type) {\n case \"circular_dependency\":\n return `Circular dependency: ${error.path?.join(\" -> \") ?? error.package}`;\n case \"max_depth_exceeded\":\n return `Max depth exceeded at: ${error.path?.join(\" -> \") ?? error.package}`;\n case \"no_satisfying_version\":\n return error.message;\n case \"package_not_found\":\n return `Package not found: ${error.package}`;\n case \"fetch_error\":\n return error.message;\n default:\n return error.message;\n }\n });\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 return conflicts.map((conflict) => {\n const requirements = conflict.ranges\n .map((r) => `${r.dependent} needs ${r.range}`)\n .join(\", \");\n return `No version of ${conflict.package} satisfies: ${requirements}`;\n });\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 errors: ResolutionError[],\n conflicts: VersionConflict[] = [],\n): void {\n if (errors.length > 0) {\n console.error(\"\\nResolution errors:\");\n for (const msg of formatResolutionErrors(errors)) {\n console.error(` - ${msg}`);\n }\n }\n\n if (conflicts.length > 0) {\n console.error(\"\\nVersion conflicts:\");\n for (const msg of formatVersionConflicts(conflicts)) {\n console.error(` - ${msg}`);\n }\n }\n}\n","// =============================================================================\n// Registry Namespace Types\n// =============================================================================\n\n/**\n * Supported registry namespace types.\n *\n * - \"user\" — Individual user skills: @user/{username}/{skillname}\n * - \"org\" — Organization skills: @org/{orgname}/{skillname}\n * - \"github\" — GitHub-indexed skills: @github/{owner}/{repo}/{skillname}\n */\nexport type NamespaceType = \"user\" | \"org\" | \"github\";\n\n/**\n * Parsed registry specifier (unified across all namespaces).\n *\n * @example\n * - @user/bsheng/vite-slides -> { namespace: \"user\", owner: \"bsheng\", name: \"vite-slides\" }\n * - @org/anyt/code-review@^2.0.0 -> { namespace: \"org\", owner: \"anyt\", name: \"code-review\", versionRange: \"^2.0.0\" }\n * - @github/microsoft/skills/azure-ai -> { namespace: \"github\", owner: \"microsoft\", name: \"skills\", subname: \"azure-ai\" }\n */\nexport interface RegistrySpecifier {\n namespace: NamespaceType;\n /** username for @user, orgname for @org, GitHub owner for @github */\n owner: string;\n /** skill name for @user/@org, repo name for @github */\n name: string;\n /** skill name within the repo (only for @github) */\n subname?: string;\n versionRange?: string;\n}\n\n// =============================================================================\n// Registry Specifier Parsing\n// =============================================================================\n\n/**\n * Unified registry specifier regex pattern.\n *\n * Matches:\n * - @user/{owner}/{name}[@version]\n * - @org/{owner}/{name}[@version]\n * - @github/{owner}/{repo}/{skillname}[@version]\n *\n * Group 1: namespace (user|org|github)\n * Group 2: owner\n * Group 3: name (skill name for user/org, repo name for github)\n * Group 4: optional subname (skill name within repo, github only)\n * Group 5: optional @version\n */\nconst REGISTRY_SPECIFIER_PATTERN =\n /^@(user|org|github)\\/([a-zA-Z0-9_-]+)\\/([a-zA-Z0-9._-]+)(?:\\/([a-z][a-z0-9-]*))?(?:@(.+))?$/;\n\n/**\n * Parse a registry specifier string (any namespace).\n *\n * @param specifier - The specifier string\n * @returns Parsed specifier or null if invalid\n */\nexport function parseRegistrySpecifier(\n specifier: string,\n): RegistrySpecifier | null {\n const match = specifier.match(REGISTRY_SPECIFIER_PATTERN);\n\n if (!match) {\n return null;\n }\n\n const namespace = match[1] as NamespaceType;\n const owner = match[2];\n const name = match[3];\n const subname = match[4];\n const versionRange = match[5];\n\n if (!owner || !name) {\n return null;\n }\n\n // @github requires a subname (skill within repo)\n if (namespace === \"github\" && !subname) {\n return null;\n }\n\n // @user and @org should not have a subname\n if (namespace !== \"github\" && subname) {\n return null;\n }\n\n return {\n namespace,\n owner,\n name,\n subname: subname || undefined,\n versionRange: versionRange || undefined,\n };\n}\n\n/**\n * Generate a full registry identifier string.\n */\nexport function generateRegistryIdentifier(\n spec: Pick<\n RegistrySpecifier,\n \"namespace\" | \"owner\" | \"name\" | \"subname\" | \"versionRange\"\n >,\n): string {\n let base = `@${spec.namespace}/${spec.owner}/${spec.name}`;\n if (spec.subname) {\n base += `/${spec.subname}`;\n }\n if (spec.versionRange) {\n base += `@${spec.versionRange}`;\n }\n return base;\n}\n\n/**\n * Check if a string is a registry specifier (starts with @user/, @org/, or @github/).\n */\nexport function isRegistrySpecifier(specifier: string): boolean {\n return (\n specifier.startsWith(\"@user/\") ||\n specifier.startsWith(\"@org/\") ||\n specifier.startsWith(\"@github/\")\n );\n}\n\n/**\n * Get the effective skill name from a registry specifier.\n * For @user/@org this is `name`, for @github this is `subname`.\n */\nexport function getRegistrySkillName(spec: RegistrySpecifier): string {\n return spec.subname ?? spec.name;\n}\n\n// =============================================================================\n// Backward-Compatible Aliases (@user namespace only)\n// =============================================================================\n\n/**\n * Parsed skill specifier (@user namespace only).\n * @deprecated Use `RegistrySpecifier` instead for multi-namespace support.\n */\nexport interface SkillSpecifier {\n username: string;\n name: string;\n versionRange?: string;\n}\n\n/**\n * Parse a skill specifier string (@user namespace only, backward compat).\n * @deprecated Use `parseRegistrySpecifier` instead.\n */\nexport function parseSkillSpecifier(specifier: string): SkillSpecifier | null {\n const result = parseRegistrySpecifier(specifier);\n if (!result || result.namespace !== \"user\") {\n return null;\n }\n return {\n username: result.owner,\n name: result.name,\n versionRange: result.versionRange,\n };\n}\n\n/**\n * Generate a full skill identifier string (@user namespace).\n * @deprecated Use `generateRegistryIdentifier` instead.\n */\nexport function generateSkillIdentifier(\n username: string,\n name: string,\n version?: string,\n): string {\n return generateRegistryIdentifier({\n namespace: \"user\",\n owner: username,\n name,\n versionRange: version,\n });\n}\n\n// =============================================================================\n// GitHub Specifier Support (github: protocol, direct download)\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 /** Repository owner */\n owner: string;\n /** Repository name */\n repo: string;\n /** Optional path within the repository (e.g., \"skills/react-best-practices\") */\n path?: string;\n /** Git ref (branch, tag, or commit SHA). Defaults to default branch if not specified. */\n ref?: 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 /^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 specifier: string,\n): GitHubSpecifier | null {\n const match = specifier.match(GITHUB_SPECIFIER_PATTERN);\n\n if (!match) {\n return null;\n }\n\n const [, owner, repo, pathWithSlash, ref] = match;\n if (!owner || !repo) {\n return null;\n }\n\n return {\n owner,\n repo,\n // Remove leading slash from path\n path: pathWithSlash ? pathWithSlash.slice(1) : undefined,\n ref: ref || undefined,\n };\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 let result = `github:${spec.owner}/${spec.repo}`;\n if (spec.path) {\n result += `/${spec.path}`;\n }\n if (spec.ref) {\n result += `@${spec.ref}`;\n }\n return 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 if (spec.path) {\n const segments = spec.path.split(\"/\").filter(Boolean);\n const lastSegment = segments[segments.length - 1];\n if (lastSegment) {\n return lastSegment;\n }\n }\n return spec.repo;\n}\n\n/**\n * Check if a string is a GitHub specifier (github: prefix)\n */\nexport function isGitHubSpecifier(specifier: string): boolean {\n return specifier.startsWith(\"github:\");\n}\n\n// =============================================================================\n// GitHub URL and Shorthand Support\n// =============================================================================\n\n/**\n * GitHub URL patterns\n *\n * Matches:\n * - https://github.com/owner/repo/tree/branch/path/to/skill\n * - https://github.com/owner/repo/tree/branch\n * - https://github.com/owner/repo\n * - https://github.com/owner/repo.git\n */\nconst GITHUB_URL_TREE_PATTERN =\n /^https?:\\/\\/github\\.com\\/([^/]+)\\/([^/]+)\\/tree\\/([^/]+)(?:\\/(.+))?$/;\nconst GITHUB_URL_PATTERN =\n /^https?:\\/\\/github\\.com\\/([^/]+)\\/([^/]+?)(?:\\.git)?\\/?$/;\n\n/**\n * GitHub shorthand pattern: owner/repo or owner/repo/path\n * Must not contain :, not start with . / or @\n */\nconst GITHUB_SHORTHAND_PATTERN =\n /^([a-zA-Z0-9_-]+)\\/([a-zA-Z0-9_.-]+)(?:\\/(.+))?$/;\n\n/**\n * Check if a string is a GitHub URL (https://github.com/...)\n */\nexport function isGitHubUrl(input: string): boolean {\n return /^https?:\\/\\/github\\.com\\/[^/]+\\/[^/]+/.test(input);\n}\n\n/**\n * Parse a GitHub URL into a GitHubSpecifier.\n */\nexport function parseGitHubUrl(input: string): GitHubSpecifier | null {\n // Try tree URL first (more specific)\n const treeMatch = input.match(GITHUB_URL_TREE_PATTERN);\n if (treeMatch) {\n const [, owner, repo, ref, path] = treeMatch;\n if (!owner || !repo || !ref) return null;\n return {\n owner,\n repo,\n ref,\n path: path || undefined,\n };\n }\n\n // Plain repo URL\n const repoMatch = input.match(GITHUB_URL_PATTERN);\n if (repoMatch) {\n const [, owner, repo] = repoMatch;\n if (!owner || !repo) return null;\n return { owner, repo };\n }\n\n return null;\n}\n\n/**\n * Check if a string is a GitHub shorthand (owner/repo or owner/repo/path).\n */\nexport function isGitHubShorthand(input: string): boolean {\n if (\n input.includes(\":\") ||\n input.startsWith(\".\") ||\n input.startsWith(\"/\") ||\n input.startsWith(\"@\")\n ) {\n return false;\n }\n return GITHUB_SHORTHAND_PATTERN.test(input);\n}\n\n/**\n * Parse a GitHub shorthand into a GitHubSpecifier.\n */\nexport function parseGitHubShorthand(input: string): GitHubSpecifier | null {\n if (\n input.includes(\":\") ||\n input.startsWith(\".\") ||\n input.startsWith(\"/\") ||\n input.startsWith(\"@\")\n ) {\n return null;\n }\n\n const match = input.match(GITHUB_SHORTHAND_PATTERN);\n if (!match) return null;\n\n const [, owner, repo, path] = match;\n if (!owner || !repo) return null;\n\n return {\n owner,\n repo,\n path: path || undefined,\n };\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 ALWAYS_IGNORED,\n getExcludeArgsForRsync,\n getExcludeArgsForTar,\n type IgnoreLoadResult,\n loadIgnorePatterns,\n parseIgnorePatterns,\n} from \"./ignore\";\n\n// Integrity utilities\nexport { calculateIntegrity } from \"./integrity\";\n// Lockfile types\n// Legacy lockfile types (deprecated, use Pspm* versions)\nexport {\n type GitHubLockfileEntry,\n type LocalLockfileEntry,\n PSPM_LOCKFILE_SCHEMA_URL,\n type PspmLockfile,\n type PspmLockfile as SkillLockfile,\n type PspmLockfileEntry,\n type PspmLockfileEntry as SkillLockfileEntry,\n type WellKnownLockfileEntry,\n} from \"./lockfile\";\n\n// Manifest types (pspm.json)\nexport {\n type AgentConfig,\n type BuiltInAgent,\n DEFAULT_SKILL_FILES,\n type ManifestDetectionResult,\n PSPM_SCHEMA_URL,\n type PspmManifest,\n type PspmManifestRequirements,\n validateManifest,\n} from \"./manifest\";\n// Resolver utilities\nexport {\n computeInstallOrder,\n type DependencyGraph,\n type DependencyNode,\n formatResolutionErrors,\n formatVersionConflicts,\n MAX_DEPENDENCY_DEPTH,\n printResolutionErrors,\n type ResolutionError,\n type ResolutionErrorType,\n type ResolutionResult,\n type ResolverConfig,\n resolveRecursive,\n topologicalSort,\n type VersionConflict,\n} from \"./resolver\";\n// Skill specifier parsing\nexport {\n formatGitHubSpecifier,\n type GitHubSpecifier,\n generateRegistryIdentifier,\n generateSkillIdentifier,\n getGitHubSkillName,\n getRegistrySkillName,\n isGitHubShorthand,\n isGitHubSpecifier,\n isGitHubUrl,\n isRegistrySpecifier,\n type NamespaceType,\n parseGitHubShorthand,\n parseGitHubSpecifier,\n parseGitHubUrl,\n parseRegistrySpecifier,\n parseSkillSpecifier,\n type RegistrySpecifier,\n type SkillSpecifier,\n} from \"./specifier\";\n// Version utilities\nexport {\n compareVersions,\n findHighestSatisfying,\n getLatestVersion,\n isNewerVersion,\n normalizeVersionRange,\n rangesIntersect,\n resolveVersion,\n versionSatisfies,\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 /** Human-readable name for display */\n displayName: string;\n /** Skills directory path (project-level, relative to project root) */\n skillsDir: string;\n /** Global skills directory path (relative to home directory) */\n globalSkillsDir: 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 adal: {\n displayName: \"AdaL\",\n skillsDir: \".adal/skills\",\n globalSkillsDir: \".adal/skills\",\n },\n amp: {\n displayName: \"Amp\",\n skillsDir: \".agents/skills\",\n globalSkillsDir: \".config/agents/skills\",\n },\n antigravity: {\n displayName: \"Antigravity\",\n skillsDir: \".agent/skills\",\n globalSkillsDir: \".gemini/antigravity/skills\",\n },\n augment: {\n displayName: \"Augment\",\n skillsDir: \".augment/skills\",\n globalSkillsDir: \".augment/skills\",\n },\n \"claude-code\": {\n displayName: \"Claude Code\",\n skillsDir: \".claude/skills\",\n globalSkillsDir: \".claude/skills\",\n },\n cline: {\n displayName: \"Cline\",\n skillsDir: \".agents/skills\",\n globalSkillsDir: \".agents/skills\",\n },\n codebuddy: {\n displayName: \"CodeBuddy\",\n skillsDir: \".codebuddy/skills\",\n globalSkillsDir: \".codebuddy/skills\",\n },\n codex: {\n displayName: \"Codex\",\n skillsDir: \".agents/skills\",\n globalSkillsDir: \".codex/skills\",\n },\n \"command-code\": {\n displayName: \"Command Code\",\n skillsDir: \".commandcode/skills\",\n globalSkillsDir: \".commandcode/skills\",\n },\n continue: {\n displayName: \"Continue\",\n skillsDir: \".continue/skills\",\n globalSkillsDir: \".continue/skills\",\n },\n cortex: {\n displayName: \"Cortex Code\",\n skillsDir: \".cortex/skills\",\n globalSkillsDir: \".snowflake/cortex/skills\",\n },\n crush: {\n displayName: \"Crush\",\n skillsDir: \".crush/skills\",\n globalSkillsDir: \".config/crush/skills\",\n },\n cursor: {\n displayName: \"Cursor\",\n skillsDir: \".agents/skills\",\n globalSkillsDir: \".cursor/skills\",\n },\n droid: {\n displayName: \"Droid\",\n skillsDir: \".factory/skills\",\n globalSkillsDir: \".factory/skills\",\n },\n \"gemini-cli\": {\n displayName: \"Gemini CLI\",\n skillsDir: \".agents/skills\",\n globalSkillsDir: \".gemini/skills\",\n },\n \"github-copilot\": {\n displayName: \"GitHub Copilot\",\n skillsDir: \".agents/skills\",\n globalSkillsDir: \".copilot/skills\",\n },\n goose: {\n displayName: \"Goose\",\n skillsDir: \".goose/skills\",\n globalSkillsDir: \".config/goose/skills\",\n },\n \"iflow-cli\": {\n displayName: \"iFlow CLI\",\n skillsDir: \".iflow/skills\",\n globalSkillsDir: \".iflow/skills\",\n },\n junie: {\n displayName: \"Junie\",\n skillsDir: \".junie/skills\",\n globalSkillsDir: \".junie/skills\",\n },\n kilo: {\n displayName: \"Kilo Code\",\n skillsDir: \".kilocode/skills\",\n globalSkillsDir: \".kilocode/skills\",\n },\n \"kimi-cli\": {\n displayName: \"Kimi Code CLI\",\n skillsDir: \".agents/skills\",\n globalSkillsDir: \".config/agents/skills\",\n },\n \"kiro-cli\": {\n displayName: \"Kiro CLI\",\n skillsDir: \".kiro/skills\",\n globalSkillsDir: \".kiro/skills\",\n },\n kode: {\n displayName: \"Kode\",\n skillsDir: \".kode/skills\",\n globalSkillsDir: \".kode/skills\",\n },\n mcpjam: {\n displayName: \"MCPJam\",\n skillsDir: \".mcpjam/skills\",\n globalSkillsDir: \".mcpjam/skills\",\n },\n \"mistral-vibe\": {\n displayName: \"Mistral Vibe\",\n skillsDir: \".vibe/skills\",\n globalSkillsDir: \".vibe/skills\",\n },\n mux: {\n displayName: \"Mux\",\n skillsDir: \".mux/skills\",\n globalSkillsDir: \".mux/skills\",\n },\n neovate: {\n displayName: \"Neovate\",\n skillsDir: \".neovate/skills\",\n globalSkillsDir: \".neovate/skills\",\n },\n openclaw: {\n displayName: \"OpenClaw\",\n skillsDir: \"skills\",\n globalSkillsDir: \".openclaw/skills\",\n },\n opencode: {\n displayName: \"OpenCode\",\n skillsDir: \".agents/skills\",\n globalSkillsDir: \".config/opencode/skills\",\n },\n openhands: {\n displayName: \"OpenHands\",\n skillsDir: \".openhands/skills\",\n globalSkillsDir: \".openhands/skills\",\n },\n pi: {\n displayName: \"Pi\",\n skillsDir: \".pi/skills\",\n globalSkillsDir: \".pi/agent/skills\",\n },\n pochi: {\n displayName: \"Pochi\",\n skillsDir: \".pochi/skills\",\n globalSkillsDir: \".pochi/skills\",\n },\n qoder: {\n displayName: \"Qoder\",\n skillsDir: \".qoder/skills\",\n globalSkillsDir: \".qoder/skills\",\n },\n \"qwen-code\": {\n displayName: \"Qwen Code\",\n skillsDir: \".qwen/skills\",\n globalSkillsDir: \".qwen/skills\",\n },\n replit: {\n displayName: \"Replit\",\n skillsDir: \".agents/skills\",\n globalSkillsDir: \".config/agents/skills\",\n },\n roo: {\n displayName: \"Roo Code\",\n skillsDir: \".roo/skills\",\n globalSkillsDir: \".roo/skills\",\n },\n trae: {\n displayName: \"Trae\",\n skillsDir: \".trae/skills\",\n globalSkillsDir: \".trae/skills\",\n },\n \"trae-cn\": {\n displayName: \"Trae CN\",\n skillsDir: \".trae/skills\",\n globalSkillsDir: \".trae-cn/skills\",\n },\n universal: {\n displayName: \"Universal\",\n skillsDir: \".agents/skills\",\n globalSkillsDir: \".config/agents/skills\",\n },\n windsurf: {\n displayName: \"Windsurf\",\n skillsDir: \".windsurf/skills\",\n globalSkillsDir: \".codeium/windsurf/skills\",\n },\n zencoder: {\n displayName: \"Zencoder\",\n skillsDir: \".zencoder/skills\",\n globalSkillsDir: \".zencoder/skills\",\n },\n};\n\n/**\n * Default agent configurations (AgentConfig format).\n */\nexport const DEFAULT_AGENT_CONFIGS: Record<BuiltInAgent, AgentConfig> =\n Object.fromEntries(\n Object.entries(AGENT_INFO).map(([key, info]) => [\n key,\n { skillsDir: info.skillsDir },\n ]),\n ) as Record<BuiltInAgent, AgentConfig>;\n\n/**\n * All built-in agent names in display order.\n */\nexport const ALL_AGENTS: BuiltInAgent[] = Object.keys(\n AGENT_INFO,\n).sort() as BuiltInAgent[];\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 * @param global - If true, return global paths instead of project paths\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(\"claude-code\", undefined, true)\n * // => { skillsDir: \".claude/skills\" } (global path, used relative to ~)\n *\n * resolveAgentConfig(\"my-custom\", { \"my-custom\": { skillsDir: \".myagent/prompts\" } })\n * // => { skillsDir: \".myagent/prompts\" }\n * ```\n */\nexport function resolveAgentConfig(\n name: string,\n overrides?: Record<string, AgentConfig>,\n global?: boolean,\n): AgentConfig | null {\n // Check overrides first (not applicable for global)\n if (!global && overrides?.[name]) {\n return overrides[name];\n }\n\n // Check built-in defaults\n if (name in AGENT_INFO) {\n const info = AGENT_INFO[name as BuiltInAgent];\n return {\n skillsDir: global ? info.globalSkillsDir : info.skillsDir,\n };\n }\n\n return 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 * // => [...ALL_AGENTS]\n * ```\n */\nexport function parseAgentArg(agentArg?: string): string[] {\n if (!agentArg) {\n return [...ALL_AGENTS];\n }\n\n if (agentArg === \"none\") {\n return [\"none\"];\n }\n\n return agentArg\n .split(\",\")\n .map((a) => a.trim())\n .filter(Boolean);\n}\n\n/**\n * Get all available agent names (built-in + custom).\n */\nexport function getAvailableAgents(\n overrides?: Record<string, AgentConfig>,\n): string[] {\n const builtIn = Object.keys(DEFAULT_AGENT_CONFIGS);\n const custom = overrides ? Object.keys(overrides) : [];\n return [...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 const choices = ALL_AGENTS.map((agent) => ({\n name: `${AGENT_INFO[agent].displayName} (${AGENT_INFO[agent].skillsDir})`,\n value: agent,\n checked: true, // All selected by default\n }));\n\n const selected = await checkbox({\n message: \"Select agents to install skills to\",\n choices,\n });\n\n if (selected.length === 0) {\n return [\"none\"];\n }\n\n return 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 /** Downloaded tarball as buffer */\n buffer: Buffer;\n /** Resolved commit SHA */\n commit: string;\n /** Integrity hash (sha256-...) */\n integrity: string;\n}\n\n/**\n * Error thrown when GitHub API rate limit is hit.\n */\nexport class GitHubRateLimitError extends Error {\n constructor() {\n super(\n \"GitHub API rate limit exceeded. Set GITHUB_TOKEN environment variable for higher limits.\",\n );\n this.name = \"GitHubRateLimitError\";\n }\n}\n\n/**\n * Error thrown when GitHub repository/ref is not found.\n */\nexport class GitHubNotFoundError extends Error {\n constructor(spec: GitHubSpecifier) {\n const path = spec.path ? `/${spec.path}` : \"\";\n const ref = spec.ref ? `@${spec.ref}` : \"\";\n super(\n `GitHub repository not found: ${spec.owner}/${spec.repo}${path}${ref}`,\n );\n this.name = \"GitHubNotFoundError\";\n }\n}\n\n/**\n * Error thrown when the specified path doesn't exist in the repository.\n */\nexport class GitHubPathNotFoundError extends Error {\n constructor(spec: GitHubSpecifier, availablePaths?: string[]) {\n const pathInfo = availablePaths?.length\n ? `\\nAvailable paths in repository root:\\n ${availablePaths.join(\"\\n \")}`\n : \"\";\n super(\n `Path \"${spec.path}\" not found in ${spec.owner}/${spec.repo}${pathInfo}`,\n );\n this.name = \"GitHubPathNotFoundError\";\n }\n}\n\n/**\n * Get GitHub API headers, including authentication if available.\n */\nfunction getGitHubHeaders(): Record<string, string> {\n const headers: Record<string, string> = {\n Accept: \"application/vnd.github+json\",\n \"X-GitHub-Api-Version\": \"2022-11-28\",\n \"User-Agent\": \"pspm-cli\",\n };\n\n const token = process.env.GITHUB_TOKEN;\n if (token) {\n headers.Authorization = `Bearer ${token}`;\n }\n\n return 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 owner: string,\n repo: string,\n ref?: string,\n): Promise<string> {\n const headers = getGitHubHeaders();\n\n // Use a local variable to avoid parameter reassignment\n let resolvedRef = ref;\n\n // If no ref specified, get the default branch first\n if (!resolvedRef || resolvedRef === \"latest\") {\n const repoUrl = `https://api.github.com/repos/${owner}/${repo}`;\n const repoResponse = await fetch(repoUrl, { headers });\n\n if (repoResponse.status === 404) {\n throw new GitHubNotFoundError({ owner, repo });\n }\n\n if (repoResponse.status === 403) {\n const remaining = repoResponse.headers.get(\"x-ratelimit-remaining\");\n if (remaining === \"0\") {\n throw new GitHubRateLimitError();\n }\n }\n\n if (!repoResponse.ok) {\n throw new Error(`GitHub API error: ${repoResponse.status}`);\n }\n\n const repoData = (await repoResponse.json()) as { default_branch: string };\n resolvedRef = repoData.default_branch;\n }\n\n // Get the commit SHA for the ref\n const commitUrl = `https://api.github.com/repos/${owner}/${repo}/commits/${resolvedRef}`;\n const commitResponse = await fetch(commitUrl, { headers });\n\n if (commitResponse.status === 404) {\n throw new GitHubNotFoundError({ owner, repo, ref });\n }\n\n if (commitResponse.status === 403) {\n const remaining = commitResponse.headers.get(\"x-ratelimit-remaining\");\n if (remaining === \"0\") {\n throw new GitHubRateLimitError();\n }\n }\n\n if (!commitResponse.ok) {\n throw new Error(`GitHub API error: ${commitResponse.status}`);\n }\n\n const commitData = (await commitResponse.json()) as { sha: string };\n return 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 spec: GitHubSpecifier,\n): Promise<GitHubDownloadResult> {\n const headers = getGitHubHeaders();\n\n // Resolve the ref to a commit SHA\n const commit = await resolveGitHubRef(spec.owner, spec.repo, spec.ref);\n\n // Download the tarball\n const tarballUrl = `https://api.github.com/repos/${spec.owner}/${spec.repo}/tarball/${commit}`;\n const response = await fetch(tarballUrl, {\n headers,\n redirect: \"follow\",\n });\n\n if (response.status === 404) {\n throw new GitHubNotFoundError(spec);\n }\n\n if (response.status === 403) {\n const remaining = response.headers.get(\"x-ratelimit-remaining\");\n if (remaining === \"0\") {\n throw new GitHubRateLimitError();\n }\n }\n\n if (!response.ok) {\n throw new Error(`Failed to download GitHub tarball: ${response.status}`);\n }\n\n const buffer = Buffer.from(await response.arrayBuffer());\n const integrity = calculateIntegrity(buffer);\n\n return { 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 spec: GitHubSpecifier,\n buffer: Buffer,\n skillsDir: string,\n): Promise<string> {\n // Determine destination path\n const destPath = spec.path\n ? join(skillsDir, \"_github\", spec.owner, spec.repo, spec.path)\n : join(skillsDir, \"_github\", spec.owner, spec.repo);\n\n // Create a temp directory for extraction\n const tempDir = join(skillsDir, \"_github\", \".temp\", `${Date.now()}`);\n await mkdir(tempDir, { recursive: true });\n\n const tempFile = join(tempDir, \"archive.tgz\");\n\n try {\n // Write tarball to temp file\n await writeFile(tempFile, buffer);\n\n // Extract tarball\n const { exec } = await import(\"node:child_process\");\n const { promisify } = await import(\"node:util\");\n const execAsync = promisify(exec);\n\n await execAsync(`tar -xzf \"${tempFile}\" -C \"${tempDir}\"`);\n\n // Find the extracted directory (GitHub tarballs have a top-level dir like \"owner-repo-sha\")\n const entries = await readdir(tempDir);\n const extractedDir = entries.find(\n (e) => e !== \"archive.tgz\" && !e.startsWith(\".\"),\n );\n\n if (!extractedDir) {\n throw new Error(\"Failed to find extracted directory in tarball\");\n }\n\n const sourcePath = join(tempDir, extractedDir);\n\n // Determine what to copy - either a subpath or the entire repo\n const copySource = spec.path ? join(sourcePath, spec.path) : sourcePath;\n\n // If a subpath is specified, verify it exists in the repo\n if (spec.path) {\n const pathExists = await lstat(copySource).catch(() => null);\n if (!pathExists) {\n // List available directories in repo root for helpful error message\n const rootEntries = await readdir(sourcePath);\n const dirs = [];\n for (const entry of rootEntries) {\n const stat = await lstat(join(sourcePath, entry)).catch(() => null);\n if (stat?.isDirectory() && !entry.startsWith(\".\")) {\n dirs.push(entry);\n }\n }\n throw new GitHubPathNotFoundError(spec, dirs);\n }\n }\n\n // Remove existing destination and create fresh\n await rm(destPath, { recursive: true, force: true });\n await mkdir(destPath, { recursive: true });\n\n // Copy the contents\n await cp(copySource, destPath, { recursive: true });\n\n // Return the relative path from project root\n return spec.path\n ? `.pspm/skills/_github/${spec.owner}/${spec.repo}/${spec.path}`\n : `.pspm/skills/_github/${spec.owner}/${spec.repo}`;\n } finally {\n // Clean up temp directory\n await rm(tempDir, { recursive: true, force: true });\n }\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 spec: GitHubSpecifier,\n commit?: string,\n): string {\n let name = `github:${spec.owner}/${spec.repo}`;\n if (spec.path) {\n name += `/${spec.path}`;\n }\n\n if (spec.ref || commit) {\n const ref = spec.ref || \"HEAD\";\n const shortCommit = commit ? commit.slice(0, 7) : \"\";\n name += ` (${ref}${shortCommit ? `@${shortCommit}` : \"\"})`;\n }\n\n return name;\n}\n","import { mkdir, readFile, stat, writeFile } from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\nimport {\n getLegacyLockfilePath,\n getLockfilePath,\n getRegistryUrl,\n} from \"./config\";\nimport {\n type GitHubLockfileEntry,\n type LocalLockfileEntry,\n PSPM_LOCKFILE_SCHEMA_URL,\n type PspmLockfile,\n type PspmLockfileEntry,\n type WellKnownLockfileEntry,\n} from \"./lib/index\";\n\n// Re-export types for backward compatibility\nexport type {\n GitHubLockfileEntry,\n LocalLockfileEntry,\n PspmLockfile,\n PspmLockfileEntry,\n WellKnownLockfileEntry,\n};\n\n/**\n * Check if legacy lockfile exists (skill-lock.json)\n */\nasync function hasLegacyLockfile(): Promise<boolean> {\n try {\n await stat(getLegacyLockfilePath());\n return true;\n } catch {\n return false;\n }\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 const legacyPath = getLegacyLockfilePath();\n const newPath = getLockfilePath();\n\n // Check if legacy exists and new doesn't\n try {\n await stat(legacyPath);\n } catch {\n // No legacy file, nothing to migrate\n return false;\n }\n\n try {\n await stat(newPath);\n // New file already exists, don't overwrite\n return false;\n } catch {\n // New file doesn't exist, migrate\n }\n\n try {\n const content = await readFile(legacyPath, \"utf-8\");\n const oldLockfile = JSON.parse(content) as PspmLockfile;\n\n // Convert v1 to v2 format\n const newLockfile: PspmLockfile = {\n lockfileVersion: 2,\n registryUrl: oldLockfile.registryUrl,\n packages: oldLockfile.skills ?? {},\n };\n\n await writeFile(newPath, `${JSON.stringify(newLockfile, null, 2)}\\n`);\n console.log(\"Migrated lockfile: skill-lock.json → pspm-lock.json\");\n\n // Keep the old file for safety (user can delete it)\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Read the lockfile, automatically checking for legacy format\n */\nexport async function readLockfile(): Promise<PspmLockfile | null> {\n const lockfilePath = getLockfilePath();\n\n try {\n const content = await readFile(lockfilePath, \"utf-8\");\n const lockfile = JSON.parse(content) as PspmLockfile;\n\n // Normalize v1 -> v2 in memory (skills -> packages)\n if (\n lockfile.lockfileVersion === 1 &&\n lockfile.skills &&\n !lockfile.packages\n ) {\n return {\n ...lockfile,\n lockfileVersion: 2,\n packages: lockfile.skills,\n };\n }\n\n return lockfile;\n } catch {\n // Try legacy path\n if (await hasLegacyLockfile()) {\n try {\n const content = await readFile(getLegacyLockfilePath(), \"utf-8\");\n const legacyLockfile = JSON.parse(content) as PspmLockfile;\n // Return normalized v2 format\n return {\n lockfileVersion: 2,\n registryUrl: legacyLockfile.registryUrl,\n packages: legacyLockfile.skills ?? {},\n };\n } catch {\n return null;\n }\n }\n return null;\n }\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 const lockfilePath = getLockfilePath();\n await mkdir(dirname(lockfilePath), { recursive: true });\n\n const packages = lockfile.packages ?? lockfile.skills ?? {};\n\n // Check if any package has dependencies to determine version\n const hasDependencies = Object.values(packages).some(\n (pkg) => pkg.dependencies && Object.keys(pkg.dependencies).length > 0,\n );\n const version = hasDependencies ? 4 : 3;\n\n const normalized: PspmLockfile = {\n $schema: PSPM_LOCKFILE_SCHEMA_URL,\n lockfileVersion: version,\n registryUrl: lockfile.registryUrl,\n packages,\n };\n\n // Only include githubPackages if there are entries\n if (\n lockfile.githubPackages &&\n Object.keys(lockfile.githubPackages).length > 0\n ) {\n normalized.githubPackages = lockfile.githubPackages;\n }\n\n // Only include localPackages if there are entries\n if (\n lockfile.localPackages &&\n Object.keys(lockfile.localPackages).length > 0\n ) {\n normalized.localPackages = lockfile.localPackages;\n }\n\n // Only include wellKnownPackages if there are entries\n if (\n lockfile.wellKnownPackages &&\n Object.keys(lockfile.wellKnownPackages).length > 0\n ) {\n normalized.wellKnownPackages = lockfile.wellKnownPackages;\n }\n\n await 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 const registryUrl = await getRegistryUrl();\n return {\n lockfileVersion: 4,\n registryUrl,\n packages: {},\n };\n}\n\n/**\n * Get packages from lockfile (handles both v1 and v2)\n */\nfunction getPackages(\n lockfile: PspmLockfile,\n): Record<string, PspmLockfileEntry> {\n return lockfile.packages ?? lockfile.skills ?? {};\n}\n\n/**\n * Add a skill to the lockfile\n */\nexport async function addToLockfile(\n fullName: string,\n entry: PspmLockfileEntry,\n): Promise<void> {\n let lockfile = await readLockfile();\n if (!lockfile) {\n lockfile = await createEmptyLockfile();\n }\n\n const packages = getPackages(lockfile);\n packages[fullName] = entry;\n lockfile.packages = packages;\n\n await writeLockfile(lockfile);\n}\n\n/**\n * Add a skill to the lockfile with dependencies (v4 format)\n */\nexport async function addToLockfileWithDeps(\n fullName: string,\n entry: PspmLockfileEntry,\n dependencies?: Record<string, string>,\n): Promise<void> {\n let lockfile = await readLockfile();\n if (!lockfile) {\n lockfile = await createEmptyLockfile();\n }\n\n const packages = getPackages(lockfile);\n const entryWithDeps = { ...entry };\n if (dependencies && Object.keys(dependencies).length > 0) {\n entryWithDeps.dependencies = dependencies;\n }\n packages[fullName] = entryWithDeps;\n lockfile.packages = packages;\n\n await writeLockfile(lockfile);\n}\n\n/**\n * Remove a skill from the lockfile\n */\nexport async function removeFromLockfile(fullName: string): Promise<boolean> {\n const lockfile = await readLockfile();\n if (!lockfile) {\n return false;\n }\n\n const packages = getPackages(lockfile);\n if (!packages[fullName]) {\n return false;\n }\n\n delete packages[fullName];\n lockfile.packages = packages;\n await writeLockfile(lockfile);\n return true;\n}\n\n/**\n * List all skills in the lockfile\n */\nexport async function listLockfileSkills(): Promise<\n Array<{ name: string; entry: PspmLockfileEntry }>\n> {\n const lockfile = await readLockfile();\n if (!lockfile) {\n return [];\n }\n\n const packages = getPackages(lockfile);\n return Object.entries(packages).map(([name, entry]) => ({\n name,\n entry: entry as PspmLockfileEntry,\n }));\n}\n\n// =============================================================================\n// GitHub Package Support\n// =============================================================================\n\n/**\n * Add a GitHub package to the lockfile\n */\nexport async function addGitHubToLockfile(\n specifier: string,\n entry: GitHubLockfileEntry,\n): Promise<void> {\n let lockfile = await readLockfile();\n if (!lockfile) {\n lockfile = await createEmptyLockfile();\n }\n\n if (!lockfile.githubPackages) {\n lockfile.githubPackages = {};\n }\n\n lockfile.githubPackages[specifier] = entry;\n await writeLockfile(lockfile);\n}\n\n/**\n * Remove a GitHub package from the lockfile\n */\nexport async function removeGitHubFromLockfile(\n specifier: string,\n): Promise<boolean> {\n const lockfile = await readLockfile();\n if (!lockfile?.githubPackages?.[specifier]) {\n return false;\n }\n\n delete lockfile.githubPackages[specifier];\n await writeLockfile(lockfile);\n return true;\n}\n\n/**\n * List all GitHub packages in the lockfile\n */\nexport async function listLockfileGitHubPackages(): Promise<\n Array<{ specifier: string; entry: GitHubLockfileEntry }>\n> {\n const lockfile = await readLockfile();\n if (!lockfile?.githubPackages) {\n return [];\n }\n\n return Object.entries(lockfile.githubPackages).map(([specifier, entry]) => ({\n specifier,\n entry: entry as GitHubLockfileEntry,\n }));\n}\n\n// =============================================================================\n// Local Package Support\n// =============================================================================\n\n/**\n * Add a local package to the lockfile\n */\nexport async function addLocalToLockfile(\n specifier: string,\n entry: LocalLockfileEntry,\n): Promise<void> {\n let lockfile = await readLockfile();\n if (!lockfile) {\n lockfile = await createEmptyLockfile();\n }\n\n if (!lockfile.localPackages) {\n lockfile.localPackages = {};\n }\n\n lockfile.localPackages[specifier] = entry;\n await writeLockfile(lockfile);\n}\n\n// =============================================================================\n// Well-Known Package Support\n// =============================================================================\n\n/**\n * Add a well-known package to the lockfile\n */\nexport async function addWellKnownToLockfile(\n specifier: string,\n entry: WellKnownLockfileEntry,\n): Promise<void> {\n let lockfile = await readLockfile();\n if (!lockfile) {\n lockfile = await createEmptyLockfile();\n }\n\n if (!lockfile.wellKnownPackages) {\n lockfile.wellKnownPackages = {};\n }\n\n lockfile.wellKnownPackages[specifier] = entry;\n await writeLockfile(lockfile);\n}\n\n/**\n * List all well-known packages in the lockfile\n */\nexport async function listLockfileWellKnownPackages(): Promise<\n Array<{ specifier: string; entry: WellKnownLockfileEntry }>\n> {\n const lockfile = await readLockfile();\n if (!lockfile?.wellKnownPackages) {\n return [];\n }\n\n return Object.entries(lockfile.wellKnownPackages).map(\n ([specifier, entry]) => ({\n specifier,\n entry: entry as WellKnownLockfileEntry,\n }),\n );\n}\n","import { readFile, writeFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { isGlobalMode } from \"./config\";\nimport type { PspmManifest } from \"./lib/index\";\n\n/**\n * Get the manifest file path\n * Global: ~/.pspm/pspm.json\n * Project: ./pspm.json\n */\nexport function getManifestPath(): string {\n if (isGlobalMode()) {\n return join(homedir(), \".pspm\", \"pspm.json\");\n }\n return 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 try {\n const content = await readFile(getManifestPath(), \"utf-8\");\n return JSON.parse(content) as PspmManifest;\n } catch {\n return null;\n }\n}\n\n/**\n * Write the manifest file (pspm.json)\n */\nexport async function writeManifest(manifest: PspmManifest): Promise<void> {\n const content = JSON.stringify(manifest, null, 2);\n await 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 return {\n dependencies: {},\n } 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 let manifest = await readManifest();\n\n if (!manifest) {\n manifest = await createMinimalManifest();\n await writeManifest(manifest);\n }\n\n return 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 skillName: string,\n versionRange: string,\n): Promise<void> {\n const manifest = await ensureManifest();\n\n // Initialize dependencies if not present\n if (!manifest.dependencies) {\n manifest.dependencies = {};\n }\n\n // Add or update the dependency\n manifest.dependencies[skillName] = versionRange;\n\n await 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 const manifest = await readManifest();\n\n if (!manifest?.dependencies?.[skillName]) {\n return false;\n }\n\n delete manifest.dependencies[skillName];\n await writeManifest(manifest);\n return 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 const manifest = await readManifest();\n return 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 const manifest = await readManifest();\n return 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 specifier: string,\n ref: string,\n): Promise<void> {\n const manifest = await ensureManifest();\n\n // Initialize githubDependencies if not present\n if (!manifest.githubDependencies) {\n manifest.githubDependencies = {};\n }\n\n // Add or update the dependency\n manifest.githubDependencies[specifier] = ref;\n\n await 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 specifier: string,\n): Promise<boolean> {\n const manifest = await readManifest();\n\n if (!manifest?.githubDependencies?.[specifier]) {\n return false;\n }\n\n delete manifest.githubDependencies[specifier];\n await writeManifest(manifest);\n return true;\n}\n\n// =============================================================================\n// Local Dependency Support\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 specifier: string,\n version = \"*\",\n): Promise<void> {\n const manifest = await ensureManifest();\n\n // Initialize localDependencies if not present\n if (!manifest.localDependencies) {\n manifest.localDependencies = {};\n }\n\n // Add or update the dependency\n manifest.localDependencies[specifier] = version;\n\n await writeManifest(manifest);\n}\n\n// =============================================================================\n// Well-Known Dependency Support\n// =============================================================================\n\n/**\n * Add a well-known dependency to the manifest\n *\n * @param baseUrl - The well-known base URL (e.g., \"https://acme.com\")\n * @param skillNames - Skill names to add (e.g., [\"code-review\"])\n */\nexport async function addWellKnownDependency(\n baseUrl: string,\n skillNames: string[],\n): Promise<void> {\n const manifest = await ensureManifest();\n\n if (!manifest.wellKnownDependencies) {\n manifest.wellKnownDependencies = {};\n }\n\n const existing = manifest.wellKnownDependencies[baseUrl];\n if (Array.isArray(existing)) {\n // Merge with existing, dedup\n const merged = [...new Set([...existing, ...skillNames])];\n manifest.wellKnownDependencies[baseUrl] = merged;\n } else {\n manifest.wellKnownDependencies[baseUrl] = skillNames;\n }\n\n await writeManifest(manifest);\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 /** Agent names to create symlinks for */\n agents: string[];\n /** Project root directory (or home directory for global installs) */\n projectRoot: string;\n /** Custom agent configuration overrides from pspm.json */\n agentConfigs?: Record<string, AgentConfig>;\n /** If true, use global agent paths (relative to home directory) */\n global?: boolean;\n}\n\n/**\n * Information about an installed skill for symlinking.\n */\nexport interface SkillInfo {\n /** Skill name (used as symlink name) */\n name: string;\n /** Path to skill within .pspm/skills/ (relative to project root) */\n sourcePath: 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 skills: SkillInfo[],\n options: CreateSymlinksOptions,\n): Promise<void> {\n const { agents, projectRoot, agentConfigs } = options;\n\n // Skip if \"none\" agent\n if (agents.length === 1 && agents[0] === \"none\") {\n return;\n }\n\n for (const agentName of agents) {\n const config = resolveAgentConfig(agentName, agentConfigs, options.global);\n\n if (!config) {\n console.warn(`Warning: Unknown agent \"${agentName}\", skipping symlinks`);\n continue;\n }\n\n const agentSkillsDir = join(projectRoot, config.skillsDir);\n\n // Create agent skills directory\n await mkdir(agentSkillsDir, { recursive: true });\n\n for (const skill of skills) {\n const symlinkPath = join(agentSkillsDir, skill.name);\n const targetPath = join(projectRoot, skill.sourcePath);\n\n // Calculate relative path from symlink location to target\n const relativeTarget = relative(dirname(symlinkPath), targetPath);\n\n await createSymlink(symlinkPath, relativeTarget, skill.name);\n }\n }\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 symlinkPath: string,\n target: string,\n skillName: string,\n): Promise<void> {\n try {\n // Check if something exists at the symlink path\n const stats = await lstat(symlinkPath).catch(() => null);\n\n if (stats) {\n if (stats.isSymbolicLink()) {\n // Check if it points to the correct target\n const existingTarget = await readlink(symlinkPath);\n if (existingTarget === target) {\n // Already correct, nothing to do\n return;\n }\n // Remove incorrect symlink\n await rm(symlinkPath);\n } else {\n // Regular file or directory exists - warn and skip\n console.warn(\n `Warning: File exists at symlink path for \"${skillName}\", skipping: ${symlinkPath}`,\n );\n return;\n }\n }\n\n // Create the symlink\n await symlink(target, symlinkPath);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.warn(\n `Warning: Failed to create symlink for \"${skillName}\": ${message}`,\n );\n }\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 skillName: string,\n options: CreateSymlinksOptions,\n): Promise<void> {\n const { agents, projectRoot, agentConfigs } = options;\n\n // Skip if \"none\" agent\n if (agents.length === 1 && agents[0] === \"none\") {\n return;\n }\n\n for (const agentName of agents) {\n const config = resolveAgentConfig(agentName, agentConfigs);\n\n if (!config) {\n continue;\n }\n\n const symlinkPath = join(projectRoot, config.skillsDir, skillName);\n\n try {\n const stats = await lstat(symlinkPath).catch(() => null);\n\n if (stats?.isSymbolicLink()) {\n await rm(symlinkPath);\n }\n } catch {\n // Ignore errors - symlink may not exist\n }\n }\n}\n\n/**\n * Get the source path for a registry skill within .pspm/skills/.\n *\n * @param ownerOrNamespace - Skill author username, or namespace prefix\n * @param skillNameOrOwner - Skill name (2-arg form) or owner (3-arg form)\n * @param skillName - Skill name (3-arg form only)\n * @returns Relative path from project root (e.g., \".pspm/skills/alice/my-skill\")\n */\nexport function getRegistrySkillPath(\n ownerOrNamespace: string,\n skillNameOrOwner: string,\n skillName?: string,\n): string {\n if (skillName !== undefined) {\n // 3-arg form: namespace, owner, skillName\n // e.g., (\"user\", \"alice\", \"my-skill\") -> \".pspm/skills/alice/my-skill\"\n // e.g., (\"org\", \"anyt\", \"code-review\") -> \".pspm/skills/_org/anyt/code-review\"\n // e.g., (\"github\", \"microsoft\", \"skills/azure-ai\") -> \".pspm/skills/_github-registry/microsoft/skills/azure-ai\"\n const namespace = ownerOrNamespace;\n const owner = skillNameOrOwner;\n if (namespace === \"org\") {\n return `.pspm/skills/_org/${owner}/${skillName}`;\n }\n if (namespace === \"github\") {\n // skillName contains \"repo/subname\" for @github namespace\n return `.pspm/skills/_github-registry/${owner}/${skillName}`;\n }\n // \"user\" namespace uses flat structure for backward compat\n return `.pspm/skills/${owner}/${skillName}`;\n }\n // 2-arg legacy form: username, skillName\n return `.pspm/skills/${ownerOrNamespace}/${skillNameOrOwner}`;\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 owner: string,\n repo: string,\n path?: string,\n): string {\n if (path) {\n return `.pspm/skills/_github/${owner}/${repo}/${path}`;\n }\n return `.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 return `.pspm/skills/_local/${skillName}`;\n}\n\n/**\n * Get the source path for a well-known skill within .pspm/skills/.\n *\n * @param hostname - Source hostname (e.g., \"acme.com\")\n * @param skillName - Skill name\n * @returns Relative path from project root (e.g., \".pspm/skills/_wellknown/acme.com/my-skill\")\n */\nexport function getWellKnownSkillPath(\n hostname: string,\n skillName: string,\n): string {\n return `.pspm/skills/_wellknown/${hostname}/${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 skillName: string,\n agents: string[],\n projectRoot: string,\n agentConfigs?: Record<string, AgentConfig>,\n): Promise<string[]> {\n const linkedAgents: string[] = [];\n\n for (const agentName of agents) {\n const config = resolveAgentConfig(agentName, agentConfigs);\n if (!config) continue;\n\n const symlinkPath = join(projectRoot, config.skillsDir, skillName);\n\n try {\n const stats = await lstat(symlinkPath);\n if (stats.isSymbolicLink()) {\n linkedAgents.push(agentName);\n }\n } catch {\n // Symlink doesn't exist\n }\n }\n\n return linkedAgents;\n}\n","/**\n * Well-Known Skills Discovery (RFC 8615)\n *\n * Fetches skills from any HTTPS domain that serves a\n * /.well-known/skills/index.json endpoint.\n */\n\nimport { mkdir, rm, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { calculateIntegrity } from \"./lib/index\";\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/**\n * A single skill entry in the well-known index.json\n */\nexport interface WellKnownSkillEntry {\n /** Skill identifier (directory name). Lowercase alphanumeric + hyphens, 1-64 chars. */\n name: string;\n /** Brief description */\n description: string;\n /** List of files in the skill directory. Must include SKILL.md. */\n files: string[];\n}\n\n/**\n * The /.well-known/skills/index.json structure\n */\nexport interface WellKnownIndex {\n skills: WellKnownSkillEntry[];\n}\n\n/**\n * A fetched well-known skill with all its file contents\n */\nexport interface WellKnownSkill {\n /** Skill name from index */\n name: string;\n /** Description from index */\n description: string;\n /** SKILL.md content */\n content: string;\n /** All files keyed by relative path */\n files: Map<string, string>;\n /** Source URL for this skill */\n sourceUrl: string;\n /** The index entry */\n indexEntry: WellKnownSkillEntry;\n}\n\n/**\n * Result of extracting a well-known skill to disk\n */\nexport interface WellKnownDownloadResult {\n /** All skills fetched from the endpoint */\n skills: WellKnownSkill[];\n /** The resolved base URL where the index was found */\n resolvedBaseUrl: string;\n /** Hostname for identification */\n hostname: string;\n}\n\n// =============================================================================\n// Constants\n// =============================================================================\n\nconst WELL_KNOWN_PATH = \".well-known/skills\";\nconst INDEX_FILE = \"index.json\";\nconst SKILL_NAME_PATTERN = /^[a-z0-9]([a-z0-9-]{0,62}[a-z0-9])?$/;\n\n/** Hosts that should NOT be treated as well-known (they have dedicated providers) */\nconst EXCLUDED_HOSTS = [\n \"github.com\",\n \"gitlab.com\",\n \"raw.githubusercontent.com\",\n];\n\n// =============================================================================\n// Detection\n// =============================================================================\n\n/**\n * Check if a string looks like a well-known skills URL.\n * Must be HTTP(S) and not a known git host.\n */\nexport function isWellKnownSpecifier(input: string): boolean {\n if (!input.startsWith(\"http://\") && !input.startsWith(\"https://\")) {\n return false;\n }\n\n try {\n const parsed = new URL(input);\n if (EXCLUDED_HOSTS.includes(parsed.hostname)) {\n return false;\n }\n if (input.endsWith(\".git\")) {\n return false;\n }\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Extract hostname from a well-known URL (strips www. prefix).\n */\nexport function getWellKnownHostname(url: string): string {\n try {\n const parsed = new URL(url);\n return parsed.hostname.replace(/^www\\./, \"\");\n } catch {\n return url;\n }\n}\n\n// =============================================================================\n// Validation\n// =============================================================================\n\n/**\n * Validate a single skill entry from the index.\n */\nfunction isValidSkillEntry(entry: unknown): entry is WellKnownSkillEntry {\n if (!entry || typeof entry !== \"object\") return false;\n\n const e = entry as Record<string, unknown>;\n\n // Required string fields\n if (typeof e.name !== \"string\" || e.name.length === 0) return false;\n if (typeof e.description !== \"string\" || e.description.length === 0)\n return false;\n\n // Name must match pattern\n if (!SKILL_NAME_PATTERN.test(e.name)) return false;\n\n // Files must be a non-empty array of strings\n if (!Array.isArray(e.files) || e.files.length === 0) return false;\n\n let hasSkillMd = false;\n for (const file of e.files) {\n if (typeof file !== \"string\") return false;\n // No absolute paths\n if (file.startsWith(\"/\") || file.startsWith(\"\\\\\")) return false;\n // No path traversal\n if (file.includes(\"..\")) return false;\n // Check for SKILL.md\n if (file.toLowerCase() === \"skill.md\") hasSkillMd = true;\n }\n\n if (!hasSkillMd) return false;\n\n return true;\n}\n\n/**\n * Validate a well-known index structure.\n */\nfunction isValidIndex(data: unknown): data is WellKnownIndex {\n if (!data || typeof data !== \"object\") return false;\n const d = data as Record<string, unknown>;\n if (!Array.isArray(d.skills)) return false;\n return d.skills.every(isValidSkillEntry);\n}\n\n// =============================================================================\n// Fetching\n// =============================================================================\n\n/**\n * Fetch the well-known index from a URL.\n *\n * Tries path-relative first, then root:\n * 1. {baseUrl}/.well-known/skills/index.json\n * 2. {protocol}://{host}/.well-known/skills/index.json\n */\nexport async function fetchWellKnownIndex(\n baseUrl: string,\n): Promise<{ index: WellKnownIndex; resolvedBaseUrl: string } | null> {\n const parsed = new URL(baseUrl);\n\n // Try 1: path-relative\n const pathRelativeUrl = `${baseUrl.replace(/\\/$/, \"\")}/${WELL_KNOWN_PATH}/${INDEX_FILE}`;\n const pathRelativeBase = `${baseUrl.replace(/\\/$/, \"\")}/${WELL_KNOWN_PATH}`;\n\n try {\n const response = await fetch(pathRelativeUrl, {\n signal: AbortSignal.timeout(10000),\n });\n if (response.ok) {\n const data = await response.json();\n if (isValidIndex(data)) {\n return { index: data, resolvedBaseUrl: pathRelativeBase };\n }\n }\n } catch {\n // Try next\n }\n\n // Try 2: root well-known (skip if URL has no path)\n const rootUrl = `${parsed.protocol}//${parsed.host}/${WELL_KNOWN_PATH}/${INDEX_FILE}`;\n const rootBase = `${parsed.protocol}//${parsed.host}/${WELL_KNOWN_PATH}`;\n\n // Avoid duplicate request if path-relative already tried the root\n if (rootUrl !== pathRelativeUrl) {\n try {\n const response = await fetch(rootUrl, {\n signal: AbortSignal.timeout(10000),\n });\n if (response.ok) {\n const data = await response.json();\n if (isValidIndex(data)) {\n return { index: data, resolvedBaseUrl: rootBase };\n }\n }\n } catch {\n // No index found\n }\n }\n\n return null;\n}\n\n/**\n * Fetch a single skill's files from a well-known endpoint.\n */\nasync function fetchSkillFiles(\n baseUrl: string,\n entry: WellKnownSkillEntry,\n): Promise<WellKnownSkill | null> {\n const skillBaseUrl = `${baseUrl}/${entry.name}`;\n const files = new Map<string, string>();\n let skillMdContent = \"\";\n\n // Fetch all files in parallel\n const results = await Promise.allSettled(\n entry.files.map(async (filePath) => {\n const fileUrl = `${skillBaseUrl}/${filePath}`;\n const response = await fetch(fileUrl, {\n signal: AbortSignal.timeout(10000),\n });\n if (!response.ok) {\n throw new Error(`Failed to fetch ${fileUrl}: ${response.status}`);\n }\n const content = await response.text();\n return { filePath, content };\n }),\n );\n\n for (const result of results) {\n if (result.status === \"fulfilled\") {\n files.set(result.value.filePath, result.value.content);\n if (result.value.filePath.toLowerCase() === \"skill.md\") {\n skillMdContent = result.value.content;\n }\n }\n // Skip failed files (non-fatal except SKILL.md)\n }\n\n // SKILL.md is required\n if (!skillMdContent) {\n return null;\n }\n\n return {\n name: entry.name,\n description: entry.description,\n content: skillMdContent,\n files,\n sourceUrl: `${skillBaseUrl}/SKILL.md`,\n indexEntry: entry,\n };\n}\n\n/**\n * Fetch all skills from a well-known endpoint.\n */\nexport async function fetchWellKnownSkills(\n url: string,\n): Promise<WellKnownDownloadResult | null> {\n const result = await fetchWellKnownIndex(url);\n if (!result) return null;\n\n const { index, resolvedBaseUrl } = result;\n const hostname = getWellKnownHostname(url);\n\n // Fetch all skills in parallel\n const skillResults = await Promise.allSettled(\n index.skills.map((entry) => fetchSkillFiles(resolvedBaseUrl, entry)),\n );\n\n const skills: WellKnownSkill[] = [];\n for (const r of skillResults) {\n if (r.status === \"fulfilled\" && r.value) {\n skills.push(r.value);\n }\n }\n\n if (skills.length === 0) return null;\n\n return { skills, resolvedBaseUrl, hostname };\n}\n\n// =============================================================================\n// Extraction\n// =============================================================================\n\n/**\n * Extract a well-known skill to the .pspm/skills/_wellknown/ directory.\n *\n * @param skill - The fetched skill\n * @param hostname - Source hostname (for directory namespacing)\n * @param skillsDir - Base skills directory (.pspm/skills)\n * @returns Path to extracted skill (relative to project root)\n */\nexport async function extractWellKnownSkill(\n skill: WellKnownSkill,\n hostname: string,\n skillsDir: string,\n): Promise<string> {\n const destPath = join(skillsDir, \"_wellknown\", hostname, skill.name);\n\n // Clean and recreate\n await rm(destPath, { recursive: true, force: true });\n await mkdir(destPath, { recursive: true });\n\n // Write all files\n for (const [filePath, content] of skill.files) {\n // Security: validate path doesn't escape\n const fullPath = join(destPath, filePath);\n if (!fullPath.startsWith(destPath)) {\n continue; // Skip files that would escape the directory\n }\n\n // Create parent directories\n const { dirname } = await import(\"node:path\");\n await mkdir(dirname(fullPath), { recursive: true });\n await writeFile(fullPath, content, \"utf-8\");\n }\n\n return `.pspm/skills/_wellknown/${hostname}/${skill.name}`;\n}\n\n/**\n * Calculate integrity hash for a well-known skill (hash of all file contents).\n */\nexport function calculateWellKnownIntegrity(skill: WellKnownSkill): string {\n // Sort files by path for deterministic hashing\n const sortedEntries = [...skill.files.entries()].sort(([a], [b]) =>\n a.localeCompare(b),\n );\n const combined = sortedEntries\n .map(([path, content]) => `${path}:${content}`)\n .join(\"\\n\");\n return calculateIntegrity(Buffer.from(combined, \"utf-8\"));\n}\n\n/**\n * Get display name for a well-known skill.\n */\nexport function getWellKnownDisplayName(\n hostname: string,\n skillName: string,\n): string {\n return `${hostname}/${skillName} (well-known)`;\n}\n","import { mkdir, rm, stat, symlink } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { basename, dirname, join, relative, resolve } from \"node:path\";\nimport { parseAgentArg, promptForAgents } from \"@/agents\";\nimport {\n configure,\n getGithubSkillVersion,\n getSkillVersion,\n listGithubSkillVersions,\n listSkillVersions,\n} from \"@/api-client\";\nimport {\n getSkillsDir,\n getTokenForRegistry,\n isGlobalMode,\n resolveConfig,\n setGlobalMode,\n} from \"@/config\";\nimport { extractApiErrorMessage } from \"@/errors\";\nimport {\n downloadGitHubPackage,\n extractGitHubPackage,\n getGitHubDisplayName,\n} from \"@/github\";\nimport {\n calculateIntegrity,\n type DependencyNode,\n formatGitHubSpecifier,\n type GitHubLockfileEntry,\n generateRegistryIdentifier,\n getGitHubSkillName,\n isGitHubShorthand,\n isGitHubSpecifier,\n isGitHubUrl,\n isRegistrySpecifier,\n type LocalLockfileEntry,\n MAX_DEPENDENCY_DEPTH,\n type NamespaceType,\n parseGitHubShorthand,\n parseGitHubSpecifier,\n parseGitHubUrl,\n parseRegistrySpecifier,\n printResolutionErrors,\n resolveRecursive,\n resolveVersion,\n type WellKnownLockfileEntry,\n} from \"@/lib/index\";\nimport {\n addGitHubToLockfile,\n addLocalToLockfile,\n addToLockfileWithDeps,\n addWellKnownToLockfile,\n} from \"@/lockfile\";\nimport {\n addDependency,\n addGitHubDependency,\n addLocalDependency,\n addWellKnownDependency,\n readManifest,\n} from \"@/manifest\";\nimport {\n createAgentSymlinks,\n getGitHubSkillPath,\n getLocalSkillPath,\n getRegistrySkillPath,\n getWellKnownSkillPath,\n type SkillInfo,\n} from \"@/symlinks\";\nimport {\n calculateWellKnownIntegrity,\n extractWellKnownSkill,\n fetchWellKnownSkills,\n getWellKnownDisplayName,\n getWellKnownHostname,\n isWellKnownSpecifier,\n type WellKnownSkill,\n} from \"@/wellknown\";\n\n/**\n * Check if a specifier is a local file reference\n */\nfunction isLocalSpecifier(specifier: string): boolean {\n return (\n specifier.startsWith(\"file:\") ||\n specifier.startsWith(\"./\") ||\n specifier.startsWith(\"../\")\n );\n}\n\n/**\n * Parse a local specifier and return the path\n */\nfunction parseLocalPath(specifier: string): string {\n if (specifier.startsWith(\"file:\")) {\n return specifier.slice(5); // Remove \"file:\" prefix\n }\n return specifier;\n}\n\n/**\n * Normalize a path to a file: specifier\n */\nfunction normalizeToFileSpecifier(path: string): string {\n if (path.startsWith(\"file:\")) {\n return path;\n }\n return `file:${path}`;\n}\n\nexport interface AddOptions {\n save?: boolean;\n agent?: string;\n yes?: boolean;\n /** Install globally (to ~/.pspm/ with global agent paths) */\n global?: boolean;\n}\n\n/** Resolved package info from validation phase */\ninterface ResolvedRegistryPackage {\n type: \"registry\";\n specifier: string;\n namespace: NamespaceType;\n owner: string;\n name: string;\n /** Skill name within repo (only for @github namespace) */\n subname?: string;\n versionRange: string | undefined;\n resolvedVersion: string;\n versionInfo: {\n downloadUrl: string;\n checksum: string;\n };\n}\n\ninterface ResolvedGitHubPackage {\n type: \"github\";\n specifier: string;\n parsed: ReturnType<typeof parseGitHubSpecifier> & object;\n ref: string;\n downloadResult: {\n buffer: Buffer;\n commit: string;\n integrity: string;\n };\n}\n\ninterface ResolvedLocalPackage {\n type: \"local\";\n /** Original specifier (e.g., \"file:../my-skill\" or \"../my-skill\") */\n specifier: string;\n /** Normalized specifier with file: prefix */\n normalizedSpecifier: string;\n /** Original path from specifier */\n path: string;\n /** Resolved absolute path */\n resolvedPath: string;\n /** Skill name (last segment of path) */\n name: string;\n}\n\ninterface ResolvedWellKnownPackage {\n type: \"wellknown\";\n specifier: string;\n hostname: string;\n skills: WellKnownSkill[];\n resolvedBaseUrl: string;\n}\n\ntype ResolvedPackage =\n | ResolvedRegistryPackage\n | ResolvedGitHubPackage\n | ResolvedLocalPackage\n | ResolvedWellKnownPackage;\n\nexport async function add(\n specifiers: string[],\n options: AddOptions,\n): Promise<void> {\n // Set up global mode if requested\n if (options.global) {\n setGlobalMode(true);\n console.log(\"Installing globally to ~/.pspm/\\n\");\n }\n\n // Phase 1: Validate and resolve all packages first\n console.log(\"Resolving packages...\\n\");\n\n const resolvedPackages: ResolvedPackage[] = [];\n const validationErrors: { specifier: string; error: string }[] = [];\n\n for (const specifier of specifiers) {\n try {\n if (isLocalSpecifier(specifier)) {\n const resolved = await validateLocalPackage(specifier);\n resolvedPackages.push(resolved);\n } else if (\n isGitHubSpecifier(specifier) ||\n isGitHubUrl(specifier) ||\n isGitHubShorthand(specifier)\n ) {\n const resolved = await validateGitHubPackage(specifier);\n resolvedPackages.push(resolved);\n } else if (isWellKnownSpecifier(specifier)) {\n const resolved = await validateWellKnownPackage(specifier);\n resolvedPackages.push(resolved);\n } else if (isRegistrySpecifier(specifier)) {\n const resolved = await validateRegistryPackage(specifier);\n resolvedPackages.push(resolved);\n } else {\n throw new Error(\n `Unknown specifier format \"${specifier}\". Supported formats:\\n` +\n ` @user/{username}/{name}[@version] (registry)\\n` +\n ` @org/{orgname}/{name}[@version] (organization)\\n` +\n ` github:owner/repo[/path][@ref] (github)\\n` +\n ` file:./path/to/skill (local)\\n` +\n ` owner/repo (github shorthand)`,\n );\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n validationErrors.push({ specifier, error: message });\n console.error(`Failed to resolve ${specifier}: ${message}\\n`);\n }\n }\n\n // If all packages failed validation, exit early\n if (resolvedPackages.length === 0) {\n console.error(\"No packages could be resolved.\");\n process.exit(1);\n }\n\n // Show validation summary if there were failures\n if (validationErrors.length > 0) {\n console.log(\n `Resolved ${resolvedPackages.length} of ${specifiers.length} packages.\\n`,\n );\n }\n\n // Phase 2: Resolve recursive dependencies for registry packages\n const config = await resolveConfig();\n const apiKey = getTokenForRegistry(config, config.registryUrl);\n\n // Build root deps from validated registry packages\n const registryPackages = resolvedPackages.filter(\n (p): p is ResolvedRegistryPackage => p.type === \"registry\",\n );\n const githubPackages = resolvedPackages.filter(\n (p): p is ResolvedGitHubPackage => p.type === \"github\",\n );\n const localPackages = resolvedPackages.filter(\n (p): p is ResolvedLocalPackage => p.type === \"local\",\n );\n const wellKnownPackages = resolvedPackages.filter(\n (p): p is ResolvedWellKnownPackage => p.type === \"wellknown\",\n );\n\n let resolutionResult: Awaited<ReturnType<typeof resolveRecursive>> | null =\n null;\n\n if (registryPackages.length > 0) {\n const rootDeps: Record<string, string> = {};\n for (const pkg of registryPackages) {\n const fullName = generateRegistryIdentifier({\n namespace: pkg.namespace,\n owner: pkg.owner,\n name: pkg.name,\n subname: pkg.subname,\n });\n rootDeps[fullName] = pkg.versionRange || `^${pkg.resolvedVersion}`;\n }\n\n // Resolve recursively\n console.log(\"Resolving dependencies...\");\n resolutionResult = await resolveRecursive(rootDeps, {\n maxDepth: MAX_DEPENDENCY_DEPTH,\n registryUrl: config.registryUrl,\n apiKey,\n });\n\n // Handle resolution errors\n if (!resolutionResult.success) {\n printResolutionErrors(\n resolutionResult.graph.errors,\n resolutionResult.graph.conflicts,\n );\n process.exit(1);\n }\n\n const transitiveDeps = resolutionResult.installOrder.filter(\n (name) => !rootDeps[name],\n );\n if (transitiveDeps.length > 0) {\n console.log(\n `Resolved ${transitiveDeps.length} transitive dependencies.\\n`,\n );\n } else {\n console.log();\n }\n }\n\n // Phase 3: Determine which agents to use (after validation)\n let agents: string[];\n const manifest = await readManifest();\n\n if (options.agent) {\n // If --agent flag is provided, use it\n agents = parseAgentArg(options.agent);\n } else if (manifest) {\n // If pspm.json exists, use default agent (respect manifest's agent config)\n agents = parseAgentArg(undefined);\n } else if (options.yes) {\n // If -y flag is used, use default agent without prompting\n agents = parseAgentArg(undefined);\n } else {\n // No pspm.json exists, prompt user to select agents\n console.log(\"No pspm.json found. Let's set up your project.\\n\");\n agents = await promptForAgents();\n console.log(); // Add newline after selection\n }\n\n // Phase 4: Install all resolved packages\n const results: { specifier: string; success: boolean; error?: string }[] = [];\n\n // Install registry packages in topological order (dependencies first)\n if (resolutionResult) {\n for (const name of resolutionResult.installOrder) {\n const node = resolutionResult.graph.nodes.get(name);\n if (!node) continue;\n\n try {\n await installFromNode(node, {\n ...options,\n resolvedAgents: agents,\n isDirect: node.isDirect,\n });\n results.push({ specifier: name, success: true });\n } catch (error) {\n const message =\n error instanceof Error ? error.message : \"Unknown error\";\n results.push({\n specifier: name,\n success: false,\n error: message,\n });\n console.error(`Failed to install ${name}: ${message}\\n`);\n }\n }\n }\n\n // Install GitHub packages (no recursive resolution for now)\n for (const resolved of githubPackages) {\n try {\n await installGitHubPackage(resolved, {\n ...options,\n resolvedAgents: agents,\n });\n results.push({ specifier: resolved.specifier, success: true });\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n results.push({\n specifier: resolved.specifier,\n success: false,\n error: message,\n });\n console.error(`Failed to install ${resolved.specifier}: ${message}\\n`);\n }\n }\n\n // Install local packages (symlink to local directory)\n for (const resolved of localPackages) {\n try {\n await installLocalPackage(resolved, {\n ...options,\n resolvedAgents: agents,\n });\n results.push({ specifier: resolved.specifier, success: true });\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n results.push({\n specifier: resolved.specifier,\n success: false,\n error: message,\n });\n console.error(`Failed to install ${resolved.specifier}: ${message}\\n`);\n }\n }\n\n // Install well-known packages (fetch from HTTPS domains)\n for (const resolved of wellKnownPackages) {\n try {\n await installWellKnownPackage(resolved, {\n ...options,\n resolvedAgents: agents,\n });\n results.push({ specifier: resolved.specifier, success: true });\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n results.push({\n specifier: resolved.specifier,\n success: false,\n error: message,\n });\n console.error(`Failed to install ${resolved.specifier}: ${message}\\n`);\n }\n }\n\n // Print summary if multiple packages were requested\n if (specifiers.length > 1) {\n const succeeded = results.filter((r) => r.success).length;\n const failed =\n results.filter((r) => !r.success).length + validationErrors.length;\n console.log(`\\nSummary: ${succeeded} added, ${failed} failed`);\n\n if (failed > 0) {\n process.exit(1);\n }\n }\n}\n\ninterface InternalAddOptions extends AddOptions {\n resolvedAgents: string[];\n}\n\n/**\n * Get the root directory for symlink creation.\n * Global: home directory. Project: current working directory.\n */\nfunction getSymlinkRoot(): string {\n return isGlobalMode() ? homedir() : process.cwd();\n}\n\ninterface InternalAddOptionsWithDirect extends InternalAddOptions {\n /** Whether this is a direct dependency (from command line) */\n isDirect: boolean;\n}\n\n/**\n * Install a package from a DependencyNode (resolved from resolver)\n */\nasync function installFromNode(\n node: DependencyNode,\n options: InternalAddOptionsWithDirect,\n): Promise<void> {\n // Parse package name\n const parsed = parseRegistrySpecifier(node.name);\n if (!parsed) {\n throw new Error(`Invalid package name: ${node.name}`);\n }\n const { namespace, owner, name, subname } = parsed;\n\n console.log(`Installing ${node.name}@${node.version}...`);\n\n // Get config for download\n const config = await resolveConfig();\n const apiKey = getTokenForRegistry(config, config.registryUrl);\n\n // Download the tarball\n const isPresignedUrl =\n node.downloadUrl.includes(\".r2.cloudflarestorage.com\") ||\n node.downloadUrl.includes(\"X-Amz-Signature\");\n\n const downloadHeaders: Record<string, string> = {};\n if (!isPresignedUrl && apiKey) {\n downloadHeaders.Authorization = `Bearer ${apiKey}`;\n }\n\n const tarballResponse = await fetch(node.downloadUrl, {\n headers: downloadHeaders,\n redirect: \"follow\",\n });\n\n if (!tarballResponse.ok) {\n throw new Error(`Failed to download tarball (${tarballResponse.status})`);\n }\n\n const tarballBuffer = Buffer.from(await tarballResponse.arrayBuffer());\n\n // Calculate integrity\n const integrity = calculateIntegrity(tarballBuffer);\n\n // Verify checksum matches\n if (integrity !== node.integrity) {\n throw new Error(\"Checksum verification failed\");\n }\n\n // Create skills directory\n const skillsDir = getSkillsDir();\n const effectiveSkillName = subname ?? name;\n let destDir: string;\n if (namespace === \"org\") {\n destDir = join(skillsDir, \"_org\", owner, effectiveSkillName);\n } else if (namespace === \"github\" && subname) {\n destDir = join(skillsDir, \"_github-registry\", owner, name, subname);\n } else {\n destDir = join(skillsDir, owner, effectiveSkillName);\n }\n await mkdir(destDir, { recursive: true });\n\n // Extract tarball\n const { writeFile } = await import(\"node:fs/promises\");\n const tempFile = join(destDir, \".temp.tgz\");\n await writeFile(tempFile, tarballBuffer);\n\n const { exec } = await import(\"node:child_process\");\n const { promisify } = await import(\"node:util\");\n const execAsync = promisify(exec);\n\n try {\n // Clear destination and extract\n await rm(destDir, { recursive: true, force: true });\n await mkdir(destDir, { recursive: true });\n await writeFile(tempFile, tarballBuffer);\n await execAsync(\n `tar -xzf \"${tempFile}\" -C \"${destDir}\" --strip-components=1`,\n );\n } finally {\n await rm(tempFile, { force: true });\n }\n\n // Update lockfile with dependencies\n // Convert dependencies to resolved version format\n const resolvedDeps: Record<string, string> = {};\n for (const [depName, _range] of Object.entries(node.dependencies)) {\n // The resolver already resolved the version, but we need to look it up\n // from the graph. For now, store the range; install.ts will use resolved versions\n resolvedDeps[depName] = _range;\n }\n\n await addToLockfileWithDeps(\n node.name,\n {\n version: node.version,\n resolved: node.downloadUrl,\n integrity,\n deprecated: node.deprecated,\n },\n Object.keys(resolvedDeps).length > 0 ? resolvedDeps : undefined,\n );\n\n // Only add direct dependencies to pspm.json\n if (options.isDirect) {\n const dependencyRange = node.versionRange || `^${node.version}`;\n await addDependency(node.name, dependencyRange);\n }\n\n // Create agent symlinks\n const agents = options.resolvedAgents;\n if (agents[0] !== \"none\") {\n const skillManifest = await readManifest();\n // For @github, pass \"repo/subname\" as the skillName arg so the path is correct\n const pathSkillName =\n namespace === \"github\" && subname ? `${name}/${subname}` : name;\n const skillInfo: SkillInfo = {\n name: effectiveSkillName,\n sourcePath: getRegistrySkillPath(namespace, owner, pathSkillName),\n };\n\n await createAgentSymlinks([skillInfo], {\n agents,\n projectRoot: getSymlinkRoot(),\n agentConfigs: skillManifest?.agents,\n global: isGlobalMode(),\n });\n }\n\n console.log(`Installed ${node.name}@${node.version}`);\n console.log(`Location: ${destDir}`);\n}\n\n/**\n * Validate and resolve a registry package (without downloading)\n */\nasync function validateRegistryPackage(\n specifier: string,\n): Promise<ResolvedRegistryPackage> {\n // Get config - auth may be optional for public packages\n const config = await resolveConfig();\n const registryUrl = config.registryUrl;\n const apiKey = getTokenForRegistry(config, registryUrl);\n\n // Parse the specifier\n const parsed = parseRegistrySpecifier(specifier);\n if (!parsed) {\n throw new Error(\n `Invalid skill specifier \"${specifier}\". Use format: @user/{username}/{name}[@{version}] or @org/{orgname}/{name}[@{version}]`,\n );\n }\n\n const { namespace, owner, name, subname, versionRange } = parsed;\n const fullName = generateRegistryIdentifier({\n namespace,\n owner,\n name,\n subname,\n });\n\n // Configure SDK - apiKey may be undefined for public packages\n configure({ registryUrl, apiKey });\n\n console.log(`Resolving ${specifier}...`);\n\n // Get available versions — use @github API for github namespace\n let versions: { version: string }[];\n if (namespace === \"github\" && subname) {\n const versionsResponse = await listGithubSkillVersions(\n owner,\n name,\n subname,\n );\n if (versionsResponse.status !== 200 || !versionsResponse.data) {\n if (versionsResponse.status === 401) {\n throw new Error(\n apiKey\n ? `Access denied to ${fullName}. You may not have permission to access this private package.`\n : `Package ${fullName} requires authentication. Please run 'pspm login' to authenticate`,\n );\n }\n throw new Error(versionsResponse.error || `Skill ${fullName} not found`);\n }\n versions = versionsResponse.data;\n } else {\n const versionsResponse = await listSkillVersions(owner, name);\n if (versionsResponse.status !== 200) {\n if (versionsResponse.status === 401) {\n if (!apiKey) {\n throw new Error(\n `Package ${fullName} requires authentication. Please run 'pspm login' to authenticate`,\n );\n }\n throw new Error(\n `Access denied to ${fullName}. You may not have permission to access this private package.`,\n );\n }\n const errorMessage = extractApiErrorMessage(\n versionsResponse,\n `Skill ${fullName} not found`,\n );\n throw new Error(errorMessage);\n }\n versions = versionsResponse.data;\n }\n if (versions.length === 0) {\n throw new Error(`Skill ${fullName} not found`);\n }\n\n // Resolve version\n const versionStrings = versions.map((v: { version: string }) => v.version);\n const resolvedVersion = resolveVersion(versionRange || \"*\", versionStrings);\n\n if (!resolvedVersion) {\n throw new Error(\n `No version matching \"${versionRange || \"latest\"}\" found for ${fullName}. Available versions: ${versionStrings.join(\", \")}`,\n );\n }\n\n // Get version details with download URL — use @github API for github namespace\n let downloadUrl: string;\n let checksum: string;\n if (namespace === \"github\" && subname) {\n const versionResponse = await getGithubSkillVersion(\n owner,\n name,\n subname,\n resolvedVersion,\n );\n if (versionResponse.status !== 200 || !versionResponse.data) {\n throw new Error(`Version ${resolvedVersion} not found for ${fullName}`);\n }\n downloadUrl = versionResponse.data.downloadUrl;\n checksum = versionResponse.data.checksum;\n } else {\n const versionResponse = await getSkillVersion(owner, name, resolvedVersion);\n if (versionResponse.status !== 200 || !versionResponse.data) {\n const errorMessage = extractApiErrorMessage(\n versionResponse,\n `Version ${resolvedVersion} not found`,\n );\n throw new Error(errorMessage);\n }\n downloadUrl = versionResponse.data.downloadUrl;\n checksum = versionResponse.data.checksum;\n }\n\n console.log(`Resolved ${fullName}@${resolvedVersion}`);\n\n return {\n type: \"registry\",\n specifier,\n namespace,\n owner,\n name,\n subname,\n versionRange,\n resolvedVersion,\n versionInfo: { downloadUrl, checksum },\n };\n}\n\n/**\n * Parse any GitHub input format into a GitHubSpecifier.\n *\n * Accepts:\n * - github:owner/repo[/path][@ref] (canonical prefix format)\n * - https://github.com/owner/repo (full URL)\n * - https://github.com/owner/repo/tree/branch/path (tree URL)\n * - owner/repo[/path] (shorthand)\n */\nfunction parseAnyGitHubFormat(\n specifier: string,\n): ReturnType<typeof parseGitHubSpecifier> {\n // Try canonical github: prefix first\n if (isGitHubSpecifier(specifier)) {\n return parseGitHubSpecifier(specifier);\n }\n\n // Try GitHub URL (https://github.com/...)\n if (isGitHubUrl(specifier)) {\n return parseGitHubUrl(specifier);\n }\n\n // Try shorthand (owner/repo[/path])\n if (isGitHubShorthand(specifier)) {\n return parseGitHubShorthand(specifier);\n }\n\n return null;\n}\n\n/**\n * Validate and download a GitHub package\n */\nasync function validateGitHubPackage(\n specifier: string,\n): Promise<ResolvedGitHubPackage> {\n const parsed = parseAnyGitHubFormat(specifier);\n if (!parsed) {\n throw new Error(\n `Invalid GitHub specifier \"${specifier}\". Supported formats:\\n` +\n ` github:owner/repo[/path][@ref]\\n` +\n ` https://github.com/owner/repo[/tree/branch/path]\\n` +\n ` owner/repo[/path]`,\n );\n }\n\n const ref = parsed.ref || \"HEAD\";\n console.log(`Resolving ${getGitHubDisplayName(parsed)}...`);\n\n // Download from GitHub (also validates existence)\n const result = await downloadGitHubPackage(parsed);\n\n console.log(`Resolved ${specifier} (${ref}@${result.commit.slice(0, 7)})`);\n\n return {\n type: \"github\",\n specifier,\n parsed,\n ref,\n downloadResult: result,\n };\n}\n\n/**\n * Install a pre-validated GitHub package\n */\nasync function installGitHubPackage(\n resolved: ResolvedGitHubPackage,\n options: InternalAddOptions,\n): Promise<void> {\n const { specifier, parsed, ref, downloadResult } = resolved;\n\n console.log(\n `Installing ${specifier} (${ref}@${downloadResult.commit.slice(0, 7)})...`,\n );\n\n // Extract to skills directory\n const skillsDir = getSkillsDir();\n const destPath = await extractGitHubPackage(\n parsed,\n downloadResult.buffer,\n skillsDir,\n );\n\n // Add to lockfile\n const lockfileSpecifier = formatGitHubSpecifier({\n owner: parsed.owner,\n repo: parsed.repo,\n path: parsed.path,\n // Don't include ref in the specifier key, it's stored in gitRef\n });\n\n const entry: GitHubLockfileEntry = {\n version: downloadResult.commit.slice(0, 7),\n resolved: `https://github.com/${parsed.owner}/${parsed.repo}`,\n integrity: downloadResult.integrity,\n gitCommit: downloadResult.commit,\n gitRef: ref,\n };\n\n await addGitHubToLockfile(lockfileSpecifier, entry);\n\n // Add to pspm.json githubDependencies\n await addGitHubDependency(lockfileSpecifier, ref);\n\n // Create agent symlinks\n const agents = options.resolvedAgents;\n if (agents[0] !== \"none\") {\n const manifest = await readManifest();\n const skillName = getGitHubSkillName(parsed);\n const skillInfo: SkillInfo = {\n name: skillName,\n sourcePath: getGitHubSkillPath(parsed.owner, parsed.repo, parsed.path),\n };\n\n await createAgentSymlinks([skillInfo], {\n agents,\n projectRoot: getSymlinkRoot(),\n agentConfigs: manifest?.agents,\n global: isGlobalMode(),\n });\n }\n\n console.log(\n `Installed ${specifier} (${ref}@${downloadResult.commit.slice(0, 7)})`,\n );\n console.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 specifier: string,\n): Promise<ResolvedLocalPackage> {\n const path = parseLocalPath(specifier);\n const resolvedPath = resolve(process.cwd(), path);\n const normalizedSpecifier = normalizeToFileSpecifier(path);\n\n console.log(`Resolving ${specifier}...`);\n\n // Check if directory exists\n try {\n const stats = await stat(resolvedPath);\n if (!stats.isDirectory()) {\n throw new Error(`Path is not a directory: ${resolvedPath}`);\n }\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n throw new Error(\n `Directory not found: ${resolvedPath}\\n Check that the path exists and is accessible.`,\n );\n }\n throw error;\n }\n\n // Check for SKILL.md or pspm.json\n let hasSkillMd = false;\n let hasPspmJson = false;\n\n try {\n await stat(join(resolvedPath, \"SKILL.md\"));\n hasSkillMd = true;\n } catch {\n // SKILL.md not found\n }\n\n try {\n await stat(join(resolvedPath, \"pspm.json\"));\n hasPspmJson = true;\n } catch {\n // pspm.json not found\n }\n\n if (!hasSkillMd && !hasPspmJson) {\n throw new Error(\n `Not a valid skill directory: ${resolvedPath}\\n Missing both SKILL.md and pspm.json. At least one is required.`,\n );\n }\n\n // Get skill name from the last segment of the path\n const name = basename(resolvedPath);\n\n console.log(`Resolved ${specifier} -> ${resolvedPath}`);\n\n return {\n type: \"local\",\n specifier,\n normalizedSpecifier,\n path,\n resolvedPath,\n name,\n };\n}\n\n/**\n * Install a local package by creating a symlink\n */\nasync function installLocalPackage(\n resolved: ResolvedLocalPackage,\n options: InternalAddOptions,\n): Promise<void> {\n const { specifier, normalizedSpecifier, path, resolvedPath, name } = resolved;\n\n console.log(`Installing ${specifier}...`);\n\n // Create .pspm/skills/_local directory\n const skillsDir = getSkillsDir();\n const localSkillsDir = join(skillsDir, \"_local\");\n await mkdir(localSkillsDir, { recursive: true });\n\n // Create symlink from .pspm/skills/_local/{name} -> resolved path\n const symlinkPath = join(localSkillsDir, name);\n\n // Calculate relative path from symlink location to target\n const relativeTarget = relative(dirname(symlinkPath), resolvedPath);\n\n // Remove existing symlink if it exists\n try {\n await rm(symlinkPath, { force: true });\n } catch {\n // Ignore errors\n }\n\n // Create the symlink\n await symlink(relativeTarget, symlinkPath);\n\n // Add to lockfile\n const entry: LocalLockfileEntry = {\n version: \"local\",\n path,\n resolvedPath,\n name,\n };\n await addLocalToLockfile(normalizedSpecifier, entry);\n\n // Add to pspm.json localDependencies\n await addLocalDependency(normalizedSpecifier);\n\n // Create agent symlinks\n const agents = options.resolvedAgents;\n if (agents[0] !== \"none\") {\n const manifest = await readManifest();\n const skillInfo: SkillInfo = {\n name,\n sourcePath: getLocalSkillPath(name),\n };\n\n await createAgentSymlinks([skillInfo], {\n agents,\n projectRoot: getSymlinkRoot(),\n agentConfigs: manifest?.agents,\n global: isGlobalMode(),\n });\n }\n\n console.log(`Installed ${specifier} (local)`);\n console.log(`Location: ${symlinkPath} -> ${resolvedPath}`);\n}\n\n// =============================================================================\n// Well-Known Package Support\n// =============================================================================\n\n/**\n * Validate and fetch skills from a well-known endpoint\n */\nasync function validateWellKnownPackage(\n specifier: string,\n): Promise<ResolvedWellKnownPackage> {\n const hostname = getWellKnownHostname(specifier);\n console.log(`Discovering skills from ${hostname}...`);\n\n const result = await fetchWellKnownSkills(specifier);\n if (!result) {\n throw new Error(\n `No well-known skills found at ${specifier}\\n Expected: ${specifier}/.well-known/skills/index.json`,\n );\n }\n\n console.log(\n `Found ${result.skills.length} skill(s) from ${hostname}: ${result.skills.map((s) => s.name).join(\", \")}`,\n );\n\n return {\n type: \"wellknown\",\n specifier,\n hostname: result.hostname,\n skills: result.skills,\n resolvedBaseUrl: result.resolvedBaseUrl,\n };\n}\n\n/**\n * Install pre-validated well-known skills\n */\nasync function installWellKnownPackage(\n resolved: ResolvedWellKnownPackage,\n options: InternalAddOptions,\n): Promise<void> {\n const { specifier, hostname, skills } = resolved;\n const skillsDir = getSkillsDir();\n\n for (const skill of skills) {\n console.log(\n `Installing ${getWellKnownDisplayName(hostname, skill.name)}...`,\n );\n\n // Extract to .pspm/skills/_wellknown/{hostname}/{skill-name}/\n const destPath = await extractWellKnownSkill(skill, hostname, skillsDir);\n\n // Calculate integrity hash\n const integrity = calculateWellKnownIntegrity(skill);\n\n // Add to lockfile\n const lockfileKey = `${specifier}#${skill.name}`;\n const entry: WellKnownLockfileEntry = {\n version: \"well-known\",\n resolved: skill.sourceUrl,\n integrity,\n hostname,\n name: skill.name,\n files: [...skill.files.keys()],\n };\n await addWellKnownToLockfile(lockfileKey, entry);\n\n // Add to pspm.json wellKnownDependencies\n await addWellKnownDependency(specifier, [skill.name]);\n\n // Create agent symlinks\n const agents = options.resolvedAgents;\n if (agents[0] !== \"none\") {\n const manifest = await readManifest();\n const skillInfo: SkillInfo = {\n name: skill.name,\n sourcePath: getWellKnownSkillPath(hostname, skill.name),\n };\n\n await createAgentSymlinks([skillInfo], {\n agents,\n projectRoot: process.cwd(),\n agentConfigs: manifest?.agents,\n });\n }\n\n console.log(`Installed ${getWellKnownDisplayName(hostname, skill.name)}`);\n console.log(`Location: ${destPath}`);\n }\n}\n","import { changeSkillAccess, configure } from \"@/api-client\";\nimport { getRegistryUrl, requireApiKey, resolveConfig } from \"@/config\";\nimport {\n isGitHubSpecifier,\n parseGitHubSpecifier,\n parseRegistrySpecifier,\n} from \"@/lib/index\";\n\n/** Check if specifier is a local file reference */\nfunction isLocalSpecifier(specifier: string): boolean {\n return (\n specifier.startsWith(\"file:\") ||\n specifier.startsWith(\"./\") ||\n specifier.startsWith(\"../\")\n );\n}\n\nexport interface AccessOptions {\n public?: boolean;\n private?: 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 specifier: string | undefined,\n options: AccessOptions,\n): Promise<void> {\n try {\n const apiKey = await requireApiKey();\n const registryUrl = await getRegistryUrl();\n\n // Determine visibility from options\n if (options.public && options.private) {\n console.error(\"Error: Cannot specify both --public and --private\");\n process.exit(1);\n }\n\n if (!options.public && !options.private) {\n console.error(\"Error: Must specify either --public or --private\");\n process.exit(1);\n }\n\n const visibility = options.public ? \"public\" : \"private\";\n\n // Parse package name - either from specifier or from current directory's pspm.json\n let packageName: string;\n let packageUsername: string | undefined;\n\n if (specifier) {\n // Check for GitHub specifiers - not supported for access command\n if (isGitHubSpecifier(specifier)) {\n const ghSpec = parseGitHubSpecifier(specifier);\n if (ghSpec) {\n console.error(`Error: Cannot change visibility of GitHub packages.`);\n console.error(\n ` \"${specifier}\" is hosted on GitHub, not the PSPM registry.`,\n );\n console.error(\n ` Visibility can only be changed for packages published to the registry.`,\n );\n } else {\n console.error(`Error: Invalid GitHub specifier \"${specifier}\".`);\n console.error(` Use format: github:{owner}/{repo}[/{path}][@{ref}]`);\n }\n process.exit(1);\n }\n\n // Check for local file specifiers - not supported for access command\n if (isLocalSpecifier(specifier)) {\n console.error(`Error: Cannot change visibility of local packages.`);\n console.error(\n ` \"${specifier}\" is a local directory, not a registry package.`,\n );\n console.error(\n ` Visibility can only be changed for packages published to the registry.`,\n );\n process.exit(1);\n }\n\n // Parse as registry specifier\n const parsed = parseRegistrySpecifier(specifier);\n if (!parsed) {\n console.error(`Error: Invalid package specifier \"${specifier}\".`);\n console.error(\n ` Use format: @user/{username}/{name} or @org/{orgname}/{name}`,\n );\n console.error(``);\n console.error(` Examples:`);\n console.error(` pspm access @user/myname/my-skill --public`);\n console.error(\n ` pspm access --public (uses current directory's pspm.json)`,\n );\n process.exit(1);\n }\n packageName = parsed.name;\n packageUsername = parsed.owner;\n } else {\n // Read from current directory's pspm.json or package.json\n const { readFile } = await import(\"node:fs/promises\");\n const { join } = await import(\"node:path\");\n\n let manifest: { name: string } | null = null;\n\n // Try pspm.json first\n try {\n const content = await readFile(\n join(process.cwd(), \"pspm.json\"),\n \"utf-8\",\n );\n manifest = JSON.parse(content);\n } catch {\n // Try package.json\n try {\n const content = await readFile(\n join(process.cwd(), \"package.json\"),\n \"utf-8\",\n );\n manifest = JSON.parse(content);\n } catch {\n console.error(\n \"Error: No pspm.json or package.json found in current directory\",\n );\n console.error(\n \"Either run this command in a package directory or specify a package name\",\n );\n process.exit(1);\n }\n }\n\n if (!manifest?.name) {\n console.error(\"Error: Package manifest is missing 'name' field\");\n process.exit(1);\n }\n\n packageName = manifest.name;\n }\n\n // If username not from specifier, get from config\n if (!packageUsername) {\n const config = await resolveConfig();\n packageUsername = config.username;\n }\n\n if (!packageUsername) {\n console.error(\n \"Error: Could not determine username. Please use the full specifier: @user/{username}/{name}\",\n );\n process.exit(1);\n }\n\n // Configure SDK and make API call\n configure({ registryUrl, apiKey });\n\n console.log(`Setting ${packageName} to ${visibility}...`);\n\n const response = await changeSkillAccess(packageUsername, packageName, {\n visibility,\n });\n\n if (response.status !== 200 || !response.data) {\n const errorMessage = response.error ?? \"Failed to change visibility\";\n console.error(`Error: ${errorMessage}`);\n process.exit(1);\n }\n\n const result = response.data;\n console.log(\n `+ @${(result as any).namespace ?? \"user\"}/${result.username}/${result.name} is now ${result.visibility}`,\n );\n\n if (visibility === \"public\") {\n console.log(\"\");\n console.log(\n \"Note: This action is irreversible. Public packages cannot be made private.\",\n );\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n console.error(`Error: ${message}`);\n process.exit(1);\n }\n}\n","export { type AccessOptions, access } from \"./access\";\nexport { type AddOptions, add } from \"./add\";\nexport { type AuditOptions, audit } from \"./audit\";\nexport {\n type ConfigInitOptions,\n configInit,\n configShow,\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 SearchOptions, search } from \"./search\";\nexport { type UnpublishOptions, unpublish } from \"./unpublish\";\nexport { type UpdateOptions, update } from \"./update\";\nexport { upgrade } from \"./upgrade\";\nexport { type VersionBump, type VersionOptions, version } from \"./version\";\nexport { whoami } from \"./whoami\";\n","/**\n * Audit command - Verify integrity of installed skills and check for issues.\n *\n * Checks:\n * 1. Integrity verification: re-hash installed files and compare with lockfile\n * 2. Deprecated packages: flag any deprecated versions\n * 3. Missing packages: flag packages in lockfile but not on disk\n */\n\nimport { stat } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { getSkillsDir } from \"@/config\";\nimport { parseGitHubSpecifier, type WellKnownLockfileEntry } from \"@/lib/index\";\nimport {\n listLockfileGitHubPackages,\n listLockfileSkills,\n listLockfileWellKnownPackages,\n readLockfile,\n} from \"@/lockfile\";\n\nexport interface AuditOptions {\n /** Output as JSON */\n json?: boolean;\n}\n\ninterface AuditIssue {\n name: string;\n source: \"registry\" | \"github\" | \"well-known\";\n severity: \"error\" | \"warning\" | \"info\";\n type: \"integrity\" | \"deprecated\" | \"missing\" | \"no-lockfile\";\n message: string;\n}\n\nexport async function audit(options: AuditOptions): Promise<void> {\n try {\n const lockfile = await readLockfile();\n\n if (!lockfile) {\n if (options.json) {\n console.log(\n JSON.stringify({\n ok: false,\n issues: [\n {\n name: \"-\",\n source: \"-\",\n severity: \"error\",\n type: \"no-lockfile\",\n message: \"No lockfile found. Run 'pspm install' first.\",\n },\n ],\n }),\n );\n } else {\n console.error(\"No lockfile found. Run 'pspm install' to create one.\");\n }\n process.exit(1);\n }\n\n const issues: AuditIssue[] = [];\n const skillsDir = getSkillsDir();\n const projectRoot = process.cwd();\n\n if (!options.json) {\n console.log(\"Auditing installed skills...\\n\");\n }\n\n // =================================================================\n // Check registry packages\n // =================================================================\n const registrySkills = await listLockfileSkills();\n\n for (const { name: fullName, entry } of registrySkills) {\n const match = fullName.match(/^@user\\/([^/]+)\\/([^/]+)$/);\n if (!match) continue;\n\n const [, username, skillName] = match;\n const destDir = join(projectRoot, skillsDir, username, skillName);\n\n // Check if installed on disk\n const exists = await pathExists(destDir);\n if (!exists) {\n issues.push({\n name: fullName,\n source: \"registry\",\n severity: \"error\",\n type: \"missing\",\n message: `Not installed on disk. Run 'pspm install' to restore.`,\n });\n continue;\n }\n\n // Check for deprecation\n if (entry.deprecated) {\n issues.push({\n name: fullName,\n source: \"registry\",\n severity: \"warning\",\n type: \"deprecated\",\n message: `Deprecated: ${entry.deprecated}`,\n });\n }\n\n // Verify tarball integrity would require re-downloading;\n // instead check that the installed directory exists and has SKILL.md\n const skillMdExists = await pathExists(join(destDir, \"SKILL.md\"));\n if (!skillMdExists) {\n issues.push({\n name: fullName,\n source: \"registry\",\n severity: \"warning\",\n type: \"integrity\",\n message:\n \"Missing SKILL.md in installed directory. Package may be corrupted.\",\n });\n }\n }\n\n // =================================================================\n // Check GitHub packages\n // =================================================================\n const githubSkills = await listLockfileGitHubPackages();\n\n for (const { specifier } of githubSkills) {\n const parsed = parseGitHubSpecifier(specifier);\n if (!parsed) continue;\n\n const destDir = parsed.path\n ? join(\n projectRoot,\n skillsDir,\n \"_github\",\n parsed.owner,\n parsed.repo,\n parsed.path,\n )\n : join(projectRoot, skillsDir, \"_github\", parsed.owner, parsed.repo);\n\n const exists = await pathExists(destDir);\n if (!exists) {\n issues.push({\n name: specifier,\n source: \"github\",\n severity: \"error\",\n type: \"missing\",\n message: `Not installed on disk. Run 'pspm install' to restore.`,\n });\n continue;\n }\n\n // Check SKILL.md exists\n const skillMdExists = await pathExists(join(destDir, \"SKILL.md\"));\n if (!skillMdExists) {\n issues.push({\n name: specifier,\n source: \"github\",\n severity: \"warning\",\n type: \"integrity\",\n message:\n \"Missing SKILL.md in installed directory. Package may be corrupted.\",\n });\n }\n }\n\n // =================================================================\n // Check well-known packages\n // =================================================================\n const wellKnownSkills = await listLockfileWellKnownPackages();\n\n for (const { specifier, entry } of wellKnownSkills) {\n const wkEntry = entry as WellKnownLockfileEntry;\n const destDir = join(\n projectRoot,\n skillsDir,\n \"_wellknown\",\n wkEntry.hostname,\n wkEntry.name,\n );\n\n const exists = await pathExists(destDir);\n if (!exists) {\n issues.push({\n name: specifier,\n source: \"well-known\",\n severity: \"error\",\n type: \"missing\",\n message: `Not installed on disk. Run 'pspm install' to restore.`,\n });\n continue;\n }\n\n // Verify SKILL.md exists\n const skillMdExists = await pathExists(join(destDir, \"SKILL.md\"));\n if (!skillMdExists) {\n issues.push({\n name: specifier,\n source: \"well-known\",\n severity: \"warning\",\n type: \"integrity\",\n message:\n \"Missing SKILL.md in installed directory. Package may be corrupted.\",\n });\n }\n }\n\n // =================================================================\n // Report results\n // =================================================================\n const errorCount = issues.filter((i) => i.severity === \"error\").length;\n const warningCount = issues.filter((i) => i.severity === \"warning\").length;\n\n if (options.json) {\n console.log(\n JSON.stringify(\n {\n ok: errorCount === 0,\n totalPackages:\n registrySkills.length +\n githubSkills.length +\n wellKnownSkills.length,\n issues,\n },\n null,\n 2,\n ),\n );\n if (errorCount > 0) process.exit(1);\n return;\n }\n\n if (issues.length === 0) {\n const totalPackages =\n registrySkills.length + githubSkills.length + wellKnownSkills.length;\n console.log(`Audited ${totalPackages} package(s). No issues found.`);\n return;\n }\n\n // Print issues grouped by severity\n const errors = issues.filter((i) => i.severity === \"error\");\n const warnings = issues.filter((i) => i.severity === \"warning\");\n\n if (errors.length > 0) {\n console.log(\"Errors:\");\n for (const issue of errors) {\n console.log(\n ` [${issue.type.toUpperCase()}] ${issue.name} (${issue.source})`,\n );\n console.log(` ${issue.message}`);\n }\n console.log();\n }\n\n if (warnings.length > 0) {\n console.log(\"Warnings:\");\n for (const issue of warnings) {\n console.log(\n ` [${issue.type.toUpperCase()}] ${issue.name} (${issue.source})`,\n );\n console.log(` ${issue.message}`);\n }\n console.log();\n }\n\n const totalPackages =\n registrySkills.length + githubSkills.length + wellKnownSkills.length;\n console.log(\n `Audited ${totalPackages} package(s): ${errorCount} error(s), ${warningCount} warning(s).`,\n );\n\n if (errorCount > 0) {\n process.exit(1);\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n console.error(`Error: ${message}`);\n process.exit(1);\n }\n}\n\nasync function pathExists(path: string): Promise<boolean> {\n try {\n await stat(path);\n return true;\n } catch {\n return false;\n }\n}\n","import { stat, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\nexport interface ConfigInitOptions {\n registry?: 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 try {\n const configPath = join(process.cwd(), \".pspmrc\");\n\n // Check if file already exists\n try {\n await stat(configPath);\n console.error(\"Error: .pspmrc already exists in this directory.\");\n process.exit(1);\n } catch {\n // File doesn't exist, good\n }\n\n // Build INI content\n const lines: string[] = [\"; Project-specific PSPM configuration\", \"\"];\n\n if (options.registry) {\n lines.push(`registry = ${options.registry}`);\n } else {\n lines.push(\"; Uncomment to use a custom registry:\");\n lines.push(\"; registry = https://custom-registry.example.com\");\n }\n\n lines.push(\"\");\n\n // Write the file\n await writeFile(configPath, lines.join(\"\\n\"));\n\n console.log(\"Created .pspmrc\");\n console.log(\"\");\n console.log(\"Contents:\");\n console.log(lines.join(\"\\n\"));\n console.log(\"Note: .pspmrc should be committed to version control.\");\n console.log(\"API keys should NOT be stored here - use pspm login instead.\");\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n console.error(`Error: ${message}`);\n process.exit(1);\n }\n}\n","import { findProjectConfig, getConfigPath, resolveConfig } from \"@/config\";\n\n/**\n * Show resolved configuration\n */\nexport async function configShow(): Promise<void> {\n try {\n const resolved = await resolveConfig();\n const projectConfig = await findProjectConfig();\n const configPath = getConfigPath();\n\n console.log(\"Resolved Configuration:\\n\");\n console.log(` Registry URL: ${resolved.registryUrl}`);\n console.log(` API Key: ${resolved.apiKey ? \"***\" : \"(not set)\"}`);\n console.log(` Username: ${resolved.username || \"(not set)\"}`);\n console.log(\"\");\n console.log(\"Config Locations:\");\n console.log(` User config: ${configPath}`);\n console.log(` Project config: ${projectConfig ? \".pspmrc\" : \"(none)\"}`);\n console.log(\"\");\n console.log(\"Environment Variables:\");\n console.log(\n ` PSPM_REGISTRY_URL: ${process.env.PSPM_REGISTRY_URL || \"(not set)\"}`,\n );\n console.log(\n ` PSPM_API_KEY: ${process.env.PSPM_API_KEY ? \"***\" : \"(not set)\"}`,\n );\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n console.error(`Error: ${message}`);\n process.exit(1);\n }\n}\n","import {\n configure,\n deprecateSkillVersion,\n undeprecateSkillVersion,\n} from \"@/api-client\";\nimport { getRegistryUrl, requireApiKey } from \"@/config\";\nimport {\n generateRegistryIdentifier,\n parseRegistrySpecifier,\n} from \"@/lib/index\";\n\nexport interface DeprecateOptions {\n undo?: 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 specifier: string,\n message: string | undefined,\n options: DeprecateOptions,\n): Promise<void> {\n try {\n const apiKey = await requireApiKey();\n const registryUrl = await getRegistryUrl();\n\n // Parse the specifier\n const parsed = parseRegistrySpecifier(specifier);\n if (!parsed) {\n console.error(\n `Error: Invalid skill specifier \"${specifier}\". Use format: @user/{username}/{name}@{version} or @org/{orgname}/{name}@{version}`,\n );\n process.exit(1);\n }\n\n const { owner, name, versionRange } = parsed;\n const fullName = generateRegistryIdentifier({\n namespace: parsed.namespace,\n owner,\n name,\n });\n\n if (!versionRange) {\n console.error(\n \"Error: Version is required for deprecation. Use format: @user/{username}/{name}@{version}\",\n );\n process.exit(1);\n }\n\n // Configure SDK\n configure({ registryUrl, apiKey });\n\n if (options.undo) {\n // Remove deprecation\n console.log(`Removing deprecation from ${fullName}@${versionRange}...`);\n\n const response = await undeprecateSkillVersion(owner, name, versionRange);\n if (response.status !== 200) {\n console.error(\n `Error: ${response.error || \"Failed to remove deprecation\"}`,\n );\n process.exit(1);\n }\n\n console.log(`Removed deprecation from ${fullName}@${versionRange}`);\n } else {\n // Add deprecation\n if (!message) {\n console.error(\n \"Error: Deprecation message is required. Usage: pspm deprecate <specifier> <message>\",\n );\n process.exit(1);\n }\n\n console.log(`Deprecating ${fullName}@${versionRange}...`);\n\n const response = await deprecateSkillVersion(\n owner,\n name,\n versionRange,\n message,\n );\n if (response.status !== 200) {\n console.error(\n `Error: ${response.error || \"Failed to deprecate version\"}`,\n );\n process.exit(1);\n }\n\n console.log(`Deprecated ${fullName}@${versionRange}`);\n console.log(`Message: ${message}`);\n console.log(\"\");\n console.log(\n \"Users installing this version will see a deprecation warning.\",\n );\n console.log(\"The package is still available for download.\");\n }\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : \"Unknown error\";\n console.error(`Error: ${errorMessage}`);\n process.exit(1);\n }\n}\n","import { readFile, stat, writeFile } from \"node:fs/promises\";\nimport { basename, join } from \"node:path\";\nimport { createInterface } from \"node:readline\";\nimport {\n DEFAULT_SKILL_FILES,\n PSPM_SCHEMA_URL,\n type PspmManifest,\n} from \"@/lib/index\";\n\nexport interface InitOptions {\n name?: string;\n description?: string;\n author?: string;\n yes?: boolean;\n force?: boolean;\n}\n\n/**\n * Simple readline prompt that mimics npm's style\n */\nfunction prompt(\n rl: ReturnType<typeof createInterface>,\n question: string,\n defaultValue: string,\n): Promise<string> {\n return new Promise((resolve) => {\n const displayDefault = defaultValue ? ` (${defaultValue})` : \"\";\n rl.question(`${question}${displayDefault} `, (answer) => {\n resolve(answer.trim() || defaultValue);\n });\n });\n}\n\n/**\n * Try to read existing package.json to extract some defaults\n */\nasync function readExistingPackageJson(): Promise<Partial<PspmManifest> | null> {\n try {\n const content = await readFile(\n join(process.cwd(), \"package.json\"),\n \"utf-8\",\n );\n const pkg = JSON.parse(content);\n return {\n name: pkg.name,\n version: pkg.version,\n description: pkg.description,\n author: typeof pkg.author === \"string\" ? pkg.author : pkg.author?.name,\n license: pkg.license,\n };\n } catch {\n return null;\n }\n}\n\n/**\n * Try to detect author from git config\n */\nasync function getGitAuthor(): Promise<string | null> {\n try {\n const { exec } = await import(\"node:child_process\");\n const { promisify } = await import(\"node:util\");\n const execAsync = promisify(exec);\n\n const [nameResult, emailResult] = await Promise.all([\n execAsync(\"git config user.name\").catch(() => ({ stdout: \"\" })),\n execAsync(\"git config user.email\").catch(() => ({ stdout: \"\" })),\n ]);\n\n const name = nameResult.stdout.trim();\n const email = emailResult.stdout.trim();\n\n if (name && email) {\n return `${name} <${email}>`;\n }\n if (name) {\n return name;\n }\n return null;\n } catch {\n return null;\n }\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 // Remove npm scope if present (e.g., @user/package -> package)\n const withoutScope = name.replace(/^@[^/]+\\//, \"\");\n // Lowercase and replace invalid chars\n return withoutScope\n .toLowerCase()\n .replace(/[^a-z0-9_-]/g, \"-\")\n .replace(/^-+|-+$/g, \"\")\n .replace(/-+/g, \"-\");\n}\n\n/**\n * Validate skill name format\n */\nfunction isValidName(name: string): boolean {\n return /^[a-z][a-z0-9_-]*$/.test(name);\n}\n\n/**\n * Validate semver format\n */\nfunction isValidVersion(version: string): boolean {\n return /^\\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 try {\n const pspmJsonPath = join(process.cwd(), \"pspm.json\");\n\n // Check if pspm.json already exists\n let exists = false;\n try {\n await stat(pspmJsonPath);\n exists = true;\n } catch {\n // File doesn't exist, good\n }\n\n if (exists && !options.force) {\n console.error(\"Error: pspm.json already exists in this directory.\");\n console.error(\"Use --force to overwrite.\");\n process.exit(1);\n }\n\n // Try to read defaults from existing package.json and git\n const existingPkg = await readExistingPackageJson();\n const gitAuthor = await getGitAuthor();\n\n // Determine default values\n const defaultName = sanitizeName(\n options.name || existingPkg?.name || basename(process.cwd()),\n );\n const defaultVersion = existingPkg?.version || \"0.1.0\";\n const defaultDescription =\n options.description || existingPkg?.description || \"\";\n const defaultAuthor =\n options.author || existingPkg?.author || gitAuthor || \"\";\n const defaultLicense = existingPkg?.license || \"MIT\";\n const defaultMain = \"SKILL.md\";\n const defaultCapabilities = \"\";\n\n let manifest: PspmManifest;\n\n if (options.yes) {\n // Non-interactive mode: use all defaults\n manifest = {\n $schema: PSPM_SCHEMA_URL,\n name: defaultName,\n version: defaultVersion,\n description: defaultDescription || undefined,\n author: defaultAuthor || undefined,\n license: defaultLicense,\n type: \"skill\",\n capabilities: [],\n main: defaultMain,\n requirements: {\n pspm: \">=0.1.0\",\n },\n files: [...DEFAULT_SKILL_FILES],\n dependencies: {},\n private: false,\n };\n } else {\n // Interactive mode: prompt for each field\n console.log(\n \"This utility will walk you through creating a pspm.json file.\",\n );\n console.log(\n \"It only covers the most common items, and tries to guess sensible defaults.\",\n );\n console.log(\"\");\n console.log(\n \"See `pspm init --help` for definitive documentation on these fields\",\n );\n console.log(\"and exactly what they do.\");\n console.log(\"\");\n console.log(\"Press ^C at any time to quit.\");\n\n const rl = createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n try {\n // Prompt for each field\n let name = await prompt(rl, \"skill name:\", defaultName);\n\n // Validate name and re-prompt if invalid\n while (!isValidName(name)) {\n console.log(\n \" Name must start with a lowercase letter and contain only lowercase letters, numbers, hyphens, and underscores.\",\n );\n name = await prompt(rl, \"skill name:\", sanitizeName(name));\n }\n\n let version = await prompt(rl, \"version:\", defaultVersion);\n\n // Validate version and re-prompt if invalid\n while (!isValidVersion(version)) {\n console.log(\" Version must be valid semver (e.g., 1.0.0)\");\n version = await prompt(rl, \"version:\", \"0.1.0\");\n }\n\n const description = await prompt(\n rl,\n \"description:\",\n defaultDescription,\n );\n const main = await prompt(rl, \"entry point:\", defaultMain);\n const capabilitiesStr = await prompt(\n rl,\n \"capabilities (comma-separated):\",\n defaultCapabilities,\n );\n const author = await prompt(rl, \"author:\", defaultAuthor);\n const license = await prompt(rl, \"license:\", defaultLicense);\n\n rl.close();\n\n // Parse capabilities\n const capabilities = capabilitiesStr\n ? capabilitiesStr\n .split(\",\")\n .map((s) => s.trim())\n .filter(Boolean)\n : [];\n\n manifest = {\n $schema: PSPM_SCHEMA_URL,\n name,\n version,\n description: description || undefined,\n author: author || undefined,\n license,\n type: \"skill\",\n capabilities,\n main,\n requirements: {\n pspm: \">=0.1.0\",\n },\n files: [...DEFAULT_SKILL_FILES],\n dependencies: {},\n private: false,\n };\n } catch (error) {\n rl.close();\n // User pressed Ctrl+C\n if (\n error instanceof Error &&\n error.message.includes(\"readline was closed\")\n ) {\n console.log(\"\\nAborted.\");\n process.exit(0);\n }\n throw error;\n }\n }\n\n // Remove undefined/empty fields for cleaner output\n if (!manifest.description) manifest.description = undefined;\n if (!manifest.author) manifest.author = undefined;\n if (manifest.capabilities?.length === 0) manifest.capabilities = undefined;\n\n // Show preview\n const content = JSON.stringify(manifest, null, 2);\n\n console.log(\"\");\n console.log(`About to write to ${pspmJsonPath}:`);\n console.log(\"\");\n console.log(content);\n console.log(\"\");\n\n // In interactive mode, confirm before writing\n if (!options.yes) {\n const rl = createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n const confirm = await prompt(rl, \"Is this OK?\", \"yes\");\n rl.close();\n\n if (confirm.toLowerCase() !== \"yes\" && confirm.toLowerCase() !== \"y\") {\n console.log(\"Aborted.\");\n process.exit(0);\n }\n }\n\n // Write the manifest\n await writeFile(pspmJsonPath, `${content}\\n`);\n\n // Check if SKILL.md exists\n try {\n await stat(join(process.cwd(), \"SKILL.md\"));\n } catch {\n console.log(\n \"Note: Create a SKILL.md file with your skill's prompt content.\",\n );\n }\n\n if (existingPkg) {\n console.log(\"Note: Values were derived from existing package.json.\");\n console.log(\" pspm.json is for publishing to PSPM registry.\");\n console.log(\" package.json can still be used for npm dependencies.\");\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n console.error(`Error: ${message}`);\n process.exit(1);\n }\n}\n","import { createHash } from \"node:crypto\";\nimport { mkdir, readFile, rm, writeFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { parseAgentArg, promptForAgents } from \"@/agents\";\nimport { configure, getSkillVersion, listSkillVersions } from \"@/api-client\";\nimport {\n getCacheDir,\n getSkillsDir,\n getTokenForRegistry,\n isGlobalMode,\n resolveConfig,\n} from \"@/config\";\nimport { extractApiErrorMessage } from \"@/errors\";\nimport {\n downloadGitHubPackage,\n extractGitHubPackage,\n GitHubNotFoundError,\n GitHubPathNotFoundError,\n GitHubRateLimitError,\n getGitHubDisplayName,\n} from \"@/github\";\nimport {\n calculateIntegrity,\n computeInstallOrder,\n type GitHubLockfileEntry,\n getGitHubSkillName,\n type PspmLockfileEntry,\n parseGitHubSpecifier,\n parseRegistrySpecifier,\n resolveVersion,\n} from \"@/lib/index\";\nimport {\n addGitHubToLockfile,\n addToLockfile,\n migrateLockfileIfNeeded,\n readLockfile,\n} from \"@/lockfile\";\nimport {\n getDependencies,\n getGitHubDependencies,\n readManifest,\n} from \"@/manifest\";\nimport {\n createAgentSymlinks,\n getGitHubSkillPath,\n getRegistrySkillPath,\n type SkillInfo,\n} from \"@/symlinks\";\n\n/**\n * Get cache file path from integrity hash\n */\nfunction getCacheFilePath(cacheDir: string, integrity: string): string {\n // integrity is \"sha256-{base64hash}\"\n // Convert to safe filename: sha256-{hex}.tgz\n const match = integrity.match(/^sha256-(.+)$/);\n if (!match) {\n throw new Error(`Invalid integrity format: ${integrity}`);\n }\n // Convert base64 to hex for safe filename\n const base64Hash = match[1];\n const hexHash = Buffer.from(base64Hash, \"base64\").toString(\"hex\");\n return join(cacheDir, `sha256-${hexHash}.tgz`);\n}\n\n/**\n * Try to read tarball from cache\n */\nasync function readFromCache(\n cacheDir: string,\n integrity: string,\n): Promise<Buffer | null> {\n try {\n const cachePath = getCacheFilePath(cacheDir, integrity);\n const data = await readFile(cachePath);\n\n // Verify integrity\n const actualIntegrity = `sha256-${createHash(\"sha256\").update(data).digest(\"base64\")}`;\n if (actualIntegrity !== integrity) {\n // Cache corrupted, remove it\n await rm(cachePath, { force: true });\n return null;\n }\n\n return data;\n } catch {\n return null;\n }\n}\n\n/**\n * Write tarball to cache\n */\nasync function writeToCache(\n cacheDir: string,\n integrity: string,\n data: Buffer,\n): Promise<void> {\n try {\n await mkdir(cacheDir, { recursive: true });\n const cachePath = getCacheFilePath(cacheDir, integrity);\n await writeFile(cachePath, data);\n } catch {\n // Cache write failures are non-fatal\n }\n}\n\nexport interface InstallOptions {\n frozenLockfile?: boolean;\n dir?: string;\n agent?: string;\n yes?: boolean;\n /** Install globally (to ~/.pspm/ with global agent paths) */\n global?: boolean;\n}\n\nexport async function install(\n specifiers: string[],\n options: InstallOptions,\n): Promise<void> {\n // Set up global mode if requested\n if (options.global) {\n const { setGlobalMode } = await import(\"@/config\");\n setGlobalMode(true);\n }\n\n // If specifiers are provided, delegate to add command\n if (specifiers.length > 0) {\n const { add } = await import(\"./add.js\");\n await add(specifiers, {\n save: true,\n agent: options.agent,\n yes: options.yes,\n global: options.global,\n });\n return;\n }\n\n // Otherwise, install from lockfile\n await installFromLockfile(options);\n}\n\nasync function installFromLockfile(options: InstallOptions): Promise<void> {\n try {\n // Get config - auth may be optional for public packages\n const config = await resolveConfig();\n const registryUrl = config.registryUrl;\n const apiKey = getTokenForRegistry(config, registryUrl);\n const skillsDir = options.dir || getSkillsDir();\n const cacheDir = getCacheDir();\n\n // Migrate legacy lockfile if needed\n await migrateLockfileIfNeeded();\n\n // Read lockfile and dependencies from pspm.json\n let lockfile = await readLockfile();\n const manifestDeps = await getDependencies();\n const manifestGitHubDeps = await getGitHubDependencies();\n const lockfilePackages = lockfile?.packages ?? lockfile?.skills ?? {};\n const lockfileGitHubPackages = lockfile?.githubPackages ?? {};\n\n // Track all installed skills for symlink creation\n const installedSkills: SkillInfo[] = [];\n\n // =================================================================\n // Phase 1: Resolve missing registry dependencies\n // =================================================================\n const missingDeps: Array<{ fullName: string; versionRange: string }> = [];\n for (const [fullName, versionRange] of Object.entries(manifestDeps)) {\n if (!lockfilePackages[fullName]) {\n missingDeps.push({ fullName, versionRange });\n }\n }\n\n if (missingDeps.length > 0) {\n if (options.frozenLockfile) {\n console.error(\n \"Error: Dependencies in pspm.json are not in lockfile. Cannot install with --frozen-lockfile\",\n );\n console.error(\"Missing dependencies:\");\n for (const dep of missingDeps) {\n console.error(` - ${dep.fullName}@${dep.versionRange}`);\n }\n process.exit(1);\n }\n\n console.log(`Resolving ${missingDeps.length} new dependency(ies)...\\n`);\n configure({ registryUrl, apiKey });\n\n for (const { fullName, versionRange } of missingDeps) {\n const parsed = parseRegistrySpecifier(fullName);\n if (!parsed) {\n console.error(`Error: Invalid dependency specifier: ${fullName}`);\n continue;\n }\n\n const { owner, name } = parsed;\n console.log(`Resolving ${fullName}@${versionRange}...`);\n\n // Get available versions\n const versionsResponse = await listSkillVersions(owner, name);\n if (versionsResponse.status !== 200) {\n const errorMessage = extractApiErrorMessage(\n versionsResponse,\n `Skill ${fullName} not found`,\n );\n console.error(`Error: ${errorMessage}`);\n continue;\n }\n\n const versions = versionsResponse.data;\n if (versions.length === 0) {\n console.error(`Error: Skill ${fullName} not found`);\n continue;\n }\n\n // Resolve version\n const versionStrings = versions.map(\n (v: { version: string }) => v.version,\n );\n const resolved = resolveVersion(versionRange || \"*\", versionStrings);\n\n if (!resolved) {\n console.error(\n `Error: No version matching \"${versionRange}\" for ${fullName}`,\n );\n continue;\n }\n\n // Get version details with download URL\n const versionResponse = await getSkillVersion(owner, name, resolved);\n if (versionResponse.status !== 200 || !versionResponse.data) {\n const errorMessage = extractApiErrorMessage(\n versionResponse,\n `Version ${resolved} not found`,\n );\n console.error(`Error: ${errorMessage}`);\n continue;\n }\n const versionInfo = versionResponse.data;\n\n // Download the tarball\n const isPresignedUrl =\n versionInfo.downloadUrl.includes(\".r2.cloudflarestorage.com\") ||\n versionInfo.downloadUrl.includes(\"X-Amz-Signature\");\n\n const downloadHeaders: Record<string, string> = {};\n if (!isPresignedUrl && apiKey) {\n downloadHeaders.Authorization = `Bearer ${apiKey}`;\n }\n\n const tarballResponse = await fetch(versionInfo.downloadUrl, {\n headers: downloadHeaders,\n redirect: \"follow\",\n });\n\n if (!tarballResponse.ok) {\n console.error(\n `Error: Failed to download tarball for ${fullName} (${tarballResponse.status})`,\n );\n continue;\n }\n\n const tarballBuffer = Buffer.from(await tarballResponse.arrayBuffer());\n const integrity = calculateIntegrity(tarballBuffer);\n\n // Add to lockfile\n await addToLockfile(fullName, {\n version: resolved,\n resolved: versionInfo.downloadUrl,\n integrity,\n });\n\n // Cache the tarball\n await writeToCache(cacheDir, integrity, tarballBuffer);\n\n console.log(` Resolved ${fullName}@${resolved}`);\n }\n\n // Re-read lockfile after adding new entries\n lockfile = await readLockfile();\n }\n\n // =================================================================\n // Phase 2: Resolve missing GitHub dependencies\n // =================================================================\n const missingGitHubDeps: Array<{ specifier: string; ref: string }> = [];\n for (const [specifier, ref] of Object.entries(manifestGitHubDeps)) {\n if (!lockfileGitHubPackages[specifier]) {\n missingGitHubDeps.push({ specifier, ref });\n }\n }\n\n if (missingGitHubDeps.length > 0) {\n if (options.frozenLockfile) {\n console.error(\n \"Error: GitHub dependencies in pspm.json are not in lockfile. Cannot install with --frozen-lockfile\",\n );\n console.error(\"Missing GitHub dependencies:\");\n for (const dep of missingGitHubDeps) {\n console.error(` - ${dep.specifier}@${dep.ref}`);\n }\n process.exit(1);\n }\n\n console.log(\n `\\nResolving ${missingGitHubDeps.length} GitHub dependency(ies)...\\n`,\n );\n\n for (const { specifier, ref } of missingGitHubDeps) {\n const parsed = parseGitHubSpecifier(specifier);\n if (!parsed) {\n console.error(`Error: Invalid GitHub specifier: ${specifier}`);\n continue;\n }\n\n // Set the ref from manifest if not in specifier\n parsed.ref = parsed.ref || ref;\n\n console.log(`Resolving ${getGitHubDisplayName(parsed)}...`);\n\n try {\n const result = await downloadGitHubPackage(parsed);\n\n // Extract to skills directory\n await extractGitHubPackage(parsed, result.buffer, skillsDir);\n\n // Add to lockfile\n const entry: GitHubLockfileEntry = {\n version: result.commit.slice(0, 7),\n resolved: `https://github.com/${parsed.owner}/${parsed.repo}`,\n integrity: result.integrity,\n gitCommit: result.commit,\n gitRef: ref || \"HEAD\",\n };\n\n await addGitHubToLockfile(specifier, entry);\n\n // Cache the tarball\n await writeToCache(cacheDir, result.integrity, result.buffer);\n\n console.log(\n ` Resolved ${specifier} (${ref}@${result.commit.slice(0, 7)})`,\n );\n } catch (error) {\n if (error instanceof GitHubRateLimitError) {\n console.error(`Error: ${error.message}`);\n } else if (error instanceof GitHubPathNotFoundError) {\n console.error(`Error: ${error.message}`);\n } else if (error instanceof GitHubNotFoundError) {\n console.error(`Error: ${error.message}`);\n } else {\n const message =\n error instanceof Error ? error.message : String(error);\n console.error(`Error resolving ${specifier}: ${message}`);\n }\n }\n }\n\n // Re-read lockfile after adding new entries\n lockfile = await readLockfile();\n }\n\n // =================================================================\n // Determine which agents to use (after resolution, before installation)\n // =================================================================\n const manifest = await readManifest();\n const agentConfigs = manifest?.agents;\n\n let agents: string[];\n if (options.agent) {\n // If --agent flag is provided, use it\n agents = parseAgentArg(options.agent);\n } else if (manifest) {\n // If pspm.json exists, use default agent\n agents = parseAgentArg(undefined);\n } else if (options.yes) {\n // If -y flag is used, use default agent without prompting\n agents = parseAgentArg(undefined);\n } else {\n // No pspm.json exists, prompt user to select agents\n console.log(\"\\nNo pspm.json found. Let's set up your project.\\n\");\n agents = await promptForAgents();\n console.log(); // Add newline after selection\n }\n\n // =================================================================\n // Phase 3: Install registry packages from lockfile (topological order)\n // =================================================================\n const packages = lockfile?.packages ?? lockfile?.skills ?? {};\n const packageCount = Object.keys(packages).length;\n\n if (packageCount > 0) {\n console.log(`\\nInstalling ${packageCount} registry skill(s)...\\n`);\n\n // Compute topological install order (dependencies first)\n const installOrder = computeInstallOrder(packages);\n const entries: [string, PspmLockfileEntry][] = installOrder\n .filter((name) => packages[name])\n .map((name) => [name, packages[name]]);\n\n for (const [fullName, entry] of entries) {\n const parsedName = parseRegistrySpecifier(fullName);\n if (!parsedName) {\n console.warn(`Warning: Invalid skill name in lockfile: ${fullName}`);\n continue;\n }\n\n const { namespace: ns, owner: pkgOwner, name, subname } = parsedName;\n console.log(`Installing ${fullName}@${entry.version}...`);\n\n let tarballBuffer: Buffer;\n let fromCache = false;\n\n // Try to read from cache first\n const cachedTarball = await readFromCache(cacheDir, entry.integrity);\n if (cachedTarball) {\n tarballBuffer = cachedTarball;\n fromCache = true;\n } else {\n // Download the tarball\n const isPresignedUrl =\n entry.resolved.includes(\".r2.cloudflarestorage.com\") ||\n entry.resolved.includes(\"X-Amz-Signature\");\n\n const downloadHeaders: Record<string, string> = {};\n if (!isPresignedUrl && apiKey) {\n downloadHeaders.Authorization = `Bearer ${apiKey}`;\n }\n\n const response = await fetch(entry.resolved, {\n headers: downloadHeaders,\n redirect: \"follow\",\n });\n\n if (!response.ok) {\n if (response.status === 401) {\n if (!apiKey) {\n console.error(\n ` Error: ${fullName} requires authentication. Run 'pspm login' first.`,\n );\n } else {\n console.error(\n ` Error: Access denied to ${fullName}. You may not have permission to access this private package.`,\n );\n }\n } else {\n console.error(\n ` Error: Failed to download ${fullName} (${response.status})`,\n );\n }\n continue;\n }\n\n tarballBuffer = Buffer.from(await response.arrayBuffer());\n\n // Verify checksum\n const actualIntegrity = `sha256-${createHash(\"sha256\").update(tarballBuffer).digest(\"base64\")}`;\n\n if (actualIntegrity !== entry.integrity) {\n console.error(\n ` Error: Checksum verification failed for ${fullName}`,\n );\n if (options.frozenLockfile) {\n process.exit(1);\n }\n continue;\n }\n\n // Cache the verified tarball\n await writeToCache(cacheDir, entry.integrity, tarballBuffer);\n }\n\n // Extract tarball\n const effectiveSkillName = subname ?? name;\n let destDir: string;\n if (ns === \"org\") {\n destDir = join(skillsDir, \"_org\", pkgOwner, effectiveSkillName);\n } else if (ns === \"github\" && subname) {\n destDir = join(\n skillsDir,\n \"_github-registry\",\n pkgOwner,\n name,\n subname,\n );\n } else {\n destDir = join(skillsDir, pkgOwner, effectiveSkillName);\n }\n await rm(destDir, { recursive: true, force: true });\n await mkdir(destDir, { recursive: true });\n\n const tempFile = join(destDir, \".temp.tgz\");\n await writeFile(tempFile, tarballBuffer);\n\n const { exec } = await import(\"node:child_process\");\n const { promisify } = await import(\"node:util\");\n const execAsync = promisify(exec);\n\n try {\n await execAsync(\n `tar -xzf \"${tempFile}\" -C \"${destDir}\" --strip-components=1`,\n );\n } finally {\n await rm(tempFile, { force: true });\n }\n\n console.log(\n ` Installed to ${destDir}${fromCache ? \" (from cache)\" : \"\"}`,\n );\n\n // Track for symlinks\n const pathSkillName =\n ns === \"github\" && subname ? `${name}/${subname}` : name;\n installedSkills.push({\n name: effectiveSkillName,\n sourcePath: getRegistrySkillPath(ns, pkgOwner, pathSkillName),\n });\n }\n }\n\n // =================================================================\n // Phase 4: Install GitHub packages from lockfile\n // =================================================================\n const githubPackages = lockfile?.githubPackages ?? {};\n const githubCount = Object.keys(githubPackages).length;\n\n if (githubCount > 0) {\n console.log(`\\nInstalling ${githubCount} GitHub skill(s)...\\n`);\n\n for (const [specifier, entry] of Object.entries(githubPackages)) {\n const parsed = parseGitHubSpecifier(specifier);\n if (!parsed) {\n console.warn(\n `Warning: Invalid GitHub specifier in lockfile: ${specifier}`,\n );\n continue;\n }\n\n const ghEntry = entry as GitHubLockfileEntry;\n console.log(\n `Installing ${specifier} (${ghEntry.gitRef}@${ghEntry.gitCommit.slice(0, 7)})...`,\n );\n\n let tarballBuffer: Buffer;\n let fromCache = false;\n\n // Try to read from cache first\n const cachedTarball = await readFromCache(cacheDir, ghEntry.integrity);\n if (cachedTarball) {\n tarballBuffer = cachedTarball;\n fromCache = true;\n } else {\n // Download from GitHub\n try {\n // Use the locked commit\n const specWithCommit = { ...parsed, ref: ghEntry.gitCommit };\n const result = await downloadGitHubPackage(specWithCommit);\n tarballBuffer = result.buffer;\n\n // Verify integrity\n if (result.integrity !== ghEntry.integrity) {\n console.error(\n ` Error: Checksum verification failed for ${specifier}`,\n );\n if (options.frozenLockfile) {\n process.exit(1);\n }\n continue;\n }\n\n // Cache the verified tarball\n await writeToCache(cacheDir, ghEntry.integrity, tarballBuffer);\n } catch (error) {\n if (error instanceof GitHubRateLimitError) {\n console.error(` Error: ${error.message}`);\n } else if (error instanceof GitHubPathNotFoundError) {\n console.error(` Error: ${error.message}`);\n } else if (error instanceof GitHubNotFoundError) {\n console.error(` Error: ${error.message}`);\n } else {\n const message =\n error instanceof Error ? error.message : String(error);\n console.error(` Error downloading ${specifier}: ${message}`);\n }\n continue;\n }\n }\n\n // Extract the package\n try {\n const destPath = await extractGitHubPackage(\n parsed,\n tarballBuffer,\n skillsDir,\n );\n console.log(\n ` Installed to ${destPath}${fromCache ? \" (from cache)\" : \"\"}`,\n );\n\n // Track for symlinks\n const skillName = getGitHubSkillName(parsed);\n installedSkills.push({\n name: skillName,\n sourcePath: getGitHubSkillPath(\n parsed.owner,\n parsed.repo,\n parsed.path,\n ),\n });\n } catch (error) {\n const message =\n error instanceof Error ? error.message : String(error);\n console.error(` Error extracting ${specifier}: ${message}`);\n }\n }\n }\n\n // =================================================================\n // Phase 5: Create agent symlinks\n // =================================================================\n if (installedSkills.length > 0 && agents[0] !== \"none\") {\n const globalMode = isGlobalMode();\n console.log(\n `\\nCreating symlinks for agent(s): ${agents.join(\", \")}${globalMode ? \" (global)\" : \"\"}...`,\n );\n\n await createAgentSymlinks(installedSkills, {\n agents,\n projectRoot: globalMode ? homedir() : process.cwd(),\n agentConfigs,\n global: globalMode,\n });\n\n console.log(\" Symlinks created.\");\n }\n\n // =================================================================\n // Summary\n // =================================================================\n const totalCount = packageCount + githubCount;\n if (totalCount === 0) {\n console.log(\"No skills to install.\");\n } else {\n console.log(`\\nAll ${totalCount} skill(s) installed.`);\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n console.error(`Error: ${message}`);\n process.exit(1);\n }\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 getGitHubSkillName,\n parseGitHubSpecifier,\n parseRegistrySpecifier,\n} from \"@/lib/index\";\nimport { listLockfileGitHubPackages, listLockfileSkills } from \"@/lockfile\";\nimport { readManifest } from \"@/manifest\";\nimport {\n createAgentSymlinks,\n getGitHubSkillPath,\n getRegistrySkillPath,\n type SkillInfo,\n} from \"@/symlinks\";\n\nexport interface LinkOptions {\n agent?: string;\n yes?: boolean;\n /** Recreate global agent symlinks */\n global?: boolean;\n}\n\nexport async function link(options: LinkOptions): Promise<void> {\n try {\n // Set up global mode if requested\n if (options.global) {\n const { setGlobalMode } = await import(\"@/config\");\n setGlobalMode(true);\n }\n\n // Read manifest for agent config overrides\n const manifest = await readManifest();\n const agentConfigs = manifest?.agents;\n\n // Determine which agents to use\n let agents: string[];\n if (options.agent) {\n // If --agent flag is provided, use it\n agents = parseAgentArg(options.agent);\n } else if (manifest) {\n // If pspm.json exists, use default agent (respect manifest's agent config)\n agents = parseAgentArg(undefined);\n } else if (options.yes) {\n // If -y flag is used, use default agent without prompting\n agents = parseAgentArg(undefined);\n } else {\n // No pspm.json exists, prompt user to select agents\n console.log(\"No pspm.json found. Let's set up your project.\\n\");\n agents = await promptForAgents();\n }\n\n // Skip if \"none\" agent\n if (agents.length === 1 && agents[0] === \"none\") {\n console.log(\"Skipping symlink creation (--agent none)\");\n return;\n }\n\n // Collect all installed skills\n const skills: SkillInfo[] = [];\n\n // Get registry skills from lockfile\n const registrySkills = await listLockfileSkills();\n for (const { name } of registrySkills) {\n const parsed = parseRegistrySpecifier(name);\n if (!parsed) {\n console.warn(`Warning: Invalid skill name in lockfile: ${name}`);\n continue;\n }\n\n const effectiveName = parsed.subname ?? parsed.name;\n const pathName =\n parsed.namespace === \"github\" && parsed.subname\n ? `${parsed.name}/${parsed.subname}`\n : parsed.name;\n skills.push({\n name: effectiveName,\n sourcePath: getRegistrySkillPath(\n parsed.namespace,\n parsed.owner,\n pathName,\n ),\n });\n }\n\n // Get GitHub skills from lockfile\n const githubSkills = await listLockfileGitHubPackages();\n for (const { specifier } of githubSkills) {\n const parsed = parseGitHubSpecifier(specifier);\n if (!parsed) {\n console.warn(\n `Warning: Invalid GitHub specifier in lockfile: ${specifier}`,\n );\n continue;\n }\n\n const skillName = getGitHubSkillName(parsed);\n skills.push({\n name: skillName,\n sourcePath: getGitHubSkillPath(parsed.owner, parsed.repo, parsed.path),\n });\n }\n\n if (skills.length === 0) {\n console.log(\"No skills found in lockfile. Nothing to link.\");\n return;\n }\n\n console.log(\n `Creating symlinks for ${skills.length} skill(s) to agent(s): ${agents.join(\", \")}...`,\n );\n\n const globalMode = options.global ?? false;\n await createAgentSymlinks(skills, {\n agents,\n projectRoot: globalMode\n ? (await import(\"node:os\")).homedir()\n : process.cwd(),\n agentConfigs,\n global: globalMode,\n });\n\n console.log(\"Symlinks created successfully.\");\n\n // List created symlinks\n console.log(\"\\nLinked skills:\");\n for (const skill of skills) {\n console.log(` ${skill.name} -> ${skill.sourcePath}`);\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n console.error(`Error: ${message}`);\n process.exit(1);\n }\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 type GitHubLockfileEntry,\n getGitHubSkillName,\n parseGitHubSpecifier,\n parseRegistrySpecifier,\n type WellKnownLockfileEntry,\n} from \"@/lib/index\";\nimport {\n listLockfileGitHubPackages,\n listLockfileSkills,\n listLockfileWellKnownPackages,\n} from \"@/lockfile\";\nimport { readManifest } from \"@/manifest\";\nimport {\n getGitHubSkillPath,\n getLinkedAgents,\n getRegistrySkillPath,\n getWellKnownSkillPath,\n} from \"@/symlinks\";\n\nexport interface ListOptions {\n json?: boolean;\n /** List globally installed skills */\n global?: boolean;\n}\n\ninterface SkillListItem {\n name: string;\n fullName: string;\n version: string;\n source: \"registry\" | \"github\" | \"well-known\";\n sourcePath: string;\n status: \"installed\" | \"missing\";\n linkedAgents: string[];\n gitRef?: string;\n gitCommit?: string;\n hostname?: string;\n}\n\nexport async function list(options: ListOptions): Promise<void> {\n try {\n // Set up global mode if requested\n if (options.global) {\n const { setGlobalMode } = await import(\"@/config\");\n setGlobalMode(true);\n }\n\n // Get all skills from lockfile\n const registrySkills = await listLockfileSkills();\n const githubSkills = await listLockfileGitHubPackages();\n const wellKnownSkills = await listLockfileWellKnownPackages();\n\n // Read manifest for agent configs\n const manifest = await readManifest();\n const agentConfigs = manifest?.agents;\n const availableAgents = getAvailableAgents(agentConfigs);\n const projectRoot = process.cwd();\n\n // Build list of all skills\n const skills: SkillListItem[] = [];\n\n // Add registry skills\n for (const { name: fullName, entry } of registrySkills) {\n const parsed = parseRegistrySpecifier(fullName);\n if (!parsed) continue;\n\n const skillName = parsed.subname ?? parsed.name;\n const pathName =\n parsed.namespace === \"github\" && parsed.subname\n ? `${parsed.name}/${parsed.subname}`\n : parsed.name;\n const sourcePath = getRegistrySkillPath(\n parsed.namespace,\n parsed.owner,\n pathName,\n );\n const absolutePath = join(projectRoot, sourcePath);\n\n // Check if installed on disk\n let status: \"installed\" | \"missing\" = \"installed\";\n try {\n await access(absolutePath);\n } catch {\n status = \"missing\";\n }\n\n // Check which agents have symlinks\n const linkedAgents = await getLinkedAgents(\n skillName,\n availableAgents,\n projectRoot,\n agentConfigs,\n );\n\n skills.push({\n name: skillName,\n fullName,\n version: entry.version,\n source: \"registry\",\n sourcePath,\n status,\n linkedAgents,\n });\n }\n\n // Add GitHub skills\n for (const { specifier, entry } of githubSkills) {\n const parsed = parseGitHubSpecifier(specifier);\n if (!parsed) continue;\n\n const ghEntry = entry as GitHubLockfileEntry;\n const skillName = getGitHubSkillName(parsed);\n const sourcePath = getGitHubSkillPath(\n parsed.owner,\n parsed.repo,\n parsed.path,\n );\n const absolutePath = join(projectRoot, sourcePath);\n\n // Check if installed on disk\n let status: \"installed\" | \"missing\" = \"installed\";\n try {\n await access(absolutePath);\n } catch {\n status = \"missing\";\n }\n\n // Check which agents have symlinks\n const linkedAgents = await getLinkedAgents(\n skillName,\n availableAgents,\n projectRoot,\n agentConfigs,\n );\n\n skills.push({\n name: skillName,\n fullName: specifier,\n version: ghEntry.gitCommit.slice(0, 7),\n source: \"github\",\n sourcePath,\n status,\n linkedAgents,\n gitRef: ghEntry.gitRef,\n gitCommit: ghEntry.gitCommit,\n });\n }\n\n // Add well-known skills\n for (const { specifier, entry } of wellKnownSkills) {\n const wkEntry = entry as WellKnownLockfileEntry;\n const skillName = wkEntry.name;\n const sourcePath = getWellKnownSkillPath(wkEntry.hostname, skillName);\n const absolutePath = join(projectRoot, sourcePath);\n\n // Check if installed on disk\n let status: \"installed\" | \"missing\" = \"installed\";\n try {\n await access(absolutePath);\n } catch {\n status = \"missing\";\n }\n\n // Check which agents have symlinks\n const linkedAgents = await getLinkedAgents(\n skillName,\n availableAgents,\n projectRoot,\n agentConfigs,\n );\n\n skills.push({\n name: skillName,\n fullName: specifier,\n version: \"well-known\",\n source: \"well-known\",\n sourcePath,\n status,\n linkedAgents,\n hostname: wkEntry.hostname,\n });\n }\n\n if (skills.length === 0) {\n console.log(\"No skills installed.\");\n return;\n }\n\n if (options.json) {\n console.log(JSON.stringify(skills, null, 2));\n return;\n }\n\n console.log(\"Installed skills:\\n\");\n\n for (const skill of skills) {\n // Header line: name@version (source)\n if (skill.source === \"registry\") {\n console.log(` ${skill.fullName}@${skill.version} (registry)`);\n } else if (skill.source === \"well-known\") {\n console.log(` ${skill.name} (well-known: ${skill.hostname})`);\n } else {\n const refInfo = skill.gitRef\n ? `${skill.gitRef}@${skill.gitCommit?.slice(0, 7)}`\n : skill.version;\n console.log(` ${skill.fullName} (${refInfo})`);\n }\n\n // Status line if missing\n if (skill.status === \"missing\") {\n console.log(` Status: MISSING (run 'pspm install' to restore)`);\n }\n\n // Symlink line\n if (skill.linkedAgents.length > 0) {\n for (const agent of skill.linkedAgents) {\n const config = resolveAgentConfig(agent, agentConfigs);\n if (config) {\n console.log(` -> ${config.skillsDir}/${skill.name}`);\n }\n }\n }\n }\n\n // Summary\n const registryCount = skills.filter((s) => s.source === \"registry\").length;\n const githubCount = skills.filter((s) => s.source === \"github\").length;\n const wellKnownCount = skills.filter(\n (s) => s.source === \"well-known\",\n ).length;\n const parts: string[] = [];\n if (registryCount > 0) parts.push(`${registryCount} registry`);\n if (githubCount > 0) parts.push(`${githubCount} github`);\n if (wellKnownCount > 0) parts.push(`${wellKnownCount} well-known`);\n\n console.log(`\\nTotal: ${skills.length} skill(s) (${parts.join(\", \")})`);\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n console.error(`Error: ${message}`);\n process.exit(1);\n }\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 apiKey?: 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 // Environment variable takes priority (for local dev)\n if (process.env.PSPM_WEB_URL) {\n return process.env.PSPM_WEB_URL.replace(/\\/$/, \"\"); // Remove trailing slash\n }\n\n try {\n const url = new URL(registryUrl);\n let host = url.host;\n\n // Strip \"registry.\" subdomain prefix if present\n // e.g., registry.pspm.dev -> pspm.dev\n if (host.startsWith(\"registry.\")) {\n host = host.slice(\"registry.\".length);\n }\n\n return `${url.protocol}//${host}`;\n } catch {\n return DEFAULT_WEB_APP_URL;\n }\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 try {\n const url = new URL(registryUrl);\n let host = url.host;\n\n // Strip \"registry.\" subdomain prefix if present\n if (host.startsWith(\"registry.\")) {\n host = host.slice(\"registry.\".length);\n }\n\n return `${url.protocol}//${host}`;\n } catch {\n return DEFAULT_WEB_APP_URL;\n }\n}\n\n/**\n * Exchange a CLI token for an API key using fetch\n */\nasync function exchangeCliToken(\n registryUrl: string,\n token: string,\n): Promise<{ apiKey: string; username: string }> {\n const serverUrl = getServerUrl(registryUrl);\n // Use direct REST endpoint (not oRPC) for CLI compatibility\n const rpcUrl = `${serverUrl}/api/api-keys/cli-token-exchange`;\n\n const response = await fetch(rpcUrl, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ token }),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`Failed to exchange token: ${errorText}`);\n }\n\n return 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 port: number;\n tokenPromise: Promise<string>;\n cleanup: () => void;\n}> {\n return new Promise((resolveServer, rejectServer) => {\n let resolveToken: (token: string) => void;\n let rejectToken: (error: Error) => void;\n let timeoutId: NodeJS.Timeout;\n\n const tokenPromise = new Promise<string>((resolve, reject) => {\n resolveToken = resolve;\n rejectToken = reject;\n });\n\n const server = http.createServer((req, res) => {\n const url = new URL(req.url || \"/\", \"http://localhost\");\n\n if (url.pathname === \"/callback\") {\n const token = url.searchParams.get(\"token\");\n const state = url.searchParams.get(\"state\");\n\n if (state !== expectedState) {\n res.writeHead(400, { \"Content-Type\": \"text/html\" });\n res.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 rejectToken(new Error(\"State mismatch - possible CSRF attack\"));\n return;\n }\n\n if (!token) {\n res.writeHead(400, { \"Content-Type\": \"text/html\" });\n res.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 rejectToken(new Error(\"No token received\"));\n return;\n }\n\n res.writeHead(200, { \"Content-Type\": \"text/html\" });\n res.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 resolveToken(token);\n } else {\n res.writeHead(404, { \"Content-Type\": \"text/plain\" });\n res.end(\"Not found\");\n }\n });\n\n // Cleanup function to close server and clear timeout\n const cleanup = () => {\n clearTimeout(timeoutId);\n server.close();\n };\n\n // Use port 0 to let the OS assign an available port\n server.listen(0, \"127.0.0.1\", () => {\n const address = server.address();\n if (typeof address === \"object\" && address !== null) {\n resolveServer({ port: address.port, tokenPromise, cleanup });\n } else {\n rejectServer(new Error(\"Failed to get server address\"));\n }\n });\n\n server.on(\"error\", (err) => {\n rejectServer(err);\n });\n\n // Timeout after 5 minutes\n timeoutId = setTimeout(\n () => {\n rejectToken(new Error(\"Login timed out - please try again\"));\n server.close();\n },\n 5 * 60 * 1000,\n );\n });\n}\n\n/**\n * Login using browser-based OAuth flow\n */\nasync function browserLogin(): Promise<void> {\n const registryUrl = await getRegistryUrl();\n const webAppUrl = getWebAppUrl(registryUrl);\n\n // Generate state for CSRF protection\n const state = randomBytes(32).toString(\"base64url\");\n\n console.log(\"Starting browser-based login...\");\n\n // Start local callback server\n const { port, tokenPromise, cleanup } = await startCallbackServer(state);\n\n // Build the login URL\n const loginUrl = `${webAppUrl}/cli/login?port=${port}&state=${encodeURIComponent(state)}`;\n\n console.log(\"Opening browser to authenticate...\");\n console.log(`If the browser doesn't open, visit: ${loginUrl}`);\n\n // Open the browser\n try {\n await open(loginUrl);\n } catch {\n console.log(\"Could not open browser automatically.\");\n console.log(`Please visit: ${loginUrl}`);\n }\n\n console.log(\"Waiting for authentication...\");\n\n // Wait for the callback with the token\n const token = await tokenPromise;\n\n // Clean up server and timeout immediately after receiving token\n cleanup();\n\n console.log(\"Received token, exchanging for API key...\");\n\n // Exchange the token for an API key\n const { apiKey, username } = await exchangeCliToken(registryUrl, token);\n\n // Store credentials\n await setCredentials(apiKey, username, registryUrl);\n\n console.log(`Logged in as ${username}`);\n console.log(`Registry: ${registryUrl}`);\n}\n\n/**\n * Login using direct API key (fallback method)\n */\nasync function directLogin(apiKey: string): Promise<void> {\n console.log(\"Verifying API key...\");\n\n const registryUrl = await getRegistryUrl();\n\n const user = await whoamiRequest(registryUrl, apiKey);\n if (!user) {\n console.error(\"Error: Invalid API key or not authenticated\");\n process.exit(1);\n }\n\n // Store credentials\n await setCredentials(apiKey, user.username, registryUrl);\n console.log(`Logged in as ${user.username}`);\n console.log(`Registry: ${registryUrl}`);\n}\n\nexport async function login(options: LoginOptions): Promise<void> {\n try {\n if (options.apiKey) {\n // Direct login with API key\n await directLogin(options.apiKey);\n } else {\n // Browser-based OAuth flow\n await browserLogin();\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n console.error(`Error: ${message}`);\n process.exit(1);\n }\n}\n","import { clearCredentials, isLoggedIn } from \"@/config\";\n\nexport async function logout(): Promise<void> {\n try {\n const loggedIn = await isLoggedIn();\n\n if (!loggedIn) {\n console.log(\"Not logged in.\");\n return;\n }\n\n await clearCredentials();\n console.log(\"Logged out successfully.\");\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n console.error(`Error: ${message}`);\n process.exit(1);\n }\n}\n","import { mkdir, readdir, rename, rm, stat } from \"node:fs/promises\";\nimport {\n getLegacyLockfilePath,\n getLegacySkillsDir,\n getLockfilePath,\n getPspmDir,\n getSkillsDir,\n} from \"@/config\";\nimport { migrateLockfileIfNeeded } from \"@/lockfile\";\n\nexport interface MigrateOptions {\n dryRun?: 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 try {\n const legacySkillsDir = getLegacySkillsDir();\n const newSkillsDir = getSkillsDir();\n const legacyLockfilePath = getLegacyLockfilePath();\n const newLockfilePath = getLockfilePath();\n const pspmDir = getPspmDir();\n\n let migrationNeeded = false;\n const actions: string[] = [];\n\n // Check for legacy .skills directory\n try {\n const legacyStats = await stat(legacySkillsDir);\n if (legacyStats.isDirectory()) {\n // Check if it has any content\n const contents = await readdir(legacySkillsDir);\n if (contents.length > 0) {\n migrationNeeded = true;\n actions.push(\"Move .skills/ → .pspm/skills/\");\n }\n }\n } catch {\n // Legacy directory doesn't exist\n }\n\n // Check for legacy lockfile\n try {\n await stat(legacyLockfilePath);\n // Check if new lockfile already exists\n try {\n await stat(newLockfilePath);\n // Both exist - suggest manual resolution\n actions.push(\n \"Note: Both skill-lock.json and pspm-lock.json exist. Manual merge may be needed.\",\n );\n } catch {\n migrationNeeded = true;\n actions.push(\"Migrate skill-lock.json → pspm-lock.json\");\n }\n } catch {\n // Legacy lockfile doesn't exist\n }\n\n if (!migrationNeeded && actions.length === 0) {\n console.log(\n \"No migration needed. Project is already using the new structure.\",\n );\n return;\n }\n\n if (options.dryRun) {\n console.log(\"Migration plan (dry run):\");\n console.log(\"\");\n for (const action of actions) {\n console.log(` - ${action}`);\n }\n console.log(\"\");\n console.log(\"Run without --dry-run to perform migration.\");\n return;\n }\n\n console.log(\"Migrating project structure...\\n\");\n\n // Migrate lockfile first\n const lockfileMigrated = await migrateLockfileIfNeeded();\n if (lockfileMigrated) {\n console.log(\" ✓ Migrated skill-lock.json → pspm-lock.json\");\n }\n\n // Migrate .skills directory\n try {\n const legacyStats = await stat(legacySkillsDir);\n if (legacyStats.isDirectory()) {\n const contents = await readdir(legacySkillsDir);\n if (contents.length > 0) {\n // Create .pspm directory\n await mkdir(pspmDir, { recursive: true });\n\n // Check if new skills dir exists and has content\n try {\n const newStats = await stat(newSkillsDir);\n if (newStats.isDirectory()) {\n const newContents = await readdir(newSkillsDir);\n if (newContents.length > 0) {\n console.log(\n \" ! Both .skills/ and .pspm/skills/ have content. Manual merge required.\",\n );\n } else {\n // New dir exists but empty, remove it first\n await rm(newSkillsDir, { recursive: true, force: true });\n await rename(legacySkillsDir, newSkillsDir);\n console.log(\" ✓ Moved .skills/ → .pspm/skills/\");\n }\n }\n } catch {\n // New skills dir doesn't exist, safe to move\n await rename(legacySkillsDir, newSkillsDir);\n console.log(\" ✓ Moved .skills/ → .pspm/skills/\");\n }\n }\n }\n } catch {\n // Legacy directory doesn't exist\n }\n\n console.log(\"\");\n console.log(\"Migration complete!\");\n console.log(\"\");\n console.log(\n \"You can safely delete these legacy files if they still exist:\",\n );\n console.log(\" - skill-lock.json (replaced by pspm-lock.json)\");\n console.log(\" - .skills/ (replaced by .pspm/skills/)\");\n console.log(\"\");\n console.log(\"Update your .gitignore to include:\");\n console.log(\" .pspm/cache/\");\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n console.error(`Error: ${message}`);\n process.exit(1);\n }\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 range: string,\n availableVersions: string[],\n): string | null {\n // Sort versions in descending order\n const sorted = availableVersions\n .filter((v) => semver.valid(v))\n .sort((a, b) => semver.rcompare(a, b));\n\n // If no range or \"latest\" specified, return the highest version\n if (!range || range === \"latest\") {\n return sorted[0] ?? null;\n }\n\n // Find the highest version that satisfies the range\n return 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 return 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 if (!range || range === \"latest\") {\n return \"*\";\n }\n return range;\n}\n\n/**\n * Select the best version from a list based on a range\n */\nexport function selectVersion(\n versions: SkillVersion[],\n range?: string,\n): SkillVersion | null {\n const normalizedRange = normalizeVersionRange(range);\n const versionStrings = versions.map((v) => v.version);\n const resolved = resolveVersion(normalizedRange, versionStrings);\n\n if (!resolved) {\n return null;\n }\n\n return 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 return 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 return semver.gt(a, b);\n}\n\n/**\n * Get the latest version from a list\n */\nexport function getLatestVersion(versions: string[]): string | null {\n const valid = versions.filter((v) => semver.valid(v));\n if (valid.length === 0) return null;\n return valid.sort((a, b) => semver.rcompare(a, b))[0];\n}\n","import type {\n GitHubLockfileEntry,\n LocalLockfileEntry,\n PspmLockfile,\n PspmLockfileEntry,\n PspmManifest,\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 /** Full specifier (e.g., \"@user/alice/my-skill\", \"github:org/repo/path\") */\n name: string;\n /** Currently installed version */\n current: string;\n /** Latest version satisfying the version range from manifest */\n wanted: string | null;\n /** Absolute latest version available */\n latest: string | null;\n /** Package type */\n type: OutdatedPackageType;\n /** Whether the package is outdated (current < wanted or current < latest) */\n isOutdated: boolean;\n /** Whether wanted version is outdated compared to latest */\n wantedBehindLatest: boolean;\n /** Version range from manifest (if available) */\n versionRange?: string;\n /** Deprecation message if current version is deprecated */\n deprecated?: string;\n}\n\n/**\n * Configuration for the outdated checker\n */\nexport interface OutdatedConfig {\n /** Base registry URL */\n registryUrl: string;\n /** Optional API key for authentication */\n apiKey?: string;\n /** Optional GitHub token for checking GitHub packages */\n githubToken?: string;\n}\n\n/**\n * Options for checking outdated packages\n */\nexport interface CheckOutdatedOptions {\n /** The lockfile to check */\n lockfile: PspmLockfile;\n /** Optional manifest with version ranges */\n manifest?: PspmManifest;\n /** Whether to include up-to-date packages in results */\n includeUpToDate?: boolean;\n /** Whether to include local packages in results */\n includeLocal?: boolean;\n /** Specific packages to check (if not provided, checks all) */\n packages?: string[];\n}\n\n/**\n * API response for skill versions endpoint\n */\ninterface SkillVersionResponse {\n id: string;\n skillId: string;\n version: string;\n r2Key: string;\n checksum: string;\n manifest: Record<string, unknown>;\n publishedAt: string;\n deprecatedAt?: string | null;\n deprecationMessage?: string | null;\n}\n\n/**\n * Create an outdated checker instance\n */\nexport function createOutdatedChecker(config: OutdatedConfig) {\n const { registryUrl, apiKey, githubToken } = config;\n\n async function fetchWithAuth(url: string, token?: string): Promise<Response> {\n const headers: Record<string, string> = {};\n if (token) {\n headers.Authorization = `Bearer ${token}`;\n }\n\n const response = await fetch(url, { headers });\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(`Request failed (${response.status}): ${text}`);\n }\n\n return response;\n }\n\n /**\n * Fetch available versions for a registry package\n */\n async function fetchRegistryVersions(\n username: string,\n name: string,\n ): Promise<SkillVersionResponse[]> {\n const url = `${registryUrl}/@user/${username}/${name}/versions`;\n const response = await fetchWithAuth(url, apiKey);\n return (await response.json()) as SkillVersionResponse[];\n }\n\n /**\n * Check a single registry package for updates\n */\n async function checkRegistryPackage(\n specifier: string,\n entry: PspmLockfileEntry,\n versionRange?: string,\n ): Promise<OutdatedResult> {\n // Parse @user/{username}/{name}\n const match = specifier.match(/^@user\\/([^/]+)\\/([^/]+)$/);\n if (!match) {\n throw new Error(`Invalid registry specifier: ${specifier}`);\n }\n\n const [, username, name] = match;\n\n try {\n const versions = await fetchRegistryVersions(username, name);\n const versionStrings = versions.map((v) => v.version);\n\n // Resolve wanted (best matching range) and latest\n const range = versionRange || \"*\";\n const wanted = resolveVersion(range, versionStrings);\n const latest = getLatestVersion(versionStrings);\n\n // Check if current version is deprecated\n const currentVersionInfo = versions.find(\n (v) => v.version === entry.version,\n );\n const deprecated = currentVersionInfo?.deprecationMessage ?? undefined;\n\n // Determine if outdated\n const isOutdated =\n (wanted !== null && compareVersions(entry.version, wanted) < 0) ||\n (latest !== null && compareVersions(entry.version, latest) < 0);\n\n const wantedBehindLatest =\n wanted !== null &&\n latest !== null &&\n compareVersions(wanted, latest) < 0;\n\n return {\n name: specifier,\n current: entry.version,\n wanted,\n latest,\n type: \"registry\",\n isOutdated,\n wantedBehindLatest,\n versionRange: range,\n deprecated,\n };\n } catch {\n // If we can't fetch versions, return unknown state\n return {\n name: specifier,\n current: entry.version,\n wanted: null,\n latest: null,\n type: \"registry\",\n isOutdated: false,\n wantedBehindLatest: false,\n versionRange,\n };\n }\n }\n\n /**\n * Fetch latest commit for a GitHub ref\n */\n async function fetchGitHubLatestCommit(\n owner: string,\n repo: string,\n ref: string,\n ): Promise<string | null> {\n try {\n const url = `https://api.github.com/repos/${owner}/${repo}/commits/${ref}`;\n const response = await fetchWithAuth(url, githubToken);\n const data = (await response.json()) as { sha: string };\n return data.sha;\n } catch {\n return null;\n }\n }\n\n /**\n * Check a single GitHub package for updates\n */\n async function checkGitHubPackage(\n specifier: string,\n entry: GitHubLockfileEntry,\n ): Promise<OutdatedResult> {\n // Parse github:{owner}/{repo}[/{path}]\n const match = specifier.match(\n /^github:([a-zA-Z0-9_-]+)\\/([a-zA-Z0-9_.-]+)/,\n );\n if (!match) {\n throw new Error(`Invalid GitHub specifier: ${specifier}`);\n }\n\n const [, owner, repo] = match;\n const ref = entry.gitRef || \"HEAD\";\n\n const latestCommit = await fetchGitHubLatestCommit(owner, repo, ref);\n const currentShort = entry.gitCommit.slice(0, 7);\n const latestShort = latestCommit?.slice(0, 7) ?? null;\n\n const isOutdated =\n latestCommit !== null && entry.gitCommit !== latestCommit;\n\n return {\n name: specifier,\n current: currentShort,\n wanted: latestShort,\n latest: latestShort,\n type: \"github\",\n isOutdated,\n wantedBehindLatest: false,\n versionRange: ref,\n };\n }\n\n /**\n * Check a local package (always up-to-date)\n */\n function checkLocalPackage(\n specifier: string,\n _entry: LocalLockfileEntry,\n ): OutdatedResult {\n return {\n name: specifier,\n current: \"local\",\n wanted: null,\n latest: null,\n type: \"local\",\n isOutdated: false,\n wantedBehindLatest: false,\n };\n }\n\n /**\n * Check all packages for updates\n */\n async function checkOutdated(\n options: CheckOutdatedOptions,\n ): Promise<OutdatedResult[]> {\n const {\n lockfile,\n manifest,\n includeUpToDate = false,\n includeLocal = false,\n packages: filterPackages,\n } = options;\n\n const results: OutdatedResult[] = [];\n\n // Check registry packages\n const registryPackages = lockfile.packages || lockfile.skills || {};\n const registryDeps = manifest?.dependencies || {};\n\n const registryEntries = Object.entries(registryPackages).filter(\n ([specifier]) => !filterPackages || filterPackages.includes(specifier),\n );\n\n const registryResults = await Promise.all(\n registryEntries.map(([specifier, entry]) =>\n checkRegistryPackage(\n specifier,\n entry as PspmLockfileEntry,\n registryDeps[specifier],\n ),\n ),\n );\n results.push(...registryResults);\n\n // Check GitHub packages\n const githubPackages = lockfile.githubPackages || {};\n\n const githubEntries = Object.entries(githubPackages).filter(\n ([specifier]) => !filterPackages || filterPackages.includes(specifier),\n );\n\n const githubResults = await Promise.all(\n githubEntries.map(([specifier, entry]) =>\n checkGitHubPackage(specifier, entry as GitHubLockfileEntry),\n ),\n );\n results.push(...githubResults);\n\n // Check local packages (if requested)\n if (includeLocal) {\n const localPackages = lockfile.localPackages || {};\n\n const localEntries = Object.entries(localPackages).filter(\n ([specifier]) => !filterPackages || filterPackages.includes(specifier),\n );\n\n for (const [specifier, entry] of localEntries) {\n results.push(checkLocalPackage(specifier, entry as LocalLockfileEntry));\n }\n }\n\n // Filter results\n if (!includeUpToDate) {\n return results.filter((r) => r.isOutdated);\n }\n\n return results;\n }\n\n return {\n checkOutdated,\n checkRegistryPackage,\n checkGitHubPackage,\n checkLocalPackage,\n fetchRegistryVersions,\n };\n}\n\n/**\n * Convenience function to check outdated packages\n */\nexport async function checkOutdated(\n config: OutdatedConfig,\n options: CheckOutdatedOptions,\n): Promise<OutdatedResult[]> {\n const checker = createOutdatedChecker(config);\n return checker.checkOutdated(options);\n}\n","import {\n checkOutdated as checkOutdatedFn,\n type 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 json?: boolean;\n all?: boolean;\n}\n\nexport async function outdated(\n packages: string[],\n options: OutdatedOptions,\n): Promise<void> {\n try {\n const lockfile = await readLockfile();\n if (!lockfile) {\n console.log(\"No skills installed.\");\n return;\n }\n\n const hasPackages =\n Object.keys(lockfile.packages ?? lockfile.skills ?? {}).length > 0 ||\n Object.keys(lockfile.githubPackages ?? {}).length > 0 ||\n Object.keys(lockfile.localPackages ?? {}).length > 0;\n\n if (!hasPackages) {\n console.log(\"No skills installed.\");\n return;\n }\n\n const config = await resolveConfig();\n const registryUrl = config.registryUrl;\n const apiKey = getTokenForRegistry(config, registryUrl);\n const githubToken = process.env.GITHUB_TOKEN;\n\n const manifest = await readManifest();\n\n console.log(\"Checking for outdated packages...\\n\");\n\n const results = await checkOutdatedFn(\n { registryUrl, apiKey, githubToken },\n {\n lockfile,\n manifest: manifest ?? undefined,\n includeUpToDate: options.all,\n packages: packages.length > 0 ? packages : undefined,\n },\n );\n\n if (results.length === 0) {\n console.log(\"All skills are up to date.\");\n return;\n }\n\n if (options.json) {\n console.log(JSON.stringify(results, null, 2));\n } else {\n printTable(results);\n }\n\n // Show deprecation warnings\n const deprecated = results.filter((r) => r.deprecated);\n if (deprecated.length > 0) {\n console.log(\"\");\n for (const r of deprecated) {\n console.log(`\\x1b[33m⚠ ${r.name}: ${r.deprecated}\\x1b[0m`);\n }\n }\n\n // Exit code 1 if any outdated packages (useful for CI)\n const hasOutdated = results.some((r) => r.isOutdated);\n if (hasOutdated) {\n process.exitCode = 1;\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n console.error(`Error: ${message}`);\n process.exit(1);\n }\n}\n\nfunction printTable(results: OutdatedResult[]): void {\n // Calculate column widths\n const headers = [\"Package\", \"Current\", \"Wanted\", \"Latest\", \"Type\"];\n const rows = results.map((r) => [\n r.name,\n r.current,\n r.wanted ?? \"—\",\n r.latest ?? \"—\",\n r.type,\n ]);\n\n const widths = headers.map((h, i) =>\n Math.max(h.length, ...rows.map((row) => row[i].length)),\n );\n\n // Print header\n const headerLine = headers.map((h, i) => h.padEnd(widths[i])).join(\" \");\n console.log(headerLine);\n console.log(widths.map((w) => \"─\".repeat(w)).join(\"──\"));\n\n // Print rows\n for (const row of rows) {\n const line = row.map((cell, i) => cell.padEnd(widths[i])).join(\" \");\n console.log(line);\n }\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, publishOrgSkill, publishSkill } from \"@/api-client\";\nimport { getRegistryUrl, requireApiKey } from \"@/config\";\nimport { extractApiErrorMessage } from \"@/errors\";\nimport {\n ALWAYS_IGNORED,\n DEFAULT_SKILL_FILES,\n getExcludeArgsForRsync,\n type IgnoreLoadResult,\n loadIgnorePatterns,\n type ManifestDetectionResult,\n type PspmManifest,\n validateManifest,\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 return new Promise((resolve) => {\n const rl = createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n rl.question(`${question} (y/N) `, (answer) => {\n rl.close();\n const normalized = answer.trim().toLowerCase();\n resolve(normalized === \"y\" || normalized === \"yes\");\n });\n });\n}\n\n/**\n * Detect and read manifest file (pspm.json or package.json)\n */\nasync function detectManifest(): Promise<ManifestDetectionResult> {\n const cwd = process.cwd();\n\n // Try pspm.json first (preferred)\n const pspmJsonPath = join(cwd, \"pspm.json\");\n try {\n const content = await readFile(pspmJsonPath, \"utf-8\");\n const manifest = JSON.parse(content) as PspmManifest;\n return { type: \"pspm.json\", manifest, path: pspmJsonPath };\n } catch {\n // pspm.json not found, try package.json\n }\n\n // Fall back to package.json\n const packageJsonPath = join(cwd, \"package.json\");\n try {\n const content = await readFile(packageJsonPath, \"utf-8\");\n const packageJson = JSON.parse(content);\n\n // Convert package.json to PspmManifest format\n const manifest: PspmManifest = {\n name: packageJson.name,\n version: packageJson.version,\n description: packageJson.description,\n author:\n typeof packageJson.author === \"string\"\n ? packageJson.author\n : packageJson.author?.name,\n license: packageJson.license,\n files: packageJson.files,\n dependencies: packageJson.dependencies,\n };\n\n return { type: \"package.json\", manifest, path: packageJsonPath };\n } catch {\n throw new Error(\"No pspm.json or package.json found in current directory\");\n }\n}\n\n/**\n * Format bytes to human readable string\n */\nfunction formatBytes(bytes: number): string {\n if (bytes < 1024) return `${bytes}B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)}kB`;\n return `${(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 dir: string,\n baseDir: string,\n ignoreResult?: IgnoreLoadResult,\n): Promise<Array<{ path: string; size: number }>> {\n const results: Array<{ path: string; size: number }> = [];\n\n try {\n const entries = await readdir(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = join(dir, entry.name);\n const relativePath = relative(baseDir, fullPath);\n\n // Skip always-ignored directories (node_modules, .git, etc.)\n if (ALWAYS_IGNORED.includes(entry.name)) {\n continue;\n }\n\n // Check against ignore patterns if available\n if (ignoreResult?.ig) {\n // For directories, add trailing slash for proper matching\n const pathToCheck = entry.isDirectory()\n ? `${relativePath}/`\n : relativePath;\n if (ignoreResult.ig.ignores(pathToCheck)) {\n continue;\n }\n }\n\n if (entry.isDirectory()) {\n const subFiles = await getFilesWithSizes(\n fullPath,\n baseDir,\n ignoreResult,\n );\n results.push(...subFiles);\n } else {\n const fileStat = await stat(fullPath);\n results.push({ path: relativePath, size: fileStat.size });\n }\n }\n } catch {\n // Directory doesn't exist or can't be read\n }\n\n return results;\n}\n\nexport interface PublishOptions {\n bump?: \"major\" | \"minor\" | \"patch\";\n tag?: string;\n /** Set package visibility during publish (required) */\n access: \"public\" | \"private\" | \"team\";\n /** Publish under an organization namespace */\n org?: string;\n}\n\nexport async function publishCommand(options: PublishOptions): Promise<void> {\n try {\n const apiKey = await requireApiKey();\n const registryUrl = await getRegistryUrl();\n\n // Detect and read manifest (pspm.json preferred, package.json fallback)\n const detection = await detectManifest();\n const manifest = detection.manifest;\n\n // Warn if using package.json instead of pspm.json\n if (detection.type === \"package.json\") {\n console.log(\"pspm warn Using package.json instead of pspm.json\");\n console.log(\n \"pspm warn Run 'pspm init' to create a dedicated pspm.json manifest\",\n );\n console.log(\"\");\n }\n\n // Validate manifest\n const validation = validateManifest(manifest);\n if (!validation.valid) {\n console.error(`Error: ${validation.error}`);\n process.exit(1);\n }\n\n // Validate SKILL.md exists\n const skillMdPath = join(process.cwd(), \"SKILL.md\");\n try {\n await stat(skillMdPath);\n } catch {\n console.error(\n \"Error: SKILL.md is required. Create a SKILL.md file with your skill's documentation before publishing.\",\n );\n process.exit(1);\n }\n\n // Warn and confirm if publishing as public\n if (options.access === \"public\") {\n console.log(\"\");\n console.log(\"⚠️ Warning: You are about to publish this skill as PUBLIC.\");\n console.log(\n \" Once a skill is public, it CANNOT be made private again.\",\n );\n console.log(\" This action is irreversible.\");\n console.log(\"\");\n\n const confirmed = await confirm(\"Do you want to continue?\");\n if (!confirmed) {\n console.log(\"Publish cancelled.\");\n process.exit(0);\n }\n console.log(\"\");\n }\n\n // Create a mutable copy for version bumping\n const packageJson: SkillManifest = {\n name: manifest.name,\n version: manifest.version,\n description: manifest.description,\n files: manifest.files,\n dependencies: manifest.dependencies,\n };\n\n // Handle version bump if requested\n if (options.bump) {\n const semver = await import(\"semver\");\n const newVersion = semver.default.inc(packageJson.version, options.bump);\n if (!newVersion) {\n console.error(\n `Error: Failed to bump version from ${packageJson.version}`,\n );\n process.exit(1);\n }\n packageJson.version = newVersion;\n console.log(`Bumped version to ${newVersion}`);\n }\n\n // Load ignore patterns (.pspmignore or .gitignore fallback)\n const ignoreResult = await loadIgnorePatterns();\n if (ignoreResult.source) {\n console.log(\n `pspm notice Using ${ignoreResult.source} for ignore patterns`,\n );\n }\n\n // Build exclude arguments for rsync and tar using loaded patterns\n const excludeArgs = getExcludeArgsForRsync(ignoreResult.patterns);\n\n // Create tarball using npm pack (or tar directly)\n // Sanitize name for filename (replace @ and / with -)\n const safeName = packageJson.name.replace(/[@/]/g, \"-\").replace(/^-+/, \"\");\n const tarballName = `${safeName}-${packageJson.version}.tgz`;\n const tempDir = join(process.cwd(), \".pspm-publish\");\n\n // Create tarball\n try {\n await exec(`rm -rf \"${tempDir}\" && mkdir -p \"${tempDir}\"`);\n\n // Get files to include (use 'files' from manifest or default)\n const files = packageJson.files || [...DEFAULT_SKILL_FILES];\n\n // Create the tarball structure: package/{files}\n await exec(`mkdir -p \"${tempDir}/package\"`);\n\n for (const file of files) {\n try {\n // Use rsync to copy while excluding ignored patterns\n await exec(\n `rsync -a ${excludeArgs} \"${file}\" \"${tempDir}/package/\" 2>/dev/null || true`,\n );\n } catch {\n // Ignore files that don't exist\n }\n }\n\n // Always include the manifest file used for publishing\n if (detection.type === \"pspm.json\") {\n await exec(`cp pspm.json \"${tempDir}/package/\"`);\n // Also include package.json if it exists (for npm compatibility)\n try {\n await stat(join(process.cwd(), \"package.json\"));\n await exec(\n `cp package.json \"${tempDir}/package/\" 2>/dev/null || true`,\n );\n } catch {\n // No package.json, that's fine\n }\n } else {\n // Using package.json as manifest\n await exec(`cp package.json \"${tempDir}/package/\"`);\n }\n\n // Get list of files that will be included and their sizes\n // Apply ignore patterns to filter out ignored files\n const packageDir = join(tempDir, \"package\");\n const tarballContents = await getFilesWithSizes(\n packageDir,\n packageDir,\n ignoreResult,\n );\n const unpackedSize = tarballContents.reduce((acc, f) => acc + f.size, 0);\n\n // Create tarball (excluding ignored patterns)\n const tarballPath = join(tempDir, tarballName);\n await exec(\n `tar -czf \"${tarballPath}\" -C \"${tempDir}\" ${excludeArgs} package`,\n );\n\n // Read tarball and calculate hashes\n const tarballBuffer = await readFile(tarballPath);\n const tarballBase64 = tarballBuffer.toString(\"base64\");\n const tarballSize = tarballBuffer.length;\n\n // Calculate shasum (sha1) and integrity (sha512)\n const shasum = createHash(\"sha1\").update(tarballBuffer).digest(\"hex\");\n const integrityHash = createHash(\"sha512\")\n .update(tarballBuffer)\n .digest(\"base64\");\n const integrity = `sha512-${integrityHash}`;\n\n // Enforce max tarball size (10MB)\n const MAX_TARBALL_SIZE = 10 * 1024 * 1024;\n if (tarballSize > MAX_TARBALL_SIZE) {\n console.error(\"\");\n console.error(\n `Error: Package size ${formatBytes(tarballSize)} exceeds the maximum allowed size of ${formatBytes(MAX_TARBALL_SIZE)}.`,\n );\n console.error(\"\");\n console.error(\"To reduce the package size:\");\n console.error(\n ' - Add a \"files\" field in your manifest to include only necessary files',\n );\n console.error(\" - Add patterns to .pspmignore to exclude large files\");\n console.error(\n \" - Remove build artifacts, tests, and documentation from the package\",\n );\n process.exit(1);\n }\n\n // Print publish preview\n console.log(\"\");\n console.log(\"pspm notice\");\n console.log(`pspm notice 📦 ${packageJson.name}@${packageJson.version}`);\n console.log(\"pspm notice === Tarball Contents ===\");\n\n // Sort files by size descending for display\n tarballContents.sort((a, b) => b.size - a.size);\n for (const file of tarballContents) {\n console.log(\n `pspm notice ${formatBytes(file.size).padStart(8)} ${file.path}`,\n );\n }\n\n console.log(\"pspm notice === Tarball Details ===\");\n console.log(`pspm notice name: ${packageJson.name}`);\n console.log(`pspm notice version: ${packageJson.version}`);\n console.log(`pspm notice filename: ${tarballName}`);\n console.log(`pspm notice package size: ${formatBytes(tarballSize)}`);\n console.log(`pspm notice unpacked size: ${formatBytes(unpackedSize)}`);\n console.log(`pspm notice shasum: ${shasum}`);\n console.log(\n `pspm notice integrity: ${integrity.substring(0, 50)}...`,\n );\n console.log(`pspm notice total files: ${tarballContents.length}`);\n console.log(\"pspm notice\");\n\n // Ask user to confirm before publishing\n const confirmed = await confirm(\n `Publish ${packageJson.name}@${packageJson.version} to ${registryUrl}?`,\n );\n if (!confirmed) {\n console.log(\"Publish cancelled.\");\n process.exit(0);\n }\n\n console.log(\"\");\n console.log(`pspm notice Publishing to ${registryUrl} with tag latest`);\n\n // Configure SDK and publish\n configure({ registryUrl, apiKey });\n\n let response: {\n status: number;\n data?: any;\n error?: any;\n };\n\n if (options.org) {\n // Publish under org namespace\n response = await publishOrgSkill(options.org, {\n manifest: packageJson,\n tarballBase64,\n visibility: options.access,\n });\n } else {\n // Publish under user namespace\n response = await publishSkill({\n manifest: packageJson,\n tarballBase64,\n visibility: options.access,\n });\n }\n\n if (response.status !== 200) {\n const errorMessage = extractApiErrorMessage(\n { status: response.status, data: response.data },\n \"Publish failed\",\n );\n\n // Check for version conflict errors\n if (\n errorMessage.includes(\"must be greater than\") ||\n errorMessage.includes(\"already exists\")\n ) {\n console.error(\"pspm error code E403\");\n console.error(\n `pspm error 403 403 Forbidden - You cannot publish over the previously published versions: ${packageJson.version}.`,\n );\n }\n\n throw new Error(errorMessage);\n }\n\n const result = response.data;\n const visibility = result.skill.visibility;\n const visibilityIcon =\n visibility === \"public\" ? \"🌐\" : visibility === \"team\" ? \"👥\" : \"🔒\";\n const namespace = options.org\n ? \"org\"\n : ((result.skill as any).namespace ?? \"user\");\n const owner = options.org ?? result.skill.username;\n console.log(\n `+ @${namespace}/${owner}/${result.skill.name}@${result.version.version}`,\n );\n console.log(`Checksum: ${result.version.checksum}`);\n console.log(`Visibility: ${visibilityIcon} ${visibility}`);\n\n if (visibility === \"public\") {\n console.log(\n \"Note: Public packages cannot be made private. This is irreversible.\",\n );\n }\n } finally {\n // Cleanup\n await exec(`rm -rf \"${tempDir}\"`).catch(() => {});\n }\n } catch (error) {\n if (error instanceof Error) {\n console.error(`Error: ${error.message}`);\n } else {\n console.error(`Error: ${String(error)}`);\n }\n process.exit(1);\n }\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 getGitHubSkillName,\n isGitHubSpecifier,\n isRegistrySpecifier,\n parseGitHubSpecifier,\n parseRegistrySpecifier,\n} from \"@/lib/index\";\nimport {\n listLockfileGitHubPackages,\n listLockfileSkills,\n removeFromLockfile,\n removeGitHubFromLockfile,\n} from \"@/lockfile\";\nimport {\n readManifest,\n removeDependency,\n removeGitHubDependency,\n} from \"@/manifest\";\nimport { getGitHubSkillPath, removeAgentSymlinks } from \"@/symlinks\";\n\nexport async function remove(nameOrSpecifier: string): Promise<void> {\n try {\n // Read manifest for agent config overrides\n const manifest = await readManifest();\n const agentConfigs = manifest?.agents;\n const agents = getAvailableAgents(agentConfigs);\n\n // Determine type of specifier\n if (isGitHubSpecifier(nameOrSpecifier)) {\n await removeGitHub(nameOrSpecifier, agents, agentConfigs);\n } else if (isRegistrySpecifier(nameOrSpecifier)) {\n await removeRegistry(nameOrSpecifier, agents, agentConfigs);\n } else {\n // Short name - try to find in either registry or GitHub skills\n await removeByShortName(nameOrSpecifier, agents, agentConfigs);\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n console.error(`Error: ${message}`);\n process.exit(1);\n }\n}\n\n/**\n * Remove a registry skill by full specifier.\n */\nasync function removeRegistry(\n specifier: string,\n agents: string[],\n agentConfigs?: Record<string, { skillsDir: string }>,\n): Promise<void> {\n const parsed = parseRegistrySpecifier(specifier);\n if (!parsed) {\n console.error(`Error: Invalid skill specifier: ${specifier}`);\n process.exit(1);\n }\n\n const { namespace, owner, name } = parsed;\n const fullName = `@${namespace}/${owner}/${name}`;\n\n console.log(`Removing ${fullName}...`);\n\n // Remove from lockfile\n const removedFromLockfile = await removeFromLockfile(fullName);\n\n // Remove from pspm.json dependencies\n const removedFromManifest = await removeDependency(fullName);\n\n if (!removedFromLockfile && !removedFromManifest) {\n console.error(`Error: ${fullName} not found in lockfile or pspm.json`);\n process.exit(1);\n }\n\n // Remove symlinks from all agents\n await removeAgentSymlinks(name, {\n agents,\n projectRoot: process.cwd(),\n agentConfigs,\n });\n\n // Remove from disk\n const skillsDir = getSkillsDir();\n const destDir =\n namespace === \"org\"\n ? join(skillsDir, \"_org\", owner, name)\n : join(skillsDir, owner, name);\n\n try {\n await rm(destDir, { recursive: true, force: true });\n } catch {\n // Ignore errors if directory doesn't exist\n }\n\n console.log(`Removed ${fullName}`);\n}\n\n/**\n * Remove a GitHub skill by specifier.\n */\nasync function removeGitHub(\n specifier: string,\n agents: string[],\n agentConfigs?: Record<string, { skillsDir: string }>,\n): Promise<void> {\n const parsed = parseGitHubSpecifier(specifier);\n if (!parsed) {\n console.error(`Error: Invalid GitHub specifier: ${specifier}`);\n process.exit(1);\n }\n\n // Build the lockfile key (without ref)\n const lockfileKey = parsed.path\n ? `github:${parsed.owner}/${parsed.repo}/${parsed.path}`\n : `github:${parsed.owner}/${parsed.repo}`;\n\n console.log(`Removing ${lockfileKey}...`);\n\n // Remove from lockfile\n const removedFromLockfile = await removeGitHubFromLockfile(lockfileKey);\n\n // Remove from pspm.json githubDependencies\n const removedFromManifest = await removeGitHubDependency(lockfileKey);\n\n if (!removedFromLockfile && !removedFromManifest) {\n console.error(`Error: ${lockfileKey} not found in lockfile or pspm.json`);\n process.exit(1);\n }\n\n // Remove symlinks from all agents\n const skillName = getGitHubSkillName(parsed);\n await removeAgentSymlinks(skillName, {\n agents,\n projectRoot: process.cwd(),\n agentConfigs,\n });\n\n // Remove from disk\n const skillsDir = getSkillsDir();\n const destPath = getGitHubSkillPath(parsed.owner, parsed.repo, parsed.path);\n const destDir = join(skillsDir, \"..\", destPath);\n\n try {\n await rm(destDir, { recursive: true, force: true });\n } catch {\n // Ignore errors if directory doesn't exist\n }\n\n console.log(`Removed ${lockfileKey}`);\n}\n\n/**\n * Remove a skill by short name (searches both registry and GitHub skills).\n */\nasync function removeByShortName(\n shortName: string,\n agents: string[],\n agentConfigs?: Record<string, { skillsDir: string }>,\n): Promise<void> {\n // First try to find in registry skills\n const registrySkills = await listLockfileSkills();\n const foundRegistry = registrySkills.find((s) => {\n const parsed = parseRegistrySpecifier(s.name);\n return parsed && parsed.name === shortName;\n });\n\n if (foundRegistry) {\n await removeRegistry(foundRegistry.name, agents, agentConfigs);\n return;\n }\n\n // Try to find in GitHub skills\n const githubSkills = await listLockfileGitHubPackages();\n const foundGitHub = githubSkills.find((s) => {\n const parsed = parseGitHubSpecifier(s.specifier);\n if (!parsed) return false;\n return getGitHubSkillName(parsed) === shortName;\n });\n\n if (foundGitHub) {\n await removeGitHub(foundGitHub.specifier, agents, agentConfigs);\n return;\n }\n\n console.error(`Error: Skill \"${shortName}\" not found in lockfile`);\n process.exit(1);\n}\n","/**\n * Search command - Search and discover skills from the registry.\n *\n * Queries the public explore API with optional search term and\n * displays results in a formatted table.\n */\n\nimport { configure } from \"@/api-client\";\nimport { getTokenForRegistry, resolveConfig } from \"@/config\";\nimport { explorePublicSkills } from \"@/sdk/generated\";\n\nexport interface SearchOptions {\n /** Sort results: downloads, recent, name */\n sort?: \"downloads\" | \"recent\" | \"name\";\n /** Maximum number of results */\n limit?: number;\n /** Output as JSON */\n json?: boolean;\n}\n\nexport async function search(\n query: string | undefined,\n options: SearchOptions,\n): Promise<void> {\n try {\n // Configure SDK (no auth needed for public explore)\n const config = await resolveConfig();\n const apiKey = getTokenForRegistry(config, config.registryUrl);\n configure({ registryUrl: config.registryUrl, apiKey });\n\n const limit = options.limit ?? 20;\n const sort = options.sort ?? \"downloads\";\n\n if (!options.json) {\n if (query) {\n console.log(`Searching for \"${query}\"...\\n`);\n } else {\n console.log(\"Browsing skills...\\n\");\n }\n }\n\n const response = await explorePublicSkills({\n search: query,\n sort,\n limit,\n page: 1,\n });\n\n if (response.status !== 200) {\n console.error(\"Error: Failed to search skills\");\n process.exit(1);\n }\n\n const { skills, total } = response.data;\n\n if (skills.length === 0) {\n if (query) {\n console.log(`No skills found matching \"${query}\".`);\n } else {\n console.log(\"No skills published yet.\");\n }\n return;\n }\n\n if (options.json) {\n console.log(JSON.stringify(skills, null, 2));\n return;\n }\n\n // Display results\n for (const skill of skills) {\n const name = `@${(skill as any).namespace ?? \"user\"}/${skill.username}/${skill.name}`;\n const desc = skill.description\n ? ` - ${skill.description.slice(0, 80)}${skill.description.length > 80 ? \"...\" : \"\"}`\n : \"\";\n const downloads =\n skill.totalDownloads > 0\n ? ` (${formatDownloads(skill.totalDownloads)} downloads)`\n : \"\";\n\n console.log(` ${name}${downloads}`);\n if (desc) {\n console.log(` ${desc.trim()}`);\n }\n }\n\n // Summary\n const showing = Math.min(skills.length, limit);\n if (total > showing) {\n console.log(`\\nShowing ${showing} of ${total} results.`);\n } else {\n console.log(`\\n${total} skill(s) found.`);\n }\n\n // Hint for install\n if (skills.length > 0) {\n const first = skills[0];\n console.log(\n `\\nInstall with: pspm add @${(first as any).namespace ?? \"user\"}/${first.username}/${first.name}`,\n );\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n console.error(`Error: ${message}`);\n process.exit(1);\n }\n}\n\n/**\n * Format download count for display (e.g., 1234 -> \"1.2k\")\n */\nfunction formatDownloads(count: number): string {\n if (count >= 1_000_000) {\n return `${(count / 1_000_000).toFixed(1)}M`;\n }\n if (count >= 1_000) {\n return `${(count / 1_000).toFixed(1)}k`;\n }\n return String(count);\n}\n","import { configure, deleteSkill, deleteSkillVersion } from \"@/api-client\";\nimport { getRegistryUrl, requireApiKey } from \"@/config\";\nimport { extractApiErrorMessage } from \"@/errors\";\nimport {\n generateRegistryIdentifier,\n parseRegistrySpecifier,\n} from \"@/lib/index\";\n\nexport interface UnpublishOptions {\n force?: boolean;\n}\n\nexport async function unpublish(\n specifier: string,\n options: UnpublishOptions,\n): Promise<void> {\n try {\n const apiKey = await requireApiKey();\n const registryUrl = await getRegistryUrl();\n\n // Parse the specifier\n const parsed = parseRegistrySpecifier(specifier);\n if (!parsed) {\n console.error(\n `Error: Invalid skill specifier \"${specifier}\". Use format: @user/{username}/{name}[@{version}] or @org/{orgname}/{name}[@{version}]`,\n );\n process.exit(1);\n }\n\n const { owner, name, versionRange } = parsed;\n const fullName = generateRegistryIdentifier({\n namespace: parsed.namespace,\n owner,\n name,\n });\n\n // Configure SDK (use direct REST endpoints, not oRPC)\n configure({ registryUrl, apiKey });\n\n if (versionRange) {\n // Delete specific version\n console.log(`Unpublishing ${specifier}...`);\n\n if (!options.force) {\n console.error(\n \"Warning: This action is irreversible. Use --force to confirm.\",\n );\n process.exit(1);\n }\n\n const response = await deleteSkillVersion(owner, name, versionRange);\n if (response.status !== 200) {\n const errorMessage = extractApiErrorMessage(\n response,\n \"Failed to unpublish. Version may not exist.\",\n );\n console.error(`Error: ${errorMessage}`);\n process.exit(1);\n }\n console.log(`Unpublished ${fullName}@${versionRange}`);\n } else {\n // Delete entire skill\n console.log(`Unpublishing all versions of ${fullName}...`);\n\n if (!options.force) {\n console.error(\n \"Warning: This will delete ALL versions. Use --force to confirm.\",\n );\n process.exit(1);\n }\n\n const response = await deleteSkill(owner, name);\n if (response.status !== 200) {\n const errorMessage = extractApiErrorMessage(\n response,\n \"Failed to unpublish. Skill may not exist.\",\n );\n console.error(`Error: ${errorMessage}`);\n process.exit(1);\n }\n console.log(`Unpublished ${fullName} (all versions)`);\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n console.error(`Error: ${message}`);\n process.exit(1);\n }\n}\n","import { configure, listSkillVersions } from \"@/api-client\";\nimport { getTokenForRegistry, resolveConfig } from \"@/config\";\nimport { extractApiErrorMessage } from \"@/errors\";\nimport { parseRegistrySpecifier, resolveVersion } from \"@/lib/index\";\nimport { listLockfileSkills } from \"@/lockfile\";\nimport { add } from \"./add\";\n\nexport interface UpdateOptions {\n dryRun?: boolean;\n}\n\nexport async function update(options: UpdateOptions): Promise<void> {\n try {\n const config = await resolveConfig();\n const registryUrl = config.registryUrl;\n const apiKey = getTokenForRegistry(config, registryUrl);\n\n const skills = await listLockfileSkills();\n\n if (skills.length === 0) {\n console.log(\"No skills installed.\");\n return;\n }\n\n // Configure SDK - apiKey may be undefined for public packages\n configure({ registryUrl, apiKey });\n\n const updates: Array<{\n name: string;\n current: string;\n latest: string;\n }> = [];\n\n console.log(\"Checking for updates...\\n\");\n\n for (const { name, entry } of skills) {\n const parsed = parseRegistrySpecifier(name);\n if (!parsed) continue;\n\n try {\n const versionsResponse = await listSkillVersions(\n parsed.owner,\n parsed.name,\n );\n if (versionsResponse.status !== 200) {\n const errorMessage = extractApiErrorMessage(\n versionsResponse,\n \"Failed to fetch versions\",\n );\n console.warn(` Warning: ${name}: ${errorMessage}`);\n continue;\n }\n const versions = versionsResponse.data;\n if (versions.length === 0) continue;\n\n const versionStrings = versions.map(\n (v: { version: string }) => v.version,\n );\n const latest = resolveVersion(\"*\", versionStrings);\n\n if (latest && latest !== entry.version) {\n updates.push({\n name,\n current: entry.version,\n latest,\n });\n }\n } catch {\n console.warn(` Warning: Could not check updates for ${name}`);\n }\n }\n\n if (updates.length === 0) {\n console.log(\"All skills are up to date.\");\n return;\n }\n\n console.log(\"Updates available:\\n\");\n for (const { name, current, latest } of updates) {\n console.log(` ${name}: ${current} -> ${latest}`);\n }\n\n if (options.dryRun) {\n console.log(\"\\nDry run - no changes made.\");\n return;\n }\n\n console.log(\"\\nUpdating...\\n\");\n\n for (const { name: pkgName, latest } of updates) {\n const parsed = parseRegistrySpecifier(pkgName);\n if (!parsed) continue;\n\n const specifier = `${pkgName}@${latest}`;\n\n await add([specifier], {});\n }\n\n console.log(\"\\nAll skills updated.\");\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n console.error(`Error: ${message}`);\n process.exit(1);\n }\n}\n","import { execSync } from \"node:child_process\";\nimport * as semver from \"semver\";\n\nexport async function upgrade(): Promise<void> {\n const packageName = \"@anytio/pspm\";\n\n try {\n // Get current version from package.json (already loaded at startup)\n const currentVersion = getCurrentVersion();\n\n // Check latest version from npm registry\n console.log(\"Checking for updates...\\n\");\n const latestVersion = getLatestVersion(packageName);\n\n if (!latestVersion) {\n console.error(\"Error: Could not fetch latest version from registry.\");\n process.exit(1);\n }\n\n if (\n semver.valid(currentVersion) &&\n semver.valid(latestVersion) &&\n !semver.gt(latestVersion, currentVersion)\n ) {\n console.log(`Already on the latest version: ${currentVersion}`);\n return;\n }\n\n console.log(` Current version: ${currentVersion}`);\n console.log(` Latest version: ${latestVersion}\\n`);\n\n // Detect which package manager was used to install\n const pm = detectPackageManager();\n const installCmd = getInstallCommand(pm, packageName, latestVersion);\n\n console.log(`Upgrading via ${pm}...\\n`);\n console.log(` $ ${installCmd}\\n`);\n\n execSync(installCmd, { stdio: \"inherit\" });\n\n console.log(`\\nSuccessfully upgraded to ${latestVersion}`);\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n console.error(`Error: ${message}`);\n process.exit(1);\n }\n}\n\nfunction getCurrentVersion(): string {\n try {\n const output = execSync(\"pspm --version\", {\n encoding: \"utf-8\",\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n }).trim();\n return output;\n } catch {\n return \"unknown\";\n }\n}\n\nfunction getLatestVersion(packageName: string): string | null {\n try {\n const output = execSync(`npm view ${packageName} version`, {\n encoding: \"utf-8\",\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n }).trim();\n return output || null;\n } catch {\n return null;\n }\n}\n\nfunction detectPackageManager(): \"pnpm\" | \"npm\" | \"yarn\" | \"bun\" {\n // Check if installed globally via specific package managers\n try {\n const pnpmList = execSync(\"pnpm list -g --depth=0 2>/dev/null\", {\n encoding: \"utf-8\",\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n if (pnpmList.includes(\"@anytio/pspm\")) return \"pnpm\";\n } catch {}\n\n try {\n const bunList = execSync(\"bun pm ls -g 2>/dev/null\", {\n encoding: \"utf-8\",\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n if (bunList.includes(\"@anytio/pspm\")) return \"bun\";\n } catch {}\n\n try {\n const yarnList = execSync(\"yarn global list 2>/dev/null\", {\n encoding: \"utf-8\",\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n if (yarnList.includes(\"@anytio/pspm\")) return \"yarn\";\n } catch {}\n\n // Default to npm\n return \"npm\";\n}\n\nfunction getInstallCommand(\n pm: \"pnpm\" | \"npm\" | \"yarn\" | \"bun\",\n packageName: string,\n version: string,\n): string {\n switch (pm) {\n case \"pnpm\":\n return `pnpm add -g ${packageName}@${version}`;\n case \"yarn\":\n return `yarn global add ${packageName}@${version}`;\n case \"bun\":\n return `bun add -g ${packageName}@${version}`;\n case \"npm\":\n return `npm install -g ${packageName}@${version}`;\n }\n}\n","import semver from \"semver\";\nimport { getManifestPath, readManifest, writeManifest } from \"@/manifest\";\n\nexport type VersionBump = \"major\" | \"minor\" | \"patch\";\n\nexport interface VersionOptions {\n /** If true, don't actually write the file (just show what would happen) */\n dryRun?: 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 bump: VersionBump,\n options: VersionOptions = {},\n): Promise<void> {\n try {\n // Read existing manifest\n const manifest = await readManifest();\n\n if (!manifest) {\n console.error(\"Error: No pspm.json found in current directory.\");\n console.error(\"Run 'pspm init' to create one.\");\n process.exit(1);\n }\n\n if (!manifest.version) {\n console.error(\"Error: pspm.json does not have a version field.\");\n console.error(\n 'Add a version field (e.g., \"version\": \"0.1.0\") to your pspm.json.',\n );\n process.exit(1);\n }\n\n // Validate current version\n if (!semver.valid(manifest.version)) {\n console.error(\n `Error: Current version \"${manifest.version}\" is not valid semver.`,\n );\n console.error(\n 'Fix the version in pspm.json to be valid semver (e.g., \"1.0.0\").',\n );\n process.exit(1);\n }\n\n // Bump the version\n const newVersion = semver.inc(manifest.version, bump);\n\n if (!newVersion) {\n console.error(`Error: Failed to bump version from ${manifest.version}`);\n process.exit(1);\n }\n\n if (options.dryRun) {\n console.log(`Would bump version: ${manifest.version} → ${newVersion}`);\n return;\n }\n\n // Update manifest with new version\n manifest.version = newVersion;\n await writeManifest(manifest);\n\n console.log(`v${newVersion}`);\n console.log(`Updated ${getManifestPath()}`);\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n console.error(`Error: ${message}`);\n process.exit(1);\n }\n}\n","import { whoamiRequest } from \"@/api-client\";\nimport { getRegistryUrl, requireApiKey, resolveConfig } from \"@/config\";\n\nexport async function whoami(): Promise<void> {\n try {\n const resolved = await resolveConfig();\n const apiKey = await requireApiKey();\n const registryUrl = await getRegistryUrl();\n\n const user = await whoamiRequest(registryUrl, apiKey);\n\n if (user) {\n console.log(`Username: ${user.username}`);\n console.log(`User ID: ${user.userId}`);\n console.log(`Registry: ${registryUrl}`);\n } else if (resolved.username) {\n // Use cached username if API call fails\n console.log(`Username: ${resolved.username} (cached)`);\n console.log(`Registry: ${registryUrl}`);\n } else {\n console.error(\"Could not determine current user.\");\n process.exit(1);\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n console.error(`Error: ${message}`);\n process.exit(1);\n }\n}\n","import { execSync } from \"node:child_process\";\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { isNewerVersion } from \"@/lib/version\";\n\nconst PACKAGE_NAME = \"@anytio/pspm\";\nconst CHECK_INTERVAL_MS = 24 * 60 * 60 * 1000; // 24 hours\nconst CACHE_DIR = join(homedir(), \".pspm\");\nconst CACHE_FILE = join(CACHE_DIR, \"update-check.json\");\n\ninterface UpdateCache {\n lastCheck: number;\n latestVersion: string;\n}\n\n/**\n * Check for updates in the background and print a warning if outdated.\n * This is non-blocking — it reads from cache and spawns a background check.\n */\nexport async function checkForUpdates(currentVersion: string): Promise<void> {\n try {\n const cache = await readCache();\n\n // If cache exists and is fresh, show warning if needed\n if (cache && Date.now() - cache.lastCheck < CHECK_INTERVAL_MS) {\n if (isNewerVersion(cache.latestVersion, currentVersion)) {\n printUpdateWarning(currentVersion, cache.latestVersion);\n }\n return;\n }\n\n // Cache is stale or missing — fetch in background\n fetchAndCache(currentVersion);\n } catch {\n // Never let update checking break the CLI\n }\n}\n\nasync function readCache(): Promise<UpdateCache | null> {\n try {\n const content = await readFile(CACHE_FILE, \"utf-8\");\n return JSON.parse(content) as UpdateCache;\n } catch {\n return null;\n }\n}\n\nasync function writeCache(cache: UpdateCache): Promise<void> {\n await mkdir(CACHE_DIR, { recursive: true });\n await writeFile(CACHE_FILE, JSON.stringify(cache));\n}\n\n/**\n * Fetch latest version and update cache.\n * Runs synchronously but is called after command execution so it doesn't block UX.\n */\nfunction fetchAndCache(currentVersion: string): void {\n try {\n const latestVersion = execSync(`npm view ${PACKAGE_NAME} version`, {\n encoding: \"utf-8\",\n timeout: 5000,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n }).trim();\n\n if (!latestVersion) return;\n\n const cache: UpdateCache = {\n lastCheck: Date.now(),\n latestVersion,\n };\n\n // Write cache (fire and forget)\n writeCache(cache).catch(() => {});\n\n if (isNewerVersion(latestVersion, currentVersion)) {\n printUpdateWarning(currentVersion, latestVersion);\n }\n } catch {\n // Network error or npm not available — silently ignore\n }\n}\n\nfunction printUpdateWarning(\n currentVersion: string,\n latestVersion: string,\n): void {\n console.warn(\n `\\n Update available: ${currentVersion} → ${latestVersion}` +\n \"\\n Run `pspm upgrade` to update\\n\",\n );\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 access,\n add,\n audit,\n configInit,\n configShow,\n deprecate,\n init,\n install,\n link,\n list,\n login,\n logout,\n migrate,\n outdated,\n publish,\n remove,\n search,\n unpublish,\n update,\n upgrade,\n version as versionCommand,\n whoami,\n} from \"./commands/index\";\nimport { checkForUpdates } from \"./update-notifier\";\n\n// Read version from package.json\nconst __dirname = dirname(fileURLToPath(import.meta.url));\nconst packageJson = JSON.parse(\n readFileSync(join(__dirname, \"..\", \"package.json\"), \"utf-8\"),\n);\nconst version: string = packageJson.version;\n\nconst program = new Command();\n\nprogram\n .name(\"pspm\")\n .description(\"Package manager for AI agent skills\")\n .version(version);\n\n// =============================================================================\n// Config commands\n// =============================================================================\n\nconst configCmd = program\n .command(\"config\")\n .description(\"Manage PSPM configuration\");\n\nconfigCmd\n .command(\"show\")\n .description(\"Show resolved configuration\")\n .action(async () => {\n await configShow();\n });\n\nconfigCmd\n .command(\"init\")\n .description(\"Create a .pspmrc file in the current directory\")\n .option(\"--registry <url>\", \"Registry URL override\")\n .action(async (options) => {\n await configInit({\n registry: options.registry,\n });\n });\n\n// =============================================================================\n// Self-upgrade\n// =============================================================================\n\nprogram\n .command(\"upgrade\")\n .description(\"Upgrade pspm to the latest version\")\n .action(async () => {\n await upgrade();\n });\n\n// =============================================================================\n// Authentication commands\n// =============================================================================\n\nprogram\n .command(\"login\")\n .description(\"Log in via browser or with an API key\")\n .option(\n \"--api-key <key>\",\n \"API key for direct authentication (skips browser)\",\n )\n .action(async (options) => {\n await login({ apiKey: options.apiKey });\n });\n\nprogram\n .command(\"logout\")\n .description(\"Log out and clear stored credentials\")\n .action(async () => {\n await logout();\n });\n\nprogram\n .command(\"whoami\")\n .description(\"Show current user information\")\n .action(async () => {\n await whoami();\n });\n\n// =============================================================================\n// Project initialization commands\n// =============================================================================\n\nprogram\n .command(\"init\")\n .description(\"Create a new pspm.json manifest in the current directory\")\n .option(\"-n, --name <name>\", \"Skill name\")\n .option(\"-d, --description <desc>\", \"Skill description\")\n .option(\"-a, --author <author>\", \"Author name\")\n .option(\"-y, --yes\", \"Skip prompts and use defaults\")\n .option(\"-f, --force\", \"Overwrite existing pspm.json\")\n .action(async (options) => {\n await init({\n name: options.name,\n description: options.description,\n author: options.author,\n yes: options.yes,\n force: options.force,\n });\n });\n\nprogram\n .command(\"migrate\")\n .description(\n \"Migrate from old directory structure (.skills/, skill-lock.json)\",\n )\n .option(\"--dry-run\", \"Show what would be migrated without making changes\")\n .action(async (options) => {\n await migrate({ dryRun: options.dryRun });\n });\n\n// =============================================================================\n// Skill management commands\n// =============================================================================\n\nprogram\n .command(\"add <specifiers...>\")\n .description(\n \"Add skills from registry, GitHub, local paths, or well-known URLs\",\n )\n .option(\"--save\", \"Save to lockfile (default)\")\n .option(\n \"--agent <agents>\",\n 'Comma-separated agents for symlinks (default: all agents, use \"none\" to skip)',\n )\n .option(\"-g, --global\", \"Install to user home directory instead of project\")\n .option(\"-y, --yes\", \"Skip agent selection prompt and use defaults\")\n .action(async (specifiers, options) => {\n await add(specifiers, {\n save: options.save ?? true,\n agent: options.agent,\n yes: options.yes,\n global: options.global,\n });\n });\n\nprogram\n .command(\"remove <name>\")\n .alias(\"rm\")\n .description(\"Remove an installed skill\")\n .action(async (name) => {\n await remove(name);\n });\n\nprogram\n .command(\"list\")\n .alias(\"ls\")\n .description(\"List installed skills\")\n .option(\"--json\", \"Output as JSON\")\n .option(\"-g, --global\", \"List globally installed skills\")\n .action(async (options) => {\n await list({ json: options.json, global: options.global });\n });\n\nprogram\n .command(\"install [specifiers...]\")\n .alias(\"i\")\n .description(\n \"Install skills from lockfile, or add and install specific packages\",\n )\n .option(\"--frozen-lockfile\", \"Fail if lockfile is missing or outdated\")\n .option(\"--dir <path>\", \"Install skills to a specific directory\")\n .option(\n \"--agent <agents>\",\n 'Comma-separated agents for symlinks (default: all agents, use \"none\" to skip)',\n )\n .option(\"-g, --global\", \"Install to user home directory instead of project\")\n .option(\"-y, --yes\", \"Skip agent selection prompt and use defaults\")\n .action(async (specifiers, options) => {\n await install(specifiers, {\n frozenLockfile: options.frozenLockfile,\n dir: options.dir,\n agent: options.agent,\n yes: options.yes,\n global: options.global,\n });\n });\n\nprogram\n .command(\"link\")\n .description(\"Recreate agent symlinks without reinstalling\")\n .option(\n \"--agent <agents>\",\n 'Comma-separated agents for symlinks (default: all agents, use \"none\" to skip)',\n )\n .option(\"-g, --global\", \"Recreate global agent symlinks\")\n .option(\"-y, --yes\", \"Skip agent selection prompt and use defaults\")\n .action(async (options) => {\n await link({\n agent: options.agent,\n yes: options.yes,\n global: options.global,\n });\n });\n\nprogram\n .command(\"update\")\n .description(\"Update all skills to latest compatible versions\")\n .option(\"--dry-run\", \"Show what would be updated without making changes\")\n .action(async (options) => {\n await update({ dryRun: options.dryRun });\n });\n\nprogram\n .command(\"search [query]\")\n .alias(\"find\")\n .description(\"Search and discover skills from the registry\")\n .option(\n \"-s, --sort <sort>\",\n \"Sort by: downloads, recent, name (default: downloads)\",\n )\n .option(\"-l, --limit <n>\", \"Maximum results (default: 20)\", Number.parseInt)\n .option(\"--json\", \"Output as JSON\")\n .action(async (query: string | undefined, options) => {\n await search(query, {\n sort: options.sort,\n limit: options.limit,\n json: options.json,\n });\n });\n\nprogram\n .command(\"audit\")\n .description(\"Verify integrity of installed skills and check for issues\")\n .option(\"--json\", \"Output as JSON\")\n .action(async (options) => {\n await audit({ json: options.json });\n });\n\nprogram\n .command(\"outdated [packages...]\")\n .description(\"Check for outdated skills\")\n .option(\"--json\", \"Output as JSON\")\n .option(\"--all\", \"Include up-to-date packages\")\n .action(async (packages: string[], options) => {\n await outdated(packages, { json: options.json, all: options.all });\n });\n\n// =============================================================================\n// Publishing commands\n// =============================================================================\n\nprogram\n .command(\"version <bump>\")\n .description(\"Bump package version (major, minor, patch)\")\n .option(\"--dry-run\", \"Show what would be changed without writing\")\n .action(async (bump: string, options) => {\n const validBumps = [\"major\", \"minor\", \"patch\"];\n if (!validBumps.includes(bump)) {\n console.error(`Error: Invalid version bump \"${bump}\".`);\n console.error(\"Must be one of: major, minor, patch\");\n process.exit(1);\n }\n await versionCommand(bump as \"major\" | \"minor\" | \"patch\", {\n dryRun: options.dryRun,\n });\n });\n\nprogram\n .command(\"publish\")\n .description(\"Publish current directory as a skill\")\n .option(\"--bump <level>\", \"Bump version (major, minor, patch)\")\n .option(\"--tag <tag>\", \"Tag for the release\")\n .option(\"--org <orgname>\", \"Publish under an organization namespace\")\n .requiredOption(\n \"--access <level>\",\n \"Set package visibility (public, private, or team)\",\n )\n .action(async (options) => {\n const access = options.access as string;\n if (access !== \"public\" && access !== \"private\" && access !== \"team\") {\n console.error('Error: --access must be \"public\", \"private\", or \"team\"');\n process.exit(1);\n }\n if (access === \"team\" && !options.org) {\n console.error(\"Error: --access team requires --org <orgname>\");\n process.exit(1);\n }\n await publish({\n bump: options.bump as \"major\" | \"minor\" | \"patch\" | undefined,\n tag: options.tag,\n access,\n org: options.org,\n });\n });\n\nprogram\n .command(\"unpublish <specifier>\")\n .description(\n \"Remove a published skill version (only within 72 hours of publishing)\",\n )\n .option(\"--force\", \"Confirm destructive action\")\n .action(async (specifier, options) => {\n await unpublish(specifier, { force: options.force });\n });\n\nprogram\n .command(\"access [specifier]\")\n .description(\"Change package visibility (public/private)\")\n .option(\"--public\", \"Make the package public (irreversible)\")\n .option(\"--private\", \"Make the package private (only for private packages)\")\n .action(async (specifier, options) => {\n await access(specifier, {\n public: options.public,\n private: options.private,\n });\n });\n\nprogram\n .command(\"deprecate <specifier> [message]\")\n .description(\n \"Mark a skill version as deprecated (alternative to unpublish after 72 hours)\",\n )\n .option(\"--undo\", \"Remove deprecation status\")\n .action(async (specifier, message, options) => {\n await deprecate(specifier, message, { undo: options.undo });\n });\n\n// Parse and execute command, then check for updates\nawait program.parseAsync();\n\n// Skip update check when running the upgrade command itself\nconst executedCommand = program.args[0];\nif (executedCommand !== \"upgrade\") {\n await checkForUpdates(version);\n}\n"]}