@anytio/pspm 0.0.2 → 0.0.3

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/specifier.ts","../../../packages/shared/pspm-types/src/version.ts","../../../packages/sdk/src/client.ts","../src/api-client.ts","../src/errors.ts","../src/config.ts","../src/lockfile.ts","../src/commands/add.ts","../src/commands/config/add.ts","../src/commands/config/delete.ts","../src/commands/config/init.ts","../src/commands/config/list.ts","../src/commands/config/set.ts","../src/commands/config/show.ts","../src/commands/config/use.ts","../src/commands/install.ts","../src/commands/list.ts","../src/commands/login.ts","../src/commands/logout.ts","../src/commands/publish.ts","../src/commands/remove.ts","../src/commands/unpublish.ts","../src/commands/update.ts","../src/commands/whoami.ts","../src/index.ts"],"names":["config","readFile","mkdir","dirname","writeFile","join","exec","promisify","stat","createHash","rm","execCb","packageJson","semver","match","__dirname"],"mappings":"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","file":"index.js","sourcesContent":["import { createHash } from \"node:crypto\";\n\n/**\n * Calculate integrity hash for a buffer.\n * Uses SHA-256 with base64 encoding, prefixed with \"sha256-\".\n *\n * @param data - The buffer to hash\n * @returns Integrity string (e.g., \"sha256-abc123...\")\n */\nexport function calculateIntegrity(data: Buffer): string {\n\tconst hash = createHash(\"sha256\").update(data).digest(\"base64\");\n\treturn `sha256-${hash}`;\n}\n\n/**\n * Verify that a buffer matches an expected integrity hash.\n *\n * @param data - The buffer to verify\n * @param expectedIntegrity - The expected integrity string\n * @returns True if the integrity matches\n */\nexport function verifyIntegrity(\n\tdata: Buffer,\n\texpectedIntegrity: string,\n): boolean {\n\tconst match = expectedIntegrity.match(/^sha256-(.+)$/);\n\tif (!match) {\n\t\treturn false;\n\t}\n\n\tconst actualHash = createHash(\"sha256\").update(data).digest(\"base64\");\n\treturn actualHash === match[1];\n}\n","/**\n * Parsed skill specifier (from CLI input)\n * e.g., \"@user/bsheng/vite_slides@^2.0.0\"\n */\nexport interface SkillSpecifier {\n\tusername: string;\n\tname: string;\n\tversionRange?: string;\n}\n\n/**\n * Skill specifier regex pattern\n * Matches: @user/{username}/{name}[@{version}]\n */\nconst SPECIFIER_PATTERN =\n\t/^@user\\/([a-zA-Z0-9_-]+)\\/([a-z][a-z0-9_-]*)(?:@(.+))?$/;\n\n/**\n * Parse a skill specifier string.\n *\n * @param specifier - The specifier string (e.g., \"@user/bsheng/vite_slides@^2.0.0\")\n * @returns Parsed specifier or null if invalid\n *\n * @example\n * ```typescript\n * parseSkillSpecifier(\"@user/bsheng/my-skill@^1.0.0\")\n * // => { username: \"bsheng\", name: \"my-skill\", versionRange: \"^1.0.0\" }\n *\n * parseSkillSpecifier(\"@user/bsheng/my-skill\")\n * // => { username: \"bsheng\", name: \"my-skill\", versionRange: undefined }\n * ```\n */\nexport function parseSkillSpecifier(specifier: string): SkillSpecifier | null {\n\tconst match = specifier.match(SPECIFIER_PATTERN);\n\n\tif (!match) {\n\t\treturn null;\n\t}\n\n\treturn {\n\t\tusername: match[1],\n\t\tname: match[2],\n\t\tversionRange: match[3],\n\t};\n}\n\n/**\n * Generate a full skill identifier string.\n *\n * @param username - The owner's username\n * @param name - The skill name\n * @param version - Optional version string\n * @returns Full identifier (e.g., \"@user/bsheng/my-skill@1.0.0\")\n */\nexport function generateSkillIdentifier(\n\tusername: string,\n\tname: string,\n\tversion?: string,\n): string {\n\tconst base = `@user/${username}/${name}`;\n\treturn version ? `${base}@${version}` : base;\n}\n","import * as semver from \"semver\";\n\n/**\n * Resolve the best matching version from a list of available versions.\n *\n * @param range - The version range to match (e.g., \"^1.0.0\", \"~2.1.0\", \"*\")\n * @param availableVersions - List of available version strings\n * @returns The best matching version or null if none found\n */\nexport function resolveVersion(\n\trange: string,\n\tavailableVersions: string[],\n): string | null {\n\tconst sorted = availableVersions\n\t\t.filter((v) => semver.valid(v))\n\t\t.sort((a, b) => semver.rcompare(a, b));\n\n\tif (!range || range === \"latest\" || range === \"*\") {\n\t\treturn sorted[0] ?? null;\n\t}\n\n\treturn semver.maxSatisfying(sorted, range);\n}\n\n/**\n * Check if a version satisfies a given range.\n */\nexport function versionSatisfies(version: string, range: string): boolean {\n\treturn semver.satisfies(version, range);\n}\n\n/**\n * Normalize a version range string.\n * Converts \"latest\" or empty to \"*\".\n */\nexport function normalizeVersionRange(range?: string): string {\n\tif (!range || range === \"latest\") {\n\t\treturn \"*\";\n\t}\n\treturn range;\n}\n\n/**\n * Compare two versions.\n * Returns: -1 if a < b, 0 if a === b, 1 if a > b\n */\nexport function compareVersions(a: string, b: string): number {\n\treturn semver.compare(a, b);\n}\n\n/**\n * Check if version a is greater than version b.\n */\nexport function isNewerVersion(a: string, b: string): boolean {\n\treturn semver.gt(a, b);\n}\n\n/**\n * Get the latest version from a list.\n */\nexport function getLatestVersion(versions: string[]): string | null {\n\tconst valid = versions.filter((v) => semver.valid(v));\n\tif (valid.length === 0) return null;\n\treturn valid.sort((a, b) => semver.rcompare(a, b))[0];\n}\n","/**\n * PSPM SDK Client\n *\n * Type-safe HTTP client for the PSPM skill registry API.\n * Zero external dependencies - uses native fetch.\n */\n\nimport type {\n\tCurrentUser,\n\tDeleteResponse,\n\tDeleteSkillParams,\n\tDeleteVersionParams,\n\tGetSkillParams,\n\tGetVersionParams,\n\tListUserSkillsParams,\n\tListVersionsParams,\n\tPublishRequest,\n\tPublishResponse,\n\tSkillVersion,\n\tSkillVersionWithDownload,\n\tSkillWithUser,\n} from \"./types\";\n\n/**\n * SDK configuration\n */\nexport interface SDKConfig {\n\tbaseUrl: string;\n\tapiKey: string;\n}\n\nlet config: SDKConfig | null = null;\n\n/**\n * Configure the SDK with base URL and API key.\n * Must be called before making any API requests.\n *\n * @example\n * ```typescript\n * configure({\n * baseUrl: \"https://pspm.dev/api/skills/rpc\",\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 * Internal fetch wrapper with authentication\n */\nasync function apiFetch<T>(\n\tpath: string,\n\toptions: RequestInit = {},\n): Promise<T> {\n\tconst { baseUrl, apiKey } = getConfig();\n\tconst url = `${baseUrl}${path}`;\n\n\tconst response = await fetch(url, {\n\t\t...options,\n\t\theaders: {\n\t\t\t...options.headers,\n\t\t\tAuthorization: `Bearer ${apiKey}`,\n\t\t\t\"Content-Type\": \"application/json\",\n\t\t},\n\t});\n\n\tif (!response.ok) {\n\t\tconst errorText = await response.text();\n\t\tlet errorMessage = `API error: ${response.status}`;\n\n\t\ttry {\n\t\t\tconst errorJson = JSON.parse(errorText);\n\t\t\tif (errorJson.message) {\n\t\t\t\terrorMessage = errorJson.message;\n\t\t\t} else if (errorJson.error) {\n\t\t\t\terrorMessage = errorJson.error;\n\t\t\t}\n\t\t} catch {\n\t\t\tif (errorText) {\n\t\t\t\terrorMessage = errorText;\n\t\t\t}\n\t\t}\n\n\t\tthrow new SDKError(errorMessage, response.status, errorText);\n\t}\n\n\tconst text = await response.text();\n\tif (!text) {\n\t\treturn null as T;\n\t}\n\n\treturn JSON.parse(text) as T;\n}\n\n// ============================================================================\n// API Functions\n// ============================================================================\n\n/**\n * Get the current authenticated user's info.\n * Returns null if not authenticated.\n */\nexport async function me(): Promise<CurrentUser | null> {\n\treturn apiFetch<CurrentUser | null>(\"/me\", { method: \"GET\" });\n}\n\n/**\n * List all skills owned by the authenticated user.\n */\nexport async function listMySkills(): Promise<SkillWithUser[]> {\n\treturn apiFetch<SkillWithUser[]>(\"/\", { method: \"GET\" });\n}\n\n/**\n * List all skills for a specific user.\n */\nexport async function listUserSkills(\n\tparams: ListUserSkillsParams,\n): Promise<SkillWithUser[]> {\n\treturn apiFetch<SkillWithUser[]>(`/@user/${params.username}`, {\n\t\tmethod: \"GET\",\n\t});\n}\n\n/**\n * Get a specific skill by username and name.\n * Returns null if not found.\n */\nexport async function getSkill(\n\tparams: GetSkillParams,\n): Promise<SkillWithUser | null> {\n\treturn apiFetch<SkillWithUser | null>(\n\t\t`/@user/${params.username}/${params.name}`,\n\t\t{ method: \"GET\" },\n\t);\n}\n\n/**\n * List all versions for a skill.\n */\nexport async function listVersions(\n\tparams: ListVersionsParams,\n): Promise<SkillVersion[]> {\n\treturn apiFetch<SkillVersion[]>(\n\t\t`/@user/${params.username}/${params.name}/versions`,\n\t\t{ method: \"GET\" },\n\t);\n}\n\n/**\n * Get metadata for a specific skill version.\n * Returns null if not found.\n */\nexport async function getVersion(\n\tparams: GetVersionParams,\n): Promise<SkillVersionWithDownload | null> {\n\treturn apiFetch<SkillVersionWithDownload | null>(\n\t\t`/@user/${params.username}/${params.name}/${params.version}`,\n\t\t{ method: \"GET\" },\n\t);\n}\n\n/**\n * Publish a new skill or a new version of an existing skill.\n */\nexport async function publish(body: PublishRequest): Promise<PublishResponse> {\n\treturn apiFetch<PublishResponse>(\"/publish\", {\n\t\tmethod: \"POST\",\n\t\tbody: JSON.stringify(body),\n\t});\n}\n\n/**\n * Delete a skill and all its versions.\n * Only the owner can delete their skills.\n */\nexport async function deleteSkill(\n\tparams: DeleteSkillParams,\n): Promise<DeleteResponse> {\n\treturn apiFetch<DeleteResponse>(`/${params.name}`, { method: \"DELETE\" });\n}\n\n/**\n * Delete a specific version of a skill.\n * Only the owner can delete their skill versions.\n */\nexport async function deleteVersion(\n\tparams: DeleteVersionParams,\n): Promise<DeleteResponse> {\n\treturn apiFetch<DeleteResponse>(`/${params.name}/${params.version}`, {\n\t\tmethod: \"DELETE\",\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\ttype CurrentUser,\n\tconfigure,\n\tdeleteSkill,\n\tdeleteVersion,\n\tgetConfig,\n\tgetSkill,\n\tgetVersion,\n\tisConfigured,\n\tlistMySkills,\n\tlistUserSkills,\n\tlistVersions,\n\tme,\n\ttype PublishRequest,\n\ttype PublishResponse,\n\tpublish,\n\ttype SDKConfig,\n\tSDKError,\n\ttype SkillManifest,\n\ttype SkillVersion,\n\ttype SkillVersionWithDownload,\n\ttype SkillWithUser,\n} from \"@repo/sdk\";\n\n// Re-export SDK functions for convenience\nexport {\n\tconfigure,\n\tdeleteSkill,\n\tdeleteVersion,\n\tgetConfig,\n\tgetSkill,\n\tgetVersion,\n\tisConfigured,\n\tlistMySkills,\n\tlistUserSkills,\n\tlistVersions,\n\tme,\n\tpublish,\n\tSDKError,\n};\n\n// Re-export types\nexport type {\n\tCurrentUser,\n\tPublishRequest,\n\tPublishResponse,\n\tSDKConfig,\n\tSkillManifest,\n\tSkillVersion,\n\tSkillVersionWithDownload,\n\tSkillWithUser,\n};\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\tconfigure({ baseUrl: `${registryUrl}/rpc`, apiKey });\n\t\tconst user = await me();\n\t\tif (!user) {\n\t\t\treturn null;\n\t\t}\n\t\treturn {\n\t\t\tusername: user.username,\n\t\t\tuserId: user.userId,\n\t\t};\n\t} catch {\n\t\treturn null;\n\t}\n}\n","/**\n * Base error class for PSPM configuration errors\n */\nexport class ConfigError extends Error {\n\tconstructor(message: string) {\n\t\tsuper(message);\n\t\tthis.name = \"ConfigError\";\n\t}\n}\n\n/**\n * Error thrown when a profile is not found\n */\nexport class ProfileNotFoundError extends ConfigError {\n\tconstructor(profileName: string) {\n\t\tsuper(\n\t\t\t`Profile \"${profileName}\" not found. Run 'pspm config list' to see available profiles.`,\n\t\t);\n\t\tthis.name = \"ProfileNotFoundError\";\n\t}\n}\n\n/**\n * Error thrown when no default profile is configured\n */\nexport class NoDefaultProfileError extends ConfigError {\n\tconstructor() {\n\t\tsuper(\n\t\t\t\"No default profile configured. Run 'pspm config add <name>' to create one.\",\n\t\t);\n\t\tthis.name = \"NoDefaultProfileError\";\n\t}\n}\n\n/**\n * Error thrown when config migration fails\n */\nexport class ConfigMigrationError extends ConfigError {\n\tconstructor(message: string) {\n\t\tsuper(`Failed to migrate config: ${message}`);\n\t\tthis.name = \"ConfigMigrationError\";\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","import { mkdir, readFile, stat, writeFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\nimport { NotLoggedInError, ProfileNotFoundError } from \"./errors.js\";\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/**\n * Individual profile configuration\n */\nexport interface ProfileConfig {\n\tregistryUrl: string;\n\tapiKey?: string;\n\tusername?: string;\n}\n\n/**\n * V1 config schema (for migration)\n */\nexport interface PspmConfigV1 {\n\tregistryUrl: string;\n\tapiKey?: string;\n\tusername?: string;\n}\n\n/**\n * V2 user config schema with profiles\n */\nexport interface UserConfigV2 {\n\tversion: 2;\n\tdefaultProfile: string;\n\tprofiles: Record<string, ProfileConfig>;\n}\n\n/**\n * Project config schema (.pspmrc)\n */\nexport interface ProjectConfig {\n\tprofile?: string;\n\tregistryUrl?: string;\n}\n\n/**\n * Source of config resolution\n */\nexport type ConfigSource = \"cli\" | \"env\" | \"project\" | \"user\" | \"default\";\n\n/**\n * Fully resolved configuration\n */\nexport interface ResolvedConfig {\n\tprofileName: string;\n\tprofileSource: ConfigSource;\n\tregistryUrl: string;\n\tapiKey?: string;\n\tusername?: string;\n}\n\n/**\n * Global CLI options passed to commands\n */\nexport interface GlobalOptions {\n\tprofile?: string;\n}\n\n// Legacy type alias for backward compatibility\nexport type PspmConfig = PspmConfigV1;\n\n// =============================================================================\n// Constants\n// =============================================================================\n\nconst DEFAULT_REGISTRY_URL = \"https://pspm.dev/api/skills\";\n\n/**\n * Get the config file path\n */\nexport function getConfigPath(): string {\n\treturn join(homedir(), \".pspm\", \"config.json\");\n}\n\n/**\n * Get the skills directory path (for current project)\n */\nexport function getSkillsDir(): string {\n\treturn join(process.cwd(), \".skills\");\n}\n\n/**\n * Get the lockfile path (for current project)\n */\nexport function getLockfilePath(): string {\n\treturn join(process.cwd(), \"skill-lock.json\");\n}\n\n// =============================================================================\n// V2 Config Functions\n// =============================================================================\n\n/**\n * Create a default empty V2 config\n */\nfunction createDefaultV2Config(): UserConfigV2 {\n\treturn {\n\t\tversion: 2,\n\t\tdefaultProfile: \"default\",\n\t\tprofiles: {\n\t\t\tdefault: {\n\t\t\t\tregistryUrl: DEFAULT_REGISTRY_URL,\n\t\t\t},\n\t\t},\n\t};\n}\n\n/**\n * Migrate V1 config to V2 format\n */\nexport function migrateV1ToV2(v1Config: PspmConfigV1): UserConfigV2 {\n\treturn {\n\t\tversion: 2,\n\t\tdefaultProfile: \"default\",\n\t\tprofiles: {\n\t\t\tdefault: {\n\t\t\t\tregistryUrl: v1Config.registryUrl || DEFAULT_REGISTRY_URL,\n\t\t\t\tapiKey: v1Config.apiKey,\n\t\t\t\tusername: v1Config.username,\n\t\t\t},\n\t\t},\n\t};\n}\n\n/**\n * Check if a config object is V2 format\n */\nfunction isV2Config(config: unknown): config is UserConfigV2 {\n\treturn (\n\t\ttypeof config === \"object\" &&\n\t\tconfig !== null &&\n\t\t\"version\" in config &&\n\t\t(config as { version: unknown }).version === 2\n\t);\n}\n\n/**\n * Read the user config file (V2 format, with auto-migration)\n */\nexport async function readUserConfig(): Promise<UserConfigV2> {\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\n\t\tif (process.env.PSPM_DEBUG) {\n\t\t\t// Show raw API key from file content for debugging\n\t\t\tconst apiKeyMatch = content.match(/\"apiKey\":\\s*\"([^\"]+)\"/);\n\t\t\tif (apiKeyMatch) {\n\t\t\t\tconsole.log(\n\t\t\t\t\t`[config] Raw apiKey from file: ${apiKeyMatch[1].substring(\n\t\t\t\t\t\t0,\n\t\t\t\t\t\t15,\n\t\t\t\t\t)}...`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tconst parsed = JSON.parse(content);\n\n\t\tif (process.env.PSPM_DEBUG) {\n\t\t\tconsole.log(\n\t\t\t\t`[config] Parsed config version: ${\n\t\t\t\t\t(parsed as { version?: unknown }).version\n\t\t\t\t}`,\n\t\t\t);\n\t\t\tconsole.log(\n\t\t\t\t`[config] Profiles found: ${Object.keys(\n\t\t\t\t\t(parsed as { profiles?: Record<string, unknown> }).profiles || {},\n\t\t\t\t).join(\", \")}`,\n\t\t\t);\n\t\t}\n\n\t\t// Check if already V2\n\t\tif (isV2Config(parsed)) {\n\t\t\treturn parsed;\n\t\t}\n\n\t\t// Migrate from V1\n\t\tconst v2Config = migrateV1ToV2(parsed as PspmConfigV1);\n\n\t\t// Write migrated config back\n\t\tawait writeUserConfig(v2Config);\n\n\t\treturn v2Config;\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\tconsole.log(`[config] Falling back to default config`);\n\t\t}\n\t\treturn createDefaultV2Config();\n\t}\n}\n\n/**\n * Write the user config file (V2 format)\n */\nexport async function writeUserConfig(config: UserConfigV2): Promise<void> {\n\tconst configPath = getConfigPath();\n\tawait mkdir(dirname(configPath), { recursive: true });\n\tawait writeFile(configPath, JSON.stringify(config, null, 2));\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\treturn JSON.parse(content) as ProjectConfig;\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 * Resolve the full configuration using cascade priority:\n * 1. CLI --profile flag\n * 2. PSPM_PROFILE env var\n * 3. Project .pspmrc file\n * 4. User config default profile\n * 5. Defaults\n *\n * Environment variables (PSPM_REGISTRY_URL, PSPM_API_KEY) always override profile values.\n */\nexport async function resolveConfig(\n\tglobalOptions?: GlobalOptions,\n): Promise<ResolvedConfig> {\n\tconst userConfig = await readUserConfig();\n\tconst projectConfig = await findProjectConfig();\n\n\t// Determine which profile to use (cascade priority)\n\tlet profileName: string;\n\tlet profileSource: ConfigSource;\n\n\tif (globalOptions?.profile) {\n\t\tprofileName = globalOptions.profile;\n\t\tprofileSource = \"cli\";\n\t} else if (process.env.PSPM_PROFILE) {\n\t\tprofileName = process.env.PSPM_PROFILE;\n\t\tprofileSource = \"env\";\n\t} else if (projectConfig?.profile) {\n\t\tprofileName = projectConfig.profile;\n\t\tprofileSource = \"project\";\n\t} else if (userConfig.defaultProfile) {\n\t\tprofileName = userConfig.defaultProfile;\n\t\tprofileSource = \"user\";\n\t} else {\n\t\tprofileName = \"default\";\n\t\tprofileSource = \"default\";\n\t}\n\n\t// Get the profile config\n\tconst profile = userConfig.profiles[profileName];\n\tif (!profile) {\n\t\tif (process.env.PSPM_DEBUG) {\n\t\t\tconsole.log(\n\t\t\t\t`[config] Profile \"${profileName}\" not found. Available: ${Object.keys(\n\t\t\t\t\tuserConfig.profiles,\n\t\t\t\t).join(\", \")}`,\n\t\t\t);\n\t\t}\n\t\tthrow new ProfileNotFoundError(profileName);\n\t}\n\n\tif (process.env.PSPM_DEBUG) {\n\t\tconsole.log(\n\t\t\t`[config] Using profile: ${profileName} (source: ${profileSource})`,\n\t\t);\n\t\tconsole.log(`[config] Profile has apiKey: ${!!profile.apiKey}`);\n\t}\n\n\t// Build resolved config, applying env var overrides\n\tlet registryUrl = profile.registryUrl;\n\tlet apiKey = profile.apiKey;\n\tconst username = profile.username;\n\n\t// Project config can override registryUrl (but not apiKey for security)\n\tif (projectConfig?.registryUrl) {\n\t\tregistryUrl = projectConfig.registryUrl;\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\treturn {\n\t\tprofileName,\n\t\tprofileSource,\n\t\tregistryUrl,\n\t\tapiKey,\n\t\tusername,\n\t};\n}\n\n/**\n * Get a specific profile from user config\n */\nexport async function getProfile(\n\tprofileName: string,\n): Promise<ProfileConfig | null> {\n\tconst userConfig = await readUserConfig();\n\treturn userConfig.profiles[profileName] || null;\n}\n\n/**\n * List all profile names\n */\nexport async function listProfiles(): Promise<string[]> {\n\tconst userConfig = await readUserConfig();\n\treturn Object.keys(userConfig.profiles);\n}\n\n/**\n * Add or update a profile\n */\nexport async function setProfile(\n\tprofileName: string,\n\tconfig: Partial<ProfileConfig>,\n): Promise<void> {\n\tconst userConfig = await readUserConfig();\n\n\tconst existing = userConfig.profiles[profileName] || {\n\t\tregistryUrl: DEFAULT_REGISTRY_URL,\n\t};\n\n\tuserConfig.profiles[profileName] = {\n\t\t...existing,\n\t\t...config,\n\t};\n\n\tawait writeUserConfig(userConfig);\n}\n\n/**\n * Delete a profile\n */\nexport async function deleteProfile(profileName: string): Promise<boolean> {\n\tconst userConfig = await readUserConfig();\n\n\tif (!userConfig.profiles[profileName]) {\n\t\treturn false;\n\t}\n\n\tdelete userConfig.profiles[profileName];\n\n\t// If we deleted the default profile, set a new default\n\tif (userConfig.defaultProfile === profileName) {\n\t\tconst remainingProfiles = Object.keys(userConfig.profiles);\n\t\tuserConfig.defaultProfile = remainingProfiles[0] || \"default\";\n\t}\n\n\tawait writeUserConfig(userConfig);\n\treturn true;\n}\n\n/**\n * Set the default profile\n */\nexport async function setDefaultProfile(profileName: string): Promise<void> {\n\tconst userConfig = await readUserConfig();\n\n\tif (!userConfig.profiles[profileName]) {\n\t\tthrow new ProfileNotFoundError(profileName);\n\t}\n\n\tuserConfig.defaultProfile = profileName;\n\tawait writeUserConfig(userConfig);\n}\n\n/**\n * Get the default profile name\n */\nexport async function getDefaultProfileName(): Promise<string> {\n\tconst userConfig = await readUserConfig();\n\treturn userConfig.defaultProfile;\n}\n\n// =============================================================================\n// Legacy Functions (for backward compatibility)\n// =============================================================================\n\n/**\n * Default configuration (legacy)\n * PSPM_REGISTRY_URL env var can override the default\n */\nconst DEFAULT_CONFIG: PspmConfig = {\n\tregistryUrl: process.env.PSPM_REGISTRY_URL || DEFAULT_REGISTRY_URL,\n};\n\n/**\n * Read the config file (legacy - wraps resolveConfig)\n */\nexport async function readConfig(): Promise<PspmConfig> {\n\ttry {\n\t\tconst resolved = await resolveConfig();\n\t\treturn {\n\t\t\tregistryUrl: resolved.registryUrl,\n\t\t\tapiKey: resolved.apiKey,\n\t\t\tusername: resolved.username,\n\t\t};\n\t} catch {\n\t\treturn { ...DEFAULT_CONFIG };\n\t}\n}\n\n/**\n * Write the config file (legacy - updates default profile)\n */\nexport async function writeConfig(config: Partial<PspmConfig>): Promise<void> {\n\tconst userConfig = await readUserConfig();\n\tconst defaultProfileName = userConfig.defaultProfile;\n\n\tconst existing = userConfig.profiles[defaultProfileName] || {\n\t\tregistryUrl: DEFAULT_REGISTRY_URL,\n\t};\n\n\tuserConfig.profiles[defaultProfileName] = {\n\t\t...existing,\n\t\t...config,\n\t};\n\n\tawait writeUserConfig(userConfig);\n}\n\n/**\n * Clear the config file (for logout) - clears credentials from default profile\n */\nexport async function clearConfig(): Promise<void> {\n\tconst userConfig = await readUserConfig();\n\tconst defaultProfileName = userConfig.defaultProfile;\n\n\tif (userConfig.profiles[defaultProfileName]) {\n\t\tuserConfig.profiles[defaultProfileName].apiKey = undefined;\n\t\tuserConfig.profiles[defaultProfileName].username = undefined;\n\t}\n\n\tawait writeUserConfig(userConfig);\n}\n\n/**\n * Check if user is logged in (legacy - checks resolved config)\n */\nexport async function isLoggedIn(\n\tglobalOptions?: GlobalOptions,\n): Promise<boolean> {\n\ttry {\n\t\tconst resolved = await resolveConfig(globalOptions);\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 * PSPM_API_KEY env var can override the stored key\n */\nexport async function requireApiKey(\n\tglobalOptions?: GlobalOptions,\n): Promise<string> {\n\tconst resolved = await resolveConfig(globalOptions);\n\n\tif (!resolved.apiKey) {\n\t\tif (process.env.PSPM_DEBUG) {\n\t\t\tconsole.log(\n\t\t\t\t`[config] requireApiKey: No API key found for profile \"${resolved.profileName}\"`,\n\t\t\t);\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(\n\t\t\t\t0,\n\t\t\t\t10,\n\t\t\t)}...)`,\n\t\t);\n\t}\n\n\treturn resolved.apiKey;\n}\n\n/**\n * Get the registry URL\n */\nexport async function getRegistryUrl(\n\tglobalOptions?: GlobalOptions,\n): Promise<string> {\n\tconst resolved = await resolveConfig(globalOptions);\n\treturn resolved.registryUrl;\n}\n\n/**\n * Clear credentials for a specific profile\n */\nexport async function clearProfileCredentials(\n\tprofileName: string,\n): Promise<void> {\n\tconst userConfig = await readUserConfig();\n\n\tif (userConfig.profiles[profileName]) {\n\t\tuserConfig.profiles[profileName].apiKey = undefined;\n\t\tuserConfig.profiles[profileName].username = undefined;\n\t\tawait writeUserConfig(userConfig);\n\t}\n}\n\n/**\n * Set credentials for a specific profile\n */\nexport async function setProfileCredentials(\n\tprofileName: string,\n\tapiKey: string,\n\tusername?: string,\n\tregistryUrl?: string,\n): Promise<void> {\n\tconst userConfig = await readUserConfig();\n\n\t// Create profile if it doesn't exist\n\tif (!userConfig.profiles[profileName]) {\n\t\tuserConfig.profiles[profileName] = {\n\t\t\tregistryUrl: registryUrl || DEFAULT_REGISTRY_URL,\n\t\t};\n\t}\n\n\tuserConfig.profiles[profileName].apiKey = apiKey;\n\tif (username) {\n\t\tuserConfig.profiles[profileName].username = username;\n\t}\n\tif (registryUrl) {\n\t\tuserConfig.profiles[profileName].registryUrl = registryUrl;\n\t}\n\n\tawait writeUserConfig(userConfig);\n}\n","import { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\nimport type { SkillLockfile, SkillLockfileEntry } from \"@repo/pspm-types\";\nimport { getLockfilePath, getRegistryUrl } from \"./config\";\n\n/**\n * Read the lockfile\n */\nexport async function readLockfile(): Promise<SkillLockfile | null> {\n\tconst lockfilePath = getLockfilePath();\n\n\ttry {\n\t\tconst content = await readFile(lockfilePath, \"utf-8\");\n\t\treturn JSON.parse(content) as SkillLockfile;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\n/**\n * Write the lockfile\n */\nexport async function writeLockfile(lockfile: SkillLockfile): Promise<void> {\n\tconst lockfilePath = getLockfilePath();\n\tawait mkdir(dirname(lockfilePath), { recursive: true });\n\tawait writeFile(lockfilePath, `${JSON.stringify(lockfile, null, 2)}\\n`);\n}\n\n/**\n * Create a new empty lockfile\n */\nexport async function createEmptyLockfile(): Promise<SkillLockfile> {\n\tconst registryUrl = await getRegistryUrl();\n\treturn {\n\t\tlockfileVersion: 1,\n\t\tregistryUrl,\n\t\tskills: {},\n\t};\n}\n\n/**\n * Add a skill to the lockfile\n */\nexport async function addToLockfile(\n\tfullName: string,\n\tentry: SkillLockfileEntry,\n): Promise<void> {\n\tlet lockfile = await readLockfile();\n\tif (!lockfile) {\n\t\tlockfile = await createEmptyLockfile();\n\t}\n\n\tlockfile.skills[fullName] = entry;\n\tawait writeLockfile(lockfile);\n}\n\n/**\n * Remove a skill from the lockfile\n */\nexport async function removeFromLockfile(fullName: string): Promise<boolean> {\n\tconst lockfile = await readLockfile();\n\tif (!lockfile || !lockfile.skills[fullName]) {\n\t\treturn false;\n\t}\n\n\tdelete lockfile.skills[fullName];\n\tawait writeLockfile(lockfile);\n\treturn true;\n}\n\n/**\n * Get a skill entry from the lockfile\n */\nexport async function getFromLockfile(\n\tfullName: string,\n): Promise<SkillLockfileEntry | null> {\n\tconst lockfile = await readLockfile();\n\tif (!lockfile || !lockfile.skills[fullName]) {\n\t\treturn null;\n\t}\n\treturn lockfile.skills[fullName];\n}\n\n/**\n * List all skills in the lockfile\n */\nexport async function listLockfileSkills(): Promise<\n\tArray<{ name: string; entry: SkillLockfileEntry }>\n> {\n\tconst lockfile = await readLockfile();\n\tif (!lockfile) {\n\t\treturn [];\n\t}\n\n\treturn Object.entries(lockfile.skills).map(([name, entry]) => ({\n\t\tname,\n\t\tentry: entry as SkillLockfileEntry,\n\t}));\n}\n","import { mkdir, rm } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport {\n\tcalculateIntegrity,\n\tparseSkillSpecifier,\n\tresolveVersion,\n} from \"@repo/pspm-types\";\nimport { configure, getVersion, listVersions } from \"../api-client.js\";\nimport {\n\ttype GlobalOptions,\n\tgetRegistryUrl,\n\tgetSkillsDir,\n\trequireApiKey,\n} from \"../config.js\";\nimport { addToLockfile } from \"../lockfile.js\";\n\nexport interface AddOptions {\n\tsave?: boolean;\n}\n\nexport async function add(\n\tspecifier: string,\n\t_options: AddOptions,\n\tglobalOptions?: GlobalOptions,\n): Promise<void> {\n\ttry {\n\t\tconst apiKey = await requireApiKey(globalOptions);\n\t\tconst registryUrl = await getRegistryUrl(globalOptions);\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\n\t\tconfigure({ baseUrl: `${registryUrl}/rpc`, apiKey });\n\n\t\tconsole.log(`Resolving ${specifier}...`);\n\n\t\t// Get available versions\n\t\tconst versions = await listVersions({ username, name });\n\t\tif (versions.length === 0) {\n\t\t\tconsole.error(`Error: Skill @user/${username}/${name} not found`);\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\t// Resolve version\n\t\tconst versionStrings = versions.map((v: { version: string }) => v.version);\n\t\tconst resolved = resolveVersion(versionRange || \"*\", versionStrings);\n\n\t\tif (!resolved) {\n\t\t\tconsole.error(\n\t\t\t\t`Error: No version matching \"${versionRange || \"latest\"}\" found for @user/${username}/${name}`,\n\t\t\t);\n\t\t\tconsole.error(`Available versions: ${versionStrings.join(\", \")}`);\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\tconsole.log(`Installing @user/${username}/${name}@${resolved}...`);\n\n\t\t// Get version details with download URL\n\t\tconst versionInfo = await getVersion({\n\t\t\tusername,\n\t\t\tname,\n\t\t\tversion: resolved,\n\t\t});\n\t\tif (!versionInfo) {\n\t\t\tconsole.error(`Error: Version ${resolved} not found`);\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\t// Download the tarball via the API endpoint\n\t\t// Use the API download endpoint for reliability (handles redirects)\n\t\tconst downloadUrl = `${registryUrl}/@user/${username}/${name}/${resolved}/download`;\n\n\t\tconst tarballResponse = await fetch(downloadUrl, {\n\t\t\theaders: {\n\t\t\t\tAuthorization: `Bearer ${apiKey}`,\n\t\t\t},\n\t\t\tredirect: \"follow\",\n\t\t});\n\n\t\tif (!tarballResponse.ok) {\n\t\t\tconsole.error(\n\t\t\t\t`Error: Failed to download tarball (${tarballResponse.status})`,\n\t\t\t);\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\tconst tarballBuffer = Buffer.from(await tarballResponse.arrayBuffer());\n\n\t\t// Calculate integrity\n\t\tconst integrity = calculateIntegrity(tarballBuffer);\n\n\t\t// Verify checksum matches\n\t\tconst expectedIntegrity = `sha256-${Buffer.from(versionInfo.checksum, \"hex\").toString(\"base64\")}`;\n\t\tif (integrity !== expectedIntegrity) {\n\t\t\tconsole.error(\"Error: Checksum verification failed\");\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\t// Create skills directory\n\t\tconst skillsDir = getSkillsDir();\n\t\tconst destDir = join(skillsDir, username, name);\n\t\tawait mkdir(destDir, { recursive: true });\n\n\t\t// Extract tarball\n\t\tconst { writeFile } = await import(\"node:fs/promises\");\n\t\tconst tempFile = join(destDir, \".temp.tgz\");\n\t\tawait writeFile(tempFile, tarballBuffer);\n\n\t\tconst { exec } = await import(\"node:child_process\");\n\t\tconst { promisify } = await import(\"node:util\");\n\t\tconst execAsync = promisify(exec);\n\n\t\ttry {\n\t\t\t// Clear destination and extract\n\t\t\tawait rm(destDir, { recursive: true, force: true });\n\t\t\tawait mkdir(destDir, { recursive: true });\n\t\t\tawait writeFile(tempFile, tarballBuffer);\n\t\t\tawait execAsync(\n\t\t\t\t`tar -xzf \"${tempFile}\" -C \"${destDir}\" --strip-components=1`,\n\t\t\t);\n\t\t} finally {\n\t\t\tawait rm(tempFile, { force: true });\n\t\t}\n\n\t\t// Update lockfile\n\t\tconst fullName = `@user/${username}/${name}`;\n\t\tawait addToLockfile(fullName, {\n\t\t\tversion: resolved,\n\t\t\tresolved: versionInfo.downloadUrl,\n\t\t\tintegrity,\n\t\t});\n\n\t\tconsole.log(`Installed @user/${username}/${name}@${resolved}`);\n\t\tconsole.log(`Location: ${destDir}`);\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : \"Unknown error\";\n\t\tconsole.error(`Error: ${message}`);\n\t\tprocess.exit(1);\n\t}\n}\n","import { getProfile, setProfile } from \"../../config.js\";\n\nexport interface ConfigAddOptions {\n\tregistryUrl?: string;\n}\n\n/**\n * Create a new profile\n */\nexport async function configAdd(\n\tname: string,\n\toptions: ConfigAddOptions,\n): Promise<void> {\n\ttry {\n\t\t// Check if profile already exists\n\t\tconst existing = await getProfile(name);\n\t\tif (existing) {\n\t\t\tconsole.error(`Error: Profile \"${name}\" already exists.`);\n\t\t\tconsole.log(\"Use 'pspm config set' to modify it.\");\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\t// Create the profile\n\t\tawait setProfile(name, {\n\t\t\tregistryUrl: options.registryUrl || \"https://pspm.dev/api/skills\",\n\t\t});\n\n\t\tconsole.log(`Created profile \"${name}\".`);\n\n\t\tif (options.registryUrl) {\n\t\t\tconsole.log(` Registry URL: ${options.registryUrl}`);\n\t\t}\n\n\t\tconsole.log(\"\");\n\t\tconsole.log(\n\t\t\t`To set credentials, run: pspm login --api-key <key> --profile ${name}`,\n\t\t);\n\t\tconsole.log(`To make this the default, run: pspm config use ${name}`);\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\tdeleteProfile,\n\tgetDefaultProfileName,\n\tlistProfiles,\n} from \"../../config.js\";\n\n/**\n * Delete a profile\n */\nexport async function configDelete(name: string): Promise<void> {\n\ttry {\n\t\tconst profiles = await listProfiles();\n\t\tconst defaultProfile = await getDefaultProfileName();\n\n\t\t// Check if profile exists\n\t\tif (!profiles.includes(name)) {\n\t\t\tconsole.error(`Error: Profile \"${name}\" not found.`);\n\t\t\tconsole.log(\"Run 'pspm config list' to see available profiles.\");\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\t// Prevent deleting last profile\n\t\tif (profiles.length === 1) {\n\t\t\tconsole.error(\"Error: Cannot delete the last profile.\");\n\t\t\tconsole.log(\"Create another profile first, then delete this one.\");\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\tconst wasDefault = name === defaultProfile;\n\t\tconst success = await deleteProfile(name);\n\n\t\tif (success) {\n\t\t\tconsole.log(`Deleted profile \"${name}\".`);\n\t\t\tif (wasDefault) {\n\t\t\t\tconst newDefault = await getDefaultProfileName();\n\t\t\t\tconsole.log(`Default profile is now \"${newDefault}\".`);\n\t\t\t}\n\t\t} else {\n\t\t\tconsole.error(`Error: Failed to delete profile \"${name}\".`);\n\t\t\tprocess.exit(1);\n\t\t}\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : \"Unknown error\";\n\t\tconsole.error(`Error: ${message}`);\n\t\tprocess.exit(1);\n\t}\n}\n","import { stat, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { ProjectConfig } from \"../../config.js\";\n\nexport interface ConfigInitOptions {\n\tprofile?: string;\n\tregistryUrl?: string;\n}\n\n/**\n * Create a .pspmrc file in the current directory\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 the config\n\t\tconst config: ProjectConfig = {};\n\n\t\tif (options.profile) {\n\t\t\tconfig.profile = options.profile;\n\t\t}\n\t\tif (options.registryUrl) {\n\t\t\tconfig.registryUrl = options.registryUrl;\n\t\t}\n\n\t\t// If no options provided, create a minimal example\n\t\tif (Object.keys(config).length === 0) {\n\t\t\tconfig.profile = \"development\";\n\t\t}\n\n\t\t// Write the file\n\t\tawait writeFile(configPath, `${JSON.stringify(config, null, 2)}\\n`);\n\n\t\tconsole.log(\"Created .pspmrc\");\n\t\tconsole.log(\"\");\n\t\tconsole.log(\"Contents:\");\n\t\tconsole.log(JSON.stringify(config, null, 2));\n\t\tconsole.log(\"\");\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 { getDefaultProfileName, listProfiles } from \"../../config.js\";\n\n/**\n * List all available profiles\n */\nexport async function configList(): Promise<void> {\n\ttry {\n\t\tconst profiles = await listProfiles();\n\t\tconst defaultProfile = await getDefaultProfileName();\n\n\t\tif (profiles.length === 0) {\n\t\t\tconsole.log(\"No profiles configured.\");\n\t\t\tconsole.log(\"Run 'pspm config add <name>' to create one.\");\n\t\t\treturn;\n\t\t}\n\n\t\tconsole.log(\"Profiles:\\n\");\n\t\tfor (const name of profiles) {\n\t\t\tconst marker = name === defaultProfile ? \" (default)\" : \"\";\n\t\t\tconsole.log(` ${name}${marker}`);\n\t\t}\n\t\tconsole.log(\"\");\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 { getProfile, setProfile } from \"../../config.js\";\n\nconst VALID_KEYS = [\"registryUrl\", \"apiKey\", \"username\"] as const;\ntype ValidKey = (typeof VALID_KEYS)[number];\n\n/**\n * Set a profile field value\n */\nexport async function configSet(\n\tprofile: string,\n\tkey: string,\n\tvalue: string,\n): Promise<void> {\n\ttry {\n\t\t// Validate key\n\t\tif (!VALID_KEYS.includes(key as ValidKey)) {\n\t\t\tconsole.error(`Error: Invalid key \"${key}\".`);\n\t\t\tconsole.log(`Valid keys: ${VALID_KEYS.join(\", \")}`);\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\t// Check if profile exists\n\t\tconst existing = await getProfile(profile);\n\t\tif (!existing) {\n\t\t\tconsole.error(`Error: Profile \"${profile}\" not found.`);\n\t\t\tconsole.log(\"Run 'pspm config add' to create it first.\");\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\t// Update the profile\n\t\tawait setProfile(profile, { [key]: value });\n\t\tconsole.log(`Updated ${key} for profile \"${profile}\".`);\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\ttype GlobalOptions,\n\tgetConfigPath,\n\tgetDefaultProfileName,\n\tgetProfile,\n\tresolveConfig,\n} from \"../../config.js\";\n\nexport interface ConfigShowOptions {\n\tname?: string;\n}\n\n/**\n * Show profile details or resolved config\n */\nexport async function configShow(\n\toptions: ConfigShowOptions,\n\tglobalOptions?: GlobalOptions,\n): Promise<void> {\n\ttry {\n\t\tif (options.name) {\n\t\t\t// Show specific profile\n\t\t\tconst profile = await getProfile(options.name);\n\t\t\tif (!profile) {\n\t\t\t\tconsole.error(`Error: Profile \"${options.name}\" not found.`);\n\t\t\t\tconsole.log(\"Run 'pspm config list' to see available profiles.\");\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\n\t\t\tconst defaultProfile = await getDefaultProfileName();\n\t\t\tconst isDefault = options.name === defaultProfile;\n\n\t\t\tconsole.log(`Profile: ${options.name}${isDefault ? \" (default)\" : \"\"}\\n`);\n\t\t\tconsole.log(` Registry URL: ${profile.registryUrl}`);\n\t\t\tconsole.log(` API Key: ${profile.apiKey ? \"***\" : \"(not set)\"}`);\n\t\t\tconsole.log(` Username: ${profile.username || \"(not set)\"}`);\n\t\t} else {\n\t\t\t// Show resolved config\n\t\t\tconst resolved = await resolveConfig(globalOptions);\n\t\t\tconst projectConfig = await findProjectConfig();\n\t\t\tconst configPath = getConfigPath();\n\n\t\t\tconsole.log(\"Resolved Configuration:\\n\");\n\t\t\tconsole.log(` Active Profile: ${resolved.profileName}`);\n\t\t\tconsole.log(` Profile Source: ${formatSource(resolved.profileSource)}`);\n\t\t\tconsole.log(` Registry URL: ${resolved.registryUrl}`);\n\t\t\tconsole.log(` API Key: ${resolved.apiKey ? \"***\" : \"(not set)\"}`);\n\t\t\tconsole.log(` Username: ${resolved.username || \"(not set)\"}`);\n\t\t\tconsole.log(\"\");\n\t\t\tconsole.log(\"Config Locations:\");\n\t\t\tconsole.log(` User config: ${configPath}`);\n\t\t\tconsole.log(` Project config: ${projectConfig ? \".pspmrc\" : \"(none)\"}`);\n\t\t}\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : \"Unknown error\";\n\t\tconsole.error(`Error: ${message}`);\n\t\tprocess.exit(1);\n\t}\n}\n\nfunction formatSource(source: string): string {\n\tswitch (source) {\n\t\tcase \"cli\":\n\t\t\treturn \"--profile flag\";\n\t\tcase \"env\":\n\t\t\treturn \"PSPM_PROFILE env var\";\n\t\tcase \"project\":\n\t\t\treturn \".pspmrc file\";\n\t\tcase \"user\":\n\t\t\treturn \"user config default\";\n\t\tcase \"default\":\n\t\t\treturn \"fallback default\";\n\t\tdefault:\n\t\t\treturn source;\n\t}\n}\n","import { getProfile, setDefaultProfile } from \"../../config.js\";\n\n/**\n * Set the default profile\n */\nexport async function configUse(name: string): Promise<void> {\n\ttry {\n\t\t// Check if profile exists\n\t\tconst profile = await getProfile(name);\n\t\tif (!profile) {\n\t\t\tconsole.error(`Error: Profile \"${name}\" not found.`);\n\t\t\tconsole.log(\"Run 'pspm config list' to see available profiles.\");\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\tawait setDefaultProfile(name);\n\t\tconsole.log(`Default profile set to \"${name}\".`);\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : \"Unknown error\";\n\t\tconsole.error(`Error: ${message}`);\n\t\tprocess.exit(1);\n\t}\n}\n","import { mkdir, rm } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { SkillLockfileEntry } from \"@repo/pspm-types\";\nimport {\n\ttype GlobalOptions,\n\tgetRegistryUrl,\n\tgetSkillsDir,\n\trequireApiKey,\n} from \"../config.js\";\nimport { readLockfile } from \"../lockfile.js\";\n\nexport interface InstallOptions {\n\tfrozenLockfile?: boolean;\n\tdir?: string;\n}\n\nexport async function install(\n\toptions: InstallOptions,\n\tglobalOptions?: GlobalOptions,\n): Promise<void> {\n\ttry {\n\t\tconst apiKey = await requireApiKey(globalOptions);\n\t\tawait getRegistryUrl(globalOptions); // Validate we have a registry configured\n\t\tconst skillsDir = options.dir || getSkillsDir();\n\n\t\tconst lockfile = await readLockfile();\n\t\tif (!lockfile) {\n\t\t\tif (options.frozenLockfile) {\n\t\t\t\tconsole.error(\n\t\t\t\t\t\"Error: No lockfile found. Cannot install with --frozen-lockfile\",\n\t\t\t\t);\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\t\t\tconsole.log(\"No lockfile found. Nothing to install.\");\n\t\t\treturn;\n\t\t}\n\n\t\tconst skillCount = Object.keys(lockfile.skills).length;\n\t\tif (skillCount === 0) {\n\t\t\tconsole.log(\"No skills in lockfile. Nothing to install.\");\n\t\t\treturn;\n\t\t}\n\n\t\tconsole.log(`Installing ${skillCount} skill(s)...\\n`);\n\n\t\tconst entries = Object.entries(lockfile.skills) as [\n\t\t\tstring,\n\t\t\tSkillLockfileEntry,\n\t\t][];\n\n\t\tfor (const [fullName, entry] of entries) {\n\t\t\tconst match = fullName.match(/^@user\\/([^/]+)\\/([^/]+)$/);\n\t\t\tif (!match) {\n\t\t\t\tconsole.warn(`Warning: Invalid skill name in lockfile: ${fullName}`);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst [, username, name] = match;\n\t\t\tconsole.log(`Installing ${fullName}@${entry.version}...`);\n\n\t\t\t// Download the tarball\n\t\t\tconst response = await fetch(entry.resolved, {\n\t\t\t\theaders: {\n\t\t\t\t\tAuthorization: `Bearer ${apiKey}`,\n\t\t\t\t},\n\t\t\t\tredirect: \"follow\",\n\t\t\t});\n\n\t\t\tif (!response.ok) {\n\t\t\t\tconsole.error(\n\t\t\t\t\t` Error: Failed to download ${fullName} (${response.status})`,\n\t\t\t\t);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst tarballBuffer = Buffer.from(await response.arrayBuffer());\n\n\t\t\t// Verify checksum\n\t\t\tconst { createHash } = await import(\"node:crypto\");\n\t\t\tconst actualIntegrity = `sha256-${createHash(\"sha256\").update(tarballBuffer).digest(\"base64\")}`;\n\n\t\t\tif (actualIntegrity !== entry.integrity) {\n\t\t\t\tconsole.error(` Error: Checksum verification failed for ${fullName}`);\n\t\t\t\tif (options.frozenLockfile) {\n\t\t\t\t\tprocess.exit(1);\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Extract tarball\n\t\t\tconst destDir = join(skillsDir, username, name);\n\t\t\tawait rm(destDir, { recursive: true, force: true });\n\t\t\tawait mkdir(destDir, { recursive: true });\n\n\t\t\tconst tempFile = join(destDir, \".temp.tgz\");\n\t\t\tconst { writeFile } = await import(\"node:fs/promises\");\n\t\t\tawait writeFile(tempFile, tarballBuffer);\n\n\t\t\tconst { exec } = await import(\"node:child_process\");\n\t\t\tconst { promisify } = await import(\"node:util\");\n\t\t\tconst execAsync = promisify(exec);\n\n\t\t\ttry {\n\t\t\t\tawait execAsync(\n\t\t\t\t\t`tar -xzf \"${tempFile}\" -C \"${destDir}\" --strip-components=1`,\n\t\t\t\t);\n\t\t\t} finally {\n\t\t\t\tawait rm(tempFile, { force: true });\n\t\t\t}\n\n\t\t\tconsole.log(` Installed to ${destDir}`);\n\t\t}\n\n\t\tconsole.log(`\\nAll ${skillCount} skill(s) installed.`);\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : \"Unknown error\";\n\t\tconsole.error(`Error: ${message}`);\n\t\tprocess.exit(1);\n\t}\n}\n","import { access } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { getSkillsDir } from \"../config.js\";\nimport { listLockfileSkills } from \"../lockfile.js\";\n\nexport interface ListOptions {\n\tjson?: boolean;\n}\n\nexport async function list(options: ListOptions): Promise<void> {\n\ttry {\n\t\tconst skills = await listLockfileSkills();\n\n\t\tif (skills.length === 0) {\n\t\t\tconsole.log(\"No skills installed.\");\n\t\t\treturn;\n\t\t}\n\n\t\tif (options.json) {\n\t\t\tconsole.log(JSON.stringify(skills, null, 2));\n\t\t\treturn;\n\t\t}\n\n\t\tconst skillsDir = getSkillsDir();\n\n\t\tconsole.log(\"Installed skills:\\n\");\n\n\t\tfor (const { name, entry } of skills) {\n\t\t\tconst match = name.match(/^@user\\/([^/]+)\\/([^/]+)$/);\n\t\t\tif (!match) continue;\n\n\t\t\tconst [, username, skillName] = match;\n\t\t\tconst skillPath = join(skillsDir, username, skillName);\n\n\t\t\t// Check if skill is actually installed on disk\n\t\t\tlet status = \"installed\";\n\t\t\ttry {\n\t\t\t\tawait access(skillPath);\n\t\t\t} catch {\n\t\t\t\tstatus = \"missing\";\n\t\t\t}\n\n\t\t\tconsole.log(` ${name}@${entry.version}`);\n\t\t\tif (status === \"missing\") {\n\t\t\t\tconsole.log(` Status: MISSING (run 'pspm install' to restore)`);\n\t\t\t}\n\t\t}\n\n\t\tconsole.log(`\\nTotal: ${skills.length} skill(s)`);\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : \"Unknown error\";\n\t\tconsole.error(`Error: ${message}`);\n\t\tprocess.exit(1);\n\t}\n}\n","import { randomBytes } from \"node:crypto\";\nimport http from \"node:http\";\nimport { URL } from \"node:url\";\nimport open from \"open\";\nimport { whoamiRequest } from \"../api-client.js\";\nimport {\n\ttype GlobalOptions,\n\tgetRegistryUrl,\n\tresolveConfig,\n\tsetProfileCredentials,\n} 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/api/skills\n * The web app URL should be like 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/api/skills\n * The server URL should be like 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\tconst rpcUrl = `${serverUrl}/api/api-keys/rpc/exchangeCliToken`;\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(globalOptions?: GlobalOptions): Promise<void> {\n\tconst resolved = await resolveConfig(globalOptions);\n\tconst registryUrl = await getRegistryUrl(globalOptions);\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 setProfileCredentials(\n\t\tresolved.profileName,\n\t\tapiKey,\n\t\tusername,\n\t\tregistryUrl,\n\t);\n\n\tconsole.log(`Logged in as ${username}`);\n\tconsole.log(`Profile: ${resolved.profileName}`);\n\tconsole.log(`Registry: ${registryUrl}`);\n}\n\n/**\n * Login using direct API key (fallback method)\n */\nasync function directLogin(\n\tapiKey: string,\n\tglobalOptions?: GlobalOptions,\n): Promise<void> {\n\tconsole.log(\"Verifying API key...\");\n\n\tconst resolved = await resolveConfig(globalOptions);\n\tconst registryUrl = await getRegistryUrl(globalOptions);\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 for the resolved profile\n\tawait setProfileCredentials(\n\t\tresolved.profileName,\n\t\tapiKey,\n\t\tuser.username,\n\t\tregistryUrl,\n\t);\n\tconsole.log(`Logged in as ${user.username}`);\n\tconsole.log(`Profile: ${resolved.profileName}`);\n\tconsole.log(`Registry: ${registryUrl}`);\n}\n\nexport async function login(\n\toptions: LoginOptions,\n\tglobalOptions?: GlobalOptions,\n): 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, globalOptions);\n\t\t} else {\n\t\t\t// Browser-based OAuth flow\n\t\t\tawait browserLogin(globalOptions);\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\tclearProfileCredentials,\n\ttype GlobalOptions,\n\tisLoggedIn,\n\tresolveConfig,\n} from \"../config.js\";\n\nexport async function logout(globalOptions?: GlobalOptions): Promise<void> {\n\ttry {\n\t\tconst resolved = await resolveConfig(globalOptions);\n\t\tconst loggedIn = await isLoggedIn(globalOptions);\n\n\t\tif (!loggedIn) {\n\t\t\tconsole.log(`Not logged in (profile: ${resolved.profileName}).`);\n\t\t\treturn;\n\t\t}\n\n\t\tawait clearProfileCredentials(resolved.profileName);\n\t\tconsole.log(`Logged out from profile \"${resolved.profileName}\".`);\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 { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { promisify } from \"node:util\";\nimport { configure, publish, type SkillManifest } from \"../api-client.js\";\nimport {\n\ttype GlobalOptions,\n\tgetRegistryUrl,\n\trequireApiKey,\n} from \"../config.js\";\n\nconst exec = promisify(execCb);\n\nexport interface PublishOptions {\n\tbump?: \"major\" | \"minor\" | \"patch\";\n\ttag?: string;\n}\n\nexport async function publishCommand(\n\toptions: PublishOptions,\n\tglobalOptions?: GlobalOptions,\n): Promise<void> {\n\ttry {\n\t\tconst apiKey = await requireApiKey(globalOptions);\n\t\tconst registryUrl = await getRegistryUrl(globalOptions);\n\n\t\t// Read package.json from current directory\n\t\tconst packageJsonPath = join(process.cwd(), \"package.json\");\n\t\tlet packageJson: SkillManifest;\n\n\t\ttry {\n\t\t\tconst content = await readFile(packageJsonPath, \"utf-8\");\n\t\t\tpackageJson = JSON.parse(content);\n\t\t} catch {\n\t\t\tconsole.error(\"Error: No package.json found in current directory\");\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\t// Validate required fields\n\t\tif (!packageJson.name) {\n\t\t\tconsole.error(\"Error: package.json must have a 'name' field\");\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\tif (!packageJson.version) {\n\t\t\tconsole.error(\"Error: package.json must have a 'version' field\");\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\t// Handle version bump if requested\n\t\tif (options.bump) {\n\t\t\tconst semver = await import(\"semver\");\n\t\t\tconst newVersion = semver.default.inc(packageJson.version, options.bump);\n\t\t\tif (!newVersion) {\n\t\t\t\tconsole.error(\n\t\t\t\t\t`Error: Failed to bump version from ${packageJson.version}`,\n\t\t\t\t);\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\t\t\tpackageJson.version = newVersion;\n\t\t\tconsole.log(`Bumped version to ${newVersion}`);\n\t\t}\n\n\t\tconsole.log(`Registry: ${registryUrl}`);\n\t\tconsole.log(`Publishing ${packageJson.name}@${packageJson.version}...`);\n\n\t\t// Create tarball using npm pack (or tar directly)\n\t\t// Sanitize name for filename (replace @ and / with -)\n\t\tconst safeName = packageJson.name.replace(/[@/]/g, \"-\").replace(/^-+/, \"\");\n\t\tconst tarballName = `${safeName}-${packageJson.version}.tgz`;\n\t\tconst tempDir = join(process.cwd(), \".pspm-publish\");\n\n\t\t// Create tarball\n\t\ttry {\n\t\t\tawait exec(`rm -rf \"${tempDir}\" && mkdir -p \"${tempDir}\"`);\n\n\t\t\t// Get files to include (use 'files' from package.json or default)\n\t\t\tconst files = packageJson.files || [\n\t\t\t\t\"package.json\",\n\t\t\t\t\"SKILL.md\",\n\t\t\t\t\"runtime\",\n\t\t\t\t\"scripts\",\n\t\t\t\t\"data\",\n\t\t\t];\n\n\t\t\t// Create the tarball structure: package/{files}\n\t\t\tawait exec(`mkdir -p \"${tempDir}/package\"`);\n\n\t\t\tfor (const file of files) {\n\t\t\t\ttry {\n\t\t\t\t\t// Use rsync to copy while excluding node_modules\n\t\t\t\t\tawait exec(\n\t\t\t\t\t\t`rsync -a --exclude='node_modules' --exclude='.git' \"${file}\" \"${tempDir}/package/\" 2>/dev/null || true`,\n\t\t\t\t\t);\n\t\t\t\t} catch {\n\t\t\t\t\t// Ignore files that don't exist\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Always include package.json\n\t\t\tawait exec(`cp package.json \"${tempDir}/package/\"`);\n\n\t\t\t// 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 convert to base64\n\t\t\tconst tarballBuffer = await readFile(tarballPath);\n\t\t\tconst tarballBase64 = tarballBuffer.toString(\"base64\");\n\n\t\t\t// Configure SDK and publish\n\t\t\tconfigure({ baseUrl: `${registryUrl}/rpc`, apiKey });\n\t\t\tconst result = await publish({\n\t\t\t\tmanifest: packageJson,\n\t\t\t\ttarballBase64,\n\t\t\t});\n\n\t\t\tconsole.log(\n\t\t\t\t`\\nPublished @user/${result.skill.username}/${result.skill.name}@${result.version.version}`,\n\t\t\t);\n\t\t\tconsole.log(`Checksum: ${result.version.checksum}`);\n\t\t} finally {\n\t\t\t// Cleanup\n\t\t\tawait exec(`rm -rf \"${tempDir}\"`).catch(() => {});\n\t\t}\n\t} catch (error) {\n\t\t// Try to extract detailed error info\n\t\tif (error instanceof Error) {\n\t\t\tconsole.error(`Error: ${error.message}`);\n\n\t\t\t// Check for oRPC error with response details\n\t\t\tconst anyError = error as {\n\t\t\t\tcause?: { response?: Response; data?: unknown; body?: unknown };\n\t\t\t\tresponse?: Response;\n\t\t\t\tdata?: unknown;\n\t\t\t\tbody?: unknown;\n\t\t\t};\n\n\t\t\t// Try to get response body for more details\n\t\t\tif (anyError.cause?.response) {\n\t\t\t\ttry {\n\t\t\t\t\tconst text = await anyError.cause.response.text();\n\t\t\t\t\tconsole.error(`Response body: ${text}`);\n\t\t\t\t} catch {\n\t\t\t\t\t// ignore\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Log cause body if available\n\t\t\tif (anyError.cause?.body) {\n\t\t\t\tconsole.error(\n\t\t\t\t\t`Cause body: ${JSON.stringify(anyError.cause.body, null, 2)}`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (anyError.body) {\n\t\t\t\tconsole.error(`Error body: ${JSON.stringify(anyError.body, null, 2)}`);\n\t\t\t}\n\n\t\t\t// Log additional error properties\n\t\t\tif (anyError.data) {\n\t\t\t\tconsole.error(`Error data: ${JSON.stringify(anyError.data, null, 2)}`);\n\t\t\t}\n\n\t\t\t// Log the full error in verbose mode\n\t\t\tif (process.env.PSPM_DEBUG) {\n\t\t\t\tconsole.error(\"\\nFull error details:\");\n\t\t\t\tconsole.error(error);\n\t\t\t\tif (error.stack) {\n\t\t\t\t\tconsole.error(\"\\nStack trace:\");\n\t\t\t\t\tconsole.error(error.stack);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tconsole.error(`Error: ${String(error)}`);\n\t\t}\n\t\tconsole.error(\"\\nTip: Set PSPM_DEBUG=1 for more detailed error output\");\n\t\tprocess.exit(1);\n\t}\n}\n\n// Keep old export name for backwards compatibility\nexport { publishCommand as publish };\n","import { rm } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { getSkillsDir, requireApiKey } from \"../config.js\";\nimport { listLockfileSkills, removeFromLockfile } from \"../lockfile.js\";\n\nexport async function remove(nameOrSpecifier: string): Promise<void> {\n\ttry {\n\t\tawait requireApiKey();\n\n\t\t// Normalize the name\n\t\tlet fullName: string;\n\t\tlet username: string;\n\t\tlet name: string;\n\n\t\tif (nameOrSpecifier.startsWith(\"@user/\")) {\n\t\t\t// Full specifier: @user/{username}/{name}\n\t\t\tconst match = nameOrSpecifier.match(/^@user\\/([^/]+)\\/([^@/]+)/);\n\t\t\tif (!match) {\n\t\t\t\tconsole.error(`Error: Invalid skill specifier: ${nameOrSpecifier}`);\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\t\t\tfullName = `@user/${match[1]}/${match[2]}`;\n\t\t\tusername = match[1];\n\t\t\tname = match[2];\n\t\t} else {\n\t\t\t// Short name - find in lockfile\n\t\t\tconst skills = await listLockfileSkills();\n\t\t\tconst found = skills.find((s) => {\n\t\t\t\tconst match = s.name.match(/^@user\\/([^/]+)\\/([^/]+)$/);\n\t\t\t\treturn match && match[2] === nameOrSpecifier;\n\t\t\t});\n\n\t\t\tif (!found) {\n\t\t\t\tconsole.error(\n\t\t\t\t\t`Error: Skill \"${nameOrSpecifier}\" not found in lockfile`,\n\t\t\t\t);\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\n\t\t\tfullName = found.name;\n\t\t\tconst match = fullName.match(/^@user\\/([^/]+)\\/([^/]+)$/);\n\t\t\tif (!match) {\n\t\t\t\tconsole.error(`Error: Invalid skill name in lockfile: ${fullName}`);\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\t\t\tusername = match[1];\n\t\t\tname = match[2];\n\t\t}\n\n\t\tconsole.log(`Removing ${fullName}...`);\n\n\t\t// Remove from lockfile\n\t\tconst removed = await removeFromLockfile(fullName);\n\t\tif (!removed) {\n\t\t\tconsole.error(`Error: ${fullName} not found in lockfile`);\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\t// Remove from disk\n\t\tconst skillsDir = getSkillsDir();\n\t\tconst destDir = join(skillsDir, username, name);\n\n\t\ttry {\n\t\t\tawait rm(destDir, { recursive: true, force: true });\n\t\t} catch {\n\t\t\t// Ignore errors if directory doesn't exist\n\t\t}\n\n\t\tconsole.log(`Removed ${fullName}`);\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : \"Unknown error\";\n\t\tconsole.error(`Error: ${message}`);\n\t\tprocess.exit(1);\n\t}\n}\n","import { parseSkillSpecifier } from \"@repo/pspm-types\";\nimport { configure, deleteSkill, deleteVersion } from \"../api-client.js\";\nimport {\n\ttype GlobalOptions,\n\tgetRegistryUrl,\n\trequireApiKey,\n} from \"../config.js\";\n\nexport interface UnpublishOptions {\n\tforce?: boolean;\n}\n\nexport async function unpublish(\n\tspecifier: string,\n\toptions: UnpublishOptions,\n\tglobalOptions?: GlobalOptions,\n): Promise<void> {\n\ttry {\n\t\tconst apiKey = await requireApiKey(globalOptions);\n\t\tconst registryUrl = await getRegistryUrl(globalOptions);\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\n\t\tconfigure({ baseUrl: `${registryUrl}/rpc`, 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 result = await deleteVersion({\n\t\t\t\tname,\n\t\t\t\tversion: versionRange,\n\t\t\t});\n\t\t\tif (result.success) {\n\t\t\t\tconsole.log(`Unpublished @user/${username}/${name}@${versionRange}`);\n\t\t\t} else {\n\t\t\t\tconsole.error(`Error: Failed to unpublish. Version may not exist.`);\n\t\t\t\tprocess.exit(1);\n\t\t\t}\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 result = await deleteSkill({ name });\n\t\t\tif (result.success) {\n\t\t\t\tconsole.log(`Unpublished @user/${username}/${name} (all versions)`);\n\t\t\t} else {\n\t\t\t\tconsole.error(`Error: Failed to unpublish. Skill may not exist.`);\n\t\t\t\tprocess.exit(1);\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","import { resolveVersion } from \"@repo/pspm-types\";\nimport { configure, listVersions } from \"../api-client.js\";\nimport {\n\ttype GlobalOptions,\n\tgetRegistryUrl,\n\trequireApiKey,\n} from \"../config.js\";\nimport { listLockfileSkills } from \"../lockfile.js\";\nimport { add } from \"./add.js\";\n\nexport interface UpdateOptions {\n\tdryRun?: boolean;\n}\n\nexport async function update(\n\toptions: UpdateOptions,\n\tglobalOptions?: GlobalOptions,\n): Promise<void> {\n\ttry {\n\t\tconst apiKey = await requireApiKey(globalOptions);\n\t\tconst registryUrl = await getRegistryUrl(globalOptions);\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\n\t\tconfigure({ baseUrl: `${registryUrl}/rpc`, 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 versions = await listVersions({\n\t\t\t\t\tusername,\n\t\t\t\t\tname: skillName,\n\t\t\t\t});\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, {}, globalOptions);\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 {\n\ttype GlobalOptions,\n\tgetRegistryUrl,\n\trequireApiKey,\n\tresolveConfig,\n} from \"../config.js\";\n\nexport async function whoami(globalOptions?: GlobalOptions): Promise<void> {\n\ttry {\n\t\tconst resolved = await resolveConfig(globalOptions);\n\t\tconst apiKey = await requireApiKey(globalOptions);\n\t\tconst registryUrl = await getRegistryUrl(globalOptions);\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\tconsole.log(`Profile: ${resolved.profileName}`);\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\tconsole.log(`Profile: ${resolved.profileName}`);\n\t\t} else {\n\t\t\tconsole.error(\"Could not determine current user.\");\n\t\t\tprocess.exit(1);\n\t\t}\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : \"Unknown error\";\n\t\tconsole.error(`Error: ${message}`);\n\t\tprocess.exit(1);\n\t}\n}\n","#!/usr/bin/env node\n\nimport { readFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { Command } from \"commander\";\nimport {\n\tadd,\n\tconfigAdd,\n\tconfigDelete,\n\tconfigInit,\n\tconfigList,\n\tconfigSet,\n\tconfigShow,\n\tconfigUse,\n\tinstall,\n\tlist,\n\tlogin,\n\tlogout,\n\tpublish,\n\tremove,\n\tunpublish,\n\tupdate,\n\twhoami,\n} from \"./commands/index.js\";\nimport type { GlobalOptions } from \"./config.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\t.option(\"-p, --profile <name>\", \"Use a specific profile\");\n\n/**\n * Get global options from a command\n */\nfunction getGlobalOptions(cmd: Command): GlobalOptions {\n\t// Walk up to the root program to get global options\n\tlet current: Command | null = cmd;\n\twhile (current.parent) {\n\t\tcurrent = current.parent;\n\t}\n\tconst opts = current.opts();\n\treturn {\n\t\tprofile: opts.profile,\n\t};\n}\n\n// =============================================================================\n// Config commands\n// =============================================================================\n\nconst configCmd = program\n\t.command(\"config\")\n\t.description(\"Manage PSPM configuration and profiles\");\n\nconfigCmd\n\t.command(\"list\")\n\t.description(\"List all profiles\")\n\t.action(async () => {\n\t\tawait configList();\n\t});\n\nconfigCmd\n\t.command(\"show [name]\")\n\t.description(\"Show resolved config or a specific profile\")\n\t.action(async (name, _options, cmd) => {\n\t\tconst globalOptions = getGlobalOptions(cmd);\n\t\tawait configShow({ name }, globalOptions);\n\t});\n\nconfigCmd\n\t.command(\"add <name>\")\n\t.description(\"Create a new profile\")\n\t.option(\"--registry-url <url>\", \"Registry URL for the profile\")\n\t.action(async (name, options) => {\n\t\tawait configAdd(name, { registryUrl: options.registryUrl });\n\t});\n\nconfigCmd\n\t.command(\"use <name>\")\n\t.description(\"Set the default profile\")\n\t.action(async (name) => {\n\t\tawait configUse(name);\n\t});\n\nconfigCmd\n\t.command(\"set <profile> <key> <value>\")\n\t.description(\"Set a profile field (registryUrl, apiKey, username)\")\n\t.action(async (profile, key, value) => {\n\t\tawait configSet(profile, key, value);\n\t});\n\nconfigCmd\n\t.command(\"delete <name>\")\n\t.description(\"Delete a profile\")\n\t.action(async (name) => {\n\t\tawait configDelete(name);\n\t});\n\nconfigCmd\n\t.command(\"init\")\n\t.description(\"Create a .pspmrc file in the current directory\")\n\t.option(\"--profile <name>\", \"Profile to use for this project\")\n\t.option(\"--registry-url <url>\", \"Registry URL override\")\n\t.action(async (options) => {\n\t\tawait configInit({\n\t\t\tprofile: options.profile,\n\t\t\tregistryUrl: options.registryUrl,\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, cmd) => {\n\t\tconst globalOptions = getGlobalOptions(cmd);\n\t\tawait login({ apiKey: options.apiKey }, globalOptions);\n\t});\n\nprogram\n\t.command(\"logout\")\n\t.description(\"Log out and clear stored credentials\")\n\t.action(async (_options, cmd) => {\n\t\tconst globalOptions = getGlobalOptions(cmd);\n\t\tawait logout(globalOptions);\n\t});\n\nprogram\n\t.command(\"whoami\")\n\t.description(\"Show current user information\")\n\t.action(async (_options, cmd) => {\n\t\tconst globalOptions = getGlobalOptions(cmd);\n\t\tawait whoami(globalOptions);\n\t});\n\n// =============================================================================\n// Skill management commands\n// =============================================================================\n\nprogram\n\t.command(\"add <specifier>\")\n\t.description(\"Add a skill (e.g., @user/bsheng/vite_slides@^2.0.0)\")\n\t.option(\"--save\", \"Save to lockfile (default)\")\n\t.action(async (specifier, options, cmd) => {\n\t\tconst globalOptions = getGlobalOptions(cmd);\n\t\tawait add(specifier, { save: options.save ?? true }, globalOptions);\n\t});\n\nprogram\n\t.command(\"remove <name>\")\n\t.alias(\"rm\")\n\t.description(\"Remove an installed skill\")\n\t.action(async (name) => {\n\t\tawait remove(name);\n\t});\n\nprogram\n\t.command(\"list\")\n\t.alias(\"ls\")\n\t.description(\"List installed skills\")\n\t.option(\"--json\", \"Output as JSON\")\n\t.action(async (options) => {\n\t\tawait list({ json: options.json });\n\t});\n\nprogram\n\t.command(\"install\")\n\t.alias(\"i\")\n\t.description(\"Install all skills from lockfile\")\n\t.option(\"--frozen-lockfile\", \"Fail if lockfile is missing or outdated\")\n\t.option(\"--dir <path>\", \"Install skills to a specific directory\")\n\t.action(async (options, cmd) => {\n\t\tconst globalOptions = getGlobalOptions(cmd);\n\t\tawait install(\n\t\t\t{\n\t\t\t\tfrozenLockfile: options.frozenLockfile,\n\t\t\t\tdir: options.dir,\n\t\t\t},\n\t\t\tglobalOptions,\n\t\t);\n\t});\n\nprogram\n\t.command(\"update\")\n\t.description(\"Update all skills to latest compatible versions\")\n\t.option(\"--dry-run\", \"Show what would be updated without making changes\")\n\t.action(async (options, cmd) => {\n\t\tconst globalOptions = getGlobalOptions(cmd);\n\t\tawait update({ dryRun: options.dryRun }, globalOptions);\n\t});\n\n// =============================================================================\n// Publishing commands\n// =============================================================================\n\nprogram\n\t.command(\"publish\")\n\t.description(\"Publish current directory as a skill\")\n\t.option(\"--bump <level>\", \"Bump version (major, minor, patch)\")\n\t.option(\"--tag <tag>\", \"Tag for the release\")\n\t.action(async (options, cmd) => {\n\t\tconst globalOptions = getGlobalOptions(cmd);\n\t\tawait publish(\n\t\t\t{\n\t\t\t\tbump: options.bump as \"major\" | \"minor\" | \"patch\" | undefined,\n\t\t\t\ttag: options.tag,\n\t\t\t},\n\t\t\tglobalOptions,\n\t\t);\n\t});\n\nprogram\n\t.command(\"unpublish <specifier>\")\n\t.description(\"Remove a published skill version\")\n\t.option(\"--force\", \"Confirm destructive action\")\n\t.action(async (specifier, options, cmd) => {\n\t\tconst globalOptions = getGlobalOptions(cmd);\n\t\tawait unpublish(specifier, { force: options.force }, globalOptions);\n\t});\n\nprogram.parse();\n"]}
1
+ {"version":3,"sources":["../../../packages/shared/pspm-types/src/integrity.ts","../../../packages/shared/pspm-types/src/specifier.ts","../../../packages/shared/pspm-types/src/version.ts","../../../packages/sdk/src/fetcher.ts","../../../packages/sdk/src/generated/index.ts","../src/api-client.ts","../src/errors.ts","../src/config.ts","../src/lockfile.ts","../src/commands/add.ts","../src/commands/config/add.ts","../src/commands/config/delete.ts","../src/commands/config/init.ts","../src/commands/config/list.ts","../src/commands/config/set.ts","../src/commands/config/show.ts","../src/commands/config/use.ts","../src/commands/install.ts","../src/commands/list.ts","../src/commands/login.ts","../src/commands/logout.ts","../src/commands/publish.ts","../src/commands/remove.ts","../src/commands/unpublish.ts","../src/commands/update.ts","../src/commands/whoami.ts","../src/index.ts"],"names":["version","config","readFile","mkdir","dirname","writeFile","join","exec","promisify","stat","createHash","rm","exchangeCliToken","execCb","packageJson","semver","match","__dirname"],"mappings":"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","file":"index.js","sourcesContent":["import { createHash } from \"node:crypto\";\n\n/**\n * Calculate integrity hash for a buffer.\n * Uses SHA-256 with base64 encoding, prefixed with \"sha256-\".\n *\n * @param data - The buffer to hash\n * @returns Integrity string (e.g., \"sha256-abc123...\")\n */\nexport function calculateIntegrity(data: Buffer): string {\n\tconst hash = createHash(\"sha256\").update(data).digest(\"base64\");\n\treturn `sha256-${hash}`;\n}\n\n/**\n * Verify that a buffer matches an expected integrity hash.\n *\n * @param data - The buffer to verify\n * @param expectedIntegrity - The expected integrity string\n * @returns True if the integrity matches\n */\nexport function verifyIntegrity(\n\tdata: Buffer,\n\texpectedIntegrity: string,\n): boolean {\n\tconst match = expectedIntegrity.match(/^sha256-(.+)$/);\n\tif (!match) {\n\t\treturn false;\n\t}\n\n\tconst actualHash = createHash(\"sha256\").update(data).digest(\"base64\");\n\treturn actualHash === match[1];\n}\n","/**\n * Parsed skill specifier (from CLI input)\n * e.g., \"@user/bsheng/vite_slides@^2.0.0\"\n */\nexport interface SkillSpecifier {\n\tusername: string;\n\tname: string;\n\tversionRange?: string;\n}\n\n/**\n * Skill specifier regex pattern\n * Matches: @user/{username}/{name}[@{version}]\n */\nconst SPECIFIER_PATTERN =\n\t/^@user\\/([a-zA-Z0-9_-]+)\\/([a-z][a-z0-9_-]*)(?:@(.+))?$/;\n\n/**\n * Parse a skill specifier string.\n *\n * @param specifier - The specifier string (e.g., \"@user/bsheng/vite_slides@^2.0.0\")\n * @returns Parsed specifier or null if invalid\n *\n * @example\n * ```typescript\n * parseSkillSpecifier(\"@user/bsheng/my-skill@^1.0.0\")\n * // => { username: \"bsheng\", name: \"my-skill\", versionRange: \"^1.0.0\" }\n *\n * parseSkillSpecifier(\"@user/bsheng/my-skill\")\n * // => { username: \"bsheng\", name: \"my-skill\", versionRange: undefined }\n * ```\n */\nexport function parseSkillSpecifier(specifier: string): SkillSpecifier | null {\n\tconst match = specifier.match(SPECIFIER_PATTERN);\n\n\tif (!match) {\n\t\treturn null;\n\t}\n\n\treturn {\n\t\tusername: match[1],\n\t\tname: match[2],\n\t\tversionRange: match[3],\n\t};\n}\n\n/**\n * Generate a full skill identifier string.\n *\n * @param username - The owner's username\n * @param name - The skill name\n * @param version - Optional version string\n * @returns Full identifier (e.g., \"@user/bsheng/my-skill@1.0.0\")\n */\nexport function generateSkillIdentifier(\n\tusername: string,\n\tname: string,\n\tversion?: string,\n): string {\n\tconst base = `@user/${username}/${name}`;\n\treturn version ? `${base}@${version}` : base;\n}\n","import * as semver from \"semver\";\n\n/**\n * Resolve the best matching version from a list of available versions.\n *\n * @param range - The version range to match (e.g., \"^1.0.0\", \"~2.1.0\", \"*\")\n * @param availableVersions - List of available version strings\n * @returns The best matching version or null if none found\n */\nexport function resolveVersion(\n\trange: string,\n\tavailableVersions: string[],\n): string | null {\n\tconst sorted = availableVersions\n\t\t.filter((v) => semver.valid(v))\n\t\t.sort((a, b) => semver.rcompare(a, b));\n\n\tif (!range || range === \"latest\" || range === \"*\") {\n\t\treturn sorted[0] ?? null;\n\t}\n\n\treturn semver.maxSatisfying(sorted, range);\n}\n\n/**\n * Check if a version satisfies a given range.\n */\nexport function versionSatisfies(version: string, range: string): boolean {\n\treturn semver.satisfies(version, range);\n}\n\n/**\n * Normalize a version range string.\n * Converts \"latest\" or empty to \"*\".\n */\nexport function normalizeVersionRange(range?: string): string {\n\tif (!range || range === \"latest\") {\n\t\treturn \"*\";\n\t}\n\treturn range;\n}\n\n/**\n * Compare two versions.\n * Returns: -1 if a < b, 0 if a === b, 1 if a > b\n */\nexport function compareVersions(a: string, b: string): number {\n\treturn semver.compare(a, b);\n}\n\n/**\n * Check if version a is greater than version b.\n */\nexport function isNewerVersion(a: string, b: string): boolean {\n\treturn semver.gt(a, b);\n}\n\n/**\n * Get the latest version from a list.\n */\nexport function getLatestVersion(versions: string[]): string | null {\n\tconst valid = versions.filter((v) => semver.valid(v));\n\tif (valid.length === 0) return null;\n\treturn valid.sort((a, b) => semver.rcompare(a, b))[0];\n}\n","/**\n * Custom fetch wrapper for Orval-generated SDK\n *\n * Handles authentication and base URL configuration.\n */\n\nexport interface SDKConfig {\n\tbaseUrl: string;\n\tapiKey: string;\n}\n\nlet config: SDKConfig | null = null;\n\n/**\n * Configure the SDK with base URL and API key.\n * Must be called before making any API requests.\n *\n * @example\n * ```typescript\n * import { configure } from \"@repo/sdk\";\n *\n * configure({\n * baseUrl: \"http://localhost:5600\",\n * apiKey: \"your-api-key\"\n * });\n * ```\n */\nexport function configure(options: SDKConfig): void {\n\tconfig = options;\n}\n\n/**\n * Get the current SDK configuration.\n * @throws Error if not configured\n */\nexport function getConfig(): SDKConfig {\n\tif (!config) {\n\t\tthrow new Error(\"SDK not configured. Call configure() first.\");\n\t}\n\treturn config;\n}\n\n/**\n * Check if the SDK is configured.\n */\nexport function isConfigured(): boolean {\n\treturn config !== null;\n}\n\n/**\n * Error class for SDK API errors\n */\nexport class SDKError extends Error {\n\tconstructor(\n\t\tmessage: string,\n\t\tpublic readonly status: number,\n\t\tpublic readonly body?: string,\n\t) {\n\t\tsuper(message);\n\t\tthis.name = \"SDKError\";\n\t}\n}\n\n/**\n * Response structure returned by all SDK functions\n */\nexport interface SDKResponse<T> {\n\tdata: T;\n\tstatus: number;\n\theaders: Headers;\n}\n\n/**\n * Custom fetch function for Orval\n *\n * This is used by all generated API functions to make HTTP requests.\n * It handles authentication, error handling, and response parsing.\n *\n * Returns { data, status, headers } structure expected by Orval v8.\n */\nexport async function customFetch<T>(\n\turl: string,\n\toptions: RequestInit,\n): Promise<T> {\n\tconst { baseUrl, apiKey } = getConfig();\n\n\t// The URL from Orval will be like \"/api/skills/me\"\n\t// We need to prepend the baseUrl\n\tconst fullUrl = `${baseUrl}${url}`;\n\n\tconst response = await fetch(fullUrl, {\n\t\t...options,\n\t\theaders: {\n\t\t\t...options.headers,\n\t\t\tAuthorization: `Bearer ${apiKey}`,\n\t\t\t\"Content-Type\": \"application/json\",\n\t\t},\n\t});\n\n\tconst text = await response.text();\n\tlet data: unknown = null;\n\n\tif (text) {\n\t\ttry {\n\t\t\tdata = JSON.parse(text);\n\t\t} catch {\n\t\t\tdata = text;\n\t\t}\n\t}\n\n\t// Return the structure expected by Orval v8: { data, status, headers }\n\treturn {\n\t\tdata,\n\t\tstatus: response.status,\n\t\theaders: response.headers,\n\t} as T;\n}\n","/**\n * Generated by orval v8.0.2 🍺\n * Do not edit manually.\n * PSPM API\n * Backend API for PSPM - Private Skill Package Manager for Claude Code\n * OpenAPI spec version: 1.0.0\n */\nimport { customFetch } from '../fetcher';\nexport type ReportErrorsBodyErrorsItemSource = typeof ReportErrorsBodyErrorsItemSource[keyof typeof ReportErrorsBodyErrorsItemSource];\n\n\nexport const ReportErrorsBodyErrorsItemSource = {\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 ReportErrorsBodyErrorsItemSeverity = typeof ReportErrorsBodyErrorsItemSeverity[keyof typeof ReportErrorsBodyErrorsItemSeverity];\n\n\nexport const ReportErrorsBodyErrorsItemSeverity = {\n fatal: 'fatal',\n error: 'error',\n warning: 'warning',\n info: 'info',\n} as const;\n\nexport type ReportErrorsBodyErrorsItemContext = {[key: string]: unknown};\n\nexport type ReportErrorsBodyErrorsItem = {\n id: string;\n message: string;\n stack?: string;\n componentStack?: string;\n source: ReportErrorsBodyErrorsItemSource;\n severity: ReportErrorsBodyErrorsItemSeverity;\n route?: string;\n timestamp: number;\n context?: ReportErrorsBodyErrorsItemContext;\n digest?: string;\n};\n\nexport type ReportErrorsBody = {\n errors: ReportErrorsBodyErrorsItem[];\n userAgent: string;\n url: string;\n timestamp: number;\n};\n\nexport type ReportErrors200 = {\n success: boolean;\n};\n\nexport type Me200 = {\n userId: string;\n username: string;\n} | null;\n\nexport type ListMySkills200Item = {\n id: string;\n name: string;\n userId: string;\n description: string | null;\n createdAt: string;\n updatedAt: string;\n username: string;\n};\n\nexport type ListUserSkills200Item = {\n id: string;\n name: string;\n userId: string;\n description: string | null;\n createdAt: string;\n updatedAt: string;\n username: string;\n};\n\nexport type GetSkill200 = {\n id: string;\n name: string;\n userId: string;\n description: string | null;\n createdAt: string;\n updatedAt: string;\n username: string;\n} | null;\n\nexport type ListSkillVersions200ItemManifestPspmRequirements = {\n claude?: string;\n node?: string;\n};\n\nexport type ListSkillVersions200ItemManifestPspm = {\n type: 'skill';\n capabilities?: string[];\n requirements?: ListSkillVersions200ItemManifestPspmRequirements;\n};\n\nexport type ListSkillVersions200ItemManifest = {\n /**\n * @minLength 1\n * @maxLength 100\n * @pattern ^[a-z][a-z0-9_-]*$\n */\n name: string;\n /**\n * Semantic version string (e.g., 1.0.0)\n * @pattern ^\\d+\\.\\d+\\.\\d+(-[\\w.]+)?(\\+[\\w.]+)?$\n */\n version: string;\n /** @maxLength 500 */\n description?: string;\n files?: string[];\n pspm?: ListSkillVersions200ItemManifestPspm;\n};\n\nexport type ListSkillVersions200Item = {\n id: string;\n skillId: string;\n version: string;\n r2Key: string;\n checksum: string;\n manifest: ListSkillVersions200ItemManifest;\n publishedAt: string;\n};\n\nexport type GetSkillVersion200 = {\n id: string;\n skillId: string;\n version: string;\n r2Key: string;\n checksum: string;\n manifest: {\n /**\n * @minLength 1\n * @maxLength 100\n * @pattern ^[a-z][a-z0-9_-]*$\n */\n name: string;\n /**\n * Semantic version string (e.g., 1.0.0)\n * @pattern ^\\d+\\.\\d+\\.\\d+(-[\\w.]+)?(\\+[\\w.]+)?$\n */\n version: string;\n /** @maxLength 500 */\n description?: string;\n files?: string[];\n pspm?: {\n type: 'skill';\n capabilities?: string[];\n requirements?: {\n claude?: string;\n node?: string;\n};\n};\n};\n publishedAt: string;\n downloadUrl: string;\n} | null;\n\nexport type PublishSkillBodyManifestPspmRequirements = {\n claude?: string;\n node?: string;\n};\n\nexport type PublishSkillBodyManifestPspm = {\n type: 'skill';\n capabilities?: string[];\n requirements?: PublishSkillBodyManifestPspmRequirements;\n};\n\nexport type PublishSkillBodyManifest = {\n /**\n * @minLength 1\n * @maxLength 100\n * @pattern ^[a-z][a-z0-9_-]*$\n */\n name: string;\n /**\n * Semantic version string (e.g., 1.0.0)\n * @pattern ^\\d+\\.\\d+\\.\\d+(-[\\w.]+)?(\\+[\\w.]+)?$\n */\n version: string;\n /** @maxLength 500 */\n description?: string;\n files?: string[];\n pspm?: PublishSkillBodyManifestPspm;\n};\n\nexport type PublishSkillBody = {\n manifest: PublishSkillBodyManifest;\n tarballBase64: string;\n};\n\nexport type PublishSkill200Skill = {\n id: string;\n name: string;\n userId: string;\n description: string | null;\n createdAt: string;\n updatedAt: string;\n username: string;\n};\n\nexport type PublishSkill200VersionManifestPspmRequirements = {\n claude?: string;\n node?: string;\n};\n\nexport type PublishSkill200VersionManifestPspm = {\n type: 'skill';\n capabilities?: string[];\n requirements?: PublishSkill200VersionManifestPspmRequirements;\n};\n\nexport type PublishSkill200VersionManifest = {\n /**\n * @minLength 1\n * @maxLength 100\n * @pattern ^[a-z][a-z0-9_-]*$\n */\n name: string;\n /**\n * Semantic version string (e.g., 1.0.0)\n * @pattern ^\\d+\\.\\d+\\.\\d+(-[\\w.]+)?(\\+[\\w.]+)?$\n */\n version: string;\n /** @maxLength 500 */\n description?: string;\n files?: string[];\n pspm?: PublishSkill200VersionManifestPspm;\n};\n\nexport type PublishSkill200Version = {\n id: string;\n skillId: string;\n version: string;\n r2Key: string;\n checksum: string;\n manifest: PublishSkill200VersionManifest;\n publishedAt: string;\n};\n\nexport type PublishSkill200 = {\n skill: PublishSkill200Skill;\n version: PublishSkill200Version;\n};\n\nexport type DeleteSkillBody = { [key: string]: unknown };\n\nexport type DeleteSkill200 = {\n success: boolean;\n};\n\nexport type DeleteSkillVersionBody = { [key: string]: unknown };\n\nexport type DeleteSkillVersion200 = {\n success: boolean;\n};\n\nexport type ListApiKeys200Item = {\n id: string;\n name: string;\n keyPrefix: string;\n userId: string;\n expiresAt: string | null;\n lastUsedAt: string | null;\n createdAt: string;\n};\n\nexport type CreateApiKeyBody = {\n /**\n * @minLength 1\n * @maxLength 100\n */\n name: string;\n expiresAt?: string | null;\n};\n\nexport type CreateApiKey200ApiKey = {\n id: string;\n name: string;\n keyPrefix: string;\n userId: string;\n expiresAt: string | null;\n lastUsedAt: string | null;\n createdAt: string;\n};\n\nexport type CreateApiKey200 = {\n apiKey: CreateApiKey200ApiKey;\n plainKey: string;\n};\n\nexport type DeleteApiKeyBody = {\n id: string;\n};\n\nexport type DeleteApiKey200 = {\n success: boolean;\n};\n\nexport type UpdateApiKeyNameBody = {\n id: string;\n /**\n * @minLength 1\n * @maxLength 100\n */\n name: string;\n};\n\nexport type UpdateApiKeyName200 = {\n id: string;\n name: string;\n keyPrefix: string;\n userId: string;\n expiresAt: string | null;\n lastUsedAt: string | null;\n createdAt: string;\n};\n\nexport type CreateCliTokenBody = {\n /** @minLength 1 */\n state: string;\n /** @minLength 1 */\n port: string;\n};\n\nexport type CreateCliToken200 = {\n token: string;\n};\n\nexport type ExchangeCliTokenBody = {\n /** @minLength 1 */\n token: string;\n};\n\nexport type ExchangeCliToken200 = {\n apiKey: string;\n username: string;\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: ReportErrors200\n status: 200\n}\n \nexport type reportErrorsResponseSuccess = (reportErrorsResponse200) & {\n headers: Headers;\n};\n;\n\nexport type reportErrorsResponse = (reportErrorsResponseSuccess)\n\nexport const getReportErrorsUrl = () => {\n\n\n \n\n return `/errors/report`\n}\n\nexport const reportErrors = async (reportErrorsBody: ReportErrorsBody, 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 reportErrorsBody,)\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: Me200\n status: 200\n}\n \nexport type meResponseSuccess = (meResponse200) & {\n headers: Headers;\n};\n;\n\nexport type meResponse = (meResponseSuccess)\n\nexport const getMeUrl = () => {\n\n\n \n\n return `/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: ListMySkills200Item[]\n status: 200\n}\n \nexport type listMySkillsResponseSuccess = (listMySkillsResponse200) & {\n headers: Headers;\n};\n;\n\nexport type listMySkillsResponse = (listMySkillsResponseSuccess)\n\nexport const getListMySkillsUrl = () => {\n\n\n \n\n return `/`\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: ListUserSkills200Item[]\n status: 200\n}\n \nexport type listUserSkillsResponseSuccess = (listUserSkillsResponse200) & {\n headers: Headers;\n};\n;\n\nexport type listUserSkillsResponse = (listUserSkillsResponseSuccess)\n\nexport const getListUserSkillsUrl = (username: string,) => {\n\n\n \n\n return `/@user/${username}`\n}\n\nexport const listUserSkills = async (username: string, 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: GetSkill200\n status: 200\n}\n \nexport type getSkillResponseSuccess = (getSkillResponse200) & {\n headers: Headers;\n};\n;\n\nexport type getSkillResponse = (getSkillResponseSuccess)\n\nexport const getGetSkillUrl = (username: string,\n name: string,) => {\n\n\n \n\n return `/@user/${username}/${name}`\n}\n\nexport const getSkill = async (username: string,\n name: string, 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: ListSkillVersions200Item[]\n status: 200\n}\n \nexport type listSkillVersionsResponseSuccess = (listSkillVersionsResponse200) & {\n headers: Headers;\n};\n;\n\nexport type listSkillVersionsResponse = (listSkillVersionsResponseSuccess)\n\nexport const getListSkillVersionsUrl = (username: string,\n name: string,) => {\n\n\n \n\n return `/@user/${username}/${name}/versions`\n}\n\nexport const listSkillVersions = async (username: string,\n name: string, 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: GetSkillVersion200\n status: 200\n}\n \nexport type getSkillVersionResponseSuccess = (getSkillVersionResponse200) & {\n headers: Headers;\n};\n;\n\nexport type getSkillVersionResponse = (getSkillVersionResponseSuccess)\n\nexport const getGetSkillVersionUrl = (username: string,\n name: string,\n version: string,) => {\n\n\n \n\n return `/@user/${username}/${name}/${version}`\n}\n\nexport const getSkillVersion = async (username: string,\n name: string,\n version: string, 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: PublishSkill200\n status: 200\n}\n \nexport type publishSkillResponseSuccess = (publishSkillResponse200) & {\n headers: Headers;\n};\n;\n\nexport type publishSkillResponse = (publishSkillResponseSuccess)\n\nexport const getPublishSkillUrl = () => {\n\n\n \n\n return `/publish`\n}\n\nexport const publishSkill = async (publishSkillBody: PublishSkillBody, 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 publishSkillBody,)\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: DeleteSkill200\n status: 200\n}\n \nexport type deleteSkillResponseSuccess = (deleteSkillResponse200) & {\n headers: Headers;\n};\n;\n\nexport type deleteSkillResponse = (deleteSkillResponseSuccess)\n\nexport const getDeleteSkillUrl = (name: string,) => {\n\n\n \n\n return `/${name}`\n}\n\nexport const deleteSkill = async (name: string,\n deleteSkillBody?: DeleteSkillBody, options?: RequestInit): Promise<deleteSkillResponse> => {\n \n return customFetch<deleteSkillResponse>(getDeleteSkillUrl(name),\n { \n ...options,\n method: 'DELETE',\n headers: { 'Content-Type': 'application/json', ...options?.headers },\n body: JSON.stringify(\n deleteSkillBody,)\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: DeleteSkillVersion200\n status: 200\n}\n \nexport type deleteSkillVersionResponseSuccess = (deleteSkillVersionResponse200) & {\n headers: Headers;\n};\n;\n\nexport type deleteSkillVersionResponse = (deleteSkillVersionResponseSuccess)\n\nexport const getDeleteSkillVersionUrl = (name: string,\n version: string,) => {\n\n\n \n\n return `/${name}/${version}`\n}\n\nexport const deleteSkillVersion = async (name: string,\n version: string,\n deleteSkillVersionBody?: DeleteSkillVersionBody, options?: RequestInit): Promise<deleteSkillVersionResponse> => {\n \n return customFetch<deleteSkillVersionResponse>(getDeleteSkillVersionUrl(name,version),\n { \n ...options,\n method: 'DELETE',\n headers: { 'Content-Type': 'application/json', ...options?.headers },\n body: JSON.stringify(\n deleteSkillVersionBody,)\n }\n);}\n\n\n\n/**\n * Retrieve all API keys for the authenticated user\n * @summary List all API keys\n */\nexport type listApiKeysResponse200 = {\n data: ListApiKeys200Item[]\n status: 200\n}\n \nexport type listApiKeysResponseSuccess = (listApiKeysResponse200) & {\n headers: Headers;\n};\n;\n\nexport type listApiKeysResponse = (listApiKeysResponseSuccess)\n\nexport const getListApiKeysUrl = () => {\n\n\n \n\n return `/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: CreateApiKey200\n status: 200\n}\n \nexport type createApiKeyResponseSuccess = (createApiKeyResponse200) & {\n headers: Headers;\n};\n;\n\nexport type createApiKeyResponse = (createApiKeyResponseSuccess)\n\nexport const getCreateApiKeyUrl = () => {\n\n\n \n\n return `/api-keys`\n}\n\nexport const createApiKey = async (createApiKeyBody: CreateApiKeyBody, 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 createApiKeyBody,)\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: DeleteApiKey200\n status: 200\n}\n \nexport type deleteApiKeyResponseSuccess = (deleteApiKeyResponse200) & {\n headers: Headers;\n};\n;\n\nexport type deleteApiKeyResponse = (deleteApiKeyResponseSuccess)\n\nexport const getDeleteApiKeyUrl = () => {\n\n\n \n\n return `/api-keys`\n}\n\nexport const deleteApiKey = async (deleteApiKeyBody: DeleteApiKeyBody, 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 deleteApiKeyBody,)\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: UpdateApiKeyName200\n status: 200\n}\n \nexport type updateApiKeyNameResponseSuccess = (updateApiKeyNameResponse200) & {\n headers: Headers;\n};\n;\n\nexport type updateApiKeyNameResponse = (updateApiKeyNameResponseSuccess)\n\nexport const getUpdateApiKeyNameUrl = () => {\n\n\n \n\n return `/api-keys`\n}\n\nexport const updateApiKeyName = async (updateApiKeyNameBody: UpdateApiKeyNameBody, 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 updateApiKeyNameBody,)\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: CreateCliToken200\n status: 200\n}\n \nexport type createCliTokenResponseSuccess = (createCliTokenResponse200) & {\n headers: Headers;\n};\n;\n\nexport type createCliTokenResponse = (createCliTokenResponseSuccess)\n\nexport const getCreateCliTokenUrl = () => {\n\n\n \n\n return `/cli-token`\n}\n\nexport const createCliToken = async (createCliTokenBody: CreateCliTokenBody, 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 createCliTokenBody,)\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: ExchangeCliToken200\n status: 200\n}\n \nexport type exchangeCliTokenResponseSuccess = (exchangeCliTokenResponse200) & {\n headers: Headers;\n};\n;\n\nexport type exchangeCliTokenResponse = (exchangeCliTokenResponseSuccess)\n\nexport const getExchangeCliTokenUrl = () => {\n\n\n \n\n return `/cli-token-exchange`\n}\n\nexport const exchangeCliToken = async (exchangeCliTokenBody: ExchangeCliTokenBody, 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 exchangeCliTokenBody,)\n }\n);}\n","/**\n * API Client for PSPM CLI\n *\n * This module re-exports the SDK functions and provides the\n * initialization logic for the CLI.\n */\n\nimport {\n\tconfigure,\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} from \"@repo/sdk\";\n\n// Re-export SDK functions for convenience\nexport {\n\tconfigure,\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({ baseUrl: registryUrl, apiKey });\n\t\tconst response = await me();\n\t\tconst user = response.data;\n\t\tif (!user) {\n\t\t\treturn null;\n\t\t}\n\t\treturn {\n\t\t\tusername: user.username,\n\t\t\tuserId: user.userId,\n\t\t};\n\t} catch {\n\t\treturn null;\n\t}\n}\n","/**\n * Base error class for PSPM configuration errors\n */\nexport class ConfigError extends Error {\n\tconstructor(message: string) {\n\t\tsuper(message);\n\t\tthis.name = \"ConfigError\";\n\t}\n}\n\n/**\n * Error thrown when a profile is not found\n */\nexport class ProfileNotFoundError extends ConfigError {\n\tconstructor(profileName: string) {\n\t\tsuper(\n\t\t\t`Profile \"${profileName}\" not found. Run 'pspm config list' to see available profiles.`,\n\t\t);\n\t\tthis.name = \"ProfileNotFoundError\";\n\t}\n}\n\n/**\n * Error thrown when no default profile is configured\n */\nexport class NoDefaultProfileError extends ConfigError {\n\tconstructor() {\n\t\tsuper(\n\t\t\t\"No default profile configured. Run 'pspm config add <name>' to create one.\",\n\t\t);\n\t\tthis.name = \"NoDefaultProfileError\";\n\t}\n}\n\n/**\n * Error thrown when config migration fails\n */\nexport class ConfigMigrationError extends ConfigError {\n\tconstructor(message: string) {\n\t\tsuper(`Failed to migrate config: ${message}`);\n\t\tthis.name = \"ConfigMigrationError\";\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","import { mkdir, readFile, stat, writeFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\nimport { NotLoggedInError, ProfileNotFoundError } from \"./errors.js\";\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/**\n * Individual profile configuration\n */\nexport interface ProfileConfig {\n\tregistryUrl: string;\n\tapiKey?: string;\n\tusername?: string;\n}\n\n/**\n * V1 config schema (for migration)\n */\nexport interface PspmConfigV1 {\n\tregistryUrl: string;\n\tapiKey?: string;\n\tusername?: string;\n}\n\n/**\n * V2 user config schema with profiles\n */\nexport interface UserConfigV2 {\n\tversion: 2;\n\tdefaultProfile: string;\n\tprofiles: Record<string, ProfileConfig>;\n}\n\n/**\n * Project config schema (.pspmrc)\n */\nexport interface ProjectConfig {\n\tprofile?: string;\n\tregistryUrl?: string;\n}\n\n/**\n * Source of config resolution\n */\nexport type ConfigSource = \"cli\" | \"env\" | \"project\" | \"user\" | \"default\";\n\n/**\n * Fully resolved configuration\n */\nexport interface ResolvedConfig {\n\tprofileName: string;\n\tprofileSource: ConfigSource;\n\tregistryUrl: string;\n\tapiKey?: string;\n\tusername?: string;\n}\n\n/**\n * Global CLI options passed to commands\n */\nexport interface GlobalOptions {\n\tprofile?: string;\n}\n\n// Legacy type alias for backward compatibility\nexport type PspmConfig = PspmConfigV1;\n\n// =============================================================================\n// Constants\n// =============================================================================\n\nconst DEFAULT_REGISTRY_URL = \"https://pspm.dev/api/skills\";\n\n/**\n * Get the config file path\n */\nexport function getConfigPath(): string {\n\treturn join(homedir(), \".pspm\", \"config.json\");\n}\n\n/**\n * Get the skills directory path (for current project)\n */\nexport function getSkillsDir(): string {\n\treturn join(process.cwd(), \".skills\");\n}\n\n/**\n * Get the lockfile path (for current project)\n */\nexport function getLockfilePath(): string {\n\treturn join(process.cwd(), \"skill-lock.json\");\n}\n\n// =============================================================================\n// V2 Config Functions\n// =============================================================================\n\n/**\n * Create a default empty V2 config\n */\nfunction createDefaultV2Config(): UserConfigV2 {\n\treturn {\n\t\tversion: 2,\n\t\tdefaultProfile: \"default\",\n\t\tprofiles: {\n\t\t\tdefault: {\n\t\t\t\tregistryUrl: DEFAULT_REGISTRY_URL,\n\t\t\t},\n\t\t},\n\t};\n}\n\n/**\n * Migrate V1 config to V2 format\n */\nexport function migrateV1ToV2(v1Config: PspmConfigV1): UserConfigV2 {\n\treturn {\n\t\tversion: 2,\n\t\tdefaultProfile: \"default\",\n\t\tprofiles: {\n\t\t\tdefault: {\n\t\t\t\tregistryUrl: v1Config.registryUrl || DEFAULT_REGISTRY_URL,\n\t\t\t\tapiKey: v1Config.apiKey,\n\t\t\t\tusername: v1Config.username,\n\t\t\t},\n\t\t},\n\t};\n}\n\n/**\n * Check if a config object is V2 format\n */\nfunction isV2Config(config: unknown): config is UserConfigV2 {\n\treturn (\n\t\ttypeof config === \"object\" &&\n\t\tconfig !== null &&\n\t\t\"version\" in config &&\n\t\t(config as { version: unknown }).version === 2\n\t);\n}\n\n/**\n * Read the user config file (V2 format, with auto-migration)\n */\nexport async function readUserConfig(): Promise<UserConfigV2> {\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\n\t\tif (process.env.PSPM_DEBUG) {\n\t\t\t// Show raw API key from file content for debugging\n\t\t\tconst apiKeyMatch = content.match(/\"apiKey\":\\s*\"([^\"]+)\"/);\n\t\t\tif (apiKeyMatch) {\n\t\t\t\tconsole.log(\n\t\t\t\t\t`[config] Raw apiKey from file: ${apiKeyMatch[1].substring(\n\t\t\t\t\t\t0,\n\t\t\t\t\t\t15,\n\t\t\t\t\t)}...`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tconst parsed = JSON.parse(content);\n\n\t\tif (process.env.PSPM_DEBUG) {\n\t\t\tconsole.log(\n\t\t\t\t`[config] Parsed config version: ${\n\t\t\t\t\t(parsed as { version?: unknown }).version\n\t\t\t\t}`,\n\t\t\t);\n\t\t\tconsole.log(\n\t\t\t\t`[config] Profiles found: ${Object.keys(\n\t\t\t\t\t(parsed as { profiles?: Record<string, unknown> }).profiles || {},\n\t\t\t\t).join(\", \")}`,\n\t\t\t);\n\t\t}\n\n\t\t// Check if already V2\n\t\tif (isV2Config(parsed)) {\n\t\t\treturn parsed;\n\t\t}\n\n\t\t// Migrate from V1\n\t\tconst v2Config = migrateV1ToV2(parsed as PspmConfigV1);\n\n\t\t// Write migrated config back\n\t\tawait writeUserConfig(v2Config);\n\n\t\treturn v2Config;\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\tconsole.log(`[config] Falling back to default config`);\n\t\t}\n\t\treturn createDefaultV2Config();\n\t}\n}\n\n/**\n * Write the user config file (V2 format)\n */\nexport async function writeUserConfig(config: UserConfigV2): Promise<void> {\n\tconst configPath = getConfigPath();\n\tawait mkdir(dirname(configPath), { recursive: true });\n\tawait writeFile(configPath, JSON.stringify(config, null, 2));\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\treturn JSON.parse(content) as ProjectConfig;\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 * Resolve the full configuration using cascade priority:\n * 1. CLI --profile flag\n * 2. PSPM_PROFILE env var\n * 3. Project .pspmrc file\n * 4. User config default profile\n * 5. Defaults\n *\n * Environment variables (PSPM_REGISTRY_URL, PSPM_API_KEY) always override profile values.\n */\nexport async function resolveConfig(\n\tglobalOptions?: GlobalOptions,\n): Promise<ResolvedConfig> {\n\tconst userConfig = await readUserConfig();\n\tconst projectConfig = await findProjectConfig();\n\n\t// Determine which profile to use (cascade priority)\n\tlet profileName: string;\n\tlet profileSource: ConfigSource;\n\n\tif (globalOptions?.profile) {\n\t\tprofileName = globalOptions.profile;\n\t\tprofileSource = \"cli\";\n\t} else if (process.env.PSPM_PROFILE) {\n\t\tprofileName = process.env.PSPM_PROFILE;\n\t\tprofileSource = \"env\";\n\t} else if (projectConfig?.profile) {\n\t\tprofileName = projectConfig.profile;\n\t\tprofileSource = \"project\";\n\t} else if (userConfig.defaultProfile) {\n\t\tprofileName = userConfig.defaultProfile;\n\t\tprofileSource = \"user\";\n\t} else {\n\t\tprofileName = \"default\";\n\t\tprofileSource = \"default\";\n\t}\n\n\t// Get the profile config\n\tconst profile = userConfig.profiles[profileName];\n\tif (!profile) {\n\t\tif (process.env.PSPM_DEBUG) {\n\t\t\tconsole.log(\n\t\t\t\t`[config] Profile \"${profileName}\" not found. Available: ${Object.keys(\n\t\t\t\t\tuserConfig.profiles,\n\t\t\t\t).join(\", \")}`,\n\t\t\t);\n\t\t}\n\t\tthrow new ProfileNotFoundError(profileName);\n\t}\n\n\tif (process.env.PSPM_DEBUG) {\n\t\tconsole.log(\n\t\t\t`[config] Using profile: ${profileName} (source: ${profileSource})`,\n\t\t);\n\t\tconsole.log(`[config] Profile has apiKey: ${!!profile.apiKey}`);\n\t}\n\n\t// Build resolved config, applying env var overrides\n\tlet registryUrl = profile.registryUrl;\n\tlet apiKey = profile.apiKey;\n\tconst username = profile.username;\n\n\t// Project config can override registryUrl (but not apiKey for security)\n\tif (projectConfig?.registryUrl) {\n\t\tregistryUrl = projectConfig.registryUrl;\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\treturn {\n\t\tprofileName,\n\t\tprofileSource,\n\t\tregistryUrl,\n\t\tapiKey,\n\t\tusername,\n\t};\n}\n\n/**\n * Get a specific profile from user config\n */\nexport async function getProfile(\n\tprofileName: string,\n): Promise<ProfileConfig | null> {\n\tconst userConfig = await readUserConfig();\n\treturn userConfig.profiles[profileName] || null;\n}\n\n/**\n * List all profile names\n */\nexport async function listProfiles(): Promise<string[]> {\n\tconst userConfig = await readUserConfig();\n\treturn Object.keys(userConfig.profiles);\n}\n\n/**\n * Add or update a profile\n */\nexport async function setProfile(\n\tprofileName: string,\n\tconfig: Partial<ProfileConfig>,\n): Promise<void> {\n\tconst userConfig = await readUserConfig();\n\n\tconst existing = userConfig.profiles[profileName] || {\n\t\tregistryUrl: DEFAULT_REGISTRY_URL,\n\t};\n\n\tuserConfig.profiles[profileName] = {\n\t\t...existing,\n\t\t...config,\n\t};\n\n\tawait writeUserConfig(userConfig);\n}\n\n/**\n * Delete a profile\n */\nexport async function deleteProfile(profileName: string): Promise<boolean> {\n\tconst userConfig = await readUserConfig();\n\n\tif (!userConfig.profiles[profileName]) {\n\t\treturn false;\n\t}\n\n\tdelete userConfig.profiles[profileName];\n\n\t// If we deleted the default profile, set a new default\n\tif (userConfig.defaultProfile === profileName) {\n\t\tconst remainingProfiles = Object.keys(userConfig.profiles);\n\t\tuserConfig.defaultProfile = remainingProfiles[0] || \"default\";\n\t}\n\n\tawait writeUserConfig(userConfig);\n\treturn true;\n}\n\n/**\n * Set the default profile\n */\nexport async function setDefaultProfile(profileName: string): Promise<void> {\n\tconst userConfig = await readUserConfig();\n\n\tif (!userConfig.profiles[profileName]) {\n\t\tthrow new ProfileNotFoundError(profileName);\n\t}\n\n\tuserConfig.defaultProfile = profileName;\n\tawait writeUserConfig(userConfig);\n}\n\n/**\n * Get the default profile name\n */\nexport async function getDefaultProfileName(): Promise<string> {\n\tconst userConfig = await readUserConfig();\n\treturn userConfig.defaultProfile;\n}\n\n// =============================================================================\n// Legacy Functions (for backward compatibility)\n// =============================================================================\n\n/**\n * Default configuration (legacy)\n * PSPM_REGISTRY_URL env var can override the default\n */\nconst DEFAULT_CONFIG: PspmConfig = {\n\tregistryUrl: process.env.PSPM_REGISTRY_URL || DEFAULT_REGISTRY_URL,\n};\n\n/**\n * Read the config file (legacy - wraps resolveConfig)\n */\nexport async function readConfig(): Promise<PspmConfig> {\n\ttry {\n\t\tconst resolved = await resolveConfig();\n\t\treturn {\n\t\t\tregistryUrl: resolved.registryUrl,\n\t\t\tapiKey: resolved.apiKey,\n\t\t\tusername: resolved.username,\n\t\t};\n\t} catch {\n\t\treturn { ...DEFAULT_CONFIG };\n\t}\n}\n\n/**\n * Write the config file (legacy - updates default profile)\n */\nexport async function writeConfig(config: Partial<PspmConfig>): Promise<void> {\n\tconst userConfig = await readUserConfig();\n\tconst defaultProfileName = userConfig.defaultProfile;\n\n\tconst existing = userConfig.profiles[defaultProfileName] || {\n\t\tregistryUrl: DEFAULT_REGISTRY_URL,\n\t};\n\n\tuserConfig.profiles[defaultProfileName] = {\n\t\t...existing,\n\t\t...config,\n\t};\n\n\tawait writeUserConfig(userConfig);\n}\n\n/**\n * Clear the config file (for logout) - clears credentials from default profile\n */\nexport async function clearConfig(): Promise<void> {\n\tconst userConfig = await readUserConfig();\n\tconst defaultProfileName = userConfig.defaultProfile;\n\n\tif (userConfig.profiles[defaultProfileName]) {\n\t\tuserConfig.profiles[defaultProfileName].apiKey = undefined;\n\t\tuserConfig.profiles[defaultProfileName].username = undefined;\n\t}\n\n\tawait writeUserConfig(userConfig);\n}\n\n/**\n * Check if user is logged in (legacy - checks resolved config)\n */\nexport async function isLoggedIn(\n\tglobalOptions?: GlobalOptions,\n): Promise<boolean> {\n\ttry {\n\t\tconst resolved = await resolveConfig(globalOptions);\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 * PSPM_API_KEY env var can override the stored key\n */\nexport async function requireApiKey(\n\tglobalOptions?: GlobalOptions,\n): Promise<string> {\n\tconst resolved = await resolveConfig(globalOptions);\n\n\tif (!resolved.apiKey) {\n\t\tif (process.env.PSPM_DEBUG) {\n\t\t\tconsole.log(\n\t\t\t\t`[config] requireApiKey: No API key found for profile \"${resolved.profileName}\"`,\n\t\t\t);\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(\n\t\t\t\t0,\n\t\t\t\t10,\n\t\t\t)}...)`,\n\t\t);\n\t}\n\n\treturn resolved.apiKey;\n}\n\n/**\n * Get the registry URL\n */\nexport async function getRegistryUrl(\n\tglobalOptions?: GlobalOptions,\n): Promise<string> {\n\tconst resolved = await resolveConfig(globalOptions);\n\treturn resolved.registryUrl;\n}\n\n/**\n * Clear credentials for a specific profile\n */\nexport async function clearProfileCredentials(\n\tprofileName: string,\n): Promise<void> {\n\tconst userConfig = await readUserConfig();\n\n\tif (userConfig.profiles[profileName]) {\n\t\tuserConfig.profiles[profileName].apiKey = undefined;\n\t\tuserConfig.profiles[profileName].username = undefined;\n\t\tawait writeUserConfig(userConfig);\n\t}\n}\n\n/**\n * Set credentials for a specific profile\n */\nexport async function setProfileCredentials(\n\tprofileName: string,\n\tapiKey: string,\n\tusername?: string,\n\tregistryUrl?: string,\n): Promise<void> {\n\tconst userConfig = await readUserConfig();\n\n\t// Create profile if it doesn't exist\n\tif (!userConfig.profiles[profileName]) {\n\t\tuserConfig.profiles[profileName] = {\n\t\t\tregistryUrl: registryUrl || DEFAULT_REGISTRY_URL,\n\t\t};\n\t}\n\n\tuserConfig.profiles[profileName].apiKey = apiKey;\n\tif (username) {\n\t\tuserConfig.profiles[profileName].username = username;\n\t}\n\tif (registryUrl) {\n\t\tuserConfig.profiles[profileName].registryUrl = registryUrl;\n\t}\n\n\tawait writeUserConfig(userConfig);\n}\n","import { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\nimport type { SkillLockfile, SkillLockfileEntry } from \"@repo/pspm-types\";\nimport { getLockfilePath, getRegistryUrl } from \"./config\";\n\n/**\n * Read the lockfile\n */\nexport async function readLockfile(): Promise<SkillLockfile | null> {\n\tconst lockfilePath = getLockfilePath();\n\n\ttry {\n\t\tconst content = await readFile(lockfilePath, \"utf-8\");\n\t\treturn JSON.parse(content) as SkillLockfile;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\n/**\n * Write the lockfile\n */\nexport async function writeLockfile(lockfile: SkillLockfile): Promise<void> {\n\tconst lockfilePath = getLockfilePath();\n\tawait mkdir(dirname(lockfilePath), { recursive: true });\n\tawait writeFile(lockfilePath, `${JSON.stringify(lockfile, null, 2)}\\n`);\n}\n\n/**\n * Create a new empty lockfile\n */\nexport async function createEmptyLockfile(): Promise<SkillLockfile> {\n\tconst registryUrl = await getRegistryUrl();\n\treturn {\n\t\tlockfileVersion: 1,\n\t\tregistryUrl,\n\t\tskills: {},\n\t};\n}\n\n/**\n * Add a skill to the lockfile\n */\nexport async function addToLockfile(\n\tfullName: string,\n\tentry: SkillLockfileEntry,\n): Promise<void> {\n\tlet lockfile = await readLockfile();\n\tif (!lockfile) {\n\t\tlockfile = await createEmptyLockfile();\n\t}\n\n\tlockfile.skills[fullName] = entry;\n\tawait writeLockfile(lockfile);\n}\n\n/**\n * Remove a skill from the lockfile\n */\nexport async function removeFromLockfile(fullName: string): Promise<boolean> {\n\tconst lockfile = await readLockfile();\n\tif (!lockfile || !lockfile.skills[fullName]) {\n\t\treturn false;\n\t}\n\n\tdelete lockfile.skills[fullName];\n\tawait writeLockfile(lockfile);\n\treturn true;\n}\n\n/**\n * Get a skill entry from the lockfile\n */\nexport async function getFromLockfile(\n\tfullName: string,\n): Promise<SkillLockfileEntry | null> {\n\tconst lockfile = await readLockfile();\n\tif (!lockfile || !lockfile.skills[fullName]) {\n\t\treturn null;\n\t}\n\treturn lockfile.skills[fullName];\n}\n\n/**\n * List all skills in the lockfile\n */\nexport async function listLockfileSkills(): Promise<\n\tArray<{ name: string; entry: SkillLockfileEntry }>\n> {\n\tconst lockfile = await readLockfile();\n\tif (!lockfile) {\n\t\treturn [];\n\t}\n\n\treturn Object.entries(lockfile.skills).map(([name, entry]) => ({\n\t\tname,\n\t\tentry: entry as SkillLockfileEntry,\n\t}));\n}\n","import { mkdir, rm } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport {\n\tcalculateIntegrity,\n\tparseSkillSpecifier,\n\tresolveVersion,\n} from \"@repo/pspm-types\";\nimport {\n\tconfigure,\n\tgetSkillVersion,\n\tlistSkillVersions,\n} from \"../api-client.js\";\nimport {\n\ttype GlobalOptions,\n\tgetRegistryUrl,\n\tgetSkillsDir,\n\trequireApiKey,\n} from \"../config.js\";\nimport { addToLockfile } from \"../lockfile.js\";\n\nexport interface AddOptions {\n\tsave?: boolean;\n}\n\nexport async function add(\n\tspecifier: string,\n\t_options: AddOptions,\n\tglobalOptions?: GlobalOptions,\n): Promise<void> {\n\ttry {\n\t\tconst apiKey = await requireApiKey(globalOptions);\n\t\tconst registryUrl = await getRegistryUrl(globalOptions);\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({ baseUrl: registryUrl, apiKey });\n\n\t\tconsole.log(`Resolving ${specifier}...`);\n\n\t\t// Get available versions\n\t\tconst versionsResponse = await listSkillVersions(username, name);\n\t\tconst versions = versionsResponse.data;\n\t\tif (versions.length === 0) {\n\t\t\tconsole.error(`Error: Skill @user/${username}/${name} not found`);\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\t// Resolve version\n\t\tconst versionStrings = versions.map((v: { version: string }) => v.version);\n\t\tconst resolved = resolveVersion(versionRange || \"*\", versionStrings);\n\n\t\tif (!resolved) {\n\t\t\tconsole.error(\n\t\t\t\t`Error: No version matching \"${versionRange || \"latest\"}\" found for @user/${username}/${name}`,\n\t\t\t);\n\t\t\tconsole.error(`Available versions: ${versionStrings.join(\", \")}`);\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\tconsole.log(`Installing @user/${username}/${name}@${resolved}...`);\n\n\t\t// Get version details with download URL\n\t\tconst versionResponse = await getSkillVersion(username, name, resolved);\n\t\tconst versionInfo = versionResponse.data;\n\t\tif (!versionInfo) {\n\t\t\tconsole.error(`Error: Version ${resolved} not found`);\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\t// Download the tarball via the API endpoint\n\t\t// Use the API download endpoint for reliability (handles redirects)\n\t\tconst downloadUrl = `${registryUrl}/@user/${username}/${name}/${resolved}/download`;\n\n\t\tconst tarballResponse = await fetch(downloadUrl, {\n\t\t\theaders: {\n\t\t\t\tAuthorization: `Bearer ${apiKey}`,\n\t\t\t},\n\t\t\tredirect: \"follow\",\n\t\t});\n\n\t\tif (!tarballResponse.ok) {\n\t\t\tconsole.error(\n\t\t\t\t`Error: Failed to download tarball (${tarballResponse.status})`,\n\t\t\t);\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\tconst tarballBuffer = Buffer.from(await tarballResponse.arrayBuffer());\n\n\t\t// Calculate integrity\n\t\tconst integrity = calculateIntegrity(tarballBuffer);\n\n\t\t// Verify checksum matches\n\t\tconst expectedIntegrity = `sha256-${Buffer.from(versionInfo.checksum, \"hex\").toString(\"base64\")}`;\n\t\tif (integrity !== expectedIntegrity) {\n\t\t\tconsole.error(\"Error: Checksum verification failed\");\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\t// Create skills directory\n\t\tconst skillsDir = getSkillsDir();\n\t\tconst destDir = join(skillsDir, username, name);\n\t\tawait mkdir(destDir, { recursive: true });\n\n\t\t// Extract tarball\n\t\tconst { writeFile } = await import(\"node:fs/promises\");\n\t\tconst tempFile = join(destDir, \".temp.tgz\");\n\t\tawait writeFile(tempFile, tarballBuffer);\n\n\t\tconst { exec } = await import(\"node:child_process\");\n\t\tconst { promisify } = await import(\"node:util\");\n\t\tconst execAsync = promisify(exec);\n\n\t\ttry {\n\t\t\t// Clear destination and extract\n\t\t\tawait rm(destDir, { recursive: true, force: true });\n\t\t\tawait mkdir(destDir, { recursive: true });\n\t\t\tawait writeFile(tempFile, tarballBuffer);\n\t\t\tawait execAsync(\n\t\t\t\t`tar -xzf \"${tempFile}\" -C \"${destDir}\" --strip-components=1`,\n\t\t\t);\n\t\t} finally {\n\t\t\tawait rm(tempFile, { force: true });\n\t\t}\n\n\t\t// Update lockfile\n\t\tconst fullName = `@user/${username}/${name}`;\n\t\tawait addToLockfile(fullName, {\n\t\t\tversion: resolved,\n\t\t\tresolved: versionInfo.downloadUrl,\n\t\t\tintegrity,\n\t\t});\n\n\t\tconsole.log(`Installed @user/${username}/${name}@${resolved}`);\n\t\tconsole.log(`Location: ${destDir}`);\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : \"Unknown error\";\n\t\tconsole.error(`Error: ${message}`);\n\t\tprocess.exit(1);\n\t}\n}\n","import { getProfile, setProfile } from \"../../config.js\";\n\nexport interface ConfigAddOptions {\n\tregistryUrl?: string;\n}\n\n/**\n * Create a new profile\n */\nexport async function configAdd(\n\tname: string,\n\toptions: ConfigAddOptions,\n): Promise<void> {\n\ttry {\n\t\t// Check if profile already exists\n\t\tconst existing = await getProfile(name);\n\t\tif (existing) {\n\t\t\tconsole.error(`Error: Profile \"${name}\" already exists.`);\n\t\t\tconsole.log(\"Use 'pspm config set' to modify it.\");\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\t// Create the profile\n\t\tawait setProfile(name, {\n\t\t\tregistryUrl: options.registryUrl || \"https://pspm.dev/api/skills\",\n\t\t});\n\n\t\tconsole.log(`Created profile \"${name}\".`);\n\n\t\tif (options.registryUrl) {\n\t\t\tconsole.log(` Registry URL: ${options.registryUrl}`);\n\t\t}\n\n\t\tconsole.log(\"\");\n\t\tconsole.log(\n\t\t\t`To set credentials, run: pspm login --api-key <key> --profile ${name}`,\n\t\t);\n\t\tconsole.log(`To make this the default, run: pspm config use ${name}`);\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\tdeleteProfile,\n\tgetDefaultProfileName,\n\tlistProfiles,\n} from \"../../config.js\";\n\n/**\n * Delete a profile\n */\nexport async function configDelete(name: string): Promise<void> {\n\ttry {\n\t\tconst profiles = await listProfiles();\n\t\tconst defaultProfile = await getDefaultProfileName();\n\n\t\t// Check if profile exists\n\t\tif (!profiles.includes(name)) {\n\t\t\tconsole.error(`Error: Profile \"${name}\" not found.`);\n\t\t\tconsole.log(\"Run 'pspm config list' to see available profiles.\");\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\t// Prevent deleting last profile\n\t\tif (profiles.length === 1) {\n\t\t\tconsole.error(\"Error: Cannot delete the last profile.\");\n\t\t\tconsole.log(\"Create another profile first, then delete this one.\");\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\tconst wasDefault = name === defaultProfile;\n\t\tconst success = await deleteProfile(name);\n\n\t\tif (success) {\n\t\t\tconsole.log(`Deleted profile \"${name}\".`);\n\t\t\tif (wasDefault) {\n\t\t\t\tconst newDefault = await getDefaultProfileName();\n\t\t\t\tconsole.log(`Default profile is now \"${newDefault}\".`);\n\t\t\t}\n\t\t} else {\n\t\t\tconsole.error(`Error: Failed to delete profile \"${name}\".`);\n\t\t\tprocess.exit(1);\n\t\t}\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : \"Unknown error\";\n\t\tconsole.error(`Error: ${message}`);\n\t\tprocess.exit(1);\n\t}\n}\n","import { stat, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { ProjectConfig } from \"../../config.js\";\n\nexport interface ConfigInitOptions {\n\tprofile?: string;\n\tregistryUrl?: string;\n}\n\n/**\n * Create a .pspmrc file in the current directory\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 the config\n\t\tconst config: ProjectConfig = {};\n\n\t\tif (options.profile) {\n\t\t\tconfig.profile = options.profile;\n\t\t}\n\t\tif (options.registryUrl) {\n\t\t\tconfig.registryUrl = options.registryUrl;\n\t\t}\n\n\t\t// If no options provided, create a minimal example\n\t\tif (Object.keys(config).length === 0) {\n\t\t\tconfig.profile = \"development\";\n\t\t}\n\n\t\t// Write the file\n\t\tawait writeFile(configPath, `${JSON.stringify(config, null, 2)}\\n`);\n\n\t\tconsole.log(\"Created .pspmrc\");\n\t\tconsole.log(\"\");\n\t\tconsole.log(\"Contents:\");\n\t\tconsole.log(JSON.stringify(config, null, 2));\n\t\tconsole.log(\"\");\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 { getDefaultProfileName, listProfiles } from \"../../config.js\";\n\n/**\n * List all available profiles\n */\nexport async function configList(): Promise<void> {\n\ttry {\n\t\tconst profiles = await listProfiles();\n\t\tconst defaultProfile = await getDefaultProfileName();\n\n\t\tif (profiles.length === 0) {\n\t\t\tconsole.log(\"No profiles configured.\");\n\t\t\tconsole.log(\"Run 'pspm config add <name>' to create one.\");\n\t\t\treturn;\n\t\t}\n\n\t\tconsole.log(\"Profiles:\\n\");\n\t\tfor (const name of profiles) {\n\t\t\tconst marker = name === defaultProfile ? \" (default)\" : \"\";\n\t\t\tconsole.log(` ${name}${marker}`);\n\t\t}\n\t\tconsole.log(\"\");\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 { getProfile, setProfile } from \"../../config.js\";\n\nconst VALID_KEYS = [\"registryUrl\", \"apiKey\", \"username\"] as const;\ntype ValidKey = (typeof VALID_KEYS)[number];\n\n/**\n * Set a profile field value\n */\nexport async function configSet(\n\tprofile: string,\n\tkey: string,\n\tvalue: string,\n): Promise<void> {\n\ttry {\n\t\t// Validate key\n\t\tif (!VALID_KEYS.includes(key as ValidKey)) {\n\t\t\tconsole.error(`Error: Invalid key \"${key}\".`);\n\t\t\tconsole.log(`Valid keys: ${VALID_KEYS.join(\", \")}`);\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\t// Check if profile exists\n\t\tconst existing = await getProfile(profile);\n\t\tif (!existing) {\n\t\t\tconsole.error(`Error: Profile \"${profile}\" not found.`);\n\t\t\tconsole.log(\"Run 'pspm config add' to create it first.\");\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\t// Update the profile\n\t\tawait setProfile(profile, { [key]: value });\n\t\tconsole.log(`Updated ${key} for profile \"${profile}\".`);\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\ttype GlobalOptions,\n\tgetConfigPath,\n\tgetDefaultProfileName,\n\tgetProfile,\n\tresolveConfig,\n} from \"../../config.js\";\n\nexport interface ConfigShowOptions {\n\tname?: string;\n}\n\n/**\n * Show profile details or resolved config\n */\nexport async function configShow(\n\toptions: ConfigShowOptions,\n\tglobalOptions?: GlobalOptions,\n): Promise<void> {\n\ttry {\n\t\tif (options.name) {\n\t\t\t// Show specific profile\n\t\t\tconst profile = await getProfile(options.name);\n\t\t\tif (!profile) {\n\t\t\t\tconsole.error(`Error: Profile \"${options.name}\" not found.`);\n\t\t\t\tconsole.log(\"Run 'pspm config list' to see available profiles.\");\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\n\t\t\tconst defaultProfile = await getDefaultProfileName();\n\t\t\tconst isDefault = options.name === defaultProfile;\n\n\t\t\tconsole.log(`Profile: ${options.name}${isDefault ? \" (default)\" : \"\"}\\n`);\n\t\t\tconsole.log(` Registry URL: ${profile.registryUrl}`);\n\t\t\tconsole.log(` API Key: ${profile.apiKey ? \"***\" : \"(not set)\"}`);\n\t\t\tconsole.log(` Username: ${profile.username || \"(not set)\"}`);\n\t\t} else {\n\t\t\t// Show resolved config\n\t\t\tconst resolved = await resolveConfig(globalOptions);\n\t\t\tconst projectConfig = await findProjectConfig();\n\t\t\tconst configPath = getConfigPath();\n\n\t\t\tconsole.log(\"Resolved Configuration:\\n\");\n\t\t\tconsole.log(` Active Profile: ${resolved.profileName}`);\n\t\t\tconsole.log(` Profile Source: ${formatSource(resolved.profileSource)}`);\n\t\t\tconsole.log(` Registry URL: ${resolved.registryUrl}`);\n\t\t\tconsole.log(` API Key: ${resolved.apiKey ? \"***\" : \"(not set)\"}`);\n\t\t\tconsole.log(` Username: ${resolved.username || \"(not set)\"}`);\n\t\t\tconsole.log(\"\");\n\t\t\tconsole.log(\"Config Locations:\");\n\t\t\tconsole.log(` User config: ${configPath}`);\n\t\t\tconsole.log(` Project config: ${projectConfig ? \".pspmrc\" : \"(none)\"}`);\n\t\t}\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : \"Unknown error\";\n\t\tconsole.error(`Error: ${message}`);\n\t\tprocess.exit(1);\n\t}\n}\n\nfunction formatSource(source: string): string {\n\tswitch (source) {\n\t\tcase \"cli\":\n\t\t\treturn \"--profile flag\";\n\t\tcase \"env\":\n\t\t\treturn \"PSPM_PROFILE env var\";\n\t\tcase \"project\":\n\t\t\treturn \".pspmrc file\";\n\t\tcase \"user\":\n\t\t\treturn \"user config default\";\n\t\tcase \"default\":\n\t\t\treturn \"fallback default\";\n\t\tdefault:\n\t\t\treturn source;\n\t}\n}\n","import { getProfile, setDefaultProfile } from \"../../config.js\";\n\n/**\n * Set the default profile\n */\nexport async function configUse(name: string): Promise<void> {\n\ttry {\n\t\t// Check if profile exists\n\t\tconst profile = await getProfile(name);\n\t\tif (!profile) {\n\t\t\tconsole.error(`Error: Profile \"${name}\" not found.`);\n\t\t\tconsole.log(\"Run 'pspm config list' to see available profiles.\");\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\tawait setDefaultProfile(name);\n\t\tconsole.log(`Default profile set to \"${name}\".`);\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : \"Unknown error\";\n\t\tconsole.error(`Error: ${message}`);\n\t\tprocess.exit(1);\n\t}\n}\n","import { mkdir, rm } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { SkillLockfileEntry } from \"@repo/pspm-types\";\nimport {\n\ttype GlobalOptions,\n\tgetRegistryUrl,\n\tgetSkillsDir,\n\trequireApiKey,\n} from \"../config.js\";\nimport { readLockfile } from \"../lockfile.js\";\n\nexport interface InstallOptions {\n\tfrozenLockfile?: boolean;\n\tdir?: string;\n}\n\nexport async function install(\n\toptions: InstallOptions,\n\tglobalOptions?: GlobalOptions,\n): Promise<void> {\n\ttry {\n\t\tconst apiKey = await requireApiKey(globalOptions);\n\t\tawait getRegistryUrl(globalOptions); // Validate we have a registry configured\n\t\tconst skillsDir = options.dir || getSkillsDir();\n\n\t\tconst lockfile = await readLockfile();\n\t\tif (!lockfile) {\n\t\t\tif (options.frozenLockfile) {\n\t\t\t\tconsole.error(\n\t\t\t\t\t\"Error: No lockfile found. Cannot install with --frozen-lockfile\",\n\t\t\t\t);\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\t\t\tconsole.log(\"No lockfile found. Nothing to install.\");\n\t\t\treturn;\n\t\t}\n\n\t\tconst skillCount = Object.keys(lockfile.skills).length;\n\t\tif (skillCount === 0) {\n\t\t\tconsole.log(\"No skills in lockfile. Nothing to install.\");\n\t\t\treturn;\n\t\t}\n\n\t\tconsole.log(`Installing ${skillCount} skill(s)...\\n`);\n\n\t\tconst entries = Object.entries(lockfile.skills) as [\n\t\t\tstring,\n\t\t\tSkillLockfileEntry,\n\t\t][];\n\n\t\tfor (const [fullName, entry] of entries) {\n\t\t\tconst match = fullName.match(/^@user\\/([^/]+)\\/([^/]+)$/);\n\t\t\tif (!match) {\n\t\t\t\tconsole.warn(`Warning: Invalid skill name in lockfile: ${fullName}`);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst [, username, name] = match;\n\t\t\tconsole.log(`Installing ${fullName}@${entry.version}...`);\n\n\t\t\t// Download the tarball\n\t\t\tconst response = await fetch(entry.resolved, {\n\t\t\t\theaders: {\n\t\t\t\t\tAuthorization: `Bearer ${apiKey}`,\n\t\t\t\t},\n\t\t\t\tredirect: \"follow\",\n\t\t\t});\n\n\t\t\tif (!response.ok) {\n\t\t\t\tconsole.error(\n\t\t\t\t\t` Error: Failed to download ${fullName} (${response.status})`,\n\t\t\t\t);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst tarballBuffer = Buffer.from(await response.arrayBuffer());\n\n\t\t\t// Verify checksum\n\t\t\tconst { createHash } = await import(\"node:crypto\");\n\t\t\tconst actualIntegrity = `sha256-${createHash(\"sha256\").update(tarballBuffer).digest(\"base64\")}`;\n\n\t\t\tif (actualIntegrity !== entry.integrity) {\n\t\t\t\tconsole.error(` Error: Checksum verification failed for ${fullName}`);\n\t\t\t\tif (options.frozenLockfile) {\n\t\t\t\t\tprocess.exit(1);\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Extract tarball\n\t\t\tconst destDir = join(skillsDir, username, name);\n\t\t\tawait rm(destDir, { recursive: true, force: true });\n\t\t\tawait mkdir(destDir, { recursive: true });\n\n\t\t\tconst tempFile = join(destDir, \".temp.tgz\");\n\t\t\tconst { writeFile } = await import(\"node:fs/promises\");\n\t\t\tawait writeFile(tempFile, tarballBuffer);\n\n\t\t\tconst { exec } = await import(\"node:child_process\");\n\t\t\tconst { promisify } = await import(\"node:util\");\n\t\t\tconst execAsync = promisify(exec);\n\n\t\t\ttry {\n\t\t\t\tawait execAsync(\n\t\t\t\t\t`tar -xzf \"${tempFile}\" -C \"${destDir}\" --strip-components=1`,\n\t\t\t\t);\n\t\t\t} finally {\n\t\t\t\tawait rm(tempFile, { force: true });\n\t\t\t}\n\n\t\t\tconsole.log(` Installed to ${destDir}`);\n\t\t}\n\n\t\tconsole.log(`\\nAll ${skillCount} skill(s) installed.`);\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : \"Unknown error\";\n\t\tconsole.error(`Error: ${message}`);\n\t\tprocess.exit(1);\n\t}\n}\n","import { access } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { getSkillsDir } from \"../config.js\";\nimport { listLockfileSkills } from \"../lockfile.js\";\n\nexport interface ListOptions {\n\tjson?: boolean;\n}\n\nexport async function list(options: ListOptions): Promise<void> {\n\ttry {\n\t\tconst skills = await listLockfileSkills();\n\n\t\tif (skills.length === 0) {\n\t\t\tconsole.log(\"No skills installed.\");\n\t\t\treturn;\n\t\t}\n\n\t\tif (options.json) {\n\t\t\tconsole.log(JSON.stringify(skills, null, 2));\n\t\t\treturn;\n\t\t}\n\n\t\tconst skillsDir = getSkillsDir();\n\n\t\tconsole.log(\"Installed skills:\\n\");\n\n\t\tfor (const { name, entry } of skills) {\n\t\t\tconst match = name.match(/^@user\\/([^/]+)\\/([^/]+)$/);\n\t\t\tif (!match) continue;\n\n\t\t\tconst [, username, skillName] = match;\n\t\t\tconst skillPath = join(skillsDir, username, skillName);\n\n\t\t\t// Check if skill is actually installed on disk\n\t\t\tlet status = \"installed\";\n\t\t\ttry {\n\t\t\t\tawait access(skillPath);\n\t\t\t} catch {\n\t\t\t\tstatus = \"missing\";\n\t\t\t}\n\n\t\t\tconsole.log(` ${name}@${entry.version}`);\n\t\t\tif (status === \"missing\") {\n\t\t\t\tconsole.log(` Status: MISSING (run 'pspm install' to restore)`);\n\t\t\t}\n\t\t}\n\n\t\tconsole.log(`\\nTotal: ${skills.length} skill(s)`);\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : \"Unknown error\";\n\t\tconsole.error(`Error: ${message}`);\n\t\tprocess.exit(1);\n\t}\n}\n","import { randomBytes } from \"node:crypto\";\nimport http from \"node:http\";\nimport { URL } from \"node:url\";\nimport open from \"open\";\nimport { whoamiRequest } from \"../api-client.js\";\nimport {\n\ttype GlobalOptions,\n\tgetRegistryUrl,\n\tresolveConfig,\n\tsetProfileCredentials,\n} 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/api/skills\n * The web app URL should be like 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/api/skills\n * The server URL should be like 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(globalOptions?: GlobalOptions): Promise<void> {\n\tconst resolved = await resolveConfig(globalOptions);\n\tconst registryUrl = await getRegistryUrl(globalOptions);\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 setProfileCredentials(\n\t\tresolved.profileName,\n\t\tapiKey,\n\t\tusername,\n\t\tregistryUrl,\n\t);\n\n\tconsole.log(`Logged in as ${username}`);\n\tconsole.log(`Profile: ${resolved.profileName}`);\n\tconsole.log(`Registry: ${registryUrl}`);\n}\n\n/**\n * Login using direct API key (fallback method)\n */\nasync function directLogin(\n\tapiKey: string,\n\tglobalOptions?: GlobalOptions,\n): Promise<void> {\n\tconsole.log(\"Verifying API key...\");\n\n\tconst resolved = await resolveConfig(globalOptions);\n\tconst registryUrl = await getRegistryUrl(globalOptions);\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 for the resolved profile\n\tawait setProfileCredentials(\n\t\tresolved.profileName,\n\t\tapiKey,\n\t\tuser.username,\n\t\tregistryUrl,\n\t);\n\tconsole.log(`Logged in as ${user.username}`);\n\tconsole.log(`Profile: ${resolved.profileName}`);\n\tconsole.log(`Registry: ${registryUrl}`);\n}\n\nexport async function login(\n\toptions: LoginOptions,\n\tglobalOptions?: GlobalOptions,\n): 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, globalOptions);\n\t\t} else {\n\t\t\t// Browser-based OAuth flow\n\t\t\tawait browserLogin(globalOptions);\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\tclearProfileCredentials,\n\ttype GlobalOptions,\n\tisLoggedIn,\n\tresolveConfig,\n} from \"../config.js\";\n\nexport async function logout(globalOptions?: GlobalOptions): Promise<void> {\n\ttry {\n\t\tconst resolved = await resolveConfig(globalOptions);\n\t\tconst loggedIn = await isLoggedIn(globalOptions);\n\n\t\tif (!loggedIn) {\n\t\t\tconsole.log(`Not logged in (profile: ${resolved.profileName}).`);\n\t\t\treturn;\n\t\t}\n\n\t\tawait clearProfileCredentials(resolved.profileName);\n\t\tconsole.log(`Logged out from profile \"${resolved.profileName}\".`);\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 { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { promisify } from \"node:util\";\nimport type { PublishSkillBodyManifest } from \"@repo/sdk\";\nimport { configure, publishSkill } from \"../api-client.js\";\nimport {\n\ttype GlobalOptions,\n\tgetRegistryUrl,\n\trequireApiKey,\n} from \"../config.js\";\n\nconst exec = promisify(execCb);\n\nexport interface PublishOptions {\n\tbump?: \"major\" | \"minor\" | \"patch\";\n\ttag?: string;\n}\n\nexport async function publishCommand(\n\toptions: PublishOptions,\n\tglobalOptions?: GlobalOptions,\n): Promise<void> {\n\ttry {\n\t\tconst apiKey = await requireApiKey(globalOptions);\n\t\tconst registryUrl = await getRegistryUrl(globalOptions);\n\n\t\t// Read package.json from current directory\n\t\tconst packageJsonPath = join(process.cwd(), \"package.json\");\n\t\tlet packageJson: PublishSkillBodyManifest;\n\n\t\ttry {\n\t\t\tconst content = await readFile(packageJsonPath, \"utf-8\");\n\t\t\tpackageJson = JSON.parse(content);\n\t\t} catch {\n\t\t\tconsole.error(\"Error: No package.json found in current directory\");\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\t// Validate required fields\n\t\tif (!packageJson.name) {\n\t\t\tconsole.error(\"Error: package.json must have a 'name' field\");\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\tif (!packageJson.version) {\n\t\t\tconsole.error(\"Error: package.json must have a 'version' field\");\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\t// Handle version bump if requested\n\t\tif (options.bump) {\n\t\t\tconst semver = await import(\"semver\");\n\t\t\tconst newVersion = semver.default.inc(packageJson.version, options.bump);\n\t\t\tif (!newVersion) {\n\t\t\t\tconsole.error(\n\t\t\t\t\t`Error: Failed to bump version from ${packageJson.version}`,\n\t\t\t\t);\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\t\t\tpackageJson.version = newVersion;\n\t\t\tconsole.log(`Bumped version to ${newVersion}`);\n\t\t}\n\n\t\tconsole.log(`Registry: ${registryUrl}`);\n\t\tconsole.log(`Publishing ${packageJson.name}@${packageJson.version}...`);\n\n\t\t// Create tarball using npm pack (or tar directly)\n\t\t// Sanitize name for filename (replace @ and / with -)\n\t\tconst safeName = packageJson.name.replace(/[@/]/g, \"-\").replace(/^-+/, \"\");\n\t\tconst tarballName = `${safeName}-${packageJson.version}.tgz`;\n\t\tconst tempDir = join(process.cwd(), \".pspm-publish\");\n\n\t\t// Create tarball\n\t\ttry {\n\t\t\tawait exec(`rm -rf \"${tempDir}\" && mkdir -p \"${tempDir}\"`);\n\n\t\t\t// Get files to include (use 'files' from package.json or default)\n\t\t\tconst files = packageJson.files || [\n\t\t\t\t\"package.json\",\n\t\t\t\t\"SKILL.md\",\n\t\t\t\t\"runtime\",\n\t\t\t\t\"scripts\",\n\t\t\t\t\"data\",\n\t\t\t];\n\n\t\t\t// Create the tarball structure: package/{files}\n\t\t\tawait exec(`mkdir -p \"${tempDir}/package\"`);\n\n\t\t\tfor (const file of files) {\n\t\t\t\ttry {\n\t\t\t\t\t// Use rsync to copy while excluding node_modules\n\t\t\t\t\tawait exec(\n\t\t\t\t\t\t`rsync -a --exclude='node_modules' --exclude='.git' \"${file}\" \"${tempDir}/package/\" 2>/dev/null || true`,\n\t\t\t\t\t);\n\t\t\t\t} catch {\n\t\t\t\t\t// Ignore files that don't exist\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Always include package.json\n\t\t\tawait exec(`cp package.json \"${tempDir}/package/\"`);\n\n\t\t\t// 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 convert to base64\n\t\t\tconst tarballBuffer = await readFile(tarballPath);\n\t\t\tconst tarballBase64 = tarballBuffer.toString(\"base64\");\n\n\t\t\t// Configure SDK and publish (use direct REST endpoints, not oRPC)\n\t\t\tconfigure({ baseUrl: 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 errorData = response.data as unknown as {\n\t\t\t\t\terror?: string;\n\t\t\t\t\tmessage?: string;\n\t\t\t\t};\n\t\t\t\tconst errorMessage =\n\t\t\t\t\terrorData?.error || errorData?.message || \"Publish failed\";\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`\\nPublished @user/${result.skill.username}/${result.skill.name}@${result.version.version}`,\n\t\t\t);\n\t\t\tconsole.log(`Checksum: ${result.version.checksum}`);\n\t\t} finally {\n\t\t\t// Cleanup\n\t\t\tawait exec(`rm -rf \"${tempDir}\"`).catch(() => {});\n\t\t}\n\t} catch (error) {\n\t\t// Try to extract detailed error info\n\t\tif (error instanceof Error) {\n\t\t\tconsole.error(`Error: ${error.message}`);\n\n\t\t\t// Check for oRPC error with response details\n\t\t\tconst anyError = error as {\n\t\t\t\tcause?: { response?: Response; data?: unknown; body?: unknown };\n\t\t\t\tresponse?: Response;\n\t\t\t\tdata?: unknown;\n\t\t\t\tbody?: unknown;\n\t\t\t};\n\n\t\t\t// Try to get response body for more details\n\t\t\tif (anyError.cause?.response) {\n\t\t\t\ttry {\n\t\t\t\t\tconst text = await anyError.cause.response.text();\n\t\t\t\t\tconsole.error(`Response body: ${text}`);\n\t\t\t\t} catch {\n\t\t\t\t\t// ignore\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Log cause body if available\n\t\t\tif (anyError.cause?.body) {\n\t\t\t\tconsole.error(\n\t\t\t\t\t`Cause body: ${JSON.stringify(anyError.cause.body, null, 2)}`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (anyError.body) {\n\t\t\t\tconsole.error(`Error body: ${JSON.stringify(anyError.body, null, 2)}`);\n\t\t\t}\n\n\t\t\t// Log additional error properties\n\t\t\tif (anyError.data) {\n\t\t\t\tconsole.error(`Error data: ${JSON.stringify(anyError.data, null, 2)}`);\n\t\t\t}\n\n\t\t\t// Log the full error in verbose mode\n\t\t\tif (process.env.PSPM_DEBUG) {\n\t\t\t\tconsole.error(\"\\nFull error details:\");\n\t\t\t\tconsole.error(error);\n\t\t\t\tif (error.stack) {\n\t\t\t\t\tconsole.error(\"\\nStack trace:\");\n\t\t\t\t\tconsole.error(error.stack);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tconsole.error(`Error: ${String(error)}`);\n\t\t}\n\t\tconsole.error(\"\\nTip: Set PSPM_DEBUG=1 for more detailed error output\");\n\t\tprocess.exit(1);\n\t}\n}\n\n// Keep old export name for backwards compatibility\nexport { publishCommand as publish };\n","import { rm } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { getSkillsDir, requireApiKey } from \"../config.js\";\nimport { listLockfileSkills, removeFromLockfile } from \"../lockfile.js\";\n\nexport async function remove(nameOrSpecifier: string): Promise<void> {\n\ttry {\n\t\tawait requireApiKey();\n\n\t\t// Normalize the name\n\t\tlet fullName: string;\n\t\tlet username: string;\n\t\tlet name: string;\n\n\t\tif (nameOrSpecifier.startsWith(\"@user/\")) {\n\t\t\t// Full specifier: @user/{username}/{name}\n\t\t\tconst match = nameOrSpecifier.match(/^@user\\/([^/]+)\\/([^@/]+)/);\n\t\t\tif (!match) {\n\t\t\t\tconsole.error(`Error: Invalid skill specifier: ${nameOrSpecifier}`);\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\t\t\tfullName = `@user/${match[1]}/${match[2]}`;\n\t\t\tusername = match[1];\n\t\t\tname = match[2];\n\t\t} else {\n\t\t\t// Short name - find in lockfile\n\t\t\tconst skills = await listLockfileSkills();\n\t\t\tconst found = skills.find((s) => {\n\t\t\t\tconst match = s.name.match(/^@user\\/([^/]+)\\/([^/]+)$/);\n\t\t\t\treturn match && match[2] === nameOrSpecifier;\n\t\t\t});\n\n\t\t\tif (!found) {\n\t\t\t\tconsole.error(\n\t\t\t\t\t`Error: Skill \"${nameOrSpecifier}\" not found in lockfile`,\n\t\t\t\t);\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\n\t\t\tfullName = found.name;\n\t\t\tconst match = fullName.match(/^@user\\/([^/]+)\\/([^/]+)$/);\n\t\t\tif (!match) {\n\t\t\t\tconsole.error(`Error: Invalid skill name in lockfile: ${fullName}`);\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\t\t\tusername = match[1];\n\t\t\tname = match[2];\n\t\t}\n\n\t\tconsole.log(`Removing ${fullName}...`);\n\n\t\t// Remove from lockfile\n\t\tconst removed = await removeFromLockfile(fullName);\n\t\tif (!removed) {\n\t\t\tconsole.error(`Error: ${fullName} not found in lockfile`);\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\t// Remove from disk\n\t\tconst skillsDir = getSkillsDir();\n\t\tconst destDir = join(skillsDir, username, name);\n\n\t\ttry {\n\t\t\tawait rm(destDir, { recursive: true, force: true });\n\t\t} catch {\n\t\t\t// Ignore errors if directory doesn't exist\n\t\t}\n\n\t\tconsole.log(`Removed ${fullName}`);\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : \"Unknown error\";\n\t\tconsole.error(`Error: ${message}`);\n\t\tprocess.exit(1);\n\t}\n}\n","import { parseSkillSpecifier } from \"@repo/pspm-types\";\nimport { configure, deleteSkill, deleteSkillVersion } from \"../api-client.js\";\nimport {\n\ttype GlobalOptions,\n\tgetRegistryUrl,\n\trequireApiKey,\n} from \"../config.js\";\n\nexport interface UnpublishOptions {\n\tforce?: boolean;\n}\n\nexport async function unpublish(\n\tspecifier: string,\n\toptions: UnpublishOptions,\n\tglobalOptions?: GlobalOptions,\n): Promise<void> {\n\ttry {\n\t\tconst apiKey = await requireApiKey(globalOptions);\n\t\tconst registryUrl = await getRegistryUrl(globalOptions);\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({ baseUrl: 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 errorData = response.data as unknown as {\n\t\t\t\t\terror?: string;\n\t\t\t\t\tmessage?: string;\n\t\t\t\t};\n\t\t\t\tconst errorMessage =\n\t\t\t\t\terrorData?.error ||\n\t\t\t\t\terrorData?.message ||\n\t\t\t\t\t\"Failed to unpublish. Version may not exist.\";\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 errorData = response.data as unknown as {\n\t\t\t\t\terror?: string;\n\t\t\t\t\tmessage?: string;\n\t\t\t\t};\n\t\t\t\tconst errorMessage =\n\t\t\t\t\terrorData?.error ||\n\t\t\t\t\terrorData?.message ||\n\t\t\t\t\t\"Failed to unpublish. Skill may not exist.\";\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 {\n\ttype GlobalOptions,\n\tgetRegistryUrl,\n\trequireApiKey,\n} from \"../config.js\";\nimport { listLockfileSkills } from \"../lockfile.js\";\nimport { add } from \"./add.js\";\n\nexport interface UpdateOptions {\n\tdryRun?: boolean;\n}\n\nexport async function update(\n\toptions: UpdateOptions,\n\tglobalOptions?: GlobalOptions,\n): Promise<void> {\n\ttry {\n\t\tconst apiKey = await requireApiKey(globalOptions);\n\t\tconst registryUrl = await getRegistryUrl(globalOptions);\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({ baseUrl: 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\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, {}, globalOptions);\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 {\n\ttype GlobalOptions,\n\tgetRegistryUrl,\n\trequireApiKey,\n\tresolveConfig,\n} from \"../config.js\";\n\nexport async function whoami(globalOptions?: GlobalOptions): Promise<void> {\n\ttry {\n\t\tconst resolved = await resolveConfig(globalOptions);\n\t\tconst apiKey = await requireApiKey(globalOptions);\n\t\tconst registryUrl = await getRegistryUrl(globalOptions);\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\tconsole.log(`Profile: ${resolved.profileName}`);\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\tconsole.log(`Profile: ${resolved.profileName}`);\n\t\t} else {\n\t\t\tconsole.error(\"Could not determine current user.\");\n\t\t\tprocess.exit(1);\n\t\t}\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : \"Unknown error\";\n\t\tconsole.error(`Error: ${message}`);\n\t\tprocess.exit(1);\n\t}\n}\n","#!/usr/bin/env node\n\nimport { readFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { Command } from \"commander\";\nimport {\n\tadd,\n\tconfigAdd,\n\tconfigDelete,\n\tconfigInit,\n\tconfigList,\n\tconfigSet,\n\tconfigShow,\n\tconfigUse,\n\tinstall,\n\tlist,\n\tlogin,\n\tlogout,\n\tpublish,\n\tremove,\n\tunpublish,\n\tupdate,\n\twhoami,\n} from \"./commands/index.js\";\nimport type { GlobalOptions } from \"./config.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\t.option(\"-p, --profile <name>\", \"Use a specific profile\");\n\n/**\n * Get global options from a command\n */\nfunction getGlobalOptions(cmd: Command): GlobalOptions {\n\t// Walk up to the root program to get global options\n\tlet current: Command | null = cmd;\n\twhile (current.parent) {\n\t\tcurrent = current.parent;\n\t}\n\tconst opts = current.opts();\n\treturn {\n\t\tprofile: opts.profile,\n\t};\n}\n\n// =============================================================================\n// Config commands\n// =============================================================================\n\nconst configCmd = program\n\t.command(\"config\")\n\t.description(\"Manage PSPM configuration and profiles\");\n\nconfigCmd\n\t.command(\"list\")\n\t.description(\"List all profiles\")\n\t.action(async () => {\n\t\tawait configList();\n\t});\n\nconfigCmd\n\t.command(\"show [name]\")\n\t.description(\"Show resolved config or a specific profile\")\n\t.action(async (name, _options, cmd) => {\n\t\tconst globalOptions = getGlobalOptions(cmd);\n\t\tawait configShow({ name }, globalOptions);\n\t});\n\nconfigCmd\n\t.command(\"add <name>\")\n\t.description(\"Create a new profile\")\n\t.option(\"--registry-url <url>\", \"Registry URL for the profile\")\n\t.action(async (name, options) => {\n\t\tawait configAdd(name, { registryUrl: options.registryUrl });\n\t});\n\nconfigCmd\n\t.command(\"use <name>\")\n\t.description(\"Set the default profile\")\n\t.action(async (name) => {\n\t\tawait configUse(name);\n\t});\n\nconfigCmd\n\t.command(\"set <profile> <key> <value>\")\n\t.description(\"Set a profile field (registryUrl, apiKey, username)\")\n\t.action(async (profile, key, value) => {\n\t\tawait configSet(profile, key, value);\n\t});\n\nconfigCmd\n\t.command(\"delete <name>\")\n\t.description(\"Delete a profile\")\n\t.action(async (name) => {\n\t\tawait configDelete(name);\n\t});\n\nconfigCmd\n\t.command(\"init\")\n\t.description(\"Create a .pspmrc file in the current directory\")\n\t.option(\"--profile <name>\", \"Profile to use for this project\")\n\t.option(\"--registry-url <url>\", \"Registry URL override\")\n\t.action(async (options) => {\n\t\tawait configInit({\n\t\t\tprofile: options.profile,\n\t\t\tregistryUrl: options.registryUrl,\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, cmd) => {\n\t\tconst globalOptions = getGlobalOptions(cmd);\n\t\tawait login({ apiKey: options.apiKey }, globalOptions);\n\t});\n\nprogram\n\t.command(\"logout\")\n\t.description(\"Log out and clear stored credentials\")\n\t.action(async (_options, cmd) => {\n\t\tconst globalOptions = getGlobalOptions(cmd);\n\t\tawait logout(globalOptions);\n\t});\n\nprogram\n\t.command(\"whoami\")\n\t.description(\"Show current user information\")\n\t.action(async (_options, cmd) => {\n\t\tconst globalOptions = getGlobalOptions(cmd);\n\t\tawait whoami(globalOptions);\n\t});\n\n// =============================================================================\n// Skill management commands\n// =============================================================================\n\nprogram\n\t.command(\"add <specifier>\")\n\t.description(\"Add a skill (e.g., @user/bsheng/vite_slides@^2.0.0)\")\n\t.option(\"--save\", \"Save to lockfile (default)\")\n\t.action(async (specifier, options, cmd) => {\n\t\tconst globalOptions = getGlobalOptions(cmd);\n\t\tawait add(specifier, { save: options.save ?? true }, globalOptions);\n\t});\n\nprogram\n\t.command(\"remove <name>\")\n\t.alias(\"rm\")\n\t.description(\"Remove an installed skill\")\n\t.action(async (name) => {\n\t\tawait remove(name);\n\t});\n\nprogram\n\t.command(\"list\")\n\t.alias(\"ls\")\n\t.description(\"List installed skills\")\n\t.option(\"--json\", \"Output as JSON\")\n\t.action(async (options) => {\n\t\tawait list({ json: options.json });\n\t});\n\nprogram\n\t.command(\"install\")\n\t.alias(\"i\")\n\t.description(\"Install all skills from lockfile\")\n\t.option(\"--frozen-lockfile\", \"Fail if lockfile is missing or outdated\")\n\t.option(\"--dir <path>\", \"Install skills to a specific directory\")\n\t.action(async (options, cmd) => {\n\t\tconst globalOptions = getGlobalOptions(cmd);\n\t\tawait install(\n\t\t\t{\n\t\t\t\tfrozenLockfile: options.frozenLockfile,\n\t\t\t\tdir: options.dir,\n\t\t\t},\n\t\t\tglobalOptions,\n\t\t);\n\t});\n\nprogram\n\t.command(\"update\")\n\t.description(\"Update all skills to latest compatible versions\")\n\t.option(\"--dry-run\", \"Show what would be updated without making changes\")\n\t.action(async (options, cmd) => {\n\t\tconst globalOptions = getGlobalOptions(cmd);\n\t\tawait update({ dryRun: options.dryRun }, globalOptions);\n\t});\n\n// =============================================================================\n// Publishing commands\n// =============================================================================\n\nprogram\n\t.command(\"publish\")\n\t.description(\"Publish current directory as a skill\")\n\t.option(\"--bump <level>\", \"Bump version (major, minor, patch)\")\n\t.option(\"--tag <tag>\", \"Tag for the release\")\n\t.action(async (options, cmd) => {\n\t\tconst globalOptions = getGlobalOptions(cmd);\n\t\tawait publish(\n\t\t\t{\n\t\t\t\tbump: options.bump as \"major\" | \"minor\" | \"patch\" | undefined,\n\t\t\t\ttag: options.tag,\n\t\t\t},\n\t\t\tglobalOptions,\n\t\t);\n\t});\n\nprogram\n\t.command(\"unpublish <specifier>\")\n\t.description(\"Remove a published skill version\")\n\t.option(\"--force\", \"Confirm destructive action\")\n\t.action(async (specifier, options, cmd) => {\n\t\tconst globalOptions = getGlobalOptions(cmd);\n\t\tawait unpublish(specifier, { force: options.force }, globalOptions);\n\t});\n\nprogram.parse();\n"]}