@anytio/pspm 0.14.0 → 0.15.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","names":["access","semver","getLatestVersion","getLatestVersion","checkOutdatedFn","exec","execCb","resolveVersion","semver","version","versionCommand","publish","access"],"sources":["../src/commands/access.ts","../src/commands/audit.ts","../src/commands/config/init.ts","../src/commands/config/show.ts","../src/commands/deprecate.ts","../src/commands/init.ts","../src/commands/link.ts","../src/commands/list.ts","../src/commands/login.ts","../src/commands/logout.ts","../src/commands/migrate.ts","../src/commands/notebook.ts","../../../packages/features/skill-registry/src/client/resolver.ts","../../../packages/features/skill-registry/src/client/outdated.ts","../src/commands/outdated.ts","../src/commands/publish-utils.ts","../src/commands/publish.ts","../src/commands/remove.ts","../src/commands/search.ts","../src/commands/skill-list-helpers.ts","../src/commands/skill-list.ts","../src/commands/unpublish.ts","../src/commands/update.ts","../src/commands/upgrade.ts","../src/commands/version.ts","../src/commands/whoami.ts","../src/cli/auth-commands.ts","../src/cli/config-commands.ts","../src/cli/notebook-commands.ts","../src/cli/publish-commands.ts","../src/cli/skill-commands.ts","../src/cli/skill-list-commands.ts","../src/update-notifier.ts","../src/index.ts"],"sourcesContent":["import { changeSkillAccess, configure } from \"@/api-client\";\nimport { getRegistryUrl, requireApiKey, resolveConfig } from \"@/config\";\nimport {\n isGitHubSpecifier,\n parseGitHubSpecifier,\n parseRegistrySpecifier,\n} from \"@/lib/index\";\n\n/** Check if specifier is a local file reference */\nfunction isLocalSpecifier(specifier: string): boolean {\n return (\n specifier.startsWith(\"file:\") ||\n specifier.startsWith(\"./\") ||\n specifier.startsWith(\"../\")\n );\n}\n\nexport interface AccessOptions {\n public?: boolean;\n private?: boolean;\n}\n\n/**\n * Change the visibility of a skill package.\n *\n * Usage:\n * pspm access --public # Make current package public\n * pspm access @user/bob/skill --public # Make specific package public\n *\n * Note: Making a package public is irreversible (like npm).\n */\nexport async function access(\n specifier: string | undefined,\n options: AccessOptions,\n): Promise<void> {\n try {\n const apiKey = await requireApiKey();\n const registryUrl = await getRegistryUrl();\n\n // Determine visibility from options\n if (options.public && options.private) {\n console.error(\"Error: Cannot specify both --public and --private\");\n process.exit(1);\n }\n\n if (!options.public && !options.private) {\n console.error(\"Error: Must specify either --public or --private\");\n process.exit(1);\n }\n\n const visibility = options.public ? \"public\" : \"private\";\n\n // Parse package name - either from specifier or from current directory's pspm.json\n let packageName: string;\n let packageUsername: string | undefined;\n\n if (specifier) {\n // Check for GitHub specifiers - not supported for access command\n if (isGitHubSpecifier(specifier)) {\n const ghSpec = parseGitHubSpecifier(specifier);\n if (ghSpec) {\n console.error(`Error: Cannot change visibility of GitHub packages.`);\n console.error(\n ` \"${specifier}\" is hosted on GitHub, not the PSPM registry.`,\n );\n console.error(\n ` Visibility can only be changed for packages published to the registry.`,\n );\n } else {\n console.error(`Error: Invalid GitHub specifier \"${specifier}\".`);\n console.error(` Use format: github:{owner}/{repo}[/{path}][@{ref}]`);\n }\n process.exit(1);\n }\n\n // Check for local file specifiers - not supported for access command\n if (isLocalSpecifier(specifier)) {\n console.error(`Error: Cannot change visibility of local packages.`);\n console.error(\n ` \"${specifier}\" is a local directory, not a registry package.`,\n );\n console.error(\n ` Visibility can only be changed for packages published to the registry.`,\n );\n process.exit(1);\n }\n\n // Parse as registry specifier\n const parsed = parseRegistrySpecifier(specifier);\n if (!parsed) {\n console.error(`Error: Invalid package specifier \"${specifier}\".`);\n console.error(\n ` Use format: @user/{username}/{name} or @org/{orgname}/{name}`,\n );\n console.error(``);\n console.error(` Examples:`);\n console.error(` pspm access @user/myname/my-skill --public`);\n console.error(\n ` pspm access --public (uses current directory's pspm.json)`,\n );\n process.exit(1);\n }\n packageName = parsed.name;\n packageUsername = parsed.owner;\n } else {\n // Read from current directory's pspm.json or package.json\n const { readFile } = await import(\"node:fs/promises\");\n const { join } = await import(\"node:path\");\n\n let manifest: { name: string } | null = null;\n\n // Try pspm.json first\n try {\n const content = await readFile(\n join(process.cwd(), \"pspm.json\"),\n \"utf-8\",\n );\n manifest = JSON.parse(content);\n } catch {\n // Try package.json\n try {\n const content = await readFile(\n join(process.cwd(), \"package.json\"),\n \"utf-8\",\n );\n manifest = JSON.parse(content);\n } catch {\n console.error(\n \"Error: No pspm.json or package.json found in current directory\",\n );\n console.error(\n \"Either run this command in a package directory or specify a package name\",\n );\n process.exit(1);\n }\n }\n\n if (!manifest?.name) {\n console.error(\"Error: Package manifest is missing 'name' field\");\n process.exit(1);\n }\n\n packageName = manifest.name;\n }\n\n // If username not from specifier, get from config\n if (!packageUsername) {\n const config = await resolveConfig();\n packageUsername = config.username;\n }\n\n if (!packageUsername) {\n console.error(\n \"Error: Could not determine username. Please use the full specifier: @user/{username}/{name}\",\n );\n process.exit(1);\n }\n\n // Configure SDK and make API call\n configure({ registryUrl, apiKey });\n\n console.log(`Setting ${packageName} to ${visibility}...`);\n\n const response = await changeSkillAccess(packageUsername, packageName, {\n visibility,\n });\n\n if (response.status !== 200 || !response.data) {\n const errorMessage = response.error ?? \"Failed to change visibility\";\n console.error(`Error: ${errorMessage}`);\n process.exit(1);\n }\n\n const result = response.data;\n console.log(\n `+ @${(result as any).namespace ?? \"user\"}/${result.username}/${result.name} is now ${result.visibility}`,\n );\n\n if (visibility === \"public\") {\n console.log(\"\");\n console.log(\n \"Note: This action is irreversible. Public packages cannot be made private.\",\n );\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n console.error(`Error: ${message}`);\n process.exit(1);\n }\n}\n","/**\n * Audit command - Verify integrity of installed skills and check for issues.\n *\n * Checks:\n * 1. Integrity verification: re-hash installed files and compare with lockfile\n * 2. Deprecated packages: flag any deprecated versions\n * 3. Missing packages: flag packages in lockfile but not on disk\n */\n\nimport { stat } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { getSkillsDir } from \"@/config\";\nimport { parseGitHubSpecifier, type WellKnownLockfileEntry } from \"@/lib/index\";\nimport {\n listLockfileGitHubPackages,\n listLockfileSkills,\n listLockfileWellKnownPackages,\n readLockfile,\n} from \"@/lockfile\";\n\nexport interface AuditOptions {\n /** Output as JSON */\n json?: boolean;\n}\n\ninterface AuditIssue {\n name: string;\n source: \"registry\" | \"github\" | \"well-known\";\n severity: \"error\" | \"warning\" | \"info\";\n type: \"integrity\" | \"deprecated\" | \"missing\" | \"no-lockfile\";\n message: string;\n}\n\nasync function pathExists(path: string): Promise<boolean> {\n try {\n await stat(path);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction handleMissingLockfile(json: boolean): never {\n if (json) {\n console.log(\n JSON.stringify({\n ok: false,\n issues: [\n {\n name: \"-\",\n source: \"-\",\n severity: \"error\",\n type: \"no-lockfile\",\n message: \"No lockfile found. Run 'pspm install' first.\",\n },\n ],\n }),\n );\n } else {\n console.error(\"No lockfile found. Run 'pspm install' to create one.\");\n }\n process.exit(1);\n}\n\nasync function auditRegistry(\n registrySkills: Awaited<ReturnType<typeof listLockfileSkills>>,\n skillsDir: string,\n): Promise<AuditIssue[]> {\n const issues: AuditIssue[] = [];\n for (const { name: fullName, entry } of registrySkills) {\n const match = fullName.match(/^@user\\/([^/]+)\\/([^/]+)$/);\n if (!match) continue;\n\n const [, username, skillName] = match;\n const destDir = join(skillsDir, username, skillName);\n\n if (!(await pathExists(destDir))) {\n issues.push({\n name: fullName,\n source: \"registry\",\n severity: \"error\",\n type: \"missing\",\n message: `Not installed on disk. Run 'pspm install' to restore.`,\n });\n continue;\n }\n\n if (entry.deprecated) {\n issues.push({\n name: fullName,\n source: \"registry\",\n severity: \"warning\",\n type: \"deprecated\",\n message: `Deprecated: ${entry.deprecated}`,\n });\n }\n\n if (!(await pathExists(join(destDir, \"SKILL.md\")))) {\n issues.push({\n name: fullName,\n source: \"registry\",\n severity: \"warning\",\n type: \"integrity\",\n message:\n \"Missing SKILL.md in installed directory. Package may be corrupted.\",\n });\n }\n }\n return issues;\n}\n\nasync function auditGithub(\n githubSkills: Awaited<ReturnType<typeof listLockfileGitHubPackages>>,\n skillsDir: string,\n): Promise<AuditIssue[]> {\n const issues: AuditIssue[] = [];\n for (const { specifier } of githubSkills) {\n const parsed = parseGitHubSpecifier(specifier);\n if (!parsed) continue;\n\n const destDir = parsed.path\n ? join(skillsDir, \"_github\", parsed.owner, parsed.repo, parsed.path)\n : join(skillsDir, \"_github\", parsed.owner, parsed.repo);\n\n if (!(await pathExists(destDir))) {\n issues.push({\n name: specifier,\n source: \"github\",\n severity: \"error\",\n type: \"missing\",\n message: `Not installed on disk. Run 'pspm install' to restore.`,\n });\n continue;\n }\n\n if (!(await pathExists(join(destDir, \"SKILL.md\")))) {\n issues.push({\n name: specifier,\n source: \"github\",\n severity: \"warning\",\n type: \"integrity\",\n message:\n \"Missing SKILL.md in installed directory. Package may be corrupted.\",\n });\n }\n }\n return issues;\n}\n\nasync function auditWellKnown(\n wellKnownSkills: Awaited<ReturnType<typeof listLockfileWellKnownPackages>>,\n skillsDir: string,\n): Promise<AuditIssue[]> {\n const issues: AuditIssue[] = [];\n for (const { specifier, entry } of wellKnownSkills) {\n const wkEntry = entry as WellKnownLockfileEntry;\n const destDir = join(\n skillsDir,\n \"_wellknown\",\n wkEntry.hostname,\n wkEntry.name,\n );\n\n if (!(await pathExists(destDir))) {\n issues.push({\n name: specifier,\n source: \"well-known\",\n severity: \"error\",\n type: \"missing\",\n message: `Not installed on disk. Run 'pspm install' to restore.`,\n });\n continue;\n }\n\n if (!(await pathExists(join(destDir, \"SKILL.md\")))) {\n issues.push({\n name: specifier,\n source: \"well-known\",\n severity: \"warning\",\n type: \"integrity\",\n message:\n \"Missing SKILL.md in installed directory. Package may be corrupted.\",\n });\n }\n }\n return issues;\n}\n\nfunction reportIssues(issues: AuditIssue[], totalPackages: number): void {\n const errorCount = issues.filter((i) => i.severity === \"error\").length;\n const warningCount = issues.filter((i) => i.severity === \"warning\").length;\n\n if (issues.length === 0) {\n console.log(`Audited ${totalPackages} package(s). No issues found.`);\n return;\n }\n\n const errors = issues.filter((i) => i.severity === \"error\");\n const warnings = issues.filter((i) => i.severity === \"warning\");\n\n if (errors.length > 0) {\n console.log(\"Errors:\");\n for (const issue of errors) {\n console.log(\n ` [${issue.type.toUpperCase()}] ${issue.name} (${issue.source})`,\n );\n console.log(` ${issue.message}`);\n }\n console.log();\n }\n\n if (warnings.length > 0) {\n console.log(\"Warnings:\");\n for (const issue of warnings) {\n console.log(\n ` [${issue.type.toUpperCase()}] ${issue.name} (${issue.source})`,\n );\n console.log(` ${issue.message}`);\n }\n console.log();\n }\n\n console.log(\n `Audited ${totalPackages} package(s): ${errorCount} error(s), ${warningCount} warning(s).`,\n );\n}\n\nexport async function audit(options: AuditOptions): Promise<void> {\n try {\n const lockfile = await readLockfile();\n\n if (!lockfile) {\n handleMissingLockfile(options.json ?? false);\n }\n\n const skillsDir = getSkillsDir();\n\n if (!options.json) {\n console.log(\"Auditing installed skills...\\n\");\n }\n\n const registrySkills = await listLockfileSkills();\n const githubSkills = await listLockfileGitHubPackages();\n const wellKnownSkills = await listLockfileWellKnownPackages();\n\n const issues: AuditIssue[] = [\n ...(await auditRegistry(registrySkills, skillsDir)),\n ...(await auditGithub(githubSkills, skillsDir)),\n ...(await auditWellKnown(wellKnownSkills, skillsDir)),\n ];\n\n const totalPackages =\n registrySkills.length + githubSkills.length + wellKnownSkills.length;\n const errorCount = issues.filter((i) => i.severity === \"error\").length;\n\n if (options.json) {\n console.log(\n JSON.stringify(\n { ok: errorCount === 0, totalPackages, issues },\n null,\n 2,\n ),\n );\n if (errorCount > 0) process.exit(1);\n return;\n }\n\n reportIssues(issues, totalPackages);\n\n if (errorCount > 0) {\n process.exit(1);\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n console.error(`Error: ${message}`);\n process.exit(1);\n }\n}\n","import { stat, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\nexport interface ConfigInitOptions {\n registry?: string;\n}\n\n/**\n * Create a .pspmrc file in the current directory (INI format)\n */\nexport async function configInit(options: ConfigInitOptions): Promise<void> {\n try {\n const configPath = join(process.cwd(), \".pspmrc\");\n\n // Check if file already exists\n try {\n await stat(configPath);\n console.error(\"Error: .pspmrc already exists in this directory.\");\n process.exit(1);\n } catch {\n // File doesn't exist, good\n }\n\n // Build INI content\n const lines: string[] = [\"; Project-specific PSPM configuration\", \"\"];\n\n if (options.registry) {\n lines.push(`registry = ${options.registry}`);\n } else {\n lines.push(\"; Uncomment to use a custom registry:\");\n lines.push(\"; registry = https://custom-registry.example.com\");\n }\n\n lines.push(\"\");\n\n // Write the file\n await writeFile(configPath, lines.join(\"\\n\"));\n\n console.log(\"Created .pspmrc\");\n console.log(\"\");\n console.log(\"Contents:\");\n console.log(lines.join(\"\\n\"));\n console.log(\"Note: .pspmrc should be committed to version control.\");\n console.log(\"API keys should NOT be stored here - use pspm login instead.\");\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n console.error(`Error: ${message}`);\n process.exit(1);\n }\n}\n","import { findProjectConfig, getConfigPath, resolveConfig } from \"@/config\";\n\n/**\n * Show resolved configuration\n */\nexport async function configShow(): Promise<void> {\n try {\n const resolved = await resolveConfig();\n const projectConfig = await findProjectConfig();\n const configPath = getConfigPath();\n\n console.log(\"Resolved Configuration:\\n\");\n console.log(` Registry URL: ${resolved.registryUrl}`);\n console.log(` API Key: ${resolved.apiKey ? \"***\" : \"(not set)\"}`);\n console.log(` Username: ${resolved.username || \"(not set)\"}`);\n console.log(\"\");\n console.log(\"Config Locations:\");\n console.log(` User config: ${configPath}`);\n console.log(` Project config: ${projectConfig ? \".pspmrc\" : \"(none)\"}`);\n console.log(\"\");\n console.log(\"Environment Variables:\");\n console.log(\n ` PSPM_REGISTRY_URL: ${process.env.PSPM_REGISTRY_URL || \"(not set)\"}`,\n );\n console.log(\n ` PSPM_API_KEY: ${process.env.PSPM_API_KEY ? \"***\" : \"(not set)\"}`,\n );\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n console.error(`Error: ${message}`);\n process.exit(1);\n }\n}\n","import {\n configure,\n deprecateSkillVersion,\n undeprecateSkillVersion,\n} from \"@/api-client\";\nimport { getRegistryUrl, requireApiKey } from \"@/config\";\nimport {\n generateRegistryIdentifier,\n parseRegistrySpecifier,\n} from \"@/lib/index\";\n\nexport interface DeprecateOptions {\n undo?: boolean;\n}\n\n/**\n * Deprecate or undeprecate a skill version\n *\n * Usage:\n * pspm deprecate @user/bob/skill@1.0.0 \"Use v2.0.0 instead\"\n * pspm deprecate @user/bob/skill@1.0.0 --undo\n */\nexport async function deprecate(\n specifier: string,\n message: string | undefined,\n options: DeprecateOptions,\n): Promise<void> {\n try {\n const apiKey = await requireApiKey();\n const registryUrl = await getRegistryUrl();\n\n // Parse the specifier\n const parsed = parseRegistrySpecifier(specifier);\n if (!parsed) {\n console.error(\n `Error: Invalid skill specifier \"${specifier}\". Use format: @user/{username}/{name}@{version} or @org/{orgname}/{name}@{version}`,\n );\n process.exit(1);\n }\n\n const { owner, name, versionRange } = parsed;\n const fullName = generateRegistryIdentifier({\n namespace: parsed.namespace,\n owner,\n name,\n });\n\n if (!versionRange) {\n console.error(\n \"Error: Version is required for deprecation. Use format: @user/{username}/{name}@{version}\",\n );\n process.exit(1);\n }\n\n // Configure SDK\n configure({ registryUrl, apiKey });\n\n if (options.undo) {\n // Remove deprecation\n console.log(`Removing deprecation from ${fullName}@${versionRange}...`);\n\n const response = await undeprecateSkillVersion(owner, name, versionRange);\n if (response.status !== 200) {\n console.error(\n `Error: ${response.error || \"Failed to remove deprecation\"}`,\n );\n process.exit(1);\n }\n\n console.log(`Removed deprecation from ${fullName}@${versionRange}`);\n } else {\n // Add deprecation\n if (!message) {\n console.error(\n \"Error: Deprecation message is required. Usage: pspm deprecate <specifier> <message>\",\n );\n process.exit(1);\n }\n\n console.log(`Deprecating ${fullName}@${versionRange}...`);\n\n const response = await deprecateSkillVersion(\n owner,\n name,\n versionRange,\n message,\n );\n if (response.status !== 200) {\n console.error(\n `Error: ${response.error || \"Failed to deprecate version\"}`,\n );\n process.exit(1);\n }\n\n console.log(`Deprecated ${fullName}@${versionRange}`);\n console.log(`Message: ${message}`);\n console.log(\"\");\n console.log(\n \"Users installing this version will see a deprecation warning.\",\n );\n console.log(\"The package is still available for download.\");\n }\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : \"Unknown error\";\n console.error(`Error: ${errorMessage}`);\n process.exit(1);\n }\n}\n","import { readFile, stat, writeFile } from \"node:fs/promises\";\nimport { basename, join } from \"node:path\";\nimport { createInterface } from \"node:readline\";\nimport {\n DEFAULT_SKILL_FILES,\n PSPM_SCHEMA_URL,\n type PspmManifest,\n} from \"@/lib/index\";\n\nexport interface InitOptions {\n name?: string;\n description?: string;\n author?: string;\n yes?: boolean;\n force?: boolean;\n}\n\n/**\n * Simple readline prompt that mimics npm's style\n */\nfunction prompt(\n rl: ReturnType<typeof createInterface>,\n question: string,\n defaultValue: string,\n): Promise<string> {\n return new Promise((resolve) => {\n const displayDefault = defaultValue ? ` (${defaultValue})` : \"\";\n rl.question(`${question}${displayDefault} `, (answer) => {\n resolve(answer.trim() || defaultValue);\n });\n });\n}\n\n/**\n * Try to read existing package.json to extract some defaults\n */\nasync function readExistingPackageJson(): Promise<Partial<PspmManifest> | null> {\n try {\n const content = await readFile(\n join(process.cwd(), \"package.json\"),\n \"utf-8\",\n );\n const pkg = JSON.parse(content);\n return {\n name: pkg.name,\n version: pkg.version,\n description: pkg.description,\n author: typeof pkg.author === \"string\" ? pkg.author : pkg.author?.name,\n license: pkg.license,\n };\n } catch {\n return null;\n }\n}\n\n/**\n * Try to detect author from git config\n */\nasync function getGitAuthor(): Promise<string | null> {\n try {\n const { exec } = await import(\"node:child_process\");\n const { promisify } = await import(\"node:util\");\n const execAsync = promisify(exec);\n\n const [nameResult, emailResult] = await Promise.all([\n execAsync(\"git config user.name\").catch(() => ({ stdout: \"\" })),\n execAsync(\"git config user.email\").catch(() => ({ stdout: \"\" })),\n ]);\n\n const name = nameResult.stdout.trim();\n const email = emailResult.stdout.trim();\n\n if (name && email) {\n return `${name} <${email}>`;\n }\n if (name) {\n return name;\n }\n return null;\n } catch {\n return null;\n }\n}\n\nfunction sanitizeName(name: string): string {\n const withoutScope = name.replace(/^@[^/]+\\//, \"\");\n return withoutScope\n .toLowerCase()\n .replace(/[^a-z0-9_-]/g, \"-\")\n .replace(/^-+|-+$/g, \"\")\n .replace(/-+/g, \"-\");\n}\n\nfunction isValidName(name: string): boolean {\n return /^[a-z][a-z0-9_-]*$/.test(name);\n}\n\nfunction isValidVersion(version: string): boolean {\n return /^\\d+\\.\\d+\\.\\d+(-[a-zA-Z0-9.-]+)?(\\+[a-zA-Z0-9.-]+)?$/.test(version);\n}\n\ninterface Defaults {\n name: string;\n version: string;\n description: string;\n author: string;\n license: string;\n main: string;\n capabilities: string;\n}\n\nasync function computeDefaults(\n options: InitOptions,\n existingPkg: Partial<PspmManifest> | null,\n): Promise<Defaults> {\n const gitAuthor = await getGitAuthor();\n return {\n name: sanitizeName(\n options.name || existingPkg?.name || basename(process.cwd()),\n ),\n version: existingPkg?.version || \"0.1.0\",\n description: options.description || existingPkg?.description || \"\",\n author: options.author || existingPkg?.author || gitAuthor || \"\",\n license: existingPkg?.license || \"MIT\",\n main: \"SKILL.md\",\n capabilities: \"\",\n };\n}\n\nfunction makeManifest(\n name: string,\n version: string,\n description: string,\n author: string,\n license: string,\n main: string,\n capabilities: string[],\n): PspmManifest {\n return {\n $schema: PSPM_SCHEMA_URL,\n name,\n version,\n description: description || undefined,\n author: author || undefined,\n license,\n type: \"skill\",\n capabilities,\n main,\n requirements: {\n pspm: \">=0.1.0\",\n },\n files: [...DEFAULT_SKILL_FILES],\n dependencies: {},\n private: false,\n };\n}\n\nasync function promptManifest(defaults: Defaults): Promise<PspmManifest> {\n console.log(\"This utility will walk you through creating a pspm.json file.\");\n console.log(\n \"It only covers the most common items, and tries to guess sensible defaults.\",\n );\n console.log(\"\");\n console.log(\n \"See `pspm init --help` for definitive documentation on these fields\",\n );\n console.log(\"and exactly what they do.\");\n console.log(\"\");\n console.log(\"Press ^C at any time to quit.\");\n\n const rl = createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n try {\n let name = await prompt(rl, \"skill name:\", defaults.name);\n while (!isValidName(name)) {\n console.log(\n \" Name must start with a lowercase letter and contain only lowercase letters, numbers, hyphens, and underscores.\",\n );\n name = await prompt(rl, \"skill name:\", sanitizeName(name));\n }\n\n let version = await prompt(rl, \"version:\", defaults.version);\n while (!isValidVersion(version)) {\n console.log(\" Version must be valid semver (e.g., 1.0.0)\");\n version = await prompt(rl, \"version:\", \"0.1.0\");\n }\n\n const description = await prompt(rl, \"description:\", defaults.description);\n const main = await prompt(rl, \"entry point:\", defaults.main);\n const capabilitiesStr = await prompt(\n rl,\n \"capabilities (comma-separated):\",\n defaults.capabilities,\n );\n const author = await prompt(rl, \"author:\", defaults.author);\n const license = await prompt(rl, \"license:\", defaults.license);\n\n rl.close();\n\n const capabilities = capabilitiesStr\n ? capabilitiesStr\n .split(\",\")\n .map((s) => s.trim())\n .filter(Boolean)\n : [];\n\n return makeManifest(\n name,\n version,\n description,\n author,\n license,\n main,\n capabilities,\n );\n } catch (error) {\n rl.close();\n if (\n error instanceof Error &&\n error.message.includes(\"readline was closed\")\n ) {\n console.log(\"\\nAborted.\");\n process.exit(0);\n }\n throw error;\n }\n}\n\nasync function confirmWrite(): Promise<boolean> {\n const rl = createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n const confirm = await prompt(rl, \"Is this OK?\", \"yes\");\n rl.close();\n return confirm.toLowerCase() === \"yes\" || confirm.toLowerCase() === \"y\";\n}\n\n/**\n * Initialize a new pspm.json manifest in the current directory\n */\nexport async function init(options: InitOptions): Promise<void> {\n try {\n const pspmJsonPath = join(process.cwd(), \"pspm.json\");\n\n let exists = false;\n try {\n await stat(pspmJsonPath);\n exists = true;\n } catch {\n // File doesn't exist, good\n }\n\n if (exists && !options.force) {\n console.error(\"Error: pspm.json already exists in this directory.\");\n console.error(\"Use --force to overwrite.\");\n process.exit(1);\n }\n\n const existingPkg = await readExistingPackageJson();\n const defaults = await computeDefaults(options, existingPkg);\n\n const manifest: PspmManifest = options.yes\n ? makeManifest(\n defaults.name,\n defaults.version,\n defaults.description,\n defaults.author,\n defaults.license,\n defaults.main,\n [],\n )\n : await promptManifest(defaults);\n\n if (!manifest.description) manifest.description = undefined;\n if (!manifest.author) manifest.author = undefined;\n if (manifest.capabilities?.length === 0) manifest.capabilities = undefined;\n\n const content = JSON.stringify(manifest, null, 2);\n\n console.log(\"\");\n console.log(`About to write to ${pspmJsonPath}:`);\n console.log(\"\");\n console.log(content);\n console.log(\"\");\n\n if (!options.yes && !(await confirmWrite())) {\n console.log(\"Aborted.\");\n process.exit(0);\n }\n\n await writeFile(pspmJsonPath, `${content}\\n`);\n\n try {\n await stat(join(process.cwd(), \"SKILL.md\"));\n } catch {\n console.log(\n \"Note: Create a SKILL.md file with your skill's prompt content.\",\n );\n }\n\n if (existingPkg) {\n console.log(\"Note: Values were derived from existing package.json.\");\n console.log(\" pspm.json is for publishing to PSPM registry.\");\n console.log(\" package.json can still be used for npm dependencies.\");\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n console.error(`Error: ${message}`);\n process.exit(1);\n }\n}\n","/**\n * Link command - Recreate agent symlinks without reinstalling.\n *\n * Useful after:\n * - Adding new agents to pspm.json\n * - Changing agent configuration\n * - Recovering from accidentally deleted symlinks\n */\n\nimport { parseAgentArg, promptForAgents } from \"@/agents\";\nimport {\n getGitHubSkillName,\n parseGitHubSpecifier,\n parseRegistrySpecifier,\n} from \"@/lib/index\";\nimport { listLockfileGitHubPackages, listLockfileSkills } from \"@/lockfile\";\nimport { readManifest } from \"@/manifest\";\nimport {\n createAgentSymlinks,\n getGitHubSkillPath,\n getRegistrySkillPath,\n type SkillInfo,\n} from \"@/symlinks\";\n\nexport interface LinkOptions {\n agent?: string;\n yes?: boolean;\n /** Recreate global agent symlinks */\n global?: boolean;\n}\n\nexport async function link(options: LinkOptions): Promise<void> {\n try {\n // Set up global mode if requested\n if (options.global) {\n const { setGlobalMode } = await import(\"@/config\");\n setGlobalMode(true);\n }\n\n // Read manifest for agent config overrides\n const manifest = await readManifest();\n const agentConfigs = manifest?.agents;\n\n // Determine which agents to use\n let agents: string[];\n if (options.agent) {\n // If --agent flag is provided, use it\n agents = parseAgentArg(options.agent);\n } else if (manifest) {\n // If pspm.json exists, use default agent (respect manifest's agent config)\n agents = parseAgentArg(undefined);\n } else if (options.yes) {\n // If -y flag is used, use default agent without prompting\n agents = parseAgentArg(undefined);\n } else {\n // No pspm.json exists, prompt user to select agents\n console.log(\"No pspm.json found. Let's set up your project.\\n\");\n agents = await promptForAgents();\n }\n\n // Skip if \"none\" agent\n if (agents.length === 1 && agents[0] === \"none\") {\n console.log(\"Skipping symlink creation (--agent none)\");\n return;\n }\n\n // Collect all installed skills\n const skills: SkillInfo[] = [];\n\n // Get registry skills from lockfile\n const registrySkills = await listLockfileSkills();\n for (const { name } of registrySkills) {\n const parsed = parseRegistrySpecifier(name);\n if (!parsed) {\n console.warn(`Warning: Invalid skill name in lockfile: ${name}`);\n continue;\n }\n\n const effectiveName = parsed.subname ?? parsed.name;\n const pathName =\n parsed.namespace === \"github\" && parsed.subname\n ? `${parsed.name}/${parsed.subname}`\n : parsed.name;\n skills.push({\n name: effectiveName,\n sourcePath: getRegistrySkillPath(\n parsed.namespace,\n parsed.owner,\n pathName,\n ),\n });\n }\n\n // Get GitHub skills from lockfile\n const githubSkills = await listLockfileGitHubPackages();\n for (const { specifier } of githubSkills) {\n const parsed = parseGitHubSpecifier(specifier);\n if (!parsed) {\n console.warn(\n `Warning: Invalid GitHub specifier in lockfile: ${specifier}`,\n );\n continue;\n }\n\n const skillName = getGitHubSkillName(parsed);\n skills.push({\n name: skillName,\n sourcePath: getGitHubSkillPath(parsed.owner, parsed.repo, parsed.path),\n });\n }\n\n if (skills.length === 0) {\n console.log(\"No skills found in lockfile. Nothing to link.\");\n return;\n }\n\n console.log(\n `Creating symlinks for ${skills.length} skill(s) to agent(s): ${agents.join(\", \")}...`,\n );\n\n const globalMode = options.global ?? false;\n await createAgentSymlinks(skills, {\n agents,\n projectRoot: globalMode\n ? (await import(\"node:os\")).homedir()\n : process.cwd(),\n agentConfigs,\n global: globalMode,\n });\n\n console.log(\"Symlinks created successfully.\");\n\n // List created symlinks\n console.log(\"\\nLinked skills:\");\n for (const skill of skills) {\n console.log(` ${skill.name} -> ${skill.sourcePath}`);\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n console.error(`Error: ${message}`);\n process.exit(1);\n }\n}\n","/**\n * List command - Show installed skills.\n *\n * Displays:\n * - Registry and GitHub skills\n * - Source type\n * - Version / commit info\n * - Linked agent paths\n */\n\nimport { access } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { getAvailableAgents, resolveAgentConfig } from \"@/agents\";\nimport {\n type AgentConfig,\n type GitHubLockfileEntry,\n getGitHubSkillName,\n parseGitHubSpecifier,\n parseRegistrySpecifier,\n type WellKnownLockfileEntry,\n} from \"@/lib/index\";\nimport {\n listLockfileGitHubPackages,\n listLockfileSkills,\n listLockfileWellKnownPackages,\n} from \"@/lockfile\";\nimport { readManifest } from \"@/manifest\";\nimport {\n getGitHubSkillPath,\n getLinkedAgents,\n getRegistrySkillPath,\n getWellKnownSkillPath,\n} from \"@/symlinks\";\n\nexport interface ListOptions {\n json?: boolean;\n /** List globally installed skills */\n global?: boolean;\n}\n\ninterface SkillListItem {\n name: string;\n fullName: string;\n version: string;\n source: \"registry\" | \"github\" | \"well-known\";\n sourcePath: string;\n status: \"installed\" | \"missing\";\n linkedAgents: string[];\n gitRef?: string;\n gitCommit?: string;\n hostname?: string;\n}\n\nasync function checkStatus(\n absolutePath: string,\n): Promise<\"installed\" | \"missing\"> {\n try {\n await access(absolutePath);\n return \"installed\";\n } catch {\n return \"missing\";\n }\n}\n\ninterface BuildContext {\n availableAgents: string[];\n agentConfigs: Record<string, AgentConfig> | undefined;\n projectRoot: string;\n}\n\nasync function buildRegistrySkills(\n registrySkills: Awaited<ReturnType<typeof listLockfileSkills>>,\n ctx: BuildContext,\n): Promise<SkillListItem[]> {\n const items: SkillListItem[] = [];\n for (const { name: fullName, entry } of registrySkills) {\n const parsed = parseRegistrySpecifier(fullName);\n if (!parsed) continue;\n\n const skillName = parsed.subname ?? parsed.name;\n const pathName =\n parsed.namespace === \"github\" && parsed.subname\n ? `${parsed.name}/${parsed.subname}`\n : parsed.name;\n const sourcePath = getRegistrySkillPath(\n parsed.namespace,\n parsed.owner,\n pathName,\n );\n const status = await checkStatus(join(ctx.projectRoot, sourcePath));\n const linkedAgents = await getLinkedAgents(\n skillName,\n ctx.availableAgents,\n ctx.projectRoot,\n ctx.agentConfigs,\n );\n\n items.push({\n name: skillName,\n fullName,\n version: entry.version,\n source: \"registry\",\n sourcePath,\n status,\n linkedAgents,\n });\n }\n return items;\n}\n\nasync function buildGithubSkills(\n githubSkills: Awaited<ReturnType<typeof listLockfileGitHubPackages>>,\n ctx: BuildContext,\n): Promise<SkillListItem[]> {\n const items: SkillListItem[] = [];\n for (const { specifier, entry } of githubSkills) {\n const parsed = parseGitHubSpecifier(specifier);\n if (!parsed) continue;\n\n const ghEntry = entry as GitHubLockfileEntry;\n const skillName = getGitHubSkillName(parsed);\n const sourcePath = getGitHubSkillPath(\n parsed.owner,\n parsed.repo,\n parsed.path,\n );\n const status = await checkStatus(join(ctx.projectRoot, sourcePath));\n const linkedAgents = await getLinkedAgents(\n skillName,\n ctx.availableAgents,\n ctx.projectRoot,\n ctx.agentConfigs,\n );\n\n items.push({\n name: skillName,\n fullName: specifier,\n version: ghEntry.gitCommit.slice(0, 7),\n source: \"github\",\n sourcePath,\n status,\n linkedAgents,\n gitRef: ghEntry.gitRef,\n gitCommit: ghEntry.gitCommit,\n });\n }\n return items;\n}\n\nasync function buildWellKnownSkills(\n wellKnownSkills: Awaited<ReturnType<typeof listLockfileWellKnownPackages>>,\n ctx: BuildContext,\n): Promise<SkillListItem[]> {\n const items: SkillListItem[] = [];\n for (const { specifier, entry } of wellKnownSkills) {\n const wkEntry = entry as WellKnownLockfileEntry;\n const skillName = wkEntry.name;\n const sourcePath = getWellKnownSkillPath(wkEntry.hostname, skillName);\n const status = await checkStatus(join(ctx.projectRoot, sourcePath));\n const linkedAgents = await getLinkedAgents(\n skillName,\n ctx.availableAgents,\n ctx.projectRoot,\n ctx.agentConfigs,\n );\n\n items.push({\n name: skillName,\n fullName: specifier,\n version: \"well-known\",\n source: \"well-known\",\n sourcePath,\n status,\n linkedAgents,\n hostname: wkEntry.hostname,\n });\n }\n return items;\n}\n\nfunction printSkills(\n skills: SkillListItem[],\n agentConfigs: Record<string, AgentConfig> | undefined,\n): void {\n console.log(\"Installed skills:\\n\");\n\n for (const skill of skills) {\n if (skill.source === \"registry\") {\n console.log(` ${skill.fullName}@${skill.version} (registry)`);\n } else if (skill.source === \"well-known\") {\n console.log(` ${skill.name} (well-known: ${skill.hostname})`);\n } else {\n const refInfo = skill.gitRef\n ? `${skill.gitRef}@${skill.gitCommit?.slice(0, 7)}`\n : skill.version;\n console.log(` ${skill.fullName} (${refInfo})`);\n }\n\n if (skill.status === \"missing\") {\n console.log(` Status: MISSING (run 'pspm install' to restore)`);\n }\n\n if (skill.linkedAgents.length > 0) {\n for (const agent of skill.linkedAgents) {\n const config = resolveAgentConfig(agent, agentConfigs);\n if (config) {\n console.log(` -> ${config.skillsDir}/${skill.name}`);\n }\n }\n }\n }\n\n const registryCount = skills.filter((s) => s.source === \"registry\").length;\n const githubCount = skills.filter((s) => s.source === \"github\").length;\n const wellKnownCount = skills.filter((s) => s.source === \"well-known\").length;\n const parts: string[] = [];\n if (registryCount > 0) parts.push(`${registryCount} registry`);\n if (githubCount > 0) parts.push(`${githubCount} github`);\n if (wellKnownCount > 0) parts.push(`${wellKnownCount} well-known`);\n\n console.log(`\\nTotal: ${skills.length} skill(s) (${parts.join(\", \")})`);\n}\n\nexport async function list(options: ListOptions): Promise<void> {\n try {\n if (options.global) {\n const { setGlobalMode } = await import(\"@/config\");\n setGlobalMode(true);\n }\n\n const registrySkills = await listLockfileSkills();\n const githubSkills = await listLockfileGitHubPackages();\n const wellKnownSkills = await listLockfileWellKnownPackages();\n\n const manifest = await readManifest();\n const agentConfigs = manifest?.agents;\n const ctx: BuildContext = {\n availableAgents: getAvailableAgents(agentConfigs),\n agentConfigs,\n projectRoot: process.cwd(),\n };\n\n const skills: SkillListItem[] = [\n ...(await buildRegistrySkills(registrySkills, ctx)),\n ...(await buildGithubSkills(githubSkills, ctx)),\n ...(await buildWellKnownSkills(wellKnownSkills, ctx)),\n ];\n\n if (skills.length === 0) {\n console.log(\"No skills installed.\");\n return;\n }\n\n if (options.json) {\n console.log(JSON.stringify(skills, null, 2));\n return;\n }\n\n printSkills(skills, agentConfigs);\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n console.error(`Error: ${message}`);\n process.exit(1);\n }\n}\n","import { randomBytes } from \"node:crypto\";\nimport http from \"node:http\";\nimport { URL } from \"node:url\";\nimport open from \"open\";\nimport { whoamiRequest } from \"@/api-client\";\nimport { getRegistryUrl, setCredentials } from \"@/config\";\n\nexport interface LoginOptions {\n apiKey?: string;\n}\n\nconst DEFAULT_WEB_APP_URL = \"https://pspm.dev\";\n\n/**\n * Get the web app URL.\n * Priority:\n * 1. PSPM_WEB_URL environment variable (for local dev where web and server run on different ports)\n * 2. Derived from registry URL (for production where they share the same origin)\n *\n * Local dev example:\n * PSPM_WEB_URL=http://localhost:5500 pspm login\n *\n * The registry URL can be:\n * - https://registry.pspm.dev (registry subdomain) -> web app is https://pspm.dev\n * - https://pspm.dev (main domain) -> web app is https://pspm.dev\n */\nfunction getWebAppUrl(registryUrl: string): string {\n // Environment variable takes priority (for local dev)\n if (process.env.PSPM_WEB_URL) {\n return process.env.PSPM_WEB_URL.replace(/\\/$/, \"\"); // Remove trailing slash\n }\n\n try {\n const url = new URL(registryUrl);\n let host = url.host;\n\n // Strip \"registry.\" subdomain prefix if present\n // e.g., registry.pspm.dev -> pspm.dev\n if (host.startsWith(\"registry.\")) {\n host = host.slice(\"registry.\".length);\n }\n\n return `${url.protocol}//${host}`;\n } catch {\n return DEFAULT_WEB_APP_URL;\n }\n}\n\n/**\n * Get the server/API base URL from the registry URL\n * Used for auth-related API calls (token exchange, etc.)\n *\n * The registry URL can be:\n * - https://registry.pspm.dev -> server is https://pspm.dev\n * - https://pspm.dev -> server is https://pspm.dev\n */\nfunction getServerUrl(registryUrl: string): string {\n try {\n const url = new URL(registryUrl);\n let host = url.host;\n\n // Strip \"registry.\" subdomain prefix if present\n if (host.startsWith(\"registry.\")) {\n host = host.slice(\"registry.\".length);\n }\n\n return `${url.protocol}//${host}`;\n } catch {\n return DEFAULT_WEB_APP_URL;\n }\n}\n\n/**\n * Exchange a CLI token for an API key using fetch\n */\nasync function exchangeCliToken(\n registryUrl: string,\n token: string,\n): Promise<{ apiKey: string; username: string }> {\n const serverUrl = getServerUrl(registryUrl);\n // Use direct REST endpoint (not oRPC) for CLI compatibility\n const rpcUrl = `${serverUrl}/api/api-keys/cli-token-exchange`;\n\n const response = await fetch(rpcUrl, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ token }),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`Failed to exchange token: ${errorText}`);\n }\n\n return response.json() as Promise<{ apiKey: string; username: string }>;\n}\n\n/**\n * Start a local HTTP server to receive the OAuth callback\n */\nfunction startCallbackServer(expectedState: string): Promise<{\n port: number;\n tokenPromise: Promise<string>;\n cleanup: () => void;\n}> {\n return new Promise((resolveServer, rejectServer) => {\n let resolveToken: (token: string) => void;\n let rejectToken: (error: Error) => void;\n let timeoutId: NodeJS.Timeout;\n\n const tokenPromise = new Promise<string>((resolve, reject) => {\n resolveToken = resolve;\n rejectToken = reject;\n });\n\n const server = http.createServer((req, res) => {\n const url = new URL(req.url || \"/\", \"http://localhost\");\n\n if (url.pathname === \"/callback\") {\n const token = url.searchParams.get(\"token\");\n const state = url.searchParams.get(\"state\");\n\n if (state !== expectedState) {\n res.writeHead(400, { \"Content-Type\": \"text/html\" });\n res.end(`\n\t\t\t\t\t\t<html>\n\t\t\t\t\t\t\t<body style=\"font-family: system-ui; text-align: center; padding: 40px;\">\n\t\t\t\t\t\t\t\t<h1 style=\"color: #dc2626;\">Security Error</h1>\n\t\t\t\t\t\t\t\t<p>State mismatch - this may be a security issue.</p>\n\t\t\t\t\t\t\t\t<p>Please try running <code>pspm login</code> again.</p>\n\t\t\t\t\t\t\t</body>\n\t\t\t\t\t\t</html>\n\t\t\t\t\t`);\n rejectToken(new Error(\"State mismatch - possible CSRF attack\"));\n return;\n }\n\n if (!token) {\n res.writeHead(400, { \"Content-Type\": \"text/html\" });\n res.end(`\n\t\t\t\t\t\t<html>\n\t\t\t\t\t\t\t<body style=\"font-family: system-ui; text-align: center; padding: 40px;\">\n\t\t\t\t\t\t\t\t<h1 style=\"color: #dc2626;\">Error</h1>\n\t\t\t\t\t\t\t\t<p>No token received from the server.</p>\n\t\t\t\t\t\t\t\t<p>Please try running <code>pspm login</code> again.</p>\n\t\t\t\t\t\t\t</body>\n\t\t\t\t\t\t</html>\n\t\t\t\t\t`);\n rejectToken(new Error(\"No token received\"));\n return;\n }\n\n res.writeHead(200, { \"Content-Type\": \"text/html\" });\n res.end(`\n\t\t\t\t\t<html>\n\t\t\t\t\t\t<head>\n\t\t\t\t\t\t\t<script>\n\t\t\t\t\t\t\t\t// Try to close the window after a short delay\n\t\t\t\t\t\t\t\tsetTimeout(function() {\n\t\t\t\t\t\t\t\t\twindow.close();\n\t\t\t\t\t\t\t\t}, 1500);\n\t\t\t\t\t\t\t</script>\n\t\t\t\t\t\t</head>\n\t\t\t\t\t\t<body style=\"font-family: system-ui; text-align: center; padding: 40px;\">\n\t\t\t\t\t\t\t<h1 style=\"color: #16a34a;\">Success!</h1>\n\t\t\t\t\t\t\t<p>You are now logged in to PSPM.</p>\n\t\t\t\t\t\t\t<p style=\"color: #666; font-size: 14px;\">This window will close automatically, or you can close it manually.</p>\n\t\t\t\t\t\t</body>\n\t\t\t\t\t</html>\n\t\t\t\t`);\n\n resolveToken(token);\n } else {\n res.writeHead(404, { \"Content-Type\": \"text/plain\" });\n res.end(\"Not found\");\n }\n });\n\n // Cleanup function to close server and clear timeout\n const cleanup = () => {\n clearTimeout(timeoutId);\n server.close();\n };\n\n // Use port 0 to let the OS assign an available port\n server.listen(0, \"127.0.0.1\", () => {\n const address = server.address();\n if (typeof address === \"object\" && address !== null) {\n resolveServer({ port: address.port, tokenPromise, cleanup });\n } else {\n rejectServer(new Error(\"Failed to get server address\"));\n }\n });\n\n server.on(\"error\", (err) => {\n rejectServer(err);\n });\n\n // Timeout after 5 minutes\n timeoutId = setTimeout(\n () => {\n rejectToken(new Error(\"Login timed out - please try again\"));\n server.close();\n },\n 5 * 60 * 1000,\n );\n });\n}\n\n/**\n * Login using browser-based OAuth flow\n */\nasync function browserLogin(): Promise<void> {\n const registryUrl = await getRegistryUrl();\n const webAppUrl = getWebAppUrl(registryUrl);\n\n // Generate state for CSRF protection\n const state = randomBytes(32).toString(\"base64url\");\n\n console.log(\"Starting browser-based login...\");\n\n // Start local callback server\n const { port, tokenPromise, cleanup } = await startCallbackServer(state);\n\n // Build the login URL\n const loginUrl = `${webAppUrl}/cli/login?port=${port}&state=${encodeURIComponent(state)}`;\n\n console.log(\"Opening browser to authenticate...\");\n console.log(`If the browser doesn't open, visit: ${loginUrl}`);\n\n // Open the browser\n try {\n await open(loginUrl);\n } catch {\n console.log(\"Could not open browser automatically.\");\n console.log(`Please visit: ${loginUrl}`);\n }\n\n console.log(\"Waiting for authentication...\");\n\n // Wait for the callback with the token\n const token = await tokenPromise;\n\n // Clean up server and timeout immediately after receiving token\n cleanup();\n\n console.log(\"Received token, exchanging for API key...\");\n\n // Exchange the token for an API key\n const { apiKey, username } = await exchangeCliToken(registryUrl, token);\n\n // Store credentials\n await setCredentials(apiKey, username, registryUrl);\n\n console.log(`Logged in as ${username}`);\n console.log(`Registry: ${registryUrl}`);\n}\n\n/**\n * Login using direct API key (fallback method)\n */\nasync function directLogin(apiKey: string): Promise<void> {\n console.log(\"Verifying API key...\");\n\n const registryUrl = await getRegistryUrl();\n\n const user = await whoamiRequest(registryUrl, apiKey);\n if (!user) {\n console.error(\"Error: Invalid API key or not authenticated\");\n process.exit(1);\n }\n\n // Store credentials\n await setCredentials(apiKey, user.username, registryUrl);\n console.log(`Logged in as ${user.username}`);\n console.log(`Registry: ${registryUrl}`);\n}\n\nexport async function login(options: LoginOptions): Promise<void> {\n try {\n if (options.apiKey) {\n // Direct login with API key\n await directLogin(options.apiKey);\n } else {\n // Browser-based OAuth flow\n await browserLogin();\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n console.error(`Error: ${message}`);\n process.exit(1);\n }\n}\n","import { clearCredentials, isLoggedIn } from \"@/config\";\n\nexport async function logout(): Promise<void> {\n try {\n const loggedIn = await isLoggedIn();\n\n if (!loggedIn) {\n console.log(\"Not logged in.\");\n return;\n }\n\n await clearCredentials();\n console.log(\"Logged out successfully.\");\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n console.error(`Error: ${message}`);\n process.exit(1);\n }\n}\n","import { mkdir, readdir, rename, rm, stat } from \"node:fs/promises\";\nimport {\n getLegacyLockfilePath,\n getLegacySkillsDir,\n getLockfilePath,\n getPspmDir,\n getSkillsDir,\n} from \"@/config\";\nimport { migrateLockfileIfNeeded } from \"@/lockfile\";\n\nexport interface MigrateOptions {\n dryRun?: boolean;\n}\n\n/**\n * Migrate from old directory structure to new:\n * - .skills/ → .pspm/skills/\n * - skill-lock.json → pspm-lock.json\n */\nexport async function migrate(options: MigrateOptions): Promise<void> {\n try {\n const legacySkillsDir = getLegacySkillsDir();\n const newSkillsDir = getSkillsDir();\n const legacyLockfilePath = getLegacyLockfilePath();\n const newLockfilePath = getLockfilePath();\n const pspmDir = getPspmDir();\n\n let migrationNeeded = false;\n const actions: string[] = [];\n\n // Check for legacy .skills directory\n try {\n const legacyStats = await stat(legacySkillsDir);\n if (legacyStats.isDirectory()) {\n // Check if it has any content\n const contents = await readdir(legacySkillsDir);\n if (contents.length > 0) {\n migrationNeeded = true;\n actions.push(\"Move .skills/ → .pspm/skills/\");\n }\n }\n } catch {\n // Legacy directory doesn't exist\n }\n\n // Check for legacy lockfile\n try {\n await stat(legacyLockfilePath);\n // Check if new lockfile already exists\n try {\n await stat(newLockfilePath);\n // Both exist - suggest manual resolution\n actions.push(\n \"Note: Both skill-lock.json and pspm-lock.json exist. Manual merge may be needed.\",\n );\n } catch {\n migrationNeeded = true;\n actions.push(\"Migrate skill-lock.json → pspm-lock.json\");\n }\n } catch {\n // Legacy lockfile doesn't exist\n }\n\n if (!migrationNeeded && actions.length === 0) {\n console.log(\n \"No migration needed. Project is already using the new structure.\",\n );\n return;\n }\n\n if (options.dryRun) {\n console.log(\"Migration plan (dry run):\");\n console.log(\"\");\n for (const action of actions) {\n console.log(` - ${action}`);\n }\n console.log(\"\");\n console.log(\"Run without --dry-run to perform migration.\");\n return;\n }\n\n console.log(\"Migrating project structure...\\n\");\n\n // Migrate lockfile first\n const lockfileMigrated = await migrateLockfileIfNeeded();\n if (lockfileMigrated) {\n console.log(\" ✓ Migrated skill-lock.json → pspm-lock.json\");\n }\n\n // Migrate .skills directory\n try {\n const legacyStats = await stat(legacySkillsDir);\n if (legacyStats.isDirectory()) {\n const contents = await readdir(legacySkillsDir);\n if (contents.length > 0) {\n // Create .pspm directory\n await mkdir(pspmDir, { recursive: true });\n\n // Check if new skills dir exists and has content\n try {\n const newStats = await stat(newSkillsDir);\n if (newStats.isDirectory()) {\n const newContents = await readdir(newSkillsDir);\n if (newContents.length > 0) {\n console.log(\n \" ! Both .skills/ and .pspm/skills/ have content. Manual merge required.\",\n );\n } else {\n // New dir exists but empty, remove it first\n await rm(newSkillsDir, { recursive: true, force: true });\n await rename(legacySkillsDir, newSkillsDir);\n console.log(\" ✓ Moved .skills/ → .pspm/skills/\");\n }\n }\n } catch {\n // New skills dir doesn't exist, safe to move\n await rename(legacySkillsDir, newSkillsDir);\n console.log(\" ✓ Moved .skills/ → .pspm/skills/\");\n }\n }\n }\n } catch {\n // Legacy directory doesn't exist\n }\n\n console.log(\"\");\n console.log(\"Migration complete!\");\n console.log(\"\");\n console.log(\n \"You can safely delete these legacy files if they still exist:\",\n );\n console.log(\" - skill-lock.json (replaced by pspm-lock.json)\");\n console.log(\" - .skills/ (replaced by .pspm/skills/)\");\n console.log(\"\");\n console.log(\"Update your .gitignore to include:\");\n console.log(\" .pspm/cache/\");\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n console.error(`Error: ${message}`);\n process.exit(1);\n }\n}\n","import { readFileSync, writeFileSync } from \"node:fs\";\nimport { basename, resolve } from \"node:path\";\nimport { requireApiKey, resolveConfig } from \"../config\";\n\nasync function fetchApi(\n path: string,\n options: RequestInit = {},\n): Promise<Response> {\n const config = await resolveConfig();\n const apiKey = await requireApiKey();\n const baseUrl = config.registryUrl.replace(/\\/api\\/skills\\/?$/, \"\");\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n ...(options.headers as Record<string, string>),\n };\n if (apiKey) {\n headers.Authorization = `Bearer ${apiKey}`;\n }\n return fetch(`${baseUrl}${path}`, { ...options, headers });\n}\n\nexport interface NotebookUploadOptions {\n org?: string;\n visibility?: string;\n description?: string;\n}\n\nexport async function notebookUpload(\n filePath: string,\n options: NotebookUploadOptions,\n) {\n const absPath = resolve(filePath);\n const content = readFileSync(absPath, \"utf-8\");\n const name = basename(filePath).replace(/\\.anyt\\.md$|\\.anyt$|\\.md$/, \"\");\n\n const body = {\n name,\n content,\n description: options.description,\n visibility: options.visibility || \"private\",\n };\n\n const path = options.org\n ? `/api/notebooks/org/${options.org}`\n : \"/api/notebooks\";\n\n const response = await fetchApi(path, {\n method: \"POST\",\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n const err = await response.json().catch(() => ({}));\n throw new Error(\n (err as { message?: string }).message ||\n `Upload failed (${response.status})`,\n );\n }\n\n const notebook = (await response.json()) as {\n id: string;\n name: string;\n slug: string;\n };\n console.log(\n `Uploaded: ${notebook.name} (${notebook.id})${options.org ? ` to org ${options.org}` : \"\"}`,\n );\n}\n\nexport interface NotebookListOptions {\n org?: string;\n}\n\nexport async function notebookList(options: NotebookListOptions) {\n const path = options.org\n ? `/api/notebooks/org/${options.org}`\n : \"/api/notebooks/-/mine\";\n\n const response = await fetchApi(path);\n if (!response.ok) {\n throw new Error(`Failed to list notebooks (${response.status})`);\n }\n\n const notebooks = (await response.json()) as Array<{\n id: string;\n name: string;\n cellCount: number;\n visibility: string;\n updatedAt: string;\n }>;\n\n if (notebooks.length === 0) {\n console.log(\"No notebooks found\");\n return;\n }\n\n console.log(\n `\\n${\"Name\".padEnd(30)} ${\"Cells\".padEnd(8)} ${\"Visibility\".padEnd(12)} ${\"Updated\".padEnd(12)} ID`,\n );\n console.log(\"-\".repeat(90));\n for (const nb of notebooks) {\n const updated = new Date(nb.updatedAt).toLocaleDateString();\n console.log(\n `${nb.name.slice(0, 28).padEnd(30)} ${String(nb.cellCount).padEnd(8)} ${nb.visibility.padEnd(12)} ${updated.padEnd(12)} ${nb.id}`,\n );\n }\n console.log(`\\n${notebooks.length} notebook(s)`);\n}\n\nexport async function notebookDownload(id: string, output?: string) {\n const response = await fetchApi(`/api/notebooks/${id}`);\n if (!response.ok) {\n throw new Error(`Notebook not found (${response.status})`);\n }\n\n const notebook = (await response.json()) as {\n name: string;\n slug: string;\n content: string;\n };\n const outPath = output || `${notebook.slug}.anyt.md`;\n writeFileSync(outPath, notebook.content, \"utf-8\");\n console.log(`Downloaded: ${notebook.name} -> ${outPath}`);\n}\n\nexport async function notebookDelete(id: string) {\n const response = await fetchApi(`/api/notebooks/${id}`, {\n method: \"DELETE\",\n });\n if (!response.ok) {\n throw new Error(`Failed to delete notebook (${response.status})`);\n }\n console.log(`Notebook ${id} deleted`);\n}\n","import * as semver from \"semver\";\nimport type { SkillVersion } from \"../shared/types\";\n\n/**\n * Resolve the best matching version from a list of available versions\n */\nexport function resolveVersion(\n range: string,\n availableVersions: string[],\n): string | null {\n // Sort versions in descending order\n const sorted = availableVersions\n .filter((v) => semver.valid(v))\n .sort((a, b) => semver.rcompare(a, b));\n\n // If no range or \"latest\" specified, return the highest version\n if (!range || range === \"latest\") {\n return sorted[0] ?? null;\n }\n\n // Find the highest version that satisfies the range\n return semver.maxSatisfying(sorted, range);\n}\n\n/**\n * Check if a version satisfies a given range\n */\nexport function versionSatisfies(version: string, range: string): boolean {\n return semver.satisfies(version, range);\n}\n\n/**\n * Parse version range from a specifier string\n * Examples:\n * \"^1.0.0\" -> \"^1.0.0\"\n * \"~2.1.0\" -> \"~2.1.0\"\n * \">=1.0.0 <2.0.0\" -> \">=1.0.0 <2.0.0\"\n * \"1.2.3\" -> \"1.2.3\"\n * \"\" or undefined -> \"*\" (any version)\n */\nexport function normalizeVersionRange(range?: string): string {\n if (!range || range === \"latest\") {\n return \"*\";\n }\n return range;\n}\n\n/**\n * Select the best version from a list based on a range\n */\nexport function selectVersion(\n versions: SkillVersion[],\n range?: string,\n): SkillVersion | null {\n const normalizedRange = normalizeVersionRange(range);\n const versionStrings = versions.map((v) => v.version);\n const resolved = resolveVersion(normalizedRange, versionStrings);\n\n if (!resolved) {\n return null;\n }\n\n return versions.find((v) => v.version === resolved) ?? null;\n}\n\n/**\n * Compare two versions\n * Returns: -1 if a < b, 0 if a === b, 1 if a > b\n */\nexport function compareVersions(a: string, b: string): number {\n return semver.compare(a, b);\n}\n\n/**\n * Check if version a is greater than version b\n */\nexport function isNewerVersion(a: string, b: string): boolean {\n return semver.gt(a, b);\n}\n\n/**\n * Get the latest version from a list\n */\nexport function getLatestVersion(versions: string[]): string | null {\n const valid = versions.filter((v) => semver.valid(v));\n if (valid.length === 0) return null;\n return valid.sort((a, b) => semver.rcompare(a, b))[0];\n}\n","import type {\n GitHubLockfileEntry,\n LocalLockfileEntry,\n PspmLockfile,\n PspmLockfileEntry,\n PspmManifest,\n} from \"@anytio/skill-types\";\nimport { compareVersions, getLatestVersion, resolveVersion } from \"./resolver\";\n\n/**\n * Package type for outdated checking\n */\nexport type OutdatedPackageType = \"registry\" | \"github\" | \"local\";\n\n/**\n * Result of checking a single package for updates\n */\nexport interface OutdatedResult {\n /** Full specifier (e.g., \"@user/alice/my-skill\", \"github:org/repo/path\") */\n name: string;\n /** Currently installed version */\n current: string;\n /** Latest version satisfying the version range from manifest */\n wanted: string | null;\n /** Absolute latest version available */\n latest: string | null;\n /** Package type */\n type: OutdatedPackageType;\n /** Whether the package is outdated (current < wanted or current < latest) */\n isOutdated: boolean;\n /** Whether wanted version is outdated compared to latest */\n wantedBehindLatest: boolean;\n /** Version range from manifest (if available) */\n versionRange?: string;\n /** Deprecation message if current version is deprecated */\n deprecated?: string;\n}\n\n/**\n * Configuration for the outdated checker\n */\nexport interface OutdatedConfig {\n /** Base registry URL */\n registryUrl: string;\n /** Optional API key for authentication */\n apiKey?: string;\n /** Optional GitHub token for checking GitHub packages */\n githubToken?: string;\n}\n\n/**\n * Options for checking outdated packages\n */\nexport interface CheckOutdatedOptions {\n /** The lockfile to check */\n lockfile: PspmLockfile;\n /** Optional manifest with version ranges */\n manifest?: PspmManifest;\n /** Whether to include up-to-date packages in results */\n includeUpToDate?: boolean;\n /** Whether to include local packages in results */\n includeLocal?: boolean;\n /** Specific packages to check (if not provided, checks all) */\n packages?: string[];\n}\n\n/**\n * API response for skill versions endpoint\n */\ninterface SkillVersionResponse {\n id: string;\n skillId: string;\n version: string;\n r2Key: string;\n checksum: string;\n manifest: Record<string, unknown>;\n publishedAt: string;\n deprecatedAt?: string | null;\n deprecationMessage?: string | null;\n}\n\nasync function fetchWithAuth(url: string, token?: string): Promise<Response> {\n const headers: Record<string, string> = {};\n if (token) {\n headers.Authorization = `Bearer ${token}`;\n }\n\n const response = await fetch(url, { headers });\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(`Request failed (${response.status}): ${text}`);\n }\n\n return response;\n}\n\nfunction checkLocalPackage(\n specifier: string,\n _entry: LocalLockfileEntry,\n): OutdatedResult {\n return {\n name: specifier,\n current: \"local\",\n wanted: null,\n latest: null,\n type: \"local\",\n isOutdated: false,\n wantedBehindLatest: false,\n };\n}\n\nfunction computeRegistryOutdatedResult(\n specifier: string,\n entry: PspmLockfileEntry,\n versions: SkillVersionResponse[],\n versionRange: string | undefined,\n): OutdatedResult {\n const versionStrings = versions.map((v) => v.version);\n const range = versionRange || \"*\";\n const wanted = resolveVersion(range, versionStrings);\n const latest = getLatestVersion(versionStrings);\n\n const currentVersionInfo = versions.find((v) => v.version === entry.version);\n const deprecated = currentVersionInfo?.deprecationMessage ?? undefined;\n\n const isOutdated =\n (wanted !== null && compareVersions(entry.version, wanted) < 0) ||\n (latest !== null && compareVersions(entry.version, latest) < 0);\n\n const wantedBehindLatest =\n wanted !== null && latest !== null && compareVersions(wanted, latest) < 0;\n\n return {\n name: specifier,\n current: entry.version,\n wanted,\n latest,\n type: \"registry\",\n isOutdated,\n wantedBehindLatest,\n versionRange: range,\n deprecated,\n };\n}\n\nasync function checkOutdatedFromLockfile(\n options: CheckOutdatedOptions,\n checkRegistryPackage: (\n specifier: string,\n entry: PspmLockfileEntry,\n versionRange?: string,\n ) => Promise<OutdatedResult>,\n checkGitHubPackage: (\n specifier: string,\n entry: GitHubLockfileEntry,\n ) => Promise<OutdatedResult>,\n): Promise<OutdatedResult[]> {\n const {\n lockfile,\n manifest,\n includeUpToDate = false,\n includeLocal = false,\n packages: filterPackages,\n } = options;\n\n const results: OutdatedResult[] = [];\n\n const registryPackages = lockfile.packages || lockfile.skills || {};\n const registryDeps = manifest?.dependencies || {};\n\n const registryEntries = Object.entries(registryPackages).filter(\n ([specifier]) => !filterPackages || filterPackages.includes(specifier),\n );\n\n const registryResults = await Promise.all(\n registryEntries.map(([specifier, entry]) =>\n checkRegistryPackage(\n specifier,\n entry as PspmLockfileEntry,\n registryDeps[specifier],\n ),\n ),\n );\n results.push(...registryResults);\n\n const githubPackages = lockfile.githubPackages || {};\n const githubEntries = Object.entries(githubPackages).filter(\n ([specifier]) => !filterPackages || filterPackages.includes(specifier),\n );\n\n const githubResults = await Promise.all(\n githubEntries.map(([specifier, entry]) =>\n checkGitHubPackage(specifier, entry as GitHubLockfileEntry),\n ),\n );\n results.push(...githubResults);\n\n if (includeLocal) {\n const localPackages = lockfile.localPackages || {};\n const localEntries = Object.entries(localPackages).filter(\n ([specifier]) => !filterPackages || filterPackages.includes(specifier),\n );\n\n for (const [specifier, entry] of localEntries) {\n results.push(checkLocalPackage(specifier, entry as LocalLockfileEntry));\n }\n }\n\n if (!includeUpToDate) {\n return results.filter((r) => r.isOutdated);\n }\n\n return results;\n}\n\n/**\n * Create an outdated checker instance\n */\nexport function createOutdatedChecker(config: OutdatedConfig) {\n const { registryUrl, apiKey, githubToken } = config;\n\n async function fetchRegistryVersions(\n username: string,\n name: string,\n ): Promise<SkillVersionResponse[]> {\n const url = `${registryUrl}/@user/${username}/${name}/versions`;\n const response = await fetchWithAuth(url, apiKey);\n return (await response.json()) as SkillVersionResponse[];\n }\n\n async function fetchGithubRegistryVersions(\n owner: string,\n repo: string,\n skillname: string,\n ): Promise<SkillVersionResponse[]> {\n const url = `${registryUrl}/@github/${owner}/${repo}/${skillname}/versions`;\n const response = await fetchWithAuth(url, apiKey);\n return (await response.json()) as SkillVersionResponse[];\n }\n\n async function checkRegistryPackage(\n specifier: string,\n entry: PspmLockfileEntry,\n versionRange?: string,\n ): Promise<OutdatedResult> {\n const userMatch = specifier.match(/^@(?:user|org)\\/([^/]+)\\/([^/]+)$/);\n const githubMatch = specifier.match(/^@github\\/([^/]+)\\/([^/]+)\\/([^/]+)$/);\n\n if (!userMatch && !githubMatch) {\n throw new Error(`Invalid registry specifier: ${specifier}`);\n }\n\n const isGithubRegistry = !!githubMatch;\n const username = userMatch ? userMatch[1] : \"\";\n const name = userMatch ? userMatch[2] : \"\";\n\n try {\n const versions =\n isGithubRegistry && githubMatch\n ? await fetchGithubRegistryVersions(\n githubMatch[1],\n githubMatch[2],\n githubMatch[3],\n )\n : await fetchRegistryVersions(username, name);\n return computeRegistryOutdatedResult(\n specifier,\n entry,\n versions,\n versionRange,\n );\n } catch {\n return {\n name: specifier,\n current: entry.version,\n wanted: null,\n latest: null,\n type: \"registry\",\n isOutdated: false,\n wantedBehindLatest: false,\n versionRange,\n };\n }\n }\n\n async function fetchGitHubLatestCommit(\n owner: string,\n repo: string,\n ref: string,\n ): Promise<string | null> {\n try {\n const url = `https://api.github.com/repos/${owner}/${repo}/commits/${ref}`;\n const response = await fetchWithAuth(url, githubToken);\n const data = (await response.json()) as { sha: string };\n return data.sha;\n } catch {\n return null;\n }\n }\n\n async function checkGitHubPackage(\n specifier: string,\n entry: GitHubLockfileEntry,\n ): Promise<OutdatedResult> {\n const match = specifier.match(\n /^github:([a-zA-Z0-9_-]+)\\/([a-zA-Z0-9_.-]+)/,\n );\n if (!match) {\n throw new Error(`Invalid GitHub specifier: ${specifier}`);\n }\n\n const [, owner, repo] = match;\n const ref = entry.gitRef || \"HEAD\";\n\n const latestCommit = await fetchGitHubLatestCommit(owner, repo, ref);\n const currentShort = entry.gitCommit.slice(0, 7);\n const latestShort = latestCommit?.slice(0, 7) ?? null;\n\n const isOutdated =\n latestCommit !== null && entry.gitCommit !== latestCommit;\n\n return {\n name: specifier,\n current: currentShort,\n wanted: latestShort,\n latest: latestShort,\n type: \"github\",\n isOutdated,\n wantedBehindLatest: false,\n versionRange: ref,\n };\n }\n\n async function checkOutdated(\n options: CheckOutdatedOptions,\n ): Promise<OutdatedResult[]> {\n return checkOutdatedFromLockfile(\n options,\n checkRegistryPackage,\n checkGitHubPackage,\n );\n }\n\n return {\n checkOutdated,\n checkRegistryPackage,\n checkGitHubPackage,\n checkLocalPackage,\n fetchRegistryVersions,\n };\n}\n\n/**\n * Convenience function to check outdated packages\n */\nexport async function checkOutdated(\n config: OutdatedConfig,\n options: CheckOutdatedOptions,\n): Promise<OutdatedResult[]> {\n const checker = createOutdatedChecker(config);\n return checker.checkOutdated(options);\n}\n","import {\n checkOutdated as checkOutdatedFn,\n type OutdatedResult,\n} from \"@anytio/skill-registry/client\";\nimport { getTokenForRegistry, resolveConfig } from \"@/config\";\nimport { readLockfile } from \"@/lockfile\";\nimport { readManifest } from \"@/manifest\";\n\nexport interface OutdatedOptions {\n json?: boolean;\n all?: boolean;\n}\n\nexport async function outdated(\n packages: string[],\n options: OutdatedOptions,\n): Promise<void> {\n try {\n const lockfile = await readLockfile();\n if (!lockfile) {\n console.log(\"No skills installed.\");\n return;\n }\n\n const hasPackages =\n Object.keys(lockfile.packages ?? lockfile.skills ?? {}).length > 0 ||\n Object.keys(lockfile.githubPackages ?? {}).length > 0 ||\n Object.keys(lockfile.localPackages ?? {}).length > 0;\n\n if (!hasPackages) {\n console.log(\"No skills installed.\");\n return;\n }\n\n const config = await resolveConfig();\n const registryUrl = config.registryUrl;\n const apiKey = getTokenForRegistry(config, registryUrl);\n const githubToken = process.env.GITHUB_TOKEN;\n\n const manifest = await readManifest();\n\n console.log(\"Checking for outdated packages...\\n\");\n\n const results = await checkOutdatedFn(\n { registryUrl, apiKey, githubToken },\n {\n lockfile,\n manifest: manifest ?? undefined,\n includeUpToDate: options.all,\n packages: packages.length > 0 ? packages : undefined,\n },\n );\n\n if (results.length === 0) {\n console.log(\"All skills are up to date.\");\n return;\n }\n\n if (options.json) {\n console.log(JSON.stringify(results, null, 2));\n } else {\n printTable(results);\n }\n\n // Show deprecation warnings\n const deprecated = results.filter((r) => r.deprecated);\n if (deprecated.length > 0) {\n console.log(\"\");\n for (const r of deprecated) {\n console.log(`\\x1b[33m⚠ ${r.name}: ${r.deprecated}\\x1b[0m`);\n }\n }\n\n // Exit code 1 if any outdated packages (useful for CI)\n const hasOutdated = results.some((r) => r.isOutdated);\n if (hasOutdated) {\n process.exitCode = 1;\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n console.error(`Error: ${message}`);\n process.exit(1);\n }\n}\n\nfunction printTable(results: OutdatedResult[]): void {\n // Calculate column widths\n const headers = [\"Package\", \"Current\", \"Wanted\", \"Latest\", \"Type\"];\n const rows = results.map((r) => [\n r.name,\n r.current,\n r.wanted ?? \"—\",\n r.latest ?? \"—\",\n r.type,\n ]);\n\n const widths = headers.map((h, i) =>\n Math.max(h.length, ...rows.map((row) => row[i].length)),\n );\n\n // Print header\n const headerLine = headers.map((h, i) => h.padEnd(widths[i])).join(\" \");\n console.log(headerLine);\n console.log(widths.map((w) => \"─\".repeat(w)).join(\"──\"));\n\n // Print rows\n for (const row of rows) {\n const line = row.map((cell, i) => cell.padEnd(widths[i])).join(\" \");\n console.log(line);\n }\n}\n","import { readdir, readFile, stat } from \"node:fs/promises\";\nimport { join, relative } from \"node:path\";\nimport { createInterface } from \"node:readline\";\nimport {\n ALWAYS_IGNORED,\n type IgnoreLoadResult,\n type ManifestDetectionResult,\n type PspmManifest,\n} from \"@/lib/index\";\n\n/**\n * Prompt user for yes/no confirmation\n */\nexport function confirm(question: string): Promise<boolean> {\n return new Promise((resolve) => {\n const rl = createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n rl.question(`${question} (y/N) `, (answer) => {\n rl.close();\n const normalized = answer.trim().toLowerCase();\n resolve(normalized === \"y\" || normalized === \"yes\");\n });\n });\n}\n\n/**\n * Detect and read manifest file (pspm.json or package.json)\n */\nexport async function detectManifest(): Promise<ManifestDetectionResult> {\n const cwd = process.cwd();\n\n const pspmJsonPath = join(cwd, \"pspm.json\");\n try {\n const content = await readFile(pspmJsonPath, \"utf-8\");\n const manifest = JSON.parse(content) as PspmManifest;\n return { type: \"pspm.json\", manifest, path: pspmJsonPath };\n } catch {\n // pspm.json not found, try package.json\n }\n\n const packageJsonPath = join(cwd, \"package.json\");\n try {\n const content = await readFile(packageJsonPath, \"utf-8\");\n const packageJson = JSON.parse(content);\n\n const manifest: PspmManifest = {\n name: packageJson.name,\n version: packageJson.version,\n description: packageJson.description,\n author:\n typeof packageJson.author === \"string\"\n ? packageJson.author\n : packageJson.author?.name,\n license: packageJson.license,\n files: packageJson.files,\n dependencies: packageJson.dependencies,\n };\n\n return { type: \"package.json\", manifest, path: packageJsonPath };\n } catch {\n throw new Error(\"No pspm.json or package.json found in current directory\");\n }\n}\n\n/**\n * Format bytes to human readable string\n */\nexport function formatBytes(bytes: number): string {\n if (bytes < 1024) return `${bytes}B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)}kB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)}MB`;\n}\n\n/**\n * Recursively get all files in a directory with their sizes\n */\nexport async function getFilesWithSizes(\n dir: string,\n baseDir: string,\n ignoreResult?: IgnoreLoadResult,\n): Promise<Array<{ path: string; size: number }>> {\n const results: Array<{ path: string; size: number }> = [];\n\n try {\n const entries = await readdir(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = join(dir, entry.name);\n const relativePath = relative(baseDir, fullPath);\n\n if (ALWAYS_IGNORED.includes(entry.name)) {\n continue;\n }\n\n if (ignoreResult?.ig) {\n const pathToCheck = entry.isDirectory()\n ? `${relativePath}/`\n : relativePath;\n if (ignoreResult.ig.ignores(pathToCheck)) {\n continue;\n }\n }\n\n if (entry.isDirectory()) {\n const subFiles = await getFilesWithSizes(\n fullPath,\n baseDir,\n ignoreResult,\n );\n results.push(...subFiles);\n } else {\n const fileStat = await stat(fullPath);\n results.push({ path: relativePath, size: fileStat.size });\n }\n }\n } catch {\n // Directory doesn't exist or can't be read\n }\n\n return results;\n}\n","import { exec as execCb } from \"node:child_process\";\nimport { createHash } from \"node:crypto\";\nimport { readFile, stat } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { promisify } from \"node:util\";\nimport { configure, publishOrgSkill, publishSkill } from \"@/api-client\";\nimport {\n getEncryptionKey,\n getEncryptionScope,\n getRegistryUrl,\n requireApiKey,\n} from \"@/config\";\nimport { extractApiErrorMessage } from \"@/errors\";\nimport { encryptBuffer } from \"@/lib/encryption\";\nimport {\n DEFAULT_SKILL_FILES,\n getExcludeArgsForRsync,\n loadIgnorePatterns,\n type ManifestDetectionResult,\n validateManifest,\n} from \"@/lib/index\";\nimport type { SkillManifest } from \"@/sdk/generated\";\nimport {\n confirm,\n detectManifest,\n formatBytes,\n getFilesWithSizes,\n} from \"./publish-utils\";\n\nconst exec = promisify(execCb);\n\nexport interface PublishOptions {\n bump?: \"major\" | \"minor\" | \"patch\";\n tag?: string;\n /** Set package visibility during publish (required) */\n access: \"public\" | \"private\" | \"team\";\n /** Publish under an organization namespace */\n org?: string;\n}\n\nasync function warnAndConfirmPublic(\n access: PublishOptions[\"access\"],\n): Promise<void> {\n if (access !== \"public\") return;\n console.log(\"\");\n console.log(\"⚠️ Warning: You are about to publish this skill as PUBLIC.\");\n console.log(\" Once a skill is public, it CANNOT be made private again.\");\n console.log(\" This action is irreversible.\");\n console.log(\"\");\n\n const confirmed = await confirm(\"Do you want to continue?\");\n if (!confirmed) {\n console.log(\"Publish cancelled.\");\n process.exit(0);\n }\n console.log(\"\");\n}\n\nasync function validateAndPrepare(\n options: PublishOptions,\n): Promise<{ detection: ManifestDetectionResult; packageJson: SkillManifest }> {\n const detection = await detectManifest();\n const manifest = detection.manifest;\n\n if (detection.type === \"package.json\") {\n console.log(\"pspm warn Using package.json instead of pspm.json\");\n console.log(\n \"pspm warn Run 'pspm init' to create a dedicated pspm.json manifest\",\n );\n console.log(\"\");\n }\n\n const validation = validateManifest(manifest);\n if (!validation.valid) {\n console.error(`Error: ${validation.error}`);\n process.exit(1);\n }\n\n try {\n await stat(join(process.cwd(), \"SKILL.md\"));\n } catch {\n console.error(\n \"Error: SKILL.md is required. Create a SKILL.md file with your skill's documentation before publishing.\",\n );\n process.exit(1);\n }\n\n await warnAndConfirmPublic(options.access);\n\n // Strip qualified prefix (@user/owner/ or @org/owner/) — server expects bare name\n const nameParts = manifest.name.split(\"/\");\n const bareName = nameParts[nameParts.length - 1];\n const packageJson: SkillManifest = {\n name: bareName,\n version: manifest.version,\n description: manifest.description,\n files: manifest.files,\n dependencies: manifest.dependencies,\n };\n\n if (options.bump) {\n const semver = await import(\"semver\");\n const newVersion = semver.default.inc(packageJson.version, options.bump);\n if (!newVersion) {\n console.error(\n `Error: Failed to bump version from ${packageJson.version}`,\n );\n process.exit(1);\n }\n packageJson.version = newVersion;\n console.log(`Bumped version to ${newVersion}`);\n }\n\n return { detection, packageJson };\n}\n\nasync function copySourceFiles(\n files: string[],\n tempDir: string,\n excludeArgs: string,\n detection: ManifestDetectionResult,\n): Promise<void> {\n for (const file of files) {\n try {\n await exec(\n `rsync -a ${excludeArgs} \"${file}\" \"${tempDir}/package/\" 2>/dev/null || true`,\n );\n } catch {\n // Ignore files that don't exist\n }\n }\n\n if (detection.type === \"pspm.json\") {\n await exec(`cp pspm.json \"${tempDir}/package/\"`);\n try {\n await stat(join(process.cwd(), \"package.json\"));\n await exec(`cp package.json \"${tempDir}/package/\" 2>/dev/null || true`);\n } catch {\n // No package.json, that's fine\n }\n } else {\n await exec(`cp package.json \"${tempDir}/package/\"`);\n }\n}\n\ninterface TarballArtifact {\n tarballBuffer: Buffer;\n tarballBase64: string;\n tarballSize: number;\n shasum: string;\n integrity: string;\n contents: Array<{ path: string; size: number }>;\n unpackedSize: number;\n tarballName: string;\n}\n\nasync function buildTarball(\n packageJson: SkillManifest,\n detection: ManifestDetectionResult,\n tempDir: string,\n): Promise<TarballArtifact> {\n const ignoreResult = await loadIgnorePatterns();\n if (ignoreResult.source) {\n console.log(`pspm notice Using ${ignoreResult.source} for ignore patterns`);\n }\n const excludeArgs = getExcludeArgsForRsync(ignoreResult.patterns);\n\n const safeName = packageJson.name.replace(/[@/]/g, \"-\").replace(/^-+/, \"\");\n const tarballName = `${safeName}-${packageJson.version}.tgz`;\n\n await exec(`rm -rf \"${tempDir}\" && mkdir -p \"${tempDir}\"`);\n await exec(`mkdir -p \"${tempDir}/package\"`);\n\n const files = packageJson.files || [...DEFAULT_SKILL_FILES];\n await copySourceFiles(files, tempDir, excludeArgs, detection);\n\n const packageDir = join(tempDir, \"package\");\n const contents = await getFilesWithSizes(\n packageDir,\n packageDir,\n ignoreResult,\n );\n const unpackedSize = contents.reduce((acc, f) => acc + f.size, 0);\n\n const tarballPath = join(tempDir, tarballName);\n await exec(\n `tar -czf \"${tarballPath}\" -C \"${tempDir}\" ${excludeArgs} package`,\n );\n\n const tarballBuffer = await readFile(tarballPath);\n const tarballBase64 = tarballBuffer.toString(\"base64\");\n const tarballSize = tarballBuffer.length;\n const shasum = createHash(\"sha1\").update(tarballBuffer).digest(\"hex\");\n const integrityHash = createHash(\"sha512\")\n .update(tarballBuffer)\n .digest(\"base64\");\n const integrity = `sha512-${integrityHash}`;\n\n return {\n tarballBuffer,\n tarballBase64,\n tarballSize,\n shasum,\n integrity,\n contents,\n unpackedSize,\n tarballName,\n };\n}\n\nfunction enforceTarballSize(tarballSize: number): void {\n const MAX_TARBALL_SIZE = 10 * 1024 * 1024;\n if (tarballSize <= MAX_TARBALL_SIZE) return;\n\n console.error(\"\");\n console.error(\n `Error: Package size ${formatBytes(tarballSize)} exceeds the maximum allowed size of ${formatBytes(MAX_TARBALL_SIZE)}.`,\n );\n console.error(\"\");\n console.error(\"To reduce the package size:\");\n console.error(\n ' - Add a \"files\" field in your manifest to include only necessary files',\n );\n console.error(\" - Add patterns to .pspmignore to exclude large files\");\n console.error(\n \" - Remove build artifacts, tests, and documentation from the package\",\n );\n process.exit(1);\n}\n\nfunction printPublishPreview(\n packageJson: SkillManifest,\n artifact: TarballArtifact,\n): void {\n console.log(\"\");\n console.log(\"pspm notice\");\n console.log(`pspm notice 📦 ${packageJson.name}@${packageJson.version}`);\n console.log(\"pspm notice === Tarball Contents ===\");\n\n const sorted = [...artifact.contents].sort((a, b) => b.size - a.size);\n for (const file of sorted) {\n console.log(\n `pspm notice ${formatBytes(file.size).padStart(8)} ${file.path}`,\n );\n }\n\n console.log(\"pspm notice === Tarball Details ===\");\n console.log(`pspm notice name: ${packageJson.name}`);\n console.log(`pspm notice version: ${packageJson.version}`);\n console.log(`pspm notice filename: ${artifact.tarballName}`);\n console.log(\n `pspm notice package size: ${formatBytes(artifact.tarballSize)}`,\n );\n console.log(\n `pspm notice unpacked size: ${formatBytes(artifact.unpackedSize)}`,\n );\n console.log(`pspm notice shasum: ${artifact.shasum}`);\n console.log(\n `pspm notice integrity: ${artifact.integrity.substring(0, 50)}...`,\n );\n console.log(`pspm notice total files: ${artifact.contents.length}`);\n console.log(\"pspm notice\");\n}\n\nasync function maybeEncrypt(\n options: PublishOptions,\n packageJson: SkillManifest,\n artifact: TarballArtifact,\n): Promise<string> {\n if (options.access !== \"private\" && options.access !== \"team\") {\n return artifact.tarballBase64;\n }\n\n const config = await import(\"@/config\").then((m) => m.resolveConfig());\n const namespace = options.org ? \"org\" : \"user\";\n const owner = options.org ?? config.username;\n\n if (!owner) {\n console.error(\n \"Error: Cannot determine package owner. Run 'pspm login' first.\",\n );\n process.exit(1);\n }\n\n const scope = getEncryptionScope(namespace, owner);\n const encryptionKey = await getEncryptionKey(scope);\n\n if (!encryptionKey) {\n console.log(\n `pspm warn No encryption key found for scope \"${scope}\". Publishing without encryption.`,\n );\n console.log(\n `pspm warn To encrypt, run: pspm config set-encryption-key ${scope} <your-passphrase>`,\n );\n return artifact.tarballBase64;\n }\n\n console.log(`pspm notice Encrypting package (scope: ${scope})`);\n const { encrypted, metadata } = encryptBuffer(\n artifact.tarballBuffer,\n encryptionKey,\n scope,\n );\n packageJson.encryption = metadata;\n console.log(\"pspm notice Package encrypted with client-side encryption\");\n return encrypted.toString(\"base64\");\n}\n\n// biome-ignore lint/suspicious/noExplicitAny: SDK response shape varies by endpoint\ntype PublishResponse = { status: number; data?: any; error?: any };\n\nasync function uploadPackage(\n options: PublishOptions,\n packageJson: SkillManifest,\n tarballBase64: string,\n): Promise<PublishResponse> {\n if (options.org) {\n return publishOrgSkill(options.org, {\n manifest: packageJson,\n tarballBase64,\n visibility: options.access,\n });\n }\n return publishSkill({\n manifest: packageJson,\n tarballBase64,\n visibility: options.access,\n });\n}\n\nfunction handleUploadError(response: PublishResponse, version: string): never {\n const errorMessage = extractApiErrorMessage(\n { status: response.status, data: response.data },\n \"Publish failed\",\n );\n\n if (\n errorMessage.includes(\"must be greater than\") ||\n errorMessage.includes(\"already exists\")\n ) {\n console.error(\"pspm error code E403\");\n console.error(\n `pspm error 403 403 Forbidden - You cannot publish over the previously published versions: ${version}.`,\n );\n }\n\n throw new Error(errorMessage);\n}\n\nfunction printPublishResult(\n // biome-ignore lint/suspicious/noExplicitAny: SDK response shape varies by endpoint\n result: any,\n options: PublishOptions,\n packageJson: SkillManifest,\n): void {\n const visibility = result.skill.visibility;\n const visibilityIcon =\n visibility === \"public\" ? \"🌐\" : visibility === \"team\" ? \"👥\" : \"🔒\";\n const namespace = options.org ? \"org\" : (result.skill.namespace ?? \"user\");\n const owner = options.org ?? result.skill.username;\n console.log(\n `+ @${namespace}/${owner}/${result.skill.name}@${result.version.version}`,\n );\n console.log(`Checksum: ${result.version.checksum}`);\n console.log(\n `Visibility: ${visibilityIcon} ${visibility}${packageJson.encryption ? \" (encrypted)\" : \"\"}`,\n );\n\n if (visibility === \"public\") {\n console.log(\n \"Note: Public packages cannot be made private. This is irreversible.\",\n );\n }\n}\n\nasync function publishCommand(options: PublishOptions): Promise<void> {\n try {\n const apiKey = await requireApiKey();\n const registryUrl = await getRegistryUrl();\n\n const { detection, packageJson } = await validateAndPrepare(options);\n\n const tempDir = join(process.cwd(), \".pspm-publish\");\n\n try {\n const artifact = await buildTarball(packageJson, detection, tempDir);\n enforceTarballSize(artifact.tarballSize);\n printPublishPreview(packageJson, artifact);\n\n const confirmed = await confirm(\n `Publish ${packageJson.name}@${packageJson.version} to ${registryUrl}?`,\n );\n if (!confirmed) {\n console.log(\"Publish cancelled.\");\n process.exit(0);\n }\n\n console.log(\"\");\n\n const finalTarballBase64 = await maybeEncrypt(\n options,\n packageJson,\n artifact,\n );\n\n console.log(`pspm notice Publishing to ${registryUrl} with tag latest`);\n\n configure({ registryUrl, apiKey });\n\n const response = await uploadPackage(\n options,\n packageJson,\n finalTarballBase64,\n );\n\n if (response.status !== 200) {\n handleUploadError(response, packageJson.version);\n }\n\n printPublishResult(response.data, options, packageJson);\n } finally {\n await exec(`rm -rf \"${tempDir}\"`).catch(() => {});\n }\n } catch (error) {\n if (error instanceof Error) {\n console.error(`Error: ${error.message}`);\n } else {\n console.error(`Error: ${String(error)}`);\n }\n process.exit(1);\n }\n}\n\nexport { publishCommand as publish };\n","/**\n * Remove command - Remove an installed skill.\n *\n * Supports:\n * - Registry skills (by full specifier or short name)\n * - GitHub skills (by specifier or skill name)\n */\n\nimport { rm } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { getAvailableAgents } from \"@/agents\";\nimport { getSkillsDir } from \"@/config\";\nimport {\n getGitHubSkillName,\n isGitHubSpecifier,\n isRegistrySpecifier,\n parseGitHubSpecifier,\n parseRegistrySpecifier,\n} from \"@/lib/index\";\nimport {\n listLockfileGitHubPackages,\n listLockfileSkills,\n removeFromLockfile,\n removeGitHubFromLockfile,\n} from \"@/lockfile\";\nimport {\n readManifest,\n removeDependency,\n removeGitHubDependency,\n} from \"@/manifest\";\nimport { getGitHubSkillPath, removeAgentSymlinks } from \"@/symlinks\";\n\nexport async function remove(nameOrSpecifier: string): Promise<void> {\n try {\n // Read manifest for agent config overrides\n const manifest = await readManifest();\n const agentConfigs = manifest?.agents;\n const agents = getAvailableAgents(agentConfigs);\n\n // Determine type of specifier\n if (isGitHubSpecifier(nameOrSpecifier)) {\n await removeGitHub(nameOrSpecifier, agents, agentConfigs);\n } else if (isRegistrySpecifier(nameOrSpecifier)) {\n await removeRegistry(nameOrSpecifier, agents, agentConfigs);\n } else {\n // Short name - try to find in either registry or GitHub skills\n await removeByShortName(nameOrSpecifier, agents, agentConfigs);\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n console.error(`Error: ${message}`);\n process.exit(1);\n }\n}\n\n/**\n * Remove a registry skill by full specifier.\n */\nasync function removeRegistry(\n specifier: string,\n agents: string[],\n agentConfigs?: Record<string, { skillsDir: string }>,\n): Promise<void> {\n const parsed = parseRegistrySpecifier(specifier);\n if (!parsed) {\n console.error(`Error: Invalid skill specifier: ${specifier}`);\n process.exit(1);\n }\n\n const { namespace, owner, name, subname } = parsed;\n // Build the full lockfile key — @github includes subname\n const fullName =\n namespace === \"github\" && subname\n ? `@github/${owner}/${name}/${subname}`\n : `@${namespace}/${owner}/${name}`;\n\n console.log(`Removing ${fullName}...`);\n\n // Remove from lockfile\n const removedFromLockfile = await removeFromLockfile(fullName);\n\n // Remove from pspm.json dependencies\n const removedFromManifest = await removeDependency(fullName);\n\n if (!removedFromLockfile && !removedFromManifest) {\n console.error(`Error: ${fullName} not found in lockfile or pspm.json`);\n process.exit(1);\n }\n\n // Remove symlinks from all agents — use subname for @github (the actual skill name)\n const symlinkName = subname ?? name;\n await removeAgentSymlinks(symlinkName, {\n agents,\n projectRoot: process.cwd(),\n agentConfigs,\n });\n\n // Remove from disk\n const skillsDir = getSkillsDir();\n let destDir: string;\n if (namespace === \"github\" && subname) {\n destDir = join(skillsDir, \"_github-registry\", owner, name, subname);\n } else if (namespace === \"org\") {\n destDir = join(skillsDir, \"_org\", owner, name);\n } else {\n destDir = join(skillsDir, owner, name);\n }\n\n try {\n await rm(destDir, { recursive: true, force: true });\n } catch {\n // Ignore errors if directory doesn't exist\n }\n\n console.log(`Removed ${fullName}`);\n}\n\n/**\n * Remove a GitHub skill by specifier.\n */\nasync function removeGitHub(\n specifier: string,\n agents: string[],\n agentConfigs?: Record<string, { skillsDir: string }>,\n): Promise<void> {\n const parsed = parseGitHubSpecifier(specifier);\n if (!parsed) {\n console.error(`Error: Invalid GitHub specifier: ${specifier}`);\n process.exit(1);\n }\n\n // Build the lockfile key (without ref)\n const lockfileKey = parsed.path\n ? `github:${parsed.owner}/${parsed.repo}/${parsed.path}`\n : `github:${parsed.owner}/${parsed.repo}`;\n\n console.log(`Removing ${lockfileKey}...`);\n\n // Remove from lockfile\n const removedFromLockfile = await removeGitHubFromLockfile(lockfileKey);\n\n // Remove from pspm.json githubDependencies\n const removedFromManifest = await removeGitHubDependency(lockfileKey);\n\n if (!removedFromLockfile && !removedFromManifest) {\n console.error(`Error: ${lockfileKey} not found in lockfile or pspm.json`);\n process.exit(1);\n }\n\n // Remove symlinks from all agents\n const skillName = getGitHubSkillName(parsed);\n await removeAgentSymlinks(skillName, {\n agents,\n projectRoot: process.cwd(),\n agentConfigs,\n });\n\n // Remove from disk\n const skillsDir = getSkillsDir();\n const destPath = getGitHubSkillPath(parsed.owner, parsed.repo, parsed.path);\n const destDir = join(skillsDir, \"..\", destPath);\n\n try {\n await rm(destDir, { recursive: true, force: true });\n } catch {\n // Ignore errors if directory doesn't exist\n }\n\n console.log(`Removed ${lockfileKey}`);\n}\n\n/**\n * Remove a skill by short name (searches both registry and GitHub skills).\n */\nasync function removeByShortName(\n shortName: string,\n agents: string[],\n agentConfigs?: Record<string, { skillsDir: string }>,\n): Promise<void> {\n // First try to find in registry skills (covers @user, @org, @github namespaces)\n const registrySkills = await listLockfileSkills();\n const foundRegistry = registrySkills.find((s) => {\n const parsed = parseRegistrySpecifier(s.name);\n if (!parsed) return false;\n // For @github, the effective skill name is subname; for others it's name\n const effectiveName = parsed.subname ?? parsed.name;\n return effectiveName === shortName;\n });\n\n if (foundRegistry) {\n await removeRegistry(foundRegistry.name, agents, agentConfigs);\n return;\n }\n\n // Try to find in GitHub skills\n const githubSkills = await listLockfileGitHubPackages();\n const foundGitHub = githubSkills.find((s) => {\n const parsed = parseGitHubSpecifier(s.specifier);\n if (!parsed) return false;\n return getGitHubSkillName(parsed) === shortName;\n });\n\n if (foundGitHub) {\n await removeGitHub(foundGitHub.specifier, agents, agentConfigs);\n return;\n }\n\n console.error(`Error: Skill \"${shortName}\" not found in lockfile`);\n process.exit(1);\n}\n","/**\n * Search command - Search and discover skills from the registry.\n *\n * Queries the public explore API with optional search term and\n * displays results in a formatted table.\n */\n\nimport { configure } from \"@/api-client\";\nimport { getTokenForRegistry, resolveConfig } from \"@/config\";\nimport { explorePublicSkills } from \"@/sdk/generated\";\n\nexport interface SearchOptions {\n /** Sort results: downloads, recent, name */\n sort?: \"downloads\" | \"recent\" | \"name\";\n /** Maximum number of results */\n limit?: number;\n /** Output as JSON */\n json?: boolean;\n}\n\nexport async function search(\n query: string | undefined,\n options: SearchOptions,\n): Promise<void> {\n try {\n // Configure SDK (no auth needed for public explore)\n const config = await resolveConfig();\n const apiKey = getTokenForRegistry(config, config.registryUrl);\n configure({ registryUrl: config.registryUrl, apiKey });\n\n const limit = options.limit ?? 20;\n const sort = options.sort ?? \"downloads\";\n\n if (!options.json) {\n if (query) {\n console.log(`Searching for \"${query}\"...\\n`);\n } else {\n console.log(\"Browsing skills...\\n\");\n }\n }\n\n const response = await explorePublicSkills({\n search: query,\n sort,\n limit,\n page: 1,\n });\n\n if (response.status !== 200) {\n console.error(\"Error: Failed to search skills\");\n process.exit(1);\n }\n\n const { skills, total } = response.data;\n\n if (skills.length === 0) {\n if (query) {\n console.log(`No skills found matching \"${query}\".`);\n } else {\n console.log(\"No skills published yet.\");\n }\n return;\n }\n\n if (options.json) {\n console.log(JSON.stringify(skills, null, 2));\n return;\n }\n\n // Display results\n for (const skill of skills) {\n const name = `@${(skill as any).namespace ?? \"user\"}/${skill.username}/${skill.name}`;\n const desc = skill.description\n ? ` - ${skill.description.slice(0, 80)}${skill.description.length > 80 ? \"...\" : \"\"}`\n : \"\";\n const downloads =\n skill.totalDownloads > 0\n ? ` (${formatDownloads(skill.totalDownloads)} downloads)`\n : \"\";\n\n console.log(` ${name}${downloads}`);\n if (desc) {\n console.log(` ${desc.trim()}`);\n }\n }\n\n // Summary\n const showing = Math.min(skills.length, limit);\n if (total > showing) {\n console.log(`\\nShowing ${showing} of ${total} results.`);\n } else {\n console.log(`\\n${total} skill(s) found.`);\n }\n\n // Hint for install\n if (skills.length > 0) {\n const first = skills[0];\n console.log(\n `\\nInstall with: pspm add @${(first as any).namespace ?? \"user\"}/${first.username}/${first.name}`,\n );\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n console.error(`Error: ${message}`);\n process.exit(1);\n }\n}\n\n/**\n * Format download count for display (e.g., 1234 -> \"1.2k\")\n */\nfunction formatDownloads(count: number): string {\n if (count >= 1_000_000) {\n return `${(count / 1_000_000).toFixed(1)}M`;\n }\n if (count >= 1_000) {\n return `${(count / 1_000).toFixed(1)}k`;\n }\n return String(count);\n}\n","/**\n * Helpers shared across skill-list subcommands.\n */\n\nimport { getTokenForRegistry, requireApiKey, resolveConfig } from \"@/config\";\n\nexport interface SkillListCreateOptions {\n description?: string;\n visibility?: string;\n org?: string;\n}\n\nexport interface SkillListListOptions {\n org?: string;\n json?: boolean;\n}\n\nexport interface SkillListShowOptions {\n json?: boolean;\n}\n\nexport interface SkillListUpdateOptions {\n description?: string;\n visibility?: string;\n}\n\nexport interface SkillListAddSkillOptions {\n version?: string;\n note?: string;\n}\n\n/**\n * Parse a list specifier like @user/alice/my-tools or @org/myorg/my-tools.\n * Returns { ownerType, ownerName, listName } or null.\n */\nexport function parseListSpecifier(specifier: string): {\n ownerType: \"user\" | \"org\";\n ownerName: string;\n listName: string;\n} | null {\n const match = specifier.match(/^@(user|org)\\/([^/]+)\\/([^/]+)$/);\n if (!match) return null;\n return {\n ownerType: match[1] as \"user\" | \"org\",\n ownerName: match[2],\n listName: match[3],\n };\n}\n\n/**\n * Extract a human-readable error message from an API error response.\n */\nexport function extractErrorMessage(text: string): string {\n try {\n const json = JSON.parse(text);\n if (typeof json.message === \"string\") return json.message;\n if (typeof json.error === \"string\") return json.error;\n if (typeof json.error?.message === \"string\") return json.error.message;\n } catch {\n // Not JSON\n }\n return text;\n}\n\nexport async function getBaseUrl(): Promise<string> {\n const config = await resolveConfig();\n return config.registryUrl.replace(/\\/api\\/skills\\/?$/, \"\");\n}\n\nexport async function getAuthHeaders(): Promise<Record<string, string>> {\n const apiKey = await requireApiKey();\n return {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${apiKey}`,\n };\n}\n\nexport async function getOptionalAuthHeaders(): Promise<\n Record<string, string>\n> {\n const config = await resolveConfig();\n const apiKey = getTokenForRegistry(config, config.registryUrl);\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n };\n if (apiKey) {\n headers.Authorization = `Bearer ${apiKey}`;\n }\n return headers;\n}\n\n/**\n * Resolve a skill specifier (e.g. @user/alice/my-skill) to a skill ID\n * by searching the explore API.\n */\nexport async function resolveSkillId(\n baseUrl: string,\n headers: Record<string, string>,\n specifier: string,\n): Promise<string | null> {\n const match = specifier.match(/^@(user|org|github)\\/(.+)$/);\n let search: string;\n let namespace: string | undefined;\n\n if (match) {\n namespace = match[1];\n const parts = match[2].split(\"/\");\n search = parts[parts.length - 1];\n } else {\n search = specifier;\n }\n\n const params = new URLSearchParams({ search, limit: \"5\" });\n if (namespace) {\n params.set(\"namespace\", namespace);\n }\n\n const response = await fetch(`${baseUrl}/api/skills/-/explore?${params}`, {\n headers,\n });\n\n if (!response.ok) return null;\n\n const data = (await response.json()) as {\n skills: Array<{\n id: string;\n name: string;\n username: string;\n namespace: string;\n }>;\n };\n\n if (!data.skills || data.skills.length === 0) return null;\n\n if (match) {\n const parts = match[2].split(\"/\");\n const skillName = parts[parts.length - 1];\n const ownerName = parts.length >= 2 ? parts[parts.length - 2] : undefined;\n\n const exact = data.skills.find(\n (s) =>\n s.name === skillName &&\n (!ownerName || s.username === ownerName) &&\n (!namespace || s.namespace === namespace),\n );\n if (exact) return exact.id;\n }\n\n return data.skills[0].id;\n}\n","/**\n * Skill List CLI Commands\n *\n * CRUD operations for managing skill lists via the CLI.\n */\n\nimport { configure, fetchSkillList } from \"@/api-client\";\nimport { getTokenForRegistry, resolveConfig } from \"@/config\";\nimport {\n extractErrorMessage,\n getAuthHeaders,\n getBaseUrl,\n getOptionalAuthHeaders,\n parseListSpecifier,\n resolveSkillId,\n type SkillListAddSkillOptions,\n type SkillListCreateOptions,\n type SkillListListOptions,\n type SkillListShowOptions,\n type SkillListUpdateOptions,\n} from \"./skill-list-helpers\";\n\nexport type {\n SkillListAddSkillOptions,\n SkillListCreateOptions,\n SkillListListOptions,\n SkillListShowOptions,\n SkillListUpdateOptions,\n};\n\n/**\n * List skill lists for the current user or an organization.\n */\nexport async function skillListList(\n options: SkillListListOptions,\n): Promise<void> {\n const baseUrl = await getBaseUrl();\n const config = await resolveConfig();\n\n let path: string;\n if (options.org) {\n path = `/api/skill-lists/lists/@org/${options.org}`;\n } else {\n if (!config.username) {\n console.error(\"Error: Not logged in. Run `pspm login` first.\");\n process.exit(1);\n }\n path = `/api/skill-lists/lists/@user/${config.username}`;\n }\n\n const headers = await getOptionalAuthHeaders();\n const response = await fetch(`${baseUrl}${path}`, { headers });\n\n if (!response.ok) {\n const errorText = await response.text();\n console.error(\n `Error: Failed to list skill lists (${response.status}): ${extractErrorMessage(errorText)}`,\n );\n process.exit(1);\n }\n\n const lists = (await response.json()) as Array<{\n id: string;\n name: string;\n description: string | null;\n visibility: string;\n ownerType: string;\n ownerName: string;\n itemCount: number;\n createdAt: string;\n updatedAt: string;\n }>;\n\n if (options.json) {\n console.log(JSON.stringify(lists, null, 2));\n return;\n }\n\n if (lists.length === 0) {\n console.log(\"No skill lists found.\");\n return;\n }\n\n const ownerLabel = options.org\n ? `@org/${options.org}`\n : `@user/${config.username}`;\n console.log(`\\nSkill lists for ${ownerLabel}:\\n`);\n console.log(\n `${\"Name\".padEnd(35)} ${\"Skills\".padEnd(8)} ${\"Visibility\".padEnd(12)} Description`,\n );\n console.log(\"-\".repeat(90));\n\n for (const list of lists) {\n const desc = list.description ? list.description.slice(0, 30) : \"\";\n console.log(\n `${list.name.slice(0, 33).padEnd(35)} ${String(list.itemCount).padEnd(8)} ${list.visibility.padEnd(12)} ${desc}`,\n );\n }\n console.log(`\\n${lists.length} list(s)`);\n}\n\n/**\n * Create a new skill list.\n */\nexport async function skillListCreate(\n name: string,\n options: SkillListCreateOptions,\n): Promise<void> {\n const baseUrl = await getBaseUrl();\n const headers = await getAuthHeaders();\n const config = await resolveConfig();\n\n const visibility = options.visibility || \"private\";\n if (visibility !== \"public\" && visibility !== \"private\") {\n console.error('Error: --visibility must be \"public\" or \"private\"');\n process.exit(1);\n }\n\n let path: string;\n if (options.org) {\n path = `/api/skill-lists/lists/@org/${options.org}`;\n } else {\n if (!config.username) {\n console.error(\"Error: Not logged in. Run `pspm login` first.\");\n process.exit(1);\n }\n path = `/api/skill-lists/lists/@user/${config.username}`;\n }\n\n const body: Record<string, string> = { name, visibility };\n if (options.description) {\n body.description = options.description;\n }\n\n const response = await fetch(`${baseUrl}${path}`, {\n method: \"POST\",\n headers,\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n console.error(\n `Error: Failed to create list (${response.status}): ${extractErrorMessage(errorText)}`,\n );\n process.exit(1);\n }\n\n const list = (await response.json()) as {\n id: string;\n name: string;\n visibility: string;\n ownerType: string;\n ownerName: string;\n };\n\n const ownerLabel = options.org\n ? `@org/${options.org}`\n : `@user/${config.username}`;\n console.log(`Created list: ${ownerLabel}/${list.name} (${list.visibility})`);\n console.log(\n `\\nInstall command: pspm skill-list install ${ownerLabel}/${list.name}`,\n );\n}\n\n/**\n * Show details of a skill list.\n */\nexport async function skillListShow(\n specifier: string,\n options: SkillListShowOptions,\n): Promise<void> {\n const parsed = parseListSpecifier(specifier);\n if (!parsed) {\n console.error(\n \"Error: Invalid list specifier. Use @user/<username>/<list-name> or @org/<orgname>/<list-name>\",\n );\n process.exit(1);\n }\n\n const config = await resolveConfig();\n configure({\n registryUrl: config.registryUrl,\n apiKey: getTokenForRegistry(config, config.registryUrl),\n });\n\n const response = await fetchSkillList(\n parsed.ownerType,\n parsed.ownerName,\n parsed.listName,\n );\n\n if (response.status !== 200 || !response.data) {\n const errorMsg =\n response.status === 404\n ? `List \"${specifier}\" not found or is private.`\n : response.error || \"Failed to fetch list\";\n console.error(`Error: ${errorMsg}`);\n process.exit(1);\n }\n\n const list = response.data;\n\n if (options.json) {\n console.log(JSON.stringify(list, null, 2));\n return;\n }\n\n console.log(`\\n${list.name}`);\n if (list.description) {\n console.log(` ${list.description}`);\n }\n console.log(` Visibility: ${list.visibility}`);\n console.log(` Owner: @${list.ownerType}/${list.ownerName}`);\n console.log(` Skills: ${list.items.length}`);\n\n if (list.items.length > 0) {\n console.log(\"\");\n for (const item of list.items) {\n const ns = item.namespace === \"org\" ? \"org\" : \"user\";\n const spec = `@${ns}/${item.ownerName}/${item.skillName}`;\n const ver = item.pinnedVersion ? `@${item.pinnedVersion}` : \"\";\n console.log(` - ${spec}${ver}`);\n }\n }\n\n console.log(`\\nInstall all: pspm skill-list install ${specifier}`);\n}\n\n/**\n * Delete a skill list.\n */\nexport async function skillListDelete(specifier: string): Promise<void> {\n const parsed = parseListSpecifier(specifier);\n if (!parsed) {\n console.error(\n \"Error: Invalid list specifier. Use @user/<username>/<list-name> or @org/<orgname>/<list-name>\",\n );\n process.exit(1);\n }\n\n const baseUrl = await getBaseUrl();\n const headers = await getAuthHeaders();\n\n const path = `/api/skill-lists/lists/@${parsed.ownerType}/${parsed.ownerName}/${parsed.listName}`;\n const response = await fetch(`${baseUrl}${path}`, {\n method: \"DELETE\",\n headers,\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n if (response.status === 404) {\n console.error(`Error: List \"${specifier}\" not found.`);\n } else {\n console.error(\n `Error: Failed to delete list (${response.status}): ${extractErrorMessage(errorText)}`,\n );\n }\n process.exit(1);\n }\n\n console.log(`Deleted list: ${specifier}`);\n}\n\n/**\n * Update a skill list's metadata.\n */\nexport async function skillListUpdate(\n specifier: string,\n options: SkillListUpdateOptions,\n): Promise<void> {\n const parsed = parseListSpecifier(specifier);\n if (!parsed) {\n console.error(\n \"Error: Invalid list specifier. Use @user/<username>/<list-name> or @org/<orgname>/<list-name>\",\n );\n process.exit(1);\n }\n\n if (!options.description && !options.visibility) {\n console.error(\n \"Error: Provide at least one of --description or --visibility\",\n );\n process.exit(1);\n }\n\n if (\n options.visibility &&\n options.visibility !== \"public\" &&\n options.visibility !== \"private\"\n ) {\n console.error('Error: --visibility must be \"public\" or \"private\"');\n process.exit(1);\n }\n\n const baseUrl = await getBaseUrl();\n const headers = await getAuthHeaders();\n\n const body: Record<string, string> = {};\n if (options.description !== undefined) {\n body.description = options.description;\n }\n if (options.visibility) {\n body.visibility = options.visibility;\n }\n\n const path = `/api/skill-lists/lists/@${parsed.ownerType}/${parsed.ownerName}/${parsed.listName}`;\n const response = await fetch(`${baseUrl}${path}`, {\n method: \"PUT\",\n headers,\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n console.error(\n `Error: Failed to update list (${response.status}): ${extractErrorMessage(errorText)}`,\n );\n process.exit(1);\n }\n\n console.log(`Updated list: ${specifier}`);\n}\n\n/**\n * Add a skill to a list.\n */\nexport async function skillListAddSkill(\n specifier: string,\n skillSpecifiers: string[],\n options: SkillListAddSkillOptions,\n): Promise<void> {\n const parsed = parseListSpecifier(specifier);\n if (!parsed) {\n console.error(\n \"Error: Invalid list specifier. Use @user/<username>/<list-name> or @org/<orgname>/<list-name>\",\n );\n process.exit(1);\n }\n\n const baseUrl = await getBaseUrl();\n const headers = await getAuthHeaders();\n\n const config = await resolveConfig();\n configure({\n registryUrl: config.registryUrl,\n apiKey: getTokenForRegistry(config, config.registryUrl),\n });\n\n for (const skillSpec of skillSpecifiers) {\n const skillId = await resolveSkillId(baseUrl, headers, skillSpec);\n if (!skillId) {\n console.error(`Error: Skill \"${skillSpec}\" not found.`);\n continue;\n }\n\n const path = `/api/skill-lists/lists/@${parsed.ownerType}/${parsed.ownerName}/${parsed.listName}/items`;\n const addBody: Record<string, string> = { skillId };\n if (options.note) {\n addBody.note = options.note;\n }\n\n const response = await fetch(`${baseUrl}${path}`, {\n method: \"POST\",\n headers,\n body: JSON.stringify(addBody),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n if (response.status === 409) {\n console.log(`Already in list: ${skillSpec}`);\n } else {\n console.error(\n `Error: Failed to add \"${skillSpec}\" (${response.status}): ${extractErrorMessage(errorText)}`,\n );\n }\n continue;\n }\n\n console.log(`Added: ${skillSpec}`);\n }\n}\n\n/**\n * Remove a skill from a list.\n */\nexport async function skillListRemoveSkill(\n specifier: string,\n skillSpecifier: string,\n): Promise<void> {\n const parsed = parseListSpecifier(specifier);\n if (!parsed) {\n console.error(\n \"Error: Invalid list specifier. Use @user/<username>/<list-name> or @org/<orgname>/<list-name>\",\n );\n process.exit(1);\n }\n\n const config = await resolveConfig();\n configure({\n registryUrl: config.registryUrl,\n apiKey: getTokenForRegistry(config, config.registryUrl),\n });\n\n const listResponse = await fetchSkillList(\n parsed.ownerType,\n parsed.ownerName,\n parsed.listName,\n );\n\n if (listResponse.status !== 200 || !listResponse.data) {\n console.error(`Error: List \"${specifier}\" not found.`);\n process.exit(1);\n }\n\n const item = listResponse.data.items.find((i) => {\n const ns = i.namespace === \"org\" ? \"org\" : \"user\";\n const fullSpec = `@${ns}/${i.ownerName}/${i.skillName}`;\n return (\n fullSpec === skillSpecifier ||\n i.skillName === skillSpecifier ||\n `${i.ownerName}/${i.skillName}` === skillSpecifier\n );\n });\n\n if (!item) {\n console.error(\n `Error: Skill \"${skillSpecifier}\" not found in list \"${specifier}\".`,\n );\n process.exit(1);\n }\n\n const baseUrl = await getBaseUrl();\n const headers = await getAuthHeaders();\n\n const path = `/api/skill-lists/lists/@${parsed.ownerType}/${parsed.ownerName}/${parsed.listName}/items/${item.id}`;\n const response = await fetch(`${baseUrl}${path}`, {\n method: \"DELETE\",\n headers,\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n console.error(\n `Error: Failed to remove skill (${response.status}): ${extractErrorMessage(errorText)}`,\n );\n process.exit(1);\n }\n\n console.log(`Removed: ${skillSpecifier} from ${specifier}`);\n}\n\n/**\n * Install all skills from a list (delegates to the install command).\n */\nexport async function skillListInstall(\n specifier: string,\n options: {\n agent?: string;\n yes?: boolean;\n global?: boolean;\n dir?: string;\n },\n): Promise<void> {\n const { install } = await import(\"@/commands/install\");\n await install([], {\n list: specifier,\n agent: options.agent,\n yes: options.yes,\n global: options.global,\n dir: options.dir,\n });\n}\n","import {\n configure,\n deleteOrgSkill,\n deleteSkill,\n deleteSkillVersion,\n} from \"@/api-client\";\nimport { getRegistryUrl, requireApiKey } from \"@/config\";\nimport { extractApiErrorMessage } from \"@/errors\";\nimport {\n generateRegistryIdentifier,\n parseRegistrySpecifier,\n} from \"@/lib/index\";\n\nexport interface UnpublishOptions {\n force?: boolean;\n}\n\nexport async function unpublish(\n specifier: string,\n options: UnpublishOptions,\n): Promise<void> {\n try {\n const apiKey = await requireApiKey();\n const registryUrl = await getRegistryUrl();\n\n // Parse the specifier\n const parsed = parseRegistrySpecifier(specifier);\n if (!parsed) {\n console.error(\n `Error: Invalid skill specifier \"${specifier}\". Use format: @user/{username}/{name}[@{version}] or @org/{orgname}/{name}[@{version}]`,\n );\n process.exit(1);\n }\n\n const { owner, name, versionRange } = parsed;\n const fullName = generateRegistryIdentifier({\n namespace: parsed.namespace,\n owner,\n name,\n });\n\n // Configure SDK (use direct REST endpoints, not oRPC)\n configure({ registryUrl, apiKey });\n\n const isOrg = parsed.namespace === \"org\";\n\n if (versionRange) {\n // Delete specific version\n if (isOrg) {\n console.error(\n \"Error: Deleting a specific version of an org skill is not supported. Use the full skill specifier without a version to delete the entire skill.\",\n );\n process.exit(1);\n }\n\n console.log(`Unpublishing ${specifier}...`);\n\n if (!options.force) {\n console.error(\n \"Warning: This action is irreversible. Use --force to confirm.\",\n );\n process.exit(1);\n }\n\n const response = await deleteSkillVersion(owner, name, versionRange);\n if (response.status !== 200) {\n const errorMessage = extractApiErrorMessage(\n response,\n \"Failed to unpublish. Version may not exist.\",\n );\n console.error(`Error: ${errorMessage}`);\n process.exit(1);\n }\n console.log(`Unpublished ${fullName}@${versionRange}`);\n } else {\n // Delete entire skill\n console.log(`Unpublishing all versions of ${fullName}...`);\n\n if (!options.force) {\n console.error(\n \"Warning: This will delete ALL versions. Use --force to confirm.\",\n );\n process.exit(1);\n }\n\n const response = isOrg\n ? await deleteOrgSkill(owner, name)\n : await deleteSkill(owner, name);\n if (response.status !== 200) {\n const errorMessage = extractApiErrorMessage(\n response,\n \"Failed to unpublish. Skill may not exist.\",\n );\n console.error(`Error: ${errorMessage}`);\n process.exit(1);\n }\n console.log(`Unpublished ${fullName} (all versions)`);\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n console.error(`Error: ${message}`);\n process.exit(1);\n }\n}\n","import { configure, listSkillVersions } from \"@/api-client\";\nimport { getTokenForRegistry, resolveConfig } from \"@/config\";\nimport { extractApiErrorMessage } from \"@/errors\";\nimport { parseRegistrySpecifier, resolveVersion } from \"@/lib/index\";\nimport { listLockfileSkills } from \"@/lockfile\";\nimport { add } from \"./add\";\n\nexport interface UpdateOptions {\n dryRun?: boolean;\n}\n\nexport async function update(options: UpdateOptions): Promise<void> {\n try {\n const config = await resolveConfig();\n const registryUrl = config.registryUrl;\n const apiKey = getTokenForRegistry(config, registryUrl);\n\n const skills = await listLockfileSkills();\n\n if (skills.length === 0) {\n console.log(\"No skills installed.\");\n return;\n }\n\n // Configure SDK - apiKey may be undefined for public packages\n configure({ registryUrl, apiKey });\n\n const updates: Array<{\n name: string;\n current: string;\n latest: string;\n }> = [];\n\n console.log(\"Checking for updates...\\n\");\n\n for (const { name, entry } of skills) {\n const parsed = parseRegistrySpecifier(name);\n if (!parsed) continue;\n\n try {\n const versionsResponse = await listSkillVersions(\n parsed.owner,\n parsed.name,\n );\n if (versionsResponse.status !== 200) {\n const errorMessage = extractApiErrorMessage(\n versionsResponse,\n \"Failed to fetch versions\",\n );\n console.warn(` Warning: ${name}: ${errorMessage}`);\n continue;\n }\n const versions = versionsResponse.data;\n if (versions.length === 0) continue;\n\n const versionStrings = versions.map(\n (v: { version: string }) => v.version,\n );\n const latest = resolveVersion(\"*\", versionStrings);\n\n if (latest && latest !== entry.version) {\n updates.push({\n name,\n current: entry.version,\n latest,\n });\n }\n } catch {\n console.warn(` Warning: Could not check updates for ${name}`);\n }\n }\n\n if (updates.length === 0) {\n console.log(\"All skills are up to date.\");\n return;\n }\n\n console.log(\"Updates available:\\n\");\n for (const { name, current, latest } of updates) {\n console.log(` ${name}: ${current} -> ${latest}`);\n }\n\n if (options.dryRun) {\n console.log(\"\\nDry run - no changes made.\");\n return;\n }\n\n console.log(\"\\nUpdating...\\n\");\n\n for (const { name: pkgName, latest } of updates) {\n const parsed = parseRegistrySpecifier(pkgName);\n if (!parsed) continue;\n\n const specifier = `${pkgName}@${latest}`;\n\n await add([specifier], {});\n }\n\n console.log(\"\\nAll skills updated.\");\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n console.error(`Error: ${message}`);\n process.exit(1);\n }\n}\n","import { execSync } from \"node:child_process\";\nimport * as semver from \"semver\";\n\nexport async function upgrade(): Promise<void> {\n const packageName = \"@anytio/pspm\";\n\n try {\n // Get current version from package.json (already loaded at startup)\n const currentVersion = getCurrentVersion();\n\n // Check latest version from npm registry\n console.log(\"Checking for updates...\\n\");\n const latestVersion = getLatestVersion(packageName);\n\n if (!latestVersion) {\n console.error(\"Error: Could not fetch latest version from registry.\");\n process.exit(1);\n }\n\n if (\n semver.valid(currentVersion) &&\n semver.valid(latestVersion) &&\n !semver.gt(latestVersion, currentVersion)\n ) {\n console.log(`Already on the latest version: ${currentVersion}`);\n return;\n }\n\n console.log(` Current version: ${currentVersion}`);\n console.log(` Latest version: ${latestVersion}\\n`);\n\n // Detect which package manager was used to install\n const pm = detectPackageManager();\n const installCmd = getInstallCommand(pm, packageName, latestVersion);\n\n console.log(`Upgrading via ${pm}...\\n`);\n console.log(` $ ${installCmd}\\n`);\n\n execSync(installCmd, { stdio: \"inherit\" });\n\n console.log(`\\nSuccessfully upgraded to ${latestVersion}`);\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n console.error(`Error: ${message}`);\n process.exit(1);\n }\n}\n\nfunction getCurrentVersion(): string {\n try {\n const output = execSync(\"pspm --version\", {\n encoding: \"utf-8\",\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n }).trim();\n return output;\n } catch {\n return \"unknown\";\n }\n}\n\nfunction getLatestVersion(packageName: string): string | null {\n try {\n const output = execSync(`npm view ${packageName} version`, {\n encoding: \"utf-8\",\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n }).trim();\n return output || null;\n } catch {\n return null;\n }\n}\n\nfunction detectPackageManager(): \"pnpm\" | \"npm\" | \"yarn\" | \"bun\" {\n // Check if installed globally via specific package managers\n try {\n const pnpmList = execSync(\"pnpm list -g --depth=0 2>/dev/null\", {\n encoding: \"utf-8\",\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n if (pnpmList.includes(\"@anytio/pspm\")) return \"pnpm\";\n } catch {}\n\n try {\n const bunList = execSync(\"bun pm ls -g 2>/dev/null\", {\n encoding: \"utf-8\",\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n if (bunList.includes(\"@anytio/pspm\")) return \"bun\";\n } catch {}\n\n try {\n const yarnList = execSync(\"yarn global list 2>/dev/null\", {\n encoding: \"utf-8\",\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n if (yarnList.includes(\"@anytio/pspm\")) return \"yarn\";\n } catch {}\n\n // Default to npm\n return \"npm\";\n}\n\nfunction getInstallCommand(\n pm: \"pnpm\" | \"npm\" | \"yarn\" | \"bun\",\n packageName: string,\n version: string,\n): string {\n switch (pm) {\n case \"pnpm\":\n return `pnpm add -g ${packageName}@${version}`;\n case \"yarn\":\n return `yarn global add ${packageName}@${version}`;\n case \"bun\":\n return `bun add -g ${packageName}@${version}`;\n case \"npm\":\n return `npm install -g ${packageName}@${version}`;\n }\n}\n","import semver from \"semver\";\nimport { getManifestPath, readManifest, writeManifest } from \"@/manifest\";\n\nexport type VersionBump = \"major\" | \"minor\" | \"patch\";\n\nexport interface VersionOptions {\n /** If true, don't actually write the file (just show what would happen) */\n dryRun?: boolean;\n}\n\n/**\n * Bump the version in pspm.json\n *\n * Similar to `npm version major|minor|patch`\n */\nexport async function version(\n bump: VersionBump,\n options: VersionOptions = {},\n): Promise<void> {\n try {\n // Read existing manifest\n const manifest = await readManifest();\n\n if (!manifest) {\n console.error(\"Error: No pspm.json found in current directory.\");\n console.error(\"Run 'pspm init' to create one.\");\n process.exit(1);\n }\n\n if (!manifest.version) {\n console.error(\"Error: pspm.json does not have a version field.\");\n console.error(\n 'Add a version field (e.g., \"version\": \"0.1.0\") to your pspm.json.',\n );\n process.exit(1);\n }\n\n // Validate current version\n if (!semver.valid(manifest.version)) {\n console.error(\n `Error: Current version \"${manifest.version}\" is not valid semver.`,\n );\n console.error(\n 'Fix the version in pspm.json to be valid semver (e.g., \"1.0.0\").',\n );\n process.exit(1);\n }\n\n // Bump the version\n const newVersion = semver.inc(manifest.version, bump);\n\n if (!newVersion) {\n console.error(`Error: Failed to bump version from ${manifest.version}`);\n process.exit(1);\n }\n\n if (options.dryRun) {\n console.log(`Would bump version: ${manifest.version} → ${newVersion}`);\n return;\n }\n\n // Update manifest with new version\n manifest.version = newVersion;\n await writeManifest(manifest);\n\n console.log(`v${newVersion}`);\n console.log(`Updated ${getManifestPath()}`);\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n console.error(`Error: ${message}`);\n process.exit(1);\n }\n}\n","import { whoamiRequest } from \"@/api-client\";\nimport { getRegistryUrl, requireApiKey, resolveConfig } from \"@/config\";\n\nexport async function whoami(): Promise<void> {\n try {\n const resolved = await resolveConfig();\n const apiKey = await requireApiKey();\n const registryUrl = await getRegistryUrl();\n\n const user = await whoamiRequest(registryUrl, apiKey);\n\n if (user) {\n console.log(`Username: ${user.username}`);\n console.log(`User ID: ${user.userId}`);\n console.log(`Registry: ${registryUrl}`);\n } else if (resolved.username) {\n // Use cached username if API call fails\n console.log(`Username: ${resolved.username} (cached)`);\n console.log(`Registry: ${registryUrl}`);\n } else {\n console.error(\"Could not determine current user.\");\n process.exit(1);\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n console.error(`Error: ${message}`);\n process.exit(1);\n }\n}\n","import type { Command } from \"commander\";\nimport { login, logout, whoami } from \"../commands/index\";\n\nexport function registerAuthCommands(program: Command): void {\n program\n .command(\"login\")\n .description(\"Log in via browser or with an API key\")\n .option(\n \"--api-key <key>\",\n \"API key for direct authentication (skips browser)\",\n )\n .action(async (options) => {\n await login({ apiKey: options.apiKey });\n });\n\n program\n .command(\"logout\")\n .description(\"Log out and clear stored credentials\")\n .action(async () => {\n await logout();\n });\n\n program\n .command(\"whoami\")\n .description(\"Show current user information\")\n .action(async () => {\n await whoami();\n });\n}\n","import type { Command } from \"commander\";\nimport { configInit, configShow } from \"../commands/index\";\n\nexport function registerConfigCommands(program: Command): void {\n const configCmd = program\n .command(\"config\")\n .description(\"Manage PSPM configuration\");\n\n configCmd\n .command(\"show\")\n .description(\"Show resolved configuration\")\n .action(async () => {\n await configShow();\n });\n\n configCmd\n .command(\"init\")\n .description(\"Create a .pspmrc file in the current directory\")\n .option(\"--registry <url>\", \"Registry URL override\")\n .action(async (options) => {\n await configInit({\n registry: options.registry,\n });\n });\n\n configCmd\n .command(\"set-encryption-key <scope> <passphrase>\")\n .description(\n \"Set encryption key for a scope (e.g., pspm config set-encryption-key @user/alice my-secret)\",\n )\n .action(async (scope: string, passphrase: string) => {\n const { setEncryptionKey } = await import(\"../config\");\n await setEncryptionKey(scope, passphrase);\n console.log(`Encryption key set for scope \"${scope}\"`);\n });\n\n configCmd\n .command(\"remove-encryption-key <scope>\")\n .description(\"Remove encryption key for a scope\")\n .action(async (scope: string) => {\n const { removeEncryptionKey } = await import(\"../config\");\n await removeEncryptionKey(scope);\n console.log(`Encryption key removed for scope \"${scope}\"`);\n });\n\n configCmd\n .command(\"get-encryption-key <scope>\")\n .description(\"Check if an encryption key is set for a scope\")\n .action(async (scope: string) => {\n const { getEncryptionKey } = await import(\"../config\");\n const key = await getEncryptionKey(scope);\n if (key) {\n const masked = `${key.substring(0, 4)}***`;\n console.log(`Encryption key for \"${scope}\": ${masked} (set)`);\n } else {\n console.log(`No encryption key set for \"${scope}\"`);\n }\n });\n}\n","import type { Command } from \"commander\";\nimport {\n notebookDelete,\n notebookDownload,\n notebookList,\n notebookUpload,\n} from \"../commands/index\";\n\nexport function registerNotebookCommands(program: Command): void {\n const notebookCmd = program\n .command(\"notebook\")\n .description(\"Manage AnyT notebooks\");\n\n notebookCmd\n .command(\"upload <file>\")\n .description(\"Upload a .anyt notebook\")\n .option(\"--org <orgname>\", \"Upload to an organization\")\n .option(\n \"--visibility <visibility>\",\n \"Visibility: private, team, or public\",\n \"private\",\n )\n .option(\"--description <description>\", \"Notebook description\")\n .action(async (file, options) => {\n await notebookUpload(file, options);\n });\n\n notebookCmd\n .command(\"list\")\n .description(\"List notebooks\")\n .option(\"--org <orgname>\", \"List organization notebooks\")\n .action(async (options) => {\n await notebookList(options);\n });\n\n notebookCmd\n .command(\"download <id>\")\n .description(\"Download a notebook by ID\")\n .option(\"-o, --output <path>\", \"Output file path\")\n .action(async (id, options) => {\n await notebookDownload(id, options.output);\n });\n\n notebookCmd\n .command(\"delete <id>\")\n .description(\"Delete a notebook by ID\")\n .action(async (id) => {\n await notebookDelete(id);\n });\n}\n","import type { Command } from \"commander\";\nimport {\n access,\n deprecate,\n publish,\n unpublish,\n version as versionCommand,\n} from \"../commands/index\";\n\nexport function registerPublishCommands(program: Command): void {\n program\n .command(\"version <bump>\")\n .description(\"Bump package version (major, minor, patch)\")\n .option(\"--dry-run\", \"Show what would be changed without writing\")\n .action(async (bump: string, options) => {\n const validBumps = [\"major\", \"minor\", \"patch\"];\n if (!validBumps.includes(bump)) {\n console.error(`Error: Invalid version bump \"${bump}\".`);\n console.error(\"Must be one of: major, minor, patch\");\n process.exit(1);\n }\n await versionCommand(bump as \"major\" | \"minor\" | \"patch\", {\n dryRun: options.dryRun,\n });\n });\n\n program\n .command(\"publish\")\n .description(\"Publish current directory as a skill\")\n .option(\"--bump <level>\", \"Bump version (major, minor, patch)\")\n .option(\"--tag <tag>\", \"Tag for the release\")\n .option(\"--org <orgname>\", \"Publish under an organization namespace\")\n .requiredOption(\n \"--access <level>\",\n \"Set package visibility (public, private, or team)\",\n )\n .action(async (options) => {\n const accessLevel = options.access as string;\n if (\n accessLevel !== \"public\" &&\n accessLevel !== \"private\" &&\n accessLevel !== \"team\"\n ) {\n console.error('Error: --access must be \"public\", \"private\", or \"team\"');\n process.exit(1);\n }\n if (accessLevel === \"team\" && !options.org) {\n console.error(\"Error: --access team requires --org <orgname>\");\n process.exit(1);\n }\n await publish({\n bump: options.bump as \"major\" | \"minor\" | \"patch\" | undefined,\n tag: options.tag,\n access: accessLevel,\n org: options.org,\n });\n });\n\n program\n .command(\"unpublish <specifier>\")\n .description(\n \"Remove a published skill version (only within 72 hours of publishing)\",\n )\n .option(\"--force\", \"Confirm destructive action\")\n .action(async (specifier, options) => {\n await unpublish(specifier, { force: options.force });\n });\n\n program\n .command(\"access [specifier]\")\n .description(\"Change package visibility (public/private)\")\n .option(\"--public\", \"Make the package public (irreversible)\")\n .option(\"--private\", \"Make the package private (only for private packages)\")\n .action(async (specifier, options) => {\n await access(specifier, {\n public: options.public,\n private: options.private,\n });\n });\n\n program\n .command(\"deprecate <specifier> [message]\")\n .description(\n \"Mark a skill version as deprecated (alternative to unpublish after 72 hours)\",\n )\n .option(\"--undo\", \"Remove deprecation status\")\n .action(async (specifier, message, options) => {\n await deprecate(specifier, message, { undo: options.undo });\n });\n}\n","import type { Command } from \"commander\";\nimport {\n add,\n audit,\n init,\n install,\n link,\n list,\n migrate,\n outdated,\n remove,\n search,\n update,\n} from \"../commands/index\";\n\nfunction registerInit(program: Command): void {\n program\n .command(\"init\")\n .description(\"Create a new pspm.json manifest in the current directory\")\n .option(\"-n, --name <name>\", \"Skill name\")\n .option(\"-d, --description <desc>\", \"Skill description\")\n .option(\"-a, --author <author>\", \"Author name\")\n .option(\"-y, --yes\", \"Skip prompts and use defaults\")\n .option(\"-f, --force\", \"Overwrite existing pspm.json\")\n .action(async (options) => {\n await init({\n name: options.name,\n description: options.description,\n author: options.author,\n yes: options.yes,\n force: options.force,\n });\n });\n}\n\nfunction registerMigrate(program: Command): void {\n program\n .command(\"migrate\")\n .description(\n \"Migrate from old directory structure (.skills/, skill-lock.json)\",\n )\n .option(\"--dry-run\", \"Show what would be migrated without making changes\")\n .action(async (options) => {\n await migrate({ dryRun: options.dryRun });\n });\n}\n\nfunction registerAdd(program: Command): void {\n program\n .command(\"add <specifiers...>\")\n .description(\n \"Add skills from registry, GitHub, local paths, or well-known URLs\",\n )\n .option(\"--save\", \"Save to lockfile (default)\")\n .option(\n \"--agent <agents>\",\n 'Comma-separated agents for symlinks (default: all agents, use \"none\" to skip)',\n )\n .option(\"-g, --global\", \"Install to user home directory instead of project\")\n .option(\"-y, --yes\", \"Skip agent selection prompt and use defaults\")\n .action(async (specifiers, options) => {\n await add(specifiers, {\n save: options.save ?? true,\n agent: options.agent,\n yes: options.yes,\n global: options.global,\n });\n });\n}\n\nfunction registerRemove(program: Command): void {\n program\n .command(\"remove <name>\")\n .alias(\"rm\")\n .description(\"Remove an installed skill\")\n .action(async (name) => {\n await remove(name);\n });\n}\n\nfunction registerList(program: Command): void {\n program\n .command(\"list\")\n .alias(\"ls\")\n .description(\"List installed skills\")\n .option(\"--json\", \"Output as JSON\")\n .option(\"-g, --global\", \"List globally installed skills\")\n .action(async (options) => {\n await list({ json: options.json, global: options.global });\n });\n}\n\nfunction registerInstall(program: Command): void {\n program\n .command(\"install [specifiers...]\")\n .alias(\"i\")\n .description(\n \"Install skills from lockfile, or add and install specific packages\",\n )\n .option(\"--frozen-lockfile\", \"Fail if lockfile is missing or outdated\")\n .option(\"--dir <path>\", \"Install skills to a specific directory\")\n .option(\n \"--agent <agents>\",\n 'Comma-separated agents for symlinks (default: all agents, use \"none\" to skip)',\n )\n .option(\n \"--list <specifier>\",\n \"Install all skills from a skill list (e.g. @user/username/list-name)\",\n )\n .option(\"-g, --global\", \"Install to user home directory instead of project\")\n .option(\"-y, --yes\", \"Skip agent selection prompt and use defaults\")\n .action(async (specifiers, options) => {\n await install(specifiers, {\n frozenLockfile: options.frozenLockfile,\n dir: options.dir,\n agent: options.agent,\n list: options.list,\n yes: options.yes,\n global: options.global,\n });\n });\n}\n\nfunction registerLink(program: Command): void {\n program\n .command(\"link\")\n .description(\"Recreate agent symlinks without reinstalling\")\n .option(\n \"--agent <agents>\",\n 'Comma-separated agents for symlinks (default: all agents, use \"none\" to skip)',\n )\n .option(\"-g, --global\", \"Recreate global agent symlinks\")\n .option(\"-y, --yes\", \"Skip agent selection prompt and use defaults\")\n .action(async (options) => {\n await link({\n agent: options.agent,\n yes: options.yes,\n global: options.global,\n });\n });\n}\n\nfunction registerUpdate(program: Command): void {\n program\n .command(\"update\")\n .description(\"Update all skills to latest compatible versions\")\n .option(\"--dry-run\", \"Show what would be updated without making changes\")\n .action(async (options) => {\n await update({ dryRun: options.dryRun });\n });\n}\n\nfunction registerSearch(program: Command): void {\n program\n .command(\"search [query]\")\n .alias(\"find\")\n .description(\"Search and discover skills from the registry\")\n .option(\n \"-s, --sort <sort>\",\n \"Sort by: downloads, recent, name (default: downloads)\",\n )\n .option(\"-l, --limit <n>\", \"Maximum results (default: 20)\", Number.parseInt)\n .option(\"--json\", \"Output as JSON\")\n .action(async (query: string | undefined, options) => {\n await search(query, {\n sort: options.sort,\n limit: options.limit,\n json: options.json,\n });\n });\n}\n\nfunction registerAudit(program: Command): void {\n program\n .command(\"audit\")\n .description(\"Verify integrity of installed skills and check for issues\")\n .option(\"--json\", \"Output as JSON\")\n .action(async (options) => {\n await audit({ json: options.json });\n });\n}\n\nfunction registerOutdated(program: Command): void {\n program\n .command(\"outdated [packages...]\")\n .description(\"Check for outdated skills\")\n .option(\"--json\", \"Output as JSON\")\n .option(\"--all\", \"Include up-to-date packages\")\n .action(async (packages: string[], options) => {\n await outdated(packages, { json: options.json, all: options.all });\n });\n}\n\nexport function registerSkillCommands(program: Command): void {\n registerInit(program);\n registerMigrate(program);\n registerAdd(program);\n registerRemove(program);\n registerList(program);\n registerInstall(program);\n registerLink(program);\n registerUpdate(program);\n registerSearch(program);\n registerAudit(program);\n registerOutdated(program);\n}\n","import type { Command } from \"commander\";\nimport {\n skillListAddSkill,\n skillListCreate,\n skillListDelete,\n skillListInstall,\n skillListList,\n skillListRemoveSkill,\n skillListShow,\n skillListUpdate,\n} from \"../commands/index\";\n\nexport function registerSkillListCommands(program: Command): void {\n const skillListCmd = program\n .command(\"skill-list\")\n .description(\"Manage skill lists (collections of skills)\");\n\n skillListCmd\n .command(\"list\")\n .description(\"List your skill lists\")\n .option(\"--org <orgname>\", \"List organization skill lists\")\n .option(\"--json\", \"Output as JSON\")\n .action(async (options) => {\n await skillListList({ org: options.org, json: options.json });\n });\n\n skillListCmd\n .command(\"create <name>\")\n .description(\"Create a new skill list\")\n .option(\"-d, --description <description>\", \"List description\")\n .option(\n \"--visibility <visibility>\",\n \"Visibility: private or public\",\n \"private\",\n )\n .option(\"--org <orgname>\", \"Create under an organization\")\n .action(async (name, options) => {\n await skillListCreate(name, {\n description: options.description,\n visibility: options.visibility,\n org: options.org,\n });\n });\n\n skillListCmd\n .command(\"show <specifier>\")\n .description(\"Show skill list details (e.g. @user/alice/my-tools)\")\n .option(\"--json\", \"Output as JSON\")\n .action(async (specifier, options) => {\n await skillListShow(specifier, { json: options.json });\n });\n\n skillListCmd\n .command(\"delete <specifier>\")\n .description(\"Delete a skill list\")\n .action(async (specifier) => {\n await skillListDelete(specifier);\n });\n\n skillListCmd\n .command(\"update <specifier>\")\n .description(\"Update skill list metadata\")\n .option(\"-d, --description <description>\", \"New description\")\n .option(\"--visibility <visibility>\", \"New visibility: private or public\")\n .action(async (specifier, options) => {\n await skillListUpdate(specifier, {\n description: options.description,\n visibility: options.visibility,\n });\n });\n\n skillListCmd\n .command(\"add-skill <specifier> <skills...>\")\n .description(\n \"Add skills to a list (e.g. pspm skill-list add-skill @user/me/my-list @user/alice/tool)\",\n )\n .option(\"--note <note>\", \"Note for the added skill\")\n .action(async (specifier, skills, options) => {\n await skillListAddSkill(specifier, skills, {\n note: options.note,\n });\n });\n\n skillListCmd\n .command(\"remove-skill <specifier> <skill>\")\n .description(\"Remove a skill from a list\")\n .action(async (specifier, skill) => {\n await skillListRemoveSkill(specifier, skill);\n });\n\n skillListCmd\n .command(\"install <specifier>\")\n .description(\n \"Install all skills from a list (e.g. pspm skill-list install @user/alice/my-tools)\",\n )\n .option(\n \"--agent <agents>\",\n 'Comma-separated agents for symlinks (default: all agents, use \"none\" to skip)',\n )\n .option(\"--dir <path>\", \"Install skills to a specific directory\")\n .option(\"-g, --global\", \"Install to user home directory instead of project\")\n .option(\"-y, --yes\", \"Skip agent selection prompt and use defaults\")\n .action(async (specifier, options) => {\n await skillListInstall(specifier, {\n agent: options.agent,\n yes: options.yes,\n global: options.global,\n dir: options.dir,\n });\n });\n}\n","import { execSync } from \"node:child_process\";\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { isNewerVersion } from \"@/lib/version\";\n\nconst PACKAGE_NAME = \"@anytio/pspm\";\nconst CHECK_INTERVAL_MS = 24 * 60 * 60 * 1000; // 24 hours\nconst CACHE_DIR = join(homedir(), \".pspm\");\nconst CACHE_FILE = join(CACHE_DIR, \"update-check.json\");\n\ninterface UpdateCache {\n lastCheck: number;\n latestVersion: string;\n}\n\n/**\n * Check for updates in the background and print a warning if outdated.\n * This is non-blocking — it reads from cache and spawns a background check.\n */\nexport async function checkForUpdates(currentVersion: string): Promise<void> {\n try {\n const cache = await readCache();\n\n // If cache exists and is fresh, show warning if needed\n if (cache && Date.now() - cache.lastCheck < CHECK_INTERVAL_MS) {\n if (isNewerVersion(cache.latestVersion, currentVersion)) {\n printUpdateWarning(currentVersion, cache.latestVersion);\n }\n return;\n }\n\n // Cache is stale or missing — fetch in background\n fetchAndCache(currentVersion);\n } catch {\n // Never let update checking break the CLI\n }\n}\n\nasync function readCache(): Promise<UpdateCache | null> {\n try {\n const content = await readFile(CACHE_FILE, \"utf-8\");\n return JSON.parse(content) as UpdateCache;\n } catch {\n return null;\n }\n}\n\nasync function writeCache(cache: UpdateCache): Promise<void> {\n await mkdir(CACHE_DIR, { recursive: true });\n await writeFile(CACHE_FILE, JSON.stringify(cache));\n}\n\n/**\n * Fetch latest version and update cache.\n * Runs synchronously but is called after command execution so it doesn't block UX.\n */\nfunction fetchAndCache(currentVersion: string): void {\n try {\n const latestVersion = execSync(`npm view ${PACKAGE_NAME} version`, {\n encoding: \"utf-8\",\n timeout: 5000,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n }).trim();\n\n if (!latestVersion) return;\n\n const cache: UpdateCache = {\n lastCheck: Date.now(),\n latestVersion,\n };\n\n // Write cache (fire and forget)\n writeCache(cache).catch(() => {});\n\n if (isNewerVersion(latestVersion, currentVersion)) {\n printUpdateWarning(currentVersion, latestVersion);\n }\n } catch {\n // Network error or npm not available — silently ignore\n }\n}\n\nfunction printUpdateWarning(\n currentVersion: string,\n latestVersion: string,\n): void {\n console.warn(\n `\\n Update available: ${currentVersion} → ${latestVersion}` +\n \"\\n Run `pspm upgrade` to update\\n\",\n );\n}\n","#!/usr/bin/env node\n\nimport { readFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { Command } from \"commander\";\nimport { registerAuthCommands } from \"./cli/auth-commands\";\nimport { registerConfigCommands } from \"./cli/config-commands\";\nimport { registerNotebookCommands } from \"./cli/notebook-commands\";\nimport { registerPublishCommands } from \"./cli/publish-commands\";\nimport { registerSkillCommands } from \"./cli/skill-commands\";\nimport { registerSkillListCommands } from \"./cli/skill-list-commands\";\nimport { upgrade } from \"./commands/index\";\nimport { checkForUpdates } from \"./update-notifier\";\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\nconst packageJson = JSON.parse(\n readFileSync(join(__dirname, \"..\", \"package.json\"), \"utf-8\"),\n);\nconst version: string = packageJson.version;\n\nconst program = new Command();\n\nprogram\n .name(\"pspm\")\n .description(\"Package manager for AI agent skills\")\n .version(version);\n\nregisterConfigCommands(program);\n\nprogram\n .command(\"upgrade\")\n .description(\"Upgrade pspm to the latest version\")\n .action(async () => {\n await upgrade();\n });\n\nregisterAuthCommands(program);\nregisterSkillCommands(program);\nregisterPublishCommands(program);\nregisterSkillListCommands(program);\nregisterNotebookCommands(program);\n\nawait program.parseAsync();\n\nconst executedCommand = program.args[0];\nif (executedCommand !== \"upgrade\") {\n await checkForUpdates(version);\n}\n"],"mappings":"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"}