@agent-native/skills 0.2.12 → 0.2.14

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 CHANGED
@@ -10,10 +10,11 @@ npx @agent-native/skills@latest add --skill visual-plan --mode local-files
10
10
  ```
11
11
 
12
12
  Use `--skill <name>` one or more times to select specific skills, or omit it in
13
- an interactive terminal to choose from a prompt. Use `--client codex`,
14
- `--client claude-code`, or `--client all` to choose install targets; omitted
15
- `--client` defaults to all supported clients. For `visual-plan` and
16
- `visual-recap`, use `--mode hosted`, `--mode local-files`, or
13
+ an interactive terminal to choose from a prompt. The prompt puts `visual-plan`
14
+ and `visual-recap` first and preselects only those by default. Use
15
+ `--client codex`, `--client claude-code`, or `--client all` to choose install
16
+ targets; omitted `--client` defaults to all supported clients. For
17
+ `visual-plan` and `visual-recap`, use `--mode hosted`, `--mode local-files`, or
17
18
  `--mode self-hosted --mcp-url <url>` to choose hosted sharing, all-local text
18
19
  files, or your own Plan app. Add `--update-instructions` to append an idempotent
19
20
  managed block to `AGENTS.md` and/or `CLAUDE.md` for instruction-style skills.
@@ -1 +1 @@
1
- {"version":3,"file":"connect.d.ts","sourceRoot":"","sources":["../src/connect.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAEH,OAAO,EAAE,QAAQ,EAA2B,MAAM,yBAAyB,CAAC;AA6B5E;;;;;;;GAOG;AACH,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;IACvC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,aAAa,CAAC;IAC1B,OAAO,EAAE,QAAQ,EAAE,CAAC;IACpB,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,OAAO,CAAC;IACrB,GAAG,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,IAAI,CAAC,EAAE;QACL,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;QACzB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;QACnB,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;KACvC,CAAC;CACH;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE;QAAE,MAAM,EAAE,QAAQ,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC9C,aAAa,EAAE,OAAO,CAAC;IACvB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AA0CD,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,QAAQ,GAAG,OAAO,CAEhE;AAmWD;;;;;;GAMG;AACH,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,kBAAkB,GACvB,OAAO,CAAC,iBAAiB,CAAC,CAyH5B"}
1
+ {"version":3,"file":"connect.d.ts","sourceRoot":"","sources":["../src/connect.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAEH,OAAO,EAAE,QAAQ,EAA2B,MAAM,yBAAyB,CAAC;AA6B5E;;;;;;;GAOG;AACH,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;IACvC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,aAAa,CAAC;IAC1B,OAAO,EAAE,QAAQ,EAAE,CAAC;IACpB,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,OAAO,CAAC;IACrB,GAAG,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,IAAI,CAAC,EAAE;QACL,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;QACzB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;QACnB,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;KACvC,CAAC;CACH;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE;QAAE,MAAM,EAAE,QAAQ,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC9C,aAAa,EAAE,OAAO,CAAC;IACvB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AA0CD,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,QAAQ,GAAG,OAAO,CAEhE;AAiXD;;;;;;GAMG;AACH,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,kBAAkB,GACvB,OAAO,CAAC,iBAAiB,CAAC,CAyH5B"}
package/dist/connect.js CHANGED
@@ -242,11 +242,18 @@ async function runDeviceFlow(baseUrl, appSlug, clientArg, log, timeoutMs, deps =
242
242
  try {
243
243
  const { status, json } = await postJson(fetchImpl, `${baseUrl}${DEVICE_POLL_PATH}`, { device_code: start.device_code });
244
244
  if (status < 200 || status >= 300) {
245
- log(` Connect polling failed (HTTP ${status}): ` +
246
- responseMessage(json, "server returned an error."));
247
- return null;
245
+ if (isTerminalPollBody(json)) {
246
+ poll = json;
247
+ }
248
+ else {
249
+ log(` Connect polling failed (HTTP ${status}): ` +
250
+ responseMessage(json, "server returned an error."));
251
+ return null;
252
+ }
253
+ }
254
+ else {
255
+ poll = (json ?? { status: "pending" });
248
256
  }
249
- poll = (json ?? { status: "pending" });
250
257
  }
251
258
  catch {
252
259
  // Transient network error — keep polling until the deadline.
@@ -294,6 +301,12 @@ async function runDeviceFlow(baseUrl, appSlug, clientArg, log, timeoutMs, deps =
294
301
  }
295
302
  return null;
296
303
  }
304
+ function isTerminalPollBody(json) {
305
+ return (json?.status === "not_found" ||
306
+ json?.status === "error" ||
307
+ json?.status === "expired" ||
308
+ json?.status === "consumed");
309
+ }
297
310
  // ---------------------------------------------------------------------------
298
311
  // Public entry point
299
312
  // ---------------------------------------------------------------------------
@@ -1 +1 @@
1
- {"version":3,"file":"connect.js","sourceRoot":"","sources":["../src/connect.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * MCP-server registration + authentication for `@agent-native/skills`.\n *\n * This is a dependency-free port of the MCP-config-writing + device-code/OAuth\n * flow that lives in `@agent-native/core`'s `cli/connect.ts`. The skills package\n * ships standalone (no `@agent-native/core` dependency), so this module\n * re-implements just the registration surface against the shared on-disk\n * writers in `./mcp-config-writers.js`. It writes the SAME config and speaks the\n * SAME device-code/OAuth protocol as core.\n *\n * Two client families, exactly as in core:\n * - OAuth-capable (Claude Code, Cursor, OpenCode, GitHub Copilot / VS Code):\n * get a URL-only HTTP MCP entry (no bearer headers). The user authenticates\n * in-host via standard remote MCP OAuth.\n * - Device-code (codex, cowork): run the browser device-code flow against the\n * descriptor's hosted URL, then write the entry WITH the minted bearer token\n * + headers. Non-interactive (or no TTY) skips writing device-code configs,\n * surfacing the exact `agent-native connect <url>` fallback command.\n *\n * Server contract (identical paths + JSON field names to core):\n * POST <hostedUrl>/_agent-native/mcp/connect/device/start (no auth)\n * body { client?, app? }\n * → { device_code, user_code, verification_uri,\n * verification_uri_complete, interval, expires_in }\n * POST <hostedUrl>/_agent-native/mcp/connect/device/poll (no auth)\n * body { device_code }\n * → { status: \"pending\" }\n * | { status: \"approved\", token, mcpUrl, serverName, mcpServerEntry }\n * | { status: \"expired\" } | { status: \"consumed\" }\n * | { status: \"error\" | \"not_found\", message? }\n *\n * Node-only. Node built-ins + global fetch only; no npm deps.\n */\n\nimport { ClientId, writeHttpEntryForClient } from \"./mcp-config-writers.js\";\n\nconst DEVICE_START_PATH = \"/_agent-native/mcp/connect/device/start\";\nconst DEVICE_POLL_PATH = \"/_agent-native/mcp/connect/device/poll\";\nconst MCP_PATH = \"/_agent-native/mcp\";\n\n/** OAuth-capable clients (in-host remote MCP OAuth, never a local bearer). */\nconst REMOTE_MCP_OAUTH_CLIENTS = new Set<ClientId>([\n \"claude-code\",\n \"claude-code-cli\",\n \"cursor\",\n \"opencode\",\n \"github-copilot\",\n]);\n\nconst CLIENT_LABELS: Record<ClientId, string> = {\n \"claude-code\": \"Claude Code\",\n \"claude-code-cli\": \"Claude Code CLI\",\n codex: \"Codex\",\n cowork: \"Claude Cowork\",\n cursor: \"Cursor\",\n opencode: \"OpenCode\",\n \"github-copilot\": \"GitHub Copilot / VS Code\",\n};\n\n// ---------------------------------------------------------------------------\n// Public types\n// ---------------------------------------------------------------------------\n\n/**\n * Describes one MCP server to register. `serverName` is the canonical config\n * key; `aliases` are additional config keys that point at the same MCP URL\n * (e.g. `plan` + `agent-native-plans`). `hostedUrl` is the deployed app origin\n * the device-code flow authenticates against; `mcpUrl` is the resolved MCP\n * endpoint written into the config (defaults to `<hostedUrl>/_agent-native/mcp`\n * when only `hostedUrl` is supplied).\n */\nexport interface McpDescriptor {\n serverName: string;\n mcpUrl: string;\n aliases?: string[];\n authMode?: \"oauth\" | \"device\" | \"none\";\n hostedUrl?: string;\n}\n\nexport interface RegisterMcpOptions {\n descriptor: McpDescriptor;\n clients: ClientId[];\n scope: \"user\" | \"project\";\n baseDir: string;\n interactive: boolean;\n log?: (m: string) => void;\n deviceFlowTimeoutMs?: number;\n deps?: {\n fetchImpl?: typeof fetch;\n now?: () => number;\n sleep?: (ms: number) => Promise<void>;\n };\n}\n\nexport interface RegisterMcpResult {\n written: { client: ClientId; file: string }[];\n authenticated: boolean;\n guidance: string[];\n}\n\n// ---------------------------------------------------------------------------\n// Device-code protocol shapes (field names match core EXACTLY).\n// ---------------------------------------------------------------------------\n\ninterface DeviceStartResponse {\n device_code: string;\n user_code: string;\n verification_uri: string;\n verification_uri_complete: string;\n interval?: number;\n expires_in?: number;\n}\n\ninterface DevicePollResponse {\n status:\n | \"pending\"\n | \"approved\"\n | \"expired\"\n | \"consumed\"\n | \"error\"\n | \"not_found\";\n token?: string;\n mcpUrl?: string;\n serverName?: string;\n mcpServerEntry?: Record<string, unknown>;\n message?: string;\n error?: string;\n}\n\ninterface DeviceGrant {\n token?: string;\n mcpUrl: string;\n serverName: string;\n headers?: Record<string, string>;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nexport function supportsRemoteMcpOAuth(client: ClientId): boolean {\n return REMOTE_MCP_OAUTH_CLIENTS.has(client);\n}\n\nconst DEFAULT_DEVICE_FLOW_TIMEOUT_MS = 90_000;\n\nfunction realSleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/** Trailing-slash-stripped origin+path for a hosted app URL. */\nfunction stripTrailingSlash(url: string): string {\n return url.replace(/\\/+$/, \"\");\n}\n\n/**\n * Resolve the MCP endpoint URL for a descriptor. Prefers an explicit `mcpUrl`,\n * otherwise derives `<hostedUrl>/_agent-native/mcp` (mirrors core's\n * `mcpUrlForBaseUrl`). Returns `undefined` when neither is usable.\n */\nfunction resolveMcpUrl(descriptor: McpDescriptor): string | undefined {\n if (descriptor.mcpUrl && descriptor.mcpUrl.trim()) {\n return descriptor.mcpUrl.trim();\n }\n if (descriptor.hostedUrl && descriptor.hostedUrl.trim()) {\n const base = stripTrailingSlash(descriptor.hostedUrl.trim());\n return `${base}${MCP_PATH}`;\n }\n return undefined;\n}\n\n/** Base (origin) URL of the deployed app the device flow runs against. */\nfunction resolveBaseUrl(descriptor: McpDescriptor): string | undefined {\n if (descriptor.hostedUrl && descriptor.hostedUrl.trim()) {\n return stripTrailingSlash(descriptor.hostedUrl.trim());\n }\n // Fall back to stripping the MCP path off an explicit mcpUrl.\n if (descriptor.mcpUrl && descriptor.mcpUrl.trim()) {\n const trimmed = stripTrailingSlash(descriptor.mcpUrl.trim());\n if (trimmed.endsWith(MCP_PATH)) {\n return trimmed.slice(0, -MCP_PATH.length);\n }\n }\n return undefined;\n}\n\n/** All config keys to register: the canonical name plus any aliases (deduped). */\nfunction configKeys(descriptor: McpDescriptor): string[] {\n const keys: string[] = [descriptor.serverName];\n for (const alias of descriptor.aliases ?? []) {\n if (alias && alias !== descriptor.serverName && !keys.includes(alias)) {\n keys.push(alias);\n }\n }\n return keys;\n}\n\nfunction responseMessage(json: any, fallback: string): string {\n const message =\n typeof json?.message === \"string\"\n ? json.message\n : typeof json?.error === \"string\"\n ? json.error\n : \"\";\n return message.trim() || fallback;\n}\n\nasync function postJson(\n fetchImpl: typeof fetch,\n url: string,\n body: unknown,\n): Promise<{ status: number; json: any }> {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 30_000);\n try {\n const response = await fetchImpl(url, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify(body ?? {}),\n signal: controller.signal,\n });\n let json: any = null;\n try {\n json = await response.json();\n } catch {\n json = null;\n }\n return { status: response.status, json };\n } finally {\n clearTimeout(timeout);\n }\n}\n\n/**\n * The exact no-browser fallback command core prints. Surfaced as guidance when\n * a device-code client is asked to register non-interactively.\n */\nfunction clientArgForClients(clients: ClientId[]): string {\n return clients.length === 1 ? clients[0] : clients.join(\",\");\n}\n\nfunction fallbackConnectCommand(\n baseUrl: string,\n clients: ClientId[],\n scope: string,\n): string {\n return `npx @agent-native/core@latest connect ${baseUrl} --client ${clientArgForClients(\n clients,\n )} --scope ${scope}`;\n}\n\n/** Write a URL-only entry (no bearer) for every config key, collecting files. */\nfunction writeUrlOnlyEntries(\n clients: ClientId[],\n keys: string[],\n mcpUrl: string,\n scope: string,\n baseDir: string,\n written: { client: ClientId; file: string }[],\n errors: string[],\n): void {\n for (const client of clients) {\n for (const key of keys) {\n try {\n const file = writeHttpEntryForClient(\n client,\n key,\n mcpUrl,\n undefined,\n baseDir,\n scope,\n undefined,\n );\n written.push({ client, file });\n } catch (err: any) {\n errors.push(\n `Could not write ${key} for ${client}: ${err?.message ?? err}`,\n );\n }\n }\n }\n}\n\nfunction manualConnectGuidance(\n baseUrl: string,\n clients: ClientId[],\n scope: string,\n): string {\n return (\n `To authenticate ${describeClients(clients)}, run: ` +\n fallbackConnectCommand(baseUrl, clients, scope)\n );\n}\n\nfunction oauthNextStepsForClients(\n clients: ClientId[],\n serverName?: string,\n): string[] {\n const lines: string[] = [];\n if (clients.includes(\"claude-code\") || clients.includes(\"claude-code-cli\")) {\n lines.push(\n \"Claude Code: restart Claude Code, run /mcp, and choose Authenticate.\",\n );\n }\n if (clients.includes(\"cursor\")) {\n lines.push(\n \"Cursor: restart or reload Cursor, then authenticate the MCP server from Cursor MCP settings if prompted.\",\n );\n }\n if (clients.includes(\"opencode\")) {\n lines.push(\n `OpenCode: run opencode mcp auth ${serverName ?? \"<server-name>\"} or authenticate on first use.`,\n );\n }\n if (clients.includes(\"github-copilot\")) {\n lines.push(\n \"GitHub Copilot / VS Code: reload VS Code, open the MCP config, and use the Auth action above the server if prompted.\",\n );\n }\n return lines;\n}\n\n/** Write a token+headers entry for every config key, collecting files. */\nfunction writeAuthedEntries(\n clients: ClientId[],\n keys: string[],\n mcpUrl: string,\n token: string | undefined,\n headers: Record<string, string> | undefined,\n scope: string,\n baseDir: string,\n written: { client: ClientId; file: string }[],\n errors: string[],\n): void {\n for (const client of clients) {\n for (const key of keys) {\n try {\n const file = writeHttpEntryForClient(\n client,\n key,\n mcpUrl,\n token,\n baseDir,\n scope,\n headers,\n );\n written.push({ client, file });\n } catch (err: any) {\n errors.push(\n `Could not write ${key} for ${client}: ${err?.message ?? err}`,\n );\n }\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Device-code flow (dependency-free port of core's runDeviceFlow)\n// ---------------------------------------------------------------------------\n\n/**\n * Run the device-code flow against `baseUrl` and return the approved grant, or\n * `null` (after logging a clear message) on expiry/consumed/error/timeout. Same\n * state machine and field handling as core; the spinner/browser-open are\n * dropped since this runs inside a non-interactive installer context.\n */\nasync function runDeviceFlow(\n baseUrl: string,\n appSlug: string,\n clientArg: string,\n log: (m: string) => void,\n timeoutMs: number | undefined,\n deps: RegisterMcpOptions[\"deps\"] = {},\n): Promise<DeviceGrant | null> {\n const fetchImpl = deps.fetchImpl ?? fetch;\n const sleep = deps.sleep ?? realSleep;\n const now = deps.now ?? (() => Date.now());\n\n let start: DeviceStartResponse;\n try {\n const { status, json } = await postJson(\n fetchImpl,\n `${baseUrl}${DEVICE_START_PATH}`,\n { client: clientArg, app: appSlug },\n );\n if (status < 200 || status >= 300 || !json?.device_code) {\n log(\n ` Could not start the connect flow on ${baseUrl} (HTTP ${status}). ` +\n `Is this an agent-native app, and is it deployed with the connect ` +\n `endpoint enabled?`,\n );\n return null;\n }\n start = json as DeviceStartResponse;\n } catch (err: any) {\n log(\n ` Could not reach ${baseUrl} (${err?.message ?? err}). ` +\n `Check the URL and your network.`,\n );\n return null;\n }\n\n const interval = Math.max(1, Number(start.interval) || 5);\n const expiresIn = Math.max(interval, Number(start.expires_in) || 600);\n const serverDeadlineMs = expiresIn * 1000;\n const installerDeadlineMs = Math.max(\n 0,\n timeoutMs ?? DEFAULT_DEVICE_FLOW_TIMEOUT_MS,\n );\n const waitMs = Math.min(serverDeadlineMs, installerDeadlineMs);\n const waitWasCapped = waitMs < serverDeadlineMs;\n const deadline = now() + waitMs;\n\n log(\"\");\n log(` Connecting to ${baseUrl}`);\n log(\"\");\n log(` Your code: ${start.user_code}`);\n log(` Open: ${start.verification_uri_complete}`);\n log(\"\");\n log(\" Approve in the browser to finish.\");\n\n while (now() < deadline) {\n let poll: DevicePollResponse;\n try {\n const { status, json } = await postJson(\n fetchImpl,\n `${baseUrl}${DEVICE_POLL_PATH}`,\n { device_code: start.device_code },\n );\n if (status < 200 || status >= 300) {\n log(\n ` Connect polling failed (HTTP ${status}): ` +\n responseMessage(json, \"server returned an error.\"),\n );\n return null;\n }\n poll = (json ?? { status: \"pending\" }) as DevicePollResponse;\n } catch {\n // Transient network error — keep polling until the deadline.\n poll = { status: \"pending\" };\n }\n\n if (poll.status === \"approved\") {\n const token = poll.token ?? \"\";\n const mcpUrl = poll.mcpUrl ?? `${baseUrl}${MCP_PATH}`;\n const serverName = poll.serverName ?? appSlug;\n const headers =\n poll.mcpServerEntry &&\n typeof poll.mcpServerEntry === \"object\" &&\n poll.mcpServerEntry.headers &&\n typeof poll.mcpServerEntry.headers === \"object\"\n ? (poll.mcpServerEntry.headers as Record<string, string>)\n : undefined;\n log(\" Approved.\");\n return { token: token || undefined, mcpUrl, serverName, headers };\n }\n if (poll.status === \"expired\") {\n log(\" The connect request expired before it was approved.\");\n log(\" Run the command again to retry.\");\n return null;\n }\n if (poll.status === \"consumed\") {\n log(\" This connect code was already used. Run the command again.\");\n return null;\n }\n if (poll.status === \"error\" || poll.status === \"not_found\") {\n log(\n ` Connect polling failed: ${responseMessage(\n poll,\n poll.status === \"not_found\"\n ? \"device code was not found.\"\n : \"server returned an error.\",\n )}`,\n );\n return null;\n }\n\n const remainingMs = deadline - now();\n if (remainingMs <= 0) break;\n await sleep(Math.min(interval * 1000, remainingMs));\n }\n\n if (waitWasCapped) {\n log(\n ` Stopped waiting after ${Math.round(waitMs / 1000)}s so installation can finish.`,\n );\n log(\" You can authenticate later with the command below.\");\n } else {\n log(\" Timed out waiting for approval. Run the command again to retry.\");\n }\n return null;\n}\n\n// ---------------------------------------------------------------------------\n// Public entry point\n// ---------------------------------------------------------------------------\n\n/**\n * Register an MCP server (plus aliases) into the requested client configs,\n * authenticating device-code clients via the browser flow when interactive.\n *\n * Idempotent: re-running replaces the same named entries. Never throws on a\n * single client/key failing — failures are collected into `guidance`.\n */\nexport async function registerMcpServer(\n opts: RegisterMcpOptions,\n): Promise<RegisterMcpResult> {\n const { descriptor, scope, baseDir, interactive } = opts;\n const log = opts.log ?? (() => {});\n const deps = opts.deps ?? {};\n\n const written: { client: ClientId; file: string }[] = [];\n const guidance: string[] = [];\n const errors: string[] = [];\n let authenticated = false;\n\n const keys = configKeys(descriptor);\n const mcpUrl = resolveMcpUrl(descriptor);\n if (!mcpUrl) {\n return {\n written,\n authenticated,\n guidance: [\n `Cannot register \"${descriptor.serverName}\": no mcpUrl or hostedUrl supplied.`,\n ],\n };\n }\n\n const authMode = descriptor.authMode ?? \"device\";\n\n // authMode \"none\" (e.g. context-xray): URL-only for ALL clients, no auth.\n if (authMode === \"none\") {\n writeUrlOnlyEntries(\n opts.clients,\n keys,\n mcpUrl,\n scope,\n baseDir,\n written,\n errors,\n );\n return { written, authenticated, guidance: [...guidance, ...errors] };\n }\n\n // Split into OAuth-capable and device-code clients, exactly like core.\n const oauthClients = opts.clients.filter((c) => supportsRemoteMcpOAuth(c));\n const deviceClients = opts.clients.filter((c) => !supportsRemoteMcpOAuth(c));\n\n // OAuth clients always get URL-only entries (in-host OAuth, no local bearer).\n if (oauthClients.length > 0) {\n writeUrlOnlyEntries(\n oauthClients,\n keys,\n mcpUrl,\n scope,\n baseDir,\n written,\n errors,\n );\n guidance.push(\n `${describeClients(oauthClients)}: wrote URL-only MCP config (no bearer headers).`,\n ...oauthNextStepsForClients(oauthClients, descriptor.serverName),\n );\n }\n\n // Device-code clients.\n if (deviceClients.length > 0) {\n const baseUrl = resolveBaseUrl(descriptor);\n\n // We only reach here for authMode \"oauth\"/\"device\" (authMode \"none\" returned\n // earlier). Run the flow only when interactive AND we have a hosted URL to\n // authenticate against. Device-code clients such as Codex cannot use a\n // URL-only hosted entry: writing one would overwrite a working bearer token\n // and leave new sessions unauthenticated. If auth cannot complete, keep the\n // existing config untouched and surface the explicit connect command.\n const canRunFlow = interactive && !!baseUrl;\n\n if (!canRunFlow) {\n if (baseUrl) {\n guidance.push(\n `${describeClients(deviceClients)}: skipped MCP config because this client needs a bearer token.`,\n manualConnectGuidance(baseUrl, deviceClients, scope),\n );\n } else {\n guidance.push(\n `${describeClients(deviceClients)}: skipped MCP config because no hosted URL was available for authentication.`,\n );\n }\n } else {\n const appSlug = appSlugFor(descriptor, baseUrl!);\n const clientArg = deviceClients.length === 1 ? deviceClients[0] : \"all\";\n const grant = await runDeviceFlow(\n baseUrl!,\n appSlug,\n clientArg,\n log,\n opts.deviceFlowTimeoutMs,\n deps,\n );\n\n if (grant && grant.token) {\n // Write authed entries; honour the server's resolved mcpUrl when given.\n const resolvedUrl = grant.mcpUrl || mcpUrl;\n writeAuthedEntries(\n deviceClients,\n keys,\n resolvedUrl,\n grant.token,\n grant.headers,\n scope,\n baseDir,\n written,\n errors,\n );\n authenticated = true;\n } else {\n // Flow failed (or approved with no token). Do not downgrade device-code\n // clients to a URL-only hosted entry; keep any existing bearer config.\n guidance.push(\n `${describeClients(deviceClients)}: authentication did not complete; existing MCP config was left unchanged.`,\n manualConnectGuidance(baseUrl!, deviceClients, scope),\n );\n }\n }\n }\n\n return { written, authenticated, guidance: [...guidance, ...errors] };\n}\n\nfunction describeClients(clients: ClientId[]): string {\n return clients.map((client) => CLIENT_LABELS[client]).join(\", \");\n}\n\n/** Derive the `app` slug the device-start endpoint expects. */\nfunction appSlugFor(descriptor: McpDescriptor, baseUrl: string): string {\n // Prefer the descriptor's server name without the agent-native prefix.\n const name = descriptor.serverName.replace(/^agent-native-/, \"\");\n if (name) return name;\n try {\n const host = new URL(baseUrl).hostname;\n const first = host.split(\".\")[0];\n return first && first !== \"www\" ? first : \"app\";\n } catch {\n return \"app\";\n }\n}\n"]}
1
+ {"version":3,"file":"connect.js","sourceRoot":"","sources":["../src/connect.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * MCP-server registration + authentication for `@agent-native/skills`.\n *\n * This is a dependency-free port of the MCP-config-writing + device-code/OAuth\n * flow that lives in `@agent-native/core`'s `cli/connect.ts`. The skills package\n * ships standalone (no `@agent-native/core` dependency), so this module\n * re-implements just the registration surface against the shared on-disk\n * writers in `./mcp-config-writers.js`. It writes the SAME config and speaks the\n * SAME device-code/OAuth protocol as core.\n *\n * Two client families, exactly as in core:\n * - OAuth-capable (Claude Code, Cursor, OpenCode, GitHub Copilot / VS Code):\n * get a URL-only HTTP MCP entry (no bearer headers). The user authenticates\n * in-host via standard remote MCP OAuth.\n * - Device-code (codex, cowork): run the browser device-code flow against the\n * descriptor's hosted URL, then write the entry WITH the minted bearer token\n * + headers. Non-interactive (or no TTY) skips writing device-code configs,\n * surfacing the exact `agent-native connect <url>` fallback command.\n *\n * Server contract (identical paths + JSON field names to core):\n * POST <hostedUrl>/_agent-native/mcp/connect/device/start (no auth)\n * body { client?, app? }\n * → { device_code, user_code, verification_uri,\n * verification_uri_complete, interval, expires_in }\n * POST <hostedUrl>/_agent-native/mcp/connect/device/poll (no auth)\n * body { device_code }\n * → { status: \"pending\" }\n * | { status: \"approved\", token, mcpUrl, serverName, mcpServerEntry }\n * | { status: \"expired\" } | { status: \"consumed\" }\n * | { status: \"error\" | \"not_found\", message? }\n *\n * Node-only. Node built-ins + global fetch only; no npm deps.\n */\n\nimport { ClientId, writeHttpEntryForClient } from \"./mcp-config-writers.js\";\n\nconst DEVICE_START_PATH = \"/_agent-native/mcp/connect/device/start\";\nconst DEVICE_POLL_PATH = \"/_agent-native/mcp/connect/device/poll\";\nconst MCP_PATH = \"/_agent-native/mcp\";\n\n/** OAuth-capable clients (in-host remote MCP OAuth, never a local bearer). */\nconst REMOTE_MCP_OAUTH_CLIENTS = new Set<ClientId>([\n \"claude-code\",\n \"claude-code-cli\",\n \"cursor\",\n \"opencode\",\n \"github-copilot\",\n]);\n\nconst CLIENT_LABELS: Record<ClientId, string> = {\n \"claude-code\": \"Claude Code\",\n \"claude-code-cli\": \"Claude Code CLI\",\n codex: \"Codex\",\n cowork: \"Claude Cowork\",\n cursor: \"Cursor\",\n opencode: \"OpenCode\",\n \"github-copilot\": \"GitHub Copilot / VS Code\",\n};\n\n// ---------------------------------------------------------------------------\n// Public types\n// ---------------------------------------------------------------------------\n\n/**\n * Describes one MCP server to register. `serverName` is the canonical config\n * key; `aliases` are additional config keys that point at the same MCP URL\n * (e.g. `plan` + `agent-native-plans`). `hostedUrl` is the deployed app origin\n * the device-code flow authenticates against; `mcpUrl` is the resolved MCP\n * endpoint written into the config (defaults to `<hostedUrl>/_agent-native/mcp`\n * when only `hostedUrl` is supplied).\n */\nexport interface McpDescriptor {\n serverName: string;\n mcpUrl: string;\n aliases?: string[];\n authMode?: \"oauth\" | \"device\" | \"none\";\n hostedUrl?: string;\n}\n\nexport interface RegisterMcpOptions {\n descriptor: McpDescriptor;\n clients: ClientId[];\n scope: \"user\" | \"project\";\n baseDir: string;\n interactive: boolean;\n log?: (m: string) => void;\n deviceFlowTimeoutMs?: number;\n deps?: {\n fetchImpl?: typeof fetch;\n now?: () => number;\n sleep?: (ms: number) => Promise<void>;\n };\n}\n\nexport interface RegisterMcpResult {\n written: { client: ClientId; file: string }[];\n authenticated: boolean;\n guidance: string[];\n}\n\n// ---------------------------------------------------------------------------\n// Device-code protocol shapes (field names match core EXACTLY).\n// ---------------------------------------------------------------------------\n\ninterface DeviceStartResponse {\n device_code: string;\n user_code: string;\n verification_uri: string;\n verification_uri_complete: string;\n interval?: number;\n expires_in?: number;\n}\n\ninterface DevicePollResponse {\n status:\n | \"pending\"\n | \"approved\"\n | \"expired\"\n | \"consumed\"\n | \"error\"\n | \"not_found\";\n token?: string;\n mcpUrl?: string;\n serverName?: string;\n mcpServerEntry?: Record<string, unknown>;\n message?: string;\n error?: string;\n}\n\ninterface DeviceGrant {\n token?: string;\n mcpUrl: string;\n serverName: string;\n headers?: Record<string, string>;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nexport function supportsRemoteMcpOAuth(client: ClientId): boolean {\n return REMOTE_MCP_OAUTH_CLIENTS.has(client);\n}\n\nconst DEFAULT_DEVICE_FLOW_TIMEOUT_MS = 90_000;\n\nfunction realSleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/** Trailing-slash-stripped origin+path for a hosted app URL. */\nfunction stripTrailingSlash(url: string): string {\n return url.replace(/\\/+$/, \"\");\n}\n\n/**\n * Resolve the MCP endpoint URL for a descriptor. Prefers an explicit `mcpUrl`,\n * otherwise derives `<hostedUrl>/_agent-native/mcp` (mirrors core's\n * `mcpUrlForBaseUrl`). Returns `undefined` when neither is usable.\n */\nfunction resolveMcpUrl(descriptor: McpDescriptor): string | undefined {\n if (descriptor.mcpUrl && descriptor.mcpUrl.trim()) {\n return descriptor.mcpUrl.trim();\n }\n if (descriptor.hostedUrl && descriptor.hostedUrl.trim()) {\n const base = stripTrailingSlash(descriptor.hostedUrl.trim());\n return `${base}${MCP_PATH}`;\n }\n return undefined;\n}\n\n/** Base (origin) URL of the deployed app the device flow runs against. */\nfunction resolveBaseUrl(descriptor: McpDescriptor): string | undefined {\n if (descriptor.hostedUrl && descriptor.hostedUrl.trim()) {\n return stripTrailingSlash(descriptor.hostedUrl.trim());\n }\n // Fall back to stripping the MCP path off an explicit mcpUrl.\n if (descriptor.mcpUrl && descriptor.mcpUrl.trim()) {\n const trimmed = stripTrailingSlash(descriptor.mcpUrl.trim());\n if (trimmed.endsWith(MCP_PATH)) {\n return trimmed.slice(0, -MCP_PATH.length);\n }\n }\n return undefined;\n}\n\n/** All config keys to register: the canonical name plus any aliases (deduped). */\nfunction configKeys(descriptor: McpDescriptor): string[] {\n const keys: string[] = [descriptor.serverName];\n for (const alias of descriptor.aliases ?? []) {\n if (alias && alias !== descriptor.serverName && !keys.includes(alias)) {\n keys.push(alias);\n }\n }\n return keys;\n}\n\nfunction responseMessage(json: any, fallback: string): string {\n const message =\n typeof json?.message === \"string\"\n ? json.message\n : typeof json?.error === \"string\"\n ? json.error\n : \"\";\n return message.trim() || fallback;\n}\n\nasync function postJson(\n fetchImpl: typeof fetch,\n url: string,\n body: unknown,\n): Promise<{ status: number; json: any }> {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 30_000);\n try {\n const response = await fetchImpl(url, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify(body ?? {}),\n signal: controller.signal,\n });\n let json: any = null;\n try {\n json = await response.json();\n } catch {\n json = null;\n }\n return { status: response.status, json };\n } finally {\n clearTimeout(timeout);\n }\n}\n\n/**\n * The exact no-browser fallback command core prints. Surfaced as guidance when\n * a device-code client is asked to register non-interactively.\n */\nfunction clientArgForClients(clients: ClientId[]): string {\n return clients.length === 1 ? clients[0] : clients.join(\",\");\n}\n\nfunction fallbackConnectCommand(\n baseUrl: string,\n clients: ClientId[],\n scope: string,\n): string {\n return `npx @agent-native/core@latest connect ${baseUrl} --client ${clientArgForClients(\n clients,\n )} --scope ${scope}`;\n}\n\n/** Write a URL-only entry (no bearer) for every config key, collecting files. */\nfunction writeUrlOnlyEntries(\n clients: ClientId[],\n keys: string[],\n mcpUrl: string,\n scope: string,\n baseDir: string,\n written: { client: ClientId; file: string }[],\n errors: string[],\n): void {\n for (const client of clients) {\n for (const key of keys) {\n try {\n const file = writeHttpEntryForClient(\n client,\n key,\n mcpUrl,\n undefined,\n baseDir,\n scope,\n undefined,\n );\n written.push({ client, file });\n } catch (err: any) {\n errors.push(\n `Could not write ${key} for ${client}: ${err?.message ?? err}`,\n );\n }\n }\n }\n}\n\nfunction manualConnectGuidance(\n baseUrl: string,\n clients: ClientId[],\n scope: string,\n): string {\n return (\n `To authenticate ${describeClients(clients)}, run: ` +\n fallbackConnectCommand(baseUrl, clients, scope)\n );\n}\n\nfunction oauthNextStepsForClients(\n clients: ClientId[],\n serverName?: string,\n): string[] {\n const lines: string[] = [];\n if (clients.includes(\"claude-code\") || clients.includes(\"claude-code-cli\")) {\n lines.push(\n \"Claude Code: restart Claude Code, run /mcp, and choose Authenticate.\",\n );\n }\n if (clients.includes(\"cursor\")) {\n lines.push(\n \"Cursor: restart or reload Cursor, then authenticate the MCP server from Cursor MCP settings if prompted.\",\n );\n }\n if (clients.includes(\"opencode\")) {\n lines.push(\n `OpenCode: run opencode mcp auth ${serverName ?? \"<server-name>\"} or authenticate on first use.`,\n );\n }\n if (clients.includes(\"github-copilot\")) {\n lines.push(\n \"GitHub Copilot / VS Code: reload VS Code, open the MCP config, and use the Auth action above the server if prompted.\",\n );\n }\n return lines;\n}\n\n/** Write a token+headers entry for every config key, collecting files. */\nfunction writeAuthedEntries(\n clients: ClientId[],\n keys: string[],\n mcpUrl: string,\n token: string | undefined,\n headers: Record<string, string> | undefined,\n scope: string,\n baseDir: string,\n written: { client: ClientId; file: string }[],\n errors: string[],\n): void {\n for (const client of clients) {\n for (const key of keys) {\n try {\n const file = writeHttpEntryForClient(\n client,\n key,\n mcpUrl,\n token,\n baseDir,\n scope,\n headers,\n );\n written.push({ client, file });\n } catch (err: any) {\n errors.push(\n `Could not write ${key} for ${client}: ${err?.message ?? err}`,\n );\n }\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Device-code flow (dependency-free port of core's runDeviceFlow)\n// ---------------------------------------------------------------------------\n\n/**\n * Run the device-code flow against `baseUrl` and return the approved grant, or\n * `null` (after logging a clear message) on expiry/consumed/error/timeout. Same\n * state machine and field handling as core; the spinner/browser-open are\n * dropped since this runs inside a non-interactive installer context.\n */\nasync function runDeviceFlow(\n baseUrl: string,\n appSlug: string,\n clientArg: string,\n log: (m: string) => void,\n timeoutMs: number | undefined,\n deps: RegisterMcpOptions[\"deps\"] = {},\n): Promise<DeviceGrant | null> {\n const fetchImpl = deps.fetchImpl ?? fetch;\n const sleep = deps.sleep ?? realSleep;\n const now = deps.now ?? (() => Date.now());\n\n let start: DeviceStartResponse;\n try {\n const { status, json } = await postJson(\n fetchImpl,\n `${baseUrl}${DEVICE_START_PATH}`,\n { client: clientArg, app: appSlug },\n );\n if (status < 200 || status >= 300 || !json?.device_code) {\n log(\n ` Could not start the connect flow on ${baseUrl} (HTTP ${status}). ` +\n `Is this an agent-native app, and is it deployed with the connect ` +\n `endpoint enabled?`,\n );\n return null;\n }\n start = json as DeviceStartResponse;\n } catch (err: any) {\n log(\n ` Could not reach ${baseUrl} (${err?.message ?? err}). ` +\n `Check the URL and your network.`,\n );\n return null;\n }\n\n const interval = Math.max(1, Number(start.interval) || 5);\n const expiresIn = Math.max(interval, Number(start.expires_in) || 600);\n const serverDeadlineMs = expiresIn * 1000;\n const installerDeadlineMs = Math.max(\n 0,\n timeoutMs ?? DEFAULT_DEVICE_FLOW_TIMEOUT_MS,\n );\n const waitMs = Math.min(serverDeadlineMs, installerDeadlineMs);\n const waitWasCapped = waitMs < serverDeadlineMs;\n const deadline = now() + waitMs;\n\n log(\"\");\n log(` Connecting to ${baseUrl}`);\n log(\"\");\n log(` Your code: ${start.user_code}`);\n log(` Open: ${start.verification_uri_complete}`);\n log(\"\");\n log(\" Approve in the browser to finish.\");\n\n while (now() < deadline) {\n let poll: DevicePollResponse;\n try {\n const { status, json } = await postJson(\n fetchImpl,\n `${baseUrl}${DEVICE_POLL_PATH}`,\n { device_code: start.device_code },\n );\n if (status < 200 || status >= 300) {\n if (isTerminalPollBody(json)) {\n poll = json as DevicePollResponse;\n } else {\n log(\n ` Connect polling failed (HTTP ${status}): ` +\n responseMessage(json, \"server returned an error.\"),\n );\n return null;\n }\n } else {\n poll = (json ?? { status: \"pending\" }) as DevicePollResponse;\n }\n } catch {\n // Transient network error — keep polling until the deadline.\n poll = { status: \"pending\" };\n }\n\n if (poll.status === \"approved\") {\n const token = poll.token ?? \"\";\n const mcpUrl = poll.mcpUrl ?? `${baseUrl}${MCP_PATH}`;\n const serverName = poll.serverName ?? appSlug;\n const headers =\n poll.mcpServerEntry &&\n typeof poll.mcpServerEntry === \"object\" &&\n poll.mcpServerEntry.headers &&\n typeof poll.mcpServerEntry.headers === \"object\"\n ? (poll.mcpServerEntry.headers as Record<string, string>)\n : undefined;\n log(\" Approved.\");\n return { token: token || undefined, mcpUrl, serverName, headers };\n }\n if (poll.status === \"expired\") {\n log(\" The connect request expired before it was approved.\");\n log(\" Run the command again to retry.\");\n return null;\n }\n if (poll.status === \"consumed\") {\n log(\" This connect code was already used. Run the command again.\");\n return null;\n }\n if (poll.status === \"error\" || poll.status === \"not_found\") {\n log(\n ` Connect polling failed: ${responseMessage(\n poll,\n poll.status === \"not_found\"\n ? \"device code was not found.\"\n : \"server returned an error.\",\n )}`,\n );\n return null;\n }\n\n const remainingMs = deadline - now();\n if (remainingMs <= 0) break;\n await sleep(Math.min(interval * 1000, remainingMs));\n }\n\n if (waitWasCapped) {\n log(\n ` Stopped waiting after ${Math.round(waitMs / 1000)}s so installation can finish.`,\n );\n log(\" You can authenticate later with the command below.\");\n } else {\n log(\" Timed out waiting for approval. Run the command again to retry.\");\n }\n return null;\n}\n\nfunction isTerminalPollBody(json: any): boolean {\n return (\n json?.status === \"not_found\" ||\n json?.status === \"error\" ||\n json?.status === \"expired\" ||\n json?.status === \"consumed\"\n );\n}\n\n// ---------------------------------------------------------------------------\n// Public entry point\n// ---------------------------------------------------------------------------\n\n/**\n * Register an MCP server (plus aliases) into the requested client configs,\n * authenticating device-code clients via the browser flow when interactive.\n *\n * Idempotent: re-running replaces the same named entries. Never throws on a\n * single client/key failing — failures are collected into `guidance`.\n */\nexport async function registerMcpServer(\n opts: RegisterMcpOptions,\n): Promise<RegisterMcpResult> {\n const { descriptor, scope, baseDir, interactive } = opts;\n const log = opts.log ?? (() => {});\n const deps = opts.deps ?? {};\n\n const written: { client: ClientId; file: string }[] = [];\n const guidance: string[] = [];\n const errors: string[] = [];\n let authenticated = false;\n\n const keys = configKeys(descriptor);\n const mcpUrl = resolveMcpUrl(descriptor);\n if (!mcpUrl) {\n return {\n written,\n authenticated,\n guidance: [\n `Cannot register \"${descriptor.serverName}\": no mcpUrl or hostedUrl supplied.`,\n ],\n };\n }\n\n const authMode = descriptor.authMode ?? \"device\";\n\n // authMode \"none\" (e.g. context-xray): URL-only for ALL clients, no auth.\n if (authMode === \"none\") {\n writeUrlOnlyEntries(\n opts.clients,\n keys,\n mcpUrl,\n scope,\n baseDir,\n written,\n errors,\n );\n return { written, authenticated, guidance: [...guidance, ...errors] };\n }\n\n // Split into OAuth-capable and device-code clients, exactly like core.\n const oauthClients = opts.clients.filter((c) => supportsRemoteMcpOAuth(c));\n const deviceClients = opts.clients.filter((c) => !supportsRemoteMcpOAuth(c));\n\n // OAuth clients always get URL-only entries (in-host OAuth, no local bearer).\n if (oauthClients.length > 0) {\n writeUrlOnlyEntries(\n oauthClients,\n keys,\n mcpUrl,\n scope,\n baseDir,\n written,\n errors,\n );\n guidance.push(\n `${describeClients(oauthClients)}: wrote URL-only MCP config (no bearer headers).`,\n ...oauthNextStepsForClients(oauthClients, descriptor.serverName),\n );\n }\n\n // Device-code clients.\n if (deviceClients.length > 0) {\n const baseUrl = resolveBaseUrl(descriptor);\n\n // We only reach here for authMode \"oauth\"/\"device\" (authMode \"none\" returned\n // earlier). Run the flow only when interactive AND we have a hosted URL to\n // authenticate against. Device-code clients such as Codex cannot use a\n // URL-only hosted entry: writing one would overwrite a working bearer token\n // and leave new sessions unauthenticated. If auth cannot complete, keep the\n // existing config untouched and surface the explicit connect command.\n const canRunFlow = interactive && !!baseUrl;\n\n if (!canRunFlow) {\n if (baseUrl) {\n guidance.push(\n `${describeClients(deviceClients)}: skipped MCP config because this client needs a bearer token.`,\n manualConnectGuidance(baseUrl, deviceClients, scope),\n );\n } else {\n guidance.push(\n `${describeClients(deviceClients)}: skipped MCP config because no hosted URL was available for authentication.`,\n );\n }\n } else {\n const appSlug = appSlugFor(descriptor, baseUrl!);\n const clientArg = deviceClients.length === 1 ? deviceClients[0] : \"all\";\n const grant = await runDeviceFlow(\n baseUrl!,\n appSlug,\n clientArg,\n log,\n opts.deviceFlowTimeoutMs,\n deps,\n );\n\n if (grant && grant.token) {\n // Write authed entries; honour the server's resolved mcpUrl when given.\n const resolvedUrl = grant.mcpUrl || mcpUrl;\n writeAuthedEntries(\n deviceClients,\n keys,\n resolvedUrl,\n grant.token,\n grant.headers,\n scope,\n baseDir,\n written,\n errors,\n );\n authenticated = true;\n } else {\n // Flow failed (or approved with no token). Do not downgrade device-code\n // clients to a URL-only hosted entry; keep any existing bearer config.\n guidance.push(\n `${describeClients(deviceClients)}: authentication did not complete; existing MCP config was left unchanged.`,\n manualConnectGuidance(baseUrl!, deviceClients, scope),\n );\n }\n }\n }\n\n return { written, authenticated, guidance: [...guidance, ...errors] };\n}\n\nfunction describeClients(clients: ClientId[]): string {\n return clients.map((client) => CLIENT_LABELS[client]).join(\", \");\n}\n\n/** Derive the `app` slug the device-start endpoint expects. */\nfunction appSlugFor(descriptor: McpDescriptor, baseUrl: string): string {\n // Prefer the descriptor's server name without the agent-native prefix.\n const name = descriptor.serverName.replace(/^agent-native-/, \"\");\n if (name) return name;\n try {\n const host = new URL(baseUrl).hostname;\n const first = host.split(\".\")[0];\n return first && first !== \"www\" ? first : \"app\";\n } catch {\n return \"app\";\n }\n}\n"]}
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { type CliTelemetry } from "./telemetry.js";
2
- export type SkillClient = "codex" | "claude-code" | "pi" | "cursor" | "opencode" | "github-copilot";
2
+ export type SkillClient = "codex" | "claude-code" | "cowork" | "pi" | "cursor" | "opencode" | "github-copilot";
3
3
  export type SkillScope = "project" | "user";
