@senso-ai/shipables 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +60 -0
- package/dist/index.js +2672 -0
- package/dist/index.js.map +1 -0
- package/package.json +48 -0
|
@@ -0,0 +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"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@senso-ai/shipables",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "CLI for installing, managing, and publishing AI agent skills from the Shipables registry",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"shipables": "./dist/index.js"
|
|
8
|
+
},
|
|
9
|
+
"files": [
|
|
10
|
+
"dist",
|
|
11
|
+
"README.md"
|
|
12
|
+
],
|
|
13
|
+
"scripts": {
|
|
14
|
+
"build": "tsup",
|
|
15
|
+
"dev": "tsup --watch",
|
|
16
|
+
"typecheck": "tsc --noEmit"
|
|
17
|
+
},
|
|
18
|
+
"dependencies": {
|
|
19
|
+
"@inquirer/prompts": "^7.0.0",
|
|
20
|
+
"chalk": "^5.3.0",
|
|
21
|
+
"commander": "^12.1.0",
|
|
22
|
+
"ora": "^8.1.0",
|
|
23
|
+
"tar": "^7.4.0",
|
|
24
|
+
"yaml": "^2.6.0"
|
|
25
|
+
},
|
|
26
|
+
"devDependencies": {
|
|
27
|
+
"@types/node": "^22.0.0",
|
|
28
|
+
"tsup": "^8.3.0",
|
|
29
|
+
"typescript": "^5.6.0"
|
|
30
|
+
},
|
|
31
|
+
"engines": {
|
|
32
|
+
"node": ">=18.0.0"
|
|
33
|
+
},
|
|
34
|
+
"keywords": [
|
|
35
|
+
"ai",
|
|
36
|
+
"agent",
|
|
37
|
+
"skills",
|
|
38
|
+
"cli",
|
|
39
|
+
"registry",
|
|
40
|
+
"mcp",
|
|
41
|
+
"claude",
|
|
42
|
+
"cursor",
|
|
43
|
+
"codex",
|
|
44
|
+
"copilot"
|
|
45
|
+
],
|
|
46
|
+
"license": "MIT",
|
|
47
|
+
"homepage": "https://shipables.dev"
|
|
48
|
+
}
|