@anytio/pspm 0.1.1 → 0.2.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":["../../../packages/shared/pspm-types/src/integrity.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","../../../packages/sdk/src/fetchers/cli-fetcher.ts","../../../packages/sdk/src/generated/fetch/index.ts","../../../packages/sdk/src/index.ts","../src/api-client.ts","../src/errors.ts","../src/config.ts","../src/agents.ts","../src/github.ts","../src/lockfile.ts","../src/manifest.ts","../src/symlinks.ts","../src/commands/add.ts","../src/commands/access.ts","../src/commands/index.ts","../src/commands/config/init.ts","../src/commands/config/show.ts","../src/commands/deprecate.ts","../src/commands/init.ts","../src/commands/install.ts","../src/commands/link.ts","../src/commands/list.ts","../src/commands/login.ts","../src/commands/logout.ts","../src/commands/migrate.ts","../src/commands/publish.ts","../src/commands/remove.ts","../src/commands/unpublish.ts","../src/commands/update.ts","../src/commands/whoami.ts","../src/index.ts"],"names":["version","init_src","configure","config","join","mkdir","writeFile","exec","promisify","stat","readFile","dirname","init_manifest","lstat","rm","createHash","add","access","URL","exchangeCliToken","readdir","execCb","packageJson","relative","semver","__dirname"],"mappings":"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","file":"index.js","sourcesContent":["import { createHash } from \"node:crypto\";\n\n/**\n * Calculate integrity hash for a buffer.\n * Uses SHA-256 with base64 encoding, prefixed with \"sha256-\".\n *\n * @param data - The buffer to hash\n * @returns Integrity string (e.g., \"sha256-abc123...\")\n */\nexport function calculateIntegrity(data: Buffer): string {\n\tconst hash = createHash(\"sha256\").update(data).digest(\"base64\");\n\treturn `sha256-${hash}`;\n}\n\n/**\n * Verify that a buffer matches an expected integrity hash.\n *\n * @param data - The buffer to verify\n * @param expectedIntegrity - The expected integrity string\n * @returns True if the integrity matches\n */\nexport function verifyIntegrity(\n\tdata: Buffer,\n\texpectedIntegrity: string,\n): boolean {\n\tconst match = expectedIntegrity.match(/^sha256-(.+)$/);\n\tif (!match) {\n\t\treturn false;\n\t}\n\n\tconst actualHash = createHash(\"sha256\").update(data).digest(\"base64\");\n\treturn actualHash === match[1];\n}\n","/**\n * PSPM Manifest format (pspm.json)\n *\n * This is the dedicated manifest format for prompt skill packages,\n * separate from package.json used for npm/node dependencies.\n */\n\n/**\n * Version requirements for the skill\n */\nexport interface PspmManifestRequirements {\n\t/** Minimum Claude model version required (e.g., \">=3.5\") */\n\tclaude?: string;\n\t/** Minimum PSPM CLI version required (e.g., \">=0.1.0\") */\n\tpspm?: string;\n}\n\n/**\n * Agent configuration for skill symlinks\n */\nexport interface AgentConfig {\n\t/** Directory where skills should be symlinked (e.g., \".claude/skills\") */\n\tskillsDir: string;\n}\n\n/**\n * Built-in agent types with predefined configurations\n */\nexport type BuiltInAgent =\n\t| \"claude-code\"\n\t| \"codex\"\n\t| \"cursor\"\n\t| \"gemini\"\n\t| \"kiro\"\n\t| \"opencode\";\n\n/**\n * PSPM Manifest schema for pspm.json\n *\n * @example\n * ```json\n * {\n * \"$schema\": \"https://pspm.dev/schema/pspm.json\",\n * \"name\": \"my-skill\",\n * \"version\": \"1.0.0\",\n * \"description\": \"A skill for code reviews\",\n * \"author\": \"username\",\n * \"license\": \"MIT\",\n * \"type\": \"skill\",\n * \"capabilities\": [\"code-review\", \"typescript\"],\n * \"main\": \"SKILL.md\",\n * \"requirements\": {\n * \"claude\": \">=3.5\",\n * \"pspm\": \">=0.1.0\"\n * },\n * \"files\": [\"SKILL.md\", \"runtime/\", \"scripts/\", \"data/\"],\n * \"dependencies\": {},\n * \"private\": false\n * }\n * ```\n */\nexport interface PspmManifest {\n\t/** JSON Schema URL for validation */\n\t$schema?: string;\n\n\t/** Package name (no @ prefix needed, username is derived from logged-in user) */\n\tname: string;\n\n\t/** Semantic version string */\n\tversion: string;\n\n\t/** Human-readable description */\n\tdescription?: string;\n\n\t/** Package author */\n\tauthor?: string;\n\n\t/** License identifier (e.g., \"MIT\", \"Apache-2.0\") */\n\tlicense?: string;\n\n\t/** Package type (always \"skill\" for prompt skill packages) */\n\ttype?: \"skill\";\n\n\t/** List of capabilities/tags for discovery */\n\tcapabilities?: string[];\n\n\t/** Main entry point file (default: \"SKILL.md\") */\n\tmain?: string;\n\n\t/** Version requirements */\n\trequirements?: PspmManifestRequirements;\n\n\t/** Files to include in the published package */\n\tfiles?: string[];\n\n\t/** Skill dependencies (format: \"@user/{username}/{name}\": \"^1.0.0\") */\n\tdependencies?: Record<string, string>;\n\n\t/**\n\t * GitHub skill dependencies (format: \"github:owner/repo/path\": \"ref\")\n\t *\n\t * @example\n\t * ```json\n\t * {\n\t * \"githubDependencies\": {\n\t * \"github:vercel-labs/agent-skills/skills/react-best-practices\": \"main\",\n\t * \"github:myorg/prompts/team/frontend/linter\": \"v2.0.0\"\n\t * }\n\t * }\n\t * ```\n\t */\n\tgithubDependencies?: Record<string, string>;\n\n\t/**\n\t * 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\tprivate: manifest.private ?? false,\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\treturn {\n\t\tusername: match[1],\n\t\tname: match[2],\n\t\tversionRange: match[3],\n\t};\n}\n\n/**\n * Generate a full skill identifier string.\n *\n * @param username - The owner's username\n * @param name - The skill name\n * @param version - Optional version string\n * @returns Full identifier (e.g., \"@user/bsheng/my-skill@1.0.0\")\n */\nexport function generateSkillIdentifier(\n\tusername: string,\n\tname: string,\n\tversion?: string,\n): string {\n\tconst base = `@user/${username}/${name}`;\n\treturn version ? `${base}@${version}` : base;\n}\n\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\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\treturn segments[segments.length - 1];\n\t}\n\treturn spec.repo;\n}\n\n/**\n * Check if a string is a GitHub specifier\n */\nexport function isGitHubSpecifier(specifier: string): boolean {\n\treturn specifier.startsWith(\"github:\");\n}\n","import * as semver from \"semver\";\n\n/**\n * Resolve the best matching version from a list of available versions.\n *\n * @param range - The version range to match (e.g., \"^1.0.0\", \"~2.1.0\", \"*\")\n * @param availableVersions - List of available version strings\n * @returns The best matching version or null if none found\n */\nexport function resolveVersion(\n\trange: string,\n\tavailableVersions: string[],\n): string | null {\n\tconst sorted = availableVersions\n\t\t.filter((v) => semver.valid(v))\n\t\t.sort((a, b) => semver.rcompare(a, b));\n\n\tif (!range || range === \"latest\" || range === \"*\") {\n\t\treturn sorted[0] ?? null;\n\t}\n\n\treturn semver.maxSatisfying(sorted, range);\n}\n\n/**\n * Check if a version satisfies a given range.\n */\nexport function versionSatisfies(version: string, range: string): boolean {\n\treturn semver.satisfies(version, range);\n}\n\n/**\n * Normalize a version range string.\n * Converts \"latest\" or empty to \"*\".\n */\nexport function normalizeVersionRange(range?: string): string {\n\tif (!range || range === \"latest\") {\n\t\treturn \"*\";\n\t}\n\treturn range;\n}\n\n/**\n * Compare two versions.\n * Returns: -1 if a < b, 0 if a === b, 1 if a > b\n */\nexport function compareVersions(a: string, b: string): number {\n\treturn semver.compare(a, b);\n}\n\n/**\n * Check if version a is greater than version b.\n */\nexport function isNewerVersion(a: string, b: string): boolean {\n\treturn semver.gt(a, b);\n}\n\n/**\n * Get the latest version from a list.\n */\nexport function getLatestVersion(versions: string[]): string | null {\n\tconst valid = versions.filter((v) => semver.valid(v));\n\tif (valid.length === 0) return null;\n\treturn valid.sort((a, b) => semver.rcompare(a, b))[0];\n}\n","/**\n * @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// Lockfile types\n// Legacy lockfile types (deprecated, use Pspm* versions)\nexport type {\n\tGitHubLockfileEntry,\n\tPspmLockfile,\n\tPspmLockfile as SkillLockfile,\n\tPspmLockfileEntry,\n\tPspmLockfileEntry as SkillLockfileEntry,\n} from \"./lockfile\";\n\n// Manifest types (pspm.json)\nexport {\n\ttype AgentConfig,\n\ttype BuiltInAgent,\n\tDEFAULT_MAIN,\n\tDEFAULT_SKILL_FILES,\n\ttype ManifestDetectionResult,\n\tnormalizeManifest,\n\tPSPM_SCHEMA_URL,\n\ttype PspmManifest,\n\ttype PspmManifestRequirements,\n\tvalidateManifest,\n} from \"./manifest\";\n// Skill specifier parsing\nexport {\n\tformatGitHubSpecifier,\n\ttype GitHubSpecifier,\n\tgenerateSkillIdentifier,\n\tgetGitHubSkillName,\n\tisGitHubSpecifier,\n\tparseGitHubSpecifier,\n\tparseSkillSpecifier,\n\ttype SkillSpecifier,\n} from \"./specifier\";\n// Version utilities\nexport {\n\tcompareVersions,\n\tgetLatestVersion,\n\tisNewerVersion,\n\tnormalizeVersionRange,\n\tresolveVersion,\n\tversionSatisfies,\n} from \"./version\";\n","/**\n * Custom fetch wrapper for Orval-generated SDK\n *\n * Handles authentication and base URL configuration.\n */\n\nexport interface SDKConfig {\n\tbaseUrl: string;\n\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 \"@repo/sdk\";\n *\n * configure({\n * baseUrl: \"http://localhost:5600\",\n * apiKey: \"your-api-key\"\n * });\n * ```\n */\nexport function configure(options: SDKConfig): void {\n\tconfig = options;\n}\n\n/**\n * Get the current SDK configuration.\n * @throws Error if not configured\n */\nexport function getConfig(): SDKConfig {\n\tif (!config) {\n\t\tthrow new Error(\"SDK not configured. Call configure() first.\");\n\t}\n\treturn config;\n}\n\n/**\n * Check if the SDK is configured.\n */\nexport function isConfigured(): boolean {\n\treturn config !== null;\n}\n\n/**\n * Error class for SDK API errors\n */\nexport class SDKError extends Error {\n\tconstructor(\n\t\tmessage: string,\n\t\tpublic readonly status: number,\n\t\tpublic readonly body?: string,\n\t) {\n\t\tsuper(message);\n\t\tthis.name = \"SDKError\";\n\t}\n}\n\n/**\n * Response structure returned by all SDK functions\n */\nexport interface SDKResponse<T> {\n\tdata: T;\n\tstatus: number;\n\theaders: Headers;\n}\n\n/**\n * Custom fetch function for Orval\n *\n * This is used by all generated API functions to make HTTP requests.\n * It handles authentication, error handling, and response parsing.\n *\n * Returns { data, status, headers } structure expected by Orval v8.\n */\nexport async function customFetch<T>(\n\turl: string,\n\toptions: RequestInit,\n): Promise<T> {\n\tconst { baseUrl, apiKey } = getConfig();\n\n\t// The URL from Orval will be like \"/api/skills/me\"\n\t// We need to prepend the baseUrl\n\tconst fullUrl = `${baseUrl}${url}`;\n\n\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.0.2 🍺\n * Do not edit manually.\n * PSPM API\n * Backend API for PSPM - Private Skill Package Manager for Claude Code\n * OpenAPI spec version: 1.0.0\n */\nimport { customFetch } from '../../fetchers/cli-fetcher';\n/**\n * API key record (without the key value)\n */\nexport interface ApiKey {\n id: string;\n name: string;\n keyPrefix: string;\n userId: string;\n expiresAt: string | null;\n lastUsedAt: string | null;\n createdAt: string | null;\n}\n\nexport type ApiKeyListResponse = ApiKey[];\n\nexport type Item = {\n path: (string | number)[];\n message: string;\n};\n\nexport type ApiErrorCode = typeof ApiErrorCode[keyof typeof ApiErrorCode];\n\n\nexport const ApiErrorCode = {\n BAD_REQUEST: 'BAD_REQUEST',\n UNAUTHORIZED: 'UNAUTHORIZED',\n FORBIDDEN: 'FORBIDDEN',\n NOT_FOUND: 'NOT_FOUND',\n CONFLICT: 'CONFLICT',\n VALIDATION_ERROR: 'VALIDATION_ERROR',\n INTERNAL_ERROR: 'INTERNAL_ERROR',\n} as const;\n\nexport type ApiErrorDetails = {[key: string]: unknown | null};\n\nexport interface ApiError {\n code: ApiErrorCode;\n message: string;\n details?: ApiErrorDetails;\n requestId?: string;\n timestamp: string;\n}\n\nexport type ValidationError = ApiError & {\n code?: 'VALIDATION_ERROR';\n details: {\n issues: Item[];\n};\n};\n\n/**\n * Created API key with the plain key (only shown once)\n */\nexport interface CreateApiKeyResponse {\n apiKey: ApiKey;\n plainKey: string;\n}\n\n/**\n * Input for creating a new API key\n */\nexport interface CreateApiKeyInput {\n /**\n * @minLength 1\n * @maxLength 100\n */\n name: string;\n expiresAt?: string | null;\n}\n\nexport interface SuccessResponse {\n success: boolean;\n}\n\nexport interface DeleteApiKeyInput {\n id: string;\n}\n\nexport interface UpdateApiKeyInput {\n id: string;\n /**\n * @minLength 1\n * @maxLength 100\n */\n name: string;\n}\n\nexport interface CreateCliTokenResponse {\n token: string;\n}\n\nexport interface CreateCliTokenInput {\n /** @minLength 1 */\n state: string;\n /** @minLength 1 */\n port: string;\n}\n\nexport interface ExchangeCliTokenResponse {\n apiKey: string;\n username: string;\n}\n\nexport interface ExchangeCliTokenInput {\n /** @minLength 1 */\n token: string;\n}\n\n/**\n * User's username information\n */\nexport interface UsernameInfo {\n username: string | null;\n canChange: boolean;\n usernameChangedAt: string | null;\n}\n\nexport interface CheckUsernameOutput {\n available: boolean;\n error: string | null;\n}\n\nexport interface UpdateUsernameOutput {\n success: boolean;\n username: string | null;\n error: string | null;\n}\n\nexport interface UpdateUsernameInput {\n /**\n * @minLength 3\n * @maxLength 39\n */\n username: string;\n}\n\nexport interface GetSuggestionsOutput {\n suggestions: string[];\n}\n\n/**\n * Current user info\n */\nexport type MeResponseData = {\n userId: string;\n username: string;\n} | null\n\n/**\n * Skill metadata\n */\nexport interface Skill {\n id: string;\n name: string;\n userId: string;\n description: string | null;\n createdAt: string | null;\n updatedAt: string | null;\n}\n\n/**\n * Skill metadata with owner username\n */\nexport type SkillWithUser = Skill & {\n username: string;\n};\n\n/**\n * List of skills\n */\nexport type SkillListResponse = SkillWithUser[];\n\n/**\n * User's username\n * @minLength 1\n * @maxLength 50\n * @pattern ^[a-zA-Z0-9_-]+$\n */\nexport type Username = string;\n\n/**\n * Skill name identifier\n * @minLength 1\n * @maxLength 100\n * @pattern ^[a-z][a-z0-9-]*$\n */\nexport type SkillName = string;\n\n/**\n * Semantic version string (e.g., 1.0.0)\n */\nexport type Semver = string;\n\nexport type PspmMetadataType = typeof PspmMetadataType[keyof typeof PspmMetadataType];\n\n\nexport const PspmMetadataType = {\n skill: 'skill',\n} as const;\n\nexport type PspmMetadataRequirements = {\n claude?: string;\n node?: string;\n};\n\n/**\n * PSPM-specific metadata for the skill package\n */\nexport interface PspmMetadata {\n type: PspmMetadataType;\n capabilities?: string[];\n requirements?: PspmMetadataRequirements;\n}\n\n/**\n * Skill package manifest (package.json)\n */\nexport interface SkillManifest {\n name: SkillName;\n version: Semver;\n /** @maxLength 500 */\n description?: string;\n files?: string[];\n pspm?: PspmMetadata;\n}\n\n/**\n * Skill version metadata\n */\nexport interface SkillVersion {\n id: string;\n skillId: string;\n version: string;\n r2Key: string;\n checksum: string;\n manifest: SkillManifest;\n publishedAt: string | null;\n}\n\n/**\n * Skill version metadata with download URL\n */\nexport type SkillVersionWithDownload = SkillVersion & {\n downloadUrl: string;\n} | null;\n\n/**\n * Published skill with version info\n */\nexport interface PublishSkillResponse {\n skill: SkillWithUser;\n version: SkillVersion;\n}\n\n/**\n * Input for publishing a skill\n */\nexport interface PublishSkillInput {\n manifest: SkillManifest;\n /** @maxLength 73400320 */\n tarballBase64: string;\n}\n\nexport type CapturedErrorSource = typeof CapturedErrorSource[keyof typeof CapturedErrorSource];\n\n\nexport const CapturedErrorSource = {\n hydration: 'hydration',\n loader: 'loader',\n action: 'action',\n render: 'render',\n streaming: 'streaming',\n network: 'network',\n global: 'global',\n unknown: 'unknown',\n} as const;\n\nexport type CapturedErrorSeverity = typeof CapturedErrorSeverity[keyof typeof CapturedErrorSeverity];\n\n\nexport const CapturedErrorSeverity = {\n fatal: 'fatal',\n error: 'error',\n warning: 'warning',\n info: 'info',\n} as const;\n\nexport type CapturedErrorContext = {[key: string]: unknown | null};\n\n/**\n * A captured client error\n */\nexport interface CapturedError {\n id: string;\n message: string;\n stack?: string;\n componentStack?: string;\n source: CapturedErrorSource;\n severity: CapturedErrorSeverity;\n route?: string;\n timestamp: number;\n context?: CapturedErrorContext;\n digest?: string;\n}\n\n/**\n * Payload for reporting client errors\n */\nexport interface ErrorReportPayload {\n errors: CapturedError[];\n userAgent: string;\n url: string;\n timestamp: number;\n}\n\nexport type CheckUsernameAvailabilityParams = {\n/**\n * @minLength 3\n * @maxLength 39\n */\nusername: string;\n};\n\n/**\n * Retrieve all API keys for the authenticated user\n * @summary List all API keys\n */\nexport type listApiKeysResponse200 = {\n data: ApiKeyListResponse\n status: 200\n}\n\nexport type listApiKeysResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type listApiKeysResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type listApiKeysResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type listApiKeysResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type listApiKeysResponse500 = {\n data: ApiError\n status: 500\n}\n \nexport type listApiKeysResponseSuccess = (listApiKeysResponse200) & {\n headers: Headers;\n};\nexport type listApiKeysResponseError = (listApiKeysResponse400 | listApiKeysResponse401 | listApiKeysResponse403 | listApiKeysResponse404 | listApiKeysResponse500) & {\n headers: Headers;\n};\n\nexport type listApiKeysResponse = (listApiKeysResponseSuccess | listApiKeysResponseError)\n\nexport const getListApiKeysUrl = () => {\n\n\n \n\n return `/api/api-keys/api-keys`\n}\n\nexport const listApiKeys = async ( options?: RequestInit): Promise<listApiKeysResponse> => {\n \n return customFetch<listApiKeysResponse>(getListApiKeysUrl(),\n { \n ...options,\n method: 'GET'\n \n \n }\n);}\n\n\n\n/**\n * Create a new API key with optional expiration\n * @summary Create a new API key\n */\nexport type createApiKeyResponse200 = {\n data: CreateApiKeyResponse\n status: 200\n}\n\nexport type createApiKeyResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type createApiKeyResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type createApiKeyResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type createApiKeyResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type createApiKeyResponse500 = {\n data: ApiError\n status: 500\n}\n \nexport type createApiKeyResponseSuccess = (createApiKeyResponse200) & {\n headers: Headers;\n};\nexport type createApiKeyResponseError = (createApiKeyResponse400 | createApiKeyResponse401 | createApiKeyResponse403 | createApiKeyResponse404 | createApiKeyResponse500) & {\n headers: Headers;\n};\n\nexport type createApiKeyResponse = (createApiKeyResponseSuccess | createApiKeyResponseError)\n\nexport const getCreateApiKeyUrl = () => {\n\n\n \n\n return `/api/api-keys/api-keys`\n}\n\nexport const createApiKey = async (createApiKeyInput: CreateApiKeyInput, options?: RequestInit): Promise<createApiKeyResponse> => {\n \n return customFetch<createApiKeyResponse>(getCreateApiKeyUrl(),\n { \n ...options,\n method: 'POST',\n headers: { 'Content-Type': 'application/json', ...options?.headers },\n body: JSON.stringify(\n createApiKeyInput,)\n }\n);}\n\n\n\n/**\n * Revoke and delete an API key\n * @summary Delete an API key\n */\nexport type deleteApiKeyResponse200 = {\n data: SuccessResponse\n status: 200\n}\n\nexport type deleteApiKeyResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type deleteApiKeyResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type deleteApiKeyResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type deleteApiKeyResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type deleteApiKeyResponse500 = {\n data: ApiError\n status: 500\n}\n \nexport type deleteApiKeyResponseSuccess = (deleteApiKeyResponse200) & {\n headers: Headers;\n};\nexport type deleteApiKeyResponseError = (deleteApiKeyResponse400 | deleteApiKeyResponse401 | deleteApiKeyResponse403 | deleteApiKeyResponse404 | deleteApiKeyResponse500) & {\n headers: Headers;\n};\n\nexport type deleteApiKeyResponse = (deleteApiKeyResponseSuccess | deleteApiKeyResponseError)\n\nexport const getDeleteApiKeyUrl = () => {\n\n\n \n\n return `/api/api-keys/api-keys`\n}\n\nexport const deleteApiKey = async (deleteApiKeyInput: DeleteApiKeyInput, options?: RequestInit): Promise<deleteApiKeyResponse> => {\n \n return customFetch<deleteApiKeyResponse>(getDeleteApiKeyUrl(),\n { \n ...options,\n method: 'DELETE',\n headers: { 'Content-Type': 'application/json', ...options?.headers },\n body: JSON.stringify(\n deleteApiKeyInput,)\n }\n);}\n\n\n\n/**\n * Update the name/description of an API key\n * @summary Update API key name\n */\nexport type updateApiKeyNameResponse200 = {\n data: ApiKey\n status: 200\n}\n\nexport type updateApiKeyNameResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type updateApiKeyNameResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type updateApiKeyNameResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type updateApiKeyNameResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type updateApiKeyNameResponse500 = {\n data: ApiError\n status: 500\n}\n \nexport type updateApiKeyNameResponseSuccess = (updateApiKeyNameResponse200) & {\n headers: Headers;\n};\nexport type updateApiKeyNameResponseError = (updateApiKeyNameResponse400 | updateApiKeyNameResponse401 | updateApiKeyNameResponse403 | updateApiKeyNameResponse404 | updateApiKeyNameResponse500) & {\n headers: Headers;\n};\n\nexport type updateApiKeyNameResponse = (updateApiKeyNameResponseSuccess | updateApiKeyNameResponseError)\n\nexport const getUpdateApiKeyNameUrl = () => {\n\n\n \n\n return `/api/api-keys/api-keys`\n}\n\nexport const updateApiKeyName = async (updateApiKeyInput: UpdateApiKeyInput, options?: RequestInit): Promise<updateApiKeyNameResponse> => {\n \n return customFetch<updateApiKeyNameResponse>(getUpdateApiKeyNameUrl(),\n { \n ...options,\n method: 'PUT',\n headers: { 'Content-Type': 'application/json', ...options?.headers },\n body: JSON.stringify(\n updateApiKeyInput,)\n }\n);}\n\n\n\n/**\n * Create a short-lived token for CLI browser-based authentication\n * @summary Create a CLI login token\n */\nexport type createCliTokenResponse200 = {\n data: CreateCliTokenResponse\n status: 200\n}\n\nexport type createCliTokenResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type createCliTokenResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type createCliTokenResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type createCliTokenResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type createCliTokenResponse500 = {\n data: ApiError\n status: 500\n}\n \nexport type createCliTokenResponseSuccess = (createCliTokenResponse200) & {\n headers: Headers;\n};\nexport type createCliTokenResponseError = (createCliTokenResponse400 | createCliTokenResponse401 | createCliTokenResponse403 | createCliTokenResponse404 | createCliTokenResponse500) & {\n headers: Headers;\n};\n\nexport type createCliTokenResponse = (createCliTokenResponseSuccess | createCliTokenResponseError)\n\nexport const getCreateCliTokenUrl = () => {\n\n\n \n\n return `/api/api-keys/cli-token`\n}\n\nexport const createCliToken = async (createCliTokenInput: CreateCliTokenInput, options?: RequestInit): Promise<createCliTokenResponse> => {\n \n return customFetch<createCliTokenResponse>(getCreateCliTokenUrl(),\n { \n ...options,\n method: 'POST',\n headers: { 'Content-Type': 'application/json', ...options?.headers },\n body: JSON.stringify(\n createCliTokenInput,)\n }\n);}\n\n\n\n/**\n * Exchange a CLI login token for an API key (called by CLI after browser redirect)\n * @summary Exchange CLI token for API key\n */\nexport type exchangeCliTokenResponse200 = {\n data: ExchangeCliTokenResponse\n status: 200\n}\n\nexport type exchangeCliTokenResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type exchangeCliTokenResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type exchangeCliTokenResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type exchangeCliTokenResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type exchangeCliTokenResponse500 = {\n data: ApiError\n status: 500\n}\n \nexport type exchangeCliTokenResponseSuccess = (exchangeCliTokenResponse200) & {\n headers: Headers;\n};\nexport type exchangeCliTokenResponseError = (exchangeCliTokenResponse400 | exchangeCliTokenResponse401 | exchangeCliTokenResponse403 | exchangeCliTokenResponse404 | exchangeCliTokenResponse500) & {\n headers: Headers;\n};\n\nexport type exchangeCliTokenResponse = (exchangeCliTokenResponseSuccess | exchangeCliTokenResponseError)\n\nexport const getExchangeCliTokenUrl = () => {\n\n\n \n\n return `/api/api-keys/cli-token-exchange`\n}\n\nexport const exchangeCliToken = async (exchangeCliTokenInput: ExchangeCliTokenInput, options?: RequestInit): Promise<exchangeCliTokenResponse> => {\n \n return customFetch<exchangeCliTokenResponse>(getExchangeCliTokenUrl(),\n { \n ...options,\n method: 'POST',\n headers: { 'Content-Type': 'application/json', ...options?.headers },\n body: JSON.stringify(\n exchangeCliTokenInput,)\n }\n);}\n\n\n\n/**\n * Get current user's username and whether they can change it\n * @summary Get username info\n */\nexport type getUsernameInfoResponse200 = {\n data: UsernameInfo\n status: 200\n}\n\nexport type getUsernameInfoResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type getUsernameInfoResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type getUsernameInfoResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type getUsernameInfoResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type getUsernameInfoResponse500 = {\n data: ApiError\n status: 500\n}\n \nexport type getUsernameInfoResponseSuccess = (getUsernameInfoResponse200) & {\n headers: Headers;\n};\nexport type getUsernameInfoResponseError = (getUsernameInfoResponse400 | getUsernameInfoResponse401 | getUsernameInfoResponse403 | getUsernameInfoResponse404 | getUsernameInfoResponse500) & {\n headers: Headers;\n};\n\nexport type getUsernameInfoResponse = (getUsernameInfoResponseSuccess | getUsernameInfoResponseError)\n\nexport const getGetUsernameInfoUrl = () => {\n\n\n \n\n return `/api/auth/username`\n}\n\nexport const getUsernameInfo = async ( options?: RequestInit): Promise<getUsernameInfoResponse> => {\n \n return customFetch<getUsernameInfoResponse>(getGetUsernameInfoUrl(),\n { \n ...options,\n method: 'GET'\n \n \n }\n);}\n\n\n\n/**\n * Update the current user's username. Can only be done once.\n * @summary Update username\n */\nexport type updateUsernameResponse200 = {\n data: UpdateUsernameOutput\n status: 200\n}\n\nexport type updateUsernameResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type updateUsernameResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type updateUsernameResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type updateUsernameResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type updateUsernameResponse500 = {\n data: ApiError\n status: 500\n}\n \nexport type updateUsernameResponseSuccess = (updateUsernameResponse200) & {\n headers: Headers;\n};\nexport type updateUsernameResponseError = (updateUsernameResponse400 | updateUsernameResponse401 | updateUsernameResponse403 | updateUsernameResponse404 | updateUsernameResponse500) & {\n headers: Headers;\n};\n\nexport type updateUsernameResponse = (updateUsernameResponseSuccess | updateUsernameResponseError)\n\nexport const getUpdateUsernameUrl = () => {\n\n\n \n\n return `/api/auth/username`\n}\n\nexport const updateUsername = async (updateUsernameInput: UpdateUsernameInput, options?: RequestInit): Promise<updateUsernameResponse> => {\n \n return customFetch<updateUsernameResponse>(getUpdateUsernameUrl(),\n { \n ...options,\n method: 'PUT',\n headers: { 'Content-Type': 'application/json', ...options?.headers },\n body: JSON.stringify(\n updateUsernameInput,)\n }\n);}\n\n\n\n/**\n * Check if a username is available for use\n * @summary Check username availability\n */\nexport type checkUsernameAvailabilityResponse200 = {\n data: CheckUsernameOutput\n status: 200\n}\n\nexport type checkUsernameAvailabilityResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type checkUsernameAvailabilityResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type checkUsernameAvailabilityResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type checkUsernameAvailabilityResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type checkUsernameAvailabilityResponse500 = {\n data: ApiError\n status: 500\n}\n \nexport type checkUsernameAvailabilityResponseSuccess = (checkUsernameAvailabilityResponse200) & {\n headers: Headers;\n};\nexport type checkUsernameAvailabilityResponseError = (checkUsernameAvailabilityResponse400 | checkUsernameAvailabilityResponse401 | checkUsernameAvailabilityResponse403 | checkUsernameAvailabilityResponse404 | checkUsernameAvailabilityResponse500) & {\n headers: Headers;\n};\n\nexport type checkUsernameAvailabilityResponse = (checkUsernameAvailabilityResponseSuccess | checkUsernameAvailabilityResponseError)\n\nexport const getCheckUsernameAvailabilityUrl = (params: CheckUsernameAvailabilityParams,) => {\n const normalizedParams = new URLSearchParams();\n\n Object.entries(params || {}).forEach(([key, value]) => {\n \n if (value !== undefined) {\n normalizedParams.append(key, value === null ? 'null' : value.toString())\n }\n });\n\n const stringifiedParams = normalizedParams.toString();\n\n return stringifiedParams.length > 0 ? `/api/auth/username/check?${stringifiedParams}` : `/api/auth/username/check`\n}\n\nexport const checkUsernameAvailability = async (params: CheckUsernameAvailabilityParams, options?: RequestInit): Promise<checkUsernameAvailabilityResponse> => {\n \n return customFetch<checkUsernameAvailabilityResponse>(getCheckUsernameAvailabilityUrl(params),\n { \n ...options,\n method: 'GET'\n \n \n }\n);}\n\n\n\n/**\n * Get available username suggestions based on user's email and name\n * @summary Get username suggestions\n */\nexport type getUsernameSuggestionsResponse200 = {\n data: GetSuggestionsOutput\n status: 200\n}\n\nexport type getUsernameSuggestionsResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type getUsernameSuggestionsResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type getUsernameSuggestionsResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type getUsernameSuggestionsResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type getUsernameSuggestionsResponse500 = {\n data: ApiError\n status: 500\n}\n \nexport type getUsernameSuggestionsResponseSuccess = (getUsernameSuggestionsResponse200) & {\n headers: Headers;\n};\nexport type getUsernameSuggestionsResponseError = (getUsernameSuggestionsResponse400 | getUsernameSuggestionsResponse401 | getUsernameSuggestionsResponse403 | getUsernameSuggestionsResponse404 | getUsernameSuggestionsResponse500) & {\n headers: Headers;\n};\n\nexport type getUsernameSuggestionsResponse = (getUsernameSuggestionsResponseSuccess | getUsernameSuggestionsResponseError)\n\nexport const getGetUsernameSuggestionsUrl = () => {\n\n\n \n\n return `/api/auth/username/suggestions`\n}\n\nexport const getUsernameSuggestions = async ( options?: RequestInit): Promise<getUsernameSuggestionsResponse> => {\n \n return customFetch<getUsernameSuggestionsResponse>(getGetUsernameSuggestionsUrl(),\n { \n ...options,\n method: 'GET'\n \n \n }\n);}\n\n\n\n/**\n * Get the current authenticated user's info\n * @summary Get current user\n */\nexport type meResponse200 = {\n data: MeResponseData | null\n status: 200\n}\n\nexport type meResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type meResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type meResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type meResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type meResponse500 = {\n data: ApiError\n status: 500\n}\n \nexport type meResponseSuccess = (meResponse200) & {\n headers: Headers;\n};\nexport type meResponseError = (meResponse400 | meResponse401 | meResponse403 | meResponse404 | meResponse500) & {\n headers: Headers;\n};\n\nexport type meResponse = (meResponseSuccess | meResponseError)\n\nexport const getMeUrl = () => {\n\n\n \n\n return `/api/skills/me`\n}\n\nexport const me = async ( options?: RequestInit): Promise<meResponse> => {\n \n return customFetch<meResponse>(getMeUrl(),\n { \n ...options,\n method: 'GET'\n \n \n }\n);}\n\n\n\n/**\n * List all skills owned by the authenticated user\n * @summary List my skills\n */\nexport type listMySkillsResponse200 = {\n data: SkillListResponse\n status: 200\n}\n\nexport type listMySkillsResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type listMySkillsResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type listMySkillsResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type listMySkillsResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type listMySkillsResponse500 = {\n data: ApiError\n status: 500\n}\n \nexport type listMySkillsResponseSuccess = (listMySkillsResponse200) & {\n headers: Headers;\n};\nexport type listMySkillsResponseError = (listMySkillsResponse400 | listMySkillsResponse401 | listMySkillsResponse403 | listMySkillsResponse404 | listMySkillsResponse500) & {\n headers: Headers;\n};\n\nexport type listMySkillsResponse = (listMySkillsResponseSuccess | listMySkillsResponseError)\n\nexport const getListMySkillsUrl = () => {\n\n\n \n\n return `/api/skills`\n}\n\nexport const listMySkills = async ( options?: RequestInit): Promise<listMySkillsResponse> => {\n \n return customFetch<listMySkillsResponse>(getListMySkillsUrl(),\n { \n ...options,\n method: 'GET'\n \n \n }\n);}\n\n\n\n/**\n * List all skills for a specific user\n * @summary List user skills\n */\nexport type listUserSkillsResponse200 = {\n data: SkillListResponse\n status: 200\n}\n\nexport type listUserSkillsResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type listUserSkillsResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type listUserSkillsResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type listUserSkillsResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type listUserSkillsResponse500 = {\n data: ApiError\n status: 500\n}\n \nexport type listUserSkillsResponseSuccess = (listUserSkillsResponse200) & {\n headers: Headers;\n};\nexport type listUserSkillsResponseError = (listUserSkillsResponse400 | listUserSkillsResponse401 | listUserSkillsResponse403 | listUserSkillsResponse404 | listUserSkillsResponse500) & {\n headers: Headers;\n};\n\nexport type listUserSkillsResponse = (listUserSkillsResponseSuccess | listUserSkillsResponseError)\n\nexport const getListUserSkillsUrl = (username: Username,) => {\n\n\n \n\n return `/api/skills/@user/${username}`\n}\n\nexport const listUserSkills = async (username: Username, options?: RequestInit): Promise<listUserSkillsResponse> => {\n \n return customFetch<listUserSkillsResponse>(getListUserSkillsUrl(username),\n { \n ...options,\n method: 'GET'\n \n \n }\n);}\n\n\n\n/**\n * Get a specific skill by username and name\n * @summary Get skill\n */\nexport type getSkillResponse200 = {\n data: SkillWithUser\n status: 200\n}\n\nexport type getSkillResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type getSkillResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type getSkillResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type getSkillResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type getSkillResponse500 = {\n data: ApiError\n status: 500\n}\n \nexport type getSkillResponseSuccess = (getSkillResponse200) & {\n headers: Headers;\n};\nexport type getSkillResponseError = (getSkillResponse400 | getSkillResponse401 | getSkillResponse403 | getSkillResponse404 | getSkillResponse500) & {\n headers: Headers;\n};\n\nexport type getSkillResponse = (getSkillResponseSuccess | getSkillResponseError)\n\nexport const getGetSkillUrl = (username: Username,\n name: SkillName,) => {\n\n\n \n\n return `/api/skills/@user/${username}/${name}`\n}\n\nexport const getSkill = async (username: Username,\n name: SkillName, options?: RequestInit): Promise<getSkillResponse> => {\n \n return customFetch<getSkillResponse>(getGetSkillUrl(username,name),\n { \n ...options,\n method: 'GET'\n \n \n }\n);}\n\n\n\n/**\n * List all versions for a specific skill\n * @summary List skill versions\n */\nexport type listSkillVersionsResponse200 = {\n data: SkillVersion[]\n status: 200\n}\n\nexport type listSkillVersionsResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type listSkillVersionsResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type listSkillVersionsResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type listSkillVersionsResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type listSkillVersionsResponse500 = {\n data: ApiError\n status: 500\n}\n \nexport type listSkillVersionsResponseSuccess = (listSkillVersionsResponse200) & {\n headers: Headers;\n};\nexport type listSkillVersionsResponseError = (listSkillVersionsResponse400 | listSkillVersionsResponse401 | listSkillVersionsResponse403 | listSkillVersionsResponse404 | listSkillVersionsResponse500) & {\n headers: Headers;\n};\n\nexport type listSkillVersionsResponse = (listSkillVersionsResponseSuccess | listSkillVersionsResponseError)\n\nexport const getListSkillVersionsUrl = (username: Username,\n name: SkillName,) => {\n\n\n \n\n return `/api/skills/@user/${username}/${name}/versions`\n}\n\nexport const listSkillVersions = async (username: Username,\n name: SkillName, options?: RequestInit): Promise<listSkillVersionsResponse> => {\n \n return customFetch<listSkillVersionsResponse>(getListSkillVersionsUrl(username,name),\n { \n ...options,\n method: 'GET'\n \n \n }\n);}\n\n\n\n/**\n * Get metadata for a specific skill version\n * @summary Get skill version\n */\nexport type getSkillVersionResponse200 = {\n data: SkillVersionWithDownload\n status: 200\n}\n\nexport type getSkillVersionResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type getSkillVersionResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type getSkillVersionResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type getSkillVersionResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type getSkillVersionResponse500 = {\n data: ApiError\n status: 500\n}\n \nexport type getSkillVersionResponseSuccess = (getSkillVersionResponse200) & {\n headers: Headers;\n};\nexport type getSkillVersionResponseError = (getSkillVersionResponse400 | getSkillVersionResponse401 | getSkillVersionResponse403 | getSkillVersionResponse404 | getSkillVersionResponse500) & {\n headers: Headers;\n};\n\nexport type getSkillVersionResponse = (getSkillVersionResponseSuccess | getSkillVersionResponseError)\n\nexport const getGetSkillVersionUrl = (username: Username,\n name: SkillName,\n version: Semver,) => {\n\n\n \n\n return `/api/skills/@user/${username}/${name}/${version}`\n}\n\nexport const getSkillVersion = async (username: Username,\n name: SkillName,\n version: Semver, options?: RequestInit): Promise<getSkillVersionResponse> => {\n \n return customFetch<getSkillVersionResponse>(getGetSkillVersionUrl(username,name,version),\n { \n ...options,\n method: 'GET'\n \n \n }\n);}\n\n\n\n/**\n * Publish a new skill or a new version of an existing skill\n * @summary Publish skill\n */\nexport type publishSkillResponse200 = {\n data: PublishSkillResponse\n status: 200\n}\n\nexport type publishSkillResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type publishSkillResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type publishSkillResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type publishSkillResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type publishSkillResponse500 = {\n data: ApiError\n status: 500\n}\n \nexport type publishSkillResponseSuccess = (publishSkillResponse200) & {\n headers: Headers;\n};\nexport type publishSkillResponseError = (publishSkillResponse400 | publishSkillResponse401 | publishSkillResponse403 | publishSkillResponse404 | publishSkillResponse500) & {\n headers: Headers;\n};\n\nexport type publishSkillResponse = (publishSkillResponseSuccess | publishSkillResponseError)\n\nexport const getPublishSkillUrl = () => {\n\n\n \n\n return `/api/skills/publish`\n}\n\nexport const publishSkill = async (publishSkillInput: PublishSkillInput, options?: RequestInit): Promise<publishSkillResponse> => {\n \n return customFetch<publishSkillResponse>(getPublishSkillUrl(),\n { \n ...options,\n method: 'POST',\n headers: { 'Content-Type': 'application/json', ...options?.headers },\n body: JSON.stringify(\n publishSkillInput,)\n }\n);}\n\n\n\n/**\n * Delete a skill and all its versions (owner only)\n * @summary Delete skill\n */\nexport type deleteSkillResponse200 = {\n data: SuccessResponse & unknown\n status: 200\n}\n\nexport type deleteSkillResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type deleteSkillResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type deleteSkillResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type deleteSkillResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type deleteSkillResponse500 = {\n data: ApiError\n status: 500\n}\n \nexport type deleteSkillResponseSuccess = (deleteSkillResponse200) & {\n headers: Headers;\n};\nexport type deleteSkillResponseError = (deleteSkillResponse400 | deleteSkillResponse401 | deleteSkillResponse403 | deleteSkillResponse404 | deleteSkillResponse500) & {\n headers: Headers;\n};\n\nexport type deleteSkillResponse = (deleteSkillResponseSuccess | deleteSkillResponseError)\n\nexport const getDeleteSkillUrl = (name: SkillName,) => {\n\n\n \n\n return `/api/skills/${name}`\n}\n\nexport const deleteSkill = async (name: SkillName, options?: RequestInit): Promise<deleteSkillResponse> => {\n \n return customFetch<deleteSkillResponse>(getDeleteSkillUrl(name),\n { \n ...options,\n method: 'DELETE'\n \n \n }\n);}\n\n\n\n/**\n * Delete a specific version of a skill (owner only)\n * @summary Delete skill version\n */\nexport type deleteSkillVersionResponse200 = {\n data: SuccessResponse & unknown\n status: 200\n}\n\nexport type deleteSkillVersionResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type deleteSkillVersionResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type deleteSkillVersionResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type deleteSkillVersionResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type deleteSkillVersionResponse500 = {\n data: ApiError\n status: 500\n}\n \nexport type deleteSkillVersionResponseSuccess = (deleteSkillVersionResponse200) & {\n headers: Headers;\n};\nexport type deleteSkillVersionResponseError = (deleteSkillVersionResponse400 | deleteSkillVersionResponse401 | deleteSkillVersionResponse403 | deleteSkillVersionResponse404 | deleteSkillVersionResponse500) & {\n headers: Headers;\n};\n\nexport type deleteSkillVersionResponse = (deleteSkillVersionResponseSuccess | deleteSkillVersionResponseError)\n\nexport const getDeleteSkillVersionUrl = (name: SkillName,\n version: Semver,) => {\n\n\n \n\n return `/api/skills/${name}/${version}`\n}\n\nexport const deleteSkillVersion = async (name: SkillName,\n version: Semver, options?: RequestInit): Promise<deleteSkillVersionResponse> => {\n \n return customFetch<deleteSkillVersionResponse>(getDeleteSkillVersionUrl(name,version),\n { \n ...options,\n method: 'DELETE'\n \n \n }\n);}\n\n\n\n/**\n * Submit client-side errors for logging and monitoring. Used by the frontend error capture service.\n * @summary Report client errors\n */\nexport type reportErrorsResponse200 = {\n data: SuccessResponse\n status: 200\n}\n\nexport type reportErrorsResponse400 = {\n data: ValidationError\n status: 400\n}\n\nexport type reportErrorsResponse401 = {\n data: ApiError\n status: 401\n}\n\nexport type reportErrorsResponse403 = {\n data: ApiError\n status: 403\n}\n\nexport type reportErrorsResponse404 = {\n data: ApiError\n status: 404\n}\n\nexport type reportErrorsResponse500 = {\n data: ApiError\n status: 500\n}\n \nexport type reportErrorsResponseSuccess = (reportErrorsResponse200) & {\n headers: Headers;\n};\nexport type reportErrorsResponseError = (reportErrorsResponse400 | reportErrorsResponse401 | reportErrorsResponse403 | reportErrorsResponse404 | reportErrorsResponse500) & {\n headers: Headers;\n};\n\nexport type reportErrorsResponse = (reportErrorsResponseSuccess | reportErrorsResponseError)\n\nexport const getReportErrorsUrl = () => {\n\n\n \n\n return `/errors/report`\n}\n\nexport const reportErrors = async (errorReportPayload: ErrorReportPayload, options?: RequestInit): Promise<reportErrorsResponse> => {\n \n return customFetch<reportErrorsResponse>(getReportErrorsUrl(),\n { \n ...options,\n method: 'POST',\n headers: { 'Content-Type': 'application/json', ...options?.headers },\n body: JSON.stringify(\n errorReportPayload,)\n }\n);}\n","/**\n * PSPM SDK - Type-safe client for the PSPM skill registry API\n *\n * This package provides two types of clients:\n *\n * ## CLI Client (fetch)\n * For CLI tools that use API keys for authentication:\n * ```typescript\n * import { configure, me, publishSkill } from \"@repo/sdk\";\n *\n * configure({\n * baseUrl: \"http://localhost:5600\",\n * apiKey: \"your-api-key\"\n * });\n *\n * const { data: user } = await me();\n * ```\n *\n * ## Web Client (react-query)\n * For web apps that use cookie-based session authentication:\n * ```typescript\n * import { setWebBaseUrl } from \"@repo/sdk/web\";\n * import { useListMySkills, useDeleteSkill } from \"@repo/sdk/react-query\";\n *\n * setWebBaseUrl(\"http://localhost:5600\");\n *\n * // In a React component\n * const { data: skills } = useListMySkills();\n * const deleteMutation = useDeleteSkill();\n * ```\n */\n\n// CLI exports - configuration and error handling\nexport {\n\tconfigure,\n\tgetConfig,\n\tisConfigured,\n\ttype SDKConfig,\n\tSDKError,\n} from \"./fetchers/cli-fetcher\";\n\n// CLI exports - all generated API functions and types\nexport * from \"./generated/fetch\";\n","/**\n * API Client for PSPM CLI\n *\n * This module re-exports the SDK functions and provides the\n * initialization logic for the CLI.\n */\n\nimport {\n\tdeleteSkill,\n\tdeleteSkillVersion,\n\texchangeCliToken,\n\tgetConfig,\n\tgetSkill,\n\tgetSkillVersion,\n\tisConfigured,\n\tlistMySkills,\n\tlistSkillVersions,\n\tlistUserSkills,\n\tme,\n\tpublishSkill,\n\ttype SDKConfig,\n\tSDKError,\n\tconfigure as sdkConfigure,\n} from \"@repo/sdk\";\n\n/**\n * Convert a registry URL to the base server URL for the SDK.\n *\n * The CLI stores registry URLs like \"https://pspm.dev\". This function\n * normalizes the URL by removing any trailing /api/skills path if present\n * (for backwards compatibility with older configs).\n */\nfunction registryUrlToBaseUrl(registryUrl: string): string {\n\treturn registryUrl.replace(/\\/api\\/skills\\/?$/, \"\");\n}\n\n/**\n * Configure the SDK with registry URL and API key.\n *\n * This wrapper handles converting the CLI's registry URL format to the\n * base URL format expected by the SDK.\n */\nexport function configure(options: {\n\tregistryUrl: string;\n\tapiKey: string;\n}): void {\n\tconst baseUrl = registryUrlToBaseUrl(options.registryUrl);\n\tsdkConfigure({ baseUrl, apiKey: options.apiKey });\n}\n\n// Re-export SDK functions for convenience\nexport {\n\tdeleteSkill,\n\tdeleteSkillVersion,\n\texchangeCliToken,\n\tgetConfig,\n\tgetSkill,\n\tgetSkillVersion,\n\tisConfigured,\n\tlistMySkills,\n\tlistSkillVersions,\n\tlistUserSkills,\n\tme,\n\tpublishSkill,\n\tSDKError,\n};\n\n// Re-export types\nexport type { SDKConfig };\n\n/**\n * Get user info from the API using the /me endpoint.\n * Returns null if not authenticated.\n */\nexport async function whoamiRequest(\n\tregistryUrl: string,\n\tapiKey: string,\n): Promise<{ username: string; userId: string } | null> {\n\ttry {\n\t\t// Use direct REST endpoints (not oRPC /rpc prefix)\n\t\tconfigure({ registryUrl, apiKey });\n\t\tconst response = await me();\n\t\t// Check for successful response before accessing user data\n\t\tif (response.status !== 200 || !response.data) {\n\t\t\treturn null;\n\t\t}\n\t\tconst user = response.data;\n\t\treturn {\n\t\t\tusername: user.username,\n\t\t\tuserId: user.userId,\n\t\t};\n\t} catch {\n\t\treturn null;\n\t}\n}\n\n/**\n * Deprecate a skill version\n */\nexport async function deprecateSkillVersion(\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/${skillName}/${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\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/${skillName}/${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\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/${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 * Extract a human-readable error message from an API response\n * Handles both ApiError and ValidationError types\n */\nexport function extractApiErrorMessage(\n\tresponse: { status: number; data: unknown },\n\tfallbackMessage: string,\n): string {\n\tconst errorData = response.data as ApiErrorResponse | null;\n\n\tif (process.env.PSPM_DEBUG) {\n\t\tconsole.log(`[debug] API response status: ${response.status}`);\n\t\tconsole.log(\n\t\t\t`[debug] API response data:`,\n\t\t\tJSON.stringify(errorData, null, 2),\n\t\t);\n\t}\n\n\tif (!errorData) {\n\t\treturn `${fallbackMessage} (HTTP ${response.status})`;\n\t}\n\n\t// Start with the message field or fallback\n\tlet errorMessage = errorData.message || fallbackMessage;\n\n\t// For validation errors, format the issues\n\tif (errorData.code === \"VALIDATION_ERROR\" && errorData.details) {\n\t\tconst issues = (\n\t\t\terrorData.details as {\n\t\t\t\tissues?: Array<{ path?: Array<string | number>; message?: string }>;\n\t\t\t}\n\t\t).issues;\n\t\tif (issues && Array.isArray(issues)) {\n\t\t\tconst issueMessages = issues\n\t\t\t\t.map((issue) => {\n\t\t\t\t\tconst path = issue.path?.join(\".\") || \"input\";\n\t\t\t\t\tconst msg = issue.message || \"invalid value\";\n\t\t\t\t\treturn ` - ${path}: ${msg}`;\n\t\t\t\t})\n\t\t\t\t.join(\"\\n\");\n\t\t\terrorMessage = `Validation failed:\\n${issueMessages}`;\n\t\t}\n\t}\n\n\t// Add error code prefix if available and not already in message\n\tif (errorData.code && !errorMessage.includes(errorData.code)) {\n\t\terrorMessage = `[${errorData.code}] ${errorMessage}`;\n\t}\n\n\t// Add request ID for debugging\n\tif (errorData.requestId) {\n\t\terrorMessage += `\\n(Request ID: ${errorData.requestId})`;\n\t}\n\n\treturn errorMessage;\n}\n","import { mkdir, readFile, stat, unlink, writeFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\nimport * as ini from \"ini\";\nimport { NotLoggedInError } from \"./errors.js\";\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/**\n * User config stored in ~/.pspmrc (INI format)\n *\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://pspm.dev\";\n\n/**\n * Get the user config file path (~/.pspmrc)\n */\nexport function getConfigPath(): string {\n\treturn join(homedir(), \".pspmrc\");\n}\n\n/**\n * Get the legacy config file path (~/.pspm/config.json) for migration\n */\nfunction getLegacyConfigPath(): string {\n\treturn join(homedir(), \".pspm\", \"config.json\");\n}\n\n/**\n * Get the .pspm directory path (for current project)\n */\nexport function getPspmDir(): string {\n\treturn join(process.cwd(), \".pspm\");\n}\n\n/**\n * Get the skills directory path (for current project)\n * New path: .pspm/skills/\n */\nexport function getSkillsDir(): string {\n\treturn join(process.cwd(), \".pspm\", \"skills\");\n}\n\n/**\n * Get the cache directory path (for current project)\n * Used for tarball caching: .pspm/cache/\n */\nexport function getCacheDir(): string {\n\treturn join(process.cwd(), \".pspm\", \"cache\");\n}\n\n/**\n * Get the lockfile path (for current project)\n * New path: pspm-lock.json (at project root, npm-style)\n */\nexport function getLockfilePath(): string {\n\treturn join(process.cwd(), \"pspm-lock.json\");\n}\n\n/**\n * Get the legacy lockfile path (for migration)\n */\nexport function getLegacyLockfilePath(): string {\n\treturn join(process.cwd(), \"skill-lock.json\");\n}\n\n/**\n * Get the legacy skills directory path (for migration)\n */\nexport function getLegacySkillsDir(): string {\n\treturn join(process.cwd(), \".skills\");\n}\n\n// =============================================================================\n// INI Config Functions\n// =============================================================================\n\n/**\n * Read the user config file (~/.pspmrc, INI format)\n *\n * Supports npm-style configuration:\n * ```ini\n * ; Default registry and auth\n * registry = https://pspm.dev\n * authToken = sk_default\n *\n * ; Scope mappings\n * @myorg:registry = https://corp.pspm.io\n *\n * ; Per-registry tokens\n * //pspm.dev:authToken = sk_public\n * //corp.pspm.io:authToken = sk_corp\n * ```\n */\nexport async function readUserConfig(): Promise<UserConfig> {\n\tconst configPath = getConfigPath();\n\n\tif (process.env.PSPM_DEBUG) {\n\t\tconsole.log(`[config] Reading config from: ${configPath}`);\n\t}\n\n\ttry {\n\t\tconst content = await readFile(configPath, \"utf-8\");\n\t\tconst parsed = ini.parse(content);\n\n\t\tif (process.env.PSPM_DEBUG) {\n\t\t\tconsole.log(`[config] Parsed config:`, JSON.stringify(parsed, null, 2));\n\t\t}\n\n\t\t// Extract scoped registries (@scope:registry = url)\n\t\tconst scopedRegistries: Record<string, string> = {};\n\t\tfor (const key of Object.keys(parsed)) {\n\t\t\tconst scopeMatch = key.match(/^(@[^:]+):registry$/);\n\t\t\tif (scopeMatch) {\n\t\t\t\tconst scope = scopeMatch[1];\n\t\t\t\tscopedRegistries[scope] = parsed[key] as string;\n\t\t\t}\n\t\t}\n\n\t\t// Extract per-registry tokens (//host:authToken = token)\n\t\t// INI parser may nest these under a key like \"//host\"\n\t\tconst registryTokens: Record<string, string> = {};\n\t\tfor (const key of Object.keys(parsed)) {\n\t\t\t// Check for //host:authToken format\n\t\t\tconst tokenMatch = key.match(/^\\/\\/([^:]+):authToken$/);\n\t\t\tif (tokenMatch) {\n\t\t\t\tconst host = tokenMatch[1];\n\t\t\t\tregistryTokens[host] = parsed[key] as string;\n\t\t\t}\n\t\t\t// Also check for nested format (ini parser may parse //host as a section)\n\t\t\tif (key.startsWith(\"//\") && typeof parsed[key] === \"object\") {\n\t\t\t\tconst host = key.slice(2);\n\t\t\t\tconst section = parsed[key] as Record<string, string>;\n\t\t\t\tif (section.authToken) {\n\t\t\t\t\tregistryTokens[host] = section.authToken;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\tregistry: parsed.registry as string | undefined,\n\t\t\tauthToken: parsed.authToken as string | undefined,\n\t\t\tusername: parsed.username as string | undefined,\n\t\t\tscopedRegistries:\n\t\t\t\tObject.keys(scopedRegistries).length > 0 ? scopedRegistries : undefined,\n\t\t\tregistryTokens:\n\t\t\t\tObject.keys(registryTokens).length > 0 ? registryTokens : undefined,\n\t\t};\n\t} catch (error) {\n\t\tif (process.env.PSPM_DEBUG) {\n\t\t\tconsole.log(\n\t\t\t\t`[config] Error reading config: ${\n\t\t\t\t\terror instanceof Error ? error.message : String(error)\n\t\t\t\t}`,\n\t\t\t);\n\t\t}\n\t\treturn {};\n\t}\n}\n\n/**\n * Write the user config file (~/.pspmrc, INI format)\n */\nexport async function writeUserConfig(config: UserConfig): Promise<void> {\n\tconst configPath = getConfigPath();\n\n\t// Build INI content with comments\n\tconst lines: string[] = [\"; PSPM Configuration\", \"\"];\n\n\tif (config.registry) {\n\t\tlines.push(`registry = ${config.registry}`);\n\t}\n\tif (config.authToken) {\n\t\tlines.push(`authToken = ${config.authToken}`);\n\t}\n\tif (config.username) {\n\t\tlines.push(`username = ${config.username}`);\n\t}\n\n\t// Always end with a newline\n\tlines.push(\"\");\n\n\tawait mkdir(dirname(configPath), { recursive: true });\n\tawait writeFile(configPath, lines.join(\"\\n\"));\n\n\tif (process.env.PSPM_DEBUG) {\n\t\tconsole.log(`[config] Wrote config to: ${configPath}`);\n\t}\n}\n\n/**\n * Find and read project config (.pspmrc) by searching up directory tree\n */\nexport async function findProjectConfig(): Promise<ProjectConfig | null> {\n\tlet currentDir = process.cwd();\n\tconst root = dirname(currentDir);\n\n\twhile (currentDir !== root) {\n\t\tconst configPath = join(currentDir, \".pspmrc\");\n\t\ttry {\n\t\t\tconst stats = await stat(configPath);\n\t\t\tif (stats.isFile()) {\n\t\t\t\tconst content = await readFile(configPath, \"utf-8\");\n\t\t\t\t// Try parsing as INI first\n\t\t\t\ttry {\n\t\t\t\t\tconst parsed = ini.parse(content);\n\t\t\t\t\tif (process.env.PSPM_DEBUG) {\n\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t`[config] Found project config at ${configPath}:`,\n\t\t\t\t\t\t\tJSON.stringify(parsed, null, 2),\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\treturn {\n\t\t\t\t\t\tregistry: parsed.registry as string | undefined,\n\t\t\t\t\t};\n\t\t\t\t} catch {\n\t\t\t\t\t// Fall back to JSON for backward compatibility during migration\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst jsonConfig = JSON.parse(content);\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tregistry: jsonConfig.registryUrl,\n\t\t\t\t\t\t};\n\t\t\t\t\t} catch {\n\t\t\t\t\t\t// Unparseable, skip\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} catch {\n\t\t\t// File doesn't exist, continue searching\n\t\t}\n\t\tcurrentDir = dirname(currentDir);\n\t}\n\n\treturn null;\n}\n\n/**\n * Migrate from legacy config format (~/.pspm/config.json) if it exists\n */\nasync function migrateFromLegacyConfig(): Promise<UserConfig | null> {\n\tconst legacyPath = getLegacyConfigPath();\n\n\ttry {\n\t\tconst content = await readFile(legacyPath, \"utf-8\");\n\t\tconst parsed = JSON.parse(content);\n\n\t\tlet config: UserConfig = {};\n\n\t\t// Check if V2 format (with profiles)\n\t\tif (parsed.version === 2 && parsed.profiles) {\n\t\t\tconst v2Config = parsed as LegacyConfigV2;\n\t\t\tconst defaultProfileName = v2Config.defaultProfile || \"default\";\n\t\t\tconst profile = v2Config.profiles[defaultProfileName];\n\n\t\t\tif (profile) {\n\t\t\t\tconfig = {\n\t\t\t\t\tregistry:\n\t\t\t\t\t\tprofile.registryUrl !== DEFAULT_REGISTRY_URL\n\t\t\t\t\t\t\t? profile.registryUrl\n\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\tauthToken: profile.apiKey,\n\t\t\t\t\tusername: profile.username,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tconsole.log(\n\t\t\t\t`Migrating from legacy config (profile: ${defaultProfileName})...`,\n\t\t\t);\n\t\t} else {\n\t\t\t// V1 format (flat)\n\t\t\tconst v1Config = parsed as LegacyConfigV1;\n\t\t\tconfig = {\n\t\t\t\tregistry:\n\t\t\t\t\tv1Config.registryUrl !== DEFAULT_REGISTRY_URL\n\t\t\t\t\t\t? v1Config.registryUrl\n\t\t\t\t\t\t: undefined,\n\t\t\t\tauthToken: v1Config.apiKey,\n\t\t\t\tusername: v1Config.username,\n\t\t\t};\n\n\t\t\tconsole.log(\"Migrating from legacy config...\");\n\t\t}\n\n\t\t// Write new format\n\t\tawait writeUserConfig(config);\n\t\tconsole.log(`Created new config at: ${getConfigPath()}`);\n\n\t\t// Remove old config directory\n\t\tawait unlink(legacyPath);\n\t\tconsole.log(`Removed legacy config: ${legacyPath}`);\n\n\t\treturn config;\n\t} catch {\n\t\t// Legacy config doesn't exist or couldn't be read\n\t\treturn null;\n\t}\n}\n\n/**\n * Resolve the full configuration using cascade priority:\n * 1. Environment variables (PSPM_REGISTRY_URL, PSPM_API_KEY)\n * 2. Project config (.pspmrc in project directory)\n * 3. User config (~/.pspmrc)\n * 4. Defaults\n */\nexport async function resolveConfig(): Promise<ResolvedConfig> {\n\t// Check for legacy config and migrate if needed\n\tconst newConfigPath = getConfigPath();\n\ttry {\n\t\tawait stat(newConfigPath);\n\t} catch {\n\t\t// New config doesn't exist, try migrating from legacy\n\t\tawait migrateFromLegacyConfig();\n\t}\n\n\tconst userConfig = await readUserConfig();\n\tconst projectConfig = await findProjectConfig();\n\n\t// Build resolved config with cascade priority\n\tlet registryUrl = DEFAULT_REGISTRY_URL;\n\tlet apiKey = userConfig.authToken;\n\tconst username = userConfig.username;\n\tconst scopedRegistries = userConfig.scopedRegistries ?? {};\n\tconst registryTokens = userConfig.registryTokens ?? {};\n\n\t// User config\n\tif (userConfig.registry) {\n\t\tregistryUrl = userConfig.registry;\n\t}\n\n\t// Project config can override registryUrl (but not apiKey for security)\n\tif (projectConfig?.registry) {\n\t\tregistryUrl = projectConfig.registry;\n\t}\n\n\t// Environment variables always win\n\tif (process.env.PSPM_REGISTRY_URL) {\n\t\tregistryUrl = process.env.PSPM_REGISTRY_URL;\n\t}\n\tif (process.env.PSPM_API_KEY) {\n\t\tapiKey = process.env.PSPM_API_KEY;\n\t}\n\n\tif (process.env.PSPM_DEBUG) {\n\t\tconsole.log(`[config] Resolved config:`);\n\t\tconsole.log(`[config] registryUrl: ${registryUrl}`);\n\t\tconsole.log(`[config] apiKey: ${apiKey ? \"***\" : \"(not set)\"}`);\n\t\tconsole.log(`[config] username: ${username || \"(not set)\"}`);\n\t\tconsole.log(\n\t\t\t`[config] scopedRegistries: ${JSON.stringify(scopedRegistries)}`,\n\t\t);\n\t\tconsole.log(\n\t\t\t`[config] registryTokens: ${Object.keys(registryTokens).length} configured`,\n\t\t);\n\t}\n\n\treturn {\n\t\tregistryUrl,\n\t\tapiKey,\n\t\tusername,\n\t\tscopedRegistries,\n\t\tregistryTokens,\n\t};\n}\n\n// =============================================================================\n// Multi-Registry Helpers\n// =============================================================================\n\n/**\n * Get the auth token for a given registry URL.\n * Falls back to the default API key if no registry-specific token is configured.\n *\n * @param config - The resolved configuration\n * @param registryUrl - The registry URL\n * @returns The auth token to use, or undefined if none available\n */\nexport function getTokenForRegistry(\n\tconfig: ResolvedConfig,\n\tregistryUrl: string,\n): string | undefined {\n\ttry {\n\t\tconst url = new URL(registryUrl);\n\t\tconst host = url.host;\n\n\t\t// Check for host-specific token first\n\t\tif (config.registryTokens[host]) {\n\t\t\treturn config.registryTokens[host];\n\t\t}\n\n\t\t// Fall back to default API key\n\t\treturn config.apiKey;\n\t} catch {\n\t\t// Invalid URL, fall back to default\n\t\treturn config.apiKey;\n\t}\n}\n\n// =============================================================================\n// Credential Management\n// =============================================================================\n\n/**\n * Set credentials (authToken and optionally username/registry)\n */\nexport async function setCredentials(\n\tauthToken: string,\n\tusername?: string,\n\tregistry?: string,\n): Promise<void> {\n\tconst config = await readUserConfig();\n\n\tconfig.authToken = authToken;\n\tif (username) {\n\t\tconfig.username = username;\n\t}\n\tif (registry && registry !== DEFAULT_REGISTRY_URL) {\n\t\tconfig.registry = registry;\n\t}\n\n\tawait writeUserConfig(config);\n}\n\n/**\n * Clear credentials (authToken and username)\n */\nexport async function clearCredentials(): Promise<void> {\n\tconst config = await readUserConfig();\n\n\tdelete config.authToken;\n\tdelete config.username;\n\n\tawait writeUserConfig(config);\n}\n\n/**\n * Check if user is logged in\n */\nexport async function isLoggedIn(): Promise<boolean> {\n\ttry {\n\t\tconst resolved = await resolveConfig();\n\t\treturn !!resolved.apiKey;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\n/**\n * Get the API key (throws if not logged in)\n */\nexport async function requireApiKey(): Promise<string> {\n\tconst resolved = await resolveConfig();\n\n\tif (!resolved.apiKey) {\n\t\tif (process.env.PSPM_DEBUG) {\n\t\t\tconsole.log(`[config] requireApiKey: No API key found`);\n\t\t}\n\t\tthrow new NotLoggedInError();\n\t}\n\n\tif (process.env.PSPM_DEBUG) {\n\t\tconsole.log(\n\t\t\t`[config] requireApiKey: Got API key (${resolved.apiKey.substring(0, 10)}...)`,\n\t\t);\n\t}\n\n\treturn resolved.apiKey;\n}\n\n/**\n * Get the registry URL\n */\nexport async function getRegistryUrl(): Promise<string> {\n\tconst resolved = await resolveConfig();\n\treturn resolved.registryUrl;\n}\n","/**\n * 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 \"@repo/pspm-types\";\n\n/**\n * Agent metadata for display purposes.\n */\nexport interface AgentInfo {\n\t/** Human-readable name for display */\n\tdisplayName: string;\n\t/** Skills directory path */\n\tskillsDir: string;\n}\n\n/**\n * Default agent configurations with display names.\n * These can be overridden in pspm.json under the \"agents\" key.\n */\nexport const AGENT_INFO: Record<BuiltInAgent, AgentInfo> = {\n\t\"claude-code\": {\n\t\tdisplayName: \"Claude Code\",\n\t\tskillsDir: \".claude/skills\",\n\t},\n\tcodex: {\n\t\tdisplayName: \"Codex\",\n\t\tskillsDir: \".codex/skills\",\n\t},\n\tcursor: {\n\t\tdisplayName: \"Cursor\",\n\t\tskillsDir: \".cursor/skills\",\n\t},\n\tgemini: {\n\t\tdisplayName: \"Gemini CLI\",\n\t\tskillsDir: \".gemini/skills\",\n\t},\n\tkiro: {\n\t\tdisplayName: \"Kiro CLI\",\n\t\tskillsDir: \".kiro/skills\",\n\t},\n\topencode: {\n\t\tdisplayName: \"OpenCode\",\n\t\tskillsDir: \".opencode/skills\",\n\t},\n};\n\n/**\n * Default agent configurations (AgentConfig format).\n */\nexport const DEFAULT_AGENT_CONFIGS: Record<BuiltInAgent, AgentConfig> = {\n\t\"claude-code\": { skillsDir: AGENT_INFO[\"claude-code\"].skillsDir },\n\tcodex: { skillsDir: AGENT_INFO.codex.skillsDir },\n\tcursor: { skillsDir: AGENT_INFO.cursor.skillsDir },\n\tgemini: { skillsDir: AGENT_INFO.gemini.skillsDir },\n\tkiro: { skillsDir: AGENT_INFO.kiro.skillsDir },\n\topencode: { skillsDir: AGENT_INFO.opencode.skillsDir },\n};\n\n/**\n * All built-in agent names in display order.\n */\nexport const ALL_AGENTS: BuiltInAgent[] = [\n\t\"claude-code\",\n\t\"codex\",\n\t\"cursor\",\n\t\"gemini\",\n\t\"kiro\",\n\t\"opencode\",\n];\n\n/**\n * Default agents to use when --agent is not specified and -y is used.\n * Installs to all built-in agents by default.\n */\nexport const DEFAULT_AGENTS: BuiltInAgent[] = ALL_AGENTS;\n\n/**\n * Resolve agent configuration by name.\n *\n * @param name - Agent name (built-in or custom)\n * @param overrides - Custom agent configurations from pspm.json\n * @returns Agent configuration or null if not found\n *\n * @example\n * ```typescript\n * resolveAgentConfig(\"claude-code\")\n * // => { skillsDir: \".claude/skills\" }\n *\n * resolveAgentConfig(\"my-custom\", { \"my-custom\": { skillsDir: \".myagent/prompts\" } })\n * // => { skillsDir: \".myagent/prompts\" }\n * ```\n */\nexport function resolveAgentConfig(\n\tname: string,\n\toverrides?: Record<string, AgentConfig>,\n): AgentConfig | null {\n\t// Check overrides first\n\tif (overrides?.[name]) {\n\t\treturn overrides[name];\n\t}\n\n\t// Check built-in defaults\n\tif (name in DEFAULT_AGENT_CONFIGS) {\n\t\treturn DEFAULT_AGENT_CONFIGS[name as BuiltInAgent];\n\t}\n\n\treturn null;\n}\n\n/**\n * Parse comma-separated agent names from CLI argument.\n *\n * @param agentArg - Comma-separated agent names (e.g., \"claude-code,cursor\")\n * @returns Array of agent names, or [\"none\"] if skipping symlinks\n *\n * @example\n * ```typescript\n * parseAgentArg(\"claude-code,cursor\")\n * // => [\"claude-code\", \"cursor\"]\n *\n * parseAgentArg(\"none\")\n * // => [\"none\"]\n *\n * parseAgentArg(undefined)\n * // => [\"claude-code\", \"codex\", \"cursor\", \"gemini\", \"kiro\", \"opencode\"]\n * ```\n */\nexport function parseAgentArg(agentArg?: string): string[] {\n\tif (!agentArg) {\n\t\treturn [...DEFAULT_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/**\n * Get agent display string for console output.\n *\n * @param agents - Array of agent names\n * @returns Human-readable string like \"claude-code, cursor\"\n */\nexport function formatAgentList(agents: string[]): string {\n\tif (agents.length === 1 && agents[0] === \"none\") {\n\t\treturn \"none\";\n\t}\n\treturn agents.join(\", \");\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 \"@repo/pspm-types\";\nimport { calculateIntegrity } from \"@repo/pspm-types\";\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// If no ref specified, get the default branch first\n\tif (!ref || ref === \"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\tref = 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/${ref}`;\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 type {\n\tGitHubLockfileEntry,\n\tPspmLockfile,\n\tPspmLockfileEntry,\n} from \"@repo/pspm-types\";\nimport {\n\tgetLegacyLockfilePath,\n\tgetLockfilePath,\n\tgetRegistryUrl,\n} from \"./config\";\n\n// Re-export types for backward compatibility\nexport type { GitHubLockfileEntry, PspmLockfile, PspmLockfileEntry };\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 (always v3 format)\n */\nexport async function writeLockfile(lockfile: PspmLockfile): Promise<void> {\n\tconst lockfilePath = getLockfilePath();\n\tawait mkdir(dirname(lockfilePath), { recursive: true });\n\n\t// Always write as v3 format\n\tconst normalized: PspmLockfile = {\n\t\tlockfileVersion: 3,\n\t\tregistryUrl: lockfile.registryUrl,\n\t\tpackages: lockfile.packages ?? lockfile.skills ?? {},\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\tawait writeFile(lockfilePath, `${JSON.stringify(normalized, null, 2)}\\n`);\n}\n\n/**\n * Create a new empty lockfile (v3 format)\n */\nexport async function createEmptyLockfile(): Promise<PspmLockfile> {\n\tconst registryUrl = await getRegistryUrl();\n\treturn {\n\t\tlockfileVersion: 3,\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 * 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","import { readFile, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { PspmManifest } from \"@repo/pspm-types\";\n\n/**\n * Get the manifest file path (pspm.json in current directory)\n */\nexport function getManifestPath(): string {\n\treturn join(process.cwd(), \"pspm.json\");\n}\n\n/**\n * Read the manifest file (pspm.json)\n * Returns null if file doesn't exist\n */\nexport async function readManifest(): Promise<PspmManifest | null> {\n\ttry {\n\t\tconst content = await readFile(getManifestPath(), \"utf-8\");\n\t\treturn JSON.parse(content) as PspmManifest;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\n/**\n * Write the manifest file (pspm.json)\n */\nexport async function writeManifest(manifest: PspmManifest): Promise<void> {\n\tconst content = JSON.stringify(manifest, null, 2);\n\tawait writeFile(getManifestPath(), `${content}\\n`);\n}\n\n/**\n * Create a minimal manifest with just dependencies\n * Similar to how npm creates package.json with just dependencies when you run `npm add`\n * This is for consuming packages, not publishing - so only dependencies are needed\n */\nexport async function createMinimalManifest(): Promise<PspmManifest> {\n\treturn {\n\t\tdependencies: {},\n\t} as PspmManifest;\n}\n\n/**\n * Ensure manifest exists, creating a minimal one if needed\n * Returns the manifest (existing or newly created)\n */\nexport async function ensureManifest(): Promise<PspmManifest> {\n\tlet manifest = await readManifest();\n\n\tif (!manifest) {\n\t\tmanifest = await createMinimalManifest();\n\t\tawait writeManifest(manifest);\n\t}\n\n\treturn manifest;\n}\n\n/**\n * Add a dependency to the manifest\n * Creates the manifest if it doesn't exist\n *\n * @param skillName - Full skill name (e.g., \"@user/alice/my-skill\")\n * @param versionRange - Version range to save (e.g., \"^1.0.0\")\n */\nexport async function addDependency(\n\tskillName: string,\n\tversionRange: string,\n): Promise<void> {\n\tconst manifest = await ensureManifest();\n\n\t// Initialize dependencies if not present\n\tif (!manifest.dependencies) {\n\t\tmanifest.dependencies = {};\n\t}\n\n\t// Add or update the dependency\n\tmanifest.dependencies[skillName] = versionRange;\n\n\tawait writeManifest(manifest);\n}\n\n/**\n * Remove a dependency from the manifest\n *\n * @param skillName - Full skill name (e.g., \"@user/alice/my-skill\")\n * @returns true if dependency was removed, false if it didn't exist\n */\nexport async function removeDependency(skillName: string): Promise<boolean> {\n\tconst manifest = await readManifest();\n\n\tif (!manifest?.dependencies?.[skillName]) {\n\t\treturn false;\n\t}\n\n\tdelete manifest.dependencies[skillName];\n\tawait writeManifest(manifest);\n\treturn true;\n}\n\n/**\n * Get all dependencies from the manifest\n * Returns empty object if manifest doesn't exist or has no dependencies\n */\nexport async function getDependencies(): Promise<Record<string, string>> {\n\tconst manifest = await readManifest();\n\treturn manifest?.dependencies ?? {};\n}\n\n/**\n * Get all GitHub dependencies from the manifest\n * Returns empty object if manifest doesn't exist or has no GitHub dependencies\n */\nexport async function getGitHubDependencies(): Promise<Record<string, string>> {\n\tconst manifest = await readManifest();\n\treturn manifest?.githubDependencies ?? {};\n}\n\n/**\n * Add a GitHub dependency to the manifest\n * Creates the manifest if it doesn't exist\n *\n * @param specifier - GitHub specifier (e.g., \"github:owner/repo/path\")\n * @param ref - Git ref (branch, tag, or \"latest\")\n */\nexport async function addGitHubDependency(\n\tspecifier: string,\n\tref: string,\n): Promise<void> {\n\tconst manifest = await ensureManifest();\n\n\t// Initialize githubDependencies if not present\n\tif (!manifest.githubDependencies) {\n\t\tmanifest.githubDependencies = {};\n\t}\n\n\t// Add or update the dependency\n\tmanifest.githubDependencies[specifier] = ref;\n\n\tawait writeManifest(manifest);\n}\n\n/**\n * Remove a GitHub dependency from the manifest\n *\n * @param specifier - GitHub specifier (e.g., \"github:owner/repo/path\")\n * @returns true if dependency was removed, false if it didn't exist\n */\nexport async function removeGitHubDependency(\n\tspecifier: string,\n): Promise<boolean> {\n\tconst manifest = await readManifest();\n\n\tif (!manifest?.githubDependencies?.[specifier]) {\n\t\treturn false;\n\t}\n\n\tdelete manifest.githubDependencies[specifier];\n\tawait writeManifest(manifest);\n\treturn true;\n}\n","/**\n * 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 type { AgentConfig } from \"@repo/pspm-types\";\nimport { resolveAgentConfig } from \"./agents.js\";\n\n/**\n * Options for creating agent symlinks.\n */\nexport interface CreateSymlinksOptions {\n\t/** Agent names to create symlinks for */\n\tagents: string[];\n\t/** Project root directory */\n\tprojectRoot: string;\n\t/** Custom agent configuration overrides from pspm.json */\n\tagentConfigs?: Record<string, AgentConfig>;\n}\n\n/**\n * Information about an installed skill for symlinking.\n */\nexport interface SkillInfo {\n\t/** Skill name (used as symlink name) */\n\tname: string;\n\t/** Path to skill within .pspm/skills/ (relative to project root) */\n\tsourcePath: string;\n}\n\n/**\n * Create symlinks for all skills to specified agent directories.\n *\n * @param skills - List of skills to create symlinks for\n * @param options - Symlink creation options\n */\nexport async function createAgentSymlinks(\n\tskills: SkillInfo[],\n\toptions: CreateSymlinksOptions,\n): Promise<void> {\n\tconst { agents, projectRoot, agentConfigs } = options;\n\n\t// Skip if \"none\" agent\n\tif (agents.length === 1 && agents[0] === \"none\") {\n\t\treturn;\n\t}\n\n\tfor (const agentName of agents) {\n\t\tconst config = resolveAgentConfig(agentName, agentConfigs);\n\n\t\tif (!config) {\n\t\t\tconsole.warn(`Warning: Unknown agent \"${agentName}\", skipping symlinks`);\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst agentSkillsDir = join(projectRoot, config.skillsDir);\n\n\t\t// Create agent skills directory\n\t\tawait mkdir(agentSkillsDir, { recursive: true });\n\n\t\tfor (const skill of skills) {\n\t\t\tconst symlinkPath = join(agentSkillsDir, skill.name);\n\t\t\tconst targetPath = join(projectRoot, skill.sourcePath);\n\n\t\t\t// Calculate relative path from symlink location to target\n\t\t\tconst relativeTarget = relative(dirname(symlinkPath), targetPath);\n\n\t\t\tawait createSymlink(symlinkPath, relativeTarget, skill.name);\n\t\t}\n\t}\n}\n\n/**\n * Create a single symlink, handling existing files/symlinks.\n *\n * @param symlinkPath - Absolute path where symlink will be created\n * @param target - Relative path to target (relative to symlink's parent dir)\n * @param skillName - Name for logging\n */\nasync function createSymlink(\n\tsymlinkPath: string,\n\ttarget: string,\n\tskillName: string,\n): Promise<void> {\n\ttry {\n\t\t// Check if something exists at the symlink path\n\t\tconst stats = await lstat(symlinkPath).catch(() => null);\n\n\t\tif (stats) {\n\t\t\tif (stats.isSymbolicLink()) {\n\t\t\t\t// Check if it points to the correct target\n\t\t\t\tconst existingTarget = await readlink(symlinkPath);\n\t\t\t\tif (existingTarget === target) {\n\t\t\t\t\t// Already correct, nothing to do\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t// Remove incorrect symlink\n\t\t\t\tawait rm(symlinkPath);\n\t\t\t} else {\n\t\t\t\t// Regular file or directory exists - warn and skip\n\t\t\t\tconsole.warn(\n\t\t\t\t\t`Warning: File exists at symlink path for \"${skillName}\", skipping: ${symlinkPath}`,\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\t// Create the symlink\n\t\tawait symlink(target, symlinkPath);\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\tconsole.warn(\n\t\t\t`Warning: Failed to create symlink for \"${skillName}\": ${message}`,\n\t\t);\n\t}\n}\n\n/**\n * Remove symlinks for a skill from all agent directories.\n *\n * @param skillName - Name of the skill (symlink name)\n * @param options - Symlink options\n */\nexport async function removeAgentSymlinks(\n\tskillName: string,\n\toptions: CreateSymlinksOptions,\n): Promise<void> {\n\tconst { agents, projectRoot, agentConfigs } = options;\n\n\t// Skip if \"none\" agent\n\tif (agents.length === 1 && agents[0] === \"none\") {\n\t\treturn;\n\t}\n\n\tfor (const agentName of agents) {\n\t\tconst config = resolveAgentConfig(agentName, agentConfigs);\n\n\t\tif (!config) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst symlinkPath = join(projectRoot, config.skillsDir, skillName);\n\n\t\ttry {\n\t\t\tconst stats = await lstat(symlinkPath).catch(() => null);\n\n\t\t\tif (stats?.isSymbolicLink()) {\n\t\t\t\tawait rm(symlinkPath);\n\t\t\t}\n\t\t} catch {\n\t\t\t// Ignore errors - symlink may not exist\n\t\t}\n\t}\n}\n\n/**\n * Get the source path for a registry skill within .pspm/skills/.\n *\n * @param username - Skill author username\n * @param skillName - Skill name\n * @returns Relative path from project root (e.g., \".pspm/skills/alice/my-skill\")\n */\nexport function getRegistrySkillPath(\n\tusername: string,\n\tskillName: string,\n): string {\n\treturn `.pspm/skills/${username}/${skillName}`;\n}\n\n/**\n * Get the source path for a GitHub skill within .pspm/skills/.\n *\n * @param owner - GitHub repository owner\n * @param repo - GitHub repository name\n * @param path - Optional path within the repository\n * @returns Relative path from project root (e.g., \".pspm/skills/_github/owner/repo/path\")\n */\nexport function getGitHubSkillPath(\n\towner: string,\n\trepo: string,\n\tpath?: string,\n): string {\n\tif (path) {\n\t\treturn `.pspm/skills/_github/${owner}/${repo}/${path}`;\n\t}\n\treturn `.pspm/skills/_github/${owner}/${repo}`;\n}\n\n/**\n * Check which agents have symlinks for a given skill.\n *\n * @param skillName - Name of the skill (symlink name)\n * @param agents - Agent names to check\n * @param projectRoot - Project root directory\n * @param agentConfigs - Custom agent configurations\n * @returns Array of agent names that have valid symlinks\n */\nexport async function getLinkedAgents(\n\tskillName: string,\n\tagents: string[],\n\tprojectRoot: string,\n\tagentConfigs?: Record<string, AgentConfig>,\n): Promise<string[]> {\n\tconst linkedAgents: string[] = [];\n\n\tfor (const agentName of agents) {\n\t\tconst config = resolveAgentConfig(agentName, agentConfigs);\n\t\tif (!config) continue;\n\n\t\tconst symlinkPath = join(projectRoot, config.skillsDir, skillName);\n\n\t\ttry {\n\t\t\tconst stats = await lstat(symlinkPath);\n\t\t\tif (stats.isSymbolicLink()) {\n\t\t\t\tlinkedAgents.push(agentName);\n\t\t\t}\n\t\t} catch {\n\t\t\t// Symlink doesn't exist\n\t\t}\n\t}\n\n\treturn linkedAgents;\n}\n","import { mkdir, rm } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport {\n\tcalculateIntegrity,\n\tformatGitHubSpecifier,\n\ttype GitHubLockfileEntry,\n\tgetGitHubSkillName,\n\tisGitHubSpecifier,\n\tparseGitHubSpecifier,\n\tparseSkillSpecifier,\n\tresolveVersion,\n} from \"@repo/pspm-types\";\nimport { parseAgentArg, promptForAgents } from \"../agents.js\";\nimport {\n\tconfigure,\n\tgetSkillVersion,\n\tlistSkillVersions,\n} from \"../api-client.js\";\nimport { getSkillsDir, getTokenForRegistry, resolveConfig } from \"../config.js\";\nimport { extractApiErrorMessage } from \"../errors.js\";\nimport {\n\tdownloadGitHubPackage,\n\textractGitHubPackage,\n\tgetGitHubDisplayName,\n} from \"../github.js\";\nimport { addGitHubToLockfile, addToLockfile } from \"../lockfile.js\";\nimport {\n\taddDependency,\n\taddGitHubDependency,\n\treadManifest,\n} from \"../manifest.js\";\nimport {\n\tcreateAgentSymlinks,\n\tgetGitHubSkillPath,\n\tgetRegistrySkillPath,\n\ttype SkillInfo,\n} from \"../symlinks.js\";\n\nexport interface AddOptions {\n\tsave?: boolean;\n\tagent?: string;\n\tyes?: boolean;\n}\n\n/** Resolved package info from validation phase */\ninterface ResolvedRegistryPackage {\n\ttype: \"registry\";\n\tspecifier: string;\n\tusername: string;\n\tname: string;\n\tversionRange: string | undefined;\n\tresolvedVersion: string;\n\tversionInfo: {\n\t\tdownloadUrl: string;\n\t\tchecksum: string;\n\t};\n}\n\ninterface ResolvedGitHubPackage {\n\ttype: \"github\";\n\tspecifier: string;\n\tparsed: ReturnType<typeof parseGitHubSpecifier> & object;\n\tref: string;\n\tdownloadResult: {\n\t\tbuffer: Buffer;\n\t\tcommit: string;\n\t\tintegrity: string;\n\t};\n}\n\ntype ResolvedPackage = ResolvedRegistryPackage | ResolvedGitHubPackage;\n\nexport async function add(\n\tspecifiers: string[],\n\toptions: AddOptions,\n): Promise<void> {\n\t// Phase 1: Validate and resolve all packages first\n\tconsole.log(\"Resolving packages...\\n\");\n\n\tconst resolvedPackages: ResolvedPackage[] = [];\n\tconst validationErrors: { specifier: string; error: string }[] = [];\n\n\tfor (const specifier of specifiers) {\n\t\ttry {\n\t\t\tif (isGitHubSpecifier(specifier)) {\n\t\t\t\tconst resolved = await validateGitHubPackage(specifier);\n\t\t\t\tresolvedPackages.push(resolved);\n\t\t\t} else {\n\t\t\t\tconst resolved = await validateRegistryPackage(specifier);\n\t\t\t\tresolvedPackages.push(resolved);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconst message = error instanceof Error ? error.message : \"Unknown error\";\n\t\t\tvalidationErrors.push({ specifier, error: message });\n\t\t\tconsole.error(`Failed to resolve ${specifier}: ${message}\\n`);\n\t\t}\n\t}\n\n\t// If all packages failed validation, exit early\n\tif (resolvedPackages.length === 0) {\n\t\tconsole.error(\"No packages could be resolved.\");\n\t\tprocess.exit(1);\n\t}\n\n\t// Show validation summary if there were failures\n\tif (validationErrors.length > 0) {\n\t\tconsole.log(\n\t\t\t`Resolved ${resolvedPackages.length} of ${specifiers.length} packages.\\n`,\n\t\t);\n\t}\n\n\t// Phase 2: 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 3: Install all resolved packages\n\tconst results: { specifier: string; success: boolean; error?: string }[] = [];\n\n\tfor (const resolved of resolvedPackages) {\n\t\ttry {\n\t\t\tif (resolved.type === \"github\") {\n\t\t\t\tawait installGitHubPackage(resolved, {\n\t\t\t\t\t...options,\n\t\t\t\t\tresolvedAgents: agents,\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tawait installRegistryPackage(resolved, {\n\t\t\t\t\t...options,\n\t\t\t\t\tresolvedAgents: agents,\n\t\t\t\t});\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 * 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: apiKey ?? \"\" });\n\n\tconsole.log(`Resolving ${specifier}...`);\n\n\t// Get available versions\n\tconst versionsResponse = await listSkillVersions(username, name);\n\tif (versionsResponse.status !== 200) {\n\t\tif (versionsResponse.status === 401) {\n\t\t\tif (!apiKey) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Package @user/${username}/${name} requires authentication. Please run 'pspm login' to authenticate`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tthrow new Error(\n\t\t\t\t`Access denied to @user/${username}/${name}. You may not have permission to access this private package.`,\n\t\t\t);\n\t\t}\n\t\tconst errorMessage = extractApiErrorMessage(\n\t\t\tversionsResponse,\n\t\t\t`Skill @user/${username}/${name} not found`,\n\t\t);\n\t\tthrow new Error(errorMessage);\n\t}\n\tconst versions = versionsResponse.data;\n\tif (versions.length === 0) {\n\t\tthrow new Error(`Skill @user/${username}/${name} not found`);\n\t}\n\n\t// Resolve version\n\tconst versionStrings = versions.map((v: { version: string }) => v.version);\n\tconst resolvedVersion = resolveVersion(versionRange || \"*\", versionStrings);\n\n\tif (!resolvedVersion) {\n\t\tthrow new Error(\n\t\t\t`No version matching \"${versionRange || \"latest\"}\" found for @user/${username}/${name}. Available versions: ${versionStrings.join(\", \")}`,\n\t\t);\n\t}\n\n\t// Get version details with download URL\n\tconst versionResponse = await getSkillVersion(\n\t\tusername,\n\t\tname,\n\t\tresolvedVersion,\n\t);\n\tif (versionResponse.status !== 200 || !versionResponse.data) {\n\t\tconst errorMessage = extractApiErrorMessage(\n\t\t\tversionResponse,\n\t\t\t`Version ${resolvedVersion} not found`,\n\t\t);\n\t\tthrow new Error(errorMessage);\n\t}\n\n\tconsole.log(`Resolved @user/${username}/${name}@${resolvedVersion}`);\n\n\treturn {\n\t\ttype: \"registry\",\n\t\tspecifier,\n\t\tusername,\n\t\tname,\n\t\tversionRange,\n\t\tresolvedVersion,\n\t\tversionInfo: {\n\t\t\tdownloadUrl: versionResponse.data.downloadUrl,\n\t\t\tchecksum: versionResponse.data.checksum,\n\t\t},\n\t};\n}\n\n/**\n * Validate and download a GitHub package\n */\nasync function validateGitHubPackage(\n\tspecifier: string,\n): Promise<ResolvedGitHubPackage> {\n\tconst parsed = parseGitHubSpecifier(specifier);\n\tif (!parsed) {\n\t\tthrow new Error(\n\t\t\t`Invalid GitHub specifier \"${specifier}\". Use format: github:{owner}/{repo}[/{path}][@{ref}]`,\n\t\t);\n\t}\n\n\tconst ref = parsed.ref || \"HEAD\";\n\tconsole.log(`Resolving ${getGitHubDisplayName(parsed)}...`);\n\n\t// Download from GitHub (also validates existence)\n\tconst result = await downloadGitHubPackage(parsed);\n\n\tconsole.log(`Resolved ${specifier} (${ref}@${result.commit.slice(0, 7)})`);\n\n\treturn {\n\t\ttype: \"github\",\n\t\tspecifier,\n\t\tparsed,\n\t\tref,\n\t\tdownloadResult: result,\n\t};\n}\n\n/**\n * Install a pre-validated registry package\n */\nasync function installRegistryPackage(\n\tresolved: ResolvedRegistryPackage,\n\toptions: InternalAddOptions,\n): Promise<void> {\n\tconst { username, name, versionRange, resolvedVersion, versionInfo } =\n\t\tresolved;\n\n\tconsole.log(`Installing @user/${username}/${name}@${resolvedVersion}...`);\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\tversionInfo.downloadUrl.includes(\".r2.cloudflarestorage.com\") ||\n\t\tversionInfo.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(versionInfo.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\tconst expectedIntegrity = `sha256-${Buffer.from(versionInfo.checksum, \"hex\").toString(\"base64\")}`;\n\tif (integrity !== expectedIntegrity) {\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\n\tconst fullName = `@user/${username}/${name}`;\n\tawait addToLockfile(fullName, {\n\t\tversion: resolvedVersion,\n\t\tresolved: versionInfo.downloadUrl,\n\t\tintegrity,\n\t});\n\n\t// Add to pspm.json dependencies\n\tconst dependencyRange = versionRange || `^${resolvedVersion}`;\n\tawait addDependency(fullName, dependencyRange);\n\n\t// Create agent symlinks\n\tconst agents = options.resolvedAgents;\n\tif (agents[0] !== \"none\") {\n\t\tconst skillManifest = await readManifest();\n\t\tconst skillInfo: SkillInfo = {\n\t\t\tname,\n\t\t\tsourcePath: getRegistrySkillPath(username, name),\n\t\t};\n\n\t\tawait createAgentSymlinks([skillInfo], {\n\t\t\tagents,\n\t\t\tprojectRoot: process.cwd(),\n\t\t\tagentConfigs: skillManifest?.agents,\n\t\t});\n\t}\n\n\tconsole.log(`Installed @user/${username}/${name}@${resolvedVersion}`);\n\tconsole.log(`Location: ${destDir}`);\n}\n\n/**\n * Install a pre-validated GitHub package\n */\nasync function installGitHubPackage(\n\tresolved: ResolvedGitHubPackage,\n\toptions: InternalAddOptions,\n): Promise<void> {\n\tconst { specifier, parsed, ref, downloadResult } = resolved;\n\n\tconsole.log(\n\t\t`Installing ${specifier} (${ref}@${downloadResult.commit.slice(0, 7)})...`,\n\t);\n\n\t// Extract to skills directory\n\tconst skillsDir = getSkillsDir();\n\tconst destPath = await extractGitHubPackage(\n\t\tparsed,\n\t\tdownloadResult.buffer,\n\t\tskillsDir,\n\t);\n\n\t// Add to lockfile\n\tconst lockfileSpecifier = formatGitHubSpecifier({\n\t\towner: parsed.owner,\n\t\trepo: parsed.repo,\n\t\tpath: parsed.path,\n\t\t// Don't include ref in the specifier key, it's stored in gitRef\n\t});\n\n\tconst entry: GitHubLockfileEntry = {\n\t\tversion: downloadResult.commit.slice(0, 7),\n\t\tresolved: `https://github.com/${parsed.owner}/${parsed.repo}`,\n\t\tintegrity: downloadResult.integrity,\n\t\tgitCommit: downloadResult.commit,\n\t\tgitRef: ref,\n\t};\n\n\tawait addGitHubToLockfile(lockfileSpecifier, entry);\n\n\t// Add to pspm.json githubDependencies\n\tawait addGitHubDependency(lockfileSpecifier, ref);\n\n\t// Create agent symlinks\n\tconst agents = options.resolvedAgents;\n\tif (agents[0] !== \"none\") {\n\t\tconst manifest = await readManifest();\n\t\tconst skillName = getGitHubSkillName(parsed);\n\t\tconst skillInfo: SkillInfo = {\n\t\t\tname: skillName,\n\t\t\tsourcePath: getGitHubSkillPath(parsed.owner, parsed.repo, parsed.path),\n\t\t};\n\n\t\tawait createAgentSymlinks([skillInfo], {\n\t\t\tagents,\n\t\t\tprojectRoot: process.cwd(),\n\t\t\tagentConfigs: manifest?.agents,\n\t\t});\n\t}\n\n\tconsole.log(\n\t\t`Installed ${specifier} (${ref}@${downloadResult.commit.slice(0, 7)})`,\n\t);\n\tconsole.log(`Location: ${destPath}`);\n}\n","import { parseSkillSpecifier } from \"@repo/pspm-types\";\nimport { changeSkillAccess, configure } from \"../api-client.js\";\nimport { getRegistryUrl, requireApiKey } from \"../config.js\";\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\n\t\tif (specifier) {\n\t\t\t// Parse the specifier to extract the package name\n\t\t\tconst parsed = parseSkillSpecifier(specifier);\n\t\t\tif (!parsed) {\n\t\t\t\tconsole.error(\n\t\t\t\t\t`Error: Invalid skill specifier \"${specifier}\". Use format: @user/{username}/{name}`,\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} 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// 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(packageName, { visibility });\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.js\";\nexport { type AddOptions, add } from \"./add.js\";\nexport {\n\ttype ConfigInitOptions,\n\tconfigInit,\n\tconfigShow,\n} from \"./config/index.js\";\nexport { type DeprecateOptions, deprecate } from \"./deprecate.js\";\nexport { type InitOptions, init } from \"./init.js\";\nexport { type InstallOptions, install } from \"./install.js\";\nexport { type LinkOptions, link } from \"./link.js\";\nexport { type ListOptions, list } from \"./list.js\";\nexport { type LoginOptions, login } from \"./login.js\";\nexport { logout } from \"./logout.js\";\nexport { type MigrateOptions, migrate } from \"./migrate.js\";\nexport { type PublishOptions, publish } from \"./publish.js\";\nexport { remove } from \"./remove.js\";\nexport { type UnpublishOptions, unpublish } from \"./unpublish.js\";\nexport { type UpdateOptions, update } from \"./update.js\";\nexport { whoami } from \"./whoami.js\";\n","import { stat, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\nexport interface ConfigInitOptions {\n\tregistry?: string;\n}\n\n/**\n * Create a .pspmrc file in the current directory (INI format)\n */\nexport async function configInit(options: ConfigInitOptions): Promise<void> {\n\ttry {\n\t\tconst configPath = join(process.cwd(), \".pspmrc\");\n\n\t\t// Check if file already exists\n\t\ttry {\n\t\t\tawait stat(configPath);\n\t\t\tconsole.error(\"Error: .pspmrc already exists in this directory.\");\n\t\t\tprocess.exit(1);\n\t\t} catch {\n\t\t\t// File doesn't exist, good\n\t\t}\n\n\t\t// Build INI content\n\t\tconst lines: string[] = [\"; Project-specific PSPM configuration\", \"\"];\n\n\t\tif (options.registry) {\n\t\t\tlines.push(`registry = ${options.registry}`);\n\t\t} else {\n\t\t\tlines.push(\"; Uncomment to use a custom registry:\");\n\t\t\tlines.push(\"; registry = https://custom-registry.example.com\");\n\t\t}\n\n\t\tlines.push(\"\");\n\n\t\t// Write the file\n\t\tawait writeFile(configPath, lines.join(\"\\n\"));\n\n\t\tconsole.log(\"Created .pspmrc\");\n\t\tconsole.log(\"\");\n\t\tconsole.log(\"Contents:\");\n\t\tconsole.log(lines.join(\"\\n\"));\n\t\tconsole.log(\"Note: .pspmrc should be committed to version control.\");\n\t\tconsole.log(\"API keys should NOT be stored here - use pspm login instead.\");\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : \"Unknown error\";\n\t\tconsole.error(`Error: ${message}`);\n\t\tprocess.exit(1);\n\t}\n}\n","import {\n\tfindProjectConfig,\n\tgetConfigPath,\n\tresolveConfig,\n} from \"../../config.js\";\n\n/**\n * Show resolved configuration\n */\nexport async function configShow(): Promise<void> {\n\ttry {\n\t\tconst resolved = await resolveConfig();\n\t\tconst projectConfig = await findProjectConfig();\n\t\tconst configPath = getConfigPath();\n\n\t\tconsole.log(\"Resolved Configuration:\\n\");\n\t\tconsole.log(` Registry URL: ${resolved.registryUrl}`);\n\t\tconsole.log(` API Key: ${resolved.apiKey ? \"***\" : \"(not set)\"}`);\n\t\tconsole.log(` Username: ${resolved.username || \"(not set)\"}`);\n\t\tconsole.log(\"\");\n\t\tconsole.log(\"Config Locations:\");\n\t\tconsole.log(` User config: ${configPath}`);\n\t\tconsole.log(` Project config: ${projectConfig ? \".pspmrc\" : \"(none)\"}`);\n\t\tconsole.log(\"\");\n\t\tconsole.log(\"Environment Variables:\");\n\t\tconsole.log(\n\t\t\t` PSPM_REGISTRY_URL: ${process.env.PSPM_REGISTRY_URL || \"(not set)\"}`,\n\t\t);\n\t\tconsole.log(\n\t\t\t` PSPM_API_KEY: ${process.env.PSPM_API_KEY ? \"***\" : \"(not set)\"}`,\n\t\t);\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : \"Unknown error\";\n\t\tconsole.error(`Error: ${message}`);\n\t\tprocess.exit(1);\n\t}\n}\n","import { parseSkillSpecifier } from \"@repo/pspm-types\";\nimport {\n\tconfigure,\n\tdeprecateSkillVersion,\n\tundeprecateSkillVersion,\n} from \"../api-client.js\";\nimport { getRegistryUrl, requireApiKey } from \"../config.js\";\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(name, versionRange);\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(name, versionRange, message);\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 \"@repo/pspm-types\";\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) delete manifest.description;\n\t\tif (!manifest.author) delete manifest.author;\n\t\tif (manifest.capabilities?.length === 0) delete manifest.capabilities;\n\n\t\t// Show preview\n\t\tconst content = JSON.stringify(manifest, null, 2);\n\n\t\tconsole.log(\"\");\n\t\tconsole.log(`About to write to ${pspmJsonPath}:`);\n\t\tconsole.log(\"\");\n\t\tconsole.log(content);\n\t\tconsole.log(\"\");\n\n\t\t// In interactive mode, confirm before writing\n\t\tif (!options.yes) {\n\t\t\tconst rl = createInterface({\n\t\t\t\tinput: process.stdin,\n\t\t\t\toutput: process.stdout,\n\t\t\t});\n\n\t\t\tconst confirm = await prompt(rl, \"Is this OK?\", \"yes\");\n\t\t\trl.close();\n\n\t\t\tif (confirm.toLowerCase() !== \"yes\" && confirm.toLowerCase() !== \"y\") {\n\t\t\t\tconsole.log(\"Aborted.\");\n\t\t\t\tprocess.exit(0);\n\t\t\t}\n\t\t}\n\n\t\t// Write the manifest\n\t\tawait writeFile(pspmJsonPath, `${content}\\n`);\n\n\t\t// Check if SKILL.md exists\n\t\ttry {\n\t\t\tawait stat(join(process.cwd(), \"SKILL.md\"));\n\t\t} catch {\n\t\t\tconsole.log(\n\t\t\t\t\"Note: Create a SKILL.md file with your skill's prompt content.\",\n\t\t\t);\n\t\t}\n\n\t\tif (existingPkg) {\n\t\t\tconsole.log(\"Note: Values were derived from existing package.json.\");\n\t\t\tconsole.log(\" pspm.json is for publishing to PSPM registry.\");\n\t\t\tconsole.log(\" package.json can still be used for npm dependencies.\");\n\t\t}\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : \"Unknown error\";\n\t\tconsole.error(`Error: ${message}`);\n\t\tprocess.exit(1);\n\t}\n}\n","import { createHash } from \"node:crypto\";\nimport { mkdir, readFile, rm, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport {\n\tcalculateIntegrity,\n\ttype GitHubLockfileEntry,\n\tgetGitHubSkillName,\n\ttype PspmLockfileEntry,\n\tparseGitHubSpecifier,\n\tparseSkillSpecifier,\n\tresolveVersion,\n} from \"@repo/pspm-types\";\nimport { parseAgentArg, promptForAgents } from \"../agents.js\";\nimport {\n\tconfigure,\n\tgetSkillVersion,\n\tlistSkillVersions,\n} from \"../api-client.js\";\nimport {\n\tgetCacheDir,\n\tgetSkillsDir,\n\tgetTokenForRegistry,\n\tresolveConfig,\n} from \"../config.js\";\nimport { extractApiErrorMessage } from \"../errors.js\";\nimport {\n\tdownloadGitHubPackage,\n\textractGitHubPackage,\n\tGitHubNotFoundError,\n\tGitHubPathNotFoundError,\n\tGitHubRateLimitError,\n\tgetGitHubDisplayName,\n} from \"../github.js\";\nimport {\n\taddGitHubToLockfile,\n\taddToLockfile,\n\tmigrateLockfileIfNeeded,\n\treadLockfile,\n} from \"../lockfile.js\";\nimport {\n\tgetDependencies,\n\tgetGitHubDependencies,\n\treadManifest,\n} from \"../manifest.js\";\nimport {\n\tcreateAgentSymlinks,\n\tgetGitHubSkillPath,\n\tgetRegistrySkillPath,\n\ttype SkillInfo,\n} from \"../symlinks.js\";\n\n/**\n * Get cache file path from integrity hash\n */\nfunction getCacheFilePath(cacheDir: string, integrity: string): string {\n\t// integrity is \"sha256-{base64hash}\"\n\t// Convert to safe filename: sha256-{hex}.tgz\n\tconst match = integrity.match(/^sha256-(.+)$/);\n\tif (!match) {\n\t\tthrow new Error(`Invalid integrity format: ${integrity}`);\n\t}\n\t// Convert base64 to hex for safe filename\n\tconst base64Hash = match[1];\n\tconst hexHash = Buffer.from(base64Hash, \"base64\").toString(\"hex\");\n\treturn join(cacheDir, `sha256-${hexHash}.tgz`);\n}\n\n/**\n * Try to read tarball from cache\n */\nasync function readFromCache(\n\tcacheDir: string,\n\tintegrity: string,\n): Promise<Buffer | null> {\n\ttry {\n\t\tconst cachePath = getCacheFilePath(cacheDir, integrity);\n\t\tconst data = await readFile(cachePath);\n\n\t\t// Verify integrity\n\t\tconst actualIntegrity = `sha256-${createHash(\"sha256\").update(data).digest(\"base64\")}`;\n\t\tif (actualIntegrity !== integrity) {\n\t\t\t// Cache corrupted, remove it\n\t\t\tawait rm(cachePath, { force: true });\n\t\t\treturn null;\n\t\t}\n\n\t\treturn data;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\n/**\n * Write tarball to cache\n */\nasync function writeToCache(\n\tcacheDir: string,\n\tintegrity: string,\n\tdata: Buffer,\n): Promise<void> {\n\ttry {\n\t\tawait mkdir(cacheDir, { recursive: true });\n\t\tconst cachePath = getCacheFilePath(cacheDir, integrity);\n\t\tawait writeFile(cachePath, data);\n\t} catch {\n\t\t// Cache write failures are non-fatal\n\t}\n}\n\nexport interface InstallOptions {\n\tfrozenLockfile?: boolean;\n\tdir?: string;\n\tagent?: string;\n\tyes?: boolean;\n}\n\nexport async function install(\n\tspecifiers: string[],\n\toptions: InstallOptions,\n): Promise<void> {\n\t// If specifiers are provided, delegate to add command\n\tif (specifiers.length > 0) {\n\t\tconst { add } = await import(\"./add.js\");\n\t\tawait add(specifiers, {\n\t\t\tsave: true,\n\t\t\tagent: options.agent,\n\t\t\tyes: options.yes,\n\t\t});\n\t\treturn;\n\t}\n\n\t// Otherwise, install from lockfile\n\tawait installFromLockfile(options);\n}\n\nasync function installFromLockfile(options: InstallOptions): Promise<void> {\n\ttry {\n\t\t// Get config - auth may be optional for public packages\n\t\tconst config = await resolveConfig();\n\t\tconst registryUrl = config.registryUrl;\n\t\tconst apiKey = getTokenForRegistry(config, registryUrl);\n\t\tconst skillsDir = options.dir || getSkillsDir();\n\t\tconst cacheDir = getCacheDir();\n\n\t\t// Migrate legacy lockfile if needed\n\t\tawait migrateLockfileIfNeeded();\n\n\t\t// Read lockfile and dependencies from pspm.json\n\t\tlet lockfile = await readLockfile();\n\t\tconst manifestDeps = await getDependencies();\n\t\tconst manifestGitHubDeps = await getGitHubDependencies();\n\t\tconst lockfilePackages = lockfile?.packages ?? lockfile?.skills ?? {};\n\t\tconst lockfileGitHubPackages = lockfile?.githubPackages ?? {};\n\n\t\t// Track all installed skills for symlink creation\n\t\tconst installedSkills: SkillInfo[] = [];\n\n\t\t// =================================================================\n\t\t// Phase 1: Resolve missing registry dependencies\n\t\t// =================================================================\n\t\tconst missingDeps: Array<{ fullName: string; versionRange: string }> = [];\n\t\tfor (const [fullName, versionRange] of Object.entries(manifestDeps)) {\n\t\t\tif (!lockfilePackages[fullName]) {\n\t\t\t\tmissingDeps.push({ fullName, versionRange });\n\t\t\t}\n\t\t}\n\n\t\tif (missingDeps.length > 0) {\n\t\t\tif (options.frozenLockfile) {\n\t\t\t\tconsole.error(\n\t\t\t\t\t\"Error: Dependencies in pspm.json are not in lockfile. Cannot install with --frozen-lockfile\",\n\t\t\t\t);\n\t\t\t\tconsole.error(\"Missing dependencies:\");\n\t\t\t\tfor (const dep of missingDeps) {\n\t\t\t\t\tconsole.error(` - ${dep.fullName}@${dep.versionRange}`);\n\t\t\t\t}\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\n\t\t\tconsole.log(`Resolving ${missingDeps.length} new dependency(ies)...\\n`);\n\t\t\tconfigure({ registryUrl, apiKey: 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\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\tconst entries = Object.entries(packages) as [string, PspmLockfileEntry][];\n\n\t\t\tfor (const [fullName, entry] of entries) {\n\t\t\t\tconst match = fullName.match(/^@user\\/([^/]+)\\/([^/]+)$/);\n\t\t\t\tif (!match) {\n\t\t\t\t\tconsole.warn(`Warning: Invalid skill name in lockfile: ${fullName}`);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst [, username, name] = match;\n\t\t\t\tconsole.log(`Installing ${fullName}@${entry.version}...`);\n\n\t\t\t\tlet tarballBuffer: Buffer;\n\t\t\t\tlet fromCache = false;\n\n\t\t\t\t// Try to read from cache first\n\t\t\t\tconst cachedTarball = await readFromCache(cacheDir, entry.integrity);\n\t\t\t\tif (cachedTarball) {\n\t\t\t\t\ttarballBuffer = cachedTarball;\n\t\t\t\t\tfromCache = true;\n\t\t\t\t} else {\n\t\t\t\t\t// Download the tarball\n\t\t\t\t\tconst isPresignedUrl =\n\t\t\t\t\t\tentry.resolved.includes(\".r2.cloudflarestorage.com\") ||\n\t\t\t\t\t\tentry.resolved.includes(\"X-Amz-Signature\");\n\n\t\t\t\t\tconst downloadHeaders: Record<string, string> = {};\n\t\t\t\t\tif (!isPresignedUrl && apiKey) {\n\t\t\t\t\t\tdownloadHeaders.Authorization = `Bearer ${apiKey}`;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst response = await fetch(entry.resolved, {\n\t\t\t\t\t\theaders: downloadHeaders,\n\t\t\t\t\t\tredirect: \"follow\",\n\t\t\t\t\t});\n\n\t\t\t\t\tif (!response.ok) {\n\t\t\t\t\t\tif (response.status === 401) {\n\t\t\t\t\t\t\tif (!apiKey) {\n\t\t\t\t\t\t\t\tconsole.error(\n\t\t\t\t\t\t\t\t\t` Error: ${fullName} requires authentication. Run 'pspm login' first.`,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tconsole.error(\n\t\t\t\t\t\t\t\t\t` Error: Access denied to ${fullName}. You may not have permission to access this private package.`,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconsole.error(\n\t\t\t\t\t\t\t\t` Error: Failed to download ${fullName} (${response.status})`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\ttarballBuffer = Buffer.from(await response.arrayBuffer());\n\n\t\t\t\t\t// Verify checksum\n\t\t\t\t\tconst actualIntegrity = `sha256-${createHash(\"sha256\").update(tarballBuffer).digest(\"base64\")}`;\n\n\t\t\t\t\tif (actualIntegrity !== entry.integrity) {\n\t\t\t\t\t\tconsole.error(\n\t\t\t\t\t\t\t` Error: Checksum verification failed for ${fullName}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (options.frozenLockfile) {\n\t\t\t\t\t\t\tprocess.exit(1);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Cache the verified tarball\n\t\t\t\t\tawait writeToCache(cacheDir, entry.integrity, tarballBuffer);\n\t\t\t\t}\n\n\t\t\t\t// Extract tarball\n\t\t\t\tconst destDir = join(skillsDir, username, name);\n\t\t\t\tawait rm(destDir, { recursive: true, force: true });\n\t\t\t\tawait mkdir(destDir, { recursive: true });\n\n\t\t\t\tconst tempFile = join(destDir, \".temp.tgz\");\n\t\t\t\tawait writeFile(tempFile, tarballBuffer);\n\n\t\t\t\tconst { exec } = await import(\"node:child_process\");\n\t\t\t\tconst { promisify } = await import(\"node:util\");\n\t\t\t\tconst execAsync = promisify(exec);\n\n\t\t\t\ttry {\n\t\t\t\t\tawait execAsync(\n\t\t\t\t\t\t`tar -xzf \"${tempFile}\" -C \"${destDir}\" --strip-components=1`,\n\t\t\t\t\t);\n\t\t\t\t} finally {\n\t\t\t\t\tawait rm(tempFile, { force: true });\n\t\t\t\t}\n\n\t\t\t\tconsole.log(\n\t\t\t\t\t` Installed to ${destDir}${fromCache ? \" (from cache)\" : \"\"}`,\n\t\t\t\t);\n\n\t\t\t\t// Track for symlinks\n\t\t\t\tinstalledSkills.push({\n\t\t\t\t\tname,\n\t\t\t\t\tsourcePath: getRegistrySkillPath(username, name),\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\t// =================================================================\n\t\t// Phase 4: Install GitHub packages from lockfile\n\t\t// =================================================================\n\t\tconst githubPackages = lockfile?.githubPackages ?? {};\n\t\tconst githubCount = Object.keys(githubPackages).length;\n\n\t\tif (githubCount > 0) {\n\t\t\tconsole.log(`\\nInstalling ${githubCount} GitHub skill(s)...\\n`);\n\n\t\t\tfor (const [specifier, entry] of Object.entries(githubPackages)) {\n\t\t\t\tconst parsed = parseGitHubSpecifier(specifier);\n\t\t\t\tif (!parsed) {\n\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\t`Warning: Invalid GitHub specifier in lockfile: ${specifier}`,\n\t\t\t\t\t);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst ghEntry = entry as GitHubLockfileEntry;\n\t\t\t\tconsole.log(\n\t\t\t\t\t`Installing ${specifier} (${ghEntry.gitRef}@${ghEntry.gitCommit.slice(0, 7)})...`,\n\t\t\t\t);\n\n\t\t\t\tlet tarballBuffer: Buffer;\n\t\t\t\tlet fromCache = false;\n\n\t\t\t\t// Try to read from cache first\n\t\t\t\tconst cachedTarball = await readFromCache(cacheDir, ghEntry.integrity);\n\t\t\t\tif (cachedTarball) {\n\t\t\t\t\ttarballBuffer = cachedTarball;\n\t\t\t\t\tfromCache = true;\n\t\t\t\t} else {\n\t\t\t\t\t// Download from GitHub\n\t\t\t\t\ttry {\n\t\t\t\t\t\t// Use the locked commit\n\t\t\t\t\t\tconst specWithCommit = { ...parsed, ref: ghEntry.gitCommit };\n\t\t\t\t\t\tconst result = await downloadGitHubPackage(specWithCommit);\n\t\t\t\t\t\ttarballBuffer = result.buffer;\n\n\t\t\t\t\t\t// Verify integrity\n\t\t\t\t\t\tif (result.integrity !== ghEntry.integrity) {\n\t\t\t\t\t\t\tconsole.error(\n\t\t\t\t\t\t\t\t` Error: Checksum verification failed for ${specifier}`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tif (options.frozenLockfile) {\n\t\t\t\t\t\t\t\tprocess.exit(1);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Cache the verified tarball\n\t\t\t\t\t\tawait writeToCache(cacheDir, ghEntry.integrity, tarballBuffer);\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tif (error instanceof GitHubRateLimitError) {\n\t\t\t\t\t\t\tconsole.error(` Error: ${error.message}`);\n\t\t\t\t\t\t} else if (error instanceof GitHubPathNotFoundError) {\n\t\t\t\t\t\t\tconsole.error(` Error: ${error.message}`);\n\t\t\t\t\t\t} else if (error instanceof GitHubNotFoundError) {\n\t\t\t\t\t\t\tconsole.error(` Error: ${error.message}`);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconst message =\n\t\t\t\t\t\t\t\terror instanceof Error ? error.message : String(error);\n\t\t\t\t\t\t\tconsole.error(` Error downloading ${specifier}: ${message}`);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Extract the package\n\t\t\t\ttry {\n\t\t\t\t\tconst destPath = await extractGitHubPackage(\n\t\t\t\t\t\tparsed,\n\t\t\t\t\t\ttarballBuffer,\n\t\t\t\t\t\tskillsDir,\n\t\t\t\t\t);\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t` Installed to ${destPath}${fromCache ? \" (from cache)\" : \"\"}`,\n\t\t\t\t\t);\n\n\t\t\t\t\t// Track for symlinks\n\t\t\t\t\tconst skillName = getGitHubSkillName(parsed);\n\t\t\t\t\tinstalledSkills.push({\n\t\t\t\t\t\tname: skillName,\n\t\t\t\t\t\tsourcePath: getGitHubSkillPath(\n\t\t\t\t\t\t\tparsed.owner,\n\t\t\t\t\t\t\tparsed.repo,\n\t\t\t\t\t\t\tparsed.path,\n\t\t\t\t\t\t),\n\t\t\t\t\t});\n\t\t\t\t} catch (error) {\n\t\t\t\t\tconst message =\n\t\t\t\t\t\terror instanceof Error ? error.message : String(error);\n\t\t\t\t\tconsole.error(` Error extracting ${specifier}: ${message}`);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// =================================================================\n\t\t// Phase 5: Create agent symlinks\n\t\t// =================================================================\n\t\tif (installedSkills.length > 0 && agents[0] !== \"none\") {\n\t\t\tconsole.log(`\\nCreating symlinks for agent(s): ${agents.join(\", \")}...`);\n\n\t\t\tawait createAgentSymlinks(installedSkills, {\n\t\t\t\tagents,\n\t\t\t\tprojectRoot: process.cwd(),\n\t\t\t\tagentConfigs,\n\t\t\t});\n\n\t\t\tconsole.log(\" Symlinks created.\");\n\t\t}\n\n\t\t// =================================================================\n\t\t// Summary\n\t\t// =================================================================\n\t\tconst totalCount = packageCount + githubCount;\n\t\tif (totalCount === 0) {\n\t\t\tconsole.log(\"No skills to install.\");\n\t\t} else {\n\t\t\tconsole.log(`\\nAll ${totalCount} skill(s) installed.`);\n\t\t}\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : \"Unknown error\";\n\t\tconsole.error(`Error: ${message}`);\n\t\tprocess.exit(1);\n\t}\n}\n","/**\n * Link command - Recreate agent symlinks without reinstalling.\n *\n * Useful after:\n * - Adding new agents to pspm.json\n * - Changing agent configuration\n * - Recovering from accidentally deleted symlinks\n */\n\nimport {\n\tgetGitHubSkillName,\n\tparseGitHubSpecifier,\n\tparseSkillSpecifier,\n} from \"@repo/pspm-types\";\nimport { parseAgentArg, promptForAgents } from \"../agents.js\";\nimport { listLockfileGitHubPackages, listLockfileSkills } from \"../lockfile.js\";\nimport { readManifest } from \"../manifest.js\";\nimport {\n\tcreateAgentSymlinks,\n\tgetGitHubSkillPath,\n\tgetRegistrySkillPath,\n\ttype SkillInfo,\n} from \"../symlinks.js\";\n\nexport interface LinkOptions {\n\tagent?: string;\n\tyes?: boolean;\n}\n\nexport async function link(options: LinkOptions): Promise<void> {\n\ttry {\n\t\t// Read manifest for agent config overrides\n\t\tconst manifest = await readManifest();\n\t\tconst agentConfigs = manifest?.agents;\n\n\t\t// Determine which agents to use\n\t\tlet agents: string[];\n\t\tif (options.agent) {\n\t\t\t// If --agent flag is provided, use it\n\t\t\tagents = parseAgentArg(options.agent);\n\t\t} else if (manifest) {\n\t\t\t// If pspm.json exists, use default agent (respect manifest's agent config)\n\t\t\tagents = parseAgentArg(undefined);\n\t\t} else if (options.yes) {\n\t\t\t// If -y flag is used, use default agent without prompting\n\t\t\tagents = parseAgentArg(undefined);\n\t\t} else {\n\t\t\t// No pspm.json exists, prompt user to select agents\n\t\t\tconsole.log(\"No pspm.json found. Let's set up your project.\\n\");\n\t\t\tagents = await promptForAgents();\n\t\t}\n\n\t\t// Skip if \"none\" agent\n\t\tif (agents.length === 1 && agents[0] === \"none\") {\n\t\t\tconsole.log(\"Skipping symlink creation (--agent none)\");\n\t\t\treturn;\n\t\t}\n\n\t\t// Collect all installed skills\n\t\tconst skills: SkillInfo[] = [];\n\n\t\t// Get registry skills from lockfile\n\t\tconst registrySkills = await listLockfileSkills();\n\t\tfor (const { name } of registrySkills) {\n\t\t\tconst parsed = parseSkillSpecifier(name);\n\t\t\tif (!parsed) {\n\t\t\t\tconsole.warn(`Warning: Invalid skill name in lockfile: ${name}`);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tskills.push({\n\t\t\t\tname: parsed.name,\n\t\t\t\tsourcePath: getRegistrySkillPath(parsed.username, parsed.name),\n\t\t\t});\n\t\t}\n\n\t\t// Get GitHub skills from lockfile\n\t\tconst githubSkills = await listLockfileGitHubPackages();\n\t\tfor (const { specifier } of githubSkills) {\n\t\t\tconst parsed = parseGitHubSpecifier(specifier);\n\t\t\tif (!parsed) {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t`Warning: Invalid GitHub specifier in lockfile: ${specifier}`,\n\t\t\t\t);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst skillName = getGitHubSkillName(parsed);\n\t\t\tskills.push({\n\t\t\t\tname: skillName,\n\t\t\t\tsourcePath: getGitHubSkillPath(parsed.owner, parsed.repo, parsed.path),\n\t\t\t});\n\t\t}\n\n\t\tif (skills.length === 0) {\n\t\t\tconsole.log(\"No skills found in lockfile. Nothing to link.\");\n\t\t\treturn;\n\t\t}\n\n\t\tconsole.log(\n\t\t\t`Creating symlinks for ${skills.length} skill(s) to agent(s): ${agents.join(\", \")}...`,\n\t\t);\n\n\t\tawait createAgentSymlinks(skills, {\n\t\t\tagents,\n\t\t\tprojectRoot: process.cwd(),\n\t\t\tagentConfigs,\n\t\t});\n\n\t\tconsole.log(\"Symlinks created successfully.\");\n\n\t\t// List created symlinks\n\t\tconsole.log(\"\\nLinked skills:\");\n\t\tfor (const skill of skills) {\n\t\t\tconsole.log(` ${skill.name} -> ${skill.sourcePath}`);\n\t\t}\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : \"Unknown error\";\n\t\tconsole.error(`Error: ${message}`);\n\t\tprocess.exit(1);\n\t}\n}\n","/**\n * List command - Show installed skills.\n *\n * Displays:\n * - Registry and GitHub skills\n * - Source type\n * - Version / commit info\n * - Linked agent paths\n */\n\nimport { access } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport {\n\ttype GitHubLockfileEntry,\n\tgetGitHubSkillName,\n\tparseGitHubSpecifier,\n} from \"@repo/pspm-types\";\nimport { getAvailableAgents, resolveAgentConfig } from \"../agents.js\";\nimport { listLockfileGitHubPackages, listLockfileSkills } from \"../lockfile.js\";\nimport { readManifest } from \"../manifest.js\";\nimport {\n\tgetGitHubSkillPath,\n\tgetLinkedAgents,\n\tgetRegistrySkillPath,\n} from \"../symlinks.js\";\n\nexport interface ListOptions {\n\tjson?: boolean;\n}\n\ninterface SkillListItem {\n\tname: string;\n\tfullName: string;\n\tversion: string;\n\tsource: \"registry\" | \"github\";\n\tsourcePath: string;\n\tstatus: \"installed\" | \"missing\";\n\tlinkedAgents: string[];\n\tgitRef?: string;\n\tgitCommit?: string;\n}\n\nexport async function list(options: ListOptions): Promise<void> {\n\ttry {\n\t\t// Get all skills from lockfile\n\t\tconst registrySkills = await listLockfileSkills();\n\t\tconst githubSkills = await listLockfileGitHubPackages();\n\n\t\t// Read manifest for agent configs\n\t\tconst manifest = await readManifest();\n\t\tconst agentConfigs = manifest?.agents;\n\t\tconst availableAgents = getAvailableAgents(agentConfigs);\n\t\tconst projectRoot = process.cwd();\n\n\t\t// Build list of all skills\n\t\tconst skills: SkillListItem[] = [];\n\n\t\t// Add registry skills\n\t\tfor (const { name: fullName, entry } of registrySkills) {\n\t\t\tconst match = fullName.match(/^@user\\/([^/]+)\\/([^/]+)$/);\n\t\t\tif (!match) continue;\n\n\t\t\tconst [, username, skillName] = match;\n\t\t\tconst sourcePath = getRegistrySkillPath(username, skillName);\n\t\t\tconst absolutePath = join(projectRoot, sourcePath);\n\n\t\t\t// Check if installed on disk\n\t\t\tlet status: \"installed\" | \"missing\" = \"installed\";\n\t\t\ttry {\n\t\t\t\tawait access(absolutePath);\n\t\t\t} catch {\n\t\t\t\tstatus = \"missing\";\n\t\t\t}\n\n\t\t\t// Check which agents have symlinks\n\t\t\tconst linkedAgents = await getLinkedAgents(\n\t\t\t\tskillName,\n\t\t\t\tavailableAgents,\n\t\t\t\tprojectRoot,\n\t\t\t\tagentConfigs,\n\t\t\t);\n\n\t\t\tskills.push({\n\t\t\t\tname: skillName,\n\t\t\t\tfullName,\n\t\t\t\tversion: entry.version,\n\t\t\t\tsource: \"registry\",\n\t\t\t\tsourcePath,\n\t\t\t\tstatus,\n\t\t\t\tlinkedAgents,\n\t\t\t});\n\t\t}\n\n\t\t// Add GitHub skills\n\t\tfor (const { specifier, entry } of githubSkills) {\n\t\t\tconst parsed = parseGitHubSpecifier(specifier);\n\t\t\tif (!parsed) continue;\n\n\t\t\tconst ghEntry = entry as GitHubLockfileEntry;\n\t\t\tconst skillName = getGitHubSkillName(parsed);\n\t\t\tconst sourcePath = getGitHubSkillPath(\n\t\t\t\tparsed.owner,\n\t\t\t\tparsed.repo,\n\t\t\t\tparsed.path,\n\t\t\t);\n\t\t\tconst absolutePath = join(projectRoot, sourcePath);\n\n\t\t\t// Check if installed on disk\n\t\t\tlet status: \"installed\" | \"missing\" = \"installed\";\n\t\t\ttry {\n\t\t\t\tawait access(absolutePath);\n\t\t\t} catch {\n\t\t\t\tstatus = \"missing\";\n\t\t\t}\n\n\t\t\t// Check which agents have symlinks\n\t\t\tconst linkedAgents = await getLinkedAgents(\n\t\t\t\tskillName,\n\t\t\t\tavailableAgents,\n\t\t\t\tprojectRoot,\n\t\t\t\tagentConfigs,\n\t\t\t);\n\n\t\t\tskills.push({\n\t\t\t\tname: skillName,\n\t\t\t\tfullName: specifier,\n\t\t\t\tversion: ghEntry.gitCommit.slice(0, 7),\n\t\t\t\tsource: \"github\",\n\t\t\t\tsourcePath,\n\t\t\t\tstatus,\n\t\t\t\tlinkedAgents,\n\t\t\t\tgitRef: ghEntry.gitRef,\n\t\t\t\tgitCommit: ghEntry.gitCommit,\n\t\t\t});\n\t\t}\n\n\t\tif (skills.length === 0) {\n\t\t\tconsole.log(\"No skills installed.\");\n\t\t\treturn;\n\t\t}\n\n\t\tif (options.json) {\n\t\t\tconsole.log(JSON.stringify(skills, null, 2));\n\t\t\treturn;\n\t\t}\n\n\t\tconsole.log(\"Installed skills:\\n\");\n\n\t\tfor (const skill of skills) {\n\t\t\t// Header line: name@version (source)\n\t\t\tif (skill.source === \"registry\") {\n\t\t\t\tconsole.log(` ${skill.fullName}@${skill.version} (registry)`);\n\t\t\t} else {\n\t\t\t\tconst refInfo = skill.gitRef\n\t\t\t\t\t? `${skill.gitRef}@${skill.gitCommit?.slice(0, 7)}`\n\t\t\t\t\t: skill.version;\n\t\t\t\tconsole.log(` ${skill.fullName} (${refInfo})`);\n\t\t\t}\n\n\t\t\t// Status line if missing\n\t\t\tif (skill.status === \"missing\") {\n\t\t\t\tconsole.log(` Status: MISSING (run 'pspm install' to restore)`);\n\t\t\t}\n\n\t\t\t// Symlink line\n\t\t\tif (skill.linkedAgents.length > 0) {\n\t\t\t\tfor (const agent of skill.linkedAgents) {\n\t\t\t\t\tconst config = resolveAgentConfig(agent, agentConfigs);\n\t\t\t\t\tif (config) {\n\t\t\t\t\t\tconsole.log(` -> ${config.skillsDir}/${skill.name}`);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Summary\n\t\tconst registryCount = skills.filter((s) => s.source === \"registry\").length;\n\t\tconst githubCount = skills.filter((s) => s.source === \"github\").length;\n\t\tconst parts: string[] = [];\n\t\tif (registryCount > 0) parts.push(`${registryCount} registry`);\n\t\tif (githubCount > 0) parts.push(`${githubCount} github`);\n\n\t\tconsole.log(`\\nTotal: ${skills.length} skill(s) (${parts.join(\", \")})`);\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : \"Unknown error\";\n\t\tconsole.error(`Error: ${message}`);\n\t\tprocess.exit(1);\n\t}\n}\n","import { randomBytes } from \"node:crypto\";\nimport http from \"node:http\";\nimport { URL } from \"node:url\";\nimport open from \"open\";\nimport { whoamiRequest } from \"../api-client.js\";\nimport { getRegistryUrl, setCredentials } from \"../config.js\";\n\nexport interface LoginOptions {\n\tapiKey?: string;\n}\n\nconst DEFAULT_WEB_APP_URL = \"https://pspm.dev\";\n\n/**\n * Get the web app URL.\n * Priority:\n * 1. PSPM_WEB_URL environment variable (for local dev where web and server run on different ports)\n * 2. Derived from registry URL (for production where they share the same origin)\n *\n * Local dev example:\n * PSPM_WEB_URL=http://localhost:5500 pspm login\n *\n * The registry URL is like https://pspm.dev\n * The web app URL is the same: https://pspm.dev\n */\nfunction getWebAppUrl(registryUrl: string): string {\n\t// Environment variable takes priority (for local dev)\n\tif (process.env.PSPM_WEB_URL) {\n\t\treturn process.env.PSPM_WEB_URL.replace(/\\/$/, \"\"); // Remove trailing slash\n\t}\n\n\ttry {\n\t\tconst url = new URL(registryUrl);\n\t\treturn `${url.protocol}//${url.host}`;\n\t} catch {\n\t\treturn DEFAULT_WEB_APP_URL;\n\t}\n}\n\n/**\n * Get the server/API base URL from the registry URL\n * The registry URL is like https://pspm.dev\n * The server URL is the same: https://pspm.dev\n */\nfunction getServerUrl(registryUrl: string): string {\n\ttry {\n\t\tconst url = new URL(registryUrl);\n\t\treturn `${url.protocol}//${url.host}`;\n\t} catch {\n\t\treturn DEFAULT_WEB_APP_URL;\n\t}\n}\n\n/**\n * Exchange a CLI token for an API key using fetch\n */\nasync function exchangeCliToken(\n\tregistryUrl: string,\n\ttoken: string,\n): Promise<{ apiKey: string; username: string }> {\n\tconst serverUrl = getServerUrl(registryUrl);\n\t// Use direct REST endpoint (not oRPC) for CLI compatibility\n\tconst rpcUrl = `${serverUrl}/api/api-keys/cli-token-exchange`;\n\n\tconst response = await fetch(rpcUrl, {\n\t\tmethod: \"POST\",\n\t\theaders: {\n\t\t\t\"Content-Type\": \"application/json\",\n\t\t},\n\t\tbody: JSON.stringify({ token }),\n\t});\n\n\tif (!response.ok) {\n\t\tconst errorText = await response.text();\n\t\tthrow new Error(`Failed to exchange token: ${errorText}`);\n\t}\n\n\treturn response.json() as Promise<{ apiKey: string; username: string }>;\n}\n\n/**\n * Start a local HTTP server to receive the OAuth callback\n */\nfunction startCallbackServer(expectedState: string): Promise<{\n\tport: number;\n\ttokenPromise: Promise<string>;\n\tcleanup: () => void;\n}> {\n\treturn new Promise((resolveServer, rejectServer) => {\n\t\tlet resolveToken: (token: string) => void;\n\t\tlet rejectToken: (error: Error) => void;\n\t\tlet timeoutId: NodeJS.Timeout;\n\n\t\tconst tokenPromise = new Promise<string>((resolve, reject) => {\n\t\t\tresolveToken = resolve;\n\t\t\trejectToken = reject;\n\t\t});\n\n\t\tconst server = http.createServer((req, res) => {\n\t\t\tconst url = new URL(req.url || \"/\", `http://localhost`);\n\n\t\t\tif (url.pathname === \"/callback\") {\n\t\t\t\tconst token = url.searchParams.get(\"token\");\n\t\t\t\tconst state = url.searchParams.get(\"state\");\n\n\t\t\t\tif (state !== expectedState) {\n\t\t\t\t\tres.writeHead(400, { \"Content-Type\": \"text/html\" });\n\t\t\t\t\tres.end(`\n\t\t\t\t\t\t<html>\n\t\t\t\t\t\t\t<body style=\"font-family: system-ui; text-align: center; padding: 40px;\">\n\t\t\t\t\t\t\t\t<h1 style=\"color: #dc2626;\">Security Error</h1>\n\t\t\t\t\t\t\t\t<p>State mismatch - this may be a security issue.</p>\n\t\t\t\t\t\t\t\t<p>Please try running <code>pspm login</code> again.</p>\n\t\t\t\t\t\t\t</body>\n\t\t\t\t\t\t</html>\n\t\t\t\t\t`);\n\t\t\t\t\trejectToken(new Error(\"State mismatch - possible CSRF attack\"));\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (!token) {\n\t\t\t\t\tres.writeHead(400, { \"Content-Type\": \"text/html\" });\n\t\t\t\t\tres.end(`\n\t\t\t\t\t\t<html>\n\t\t\t\t\t\t\t<body style=\"font-family: system-ui; text-align: center; padding: 40px;\">\n\t\t\t\t\t\t\t\t<h1 style=\"color: #dc2626;\">Error</h1>\n\t\t\t\t\t\t\t\t<p>No token received from the server.</p>\n\t\t\t\t\t\t\t\t<p>Please try running <code>pspm login</code> again.</p>\n\t\t\t\t\t\t\t</body>\n\t\t\t\t\t\t</html>\n\t\t\t\t\t`);\n\t\t\t\t\trejectToken(new Error(\"No token received\"));\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tres.writeHead(200, { \"Content-Type\": \"text/html\" });\n\t\t\t\tres.end(`\n\t\t\t\t\t<html>\n\t\t\t\t\t\t<head>\n\t\t\t\t\t\t\t<script>\n\t\t\t\t\t\t\t\t// Try to close the window after a short delay\n\t\t\t\t\t\t\t\tsetTimeout(function() {\n\t\t\t\t\t\t\t\t\twindow.close();\n\t\t\t\t\t\t\t\t}, 1500);\n\t\t\t\t\t\t\t</script>\n\t\t\t\t\t\t</head>\n\t\t\t\t\t\t<body style=\"font-family: system-ui; text-align: center; padding: 40px;\">\n\t\t\t\t\t\t\t<h1 style=\"color: #16a34a;\">Success!</h1>\n\t\t\t\t\t\t\t<p>You are now logged in to PSPM.</p>\n\t\t\t\t\t\t\t<p style=\"color: #666; font-size: 14px;\">This window will close automatically, or you can close it manually.</p>\n\t\t\t\t\t\t</body>\n\t\t\t\t\t</html>\n\t\t\t\t`);\n\n\t\t\t\tresolveToken(token);\n\t\t\t} else {\n\t\t\t\tres.writeHead(404, { \"Content-Type\": \"text/plain\" });\n\t\t\t\tres.end(\"Not found\");\n\t\t\t}\n\t\t});\n\n\t\t// Cleanup function to close server and clear timeout\n\t\tconst cleanup = () => {\n\t\t\tclearTimeout(timeoutId);\n\t\t\tserver.close();\n\t\t};\n\n\t\t// Use port 0 to let the OS assign an available port\n\t\tserver.listen(0, \"127.0.0.1\", () => {\n\t\t\tconst address = server.address();\n\t\t\tif (typeof address === \"object\" && address !== null) {\n\t\t\t\tresolveServer({ port: address.port, tokenPromise, cleanup });\n\t\t\t} else {\n\t\t\t\trejectServer(new Error(\"Failed to get server address\"));\n\t\t\t}\n\t\t});\n\n\t\tserver.on(\"error\", (err) => {\n\t\t\trejectServer(err);\n\t\t});\n\n\t\t// Timeout after 5 minutes\n\t\ttimeoutId = setTimeout(\n\t\t\t() => {\n\t\t\t\trejectToken(new Error(\"Login timed out - please try again\"));\n\t\t\t\tserver.close();\n\t\t\t},\n\t\t\t5 * 60 * 1000,\n\t\t);\n\t});\n}\n\n/**\n * Login using browser-based OAuth flow\n */\nasync function browserLogin(): Promise<void> {\n\tconst registryUrl = await getRegistryUrl();\n\tconst webAppUrl = getWebAppUrl(registryUrl);\n\n\t// Generate state for CSRF protection\n\tconst state = randomBytes(32).toString(\"base64url\");\n\n\tconsole.log(\"Starting browser-based login...\");\n\n\t// Start local callback server\n\tconst { port, tokenPromise, cleanup } = await startCallbackServer(state);\n\n\t// Build the login URL\n\tconst loginUrl = `${webAppUrl}/cli/login?port=${port}&state=${encodeURIComponent(state)}`;\n\n\tconsole.log(`Opening browser to authenticate...`);\n\tconsole.log(`If the browser doesn't open, visit: ${loginUrl}`);\n\n\t// Open the browser\n\ttry {\n\t\tawait open(loginUrl);\n\t} catch {\n\t\tconsole.log(\"Could not open browser automatically.\");\n\t\tconsole.log(`Please visit: ${loginUrl}`);\n\t}\n\n\tconsole.log(\"Waiting for authentication...\");\n\n\t// Wait for the callback with the token\n\tconst token = await tokenPromise;\n\n\t// Clean up server and timeout immediately after receiving token\n\tcleanup();\n\n\tconsole.log(\"Received token, exchanging for API key...\");\n\n\t// Exchange the token for an API key\n\tconst { apiKey, username } = await exchangeCliToken(registryUrl, token);\n\n\t// Store credentials\n\tawait setCredentials(apiKey, username, registryUrl);\n\n\tconsole.log(`Logged in as ${username}`);\n\tconsole.log(`Registry: ${registryUrl}`);\n}\n\n/**\n * Login using direct API key (fallback method)\n */\nasync function directLogin(apiKey: string): Promise<void> {\n\tconsole.log(\"Verifying API key...\");\n\n\tconst registryUrl = await getRegistryUrl();\n\n\tconst user = await whoamiRequest(registryUrl, apiKey);\n\tif (!user) {\n\t\tconsole.error(\"Error: Invalid API key or not authenticated\");\n\t\tprocess.exit(1);\n\t}\n\n\t// Store credentials\n\tawait setCredentials(apiKey, user.username, registryUrl);\n\tconsole.log(`Logged in as ${user.username}`);\n\tconsole.log(`Registry: ${registryUrl}`);\n}\n\nexport async function login(options: LoginOptions): Promise<void> {\n\ttry {\n\t\tif (options.apiKey) {\n\t\t\t// Direct login with API key\n\t\t\tawait directLogin(options.apiKey);\n\t\t} else {\n\t\t\t// Browser-based OAuth flow\n\t\t\tawait browserLogin();\n\t\t}\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : \"Unknown error\";\n\t\tconsole.error(`Error: ${message}`);\n\t\tprocess.exit(1);\n\t}\n}\n","import { clearCredentials, isLoggedIn } from \"../config.js\";\n\nexport async function logout(): Promise<void> {\n\ttry {\n\t\tconst loggedIn = await isLoggedIn();\n\n\t\tif (!loggedIn) {\n\t\t\tconsole.log(\"Not logged in.\");\n\t\t\treturn;\n\t\t}\n\n\t\tawait clearCredentials();\n\t\tconsole.log(\"Logged out successfully.\");\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : \"Unknown error\";\n\t\tconsole.error(`Error: ${message}`);\n\t\tprocess.exit(1);\n\t}\n}\n","import { mkdir, readdir, rename, rm, stat } from \"node:fs/promises\";\nimport {\n\tgetLegacyLockfilePath,\n\tgetLegacySkillsDir,\n\tgetLockfilePath,\n\tgetPspmDir,\n\tgetSkillsDir,\n} from \"../config.js\";\nimport { migrateLockfileIfNeeded } from \"../lockfile.js\";\n\nexport interface MigrateOptions {\n\tdryRun?: boolean;\n}\n\n/**\n * Migrate from old directory structure to new:\n * - .skills/ → .pspm/skills/\n * - skill-lock.json → pspm-lock.json\n */\nexport async function migrate(options: MigrateOptions): Promise<void> {\n\ttry {\n\t\tconst legacySkillsDir = getLegacySkillsDir();\n\t\tconst newSkillsDir = getSkillsDir();\n\t\tconst legacyLockfilePath = getLegacyLockfilePath();\n\t\tconst newLockfilePath = getLockfilePath();\n\t\tconst pspmDir = getPspmDir();\n\n\t\tlet migrationNeeded = false;\n\t\tconst actions: string[] = [];\n\n\t\t// Check for legacy .skills directory\n\t\ttry {\n\t\t\tconst legacyStats = await stat(legacySkillsDir);\n\t\t\tif (legacyStats.isDirectory()) {\n\t\t\t\t// Check if it has any content\n\t\t\t\tconst contents = await readdir(legacySkillsDir);\n\t\t\t\tif (contents.length > 0) {\n\t\t\t\t\tmigrationNeeded = true;\n\t\t\t\t\tactions.push(`Move .skills/ → .pspm/skills/`);\n\t\t\t\t}\n\t\t\t}\n\t\t} catch {\n\t\t\t// Legacy directory doesn't exist\n\t\t}\n\n\t\t// Check for legacy lockfile\n\t\ttry {\n\t\t\tawait stat(legacyLockfilePath);\n\t\t\t// Check if new lockfile already exists\n\t\t\ttry {\n\t\t\t\tawait stat(newLockfilePath);\n\t\t\t\t// Both exist - suggest manual resolution\n\t\t\t\tactions.push(\n\t\t\t\t\t`Note: Both skill-lock.json and pspm-lock.json exist. Manual merge may be needed.`,\n\t\t\t\t);\n\t\t\t} catch {\n\t\t\t\tmigrationNeeded = true;\n\t\t\t\tactions.push(`Migrate skill-lock.json → pspm-lock.json`);\n\t\t\t}\n\t\t} catch {\n\t\t\t// Legacy lockfile doesn't exist\n\t\t}\n\n\t\tif (!migrationNeeded && actions.length === 0) {\n\t\t\tconsole.log(\n\t\t\t\t\"No migration needed. Project is already using the new structure.\",\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tif (options.dryRun) {\n\t\t\tconsole.log(\"Migration plan (dry run):\");\n\t\t\tconsole.log(\"\");\n\t\t\tfor (const action of actions) {\n\t\t\t\tconsole.log(` - ${action}`);\n\t\t\t}\n\t\t\tconsole.log(\"\");\n\t\t\tconsole.log(\"Run without --dry-run to perform migration.\");\n\t\t\treturn;\n\t\t}\n\n\t\tconsole.log(\"Migrating project structure...\\n\");\n\n\t\t// Migrate lockfile first\n\t\tconst lockfileMigrated = await migrateLockfileIfNeeded();\n\t\tif (lockfileMigrated) {\n\t\t\tconsole.log(\" ✓ Migrated skill-lock.json → pspm-lock.json\");\n\t\t}\n\n\t\t// Migrate .skills directory\n\t\ttry {\n\t\t\tconst legacyStats = await stat(legacySkillsDir);\n\t\t\tif (legacyStats.isDirectory()) {\n\t\t\t\tconst contents = await readdir(legacySkillsDir);\n\t\t\t\tif (contents.length > 0) {\n\t\t\t\t\t// Create .pspm directory\n\t\t\t\t\tawait mkdir(pspmDir, { recursive: true });\n\n\t\t\t\t\t// Check if new skills dir exists and has content\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst newStats = await stat(newSkillsDir);\n\t\t\t\t\t\tif (newStats.isDirectory()) {\n\t\t\t\t\t\t\tconst newContents = await readdir(newSkillsDir);\n\t\t\t\t\t\t\tif (newContents.length > 0) {\n\t\t\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t\t\t\" ! Both .skills/ and .pspm/skills/ have content. Manual merge required.\",\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t// New dir exists but empty, remove it first\n\t\t\t\t\t\t\t\tawait rm(newSkillsDir, { recursive: true, force: true });\n\t\t\t\t\t\t\t\tawait rename(legacySkillsDir, newSkillsDir);\n\t\t\t\t\t\t\t\tconsole.log(\" ✓ Moved .skills/ → .pspm/skills/\");\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch {\n\t\t\t\t\t\t// New skills dir doesn't exist, safe to move\n\t\t\t\t\t\tawait rename(legacySkillsDir, newSkillsDir);\n\t\t\t\t\t\tconsole.log(\" ✓ Moved .skills/ → .pspm/skills/\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} catch {\n\t\t\t// Legacy directory doesn't exist\n\t\t}\n\n\t\tconsole.log(\"\");\n\t\tconsole.log(\"Migration complete!\");\n\t\tconsole.log(\"\");\n\t\tconsole.log(\n\t\t\t\"You can safely delete these legacy files if they still exist:\",\n\t\t);\n\t\tconsole.log(\" - skill-lock.json (replaced by pspm-lock.json)\");\n\t\tconsole.log(\" - .skills/ (replaced by .pspm/skills/)\");\n\t\tconsole.log(\"\");\n\t\tconsole.log(\"Update your .gitignore to include:\");\n\t\tconsole.log(\" .pspm/cache/\");\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : \"Unknown error\";\n\t\tconsole.error(`Error: ${message}`);\n\t\tprocess.exit(1);\n\t}\n}\n","import { exec as execCb } from \"node:child_process\";\nimport { createHash } from \"node:crypto\";\nimport { readdir, readFile, stat } from \"node:fs/promises\";\nimport { join, relative } from \"node:path\";\nimport { promisify } from \"node:util\";\nimport {\n\tDEFAULT_SKILL_FILES,\n\ttype ManifestDetectionResult,\n\ttype PspmManifest,\n\tvalidateManifest,\n} from \"@repo/pspm-types\";\nimport type { SkillManifest } from \"@repo/sdk\";\nimport { changeSkillAccess, configure, publishSkill } from \"../api-client.js\";\nimport { getRegistryUrl, requireApiKey } from \"../config.js\";\nimport { extractApiErrorMessage } from \"../errors.js\";\n\nconst exec = promisify(execCb);\n\n/**\n * 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};\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): Promise<Array<{ path: string; size: number }>> {\n\tconst results: Array<{ path: string; size: number }> = [];\n\n\ttry {\n\t\tconst entries = await readdir(dir, { withFileTypes: true });\n\n\t\tfor (const entry of entries) {\n\t\t\tconst fullPath = join(dir, entry.name);\n\t\t\tconst relativePath = relative(baseDir, fullPath);\n\n\t\t\t// Skip node_modules and .git\n\t\t\tif (entry.name === \"node_modules\" || entry.name === \".git\") {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (entry.isDirectory()) {\n\t\t\t\tconst subFiles = await getFilesWithSizes(fullPath, baseDir);\n\t\t\t\tresults.push(...subFiles);\n\t\t\t} else {\n\t\t\t\tconst fileStat = await stat(fullPath);\n\t\t\t\tresults.push({ path: relativePath, size: fileStat.size });\n\t\t\t}\n\t\t}\n\t} catch {\n\t\t// Directory doesn't exist or can't be read\n\t}\n\n\treturn results;\n}\n\nexport interface PublishOptions {\n\tbump?: \"major\" | \"minor\" | \"patch\";\n\ttag?: string;\n\t/** Set package visibility during publish */\n\taccess?: \"public\" | \"private\";\n}\n\nexport async function publishCommand(options: PublishOptions): Promise<void> {\n\ttry {\n\t\tconst apiKey = await requireApiKey();\n\t\tconst registryUrl = await getRegistryUrl();\n\n\t\t// Detect and read manifest (pspm.json preferred, package.json fallback)\n\t\tconst detection = await detectManifest();\n\t\tconst manifest = detection.manifest;\n\n\t\t// Warn if using package.json instead of pspm.json\n\t\tif (detection.type === \"package.json\") {\n\t\t\tconsole.log(\"pspm warn Using package.json instead of pspm.json\");\n\t\t\tconsole.log(\n\t\t\t\t\"pspm warn Run 'pspm init' to create a dedicated pspm.json manifest\",\n\t\t\t);\n\t\t\tconsole.log(\"\");\n\t\t}\n\n\t\t// Validate manifest\n\t\tconst validation = validateManifest(manifest);\n\t\tif (!validation.valid) {\n\t\t\tconsole.error(`Error: ${validation.error}`);\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\t// 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};\n\n\t\t// Handle version bump if requested\n\t\tif (options.bump) {\n\t\t\tconst semver = await import(\"semver\");\n\t\t\tconst newVersion = semver.default.inc(packageJson.version, options.bump);\n\t\t\tif (!newVersion) {\n\t\t\t\tconsole.error(\n\t\t\t\t\t`Error: Failed to bump version from ${packageJson.version}`,\n\t\t\t\t);\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\t\t\tpackageJson.version = newVersion;\n\t\t\tconsole.log(`Bumped version to ${newVersion}`);\n\t\t}\n\n\t\t// Create tarball using npm pack (or tar directly)\n\t\t// Sanitize name for filename (replace @ and / with -)\n\t\tconst safeName = packageJson.name.replace(/[@/]/g, \"-\").replace(/^-+/, \"\");\n\t\tconst tarballName = `${safeName}-${packageJson.version}.tgz`;\n\t\tconst tempDir = join(process.cwd(), \".pspm-publish\");\n\n\t\t// Create tarball\n\t\ttry {\n\t\t\tawait exec(`rm -rf \"${tempDir}\" && mkdir -p \"${tempDir}\"`);\n\n\t\t\t// Get files to include (use 'files' from 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 node_modules\n\t\t\t\t\tawait exec(\n\t\t\t\t\t\t`rsync -a --exclude='node_modules' --exclude='.git' \"${file}\" \"${tempDir}/package/\" 2>/dev/null || true`,\n\t\t\t\t\t);\n\t\t\t\t} catch {\n\t\t\t\t\t// Ignore files that don't exist\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Always include 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\tconst packageDir = join(tempDir, \"package\");\n\t\t\tconst tarballContents = await getFilesWithSizes(packageDir, packageDir);\n\t\t\tconst unpackedSize = tarballContents.reduce((acc, f) => acc + f.size, 0);\n\n\t\t\t// Create tarball (excluding node_modules just in case)\n\t\t\tconst tarballPath = join(tempDir, tarballName);\n\t\t\tawait exec(\n\t\t\t\t`tar -czf \"${tarballPath}\" -C \"${tempDir}\" --exclude='node_modules' --exclude='.git' package`,\n\t\t\t);\n\n\t\t\t// Read tarball and calculate hashes\n\t\t\tconst tarballBuffer = await readFile(tarballPath);\n\t\t\tconst tarballBase64 = tarballBuffer.toString(\"base64\");\n\t\t\tconst tarballSize = tarballBuffer.length;\n\n\t\t\t// Calculate shasum (sha1) and integrity (sha512)\n\t\t\tconst shasum = createHash(\"sha1\").update(tarballBuffer).digest(\"hex\");\n\t\t\tconst integrityHash = createHash(\"sha512\")\n\t\t\t\t.update(tarballBuffer)\n\t\t\t\t.digest(\"base64\");\n\t\t\tconst integrity = `sha512-${integrityHash}`;\n\n\t\t\t// Print npm-style publish notice\n\t\t\tconsole.log(\"\");\n\t\t\tconsole.log(`pspm notice`);\n\t\t\tconsole.log(`pspm notice 📦 ${packageJson.name}@${packageJson.version}`);\n\t\t\tconsole.log(`pspm notice Tarball Contents`);\n\n\t\t\t// Sort files by size descending for display\n\t\t\ttarballContents.sort((a, b) => b.size - a.size);\n\t\t\tfor (const file of tarballContents) {\n\t\t\t\tconsole.log(\n\t\t\t\t\t`pspm notice ${formatBytes(file.size).padStart(8)} ${file.path}`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconsole.log(`pspm notice Tarball Details`);\n\t\t\tconsole.log(`pspm notice name: ${packageJson.name}`);\n\t\t\tconsole.log(`pspm notice version: ${packageJson.version}`);\n\t\t\tconsole.log(`pspm notice filename: ${tarballName}`);\n\t\t\tconsole.log(`pspm notice package size: ${formatBytes(tarballSize)}`);\n\t\t\tconsole.log(`pspm notice unpacked size: ${formatBytes(unpackedSize)}`);\n\t\t\tconsole.log(`pspm notice shasum: ${shasum}`);\n\t\t\tconsole.log(\n\t\t\t\t`pspm notice integrity: ${integrity.substring(0, 50)}...`,\n\t\t\t);\n\t\t\tconsole.log(`pspm notice total files: ${tarballContents.length}`);\n\t\t\tconsole.log(`pspm notice`);\n\t\t\tconsole.log(`pspm notice Publishing to ${registryUrl} with tag latest`);\n\n\t\t\t// Configure SDK and publish (use direct REST endpoints, not oRPC)\n\t\t\tconfigure({ registryUrl, apiKey });\n\t\t\tconst response = await publishSkill({\n\t\t\t\tmanifest: packageJson,\n\t\t\t\ttarballBase64,\n\t\t\t});\n\n\t\t\tif (response.status !== 200) {\n\t\t\t\tconst errorMessage = extractApiErrorMessage(response, \"Publish failed\");\n\n\t\t\t\t// Check for version conflict errors\n\t\t\t\tif (\n\t\t\t\t\terrorMessage.includes(\"must be greater than\") ||\n\t\t\t\t\terrorMessage.includes(\"already exists\")\n\t\t\t\t) {\n\t\t\t\t\tconsole.error(`pspm error code E403`);\n\t\t\t\t\tconsole.error(\n\t\t\t\t\t\t`pspm error 403 403 Forbidden - You cannot publish over the previously published versions: ${packageJson.version}.`,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tthrow new Error(errorMessage);\n\t\t\t}\n\n\t\t\tconst result = response.data;\n\t\t\tconsole.log(\n\t\t\t\t`+ @user/${result.skill.username}/${result.skill.name}@${result.version.version}`,\n\t\t\t);\n\t\t\tconsole.log(`Checksum: ${result.version.checksum}`);\n\n\t\t\t// Set visibility if --access flag was provided\n\t\t\tif (options.access) {\n\t\t\t\tconsole.log(`\\nSetting visibility to ${options.access}...`);\n\t\t\t\tconst accessResponse = await changeSkillAccess(packageJson.name, {\n\t\t\t\t\tvisibility: options.access,\n\t\t\t\t});\n\n\t\t\t\tif (accessResponse.status !== 200 || !accessResponse.data) {\n\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\t`Warning: Failed to set visibility: ${accessResponse.error ?? \"Unknown error\"}`,\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tconsole.log(`Package is now ${accessResponse.data.visibility}`);\n\t\t\t\t\tif (options.access === \"public\") {\n\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t\"Note: This action is irreversible. Public packages cannot be made private.\",\n\t\t\t\t\t\t);\n\t\t\t\t\t}\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 {\n\tgetGitHubSkillName,\n\tisGitHubSpecifier,\n\tparseGitHubSpecifier,\n} from \"@repo/pspm-types\";\nimport { getAvailableAgents } from \"../agents.js\";\nimport { getSkillsDir } from \"../config.js\";\nimport {\n\tlistLockfileGitHubPackages,\n\tlistLockfileSkills,\n\tremoveFromLockfile,\n\tremoveGitHubFromLockfile,\n} from \"../lockfile.js\";\nimport {\n\treadManifest,\n\tremoveDependency,\n\tremoveGitHubDependency,\n} from \"../manifest.js\";\nimport { getGitHubSkillPath, removeAgentSymlinks } from \"../symlinks.js\";\n\nexport async function remove(nameOrSpecifier: string): Promise<void> {\n\ttry {\n\t\t// Read manifest for agent config overrides\n\t\tconst manifest = await readManifest();\n\t\tconst agentConfigs = manifest?.agents;\n\t\tconst agents = getAvailableAgents(agentConfigs);\n\n\t\t// Determine type of specifier\n\t\tif (isGitHubSpecifier(nameOrSpecifier)) {\n\t\t\tawait removeGitHub(nameOrSpecifier, agents, agentConfigs);\n\t\t} else if (nameOrSpecifier.startsWith(\"@user/\")) {\n\t\t\tawait removeRegistry(nameOrSpecifier, agents, agentConfigs);\n\t\t} else {\n\t\t\t// Short name - try to find in either registry or GitHub skills\n\t\t\tawait removeByShortName(nameOrSpecifier, agents, agentConfigs);\n\t\t}\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : \"Unknown error\";\n\t\tconsole.error(`Error: ${message}`);\n\t\tprocess.exit(1);\n\t}\n}\n\n/**\n * Remove a registry skill by full specifier.\n */\nasync function removeRegistry(\n\tspecifier: string,\n\tagents: string[],\n\tagentConfigs?: Record<string, { skillsDir: string }>,\n): Promise<void> {\n\tconst match = specifier.match(/^@user\\/([^/]+)\\/([^@/]+)/);\n\tif (!match) {\n\t\tconsole.error(`Error: Invalid skill specifier: ${specifier}`);\n\t\tprocess.exit(1);\n\t}\n\n\tconst fullName = `@user/${match[1]}/${match[2]}`;\n\tconst username = match[1];\n\tconst name = match[2];\n\n\tconsole.log(`Removing ${fullName}...`);\n\n\t// Remove from lockfile\n\tconst removedFromLockfile = await removeFromLockfile(fullName);\n\n\t// Remove from pspm.json dependencies\n\tconst removedFromManifest = await removeDependency(fullName);\n\n\tif (!removedFromLockfile && !removedFromManifest) {\n\t\tconsole.error(`Error: ${fullName} not found in lockfile or pspm.json`);\n\t\tprocess.exit(1);\n\t}\n\n\t// Remove symlinks from all agents\n\tawait removeAgentSymlinks(name, {\n\t\tagents,\n\t\tprojectRoot: process.cwd(),\n\t\tagentConfigs,\n\t});\n\n\t// Remove from disk\n\tconst skillsDir = getSkillsDir();\n\tconst destDir = join(skillsDir, username, name);\n\n\ttry {\n\t\tawait rm(destDir, { recursive: true, force: true });\n\t} catch {\n\t\t// Ignore errors if directory doesn't exist\n\t}\n\n\tconsole.log(`Removed ${fullName}`);\n}\n\n/**\n * Remove a GitHub skill by specifier.\n */\nasync function removeGitHub(\n\tspecifier: string,\n\tagents: string[],\n\tagentConfigs?: Record<string, { skillsDir: string }>,\n): Promise<void> {\n\tconst parsed = parseGitHubSpecifier(specifier);\n\tif (!parsed) {\n\t\tconsole.error(`Error: Invalid GitHub specifier: ${specifier}`);\n\t\tprocess.exit(1);\n\t}\n\n\t// Build the lockfile key (without ref)\n\tconst lockfileKey = parsed.path\n\t\t? `github:${parsed.owner}/${parsed.repo}/${parsed.path}`\n\t\t: `github:${parsed.owner}/${parsed.repo}`;\n\n\tconsole.log(`Removing ${lockfileKey}...`);\n\n\t// Remove from lockfile\n\tconst removedFromLockfile = await removeGitHubFromLockfile(lockfileKey);\n\n\t// Remove from pspm.json githubDependencies\n\tconst removedFromManifest = await removeGitHubDependency(lockfileKey);\n\n\tif (!removedFromLockfile && !removedFromManifest) {\n\t\tconsole.error(`Error: ${lockfileKey} not found in lockfile or pspm.json`);\n\t\tprocess.exit(1);\n\t}\n\n\t// Remove symlinks from all agents\n\tconst skillName = getGitHubSkillName(parsed);\n\tawait removeAgentSymlinks(skillName, {\n\t\tagents,\n\t\tprojectRoot: process.cwd(),\n\t\tagentConfigs,\n\t});\n\n\t// Remove from disk\n\tconst skillsDir = getSkillsDir();\n\tconst destPath = getGitHubSkillPath(parsed.owner, parsed.repo, parsed.path);\n\tconst destDir = join(skillsDir, \"..\", destPath);\n\n\ttry {\n\t\tawait rm(destDir, { recursive: true, force: true });\n\t} catch {\n\t\t// Ignore errors if directory doesn't exist\n\t}\n\n\tconsole.log(`Removed ${lockfileKey}`);\n}\n\n/**\n * Remove a skill by short name (searches both registry and GitHub skills).\n */\nasync function removeByShortName(\n\tshortName: string,\n\tagents: string[],\n\tagentConfigs?: Record<string, { skillsDir: string }>,\n): Promise<void> {\n\t// First try to find in registry skills\n\tconst registrySkills = await listLockfileSkills();\n\tconst foundRegistry = registrySkills.find((s) => {\n\t\tconst match = s.name.match(/^@user\\/([^/]+)\\/([^/]+)$/);\n\t\treturn match && match[2] === shortName;\n\t});\n\n\tif (foundRegistry) {\n\t\tawait removeRegistry(foundRegistry.name, agents, agentConfigs);\n\t\treturn;\n\t}\n\n\t// Try to find in GitHub skills\n\tconst githubSkills = await listLockfileGitHubPackages();\n\tconst foundGitHub = githubSkills.find((s) => {\n\t\tconst parsed = parseGitHubSpecifier(s.specifier);\n\t\tif (!parsed) return false;\n\t\treturn getGitHubSkillName(parsed) === shortName;\n\t});\n\n\tif (foundGitHub) {\n\t\tawait removeGitHub(foundGitHub.specifier, agents, agentConfigs);\n\t\treturn;\n\t}\n\n\tconsole.error(`Error: Skill \"${shortName}\" not found in lockfile`);\n\tprocess.exit(1);\n}\n","import { parseSkillSpecifier } from \"@repo/pspm-types\";\nimport { configure, deleteSkill, deleteSkillVersion } from \"../api-client.js\";\nimport { getRegistryUrl, requireApiKey } from \"../config.js\";\nimport { extractApiErrorMessage } from \"../errors.js\";\n\nexport interface UnpublishOptions {\n\tforce?: boolean;\n}\n\nexport async function unpublish(\n\tspecifier: string,\n\toptions: UnpublishOptions,\n): Promise<void> {\n\ttry {\n\t\tconst apiKey = await requireApiKey();\n\t\tconst registryUrl = await getRegistryUrl();\n\n\t\t// Parse the specifier\n\t\tconst parsed = parseSkillSpecifier(specifier);\n\t\tif (!parsed) {\n\t\t\tconsole.error(\n\t\t\t\t`Error: Invalid skill specifier \"${specifier}\". Use format: @user/{username}/{name}[@{version}]`,\n\t\t\t);\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\tconst { username, name, versionRange } = parsed;\n\n\t\t// Configure SDK (use direct REST endpoints, not oRPC)\n\t\tconfigure({ registryUrl, apiKey });\n\n\t\tif (versionRange) {\n\t\t\t// Delete specific version\n\t\t\tconsole.log(`Unpublishing ${specifier}...`);\n\n\t\t\tif (!options.force) {\n\t\t\t\tconsole.error(\n\t\t\t\t\t\"Warning: This action is irreversible. Use --force to confirm.\",\n\t\t\t\t);\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\n\t\t\tconst response = await deleteSkillVersion(name, versionRange);\n\t\t\tif (response.status !== 200) {\n\t\t\t\tconst errorMessage = extractApiErrorMessage(\n\t\t\t\t\tresponse,\n\t\t\t\t\t\"Failed to unpublish. Version may not exist.\",\n\t\t\t\t);\n\t\t\t\tconsole.error(`Error: ${errorMessage}`);\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\t\t\tconsole.log(`Unpublished @user/${username}/${name}@${versionRange}`);\n\t\t} else {\n\t\t\t// Delete entire skill\n\t\t\tconsole.log(`Unpublishing all versions of @user/${username}/${name}...`);\n\n\t\t\tif (!options.force) {\n\t\t\t\tconsole.error(\n\t\t\t\t\t\"Warning: This will delete ALL versions. Use --force to confirm.\",\n\t\t\t\t);\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\n\t\t\tconst response = await deleteSkill(name);\n\t\t\tif (response.status !== 200) {\n\t\t\t\tconst errorMessage = extractApiErrorMessage(\n\t\t\t\t\tresponse,\n\t\t\t\t\t\"Failed to unpublish. Skill may not exist.\",\n\t\t\t\t);\n\t\t\t\tconsole.error(`Error: ${errorMessage}`);\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\t\t\tconsole.log(`Unpublished @user/${username}/${name} (all versions)`);\n\t\t}\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : \"Unknown error\";\n\t\tconsole.error(`Error: ${message}`);\n\t\tprocess.exit(1);\n\t}\n}\n","import { resolveVersion } from \"@repo/pspm-types\";\nimport { configure, listSkillVersions } from \"../api-client.js\";\nimport { getRegistryUrl, requireApiKey } from \"../config.js\";\nimport { extractApiErrorMessage } from \"../errors.js\";\nimport { listLockfileSkills } from \"../lockfile.js\";\nimport { add } from \"./add.js\";\n\nexport interface UpdateOptions {\n\tdryRun?: boolean;\n}\n\nexport async function update(options: UpdateOptions): Promise<void> {\n\ttry {\n\t\tconst apiKey = await requireApiKey();\n\t\tconst registryUrl = await getRegistryUrl();\n\n\t\tconst skills = await listLockfileSkills();\n\n\t\tif (skills.length === 0) {\n\t\t\tconsole.log(\"No skills installed.\");\n\t\t\treturn;\n\t\t}\n\n\t\t// Configure SDK (use direct REST endpoints, not oRPC)\n\t\tconfigure({ registryUrl, apiKey });\n\n\t\tconst updates: Array<{\n\t\t\tname: string;\n\t\t\tcurrent: string;\n\t\t\tlatest: string;\n\t\t}> = [];\n\n\t\tconsole.log(\"Checking for updates...\\n\");\n\n\t\tfor (const { name, entry } of skills) {\n\t\t\tconst match = name.match(/^@user\\/([^/]+)\\/([^/]+)$/);\n\t\t\tif (!match) continue;\n\n\t\t\tconst [, username, skillName] = match;\n\n\t\t\ttry {\n\t\t\t\tconst versionsResponse = await listSkillVersions(username, skillName);\n\t\t\t\tif (versionsResponse.status !== 200) {\n\t\t\t\t\tconst errorMessage = extractApiErrorMessage(\n\t\t\t\t\t\tversionsResponse,\n\t\t\t\t\t\t\"Failed to fetch versions\",\n\t\t\t\t\t);\n\t\t\t\t\tconsole.warn(` Warning: ${name}: ${errorMessage}`);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconst versions = versionsResponse.data;\n\t\t\t\tif (versions.length === 0) continue;\n\n\t\t\t\tconst versionStrings = versions.map(\n\t\t\t\t\t(v: { version: string }) => v.version,\n\t\t\t\t);\n\t\t\t\tconst latest = resolveVersion(\"*\", versionStrings);\n\n\t\t\t\tif (latest && latest !== entry.version) {\n\t\t\t\t\tupdates.push({\n\t\t\t\t\t\tname,\n\t\t\t\t\t\tcurrent: entry.version,\n\t\t\t\t\t\tlatest,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\tconsole.warn(` Warning: Could not check updates for ${name}`);\n\t\t\t}\n\t\t}\n\n\t\tif (updates.length === 0) {\n\t\t\tconsole.log(\"All skills are up to date.\");\n\t\t\treturn;\n\t\t}\n\n\t\tconsole.log(\"Updates available:\\n\");\n\t\tfor (const { name, current, latest } of updates) {\n\t\t\tconsole.log(` ${name}: ${current} -> ${latest}`);\n\t\t}\n\n\t\tif (options.dryRun) {\n\t\t\tconsole.log(\"\\nDry run - no changes made.\");\n\t\t\treturn;\n\t\t}\n\n\t\tconsole.log(\"\\nUpdating...\\n\");\n\n\t\tfor (const { name, latest } of updates) {\n\t\t\tconst match = name.match(/^@user\\/([^/]+)\\/([^/]+)$/);\n\t\t\tif (!match) continue;\n\n\t\t\tconst [, username, skillName] = match;\n\t\t\tconst specifier = `@user/${username}/${skillName}@${latest}`;\n\n\t\t\tawait add([specifier], {});\n\t\t}\n\n\t\tconsole.log(\"\\nAll skills updated.\");\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : \"Unknown error\";\n\t\tconsole.error(`Error: ${message}`);\n\t\tprocess.exit(1);\n\t}\n}\n","import { whoamiRequest } from \"../api-client.js\";\nimport { getRegistryUrl, requireApiKey, resolveConfig } from \"../config.js\";\n\nexport async function whoami(): Promise<void> {\n\ttry {\n\t\tconst resolved = await resolveConfig();\n\t\tconst apiKey = await requireApiKey();\n\t\tconst registryUrl = await getRegistryUrl();\n\n\t\tconst user = await whoamiRequest(registryUrl, apiKey);\n\n\t\tif (user) {\n\t\t\tconsole.log(`Username: ${user.username}`);\n\t\t\tconsole.log(`User ID: ${user.userId}`);\n\t\t\tconsole.log(`Registry: ${registryUrl}`);\n\t\t} else if (resolved.username) {\n\t\t\t// Use cached username if API call fails\n\t\t\tconsole.log(`Username: ${resolved.username} (cached)`);\n\t\t\tconsole.log(`Registry: ${registryUrl}`);\n\t\t} else {\n\t\t\tconsole.error(\"Could not determine current user.\");\n\t\t\tprocess.exit(1);\n\t\t}\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : \"Unknown error\";\n\t\tconsole.error(`Error: ${message}`);\n\t\tprocess.exit(1);\n\t}\n}\n","#!/usr/bin/env node\n\nimport { readFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { Command } from \"commander\";\nimport {\n\taccess,\n\tadd,\n\tconfigInit,\n\tconfigShow,\n\tdeprecate,\n\tinit,\n\tinstall,\n\tlink,\n\tlist,\n\tlogin,\n\tlogout,\n\tmigrate,\n\tpublish,\n\tremove,\n\tunpublish,\n\tupdate,\n\twhoami,\n} from \"./commands/index.js\";\n\n// Read version from package.json\nconst __dirname = dirname(fileURLToPath(import.meta.url));\nconst packageJson = JSON.parse(\n\treadFileSync(join(__dirname, \"..\", \"package.json\"), \"utf-8\"),\n);\nconst version: string = packageJson.version;\n\nconst program = new Command();\n\nprogram\n\t.name(\"pspm\")\n\t.description(\"Prompt Skill Package Manager for AnyT\")\n\t.version(version);\n\n// =============================================================================\n// Config commands\n// =============================================================================\n\nconst configCmd = program\n\t.command(\"config\")\n\t.description(\"Manage PSPM configuration\");\n\nconfigCmd\n\t.command(\"show\")\n\t.description(\"Show resolved configuration\")\n\t.action(async () => {\n\t\tawait configShow();\n\t});\n\nconfigCmd\n\t.command(\"init\")\n\t.description(\"Create a .pspmrc file in the current directory\")\n\t.option(\"--registry <url>\", \"Registry URL override\")\n\t.action(async (options) => {\n\t\tawait configInit({\n\t\t\tregistry: options.registry,\n\t\t});\n\t});\n\n// =============================================================================\n// Authentication commands\n// =============================================================================\n\nprogram\n\t.command(\"login\")\n\t.description(\"Log in via browser or with an API key\")\n\t.option(\n\t\t\"--api-key <key>\",\n\t\t\"API key for direct authentication (skips browser)\",\n\t)\n\t.action(async (options) => {\n\t\tawait login({ apiKey: options.apiKey });\n\t});\n\nprogram\n\t.command(\"logout\")\n\t.description(\"Log out and clear stored credentials\")\n\t.action(async () => {\n\t\tawait logout();\n\t});\n\nprogram\n\t.command(\"whoami\")\n\t.description(\"Show current user information\")\n\t.action(async () => {\n\t\tawait whoami();\n\t});\n\n// =============================================================================\n// Project initialization commands\n// =============================================================================\n\nprogram\n\t.command(\"init\")\n\t.description(\"Create a new pspm.json manifest in the current directory\")\n\t.option(\"-n, --name <name>\", \"Skill name\")\n\t.option(\"-d, --description <desc>\", \"Skill description\")\n\t.option(\"-a, --author <author>\", \"Author name\")\n\t.option(\"-y, --yes\", \"Skip prompts and use defaults\")\n\t.option(\"-f, --force\", \"Overwrite existing pspm.json\")\n\t.action(async (options) => {\n\t\tawait init({\n\t\t\tname: options.name,\n\t\t\tdescription: options.description,\n\t\t\tauthor: options.author,\n\t\t\tyes: options.yes,\n\t\t\tforce: options.force,\n\t\t});\n\t});\n\nprogram\n\t.command(\"migrate\")\n\t.description(\n\t\t\"Migrate from old directory structure (.skills/, skill-lock.json)\",\n\t)\n\t.option(\"--dry-run\", \"Show what would be migrated without making changes\")\n\t.action(async (options) => {\n\t\tawait migrate({ dryRun: options.dryRun });\n\t});\n\n// =============================================================================\n// Skill management commands\n// =============================================================================\n\nprogram\n\t.command(\"add <specifiers...>\")\n\t.description(\n\t\t\"Add one or more skills (e.g., @user/bsheng/vite_slides@^2.0.0 or github:owner/repo/path@ref)\",\n\t)\n\t.option(\"--save\", \"Save to lockfile (default)\")\n\t.option(\n\t\t\"--agent <agents>\",\n\t\t'Comma-separated agents for symlinks (default: all agents, use \"none\" to skip)',\n\t)\n\t.option(\"-y, --yes\", \"Skip agent selection prompt and use defaults\")\n\t.action(async (specifiers, options) => {\n\t\tawait add(specifiers, {\n\t\t\tsave: options.save ?? true,\n\t\t\tagent: options.agent,\n\t\t\tyes: options.yes,\n\t\t});\n\t});\n\nprogram\n\t.command(\"remove <name>\")\n\t.alias(\"rm\")\n\t.description(\"Remove an installed skill\")\n\t.action(async (name) => {\n\t\tawait remove(name);\n\t});\n\nprogram\n\t.command(\"list\")\n\t.alias(\"ls\")\n\t.description(\"List installed skills\")\n\t.option(\"--json\", \"Output as JSON\")\n\t.action(async (options) => {\n\t\tawait list({ json: options.json });\n\t});\n\nprogram\n\t.command(\"install [specifiers...]\")\n\t.alias(\"i\")\n\t.description(\n\t\t\"Install skills from lockfile, or add and install specific packages\",\n\t)\n\t.option(\"--frozen-lockfile\", \"Fail if lockfile is missing or outdated\")\n\t.option(\"--dir <path>\", \"Install skills to a specific directory\")\n\t.option(\n\t\t\"--agent <agents>\",\n\t\t'Comma-separated agents for symlinks (default: all agents, use \"none\" to skip)',\n\t)\n\t.option(\"-y, --yes\", \"Skip agent selection prompt and use defaults\")\n\t.action(async (specifiers, options) => {\n\t\tawait install(specifiers, {\n\t\t\tfrozenLockfile: options.frozenLockfile,\n\t\t\tdir: options.dir,\n\t\t\tagent: options.agent,\n\t\t\tyes: options.yes,\n\t\t});\n\t});\n\nprogram\n\t.command(\"link\")\n\t.description(\"Recreate agent symlinks without reinstalling\")\n\t.option(\n\t\t\"--agent <agents>\",\n\t\t'Comma-separated agents for symlinks (default: all agents, use \"none\" to skip)',\n\t)\n\t.option(\"-y, --yes\", \"Skip agent selection prompt and use defaults\")\n\t.action(async (options) => {\n\t\tawait link({ agent: options.agent, yes: options.yes });\n\t});\n\nprogram\n\t.command(\"update\")\n\t.description(\"Update all skills to latest compatible versions\")\n\t.option(\"--dry-run\", \"Show what would be updated without making changes\")\n\t.action(async (options) => {\n\t\tawait update({ dryRun: options.dryRun });\n\t});\n\n// =============================================================================\n// Publishing commands\n// =============================================================================\n\nprogram\n\t.command(\"publish\")\n\t.description(\"Publish current directory as a skill\")\n\t.option(\"--bump <level>\", \"Bump version (major, minor, patch)\")\n\t.option(\"--tag <tag>\", \"Tag for the release\")\n\t.option(\"--access <level>\", \"Set package visibility (public or private)\")\n\t.action(async (options) => {\n\t\tawait publish({\n\t\t\tbump: options.bump as \"major\" | \"minor\" | \"patch\" | undefined,\n\t\t\ttag: options.tag,\n\t\t\taccess: options.access as \"public\" | \"private\" | undefined,\n\t\t});\n\t});\n\nprogram\n\t.command(\"unpublish <specifier>\")\n\t.description(\n\t\t\"Remove a published skill version (only within 72 hours of publishing)\",\n\t)\n\t.option(\"--force\", \"Confirm destructive action\")\n\t.action(async (specifier, options) => {\n\t\tawait unpublish(specifier, { force: options.force });\n\t});\n\nprogram\n\t.command(\"access [specifier]\")\n\t.description(\"Change package visibility (public/private)\")\n\t.option(\"--public\", \"Make the package public (irreversible)\")\n\t.option(\"--private\", \"Make the package private (only for private packages)\")\n\t.action(async (specifier, options) => {\n\t\tawait access(specifier, {\n\t\t\tpublic: options.public,\n\t\t\tprivate: options.private,\n\t\t});\n\t});\n\nprogram\n\t.command(\"deprecate <specifier> [message]\")\n\t.description(\n\t\t\"Mark a skill version as deprecated (alternative to unpublish after 72 hours)\",\n\t)\n\t.option(\"--undo\", \"Remove deprecation status\")\n\t.action(async (specifier, message, options) => {\n\t\tawait deprecate(specifier, message, { undo: options.undo });\n\t});\n\nprogram.parse();\n"]}
1
+ {"version":3,"sources":["../src/sdk/fetcher.ts","../src/sdk/generated/index.ts","../src/api-client.ts","../src/errors.ts","../src/config.ts","../src/lib/integrity.ts","../src/lib/manifest.ts","../src/lib/specifier.ts","../src/lib/version.ts","../src/lib/index.ts","../src/agents.ts","../src/github.ts","../src/lockfile.ts","../src/manifest.ts","../src/symlinks.ts","../src/commands/add.ts","../src/index.ts","../src/commands/access.ts","../src/commands/index.ts","../src/commands/config/init.ts","../src/commands/config/show.ts","../src/commands/deprecate.ts","../src/commands/init.ts","../src/commands/install.ts","../src/commands/link.ts","../src/commands/list.ts","../src/commands/login.ts","../src/commands/logout.ts","../src/commands/migrate.ts","../src/commands/publish.ts","../src/commands/remove.ts","../src/commands/unpublish.ts","../src/commands/update.ts","../src/commands/whoami.ts"],"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.0.2 🍺\n * Do not edit manually.\n * PSPM API\n * Backend API for PSPM - Private Skill Package Manager for Claude Code\n * OpenAPI spec version: 1.0.0\n */\nimport { customFetch } from \"../fetcher\";\n/**\n * API key record (without the key value)\n */\nexport interface ApiKey {\n\tid: string;\n\tname: string;\n\tkeyPrefix: string;\n\tuserId: string;\n\texpiresAt: string | null;\n\tlastUsedAt: string | null;\n\tcreatedAt: string | null;\n}\n\nexport type ApiKeyListResponse = ApiKey[];\n\nexport type Item = {\n\tpath: (string | number)[];\n\tmessage: string;\n};\n\nexport type ApiErrorCode = (typeof ApiErrorCode)[keyof typeof ApiErrorCode];\n\nexport const ApiErrorCode = {\n\tBAD_REQUEST: \"BAD_REQUEST\",\n\tUNAUTHORIZED: \"UNAUTHORIZED\",\n\tFORBIDDEN: \"FORBIDDEN\",\n\tNOT_FOUND: \"NOT_FOUND\",\n\tCONFLICT: \"CONFLICT\",\n\tVALIDATION_ERROR: \"VALIDATION_ERROR\",\n\tINTERNAL_ERROR: \"INTERNAL_ERROR\",\n} as const;\n\nexport type ApiErrorDetails = { [key: string]: unknown | null };\n\nexport interface ApiError {\n\tcode: ApiErrorCode;\n\tmessage: string;\n\tdetails?: ApiErrorDetails;\n\trequestId?: string;\n\ttimestamp: string;\n}\n\nexport type ValidationError = ApiError & {\n\tcode?: \"VALIDATION_ERROR\";\n\tdetails: {\n\t\tissues: Item[];\n\t};\n};\n\n/**\n * Created API key with the plain key (only shown once)\n */\nexport interface CreateApiKeyResponse {\n\tapiKey: ApiKey;\n\tplainKey: string;\n}\n\n/**\n * Input for creating a new API key\n */\nexport interface CreateApiKeyInput {\n\t/**\n\t * @minLength 1\n\t * @maxLength 100\n\t */\n\tname: string;\n\texpiresAt?: string | null;\n}\n\nexport interface SuccessResponse {\n\tsuccess: boolean;\n}\n\nexport interface DeleteApiKeyInput {\n\tid: string;\n}\n\nexport interface UpdateApiKeyInput {\n\tid: string;\n\t/**\n\t * @minLength 1\n\t * @maxLength 100\n\t */\n\tname: string;\n}\n\nexport interface CreateCliTokenResponse {\n\ttoken: string;\n}\n\nexport interface CreateCliTokenInput {\n\t/** @minLength 1 */\n\tstate: string;\n\t/** @minLength 1 */\n\tport: string;\n}\n\nexport interface ExchangeCliTokenResponse {\n\tapiKey: string;\n\tusername: string;\n}\n\nexport interface ExchangeCliTokenInput {\n\t/** @minLength 1 */\n\ttoken: string;\n}\n\n/**\n * User's username information. Username is immutable once set.\n */\nexport interface UsernameInfo {\n\tusername: string | null;\n\tisSet: boolean;\n}\n\nexport interface CheckUsernameOutput {\n\tavailable: boolean;\n\terror: string | null;\n}\n\nexport interface UpdateUsernameOutput {\n\tsuccess: boolean;\n\tusername: string | null;\n\terror: string | null;\n}\n\nexport interface UpdateUsernameInput {\n\t/**\n\t * @minLength 3\n\t * @maxLength 39\n\t */\n\tusername: string;\n}\n\nexport interface GetSuggestionsOutput {\n\tsuggestions: string[];\n}\n\n/**\n * Current user info\n */\nexport type MeResponseData = {\n\tuserId: string;\n\tusername: string;\n} | null;\n\n/**\n * Package visibility (private or public)\n */\nexport type Visibility = (typeof Visibility)[keyof typeof Visibility];\n\nexport const Visibility = {\n\tprivate: \"private\",\n\tpublic: \"public\",\n} as const;\n\n/**\n * Skill metadata\n */\nexport interface Skill {\n\tid: string;\n\tname: string;\n\tuserId: string;\n\tdescription: string | null;\n\tcreatedAt: string | null;\n\tupdatedAt: string | null;\n\tvisibility: Visibility;\n}\n\n/**\n * Skill metadata with owner username\n */\nexport type SkillWithUser = Skill & {\n\tusername: string;\n};\n\n/**\n * List of skills\n */\nexport type SkillListResponse = SkillWithUser[];\n\n/**\n * User's username\n * @minLength 1\n * @maxLength 50\n * @pattern ^[a-zA-Z0-9_-]+$\n */\nexport type Username = string;\n\n/**\n * Skill name identifier\n * @minLength 1\n * @maxLength 100\n * @pattern ^[a-z][a-z0-9-]*$\n */\nexport type SkillName = string;\n\n/**\n * Semantic version string (e.g., 1.0.0)\n */\nexport type Semver = string;\n\nexport type PspmMetadataType =\n\t(typeof PspmMetadataType)[keyof typeof PspmMetadataType];\n\nexport const PspmMetadataType = {\n\tskill: \"skill\",\n} as const;\n\nexport type PspmMetadataRequirements = {\n\tclaude?: string;\n\tnode?: string;\n};\n\n/**\n * PSPM-specific metadata for the skill package\n */\nexport interface PspmMetadata {\n\ttype: PspmMetadataType;\n\tcapabilities?: string[];\n\trequirements?: PspmMetadataRequirements;\n}\n\n/**\n * Skill package manifest (package.json)\n */\nexport interface SkillManifest {\n\tname: SkillName;\n\tversion: Semver;\n\t/** @maxLength 500 */\n\tdescription?: string;\n\tfiles?: string[];\n\tpspm?: PspmMetadata;\n}\n\n/**\n * Skill version metadata\n */\nexport interface SkillVersion {\n\tid: string;\n\tskillId: string;\n\tversion: string;\n\tr2Key: string;\n\tchecksum: string;\n\tmanifest: SkillManifest;\n\tpublishedAt: string | null;\n\tdeprecatedAt?: string | null;\n\tdeprecationMessage?: string | null;\n}\n\n/**\n * Skill version metadata with download URL\n */\nexport type SkillVersionWithDownload =\n\t| (SkillVersion & {\n\t\t\tdownloadUrl: string;\n\t })\n\t| null;\n\n/**\n * Published skill with version info\n */\nexport interface PublishSkillResponse {\n\tskill: SkillWithUser;\n\tversion: SkillVersion;\n}\n\n/**\n * Input for publishing a skill\n */\nexport interface PublishSkillInput {\n\tmanifest: SkillManifest;\n\t/** @maxLength 73400320 */\n\ttarballBase64: string;\n}\n\n/**\n * Input for deprecating a skill version\n */\nexport interface DeprecateVersionInput {\n\t/**\n\t * @minLength 1\n\t * @maxLength 500\n\t */\n\tmessage: string;\n}\n\n/**\n * Updated skill after changing visibility\n */\nexport type ChangeAccessResponse = Skill & {\n\tusername: string;\n};\n\n/**\n * Input for changing package visibility\n */\nexport interface ChangeAccessInput {\n\tvisibility: Visibility;\n}\n\nexport type CapturedErrorSource =\n\t(typeof CapturedErrorSource)[keyof typeof CapturedErrorSource];\n\nexport const CapturedErrorSource = {\n\thydration: \"hydration\",\n\tloader: \"loader\",\n\taction: \"action\",\n\trender: \"render\",\n\tstreaming: \"streaming\",\n\tnetwork: \"network\",\n\tglobal: \"global\",\n\tunknown: \"unknown\",\n} as const;\n\nexport type CapturedErrorSeverity =\n\t(typeof CapturedErrorSeverity)[keyof typeof CapturedErrorSeverity];\n\nexport const CapturedErrorSeverity = {\n\tfatal: \"fatal\",\n\terror: \"error\",\n\twarning: \"warning\",\n\tinfo: \"info\",\n} as const;\n\nexport type CapturedErrorContext = { [key: string]: unknown | null };\n\n/**\n * A captured client error\n */\nexport interface CapturedError {\n\tid: string;\n\tmessage: string;\n\tstack?: string;\n\tcomponentStack?: string;\n\tsource: CapturedErrorSource;\n\tseverity: CapturedErrorSeverity;\n\troute?: string;\n\ttimestamp: number;\n\tcontext?: CapturedErrorContext;\n\tdigest?: string;\n}\n\n/**\n * Payload for reporting client errors\n */\nexport interface ErrorReportPayload {\n\terrors: CapturedError[];\n\tuserAgent: string;\n\turl: string;\n\ttimestamp: number;\n}\n\nexport type CheckUsernameAvailabilityParams = {\n\t/**\n\t * @minLength 3\n\t * @maxLength 39\n\t */\n\tusername: string;\n};\n\n/**\n * Retrieve all API keys for the authenticated user\n * @summary List all API keys\n */\nexport type listApiKeysResponse200 = {\n\tdata: ApiKeyListResponse;\n\tstatus: 200;\n};\n\nexport type listApiKeysResponse400 = {\n\tdata: ValidationError;\n\tstatus: 400;\n};\n\nexport type listApiKeysResponse401 = {\n\tdata: ApiError;\n\tstatus: 401;\n};\n\nexport type listApiKeysResponse403 = {\n\tdata: ApiError;\n\tstatus: 403;\n};\n\nexport type listApiKeysResponse404 = {\n\tdata: ApiError;\n\tstatus: 404;\n};\n\nexport type listApiKeysResponse500 = {\n\tdata: ApiError;\n\tstatus: 500;\n};\n\nexport type listApiKeysResponseSuccess = listApiKeysResponse200 & {\n\theaders: Headers;\n};\nexport type listApiKeysResponseError = (\n\t| listApiKeysResponse400\n\t| listApiKeysResponse401\n\t| listApiKeysResponse403\n\t| listApiKeysResponse404\n\t| listApiKeysResponse500\n) & {\n\theaders: Headers;\n};\n\nexport type listApiKeysResponse =\n\t| listApiKeysResponseSuccess\n\t| listApiKeysResponseError;\n\nexport const getListApiKeysUrl = () => {\n\treturn \"/api/api-keys/api-keys\";\n};\n\nexport const listApiKeys = async (\n\toptions?: RequestInit,\n): Promise<listApiKeysResponse> => {\n\treturn customFetch<listApiKeysResponse>(getListApiKeysUrl(), {\n\t\t...options,\n\t\tmethod: \"GET\",\n\t});\n};\n\n/**\n * Create a new API key with optional expiration\n * @summary Create a new API key\n */\nexport type createApiKeyResponse200 = {\n\tdata: CreateApiKeyResponse;\n\tstatus: 200;\n};\n\nexport type createApiKeyResponse400 = {\n\tdata: ValidationError;\n\tstatus: 400;\n};\n\nexport type createApiKeyResponse401 = {\n\tdata: ApiError;\n\tstatus: 401;\n};\n\nexport type createApiKeyResponse403 = {\n\tdata: ApiError;\n\tstatus: 403;\n};\n\nexport type createApiKeyResponse404 = {\n\tdata: ApiError;\n\tstatus: 404;\n};\n\nexport type createApiKeyResponse500 = {\n\tdata: ApiError;\n\tstatus: 500;\n};\n\nexport type createApiKeyResponseSuccess = createApiKeyResponse200 & {\n\theaders: Headers;\n};\nexport type createApiKeyResponseError = (\n\t| createApiKeyResponse400\n\t| createApiKeyResponse401\n\t| createApiKeyResponse403\n\t| createApiKeyResponse404\n\t| createApiKeyResponse500\n) & {\n\theaders: Headers;\n};\n\nexport type createApiKeyResponse =\n\t| createApiKeyResponseSuccess\n\t| createApiKeyResponseError;\n\nexport const getCreateApiKeyUrl = () => {\n\treturn \"/api/api-keys/api-keys\";\n};\n\nexport const createApiKey = async (\n\tcreateApiKeyInput: CreateApiKeyInput,\n\toptions?: RequestInit,\n): Promise<createApiKeyResponse> => {\n\treturn customFetch<createApiKeyResponse>(getCreateApiKeyUrl(), {\n\t\t...options,\n\t\tmethod: \"POST\",\n\t\theaders: { \"Content-Type\": \"application/json\", ...options?.headers },\n\t\tbody: JSON.stringify(createApiKeyInput),\n\t});\n};\n\n/**\n * Revoke and delete an API key\n * @summary Delete an API key\n */\nexport type deleteApiKeyResponse200 = {\n\tdata: SuccessResponse;\n\tstatus: 200;\n};\n\nexport type deleteApiKeyResponse400 = {\n\tdata: ValidationError;\n\tstatus: 400;\n};\n\nexport type deleteApiKeyResponse401 = {\n\tdata: ApiError;\n\tstatus: 401;\n};\n\nexport type deleteApiKeyResponse403 = {\n\tdata: ApiError;\n\tstatus: 403;\n};\n\nexport type deleteApiKeyResponse404 = {\n\tdata: ApiError;\n\tstatus: 404;\n};\n\nexport type deleteApiKeyResponse500 = {\n\tdata: ApiError;\n\tstatus: 500;\n};\n\nexport type deleteApiKeyResponseSuccess = deleteApiKeyResponse200 & {\n\theaders: Headers;\n};\nexport type deleteApiKeyResponseError = (\n\t| deleteApiKeyResponse400\n\t| deleteApiKeyResponse401\n\t| deleteApiKeyResponse403\n\t| deleteApiKeyResponse404\n\t| deleteApiKeyResponse500\n) & {\n\theaders: Headers;\n};\n\nexport type deleteApiKeyResponse =\n\t| deleteApiKeyResponseSuccess\n\t| deleteApiKeyResponseError;\n\nexport const getDeleteApiKeyUrl = () => {\n\treturn \"/api/api-keys/api-keys\";\n};\n\nexport const deleteApiKey = async (\n\tdeleteApiKeyInput: DeleteApiKeyInput,\n\toptions?: RequestInit,\n): Promise<deleteApiKeyResponse> => {\n\treturn customFetch<deleteApiKeyResponse>(getDeleteApiKeyUrl(), {\n\t\t...options,\n\t\tmethod: \"DELETE\",\n\t\theaders: { \"Content-Type\": \"application/json\", ...options?.headers },\n\t\tbody: JSON.stringify(deleteApiKeyInput),\n\t});\n};\n\n/**\n * Update the name/description of an API key\n * @summary Update API key name\n */\nexport type updateApiKeyNameResponse200 = {\n\tdata: ApiKey;\n\tstatus: 200;\n};\n\nexport type updateApiKeyNameResponse400 = {\n\tdata: ValidationError;\n\tstatus: 400;\n};\n\nexport type updateApiKeyNameResponse401 = {\n\tdata: ApiError;\n\tstatus: 401;\n};\n\nexport type updateApiKeyNameResponse403 = {\n\tdata: ApiError;\n\tstatus: 403;\n};\n\nexport type updateApiKeyNameResponse404 = {\n\tdata: ApiError;\n\tstatus: 404;\n};\n\nexport type updateApiKeyNameResponse500 = {\n\tdata: ApiError;\n\tstatus: 500;\n};\n\nexport type updateApiKeyNameResponseSuccess = updateApiKeyNameResponse200 & {\n\theaders: Headers;\n};\nexport type updateApiKeyNameResponseError = (\n\t| updateApiKeyNameResponse400\n\t| updateApiKeyNameResponse401\n\t| updateApiKeyNameResponse403\n\t| updateApiKeyNameResponse404\n\t| updateApiKeyNameResponse500\n) & {\n\theaders: Headers;\n};\n\nexport type updateApiKeyNameResponse =\n\t| updateApiKeyNameResponseSuccess\n\t| updateApiKeyNameResponseError;\n\nexport const getUpdateApiKeyNameUrl = () => {\n\treturn \"/api/api-keys/api-keys\";\n};\n\nexport const updateApiKeyName = async (\n\tupdateApiKeyInput: UpdateApiKeyInput,\n\toptions?: RequestInit,\n): Promise<updateApiKeyNameResponse> => {\n\treturn customFetch<updateApiKeyNameResponse>(getUpdateApiKeyNameUrl(), {\n\t\t...options,\n\t\tmethod: \"PUT\",\n\t\theaders: { \"Content-Type\": \"application/json\", ...options?.headers },\n\t\tbody: JSON.stringify(updateApiKeyInput),\n\t});\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\tdata: CreateCliTokenResponse;\n\tstatus: 200;\n};\n\nexport type createCliTokenResponse400 = {\n\tdata: ValidationError;\n\tstatus: 400;\n};\n\nexport type createCliTokenResponse401 = {\n\tdata: ApiError;\n\tstatus: 401;\n};\n\nexport type createCliTokenResponse403 = {\n\tdata: ApiError;\n\tstatus: 403;\n};\n\nexport type createCliTokenResponse404 = {\n\tdata: ApiError;\n\tstatus: 404;\n};\n\nexport type createCliTokenResponse500 = {\n\tdata: ApiError;\n\tstatus: 500;\n};\n\nexport type createCliTokenResponseSuccess = createCliTokenResponse200 & {\n\theaders: Headers;\n};\nexport type createCliTokenResponseError = (\n\t| createCliTokenResponse400\n\t| createCliTokenResponse401\n\t| createCliTokenResponse403\n\t| createCliTokenResponse404\n\t| createCliTokenResponse500\n) & {\n\theaders: Headers;\n};\n\nexport type createCliTokenResponse =\n\t| createCliTokenResponseSuccess\n\t| createCliTokenResponseError;\n\nexport const getCreateCliTokenUrl = () => {\n\treturn \"/api/api-keys/cli-token\";\n};\n\nexport const createCliToken = async (\n\tcreateCliTokenInput: CreateCliTokenInput,\n\toptions?: RequestInit,\n): Promise<createCliTokenResponse> => {\n\treturn customFetch<createCliTokenResponse>(getCreateCliTokenUrl(), {\n\t\t...options,\n\t\tmethod: \"POST\",\n\t\theaders: { \"Content-Type\": \"application/json\", ...options?.headers },\n\t\tbody: JSON.stringify(createCliTokenInput),\n\t});\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\tdata: ExchangeCliTokenResponse;\n\tstatus: 200;\n};\n\nexport type exchangeCliTokenResponse400 = {\n\tdata: ValidationError;\n\tstatus: 400;\n};\n\nexport type exchangeCliTokenResponse401 = {\n\tdata: ApiError;\n\tstatus: 401;\n};\n\nexport type exchangeCliTokenResponse403 = {\n\tdata: ApiError;\n\tstatus: 403;\n};\n\nexport type exchangeCliTokenResponse404 = {\n\tdata: ApiError;\n\tstatus: 404;\n};\n\nexport type exchangeCliTokenResponse500 = {\n\tdata: ApiError;\n\tstatus: 500;\n};\n\nexport type exchangeCliTokenResponseSuccess = exchangeCliTokenResponse200 & {\n\theaders: Headers;\n};\nexport type exchangeCliTokenResponseError = (\n\t| exchangeCliTokenResponse400\n\t| exchangeCliTokenResponse401\n\t| exchangeCliTokenResponse403\n\t| exchangeCliTokenResponse404\n\t| exchangeCliTokenResponse500\n) & {\n\theaders: Headers;\n};\n\nexport type exchangeCliTokenResponse =\n\t| exchangeCliTokenResponseSuccess\n\t| exchangeCliTokenResponseError;\n\nexport const getExchangeCliTokenUrl = () => {\n\treturn \"/api/api-keys/cli-token-exchange\";\n};\n\nexport const exchangeCliToken = async (\n\texchangeCliTokenInput: ExchangeCliTokenInput,\n\toptions?: RequestInit,\n): Promise<exchangeCliTokenResponse> => {\n\treturn customFetch<exchangeCliTokenResponse>(getExchangeCliTokenUrl(), {\n\t\t...options,\n\t\tmethod: \"POST\",\n\t\theaders: { \"Content-Type\": \"application/json\", ...options?.headers },\n\t\tbody: JSON.stringify(exchangeCliTokenInput),\n\t});\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\tdata: UsernameInfo;\n\tstatus: 200;\n};\n\nexport type getUsernameInfoResponse400 = {\n\tdata: ValidationError;\n\tstatus: 400;\n};\n\nexport type getUsernameInfoResponse401 = {\n\tdata: ApiError;\n\tstatus: 401;\n};\n\nexport type getUsernameInfoResponse403 = {\n\tdata: ApiError;\n\tstatus: 403;\n};\n\nexport type getUsernameInfoResponse404 = {\n\tdata: ApiError;\n\tstatus: 404;\n};\n\nexport type getUsernameInfoResponse500 = {\n\tdata: ApiError;\n\tstatus: 500;\n};\n\nexport type getUsernameInfoResponseSuccess = getUsernameInfoResponse200 & {\n\theaders: Headers;\n};\nexport type getUsernameInfoResponseError = (\n\t| getUsernameInfoResponse400\n\t| getUsernameInfoResponse401\n\t| getUsernameInfoResponse403\n\t| getUsernameInfoResponse404\n\t| getUsernameInfoResponse500\n) & {\n\theaders: Headers;\n};\n\nexport type getUsernameInfoResponse =\n\t| getUsernameInfoResponseSuccess\n\t| getUsernameInfoResponseError;\n\nexport const getGetUsernameInfoUrl = () => {\n\treturn \"/api/auth/username\";\n};\n\nexport const getUsernameInfo = async (\n\toptions?: RequestInit,\n): Promise<getUsernameInfoResponse> => {\n\treturn customFetch<getUsernameInfoResponse>(getGetUsernameInfoUrl(), {\n\t\t...options,\n\t\tmethod: \"GET\",\n\t});\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\tdata: UpdateUsernameOutput;\n\tstatus: 200;\n};\n\nexport type setUsernameResponse400 = {\n\tdata: ValidationError;\n\tstatus: 400;\n};\n\nexport type setUsernameResponse401 = {\n\tdata: ApiError;\n\tstatus: 401;\n};\n\nexport type setUsernameResponse403 = {\n\tdata: ApiError;\n\tstatus: 403;\n};\n\nexport type setUsernameResponse404 = {\n\tdata: ApiError;\n\tstatus: 404;\n};\n\nexport type setUsernameResponse500 = {\n\tdata: ApiError;\n\tstatus: 500;\n};\n\nexport type setUsernameResponseSuccess = setUsernameResponse200 & {\n\theaders: Headers;\n};\nexport type setUsernameResponseError = (\n\t| setUsernameResponse400\n\t| setUsernameResponse401\n\t| setUsernameResponse403\n\t| setUsernameResponse404\n\t| setUsernameResponse500\n) & {\n\theaders: Headers;\n};\n\nexport type setUsernameResponse =\n\t| setUsernameResponseSuccess\n\t| setUsernameResponseError;\n\nexport const getSetUsernameUrl = () => {\n\treturn \"/api/auth/username\";\n};\n\nexport const setUsername = async (\n\tupdateUsernameInput: UpdateUsernameInput,\n\toptions?: RequestInit,\n): Promise<setUsernameResponse> => {\n\treturn customFetch<setUsernameResponse>(getSetUsernameUrl(), {\n\t\t...options,\n\t\tmethod: \"PUT\",\n\t\theaders: { \"Content-Type\": \"application/json\", ...options?.headers },\n\t\tbody: JSON.stringify(updateUsernameInput),\n\t});\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\tdata: CheckUsernameOutput;\n\tstatus: 200;\n};\n\nexport type checkUsernameAvailabilityResponse400 = {\n\tdata: ValidationError;\n\tstatus: 400;\n};\n\nexport type checkUsernameAvailabilityResponse401 = {\n\tdata: ApiError;\n\tstatus: 401;\n};\n\nexport type checkUsernameAvailabilityResponse403 = {\n\tdata: ApiError;\n\tstatus: 403;\n};\n\nexport type checkUsernameAvailabilityResponse404 = {\n\tdata: ApiError;\n\tstatus: 404;\n};\n\nexport type checkUsernameAvailabilityResponse500 = {\n\tdata: ApiError;\n\tstatus: 500;\n};\n\nexport type checkUsernameAvailabilityResponseSuccess =\n\tcheckUsernameAvailabilityResponse200 & {\n\t\theaders: Headers;\n\t};\nexport type checkUsernameAvailabilityResponseError = (\n\t| checkUsernameAvailabilityResponse400\n\t| checkUsernameAvailabilityResponse401\n\t| checkUsernameAvailabilityResponse403\n\t| checkUsernameAvailabilityResponse404\n\t| checkUsernameAvailabilityResponse500\n) & {\n\theaders: Headers;\n};\n\nexport type checkUsernameAvailabilityResponse =\n\t| checkUsernameAvailabilityResponseSuccess\n\t| checkUsernameAvailabilityResponseError;\n\nexport const getCheckUsernameAvailabilityUrl = (\n\tparams: CheckUsernameAvailabilityParams,\n) => {\n\tconst normalizedParams = new URLSearchParams();\n\n\tObject.entries(params || {}).forEach(([key, value]) => {\n\t\tif (value !== undefined) {\n\t\t\tnormalizedParams.append(key, value === null ? \"null\" : value.toString());\n\t\t}\n\t});\n\n\tconst stringifiedParams = normalizedParams.toString();\n\n\treturn stringifiedParams.length > 0\n\t\t? `/api/auth/username/check?${stringifiedParams}`\n\t\t: \"/api/auth/username/check\";\n};\n\nexport const checkUsernameAvailability = async (\n\tparams: CheckUsernameAvailabilityParams,\n\toptions?: RequestInit,\n): Promise<checkUsernameAvailabilityResponse> => {\n\treturn customFetch<checkUsernameAvailabilityResponse>(\n\t\tgetCheckUsernameAvailabilityUrl(params),\n\t\t{\n\t\t\t...options,\n\t\t\tmethod: \"GET\",\n\t\t},\n\t);\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\tdata: GetSuggestionsOutput;\n\tstatus: 200;\n};\n\nexport type getUsernameSuggestionsResponse400 = {\n\tdata: ValidationError;\n\tstatus: 400;\n};\n\nexport type getUsernameSuggestionsResponse401 = {\n\tdata: ApiError;\n\tstatus: 401;\n};\n\nexport type getUsernameSuggestionsResponse403 = {\n\tdata: ApiError;\n\tstatus: 403;\n};\n\nexport type getUsernameSuggestionsResponse404 = {\n\tdata: ApiError;\n\tstatus: 404;\n};\n\nexport type getUsernameSuggestionsResponse500 = {\n\tdata: ApiError;\n\tstatus: 500;\n};\n\nexport type getUsernameSuggestionsResponseSuccess =\n\tgetUsernameSuggestionsResponse200 & {\n\t\theaders: Headers;\n\t};\nexport type getUsernameSuggestionsResponseError = (\n\t| getUsernameSuggestionsResponse400\n\t| getUsernameSuggestionsResponse401\n\t| getUsernameSuggestionsResponse403\n\t| getUsernameSuggestionsResponse404\n\t| getUsernameSuggestionsResponse500\n) & {\n\theaders: Headers;\n};\n\nexport type getUsernameSuggestionsResponse =\n\t| getUsernameSuggestionsResponseSuccess\n\t| getUsernameSuggestionsResponseError;\n\nexport const getGetUsernameSuggestionsUrl = () => {\n\treturn \"/api/auth/username/suggestions\";\n};\n\nexport const getUsernameSuggestions = async (\n\toptions?: RequestInit,\n): Promise<getUsernameSuggestionsResponse> => {\n\treturn customFetch<getUsernameSuggestionsResponse>(\n\t\tgetGetUsernameSuggestionsUrl(),\n\t\t{\n\t\t\t...options,\n\t\t\tmethod: \"GET\",\n\t\t},\n\t);\n};\n\n/**\n * Get the current authenticated user's info\n * @summary Get current user\n */\nexport type meResponse200 = {\n\tdata: MeResponseData | null;\n\tstatus: 200;\n};\n\nexport type meResponse400 = {\n\tdata: ValidationError;\n\tstatus: 400;\n};\n\nexport type meResponse401 = {\n\tdata: ApiError;\n\tstatus: 401;\n};\n\nexport type meResponse403 = {\n\tdata: ApiError;\n\tstatus: 403;\n};\n\nexport type meResponse404 = {\n\tdata: ApiError;\n\tstatus: 404;\n};\n\nexport type meResponse500 = {\n\tdata: ApiError;\n\tstatus: 500;\n};\n\nexport type meResponseSuccess = meResponse200 & {\n\theaders: Headers;\n};\nexport type meResponseError = (\n\t| meResponse400\n\t| meResponse401\n\t| meResponse403\n\t| meResponse404\n\t| meResponse500\n) & {\n\theaders: Headers;\n};\n\nexport type meResponse = meResponseSuccess | meResponseError;\n\nexport const getMeUrl = () => {\n\treturn \"/api/skills/me\";\n};\n\nexport const me = async (options?: RequestInit): Promise<meResponse> => {\n\treturn customFetch<meResponse>(getMeUrl(), {\n\t\t...options,\n\t\tmethod: \"GET\",\n\t});\n};\n\n/**\n * List all skills owned by the authenticated user\n * @summary List my skills\n */\nexport type listMySkillsResponse200 = {\n\tdata: SkillListResponse;\n\tstatus: 200;\n};\n\nexport type listMySkillsResponse400 = {\n\tdata: ValidationError;\n\tstatus: 400;\n};\n\nexport type listMySkillsResponse401 = {\n\tdata: ApiError;\n\tstatus: 401;\n};\n\nexport type listMySkillsResponse403 = {\n\tdata: ApiError;\n\tstatus: 403;\n};\n\nexport type listMySkillsResponse404 = {\n\tdata: ApiError;\n\tstatus: 404;\n};\n\nexport type listMySkillsResponse500 = {\n\tdata: ApiError;\n\tstatus: 500;\n};\n\nexport type listMySkillsResponseSuccess = listMySkillsResponse200 & {\n\theaders: Headers;\n};\nexport type listMySkillsResponseError = (\n\t| listMySkillsResponse400\n\t| listMySkillsResponse401\n\t| listMySkillsResponse403\n\t| listMySkillsResponse404\n\t| listMySkillsResponse500\n) & {\n\theaders: Headers;\n};\n\nexport type listMySkillsResponse =\n\t| listMySkillsResponseSuccess\n\t| listMySkillsResponseError;\n\nexport const getListMySkillsUrl = () => {\n\treturn \"/api/skills\";\n};\n\nexport const listMySkills = async (\n\toptions?: RequestInit,\n): Promise<listMySkillsResponse> => {\n\treturn customFetch<listMySkillsResponse>(getListMySkillsUrl(), {\n\t\t...options,\n\t\tmethod: \"GET\",\n\t});\n};\n\n/**\n * List all skills for a specific user\n * @summary List user skills\n */\nexport type listUserSkillsResponse200 = {\n\tdata: SkillListResponse;\n\tstatus: 200;\n};\n\nexport type listUserSkillsResponse400 = {\n\tdata: ValidationError;\n\tstatus: 400;\n};\n\nexport type listUserSkillsResponse401 = {\n\tdata: ApiError;\n\tstatus: 401;\n};\n\nexport type listUserSkillsResponse403 = {\n\tdata: ApiError;\n\tstatus: 403;\n};\n\nexport type listUserSkillsResponse404 = {\n\tdata: ApiError;\n\tstatus: 404;\n};\n\nexport type listUserSkillsResponse500 = {\n\tdata: ApiError;\n\tstatus: 500;\n};\n\nexport type listUserSkillsResponseSuccess = listUserSkillsResponse200 & {\n\theaders: Headers;\n};\nexport type listUserSkillsResponseError = (\n\t| listUserSkillsResponse400\n\t| listUserSkillsResponse401\n\t| listUserSkillsResponse403\n\t| listUserSkillsResponse404\n\t| listUserSkillsResponse500\n) & {\n\theaders: Headers;\n};\n\nexport type listUserSkillsResponse =\n\t| listUserSkillsResponseSuccess\n\t| listUserSkillsResponseError;\n\nexport const getListUserSkillsUrl = (username: Username) => {\n\treturn `/api/skills/@user/${username}`;\n};\n\nexport const listUserSkills = async (\n\tusername: Username,\n\toptions?: RequestInit,\n): Promise<listUserSkillsResponse> => {\n\treturn customFetch<listUserSkillsResponse>(getListUserSkillsUrl(username), {\n\t\t...options,\n\t\tmethod: \"GET\",\n\t});\n};\n\n/**\n * Get a specific skill by username and name\n * @summary Get skill\n */\nexport type getSkillResponse200 = {\n\tdata: SkillWithUser;\n\tstatus: 200;\n};\n\nexport type getSkillResponse400 = {\n\tdata: ValidationError;\n\tstatus: 400;\n};\n\nexport type getSkillResponse401 = {\n\tdata: ApiError;\n\tstatus: 401;\n};\n\nexport type getSkillResponse403 = {\n\tdata: ApiError;\n\tstatus: 403;\n};\n\nexport type getSkillResponse404 = {\n\tdata: ApiError;\n\tstatus: 404;\n};\n\nexport type getSkillResponse500 = {\n\tdata: ApiError;\n\tstatus: 500;\n};\n\nexport type getSkillResponseSuccess = getSkillResponse200 & {\n\theaders: Headers;\n};\nexport type getSkillResponseError = (\n\t| getSkillResponse400\n\t| getSkillResponse401\n\t| getSkillResponse403\n\t| getSkillResponse404\n\t| getSkillResponse500\n) & {\n\theaders: Headers;\n};\n\nexport type getSkillResponse = getSkillResponseSuccess | getSkillResponseError;\n\nexport const getGetSkillUrl = (username: Username, name: SkillName) => {\n\treturn `/api/skills/@user/${username}/${name}`;\n};\n\nexport const getSkill = async (\n\tusername: Username,\n\tname: SkillName,\n\toptions?: RequestInit,\n): Promise<getSkillResponse> => {\n\treturn customFetch<getSkillResponse>(getGetSkillUrl(username, name), {\n\t\t...options,\n\t\tmethod: \"GET\",\n\t});\n};\n\n/**\n * List all versions for a specific skill\n * @summary List skill versions\n */\nexport type listSkillVersionsResponse200 = {\n\tdata: SkillVersion[];\n\tstatus: 200;\n};\n\nexport type listSkillVersionsResponse400 = {\n\tdata: ValidationError;\n\tstatus: 400;\n};\n\nexport type listSkillVersionsResponse401 = {\n\tdata: ApiError;\n\tstatus: 401;\n};\n\nexport type listSkillVersionsResponse403 = {\n\tdata: ApiError;\n\tstatus: 403;\n};\n\nexport type listSkillVersionsResponse404 = {\n\tdata: ApiError;\n\tstatus: 404;\n};\n\nexport type listSkillVersionsResponse500 = {\n\tdata: ApiError;\n\tstatus: 500;\n};\n\nexport type listSkillVersionsResponseSuccess = listSkillVersionsResponse200 & {\n\theaders: Headers;\n};\nexport type listSkillVersionsResponseError = (\n\t| listSkillVersionsResponse400\n\t| listSkillVersionsResponse401\n\t| listSkillVersionsResponse403\n\t| listSkillVersionsResponse404\n\t| listSkillVersionsResponse500\n) & {\n\theaders: Headers;\n};\n\nexport type listSkillVersionsResponse =\n\t| listSkillVersionsResponseSuccess\n\t| listSkillVersionsResponseError;\n\nexport const getListSkillVersionsUrl = (\n\tusername: Username,\n\tname: SkillName,\n) => {\n\treturn `/api/skills/@user/${username}/${name}/versions`;\n};\n\nexport const listSkillVersions = async (\n\tusername: Username,\n\tname: SkillName,\n\toptions?: RequestInit,\n): Promise<listSkillVersionsResponse> => {\n\treturn customFetch<listSkillVersionsResponse>(\n\t\tgetListSkillVersionsUrl(username, name),\n\t\t{\n\t\t\t...options,\n\t\t\tmethod: \"GET\",\n\t\t},\n\t);\n};\n\n/**\n * Get metadata for a specific skill version\n * @summary Get skill version\n */\nexport type getSkillVersionResponse200 = {\n\tdata: SkillVersionWithDownload;\n\tstatus: 200;\n};\n\nexport type getSkillVersionResponse400 = {\n\tdata: ValidationError;\n\tstatus: 400;\n};\n\nexport type getSkillVersionResponse401 = {\n\tdata: ApiError;\n\tstatus: 401;\n};\n\nexport type getSkillVersionResponse403 = {\n\tdata: ApiError;\n\tstatus: 403;\n};\n\nexport type getSkillVersionResponse404 = {\n\tdata: ApiError;\n\tstatus: 404;\n};\n\nexport type getSkillVersionResponse500 = {\n\tdata: ApiError;\n\tstatus: 500;\n};\n\nexport type getSkillVersionResponseSuccess = getSkillVersionResponse200 & {\n\theaders: Headers;\n};\nexport type getSkillVersionResponseError = (\n\t| getSkillVersionResponse400\n\t| getSkillVersionResponse401\n\t| getSkillVersionResponse403\n\t| getSkillVersionResponse404\n\t| getSkillVersionResponse500\n) & {\n\theaders: Headers;\n};\n\nexport type getSkillVersionResponse =\n\t| getSkillVersionResponseSuccess\n\t| getSkillVersionResponseError;\n\nexport const getGetSkillVersionUrl = (\n\tusername: Username,\n\tname: SkillName,\n\tversion: Semver,\n) => {\n\treturn `/api/skills/@user/${username}/${name}/${version}`;\n};\n\nexport const getSkillVersion = async (\n\tusername: Username,\n\tname: SkillName,\n\tversion: Semver,\n\toptions?: RequestInit,\n): Promise<getSkillVersionResponse> => {\n\treturn customFetch<getSkillVersionResponse>(\n\t\tgetGetSkillVersionUrl(username, name, version),\n\t\t{\n\t\t\t...options,\n\t\t\tmethod: \"GET\",\n\t\t},\n\t);\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\tdata: PublishSkillResponse;\n\tstatus: 200;\n};\n\nexport type publishSkillResponse400 = {\n\tdata: ValidationError;\n\tstatus: 400;\n};\n\nexport type publishSkillResponse401 = {\n\tdata: ApiError;\n\tstatus: 401;\n};\n\nexport type publishSkillResponse403 = {\n\tdata: ApiError;\n\tstatus: 403;\n};\n\nexport type publishSkillResponse404 = {\n\tdata: ApiError;\n\tstatus: 404;\n};\n\nexport type publishSkillResponse500 = {\n\tdata: ApiError;\n\tstatus: 500;\n};\n\nexport type publishSkillResponseSuccess = publishSkillResponse200 & {\n\theaders: Headers;\n};\nexport type publishSkillResponseError = (\n\t| publishSkillResponse400\n\t| publishSkillResponse401\n\t| publishSkillResponse403\n\t| publishSkillResponse404\n\t| publishSkillResponse500\n) & {\n\theaders: Headers;\n};\n\nexport type publishSkillResponse =\n\t| publishSkillResponseSuccess\n\t| publishSkillResponseError;\n\nexport const getPublishSkillUrl = () => {\n\treturn \"/api/skills/publish\";\n};\n\nexport const publishSkill = async (\n\tpublishSkillInput: PublishSkillInput,\n\toptions?: RequestInit,\n): Promise<publishSkillResponse> => {\n\treturn customFetch<publishSkillResponse>(getPublishSkillUrl(), {\n\t\t...options,\n\t\tmethod: \"POST\",\n\t\theaders: { \"Content-Type\": \"application/json\", ...options?.headers },\n\t\tbody: JSON.stringify(publishSkillInput),\n\t});\n};\n\n/**\n * Delete a skill and all its versions (owner only)\n * @summary Delete skill\n */\nexport type deleteSkillResponse200 = {\n\tdata: SuccessResponse & unknown;\n\tstatus: 200;\n};\n\nexport type deleteSkillResponse400 = {\n\tdata: ValidationError;\n\tstatus: 400;\n};\n\nexport type deleteSkillResponse401 = {\n\tdata: ApiError;\n\tstatus: 401;\n};\n\nexport type deleteSkillResponse403 = {\n\tdata: ApiError;\n\tstatus: 403;\n};\n\nexport type deleteSkillResponse404 = {\n\tdata: ApiError;\n\tstatus: 404;\n};\n\nexport type deleteSkillResponse500 = {\n\tdata: ApiError;\n\tstatus: 500;\n};\n\nexport type deleteSkillResponseSuccess = deleteSkillResponse200 & {\n\theaders: Headers;\n};\nexport type deleteSkillResponseError = (\n\t| deleteSkillResponse400\n\t| deleteSkillResponse401\n\t| deleteSkillResponse403\n\t| deleteSkillResponse404\n\t| deleteSkillResponse500\n) & {\n\theaders: Headers;\n};\n\nexport type deleteSkillResponse =\n\t| deleteSkillResponseSuccess\n\t| deleteSkillResponseError;\n\nexport const getDeleteSkillUrl = (name: SkillName) => {\n\treturn `/api/skills/${name}`;\n};\n\nexport const deleteSkill = async (\n\tname: SkillName,\n\toptions?: RequestInit,\n): Promise<deleteSkillResponse> => {\n\treturn customFetch<deleteSkillResponse>(getDeleteSkillUrl(name), {\n\t\t...options,\n\t\tmethod: \"DELETE\",\n\t});\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\tdata: SuccessResponse & unknown;\n\tstatus: 200;\n};\n\nexport type deleteSkillVersionResponse400 = {\n\tdata: ValidationError;\n\tstatus: 400;\n};\n\nexport type deleteSkillVersionResponse401 = {\n\tdata: ApiError;\n\tstatus: 401;\n};\n\nexport type deleteSkillVersionResponse403 = {\n\tdata: ApiError;\n\tstatus: 403;\n};\n\nexport type deleteSkillVersionResponse404 = {\n\tdata: ApiError;\n\tstatus: 404;\n};\n\nexport type deleteSkillVersionResponse500 = {\n\tdata: ApiError;\n\tstatus: 500;\n};\n\nexport type deleteSkillVersionResponseSuccess =\n\tdeleteSkillVersionResponse200 & {\n\t\theaders: Headers;\n\t};\nexport type deleteSkillVersionResponseError = (\n\t| deleteSkillVersionResponse400\n\t| deleteSkillVersionResponse401\n\t| deleteSkillVersionResponse403\n\t| deleteSkillVersionResponse404\n\t| deleteSkillVersionResponse500\n) & {\n\theaders: Headers;\n};\n\nexport type deleteSkillVersionResponse =\n\t| deleteSkillVersionResponseSuccess\n\t| deleteSkillVersionResponseError;\n\nexport const getDeleteSkillVersionUrl = (name: SkillName, version: Semver) => {\n\treturn `/api/skills/${name}/${version}`;\n};\n\nexport const deleteSkillVersion = async (\n\tname: SkillName,\n\tversion: Semver,\n\toptions?: RequestInit,\n): Promise<deleteSkillVersionResponse> => {\n\treturn customFetch<deleteSkillVersionResponse>(\n\t\tgetDeleteSkillVersionUrl(name, version),\n\t\t{\n\t\t\t...options,\n\t\t\tmethod: \"DELETE\",\n\t\t},\n\t);\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\tdata: SkillVersion;\n\tstatus: 200;\n};\n\nexport type deprecateSkillVersionResponse400 = {\n\tdata: ValidationError;\n\tstatus: 400;\n};\n\nexport type deprecateSkillVersionResponse401 = {\n\tdata: ApiError;\n\tstatus: 401;\n};\n\nexport type deprecateSkillVersionResponse403 = {\n\tdata: ApiError;\n\tstatus: 403;\n};\n\nexport type deprecateSkillVersionResponse404 = {\n\tdata: ApiError;\n\tstatus: 404;\n};\n\nexport type deprecateSkillVersionResponse500 = {\n\tdata: ApiError;\n\tstatus: 500;\n};\n\nexport type deprecateSkillVersionResponseSuccess =\n\tdeprecateSkillVersionResponse200 & {\n\t\theaders: Headers;\n\t};\nexport type deprecateSkillVersionResponseError = (\n\t| deprecateSkillVersionResponse400\n\t| deprecateSkillVersionResponse401\n\t| deprecateSkillVersionResponse403\n\t| deprecateSkillVersionResponse404\n\t| deprecateSkillVersionResponse500\n) & {\n\theaders: Headers;\n};\n\nexport type deprecateSkillVersionResponse =\n\t| deprecateSkillVersionResponseSuccess\n\t| deprecateSkillVersionResponseError;\n\nexport const getDeprecateSkillVersionUrl = (\n\tname: SkillName,\n\tversion: Semver,\n) => {\n\treturn `/api/skills/${name}/${version}/deprecate`;\n};\n\nexport const deprecateSkillVersion = async (\n\tname: SkillName,\n\tversion: Semver,\n\tdeprecateVersionInput: DeprecateVersionInput,\n\toptions?: RequestInit,\n): Promise<deprecateSkillVersionResponse> => {\n\treturn customFetch<deprecateSkillVersionResponse>(\n\t\tgetDeprecateSkillVersionUrl(name, version),\n\t\t{\n\t\t\t...options,\n\t\t\tmethod: \"POST\",\n\t\t\theaders: { \"Content-Type\": \"application/json\", ...options?.headers },\n\t\t\tbody: JSON.stringify(deprecateVersionInput),\n\t\t},\n\t);\n};\n\n/**\n * Remove the deprecation status from a skill version.\n * @summary Remove deprecation from skill version\n */\nexport type undeprecateSkillVersionResponse200 = {\n\tdata: SkillVersion;\n\tstatus: 200;\n};\n\nexport type undeprecateSkillVersionResponse400 = {\n\tdata: ValidationError;\n\tstatus: 400;\n};\n\nexport type undeprecateSkillVersionResponse401 = {\n\tdata: ApiError;\n\tstatus: 401;\n};\n\nexport type undeprecateSkillVersionResponse403 = {\n\tdata: ApiError;\n\tstatus: 403;\n};\n\nexport type undeprecateSkillVersionResponse404 = {\n\tdata: ApiError;\n\tstatus: 404;\n};\n\nexport type undeprecateSkillVersionResponse500 = {\n\tdata: ApiError;\n\tstatus: 500;\n};\n\nexport type undeprecateSkillVersionResponseSuccess =\n\tundeprecateSkillVersionResponse200 & {\n\t\theaders: Headers;\n\t};\nexport type undeprecateSkillVersionResponseError = (\n\t| undeprecateSkillVersionResponse400\n\t| undeprecateSkillVersionResponse401\n\t| undeprecateSkillVersionResponse403\n\t| undeprecateSkillVersionResponse404\n\t| undeprecateSkillVersionResponse500\n) & {\n\theaders: Headers;\n};\n\nexport type undeprecateSkillVersionResponse =\n\t| undeprecateSkillVersionResponseSuccess\n\t| undeprecateSkillVersionResponseError;\n\nexport const getUndeprecateSkillVersionUrl = (\n\tname: SkillName,\n\tversion: Semver,\n) => {\n\treturn `/api/skills/${name}/${version}/deprecate`;\n};\n\nexport const undeprecateSkillVersion = async (\n\tname: SkillName,\n\tversion: Semver,\n\toptions?: RequestInit,\n): Promise<undeprecateSkillVersionResponse> => {\n\treturn customFetch<undeprecateSkillVersionResponse>(\n\t\tgetUndeprecateSkillVersionUrl(name, version),\n\t\t{\n\t\t\t...options,\n\t\t\tmethod: \"DELETE\",\n\t\t},\n\t);\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\tdata: ChangeAccessResponse;\n\tstatus: 200;\n};\n\nexport type changeSkillAccessResponse400 = {\n\tdata: ValidationError;\n\tstatus: 400;\n};\n\nexport type changeSkillAccessResponse401 = {\n\tdata: ApiError;\n\tstatus: 401;\n};\n\nexport type changeSkillAccessResponse403 = {\n\tdata: ApiError;\n\tstatus: 403;\n};\n\nexport type changeSkillAccessResponse404 = {\n\tdata: ApiError;\n\tstatus: 404;\n};\n\nexport type changeSkillAccessResponse500 = {\n\tdata: ApiError;\n\tstatus: 500;\n};\n\nexport type changeSkillAccessResponseSuccess = changeSkillAccessResponse200 & {\n\theaders: Headers;\n};\nexport type changeSkillAccessResponseError = (\n\t| changeSkillAccessResponse400\n\t| changeSkillAccessResponse401\n\t| changeSkillAccessResponse403\n\t| changeSkillAccessResponse404\n\t| changeSkillAccessResponse500\n) & {\n\theaders: Headers;\n};\n\nexport type changeSkillAccessResponse =\n\t| changeSkillAccessResponseSuccess\n\t| changeSkillAccessResponseError;\n\nexport const getChangeSkillAccessUrl = (name: SkillName) => {\n\treturn `/api/skills/${name}/access`;\n};\n\nexport const changeSkillAccess = async (\n\tname: SkillName,\n\tchangeAccessInput: ChangeAccessInput,\n\toptions?: RequestInit,\n): Promise<changeSkillAccessResponse> => {\n\treturn customFetch<changeSkillAccessResponse>(getChangeSkillAccessUrl(name), {\n\t\t...options,\n\t\tmethod: \"POST\",\n\t\theaders: { \"Content-Type\": \"application/json\", ...options?.headers },\n\t\tbody: JSON.stringify(changeAccessInput),\n\t});\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\tdata: SuccessResponse;\n\tstatus: 200;\n};\n\nexport type reportErrorsResponse400 = {\n\tdata: ValidationError;\n\tstatus: 400;\n};\n\nexport type reportErrorsResponse401 = {\n\tdata: ApiError;\n\tstatus: 401;\n};\n\nexport type reportErrorsResponse403 = {\n\tdata: ApiError;\n\tstatus: 403;\n};\n\nexport type reportErrorsResponse404 = {\n\tdata: ApiError;\n\tstatus: 404;\n};\n\nexport type reportErrorsResponse500 = {\n\tdata: ApiError;\n\tstatus: 500;\n};\n\nexport type reportErrorsResponseSuccess = reportErrorsResponse200 & {\n\theaders: Headers;\n};\nexport type reportErrorsResponseError = (\n\t| reportErrorsResponse400\n\t| reportErrorsResponse401\n\t| reportErrorsResponse403\n\t| reportErrorsResponse404\n\t| reportErrorsResponse500\n) & {\n\theaders: Headers;\n};\n\nexport type reportErrorsResponse =\n\t| reportErrorsResponseSuccess\n\t| reportErrorsResponseError;\n\nexport const getReportErrorsUrl = () => {\n\treturn \"/errors/report\";\n};\n\nexport const reportErrors = async (\n\terrorReportPayload: ErrorReportPayload,\n\toptions?: RequestInit,\n): Promise<reportErrorsResponse> => {\n\treturn customFetch<reportErrorsResponse>(getReportErrorsUrl(), {\n\t\t...options,\n\t\tmethod: \"POST\",\n\t\theaders: { \"Content-Type\": \"application/json\", ...options?.headers },\n\t\tbody: JSON.stringify(errorReportPayload),\n\t});\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\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/${skillName}/${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\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/${skillName}/${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\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/${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 * Extract a human-readable error message from an API response\n * Handles both ApiError and ValidationError types\n */\nexport function extractApiErrorMessage(\n\tresponse: { status: number; data: unknown },\n\tfallbackMessage: string,\n): string {\n\tconst errorData = response.data as ApiErrorResponse | null;\n\n\tif (process.env.PSPM_DEBUG) {\n\t\tconsole.log(`[debug] API response status: ${response.status}`);\n\t\tconsole.log(\n\t\t\t\"[debug] API response data:\",\n\t\t\tJSON.stringify(errorData, null, 2),\n\t\t);\n\t}\n\n\tif (!errorData) {\n\t\treturn `${fallbackMessage} (HTTP ${response.status})`;\n\t}\n\n\t// Start with the message field or fallback\n\tlet errorMessage = errorData.message || fallbackMessage;\n\n\t// For validation errors, format the issues\n\tif (errorData.code === \"VALIDATION_ERROR\" && errorData.details) {\n\t\tconst issues = (\n\t\t\terrorData.details as {\n\t\t\t\tissues?: Array<{ path?: Array<string | number>; message?: string }>;\n\t\t\t}\n\t\t).issues;\n\t\tif (issues && Array.isArray(issues)) {\n\t\t\tconst issueMessages = issues\n\t\t\t\t.map((issue) => {\n\t\t\t\t\tconst path = issue.path?.join(\".\") || \"input\";\n\t\t\t\t\tconst msg = issue.message || \"invalid value\";\n\t\t\t\t\treturn ` - ${path}: ${msg}`;\n\t\t\t\t})\n\t\t\t\t.join(\"\\n\");\n\t\t\terrorMessage = `Validation failed:\\n${issueMessages}`;\n\t\t}\n\t}\n\n\t// Add error code prefix if available and not already in message\n\tif (errorData.code && !errorMessage.includes(errorData.code)) {\n\t\terrorMessage = `[${errorData.code}] ${errorMessage}`;\n\t}\n\n\t// Add request ID for debugging\n\tif (errorData.requestId) {\n\t\terrorMessage += `\\n(Request ID: ${errorData.requestId})`;\n\t}\n\n\treturn errorMessage;\n}\n","import { mkdir, readFile, stat, unlink, writeFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\nimport * as ini from \"ini\";\nimport { NotLoggedInError } from \"./errors.js\";\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/**\n * User config stored in ~/.pspmrc (INI format)\n *\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://pspm.dev\";\n\n/**\n * Get the user config file path (~/.pspmrc)\n */\nexport function getConfigPath(): string {\n\treturn join(homedir(), \".pspmrc\");\n}\n\n/**\n * Get the legacy config file path (~/.pspm/config.json) for migration\n */\nfunction getLegacyConfigPath(): string {\n\treturn join(homedir(), \".pspm\", \"config.json\");\n}\n\n/**\n * Get the .pspm directory path (for current project)\n */\nexport function getPspmDir(): string {\n\treturn join(process.cwd(), \".pspm\");\n}\n\n/**\n * Get the skills directory path (for current project)\n * New path: .pspm/skills/\n */\nexport function getSkillsDir(): string {\n\treturn join(process.cwd(), \".pspm\", \"skills\");\n}\n\n/**\n * Get the cache directory path (for current project)\n * Used for tarball caching: .pspm/cache/\n */\nexport function getCacheDir(): string {\n\treturn join(process.cwd(), \".pspm\", \"cache\");\n}\n\n/**\n * Get the lockfile path (for current project)\n * New path: pspm-lock.json (at project root, npm-style)\n */\nexport function getLockfilePath(): string {\n\treturn join(process.cwd(), \"pspm-lock.json\");\n}\n\n/**\n * Get the legacy lockfile path (for migration)\n */\nexport function getLegacyLockfilePath(): string {\n\treturn join(process.cwd(), \"skill-lock.json\");\n}\n\n/**\n * Get the legacy skills directory path (for migration)\n */\nexport function getLegacySkillsDir(): string {\n\treturn join(process.cwd(), \".skills\");\n}\n\n// =============================================================================\n// INI Config Functions\n// =============================================================================\n\n/**\n * Read the user config file (~/.pspmrc, INI format)\n *\n * Supports npm-style configuration:\n * ```ini\n * ; Default registry and auth\n * registry = https://pspm.dev\n * authToken = sk_default\n *\n * ; Scope mappings\n * @myorg:registry = https://corp.pspm.io\n *\n * ; Per-registry tokens\n * //pspm.dev:authToken = sk_public\n * //corp.pspm.io:authToken = sk_corp\n * ```\n */\nexport async function readUserConfig(): Promise<UserConfig> {\n\tconst configPath = getConfigPath();\n\n\tif (process.env.PSPM_DEBUG) {\n\t\tconsole.log(`[config] Reading config from: ${configPath}`);\n\t}\n\n\ttry {\n\t\tconst content = await readFile(configPath, \"utf-8\");\n\t\tconst parsed = ini.parse(content);\n\n\t\tif (process.env.PSPM_DEBUG) {\n\t\t\tconsole.log(\"[config] Parsed config:\", JSON.stringify(parsed, null, 2));\n\t\t}\n\n\t\t// Extract scoped registries (@scope:registry = url)\n\t\tconst scopedRegistries: Record<string, string> = {};\n\t\tfor (const key of Object.keys(parsed)) {\n\t\t\tconst scopeMatch = key.match(/^(@[^:]+):registry$/);\n\t\t\tif (scopeMatch) {\n\t\t\t\tconst scope = scopeMatch[1];\n\t\t\t\tscopedRegistries[scope] = parsed[key] as string;\n\t\t\t}\n\t\t}\n\n\t\t// Extract per-registry tokens (//host:authToken = token)\n\t\t// INI parser may nest these under a key like \"//host\"\n\t\tconst registryTokens: Record<string, string> = {};\n\t\tfor (const key of Object.keys(parsed)) {\n\t\t\t// Check for //host:authToken format\n\t\t\tconst tokenMatch = key.match(/^\\/\\/([^:]+):authToken$/);\n\t\t\tif (tokenMatch) {\n\t\t\t\tconst host = tokenMatch[1];\n\t\t\t\tregistryTokens[host] = parsed[key] as string;\n\t\t\t}\n\t\t\t// Also check for nested format (ini parser may parse //host as a section)\n\t\t\tif (key.startsWith(\"//\") && typeof parsed[key] === \"object\") {\n\t\t\t\tconst host = key.slice(2);\n\t\t\t\tconst section = parsed[key] as Record<string, string>;\n\t\t\t\tif (section.authToken) {\n\t\t\t\t\tregistryTokens[host] = section.authToken;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\tregistry: parsed.registry as string | undefined,\n\t\t\tauthToken: parsed.authToken as string | undefined,\n\t\t\tusername: parsed.username as string | undefined,\n\t\t\tscopedRegistries:\n\t\t\t\tObject.keys(scopedRegistries).length > 0 ? scopedRegistries : undefined,\n\t\t\tregistryTokens:\n\t\t\t\tObject.keys(registryTokens).length > 0 ? registryTokens : undefined,\n\t\t};\n\t} catch (error) {\n\t\tif (process.env.PSPM_DEBUG) {\n\t\t\tconsole.log(\n\t\t\t\t`[config] Error reading config: ${\n\t\t\t\t\terror instanceof Error ? error.message : String(error)\n\t\t\t\t}`,\n\t\t\t);\n\t\t}\n\t\treturn {};\n\t}\n}\n\n/**\n * Write the user config file (~/.pspmrc, INI format)\n */\nexport async function writeUserConfig(config: UserConfig): Promise<void> {\n\tconst configPath = getConfigPath();\n\n\t// Build INI content with comments\n\tconst lines: string[] = [\"; PSPM Configuration\", \"\"];\n\n\tif (config.registry) {\n\t\tlines.push(`registry = ${config.registry}`);\n\t}\n\tif (config.authToken) {\n\t\tlines.push(`authToken = ${config.authToken}`);\n\t}\n\tif (config.username) {\n\t\tlines.push(`username = ${config.username}`);\n\t}\n\n\t// Always end with a newline\n\tlines.push(\"\");\n\n\tawait mkdir(dirname(configPath), { recursive: true });\n\tawait writeFile(configPath, lines.join(\"\\n\"));\n\n\tif (process.env.PSPM_DEBUG) {\n\t\tconsole.log(`[config] Wrote config to: ${configPath}`);\n\t}\n}\n\n/**\n * Find and read project config (.pspmrc) by searching up directory tree\n */\nexport async function findProjectConfig(): Promise<ProjectConfig | null> {\n\tlet currentDir = process.cwd();\n\tconst root = dirname(currentDir);\n\n\twhile (currentDir !== root) {\n\t\tconst configPath = join(currentDir, \".pspmrc\");\n\t\ttry {\n\t\t\tconst stats = await stat(configPath);\n\t\t\tif (stats.isFile()) {\n\t\t\t\tconst content = await readFile(configPath, \"utf-8\");\n\t\t\t\t// Try parsing as INI first\n\t\t\t\ttry {\n\t\t\t\t\tconst parsed = ini.parse(content);\n\t\t\t\t\tif (process.env.PSPM_DEBUG) {\n\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t`[config] Found project config at ${configPath}:`,\n\t\t\t\t\t\t\tJSON.stringify(parsed, null, 2),\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\treturn {\n\t\t\t\t\t\tregistry: parsed.registry as string | undefined,\n\t\t\t\t\t};\n\t\t\t\t} catch {\n\t\t\t\t\t// Fall back to JSON for backward compatibility during migration\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst jsonConfig = JSON.parse(content);\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tregistry: jsonConfig.registryUrl,\n\t\t\t\t\t\t};\n\t\t\t\t\t} catch {\n\t\t\t\t\t\t// Unparseable, skip\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} catch {\n\t\t\t// File doesn't exist, continue searching\n\t\t}\n\t\tcurrentDir = dirname(currentDir);\n\t}\n\n\treturn null;\n}\n\n/**\n * Migrate from legacy config format (~/.pspm/config.json) if it exists\n */\nasync function migrateFromLegacyConfig(): Promise<UserConfig | null> {\n\tconst legacyPath = getLegacyConfigPath();\n\n\ttry {\n\t\tconst content = await readFile(legacyPath, \"utf-8\");\n\t\tconst parsed = JSON.parse(content);\n\n\t\tlet config: UserConfig = {};\n\n\t\t// Check if V2 format (with profiles)\n\t\tif (parsed.version === 2 && parsed.profiles) {\n\t\t\tconst v2Config = parsed as LegacyConfigV2;\n\t\t\tconst defaultProfileName = v2Config.defaultProfile || \"default\";\n\t\t\tconst profile = v2Config.profiles[defaultProfileName];\n\n\t\t\tif (profile) {\n\t\t\t\tconfig = {\n\t\t\t\t\tregistry:\n\t\t\t\t\t\tprofile.registryUrl !== DEFAULT_REGISTRY_URL\n\t\t\t\t\t\t\t? profile.registryUrl\n\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\tauthToken: profile.apiKey,\n\t\t\t\t\tusername: profile.username,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tconsole.log(\n\t\t\t\t`Migrating from legacy config (profile: ${defaultProfileName})...`,\n\t\t\t);\n\t\t} else {\n\t\t\t// V1 format (flat)\n\t\t\tconst v1Config = parsed as LegacyConfigV1;\n\t\t\tconfig = {\n\t\t\t\tregistry:\n\t\t\t\t\tv1Config.registryUrl !== DEFAULT_REGISTRY_URL\n\t\t\t\t\t\t? v1Config.registryUrl\n\t\t\t\t\t\t: undefined,\n\t\t\t\tauthToken: v1Config.apiKey,\n\t\t\t\tusername: v1Config.username,\n\t\t\t};\n\n\t\t\tconsole.log(\"Migrating from legacy config...\");\n\t\t}\n\n\t\t// Write new format\n\t\tawait writeUserConfig(config);\n\t\tconsole.log(`Created new config at: ${getConfigPath()}`);\n\n\t\t// Remove old config directory\n\t\tawait unlink(legacyPath);\n\t\tconsole.log(`Removed legacy config: ${legacyPath}`);\n\n\t\treturn config;\n\t} catch {\n\t\t// Legacy config doesn't exist or couldn't be read\n\t\treturn null;\n\t}\n}\n\n/**\n * Resolve the full configuration using cascade priority:\n * 1. Environment variables (PSPM_REGISTRY_URL, PSPM_API_KEY)\n * 2. Project config (.pspmrc in project directory)\n * 3. User config (~/.pspmrc)\n * 4. Defaults\n */\nexport async function resolveConfig(): Promise<ResolvedConfig> {\n\t// Check for legacy config and migrate if needed\n\tconst newConfigPath = getConfigPath();\n\ttry {\n\t\tawait stat(newConfigPath);\n\t} catch {\n\t\t// New config doesn't exist, try migrating from legacy\n\t\tawait migrateFromLegacyConfig();\n\t}\n\n\tconst userConfig = await readUserConfig();\n\tconst projectConfig = await findProjectConfig();\n\n\t// Build resolved config with cascade priority\n\tlet registryUrl = DEFAULT_REGISTRY_URL;\n\tlet apiKey = userConfig.authToken;\n\tconst username = userConfig.username;\n\tconst scopedRegistries = userConfig.scopedRegistries ?? {};\n\tconst registryTokens = userConfig.registryTokens ?? {};\n\n\t// User config\n\tif (userConfig.registry) {\n\t\tregistryUrl = userConfig.registry;\n\t}\n\n\t// Project config can override registryUrl (but not apiKey for security)\n\tif (projectConfig?.registry) {\n\t\tregistryUrl = projectConfig.registry;\n\t}\n\n\t// Environment variables always win\n\tif (process.env.PSPM_REGISTRY_URL) {\n\t\tregistryUrl = process.env.PSPM_REGISTRY_URL;\n\t}\n\tif (process.env.PSPM_API_KEY) {\n\t\tapiKey = process.env.PSPM_API_KEY;\n\t}\n\n\tif (process.env.PSPM_DEBUG) {\n\t\tconsole.log(\"[config] Resolved config:\");\n\t\tconsole.log(`[config] registryUrl: ${registryUrl}`);\n\t\tconsole.log(`[config] apiKey: ${apiKey ? \"***\" : \"(not set)\"}`);\n\t\tconsole.log(`[config] username: ${username || \"(not set)\"}`);\n\t\tconsole.log(\n\t\t\t`[config] scopedRegistries: ${JSON.stringify(scopedRegistries)}`,\n\t\t);\n\t\tconsole.log(\n\t\t\t`[config] registryTokens: ${Object.keys(registryTokens).length} configured`,\n\t\t);\n\t}\n\n\treturn {\n\t\tregistryUrl,\n\t\tapiKey,\n\t\tusername,\n\t\tscopedRegistries,\n\t\tregistryTokens,\n\t};\n}\n\n// =============================================================================\n// Multi-Registry Helpers\n// =============================================================================\n\n/**\n * Get the auth token for a given registry URL.\n * Falls back to the default API key if no registry-specific token is configured.\n *\n * @param config - The resolved configuration\n * @param registryUrl - The registry URL\n * @returns The auth token to use, or undefined if none available\n */\nexport function getTokenForRegistry(\n\tconfig: ResolvedConfig,\n\tregistryUrl: string,\n): string | undefined {\n\ttry {\n\t\tconst url = new URL(registryUrl);\n\t\tconst host = url.host;\n\n\t\t// Check for host-specific token first\n\t\tif (config.registryTokens[host]) {\n\t\t\treturn config.registryTokens[host];\n\t\t}\n\n\t\t// Fall back to default API key\n\t\treturn config.apiKey;\n\t} catch {\n\t\t// Invalid URL, fall back to default\n\t\treturn config.apiKey;\n\t}\n}\n\n// =============================================================================\n// Credential Management\n// =============================================================================\n\n/**\n * Set credentials (authToken and optionally username/registry)\n */\nexport async function setCredentials(\n\tauthToken: string,\n\tusername?: string,\n\tregistry?: string,\n): Promise<void> {\n\tconst config = await readUserConfig();\n\n\tconfig.authToken = authToken;\n\tif (username) {\n\t\tconfig.username = username;\n\t}\n\tif (registry && registry !== DEFAULT_REGISTRY_URL) {\n\t\tconfig.registry = registry;\n\t}\n\n\tawait writeUserConfig(config);\n}\n\n/**\n * Clear credentials (authToken and username)\n */\nexport async function clearCredentials(): Promise<void> {\n\tconst config = await readUserConfig();\n\n\tconfig.authToken = undefined;\n\tconfig.username = undefined;\n\n\tawait writeUserConfig(config);\n}\n\n/**\n * Check if user is logged in\n */\nexport async function isLoggedIn(): Promise<boolean> {\n\ttry {\n\t\tconst resolved = await resolveConfig();\n\t\treturn !!resolved.apiKey;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\n/**\n * Get the API key (throws if not logged in)\n */\nexport async function requireApiKey(): Promise<string> {\n\tconst resolved = await resolveConfig();\n\n\tif (!resolved.apiKey) {\n\t\tif (process.env.PSPM_DEBUG) {\n\t\t\tconsole.log(\"[config] requireApiKey: No API key found\");\n\t\t}\n\t\tthrow new NotLoggedInError();\n\t}\n\n\tif (process.env.PSPM_DEBUG) {\n\t\tconsole.log(\n\t\t\t`[config] requireApiKey: Got API key (${resolved.apiKey.substring(0, 10)}...)`,\n\t\t);\n\t}\n\n\treturn resolved.apiKey;\n}\n\n/**\n * Get the registry URL\n */\nexport async function getRegistryUrl(): Promise<string> {\n\tconst resolved = await resolveConfig();\n\treturn resolved.registryUrl;\n}\n","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 Manifest format (pspm.json)\n *\n * This is the dedicated manifest format for prompt skill packages,\n * separate from package.json used for npm/node dependencies.\n */\n\n/**\n * Version requirements for the skill\n */\nexport interface PspmManifestRequirements {\n\t/** Minimum Claude model version required (e.g., \">=3.5\") */\n\tclaude?: string;\n\t/** Minimum PSPM CLI version required (e.g., \">=0.1.0\") */\n\tpspm?: string;\n}\n\n/**\n * Agent configuration for skill symlinks\n */\nexport interface AgentConfig {\n\t/** Directory where skills should be symlinked (e.g., \".claude/skills\") */\n\tskillsDir: string;\n}\n\n/**\n * Built-in agent types with predefined configurations\n */\nexport type BuiltInAgent =\n\t| \"claude-code\"\n\t| \"codex\"\n\t| \"cursor\"\n\t| \"gemini\"\n\t| \"kiro\"\n\t| \"opencode\";\n\n/**\n * PSPM Manifest schema for pspm.json\n *\n * @example\n * ```json\n * {\n * \"$schema\": \"https://pspm.dev/schema/pspm.json\",\n * \"name\": \"my-skill\",\n * \"version\": \"1.0.0\",\n * \"description\": \"A skill for code reviews\",\n * \"author\": \"username\",\n * \"license\": \"MIT\",\n * \"type\": \"skill\",\n * \"capabilities\": [\"code-review\", \"typescript\"],\n * \"main\": \"SKILL.md\",\n * \"requirements\": {\n * \"claude\": \">=3.5\",\n * \"pspm\": \">=0.1.0\"\n * },\n * \"files\": [\"SKILL.md\", \"runtime/\", \"scripts/\", \"data/\"],\n * \"dependencies\": {},\n * \"private\": false\n * }\n * ```\n */\nexport interface PspmManifest {\n\t/** JSON Schema URL for validation */\n\t$schema?: string;\n\n\t/** Package name (no @ prefix needed, username is derived from logged-in user) */\n\tname: string;\n\n\t/** Semantic version string */\n\tversion: string;\n\n\t/** Human-readable description */\n\tdescription?: string;\n\n\t/** Package author */\n\tauthor?: string;\n\n\t/** License identifier (e.g., \"MIT\", \"Apache-2.0\") */\n\tlicense?: string;\n\n\t/** Package type (always \"skill\" for prompt skill packages) */\n\ttype?: \"skill\";\n\n\t/** List of capabilities/tags for discovery */\n\tcapabilities?: string[];\n\n\t/** Main entry point file (default: \"SKILL.md\") */\n\tmain?: string;\n\n\t/** Version requirements */\n\trequirements?: PspmManifestRequirements;\n\n\t/** Files to include in the published package */\n\tfiles?: string[];\n\n\t/** Skill dependencies (format: \"@user/{username}/{name}\": \"^1.0.0\") */\n\tdependencies?: Record<string, string>;\n\n\t/**\n\t * GitHub skill dependencies (format: \"github:owner/repo/path\": \"ref\")\n\t *\n\t * @example\n\t * ```json\n\t * {\n\t * \"githubDependencies\": {\n\t * \"github:vercel-labs/agent-skills/skills/react-best-practices\": \"main\",\n\t * \"github:myorg/prompts/team/frontend/linter\": \"v2.0.0\"\n\t * }\n\t * }\n\t * ```\n\t */\n\tgithubDependencies?: Record<string, string>;\n\n\t/**\n\t * 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\tprivate: manifest.private ?? false,\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\treturn {\n\t\tusername: match[1]!,\n\t\tname: match[2]!,\n\t\tversionRange: match[3],\n\t};\n}\n\n/**\n * Generate a full skill identifier string.\n *\n * @param username - The owner's username\n * @param name - The skill name\n * @param version - Optional version string\n * @returns Full identifier (e.g., \"@user/bsheng/my-skill@1.0.0\")\n */\nexport function generateSkillIdentifier(\n\tusername: string,\n\tname: string,\n\tversion?: string,\n): string {\n\tconst base = `@user/${username}/${name}`;\n\treturn version ? `${base}@${version}` : base;\n}\n\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\n\treturn {\n\t\towner: owner!,\n\t\trepo: repo!,\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\treturn segments[segments.length - 1]!;\n\t}\n\treturn spec.repo;\n}\n\n/**\n * Check if a string is a GitHub specifier\n */\nexport function isGitHubSpecifier(specifier: string): boolean {\n\treturn specifier.startsWith(\"github:\");\n}\n","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 * 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// Integrity utilities\nexport { calculateIntegrity, verifyIntegrity } from \"./integrity.js\";\n// Lockfile types\n// Legacy lockfile types (deprecated, use Pspm* versions)\nexport type {\n\tGitHubLockfileEntry,\n\tPspmLockfile,\n\tPspmLockfile as SkillLockfile,\n\tPspmLockfileEntry,\n\tPspmLockfileEntry as SkillLockfileEntry,\n} from \"./lockfile.js\";\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.js\";\n// Skill specifier parsing\nexport {\n\tformatGitHubSpecifier,\n\ttype GitHubSpecifier,\n\tgenerateSkillIdentifier,\n\tgetGitHubSkillName,\n\tisGitHubSpecifier,\n\tparseGitHubSpecifier,\n\tparseSkillSpecifier,\n\ttype SkillSpecifier,\n} from \"./specifier.js\";\n// Version utilities\nexport {\n\tcompareVersions,\n\tgetLatestVersion,\n\tisNewerVersion,\n\tnormalizeVersionRange,\n\tresolveVersion,\n\tversionSatisfies,\n} from \"./version.js\";\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.js\";\n\n/**\n * Agent metadata for display purposes.\n */\nexport interface AgentInfo {\n\t/** Human-readable name for display */\n\tdisplayName: string;\n\t/** Skills directory path */\n\tskillsDir: string;\n}\n\n/**\n * Default agent configurations with display names.\n * These can be overridden in pspm.json under the \"agents\" key.\n */\nexport const AGENT_INFO: Record<BuiltInAgent, AgentInfo> = {\n\t\"claude-code\": {\n\t\tdisplayName: \"Claude Code\",\n\t\tskillsDir: \".claude/skills\",\n\t},\n\tcodex: {\n\t\tdisplayName: \"Codex\",\n\t\tskillsDir: \".codex/skills\",\n\t},\n\tcursor: {\n\t\tdisplayName: \"Cursor\",\n\t\tskillsDir: \".cursor/skills\",\n\t},\n\tgemini: {\n\t\tdisplayName: \"Gemini CLI\",\n\t\tskillsDir: \".gemini/skills\",\n\t},\n\tkiro: {\n\t\tdisplayName: \"Kiro CLI\",\n\t\tskillsDir: \".kiro/skills\",\n\t},\n\topencode: {\n\t\tdisplayName: \"OpenCode\",\n\t\tskillsDir: \".opencode/skills\",\n\t},\n};\n\n/**\n * Default agent configurations (AgentConfig format).\n */\nexport const DEFAULT_AGENT_CONFIGS: Record<BuiltInAgent, AgentConfig> = {\n\t\"claude-code\": { skillsDir: AGENT_INFO[\"claude-code\"].skillsDir },\n\tcodex: { skillsDir: AGENT_INFO.codex.skillsDir },\n\tcursor: { skillsDir: AGENT_INFO.cursor.skillsDir },\n\tgemini: { skillsDir: AGENT_INFO.gemini.skillsDir },\n\tkiro: { skillsDir: AGENT_INFO.kiro.skillsDir },\n\topencode: { skillsDir: AGENT_INFO.opencode.skillsDir },\n};\n\n/**\n * All built-in agent names in display order.\n */\nexport const ALL_AGENTS: BuiltInAgent[] = [\n\t\"claude-code\",\n\t\"codex\",\n\t\"cursor\",\n\t\"gemini\",\n\t\"kiro\",\n\t\"opencode\",\n];\n\n/**\n * Resolve agent configuration by name.\n *\n * @param name - Agent name (built-in or custom)\n * @param overrides - Custom agent configurations from pspm.json\n * @returns Agent configuration or null if not found\n *\n * @example\n * ```typescript\n * resolveAgentConfig(\"claude-code\")\n * // => { skillsDir: \".claude/skills\" }\n *\n * resolveAgentConfig(\"my-custom\", { \"my-custom\": { skillsDir: \".myagent/prompts\" } })\n * // => { skillsDir: \".myagent/prompts\" }\n * ```\n */\nexport function resolveAgentConfig(\n\tname: string,\n\toverrides?: Record<string, AgentConfig>,\n): AgentConfig | null {\n\t// Check overrides first\n\tif (overrides?.[name]) {\n\t\treturn overrides[name];\n\t}\n\n\t// Check built-in defaults\n\tif (name in DEFAULT_AGENT_CONFIGS) {\n\t\treturn DEFAULT_AGENT_CONFIGS[name as BuiltInAgent];\n\t}\n\n\treturn null;\n}\n\n/**\n * Parse comma-separated agent names from CLI argument.\n *\n * @param agentArg - Comma-separated agent names (e.g., \"claude-code,cursor\")\n * @returns Array of agent names, or [\"none\"] if skipping symlinks\n *\n * @example\n * ```typescript\n * parseAgentArg(\"claude-code,cursor\")\n * // => [\"claude-code\", \"cursor\"]\n *\n * parseAgentArg(\"none\")\n * // => [\"none\"]\n *\n * parseAgentArg(undefined)\n * // => [\"claude-code\", \"codex\", \"cursor\", \"gemini\", \"kiro\", \"opencode\"]\n * ```\n */\nexport function parseAgentArg(agentArg?: string): string[] {\n\tif (!agentArg) {\n\t\treturn [...ALL_AGENTS];\n\t}\n\n\tif (agentArg === \"none\") {\n\t\treturn [\"none\"];\n\t}\n\n\treturn agentArg\n\t\t.split(\",\")\n\t\t.map((a) => a.trim())\n\t\t.filter(Boolean);\n}\n\n/**\n * Get all available agent names (built-in + custom).\n */\nexport function getAvailableAgents(\n\toverrides?: Record<string, AgentConfig>,\n): string[] {\n\tconst builtIn = Object.keys(DEFAULT_AGENT_CONFIGS);\n\tconst custom = overrides ? Object.keys(overrides) : [];\n\treturn [...new Set([...builtIn, ...custom])];\n}\n\n/**\n * Prompt user to select which agents to install skills to.\n *\n * @returns Array of selected agent names\n */\nexport async function promptForAgents(): Promise<string[]> {\n\tconst choices = ALL_AGENTS.map((agent) => ({\n\t\tname: `${AGENT_INFO[agent].displayName} (${AGENT_INFO[agent].skillsDir})`,\n\t\tvalue: agent,\n\t\tchecked: true, // All selected by default\n\t}));\n\n\tconst selected = await checkbox({\n\t\tmessage: \"Select agents to install skills to\",\n\t\tchoices,\n\t});\n\n\tif (selected.length === 0) {\n\t\treturn [\"none\"];\n\t}\n\n\treturn selected;\n}\n","/**\n * GitHub package download and extraction support.\n *\n * Downloads skill packages from GitHub repositories and extracts them\n * to .pspm/skills/_github/{owner}/{repo}/{path}/\n */\n\nimport { cp, lstat, mkdir, readdir, rm, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { GitHubSpecifier } from \"./lib/index.js\";\nimport { calculateIntegrity } from \"./lib/index.js\";\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 type {\n\tGitHubLockfileEntry,\n\tPspmLockfile,\n\tPspmLockfileEntry,\n} from \"./lib/index.js\";\n\n// Re-export types for backward compatibility\nexport type { GitHubLockfileEntry, PspmLockfile, PspmLockfileEntry };\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 (always v3 format)\n */\nexport async function writeLockfile(lockfile: PspmLockfile): Promise<void> {\n\tconst lockfilePath = getLockfilePath();\n\tawait mkdir(dirname(lockfilePath), { recursive: true });\n\n\t// Always write as v3 format\n\tconst normalized: PspmLockfile = {\n\t\tlockfileVersion: 3,\n\t\tregistryUrl: lockfile.registryUrl,\n\t\tpackages: lockfile.packages ?? lockfile.skills ?? {},\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\tawait writeFile(lockfilePath, `${JSON.stringify(normalized, null, 2)}\\n`);\n}\n\n/**\n * Create a new empty lockfile (v3 format)\n */\nexport async function createEmptyLockfile(): Promise<PspmLockfile> {\n\tconst registryUrl = await getRegistryUrl();\n\treturn {\n\t\tlockfileVersion: 3,\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 * 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","import { readFile, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { PspmManifest } from \"./lib/index.js\";\n\n/**\n * Get the manifest file path (pspm.json in current directory)\n */\nexport function getManifestPath(): string {\n\treturn join(process.cwd(), \"pspm.json\");\n}\n\n/**\n * Read the manifest file (pspm.json)\n * Returns null if file doesn't exist\n */\nexport async function readManifest(): Promise<PspmManifest | null> {\n\ttry {\n\t\tconst content = await readFile(getManifestPath(), \"utf-8\");\n\t\treturn JSON.parse(content) as PspmManifest;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\n/**\n * Write the manifest file (pspm.json)\n */\nexport async function writeManifest(manifest: PspmManifest): Promise<void> {\n\tconst content = JSON.stringify(manifest, null, 2);\n\tawait writeFile(getManifestPath(), `${content}\\n`);\n}\n\n/**\n * Create a minimal manifest with just dependencies\n * Similar to how npm creates package.json with just dependencies when you run `npm add`\n * This is for consuming packages, not publishing - so only dependencies are needed\n */\nexport async function createMinimalManifest(): Promise<PspmManifest> {\n\treturn {\n\t\tdependencies: {},\n\t} as PspmManifest;\n}\n\n/**\n * Ensure manifest exists, creating a minimal one if needed\n * Returns the manifest (existing or newly created)\n */\nexport async function ensureManifest(): Promise<PspmManifest> {\n\tlet manifest = await readManifest();\n\n\tif (!manifest) {\n\t\tmanifest = await createMinimalManifest();\n\t\tawait writeManifest(manifest);\n\t}\n\n\treturn manifest;\n}\n\n/**\n * Add a dependency to the manifest\n * Creates the manifest if it doesn't exist\n *\n * @param skillName - Full skill name (e.g., \"@user/alice/my-skill\")\n * @param versionRange - Version range to save (e.g., \"^1.0.0\")\n */\nexport async function addDependency(\n\tskillName: string,\n\tversionRange: string,\n): Promise<void> {\n\tconst manifest = await ensureManifest();\n\n\t// Initialize dependencies if not present\n\tif (!manifest.dependencies) {\n\t\tmanifest.dependencies = {};\n\t}\n\n\t// Add or update the dependency\n\tmanifest.dependencies[skillName] = versionRange;\n\n\tawait writeManifest(manifest);\n}\n\n/**\n * Remove a dependency from the manifest\n *\n * @param skillName - Full skill name (e.g., \"@user/alice/my-skill\")\n * @returns true if dependency was removed, false if it didn't exist\n */\nexport async function removeDependency(skillName: string): Promise<boolean> {\n\tconst manifest = await readManifest();\n\n\tif (!manifest?.dependencies?.[skillName]) {\n\t\treturn false;\n\t}\n\n\tdelete manifest.dependencies[skillName];\n\tawait writeManifest(manifest);\n\treturn true;\n}\n\n/**\n * Get all dependencies from the manifest\n * Returns empty object if manifest doesn't exist or has no dependencies\n */\nexport async function getDependencies(): Promise<Record<string, string>> {\n\tconst manifest = await readManifest();\n\treturn manifest?.dependencies ?? {};\n}\n\n/**\n * Get all GitHub dependencies from the manifest\n * Returns empty object if manifest doesn't exist or has no GitHub dependencies\n */\nexport async function getGitHubDependencies(): Promise<Record<string, string>> {\n\tconst manifest = await readManifest();\n\treturn manifest?.githubDependencies ?? {};\n}\n\n/**\n * Add a GitHub dependency to the manifest\n * Creates the manifest if it doesn't exist\n *\n * @param specifier - GitHub specifier (e.g., \"github:owner/repo/path\")\n * @param ref - Git ref (branch, tag, or \"latest\")\n */\nexport async function addGitHubDependency(\n\tspecifier: string,\n\tref: string,\n): Promise<void> {\n\tconst manifest = await ensureManifest();\n\n\t// Initialize githubDependencies if not present\n\tif (!manifest.githubDependencies) {\n\t\tmanifest.githubDependencies = {};\n\t}\n\n\t// Add or update the dependency\n\tmanifest.githubDependencies[specifier] = ref;\n\n\tawait writeManifest(manifest);\n}\n\n/**\n * Remove a GitHub dependency from the manifest\n *\n * @param specifier - GitHub specifier (e.g., \"github:owner/repo/path\")\n * @returns true if dependency was removed, false if it didn't exist\n */\nexport async function removeGitHubDependency(\n\tspecifier: string,\n): Promise<boolean> {\n\tconst manifest = await readManifest();\n\n\tif (!manifest?.githubDependencies?.[specifier]) {\n\t\treturn false;\n\t}\n\n\tdelete manifest.githubDependencies[specifier];\n\tawait writeManifest(manifest);\n\treturn true;\n}\n","/**\n * 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.js\";\nimport type { AgentConfig } from \"./lib/index.js\";\n\n/**\n * Options for creating agent symlinks.\n */\nexport interface CreateSymlinksOptions {\n\t/** Agent names to create symlinks for */\n\tagents: string[];\n\t/** Project root directory */\n\tprojectRoot: string;\n\t/** Custom agent configuration overrides from pspm.json */\n\tagentConfigs?: Record<string, AgentConfig>;\n}\n\n/**\n * Information about an installed skill for symlinking.\n */\nexport interface SkillInfo {\n\t/** Skill name (used as symlink name) */\n\tname: string;\n\t/** Path to skill within .pspm/skills/ (relative to project root) */\n\tsourcePath: string;\n}\n\n/**\n * Create symlinks for all skills to specified agent directories.\n *\n * @param skills - List of skills to create symlinks for\n * @param options - Symlink creation options\n */\nexport async function createAgentSymlinks(\n\tskills: SkillInfo[],\n\toptions: CreateSymlinksOptions,\n): Promise<void> {\n\tconst { agents, projectRoot, agentConfigs } = options;\n\n\t// Skip if \"none\" agent\n\tif (agents.length === 1 && agents[0] === \"none\") {\n\t\treturn;\n\t}\n\n\tfor (const agentName of agents) {\n\t\tconst config = resolveAgentConfig(agentName, agentConfigs);\n\n\t\tif (!config) {\n\t\t\tconsole.warn(`Warning: Unknown agent \"${agentName}\", skipping symlinks`);\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst agentSkillsDir = join(projectRoot, config.skillsDir);\n\n\t\t// Create agent skills directory\n\t\tawait mkdir(agentSkillsDir, { recursive: true });\n\n\t\tfor (const skill of skills) {\n\t\t\tconst symlinkPath = join(agentSkillsDir, skill.name);\n\t\t\tconst targetPath = join(projectRoot, skill.sourcePath);\n\n\t\t\t// Calculate relative path from symlink location to target\n\t\t\tconst relativeTarget = relative(dirname(symlinkPath), targetPath);\n\n\t\t\tawait createSymlink(symlinkPath, relativeTarget, skill.name);\n\t\t}\n\t}\n}\n\n/**\n * Create a single symlink, handling existing files/symlinks.\n *\n * @param symlinkPath - Absolute path where symlink will be created\n * @param target - Relative path to target (relative to symlink's parent dir)\n * @param skillName - Name for logging\n */\nasync function createSymlink(\n\tsymlinkPath: string,\n\ttarget: string,\n\tskillName: string,\n): Promise<void> {\n\ttry {\n\t\t// Check if something exists at the symlink path\n\t\tconst stats = await lstat(symlinkPath).catch(() => null);\n\n\t\tif (stats) {\n\t\t\tif (stats.isSymbolicLink()) {\n\t\t\t\t// Check if it points to the correct target\n\t\t\t\tconst existingTarget = await readlink(symlinkPath);\n\t\t\t\tif (existingTarget === target) {\n\t\t\t\t\t// Already correct, nothing to do\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t// Remove incorrect symlink\n\t\t\t\tawait rm(symlinkPath);\n\t\t\t} else {\n\t\t\t\t// Regular file or directory exists - warn and skip\n\t\t\t\tconsole.warn(\n\t\t\t\t\t`Warning: File exists at symlink path for \"${skillName}\", skipping: ${symlinkPath}`,\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\t// Create the symlink\n\t\tawait symlink(target, symlinkPath);\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\tconsole.warn(\n\t\t\t`Warning: Failed to create symlink for \"${skillName}\": ${message}`,\n\t\t);\n\t}\n}\n\n/**\n * Remove symlinks for a skill from all agent directories.\n *\n * @param skillName - Name of the skill (symlink name)\n * @param options - Symlink options\n */\nexport async function removeAgentSymlinks(\n\tskillName: string,\n\toptions: CreateSymlinksOptions,\n): Promise<void> {\n\tconst { agents, projectRoot, agentConfigs } = options;\n\n\t// Skip if \"none\" agent\n\tif (agents.length === 1 && agents[0] === \"none\") {\n\t\treturn;\n\t}\n\n\tfor (const agentName of agents) {\n\t\tconst config = resolveAgentConfig(agentName, agentConfigs);\n\n\t\tif (!config) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst symlinkPath = join(projectRoot, config.skillsDir, skillName);\n\n\t\ttry {\n\t\t\tconst stats = await lstat(symlinkPath).catch(() => null);\n\n\t\t\tif (stats?.isSymbolicLink()) {\n\t\t\t\tawait rm(symlinkPath);\n\t\t\t}\n\t\t} catch {\n\t\t\t// Ignore errors - symlink may not exist\n\t\t}\n\t}\n}\n\n/**\n * Get the source path for a registry skill within .pspm/skills/.\n *\n * @param username - Skill author username\n * @param skillName - Skill name\n * @returns Relative path from project root (e.g., \".pspm/skills/alice/my-skill\")\n */\nexport function getRegistrySkillPath(\n\tusername: string,\n\tskillName: string,\n): string {\n\treturn `.pspm/skills/${username}/${skillName}`;\n}\n\n/**\n * Get the source path for a GitHub skill within .pspm/skills/.\n *\n * @param owner - GitHub repository owner\n * @param repo - GitHub repository name\n * @param path - Optional path within the repository\n * @returns Relative path from project root (e.g., \".pspm/skills/_github/owner/repo/path\")\n */\nexport function getGitHubSkillPath(\n\towner: string,\n\trepo: string,\n\tpath?: string,\n): string {\n\tif (path) {\n\t\treturn `.pspm/skills/_github/${owner}/${repo}/${path}`;\n\t}\n\treturn `.pspm/skills/_github/${owner}/${repo}`;\n}\n\n/**\n * Check which agents have symlinks for a given skill.\n *\n * @param skillName - Name of the skill (symlink name)\n * @param agents - Agent names to check\n * @param projectRoot - Project root directory\n * @param agentConfigs - Custom agent configurations\n * @returns Array of agent names that have valid symlinks\n */\nexport async function getLinkedAgents(\n\tskillName: string,\n\tagents: string[],\n\tprojectRoot: string,\n\tagentConfigs?: Record<string, AgentConfig>,\n): Promise<string[]> {\n\tconst linkedAgents: string[] = [];\n\n\tfor (const agentName of agents) {\n\t\tconst config = resolveAgentConfig(agentName, agentConfigs);\n\t\tif (!config) continue;\n\n\t\tconst symlinkPath = join(projectRoot, config.skillsDir, skillName);\n\n\t\ttry {\n\t\t\tconst stats = await lstat(symlinkPath);\n\t\t\tif (stats.isSymbolicLink()) {\n\t\t\t\tlinkedAgents.push(agentName);\n\t\t\t}\n\t\t} catch {\n\t\t\t// Symlink doesn't exist\n\t\t}\n\t}\n\n\treturn linkedAgents;\n}\n","import { mkdir, rm } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { parseAgentArg, promptForAgents } from \"../agents.js\";\nimport {\n\tconfigure,\n\tgetSkillVersion,\n\tlistSkillVersions,\n} from \"../api-client.js\";\nimport { getSkillsDir, getTokenForRegistry, resolveConfig } from \"../config.js\";\nimport { extractApiErrorMessage } from \"../errors.js\";\nimport {\n\tdownloadGitHubPackage,\n\textractGitHubPackage,\n\tgetGitHubDisplayName,\n} from \"../github.js\";\nimport {\n\tcalculateIntegrity,\n\tformatGitHubSpecifier,\n\ttype GitHubLockfileEntry,\n\tgetGitHubSkillName,\n\tisGitHubSpecifier,\n\tparseGitHubSpecifier,\n\tparseSkillSpecifier,\n\tresolveVersion,\n} from \"../lib/index.js\";\nimport { addGitHubToLockfile, addToLockfile } from \"../lockfile.js\";\nimport {\n\taddDependency,\n\taddGitHubDependency,\n\treadManifest,\n} from \"../manifest.js\";\nimport {\n\tcreateAgentSymlinks,\n\tgetGitHubSkillPath,\n\tgetRegistrySkillPath,\n\ttype SkillInfo,\n} from \"../symlinks.js\";\n\nexport interface AddOptions {\n\tsave?: boolean;\n\tagent?: string;\n\tyes?: boolean;\n}\n\n/** Resolved package info from validation phase */\ninterface ResolvedRegistryPackage {\n\ttype: \"registry\";\n\tspecifier: string;\n\tusername: string;\n\tname: string;\n\tversionRange: string | undefined;\n\tresolvedVersion: string;\n\tversionInfo: {\n\t\tdownloadUrl: string;\n\t\tchecksum: string;\n\t};\n}\n\ninterface ResolvedGitHubPackage {\n\ttype: \"github\";\n\tspecifier: string;\n\tparsed: ReturnType<typeof parseGitHubSpecifier> & object;\n\tref: string;\n\tdownloadResult: {\n\t\tbuffer: Buffer;\n\t\tcommit: string;\n\t\tintegrity: string;\n\t};\n}\n\ntype ResolvedPackage = ResolvedRegistryPackage | ResolvedGitHubPackage;\n\nexport async function add(\n\tspecifiers: string[],\n\toptions: AddOptions,\n): Promise<void> {\n\t// Phase 1: Validate and resolve all packages first\n\tconsole.log(\"Resolving packages...\\n\");\n\n\tconst resolvedPackages: ResolvedPackage[] = [];\n\tconst validationErrors: { specifier: string; error: string }[] = [];\n\n\tfor (const specifier of specifiers) {\n\t\ttry {\n\t\t\tif (isGitHubSpecifier(specifier)) {\n\t\t\t\tconst resolved = await validateGitHubPackage(specifier);\n\t\t\t\tresolvedPackages.push(resolved);\n\t\t\t} else {\n\t\t\t\tconst resolved = await validateRegistryPackage(specifier);\n\t\t\t\tresolvedPackages.push(resolved);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconst message = error instanceof Error ? error.message : \"Unknown error\";\n\t\t\tvalidationErrors.push({ specifier, error: message });\n\t\t\tconsole.error(`Failed to resolve ${specifier}: ${message}\\n`);\n\t\t}\n\t}\n\n\t// If all packages failed validation, exit early\n\tif (resolvedPackages.length === 0) {\n\t\tconsole.error(\"No packages could be resolved.\");\n\t\tprocess.exit(1);\n\t}\n\n\t// Show validation summary if there were failures\n\tif (validationErrors.length > 0) {\n\t\tconsole.log(\n\t\t\t`Resolved ${resolvedPackages.length} of ${specifiers.length} packages.\\n`,\n\t\t);\n\t}\n\n\t// Phase 2: 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 3: Install all resolved packages\n\tconst results: { specifier: string; success: boolean; error?: string }[] = [];\n\n\tfor (const resolved of resolvedPackages) {\n\t\ttry {\n\t\t\tif (resolved.type === \"github\") {\n\t\t\t\tawait installGitHubPackage(resolved, {\n\t\t\t\t\t...options,\n\t\t\t\t\tresolvedAgents: agents,\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tawait installRegistryPackage(resolved, {\n\t\t\t\t\t...options,\n\t\t\t\t\tresolvedAgents: agents,\n\t\t\t\t});\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 * 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: apiKey ?? \"\" });\n\n\tconsole.log(`Resolving ${specifier}...`);\n\n\t// Get available versions\n\tconst versionsResponse = await listSkillVersions(username, name);\n\tif (versionsResponse.status !== 200) {\n\t\tif (versionsResponse.status === 401) {\n\t\t\tif (!apiKey) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Package @user/${username}/${name} requires authentication. Please run 'pspm login' to authenticate`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tthrow new Error(\n\t\t\t\t`Access denied to @user/${username}/${name}. You may not have permission to access this private package.`,\n\t\t\t);\n\t\t}\n\t\tconst errorMessage = extractApiErrorMessage(\n\t\t\tversionsResponse,\n\t\t\t`Skill @user/${username}/${name} not found`,\n\t\t);\n\t\tthrow new Error(errorMessage);\n\t}\n\tconst versions = versionsResponse.data;\n\tif (versions.length === 0) {\n\t\tthrow new Error(`Skill @user/${username}/${name} not found`);\n\t}\n\n\t// Resolve version\n\tconst versionStrings = versions.map((v: { version: string }) => v.version);\n\tconst resolvedVersion = resolveVersion(versionRange || \"*\", versionStrings);\n\n\tif (!resolvedVersion) {\n\t\tthrow new Error(\n\t\t\t`No version matching \"${versionRange || \"latest\"}\" found for @user/${username}/${name}. Available versions: ${versionStrings.join(\", \")}`,\n\t\t);\n\t}\n\n\t// Get version details with download URL\n\tconst versionResponse = await getSkillVersion(\n\t\tusername,\n\t\tname,\n\t\tresolvedVersion,\n\t);\n\tif (versionResponse.status !== 200 || !versionResponse.data) {\n\t\tconst errorMessage = extractApiErrorMessage(\n\t\t\tversionResponse,\n\t\t\t`Version ${resolvedVersion} not found`,\n\t\t);\n\t\tthrow new Error(errorMessage);\n\t}\n\n\tconsole.log(`Resolved @user/${username}/${name}@${resolvedVersion}`);\n\n\treturn {\n\t\ttype: \"registry\",\n\t\tspecifier,\n\t\tusername,\n\t\tname,\n\t\tversionRange,\n\t\tresolvedVersion,\n\t\tversionInfo: {\n\t\t\tdownloadUrl: versionResponse.data.downloadUrl,\n\t\t\tchecksum: versionResponse.data.checksum,\n\t\t},\n\t};\n}\n\n/**\n * Validate and download a GitHub package\n */\nasync function validateGitHubPackage(\n\tspecifier: string,\n): Promise<ResolvedGitHubPackage> {\n\tconst parsed = parseGitHubSpecifier(specifier);\n\tif (!parsed) {\n\t\tthrow new Error(\n\t\t\t`Invalid GitHub specifier \"${specifier}\". Use format: github:{owner}/{repo}[/{path}][@{ref}]`,\n\t\t);\n\t}\n\n\tconst ref = parsed.ref || \"HEAD\";\n\tconsole.log(`Resolving ${getGitHubDisplayName(parsed)}...`);\n\n\t// Download from GitHub (also validates existence)\n\tconst result = await downloadGitHubPackage(parsed);\n\n\tconsole.log(`Resolved ${specifier} (${ref}@${result.commit.slice(0, 7)})`);\n\n\treturn {\n\t\ttype: \"github\",\n\t\tspecifier,\n\t\tparsed,\n\t\tref,\n\t\tdownloadResult: result,\n\t};\n}\n\n/**\n * Install a pre-validated registry package\n */\nasync function installRegistryPackage(\n\tresolved: ResolvedRegistryPackage,\n\toptions: InternalAddOptions,\n): Promise<void> {\n\tconst { username, name, versionRange, resolvedVersion, versionInfo } =\n\t\tresolved;\n\n\tconsole.log(`Installing @user/${username}/${name}@${resolvedVersion}...`);\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\tversionInfo.downloadUrl.includes(\".r2.cloudflarestorage.com\") ||\n\t\tversionInfo.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(versionInfo.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\tconst expectedIntegrity = `sha256-${Buffer.from(versionInfo.checksum, \"hex\").toString(\"base64\")}`;\n\tif (integrity !== expectedIntegrity) {\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\n\tconst fullName = `@user/${username}/${name}`;\n\tawait addToLockfile(fullName, {\n\t\tversion: resolvedVersion,\n\t\tresolved: versionInfo.downloadUrl,\n\t\tintegrity,\n\t});\n\n\t// Add to pspm.json dependencies\n\tconst dependencyRange = versionRange || `^${resolvedVersion}`;\n\tawait addDependency(fullName, dependencyRange);\n\n\t// Create agent symlinks\n\tconst agents = options.resolvedAgents;\n\tif (agents[0] !== \"none\") {\n\t\tconst skillManifest = await readManifest();\n\t\tconst skillInfo: SkillInfo = {\n\t\t\tname,\n\t\t\tsourcePath: getRegistrySkillPath(username, name),\n\t\t};\n\n\t\tawait createAgentSymlinks([skillInfo], {\n\t\t\tagents,\n\t\t\tprojectRoot: process.cwd(),\n\t\t\tagentConfigs: skillManifest?.agents,\n\t\t});\n\t}\n\n\tconsole.log(`Installed @user/${username}/${name}@${resolvedVersion}`);\n\tconsole.log(`Location: ${destDir}`);\n}\n\n/**\n * Install a pre-validated GitHub package\n */\nasync function installGitHubPackage(\n\tresolved: ResolvedGitHubPackage,\n\toptions: InternalAddOptions,\n): Promise<void> {\n\tconst { specifier, parsed, ref, downloadResult } = resolved;\n\n\tconsole.log(\n\t\t`Installing ${specifier} (${ref}@${downloadResult.commit.slice(0, 7)})...`,\n\t);\n\n\t// Extract to skills directory\n\tconst skillsDir = getSkillsDir();\n\tconst destPath = await extractGitHubPackage(\n\t\tparsed,\n\t\tdownloadResult.buffer,\n\t\tskillsDir,\n\t);\n\n\t// Add to lockfile\n\tconst lockfileSpecifier = formatGitHubSpecifier({\n\t\towner: parsed.owner,\n\t\trepo: parsed.repo,\n\t\tpath: parsed.path,\n\t\t// Don't include ref in the specifier key, it's stored in gitRef\n\t});\n\n\tconst entry: GitHubLockfileEntry = {\n\t\tversion: downloadResult.commit.slice(0, 7),\n\t\tresolved: `https://github.com/${parsed.owner}/${parsed.repo}`,\n\t\tintegrity: downloadResult.integrity,\n\t\tgitCommit: downloadResult.commit,\n\t\tgitRef: ref,\n\t};\n\n\tawait addGitHubToLockfile(lockfileSpecifier, entry);\n\n\t// Add to pspm.json githubDependencies\n\tawait addGitHubDependency(lockfileSpecifier, ref);\n\n\t// Create agent symlinks\n\tconst agents = options.resolvedAgents;\n\tif (agents[0] !== \"none\") {\n\t\tconst manifest = await readManifest();\n\t\tconst skillName = getGitHubSkillName(parsed);\n\t\tconst skillInfo: SkillInfo = {\n\t\t\tname: skillName,\n\t\t\tsourcePath: getGitHubSkillPath(parsed.owner, parsed.repo, parsed.path),\n\t\t};\n\n\t\tawait createAgentSymlinks([skillInfo], {\n\t\t\tagents,\n\t\t\tprojectRoot: process.cwd(),\n\t\t\tagentConfigs: manifest?.agents,\n\t\t});\n\t}\n\n\tconsole.log(\n\t\t`Installed ${specifier} (${ref}@${downloadResult.commit.slice(0, 7)})`,\n\t);\n\tconsole.log(`Location: ${destPath}`);\n}\n","#!/usr/bin/env node\n\nimport { readFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { Command } from \"commander\";\nimport {\n\taccess,\n\tadd,\n\tconfigInit,\n\tconfigShow,\n\tdeprecate,\n\tinit,\n\tinstall,\n\tlink,\n\tlist,\n\tlogin,\n\tlogout,\n\tmigrate,\n\tpublish,\n\tremove,\n\tunpublish,\n\tupdate,\n\twhoami,\n} from \"./commands/index.js\";\n\n// Read version from package.json\nconst __dirname = dirname(fileURLToPath(import.meta.url));\nconst packageJson = JSON.parse(\n\treadFileSync(join(__dirname, \"..\", \"package.json\"), \"utf-8\"),\n);\nconst version: string = packageJson.version;\n\nconst program = new Command();\n\nprogram\n\t.name(\"pspm\")\n\t.description(\"Prompt Skill Package Manager for AI coding agents\")\n\t.version(version);\n\n// =============================================================================\n// Config commands\n// =============================================================================\n\nconst configCmd = program\n\t.command(\"config\")\n\t.description(\"Manage PSPM configuration\");\n\nconfigCmd\n\t.command(\"show\")\n\t.description(\"Show resolved configuration\")\n\t.action(async () => {\n\t\tawait configShow();\n\t});\n\nconfigCmd\n\t.command(\"init\")\n\t.description(\"Create a .pspmrc file in the current directory\")\n\t.option(\"--registry <url>\", \"Registry URL override\")\n\t.action(async (options) => {\n\t\tawait configInit({\n\t\t\tregistry: options.registry,\n\t\t});\n\t});\n\n// =============================================================================\n// Authentication commands\n// =============================================================================\n\nprogram\n\t.command(\"login\")\n\t.description(\"Log in via browser or with an API key\")\n\t.option(\n\t\t\"--api-key <key>\",\n\t\t\"API key for direct authentication (skips browser)\",\n\t)\n\t.action(async (options) => {\n\t\tawait login({ apiKey: options.apiKey });\n\t});\n\nprogram\n\t.command(\"logout\")\n\t.description(\"Log out and clear stored credentials\")\n\t.action(async () => {\n\t\tawait logout();\n\t});\n\nprogram\n\t.command(\"whoami\")\n\t.description(\"Show current user information\")\n\t.action(async () => {\n\t\tawait whoami();\n\t});\n\n// =============================================================================\n// Project initialization commands\n// =============================================================================\n\nprogram\n\t.command(\"init\")\n\t.description(\"Create a new pspm.json manifest in the current directory\")\n\t.option(\"-n, --name <name>\", \"Skill name\")\n\t.option(\"-d, --description <desc>\", \"Skill description\")\n\t.option(\"-a, --author <author>\", \"Author name\")\n\t.option(\"-y, --yes\", \"Skip prompts and use defaults\")\n\t.option(\"-f, --force\", \"Overwrite existing pspm.json\")\n\t.action(async (options) => {\n\t\tawait init({\n\t\t\tname: options.name,\n\t\t\tdescription: options.description,\n\t\t\tauthor: options.author,\n\t\t\tyes: options.yes,\n\t\t\tforce: options.force,\n\t\t});\n\t});\n\nprogram\n\t.command(\"migrate\")\n\t.description(\n\t\t\"Migrate from old directory structure (.skills/, skill-lock.json)\",\n\t)\n\t.option(\"--dry-run\", \"Show what would be migrated without making changes\")\n\t.action(async (options) => {\n\t\tawait migrate({ dryRun: options.dryRun });\n\t});\n\n// =============================================================================\n// Skill management commands\n// =============================================================================\n\nprogram\n\t.command(\"add <specifiers...>\")\n\t.description(\n\t\t\"Add one or more skills (e.g., @user/bsheng/vite_slides@^2.0.0 or github:owner/repo/path@ref)\",\n\t)\n\t.option(\"--save\", \"Save to lockfile (default)\")\n\t.option(\n\t\t\"--agent <agents>\",\n\t\t'Comma-separated agents for symlinks (default: all agents, use \"none\" to skip)',\n\t)\n\t.option(\"-y, --yes\", \"Skip agent selection prompt and use defaults\")\n\t.action(async (specifiers, options) => {\n\t\tawait add(specifiers, {\n\t\t\tsave: options.save ?? true,\n\t\t\tagent: options.agent,\n\t\t\tyes: options.yes,\n\t\t});\n\t});\n\nprogram\n\t.command(\"remove <name>\")\n\t.alias(\"rm\")\n\t.description(\"Remove an installed skill\")\n\t.action(async (name) => {\n\t\tawait remove(name);\n\t});\n\nprogram\n\t.command(\"list\")\n\t.alias(\"ls\")\n\t.description(\"List installed skills\")\n\t.option(\"--json\", \"Output as JSON\")\n\t.action(async (options) => {\n\t\tawait list({ json: options.json });\n\t});\n\nprogram\n\t.command(\"install [specifiers...]\")\n\t.alias(\"i\")\n\t.description(\n\t\t\"Install skills from lockfile, or add and install specific packages\",\n\t)\n\t.option(\"--frozen-lockfile\", \"Fail if lockfile is missing or outdated\")\n\t.option(\"--dir <path>\", \"Install skills to a specific directory\")\n\t.option(\n\t\t\"--agent <agents>\",\n\t\t'Comma-separated agents for symlinks (default: all agents, use \"none\" to skip)',\n\t)\n\t.option(\"-y, --yes\", \"Skip agent selection prompt and use defaults\")\n\t.action(async (specifiers, options) => {\n\t\tawait install(specifiers, {\n\t\t\tfrozenLockfile: options.frozenLockfile,\n\t\t\tdir: options.dir,\n\t\t\tagent: options.agent,\n\t\t\tyes: options.yes,\n\t\t});\n\t});\n\nprogram\n\t.command(\"link\")\n\t.description(\"Recreate agent symlinks without reinstalling\")\n\t.option(\n\t\t\"--agent <agents>\",\n\t\t'Comma-separated agents for symlinks (default: all agents, use \"none\" to skip)',\n\t)\n\t.option(\"-y, --yes\", \"Skip agent selection prompt and use defaults\")\n\t.action(async (options) => {\n\t\tawait link({ agent: options.agent, yes: options.yes });\n\t});\n\nprogram\n\t.command(\"update\")\n\t.description(\"Update all skills to latest compatible versions\")\n\t.option(\"--dry-run\", \"Show what would be updated without making changes\")\n\t.action(async (options) => {\n\t\tawait update({ dryRun: options.dryRun });\n\t});\n\n// =============================================================================\n// Publishing commands\n// =============================================================================\n\nprogram\n\t.command(\"publish\")\n\t.description(\"Publish current directory as a skill\")\n\t.option(\"--bump <level>\", \"Bump version (major, minor, patch)\")\n\t.option(\"--tag <tag>\", \"Tag for the release\")\n\t.option(\"--access <level>\", \"Set package visibility (public or private)\")\n\t.action(async (options) => {\n\t\tawait publish({\n\t\t\tbump: options.bump as \"major\" | \"minor\" | \"patch\" | undefined,\n\t\t\ttag: options.tag,\n\t\t\taccess: options.access as \"public\" | \"private\" | undefined,\n\t\t});\n\t});\n\nprogram\n\t.command(\"unpublish <specifier>\")\n\t.description(\n\t\t\"Remove a published skill version (only within 72 hours of publishing)\",\n\t)\n\t.option(\"--force\", \"Confirm destructive action\")\n\t.action(async (specifier, options) => {\n\t\tawait unpublish(specifier, { force: options.force });\n\t});\n\nprogram\n\t.command(\"access [specifier]\")\n\t.description(\"Change package visibility (public/private)\")\n\t.option(\"--public\", \"Make the package public (irreversible)\")\n\t.option(\"--private\", \"Make the package private (only for private packages)\")\n\t.action(async (specifier, options) => {\n\t\tawait access(specifier, {\n\t\t\tpublic: options.public,\n\t\t\tprivate: options.private,\n\t\t});\n\t});\n\nprogram\n\t.command(\"deprecate <specifier> [message]\")\n\t.description(\n\t\t\"Mark a skill version as deprecated (alternative to unpublish after 72 hours)\",\n\t)\n\t.option(\"--undo\", \"Remove deprecation status\")\n\t.action(async (specifier, message, options) => {\n\t\tawait deprecate(specifier, message, { undo: options.undo });\n\t});\n\nprogram.parse();\n","import { changeSkillAccess, configure } from \"../api-client.js\";\nimport { getRegistryUrl, requireApiKey } from \"../config.js\";\nimport { parseSkillSpecifier } from \"../lib/index.js\";\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\n\t\tif (specifier) {\n\t\t\t// Parse the specifier to extract the package name\n\t\t\tconst parsed = parseSkillSpecifier(specifier);\n\t\t\tif (!parsed) {\n\t\t\t\tconsole.error(\n\t\t\t\t\t`Error: Invalid skill specifier \"${specifier}\". Use format: @user/{username}/{name}`,\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} 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// 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(packageName, { visibility });\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.js\";\nexport { type AddOptions, add } from \"./add.js\";\nexport {\n\ttype ConfigInitOptions,\n\tconfigInit,\n\tconfigShow,\n} from \"./config/index.js\";\nexport { type DeprecateOptions, deprecate } from \"./deprecate.js\";\nexport { type InitOptions, init } from \"./init.js\";\nexport { type InstallOptions, install } from \"./install.js\";\nexport { type LinkOptions, link } from \"./link.js\";\nexport { type ListOptions, list } from \"./list.js\";\nexport { type LoginOptions, login } from \"./login.js\";\nexport { logout } from \"./logout.js\";\nexport { type MigrateOptions, migrate } from \"./migrate.js\";\nexport { type PublishOptions, publish } from \"./publish.js\";\nexport { remove } from \"./remove.js\";\nexport { type UnpublishOptions, unpublish } from \"./unpublish.js\";\nexport { type UpdateOptions, update } from \"./update.js\";\nexport { whoami } from \"./whoami.js\";\n","import { stat, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\nexport interface ConfigInitOptions {\n\tregistry?: string;\n}\n\n/**\n * Create a .pspmrc file in the current directory (INI format)\n */\nexport async function configInit(options: ConfigInitOptions): Promise<void> {\n\ttry {\n\t\tconst configPath = join(process.cwd(), \".pspmrc\");\n\n\t\t// Check if file already exists\n\t\ttry {\n\t\t\tawait stat(configPath);\n\t\t\tconsole.error(\"Error: .pspmrc already exists in this directory.\");\n\t\t\tprocess.exit(1);\n\t\t} catch {\n\t\t\t// File doesn't exist, good\n\t\t}\n\n\t\t// Build INI content\n\t\tconst lines: string[] = [\"; Project-specific PSPM configuration\", \"\"];\n\n\t\tif (options.registry) {\n\t\t\tlines.push(`registry = ${options.registry}`);\n\t\t} else {\n\t\t\tlines.push(\"; Uncomment to use a custom registry:\");\n\t\t\tlines.push(\"; registry = https://custom-registry.example.com\");\n\t\t}\n\n\t\tlines.push(\"\");\n\n\t\t// Write the file\n\t\tawait writeFile(configPath, lines.join(\"\\n\"));\n\n\t\tconsole.log(\"Created .pspmrc\");\n\t\tconsole.log(\"\");\n\t\tconsole.log(\"Contents:\");\n\t\tconsole.log(lines.join(\"\\n\"));\n\t\tconsole.log(\"Note: .pspmrc should be committed to version control.\");\n\t\tconsole.log(\"API keys should NOT be stored here - use pspm login instead.\");\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : \"Unknown error\";\n\t\tconsole.error(`Error: ${message}`);\n\t\tprocess.exit(1);\n\t}\n}\n","import {\n\tfindProjectConfig,\n\tgetConfigPath,\n\tresolveConfig,\n} from \"../../config.js\";\n\n/**\n * Show resolved configuration\n */\nexport async function configShow(): Promise<void> {\n\ttry {\n\t\tconst resolved = await resolveConfig();\n\t\tconst projectConfig = await findProjectConfig();\n\t\tconst configPath = getConfigPath();\n\n\t\tconsole.log(\"Resolved Configuration:\\n\");\n\t\tconsole.log(` Registry URL: ${resolved.registryUrl}`);\n\t\tconsole.log(` API Key: ${resolved.apiKey ? \"***\" : \"(not set)\"}`);\n\t\tconsole.log(` Username: ${resolved.username || \"(not set)\"}`);\n\t\tconsole.log(\"\");\n\t\tconsole.log(\"Config Locations:\");\n\t\tconsole.log(` User config: ${configPath}`);\n\t\tconsole.log(` Project config: ${projectConfig ? \".pspmrc\" : \"(none)\"}`);\n\t\tconsole.log(\"\");\n\t\tconsole.log(\"Environment Variables:\");\n\t\tconsole.log(\n\t\t\t` PSPM_REGISTRY_URL: ${process.env.PSPM_REGISTRY_URL || \"(not set)\"}`,\n\t\t);\n\t\tconsole.log(\n\t\t\t` PSPM_API_KEY: ${process.env.PSPM_API_KEY ? \"***\" : \"(not set)\"}`,\n\t\t);\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : \"Unknown error\";\n\t\tconsole.error(`Error: ${message}`);\n\t\tprocess.exit(1);\n\t}\n}\n","import {\n\tconfigure,\n\tdeprecateSkillVersion,\n\tundeprecateSkillVersion,\n} from \"../api-client.js\";\nimport { getRegistryUrl, requireApiKey } from \"../config.js\";\nimport { parseSkillSpecifier } from \"../lib/index.js\";\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(name, versionRange);\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(name, versionRange, message);\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.js\";\n\nexport interface InitOptions {\n\tname?: string;\n\tdescription?: string;\n\tauthor?: string;\n\tyes?: boolean;\n\tforce?: boolean;\n}\n\n/**\n * Simple readline prompt that mimics npm's style\n */\nfunction prompt(\n\trl: ReturnType<typeof createInterface>,\n\tquestion: string,\n\tdefaultValue: string,\n): Promise<string> {\n\treturn new Promise((resolve) => {\n\t\tconst displayDefault = defaultValue ? ` (${defaultValue})` : \"\";\n\t\trl.question(`${question}${displayDefault} `, (answer) => {\n\t\t\tresolve(answer.trim() || defaultValue);\n\t\t});\n\t});\n}\n\n/**\n * Try to read existing package.json to extract some defaults\n */\nasync function readExistingPackageJson(): Promise<Partial<PspmManifest> | null> {\n\ttry {\n\t\tconst content = await readFile(\n\t\t\tjoin(process.cwd(), \"package.json\"),\n\t\t\t\"utf-8\",\n\t\t);\n\t\tconst pkg = JSON.parse(content);\n\t\treturn {\n\t\t\tname: pkg.name,\n\t\t\tversion: pkg.version,\n\t\t\tdescription: pkg.description,\n\t\t\tauthor: typeof pkg.author === \"string\" ? pkg.author : pkg.author?.name,\n\t\t\tlicense: pkg.license,\n\t\t};\n\t} catch {\n\t\treturn null;\n\t}\n}\n\n/**\n * Try to detect author from git config\n */\nasync function getGitAuthor(): Promise<string | null> {\n\ttry {\n\t\tconst { exec } = await import(\"node:child_process\");\n\t\tconst { promisify } = await import(\"node:util\");\n\t\tconst execAsync = promisify(exec);\n\n\t\tconst [nameResult, emailResult] = await Promise.all([\n\t\t\texecAsync(\"git config user.name\").catch(() => ({ stdout: \"\" })),\n\t\t\texecAsync(\"git config user.email\").catch(() => ({ stdout: \"\" })),\n\t\t]);\n\n\t\tconst name = nameResult.stdout.trim();\n\t\tconst email = emailResult.stdout.trim();\n\n\t\tif (name && email) {\n\t\t\treturn `${name} <${email}>`;\n\t\t}\n\t\tif (name) {\n\t\t\treturn name;\n\t\t}\n\t\treturn null;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\n/**\n * Sanitize a name for use as skill name\n * - Remove @ prefix and scope\n * - Convert to lowercase\n * - Replace invalid characters with hyphens\n */\nfunction sanitizeName(name: string): string {\n\t// Remove npm scope if present (e.g., @user/package -> package)\n\tconst withoutScope = name.replace(/^@[^/]+\\//, \"\");\n\t// Lowercase and replace invalid chars\n\treturn withoutScope\n\t\t.toLowerCase()\n\t\t.replace(/[^a-z0-9_-]/g, \"-\")\n\t\t.replace(/^-+|-+$/g, \"\")\n\t\t.replace(/-+/g, \"-\");\n}\n\n/**\n * Validate skill name format\n */\nfunction isValidName(name: string): boolean {\n\treturn /^[a-z][a-z0-9_-]*$/.test(name);\n}\n\n/**\n * Validate semver format\n */\nfunction isValidVersion(version: string): boolean {\n\treturn /^\\d+\\.\\d+\\.\\d+(-[a-zA-Z0-9.-]+)?(\\+[a-zA-Z0-9.-]+)?$/.test(version);\n}\n\n/**\n * Initialize a new pspm.json manifest in the current directory\n */\nexport async function init(options: InitOptions): Promise<void> {\n\ttry {\n\t\tconst pspmJsonPath = join(process.cwd(), \"pspm.json\");\n\n\t\t// Check if pspm.json already exists\n\t\tlet exists = false;\n\t\ttry {\n\t\t\tawait stat(pspmJsonPath);\n\t\t\texists = true;\n\t\t} catch {\n\t\t\t// File doesn't exist, good\n\t\t}\n\n\t\tif (exists && !options.force) {\n\t\t\tconsole.error(\"Error: pspm.json already exists in this directory.\");\n\t\t\tconsole.error(\"Use --force to overwrite.\");\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\t// Try to read defaults from existing package.json and git\n\t\tconst existingPkg = await readExistingPackageJson();\n\t\tconst gitAuthor = await getGitAuthor();\n\n\t\t// Determine default values\n\t\tconst defaultName = sanitizeName(\n\t\t\toptions.name || existingPkg?.name || basename(process.cwd()),\n\t\t);\n\t\tconst defaultVersion = existingPkg?.version || \"0.1.0\";\n\t\tconst defaultDescription =\n\t\t\toptions.description || existingPkg?.description || \"\";\n\t\tconst defaultAuthor =\n\t\t\toptions.author || existingPkg?.author || gitAuthor || \"\";\n\t\tconst defaultLicense = existingPkg?.license || \"MIT\";\n\t\tconst defaultMain = \"SKILL.md\";\n\t\tconst defaultCapabilities = \"\";\n\n\t\tlet manifest: PspmManifest;\n\n\t\tif (options.yes) {\n\t\t\t// Non-interactive mode: use all defaults\n\t\t\tmanifest = {\n\t\t\t\t$schema: PSPM_SCHEMA_URL,\n\t\t\t\tname: defaultName,\n\t\t\t\tversion: defaultVersion,\n\t\t\t\tdescription: defaultDescription || undefined,\n\t\t\t\tauthor: defaultAuthor || undefined,\n\t\t\t\tlicense: defaultLicense,\n\t\t\t\ttype: \"skill\",\n\t\t\t\tcapabilities: [],\n\t\t\t\tmain: defaultMain,\n\t\t\t\trequirements: {\n\t\t\t\t\tpspm: \">=0.1.0\",\n\t\t\t\t},\n\t\t\t\tfiles: [...DEFAULT_SKILL_FILES],\n\t\t\t\tdependencies: {},\n\t\t\t\tprivate: false,\n\t\t\t};\n\t\t} else {\n\t\t\t// Interactive mode: prompt for each field\n\t\t\tconsole.log(\n\t\t\t\t\"This utility will walk you through creating a pspm.json file.\",\n\t\t\t);\n\t\t\tconsole.log(\n\t\t\t\t\"It only covers the most common items, and tries to guess sensible defaults.\",\n\t\t\t);\n\t\t\tconsole.log(\"\");\n\t\t\tconsole.log(\n\t\t\t\t\"See `pspm init --help` for definitive documentation on these fields\",\n\t\t\t);\n\t\t\tconsole.log(\"and exactly what they do.\");\n\t\t\tconsole.log(\"\");\n\t\t\tconsole.log(\"Press ^C at any time to quit.\");\n\n\t\t\tconst rl = createInterface({\n\t\t\t\tinput: process.stdin,\n\t\t\t\toutput: process.stdout,\n\t\t\t});\n\n\t\t\ttry {\n\t\t\t\t// Prompt for each field\n\t\t\t\tlet name = await prompt(rl, \"skill name:\", defaultName);\n\n\t\t\t\t// Validate name and re-prompt if invalid\n\t\t\t\twhile (!isValidName(name)) {\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\" Name must start with a lowercase letter and contain only lowercase letters, numbers, hyphens, and underscores.\",\n\t\t\t\t\t);\n\t\t\t\t\tname = await prompt(rl, \"skill name:\", sanitizeName(name));\n\t\t\t\t}\n\n\t\t\t\tlet version = await prompt(rl, \"version:\", defaultVersion);\n\n\t\t\t\t// Validate version and re-prompt if invalid\n\t\t\t\twhile (!isValidVersion(version)) {\n\t\t\t\t\tconsole.log(\" Version must be valid semver (e.g., 1.0.0)\");\n\t\t\t\t\tversion = await prompt(rl, \"version:\", \"0.1.0\");\n\t\t\t\t}\n\n\t\t\t\tconst description = await prompt(\n\t\t\t\t\trl,\n\t\t\t\t\t\"description:\",\n\t\t\t\t\tdefaultDescription,\n\t\t\t\t);\n\t\t\t\tconst main = await prompt(rl, \"entry point:\", defaultMain);\n\t\t\t\tconst capabilitiesStr = await prompt(\n\t\t\t\t\trl,\n\t\t\t\t\t\"capabilities (comma-separated):\",\n\t\t\t\t\tdefaultCapabilities,\n\t\t\t\t);\n\t\t\t\tconst author = await prompt(rl, \"author:\", defaultAuthor);\n\t\t\t\tconst license = await prompt(rl, \"license:\", defaultLicense);\n\n\t\t\t\trl.close();\n\n\t\t\t\t// Parse capabilities\n\t\t\t\tconst capabilities = capabilitiesStr\n\t\t\t\t\t? capabilitiesStr\n\t\t\t\t\t\t\t.split(\",\")\n\t\t\t\t\t\t\t.map((s) => s.trim())\n\t\t\t\t\t\t\t.filter(Boolean)\n\t\t\t\t\t: [];\n\n\t\t\t\tmanifest = {\n\t\t\t\t\t$schema: PSPM_SCHEMA_URL,\n\t\t\t\t\tname,\n\t\t\t\t\tversion,\n\t\t\t\t\tdescription: description || undefined,\n\t\t\t\t\tauthor: author || undefined,\n\t\t\t\t\tlicense,\n\t\t\t\t\ttype: \"skill\",\n\t\t\t\t\tcapabilities,\n\t\t\t\t\tmain,\n\t\t\t\t\trequirements: {\n\t\t\t\t\t\tpspm: \">=0.1.0\",\n\t\t\t\t\t},\n\t\t\t\t\tfiles: [...DEFAULT_SKILL_FILES],\n\t\t\t\t\tdependencies: {},\n\t\t\t\t\tprivate: false,\n\t\t\t\t};\n\t\t\t} catch (error) {\n\t\t\t\trl.close();\n\t\t\t\t// User pressed Ctrl+C\n\t\t\t\tif (\n\t\t\t\t\terror instanceof Error &&\n\t\t\t\t\terror.message.includes(\"readline was closed\")\n\t\t\t\t) {\n\t\t\t\t\tconsole.log(\"\\nAborted.\");\n\t\t\t\t\tprocess.exit(0);\n\t\t\t\t}\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t}\n\n\t\t// Remove undefined/empty fields for cleaner output\n\t\tif (!manifest.description) manifest.description = undefined;\n\t\tif (!manifest.author) manifest.author = undefined;\n\t\tif (manifest.capabilities?.length === 0) manifest.capabilities = undefined;\n\n\t\t// Show preview\n\t\tconst content = JSON.stringify(manifest, null, 2);\n\n\t\tconsole.log(\"\");\n\t\tconsole.log(`About to write to ${pspmJsonPath}:`);\n\t\tconsole.log(\"\");\n\t\tconsole.log(content);\n\t\tconsole.log(\"\");\n\n\t\t// In interactive mode, confirm before writing\n\t\tif (!options.yes) {\n\t\t\tconst rl = createInterface({\n\t\t\t\tinput: process.stdin,\n\t\t\t\toutput: process.stdout,\n\t\t\t});\n\n\t\t\tconst confirm = await prompt(rl, \"Is this OK?\", \"yes\");\n\t\t\trl.close();\n\n\t\t\tif (confirm.toLowerCase() !== \"yes\" && confirm.toLowerCase() !== \"y\") {\n\t\t\t\tconsole.log(\"Aborted.\");\n\t\t\t\tprocess.exit(0);\n\t\t\t}\n\t\t}\n\n\t\t// Write the manifest\n\t\tawait writeFile(pspmJsonPath, `${content}\\n`);\n\n\t\t// Check if SKILL.md exists\n\t\ttry {\n\t\t\tawait stat(join(process.cwd(), \"SKILL.md\"));\n\t\t} catch {\n\t\t\tconsole.log(\n\t\t\t\t\"Note: Create a SKILL.md file with your skill's prompt content.\",\n\t\t\t);\n\t\t}\n\n\t\tif (existingPkg) {\n\t\t\tconsole.log(\"Note: Values were derived from existing package.json.\");\n\t\t\tconsole.log(\" pspm.json is for publishing to PSPM registry.\");\n\t\t\tconsole.log(\" package.json can still be used for npm dependencies.\");\n\t\t}\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : \"Unknown error\";\n\t\tconsole.error(`Error: ${message}`);\n\t\tprocess.exit(1);\n\t}\n}\n","import { createHash } from \"node:crypto\";\nimport { mkdir, readFile, rm, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { parseAgentArg, promptForAgents } from \"../agents.js\";\nimport {\n\tconfigure,\n\tgetSkillVersion,\n\tlistSkillVersions,\n} from \"../api-client.js\";\nimport {\n\tgetCacheDir,\n\tgetSkillsDir,\n\tgetTokenForRegistry,\n\tresolveConfig,\n} from \"../config.js\";\nimport { extractApiErrorMessage } from \"../errors.js\";\nimport {\n\tdownloadGitHubPackage,\n\textractGitHubPackage,\n\tGitHubNotFoundError,\n\tGitHubPathNotFoundError,\n\tGitHubRateLimitError,\n\tgetGitHubDisplayName,\n} from \"../github.js\";\nimport {\n\tcalculateIntegrity,\n\ttype GitHubLockfileEntry,\n\tgetGitHubSkillName,\n\ttype PspmLockfileEntry,\n\tparseGitHubSpecifier,\n\tparseSkillSpecifier,\n\tresolveVersion,\n} from \"../lib/index.js\";\nimport {\n\taddGitHubToLockfile,\n\taddToLockfile,\n\tmigrateLockfileIfNeeded,\n\treadLockfile,\n} from \"../lockfile.js\";\nimport {\n\tgetDependencies,\n\tgetGitHubDependencies,\n\treadManifest,\n} from \"../manifest.js\";\nimport {\n\tcreateAgentSymlinks,\n\tgetGitHubSkillPath,\n\tgetRegistrySkillPath,\n\ttype SkillInfo,\n} from \"../symlinks.js\";\n\n/**\n * Get cache file path from integrity hash\n */\nfunction getCacheFilePath(cacheDir: string, integrity: string): string {\n\t// integrity is \"sha256-{base64hash}\"\n\t// Convert to safe filename: sha256-{hex}.tgz\n\tconst match = integrity.match(/^sha256-(.+)$/);\n\tif (!match) {\n\t\tthrow new Error(`Invalid integrity format: ${integrity}`);\n\t}\n\t// Convert base64 to hex for safe filename\n\tconst base64Hash = match[1];\n\tconst hexHash = Buffer.from(base64Hash, \"base64\").toString(\"hex\");\n\treturn join(cacheDir, `sha256-${hexHash}.tgz`);\n}\n\n/**\n * Try to read tarball from cache\n */\nasync function readFromCache(\n\tcacheDir: string,\n\tintegrity: string,\n): Promise<Buffer | null> {\n\ttry {\n\t\tconst cachePath = getCacheFilePath(cacheDir, integrity);\n\t\tconst data = await readFile(cachePath);\n\n\t\t// Verify integrity\n\t\tconst actualIntegrity = `sha256-${createHash(\"sha256\").update(data).digest(\"base64\")}`;\n\t\tif (actualIntegrity !== integrity) {\n\t\t\t// Cache corrupted, remove it\n\t\t\tawait rm(cachePath, { force: true });\n\t\t\treturn null;\n\t\t}\n\n\t\treturn data;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\n/**\n * Write tarball to cache\n */\nasync function writeToCache(\n\tcacheDir: string,\n\tintegrity: string,\n\tdata: Buffer,\n): Promise<void> {\n\ttry {\n\t\tawait mkdir(cacheDir, { recursive: true });\n\t\tconst cachePath = getCacheFilePath(cacheDir, integrity);\n\t\tawait writeFile(cachePath, data);\n\t} catch {\n\t\t// Cache write failures are non-fatal\n\t}\n}\n\nexport interface InstallOptions {\n\tfrozenLockfile?: boolean;\n\tdir?: string;\n\tagent?: string;\n\tyes?: boolean;\n}\n\nexport async function install(\n\tspecifiers: string[],\n\toptions: InstallOptions,\n): Promise<void> {\n\t// If specifiers are provided, delegate to add command\n\tif (specifiers.length > 0) {\n\t\tconst { add } = await import(\"./add.js\");\n\t\tawait add(specifiers, {\n\t\t\tsave: true,\n\t\t\tagent: options.agent,\n\t\t\tyes: options.yes,\n\t\t});\n\t\treturn;\n\t}\n\n\t// Otherwise, install from lockfile\n\tawait installFromLockfile(options);\n}\n\nasync function installFromLockfile(options: InstallOptions): Promise<void> {\n\ttry {\n\t\t// Get config - auth may be optional for public packages\n\t\tconst config = await resolveConfig();\n\t\tconst registryUrl = config.registryUrl;\n\t\tconst apiKey = getTokenForRegistry(config, registryUrl);\n\t\tconst skillsDir = options.dir || getSkillsDir();\n\t\tconst cacheDir = getCacheDir();\n\n\t\t// Migrate legacy lockfile if needed\n\t\tawait migrateLockfileIfNeeded();\n\n\t\t// Read lockfile and dependencies from pspm.json\n\t\tlet lockfile = await readLockfile();\n\t\tconst manifestDeps = await getDependencies();\n\t\tconst manifestGitHubDeps = await getGitHubDependencies();\n\t\tconst lockfilePackages = lockfile?.packages ?? lockfile?.skills ?? {};\n\t\tconst lockfileGitHubPackages = lockfile?.githubPackages ?? {};\n\n\t\t// Track all installed skills for symlink creation\n\t\tconst installedSkills: SkillInfo[] = [];\n\n\t\t// =================================================================\n\t\t// Phase 1: Resolve missing registry dependencies\n\t\t// =================================================================\n\t\tconst missingDeps: Array<{ fullName: string; versionRange: string }> = [];\n\t\tfor (const [fullName, versionRange] of Object.entries(manifestDeps)) {\n\t\t\tif (!lockfilePackages[fullName]) {\n\t\t\t\tmissingDeps.push({ fullName, versionRange });\n\t\t\t}\n\t\t}\n\n\t\tif (missingDeps.length > 0) {\n\t\t\tif (options.frozenLockfile) {\n\t\t\t\tconsole.error(\n\t\t\t\t\t\"Error: Dependencies in pspm.json are not in lockfile. Cannot install with --frozen-lockfile\",\n\t\t\t\t);\n\t\t\t\tconsole.error(\"Missing dependencies:\");\n\t\t\t\tfor (const dep of missingDeps) {\n\t\t\t\t\tconsole.error(` - ${dep.fullName}@${dep.versionRange}`);\n\t\t\t\t}\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\n\t\t\tconsole.log(`Resolving ${missingDeps.length} new dependency(ies)...\\n`);\n\t\t\tconfigure({ registryUrl, apiKey: 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\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\tconst entries = Object.entries(packages) as [string, PspmLockfileEntry][];\n\n\t\t\tfor (const [fullName, entry] of entries) {\n\t\t\t\tconst match = fullName.match(/^@user\\/([^/]+)\\/([^/]+)$/);\n\t\t\t\tif (!match) {\n\t\t\t\t\tconsole.warn(`Warning: Invalid skill name in lockfile: ${fullName}`);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst [, username, name] = match;\n\t\t\t\tconsole.log(`Installing ${fullName}@${entry.version}...`);\n\n\t\t\t\tlet tarballBuffer: Buffer;\n\t\t\t\tlet fromCache = false;\n\n\t\t\t\t// Try to read from cache first\n\t\t\t\tconst cachedTarball = await readFromCache(cacheDir, entry.integrity);\n\t\t\t\tif (cachedTarball) {\n\t\t\t\t\ttarballBuffer = cachedTarball;\n\t\t\t\t\tfromCache = true;\n\t\t\t\t} else {\n\t\t\t\t\t// Download the tarball\n\t\t\t\t\tconst isPresignedUrl =\n\t\t\t\t\t\tentry.resolved.includes(\".r2.cloudflarestorage.com\") ||\n\t\t\t\t\t\tentry.resolved.includes(\"X-Amz-Signature\");\n\n\t\t\t\t\tconst downloadHeaders: Record<string, string> = {};\n\t\t\t\t\tif (!isPresignedUrl && apiKey) {\n\t\t\t\t\t\tdownloadHeaders.Authorization = `Bearer ${apiKey}`;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst response = await fetch(entry.resolved, {\n\t\t\t\t\t\theaders: downloadHeaders,\n\t\t\t\t\t\tredirect: \"follow\",\n\t\t\t\t\t});\n\n\t\t\t\t\tif (!response.ok) {\n\t\t\t\t\t\tif (response.status === 401) {\n\t\t\t\t\t\t\tif (!apiKey) {\n\t\t\t\t\t\t\t\tconsole.error(\n\t\t\t\t\t\t\t\t\t` Error: ${fullName} requires authentication. Run 'pspm login' first.`,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tconsole.error(\n\t\t\t\t\t\t\t\t\t` Error: Access denied to ${fullName}. You may not have permission to access this private package.`,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconsole.error(\n\t\t\t\t\t\t\t\t` Error: Failed to download ${fullName} (${response.status})`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\ttarballBuffer = Buffer.from(await response.arrayBuffer());\n\n\t\t\t\t\t// Verify checksum\n\t\t\t\t\tconst actualIntegrity = `sha256-${createHash(\"sha256\").update(tarballBuffer).digest(\"base64\")}`;\n\n\t\t\t\t\tif (actualIntegrity !== entry.integrity) {\n\t\t\t\t\t\tconsole.error(\n\t\t\t\t\t\t\t` Error: Checksum verification failed for ${fullName}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (options.frozenLockfile) {\n\t\t\t\t\t\t\tprocess.exit(1);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Cache the verified tarball\n\t\t\t\t\tawait writeToCache(cacheDir, entry.integrity, tarballBuffer);\n\t\t\t\t}\n\n\t\t\t\t// Extract tarball\n\t\t\t\tconst destDir = join(skillsDir, username, name);\n\t\t\t\tawait rm(destDir, { recursive: true, force: true });\n\t\t\t\tawait mkdir(destDir, { recursive: true });\n\n\t\t\t\tconst tempFile = join(destDir, \".temp.tgz\");\n\t\t\t\tawait writeFile(tempFile, tarballBuffer);\n\n\t\t\t\tconst { exec } = await import(\"node:child_process\");\n\t\t\t\tconst { promisify } = await import(\"node:util\");\n\t\t\t\tconst execAsync = promisify(exec);\n\n\t\t\t\ttry {\n\t\t\t\t\tawait execAsync(\n\t\t\t\t\t\t`tar -xzf \"${tempFile}\" -C \"${destDir}\" --strip-components=1`,\n\t\t\t\t\t);\n\t\t\t\t} finally {\n\t\t\t\t\tawait rm(tempFile, { force: true });\n\t\t\t\t}\n\n\t\t\t\tconsole.log(\n\t\t\t\t\t` Installed to ${destDir}${fromCache ? \" (from cache)\" : \"\"}`,\n\t\t\t\t);\n\n\t\t\t\t// Track for symlinks\n\t\t\t\tinstalledSkills.push({\n\t\t\t\t\tname,\n\t\t\t\t\tsourcePath: getRegistrySkillPath(username, name),\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\t// =================================================================\n\t\t// Phase 4: Install GitHub packages from lockfile\n\t\t// =================================================================\n\t\tconst githubPackages = lockfile?.githubPackages ?? {};\n\t\tconst githubCount = Object.keys(githubPackages).length;\n\n\t\tif (githubCount > 0) {\n\t\t\tconsole.log(`\\nInstalling ${githubCount} GitHub skill(s)...\\n`);\n\n\t\t\tfor (const [specifier, entry] of Object.entries(githubPackages)) {\n\t\t\t\tconst parsed = parseGitHubSpecifier(specifier);\n\t\t\t\tif (!parsed) {\n\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\t`Warning: Invalid GitHub specifier in lockfile: ${specifier}`,\n\t\t\t\t\t);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst ghEntry = entry as GitHubLockfileEntry;\n\t\t\t\tconsole.log(\n\t\t\t\t\t`Installing ${specifier} (${ghEntry.gitRef}@${ghEntry.gitCommit.slice(0, 7)})...`,\n\t\t\t\t);\n\n\t\t\t\tlet tarballBuffer: Buffer;\n\t\t\t\tlet fromCache = false;\n\n\t\t\t\t// Try to read from cache first\n\t\t\t\tconst cachedTarball = await readFromCache(cacheDir, ghEntry.integrity);\n\t\t\t\tif (cachedTarball) {\n\t\t\t\t\ttarballBuffer = cachedTarball;\n\t\t\t\t\tfromCache = true;\n\t\t\t\t} else {\n\t\t\t\t\t// Download from GitHub\n\t\t\t\t\ttry {\n\t\t\t\t\t\t// Use the locked commit\n\t\t\t\t\t\tconst specWithCommit = { ...parsed, ref: ghEntry.gitCommit };\n\t\t\t\t\t\tconst result = await downloadGitHubPackage(specWithCommit);\n\t\t\t\t\t\ttarballBuffer = result.buffer;\n\n\t\t\t\t\t\t// Verify integrity\n\t\t\t\t\t\tif (result.integrity !== ghEntry.integrity) {\n\t\t\t\t\t\t\tconsole.error(\n\t\t\t\t\t\t\t\t` Error: Checksum verification failed for ${specifier}`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tif (options.frozenLockfile) {\n\t\t\t\t\t\t\t\tprocess.exit(1);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Cache the verified tarball\n\t\t\t\t\t\tawait writeToCache(cacheDir, ghEntry.integrity, tarballBuffer);\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tif (error instanceof GitHubRateLimitError) {\n\t\t\t\t\t\t\tconsole.error(` Error: ${error.message}`);\n\t\t\t\t\t\t} else if (error instanceof GitHubPathNotFoundError) {\n\t\t\t\t\t\t\tconsole.error(` Error: ${error.message}`);\n\t\t\t\t\t\t} else if (error instanceof GitHubNotFoundError) {\n\t\t\t\t\t\t\tconsole.error(` Error: ${error.message}`);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconst message =\n\t\t\t\t\t\t\t\terror instanceof Error ? error.message : String(error);\n\t\t\t\t\t\t\tconsole.error(` Error downloading ${specifier}: ${message}`);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Extract the package\n\t\t\t\ttry {\n\t\t\t\t\tconst destPath = await extractGitHubPackage(\n\t\t\t\t\t\tparsed,\n\t\t\t\t\t\ttarballBuffer,\n\t\t\t\t\t\tskillsDir,\n\t\t\t\t\t);\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t` Installed to ${destPath}${fromCache ? \" (from cache)\" : \"\"}`,\n\t\t\t\t\t);\n\n\t\t\t\t\t// Track for symlinks\n\t\t\t\t\tconst skillName = getGitHubSkillName(parsed);\n\t\t\t\t\tinstalledSkills.push({\n\t\t\t\t\t\tname: skillName,\n\t\t\t\t\t\tsourcePath: getGitHubSkillPath(\n\t\t\t\t\t\t\tparsed.owner,\n\t\t\t\t\t\t\tparsed.repo,\n\t\t\t\t\t\t\tparsed.path,\n\t\t\t\t\t\t),\n\t\t\t\t\t});\n\t\t\t\t} catch (error) {\n\t\t\t\t\tconst message =\n\t\t\t\t\t\terror instanceof Error ? error.message : String(error);\n\t\t\t\t\tconsole.error(` Error extracting ${specifier}: ${message}`);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// =================================================================\n\t\t// Phase 5: Create agent symlinks\n\t\t// =================================================================\n\t\tif (installedSkills.length > 0 && agents[0] !== \"none\") {\n\t\t\tconsole.log(`\\nCreating symlinks for agent(s): ${agents.join(\", \")}...`);\n\n\t\t\tawait createAgentSymlinks(installedSkills, {\n\t\t\t\tagents,\n\t\t\t\tprojectRoot: process.cwd(),\n\t\t\t\tagentConfigs,\n\t\t\t});\n\n\t\t\tconsole.log(\" Symlinks created.\");\n\t\t}\n\n\t\t// =================================================================\n\t\t// Summary\n\t\t// =================================================================\n\t\tconst totalCount = packageCount + githubCount;\n\t\tif (totalCount === 0) {\n\t\t\tconsole.log(\"No skills to install.\");\n\t\t} else {\n\t\t\tconsole.log(`\\nAll ${totalCount} skill(s) installed.`);\n\t\t}\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : \"Unknown error\";\n\t\tconsole.error(`Error: ${message}`);\n\t\tprocess.exit(1);\n\t}\n}\n","/**\n * Link command - Recreate agent symlinks without reinstalling.\n *\n * Useful after:\n * - Adding new agents to pspm.json\n * - Changing agent configuration\n * - Recovering from accidentally deleted symlinks\n */\n\nimport { parseAgentArg, promptForAgents } from \"../agents.js\";\nimport {\n\tgetGitHubSkillName,\n\tparseGitHubSpecifier,\n\tparseSkillSpecifier,\n} from \"../lib/index.js\";\nimport { listLockfileGitHubPackages, listLockfileSkills } from \"../lockfile.js\";\nimport { readManifest } from \"../manifest.js\";\nimport {\n\tcreateAgentSymlinks,\n\tgetGitHubSkillPath,\n\tgetRegistrySkillPath,\n\ttype SkillInfo,\n} from \"../symlinks.js\";\n\nexport interface LinkOptions {\n\tagent?: string;\n\tyes?: boolean;\n}\n\nexport async function link(options: LinkOptions): Promise<void> {\n\ttry {\n\t\t// Read manifest for agent config overrides\n\t\tconst manifest = await readManifest();\n\t\tconst agentConfigs = manifest?.agents;\n\n\t\t// Determine which agents to use\n\t\tlet agents: string[];\n\t\tif (options.agent) {\n\t\t\t// If --agent flag is provided, use it\n\t\t\tagents = parseAgentArg(options.agent);\n\t\t} else if (manifest) {\n\t\t\t// If pspm.json exists, use default agent (respect manifest's agent config)\n\t\t\tagents = parseAgentArg(undefined);\n\t\t} else if (options.yes) {\n\t\t\t// If -y flag is used, use default agent without prompting\n\t\t\tagents = parseAgentArg(undefined);\n\t\t} else {\n\t\t\t// No pspm.json exists, prompt user to select agents\n\t\t\tconsole.log(\"No pspm.json found. Let's set up your project.\\n\");\n\t\t\tagents = await promptForAgents();\n\t\t}\n\n\t\t// Skip if \"none\" agent\n\t\tif (agents.length === 1 && agents[0] === \"none\") {\n\t\t\tconsole.log(\"Skipping symlink creation (--agent none)\");\n\t\t\treturn;\n\t\t}\n\n\t\t// Collect all installed skills\n\t\tconst skills: SkillInfo[] = [];\n\n\t\t// Get registry skills from lockfile\n\t\tconst registrySkills = await listLockfileSkills();\n\t\tfor (const { name } of registrySkills) {\n\t\t\tconst parsed = parseSkillSpecifier(name);\n\t\t\tif (!parsed) {\n\t\t\t\tconsole.warn(`Warning: Invalid skill name in lockfile: ${name}`);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tskills.push({\n\t\t\t\tname: parsed.name,\n\t\t\t\tsourcePath: getRegistrySkillPath(parsed.username, parsed.name),\n\t\t\t});\n\t\t}\n\n\t\t// Get GitHub skills from lockfile\n\t\tconst githubSkills = await listLockfileGitHubPackages();\n\t\tfor (const { specifier } of githubSkills) {\n\t\t\tconst parsed = parseGitHubSpecifier(specifier);\n\t\t\tif (!parsed) {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t`Warning: Invalid GitHub specifier in lockfile: ${specifier}`,\n\t\t\t\t);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst skillName = getGitHubSkillName(parsed);\n\t\t\tskills.push({\n\t\t\t\tname: skillName,\n\t\t\t\tsourcePath: getGitHubSkillPath(parsed.owner, parsed.repo, parsed.path),\n\t\t\t});\n\t\t}\n\n\t\tif (skills.length === 0) {\n\t\t\tconsole.log(\"No skills found in lockfile. Nothing to link.\");\n\t\t\treturn;\n\t\t}\n\n\t\tconsole.log(\n\t\t\t`Creating symlinks for ${skills.length} skill(s) to agent(s): ${agents.join(\", \")}...`,\n\t\t);\n\n\t\tawait createAgentSymlinks(skills, {\n\t\t\tagents,\n\t\t\tprojectRoot: process.cwd(),\n\t\t\tagentConfigs,\n\t\t});\n\n\t\tconsole.log(\"Symlinks created successfully.\");\n\n\t\t// List created symlinks\n\t\tconsole.log(\"\\nLinked skills:\");\n\t\tfor (const skill of skills) {\n\t\t\tconsole.log(` ${skill.name} -> ${skill.sourcePath}`);\n\t\t}\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : \"Unknown error\";\n\t\tconsole.error(`Error: ${message}`);\n\t\tprocess.exit(1);\n\t}\n}\n","/**\n * List command - Show installed skills.\n *\n * Displays:\n * - Registry and GitHub skills\n * - Source type\n * - Version / commit info\n * - Linked agent paths\n */\n\nimport { access } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { getAvailableAgents, resolveAgentConfig } from \"../agents.js\";\nimport {\n\ttype GitHubLockfileEntry,\n\tgetGitHubSkillName,\n\tparseGitHubSpecifier,\n} from \"../lib/index.js\";\nimport { listLockfileGitHubPackages, listLockfileSkills } from \"../lockfile.js\";\nimport { readManifest } from \"../manifest.js\";\nimport {\n\tgetGitHubSkillPath,\n\tgetLinkedAgents,\n\tgetRegistrySkillPath,\n} from \"../symlinks.js\";\n\nexport interface ListOptions {\n\tjson?: boolean;\n}\n\ninterface SkillListItem {\n\tname: string;\n\tfullName: string;\n\tversion: string;\n\tsource: \"registry\" | \"github\";\n\tsourcePath: string;\n\tstatus: \"installed\" | \"missing\";\n\tlinkedAgents: string[];\n\tgitRef?: string;\n\tgitCommit?: string;\n}\n\nexport async function list(options: ListOptions): Promise<void> {\n\ttry {\n\t\t// Get all skills from lockfile\n\t\tconst registrySkills = await listLockfileSkills();\n\t\tconst githubSkills = await listLockfileGitHubPackages();\n\n\t\t// Read manifest for agent configs\n\t\tconst manifest = await readManifest();\n\t\tconst agentConfigs = manifest?.agents;\n\t\tconst availableAgents = getAvailableAgents(agentConfigs);\n\t\tconst projectRoot = process.cwd();\n\n\t\t// Build list of all skills\n\t\tconst skills: SkillListItem[] = [];\n\n\t\t// Add registry skills\n\t\tfor (const { name: fullName, entry } of registrySkills) {\n\t\t\tconst match = fullName.match(/^@user\\/([^/]+)\\/([^/]+)$/);\n\t\t\tif (!match) continue;\n\n\t\t\tconst [, username, skillName] = match;\n\t\t\tconst sourcePath = getRegistrySkillPath(username, skillName);\n\t\t\tconst absolutePath = join(projectRoot, sourcePath);\n\n\t\t\t// Check if installed on disk\n\t\t\tlet status: \"installed\" | \"missing\" = \"installed\";\n\t\t\ttry {\n\t\t\t\tawait access(absolutePath);\n\t\t\t} catch {\n\t\t\t\tstatus = \"missing\";\n\t\t\t}\n\n\t\t\t// Check which agents have symlinks\n\t\t\tconst linkedAgents = await getLinkedAgents(\n\t\t\t\tskillName,\n\t\t\t\tavailableAgents,\n\t\t\t\tprojectRoot,\n\t\t\t\tagentConfigs,\n\t\t\t);\n\n\t\t\tskills.push({\n\t\t\t\tname: skillName,\n\t\t\t\tfullName,\n\t\t\t\tversion: entry.version,\n\t\t\t\tsource: \"registry\",\n\t\t\t\tsourcePath,\n\t\t\t\tstatus,\n\t\t\t\tlinkedAgents,\n\t\t\t});\n\t\t}\n\n\t\t// Add GitHub skills\n\t\tfor (const { specifier, entry } of githubSkills) {\n\t\t\tconst parsed = parseGitHubSpecifier(specifier);\n\t\t\tif (!parsed) continue;\n\n\t\t\tconst ghEntry = entry as GitHubLockfileEntry;\n\t\t\tconst skillName = getGitHubSkillName(parsed);\n\t\t\tconst sourcePath = getGitHubSkillPath(\n\t\t\t\tparsed.owner,\n\t\t\t\tparsed.repo,\n\t\t\t\tparsed.path,\n\t\t\t);\n\t\t\tconst absolutePath = join(projectRoot, sourcePath);\n\n\t\t\t// Check if installed on disk\n\t\t\tlet status: \"installed\" | \"missing\" = \"installed\";\n\t\t\ttry {\n\t\t\t\tawait access(absolutePath);\n\t\t\t} catch {\n\t\t\t\tstatus = \"missing\";\n\t\t\t}\n\n\t\t\t// Check which agents have symlinks\n\t\t\tconst linkedAgents = await getLinkedAgents(\n\t\t\t\tskillName,\n\t\t\t\tavailableAgents,\n\t\t\t\tprojectRoot,\n\t\t\t\tagentConfigs,\n\t\t\t);\n\n\t\t\tskills.push({\n\t\t\t\tname: skillName,\n\t\t\t\tfullName: specifier,\n\t\t\t\tversion: ghEntry.gitCommit.slice(0, 7),\n\t\t\t\tsource: \"github\",\n\t\t\t\tsourcePath,\n\t\t\t\tstatus,\n\t\t\t\tlinkedAgents,\n\t\t\t\tgitRef: ghEntry.gitRef,\n\t\t\t\tgitCommit: ghEntry.gitCommit,\n\t\t\t});\n\t\t}\n\n\t\tif (skills.length === 0) {\n\t\t\tconsole.log(\"No skills installed.\");\n\t\t\treturn;\n\t\t}\n\n\t\tif (options.json) {\n\t\t\tconsole.log(JSON.stringify(skills, null, 2));\n\t\t\treturn;\n\t\t}\n\n\t\tconsole.log(\"Installed skills:\\n\");\n\n\t\tfor (const skill of skills) {\n\t\t\t// Header line: name@version (source)\n\t\t\tif (skill.source === \"registry\") {\n\t\t\t\tconsole.log(` ${skill.fullName}@${skill.version} (registry)`);\n\t\t\t} else {\n\t\t\t\tconst refInfo = skill.gitRef\n\t\t\t\t\t? `${skill.gitRef}@${skill.gitCommit?.slice(0, 7)}`\n\t\t\t\t\t: skill.version;\n\t\t\t\tconsole.log(` ${skill.fullName} (${refInfo})`);\n\t\t\t}\n\n\t\t\t// Status line if missing\n\t\t\tif (skill.status === \"missing\") {\n\t\t\t\tconsole.log(` Status: MISSING (run 'pspm install' to restore)`);\n\t\t\t}\n\n\t\t\t// Symlink line\n\t\t\tif (skill.linkedAgents.length > 0) {\n\t\t\t\tfor (const agent of skill.linkedAgents) {\n\t\t\t\t\tconst config = resolveAgentConfig(agent, agentConfigs);\n\t\t\t\t\tif (config) {\n\t\t\t\t\t\tconsole.log(` -> ${config.skillsDir}/${skill.name}`);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Summary\n\t\tconst registryCount = skills.filter((s) => s.source === \"registry\").length;\n\t\tconst githubCount = skills.filter((s) => s.source === \"github\").length;\n\t\tconst parts: string[] = [];\n\t\tif (registryCount > 0) parts.push(`${registryCount} registry`);\n\t\tif (githubCount > 0) parts.push(`${githubCount} github`);\n\n\t\tconsole.log(`\\nTotal: ${skills.length} skill(s) (${parts.join(\", \")})`);\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : \"Unknown error\";\n\t\tconsole.error(`Error: ${message}`);\n\t\tprocess.exit(1);\n\t}\n}\n","import { randomBytes } from \"node:crypto\";\nimport http from \"node:http\";\nimport { URL } from \"node:url\";\nimport open from \"open\";\nimport { whoamiRequest } from \"../api-client.js\";\nimport { getRegistryUrl, setCredentials } from \"../config.js\";\n\nexport interface LoginOptions {\n\tapiKey?: string;\n}\n\nconst DEFAULT_WEB_APP_URL = \"https://pspm.dev\";\n\n/**\n * Get the web app URL.\n * Priority:\n * 1. PSPM_WEB_URL environment variable (for local dev where web and server run on different ports)\n * 2. Derived from registry URL (for production where they share the same origin)\n *\n * Local dev example:\n * PSPM_WEB_URL=http://localhost:5500 pspm login\n *\n * The registry URL is like https://pspm.dev\n * The web app URL is the same: https://pspm.dev\n */\nfunction getWebAppUrl(registryUrl: string): string {\n\t// Environment variable takes priority (for local dev)\n\tif (process.env.PSPM_WEB_URL) {\n\t\treturn process.env.PSPM_WEB_URL.replace(/\\/$/, \"\"); // Remove trailing slash\n\t}\n\n\ttry {\n\t\tconst url = new URL(registryUrl);\n\t\treturn `${url.protocol}//${url.host}`;\n\t} catch {\n\t\treturn DEFAULT_WEB_APP_URL;\n\t}\n}\n\n/**\n * Get the server/API base URL from the registry URL\n * The registry URL is like https://pspm.dev\n * The server URL is the same: https://pspm.dev\n */\nfunction getServerUrl(registryUrl: string): string {\n\ttry {\n\t\tconst url = new URL(registryUrl);\n\t\treturn `${url.protocol}//${url.host}`;\n\t} catch {\n\t\treturn DEFAULT_WEB_APP_URL;\n\t}\n}\n\n/**\n * Exchange a CLI token for an API key using fetch\n */\nasync function exchangeCliToken(\n\tregistryUrl: string,\n\ttoken: string,\n): Promise<{ apiKey: string; username: string }> {\n\tconst serverUrl = getServerUrl(registryUrl);\n\t// Use direct REST endpoint (not oRPC) for CLI compatibility\n\tconst rpcUrl = `${serverUrl}/api/api-keys/cli-token-exchange`;\n\n\tconst response = await fetch(rpcUrl, {\n\t\tmethod: \"POST\",\n\t\theaders: {\n\t\t\t\"Content-Type\": \"application/json\",\n\t\t},\n\t\tbody: JSON.stringify({ token }),\n\t});\n\n\tif (!response.ok) {\n\t\tconst errorText = await response.text();\n\t\tthrow new Error(`Failed to exchange token: ${errorText}`);\n\t}\n\n\treturn response.json() as Promise<{ apiKey: string; username: string }>;\n}\n\n/**\n * Start a local HTTP server to receive the OAuth callback\n */\nfunction startCallbackServer(expectedState: string): Promise<{\n\tport: number;\n\ttokenPromise: Promise<string>;\n\tcleanup: () => void;\n}> {\n\treturn new Promise((resolveServer, rejectServer) => {\n\t\tlet resolveToken: (token: string) => void;\n\t\tlet rejectToken: (error: Error) => void;\n\t\tlet timeoutId: NodeJS.Timeout;\n\n\t\tconst tokenPromise = new Promise<string>((resolve, reject) => {\n\t\t\tresolveToken = resolve;\n\t\t\trejectToken = reject;\n\t\t});\n\n\t\tconst server = http.createServer((req, res) => {\n\t\t\tconst url = new URL(req.url || \"/\", \"http://localhost\");\n\n\t\t\tif (url.pathname === \"/callback\") {\n\t\t\t\tconst token = url.searchParams.get(\"token\");\n\t\t\t\tconst state = url.searchParams.get(\"state\");\n\n\t\t\t\tif (state !== expectedState) {\n\t\t\t\t\tres.writeHead(400, { \"Content-Type\": \"text/html\" });\n\t\t\t\t\tres.end(`\n\t\t\t\t\t\t<html>\n\t\t\t\t\t\t\t<body style=\"font-family: system-ui; text-align: center; padding: 40px;\">\n\t\t\t\t\t\t\t\t<h1 style=\"color: #dc2626;\">Security Error</h1>\n\t\t\t\t\t\t\t\t<p>State mismatch - this may be a security issue.</p>\n\t\t\t\t\t\t\t\t<p>Please try running <code>pspm login</code> again.</p>\n\t\t\t\t\t\t\t</body>\n\t\t\t\t\t\t</html>\n\t\t\t\t\t`);\n\t\t\t\t\trejectToken(new Error(\"State mismatch - possible CSRF attack\"));\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (!token) {\n\t\t\t\t\tres.writeHead(400, { \"Content-Type\": \"text/html\" });\n\t\t\t\t\tres.end(`\n\t\t\t\t\t\t<html>\n\t\t\t\t\t\t\t<body style=\"font-family: system-ui; text-align: center; padding: 40px;\">\n\t\t\t\t\t\t\t\t<h1 style=\"color: #dc2626;\">Error</h1>\n\t\t\t\t\t\t\t\t<p>No token received from the server.</p>\n\t\t\t\t\t\t\t\t<p>Please try running <code>pspm login</code> again.</p>\n\t\t\t\t\t\t\t</body>\n\t\t\t\t\t\t</html>\n\t\t\t\t\t`);\n\t\t\t\t\trejectToken(new Error(\"No token received\"));\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tres.writeHead(200, { \"Content-Type\": \"text/html\" });\n\t\t\t\tres.end(`\n\t\t\t\t\t<html>\n\t\t\t\t\t\t<head>\n\t\t\t\t\t\t\t<script>\n\t\t\t\t\t\t\t\t// Try to close the window after a short delay\n\t\t\t\t\t\t\t\tsetTimeout(function() {\n\t\t\t\t\t\t\t\t\twindow.close();\n\t\t\t\t\t\t\t\t}, 1500);\n\t\t\t\t\t\t\t</script>\n\t\t\t\t\t\t</head>\n\t\t\t\t\t\t<body style=\"font-family: system-ui; text-align: center; padding: 40px;\">\n\t\t\t\t\t\t\t<h1 style=\"color: #16a34a;\">Success!</h1>\n\t\t\t\t\t\t\t<p>You are now logged in to PSPM.</p>\n\t\t\t\t\t\t\t<p style=\"color: #666; font-size: 14px;\">This window will close automatically, or you can close it manually.</p>\n\t\t\t\t\t\t</body>\n\t\t\t\t\t</html>\n\t\t\t\t`);\n\n\t\t\t\tresolveToken(token);\n\t\t\t} else {\n\t\t\t\tres.writeHead(404, { \"Content-Type\": \"text/plain\" });\n\t\t\t\tres.end(\"Not found\");\n\t\t\t}\n\t\t});\n\n\t\t// Cleanup function to close server and clear timeout\n\t\tconst cleanup = () => {\n\t\t\tclearTimeout(timeoutId);\n\t\t\tserver.close();\n\t\t};\n\n\t\t// Use port 0 to let the OS assign an available port\n\t\tserver.listen(0, \"127.0.0.1\", () => {\n\t\t\tconst address = server.address();\n\t\t\tif (typeof address === \"object\" && address !== null) {\n\t\t\t\tresolveServer({ port: address.port, tokenPromise, cleanup });\n\t\t\t} else {\n\t\t\t\trejectServer(new Error(\"Failed to get server address\"));\n\t\t\t}\n\t\t});\n\n\t\tserver.on(\"error\", (err) => {\n\t\t\trejectServer(err);\n\t\t});\n\n\t\t// Timeout after 5 minutes\n\t\ttimeoutId = setTimeout(\n\t\t\t() => {\n\t\t\t\trejectToken(new Error(\"Login timed out - please try again\"));\n\t\t\t\tserver.close();\n\t\t\t},\n\t\t\t5 * 60 * 1000,\n\t\t);\n\t});\n}\n\n/**\n * Login using browser-based OAuth flow\n */\nasync function browserLogin(): Promise<void> {\n\tconst registryUrl = await getRegistryUrl();\n\tconst webAppUrl = getWebAppUrl(registryUrl);\n\n\t// Generate state for CSRF protection\n\tconst state = randomBytes(32).toString(\"base64url\");\n\n\tconsole.log(\"Starting browser-based login...\");\n\n\t// Start local callback server\n\tconst { port, tokenPromise, cleanup } = await startCallbackServer(state);\n\n\t// Build the login URL\n\tconst loginUrl = `${webAppUrl}/cli/login?port=${port}&state=${encodeURIComponent(state)}`;\n\n\tconsole.log(\"Opening browser to authenticate...\");\n\tconsole.log(`If the browser doesn't open, visit: ${loginUrl}`);\n\n\t// Open the browser\n\ttry {\n\t\tawait open(loginUrl);\n\t} catch {\n\t\tconsole.log(\"Could not open browser automatically.\");\n\t\tconsole.log(`Please visit: ${loginUrl}`);\n\t}\n\n\tconsole.log(\"Waiting for authentication...\");\n\n\t// Wait for the callback with the token\n\tconst token = await tokenPromise;\n\n\t// Clean up server and timeout immediately after receiving token\n\tcleanup();\n\n\tconsole.log(\"Received token, exchanging for API key...\");\n\n\t// Exchange the token for an API key\n\tconst { apiKey, username } = await exchangeCliToken(registryUrl, token);\n\n\t// Store credentials\n\tawait setCredentials(apiKey, username, registryUrl);\n\n\tconsole.log(`Logged in as ${username}`);\n\tconsole.log(`Registry: ${registryUrl}`);\n}\n\n/**\n * Login using direct API key (fallback method)\n */\nasync function directLogin(apiKey: string): Promise<void> {\n\tconsole.log(\"Verifying API key...\");\n\n\tconst registryUrl = await getRegistryUrl();\n\n\tconst user = await whoamiRequest(registryUrl, apiKey);\n\tif (!user) {\n\t\tconsole.error(\"Error: Invalid API key or not authenticated\");\n\t\tprocess.exit(1);\n\t}\n\n\t// Store credentials\n\tawait setCredentials(apiKey, user.username, registryUrl);\n\tconsole.log(`Logged in as ${user.username}`);\n\tconsole.log(`Registry: ${registryUrl}`);\n}\n\nexport async function login(options: LoginOptions): Promise<void> {\n\ttry {\n\t\tif (options.apiKey) {\n\t\t\t// Direct login with API key\n\t\t\tawait directLogin(options.apiKey);\n\t\t} else {\n\t\t\t// Browser-based OAuth flow\n\t\t\tawait browserLogin();\n\t\t}\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : \"Unknown error\";\n\t\tconsole.error(`Error: ${message}`);\n\t\tprocess.exit(1);\n\t}\n}\n","import { clearCredentials, isLoggedIn } from \"../config.js\";\n\nexport async function logout(): Promise<void> {\n\ttry {\n\t\tconst loggedIn = await isLoggedIn();\n\n\t\tif (!loggedIn) {\n\t\t\tconsole.log(\"Not logged in.\");\n\t\t\treturn;\n\t\t}\n\n\t\tawait clearCredentials();\n\t\tconsole.log(\"Logged out successfully.\");\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : \"Unknown error\";\n\t\tconsole.error(`Error: ${message}`);\n\t\tprocess.exit(1);\n\t}\n}\n","import { mkdir, readdir, rename, rm, stat } from \"node:fs/promises\";\nimport {\n\tgetLegacyLockfilePath,\n\tgetLegacySkillsDir,\n\tgetLockfilePath,\n\tgetPspmDir,\n\tgetSkillsDir,\n} from \"../config.js\";\nimport { migrateLockfileIfNeeded } from \"../lockfile.js\";\n\nexport interface MigrateOptions {\n\tdryRun?: boolean;\n}\n\n/**\n * Migrate from old directory structure to new:\n * - .skills/ → .pspm/skills/\n * - skill-lock.json → pspm-lock.json\n */\nexport async function migrate(options: MigrateOptions): Promise<void> {\n\ttry {\n\t\tconst legacySkillsDir = getLegacySkillsDir();\n\t\tconst newSkillsDir = getSkillsDir();\n\t\tconst legacyLockfilePath = getLegacyLockfilePath();\n\t\tconst newLockfilePath = getLockfilePath();\n\t\tconst pspmDir = getPspmDir();\n\n\t\tlet migrationNeeded = false;\n\t\tconst actions: string[] = [];\n\n\t\t// Check for legacy .skills directory\n\t\ttry {\n\t\t\tconst legacyStats = await stat(legacySkillsDir);\n\t\t\tif (legacyStats.isDirectory()) {\n\t\t\t\t// Check if it has any content\n\t\t\t\tconst contents = await readdir(legacySkillsDir);\n\t\t\t\tif (contents.length > 0) {\n\t\t\t\t\tmigrationNeeded = true;\n\t\t\t\t\tactions.push(\"Move .skills/ → .pspm/skills/\");\n\t\t\t\t}\n\t\t\t}\n\t\t} catch {\n\t\t\t// Legacy directory doesn't exist\n\t\t}\n\n\t\t// Check for legacy lockfile\n\t\ttry {\n\t\t\tawait stat(legacyLockfilePath);\n\t\t\t// Check if new lockfile already exists\n\t\t\ttry {\n\t\t\t\tawait stat(newLockfilePath);\n\t\t\t\t// Both exist - suggest manual resolution\n\t\t\t\tactions.push(\n\t\t\t\t\t\"Note: Both skill-lock.json and pspm-lock.json exist. Manual merge may be needed.\",\n\t\t\t\t);\n\t\t\t} catch {\n\t\t\t\tmigrationNeeded = true;\n\t\t\t\tactions.push(\"Migrate skill-lock.json → pspm-lock.json\");\n\t\t\t}\n\t\t} catch {\n\t\t\t// Legacy lockfile doesn't exist\n\t\t}\n\n\t\tif (!migrationNeeded && actions.length === 0) {\n\t\t\tconsole.log(\n\t\t\t\t\"No migration needed. Project is already using the new structure.\",\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tif (options.dryRun) {\n\t\t\tconsole.log(\"Migration plan (dry run):\");\n\t\t\tconsole.log(\"\");\n\t\t\tfor (const action of actions) {\n\t\t\t\tconsole.log(` - ${action}`);\n\t\t\t}\n\t\t\tconsole.log(\"\");\n\t\t\tconsole.log(\"Run without --dry-run to perform migration.\");\n\t\t\treturn;\n\t\t}\n\n\t\tconsole.log(\"Migrating project structure...\\n\");\n\n\t\t// Migrate lockfile first\n\t\tconst lockfileMigrated = await migrateLockfileIfNeeded();\n\t\tif (lockfileMigrated) {\n\t\t\tconsole.log(\" ✓ Migrated skill-lock.json → pspm-lock.json\");\n\t\t}\n\n\t\t// Migrate .skills directory\n\t\ttry {\n\t\t\tconst legacyStats = await stat(legacySkillsDir);\n\t\t\tif (legacyStats.isDirectory()) {\n\t\t\t\tconst contents = await readdir(legacySkillsDir);\n\t\t\t\tif (contents.length > 0) {\n\t\t\t\t\t// Create .pspm directory\n\t\t\t\t\tawait mkdir(pspmDir, { recursive: true });\n\n\t\t\t\t\t// Check if new skills dir exists and has content\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst newStats = await stat(newSkillsDir);\n\t\t\t\t\t\tif (newStats.isDirectory()) {\n\t\t\t\t\t\t\tconst newContents = await readdir(newSkillsDir);\n\t\t\t\t\t\t\tif (newContents.length > 0) {\n\t\t\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t\t\t\" ! Both .skills/ and .pspm/skills/ have content. Manual merge required.\",\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t// New dir exists but empty, remove it first\n\t\t\t\t\t\t\t\tawait rm(newSkillsDir, { recursive: true, force: true });\n\t\t\t\t\t\t\t\tawait rename(legacySkillsDir, newSkillsDir);\n\t\t\t\t\t\t\t\tconsole.log(\" ✓ Moved .skills/ → .pspm/skills/\");\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch {\n\t\t\t\t\t\t// New skills dir doesn't exist, safe to move\n\t\t\t\t\t\tawait rename(legacySkillsDir, newSkillsDir);\n\t\t\t\t\t\tconsole.log(\" ✓ Moved .skills/ → .pspm/skills/\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} catch {\n\t\t\t// Legacy directory doesn't exist\n\t\t}\n\n\t\tconsole.log(\"\");\n\t\tconsole.log(\"Migration complete!\");\n\t\tconsole.log(\"\");\n\t\tconsole.log(\n\t\t\t\"You can safely delete these legacy files if they still exist:\",\n\t\t);\n\t\tconsole.log(\" - skill-lock.json (replaced by pspm-lock.json)\");\n\t\tconsole.log(\" - .skills/ (replaced by .pspm/skills/)\");\n\t\tconsole.log(\"\");\n\t\tconsole.log(\"Update your .gitignore to include:\");\n\t\tconsole.log(\" .pspm/cache/\");\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : \"Unknown error\";\n\t\tconsole.error(`Error: ${message}`);\n\t\tprocess.exit(1);\n\t}\n}\n","import { exec as execCb } from \"node:child_process\";\nimport { createHash } from \"node:crypto\";\nimport { readdir, readFile, stat } from \"node:fs/promises\";\nimport { join, relative } from \"node:path\";\nimport { promisify } from \"node:util\";\nimport { changeSkillAccess, configure, publishSkill } from \"../api-client.js\";\nimport { getRegistryUrl, requireApiKey } from \"../config.js\";\nimport { extractApiErrorMessage } from \"../errors.js\";\nimport {\n\tDEFAULT_SKILL_FILES,\n\ttype ManifestDetectionResult,\n\ttype PspmManifest,\n\tvalidateManifest,\n} from \"../lib/index.js\";\nimport type { SkillManifest } from \"../sdk/generated\";\n\nconst exec = promisify(execCb);\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};\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): Promise<Array<{ path: string; size: number }>> {\n\tconst results: Array<{ path: string; size: number }> = [];\n\n\ttry {\n\t\tconst entries = await readdir(dir, { withFileTypes: true });\n\n\t\tfor (const entry of entries) {\n\t\t\tconst fullPath = join(dir, entry.name);\n\t\t\tconst relativePath = relative(baseDir, fullPath);\n\n\t\t\t// Skip node_modules and .git\n\t\t\tif (entry.name === \"node_modules\" || entry.name === \".git\") {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (entry.isDirectory()) {\n\t\t\t\tconst subFiles = await getFilesWithSizes(fullPath, baseDir);\n\t\t\t\tresults.push(...subFiles);\n\t\t\t} else {\n\t\t\t\tconst fileStat = await stat(fullPath);\n\t\t\t\tresults.push({ path: relativePath, size: fileStat.size });\n\t\t\t}\n\t\t}\n\t} catch {\n\t\t// Directory doesn't exist or can't be read\n\t}\n\n\treturn results;\n}\n\nexport interface PublishOptions {\n\tbump?: \"major\" | \"minor\" | \"patch\";\n\ttag?: string;\n\t/** Set package visibility during publish */\n\taccess?: \"public\" | \"private\";\n}\n\nexport async function publishCommand(options: PublishOptions): Promise<void> {\n\ttry {\n\t\tconst apiKey = await requireApiKey();\n\t\tconst registryUrl = await getRegistryUrl();\n\n\t\t// Detect and read manifest (pspm.json preferred, package.json fallback)\n\t\tconst detection = await detectManifest();\n\t\tconst manifest = detection.manifest;\n\n\t\t// Warn if using package.json instead of pspm.json\n\t\tif (detection.type === \"package.json\") {\n\t\t\tconsole.log(\"pspm warn Using package.json instead of pspm.json\");\n\t\t\tconsole.log(\n\t\t\t\t\"pspm warn Run 'pspm init' to create a dedicated pspm.json manifest\",\n\t\t\t);\n\t\t\tconsole.log(\"\");\n\t\t}\n\n\t\t// Validate manifest\n\t\tconst validation = validateManifest(manifest);\n\t\tif (!validation.valid) {\n\t\t\tconsole.error(`Error: ${validation.error}`);\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\t// 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};\n\n\t\t// Handle version bump if requested\n\t\tif (options.bump) {\n\t\t\tconst semver = await import(\"semver\");\n\t\t\tconst newVersion = semver.default.inc(packageJson.version, options.bump);\n\t\t\tif (!newVersion) {\n\t\t\t\tconsole.error(\n\t\t\t\t\t`Error: Failed to bump version from ${packageJson.version}`,\n\t\t\t\t);\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\t\t\tpackageJson.version = newVersion;\n\t\t\tconsole.log(`Bumped version to ${newVersion}`);\n\t\t}\n\n\t\t// Create tarball using npm pack (or tar directly)\n\t\t// Sanitize name for filename (replace @ and / with -)\n\t\tconst safeName = packageJson.name.replace(/[@/]/g, \"-\").replace(/^-+/, \"\");\n\t\tconst tarballName = `${safeName}-${packageJson.version}.tgz`;\n\t\tconst tempDir = join(process.cwd(), \".pspm-publish\");\n\n\t\t// Create tarball\n\t\ttry {\n\t\t\tawait exec(`rm -rf \"${tempDir}\" && mkdir -p \"${tempDir}\"`);\n\n\t\t\t// Get files to include (use 'files' from 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 node_modules\n\t\t\t\t\tawait exec(\n\t\t\t\t\t\t`rsync -a --exclude='node_modules' --exclude='.git' \"${file}\" \"${tempDir}/package/\" 2>/dev/null || true`,\n\t\t\t\t\t);\n\t\t\t\t} catch {\n\t\t\t\t\t// Ignore files that don't exist\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Always include 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\tconst packageDir = join(tempDir, \"package\");\n\t\t\tconst tarballContents = await getFilesWithSizes(packageDir, packageDir);\n\t\t\tconst unpackedSize = tarballContents.reduce((acc, f) => acc + f.size, 0);\n\n\t\t\t// Create tarball (excluding node_modules just in case)\n\t\t\tconst tarballPath = join(tempDir, tarballName);\n\t\t\tawait exec(\n\t\t\t\t`tar -czf \"${tarballPath}\" -C \"${tempDir}\" --exclude='node_modules' --exclude='.git' package`,\n\t\t\t);\n\n\t\t\t// Read tarball and calculate hashes\n\t\t\tconst tarballBuffer = await readFile(tarballPath);\n\t\t\tconst tarballBase64 = tarballBuffer.toString(\"base64\");\n\t\t\tconst tarballSize = tarballBuffer.length;\n\n\t\t\t// Calculate shasum (sha1) and integrity (sha512)\n\t\t\tconst shasum = createHash(\"sha1\").update(tarballBuffer).digest(\"hex\");\n\t\t\tconst integrityHash = createHash(\"sha512\")\n\t\t\t\t.update(tarballBuffer)\n\t\t\t\t.digest(\"base64\");\n\t\t\tconst integrity = `sha512-${integrityHash}`;\n\n\t\t\t// Print npm-style publish notice\n\t\t\tconsole.log(\"\");\n\t\t\tconsole.log(\"pspm notice\");\n\t\t\tconsole.log(`pspm notice 📦 ${packageJson.name}@${packageJson.version}`);\n\t\t\tconsole.log(\"pspm notice Tarball Contents\");\n\n\t\t\t// Sort files by size descending for display\n\t\t\ttarballContents.sort((a, b) => b.size - a.size);\n\t\t\tfor (const file of tarballContents) {\n\t\t\t\tconsole.log(\n\t\t\t\t\t`pspm notice ${formatBytes(file.size).padStart(8)} ${file.path}`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconsole.log(\"pspm notice Tarball Details\");\n\t\t\tconsole.log(`pspm notice name: ${packageJson.name}`);\n\t\t\tconsole.log(`pspm notice version: ${packageJson.version}`);\n\t\t\tconsole.log(`pspm notice filename: ${tarballName}`);\n\t\t\tconsole.log(`pspm notice package size: ${formatBytes(tarballSize)}`);\n\t\t\tconsole.log(`pspm notice unpacked size: ${formatBytes(unpackedSize)}`);\n\t\t\tconsole.log(`pspm notice shasum: ${shasum}`);\n\t\t\tconsole.log(\n\t\t\t\t`pspm notice integrity: ${integrity.substring(0, 50)}...`,\n\t\t\t);\n\t\t\tconsole.log(`pspm notice total files: ${tarballContents.length}`);\n\t\t\tconsole.log(\"pspm notice\");\n\t\t\tconsole.log(`pspm notice Publishing to ${registryUrl} with tag latest`);\n\n\t\t\t// Configure SDK and publish (use direct REST endpoints, not oRPC)\n\t\t\tconfigure({ registryUrl, apiKey });\n\t\t\tconst response = await publishSkill({\n\t\t\t\tmanifest: packageJson,\n\t\t\t\ttarballBase64,\n\t\t\t});\n\n\t\t\tif (response.status !== 200) {\n\t\t\t\tconst errorMessage = extractApiErrorMessage(response, \"Publish failed\");\n\n\t\t\t\t// Check for version conflict errors\n\t\t\t\tif (\n\t\t\t\t\terrorMessage.includes(\"must be greater than\") ||\n\t\t\t\t\terrorMessage.includes(\"already exists\")\n\t\t\t\t) {\n\t\t\t\t\tconsole.error(\"pspm error code E403\");\n\t\t\t\t\tconsole.error(\n\t\t\t\t\t\t`pspm error 403 403 Forbidden - You cannot publish over the previously published versions: ${packageJson.version}.`,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tthrow new Error(errorMessage);\n\t\t\t}\n\n\t\t\tconst result = response.data;\n\t\t\tconsole.log(\n\t\t\t\t`+ @user/${result.skill.username}/${result.skill.name}@${result.version.version}`,\n\t\t\t);\n\t\t\tconsole.log(`Checksum: ${result.version.checksum}`);\n\n\t\t\t// Set visibility if --access flag was provided\n\t\t\tif (options.access) {\n\t\t\t\tconsole.log(`\\nSetting visibility to ${options.access}...`);\n\t\t\t\tconst accessResponse = await changeSkillAccess(packageJson.name, {\n\t\t\t\t\tvisibility: options.access,\n\t\t\t\t});\n\n\t\t\t\tif (accessResponse.status !== 200 || !accessResponse.data) {\n\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\t`Warning: Failed to set visibility: ${accessResponse.error ?? \"Unknown error\"}`,\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tconsole.log(`Package is now ${accessResponse.data.visibility}`);\n\t\t\t\t\tif (options.access === \"public\") {\n\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t\"Note: This action is irreversible. Public packages cannot be made private.\",\n\t\t\t\t\t\t);\n\t\t\t\t\t}\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.js\";\nimport { getSkillsDir } from \"../config.js\";\nimport {\n\tgetGitHubSkillName,\n\tisGitHubSpecifier,\n\tparseGitHubSpecifier,\n} from \"../lib/index.js\";\nimport {\n\tlistLockfileGitHubPackages,\n\tlistLockfileSkills,\n\tremoveFromLockfile,\n\tremoveGitHubFromLockfile,\n} from \"../lockfile.js\";\nimport {\n\treadManifest,\n\tremoveDependency,\n\tremoveGitHubDependency,\n} from \"../manifest.js\";\nimport { getGitHubSkillPath, removeAgentSymlinks } from \"../symlinks.js\";\n\nexport async function remove(nameOrSpecifier: string): Promise<void> {\n\ttry {\n\t\t// Read manifest for agent config overrides\n\t\tconst manifest = await readManifest();\n\t\tconst agentConfigs = manifest?.agents;\n\t\tconst agents = getAvailableAgents(agentConfigs);\n\n\t\t// Determine type of specifier\n\t\tif (isGitHubSpecifier(nameOrSpecifier)) {\n\t\t\tawait removeGitHub(nameOrSpecifier, agents, agentConfigs);\n\t\t} else if (nameOrSpecifier.startsWith(\"@user/\")) {\n\t\t\tawait removeRegistry(nameOrSpecifier, agents, agentConfigs);\n\t\t} else {\n\t\t\t// Short name - try to find in either registry or GitHub skills\n\t\t\tawait removeByShortName(nameOrSpecifier, agents, agentConfigs);\n\t\t}\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : \"Unknown error\";\n\t\tconsole.error(`Error: ${message}`);\n\t\tprocess.exit(1);\n\t}\n}\n\n/**\n * Remove a registry skill by full specifier.\n */\nasync function removeRegistry(\n\tspecifier: string,\n\tagents: string[],\n\tagentConfigs?: Record<string, { skillsDir: string }>,\n): Promise<void> {\n\tconst match = specifier.match(/^@user\\/([^/]+)\\/([^@/]+)/);\n\tif (!match) {\n\t\tconsole.error(`Error: Invalid skill specifier: ${specifier}`);\n\t\tprocess.exit(1);\n\t}\n\n\tconst fullName = `@user/${match[1]}/${match[2]}`;\n\tconst username = match[1];\n\tconst name = match[2];\n\n\tconsole.log(`Removing ${fullName}...`);\n\n\t// Remove from lockfile\n\tconst removedFromLockfile = await removeFromLockfile(fullName);\n\n\t// Remove from pspm.json dependencies\n\tconst removedFromManifest = await removeDependency(fullName);\n\n\tif (!removedFromLockfile && !removedFromManifest) {\n\t\tconsole.error(`Error: ${fullName} not found in lockfile or pspm.json`);\n\t\tprocess.exit(1);\n\t}\n\n\t// Remove symlinks from all agents\n\tawait removeAgentSymlinks(name, {\n\t\tagents,\n\t\tprojectRoot: process.cwd(),\n\t\tagentConfigs,\n\t});\n\n\t// Remove from disk\n\tconst skillsDir = getSkillsDir();\n\tconst destDir = join(skillsDir, username, name);\n\n\ttry {\n\t\tawait rm(destDir, { recursive: true, force: true });\n\t} catch {\n\t\t// Ignore errors if directory doesn't exist\n\t}\n\n\tconsole.log(`Removed ${fullName}`);\n}\n\n/**\n * Remove a GitHub skill by specifier.\n */\nasync function removeGitHub(\n\tspecifier: string,\n\tagents: string[],\n\tagentConfigs?: Record<string, { skillsDir: string }>,\n): Promise<void> {\n\tconst parsed = parseGitHubSpecifier(specifier);\n\tif (!parsed) {\n\t\tconsole.error(`Error: Invalid GitHub specifier: ${specifier}`);\n\t\tprocess.exit(1);\n\t}\n\n\t// Build the lockfile key (without ref)\n\tconst lockfileKey = parsed.path\n\t\t? `github:${parsed.owner}/${parsed.repo}/${parsed.path}`\n\t\t: `github:${parsed.owner}/${parsed.repo}`;\n\n\tconsole.log(`Removing ${lockfileKey}...`);\n\n\t// Remove from lockfile\n\tconst removedFromLockfile = await removeGitHubFromLockfile(lockfileKey);\n\n\t// Remove from pspm.json githubDependencies\n\tconst removedFromManifest = await removeGitHubDependency(lockfileKey);\n\n\tif (!removedFromLockfile && !removedFromManifest) {\n\t\tconsole.error(`Error: ${lockfileKey} not found in lockfile or pspm.json`);\n\t\tprocess.exit(1);\n\t}\n\n\t// Remove symlinks from all agents\n\tconst skillName = getGitHubSkillName(parsed);\n\tawait removeAgentSymlinks(skillName, {\n\t\tagents,\n\t\tprojectRoot: process.cwd(),\n\t\tagentConfigs,\n\t});\n\n\t// Remove from disk\n\tconst skillsDir = getSkillsDir();\n\tconst destPath = getGitHubSkillPath(parsed.owner, parsed.repo, parsed.path);\n\tconst destDir = join(skillsDir, \"..\", destPath);\n\n\ttry {\n\t\tawait rm(destDir, { recursive: true, force: true });\n\t} catch {\n\t\t// Ignore errors if directory doesn't exist\n\t}\n\n\tconsole.log(`Removed ${lockfileKey}`);\n}\n\n/**\n * Remove a skill by short name (searches both registry and GitHub skills).\n */\nasync function removeByShortName(\n\tshortName: string,\n\tagents: string[],\n\tagentConfigs?: Record<string, { skillsDir: string }>,\n): Promise<void> {\n\t// First try to find in registry skills\n\tconst registrySkills = await listLockfileSkills();\n\tconst foundRegistry = registrySkills.find((s) => {\n\t\tconst match = s.name.match(/^@user\\/([^/]+)\\/([^/]+)$/);\n\t\treturn match && match[2] === shortName;\n\t});\n\n\tif (foundRegistry) {\n\t\tawait removeRegistry(foundRegistry.name, agents, agentConfigs);\n\t\treturn;\n\t}\n\n\t// Try to find in GitHub skills\n\tconst githubSkills = await listLockfileGitHubPackages();\n\tconst foundGitHub = githubSkills.find((s) => {\n\t\tconst parsed = parseGitHubSpecifier(s.specifier);\n\t\tif (!parsed) return false;\n\t\treturn getGitHubSkillName(parsed) === shortName;\n\t});\n\n\tif (foundGitHub) {\n\t\tawait removeGitHub(foundGitHub.specifier, agents, agentConfigs);\n\t\treturn;\n\t}\n\n\tconsole.error(`Error: Skill \"${shortName}\" not found in lockfile`);\n\tprocess.exit(1);\n}\n","import { configure, deleteSkill, deleteSkillVersion } from \"../api-client.js\";\nimport { getRegistryUrl, requireApiKey } from \"../config.js\";\nimport { extractApiErrorMessage } from \"../errors.js\";\nimport { parseSkillSpecifier } from \"../lib/index.js\";\n\nexport interface UnpublishOptions {\n\tforce?: boolean;\n}\n\nexport async function unpublish(\n\tspecifier: string,\n\toptions: UnpublishOptions,\n): Promise<void> {\n\ttry {\n\t\tconst apiKey = await requireApiKey();\n\t\tconst registryUrl = await getRegistryUrl();\n\n\t\t// Parse the specifier\n\t\tconst parsed = parseSkillSpecifier(specifier);\n\t\tif (!parsed) {\n\t\t\tconsole.error(\n\t\t\t\t`Error: Invalid skill specifier \"${specifier}\". Use format: @user/{username}/{name}[@{version}]`,\n\t\t\t);\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\tconst { username, name, versionRange } = parsed;\n\n\t\t// Configure SDK (use direct REST endpoints, not oRPC)\n\t\tconfigure({ registryUrl, apiKey });\n\n\t\tif (versionRange) {\n\t\t\t// Delete specific version\n\t\t\tconsole.log(`Unpublishing ${specifier}...`);\n\n\t\t\tif (!options.force) {\n\t\t\t\tconsole.error(\n\t\t\t\t\t\"Warning: This action is irreversible. Use --force to confirm.\",\n\t\t\t\t);\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\n\t\t\tconst response = await deleteSkillVersion(name, versionRange);\n\t\t\tif (response.status !== 200) {\n\t\t\t\tconst errorMessage = extractApiErrorMessage(\n\t\t\t\t\tresponse,\n\t\t\t\t\t\"Failed to unpublish. Version may not exist.\",\n\t\t\t\t);\n\t\t\t\tconsole.error(`Error: ${errorMessage}`);\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\t\t\tconsole.log(`Unpublished @user/${username}/${name}@${versionRange}`);\n\t\t} else {\n\t\t\t// Delete entire skill\n\t\t\tconsole.log(`Unpublishing all versions of @user/${username}/${name}...`);\n\n\t\t\tif (!options.force) {\n\t\t\t\tconsole.error(\n\t\t\t\t\t\"Warning: This will delete ALL versions. Use --force to confirm.\",\n\t\t\t\t);\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\n\t\t\tconst response = await deleteSkill(name);\n\t\t\tif (response.status !== 200) {\n\t\t\t\tconst errorMessage = extractApiErrorMessage(\n\t\t\t\t\tresponse,\n\t\t\t\t\t\"Failed to unpublish. Skill may not exist.\",\n\t\t\t\t);\n\t\t\t\tconsole.error(`Error: ${errorMessage}`);\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\t\t\tconsole.log(`Unpublished @user/${username}/${name} (all versions)`);\n\t\t}\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : \"Unknown error\";\n\t\tconsole.error(`Error: ${message}`);\n\t\tprocess.exit(1);\n\t}\n}\n","import { configure, listSkillVersions } from \"../api-client.js\";\nimport { getRegistryUrl, requireApiKey } from \"../config.js\";\nimport { extractApiErrorMessage } from \"../errors.js\";\nimport { resolveVersion } from \"../lib/index.js\";\nimport { listLockfileSkills } from \"../lockfile.js\";\nimport { add } from \"./add.js\";\n\nexport interface UpdateOptions {\n\tdryRun?: boolean;\n}\n\nexport async function update(options: UpdateOptions): Promise<void> {\n\ttry {\n\t\tconst apiKey = await requireApiKey();\n\t\tconst registryUrl = await getRegistryUrl();\n\n\t\tconst skills = await listLockfileSkills();\n\n\t\tif (skills.length === 0) {\n\t\t\tconsole.log(\"No skills installed.\");\n\t\t\treturn;\n\t\t}\n\n\t\t// Configure SDK (use direct REST endpoints, not oRPC)\n\t\tconfigure({ registryUrl, apiKey });\n\n\t\tconst updates: Array<{\n\t\t\tname: string;\n\t\t\tcurrent: string;\n\t\t\tlatest: string;\n\t\t}> = [];\n\n\t\tconsole.log(\"Checking for updates...\\n\");\n\n\t\tfor (const { name, entry } of skills) {\n\t\t\tconst match = name.match(/^@user\\/([^/]+)\\/([^/]+)$/);\n\t\t\tif (!match) continue;\n\n\t\t\tconst [, username, skillName] = match;\n\n\t\t\ttry {\n\t\t\t\tconst versionsResponse = await listSkillVersions(username, skillName);\n\t\t\t\tif (versionsResponse.status !== 200) {\n\t\t\t\t\tconst errorMessage = extractApiErrorMessage(\n\t\t\t\t\t\tversionsResponse,\n\t\t\t\t\t\t\"Failed to fetch versions\",\n\t\t\t\t\t);\n\t\t\t\t\tconsole.warn(` Warning: ${name}: ${errorMessage}`);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconst versions = versionsResponse.data;\n\t\t\t\tif (versions.length === 0) continue;\n\n\t\t\t\tconst versionStrings = versions.map(\n\t\t\t\t\t(v: { version: string }) => v.version,\n\t\t\t\t);\n\t\t\t\tconst latest = resolveVersion(\"*\", versionStrings);\n\n\t\t\t\tif (latest && latest !== entry.version) {\n\t\t\t\t\tupdates.push({\n\t\t\t\t\t\tname,\n\t\t\t\t\t\tcurrent: entry.version,\n\t\t\t\t\t\tlatest,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\tconsole.warn(` Warning: Could not check updates for ${name}`);\n\t\t\t}\n\t\t}\n\n\t\tif (updates.length === 0) {\n\t\t\tconsole.log(\"All skills are up to date.\");\n\t\t\treturn;\n\t\t}\n\n\t\tconsole.log(\"Updates available:\\n\");\n\t\tfor (const { name, current, latest } of updates) {\n\t\t\tconsole.log(` ${name}: ${current} -> ${latest}`);\n\t\t}\n\n\t\tif (options.dryRun) {\n\t\t\tconsole.log(\"\\nDry run - no changes made.\");\n\t\t\treturn;\n\t\t}\n\n\t\tconsole.log(\"\\nUpdating...\\n\");\n\n\t\tfor (const { name, latest } of updates) {\n\t\t\tconst match = name.match(/^@user\\/([^/]+)\\/([^/]+)$/);\n\t\t\tif (!match) continue;\n\n\t\t\tconst [, username, skillName] = match;\n\t\t\tconst specifier = `@user/${username}/${skillName}@${latest}`;\n\n\t\t\tawait add([specifier], {});\n\t\t}\n\n\t\tconsole.log(\"\\nAll skills updated.\");\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : \"Unknown error\";\n\t\tconsole.error(`Error: ${message}`);\n\t\tprocess.exit(1);\n\t}\n}\n","import { whoamiRequest } from \"../api-client.js\";\nimport { getRegistryUrl, requireApiKey, resolveConfig } from \"../config.js\";\n\nexport async function whoami(): Promise<void> {\n\ttry {\n\t\tconst resolved = await resolveConfig();\n\t\tconst apiKey = await requireApiKey();\n\t\tconst registryUrl = await getRegistryUrl();\n\n\t\tconst user = await whoamiRequest(registryUrl, apiKey);\n\n\t\tif (user) {\n\t\t\tconsole.log(`Username: ${user.username}`);\n\t\t\tconsole.log(`User ID: ${user.userId}`);\n\t\t\tconsole.log(`Registry: ${registryUrl}`);\n\t\t} else if (resolved.username) {\n\t\t\t// Use cached username if API call fails\n\t\t\tconsole.log(`Username: ${resolved.username} (cached)`);\n\t\t\tconsole.log(`Registry: ${registryUrl}`);\n\t\t} else {\n\t\t\tconsole.error(\"Could not determine current user.\");\n\t\t\tprocess.exit(1);\n\t\t}\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : \"Unknown error\";\n\t\tconsole.error(`Error: ${message}`);\n\t\tprocess.exit(1);\n\t}\n}\n"],"mappings":"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","names":["version","configure","version","config","config","mkdir","writeFile","join","exec","promisify","stat","mkdir","readFile","stat","writeFile","dirname","readFile","writeFile","join","init_manifest","lstat","mkdir","rm","dirname","join","config","mkdir","rm","join","config","configure","writeFile","exec","promisify","init_manifest","dirname","join","readFile","join","configure","stat","writeFile","join","configure","readFile","stat","writeFile","join","exec","promisify","version","init_manifest","createHash","mkdir","readFile","rm","writeFile","join","add","config","configure","exec","promisify","init_manifest","init_manifest","access","join","config","URL","exchangeCliToken","mkdir","readdir","rm","stat","createHash","readdir","readFile","stat","join","relative","packageJson","semver","configure","init_manifest","rm","join","configure","configure","dirname","join"]}