@senso-ai/shipables 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +836 -227
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/lib/config.ts","../src/registry/client.ts","../src/adapters/base.ts","../src/adapters/claude.ts","../src/adapters/cursor.ts","../src/adapters/codex.ts","../src/adapters/copilot.ts","../src/adapters/gemini.ts","../src/adapters/cline.ts","../src/adapters/index.ts","../src/lib/tarball.ts","../src/lib/hash.ts","../src/mcp/config.ts","../src/lib/output.ts","../src/commands/install.ts","../src/index.ts","../src/commands/uninstall.ts","../src/commands/search.ts","../src/commands/info.ts","../src/commands/list.ts","../src/commands/update.ts","../src/commands/publish.ts","../src/skill/parser.ts","../src/skill/manifest.ts","../src/commands/unpublish.ts","../src/commands/init.ts","../src/commands/login.ts","../src/commands/doctor.ts","../src/commands/config.ts","../src/commands/stats.ts","../src/commands/profile.ts"],"sourcesContent":["import { readFile, writeFile, mkdir } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport type {\n CliConfig,\n InstalledJson,\n InstallationRecord,\n} from \"./types.js\";\n\nconst CONFIG_DIR = join(homedir(), \".shipables\");\nconst CONFIG_FILE = join(CONFIG_DIR, \"config.json\");\nconst INSTALLED_FILE = join(CONFIG_DIR, \"installed.json\");\nconst CACHE_DIR = join(CONFIG_DIR, \"cache\");\n\nconst DEFAULT_REGISTRY = \"https://api.shipables.dev\";\n\nexport function getConfigDir(): string {\n return CONFIG_DIR;\n}\n\nexport function getCacheDir(): string {\n return CACHE_DIR;\n}\n\nasync function ensureDir(dir: string): Promise<void> {\n await mkdir(dir, { recursive: true });\n}\n\nexport async function loadConfig(): Promise<CliConfig> {\n try {\n const raw = await readFile(CONFIG_FILE, \"utf-8\");\n return JSON.parse(raw) as CliConfig;\n } catch {\n return { registry: DEFAULT_REGISTRY };\n }\n}\n\nexport async function saveConfig(config: CliConfig): Promise<void> {\n await ensureDir(CONFIG_DIR);\n await writeFile(CONFIG_FILE, JSON.stringify(config, null, 2) + \"\\n\", \"utf-8\");\n}\n\nexport async function getRegistry(): Promise<string> {\n const config = await loadConfig();\n return config.registry || DEFAULT_REGISTRY;\n}\n\nexport async function getToken(): Promise<string | undefined> {\n const config = await loadConfig();\n return config.token;\n}\n\nexport async function loadInstalled(): Promise<InstalledJson> {\n try {\n const raw = await readFile(INSTALLED_FILE, \"utf-8\");\n return JSON.parse(raw) as InstalledJson;\n } catch {\n return { version: 1, installations: {} };\n }\n}\n\nexport async function saveInstalled(data: InstalledJson): Promise<void> {\n await ensureDir(CONFIG_DIR);\n await writeFile(\n INSTALLED_FILE,\n JSON.stringify(data, null, 2) + \"\\n\",\n \"utf-8\",\n );\n}\n\nexport async function addInstallation(\n projectPath: string,\n skillName: string,\n record: InstallationRecord,\n): Promise<void> {\n const data = await loadInstalled();\n if (!data.installations[projectPath]) {\n data.installations[projectPath] = {};\n }\n data.installations[projectPath][skillName] = record;\n await saveInstalled(data);\n}\n\nexport async function removeInstallation(\n projectPath: string,\n skillName: string,\n): Promise<void> {\n const data = await loadInstalled();\n if (data.installations[projectPath]) {\n delete data.installations[projectPath][skillName];\n if (Object.keys(data.installations[projectPath]).length === 0) {\n delete data.installations[projectPath];\n }\n }\n await saveInstalled(data);\n}\n\nexport async function updateInstallation(\n projectPath: string,\n skillName: string,\n record: InstallationRecord,\n): Promise<void> {\n const data = await loadInstalled();\n if (data.installations[projectPath]) {\n data.installations[projectPath][skillName] = record;\n await saveInstalled(data);\n }\n}\n\nexport async function getInstallation(\n projectPath: string,\n skillName: string,\n): Promise<InstallationRecord | undefined> {\n const data = await loadInstalled();\n return data.installations[projectPath]?.[skillName];\n}\n\nexport async function getProjectInstallations(\n projectPath: string,\n): Promise<Record<string, InstallationRecord>> {\n const data = await loadInstalled();\n return data.installations[projectPath] || {};\n}\n\nexport async function ensureCacheDir(): Promise<string> {\n await ensureDir(CACHE_DIR);\n return CACHE_DIR;\n}\n","import { createReadStream } from \"node:fs\";\nimport { readFile } from \"node:fs/promises\";\nimport { basename, join, dirname } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { getRegistry, getToken } from \"../lib/config.js\";\nimport type {\n SkillSearchResponse,\n SkillDetailResponse,\n VersionDetailResponse,\n PublishResponse,\n DownloadStatsResponse,\n UserProfileResponse,\n MeResponse,\n} from \"../lib/types.js\";\n\nlet cachedVersion: string | null = null;\n\nasync function getCliVersion(): Promise<string> {\n if (cachedVersion) return cachedVersion;\n try {\n const pkgPath = join(dirname(fileURLToPath(import.meta.url)), \"..\", \"package.json\");\n const pkg = JSON.parse(await readFile(pkgPath, \"utf-8\"));\n cachedVersion = pkg.version || \"0.0.0\";\n } catch {\n cachedVersion = \"0.0.0\";\n }\n return cachedVersion!;\n}\n\nexport class RegistryClient {\n private registryUrl: string | null = null;\n private token: string | undefined;\n\n private async getBaseUrl(): Promise<string> {\n if (!this.registryUrl) {\n this.registryUrl = await getRegistry();\n }\n return this.registryUrl;\n }\n\n private async getHeaders(\n auth = false,\n ): Promise<Record<string, string>> {\n const version = await getCliVersion();\n const headers: Record<string, string> = {\n \"User-Agent\": `shipables-cli/${version}`,\n };\n if (auth) {\n if (!this.token) {\n this.token = await getToken();\n }\n if (this.token) {\n headers[\"Authorization\"] = `Bearer ${this.token}`;\n }\n }\n return headers;\n }\n\n private encodeFullName(fullName: string): string {\n // @scope/name → scope/name for URL path\n if (fullName.startsWith(\"@\")) {\n const withoutAt = fullName.slice(1);\n const [scope, name] = withoutAt.split(\"/\");\n return `${encodeURIComponent(scope)}/${encodeURIComponent(name)}`;\n }\n // Scope/name (without @) → Scope/name for URL path\n if (fullName.includes(\"/\")) {\n const [scope, name] = fullName.split(\"/\");\n return `${encodeURIComponent(scope)}/${encodeURIComponent(name)}`;\n }\n return encodeURIComponent(fullName);\n }\n\n private async fetchJson<T>(\n url: string,\n init?: RequestInit,\n ): Promise<Response> {\n const base = await this.getBaseUrl();\n try {\n return await fetch(url, init);\n } catch (err) {\n if (err instanceof TypeError && (err as Error).message === \"fetch failed\") {\n throw new Error(\n `Could not connect to registry at ${base}. Check your internet connection or registry URL.`,\n );\n }\n throw err;\n }\n }\n\n async search(params: {\n q?: string;\n category?: string;\n agent?: string;\n scope?: string;\n sort?: string;\n limit?: number;\n page?: number;\n }): Promise<SkillSearchResponse> {\n const base = await this.getBaseUrl();\n const url = new URL(`${base}/api/v1/skills`);\n if (params.q) url.searchParams.set(\"q\", params.q);\n if (params.category) url.searchParams.set(\"category\", params.category);\n if (params.agent) url.searchParams.set(\"agent\", params.agent);\n if (params.scope) url.searchParams.set(\"scope\", params.scope);\n if (params.sort) url.searchParams.set(\"sort\", params.sort);\n if (params.limit) url.searchParams.set(\"per_page\", String(params.limit));\n if (params.page) url.searchParams.set(\"page\", String(params.page));\n\n const resp = await this.fetchJson(url.toString(), {\n headers: await this.getHeaders(),\n });\n if (!resp.ok) {\n throw new Error(`Search failed: ${resp.status} ${resp.statusText}`);\n }\n return (await resp.json()) as SkillSearchResponse;\n }\n\n async getSkillDetail(fullName: string): Promise<SkillDetailResponse> {\n const base = await this.getBaseUrl();\n const encoded = this.encodeFullName(fullName);\n const resp = await this.fetchJson(`${base}/api/v1/skills/${encoded}`, {\n headers: await this.getHeaders(),\n });\n if (!resp.ok) {\n if (resp.status === 404) {\n throw new Error(`Skill not found: ${fullName}`);\n }\n throw new Error(\n `Failed to get skill detail: ${resp.status} ${resp.statusText}`,\n );\n }\n return (await resp.json()) as SkillDetailResponse;\n }\n\n async getVersionDetail(\n fullName: string,\n version: string,\n ): Promise<VersionDetailResponse> {\n const base = await this.getBaseUrl();\n const encoded = this.encodeFullName(fullName);\n const resp = await this.fetchJson(\n `${base}/api/v1/skills/${encoded}/versions/${encodeURIComponent(version)}`,\n { headers: await this.getHeaders() },\n );\n if (!resp.ok) {\n if (resp.status === 404) {\n throw new Error(`Version not found: ${fullName}@${version}`);\n }\n throw new Error(\n `Failed to get version: ${resp.status} ${resp.statusText}`,\n );\n }\n return (await resp.json()) as VersionDetailResponse;\n }\n\n async downloadTarball(\n fullName: string,\n filename: string,\n ): Promise<{ data: Buffer; integrity: string }> {\n const base = await this.getBaseUrl();\n const encoded = this.encodeFullName(fullName);\n const resp = await this.fetchJson(\n `${base}/api/v1/skills/${encoded}/-/${encodeURIComponent(filename)}`,\n { headers: await this.getHeaders() },\n );\n if (!resp.ok) {\n throw new Error(\n `Failed to download tarball: ${resp.status} ${resp.statusText}`,\n );\n }\n const integrity = resp.headers.get(\"X-Integrity\") || \"\";\n const arrayBuf = await resp.arrayBuffer();\n return { data: Buffer.from(arrayBuf), integrity };\n }\n\n async publishWithName(\n fullName: string,\n tarballPath: string,\n ): Promise<PublishResponse> {\n const base = await this.getBaseUrl();\n const headers = await this.getHeaders(true);\n\n if (!headers[\"Authorization\"]) {\n throw new Error(\n \"Not authenticated. Run `shipables login` first.\",\n );\n }\n\n const fileStream = createReadStream(tarballPath);\n const chunks: Buffer[] = [];\n for await (const chunk of fileStream) {\n chunks.push(chunk as Buffer);\n }\n const fileBuffer = Buffer.concat(chunks);\n const fileName = basename(tarballPath);\n\n const formData = new FormData();\n const blob = new Blob([fileBuffer], { type: \"application/gzip\" });\n formData.append(\"tarball\", blob, fileName);\n\n const encoded = this.encodeFullName(fullName);\n const resp = await this.fetchJson(`${base}/api/v1/skills/${encoded}`, {\n method: \"PUT\",\n headers,\n body: formData,\n });\n\n if (!resp.ok) {\n const body = await resp.text();\n let message = `Publish failed: ${resp.status} ${resp.statusText}`;\n try {\n const err = JSON.parse(body);\n if (err.error?.message) message = err.error.message;\n } catch {\n // ignore\n }\n throw new Error(message);\n }\n return (await resp.json()) as PublishResponse;\n }\n\n async unpublishVersion(\n fullName: string,\n version: string,\n ): Promise<void> {\n const base = await this.getBaseUrl();\n const encoded = this.encodeFullName(fullName);\n const resp = await this.fetchJson(\n `${base}/api/v1/skills/${encoded}/versions/${encodeURIComponent(version)}`,\n {\n method: \"DELETE\",\n headers: await this.getHeaders(true),\n },\n );\n if (!resp.ok) {\n if (resp.status === 404) {\n throw new Error(`Version not found: ${fullName}@${version}`);\n }\n const body = await resp.text();\n let message = `Unpublish failed: ${resp.status} ${resp.statusText}`;\n try {\n const err = JSON.parse(body);\n if (err.error?.message) message = err.error.message;\n } catch {\n // ignore\n }\n throw new Error(message);\n }\n }\n\n async getDownloadStats(\n fullName: string,\n period = \"month\",\n ): Promise<DownloadStatsResponse> {\n const base = await this.getBaseUrl();\n const encoded = this.encodeFullName(fullName);\n const resp = await this.fetchJson(\n `${base}/api/v1/skills/${encoded}/downloads?period=${encodeURIComponent(period)}`,\n { headers: await this.getHeaders() },\n );\n if (!resp.ok) {\n if (resp.status === 404) {\n throw new Error(`Skill not found: ${fullName}`);\n }\n throw new Error(\n `Failed to get download stats: ${resp.status} ${resp.statusText}`,\n );\n }\n return (await resp.json()) as DownloadStatsResponse;\n }\n\n async getUserProfile(\n username: string,\n ): Promise<UserProfileResponse> {\n const base = await this.getBaseUrl();\n const resp = await this.fetchJson(\n `${base}/api/v1/users/${encodeURIComponent(username)}`,\n { headers: await this.getHeaders() },\n );\n if (!resp.ok) {\n if (resp.status === 404) {\n throw new Error(`User not found: ${username}`);\n }\n throw new Error(\n `Failed to get user profile: ${resp.status} ${resp.statusText}`,\n );\n }\n return (await resp.json()) as UserProfileResponse;\n }\n\n async getUserSkills(\n username: string,\n ): Promise<SkillSearchResponse> {\n const base = await this.getBaseUrl();\n const resp = await this.fetchJson(\n `${base}/api/v1/users/${encodeURIComponent(username)}/skills`,\n { headers: await this.getHeaders() },\n );\n if (!resp.ok) {\n throw new Error(\n `Failed to get user skills: ${resp.status} ${resp.statusText}`,\n );\n }\n return (await resp.json()) as SkillSearchResponse;\n }\n\n async getMe(): Promise<MeResponse> {\n const base = await this.getBaseUrl();\n const resp = await this.fetchJson(`${base}/api/v1/auth/me`, {\n headers: await this.getHeaders(true),\n });\n if (!resp.ok) {\n if (resp.status === 401) {\n throw new Error(\"Not authenticated. Run `shipables login` first.\");\n }\n throw new Error(`Failed to get profile: ${resp.status}`);\n }\n return (await resp.json()) as MeResponse;\n }\n}\n\nexport const registry = new RegistryClient();\n","import { access, readFile, writeFile, mkdir, stat } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { execSync } from \"node:child_process\";\nimport type {\n AgentAdapter,\n McpServerConfig,\n ValidationResult,\n ValidationCheck,\n} from \"./types.js\";\n\nexport interface AdapterConfig {\n name: string;\n displayName: string;\n /** How to detect: binary names in PATH and/or directories that indicate installation */\n detectBinaries?: string[];\n detectDirs?: string[];\n /** Skill directory templates. Use {name} for skill name */\n projectSkillDir: string;\n globalSkillDir: string;\n /** MCP config file paths (null if no MCP support) */\n projectMcpConfig: string | null;\n globalMcpConfig: string | null;\n /** The JSON key that holds MCP server entries. Usually \"mcpServers\" or \"servers\" */\n mcpServersKey: string;\n}\n\nfunction expandHome(p: string): string {\n if (p.startsWith(\"~/\")) {\n return join(process.env.HOME || \"\", p.slice(2));\n }\n return p;\n}\n\nfunction binaryExists(name: string): boolean {\n try {\n execSync(`which ${name}`, { stdio: \"ignore\" });\n return true;\n } catch {\n return false;\n }\n}\n\nasync function dirExists(path: string): Promise<boolean> {\n try {\n const s = await stat(expandHome(path));\n return s.isDirectory();\n } catch {\n return false;\n }\n}\n\nasync function fileExists(path: string): Promise<boolean> {\n try {\n await access(path);\n return true;\n } catch {\n return false;\n }\n}\n\nexport function createAdapter(config: AdapterConfig): AgentAdapter {\n return {\n name: config.name,\n displayName: config.displayName,\n\n async detect(): Promise<boolean> {\n // Check binaries\n if (config.detectBinaries) {\n for (const bin of config.detectBinaries) {\n if (binaryExists(bin)) return true;\n }\n }\n // Check directories\n if (config.detectDirs) {\n for (const dir of config.detectDirs) {\n if (await dirExists(dir)) return true;\n }\n }\n return false;\n },\n\n getSkillDir(skillName: string, scope: \"project\" | \"global\"): string {\n const template =\n scope === \"global\"\n ? config.globalSkillDir\n : config.projectSkillDir;\n return expandHome(template.replace(\"{name}\", skillName));\n },\n\n getMcpConfigPath(scope: \"project\" | \"global\"): string | null {\n const path =\n scope === \"global\"\n ? config.globalMcpConfig\n : config.projectMcpConfig;\n return path ? expandHome(path) : null;\n },\n\n async writeMcpConfig(\n configPath: string,\n serverName: string,\n serverConfig: McpServerConfig,\n ): Promise<void> {\n const fullPath = expandHome(configPath);\n let existing: Record<string, unknown> = {};\n\n if (await fileExists(fullPath)) {\n try {\n const raw = await readFile(fullPath, \"utf-8\");\n existing = JSON.parse(raw);\n } catch {\n // File exists but is invalid JSON — start fresh\n }\n } else {\n // Ensure directory exists\n const dir = join(fullPath, \"..\");\n await mkdir(dir, { recursive: true });\n }\n\n const key = config.mcpServersKey;\n if (!existing[key] || typeof existing[key] !== \"object\") {\n existing[key] = {};\n }\n\n (existing[key] as Record<string, unknown>)[serverName] = serverConfig;\n await writeFile(fullPath, JSON.stringify(existing, null, 2) + \"\\n\", \"utf-8\");\n },\n\n async removeMcpConfig(\n configPath: string,\n serverName: string,\n ): Promise<void> {\n const fullPath = expandHome(configPath);\n if (!(await fileExists(fullPath))) return;\n\n try {\n const raw = await readFile(fullPath, \"utf-8\");\n const existing = JSON.parse(raw) as Record<string, unknown>;\n const key = config.mcpServersKey;\n const servers = existing[key] as Record<string, unknown> | undefined;\n if (servers && serverName in servers) {\n delete servers[serverName];\n await writeFile(\n fullPath,\n JSON.stringify(existing, null, 2) + \"\\n\",\n \"utf-8\",\n );\n }\n } catch {\n // Ignore errors reading/parsing\n }\n },\n\n async validate(\n skillName: string,\n skillDir: string,\n mcpConfigPath: string | null,\n ): Promise<ValidationResult> {\n const checks: ValidationCheck[] = [];\n\n // Check skill directory exists\n const skillDirFull = expandHome(skillDir);\n if (await dirExists(skillDirFull)) {\n checks.push({\n label: `Skill directory present: ${skillDir}`,\n status: \"pass\",\n });\n\n // Check SKILL.md exists\n if (await fileExists(join(skillDirFull, \"SKILL.md\"))) {\n checks.push({ label: \"SKILL.md present\", status: \"pass\" });\n } else {\n checks.push({\n label: \"SKILL.md missing\",\n status: \"fail\",\n message: `Expected at ${join(skillDir, \"SKILL.md\")}`,\n });\n }\n } else {\n checks.push({\n label: `Skill directory missing: ${skillDir}`,\n status: \"fail\",\n });\n }\n\n // Check MCP config\n if (mcpConfigPath) {\n const mcpFull = expandHome(mcpConfigPath);\n if (await fileExists(mcpFull)) {\n try {\n const raw = await readFile(mcpFull, \"utf-8\");\n const parsed = JSON.parse(raw) as Record<string, unknown>;\n const key = config.mcpServersKey;\n const servers = parsed[key] as Record<string, unknown> | undefined;\n if (servers && skillName in servers) {\n checks.push({\n label: `MCP server config present in ${mcpConfigPath}`,\n status: \"pass\",\n });\n } else {\n checks.push({\n label: `MCP server config missing in ${mcpConfigPath}`,\n status: \"warn\",\n message: \"MCP server entry not found\",\n });\n }\n } catch {\n checks.push({\n label: `MCP config file invalid: ${mcpConfigPath}`,\n status: \"warn\",\n message: \"Could not parse JSON\",\n });\n }\n }\n }\n\n const healthy = checks.every((c) => c.status !== \"fail\");\n return { healthy, checks };\n },\n };\n}\n","import { createAdapter } from \"./base.js\";\n\nexport const claudeAdapter = createAdapter({\n name: \"claude\",\n displayName: \"Claude Code\",\n detectBinaries: [\"claude\"],\n detectDirs: [\"~/.claude\"],\n projectSkillDir: \".claude/skills/{name}\",\n globalSkillDir: \"~/.claude/skills/{name}\",\n projectMcpConfig: \".claude/settings.json\",\n globalMcpConfig: \"~/.claude/settings.json\",\n mcpServersKey: \"mcpServers\",\n});\n","import { createAdapter } from \"./base.js\";\n\nexport const cursorAdapter = createAdapter({\n name: \"cursor\",\n displayName: \"Cursor\",\n detectDirs: [\".cursor\", \"~/.cursor\"],\n projectSkillDir: \".cursor/skills/{name}\",\n globalSkillDir: \"~/.cursor/skills/{name}\",\n projectMcpConfig: \".cursor/mcp.json\",\n globalMcpConfig: \"~/.cursor/mcp.json\",\n mcpServersKey: \"mcpServers\",\n});\n","import { createAdapter } from \"./base.js\";\n\nexport const codexAdapter = createAdapter({\n name: \"codex\",\n displayName: \"Codex CLI\",\n detectBinaries: [\"codex\"],\n detectDirs: [\"~/.codex\"],\n projectSkillDir: \".agents/skills/{name}\",\n globalSkillDir: \"~/.agents/skills/{name}\",\n projectMcpConfig: \".codex/mcp.json\",\n globalMcpConfig: \"~/.codex/mcp.json\",\n mcpServersKey: \"mcpServers\",\n});\n","import { createAdapter } from \"./base.js\";\n\nexport const copilotAdapter = createAdapter({\n name: \"copilot\",\n displayName: \"VS Code / Copilot\",\n detectDirs: [\".vscode\"],\n projectSkillDir: \".agents/skills/{name}\",\n globalSkillDir: \"~/.agents/skills/{name}\",\n projectMcpConfig: \".vscode/mcp.json\",\n globalMcpConfig: null,\n mcpServersKey: \"servers\",\n});\n","import { createAdapter } from \"./base.js\";\n\nexport const geminiAdapter = createAdapter({\n name: \"gemini\",\n displayName: \"Gemini CLI\",\n detectBinaries: [\"gemini\"],\n projectSkillDir: \".agents/skills/{name}\",\n globalSkillDir: \"~/.agents/skills/{name}\",\n projectMcpConfig: \".gemini/settings.json\",\n globalMcpConfig: \"~/.gemini/settings.json\",\n mcpServersKey: \"mcpServers\",\n});\n","import { createAdapter } from \"./base.js\";\n\nexport const clineAdapter = createAdapter({\n name: \"cline\",\n displayName: \"Cline\",\n detectDirs: [\".cline\"],\n projectSkillDir: \".agents/skills/{name}\",\n globalSkillDir: \"~/.agents/skills/{name}\",\n projectMcpConfig: \".cline/mcp_settings.json\",\n globalMcpConfig: \"~/.cline/mcp_settings.json\",\n mcpServersKey: \"mcpServers\",\n});\n","import type { AgentAdapter } from \"./types.js\";\nimport { claudeAdapter } from \"./claude.js\";\nimport { cursorAdapter } from \"./cursor.js\";\nimport { codexAdapter } from \"./codex.js\";\nimport { copilotAdapter } from \"./copilot.js\";\nimport { geminiAdapter } from \"./gemini.js\";\nimport { clineAdapter } from \"./cline.js\";\n\nexport type { AgentAdapter, McpServerConfig, ValidationResult, ValidationCheck } from \"./types.js\";\n\nexport const ALL_ADAPTERS: AgentAdapter[] = [\n claudeAdapter,\n cursorAdapter,\n codexAdapter,\n copilotAdapter,\n geminiAdapter,\n clineAdapter,\n];\n\nexport function getAdapter(name: string): AgentAdapter | undefined {\n return ALL_ADAPTERS.find((a) => a.name === name);\n}\n\nexport async function detectAgents(): Promise<AgentAdapter[]> {\n const detected: AgentAdapter[] = [];\n for (const adapter of ALL_ADAPTERS) {\n if (await adapter.detect()) {\n detected.push(adapter);\n }\n }\n return detected;\n}\n\nexport function getAdapterNames(): string[] {\n return ALL_ADAPTERS.map((a) => a.name);\n}\n","import { writeFile, mkdtemp, readdir, stat } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { tmpdir } from \"node:os\";\nimport * as tar from \"tar\";\n\nexport async function extractTarball(\n tarballData: Buffer,\n destDir?: string,\n): Promise<string> {\n const extractDir = destDir || (await mkdtemp(join(tmpdir(), \"shipables-\")));\n\n // Write the buffer to a temporary file, then extract\n const tmpFile = join(extractDir, \"__tarball.tgz\");\n await writeFile(tmpFile, tarballData);\n\n await tar.extract({\n file: tmpFile,\n cwd: extractDir,\n });\n\n // Clean up the temp tarball\n const { unlink } = await import(\"node:fs/promises\");\n await unlink(tmpFile);\n\n return extractDir;\n}\n\nexport async function createTarball(\n sourceDir: string,\n outputPath: string,\n ignorePatterns: string[] = [],\n): Promise<void> {\n const defaultIgnore = [\n \"node_modules\",\n \".git\",\n \".env\",\n \".DS_Store\",\n \"*.tgz\",\n \"__tarball.tgz\",\n ];\n const allIgnore = [...new Set([...defaultIgnore, ...ignorePatterns])];\n\n // Get the entries in the source dir, filtering out ignored patterns\n const entries = await getEntries(sourceDir, allIgnore);\n\n await tar.create(\n {\n gzip: true,\n file: outputPath,\n cwd: sourceDir,\n },\n entries,\n );\n}\n\nasync function getEntries(\n dir: string,\n ignorePatterns: string[],\n prefix = \"\",\n): Promise<string[]> {\n const entries: string[] = [];\n const items = await readdir(dir);\n\n for (const item of items) {\n const relativePath = prefix ? `${prefix}/${item}` : item;\n\n // Check if this matches any ignore pattern\n if (shouldIgnore(item, relativePath, ignorePatterns)) {\n continue;\n }\n\n const fullPath = join(dir, item);\n const itemStat = await stat(fullPath);\n\n if (itemStat.isDirectory()) {\n const subEntries = await getEntries(fullPath, ignorePatterns, relativePath);\n entries.push(...subEntries);\n } else {\n entries.push(relativePath);\n }\n }\n\n return entries;\n}\n\nfunction shouldIgnore(\n name: string,\n relativePath: string,\n patterns: string[],\n): boolean {\n for (const pattern of patterns) {\n // Simple glob matching\n if (pattern.startsWith(\"*.\")) {\n const ext = pattern.slice(1);\n if (name.endsWith(ext)) return true;\n } else if (name === pattern || relativePath === pattern) {\n return true;\n }\n }\n return false;\n}\n\nexport async function listTarballContents(\n tarballData: Buffer,\n): Promise<string[]> {\n const extractDir = await mkdtemp(join(tmpdir(), \"shipables-list-\"));\n const tmpFile = join(extractDir, \"__tarball.tgz\");\n await writeFile(tmpFile, tarballData);\n\n const files: string[] = [];\n await tar.list({\n file: tmpFile,\n onReadEntry: (entry) => {\n files.push(entry.path);\n },\n });\n\n const { unlink, rm } = await import(\"node:fs/promises\");\n await unlink(tmpFile);\n await rm(extractDir, { recursive: true, force: true });\n\n return files;\n}\n","import { createHash } from \"node:crypto\";\nimport { readFile } from \"node:fs/promises\";\n\nexport function sha512(data: Buffer): string {\n return \"sha512-\" + createHash(\"sha512\").update(data).digest(\"base64\");\n}\n\nexport async function sha512File(filePath: string): Promise<string> {\n const data = await readFile(filePath);\n return sha512(data);\n}\n\nexport function verifyIntegrity(data: Buffer, expected: string): boolean {\n const actual = sha512(data);\n return actual === expected;\n}\n","import type { AgentAdapter, McpServerConfig } from \"../adapters/types.js\";\nimport type { McpServerDeclaration, EnvVarSchema } from \"../lib/types.js\";\n\n/**\n * Build an MCP server config object from the shipables.json declaration\n * and resolved environment variable values.\n */\nexport function buildMcpServerConfig(\n server: McpServerDeclaration,\n envValues: Record<string, string>,\n): McpServerConfig {\n const registry = server.registry || \"npm\";\n let command: string;\n let args: string[];\n\n if (registry === \"npm\") {\n command = \"npx\";\n args = [\"-y\", server.package];\n if (server.version) {\n // Use exact version if provided\n args[1] = `${server.package}@${server.version}`;\n }\n } else if (registry === \"pypi\") {\n command = \"uvx\";\n args = [server.package];\n if (server.version) {\n args[0] = `${server.package}==${server.version}`;\n }\n } else {\n // Generic: assume the package is the command\n command = server.package;\n args = [];\n }\n\n // Append any additional args from the declaration, resolving env vars\n if (server.args) {\n for (const arg of server.args) {\n args.push(resolveEnvVars(arg, envValues));\n }\n }\n\n // Build env, resolving template variables\n const env: Record<string, string> = {};\n if (server.env) {\n for (const [key, value] of Object.entries(server.env)) {\n env[key] = resolveEnvVars(value, envValues);\n }\n }\n\n return { command, args, env };\n}\n\n/**\n * Resolve ${VAR_NAME} placeholders in a string with actual values.\n */\nfunction resolveEnvVars(\n template: string,\n values: Record<string, string>,\n): string {\n return template.replace(/\\$\\{([^}]+)\\}/g, (_, name) => {\n return values[name] || \"\";\n });\n}\n\n/**\n * Write MCP server config for all selected agents.\n */\nexport async function writeMcpForAgents(\n agents: AgentAdapter[],\n serverName: string,\n serverConfig: McpServerConfig,\n scope: \"project\" | \"global\",\n): Promise<Array<{ agent: string; configPath: string }>> {\n const results: Array<{ agent: string; configPath: string }> = [];\n\n for (const agent of agents) {\n const configPath = agent.getMcpConfigPath(scope);\n if (configPath) {\n await agent.writeMcpConfig(configPath, serverName, serverConfig);\n results.push({ agent: agent.name, configPath });\n }\n }\n\n return results;\n}\n\n/**\n * Remove MCP server config from all selected agents.\n */\nexport async function removeMcpFromAgents(\n agents: AgentAdapter[],\n serverName: string,\n mcpConfigs: Record<string, string>,\n): Promise<void> {\n for (const agent of agents) {\n const configPath = mcpConfigs[agent.name];\n if (configPath) {\n await agent.removeMcpConfig(configPath, serverName);\n }\n }\n}\n","import chalk from \"chalk\";\n\nexport function success(message: string): void {\n console.log(chalk.green(\" ✓ \") + message);\n}\n\nexport function error(message: string): void {\n console.error(chalk.red(\" ✗ \") + message);\n}\n\nexport function warn(message: string): void {\n console.log(chalk.yellow(\" ⚠ \") + message);\n}\n\nexport function info(message: string): void {\n console.log(chalk.cyan(\" \") + message);\n}\n\nexport function blank(): void {\n console.log();\n}\n\nexport function header(message: string): void {\n console.log();\n console.log(chalk.bold(\" \" + message));\n console.log();\n}\n\nexport function table(\n headers: string[],\n rows: string[][],\n columnWidths?: number[],\n): void {\n const widths =\n columnWidths ||\n headers.map((h, i) =>\n Math.max(h.length, ...rows.map((r) => (r[i] || \"\").length)),\n );\n\n // Header\n const headerLine = headers\n .map((h, i) => h.padEnd(widths[i]))\n .join(\" \");\n console.log(chalk.dim(\" \" + headerLine));\n\n // 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\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\nexport function formatNumber(n: number): string {\n return n.toLocaleString(\"en-US\");\n}\n","import { cp, mkdir } from \"node:fs/promises\";\nimport { join, resolve } from \"node:path\";\nimport { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport { checkbox } from \"@inquirer/prompts\";\nimport { input, password } from \"@inquirer/prompts\";\nimport { registry } from \"../registry/client.js\";\nimport { detectAgents, getAdapter, ALL_ADAPTERS } from \"../adapters/index.js\";\nimport type { AgentAdapter } from \"../adapters/types.js\";\nimport { extractTarball } from \"../lib/tarball.js\";\nimport { verifyIntegrity } from \"../lib/hash.js\";\nimport { addInstallation, ensureCacheDir } from \"../lib/config.js\";\nimport { buildMcpServerConfig, writeMcpForAgents } from \"../mcp/config.js\";\nimport * as out from \"../lib/output.js\";\nimport type { EnvVarSchema, InstallationRecord } from \"../lib/types.js\";\nimport { writeFile } from \"node:fs/promises\";\n\n/** Parse skill@version syntax */\nfunction parseSkillArg(arg: string): { name: string; version: string } {\n // Handle scoped: @scope/name@version or Scope/name@version\n if (arg.startsWith(\"@\") || arg.includes(\"/\")) {\n const lastAt = arg.lastIndexOf(\"@\");\n // For @scope/name@ver, lastAt must be after the /\n // For Scope/name@ver, lastAt must be after the /\n const slashIdx = arg.indexOf(\"/\");\n if (lastAt > slashIdx) {\n return {\n name: arg.slice(0, lastAt),\n version: arg.slice(lastAt + 1),\n };\n }\n return { name: arg, version: \"latest\" };\n }\n // Handle unscoped: name@version\n const atIdx = arg.indexOf(\"@\");\n if (atIdx > 0) {\n return { name: arg.slice(0, atIdx), version: arg.slice(atIdx + 1) };\n }\n return { name: arg, version: \"latest\" };\n}\n\n/** Get the bare name (without scope) for directory naming */\nfunction getBareName(fullName: string): string {\n if (fullName.includes(\"/\")) {\n const parts = fullName.replace(/^@/, \"\").split(\"/\");\n return parts[parts.length - 1];\n }\n return fullName;\n}\n\nexport function createInstallCommand(): Command {\n return new Command(\"install\")\n .argument(\"<skill>\", \"Skill name, optionally with version (e.g., neo4j, neo4j@1.2.0)\")\n .option(\"--claude\", \"Install for Claude Code\")\n .option(\"--cursor\", \"Install for Cursor\")\n .option(\"--codex\", \"Install for Codex CLI\")\n .option(\"--copilot\", \"Install for VS Code / Copilot\")\n .option(\"--gemini\", \"Install for Gemini CLI\")\n .option(\"--cline\", \"Install for Cline\")\n .option(\"--all\", \"Install for all detected agents\")\n .option(\"-g, --global\", \"Install to user-level skills directory\")\n .option(\"-y, --yes\", \"Skip confirmation prompts\")\n .option(\"--no-mcp\", \"Skip MCP server configuration\")\n .option(\"--registry <url>\", \"Use a custom registry URL\")\n .description(\"Install a skill from the registry\")\n .action(async (skillArg: string, options) => {\n try {\n await runInstall(skillArg, options);\n } catch (err) {\n out.error(\n err instanceof Error ? err.message : String(err),\n );\n process.exit(1);\n }\n });\n}\n\nasync function runInstall(\n skillArg: string,\n options: {\n claude?: boolean;\n cursor?: boolean;\n codex?: boolean;\n copilot?: boolean;\n gemini?: boolean;\n cline?: boolean;\n all?: boolean;\n global?: boolean;\n yes?: boolean;\n mcp?: boolean;\n registry?: string;\n },\n): Promise<void> {\n const { name: skillName, version: requestedVersion } = parseSkillArg(skillArg);\n const bareName = getBareName(skillName);\n const scope: \"project\" | \"global\" = options.global ? \"global\" : \"project\";\n\n // Step 1: Resolve version\n const spinner = ora(`Resolving ${skillName}@${requestedVersion}...`).start();\n\n let versionDetail;\n try {\n versionDetail = await registry.getVersionDetail(skillName, requestedVersion);\n spinner.succeed(\n `Resolved ${skillName}@${requestedVersion} → ${chalk.bold(versionDetail.version)}`,\n );\n } catch (err) {\n spinner.fail(`Failed to resolve ${skillName}@${requestedVersion}`);\n throw err;\n }\n\n // Step 2: Download tarball\n const filename = `${bareName}-${versionDetail.version}.tgz`;\n const downloadSpinner = ora(\n `Downloading ${filename} (${formatSize(versionDetail.size_bytes)})...`,\n ).start();\n\n let tarballData: Buffer;\n let serverIntegrity: string;\n try {\n const result = await registry.downloadTarball(skillName, filename);\n tarballData = result.data;\n serverIntegrity = result.integrity;\n downloadSpinner.succeed(`Downloaded ${filename}`);\n } catch (err) {\n downloadSpinner.fail(`Failed to download ${filename}`);\n throw err;\n }\n\n // Step 3: Verify integrity\n if (serverIntegrity && versionDetail.tarball_sha512) {\n const integritySpinner = ora(\"Verifying integrity...\").start();\n if (verifyIntegrity(tarballData, versionDetail.tarball_sha512)) {\n integritySpinner.succeed(\"Integrity verified\");\n } else {\n integritySpinner.fail(\"Integrity check failed — tarball may be corrupted\");\n throw new Error(\"SHA-512 integrity check failed\");\n }\n }\n\n // Cache the tarball\n const cacheDir = await ensureCacheDir();\n await writeFile(join(cacheDir, filename), tarballData);\n\n // Step 4: Extract tarball\n const extractDir = await extractTarball(tarballData);\n\n // Step 5: Select agents\n const selectedAgents = await selectAgents(options);\n if (selectedAgents.length === 0) {\n throw new Error(\"No agents selected. Use --claude, --cursor, etc. or --all\");\n }\n\n out.blank();\n out.info(\n `Detected agents: ${selectedAgents.map((a) => chalk.bold(a.displayName)).join(\", \")}`,\n );\n\n // Step 6: Copy skill files to each agent's directory\n out.header(\"Installing skill files:\");\n\n const skillDirs: Record<string, string> = {};\n const mcpConfigs: Record<string, string> = {};\n\n for (const agent of selectedAgents) {\n const targetDir = agent.getSkillDir(bareName, scope);\n const fullTargetDir = resolve(targetDir);\n\n await mkdir(fullTargetDir, { recursive: true });\n\n // Copy all files from extract dir to target\n // The tarball may have a root directory or may have files directly\n const { readdirSync, statSync } = await import(\"node:fs\");\n const extractedItems = readdirSync(extractDir);\n\n // Check if there's a single directory (common tarball pattern)\n let sourceDir = extractDir;\n if (extractedItems.length === 1) {\n const singleItem = join(extractDir, extractedItems[0]);\n if (statSync(singleItem).isDirectory()) {\n sourceDir = singleItem;\n }\n }\n\n await cp(sourceDir, fullTargetDir, { recursive: true });\n skillDirs[agent.name] = targetDir;\n\n // List the installed files\n const installedFiles = await listFiles(fullTargetDir, targetDir);\n for (const file of installedFiles) {\n out.success(file);\n }\n }\n\n // Step 7: Configure MCP servers (if applicable)\n const manifest = versionDetail.shipables_json;\n const hasMcp = manifest?.mcp?.servers && manifest.mcp.servers.length > 0;\n const skipMcp = options.mcp === false;\n\n if (hasMcp && !skipMcp) {\n out.header(\"Configuring MCP server:\");\n\n // Collect env var values\n const envValues: Record<string, string> = {};\n const envSchemas = manifest.config?.env || [];\n\n if (envSchemas.length > 0) {\n for (const envVar of envSchemas) {\n const value = await promptEnvVar(envVar, options.yes);\n envValues[envVar.name] = value;\n }\n out.blank();\n }\n\n for (const server of manifest.mcp!.servers) {\n const serverConfig = buildMcpServerConfig(server, envValues);\n const results = await writeMcpForAgents(\n selectedAgents,\n server.name,\n serverConfig,\n scope,\n );\n\n for (const result of results) {\n mcpConfigs[result.agent] = result.configPath;\n out.success(\n `MCP server configured in ${result.configPath}`,\n );\n }\n }\n }\n\n // Step 8: Update installed.json\n const projectPath = scope === \"global\" ? \"__global__\" : process.cwd();\n const record: InstallationRecord = {\n version: versionDetail.version,\n agents: selectedAgents.map((a) => a.name),\n installed_at: new Date().toISOString(),\n skill_dirs: skillDirs,\n mcp_configs: mcpConfigs,\n };\n await addInstallation(projectPath, skillName, record);\n\n // Step 9: Summary\n out.blank();\n out.success(\n `Installed ${chalk.bold(`${skillName}@${versionDetail.version}`)} for ${selectedAgents.map((a) => a.displayName).join(\", \")}`,\n );\n out.blank();\n\n // Cleanup extract dir\n const { rm } = await import(\"node:fs/promises\");\n await rm(extractDir, { recursive: true, force: true });\n}\n\nasync function selectAgents(options: {\n claude?: boolean;\n cursor?: boolean;\n codex?: boolean;\n copilot?: boolean;\n gemini?: boolean;\n cline?: boolean;\n all?: boolean;\n}): Promise<AgentAdapter[]> {\n // If specific agent flags are set, use those\n const flagged: AgentAdapter[] = [];\n const flagMap: Record<string, boolean | undefined> = {\n claude: options.claude,\n cursor: options.cursor,\n codex: options.codex,\n copilot: options.copilot,\n gemini: options.gemini,\n cline: options.cline,\n };\n\n for (const [name, selected] of Object.entries(flagMap)) {\n if (selected) {\n const adapter = getAdapter(name);\n if (adapter) flagged.push(adapter);\n }\n }\n\n if (flagged.length > 0) return flagged;\n\n // Auto-detect\n const detected = await detectAgents();\n\n if (options.all) {\n return detected.length > 0 ? detected : ALL_ADAPTERS;\n }\n\n if (detected.length === 0) {\n console.log(\n chalk.yellow(\n \"\\n No agents auto-detected. Select which agents to install for:\\n\",\n ),\n );\n const selected = await checkbox({\n message: \"Select agents\",\n choices: ALL_ADAPTERS.map((a) => ({\n name: a.displayName,\n value: a.name,\n })),\n });\n return selected\n .map((name) => getAdapter(name))\n .filter(Boolean) as AgentAdapter[];\n }\n\n if (detected.length === 1) {\n return detected;\n }\n\n // Multiple detected — prompt\n const selected = await checkbox({\n message: \"Multiple agents detected. Select which to install for:\",\n choices: detected.map((a) => ({\n name: a.displayName,\n value: a.name,\n checked: true,\n })),\n });\n return selected\n .map((name) => getAdapter(name))\n .filter(Boolean) as AgentAdapter[];\n}\n\nasync function promptEnvVar(\n envVar: EnvVarSchema,\n autoYes?: boolean,\n): Promise<string> {\n const label = [\n envVar.name,\n envVar.required ? \"(required\" : \"(optional\",\n envVar.secret ? \", secret)\" : \")\",\n ].join(\" \");\n\n console.log(chalk.dim(` ${label}: ${envVar.description}`));\n\n if (autoYes && envVar.default) {\n return envVar.default;\n }\n\n if (envVar.secret) {\n return await password({\n message: ` Enter value for ${envVar.name}:`,\n });\n }\n\n return await input({\n message: ` Enter value for ${envVar.name}:`,\n default: envVar.default,\n });\n}\n\nasync function listFiles(dir: string, prefix: string): Promise<string[]> {\n const { readdir, stat } = await import(\"node:fs/promises\");\n const { join } = await import(\"node:path\");\n const files: string[] = [];\n const items = await readdir(dir);\n for (const item of items) {\n const fullPath = join(dir, item);\n const s = await stat(fullPath);\n if (s.isDirectory()) {\n files.push(...(await listFiles(fullPath, `${prefix}/${item}`)));\n } else {\n files.push(`${prefix}/${item}`);\n }\n }\n return files;\n}\n\nfunction formatSize(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","import { Command } from \"commander\";\nimport { createInstallCommand } from \"./commands/install.js\";\nimport { createUninstallCommand } from \"./commands/uninstall.js\";\nimport { createSearchCommand } from \"./commands/search.js\";\nimport { createInfoCommand } from \"./commands/info.js\";\nimport { createListCommand } from \"./commands/list.js\";\nimport { createUpdateCommand } from \"./commands/update.js\";\nimport { createPublishCommand } from \"./commands/publish.js\";\nimport { createUnpublishCommand } from \"./commands/unpublish.js\";\nimport { createInitCommand } from \"./commands/init.js\";\nimport { createLoginCommand, createLogoutCommand } from \"./commands/login.js\";\nimport { createDoctorCommand } from \"./commands/doctor.js\";\nimport { createConfigCommand } from \"./commands/config.js\";\nimport { createStatsCommand } from \"./commands/stats.js\";\nimport { createProfileCommand } from \"./commands/profile.js\";\n\nconst program = new Command();\n\nprogram\n .name(\"shipables\")\n .description(\"CLI for installing, managing, and publishing AI agent skills\")\n .version(\"0.1.0\");\n\nprogram.addCommand(createInstallCommand());\nprogram.addCommand(createUninstallCommand());\nprogram.addCommand(createSearchCommand());\nprogram.addCommand(createInfoCommand());\nprogram.addCommand(createListCommand());\nprogram.addCommand(createUpdateCommand());\nprogram.addCommand(createPublishCommand());\nprogram.addCommand(createUnpublishCommand());\nprogram.addCommand(createInitCommand());\nprogram.addCommand(createLoginCommand());\nprogram.addCommand(createLogoutCommand());\nprogram.addCommand(createDoctorCommand());\nprogram.addCommand(createConfigCommand());\nprogram.addCommand(createStatsCommand());\nprogram.addCommand(createProfileCommand());\n\nprogram.parse();\n","import { rm } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\nimport { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport {\n getInstallation,\n removeInstallation,\n updateInstallation,\n} from \"../lib/config.js\";\nimport { getAdapter } from \"../adapters/index.js\";\nimport * as out from \"../lib/output.js\";\n\nexport function createUninstallCommand(): Command {\n return new Command(\"uninstall\")\n .argument(\"<skill>\", \"Skill name to uninstall\")\n .option(\"--claude\", \"Uninstall from Claude Code\")\n .option(\"--cursor\", \"Uninstall from Cursor\")\n .option(\"--codex\", \"Uninstall from Codex CLI\")\n .option(\"--copilot\", \"Uninstall from VS Code / Copilot\")\n .option(\"--gemini\", \"Uninstall from Gemini CLI\")\n .option(\"--cline\", \"Uninstall from Cline\")\n .option(\"-g, --global\", \"Uninstall from global skills directory\")\n .description(\"Remove a skill and its configuration\")\n .action(async (skillName: string, options) => {\n try {\n await runUninstall(skillName, options);\n } catch (err) {\n out.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n });\n}\n\nasync function runUninstall(\n skillName: string,\n options: {\n claude?: boolean;\n cursor?: boolean;\n codex?: boolean;\n copilot?: boolean;\n gemini?: boolean;\n cline?: boolean;\n global?: boolean;\n },\n): Promise<void> {\n const projectPath = options.global ? \"__global__\" : process.cwd();\n const record = await getInstallation(projectPath, skillName);\n\n if (!record) {\n throw new Error(\n `${skillName} is not installed${options.global ? \" globally\" : \" in this project\"}`,\n );\n }\n\n // Determine which agents to uninstall from\n const flagMap: Record<string, boolean | undefined> = {\n claude: options.claude,\n cursor: options.cursor,\n codex: options.codex,\n copilot: options.copilot,\n gemini: options.gemini,\n cline: options.cline,\n };\n\n const hasFlags = Object.values(flagMap).some(Boolean);\n const targetAgents = hasFlags\n ? record.agents.filter((a) => flagMap[a])\n : record.agents;\n\n if (targetAgents.length === 0) {\n throw new Error(\n `${skillName} is not installed for the specified agent(s)`,\n );\n }\n\n for (const agentName of targetAgents) {\n const adapter = getAdapter(agentName);\n if (!adapter) continue;\n\n out.header(`Uninstalling ${skillName} from ${adapter.displayName}:`);\n\n // Remove skill directory\n const skillDir = record.skill_dirs[agentName];\n if (skillDir) {\n try {\n await rm(resolve(skillDir), { recursive: true, force: true });\n out.success(`Removed ${skillDir}`);\n } catch {\n out.warn(`Could not remove ${skillDir}`);\n }\n }\n\n // Remove MCP config\n const mcpConfig = record.mcp_configs[agentName];\n if (mcpConfig && adapter) {\n try {\n await adapter.removeMcpConfig(mcpConfig, skillName);\n out.success(\n `Removed MCP server \"${skillName}\" from ${mcpConfig}`,\n );\n } catch {\n out.warn(`Could not update ${mcpConfig}`);\n }\n }\n }\n\n // Update installed.json\n const isFullUninstall = !hasFlags || targetAgents.length === record.agents.length;\n\n if (isFullUninstall) {\n await removeInstallation(projectPath, skillName);\n } else {\n // Partial uninstall — remove targeted agents from the record\n const remainingAgents = record.agents.filter((a) => !targetAgents.includes(a));\n const remainingSkillDirs: Record<string, string> = {};\n const remainingMcpConfigs: Record<string, string> = {};\n\n for (const agent of remainingAgents) {\n if (record.skill_dirs[agent]) remainingSkillDirs[agent] = record.skill_dirs[agent];\n if (record.mcp_configs[agent]) remainingMcpConfigs[agent] = record.mcp_configs[agent];\n }\n\n await updateInstallation(projectPath, skillName, {\n ...record,\n agents: remainingAgents,\n skill_dirs: remainingSkillDirs,\n mcp_configs: remainingMcpConfigs,\n });\n }\n\n out.blank();\n out.success(\n `Uninstalled ${chalk.bold(skillName)} from ${targetAgents.map((a) => getAdapter(a)?.displayName || a).join(\", \")}`,\n );\n out.blank();\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport { registry } from \"../registry/client.js\";\nimport * as out from \"../lib/output.js\";\n\nexport function createSearchCommand(): Command {\n return new Command(\"search\")\n .argument(\"<query>\", \"Search query\")\n .option(\"--agent <name>\", \"Filter by agent compatibility\")\n .option(\"--category <slug>\", \"Filter by category\")\n .option(\"--limit <n>\", \"Max results\", \"10\")\n .option(\"--json\", \"Output as JSON\")\n .description(\"Search the registry for skills\")\n .action(async (query: string, options) => {\n try {\n await runSearch(query, options);\n } catch (err) {\n out.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n });\n}\n\nasync function runSearch(\n query: string,\n options: {\n agent?: string;\n category?: string;\n limit?: string;\n json?: boolean;\n },\n): Promise<void> {\n const spinner = ora(\"Searching...\").start();\n\n const result = await registry.search({\n q: query,\n agent: options.agent,\n category: options.category,\n limit: parseInt(options.limit || \"10\", 10),\n });\n\n spinner.stop();\n\n if (options.json) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n\n if (result.skills.length === 0) {\n out.blank();\n out.info(\"No skills found matching your query.\");\n out.blank();\n return;\n }\n\n out.blank();\n out.table(\n [\"SKILL\", \"VERSION\", \"DOWNLOADS/WK\", \"DESCRIPTION\"],\n result.skills.map((s) => [\n s.full_name,\n s.latest_version,\n out.formatNumber(s.downloads_weekly),\n truncate(s.description, 50),\n ]),\n [25, 10, 14, 50],\n );\n\n out.blank();\n out.info(\n `${result.pagination.total} result${result.pagination.total === 1 ? \"\" : \"s\"} found`,\n );\n out.blank();\n}\n\nfunction truncate(s: string, max: number): string {\n if (s.length <= max) return s;\n return s.slice(0, max - 3) + \"...\";\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport { registry } from \"../registry/client.js\";\nimport * as out from \"../lib/output.js\";\n\nexport function createInfoCommand(): Command {\n return new Command(\"info\")\n .argument(\"<skill>\", \"Skill name\")\n .option(\"--json\", \"Output as JSON\")\n .description(\"Show detailed information about a skill\")\n .action(async (skillName: string, options) => {\n try {\n await runInfo(skillName, options);\n } catch (err) {\n out.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n });\n}\n\nasync function runInfo(\n skillName: string,\n options: { json?: boolean },\n): Promise<void> {\n const spinner = ora(`Fetching info for ${skillName}...`).start();\n\n const detail = await registry.getSkillDetail(skillName);\n spinner.stop();\n\n if (options.json) {\n console.log(JSON.stringify(detail, null, 2));\n return;\n }\n\n out.blank();\n\n // Title line\n const titleParts = [\n chalk.bold(`${detail.full_name}@${detail.latest_version}`),\n ];\n if (detail.license) titleParts.push(chalk.dim(`| ${detail.license}`));\n if (detail.repository_url) titleParts.push(chalk.dim(`| ${detail.repository_url}`));\n console.log(\" \" + titleParts.join(\" \"));\n\n out.blank();\n console.log(\" \" + detail.description);\n\n out.blank();\n\n // Metadata\n if (detail.author) {\n out.info(`Published by ${chalk.bold(detail.author.username)}`);\n }\n out.info(\n `Downloads: ${out.formatNumber(detail.downloads_total)} total | ${out.formatNumber(detail.downloads_weekly)} this week`,\n );\n if (detail.categories.length > 0) {\n out.info(`Categories: ${detail.categories.join(\", \")}`);\n }\n if (detail.keywords.length > 0) {\n out.info(`Keywords: ${detail.keywords.join(\", \")}`);\n }\n\n // MCP server info\n if (detail.mcp?.servers && detail.mcp.servers.length > 0) {\n out.blank();\n for (const server of detail.mcp.servers) {\n out.info(\n `MCP Server: ${chalk.bold(server.package)}${server.version ? `@${server.version}` : \"\"} (${server.registry || \"npm\"}, ${server.transport || \"stdio\"})`,\n );\n }\n }\n\n // Config env vars\n if (detail.config?.env && detail.config.env.length > 0) {\n out.blank();\n out.info(\"Config:\");\n for (const envVar of detail.config.env) {\n const flags = [\n envVar.required ? \"required\" : \"optional\",\n envVar.secret ? \"secret\" : null,\n ]\n .filter(Boolean)\n .join(\", \");\n out.info(\n ` ${chalk.bold(envVar.name)} (${flags}): ${envVar.description}`,\n );\n }\n }\n\n // Versions\n if (detail.versions.length > 0) {\n out.blank();\n out.info(\"Versions:\");\n for (const v of detail.versions.slice(0, 5)) {\n out.info(\n ` ${v.version.padEnd(12)} ${chalk.dim(v.created_at.slice(0, 10))} ${out.formatBytes(v.size_bytes)}`,\n );\n }\n if (detail.versions.length > 5) {\n out.info(\n chalk.dim(` ... and ${detail.versions.length - 5} more`),\n );\n }\n }\n\n out.blank();\n out.info(`Install: ${chalk.cyan(`npx shipables install ${detail.full_name}`)}`);\n out.blank();\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { getProjectInstallations } from \"../lib/config.js\";\nimport * as out from \"../lib/output.js\";\n\nexport function createListCommand(): Command {\n return new Command(\"list\")\n .alias(\"ls\")\n .option(\"--json\", \"Output as JSON\")\n .option(\"-g, --global\", \"Show globally installed skills\")\n .description(\"List installed skills\")\n .action(async (options) => {\n try {\n await runList(options);\n } catch (err) {\n out.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n });\n}\n\nasync function runList(options: {\n json?: boolean;\n global?: boolean;\n}): Promise<void> {\n const projectPath = options.global ? \"__global__\" : process.cwd();\n const installations = await getProjectInstallations(projectPath);\n const entries = Object.entries(installations);\n\n if (options.json) {\n console.log(JSON.stringify(installations, null, 2));\n return;\n }\n\n if (entries.length === 0) {\n out.blank();\n out.info(\n options.global\n ? \"No skills installed globally.\"\n : \"No skills installed in this project.\",\n );\n out.info(\n chalk.dim(\"Install one with: npx shipables install <skill>\"),\n );\n out.blank();\n return;\n }\n\n const label = options.global\n ? \"Installed skills (global):\"\n : `Installed skills (project: ${process.cwd()}):`;\n\n out.header(label);\n\n out.table(\n [\"SKILL\", \"VERSION\", \"AGENTS\"],\n entries.map(([name, record]) => [\n name,\n record.version,\n record.agents.join(\", \"),\n ]),\n [25, 10, 30],\n );\n\n out.blank();\n out.info(`${entries.length} skill${entries.length === 1 ? \"\" : \"s\"} installed`);\n out.blank();\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport { confirm } from \"@inquirer/prompts\";\nimport { getProjectInstallations } from \"../lib/config.js\";\nimport { registry } from \"../registry/client.js\";\nimport { getAdapter } from \"../adapters/index.js\";\nimport * as out from \"../lib/output.js\";\n\nexport function createUpdateCommand(): Command {\n return new Command(\"update\")\n .argument(\"[skill]\", \"Skill to update (omit to update all)\")\n .option(\"--dry-run\", \"Show what would be updated without making changes\")\n .option(\"-g, --global\", \"Update globally installed skills\")\n .option(\"--self\", \"Update the shipables CLI itself\")\n .description(\"Update installed skills to latest version\")\n .action(async (skill: string | undefined, options) => {\n try {\n if (options.self) {\n await runSelfUpdate();\n return;\n }\n await runUpdate(skill, options);\n } catch (err) {\n out.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n });\n}\n\ninterface UpdateInfo {\n name: string;\n currentVersion: string;\n latestVersion: string;\n hasUpdate: boolean;\n agents: string[];\n}\n\nasync function runSelfUpdate(): Promise<void> {\n out.blank();\n out.info(\"To update the shipables CLI, run:\");\n out.blank();\n console.log(chalk.cyan(\" npm update -g shipables\"));\n out.blank();\n out.info(\"Or if you installed with npx, it automatically uses the latest version.\");\n out.blank();\n}\n\nasync function runUpdate(\n skill: string | undefined,\n options: { dryRun?: boolean; global?: boolean },\n): Promise<void> {\n const projectPath = options.global ? \"__global__\" : process.cwd();\n const installations = await getProjectInstallations(projectPath);\n const entries = Object.entries(installations);\n\n if (entries.length === 0) {\n out.blank();\n out.info(\"No skills installed to update.\");\n out.blank();\n return;\n }\n\n // Filter to specific skill if provided\n const toCheck = skill\n ? entries.filter(([name]) => name === skill)\n : entries;\n\n if (toCheck.length === 0) {\n throw new Error(`${skill} is not installed`);\n }\n\n const spinner = ora(\"Checking for updates...\").start();\n\n const updates: UpdateInfo[] = [];\n for (const [name, record] of toCheck) {\n try {\n const detail = await registry.getSkillDetail(name);\n updates.push({\n name,\n currentVersion: record.version,\n latestVersion: detail.latest_version,\n hasUpdate: detail.latest_version !== record.version,\n agents: record.agents,\n });\n } catch {\n updates.push({\n name,\n currentVersion: record.version,\n latestVersion: \"unknown\",\n hasUpdate: false,\n agents: record.agents,\n });\n }\n }\n\n spinner.stop();\n out.blank();\n\n out.table(\n [\"SKILL\", \"CURRENT\", \"LATEST\", \"STATUS\"],\n updates.map((u) => [\n u.name,\n u.currentVersion,\n u.latestVersion,\n u.hasUpdate\n ? chalk.yellow(\"update available\")\n : chalk.green(\"up to date\"),\n ]),\n [25, 10, 10, 20],\n );\n\n const updatable = updates.filter((u) => u.hasUpdate);\n\n if (updatable.length === 0) {\n out.blank();\n out.success(\"All skills are up to date\");\n out.blank();\n return;\n }\n\n if (options.dryRun) {\n out.blank();\n out.info(\n `${updatable.length} skill${updatable.length === 1 ? \"\" : \"s\"} would be updated`,\n );\n out.blank();\n return;\n }\n\n out.blank();\n const shouldUpdate = await confirm({\n message: `Update ${updatable.length} skill${updatable.length === 1 ? \"\" : \"s\"}?`,\n default: true,\n });\n\n if (!shouldUpdate) {\n out.info(\"Update cancelled.\");\n return;\n }\n\n // Import runInstall directly instead of going through command parsing\n const { createInstallCommand } = await import(\"./install.js\");\n\n for (const u of updatable) {\n out.blank();\n out.header(`Updating ${u.name} ${u.currentVersion} → ${u.latestVersion}...`);\n\n try {\n // Build agent flags from the existing installation record\n const agentFlags: string[] = [];\n for (const agent of u.agents) {\n agentFlags.push(`--${agent}`);\n }\n\n const globalFlag = options.global ? [\"-g\"] : [];\n\n const cmd = createInstallCommand();\n await cmd.parseAsync(\n [\"node\", \"shipables\", `${u.name}@${u.latestVersion}`, ...agentFlags, ...globalFlag, \"-y\"],\n { from: \"user\" },\n );\n out.success(\n `Updated ${u.name} ${u.currentVersion} → ${u.latestVersion}`,\n );\n } catch (err) {\n out.error(\n `Failed to update ${u.name}: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }\n\n out.blank();\n out.success(\n `${updatable.length} skill${updatable.length === 1 ? \"\" : \"s\"} updated`,\n );\n out.blank();\n}\n","import { access, readFile, stat } from \"node:fs/promises\";\nimport { join, resolve, basename } from \"node:path\";\nimport { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport { confirm, select } from \"@inquirer/prompts\";\nimport { parseSkillMdFile } from \"../skill/parser.js\";\nimport { readManifest, validateManifest } from \"../skill/manifest.js\";\nimport { createTarball } from \"../lib/tarball.js\";\nimport { sha512File } from \"../lib/hash.js\";\nimport { registry } from \"../registry/client.js\";\nimport { getToken } from \"../lib/config.js\";\nimport * as out from \"../lib/output.js\";\nimport type { MeResponse } from \"../lib/types.js\";\n\nexport function createPublishCommand(): Command {\n return new Command(\"publish\")\n .option(\"--dry-run\", \"Pack and validate without uploading\")\n .option(\"--tag <tag>\", \"Dist-tag (e.g., beta, next)\", \"latest\")\n .option(\n \"--access <level>\",\n \"Access level for scoped packages\",\n \"public\",\n )\n .description(\"Publish the skill in the current directory\")\n .action(async (options) => {\n try {\n await runPublish(options);\n } catch (err) {\n out.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n });\n}\n\nasync function runPublish(options: {\n dryRun?: boolean;\n tag?: string;\n access?: string;\n}): Promise<void> {\n const cwd = process.cwd();\n const skillMdPath = join(cwd, \"SKILL.md\");\n const manifestPath = join(cwd, \"shipables.json\");\n\n // Validate SKILL.md exists\n try {\n await access(skillMdPath);\n } catch {\n throw new Error(\n \"No SKILL.md found in the current directory. Run `shipables init` to create one.\",\n );\n }\n\n // Validate shipables.json exists\n try {\n await access(manifestPath);\n } catch {\n throw new Error(\n \"No shipables.json found in the current directory. Run `shipables init` to create one.\",\n );\n }\n\n // Parse and validate SKILL.md\n out.header(\"Validating:\");\n\n const skillMd = await parseSkillMdFile(skillMdPath);\n out.success(\n `SKILL.md — name: ${skillMd.frontmatter.name}, description present`,\n );\n\n // Parse and validate shipables.json\n const manifest = await readManifest(manifestPath);\n const manifestErrors = validateManifest(manifest);\n if (manifestErrors.length > 0) {\n for (const err of manifestErrors) {\n out.error(err);\n }\n throw new Error(\"shipables.json validation failed\");\n }\n out.success(\n `shipables.json — version: ${manifest.version}, schema valid`,\n );\n\n const skillBareName = skillMd.frontmatter.name;\n const version = manifest.version;\n\n // Check auth\n const token = await getToken();\n if (!token && !options.dryRun) {\n throw new Error(\n \"Not authenticated. Run `shipables login` first.\",\n );\n }\n\n // Determine publish scope (personal or org)\n let fullName = skillBareName;\n\n if (!options.dryRun && token) {\n fullName = await resolvePublishScope(skillBareName);\n }\n\n out.blank();\n console.log(` Publishing ${chalk.bold(`${fullName}@${version}`)}...`);\n\n // Read .shipablesignore if it exists\n let ignorePatterns: string[] = [];\n try {\n const ignoreRaw = await readFile(join(cwd, \".shipablesignore\"), \"utf-8\");\n ignorePatterns = ignoreRaw\n .split(\"\\n\")\n .map((l) => l.trim())\n .filter((l) => l && !l.startsWith(\"#\"));\n } catch {\n // No .shipablesignore, use defaults\n }\n\n // Pack tarball\n const tarballName = `${skillBareName}-${version}.tgz`;\n const tarballPath = join(cwd, tarballName);\n\n const packSpinner = ora(\"Packing tarball...\").start();\n await createTarball(cwd, tarballPath, ignorePatterns);\n const tarballStat = await stat(tarballPath);\n const hash = await sha512File(tarballPath);\n packSpinner.succeed(\n `Packed ${tarballName} (${out.formatBytes(tarballStat.size)})`,\n );\n\n // List package contents\n out.blank();\n out.info(`Package contents:`);\n const files = await listAllFiles(cwd, ignorePatterns);\n for (const file of files.slice(0, 20)) {\n console.log(` ${file}`);\n }\n if (files.length > 20) {\n console.log(chalk.dim(` ... and ${files.length - 20} more files`));\n }\n\n if (options.dryRun) {\n out.blank();\n out.success(\"Dry run complete — tarball created but not uploaded\");\n\n // Clean up tarball\n const { unlink } = await import(\"node:fs/promises\");\n await unlink(tarballPath);\n out.blank();\n return;\n }\n\n // Confirm\n out.blank();\n const shouldPublish = await confirm({\n message: `Publish ${fullName}@${version} to the shipables registry?`,\n default: true,\n });\n\n if (!shouldPublish) {\n const { unlink } = await import(\"node:fs/promises\");\n await unlink(tarballPath);\n out.info(\"Publish cancelled.\");\n return;\n }\n\n // Upload\n const uploadSpinner = ora(\"Publishing...\").start();\n try {\n const result = await registry.publishWithName(fullName, tarballPath);\n uploadSpinner.succeed(`Published ${chalk.bold(`${fullName}@${version}`)}`);\n\n if (result.url) {\n out.info(result.url);\n }\n } catch (err) {\n uploadSpinner.fail(\"Publish failed\");\n throw err;\n } finally {\n // Clean up tarball\n const { unlink } = await import(\"node:fs/promises\");\n try {\n await unlink(tarballPath);\n } catch {\n // ignore cleanup failure\n }\n }\n\n out.blank();\n}\n\nasync function resolvePublishScope(bareName: string): Promise<string> {\n let me: MeResponse;\n try {\n me = await registry.getMe();\n } catch {\n // Can't fetch profile — publish under personal name\n return bareName;\n }\n\n const orgs = me.organizations || [];\n const publishableOrgs = orgs.filter(\n (o) => o.role === \"owner\" || o.role === \"admin\",\n );\n\n if (publishableOrgs.length === 0) {\n // No orgs — publish under personal username\n return `${me.username}/${bareName}`;\n }\n\n // Build choices: personal + orgs\n const choices = [\n {\n name: `${me.username}/${bareName} (personal)`,\n value: `${me.username}/${bareName}`,\n },\n ...publishableOrgs.map((org) => ({\n name: `@${org.name}/${bareName} (${org.name})`,\n value: `@${org.name}/${bareName}`,\n })),\n ];\n\n if (choices.length === 1) {\n return choices[0].value;\n }\n\n const selected = await select({\n message: \"Publish as:\",\n choices,\n });\n\n return selected;\n}\n\nasync function listAllFiles(\n dir: string,\n ignorePatterns: string[],\n prefix = \"\",\n): Promise<string[]> {\n const { readdir, stat } = await import(\"node:fs/promises\");\n const defaultIgnore = [\n \"node_modules\",\n \".git\",\n \".env\",\n \".DS_Store\",\n \"*.tgz\",\n ];\n const allIgnore = [...new Set([...defaultIgnore, ...ignorePatterns])];\n\n const files: string[] = [];\n const items = await readdir(dir);\n\n for (const item of items) {\n const relativePath = prefix ? `${prefix}/${item}` : item;\n if (allIgnore.some((p) => item === p || (p.startsWith(\"*.\") && item.endsWith(p.slice(1))))) {\n continue;\n }\n\n const fullPath = join(dir, item);\n const s = await stat(fullPath);\n if (s.isDirectory()) {\n files.push(...(await listAllFiles(fullPath, ignorePatterns, relativePath)));\n } else {\n files.push(relativePath);\n }\n }\n\n return files;\n}\n","import { readFile } from \"node:fs/promises\";\nimport { parse as parseYaml } from \"yaml\";\nimport type { ParsedSkillMd, SkillFrontmatter } from \"../lib/types.js\";\n\nconst FRONTMATTER_RE = /^---\\n([\\s\\S]*?)\\n---\\n?([\\s\\S]*)$/;\n\nexport function parseSkillMd(raw: string): ParsedSkillMd {\n const match = raw.match(FRONTMATTER_RE);\n if (!match) {\n throw new Error(\n \"Invalid SKILL.md: missing YAML frontmatter (must start with ---)\",\n );\n }\n\n const yamlStr = match[1];\n const body = match[2].trim();\n\n let frontmatter: SkillFrontmatter;\n try {\n frontmatter = parseYaml(yamlStr) as SkillFrontmatter;\n } catch (err) {\n throw new Error(\n `Invalid SKILL.md frontmatter: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n\n if (!frontmatter.name) {\n throw new Error(\"Invalid SKILL.md: missing required field 'name'\");\n }\n if (!frontmatter.description) {\n throw new Error(\"Invalid SKILL.md: missing required field 'description'\");\n }\n\n // Validate name format\n if (!/^[a-z0-9][a-z0-9-]*$/.test(frontmatter.name)) {\n throw new Error(\n \"Invalid SKILL.md: name must be lowercase letters, numbers, and hyphens only\",\n );\n }\n if (frontmatter.name.length > 64) {\n throw new Error(\"Invalid SKILL.md: name must be 64 characters or less\");\n }\n\n return { frontmatter, body, raw };\n}\n\nexport async function parseSkillMdFile(\n filePath: string,\n): Promise<ParsedSkillMd> {\n const raw = await readFile(filePath, \"utf-8\");\n return parseSkillMd(raw);\n}\n","import { readFile } from \"node:fs/promises\";\nimport type { ShipablesManifest } from \"../lib/types.js\";\n\nconst SEMVER_RE =\n /^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$/;\n\nexport function validateManifest(manifest: ShipablesManifest): string[] {\n const errors: string[] = [];\n\n if (!manifest.version) {\n errors.push(\"shipables.json: missing required field 'version'\");\n } else if (!SEMVER_RE.test(manifest.version)) {\n errors.push(\n `shipables.json: version '${manifest.version}' is not valid semver`,\n );\n }\n\n if (manifest.keywords && !Array.isArray(manifest.keywords)) {\n errors.push(\"shipables.json: 'keywords' must be an array\");\n }\n\n if (manifest.categories && !Array.isArray(manifest.categories)) {\n errors.push(\"shipables.json: 'categories' must be an array\");\n }\n\n if (manifest.mcp?.servers) {\n for (const server of manifest.mcp.servers) {\n if (!server.name) {\n errors.push(\"shipables.json: MCP server missing 'name'\");\n }\n if (!server.package) {\n errors.push(\"shipables.json: MCP server missing 'package'\");\n }\n }\n }\n\n if (manifest.config?.env) {\n for (const envVar of manifest.config.env) {\n if (!envVar.name) {\n errors.push(\"shipables.json: env var missing 'name'\");\n }\n }\n }\n\n return errors;\n}\n\nexport async function readManifest(filePath: string): Promise<ShipablesManifest> {\n const raw = await readFile(filePath, \"utf-8\");\n let manifest: ShipablesManifest;\n try {\n manifest = JSON.parse(raw) as ShipablesManifest;\n } catch (err) {\n throw new Error(\n `Invalid shipables.json: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n return manifest;\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport { confirm } from \"@inquirer/prompts\";\nimport { registry } from \"../registry/client.js\";\nimport { getToken } from \"../lib/config.js\";\nimport * as out from \"../lib/output.js\";\n\nexport function createUnpublishCommand(): Command {\n return new Command(\"unpublish\")\n .argument(\"<skill>\", \"Skill name with version (e.g., my-skill@1.0.0)\")\n .option(\"-f, --force\", \"Skip confirmation prompt\")\n .description(\"Yank a published version (within 72 hours of publish)\")\n .action(async (skillArg: string, options) => {\n try {\n await runUnpublish(skillArg, options);\n } catch (err) {\n out.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n });\n}\n\nasync function runUnpublish(\n skillArg: string,\n options: { force?: boolean },\n): Promise<void> {\n const token = await getToken();\n if (!token) {\n throw new Error(\"Not authenticated. Run `shipables login` first.\");\n }\n\n // Parse skill@version\n const { name, version } = parseSkillVersion(skillArg);\n\n if (!version) {\n throw new Error(\n \"You must specify a version to unpublish (e.g., my-skill@1.0.0). Unpublishing an entire package is not supported.\",\n );\n }\n\n out.blank();\n out.warn(\n `This will yank ${chalk.bold(`${name}@${version}`)} from the registry.`,\n );\n out.warn(\"Yanked versions cannot be re-published with the same version number.\");\n out.blank();\n\n if (!options.force) {\n const shouldProceed = await confirm({\n message: `Are you sure you want to unpublish ${name}@${version}?`,\n default: false,\n });\n\n if (!shouldProceed) {\n out.info(\"Unpublish cancelled.\");\n return;\n }\n }\n\n const spinner = ora(`Unpublishing ${name}@${version}...`).start();\n try {\n await registry.unpublishVersion(name, version);\n spinner.succeed(`Unpublished ${chalk.bold(`${name}@${version}`)}`);\n } catch (err) {\n spinner.fail(\"Unpublish failed\");\n throw err;\n }\n\n out.blank();\n}\n\nfunction parseSkillVersion(arg: string): { name: string; version: string | null } {\n // Handle scoped: @scope/name@version or Scope/name@version\n if (arg.startsWith(\"@\") || arg.includes(\"/\")) {\n const lastAt = arg.lastIndexOf(\"@\");\n const slashIdx = arg.indexOf(\"/\");\n if (lastAt > slashIdx) {\n return {\n name: arg.slice(0, lastAt),\n version: arg.slice(lastAt + 1),\n };\n }\n return { name: arg, version: null };\n }\n // Handle unscoped: name@version\n const atIdx = arg.indexOf(\"@\");\n if (atIdx > 0) {\n return { name: arg.slice(0, atIdx), version: arg.slice(atIdx + 1) };\n }\n return { name: arg, version: null };\n}\n","import { mkdir, writeFile, access } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { input, confirm, checkbox } from \"@inquirer/prompts\";\nimport * as out from \"../lib/output.js\";\n\nconst CATEGORIES = [\n \"databases\",\n \"apis\",\n \"testing\",\n \"devops\",\n \"security\",\n \"documentation\",\n \"code-quality\",\n \"frameworks\",\n \"cloud\",\n \"ai-ml\",\n \"data\",\n \"messaging\",\n \"monitoring\",\n \"authentication\",\n \"other\",\n];\n\nexport function createInitCommand(): Command {\n return new Command(\"init\")\n .description(\"Scaffold a new skill in the current directory\")\n .action(async () => {\n try {\n await runInit();\n } catch (err) {\n out.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n });\n}\n\nasync function runInit(): Promise<void> {\n out.header(\"Create a new Shipables skill\");\n\n // Check if SKILL.md already exists\n const cwd = process.cwd();\n try {\n await access(join(cwd, \"SKILL.md\"));\n throw new Error(\"SKILL.md already exists in this directory\");\n } catch (err) {\n if (err instanceof Error && err.message.includes(\"already exists\")) {\n throw err;\n }\n // File doesn't exist — good\n }\n\n // Prompts\n const name = await input({\n message: \"Skill name (lowercase, hyphens, max 64 chars):\",\n validate: (val) => {\n if (!val) return \"Name is required\";\n if (!/^[a-z0-9][a-z0-9-]*$/.test(val))\n return \"Must be lowercase letters, numbers, and hyphens only\";\n if (val.length > 64) return \"Max 64 characters\";\n return true;\n },\n });\n\n const description = await input({\n message: \"Description (what the skill does and when to use it):\",\n validate: (val) => {\n if (!val) return \"Description is required\";\n if (val.length > 1024) return \"Max 1024 characters\";\n return true;\n },\n });\n\n const authorName = await input({\n message: \"Author name:\",\n default: process.env.USER || \"your-name\",\n });\n\n const authorGithub = await input({\n message: \"Author GitHub username:\",\n default: authorName,\n });\n\n const license = await input({\n message: \"License:\",\n default: \"MIT\",\n });\n\n const categories = await checkbox({\n message: \"Categories (select with space):\",\n choices: CATEGORIES.map((c) => ({ name: c, value: c })),\n });\n\n const includeMcp = await confirm({\n message: \"Include MCP server configuration?\",\n default: false,\n });\n\n let mcpPackage = \"\";\n let mcpEnvVars: Array<{ name: string; description: string; required: boolean; secret: boolean }> = [];\n\n if (includeMcp) {\n mcpPackage = await input({\n message: \"MCP server npm package name:\",\n validate: (val) => (val ? true : \"Package name is required\"),\n });\n\n let addMore = true;\n while (addMore) {\n const envName = await input({\n message: \"Environment variable name (or empty to finish):\",\n });\n if (!envName) break;\n\n const envDesc = await input({\n message: `Description for ${envName}:`,\n });\n const envRequired = await confirm({\n message: `Is ${envName} required?`,\n default: true,\n });\n const envSecret = await confirm({\n message: `Is ${envName} a secret?`,\n default: false,\n });\n\n mcpEnvVars.push({\n name: envName,\n description: envDesc,\n required: envRequired,\n secret: envSecret,\n });\n }\n }\n\n const includeScripts = await confirm({\n message: \"Include example scripts/ directory?\",\n default: false,\n });\n\n const includeReferences = await confirm({\n message: \"Include example references/ directory?\",\n default: false,\n });\n\n // Generate files\n out.header(\"Creating files:\");\n\n // Create skill directory (use current dir)\n const skillDir = cwd;\n\n // SKILL.md\n const skillMd = generateSkillMd(\n name,\n description,\n license,\n authorGithub,\n includeReferences,\n includeMcp,\n mcpPackage,\n );\n await writeFile(join(skillDir, \"SKILL.md\"), skillMd, \"utf-8\");\n out.success(\"SKILL.md\");\n\n // shipables.json\n const shipablesJson = generateShipablesJson(\n name,\n authorName,\n authorGithub,\n categories,\n includeMcp,\n mcpPackage,\n mcpEnvVars,\n );\n await writeFile(\n join(skillDir, \"shipables.json\"),\n JSON.stringify(shipablesJson, null, 2) + \"\\n\",\n \"utf-8\",\n );\n out.success(\"shipables.json\");\n\n // README.md\n const readme = generateReadme(name, description);\n await writeFile(join(skillDir, \"README.md\"), readme, \"utf-8\");\n out.success(\"README.md\");\n\n // .shipablesignore\n const ignoreContent = [\n \"node_modules\",\n \".git\",\n \".env\",\n \".DS_Store\",\n \"*.tgz\",\n \".shipablesignore\",\n ].join(\"\\n\") + \"\\n\";\n await writeFile(join(skillDir, \".shipablesignore\"), ignoreContent, \"utf-8\");\n out.success(\".shipablesignore\");\n\n // scripts/\n if (includeScripts) {\n await mkdir(join(skillDir, \"scripts\"), { recursive: true });\n await writeFile(\n join(skillDir, \"scripts\", \"example.sh\"),\n `#!/bin/bash\\n# Example script for the ${name} skill\\necho \"Hello from ${name}\"\\n`,\n \"utf-8\",\n );\n out.success(\"scripts/example.sh\");\n }\n\n // references/\n if (includeReferences) {\n await mkdir(join(skillDir, \"references\"), { recursive: true });\n await writeFile(\n join(skillDir, \"references\", \"example.md\"),\n `# ${name} Reference\\n\\nDetailed reference documentation goes here.\\n`,\n \"utf-8\",\n );\n out.success(\"references/example.md\");\n }\n\n out.blank();\n out.success(`Skill ${chalk.bold(name)} initialized!`);\n out.blank();\n out.info(\"Next steps:\");\n out.info(` 1. Edit ${chalk.cyan(\"SKILL.md\")} with your agent instructions`);\n out.info(` 2. Edit ${chalk.cyan(\"shipables.json\")} with your metadata`);\n out.info(` 3. Run ${chalk.cyan(\"shipables publish\")} to publish`);\n out.blank();\n}\n\nfunction generateSkillMd(\n name: string,\n description: string,\n license: string,\n author: string,\n includeReferences: boolean,\n includeMcp: boolean,\n mcpPackage: string,\n): string {\n let md = `---\nname: ${name}\ndescription: ${description}\nlicense: ${license}\ncompatibility: Describe any requirements (tools, network access, etc.)\nmetadata:\n author: ${author}\n version: \"0.1.0\"\n---\n\n# ${titleCase(name)}\n\nInstructions for the AI agent go here. Describe patterns, best practices,\nand how to use the tools and resources this skill provides.\n`;\n\n if (includeMcp) {\n md += `\n## MCP Server\n\nThis skill works best with the ${mcpPackage} MCP server.\n`;\n }\n\n if (includeReferences) {\n md += `\n## References\n\n- See [references/example.md](references/example.md) for detailed documentation.\n`;\n }\n\n return md;\n}\n\nfunction generateShipablesJson(\n name: string,\n authorName: string,\n authorGithub: string,\n categories: string[],\n includeMcp: boolean,\n mcpPackage: string,\n mcpEnvVars: Array<{ name: string; description: string; required: boolean; secret: boolean }>,\n): Record<string, unknown> {\n const json: Record<string, unknown> = {\n version: \"0.1.0\",\n keywords: [],\n categories,\n author: {\n name: authorName,\n github: authorGithub,\n },\n };\n\n if (includeMcp && mcpPackage) {\n json.mcp = {\n servers: [\n {\n name: name,\n package: mcpPackage,\n registry: \"npm\",\n transport: \"stdio\",\n },\n ],\n };\n\n if (mcpEnvVars.length > 0) {\n json.config = {\n env: mcpEnvVars,\n };\n }\n }\n\n return json;\n}\n\nfunction generateReadme(name: string, description: string): string {\n return `# ${titleCase(name)}\n\n${description}\n\n## Installation\n\n\\`\\`\\`bash\nnpx shipables install ${name}\n\\`\\`\\`\n\n## Usage\n\nDescribe how the AI agent uses this skill.\n\n## License\n\nMIT\n`;\n}\n\nfunction titleCase(s: string): string {\n return s\n .split(\"-\")\n .map((w) => w.charAt(0).toUpperCase() + w.slice(1))\n .join(\" \");\n}\n","import { createServer } from \"node:http\";\nimport { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport { loadConfig, saveConfig, getRegistry } from \"../lib/config.js\";\nimport * as out from \"../lib/output.js\";\n\nexport function createLoginCommand(): Command {\n return new Command(\"login\")\n .description(\"Authenticate with the Shipables registry via GitHub\")\n .action(async () => {\n try {\n await runLogin();\n } catch (err) {\n out.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n });\n}\n\nexport function createLogoutCommand(): Command {\n return new Command(\"logout\")\n .description(\"Remove stored credentials\")\n .action(async () => {\n try {\n await runLogout();\n } catch (err) {\n out.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n });\n}\n\nasync function runLogin(): Promise<void> {\n const registryUrl = await getRegistry();\n\n // Start a temporary local HTTP server to receive the OAuth callback\n const { port, tokenPromise, server } = await startCallbackServer();\n\n const callbackUrl = `http://localhost:${port}/callback`;\n const loginUrl = `${registryUrl}/api/v1/auth/github?callback=${encodeURIComponent(callbackUrl)}&mode=cli`;\n\n out.blank();\n out.info(\"Open this URL in your browser to sign in with GitHub:\");\n out.blank();\n out.info(chalk.cyan(loginUrl));\n out.blank();\n\n // Try to open browser automatically\n await tryOpenBrowser(loginUrl);\n\n const spinner = ora(\"Waiting for authentication...\").start();\n\n try {\n const token = await tokenPromise;\n spinner.stop();\n\n // Fetch the user info\n const config = await loadConfig();\n config.token = token;\n\n // Try to get username\n try {\n const resp = await fetch(`${registryUrl}/api/v1/auth/me`, {\n headers: {\n Authorization: `Bearer ${token}`,\n \"User-Agent\": \"shipables-cli\",\n },\n });\n if (resp.ok) {\n const me = (await resp.json()) as { username: string };\n config.username = me.username;\n }\n } catch {\n // Non-fatal — we still have the token\n }\n\n await saveConfig(config);\n\n out.blank();\n out.success(\n `Logged in as ${chalk.bold(config.username || \"unknown\")}`,\n );\n out.info(\n chalk.dim(\"Token stored in ~/.shipables/config.json\"),\n );\n out.blank();\n } catch (err) {\n spinner.fail(\"Authentication failed\");\n throw err;\n } finally {\n server.close();\n }\n}\n\nasync function tryOpenBrowser(url: string): Promise<void> {\n const { exec } = await import(\"node:child_process\");\n const { promisify } = await import(\"node:util\");\n const execAsync = promisify(exec);\n\n // Order of preference: wslview (WSL), open (macOS), start (Windows), xdg-open (Linux)\n const commands =\n process.platform === \"darwin\"\n ? [\"open\"]\n : process.platform === \"win32\"\n ? [\"start\"]\n : [\"wslview\", \"xdg-open\"];\n\n for (const cmd of commands) {\n try {\n await execAsync(`${cmd} \"${url}\"`);\n return;\n } catch {\n // Try the next command\n }\n }\n}\n\nasync function startCallbackServer(): Promise<{\n port: number;\n tokenPromise: Promise<string>;\n server: ReturnType<typeof createServer>;\n}> {\n return new Promise((resolveServer) => {\n let resolveToken: (token: string) => void;\n let rejectToken: (err: Error) => void;\n const tokenPromise = new Promise<string>((res, rej) => {\n resolveToken = res;\n rejectToken = rej;\n });\n\n // Set a timeout\n const timeout = setTimeout(() => {\n rejectToken(new Error(\"Authentication timed out after 2 minutes\"));\n }, 120_000);\n\n const server = 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 if (token) {\n res.writeHead(200, { \"Content-Type\": \"text/html\" });\n res.end(\n \"<html><body><h2>Authentication successful!</h2><p>You can close this tab and return to the terminal.</p></body></html>\",\n );\n clearTimeout(timeout);\n resolveToken(token);\n } else {\n res.writeHead(400, { \"Content-Type\": \"text/html\" });\n res.end(\n \"<html><body><h2>Authentication failed</h2><p>No token received.</p></body></html>\",\n );\n clearTimeout(timeout);\n rejectToken(new Error(\"No token received in callback\"));\n }\n } else {\n res.writeHead(404);\n res.end();\n }\n });\n\n server.listen(0, () => {\n const addr = server.address();\n const port = typeof addr === \"object\" && addr ? addr.port : 0;\n resolveServer({ port, tokenPromise, server });\n });\n });\n}\n\nasync function runLogout(): Promise<void> {\n const config = await loadConfig();\n\n if (!config.token) {\n out.blank();\n out.info(\"Not currently logged in.\");\n out.blank();\n return;\n }\n\n delete config.token;\n delete config.username;\n await saveConfig(config);\n\n out.blank();\n out.success(\"Logged out. Token removed from ~/.shipables/config.json\");\n out.blank();\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport {\n getProjectInstallations,\n loadInstalled,\n} from \"../lib/config.js\";\nimport { getAdapter, detectAgents } from \"../adapters/index.js\";\nimport { registry } from \"../registry/client.js\";\nimport * as out from \"../lib/output.js\";\n\nexport function createDoctorCommand(): Command {\n return new Command(\"doctor\")\n .description(\"Check health of installed skills and agent configurations\")\n .option(\"-g, --global\", \"Check globally installed skills\")\n .action(async (options) => {\n try {\n await runDoctor(options);\n } catch (err) {\n out.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n });\n}\n\nasync function runDoctor(options: { global?: boolean }): Promise<void> {\n const projectPath = options.global ? \"__global__\" : process.cwd();\n const installations = await getProjectInstallations(projectPath);\n const entries = Object.entries(installations);\n\n if (entries.length === 0) {\n out.blank();\n out.info(\"No skills installed to check.\");\n out.blank();\n return;\n }\n\n out.header(\"Checking installed skills...\");\n\n let totalIssues = 0;\n let totalUpdates = 0;\n\n for (const [skillName, record] of entries) {\n const agentList = record.agents.join(\", \");\n console.log(\n ` ${chalk.bold(`${skillName}@${record.version}`)} (${agentList}):`,\n );\n\n // Validate each agent's installation\n for (const agentName of record.agents) {\n const adapter = getAdapter(agentName);\n if (!adapter) continue;\n\n const skillDir = record.skill_dirs[agentName];\n const mcpConfig = record.mcp_configs[agentName] || null;\n\n if (skillDir) {\n const result = await adapter.validate(skillName, skillDir, mcpConfig);\n for (const check of result.checks) {\n if (check.status === \"pass\") {\n out.success(check.label);\n } else if (check.status === \"fail\") {\n out.error(check.label + (check.message ? ` — ${check.message}` : \"\"));\n totalIssues++;\n } else {\n out.warn(check.label + (check.message ? ` — ${check.message}` : \"\"));\n }\n }\n }\n }\n\n // Check for updates\n try {\n const detail = await registry.getSkillDetail(skillName);\n if (detail.latest_version !== record.version) {\n out.warn(\n `Update available: ${record.version} → ${detail.latest_version}`,\n );\n totalUpdates++;\n }\n } catch {\n // Can't reach registry — skip update check\n }\n\n out.blank();\n }\n\n // Summary\n if (totalIssues === 0 && totalUpdates === 0) {\n out.success(\"All checks passed\");\n } else {\n const parts: string[] = [];\n if (totalIssues > 0) {\n parts.push(`${totalIssues} issue${totalIssues === 1 ? \"\" : \"s\"} found`);\n }\n if (totalUpdates > 0) {\n parts.push(\n `${totalUpdates} update${totalUpdates === 1 ? \"\" : \"s\"} available`,\n );\n }\n out.info(`Summary: ${parts.join(\", \")}`);\n }\n out.blank();\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { loadConfig, saveConfig } from \"../lib/config.js\";\nimport * as out from \"../lib/output.js\";\nimport type { CliConfig } from \"../lib/types.js\";\n\nconst VALID_KEYS = [\"registry\", \"defaultAgents\", \"scope\"] as const;\ntype ConfigKey = (typeof VALID_KEYS)[number];\n\nexport function createConfigCommand(): Command {\n const cmd = new Command(\"config\").description(\"Manage CLI configuration\");\n\n cmd\n .command(\"set <key> <value>\")\n .description(\"Set a config value\")\n .action(async (key: string, value: string) => {\n try {\n await runConfigSet(key, value);\n } catch (err) {\n out.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n });\n\n cmd\n .command(\"get <key>\")\n .description(\"Get a config value\")\n .action(async (key: string) => {\n try {\n await runConfigGet(key);\n } catch (err) {\n out.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n });\n\n cmd\n .command(\"list\")\n .description(\"Show all config\")\n .action(async () => {\n try {\n await runConfigList();\n } catch (err) {\n out.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n });\n\n cmd\n .command(\"delete <key>\")\n .description(\"Remove a config value\")\n .action(async (key: string) => {\n try {\n await runConfigDelete(key);\n } catch (err) {\n out.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n });\n\n return cmd;\n}\n\nfunction validateKey(key: string): ConfigKey {\n if (!VALID_KEYS.includes(key as ConfigKey)) {\n throw new Error(\n `Invalid config key: ${key}. Valid keys: ${VALID_KEYS.join(\", \")}`,\n );\n }\n return key as ConfigKey;\n}\n\nasync function runConfigSet(key: string, value: string): Promise<void> {\n const validKey = validateKey(key);\n const config = await loadConfig();\n\n if (validKey === \"defaultAgents\") {\n ((config as unknown) as Record<string, unknown>)[validKey] = value\n .split(\",\")\n .map((s) => s.trim());\n } else {\n ((config as unknown) as Record<string, unknown>)[validKey] = value;\n }\n\n await saveConfig(config);\n out.success(`Set ${key} = ${value}`);\n}\n\nasync function runConfigGet(key: string): Promise<void> {\n const validKey = validateKey(key);\n const config = await loadConfig();\n const value = ((config as unknown) as Record<string, unknown>)[validKey];\n\n if (value === undefined) {\n out.info(`${key}: (not set)`);\n } else {\n console.log(\n typeof value === \"object\" ? JSON.stringify(value) : String(value),\n );\n }\n}\n\nasync function runConfigList(): Promise<void> {\n const config = await loadConfig();\n\n out.blank();\n for (const key of VALID_KEYS) {\n const value = ((config as unknown) as Record<string, unknown>)[key];\n const display =\n value === undefined\n ? chalk.dim(\"(not set)\")\n : typeof value === \"object\"\n ? JSON.stringify(value)\n : String(value);\n console.log(` ${chalk.bold(key)}: ${display}`);\n }\n\n // Show auth status\n if (config.username) {\n console.log(\n ` ${chalk.bold(\"auth\")}: logged in as ${chalk.green(config.username)}`,\n );\n } else {\n console.log(` ${chalk.bold(\"auth\")}: ${chalk.dim(\"not logged in\")}`);\n }\n out.blank();\n}\n\nasync function runConfigDelete(key: string): Promise<void> {\n const validKey = validateKey(key);\n const config = await loadConfig();\n delete ((config as unknown) as Record<string, unknown>)[validKey];\n await saveConfig(config);\n out.success(`Deleted ${key}`);\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport { registry } from \"../registry/client.js\";\nimport * as out from \"../lib/output.js\";\n\nexport function createStatsCommand(): Command {\n return new Command(\"stats\")\n .argument(\"<skill>\", \"Skill name\")\n .option(\"--period <period>\", \"Time period: week, month, year\", \"month\")\n .option(\"--json\", \"Output as JSON\")\n .description(\"Show download statistics for a skill\")\n .action(async (skillName: string, options) => {\n try {\n await runStats(skillName, options);\n } catch (err) {\n out.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n });\n}\n\nasync function runStats(\n skillName: string,\n options: { period?: string; json?: boolean },\n): Promise<void> {\n const spinner = ora(`Fetching download stats for ${skillName}...`).start();\n\n const stats = await registry.getDownloadStats(skillName, options.period);\n spinner.stop();\n\n if (options.json) {\n console.log(JSON.stringify(stats, null, 2));\n return;\n }\n\n out.blank();\n console.log(\n ` ${chalk.bold(stats.skill)} — ${stats.period} downloads: ${chalk.bold(out.formatNumber(stats.total))}`,\n );\n out.blank();\n\n if (stats.daily.length > 0) {\n // Find max for scaling the bar chart\n const maxCount = Math.max(...stats.daily.map((d) => d.count), 1);\n const barWidth = 30;\n\n for (const day of stats.daily) {\n const bar = \"█\".repeat(Math.round((day.count / maxCount) * barWidth));\n const date = day.date.slice(5); // MM-DD\n const count = String(day.count).padStart(6);\n console.log(` ${chalk.dim(date)} ${count} ${chalk.cyan(bar)}`);\n }\n }\n\n out.blank();\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport { registry } from \"../registry/client.js\";\nimport { getToken, loadConfig } from \"../lib/config.js\";\nimport * as out from \"../lib/output.js\";\n\nexport function createProfileCommand(): Command {\n return new Command(\"profile\")\n .argument(\"[username]\", \"Username to look up (defaults to current user)\")\n .option(\"--json\", \"Output as JSON\")\n .description(\"Show user profile and published skills\")\n .action(async (username: string | undefined, options) => {\n try {\n await runProfile(username, options);\n } catch (err) {\n out.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n });\n}\n\nasync function runProfile(\n username: string | undefined,\n options: { json?: boolean },\n): Promise<void> {\n // If no username, use the current logged-in user\n if (!username) {\n const config = await loadConfig();\n if (config.username) {\n username = config.username;\n } else {\n const token = await getToken();\n if (!token) {\n throw new Error(\n \"No username provided and not logged in. Run `shipables login` or provide a username.\",\n );\n }\n const me = await registry.getMe();\n username = me.username;\n }\n }\n\n const spinner = ora(`Fetching profile for ${username}...`).start();\n\n const [profile, skillsResult] = await Promise.all([\n registry.getUserProfile(username),\n registry.getUserSkills(username),\n ]);\n\n spinner.stop();\n\n if (options.json) {\n console.log(JSON.stringify({ profile, skills: skillsResult.skills }, null, 2));\n return;\n }\n\n out.blank();\n\n // Profile header\n const displayName = profile.display_name || profile.username;\n console.log(` ${chalk.bold(displayName)}`);\n if (profile.display_name && profile.display_name !== profile.username) {\n console.log(` ${chalk.dim(`@${profile.username}`)}`);\n }\n out.blank();\n\n out.info(`Skills published: ${profile.skills_count}`);\n out.info(`Joined: ${profile.created_at.slice(0, 10)}`);\n\n // Published skills\n if (skillsResult.skills.length > 0) {\n out.blank();\n out.table(\n [\"SKILL\", \"VERSION\", \"DOWNLOADS/WK\", \"DESCRIPTION\"],\n skillsResult.skills.map((s) => [\n s.full_name,\n s.latest_version,\n out.formatNumber(s.downloads_weekly),\n truncate(s.description, 40),\n ]),\n [25, 10, 14, 40],\n );\n }\n\n out.blank();\n}\n\nfunction truncate(s: string, max: number): string {\n if (s.length <= max) return s;\n return s.slice(0, max - 3) + \"...\";\n}\n"],"mappings":"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","names":["readFile","join","readFile","writeFile","mkdir","join","writeFile","stat","join","readFile","registry","init_config","mkdir","join","chalk","writeFile","rm","selected","readdir","stat","init_config","Command","resolve","Command","chalk","Command","ora","Command","chalk","ora","Command","chalk","Command","chalk","ora","createInstallCommand","access","readFile","stat","join","Command","chalk","ora","confirm","readFile","readFile","Command","join","access","chalk","readFile","ora","stat","confirm","readdir","Command","chalk","ora","confirm","mkdir","writeFile","access","join","Command","chalk","input","confirm","checkbox","Command","chalk","ora","Command","chalk","Command","chalk","Command","chalk","ora","Command","chalk","ora","truncate","Command"]}
|
|
1
|
+
{"version":3,"sources":["../src/lib/config.ts","../src/lib/errors.ts","../src/registry/client.ts","../src/adapters/base.ts","../src/adapters/claude.ts","../src/adapters/cursor.ts","../src/adapters/codex.ts","../src/adapters/copilot.ts","../src/adapters/gemini.ts","../src/adapters/cline.ts","../src/adapters/index.ts","../src/lib/tarball.ts","../src/lib/hash.ts","../src/mcp/config.ts","../src/lib/output.ts","../src/commands/install.ts","../src/index.ts","../src/commands/uninstall.ts","../src/commands/search.ts","../src/commands/info.ts","../src/commands/list.ts","../src/commands/update.ts","../src/commands/publish.ts","../src/skill/parser.ts","../src/skill/manifest.ts","../src/commands/unpublish.ts","../src/commands/init.ts","../src/commands/login.ts","../src/commands/doctor.ts","../src/commands/config.ts","../src/commands/stats.ts","../src/commands/profile.ts"],"sourcesContent":["import { readFile, writeFile, mkdir } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport type {\n CliConfig,\n InstalledJson,\n InstallationRecord,\n} from \"./types.js\";\n\nconst CONFIG_DIR = join(homedir(), \".shipables\");\nconst CONFIG_FILE = join(CONFIG_DIR, \"config.json\");\nconst INSTALLED_FILE = join(CONFIG_DIR, \"installed.json\");\nconst CACHE_DIR = join(CONFIG_DIR, \"cache\");\n\nconst DEFAULT_REGISTRY = \"https://api.shipables.dev\";\n\nexport function getConfigDir(): string {\n return CONFIG_DIR;\n}\n\nexport function getCacheDir(): string {\n return CACHE_DIR;\n}\n\nasync function ensureDir(dir: string): Promise<void> {\n await mkdir(dir, { recursive: true });\n}\n\nexport async function loadConfig(): Promise<CliConfig> {\n try {\n const raw = await readFile(CONFIG_FILE, \"utf-8\");\n return JSON.parse(raw) as CliConfig;\n } catch {\n return { registry: DEFAULT_REGISTRY };\n }\n}\n\nexport async function saveConfig(config: CliConfig): Promise<void> {\n await ensureDir(CONFIG_DIR);\n await writeFile(CONFIG_FILE, JSON.stringify(config, null, 2) + \"\\n\", \"utf-8\");\n}\n\nexport async function getRegistry(): Promise<string> {\n const config = await loadConfig();\n return config.registry || DEFAULT_REGISTRY;\n}\n\nexport async function getToken(): Promise<string | undefined> {\n const config = await loadConfig();\n return config.token;\n}\n\nexport async function loadInstalled(): Promise<InstalledJson> {\n try {\n const raw = await readFile(INSTALLED_FILE, \"utf-8\");\n return JSON.parse(raw) as InstalledJson;\n } catch {\n return { version: 1, installations: {} };\n }\n}\n\nexport async function saveInstalled(data: InstalledJson): Promise<void> {\n await ensureDir(CONFIG_DIR);\n await writeFile(\n INSTALLED_FILE,\n JSON.stringify(data, null, 2) + \"\\n\",\n \"utf-8\",\n );\n}\n\nexport async function addInstallation(\n projectPath: string,\n skillName: string,\n record: InstallationRecord,\n): Promise<void> {\n const data = await loadInstalled();\n if (!data.installations[projectPath]) {\n data.installations[projectPath] = {};\n }\n data.installations[projectPath][skillName] = record;\n await saveInstalled(data);\n}\n\nexport async function removeInstallation(\n projectPath: string,\n skillName: string,\n): Promise<void> {\n const data = await loadInstalled();\n if (data.installations[projectPath]) {\n delete data.installations[projectPath][skillName];\n if (Object.keys(data.installations[projectPath]).length === 0) {\n delete data.installations[projectPath];\n }\n }\n await saveInstalled(data);\n}\n\nexport async function updateInstallation(\n projectPath: string,\n skillName: string,\n record: InstallationRecord,\n): Promise<void> {\n const data = await loadInstalled();\n if (data.installations[projectPath]) {\n data.installations[projectPath][skillName] = record;\n await saveInstalled(data);\n }\n}\n\nexport async function getInstallation(\n projectPath: string,\n skillName: string,\n): Promise<InstallationRecord | undefined> {\n const data = await loadInstalled();\n return data.installations[projectPath]?.[skillName];\n}\n\nexport async function getProjectInstallations(\n projectPath: string,\n): Promise<Record<string, InstallationRecord>> {\n const data = await loadInstalled();\n return data.installations[projectPath] || {};\n}\n\nexport async function ensureCacheDir(): Promise<string> {\n await ensureDir(CACHE_DIR);\n return CACHE_DIR;\n}\n","export const EXIT_SUCCESS = 0;\nexport const EXIT_ERROR = 1;\nexport const EXIT_USAGE = 2;\nexport const EXIT_AUTH = 3;\nexport const EXIT_NOT_FOUND = 4;\nexport const EXIT_NETWORK = 5;\nexport const EXIT_VALIDATION = 6;\nexport const EXIT_CONFLICT = 7;\n\nexport class CliError extends Error {\n constructor(\n message: string,\n public code: string,\n public exitCode: number,\n public fix?: string,\n ) {\n super(message);\n this.name = \"CliError\";\n }\n}\n\nexport function authError(message: string, fix?: string): CliError {\n return new CliError(message, \"AUTH_REQUIRED\", EXIT_AUTH, fix || \"Run `shipables login` to authenticate.\");\n}\n\nexport function notFoundError(message: string, fix?: string): CliError {\n return new CliError(message, \"NOT_FOUND\", EXIT_NOT_FOUND, fix);\n}\n\nexport function networkError(message: string, fix?: string): CliError {\n return new CliError(\n message,\n \"NETWORK_ERROR\",\n EXIT_NETWORK,\n fix || \"Check your internet connection or registry URL with: shipables config get registry\",\n );\n}\n\nexport function validationError(message: string, fix?: string): CliError {\n return new CliError(message, \"VALIDATION_ERROR\", EXIT_VALIDATION, fix);\n}\n\nexport function usageError(message: string, fix?: string): CliError {\n return new CliError(message, \"USAGE_ERROR\", EXIT_USAGE, fix);\n}\n\nexport function conflictError(message: string, fix?: string): CliError {\n return new CliError(message, \"CONFLICT\", EXIT_CONFLICT, fix);\n}\n","import { createReadStream } from \"node:fs\";\nimport { readFile } from \"node:fs/promises\";\nimport { basename, join, dirname } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { getRegistry, getToken } from \"../lib/config.js\";\nimport { authError, networkError, notFoundError } from \"../lib/errors.js\";\nimport type {\n SkillSearchResponse,\n SkillDetailResponse,\n VersionDetailResponse,\n PublishResponse,\n DownloadStatsResponse,\n UserProfileResponse,\n MeResponse,\n} from \"../lib/types.js\";\n\nlet cachedVersion: string | null = null;\n\nasync function getCliVersion(): Promise<string> {\n if (cachedVersion) return cachedVersion;\n try {\n const pkgPath = join(dirname(fileURLToPath(import.meta.url)), \"..\", \"package.json\");\n const pkg = JSON.parse(await readFile(pkgPath, \"utf-8\"));\n cachedVersion = pkg.version || \"0.0.0\";\n } catch {\n cachedVersion = \"0.0.0\";\n }\n return cachedVersion!;\n}\n\nexport class RegistryClient {\n private registryUrl: string | null = null;\n private token: string | undefined;\n\n private async getBaseUrl(): Promise<string> {\n if (!this.registryUrl) {\n this.registryUrl = await getRegistry();\n }\n return this.registryUrl;\n }\n\n private async getHeaders(\n auth = false,\n ): Promise<Record<string, string>> {\n const version = await getCliVersion();\n const headers: Record<string, string> = {\n \"User-Agent\": `shipables-cli/${version}`,\n };\n if (auth) {\n if (!this.token) {\n this.token = await getToken();\n }\n if (this.token) {\n headers[\"Authorization\"] = `Bearer ${this.token}`;\n }\n }\n return headers;\n }\n\n private encodeFullName(fullName: string): string {\n // @scope/name → scope/name for URL path\n if (fullName.startsWith(\"@\")) {\n const withoutAt = fullName.slice(1);\n const [scope, name] = withoutAt.split(\"/\");\n return `${encodeURIComponent(scope)}/${encodeURIComponent(name)}`;\n }\n // Scope/name (without @) → Scope/name for URL path\n if (fullName.includes(\"/\")) {\n const [scope, name] = fullName.split(\"/\");\n return `${encodeURIComponent(scope)}/${encodeURIComponent(name)}`;\n }\n return encodeURIComponent(fullName);\n }\n\n private async fetchJson<T>(\n url: string,\n init?: RequestInit,\n ): Promise<Response> {\n const base = await this.getBaseUrl();\n try {\n return await fetch(url, init);\n } catch (err) {\n if (err instanceof TypeError && (err as Error).message === \"fetch failed\") {\n throw networkError(\n `Could not connect to registry at ${base}. Check your internet connection or registry URL.`,\n );\n }\n throw err;\n }\n }\n\n async search(params: {\n q?: string;\n category?: string;\n agent?: string;\n scope?: string;\n sort?: string;\n limit?: number;\n page?: number;\n }): Promise<SkillSearchResponse> {\n const base = await this.getBaseUrl();\n const url = new URL(`${base}/api/v1/skills`);\n if (params.q) url.searchParams.set(\"q\", params.q);\n if (params.category) url.searchParams.set(\"category\", params.category);\n if (params.agent) url.searchParams.set(\"agent\", params.agent);\n if (params.scope) url.searchParams.set(\"scope\", params.scope);\n if (params.sort) url.searchParams.set(\"sort\", params.sort);\n if (params.limit) url.searchParams.set(\"per_page\", String(params.limit));\n if (params.page) url.searchParams.set(\"page\", String(params.page));\n\n const resp = await this.fetchJson(url.toString(), {\n headers: await this.getHeaders(),\n });\n if (!resp.ok) {\n throw networkError(\n `Search for '${params.q || \"\"}' failed (HTTP ${resp.status}). Verify your registry URL with: shipables config get registry`,\n );\n }\n return (await resp.json()) as SkillSearchResponse;\n }\n\n async getSkillDetail(fullName: string): Promise<SkillDetailResponse> {\n const base = await this.getBaseUrl();\n const encoded = this.encodeFullName(fullName);\n const resp = await this.fetchJson(`${base}/api/v1/skills/${encoded}`, {\n headers: await this.getHeaders(),\n });\n if (!resp.ok) {\n if (resp.status === 404) {\n throw notFoundError(\n `Skill '${fullName}' not found in the registry.`,\n `Search for available skills with: shipables search <query>`,\n );\n }\n throw networkError(\n `Failed to get skill detail for '${fullName}' (HTTP ${resp.status}).`,\n );\n }\n return (await resp.json()) as SkillDetailResponse;\n }\n\n async getVersionDetail(\n fullName: string,\n version: string,\n ): Promise<VersionDetailResponse> {\n const base = await this.getBaseUrl();\n const encoded = this.encodeFullName(fullName);\n const resp = await this.fetchJson(\n `${base}/api/v1/skills/${encoded}/versions/${encodeURIComponent(version)}`,\n { headers: await this.getHeaders() },\n );\n if (!resp.ok) {\n if (resp.status === 404) {\n throw notFoundError(\n `Version '${fullName}@${version}' not found.`,\n `List available versions with: shipables info ${fullName}`,\n );\n }\n throw networkError(\n `Failed to get version '${fullName}@${version}' (HTTP ${resp.status}).`,\n );\n }\n return (await resp.json()) as VersionDetailResponse;\n }\n\n async downloadTarball(\n fullName: string,\n filename: string,\n ): Promise<{ data: Buffer; integrity: string }> {\n const base = await this.getBaseUrl();\n const encoded = this.encodeFullName(fullName);\n const resp = await this.fetchJson(\n `${base}/api/v1/skills/${encoded}/-/${encodeURIComponent(filename)}`,\n { headers: await this.getHeaders() },\n );\n if (!resp.ok) {\n throw networkError(\n `Failed to download tarball '${filename}' (HTTP ${resp.status}).`,\n `Re-run the install command. If the error persists, the package may have been removed.`,\n );\n }\n const integrity = resp.headers.get(\"X-Integrity\") || \"\";\n const arrayBuf = await resp.arrayBuffer();\n return { data: Buffer.from(arrayBuf), integrity };\n }\n\n async publishWithName(\n fullName: string,\n tarballPath: string,\n ): Promise<PublishResponse> {\n const base = await this.getBaseUrl();\n const headers = await this.getHeaders(true);\n\n if (!headers[\"Authorization\"]) {\n throw authError(\n \"Not authenticated. You must be logged in to publish.\",\n \"Run `shipables login` to authenticate, then re-run `shipables publish`.\",\n );\n }\n\n const fileStream = createReadStream(tarballPath);\n const chunks: Buffer[] = [];\n for await (const chunk of fileStream) {\n chunks.push(chunk as Buffer);\n }\n const fileBuffer = Buffer.concat(chunks);\n const fileName = basename(tarballPath);\n\n const formData = new FormData();\n const blob = new Blob([fileBuffer], { type: \"application/gzip\" });\n formData.append(\"tarball\", blob, fileName);\n\n const encoded = this.encodeFullName(fullName);\n const resp = await this.fetchJson(`${base}/api/v1/skills/${encoded}`, {\n method: \"PUT\",\n headers,\n body: formData,\n });\n\n if (!resp.ok) {\n const body = await resp.text();\n let message = `Publish failed (HTTP ${resp.status}).`;\n let details = \"\";\n try {\n const err = JSON.parse(body);\n if (err.error?.message) message = err.error.message;\n if (err.error?.details) details = JSON.stringify(err.error.details);\n } catch {\n // ignore\n }\n if (resp.status === 401) {\n throw authError(message, \"Run `shipables login` to re-authenticate, then re-run `shipables publish`.\");\n }\n if (resp.status === 409) {\n const { conflictError } = await import(\"../lib/errors.js\");\n throw conflictError(\n message + (details ? ` Details: ${details}` : \"\"),\n \"Bump the version in shipables.json and re-run `shipables publish`.\",\n );\n }\n throw new Error(message + (details ? ` Details: ${details}` : \"\"));\n }\n return (await resp.json()) as PublishResponse;\n }\n\n async unpublishVersion(\n fullName: string,\n version: string,\n ): Promise<void> {\n const base = await this.getBaseUrl();\n const encoded = this.encodeFullName(fullName);\n const resp = await this.fetchJson(\n `${base}/api/v1/skills/${encoded}/versions/${encodeURIComponent(version)}`,\n {\n method: \"DELETE\",\n headers: await this.getHeaders(true),\n },\n );\n if (!resp.ok) {\n if (resp.status === 404) {\n throw notFoundError(\n `Version '${fullName}@${version}' not found.`,\n `Check available versions with: shipables info ${fullName}`,\n );\n }\n const body = await resp.text();\n let message = `Unpublish failed (HTTP ${resp.status}).`;\n try {\n const err = JSON.parse(body);\n if (err.error?.message) message = err.error.message;\n } catch {\n // ignore\n }\n if (resp.status === 401) {\n throw authError(message, \"Run `shipables login` to re-authenticate.\");\n }\n throw new Error(message);\n }\n }\n\n async getDownloadStats(\n fullName: string,\n period = \"month\",\n ): Promise<DownloadStatsResponse> {\n const base = await this.getBaseUrl();\n const encoded = this.encodeFullName(fullName);\n const resp = await this.fetchJson(\n `${base}/api/v1/skills/${encoded}/downloads?period=${encodeURIComponent(period)}`,\n { headers: await this.getHeaders() },\n );\n if (!resp.ok) {\n if (resp.status === 404) {\n throw notFoundError(\n `Skill '${fullName}' not found.`,\n `Search for available skills with: shipables search <query>`,\n );\n }\n throw networkError(\n `Failed to get download stats for '${fullName}' (HTTP ${resp.status}).`,\n );\n }\n return (await resp.json()) as DownloadStatsResponse;\n }\n\n async getUserProfile(\n username: string,\n ): Promise<UserProfileResponse> {\n const base = await this.getBaseUrl();\n const resp = await this.fetchJson(\n `${base}/api/v1/users/${encodeURIComponent(username)}`,\n { headers: await this.getHeaders() },\n );\n if (!resp.ok) {\n if (resp.status === 404) {\n throw notFoundError(\n `User '${username}' not found.`,\n `Check the username and try again.`,\n );\n }\n throw networkError(\n `Failed to get user profile for '${username}' (HTTP ${resp.status}).`,\n );\n }\n return (await resp.json()) as UserProfileResponse;\n }\n\n async getUserSkills(\n username: string,\n ): Promise<SkillSearchResponse> {\n const base = await this.getBaseUrl();\n const resp = await this.fetchJson(\n `${base}/api/v1/users/${encodeURIComponent(username)}/skills`,\n { headers: await this.getHeaders() },\n );\n if (!resp.ok) {\n throw networkError(\n `Failed to get skills for user '${username}' (HTTP ${resp.status}).`,\n );\n }\n return (await resp.json()) as SkillSearchResponse;\n }\n\n async getMe(): Promise<MeResponse> {\n const base = await this.getBaseUrl();\n const resp = await this.fetchJson(`${base}/api/v1/auth/me`, {\n headers: await this.getHeaders(true),\n });\n if (!resp.ok) {\n if (resp.status === 401) {\n throw authError(\n \"Not authenticated or session expired.\",\n \"Run `shipables login` to re-authenticate.\",\n );\n }\n throw networkError(`Failed to get profile (HTTP ${resp.status}).`);\n }\n return (await resp.json()) as MeResponse;\n }\n}\n\nexport const registry = new RegistryClient();\n","import { access, readFile, writeFile, mkdir, stat } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { execSync } from \"node:child_process\";\nimport type {\n AgentAdapter,\n McpServerConfig,\n ValidationResult,\n ValidationCheck,\n} from \"./types.js\";\n\nexport interface AdapterConfig {\n name: string;\n displayName: string;\n /** How to detect: binary names in PATH and/or directories that indicate installation */\n detectBinaries?: string[];\n detectDirs?: string[];\n /** Skill directory templates. Use {name} for skill name */\n projectSkillDir: string;\n globalSkillDir: string;\n /** MCP config file paths (null if no MCP support) */\n projectMcpConfig: string | null;\n globalMcpConfig: string | null;\n /** The JSON key that holds MCP server entries. Usually \"mcpServers\" or \"servers\" */\n mcpServersKey: string;\n}\n\nfunction expandHome(p: string): string {\n if (p.startsWith(\"~/\")) {\n return join(process.env.HOME || \"\", p.slice(2));\n }\n return p;\n}\n\nfunction binaryExists(name: string): boolean {\n try {\n execSync(`which ${name}`, { stdio: \"ignore\" });\n return true;\n } catch {\n return false;\n }\n}\n\nasync function dirExists(path: string): Promise<boolean> {\n try {\n const s = await stat(expandHome(path));\n return s.isDirectory();\n } catch {\n return false;\n }\n}\n\nasync function fileExists(path: string): Promise<boolean> {\n try {\n await access(path);\n return true;\n } catch {\n return false;\n }\n}\n\nexport function createAdapter(config: AdapterConfig): AgentAdapter {\n return {\n name: config.name,\n displayName: config.displayName,\n\n async detect(): Promise<boolean> {\n // Check binaries\n if (config.detectBinaries) {\n for (const bin of config.detectBinaries) {\n if (binaryExists(bin)) return true;\n }\n }\n // Check directories\n if (config.detectDirs) {\n for (const dir of config.detectDirs) {\n if (await dirExists(dir)) return true;\n }\n }\n return false;\n },\n\n getSkillDir(skillName: string, scope: \"project\" | \"global\"): string {\n const template =\n scope === \"global\"\n ? config.globalSkillDir\n : config.projectSkillDir;\n return expandHome(template.replace(\"{name}\", skillName));\n },\n\n getMcpConfigPath(scope: \"project\" | \"global\"): string | null {\n const path =\n scope === \"global\"\n ? config.globalMcpConfig\n : config.projectMcpConfig;\n return path ? expandHome(path) : null;\n },\n\n async writeMcpConfig(\n configPath: string,\n serverName: string,\n serverConfig: McpServerConfig,\n ): Promise<void> {\n const fullPath = expandHome(configPath);\n let existing: Record<string, unknown> = {};\n\n if (await fileExists(fullPath)) {\n try {\n const raw = await readFile(fullPath, \"utf-8\");\n existing = JSON.parse(raw);\n } catch {\n // File exists but is invalid JSON — start fresh\n }\n } else {\n // Ensure directory exists\n const dir = join(fullPath, \"..\");\n await mkdir(dir, { recursive: true });\n }\n\n const key = config.mcpServersKey;\n if (!existing[key] || typeof existing[key] !== \"object\") {\n existing[key] = {};\n }\n\n (existing[key] as Record<string, unknown>)[serverName] = serverConfig;\n await writeFile(fullPath, JSON.stringify(existing, null, 2) + \"\\n\", \"utf-8\");\n },\n\n async removeMcpConfig(\n configPath: string,\n serverName: string,\n ): Promise<void> {\n const fullPath = expandHome(configPath);\n if (!(await fileExists(fullPath))) return;\n\n try {\n const raw = await readFile(fullPath, \"utf-8\");\n const existing = JSON.parse(raw) as Record<string, unknown>;\n const key = config.mcpServersKey;\n const servers = existing[key] as Record<string, unknown> | undefined;\n if (servers && serverName in servers) {\n delete servers[serverName];\n await writeFile(\n fullPath,\n JSON.stringify(existing, null, 2) + \"\\n\",\n \"utf-8\",\n );\n }\n } catch {\n // Ignore errors reading/parsing\n }\n },\n\n async validate(\n skillName: string,\n skillDir: string,\n mcpConfigPath: string | null,\n ): Promise<ValidationResult> {\n const checks: ValidationCheck[] = [];\n\n // Check skill directory exists\n const skillDirFull = expandHome(skillDir);\n if (await dirExists(skillDirFull)) {\n checks.push({\n label: `Skill directory present: ${skillDir}`,\n status: \"pass\",\n });\n\n // Check SKILL.md exists\n if (await fileExists(join(skillDirFull, \"SKILL.md\"))) {\n checks.push({ label: \"SKILL.md present\", status: \"pass\" });\n } else {\n checks.push({\n label: \"SKILL.md missing\",\n status: \"fail\",\n message: `Expected at ${join(skillDir, \"SKILL.md\")}`,\n });\n }\n } else {\n checks.push({\n label: `Skill directory missing: ${skillDir}`,\n status: \"fail\",\n });\n }\n\n // Check MCP config\n if (mcpConfigPath) {\n const mcpFull = expandHome(mcpConfigPath);\n if (await fileExists(mcpFull)) {\n try {\n const raw = await readFile(mcpFull, \"utf-8\");\n const parsed = JSON.parse(raw) as Record<string, unknown>;\n const key = config.mcpServersKey;\n const servers = parsed[key] as Record<string, unknown> | undefined;\n if (servers && skillName in servers) {\n checks.push({\n label: `MCP server config present in ${mcpConfigPath}`,\n status: \"pass\",\n });\n } else {\n checks.push({\n label: `MCP server config missing in ${mcpConfigPath}`,\n status: \"warn\",\n message: \"MCP server entry not found\",\n });\n }\n } catch {\n checks.push({\n label: `MCP config file invalid: ${mcpConfigPath}`,\n status: \"warn\",\n message: \"Could not parse JSON\",\n });\n }\n }\n }\n\n const healthy = checks.every((c) => c.status !== \"fail\");\n return { healthy, checks };\n },\n };\n}\n","import { createAdapter } from \"./base.js\";\n\nexport const claudeAdapter = createAdapter({\n name: \"claude\",\n displayName: \"Claude Code\",\n detectBinaries: [\"claude\"],\n detectDirs: [\"~/.claude\"],\n projectSkillDir: \".claude/skills/{name}\",\n globalSkillDir: \"~/.claude/skills/{name}\",\n projectMcpConfig: \".claude/settings.json\",\n globalMcpConfig: \"~/.claude/settings.json\",\n mcpServersKey: \"mcpServers\",\n});\n","import { createAdapter } from \"./base.js\";\n\nexport const cursorAdapter = createAdapter({\n name: \"cursor\",\n displayName: \"Cursor\",\n detectDirs: [\".cursor\", \"~/.cursor\"],\n projectSkillDir: \".cursor/skills/{name}\",\n globalSkillDir: \"~/.cursor/skills/{name}\",\n projectMcpConfig: \".cursor/mcp.json\",\n globalMcpConfig: \"~/.cursor/mcp.json\",\n mcpServersKey: \"mcpServers\",\n});\n","import { createAdapter } from \"./base.js\";\n\nexport const codexAdapter = createAdapter({\n name: \"codex\",\n displayName: \"Codex CLI\",\n detectBinaries: [\"codex\"],\n detectDirs: [\"~/.codex\"],\n projectSkillDir: \".agents/skills/{name}\",\n globalSkillDir: \"~/.agents/skills/{name}\",\n projectMcpConfig: \".codex/mcp.json\",\n globalMcpConfig: \"~/.codex/mcp.json\",\n mcpServersKey: \"mcpServers\",\n});\n","import { createAdapter } from \"./base.js\";\n\nexport const copilotAdapter = createAdapter({\n name: \"copilot\",\n displayName: \"VS Code / Copilot\",\n detectDirs: [\".vscode\"],\n projectSkillDir: \".agents/skills/{name}\",\n globalSkillDir: \"~/.agents/skills/{name}\",\n projectMcpConfig: \".vscode/mcp.json\",\n globalMcpConfig: null,\n mcpServersKey: \"servers\",\n});\n","import { createAdapter } from \"./base.js\";\n\nexport const geminiAdapter = createAdapter({\n name: \"gemini\",\n displayName: \"Gemini CLI\",\n detectBinaries: [\"gemini\"],\n projectSkillDir: \".agents/skills/{name}\",\n globalSkillDir: \"~/.agents/skills/{name}\",\n projectMcpConfig: \".gemini/settings.json\",\n globalMcpConfig: \"~/.gemini/settings.json\",\n mcpServersKey: \"mcpServers\",\n});\n","import { createAdapter } from \"./base.js\";\n\nexport const clineAdapter = createAdapter({\n name: \"cline\",\n displayName: \"Cline\",\n detectDirs: [\".cline\"],\n projectSkillDir: \".agents/skills/{name}\",\n globalSkillDir: \"~/.agents/skills/{name}\",\n projectMcpConfig: \".cline/mcp_settings.json\",\n globalMcpConfig: \"~/.cline/mcp_settings.json\",\n mcpServersKey: \"mcpServers\",\n});\n","import type { AgentAdapter } from \"./types.js\";\nimport { claudeAdapter } from \"./claude.js\";\nimport { cursorAdapter } from \"./cursor.js\";\nimport { codexAdapter } from \"./codex.js\";\nimport { copilotAdapter } from \"./copilot.js\";\nimport { geminiAdapter } from \"./gemini.js\";\nimport { clineAdapter } from \"./cline.js\";\n\nexport type { AgentAdapter, McpServerConfig, ValidationResult, ValidationCheck } from \"./types.js\";\n\nexport const ALL_ADAPTERS: AgentAdapter[] = [\n claudeAdapter,\n cursorAdapter,\n codexAdapter,\n copilotAdapter,\n geminiAdapter,\n clineAdapter,\n];\n\nexport function getAdapter(name: string): AgentAdapter | undefined {\n return ALL_ADAPTERS.find((a) => a.name === name);\n}\n\nexport async function detectAgents(): Promise<AgentAdapter[]> {\n const detected: AgentAdapter[] = [];\n for (const adapter of ALL_ADAPTERS) {\n if (await adapter.detect()) {\n detected.push(adapter);\n }\n }\n return detected;\n}\n\nexport function getAdapterNames(): string[] {\n return ALL_ADAPTERS.map((a) => a.name);\n}\n","import { writeFile, mkdtemp, readdir, stat } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { tmpdir } from \"node:os\";\nimport * as tar from \"tar\";\n\nexport async function extractTarball(\n tarballData: Buffer,\n destDir?: string,\n): Promise<string> {\n const extractDir = destDir || (await mkdtemp(join(tmpdir(), \"shipables-\")));\n\n // Write the buffer to a temporary file, then extract\n const tmpFile = join(extractDir, \"__tarball.tgz\");\n await writeFile(tmpFile, tarballData);\n\n await tar.extract({\n file: tmpFile,\n cwd: extractDir,\n });\n\n // Clean up the temp tarball\n const { unlink } = await import(\"node:fs/promises\");\n await unlink(tmpFile);\n\n return extractDir;\n}\n\nexport async function createTarball(\n sourceDir: string,\n outputPath: string,\n ignorePatterns: string[] = [],\n): Promise<void> {\n const defaultIgnore = [\n \"node_modules\",\n \".git\",\n \".env\",\n \".DS_Store\",\n \"*.tgz\",\n \"__tarball.tgz\",\n ];\n const allIgnore = [...new Set([...defaultIgnore, ...ignorePatterns])];\n\n // Get the entries in the source dir, filtering out ignored patterns\n const entries = await getEntries(sourceDir, allIgnore);\n\n await tar.create(\n {\n gzip: true,\n file: outputPath,\n cwd: sourceDir,\n },\n entries,\n );\n}\n\nasync function getEntries(\n dir: string,\n ignorePatterns: string[],\n prefix = \"\",\n): Promise<string[]> {\n const entries: string[] = [];\n const items = await readdir(dir);\n\n for (const item of items) {\n const relativePath = prefix ? `${prefix}/${item}` : item;\n\n // Check if this matches any ignore pattern\n if (shouldIgnore(item, relativePath, ignorePatterns)) {\n continue;\n }\n\n const fullPath = join(dir, item);\n const itemStat = await stat(fullPath);\n\n if (itemStat.isDirectory()) {\n const subEntries = await getEntries(fullPath, ignorePatterns, relativePath);\n entries.push(...subEntries);\n } else {\n entries.push(relativePath);\n }\n }\n\n return entries;\n}\n\nfunction shouldIgnore(\n name: string,\n relativePath: string,\n patterns: string[],\n): boolean {\n for (const pattern of patterns) {\n // Simple glob matching\n if (pattern.startsWith(\"*.\")) {\n const ext = pattern.slice(1);\n if (name.endsWith(ext)) return true;\n } else if (name === pattern || relativePath === pattern) {\n return true;\n }\n }\n return false;\n}\n\nexport async function listTarballContents(\n tarballData: Buffer,\n): Promise<string[]> {\n const extractDir = await mkdtemp(join(tmpdir(), \"shipables-list-\"));\n const tmpFile = join(extractDir, \"__tarball.tgz\");\n await writeFile(tmpFile, tarballData);\n\n const files: string[] = [];\n await tar.list({\n file: tmpFile,\n onReadEntry: (entry) => {\n files.push(entry.path);\n },\n });\n\n const { unlink, rm } = await import(\"node:fs/promises\");\n await unlink(tmpFile);\n await rm(extractDir, { recursive: true, force: true });\n\n return files;\n}\n","import { createHash } from \"node:crypto\";\nimport { readFile } from \"node:fs/promises\";\n\nexport function sha512(data: Buffer): string {\n return \"sha512-\" + createHash(\"sha512\").update(data).digest(\"base64\");\n}\n\nexport async function sha512File(filePath: string): Promise<string> {\n const data = await readFile(filePath);\n return sha512(data);\n}\n\nexport function verifyIntegrity(data: Buffer, expected: string): boolean {\n const actual = sha512(data);\n return actual === expected;\n}\n","import type { AgentAdapter, McpServerConfig } from \"../adapters/types.js\";\nimport type { McpServerDeclaration, EnvVarSchema } from \"../lib/types.js\";\n\n/**\n * Build an MCP server config object from the shipables.json declaration\n * and resolved environment variable values.\n */\nexport function buildMcpServerConfig(\n server: McpServerDeclaration,\n envValues: Record<string, string>,\n): McpServerConfig {\n const registry = server.registry || \"npm\";\n let command: string;\n let args: string[];\n\n if (registry === \"npm\") {\n command = \"npx\";\n args = [\"-y\", server.package];\n if (server.version) {\n // Use exact version if provided\n args[1] = `${server.package}@${server.version}`;\n }\n } else if (registry === \"pypi\") {\n command = \"uvx\";\n args = [server.package];\n if (server.version) {\n args[0] = `${server.package}==${server.version}`;\n }\n } else {\n // Generic: assume the package is the command\n command = server.package;\n args = [];\n }\n\n // Append any additional args from the declaration, resolving env vars\n if (server.args) {\n for (const arg of server.args) {\n args.push(resolveEnvVars(arg, envValues));\n }\n }\n\n // Build env, resolving template variables\n const env: Record<string, string> = {};\n if (server.env) {\n for (const [key, value] of Object.entries(server.env)) {\n env[key] = resolveEnvVars(value, envValues);\n }\n }\n\n return { command, args, env };\n}\n\n/**\n * Resolve ${VAR_NAME} placeholders in a string with actual values.\n */\nfunction resolveEnvVars(\n template: string,\n values: Record<string, string>,\n): string {\n return template.replace(/\\$\\{([^}]+)\\}/g, (_, name) => {\n return values[name] || \"\";\n });\n}\n\n/**\n * Write MCP server config for all selected agents.\n */\nexport async function writeMcpForAgents(\n agents: AgentAdapter[],\n serverName: string,\n serverConfig: McpServerConfig,\n scope: \"project\" | \"global\",\n): Promise<Array<{ agent: string; configPath: string }>> {\n const results: Array<{ agent: string; configPath: string }> = [];\n\n for (const agent of agents) {\n const configPath = agent.getMcpConfigPath(scope);\n if (configPath) {\n await agent.writeMcpConfig(configPath, serverName, serverConfig);\n results.push({ agent: agent.name, configPath });\n }\n }\n\n return results;\n}\n\n/**\n * Remove MCP server config from all selected agents.\n */\nexport async function removeMcpFromAgents(\n agents: AgentAdapter[],\n serverName: string,\n mcpConfigs: Record<string, string>,\n): Promise<void> {\n for (const agent of agents) {\n const configPath = mcpConfigs[agent.name];\n if (configPath) {\n await agent.removeMcpConfig(configPath, serverName);\n }\n }\n}\n","import chalk from \"chalk\";\nimport ora from \"ora\";\nimport type { Ora } from \"ora\";\nimport { CliError } from \"./errors.js\";\n\n/** Check if the current environment supports interactive prompts. */\nexport function isInteractive(): boolean {\n return process.stdin.isTTY === true && !process.env.CI;\n}\n\n/** Global JSON mode flag — set by the root --json option. */\nlet jsonMode = false;\nlet jsonBuffer: { ok: boolean; command: string; data?: unknown; error?: { code: string; message: string; fix?: string } } | null = null;\n\nexport function setJsonMode(enabled: boolean): void {\n jsonMode = enabled;\n}\n\nexport function getJsonMode(): boolean {\n return jsonMode;\n}\n\nexport function emitJson(command: string, data: unknown): void {\n console.log(JSON.stringify({ ok: true, command, data }, null, 2));\n}\n\nexport function emitJsonError(command: string, err: unknown): void {\n const isCliError = err instanceof CliError;\n const message = err instanceof Error ? err.message : String(err);\n const obj: Record<string, unknown> = {\n ok: false,\n command,\n error: {\n code: isCliError ? (err as CliError).code : \"ERROR\",\n message,\n ...(isCliError && (err as CliError).fix ? { fix: (err as CliError).fix } : {}),\n },\n };\n console.log(JSON.stringify(obj, null, 2));\n}\n\nexport function success(message: string): void {\n if (jsonMode) return;\n console.log(chalk.green(\" ✓ \") + message);\n}\n\nexport function error(message: string): void {\n if (jsonMode) return;\n console.error(chalk.red(\" ✗ \") + message);\n}\n\nexport function errorWithFix(message: string, fix: string): void {\n if (jsonMode) return;\n console.error(chalk.red(\" ✗ \") + message);\n console.error(chalk.dim(\" Fix: \") + fix);\n}\n\nexport function warn(message: string): void {\n if (jsonMode) return;\n console.log(chalk.yellow(\" ⚠ \") + message);\n}\n\nexport function info(message: string): void {\n if (jsonMode) return;\n console.log(chalk.cyan(\" \") + message);\n}\n\nexport function blank(): void {\n if (jsonMode) return;\n console.log();\n}\n\nexport function header(message: string): void {\n if (jsonMode) return;\n console.log();\n console.log(chalk.bold(\" \" + message));\n console.log();\n}\n\nexport function table(\n headers: string[],\n rows: string[][],\n columnWidths?: number[],\n): void {\n if (jsonMode) return;\n const widths =\n columnWidths ||\n headers.map((h, i) =>\n Math.max(h.length, ...rows.map((r) => (r[i] || \"\").length)),\n );\n\n // Header\n const headerLine = headers\n .map((h, i) => h.padEnd(widths[i]))\n .join(\" \");\n console.log(chalk.dim(\" \" + headerLine));\n\n // 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\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\nexport function formatNumber(n: number): string {\n return n.toLocaleString(\"en-US\");\n}\n\n/** Spinner wrapper — returns a real ora spinner in TTY, a plain-text stub otherwise. */\nexport function spinner(text: string): Ora {\n if (process.stdin.isTTY && !process.env.CI && !jsonMode) {\n return ora(text).start();\n }\n // Plain-text stub for non-interactive environments\n if (!jsonMode) {\n console.error(` … ${text}`);\n }\n return {\n succeed(msg?: string) { if (!jsonMode && msg) console.error(` ✓ ${msg}`); return this as unknown as Ora; },\n fail(msg?: string) { if (!jsonMode && msg) console.error(` ✗ ${msg}`); return this as unknown as Ora; },\n stop() { return this as unknown as Ora; },\n start(msg?: string) { if (!jsonMode && msg) console.error(` … ${msg}`); return this as unknown as Ora; },\n warn(msg?: string) { if (!jsonMode && msg) console.error(` ⚠ ${msg}`); return this as unknown as Ora; },\n info(msg?: string) { if (!jsonMode && msg) console.error(` ℹ ${msg}`); return this as unknown as Ora; },\n text: text,\n isSpinning: false,\n } as unknown as Ora;\n}\n","import { cp, mkdir } from \"node:fs/promises\";\nimport { join, resolve } from \"node:path\";\nimport { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { checkbox } from \"@inquirer/prompts\";\nimport { input, password } from \"@inquirer/prompts\";\nimport { registry } from \"../registry/client.js\";\nimport { detectAgents, getAdapter, ALL_ADAPTERS } from \"../adapters/index.js\";\nimport type { AgentAdapter } from \"../adapters/types.js\";\nimport { extractTarball } from \"../lib/tarball.js\";\nimport { verifyIntegrity } from \"../lib/hash.js\";\nimport { addInstallation, ensureCacheDir } from \"../lib/config.js\";\nimport { buildMcpServerConfig, writeMcpForAgents } from \"../mcp/config.js\";\nimport * as out from \"../lib/output.js\";\nimport { isInteractive, spinner } from \"../lib/output.js\";\nimport { CliError, usageError } from \"../lib/errors.js\";\nimport type { EnvVarSchema, InstallationRecord } from \"../lib/types.js\";\nimport { writeFile } from \"node:fs/promises\";\n\n/** Parse skill@version syntax */\nfunction parseSkillArg(arg: string): { name: string; version: string } {\n // Handle scoped: @scope/name@version or Scope/name@version\n if (arg.startsWith(\"@\") || arg.includes(\"/\")) {\n const lastAt = arg.lastIndexOf(\"@\");\n // For @scope/name@ver, lastAt must be after the /\n // For Scope/name@ver, lastAt must be after the /\n const slashIdx = arg.indexOf(\"/\");\n if (lastAt > slashIdx) {\n return {\n name: arg.slice(0, lastAt),\n version: arg.slice(lastAt + 1),\n };\n }\n return { name: arg, version: \"latest\" };\n }\n // Handle unscoped: name@version\n const atIdx = arg.indexOf(\"@\");\n if (atIdx > 0) {\n return { name: arg.slice(0, atIdx), version: arg.slice(atIdx + 1) };\n }\n return { name: arg, version: \"latest\" };\n}\n\n/** Get the bare name (without scope) for directory naming */\nfunction getBareName(fullName: string): string {\n if (fullName.includes(\"/\")) {\n const parts = fullName.replace(/^@/, \"\").split(\"/\");\n return parts[parts.length - 1];\n }\n return fullName;\n}\n\nexport function createInstallCommand(): Command {\n return new Command(\"install\")\n .argument(\"<skill>\", \"Skill name, optionally with version (e.g., Chippers255/ai-commits, Chippers255/ai-commits@1.0.0)\")\n .option(\"--claude\", \"Install for Claude Code\")\n .option(\"--cursor\", \"Install for Cursor\")\n .option(\"--codex\", \"Install for Codex CLI\")\n .option(\"--copilot\", \"Install for VS Code / Copilot\")\n .option(\"--gemini\", \"Install for Gemini CLI\")\n .option(\"--cline\", \"Install for Cline\")\n .option(\"--all\", \"Install for all detected agents\")\n .option(\"-g, --global\", \"Install to user-level skills directory\")\n .option(\"-y, --yes\", \"Skip confirmation prompts\")\n .option(\"--no-mcp\", \"Skip MCP server configuration\")\n .option(\"--env <values...>\", \"Set MCP environment variables (e.g., --env API_KEY=xxx DB_HOST=localhost)\")\n .option(\"--registry <url>\", \"Use a custom registry URL\")\n .description(\n \"Install a skill from the registry into the current project. Downloads the skill package, \" +\n \"extracts it to agent-specific directories, and configures MCP servers if the skill declares them.\",\n )\n .addHelpText(\"after\", `\nExamples:\n shipables install neo4j --claude Install latest version for Claude Code\n shipables install neo4j@1.2.0 --all Install specific version for all agents\n shipables install @myorg/tool --cursor -y Install scoped skill, skip prompts\n shipables install neo4j --claude --no-mcp Install without MCP configuration\n shipables install neo4j --claude --env API_KEY=xxx Pass MCP env vars\n`)\n .action(async (skillArg: string, options) => {\n try {\n await runInstall(skillArg, options);\n } catch (err) {\n if (err instanceof CliError) {\n out.errorWithFix(err.message, err.fix || \"\");\n process.exit(err.exitCode);\n }\n out.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n });\n}\n\nasync function runInstall(\n skillArg: string,\n options: {\n claude?: boolean;\n cursor?: boolean;\n codex?: boolean;\n copilot?: boolean;\n gemini?: boolean;\n cline?: boolean;\n all?: boolean;\n global?: boolean;\n yes?: boolean;\n mcp?: boolean;\n env?: string[];\n registry?: string;\n },\n): Promise<void> {\n const { name: skillName, version: requestedVersion } = parseSkillArg(skillArg);\n const bareName = getBareName(skillName);\n const scope: \"project\" | \"global\" = options.global ? \"global\" : \"project\";\n\n // Parse --env key=value pairs into a map\n const envMap: Record<string, string> = {};\n if (options.env) {\n for (const pair of options.env) {\n const eqIdx = pair.indexOf(\"=\");\n if (eqIdx > 0) {\n envMap[pair.slice(0, eqIdx)] = pair.slice(eqIdx + 1);\n }\n }\n }\n\n // Step 1: Resolve version\n const resolveSpinner = spinner(`Resolving ${skillName}@${requestedVersion}...`);\n\n let versionDetail;\n try {\n versionDetail = await registry.getVersionDetail(skillName, requestedVersion);\n resolveSpinner.succeed(\n `Resolved ${skillName}@${requestedVersion} → ${chalk.bold(versionDetail.version)}`,\n );\n } catch (err) {\n resolveSpinner.fail(`Failed to resolve ${skillName}@${requestedVersion}`);\n throw err;\n }\n\n // Step 2: Download tarball\n const filename = `${bareName}-${versionDetail.version}.tgz`;\n const downloadSpinner = spinner(\n `Downloading ${filename} (${formatSize(versionDetail.size_bytes)})...`,\n );\n\n let tarballData: Buffer;\n let serverIntegrity: string;\n try {\n const result = await registry.downloadTarball(skillName, filename);\n tarballData = result.data;\n serverIntegrity = result.integrity;\n downloadSpinner.succeed(`Downloaded ${filename}`);\n } catch (err) {\n downloadSpinner.fail(`Failed to download ${filename}`);\n throw err;\n }\n\n // Step 3: Verify integrity\n if (serverIntegrity && versionDetail.tarball_sha512) {\n const integritySpinner = spinner(\"Verifying integrity...\");\n if (verifyIntegrity(tarballData, versionDetail.tarball_sha512)) {\n integritySpinner.succeed(\"Integrity verified\");\n } else {\n integritySpinner.fail(\"Integrity check failed — tarball may be corrupted\");\n throw new Error(\"SHA-512 integrity check failed\");\n }\n }\n\n // Cache the tarball\n const cacheDir = await ensureCacheDir();\n await writeFile(join(cacheDir, filename), tarballData);\n\n // Step 4: Extract tarball\n const extractDir = await extractTarball(tarballData);\n\n // Step 5: Select agents\n const selectedAgents = await selectAgents(options);\n if (selectedAgents.length === 0) {\n throw new Error(\"No agents selected. Use --claude, --cursor, etc. or --all\");\n }\n\n out.blank();\n out.info(\n `Detected agents: ${selectedAgents.map((a) => chalk.bold(a.displayName)).join(\", \")}`,\n );\n\n // Step 6: Copy skill files to each agent's directory\n out.header(\"Installing skill files:\");\n\n const skillDirs: Record<string, string> = {};\n const mcpConfigs: Record<string, string> = {};\n\n for (const agent of selectedAgents) {\n const targetDir = agent.getSkillDir(bareName, scope);\n const fullTargetDir = resolve(targetDir);\n\n await mkdir(fullTargetDir, { recursive: true });\n\n // Copy all files from extract dir to target\n // The tarball may have a root directory or may have files directly\n const { readdirSync, statSync } = await import(\"node:fs\");\n const extractedItems = readdirSync(extractDir);\n\n // Check if there's a single directory (common tarball pattern)\n let sourceDir = extractDir;\n if (extractedItems.length === 1) {\n const singleItem = join(extractDir, extractedItems[0]);\n if (statSync(singleItem).isDirectory()) {\n sourceDir = singleItem;\n }\n }\n\n await cp(sourceDir, fullTargetDir, { recursive: true });\n skillDirs[agent.name] = targetDir;\n\n // List the installed files\n const installedFiles = await listFiles(fullTargetDir, targetDir);\n for (const file of installedFiles) {\n out.success(file);\n }\n }\n\n // Step 7: Configure MCP servers (if applicable)\n const manifest = versionDetail.shipables_json;\n const hasMcp = manifest?.mcp?.servers && manifest.mcp.servers.length > 0;\n const skipMcp = options.mcp === false;\n\n if (hasMcp && !skipMcp) {\n out.header(\"Configuring MCP server:\");\n\n // Collect env var values\n const envValues: Record<string, string> = {};\n const envSchemas = manifest.config?.env || [];\n\n if (envSchemas.length > 0) {\n for (const envVar of envSchemas) {\n const value = await promptEnvVar(envVar, options.yes, envMap);\n envValues[envVar.name] = value;\n }\n out.blank();\n }\n\n for (const server of manifest.mcp!.servers) {\n const serverConfig = buildMcpServerConfig(server, envValues);\n const results = await writeMcpForAgents(\n selectedAgents,\n server.name,\n serverConfig,\n scope,\n );\n\n for (const result of results) {\n mcpConfigs[result.agent] = result.configPath;\n out.success(\n `MCP server configured in ${result.configPath}`,\n );\n }\n }\n }\n\n // Step 8: Update installed.json\n const projectPath = scope === \"global\" ? \"__global__\" : process.cwd();\n const record: InstallationRecord = {\n version: versionDetail.version,\n agents: selectedAgents.map((a) => a.name),\n installed_at: new Date().toISOString(),\n skill_dirs: skillDirs,\n mcp_configs: mcpConfigs,\n };\n await addInstallation(projectPath, skillName, record);\n\n // Step 9: Summary\n out.blank();\n out.success(\n `Installed ${chalk.bold(`${skillName}@${versionDetail.version}`)} for ${selectedAgents.map((a) => a.displayName).join(\", \")}`,\n );\n out.blank();\n\n // Cleanup extract dir\n const { rm } = await import(\"node:fs/promises\");\n await rm(extractDir, { recursive: true, force: true });\n}\n\nasync function selectAgents(options: {\n claude?: boolean;\n cursor?: boolean;\n codex?: boolean;\n copilot?: boolean;\n gemini?: boolean;\n cline?: boolean;\n all?: boolean;\n}): Promise<AgentAdapter[]> {\n // If specific agent flags are set, use those\n const flagged: AgentAdapter[] = [];\n const flagMap: Record<string, boolean | undefined> = {\n claude: options.claude,\n cursor: options.cursor,\n codex: options.codex,\n copilot: options.copilot,\n gemini: options.gemini,\n cline: options.cline,\n };\n\n for (const [name, selected] of Object.entries(flagMap)) {\n if (selected) {\n const adapter = getAdapter(name);\n if (adapter) flagged.push(adapter);\n }\n }\n\n if (flagged.length > 0) return flagged;\n\n // Auto-detect\n const detected = await detectAgents();\n\n if (options.all) {\n return detected.length > 0 ? detected : ALL_ADAPTERS;\n }\n\n if (detected.length === 0) {\n if (!isInteractive()) {\n throw usageError(\n \"No agents detected and no agent flags specified. Use --claude, --cursor, --codex, --copilot, --gemini, --cline, or --all.\",\n );\n }\n console.log(\n chalk.yellow(\n \"\\n No agents auto-detected. Select which agents to install for:\\n\",\n ),\n );\n const selected = await checkbox({\n message: \"Select agents\",\n choices: ALL_ADAPTERS.map((a) => ({\n name: a.displayName,\n value: a.name,\n })),\n });\n return selected\n .map((name) => getAdapter(name))\n .filter(Boolean) as AgentAdapter[];\n }\n\n if (detected.length === 1) {\n return detected;\n }\n\n // Multiple detected — in non-interactive mode, auto-select all\n if (!isInteractive()) {\n return detected;\n }\n\n // Multiple detected — prompt\n const selected = await checkbox({\n message: \"Multiple agents detected. Select which to install for:\",\n choices: detected.map((a) => ({\n name: a.displayName,\n value: a.name,\n checked: true,\n })),\n });\n return selected\n .map((name) => getAdapter(name))\n .filter(Boolean) as AgentAdapter[];\n}\n\nasync function promptEnvVar(\n envVar: EnvVarSchema,\n autoYes?: boolean,\n envMap?: Record<string, string>,\n): Promise<string> {\n // Check if value was provided via --env flag\n if (envMap && envVar.name in envMap) {\n return envMap[envVar.name];\n }\n\n const label = [\n envVar.name,\n envVar.required ? \"(required\" : \"(optional\",\n envVar.secret ? \", secret)\" : \")\",\n ].join(\" \");\n\n console.log(chalk.dim(` ${label}: ${envVar.description}`));\n\n if (autoYes && envVar.default) {\n return envVar.default;\n }\n\n // Non-interactive: use default or empty string with warning\n if (!isInteractive()) {\n if (envVar.default) {\n return envVar.default;\n }\n out.warn(`No value provided for ${envVar.name} — using empty string. Pass --env ${envVar.name}=<value> to set it.`);\n return \"\";\n }\n\n if (envVar.secret) {\n return await password({\n message: ` Enter value for ${envVar.name}:`,\n });\n }\n\n return await input({\n message: ` Enter value for ${envVar.name}:`,\n default: envVar.default,\n });\n}\n\nasync function listFiles(dir: string, prefix: string): Promise<string[]> {\n const { readdir, stat } = await import(\"node:fs/promises\");\n const { join } = await import(\"node:path\");\n const files: string[] = [];\n const items = await readdir(dir);\n for (const item of items) {\n const fullPath = join(dir, item);\n const s = await stat(fullPath);\n if (s.isDirectory()) {\n files.push(...(await listFiles(fullPath, `${prefix}/${item}`)));\n } else {\n files.push(`${prefix}/${item}`);\n }\n }\n return files;\n}\n\nfunction formatSize(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","import { Command } from \"commander\";\nimport { createInstallCommand } from \"./commands/install.js\";\nimport { createUninstallCommand } from \"./commands/uninstall.js\";\nimport { createSearchCommand } from \"./commands/search.js\";\nimport { createInfoCommand } from \"./commands/info.js\";\nimport { createListCommand } from \"./commands/list.js\";\nimport { createUpdateCommand } from \"./commands/update.js\";\nimport { createPublishCommand } from \"./commands/publish.js\";\nimport { createUnpublishCommand } from \"./commands/unpublish.js\";\nimport { createInitCommand } from \"./commands/init.js\";\nimport { createLoginCommand, createLogoutCommand } from \"./commands/login.js\";\nimport { createDoctorCommand } from \"./commands/doctor.js\";\nimport { createConfigCommand } from \"./commands/config.js\";\nimport { createStatsCommand } from \"./commands/stats.js\";\nimport { createProfileCommand } from \"./commands/profile.js\";\nimport { setJsonMode } from \"./lib/output.js\";\n\nconst program = new Command();\n\nprogram\n .name(\"shipables\")\n .description(\n \"CLI for installing, managing, and publishing AI agent skills. \" +\n \"Works with Claude Code, Cursor, Codex, Copilot, Gemini, and Cline. \" +\n \"Skills follow the Agent Skills open standard (https://agentskills.io).\",\n )\n .version(\"0.1.0\")\n .option(\"--json\", \"Output structured JSON (supported by most commands)\")\n .on(\"option:json\", () => {\n setJsonMode(true);\n })\n .addHelpText(\"after\", `\nExamples:\n shipables search \"database\" Search for database-related skills\n shipables install Chippers255/ai-commits --claude Install a skill for Claude Code\n shipables install @org/tool --all Install a scoped skill for all agents\n shipables list List skills installed in current project\n shipables info Chippers255/ai-commits --json Get skill details as JSON\n shipables init --name my-skill --description \"A skill for X\"\n Scaffold a new skill (non-interactive)\n shipables publish --yes --scope @myorg Publish without prompts\n shipables login --token cbl_xxxxx Non-interactive auth for CI/AI agents\n\nNon-interactive usage (CI/AI agents):\n Most commands work non-interactively. Use flags instead of prompts:\n - install: --claude/--cursor/--all for agents, --env KEY=VAL for MCP vars\n - init: --name and --description skip all prompts\n - publish: --yes skips confirmation, --scope sets org\n - login: --token skips browser OAuth\n - All commands: --json for structured output\n`);\n\nprogram.addCommand(createInstallCommand());\nprogram.addCommand(createUninstallCommand());\nprogram.addCommand(createSearchCommand());\nprogram.addCommand(createInfoCommand());\nprogram.addCommand(createListCommand());\nprogram.addCommand(createUpdateCommand());\nprogram.addCommand(createPublishCommand());\nprogram.addCommand(createUnpublishCommand());\nprogram.addCommand(createInitCommand());\nprogram.addCommand(createLoginCommand());\nprogram.addCommand(createLogoutCommand());\nprogram.addCommand(createDoctorCommand());\nprogram.addCommand(createConfigCommand());\nprogram.addCommand(createStatsCommand());\nprogram.addCommand(createProfileCommand());\n\nprogram.parse();\n","import { rm } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\nimport { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport {\n getInstallation,\n removeInstallation,\n updateInstallation,\n} from \"../lib/config.js\";\nimport { getAdapter } from \"../adapters/index.js\";\nimport * as out from \"../lib/output.js\";\nimport { CliError, notFoundError } from \"../lib/errors.js\";\n\nexport function createUninstallCommand(): Command {\n return new Command(\"uninstall\")\n .argument(\"<skill>\", \"Skill name to uninstall\")\n .option(\"--claude\", \"Uninstall from Claude Code only\")\n .option(\"--cursor\", \"Uninstall from Cursor only\")\n .option(\"--codex\", \"Uninstall from Codex CLI only\")\n .option(\"--copilot\", \"Uninstall from VS Code / Copilot only\")\n .option(\"--gemini\", \"Uninstall from Gemini CLI only\")\n .option(\"--cline\", \"Uninstall from Cline only\")\n .option(\"-g, --global\", \"Uninstall from global skills directory\")\n .description(\n \"Remove a skill and its MCP configuration. Removes skill files and MCP server \" +\n \"entries for all agents, or specific agents if flags are provided.\",\n )\n .addHelpText(\"after\", `\nExamples:\n shipables uninstall Chippers255/ai-commits Remove from all agents\n shipables uninstall Chippers255/ai-commits --claude Remove from Claude Code only\n shipables uninstall Chippers255/ai-commits -g Remove globally installed skill\n shipables uninstall @org/tool --cursor Remove scoped skill from Cursor\n`)\n .action(async (skillName: string, options) => {\n try {\n await runUninstall(skillName, options);\n } catch (err) {\n if (err instanceof CliError) {\n out.errorWithFix(err.message, err.fix || \"\");\n process.exit(err.exitCode);\n }\n out.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n });\n}\n\nasync function runUninstall(\n skillName: string,\n options: {\n claude?: boolean;\n cursor?: boolean;\n codex?: boolean;\n copilot?: boolean;\n gemini?: boolean;\n cline?: boolean;\n global?: boolean;\n },\n): Promise<void> {\n const projectPath = options.global ? \"__global__\" : process.cwd();\n const record = await getInstallation(projectPath, skillName);\n\n if (!record) {\n throw notFoundError(\n `'${skillName}' is not installed${options.global ? \" globally\" : \" in this project\"}.`,\n `List installed skills with: shipables list${options.global ? \" --global\" : \"\"}`,\n );\n }\n\n // Determine which agents to uninstall from\n const flagMap: Record<string, boolean | undefined> = {\n claude: options.claude,\n cursor: options.cursor,\n codex: options.codex,\n copilot: options.copilot,\n gemini: options.gemini,\n cline: options.cline,\n };\n\n const hasFlags = Object.values(flagMap).some(Boolean);\n const targetAgents = hasFlags\n ? record.agents.filter((a) => flagMap[a])\n : record.agents;\n\n if (targetAgents.length === 0) {\n throw notFoundError(\n `'${skillName}' is not installed for the specified agent(s).`,\n `Currently installed for: ${record.agents.join(\", \")}`,\n );\n }\n\n for (const agentName of targetAgents) {\n const adapter = getAdapter(agentName);\n if (!adapter) continue;\n\n out.header(`Uninstalling ${skillName} from ${adapter.displayName}:`);\n\n // Remove skill directory\n const skillDir = record.skill_dirs[agentName];\n if (skillDir) {\n try {\n await rm(resolve(skillDir), { recursive: true, force: true });\n out.success(`Removed ${skillDir}`);\n } catch {\n out.warn(`Could not remove ${skillDir}`);\n }\n }\n\n // Remove MCP config\n const mcpConfig = record.mcp_configs[agentName];\n if (mcpConfig && adapter) {\n try {\n await adapter.removeMcpConfig(mcpConfig, skillName);\n out.success(\n `Removed MCP server \"${skillName}\" from ${mcpConfig}`,\n );\n } catch {\n out.warn(`Could not update ${mcpConfig}`);\n }\n }\n }\n\n // Update installed.json\n const isFullUninstall = !hasFlags || targetAgents.length === record.agents.length;\n\n if (isFullUninstall) {\n await removeInstallation(projectPath, skillName);\n } else {\n // Partial uninstall — remove targeted agents from the record\n const remainingAgents = record.agents.filter((a) => !targetAgents.includes(a));\n const remainingSkillDirs: Record<string, string> = {};\n const remainingMcpConfigs: Record<string, string> = {};\n\n for (const agent of remainingAgents) {\n if (record.skill_dirs[agent]) remainingSkillDirs[agent] = record.skill_dirs[agent];\n if (record.mcp_configs[agent]) remainingMcpConfigs[agent] = record.mcp_configs[agent];\n }\n\n await updateInstallation(projectPath, skillName, {\n ...record,\n agents: remainingAgents,\n skill_dirs: remainingSkillDirs,\n mcp_configs: remainingMcpConfigs,\n });\n }\n\n out.blank();\n out.success(\n `Uninstalled ${chalk.bold(skillName)} from ${targetAgents.map((a) => getAdapter(a)?.displayName || a).join(\", \")}`,\n );\n out.info(\"Verify with: shipables list\");\n out.blank();\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { registry } from \"../registry/client.js\";\nimport * as out from \"../lib/output.js\";\nimport { getJsonMode, spinner } from \"../lib/output.js\";\nimport { CliError } from \"../lib/errors.js\";\n\nexport function createSearchCommand(): Command {\n return new Command(\"search\")\n .argument(\"<query>\", \"Search query\")\n .option(\"--agent <name>\", \"Filter by agent compatibility (claude, cursor, codex, copilot, gemini, cline)\")\n .option(\"--category <slug>\", \"Filter by category\")\n .option(\"--limit <n>\", \"Max results\", \"10\")\n .option(\"--json\", \"Output as JSON\")\n .description(\n \"Search the registry for skills. Returns skill name, version, weekly downloads, \" +\n \"and description. Use --json for structured output.\",\n )\n .addHelpText(\"after\", `\nExamples:\n shipables search \"database\" Search for database-related skills\n shipables search \"auth\" --agent claude Search skills compatible with Claude\n shipables search \"testing\" --category qa Search within a category\n shipables search \"deploy\" --json Get results as JSON\n shipables search \"api\" --limit 20 Get more results\n`)\n .action(async (query: string, options) => {\n try {\n await runSearch(query, options);\n } catch (err) {\n if (err instanceof CliError) {\n out.errorWithFix(err.message, err.fix || \"\");\n process.exit(err.exitCode);\n }\n out.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n });\n}\n\nasync function runSearch(\n query: string,\n options: {\n agent?: string;\n category?: string;\n limit?: string;\n json?: boolean;\n },\n): Promise<void> {\n const searchSpinner = spinner(\"Searching...\");\n\n const result = await registry.search({\n q: query,\n agent: options.agent,\n category: options.category,\n limit: parseInt(options.limit || \"10\", 10),\n });\n\n searchSpinner.stop();\n\n if (options.json || getJsonMode()) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n\n if (result.skills.length === 0) {\n out.blank();\n out.info(`No skills found matching \"${query}\".`);\n out.info(\"Try a broader query or browse categories at https://shipables.dev\");\n out.blank();\n return;\n }\n\n out.blank();\n out.table(\n [\"SKILL\", \"VERSION\", \"DOWNLOADS/WK\", \"DESCRIPTION\"],\n result.skills.map((s) => [\n s.full_name,\n s.latest_version,\n out.formatNumber(s.downloads_weekly),\n truncate(s.description, 50),\n ]),\n [25, 10, 14, 50],\n );\n\n out.blank();\n out.info(\n `${result.pagination.total} result${result.pagination.total === 1 ? \"\" : \"s\"} found`,\n );\n if (result.skills.length > 0) {\n out.info(`Get details: shipables info ${result.skills[0].full_name}`);\n out.info(`Install: shipables install ${result.skills[0].full_name} --<agent>`);\n }\n out.blank();\n}\n\nfunction truncate(s: string, max: number): string {\n if (s.length <= max) return s;\n return s.slice(0, max - 3) + \"...\";\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { registry } from \"../registry/client.js\";\nimport * as out from \"../lib/output.js\";\nimport { getJsonMode, spinner } from \"../lib/output.js\";\nimport { CliError } from \"../lib/errors.js\";\n\nexport function createInfoCommand(): Command {\n return new Command(\"info\")\n .argument(\"<skill>\", \"Skill name (e.g., Chippers255/ai-commits, @org/my-skill)\")\n .option(\"--json\", \"Output as JSON\")\n .description(\n \"Show detailed information about a skill including versions, MCP servers, \" +\n \"categories, and download counts.\",\n )\n .addHelpText(\"after\", `\nExamples:\n shipables info Chippers255/ai-commits Show details for a skill\n shipables info @org/my-skill Show details for a scoped skill\n shipables info Chippers255/ai-commits --json Get details as JSON\n`)\n .action(async (skillName: string, options) => {\n try {\n await runInfo(skillName, options);\n } catch (err) {\n if (err instanceof CliError) {\n out.errorWithFix(err.message, err.fix || \"\");\n process.exit(err.exitCode);\n }\n out.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n });\n}\n\nasync function runInfo(\n skillName: string,\n options: { json?: boolean },\n): Promise<void> {\n const infoSpinner = spinner(`Fetching info for ${skillName}...`);\n\n const detail = await registry.getSkillDetail(skillName);\n infoSpinner.stop();\n\n if (options.json || getJsonMode()) {\n console.log(JSON.stringify(detail, null, 2));\n return;\n }\n\n out.blank();\n\n // Title line\n const titleParts = [\n chalk.bold(`${detail.full_name}@${detail.latest_version}`),\n ];\n if (detail.license) titleParts.push(chalk.dim(`| ${detail.license}`));\n if (detail.repository_url) titleParts.push(chalk.dim(`| ${detail.repository_url}`));\n console.log(\" \" + titleParts.join(\" \"));\n\n out.blank();\n console.log(\" \" + detail.description);\n\n out.blank();\n\n // Metadata\n if (detail.author) {\n out.info(`Published by ${chalk.bold(detail.author.username)}`);\n }\n out.info(\n `Downloads: ${out.formatNumber(detail.downloads_total)} total | ${out.formatNumber(detail.downloads_weekly)} this week`,\n );\n if (detail.categories.length > 0) {\n out.info(`Categories: ${detail.categories.join(\", \")}`);\n }\n if (detail.keywords.length > 0) {\n out.info(`Keywords: ${detail.keywords.join(\", \")}`);\n }\n\n // MCP server info\n if (detail.mcp?.servers && detail.mcp.servers.length > 0) {\n out.blank();\n for (const server of detail.mcp.servers) {\n out.info(\n `MCP Server: ${chalk.bold(server.package)}${server.version ? `@${server.version}` : \"\"} (${server.registry || \"npm\"}, ${server.transport || \"stdio\"})`,\n );\n }\n }\n\n // Config env vars\n if (detail.config?.env && detail.config.env.length > 0) {\n out.blank();\n out.info(\"Required environment variables:\");\n for (const envVar of detail.config.env) {\n const flags = [\n envVar.required ? \"required\" : \"optional\",\n envVar.secret ? \"secret\" : null,\n ]\n .filter(Boolean)\n .join(\", \");\n out.info(\n ` ${chalk.bold(envVar.name)} (${flags}): ${envVar.description}`,\n );\n }\n }\n\n // Versions\n if (detail.versions.length > 0) {\n out.blank();\n out.info(\"Versions:\");\n for (const v of detail.versions.slice(0, 5)) {\n out.info(\n ` ${v.version.padEnd(12)} ${chalk.dim(v.created_at.slice(0, 10))} ${out.formatBytes(v.size_bytes)}`,\n );\n }\n if (detail.versions.length > 5) {\n out.info(\n chalk.dim(` ... and ${detail.versions.length - 5} more`),\n );\n }\n }\n\n out.blank();\n out.info(`Install: shipables install ${detail.full_name}`);\n out.info(`Install for specific agent: shipables install ${detail.full_name} --claude`);\n out.blank();\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { getProjectInstallations } from \"../lib/config.js\";\nimport * as out from \"../lib/output.js\";\nimport { getJsonMode } from \"../lib/output.js\";\n\nexport function createListCommand(): Command {\n return new Command(\"list\")\n .alias(\"ls\")\n .option(\"--json\", \"Output as JSON\")\n .option(\"-g, --global\", \"Show globally installed skills\")\n .description(\n \"List installed skills in the current project (or globally with -g). \" +\n \"Shows skill name, version, and which agents it's installed for.\",\n )\n .addHelpText(\"after\", `\nExamples:\n shipables list List skills in current project\n shipables list --global List globally installed skills\n shipables list --json Get installed skills as JSON\n shipables ls Alias for list\n`)\n .action(async (options) => {\n try {\n await runList(options);\n } catch (err) {\n out.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n });\n}\n\nasync function runList(options: {\n json?: boolean;\n global?: boolean;\n}): Promise<void> {\n const projectPath = options.global ? \"__global__\" : process.cwd();\n const installations = await getProjectInstallations(projectPath);\n const entries = Object.entries(installations);\n\n if (options.json || getJsonMode()) {\n console.log(JSON.stringify(installations, null, 2));\n return;\n }\n\n if (entries.length === 0) {\n out.blank();\n out.info(\n options.global\n ? \"No skills installed globally.\"\n : \"No skills installed in this project.\",\n );\n out.info(\"Install one with: shipables install <skill>\");\n out.info(\"Search for skills: shipables search <query>\");\n out.blank();\n return;\n }\n\n const label = options.global\n ? \"Installed skills (global):\"\n : `Installed skills (project: ${process.cwd()}):`;\n\n out.header(label);\n\n out.table(\n [\"SKILL\", \"VERSION\", \"AGENTS\"],\n entries.map(([name, record]) => [\n name,\n record.version,\n record.agents.join(\", \"),\n ]),\n [25, 10, 30],\n );\n\n out.blank();\n out.info(`${entries.length} skill${entries.length === 1 ? \"\" : \"s\"} installed`);\n out.info(\"Check for updates: shipables update\");\n out.blank();\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { confirm } from \"@inquirer/prompts\";\nimport { getProjectInstallations } from \"../lib/config.js\";\nimport { registry } from \"../registry/client.js\";\nimport { getAdapter } from \"../adapters/index.js\";\nimport * as out from \"../lib/output.js\";\nimport { isInteractive, spinner } from \"../lib/output.js\";\nimport { CliError, notFoundError } from \"../lib/errors.js\";\n\nexport function createUpdateCommand(): Command {\n return new Command(\"update\")\n .argument(\"[skill]\", \"Skill to update (omit to update all)\")\n .option(\"--dry-run\", \"Show what would be updated without making changes\")\n .option(\"-g, --global\", \"Update globally installed skills\")\n .option(\"-y, --yes\", \"Skip confirmation prompt\")\n .option(\"--self\", \"Update the shipables CLI itself\")\n .description(\n \"Update installed skills to latest version. \" +\n \"If no skill is specified, checks all installed skills for updates. \" +\n \"Use --yes to skip the confirmation prompt.\",\n )\n .addHelpText(\"after\", `\nExamples:\n shipables update Check and update all installed skills\n shipables update Chippers255/ai-commits Update a specific skill\n shipables update --dry-run Show available updates without installing\n shipables update --yes Update all without confirmation\n shipables update --self Update the shipables CLI itself\n`)\n .action(async (skill: string | undefined, options) => {\n try {\n if (options.self) {\n await runSelfUpdate();\n return;\n }\n await runUpdate(skill, options);\n } catch (err) {\n if (err instanceof CliError) {\n out.errorWithFix(err.message, err.fix || \"\");\n process.exit(err.exitCode);\n }\n out.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n });\n}\n\ninterface UpdateInfo {\n name: string;\n currentVersion: string;\n latestVersion: string;\n hasUpdate: boolean;\n agents: string[];\n}\n\nasync function runSelfUpdate(): Promise<void> {\n out.blank();\n out.info(\"To update the shipables CLI, run:\");\n out.blank();\n console.log(chalk.cyan(\" npm update -g @senso-ai/shipables\"));\n out.blank();\n out.info(\"Or if you installed with npx, it automatically uses the latest version.\");\n out.blank();\n}\n\nasync function runUpdate(\n skill: string | undefined,\n options: { dryRun?: boolean; global?: boolean; yes?: boolean },\n): Promise<void> {\n const projectPath = options.global ? \"__global__\" : process.cwd();\n const installations = await getProjectInstallations(projectPath);\n const entries = Object.entries(installations);\n\n if (entries.length === 0) {\n out.blank();\n out.info(\"No skills installed to update.\");\n out.info(\"Install a skill with: shipables install <skill>\");\n out.blank();\n return;\n }\n\n // Filter to specific skill if provided\n const toCheck = skill\n ? entries.filter(([name]) => name === skill)\n : entries;\n\n if (toCheck.length === 0) {\n throw notFoundError(\n `'${skill}' is not installed${options.global ? \" globally\" : \" in this project\"}.`,\n `List installed skills with: shipables list${options.global ? \" --global\" : \"\"}`,\n );\n }\n\n const checkSpinner = spinner(\"Checking for updates...\");\n\n const updates: UpdateInfo[] = [];\n for (const [name, record] of toCheck) {\n try {\n const detail = await registry.getSkillDetail(name);\n updates.push({\n name,\n currentVersion: record.version,\n latestVersion: detail.latest_version,\n hasUpdate: detail.latest_version !== record.version,\n agents: record.agents,\n });\n } catch {\n updates.push({\n name,\n currentVersion: record.version,\n latestVersion: \"unknown\",\n hasUpdate: false,\n agents: record.agents,\n });\n }\n }\n\n checkSpinner.stop();\n out.blank();\n\n out.table(\n [\"SKILL\", \"CURRENT\", \"LATEST\", \"STATUS\"],\n updates.map((u) => [\n u.name,\n u.currentVersion,\n u.latestVersion,\n u.hasUpdate\n ? chalk.yellow(\"update available\")\n : chalk.green(\"up to date\"),\n ]),\n [25, 10, 10, 20],\n );\n\n const updatable = updates.filter((u) => u.hasUpdate);\n\n if (updatable.length === 0) {\n out.blank();\n out.success(\"All skills are up to date.\");\n out.blank();\n return;\n }\n\n if (options.dryRun) {\n out.blank();\n out.info(\n `${updatable.length} skill${updatable.length === 1 ? \"\" : \"s\"} would be updated.`,\n );\n out.info(\"Run without --dry-run to apply updates.\");\n out.blank();\n return;\n }\n\n // Confirm (skip with --yes or non-interactive)\n if (!options.yes && isInteractive()) {\n out.blank();\n const shouldUpdate = await confirm({\n message: `Update ${updatable.length} skill${updatable.length === 1 ? \"\" : \"s\"}?`,\n default: true,\n });\n\n if (!shouldUpdate) {\n out.info(\"Update cancelled.\");\n return;\n }\n }\n\n // Import runInstall directly instead of going through command parsing\n const { createInstallCommand } = await import(\"./install.js\");\n\n for (const u of updatable) {\n out.blank();\n out.header(`Updating ${u.name} ${u.currentVersion} → ${u.latestVersion}...`);\n\n try {\n // Build agent flags from the existing installation record\n const agentFlags: string[] = [];\n for (const agent of u.agents) {\n agentFlags.push(`--${agent}`);\n }\n\n const globalFlag = options.global ? [\"-g\"] : [];\n\n const cmd = createInstallCommand();\n await cmd.parseAsync(\n [\"node\", \"shipables\", `${u.name}@${u.latestVersion}`, ...agentFlags, ...globalFlag, \"-y\"],\n { from: \"user\" },\n );\n out.success(\n `Updated ${u.name} ${u.currentVersion} → ${u.latestVersion}`,\n );\n } catch (err) {\n out.error(\n `Failed to update ${u.name}: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }\n\n out.blank();\n out.success(\n `${updatable.length} skill${updatable.length === 1 ? \"\" : \"s\"} updated.`,\n );\n out.info(\"Run `shipables doctor` to verify installations.\");\n out.blank();\n}\n","import { access, readFile, stat } from \"node:fs/promises\";\nimport { join, resolve, basename } from \"node:path\";\nimport { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { confirm, select } from \"@inquirer/prompts\";\nimport { parseSkillMdFile } from \"../skill/parser.js\";\nimport { readManifest, validateManifest } from \"../skill/manifest.js\";\nimport { createTarball } from \"../lib/tarball.js\";\nimport { sha512File } from \"../lib/hash.js\";\nimport { registry } from \"../registry/client.js\";\nimport { getToken } from \"../lib/config.js\";\nimport * as out from \"../lib/output.js\";\nimport { isInteractive, spinner } from \"../lib/output.js\";\nimport { CliError, authError, validationError } from \"../lib/errors.js\";\nimport type { MeResponse } from \"../lib/types.js\";\n\nexport function createPublishCommand(): Command {\n return new Command(\"publish\")\n .option(\"--dry-run\", \"Pack and validate without uploading\")\n .option(\"--tag <tag>\", \"Dist-tag (e.g., beta, next)\", \"latest\")\n .option(\n \"--access <level>\",\n \"Access level for scoped packages\",\n \"public\",\n )\n .option(\"-y, --yes\", \"Skip confirmation prompt\")\n .option(\"--scope <scope>\", \"Publish scope: personal username or @org name (e.g., --scope @myorg)\")\n .description(\n \"Pack and publish the skill in the current directory to the registry. \" +\n \"Requires SKILL.md and shipables.json. You must be logged in (shipables login). \" +\n \"Use --yes and --scope for non-interactive publishing.\",\n )\n .addHelpText(\"after\", `\nExamples:\n shipables publish Interactive publish\n shipables publish --dry-run Validate and pack without uploading\n shipables publish --yes Publish without confirmation prompt\n shipables publish --yes --scope @myorg Publish under an org, no prompts\n shipables publish --yes --scope personal Publish under your personal account\n`)\n .action(async (options) => {\n try {\n await runPublish(options);\n } catch (err) {\n if (err instanceof CliError) {\n out.errorWithFix(err.message, err.fix || \"\");\n process.exit(err.exitCode);\n }\n out.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n });\n}\n\nasync function runPublish(options: {\n dryRun?: boolean;\n tag?: string;\n access?: string;\n yes?: boolean;\n scope?: string;\n}): Promise<void> {\n const cwd = process.cwd();\n const skillMdPath = join(cwd, \"SKILL.md\");\n const manifestPath = join(cwd, \"shipables.json\");\n\n // Validate SKILL.md exists\n try {\n await access(skillMdPath);\n } catch {\n throw validationError(\n \"No SKILL.md found in the current directory.\",\n \"Run `shipables init` to create one, or `shipables init --name <name> --description <desc>` for non-interactive scaffolding.\",\n );\n }\n\n // Validate shipables.json exists\n try {\n await access(manifestPath);\n } catch {\n throw validationError(\n \"No shipables.json found in the current directory.\",\n \"Run `shipables init` to create one, or `shipables init --name <name> --description <desc>` for non-interactive scaffolding.\",\n );\n }\n\n // Parse and validate SKILL.md\n out.header(\"Validating:\");\n\n const skillMd = await parseSkillMdFile(skillMdPath);\n out.success(\n `SKILL.md — name: ${skillMd.frontmatter.name}, description present`,\n );\n\n // Parse and validate shipables.json\n const manifest = await readManifest(manifestPath);\n const manifestErrors = validateManifest(manifest);\n if (manifestErrors.length > 0) {\n for (const err of manifestErrors) {\n out.error(err);\n }\n throw validationError(\n \"shipables.json validation failed.\",\n \"Fix the errors listed above in shipables.json, then re-run: shipables publish\",\n );\n }\n out.success(\n `shipables.json — version: ${manifest.version}, schema valid`,\n );\n\n const skillBareName = skillMd.frontmatter.name;\n const version = manifest.version;\n\n // Check auth\n const token = await getToken();\n if (!token && !options.dryRun) {\n throw authError(\n \"Not authenticated. You must be logged in to publish.\",\n \"Run `shipables login` to authenticate, then re-run `shipables publish`.\",\n );\n }\n\n // Determine publish scope (personal or org)\n let fullName = skillBareName;\n\n if (!options.dryRun && token) {\n fullName = await resolvePublishScope(skillBareName, options.scope);\n }\n\n out.blank();\n console.log(` Publishing ${chalk.bold(`${fullName}@${version}`)}...`);\n\n // Read .shipablesignore if it exists\n let ignorePatterns: string[] = [];\n try {\n const ignoreRaw = await readFile(join(cwd, \".shipablesignore\"), \"utf-8\");\n ignorePatterns = ignoreRaw\n .split(\"\\n\")\n .map((l) => l.trim())\n .filter((l) => l && !l.startsWith(\"#\"));\n } catch {\n // No .shipablesignore, use defaults\n }\n\n // Pack tarball\n const tarballName = `${skillBareName}-${version}.tgz`;\n const tarballPath = join(cwd, tarballName);\n\n const packSpinner = spinner(\"Packing tarball...\");\n await createTarball(cwd, tarballPath, ignorePatterns);\n const tarballStat = await stat(tarballPath);\n const hash = await sha512File(tarballPath);\n packSpinner.succeed(\n `Packed ${tarballName} (${out.formatBytes(tarballStat.size)})`,\n );\n\n // List package contents\n out.blank();\n out.info(`Package contents:`);\n const files = await listAllFiles(cwd, ignorePatterns);\n for (const file of files.slice(0, 20)) {\n console.log(` ${file}`);\n }\n if (files.length > 20) {\n console.log(chalk.dim(` ... and ${files.length - 20} more files`));\n }\n\n if (options.dryRun) {\n out.blank();\n out.success(`Dry run complete — ${tarballName} (${out.formatBytes(tarballStat.size)}) packed but not uploaded.`);\n out.info(`Validated: SKILL.md (name: ${skillBareName}), shipables.json (version: ${version})`);\n\n // Clean up tarball\n const { unlink } = await import(\"node:fs/promises\");\n await unlink(tarballPath);\n out.blank();\n return;\n }\n\n // Confirm (skip with --yes or non-interactive)\n if (!options.yes && isInteractive()) {\n out.blank();\n const shouldPublish = await confirm({\n message: `Publish ${fullName}@${version} to the shipables registry?`,\n default: true,\n });\n\n if (!shouldPublish) {\n const { unlink } = await import(\"node:fs/promises\");\n await unlink(tarballPath);\n out.info(\"Publish cancelled.\");\n return;\n }\n }\n\n // Upload\n const uploadSpinner = spinner(\"Publishing...\");\n try {\n const result = await registry.publishWithName(fullName, tarballPath);\n uploadSpinner.succeed(`Published ${chalk.bold(`${fullName}@${version}`)}`);\n\n out.blank();\n if (result.url) {\n out.info(`View: ${result.url}`);\n }\n out.info(`Install with: npx shipables install ${fullName}`);\n } catch (err) {\n uploadSpinner.fail(\"Publish failed\");\n throw err;\n } finally {\n // Clean up tarball\n const { unlink } = await import(\"node:fs/promises\");\n try {\n await unlink(tarballPath);\n } catch {\n // ignore cleanup failure\n }\n }\n\n out.blank();\n}\n\nasync function resolvePublishScope(bareName: string, scopeFlag?: string): Promise<string> {\n let me: MeResponse;\n try {\n me = await registry.getMe();\n } catch {\n // Can't fetch profile — publish under personal name\n return bareName;\n }\n\n const orgs = me.organizations || [];\n const publishableOrgs = orgs.filter(\n (o) => o.role === \"owner\" || o.role === \"admin\",\n );\n\n // If --scope flag provided, use it directly\n if (scopeFlag) {\n if (scopeFlag === \"personal\" || scopeFlag === me.username) {\n return `${me.username}/${bareName}`;\n }\n const orgName = scopeFlag.replace(/^@/, \"\");\n const org = publishableOrgs.find((o) => o.name === orgName);\n if (org) {\n return `@${org.name}/${bareName}`;\n }\n // Fall through to treat it as the scope directly\n return `@${orgName}/${bareName}`;\n }\n\n if (publishableOrgs.length === 0) {\n // No orgs — publish under personal username\n return `${me.username}/${bareName}`;\n }\n\n // Build choices: personal + orgs\n const choices = [\n {\n name: `${me.username}/${bareName} (personal)`,\n value: `${me.username}/${bareName}`,\n },\n ...publishableOrgs.map((org) => ({\n name: `@${org.name}/${bareName} (${org.name})`,\n value: `@${org.name}/${bareName}`,\n })),\n ];\n\n if (choices.length === 1) {\n return choices[0].value;\n }\n\n // Non-interactive: default to first choice (personal)\n if (!isInteractive()) {\n out.info(`Auto-selected publish scope: ${choices[0].value}. Use --scope to specify a different scope.`);\n return choices[0].value;\n }\n\n const selected = await select({\n message: \"Publish as:\",\n choices,\n });\n\n return selected;\n}\n\nasync function listAllFiles(\n dir: string,\n ignorePatterns: string[],\n prefix = \"\",\n): Promise<string[]> {\n const { readdir, stat } = await import(\"node:fs/promises\");\n const defaultIgnore = [\n \"node_modules\",\n \".git\",\n \".env\",\n \".DS_Store\",\n \"*.tgz\",\n ];\n const allIgnore = [...new Set([...defaultIgnore, ...ignorePatterns])];\n\n const files: string[] = [];\n const items = await readdir(dir);\n\n for (const item of items) {\n const relativePath = prefix ? `${prefix}/${item}` : item;\n if (allIgnore.some((p) => item === p || (p.startsWith(\"*.\") && item.endsWith(p.slice(1))))) {\n continue;\n }\n\n const fullPath = join(dir, item);\n const s = await stat(fullPath);\n if (s.isDirectory()) {\n files.push(...(await listAllFiles(fullPath, ignorePatterns, relativePath)));\n } else {\n files.push(relativePath);\n }\n }\n\n return files;\n}\n","import { readFile } from \"node:fs/promises\";\nimport { parse as parseYaml } from \"yaml\";\nimport type { ParsedSkillMd, SkillFrontmatter } from \"../lib/types.js\";\n\nconst FRONTMATTER_RE = /^---\\n([\\s\\S]*?)\\n---\\n?([\\s\\S]*)$/;\n\nexport function parseSkillMd(raw: string): ParsedSkillMd {\n const match = raw.match(FRONTMATTER_RE);\n if (!match) {\n throw new Error(\n \"Invalid SKILL.md: missing YAML frontmatter (must start with ---)\",\n );\n }\n\n const yamlStr = match[1];\n const body = match[2].trim();\n\n let frontmatter: SkillFrontmatter;\n try {\n frontmatter = parseYaml(yamlStr) as SkillFrontmatter;\n } catch (err) {\n throw new Error(\n `Invalid SKILL.md frontmatter: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n\n if (!frontmatter.name) {\n throw new Error(\"Invalid SKILL.md: missing required field 'name'\");\n }\n if (!frontmatter.description) {\n throw new Error(\"Invalid SKILL.md: missing required field 'description'\");\n }\n\n // Validate name format\n if (!/^[a-z0-9][a-z0-9-]*$/.test(frontmatter.name)) {\n throw new Error(\n \"Invalid SKILL.md: name must be lowercase letters, numbers, and hyphens only\",\n );\n }\n if (frontmatter.name.length > 64) {\n throw new Error(\"Invalid SKILL.md: name must be 64 characters or less\");\n }\n\n return { frontmatter, body, raw };\n}\n\nexport async function parseSkillMdFile(\n filePath: string,\n): Promise<ParsedSkillMd> {\n const raw = await readFile(filePath, \"utf-8\");\n return parseSkillMd(raw);\n}\n","import { readFile } from \"node:fs/promises\";\nimport type { ShipablesManifest } from \"../lib/types.js\";\n\nconst SEMVER_RE =\n /^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$/;\n\nexport function validateManifest(manifest: ShipablesManifest): string[] {\n const errors: string[] = [];\n\n if (!manifest.version) {\n errors.push(\"shipables.json: missing required field 'version'\");\n } else if (!SEMVER_RE.test(manifest.version)) {\n errors.push(\n `shipables.json: version '${manifest.version}' is not valid semver`,\n );\n }\n\n if (manifest.keywords && !Array.isArray(manifest.keywords)) {\n errors.push(\"shipables.json: 'keywords' must be an array\");\n }\n\n if (manifest.categories && !Array.isArray(manifest.categories)) {\n errors.push(\"shipables.json: 'categories' must be an array\");\n }\n\n if (manifest.mcp?.servers) {\n for (const server of manifest.mcp.servers) {\n if (!server.name) {\n errors.push(\"shipables.json: MCP server missing 'name'\");\n }\n if (!server.package) {\n errors.push(\"shipables.json: MCP server missing 'package'\");\n }\n }\n }\n\n if (manifest.config?.env) {\n for (const envVar of manifest.config.env) {\n if (!envVar.name) {\n errors.push(\"shipables.json: env var missing 'name'\");\n }\n }\n }\n\n return errors;\n}\n\nexport async function readManifest(filePath: string): Promise<ShipablesManifest> {\n const raw = await readFile(filePath, \"utf-8\");\n let manifest: ShipablesManifest;\n try {\n manifest = JSON.parse(raw) as ShipablesManifest;\n } catch (err) {\n throw new Error(\n `Invalid shipables.json: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n return manifest;\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { confirm } from \"@inquirer/prompts\";\nimport { registry } from \"../registry/client.js\";\nimport { getToken } from \"../lib/config.js\";\nimport * as out from \"../lib/output.js\";\nimport { isInteractive, spinner } from \"../lib/output.js\";\nimport { CliError, authError, usageError } from \"../lib/errors.js\";\n\nexport function createUnpublishCommand(): Command {\n return new Command(\"unpublish\")\n .argument(\"<skill>\", \"Skill name with version (e.g., my-skill@1.0.0)\")\n .option(\"-f, --force\", \"Skip confirmation prompt\")\n .description(\n \"Yank a published version from the registry (within 72 hours of publish). \" +\n \"Yanked versions cannot be re-published with the same version number. \" +\n \"Use --force to skip the confirmation prompt.\",\n )\n .addHelpText(\"after\", `\nExamples:\n shipables unpublish my-skill@1.0.0 Interactive confirmation\n shipables unpublish my-skill@1.0.0 --force Skip confirmation\n shipables unpublish @org/tool@2.1.0 -f Unpublish a scoped skill\n`)\n .action(async (skillArg: string, options) => {\n try {\n await runUnpublish(skillArg, options);\n } catch (err) {\n if (err instanceof CliError) {\n out.errorWithFix(err.message, err.fix || \"\");\n process.exit(err.exitCode);\n }\n out.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n });\n}\n\nasync function runUnpublish(\n skillArg: string,\n options: { force?: boolean },\n): Promise<void> {\n const token = await getToken();\n if (!token) {\n throw authError(\n \"Not authenticated. You must be logged in to unpublish.\",\n \"Run `shipables login` to authenticate.\",\n );\n }\n\n // Parse skill@version\n const { name, version } = parseSkillVersion(skillArg);\n\n if (!version) {\n throw usageError(\n \"You must specify a version to unpublish (e.g., my-skill@1.0.0). Unpublishing an entire package is not supported.\",\n \"Use the format: shipables unpublish <skill>@<version>\",\n );\n }\n\n out.blank();\n out.warn(\n `This will yank ${chalk.bold(`${name}@${version}`)} from the registry.`,\n );\n out.warn(\"Yanked versions cannot be re-published with the same version number.\");\n out.blank();\n\n if (!options.force && isInteractive()) {\n const shouldProceed = await confirm({\n message: `Are you sure you want to unpublish ${name}@${version}?`,\n default: false,\n });\n\n if (!shouldProceed) {\n out.info(\"Unpublish cancelled.\");\n return;\n }\n }\n\n const unpubSpinner = spinner(`Unpublishing ${name}@${version}...`);\n try {\n await registry.unpublishVersion(name, version);\n unpubSpinner.succeed(`Unpublished ${chalk.bold(`${name}@${version}`)}`);\n } catch (err) {\n unpubSpinner.fail(\"Unpublish failed\");\n throw err;\n }\n\n out.blank();\n}\n\nfunction parseSkillVersion(arg: string): { name: string; version: string | null } {\n // Handle scoped: @scope/name@version or Scope/name@version\n if (arg.startsWith(\"@\") || arg.includes(\"/\")) {\n const lastAt = arg.lastIndexOf(\"@\");\n const slashIdx = arg.indexOf(\"/\");\n if (lastAt > slashIdx) {\n return {\n name: arg.slice(0, lastAt),\n version: arg.slice(lastAt + 1),\n };\n }\n return { name: arg, version: null };\n }\n // Handle unscoped: name@version\n const atIdx = arg.indexOf(\"@\");\n if (atIdx > 0) {\n return { name: arg.slice(0, atIdx), version: arg.slice(atIdx + 1) };\n }\n return { name: arg, version: null };\n}\n","import { mkdir, writeFile, access } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { input, confirm, checkbox } from \"@inquirer/prompts\";\nimport { isInteractive } from \"../lib/output.js\";\nimport { CliError, usageError } from \"../lib/errors.js\";\nimport * as out from \"../lib/output.js\";\n\nconst CATEGORIES = [\n \"databases\",\n \"apis\",\n \"testing\",\n \"devops\",\n \"security\",\n \"documentation\",\n \"code-quality\",\n \"frameworks\",\n \"cloud\",\n \"ai-ml\",\n \"data\",\n \"messaging\",\n \"monitoring\",\n \"authentication\",\n \"other\",\n];\n\ninterface InitOptions {\n name?: string;\n description?: string;\n author?: string;\n authorGithub?: string;\n license?: string;\n category?: string[];\n mcpPackage?: string;\n scripts?: boolean;\n references?: boolean;\n yes?: boolean;\n}\n\nexport function createInitCommand(): Command {\n return new Command(\"init\")\n .description(\n \"Scaffold a new skill in the current directory. Creates SKILL.md, shipables.json, README.md, and .shipablesignore. Use flags (--name, --description) for non-interactive mode.\",\n )\n .option(\"--name <name>\", \"Skill name (lowercase, hyphens, max 64 chars)\")\n .option(\"--description <desc>\", \"Description of the skill\")\n .option(\"--author <name>\", \"Author name\")\n .option(\"--author-github <gh>\", \"Author GitHub username\")\n .option(\"--license <license>\", \"License identifier (default: MIT)\")\n .option(\"--category <cat...>\", \"Categories (repeatable)\")\n .option(\"--mcp-package <pkg>\", \"MCP server npm package name\")\n .option(\"--scripts\", \"Include example scripts/ directory\")\n .option(\"--no-scripts\", \"Do not include example scripts/ directory\")\n .option(\"--references\", \"Include example references/ directory\")\n .option(\"--no-references\", \"Do not include example references/ directory\")\n .option(\"-y, --yes\", \"Accept defaults for optional fields\")\n .addHelpText(\n \"after\",\n `\nExamples:\n shipables init Interactive mode\n shipables init --name my-skill --description \"...\" Non-interactive with required fields\n shipables init --name my-skill --description \"...\" --mcp-package @org/server --category databases`,\n )\n .action(async (opts: InitOptions) => {\n try {\n await runInit(opts);\n } catch (err) {\n if (err instanceof CliError) {\n out.error(err.message);\n if (err.fix) {\n out.info(`Fix: ${err.fix}`);\n }\n process.exit(err.exitCode);\n }\n out.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n });\n}\n\nfunction validateName(val: string): true | string {\n if (!val) return \"Name is required\";\n if (!/^[a-z0-9][a-z0-9-]*$/.test(val))\n return \"Must be lowercase letters, numbers, and hyphens only\";\n if (val.length > 64) return \"Max 64 characters\";\n return true;\n}\n\nfunction validateDescription(val: string): true | string {\n if (!val) return \"Description is required\";\n if (val.length > 1024) return \"Max 1024 characters\";\n return true;\n}\n\nfunction validateCategories(cats: string[]): void {\n for (const c of cats) {\n if (!CATEGORIES.includes(c)) {\n throw usageError(\n `Invalid category: \"${c}\"`,\n `Valid categories: ${CATEGORIES.join(\", \")}`,\n );\n }\n }\n}\n\nasync function runInit(opts: InitOptions): Promise<void> {\n out.header(\"Create a new Shipables skill\");\n\n // Check if SKILL.md already exists\n const cwd = process.cwd();\n try {\n await access(join(cwd, \"SKILL.md\"));\n throw new Error(\"SKILL.md already exists in this directory\");\n } catch (err) {\n if (err instanceof Error && err.message.includes(\"already exists\")) {\n throw err;\n }\n // File doesn't exist — good\n }\n\n // Determine if we can run interactively\n const interactive = isInteractive();\n const hasRequiredFlags = opts.name !== undefined && opts.description !== undefined;\n\n // Non-interactive mode: require --name and --description\n if (!interactive && !hasRequiredFlags) {\n throw usageError(\n \"Non-interactive environment detected. --name and --description are required.\",\n \"Provide required flags: shipables init --name <name> --description <desc>\",\n );\n }\n\n // If both required flags are provided, skip all prompts (non-interactive path)\n if (hasRequiredFlags) {\n // Validate provided flag values\n const nameResult = validateName(opts.name!);\n if (nameResult !== true) {\n throw usageError(nameResult);\n }\n const descResult = validateDescription(opts.description!);\n if (descResult !== true) {\n throw usageError(descResult);\n }\n\n const name = opts.name!;\n const description = opts.description!;\n const authorName = opts.author ?? process.env.USER ?? \"your-name\";\n const authorGithub = opts.authorGithub ?? authorName;\n const license = opts.license ?? \"MIT\";\n const categories = opts.category ?? [];\n if (categories.length > 0) {\n validateCategories(categories);\n }\n const includeMcp = opts.mcpPackage !== undefined;\n const mcpPackage = opts.mcpPackage ?? \"\";\n const includeScripts = opts.scripts ?? false;\n const includeReferences = opts.references ?? false;\n\n await generateFiles({\n name,\n description,\n authorName,\n authorGithub,\n license,\n categories,\n includeMcp,\n mcpPackage,\n mcpEnvVars: [],\n includeScripts,\n includeReferences,\n skillDir: cwd,\n });\n return;\n }\n\n // Interactive mode — prompt for everything\n const name = await input({\n message: \"Skill name (lowercase, hyphens, max 64 chars):\",\n default: opts.name,\n validate: (val) => validateName(val),\n });\n\n const description = await input({\n message: \"Description (what the skill does and when to use it):\",\n default: opts.description,\n validate: (val) => validateDescription(val),\n });\n\n const authorName = opts.yes\n ? (opts.author ?? process.env.USER ?? \"your-name\")\n : await input({\n message: \"Author name:\",\n default: opts.author ?? process.env.USER ?? \"your-name\",\n });\n\n const authorGithub = opts.yes\n ? (opts.authorGithub ?? authorName)\n : await input({\n message: \"Author GitHub username:\",\n default: opts.authorGithub ?? authorName,\n });\n\n const license = opts.yes\n ? (opts.license ?? \"MIT\")\n : await input({\n message: \"License:\",\n default: opts.license ?? \"MIT\",\n });\n\n const categories = opts.yes\n ? (opts.category ?? [])\n : opts.category !== undefined\n ? opts.category\n : await checkbox({\n message: \"Categories (select with space):\",\n choices: CATEGORIES.map((c) => ({ name: c, value: c })),\n });\n\n if (categories.length > 0) {\n validateCategories(categories);\n }\n\n let includeMcp: boolean;\n let mcpPackage = \"\";\n let mcpEnvVars: Array<{ name: string; description: string; required: boolean; secret: boolean }> = [];\n\n if (opts.mcpPackage !== undefined) {\n includeMcp = true;\n mcpPackage = opts.mcpPackage;\n } else if (opts.yes) {\n includeMcp = false;\n } else {\n includeMcp = await confirm({\n message: \"Include MCP server configuration?\",\n default: false,\n });\n\n if (includeMcp) {\n mcpPackage = await input({\n message: \"MCP server npm package name:\",\n validate: (val) => (val ? true : \"Package name is required\"),\n });\n\n let addMore = true;\n while (addMore) {\n const envName = await input({\n message: \"Environment variable name (or empty to finish):\",\n });\n if (!envName) break;\n\n const envDesc = await input({\n message: `Description for ${envName}:`,\n });\n const envRequired = await confirm({\n message: `Is ${envName} required?`,\n default: true,\n });\n const envSecret = await confirm({\n message: `Is ${envName} a secret?`,\n default: false,\n });\n\n mcpEnvVars.push({\n name: envName,\n description: envDesc,\n required: envRequired,\n secret: envSecret,\n });\n }\n }\n }\n\n const includeScripts = opts.scripts !== undefined\n ? opts.scripts\n : opts.yes\n ? false\n : await confirm({\n message: \"Include example scripts/ directory?\",\n default: false,\n });\n\n const includeReferences = opts.references !== undefined\n ? opts.references\n : opts.yes\n ? false\n : await confirm({\n message: \"Include example references/ directory?\",\n default: false,\n });\n\n await generateFiles({\n name,\n description,\n authorName,\n authorGithub,\n license,\n categories,\n includeMcp,\n mcpPackage,\n mcpEnvVars,\n includeScripts,\n includeReferences,\n skillDir: cwd,\n });\n}\n\ninterface GenerateFilesOptions {\n name: string;\n description: string;\n authorName: string;\n authorGithub: string;\n license: string;\n categories: string[];\n includeMcp: boolean;\n mcpPackage: string;\n mcpEnvVars: Array<{ name: string; description: string; required: boolean; secret: boolean }>;\n includeScripts: boolean;\n includeReferences: boolean;\n skillDir: string;\n}\n\nasync function generateFiles(opts: GenerateFilesOptions): Promise<void> {\n const {\n name,\n description,\n authorName,\n authorGithub,\n license,\n categories,\n includeMcp,\n mcpPackage,\n mcpEnvVars,\n includeScripts,\n includeReferences,\n skillDir,\n } = opts;\n\n // Generate files\n out.header(\"Creating files:\");\n\n // SKILL.md\n const skillMd = generateSkillMd(\n name,\n description,\n license,\n authorGithub,\n includeReferences,\n includeMcp,\n mcpPackage,\n );\n await writeFile(join(skillDir, \"SKILL.md\"), skillMd, \"utf-8\");\n out.success(\"SKILL.md\");\n\n // shipables.json\n const shipablesJson = generateShipablesJson(\n name,\n authorName,\n authorGithub,\n categories,\n includeMcp,\n mcpPackage,\n mcpEnvVars,\n );\n await writeFile(\n join(skillDir, \"shipables.json\"),\n JSON.stringify(shipablesJson, null, 2) + \"\\n\",\n \"utf-8\",\n );\n out.success(\"shipables.json\");\n\n // README.md\n const readme = generateReadme(name, description);\n await writeFile(join(skillDir, \"README.md\"), readme, \"utf-8\");\n out.success(\"README.md\");\n\n // .shipablesignore\n const ignoreContent = [\n \"node_modules\",\n \".git\",\n \".env\",\n \".DS_Store\",\n \"*.tgz\",\n \".shipablesignore\",\n ].join(\"\\n\") + \"\\n\";\n await writeFile(join(skillDir, \".shipablesignore\"), ignoreContent, \"utf-8\");\n out.success(\".shipablesignore\");\n\n // scripts/\n if (includeScripts) {\n await mkdir(join(skillDir, \"scripts\"), { recursive: true });\n await writeFile(\n join(skillDir, \"scripts\", \"example.sh\"),\n `#!/bin/bash\\n# Example script for the ${name} skill\\necho \"Hello from ${name}\"\\n`,\n \"utf-8\",\n );\n out.success(\"scripts/example.sh\");\n }\n\n // references/\n if (includeReferences) {\n await mkdir(join(skillDir, \"references\"), { recursive: true });\n await writeFile(\n join(skillDir, \"references\", \"example.md\"),\n `# ${name} Reference\\n\\nDetailed reference documentation goes here.\\n`,\n \"utf-8\",\n );\n out.success(\"references/example.md\");\n }\n\n out.blank();\n out.success(`Skill ${chalk.bold(name)} initialized!`);\n out.blank();\n out.info(\"Next steps:\");\n out.info(` 1. Edit ${chalk.cyan(\"SKILL.md\")} with your agent instructions`);\n out.info(` 2. Edit ${chalk.cyan(\"shipables.json\")} with your metadata`);\n out.info(` 3. Run ${chalk.cyan(\"shipables publish\")} to publish`);\n out.blank();\n}\n\nfunction generateSkillMd(\n name: string,\n description: string,\n license: string,\n author: string,\n includeReferences: boolean,\n includeMcp: boolean,\n mcpPackage: string,\n): string {\n let md = `---\nname: ${name}\ndescription: ${description}\nlicense: ${license}\ncompatibility: Describe any requirements (tools, network access, etc.)\nmetadata:\n author: ${author}\n version: \"0.1.0\"\n---\n\n# ${titleCase(name)}\n\nInstructions for the AI agent go here. Describe patterns, best practices,\nand how to use the tools and resources this skill provides.\n`;\n\n if (includeMcp) {\n md += `\n## MCP Server\n\nThis skill works best with the ${mcpPackage} MCP server.\n`;\n }\n\n if (includeReferences) {\n md += `\n## References\n\n- See [references/example.md](references/example.md) for detailed documentation.\n`;\n }\n\n return md;\n}\n\nfunction generateShipablesJson(\n name: string,\n authorName: string,\n authorGithub: string,\n categories: string[],\n includeMcp: boolean,\n mcpPackage: string,\n mcpEnvVars: Array<{ name: string; description: string; required: boolean; secret: boolean }>,\n): Record<string, unknown> {\n const json: Record<string, unknown> = {\n version: \"0.1.0\",\n keywords: [],\n categories,\n author: {\n name: authorName,\n github: authorGithub,\n },\n };\n\n if (includeMcp && mcpPackage) {\n json.mcp = {\n servers: [\n {\n name: name,\n package: mcpPackage,\n registry: \"npm\",\n transport: \"stdio\",\n },\n ],\n };\n\n if (mcpEnvVars.length > 0) {\n json.config = {\n env: mcpEnvVars,\n };\n }\n }\n\n return json;\n}\n\nfunction generateReadme(name: string, description: string): string {\n return `# ${titleCase(name)}\n\n${description}\n\n## Installation\n\n\\`\\`\\`bash\nnpx shipables install ${name}\n\\`\\`\\`\n\n## Usage\n\nDescribe how the AI agent uses this skill.\n\n## License\n\nMIT\n`;\n}\n\nfunction titleCase(s: string): string {\n return s\n .split(\"-\")\n .map((w) => w.charAt(0).toUpperCase() + w.slice(1))\n .join(\" \");\n}\n","import { createServer } from \"node:http\";\nimport { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { loadConfig, saveConfig, getRegistry } from \"../lib/config.js\";\nimport * as out from \"../lib/output.js\";\nimport { spinner } from \"../lib/output.js\";\nimport { CliError } from \"../lib/errors.js\";\n\nexport function createLoginCommand(): Command {\n return new Command(\"login\")\n .description(\n \"Authenticate with the Shipables registry. Uses GitHub OAuth by default. For CI or AI agents, use --token with a pre-generated API token.\",\n )\n .option(\n \"--token <token>\",\n \"Authenticate with an API token (for CI/AI agents). Generate at https://shipables.dev/settings/tokens\",\n )\n .addHelpText(\n \"after\",\n \"\\nExamples:\\n shipables login Interactive GitHub OAuth\\n shipables login --token cbl_xxxxx Non-interactive token auth (CI/AI agents)\\n\",\n )\n .action(async (options) => {\n try {\n await runLogin(options);\n } catch (err) {\n if (err instanceof CliError) {\n out.error(err.message);\n process.exit(err.exitCode);\n }\n out.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n });\n}\n\nexport function createLogoutCommand(): Command {\n return new Command(\"logout\")\n .description(\"Remove stored credentials from ~/.shipables/config.json\")\n .action(async () => {\n try {\n await runLogout();\n } catch (err) {\n if (err instanceof CliError) {\n out.error(err.message);\n process.exit(err.exitCode);\n }\n out.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n });\n}\n\nasync function runLogin(options: { token?: string }): Promise<void> {\n if (options.token) {\n const registryUrl = await getRegistry();\n const config = await loadConfig();\n config.token = options.token;\n\n try {\n const resp = await fetch(`${registryUrl}/api/v1/auth/me`, {\n headers: {\n Authorization: `Bearer ${options.token}`,\n \"User-Agent\": \"shipables-cli\",\n },\n });\n if (resp.ok) {\n const me = (await resp.json()) as { username: string };\n config.username = me.username;\n }\n } catch {\n // Non-fatal — we still have the token\n }\n\n await saveConfig(config);\n out.blank();\n out.success(`Logged in as ${chalk.bold(config.username || \"unknown\")}`);\n out.info(chalk.dim(\"Token stored in ~/.shipables/config.json\"));\n out.info(\"You can now publish skills with: shipables publish\");\n out.blank();\n return;\n }\n\n const registryUrl = await getRegistry();\n\n // Start a temporary local HTTP server to receive the OAuth callback\n const { port, tokenPromise, server } = await startCallbackServer();\n\n const callbackUrl = `http://localhost:${port}/callback`;\n const loginUrl = `${registryUrl}/api/v1/auth/github?callback=${encodeURIComponent(callbackUrl)}&mode=cli`;\n\n out.blank();\n out.info(\"Open this URL in your browser to sign in with GitHub:\");\n out.blank();\n out.info(chalk.cyan(loginUrl));\n out.blank();\n\n // Try to open browser automatically\n await tryOpenBrowser(loginUrl);\n\n const spin = spinner(\"Waiting for authentication...\");\n\n try {\n const token = await tokenPromise;\n spin.stop();\n\n // Fetch the user info\n const config = await loadConfig();\n config.token = token;\n\n // Try to get username\n try {\n const resp = await fetch(`${registryUrl}/api/v1/auth/me`, {\n headers: {\n Authorization: `Bearer ${token}`,\n \"User-Agent\": \"shipables-cli\",\n },\n });\n if (resp.ok) {\n const me = (await resp.json()) as { username: string };\n config.username = me.username;\n }\n } catch {\n // Non-fatal — we still have the token\n }\n\n await saveConfig(config);\n\n out.blank();\n out.success(\n `Logged in as ${chalk.bold(config.username || \"unknown\")}`,\n );\n out.info(\n chalk.dim(\"Token stored in ~/.shipables/config.json\"),\n );\n out.blank();\n } catch (err) {\n spin.fail(\"Authentication failed\");\n throw err;\n } finally {\n server.close();\n }\n}\n\nasync function tryOpenBrowser(url: string): Promise<void> {\n const { exec } = await import(\"node:child_process\");\n const { promisify } = await import(\"node:util\");\n const execAsync = promisify(exec);\n\n // Order of preference: wslview (WSL), open (macOS), start (Windows), xdg-open (Linux)\n const commands =\n process.platform === \"darwin\"\n ? [\"open\"]\n : process.platform === \"win32\"\n ? [\"start\"]\n : [\"wslview\", \"xdg-open\"];\n\n for (const cmd of commands) {\n try {\n await execAsync(`${cmd} \"${url}\"`);\n return;\n } catch {\n // Try the next command\n }\n }\n}\n\nasync function startCallbackServer(): Promise<{\n port: number;\n tokenPromise: Promise<string>;\n server: ReturnType<typeof createServer>;\n}> {\n return new Promise((resolveServer) => {\n let resolveToken: (token: string) => void;\n let rejectToken: (err: Error) => void;\n const tokenPromise = new Promise<string>((res, rej) => {\n resolveToken = res;\n rejectToken = rej;\n });\n\n // Set a timeout\n const timeout = setTimeout(() => {\n rejectToken(new Error(\"Authentication timed out after 2 minutes\"));\n }, 120_000);\n\n const server = 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 if (token) {\n res.writeHead(200, { \"Content-Type\": \"text/html\" });\n res.end(\n \"<html><body><h2>Authentication successful!</h2><p>You can close this tab and return to the terminal.</p></body></html>\",\n );\n clearTimeout(timeout);\n resolveToken(token);\n } else {\n res.writeHead(400, { \"Content-Type\": \"text/html\" });\n res.end(\n \"<html><body><h2>Authentication failed</h2><p>No token received.</p></body></html>\",\n );\n clearTimeout(timeout);\n rejectToken(new Error(\"No token received in callback\"));\n }\n } else {\n res.writeHead(404);\n res.end();\n }\n });\n\n server.listen(0, () => {\n const addr = server.address();\n const port = typeof addr === \"object\" && addr ? addr.port : 0;\n resolveServer({ port, tokenPromise, server });\n });\n });\n}\n\nasync function runLogout(): Promise<void> {\n const config = await loadConfig();\n\n if (!config.token) {\n out.blank();\n out.info(\"Not currently logged in.\");\n out.blank();\n return;\n }\n\n delete config.token;\n delete config.username;\n await saveConfig(config);\n\n out.blank();\n out.success(\"Logged out. Token removed from ~/.shipables/config.json\");\n out.blank();\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport {\n getProjectInstallations,\n loadInstalled,\n} from \"../lib/config.js\";\nimport { getAdapter, detectAgents } from \"../adapters/index.js\";\nimport { registry } from \"../registry/client.js\";\nimport * as out from \"../lib/output.js\";\nimport { getJsonMode } from \"../lib/output.js\";\nimport { CliError } from \"../lib/errors.js\";\n\nexport function createDoctorCommand(): Command {\n return new Command(\"doctor\")\n .description(\n \"Check health of installed skills and agent configurations. \" +\n \"Validates skill directories exist, MCP configs are present, and checks for updates.\",\n )\n .option(\"-g, --global\", \"Check globally installed skills\")\n .option(\"--json\", \"Output results as JSON\")\n .addHelpText(\"after\", `\nExamples:\n shipables doctor Check all skills in current project\n shipables doctor --global Check globally installed skills\n shipables doctor --json Get results as JSON\n`)\n .action(async (options) => {\n try {\n await runDoctor(options);\n } catch (err) {\n if (err instanceof CliError) {\n out.errorWithFix(err.message, err.fix || \"\");\n process.exit(err.exitCode);\n }\n out.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n });\n}\n\nasync function runDoctor(options: { global?: boolean; json?: boolean }): Promise<void> {\n const projectPath = options.global ? \"__global__\" : process.cwd();\n const installations = await getProjectInstallations(projectPath);\n const entries = Object.entries(installations);\n\n if (entries.length === 0) {\n if (options.json || getJsonMode()) {\n console.log(JSON.stringify({ ok: true, skills: [], issues: 0, updates: 0 }, null, 2));\n return;\n }\n out.blank();\n out.info(\"No skills installed to check.\");\n out.info(\"Install a skill with: shipables install <skill>\");\n out.blank();\n return;\n }\n\n out.header(\"Checking installed skills...\");\n\n let totalIssues = 0;\n let totalUpdates = 0;\n const jsonResults: Array<Record<string, unknown>> = [];\n\n for (const [skillName, record] of entries) {\n const agentList = record.agents.join(\", \");\n console.log(\n ` ${chalk.bold(`${skillName}@${record.version}`)} (${agentList}):`,\n );\n\n const skillChecks: Array<Record<string, unknown>> = [];\n\n // Validate each agent's installation\n for (const agentName of record.agents) {\n const adapter = getAdapter(agentName);\n if (!adapter) continue;\n\n const skillDir = record.skill_dirs[agentName];\n const mcpConfig = record.mcp_configs[agentName] || null;\n\n if (skillDir) {\n const result = await adapter.validate(skillName, skillDir, mcpConfig);\n for (const check of result.checks) {\n skillChecks.push({ agent: agentName, ...check });\n if (check.status === \"pass\") {\n out.success(check.label);\n } else if (check.status === \"fail\") {\n out.error(check.label + (check.message ? ` — ${check.message}` : \"\"));\n totalIssues++;\n } else {\n out.warn(check.label + (check.message ? ` — ${check.message}` : \"\"));\n }\n }\n }\n }\n\n // Check for updates\n let updateAvailable: string | null = null;\n try {\n const detail = await registry.getSkillDetail(skillName);\n if (detail.latest_version !== record.version) {\n updateAvailable = detail.latest_version;\n out.warn(\n `Update available: ${record.version} → ${detail.latest_version}`,\n );\n totalUpdates++;\n }\n } catch {\n // Can't reach registry — skip update check\n }\n\n jsonResults.push({\n name: skillName,\n version: record.version,\n agents: record.agents,\n checks: skillChecks,\n update_available: updateAvailable,\n });\n\n out.blank();\n }\n\n if (options.json || getJsonMode()) {\n console.log(JSON.stringify({ ok: totalIssues === 0, skills: jsonResults, issues: totalIssues, updates: totalUpdates }, null, 2));\n return;\n }\n\n // Summary\n if (totalIssues === 0 && totalUpdates === 0) {\n out.success(\"All checks passed.\");\n } else {\n const parts: string[] = [];\n if (totalIssues > 0) {\n parts.push(`${totalIssues} issue${totalIssues === 1 ? \"\" : \"s\"} found`);\n }\n if (totalUpdates > 0) {\n parts.push(\n `${totalUpdates} update${totalUpdates === 1 ? \"\" : \"s\"} available`,\n );\n }\n out.info(`Summary: ${parts.join(\", \")}`);\n if (totalIssues > 0) {\n out.info(\"Fix issues by re-installing: shipables install <skill> --<agent>\");\n }\n if (totalUpdates > 0) {\n out.info(\"Apply updates with: shipables update\");\n }\n }\n out.blank();\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { loadConfig, saveConfig } from \"../lib/config.js\";\nimport * as out from \"../lib/output.js\";\nimport { CliError, usageError } from \"../lib/errors.js\";\nimport type { CliConfig } from \"../lib/types.js\";\n\nconst VALID_KEYS = [\"registry\", \"defaultAgents\", \"scope\"] as const;\ntype ConfigKey = (typeof VALID_KEYS)[number];\n\nexport function createConfigCommand(): Command {\n const cmd = new Command(\"config\")\n .description(\n \"Manage CLI configuration. Config is stored in ~/.shipables/config.json. \" +\n \"Valid keys: registry, defaultAgents, scope.\",\n )\n .addHelpText(\"after\", `\nExamples:\n shipables config list Show all config values\n shipables config get registry Get the registry URL\n shipables config set registry https://... Set a custom registry URL\n shipables config set defaultAgents claude,cursor Set default agents\n shipables config delete scope Remove a config value\n`);\n\n cmd\n .command(\"set <key> <value>\")\n .description(\"Set a config value (valid keys: registry, defaultAgents, scope)\")\n .action(async (key: string, value: string) => {\n try {\n await runConfigSet(key, value);\n } catch (err) {\n if (err instanceof CliError) {\n out.errorWithFix(err.message, err.fix || \"\");\n process.exit(err.exitCode);\n }\n out.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n });\n\n cmd\n .command(\"get <key>\")\n .description(\"Get a config value\")\n .action(async (key: string) => {\n try {\n await runConfigGet(key);\n } catch (err) {\n if (err instanceof CliError) {\n out.errorWithFix(err.message, err.fix || \"\");\n process.exit(err.exitCode);\n }\n out.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n });\n\n cmd\n .command(\"list\")\n .description(\"Show all config values\")\n .action(async () => {\n try {\n await runConfigList();\n } catch (err) {\n out.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n });\n\n cmd\n .command(\"delete <key>\")\n .description(\"Remove a config value\")\n .action(async (key: string) => {\n try {\n await runConfigDelete(key);\n } catch (err) {\n if (err instanceof CliError) {\n out.errorWithFix(err.message, err.fix || \"\");\n process.exit(err.exitCode);\n }\n out.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n });\n\n return cmd;\n}\n\nfunction validateKey(key: string): ConfigKey {\n if (!VALID_KEYS.includes(key as ConfigKey)) {\n throw usageError(\n `Invalid config key: '${key}'.`,\n `Valid keys: ${VALID_KEYS.join(\", \")}. Example: shipables config set registry https://api.shipables.dev`,\n );\n }\n return key as ConfigKey;\n}\n\nasync function runConfigSet(key: string, value: string): Promise<void> {\n const validKey = validateKey(key);\n const config = await loadConfig();\n\n if (validKey === \"defaultAgents\") {\n ((config as unknown) as Record<string, unknown>)[validKey] = value\n .split(\",\")\n .map((s) => s.trim());\n } else {\n ((config as unknown) as Record<string, unknown>)[validKey] = value;\n }\n\n await saveConfig(config);\n out.success(`Set ${key} = ${value}`);\n}\n\nasync function runConfigGet(key: string): Promise<void> {\n const validKey = validateKey(key);\n const config = await loadConfig();\n const value = ((config as unknown) as Record<string, unknown>)[validKey];\n\n if (value === undefined) {\n out.info(`${key}: (not set)`);\n } else {\n console.log(\n typeof value === \"object\" ? JSON.stringify(value) : String(value),\n );\n }\n}\n\nasync function runConfigList(): Promise<void> {\n const config = await loadConfig();\n\n out.blank();\n for (const key of VALID_KEYS) {\n const value = ((config as unknown) as Record<string, unknown>)[key];\n const display =\n value === undefined\n ? chalk.dim(\"(not set)\")\n : typeof value === \"object\"\n ? JSON.stringify(value)\n : String(value);\n console.log(` ${chalk.bold(key)}: ${display}`);\n }\n\n // Show auth status\n if (config.username) {\n console.log(\n ` ${chalk.bold(\"auth\")}: logged in as ${chalk.green(config.username)}`,\n );\n } else {\n console.log(` ${chalk.bold(\"auth\")}: ${chalk.dim(\"not logged in\")}`);\n }\n out.blank();\n}\n\nasync function runConfigDelete(key: string): Promise<void> {\n const validKey = validateKey(key);\n const config = await loadConfig();\n delete ((config as unknown) as Record<string, unknown>)[validKey];\n await saveConfig(config);\n out.success(`Deleted ${key}`);\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { registry } from \"../registry/client.js\";\nimport * as out from \"../lib/output.js\";\nimport { getJsonMode, spinner } from \"../lib/output.js\";\nimport { CliError } from \"../lib/errors.js\";\n\nexport function createStatsCommand(): Command {\n return new Command(\"stats\")\n .argument(\"<skill>\", \"Skill name (e.g., Chippers255/ai-commits, @org/my-skill)\")\n .option(\"--period <period>\", \"Time period: week, month, year\", \"month\")\n .option(\"--json\", \"Output as JSON\")\n .description(\n \"Show download statistics for a skill with a daily breakdown chart.\",\n )\n .addHelpText(\"after\", `\nExamples:\n shipables stats Chippers255/ai-commits Show monthly download stats\n shipables stats Chippers255/ai-commits --period week Show weekly stats\n shipables stats @org/tool --json Get stats as JSON\n`)\n .action(async (skillName: string, options) => {\n try {\n await runStats(skillName, options);\n } catch (err) {\n if (err instanceof CliError) {\n out.errorWithFix(err.message, err.fix || \"\");\n process.exit(err.exitCode);\n }\n out.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n });\n}\n\nasync function runStats(\n skillName: string,\n options: { period?: string; json?: boolean },\n): Promise<void> {\n const statsSpinner = spinner(`Fetching download stats for ${skillName}...`);\n\n const stats = await registry.getDownloadStats(skillName, options.period);\n statsSpinner.stop();\n\n if (options.json || getJsonMode()) {\n console.log(JSON.stringify(stats, null, 2));\n return;\n }\n\n out.blank();\n console.log(\n ` ${chalk.bold(stats.skill)} — ${stats.period} downloads: ${chalk.bold(out.formatNumber(stats.total))}`,\n );\n out.blank();\n\n if (stats.daily.length > 0) {\n // Find max for scaling the bar chart\n const maxCount = Math.max(...stats.daily.map((d) => d.count), 1);\n const barWidth = 30;\n\n for (const day of stats.daily) {\n const bar = \"█\".repeat(Math.round((day.count / maxCount) * barWidth));\n const date = day.date.slice(5); // MM-DD\n const count = String(day.count).padStart(6);\n console.log(` ${chalk.dim(date)} ${count} ${chalk.cyan(bar)}`);\n }\n }\n\n out.blank();\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { registry } from \"../registry/client.js\";\nimport { getToken, loadConfig } from \"../lib/config.js\";\nimport * as out from \"../lib/output.js\";\nimport { getJsonMode, spinner } from \"../lib/output.js\";\nimport { CliError, authError } from \"../lib/errors.js\";\n\nexport function createProfileCommand(): Command {\n return new Command(\"profile\")\n .argument(\"[username]\", \"Username to look up (defaults to current user)\")\n .option(\"--json\", \"Output as JSON\")\n .description(\n \"Show user profile and published skills. \" +\n \"Defaults to the currently logged-in user if no username is provided.\",\n )\n .addHelpText(\"after\", `\nExamples:\n shipables profile Show your profile\n shipables profile johndoe Show another user's profile\n shipables profile --json Get your profile as JSON\n`)\n .action(async (username: string | undefined, options) => {\n try {\n await runProfile(username, options);\n } catch (err) {\n if (err instanceof CliError) {\n out.errorWithFix(err.message, err.fix || \"\");\n process.exit(err.exitCode);\n }\n out.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n });\n}\n\nasync function runProfile(\n username: string | undefined,\n options: { json?: boolean },\n): Promise<void> {\n // If no username, use the current logged-in user\n if (!username) {\n const config = await loadConfig();\n if (config.username) {\n username = config.username;\n } else {\n const token = await getToken();\n if (!token) {\n throw authError(\n \"No username provided and not logged in.\",\n \"Run `shipables login` first, or provide a username: shipables profile <username>\",\n );\n }\n const me = await registry.getMe();\n username = me.username;\n }\n }\n\n const profileSpinner = spinner(`Fetching profile for ${username}...`);\n\n const [profile, skillsResult] = await Promise.all([\n registry.getUserProfile(username),\n registry.getUserSkills(username),\n ]);\n\n profileSpinner.stop();\n\n if (options.json || getJsonMode()) {\n console.log(JSON.stringify({ profile, skills: skillsResult.skills }, null, 2));\n return;\n }\n\n out.blank();\n\n // Profile header\n const displayName = profile.display_name || profile.username;\n console.log(` ${chalk.bold(displayName)}`);\n if (profile.display_name && profile.display_name !== profile.username) {\n console.log(` ${chalk.dim(`@${profile.username}`)}`);\n }\n out.blank();\n\n out.info(`Skills published: ${profile.skills_count}`);\n out.info(`Joined: ${profile.created_at.slice(0, 10)}`);\n\n // Published skills\n if (skillsResult.skills.length > 0) {\n out.blank();\n out.table(\n [\"SKILL\", \"VERSION\", \"DOWNLOADS/WK\", \"DESCRIPTION\"],\n skillsResult.skills.map((s) => [\n s.full_name,\n s.latest_version,\n out.formatNumber(s.downloads_weekly),\n truncate(s.description, 40),\n ]),\n [25, 10, 14, 40],\n );\n }\n\n out.blank();\n}\n\nfunction truncate(s: string, max: number): string {\n if (s.length <= max) return s;\n return s.slice(0, max - 3) + \"...\";\n}\n"],"mappings":"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","names":["readFile","join","conflictError","readFile","writeFile","mkdir","join","writeFile","stat","join","readFile","registry","init_config","mkdir","join","chalk","writeFile","rm","selected","readdir","stat","init_config","Command","resolve","Command","chalk","Command","Command","chalk","Command","Command","chalk","createInstallCommand","access","readFile","stat","join","Command","chalk","confirm","readFile","readFile","Command","join","access","chalk","readFile","stat","confirm","readdir","Command","chalk","confirm","mkdir","writeFile","access","join","Command","chalk","input","confirm","checkbox","name","description","authorName","authorGithub","license","categories","includeMcp","mcpPackage","includeScripts","includeReferences","Command","chalk","registryUrl","Command","chalk","Command","chalk","Command","chalk","Command","chalk","truncate","Command"]}
|