4
4
  export type PlanMode = "hosted" | "local-files" | "self-hosted";
5
5
  export interface SkillEntry {
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -15,7 +15,7 @@ Usage:
15
15
 
16
16
  Options:
17
17
  --skill <name> Install only this skill (repeatable)
18
- --client, -a <client> codex, claude-code, pi, cursor, opencode, github-copilot, or all
18
+ --client, -a <client> codex, claude-code, cowork, pi, cursor, opencode, github-copilot, or all
19
19
  (default: all; repeatable or comma-separated)
20
20
  --scope <user|project> Install globally or into the current project (default: user)
21
21
  -g, --global Alias for --scope user
@@ -47,6 +47,7 @@ Examples:
47
47
  const CLIENTS = [
48
48
  "codex",
49
49
  "claude-code",
50
+ "cowork",
50
51
  "pi",
51
52
  "cursor",
52
53
  "opencode",
@@ -450,6 +451,10 @@ export async function installSkills(options) {
450
451
  const mcpApps = options.mcp === false || planMode === "local-files"
451
452
  ? []
452
453
  : mcpAppsForSkills(skillNames, planMcpOverride);
454
+ const skillFileClients = clients.filter(supportsSkillFiles);
455
+ if (skillFileClients.length === 0 && mcpApps.length === 0) {
456
+ throw new Error("Claude Cowork is MCP-only for Agent Native skills. Choose Codex, Claude Code, Pi, Cursor, OpenCode, or GitHub Copilot for local skill files, or install an app-backed skill with MCP enabled.");
457
+ }
453
458
  const progress = await createInstallProgress(options, 1 +
454
459
  (shouldUpdateInstructions ? 1 : 0) +
455
460
  (shouldWriteGithubAction ? 1 : 0) +
@@ -460,7 +465,7 @@ export async function installSkills(options) {
460
465
  const mcpServers = [];
461
466
  try {
462
467
  progress?.start("Installing skill files...");
463
- for (const root of unique(clients.map((client) => installRootForClient(client, scope, baseDir)))) {
468
+ for (const root of unique(skillFileClients.map((client) => installRootForClient(client, scope, baseDir)))) {
464
469
  for (const skill of selected) {
465
470
  const destination = path.join(root, skill.name);
466
471
  written.push(destination);
@@ -481,7 +486,7 @@ export async function installSkills(options) {
481
486
  });
482
487
  if (shouldUpdateInstructions) {
483
488
  progress?.message("Updating managed instructions...");
484
- instructionFiles = writeManagedInstructions(instructionBlocks, baseDir, clients, scope, options);
489
+ instructionFiles = writeManagedInstructions(instructionBlocks, baseDir, skillFileClients, scope, options);
485
490
  progress?.advance("Managed instructions updated");
486
491
  if (instructionFiles.length) {
487
492
  options.telemetry?.track("skills_cli instructions updated", {
@@ -675,6 +680,9 @@ function normalizeClients(value) {
675
680
  return CLIENTS;
676
681
  if (client === "codex")
677
682
  return ["codex"];
683
+ if (client === "cowork" || client === "claude-cowork") {
684
+ return ["cowork"];
685
+ }
678
686
  if (client === "pi")
679
687
  return ["pi"];
680
688
  if (client === "cursor")
@@ -693,7 +701,7 @@ function normalizeClients(value) {
693
701
  client === "claude-code-cli") {
694
702
  return ["claude-code"];
695
703
  }
696
- throw new Error(`Unsupported client "${raw}". Use codex, claude-code, pi, cursor, opencode, github-copilot, or all.`);
704
+ throw new Error(`Unsupported client "${raw}". Use codex, claude-code, cowork, pi, cursor, opencode, github-copilot, or all.`);
697
705
  });
698
706
  }
699
707
  function skillClientToMcpClient(client) {
@@ -703,6 +711,9 @@ function skillClientToMcpClient(client) {
703
711
  return "claude-code";
704
712
  return client;
705
713
  }
714
+ function supportsSkillFiles(client) {
715
+ return client !== "cowork";
716
+ }
706
717
  function normalizeSkillName(value) {
707
718
  const normalized = value.trim().toLowerCase();
708
719
  if (!/^[a-z0-9][a-z0-9._-]*$/.test(normalized)) {
@@ -1108,14 +1119,17 @@ function resolveInstructionFiles(baseDir, explicit, clients, scope) {
1108
1119
  if (explicit && explicit.length > 0) {
1109
1120
  return explicit.map((file) => path.resolve(baseDir, file));
1110
1121
  }
1122
+ const instructionClients = clients.filter(supportsSkillFiles);
1123
+ if (instructionClients.length === 0)
1124
+ return [];
1111
1125
  if (scope === "user") {
1112
1126
  const home = process.env.HOME || os.homedir();
1113
1127
  const files = [];
1114
- if (clients.includes("codex")) {
1128
+ if (instructionClients.includes("codex")) {
1115
1129
  const codexHome = process.env.CODEX_HOME || path.join(home, ".codex");
1116
1130
  files.push(path.join(codexHome, "AGENTS.md"));
1117
1131
  }
1118
- if (clients.includes("claude-code")) {
1132
+ if (instructionClients.includes("claude-code")) {
1119
1133
  files.push(path.join(home, ".claude", "CLAUDE.md"));
1120
1134
  }
1121
1135
  return unique(files);
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { spawnSync } from \"node:child_process\";\nimport { randomUUID } from \"node:crypto\";\nimport fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nimport { resolveAppForSkill, type BuiltInAppMcp } from \"./built-in-apps.js\";\nimport { registerMcpServer } from \"./connect.js\";\nimport type { ClientId } from \"./mcp-config-writers.js\";\nimport { createCliTelemetry, type CliTelemetry } from \"./telemetry.js\";\n\nexport type SkillClient =\n | \"codex\"\n | \"claude-code\"\n | \"pi\"\n | \"cursor\"\n | \"opencode\"\n | \"github-copilot\";\nexport type SkillScope = \"project\" | \"user\";\nexport type PlanMode = \"hosted\" | \"local-files\" | \"self-hosted\";\n\nexport interface SkillEntry {\n name: string;\n dir: string;\n description?: string;\n}\n\nexport interface InstallSkillsOptions {\n source?: string;\n skillNames?: string[];\n clients?: SkillClient[];\n scope?: SkillScope;\n baseDir?: string;\n yes?: boolean;\n dryRun?: boolean;\n updateInstructions?: boolean;\n instructionFiles?: string[];\n withGithubAction?: boolean;\n force?: boolean;\n connect?: boolean;\n quiet?: boolean;\n deviceFlowTimeoutMs?: number;\n log?: (message: string) => void;\n isInteractive?: () => boolean;\n telemetry?: CliTelemetry;\n promptSkills?: (context: SkillsPromptContext) => Promise<string[] | null>;\n promptClients?: (\n context: ClientsPromptContext,\n ) => Promise<SkillClient[] | null>;\n promptScope?: (context: ScopePromptContext) => Promise<SkillScope | null>;\n promptUpdateInstructions?: () => Promise<boolean | null>;\n promptGithubAction?: (\n context: GithubActionPromptContext,\n ) => Promise<boolean | null>;\n promptPlanMode?: (context: PlanModePromptContext) => Promise<PlanMode | null>;\n promptPlanMcpUrl?: () => Promise<string | null>;\n /**\n * Register the hosted MCP server for app-backed skills (e.g. visual-plan /\n * visual-recap → the Agent-Native Plan MCP). Defaults to `true`; pass\n * `false` (CLI `--no-mcp`) to install the skill files only.\n */\n mcp?: boolean;\n planMode?: PlanMode;\n mcpUrl?: string;\n}\n\nexport interface InstalledMcpServer {\n serverName: string;\n mcpUrl: string;\n clients: SkillClient[];\n registeredClients: SkillClient[];\n files: string[];\n authenticated: boolean;\n guidance: string[];\n}\n\nexport interface InstallSkillsResult {\n source: string;\n skills: string[];\n clients: SkillClient[];\n scope: SkillScope;\n written: string[];\n instructionFiles: string[];\n githubActionPath?: string;\n mcpServers: InstalledMcpServer[];\n planMode?: PlanMode;\n dryRun: boolean;\n}\n\ninterface ParsedArgs {\n command: \"add\" | \"list\" | \"help\";\n source?: string;\n copySource: boolean;\n skillNames: string[];\n clients: SkillClient[];\n scope: SkillScope;\n scopeExplicit: boolean;\n yes: boolean;\n dryRun: boolean;\n printJson: boolean;\n updateInstructions?: boolean;\n instructionFiles: string[];\n withGithubAction: boolean;\n force: boolean;\n connect: boolean;\n baseDir?: string;\n mcp: boolean;\n planMode?: PlanMode;\n mcpUrl?: string;\n quiet: boolean;\n}\n\ninterface PromptOption<T extends string> {\n value: T;\n label: string;\n hint: string;\n}\n\nexport interface SkillsPromptContext {\n initialSkills: string[];\n options: Array<PromptOption<string>>;\n}\n\nexport interface ClientsPromptContext {\n initialClients: SkillClient[];\n options: Array<PromptOption<SkillClient>>;\n}\n\nexport interface ScopePromptContext {\n initialScope: SkillScope;\n}\n\nexport interface GithubActionPromptContext {\n workflowPath: string;\n setupCommand: string;\n docsUrl: string;\n}\n\nexport interface PlanModePromptContext {\n initialMode: PlanMode;\n}\n\nconst HELP = `@agent-native/skills\n\nUsage:\n npx @agent-native/skills@latest add [options]\n npx @agent-native/skills@latest list\n\nOptions:\n --skill <name> Install only this skill (repeatable)\n --client, -a <client> codex, claude-code, pi, cursor, opencode, github-copilot, or all\n (default: all; repeatable or comma-separated)\n --scope <user|project> Install globally or into the current project (default: user)\n -g, --global Alias for --scope user\n --project Alias for --scope project\n --update-instructions Add managed AGENTS.md / CLAUDE.md instructions when useful\n --no-update-instructions Skip managed instruction file updates\n --instructions-file <path> File to receive managed instructions (repeatable)\n --with-github-action Add .github/workflows/pr-visual-recap.yml when visual-recap is installed\n --mode <mode> visual-plan/visual-recap mode: hosted, local-files, or self-hosted\n --mcp-url <url> Self-hosted app/MCP URL for visual-plan/visual-recap\n --force Overwrite a different existing PR Visual Recap workflow\n --no-mcp Install skill files only; skip registering the app's MCP server\n --no-connect Register MCP where possible but skip inline browser/device authentication\n -y, --yes Use defaults in non-interactive mode\n --dry-run Print intended writes without changing files\n --json Print the result as JSON\n\nApp-backed skills (visual-plan, visual-recap) register their hosted MCP server\nin your agent config by default so the agent can actually use them. Use\n--no-mcp to skip that and copy the files only.\nFor visual-plan/visual-recap, choose --mode local-files for no sharing and all\nlocal files, or --mode self-hosted --mcp-url <url> for your own Plan app.\n\nExamples:\n npx @agent-native/skills@latest add\n npx @agent-native/skills@latest add --skill quick-recap\n npx @agent-native/skills@latest add --skill visual-recap --with-github-action\n`;\n\nconst CLIENTS: SkillClient[] = [\n \"codex\",\n \"claude-code\",\n \"pi\",\n \"cursor\",\n \"opencode\",\n \"github-copilot\",\n];\nconst DEFAULT_SKILLS_SOURCE = \"BuilderIO/skills\";\nconst MANAGED_INSTRUCTIONS_START = \"<!-- BEGIN @agent-native/skills -->\";\nconst MANAGED_INSTRUCTIONS_END = \"<!-- END @agent-native/skills -->\";\n\nexport function parseSkillsCliArgs(argv: string[]): ParsedArgs {\n const first = argv[0];\n if (!first || first === \"help\" || first === \"--help\" || first === \"-h\") {\n return defaultArgs(\"help\");\n }\n\n const command = first === \"list\" ? \"list\" : \"add\";\n const args = first === \"add\" || first === \"list\" ? argv.slice(1) : argv;\n const out = defaultArgs(command);\n\n for (let i = 0; i < args.length; i += 1) {\n const arg = args[i];\n const eat = (flag: string): string | undefined => {\n if (arg === flag) {\n const next = args[++i];\n if (!next || next.startsWith(\"-\")) {\n throw new Error(`Missing value for ${flag}.`);\n }\n return next;\n }\n if (arg.startsWith(`${flag}=`)) {\n const value = arg.slice(flag.length + 1);\n if (!value) throw new Error(`Missing value for ${flag}.`);\n return value;\n }\n return undefined;\n };\n\n let value: string | undefined;\n if ((value = eat(\"--skill\")) !== undefined) out.skillNames.push(value);\n else if ((value = eat(\"-s\")) !== undefined) out.skillNames.push(value);\n else if ((value = eat(\"--client\")) !== undefined)\n out.clients.push(...normalizeClients(value));\n else if ((value = eat(\"--agent\")) !== undefined)\n out.clients.push(...normalizeClients(value));\n else if ((value = eat(\"-a\")) !== undefined)\n out.clients.push(...normalizeClients(value));\n else if ((value = eat(\"--scope\")) !== undefined) {\n out.scope = parseScope(value);\n out.scopeExplicit = true;\n } else if ((value = eat(\"--instructions-file\")) !== undefined)\n out.instructionFiles.push(value);\n else if ((value = eat(\"--cwd\")) !== undefined) out.baseDir = value;\n else if (arg === \"-g\" || arg === \"--global\") {\n out.scope = \"user\";\n out.scopeExplicit = true;\n } else if (arg === \"--project\") {\n out.scope = \"project\";\n out.scopeExplicit = true;\n } else if (arg === \"--copy\") {\n // Compatibility with the open `skills` CLI. This installer always copies.\n out.copySource = true;\n } else if (arg === \"-y\" || arg === \"--yes\") out.yes = true;\n else if (arg === \"--dry-run\") out.dryRun = true;\n else if (arg === \"--json\") out.printJson = true;\n else if (arg === \"--quiet\") out.quiet = true;\n else if (arg === \"--update-instructions\") out.updateInstructions = true;\n else if (arg === \"--no-update-instructions\") out.updateInstructions = false;\n else if (arg === \"--with-github-action\" || arg === \"--with-github-actions\")\n out.withGithubAction = true;\n else if ((value = eat(\"--mode\")) !== undefined) {\n out.planMode = parsePlanMode(value);\n } else if ((value = eat(\"--mcp-url\")) !== undefined) {\n out.mcpUrl = value;\n } else if (arg === \"--force\") out.force = true;\n else if (arg === \"--no-mcp\") out.mcp = false;\n else if (arg === \"--mcp\") out.mcp = true;\n else if (arg === \"--no-connect\" || arg === \"--skip-connect\")\n out.connect = false;\n else if (arg === \"--connect\") out.connect = true;\n else if (arg.startsWith(\"-\")) throw new Error(`Unknown option: ${arg}`);\n else if (!out.source) out.source = arg;\n else throw new Error(`Unexpected argument: ${arg}`);\n }\n\n if (out.source && out.source !== DEFAULT_SKILLS_SOURCE && !out.copySource) {\n throw new Error(\n `Unexpected argument: ${out.source}. @agent-native/skills installs the BuilderIO skills collection; use --skill <name> to choose a skill.`,\n );\n }\n if (out.source === DEFAULT_SKILLS_SOURCE && !out.copySource) {\n out.source = undefined;\n }\n\n out.skillNames = unique(out.skillNames.map(normalizeSkillName));\n out.clients = unique(out.clients);\n out.instructionFiles = unique(out.instructionFiles);\n if (out.planMode && out.mcpUrl && out.planMode !== \"self-hosted\") {\n throw new Error(\"--mcp-url can only be used with --mode self-hosted.\");\n }\n if (out.mcpUrl && !out.planMode) out.planMode = \"self-hosted\";\n return out;\n}\n\n/**\n * Translate this package's parsed args into the argv shape `@agent-native/core`\n * skills expects. Core takes a single positional target + compatible flags; we\n * forward one explicit skill as that target and let core's interactive picker\n * handle 0-or-many selections.\n */\nfunction toCoreSkillsArgv(parsed: ParsedArgs): string[] {\n const out: string[] = [parsed.command];\n if (parsed.command === \"add\") {\n if (parsed.copySource && parsed.source && parsed.skillNames.length > 0) {\n out.push(parsed.source);\n for (const skill of parsed.skillNames) out.push(\"--skill\", skill);\n } else if (parsed.skillNames.length === 1) {\n out.push(parsed.skillNames[0]);\n } else if (parsed.skillNames.length > 1) {\n const appIds = unique(\n parsed.skillNames\n .map((name) => resolveAppForSkill(name)?.appId)\n .filter((appId): appId is string => Boolean(appId)),\n );\n if (\n appIds.length === 1 &&\n parsed.skillNames.every((name) => resolveAppForSkill(name))\n ) {\n out.push(appIds[0]);\n } else {\n for (const skill of parsed.skillNames) out.push(\"--skill\", skill);\n }\n }\n }\n if (parsed.command === \"add\" && parsed.clients.length) {\n out.push(\"--client\", parsed.clients.join(\",\"));\n }\n if (parsed.command === \"add\" && parsed.scopeExplicit) {\n out.push(\"--scope\", parsed.scope);\n }\n if (parsed.command === \"add\" && parsed.yes) out.push(\"--yes\");\n if (parsed.dryRun) out.push(\"--dry-run\");\n if (parsed.printJson) out.push(\"--json\");\n if (parsed.command === \"add\" && parsed.withGithubAction)\n out.push(\"--with-github-action\");\n if (parsed.command === \"add\" && parsed.planMode)\n out.push(\"--mode\", parsed.planMode);\n if (parsed.command === \"add\" && parsed.mcpUrl)\n out.push(\"--mcp-url\", parsed.mcpUrl);\n if (parsed.command === \"add\" && parsed.force) out.push(\"--force\");\n if (parsed.command === \"add\" && parsed.mcp === false) out.push(\"--no-mcp\");\n if (parsed.command === \"add\" && parsed.connect === false)\n out.push(\"--no-connect\");\n if (parsed.command === \"add\" && parsed.updateInstructions === true)\n out.push(\"--update-instructions\");\n if (parsed.command === \"add\" && parsed.updateInstructions === false)\n out.push(\"--no-update-instructions\");\n return out;\n}\n\nfunction shouldLoadPublicCatalog(parsed: ParsedArgs): boolean {\n if (parsed.command === \"list\") return true;\n if (parsed.command !== \"add\") return false;\n if (parsed.copySource && parsed.source) return true;\n if (parsed.skillNames.length === 0) return true;\n return parsed.skillNames.some((name) => !resolveAppForSkill(name));\n}\n\nconst HIDDEN_STANDALONE_BUILT_INS = [\n \"assets\",\n \"design-exploration\",\n \"context-xray\",\n];\n\nexport async function runSkillsCli(\n argv: string[],\n options: Pick<\n InstallSkillsOptions,\n | \"log\"\n | \"isInteractive\"\n | \"baseDir\"\n | \"promptSkills\"\n | \"promptClients\"\n | \"promptScope\"\n | \"promptUpdateInstructions\"\n | \"promptGithubAction\"\n | \"promptPlanMode\"\n | \"promptPlanMcpUrl\"\n > = {},\n): Promise<void> {\n const parsed = parseSkillsCliArgs(argv);\n\n // `@agent-native/skills` normally uses the exact same core flow as\n // `agent-native skills`; it only passes a broader public skill catalog.\n // AGENT_NATIVE_SKILLS_DIRECT=1 is set by core when it shells out to this\n // package as a headless file-copy worker for public/plain skill repos. That\n // direct mode is intentionally non-user-facing prompt plumbing.\n if (process.env.AGENT_NATIVE_SKILLS_DIRECT !== \"1\") {\n if (parsed.command === \"help\") {\n process.stdout.write(`${HELP}\\n`);\n return;\n }\n const loadedSource = shouldLoadPublicCatalog(parsed)\n ? await materializeSource(parsed.source ?? DEFAULT_SKILLS_SOURCE)\n : null;\n try {\n const { runSkills } = (await import(\"@agent-native/core/cli/skills\")) as {\n runSkills: (\n argv: string[],\n options: Record<string, unknown>,\n ) => Promise<void>;\n };\n const publicSkillEntries = loadedSource\n ? discoverSkills(loadedSource.root).map((entry) => ({\n name: entry.name,\n description: entry.description,\n }))\n : [];\n await runSkills(toCoreSkillsArgv(parsed), {\n log: options.log,\n isInteractive: options.isInteractive,\n baseDir: parsed.baseDir ?? options.baseDir,\n catalogMode: \"all\",\n hiddenBuiltInSkillTargets: HIDDEN_STANDALONE_BUILT_INS,\n publicSkillSource:\n loadedSource?.root ?? parsed.source ?? DEFAULT_SKILLS_SOURCE,\n publicSkillEntries,\n promptSkills: options.promptSkills\n ? async (context: any) =>\n options.promptSkills?.({\n initialSkills: context.initialTargets,\n options: context.options,\n }) ?? null\n : undefined,\n promptClients: options.promptClients as any,\n promptScope: options.promptScope,\n promptGithubAction: options.promptGithubAction\n ? async (context: any) =>\n options.promptGithubAction?.({\n workflowPath: context.workflowPath,\n setupCommand: context.setupCommand,\n docsUrl: context.docsUrl,\n }) ?? null\n : undefined,\n promptPlanMode: options.promptPlanMode,\n promptPlanMcpUrl: options.promptPlanMcpUrl,\n promptUpdateInstructions: options.promptUpdateInstructions,\n });\n return;\n } finally {\n loadedSource?.cleanup?.();\n }\n }\n\n const startedAt = Date.now();\n const telemetry = createCliTelemetry({\n cli: \"skills-installer\",\n cliVersion: readCliVersion(),\n command: parsed.command,\n interactive: cliInteractive(parsed, options),\n });\n\n try {\n if (parsed.command === \"help\") {\n process.stdout.write(`${HELP}\\n`);\n return;\n }\n telemetry.track(\"skills_cli started\");\n const skillSource = parsed.source ?? DEFAULT_SKILLS_SOURCE;\n\n if (parsed.command === \"list\") {\n const source = await materializeSource(skillSource);\n try {\n const skills = discoverSkills(source.root);\n telemetry.track(\"skills_cli skills listed\", {\n availableCount: skills.length,\n available: skills.map((skill) => skill.name).join(\",\"),\n });\n if (parsed.printJson) {\n process.stdout.write(`${JSON.stringify(skills, null, 2)}\\n`);\n return;\n }\n for (const skill of skills) {\n process.stdout.write(\n `${skill.name}${skill.description ? ` - ${skill.description}` : \"\"}\\n`,\n );\n }\n return;\n } finally {\n source.cleanup?.();\n }\n }\n\n const stdoutLog =\n parsed.printJson || options.log\n ? options.log\n : (message: string) => process.stdout.write(`${message}\\n`);\n\n const result = await installSkills({\n source: skillSource,\n skillNames: parsed.skillNames,\n clients: parsed.clients,\n // Leave scope undefined unless the user passed --scope/-g/--project so the\n // installer can prompt for it interactively.\n scope: parsed.scopeExplicit ? parsed.scope : undefined,\n baseDir: parsed.baseDir ?? options.baseDir,\n yes: parsed.yes,\n dryRun: parsed.dryRun,\n updateInstructions: parsed.updateInstructions,\n instructionFiles: parsed.instructionFiles,\n withGithubAction: parsed.withGithubAction,\n force: parsed.force,\n connect: parsed.connect,\n quiet: parsed.printJson || parsed.quiet,\n log: parsed.printJson || parsed.quiet ? undefined : stdoutLog,\n isInteractive: options.isInteractive,\n promptSkills: options.promptSkills,\n promptClients: options.promptClients,\n promptScope: options.promptScope,\n promptUpdateInstructions: options.promptUpdateInstructions,\n promptGithubAction: options.promptGithubAction,\n promptPlanMode: options.promptPlanMode,\n promptPlanMcpUrl: options.promptPlanMcpUrl,\n telemetry,\n mcp: parsed.mcp,\n planMode: parsed.planMode,\n mcpUrl: parsed.mcpUrl,\n });\n\n telemetry.track(\"skills_cli completed\", {\n skills: result.skills.join(\",\"),\n clients: result.clients.join(\",\"),\n scope: result.scope,\n dryRun: result.dryRun,\n durationMs: Date.now() - startedAt,\n });\n\n if (parsed.printJson) {\n process.stdout.write(`${JSON.stringify(result, null, 2)}\\n`);\n return;\n }\n\n if (parsed.quiet) return;\n\n await printInstallResult(result, {\n baseDir: parsed.baseDir ?? options.baseDir ?? process.cwd(),\n dryRun: parsed.dryRun,\n });\n } catch (error) {\n telemetry.track(\"skills_cli failed\", {\n command: parsed.command,\n error: error instanceof Error ? error.message : String(error),\n durationMs: Date.now() - startedAt,\n });\n throw error;\n } finally {\n await telemetry.flush();\n }\n}\n\nfunction readCliVersion(): string {\n try {\n const here = path.dirname(fileURLToPath(import.meta.url));\n // dist/index.js → ../package.json\n const pkg = JSON.parse(\n fs.readFileSync(path.resolve(here, \"../package.json\"), \"utf8\"),\n ) as { version?: unknown };\n return typeof pkg.version === \"string\" ? pkg.version : \"unknown\";\n } catch {\n return \"unknown\";\n }\n}\n\nfunction cliInteractive(\n parsed: ParsedArgs,\n options: Pick<InstallSkillsOptions, \"isInteractive\">,\n): boolean {\n if (parsed.yes) return false;\n if (options.isInteractive) return options.isInteractive();\n if (process.env.CI === \"true\") return false;\n return Boolean(process.stdin.isTTY && process.stdout.isTTY);\n}\n\nexport async function installSkills(\n options: InstallSkillsOptions,\n): Promise<InstallSkillsResult> {\n const baseDir = path.resolve(options.baseDir ?? process.cwd());\n const log = options.log ?? (() => {});\n const sourceInput = options.source ?? DEFAULT_SKILLS_SOURCE;\n const source = await materializeSource(sourceInput);\n try {\n const entries = discoverSkills(source.root);\n if (entries.length === 0) {\n throw new Error(\n `No skills found in ${sourceInput}. Expected skills/*/SKILL.md.`,\n );\n }\n\n const preselected = (options.skillNames ?? []).length > 0;\n const selected = await resolveSelectedSkills(entries, options);\n options.telemetry?.track(\"skills_cli skills selected\", {\n selected: selected.map((skill) => skill.name).join(\",\"),\n selectedCount: selected.length,\n selectedAll: selected.length === entries.length,\n preselected,\n });\n\n const skillNames = selected.map((skill) => skill.name);\n const planMode = await resolvePlanModeForSkills(skillNames, options);\n const planMcpOverride = await resolvePlanMcpOverrideForMode(\n planMode,\n options,\n );\n\n const clients = await resolveSelectedClients(options);\n options.telemetry?.track(\"skills_cli clients selected\", {\n clients: clients.join(\",\"),\n clientCount: clients.length,\n });\n\n const scope = await resolveSelectedScope(options);\n options.telemetry?.track(\"skills_cli scope selected\", { scope });\n\n const instructionBlocks = managedInstructionBlocksForSkills(skillNames);\n const shouldUpdateInstructions = await shouldUpdateManagedInstructions(\n instructionBlocks,\n options,\n );\n const shouldWriteGithubAction = await shouldWritePrVisualRecapWorkflow(\n selected.some((skill) => skill.name === \"visual-recap\"),\n options,\n baseDir,\n );\n const mcpApps =\n options.mcp === false || planMode === \"local-files\"\n ? []\n : mcpAppsForSkills(skillNames, planMcpOverride);\n const progress = await createInstallProgress(\n options,\n 1 +\n (shouldUpdateInstructions ? 1 : 0) +\n (shouldWriteGithubAction ? 1 : 0) +\n mcpApps.length,\n );\n\n const written: string[] = [];\n let instructionFiles: string[] = [];\n let githubActionPath: string | undefined;\n const mcpServers: InstalledMcpServer[] = [];\n\n try {\n progress?.start(\"Installing skill files...\");\n for (const root of unique(\n clients.map((client) => installRootForClient(client, scope, baseDir)),\n )) {\n for (const skill of selected) {\n const destination = path.join(root, skill.name);\n written.push(destination);\n if (!options.dryRun) {\n fs.rmSync(destination, { recursive: true, force: true });\n fs.mkdirSync(path.dirname(destination), { recursive: true });\n fs.cpSync(skill.dir, destination, { recursive: true });\n }\n }\n }\n progress?.advance(\"Skill files installed\");\n\n options.telemetry?.track(\"skills_cli install completed\", {\n skills: skillNames.join(\",\"),\n clients: clients.join(\",\"),\n scope,\n writtenCount: written.length,\n dryRun: Boolean(options.dryRun),\n });\n\n if (shouldUpdateInstructions) {\n progress?.message(\"Updating managed instructions...\");\n instructionFiles = writeManagedInstructions(\n instructionBlocks,\n baseDir,\n clients,\n scope,\n options,\n );\n progress?.advance(\"Managed instructions updated\");\n if (instructionFiles.length) {\n options.telemetry?.track(\"skills_cli instructions updated\", {\n fileCount: instructionFiles.length,\n });\n }\n }\n\n if (shouldWriteGithubAction) {\n progress?.message(\"Writing PR Visual Recap workflow...\");\n githubActionPath = writePrVisualRecapWorkflow(baseDir, options);\n progress?.advance(\"PR Visual Recap workflow ready\");\n if (githubActionPath) {\n options.telemetry?.track(\"skills_cli github action added\");\n }\n }\n\n // Register the hosted MCP server for app-backed skills (visual-plan /\n // visual-recap → Agent-Native Plan) so the agent can actually call them,\n // not just read the SKILL.md. On by default; `--no-mcp` installs the\n // skill files only. One registration per app, so visual-plan +\n // visual-recap share a single \"plan\" server.\n if (mcpApps.length > 0) {\n const mcpClients: ClientId[] = clients\n .map(skillClientToMcpClient)\n .filter((client): client is ClientId => Boolean(client));\n if (mcpClients.length === 0) {\n throw new Error(\n \"MCP setup supports Claude Code, Codex, Cursor, OpenCode, GitHub Copilot / VS Code, or Claude Cowork. Use --mode local-files or --no-mcp for Pi.\",\n );\n }\n for (const app of mcpApps) {\n progress?.message(`Registering ${app.displayName} MCP server...`);\n if (!options.dryRun) {\n const registration = await registerMcpServer({\n descriptor: {\n serverName: app.serverName,\n mcpUrl: app.mcpUrl,\n aliases: app.aliases,\n authMode: app.authMode,\n hostedUrl: app.hostedUrl,\n },\n clients: mcpClients,\n scope,\n baseDir,\n interactive: options.connect !== false && isInteractive(options),\n log,\n deviceFlowTimeoutMs: options.deviceFlowTimeoutMs,\n });\n mcpServers.push({\n serverName: app.serverName,\n mcpUrl: app.mcpUrl,\n clients,\n registeredClients: unique(\n registration.written.map(\n (entry) => entry.client as SkillClient,\n ),\n ),\n files: [\n ...new Set(registration.written.map((entry) => entry.file)),\n ],\n authenticated: registration.authenticated,\n guidance: registration.guidance,\n });\n options.telemetry?.track(\"skills_cli mcp registered\", {\n serverName: app.serverName,\n clients: clients.join(\",\"),\n authenticated: registration.authenticated,\n });\n } else {\n mcpServers.push({\n serverName: app.serverName,\n mcpUrl: app.mcpUrl,\n clients,\n registeredClients: clients,\n files: [],\n authenticated: false,\n guidance: [],\n });\n }\n progress?.advance(`${app.displayName} MCP server ready`);\n }\n }\n progress?.stop(\"Installation complete\");\n } catch (err) {\n progress?.error(\"Installation failed\");\n throw err;\n }\n\n return {\n source: source.root,\n skills: skillNames,\n clients,\n scope,\n written,\n instructionFiles,\n githubActionPath,\n mcpServers,\n planMode,\n dryRun: Boolean(options.dryRun),\n };\n } finally {\n source.cleanup?.();\n }\n}\n\nfunction defaultArgs(command: ParsedArgs[\"command\"]): ParsedArgs {\n return {\n command,\n copySource: false,\n skillNames: [],\n clients: [],\n scope: \"user\",\n scopeExplicit: false,\n yes: false,\n dryRun: false,\n printJson: false,\n instructionFiles: [],\n withGithubAction: false,\n force: false,\n connect: true,\n mcp: true,\n quiet: false,\n };\n}\n\nfunction selectedPlanApp(skillNames: string[]): BuiltInAppMcp | undefined {\n return skillNames\n .map((skillName) => resolveAppForSkill(skillName))\n .find((app): app is BuiltInAppMcp => app?.appId === \"visual-plans\");\n}\n\nasync function resolvePlanModeForSkills(\n skillNames: string[],\n options: InstallSkillsOptions,\n): Promise<PlanMode | undefined> {\n const includesPlans = Boolean(selectedPlanApp(skillNames));\n if (options.planMode && !includesPlans) {\n throw new Error(\"--mode only applies to visual-plan / visual-recap.\");\n }\n if (options.mcpUrl && !includesPlans) {\n throw new Error(\"--mcp-url only applies to visual-plan / visual-recap.\");\n }\n if (!includesPlans) return undefined;\n\n if (options.mcpUrl && !options.planMode) return \"self-hosted\";\n if (options.planMode) return options.planMode;\n return \"hosted\";\n}\n\nfunction resolvePlanMcpUrlOverride(input: string): {\n hostedUrl: string;\n mcpUrl: string;\n} {\n let parsed: URL;\n try {\n parsed = new URL(input);\n } catch {\n throw new Error(`--mcp-url must be a valid URL (got \"${input}\").`);\n }\n if (parsed.protocol !== \"http:\" && parsed.protocol !== \"https:\") {\n throw new Error(\"--mcp-url must use http:// or https://.\");\n }\n const mcpSuffix = \"/_agent-native/mcp\";\n const trimmedPath = parsed.pathname.replace(/\\/+$/, \"\");\n const appPath = trimmedPath.endsWith(mcpSuffix)\n ? trimmedPath.slice(0, -mcpSuffix.length)\n : trimmedPath;\n const mcpPath = trimmedPath.endsWith(mcpSuffix)\n ? trimmedPath\n : `${trimmedPath || \"\"}${mcpSuffix}`;\n return {\n hostedUrl: `${parsed.origin}${appPath}`,\n mcpUrl: `${parsed.origin}${mcpPath}`,\n };\n}\n\nasync function resolvePlanMcpOverrideForMode(\n planMode: PlanMode | undefined,\n options: InstallSkillsOptions,\n): Promise<{ hostedUrl: string; mcpUrl: string } | undefined> {\n if (planMode === \"local-files\" && options.mcpUrl) {\n throw new Error(\"--mode local-files cannot be combined with --mcp-url.\");\n }\n if (planMode !== \"self-hosted\") return undefined;\n if (!options.mcpUrl) {\n throw new Error(\n \"--mode self-hosted requires --mcp-url <url> in direct mode.\",\n );\n }\n return resolvePlanMcpUrlOverride(options.mcpUrl);\n}\n\nfunction parsePlanMode(value: string): PlanMode {\n if (value === \"hosted\" || value === \"local-files\" || value === \"self-hosted\")\n return value;\n throw new Error('--mode must be \"hosted\", \"local-files\", or \"self-hosted\".');\n}\n\nfunction parseScope(value: string): SkillScope {\n if (value === \"user\" || value === \"project\") return value;\n throw new Error(\"--scope must be user or project.\");\n}\n\nfunction normalizeClients(value: string): SkillClient[] {\n return value.split(\",\").flatMap((raw) => {\n const client = raw.trim().toLowerCase();\n if (!client) return [];\n if (client === \"all\") return CLIENTS;\n if (client === \"codex\") return [\"codex\" as const];\n if (client === \"pi\") return [\"pi\" as const];\n if (client === \"cursor\") return [\"cursor\" as const];\n if (client === \"opencode\" || client === \"open-code\") {\n return [\"opencode\" as const];\n }\n if (\n client === \"github-copilot\" ||\n client === \"copilot\" ||\n client === \"vscode\" ||\n client === \"vs-code\"\n ) {\n return [\"github-copilot\" as const];\n }\n if (\n client === \"claude\" ||\n client === \"claude-code\" ||\n client === \"claude-code-cli\"\n ) {\n return [\"claude-code\" as const];\n }\n throw new Error(\n `Unsupported client \"${raw}\". Use codex, claude-code, pi, cursor, opencode, github-copilot, or all.`,\n );\n });\n}\n\nfunction skillClientToMcpClient(client: SkillClient): ClientId | null {\n if (client === \"pi\") return null;\n if (client === \"claude-code\") return \"claude-code\";\n return client;\n}\n\nfunction normalizeSkillName(value: string): string {\n const normalized = value.trim().toLowerCase();\n if (!/^[a-z0-9][a-z0-9._-]*$/.test(normalized)) {\n throw new Error(`Invalid skill name \"${value}\".`);\n }\n return normalized;\n}\n\nfunction unique<T>(values: T[]): T[] {\n return [...new Set(values)];\n}\n\nfunction plural(count: number, singular: string, pluralForm = `${singular}s`) {\n return `${count} ${count === 1 ? singular : pluralForm}`;\n}\n\nfunction shortenPathForOutput(file: string, baseDir: string): string {\n const resolved = path.resolve(file);\n const home = process.env.HOME || os.homedir();\n if (resolved === home || resolved.startsWith(`${home}${path.sep}`)) {\n return `~${resolved.slice(home.length)}`;\n }\n const base = path.resolve(baseDir);\n const relative = path.relative(base, resolved);\n if (relative && !relative.startsWith(\"..\") && !path.isAbsolute(relative)) {\n return `.${path.sep}${relative}`;\n }\n return file;\n}\n\nfunction summarizePaths(files: string[], baseDir: string, max = 4): string {\n const shortened = unique(files).map((file) =>\n shortenPathForOutput(file, baseDir),\n );\n if (shortened.length <= max) return shortened.join(\", \");\n return `${shortened.slice(0, max).join(\", \")} +${shortened.length - max} more`;\n}\n\nasync function createInstallProgress(\n options: InstallSkillsOptions,\n max: number,\n) {\n if (options.quiet || !isInteractive(options) || max <= 0) return null;\n const clack = await import(\"@clack/prompts\");\n const progress = clack.progress({ max, indicator: \"timer\" });\n let active = false;\n return {\n start(message: string) {\n active = true;\n progress.start(message);\n },\n message(message: string) {\n if (active) progress.message(message);\n },\n advance(message: string) {\n if (active) progress.advance(1, message);\n },\n stop(message: string) {\n if (!active) return;\n progress.stop(message);\n active = false;\n },\n error(message: string) {\n if (!active) return;\n progress.error(message);\n active = false;\n },\n };\n}\n\nfunction mcpAppsForSkills(\n skillNames: string[],\n planOverride?: { hostedUrl: string; mcpUrl: string },\n): BuiltInAppMcp[] {\n const apps: BuiltInAppMcp[] = [];\n const seen = new Set<string>();\n for (const skillName of skillNames) {\n const app = resolveAppForSkill(skillName);\n if (!app || seen.has(app.appId)) continue;\n seen.add(app.appId);\n if (app.appId === \"visual-plans\" && planOverride) {\n apps.push({\n ...app,\n hostedUrl: planOverride.hostedUrl,\n mcpUrl: planOverride.mcpUrl,\n });\n } else {\n apps.push(app);\n }\n }\n return apps;\n}\n\nfunction mcpStatus(server: InstalledMcpServer, dryRun: boolean): string {\n if (dryRun) return `would register for ${server.clients.join(\", \")}`;\n\n const registered = server.registeredClients;\n const pending = server.clients.filter(\n (client) => !registered.includes(client),\n );\n const parts: string[] = [];\n if (registered.length > 0) {\n parts.push(\n `${server.authenticated ? \"registered and authenticated\" : \"registered\"} for ${registered.join(\", \")}`,\n );\n }\n if (pending.length > 0) {\n parts.push(`authentication pending for ${pending.join(\", \")}`);\n }\n return (\n parts.join(\"; \") ||\n `authentication pending for ${server.clients.join(\", \")}`\n );\n}\n\nasync function printInstallResult(\n result: InstallSkillsResult,\n options: { baseDir: string; dryRun: boolean },\n): Promise<void> {\n const clack = await import(\"@clack/prompts\");\n const verb = options.dryRun ? \"Would install\" : \"Installed\";\n const summary = [\n `Skills ${result.skills.join(\", \") || \"none\"}`,\n `Agents ${result.clients.join(\", \") || \"none\"}`,\n `Scope ${result.scope}`,\n result.planMode ? `Plan mode ${result.planMode}` : \"\",\n result.written.length\n ? `Skill folders ${plural(result.written.length, \"folder\")} (${summarizePaths(\n result.written,\n options.baseDir,\n )})`\n : \"\",\n ].filter(Boolean);\n\n clack.note(summary.join(\"\\n\"), verb);\n\n if (result.instructionFiles.length) {\n clack.note(\n summarizePaths(result.instructionFiles, options.baseDir),\n \"Managed instructions\",\n );\n }\n\n if (result.githubActionPath) {\n clack.note(\n shortenPathForOutput(result.githubActionPath, options.baseDir),\n \"PR Visual Recap workflow\",\n );\n }\n\n if (result.mcpServers.length) {\n const mcpLines = result.mcpServers.map((server) => {\n const status = mcpStatus(server, options.dryRun);\n const files = server.files.length\n ? ` (${summarizePaths(server.files, options.baseDir, 2)})`\n : \"\";\n return `${server.serverName}: ${status}${files}`;\n });\n clack.note(mcpLines.join(\"\\n\"), \"MCP\");\n\n const guidance = result.mcpServers.flatMap((server) => server.guidance);\n if (guidance.length) {\n clack.note(guidance.join(\"\\n\"), \"Next steps\");\n }\n }\n\n if (result.planMode === \"local-files\") {\n clack.note(\n [\n \"No sharing, all local.\",\n \"Run: npx @agent-native/core@latest plan blocks --out plan-blocks.md\",\n \"Preview: npx @agent-native/core@latest plan local preview --dir plans/<slug> --open\",\n ].join(\"\\n\"),\n \"Local Plan files\",\n );\n }\n\n if (!options.dryRun) {\n clack.note(\"Restart or reload selected agent clients if needed.\", \"Reload\");\n }\n\n clack.outro(`${options.dryRun ? \"Dry run complete\" : \"All set\"} ✅`);\n}\n\nasync function resolveSelectedSkills(\n entries: SkillEntry[],\n options: InstallSkillsOptions,\n): Promise<SkillEntry[]> {\n const byName = new Map(entries.map((entry) => [entry.name, entry]));\n const requested = unique((options.skillNames ?? []).map(normalizeSkillName));\n if (requested.length > 0) {\n const missing = requested.filter((name) => !byName.has(name));\n if (missing.length > 0) {\n throw new Error(\n `Unknown skill${missing.length === 1 ? \"\" : \"s\"}: ${missing.join(\", \")}. Available: ${entries\n .map((entry) => entry.name)\n .join(\", \")}.`,\n );\n }\n return requested.map((name) => byName.get(name)!);\n }\n\n return entries;\n}\n\nasync function resolveSelectedScope(\n options: InstallSkillsOptions,\n): Promise<SkillScope> {\n if (options.scope) return options.scope;\n return \"user\";\n}\n\nasync function resolveSelectedClients(\n options: InstallSkillsOptions,\n): Promise<SkillClient[]> {\n const requested = unique(options.clients ?? []);\n if (requested.length > 0) return requested;\n return CLIENTS;\n}\n\nfunction isInteractive(\n options: Pick<InstallSkillsOptions, \"isInteractive\">,\n): boolean {\n if (options.isInteractive) return options.isInteractive();\n if (process.env.CI === \"true\") return false;\n return Boolean(process.stdin.isTTY && process.stdout.isTTY);\n}\n\nfunction installRootForClient(\n client: SkillClient,\n scope: SkillScope,\n baseDir: string,\n): string {\n const home = process.env.HOME || os.homedir();\n if (scope === \"project\") {\n if (client !== \"claude-code\") {\n return path.join(baseDir, \".agents\", \"skills\");\n }\n return path.join(baseDir, \".claude\", \"skills\");\n }\n if (client === \"codex\") {\n return process.env.CODEX_HOME\n ? path.join(process.env.CODEX_HOME, \"skills\")\n : path.join(home, \".codex\", \"skills\");\n }\n if (client === \"pi\") {\n return path.join(home, \".agents\", \"skills\");\n }\n if (\n client === \"cursor\" ||\n client === \"opencode\" ||\n client === \"github-copilot\"\n ) {\n return path.join(home, \".agents\", \"skills\");\n }\n return path.join(home, \".claude\", \"skills\");\n}\n\nfunction discoverSkills(root: string): SkillEntry[] {\n const skillsRoot = resolveSkillsRoot(root);\n const directSkill = path.join(skillsRoot, \"SKILL.md\");\n if (fs.existsSync(directSkill)) {\n const entry = skillEntry(skillsRoot);\n return entry ? [entry] : [];\n }\n const entries = fs\n .readdirSync(skillsRoot, { withFileTypes: true })\n .filter((entry) => entry.isDirectory() && !entry.name.startsWith(\".\"))\n .map((entry) => skillEntry(path.join(skillsRoot, entry.name)))\n .filter((entry): entry is SkillEntry => Boolean(entry));\n return entries.sort((a, b) => a.name.localeCompare(b.name));\n}\n\nfunction resolveSkillsRoot(root: string): string {\n for (const manifestPath of [\n path.join(root, \".codex-plugin\", \"plugin.json\"),\n path.join(root, \".claude-plugin\", \"plugin.json\"),\n ]) {\n if (!fs.existsSync(manifestPath)) continue;\n try {\n const manifest = JSON.parse(fs.readFileSync(manifestPath, \"utf-8\")) as {\n skills?: unknown;\n };\n if (typeof manifest.skills === \"string\") {\n const resolved = path.resolve(root, manifest.skills);\n if (fs.existsSync(resolved)) return resolved;\n }\n } catch {}\n }\n const conventional = path.join(root, \"skills\");\n if (fs.existsSync(conventional)) return conventional;\n return root;\n}\n\nfunction skillEntry(dir: string): SkillEntry | null {\n const skillFile = path.join(dir, \"SKILL.md\");\n if (!fs.existsSync(skillFile)) return null;\n const body = fs.readFileSync(skillFile, \"utf-8\");\n const frontmatter = body.match(/^---\\n([\\s\\S]*?)\\n---/);\n const name = frontmatterField(frontmatter?.[1], \"name\") ?? path.basename(dir);\n const description = frontmatterField(frontmatter?.[1], \"description\");\n return { name: normalizeSkillName(name), dir, description };\n}\n\nfunction frontmatterField(\n frontmatter: string | undefined,\n field: string,\n): string | undefined {\n if (!frontmatter) return undefined;\n const lines = frontmatter.split(/\\r?\\n/);\n for (let i = 0; i < lines.length; i += 1) {\n const match = lines[i].match(new RegExp(`^${field}:\\\\s*(.*)$`));\n if (!match) continue;\n const raw = match[1].trim();\n if (raw === \">-\" || raw === \">\" || raw === \"|-\" || raw === \"|\") {\n const block: string[] = [];\n for (let j = i + 1; j < lines.length; j += 1) {\n const line = lines[j];\n if (line.trim() && !/^\\s/.test(line)) break;\n block.push(line.replace(/^\\s+/, \"\"));\n }\n const value = raw.startsWith(\"|\") ? block.join(\"\\n\") : block.join(\" \");\n return value.replace(/\\s+/g, \" \").trim() || undefined;\n }\n return raw.replace(/^[\"']|[\"']$/g, \"\").trim() || undefined;\n }\n return undefined;\n}\n\nasync function materializeSource(input: string): Promise<{\n root: string;\n cleanup?: () => void;\n}> {\n const local = path.resolve(input);\n if (fs.existsSync(local)) return { root: local };\n\n const parsed = parseGitHubSource(input);\n if (!parsed) {\n throw new Error(\n `Skill source not found: ${input}. Use a local path, GitHub owner/repo, or GitHub URL.`,\n );\n }\n\n const tmpRoot = fs.mkdtempSync(\n path.join(os.tmpdir(), \"agent-native-skills-\"),\n );\n const archive = path.join(tmpRoot, \"source.tgz\");\n const ref = parsed.ref ?? \"main\";\n const url = `https://codeload.github.com/${parsed.owner}/${parsed.repo}/tar.gz/${encodeURIComponent(ref)}`;\n const response = await fetch(url, {\n headers: { \"user-agent\": \"@agent-native/skills\" },\n });\n if (!response.ok) {\n fs.rmSync(tmpRoot, { recursive: true, force: true });\n throw new Error(\n `Could not download ${parsed.owner}/${parsed.repo}@${ref}: HTTP ${response.status}.`,\n );\n }\n fs.writeFileSync(archive, Buffer.from(await response.arrayBuffer()));\n\n const extractDir = path.join(tmpRoot, \"extract\");\n fs.mkdirSync(extractDir, { recursive: true });\n const extracted = spawnSync(\"tar\", [\"-xzf\", archive, \"-C\", extractDir], {\n stdio: \"pipe\",\n encoding: \"utf-8\",\n });\n if (extracted.status !== 0) {\n fs.rmSync(tmpRoot, { recursive: true, force: true });\n throw new Error(\n `Could not extract ${input}: ${extracted.stderr || extracted.stdout}`,\n );\n }\n const [first] = fs\n .readdirSync(extractDir, { withFileTypes: true })\n .filter((entry) => entry.isDirectory());\n if (!first) {\n fs.rmSync(tmpRoot, { recursive: true, force: true });\n throw new Error(\n `Downloaded archive for ${input} did not contain a repo directory.`,\n );\n }\n return {\n root: path.join(extractDir, first.name),\n cleanup: () => fs.rmSync(tmpRoot, { recursive: true, force: true }),\n };\n}\n\nfunction parseGitHubSource(\n input: string,\n): { owner: string; repo: string; ref?: string } | null {\n const shorthand = input.match(\n /^([A-Za-z0-9_.-]+)\\/([A-Za-z0-9_.-]+)(?:#(.+))?$/,\n );\n if (shorthand) {\n return {\n owner: shorthand[1],\n repo: shorthand[2].replace(/\\.git$/, \"\"),\n ref: shorthand[3],\n };\n }\n\n let url: URL;\n try {\n url = new URL(input);\n } catch {\n return null;\n }\n if (url.hostname !== \"github.com\") return null;\n const parts = url.pathname.split(\"/\").filter(Boolean);\n if (parts.length < 2) return null;\n const treeIndex = parts.indexOf(\"tree\");\n return {\n owner: parts[0],\n repo: parts[1].replace(/\\.git$/, \"\"),\n ref:\n treeIndex >= 0 && parts[treeIndex + 1]\n ? parts.slice(treeIndex + 1).join(\"/\")\n : url.hash.slice(1) || undefined,\n };\n}\n\nfunction instructionContentForSkill(skillName: string): string | null {\n if (skillName === \"quick-recap\") {\n return \"When writing final response status indicators, use the /quick-recap skill always.\";\n }\n if (skillName === \"efficient-fable\") {\n return \"When operating as Claude Fable, use the /efficient-fable skill always.\";\n }\n if (skillName === \"efficient-frontier\") {\n return \"When using a high-cost frontier model for codebase-heavy work, use the /efficient-frontier skill always.\";\n }\n if (skillName === \"stay-within-limits\") {\n return \"When long-running or parallel work needs usage-limit checks, use the /stay-within-limits skill always.\";\n }\n if (skillName === \"visual-plan\") {\n return \"When work needs an interactive visual plan before implementation, use the /visual-plan skill always.\";\n }\n if (skillName === \"visual-recap\") {\n return \"When a PR, branch, commit, or diff needs an interactive visual recap, use the /visual-recap skill always.\";\n }\n return null;\n}\n\nfunction managedInstructionBlocksForSkills(skillNames: string[]): string[] {\n return skillNames\n .map((name) => instructionContentForSkill(name))\n .filter((block): block is string => Boolean(block));\n}\n\nasync function shouldUpdateManagedInstructions(\n blocks: string[],\n options: InstallSkillsOptions,\n): Promise<boolean> {\n if (blocks.length === 0) return false;\n let shouldUpdate = options.updateInstructions;\n if (shouldUpdate !== undefined) return shouldUpdate;\n if (options.yes) return true;\n return false;\n}\n\nfunction writeManagedInstructions(\n blocks: string[],\n baseDir: string,\n clients: SkillClient[],\n scope: SkillScope,\n options: InstallSkillsOptions,\n): string[] {\n if (blocks.length === 0) return [];\n const files = resolveInstructionFiles(\n baseDir,\n options.instructionFiles,\n clients,\n scope,\n );\n const content = `${MANAGED_INSTRUCTIONS_START}\n${blocks.join(\"\\n\")}\n${MANAGED_INSTRUCTIONS_END}`;\n for (const file of files) {\n if (options.dryRun) continue;\n upsertManagedBlock(file, content);\n }\n return files;\n}\n\nasync function maybeUpdateInstructions(\n skillNames: string[],\n baseDir: string,\n options: InstallSkillsOptions,\n): Promise<string[]> {\n const blocks = managedInstructionBlocksForSkills(skillNames);\n const clients = options.clients?.length ? options.clients : CLIENTS;\n const scope = options.scope ?? \"user\";\n if (!(await shouldUpdateManagedInstructions(blocks, options))) return [];\n return writeManagedInstructions(blocks, baseDir, clients, scope, options);\n}\n\nfunction resolveInstructionFiles(\n baseDir: string,\n explicit: string[] | undefined,\n clients: SkillClient[],\n scope: SkillScope,\n): string[] {\n if (explicit && explicit.length > 0) {\n return explicit.map((file) => path.resolve(baseDir, file));\n }\n if (scope === \"user\") {\n const home = process.env.HOME || os.homedir();\n const files: string[] = [];\n if (clients.includes(\"codex\")) {\n const codexHome = process.env.CODEX_HOME || path.join(home, \".codex\");\n files.push(path.join(codexHome, \"AGENTS.md\"));\n }\n if (clients.includes(\"claude-code\")) {\n files.push(path.join(home, \".claude\", \"CLAUDE.md\"));\n }\n return unique(files);\n }\n const candidates = [\"AGENTS.md\", \"CLAUDE.md\"].map((file) =>\n path.join(baseDir, file),\n );\n const existing = candidates.filter((file) => fs.existsSync(file));\n return existing.length > 0 ? existing : [path.join(baseDir, \"AGENTS.md\")];\n}\n\nfunction upsertManagedBlock(file: string, block: string): void {\n fs.mkdirSync(path.dirname(file), { recursive: true });\n const existing = fs.existsSync(file) ? fs.readFileSync(file, \"utf-8\") : \"\";\n const pattern = new RegExp(\n `${escapeRegExp(MANAGED_INSTRUCTIONS_START)}[\\\\s\\\\S]*?${escapeRegExp(MANAGED_INSTRUCTIONS_END)}`,\n );\n const next = pattern.test(existing)\n ? existing.replace(pattern, block)\n : `${existing.trimEnd()}${existing.trim() ? \"\\n\\n\" : \"\"}${block}\\n`;\n fs.writeFileSync(file, next, \"utf-8\");\n}\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nconst PR_VISUAL_RECAP_DOCS_URL =\n \"https://www.agent-native.com/docs/pr-visual-recap\";\n\nfunction prVisualRecapWorkflowPath(baseDir: string): string {\n return path.join(baseDir, \".github\", \"workflows\", \"pr-visual-recap.yml\");\n}\n\nfunction prVisualRecapSetupCommand(): string {\n return \"npx @agent-native/core@latest recap setup\";\n}\n\nasync function promptForGithubAction(\n context: GithubActionPromptContext,\n): Promise<boolean | null> {\n const clack = await import(\"@clack/prompts\");\n const result = await clack.confirm({\n message:\n \"Optional: add automatic PR Visual Recaps? (GitHub Action)\\n\" +\n \" Posts a human-friendly recap on every pull request.\\n\" +\n ` Learn more: ${context.docsUrl}\\n` +\n ` Writes ${context.workflowPath}; ${context.setupCommand} finishes the GitHub secrets.`,\n initialValue: false,\n });\n if (clack.isCancel(result)) {\n clack.cancel(\"Skipped PR Visual Recap workflow.\");\n return null;\n }\n return Boolean(result);\n}\n\nasync function shouldWritePrVisualRecapWorkflow(\n hasVisualRecap: boolean,\n options: InstallSkillsOptions,\n baseDir: string,\n): Promise<boolean> {\n if (!hasVisualRecap) return false;\n if (options.withGithubAction) return true;\n if (fs.existsSync(prVisualRecapWorkflowPath(baseDir))) return false;\n if (options.yes || !isInteractive(options)) return false;\n const prompt = options.promptGithubAction ?? promptForGithubAction;\n const choice = await prompt({\n workflowPath: path.join(\".github\", \"workflows\", \"pr-visual-recap.yml\"),\n setupCommand: prVisualRecapSetupCommand(),\n docsUrl: PR_VISUAL_RECAP_DOCS_URL,\n });\n return choice === true;\n}\n\nconst PR_VISUAL_RECAP_REUSABLE_WORKFLOW = `name: PR Visual Recap\n\non:\n pull_request:\n types: [opened, synchronize, reopened, ready_for_review]\n\npermissions:\n contents: read\n\nconcurrency:\n group: pr-visual-recap-\\${{ github.event.pull_request.number }}\n cancel-in-progress: true\n\njobs:\n visual-recap:\n permissions:\n checks: write\n contents: read\n issues: write\n pull-requests: read\n uses: BuilderIO/agent-native/.github/workflows/pr-visual-recap-reusable.yml@main\n with:\n skill-source: repo\n secrets:\n PLAN_RECAP_TOKEN: \\${{ secrets.PLAN_RECAP_TOKEN }}\n ANTHROPIC_API_KEY: \\${{ secrets.ANTHROPIC_API_KEY }}\n OPENAI_API_KEY: \\${{ secrets.OPENAI_API_KEY }}\n PLAN_RECAP_APP_URL: \\${{ secrets.PLAN_RECAP_APP_URL }}\n`;\n\nfunction writePrVisualRecapWorkflow(\n baseDir: string,\n options: InstallSkillsOptions,\n): string {\n const file = path.join(\n baseDir,\n \".github\",\n \"workflows\",\n \"pr-visual-recap.yml\",\n );\n if (options.dryRun) return file;\n if (fs.existsSync(file)) {\n const current = fs.readFileSync(file, \"utf-8\");\n if (current === PR_VISUAL_RECAP_REUSABLE_WORKFLOW) return file;\n if (!options.force) {\n throw new Error(\n `${file} already exists and differs. Re-run with --force to overwrite it.`,\n );\n }\n }\n fs.mkdirSync(path.dirname(file), { recursive: true });\n fs.writeFileSync(file, PR_VISUAL_RECAP_REUSABLE_WORKFLOW, \"utf-8\");\n return file;\n}\n\nexport function createInstallId(): string {\n return randomUUID();\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { spawnSync } from \"node:child_process\";\nimport { randomUUID } from \"node:crypto\";\nimport fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nimport { resolveAppForSkill, type BuiltInAppMcp } from \"./built-in-apps.js\";\nimport { registerMcpServer } from \"./connect.js\";\nimport type { ClientId } from \"./mcp-config-writers.js\";\nimport { createCliTelemetry, type CliTelemetry } from \"./telemetry.js\";\n\nexport type SkillClient =\n | \"codex\"\n | \"claude-code\"\n | \"cowork\"\n | \"pi\"\n | \"cursor\"\n | \"opencode\"\n | \"github-copilot\";\nexport type SkillScope = \"project\" | \"user\";\nexport type PlanMode = \"hosted\" | \"local-files\" | \"self-hosted\";\n\nexport interface SkillEntry {\n name: string;\n dir: string;\n description?: string;\n}\n\nexport interface InstallSkillsOptions {\n source?: string;\n skillNames?: string[];\n clients?: SkillClient[];\n scope?: SkillScope;\n baseDir?: string;\n yes?: boolean;\n dryRun?: boolean;\n updateInstructions?: boolean;\n instructionFiles?: string[];\n withGithubAction?: boolean;\n force?: boolean;\n connect?: boolean;\n quiet?: boolean;\n deviceFlowTimeoutMs?: number;\n log?: (message: string) => void;\n isInteractive?: () => boolean;\n telemetry?: CliTelemetry;\n promptSkills?: (context: SkillsPromptContext) => Promise<string[] | null>;\n promptClients?: (\n context: ClientsPromptContext,\n ) => Promise<SkillClient[] | null>;\n promptScope?: (context: ScopePromptContext) => Promise<SkillScope | null>;\n promptUpdateInstructions?: () => Promise<boolean | null>;\n promptGithubAction?: (\n context: GithubActionPromptContext,\n ) => Promise<boolean | null>;\n promptPlanMode?: (context: PlanModePromptContext) => Promise<PlanMode | null>;\n promptPlanMcpUrl?: () => Promise<string | null>;\n /**\n * Register the hosted MCP server for app-backed skills (e.g. visual-plan /\n * visual-recap → the Agent-Native Plan MCP). Defaults to `true`; pass\n * `false` (CLI `--no-mcp`) to install the skill files only.\n */\n mcp?: boolean;\n planMode?: PlanMode;\n mcpUrl?: string;\n}\n\nexport interface InstalledMcpServer {\n serverName: string;\n mcpUrl: string;\n clients: SkillClient[];\n registeredClients: SkillClient[];\n files: string[];\n authenticated: boolean;\n guidance: string[];\n}\n\nexport interface InstallSkillsResult {\n source: string;\n skills: string[];\n clients: SkillClient[];\n scope: SkillScope;\n written: string[];\n instructionFiles: string[];\n githubActionPath?: string;\n mcpServers: InstalledMcpServer[];\n planMode?: PlanMode;\n dryRun: boolean;\n}\n\ninterface ParsedArgs {\n command: \"add\" | \"list\" | \"help\";\n source?: string;\n copySource: boolean;\n skillNames: string[];\n clients: SkillClient[];\n scope: SkillScope;\n scopeExplicit: boolean;\n yes: boolean;\n dryRun: boolean;\n printJson: boolean;\n updateInstructions?: boolean;\n instructionFiles: string[];\n withGithubAction: boolean;\n force: boolean;\n connect: boolean;\n baseDir?: string;\n mcp: boolean;\n planMode?: PlanMode;\n mcpUrl?: string;\n quiet: boolean;\n}\n\ninterface PromptOption<T extends string> {\n value: T;\n label: string;\n hint: string;\n}\n\nexport interface SkillsPromptContext {\n initialSkills: string[];\n options: Array<PromptOption<string>>;\n}\n\nexport interface ClientsPromptContext {\n initialClients: SkillClient[];\n options: Array<PromptOption<SkillClient>>;\n}\n\nexport interface ScopePromptContext {\n initialScope: SkillScope;\n}\n\nexport interface GithubActionPromptContext {\n workflowPath: string;\n setupCommand: string;\n docsUrl: string;\n}\n\nexport interface PlanModePromptContext {\n initialMode: PlanMode;\n}\n\nconst HELP = `@agent-native/skills\n\nUsage:\n npx @agent-native/skills@latest add [options]\n npx @agent-native/skills@latest list\n\nOptions:\n --skill <name> Install only this skill (repeatable)\n --client, -a <client> codex, claude-code, cowork, pi, cursor, opencode, github-copilot, or all\n (default: all; repeatable or comma-separated)\n --scope <user|project> Install globally or into the current project (default: user)\n -g, --global Alias for --scope user\n --project Alias for --scope project\n --update-instructions Add managed AGENTS.md / CLAUDE.md instructions when useful\n --no-update-instructions Skip managed instruction file updates\n --instructions-file <path> File to receive managed instructions (repeatable)\n --with-github-action Add .github/workflows/pr-visual-recap.yml when visual-recap is installed\n --mode <mode> visual-plan/visual-recap mode: hosted, local-files, or self-hosted\n --mcp-url <url> Self-hosted app/MCP URL for visual-plan/visual-recap\n --force Overwrite a different existing PR Visual Recap workflow\n --no-mcp Install skill files only; skip registering the app's MCP server\n --no-connect Register MCP where possible but skip inline browser/device authentication\n -y, --yes Use defaults in non-interactive mode\n --dry-run Print intended writes without changing files\n --json Print the result as JSON\n\nApp-backed skills (visual-plan, visual-recap) register their hosted MCP server\nin your agent config by default so the agent can actually use them. Use\n--no-mcp to skip that and copy the files only.\nFor visual-plan/visual-recap, choose --mode local-files for no sharing and all\nlocal files, or --mode self-hosted --mcp-url <url> for your own Plan app.\n\nExamples:\n npx @agent-native/skills@latest add\n npx @agent-native/skills@latest add --skill quick-recap\n npx @agent-native/skills@latest add --skill visual-recap --with-github-action\n`;\n\nconst CLIENTS: SkillClient[] = [\n \"codex\",\n \"claude-code\",\n \"cowork\",\n \"pi\",\n \"cursor\",\n \"opencode\",\n \"github-copilot\",\n];\nconst DEFAULT_SKILLS_SOURCE = \"BuilderIO/skills\";\nconst MANAGED_INSTRUCTIONS_START = \"<!-- BEGIN @agent-native/skills -->\";\nconst MANAGED_INSTRUCTIONS_END = \"<!-- END @agent-native/skills -->\";\n\nexport function parseSkillsCliArgs(argv: string[]): ParsedArgs {\n const first = argv[0];\n if (!first || first === \"help\" || first === \"--help\" || first === \"-h\") {\n return defaultArgs(\"help\");\n }\n\n const command = first === \"list\" ? \"list\" : \"add\";\n const args = first === \"add\" || first === \"list\" ? argv.slice(1) : argv;\n const out = defaultArgs(command);\n\n for (let i = 0; i < args.length; i += 1) {\n const arg = args[i];\n const eat = (flag: string): string | undefined => {\n if (arg === flag) {\n const next = args[++i];\n if (!next || next.startsWith(\"-\")) {\n throw new Error(`Missing value for ${flag}.`);\n }\n return next;\n }\n if (arg.startsWith(`${flag}=`)) {\n const value = arg.slice(flag.length + 1);\n if (!value) throw new Error(`Missing value for ${flag}.`);\n return value;\n }\n return undefined;\n };\n\n let value: string | undefined;\n if ((value = eat(\"--skill\")) !== undefined) out.skillNames.push(value);\n else if ((value = eat(\"-s\")) !== undefined) out.skillNames.push(value);\n else if ((value = eat(\"--client\")) !== undefined)\n out.clients.push(...normalizeClients(value));\n else if ((value = eat(\"--agent\")) !== undefined)\n out.clients.push(...normalizeClients(value));\n else if ((value = eat(\"-a\")) !== undefined)\n out.clients.push(...normalizeClients(value));\n else if ((value = eat(\"--scope\")) !== undefined) {\n out.scope = parseScope(value);\n out.scopeExplicit = true;\n } else if ((value = eat(\"--instructions-file\")) !== undefined)\n out.instructionFiles.push(value);\n else if ((value = eat(\"--cwd\")) !== undefined) out.baseDir = value;\n else if (arg === \"-g\" || arg === \"--global\") {\n out.scope = \"user\";\n out.scopeExplicit = true;\n } else if (arg === \"--project\") {\n out.scope = \"project\";\n out.scopeExplicit = true;\n } else if (arg === \"--copy\") {\n // Compatibility with the open `skills` CLI. This installer always copies.\n out.copySource = true;\n } else if (arg === \"-y\" || arg === \"--yes\") out.yes = true;\n else if (arg === \"--dry-run\") out.dryRun = true;\n else if (arg === \"--json\") out.printJson = true;\n else if (arg === \"--quiet\") out.quiet = true;\n else if (arg === \"--update-instructions\") out.updateInstructions = true;\n else if (arg === \"--no-update-instructions\") out.updateInstructions = false;\n else if (arg === \"--with-github-action\" || arg === \"--with-github-actions\")\n out.withGithubAction = true;\n else if ((value = eat(\"--mode\")) !== undefined) {\n out.planMode = parsePlanMode(value);\n } else if ((value = eat(\"--mcp-url\")) !== undefined) {\n out.mcpUrl = value;\n } else if (arg === \"--force\") out.force = true;\n else if (arg === \"--no-mcp\") out.mcp = false;\n else if (arg === \"--mcp\") out.mcp = true;\n else if (arg === \"--no-connect\" || arg === \"--skip-connect\")\n out.connect = false;\n else if (arg === \"--connect\") out.connect = true;\n else if (arg.startsWith(\"-\")) throw new Error(`Unknown option: ${arg}`);\n else if (!out.source) out.source = arg;\n else throw new Error(`Unexpected argument: ${arg}`);\n }\n\n if (out.source && out.source !== DEFAULT_SKILLS_SOURCE && !out.copySource) {\n throw new Error(\n `Unexpected argument: ${out.source}. @agent-native/skills installs the BuilderIO skills collection; use --skill <name> to choose a skill.`,\n );\n }\n if (out.source === DEFAULT_SKILLS_SOURCE && !out.copySource) {\n out.source = undefined;\n }\n\n out.skillNames = unique(out.skillNames.map(normalizeSkillName));\n out.clients = unique(out.clients);\n out.instructionFiles = unique(out.instructionFiles);\n if (out.planMode && out.mcpUrl && out.planMode !== \"self-hosted\") {\n throw new Error(\"--mcp-url can only be used with --mode self-hosted.\");\n }\n if (out.mcpUrl && !out.planMode) out.planMode = \"self-hosted\";\n return out;\n}\n\n/**\n * Translate this package's parsed args into the argv shape `@agent-native/core`\n * skills expects. Core takes a single positional target + compatible flags; we\n * forward one explicit skill as that target and let core's interactive picker\n * handle 0-or-many selections.\n */\nfunction toCoreSkillsArgv(parsed: ParsedArgs): string[] {\n const out: string[] = [parsed.command];\n if (parsed.command === \"add\") {\n if (parsed.copySource && parsed.source && parsed.skillNames.length > 0) {\n out.push(parsed.source);\n for (const skill of parsed.skillNames) out.push(\"--skill\", skill);\n } else if (parsed.skillNames.length === 1) {\n out.push(parsed.skillNames[0]);\n } else if (parsed.skillNames.length > 1) {\n const appIds = unique(\n parsed.skillNames\n .map((name) => resolveAppForSkill(name)?.appId)\n .filter((appId): appId is string => Boolean(appId)),\n );\n if (\n appIds.length === 1 &&\n parsed.skillNames.every((name) => resolveAppForSkill(name))\n ) {\n out.push(appIds[0]);\n } else {\n for (const skill of parsed.skillNames) out.push(\"--skill\", skill);\n }\n }\n }\n if (parsed.command === \"add\" && parsed.clients.length) {\n out.push(\"--client\", parsed.clients.join(\",\"));\n }\n if (parsed.command === \"add\" && parsed.scopeExplicit) {\n out.push(\"--scope\", parsed.scope);\n }\n if (parsed.command === \"add\" && parsed.yes) out.push(\"--yes\");\n if (parsed.dryRun) out.push(\"--dry-run\");\n if (parsed.printJson) out.push(\"--json\");\n if (parsed.command === \"add\" && parsed.withGithubAction)\n out.push(\"--with-github-action\");\n if (parsed.command === \"add\" && parsed.planMode)\n out.push(\"--mode\", parsed.planMode);\n if (parsed.command === \"add\" && parsed.mcpUrl)\n out.push(\"--mcp-url\", parsed.mcpUrl);\n if (parsed.command === \"add\" && parsed.force) out.push(\"--force\");\n if (parsed.command === \"add\" && parsed.mcp === false) out.push(\"--no-mcp\");\n if (parsed.command === \"add\" && parsed.connect === false)\n out.push(\"--no-connect\");\n if (parsed.command === \"add\" && parsed.updateInstructions === true)\n out.push(\"--update-instructions\");\n if (parsed.command === \"add\" && parsed.updateInstructions === false)\n out.push(\"--no-update-instructions\");\n return out;\n}\n\nfunction shouldLoadPublicCatalog(parsed: ParsedArgs): boolean {\n if (parsed.command === \"list\") return true;\n if (parsed.command !== \"add\") return false;\n if (parsed.copySource && parsed.source) return true;\n if (parsed.skillNames.length === 0) return true;\n return parsed.skillNames.some((name) => !resolveAppForSkill(name));\n}\n\nconst HIDDEN_STANDALONE_BUILT_INS = [\n \"assets\",\n \"design-exploration\",\n \"context-xray\",\n];\n\nexport async function runSkillsCli(\n argv: string[],\n options: Pick<\n InstallSkillsOptions,\n | \"log\"\n | \"isInteractive\"\n | \"baseDir\"\n | \"promptSkills\"\n | \"promptClients\"\n | \"promptScope\"\n | \"promptUpdateInstructions\"\n | \"promptGithubAction\"\n | \"promptPlanMode\"\n | \"promptPlanMcpUrl\"\n > = {},\n): Promise<void> {\n const parsed = parseSkillsCliArgs(argv);\n\n // `@agent-native/skills` normally uses the exact same core flow as\n // `agent-native skills`; it only passes a broader public skill catalog.\n // AGENT_NATIVE_SKILLS_DIRECT=1 is set by core when it shells out to this\n // package as a headless file-copy worker for public/plain skill repos. That\n // direct mode is intentionally non-user-facing prompt plumbing.\n if (process.env.AGENT_NATIVE_SKILLS_DIRECT !== \"1\") {\n if (parsed.command === \"help\") {\n process.stdout.write(`${HELP}\\n`);\n return;\n }\n const loadedSource = shouldLoadPublicCatalog(parsed)\n ? await materializeSource(parsed.source ?? DEFAULT_SKILLS_SOURCE)\n : null;\n try {\n const { runSkills } = (await import(\"@agent-native/core/cli/skills\")) as {\n runSkills: (\n argv: string[],\n options: Record<string, unknown>,\n ) => Promise<void>;\n };\n const publicSkillEntries = loadedSource\n ? discoverSkills(loadedSource.root).map((entry) => ({\n name: entry.name,\n description: entry.description,\n }))\n : [];\n await runSkills(toCoreSkillsArgv(parsed), {\n log: options.log,\n isInteractive: options.isInteractive,\n baseDir: parsed.baseDir ?? options.baseDir,\n catalogMode: \"all\",\n hiddenBuiltInSkillTargets: HIDDEN_STANDALONE_BUILT_INS,\n publicSkillSource:\n loadedSource?.root ?? parsed.source ?? DEFAULT_SKILLS_SOURCE,\n publicSkillEntries,\n promptSkills: options.promptSkills\n ? async (context: any) =>\n options.promptSkills?.({\n initialSkills: context.initialTargets,\n options: context.options,\n }) ?? null\n : undefined,\n promptClients: options.promptClients as any,\n promptScope: options.promptScope,\n promptGithubAction: options.promptGithubAction\n ? async (context: any) =>\n options.promptGithubAction?.({\n workflowPath: context.workflowPath,\n setupCommand: context.setupCommand,\n docsUrl: context.docsUrl,\n }) ?? null\n : undefined,\n promptPlanMode: options.promptPlanMode,\n promptPlanMcpUrl: options.promptPlanMcpUrl,\n promptUpdateInstructions: options.promptUpdateInstructions,\n });\n return;\n } finally {\n loadedSource?.cleanup?.();\n }\n }\n\n const startedAt = Date.now();\n const telemetry = createCliTelemetry({\n cli: \"skills-installer\",\n cliVersion: readCliVersion(),\n command: parsed.command,\n interactive: cliInteractive(parsed, options),\n });\n\n try {\n if (parsed.command === \"help\") {\n process.stdout.write(`${HELP}\\n`);\n return;\n }\n telemetry.track(\"skills_cli started\");\n const skillSource = parsed.source ?? DEFAULT_SKILLS_SOURCE;\n\n if (parsed.command === \"list\") {\n const source = await materializeSource(skillSource);\n try {\n const skills = discoverSkills(source.root);\n telemetry.track(\"skills_cli skills listed\", {\n availableCount: skills.length,\n available: skills.map((skill) => skill.name).join(\",\"),\n });\n if (parsed.printJson) {\n process.stdout.write(`${JSON.stringify(skills, null, 2)}\\n`);\n return;\n }\n for (const skill of skills) {\n process.stdout.write(\n `${skill.name}${skill.description ? ` - ${skill.description}` : \"\"}\\n`,\n );\n }\n return;\n } finally {\n source.cleanup?.();\n }\n }\n\n const stdoutLog =\n parsed.printJson || options.log\n ? options.log\n : (message: string) => process.stdout.write(`${message}\\n`);\n\n const result = await installSkills({\n source: skillSource,\n skillNames: parsed.skillNames,\n clients: parsed.clients,\n // Leave scope undefined unless the user passed --scope/-g/--project so the\n // installer can prompt for it interactively.\n scope: parsed.scopeExplicit ? parsed.scope : undefined,\n baseDir: parsed.baseDir ?? options.baseDir,\n yes: parsed.yes,\n dryRun: parsed.dryRun,\n updateInstructions: parsed.updateInstructions,\n instructionFiles: parsed.instructionFiles,\n withGithubAction: parsed.withGithubAction,\n force: parsed.force,\n connect: parsed.connect,\n quiet: parsed.printJson || parsed.quiet,\n log: parsed.printJson || parsed.quiet ? undefined : stdoutLog,\n isInteractive: options.isInteractive,\n promptSkills: options.promptSkills,\n promptClients: options.promptClients,\n promptScope: options.promptScope,\n promptUpdateInstructions: options.promptUpdateInstructions,\n promptGithubAction: options.promptGithubAction,\n promptPlanMode: options.promptPlanMode,\n promptPlanMcpUrl: options.promptPlanMcpUrl,\n telemetry,\n mcp: parsed.mcp,\n planMode: parsed.planMode,\n mcpUrl: parsed.mcpUrl,\n });\n\n telemetry.track(\"skills_cli completed\", {\n skills: result.skills.join(\",\"),\n clients: result.clients.join(\",\"),\n scope: result.scope,\n dryRun: result.dryRun,\n durationMs: Date.now() - startedAt,\n });\n\n if (parsed.printJson) {\n process.stdout.write(`${JSON.stringify(result, null, 2)}\\n`);\n return;\n }\n\n if (parsed.quiet) return;\n\n await printInstallResult(result, {\n baseDir: parsed.baseDir ?? options.baseDir ?? process.cwd(),\n dryRun: parsed.dryRun,\n });\n } catch (error) {\n telemetry.track(\"skills_cli failed\", {\n command: parsed.command,\n error: error instanceof Error ? error.message : String(error),\n durationMs: Date.now() - startedAt,\n });\n throw error;\n } finally {\n await telemetry.flush();\n }\n}\n\nfunction readCliVersion(): string {\n try {\n const here = path.dirname(fileURLToPath(import.meta.url));\n // dist/index.js → ../package.json\n const pkg = JSON.parse(\n fs.readFileSync(path.resolve(here, \"../package.json\"), \"utf8\"),\n ) as { version?: unknown };\n return typeof pkg.version === \"string\" ? pkg.version : \"unknown\";\n } catch {\n return \"unknown\";\n }\n}\n\nfunction cliInteractive(\n parsed: ParsedArgs,\n options: Pick<InstallSkillsOptions, \"isInteractive\">,\n): boolean {\n if (parsed.yes) return false;\n if (options.isInteractive) return options.isInteractive();\n if (process.env.CI === \"true\") return false;\n return Boolean(process.stdin.isTTY && process.stdout.isTTY);\n}\n\nexport async function installSkills(\n options: InstallSkillsOptions,\n): Promise<InstallSkillsResult> {\n const baseDir = path.resolve(options.baseDir ?? process.cwd());\n const log = options.log ?? (() => {});\n const sourceInput = options.source ?? DEFAULT_SKILLS_SOURCE;\n const source = await materializeSource(sourceInput);\n try {\n const entries = discoverSkills(source.root);\n if (entries.length === 0) {\n throw new Error(\n `No skills found in ${sourceInput}. Expected skills/*/SKILL.md.`,\n );\n }\n\n const preselected = (options.skillNames ?? []).length > 0;\n const selected = await resolveSelectedSkills(entries, options);\n options.telemetry?.track(\"skills_cli skills selected\", {\n selected: selected.map((skill) => skill.name).join(\",\"),\n selectedCount: selected.length,\n selectedAll: selected.length === entries.length,\n preselected,\n });\n\n const skillNames = selected.map((skill) => skill.name);\n const planMode = await resolvePlanModeForSkills(skillNames, options);\n const planMcpOverride = await resolvePlanMcpOverrideForMode(\n planMode,\n options,\n );\n\n const clients = await resolveSelectedClients(options);\n options.telemetry?.track(\"skills_cli clients selected\", {\n clients: clients.join(\",\"),\n clientCount: clients.length,\n });\n\n const scope = await resolveSelectedScope(options);\n options.telemetry?.track(\"skills_cli scope selected\", { scope });\n\n const instructionBlocks = managedInstructionBlocksForSkills(skillNames);\n const shouldUpdateInstructions = await shouldUpdateManagedInstructions(\n instructionBlocks,\n options,\n );\n const shouldWriteGithubAction = await shouldWritePrVisualRecapWorkflow(\n selected.some((skill) => skill.name === \"visual-recap\"),\n options,\n baseDir,\n );\n const mcpApps =\n options.mcp === false || planMode === \"local-files\"\n ? []\n : mcpAppsForSkills(skillNames, planMcpOverride);\n const skillFileClients = clients.filter(supportsSkillFiles);\n if (skillFileClients.length === 0 && mcpApps.length === 0) {\n throw new Error(\n \"Claude Cowork is MCP-only for Agent Native skills. Choose Codex, Claude Code, Pi, Cursor, OpenCode, or GitHub Copilot for local skill files, or install an app-backed skill with MCP enabled.\",\n );\n }\n\n const progress = await createInstallProgress(\n options,\n 1 +\n (shouldUpdateInstructions ? 1 : 0) +\n (shouldWriteGithubAction ? 1 : 0) +\n mcpApps.length,\n );\n\n const written: string[] = [];\n let instructionFiles: string[] = [];\n let githubActionPath: string | undefined;\n const mcpServers: InstalledMcpServer[] = [];\n\n try {\n progress?.start(\"Installing skill files...\");\n for (const root of unique(\n skillFileClients.map((client) =>\n installRootForClient(client, scope, baseDir),\n ),\n )) {\n for (const skill of selected) {\n const destination = path.join(root, skill.name);\n written.push(destination);\n if (!options.dryRun) {\n fs.rmSync(destination, { recursive: true, force: true });\n fs.mkdirSync(path.dirname(destination), { recursive: true });\n fs.cpSync(skill.dir, destination, { recursive: true });\n }\n }\n }\n progress?.advance(\"Skill files installed\");\n\n options.telemetry?.track(\"skills_cli install completed\", {\n skills: skillNames.join(\",\"),\n clients: clients.join(\",\"),\n scope,\n writtenCount: written.length,\n dryRun: Boolean(options.dryRun),\n });\n\n if (shouldUpdateInstructions) {\n progress?.message(\"Updating managed instructions...\");\n instructionFiles = writeManagedInstructions(\n instructionBlocks,\n baseDir,\n skillFileClients,\n scope,\n options,\n );\n progress?.advance(\"Managed instructions updated\");\n if (instructionFiles.length) {\n options.telemetry?.track(\"skills_cli instructions updated\", {\n fileCount: instructionFiles.length,\n });\n }\n }\n\n if (shouldWriteGithubAction) {\n progress?.message(\"Writing PR Visual Recap workflow...\");\n githubActionPath = writePrVisualRecapWorkflow(baseDir, options);\n progress?.advance(\"PR Visual Recap workflow ready\");\n if (githubActionPath) {\n options.telemetry?.track(\"skills_cli github action added\");\n }\n }\n\n // Register the hosted MCP server for app-backed skills (visual-plan /\n // visual-recap → Agent-Native Plan) so the agent can actually call them,\n // not just read the SKILL.md. On by default; `--no-mcp` installs the\n // skill files only. One registration per app, so visual-plan +\n // visual-recap share a single \"plan\" server.\n if (mcpApps.length > 0) {\n const mcpClients: ClientId[] = clients\n .map(skillClientToMcpClient)\n .filter((client): client is ClientId => Boolean(client));\n if (mcpClients.length === 0) {\n throw new Error(\n \"MCP setup supports Claude Code, Codex, Cursor, OpenCode, GitHub Copilot / VS Code, or Claude Cowork. Use --mode local-files or --no-mcp for Pi.\",\n );\n }\n for (const app of mcpApps) {\n progress?.message(`Registering ${app.displayName} MCP server...`);\n if (!options.dryRun) {\n const registration = await registerMcpServer({\n descriptor: {\n serverName: app.serverName,\n mcpUrl: app.mcpUrl,\n aliases: app.aliases,\n authMode: app.authMode,\n hostedUrl: app.hostedUrl,\n },\n clients: mcpClients,\n scope,\n baseDir,\n interactive: options.connect !== false && isInteractive(options),\n log,\n deviceFlowTimeoutMs: options.deviceFlowTimeoutMs,\n });\n mcpServers.push({\n serverName: app.serverName,\n mcpUrl: app.mcpUrl,\n clients,\n registeredClients: unique(\n registration.written.map(\n (entry) => entry.client as SkillClient,\n ),\n ),\n files: [\n ...new Set(registration.written.map((entry) => entry.file)),\n ],\n authenticated: registration.authenticated,\n guidance: registration.guidance,\n });\n options.telemetry?.track(\"skills_cli mcp registered\", {\n serverName: app.serverName,\n clients: clients.join(\",\"),\n authenticated: registration.authenticated,\n });\n } else {\n mcpServers.push({\n serverName: app.serverName,\n mcpUrl: app.mcpUrl,\n clients,\n registeredClients: clients,\n files: [],\n authenticated: false,\n guidance: [],\n });\n }\n progress?.advance(`${app.displayName} MCP server ready`);\n }\n }\n progress?.stop(\"Installation complete\");\n } catch (err) {\n progress?.error(\"Installation failed\");\n throw err;\n }\n\n return {\n source: source.root,\n skills: skillNames,\n clients,\n scope,\n written,\n instructionFiles,\n githubActionPath,\n mcpServers,\n planMode,\n dryRun: Boolean(options.dryRun),\n };\n } finally {\n source.cleanup?.();\n }\n}\n\nfunction defaultArgs(command: ParsedArgs[\"command\"]): ParsedArgs {\n return {\n command,\n copySource: false,\n skillNames: [],\n clients: [],\n scope: \"user\",\n scopeExplicit: false,\n yes: false,\n dryRun: false,\n printJson: false,\n instructionFiles: [],\n withGithubAction: false,\n force: false,\n connect: true,\n mcp: true,\n quiet: false,\n };\n}\n\nfunction selectedPlanApp(skillNames: string[]): BuiltInAppMcp | undefined {\n return skillNames\n .map((skillName) => resolveAppForSkill(skillName))\n .find((app): app is BuiltInAppMcp => app?.appId === \"visual-plans\");\n}\n\nasync function resolvePlanModeForSkills(\n skillNames: string[],\n options: InstallSkillsOptions,\n): Promise<PlanMode | undefined> {\n const includesPlans = Boolean(selectedPlanApp(skillNames));\n if (options.planMode && !includesPlans) {\n throw new Error(\"--mode only applies to visual-plan / visual-recap.\");\n }\n if (options.mcpUrl && !includesPlans) {\n throw new Error(\"--mcp-url only applies to visual-plan / visual-recap.\");\n }\n if (!includesPlans) return undefined;\n\n if (options.mcpUrl && !options.planMode) return \"self-hosted\";\n if (options.planMode) return options.planMode;\n return \"hosted\";\n}\n\nfunction resolvePlanMcpUrlOverride(input: string): {\n hostedUrl: string;\n mcpUrl: string;\n} {\n let parsed: URL;\n try {\n parsed = new URL(input);\n } catch {\n throw new Error(`--mcp-url must be a valid URL (got \"${input}\").`);\n }\n if (parsed.protocol !== \"http:\" && parsed.protocol !== \"https:\") {\n throw new Error(\"--mcp-url must use http:// or https://.\");\n }\n const mcpSuffix = \"/_agent-native/mcp\";\n const trimmedPath = parsed.pathname.replace(/\\/+$/, \"\");\n const appPath = trimmedPath.endsWith(mcpSuffix)\n ? trimmedPath.slice(0, -mcpSuffix.length)\n : trimmedPath;\n const mcpPath = trimmedPath.endsWith(mcpSuffix)\n ? trimmedPath\n : `${trimmedPath || \"\"}${mcpSuffix}`;\n return {\n hostedUrl: `${parsed.origin}${appPath}`,\n mcpUrl: `${parsed.origin}${mcpPath}`,\n };\n}\n\nasync function resolvePlanMcpOverrideForMode(\n planMode: PlanMode | undefined,\n options: InstallSkillsOptions,\n): Promise<{ hostedUrl: string; mcpUrl: string } | undefined> {\n if (planMode === \"local-files\" && options.mcpUrl) {\n throw new Error(\"--mode local-files cannot be combined with --mcp-url.\");\n }\n if (planMode !== \"self-hosted\") return undefined;\n if (!options.mcpUrl) {\n throw new Error(\n \"--mode self-hosted requires --mcp-url <url> in direct mode.\",\n );\n }\n return resolvePlanMcpUrlOverride(options.mcpUrl);\n}\n\nfunction parsePlanMode(value: string): PlanMode {\n if (value === \"hosted\" || value === \"local-files\" || value === \"self-hosted\")\n return value;\n throw new Error('--mode must be \"hosted\", \"local-files\", or \"self-hosted\".');\n}\n\nfunction parseScope(value: string): SkillScope {\n if (value === \"user\" || value === \"project\") return value;\n throw new Error(\"--scope must be user or project.\");\n}\n\nfunction normalizeClients(value: string): SkillClient[] {\n return value.split(\",\").flatMap((raw) => {\n const client = raw.trim().toLowerCase();\n if (!client) return [];\n if (client === \"all\") return CLIENTS;\n if (client === \"codex\") return [\"codex\" as const];\n if (client === \"cowork\" || client === \"claude-cowork\") {\n return [\"cowork\" as const];\n }\n if (client === \"pi\") return [\"pi\" as const];\n if (client === \"cursor\") return [\"cursor\" as const];\n if (client === \"opencode\" || client === \"open-code\") {\n return [\"opencode\" as const];\n }\n if (\n client === \"github-copilot\" ||\n client === \"copilot\" ||\n client === \"vscode\" ||\n client === \"vs-code\"\n ) {\n return [\"github-copilot\" as const];\n }\n if (\n client === \"claude\" ||\n client === \"claude-code\" ||\n client === \"claude-code-cli\"\n ) {\n return [\"claude-code\" as const];\n }\n throw new Error(\n `Unsupported client \"${raw}\". Use codex, claude-code, cowork, pi, cursor, opencode, github-copilot, or all.`,\n );\n });\n}\n\nfunction skillClientToMcpClient(client: SkillClient): ClientId | null {\n if (client === \"pi\") return null;\n if (client === \"claude-code\") return \"claude-code\";\n return client;\n}\n\nfunction supportsSkillFiles(client: SkillClient): boolean {\n return client !== \"cowork\";\n}\n\nfunction normalizeSkillName(value: string): string {\n const normalized = value.trim().toLowerCase();\n if (!/^[a-z0-9][a-z0-9._-]*$/.test(normalized)) {\n throw new Error(`Invalid skill name \"${value}\".`);\n }\n return normalized;\n}\n\nfunction unique<T>(values: T[]): T[] {\n return [...new Set(values)];\n}\n\nfunction plural(count: number, singular: string, pluralForm = `${singular}s`) {\n return `${count} ${count === 1 ? singular : pluralForm}`;\n}\n\nfunction shortenPathForOutput(file: string, baseDir: string): string {\n const resolved = path.resolve(file);\n const home = process.env.HOME || os.homedir();\n if (resolved === home || resolved.startsWith(`${home}${path.sep}`)) {\n return `~${resolved.slice(home.length)}`;\n }\n const base = path.resolve(baseDir);\n const relative = path.relative(base, resolved);\n if (relative && !relative.startsWith(\"..\") && !path.isAbsolute(relative)) {\n return `.${path.sep}${relative}`;\n }\n return file;\n}\n\nfunction summarizePaths(files: string[], baseDir: string, max = 4): string {\n const shortened = unique(files).map((file) =>\n shortenPathForOutput(file, baseDir),\n );\n if (shortened.length <= max) return shortened.join(\", \");\n return `${shortened.slice(0, max).join(\", \")} +${shortened.length - max} more`;\n}\n\nasync function createInstallProgress(\n options: InstallSkillsOptions,\n max: number,\n) {\n if (options.quiet || !isInteractive(options) || max <= 0) return null;\n const clack = await import(\"@clack/prompts\");\n const progress = clack.progress({ max, indicator: \"timer\" });\n let active = false;\n return {\n start(message: string) {\n active = true;\n progress.start(message);\n },\n message(message: string) {\n if (active) progress.message(message);\n },\n advance(message: string) {\n if (active) progress.advance(1, message);\n },\n stop(message: string) {\n if (!active) return;\n progress.stop(message);\n active = false;\n },\n error(message: string) {\n if (!active) return;\n progress.error(message);\n active = false;\n },\n };\n}\n\nfunction mcpAppsForSkills(\n skillNames: string[],\n planOverride?: { hostedUrl: string; mcpUrl: string },\n): BuiltInAppMcp[] {\n const apps: BuiltInAppMcp[] = [];\n const seen = new Set<string>();\n for (const skillName of skillNames) {\n const app = resolveAppForSkill(skillName);\n if (!app || seen.has(app.appId)) continue;\n seen.add(app.appId);\n if (app.appId === \"visual-plans\" && planOverride) {\n apps.push({\n ...app,\n hostedUrl: planOverride.hostedUrl,\n mcpUrl: planOverride.mcpUrl,\n });\n } else {\n apps.push(app);\n }\n }\n return apps;\n}\n\nfunction mcpStatus(server: InstalledMcpServer, dryRun: boolean): string {\n if (dryRun) return `would register for ${server.clients.join(\", \")}`;\n\n const registered = server.registeredClients;\n const pending = server.clients.filter(\n (client) => !registered.includes(client),\n );\n const parts: string[] = [];\n if (registered.length > 0) {\n parts.push(\n `${server.authenticated ? \"registered and authenticated\" : \"registered\"} for ${registered.join(\", \")}`,\n );\n }\n if (pending.length > 0) {\n parts.push(`authentication pending for ${pending.join(\", \")}`);\n }\n return (\n parts.join(\"; \") ||\n `authentication pending for ${server.clients.join(\", \")}`\n );\n}\n\nasync function printInstallResult(\n result: InstallSkillsResult,\n options: { baseDir: string; dryRun: boolean },\n): Promise<void> {\n const clack = await import(\"@clack/prompts\");\n const verb = options.dryRun ? \"Would install\" : \"Installed\";\n const summary = [\n `Skills ${result.skills.join(\", \") || \"none\"}`,\n `Agents ${result.clients.join(\", \") || \"none\"}`,\n `Scope ${result.scope}`,\n result.planMode ? `Plan mode ${result.planMode}` : \"\",\n result.written.length\n ? `Skill folders ${plural(result.written.length, \"folder\")} (${summarizePaths(\n result.written,\n options.baseDir,\n )})`\n : \"\",\n ].filter(Boolean);\n\n clack.note(summary.join(\"\\n\"), verb);\n\n if (result.instructionFiles.length) {\n clack.note(\n summarizePaths(result.instructionFiles, options.baseDir),\n \"Managed instructions\",\n );\n }\n\n if (result.githubActionPath) {\n clack.note(\n shortenPathForOutput(result.githubActionPath, options.baseDir),\n \"PR Visual Recap workflow\",\n );\n }\n\n if (result.mcpServers.length) {\n const mcpLines = result.mcpServers.map((server) => {\n const status = mcpStatus(server, options.dryRun);\n const files = server.files.length\n ? ` (${summarizePaths(server.files, options.baseDir, 2)})`\n : \"\";\n return `${server.serverName}: ${status}${files}`;\n });\n clack.note(mcpLines.join(\"\\n\"), \"MCP\");\n\n const guidance = result.mcpServers.flatMap((server) => server.guidance);\n if (guidance.length) {\n clack.note(guidance.join(\"\\n\"), \"Next steps\");\n }\n }\n\n if (result.planMode === \"local-files\") {\n clack.note(\n [\n \"No sharing, all local.\",\n \"Run: npx @agent-native/core@latest plan blocks --out plan-blocks.md\",\n \"Preview: npx @agent-native/core@latest plan local preview --dir plans/<slug> --open\",\n ].join(\"\\n\"),\n \"Local Plan files\",\n );\n }\n\n if (!options.dryRun) {\n clack.note(\"Restart or reload selected agent clients if needed.\", \"Reload\");\n }\n\n clack.outro(`${options.dryRun ? \"Dry run complete\" : \"All set\"} ✅`);\n}\n\nasync function resolveSelectedSkills(\n entries: SkillEntry[],\n options: InstallSkillsOptions,\n): Promise<SkillEntry[]> {\n const byName = new Map(entries.map((entry) => [entry.name, entry]));\n const requested = unique((options.skillNames ?? []).map(normalizeSkillName));\n if (requested.length > 0) {\n const missing = requested.filter((name) => !byName.has(name));\n if (missing.length > 0) {\n throw new Error(\n `Unknown skill${missing.length === 1 ? \"\" : \"s\"}: ${missing.join(\", \")}. Available: ${entries\n .map((entry) => entry.name)\n .join(\", \")}.`,\n );\n }\n return requested.map((name) => byName.get(name)!);\n }\n\n return entries;\n}\n\nasync function resolveSelectedScope(\n options: InstallSkillsOptions,\n): Promise<SkillScope> {\n if (options.scope) return options.scope;\n return \"user\";\n}\n\nasync function resolveSelectedClients(\n options: InstallSkillsOptions,\n): Promise<SkillClient[]> {\n const requested = unique(options.clients ?? []);\n if (requested.length > 0) return requested;\n return CLIENTS;\n}\n\nfunction isInteractive(\n options: Pick<InstallSkillsOptions, \"isInteractive\">,\n): boolean {\n if (options.isInteractive) return options.isInteractive();\n if (process.env.CI === \"true\") return false;\n return Boolean(process.stdin.isTTY && process.stdout.isTTY);\n}\n\nfunction installRootForClient(\n client: SkillClient,\n scope: SkillScope,\n baseDir: string,\n): string {\n const home = process.env.HOME || os.homedir();\n if (scope === \"project\") {\n if (client !== \"claude-code\") {\n return path.join(baseDir, \".agents\", \"skills\");\n }\n return path.join(baseDir, \".claude\", \"skills\");\n }\n if (client === \"codex\") {\n return process.env.CODEX_HOME\n ? path.join(process.env.CODEX_HOME, \"skills\")\n : path.join(home, \".codex\", \"skills\");\n }\n if (client === \"pi\") {\n return path.join(home, \".agents\", \"skills\");\n }\n if (\n client === \"cursor\" ||\n client === \"opencode\" ||\n client === \"github-copilot\"\n ) {\n return path.join(home, \".agents\", \"skills\");\n }\n return path.join(home, \".claude\", \"skills\");\n}\n\nfunction discoverSkills(root: string): SkillEntry[] {\n const skillsRoot = resolveSkillsRoot(root);\n const directSkill = path.join(skillsRoot, \"SKILL.md\");\n if (fs.existsSync(directSkill)) {\n const entry = skillEntry(skillsRoot);\n return entry ? [entry] : [];\n }\n const entries = fs\n .readdirSync(skillsRoot, { withFileTypes: true })\n .filter((entry) => entry.isDirectory() && !entry.name.startsWith(\".\"))\n .map((entry) => skillEntry(path.join(skillsRoot, entry.name)))\n .filter((entry): entry is SkillEntry => Boolean(entry));\n return entries.sort((a, b) => a.name.localeCompare(b.name));\n}\n\nfunction resolveSkillsRoot(root: string): string {\n for (const manifestPath of [\n path.join(root, \".codex-plugin\", \"plugin.json\"),\n path.join(root, \".claude-plugin\", \"plugin.json\"),\n ]) {\n if (!fs.existsSync(manifestPath)) continue;\n try {\n const manifest = JSON.parse(fs.readFileSync(manifestPath, \"utf-8\")) as {\n skills?: unknown;\n };\n if (typeof manifest.skills === \"string\") {\n const resolved = path.resolve(root, manifest.skills);\n if (fs.existsSync(resolved)) return resolved;\n }\n } catch {}\n }\n const conventional = path.join(root, \"skills\");\n if (fs.existsSync(conventional)) return conventional;\n return root;\n}\n\nfunction skillEntry(dir: string): SkillEntry | null {\n const skillFile = path.join(dir, \"SKILL.md\");\n if (!fs.existsSync(skillFile)) return null;\n const body = fs.readFileSync(skillFile, \"utf-8\");\n const frontmatter = body.match(/^---\\n([\\s\\S]*?)\\n---/);\n const name = frontmatterField(frontmatter?.[1], \"name\") ?? path.basename(dir);\n const description = frontmatterField(frontmatter?.[1], \"description\");\n return { name: normalizeSkillName(name), dir, description };\n}\n\nfunction frontmatterField(\n frontmatter: string | undefined,\n field: string,\n): string | undefined {\n if (!frontmatter) return undefined;\n const lines = frontmatter.split(/\\r?\\n/);\n for (let i = 0; i < lines.length; i += 1) {\n const match = lines[i].match(new RegExp(`^${field}:\\\\s*(.*)$`));\n if (!match) continue;\n const raw = match[1].trim();\n if (raw === \">-\" || raw === \">\" || raw === \"|-\" || raw === \"|\") {\n const block: string[] = [];\n for (let j = i + 1; j < lines.length; j += 1) {\n const line = lines[j];\n if (line.trim() && !/^\\s/.test(line)) break;\n block.push(line.replace(/^\\s+/, \"\"));\n }\n const value = raw.startsWith(\"|\") ? block.join(\"\\n\") : block.join(\" \");\n return value.replace(/\\s+/g, \" \").trim() || undefined;\n }\n return raw.replace(/^[\"']|[\"']$/g, \"\").trim() || undefined;\n }\n return undefined;\n}\n\nasync function materializeSource(input: string): Promise<{\n root: string;\n cleanup?: () => void;\n}> {\n const local = path.resolve(input);\n if (fs.existsSync(local)) return { root: local };\n\n const parsed = parseGitHubSource(input);\n if (!parsed) {\n throw new Error(\n `Skill source not found: ${input}. Use a local path, GitHub owner/repo, or GitHub URL.`,\n );\n }\n\n const tmpRoot = fs.mkdtempSync(\n path.join(os.tmpdir(), \"agent-native-skills-\"),\n );\n const archive = path.join(tmpRoot, \"source.tgz\");\n const ref = parsed.ref ?? \"main\";\n const url = `https://codeload.github.com/${parsed.owner}/${parsed.repo}/tar.gz/${encodeURIComponent(ref)}`;\n const response = await fetch(url, {\n headers: { \"user-agent\": \"@agent-native/skills\" },\n });\n if (!response.ok) {\n fs.rmSync(tmpRoot, { recursive: true, force: true });\n throw new Error(\n `Could not download ${parsed.owner}/${parsed.repo}@${ref}: HTTP ${response.status}.`,\n );\n }\n fs.writeFileSync(archive, Buffer.from(await response.arrayBuffer()));\n\n const extractDir = path.join(tmpRoot, \"extract\");\n fs.mkdirSync(extractDir, { recursive: true });\n const extracted = spawnSync(\"tar\", [\"-xzf\", archive, \"-C\", extractDir], {\n stdio: \"pipe\",\n encoding: \"utf-8\",\n });\n if (extracted.status !== 0) {\n fs.rmSync(tmpRoot, { recursive: true, force: true });\n throw new Error(\n `Could not extract ${input}: ${extracted.stderr || extracted.stdout}`,\n );\n }\n const [first] = fs\n .readdirSync(extractDir, { withFileTypes: true })\n .filter((entry) => entry.isDirectory());\n if (!first) {\n fs.rmSync(tmpRoot, { recursive: true, force: true });\n throw new Error(\n `Downloaded archive for ${input} did not contain a repo directory.`,\n );\n }\n return {\n root: path.join(extractDir, first.name),\n cleanup: () => fs.rmSync(tmpRoot, { recursive: true, force: true }),\n };\n}\n\nfunction parseGitHubSource(\n input: string,\n): { owner: string; repo: string; ref?: string } | null {\n const shorthand = input.match(\n /^([A-Za-z0-9_.-]+)\\/([A-Za-z0-9_.-]+)(?:#(.+))?$/,\n );\n if (shorthand) {\n return {\n owner: shorthand[1],\n repo: shorthand[2].replace(/\\.git$/, \"\"),\n ref: shorthand[3],\n };\n }\n\n let url: URL;\n try {\n url = new URL(input);\n } catch {\n return null;\n }\n if (url.hostname !== \"github.com\") return null;\n const parts = url.pathname.split(\"/\").filter(Boolean);\n if (parts.length < 2) return null;\n const treeIndex = parts.indexOf(\"tree\");\n return {\n owner: parts[0],\n repo: parts[1].replace(/\\.git$/, \"\"),\n ref:\n treeIndex >= 0 && parts[treeIndex + 1]\n ? parts.slice(treeIndex + 1).join(\"/\")\n : url.hash.slice(1) || undefined,\n };\n}\n\nfunction instructionContentForSkill(skillName: string): string | null {\n if (skillName === \"quick-recap\") {\n return \"When writing final response status indicators, use the /quick-recap skill always.\";\n }\n if (skillName === \"efficient-fable\") {\n return \"When operating as Claude Fable, use the /efficient-fable skill always.\";\n }\n if (skillName === \"efficient-frontier\") {\n return \"When using a high-cost frontier model for codebase-heavy work, use the /efficient-frontier skill always.\";\n }\n if (skillName === \"stay-within-limits\") {\n return \"When long-running or parallel work needs usage-limit checks, use the /stay-within-limits skill always.\";\n }\n if (skillName === \"visual-plan\") {\n return \"When work needs an interactive visual plan before implementation, use the /visual-plan skill always.\";\n }\n if (skillName === \"visual-recap\") {\n return \"When a PR, branch, commit, or diff needs an interactive visual recap, use the /visual-recap skill always.\";\n }\n return null;\n}\n\nfunction managedInstructionBlocksForSkills(skillNames: string[]): string[] {\n return skillNames\n .map((name) => instructionContentForSkill(name))\n .filter((block): block is string => Boolean(block));\n}\n\nasync function shouldUpdateManagedInstructions(\n blocks: string[],\n options: InstallSkillsOptions,\n): Promise<boolean> {\n if (blocks.length === 0) return false;\n let shouldUpdate = options.updateInstructions;\n if (shouldUpdate !== undefined) return shouldUpdate;\n if (options.yes) return true;\n return false;\n}\n\nfunction writeManagedInstructions(\n blocks: string[],\n baseDir: string,\n clients: SkillClient[],\n scope: SkillScope,\n options: InstallSkillsOptions,\n): string[] {\n if (blocks.length === 0) return [];\n const files = resolveInstructionFiles(\n baseDir,\n options.instructionFiles,\n clients,\n scope,\n );\n const content = `${MANAGED_INSTRUCTIONS_START}\n${blocks.join(\"\\n\")}\n${MANAGED_INSTRUCTIONS_END}`;\n for (const file of files) {\n if (options.dryRun) continue;\n upsertManagedBlock(file, content);\n }\n return files;\n}\n\nasync function maybeUpdateInstructions(\n skillNames: string[],\n baseDir: string,\n options: InstallSkillsOptions,\n): Promise<string[]> {\n const blocks = managedInstructionBlocksForSkills(skillNames);\n const clients = options.clients?.length ? options.clients : CLIENTS;\n const scope = options.scope ?? \"user\";\n if (!(await shouldUpdateManagedInstructions(blocks, options))) return [];\n return writeManagedInstructions(blocks, baseDir, clients, scope, options);\n}\n\nfunction resolveInstructionFiles(\n baseDir: string,\n explicit: string[] | undefined,\n clients: SkillClient[],\n scope: SkillScope,\n): string[] {\n if (explicit && explicit.length > 0) {\n return explicit.map((file) => path.resolve(baseDir, file));\n }\n const instructionClients = clients.filter(supportsSkillFiles);\n if (instructionClients.length === 0) return [];\n if (scope === \"user\") {\n const home = process.env.HOME || os.homedir();\n const files: string[] = [];\n if (instructionClients.includes(\"codex\")) {\n const codexHome = process.env.CODEX_HOME || path.join(home, \".codex\");\n files.push(path.join(codexHome, \"AGENTS.md\"));\n }\n if (instructionClients.includes(\"claude-code\")) {\n files.push(path.join(home, \".claude\", \"CLAUDE.md\"));\n }\n return unique(files);\n }\n const candidates = [\"AGENTS.md\", \"CLAUDE.md\"].map((file) =>\n path.join(baseDir, file),\n );\n const existing = candidates.filter((file) => fs.existsSync(file));\n return existing.length > 0 ? existing : [path.join(baseDir, \"AGENTS.md\")];\n}\n\nfunction upsertManagedBlock(file: string, block: string): void {\n fs.mkdirSync(path.dirname(file), { recursive: true });\n const existing = fs.existsSync(file) ? fs.readFileSync(file, \"utf-8\") : \"\";\n const pattern = new RegExp(\n `${escapeRegExp(MANAGED_INSTRUCTIONS_START)}[\\\\s\\\\S]*?${escapeRegExp(MANAGED_INSTRUCTIONS_END)}`,\n );\n const next = pattern.test(existing)\n ? existing.replace(pattern, block)\n : `${existing.trimEnd()}${existing.trim() ? \"\\n\\n\" : \"\"}${block}\\n`;\n fs.writeFileSync(file, next, \"utf-8\");\n}\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nconst PR_VISUAL_RECAP_DOCS_URL =\n \"https://www.agent-native.com/docs/pr-visual-recap\";\n\nfunction prVisualRecapWorkflowPath(baseDir: string): string {\n return path.join(baseDir, \".github\", \"workflows\", \"pr-visual-recap.yml\");\n}\n\nfunction prVisualRecapSetupCommand(): string {\n return \"npx @agent-native/core@latest recap setup\";\n}\n\nasync function promptForGithubAction(\n context: GithubActionPromptContext,\n): Promise<boolean | null> {\n const clack = await import(\"@clack/prompts\");\n const result = await clack.confirm({\n message:\n \"Optional: add automatic PR Visual Recaps? (GitHub Action)\\n\" +\n \" Posts a human-friendly recap on every pull request.\\n\" +\n ` Learn more: ${context.docsUrl}\\n` +\n ` Writes ${context.workflowPath}; ${context.setupCommand} finishes the GitHub secrets.`,\n initialValue: false,\n });\n if (clack.isCancel(result)) {\n clack.cancel(\"Skipped PR Visual Recap workflow.\");\n return null;\n }\n return Boolean(result);\n}\n\nasync function shouldWritePrVisualRecapWorkflow(\n hasVisualRecap: boolean,\n options: InstallSkillsOptions,\n baseDir: string,\n): Promise<boolean> {\n if (!hasVisualRecap) return false;\n if (options.withGithubAction) return true;\n if (fs.existsSync(prVisualRecapWorkflowPath(baseDir))) return false;\n if (options.yes || !isInteractive(options)) return false;\n const prompt = options.promptGithubAction ?? promptForGithubAction;\n const choice = await prompt({\n workflowPath: path.join(\".github\", \"workflows\", \"pr-visual-recap.yml\"),\n setupCommand: prVisualRecapSetupCommand(),\n docsUrl: PR_VISUAL_RECAP_DOCS_URL,\n });\n return choice === true;\n}\n\nconst PR_VISUAL_RECAP_REUSABLE_WORKFLOW = `name: PR Visual Recap\n\non:\n pull_request:\n types: [opened, synchronize, reopened, ready_for_review]\n\npermissions:\n contents: read\n\nconcurrency:\n group: pr-visual-recap-\\${{ github.event.pull_request.number }}\n cancel-in-progress: true\n\njobs:\n visual-recap:\n permissions:\n checks: write\n contents: read\n issues: write\n pull-requests: read\n uses: BuilderIO/agent-native/.github/workflows/pr-visual-recap-reusable.yml@main\n with:\n skill-source: repo\n secrets:\n PLAN_RECAP_TOKEN: \\${{ secrets.PLAN_RECAP_TOKEN }}\n ANTHROPIC_API_KEY: \\${{ secrets.ANTHROPIC_API_KEY }}\n OPENAI_API_KEY: \\${{ secrets.OPENAI_API_KEY }}\n PLAN_RECAP_APP_URL: \\${{ secrets.PLAN_RECAP_APP_URL }}\n`;\n\nfunction writePrVisualRecapWorkflow(\n baseDir: string,\n options: InstallSkillsOptions,\n): string {\n const file = path.join(\n baseDir,\n \".github\",\n \"workflows\",\n \"pr-visual-recap.yml\",\n );\n if (options.dryRun) return file;\n if (fs.existsSync(file)) {\n const current = fs.readFileSync(file, \"utf-8\");\n if (current === PR_VISUAL_RECAP_REUSABLE_WORKFLOW) return file;\n if (!options.force) {\n throw new Error(\n `${file} already exists and differs. Re-run with --force to overwrite it.`,\n );\n }\n }\n fs.mkdirSync(path.dirname(file), { recursive: true });\n fs.writeFileSync(file, PR_VISUAL_RECAP_REUSABLE_WORKFLOW, \"utf-8\");\n return file;\n}\n\nexport function createInstallId(): string {\n return randomUUID();\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-native/skills",
3
- "version": "0.2.12",
3
+ "version": "0.2.14",
4
4
  "type": "module",
5
5
  "description": "Install BuilderIO skills for coding agents.",
6
6
  "license": "MIT",
@@ -37,7 +37,7 @@
37
37
  },
38
38
  "dependencies": {
39
39
  "@clack/prompts": "^1.5.1",
40
- "@agent-native/core": "0.52.0"
40
+ "@agent-native/core": "0.54.0"
41
41
  },
42
42
  "scripts": {
43
43
  "build": "tsc",