@braid-cloud/cli 0.1.13 → 0.1.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/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../node_modules/tsup/assets/esm_shims.js","../src/lib/config.ts","../src/lib/api.ts","../src/lib/tui.ts","../src/lib/scope-args.ts","../src/lib/scope-config.ts","../src/commands/scope.ts","../src/index.ts","../src/commands/agents.ts","../src/lib/agent-writer.ts","../src/lib/agent-adapters.ts","../src/lib/agents.ts","../src/commands/auth.ts","../src/lib/device-auth.ts","../src/commands/discover.ts","../src/commands/install.ts","../src/lib/metadata.ts","../src/lib/rule-writer.ts","../src/lib/skill-writer.ts","../src/commands/list.ts","../src/commands/mcp.ts","../src/lib/mcp-config.ts","../src/commands/profiles.ts","../src/commands/projects.ts","../src/commands/references.ts","../src/commands/remove.ts","../src/commands/rules.ts","../src/commands/update.ts","../src/commands/workflows.ts"],"sourcesContent":["// Shim globals in esm bundle\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nconst getFilename = () => fileURLToPath(import.meta.url)\nconst getDirname = () => path.dirname(getFilename())\n\nexport const __dirname = /* @__PURE__ */ getDirname()\nexport const __filename = /* @__PURE__ */ getFilename()\n","import { existsSync } from \"node:fs\";\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { dirname, join, parse } from \"node:path\";\nimport process from \"node:process\";\nimport { Data, Effect, pipe } from \"effect\";\n\nconst CONFIG_DIR = join(homedir(), \".config\", \"braid\");\nconst CONFIG_FILE = join(CONFIG_DIR, \"config.json\");\nconst PROJECT_CONFIG_FILENAME = \"braid.json\";\nconst USER_CONFIG_FILENAME = \"braid.user.json\";\n\ninterface braidSkillsConfig {\n apiKey?: string;\n serverUrl?: string;\n}\n\ninterface SkillsConfig {\n serverUrl?: string;\n}\n\ninterface braidProjectConfig {\n $schema?: string;\n serverUrl?: string;\n org?: string;\n profile?: string;\n orgProjects?: string[];\n personalProjects?: string[];\n ruleIds?: string[];\n excludedRuleIds?: string[];\n resolveOverlays?: boolean;\n includeUserGlobal?: boolean;\n includeOrgGlobal?: boolean;\n skills?: SkillsConfig;\n agents?: string[];\n}\n\ninterface braidUserConfig extends braidProjectConfig {\n token?: string;\n}\n\ninterface MergedConfig {\n token?: string;\n serverUrl: string;\n org?: string;\n profile?: string;\n orgProjects?: string[];\n personalProjects?: string[];\n ruleIds?: string[];\n excludedRuleIds?: string[];\n resolveOverlays?: boolean;\n includeUserGlobal: boolean;\n includeOrgGlobal: boolean;\n agents?: string[];\n}\n\nclass ConfigReadError extends Data.TaggedError(\"ConfigReadError\")<{\n path: string;\n cause: unknown;\n}> {}\n\nclass ConfigWriteError extends Data.TaggedError(\"ConfigWriteError\")<{\n path: string;\n cause: unknown;\n}> {}\n\nconst findConfigFile = (\n filename: string,\n startDir: string = process.cwd()\n): string | undefined => {\n let currentDir = startDir;\n\n while (true) {\n const configPath = join(currentDir, filename);\n if (existsSync(configPath)) {\n return configPath;\n }\n\n const parsed = parse(currentDir);\n if (parsed.root === currentDir) {\n return undefined;\n }\n currentDir = parsed.dir;\n }\n};\n\nconst findProjectConfigFile = (\n startDir: string = process.cwd()\n): string | undefined => findConfigFile(PROJECT_CONFIG_FILENAME, startDir);\n\nconst findUserConfigFile = (\n startDir: string = process.cwd()\n): string | undefined => findConfigFile(USER_CONFIG_FILENAME, startDir);\n\nconst loadProjectConfig = (): Effect.Effect<braidProjectConfig | undefined> =>\n Effect.tryPromise({\n try: async () => {\n const configPath = await findProjectConfigFile();\n if (!configPath) {\n return undefined;\n }\n const content = await readFile(configPath, \"utf-8\");\n return JSON.parse(content) as braidProjectConfig;\n },\n catch: () => undefined,\n }).pipe(Effect.orElseSucceed(() => undefined));\n\nconst loadUserConfig = (): Effect.Effect<braidUserConfig | undefined> =>\n Effect.tryPromise({\n try: async () => {\n const configPath = await findUserConfigFile();\n if (!configPath) {\n return undefined;\n }\n const content = await readFile(configPath, \"utf-8\");\n return JSON.parse(content) as braidUserConfig;\n },\n catch: () => undefined,\n }).pipe(Effect.orElseSucceed(() => undefined));\n\nconst resolveUserConfigWritePath = (startDir: string = process.cwd()): string =>\n findUserConfigFile(startDir) ?? join(startDir, USER_CONFIG_FILENAME);\n\nconst resolveProjectConfigWritePath = (\n startDir: string = process.cwd()\n): string =>\n findProjectConfigFile(startDir) ?? join(startDir, PROJECT_CONFIG_FILENAME);\n\nconst saveUserConfig = (\n config: braidUserConfig,\n startDir: string = process.cwd()\n): Effect.Effect<string, ConfigWriteError> => {\n const targetPath = resolveUserConfigWritePath(startDir);\n\n return pipe(\n Effect.tryPromise({\n try: async () => {\n await mkdir(dirname(targetPath), { recursive: true, mode: 0o700 });\n await writeFile(targetPath, JSON.stringify(config, null, 2), {\n encoding: \"utf-8\",\n mode: 0o600,\n });\n return targetPath;\n },\n catch: (e) => new ConfigWriteError({ path: targetPath, cause: e }),\n })\n );\n};\n\nconst saveProjectConfig = (\n config: braidProjectConfig,\n startDir: string = process.cwd()\n): Effect.Effect<string, ConfigWriteError> => {\n const targetPath = resolveProjectConfigWritePath(startDir);\n\n return pipe(\n Effect.tryPromise({\n try: async () => {\n await mkdir(dirname(targetPath), { recursive: true, mode: 0o700 });\n await writeFile(targetPath, JSON.stringify(config, null, 2), {\n encoding: \"utf-8\",\n mode: 0o600,\n });\n return targetPath;\n },\n catch: (e) => new ConfigWriteError({ path: targetPath, cause: e }),\n })\n );\n};\n\nconst isValidServerUrl = (url: string): boolean => {\n try {\n const parsed = new URL(url);\n return parsed.protocol === \"https:\" || parsed.protocol === \"http:\";\n } catch {\n return false;\n }\n};\n\nconst resolveServerUrlFromConfig = (\n config: braidProjectConfig | braidUserConfig | undefined\n): string | undefined => {\n if (!config) {\n return undefined;\n }\n const url = config.skills?.serverUrl ?? config.serverUrl;\n if (url && !isValidServerUrl(url)) {\n return undefined;\n }\n return url;\n};\n\nconst applyConfigSource = (\n merged: MergedConfig,\n config: braidProjectConfig | braidUserConfig | undefined\n): void => {\n if (!config) {\n return;\n }\n\n const serverUrl = resolveServerUrlFromConfig(config);\n if (serverUrl) {\n merged.serverUrl = serverUrl;\n }\n\n if (config.profile) {\n merged.profile = config.profile;\n }\n if (config.org) {\n merged.org = config.org;\n }\n if (config.orgProjects) {\n merged.orgProjects = config.orgProjects;\n }\n if (config.personalProjects) {\n merged.personalProjects = config.personalProjects;\n }\n if (config.ruleIds) {\n merged.ruleIds = config.ruleIds;\n }\n if (config.excludedRuleIds) {\n merged.excludedRuleIds = config.excludedRuleIds;\n }\n if (config.resolveOverlays !== undefined) {\n merged.resolveOverlays = config.resolveOverlays;\n }\n if (config.includeUserGlobal !== undefined) {\n merged.includeUserGlobal = config.includeUserGlobal;\n }\n if (config.includeOrgGlobal !== undefined) {\n merged.includeOrgGlobal = config.includeOrgGlobal;\n }\n if (config.agents) {\n merged.agents = config.agents;\n }\n\n if (\"token\" in config && config.token) {\n merged.token = config.token;\n }\n};\n\nconst applyEnvOverrides = (merged: MergedConfig): void => {\n if (process.env.BRAID_API_KEY) {\n merged.token = process.env.BRAID_API_KEY;\n }\n const envServerUrl =\n process.env.BRAID_SKILLS_SERVER_URL ?? process.env.BRAID_SERVER_URL;\n if (envServerUrl && isValidServerUrl(envServerUrl)) {\n merged.serverUrl = envServerUrl;\n }\n};\n\nconst createDefaultMergedConfig = (): MergedConfig => ({\n serverUrl: \"https://braid.cloud\",\n includeUserGlobal: true,\n includeOrgGlobal: true,\n});\n\nconst loadMergedConfig = (): Effect.Effect<MergedConfig> =>\n pipe(\n Effect.all({\n projectConfig: loadProjectConfig(),\n userConfig: loadUserConfig(),\n globalConfig: loadConfig().pipe(\n Effect.orElseSucceed(() => ({}) as braidSkillsConfig)\n ),\n }),\n Effect.map(({ projectConfig, userConfig, globalConfig }) => {\n const merged = createDefaultMergedConfig();\n\n applyConfigSource(merged, projectConfig);\n\n applyConfigSource(merged, userConfig);\n\n applyEnvOverrides(merged);\n\n if (!merged.token && globalConfig.apiKey) {\n merged.token = globalConfig.apiKey;\n }\n\n return merged;\n })\n );\n\nconst loadConfig = (): Effect.Effect<\n braidSkillsConfig,\n ConfigReadError | ConfigWriteError\n> =>\n pipe(\n Effect.tryPromise({\n try: () => readFile(CONFIG_FILE, \"utf-8\"),\n catch: (e) => new ConfigReadError({ path: CONFIG_FILE, cause: e }),\n }),\n Effect.flatMap((content) =>\n Effect.try({\n try: () => JSON.parse(content) as braidSkillsConfig,\n catch: () => ({}) as braidSkillsConfig,\n })\n ),\n Effect.orElseSucceed(() => ({}) as braidSkillsConfig)\n );\n\nconst saveConfig = (\n config: braidSkillsConfig\n): Effect.Effect<void, ConfigWriteError> =>\n pipe(\n Effect.tryPromise({\n try: async () => {\n await mkdir(dirname(CONFIG_FILE), { recursive: true, mode: 0o700 });\n await writeFile(CONFIG_FILE, JSON.stringify(config, null, 2), {\n encoding: \"utf-8\",\n mode: 0o600,\n });\n },\n catch: (e) => new ConfigWriteError({ path: CONFIG_FILE, cause: e }),\n })\n );\n\nconst getApiKey = (): Effect.Effect<\n string | undefined,\n ConfigReadError | ConfigWriteError\n> =>\n pipe(\n Effect.succeed(process.env.BRAID_API_KEY),\n Effect.flatMap((envKey) =>\n envKey\n ? Effect.succeed(envKey)\n : pipe(\n loadUserConfig(),\n Effect.flatMap((userConfig) =>\n userConfig?.token\n ? Effect.succeed(userConfig.token)\n : pipe(\n loadConfig(),\n Effect.map((config) => config.apiKey)\n )\n )\n )\n )\n );\n\nconst setApiKey = (\n apiKey: string\n): Effect.Effect<void, ConfigReadError | ConfigWriteError> =>\n pipe(\n loadConfig(),\n Effect.flatMap((config) => saveConfig({ ...config, apiKey }))\n );\n\nconst getServerUrl = (): Effect.Effect<\n string,\n ConfigReadError | ConfigWriteError\n> =>\n pipe(\n Effect.succeed(process.env.BRAID_SERVER_URL),\n Effect.flatMap((envUrl) =>\n envUrl\n ? Effect.succeed(envUrl)\n : pipe(\n loadUserConfig(),\n Effect.flatMap((userConfig) =>\n userConfig?.serverUrl\n ? Effect.succeed(userConfig.serverUrl)\n : pipe(\n loadConfig(),\n Effect.map(\n (config) => config.serverUrl ?? \"https://braid.cloud\"\n )\n )\n )\n )\n )\n );\n\nconst clearApiKey = (): Effect.Effect<\n void,\n ConfigReadError | ConfigWriteError\n> =>\n pipe(\n loadConfig(),\n Effect.flatMap((config) => {\n const { apiKey: _, ...rest } = config;\n return saveConfig(rest);\n })\n );\n\nconst loadConfigAsync = (): Promise<braidSkillsConfig> =>\n Effect.runPromise(loadConfig());\n\nconst loadProjectConfigAsync = (): Promise<braidProjectConfig | undefined> =>\n Effect.runPromise(loadProjectConfig());\n\nconst loadUserConfigAsync = (): Promise<braidUserConfig | undefined> =>\n Effect.runPromise(loadUserConfig());\n\nconst loadMergedConfigAsync = (): Promise<MergedConfig> =>\n Effect.runPromise(loadMergedConfig());\n\nconst findProjectConfigFileAsync = (startDir?: string): string | undefined =>\n findProjectConfigFile(startDir);\n\nconst findUserConfigFileAsync = (startDir?: string): string | undefined =>\n findUserConfigFile(startDir);\n\nconst saveConfigAsync = (config: braidSkillsConfig): Promise<void> =>\n Effect.runPromise(saveConfig(config));\n\nconst saveUserConfigAsync = (\n config: braidUserConfig,\n startDir?: string\n): Promise<string> => Effect.runPromise(saveUserConfig(config, startDir));\n\nconst saveProjectConfigAsync = (\n config: braidProjectConfig,\n startDir?: string\n): Promise<string> => Effect.runPromise(saveProjectConfig(config, startDir));\n\nconst getApiKeyAsync = (): Promise<string | undefined> =>\n Effect.runPromise(getApiKey());\n\nconst setApiKeyAsync = (apiKey: string): Promise<void> =>\n Effect.runPromise(setApiKey(apiKey));\n\nconst getServerUrlAsync = (): Promise<string> =>\n Effect.runPromise(getServerUrl());\n\nconst clearApiKeyAsync = (): Promise<void> => Effect.runPromise(clearApiKey());\n\nexport type {\n braidProjectConfig,\n braidSkillsConfig,\n braidUserConfig,\n MergedConfig,\n};\nexport {\n clearApiKey,\n clearApiKeyAsync,\n CONFIG_DIR,\n CONFIG_FILE,\n ConfigReadError,\n ConfigWriteError,\n findProjectConfigFile,\n findProjectConfigFileAsync,\n findUserConfigFile,\n findUserConfigFileAsync,\n getApiKey,\n getApiKeyAsync,\n getServerUrl,\n getServerUrlAsync,\n loadConfig,\n loadConfigAsync,\n loadMergedConfig,\n loadMergedConfigAsync,\n loadProjectConfig,\n loadProjectConfigAsync,\n loadUserConfig,\n loadUserConfigAsync,\n PROJECT_CONFIG_FILENAME,\n saveConfig,\n saveConfigAsync,\n saveProjectConfig,\n saveProjectConfigAsync,\n saveUserConfig,\n saveUserConfigAsync,\n setApiKey,\n setApiKeyAsync,\n USER_CONFIG_FILENAME,\n};\n","import { Data, Effect, pipe } from \"effect\";\nimport { getApiKeyAsync, getServerUrlAsync } from \"./config.ts\";\n\nconst TRAILING_SLASH_REGEX = /\\/$/;\nconst ALLOW_UNTRUSTED_SERVER_ENV = \"BRAID_ALLOW_UNTRUSTED_SERVER_URL\";\n\nconst isTruthy = (value: string | undefined): boolean =>\n value === \"1\" || value === \"true\" || value === \"yes\";\n\nconst isLocalHost = (hostname: string): boolean =>\n hostname === \"localhost\" || hostname === \"127.0.0.1\" || hostname === \"::1\";\n\nconst isTrustedApiServerUrl = (serverUrl: string): boolean => {\n try {\n const parsed = new URL(serverUrl);\n const hostname = parsed.hostname;\n const isBraidHost =\n hostname === \"braid.cloud\" || hostname.endsWith(\".braid.cloud\");\n\n if (parsed.protocol === \"https:\" && isBraidHost) {\n return true;\n }\n\n if (parsed.protocol === \"http:\" && isLocalHost(hostname)) {\n return true;\n }\n\n return false;\n } catch {\n return false;\n }\n};\n\ninterface SkillFile {\n path: string;\n content: string;\n encoding?: \"base64\";\n}\n\ninterface Skill {\n name: string;\n files: SkillFile[];\n}\n\ninterface ExportedRule {\n name: string;\n title: string;\n content: string;\n}\n\ninterface SkillsExportResponse {\n source: {\n type: \"profile\" | \"projects\";\n name: string;\n orgProjects?: string[];\n personalProjects?: string[];\n };\n version: string;\n skills: Skill[];\n rules?: ExportedRule[];\n}\n\ninterface ScopeOption {\n id: string;\n name: string;\n}\n\ninterface ScopeOrgProjects {\n orgId: string;\n orgName: string;\n projects: ScopeOption[];\n}\n\ninterface ScopeOptionsResponse {\n organizations: Array<ScopeOption & { isPersonal?: boolean }>;\n profiles: ScopeOption[];\n personalProjects: ScopeOption[];\n orgProjects: ScopeOrgProjects[];\n}\n\ninterface RuleOption {\n id: string;\n title: string;\n}\n\ninterface RuleOptionsResponse {\n rules: RuleOption[];\n}\n\ninterface LifecycleCommandRequest {\n domain:\n | \"projects\"\n | \"rules\"\n | \"profiles\"\n | \"references\"\n | \"agents\"\n | \"workflows\";\n command: string;\n args?: Record<string, unknown>;\n}\n\ninterface LifecycleCommandResponse {\n kind: \"lifecycle\";\n domain: string;\n command: string;\n args?: Record<string, unknown>;\n [key: string]: unknown;\n}\n\ninterface ApiErrorResponse {\n error: string;\n code: string;\n}\n\nclass ApiError extends Data.TaggedError(\"ApiError\")<{\n message: string;\n code: string;\n status: number;\n}> {}\n\nclass AuthenticationError extends Data.TaggedError(\"AuthenticationError\")<{\n message: string;\n}> {}\n\nclass NetworkError extends Data.TaggedError(\"NetworkError\")<{\n message: string;\n cause?: unknown;\n}> {}\n\ntype FetchSkillsError = ApiError | AuthenticationError | NetworkError;\n\ninterface FetchSkillsOptions {\n profile?: string;\n orgProjects?: string[];\n personalProjects?: string[];\n ruleIds?: string[];\n excludedRuleIds?: string[];\n resolveOverlays?: boolean;\n includeUserGlobal?: boolean;\n includeOrgGlobal?: boolean;\n serverUrl?: string;\n apiKey?: string;\n}\n\ninterface FetchRuleOptionsInput {\n orgId?: string;\n orgProjects?: string[];\n personalProjects?: string[];\n includeUserGlobal?: boolean;\n includeOrgGlobal?: boolean;\n serverUrl?: string;\n apiKey?: string;\n}\n\ninterface ApiClientOptions {\n serverUrl?: string;\n apiKey?: string;\n}\n\nconst resolveApiKey = (\n optionsApiKey?: string\n): Effect.Effect<string, AuthenticationError | NetworkError> => {\n if (optionsApiKey) {\n return Effect.succeed(optionsApiKey);\n }\n\n return pipe(\n Effect.tryPromise({\n try: () => getApiKeyAsync(),\n catch: () => new NetworkError({ message: \"Failed to read config\" }),\n }),\n Effect.flatMap((key) =>\n key\n ? Effect.succeed(key)\n : Effect.fail(\n new AuthenticationError({\n message:\n 'No API key configured. Run \"braid auth\" to authenticate.',\n })\n )\n )\n );\n};\n\nconst resolveServerUrl = (\n optionsServerUrl?: string\n): Effect.Effect<string, NetworkError> => {\n if (optionsServerUrl) {\n if (\n !(\n isTruthy(process.env[ALLOW_UNTRUSTED_SERVER_ENV]) ||\n isTrustedApiServerUrl(optionsServerUrl)\n )\n ) {\n return Effect.fail(\n new NetworkError({\n message:\n `Untrusted server URL '${optionsServerUrl}'. ` +\n `Set ${ALLOW_UNTRUSTED_SERVER_ENV}=true to override.`,\n })\n );\n }\n return Effect.succeed(optionsServerUrl);\n }\n\n return pipe(\n Effect.tryPromise({\n try: () => getServerUrlAsync(),\n catch: () => new NetworkError({ message: \"Failed to read config\" }),\n }),\n Effect.flatMap((serverUrl) => {\n if (\n isTruthy(process.env[ALLOW_UNTRUSTED_SERVER_ENV]) ||\n isTrustedApiServerUrl(serverUrl)\n ) {\n return Effect.succeed(serverUrl);\n }\n return Effect.fail(\n new NetworkError({\n message:\n `Untrusted server URL '${serverUrl}'. ` +\n `Set ${ALLOW_UNTRUSTED_SERVER_ENV}=true to override.`,\n })\n );\n })\n );\n};\n\nconst parseResponse = (\n response: Response,\n json: unknown\n): Effect.Effect<SkillsExportResponse, FetchSkillsError> => {\n if (!response.ok) {\n const errorResponse = json as ApiErrorResponse;\n\n if (response.status === 401) {\n return Effect.fail(\n new AuthenticationError({\n message:\n errorResponse.error ||\n \"Invalid or expired API key. Run 'braid auth' to re-authenticate.\",\n })\n );\n }\n\n return Effect.fail(\n new ApiError({\n message: errorResponse.error || \"API request failed\",\n code: errorResponse.code || \"UNKNOWN_ERROR\",\n status: response.status,\n })\n );\n }\n\n return Effect.succeed(json as SkillsExportResponse);\n};\n\n/**\n * Fetches skills from the braid API\n *\n * @param options.profile - Profile name to fetch skills from\n * @param options.orgProjects - Array of org project IDs to fetch skills from\n * @param options.personalProjects - Array of personal project IDs to fetch skills from\n * @param options.serverUrl - Override server URL (for review apps, local dev)\n * @param options.apiKey - Override API key (for testing)\n */\nconst buildApiUrl = (serverUrl: string, path: string): URL => {\n const baseUrl = serverUrl.replace(TRAILING_SLASH_REGEX, \"\");\n return new URL(`${baseUrl}${path}`);\n};\n\nconst buildExportUrl = (\n serverUrl: string,\n options: FetchSkillsOptions\n): URL => {\n const url = buildApiUrl(serverUrl, \"/api/skills/export\");\n\n if (options.profile) {\n url.searchParams.set(\"profile\", options.profile);\n }\n if (options.orgProjects && options.orgProjects.length > 0) {\n url.searchParams.set(\"orgProjects\", options.orgProjects.join(\",\"));\n }\n if (options.personalProjects && options.personalProjects.length > 0) {\n url.searchParams.set(\n \"personalProjects\",\n options.personalProjects.join(\",\")\n );\n }\n if (options.includeUserGlobal !== undefined) {\n url.searchParams.set(\n \"includeUserGlobal\",\n String(options.includeUserGlobal)\n );\n }\n if (options.includeOrgGlobal !== undefined) {\n url.searchParams.set(\"includeOrgGlobal\", String(options.includeOrgGlobal));\n }\n if (options.ruleIds && options.ruleIds.length > 0) {\n url.searchParams.set(\"ruleIds\", options.ruleIds.join(\",\"));\n }\n if (options.excludedRuleIds && options.excludedRuleIds.length > 0) {\n url.searchParams.set(\"excludedRuleIds\", options.excludedRuleIds.join(\",\"));\n }\n if (options.resolveOverlays !== undefined) {\n url.searchParams.set(\"resolveOverlays\", String(options.resolveOverlays));\n }\n\n return url;\n};\n\nconst executeApiRequest = (\n url: URL,\n apiKey: string,\n serverUrl: string\n): Effect.Effect<SkillsExportResponse, FetchSkillsError> =>\n pipe(\n Effect.tryPromise({\n try: () =>\n fetch(url.toString(), {\n method: \"GET\",\n headers: {\n Authorization: `Bearer ${apiKey}`,\n \"Content-Type\": \"application/json\",\n },\n }),\n catch: (e) =>\n new NetworkError({\n message: `Failed to connect to ${serverUrl}`,\n cause: e,\n }),\n }),\n Effect.flatMap((response) =>\n pipe(\n Effect.tryPromise({\n try: () => response.json() as Promise<unknown>,\n catch: () =>\n new NetworkError({ message: \"Failed to parse API response\" }),\n }),\n Effect.flatMap((json) => parseResponse(response, json))\n )\n )\n );\n\nconst parseScopeOptionsResponse = (\n response: Response,\n json: unknown\n): Effect.Effect<ScopeOptionsResponse, FetchSkillsError> => {\n if (!response.ok) {\n const errorResponse = json as ApiErrorResponse;\n\n if (response.status === 401) {\n return Effect.fail(\n new AuthenticationError({\n message:\n errorResponse.error ||\n \"Invalid or expired API key. Run 'braid auth' to re-authenticate.\",\n })\n );\n }\n\n return Effect.fail(\n new ApiError({\n message: errorResponse.error || \"API request failed\",\n code: errorResponse.code || \"UNKNOWN_ERROR\",\n status: response.status,\n })\n );\n }\n\n return Effect.succeed(json as ScopeOptionsResponse);\n};\n\nconst fetchScopeOptions = (\n options: Pick<FetchSkillsOptions, \"serverUrl\" | \"apiKey\"> = {}\n): Effect.Effect<ScopeOptionsResponse, FetchSkillsError> =>\n pipe(\n Effect.all({\n apiKey: resolveApiKey(options.apiKey),\n serverUrl: resolveServerUrl(options.serverUrl),\n }),\n Effect.flatMap(({ apiKey, serverUrl }) => {\n const url = buildApiUrl(serverUrl, \"/api/skills/scope-options\");\n return pipe(\n Effect.tryPromise({\n try: () =>\n fetch(url.toString(), {\n method: \"GET\",\n headers: {\n Authorization: `Bearer ${apiKey}`,\n \"Content-Type\": \"application/json\",\n },\n }),\n catch: (e) =>\n new NetworkError({\n message: `Failed to connect to ${serverUrl}`,\n cause: e,\n }),\n }),\n Effect.flatMap((response) =>\n pipe(\n Effect.tryPromise({\n try: () => response.json() as Promise<unknown>,\n catch: () =>\n new NetworkError({ message: \"Failed to parse API response\" }),\n }),\n Effect.flatMap((json) => parseScopeOptionsResponse(response, json))\n )\n )\n );\n })\n );\n\nconst buildRuleOptionsUrl = (\n serverUrl: string,\n options: FetchRuleOptionsInput\n): URL => {\n const url = buildApiUrl(serverUrl, \"/api/skills/rule-options\");\n\n if (options.orgId) {\n url.searchParams.set(\"orgId\", options.orgId);\n }\n if (options.orgProjects && options.orgProjects.length > 0) {\n url.searchParams.set(\"orgProjects\", options.orgProjects.join(\",\"));\n }\n if (options.personalProjects && options.personalProjects.length > 0) {\n url.searchParams.set(\n \"personalProjects\",\n options.personalProjects.join(\",\")\n );\n }\n if (options.includeUserGlobal !== undefined) {\n url.searchParams.set(\n \"includeUserGlobal\",\n String(options.includeUserGlobal)\n );\n }\n if (options.includeOrgGlobal !== undefined) {\n url.searchParams.set(\"includeOrgGlobal\", String(options.includeOrgGlobal));\n }\n\n return url;\n};\n\nconst fetchRuleOptions = (\n options: FetchRuleOptionsInput = {}\n): Effect.Effect<RuleOptionsResponse, FetchSkillsError> =>\n pipe(\n Effect.all({\n apiKey: resolveApiKey(options.apiKey),\n serverUrl: resolveServerUrl(options.serverUrl),\n }),\n Effect.flatMap(({ apiKey, serverUrl }) =>\n pipe(\n Effect.tryPromise({\n try: () =>\n fetch(buildRuleOptionsUrl(serverUrl, options).toString(), {\n method: \"GET\",\n headers: {\n Authorization: `Bearer ${apiKey}`,\n \"Content-Type\": \"application/json\",\n },\n }),\n catch: (e) =>\n new NetworkError({\n message: `Failed to connect to ${serverUrl}`,\n cause: e,\n }),\n }),\n Effect.flatMap((response) =>\n pipe(\n Effect.tryPromise({\n try: () => response.json() as Promise<unknown>,\n catch: () =>\n new NetworkError({ message: \"Failed to parse API response\" }),\n }),\n Effect.flatMap((json) => {\n if (!response.ok) {\n return parseResponse(response, json).pipe(\n Effect.flatMap(() =>\n Effect.fail(\n new ApiError({\n message: \"API request failed\",\n code: \"UNKNOWN_ERROR\",\n status: response.status,\n })\n )\n )\n );\n }\n\n return Effect.succeed(json as RuleOptionsResponse);\n })\n )\n )\n )\n )\n );\n\nconst fetchSkills = (\n options: FetchSkillsOptions\n): Effect.Effect<SkillsExportResponse, FetchSkillsError> =>\n pipe(\n Effect.all({\n apiKey: resolveApiKey(options.apiKey),\n serverUrl: resolveServerUrl(options.serverUrl),\n }),\n Effect.flatMap(({ apiKey, serverUrl }) => {\n const url = buildExportUrl(serverUrl, options);\n return executeApiRequest(url, apiKey, serverUrl);\n })\n );\n\nconst runLifecycleCommand = (\n request: LifecycleCommandRequest,\n options: ApiClientOptions = {}\n): Effect.Effect<LifecycleCommandResponse, FetchSkillsError> =>\n pipe(\n Effect.all({\n apiKey: resolveApiKey(options.apiKey),\n serverUrl: resolveServerUrl(options.serverUrl),\n }),\n Effect.flatMap(({ apiKey, serverUrl }) =>\n Effect.tryPromise({\n try: async (): Promise<LifecycleCommandResponse> => {\n const response = await fetch(\n buildApiUrl(serverUrl, \"/api/lifecycle\").toString(),\n {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${apiKey}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(request),\n }\n );\n\n const json = (await response.json()) as unknown;\n\n if (!response.ok) {\n const errorResponse = json as ApiErrorResponse;\n if (response.status === 401) {\n throw new AuthenticationError({\n message:\n errorResponse.error ||\n \"Invalid or expired API key. Run 'braid auth' to re-authenticate.\",\n });\n }\n\n throw new ApiError({\n message: errorResponse.error || \"API request failed\",\n code: errorResponse.code || \"UNKNOWN_ERROR\",\n status: response.status,\n });\n }\n\n return json as LifecycleCommandResponse;\n },\n catch: (error): FetchSkillsError => {\n if (\n error instanceof ApiError ||\n error instanceof AuthenticationError ||\n error instanceof NetworkError\n ) {\n return error;\n }\n\n return new NetworkError({\n message: `Failed to connect to ${serverUrl}`,\n cause: error,\n });\n },\n })\n )\n );\n\nconst DEFAULT_PUBLIC_SERVER_URL = \"https://braid.cloud\";\n\ninterface PublicProjectMetadata {\n type: \"project\";\n project: {\n name: string;\n slug: string;\n description?: string;\n ruleCount: number;\n };\n rules: Array<{\n id: string;\n title: string;\n slug?: string;\n type: string;\n tags: string[];\n }>;\n}\n\ninterface PublicRuleMetadata {\n type: \"rule\";\n rule: {\n id: string;\n title: string;\n slug?: string;\n type: string;\n tags: string[];\n description: string;\n };\n}\n\ntype PublicMetadataResponse = PublicProjectMetadata | PublicRuleMetadata;\n\nclass NotFoundError extends Data.TaggedError(\"NotFoundError\")<{\n message: string;\n}> {}\n\nclass RateLimitedError extends Data.TaggedError(\"RateLimitedError\")<{\n message: string;\n retryAfterMs?: number;\n}> {}\n\ntype PublicApiError =\n | NetworkError\n | NotFoundError\n | RateLimitedError\n | ApiError;\n\nconst handlePublicApiResponse = <T>(\n response: Response,\n json: unknown\n): Effect.Effect<T, PublicApiError> => {\n if (response.ok) {\n return Effect.succeed(json as T);\n }\n\n if (response.status === 404) {\n return Effect.fail(\n new NotFoundError({ message: \"Public content not found\" })\n );\n }\n\n if (response.status === 429) {\n const retryAfter = response.headers.get(\"Retry-After\");\n const retryMs = retryAfter ? Number(retryAfter) * 1000 : null;\n return Effect.fail(\n new RateLimitedError({\n message: \"Rate limited. Please try again later.\",\n ...(retryMs !== null ? { retryAfterMs: retryMs } : {}),\n })\n );\n }\n\n const errorResponse = json as ApiErrorResponse;\n return Effect.fail(\n new ApiError({\n message: errorResponse.error || \"API request failed\",\n code: errorResponse.code || \"UNKNOWN_ERROR\",\n status: response.status,\n })\n );\n};\n\nconst fetchPublicMetadata = (\n handle: string,\n slug: string,\n serverUrl?: string\n): Effect.Effect<PublicMetadataResponse, PublicApiError> => {\n const baseUrl = (serverUrl ?? DEFAULT_PUBLIC_SERVER_URL).replace(\n TRAILING_SLASH_REGEX,\n \"\"\n );\n const url = `${baseUrl}/api/public/@${handle}/${slug}`;\n\n return pipe(\n Effect.tryPromise({\n try: () => fetch(url, { method: \"GET\" }),\n catch: (e) =>\n new NetworkError({\n message: `Failed to connect to ${baseUrl}`,\n cause: e,\n }),\n }),\n Effect.flatMap((response) =>\n pipe(\n Effect.tryPromise({\n try: () => response.json() as Promise<unknown>,\n catch: () =>\n new NetworkError({ message: \"Failed to parse API response\" }),\n }),\n Effect.flatMap((json) =>\n handlePublicApiResponse<PublicMetadataResponse>(response, json)\n )\n )\n )\n );\n};\n\nconst fetchPublicExport = (\n handle: string,\n slug: string,\n ruleIds?: string[],\n serverUrl?: string\n): Effect.Effect<SkillsExportResponse, PublicApiError> => {\n const baseUrl = (serverUrl ?? DEFAULT_PUBLIC_SERVER_URL).replace(\n TRAILING_SLASH_REGEX,\n \"\"\n );\n const url = new URL(`${baseUrl}/api/public/@${handle}/${slug}/export`);\n if (ruleIds && ruleIds.length > 0) {\n url.searchParams.set(\"ruleIds\", ruleIds.join(\",\"));\n }\n\n return pipe(\n Effect.tryPromise({\n try: () => fetch(url.toString(), { method: \"GET\" }),\n catch: (e) =>\n new NetworkError({\n message: `Failed to connect to ${baseUrl}`,\n cause: e,\n }),\n }),\n Effect.flatMap((response) =>\n pipe(\n Effect.tryPromise({\n try: () => response.json() as Promise<unknown>,\n catch: () =>\n new NetworkError({ message: \"Failed to parse API response\" }),\n }),\n Effect.flatMap((json) =>\n handlePublicApiResponse<SkillsExportResponse>(response, json)\n )\n )\n )\n );\n};\n\nconst fetchPublicMetadataAsync = (\n handle: string,\n slug: string,\n serverUrl?: string\n): Promise<PublicMetadataResponse> =>\n Effect.runPromise(fetchPublicMetadata(handle, slug, serverUrl));\n\nconst fetchPublicExportAsync = (\n handle: string,\n slug: string,\n ruleIds?: string[],\n serverUrl?: string\n): Promise<SkillsExportResponse> =>\n Effect.runPromise(fetchPublicExport(handle, slug, ruleIds, serverUrl));\n\n/**\n * Validates an API key by making a test request\n *\n * @param apiKey - API key to validate\n * @param serverUrl - Server URL to validate against (defaults to production)\n */\nconst validateApiKey = (\n apiKey: string,\n serverUrl?: string\n): Effect.Effect<boolean, NetworkError> =>\n pipe(\n Effect.try({\n try: () => {\n const baseUrl = serverUrl ?? \"https://braid.cloud\";\n if (\n !(\n isTruthy(process.env[ALLOW_UNTRUSTED_SERVER_ENV]) ||\n isTrustedApiServerUrl(baseUrl)\n )\n ) {\n throw new NetworkError({\n message:\n `Untrusted server URL '${baseUrl}'. ` +\n `Set ${ALLOW_UNTRUSTED_SERVER_ENV}=true to override.`,\n });\n }\n return baseUrl;\n },\n catch: (e) =>\n e instanceof NetworkError\n ? e\n : new NetworkError({ message: \"Invalid server URL\" }),\n }),\n Effect.flatMap((baseUrl) =>\n Effect.tryPromise({\n try: async () => {\n const url = buildApiUrl(baseUrl, \"/api/skills/export\");\n url.searchParams.set(\"profile\", \"default\");\n\n const response = await fetch(url.toString(), {\n method: \"GET\",\n headers: {\n Authorization: `Bearer ${apiKey}`,\n \"Content-Type\": \"application/json\",\n },\n });\n return response.status !== 401;\n },\n catch: (e) =>\n new NetworkError({\n message: `Failed to connect to ${baseUrl}`,\n cause: e,\n }),\n })\n )\n );\n\nconst fetchSkillsAsync = (\n options: FetchSkillsOptions\n): Promise<SkillsExportResponse> => Effect.runPromise(fetchSkills(options));\n\nconst validateApiKeyAsync = (\n apiKey: string,\n serverUrl?: string\n): Promise<boolean> => Effect.runPromise(validateApiKey(apiKey, serverUrl));\n\nconst fetchScopeOptionsAsync = (\n options: Pick<FetchSkillsOptions, \"serverUrl\" | \"apiKey\"> = {}\n): Promise<ScopeOptionsResponse> =>\n Effect.runPromise(fetchScopeOptions(options));\n\nconst fetchRuleOptionsAsync = (\n options: FetchRuleOptionsInput = {}\n): Promise<RuleOptionsResponse> => Effect.runPromise(fetchRuleOptions(options));\n\nconst runLifecycleCommandAsync = (\n request: LifecycleCommandRequest,\n options: ApiClientOptions = {}\n): Promise<LifecycleCommandResponse> =>\n Effect.runPromise(runLifecycleCommand(request, options));\n\nexport type {\n ApiErrorResponse,\n ExportedRule,\n FetchSkillsOptions,\n PublicMetadataResponse,\n PublicProjectMetadata,\n PublicRuleMetadata,\n Skill,\n SkillFile,\n ScopeOption,\n ScopeOptionsResponse,\n RuleOption,\n RuleOptionsResponse,\n LifecycleCommandRequest,\n LifecycleCommandResponse,\n SkillsExportResponse,\n};\nexport {\n ApiError,\n AuthenticationError,\n fetchPublicExport,\n fetchPublicExportAsync,\n fetchPublicMetadata,\n fetchPublicMetadataAsync,\n fetchSkills,\n fetchSkillsAsync,\n fetchScopeOptions,\n fetchScopeOptionsAsync,\n fetchRuleOptions,\n fetchRuleOptionsAsync,\n NetworkError,\n NotFoundError,\n RateLimitedError,\n runLifecycleCommand,\n runLifecycleCommandAsync,\n validateApiKey,\n validateApiKeyAsync,\n isTrustedApiServerUrl,\n};\n","import process from \"node:process\";\nimport {\n cancel as clackCancel,\n confirm as clackConfirm,\n group as clackGroup,\n groupMultiselect as clackGroupMultiselect,\n intro as clackIntro,\n isCancel as clackIsCancel,\n log as clackLog,\n multiselect as clackMultiselect,\n note as clackNote,\n outro as clackOutro,\n password as clackPassword,\n select as clackSelect,\n selectKey as clackSelectKey,\n spinner as clackSpinner,\n text as clackText,\n} from \"@clack/prompts\";\n\nconst isTTY = Boolean(process.stdout.isTTY);\n\ninterface NoopSpinner {\n start: (message?: string) => void;\n stop: (message?: string) => void;\n message: (message?: string) => void;\n}\n\nfunction spinner(): NoopSpinner | ReturnType<typeof clackSpinner> {\n if (isTTY) {\n return clackSpinner();\n }\n\n return {\n start: (message?: string) => {\n if (message) {\n process.stdout.write(`${message}\\n`);\n }\n },\n stop: (message?: string) => {\n if (message) {\n process.stdout.write(`${message}\\n`);\n }\n },\n message: (message?: string) => {\n if (message) {\n process.stdout.write(`${message}\\n`);\n }\n },\n };\n}\n\nfunction intro(message: string): void {\n if (isTTY) {\n clackIntro(message);\n } else {\n process.stdout.write(`\\n${message}\\n`);\n }\n}\n\nfunction outro(message: string): void {\n if (isTTY) {\n clackOutro(message);\n } else {\n process.stdout.write(`${message}\\n\\n`);\n }\n}\n\nconst cancel = clackCancel;\nconst confirm = clackConfirm;\nconst group = clackGroup;\nconst groupMultiselect = clackGroupMultiselect;\nconst isCancel = clackIsCancel;\nconst log = clackLog;\nconst multiselect = clackMultiselect;\nconst note = clackNote;\nconst password = clackPassword;\nconst select = clackSelect;\nconst selectKey = clackSelectKey;\nconst text = clackText;\n\nexport {\n cancel,\n confirm,\n group,\n groupMultiselect,\n intro,\n isCancel,\n log,\n multiselect,\n note,\n outro,\n password,\n select,\n selectKey,\n spinner,\n text,\n};\n","import type { ScopeOrganization, ScopeSource } from \"./scope-config.ts\";\n\ninterface ScopeFlags {\n organization?: ScopeOrganization;\n source?: ScopeSource;\n profile?: string;\n projects?: string;\n ruleIds?: string;\n excludedRuleIds?: string;\n includeUserGlobal?: boolean;\n includeOrgGlobal?: boolean;\n}\n\ntype FlagSelection =\n | { organization: ScopeOrganization; source: \"profile\"; profile: string }\n | {\n organization: ScopeOrganization;\n source: \"manual\";\n projectIds?: string[];\n ruleIds?: string[];\n excludedRuleIds?: string[];\n includeUserGlobal: boolean;\n includeOrgGlobal: boolean;\n };\n\nfunction parseProjectIds(input: string): string[] {\n return input\n .split(\",\")\n .map((value) => value.trim())\n .filter((value) => value.length > 0);\n}\n\nfunction inferScopeSource(flags: ScopeFlags): ScopeSource | undefined {\n if (flags.profile) {\n return \"profile\";\n }\n if (flags.projects || flags.ruleIds || flags.excludedRuleIds) {\n return \"manual\";\n }\n\n return undefined;\n}\n\nfunction buildManualSelection(\n flags: ScopeFlags\n): Extract<FlagSelection, { source: \"manual\" }> {\n const projectIds = parseProjectIds(flags.projects ?? \"\");\n const ruleIds = parseProjectIds(flags.ruleIds ?? \"\");\n const excludedRuleIds = parseProjectIds(flags.excludedRuleIds ?? \"\");\n\n return {\n organization: flags.organization as ScopeOrganization,\n source: \"manual\",\n ...(projectIds.length > 0 ? { projectIds } : {}),\n ...(ruleIds.length > 0 ? { ruleIds } : {}),\n ...(excludedRuleIds.length > 0 ? { excludedRuleIds } : {}),\n includeUserGlobal:\n flags.includeUserGlobal ?? flags.organization === \"personal\",\n includeOrgGlobal:\n flags.includeOrgGlobal ?? flags.organization === \"organization\",\n };\n}\n\nfunction resolveSelectionFromFlags(flags: ScopeFlags): FlagSelection | null {\n if (!flags.organization) {\n return null;\n }\n\n const source = flags.source ?? inferScopeSource(flags);\n\n if (!source) {\n return null;\n }\n\n if (source === \"profile\") {\n const profile = flags.profile?.trim();\n if (!profile) {\n return null;\n }\n return { organization: flags.organization, source, profile };\n }\n\n return buildManualSelection(flags);\n}\n\nexport type { FlagSelection, ScopeFlags };\nexport { parseProjectIds, resolveSelectionFromFlags };\n","import type { braidProjectConfig } from \"./config.ts\";\n\ntype ScopeOrganization = \"personal\" | \"organization\";\ntype ScopeSource = \"profile\" | \"manual\";\n\ninterface ScopeWriteSelection {\n organization: ScopeOrganization;\n source: ScopeSource;\n profile?: string;\n projectIds?: string[];\n ruleIds?: string[];\n excludedRuleIds?: string[];\n includeUserGlobal?: boolean;\n includeOrgGlobal?: boolean;\n}\n\nfunction buildManualScopeConfig(\n base: braidProjectConfig,\n selection: ScopeWriteSelection\n): braidProjectConfig {\n let projectScope: Partial<\n Pick<braidProjectConfig, \"orgProjects\" | \"personalProjects\">\n > = {};\n if (selection.projectIds && selection.projectIds.length > 0) {\n projectScope =\n selection.organization === \"organization\"\n ? { orgProjects: selection.projectIds }\n : { personalProjects: selection.projectIds };\n }\n\n return {\n ...base,\n ...projectScope,\n ...(selection.ruleIds && selection.ruleIds.length > 0\n ? { ruleIds: selection.ruleIds }\n : {}),\n ...(selection.excludedRuleIds && selection.excludedRuleIds.length > 0\n ? { excludedRuleIds: selection.excludedRuleIds }\n : {}),\n includeUserGlobal:\n selection.includeUserGlobal ?? selection.organization === \"personal\",\n includeOrgGlobal:\n selection.includeOrgGlobal ?? selection.organization === \"organization\",\n };\n}\n\nfunction buildScopedConfig(\n existing: braidProjectConfig,\n selection: ScopeWriteSelection\n): braidProjectConfig {\n const {\n profile: _oldProfile,\n orgProjects: _oldOrgProjects,\n personalProjects: _oldPersonalProjects,\n ...base\n } = existing;\n\n if (selection.source === \"profile\") {\n const profile = selection.profile?.trim();\n return {\n ...base,\n ...(profile ? { profile } : {}),\n includeUserGlobal: selection.organization === \"personal\",\n includeOrgGlobal: selection.organization === \"organization\",\n };\n }\n\n if (selection.source === \"manual\") {\n return buildManualScopeConfig(base, selection);\n }\n\n return base;\n}\n\nexport type { ScopeOrganization, ScopeSource, ScopeWriteSelection };\nexport { buildScopedConfig };\n","import process from \"node:process\";\nimport type { ScopeOptionsResponse } from \"../lib/api.ts\";\nimport { fetchRuleOptionsAsync, fetchScopeOptionsAsync } from \"../lib/api.ts\";\nimport {\n loadMergedConfigAsync,\n loadProjectConfigAsync,\n loadUserConfigAsync,\n saveProjectConfigAsync,\n saveUserConfigAsync,\n} from \"../lib/config.ts\";\nimport type { FlagSelection, ScopeFlags } from \"../lib/scope-args.ts\";\nimport { resolveSelectionFromFlags } from \"../lib/scope-args.ts\";\nimport type { ScopeOrganization, ScopeSource } from \"../lib/scope-config.ts\";\nimport { buildScopedConfig } from \"../lib/scope-config.ts\";\nimport {\n cancel,\n confirm,\n intro,\n isCancel,\n log,\n multiselect,\n outro,\n select,\n spinner,\n text,\n} from \"../lib/tui.ts\";\n\ninterface ScopeCommandOptions {\n server?: string;\n file?: \"project\" | \"user\";\n apiKey?: string;\n organization?: ScopeOrganization;\n source?: ScopeSource;\n profile?: string;\n projects?: string;\n ruleIds?: string;\n excludedRuleIds?: string;\n includeUserGlobal?: boolean;\n includeOrgGlobal?: boolean;\n}\n\ntype OrganizationContext =\n | { organization: \"personal\" }\n | { organization: \"organization\"; orgId: string };\n\ninterface ManualInputs {\n includeUserGlobal: boolean;\n includeOrgGlobal: boolean;\n projectIds?: string[];\n ruleIds?: string[];\n excludedRuleIds?: string[];\n}\n\nfunction exitCancelled(message: string): never {\n cancel(message);\n process.exit(0);\n}\n\nasync function selectTargetFile(\n options: ScopeCommandOptions\n): Promise<\"project\" | \"user\"> {\n if (options.file) {\n return options.file;\n }\n\n const target = await select<\"project\" | \"user\">({\n message: \"Where should this scope be saved?\",\n options: [\n {\n value: \"user\",\n label: \"braid.user.json\",\n hint: \"Personal machine defaults\",\n },\n {\n value: \"project\",\n label: \"braid.json\",\n hint: \"Shared project defaults\",\n },\n ],\n initialValue: \"user\",\n });\n\n if (isCancel(target)) {\n exitCancelled(\"Scope update cancelled.\");\n }\n return target;\n}\n\nasync function selectOrganization(\n scopeOptions: ScopeOptionsResponse\n): Promise<OrganizationContext> {\n const options: Array<{ value: string; label: string; hint?: string }> = [\n { value: \"personal\", label: \"Personal\", hint: \"Your personal rules\" },\n ];\n for (const org of scopeOptions.organizations.filter(\n (item) => !item.isPersonal\n )) {\n options.push({ value: `org:${org.id}`, label: org.name, hint: org.id });\n }\n\n const selected = await select<string>({\n message: \"Select organization context:\",\n options,\n initialValue: \"personal\",\n });\n\n if (isCancel(selected)) {\n exitCancelled(\"Scope update cancelled.\");\n }\n if (selected === \"personal\") {\n return { organization: \"personal\" };\n }\n\n return { organization: \"organization\", orgId: selected.replace(\"org:\", \"\") };\n}\n\nasync function selectScopeSource(): Promise<ScopeSource> {\n const source = await select<ScopeSource>({\n message: \"Select scope source:\",\n options: [\n { value: \"profile\", label: \"Profile\", hint: \"Use an MCP profile\" },\n {\n value: \"manual\",\n label: \"Manual\",\n hint: \"Mix globals, projects, and rules\",\n },\n ],\n initialValue: \"profile\",\n });\n\n if (isCancel(source)) {\n exitCancelled(\"Scope update cancelled.\");\n }\n return source;\n}\n\nasync function selectProfileName(\n scopeOptions: ScopeOptionsResponse\n): Promise<string> {\n if (scopeOptions.profiles.length === 0) {\n const profileName = await text({\n message: \"Profile name:\",\n placeholder: \"default\",\n validate: (value) =>\n (value ?? \"\").trim().length > 0\n ? undefined\n : \"Profile name is required\",\n });\n if (isCancel(profileName)) {\n exitCancelled(\"Scope update cancelled.\");\n }\n return profileName.trim();\n }\n\n const profile = await select<string>({\n message: \"Select profile:\",\n options: scopeOptions.profiles.map((p) => ({\n value: p.name,\n label: p.name,\n hint: p.id,\n })),\n ...(scopeOptions.profiles[0]?.name\n ? { initialValue: scopeOptions.profiles[0].name }\n : {}),\n });\n if (isCancel(profile)) {\n exitCancelled(\"Scope update cancelled.\");\n }\n return profile;\n}\n\nfunction projectsForContext(\n organizationContext: OrganizationContext,\n scopeOptions: ScopeOptionsResponse\n): Array<{ id: string; name: string }> {\n if (organizationContext.organization === \"personal\") {\n return scopeOptions.personalProjects;\n }\n const orgProjects = scopeOptions.orgProjects.find(\n (o) => o.orgId === organizationContext.orgId\n );\n return orgProjects?.projects ?? [];\n}\n\nasync function selectProjects(\n organizationContext: OrganizationContext,\n scopeOptions: ScopeOptionsResponse\n): Promise<string[] | undefined> {\n const availableProjects = projectsForContext(\n organizationContext,\n scopeOptions\n );\n if (availableProjects.length === 0) {\n return undefined;\n }\n\n const shouldUseProjects = await confirm({\n message: \"Include project rules too?\",\n initialValue: true,\n });\n if (isCancel(shouldUseProjects)) {\n exitCancelled(\"Scope update cancelled.\");\n }\n if (!shouldUseProjects) {\n return undefined;\n }\n\n const selected = await multiselect({\n message: \"Select projects:\",\n options: availableProjects.map((p) => ({\n value: p.id,\n label: p.name,\n hint: p.id,\n })),\n required: false,\n });\n if (isCancel(selected)) {\n exitCancelled(\"Scope update cancelled.\");\n }\n return selected.length > 0 ? selected : undefined;\n}\n\nasync function pickRuleIds(\n message: string,\n rules: Array<{ id: string; title: string }>\n): Promise<string[] | undefined> {\n const selected = await multiselect({\n message,\n options: rules.map((rule) => ({\n value: rule.id,\n label: rule.title,\n hint: rule.id,\n })),\n required: false,\n });\n if (isCancel(selected)) {\n exitCancelled(\"Scope update cancelled.\");\n }\n return selected.length > 0 ? selected : undefined;\n}\n\nfunction manualInputsFromFlag(\n flagSelection: Extract<FlagSelection, { source: \"manual\" }>\n): ManualInputs {\n return {\n includeUserGlobal: flagSelection.includeUserGlobal,\n includeOrgGlobal: flagSelection.includeOrgGlobal,\n ...(flagSelection.projectIds\n ? { projectIds: flagSelection.projectIds }\n : {}),\n ...(flagSelection.ruleIds ? { ruleIds: flagSelection.ruleIds } : {}),\n ...(flagSelection.excludedRuleIds\n ? { excludedRuleIds: flagSelection.excludedRuleIds }\n : {}),\n };\n}\n\nasync function promptRuleFilters(\n organizationContext: OrganizationContext,\n projectIds: string[] | undefined,\n includeUserGlobal: boolean,\n includeOrgGlobal: boolean,\n serverUrl: string,\n apiKey: string | undefined\n): Promise<{ ruleIds?: string[]; excludedRuleIds?: string[] }> {\n const filterMode = await select<\"none\" | \"include\" | \"exclude\" | \"both\">({\n message: \"Rule filtering:\",\n options: [\n { value: \"none\", label: \"None\", hint: \"Use all matched rules\" },\n {\n value: \"include\",\n label: \"Only include\",\n hint: \"Pick explicit rule IDs\",\n },\n { value: \"exclude\", label: \"Exclude\", hint: \"Remove specific rule IDs\" },\n { value: \"both\", label: \"Include + exclude\", hint: \"Both filters\" },\n ],\n initialValue: \"none\",\n });\n if (isCancel(filterMode) || filterMode === \"none\") {\n if (isCancel(filterMode)) {\n exitCancelled(\"Scope update cancelled.\");\n }\n return {};\n }\n\n const ruleOptions = await fetchRuleOptionsAsync(\n buildRuleOptionsRequest(\n organizationContext,\n projectIds,\n includeUserGlobal,\n includeOrgGlobal,\n serverUrl,\n apiKey\n )\n );\n\n const ruleIds =\n filterMode === \"include\" || filterMode === \"both\"\n ? await pickRuleIds(\"Select rules to include:\", ruleOptions.rules)\n : undefined;\n const excludedRuleIds =\n filterMode === \"exclude\" || filterMode === \"both\"\n ? await pickRuleIds(\"Select rules to exclude:\", ruleOptions.rules)\n : undefined;\n\n return {\n ...(ruleIds ? { ruleIds } : {}),\n ...(excludedRuleIds ? { excludedRuleIds } : {}),\n };\n}\n\nfunction buildRuleOptionsRequest(\n organizationContext: OrganizationContext,\n projectIds: string[] | undefined,\n includeUserGlobal: boolean,\n includeOrgGlobal: boolean,\n serverUrl: string,\n apiKey: string | undefined\n): Parameters<typeof fetchRuleOptionsAsync>[0] {\n let projectScope: Record<string, string[]> = {};\n if (projectIds && organizationContext.organization === \"organization\") {\n projectScope = { orgProjects: projectIds };\n }\n if (projectIds && organizationContext.organization === \"personal\") {\n projectScope = { personalProjects: projectIds };\n }\n\n return {\n serverUrl,\n ...(apiKey ? { apiKey } : {}),\n ...(organizationContext.organization === \"organization\"\n ? { orgId: organizationContext.orgId }\n : {}),\n ...projectScope,\n includeUserGlobal,\n includeOrgGlobal,\n };\n}\n\nasync function resolveManualInputs(\n organizationContext: OrganizationContext,\n scopeOptions: ScopeOptionsResponse,\n serverUrl: string,\n apiKey: string | undefined\n): Promise<ManualInputs> {\n const { includeUserGlobal, includeOrgGlobal } =\n await promptGlobalInclusions(organizationContext);\n\n const projectIds = await selectProjects(organizationContext, scopeOptions);\n const filters = await promptRuleFilters(\n organizationContext,\n projectIds,\n includeUserGlobal,\n includeOrgGlobal,\n serverUrl,\n apiKey\n );\n\n return {\n includeUserGlobal,\n includeOrgGlobal,\n ...(projectIds ? { projectIds } : {}),\n ...filters,\n };\n}\n\nasync function promptGlobalInclusions(\n organizationContext: OrganizationContext\n): Promise<{ includeUserGlobal: boolean; includeOrgGlobal: boolean }> {\n const includeUserGlobal = await confirm({\n message: \"Include personal global rules?\",\n initialValue: organizationContext.organization === \"personal\",\n });\n if (isCancel(includeUserGlobal)) {\n exitCancelled(\"Scope update cancelled.\");\n }\n\n if (organizationContext.organization === \"personal\") {\n return { includeUserGlobal, includeOrgGlobal: false };\n }\n\n const includeOrgGlobal = await confirm({\n message: \"Include organization global rules?\",\n initialValue: true,\n });\n if (isCancel(includeOrgGlobal)) {\n exitCancelled(\"Scope update cancelled.\");\n }\n\n return { includeUserGlobal, includeOrgGlobal };\n}\n\nasync function resolveManualSelection(\n source: ScopeSource,\n flagSelection: FlagSelection | null,\n organizationContext: OrganizationContext,\n scopeOptions: ScopeOptionsResponse,\n serverUrl: string,\n apiKey: string | undefined\n): Promise<ManualInputs | undefined> {\n if (source !== \"manual\") {\n return undefined;\n }\n if (flagSelection?.source === \"manual\") {\n return manualInputsFromFlag(flagSelection);\n }\n\n return await resolveManualInputs(\n organizationContext,\n scopeOptions,\n serverUrl,\n apiKey\n );\n}\n\nasync function resolveOrganizationContext(\n flagSelection: FlagSelection | null,\n scopeOptions: ScopeOptionsResponse\n): Promise<OrganizationContext> {\n if (flagSelection?.organization === \"personal\") {\n return { organization: \"personal\" };\n }\n\n return await selectOrganization(scopeOptions);\n}\n\nasync function resolveProfileSelection(\n source: ScopeSource,\n flagSelection: FlagSelection | null,\n scopeOptions: ScopeOptionsResponse\n): Promise<string | undefined> {\n if (source !== \"profile\") {\n return undefined;\n }\n if (flagSelection?.source === \"profile\") {\n return flagSelection.profile;\n }\n return await selectProfileName(scopeOptions);\n}\n\nfunction resolveFlagSelection(\n options: ScopeCommandOptions\n): FlagSelection | null {\n const flags: ScopeFlags = {\n ...(options.organization ? { organization: options.organization } : {}),\n ...(options.source ? { source: options.source } : {}),\n ...(options.profile ? { profile: options.profile } : {}),\n ...(options.projects ? { projects: options.projects } : {}),\n ...(options.ruleIds ? { ruleIds: options.ruleIds } : {}),\n ...(options.excludedRuleIds\n ? { excludedRuleIds: options.excludedRuleIds }\n : {}),\n ...(options.includeUserGlobal !== undefined\n ? { includeUserGlobal: options.includeUserGlobal }\n : {}),\n ...(options.includeOrgGlobal !== undefined\n ? { includeOrgGlobal: options.includeOrgGlobal }\n : {}),\n };\n return resolveSelectionFromFlags(flags);\n}\n\nexport async function scopeCommand(\n options: ScopeCommandOptions\n): Promise<void> {\n intro(\"braid scope\");\n\n const config = await loadMergedConfigAsync();\n const targetFile = await selectTargetFile(options);\n\n const loadSpinner = spinner();\n loadSpinner.start(\"Loading scope options from braid...\");\n\n try {\n const serverUrl = options.server ?? config.serverUrl;\n const apiKey = options.apiKey ?? config.token;\n\n const scopeOptions = await fetchScopeOptionsAsync({\n serverUrl,\n ...(apiKey ? { apiKey } : {}),\n });\n loadSpinner.stop(\"Scope options loaded\");\n\n const flagSelection = resolveFlagSelection(options);\n const organizationContext = await resolveOrganizationContext(\n flagSelection,\n scopeOptions\n );\n const source = flagSelection?.source ?? (await selectScopeSource());\n\n const profile = await resolveProfileSelection(\n source,\n flagSelection,\n scopeOptions\n );\n\n const manualInputs = await resolveManualSelection(\n source,\n flagSelection,\n organizationContext,\n scopeOptions,\n serverUrl,\n apiKey\n );\n\n const selection = {\n organization: organizationContext.organization,\n source,\n ...(profile ? { profile } : {}),\n ...(manualInputs ?? {}),\n };\n\n if (targetFile === \"user\") {\n const existing = (await loadUserConfigAsync()) ?? {};\n const path = await saveUserConfigAsync(\n buildScopedConfig(existing, selection)\n );\n outro(`Updated ${path}`);\n return;\n }\n\n const existing = (await loadProjectConfigAsync()) ?? {};\n const path = await saveProjectConfigAsync(\n buildScopedConfig(existing, selection)\n );\n outro(`Updated ${path}`);\n } catch (error) {\n loadSpinner.stop(\"Failed to load scope options\");\n log.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n}\n","import { createRequire } from \"node:module\";\nimport { Command } from \"commander\";\n\nconst require = createRequire(import.meta.url);\nconst { version: PACKAGE_VERSION } = require(\"../package.json\");\n\nimport {\n agentsCreateCommand,\n agentsGetCommand,\n agentsInstallCommand,\n agentsListCommand,\n agentsRemoveCommand,\n agentsUpdateCommand,\n} from \"./commands/agents.ts\";\nimport {\n authCommand,\n authLogoutCommand,\n authStatusCommand,\n} from \"./commands/auth.ts\";\nimport {\n projectsListCommand,\n rulesListCommand,\n skillsListCommand,\n} from \"./commands/discover.ts\";\nimport { installCommand } from \"./commands/install.ts\";\nimport { listCommand } from \"./commands/list.ts\";\nimport { mcpCommand } from \"./commands/mcp.ts\";\nimport {\n profilesCreateCommand,\n profilesGetCommand,\n profilesListCommand,\n profilesRemoveCommand,\n profilesSetDefaultCommand,\n profilesUpdateCommand,\n} from \"./commands/profiles.ts\";\nimport {\n projectsCreateCommand,\n projectsGetCommand,\n projectsRemoveCommand,\n projectsUpdateCommand,\n} from \"./commands/projects.ts\";\nimport {\n referencesCreateCommand,\n referencesGetCommand,\n referencesListCommand,\n referencesRemoveCommand,\n referencesReorderCommand,\n referencesUpdateCommand,\n} from \"./commands/references.ts\";\nimport { removeCommand } from \"./commands/remove.ts\";\nimport {\n rulesCreateCommand,\n rulesDisableCommand,\n rulesDuplicateCommand,\n rulesEnableCommand,\n rulesForkCommand,\n rulesGetCommand,\n rulesMoveCommand,\n rulesRemoveCommand,\n rulesSyncCheckCommand,\n rulesSyncDisableCommand,\n rulesSyncEnableCommand,\n rulesSyncHistoryCommand,\n rulesSyncNowCommand,\n rulesSyncStatusCommand,\n rulesUpdateCommand,\n} from \"./commands/rules.ts\";\nimport { scopeCommand } from \"./commands/scope.ts\";\nimport { updateCommand } from \"./commands/update.ts\";\nimport {\n workflowsActiveCommand,\n workflowsCancelCommand,\n workflowsCompleteCommand,\n workflowsFailCommand,\n workflowsListCommand,\n workflowsProgressCommand,\n workflowsStartCommand,\n} from \"./commands/workflows.ts\";\n\nconst program = new Command();\n\nprogram\n .name(\"braid\")\n .description(\n \"Install braid prompts as agent skills to your local development environment\"\n )\n .version(PACKAGE_VERSION);\n\nconst auth = program\n .command(\"auth\")\n .description(\"Configure API key for braid authentication\");\n\nauth\n .command(\"login\", { isDefault: true })\n .description(\"Authenticate with braid via browser login or API key\")\n .option(\"-s, --server <url>\", \"braid server URL (for review apps, local dev)\")\n .option(\n \"--token <token>\",\n \"API key for non-interactive login (skips device flow)\"\n )\n .option(\n \"--timeout <seconds>\",\n \"Device flow timeout in seconds (default: 300)\"\n )\n .option(\"--no-scope\", \"Skip scope setup after login\")\n .action(authCommand);\n\nauth\n .command(\"status\")\n .description(\"Show current authentication status\")\n .action(authStatusCommand);\n\nauth\n .command(\"logout\")\n .description(\"Remove stored API key\")\n .action(authLogoutCommand);\n\nprogram\n .command(\"install\")\n .alias(\"add\")\n .description(\n \"Install skills from a profile, project, or public source (@handle/slug)\"\n )\n .argument(\"[source]\", \"Public source to install from (e.g., @handle/slug)\")\n .option(\"-p, --profile <name>\", \"Profile name to install from\")\n .option(\n \"--org-projects <ids>\",\n \"Comma-separated organization project IDs to install from\"\n )\n .option(\n \"--personal-projects <ids>\",\n \"Comma-separated personal project IDs to install from\"\n )\n .option(\n \"--include-user-globals\",\n \"Include user's personal global prompts (default: true)\"\n )\n .option(\"--no-include-user-globals\", \"Exclude user's personal global prompts\")\n .option(\n \"--include-org-globals\",\n \"Include organization's global prompts (default: true)\"\n )\n .option(\"--no-include-org-globals\", \"Exclude organization's global prompts\")\n .option(\n \"-a, --agents <list>\",\n \"Comma-separated list of agents (e.g., claude-code,opencode)\"\n )\n .option(\"-g, --global\", \"Install to global agent directories\")\n .option(\"-y, --yes\", \"Skip confirmation prompts\")\n .option(\"-l, --list\", \"Preview skills without installing\")\n .option(\"-s, --server <url>\", \"braid server URL (for review apps, local dev)\")\n .action((source, options) => {\n if (source) {\n return installCommand(source, options);\n }\n return installCommand(options);\n });\n\nprogram\n .command(\"scope\")\n .description(\"Interactively configure braid.json or braid.user.json scope\")\n .option(\"--file <target>\", \"Config file target: user or project\")\n .option(\n \"--organization <type>\",\n \"Scope organization for non-interactive mode: personal or organization\"\n )\n .option(\n \"--source <source>\",\n \"Scope source for non-interactive mode: profile or manual\"\n )\n .option(\"--profile <name>\", \"Profile name for non-interactive mode\")\n .option(\n \"--projects <ids>\",\n \"Comma-separated project IDs for non-interactive mode\"\n )\n .option(\n \"--rule-ids <ids>\",\n \"Comma-separated included rule IDs for non-interactive mode\"\n )\n .option(\n \"--excluded-rule-ids <ids>\",\n \"Comma-separated excluded rule IDs for non-interactive mode\"\n )\n .option(\n \"--include-user-global\",\n \"Include personal global rules in non-interactive mode\"\n )\n .option(\n \"--include-org-global\",\n \"Include org global rules in non-interactive mode\"\n )\n .option(\"-s, --server <url>\", \"braid server URL (for review apps, local dev)\")\n .action(scopeCommand);\n\nprogram\n .command(\"list\")\n .alias(\"ls\")\n .description(\"List installed skills\")\n .option(\"-g, --global\", \"List skills in global directories only\")\n .action(listCommand);\n\nconst projects = program\n .command(\"projects\")\n .description(\"Discover available projects from braid\");\n\nprojects\n .command(\"list\")\n .description(\"List available personal and org projects\")\n .option(\"-s, --server <url>\", \"braid server URL (for review apps, local dev)\")\n .option(\"--api-key <token>\", \"API key override\")\n .option(\"--json\", \"Output JSON\")\n .action(projectsListCommand);\n\nprojects\n .command(\"get\")\n .description(\"Get a project by id\")\n .requiredOption(\"--id <id>\", \"Project ID\")\n .option(\"-s, --server <url>\", \"braid server URL (for review apps, local dev)\")\n .option(\"--api-key <token>\", \"API key override\")\n .option(\"--json\", \"Output JSON\")\n .action(projectsGetCommand);\n\nprojects\n .command(\"create\")\n .description(\"Create a project\")\n .requiredOption(\"--name <name>\", \"Project name\")\n .option(\"--description <description>\", \"Project description\")\n .option(\"--org-id <id>\", \"Organization ID\")\n .option(\"-s, --server <url>\", \"braid server URL (for review apps, local dev)\")\n .option(\"--api-key <token>\", \"API key override\")\n .option(\"--json\", \"Output JSON\")\n .action(projectsCreateCommand);\n\nprojects\n .command(\"update\")\n .description(\"Update a project\")\n .requiredOption(\"--id <id>\", \"Project ID\")\n .option(\"--name <name>\", \"Project name\")\n .option(\"--description <description>\", \"Project description\")\n .option(\"-s, --server <url>\", \"braid server URL (for review apps, local dev)\")\n .option(\"--api-key <token>\", \"API key override\")\n .option(\"--json\", \"Output JSON\")\n .action(projectsUpdateCommand);\n\nprojects\n .command(\"remove\")\n .description(\"Remove a project\")\n .requiredOption(\"--id <id>\", \"Project ID\")\n .option(\"-y, --yes\", \"Confirm destructive action\")\n .option(\"-s, --server <url>\", \"braid server URL (for review apps, local dev)\")\n .option(\"--api-key <token>\", \"API key override\")\n .option(\"--json\", \"Output JSON\")\n .action(projectsRemoveCommand);\n\nconst rules = program\n .command(\"rules\")\n .description(\"Discover available rules from braid\");\n\nrules\n .command(\"list\")\n .description(\"List available rules for a scope\")\n .option(\"-s, --server <url>\", \"braid server URL (for review apps, local dev)\")\n .option(\"--api-key <token>\", \"API key override\")\n .option(\"--org-id <id>\", \"Organization ID\")\n .option(\"--org-projects <ids>\", \"Comma-separated organization project IDs\")\n .option(\"--personal-projects <ids>\", \"Comma-separated personal project IDs\")\n .option(\"--include-user-global\", \"Include personal global rules\")\n .option(\"--include-org-global\", \"Include org global rules\")\n .option(\"--json\", \"Output JSON\")\n .action(rulesListCommand);\n\nrules\n .command(\"get\")\n .description(\"Get a rule by id\")\n .requiredOption(\"--id <id>\", \"Rule ID\")\n .option(\"-s, --server <url>\", \"braid server URL (for review apps, local dev)\")\n .option(\"--api-key <token>\", \"API key override\")\n .option(\"--json\", \"Output JSON\")\n .action(rulesGetCommand);\n\nrules\n .command(\"create\")\n .description(\"Create a rule\")\n .requiredOption(\"--title <title>\", \"Rule title\")\n .requiredOption(\"--content <content>\", \"Rule content\")\n .option(\"--project-id <id>\", \"Project ID\")\n .option(\"--tags <list>\", \"Comma-separated tags\")\n .option(\"--priority <priority>\", \"Priority\")\n .option(\"-s, --server <url>\", \"braid server URL (for review apps, local dev)\")\n .option(\"--api-key <token>\", \"API key override\")\n .option(\"--json\", \"Output JSON\")\n .action(rulesCreateCommand);\n\nrules\n .command(\"update\")\n .description(\"Update a rule\")\n .requiredOption(\"--id <id>\", \"Rule ID\")\n .option(\"--title <title>\", \"Rule title\")\n .option(\"--content <content>\", \"Rule content\")\n .option(\"--tags <list>\", \"Comma-separated tags\")\n .option(\"--priority <priority>\", \"Priority\")\n .option(\"-s, --server <url>\", \"braid server URL (for review apps, local dev)\")\n .option(\"--api-key <token>\", \"API key override\")\n .option(\"--json\", \"Output JSON\")\n .action(rulesUpdateCommand);\n\nrules\n .command(\"remove\")\n .description(\"Remove a rule\")\n .requiredOption(\"--id <id>\", \"Rule ID\")\n .option(\"-y, --yes\", \"Confirm destructive action\")\n .option(\"-s, --server <url>\", \"braid server URL (for review apps, local dev)\")\n .option(\"--api-key <token>\", \"API key override\")\n .option(\"--json\", \"Output JSON\")\n .action(rulesRemoveCommand);\n\nrules\n .command(\"enable\")\n .description(\"Enable a rule\")\n .requiredOption(\"--id <id>\", \"Rule ID\")\n .option(\"-s, --server <url>\", \"braid server URL (for review apps, local dev)\")\n .option(\"--api-key <token>\", \"API key override\")\n .option(\"--json\", \"Output JSON\")\n .action(rulesEnableCommand);\n\nrules\n .command(\"disable\")\n .description(\"Disable a rule\")\n .requiredOption(\"--id <id>\", \"Rule ID\")\n .option(\"-s, --server <url>\", \"braid server URL (for review apps, local dev)\")\n .option(\"--api-key <token>\", \"API key override\")\n .option(\"--json\", \"Output JSON\")\n .action(rulesDisableCommand);\n\nrules\n .command(\"move\")\n .description(\"Move a rule to a project\")\n .requiredOption(\"--id <id>\", \"Rule ID\")\n .requiredOption(\"--project-id <id>\", \"Project ID\")\n .option(\"-s, --server <url>\", \"braid server URL (for review apps, local dev)\")\n .option(\"--api-key <token>\", \"API key override\")\n .option(\"--json\", \"Output JSON\")\n .action(rulesMoveCommand);\n\nrules\n .command(\"duplicate\")\n .description(\"Duplicate a rule\")\n .requiredOption(\"--id <id>\", \"Rule ID\")\n .option(\"--target-project-id <id>\", \"Target project ID\")\n .option(\"-s, --server <url>\", \"braid server URL (for review apps, local dev)\")\n .option(\"--api-key <token>\", \"API key override\")\n .option(\"--json\", \"Output JSON\")\n .action(rulesDuplicateCommand);\n\nrules\n .command(\"fork\")\n .description(\"Fork a rule\")\n .requiredOption(\"--id <id>\", \"Rule ID\")\n .option(\"--target-project-id <id>\", \"Target project ID\")\n .option(\"-s, --server <url>\", \"braid server URL (for review apps, local dev)\")\n .option(\"--api-key <token>\", \"API key override\")\n .option(\"--json\", \"Output JSON\")\n .action(rulesForkCommand);\n\nrules\n .command(\"sync-status\")\n .description(\"Show sync status for one rule or all\")\n .option(\"--id <id>\", \"Rule ID\")\n .option(\"-s, --server <url>\", \"braid server URL (for review apps, local dev)\")\n .option(\"--api-key <token>\", \"API key override\")\n .option(\"--json\", \"Output JSON\")\n .action(rulesSyncStatusCommand);\n\nrules\n .command(\"sync-history\")\n .description(\"Show sync history for a rule\")\n .requiredOption(\"--id <id>\", \"Rule ID\")\n .option(\"-s, --server <url>\", \"braid server URL (for review apps, local dev)\")\n .option(\"--api-key <token>\", \"API key override\")\n .option(\"--json\", \"Output JSON\")\n .action(rulesSyncHistoryCommand);\n\nrules\n .command(\"sync-enable\")\n .description(\"Enable sync for a rule\")\n .requiredOption(\"--id <id>\", \"Rule ID\")\n .option(\"-s, --server <url>\", \"braid server URL (for review apps, local dev)\")\n .option(\"--api-key <token>\", \"API key override\")\n .option(\"--json\", \"Output JSON\")\n .action(rulesSyncEnableCommand);\n\nrules\n .command(\"sync-disable\")\n .description(\"Disable sync for a rule\")\n .requiredOption(\"--id <id>\", \"Rule ID\")\n .option(\"-s, --server <url>\", \"braid server URL (for review apps, local dev)\")\n .option(\"--api-key <token>\", \"API key override\")\n .option(\"--json\", \"Output JSON\")\n .action(rulesSyncDisableCommand);\n\nrules\n .command(\"sync-check\")\n .description(\"Check for upstream updates\")\n .requiredOption(\"--id <id>\", \"Rule ID\")\n .option(\"-s, --server <url>\", \"braid server URL (for review apps, local dev)\")\n .option(\"--api-key <token>\", \"API key override\")\n .option(\"--json\", \"Output JSON\")\n .action(rulesSyncCheckCommand);\n\nrules\n .command(\"sync-now\")\n .description(\"Run sync now\")\n .requiredOption(\"--id <id>\", \"Rule ID\")\n .option(\"-s, --server <url>\", \"braid server URL (for review apps, local dev)\")\n .option(\"--api-key <token>\", \"API key override\")\n .option(\"--json\", \"Output JSON\")\n .action(rulesSyncNowCommand);\n\nconst skills = program\n .command(\"skills\")\n .description(\"Discover available skills from braid\");\n\nskills\n .command(\"list\")\n .description(\"List available skills for a profile or project scope\")\n .option(\"-s, --server <url>\", \"braid server URL (for review apps, local dev)\")\n .option(\"--api-key <token>\", \"API key override\")\n .option(\"-p, --profile <name>\", \"Profile name\")\n .option(\"--org-projects <ids>\", \"Comma-separated organization project IDs\")\n .option(\"--personal-projects <ids>\", \"Comma-separated personal project IDs\")\n .option(\"--include-user-global\", \"Include personal global rules\")\n .option(\"--include-org-global\", \"Include org global rules\")\n .option(\"--json\", \"Output JSON\")\n .action(skillsListCommand);\n\nconst profiles = program\n .command(\"profiles\")\n .description(\"Manage scope profiles\");\n\nprofiles\n .command(\"list\")\n .description(\"List profiles\")\n .option(\"-s, --server <url>\", \"braid server URL (for review apps, local dev)\")\n .option(\"--api-key <token>\", \"API key override\")\n .option(\"--json\", \"Output JSON\")\n .action(profilesListCommand);\n\nprofiles\n .command(\"get\")\n .description(\"Get profile by id or name\")\n .option(\"--id <id>\", \"Profile ID\")\n .option(\"--name <name>\", \"Profile name\")\n .option(\"-s, --server <url>\", \"braid server URL (for review apps, local dev)\")\n .option(\"--api-key <token>\", \"API key override\")\n .option(\"--json\", \"Output JSON\")\n .action(profilesGetCommand);\n\nprofiles\n .command(\"create\")\n .description(\"Create profile\")\n .requiredOption(\"--name <name>\", \"Profile name\")\n .option(\"--context-json <json>\", \"Context JSON\")\n .option(\"-s, --server <url>\", \"braid server URL (for review apps, local dev)\")\n .option(\"--api-key <token>\", \"API key override\")\n .option(\"--json\", \"Output JSON\")\n .action(profilesCreateCommand);\n\nprofiles\n .command(\"update\")\n .description(\"Update profile\")\n .requiredOption(\"--id <id>\", \"Profile ID\")\n .option(\"--name <name>\", \"Profile name\")\n .option(\"--context-json <json>\", \"Context JSON\")\n .option(\"-s, --server <url>\", \"braid server URL (for review apps, local dev)\")\n .option(\"--api-key <token>\", \"API key override\")\n .option(\"--json\", \"Output JSON\")\n .action(profilesUpdateCommand);\n\nprofiles\n .command(\"remove\")\n .description(\"Remove profile\")\n .requiredOption(\"--id <id>\", \"Profile ID\")\n .option(\"-y, --yes\", \"Confirm destructive action\")\n .option(\"-s, --server <url>\", \"braid server URL (for review apps, local dev)\")\n .option(\"--api-key <token>\", \"API key override\")\n .option(\"--json\", \"Output JSON\")\n .action(profilesRemoveCommand);\n\nprofiles\n .command(\"set-default\")\n .description(\"Set default profile\")\n .requiredOption(\"--id <id>\", \"Profile ID\")\n .option(\"-s, --server <url>\", \"braid server URL (for review apps, local dev)\")\n .option(\"--api-key <token>\", \"API key override\")\n .option(\"--json\", \"Output JSON\")\n .action(profilesSetDefaultCommand);\n\nconst agents = program.command(\"agents\").description(\"Manage agent artifacts\");\n\nconst workflows = program\n .command(\"workflows\")\n .description(\"Manage local workflow execution lifecycle\");\n\nworkflows\n .command(\"list\")\n .description(\"List control flows available for execution\")\n .option(\"--project-id <id>\", \"Project ID filter\")\n .option(\"-s, --server <url>\", \"braid server URL (for review apps, local dev)\")\n .option(\"--api-key <token>\", \"API key override\")\n .option(\"--json\", \"Output JSON\")\n .action(workflowsListCommand);\n\nworkflows\n .command(\"start\")\n .description(\"Start a workflow execution for a CLI session\")\n .requiredOption(\"--session-id <id>\", \"CLI session ID\")\n .requiredOption(\"--flow-id <id>\", \"Control flow ID\")\n .option(\"--current-node-id <id>\", \"Current node ID\")\n .option(\"--current-step-label <label>\", \"Current step label\")\n .option(\"--metadata <json>\", \"JSON metadata payload\")\n .option(\"-s, --server <url>\", \"braid server URL (for review apps, local dev)\")\n .option(\"--api-key <token>\", \"API key override\")\n .option(\"--json\", \"Output JSON\")\n .action(workflowsStartCommand);\n\nworkflows\n .command(\"progress\")\n .description(\"Update workflow execution progress\")\n .requiredOption(\"--execution-id <id>\", \"Workflow execution ID\")\n .option(\"--current-node-id <id>\", \"Current node ID\")\n .option(\"--current-step-label <label>\", \"Current step label\")\n .option(\"--metadata <json>\", \"JSON metadata payload\")\n .option(\"-s, --server <url>\", \"braid server URL (for review apps, local dev)\")\n .option(\"--api-key <token>\", \"API key override\")\n .option(\"--json\", \"Output JSON\")\n .action(workflowsProgressCommand);\n\nworkflows\n .command(\"active\")\n .description(\"Get active workflow execution for a CLI session\")\n .requiredOption(\"--session-id <id>\", \"CLI session ID\")\n .option(\"-s, --server <url>\", \"braid server URL (for review apps, local dev)\")\n .option(\"--api-key <token>\", \"API key override\")\n .option(\"--json\", \"Output JSON\")\n .action(workflowsActiveCommand);\n\nworkflows\n .command(\"complete\")\n .description(\"Mark a workflow execution complete\")\n .requiredOption(\"--execution-id <id>\", \"Workflow execution ID\")\n .option(\"-s, --server <url>\", \"braid server URL (for review apps, local dev)\")\n .option(\"--api-key <token>\", \"API key override\")\n .option(\"--json\", \"Output JSON\")\n .action(workflowsCompleteCommand);\n\nworkflows\n .command(\"fail\")\n .description(\"Mark a workflow execution failed\")\n .requiredOption(\"--execution-id <id>\", \"Workflow execution ID\")\n .option(\"--error-message <message>\", \"Failure message\")\n .option(\"-s, --server <url>\", \"braid server URL (for review apps, local dev)\")\n .option(\"--api-key <token>\", \"API key override\")\n .option(\"--json\", \"Output JSON\")\n .action(workflowsFailCommand);\n\nworkflows\n .command(\"cancel\")\n .description(\"Cancel a workflow execution\")\n .requiredOption(\"--execution-id <id>\", \"Workflow execution ID\")\n .option(\"-s, --server <url>\", \"braid server URL (for review apps, local dev)\")\n .option(\"--api-key <token>\", \"API key override\")\n .option(\"--json\", \"Output JSON\")\n .action(workflowsCancelCommand);\n\nagents\n .command(\"list\")\n .description(\"List saved agents\")\n .option(\"-s, --server <url>\", \"braid server URL (for review apps, local dev)\")\n .option(\"--api-key <token>\", \"API key override\")\n .option(\"--json\", \"Output JSON\")\n .action(agentsListCommand);\n\nagents\n .command(\"get\")\n .description(\"Get an agent by id\")\n .requiredOption(\"--id <id>\", \"Agent ID\")\n .option(\"-s, --server <url>\", \"braid server URL (for review apps, local dev)\")\n .option(\"--api-key <token>\", \"API key override\")\n .option(\"--json\", \"Output JSON\")\n .action(agentsGetCommand);\n\nagents\n .command(\"create\")\n .description(\"Create an agent\")\n .requiredOption(\"--name <name>\", \"Agent name\")\n .requiredOption(\"--description <description>\", \"Agent description\")\n .requiredOption(\"--prompt <prompt>\", \"Agent system prompt\")\n .option(\"--scope <scope>\", \"Scope: global or project\")\n .option(\"--project-id <id>\", \"Project ID for project-scoped agent\")\n .option(\"--mode <mode>\", \"Mode: primary, subagent, all\")\n .option(\"--model <model>\", \"Model override\")\n .option(\"--skills <list>\", \"Comma-separated skill names\")\n .option(\"-s, --server <url>\", \"braid server URL (for review apps, local dev)\")\n .option(\"--api-key <token>\", \"API key override\")\n .option(\"--json\", \"Output JSON\")\n .action(agentsCreateCommand);\n\nagents\n .command(\"update\")\n .description(\"Update an agent\")\n .requiredOption(\"--id <id>\", \"Agent ID\")\n .option(\"--name <name>\", \"Agent name\")\n .option(\"--description <description>\", \"Agent description\")\n .option(\"--prompt <prompt>\", \"Agent system prompt\")\n .option(\"--mode <mode>\", \"Mode: primary, subagent, all\")\n .option(\"--model <model>\", \"Model override\")\n .option(\"--skills <list>\", \"Comma-separated skill names\")\n .option(\"-s, --server <url>\", \"braid server URL (for review apps, local dev)\")\n .option(\"--api-key <token>\", \"API key override\")\n .option(\"--json\", \"Output JSON\")\n .action(agentsUpdateCommand);\n\nagents\n .command(\"remove\")\n .description(\"Remove an agent\")\n .requiredOption(\"--id <id>\", \"Agent ID\")\n .option(\"-y, --yes\", \"Confirm destructive action\")\n .option(\"-s, --server <url>\", \"braid server URL (for review apps, local dev)\")\n .option(\"--api-key <token>\", \"API key override\")\n .option(\"--json\", \"Output JSON\")\n .action(agentsRemoveCommand);\n\nagents\n .command(\"install\")\n .description(\"Install a saved agent to local coding tools\")\n .requiredOption(\"--id <id>\", \"Agent ID\")\n .option(\n \"-a, --agents <list>\",\n \"Comma-separated list of target coding tools (eg. claude-code,opencode)\"\n )\n .option(\"-g, --global\", \"Install to global agent directories\")\n .option(\"-s, --server <url>\", \"braid server URL (for review apps, local dev)\")\n .option(\"--api-key <token>\", \"API key override\")\n .option(\"--json\", \"Output JSON\")\n .action(agentsInstallCommand);\n\nconst references = program\n .command(\"references\")\n .description(\"Manage rule references\");\n\nreferences\n .command(\"list\")\n .description(\"List references for a rule\")\n .requiredOption(\"--rule-id <id>\", \"Rule ID\")\n .option(\"-s, --server <url>\", \"braid server URL (for review apps, local dev)\")\n .option(\"--api-key <token>\", \"API key override\")\n .option(\"--json\", \"Output JSON\")\n .action(referencesListCommand);\n\nreferences\n .command(\"get\")\n .description(\"Get a reference by id\")\n .requiredOption(\"--id <id>\", \"Reference ID\")\n .option(\"-s, --server <url>\", \"braid server URL (for review apps, local dev)\")\n .option(\"--api-key <token>\", \"API key override\")\n .option(\"--json\", \"Output JSON\")\n .action(referencesGetCommand);\n\nreferences\n .command(\"create\")\n .description(\"Create a reference from file\")\n .requiredOption(\"--rule-id <id>\", \"Rule ID\")\n .requiredOption(\"--file <path>\", \"Reference file path\")\n .option(\"-s, --server <url>\", \"braid server URL (for review apps, local dev)\")\n .option(\"--api-key <token>\", \"API key override\")\n .option(\"--json\", \"Output JSON\")\n .action(referencesCreateCommand);\n\nreferences\n .command(\"update\")\n .description(\"Update reference metadata\")\n .requiredOption(\"--id <id>\", \"Reference ID\")\n .option(\"--label <label>\", \"Reference label\")\n .option(\"--replace-file <path>\", \"Replace reference with file\")\n .option(\"-s, --server <url>\", \"braid server URL (for review apps, local dev)\")\n .option(\"--api-key <token>\", \"API key override\")\n .option(\"--json\", \"Output JSON\")\n .action(referencesUpdateCommand);\n\nreferences\n .command(\"remove\")\n .description(\"Remove reference\")\n .requiredOption(\"--id <id>\", \"Reference ID\")\n .option(\"-y, --yes\", \"Confirm destructive action\")\n .option(\"-s, --server <url>\", \"braid server URL (for review apps, local dev)\")\n .option(\"--api-key <token>\", \"API key override\")\n .option(\"--json\", \"Output JSON\")\n .action(referencesRemoveCommand);\n\nreferences\n .command(\"reorder\")\n .description(\"Reorder references\")\n .requiredOption(\"--rule-id <id>\", \"Rule ID\")\n .requiredOption(\"--ordered-ids <ids>\", \"Comma-separated reference IDs\")\n .option(\"-s, --server <url>\", \"braid server URL (for review apps, local dev)\")\n .option(\"--api-key <token>\", \"API key override\")\n .option(\"--json\", \"Output JSON\")\n .action(referencesReorderCommand);\n\nprogram\n .command(\"update\")\n .alias(\"up\")\n .description(\"Update installed skills to the latest version\")\n .option(\"-g, --global\", \"Update skills in global directories only\")\n .option(\"-y, --yes\", \"Skip confirmation prompts\")\n .option(\"-s, --server <url>\", \"braid server URL (for review apps, local dev)\")\n .action(updateCommand);\n\nprogram\n .command(\"remove\")\n .alias(\"rm\")\n .description(\"Remove installed skills\")\n .option(\"-a, --all\", \"Remove all installed skills\")\n .option(\"-g, --global\", \"Remove skills from global directories only\")\n .option(\"-y, --yes\", \"Skip confirmation prompts\")\n .option(\"--skill <name>\", \"Remove a specific skill by name\")\n .action(removeCommand);\n\nprogram\n .command(\"mcp\")\n .description(\"Configure braid MCP in your AI coding tools\")\n .option(\"-t, --tool <name>\", \"Tool to configure\")\n .option(\"-g, --global\", \"Use global config instead of project\")\n .option(\"--token <token>\", \"API token to embed\")\n .option(\"--no-auth\", \"Skip authentication setup\")\n .option(\"--scope\", \"Run interactive scope configuration\")\n .option(\"--remove\", \"Remove braid MCP from a tool\")\n .option(\"--status\", \"Show which tools have braid MCP configured\")\n .option(\"--help-commands\", \"Show MCP manual command reference\")\n .option(\"-y, --yes\", \"Skip confirmation prompts\")\n .option(\"-s, --server <url>\", \"Custom MCP server URL\")\n .action(mcpCommand);\n\nprogram.parse();\n","import type { CanonicalAgentSpec } from \"../lib/agent-writer.ts\";\nimport { writeAgentsForPlatformAsync } from \"../lib/agent-writer.ts\";\nimport {\n detectAgentsAsync,\n getAgentById,\n resolveAgentsInstallPath,\n resolveInstallPath,\n} from \"../lib/agents.ts\";\nimport { runLifecycleCommandAsync } from \"../lib/api.ts\";\nimport { log } from \"../lib/tui.ts\";\n\ninterface LifecycleOptions {\n server?: string;\n apiKey?: string;\n json?: boolean;\n}\n\ninterface AgentIdOptions extends LifecycleOptions {\n id?: string;\n}\n\ninterface AgentCreateOptions extends LifecycleOptions {\n name?: string;\n description?: string;\n prompt?: string;\n scope?: \"global\" | \"project\";\n projectId?: string;\n model?: string;\n mode?: \"primary\" | \"subagent\" | \"all\";\n skills?: string;\n}\n\ninterface AgentUpdateOptions extends AgentIdOptions {\n name?: string;\n description?: string;\n prompt?: string;\n model?: string;\n mode?: \"primary\" | \"subagent\" | \"all\";\n skills?: string;\n}\n\ninterface AgentRemoveOptions extends AgentIdOptions {\n yes?: boolean;\n}\n\ninterface AgentInstallOptions extends AgentIdOptions {\n agents?: string;\n global?: boolean;\n}\n\nconst parseCsv = (input?: string): string[] | undefined => {\n if (!input) {\n return undefined;\n }\n const values = input\n .split(\",\")\n .map((value) => value.trim())\n .filter((value) => value.length > 0);\n return values.length > 0 ? values : undefined;\n};\n\nconst writeJson = (value: unknown): void => {\n process.stdout.write(`${JSON.stringify(value, null, 2)}\\n`);\n};\n\nconst fail = (message: string): never => {\n throw new Error(message);\n};\n\nconst exitWithError = (error: unknown): never => {\n const message = error instanceof Error ? error.message : String(error);\n log.error(message);\n process.exit(1);\n};\n\nconst run = (\n command: string,\n args: Record<string, unknown>,\n options: LifecycleOptions\n): Promise<unknown> => {\n const apiOptions = {\n ...(options.server ? { serverUrl: options.server } : {}),\n ...(options.apiKey ? { apiKey: options.apiKey } : {}),\n };\n\n return runLifecycleCommandAsync(\n {\n domain: \"agents\",\n command,\n args,\n },\n apiOptions\n );\n};\n\nconst getAgentCandidate = (value: unknown): unknown => {\n if (typeof value === \"object\" && value !== null && \"agent\" in value) {\n return (value as { agent: unknown }).agent;\n }\n return value;\n};\n\nconst getMode = (mode: unknown): CanonicalAgentSpec[\"mode\"] | undefined => {\n if (mode === \"primary\" || mode === \"subagent\" || mode === \"all\") {\n return mode;\n }\n return undefined;\n};\n\nconst getRawSkills = (\n agent: Record<string, unknown>\n): unknown[] | undefined => {\n if (Array.isArray(agent.skillNames)) {\n return agent.skillNames;\n }\n if (Array.isArray(agent.skills)) {\n return agent.skills;\n }\n return undefined;\n};\n\nconst normalizeSpec = (value: unknown): CanonicalAgentSpec => {\n const candidate = getAgentCandidate(value);\n\n if (typeof candidate !== \"object\" || candidate === null) {\n throw new Error(\"Invalid agent payload from API\");\n }\n\n const agent = candidate as Record<string, unknown>;\n const name = typeof agent.name === \"string\" ? agent.name : undefined;\n const description =\n typeof agent.description === \"string\" ? agent.description : undefined;\n const promptFromPrompt =\n typeof agent.prompt === \"string\" ? agent.prompt : undefined;\n const promptFromContent =\n typeof agent.content === \"string\" ? agent.content : undefined;\n const prompt = promptFromPrompt ?? promptFromContent;\n\n if (!(name && description && prompt)) {\n throw new Error(\n \"Agent payload missing required fields: name, description, prompt\"\n );\n }\n\n const result: CanonicalAgentSpec = {\n name,\n description,\n prompt,\n };\n\n const mode = getMode(agent.mode);\n if (mode) {\n result.mode = mode;\n }\n if (typeof agent.model === \"string\") {\n result.model = agent.model;\n }\n const rawSkills = getRawSkills(agent);\n\n if (rawSkills) {\n result.linkedSkillNames = rawSkills.filter(\n (item): item is string => typeof item === \"string\"\n );\n }\n\n return result;\n};\n\nconst resolveInstallTargets = async (\n options: AgentInstallOptions\n): Promise<NonNullable<ReturnType<typeof getAgentById>>[]> => {\n if (options.agents) {\n const ids = parseCsv(options.agents) ?? [];\n const selected = ids\n .map((id) => getAgentById(id as never))\n .filter(\n (agent): agent is NonNullable<typeof agent> => agent !== undefined\n );\n if (selected.length === 0) {\n fail(\"No valid target agents selected\");\n }\n return selected;\n }\n\n const detected = await detectAgentsAsync();\n const filtered = detected.filter((agent) =>\n options.global ? agent.hasGlobalConfig : agent.hasProjectConfig\n );\n if (filtered.length === 0) {\n fail(\n \"No supported local agent installations detected. Use --agents to select targets.\"\n );\n }\n return filtered;\n};\n\nexport async function agentsListCommand(\n options: LifecycleOptions\n): Promise<void> {\n try {\n const result = await run(\"list\", {}, options);\n if (options.json) {\n writeJson(result);\n return;\n }\n log.success(\"agents list completed\");\n writeJson(result);\n } catch (error) {\n exitWithError(error);\n }\n}\n\nexport async function agentsGetCommand(options: AgentIdOptions): Promise<void> {\n try {\n const id = options.id ?? fail(\"agents get requires --id\");\n const result = await run(\"get\", { id }, options);\n if (options.json) {\n writeJson(result);\n return;\n }\n log.success(\"agents get completed\");\n writeJson(result);\n } catch (error) {\n exitWithError(error);\n }\n}\n\nexport async function agentsCreateCommand(\n options: AgentCreateOptions\n): Promise<void> {\n try {\n const name = options.name ?? fail(\"agents create requires --name\");\n const description =\n options.description ?? fail(\"agents create requires --description\");\n const prompt = options.prompt ?? fail(\"agents create requires --prompt\");\n\n const result = await run(\n \"create\",\n {\n name,\n description,\n prompt,\n scope: options.scope,\n projectId: options.projectId,\n model: options.model,\n mode: options.mode,\n skills: parseCsv(options.skills),\n },\n options\n );\n\n if (options.json) {\n writeJson(result);\n return;\n }\n log.success(\"agents create completed\");\n } catch (error) {\n exitWithError(error);\n }\n}\n\nexport async function agentsUpdateCommand(\n options: AgentUpdateOptions\n): Promise<void> {\n try {\n const id = options.id ?? fail(\"agents update requires --id\");\n const result = await run(\n \"update\",\n {\n id,\n name: options.name,\n description: options.description,\n prompt: options.prompt,\n model: options.model,\n mode: options.mode,\n skills: parseCsv(options.skills),\n },\n options\n );\n if (options.json) {\n writeJson(result);\n return;\n }\n log.success(\"agents update completed\");\n } catch (error) {\n exitWithError(error);\n }\n}\n\nexport async function agentsRemoveCommand(\n options: AgentRemoveOptions\n): Promise<void> {\n try {\n const id = options.id ?? fail(\"agents remove requires --id\");\n if (!options.yes) {\n fail(\"agents remove requires --yes\");\n }\n const result = await run(\"remove\", { id, yes: true }, options);\n if (options.json) {\n writeJson(result);\n return;\n }\n log.success(\"agents remove completed\");\n } catch (error) {\n exitWithError(error);\n }\n}\n\nexport async function agentsInstallCommand(\n options: AgentInstallOptions\n): Promise<void> {\n try {\n const id = options.id ?? fail(\"agents install requires --id\");\n const payload = await run(\"get\", { id }, options);\n const spec = normalizeSpec(payload);\n const targets = await resolveInstallTargets(options);\n\n const summary: Array<{\n platform: string;\n installPath?: string;\n written: number;\n warnings: string[];\n errors: Array<{ agent: string; error: string }>;\n }> = [];\n\n for (const target of targets) {\n const installPath =\n resolveAgentsInstallPath(target, { global: options.global === true }) ??\n resolveInstallPath(target, { global: options.global === true });\n\n if (!installPath) {\n summary.push({\n platform: target.id,\n written: 0,\n warnings: [\"No install path available for this platform\"],\n errors: [],\n });\n continue;\n }\n\n const result = await writeAgentsForPlatformAsync(\n target,\n [spec],\n installPath\n );\n summary.push({\n platform: target.id,\n installPath,\n written: result.written.length,\n warnings: result.warnings,\n errors: result.errors,\n });\n }\n\n if (options.json) {\n writeJson(summary);\n return;\n }\n\n for (const item of summary) {\n log.info(\n `${item.platform}: ${item.written} file(s) written${item.installPath ? ` to ${item.installPath}` : \"\"}`\n );\n for (const warning of item.warnings) {\n log.warn(` warning: ${warning}`);\n }\n for (const error of item.errors) {\n log.error(` error (${error.agent}): ${error.error}`);\n }\n }\n\n log.success(\"agents install completed\");\n } catch (error) {\n exitWithError(error);\n }\n}\n","import { mkdir, writeFile } from \"node:fs/promises\";\nimport { dirname, resolve, sep } from \"node:path\";\nimport { Data, Effect, pipe } from \"effect\";\nimport { resolveProfile } from \"./agent-adapters.ts\";\nimport type { AgentConfig } from \"./agents.ts\";\n\ninterface CanonicalAgentSpec {\n name: string;\n description: string;\n prompt: string;\n mode?: \"primary\" | \"subagent\" | \"all\";\n model?: string;\n tools?: unknown;\n permission?: unknown;\n steps?: number;\n temperature?: number;\n topP?: number;\n hidden?: boolean;\n color?: string;\n linkedSkillNames?: string[];\n additional?: Record<string, unknown>;\n}\n\ninterface WriteAgentsResult {\n written: string[];\n warnings: string[];\n errors: Array<{ agent: string; error: string }>;\n}\n\nclass AgentWriteError extends Data.TaggedError(\"AgentWriteError\")<{\n path: string;\n operation: \"mkdir\" | \"write\";\n cause: unknown;\n}> {}\n\nconst isObjectRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\nconst slugify = (value: string): string =>\n value\n .toLowerCase()\n .replace(/[^a-z0-9\\s-]/g, \"\")\n .replace(/\\s+/g, \"-\")\n .replace(/-+/g, \"-\")\n .replace(/^-|-$/g, \"\");\n\nconst escapeYaml = (value: string): string =>\n value.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, '\\\\\"');\n\nconst toYamlLines = (key: string, value: unknown, indent = 0): string[] => {\n const prefix = \" \".repeat(indent);\n const nestedPrefix = \" \".repeat(indent + 2);\n\n if (typeof value === \"string\") {\n return [`${prefix}${key}: \"${escapeYaml(value)}\"`];\n }\n\n if (typeof value === \"number\" || typeof value === \"boolean\") {\n return [`${prefix}${key}: ${value}`];\n }\n\n if (Array.isArray(value)) {\n if (value.length === 0) {\n return [`${prefix}${key}: []`];\n }\n return [\n `${prefix}${key}:`,\n ...value.map((item) => {\n if (\n typeof item === \"string\" ||\n typeof item === \"number\" ||\n typeof item === \"boolean\"\n ) {\n return `${nestedPrefix}- ${typeof item === \"string\" ? `\"${escapeYaml(item)}\"` : item}`;\n }\n if (isObjectRecord(item)) {\n const nested = Object.entries(item).flatMap(\n ([nestedKey, nestedValue]) =>\n toYamlLines(nestedKey, nestedValue, indent + 4)\n );\n return `${nestedPrefix}-\\n${nested.join(\"\\n\")}`;\n }\n return `${nestedPrefix}- null`;\n }),\n ];\n }\n\n if (isObjectRecord(value)) {\n const entries = Object.entries(value);\n if (entries.length === 0) {\n return [`${prefix}${key}: {}`];\n }\n return [\n `${prefix}${key}:`,\n ...entries.flatMap(([nestedKey, nestedValue]) =>\n toYamlLines(nestedKey, nestedValue, indent + 2)\n ),\n ];\n }\n\n return [];\n};\n\nconst buildClaudeMarkdown = (spec: CanonicalAgentSpec): string => {\n const lines: string[] = [\"---\"];\n lines.push(...toYamlLines(\"name\", spec.name));\n lines.push(...toYamlLines(\"description\", spec.description));\n\n if (spec.model) {\n lines.push(...toYamlLines(\"model\", spec.model));\n }\n if (spec.tools !== undefined) {\n lines.push(...toYamlLines(\"tools\", spec.tools));\n }\n if (spec.permission !== undefined) {\n lines.push(...toYamlLines(\"permissionMode\", spec.permission));\n }\n if (spec.steps !== undefined) {\n lines.push(...toYamlLines(\"maxTurns\", spec.steps));\n }\n if (spec.temperature !== undefined) {\n lines.push(...toYamlLines(\"temperature\", spec.temperature));\n }\n if (spec.linkedSkillNames && spec.linkedSkillNames.length > 0) {\n lines.push(...toYamlLines(\"skills\", spec.linkedSkillNames));\n }\n if (spec.additional) {\n for (const [key, value] of Object.entries(spec.additional)) {\n lines.push(...toYamlLines(key, value));\n }\n }\n\n lines.push(\"---\", \"\", spec.prompt.trim(), \"\");\n return lines.join(\"\\n\");\n};\n\nconst buildOpenCodeMarkdown = (spec: CanonicalAgentSpec): string => {\n const lines: string[] = [\"---\"];\n lines.push(...toYamlLines(\"description\", spec.description));\n\n if (spec.mode) {\n lines.push(...toYamlLines(\"mode\", spec.mode));\n }\n if (spec.model) {\n lines.push(...toYamlLines(\"model\", spec.model));\n }\n if (spec.tools !== undefined) {\n lines.push(...toYamlLines(\"tools\", spec.tools));\n }\n if (spec.permission !== undefined) {\n lines.push(...toYamlLines(\"permission\", spec.permission));\n }\n if (spec.steps !== undefined) {\n lines.push(...toYamlLines(\"steps\", spec.steps));\n }\n if (spec.temperature !== undefined) {\n lines.push(...toYamlLines(\"temperature\", spec.temperature));\n }\n if (spec.topP !== undefined) {\n lines.push(...toYamlLines(\"top_p\", spec.topP));\n }\n if (spec.hidden !== undefined) {\n lines.push(...toYamlLines(\"hidden\", spec.hidden));\n }\n if (spec.color) {\n lines.push(...toYamlLines(\"color\", spec.color));\n }\n if (spec.additional) {\n for (const [key, value] of Object.entries(spec.additional)) {\n lines.push(...toYamlLines(key, value));\n }\n }\n\n lines.push(\"---\", \"\", spec.prompt.trim(), \"\");\n return lines.join(\"\\n\");\n};\n\nconst buildCompatMarkdown = (\n spec: CanonicalAgentSpec,\n source: string\n): string =>\n [\n \"# Compatibility Agent\",\n \"\",\n `Source: ${source}`,\n `Name: ${spec.name}`,\n \"\",\n spec.prompt.trim(),\n \"\",\n ].join(\"\\n\");\n\nconst assertWithinBase = (basePath: string, filename: string): string => {\n const resolvedBase = resolve(basePath);\n const resolvedPath = resolve(basePath, filename);\n if (\n resolvedPath !== resolvedBase &&\n !resolvedPath.startsWith(`${resolvedBase}${sep}`)\n ) {\n throw new Error(`Path traversal detected: ${filename}`);\n }\n return resolvedPath;\n};\n\nconst writeSingleAgent = (\n installPath: string,\n platform: AgentConfig,\n spec: CanonicalAgentSpec\n): Effect.Effect<{ written: string; warnings: string[] }, AgentWriteError> =>\n Effect.tryPromise({\n try: async () => {\n const profile = resolveProfile(platform);\n const fileStem = slugify(spec.name) || \"agent\";\n const filename = `${fileStem}.md`;\n const fullPath = assertWithinBase(installPath, filename);\n\n await mkdir(dirname(fullPath), { recursive: true });\n\n const warnings: string[] = [];\n let content: string;\n\n if (platform.id === \"claude-code\") {\n if (spec.mode === \"primary\") {\n warnings.push(\n \"Claude adapter does not support primary mode; using subagent semantics.\"\n );\n }\n content = buildClaudeMarkdown(spec);\n } else if (platform.id === \"opencode\") {\n content = buildOpenCodeMarkdown(spec);\n } else {\n warnings.push(\n `Platform ${platform.id} uses ${profile.tier} adapter with compatibility output.`\n );\n content = buildCompatMarkdown(spec, platform.name);\n }\n\n await writeFile(fullPath, content, \"utf-8\");\n return { written: fullPath, warnings };\n },\n catch: (cause) =>\n new AgentWriteError({ path: installPath, operation: \"write\", cause }),\n });\n\nconst writeAgentsForPlatform = (\n platform: AgentConfig,\n specs: CanonicalAgentSpec[],\n installPath: string\n): Effect.Effect<WriteAgentsResult, never> =>\n pipe(\n Effect.forEach(\n specs,\n (spec) =>\n pipe(\n writeSingleAgent(installPath, platform, spec),\n Effect.map((result) => ({\n success: true as const,\n written: result.written,\n warnings: result.warnings,\n })),\n Effect.catchAll((error) =>\n Effect.succeed({\n success: false as const,\n error:\n error.cause instanceof Error\n ? error.cause.message\n : String(error.cause),\n specName: spec.name,\n })\n )\n ),\n { concurrency: \"unbounded\" }\n ),\n Effect.map((results) => {\n const written = results\n .filter((r) => r.success)\n .map((r) => r.written)\n .sort();\n const warnings = results\n .filter((r) => r.success)\n .flatMap((r) => r.warnings);\n const errors = results\n .filter(\n (\n r\n ): r is {\n success: false;\n error: string;\n specName: string;\n } => !r.success\n )\n .map((r) => ({ agent: r.specName, error: r.error }));\n\n return { written, warnings, errors };\n })\n );\n\nconst writeAgentsForPlatformAsync = (\n platform: AgentConfig,\n specs: CanonicalAgentSpec[],\n installPath: string\n): Promise<WriteAgentsResult> =>\n Effect.runPromise(writeAgentsForPlatform(platform, specs, installPath));\n\nexport type { CanonicalAgentSpec, WriteAgentsResult };\nexport { writeAgentsForPlatform, writeAgentsForPlatformAsync };\n","import type { AgentConfig, AgentId } from \"./agents.ts\";\n\ntype AgentCapabilityTier = \"native\" | \"mapped\" | \"compat\";\n\ninterface FrontmatterKeyMap {\n canonical: string;\n claude?: string;\n opencode?: string;\n notes?: string;\n}\n\ninterface AgentAdapterProfile {\n tier: AgentCapabilityTier;\n supportsGlobalInstall: boolean;\n supportsProjectInstall: boolean;\n agentConfigPath?: string;\n notes?: string;\n}\n\ninterface CanonicalAgentField {\n key: string;\n required: boolean;\n description: string;\n}\n\nconst CANONICAL_AGENT_FIELDS: CanonicalAgentField[] = [\n {\n key: \"name\",\n required: true,\n description: \"Stable identifier used for filename and mentions.\",\n },\n {\n key: \"description\",\n required: true,\n description: \"Routing hint that tells the host when to invoke the agent.\",\n },\n {\n key: \"prompt\",\n required: true,\n description: \"Main system prompt body.\",\n },\n {\n key: \"scope\",\n required: true,\n description:\n \"global or project install scope used for validation and output path.\",\n },\n {\n key: \"linkedSkillIds\",\n required: false,\n description:\n \"Skill IDs referenced by this agent, validated by scope rules.\",\n },\n {\n key: \"mode\",\n required: false,\n description:\n \"primary, subagent, or all; downgraded by adapters if unsupported.\",\n },\n {\n key: \"model\",\n required: false,\n description: \"Provider/model override.\",\n },\n {\n key: \"tools\",\n required: false,\n description: \"Tool allow/deny map or list depending on target platform.\",\n },\n {\n key: \"permission\",\n required: false,\n description: \"Permission policy, including task/subagent permissions.\",\n },\n {\n key: \"steps\",\n required: false,\n description: \"Maximum iterative agentic steps.\",\n },\n {\n key: \"temperature\",\n required: false,\n description: \"Sampling temperature.\",\n },\n {\n key: \"topP\",\n required: false,\n description: \"Nucleus sampling parameter.\",\n },\n {\n key: \"hidden\",\n required: false,\n description: \"Hide from manual picker where supported.\",\n },\n {\n key: \"color\",\n required: false,\n description: \"UI accent when host supports it.\",\n },\n {\n key: \"additional\",\n required: false,\n description: \"Provider-specific passthrough options.\",\n },\n];\n\nconst FRONTMATTER_MAPPING: FrontmatterKeyMap[] = [\n { canonical: \"name\", claude: \"name\" },\n { canonical: \"description\", claude: \"description\", opencode: \"description\" },\n { canonical: \"mode\", opencode: \"mode\" },\n { canonical: \"model\", claude: \"model\", opencode: \"model\" },\n { canonical: \"tools\", claude: \"tools\", opencode: \"tools\" },\n { canonical: \"permission\", claude: \"permissionMode\", opencode: \"permission\" },\n { canonical: \"steps\", claude: \"maxTurns\", opencode: \"steps\" },\n { canonical: \"temperature\", claude: \"temperature\", opencode: \"temperature\" },\n { canonical: \"topP\", opencode: \"top_p\" },\n { canonical: \"hidden\", opencode: \"hidden\" },\n { canonical: \"color\", opencode: \"color\" },\n {\n canonical: \"linkedSkillIds\",\n claude: \"skills\",\n notes:\n \"OpenCode currently references skills outside the agent file; adapters should emit install metadata.\",\n },\n];\n\nconst NATIVE_AGENT_IDS = new Set<AgentId>([\"claude-code\", \"opencode\"]);\n\nconst MAPPED_AGENT_IDS = new Set<AgentId>([\n \"cursor\",\n \"windsurf\",\n \"cline\",\n \"roo\",\n \"codex\",\n]);\n\nconst resolveProfile = (agent: AgentConfig): AgentAdapterProfile => {\n if (NATIVE_AGENT_IDS.has(agent.id)) {\n return {\n tier: \"native\",\n supportsGlobalInstall: Boolean(agent.agentsGlobalPath),\n supportsProjectInstall: Boolean(agent.agentsProjectPath),\n notes: \"Native subagent/frontmatter format supported.\",\n };\n }\n\n if (MAPPED_AGENT_IDS.has(agent.id)) {\n return {\n tier: \"mapped\",\n supportsGlobalInstall: Boolean(agent.globalPath),\n supportsProjectInstall: Boolean(agent.projectPath),\n notes:\n \"No native agent file format confirmed; install as compatibility artifacts.\",\n };\n }\n\n return {\n tier: \"compat\",\n supportsGlobalInstall: Boolean(agent.globalPath),\n supportsProjectInstall: Boolean(agent.projectPath),\n notes:\n \"Install compatibility output only, with capability warning surfaced to user.\",\n };\n};\n\nexport type {\n AgentAdapterProfile,\n AgentCapabilityTier,\n CanonicalAgentField,\n FrontmatterKeyMap,\n};\nexport {\n CANONICAL_AGENT_FIELDS,\n FRONTMATTER_MAPPING,\n MAPPED_AGENT_IDS,\n NATIVE_AGENT_IDS,\n resolveProfile,\n};\n","import { access, constants } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport process from \"node:process\";\nimport { Effect, pipe } from \"effect\";\n\ntype AgentId =\n | \"amp\"\n | \"kimi-cli\"\n | \"antigravity\"\n | \"claude-code\"\n | \"claude-desktop\"\n | \"moltbot\"\n | \"cline\"\n | \"codebuddy\"\n | \"codex\"\n | \"command-code\"\n | \"continue\"\n | \"crush\"\n | \"cursor\"\n | \"droid\"\n | \"gemini-cli\"\n | \"github-copilot\"\n | \"goose\"\n | \"junie\"\n | \"kilo\"\n | \"kiro-cli\"\n | \"kode\"\n | \"mcpjam\"\n | \"mux\"\n | \"opencode\"\n | \"openhands\"\n | \"pi\"\n | \"qoder\"\n | \"qwen-code\"\n | \"roo\"\n | \"trae\"\n | \"windsurf\"\n | \"zencoder\"\n | \"neovate\"\n | \"pochi\"\n | \"zed\";\n\ntype RuleFormat = \"mdc\" | \"markdown-dir\" | \"append-single\";\n\ntype McpEntryStyle = \"standard\" | \"typed-stdio\" | \"zed\" | \"cline\";\n\ninterface AgentConfig {\n id: AgentId;\n name: string;\n projectPath: string;\n globalPath: string;\n agentsProjectPath?: string;\n agentsGlobalPath?: string;\n projectMarkerPath?: string;\n globalMarkerPath?: string;\n rulesProjectPath?: string;\n rulesGlobalPath?: string;\n ruleFormat?: RuleFormat;\n mcpProjectConfigPath?: string;\n mcpGlobalConfigPath?: string;\n mcpRootKey?: string;\n mcpEntryStyle?: McpEntryStyle;\n}\n\nconst home = homedir();\n\nconst vscodeExtSettingsPath = (\n extensionId: string,\n filename: string\n): string => {\n if (process.platform === \"darwin\") {\n return join(\n home,\n \"Library\",\n \"Application Support\",\n \"Code\",\n \"User\",\n \"globalStorage\",\n extensionId,\n \"settings\",\n filename\n );\n }\n if (process.platform === \"win32\") {\n const appData = process.env.APPDATA ?? join(home, \"AppData\", \"Roaming\");\n return join(\n appData,\n \"Code\",\n \"User\",\n \"globalStorage\",\n extensionId,\n \"settings\",\n filename\n );\n }\n return join(\n home,\n \".config\",\n \"Code\",\n \"User\",\n \"globalStorage\",\n extensionId,\n \"settings\",\n filename\n );\n};\n\nconst claudeDesktopConfigPath = (): string => {\n if (process.platform === \"darwin\") {\n return join(\n home,\n \"Library\",\n \"Application Support\",\n \"Claude\",\n \"claude_desktop_config.json\"\n );\n }\n if (process.platform === \"win32\") {\n const appData = process.env.APPDATA ?? join(home, \"AppData\", \"Roaming\");\n return join(appData, \"Claude\", \"claude_desktop_config.json\");\n }\n return join(home, \".config\", \"Claude\", \"claude_desktop_config.json\");\n};\n\nconst AGENTS: AgentConfig[] = [\n {\n id: \"amp\",\n name: \"Amp\",\n projectPath: \".agents/skills\",\n globalPath: join(home, \".config\", \"agents\", \"skills\"),\n mcpProjectConfigPath: \".amp/mcp.json\",\n mcpGlobalConfigPath: join(home, \".amp\", \"mcp.json\"),\n },\n {\n id: \"kimi-cli\",\n name: \"Kimi Code CLI\",\n projectPath: \".agents/skills\",\n globalPath: join(home, \".config\", \"agents\", \"skills\"),\n mcpProjectConfigPath: \".agents/mcp.json\",\n mcpGlobalConfigPath: join(home, \".config\", \"agents\", \"mcp.json\"),\n },\n {\n id: \"antigravity\",\n name: \"Antigravity\",\n projectPath: \".agent/skills\",\n globalPath: join(home, \".gemini\", \"antigravity\", \"global_skills\"),\n mcpProjectConfigPath: \".agent/mcp.json\",\n mcpGlobalConfigPath: join(home, \".gemini\", \"antigravity\", \"mcp.json\"),\n },\n {\n id: \"claude-code\",\n name: \"Claude Code\",\n projectPath: \".claude/skills\",\n globalPath: join(home, \".claude\", \"skills\"),\n agentsProjectPath: \".claude/agents\",\n agentsGlobalPath: join(home, \".claude\", \"agents\"),\n projectMarkerPath: \".claude\",\n globalMarkerPath: join(home, \".claude\"),\n rulesProjectPath: \".claude/rules\",\n rulesGlobalPath: join(home, \".claude\", \"rules\"),\n ruleFormat: \"markdown-dir\",\n mcpProjectConfigPath: \".mcp.json\",\n mcpEntryStyle: \"typed-stdio\",\n },\n {\n id: \"claude-desktop\",\n name: \"Claude Desktop\",\n projectPath: \"\",\n globalPath: \"\",\n mcpGlobalConfigPath: claudeDesktopConfigPath(),\n },\n {\n id: \"moltbot\",\n name: \"Moltbot\",\n projectPath: \"skills\",\n globalPath: join(home, \".moltbot\", \"skills\"),\n mcpProjectConfigPath: \"mcp.json\",\n mcpGlobalConfigPath: join(home, \".moltbot\", \"mcp.json\"),\n },\n {\n id: \"cline\",\n name: \"Cline\",\n projectPath: \".cline/skills\",\n globalPath: join(home, \".cline\", \"skills\"),\n rulesProjectPath: \".clinerules\",\n ruleFormat: \"append-single\",\n mcpGlobalConfigPath: vscodeExtSettingsPath(\n \"saoudrizwan.claude-dev\",\n \"cline_mcp_settings.json\"\n ),\n mcpEntryStyle: \"cline\",\n },\n {\n id: \"codebuddy\",\n name: \"CodeBuddy\",\n projectPath: \".codebuddy/skills\",\n globalPath: join(home, \".codebuddy\", \"skills\"),\n mcpProjectConfigPath: \".codebuddy/mcp.json\",\n mcpGlobalConfigPath: join(home, \".codebuddy\", \"mcp.json\"),\n },\n {\n id: \"codex\",\n name: \"Codex\",\n projectPath: \".codex/skills\",\n globalPath: join(home, \".codex\", \"skills\"),\n mcpProjectConfigPath: \".codex/mcp.json\",\n mcpGlobalConfigPath: join(home, \".codex\", \"mcp.json\"),\n },\n {\n id: \"command-code\",\n name: \"Command Code\",\n projectPath: \".commandcode/skills\",\n globalPath: join(home, \".commandcode\", \"skills\"),\n mcpProjectConfigPath: \".commandcode/mcp.json\",\n mcpGlobalConfigPath: join(home, \".commandcode\", \"mcp.json\"),\n },\n {\n id: \"continue\",\n name: \"Continue\",\n projectPath: \".continue/skills\",\n globalPath: join(home, \".continue\", \"skills\"),\n mcpProjectConfigPath: \".continue/mcp.json\",\n mcpGlobalConfigPath: join(home, \".continue\", \"mcp.json\"),\n },\n {\n id: \"crush\",\n name: \"Crush\",\n projectPath: \".crush/skills\",\n globalPath: join(home, \".config\", \"crush\", \"skills\"),\n mcpProjectConfigPath: \".crush/mcp.json\",\n mcpGlobalConfigPath: join(home, \".config\", \"crush\", \"mcp.json\"),\n },\n {\n id: \"cursor\",\n name: \"Cursor\",\n projectPath: \".cursor/skills\",\n globalPath: join(home, \".cursor\", \"skills\"),\n rulesProjectPath: \".cursor/rules\",\n ruleFormat: \"mdc\",\n mcpProjectConfigPath: \".cursor/mcp.json\",\n mcpGlobalConfigPath: join(home, \".cursor\", \"mcp.json\"),\n },\n {\n id: \"droid\",\n name: \"Droid\",\n projectPath: \".factory/skills\",\n globalPath: join(home, \".factory\", \"skills\"),\n mcpProjectConfigPath: \".factory/mcp.json\",\n mcpGlobalConfigPath: join(home, \".factory\", \"mcp.json\"),\n },\n {\n id: \"gemini-cli\",\n name: \"Gemini CLI\",\n projectPath: \".gemini/skills\",\n globalPath: join(home, \".gemini\", \"skills\"),\n mcpProjectConfigPath: \".gemini/mcp.json\",\n mcpGlobalConfigPath: join(home, \".gemini\", \"mcp.json\"),\n },\n {\n id: \"github-copilot\",\n name: \"GitHub Copilot\",\n projectPath: \".github/skills\",\n globalPath: join(home, \".copilot\", \"skills\"),\n rulesProjectPath: \".github/copilot-instructions.md\",\n ruleFormat: \"append-single\",\n mcpProjectConfigPath: \".vscode/mcp.json\",\n mcpRootKey: \"servers\",\n mcpEntryStyle: \"typed-stdio\",\n },\n {\n id: \"goose\",\n name: \"Goose\",\n projectPath: \".goose/skills\",\n globalPath: join(home, \".config\", \"goose\", \"skills\"),\n mcpGlobalConfigPath: join(home, \".config\", \"goose\", \"mcp.json\"),\n },\n {\n id: \"junie\",\n name: \"Junie\",\n projectPath: \".junie/skills\",\n globalPath: join(home, \".junie\", \"skills\"),\n mcpProjectConfigPath: \".junie/mcp.json\",\n mcpGlobalConfigPath: join(home, \".junie\", \"mcp.json\"),\n },\n {\n id: \"kilo\",\n name: \"Kilo Code\",\n projectPath: \".kilocode/skills\",\n globalPath: join(home, \".kilocode\", \"skills\"),\n mcpGlobalConfigPath: vscodeExtSettingsPath(\n \"kilocode.kilo-code\",\n \"mcp_settings.json\"\n ),\n mcpEntryStyle: \"cline\",\n },\n {\n id: \"kiro-cli\",\n name: \"Kiro CLI\",\n projectPath: \".kiro/skills\",\n globalPath: join(home, \".kiro\", \"skills\"),\n mcpProjectConfigPath: \".kiro/mcp.json\",\n mcpGlobalConfigPath: join(home, \".kiro\", \"mcp.json\"),\n },\n {\n id: \"kode\",\n name: \"Kode\",\n projectPath: \".kode/skills\",\n globalPath: join(home, \".kode\", \"skills\"),\n mcpProjectConfigPath: \".kode/mcp.json\",\n mcpGlobalConfigPath: join(home, \".kode\", \"mcp.json\"),\n },\n {\n id: \"mcpjam\",\n name: \"MCPJam\",\n projectPath: \".mcpjam/skills\",\n globalPath: join(home, \".mcpjam\", \"skills\"),\n mcpProjectConfigPath: \".mcpjam/mcp.json\",\n mcpGlobalConfigPath: join(home, \".mcpjam\", \"mcp.json\"),\n },\n {\n id: \"mux\",\n name: \"Mux\",\n projectPath: \".mux/skills\",\n globalPath: join(home, \".mux\", \"skills\"),\n mcpProjectConfigPath: \".mux/mcp.json\",\n mcpGlobalConfigPath: join(home, \".mux\", \"mcp.json\"),\n },\n {\n id: \"opencode\",\n name: \"OpenCode\",\n projectPath: \".opencode/skills\",\n globalPath: join(home, \".config\", \"opencode\", \"skills\"),\n agentsProjectPath: \".opencode/agents\",\n agentsGlobalPath: join(home, \".config\", \"opencode\", \"agents\"),\n mcpProjectConfigPath: \".opencode/mcp.json\",\n mcpGlobalConfigPath: join(home, \".config\", \"opencode\", \"mcp.json\"),\n },\n {\n id: \"openhands\",\n name: \"OpenHands\",\n projectPath: \".openhands/skills\",\n globalPath: join(home, \".openhands\", \"skills\"),\n mcpProjectConfigPath: \".openhands/mcp.json\",\n mcpGlobalConfigPath: join(home, \".openhands\", \"mcp.json\"),\n },\n {\n id: \"pi\",\n name: \"Pi\",\n projectPath: \".pi/skills\",\n globalPath: join(home, \".pi\", \"agent\", \"skills\"),\n mcpProjectConfigPath: \".pi/mcp.json\",\n mcpGlobalConfigPath: join(home, \".pi\", \"agent\", \"mcp.json\"),\n },\n {\n id: \"qoder\",\n name: \"Qoder\",\n projectPath: \".qoder/skills\",\n globalPath: join(home, \".qoder\", \"skills\"),\n mcpProjectConfigPath: \".qoder/mcp.json\",\n mcpGlobalConfigPath: join(home, \".qoder\", \"mcp.json\"),\n },\n {\n id: \"qwen-code\",\n name: \"Qwen Code\",\n projectPath: \".qwen/skills\",\n globalPath: join(home, \".qwen\", \"skills\"),\n mcpProjectConfigPath: \".qwen/mcp.json\",\n mcpGlobalConfigPath: join(home, \".qwen\", \"mcp.json\"),\n },\n {\n id: \"roo\",\n name: \"Roo Code\",\n projectPath: \".roo/skills\",\n globalPath: join(home, \".roo\", \"skills\"),\n rulesProjectPath: \".roo/rules\",\n rulesGlobalPath: join(home, \".roo\", \"rules\"),\n ruleFormat: \"markdown-dir\",\n mcpGlobalConfigPath: vscodeExtSettingsPath(\n \"rooveterinaryinc.roo-cline\",\n \"mcp_settings.json\"\n ),\n mcpEntryStyle: \"cline\",\n },\n {\n id: \"trae\",\n name: \"Trae\",\n projectPath: \".trae/skills\",\n globalPath: join(home, \".trae\", \"skills\"),\n mcpProjectConfigPath: \".trae/mcp.json\",\n mcpGlobalConfigPath: join(home, \".trae\", \"mcp.json\"),\n },\n {\n id: \"windsurf\",\n name: \"Windsurf\",\n projectPath: \".windsurf/skills\",\n globalPath: join(home, \".codeium\", \"windsurf\", \"skills\"),\n rulesProjectPath: \".windsurfrules\",\n ruleFormat: \"append-single\",\n mcpGlobalConfigPath: join(home, \".codeium\", \"windsurf\", \"mcp_config.json\"),\n },\n {\n id: \"zencoder\",\n name: \"Zencoder\",\n projectPath: \".zencoder/skills\",\n globalPath: join(home, \".zencoder\", \"skills\"),\n mcpProjectConfigPath: \".zencoder/mcp.json\",\n mcpGlobalConfigPath: join(home, \".zencoder\", \"mcp.json\"),\n },\n {\n id: \"neovate\",\n name: \"Neovate\",\n projectPath: \".neovate/skills\",\n globalPath: join(home, \".neovate\", \"skills\"),\n mcpProjectConfigPath: \".neovate/mcp.json\",\n mcpGlobalConfigPath: join(home, \".neovate\", \"mcp.json\"),\n },\n {\n id: \"pochi\",\n name: \"Pochi\",\n projectPath: \".pochi/skills\",\n globalPath: join(home, \".pochi\", \"skills\"),\n mcpProjectConfigPath: \".pochi/mcp.json\",\n mcpGlobalConfigPath: join(home, \".pochi\", \"mcp.json\"),\n },\n {\n id: \"zed\",\n name: \"Zed\",\n projectPath: \"\",\n globalPath: \"\",\n projectMarkerPath: \".zed\",\n globalMarkerPath: join(home, \".config\", \"zed\"),\n rulesProjectPath: \".zed/rules\",\n rulesGlobalPath: join(home, \".config\", \"zed\", \"rules\"),\n ruleFormat: \"markdown-dir\",\n mcpGlobalConfigPath: join(home, \".config\", \"zed\", \"settings.json\"),\n mcpRootKey: \"context_servers\",\n mcpEntryStyle: \"zed\",\n },\n];\n\nconst directoryExists = (path: string): Effect.Effect<boolean> =>\n pipe(\n Effect.tryPromise({\n try: () => access(path, constants.F_OK),\n catch: () => false,\n }),\n Effect.map(() => true),\n Effect.orElseSucceed(() => false)\n );\n\ninterface DetectedAgent extends AgentConfig {\n hasProjectConfig: boolean;\n hasGlobalConfig: boolean;\n}\n\ninterface InstalledAgent extends AgentConfig {\n hasProjectInstall: boolean;\n hasGlobalInstall: boolean;\n}\n\nconst METADATA_FILENAME = \".braidskills-metadata.json\";\n\nconst detectAgents = (projectRoot?: string): Effect.Effect<DetectedAgent[]> => {\n const cwd = projectRoot ?? process.cwd();\n\n return pipe(\n Effect.forEach(\n AGENTS,\n (agent) =>\n pipe(\n Effect.all({\n hasProjectConfig: agent.projectPath\n ? directoryExists(join(cwd, agent.projectPath))\n : Effect.succeed(false),\n hasGlobalConfig: agent.globalPath\n ? directoryExists(agent.globalPath)\n : Effect.succeed(false),\n hasProjectMarker: agent.projectMarkerPath\n ? directoryExists(join(cwd, agent.projectMarkerPath))\n : Effect.succeed(false),\n hasGlobalMarker: agent.globalMarkerPath\n ? directoryExists(agent.globalMarkerPath)\n : Effect.succeed(false),\n hasRulesProjectConfig: agent.rulesProjectPath\n ? directoryExists(join(cwd, agent.rulesProjectPath))\n : Effect.succeed(false),\n hasRulesGlobalConfig: agent.rulesGlobalPath\n ? directoryExists(agent.rulesGlobalPath)\n : Effect.succeed(false),\n }),\n Effect.map(\n ({\n hasProjectConfig,\n hasGlobalConfig,\n hasProjectMarker,\n hasGlobalMarker,\n hasRulesProjectConfig,\n hasRulesGlobalConfig,\n }): DetectedAgent => ({\n ...agent,\n hasProjectConfig:\n hasProjectConfig || hasRulesProjectConfig || hasProjectMarker,\n hasGlobalConfig:\n hasGlobalConfig || hasRulesGlobalConfig || hasGlobalMarker,\n })\n )\n ),\n { concurrency: \"unbounded\" }\n ),\n Effect.map((agents) =>\n agents.filter((a) => a.hasProjectConfig || a.hasGlobalConfig)\n )\n );\n};\n\nconst detectInstalledAgents = (\n projectRoot?: string\n): Effect.Effect<InstalledAgent[]> => {\n const cwd = projectRoot ?? process.cwd();\n\n return pipe(\n Effect.forEach(\n AGENTS,\n (agent) =>\n pipe(\n Effect.all({\n hasProjectInstall: agent.projectPath\n ? directoryExists(join(cwd, agent.projectPath, METADATA_FILENAME))\n : Effect.succeed(false),\n hasGlobalInstall: agent.globalPath\n ? directoryExists(join(agent.globalPath, METADATA_FILENAME))\n : Effect.succeed(false),\n }),\n Effect.map(\n ({ hasProjectInstall, hasGlobalInstall }): InstalledAgent => ({\n ...agent,\n hasProjectInstall,\n hasGlobalInstall,\n })\n )\n ),\n { concurrency: \"unbounded\" }\n ),\n Effect.map((agents) =>\n agents.filter((a) => a.hasProjectInstall || a.hasGlobalInstall)\n )\n );\n};\n\nconst detectInstalledAgentsAsync = (\n projectRoot?: string\n): Promise<InstalledAgent[]> =>\n Effect.runPromise(detectInstalledAgents(projectRoot));\n\ninterface ResolvedAgentsResult {\n agents: AgentConfig[];\n source: \"config\" | \"installed\" | \"detected\" | \"none\";\n}\n\nconst resolveAgents = (options: {\n configAgents?: string[];\n projectRoot?: string;\n global?: boolean;\n}): Effect.Effect<ResolvedAgentsResult> => {\n const { configAgents, projectRoot, global: useGlobal } = options;\n\n if (configAgents && configAgents.length > 0) {\n const agents = configAgents\n .map((id) => getAgentById(id as AgentId))\n .filter((a): a is AgentConfig => a !== undefined);\n\n if (agents.length > 0) {\n return Effect.succeed<ResolvedAgentsResult>({\n agents,\n source: \"config\",\n });\n }\n }\n\n return pipe(\n Effect.all({\n installed: detectInstalledAgents(projectRoot),\n detected: detectAgents(projectRoot),\n }),\n Effect.map(({ installed, detected }): ResolvedAgentsResult => {\n const relevantInstalled = installed.filter((a) =>\n useGlobal ? a.hasGlobalInstall : a.hasProjectInstall\n );\n\n if (relevantInstalled.length > 0) {\n return {\n agents: relevantInstalled,\n source: \"installed\",\n };\n }\n\n const relevantDetected = detected.filter((a) =>\n useGlobal ? a.hasGlobalConfig : a.hasProjectConfig\n );\n\n if (relevantDetected.length > 0) {\n return {\n agents: relevantDetected,\n source: \"detected\",\n };\n }\n\n return { agents: [], source: \"none\" };\n })\n );\n};\n\nconst resolveAgentsAsync = (options: {\n configAgents?: string[];\n projectRoot?: string;\n global?: boolean;\n}): Promise<ResolvedAgentsResult> => Effect.runPromise(resolveAgents(options));\n\nconst getAgentById = (id: AgentId): AgentConfig | undefined =>\n AGENTS.find((a) => a.id === id);\n\nconst getAllAgentIds = (): AgentId[] => AGENTS.map((a) => a.id);\n\nconst detectAgentsAsync = (projectRoot?: string): Promise<DetectedAgent[]> =>\n Effect.runPromise(detectAgents(projectRoot));\n\nconst directoryExistsAsync = (path: string): Promise<boolean> =>\n Effect.runPromise(directoryExists(path));\n\nconst resolveInstallPath = (\n agent: AgentConfig,\n options: { global?: boolean; projectRoot?: string }\n): string | undefined => {\n if (options.global) {\n return agent.globalPath || undefined;\n }\n if (!agent.projectPath) {\n return undefined;\n }\n const cwd = options.projectRoot ?? process.cwd();\n return join(cwd, agent.projectPath);\n};\n\nconst resolveAgentsInstallPath = (\n agent: AgentConfig,\n options: { global?: boolean; projectRoot?: string }\n): string | undefined => {\n if (options.global) {\n return agent.agentsGlobalPath;\n }\n if (!agent.agentsProjectPath) {\n return undefined;\n }\n const cwd = options.projectRoot ?? process.cwd();\n return join(cwd, agent.agentsProjectPath);\n};\n\nconst resolveRulesInstallPath = (\n agent: AgentConfig,\n options: { global?: boolean; projectRoot?: string }\n): string | undefined => {\n if (options.global) {\n return agent.rulesGlobalPath;\n }\n if (!agent.rulesProjectPath) {\n return undefined;\n }\n const cwd = options.projectRoot ?? process.cwd();\n return join(cwd, agent.rulesProjectPath);\n};\n\nconst hasMcpConfig = (agent: AgentConfig): boolean =>\n Boolean(agent.mcpProjectConfigPath) || Boolean(agent.mcpGlobalConfigPath);\n\nconst MCP_PACKAGE_SPEC = \"@braid-cloud/mcp@0.1.12\";\n\nconst resolveMcpConfigPath = (\n agent: AgentConfig,\n options: { global?: boolean; projectRoot?: string }\n): string | undefined => {\n if (options.global) {\n return agent.mcpGlobalConfigPath;\n }\n if (agent.mcpProjectConfigPath) {\n const cwd = options.projectRoot ?? process.cwd();\n return join(cwd, agent.mcpProjectConfigPath);\n }\n return agent.mcpGlobalConfigPath;\n};\n\nconst buildMcpEntry = (\n style: McpEntryStyle,\n env: Record<string, string>\n): Record<string, unknown> => {\n const command = \"npx\";\n const args = [\"-y\", MCP_PACKAGE_SPEC];\n const envObj = Object.keys(env).length > 0 ? env : undefined;\n\n switch (style) {\n case \"standard\":\n return envObj ? { command, args, env: envObj } : { command, args };\n case \"typed-stdio\":\n return envObj\n ? { type: \"stdio\", command, args, env: envObj }\n : { type: \"stdio\", command, args };\n case \"zed\":\n return envObj\n ? { command: { path: command, args, env: envObj } }\n : { command: { path: command, args } };\n case \"cline\":\n return envObj\n ? { command, args, env: envObj, disabled: false }\n : { command, args, disabled: false };\n default:\n return envObj ? { command, args, env: envObj } : { command, args };\n }\n};\n\nconst detectMcpAgents = (projectRoot?: string): Promise<DetectedAgent[]> =>\n Effect.runPromise(\n pipe(\n detectAgents(projectRoot),\n Effect.map((detected) => detected.filter(hasMcpConfig))\n )\n );\n\nexport type {\n AgentConfig,\n AgentId,\n DetectedAgent,\n InstalledAgent,\n McpEntryStyle,\n ResolvedAgentsResult,\n RuleFormat,\n};\nexport {\n AGENTS,\n buildMcpEntry,\n MCP_PACKAGE_SPEC,\n detectAgents,\n detectAgentsAsync,\n detectInstalledAgents,\n detectInstalledAgentsAsync,\n detectMcpAgents,\n directoryExists,\n directoryExistsAsync,\n getAgentById,\n getAllAgentIds,\n hasMcpConfig,\n resolveAgentsInstallPath,\n resolveAgents,\n resolveAgentsAsync,\n resolveInstallPath,\n resolveMcpConfigPath,\n resolveRulesInstallPath,\n};\n","import process from \"node:process\";\nimport { validateApiKeyAsync } from \"../lib/api.ts\";\nimport type { MergedConfig } from \"../lib/config.ts\";\nimport {\n CONFIG_FILE,\n findProjectConfigFileAsync,\n findUserConfigFileAsync,\n getServerUrlAsync,\n loadMergedConfigAsync,\n loadUserConfigAsync,\n saveUserConfigAsync,\n setApiKeyAsync,\n USER_CONFIG_FILENAME,\n} from \"../lib/config.ts\";\nimport {\n DeviceAuthDeniedError,\n DeviceAuthExpiredError,\n DeviceAuthTimeoutError,\n fetchAuthConfig,\n fetchSessionInfo,\n getDeviceInfo,\n initiateDeviceAuth,\n openBrowser,\n pollForSession,\n revokeSession,\n} from \"../lib/device-auth.ts\";\nimport { confirm, intro, isCancel, log, outro, spinner } from \"../lib/tui.ts\";\n\nconst SESSION_TOKEN_PREFIX = \"brs_\";\nconst TRAILING_SLASHES = /\\/+$/;\n\ninterface AuthOptions {\n server?: string;\n token?: string;\n scope?: boolean;\n timeout?: string;\n}\n\nconst DEFAULT_TIMEOUT_SECONDS = 300;\n\nasync function configureDefaultScopeAsync(serverUrl: string): Promise<void> {\n const shouldConfigureScope = await confirm({\n message: \"Configure organization and scope defaults now?\",\n initialValue: true,\n });\n\n if (isCancel(shouldConfigureScope) || !shouldConfigureScope) {\n return;\n }\n\n const { scopeCommand } = await import(\"./scope.ts\");\n const config = await loadMergedConfigAsync();\n await scopeCommand({\n file: \"user\",\n server: serverUrl,\n ...(config.token ? { apiKey: config.token } : {}),\n });\n}\n\nasync function manualTokenFlow(\n apiKey: string,\n serverUrl: string,\n options: AuthOptions\n): Promise<void> {\n const authSpinner = spinner();\n let authSpinnerActive = true;\n const stopAuthSpinner = (message: string): void => {\n if (!authSpinnerActive) {\n return;\n }\n authSpinner.stop(message);\n authSpinnerActive = false;\n };\n\n authSpinner.start(\"Validating API key...\");\n\n try {\n const isValid = await validateApiKeyAsync(apiKey, serverUrl);\n\n if (!isValid) {\n stopAuthSpinner(\"Invalid API key\");\n log.error(\n \"The API key could not be validated. Please check your key and try again.\"\n );\n process.exit(1);\n }\n\n await setApiKeyAsync(apiKey);\n\n const existingUserConfig = await loadUserConfigAsync();\n if (existingUserConfig?.token) {\n await saveUserConfigAsync({ ...existingUserConfig, token: apiKey });\n }\n\n stopAuthSpinner(\"API key validated and saved\");\n\n if (options.scope !== false) {\n await configureDefaultScopeAsync(serverUrl);\n }\n\n log.success(`Config saved to ${CONFIG_FILE}`);\n outro(\n \"You're authenticated! Run 'braid install' to use your saved scope (or pass '--profile <name>' to override).\"\n );\n } catch (error) {\n stopAuthSpinner(\"Validation failed\");\n const message = error instanceof Error ? error.message : String(error);\n log.error(`Failed to validate API key: ${message}`);\n process.exit(1);\n }\n}\n\nfunction handlePollingError(error: unknown): never {\n if (error instanceof DeviceAuthTimeoutError) {\n log.error(\"The device authorization timed out. Please try again.\");\n } else if (error instanceof DeviceAuthExpiredError) {\n log.error(\"The device code has expired. Please try again.\");\n } else if (error instanceof DeviceAuthDeniedError) {\n log.error(\"The authorization request was denied.\");\n } else {\n const message = error instanceof Error ? error.message : String(error);\n log.error(`Authentication failed: ${message}`);\n }\n process.exit(1);\n}\n\nasync function deviceFlow(\n serverUrl: string,\n timeoutSeconds: number,\n options: AuthOptions\n): Promise<void> {\n const configSpinner = spinner();\n configSpinner.start(\"Fetching auth configuration...\");\n\n let authConfig: Awaited<ReturnType<typeof fetchAuthConfig>>;\n try {\n authConfig = await fetchAuthConfig(serverUrl);\n configSpinner.stop(\"Auth configuration loaded\");\n } catch (error) {\n configSpinner.stop(\"Failed to fetch auth configuration\");\n const message = error instanceof Error ? error.message : String(error);\n log.error(`Could not connect to server: ${message}`);\n process.exit(1);\n }\n\n const deviceSpinner = spinner();\n deviceSpinner.start(\"Initiating device authorization...\");\n\n let deviceAuth: Awaited<ReturnType<typeof initiateDeviceAuth>>;\n try {\n deviceAuth = await initiateDeviceAuth(\n authConfig.convexSiteUrl,\n getDeviceInfo()\n );\n deviceSpinner.stop(\"Device authorization initiated\");\n } catch (error) {\n deviceSpinner.stop(\"Failed to initiate device authorization\");\n const message = error instanceof Error ? error.message : String(error);\n log.error(`Device authorization failed: ${message}`);\n process.exit(1);\n }\n\n const verificationUrl = `${serverUrl.replace(TRAILING_SLASHES, \"\")}/cli/authorize?user_code=${deviceAuth.user_code}`;\n\n log.info(\"\");\n log.info(\" To authenticate, visit:\");\n log.info(` ${verificationUrl}`);\n log.info(\"\");\n log.info(` Your code: ${deviceAuth.user_code}`);\n log.info(\"\");\n\n openBrowser(verificationUrl);\n\n const expiresMinutes = Math.ceil(\n Math.min(deviceAuth.expires_in, timeoutSeconds) / 60\n );\n const pollSpinner = spinner();\n pollSpinner.start(\n `Waiting for authentication... (expires in ${expiresMinutes} minutes)`\n );\n\n let session: Awaited<ReturnType<typeof pollForSession>>;\n try {\n session = await pollForSession(\n authConfig.convexSiteUrl,\n deviceAuth.device_code,\n deviceAuth.interval,\n deviceAuth.expires_in,\n timeoutSeconds\n );\n pollSpinner.stop(`Authenticated as ${session.user.email}`);\n } catch (error) {\n pollSpinner.stop(\"Authentication failed\");\n handlePollingError(error);\n }\n\n await setApiKeyAsync(session.sessionToken);\n\n if (options.scope !== false) {\n await configureDefaultScopeAsync(authConfig.convexSiteUrl);\n }\n\n log.success(`Session saved to ${CONFIG_FILE}`);\n outro(\n \"You're authenticated! Run 'braid install' to use your saved scope (or pass '--profile <name>' to override).\"\n );\n}\n\nexport async function authCommand(options: AuthOptions): Promise<void> {\n intro(\"braid auth\");\n\n const serverUrl = options.server ?? \"https://braid.cloud\";\n\n const config = await loadMergedConfigAsync();\n if (config.token) {\n const shouldReplace = await confirm({\n message: \"An API key is already configured. Replace it?\",\n initialValue: false,\n });\n\n if (isCancel(shouldReplace) || !shouldReplace) {\n outro(\"Auth cancelled.\");\n return;\n }\n }\n\n if (options.token) {\n await manualTokenFlow(options.token, serverUrl, options);\n return;\n }\n\n const timeoutSeconds = options.timeout\n ? Number.parseInt(options.timeout, 10)\n : DEFAULT_TIMEOUT_SECONDS;\n\n if (Number.isNaN(timeoutSeconds) || timeoutSeconds <= 0) {\n log.error(\"Invalid timeout value. Must be a positive number of seconds.\");\n process.exit(1);\n }\n\n await deviceFlow(serverUrl, timeoutSeconds, options);\n}\n\nasync function displayTokenSource(masked: string): Promise<void> {\n if (process.env.BRAID_API_KEY) {\n log.info(`Authenticated with key: ${masked}`);\n log.info(\"Source: BRAID_API_KEY environment variable\");\n return;\n }\n\n const userConfigPath = await findUserConfigFileAsync();\n log.info(`Authenticated with key: ${masked}`);\n log.info(`Source: ${userConfigPath ?? CONFIG_FILE}`);\n}\n\nasync function displayProjectConfig(): Promise<void> {\n const projectConfigPath = await findProjectConfigFileAsync();\n if (projectConfigPath) {\n log.info(`Project config: ${projectConfigPath}`);\n }\n}\n\nfunction displayResolvedSettings(config: MergedConfig): void {\n const hasOrgProjects = config.orgProjects && config.orgProjects.length > 0;\n const hasPersonalProjects =\n config.personalProjects && config.personalProjects.length > 0;\n\n if (!(config.profile || hasOrgProjects || hasPersonalProjects)) {\n return;\n }\n\n log.info(\"\");\n\n if (config.profile) {\n log.info(`Default profile: ${config.profile}`);\n }\n if (hasOrgProjects) {\n log.info(`Org projects: ${config.orgProjects?.join(\", \")}`);\n }\n if (hasPersonalProjects) {\n log.info(`Personal projects: ${config.personalProjects?.join(\", \")}`);\n }\n if (config.serverUrl !== \"https://braid.cloud\") {\n log.info(`Server: ${config.serverUrl}`);\n }\n}\n\nasync function displaySessionInfo(token: string): Promise<void> {\n const serverUrl = await getServerUrlAsync();\n try {\n const authConfig = await fetchAuthConfig(serverUrl);\n const info = await fetchSessionInfo(authConfig.convexSiteUrl, token);\n\n if (!info) {\n log.warn(\n \"Session is expired or revoked. Run 'braid auth' to re-authenticate.\"\n );\n return;\n }\n\n log.info(\n `Authenticated as: ${info.email}${info.name ? ` (${info.name})` : \"\"}`\n );\n log.info(\"Session type: CLI session\");\n\n if (info.deviceName || info.deviceHostname) {\n log.info(\n `Device: ${info.deviceName ?? info.deviceHostname ?? \"unknown\"}`\n );\n }\n\n const expiresDate = new Date(info.expiresAt);\n const daysRemaining = Math.ceil(\n (info.expiresAt - Date.now()) / (24 * 60 * 60 * 1000)\n );\n log.info(\n `Expires: ${expiresDate.toLocaleDateString()} (${daysRemaining} days)`\n );\n\n if (info.lastActiveAt) {\n log.info(`Last active: ${new Date(info.lastActiveAt).toLocaleString()}`);\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n log.warn(`Could not fetch session details: ${message}`);\n const masked = `${token.slice(0, 7)}...${token.slice(-4)}`;\n log.info(`Session token: ${masked}`);\n }\n}\n\nexport async function authStatusCommand(): Promise<void> {\n const config = await loadMergedConfigAsync();\n\n if (!config.token) {\n log.warn(\"Not authenticated. Run 'braid auth' to configure your API key.\");\n log.info(\n `Or create a ${USER_CONFIG_FILENAME} file with: { \"token\": \"br_xxx\" }`\n );\n return;\n }\n\n if (config.token.startsWith(SESSION_TOKEN_PREFIX)) {\n await displaySessionInfo(config.token);\n await displayProjectConfig();\n displayResolvedSettings(config);\n return;\n }\n\n const masked = `${config.token.slice(0, 7)}...${config.token.slice(-4)}`;\n\n await displayTokenSource(masked);\n await displayProjectConfig();\n displayResolvedSettings(config);\n}\n\nasync function revokeSessionIfActive(token: string): Promise<void> {\n const serverUrl = await getServerUrlAsync();\n try {\n const authConfig = await fetchAuthConfig(serverUrl);\n await revokeSession(authConfig.convexSiteUrl, token);\n } catch {\n return;\n }\n}\n\nexport async function authLogoutCommand(): Promise<void> {\n const config = await loadMergedConfigAsync();\n const { clearApiKeyAsync } = await import(\"../lib/config.ts\");\n\n if (config.token?.startsWith(SESSION_TOKEN_PREFIX)) {\n await revokeSessionIfActive(config.token);\n }\n\n await clearApiKeyAsync();\n log.success(\"Logged out. API key removed from config.\");\n}\n","import { execFile } from \"node:child_process\";\nimport { hostname, platform } from \"node:os\";\n\nconst TRAILING_SLASHES = /\\/+$/;\n\nexport class DeviceAuthTimeoutError extends Error {\n constructor() {\n super(\"Device authorization timed out\");\n this.name = \"DeviceAuthTimeoutError\";\n }\n}\n\nexport class DeviceAuthDeniedError extends Error {\n constructor() {\n super(\"Device authorization was denied\");\n this.name = \"DeviceAuthDeniedError\";\n }\n}\n\nexport class DeviceAuthExpiredError extends Error {\n constructor() {\n super(\"Device authorization code has expired\");\n this.name = \"DeviceAuthExpiredError\";\n }\n}\n\ninterface AuthConfig {\n clientId: string;\n convexSiteUrl: string;\n}\n\ninterface DeviceAuthResponse {\n device_code: string;\n user_code: string;\n expires_in: number;\n interval: number;\n}\n\nexport interface SessionResponse {\n sessionToken: string;\n expiresAt: number;\n user: {\n id: string;\n email: string;\n name?: string;\n };\n}\n\nexport interface DeviceInfo {\n deviceName: string;\n deviceOs: string;\n deviceHostname: string;\n}\n\nconst sleep = (ms: number): Promise<void> =>\n new Promise((resolve) => setTimeout(resolve, ms));\n\nexport async function fetchAuthConfig(serverUrl: string): Promise<AuthConfig> {\n const url = `${serverUrl.replace(TRAILING_SLASHES, \"\")}/api/cli/auth-config`;\n const response = await fetch(url);\n\n if (!response.ok) {\n const body = await response.text();\n throw new Error(\n `Failed to fetch auth config (${response.status}): ${body}`\n );\n }\n\n return response.json() as Promise<AuthConfig>;\n}\n\nexport async function initiateDeviceAuth(\n convexSiteUrl: string,\n deviceInfo: DeviceInfo\n): Promise<DeviceAuthResponse> {\n const url = `${convexSiteUrl.replace(TRAILING_SLASHES, \"\")}/api/cli/device/authorize`;\n const response = await fetch(url, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(deviceInfo),\n });\n\n if (!response.ok) {\n const body = await response.text();\n throw new Error(\n `Failed to initiate device authorization (${response.status}): ${body}`\n );\n }\n\n return response.json() as Promise<DeviceAuthResponse>;\n}\n\nexport async function pollForSession(\n convexSiteUrl: string,\n deviceCode: string,\n interval: number,\n expiresIn: number,\n timeoutSeconds: number\n): Promise<SessionResponse> {\n const tokenUrl = `${convexSiteUrl.replace(TRAILING_SLASHES, \"\")}/api/cli/device/token`;\n const deadline = Date.now() + Math.min(expiresIn, timeoutSeconds) * 1000;\n let currentInterval = interval;\n\n while (Date.now() < deadline) {\n await sleep(currentInterval * 1000);\n\n const response = await fetch(tokenUrl, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ device_code: deviceCode }),\n });\n\n if (response.ok) {\n const result = (await response.json()) as {\n session_token: string;\n expires_at: number;\n user: { id: string; email: string; name?: string };\n };\n return {\n sessionToken: result.session_token,\n expiresAt: result.expires_at,\n user: result.user,\n };\n }\n\n let errorCode: string | undefined;\n try {\n const errorBody = (await response.json()) as { error?: string };\n errorCode = errorBody.error;\n } catch {\n throw new Error(`Device auth polling error: HTTP ${response.status}`);\n }\n\n if (errorCode === \"authorization_pending\") {\n continue;\n }\n if (errorCode === \"slow_down\") {\n currentInterval += 5;\n continue;\n }\n if (errorCode === \"expired_token\") {\n throw new DeviceAuthExpiredError();\n }\n if (errorCode === \"access_denied\") {\n throw new DeviceAuthDeniedError();\n }\n\n throw new Error(\n `Device auth polling error: ${errorCode ?? `HTTP ${response.status}`}`\n );\n }\n\n throw new DeviceAuthTimeoutError();\n}\n\nexport interface SessionInfoResponse {\n email: string;\n name: string | undefined;\n deviceName: string | undefined;\n deviceOs: string | undefined;\n deviceHostname: string | undefined;\n expiresAt: number;\n createdAt: number;\n lastActiveAt: number | undefined;\n}\n\nexport async function fetchSessionInfo(\n convexSiteUrl: string,\n sessionToken: string\n): Promise<SessionInfoResponse | null> {\n const url = `${convexSiteUrl.replace(TRAILING_SLASHES, \"\")}/api/cli/sessions/me`;\n const response = await fetch(url, {\n method: \"GET\",\n headers: {\n Authorization: `Bearer ${sessionToken}`,\n },\n });\n\n if (response.status === 404) {\n return null;\n }\n\n if (!response.ok) {\n const body = await response.text();\n throw new Error(\n `Failed to fetch session info (${response.status}): ${body}`\n );\n }\n\n return response.json() as Promise<SessionInfoResponse>;\n}\n\nexport async function revokeSession(\n convexSiteUrl: string,\n sessionToken: string\n): Promise<boolean> {\n const url = `${convexSiteUrl.replace(TRAILING_SLASHES, \"\")}/api/cli/sessions/me`;\n const response = await fetch(url, {\n method: \"DELETE\",\n headers: {\n Authorization: `Bearer ${sessionToken}`,\n },\n });\n\n if (response.status === 404) {\n return false;\n }\n\n if (!response.ok) {\n const body = await response.text();\n throw new Error(`Failed to revoke session (${response.status}): ${body}`);\n }\n\n return true;\n}\n\nconst noop = (): void => {\n /* intentionally empty — fire and forget */\n};\n\nexport function openBrowser(url: string): void {\n const currentPlatform = platform();\n\n if (currentPlatform === \"darwin\") {\n execFile(\"open\", [url], noop);\n } else if (currentPlatform === \"win32\") {\n execFile(\"cmd\", [\"/c\", \"start\", \"\", url], noop);\n } else {\n execFile(\"xdg-open\", [url], noop);\n }\n}\n\nexport function getDeviceInfo(): DeviceInfo {\n return {\n deviceName: hostname(),\n deviceOs: platform(),\n deviceHostname: hostname(),\n };\n}\n","import process from \"node:process\";\nimport {\n fetchRuleOptionsAsync,\n fetchScopeOptionsAsync,\n fetchSkillsAsync,\n} from \"../lib/api.ts\";\nimport { loadMergedConfigAsync } from \"../lib/config.ts\";\nimport { log } from \"../lib/tui.ts\";\n\ninterface ProjectsListOptions {\n server?: string;\n apiKey?: string;\n json?: boolean;\n}\n\ninterface RulesListOptions {\n server?: string;\n apiKey?: string;\n orgId?: string;\n orgProjects?: string;\n personalProjects?: string;\n includeUserGlobal?: boolean;\n includeOrgGlobal?: boolean;\n json?: boolean;\n}\n\ninterface SkillsListOptions {\n server?: string;\n apiKey?: string;\n profile?: string;\n orgProjects?: string;\n personalProjects?: string;\n includeUserGlobal?: boolean;\n includeOrgGlobal?: boolean;\n json?: boolean;\n}\n\nconst parseCsv = (input?: string): string[] | undefined => {\n if (!input) {\n return undefined;\n }\n const values = input\n .split(\",\")\n .map((value) => value.trim())\n .filter((value) => value.length > 0);\n return values.length > 0 ? values : undefined;\n};\n\nconst writeJson = (value: unknown): void => {\n process.stdout.write(`${JSON.stringify(value, null, 2)}\\n`);\n};\n\nconst exitWithError = (error: unknown): never => {\n const message = error instanceof Error ? error.message : String(error);\n log.error(message);\n process.exit(1);\n};\n\nconst applyCommonOptions = <T extends Record<string, unknown>>(\n base: T,\n options: { server?: string; apiKey?: string }\n): T & Record<string, unknown> => ({\n ...base,\n ...(options.server ? { serverUrl: options.server } : {}),\n ...(options.apiKey ? { apiKey: options.apiKey } : {}),\n});\n\nconst applyOptionalString = (\n target: Record<string, unknown>,\n key: string,\n value: string | undefined\n): void => {\n if (value) {\n target[key] = value;\n }\n};\n\nconst applyOptionalArray = (\n target: Record<string, unknown>,\n key: string,\n value: string[] | undefined\n): void => {\n if (value && value.length > 0) {\n target[key] = value;\n }\n};\n\nconst applyOptionalBoolean = (\n target: Record<string, unknown>,\n key: string,\n value: boolean | undefined\n): void => {\n if (value !== undefined) {\n target[key] = value;\n }\n};\n\nexport async function projectsListCommand(\n options: ProjectsListOptions\n): Promise<void> {\n try {\n const result = await fetchScopeOptionsAsync(\n applyCommonOptions({}, options)\n );\n\n if (options.json) {\n writeJson(result);\n return;\n }\n\n log.info(\"Personal projects:\");\n if (result.personalProjects.length === 0) {\n log.info(\" (none)\");\n }\n for (const project of result.personalProjects) {\n log.info(` ${project.id} ${project.name}`);\n }\n\n for (const orgProjects of result.orgProjects) {\n log.info(`\\nOrganization: ${orgProjects.orgName} (${orgProjects.orgId})`);\n if (orgProjects.projects.length === 0) {\n log.info(\" (none)\");\n continue;\n }\n for (const project of orgProjects.projects) {\n log.info(` ${project.id} ${project.name}`);\n }\n }\n } catch (error) {\n exitWithError(error);\n }\n}\n\nconst buildRulesRequest = async (\n options: RulesListOptions\n): Promise<Record<string, unknown>> => {\n const config = await loadMergedConfigAsync();\n const orgProjects = parseCsv(options.orgProjects) ?? config.orgProjects;\n const personalProjects =\n parseCsv(options.personalProjects) ?? config.personalProjects;\n const request = applyCommonOptions({}, options);\n\n applyOptionalString(request, \"orgId\", options.orgId ?? config.org);\n applyOptionalArray(request, \"orgProjects\", orgProjects);\n applyOptionalArray(request, \"personalProjects\", personalProjects);\n applyOptionalBoolean(request, \"includeUserGlobal\", options.includeUserGlobal);\n applyOptionalBoolean(request, \"includeOrgGlobal\", options.includeOrgGlobal);\n\n return request;\n};\n\nexport async function rulesListCommand(\n options: RulesListOptions\n): Promise<void> {\n try {\n const result = await fetchRuleOptionsAsync(\n await buildRulesRequest(options)\n );\n\n if (options.json) {\n writeJson(result);\n return;\n }\n\n if (result.rules.length === 0) {\n log.info(\"No rules found.\");\n return;\n }\n\n for (const rule of result.rules) {\n log.info(`${rule.id} ${rule.title}`);\n }\n } catch (error) {\n exitWithError(error);\n }\n}\n\nconst buildSkillsRequest = async (\n options: SkillsListOptions\n): Promise<Record<string, unknown>> => {\n const config = await loadMergedConfigAsync();\n const orgProjects = parseCsv(options.orgProjects) ?? config.orgProjects;\n const personalProjects =\n parseCsv(options.personalProjects) ?? config.personalProjects;\n const request = applyCommonOptions({}, options);\n\n applyOptionalString(request, \"profile\", options.profile ?? config.profile);\n applyOptionalArray(request, \"orgProjects\", orgProjects);\n applyOptionalArray(request, \"personalProjects\", personalProjects);\n applyOptionalBoolean(request, \"includeUserGlobal\", options.includeUserGlobal);\n applyOptionalBoolean(request, \"includeOrgGlobal\", options.includeOrgGlobal);\n\n return request;\n};\n\nexport async function skillsListCommand(\n options: SkillsListOptions\n): Promise<void> {\n try {\n const result = await fetchSkillsAsync(await buildSkillsRequest(options));\n\n if (options.json) {\n writeJson(result);\n return;\n }\n\n if (result.skills.length === 0) {\n log.info(\"No skills found.\");\n return;\n }\n\n for (const skill of result.skills) {\n log.info(`${skill.name}`);\n }\n } catch (error) {\n exitWithError(error);\n }\n}\n","import type { AgentId, DetectedAgent } from \"../lib/agents.ts\";\nimport {\n AGENTS,\n detectAgentsAsync,\n getAgentById,\n resolveInstallPath,\n resolveRulesInstallPath,\n} from \"../lib/agents.ts\";\nimport type {\n FetchSkillsOptions,\n PublicMetadataResponse,\n SkillsExportResponse,\n} from \"../lib/api.ts\";\nimport {\n fetchPublicExportAsync,\n fetchPublicMetadataAsync,\n fetchSkillsAsync,\n} from \"../lib/api.ts\";\nimport type { MergedConfig } from \"../lib/config.ts\";\nimport { loadMergedConfigAsync } from \"../lib/config.ts\";\nimport { updateMetadataAsync } from \"../lib/metadata.ts\";\nimport { writeRulesForAgentAsync } from \"../lib/rule-writer.ts\";\nimport { writeSkillsAsync } from \"../lib/skill-writer.ts\";\nimport {\n cancel,\n confirm,\n intro,\n isCancel,\n log,\n multiselect,\n outro,\n spinner,\n} from \"../lib/tui.ts\";\n\ninterface InstallOptions {\n profile?: string;\n orgProjects?: string;\n personalProjects?: string;\n includeUserGlobals?: boolean;\n includeOrgGlobals?: boolean;\n agents?: string;\n global?: boolean;\n yes?: boolean;\n list?: boolean;\n server?: string;\n}\n\ninterface ResolvedInstallConfig {\n profile: string | undefined;\n serverUrl: string;\n includeUserGlobal: boolean;\n includeOrgGlobal: boolean;\n orgProjects: string[] | undefined;\n personalProjects: string[] | undefined;\n ruleIds: string[] | undefined;\n excludedRuleIds: string[] | undefined;\n resolveOverlays: boolean | undefined;\n}\n\ninterface AgentResolution {\n availableAgents: DetectedAgent[];\n preselectedAgents: DetectedAgent[];\n}\n\nfunction resolveInstallConfig(\n options: InstallOptions,\n config: MergedConfig\n): ResolvedInstallConfig {\n const orgProjectsFromFlag = options.orgProjects\n ? options.orgProjects.split(\",\").map((s) => s.trim())\n : undefined;\n const personalProjectsFromFlag = options.personalProjects\n ? options.personalProjects.split(\",\").map((s) => s.trim())\n : undefined;\n\n return {\n profile: options.profile ?? config.profile,\n serverUrl: options.server ?? config.serverUrl,\n includeUserGlobal: options.includeUserGlobals ?? config.includeUserGlobal,\n includeOrgGlobal: options.includeOrgGlobals ?? config.includeOrgGlobal,\n orgProjects: orgProjectsFromFlag ?? config.orgProjects,\n personalProjects: personalProjectsFromFlag ?? config.personalProjects,\n ruleIds: config.ruleIds,\n excludedRuleIds: config.excludedRuleIds,\n resolveOverlays: config.resolveOverlays,\n };\n}\n\nfunction validateInstallOptions(resolved: ResolvedInstallConfig): void {\n const { profile, orgProjects, personalProjects } = resolved;\n const hasOrgProjects = orgProjects && orgProjects.length > 0;\n const hasPersonalProjects = personalProjects && personalProjects.length > 0;\n\n if (!(profile || hasOrgProjects || hasPersonalProjects)) {\n log.error(\"No profile or project(s) specified.\");\n log.info(\"Either:\");\n log.info(\n \" - Add 'profile', 'orgProjects', or 'personalProjects' to braid.json/braid.user.json\"\n );\n log.info(\" - Use --profile, --org-projects, or --personal-projects flags\");\n log.info(\"\");\n log.info(\"Examples:\");\n log.info(\" braid install --profile coding-standards\");\n log.info(\" braid install --org-projects proj123,proj456\");\n log.info(\" braid install --personal-projects myproj1\");\n process.exit(1);\n }\n}\n\nfunction buildSourceDescription(resolved: ResolvedInstallConfig): string {\n const { profile, orgProjects, personalProjects } = resolved;\n\n if (profile) {\n return `profile '${profile}'`;\n }\n\n const hasOrgProjects = orgProjects && orgProjects.length > 0;\n const hasPersonalProjects = personalProjects && personalProjects.length > 0;\n\n if (hasOrgProjects || hasPersonalProjects) {\n const totalProjects =\n (orgProjects?.length ?? 0) + (personalProjects?.length ?? 0);\n return totalProjects === 1\n ? `project ${orgProjects?.[0] ?? personalProjects?.[0]}`\n : `${totalProjects} projects`;\n }\n\n return \"unknown source\";\n}\n\nfunction buildFetchOptions(\n resolved: ResolvedInstallConfig\n): FetchSkillsOptions {\n const fetchOptions: FetchSkillsOptions = {\n serverUrl: resolved.serverUrl,\n includeUserGlobal: resolved.includeUserGlobal,\n includeOrgGlobal: resolved.includeOrgGlobal,\n };\n\n if (resolved.profile) {\n fetchOptions.profile = resolved.profile;\n }\n if (resolved.orgProjects && resolved.orgProjects.length > 0) {\n fetchOptions.orgProjects = resolved.orgProjects;\n }\n if (resolved.personalProjects && resolved.personalProjects.length > 0) {\n fetchOptions.personalProjects = resolved.personalProjects;\n }\n if (resolved.ruleIds && resolved.ruleIds.length > 0) {\n fetchOptions.ruleIds = resolved.ruleIds;\n }\n if (resolved.excludedRuleIds && resolved.excludedRuleIds.length > 0) {\n fetchOptions.excludedRuleIds = resolved.excludedRuleIds;\n }\n if (resolved.resolveOverlays !== undefined) {\n fetchOptions.resolveOverlays = resolved.resolveOverlays;\n }\n\n return fetchOptions;\n}\n\nfunction displaySkillsAndExit(skills: SkillsExportResponse[\"skills\"]): never {\n log.info(\"\\nSkills:\");\n for (const skill of skills) {\n const fileCount = skill.files.length;\n log.info(\n ` ${skill.name} (${fileCount} file${fileCount !== 1 ? \"s\" : \"\"})`\n );\n }\n process.exit(0);\n}\n\nfunction getSelectableAgents(options: InstallOptions): DetectedAgent[] {\n return AGENTS.filter((agent) =>\n options.global ? Boolean(agent.globalPath) : Boolean(agent.projectPath)\n ).map(\n (agent) =>\n ({\n ...agent,\n hasProjectConfig: false,\n hasGlobalConfig: false,\n }) as DetectedAgent\n );\n}\n\nasync function resolveAgents(\n options: InstallOptions,\n installSpinner: ReturnType<typeof spinner>\n): Promise<AgentResolution> {\n if (options.agents) {\n const agentIds = options.agents.split(\",\").map((s) => s.trim() as AgentId);\n const selectedAgents = agentIds\n .map((id) => {\n const agentConfig = getAgentById(id);\n if (!agentConfig) {\n log.warn(`Unknown agent: ${id}`);\n return null;\n }\n return {\n ...agentConfig,\n hasProjectConfig: true,\n hasGlobalConfig: true,\n } as DetectedAgent;\n })\n .filter((a): a is DetectedAgent => a !== null);\n\n if (selectedAgents.length === 0) {\n log.error(\"No valid agents specified.\");\n process.exit(1);\n }\n\n return {\n availableAgents: selectedAgents,\n preselectedAgents: selectedAgents,\n };\n }\n\n installSpinner.start(\"Detecting installed agents...\");\n const allDetectedAgents = await detectAgentsAsync();\n\n const detectedAgents = allDetectedAgents.filter((agent) =>\n options.global ? agent.hasGlobalConfig : agent.hasProjectConfig\n );\n\n const targetType = options.global ? \"global\" : \"project\";\n installSpinner.stop(\n `Detected ${detectedAgents.length} agent(s) with ${targetType} config`\n );\n\n for (const agent of detectedAgents) {\n const targetPath = options.global ? agent.globalPath : agent.projectPath;\n log.info(` ${agent.name} → ${targetPath}`);\n }\n\n if (detectedAgents.length === 0) {\n log.warn(\"No AI coding agents detected.\");\n log.info(\n \"Supported agents: claude-code, opencode, cursor, windsurf, cline, and more.\"\n );\n log.info(\n \"Select agents manually below. Detected agents are pre-selected when available.\"\n );\n\n return {\n availableAgents: getSelectableAgents(options),\n preselectedAgents: [],\n };\n }\n\n return {\n availableAgents: getSelectableAgents(options),\n preselectedAgents: detectedAgents,\n };\n}\n\nasync function selectAgents(\n availableAgents: DetectedAgent[],\n preselectedAgents: DetectedAgent[],\n options: InstallOptions\n): Promise<DetectedAgent[]> {\n if (options.yes) {\n return preselectedAgents.length > 0 ? preselectedAgents : availableAgents;\n }\n\n const agentChoices = availableAgents.map((agent) => ({\n value: agent,\n label: agent.name,\n ...((\n options.global\n ? agent.globalPath || agent.rulesGlobalPath\n : agent.projectPath || agent.rulesProjectPath\n )\n ? {\n hint: options.global\n ? agent.globalPath || agent.rulesGlobalPath\n : agent.projectPath || agent.rulesProjectPath,\n }\n : {}),\n }));\n\n const selected = await multiselect({\n message: \"Select agents to install to:\",\n options: agentChoices,\n initialValues: preselectedAgents,\n required: true,\n });\n\n if (isCancel(selected)) {\n cancel(\"Install cancelled.\");\n process.exit(0);\n }\n\n return selected;\n}\n\nasync function installSkillsToAgent(\n agent: DetectedAgent,\n response: SkillsExportResponse,\n installPath: string\n): Promise<{ written: number; errors: number }> {\n if (response.skills.length === 0 || !agent.projectPath) {\n return { written: 0, errors: 0 };\n }\n\n const result = await writeSkillsAsync(installPath, response.skills, agent.id);\n\n for (const err of result.errors) {\n log.warn(` Failed skill: ${err.skill} - ${err.error}`);\n }\n\n return { written: result.written.length, errors: result.errors.length };\n}\n\nasync function installRulesToAgent(\n agent: DetectedAgent,\n response: SkillsExportResponse,\n options: InstallOptions\n): Promise<{ written: number; errors: number }> {\n const rules = response.rules ?? [];\n const rulesPath = resolveRulesInstallPath(agent, {\n global: options.global === true,\n });\n\n if (rules.length === 0 || !rulesPath || !agent.ruleFormat) {\n return { written: 0, errors: 0 };\n }\n\n const result = await writeRulesForAgentAsync(agent, rules, rulesPath);\n\n for (const err of result.errors) {\n log.warn(` Failed rules: ${err.agent} - ${err.error}`);\n }\n\n return { written: result.written, errors: result.errors.length };\n}\n\nfunction formatInstallSummary(\n agentName: string,\n skillsWritten: number,\n rulesWritten: number\n): string {\n const parts: string[] = [];\n if (skillsWritten > 0) {\n parts.push(`${skillsWritten} skills`);\n }\n if (rulesWritten > 0) {\n parts.push(`${rulesWritten} rules`);\n }\n return `${agentName}: ${parts.join(\", \")} installed`;\n}\n\nasync function installToAgent(\n agent: DetectedAgent,\n response: SkillsExportResponse,\n serverUrl: string,\n options: InstallOptions,\n installSpinner: ReturnType<typeof spinner>\n): Promise<{ written: number; errors: number }> {\n const installPath = resolveInstallPath(agent, {\n global: options.global === true,\n });\n\n installSpinner.start(`Installing to ${agent.name}...`);\n\n const skills = installPath\n ? await installSkillsToAgent(agent, response, installPath)\n : { written: 0, errors: 0 };\n const rules = await installRulesToAgent(agent, response, options);\n\n const totalWritten = skills.written + rules.written;\n const totalErrors = skills.errors + rules.errors;\n\n if (totalErrors > 0) {\n installSpinner.stop(\n `${agent.name}: ${totalWritten} installed, ${totalErrors} failed`\n );\n } else {\n installSpinner.stop(\n formatInstallSummary(agent.name, skills.written, rules.written)\n );\n }\n\n if (response.skills.length > 0 && installPath) {\n await updateMetadataAsync(\n installPath,\n response.skills.map((s) => ({\n name: s.name,\n source: response.source,\n version: response.version,\n serverUrl,\n }))\n );\n }\n\n return { written: totalWritten, errors: totalErrors };\n}\n\nconst PUBLIC_SOURCE_REGEX = /^@([a-z0-9-]+)\\/([a-z0-9-]+)$/;\n\nfunction parsePublicSource(source: string): {\n handle: string;\n slug: string;\n} | null {\n const match = source.match(PUBLIC_SOURCE_REGEX);\n if (!(match?.[1] && match[2])) {\n return null;\n }\n return { handle: match[1], slug: match[2] };\n}\n\nfunction displayPublicMetadata(metadata: PublicMetadataResponse): void {\n if (metadata.type === \"project\") {\n const { project, rules } = metadata;\n log.info(`\\nProject: ${project.name}`);\n if (project.description) {\n log.info(` ${project.description}`);\n }\n log.info(` ${rules.length} rule(s) available`);\n } else {\n const { rule } = metadata;\n log.info(`\\nRule: ${rule.title}`);\n log.info(` Type: ${rule.type}`);\n if (rule.tags.length > 0) {\n log.info(` Tags: ${rule.tags.join(\", \")}`);\n }\n if (rule.description) {\n log.info(` ${rule.description}`);\n }\n }\n}\n\nasync function selectPublicRules(\n metadata: PublicMetadataResponse,\n options: InstallOptions\n): Promise<string[] | null> {\n if (metadata.type !== \"project\") {\n return null;\n }\n\n if (options.yes) {\n return metadata.rules.map((r) => r.id);\n }\n\n const selected = await multiselect({\n message: \"Select rules to install:\",\n options: metadata.rules.map((r) => ({\n value: r.id,\n label: r.title,\n hint: r.type,\n })),\n initialValues: metadata.rules.map((r) => r.id),\n required: true,\n });\n\n if (isCancel(selected)) {\n cancel(\"Install cancelled.\");\n process.exit(0);\n }\n\n return selected;\n}\n\nasync function confirmRuleInstall(\n metadata: PublicMetadataResponse,\n options: InstallOptions\n): Promise<boolean> {\n if (metadata.type !== \"rule\") {\n return true;\n }\n\n if (options.yes) {\n return true;\n }\n\n const confirmed = await confirm({\n message: `Install \"${metadata.rule.title}\"?`,\n });\n\n if (isCancel(confirmed)) {\n cancel(\"Install cancelled.\");\n process.exit(0);\n }\n\n return confirmed === true;\n}\n\nfunction summarizeContent(response: SkillsExportResponse): string {\n const ruleCount = response.rules?.length ?? 0;\n const skillCount = response.skills.length;\n const parts: string[] = [];\n if (skillCount > 0) {\n parts.push(`${skillCount} skills`);\n }\n if (ruleCount > 0) {\n parts.push(`${ruleCount} rules`);\n }\n return parts.join(\", \") || \"nothing\";\n}\n\nfunction hasNoContent(response: SkillsExportResponse): boolean {\n return response.skills.length === 0 && (response.rules?.length ?? 0) === 0;\n}\n\nasync function installToSelectedAgents(\n response: SkillsExportResponse,\n serverUrl: string,\n options: InstallOptions,\n installSpinner: ReturnType<typeof spinner>\n): Promise<{ totalWritten: number; totalErrors: number }> {\n const agentResolution = await resolveAgents(options, installSpinner);\n const selectedAgents = await selectAgents(\n agentResolution.availableAgents,\n agentResolution.preselectedAgents,\n options\n );\n\n let totalWritten = 0;\n let totalErrors = 0;\n\n for (const agent of selectedAgents) {\n const result = await installToAgent(\n agent,\n response,\n serverUrl,\n options,\n installSpinner\n );\n totalWritten += result.written;\n totalErrors += result.errors;\n }\n\n return { totalWritten, totalErrors };\n}\n\nfunction showInstallOutro(\n totalWritten: number,\n totalErrors: number,\n suffix: string\n): void {\n if (totalErrors > 0) {\n outro(`Installed ${totalWritten} items with ${totalErrors} errors.`);\n } else {\n outro(`Successfully installed ${totalWritten} items${suffix}.`);\n }\n}\n\nasync function fetchPublicContent(\n handle: string,\n slug: string,\n options: InstallOptions,\n installSpinner: ReturnType<typeof spinner>\n): Promise<SkillsExportResponse> {\n const metadata = await fetchPublicMetadataAsync(handle, slug, options.server);\n\n installSpinner.stop(\"Found public content\");\n displayPublicMetadata(metadata);\n\n let ruleIds: string[] | undefined;\n\n if (metadata.type === \"project\") {\n const selected = await selectPublicRules(metadata, options);\n ruleIds = selected ?? undefined;\n } else {\n const confirmed = await confirmRuleInstall(metadata, options);\n if (!confirmed) {\n outro(\"Install cancelled.\");\n process.exit(0);\n }\n }\n\n installSpinner.start(\"Downloading content...\");\n return fetchPublicExportAsync(handle, slug, ruleIds, options.server);\n}\n\nasync function publicInstallCommand(\n source: string,\n options: InstallOptions\n): Promise<void> {\n const parsed = parsePublicSource(source);\n if (!parsed) {\n log.error(`Invalid public source: ${source}`);\n log.info(\"Expected format: @handle/slug (e.g., @acme/coding-standards)\");\n process.exit(1);\n }\n\n const { handle, slug } = parsed;\n intro(`Installing from @${handle}/${slug}`);\n\n const installSpinner = spinner();\n installSpinner.start(\"Fetching public content...\");\n\n try {\n const response = await fetchPublicContent(\n handle,\n slug,\n options,\n installSpinner\n );\n\n installSpinner.stop(`Downloaded ${summarizeContent(response)}`);\n\n if (hasNoContent(response)) {\n log.warn(\"No content to install.\");\n process.exit(0);\n }\n\n const serverUrl = options.server ?? \"https://braid.cloud\";\n const { totalWritten, totalErrors } = await installToSelectedAgents(\n response,\n serverUrl,\n options,\n installSpinner\n );\n\n showInstallOutro(totalWritten, totalErrors, ` from @${handle}/${slug}`);\n } catch (error) {\n installSpinner.stop(\"Install failed\");\n const message = error instanceof Error ? error.message : String(error);\n log.error(message);\n process.exit(1);\n }\n}\n\nexport async function installCommand(\n sourceOrOptions: string | InstallOptions,\n maybeOptions?: InstallOptions\n): Promise<void> {\n if (typeof sourceOrOptions === \"string\") {\n return handlePublicSource(sourceOrOptions, maybeOptions ?? {});\n }\n\n const options = sourceOrOptions;\n const config = await loadMergedConfigAsync();\n const resolved = resolveInstallConfig(options, config);\n\n validateInstallOptions(resolved);\n\n const sourceDesc = buildSourceDescription(resolved);\n intro(`Installing from ${sourceDesc}`);\n\n const installSpinner = spinner();\n installSpinner.start(\"Fetching from braid...\");\n\n try {\n const fetchOptions = buildFetchOptions(resolved);\n const response = await fetchSkillsAsync(fetchOptions);\n\n installSpinner.stop(`Found ${summarizeContent(response)}`);\n\n if (hasNoContent(response)) {\n log.warn(\n \"No skills or rules found. Check that your profile/project has enabled prompts.\"\n );\n process.exit(0);\n }\n\n if (options.list) {\n displaySkillsAndExit(response.skills);\n }\n\n const { totalWritten, totalErrors } = await installToSelectedAgents(\n response,\n resolved.serverUrl,\n options,\n installSpinner\n );\n\n showInstallOutro(totalWritten, totalErrors, ` to ${totalWritten} agent(s)`);\n log.info(\"Run 'braid list' to see installed skills.\");\n } catch (error) {\n installSpinner.stop(\"Install failed\");\n const message = error instanceof Error ? error.message : String(error);\n log.error(message);\n process.exit(1);\n }\n}\n\nfunction handlePublicSource(\n source: string,\n options: InstallOptions\n): Promise<void> {\n const publicParsed = parsePublicSource(source);\n if (publicParsed) {\n return publicInstallCommand(source, options);\n }\n log.error(`Unknown source: ${source}`);\n log.info(\"Public sources use format: @handle/slug\");\n process.exit(1);\n}\n","import { readFile, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { Data, Effect, pipe } from \"effect\";\n\nconst METADATA_FILENAME = \".braidskills-metadata.json\";\n\ninterface InstalledSkill {\n name: string;\n source: {\n type: \"profile\" | \"projects\";\n name: string;\n orgProjects?: string[];\n personalProjects?: string[];\n };\n version: string;\n installedAt: string;\n serverUrl: string;\n}\n\ninterface SkillsMetadata {\n skills: InstalledSkill[];\n}\n\nclass MetadataReadError extends Data.TaggedError(\"MetadataReadError\")<{\n path: string;\n cause: unknown;\n}> {}\n\nclass MetadataWriteError extends Data.TaggedError(\"MetadataWriteError\")<{\n path: string;\n cause: unknown;\n}> {}\n\nconst getMetadataPath = (skillsDir: string): string =>\n join(skillsDir, METADATA_FILENAME);\n\nconst readMetadata = (\n skillsDir: string\n): Effect.Effect<SkillsMetadata, MetadataReadError> => {\n const metadataPath = getMetadataPath(skillsDir);\n\n return pipe(\n Effect.tryPromise({\n try: () => readFile(metadataPath, \"utf-8\"),\n catch: (e) => new MetadataReadError({ path: metadataPath, cause: e }),\n }),\n Effect.flatMap((content) =>\n Effect.try({\n try: () => JSON.parse(content) as SkillsMetadata,\n catch: () => ({ skills: [] }) as SkillsMetadata,\n })\n ),\n Effect.orElseSucceed(() => ({ skills: [] }) as SkillsMetadata)\n );\n};\n\nconst writeMetadata = (\n skillsDir: string,\n metadata: SkillsMetadata\n): Effect.Effect<void, MetadataWriteError> => {\n const metadataPath = getMetadataPath(skillsDir);\n\n return Effect.tryPromise({\n try: () =>\n writeFile(metadataPath, JSON.stringify(metadata, null, 2), \"utf-8\"),\n catch: (e) => new MetadataWriteError({ path: metadataPath, cause: e }),\n });\n};\n\nconst updateMetadata = (\n skillsDir: string,\n newSkills: Array<{\n name: string;\n source: InstalledSkill[\"source\"];\n version: string;\n serverUrl: string;\n }>\n): Effect.Effect<void, MetadataReadError | MetadataWriteError> =>\n pipe(\n readMetadata(skillsDir),\n Effect.map((existing) => {\n const now = new Date().toISOString();\n const updatedSkills = [...existing.skills];\n\n for (const skill of newSkills) {\n const existingIndex = updatedSkills.findIndex(\n (s) => s.name === skill.name\n );\n const newEntry: InstalledSkill = {\n name: skill.name,\n source: skill.source,\n version: skill.version,\n installedAt: now,\n serverUrl: skill.serverUrl,\n };\n\n if (existingIndex >= 0) {\n updatedSkills[existingIndex] = newEntry;\n } else {\n updatedSkills.push(newEntry);\n }\n }\n\n return { skills: updatedSkills };\n }),\n Effect.flatMap((metadata) => writeMetadata(skillsDir, metadata))\n );\n\nconst getOutdatedSkills = (\n skillsDir: string,\n currentVersion: string\n): Effect.Effect<InstalledSkill[], MetadataReadError> =>\n pipe(\n readMetadata(skillsDir),\n Effect.map((metadata) =>\n metadata.skills.filter((s) => s.version !== currentVersion)\n )\n );\n\nconst removeFromMetadata = (\n skillsDir: string,\n skillName: string\n): Effect.Effect<void, MetadataReadError | MetadataWriteError> =>\n pipe(\n readMetadata(skillsDir),\n Effect.map((metadata) => ({\n skills: metadata.skills.filter((s) => s.name !== skillName),\n })),\n Effect.flatMap((metadata) => writeMetadata(skillsDir, metadata))\n );\n\nconst readMetadataAsync = (skillsDir: string): Promise<SkillsMetadata> =>\n Effect.runPromise(readMetadata(skillsDir));\n\nconst writeMetadataAsync = (\n skillsDir: string,\n metadata: SkillsMetadata\n): Promise<void> => Effect.runPromise(writeMetadata(skillsDir, metadata));\n\nconst updateMetadataAsync = (\n skillsDir: string,\n newSkills: Array<{\n name: string;\n source: InstalledSkill[\"source\"];\n version: string;\n serverUrl: string;\n }>\n): Promise<void> => Effect.runPromise(updateMetadata(skillsDir, newSkills));\n\nconst getOutdatedSkillsAsync = (\n skillsDir: string,\n currentVersion: string\n): Promise<InstalledSkill[]> =>\n Effect.runPromise(getOutdatedSkills(skillsDir, currentVersion));\n\nconst removeFromMetadataAsync = (\n skillsDir: string,\n skillName: string\n): Promise<void> => Effect.runPromise(removeFromMetadata(skillsDir, skillName));\n\nexport type { InstalledSkill, SkillsMetadata };\nexport {\n getMetadataPath,\n getOutdatedSkills,\n getOutdatedSkillsAsync,\n METADATA_FILENAME,\n MetadataReadError,\n MetadataWriteError,\n readMetadata,\n readMetadataAsync,\n removeFromMetadata,\n removeFromMetadataAsync,\n updateMetadata,\n updateMetadataAsync,\n writeMetadata,\n writeMetadataAsync,\n};\n","import { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { dirname, resolve, sep } from \"node:path\";\nimport { Data, Effect, pipe } from \"effect\";\nimport type { AgentConfig, RuleFormat } from \"./agents.ts\";\nimport type { ExportedRule } from \"./api.ts\";\n\nclass RuleWriteError extends Data.TaggedError(\"RuleWriteError\")<{\n path: string;\n operation: \"mkdir\" | \"write\" | \"read\";\n cause: unknown;\n}> {}\n\nconst createDirectory = (dir: string): Effect.Effect<void, RuleWriteError> =>\n Effect.tryPromise({\n try: () => mkdir(dir, { recursive: true }),\n catch: (e) =>\n new RuleWriteError({ path: dir, operation: \"mkdir\", cause: e }),\n });\n\nconst writeTextFile = (\n fullPath: string,\n content: string\n): Effect.Effect<void, RuleWriteError> =>\n Effect.tryPromise({\n try: () => writeFile(fullPath, content, \"utf-8\"),\n catch: (e) =>\n new RuleWriteError({ path: fullPath, operation: \"write\", cause: e }),\n });\n\nconst readTextFile = (\n fullPath: string\n): Effect.Effect<string, RuleWriteError> =>\n Effect.tryPromise({\n try: () => readFile(fullPath, \"utf-8\"),\n catch: (e) =>\n new RuleWriteError({ path: fullPath, operation: \"read\", cause: e }),\n });\n\nconst assertRulePathWithinBase = (\n basePath: string,\n ruleName: string\n): Effect.Effect<string, RuleWriteError> => {\n const resolvedBase = resolve(basePath);\n const resolvedFull = resolve(basePath, ruleName);\n if (\n resolvedFull !== resolvedBase &&\n !resolvedFull.startsWith(resolvedBase + sep)\n ) {\n return Effect.fail(\n new RuleWriteError({\n path: ruleName,\n operation: \"write\",\n cause: new Error(\n `Path traversal detected: \"${ruleName}\" resolves outside base directory`\n ),\n })\n );\n }\n return Effect.succeed(resolvedFull);\n};\n\nconst BRAID_SECTION_START = \"<!-- braid:rules:start -->\";\nconst BRAID_SECTION_END = \"<!-- braid:rules:end -->\";\nconst YAML_SPECIAL_CHARS = /[\\n\\r:#{}[\\],&*?|>!'\"%@`]/;\n\nfunction escapeYamlValue(value: string): string {\n if (\n YAML_SPECIAL_CHARS.test(value) ||\n value.startsWith(\" \") ||\n value.endsWith(\" \")\n ) {\n return `\"${value.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, '\\\\\"')}\"`;\n }\n return value;\n}\n\nfunction buildMdcContent(rule: ExportedRule): string {\n const lines: string[] = [\"---\"];\n lines.push(`description: ${escapeYamlValue(rule.title)}`);\n lines.push(\"alwaysApply: true\");\n lines.push(\"---\");\n lines.push(\"\");\n lines.push(`# ${rule.title}`);\n lines.push(\"\");\n lines.push(rule.content);\n return lines.join(\"\\n\");\n}\n\nfunction buildAppendContent(rules: ExportedRule[]): string {\n const lines: string[] = [BRAID_SECTION_START, \"\"];\n\n for (const rule of rules) {\n lines.push(`## ${rule.title}`);\n lines.push(\"\");\n lines.push(rule.content);\n lines.push(\"\");\n }\n\n lines.push(BRAID_SECTION_END);\n return lines.join(\"\\n\");\n}\n\nconst writeMdcRules = (\n basePath: string,\n rules: ExportedRule[]\n): Effect.Effect<void, RuleWriteError> =>\n pipe(\n createDirectory(basePath),\n Effect.flatMap(() =>\n Effect.forEach(\n rules,\n (rule) =>\n pipe(\n assertRulePathWithinBase(basePath, `${rule.name}.mdc`),\n Effect.flatMap((filePath) =>\n writeTextFile(filePath, buildMdcContent(rule))\n )\n ),\n { concurrency: \"unbounded\" }\n )\n ),\n Effect.asVoid\n );\n\nconst writeMarkdownDirRules = (\n basePath: string,\n rules: ExportedRule[]\n): Effect.Effect<void, RuleWriteError> =>\n pipe(\n createDirectory(basePath),\n Effect.flatMap(() =>\n Effect.forEach(\n rules,\n (rule) =>\n pipe(\n assertRulePathWithinBase(basePath, `${rule.name}.md`),\n Effect.flatMap((filePath) =>\n writeTextFile(filePath, `# ${rule.title}\\n\\n${rule.content}`)\n )\n ),\n { concurrency: \"unbounded\" }\n )\n ),\n Effect.asVoid\n );\n\nconst writeAppendSingleRules = (\n filePath: string,\n rules: ExportedRule[]\n): Effect.Effect<void, RuleWriteError> =>\n pipe(\n createDirectory(dirname(filePath)),\n Effect.flatMap(() =>\n pipe(\n readTextFile(filePath),\n Effect.orElseSucceed(() => \"\")\n )\n ),\n Effect.flatMap((existing) => {\n const braidContent = buildAppendContent(rules);\n\n const startIdx = existing.indexOf(BRAID_SECTION_START);\n const endIdx = existing.indexOf(BRAID_SECTION_END);\n\n let newContent: string;\n if (startIdx !== -1 && endIdx !== -1) {\n newContent =\n existing.slice(0, startIdx) +\n braidContent +\n existing.slice(endIdx + BRAID_SECTION_END.length);\n } else {\n newContent = existing ? `${existing}\\n\\n${braidContent}` : braidContent;\n }\n\n return writeTextFile(filePath, newContent);\n })\n );\n\nconst writeRulesForFormat = (\n basePath: string,\n rules: ExportedRule[],\n format: RuleFormat\n): Effect.Effect<void, RuleWriteError> => {\n switch (format) {\n case \"mdc\":\n return writeMdcRules(basePath, rules);\n case \"markdown-dir\":\n return writeMarkdownDirRules(basePath, rules);\n case \"append-single\":\n return writeAppendSingleRules(basePath, rules);\n default:\n return Effect.void;\n }\n};\n\ninterface WriteRulesResult {\n written: number;\n errors: Array<{ agent: string; error: string }>;\n}\n\nconst writeRulesForAgent = (\n agent: AgentConfig,\n rules: ExportedRule[],\n rulesPath: string\n): Effect.Effect<WriteRulesResult, never> => {\n if (!agent.ruleFormat || rules.length === 0) {\n return Effect.succeed({ written: 0, errors: [] });\n }\n\n return pipe(\n writeRulesForFormat(rulesPath, rules, agent.ruleFormat),\n Effect.map(() => ({\n written: rules.length,\n errors: [] as Array<{ agent: string; error: string }>,\n })),\n Effect.catchAll((error) =>\n Effect.succeed({\n written: 0,\n errors: [\n {\n agent: agent.name,\n error:\n error.cause instanceof Error\n ? error.cause.message\n : String(error.cause),\n },\n ],\n })\n )\n );\n};\n\nconst writeRulesForAgentAsync = (\n agent: AgentConfig,\n rules: ExportedRule[],\n rulesPath: string\n): Promise<WriteRulesResult> =>\n Effect.runPromise(writeRulesForAgent(agent, rules, rulesPath));\n\nexport type { WriteRulesResult };\nexport { RuleWriteError, writeRulesForAgent, writeRulesForAgentAsync };\n","import { chmod, mkdir, writeFile } from \"node:fs/promises\";\nimport { dirname, resolve, sep } from \"node:path\";\nimport { Data, Effect, pipe } from \"effect\";\nimport type { AgentId } from \"./agents.ts\";\nimport type { Skill, SkillFile } from \"./api.ts\";\n\nclass WriteError extends Data.TaggedError(\"WriteError\")<{\n path: string;\n operation: \"mkdir\" | \"write\" | \"chmod\";\n cause: unknown;\n}> {}\n\nconst createDirectory = (\n dir: string,\n fullPath: string\n): Effect.Effect<void, WriteError> =>\n Effect.tryPromise({\n try: () => mkdir(dir, { recursive: true }),\n catch: (e) =>\n new WriteError({ path: fullPath, operation: \"mkdir\", cause: e }),\n });\n\nconst writeTextFile = (\n fullPath: string,\n content: string\n): Effect.Effect<void, WriteError> =>\n Effect.tryPromise({\n try: () => writeFile(fullPath, content, \"utf-8\"),\n catch: (e) =>\n new WriteError({ path: fullPath, operation: \"write\", cause: e }),\n });\n\nconst writeBinaryFile = (\n fullPath: string,\n content: Buffer\n): Effect.Effect<void, WriteError> =>\n Effect.tryPromise({\n try: () => writeFile(fullPath, content),\n catch: (e) =>\n new WriteError({ path: fullPath, operation: \"write\", cause: e }),\n });\n\nconst makeExecutable = (fullPath: string): Effect.Effect<void, WriteError> =>\n Effect.tryPromise({\n try: () => chmod(fullPath, 0o755),\n catch: (e) =>\n new WriteError({ path: fullPath, operation: \"chmod\", cause: e }),\n });\n\nconst assertWithinBase = (\n basePath: string,\n untrustedPath: string\n): Effect.Effect<string, WriteError> => {\n const resolvedBase = resolve(basePath);\n const resolvedFull = resolve(basePath, untrustedPath);\n if (\n resolvedFull !== resolvedBase &&\n !resolvedFull.startsWith(resolvedBase + sep)\n ) {\n return Effect.fail(\n new WriteError({\n path: untrustedPath,\n operation: \"write\",\n cause: new Error(\n `Path traversal detected: \"${untrustedPath}\" resolves outside base directory`\n ),\n })\n );\n }\n return Effect.succeed(resolvedFull);\n};\n\nconst COMPATIBILITY_REGEX = /^compatibility:\\s*.+$/m;\n\nconst rewriteCompatibility = (content: string, agentId: AgentId): string => {\n return content.replace(COMPATIBILITY_REGEX, `compatibility: ${agentId}`);\n};\n\nconst decodeFileContent = (file: SkillFile, agentId?: AgentId): string => {\n let content: string;\n if (file.encoding === \"base64\") {\n content = Buffer.from(file.content, \"base64\").toString(\"utf-8\");\n } else {\n content = file.content;\n }\n\n if (agentId && file.path === \"SKILL.md\") {\n content = rewriteCompatibility(content, agentId);\n }\n\n return content;\n};\n\nconst decodeFileContentBinary = (file: SkillFile): Buffer => {\n if (file.encoding === \"base64\") {\n return Buffer.from(file.content, \"base64\");\n }\n return Buffer.from(file.content, \"utf-8\");\n};\n\nconst isBinaryFile = (path: string): boolean => {\n const binaryExtensions = [\n \".png\",\n \".jpg\",\n \".jpeg\",\n \".gif\",\n \".webp\",\n \".ico\",\n \".bmp\",\n ];\n return binaryExtensions.some((ext) => path.toLowerCase().endsWith(ext));\n};\n\n/**\n * Determines if a file should be made executable based on its path and extension.\n *\n * A file is considered a script if ALL of the following conditions are met:\n * 1. The file path contains \"/scripts/\" (indicating it's in a scripts directory)\n * 2. The file has a recognized script extension (.sh, .bash, .py, .js, .mjs, .rb)\n *\n * **Important behavior notes:**\n * - Files in the scripts/ directory WITHOUT a recognized extension will NOT be executable\n * - Files with script extensions OUTSIDE the scripts/ directory will NOT be executable\n * - No content validation is performed - the decision is purely path and extension based\n * - This follows the Agent Skills standard where executable scripts are placed in scripts/\n *\n * **Security consideration:**\n * This is a defensive approach that requires both correct location AND extension to grant\n * execute permissions. While a user could theoretically place a non-script file with a\n * script extension in scripts/, the dual requirement (path + extension) provides a\n * reasonable safeguard for the expected use case of skill distribution.\n *\n * @param path - The file path relative to the skill root\n * @returns true if the file should receive executable permissions (chmod 0o755)\n *\n * @example\n * isScriptFile(\"scripts/deploy.sh\") // true - in scripts/, has .sh extension\n * isScriptFile(\"scripts/setup.py\") // true - in scripts/, has .py extension\n * isScriptFile(\"src/scripts/deploy.sh\") // true - in nested scripts/, has .sh extension\n * isScriptFile(\"scripts/readme.txt\") // false - in scripts/, but not a script extension\n * isScriptFile(\"src/index.js\") // false - has .js extension, but not in scripts/\n * isScriptFile(\"deploy.sh\") // false - has .sh extension, but not in scripts/\n */\nconst isScriptFile = (path: string): boolean => {\n const scriptExtensions = [\".sh\", \".bash\", \".py\", \".js\", \".mjs\", \".rb\"];\n const lowerPath = path.toLowerCase();\n const inScriptsDir =\n lowerPath.includes(\"/scripts/\") || lowerPath.startsWith(\"scripts/\");\n return (\n inScriptsDir && scriptExtensions.some((ext) => lowerPath.endsWith(ext))\n );\n};\n\nconst writeFileContent = (\n fullPath: string,\n file: SkillFile,\n agentId?: AgentId\n): Effect.Effect<void, WriteError> =>\n isBinaryFile(file.path)\n ? writeBinaryFile(fullPath, decodeFileContentBinary(file))\n : writeTextFile(fullPath, decodeFileContent(file, agentId));\n\n/**\n * Conditionally sets executable permissions on a file if it's identified as a script.\n *\n * This function uses {@link isScriptFile} to determine if the file should be executable.\n * Only files in the scripts/ directory with recognized script extensions will receive\n * executable permissions (chmod 0o755).\n *\n * @param fullPath - The absolute filesystem path where the file is written\n * @param filePath - The relative path within the skill (used for script detection)\n * @returns Effect that succeeds after setting permissions, or immediately if not a script\n */\nconst setExecutableIfScript = (\n fullPath: string,\n file: SkillFile,\n agentId?: AgentId\n): Effect.Effect<void, WriteError> =>\n isScriptFile(file.path) && decodeFileContent(file, agentId).startsWith(\"#!\")\n ? makeExecutable(fullPath)\n : Effect.void;\n\nconst writeSkillFile = (\n basePath: string,\n file: SkillFile,\n agentId?: AgentId\n): Effect.Effect<void, WriteError> =>\n pipe(\n assertWithinBase(basePath, file.path),\n Effect.flatMap((fullPath) => {\n const dir = dirname(fullPath);\n return pipe(\n createDirectory(dir, fullPath),\n Effect.flatMap(() => writeFileContent(fullPath, file, agentId)),\n Effect.flatMap(() => setExecutableIfScript(fullPath, file, agentId))\n );\n })\n );\n\nconst writeSkill = (\n basePath: string,\n skill: Skill,\n agentId?: AgentId\n): Effect.Effect<void, WriteError> =>\n pipe(\n assertWithinBase(basePath, skill.name),\n Effect.flatMap((skillDir) =>\n pipe(\n Effect.forEach(\n skill.files,\n (file) => writeSkillFile(skillDir, file, agentId),\n {\n concurrency: \"unbounded\",\n }\n ),\n Effect.map(() => undefined)\n )\n )\n );\n\ninterface WriteSkillsResult {\n written: string[];\n errors: Array<{ skill: string; error: string }>;\n}\n\n/**\n * Writes multiple skills to disk\n *\n * @param basePath - Base directory to write skills to (e.g., \".claude/skills\")\n * @param skills - Skills to write\n * @param agentId - Agent ID to set in compatibility field\n */\nconst writeSkills = (\n basePath: string,\n skills: Skill[],\n agentId?: AgentId\n): Effect.Effect<WriteSkillsResult, never> =>\n pipe(\n Effect.forEach(\n skills,\n (skill) =>\n pipe(\n writeSkill(basePath, skill, agentId),\n Effect.map(() => ({ success: true as const, skill: skill.name })),\n Effect.catchAll((error) =>\n Effect.succeed({\n success: false as const,\n skill: skill.name,\n error:\n error.cause instanceof Error\n ? error.cause.message\n : String(error.cause),\n })\n )\n ),\n { concurrency: \"unbounded\" }\n ),\n Effect.map((results) => ({\n written: results.filter((r) => r.success).map((r) => r.skill),\n errors: results\n .filter(\n (r): r is { success: false; skill: string; error: string } =>\n !r.success\n )\n .map((r) => ({ skill: r.skill, error: r.error })),\n }))\n );\n\nconst writeSkillAsync = (\n basePath: string,\n skill: Skill,\n agentId?: AgentId\n): Promise<void> => Effect.runPromise(writeSkill(basePath, skill, agentId));\n\nconst writeSkillsAsync = (\n basePath: string,\n skills: Skill[],\n agentId?: AgentId\n): Promise<WriteSkillsResult> =>\n Effect.runPromise(writeSkills(basePath, skills, agentId));\n\nexport type { WriteSkillsResult };\nexport {\n decodeFileContent,\n decodeFileContentBinary,\n isBinaryFile,\n isScriptFile,\n WriteError,\n writeSkill,\n writeSkillAsync,\n writeSkillFile,\n writeSkills,\n writeSkillsAsync,\n};\n","import { log, spinner } from \"@clack/prompts\";\nimport type { DetectedAgent } from \"../lib/agents.ts\";\nimport {\n detectAgentsAsync,\n directoryExistsAsync,\n resolveInstallPath,\n} from \"../lib/agents.ts\";\nimport type { InstalledSkill } from \"../lib/metadata.ts\";\nimport { readMetadataAsync } from \"../lib/metadata.ts\";\n\ninterface ListOptions {\n global?: boolean;\n}\n\nfunction formatRelativeTime(isoDate: string): string {\n const date = new Date(isoDate);\n const now = new Date();\n const diffMs = now.getTime() - date.getTime();\n const diffMins = Math.floor(diffMs / 60_000);\n const diffHours = Math.floor(diffMins / 60);\n const diffDays = Math.floor(diffHours / 24);\n\n if (diffMins < 1) {\n return \"just now\";\n }\n if (diffMins < 60) {\n return `${diffMins} minute${diffMins !== 1 ? \"s\" : \"\"} ago`;\n }\n if (diffHours < 24) {\n return `${diffHours} hour${diffHours !== 1 ? \"s\" : \"\"} ago`;\n }\n if (diffDays < 30) {\n return `${diffDays} day${diffDays !== 1 ? \"s\" : \"\"} ago`;\n }\n return date.toLocaleDateString();\n}\n\nfunction displayAgentSkills(\n agent: DetectedAgent,\n installPath: string,\n braidSkills: InstalledSkill[]\n): void {\n const nameWidth = 25;\n const sourceWidth = 20;\n const installedWidth = 15;\n\n log.info(\"\");\n log.info(`Agent: ${agent.name} (${installPath})`);\n log.info(\"─\".repeat(60));\n\n const header = [\n \"Skill\".padEnd(nameWidth),\n \"Source\".padEnd(sourceWidth),\n \"Installed\".padEnd(installedWidth),\n ].join(\" \");\n\n log.info(header);\n log.info(\"─\".repeat(60));\n\n for (const skill of braidSkills) {\n const sourceName = skill.source.name;\n\n const row = [\n skill.name.slice(0, nameWidth).padEnd(nameWidth),\n sourceName.slice(0, sourceWidth).padEnd(sourceWidth),\n formatRelativeTime(skill.installedAt).padEnd(installedWidth),\n ].join(\" \");\n\n log.info(row);\n }\n}\n\nexport async function listCommand(options: ListOptions): Promise<void> {\n const listSpinner = spinner();\n listSpinner.start(\"Scanning for installed skills...\");\n\n try {\n const detectedAgents = await detectAgentsAsync();\n\n if (detectedAgents.length === 0) {\n listSpinner.stop(\"No agents detected\");\n log.warn(\"No AI coding agents detected.\");\n return;\n }\n\n listSpinner.stop(`Found ${detectedAgents.length} agent(s)`);\n\n let totalSkills = 0;\n\n for (const agent of detectedAgents) {\n const installPath = resolveInstallPath(agent, {\n global: options.global === true,\n });\n if (!installPath) {\n continue;\n }\n const exists = await directoryExistsAsync(installPath);\n\n if (!exists) {\n continue;\n }\n\n const metadata = await readMetadataAsync(installPath);\n const braidSkills = metadata.skills;\n\n if (braidSkills.length === 0) {\n continue;\n }\n\n totalSkills += braidSkills.length;\n displayAgentSkills(agent, installPath, braidSkills);\n }\n\n if (totalSkills === 0) {\n log.warn(\"\\nNo skills installed via braid.\");\n log.info(\"Run 'braid install --profile <name>' to install skills.\");\n } else {\n log.info(\"\");\n log.info(`Total: ${totalSkills} skill(s) installed`);\n }\n } catch (error) {\n listSpinner.stop(\"List failed\");\n const message = error instanceof Error ? error.message : String(error);\n log.error(message);\n process.exit(1);\n }\n}\n","import process from \"node:process\";\nimport type { AgentConfig } from \"../lib/agents.ts\";\nimport {\n AGENTS,\n buildMcpEntry,\n detectMcpAgents,\n hasMcpConfig,\n resolveMcpConfigPath,\n} from \"../lib/agents.ts\";\nimport { loadMergedConfigAsync } from \"../lib/config.ts\";\nimport {\n hasbraidEntry,\n mergebraidEntry,\n readMcpConfigAsync,\n removebraidEntry,\n writeMcpConfigAsync,\n} from \"../lib/mcp-config.ts\";\nimport {\n cancel,\n intro,\n isCancel,\n log,\n outro,\n password,\n select,\n spinner,\n} from \"../lib/tui.ts\";\n\ninterface McpOptions {\n tool?: string;\n global?: boolean;\n token?: string;\n auth?: boolean;\n scope?: boolean;\n remove?: boolean;\n status?: boolean;\n helpCommands?: boolean;\n yes?: boolean;\n server?: string;\n}\n\nconst BRAID_ENTRY_NAME = \"braid\";\n\nfunction maskToken(token: string): string {\n if (token.length <= 10) {\n return token;\n }\n return `${token.slice(0, 7)}...${token.slice(-4)}`;\n}\n\nfunction getMcpAgents(): AgentConfig[] {\n return AGENTS.filter(hasMcpConfig);\n}\n\nfunction resolveScope(\n agent: AgentConfig,\n options: McpOptions\n): \"project\" | \"global\" {\n if (options.global) {\n return \"global\";\n }\n if (agent.mcpProjectConfigPath) {\n return \"project\";\n }\n return \"global\";\n}\n\nasync function selectTool(\n mcpAgents: AgentConfig[],\n toolFlag?: string\n): Promise<AgentConfig> {\n if (toolFlag) {\n const agent = mcpAgents.find((a) => a.id === toolFlag);\n if (!agent) {\n log.error(`Unknown or unsupported tool: ${toolFlag}`);\n log.info(`Supported tools: ${mcpAgents.map((a) => a.id).join(\", \")}`);\n process.exit(1);\n }\n return agent;\n }\n\n const detected = await detectMcpAgents();\n const detectedIds = new Set(detected.map((a) => a.id));\n\n const toolChoice = await select({\n message: \"Select tool to configure:\",\n options: mcpAgents.map((agent) => ({\n value: agent.id as string,\n label: agent.name,\n hint: [\n agent.mcpProjectConfigPath ?? agent.mcpGlobalConfigPath,\n detectedIds.has(agent.id) ? \"detected\" : undefined,\n ]\n .filter(Boolean)\n .join(\" — \"),\n })),\n });\n\n if (isCancel(toolChoice)) {\n cancel(\"MCP setup cancelled.\");\n process.exit(0);\n }\n\n const found = mcpAgents.find((a) => a.id === toolChoice);\n if (!found) {\n log.error(\"Agent not found.\");\n process.exit(1);\n }\n return found;\n}\n\nasync function selectScope(\n agent: AgentConfig,\n options: McpOptions\n): Promise<\"project\" | \"global\"> {\n const initial = resolveScope(agent, options);\n\n if (\n options.global ||\n options.yes ||\n !agent.mcpProjectConfigPath ||\n !agent.mcpGlobalConfigPath\n ) {\n return initial;\n }\n\n const scopeChoice = await select({\n message: \"Where should this be configured?\",\n options: [\n {\n value: \"project\" as const,\n label: \"Project\",\n hint: agent.mcpProjectConfigPath,\n },\n {\n value: \"global\" as const,\n label: \"Global\",\n hint: agent.mcpGlobalConfigPath,\n },\n ],\n });\n\n if (isCancel(scopeChoice)) {\n cancel(\"MCP setup cancelled.\");\n process.exit(0);\n }\n\n return scopeChoice;\n}\n\nasync function resolveToken(\n options: McpOptions,\n existingToken?: string\n): Promise<string | undefined> {\n if (options.auth === false) {\n return undefined;\n }\n\n if (options.token) {\n return options.token;\n }\n\n if (existingToken && options.yes) {\n return existingToken;\n }\n\n if (existingToken) {\n const authChoice = await select({\n message: \"Authentication:\",\n options: [\n {\n value: \"existing\" as const,\n label: `Use existing token (${maskToken(existingToken)})`,\n },\n { value: \"new\" as const, label: \"Enter a new token\" },\n {\n value: \"skip\" as const,\n label: \"Skip — set BRAID_TOKEN env var later\",\n },\n ],\n });\n\n if (isCancel(authChoice)) {\n cancel(\"MCP setup cancelled.\");\n process.exit(0);\n }\n\n if (authChoice === \"existing\") {\n return existingToken;\n }\n if (authChoice === \"skip\") {\n return undefined;\n }\n }\n\n const token = await password({\n message: \"Enter your braid API token:\",\n validate: (value) => {\n if (!value) {\n return \"Token is required\";\n }\n if (!value.startsWith(\"br_\")) {\n return \"Token should start with 'br_'\";\n }\n return undefined;\n },\n });\n\n if (isCancel(token)) {\n cancel(\"MCP setup cancelled.\");\n process.exit(0);\n }\n\n return token;\n}\n\nfunction buildEnvVars(\n token: string | undefined,\n server: string | undefined\n): Record<string, string> {\n const env: Record<string, string> = {};\n if (token) {\n env.BRAID_TOKEN = token;\n }\n if (server) {\n env.BRAID_MCP_URL = server;\n }\n return env;\n}\n\nasync function writeEntry(\n agent: AgentConfig,\n configPath: string,\n env: Record<string, string>\n): Promise<void> {\n const entry = buildMcpEntry(agent.mcpEntryStyle ?? \"standard\", env);\n const rootKey = agent.mcpRootKey ?? \"mcpServers\";\n\n const existingConfig = await readMcpConfigAsync(configPath);\n const updatedConfig = mergebraidEntry(\n existingConfig,\n rootKey,\n BRAID_ENTRY_NAME,\n entry as Record<string, unknown>\n );\n await writeMcpConfigAsync(configPath, updatedConfig);\n}\n\nasync function addFlow(options: McpOptions): Promise<void> {\n const config = await loadMergedConfigAsync();\n const mcpAgents = getMcpAgents();\n\n if (mcpAgents.length === 0) {\n log.error(\"No agents with MCP configuration support found.\");\n process.exit(1);\n }\n\n const selectedAgent = await selectTool(mcpAgents, options.tool);\n const scope = await selectScope(selectedAgent, options);\n\n const configPath = resolveMcpConfigPath(selectedAgent, {\n global: scope === \"global\",\n });\n\n if (!configPath) {\n log.error(`No ${scope} config path available for ${selectedAgent.name}.`);\n process.exit(1);\n }\n\n const token = await resolveToken(options, config.token);\n const env = buildEnvVars(token, options.server);\n\n if (options.scope) {\n const { scopeCommand } = await import(\"./scope.ts\");\n await scopeCommand({\n server: options.server ?? config.serverUrl,\n ...(config.token ? { apiKey: config.token } : {}),\n });\n }\n\n const mcpSpinner = spinner();\n mcpSpinner.start(`Configuring ${selectedAgent.name}...`);\n\n try {\n await writeEntry(selectedAgent, configPath, env);\n\n mcpSpinner.stop(`Configured ${selectedAgent.name}`);\n log.info(`Config written to ${configPath}`);\n\n if (!token) {\n log.info(\"Set BRAID_TOKEN environment variable before using.\");\n }\n\n outro(`Done! Restart ${selectedAgent.name} to activate.`);\n } catch (error) {\n mcpSpinner.stop(\"Configuration failed\");\n const message = error instanceof Error ? error.message : String(error);\n log.error(`Failed to write config: ${message}`);\n process.exit(1);\n }\n}\n\nasync function removeFlow(options: McpOptions): Promise<void> {\n const mcpAgents = getMcpAgents();\n const selectedAgent = await selectTool(mcpAgents, options.tool);\n\n const scope = resolveScope(selectedAgent, options);\n const configPath = resolveMcpConfigPath(selectedAgent, {\n global: scope === \"global\",\n });\n\n if (!configPath) {\n log.error(`No ${scope} config path available for ${selectedAgent.name}.`);\n process.exit(1);\n }\n\n const removeSpinner = spinner();\n removeSpinner.start(`Removing braid from ${selectedAgent.name}...`);\n\n try {\n const rootKey = selectedAgent.mcpRootKey ?? \"mcpServers\";\n const existingConfig = await readMcpConfigAsync(configPath);\n\n if (!hasbraidEntry(existingConfig, rootKey, BRAID_ENTRY_NAME)) {\n removeSpinner.stop(\"No braid MCP entry found\");\n log.info(\n `${selectedAgent.name} doesn't have a braid MCP entry at ${configPath}`\n );\n return;\n }\n\n const updatedConfig = removebraidEntry(\n existingConfig,\n rootKey,\n BRAID_ENTRY_NAME\n );\n await writeMcpConfigAsync(configPath, updatedConfig);\n\n removeSpinner.stop(`Removed braid from ${selectedAgent.name}`);\n outro(`braid MCP removed from ${configPath}`);\n } catch (error) {\n removeSpinner.stop(\"Removal failed\");\n const message = error instanceof Error ? error.message : String(error);\n log.error(`Failed to remove config: ${message}`);\n process.exit(1);\n }\n}\n\nasync function statusFlow(): Promise<void> {\n const mcpAgents = getMcpAgents();\n const statusSpinner = spinner();\n statusSpinner.start(\"Checking MCP configuration status...\");\n\n const results: Array<{\n name: string;\n path: string;\n scope: string;\n }> = [];\n\n for (const agent of mcpAgents) {\n const rootKey = agent.mcpRootKey ?? \"mcpServers\";\n\n for (const scope of [\"project\", \"global\"] as const) {\n const configPath = resolveMcpConfigPath(agent, {\n global: scope === \"global\",\n });\n if (!configPath) {\n continue;\n }\n\n const config = await readMcpConfigAsync(configPath);\n if (hasbraidEntry(config, rootKey, BRAID_ENTRY_NAME)) {\n results.push({\n name: agent.name,\n path: configPath,\n scope,\n });\n }\n }\n }\n\n statusSpinner.stop(`Found ${results.length} configured tool(s)`);\n\n if (results.length === 0) {\n log.info(\"No tools have braid MCP configured.\");\n log.info(\"Run 'braid mcp' to set up MCP for your AI tools.\");\n return;\n }\n\n for (const result of results) {\n log.info(` ${result.name} (${result.scope}) → ${result.path}`);\n }\n}\n\nfunction helpCommandsFlow(): void {\n log.info(\"MCP manual command reference:\");\n log.info(\" braid projects list --json\");\n log.info(\" braid rules list --json\");\n log.info(\" braid skills list --profile <name> --json\");\n log.info(\"\");\n log.info(\"Common local management commands:\");\n log.info(\" braid install --yes --profile <name>\");\n log.info(\" braid update --yes\");\n log.info(\" braid list\");\n log.info(\" braid remove --yes --all\");\n log.info(\n \" braid scope --file user --organization personal --source profile --profile <name>\"\n );\n}\n\nexport async function mcpCommand(options: McpOptions): Promise<void> {\n if (options.helpCommands) {\n intro(\"braid mcp help\");\n helpCommandsFlow();\n return;\n }\n\n if (options.status) {\n intro(\"braid mcp status\");\n await statusFlow();\n return;\n }\n\n if (options.remove) {\n intro(\"braid mcp remove\");\n await removeFlow(options);\n return;\n }\n\n intro(\"braid mcp\");\n await addFlow(options);\n}\n","import { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\nimport { Data, Effect, pipe } from \"effect\";\n\nclass McpConfigReadError extends Data.TaggedError(\"McpConfigReadError\")<{\n path: string;\n cause: unknown;\n}> {}\n\nclass McpConfigWriteError extends Data.TaggedError(\"McpConfigWriteError\")<{\n path: string;\n cause: unknown;\n}> {}\n\ntype JsonObject = Record<string, unknown>;\n\nconst readMcpConfig = (\n path: string\n): Effect.Effect<JsonObject, McpConfigReadError> =>\n pipe(\n Effect.tryPromise({\n try: () => readFile(path, \"utf-8\"),\n catch: (e) => new McpConfigReadError({ path, cause: e }),\n }),\n Effect.flatMap((content) =>\n Effect.try({\n try: () => JSON.parse(content) as JsonObject,\n catch: () => ({}) as JsonObject,\n })\n ),\n Effect.orElseSucceed(() => ({}) as JsonObject)\n );\n\nconst writeMcpConfig = (\n path: string,\n config: JsonObject\n): Effect.Effect<void, McpConfigWriteError> =>\n Effect.tryPromise({\n try: async () => {\n await mkdir(dirname(path), { recursive: true, mode: 0o700 });\n await writeFile(path, `${JSON.stringify(config, null, 2)}\\n`, {\n encoding: \"utf-8\",\n mode: 0o600,\n });\n },\n catch: (e) => new McpConfigWriteError({ path, cause: e }),\n });\n\nconst mergebraidEntry = (\n config: JsonObject,\n rootKey: string,\n entryName: string,\n entry: JsonObject\n): JsonObject => {\n const servers = (config[rootKey] ?? {}) as JsonObject;\n return {\n ...config,\n [rootKey]: {\n ...servers,\n [entryName]: entry,\n },\n };\n};\n\nconst removebraidEntry = (\n config: JsonObject,\n rootKey: string,\n entryName: string\n): JsonObject => {\n const servers = { ...((config[rootKey] ?? {}) as JsonObject) };\n delete servers[entryName];\n return {\n ...config,\n [rootKey]: servers,\n };\n};\n\nconst hasbraidEntry = (\n config: JsonObject,\n rootKey: string,\n entryName: string\n): boolean => {\n const servers = config[rootKey] as JsonObject | undefined;\n return servers !== undefined && entryName in servers;\n};\n\nconst readMcpConfigAsync = (path: string): Promise<JsonObject> =>\n Effect.runPromise(readMcpConfig(path));\n\nconst writeMcpConfigAsync = (path: string, config: JsonObject): Promise<void> =>\n Effect.runPromise(writeMcpConfig(path, config));\n\nexport type { JsonObject };\nexport {\n hasbraidEntry,\n McpConfigReadError,\n McpConfigWriteError,\n mergebraidEntry,\n readMcpConfig,\n readMcpConfigAsync,\n removebraidEntry,\n writeMcpConfig,\n writeMcpConfigAsync,\n};\n","import process from \"node:process\";\nimport { runLifecycleCommandAsync } from \"../lib/api.ts\";\nimport { log } from \"../lib/tui.ts\";\n\ninterface LifecycleOptions {\n server?: string;\n apiKey?: string;\n json?: boolean;\n}\n\ninterface ProfileIdOptions extends LifecycleOptions {\n id?: string;\n}\n\ninterface ProfileGetOptions extends LifecycleOptions {\n id?: string;\n name?: string;\n}\n\ninterface ProfileCreateOptions extends LifecycleOptions {\n name?: string;\n contextJson?: string;\n}\n\ninterface ProfileUpdateOptions extends LifecycleOptions {\n id?: string;\n name?: string;\n contextJson?: string;\n}\n\ninterface ProfileRemoveOptions extends ProfileIdOptions {\n yes?: boolean;\n}\n\nconst writeJson = (value: unknown): void => {\n process.stdout.write(`${JSON.stringify(value, null, 2)}\\n`);\n};\n\nconst exitWithError = (error: unknown): never => {\n const message = error instanceof Error ? error.message : String(error);\n log.error(message);\n process.exit(1);\n};\n\nconst fail = (message: string): never => {\n throw new Error(message);\n};\n\nconst parseContext = (\n contextJson?: string\n): Record<string, unknown> | undefined => {\n if (!contextJson) {\n return undefined;\n }\n return JSON.parse(contextJson) as Record<string, unknown>;\n};\n\nconst run = async (\n command: string,\n args: Record<string, unknown>,\n options: LifecycleOptions\n): Promise<void> => {\n const apiOptions = {\n ...(options.server ? { serverUrl: options.server } : {}),\n ...(options.apiKey ? { apiKey: options.apiKey } : {}),\n };\n\n const result = await runLifecycleCommandAsync(\n {\n domain: \"profiles\",\n command,\n args,\n },\n apiOptions\n );\n\n if (options.json) {\n writeJson(result);\n return;\n }\n\n log.success(`profiles ${command} completed`);\n};\n\nexport async function profilesListCommand(\n options: LifecycleOptions\n): Promise<void> {\n try {\n await run(\"list\", {}, options);\n } catch (error) {\n exitWithError(error);\n }\n}\n\nexport async function profilesGetCommand(\n options: ProfileGetOptions\n): Promise<void> {\n try {\n if (!(options.id || options.name)) {\n fail(\"profiles get requires --id or --name\");\n }\n await run(\"get\", { id: options.id, name: options.name }, options);\n } catch (error) {\n exitWithError(error);\n }\n}\n\nexport async function profilesCreateCommand(\n options: ProfileCreateOptions\n): Promise<void> {\n try {\n const name = options.name ?? fail(\"profiles create requires --name\");\n await run(\n \"create\",\n { name, context: parseContext(options.contextJson) },\n options\n );\n } catch (error) {\n exitWithError(error);\n }\n}\n\nexport async function profilesUpdateCommand(\n options: ProfileUpdateOptions\n): Promise<void> {\n try {\n const id = options.id ?? fail(\"profiles update requires --id\");\n await run(\n \"update\",\n {\n id,\n name: options.name,\n context: parseContext(options.contextJson),\n },\n options\n );\n } catch (error) {\n exitWithError(error);\n }\n}\n\nexport async function profilesRemoveCommand(\n options: ProfileRemoveOptions\n): Promise<void> {\n try {\n const id = options.id ?? fail(\"profiles remove requires --id\");\n if (!options.yes) {\n fail(\"profiles remove requires --yes\");\n }\n await run(\"remove\", { id, yes: true }, options);\n } catch (error) {\n exitWithError(error);\n }\n}\n\nexport async function profilesSetDefaultCommand(\n options: ProfileIdOptions\n): Promise<void> {\n try {\n const id = options.id ?? fail(\"profiles set-default requires --id\");\n await run(\"set-default\", { id }, options);\n } catch (error) {\n exitWithError(error);\n }\n}\n","import process from \"node:process\";\nimport { runLifecycleCommandAsync } from \"../lib/api.ts\";\nimport { log } from \"../lib/tui.ts\";\n\ninterface LifecycleOptions {\n server?: string;\n apiKey?: string;\n json?: boolean;\n}\n\ninterface ProjectsGetOptions extends LifecycleOptions {\n id?: string;\n}\n\ninterface ProjectsCreateOptions extends LifecycleOptions {\n name?: string;\n description?: string;\n orgId?: string;\n}\n\ninterface ProjectsUpdateOptions extends LifecycleOptions {\n id?: string;\n name?: string;\n description?: string;\n}\n\ninterface ProjectsRemoveOptions extends LifecycleOptions {\n id?: string;\n yes?: boolean;\n}\n\nconst writeJson = (value: unknown): void => {\n process.stdout.write(`${JSON.stringify(value, null, 2)}\\n`);\n};\n\nconst fail = (message: string): never => {\n throw new Error(message);\n};\n\nconst run = async (\n command: string,\n args: Record<string, unknown>,\n options: LifecycleOptions\n): Promise<void> => {\n const apiOptions = {\n ...(options.server ? { serverUrl: options.server } : {}),\n ...(options.apiKey ? { apiKey: options.apiKey } : {}),\n };\n\n const result = await runLifecycleCommandAsync(\n {\n domain: \"projects\",\n command,\n args,\n },\n apiOptions\n );\n\n if (options.json) {\n writeJson(result);\n return;\n }\n\n log.success(`projects ${command} completed`);\n};\n\nconst exitWithError = (error: unknown): never => {\n const message = error instanceof Error ? error.message : String(error);\n log.error(message);\n process.exit(1);\n};\n\nexport async function projectsGetCommand(\n options: ProjectsGetOptions\n): Promise<void> {\n try {\n const id = options.id ?? fail(\"projects get requires --id\");\n await run(\"get\", { id }, options);\n } catch (error) {\n exitWithError(error);\n }\n}\n\nexport async function projectsCreateCommand(\n options: ProjectsCreateOptions\n): Promise<void> {\n try {\n const name = options.name ?? fail(\"projects create requires --name\");\n await run(\n \"create\",\n { name, description: options.description, orgId: options.orgId },\n options\n );\n } catch (error) {\n exitWithError(error);\n }\n}\n\nexport async function projectsUpdateCommand(\n options: ProjectsUpdateOptions\n): Promise<void> {\n try {\n const id = options.id ?? fail(\"projects update requires --id\");\n await run(\n \"update\",\n {\n id,\n name: options.name,\n description: options.description,\n },\n options\n );\n } catch (error) {\n exitWithError(error);\n }\n}\n\nexport async function projectsRemoveCommand(\n options: ProjectsRemoveOptions\n): Promise<void> {\n try {\n const id = options.id ?? fail(\"projects remove requires --id\");\n if (!options.yes) {\n fail(\"projects remove requires --yes\");\n }\n await run(\"remove\", { id, yes: true }, options);\n } catch (error) {\n exitWithError(error);\n }\n}\n","import process from \"node:process\";\nimport { runLifecycleCommandAsync } from \"../lib/api.ts\";\nimport { log } from \"../lib/tui.ts\";\n\ninterface LifecycleOptions {\n server?: string;\n apiKey?: string;\n json?: boolean;\n}\n\ninterface ReferenceIdOptions extends LifecycleOptions {\n id?: string;\n}\n\ninterface ReferencesListOptions extends LifecycleOptions {\n ruleId?: string;\n}\n\ninterface ReferencesCreateOptions extends LifecycleOptions {\n ruleId?: string;\n file?: string;\n}\n\ninterface ReferencesUpdateOptions extends LifecycleOptions {\n id?: string;\n label?: string;\n replaceFile?: string;\n}\n\ninterface ReferencesRemoveOptions extends ReferenceIdOptions {\n yes?: boolean;\n}\n\ninterface ReferencesReorderOptions extends LifecycleOptions {\n ruleId?: string;\n orderedIds?: string;\n}\n\nconst writeJson = (value: unknown): void => {\n process.stdout.write(`${JSON.stringify(value, null, 2)}\\n`);\n};\n\nconst parseCsv = (input?: string): string[] | undefined => {\n if (!input) {\n return undefined;\n }\n const values = input\n .split(\",\")\n .map((value) => value.trim())\n .filter((value) => value.length > 0);\n return values.length > 0 ? values : undefined;\n};\n\nconst exitWithError = (error: unknown): never => {\n const message = error instanceof Error ? error.message : String(error);\n log.error(message);\n process.exit(1);\n};\n\nconst fail = (message: string): never => {\n throw new Error(message);\n};\n\nconst run = async (\n command: string,\n args: Record<string, unknown>,\n options: LifecycleOptions\n): Promise<void> => {\n const apiOptions = {\n ...(options.server ? { serverUrl: options.server } : {}),\n ...(options.apiKey ? { apiKey: options.apiKey } : {}),\n };\n\n const result = await runLifecycleCommandAsync(\n {\n domain: \"references\",\n command,\n args,\n },\n apiOptions\n );\n\n if (options.json) {\n writeJson(result);\n return;\n }\n\n log.success(`references ${command} completed`);\n};\n\nexport async function referencesListCommand(\n options: ReferencesListOptions\n): Promise<void> {\n try {\n const ruleId = options.ruleId ?? fail(\"references list requires --rule-id\");\n await run(\"list\", { ruleId }, options);\n } catch (error) {\n exitWithError(error);\n }\n}\n\nexport async function referencesGetCommand(\n options: ReferenceIdOptions\n): Promise<void> {\n try {\n const id = options.id ?? fail(\"references get requires --id\");\n await run(\"get\", { id }, options);\n } catch (error) {\n exitWithError(error);\n }\n}\n\nexport async function referencesCreateCommand(\n options: ReferencesCreateOptions\n): Promise<void> {\n try {\n const ruleId =\n options.ruleId ?? fail(\"references create requires --rule-id\");\n const file = options.file ?? fail(\"references create requires --file\");\n await run(\"create\", { ruleId, file }, options);\n } catch (error) {\n exitWithError(error);\n }\n}\n\nexport async function referencesUpdateCommand(\n options: ReferencesUpdateOptions\n): Promise<void> {\n try {\n const id = options.id ?? fail(\"references update requires --id\");\n await run(\n \"update\",\n { id, label: options.label, replaceFile: options.replaceFile },\n options\n );\n } catch (error) {\n exitWithError(error);\n }\n}\n\nexport async function referencesRemoveCommand(\n options: ReferencesRemoveOptions\n): Promise<void> {\n try {\n const id = options.id ?? fail(\"references remove requires --id\");\n if (!options.yes) {\n fail(\"references remove requires --yes\");\n }\n await run(\"remove\", { id, yes: true }, options);\n } catch (error) {\n exitWithError(error);\n }\n}\n\nexport async function referencesReorderCommand(\n options: ReferencesReorderOptions\n): Promise<void> {\n try {\n const ruleId =\n options.ruleId ?? fail(\"references reorder requires --rule-id\");\n const orderedIds = parseCsv(options.orderedIds);\n if (!orderedIds || orderedIds.length === 0) {\n fail(\"references reorder requires --ordered-ids\");\n }\n await run(\"reorder\", { ruleId, orderedIds }, options);\n } catch (error) {\n exitWithError(error);\n }\n}\n","import { rm } from \"node:fs/promises\";\nimport { join, resolve } from \"node:path\";\nimport process from \"node:process\";\nimport type { DetectedAgent } from \"../lib/agents.ts\";\nimport {\n detectAgentsAsync,\n directoryExistsAsync,\n resolveInstallPath,\n} from \"../lib/agents.ts\";\nimport { readMetadataAsync, removeFromMetadataAsync } from \"../lib/metadata.ts\";\nimport {\n cancel,\n confirm,\n isCancel,\n log,\n multiselect,\n outro,\n spinner,\n} from \"../lib/tui.ts\";\n\ninterface RemoveOptions {\n all?: boolean;\n global?: boolean;\n yes?: boolean;\n skill?: string;\n}\n\ninterface SkillToRemove {\n name: string;\n agentName: string;\n installPath: string;\n skillPath: string;\n}\n\nasync function collectInstalledSkills(\n detectedAgents: DetectedAgent[],\n options: RemoveOptions\n): Promise<SkillToRemove[]> {\n const skillsToRemove: SkillToRemove[] = [];\n\n for (const agent of detectedAgents) {\n const installPath = resolveInstallPath(agent, {\n global: options.global === true,\n });\n if (!installPath) {\n continue;\n }\n const exists = await directoryExistsAsync(installPath);\n\n if (!exists) {\n continue;\n }\n\n const metadata = await readMetadataAsync(installPath);\n\n for (const skill of metadata.skills) {\n skillsToRemove.push({\n name: skill.name,\n agentName: agent.name,\n installPath,\n skillPath: join(installPath, skill.name),\n });\n }\n }\n\n return skillsToRemove;\n}\n\nasync function selectSkillsToRemove(\n skillsToRemove: SkillToRemove[],\n options: RemoveOptions\n): Promise<SkillToRemove[]> {\n if (options.skill) {\n const selected = skillsToRemove.filter((s) => s.name === options.skill);\n if (selected.length === 0) {\n log.error(`Skill '${options.skill}' not found.`);\n log.info(\"Run 'braid list' to see installed skills.\");\n process.exit(1);\n }\n return selected;\n }\n\n if (options.all || options.yes) {\n return skillsToRemove;\n }\n\n const choices = skillsToRemove.map((skill) => ({\n value: skill,\n label: skill.name,\n hint: skill.agentName,\n }));\n\n const result = await multiselect({\n message: \"Select skills to remove:\",\n options: choices,\n required: true,\n });\n\n if (isCancel(result)) {\n cancel(\"Remove cancelled.\");\n process.exit(0);\n }\n\n return result;\n}\n\nasync function confirmRemoval(\n selectedCount: number,\n options: RemoveOptions\n): Promise<void> {\n if (options.yes || options.skill || options.all) {\n return;\n }\n\n const confirmed = await confirm({\n message: `Remove ${selectedCount} skill(s)?`,\n initialValue: false,\n });\n\n if (isCancel(confirmed) || !confirmed) {\n cancel(\"Remove cancelled.\");\n process.exit(0);\n }\n}\n\nasync function removeSkill(\n skill: SkillToRemove,\n removeSpinner: ReturnType<typeof spinner>\n): Promise<boolean> {\n removeSpinner.start(`Removing ${skill.name} from ${skill.agentName}...`);\n\n try {\n const resolvedSkillPath = resolve(skill.skillPath);\n const resolvedInstallPath = resolve(skill.installPath);\n if (!resolvedSkillPath.startsWith(`${resolvedInstallPath}/`)) {\n removeSpinner.stop(`Unsafe path for ${skill.name}`);\n log.warn(\" Skill path escapes install directory, skipping.\");\n return false;\n }\n await rm(resolvedSkillPath, { recursive: true, force: true });\n await removeFromMetadataAsync(skill.installPath, skill.name);\n removeSpinner.stop(`Removed ${skill.name} from ${skill.agentName}`);\n return true;\n } catch (error) {\n removeSpinner.stop(`Failed to remove ${skill.name}`);\n const message = error instanceof Error ? error.message : String(error);\n log.warn(` ${message}`);\n return false;\n }\n}\n\nexport async function removeCommand(options: RemoveOptions): Promise<void> {\n const removeSpinner = spinner();\n removeSpinner.start(\"Scanning for installed skills...\");\n\n try {\n const detectedAgents = await detectAgentsAsync();\n\n if (detectedAgents.length === 0) {\n removeSpinner.stop(\"No agents detected\");\n log.warn(\"No AI coding agents detected.\");\n return;\n }\n\n const skillsToRemove = await collectInstalledSkills(\n detectedAgents,\n options\n );\n\n removeSpinner.stop(`Found ${skillsToRemove.length} installed skill(s)`);\n\n if (skillsToRemove.length === 0) {\n log.warn(\"No skills installed via braid.\");\n return;\n }\n\n const selected = await selectSkillsToRemove(skillsToRemove, options);\n await confirmRemoval(selected.length, options);\n\n let removed = 0;\n let errors = 0;\n\n for (const skill of selected) {\n const success = await removeSkill(skill, removeSpinner);\n if (success) {\n removed++;\n } else {\n errors++;\n }\n }\n\n if (errors > 0) {\n outro(`Removed ${removed} skill(s) with ${errors} error(s).`);\n } else {\n outro(`Successfully removed ${removed} skill(s).`);\n }\n } catch (error) {\n removeSpinner.stop(\"Remove failed\");\n const message = error instanceof Error ? error.message : String(error);\n log.error(message);\n process.exit(1);\n }\n}\n","import process from \"node:process\";\nimport { runLifecycleCommandAsync } from \"../lib/api.ts\";\nimport { log } from \"../lib/tui.ts\";\n\ninterface LifecycleOptions {\n server?: string;\n apiKey?: string;\n json?: boolean;\n}\n\ninterface RuleIdOptions extends LifecycleOptions {\n id?: string;\n}\n\ninterface RuleCreateOptions extends LifecycleOptions {\n title?: string;\n content?: string;\n projectId?: string;\n tags?: string;\n priority?: string;\n}\n\ninterface RuleUpdateOptions extends LifecycleOptions {\n id?: string;\n title?: string;\n content?: string;\n tags?: string;\n priority?: string;\n}\n\ninterface RuleMoveOptions extends RuleIdOptions {\n projectId?: string;\n}\n\ninterface RuleForkOptions extends RuleIdOptions {\n targetProjectId?: string;\n}\n\ninterface RuleRemoveOptions extends RuleIdOptions {\n yes?: boolean;\n}\n\nconst parseCsv = (input?: string): string[] | undefined => {\n if (!input) {\n return undefined;\n }\n const values = input\n .split(\",\")\n .map((value) => value.trim())\n .filter((value) => value.length > 0);\n return values.length > 0 ? values : undefined;\n};\n\nconst writeJson = (value: unknown): void => {\n process.stdout.write(`${JSON.stringify(value, null, 2)}\\n`);\n};\n\nconst exitWithError = (error: unknown): never => {\n const message = error instanceof Error ? error.message : String(error);\n log.error(message);\n process.exit(1);\n};\n\nconst fail = (message: string): never => {\n throw new Error(message);\n};\n\nconst run = async (\n command: string,\n args: Record<string, unknown>,\n options: LifecycleOptions\n): Promise<void> => {\n const apiOptions = {\n ...(options.server ? { serverUrl: options.server } : {}),\n ...(options.apiKey ? { apiKey: options.apiKey } : {}),\n };\n\n const result = await runLifecycleCommandAsync(\n {\n domain: \"rules\",\n command,\n args,\n },\n apiOptions\n );\n\n if (options.json) {\n writeJson(result);\n return;\n }\n\n log.success(`rules ${command} completed`);\n};\n\nexport async function rulesGetCommand(options: RuleIdOptions): Promise<void> {\n try {\n const id = options.id ?? fail(\"rules get requires --id\");\n await run(\"get\", { id }, options);\n } catch (error) {\n exitWithError(error);\n }\n}\n\nexport async function rulesCreateCommand(\n options: RuleCreateOptions\n): Promise<void> {\n try {\n const title = options.title ?? fail(\"rules create requires --title\");\n const content = options.content ?? fail(\"rules create requires --content\");\n await run(\n \"create\",\n {\n title,\n content,\n projectId: options.projectId,\n tags: parseCsv(options.tags),\n priority: options.priority,\n },\n options\n );\n } catch (error) {\n exitWithError(error);\n }\n}\n\nexport async function rulesUpdateCommand(\n options: RuleUpdateOptions\n): Promise<void> {\n try {\n const id = options.id ?? fail(\"rules update requires --id\");\n await run(\n \"update\",\n {\n id,\n title: options.title,\n content: options.content,\n tags: parseCsv(options.tags),\n priority: options.priority,\n },\n options\n );\n } catch (error) {\n exitWithError(error);\n }\n}\n\nexport async function rulesRemoveCommand(\n options: RuleRemoveOptions\n): Promise<void> {\n try {\n const id = options.id ?? fail(\"rules remove requires --id\");\n if (!options.yes) {\n fail(\"rules remove requires --yes\");\n }\n await run(\"remove\", { id, yes: true }, options);\n } catch (error) {\n exitWithError(error);\n }\n}\n\nexport async function rulesEnableCommand(\n options: RuleIdOptions\n): Promise<void> {\n try {\n const id = options.id ?? fail(\"rules enable requires --id\");\n await run(\"enable\", { id }, options);\n } catch (error) {\n exitWithError(error);\n }\n}\n\nexport async function rulesDisableCommand(\n options: RuleIdOptions\n): Promise<void> {\n try {\n const id = options.id ?? fail(\"rules disable requires --id\");\n await run(\"disable\", { id }, options);\n } catch (error) {\n exitWithError(error);\n }\n}\n\nexport async function rulesMoveCommand(\n options: RuleMoveOptions\n): Promise<void> {\n try {\n const id = options.id ?? fail(\"rules move requires --id\");\n const projectId =\n options.projectId ?? fail(\"rules move requires --project-id\");\n await run(\"move\", { id, projectId }, options);\n } catch (error) {\n exitWithError(error);\n }\n}\n\nexport async function rulesDuplicateCommand(\n options: RuleForkOptions\n): Promise<void> {\n try {\n const id = options.id ?? fail(\"rules duplicate requires --id\");\n await run(\n \"duplicate\",\n { id, targetProjectId: options.targetProjectId },\n options\n );\n } catch (error) {\n exitWithError(error);\n }\n}\n\nexport async function rulesForkCommand(\n options: RuleForkOptions\n): Promise<void> {\n try {\n const id = options.id ?? fail(\"rules fork requires --id\");\n await run(\n \"fork\",\n { id, targetProjectId: options.targetProjectId },\n options\n );\n } catch (error) {\n exitWithError(error);\n }\n}\n\nexport async function rulesSyncStatusCommand(\n options: RuleIdOptions\n): Promise<void> {\n try {\n await run(\"sync-status\", { id: options.id }, options);\n } catch (error) {\n exitWithError(error);\n }\n}\n\nexport async function rulesSyncHistoryCommand(\n options: RuleIdOptions\n): Promise<void> {\n try {\n const id = options.id ?? fail(\"rules sync-history requires --id\");\n await run(\"sync-history\", { id }, options);\n } catch (error) {\n exitWithError(error);\n }\n}\n\nexport async function rulesSyncEnableCommand(\n options: RuleIdOptions\n): Promise<void> {\n try {\n const id = options.id ?? fail(\"rules sync-enable requires --id\");\n await run(\"sync-enable\", { id }, options);\n } catch (error) {\n exitWithError(error);\n }\n}\n\nexport async function rulesSyncDisableCommand(\n options: RuleIdOptions\n): Promise<void> {\n try {\n const id = options.id ?? fail(\"rules sync-disable requires --id\");\n await run(\"sync-disable\", { id }, options);\n } catch (error) {\n exitWithError(error);\n }\n}\n\nexport async function rulesSyncCheckCommand(\n options: RuleIdOptions\n): Promise<void> {\n try {\n const id = options.id ?? fail(\"rules sync-check requires --id\");\n await run(\"sync-check\", { id }, options);\n } catch (error) {\n exitWithError(error);\n }\n}\n\nexport async function rulesSyncNowCommand(\n options: RuleIdOptions\n): Promise<void> {\n try {\n const id = options.id ?? fail(\"rules sync-now requires --id\");\n await run(\"sync-now\", { id }, options);\n } catch (error) {\n exitWithError(error);\n }\n}\n","import {\n cancel,\n isCancel,\n log,\n multiselect,\n outro,\n spinner,\n} from \"@clack/prompts\";\nimport { Data, Effect, pipe } from \"effect\";\nimport type { AgentId, DetectedAgent } from \"../lib/agents.ts\";\nimport {\n detectAgentsAsync,\n directoryExistsAsync,\n resolveInstallPath,\n} from \"../lib/agents.ts\";\nimport type { FetchSkillsOptions } from \"../lib/api.ts\";\nimport { fetchSkillsAsync } from \"../lib/api.ts\";\nimport { readMetadataAsync, updateMetadataAsync } from \"../lib/metadata.ts\";\nimport { writeSkillsAsync } from \"../lib/skill-writer.ts\";\n\ninterface UpdateOptions {\n global?: boolean;\n server?: string;\n yes?: boolean;\n}\n\ninterface SourceToUpdate {\n type: \"profile\" | \"projects\";\n name: string;\n orgProjects: string[] | undefined;\n personalProjects: string[] | undefined;\n serverUrl: string;\n agents: Array<{ agentId: AgentId; agentName: string; installPath: string }>;\n}\n\nclass UpdateError extends Data.TaggedError(\"UpdateError\")<{\n message: string;\n source?: string;\n}> {}\n\nclass UserCancelledError extends Data.TaggedError(\"UserCancelledError\")<{\n message: string;\n}> {}\n\nasync function resolveValidInstallPath(\n agent: DetectedAgent,\n options: UpdateOptions\n): Promise<string | null> {\n const installPath = resolveInstallPath(agent, {\n global: options.global === true,\n });\n if (!installPath) {\n return null;\n }\n const exists = await directoryExistsAsync(installPath);\n return exists ? installPath : null;\n}\n\nconst collectSourcesFromAgent = (\n agent: DetectedAgent,\n options: UpdateOptions,\n sourcesToUpdate: Map<string, SourceToUpdate>\n): Effect.Effect<void, UpdateError> =>\n Effect.tryPromise({\n try: async () => {\n const installPath = await resolveValidInstallPath(agent, options);\n if (!installPath) {\n return;\n }\n\n const metadata = await readMetadataAsync(installPath);\n\n for (const skill of metadata.skills) {\n const key =\n skill.source.type === \"profile\"\n ? `profile:${skill.source.name}`\n : `projects:${skill.source.name}`;\n\n if (!sourcesToUpdate.has(key)) {\n sourcesToUpdate.set(key, {\n type: skill.source.type,\n name: skill.source.name,\n orgProjects: skill.source.orgProjects,\n personalProjects: skill.source.personalProjects,\n serverUrl: skill.serverUrl,\n agents: [],\n });\n }\n\n const source = sourcesToUpdate.get(key);\n if (\n source &&\n !source.agents.some((a) => a.installPath === installPath)\n ) {\n source.agents.push({\n agentId: agent.id,\n agentName: agent.name,\n installPath,\n });\n }\n }\n },\n catch: () => new UpdateError({ message: \"Failed to collect sources\" }),\n });\n\nconst collectSources = (\n detectedAgents: DetectedAgent[],\n options: UpdateOptions\n): Effect.Effect<Map<string, SourceToUpdate>, UpdateError> =>\n pipe(\n Effect.succeed(new Map<string, SourceToUpdate>()),\n Effect.tap((sourcesToUpdate) =>\n Effect.forEach(\n detectedAgents,\n (agent) => collectSourcesFromAgent(agent, options, sourcesToUpdate),\n { concurrency: 1 }\n )\n )\n );\n\nconst selectSources = (\n sourcesToUpdate: Map<string, SourceToUpdate>,\n options: UpdateOptions\n): Effect.Effect<Map<string, SourceToUpdate>, UserCancelledError> => {\n if (options.yes) {\n return Effect.succeed(sourcesToUpdate);\n }\n\n return Effect.tryPromise({\n try: async () => {\n const sources = Array.from(sourcesToUpdate.entries()).map(\n ([key, source]) => ({\n value: key,\n label: source.name,\n hint: `${source.agents.length} agent(s)`,\n })\n );\n\n const selected = await multiselect({\n message: \"Select sources to update:\",\n options: sources,\n initialValues: sources.map((s) => s.value),\n required: true,\n });\n\n if (isCancel(selected)) {\n throw new Error(\"cancelled\");\n }\n\n for (const key of sourcesToUpdate.keys()) {\n if (!selected.includes(key)) {\n sourcesToUpdate.delete(key);\n }\n }\n\n return sourcesToUpdate;\n },\n catch: () => new UserCancelledError({ message: \"Update cancelled.\" }),\n });\n};\n\nconst getSourceDesc = (source: SourceToUpdate): string => source.name;\n\nconst buildFetchOptionsForSource = (\n source: SourceToUpdate,\n options: UpdateOptions\n): FetchSkillsOptions | null => {\n const serverUrl = options.server ?? source.serverUrl;\n const fetchOptions: FetchSkillsOptions = { serverUrl };\n\n if (source.type === \"profile\") {\n fetchOptions.profile = source.name;\n } else {\n const orgProjects = source.orgProjects;\n const personalProjects = source.personalProjects;\n const hasOrgProjects = orgProjects !== undefined && orgProjects.length > 0;\n const hasPersonalProjects =\n personalProjects !== undefined && personalProjects.length > 0;\n\n if (!(hasOrgProjects || hasPersonalProjects)) {\n return null;\n }\n\n if (hasOrgProjects) {\n fetchOptions.orgProjects = orgProjects;\n }\n if (hasPersonalProjects) {\n fetchOptions.personalProjects = personalProjects;\n }\n }\n\n return fetchOptions;\n};\n\nconst updateAgentSkills = (\n agentId: AgentId,\n agentName: string,\n installPath: string,\n response: Awaited<ReturnType<typeof fetchSkillsAsync>>,\n serverUrl: string,\n updateSpinner: ReturnType<typeof spinner>\n): Effect.Effect<{ updated: number; errors: number }, UpdateError> =>\n Effect.tryPromise({\n try: async () => {\n updateSpinner.start(`Updating ${agentName}...`);\n\n const result = await writeSkillsAsync(\n installPath,\n response.skills,\n agentId\n );\n\n if (result.errors.length > 0) {\n updateSpinner.stop(\n `${agentName}: ${result.written.length} updated, ${result.errors.length} failed`\n );\n } else {\n updateSpinner.stop(\n `${agentName}: ${result.written.length} skills updated`\n );\n }\n\n await updateMetadataAsync(\n installPath,\n response.skills.map((s) => ({\n name: s.name,\n source: response.source,\n version: response.version,\n serverUrl,\n }))\n );\n\n return { updated: result.written.length, errors: result.errors.length };\n },\n catch: (e) =>\n new UpdateError({\n message: e instanceof Error ? e.message : String(e),\n source: agentName,\n }),\n });\n\nconst updateSource = (\n source: SourceToUpdate,\n options: UpdateOptions,\n updateSpinner: ReturnType<typeof spinner>\n): Effect.Effect<{ updated: number; errors: number }, UpdateError> => {\n const sourceDesc = getSourceDesc(source);\n const serverUrl = options.server ?? source.serverUrl;\n\n const fetchOptions = buildFetchOptionsForSource(source, options);\n if (fetchOptions === null) {\n return Effect.fail(\n new UpdateError({\n message:\n \"Skills installed with legacy metadata format. Please reinstall using 'braid install --profile <name>' or 'braid install --projects <names>'.\",\n source: sourceDesc,\n })\n );\n }\n\n return pipe(\n Effect.tryPromise({\n try: async () => {\n updateSpinner.start(`Fetching latest skills from ${sourceDesc}...`);\n const response = await fetchSkillsAsync(fetchOptions);\n updateSpinner.stop(\n `Fetched ${response.skills.length} skills from ${sourceDesc}`\n );\n return response;\n },\n catch: (e) =>\n new UpdateError({\n message: e instanceof Error ? e.message : String(e),\n source: sourceDesc,\n }),\n }),\n Effect.flatMap((response) =>\n pipe(\n Effect.forEach(\n source.agents,\n ({ agentId, agentName, installPath }) =>\n updateAgentSkills(\n agentId,\n agentName,\n installPath,\n response,\n serverUrl,\n updateSpinner\n ),\n { concurrency: 1 }\n ),\n Effect.map((results) => ({\n updated: results.reduce((sum, r) => sum + r.updated, 0),\n errors: results.reduce((sum, r) => sum + r.errors, 0),\n }))\n )\n )\n );\n};\n\nconst updateAllSources = (\n sources: Map<string, SourceToUpdate>,\n options: UpdateOptions,\n updateSpinner: ReturnType<typeof spinner>\n): Effect.Effect<{ totalUpdated: number; totalErrors: number }> =>\n pipe(\n Effect.forEach(\n Array.from(sources.values()),\n (source) =>\n pipe(\n updateSource(source, options, updateSpinner),\n Effect.catchAll((error) => {\n updateSpinner.stop(\n `Failed to update from ${getSourceDesc(source)}`\n );\n log.error(` ${error.message}`);\n return Effect.succeed({ updated: 0, errors: 1 });\n })\n ),\n { concurrency: 1 }\n ),\n Effect.map((results) => ({\n totalUpdated: results.reduce((sum, r) => sum + r.updated, 0),\n totalErrors: results.reduce((sum, r) => sum + r.errors, 0),\n }))\n );\n\nconst handleUpdateError = (\n error: UpdateError,\n updateSpinner: ReturnType<typeof spinner>\n): void => {\n updateSpinner.stop(\"Update failed\");\n if (error.message === \"No AI coding agents detected.\") {\n log.warn(error.message);\n return;\n }\n if (error.message === \"No skills installed via braid.\") {\n log.warn(error.message);\n log.info(\"Run 'braid install --profile <name>' to install skills first.\");\n return;\n }\n log.error(error.message);\n process.exit(1);\n};\n\nconst handleProgramExit = (\n result: Awaited<\n ReturnType<\n typeof Effect.runPromiseExit<\n { totalUpdated: number; totalErrors: number },\n UpdateError | UserCancelledError\n >\n >\n >,\n updateSpinner: ReturnType<typeof spinner>\n): void => {\n if (result._tag !== \"Failure\") {\n return;\n }\n\n const cause = result.cause;\n if (cause._tag !== \"Fail\") {\n return;\n }\n\n const error = cause.error;\n if (error._tag === \"UserCancelledError\") {\n cancel(error.message);\n process.exit(0);\n }\n if (error._tag === \"UpdateError\") {\n handleUpdateError(error, updateSpinner);\n }\n};\n\nexport async function updateCommand(options: UpdateOptions): Promise<void> {\n const updateSpinner = spinner();\n updateSpinner.start(\"Scanning for installed skills...\");\n\n const program = pipe(\n Effect.tryPromise({\n try: () => detectAgentsAsync(),\n catch: () => new UpdateError({ message: \"Failed to detect agents\" }),\n }),\n Effect.filterOrFail(\n (agents) => agents.length > 0,\n () => new UpdateError({ message: \"No AI coding agents detected.\" })\n ),\n Effect.flatMap((detectedAgents) => collectSources(detectedAgents, options)),\n Effect.tap((sources) => {\n updateSpinner.stop(`Found ${sources.size} source(s) to update`);\n }),\n Effect.filterOrFail(\n (sources) => sources.size > 0,\n () => new UpdateError({ message: \"No skills installed via braid.\" })\n ),\n Effect.flatMap((sources) => selectSources(sources, options)),\n Effect.flatMap((selectedSources) =>\n updateAllSources(selectedSources, options, updateSpinner)\n ),\n Effect.tap(({ totalUpdated, totalErrors }) => {\n if (totalErrors > 0) {\n outro(`Updated ${totalUpdated} skills with ${totalErrors} errors.`);\n } else {\n outro(`Successfully updated ${totalUpdated} skills.`);\n }\n })\n );\n\n const result = await Effect.runPromiseExit(program);\n handleProgramExit(result, updateSpinner);\n}\n","import process from \"node:process\";\nimport { runLifecycleCommandAsync } from \"../lib/api.ts\";\nimport { log } from \"../lib/tui.ts\";\n\ninterface LifecycleOptions {\n server?: string;\n apiKey?: string;\n json?: boolean;\n}\n\ninterface WorkflowsListOptions extends LifecycleOptions {\n projectId?: string;\n}\n\ninterface WorkflowsStartOptions extends LifecycleOptions {\n sessionId?: string;\n flowId?: string;\n currentNodeId?: string;\n currentStepLabel?: string;\n metadata?: string;\n}\n\ninterface WorkflowsProgressOptions extends LifecycleOptions {\n executionId?: string;\n currentNodeId?: string;\n currentStepLabel?: string;\n metadata?: string;\n}\n\ninterface WorkflowsActiveOptions extends LifecycleOptions {\n sessionId?: string;\n}\n\ninterface WorkflowsFinishOptions extends LifecycleOptions {\n executionId?: string;\n errorMessage?: string;\n}\n\nconst writeJson = (value: unknown): void => {\n process.stdout.write(`${JSON.stringify(value, null, 2)}\\n`);\n};\n\nconst fail = (message: string): never => {\n throw new Error(message);\n};\n\nconst parseMetadata = (metadata?: string): unknown => {\n if (!metadata) {\n return undefined;\n }\n try {\n return JSON.parse(metadata) as unknown;\n } catch {\n throw new Error(\"metadata must be valid JSON\");\n }\n};\n\nconst run = async (\n command: string,\n args: Record<string, unknown>,\n options: LifecycleOptions\n): Promise<void> => {\n const apiOptions = {\n ...(options.server ? { serverUrl: options.server } : {}),\n ...(options.apiKey ? { apiKey: options.apiKey } : {}),\n };\n\n const result = await runLifecycleCommandAsync(\n {\n domain: \"workflows\",\n command,\n args,\n },\n apiOptions\n );\n\n if (options.json) {\n writeJson(result);\n return;\n }\n\n log.success(`workflows ${command} completed`);\n};\n\nconst exitWithError = (error: unknown): never => {\n const message = error instanceof Error ? error.message : String(error);\n log.error(message);\n process.exit(1);\n};\n\nexport async function workflowsListCommand(\n options: WorkflowsListOptions\n): Promise<void> {\n try {\n await run(\"list\", { projectId: options.projectId }, options);\n } catch (error) {\n exitWithError(error);\n }\n}\n\nexport async function workflowsStartCommand(\n options: WorkflowsStartOptions\n): Promise<void> {\n try {\n const sessionId =\n options.sessionId ?? fail(\"workflows start requires --session-id\");\n const flowId = options.flowId ?? fail(\"workflows start requires --flow-id\");\n await run(\n \"start\",\n {\n sessionId,\n flowId,\n currentNodeId: options.currentNodeId,\n currentStepLabel: options.currentStepLabel,\n metadata: parseMetadata(options.metadata),\n },\n options\n );\n } catch (error) {\n exitWithError(error);\n }\n}\n\nexport async function workflowsProgressCommand(\n options: WorkflowsProgressOptions\n): Promise<void> {\n try {\n const executionId =\n options.executionId ?? fail(\"workflows progress requires --execution-id\");\n await run(\n \"progress\",\n {\n executionId,\n currentNodeId: options.currentNodeId,\n currentStepLabel: options.currentStepLabel,\n metadata: parseMetadata(options.metadata),\n },\n options\n );\n } catch (error) {\n exitWithError(error);\n }\n}\n\nexport async function workflowsActiveCommand(\n options: WorkflowsActiveOptions\n): Promise<void> {\n try {\n const sessionId =\n options.sessionId ?? fail(\"workflows active requires --session-id\");\n await run(\"active\", { sessionId }, options);\n } catch (error) {\n exitWithError(error);\n }\n}\n\nexport async function workflowsCompleteCommand(\n options: WorkflowsFinishOptions\n): Promise<void> {\n try {\n const executionId =\n options.executionId ?? fail(\"workflows complete requires --execution-id\");\n await run(\"complete\", { executionId }, options);\n } catch (error) {\n exitWithError(error);\n }\n}\n\nexport async function workflowsFailCommand(\n options: WorkflowsFinishOptions\n): Promise<void> {\n try {\n const executionId =\n options.executionId ?? fail(\"workflows fail requires --execution-id\");\n await run(\n \"fail\",\n { executionId, errorMessage: options.errorMessage },\n options\n );\n } catch (error) {\n exitWithError(error);\n }\n}\n\nexport async function workflowsCancelCommand(\n options: WorkflowsFinishOptions\n): Promise<void> {\n try {\n const executionId =\n options.executionId ?? fail(\"workflows cancel requires --execution-id\");\n await run(\"cancel\", { executionId }, options);\n } catch (error) {\n exitWithError(error);\n }\n}\n"],"mappings":"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","names":["mkdir","writeFile","homedir","dirname","join","process","Data","Effect","pipe","Data","Effect","pipe","hostname","path","process","process","rules","existing","path","platform","process","Effect","pipe","path","process","pipe","Effect","agents","Effect","path","process","pipe","process","resolve","TRAILING_SLASHES","scopeCommand","process","clearApiKeyAsync","process","parseCsv","writeJson","exitWithError","readFile","writeFile","join","Data","Effect","pipe","pipe","Effect","Effect","Effect","mkdir","readFile","writeFile","dirname","resolve","sep","Data","Effect","pipe","rules","mkdir","writeFile","dirname","resolve","sep","Data","Effect","pipe","createDirectory","writeTextFile","assertWithinBase","path","skills","skills","Effect","skills","rules","log","spinner","log","spinner","process","mkdir","readFile","writeFile","dirname","Data","Effect","pipe","path","process","scopeCommand","process","writeJson","exitWithError","fail","run","process","writeJson","fail","run","exitWithError","process","writeJson","parseCsv","exitWithError","fail","run","join","resolve","process","join","process","resolve","process","parseCsv","writeJson","exitWithError","fail","run","cancel","isCancel","log","multiselect","outro","spinner","Data","Effect","pipe","Data","Effect","pipe","multiselect","isCancel","log","cancel","spinner","program","agents","outro","process","writeJson","fail","run","exitWithError","require"]}
|
|
1
|
+
{"version":3,"sources":["../../../node_modules/tsup/assets/esm_shims.js","../src/lib/config.ts","../src/lib/api.ts","../src/lib/tui.ts","../src/lib/scope-args.ts","../src/lib/scope-config.ts","../src/commands/scope.ts","../src/index.ts","../src/commands/agents.ts","../src/lib/agent-writer.ts","../src/lib/agent-adapters.ts","../src/lib/agents.ts","../src/commands/auth.ts","../src/lib/device-auth.ts","../src/commands/discover.ts","../src/commands/install.ts","../src/lib/metadata.ts","../src/lib/rule-writer.ts","../src/lib/skill-writer.ts","../src/commands/list.ts","../src/commands/mcp.ts","../src/lib/mcp-config.ts","../src/commands/profiles.ts","../src/commands/projects.ts","../src/commands/references.ts","../src/commands/remove.ts","../src/commands/rules.ts","../src/commands/update.ts","../src/commands/workflows.ts"],"sourcesContent":["// Shim globals in esm bundle\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nconst getFilename = () => fileURLToPath(import.meta.url)\nconst getDirname = () => path.dirname(getFilename())\n\nexport const __dirname = /* @__PURE__ */ getDirname()\nexport const __filename = /* @__PURE__ */ getFilename()\n","import { existsSync } from \"node:fs\";\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { dirname, join, parse } from \"node:path\";\nimport process from \"node:process\";\nimport { Data, Effect, pipe } from \"effect\";\n\nconst CONFIG_DIR = join(homedir(), \".config\", \"braid\");\nconst CONFIG_FILE = join(CONFIG_DIR, \"config.json\");\nconst PROJECT_CONFIG_FILENAME = \"braid.json\";\nconst USER_CONFIG_FILENAME = \"braid.user.json\";\n\ninterface braidSkillsConfig {\n apiKey?: string;\n serverUrl?: string;\n}\n\ninterface SkillsConfig {\n serverUrl?: string;\n}\n\ninterface braidProjectConfig {\n $schema?: string;\n serverUrl?: string;\n org?: string;\n profile?: string;\n orgProjects?: string[];\n personalProjects?: string[];\n ruleIds?: string[];\n excludedRuleIds?: string[];\n resolveOverlays?: boolean;\n includeUserGlobal?: boolean;\n includeOrgGlobal?: boolean;\n skills?: SkillsConfig;\n agents?: string[];\n}\n\ninterface braidUserConfig extends braidProjectConfig {\n token?: string;\n}\n\ninterface MergedConfig {\n token?: string;\n serverUrl: string;\n org?: string;\n profile?: string;\n orgProjects?: string[];\n personalProjects?: string[];\n ruleIds?: string[];\n excludedRuleIds?: string[];\n resolveOverlays?: boolean;\n includeUserGlobal: boolean;\n includeOrgGlobal: boolean;\n agents?: string[];\n}\n\nclass ConfigReadError extends Data.TaggedError(\"ConfigReadError\")<{\n path: string;\n cause: unknown;\n}> {}\n\nclass ConfigWriteError extends Data.TaggedError(\"ConfigWriteError\")<{\n path: string;\n cause: unknown;\n}> {}\n\nconst findConfigFile = (\n filename: string,\n startDir: string = process.cwd()\n): string | undefined => {\n let currentDir = startDir;\n\n while (true) {\n const configPath = join(currentDir, filename);\n if (existsSync(configPath)) {\n return configPath;\n }\n\n const parsed = parse(currentDir);\n if (parsed.root === currentDir) {\n return undefined;\n }\n currentDir = parsed.dir;\n }\n};\n\nconst findProjectConfigFile = (\n startDir: string = process.cwd()\n): string | undefined => findConfigFile(PROJECT_CONFIG_FILENAME, startDir);\n\nconst findUserConfigFile = (\n startDir: string = process.cwd()\n): string | undefined => findConfigFile(USER_CONFIG_FILENAME, startDir);\n\nconst loadProjectConfig = (): Effect.Effect<braidProjectConfig | undefined> =>\n Effect.tryPromise({\n try: async () => {\n const configPath = await findProjectConfigFile();\n if (!configPath) {\n return undefined;\n }\n const content = await readFile(configPath, \"utf-8\");\n return JSON.parse(content) as braidProjectConfig;\n },\n catch: () => undefined,\n }).pipe(Effect.orElseSucceed(() => undefined));\n\nconst loadUserConfig = (): Effect.Effect<braidUserConfig | undefined> =>\n Effect.tryPromise({\n try: async () => {\n const configPath = await findUserConfigFile();\n if (!configPath) {\n return undefined;\n }\n const content = await readFile(configPath, \"utf-8\");\n return JSON.parse(content) as braidUserConfig;\n },\n catch: () => undefined,\n }).pipe(Effect.orElseSucceed(() => undefined));\n\nconst resolveUserConfigWritePath = (startDir: string = process.cwd()): string =>\n findUserConfigFile(startDir) ?? join(startDir, USER_CONFIG_FILENAME);\n\nconst resolveProjectConfigWritePath = (\n startDir: string = process.cwd()\n): string =>\n findProjectConfigFile(startDir) ?? join(startDir, PROJECT_CONFIG_FILENAME);\n\nconst saveUserConfig = (\n config: braidUserConfig,\n startDir: string = process.cwd()\n): Effect.Effect<string, ConfigWriteError> => {\n const targetPath = resolveUserConfigWritePath(startDir);\n\n return pipe(\n Effect.tryPromise({\n try: async () => {\n await mkdir(dirname(targetPath), { recursive: true, mode: 0o700 });\n await writeFile(targetPath, JSON.stringify(config, null, 2), {\n encoding: \"utf-8\",\n mode: 0o600,\n });\n return targetPath;\n },\n catch: (e) => new ConfigWriteError({ path: targetPath, cause: e }),\n })\n );\n};\n\nconst saveProjectConfig = (\n config: braidProjectConfig,\n startDir: string = process.cwd()\n): Effect.Effect<string, ConfigWriteError> => {\n const targetPath = resolveProjectConfigWritePath(startDir);\n\n return pipe(\n Effect.tryPromise({\n try: async () => {\n await mkdir(dirname(targetPath), { recursive: true, mode: 0o700 });\n await writeFile(targetPath, JSON.stringify(config, null, 2), {\n encoding: \"utf-8\",\n mode: 0o600,\n });\n return targetPath;\n },\n catch: (e) => new ConfigWriteError({ path: targetPath, cause: e }),\n })\n );\n};\n\nconst isValidServerUrl = (url: string): boolean => {\n try {\n const parsed = new URL(url);\n return parsed.protocol === \"https:\" || parsed.protocol === \"http:\";\n } catch {\n return false;\n }\n};\n\nconst resolveServerUrlFromConfig = (\n config: braidProjectConfig | braidUserConfig | undefined\n): string | undefined => {\n if (!config) {\n return undefined;\n }\n const url = config.skills?.serverUrl ?? config.serverUrl;\n if (url && !isValidServerUrl(url)) {\n return undefined;\n }\n return url;\n};\n\nconst applyConfigSource = (\n merged: MergedConfig,\n config: braidProjectConfig | braidUserConfig | undefined\n): void => {\n if (!config) {\n return;\n }\n\n const serverUrl = resolveServerUrlFromConfig(config);\n if (serverUrl) {\n merged.serverUrl = serverUrl;\n }\n\n if (config.profile) {\n merged.profile = config.profile;\n }\n if (config.org) {\n merged.org = config.org;\n }\n if (config.orgProjects) {\n merged.orgProjects = config.orgProjects;\n }\n if (config.personalProjects) {\n merged.personalProjects = config.personalProjects;\n }\n if (config.ruleIds) {\n merged.ruleIds = config.ruleIds;\n }\n if (config.excludedRuleIds) {\n merged.excludedRuleIds = config.excludedRuleIds;\n }\n if (config.resolveOverlays !== undefined) {\n merged.resolveOverlays = config.resolveOverlays;\n }\n if (config.includeUserGlobal !== undefined) {\n merged.includeUserGlobal = config.includeUserGlobal;\n }\n if (config.includeOrgGlobal !== undefined) {\n merged.includeOrgGlobal = config.includeOrgGlobal;\n }\n if (config.agents) {\n merged.agents = config.agents;\n }\n\n if (\"token\" in config && config.token) {\n merged.token = config.token;\n }\n};\n\nconst applyEnvOverrides = (merged: MergedConfig): void => {\n if (process.env.BRAID_API_KEY) {\n merged.token = process.env.BRAID_API_KEY;\n }\n const envServerUrl =\n process.env.BRAID_SKILLS_SERVER_URL ?? process.env.BRAID_SERVER_URL;\n if (envServerUrl && isValidServerUrl(envServerUrl)) {\n merged.serverUrl = envServerUrl;\n }\n};\n\nconst createDefaultMergedConfig = (): MergedConfig => ({\n serverUrl: \"https://braid.cloud\",\n includeUserGlobal: true,\n includeOrgGlobal: true,\n});\n\nconst loadMergedConfig = (): Effect.Effect<MergedConfig> =>\n pipe(\n Effect.all({\n projectConfig: loadProjectConfig(),\n userConfig: loadUserConfig(),\n globalConfig: loadConfig().pipe(\n Effect.orElseSucceed(() => ({}) as braidSkillsConfig)\n ),\n }),\n Effect.map(({ projectConfig, userConfig, globalConfig }) => {\n const merged = createDefaultMergedConfig();\n\n applyConfigSource(merged, projectConfig);\n\n applyConfigSource(merged, userConfig);\n\n applyEnvOverrides(merged);\n\n if (!merged.token && globalConfig.apiKey) {\n merged.token = globalConfig.apiKey;\n }\n\n return merged;\n })\n );\n\nconst loadConfig = (): Effect.Effect<\n braidSkillsConfig,\n ConfigReadError | ConfigWriteError\n> =>\n pipe(\n Effect.tryPromise({\n try: () => readFile(CONFIG_FILE, \"utf-8\"),\n catch: (e) => new ConfigReadError({ path: CONFIG_FILE, cause: e }),\n }),\n Effect.flatMap((content) =>\n Effect.try({\n try: () => JSON.parse(content) as braidSkillsConfig,\n catch: () => ({}) as braidSkillsConfig,\n })\n ),\n Effect.orElseSucceed(() => ({}) as braidSkillsConfig)\n );\n\nconst saveConfig = (\n config: braidSkillsConfig\n): Effect.Effect<void, ConfigWriteError> =>\n pipe(\n Effect.tryPromise({\n try: async () => {\n await mkdir(dirname(CONFIG_FILE), { recursive: true, mode: 0o700 });\n await writeFile(CONFIG_FILE, JSON.stringify(config, null, 2), {\n encoding: \"utf-8\",\n mode: 0o600,\n });\n },\n catch: (e) => new ConfigWriteError({ path: CONFIG_FILE, cause: e }),\n })\n );\n\nconst getApiKey = (): Effect.Effect<\n string | undefined,\n ConfigReadError | ConfigWriteError\n> =>\n pipe(\n Effect.succeed(process.env.BRAID_API_KEY),\n Effect.flatMap((envKey) =>\n envKey\n ? Effect.succeed(envKey)\n : pipe(\n loadUserConfig(),\n Effect.flatMap((userConfig) =>\n userConfig?.token\n ? Effect.succeed(userConfig.token)\n : pipe(\n loadConfig(),\n Effect.map((config) => config.apiKey)\n )\n )\n )\n )\n );\n\nconst setApiKey = (\n apiKey: string\n): Effect.Effect<void, ConfigReadError | ConfigWriteError> =>\n pipe(\n loadConfig(),\n Effect.flatMap((config) => saveConfig({ ...config, apiKey }))\n );\n\nconst getServerUrl = (): Effect.Effect<\n string,\n ConfigReadError | ConfigWriteError\n> =>\n pipe(\n Effect.succeed(process.env.BRAID_SERVER_URL),\n Effect.flatMap((envUrl) =>\n envUrl\n ? Effect.succeed(envUrl)\n : pipe(\n loadUserConfig(),\n Effect.flatMap((userConfig) =>\n userConfig?.serverUrl\n ? Effect.succeed(userConfig.serverUrl)\n : pipe(\n loadConfig(),\n Effect.map(\n (config) => config.serverUrl ?? \"https://braid.cloud\"\n )\n )\n )\n )\n )\n );\n\nconst clearApiKey = (): Effect.Effect<\n void,\n ConfigReadError | ConfigWriteError\n> =>\n pipe(\n loadConfig(),\n Effect.flatMap((config) => {\n const { apiKey: _, ...rest } = config;\n return saveConfig(rest);\n })\n );\n\nconst loadConfigAsync = (): Promise<braidSkillsConfig> =>\n Effect.runPromise(loadConfig());\n\nconst loadProjectConfigAsync = (): Promise<braidProjectConfig | undefined> =>\n Effect.runPromise(loadProjectConfig());\n\nconst loadUserConfigAsync = (): Promise<braidUserConfig | undefined> =>\n Effect.runPromise(loadUserConfig());\n\nconst loadMergedConfigAsync = (): Promise<MergedConfig> =>\n Effect.runPromise(loadMergedConfig());\n\nconst findProjectConfigFileAsync = (startDir?: string): string | undefined =>\n findProjectConfigFile(startDir);\n\nconst findUserConfigFileAsync = (startDir?: string): string | undefined =>\n findUserConfigFile(startDir);\n\nconst saveConfigAsync = (config: braidSkillsConfig): Promise<void> =>\n Effect.runPromise(saveConfig(config));\n\nconst saveUserConfigAsync = (\n config: braidUserConfig,\n startDir?: string\n): Promise<string> => Effect.runPromise(saveUserConfig(config, startDir));\n\nconst saveProjectConfigAsync = (\n config: braidProjectConfig,\n startDir?: string\n): Promise<string> => Effect.runPromise(saveProjectConfig(config, startDir));\n\nconst getApiKeyAsync = (): Promise<string | undefined> =>\n Effect.runPromise(getApiKey());\n\nconst setApiKeyAsync = (apiKey: string): Promise<void> =>\n Effect.runPromise(setApiKey(apiKey));\n\nconst getServerUrlAsync = (): Promise<string> =>\n Effect.runPromise(getServerUrl());\n\nconst clearApiKeyAsync = (): Promise<void> => Effect.runPromise(clearApiKey());\n\nexport type {\n braidProjectConfig,\n braidSkillsConfig,\n braidUserConfig,\n MergedConfig,\n};\nexport {\n clearApiKey,\n clearApiKeyAsync,\n CONFIG_DIR,\n CONFIG_FILE,\n ConfigReadError,\n ConfigWriteError,\n findProjectConfigFile,\n findProjectConfigFileAsync,\n findUserConfigFile,\n findUserConfigFileAsync,\n getApiKey,\n getApiKeyAsync,\n getServerUrl,\n getServerUrlAsync,\n loadConfig,\n loadConfigAsync,\n loadMergedConfig,\n loadMergedConfigAsync,\n loadProjectConfig,\n loadProjectConfigAsync,\n loadUserConfig,\n loadUserConfigAsync,\n PROJECT_CONFIG_FILENAME,\n saveConfig,\n saveConfigAsync,\n saveProjectConfig,\n saveProjectConfigAsync,\n saveUserConfig,\n saveUserConfigAsync,\n setApiKey,\n setApiKeyAsync,\n USER_CONFIG_FILENAME,\n};\n","import { Data, Effect, pipe } from \"effect\";\nimport { getApiKeyAsync, getServerUrlAsync } from \"./config.ts\";\n\nconst TRAILING_SLASH_REGEX = /\\/$/;\nconst ALLOW_UNTRUSTED_SERVER_ENV = \"BRAID_ALLOW_UNTRUSTED_SERVER_URL\";\n\nconst isTruthy = (value: string | undefined): boolean =>\n value === \"1\" || value === \"true\" || value === \"yes\";\n\nconst isLocalHost = (hostname: string): boolean =>\n hostname === \"localhost\" || hostname === \"127.0.0.1\" || hostname === \"::1\";\n\nconst isTrustedApiServerUrl = (serverUrl: string): boolean => {\n try {\n const parsed = new URL(serverUrl);\n const hostname = parsed.hostname;\n const isBraidHost =\n hostname === \"braid.cloud\" || hostname.endsWith(\".braid.cloud\");\n\n if (parsed.protocol === \"https:\" && isBraidHost) {\n return true;\n }\n\n if (parsed.protocol === \"http:\" && isLocalHost(hostname)) {\n return true;\n }\n\n return false;\n } catch {\n return false;\n }\n};\n\ninterface SkillFile {\n path: string;\n content: string;\n encoding?: \"base64\";\n}\n\ninterface Skill {\n name: string;\n files: SkillFile[];\n}\n\ninterface ExportedRule {\n name: string;\n title: string;\n content: string;\n}\n\ninterface SkillsExportResponse {\n source: {\n type: \"profile\" | \"projects\";\n name: string;\n orgProjects?: string[];\n personalProjects?: string[];\n };\n version: string;\n skills: Skill[];\n rules?: ExportedRule[];\n}\n\ninterface ScopeOption {\n id: string;\n name: string;\n}\n\ninterface ScopeOrgProjects {\n orgId: string;\n orgName: string;\n projects: ScopeOption[];\n}\n\ninterface ScopeOptionsResponse {\n organizations: Array<ScopeOption & { isPersonal?: boolean }>;\n profiles: ScopeOption[];\n personalProjects: ScopeOption[];\n orgProjects: ScopeOrgProjects[];\n}\n\ninterface RuleOption {\n id: string;\n title: string;\n}\n\ninterface RuleOptionsResponse {\n rules: RuleOption[];\n}\n\ninterface LifecycleCommandRequest {\n domain:\n | \"projects\"\n | \"rules\"\n | \"profiles\"\n | \"references\"\n | \"agents\"\n | \"workflows\";\n command: string;\n args?: Record<string, unknown>;\n}\n\ninterface LifecycleCommandResponse {\n kind: \"lifecycle\";\n domain: string;\n command: string;\n args?: Record<string, unknown>;\n [key: string]: unknown;\n}\n\ninterface ApiErrorResponse {\n error: string;\n code: string;\n}\n\nclass ApiError extends Data.TaggedError(\"ApiError\")<{\n message: string;\n code: string;\n status: number;\n}> {}\n\nclass AuthenticationError extends Data.TaggedError(\"AuthenticationError\")<{\n message: string;\n}> {}\n\nclass NetworkError extends Data.TaggedError(\"NetworkError\")<{\n message: string;\n cause?: unknown;\n}> {}\n\ntype FetchSkillsError = ApiError | AuthenticationError | NetworkError;\n\ninterface FetchSkillsOptions {\n profile?: string;\n orgProjects?: string[];\n personalProjects?: string[];\n ruleIds?: string[];\n excludedRuleIds?: string[];\n resolveOverlays?: boolean;\n includeUserGlobal?: boolean;\n includeOrgGlobal?: boolean;\n serverUrl?: string;\n apiKey?: string;\n}\n\ninterface FetchRuleOptionsInput {\n orgId?: string;\n orgProjects?: string[];\n personalProjects?: string[];\n includeUserGlobal?: boolean;\n includeOrgGlobal?: boolean;\n serverUrl?: string;\n apiKey?: string;\n}\n\ninterface ApiClientOptions {\n serverUrl?: string;\n apiKey?: string;\n}\n\nconst resolveApiKey = (\n optionsApiKey?: string\n): Effect.Effect<string, AuthenticationError | NetworkError> => {\n if (optionsApiKey) {\n return Effect.succeed(optionsApiKey);\n }\n\n return pipe(\n Effect.tryPromise({\n try: () => getApiKeyAsync(),\n catch: () => new NetworkError({ message: \"Failed to read config\" }),\n }),\n Effect.flatMap((key) =>\n key\n ? Effect.succeed(key)\n : Effect.fail(\n new AuthenticationError({\n message:\n 'No API key configured. Run \"braid auth\" to authenticate.',\n })\n )\n )\n );\n};\n\nconst resolveServerUrl = (\n optionsServerUrl?: string\n): Effect.Effect<string, NetworkError> => {\n if (optionsServerUrl) {\n if (\n !(\n isTruthy(process.env[ALLOW_UNTRUSTED_SERVER_ENV]) ||\n isTrustedApiServerUrl(optionsServerUrl)\n )\n ) {\n return Effect.fail(\n new NetworkError({\n message:\n `Untrusted server URL '${optionsServerUrl}'. ` +\n `Set ${ALLOW_UNTRUSTED_SERVER_ENV}=true to override.`,\n })\n );\n }\n return Effect.succeed(optionsServerUrl);\n }\n\n return pipe(\n Effect.tryPromise({\n try: () => getServerUrlAsync(),\n catch: () => new NetworkError({ message: \"Failed to read config\" }),\n }),\n Effect.flatMap((serverUrl) => {\n if (\n isTruthy(process.env[ALLOW_UNTRUSTED_SERVER_ENV]) ||\n isTrustedApiServerUrl(serverUrl)\n ) {\n return Effect.succeed(serverUrl);\n }\n return Effect.fail(\n new NetworkError({\n message:\n `Untrusted server URL '${serverUrl}'. ` +\n `Set ${ALLOW_UNTRUSTED_SERVER_ENV}=true to override.`,\n })\n );\n })\n );\n};\n\nconst parseResponse = (\n response: Response,\n json: unknown\n): Effect.Effect<SkillsExportResponse, FetchSkillsError> => {\n if (!response.ok) {\n const errorResponse = json as ApiErrorResponse;\n\n if (response.status === 401) {\n return Effect.fail(\n new AuthenticationError({\n message:\n errorResponse.error ||\n \"Invalid or expired API key. Run 'braid auth' to re-authenticate.\",\n })\n );\n }\n\n return Effect.fail(\n new ApiError({\n message: errorResponse.error || \"API request failed\",\n code: errorResponse.code || \"UNKNOWN_ERROR\",\n status: response.status,\n })\n );\n }\n\n return Effect.succeed(json as SkillsExportResponse);\n};\n\n/**\n * Fetches skills from the braid API\n *\n * @param options.profile - Profile name to fetch skills from\n * @param options.orgProjects - Array of org project IDs to fetch skills from\n * @param options.personalProjects - Array of personal project IDs to fetch skills from\n * @param options.serverUrl - Override server URL (for review apps, local dev)\n * @param options.apiKey - Override API key (for testing)\n */\nconst buildApiUrl = (serverUrl: string, path: string): URL => {\n const baseUrl = serverUrl.replace(TRAILING_SLASH_REGEX, \"\");\n return new URL(`${baseUrl}${path}`);\n};\n\nconst buildExportUrl = (\n serverUrl: string,\n options: FetchSkillsOptions\n): URL => {\n const url = buildApiUrl(serverUrl, \"/api/skills/export\");\n\n if (options.profile) {\n url.searchParams.set(\"profile\", options.profile);\n }\n if (options.orgProjects && options.orgProjects.length > 0) {\n url.searchParams.set(\"orgProjects\", options.orgProjects.join(\",\"));\n }\n if (options.personalProjects && options.personalProjects.length > 0) {\n url.searchParams.set(\n \"personalProjects\",\n options.personalProjects.join(\",\")\n );\n }\n if (options.includeUserGlobal !== undefined) {\n url.searchParams.set(\n \"includeUserGlobal\",\n String(options.includeUserGlobal)\n );\n }\n if (options.includeOrgGlobal !== undefined) {\n url.searchParams.set(\"includeOrgGlobal\", String(options.includeOrgGlobal));\n }\n if (options.ruleIds && options.ruleIds.length > 0) {\n url.searchParams.set(\"ruleIds\", options.ruleIds.join(\",\"));\n }\n if (options.excludedRuleIds && options.excludedRuleIds.length > 0) {\n url.searchParams.set(\"excludedRuleIds\", options.excludedRuleIds.join(\",\"));\n }\n if (options.resolveOverlays !== undefined) {\n url.searchParams.set(\"resolveOverlays\", String(options.resolveOverlays));\n }\n\n return url;\n};\n\nconst executeApiRequest = (\n url: URL,\n apiKey: string,\n serverUrl: string\n): Effect.Effect<SkillsExportResponse, FetchSkillsError> =>\n pipe(\n Effect.tryPromise({\n try: () =>\n fetch(url.toString(), {\n method: \"GET\",\n headers: {\n Authorization: `Bearer ${apiKey}`,\n \"Content-Type\": \"application/json\",\n },\n }),\n catch: (e) =>\n new NetworkError({\n message: `Failed to connect to ${serverUrl}`,\n cause: e,\n }),\n }),\n Effect.flatMap((response) =>\n pipe(\n Effect.tryPromise({\n try: () => response.json() as Promise<unknown>,\n catch: () =>\n new NetworkError({ message: \"Failed to parse API response\" }),\n }),\n Effect.flatMap((json) => parseResponse(response, json))\n )\n )\n );\n\nconst parseScopeOptionsResponse = (\n response: Response,\n json: unknown\n): Effect.Effect<ScopeOptionsResponse, FetchSkillsError> => {\n if (!response.ok) {\n const errorResponse = json as ApiErrorResponse;\n\n if (response.status === 401) {\n return Effect.fail(\n new AuthenticationError({\n message:\n errorResponse.error ||\n \"Invalid or expired API key. Run 'braid auth' to re-authenticate.\",\n })\n );\n }\n\n return Effect.fail(\n new ApiError({\n message: errorResponse.error || \"API request failed\",\n code: errorResponse.code || \"UNKNOWN_ERROR\",\n status: response.status,\n })\n );\n }\n\n return Effect.succeed(json as ScopeOptionsResponse);\n};\n\nconst fetchScopeOptions = (\n options: Pick<FetchSkillsOptions, \"serverUrl\" | \"apiKey\"> = {}\n): Effect.Effect<ScopeOptionsResponse, FetchSkillsError> =>\n pipe(\n Effect.all({\n apiKey: resolveApiKey(options.apiKey),\n serverUrl: resolveServerUrl(options.serverUrl),\n }),\n Effect.flatMap(({ apiKey, serverUrl }) => {\n const url = buildApiUrl(serverUrl, \"/api/skills/scope-options\");\n return pipe(\n Effect.tryPromise({\n try: () =>\n fetch(url.toString(), {\n method: \"GET\",\n headers: {\n Authorization: `Bearer ${apiKey}`,\n \"Content-Type\": \"application/json\",\n },\n }),\n catch: (e) =>\n new NetworkError({\n message: `Failed to connect to ${serverUrl}`,\n cause: e,\n }),\n }),\n Effect.flatMap((response) =>\n pipe(\n Effect.tryPromise({\n try: () => response.json() as Promise<unknown>,\n catch: () =>\n new NetworkError({ message: \"Failed to parse API response\" }),\n }),\n Effect.flatMap((json) => parseScopeOptionsResponse(response, json))\n )\n )\n );\n })\n );\n\nconst buildRuleOptionsUrl = (\n serverUrl: string,\n options: FetchRuleOptionsInput\n): URL => {\n const url = buildApiUrl(serverUrl, \"/api/skills/rule-options\");\n\n if (options.orgId) {\n url.searchParams.set(\"orgId\", options.orgId);\n }\n if (options.orgProjects && options.orgProjects.length > 0) {\n url.searchParams.set(\"orgProjects\", options.orgProjects.join(\",\"));\n }\n if (options.personalProjects && options.personalProjects.length > 0) {\n url.searchParams.set(\n \"personalProjects\",\n options.personalProjects.join(\",\")\n );\n }\n if (options.includeUserGlobal !== undefined) {\n url.searchParams.set(\n \"includeUserGlobal\",\n String(options.includeUserGlobal)\n );\n }\n if (options.includeOrgGlobal !== undefined) {\n url.searchParams.set(\"includeOrgGlobal\", String(options.includeOrgGlobal));\n }\n\n return url;\n};\n\nconst fetchRuleOptions = (\n options: FetchRuleOptionsInput = {}\n): Effect.Effect<RuleOptionsResponse, FetchSkillsError> =>\n pipe(\n Effect.all({\n apiKey: resolveApiKey(options.apiKey),\n serverUrl: resolveServerUrl(options.serverUrl),\n }),\n Effect.flatMap(({ apiKey, serverUrl }) =>\n pipe(\n Effect.tryPromise({\n try: () =>\n fetch(buildRuleOptionsUrl(serverUrl, options).toString(), {\n method: \"GET\",\n headers: {\n Authorization: `Bearer ${apiKey}`,\n \"Content-Type\": \"application/json\",\n },\n }),\n catch: (e) =>\n new NetworkError({\n message: `Failed to connect to ${serverUrl}`,\n cause: e,\n }),\n }),\n Effect.flatMap((response) =>\n pipe(\n Effect.tryPromise({\n try: () => response.json() as Promise<unknown>,\n catch: () =>\n new NetworkError({ message: \"Failed to parse API response\" }),\n }),\n Effect.flatMap((json) => {\n if (!response.ok) {\n return parseResponse(response, json).pipe(\n Effect.flatMap(() =>\n Effect.fail(\n new ApiError({\n message: \"API request failed\",\n code: \"UNKNOWN_ERROR\",\n status: response.status,\n })\n )\n )\n );\n }\n\n return Effect.succeed(json as RuleOptionsResponse);\n })\n )\n )\n )\n )\n );\n\nconst fetchSkills = (\n options: FetchSkillsOptions\n): Effect.Effect<SkillsExportResponse, FetchSkillsError> =>\n pipe(\n Effect.all({\n apiKey: resolveApiKey(options.apiKey),\n serverUrl: resolveServerUrl(options.serverUrl),\n }),\n Effect.flatMap(({ apiKey, serverUrl }) => {\n const url = buildExportUrl(serverUrl, options);\n return executeApiRequest(url, apiKey, serverUrl);\n })\n );\n\nconst runLifecycleCommand = (\n request: LifecycleCommandRequest,\n options: ApiClientOptions = {}\n): Effect.Effect<LifecycleCommandResponse, FetchSkillsError> =>\n pipe(\n Effect.all({\n apiKey: resolveApiKey(options.apiKey),\n serverUrl: resolveServerUrl(options.serverUrl),\n }),\n Effect.flatMap(({ apiKey, serverUrl }) =>\n Effect.tryPromise({\n try: async (): Promise<LifecycleCommandResponse> => {\n const response = await fetch(\n buildApiUrl(serverUrl, \"/api/lifecycle\").toString(),\n {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${apiKey}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(request),\n }\n );\n\n const json = (await response.json()) as unknown;\n\n if (!response.ok) {\n const errorResponse = json as ApiErrorResponse;\n if (response.status === 401) {\n throw new AuthenticationError({\n message:\n errorResponse.error ||\n \"Invalid or expired API key. Run 'braid auth' to re-authenticate.\",\n });\n }\n\n throw new ApiError({\n message: errorResponse.error || \"API request failed\",\n code: errorResponse.code || \"UNKNOWN_ERROR\",\n status: response.status,\n });\n }\n\n return json as LifecycleCommandResponse;\n },\n catch: (error): FetchSkillsError => {\n if (\n error instanceof ApiError ||\n error instanceof AuthenticationError ||\n error instanceof NetworkError\n ) {\n return error;\n }\n\n return new NetworkError({\n message: `Failed to connect to ${serverUrl}`,\n cause: error,\n });\n },\n })\n )\n );\n\nconst DEFAULT_PUBLIC_SERVER_URL = \"https://braid.cloud\";\n\ninterface PublicProjectMetadata {\n type: \"project\";\n project: {\n name: string;\n slug: string;\n description?: string;\n ruleCount: number;\n };\n rules: Array<{\n id: string;\n title: string;\n slug?: string;\n type: string;\n tags: string[];\n }>;\n}\n\ninterface PublicRuleMetadata {\n type: \"rule\";\n rule: {\n id: string;\n title: string;\n slug?: string;\n type: string;\n tags: string[];\n description: string;\n };\n}\n\ntype PublicMetadataResponse = PublicProjectMetadata | PublicRuleMetadata;\n\nclass NotFoundError extends Data.TaggedError(\"NotFoundError\")<{\n message: string;\n}> {}\n\nclass RateLimitedError extends Data.TaggedError(\"RateLimitedError\")<{\n message: string;\n retryAfterMs?: number;\n}> {}\n\ntype PublicApiError =\n | NetworkError\n | NotFoundError\n | RateLimitedError\n | ApiError;\n\nconst handlePublicApiResponse = <T>(\n response: Response,\n json: unknown\n): Effect.Effect<T, PublicApiError> => {\n if (response.ok) {\n return Effect.succeed(json as T);\n }\n\n if (response.status === 404) {\n return Effect.fail(\n new NotFoundError({ message: \"Public content not found\" })\n );\n }\n\n if (response.status === 429) {\n const retryAfter = response.headers.get(\"Retry-After\");\n const retryMs = retryAfter ? Number(retryAfter) * 1000 : null;\n return Effect.fail(\n new RateLimitedError({\n message: \"Rate limited. Please try again later.\",\n ...(retryMs !== null ? { retryAfterMs: retryMs } : {}),\n })\n );\n }\n\n const errorResponse = json as ApiErrorResponse;\n return Effect.fail(\n new ApiError({\n message: errorResponse.error || \"API request failed\",\n code: errorResponse.code || \"UNKNOWN_ERROR\",\n status: response.status,\n })\n );\n};\n\nconst fetchPublicMetadata = (\n handle: string,\n slug: string,\n serverUrl?: string\n): Effect.Effect<PublicMetadataResponse, PublicApiError> => {\n const baseUrl = (serverUrl ?? DEFAULT_PUBLIC_SERVER_URL).replace(\n TRAILING_SLASH_REGEX,\n \"\"\n );\n const url = `${baseUrl}/api/public/@${handle}/${slug}`;\n\n return pipe(\n Effect.tryPromise({\n try: () => fetch(url, { method: \"GET\" }),\n catch: (e) =>\n new NetworkError({\n message: `Failed to connect to ${baseUrl}`,\n cause: e,\n }),\n }),\n Effect.flatMap((response) =>\n pipe(\n Effect.tryPromise({\n try: () => response.json() as Promise<unknown>,\n catch: () =>\n new NetworkError({ message: \"Failed to parse API response\" }),\n }),\n Effect.flatMap((json) =>\n handlePublicApiResponse<PublicMetadataResponse>(response, json)\n )\n )\n )\n );\n};\n\nconst fetchPublicExport = (\n handle: string,\n slug: string,\n ruleIds?: string[],\n serverUrl?: string\n): Effect.Effect<SkillsExportResponse, PublicApiError> => {\n const baseUrl = (serverUrl ?? DEFAULT_PUBLIC_SERVER_URL).replace(\n TRAILING_SLASH_REGEX,\n \"\"\n );\n const url = new URL(`${baseUrl}/api/public/@${handle}/${slug}/export`);\n if (ruleIds && ruleIds.length > 0) {\n url.searchParams.set(\"ruleIds\", ruleIds.join(\",\"));\n }\n\n return pipe(\n Effect.tryPromise({\n try: () => fetch(url.toString(), { method: \"GET\" }),\n catch: (e) =>\n new NetworkError({\n message: `Failed to connect to ${baseUrl}`,\n cause: e,\n }),\n }),\n Effect.flatMap((response) =>\n pipe(\n Effect.tryPromise({\n try: () => response.json() as Promise<unknown>,\n catch: () =>\n new NetworkError({ message: \"Failed to parse API response\" }),\n }),\n Effect.flatMap((json) =>\n handlePublicApiResponse<SkillsExportResponse>(response, json)\n )\n )\n )\n );\n};\n\nconst fetchPublicMetadataAsync = (\n handle: string,\n slug: string,\n serverUrl?: string\n): Promise<PublicMetadataResponse> =>\n Effect.runPromise(fetchPublicMetadata(handle, slug, serverUrl));\n\nconst fetchPublicExportAsync = (\n handle: string,\n slug: string,\n ruleIds?: string[],\n serverUrl?: string\n): Promise<SkillsExportResponse> =>\n Effect.runPromise(fetchPublicExport(handle, slug, ruleIds, serverUrl));\n\n/**\n * Validates an API key by making a test request\n *\n * @param apiKey - API key to validate\n * @param serverUrl - Server URL to validate against (defaults to production)\n */\nconst validateApiKey = (\n apiKey: string,\n serverUrl?: string\n): Effect.Effect<boolean, NetworkError> =>\n pipe(\n Effect.try({\n try: () => {\n const baseUrl = serverUrl ?? \"https://braid.cloud\";\n if (\n !(\n isTruthy(process.env[ALLOW_UNTRUSTED_SERVER_ENV]) ||\n isTrustedApiServerUrl(baseUrl)\n )\n ) {\n throw new NetworkError({\n message:\n `Untrusted server URL '${baseUrl}'. ` +\n `Set ${ALLOW_UNTRUSTED_SERVER_ENV}=true to override.`,\n });\n }\n return baseUrl;\n },\n catch: (e) =>\n e instanceof NetworkError\n ? e\n : new NetworkError({ message: \"Invalid server URL\" }),\n }),\n Effect.flatMap((baseUrl) =>\n Effect.tryPromise({\n try: async () => {\n const url = buildApiUrl(baseUrl, \"/api/skills/export\");\n url.searchParams.set(\"profile\", \"default\");\n\n const response = await fetch(url.toString(), {\n method: \"GET\",\n headers: {\n Authorization: `Bearer ${apiKey}`,\n \"Content-Type\": \"application/json\",\n },\n });\n return response.status !== 401;\n },\n catch: (e) =>\n new NetworkError({\n message: `Failed to connect to ${baseUrl}`,\n cause: e,\n }),\n })\n )\n );\n\nconst fetchSkillsAsync = (\n options: FetchSkillsOptions\n): Promise<SkillsExportResponse> => Effect.runPromise(fetchSkills(options));\n\nconst validateApiKeyAsync = (\n apiKey: string,\n serverUrl?: string\n): Promise<boolean> => Effect.runPromise(validateApiKey(apiKey, serverUrl));\n\nconst fetchScopeOptionsAsync = (\n options: Pick<FetchSkillsOptions, \"serverUrl\" | \"apiKey\"> = {}\n): Promise<ScopeOptionsResponse> =>\n Effect.runPromise(fetchScopeOptions(options));\n\nconst fetchRuleOptionsAsync = (\n options: FetchRuleOptionsInput = {}\n): Promise<RuleOptionsResponse> => Effect.runPromise(fetchRuleOptions(options));\n\nconst runLifecycleCommandAsync = (\n request: LifecycleCommandRequest,\n options: ApiClientOptions = {}\n): Promise<LifecycleCommandResponse> =>\n Effect.runPromise(runLifecycleCommand(request, options));\n\nexport type {\n ApiErrorResponse,\n ExportedRule,\n FetchSkillsOptions,\n PublicMetadataResponse,\n PublicProjectMetadata,\n PublicRuleMetadata,\n Skill,\n SkillFile,\n ScopeOption,\n ScopeOptionsResponse,\n RuleOption,\n RuleOptionsResponse,\n LifecycleCommandRequest,\n LifecycleCommandResponse,\n SkillsExportResponse,\n};\nexport {\n ApiError,\n AuthenticationError,\n fetchPublicExport,\n fetchPublicExportAsync,\n fetchPublicMetadata,\n fetchPublicMetadataAsync,\n fetchSkills,\n fetchSkillsAsync,\n fetchScopeOptions,\n fetchScopeOptionsAsync,\n fetchRuleOptions,\n fetchRuleOptionsAsync,\n NetworkError,\n NotFoundError,\n RateLimitedError,\n runLifecycleCommand,\n runLifecycleCommandAsync,\n validateApiKey,\n validateApiKeyAsync,\n isTrustedApiServerUrl,\n};\n","import process from \"node:process\";\nimport {\n cancel as clackCancel,\n confirm as clackConfirm,\n group as clackGroup,\n groupMultiselect as clackGroupMultiselect,\n intro as clackIntro,\n isCancel as clackIsCancel,\n log as clackLog,\n multiselect as clackMultiselect,\n note as clackNote,\n outro as clackOutro,\n password as clackPassword,\n select as clackSelect,\n selectKey as clackSelectKey,\n spinner as clackSpinner,\n text as clackText,\n} from \"@clack/prompts\";\n\nconst isTTY = Boolean(process.stdout.isTTY);\n\ninterface NoopSpinner {\n start: (message?: string) => void;\n stop: (message?: string) => void;\n message: (message?: string) => void;\n}\n\nfunction spinner(): NoopSpinner | ReturnType<typeof clackSpinner> {\n if (isTTY) {\n return clackSpinner();\n }\n\n return {\n start: (message?: string) => {\n if (message) {\n process.stdout.write(`${message}\\n`);\n }\n },\n stop: (message?: string) => {\n if (message) {\n process.stdout.write(`${message}\\n`);\n }\n },\n message: (message?: string) => {\n if (message) {\n process.stdout.write(`${message}\\n`);\n }\n },\n };\n}\n\nfunction intro(message: string): void {\n if (isTTY) {\n clackIntro(message);\n } else {\n process.stdout.write(`\\n${message}\\n`);\n }\n}\n\nfunction outro(message: string): void {\n if (isTTY) {\n clackOutro(message);\n } else {\n process.stdout.write(`${message}\\n\\n`);\n }\n}\n\nconst cancel = clackCancel;\nconst confirm = clackConfirm;\nconst group = clackGroup;\nconst groupMultiselect = clackGroupMultiselect;\nconst isCancel = clackIsCancel;\nconst log = clackLog;\nconst multiselect = clackMultiselect;\nconst note = clackNote;\nconst password = clackPassword;\nconst select = clackSelect;\nconst selectKey = clackSelectKey;\nconst text = clackText;\n\nexport {\n cancel,\n confirm,\n group,\n groupMultiselect,\n intro,\n isCancel,\n log,\n multiselect,\n note,\n outro,\n password,\n select,\n selectKey,\n spinner,\n text,\n};\n","import type { ScopeOrganization, ScopeSource } from \"./scope-config.ts\";\n\ninterface ScopeFlags {\n organization?: ScopeOrganization;\n source?: ScopeSource;\n profile?: string;\n projects?: string;\n ruleIds?: string;\n excludedRuleIds?: string;\n includeUserGlobal?: boolean;\n includeOrgGlobal?: boolean;\n}\n\ntype FlagSelection =\n | { organization: ScopeOrganization; source: \"profile\"; profile: string }\n | {\n organization: ScopeOrganization;\n source: \"manual\";\n projectIds?: string[];\n ruleIds?: string[];\n excludedRuleIds?: string[];\n includeUserGlobal: boolean;\n includeOrgGlobal: boolean;\n };\n\nfunction parseProjectIds(input: string): string[] {\n return input\n .split(\",\")\n .map((value) => value.trim())\n .filter((value) => value.length > 0);\n}\n\nfunction inferScopeSource(flags: ScopeFlags): ScopeSource | undefined {\n if (flags.profile) {\n return \"profile\";\n }\n if (flags.projects || flags.ruleIds || flags.excludedRuleIds) {\n return \"manual\";\n }\n\n return undefined;\n}\n\nfunction buildManualSelection(\n flags: ScopeFlags\n): Extract<FlagSelection, { source: \"manual\" }> {\n const projectIds = parseProjectIds(flags.projects ?? \"\");\n const ruleIds = parseProjectIds(flags.ruleIds ?? \"\");\n const excludedRuleIds = parseProjectIds(flags.excludedRuleIds ?? \"\");\n\n return {\n organization: flags.organization as ScopeOrganization,\n source: \"manual\",\n ...(projectIds.length > 0 ? { projectIds } : {}),\n ...(ruleIds.length > 0 ? { ruleIds } : {}),\n ...(excludedRuleIds.length > 0 ? { excludedRuleIds } : {}),\n includeUserGlobal:\n flags.includeUserGlobal ?? flags.organization === \"personal\",\n includeOrgGlobal:\n flags.includeOrgGlobal ?? flags.organization === \"organization\",\n };\n}\n\nfunction resolveSelectionFromFlags(flags: ScopeFlags): FlagSelection | null {\n if (!flags.organization) {\n return null;\n }\n\n const source = flags.source ?? inferScopeSource(flags);\n\n if (!source) {\n return null;\n }\n\n if (source === \"profile\") {\n const profile = flags.profile?.trim();\n if (!profile) {\n return null;\n }\n return { organization: flags.organization, source, profile };\n }\n\n return buildManualSelection(flags);\n}\n\nexport type { FlagSelection, ScopeFlags };\nexport { parseProjectIds, resolveSelectionFromFlags };\n","import type { braidProjectConfig } from \"./config.ts\";\n\ntype ScopeOrganization = \"personal\" | \"organization\";\ntype ScopeSource = \"profile\" | \"manual\";\n\ninterface ScopeWriteSelection {\n organization: ScopeOrganization;\n source: ScopeSource;\n profile?: string;\n projectIds?: string[];\n ruleIds?: string[];\n excludedRuleIds?: string[];\n includeUserGlobal?: boolean;\n includeOrgGlobal?: boolean;\n}\n\nfunction buildManualScopeConfig(\n base: braidProjectConfig,\n selection: ScopeWriteSelection\n): braidProjectConfig {\n let projectScope: Partial<\n Pick<braidProjectConfig, \"orgProjects\" | \"personalProjects\">\n > = {};\n if (selection.projectIds && selection.projectIds.length > 0) {\n projectScope =\n selection.organization === \"organization\"\n ? { orgProjects: selection.projectIds }\n : { personalProjects: selection.projectIds };\n }\n\n return {\n ...base,\n ...projectScope,\n ...(selection.ruleIds && selection.ruleIds.length > 0\n ? { ruleIds: selection.ruleIds }\n : {}),\n ...(selection.excludedRuleIds && selection.excludedRuleIds.length > 0\n ? { excludedRuleIds: selection.excludedRuleIds }\n : {}),\n includeUserGlobal:\n selection.includeUserGlobal ?? selection.organization === \"personal\",\n includeOrgGlobal:\n selection.includeOrgGlobal ?? selection.organization === \"organization\",\n };\n}\n\nfunction buildScopedConfig(\n existing: braidProjectConfig,\n selection: ScopeWriteSelection\n): braidProjectConfig {\n const {\n profile: _oldProfile,\n orgProjects: _oldOrgProjects,\n personalProjects: _oldPersonalProjects,\n ...base\n } = existing;\n\n if (selection.source === \"profile\") {\n const profile = selection.profile?.trim();\n return {\n ...base,\n ...(profile ? { profile } : {}),\n includeUserGlobal: selection.organization === \"personal\",\n includeOrgGlobal: selection.organization === \"organization\",\n };\n }\n\n if (selection.source === \"manual\") {\n return buildManualScopeConfig(base, selection);\n }\n\n return base;\n}\n\nexport type { ScopeOrganization, ScopeSource, ScopeWriteSelection };\nexport { buildScopedConfig };\n","import process from \"node:process\";\nimport type { ScopeOptionsResponse } from \"../lib/api.ts\";\nimport { fetchRuleOptionsAsync, fetchScopeOptionsAsync } from \"../lib/api.ts\";\nimport {\n loadMergedConfigAsync,\n loadProjectConfigAsync,\n loadUserConfigAsync,\n saveProjectConfigAsync,\n saveUserConfigAsync,\n} from \"../lib/config.ts\";\nimport type { FlagSelection, ScopeFlags } from \"../lib/scope-args.ts\";\nimport { resolveSelectionFromFlags } from \"../lib/scope-args.ts\";\nimport type { ScopeOrganization, ScopeSource } from \"../lib/scope-config.ts\";\nimport { buildScopedConfig } from \"../lib/scope-config.ts\";\nimport {\n cancel,\n confirm,\n intro,\n isCancel,\n log,\n multiselect,\n outro,\n select,\n spinner,\n text,\n} from \"../lib/tui.ts\";\n\ninterface ScopeCommandOptions {\n server?: string;\n file?: \"project\" | \"user\";\n apiKey?: string;\n organization?: ScopeOrganization;\n source?: ScopeSource;\n profile?: string;\n projects?: string;\n ruleIds?: string;\n excludedRuleIds?: string;\n includeUserGlobal?: boolean;\n includeOrgGlobal?: boolean;\n}\n\ntype OrganizationContext =\n | { organization: \"personal\" }\n | { organization: \"organization\"; orgId: string };\n\ninterface ManualInputs {\n includeUserGlobal: boolean;\n includeOrgGlobal: boolean;\n projectIds?: string[];\n ruleIds?: string[];\n excludedRuleIds?: string[];\n}\n\nfunction exitCancelled(message: string): never {\n cancel(message);\n process.exit(0);\n}\n\nasync function selectTargetFile(\n options: ScopeCommandOptions\n): Promise<\"project\" | \"user\"> {\n if (options.file) {\n return options.file;\n }\n\n const target = await select<\"project\" | \"user\">({\n message: \"Where should this scope be saved?\",\n options: [\n {\n value: \"user\",\n label: \"braid.user.json\",\n hint: \"Personal machine defaults\",\n },\n {\n value: \"project\",\n label: \"braid.json\",\n hint: \"Shared project defaults\",\n },\n ],\n initialValue: \"user\",\n });\n\n if (isCancel(target)) {\n exitCancelled(\"Scope update cancelled.\");\n }\n return target;\n}\n\nasync function selectOrganization(\n scopeOptions: ScopeOptionsResponse\n): Promise<OrganizationContext> {\n const options: Array<{ value: string; label: string; hint?: string }> = [\n { value: \"personal\", label: \"Personal\", hint: \"Your personal rules\" },\n ];\n for (const org of scopeOptions.organizations.filter(\n (item) => !item.isPersonal\n )) {\n options.push({ value: `org:${org.id}`, label: org.name, hint: org.id });\n }\n\n const selected = await select<string>({\n message: \"Select organization context:\",\n options,\n initialValue: \"personal\",\n });\n\n if (isCancel(selected)) {\n exitCancelled(\"Scope update cancelled.\");\n }\n if (selected === \"personal\") {\n return { organization: \"personal\" };\n }\n\n return { organization: \"organization\", orgId: selected.replace(\"org:\", \"\") };\n}\n\nasync function selectScopeSource(): Promise<ScopeSource> {\n const source = await select<ScopeSource>({\n message: \"Select scope source:\",\n options: [\n { value: \"profile\", label: \"Profile\", hint: \"Use an MCP profile\" },\n {\n value: \"manual\",\n label: \"Manual\",\n hint: \"Mix globals, projects, and rules\",\n },\n ],\n initialValue: \"profile\",\n });\n\n if (isCancel(source)) {\n exitCancelled(\"Scope update cancelled.\");\n }\n return source;\n}\n\nasync function selectProfileName(\n scopeOptions: ScopeOptionsResponse\n): Promise<string> {\n if (scopeOptions.profiles.length === 0) {\n const profileName = await text({\n message: \"Profile name:\",\n placeholder: \"default\",\n validate: (value) =>\n (value ?? \"\").trim().length > 0\n ? undefined\n : \"Profile name is required\",\n });\n if (isCancel(profileName)) {\n exitCancelled(\"Scope update cancelled.\");\n }\n return profileName.trim();\n }\n\n const profile = await select<string>({\n message: \"Select profile:\",\n options: scopeOptions.profiles.map((p) => ({\n value: p.name,\n label: p.name,\n hint: p.id,\n })),\n ...(scopeOptions.profiles[0]?.name\n ? { initialValue: scopeOptions.profiles[0].name }\n : {}),\n });\n if (isCancel(profile)) {\n exitCancelled(\"Scope update cancelled.\");\n }\n return profile;\n}\n\nfunction projectsForContext(\n organizationContext: OrganizationContext,\n scopeOptions: ScopeOptionsResponse\n): Array<{ id: string; name: string }> {\n if (organizationContext.organization === \"personal\") {\n return scopeOptions.personalProjects;\n }\n const orgProjects = scopeOptions.orgProjects.find(\n (o) => o.orgId === organizationContext.orgId\n );\n return orgProjects?.projects ?? [];\n}\n\nasync function selectProjects(\n organizationContext: OrganizationContext,\n scopeOptions: ScopeOptionsResponse\n): Promise<string[] | undefined> {\n const availableProjects = projectsForContext(\n organizationContext,\n scopeOptions\n );\n if (availableProjects.length === 0) {\n return undefined;\n }\n\n const shouldUseProjects = await confirm({\n message: \"Include project rules too?\",\n initialValue: true,\n });\n if (isCancel(shouldUseProjects)) {\n exitCancelled(\"Scope update cancelled.\");\n }\n if (!shouldUseProjects) {\n return undefined;\n }\n\n const selected = await multiselect({\n message: \"Select projects:\",\n options: availableProjects.map((p) => ({\n value: p.id,\n label: p.name,\n hint: p.id,\n })),\n required: false,\n });\n if (isCancel(selected)) {\n exitCancelled(\"Scope update cancelled.\");\n }\n return selected.length > 0 ? selected : undefined;\n}\n\nasync function pickRuleIds(\n message: string,\n rules: Array<{ id: string; title: string }>\n): Promise<string[] | undefined> {\n const selected = await multiselect({\n message,\n options: rules.map((rule) => ({\n value: rule.id,\n label: rule.title,\n hint: rule.id,\n })),\n required: false,\n });\n if (isCancel(selected)) {\n exitCancelled(\"Scope update cancelled.\");\n }\n return selected.length > 0 ? selected : undefined;\n}\n\nfunction manualInputsFromFlag(\n flagSelection: Extract<FlagSelection, { source: \"manual\" }>\n): ManualInputs {\n return {\n includeUserGlobal: flagSelection.includeUserGlobal,\n includeOrgGlobal: flagSelection.includeOrgGlobal,\n ...(flagSelection.projectIds\n ? { projectIds: flagSelection.projectIds }\n : {}),\n ...(flagSelection.ruleIds ? { ruleIds: flagSelection.ruleIds } : {}),\n ...(flagSelection.excludedRuleIds\n ? { excludedRuleIds: flagSelection.excludedRuleIds }\n : {}),\n };\n}\n\nasync function promptRuleFilters(\n organizationContext: OrganizationContext,\n projectIds: string[] | undefined,\n includeUserGlobal: boolean,\n includeOrgGlobal: boolean,\n serverUrl: string,\n apiKey: string | undefined\n): Promise<{ ruleIds?: string[]; excludedRuleIds?: string[] }> {\n const filterMode = await select<\"none\" | \"include\" | \"exclude\" | \"both\">({\n message: \"Rule filtering:\",\n options: [\n { value: \"none\", label: \"None\", hint: \"Use all matched rules\" },\n {\n value: \"include\",\n label: \"Only include\",\n hint: \"Pick explicit rule IDs\",\n },\n { value: \"exclude\", label: \"Exclude\", hint: \"Remove specific rule IDs\" },\n { value: \"both\", label: \"Include + exclude\", hint: \"Both filters\" },\n ],\n initialValue: \"none\",\n });\n if (isCancel(filterMode) || filterMode === \"none\") {\n if (isCancel(filterMode)) {\n exitCancelled(\"Scope update cancelled.\");\n }\n return {};\n }\n\n const ruleOptions = await fetchRuleOptionsAsync(\n buildRuleOptionsRequest(\n organizationContext,\n projectIds,\n includeUserGlobal,\n includeOrgGlobal,\n serverUrl,\n apiKey\n )\n );\n\n const ruleIds =\n filterMode === \"include\" || filterMode === \"both\"\n ? await pickRuleIds(\"Select rules to include:\", ruleOptions.rules)\n : undefined;\n const excludedRuleIds =\n filterMode === \"exclude\" || filterMode === \"both\"\n ? await pickRuleIds(\"Select rules to exclude:\", ruleOptions.rules)\n : undefined;\n\n return {\n ...(ruleIds ? { ruleIds } : {}),\n ...(excludedRuleIds ? { excludedRuleIds } : {}),\n };\n}\n\nfunction buildRuleOptionsRequest(\n organizationContext: OrganizationContext,\n projectIds: string[] | undefined,\n includeUserGlobal: boolean,\n includeOrgGlobal: boolean,\n serverUrl: string,\n apiKey: string | undefined\n): Parameters<typeof fetchRuleOptionsAsync>[0] {\n let projectScope: Record<string, string[]> = {};\n if (projectIds && organizationContext.organization === \"organization\") {\n projectScope = { orgProjects: projectIds };\n }\n if (projectIds && organizationContext.organization === \"personal\") {\n projectScope = { personalProjects: projectIds };\n }\n\n return {\n serverUrl,\n ...(apiKey ? { apiKey } : {}),\n ...(organizationContext.organization === \"organization\"\n ? { orgId: organizationContext.orgId }\n : {}),\n ...projectScope,\n includeUserGlobal,\n includeOrgGlobal,\n };\n}\n\nasync function resolveManualInputs(\n organizationContext: OrganizationContext,\n scopeOptions: ScopeOptionsResponse,\n serverUrl: string,\n apiKey: string | undefined\n): Promise<ManualInputs> {\n const { includeUserGlobal, includeOrgGlobal } =\n await promptGlobalInclusions(organizationContext);\n\n const projectIds = await selectProjects(organizationContext, scopeOptions);\n const filters = await promptRuleFilters(\n organizationContext,\n projectIds,\n includeUserGlobal,\n includeOrgGlobal,\n serverUrl,\n apiKey\n );\n\n return {\n includeUserGlobal,\n includeOrgGlobal,\n ...(projectIds ? { projectIds } : {}),\n ...filters,\n };\n}\n\nasync function promptGlobalInclusions(\n organizationContext: OrganizationContext\n): Promise<{ includeUserGlobal: boolean; includeOrgGlobal: boolean }> {\n const includeUserGlobal = await confirm({\n message: \"Include personal global rules?\",\n initialValue: organizationContext.organization === \"personal\",\n });\n if (isCancel(includeUserGlobal)) {\n exitCancelled(\"Scope update cancelled.\");\n }\n\n if (organizationContext.organization === \"personal\") {\n return { includeUserGlobal, includeOrgGlobal: false };\n }\n\n const includeOrgGlobal = await confirm({\n message: \"Include organization global rules?\",\n initialValue: true,\n });\n if (isCancel(includeOrgGlobal)) {\n exitCancelled(\"Scope update cancelled.\");\n }\n\n return { includeUserGlobal, includeOrgGlobal };\n}\n\nasync function resolveManualSelection(\n source: ScopeSource,\n flagSelection: FlagSelection | null,\n organizationContext: OrganizationContext,\n scopeOptions: ScopeOptionsResponse,\n serverUrl: string,\n apiKey: string | undefined\n): Promise<ManualInputs | undefined> {\n if (source !== \"manual\") {\n return undefined;\n }\n if (flagSelection?.source === \"manual\") {\n return manualInputsFromFlag(flagSelection);\n }\n\n return await resolveManualInputs(\n organizationContext,\n scopeOptions,\n serverUrl,\n apiKey\n );\n}\n\nasync function resolveOrganizationContext(\n flagSelection: FlagSelection | null,\n scopeOptions: ScopeOptionsResponse\n): Promise<OrganizationContext> {\n if (flagSelection?.organization === \"personal\") {\n return { organization: \"personal\" };\n }\n\n return await selectOrganization(scopeOptions);\n}\n\nasync function resolveProfileSelection(\n source: ScopeSource,\n flagSelection: FlagSelection | null,\n scopeOptions: ScopeOptionsResponse\n): Promise<string | undefined> {\n if (source !== \"profile\") {\n return undefined;\n }\n if (flagSelection?.source === \"profile\") {\n return flagSelection.profile;\n }\n return await selectProfileName(scopeOptions);\n}\n\nfunction resolveFlagSelection(\n options: ScopeCommandOptions\n): FlagSelection | null {\n const flags: ScopeFlags = {\n ...(options.organization ? { organization: options.organization } : {}),\n ...(options.source ? { source: options.source } : {}),\n ...(options.profile ? { profile: options.profile } : {}),\n ...(options.projects ? { projects: options.projects } : {}),\n ...(options.ruleIds ? { ruleIds: options.ruleIds } : {}),\n ...(options.excludedRuleIds\n ? { excludedRuleIds: options.excludedRuleIds }\n : {}),\n ...(options.includeUserGlobal !== undefined\n ? { includeUserGlobal: options.includeUserGlobal }\n : {}),\n ...(options.includeOrgGlobal !== undefined\n ? { includeOrgGlobal: options.includeOrgGlobal }\n : {}),\n };\n return resolveSelectionFromFlags(flags);\n}\n\nexport async function scopeCommand(\n options: ScopeCommandOptions\n): Promise<void> {\n intro(\"braid scope\");\n\n const config = await loadMergedConfigAsync();\n const targetFile = await selectTargetFile(options);\n\n const loadSpinner = spinner();\n loadSpinner.start(\"Loading scope options from braid...\");\n\n try {\n const serverUrl = options.server ?? config.serverUrl;\n const apiKey = options.apiKey ?? config.token;\n\n const scopeOptions = await fetchScopeOptionsAsync({\n serverUrl,\n ...(apiKey ? { apiKey } : {}),\n });\n loadSpinner.stop(\"Scope options loaded\");\n\n const flagSelection = resolveFlagSelection(options);\n const organizationContext = await resolveOrganizationContext(\n flagSelection,\n scopeOptions\n );\n const source = flagSelection?.source ?? (await selectScopeSource());\n\n const profile = await resolveProfileSelection(\n source,\n flagSelection,\n scopeOptions\n );\n\n const manualInputs = await resolveManualSelection(\n source,\n flagSelection,\n organizationContext,\n scopeOptions,\n serverUrl,\n apiKey\n );\n\n const selection = {\n organization: organizationContext.organization,\n source,\n ...(profile ? { profile } : {}),\n ...(manualInputs ?? {}),\n };\n\n if (targetFile === \"user\") {\n const existing = (await loadUserConfigAsync()) ?? {};\n const path = await saveUserConfigAsync(\n buildScopedConfig(existing, selection)\n );\n outro(`Updated ${path}`);\n return;\n }\n\n const existing = (await loadProjectConfigAsync()) ?? {};\n const path = await saveProjectConfigAsync(\n buildScopedConfig(existing, selection)\n );\n outro(`Updated ${path}`);\n } catch (error) {\n loadSpinner.stop(\"Failed to load scope options\");\n log.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n}\n","import { createRequire } from \"node:module\";\nimport { Command } from \"commander\";\n\nconst require = createRequire(import.meta.url);\nconst { version: PACKAGE_VERSION } = require(\"../package.json\");\n\nimport {\n agentsCreateCommand,\n agentsGetCommand,\n agentsInstallCommand,\n agentsListCommand,\n agentsRemoveCommand,\n agentsUpdateCommand,\n} from \"./commands/agents.ts\";\nimport {\n authCommand,\n authLogoutCommand,\n authStatusCommand,\n} from \"./commands/auth.ts\";\nimport {\n projectsListCommand,\n rulesListCommand,\n skillsListCommand,\n} from \"./commands/discover.ts\";\nimport { installCommand } from \"./commands/install.ts\";\nimport { listCommand } from \"./commands/list.ts\";\nimport { mcpCommand } from \"./commands/mcp.ts\";\nimport {\n profilesCreateCommand,\n profilesGetCommand,\n profilesListCommand,\n profilesRemoveCommand,\n profilesSetDefaultCommand,\n profilesUpdateCommand,\n} from \"./commands/profiles.ts\";\nimport {\n projectsCreateCommand,\n projectsGetCommand,\n projectsRemoveCommand,\n projectsUpdateCommand,\n} from \"./commands/projects.ts\";\nimport {\n referencesCreateCommand,\n referencesGetCommand,\n referencesListCommand,\n referencesRemoveCommand,\n referencesReorderCommand,\n referencesUpdateCommand,\n} from \"./commands/references.ts\";\nimport { removeCommand } from \"./commands/remove.ts\";\nimport {\n rulesCreateCommand,\n rulesDisableCommand,\n rulesDuplicateCommand,\n rulesEnableCommand,\n rulesForkCommand,\n rulesGetCommand,\n rulesMoveCommand,\n rulesRemoveCommand,\n rulesSyncCheckCommand,\n rulesSyncDisableCommand,\n rulesSyncEnableCommand,\n rulesSyncHistoryCommand,\n rulesSyncNowCommand,\n rulesSyncStatusCommand,\n rulesUpdateCommand,\n} from \"./commands/rules.ts\";\nimport { scopeCommand } from \"./commands/scope.ts\";\nimport { updateCommand } from \"./commands/update.ts\";\nimport {\n workflowsActiveCommand,\n workflowsCancelCommand,\n workflowsCompleteCommand,\n workflowsFailCommand,\n workflowsListCommand,\n workflowsProgressCommand,\n workflowsStartCommand,\n} from \"./commands/workflows.ts\";\n\nconst program = new Command();\n\nprogram\n .name(\"braid\")\n .description(\n \"Install braid prompts as agent skills to your local development environment\"\n )\n .version(PACKAGE_VERSION);\n\nconst auth = program\n .command(\"auth\")\n .description(\"Configure API key for braid authentication\");\n\nauth\n .command(\"login\", { isDefault: true })\n .description(\"Authenticate with braid via browser login or API key\")\n .option(\"-s, --server <url>\", \"braid server URL (for review apps, local dev)\")\n .option(\n \"--token <token>\",\n \"API key for non-interactive login (skips device flow)\"\n )\n .option(\n \"--timeout <seconds>\",\n \"Device flow timeout in seconds (default: 300)\"\n )\n .option(\"--no-scope\", \"Skip scope setup after login\")\n .action(authCommand);\n\nauth\n .command(\"status\")\n .description(\"Show current authentication status\")\n .action(authStatusCommand);\n\nauth\n .command(\"logout\")\n .description(\"Remove stored API key\")\n .action(authLogoutCommand);\n\nprogram\n .command(\"install\")\n .alias(\"add\")\n .description(\n \"Install skills from a profile, project, or public source (@handle/slug)\"\n )\n .argument(\"[source]\", \"Public source to install from (e.g., @handle/slug)\")\n .option(\"-p, --profile <name>\", \"Profile name to install from\")\n .option(\n \"--org-projects <ids>\",\n \"Comma-separated organization project IDs to install from\"\n )\n .option(\n \"--personal-projects <ids>\",\n \"Comma-separated personal project IDs to install from\"\n )\n .option(\n \"--include-user-globals\",\n \"Include user's personal global prompts (default: true)\"\n )\n .option(\"--no-include-user-globals\", \"Exclude user's personal global prompts\")\n .option(\n \"--include-org-globals\",\n \"Include organization's global prompts (default: true)\"\n )\n .option(\"--no-include-org-globals\", \"Exclude organization's global prompts\")\n .option(\n \"-a, --agents <list>\",\n \"Comma-separated list of agents (e.g., claude-code,opencode)\"\n )\n .option(\"-g, --global\", \"Install to global agent directories\")\n .option(\"-y, --yes\", \"Skip confirmation prompts\")\n .option(\"-l, --list\", \"Preview skills without installing\")\n .option(\"-s, --server <url>\", \"braid server URL (for review apps, local dev)\")\n .action((source, options) => {\n if (source) {\n return installCommand(source, options);\n }\n return installCommand(options);\n });\n\nprogram\n .command(\"scope\")\n .description(\"Interactively configure braid.json or braid.user.json scope\")\n .option(\"--file <target>\", \"Config file target: user or project\")\n .option(\n \"--organization <type>\",\n \"Scope organization for non-interactive mode: personal or organization\"\n )\n .option(\n \"--source <source>\",\n \"Scope source for non-interactive mode: profile or manual\"\n )\n .option(\"--profile <name>\", \"Profile name for non-interactive mode\")\n .option(\n \"--projects <ids>\",\n \"Comma-separated project IDs for non-interactive mode\"\n )\n .option(\n \"--rule-ids <ids>\",\n \"Comma-separated included rule IDs for non-interactive mode\"\n )\n .option(\n \"--excluded-rule-ids <ids>\",\n \"Comma-separated excluded rule IDs for non-interactive mode\"\n )\n .option(\n \"--include-user-global\",\n \"Include personal global rules in non-interactive mode\"\n )\n .option(\n \"--include-org-global\",\n \"Include org global rules in non-interactive mode\"\n )\n .option(\"-s, --server <url>\", \"braid server URL (for review apps, local dev)\")\n .action(scopeCommand);\n\nprogram\n .command(\"list\")\n .alias(\"ls\")\n .description(\"List installed skills\")\n .option(\"-g, --global\", \"List skills in global directories only\")\n .action(listCommand);\n\nconst projects = program\n .command(\"projects\")\n .description(\"Discover available projects from braid\");\n\nprojects\n .command(\"list\")\n .description(\"List available personal and org projects\")\n .option(\"-s, --server <url>\", \"braid server URL (for review apps, local dev)\")\n .option(\"--api-key <token>\", \"API key override\")\n .option(\"--json\", \"Output JSON\")\n .action(projectsListCommand);\n\nprojects\n .command(\"get\")\n .description(\"Get a project by id\")\n .requiredOption(\"--id <id>\", \"Project ID\")\n .option(\"-s, --server <url>\", \"braid server URL (for review apps, local dev)\")\n .option(\"--api-key <token>\", \"API key override\")\n .option(\"--json\", \"Output JSON\")\n .action(projectsGetCommand);\n\nprojects\n .command(\"create\")\n .description(\"Create a project\")\n .requiredOption(\"--name <name>\", \"Project name\")\n .option(\"--description <description>\", \"Project description\")\n .option(\"--org-id <id>\", \"Organization ID\")\n .option(\"-s, --server <url>\", \"braid server URL (for review apps, local dev)\")\n .option(\"--api-key <token>\", \"API key override\")\n .option(\"--json\", \"Output JSON\")\n .action(projectsCreateCommand);\n\nprojects\n .command(\"update\")\n .description(\"Update a project\")\n .requiredOption(\"--id <id>\", \"Project ID\")\n .option(\"--name <name>\", \"Project name\")\n .option(\"--description <description>\", \"Project description\")\n .option(\"-s, --server <url>\", \"braid server URL (for review apps, local dev)\")\n .option(\"--api-key <token>\", \"API key override\")\n .option(\"--json\", \"Output JSON\")\n .action(projectsUpdateCommand);\n\nprojects\n .command(\"remove\")\n .description(\"Remove a project\")\n .requiredOption(\"--id <id>\", \"Project ID\")\n .option(\"-y, --yes\", \"Confirm destructive action\")\n .option(\"-s, --server <url>\", \"braid server URL (for review apps, local dev)\")\n .option(\"--api-key <token>\", \"API key override\")\n .option(\"--json\", \"Output JSON\")\n .action(projectsRemoveCommand);\n\nconst rules = program\n .command(\"rules\")\n .description(\"Discover available rules from braid\");\n\nrules\n .command(\"list\")\n .description(\"List available rules for a scope\")\n .option(\"-s, --server <url>\", \"braid server URL (for review apps, local dev)\")\n .option(\"--api-key <token>\", \"API key override\")\n .option(\"--org-id <id>\", \"Organization ID\")\n .option(\"--org-projects <ids>\", \"Comma-separated organization project IDs\")\n .option(\"--personal-projects <ids>\", \"Comma-separated personal project IDs\")\n .option(\"--include-user-global\", \"Include personal global rules\")\n .option(\"--include-org-global\", \"Include org global rules\")\n .option(\"--json\", \"Output JSON\")\n .action(rulesListCommand);\n\nrules\n .command(\"get\")\n .description(\"Get a rule by id\")\n .requiredOption(\"--id <id>\", \"Rule ID\")\n .option(\"-s, --server <url>\", \"braid server URL (for review apps, local dev)\")\n .option(\"--api-key <token>\", \"API key override\")\n .option(\"--json\", \"Output JSON\")\n .action(rulesGetCommand);\n\nrules\n .command(\"create\")\n .description(\"Create a rule\")\n .requiredOption(\"--title <title>\", \"Rule title\")\n .requiredOption(\"--content <content>\", \"Rule content\")\n .option(\"--project-id <id>\", \"Project ID\")\n .option(\"--tags <list>\", \"Comma-separated tags\")\n .option(\"--priority <priority>\", \"Priority\")\n .option(\"-s, --server <url>\", \"braid server URL (for review apps, local dev)\")\n .option(\"--api-key <token>\", \"API key override\")\n .option(\"--json\", \"Output JSON\")\n .action(rulesCreateCommand);\n\nrules\n .command(\"update\")\n .description(\"Update a rule\")\n .requiredOption(\"--id <id>\", \"Rule ID\")\n .option(\"--title <title>\", \"Rule title\")\n .option(\"--content <content>\", \"Rule content\")\n .option(\"--tags <list>\", \"Comma-separated tags\")\n .option(\"--priority <priority>\", \"Priority\")\n .option(\"-s, --server <url>\", \"braid server URL (for review apps, local dev)\")\n .option(\"--api-key <token>\", \"API key override\")\n .option(\"--json\", \"Output JSON\")\n .action(rulesUpdateCommand);\n\nrules\n .command(\"remove\")\n .description(\"Remove a rule\")\n .requiredOption(\"--id <id>\", \"Rule ID\")\n .option(\"-y, --yes\", \"Confirm destructive action\")\n .option(\"-s, --server <url>\", \"braid server URL (for review apps, local dev)\")\n .option(\"--api-key <token>\", \"API key override\")\n .option(\"--json\", \"Output JSON\")\n .action(rulesRemoveCommand);\n\nrules\n .command(\"enable\")\n .description(\"Enable a rule\")\n .requiredOption(\"--id <id>\", \"Rule ID\")\n .option(\"-s, --server <url>\", \"braid server URL (for review apps, local dev)\")\n .option(\"--api-key <token>\", \"API key override\")\n .option(\"--json\", \"Output JSON\")\n .action(rulesEnableCommand);\n\nrules\n .command(\"disable\")\n .description(\"Disable a rule\")\n .requiredOption(\"--id <id>\", \"Rule ID\")\n .option(\"-s, --server <url>\", \"braid server URL (for review apps, local dev)\")\n .option(\"--api-key <token>\", \"API key override\")\n .option(\"--json\", \"Output JSON\")\n .action(rulesDisableCommand);\n\nrules\n .command(\"move\")\n .description(\"Move a rule to a project\")\n .requiredOption(\"--id <id>\", \"Rule ID\")\n .requiredOption(\"--project-id <id>\", \"Project ID\")\n .option(\"-s, --server <url>\", \"braid server URL (for review apps, local dev)\")\n .option(\"--api-key <token>\", \"API key override\")\n .option(\"--json\", \"Output JSON\")\n .action(rulesMoveCommand);\n\nrules\n .command(\"duplicate\")\n .description(\"Duplicate a rule\")\n .requiredOption(\"--id <id>\", \"Rule ID\")\n .option(\"--target-project-id <id>\", \"Target project ID\")\n .option(\"-s, --server <url>\", \"braid server URL (for review apps, local dev)\")\n .option(\"--api-key <token>\", \"API key override\")\n .option(\"--json\", \"Output JSON\")\n .action(rulesDuplicateCommand);\n\nrules\n .command(\"fork\")\n .description(\"Fork a rule\")\n .requiredOption(\"--id <id>\", \"Rule ID\")\n .option(\"--target-project-id <id>\", \"Target project ID\")\n .option(\"-s, --server <url>\", \"braid server URL (for review apps, local dev)\")\n .option(\"--api-key <token>\", \"API key override\")\n .option(\"--json\", \"Output JSON\")\n .action(rulesForkCommand);\n\nrules\n .command(\"sync-status\")\n .description(\"Show sync status for one rule or all\")\n .option(\"--id <id>\", \"Rule ID\")\n .option(\"-s, --server <url>\", \"braid server URL (for review apps, local dev)\")\n .option(\"--api-key <token>\", \"API key override\")\n .option(\"--json\", \"Output JSON\")\n .action(rulesSyncStatusCommand);\n\nrules\n .command(\"sync-history\")\n .description(\"Show sync history for a rule\")\n .requiredOption(\"--id <id>\", \"Rule ID\")\n .option(\"-s, --server <url>\", \"braid server URL (for review apps, local dev)\")\n .option(\"--api-key <token>\", \"API key override\")\n .option(\"--json\", \"Output JSON\")\n .action(rulesSyncHistoryCommand);\n\nrules\n .command(\"sync-enable\")\n .description(\"Enable sync for a rule\")\n .requiredOption(\"--id <id>\", \"Rule ID\")\n .option(\"-s, --server <url>\", \"braid server URL (for review apps, local dev)\")\n .option(\"--api-key <token>\", \"API key override\")\n .option(\"--json\", \"Output JSON\")\n .action(rulesSyncEnableCommand);\n\nrules\n .command(\"sync-disable\")\n .description(\"Disable sync for a rule\")\n .requiredOption(\"--id <id>\", \"Rule ID\")\n .option(\"-s, --server <url>\", \"braid server URL (for review apps, local dev)\")\n .option(\"--api-key <token>\", \"API key override\")\n .option(\"--json\", \"Output JSON\")\n .action(rulesSyncDisableCommand);\n\nrules\n .command(\"sync-check\")\n .description(\"Check for upstream updates\")\n .requiredOption(\"--id <id>\", \"Rule ID\")\n .option(\"-s, --server <url>\", \"braid server URL (for review apps, local dev)\")\n .option(\"--api-key <token>\", \"API key override\")\n .option(\"--json\", \"Output JSON\")\n .action(rulesSyncCheckCommand);\n\nrules\n .command(\"sync-now\")\n .description(\"Run sync now\")\n .requiredOption(\"--id <id>\", \"Rule ID\")\n .option(\"-s, --server <url>\", \"braid server URL (for review apps, local dev)\")\n .option(\"--api-key <token>\", \"API key override\")\n .option(\"--json\", \"Output JSON\")\n .action(rulesSyncNowCommand);\n\nconst skills = program\n .command(\"skills\")\n .description(\"Discover available skills from braid\");\n\nskills\n .command(\"list\")\n .description(\"List available skills for a profile or project scope\")\n .option(\"-s, --server <url>\", \"braid server URL (for review apps, local dev)\")\n .option(\"--api-key <token>\", \"API key override\")\n .option(\"-p, --profile <name>\", \"Profile name\")\n .option(\"--org-projects <ids>\", \"Comma-separated organization project IDs\")\n .option(\"--personal-projects <ids>\", \"Comma-separated personal project IDs\")\n .option(\"--include-user-global\", \"Include personal global rules\")\n .option(\"--include-org-global\", \"Include org global rules\")\n .option(\"--json\", \"Output JSON\")\n .action(skillsListCommand);\n\nconst profiles = program\n .command(\"profiles\")\n .description(\"Manage scope profiles\");\n\nprofiles\n .command(\"list\")\n .description(\"List profiles\")\n .option(\"-s, --server <url>\", \"braid server URL (for review apps, local dev)\")\n .option(\"--api-key <token>\", \"API key override\")\n .option(\"--json\", \"Output JSON\")\n .action(profilesListCommand);\n\nprofiles\n .command(\"get\")\n .description(\"Get profile by id or name\")\n .option(\"--id <id>\", \"Profile ID\")\n .option(\"--name <name>\", \"Profile name\")\n .option(\"-s, --server <url>\", \"braid server URL (for review apps, local dev)\")\n .option(\"--api-key <token>\", \"API key override\")\n .option(\"--json\", \"Output JSON\")\n .action(profilesGetCommand);\n\nprofiles\n .command(\"create\")\n .description(\"Create profile\")\n .requiredOption(\"--name <name>\", \"Profile name\")\n .option(\"--context-json <json>\", \"Context JSON\")\n .option(\"-s, --server <url>\", \"braid server URL (for review apps, local dev)\")\n .option(\"--api-key <token>\", \"API key override\")\n .option(\"--json\", \"Output JSON\")\n .action(profilesCreateCommand);\n\nprofiles\n .command(\"update\")\n .description(\"Update profile\")\n .requiredOption(\"--id <id>\", \"Profile ID\")\n .option(\"--name <name>\", \"Profile name\")\n .option(\"--context-json <json>\", \"Context JSON\")\n .option(\"-s, --server <url>\", \"braid server URL (for review apps, local dev)\")\n .option(\"--api-key <token>\", \"API key override\")\n .option(\"--json\", \"Output JSON\")\n .action(profilesUpdateCommand);\n\nprofiles\n .command(\"remove\")\n .description(\"Remove profile\")\n .requiredOption(\"--id <id>\", \"Profile ID\")\n .option(\"-y, --yes\", \"Confirm destructive action\")\n .option(\"-s, --server <url>\", \"braid server URL (for review apps, local dev)\")\n .option(\"--api-key <token>\", \"API key override\")\n .option(\"--json\", \"Output JSON\")\n .action(profilesRemoveCommand);\n\nprofiles\n .command(\"set-default\")\n .description(\"Set default profile\")\n .requiredOption(\"--id <id>\", \"Profile ID\")\n .option(\"-s, --server <url>\", \"braid server URL (for review apps, local dev)\")\n .option(\"--api-key <token>\", \"API key override\")\n .option(\"--json\", \"Output JSON\")\n .action(profilesSetDefaultCommand);\n\nconst agents = program.command(\"agents\").description(\"Manage agent artifacts\");\n\nconst workflows = program\n .command(\"workflows\")\n .description(\"Manage local workflow execution lifecycle\");\n\nworkflows\n .command(\"list\")\n .description(\"List control flows available for execution\")\n .option(\"--project-id <id>\", \"Project ID filter\")\n .option(\"-s, --server <url>\", \"braid server URL (for review apps, local dev)\")\n .option(\"--api-key <token>\", \"API key override\")\n .option(\"--json\", \"Output JSON\")\n .action(workflowsListCommand);\n\nworkflows\n .command(\"start\")\n .description(\"Start a workflow execution for a CLI session\")\n .requiredOption(\"--session-id <id>\", \"CLI session ID\")\n .requiredOption(\"--flow-id <id>\", \"Control flow ID\")\n .option(\"--current-node-id <id>\", \"Current node ID\")\n .option(\"--current-step-label <label>\", \"Current step label\")\n .option(\"--metadata <json>\", \"JSON metadata payload\")\n .option(\"-s, --server <url>\", \"braid server URL (for review apps, local dev)\")\n .option(\"--api-key <token>\", \"API key override\")\n .option(\"--json\", \"Output JSON\")\n .action(workflowsStartCommand);\n\nworkflows\n .command(\"progress\")\n .description(\"Update workflow execution progress\")\n .requiredOption(\"--execution-id <id>\", \"Workflow execution ID\")\n .option(\"--current-node-id <id>\", \"Current node ID\")\n .option(\"--current-step-label <label>\", \"Current step label\")\n .option(\"--metadata <json>\", \"JSON metadata payload\")\n .option(\"-s, --server <url>\", \"braid server URL (for review apps, local dev)\")\n .option(\"--api-key <token>\", \"API key override\")\n .option(\"--json\", \"Output JSON\")\n .action(workflowsProgressCommand);\n\nworkflows\n .command(\"active\")\n .description(\"Get active workflow execution for a CLI session\")\n .requiredOption(\"--session-id <id>\", \"CLI session ID\")\n .option(\"-s, --server <url>\", \"braid server URL (for review apps, local dev)\")\n .option(\"--api-key <token>\", \"API key override\")\n .option(\"--json\", \"Output JSON\")\n .action(workflowsActiveCommand);\n\nworkflows\n .command(\"complete\")\n .description(\"Mark a workflow execution complete\")\n .requiredOption(\"--execution-id <id>\", \"Workflow execution ID\")\n .option(\"-s, --server <url>\", \"braid server URL (for review apps, local dev)\")\n .option(\"--api-key <token>\", \"API key override\")\n .option(\"--json\", \"Output JSON\")\n .action(workflowsCompleteCommand);\n\nworkflows\n .command(\"fail\")\n .description(\"Mark a workflow execution failed\")\n .requiredOption(\"--execution-id <id>\", \"Workflow execution ID\")\n .option(\"--error-message <message>\", \"Failure message\")\n .option(\"-s, --server <url>\", \"braid server URL (for review apps, local dev)\")\n .option(\"--api-key <token>\", \"API key override\")\n .option(\"--json\", \"Output JSON\")\n .action(workflowsFailCommand);\n\nworkflows\n .command(\"cancel\")\n .description(\"Cancel a workflow execution\")\n .requiredOption(\"--execution-id <id>\", \"Workflow execution ID\")\n .option(\"-s, --server <url>\", \"braid server URL (for review apps, local dev)\")\n .option(\"--api-key <token>\", \"API key override\")\n .option(\"--json\", \"Output JSON\")\n .action(workflowsCancelCommand);\n\nagents\n .command(\"list\")\n .description(\"List saved agents\")\n .option(\"-s, --server <url>\", \"braid server URL (for review apps, local dev)\")\n .option(\"--api-key <token>\", \"API key override\")\n .option(\"--json\", \"Output JSON\")\n .action(agentsListCommand);\n\nagents\n .command(\"get\")\n .description(\"Get an agent by id\")\n .requiredOption(\"--id <id>\", \"Agent ID\")\n .option(\"-s, --server <url>\", \"braid server URL (for review apps, local dev)\")\n .option(\"--api-key <token>\", \"API key override\")\n .option(\"--json\", \"Output JSON\")\n .action(agentsGetCommand);\n\nagents\n .command(\"create\")\n .description(\"Create an agent\")\n .requiredOption(\"--name <name>\", \"Agent name\")\n .requiredOption(\"--description <description>\", \"Agent description\")\n .requiredOption(\"--prompt <prompt>\", \"Agent system prompt\")\n .option(\"--scope <scope>\", \"Scope: global or project\")\n .option(\"--project-id <id>\", \"Project ID for project-scoped agent\")\n .option(\"--mode <mode>\", \"Mode: primary, subagent, all\")\n .option(\"--model <model>\", \"Model override\")\n .option(\"--skills <list>\", \"Comma-separated skill names\")\n .option(\"-s, --server <url>\", \"braid server URL (for review apps, local dev)\")\n .option(\"--api-key <token>\", \"API key override\")\n .option(\"--json\", \"Output JSON\")\n .action(agentsCreateCommand);\n\nagents\n .command(\"update\")\n .description(\"Update an agent\")\n .requiredOption(\"--id <id>\", \"Agent ID\")\n .option(\"--name <name>\", \"Agent name\")\n .option(\"--description <description>\", \"Agent description\")\n .option(\"--prompt <prompt>\", \"Agent system prompt\")\n .option(\"--mode <mode>\", \"Mode: primary, subagent, all\")\n .option(\"--model <model>\", \"Model override\")\n .option(\"--skills <list>\", \"Comma-separated skill names\")\n .option(\"-s, --server <url>\", \"braid server URL (for review apps, local dev)\")\n .option(\"--api-key <token>\", \"API key override\")\n .option(\"--json\", \"Output JSON\")\n .action(agentsUpdateCommand);\n\nagents\n .command(\"remove\")\n .description(\"Remove an agent\")\n .requiredOption(\"--id <id>\", \"Agent ID\")\n .option(\"-y, --yes\", \"Confirm destructive action\")\n .option(\"-s, --server <url>\", \"braid server URL (for review apps, local dev)\")\n .option(\"--api-key <token>\", \"API key override\")\n .option(\"--json\", \"Output JSON\")\n .action(agentsRemoveCommand);\n\nagents\n .command(\"install\")\n .description(\"Install a saved agent to local coding tools\")\n .requiredOption(\"--id <id>\", \"Agent ID\")\n .option(\n \"-a, --agents <list>\",\n \"Comma-separated list of target coding tools (eg. claude-code,opencode)\"\n )\n .option(\"-g, --global\", \"Install to global agent directories\")\n .option(\"-s, --server <url>\", \"braid server URL (for review apps, local dev)\")\n .option(\"--api-key <token>\", \"API key override\")\n .option(\"--json\", \"Output JSON\")\n .action(agentsInstallCommand);\n\nconst references = program\n .command(\"references\")\n .description(\"Manage rule references\");\n\nreferences\n .command(\"list\")\n .description(\"List references for a rule\")\n .requiredOption(\"--rule-id <id>\", \"Rule ID\")\n .option(\"-s, --server <url>\", \"braid server URL (for review apps, local dev)\")\n .option(\"--api-key <token>\", \"API key override\")\n .option(\"--json\", \"Output JSON\")\n .action(referencesListCommand);\n\nreferences\n .command(\"get\")\n .description(\"Get a reference by id\")\n .requiredOption(\"--id <id>\", \"Reference ID\")\n .option(\"-s, --server <url>\", \"braid server URL (for review apps, local dev)\")\n .option(\"--api-key <token>\", \"API key override\")\n .option(\"--json\", \"Output JSON\")\n .action(referencesGetCommand);\n\nreferences\n .command(\"create\")\n .description(\"Create a reference from file\")\n .requiredOption(\"--rule-id <id>\", \"Rule ID\")\n .requiredOption(\"--file <path>\", \"Reference file path\")\n .option(\"-s, --server <url>\", \"braid server URL (for review apps, local dev)\")\n .option(\"--api-key <token>\", \"API key override\")\n .option(\"--json\", \"Output JSON\")\n .action(referencesCreateCommand);\n\nreferences\n .command(\"update\")\n .description(\"Update reference metadata\")\n .requiredOption(\"--id <id>\", \"Reference ID\")\n .option(\"--label <label>\", \"Reference label\")\n .option(\"--replace-file <path>\", \"Replace reference with file\")\n .option(\"-s, --server <url>\", \"braid server URL (for review apps, local dev)\")\n .option(\"--api-key <token>\", \"API key override\")\n .option(\"--json\", \"Output JSON\")\n .action(referencesUpdateCommand);\n\nreferences\n .command(\"remove\")\n .description(\"Remove reference\")\n .requiredOption(\"--id <id>\", \"Reference ID\")\n .option(\"-y, --yes\", \"Confirm destructive action\")\n .option(\"-s, --server <url>\", \"braid server URL (for review apps, local dev)\")\n .option(\"--api-key <token>\", \"API key override\")\n .option(\"--json\", \"Output JSON\")\n .action(referencesRemoveCommand);\n\nreferences\n .command(\"reorder\")\n .description(\"Reorder references\")\n .requiredOption(\"--rule-id <id>\", \"Rule ID\")\n .requiredOption(\"--ordered-ids <ids>\", \"Comma-separated reference IDs\")\n .option(\"-s, --server <url>\", \"braid server URL (for review apps, local dev)\")\n .option(\"--api-key <token>\", \"API key override\")\n .option(\"--json\", \"Output JSON\")\n .action(referencesReorderCommand);\n\nprogram\n .command(\"update\")\n .alias(\"up\")\n .description(\"Update installed skills to the latest version\")\n .option(\"-g, --global\", \"Update skills in global directories only\")\n .option(\"-y, --yes\", \"Skip confirmation prompts\")\n .option(\"-s, --server <url>\", \"braid server URL (for review apps, local dev)\")\n .action(updateCommand);\n\nprogram\n .command(\"remove\")\n .alias(\"rm\")\n .description(\"Remove installed skills\")\n .option(\"-a, --all\", \"Remove all installed skills\")\n .option(\"-g, --global\", \"Remove skills from global directories only\")\n .option(\"-y, --yes\", \"Skip confirmation prompts\")\n .option(\"--skill <name>\", \"Remove a specific skill by name\")\n .action(removeCommand);\n\nprogram\n .command(\"mcp\")\n .description(\"Configure braid MCP in your AI coding tools\")\n .option(\"-t, --tool <name>\", \"Tool to configure\")\n .option(\"-g, --global\", \"Use global config instead of project\")\n .option(\"--token <token>\", \"API token to embed\")\n .option(\"--no-auth\", \"Skip authentication setup\")\n .option(\"--scope\", \"Run interactive scope configuration\")\n .option(\"--remove\", \"Remove braid MCP from a tool\")\n .option(\"--status\", \"Show which tools have braid MCP configured\")\n .option(\"--help-commands\", \"Show MCP manual command reference\")\n .option(\"-y, --yes\", \"Skip confirmation prompts\")\n .option(\"-s, --server <url>\", \"Custom MCP server URL\")\n .action(mcpCommand);\n\nprogram.parse();\n","import type { CanonicalAgentSpec } from \"../lib/agent-writer.ts\";\nimport { writeAgentsForPlatformAsync } from \"../lib/agent-writer.ts\";\nimport {\n detectAgentsAsync,\n getAgentById,\n resolveAgentsInstallPath,\n resolveInstallPath,\n} from \"../lib/agents.ts\";\nimport { runLifecycleCommandAsync } from \"../lib/api.ts\";\nimport { log } from \"../lib/tui.ts\";\n\ninterface LifecycleOptions {\n server?: string;\n apiKey?: string;\n json?: boolean;\n}\n\ninterface AgentIdOptions extends LifecycleOptions {\n id?: string;\n}\n\ninterface AgentCreateOptions extends LifecycleOptions {\n name?: string;\n description?: string;\n prompt?: string;\n scope?: \"global\" | \"project\";\n projectId?: string;\n model?: string;\n mode?: \"primary\" | \"subagent\" | \"all\";\n skills?: string;\n}\n\ninterface AgentUpdateOptions extends AgentIdOptions {\n name?: string;\n description?: string;\n prompt?: string;\n model?: string;\n mode?: \"primary\" | \"subagent\" | \"all\";\n skills?: string;\n}\n\ninterface AgentRemoveOptions extends AgentIdOptions {\n yes?: boolean;\n}\n\ninterface AgentInstallOptions extends AgentIdOptions {\n agents?: string;\n global?: boolean;\n}\n\nconst parseCsv = (input?: string): string[] | undefined => {\n if (!input) {\n return undefined;\n }\n const values = input\n .split(\",\")\n .map((value) => value.trim())\n .filter((value) => value.length > 0);\n return values.length > 0 ? values : undefined;\n};\n\nconst writeJson = (value: unknown): void => {\n process.stdout.write(`${JSON.stringify(value, null, 2)}\\n`);\n};\n\nconst fail = (message: string): never => {\n throw new Error(message);\n};\n\nconst exitWithError = (error: unknown): never => {\n const message = error instanceof Error ? error.message : String(error);\n log.error(message);\n process.exit(1);\n};\n\nconst run = (\n command: string,\n args: Record<string, unknown>,\n options: LifecycleOptions\n): Promise<unknown> => {\n const apiOptions = {\n ...(options.server ? { serverUrl: options.server } : {}),\n ...(options.apiKey ? { apiKey: options.apiKey } : {}),\n };\n\n return runLifecycleCommandAsync(\n {\n domain: \"agents\",\n command,\n args,\n },\n apiOptions\n );\n};\n\nconst getAgentCandidate = (value: unknown): unknown => {\n if (typeof value === \"object\" && value !== null && \"agent\" in value) {\n return (value as { agent: unknown }).agent;\n }\n return value;\n};\n\nconst getMode = (mode: unknown): CanonicalAgentSpec[\"mode\"] | undefined => {\n if (mode === \"primary\" || mode === \"subagent\" || mode === \"all\") {\n return mode;\n }\n return undefined;\n};\n\nconst getRawSkills = (\n agent: Record<string, unknown>\n): unknown[] | undefined => {\n if (Array.isArray(agent.skillNames)) {\n return agent.skillNames;\n }\n if (Array.isArray(agent.skills)) {\n return agent.skills;\n }\n return undefined;\n};\n\nconst normalizeSpec = (value: unknown): CanonicalAgentSpec => {\n const candidate = getAgentCandidate(value);\n\n if (typeof candidate !== \"object\" || candidate === null) {\n throw new Error(\"Invalid agent payload from API\");\n }\n\n const agent = candidate as Record<string, unknown>;\n const name = typeof agent.name === \"string\" ? agent.name : undefined;\n const description =\n typeof agent.description === \"string\" ? agent.description : undefined;\n const promptFromPrompt =\n typeof agent.prompt === \"string\" ? agent.prompt : undefined;\n const promptFromContent =\n typeof agent.content === \"string\" ? agent.content : undefined;\n const prompt = promptFromPrompt ?? promptFromContent;\n\n if (!(name && description && prompt)) {\n throw new Error(\n \"Agent payload missing required fields: name, description, prompt\"\n );\n }\n\n const result: CanonicalAgentSpec = {\n name,\n description,\n prompt,\n };\n\n const mode = getMode(agent.mode);\n if (mode) {\n result.mode = mode;\n }\n if (typeof agent.model === \"string\") {\n result.model = agent.model;\n }\n const rawSkills = getRawSkills(agent);\n\n if (rawSkills) {\n result.linkedSkillNames = rawSkills.filter(\n (item): item is string => typeof item === \"string\"\n );\n }\n\n return result;\n};\n\nconst resolveInstallTargets = async (\n options: AgentInstallOptions\n): Promise<NonNullable<ReturnType<typeof getAgentById>>[]> => {\n if (options.agents) {\n const ids = parseCsv(options.agents) ?? [];\n const selected = ids\n .map((id) => getAgentById(id as never))\n .filter(\n (agent): agent is NonNullable<typeof agent> => agent !== undefined\n );\n if (selected.length === 0) {\n fail(\"No valid target agents selected\");\n }\n return selected;\n }\n\n const detected = await detectAgentsAsync();\n const filtered = detected.filter((agent) =>\n options.global ? agent.hasGlobalConfig : agent.hasProjectConfig\n );\n if (filtered.length === 0) {\n fail(\n \"No supported local agent installations detected. Use --agents to select targets.\"\n );\n }\n return filtered;\n};\n\nexport async function agentsListCommand(\n options: LifecycleOptions\n): Promise<void> {\n try {\n const result = await run(\"list\", {}, options);\n if (options.json) {\n writeJson(result);\n return;\n }\n log.success(\"agents list completed\");\n writeJson(result);\n } catch (error) {\n exitWithError(error);\n }\n}\n\nexport async function agentsGetCommand(options: AgentIdOptions): Promise<void> {\n try {\n const id = options.id ?? fail(\"agents get requires --id\");\n const result = await run(\"get\", { id }, options);\n if (options.json) {\n writeJson(result);\n return;\n }\n log.success(\"agents get completed\");\n writeJson(result);\n } catch (error) {\n exitWithError(error);\n }\n}\n\nexport async function agentsCreateCommand(\n options: AgentCreateOptions\n): Promise<void> {\n try {\n const name = options.name ?? fail(\"agents create requires --name\");\n const description =\n options.description ?? fail(\"agents create requires --description\");\n const prompt = options.prompt ?? fail(\"agents create requires --prompt\");\n\n const result = await run(\n \"create\",\n {\n name,\n description,\n prompt,\n scope: options.scope,\n projectId: options.projectId,\n model: options.model,\n mode: options.mode,\n skills: parseCsv(options.skills),\n },\n options\n );\n\n if (options.json) {\n writeJson(result);\n return;\n }\n log.success(\"agents create completed\");\n } catch (error) {\n exitWithError(error);\n }\n}\n\nexport async function agentsUpdateCommand(\n options: AgentUpdateOptions\n): Promise<void> {\n try {\n const id = options.id ?? fail(\"agents update requires --id\");\n const result = await run(\n \"update\",\n {\n id,\n name: options.name,\n description: options.description,\n prompt: options.prompt,\n model: options.model,\n mode: options.mode,\n skills: parseCsv(options.skills),\n },\n options\n );\n if (options.json) {\n writeJson(result);\n return;\n }\n log.success(\"agents update completed\");\n } catch (error) {\n exitWithError(error);\n }\n}\n\nexport async function agentsRemoveCommand(\n options: AgentRemoveOptions\n): Promise<void> {\n try {\n const id = options.id ?? fail(\"agents remove requires --id\");\n if (!options.yes) {\n fail(\"agents remove requires --yes\");\n }\n const result = await run(\"remove\", { id, yes: true }, options);\n if (options.json) {\n writeJson(result);\n return;\n }\n log.success(\"agents remove completed\");\n } catch (error) {\n exitWithError(error);\n }\n}\n\nexport async function agentsInstallCommand(\n options: AgentInstallOptions\n): Promise<void> {\n try {\n const id = options.id ?? fail(\"agents install requires --id\");\n const payload = await run(\"get\", { id }, options);\n const spec = normalizeSpec(payload);\n const targets = await resolveInstallTargets(options);\n\n const summary: Array<{\n platform: string;\n installPath?: string;\n written: number;\n warnings: string[];\n errors: Array<{ agent: string; error: string }>;\n }> = [];\n\n for (const target of targets) {\n const installPath =\n resolveAgentsInstallPath(target, { global: options.global === true }) ??\n resolveInstallPath(target, { global: options.global === true });\n\n if (!installPath) {\n summary.push({\n platform: target.id,\n written: 0,\n warnings: [\"No install path available for this platform\"],\n errors: [],\n });\n continue;\n }\n\n const result = await writeAgentsForPlatformAsync(\n target,\n [spec],\n installPath\n );\n summary.push({\n platform: target.id,\n installPath,\n written: result.written.length,\n warnings: result.warnings,\n errors: result.errors,\n });\n }\n\n if (options.json) {\n writeJson(summary);\n return;\n }\n\n for (const item of summary) {\n log.info(\n `${item.platform}: ${item.written} file(s) written${item.installPath ? ` to ${item.installPath}` : \"\"}`\n );\n for (const warning of item.warnings) {\n log.warn(` warning: ${warning}`);\n }\n for (const error of item.errors) {\n log.error(` error (${error.agent}): ${error.error}`);\n }\n }\n\n log.success(\"agents install completed\");\n } catch (error) {\n exitWithError(error);\n }\n}\n","import { mkdir, writeFile } from \"node:fs/promises\";\nimport { dirname, resolve, sep } from \"node:path\";\nimport { Data, Effect, pipe } from \"effect\";\nimport { resolveProfile } from \"./agent-adapters.ts\";\nimport type { AgentConfig } from \"./agents.ts\";\n\ninterface CanonicalAgentSpec {\n name: string;\n description: string;\n prompt: string;\n mode?: \"primary\" | \"subagent\" | \"all\";\n model?: string;\n tools?: unknown;\n permission?: unknown;\n steps?: number;\n temperature?: number;\n topP?: number;\n hidden?: boolean;\n color?: string;\n linkedSkillNames?: string[];\n additional?: Record<string, unknown>;\n}\n\ninterface WriteAgentsResult {\n written: string[];\n warnings: string[];\n errors: Array<{ agent: string; error: string }>;\n}\n\nclass AgentWriteError extends Data.TaggedError(\"AgentWriteError\")<{\n path: string;\n operation: \"mkdir\" | \"write\";\n cause: unknown;\n}> {}\n\nconst isObjectRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\nconst slugify = (value: string): string =>\n value\n .toLowerCase()\n .replace(/[^a-z0-9\\s-]/g, \"\")\n .replace(/\\s+/g, \"-\")\n .replace(/-+/g, \"-\")\n .replace(/^-|-$/g, \"\");\n\nconst escapeYaml = (value: string): string =>\n value.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, '\\\\\"');\n\nconst toYamlLines = (key: string, value: unknown, indent = 0): string[] => {\n const prefix = \" \".repeat(indent);\n const nestedPrefix = \" \".repeat(indent + 2);\n\n if (typeof value === \"string\") {\n return [`${prefix}${key}: \"${escapeYaml(value)}\"`];\n }\n\n if (typeof value === \"number\" || typeof value === \"boolean\") {\n return [`${prefix}${key}: ${value}`];\n }\n\n if (Array.isArray(value)) {\n if (value.length === 0) {\n return [`${prefix}${key}: []`];\n }\n return [\n `${prefix}${key}:`,\n ...value.map((item) => {\n if (\n typeof item === \"string\" ||\n typeof item === \"number\" ||\n typeof item === \"boolean\"\n ) {\n return `${nestedPrefix}- ${typeof item === \"string\" ? `\"${escapeYaml(item)}\"` : item}`;\n }\n if (isObjectRecord(item)) {\n const nested = Object.entries(item).flatMap(\n ([nestedKey, nestedValue]) =>\n toYamlLines(nestedKey, nestedValue, indent + 4)\n );\n return `${nestedPrefix}-\\n${nested.join(\"\\n\")}`;\n }\n return `${nestedPrefix}- null`;\n }),\n ];\n }\n\n if (isObjectRecord(value)) {\n const entries = Object.entries(value);\n if (entries.length === 0) {\n return [`${prefix}${key}: {}`];\n }\n return [\n `${prefix}${key}:`,\n ...entries.flatMap(([nestedKey, nestedValue]) =>\n toYamlLines(nestedKey, nestedValue, indent + 2)\n ),\n ];\n }\n\n return [];\n};\n\nconst buildClaudeMarkdown = (spec: CanonicalAgentSpec): string => {\n const lines: string[] = [\"---\"];\n lines.push(...toYamlLines(\"name\", spec.name));\n lines.push(...toYamlLines(\"description\", spec.description));\n\n if (spec.model) {\n lines.push(...toYamlLines(\"model\", spec.model));\n }\n if (spec.tools !== undefined) {\n lines.push(...toYamlLines(\"tools\", spec.tools));\n }\n if (spec.permission !== undefined) {\n lines.push(...toYamlLines(\"permissionMode\", spec.permission));\n }\n if (spec.steps !== undefined) {\n lines.push(...toYamlLines(\"maxTurns\", spec.steps));\n }\n if (spec.temperature !== undefined) {\n lines.push(...toYamlLines(\"temperature\", spec.temperature));\n }\n if (spec.linkedSkillNames && spec.linkedSkillNames.length > 0) {\n lines.push(...toYamlLines(\"skills\", spec.linkedSkillNames));\n }\n if (spec.additional) {\n for (const [key, value] of Object.entries(spec.additional)) {\n lines.push(...toYamlLines(key, value));\n }\n }\n\n lines.push(\"---\", \"\", spec.prompt.trim(), \"\");\n return lines.join(\"\\n\");\n};\n\nconst buildOpenCodeMarkdown = (spec: CanonicalAgentSpec): string => {\n const lines: string[] = [\"---\"];\n lines.push(...toYamlLines(\"description\", spec.description));\n\n if (spec.mode) {\n lines.push(...toYamlLines(\"mode\", spec.mode));\n }\n if (spec.model) {\n lines.push(...toYamlLines(\"model\", spec.model));\n }\n if (spec.tools !== undefined) {\n lines.push(...toYamlLines(\"tools\", spec.tools));\n }\n if (spec.permission !== undefined) {\n lines.push(...toYamlLines(\"permission\", spec.permission));\n }\n if (spec.steps !== undefined) {\n lines.push(...toYamlLines(\"steps\", spec.steps));\n }\n if (spec.temperature !== undefined) {\n lines.push(...toYamlLines(\"temperature\", spec.temperature));\n }\n if (spec.topP !== undefined) {\n lines.push(...toYamlLines(\"top_p\", spec.topP));\n }\n if (spec.hidden !== undefined) {\n lines.push(...toYamlLines(\"hidden\", spec.hidden));\n }\n if (spec.color) {\n lines.push(...toYamlLines(\"color\", spec.color));\n }\n if (spec.additional) {\n for (const [key, value] of Object.entries(spec.additional)) {\n lines.push(...toYamlLines(key, value));\n }\n }\n\n lines.push(\"---\", \"\", spec.prompt.trim(), \"\");\n return lines.join(\"\\n\");\n};\n\nconst buildCompatMarkdown = (\n spec: CanonicalAgentSpec,\n source: string\n): string =>\n [\n \"# Compatibility Agent\",\n \"\",\n `Source: ${source}`,\n `Name: ${spec.name}`,\n \"\",\n spec.prompt.trim(),\n \"\",\n ].join(\"\\n\");\n\nconst assertWithinBase = (basePath: string, filename: string): string => {\n const resolvedBase = resolve(basePath);\n const resolvedPath = resolve(basePath, filename);\n if (\n resolvedPath !== resolvedBase &&\n !resolvedPath.startsWith(`${resolvedBase}${sep}`)\n ) {\n throw new Error(`Path traversal detected: ${filename}`);\n }\n return resolvedPath;\n};\n\nconst writeSingleAgent = (\n installPath: string,\n platform: AgentConfig,\n spec: CanonicalAgentSpec\n): Effect.Effect<{ written: string; warnings: string[] }, AgentWriteError> =>\n Effect.tryPromise({\n try: async () => {\n const profile = resolveProfile(platform);\n const fileStem = slugify(spec.name) || \"agent\";\n const filename = `${fileStem}.md`;\n const fullPath = assertWithinBase(installPath, filename);\n\n await mkdir(dirname(fullPath), { recursive: true });\n\n const warnings: string[] = [];\n let content: string;\n\n if (platform.id === \"claude-code\") {\n if (spec.mode === \"primary\") {\n warnings.push(\n \"Claude adapter does not support primary mode; using subagent semantics.\"\n );\n }\n content = buildClaudeMarkdown(spec);\n } else if (platform.id === \"opencode\") {\n content = buildOpenCodeMarkdown(spec);\n } else {\n warnings.push(\n `Platform ${platform.id} uses ${profile.tier} adapter with compatibility output.`\n );\n content = buildCompatMarkdown(spec, platform.name);\n }\n\n await writeFile(fullPath, content, \"utf-8\");\n return { written: fullPath, warnings };\n },\n catch: (cause) =>\n new AgentWriteError({ path: installPath, operation: \"write\", cause }),\n });\n\nconst writeAgentsForPlatform = (\n platform: AgentConfig,\n specs: CanonicalAgentSpec[],\n installPath: string\n): Effect.Effect<WriteAgentsResult, never> =>\n pipe(\n Effect.forEach(\n specs,\n (spec) =>\n pipe(\n writeSingleAgent(installPath, platform, spec),\n Effect.map((result) => ({\n success: true as const,\n written: result.written,\n warnings: result.warnings,\n })),\n Effect.catchAll((error) =>\n Effect.succeed({\n success: false as const,\n error:\n error.cause instanceof Error\n ? error.cause.message\n : String(error.cause),\n specName: spec.name,\n })\n )\n ),\n { concurrency: \"unbounded\" }\n ),\n Effect.map((results) => {\n const written = results\n .filter((r) => r.success)\n .map((r) => r.written)\n .sort();\n const warnings = results\n .filter((r) => r.success)\n .flatMap((r) => r.warnings);\n const errors = results\n .filter(\n (\n r\n ): r is {\n success: false;\n error: string;\n specName: string;\n } => !r.success\n )\n .map((r) => ({ agent: r.specName, error: r.error }));\n\n return { written, warnings, errors };\n })\n );\n\nconst writeAgentsForPlatformAsync = (\n platform: AgentConfig,\n specs: CanonicalAgentSpec[],\n installPath: string\n): Promise<WriteAgentsResult> =>\n Effect.runPromise(writeAgentsForPlatform(platform, specs, installPath));\n\nexport type { CanonicalAgentSpec, WriteAgentsResult };\nexport { writeAgentsForPlatform, writeAgentsForPlatformAsync };\n","import type { AgentConfig, AgentId } from \"./agents.ts\";\n\ntype AgentCapabilityTier = \"native\" | \"mapped\" | \"compat\";\n\ninterface FrontmatterKeyMap {\n canonical: string;\n claude?: string;\n opencode?: string;\n notes?: string;\n}\n\ninterface AgentAdapterProfile {\n tier: AgentCapabilityTier;\n supportsGlobalInstall: boolean;\n supportsProjectInstall: boolean;\n agentConfigPath?: string;\n notes?: string;\n}\n\ninterface CanonicalAgentField {\n key: string;\n required: boolean;\n description: string;\n}\n\nconst CANONICAL_AGENT_FIELDS: CanonicalAgentField[] = [\n {\n key: \"name\",\n required: true,\n description: \"Stable identifier used for filename and mentions.\",\n },\n {\n key: \"description\",\n required: true,\n description: \"Routing hint that tells the host when to invoke the agent.\",\n },\n {\n key: \"prompt\",\n required: true,\n description: \"Main system prompt body.\",\n },\n {\n key: \"scope\",\n required: true,\n description:\n \"global or project install scope used for validation and output path.\",\n },\n {\n key: \"linkedSkillIds\",\n required: false,\n description:\n \"Skill IDs referenced by this agent, validated by scope rules.\",\n },\n {\n key: \"mode\",\n required: false,\n description:\n \"primary, subagent, or all; downgraded by adapters if unsupported.\",\n },\n {\n key: \"model\",\n required: false,\n description: \"Provider/model override.\",\n },\n {\n key: \"tools\",\n required: false,\n description: \"Tool allow/deny map or list depending on target platform.\",\n },\n {\n key: \"permission\",\n required: false,\n description: \"Permission policy, including task/subagent permissions.\",\n },\n {\n key: \"steps\",\n required: false,\n description: \"Maximum iterative agentic steps.\",\n },\n {\n key: \"temperature\",\n required: false,\n description: \"Sampling temperature.\",\n },\n {\n key: \"topP\",\n required: false,\n description: \"Nucleus sampling parameter.\",\n },\n {\n key: \"hidden\",\n required: false,\n description: \"Hide from manual picker where supported.\",\n },\n {\n key: \"color\",\n required: false,\n description: \"UI accent when host supports it.\",\n },\n {\n key: \"additional\",\n required: false,\n description: \"Provider-specific passthrough options.\",\n },\n];\n\nconst FRONTMATTER_MAPPING: FrontmatterKeyMap[] = [\n { canonical: \"name\", claude: \"name\" },\n { canonical: \"description\", claude: \"description\", opencode: \"description\" },\n { canonical: \"mode\", opencode: \"mode\" },\n { canonical: \"model\", claude: \"model\", opencode: \"model\" },\n { canonical: \"tools\", claude: \"tools\", opencode: \"tools\" },\n { canonical: \"permission\", claude: \"permissionMode\", opencode: \"permission\" },\n { canonical: \"steps\", claude: \"maxTurns\", opencode: \"steps\" },\n { canonical: \"temperature\", claude: \"temperature\", opencode: \"temperature\" },\n { canonical: \"topP\", opencode: \"top_p\" },\n { canonical: \"hidden\", opencode: \"hidden\" },\n { canonical: \"color\", opencode: \"color\" },\n {\n canonical: \"linkedSkillIds\",\n claude: \"skills\",\n notes:\n \"OpenCode currently references skills outside the agent file; adapters should emit install metadata.\",\n },\n];\n\nconst NATIVE_AGENT_IDS = new Set<AgentId>([\"claude-code\", \"opencode\"]);\n\nconst MAPPED_AGENT_IDS = new Set<AgentId>([\n \"cursor\",\n \"windsurf\",\n \"cline\",\n \"roo\",\n \"codex\",\n]);\n\nconst resolveProfile = (agent: AgentConfig): AgentAdapterProfile => {\n if (NATIVE_AGENT_IDS.has(agent.id)) {\n return {\n tier: \"native\",\n supportsGlobalInstall: Boolean(agent.agentsGlobalPath),\n supportsProjectInstall: Boolean(agent.agentsProjectPath),\n notes: \"Native subagent/frontmatter format supported.\",\n };\n }\n\n if (MAPPED_AGENT_IDS.has(agent.id)) {\n return {\n tier: \"mapped\",\n supportsGlobalInstall: Boolean(agent.globalPath),\n supportsProjectInstall: Boolean(agent.projectPath),\n notes:\n \"No native agent file format confirmed; install as compatibility artifacts.\",\n };\n }\n\n return {\n tier: \"compat\",\n supportsGlobalInstall: Boolean(agent.globalPath),\n supportsProjectInstall: Boolean(agent.projectPath),\n notes:\n \"Install compatibility output only, with capability warning surfaced to user.\",\n };\n};\n\nexport type {\n AgentAdapterProfile,\n AgentCapabilityTier,\n CanonicalAgentField,\n FrontmatterKeyMap,\n};\nexport {\n CANONICAL_AGENT_FIELDS,\n FRONTMATTER_MAPPING,\n MAPPED_AGENT_IDS,\n NATIVE_AGENT_IDS,\n resolveProfile,\n};\n","import { access, constants } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport process from \"node:process\";\nimport { Effect, pipe } from \"effect\";\n\ntype AgentId =\n | \"amp\"\n | \"kimi-cli\"\n | \"antigravity\"\n | \"claude-code\"\n | \"claude-desktop\"\n | \"moltbot\"\n | \"cline\"\n | \"codebuddy\"\n | \"codex\"\n | \"command-code\"\n | \"continue\"\n | \"crush\"\n | \"cursor\"\n | \"droid\"\n | \"gemini-cli\"\n | \"github-copilot\"\n | \"goose\"\n | \"junie\"\n | \"kilo\"\n | \"kiro-cli\"\n | \"kode\"\n | \"mcpjam\"\n | \"mux\"\n | \"opencode\"\n | \"openhands\"\n | \"pi\"\n | \"qoder\"\n | \"qwen-code\"\n | \"roo\"\n | \"trae\"\n | \"windsurf\"\n | \"zencoder\"\n | \"neovate\"\n | \"pochi\"\n | \"zed\";\n\ntype RuleFormat = \"mdc\" | \"markdown-dir\" | \"append-single\";\n\ntype McpEntryStyle = \"standard\" | \"typed-stdio\" | \"zed\" | \"cline\";\n\ninterface AgentConfig {\n id: AgentId;\n name: string;\n projectPath: string;\n globalPath: string;\n agentsProjectPath?: string;\n agentsGlobalPath?: string;\n projectMarkerPath?: string;\n globalMarkerPath?: string;\n rulesProjectPath?: string;\n rulesGlobalPath?: string;\n ruleFormat?: RuleFormat;\n mcpProjectConfigPath?: string;\n mcpGlobalConfigPath?: string;\n mcpRootKey?: string;\n mcpEntryStyle?: McpEntryStyle;\n}\n\nconst home = homedir();\n\nconst vscodeExtSettingsPath = (\n extensionId: string,\n filename: string\n): string => {\n if (process.platform === \"darwin\") {\n return join(\n home,\n \"Library\",\n \"Application Support\",\n \"Code\",\n \"User\",\n \"globalStorage\",\n extensionId,\n \"settings\",\n filename\n );\n }\n if (process.platform === \"win32\") {\n const appData = process.env.APPDATA ?? join(home, \"AppData\", \"Roaming\");\n return join(\n appData,\n \"Code\",\n \"User\",\n \"globalStorage\",\n extensionId,\n \"settings\",\n filename\n );\n }\n return join(\n home,\n \".config\",\n \"Code\",\n \"User\",\n \"globalStorage\",\n extensionId,\n \"settings\",\n filename\n );\n};\n\nconst claudeDesktopConfigPath = (): string => {\n if (process.platform === \"darwin\") {\n return join(\n home,\n \"Library\",\n \"Application Support\",\n \"Claude\",\n \"claude_desktop_config.json\"\n );\n }\n if (process.platform === \"win32\") {\n const appData = process.env.APPDATA ?? join(home, \"AppData\", \"Roaming\");\n return join(appData, \"Claude\", \"claude_desktop_config.json\");\n }\n return join(home, \".config\", \"Claude\", \"claude_desktop_config.json\");\n};\n\nconst AGENTS: AgentConfig[] = [\n {\n id: \"amp\",\n name: \"Amp\",\n projectPath: \".agents/skills\",\n globalPath: join(home, \".config\", \"agents\", \"skills\"),\n mcpProjectConfigPath: \".amp/mcp.json\",\n mcpGlobalConfigPath: join(home, \".amp\", \"mcp.json\"),\n },\n {\n id: \"kimi-cli\",\n name: \"Kimi Code CLI\",\n projectPath: \".agents/skills\",\n globalPath: join(home, \".config\", \"agents\", \"skills\"),\n mcpProjectConfigPath: \".agents/mcp.json\",\n mcpGlobalConfigPath: join(home, \".config\", \"agents\", \"mcp.json\"),\n },\n {\n id: \"antigravity\",\n name: \"Antigravity\",\n projectPath: \".agent/skills\",\n globalPath: join(home, \".gemini\", \"antigravity\", \"global_skills\"),\n mcpProjectConfigPath: \".agent/mcp.json\",\n mcpGlobalConfigPath: join(home, \".gemini\", \"antigravity\", \"mcp.json\"),\n },\n {\n id: \"claude-code\",\n name: \"Claude Code\",\n projectPath: \".claude/skills\",\n globalPath: join(home, \".claude\", \"skills\"),\n agentsProjectPath: \".claude/agents\",\n agentsGlobalPath: join(home, \".claude\", \"agents\"),\n projectMarkerPath: \".claude\",\n globalMarkerPath: join(home, \".claude\"),\n rulesProjectPath: \".claude/rules\",\n rulesGlobalPath: join(home, \".claude\", \"rules\"),\n ruleFormat: \"markdown-dir\",\n mcpProjectConfigPath: \".mcp.json\",\n mcpEntryStyle: \"typed-stdio\",\n },\n {\n id: \"claude-desktop\",\n name: \"Claude Desktop\",\n projectPath: \"\",\n globalPath: \"\",\n mcpGlobalConfigPath: claudeDesktopConfigPath(),\n },\n {\n id: \"moltbot\",\n name: \"Moltbot\",\n projectPath: \"skills\",\n globalPath: join(home, \".moltbot\", \"skills\"),\n mcpProjectConfigPath: \"mcp.json\",\n mcpGlobalConfigPath: join(home, \".moltbot\", \"mcp.json\"),\n },\n {\n id: \"cline\",\n name: \"Cline\",\n projectPath: \".cline/skills\",\n globalPath: join(home, \".cline\", \"skills\"),\n rulesProjectPath: \".clinerules\",\n ruleFormat: \"append-single\",\n mcpGlobalConfigPath: vscodeExtSettingsPath(\n \"saoudrizwan.claude-dev\",\n \"cline_mcp_settings.json\"\n ),\n mcpEntryStyle: \"cline\",\n },\n {\n id: \"codebuddy\",\n name: \"CodeBuddy\",\n projectPath: \".codebuddy/skills\",\n globalPath: join(home, \".codebuddy\", \"skills\"),\n mcpProjectConfigPath: \".codebuddy/mcp.json\",\n mcpGlobalConfigPath: join(home, \".codebuddy\", \"mcp.json\"),\n },\n {\n id: \"codex\",\n name: \"Codex\",\n projectPath: \".codex/skills\",\n globalPath: join(home, \".codex\", \"skills\"),\n mcpProjectConfigPath: \".codex/mcp.json\",\n mcpGlobalConfigPath: join(home, \".codex\", \"mcp.json\"),\n },\n {\n id: \"command-code\",\n name: \"Command Code\",\n projectPath: \".commandcode/skills\",\n globalPath: join(home, \".commandcode\", \"skills\"),\n mcpProjectConfigPath: \".commandcode/mcp.json\",\n mcpGlobalConfigPath: join(home, \".commandcode\", \"mcp.json\"),\n },\n {\n id: \"continue\",\n name: \"Continue\",\n projectPath: \".continue/skills\",\n globalPath: join(home, \".continue\", \"skills\"),\n mcpProjectConfigPath: \".continue/mcp.json\",\n mcpGlobalConfigPath: join(home, \".continue\", \"mcp.json\"),\n },\n {\n id: \"crush\",\n name: \"Crush\",\n projectPath: \".crush/skills\",\n globalPath: join(home, \".config\", \"crush\", \"skills\"),\n mcpProjectConfigPath: \".crush/mcp.json\",\n mcpGlobalConfigPath: join(home, \".config\", \"crush\", \"mcp.json\"),\n },\n {\n id: \"cursor\",\n name: \"Cursor\",\n projectPath: \".cursor/skills\",\n globalPath: join(home, \".cursor\", \"skills\"),\n rulesProjectPath: \".cursor/rules\",\n ruleFormat: \"mdc\",\n mcpProjectConfigPath: \".cursor/mcp.json\",\n mcpGlobalConfigPath: join(home, \".cursor\", \"mcp.json\"),\n },\n {\n id: \"droid\",\n name: \"Droid\",\n projectPath: \".factory/skills\",\n globalPath: join(home, \".factory\", \"skills\"),\n mcpProjectConfigPath: \".factory/mcp.json\",\n mcpGlobalConfigPath: join(home, \".factory\", \"mcp.json\"),\n },\n {\n id: \"gemini-cli\",\n name: \"Gemini CLI\",\n projectPath: \".gemini/skills\",\n globalPath: join(home, \".gemini\", \"skills\"),\n mcpProjectConfigPath: \".gemini/mcp.json\",\n mcpGlobalConfigPath: join(home, \".gemini\", \"mcp.json\"),\n },\n {\n id: \"github-copilot\",\n name: \"GitHub Copilot\",\n projectPath: \".github/skills\",\n globalPath: join(home, \".copilot\", \"skills\"),\n rulesProjectPath: \".github/copilot-instructions.md\",\n ruleFormat: \"append-single\",\n mcpProjectConfigPath: \".vscode/mcp.json\",\n mcpRootKey: \"servers\",\n mcpEntryStyle: \"typed-stdio\",\n },\n {\n id: \"goose\",\n name: \"Goose\",\n projectPath: \".goose/skills\",\n globalPath: join(home, \".config\", \"goose\", \"skills\"),\n mcpGlobalConfigPath: join(home, \".config\", \"goose\", \"mcp.json\"),\n },\n {\n id: \"junie\",\n name: \"Junie\",\n projectPath: \".junie/skills\",\n globalPath: join(home, \".junie\", \"skills\"),\n mcpProjectConfigPath: \".junie/mcp.json\",\n mcpGlobalConfigPath: join(home, \".junie\", \"mcp.json\"),\n },\n {\n id: \"kilo\",\n name: \"Kilo Code\",\n projectPath: \".kilocode/skills\",\n globalPath: join(home, \".kilocode\", \"skills\"),\n mcpGlobalConfigPath: vscodeExtSettingsPath(\n \"kilocode.kilo-code\",\n \"mcp_settings.json\"\n ),\n mcpEntryStyle: \"cline\",\n },\n {\n id: \"kiro-cli\",\n name: \"Kiro CLI\",\n projectPath: \".kiro/skills\",\n globalPath: join(home, \".kiro\", \"skills\"),\n mcpProjectConfigPath: \".kiro/mcp.json\",\n mcpGlobalConfigPath: join(home, \".kiro\", \"mcp.json\"),\n },\n {\n id: \"kode\",\n name: \"Kode\",\n projectPath: \".kode/skills\",\n globalPath: join(home, \".kode\", \"skills\"),\n mcpProjectConfigPath: \".kode/mcp.json\",\n mcpGlobalConfigPath: join(home, \".kode\", \"mcp.json\"),\n },\n {\n id: \"mcpjam\",\n name: \"MCPJam\",\n projectPath: \".mcpjam/skills\",\n globalPath: join(home, \".mcpjam\", \"skills\"),\n mcpProjectConfigPath: \".mcpjam/mcp.json\",\n mcpGlobalConfigPath: join(home, \".mcpjam\", \"mcp.json\"),\n },\n {\n id: \"mux\",\n name: \"Mux\",\n projectPath: \".mux/skills\",\n globalPath: join(home, \".mux\", \"skills\"),\n mcpProjectConfigPath: \".mux/mcp.json\",\n mcpGlobalConfigPath: join(home, \".mux\", \"mcp.json\"),\n },\n {\n id: \"opencode\",\n name: \"OpenCode\",\n projectPath: \".opencode/skills\",\n globalPath: join(home, \".config\", \"opencode\", \"skills\"),\n agentsProjectPath: \".opencode/agents\",\n agentsGlobalPath: join(home, \".config\", \"opencode\", \"agents\"),\n mcpProjectConfigPath: \".opencode/mcp.json\",\n mcpGlobalConfigPath: join(home, \".config\", \"opencode\", \"mcp.json\"),\n },\n {\n id: \"openhands\",\n name: \"OpenHands\",\n projectPath: \".openhands/skills\",\n globalPath: join(home, \".openhands\", \"skills\"),\n mcpProjectConfigPath: \".openhands/mcp.json\",\n mcpGlobalConfigPath: join(home, \".openhands\", \"mcp.json\"),\n },\n {\n id: \"pi\",\n name: \"Pi\",\n projectPath: \".pi/skills\",\n globalPath: join(home, \".pi\", \"agent\", \"skills\"),\n mcpProjectConfigPath: \".pi/mcp.json\",\n mcpGlobalConfigPath: join(home, \".pi\", \"agent\", \"mcp.json\"),\n },\n {\n id: \"qoder\",\n name: \"Qoder\",\n projectPath: \".qoder/skills\",\n globalPath: join(home, \".qoder\", \"skills\"),\n mcpProjectConfigPath: \".qoder/mcp.json\",\n mcpGlobalConfigPath: join(home, \".qoder\", \"mcp.json\"),\n },\n {\n id: \"qwen-code\",\n name: \"Qwen Code\",\n projectPath: \".qwen/skills\",\n globalPath: join(home, \".qwen\", \"skills\"),\n mcpProjectConfigPath: \".qwen/mcp.json\",\n mcpGlobalConfigPath: join(home, \".qwen\", \"mcp.json\"),\n },\n {\n id: \"roo\",\n name: \"Roo Code\",\n projectPath: \".roo/skills\",\n globalPath: join(home, \".roo\", \"skills\"),\n rulesProjectPath: \".roo/rules\",\n rulesGlobalPath: join(home, \".roo\", \"rules\"),\n ruleFormat: \"markdown-dir\",\n mcpGlobalConfigPath: vscodeExtSettingsPath(\n \"rooveterinaryinc.roo-cline\",\n \"mcp_settings.json\"\n ),\n mcpEntryStyle: \"cline\",\n },\n {\n id: \"trae\",\n name: \"Trae\",\n projectPath: \".trae/skills\",\n globalPath: join(home, \".trae\", \"skills\"),\n mcpProjectConfigPath: \".trae/mcp.json\",\n mcpGlobalConfigPath: join(home, \".trae\", \"mcp.json\"),\n },\n {\n id: \"windsurf\",\n name: \"Windsurf\",\n projectPath: \".windsurf/skills\",\n globalPath: join(home, \".codeium\", \"windsurf\", \"skills\"),\n rulesProjectPath: \".windsurfrules\",\n ruleFormat: \"append-single\",\n mcpGlobalConfigPath: join(home, \".codeium\", \"windsurf\", \"mcp_config.json\"),\n },\n {\n id: \"zencoder\",\n name: \"Zencoder\",\n projectPath: \".zencoder/skills\",\n globalPath: join(home, \".zencoder\", \"skills\"),\n mcpProjectConfigPath: \".zencoder/mcp.json\",\n mcpGlobalConfigPath: join(home, \".zencoder\", \"mcp.json\"),\n },\n {\n id: \"neovate\",\n name: \"Neovate\",\n projectPath: \".neovate/skills\",\n globalPath: join(home, \".neovate\", \"skills\"),\n mcpProjectConfigPath: \".neovate/mcp.json\",\n mcpGlobalConfigPath: join(home, \".neovate\", \"mcp.json\"),\n },\n {\n id: \"pochi\",\n name: \"Pochi\",\n projectPath: \".pochi/skills\",\n globalPath: join(home, \".pochi\", \"skills\"),\n mcpProjectConfigPath: \".pochi/mcp.json\",\n mcpGlobalConfigPath: join(home, \".pochi\", \"mcp.json\"),\n },\n {\n id: \"zed\",\n name: \"Zed\",\n projectPath: \"\",\n globalPath: \"\",\n projectMarkerPath: \".zed\",\n globalMarkerPath: join(home, \".config\", \"zed\"),\n rulesProjectPath: \".zed/rules\",\n rulesGlobalPath: join(home, \".config\", \"zed\", \"rules\"),\n ruleFormat: \"markdown-dir\",\n mcpGlobalConfigPath: join(home, \".config\", \"zed\", \"settings.json\"),\n mcpRootKey: \"context_servers\",\n mcpEntryStyle: \"zed\",\n },\n];\n\nconst directoryExists = (path: string): Effect.Effect<boolean> =>\n pipe(\n Effect.tryPromise({\n try: () => access(path, constants.F_OK),\n catch: () => false,\n }),\n Effect.map(() => true),\n Effect.orElseSucceed(() => false)\n );\n\ninterface DetectedAgent extends AgentConfig {\n hasProjectConfig: boolean;\n hasGlobalConfig: boolean;\n}\n\ninterface InstalledAgent extends AgentConfig {\n hasProjectInstall: boolean;\n hasGlobalInstall: boolean;\n}\n\nconst METADATA_FILENAME = \".braidskills-metadata.json\";\n\nconst detectAgents = (projectRoot?: string): Effect.Effect<DetectedAgent[]> => {\n const cwd = projectRoot ?? process.cwd();\n\n return pipe(\n Effect.forEach(\n AGENTS,\n (agent) =>\n pipe(\n Effect.all({\n hasProjectConfig: agent.projectPath\n ? directoryExists(join(cwd, agent.projectPath))\n : Effect.succeed(false),\n hasGlobalConfig: agent.globalPath\n ? directoryExists(agent.globalPath)\n : Effect.succeed(false),\n hasProjectMarker: agent.projectMarkerPath\n ? directoryExists(join(cwd, agent.projectMarkerPath))\n : Effect.succeed(false),\n hasGlobalMarker: agent.globalMarkerPath\n ? directoryExists(agent.globalMarkerPath)\n : Effect.succeed(false),\n hasRulesProjectConfig: agent.rulesProjectPath\n ? directoryExists(join(cwd, agent.rulesProjectPath))\n : Effect.succeed(false),\n hasRulesGlobalConfig: agent.rulesGlobalPath\n ? directoryExists(agent.rulesGlobalPath)\n : Effect.succeed(false),\n }),\n Effect.map(\n ({\n hasProjectConfig,\n hasGlobalConfig,\n hasProjectMarker,\n hasGlobalMarker,\n hasRulesProjectConfig,\n hasRulesGlobalConfig,\n }): DetectedAgent => ({\n ...agent,\n hasProjectConfig:\n hasProjectConfig || hasRulesProjectConfig || hasProjectMarker,\n hasGlobalConfig:\n hasGlobalConfig || hasRulesGlobalConfig || hasGlobalMarker,\n })\n )\n ),\n { concurrency: \"unbounded\" }\n ),\n Effect.map((agents) =>\n agents.filter((a) => a.hasProjectConfig || a.hasGlobalConfig)\n )\n );\n};\n\nconst detectInstalledAgents = (\n projectRoot?: string\n): Effect.Effect<InstalledAgent[]> => {\n const cwd = projectRoot ?? process.cwd();\n\n return pipe(\n Effect.forEach(\n AGENTS,\n (agent) =>\n pipe(\n Effect.all({\n hasProjectInstall: agent.projectPath\n ? directoryExists(join(cwd, agent.projectPath, METADATA_FILENAME))\n : Effect.succeed(false),\n hasGlobalInstall: agent.globalPath\n ? directoryExists(join(agent.globalPath, METADATA_FILENAME))\n : Effect.succeed(false),\n }),\n Effect.map(\n ({ hasProjectInstall, hasGlobalInstall }): InstalledAgent => ({\n ...agent,\n hasProjectInstall,\n hasGlobalInstall,\n })\n )\n ),\n { concurrency: \"unbounded\" }\n ),\n Effect.map((agents) =>\n agents.filter((a) => a.hasProjectInstall || a.hasGlobalInstall)\n )\n );\n};\n\nconst detectInstalledAgentsAsync = (\n projectRoot?: string\n): Promise<InstalledAgent[]> =>\n Effect.runPromise(detectInstalledAgents(projectRoot));\n\ninterface ResolvedAgentsResult {\n agents: AgentConfig[];\n source: \"config\" | \"installed\" | \"detected\" | \"none\";\n}\n\nconst resolveAgents = (options: {\n configAgents?: string[];\n projectRoot?: string;\n global?: boolean;\n}): Effect.Effect<ResolvedAgentsResult> => {\n const { configAgents, projectRoot, global: useGlobal } = options;\n\n if (configAgents && configAgents.length > 0) {\n const agents = configAgents\n .map((id) => getAgentById(id as AgentId))\n .filter((a): a is AgentConfig => a !== undefined);\n\n if (agents.length > 0) {\n return Effect.succeed<ResolvedAgentsResult>({\n agents,\n source: \"config\",\n });\n }\n }\n\n return pipe(\n Effect.all({\n installed: detectInstalledAgents(projectRoot),\n detected: detectAgents(projectRoot),\n }),\n Effect.map(({ installed, detected }): ResolvedAgentsResult => {\n const relevantInstalled = installed.filter((a) =>\n useGlobal ? a.hasGlobalInstall : a.hasProjectInstall\n );\n\n if (relevantInstalled.length > 0) {\n return {\n agents: relevantInstalled,\n source: \"installed\",\n };\n }\n\n const relevantDetected = detected.filter((a) =>\n useGlobal ? a.hasGlobalConfig : a.hasProjectConfig\n );\n\n if (relevantDetected.length > 0) {\n return {\n agents: relevantDetected,\n source: \"detected\",\n };\n }\n\n return { agents: [], source: \"none\" };\n })\n );\n};\n\nconst resolveAgentsAsync = (options: {\n configAgents?: string[];\n projectRoot?: string;\n global?: boolean;\n}): Promise<ResolvedAgentsResult> => Effect.runPromise(resolveAgents(options));\n\nconst getAgentById = (id: AgentId): AgentConfig | undefined =>\n AGENTS.find((a) => a.id === id);\n\nconst getAllAgentIds = (): AgentId[] => AGENTS.map((a) => a.id);\n\nconst detectAgentsAsync = (projectRoot?: string): Promise<DetectedAgent[]> =>\n Effect.runPromise(detectAgents(projectRoot));\n\nconst directoryExistsAsync = (path: string): Promise<boolean> =>\n Effect.runPromise(directoryExists(path));\n\nconst resolveInstallPath = (\n agent: AgentConfig,\n options: { global?: boolean; projectRoot?: string }\n): string | undefined => {\n if (options.global) {\n return agent.globalPath || undefined;\n }\n if (!agent.projectPath) {\n return undefined;\n }\n const cwd = options.projectRoot ?? process.cwd();\n return join(cwd, agent.projectPath);\n};\n\nconst resolveAgentsInstallPath = (\n agent: AgentConfig,\n options: { global?: boolean; projectRoot?: string }\n): string | undefined => {\n if (options.global) {\n return agent.agentsGlobalPath;\n }\n if (!agent.agentsProjectPath) {\n return undefined;\n }\n const cwd = options.projectRoot ?? process.cwd();\n return join(cwd, agent.agentsProjectPath);\n};\n\nconst resolveRulesInstallPath = (\n agent: AgentConfig,\n options: { global?: boolean; projectRoot?: string }\n): string | undefined => {\n if (options.global) {\n return agent.rulesGlobalPath;\n }\n if (!agent.rulesProjectPath) {\n return undefined;\n }\n const cwd = options.projectRoot ?? process.cwd();\n return join(cwd, agent.rulesProjectPath);\n};\n\nconst hasMcpConfig = (agent: AgentConfig): boolean =>\n Boolean(agent.mcpProjectConfigPath) || Boolean(agent.mcpGlobalConfigPath);\n\nconst MCP_PACKAGE_SPEC = \"@braid-cloud/mcp@0.1.13\";\n\nconst resolveMcpConfigPath = (\n agent: AgentConfig,\n options: { global?: boolean; projectRoot?: string }\n): string | undefined => {\n if (options.global) {\n return agent.mcpGlobalConfigPath;\n }\n if (agent.mcpProjectConfigPath) {\n const cwd = options.projectRoot ?? process.cwd();\n return join(cwd, agent.mcpProjectConfigPath);\n }\n return agent.mcpGlobalConfigPath;\n};\n\nconst buildMcpEntry = (\n style: McpEntryStyle,\n env: Record<string, string>\n): Record<string, unknown> => {\n const command = \"npx\";\n const args = [\"-y\", MCP_PACKAGE_SPEC];\n const envObj = Object.keys(env).length > 0 ? env : undefined;\n\n switch (style) {\n case \"standard\":\n return envObj ? { command, args, env: envObj } : { command, args };\n case \"typed-stdio\":\n return envObj\n ? { type: \"stdio\", command, args, env: envObj }\n : { type: \"stdio\", command, args };\n case \"zed\":\n return envObj\n ? { command: { path: command, args, env: envObj } }\n : { command: { path: command, args } };\n case \"cline\":\n return envObj\n ? { command, args, env: envObj, disabled: false }\n : { command, args, disabled: false };\n default:\n return envObj ? { command, args, env: envObj } : { command, args };\n }\n};\n\nconst detectMcpAgents = (projectRoot?: string): Promise<DetectedAgent[]> =>\n Effect.runPromise(\n pipe(\n detectAgents(projectRoot),\n Effect.map((detected) => detected.filter(hasMcpConfig))\n )\n );\n\nexport type {\n AgentConfig,\n AgentId,\n DetectedAgent,\n InstalledAgent,\n McpEntryStyle,\n ResolvedAgentsResult,\n RuleFormat,\n};\nexport {\n AGENTS,\n buildMcpEntry,\n MCP_PACKAGE_SPEC,\n detectAgents,\n detectAgentsAsync,\n detectInstalledAgents,\n detectInstalledAgentsAsync,\n detectMcpAgents,\n directoryExists,\n directoryExistsAsync,\n getAgentById,\n getAllAgentIds,\n hasMcpConfig,\n resolveAgentsInstallPath,\n resolveAgents,\n resolveAgentsAsync,\n resolveInstallPath,\n resolveMcpConfigPath,\n resolveRulesInstallPath,\n};\n","import process from \"node:process\";\nimport { validateApiKeyAsync } from \"../lib/api.ts\";\nimport type { MergedConfig } from \"../lib/config.ts\";\nimport {\n CONFIG_FILE,\n findProjectConfigFileAsync,\n findUserConfigFileAsync,\n getServerUrlAsync,\n loadMergedConfigAsync,\n loadUserConfigAsync,\n saveUserConfigAsync,\n setApiKeyAsync,\n USER_CONFIG_FILENAME,\n} from \"../lib/config.ts\";\nimport {\n DeviceAuthDeniedError,\n DeviceAuthExpiredError,\n DeviceAuthTimeoutError,\n fetchAuthConfig,\n fetchSessionInfo,\n getDeviceInfo,\n initiateDeviceAuth,\n openBrowser,\n pollForSession,\n revokeSession,\n} from \"../lib/device-auth.ts\";\nimport { confirm, intro, isCancel, log, outro, spinner } from \"../lib/tui.ts\";\n\nconst SESSION_TOKEN_PREFIX = \"brs_\";\nconst TRAILING_SLASHES = /\\/+$/;\n\ninterface AuthOptions {\n server?: string;\n token?: string;\n scope?: boolean;\n timeout?: string;\n}\n\nconst DEFAULT_TIMEOUT_SECONDS = 300;\n\nasync function configureDefaultScopeAsync(serverUrl: string): Promise<void> {\n const shouldConfigureScope = await confirm({\n message: \"Configure organization and scope defaults now?\",\n initialValue: true,\n });\n\n if (isCancel(shouldConfigureScope) || !shouldConfigureScope) {\n return;\n }\n\n const { scopeCommand } = await import(\"./scope.ts\");\n const config = await loadMergedConfigAsync();\n await scopeCommand({\n file: \"user\",\n server: serverUrl,\n ...(config.token ? { apiKey: config.token } : {}),\n });\n}\n\nasync function manualTokenFlow(\n apiKey: string,\n serverUrl: string,\n options: AuthOptions\n): Promise<void> {\n const authSpinner = spinner();\n let authSpinnerActive = true;\n const stopAuthSpinner = (message: string): void => {\n if (!authSpinnerActive) {\n return;\n }\n authSpinner.stop(message);\n authSpinnerActive = false;\n };\n\n authSpinner.start(\"Validating API key...\");\n\n try {\n const isValid = await validateApiKeyAsync(apiKey, serverUrl);\n\n if (!isValid) {\n stopAuthSpinner(\"Invalid API key\");\n log.error(\n \"The API key could not be validated. Please check your key and try again.\"\n );\n process.exit(1);\n }\n\n await setApiKeyAsync(apiKey);\n\n const existingUserConfig = await loadUserConfigAsync();\n if (existingUserConfig?.token) {\n await saveUserConfigAsync({ ...existingUserConfig, token: apiKey });\n }\n\n stopAuthSpinner(\"API key validated and saved\");\n\n if (options.scope !== false) {\n await configureDefaultScopeAsync(serverUrl);\n }\n\n log.success(`Config saved to ${CONFIG_FILE}`);\n outro(\n \"You're authenticated! Run 'braid install' to use your saved scope (or pass '--profile <name>' to override).\"\n );\n } catch (error) {\n stopAuthSpinner(\"Validation failed\");\n const message = error instanceof Error ? error.message : String(error);\n log.error(`Failed to validate API key: ${message}`);\n process.exit(1);\n }\n}\n\nfunction handlePollingError(error: unknown): never {\n if (error instanceof DeviceAuthTimeoutError) {\n log.error(\"The device authorization timed out. Please try again.\");\n } else if (error instanceof DeviceAuthExpiredError) {\n log.error(\"The device code has expired. Please try again.\");\n } else if (error instanceof DeviceAuthDeniedError) {\n log.error(\"The authorization request was denied.\");\n } else {\n const message = error instanceof Error ? error.message : String(error);\n log.error(`Authentication failed: ${message}`);\n }\n process.exit(1);\n}\n\nasync function deviceFlow(\n serverUrl: string,\n timeoutSeconds: number,\n options: AuthOptions\n): Promise<void> {\n const configSpinner = spinner();\n configSpinner.start(\"Fetching auth configuration...\");\n\n let authConfig: Awaited<ReturnType<typeof fetchAuthConfig>>;\n try {\n authConfig = await fetchAuthConfig(serverUrl);\n configSpinner.stop(\"Auth configuration loaded\");\n } catch (error) {\n configSpinner.stop(\"Failed to fetch auth configuration\");\n const message = error instanceof Error ? error.message : String(error);\n log.error(`Could not connect to server: ${message}`);\n process.exit(1);\n }\n\n const deviceSpinner = spinner();\n deviceSpinner.start(\"Initiating device authorization...\");\n\n let deviceAuth: Awaited<ReturnType<typeof initiateDeviceAuth>>;\n try {\n deviceAuth = await initiateDeviceAuth(\n authConfig.convexSiteUrl,\n getDeviceInfo()\n );\n deviceSpinner.stop(\"Device authorization initiated\");\n } catch (error) {\n deviceSpinner.stop(\"Failed to initiate device authorization\");\n const message = error instanceof Error ? error.message : String(error);\n log.error(`Device authorization failed: ${message}`);\n process.exit(1);\n }\n\n const verificationUrl = `${serverUrl.replace(TRAILING_SLASHES, \"\")}/cli/authorize?user_code=${deviceAuth.user_code}`;\n\n log.info(\"\");\n log.info(\" To authenticate, visit:\");\n log.info(` ${verificationUrl}`);\n log.info(\"\");\n log.info(` Your code: ${deviceAuth.user_code}`);\n log.info(\"\");\n\n openBrowser(verificationUrl);\n\n const expiresMinutes = Math.ceil(\n Math.min(deviceAuth.expires_in, timeoutSeconds) / 60\n );\n const pollSpinner = spinner();\n pollSpinner.start(\n `Waiting for authentication... (expires in ${expiresMinutes} minutes)`\n );\n\n let session: Awaited<ReturnType<typeof pollForSession>>;\n try {\n session = await pollForSession(\n authConfig.convexSiteUrl,\n deviceAuth.device_code,\n deviceAuth.interval,\n deviceAuth.expires_in,\n timeoutSeconds\n );\n pollSpinner.stop(`Authenticated as ${session.user.email}`);\n } catch (error) {\n pollSpinner.stop(\"Authentication failed\");\n handlePollingError(error);\n }\n\n await setApiKeyAsync(session.sessionToken);\n\n if (options.scope !== false) {\n await configureDefaultScopeAsync(authConfig.convexSiteUrl);\n }\n\n log.success(`Session saved to ${CONFIG_FILE}`);\n outro(\n \"You're authenticated! Run 'braid install' to use your saved scope (or pass '--profile <name>' to override).\"\n );\n}\n\nexport async function authCommand(options: AuthOptions): Promise<void> {\n intro(\"braid auth\");\n\n const serverUrl = options.server ?? \"https://braid.cloud\";\n\n const config = await loadMergedConfigAsync();\n if (config.token) {\n const shouldReplace = await confirm({\n message: \"An API key is already configured. Replace it?\",\n initialValue: false,\n });\n\n if (isCancel(shouldReplace) || !shouldReplace) {\n outro(\"Auth cancelled.\");\n return;\n }\n }\n\n if (options.token) {\n await manualTokenFlow(options.token, serverUrl, options);\n return;\n }\n\n const timeoutSeconds = options.timeout\n ? Number.parseInt(options.timeout, 10)\n : DEFAULT_TIMEOUT_SECONDS;\n\n if (Number.isNaN(timeoutSeconds) || timeoutSeconds <= 0) {\n log.error(\"Invalid timeout value. Must be a positive number of seconds.\");\n process.exit(1);\n }\n\n await deviceFlow(serverUrl, timeoutSeconds, options);\n}\n\nasync function displayTokenSource(masked: string): Promise<void> {\n if (process.env.BRAID_API_KEY) {\n log.info(`Authenticated with key: ${masked}`);\n log.info(\"Source: BRAID_API_KEY environment variable\");\n return;\n }\n\n const userConfigPath = await findUserConfigFileAsync();\n log.info(`Authenticated with key: ${masked}`);\n log.info(`Source: ${userConfigPath ?? CONFIG_FILE}`);\n}\n\nasync function displayProjectConfig(): Promise<void> {\n const projectConfigPath = await findProjectConfigFileAsync();\n if (projectConfigPath) {\n log.info(`Project config: ${projectConfigPath}`);\n }\n}\n\nfunction displayResolvedSettings(config: MergedConfig): void {\n const hasOrgProjects = config.orgProjects && config.orgProjects.length > 0;\n const hasPersonalProjects =\n config.personalProjects && config.personalProjects.length > 0;\n\n if (!(config.profile || hasOrgProjects || hasPersonalProjects)) {\n return;\n }\n\n log.info(\"\");\n\n if (config.profile) {\n log.info(`Default profile: ${config.profile}`);\n }\n if (hasOrgProjects) {\n log.info(`Org projects: ${config.orgProjects?.join(\", \")}`);\n }\n if (hasPersonalProjects) {\n log.info(`Personal projects: ${config.personalProjects?.join(\", \")}`);\n }\n if (config.serverUrl !== \"https://braid.cloud\") {\n log.info(`Server: ${config.serverUrl}`);\n }\n}\n\nasync function displaySessionInfo(token: string): Promise<void> {\n const serverUrl = await getServerUrlAsync();\n try {\n const authConfig = await fetchAuthConfig(serverUrl);\n const info = await fetchSessionInfo(authConfig.convexSiteUrl, token);\n\n if (!info) {\n log.warn(\n \"Session is expired or revoked. Run 'braid auth' to re-authenticate.\"\n );\n return;\n }\n\n log.info(\n `Authenticated as: ${info.email}${info.name ? ` (${info.name})` : \"\"}`\n );\n log.info(\"Session type: CLI session\");\n\n if (info.deviceName || info.deviceHostname) {\n log.info(\n `Device: ${info.deviceName ?? info.deviceHostname ?? \"unknown\"}`\n );\n }\n\n const expiresDate = new Date(info.expiresAt);\n const daysRemaining = Math.ceil(\n (info.expiresAt - Date.now()) / (24 * 60 * 60 * 1000)\n );\n log.info(\n `Expires: ${expiresDate.toLocaleDateString()} (${daysRemaining} days)`\n );\n\n if (info.lastActiveAt) {\n log.info(`Last active: ${new Date(info.lastActiveAt).toLocaleString()}`);\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n log.warn(`Could not fetch session details: ${message}`);\n const masked = `${token.slice(0, 7)}...${token.slice(-4)}`;\n log.info(`Session token: ${masked}`);\n }\n}\n\nexport async function authStatusCommand(): Promise<void> {\n const config = await loadMergedConfigAsync();\n\n if (!config.token) {\n log.warn(\"Not authenticated. Run 'braid auth' to configure your API key.\");\n log.info(\n `Or create a ${USER_CONFIG_FILENAME} file with: { \"token\": \"br_xxx\" }`\n );\n return;\n }\n\n if (config.token.startsWith(SESSION_TOKEN_PREFIX)) {\n await displaySessionInfo(config.token);\n await displayProjectConfig();\n displayResolvedSettings(config);\n return;\n }\n\n const masked = `${config.token.slice(0, 7)}...${config.token.slice(-4)}`;\n\n await displayTokenSource(masked);\n await displayProjectConfig();\n displayResolvedSettings(config);\n}\n\nasync function revokeSessionIfActive(token: string): Promise<void> {\n const serverUrl = await getServerUrlAsync();\n try {\n const authConfig = await fetchAuthConfig(serverUrl);\n await revokeSession(authConfig.convexSiteUrl, token);\n } catch {\n return;\n }\n}\n\nexport async function authLogoutCommand(): Promise<void> {\n const config = await loadMergedConfigAsync();\n const { clearApiKeyAsync } = await import(\"../lib/config.ts\");\n\n if (config.token?.startsWith(SESSION_TOKEN_PREFIX)) {\n await revokeSessionIfActive(config.token);\n }\n\n await clearApiKeyAsync();\n log.success(\"Logged out. API key removed from config.\");\n}\n","import { execFile } from \"node:child_process\";\nimport { hostname, platform } from \"node:os\";\n\nconst TRAILING_SLASHES = /\\/+$/;\n\nexport class DeviceAuthTimeoutError extends Error {\n constructor() {\n super(\"Device authorization timed out\");\n this.name = \"DeviceAuthTimeoutError\";\n }\n}\n\nexport class DeviceAuthDeniedError extends Error {\n constructor() {\n super(\"Device authorization was denied\");\n this.name = \"DeviceAuthDeniedError\";\n }\n}\n\nexport class DeviceAuthExpiredError extends Error {\n constructor() {\n super(\"Device authorization code has expired\");\n this.name = \"DeviceAuthExpiredError\";\n }\n}\n\ninterface AuthConfig {\n clientId: string;\n convexSiteUrl: string;\n}\n\ninterface DeviceAuthResponse {\n device_code: string;\n user_code: string;\n expires_in: number;\n interval: number;\n}\n\nexport interface SessionResponse {\n sessionToken: string;\n expiresAt: number;\n user: {\n id: string;\n email: string;\n name?: string;\n };\n}\n\nexport interface DeviceInfo {\n deviceName: string;\n deviceOs: string;\n deviceHostname: string;\n}\n\nconst sleep = (ms: number): Promise<void> =>\n new Promise((resolve) => setTimeout(resolve, ms));\n\nexport async function fetchAuthConfig(serverUrl: string): Promise<AuthConfig> {\n const url = `${serverUrl.replace(TRAILING_SLASHES, \"\")}/api/cli/auth-config`;\n const response = await fetch(url);\n\n if (!response.ok) {\n const body = await response.text();\n throw new Error(\n `Failed to fetch auth config (${response.status}): ${body}`\n );\n }\n\n return response.json() as Promise<AuthConfig>;\n}\n\nexport async function initiateDeviceAuth(\n convexSiteUrl: string,\n deviceInfo: DeviceInfo\n): Promise<DeviceAuthResponse> {\n const url = `${convexSiteUrl.replace(TRAILING_SLASHES, \"\")}/api/cli/device/authorize`;\n const response = await fetch(url, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(deviceInfo),\n });\n\n if (!response.ok) {\n const body = await response.text();\n throw new Error(\n `Failed to initiate device authorization (${response.status}): ${body}`\n );\n }\n\n return response.json() as Promise<DeviceAuthResponse>;\n}\n\nexport async function pollForSession(\n convexSiteUrl: string,\n deviceCode: string,\n interval: number,\n expiresIn: number,\n timeoutSeconds: number\n): Promise<SessionResponse> {\n const tokenUrl = `${convexSiteUrl.replace(TRAILING_SLASHES, \"\")}/api/cli/device/token`;\n const deadline = Date.now() + Math.min(expiresIn, timeoutSeconds) * 1000;\n let currentInterval = interval;\n\n while (Date.now() < deadline) {\n await sleep(currentInterval * 1000);\n\n const response = await fetch(tokenUrl, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ device_code: deviceCode }),\n });\n\n if (response.ok) {\n const result = (await response.json()) as {\n session_token: string;\n expires_at: number;\n user: { id: string; email: string; name?: string };\n };\n return {\n sessionToken: result.session_token,\n expiresAt: result.expires_at,\n user: result.user,\n };\n }\n\n let errorCode: string | undefined;\n try {\n const errorBody = (await response.json()) as { error?: string };\n errorCode = errorBody.error;\n } catch {\n throw new Error(`Device auth polling error: HTTP ${response.status}`);\n }\n\n if (errorCode === \"authorization_pending\") {\n continue;\n }\n if (errorCode === \"slow_down\") {\n currentInterval += 5;\n continue;\n }\n if (errorCode === \"expired_token\") {\n throw new DeviceAuthExpiredError();\n }\n if (errorCode === \"access_denied\") {\n throw new DeviceAuthDeniedError();\n }\n\n throw new Error(\n `Device auth polling error: ${errorCode ?? `HTTP ${response.status}`}`\n );\n }\n\n throw new DeviceAuthTimeoutError();\n}\n\nexport interface SessionInfoResponse {\n email: string;\n name: string | undefined;\n deviceName: string | undefined;\n deviceOs: string | undefined;\n deviceHostname: string | undefined;\n expiresAt: number;\n createdAt: number;\n lastActiveAt: number | undefined;\n}\n\nexport async function fetchSessionInfo(\n convexSiteUrl: string,\n sessionToken: string\n): Promise<SessionInfoResponse | null> {\n const url = `${convexSiteUrl.replace(TRAILING_SLASHES, \"\")}/api/cli/sessions/me`;\n const response = await fetch(url, {\n method: \"GET\",\n headers: {\n Authorization: `Bearer ${sessionToken}`,\n },\n });\n\n if (response.status === 404) {\n return null;\n }\n\n if (!response.ok) {\n const body = await response.text();\n throw new Error(\n `Failed to fetch session info (${response.status}): ${body}`\n );\n }\n\n return response.json() as Promise<SessionInfoResponse>;\n}\n\nexport async function revokeSession(\n convexSiteUrl: string,\n sessionToken: string\n): Promise<boolean> {\n const url = `${convexSiteUrl.replace(TRAILING_SLASHES, \"\")}/api/cli/sessions/me`;\n const response = await fetch(url, {\n method: \"DELETE\",\n headers: {\n Authorization: `Bearer ${sessionToken}`,\n },\n });\n\n if (response.status === 404) {\n return false;\n }\n\n if (!response.ok) {\n const body = await response.text();\n throw new Error(`Failed to revoke session (${response.status}): ${body}`);\n }\n\n return true;\n}\n\nconst noop = (): void => {\n /* intentionally empty — fire and forget */\n};\n\nexport function openBrowser(url: string): void {\n const currentPlatform = platform();\n\n if (currentPlatform === \"darwin\") {\n execFile(\"open\", [url], noop);\n } else if (currentPlatform === \"win32\") {\n execFile(\"cmd\", [\"/c\", \"start\", \"\", url], noop);\n } else {\n execFile(\"xdg-open\", [url], noop);\n }\n}\n\nexport function getDeviceInfo(): DeviceInfo {\n return {\n deviceName: hostname(),\n deviceOs: platform(),\n deviceHostname: hostname(),\n };\n}\n","import process from \"node:process\";\nimport {\n fetchRuleOptionsAsync,\n fetchScopeOptionsAsync,\n fetchSkillsAsync,\n} from \"../lib/api.ts\";\nimport { loadMergedConfigAsync } from \"../lib/config.ts\";\nimport { log } from \"../lib/tui.ts\";\n\ninterface ProjectsListOptions {\n server?: string;\n apiKey?: string;\n json?: boolean;\n}\n\ninterface RulesListOptions {\n server?: string;\n apiKey?: string;\n orgId?: string;\n orgProjects?: string;\n personalProjects?: string;\n includeUserGlobal?: boolean;\n includeOrgGlobal?: boolean;\n json?: boolean;\n}\n\ninterface SkillsListOptions {\n server?: string;\n apiKey?: string;\n profile?: string;\n orgProjects?: string;\n personalProjects?: string;\n includeUserGlobal?: boolean;\n includeOrgGlobal?: boolean;\n json?: boolean;\n}\n\nconst parseCsv = (input?: string): string[] | undefined => {\n if (!input) {\n return undefined;\n }\n const values = input\n .split(\",\")\n .map((value) => value.trim())\n .filter((value) => value.length > 0);\n return values.length > 0 ? values : undefined;\n};\n\nconst writeJson = (value: unknown): void => {\n process.stdout.write(`${JSON.stringify(value, null, 2)}\\n`);\n};\n\nconst exitWithError = (error: unknown): never => {\n const message = error instanceof Error ? error.message : String(error);\n log.error(message);\n process.exit(1);\n};\n\nconst applyCommonOptions = <T extends Record<string, unknown>>(\n base: T,\n options: { server?: string; apiKey?: string }\n): T & Record<string, unknown> => ({\n ...base,\n ...(options.server ? { serverUrl: options.server } : {}),\n ...(options.apiKey ? { apiKey: options.apiKey } : {}),\n});\n\nconst applyOptionalString = (\n target: Record<string, unknown>,\n key: string,\n value: string | undefined\n): void => {\n if (value) {\n target[key] = value;\n }\n};\n\nconst applyOptionalArray = (\n target: Record<string, unknown>,\n key: string,\n value: string[] | undefined\n): void => {\n if (value && value.length > 0) {\n target[key] = value;\n }\n};\n\nconst applyOptionalBoolean = (\n target: Record<string, unknown>,\n key: string,\n value: boolean | undefined\n): void => {\n if (value !== undefined) {\n target[key] = value;\n }\n};\n\nexport async function projectsListCommand(\n options: ProjectsListOptions\n): Promise<void> {\n try {\n const result = await fetchScopeOptionsAsync(\n applyCommonOptions({}, options)\n );\n\n if (options.json) {\n writeJson(result);\n return;\n }\n\n log.info(\"Personal projects:\");\n if (result.personalProjects.length === 0) {\n log.info(\" (none)\");\n }\n for (const project of result.personalProjects) {\n log.info(` ${project.id} ${project.name}`);\n }\n\n for (const orgProjects of result.orgProjects) {\n log.info(`\\nOrganization: ${orgProjects.orgName} (${orgProjects.orgId})`);\n if (orgProjects.projects.length === 0) {\n log.info(\" (none)\");\n continue;\n }\n for (const project of orgProjects.projects) {\n log.info(` ${project.id} ${project.name}`);\n }\n }\n } catch (error) {\n exitWithError(error);\n }\n}\n\nconst buildRulesRequest = async (\n options: RulesListOptions\n): Promise<Record<string, unknown>> => {\n const config = await loadMergedConfigAsync();\n const orgProjects = parseCsv(options.orgProjects) ?? config.orgProjects;\n const personalProjects =\n parseCsv(options.personalProjects) ?? config.personalProjects;\n const request = applyCommonOptions({}, options);\n\n applyOptionalString(request, \"orgId\", options.orgId ?? config.org);\n applyOptionalArray(request, \"orgProjects\", orgProjects);\n applyOptionalArray(request, \"personalProjects\", personalProjects);\n applyOptionalBoolean(request, \"includeUserGlobal\", options.includeUserGlobal);\n applyOptionalBoolean(request, \"includeOrgGlobal\", options.includeOrgGlobal);\n\n return request;\n};\n\nexport async function rulesListCommand(\n options: RulesListOptions\n): Promise<void> {\n try {\n const result = await fetchRuleOptionsAsync(\n await buildRulesRequest(options)\n );\n\n if (options.json) {\n writeJson(result);\n return;\n }\n\n if (result.rules.length === 0) {\n log.info(\"No rules found.\");\n return;\n }\n\n for (const rule of result.rules) {\n log.info(`${rule.id} ${rule.title}`);\n }\n } catch (error) {\n exitWithError(error);\n }\n}\n\nconst buildSkillsRequest = async (\n options: SkillsListOptions\n): Promise<Record<string, unknown>> => {\n const config = await loadMergedConfigAsync();\n const orgProjects = parseCsv(options.orgProjects) ?? config.orgProjects;\n const personalProjects =\n parseCsv(options.personalProjects) ?? config.personalProjects;\n const request = applyCommonOptions({}, options);\n\n applyOptionalString(request, \"profile\", options.profile ?? config.profile);\n applyOptionalArray(request, \"orgProjects\", orgProjects);\n applyOptionalArray(request, \"personalProjects\", personalProjects);\n applyOptionalBoolean(request, \"includeUserGlobal\", options.includeUserGlobal);\n applyOptionalBoolean(request, \"includeOrgGlobal\", options.includeOrgGlobal);\n\n return request;\n};\n\nexport async function skillsListCommand(\n options: SkillsListOptions\n): Promise<void> {\n try {\n const result = await fetchSkillsAsync(await buildSkillsRequest(options));\n\n if (options.json) {\n writeJson(result);\n return;\n }\n\n if (result.skills.length === 0) {\n log.info(\"No skills found.\");\n return;\n }\n\n for (const skill of result.skills) {\n log.info(`${skill.name}`);\n }\n } catch (error) {\n exitWithError(error);\n }\n}\n","import type { AgentId, DetectedAgent } from \"../lib/agents.ts\";\nimport {\n AGENTS,\n detectAgentsAsync,\n getAgentById,\n resolveInstallPath,\n resolveRulesInstallPath,\n} from \"../lib/agents.ts\";\nimport type {\n FetchSkillsOptions,\n PublicMetadataResponse,\n SkillsExportResponse,\n} from \"../lib/api.ts\";\nimport {\n fetchPublicExportAsync,\n fetchPublicMetadataAsync,\n fetchSkillsAsync,\n} from \"../lib/api.ts\";\nimport type { MergedConfig } from \"../lib/config.ts\";\nimport { loadMergedConfigAsync } from \"../lib/config.ts\";\nimport { updateMetadataAsync } from \"../lib/metadata.ts\";\nimport { writeRulesForAgentAsync } from \"../lib/rule-writer.ts\";\nimport { writeSkillsAsync } from \"../lib/skill-writer.ts\";\nimport {\n cancel,\n confirm,\n intro,\n isCancel,\n log,\n multiselect,\n outro,\n spinner,\n} from \"../lib/tui.ts\";\n\ninterface InstallOptions {\n profile?: string;\n orgProjects?: string;\n personalProjects?: string;\n includeUserGlobals?: boolean;\n includeOrgGlobals?: boolean;\n agents?: string;\n global?: boolean;\n yes?: boolean;\n list?: boolean;\n server?: string;\n}\n\ninterface ResolvedInstallConfig {\n profile: string | undefined;\n serverUrl: string;\n includeUserGlobal: boolean;\n includeOrgGlobal: boolean;\n orgProjects: string[] | undefined;\n personalProjects: string[] | undefined;\n ruleIds: string[] | undefined;\n excludedRuleIds: string[] | undefined;\n resolveOverlays: boolean | undefined;\n}\n\ninterface AgentResolution {\n availableAgents: DetectedAgent[];\n preselectedAgents: DetectedAgent[];\n}\n\nfunction resolveInstallConfig(\n options: InstallOptions,\n config: MergedConfig\n): ResolvedInstallConfig {\n const orgProjectsFromFlag = options.orgProjects\n ? options.orgProjects.split(\",\").map((s) => s.trim())\n : undefined;\n const personalProjectsFromFlag = options.personalProjects\n ? options.personalProjects.split(\",\").map((s) => s.trim())\n : undefined;\n\n return {\n profile: options.profile ?? config.profile,\n serverUrl: options.server ?? config.serverUrl,\n includeUserGlobal: options.includeUserGlobals ?? config.includeUserGlobal,\n includeOrgGlobal: options.includeOrgGlobals ?? config.includeOrgGlobal,\n orgProjects: orgProjectsFromFlag ?? config.orgProjects,\n personalProjects: personalProjectsFromFlag ?? config.personalProjects,\n ruleIds: config.ruleIds,\n excludedRuleIds: config.excludedRuleIds,\n resolveOverlays: config.resolveOverlays,\n };\n}\n\nfunction validateInstallOptions(resolved: ResolvedInstallConfig): void {\n const { profile, orgProjects, personalProjects } = resolved;\n const hasOrgProjects = orgProjects && orgProjects.length > 0;\n const hasPersonalProjects = personalProjects && personalProjects.length > 0;\n\n if (!(profile || hasOrgProjects || hasPersonalProjects)) {\n log.error(\"No profile or project(s) specified.\");\n log.info(\"Either:\");\n log.info(\n \" - Add 'profile', 'orgProjects', or 'personalProjects' to braid.json/braid.user.json\"\n );\n log.info(\" - Use --profile, --org-projects, or --personal-projects flags\");\n log.info(\"\");\n log.info(\"Examples:\");\n log.info(\" braid install --profile coding-standards\");\n log.info(\" braid install --org-projects proj123,proj456\");\n log.info(\" braid install --personal-projects myproj1\");\n process.exit(1);\n }\n}\n\nfunction buildSourceDescription(resolved: ResolvedInstallConfig): string {\n const { profile, orgProjects, personalProjects } = resolved;\n\n if (profile) {\n return `profile '${profile}'`;\n }\n\n const hasOrgProjects = orgProjects && orgProjects.length > 0;\n const hasPersonalProjects = personalProjects && personalProjects.length > 0;\n\n if (hasOrgProjects || hasPersonalProjects) {\n const totalProjects =\n (orgProjects?.length ?? 0) + (personalProjects?.length ?? 0);\n return totalProjects === 1\n ? `project ${orgProjects?.[0] ?? personalProjects?.[0]}`\n : `${totalProjects} projects`;\n }\n\n return \"unknown source\";\n}\n\nfunction buildFetchOptions(\n resolved: ResolvedInstallConfig\n): FetchSkillsOptions {\n const fetchOptions: FetchSkillsOptions = {\n serverUrl: resolved.serverUrl,\n includeUserGlobal: resolved.includeUserGlobal,\n includeOrgGlobal: resolved.includeOrgGlobal,\n };\n\n if (resolved.profile) {\n fetchOptions.profile = resolved.profile;\n }\n if (resolved.orgProjects && resolved.orgProjects.length > 0) {\n fetchOptions.orgProjects = resolved.orgProjects;\n }\n if (resolved.personalProjects && resolved.personalProjects.length > 0) {\n fetchOptions.personalProjects = resolved.personalProjects;\n }\n if (resolved.ruleIds && resolved.ruleIds.length > 0) {\n fetchOptions.ruleIds = resolved.ruleIds;\n }\n if (resolved.excludedRuleIds && resolved.excludedRuleIds.length > 0) {\n fetchOptions.excludedRuleIds = resolved.excludedRuleIds;\n }\n if (resolved.resolveOverlays !== undefined) {\n fetchOptions.resolveOverlays = resolved.resolveOverlays;\n }\n\n return fetchOptions;\n}\n\nfunction displaySkillsAndExit(skills: SkillsExportResponse[\"skills\"]): never {\n log.info(\"\\nSkills:\");\n for (const skill of skills) {\n const fileCount = skill.files.length;\n log.info(\n ` ${skill.name} (${fileCount} file${fileCount !== 1 ? \"s\" : \"\"})`\n );\n }\n process.exit(0);\n}\n\nfunction getSelectableAgents(options: InstallOptions): DetectedAgent[] {\n return AGENTS.filter((agent) =>\n options.global ? Boolean(agent.globalPath) : Boolean(agent.projectPath)\n ).map(\n (agent) =>\n ({\n ...agent,\n hasProjectConfig: false,\n hasGlobalConfig: false,\n }) as DetectedAgent\n );\n}\n\nasync function resolveAgents(\n options: InstallOptions,\n installSpinner: ReturnType<typeof spinner>\n): Promise<AgentResolution> {\n if (options.agents) {\n const agentIds = options.agents.split(\",\").map((s) => s.trim() as AgentId);\n const selectedAgents = agentIds\n .map((id) => {\n const agentConfig = getAgentById(id);\n if (!agentConfig) {\n log.warn(`Unknown agent: ${id}`);\n return null;\n }\n return {\n ...agentConfig,\n hasProjectConfig: true,\n hasGlobalConfig: true,\n } as DetectedAgent;\n })\n .filter((a): a is DetectedAgent => a !== null);\n\n if (selectedAgents.length === 0) {\n log.error(\"No valid agents specified.\");\n process.exit(1);\n }\n\n return {\n availableAgents: selectedAgents,\n preselectedAgents: selectedAgents,\n };\n }\n\n installSpinner.start(\"Detecting installed agents...\");\n const allDetectedAgents = await detectAgentsAsync();\n\n const detectedAgents = allDetectedAgents.filter((agent) =>\n options.global ? agent.hasGlobalConfig : agent.hasProjectConfig\n );\n\n const targetType = options.global ? \"global\" : \"project\";\n installSpinner.stop(\n `Detected ${detectedAgents.length} agent(s) with ${targetType} config`\n );\n\n for (const agent of detectedAgents) {\n const targetPath = options.global ? agent.globalPath : agent.projectPath;\n log.info(` ${agent.name} → ${targetPath}`);\n }\n\n if (detectedAgents.length === 0) {\n log.warn(\"No AI coding agents detected.\");\n log.info(\n \"Supported agents: claude-code, opencode, cursor, windsurf, cline, and more.\"\n );\n log.info(\n \"Select agents manually below. Detected agents are pre-selected when available.\"\n );\n\n return {\n availableAgents: getSelectableAgents(options),\n preselectedAgents: [],\n };\n }\n\n return {\n availableAgents: getSelectableAgents(options),\n preselectedAgents: detectedAgents,\n };\n}\n\nasync function selectAgents(\n availableAgents: DetectedAgent[],\n preselectedAgents: DetectedAgent[],\n options: InstallOptions\n): Promise<DetectedAgent[]> {\n if (options.yes) {\n return preselectedAgents.length > 0 ? preselectedAgents : availableAgents;\n }\n\n const agentChoices = availableAgents.map((agent) => ({\n value: agent,\n label: agent.name,\n ...((\n options.global\n ? agent.globalPath || agent.rulesGlobalPath\n : agent.projectPath || agent.rulesProjectPath\n )\n ? {\n hint: options.global\n ? agent.globalPath || agent.rulesGlobalPath\n : agent.projectPath || agent.rulesProjectPath,\n }\n : {}),\n }));\n\n const selected = await multiselect({\n message: \"Select agents to install to:\",\n options: agentChoices,\n initialValues: preselectedAgents,\n required: true,\n });\n\n if (isCancel(selected)) {\n cancel(\"Install cancelled.\");\n process.exit(0);\n }\n\n return selected;\n}\n\nasync function installSkillsToAgent(\n agent: DetectedAgent,\n response: SkillsExportResponse,\n installPath: string\n): Promise<{ written: number; errors: number }> {\n if (response.skills.length === 0 || !agent.projectPath) {\n return { written: 0, errors: 0 };\n }\n\n const result = await writeSkillsAsync(installPath, response.skills, agent.id);\n\n for (const err of result.errors) {\n log.warn(` Failed skill: ${err.skill} - ${err.error}`);\n }\n\n return { written: result.written.length, errors: result.errors.length };\n}\n\nasync function installRulesToAgent(\n agent: DetectedAgent,\n response: SkillsExportResponse,\n options: InstallOptions\n): Promise<{ written: number; errors: number }> {\n const rules = response.rules ?? [];\n const rulesPath = resolveRulesInstallPath(agent, {\n global: options.global === true,\n });\n\n if (rules.length === 0 || !rulesPath || !agent.ruleFormat) {\n return { written: 0, errors: 0 };\n }\n\n const result = await writeRulesForAgentAsync(agent, rules, rulesPath);\n\n for (const err of result.errors) {\n log.warn(` Failed rules: ${err.agent} - ${err.error}`);\n }\n\n return { written: result.written, errors: result.errors.length };\n}\n\nfunction formatInstallSummary(\n agentName: string,\n skillsWritten: number,\n rulesWritten: number\n): string {\n const parts: string[] = [];\n if (skillsWritten > 0) {\n parts.push(`${skillsWritten} skills`);\n }\n if (rulesWritten > 0) {\n parts.push(`${rulesWritten} rules`);\n }\n return `${agentName}: ${parts.join(\", \")} installed`;\n}\n\nasync function installToAgent(\n agent: DetectedAgent,\n response: SkillsExportResponse,\n serverUrl: string,\n options: InstallOptions,\n installSpinner: ReturnType<typeof spinner>\n): Promise<{ written: number; errors: number }> {\n const installPath = resolveInstallPath(agent, {\n global: options.global === true,\n });\n\n installSpinner.start(`Installing to ${agent.name}...`);\n\n const skills = installPath\n ? await installSkillsToAgent(agent, response, installPath)\n : { written: 0, errors: 0 };\n const rules = await installRulesToAgent(agent, response, options);\n\n const totalWritten = skills.written + rules.written;\n const totalErrors = skills.errors + rules.errors;\n\n if (totalErrors > 0) {\n installSpinner.stop(\n `${agent.name}: ${totalWritten} installed, ${totalErrors} failed`\n );\n } else {\n installSpinner.stop(\n formatInstallSummary(agent.name, skills.written, rules.written)\n );\n }\n\n if (response.skills.length > 0 && installPath) {\n await updateMetadataAsync(\n installPath,\n response.skills.map((s) => ({\n name: s.name,\n source: response.source,\n version: response.version,\n serverUrl,\n }))\n );\n }\n\n return { written: totalWritten, errors: totalErrors };\n}\n\nconst PUBLIC_SOURCE_REGEX = /^@([a-z0-9-]+)\\/([a-z0-9-]+)$/;\n\nfunction parsePublicSource(source: string): {\n handle: string;\n slug: string;\n} | null {\n const match = source.match(PUBLIC_SOURCE_REGEX);\n if (!(match?.[1] && match[2])) {\n return null;\n }\n return { handle: match[1], slug: match[2] };\n}\n\nfunction displayPublicMetadata(metadata: PublicMetadataResponse): void {\n if (metadata.type === \"project\") {\n const { project, rules } = metadata;\n log.info(`\\nProject: ${project.name}`);\n if (project.description) {\n log.info(` ${project.description}`);\n }\n log.info(` ${rules.length} rule(s) available`);\n } else {\n const { rule } = metadata;\n log.info(`\\nRule: ${rule.title}`);\n log.info(` Type: ${rule.type}`);\n if (rule.tags.length > 0) {\n log.info(` Tags: ${rule.tags.join(\", \")}`);\n }\n if (rule.description) {\n log.info(` ${rule.description}`);\n }\n }\n}\n\nasync function selectPublicRules(\n metadata: PublicMetadataResponse,\n options: InstallOptions\n): Promise<string[] | null> {\n if (metadata.type !== \"project\") {\n return null;\n }\n\n if (options.yes) {\n return metadata.rules.map((r) => r.id);\n }\n\n const selected = await multiselect({\n message: \"Select rules to install:\",\n options: metadata.rules.map((r) => ({\n value: r.id,\n label: r.title,\n hint: r.type,\n })),\n initialValues: metadata.rules.map((r) => r.id),\n required: true,\n });\n\n if (isCancel(selected)) {\n cancel(\"Install cancelled.\");\n process.exit(0);\n }\n\n return selected;\n}\n\nasync function confirmRuleInstall(\n metadata: PublicMetadataResponse,\n options: InstallOptions\n): Promise<boolean> {\n if (metadata.type !== \"rule\") {\n return true;\n }\n\n if (options.yes) {\n return true;\n }\n\n const confirmed = await confirm({\n message: `Install \"${metadata.rule.title}\"?`,\n });\n\n if (isCancel(confirmed)) {\n cancel(\"Install cancelled.\");\n process.exit(0);\n }\n\n return confirmed === true;\n}\n\nfunction summarizeContent(response: SkillsExportResponse): string {\n const ruleCount = response.rules?.length ?? 0;\n const skillCount = response.skills.length;\n const parts: string[] = [];\n if (skillCount > 0) {\n parts.push(`${skillCount} skills`);\n }\n if (ruleCount > 0) {\n parts.push(`${ruleCount} rules`);\n }\n return parts.join(\", \") || \"nothing\";\n}\n\nfunction hasNoContent(response: SkillsExportResponse): boolean {\n return response.skills.length === 0 && (response.rules?.length ?? 0) === 0;\n}\n\nasync function installToSelectedAgents(\n response: SkillsExportResponse,\n serverUrl: string,\n options: InstallOptions,\n installSpinner: ReturnType<typeof spinner>\n): Promise<{ totalWritten: number; totalErrors: number }> {\n const agentResolution = await resolveAgents(options, installSpinner);\n const selectedAgents = await selectAgents(\n agentResolution.availableAgents,\n agentResolution.preselectedAgents,\n options\n );\n\n let totalWritten = 0;\n let totalErrors = 0;\n\n for (const agent of selectedAgents) {\n const result = await installToAgent(\n agent,\n response,\n serverUrl,\n options,\n installSpinner\n );\n totalWritten += result.written;\n totalErrors += result.errors;\n }\n\n return { totalWritten, totalErrors };\n}\n\nfunction showInstallOutro(\n totalWritten: number,\n totalErrors: number,\n suffix: string\n): void {\n if (totalErrors > 0) {\n outro(`Installed ${totalWritten} items with ${totalErrors} errors.`);\n } else {\n outro(`Successfully installed ${totalWritten} items${suffix}.`);\n }\n}\n\nasync function fetchPublicContent(\n handle: string,\n slug: string,\n options: InstallOptions,\n installSpinner: ReturnType<typeof spinner>\n): Promise<SkillsExportResponse> {\n const metadata = await fetchPublicMetadataAsync(handle, slug, options.server);\n\n installSpinner.stop(\"Found public content\");\n displayPublicMetadata(metadata);\n\n let ruleIds: string[] | undefined;\n\n if (metadata.type === \"project\") {\n const selected = await selectPublicRules(metadata, options);\n ruleIds = selected ?? undefined;\n } else {\n const confirmed = await confirmRuleInstall(metadata, options);\n if (!confirmed) {\n outro(\"Install cancelled.\");\n process.exit(0);\n }\n }\n\n installSpinner.start(\"Downloading content...\");\n return fetchPublicExportAsync(handle, slug, ruleIds, options.server);\n}\n\nasync function publicInstallCommand(\n source: string,\n options: InstallOptions\n): Promise<void> {\n const parsed = parsePublicSource(source);\n if (!parsed) {\n log.error(`Invalid public source: ${source}`);\n log.info(\"Expected format: @handle/slug (e.g., @acme/coding-standards)\");\n process.exit(1);\n }\n\n const { handle, slug } = parsed;\n intro(`Installing from @${handle}/${slug}`);\n\n const installSpinner = spinner();\n installSpinner.start(\"Fetching public content...\");\n\n try {\n const response = await fetchPublicContent(\n handle,\n slug,\n options,\n installSpinner\n );\n\n installSpinner.stop(`Downloaded ${summarizeContent(response)}`);\n\n if (hasNoContent(response)) {\n log.warn(\"No content to install.\");\n process.exit(0);\n }\n\n const serverUrl = options.server ?? \"https://braid.cloud\";\n const { totalWritten, totalErrors } = await installToSelectedAgents(\n response,\n serverUrl,\n options,\n installSpinner\n );\n\n showInstallOutro(totalWritten, totalErrors, ` from @${handle}/${slug}`);\n } catch (error) {\n installSpinner.stop(\"Install failed\");\n const message = error instanceof Error ? error.message : String(error);\n log.error(message);\n process.exit(1);\n }\n}\n\nexport async function installCommand(\n sourceOrOptions: string | InstallOptions,\n maybeOptions?: InstallOptions\n): Promise<void> {\n if (typeof sourceOrOptions === \"string\") {\n return handlePublicSource(sourceOrOptions, maybeOptions ?? {});\n }\n\n const options = sourceOrOptions;\n const config = await loadMergedConfigAsync();\n const resolved = resolveInstallConfig(options, config);\n\n validateInstallOptions(resolved);\n\n const sourceDesc = buildSourceDescription(resolved);\n intro(`Installing from ${sourceDesc}`);\n\n const installSpinner = spinner();\n installSpinner.start(\"Fetching from braid...\");\n\n try {\n const fetchOptions = buildFetchOptions(resolved);\n const response = await fetchSkillsAsync(fetchOptions);\n\n installSpinner.stop(`Found ${summarizeContent(response)}`);\n\n if (hasNoContent(response)) {\n log.warn(\n \"No skills or rules found. Check that your profile/project has enabled prompts.\"\n );\n process.exit(0);\n }\n\n if (options.list) {\n displaySkillsAndExit(response.skills);\n }\n\n const { totalWritten, totalErrors } = await installToSelectedAgents(\n response,\n resolved.serverUrl,\n options,\n installSpinner\n );\n\n showInstallOutro(totalWritten, totalErrors, ` to ${totalWritten} agent(s)`);\n log.info(\"Run 'braid list' to see installed skills.\");\n } catch (error) {\n installSpinner.stop(\"Install failed\");\n const message = error instanceof Error ? error.message : String(error);\n log.error(message);\n process.exit(1);\n }\n}\n\nfunction handlePublicSource(\n source: string,\n options: InstallOptions\n): Promise<void> {\n const publicParsed = parsePublicSource(source);\n if (publicParsed) {\n return publicInstallCommand(source, options);\n }\n log.error(`Unknown source: ${source}`);\n log.info(\"Public sources use format: @handle/slug\");\n process.exit(1);\n}\n","import { readFile, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { Data, Effect, pipe } from \"effect\";\n\nconst METADATA_FILENAME = \".braidskills-metadata.json\";\n\ninterface InstalledSkill {\n name: string;\n source: {\n type: \"profile\" | \"projects\";\n name: string;\n orgProjects?: string[];\n personalProjects?: string[];\n };\n version: string;\n installedAt: string;\n serverUrl: string;\n}\n\ninterface SkillsMetadata {\n skills: InstalledSkill[];\n}\n\nclass MetadataReadError extends Data.TaggedError(\"MetadataReadError\")<{\n path: string;\n cause: unknown;\n}> {}\n\nclass MetadataWriteError extends Data.TaggedError(\"MetadataWriteError\")<{\n path: string;\n cause: unknown;\n}> {}\n\nconst getMetadataPath = (skillsDir: string): string =>\n join(skillsDir, METADATA_FILENAME);\n\nconst readMetadata = (\n skillsDir: string\n): Effect.Effect<SkillsMetadata, MetadataReadError> => {\n const metadataPath = getMetadataPath(skillsDir);\n\n return pipe(\n Effect.tryPromise({\n try: () => readFile(metadataPath, \"utf-8\"),\n catch: (e) => new MetadataReadError({ path: metadataPath, cause: e }),\n }),\n Effect.flatMap((content) =>\n Effect.try({\n try: () => JSON.parse(content) as SkillsMetadata,\n catch: () => ({ skills: [] }) as SkillsMetadata,\n })\n ),\n Effect.orElseSucceed(() => ({ skills: [] }) as SkillsMetadata)\n );\n};\n\nconst writeMetadata = (\n skillsDir: string,\n metadata: SkillsMetadata\n): Effect.Effect<void, MetadataWriteError> => {\n const metadataPath = getMetadataPath(skillsDir);\n\n return Effect.tryPromise({\n try: () =>\n writeFile(metadataPath, JSON.stringify(metadata, null, 2), \"utf-8\"),\n catch: (e) => new MetadataWriteError({ path: metadataPath, cause: e }),\n });\n};\n\nconst updateMetadata = (\n skillsDir: string,\n newSkills: Array<{\n name: string;\n source: InstalledSkill[\"source\"];\n version: string;\n serverUrl: string;\n }>\n): Effect.Effect<void, MetadataReadError | MetadataWriteError> =>\n pipe(\n readMetadata(skillsDir),\n Effect.map((existing) => {\n const now = new Date().toISOString();\n const updatedSkills = [...existing.skills];\n\n for (const skill of newSkills) {\n const existingIndex = updatedSkills.findIndex(\n (s) => s.name === skill.name\n );\n const newEntry: InstalledSkill = {\n name: skill.name,\n source: skill.source,\n version: skill.version,\n installedAt: now,\n serverUrl: skill.serverUrl,\n };\n\n if (existingIndex >= 0) {\n updatedSkills[existingIndex] = newEntry;\n } else {\n updatedSkills.push(newEntry);\n }\n }\n\n return { skills: updatedSkills };\n }),\n Effect.flatMap((metadata) => writeMetadata(skillsDir, metadata))\n );\n\nconst getOutdatedSkills = (\n skillsDir: string,\n currentVersion: string\n): Effect.Effect<InstalledSkill[], MetadataReadError> =>\n pipe(\n readMetadata(skillsDir),\n Effect.map((metadata) =>\n metadata.skills.filter((s) => s.version !== currentVersion)\n )\n );\n\nconst removeFromMetadata = (\n skillsDir: string,\n skillName: string\n): Effect.Effect<void, MetadataReadError | MetadataWriteError> =>\n pipe(\n readMetadata(skillsDir),\n Effect.map((metadata) => ({\n skills: metadata.skills.filter((s) => s.name !== skillName),\n })),\n Effect.flatMap((metadata) => writeMetadata(skillsDir, metadata))\n );\n\nconst readMetadataAsync = (skillsDir: string): Promise<SkillsMetadata> =>\n Effect.runPromise(readMetadata(skillsDir));\n\nconst writeMetadataAsync = (\n skillsDir: string,\n metadata: SkillsMetadata\n): Promise<void> => Effect.runPromise(writeMetadata(skillsDir, metadata));\n\nconst updateMetadataAsync = (\n skillsDir: string,\n newSkills: Array<{\n name: string;\n source: InstalledSkill[\"source\"];\n version: string;\n serverUrl: string;\n }>\n): Promise<void> => Effect.runPromise(updateMetadata(skillsDir, newSkills));\n\nconst getOutdatedSkillsAsync = (\n skillsDir: string,\n currentVersion: string\n): Promise<InstalledSkill[]> =>\n Effect.runPromise(getOutdatedSkills(skillsDir, currentVersion));\n\nconst removeFromMetadataAsync = (\n skillsDir: string,\n skillName: string\n): Promise<void> => Effect.runPromise(removeFromMetadata(skillsDir, skillName));\n\nexport type { InstalledSkill, SkillsMetadata };\nexport {\n getMetadataPath,\n getOutdatedSkills,\n getOutdatedSkillsAsync,\n METADATA_FILENAME,\n MetadataReadError,\n MetadataWriteError,\n readMetadata,\n readMetadataAsync,\n removeFromMetadata,\n removeFromMetadataAsync,\n updateMetadata,\n updateMetadataAsync,\n writeMetadata,\n writeMetadataAsync,\n};\n","import { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { dirname, resolve, sep } from \"node:path\";\nimport { Data, Effect, pipe } from \"effect\";\nimport type { AgentConfig, RuleFormat } from \"./agents.ts\";\nimport type { ExportedRule } from \"./api.ts\";\n\nclass RuleWriteError extends Data.TaggedError(\"RuleWriteError\")<{\n path: string;\n operation: \"mkdir\" | \"write\" | \"read\";\n cause: unknown;\n}> {}\n\nconst createDirectory = (dir: string): Effect.Effect<void, RuleWriteError> =>\n Effect.tryPromise({\n try: () => mkdir(dir, { recursive: true }),\n catch: (e) =>\n new RuleWriteError({ path: dir, operation: \"mkdir\", cause: e }),\n });\n\nconst writeTextFile = (\n fullPath: string,\n content: string\n): Effect.Effect<void, RuleWriteError> =>\n Effect.tryPromise({\n try: () => writeFile(fullPath, content, \"utf-8\"),\n catch: (e) =>\n new RuleWriteError({ path: fullPath, operation: \"write\", cause: e }),\n });\n\nconst readTextFile = (\n fullPath: string\n): Effect.Effect<string, RuleWriteError> =>\n Effect.tryPromise({\n try: () => readFile(fullPath, \"utf-8\"),\n catch: (e) =>\n new RuleWriteError({ path: fullPath, operation: \"read\", cause: e }),\n });\n\nconst assertRulePathWithinBase = (\n basePath: string,\n ruleName: string\n): Effect.Effect<string, RuleWriteError> => {\n const resolvedBase = resolve(basePath);\n const resolvedFull = resolve(basePath, ruleName);\n if (\n resolvedFull !== resolvedBase &&\n !resolvedFull.startsWith(resolvedBase + sep)\n ) {\n return Effect.fail(\n new RuleWriteError({\n path: ruleName,\n operation: \"write\",\n cause: new Error(\n `Path traversal detected: \"${ruleName}\" resolves outside base directory`\n ),\n })\n );\n }\n return Effect.succeed(resolvedFull);\n};\n\nconst BRAID_SECTION_START = \"<!-- braid:rules:start -->\";\nconst BRAID_SECTION_END = \"<!-- braid:rules:end -->\";\nconst YAML_SPECIAL_CHARS = /[\\n\\r:#{}[\\],&*?|>!'\"%@`]/;\n\nfunction escapeYamlValue(value: string): string {\n if (\n YAML_SPECIAL_CHARS.test(value) ||\n value.startsWith(\" \") ||\n value.endsWith(\" \")\n ) {\n return `\"${value.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, '\\\\\"')}\"`;\n }\n return value;\n}\n\nfunction buildMdcContent(rule: ExportedRule): string {\n const lines: string[] = [\"---\"];\n lines.push(`description: ${escapeYamlValue(rule.title)}`);\n lines.push(\"alwaysApply: true\");\n lines.push(\"---\");\n lines.push(\"\");\n lines.push(`# ${rule.title}`);\n lines.push(\"\");\n lines.push(rule.content);\n return lines.join(\"\\n\");\n}\n\nfunction buildAppendContent(rules: ExportedRule[]): string {\n const lines: string[] = [BRAID_SECTION_START, \"\"];\n\n for (const rule of rules) {\n lines.push(`## ${rule.title}`);\n lines.push(\"\");\n lines.push(rule.content);\n lines.push(\"\");\n }\n\n lines.push(BRAID_SECTION_END);\n return lines.join(\"\\n\");\n}\n\nconst writeMdcRules = (\n basePath: string,\n rules: ExportedRule[]\n): Effect.Effect<void, RuleWriteError> =>\n pipe(\n createDirectory(basePath),\n Effect.flatMap(() =>\n Effect.forEach(\n rules,\n (rule) =>\n pipe(\n assertRulePathWithinBase(basePath, `${rule.name}.mdc`),\n Effect.flatMap((filePath) =>\n writeTextFile(filePath, buildMdcContent(rule))\n )\n ),\n { concurrency: \"unbounded\" }\n )\n ),\n Effect.asVoid\n );\n\nconst writeMarkdownDirRules = (\n basePath: string,\n rules: ExportedRule[]\n): Effect.Effect<void, RuleWriteError> =>\n pipe(\n createDirectory(basePath),\n Effect.flatMap(() =>\n Effect.forEach(\n rules,\n (rule) =>\n pipe(\n assertRulePathWithinBase(basePath, `${rule.name}.md`),\n Effect.flatMap((filePath) =>\n writeTextFile(filePath, `# ${rule.title}\\n\\n${rule.content}`)\n )\n ),\n { concurrency: \"unbounded\" }\n )\n ),\n Effect.asVoid\n );\n\nconst writeAppendSingleRules = (\n filePath: string,\n rules: ExportedRule[]\n): Effect.Effect<void, RuleWriteError> =>\n pipe(\n createDirectory(dirname(filePath)),\n Effect.flatMap(() =>\n pipe(\n readTextFile(filePath),\n Effect.orElseSucceed(() => \"\")\n )\n ),\n Effect.flatMap((existing) => {\n const braidContent = buildAppendContent(rules);\n\n const startIdx = existing.indexOf(BRAID_SECTION_START);\n const endIdx = existing.indexOf(BRAID_SECTION_END);\n\n let newContent: string;\n if (startIdx !== -1 && endIdx !== -1) {\n newContent =\n existing.slice(0, startIdx) +\n braidContent +\n existing.slice(endIdx + BRAID_SECTION_END.length);\n } else {\n newContent = existing ? `${existing}\\n\\n${braidContent}` : braidContent;\n }\n\n return writeTextFile(filePath, newContent);\n })\n );\n\nconst writeRulesForFormat = (\n basePath: string,\n rules: ExportedRule[],\n format: RuleFormat\n): Effect.Effect<void, RuleWriteError> => {\n switch (format) {\n case \"mdc\":\n return writeMdcRules(basePath, rules);\n case \"markdown-dir\":\n return writeMarkdownDirRules(basePath, rules);\n case \"append-single\":\n return writeAppendSingleRules(basePath, rules);\n default:\n return Effect.void;\n }\n};\n\ninterface WriteRulesResult {\n written: number;\n errors: Array<{ agent: string; error: string }>;\n}\n\nconst writeRulesForAgent = (\n agent: AgentConfig,\n rules: ExportedRule[],\n rulesPath: string\n): Effect.Effect<WriteRulesResult, never> => {\n if (!agent.ruleFormat || rules.length === 0) {\n return Effect.succeed({ written: 0, errors: [] });\n }\n\n return pipe(\n writeRulesForFormat(rulesPath, rules, agent.ruleFormat),\n Effect.map(() => ({\n written: rules.length,\n errors: [] as Array<{ agent: string; error: string }>,\n })),\n Effect.catchAll((error) =>\n Effect.succeed({\n written: 0,\n errors: [\n {\n agent: agent.name,\n error:\n error.cause instanceof Error\n ? error.cause.message\n : String(error.cause),\n },\n ],\n })\n )\n );\n};\n\nconst writeRulesForAgentAsync = (\n agent: AgentConfig,\n rules: ExportedRule[],\n rulesPath: string\n): Promise<WriteRulesResult> =>\n Effect.runPromise(writeRulesForAgent(agent, rules, rulesPath));\n\nexport type { WriteRulesResult };\nexport { RuleWriteError, writeRulesForAgent, writeRulesForAgentAsync };\n","import { chmod, mkdir, writeFile } from \"node:fs/promises\";\nimport { dirname, resolve, sep } from \"node:path\";\nimport { Data, Effect, pipe } from \"effect\";\nimport type { AgentId } from \"./agents.ts\";\nimport type { Skill, SkillFile } from \"./api.ts\";\n\nclass WriteError extends Data.TaggedError(\"WriteError\")<{\n path: string;\n operation: \"mkdir\" | \"write\" | \"chmod\";\n cause: unknown;\n}> {}\n\nconst createDirectory = (\n dir: string,\n fullPath: string\n): Effect.Effect<void, WriteError> =>\n Effect.tryPromise({\n try: () => mkdir(dir, { recursive: true }),\n catch: (e) =>\n new WriteError({ path: fullPath, operation: \"mkdir\", cause: e }),\n });\n\nconst writeTextFile = (\n fullPath: string,\n content: string\n): Effect.Effect<void, WriteError> =>\n Effect.tryPromise({\n try: () => writeFile(fullPath, content, \"utf-8\"),\n catch: (e) =>\n new WriteError({ path: fullPath, operation: \"write\", cause: e }),\n });\n\nconst writeBinaryFile = (\n fullPath: string,\n content: Buffer\n): Effect.Effect<void, WriteError> =>\n Effect.tryPromise({\n try: () => writeFile(fullPath, content),\n catch: (e) =>\n new WriteError({ path: fullPath, operation: \"write\", cause: e }),\n });\n\nconst makeExecutable = (fullPath: string): Effect.Effect<void, WriteError> =>\n Effect.tryPromise({\n try: () => chmod(fullPath, 0o755),\n catch: (e) =>\n new WriteError({ path: fullPath, operation: \"chmod\", cause: e }),\n });\n\nconst assertWithinBase = (\n basePath: string,\n untrustedPath: string\n): Effect.Effect<string, WriteError> => {\n const resolvedBase = resolve(basePath);\n const resolvedFull = resolve(basePath, untrustedPath);\n if (\n resolvedFull !== resolvedBase &&\n !resolvedFull.startsWith(resolvedBase + sep)\n ) {\n return Effect.fail(\n new WriteError({\n path: untrustedPath,\n operation: \"write\",\n cause: new Error(\n `Path traversal detected: \"${untrustedPath}\" resolves outside base directory`\n ),\n })\n );\n }\n return Effect.succeed(resolvedFull);\n};\n\nconst COMPATIBILITY_REGEX = /^compatibility:\\s*.+$/m;\n\nconst rewriteCompatibility = (content: string, agentId: AgentId): string => {\n return content.replace(COMPATIBILITY_REGEX, `compatibility: ${agentId}`);\n};\n\nconst decodeFileContent = (file: SkillFile, agentId?: AgentId): string => {\n let content: string;\n if (file.encoding === \"base64\") {\n content = Buffer.from(file.content, \"base64\").toString(\"utf-8\");\n } else {\n content = file.content;\n }\n\n if (agentId && file.path === \"SKILL.md\") {\n content = rewriteCompatibility(content, agentId);\n }\n\n return content;\n};\n\nconst decodeFileContentBinary = (file: SkillFile): Buffer => {\n if (file.encoding === \"base64\") {\n return Buffer.from(file.content, \"base64\");\n }\n return Buffer.from(file.content, \"utf-8\");\n};\n\nconst isBinaryFile = (path: string): boolean => {\n const binaryExtensions = [\n \".png\",\n \".jpg\",\n \".jpeg\",\n \".gif\",\n \".webp\",\n \".ico\",\n \".bmp\",\n ];\n return binaryExtensions.some((ext) => path.toLowerCase().endsWith(ext));\n};\n\n/**\n * Determines if a file should be made executable based on its path and extension.\n *\n * A file is considered a script if ALL of the following conditions are met:\n * 1. The file path contains \"/scripts/\" (indicating it's in a scripts directory)\n * 2. The file has a recognized script extension (.sh, .bash, .py, .js, .mjs, .rb)\n *\n * **Important behavior notes:**\n * - Files in the scripts/ directory WITHOUT a recognized extension will NOT be executable\n * - Files with script extensions OUTSIDE the scripts/ directory will NOT be executable\n * - No content validation is performed - the decision is purely path and extension based\n * - This follows the Agent Skills standard where executable scripts are placed in scripts/\n *\n * **Security consideration:**\n * This is a defensive approach that requires both correct location AND extension to grant\n * execute permissions. While a user could theoretically place a non-script file with a\n * script extension in scripts/, the dual requirement (path + extension) provides a\n * reasonable safeguard for the expected use case of skill distribution.\n *\n * @param path - The file path relative to the skill root\n * @returns true if the file should receive executable permissions (chmod 0o755)\n *\n * @example\n * isScriptFile(\"scripts/deploy.sh\") // true - in scripts/, has .sh extension\n * isScriptFile(\"scripts/setup.py\") // true - in scripts/, has .py extension\n * isScriptFile(\"src/scripts/deploy.sh\") // true - in nested scripts/, has .sh extension\n * isScriptFile(\"scripts/readme.txt\") // false - in scripts/, but not a script extension\n * isScriptFile(\"src/index.js\") // false - has .js extension, but not in scripts/\n * isScriptFile(\"deploy.sh\") // false - has .sh extension, but not in scripts/\n */\nconst isScriptFile = (path: string): boolean => {\n const scriptExtensions = [\".sh\", \".bash\", \".py\", \".js\", \".mjs\", \".rb\"];\n const lowerPath = path.toLowerCase();\n const inScriptsDir =\n lowerPath.includes(\"/scripts/\") || lowerPath.startsWith(\"scripts/\");\n return (\n inScriptsDir && scriptExtensions.some((ext) => lowerPath.endsWith(ext))\n );\n};\n\nconst writeFileContent = (\n fullPath: string,\n file: SkillFile,\n agentId?: AgentId\n): Effect.Effect<void, WriteError> =>\n isBinaryFile(file.path)\n ? writeBinaryFile(fullPath, decodeFileContentBinary(file))\n : writeTextFile(fullPath, decodeFileContent(file, agentId));\n\n/**\n * Conditionally sets executable permissions on a file if it's identified as a script.\n *\n * This function uses {@link isScriptFile} to determine if the file should be executable.\n * Only files in the scripts/ directory with recognized script extensions will receive\n * executable permissions (chmod 0o755).\n *\n * @param fullPath - The absolute filesystem path where the file is written\n * @param filePath - The relative path within the skill (used for script detection)\n * @returns Effect that succeeds after setting permissions, or immediately if not a script\n */\nconst setExecutableIfScript = (\n fullPath: string,\n file: SkillFile,\n agentId?: AgentId\n): Effect.Effect<void, WriteError> =>\n isScriptFile(file.path) && decodeFileContent(file, agentId).startsWith(\"#!\")\n ? makeExecutable(fullPath)\n : Effect.void;\n\nconst writeSkillFile = (\n basePath: string,\n file: SkillFile,\n agentId?: AgentId\n): Effect.Effect<void, WriteError> =>\n pipe(\n assertWithinBase(basePath, file.path),\n Effect.flatMap((fullPath) => {\n const dir = dirname(fullPath);\n return pipe(\n createDirectory(dir, fullPath),\n Effect.flatMap(() => writeFileContent(fullPath, file, agentId)),\n Effect.flatMap(() => setExecutableIfScript(fullPath, file, agentId))\n );\n })\n );\n\nconst writeSkill = (\n basePath: string,\n skill: Skill,\n agentId?: AgentId\n): Effect.Effect<void, WriteError> =>\n pipe(\n assertWithinBase(basePath, skill.name),\n Effect.flatMap((skillDir) =>\n pipe(\n Effect.forEach(\n skill.files,\n (file) => writeSkillFile(skillDir, file, agentId),\n {\n concurrency: \"unbounded\",\n }\n ),\n Effect.map(() => undefined)\n )\n )\n );\n\ninterface WriteSkillsResult {\n written: string[];\n errors: Array<{ skill: string; error: string }>;\n}\n\n/**\n * Writes multiple skills to disk\n *\n * @param basePath - Base directory to write skills to (e.g., \".claude/skills\")\n * @param skills - Skills to write\n * @param agentId - Agent ID to set in compatibility field\n */\nconst writeSkills = (\n basePath: string,\n skills: Skill[],\n agentId?: AgentId\n): Effect.Effect<WriteSkillsResult, never> =>\n pipe(\n Effect.forEach(\n skills,\n (skill) =>\n pipe(\n writeSkill(basePath, skill, agentId),\n Effect.map(() => ({ success: true as const, skill: skill.name })),\n Effect.catchAll((error) =>\n Effect.succeed({\n success: false as const,\n skill: skill.name,\n error:\n error.cause instanceof Error\n ? error.cause.message\n : String(error.cause),\n })\n )\n ),\n { concurrency: \"unbounded\" }\n ),\n Effect.map((results) => ({\n written: results.filter((r) => r.success).map((r) => r.skill),\n errors: results\n .filter(\n (r): r is { success: false; skill: string; error: string } =>\n !r.success\n )\n .map((r) => ({ skill: r.skill, error: r.error })),\n }))\n );\n\nconst writeSkillAsync = (\n basePath: string,\n skill: Skill,\n agentId?: AgentId\n): Promise<void> => Effect.runPromise(writeSkill(basePath, skill, agentId));\n\nconst writeSkillsAsync = (\n basePath: string,\n skills: Skill[],\n agentId?: AgentId\n): Promise<WriteSkillsResult> =>\n Effect.runPromise(writeSkills(basePath, skills, agentId));\n\nexport type { WriteSkillsResult };\nexport {\n decodeFileContent,\n decodeFileContentBinary,\n isBinaryFile,\n isScriptFile,\n WriteError,\n writeSkill,\n writeSkillAsync,\n writeSkillFile,\n writeSkills,\n writeSkillsAsync,\n};\n","import { log, spinner } from \"@clack/prompts\";\nimport type { DetectedAgent } from \"../lib/agents.ts\";\nimport {\n detectAgentsAsync,\n directoryExistsAsync,\n resolveInstallPath,\n} from \"../lib/agents.ts\";\nimport type { InstalledSkill } from \"../lib/metadata.ts\";\nimport { readMetadataAsync } from \"../lib/metadata.ts\";\n\ninterface ListOptions {\n global?: boolean;\n}\n\nfunction formatRelativeTime(isoDate: string): string {\n const date = new Date(isoDate);\n const now = new Date();\n const diffMs = now.getTime() - date.getTime();\n const diffMins = Math.floor(diffMs / 60_000);\n const diffHours = Math.floor(diffMins / 60);\n const diffDays = Math.floor(diffHours / 24);\n\n if (diffMins < 1) {\n return \"just now\";\n }\n if (diffMins < 60) {\n return `${diffMins} minute${diffMins !== 1 ? \"s\" : \"\"} ago`;\n }\n if (diffHours < 24) {\n return `${diffHours} hour${diffHours !== 1 ? \"s\" : \"\"} ago`;\n }\n if (diffDays < 30) {\n return `${diffDays} day${diffDays !== 1 ? \"s\" : \"\"} ago`;\n }\n return date.toLocaleDateString();\n}\n\nfunction displayAgentSkills(\n agent: DetectedAgent,\n installPath: string,\n braidSkills: InstalledSkill[]\n): void {\n const nameWidth = 25;\n const sourceWidth = 20;\n const installedWidth = 15;\n\n log.info(\"\");\n log.info(`Agent: ${agent.name} (${installPath})`);\n log.info(\"─\".repeat(60));\n\n const header = [\n \"Skill\".padEnd(nameWidth),\n \"Source\".padEnd(sourceWidth),\n \"Installed\".padEnd(installedWidth),\n ].join(\" \");\n\n log.info(header);\n log.info(\"─\".repeat(60));\n\n for (const skill of braidSkills) {\n const sourceName = skill.source.name;\n\n const row = [\n skill.name.slice(0, nameWidth).padEnd(nameWidth),\n sourceName.slice(0, sourceWidth).padEnd(sourceWidth),\n formatRelativeTime(skill.installedAt).padEnd(installedWidth),\n ].join(\" \");\n\n log.info(row);\n }\n}\n\nexport async function listCommand(options: ListOptions): Promise<void> {\n const listSpinner = spinner();\n listSpinner.start(\"Scanning for installed skills...\");\n\n try {\n const detectedAgents = await detectAgentsAsync();\n\n if (detectedAgents.length === 0) {\n listSpinner.stop(\"No agents detected\");\n log.warn(\"No AI coding agents detected.\");\n return;\n }\n\n listSpinner.stop(`Found ${detectedAgents.length} agent(s)`);\n\n let totalSkills = 0;\n\n for (const agent of detectedAgents) {\n const installPath = resolveInstallPath(agent, {\n global: options.global === true,\n });\n if (!installPath) {\n continue;\n }\n const exists = await directoryExistsAsync(installPath);\n\n if (!exists) {\n continue;\n }\n\n const metadata = await readMetadataAsync(installPath);\n const braidSkills = metadata.skills;\n\n if (braidSkills.length === 0) {\n continue;\n }\n\n totalSkills += braidSkills.length;\n displayAgentSkills(agent, installPath, braidSkills);\n }\n\n if (totalSkills === 0) {\n log.warn(\"\\nNo skills installed via braid.\");\n log.info(\"Run 'braid install --profile <name>' to install skills.\");\n } else {\n log.info(\"\");\n log.info(`Total: ${totalSkills} skill(s) installed`);\n }\n } catch (error) {\n listSpinner.stop(\"List failed\");\n const message = error instanceof Error ? error.message : String(error);\n log.error(message);\n process.exit(1);\n }\n}\n","import process from \"node:process\";\nimport type { AgentConfig } from \"../lib/agents.ts\";\nimport {\n AGENTS,\n buildMcpEntry,\n detectMcpAgents,\n hasMcpConfig,\n resolveMcpConfigPath,\n} from \"../lib/agents.ts\";\nimport { loadMergedConfigAsync } from \"../lib/config.ts\";\nimport {\n hasbraidEntry,\n mergebraidEntry,\n readMcpConfigAsync,\n removebraidEntry,\n writeMcpConfigAsync,\n} from \"../lib/mcp-config.ts\";\nimport {\n cancel,\n intro,\n isCancel,\n log,\n outro,\n password,\n select,\n spinner,\n} from \"../lib/tui.ts\";\n\ninterface McpOptions {\n tool?: string;\n global?: boolean;\n token?: string;\n auth?: boolean;\n scope?: boolean;\n remove?: boolean;\n status?: boolean;\n helpCommands?: boolean;\n yes?: boolean;\n server?: string;\n}\n\nconst BRAID_ENTRY_NAME = \"braid\";\n\nfunction maskToken(token: string): string {\n if (token.length <= 10) {\n return token;\n }\n return `${token.slice(0, 7)}...${token.slice(-4)}`;\n}\n\nfunction getMcpAgents(): AgentConfig[] {\n return AGENTS.filter(hasMcpConfig);\n}\n\nfunction resolveScope(\n agent: AgentConfig,\n options: McpOptions\n): \"project\" | \"global\" {\n if (options.global) {\n return \"global\";\n }\n if (agent.mcpProjectConfigPath) {\n return \"project\";\n }\n return \"global\";\n}\n\nasync function selectTool(\n mcpAgents: AgentConfig[],\n toolFlag?: string\n): Promise<AgentConfig> {\n if (toolFlag) {\n const agent = mcpAgents.find((a) => a.id === toolFlag);\n if (!agent) {\n log.error(`Unknown or unsupported tool: ${toolFlag}`);\n log.info(`Supported tools: ${mcpAgents.map((a) => a.id).join(\", \")}`);\n process.exit(1);\n }\n return agent;\n }\n\n const detected = await detectMcpAgents();\n const detectedIds = new Set(detected.map((a) => a.id));\n\n const toolChoice = await select({\n message: \"Select tool to configure:\",\n options: mcpAgents.map((agent) => ({\n value: agent.id as string,\n label: agent.name,\n hint: [\n agent.mcpProjectConfigPath ?? agent.mcpGlobalConfigPath,\n detectedIds.has(agent.id) ? \"detected\" : undefined,\n ]\n .filter(Boolean)\n .join(\" — \"),\n })),\n });\n\n if (isCancel(toolChoice)) {\n cancel(\"MCP setup cancelled.\");\n process.exit(0);\n }\n\n const found = mcpAgents.find((a) => a.id === toolChoice);\n if (!found) {\n log.error(\"Agent not found.\");\n process.exit(1);\n }\n return found;\n}\n\nasync function selectScope(\n agent: AgentConfig,\n options: McpOptions\n): Promise<\"project\" | \"global\"> {\n const initial = resolveScope(agent, options);\n\n if (\n options.global ||\n options.yes ||\n !agent.mcpProjectConfigPath ||\n !agent.mcpGlobalConfigPath\n ) {\n return initial;\n }\n\n const scopeChoice = await select({\n message: \"Where should this be configured?\",\n options: [\n {\n value: \"project\" as const,\n label: \"Project\",\n hint: agent.mcpProjectConfigPath,\n },\n {\n value: \"global\" as const,\n label: \"Global\",\n hint: agent.mcpGlobalConfigPath,\n },\n ],\n });\n\n if (isCancel(scopeChoice)) {\n cancel(\"MCP setup cancelled.\");\n process.exit(0);\n }\n\n return scopeChoice;\n}\n\nasync function resolveToken(\n options: McpOptions,\n existingToken?: string\n): Promise<string | undefined> {\n if (options.auth === false) {\n return undefined;\n }\n\n if (options.token) {\n return options.token;\n }\n\n if (existingToken && options.yes) {\n return existingToken;\n }\n\n if (existingToken) {\n const authChoice = await select({\n message: \"Authentication:\",\n options: [\n {\n value: \"existing\" as const,\n label: `Use existing token (${maskToken(existingToken)})`,\n },\n { value: \"new\" as const, label: \"Enter a new token\" },\n {\n value: \"skip\" as const,\n label: \"Skip — set BRAID_TOKEN env var later\",\n },\n ],\n });\n\n if (isCancel(authChoice)) {\n cancel(\"MCP setup cancelled.\");\n process.exit(0);\n }\n\n if (authChoice === \"existing\") {\n return existingToken;\n }\n if (authChoice === \"skip\") {\n return undefined;\n }\n }\n\n const token = await password({\n message: \"Enter your braid API token:\",\n validate: (value) => {\n if (!value) {\n return \"Token is required\";\n }\n if (!value.startsWith(\"br_\")) {\n return \"Token should start with 'br_'\";\n }\n return undefined;\n },\n });\n\n if (isCancel(token)) {\n cancel(\"MCP setup cancelled.\");\n process.exit(0);\n }\n\n return token;\n}\n\nfunction buildEnvVars(\n token: string | undefined,\n server: string | undefined\n): Record<string, string> {\n const env: Record<string, string> = {};\n if (token) {\n env.BRAID_TOKEN = token;\n }\n if (server) {\n env.BRAID_MCP_URL = server;\n }\n return env;\n}\n\nasync function writeEntry(\n agent: AgentConfig,\n configPath: string,\n env: Record<string, string>\n): Promise<void> {\n const entry = buildMcpEntry(agent.mcpEntryStyle ?? \"standard\", env);\n const rootKey = agent.mcpRootKey ?? \"mcpServers\";\n\n const existingConfig = await readMcpConfigAsync(configPath);\n const updatedConfig = mergebraidEntry(\n existingConfig,\n rootKey,\n BRAID_ENTRY_NAME,\n entry as Record<string, unknown>\n );\n await writeMcpConfigAsync(configPath, updatedConfig);\n}\n\nasync function addFlow(options: McpOptions): Promise<void> {\n const config = await loadMergedConfigAsync();\n const mcpAgents = getMcpAgents();\n\n if (mcpAgents.length === 0) {\n log.error(\"No agents with MCP configuration support found.\");\n process.exit(1);\n }\n\n const selectedAgent = await selectTool(mcpAgents, options.tool);\n const scope = await selectScope(selectedAgent, options);\n\n const configPath = resolveMcpConfigPath(selectedAgent, {\n global: scope === \"global\",\n });\n\n if (!configPath) {\n log.error(`No ${scope} config path available for ${selectedAgent.name}.`);\n process.exit(1);\n }\n\n const token = await resolveToken(options, config.token);\n const env = buildEnvVars(token, options.server);\n\n if (options.scope) {\n const { scopeCommand } = await import(\"./scope.ts\");\n await scopeCommand({\n server: options.server ?? config.serverUrl,\n ...(config.token ? { apiKey: config.token } : {}),\n });\n }\n\n const mcpSpinner = spinner();\n mcpSpinner.start(`Configuring ${selectedAgent.name}...`);\n\n try {\n await writeEntry(selectedAgent, configPath, env);\n\n mcpSpinner.stop(`Configured ${selectedAgent.name}`);\n log.info(`Config written to ${configPath}`);\n\n if (!token) {\n log.info(\"Set BRAID_TOKEN environment variable before using.\");\n }\n\n outro(`Done! Restart ${selectedAgent.name} to activate.`);\n } catch (error) {\n mcpSpinner.stop(\"Configuration failed\");\n const message = error instanceof Error ? error.message : String(error);\n log.error(`Failed to write config: ${message}`);\n process.exit(1);\n }\n}\n\nasync function removeFlow(options: McpOptions): Promise<void> {\n const mcpAgents = getMcpAgents();\n const selectedAgent = await selectTool(mcpAgents, options.tool);\n\n const scope = resolveScope(selectedAgent, options);\n const configPath = resolveMcpConfigPath(selectedAgent, {\n global: scope === \"global\",\n });\n\n if (!configPath) {\n log.error(`No ${scope} config path available for ${selectedAgent.name}.`);\n process.exit(1);\n }\n\n const removeSpinner = spinner();\n removeSpinner.start(`Removing braid from ${selectedAgent.name}...`);\n\n try {\n const rootKey = selectedAgent.mcpRootKey ?? \"mcpServers\";\n const existingConfig = await readMcpConfigAsync(configPath);\n\n if (!hasbraidEntry(existingConfig, rootKey, BRAID_ENTRY_NAME)) {\n removeSpinner.stop(\"No braid MCP entry found\");\n log.info(\n `${selectedAgent.name} doesn't have a braid MCP entry at ${configPath}`\n );\n return;\n }\n\n const updatedConfig = removebraidEntry(\n existingConfig,\n rootKey,\n BRAID_ENTRY_NAME\n );\n await writeMcpConfigAsync(configPath, updatedConfig);\n\n removeSpinner.stop(`Removed braid from ${selectedAgent.name}`);\n outro(`braid MCP removed from ${configPath}`);\n } catch (error) {\n removeSpinner.stop(\"Removal failed\");\n const message = error instanceof Error ? error.message : String(error);\n log.error(`Failed to remove config: ${message}`);\n process.exit(1);\n }\n}\n\nasync function statusFlow(): Promise<void> {\n const mcpAgents = getMcpAgents();\n const statusSpinner = spinner();\n statusSpinner.start(\"Checking MCP configuration status...\");\n\n const results: Array<{\n name: string;\n path: string;\n scope: string;\n }> = [];\n\n for (const agent of mcpAgents) {\n const rootKey = agent.mcpRootKey ?? \"mcpServers\";\n\n for (const scope of [\"project\", \"global\"] as const) {\n const configPath = resolveMcpConfigPath(agent, {\n global: scope === \"global\",\n });\n if (!configPath) {\n continue;\n }\n\n const config = await readMcpConfigAsync(configPath);\n if (hasbraidEntry(config, rootKey, BRAID_ENTRY_NAME)) {\n results.push({\n name: agent.name,\n path: configPath,\n scope,\n });\n }\n }\n }\n\n statusSpinner.stop(`Found ${results.length} configured tool(s)`);\n\n if (results.length === 0) {\n log.info(\"No tools have braid MCP configured.\");\n log.info(\"Run 'braid mcp' to set up MCP for your AI tools.\");\n return;\n }\n\n for (const result of results) {\n log.info(` ${result.name} (${result.scope}) → ${result.path}`);\n }\n}\n\nfunction helpCommandsFlow(): void {\n log.info(\"MCP manual command reference:\");\n log.info(\" braid projects list --json\");\n log.info(\" braid rules list --json\");\n log.info(\" braid skills list --profile <name> --json\");\n log.info(\"\");\n log.info(\"Common local management commands:\");\n log.info(\" braid install --yes --profile <name>\");\n log.info(\" braid update --yes\");\n log.info(\" braid list\");\n log.info(\" braid remove --yes --all\");\n log.info(\n \" braid scope --file user --organization personal --source profile --profile <name>\"\n );\n}\n\nexport async function mcpCommand(options: McpOptions): Promise<void> {\n if (options.helpCommands) {\n intro(\"braid mcp help\");\n helpCommandsFlow();\n return;\n }\n\n if (options.status) {\n intro(\"braid mcp status\");\n await statusFlow();\n return;\n }\n\n if (options.remove) {\n intro(\"braid mcp remove\");\n await removeFlow(options);\n return;\n }\n\n intro(\"braid mcp\");\n await addFlow(options);\n}\n","import { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\nimport { Data, Effect, pipe } from \"effect\";\n\nclass McpConfigReadError extends Data.TaggedError(\"McpConfigReadError\")<{\n path: string;\n cause: unknown;\n}> {}\n\nclass McpConfigWriteError extends Data.TaggedError(\"McpConfigWriteError\")<{\n path: string;\n cause: unknown;\n}> {}\n\ntype JsonObject = Record<string, unknown>;\n\nconst readMcpConfig = (\n path: string\n): Effect.Effect<JsonObject, McpConfigReadError> =>\n pipe(\n Effect.tryPromise({\n try: () => readFile(path, \"utf-8\"),\n catch: (e) => new McpConfigReadError({ path, cause: e }),\n }),\n Effect.flatMap((content) =>\n Effect.try({\n try: () => JSON.parse(content) as JsonObject,\n catch: () => ({}) as JsonObject,\n })\n ),\n Effect.orElseSucceed(() => ({}) as JsonObject)\n );\n\nconst writeMcpConfig = (\n path: string,\n config: JsonObject\n): Effect.Effect<void, McpConfigWriteError> =>\n Effect.tryPromise({\n try: async () => {\n await mkdir(dirname(path), { recursive: true, mode: 0o700 });\n await writeFile(path, `${JSON.stringify(config, null, 2)}\\n`, {\n encoding: \"utf-8\",\n mode: 0o600,\n });\n },\n catch: (e) => new McpConfigWriteError({ path, cause: e }),\n });\n\nconst mergebraidEntry = (\n config: JsonObject,\n rootKey: string,\n entryName: string,\n entry: JsonObject\n): JsonObject => {\n const servers = (config[rootKey] ?? {}) as JsonObject;\n return {\n ...config,\n [rootKey]: {\n ...servers,\n [entryName]: entry,\n },\n };\n};\n\nconst removebraidEntry = (\n config: JsonObject,\n rootKey: string,\n entryName: string\n): JsonObject => {\n const servers = { ...((config[rootKey] ?? {}) as JsonObject) };\n delete servers[entryName];\n return {\n ...config,\n [rootKey]: servers,\n };\n};\n\nconst hasbraidEntry = (\n config: JsonObject,\n rootKey: string,\n entryName: string\n): boolean => {\n const servers = config[rootKey] as JsonObject | undefined;\n return servers !== undefined && entryName in servers;\n};\n\nconst readMcpConfigAsync = (path: string): Promise<JsonObject> =>\n Effect.runPromise(readMcpConfig(path));\n\nconst writeMcpConfigAsync = (path: string, config: JsonObject): Promise<void> =>\n Effect.runPromise(writeMcpConfig(path, config));\n\nexport type { JsonObject };\nexport {\n hasbraidEntry,\n McpConfigReadError,\n McpConfigWriteError,\n mergebraidEntry,\n readMcpConfig,\n readMcpConfigAsync,\n removebraidEntry,\n writeMcpConfig,\n writeMcpConfigAsync,\n};\n","import process from \"node:process\";\nimport { runLifecycleCommandAsync } from \"../lib/api.ts\";\nimport { log } from \"../lib/tui.ts\";\n\ninterface LifecycleOptions {\n server?: string;\n apiKey?: string;\n json?: boolean;\n}\n\ninterface ProfileIdOptions extends LifecycleOptions {\n id?: string;\n}\n\ninterface ProfileGetOptions extends LifecycleOptions {\n id?: string;\n name?: string;\n}\n\ninterface ProfileCreateOptions extends LifecycleOptions {\n name?: string;\n contextJson?: string;\n}\n\ninterface ProfileUpdateOptions extends LifecycleOptions {\n id?: string;\n name?: string;\n contextJson?: string;\n}\n\ninterface ProfileRemoveOptions extends ProfileIdOptions {\n yes?: boolean;\n}\n\nconst writeJson = (value: unknown): void => {\n process.stdout.write(`${JSON.stringify(value, null, 2)}\\n`);\n};\n\nconst exitWithError = (error: unknown): never => {\n const message = error instanceof Error ? error.message : String(error);\n log.error(message);\n process.exit(1);\n};\n\nconst fail = (message: string): never => {\n throw new Error(message);\n};\n\nconst parseContext = (\n contextJson?: string\n): Record<string, unknown> | undefined => {\n if (!contextJson) {\n return undefined;\n }\n return JSON.parse(contextJson) as Record<string, unknown>;\n};\n\nconst run = async (\n command: string,\n args: Record<string, unknown>,\n options: LifecycleOptions\n): Promise<void> => {\n const apiOptions = {\n ...(options.server ? { serverUrl: options.server } : {}),\n ...(options.apiKey ? { apiKey: options.apiKey } : {}),\n };\n\n const result = await runLifecycleCommandAsync(\n {\n domain: \"profiles\",\n command,\n args,\n },\n apiOptions\n );\n\n if (options.json) {\n writeJson(result);\n return;\n }\n\n log.success(`profiles ${command} completed`);\n};\n\nexport async function profilesListCommand(\n options: LifecycleOptions\n): Promise<void> {\n try {\n await run(\"list\", {}, options);\n } catch (error) {\n exitWithError(error);\n }\n}\n\nexport async function profilesGetCommand(\n options: ProfileGetOptions\n): Promise<void> {\n try {\n if (!(options.id || options.name)) {\n fail(\"profiles get requires --id or --name\");\n }\n await run(\"get\", { id: options.id, name: options.name }, options);\n } catch (error) {\n exitWithError(error);\n }\n}\n\nexport async function profilesCreateCommand(\n options: ProfileCreateOptions\n): Promise<void> {\n try {\n const name = options.name ?? fail(\"profiles create requires --name\");\n await run(\n \"create\",\n { name, context: parseContext(options.contextJson) },\n options\n );\n } catch (error) {\n exitWithError(error);\n }\n}\n\nexport async function profilesUpdateCommand(\n options: ProfileUpdateOptions\n): Promise<void> {\n try {\n const id = options.id ?? fail(\"profiles update requires --id\");\n await run(\n \"update\",\n {\n id,\n name: options.name,\n context: parseContext(options.contextJson),\n },\n options\n );\n } catch (error) {\n exitWithError(error);\n }\n}\n\nexport async function profilesRemoveCommand(\n options: ProfileRemoveOptions\n): Promise<void> {\n try {\n const id = options.id ?? fail(\"profiles remove requires --id\");\n if (!options.yes) {\n fail(\"profiles remove requires --yes\");\n }\n await run(\"remove\", { id, yes: true }, options);\n } catch (error) {\n exitWithError(error);\n }\n}\n\nexport async function profilesSetDefaultCommand(\n options: ProfileIdOptions\n): Promise<void> {\n try {\n const id = options.id ?? fail(\"profiles set-default requires --id\");\n await run(\"set-default\", { id }, options);\n } catch (error) {\n exitWithError(error);\n }\n}\n","import process from \"node:process\";\nimport { runLifecycleCommandAsync } from \"../lib/api.ts\";\nimport { log } from \"../lib/tui.ts\";\n\ninterface LifecycleOptions {\n server?: string;\n apiKey?: string;\n json?: boolean;\n}\n\ninterface ProjectsGetOptions extends LifecycleOptions {\n id?: string;\n}\n\ninterface ProjectsCreateOptions extends LifecycleOptions {\n name?: string;\n description?: string;\n orgId?: string;\n}\n\ninterface ProjectsUpdateOptions extends LifecycleOptions {\n id?: string;\n name?: string;\n description?: string;\n}\n\ninterface ProjectsRemoveOptions extends LifecycleOptions {\n id?: string;\n yes?: boolean;\n}\n\nconst writeJson = (value: unknown): void => {\n process.stdout.write(`${JSON.stringify(value, null, 2)}\\n`);\n};\n\nconst fail = (message: string): never => {\n throw new Error(message);\n};\n\nconst run = async (\n command: string,\n args: Record<string, unknown>,\n options: LifecycleOptions\n): Promise<void> => {\n const apiOptions = {\n ...(options.server ? { serverUrl: options.server } : {}),\n ...(options.apiKey ? { apiKey: options.apiKey } : {}),\n };\n\n const result = await runLifecycleCommandAsync(\n {\n domain: \"projects\",\n command,\n args,\n },\n apiOptions\n );\n\n if (options.json) {\n writeJson(result);\n return;\n }\n\n log.success(`projects ${command} completed`);\n};\n\nconst exitWithError = (error: unknown): never => {\n const message = error instanceof Error ? error.message : String(error);\n log.error(message);\n process.exit(1);\n};\n\nexport async function projectsGetCommand(\n options: ProjectsGetOptions\n): Promise<void> {\n try {\n const id = options.id ?? fail(\"projects get requires --id\");\n await run(\"get\", { id }, options);\n } catch (error) {\n exitWithError(error);\n }\n}\n\nexport async function projectsCreateCommand(\n options: ProjectsCreateOptions\n): Promise<void> {\n try {\n const name = options.name ?? fail(\"projects create requires --name\");\n await run(\n \"create\",\n { name, description: options.description, orgId: options.orgId },\n options\n );\n } catch (error) {\n exitWithError(error);\n }\n}\n\nexport async function projectsUpdateCommand(\n options: ProjectsUpdateOptions\n): Promise<void> {\n try {\n const id = options.id ?? fail(\"projects update requires --id\");\n await run(\n \"update\",\n {\n id,\n name: options.name,\n description: options.description,\n },\n options\n );\n } catch (error) {\n exitWithError(error);\n }\n}\n\nexport async function projectsRemoveCommand(\n options: ProjectsRemoveOptions\n): Promise<void> {\n try {\n const id = options.id ?? fail(\"projects remove requires --id\");\n if (!options.yes) {\n fail(\"projects remove requires --yes\");\n }\n await run(\"remove\", { id, yes: true }, options);\n } catch (error) {\n exitWithError(error);\n }\n}\n","import process from \"node:process\";\nimport { runLifecycleCommandAsync } from \"../lib/api.ts\";\nimport { log } from \"../lib/tui.ts\";\n\ninterface LifecycleOptions {\n server?: string;\n apiKey?: string;\n json?: boolean;\n}\n\ninterface ReferenceIdOptions extends LifecycleOptions {\n id?: string;\n}\n\ninterface ReferencesListOptions extends LifecycleOptions {\n ruleId?: string;\n}\n\ninterface ReferencesCreateOptions extends LifecycleOptions {\n ruleId?: string;\n file?: string;\n}\n\ninterface ReferencesUpdateOptions extends LifecycleOptions {\n id?: string;\n label?: string;\n replaceFile?: string;\n}\n\ninterface ReferencesRemoveOptions extends ReferenceIdOptions {\n yes?: boolean;\n}\n\ninterface ReferencesReorderOptions extends LifecycleOptions {\n ruleId?: string;\n orderedIds?: string;\n}\n\nconst writeJson = (value: unknown): void => {\n process.stdout.write(`${JSON.stringify(value, null, 2)}\\n`);\n};\n\nconst parseCsv = (input?: string): string[] | undefined => {\n if (!input) {\n return undefined;\n }\n const values = input\n .split(\",\")\n .map((value) => value.trim())\n .filter((value) => value.length > 0);\n return values.length > 0 ? values : undefined;\n};\n\nconst exitWithError = (error: unknown): never => {\n const message = error instanceof Error ? error.message : String(error);\n log.error(message);\n process.exit(1);\n};\n\nconst fail = (message: string): never => {\n throw new Error(message);\n};\n\nconst run = async (\n command: string,\n args: Record<string, unknown>,\n options: LifecycleOptions\n): Promise<void> => {\n const apiOptions = {\n ...(options.server ? { serverUrl: options.server } : {}),\n ...(options.apiKey ? { apiKey: options.apiKey } : {}),\n };\n\n const result = await runLifecycleCommandAsync(\n {\n domain: \"references\",\n command,\n args,\n },\n apiOptions\n );\n\n if (options.json) {\n writeJson(result);\n return;\n }\n\n log.success(`references ${command} completed`);\n};\n\nexport async function referencesListCommand(\n options: ReferencesListOptions\n): Promise<void> {\n try {\n const ruleId = options.ruleId ?? fail(\"references list requires --rule-id\");\n await run(\"list\", { ruleId }, options);\n } catch (error) {\n exitWithError(error);\n }\n}\n\nexport async function referencesGetCommand(\n options: ReferenceIdOptions\n): Promise<void> {\n try {\n const id = options.id ?? fail(\"references get requires --id\");\n await run(\"get\", { id }, options);\n } catch (error) {\n exitWithError(error);\n }\n}\n\nexport async function referencesCreateCommand(\n options: ReferencesCreateOptions\n): Promise<void> {\n try {\n const ruleId =\n options.ruleId ?? fail(\"references create requires --rule-id\");\n const file = options.file ?? fail(\"references create requires --file\");\n await run(\"create\", { ruleId, file }, options);\n } catch (error) {\n exitWithError(error);\n }\n}\n\nexport async function referencesUpdateCommand(\n options: ReferencesUpdateOptions\n): Promise<void> {\n try {\n const id = options.id ?? fail(\"references update requires --id\");\n await run(\n \"update\",\n { id, label: options.label, replaceFile: options.replaceFile },\n options\n );\n } catch (error) {\n exitWithError(error);\n }\n}\n\nexport async function referencesRemoveCommand(\n options: ReferencesRemoveOptions\n): Promise<void> {\n try {\n const id = options.id ?? fail(\"references remove requires --id\");\n if (!options.yes) {\n fail(\"references remove requires --yes\");\n }\n await run(\"remove\", { id, yes: true }, options);\n } catch (error) {\n exitWithError(error);\n }\n}\n\nexport async function referencesReorderCommand(\n options: ReferencesReorderOptions\n): Promise<void> {\n try {\n const ruleId =\n options.ruleId ?? fail(\"references reorder requires --rule-id\");\n const orderedIds = parseCsv(options.orderedIds);\n if (!orderedIds || orderedIds.length === 0) {\n fail(\"references reorder requires --ordered-ids\");\n }\n await run(\"reorder\", { ruleId, orderedIds }, options);\n } catch (error) {\n exitWithError(error);\n }\n}\n","import { rm } from \"node:fs/promises\";\nimport { join, resolve } from \"node:path\";\nimport process from \"node:process\";\nimport type { DetectedAgent } from \"../lib/agents.ts\";\nimport {\n detectAgentsAsync,\n directoryExistsAsync,\n resolveInstallPath,\n} from \"../lib/agents.ts\";\nimport { readMetadataAsync, removeFromMetadataAsync } from \"../lib/metadata.ts\";\nimport {\n cancel,\n confirm,\n isCancel,\n log,\n multiselect,\n outro,\n spinner,\n} from \"../lib/tui.ts\";\n\ninterface RemoveOptions {\n all?: boolean;\n global?: boolean;\n yes?: boolean;\n skill?: string;\n}\n\ninterface SkillToRemove {\n name: string;\n agentName: string;\n installPath: string;\n skillPath: string;\n}\n\nasync function collectInstalledSkills(\n detectedAgents: DetectedAgent[],\n options: RemoveOptions\n): Promise<SkillToRemove[]> {\n const skillsToRemove: SkillToRemove[] = [];\n\n for (const agent of detectedAgents) {\n const installPath = resolveInstallPath(agent, {\n global: options.global === true,\n });\n if (!installPath) {\n continue;\n }\n const exists = await directoryExistsAsync(installPath);\n\n if (!exists) {\n continue;\n }\n\n const metadata = await readMetadataAsync(installPath);\n\n for (const skill of metadata.skills) {\n skillsToRemove.push({\n name: skill.name,\n agentName: agent.name,\n installPath,\n skillPath: join(installPath, skill.name),\n });\n }\n }\n\n return skillsToRemove;\n}\n\nasync function selectSkillsToRemove(\n skillsToRemove: SkillToRemove[],\n options: RemoveOptions\n): Promise<SkillToRemove[]> {\n if (options.skill) {\n const selected = skillsToRemove.filter((s) => s.name === options.skill);\n if (selected.length === 0) {\n log.error(`Skill '${options.skill}' not found.`);\n log.info(\"Run 'braid list' to see installed skills.\");\n process.exit(1);\n }\n return selected;\n }\n\n if (options.all || options.yes) {\n return skillsToRemove;\n }\n\n const choices = skillsToRemove.map((skill) => ({\n value: skill,\n label: skill.name,\n hint: skill.agentName,\n }));\n\n const result = await multiselect({\n message: \"Select skills to remove:\",\n options: choices,\n required: true,\n });\n\n if (isCancel(result)) {\n cancel(\"Remove cancelled.\");\n process.exit(0);\n }\n\n return result;\n}\n\nasync function confirmRemoval(\n selectedCount: number,\n options: RemoveOptions\n): Promise<void> {\n if (options.yes || options.skill || options.all) {\n return;\n }\n\n const confirmed = await confirm({\n message: `Remove ${selectedCount} skill(s)?`,\n initialValue: false,\n });\n\n if (isCancel(confirmed) || !confirmed) {\n cancel(\"Remove cancelled.\");\n process.exit(0);\n }\n}\n\nasync function removeSkill(\n skill: SkillToRemove,\n removeSpinner: ReturnType<typeof spinner>\n): Promise<boolean> {\n removeSpinner.start(`Removing ${skill.name} from ${skill.agentName}...`);\n\n try {\n const resolvedSkillPath = resolve(skill.skillPath);\n const resolvedInstallPath = resolve(skill.installPath);\n if (!resolvedSkillPath.startsWith(`${resolvedInstallPath}/`)) {\n removeSpinner.stop(`Unsafe path for ${skill.name}`);\n log.warn(\" Skill path escapes install directory, skipping.\");\n return false;\n }\n await rm(resolvedSkillPath, { recursive: true, force: true });\n await removeFromMetadataAsync(skill.installPath, skill.name);\n removeSpinner.stop(`Removed ${skill.name} from ${skill.agentName}`);\n return true;\n } catch (error) {\n removeSpinner.stop(`Failed to remove ${skill.name}`);\n const message = error instanceof Error ? error.message : String(error);\n log.warn(` ${message}`);\n return false;\n }\n}\n\nexport async function removeCommand(options: RemoveOptions): Promise<void> {\n const removeSpinner = spinner();\n removeSpinner.start(\"Scanning for installed skills...\");\n\n try {\n const detectedAgents = await detectAgentsAsync();\n\n if (detectedAgents.length === 0) {\n removeSpinner.stop(\"No agents detected\");\n log.warn(\"No AI coding agents detected.\");\n return;\n }\n\n const skillsToRemove = await collectInstalledSkills(\n detectedAgents,\n options\n );\n\n removeSpinner.stop(`Found ${skillsToRemove.length} installed skill(s)`);\n\n if (skillsToRemove.length === 0) {\n log.warn(\"No skills installed via braid.\");\n return;\n }\n\n const selected = await selectSkillsToRemove(skillsToRemove, options);\n await confirmRemoval(selected.length, options);\n\n let removed = 0;\n let errors = 0;\n\n for (const skill of selected) {\n const success = await removeSkill(skill, removeSpinner);\n if (success) {\n removed++;\n } else {\n errors++;\n }\n }\n\n if (errors > 0) {\n outro(`Removed ${removed} skill(s) with ${errors} error(s).`);\n } else {\n outro(`Successfully removed ${removed} skill(s).`);\n }\n } catch (error) {\n removeSpinner.stop(\"Remove failed\");\n const message = error instanceof Error ? error.message : String(error);\n log.error(message);\n process.exit(1);\n }\n}\n","import process from \"node:process\";\nimport { runLifecycleCommandAsync } from \"../lib/api.ts\";\nimport { log } from \"../lib/tui.ts\";\n\ninterface LifecycleOptions {\n server?: string;\n apiKey?: string;\n json?: boolean;\n}\n\ninterface RuleIdOptions extends LifecycleOptions {\n id?: string;\n}\n\ninterface RuleCreateOptions extends LifecycleOptions {\n title?: string;\n content?: string;\n projectId?: string;\n tags?: string;\n priority?: string;\n}\n\ninterface RuleUpdateOptions extends LifecycleOptions {\n id?: string;\n title?: string;\n content?: string;\n tags?: string;\n priority?: string;\n}\n\ninterface RuleMoveOptions extends RuleIdOptions {\n projectId?: string;\n}\n\ninterface RuleForkOptions extends RuleIdOptions {\n targetProjectId?: string;\n}\n\ninterface RuleRemoveOptions extends RuleIdOptions {\n yes?: boolean;\n}\n\nconst parseCsv = (input?: string): string[] | undefined => {\n if (!input) {\n return undefined;\n }\n const values = input\n .split(\",\")\n .map((value) => value.trim())\n .filter((value) => value.length > 0);\n return values.length > 0 ? values : undefined;\n};\n\nconst writeJson = (value: unknown): void => {\n process.stdout.write(`${JSON.stringify(value, null, 2)}\\n`);\n};\n\nconst exitWithError = (error: unknown): never => {\n const message = error instanceof Error ? error.message : String(error);\n log.error(message);\n process.exit(1);\n};\n\nconst fail = (message: string): never => {\n throw new Error(message);\n};\n\nconst run = async (\n command: string,\n args: Record<string, unknown>,\n options: LifecycleOptions\n): Promise<void> => {\n const apiOptions = {\n ...(options.server ? { serverUrl: options.server } : {}),\n ...(options.apiKey ? { apiKey: options.apiKey } : {}),\n };\n\n const result = await runLifecycleCommandAsync(\n {\n domain: \"rules\",\n command,\n args,\n },\n apiOptions\n );\n\n if (options.json) {\n writeJson(result);\n return;\n }\n\n log.success(`rules ${command} completed`);\n};\n\nexport async function rulesGetCommand(options: RuleIdOptions): Promise<void> {\n try {\n const id = options.id ?? fail(\"rules get requires --id\");\n await run(\"get\", { id }, options);\n } catch (error) {\n exitWithError(error);\n }\n}\n\nexport async function rulesCreateCommand(\n options: RuleCreateOptions\n): Promise<void> {\n try {\n const title = options.title ?? fail(\"rules create requires --title\");\n const content = options.content ?? fail(\"rules create requires --content\");\n await run(\n \"create\",\n {\n title,\n content,\n projectId: options.projectId,\n tags: parseCsv(options.tags),\n priority: options.priority,\n },\n options\n );\n } catch (error) {\n exitWithError(error);\n }\n}\n\nexport async function rulesUpdateCommand(\n options: RuleUpdateOptions\n): Promise<void> {\n try {\n const id = options.id ?? fail(\"rules update requires --id\");\n await run(\n \"update\",\n {\n id,\n title: options.title,\n content: options.content,\n tags: parseCsv(options.tags),\n priority: options.priority,\n },\n options\n );\n } catch (error) {\n exitWithError(error);\n }\n}\n\nexport async function rulesRemoveCommand(\n options: RuleRemoveOptions\n): Promise<void> {\n try {\n const id = options.id ?? fail(\"rules remove requires --id\");\n if (!options.yes) {\n fail(\"rules remove requires --yes\");\n }\n await run(\"remove\", { id, yes: true }, options);\n } catch (error) {\n exitWithError(error);\n }\n}\n\nexport async function rulesEnableCommand(\n options: RuleIdOptions\n): Promise<void> {\n try {\n const id = options.id ?? fail(\"rules enable requires --id\");\n await run(\"enable\", { id }, options);\n } catch (error) {\n exitWithError(error);\n }\n}\n\nexport async function rulesDisableCommand(\n options: RuleIdOptions\n): Promise<void> {\n try {\n const id = options.id ?? fail(\"rules disable requires --id\");\n await run(\"disable\", { id }, options);\n } catch (error) {\n exitWithError(error);\n }\n}\n\nexport async function rulesMoveCommand(\n options: RuleMoveOptions\n): Promise<void> {\n try {\n const id = options.id ?? fail(\"rules move requires --id\");\n const projectId =\n options.projectId ?? fail(\"rules move requires --project-id\");\n await run(\"move\", { id, projectId }, options);\n } catch (error) {\n exitWithError(error);\n }\n}\n\nexport async function rulesDuplicateCommand(\n options: RuleForkOptions\n): Promise<void> {\n try {\n const id = options.id ?? fail(\"rules duplicate requires --id\");\n await run(\n \"duplicate\",\n { id, targetProjectId: options.targetProjectId },\n options\n );\n } catch (error) {\n exitWithError(error);\n }\n}\n\nexport async function rulesForkCommand(\n options: RuleForkOptions\n): Promise<void> {\n try {\n const id = options.id ?? fail(\"rules fork requires --id\");\n await run(\n \"fork\",\n { id, targetProjectId: options.targetProjectId },\n options\n );\n } catch (error) {\n exitWithError(error);\n }\n}\n\nexport async function rulesSyncStatusCommand(\n options: RuleIdOptions\n): Promise<void> {\n try {\n await run(\"sync-status\", { id: options.id }, options);\n } catch (error) {\n exitWithError(error);\n }\n}\n\nexport async function rulesSyncHistoryCommand(\n options: RuleIdOptions\n): Promise<void> {\n try {\n const id = options.id ?? fail(\"rules sync-history requires --id\");\n await run(\"sync-history\", { id }, options);\n } catch (error) {\n exitWithError(error);\n }\n}\n\nexport async function rulesSyncEnableCommand(\n options: RuleIdOptions\n): Promise<void> {\n try {\n const id = options.id ?? fail(\"rules sync-enable requires --id\");\n await run(\"sync-enable\", { id }, options);\n } catch (error) {\n exitWithError(error);\n }\n}\n\nexport async function rulesSyncDisableCommand(\n options: RuleIdOptions\n): Promise<void> {\n try {\n const id = options.id ?? fail(\"rules sync-disable requires --id\");\n await run(\"sync-disable\", { id }, options);\n } catch (error) {\n exitWithError(error);\n }\n}\n\nexport async function rulesSyncCheckCommand(\n options: RuleIdOptions\n): Promise<void> {\n try {\n const id = options.id ?? fail(\"rules sync-check requires --id\");\n await run(\"sync-check\", { id }, options);\n } catch (error) {\n exitWithError(error);\n }\n}\n\nexport async function rulesSyncNowCommand(\n options: RuleIdOptions\n): Promise<void> {\n try {\n const id = options.id ?? fail(\"rules sync-now requires --id\");\n await run(\"sync-now\", { id }, options);\n } catch (error) {\n exitWithError(error);\n }\n}\n","import {\n cancel,\n isCancel,\n log,\n multiselect,\n outro,\n spinner,\n} from \"@clack/prompts\";\nimport { Data, Effect, pipe } from \"effect\";\nimport type { AgentId, DetectedAgent } from \"../lib/agents.ts\";\nimport {\n detectAgentsAsync,\n directoryExistsAsync,\n resolveInstallPath,\n} from \"../lib/agents.ts\";\nimport type { FetchSkillsOptions } from \"../lib/api.ts\";\nimport { fetchSkillsAsync } from \"../lib/api.ts\";\nimport { readMetadataAsync, updateMetadataAsync } from \"../lib/metadata.ts\";\nimport { writeSkillsAsync } from \"../lib/skill-writer.ts\";\n\ninterface UpdateOptions {\n global?: boolean;\n server?: string;\n yes?: boolean;\n}\n\ninterface SourceToUpdate {\n type: \"profile\" | \"projects\";\n name: string;\n orgProjects: string[] | undefined;\n personalProjects: string[] | undefined;\n serverUrl: string;\n agents: Array<{ agentId: AgentId; agentName: string; installPath: string }>;\n}\n\nclass UpdateError extends Data.TaggedError(\"UpdateError\")<{\n message: string;\n source?: string;\n}> {}\n\nclass UserCancelledError extends Data.TaggedError(\"UserCancelledError\")<{\n message: string;\n}> {}\n\nasync function resolveValidInstallPath(\n agent: DetectedAgent,\n options: UpdateOptions\n): Promise<string | null> {\n const installPath = resolveInstallPath(agent, {\n global: options.global === true,\n });\n if (!installPath) {\n return null;\n }\n const exists = await directoryExistsAsync(installPath);\n return exists ? installPath : null;\n}\n\nconst collectSourcesFromAgent = (\n agent: DetectedAgent,\n options: UpdateOptions,\n sourcesToUpdate: Map<string, SourceToUpdate>\n): Effect.Effect<void, UpdateError> =>\n Effect.tryPromise({\n try: async () => {\n const installPath = await resolveValidInstallPath(agent, options);\n if (!installPath) {\n return;\n }\n\n const metadata = await readMetadataAsync(installPath);\n\n for (const skill of metadata.skills) {\n const key =\n skill.source.type === \"profile\"\n ? `profile:${skill.source.name}`\n : `projects:${skill.source.name}`;\n\n if (!sourcesToUpdate.has(key)) {\n sourcesToUpdate.set(key, {\n type: skill.source.type,\n name: skill.source.name,\n orgProjects: skill.source.orgProjects,\n personalProjects: skill.source.personalProjects,\n serverUrl: skill.serverUrl,\n agents: [],\n });\n }\n\n const source = sourcesToUpdate.get(key);\n if (\n source &&\n !source.agents.some((a) => a.installPath === installPath)\n ) {\n source.agents.push({\n agentId: agent.id,\n agentName: agent.name,\n installPath,\n });\n }\n }\n },\n catch: () => new UpdateError({ message: \"Failed to collect sources\" }),\n });\n\nconst collectSources = (\n detectedAgents: DetectedAgent[],\n options: UpdateOptions\n): Effect.Effect<Map<string, SourceToUpdate>, UpdateError> =>\n pipe(\n Effect.succeed(new Map<string, SourceToUpdate>()),\n Effect.tap((sourcesToUpdate) =>\n Effect.forEach(\n detectedAgents,\n (agent) => collectSourcesFromAgent(agent, options, sourcesToUpdate),\n { concurrency: 1 }\n )\n )\n );\n\nconst selectSources = (\n sourcesToUpdate: Map<string, SourceToUpdate>,\n options: UpdateOptions\n): Effect.Effect<Map<string, SourceToUpdate>, UserCancelledError> => {\n if (options.yes) {\n return Effect.succeed(sourcesToUpdate);\n }\n\n return Effect.tryPromise({\n try: async () => {\n const sources = Array.from(sourcesToUpdate.entries()).map(\n ([key, source]) => ({\n value: key,\n label: source.name,\n hint: `${source.agents.length} agent(s)`,\n })\n );\n\n const selected = await multiselect({\n message: \"Select sources to update:\",\n options: sources,\n initialValues: sources.map((s) => s.value),\n required: true,\n });\n\n if (isCancel(selected)) {\n throw new Error(\"cancelled\");\n }\n\n for (const key of sourcesToUpdate.keys()) {\n if (!selected.includes(key)) {\n sourcesToUpdate.delete(key);\n }\n }\n\n return sourcesToUpdate;\n },\n catch: () => new UserCancelledError({ message: \"Update cancelled.\" }),\n });\n};\n\nconst getSourceDesc = (source: SourceToUpdate): string => source.name;\n\nconst buildFetchOptionsForSource = (\n source: SourceToUpdate,\n options: UpdateOptions\n): FetchSkillsOptions | null => {\n const serverUrl = options.server ?? source.serverUrl;\n const fetchOptions: FetchSkillsOptions = { serverUrl };\n\n if (source.type === \"profile\") {\n fetchOptions.profile = source.name;\n } else {\n const orgProjects = source.orgProjects;\n const personalProjects = source.personalProjects;\n const hasOrgProjects = orgProjects !== undefined && orgProjects.length > 0;\n const hasPersonalProjects =\n personalProjects !== undefined && personalProjects.length > 0;\n\n if (!(hasOrgProjects || hasPersonalProjects)) {\n return null;\n }\n\n if (hasOrgProjects) {\n fetchOptions.orgProjects = orgProjects;\n }\n if (hasPersonalProjects) {\n fetchOptions.personalProjects = personalProjects;\n }\n }\n\n return fetchOptions;\n};\n\nconst updateAgentSkills = (\n agentId: AgentId,\n agentName: string,\n installPath: string,\n response: Awaited<ReturnType<typeof fetchSkillsAsync>>,\n serverUrl: string,\n updateSpinner: ReturnType<typeof spinner>\n): Effect.Effect<{ updated: number; errors: number }, UpdateError> =>\n Effect.tryPromise({\n try: async () => {\n updateSpinner.start(`Updating ${agentName}...`);\n\n const result = await writeSkillsAsync(\n installPath,\n response.skills,\n agentId\n );\n\n if (result.errors.length > 0) {\n updateSpinner.stop(\n `${agentName}: ${result.written.length} updated, ${result.errors.length} failed`\n );\n } else {\n updateSpinner.stop(\n `${agentName}: ${result.written.length} skills updated`\n );\n }\n\n await updateMetadataAsync(\n installPath,\n response.skills.map((s) => ({\n name: s.name,\n source: response.source,\n version: response.version,\n serverUrl,\n }))\n );\n\n return { updated: result.written.length, errors: result.errors.length };\n },\n catch: (e) =>\n new UpdateError({\n message: e instanceof Error ? e.message : String(e),\n source: agentName,\n }),\n });\n\nconst updateSource = (\n source: SourceToUpdate,\n options: UpdateOptions,\n updateSpinner: ReturnType<typeof spinner>\n): Effect.Effect<{ updated: number; errors: number }, UpdateError> => {\n const sourceDesc = getSourceDesc(source);\n const serverUrl = options.server ?? source.serverUrl;\n\n const fetchOptions = buildFetchOptionsForSource(source, options);\n if (fetchOptions === null) {\n return Effect.fail(\n new UpdateError({\n message:\n \"Skills installed with legacy metadata format. Please reinstall using 'braid install --profile <name>' or 'braid install --projects <names>'.\",\n source: sourceDesc,\n })\n );\n }\n\n return pipe(\n Effect.tryPromise({\n try: async () => {\n updateSpinner.start(`Fetching latest skills from ${sourceDesc}...`);\n const response = await fetchSkillsAsync(fetchOptions);\n updateSpinner.stop(\n `Fetched ${response.skills.length} skills from ${sourceDesc}`\n );\n return response;\n },\n catch: (e) =>\n new UpdateError({\n message: e instanceof Error ? e.message : String(e),\n source: sourceDesc,\n }),\n }),\n Effect.flatMap((response) =>\n pipe(\n Effect.forEach(\n source.agents,\n ({ agentId, agentName, installPath }) =>\n updateAgentSkills(\n agentId,\n agentName,\n installPath,\n response,\n serverUrl,\n updateSpinner\n ),\n { concurrency: 1 }\n ),\n Effect.map((results) => ({\n updated: results.reduce((sum, r) => sum + r.updated, 0),\n errors: results.reduce((sum, r) => sum + r.errors, 0),\n }))\n )\n )\n );\n};\n\nconst updateAllSources = (\n sources: Map<string, SourceToUpdate>,\n options: UpdateOptions,\n updateSpinner: ReturnType<typeof spinner>\n): Effect.Effect<{ totalUpdated: number; totalErrors: number }> =>\n pipe(\n Effect.forEach(\n Array.from(sources.values()),\n (source) =>\n pipe(\n updateSource(source, options, updateSpinner),\n Effect.catchAll((error) => {\n updateSpinner.stop(\n `Failed to update from ${getSourceDesc(source)}`\n );\n log.error(` ${error.message}`);\n return Effect.succeed({ updated: 0, errors: 1 });\n })\n ),\n { concurrency: 1 }\n ),\n Effect.map((results) => ({\n totalUpdated: results.reduce((sum, r) => sum + r.updated, 0),\n totalErrors: results.reduce((sum, r) => sum + r.errors, 0),\n }))\n );\n\nconst handleUpdateError = (\n error: UpdateError,\n updateSpinner: ReturnType<typeof spinner>\n): void => {\n updateSpinner.stop(\"Update failed\");\n if (error.message === \"No AI coding agents detected.\") {\n log.warn(error.message);\n return;\n }\n if (error.message === \"No skills installed via braid.\") {\n log.warn(error.message);\n log.info(\"Run 'braid install --profile <name>' to install skills first.\");\n return;\n }\n log.error(error.message);\n process.exit(1);\n};\n\nconst handleProgramExit = (\n result: Awaited<\n ReturnType<\n typeof Effect.runPromiseExit<\n { totalUpdated: number; totalErrors: number },\n UpdateError | UserCancelledError\n >\n >\n >,\n updateSpinner: ReturnType<typeof spinner>\n): void => {\n if (result._tag !== \"Failure\") {\n return;\n }\n\n const cause = result.cause;\n if (cause._tag !== \"Fail\") {\n return;\n }\n\n const error = cause.error;\n if (error._tag === \"UserCancelledError\") {\n cancel(error.message);\n process.exit(0);\n }\n if (error._tag === \"UpdateError\") {\n handleUpdateError(error, updateSpinner);\n }\n};\n\nexport async function updateCommand(options: UpdateOptions): Promise<void> {\n const updateSpinner = spinner();\n updateSpinner.start(\"Scanning for installed skills...\");\n\n const program = pipe(\n Effect.tryPromise({\n try: () => detectAgentsAsync(),\n catch: () => new UpdateError({ message: \"Failed to detect agents\" }),\n }),\n Effect.filterOrFail(\n (agents) => agents.length > 0,\n () => new UpdateError({ message: \"No AI coding agents detected.\" })\n ),\n Effect.flatMap((detectedAgents) => collectSources(detectedAgents, options)),\n Effect.tap((sources) => {\n updateSpinner.stop(`Found ${sources.size} source(s) to update`);\n }),\n Effect.filterOrFail(\n (sources) => sources.size > 0,\n () => new UpdateError({ message: \"No skills installed via braid.\" })\n ),\n Effect.flatMap((sources) => selectSources(sources, options)),\n Effect.flatMap((selectedSources) =>\n updateAllSources(selectedSources, options, updateSpinner)\n ),\n Effect.tap(({ totalUpdated, totalErrors }) => {\n if (totalErrors > 0) {\n outro(`Updated ${totalUpdated} skills with ${totalErrors} errors.`);\n } else {\n outro(`Successfully updated ${totalUpdated} skills.`);\n }\n })\n );\n\n const result = await Effect.runPromiseExit(program);\n handleProgramExit(result, updateSpinner);\n}\n","import process from \"node:process\";\nimport { runLifecycleCommandAsync } from \"../lib/api.ts\";\nimport { log } from \"../lib/tui.ts\";\n\ninterface LifecycleOptions {\n server?: string;\n apiKey?: string;\n json?: boolean;\n}\n\ninterface WorkflowsListOptions extends LifecycleOptions {\n projectId?: string;\n}\n\ninterface WorkflowsStartOptions extends LifecycleOptions {\n sessionId?: string;\n flowId?: string;\n currentNodeId?: string;\n currentStepLabel?: string;\n metadata?: string;\n}\n\ninterface WorkflowsProgressOptions extends LifecycleOptions {\n executionId?: string;\n currentNodeId?: string;\n currentStepLabel?: string;\n metadata?: string;\n}\n\ninterface WorkflowsActiveOptions extends LifecycleOptions {\n sessionId?: string;\n}\n\ninterface WorkflowsFinishOptions extends LifecycleOptions {\n executionId?: string;\n errorMessage?: string;\n}\n\nconst writeJson = (value: unknown): void => {\n process.stdout.write(`${JSON.stringify(value, null, 2)}\\n`);\n};\n\nconst fail = (message: string): never => {\n throw new Error(message);\n};\n\nconst parseMetadata = (metadata?: string): unknown => {\n if (!metadata) {\n return undefined;\n }\n try {\n return JSON.parse(metadata) as unknown;\n } catch {\n throw new Error(\"metadata must be valid JSON\");\n }\n};\n\nconst run = async (\n command: string,\n args: Record<string, unknown>,\n options: LifecycleOptions\n): Promise<void> => {\n const apiOptions = {\n ...(options.server ? { serverUrl: options.server } : {}),\n ...(options.apiKey ? { apiKey: options.apiKey } : {}),\n };\n\n const result = await runLifecycleCommandAsync(\n {\n domain: \"workflows\",\n command,\n args,\n },\n apiOptions\n );\n\n if (options.json) {\n writeJson(result);\n return;\n }\n\n log.success(`workflows ${command} completed`);\n};\n\nconst exitWithError = (error: unknown): never => {\n const message = error instanceof Error ? error.message : String(error);\n log.error(message);\n process.exit(1);\n};\n\nexport async function workflowsListCommand(\n options: WorkflowsListOptions\n): Promise<void> {\n try {\n await run(\"list\", { projectId: options.projectId }, options);\n } catch (error) {\n exitWithError(error);\n }\n}\n\nexport async function workflowsStartCommand(\n options: WorkflowsStartOptions\n): Promise<void> {\n try {\n const sessionId =\n options.sessionId ?? fail(\"workflows start requires --session-id\");\n const flowId = options.flowId ?? fail(\"workflows start requires --flow-id\");\n await run(\n \"start\",\n {\n sessionId,\n flowId,\n currentNodeId: options.currentNodeId,\n currentStepLabel: options.currentStepLabel,\n metadata: parseMetadata(options.metadata),\n },\n options\n );\n } catch (error) {\n exitWithError(error);\n }\n}\n\nexport async function workflowsProgressCommand(\n options: WorkflowsProgressOptions\n): Promise<void> {\n try {\n const executionId =\n options.executionId ?? fail(\"workflows progress requires --execution-id\");\n await run(\n \"progress\",\n {\n executionId,\n currentNodeId: options.currentNodeId,\n currentStepLabel: options.currentStepLabel,\n metadata: parseMetadata(options.metadata),\n },\n options\n );\n } catch (error) {\n exitWithError(error);\n }\n}\n\nexport async function workflowsActiveCommand(\n options: WorkflowsActiveOptions\n): Promise<void> {\n try {\n const sessionId =\n options.sessionId ?? fail(\"workflows active requires --session-id\");\n await run(\"active\", { sessionId }, options);\n } catch (error) {\n exitWithError(error);\n }\n}\n\nexport async function workflowsCompleteCommand(\n options: WorkflowsFinishOptions\n): Promise<void> {\n try {\n const executionId =\n options.executionId ?? fail(\"workflows complete requires --execution-id\");\n await run(\"complete\", { executionId }, options);\n } catch (error) {\n exitWithError(error);\n }\n}\n\nexport async function workflowsFailCommand(\n options: WorkflowsFinishOptions\n): Promise<void> {\n try {\n const executionId =\n options.executionId ?? fail(\"workflows fail requires --execution-id\");\n await run(\n \"fail\",\n { executionId, errorMessage: options.errorMessage },\n options\n );\n } catch (error) {\n exitWithError(error);\n }\n}\n\nexport async function workflowsCancelCommand(\n options: WorkflowsFinishOptions\n): Promise<void> {\n try {\n const executionId =\n options.executionId ?? fail(\"workflows cancel requires --execution-id\");\n await run(\"cancel\", { executionId }, options);\n } catch (error) {\n exitWithError(error);\n }\n}\n"],"mappings":"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","names":["mkdir","writeFile","homedir","dirname","join","process","Data","Effect","pipe","Data","Effect","pipe","hostname","path","process","process","rules","existing","path","platform","process","Effect","pipe","path","process","pipe","Effect","agents","Effect","path","process","pipe","process","resolve","TRAILING_SLASHES","scopeCommand","process","clearApiKeyAsync","process","parseCsv","writeJson","exitWithError","readFile","writeFile","join","Data","Effect","pipe","pipe","Effect","Effect","Effect","mkdir","readFile","writeFile","dirname","resolve","sep","Data","Effect","pipe","rules","mkdir","writeFile","dirname","resolve","sep","Data","Effect","pipe","createDirectory","writeTextFile","assertWithinBase","path","skills","skills","Effect","skills","rules","log","spinner","log","spinner","process","mkdir","readFile","writeFile","dirname","Data","Effect","pipe","path","process","scopeCommand","process","writeJson","exitWithError","fail","run","process","writeJson","fail","run","exitWithError","process","writeJson","parseCsv","exitWithError","fail","run","join","resolve","process","join","process","resolve","process","parseCsv","writeJson","exitWithError","fail","run","cancel","isCancel","log","multiselect","outro","spinner","Data","Effect","pipe","Data","Effect","pipe","multiselect","isCancel","log","cancel","spinner","program","agents","outro","process","writeJson","fail","run","exitWithError","require"]}
|