@braid-cloud/cli 0.1.13 → 0.1.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map 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/braid-workspace.ts","../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/lib/lockfile.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/bundle-store.ts","../src/lib/metadata.ts","../src/lib/rule-writer.ts","../src/lib/skill-writer.ts","../src/commands/list.ts","../src/commands/manage.ts","../src/lib/manage-server.ts","../src/lib/manage-actions.ts","../src/lib/hook-writer.ts","../src/lib/marketplace-api.ts","../src/lib/marketplace-installer.ts","../src/lib/manage-inventory.ts","../src/commands/marketplace.ts","../src/commands/profiles.ts","../src/commands/projects.ts","../src/commands/references.ts","../src/commands/remove.ts","../src/commands/retract.ts","../src/commands/rollback.ts","../src/commands/rules.ts","../src/commands/scaffold.ts","../src/lib/scaffold.ts","../src/commands/update.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, readFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport process from \"node:process\";\n\ninterface PackageJsonShape {\n name?: string;\n}\n\nconst BRAID_WORKSPACE_NAME = \"braid\";\n\nfunction readPackageName(packagePath: string): string | undefined {\n if (!existsSync(packagePath)) {\n return undefined;\n }\n\n try {\n const packageJson = JSON.parse(\n readFileSync(packagePath, \"utf8\")\n ) as PackageJsonShape;\n return packageJson.name;\n } catch {\n return undefined;\n }\n}\n\nfunction isBraidWorkspaceRoot(directory: string): boolean {\n return (\n readPackageName(join(directory, \"package.json\")) === BRAID_WORKSPACE_NAME\n );\n}\n\nexport function findBraidWorkspaceRoot(\n startDir: string = process.cwd()\n): string | undefined {\n let currentDir = startDir;\n\n while (true) {\n if (isBraidWorkspaceRoot(currentDir)) {\n return currentDir;\n }\n\n const parentDir = dirname(currentDir);\n if (parentDir === currentDir) {\n return undefined;\n }\n\n currentDir = parentDir;\n }\n}\n","import { existsSync, readFileSync } 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\";\nimport { findBraidWorkspaceRoot } from \"./braid-workspace.ts\";\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\";\nconst CONVEX_CLOUD_SUFFIX_REGEX = /\\.convex\\.cloud$/;\nconst LOCAL_CONVEX_PORT_REGEX = /:3210$/;\nconst LOCAL_SERVER_ENV_FILES = [\n [\"apps\", \"convex\", \".env.local\"],\n [\"apps\", \"web\", \".env.local\"],\n] as const;\nconst LOOPBACK_HOSTS = new Set([\"127.0.0.1\", \"::1\", \"localhost\"]);\nconst NEWLINE_REGEX = /\\r?\\n/;\nconst TRAILING_SLASHES = /\\/+$/;\n\ninterface braidSkillsConfig {\n apiKey?: string;\n serverUrl?: string;\n demoContext?: DemoContext;\n}\n\ninterface DemoContext {\n sessionId?: string;\n [key: string]: unknown;\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 stripQuotes = (value: string): string => {\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n return value.slice(1, -1);\n }\n\n return value;\n};\n\nconst parseDotenv = (content: string): Record<string, string> => {\n const result: Record<string, string> = {};\n\n for (const rawLine of content.split(NEWLINE_REGEX)) {\n const line = rawLine.trim();\n if (!line || line.startsWith(\"#\")) {\n continue;\n }\n\n const separatorIndex = line.indexOf(\"=\");\n if (separatorIndex <= 0) {\n continue;\n }\n\n const key = line.slice(0, separatorIndex).trim();\n const value = line.slice(separatorIndex + 1).trim();\n result[key] = stripQuotes(value);\n }\n\n return result;\n};\n\nconst normalizeBaseUrl = (rawUrl: string): string => {\n const trimmed = rawUrl.replace(TRAILING_SLASHES, \"\");\n\n try {\n const url = new URL(trimmed);\n if (LOOPBACK_HOSTS.has(url.hostname)) {\n url.hostname = \"localhost\";\n }\n\n return `${url.origin}${url.pathname === \"/\" ? \"\" : url.pathname}`;\n } catch {\n return trimmed;\n }\n};\n\nconst resolveConvexSiteUrl = (convexUrl: string): string => {\n const normalizedConvexUrl = normalizeBaseUrl(convexUrl);\n\n if (normalizedConvexUrl.includes(\".convex.cloud\")) {\n return normalizedConvexUrl.replace(\n CONVEX_CLOUD_SUFFIX_REGEX,\n \".convex.site\"\n );\n }\n\n if (normalizedConvexUrl.match(LOCAL_CONVEX_PORT_REGEX)) {\n return normalizedConvexUrl.replace(LOCAL_CONVEX_PORT_REGEX, \":3211\");\n }\n\n return normalizedConvexUrl;\n};\n\nconst resolveLocalServerUrlFromEnv = (\n env: Record<string, string | undefined>\n): string | undefined => {\n if (env.CONVEX_SITE_URL) {\n return normalizeBaseUrl(env.CONVEX_SITE_URL);\n }\n\n const convexUrl = env.VITE_CONVEX_URL ?? env.CONVEX_URL;\n if (convexUrl) {\n return resolveConvexSiteUrl(convexUrl);\n }\n\n return undefined;\n};\n\nconst resolveLocalServerUrlFromFiles = (\n startDir: string = process.cwd()\n): string | undefined => {\n const workspaceRoot = findBraidWorkspaceRoot(startDir);\n if (!workspaceRoot) {\n return undefined;\n }\n\n for (const envFile of LOCAL_SERVER_ENV_FILES) {\n const envPath = join(workspaceRoot, ...envFile);\n if (!existsSync(envPath)) {\n continue;\n }\n\n const localServerUrl = resolveLocalServerUrlFromEnv(\n parseDotenv(readFileSync(envPath, \"utf8\"))\n );\n if (localServerUrl) {\n return localServerUrl;\n }\n }\n\n return undefined;\n};\n\nconst resolveLocalServerUrl = (\n startDir: string = process.cwd()\n): string | undefined =>\n resolveLocalServerUrlFromEnv(process.env) ??\n resolveLocalServerUrlFromFiles(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: resolveLocalServerUrl() ?? \"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) =>\n config.serverUrl ??\n resolveLocalServerUrl() ??\n \"https://braid.cloud\"\n )\n )\n )\n )\n )\n );\n\nconst clearApiKey = (): Effect.Effect<\n void,\n ConfigReadError | ConfigWriteError\n> =>\n pipe(\n Effect.all({\n globalConfig: loadConfig(),\n userConfig: loadUserConfig(),\n }),\n Effect.flatMap(({ globalConfig, userConfig }) => {\n const { apiKey: _, ...rest } = globalConfig;\n const clearUserToken: Effect.Effect<void, ConfigWriteError> =\n userConfig?.token !== undefined\n ? (() => {\n const { token: _token, ...userRest } = userConfig;\n return pipe(saveUserConfig(userRest), Effect.asVoid);\n })()\n : Effect.void;\n\n return pipe(\n saveConfig(rest),\n Effect.flatMap(() => clearUserToken)\n );\n })\n );\n\nconst getDemoContext = (): Effect.Effect<\n DemoContext | undefined,\n ConfigReadError | ConfigWriteError\n> =>\n pipe(\n loadConfig(),\n Effect.map((config) => config.demoContext)\n );\n\nconst setDemoContext = (\n demoContext: DemoContext\n): Effect.Effect<void, ConfigReadError | ConfigWriteError> =>\n pipe(\n loadConfig(),\n Effect.flatMap((config) => saveConfig({ ...config, demoContext }))\n );\n\nconst clearDemoContext = (): Effect.Effect<\n void,\n ConfigReadError | ConfigWriteError\n> =>\n pipe(\n loadConfig(),\n Effect.flatMap((config) => {\n const { demoContext: _, ...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 persistApiKeyAsync = async (apiKey: string): Promise<void> => {\n await setApiKeyAsync(apiKey);\n\n const existingUserConfig = await loadUserConfigAsync();\n if (existingUserConfig?.token) {\n await saveUserConfigAsync({ ...existingUserConfig, token: apiKey });\n }\n};\n\nconst getServerUrlAsync = (): Promise<string> =>\n Effect.runPromise(getServerUrl());\n\nconst clearApiKeyAsync = (): Promise<void> => Effect.runPromise(clearApiKey());\n\nconst getDemoContextAsync = (): Promise<DemoContext | undefined> =>\n Effect.runPromise(getDemoContext());\n\nconst setDemoContextAsync = (demoContext: DemoContext): Promise<void> =>\n Effect.runPromise(setDemoContext(demoContext));\n\nconst clearDemoContextAsync = (): Promise<void> =>\n Effect.runPromise(clearDemoContext());\n\nexport type {\n braidProjectConfig,\n braidSkillsConfig,\n braidUserConfig,\n DemoContext,\n MergedConfig,\n};\nexport {\n clearDemoContext,\n clearDemoContextAsync,\n clearApiKey,\n clearApiKeyAsync,\n CONFIG_DIR,\n CONFIG_FILE,\n ConfigReadError,\n ConfigWriteError,\n findProjectConfigFile,\n findProjectConfigFileAsync,\n findUserConfigFile,\n findUserConfigFileAsync,\n getDemoContext,\n getDemoContextAsync,\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 persistApiKeyAsync,\n PROJECT_CONFIG_FILENAME,\n resolveLocalServerUrl,\n saveConfig,\n saveConfigAsync,\n saveProjectConfig,\n saveProjectConfigAsync,\n setDemoContext,\n setDemoContextAsync,\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 kind: \"skill\" | \"workflow\";\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 contentHash?: 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 LibraryOption {\n id: string;\n title: string;\n}\n\ninterface LibraryOptionsResponse {\n rules: LibraryOption[];\n}\n\ntype RuleOption = LibraryOption;\ntype RuleOptionsResponse = LibraryOptionsResponse;\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 demo?: boolean;\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 demo?: boolean;\n serverUrl?: string;\n apiKey?: string;\n}\n\ninterface FetchLibraryOptionsInput {\n orgId?: string;\n orgProjects?: string[];\n personalProjects?: string[];\n includeUserGlobal?: boolean;\n includeOrgGlobal?: boolean;\n serverUrl?: string;\n apiKey?: string;\n}\n\ntype FetchRuleOptionsInput = FetchLibraryOptionsInput;\n\ninterface ApiClientOptions {\n serverUrl?: string;\n apiKey?: string;\n demo?: boolean;\n}\n\ninterface DemoSessionResponse {\n sessionId?: string;\n [key: string]: unknown;\n}\n\ntype FetchDemoSessionError = ApiError | AuthenticationError | NetworkError;\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 normalizeApiServerBaseUrl = (serverUrl: string): string => {\n const trimmed = serverUrl.replace(TRAILING_SLASH_REGEX, \"\");\n\n try {\n const url = new URL(trimmed);\n return `${url.origin}${url.pathname === \"/\" ? \"\" : url.pathname}`;\n } catch {\n return trimmed;\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 = normalizeApiServerBaseUrl(serverUrl);\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 if (options.demo !== undefined) {\n url.searchParams.set(\"demo\", String(options.demo));\n }\n\n return url;\n};\n\nconst executeApiRequest = (\n url: URL,\n apiKey: string | undefined,\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 \"Content-Type\": \"application/json\",\n ...(apiKey ? { Authorization: `Bearer ${apiKey}` } : {}),\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 buildLibraryOptionsUrl = (\n serverUrl: string,\n options: FetchLibraryOptionsInput\n): URL => {\n const url = buildApiUrl(serverUrl, \"/api/skills/library-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 fetchLibraryOptions = (\n options: FetchLibraryOptionsInput = {}\n): Effect.Effect<LibraryOptionsResponse, 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(buildLibraryOptionsUrl(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 LibraryOptionsResponse);\n })\n )\n )\n )\n )\n );\n\nconst fetchRuleOptions = (\n options: FetchRuleOptionsInput = {}\n): Effect.Effect<RuleOptionsResponse, FetchSkillsError> =>\n fetchLibraryOptions(options);\n\nconst fetchSkills = (\n options: FetchSkillsOptions\n): Effect.Effect<SkillsExportResponse, FetchSkillsError> =>\n pipe(\n Effect.all({\n apiKey: options.demo\n ? Effect.succeed(options.apiKey)\n : 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: options.demo\n ? Effect.succeed(options.apiKey)\n : 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 \"Content-Type\": \"application/json\",\n ...(apiKey ? { Authorization: `Bearer ${apiKey}` } : {}),\n },\n body: JSON.stringify({ ...request, demo: options.demo }),\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 PublicMetadataResponse {\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\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 version?: number\n): Effect.Effect<PublicMetadataResponse, 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}`);\n if (version !== undefined) {\n url.searchParams.set(\"version\", String(version));\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<PublicMetadataResponse>(response, json)\n )\n )\n )\n );\n};\n\nconst fetchPublicExport = (\n handle: string,\n slug: string,\n ruleIds?: string[],\n serverUrl?: string,\n version?: number\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 if (version !== undefined) {\n url.searchParams.set(\"version\", String(version));\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 version?: number\n): Promise<PublicMetadataResponse> =>\n Effect.runPromise(fetchPublicMetadata(handle, slug, serverUrl, version));\n\nconst fetchPublicExportAsync = (\n handle: string,\n slug: string,\n ruleIds?: string[],\n serverUrl?: string,\n version?: number\n): Promise<SkillsExportResponse> =>\n Effect.runPromise(\n fetchPublicExport(handle, slug, ruleIds, serverUrl, version)\n );\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 fetchLibraryOptionsAsync = (\n options: FetchLibraryOptionsInput = {}\n): Promise<LibraryOptionsResponse> =>\n Effect.runPromise(fetchLibraryOptions(options));\n\nconst fetchRuleOptionsAsync = (\n options: FetchRuleOptionsInput = {}\n): Promise<RuleOptionsResponse> => fetchLibraryOptionsAsync(options);\n\nconst runLifecycleCommandAsync = (\n request: LifecycleCommandRequest,\n options: ApiClientOptions = {}\n): Promise<LifecycleCommandResponse> =>\n Effect.runPromise(runLifecycleCommand(request, options));\n\nconst parseDemoSessionResponse = (\n response: Response,\n json: unknown\n): DemoSessionResponse => {\n if (!response.ok) {\n const errorResponse = json as ApiErrorResponse;\n\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 if (response.status === 404) {\n throw new ApiError({\n message: \"Demo endpoint is not available on this server yet.\",\n code: \"DEMO_ENDPOINT_UNAVAILABLE\",\n status: response.status,\n });\n }\n\n throw new ApiError({\n message: errorResponse.error || \"Failed to fetch demo session\",\n code: errorResponse.code || \"UNKNOWN_ERROR\",\n status: response.status,\n });\n }\n\n if (!json || typeof json !== \"object\") {\n throw new NetworkError({\n message: \"Invalid demo session response from server\",\n });\n }\n\n return json as DemoSessionResponse;\n};\n\nconst fetchDemoSession = (\n options: ApiClientOptions = {}\n): Effect.Effect<DemoSessionResponse, FetchDemoSessionError> =>\n pipe(\n resolveServerUrl(options.serverUrl),\n Effect.flatMap((serverUrl) =>\n Effect.tryPromise({\n try: async (): Promise<DemoSessionResponse> => {\n const apiKey = options.apiKey ?? (await getApiKeyAsync());\n const response = await fetch(\n buildApiUrl(serverUrl, \"/api/demo/session\").toString(),\n {\n method: \"GET\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...(apiKey ? { Authorization: `Bearer ${apiKey}` } : {}),\n },\n }\n );\n\n const json = (await response.json()) as unknown;\n return parseDemoSessionResponse(response, json);\n },\n catch: (error): FetchDemoSessionError => {\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 fetch demo session\",\n cause: error,\n });\n },\n })\n )\n );\n\nconst fetchDemoSessionAsync = (\n options: ApiClientOptions = {}\n): Promise<DemoSessionResponse> => Effect.runPromise(fetchDemoSession(options));\n\nexport type {\n ApiErrorResponse,\n ExportedRule,\n FetchSkillsOptions,\n PublicMetadataResponse,\n Skill,\n SkillFile,\n ScopeOption,\n ScopeOptionsResponse,\n LibraryOption,\n LibraryOptionsResponse,\n RuleOption,\n RuleOptionsResponse,\n DemoSessionResponse,\n LifecycleCommandRequest,\n LifecycleCommandResponse,\n SkillsExportResponse,\n};\nexport {\n ApiError,\n AuthenticationError,\n fetchPublicExport,\n fetchPublicExportAsync,\n fetchPublicMetadata,\n fetchPublicMetadataAsync,\n fetchDemoSession,\n fetchDemoSessionAsync,\n fetchSkills,\n fetchSkillsAsync,\n fetchScopeOptions,\n fetchScopeOptionsAsync,\n fetchLibraryOptions,\n fetchLibraryOptionsAsync,\n fetchRuleOptions,\n fetchRuleOptionsAsync,\n NetworkError,\n NotFoundError,\n RateLimitedError,\n runLifecycleCommand,\n runLifecycleCommandAsync,\n validateApiKey,\n validateApiKeyAsync,\n isTrustedApiServerUrl,\n normalizeApiServerBaseUrl,\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 {\n fetchLibraryOptionsAsync,\n fetchScopeOptionsAsync,\n} 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 {\n value: \"profile\",\n label: \"Profile\",\n hint: \"Use a saved context profile\",\n },\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 libraryOptions = await fetchLibraryOptionsAsync(\n buildLibraryOptionsRequest(\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:\", libraryOptions.rules)\n : undefined;\n const excludedRuleIds =\n filterMode === \"exclude\" || filterMode === \"both\"\n ? await pickRuleIds(\"Select rules to exclude:\", libraryOptions.rules)\n : undefined;\n\n return {\n ...(ruleIds ? { ruleIds } : {}),\n ...(excludedRuleIds ? { excludedRuleIds } : {}),\n };\n}\n\nfunction buildLibraryOptionsRequest(\n organizationContext: OrganizationContext,\n projectIds: string[] | undefined,\n includeUserGlobal: boolean,\n includeOrgGlobal: boolean,\n serverUrl: string,\n apiKey: string | undefined\n): Parameters<typeof fetchLibraryOptionsAsync>[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 { readFile, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { Data, Effect, pipe } from \"effect\";\n\nconst LOCKFILE_FILENAME = \"braid.lock\";\nconst LOCKFILE_VERSION = 1;\n\nconst MARKETPLACE_KEY_REGEX = /^@([a-z0-9-]+)\\/([a-z0-9-]+)@(\\d+)$/;\nconst ORG_KEY_REGEX = /^([a-z0-9-]+)\\/([a-z0-9-]+)@(\\d+)$/;\n\ninterface LockfileEntry {\n source: \"org\" | \"marketplace\";\n entityType: string;\n version: number;\n contentHash: string;\n ruleIds?: string[];\n items?: Record<string, LockfileEntry>;\n}\n\ninterface Lockfile {\n lockfileVersion: number;\n resolved: Record<string, LockfileEntry>;\n}\n\nclass LockfileReadError extends Data.TaggedError(\"LockfileReadError\")<{\n path: string;\n cause: unknown;\n}> {}\n\nclass LockfileWriteError extends Data.TaggedError(\"LockfileWriteError\")<{\n path: string;\n cause: unknown;\n}> {}\n\nclass LockfileVersionError extends Data.TaggedError(\"LockfileVersionError\")<{\n path: string;\n expected: number;\n actual: number;\n}> {}\n\nclass LockfileCorruptError extends Data.TaggedError(\"LockfileCorruptError\")<{\n path: string;\n cause: unknown;\n}> {}\n\nconst getLockfilePath = (dir: string): string => join(dir, LOCKFILE_FILENAME);\n\nconst emptyLockfile = (): Lockfile => ({\n lockfileVersion: LOCKFILE_VERSION,\n resolved: {},\n});\n\nconst readLockfile = (\n dir: string\n): Effect.Effect<\n Lockfile | null,\n LockfileCorruptError | LockfileVersionError\n> => {\n const lockfilePath = getLockfilePath(dir);\n\n return pipe(\n Effect.tryPromise({\n try: () => readFile(lockfilePath, \"utf-8\"),\n catch: () =>\n new LockfileReadError({ path: lockfilePath, cause: \"not found\" }),\n }),\n Effect.catchTag(\"LockfileReadError\", () =>\n Effect.succeed(null as string | null)\n ),\n Effect.flatMap((content) => {\n if (content === null) {\n return Effect.succeed(null as Lockfile | null);\n }\n\n return pipe(\n Effect.try({\n try: () => JSON.parse(content) as Lockfile,\n catch: (cause) =>\n new LockfileCorruptError({ path: lockfilePath, cause }),\n }),\n Effect.flatMap((parsed) => {\n if (parsed.lockfileVersion !== LOCKFILE_VERSION) {\n return Effect.fail(\n new LockfileVersionError({\n path: lockfilePath,\n expected: LOCKFILE_VERSION,\n actual: parsed.lockfileVersion,\n })\n );\n }\n return Effect.succeed(parsed as Lockfile | null);\n })\n );\n })\n );\n};\n\nconst writeLockfile = (\n dir: string,\n lockfile: Lockfile\n): Effect.Effect<void, LockfileWriteError> => {\n const lockfilePath = getLockfilePath(dir);\n\n return Effect.tryPromise({\n try: () =>\n writeFile(\n lockfilePath,\n `${JSON.stringify(lockfile, null, 2)}\\n`,\n \"utf-8\"\n ),\n catch: (cause) => new LockfileWriteError({ path: lockfilePath, cause }),\n });\n};\n\nconst resolveLocked = (\n lockfile: Lockfile,\n key: string\n): LockfileEntry | null => {\n const entry = lockfile.resolved[key];\n if (!entry) {\n return null;\n }\n return entry;\n};\n\nconst upsertLockfileEntry = (\n dir: string,\n key: string,\n entry: LockfileEntry\n): Effect.Effect<\n void,\n LockfileCorruptError | LockfileVersionError | LockfileWriteError\n> =>\n pipe(\n readLockfile(dir),\n Effect.map((existing) => existing ?? emptyLockfile()),\n Effect.map((lockfile) => ({\n ...lockfile,\n resolved: {\n ...lockfile.resolved,\n [key]: entry,\n },\n })),\n Effect.flatMap((lockfile) => writeLockfile(dir, lockfile))\n );\n\nconst removeLockfileEntry = (\n dir: string,\n key: string\n): Effect.Effect<\n void,\n LockfileCorruptError | LockfileVersionError | LockfileWriteError\n> =>\n pipe(\n readLockfile(dir),\n Effect.map((existing) => existing ?? emptyLockfile()),\n Effect.map((lockfile) => {\n const { [key]: _removed, ...rest } = lockfile.resolved;\n return { ...lockfile, resolved: rest };\n }),\n Effect.flatMap((lockfile) => writeLockfile(dir, lockfile))\n );\n\nconst buildLockfileKey = (\n source: \"org\" | \"marketplace\",\n handle: string,\n slug: string,\n version: number\n): string => {\n const prefix = source === \"marketplace\" ? `@${handle}` : handle;\n return `${prefix}/${slug}@${version}`;\n};\n\nconst parseLockfileKey = (\n key: string\n): {\n source: \"org\" | \"marketplace\";\n handle: string;\n slug: string;\n version: number;\n} | null => {\n const marketplaceMatch = key.match(MARKETPLACE_KEY_REGEX);\n if (marketplaceMatch?.[1] && marketplaceMatch[2] && marketplaceMatch[3]) {\n return {\n source: \"marketplace\",\n handle: marketplaceMatch[1],\n slug: marketplaceMatch[2],\n version: Number.parseInt(marketplaceMatch[3], 10),\n };\n }\n\n const orgMatch = key.match(ORG_KEY_REGEX);\n if (orgMatch?.[1] && orgMatch[2] && orgMatch[3]) {\n return {\n source: \"org\",\n handle: orgMatch[1],\n slug: orgMatch[2],\n version: Number.parseInt(orgMatch[3], 10),\n };\n }\n\n return null;\n};\n\nconst readLockfileAsync = (dir: string): Promise<Lockfile | null> =>\n Effect.runPromise(readLockfile(dir));\n\nconst writeLockfileAsync = (dir: string, lockfile: Lockfile): Promise<void> =>\n Effect.runPromise(writeLockfile(dir, lockfile));\n\nconst upsertLockfileEntryAsync = (\n dir: string,\n key: string,\n entry: LockfileEntry\n): Promise<void> => Effect.runPromise(upsertLockfileEntry(dir, key, entry));\n\nconst removeLockfileEntryAsync = (dir: string, key: string): Promise<void> =>\n Effect.runPromise(removeLockfileEntry(dir, key));\n\nexport type { Lockfile, LockfileEntry };\nexport {\n buildLockfileKey,\n emptyLockfile,\n getLockfilePath,\n LOCKFILE_FILENAME,\n LockfileCorruptError,\n LockfileReadError,\n LockfileVersionError,\n LockfileWriteError,\n parseLockfileKey,\n readLockfile,\n readLockfileAsync,\n removeLockfileEntry,\n removeLockfileEntryAsync,\n resolveLocked,\n upsertLockfileEntry,\n upsertLockfileEntryAsync,\n writeLockfile,\n writeLockfileAsync,\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 { manageCommand } from \"./commands/manage.ts\";\nimport {\n marketplaceInstallCommand,\n marketplaceLibraryCommand,\n} from \"./commands/marketplace.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 { retractCommand } from \"./commands/retract.ts\";\nimport { rollbackCommand } from \"./commands/rollback.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 { scaffoldCommand } from \"./commands/scaffold.ts\";\nimport { scopeCommand } from \"./commands/scope.ts\";\nimport { updateCommand } from \"./commands/update.ts\";\n\nconst program = new Command();\n\nprogram\n .name(\"braid\")\n .description(\"Install and manage braid prompt artifacts locally\")\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 prompt artifacts from a profile, project, or public source (@handle/slug[@version])\"\n )\n .argument(\n \"[source]\",\n \"Public source to install from (e.g., @handle/slug or @handle/slug@3)\"\n )\n .option(\"--locked\", \"Install exact versions from braid.lock\")\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(\"manage\")\n .description(\"Open the local braid prompt manager\")\n .option(\"--port <number>\", \"Port override for the local manager\")\n .option(\"--no-open\", \"Start the local server without opening a browser\")\n .option(\"-s, --server <url>\", \"braid server URL override\")\n .option(\"--api-key <token>\", \"API key override\")\n .action(manageCommand);\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(\"scaffold\")\n .description(\n \"Scaffold a GitHub-importable rule, skill, agent, hook, or workflow\"\n )\n .option(\n \"--type <type>\",\n \"Artifact type: skill, rule, agent, hook, or workflow\"\n )\n .option(\"--name <slug>\", \"Artifact name\")\n .option(\"--title <title>\", \"Artifact title\")\n .option(\"--description <description>\", \"Artifact description\")\n .option(\"--linked-skills <list>\", \"Comma-separated linked skill names\")\n .option(\"--skill-ref <name>\", \"Workflow skill reference\")\n .option(\"--agent-ref <name>\", \"Workflow agent reference\")\n .option(\"--workflow-ref <name>\", \"Workflow sub-flow reference\")\n .option(\"--force\", \"Overwrite an existing target file\")\n .option(\"-y, --yes\", \"Skip interactive prompts when possible\")\n .action(scaffoldCommand);\n\nprogram\n .command(\"list\")\n .alias(\"ls\")\n .description(\"List locally installed skill bundles\")\n .option(\"-g, --global\", \"List skills in global directories only\")\n .action(listCommand);\n\nconst marketplace = program\n .command(\"marketplace\")\n .description(\"Browse and install marketplace packs\");\n\nmarketplace\n .command(\"library\")\n .description(\"List marketplace packs in your library\")\n .option(\"-s, --server <url>\", \"braid server URL (for review apps, local dev)\")\n .option(\"--api-key <token>\", \"API key override\")\n .action(marketplaceLibraryCommand);\n\nmarketplace\n .command(\"install\")\n .description(\"Install a marketplace pack by slug\")\n .argument(\"<slug>\", \"Marketplace pack slug\")\n .option(\"-s, --server <url>\", \"braid server URL (for review apps, local dev)\")\n .option(\"--api-key <token>\", \"API key override\")\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(\n \"--allow-hooks\",\n \"Allow marketplace packs to install executable Claude Code hooks\"\n )\n .option(\"-y, --yes\", \"Skip confirmation prompts\")\n .action((slug, options) => marketplaceInstallCommand(slug, options));\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(\"Browse skills available to install from braid\");\n\nskills\n .command(\"list\")\n .description(\"List skills available in 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(\"--demo\", \"Fetch public demo content without authentication\")\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\n .command(\"sub-agents\")\n .description(\"Manage sub-agent artifacts\");\n\nagents\n .command(\"list\")\n .description(\"List saved sub-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 a sub-agent by id\")\n .requiredOption(\"--id <id>\", \"Sub-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 a sub-agent\")\n .requiredOption(\"--name <name>\", \"Sub-agent name\")\n .requiredOption(\"--description <description>\", \"Sub-agent description\")\n .requiredOption(\"--prompt <prompt>\", \"Sub-agent system prompt\")\n .option(\"--scope <scope>\", \"Scope: global or project\")\n .option(\"--project-id <id>\", \"Project ID for project-scoped sub-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 a sub-agent\")\n .requiredOption(\"--id <id>\", \"Sub-agent ID\")\n .option(\"--name <name>\", \"Sub-agent name\")\n .option(\"--description <description>\", \"Sub-agent description\")\n .option(\"--prompt <prompt>\", \"Sub-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 a sub-agent\")\n .requiredOption(\"--id <id>\", \"Sub-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 sub-agent to local coding tools\")\n .requiredOption(\"--id <id>\", \"Sub-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(\"rollback\")\n .description(\"Roll back a versioned entity to its previous published version\")\n .argument(\"<source>\", \"Entity to roll back (e.g., @handle/slug)\")\n .option(\"-s, --server <url>\", \"braid server URL (for review apps, local dev)\")\n .action((source, options) => rollbackCommand(source, options));\n\nprogram\n .command(\"retract\")\n .alias(\"unpin\")\n .description(\n \"Unpin a locally locked version from braid.lock (does not retract from the server)\"\n )\n .argument(\"<source>\", \"Entity and version to retract (e.g., @handle/slug@3)\")\n .option(\"-s, --server <url>\", \"braid server URL (for review apps, local dev)\")\n .action((source, options) => retractCommand(source, options));\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.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(\"sub-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(\"sub-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(\"sub-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(\"sub-agents create requires --name\");\n const description =\n options.description ?? fail(\"sub-agents create requires --description\");\n const prompt =\n options.prompt ?? fail(\"sub-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(\"sub-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(\"sub-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(\"sub-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(\"sub-agents remove requires --id\");\n if (!options.yes) {\n fail(\"sub-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(\"sub-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(\"sub-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(\"sub-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.catch((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\ninterface AgentConfig {\n id: AgentId;\n name: string;\n projectPath: string;\n globalPath: string;\n hookProjectConfigPath?: string;\n hookGlobalConfigPath?: string;\n agentsProjectPath?: string;\n agentsGlobalPath?: string;\n projectMarkerPath?: string;\n globalMarkerPath?: string;\n rulesProjectPath?: string;\n rulesGlobalPath?: string;\n ruleFormat?: RuleFormat;\n}\n\nconst home = homedir();\n\nconst AGENTS: AgentConfig[] = [\n {\n id: \"amp\",\n name: \"Amp\",\n projectPath: \".agents/skills\",\n globalPath: join(home, \".config\", \"agents\", \"skills\"),\n },\n {\n id: \"kimi-cli\",\n name: \"Kimi Code CLI\",\n projectPath: \".agents/skills\",\n globalPath: join(home, \".config\", \"agents\", \"skills\"),\n },\n {\n id: \"antigravity\",\n name: \"Antigravity\",\n projectPath: \".agent/skills\",\n globalPath: join(home, \".gemini\", \"antigravity\", \"global_skills\"),\n },\n {\n id: \"claude-code\",\n name: \"Claude Code\",\n projectPath: \".claude/skills\",\n globalPath: join(home, \".claude\", \"skills\"),\n hookProjectConfigPath: \".claude/settings.json\",\n hookGlobalConfigPath: join(home, \".claude\", \"settings.json\"),\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 },\n {\n id: \"claude-desktop\",\n name: \"Claude Desktop\",\n projectPath: \"\",\n globalPath: \"\",\n },\n {\n id: \"moltbot\",\n name: \"Moltbot\",\n projectPath: \"skills\",\n globalPath: join(home, \".moltbot\", \"skills\"),\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 },\n {\n id: \"codebuddy\",\n name: \"CodeBuddy\",\n projectPath: \".codebuddy/skills\",\n globalPath: join(home, \".codebuddy\", \"skills\"),\n },\n {\n id: \"codex\",\n name: \"Codex\",\n projectPath: \".codex/skills\",\n globalPath: join(home, \".codex\", \"skills\"),\n },\n {\n id: \"command-code\",\n name: \"Command Code\",\n projectPath: \".commandcode/skills\",\n globalPath: join(home, \".commandcode\", \"skills\"),\n },\n {\n id: \"continue\",\n name: \"Continue\",\n projectPath: \".continue/skills\",\n globalPath: join(home, \".continue\", \"skills\"),\n },\n {\n id: \"crush\",\n name: \"Crush\",\n projectPath: \".crush/skills\",\n globalPath: join(home, \".config\", \"crush\", \"skills\"),\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 },\n {\n id: \"droid\",\n name: \"Droid\",\n projectPath: \".factory/skills\",\n globalPath: join(home, \".factory\", \"skills\"),\n },\n {\n id: \"gemini-cli\",\n name: \"Gemini CLI\",\n projectPath: \".gemini/skills\",\n globalPath: join(home, \".gemini\", \"skills\"),\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 },\n {\n id: \"goose\",\n name: \"Goose\",\n projectPath: \".goose/skills\",\n globalPath: join(home, \".config\", \"goose\", \"skills\"),\n },\n {\n id: \"junie\",\n name: \"Junie\",\n projectPath: \".junie/skills\",\n globalPath: join(home, \".junie\", \"skills\"),\n },\n {\n id: \"kilo\",\n name: \"Kilo Code\",\n projectPath: \".kilocode/skills\",\n globalPath: join(home, \".kilocode\", \"skills\"),\n },\n {\n id: \"kiro-cli\",\n name: \"Kiro CLI\",\n projectPath: \".kiro/skills\",\n globalPath: join(home, \".kiro\", \"skills\"),\n },\n {\n id: \"kode\",\n name: \"Kode\",\n projectPath: \".kode/skills\",\n globalPath: join(home, \".kode\", \"skills\"),\n },\n {\n id: \"mcpjam\",\n name: \"MCPJam\",\n projectPath: \".mcpjam/skills\",\n globalPath: join(home, \".mcpjam\", \"skills\"),\n },\n {\n id: \"mux\",\n name: \"Mux\",\n projectPath: \".mux/skills\",\n globalPath: join(home, \".mux\", \"skills\"),\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 },\n {\n id: \"openhands\",\n name: \"OpenHands\",\n projectPath: \".openhands/skills\",\n globalPath: join(home, \".openhands\", \"skills\"),\n },\n {\n id: \"pi\",\n name: \"Pi\",\n projectPath: \".pi/skills\",\n globalPath: join(home, \".pi\", \"agent\", \"skills\"),\n },\n {\n id: \"qoder\",\n name: \"Qoder\",\n projectPath: \".qoder/skills\",\n globalPath: join(home, \".qoder\", \"skills\"),\n },\n {\n id: \"qwen-code\",\n name: \"Qwen Code\",\n projectPath: \".qwen/skills\",\n globalPath: join(home, \".qwen\", \"skills\"),\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 },\n {\n id: \"trae\",\n name: \"Trae\",\n projectPath: \".trae/skills\",\n globalPath: join(home, \".trae\", \"skills\"),\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 },\n {\n id: \"zencoder\",\n name: \"Zencoder\",\n projectPath: \".zencoder/skills\",\n globalPath: join(home, \".zencoder\", \"skills\"),\n },\n {\n id: \"neovate\",\n name: \"Neovate\",\n projectPath: \".neovate/skills\",\n globalPath: join(home, \".neovate\", \"skills\"),\n },\n {\n id: \"pochi\",\n name: \"Pochi\",\n projectPath: \".pochi/skills\",\n globalPath: join(home, \".pochi\", \"skills\"),\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 },\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 resolveHookConfigPath = (\n agent: AgentConfig,\n options: { global?: boolean; projectRoot?: string }\n): string | undefined => {\n if (options.global) {\n return agent.hookGlobalConfigPath;\n }\n if (!agent.hookProjectConfigPath) {\n return undefined;\n }\n const cwd = options.projectRoot ?? process.cwd();\n return join(cwd, agent.hookProjectConfigPath);\n};\n\nexport type {\n AgentConfig,\n AgentId,\n DetectedAgent,\n InstalledAgent,\n ResolvedAgentsResult,\n RuleFormat,\n};\nexport {\n AGENTS,\n detectAgents,\n detectAgentsAsync,\n detectInstalledAgents,\n detectInstalledAgentsAsync,\n directoryExists,\n directoryExistsAsync,\n getAgentById,\n getAllAgentIds,\n resolveAgentsInstallPath,\n resolveHookConfigPath,\n resolveAgents,\n resolveAgentsAsync,\n resolveInstallPath,\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 persistApiKeyAsync,\n USER_CONFIG_FILENAME,\n} from \"../lib/config.ts\";\nimport {\n buildAuthVerificationUrlFromBaseUrl,\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_\";\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 persistApiKeyAsync(apiKey);\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 = buildAuthVerificationUrlFromBaseUrl(\n authConfig.verificationBaseUrl,\n deviceAuth.user_code\n );\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 persistApiKeyAsync(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 { existsSync, readFileSync } from \"node:fs\";\nimport { hostname, platform } from \"node:os\";\nimport { join } from \"node:path\";\nimport process from \"node:process\";\nimport { findBraidWorkspaceRoot } from \"./braid-workspace.ts\";\n\nconst TRAILING_SLASHES = /\\/+$/;\nconst LEGACY_BRAID_AUTH_HOSTS = new Set([\n \"api.braid.cloud\",\n \"braid.cloud\",\n \"www.braid.cloud\",\n]);\nconst BRAID_APP_HOST = \"app.braid.cloud\";\nconst DEFAULT_BRAID_AUTH_HOSTS = new Set([\n ...LEGACY_BRAID_AUTH_HOSTS,\n BRAID_APP_HOST,\n]);\nconst LOOPBACK_HOSTS = new Set([\"127.0.0.1\", \"::1\", \"localhost\"]);\nconst LOCAL_AUTH_ENV_FILES = [\n [\"apps\", \"web\", \".env.local\"],\n [\"apps\", \"convex\", \".env.local\"],\n] as const;\nconst LOCAL_AUTH_ENV_KEYS = [\"APP_URL\", \"SITE_URL\"] as const;\nconst NEWLINE_REGEX = /\\r?\\n/;\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 verificationBaseUrl: 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\nconst normalizeBaseUrl = (rawUrl: string): string => {\n const trimmed = rawUrl.replace(TRAILING_SLASHES, \"\");\n\n try {\n const url = new URL(trimmed);\n return `${url.origin}${url.pathname === \"/\" ? \"\" : url.pathname}`;\n } catch {\n return trimmed;\n }\n};\n\nconst normalizeLoopbackBaseUrl = (rawUrl: string): string => {\n const normalized = normalizeBaseUrl(rawUrl);\n\n try {\n const url = new URL(normalized);\n if (isLoopbackHost(url.hostname)) {\n url.hostname = \"localhost\";\n }\n\n return `${url.origin}${url.pathname === \"/\" ? \"\" : url.pathname}`;\n } catch {\n return normalized;\n }\n};\n\nconst isLoopbackHost = (hostname: string): boolean =>\n LOOPBACK_HOSTS.has(hostname);\n\nconst isLoopbackUrl = (rawUrl: string): boolean => {\n try {\n return isLoopbackHost(new URL(rawUrl).hostname);\n } catch {\n return false;\n }\n};\n\nconst stripQuotes = (value: string): string => {\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n return value.slice(1, -1);\n }\n\n return value;\n};\n\nconst parseDotenv = (content: string): Record<string, string> => {\n const result: Record<string, string> = {};\n\n for (const rawLine of content.split(NEWLINE_REGEX)) {\n const line = rawLine.trim();\n if (!line || line.startsWith(\"#\")) {\n continue;\n }\n\n const separatorIndex = line.indexOf(\"=\");\n if (separatorIndex <= 0) {\n continue;\n }\n\n const key = line.slice(0, separatorIndex).trim();\n const value = line.slice(separatorIndex + 1).trim();\n result[key] = stripQuotes(value);\n }\n\n return result;\n};\n\nconst resolveLocalAuthWebBaseUrlFromEnv = (\n env: Record<string, string | undefined>\n): string | undefined => {\n for (const key of LOCAL_AUTH_ENV_KEYS) {\n const value = env[key];\n if (value && isLoopbackUrl(value)) {\n return normalizeLoopbackBaseUrl(value);\n }\n }\n\n return undefined;\n};\n\nconst resolveLocalAuthWebBaseUrlFromFiles = (): string | undefined => {\n const workspaceRoot = findBraidWorkspaceRoot();\n\n if (!workspaceRoot) {\n return undefined;\n }\n\n for (const envFile of LOCAL_AUTH_ENV_FILES) {\n const envPath = join(workspaceRoot, ...envFile);\n if (!existsSync(envPath)) {\n continue;\n }\n\n const localAppUrl = resolveLocalAuthWebBaseUrlFromEnv(\n parseDotenv(readFileSync(envPath, \"utf8\"))\n );\n if (localAppUrl) {\n return localAppUrl;\n }\n }\n\n return undefined;\n};\n\nconst resolveLocalAuthWebBaseUrl = (): string | undefined =>\n resolveLocalAuthWebBaseUrlFromEnv(process.env) ??\n resolveLocalAuthWebBaseUrlFromFiles();\n\nconst normalizeServerBaseUrl = (serverUrl: string): string => {\n const trimmed = normalizeBaseUrl(serverUrl);\n\n try {\n const url = new URL(trimmed);\n return `${url.origin}${url.pathname === \"/\" ? \"\" : url.pathname}`;\n } catch {\n return trimmed;\n }\n};\n\nconst resolveCanonicalAuthWebBaseUrl = (serverUrl: string): string => {\n const normalized = normalizeServerBaseUrl(serverUrl);\n\n try {\n const url = new URL(normalized);\n\n if (LEGACY_BRAID_AUTH_HOSTS.has(url.hostname)) {\n url.hostname = BRAID_APP_HOST;\n url.pathname = \"/\";\n }\n\n return `${url.origin}${url.pathname === \"/\" ? \"\" : url.pathname}`;\n } catch {\n return normalized;\n }\n};\n\nconst isHostedBraidAuthServer = (serverUrl: string): boolean => {\n try {\n return DEFAULT_BRAID_AUTH_HOSTS.has(\n new URL(normalizeServerBaseUrl(serverUrl)).hostname\n );\n } catch {\n return false;\n }\n};\n\nexport function resolveAuthWebBaseUrl(serverUrl: string): string {\n const canonicalBaseUrl = resolveCanonicalAuthWebBaseUrl(serverUrl);\n\n try {\n const url = new URL(canonicalBaseUrl);\n const localAuthBaseUrl = resolveLocalAuthWebBaseUrl();\n\n if (\n localAuthBaseUrl &&\n (DEFAULT_BRAID_AUTH_HOSTS.has(url.hostname) ||\n isLoopbackHost(url.hostname))\n ) {\n return localAuthBaseUrl;\n }\n\n return `${url.origin}${url.pathname === \"/\" ? \"\" : url.pathname}`;\n } catch {\n return canonicalBaseUrl;\n }\n}\n\nexport function buildAuthVerificationUrlFromBaseUrl(\n authBaseUrl: string,\n userCode: string\n): string {\n return `${authBaseUrl.replace(TRAILING_SLASHES, \"\")}/cli/authorize?user_code=${encodeURIComponent(userCode)}`;\n}\n\nexport function buildAuthVerificationUrl(\n serverUrl: string,\n userCode: string\n): string {\n return buildAuthVerificationUrlFromBaseUrl(\n resolveAuthWebBaseUrl(serverUrl),\n userCode\n );\n}\n\nasync function fetchAuthConfigFromBaseUrl(\n authBaseUrl: string\n): Promise<AuthConfig> {\n const response = await fetch(`${authBaseUrl}/api/cli/auth-config`);\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 {\n ...(await (response.json() as Promise<\n Omit<AuthConfig, \"verificationBaseUrl\">\n >)),\n verificationBaseUrl: authBaseUrl,\n };\n}\n\nexport async function fetchAuthConfig(serverUrl: string): Promise<AuthConfig> {\n const authBaseUrl = resolveAuthWebBaseUrl(serverUrl).replace(\n TRAILING_SLASHES,\n \"\"\n );\n const canonicalAuthBaseUrl = resolveCanonicalAuthWebBaseUrl(\n serverUrl\n ).replace(TRAILING_SLASHES, \"\");\n try {\n return await fetchAuthConfigFromBaseUrl(authBaseUrl);\n } catch (error) {\n if (\n authBaseUrl !== canonicalAuthBaseUrl &&\n isHostedBraidAuthServer(serverUrl)\n ) {\n return fetchAuthConfigFromBaseUrl(canonicalAuthBaseUrl);\n }\n\n throw error;\n }\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 fetchLibraryOptionsAsync,\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 demo?: boolean;\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 fetchLibraryOptionsAsync(\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 applyOptionalBoolean(request, \"demo\", options.demo);\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 {\n getBundleStoreRoot,\n getDisabledStoreRoot,\n} from \"../lib/bundle-store.ts\";\nimport type { MergedConfig } from \"../lib/config.ts\";\nimport { loadMergedConfigAsync } from \"../lib/config.ts\";\nimport {\n buildLockfileKey,\n readLockfileAsync,\n writeLockfileAsync,\n} from \"../lib/lockfile.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 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 locked?: boolean;\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<{\n skillsWritten: number;\n workflowsWritten: number;\n errors: number;\n}> {\n if (response.skills.length === 0 || !agent.projectPath) {\n return { skillsWritten: 0, workflowsWritten: 0, errors: 0 };\n }\n\n const result = await writeSkillsAsync(\n installPath,\n response.skills,\n agent.id,\n {\n disabledRoot: getDisabledStoreRoot(),\n storeRoot: getBundleStoreRoot(),\n }\n );\n\n for (const err of result.errors) {\n log.warn(` Failed skill: ${err.skill} - ${err.error}`);\n }\n\n const { skillsWritten, workflowsWritten } = countWrittenBundles(\n response.skills,\n result.written\n );\n\n return { skillsWritten, workflowsWritten, 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 countWrittenBundles(\n bundles: SkillsExportResponse[\"skills\"],\n writtenNames: string[]\n): { skillsWritten: number; workflowsWritten: number } {\n let skillsWritten = 0;\n let workflowsWritten = 0;\n\n for (const name of writtenNames) {\n const bundle = bundles.find((skill) => skill.name === name);\n if ((bundle?.kind ?? \"skill\") === \"workflow\") {\n workflowsWritten += 1;\n } else {\n skillsWritten += 1;\n }\n }\n\n return { skillsWritten, workflowsWritten };\n}\n\nfunction formatInstallSummary(\n agentName: string,\n skillsWritten: number,\n workflowsWritten: number,\n rulesWritten: number\n): string {\n const parts: string[] = [];\n if (skillsWritten > 0) {\n parts.push(`${skillsWritten} skills`);\n }\n if (workflowsWritten > 0) {\n parts.push(\n `${workflowsWritten} workflow${workflowsWritten === 1 ? \"\" : \"s\"}`\n );\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 : { skillsWritten: 0, workflowsWritten: 0, errors: 0 };\n const rules = await installRulesToAgent(agent, response, options);\n\n const totalWritten =\n skills.skillsWritten + skills.workflowsWritten + 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(\n agent.name,\n skills.skillsWritten,\n skills.workflowsWritten,\n rules.written\n )\n );\n }\n\n if (response.skills.length > 0 && installPath) {\n await updateMetadataAsync(\n installPath,\n response.skills.map((s) => ({\n kind: s.kind ?? \"skill\",\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-]+)(?:@(\\d+))?$/;\n\nfunction parsePublicSource(source: string): {\n handle: string;\n slug: string;\n version: number | undefined;\n} | null {\n const match = source.match(PUBLIC_SOURCE_REGEX);\n if (!(match?.[1] && match[2])) {\n return null;\n }\n return {\n handle: match[1],\n slug: match[2],\n version: match[3] ? Number.parseInt(match[3], 10) : undefined,\n };\n}\n\nfunction displayPublicMetadata(metadata: PublicMetadataResponse): void {\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}\n\nasync function selectPublicRules(\n metadata: PublicMetadataResponse,\n options: InstallOptions\n): Promise<string[]> {\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\nfunction summarizeContent(response: SkillsExportResponse): string {\n const ruleCount = response.rules?.length ?? 0;\n const skillCount = response.skills.filter(\n (skill) => (skill.kind ?? \"skill\") === \"skill\"\n ).length;\n const workflowCount = response.skills.filter(\n (skill) => (skill.kind ?? \"skill\") === \"workflow\"\n ).length;\n const parts: string[] = [];\n if (skillCount > 0) {\n parts.push(`${skillCount} skills`);\n }\n if (workflowCount > 0) {\n parts.push(`${workflowCount} workflow${workflowCount === 1 ? \"\" : \"s\"}`);\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 version: number | undefined,\n lockedRuleIds: string[] | undefined,\n options: InstallOptions,\n installSpinner: ReturnType<typeof spinner>\n): Promise<{ response: SkillsExportResponse; ruleIds: string[] }> {\n if (version !== undefined && lockedRuleIds) {\n installSpinner.stop(`Installing pinned version v${version}`);\n installSpinner.start(\"Downloading content...\");\n return {\n response: await fetchPublicExportAsync(\n handle,\n slug,\n lockedRuleIds,\n options.server,\n version\n ),\n ruleIds: lockedRuleIds,\n };\n }\n\n const metadata = await fetchPublicMetadataAsync(\n handle,\n slug,\n options.server,\n version\n );\n\n installSpinner.stop(\"Found public content\");\n displayPublicMetadata(metadata);\n\n const ruleIds = lockedRuleIds ?? (await selectPublicRules(metadata, options));\n\n installSpinner.start(\"Downloading content...\");\n return {\n response: await fetchPublicExportAsync(\n handle,\n slug,\n ruleIds,\n options.server,\n version\n ),\n ruleIds,\n };\n}\n\nasync function resolveLockedInstall(\n handle: string,\n slug: string\n): Promise<{ version: number; ruleIds: string[] | undefined } | null> {\n const lockfile = await readLockfileAsync(process.cwd());\n if (!lockfile) {\n return null;\n }\n let latestEntry: {\n version: number;\n ruleIds: string[] | undefined;\n } | null = null;\n for (const [key, entry] of Object.entries(lockfile.resolved)) {\n if (\n entry.source === \"marketplace\" &&\n key.startsWith(`@${handle}/${slug}@`) &&\n (latestEntry === null || entry.version > latestEntry.version)\n ) {\n latestEntry = {\n version: entry.version,\n ruleIds: entry.ruleIds,\n };\n }\n }\n return latestEntry;\n}\n\nasync function writeLockfileAfterInstall(\n handle: string,\n slug: string,\n version: number,\n contentHash: string,\n ruleIds: string[] | undefined\n): Promise<void> {\n const lockfileKey = buildLockfileKey(\"marketplace\", handle, slug, version);\n try {\n const lockfile = await readLockfileAsync(process.cwd());\n const resolved = { ...(lockfile?.resolved ?? {}) };\n\n for (const key of Object.keys(resolved)) {\n const entry = resolved[key];\n if (\n entry &&\n entry.source === \"marketplace\" &&\n key.startsWith(`@${handle}/${slug}@`) &&\n key !== lockfileKey\n ) {\n delete resolved[key];\n }\n }\n\n resolved[lockfileKey] = {\n source: \"marketplace\",\n entityType: \"skill\",\n version,\n contentHash,\n ruleIds,\n };\n\n await writeLockfileAsync(process.cwd(), {\n lockfileVersion: 1,\n resolved,\n });\n log.info(`Pinned ${lockfileKey} in braid.lock`);\n } catch {\n log.warn(\"Could not update braid.lock\");\n }\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(\n \"Expected format: @handle/slug or @handle/slug@version (e.g., @acme/coding-standards@3)\"\n );\n process.exit(1);\n }\n\n let { handle, slug, version } = parsed;\n let lockedRuleIds: string[] | undefined;\n\n if (options.locked) {\n const lockedInstall = await resolveLockedInstall(handle, slug);\n if (lockedInstall === null) {\n log.error(\n `No locked version for @${handle}/${slug}. Run 'braid install @${handle}/${slug}@<version>' first to pin one.`\n );\n process.exit(1);\n }\n version = lockedInstall.version;\n lockedRuleIds = lockedInstall.ruleIds;\n log.info(`Using locked version: v${version}`);\n }\n\n const versionSuffix = version !== undefined ? `@${version}` : \"\";\n intro(`Installing from @${handle}/${slug}${versionSuffix}`);\n\n const installSpinner = spinner();\n installSpinner.start(\"Fetching public content...\");\n\n try {\n const { response, ruleIds } = await fetchPublicContent(\n handle,\n slug,\n version,\n lockedRuleIds,\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 if (totalWritten > 0 && version !== undefined) {\n await writeLockfileAfterInstall(\n handle,\n slug,\n version,\n response.contentHash ?? response.version,\n ruleIds\n );\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\nasync function installAllLockedEntries(options: InstallOptions): Promise<void> {\n const lockfile = await readLockfileAsync(process.cwd());\n if (!lockfile || Object.keys(lockfile.resolved).length === 0) {\n log.error(\n \"No braid.lock found or lockfile is empty. Install a versioned source first (e.g., braid install @handle/slug@3).\"\n );\n process.exit(1);\n }\n\n intro(\"Installing all locked versions from braid.lock\");\n\n for (const [key, entry] of Object.entries(lockfile.resolved)) {\n if (entry.source !== \"marketplace\") {\n log.warn(`Skipping ${key} — only marketplace sources supported`);\n continue;\n }\n\n const { parseLockfileKey: parseLk } = await import(\"../lib/lockfile.ts\");\n const parsed = parseLk(key);\n if (!parsed) {\n log.warn(`Skipping invalid lockfile key: ${key}`);\n continue;\n }\n\n const source = `@${parsed.handle}/${parsed.slug}@${parsed.version}`;\n await publicInstallCommand(source, {\n ...options,\n locked: true,\n });\n }\n\n outro(\"All locked versions installed.\");\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\n if (options.locked) {\n return installAllLockedEntries(options);\n }\n\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 { createHash } from \"node:crypto\";\nimport {\n mkdir,\n readdir,\n readFile,\n rename,\n rm,\n writeFile,\n} from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { basename, dirname, join, resolve } from \"node:path\";\nimport type { AgentId } from \"./agents.ts\";\n\nconst BRAID_CONFIG_DIR = join(homedir(), \".config\", \"braid\");\nconst DEFAULT_STORE_ROOT = join(BRAID_CONFIG_DIR, \"store\", \"skills\");\nconst DEFAULT_DISABLED_ROOT = join(BRAID_CONFIG_DIR, \".disabled\");\nconst METADATA_FILENAME = \"meta.json\";\n\ntype BundleSurface = \"skills\" | \"agents\" | \"hooks\" | \"rules\";\ntype BundleScope = \"project\" | \"global\";\n\ninterface DisabledBundleRecord {\n id: string;\n agentId: AgentId;\n disabledPath: string;\n displayName: string;\n originalPath: string;\n payloadPath: string;\n scope: BundleScope;\n surface: BundleSurface;\n}\n\ninterface DisableBundleOptions {\n agentId: AgentId;\n bundlePath: string;\n disabledRoot?: string;\n scope: BundleScope;\n surface: BundleSurface;\n}\n\ninterface BundleStoreResolveOptions {\n disabledRoot?: string;\n}\n\nconst sanitizeSegment = (value: string): string =>\n value\n .toLowerCase()\n .replace(/[^a-z0-9-]+/g, \"-\")\n .replace(/-+/g, \"-\")\n .replace(/^-|-$/g, \"\") || \"bundle\";\n\nconst buildRecordId = (originalPath: string): string =>\n createHash(\"sha256\").update(resolve(originalPath)).digest(\"hex\").slice(0, 12);\n\nconst getBundleStoreRoot = (): string =>\n process.env.BRAID_STORE_ROOT ?? DEFAULT_STORE_ROOT;\n\nconst getDisabledStoreRoot = (): string =>\n process.env.BRAID_DISABLED_ROOT ?? DEFAULT_DISABLED_ROOT;\n\nconst buildDisabledBundlePath = (\n originalPath: string,\n displayName: string,\n agentId: AgentId,\n scope: BundleScope,\n surface: BundleSurface,\n disabledRoot: string\n): string =>\n join(\n disabledRoot,\n scope,\n agentId,\n surface,\n `${sanitizeSegment(displayName)}-${buildRecordId(originalPath)}`\n );\n\nconst toMetadataPath = (disabledPath: string): string =>\n join(disabledPath, METADATA_FILENAME);\n\nconst payloadPath = (disabledPath: string): string =>\n join(disabledPath, \"payload\");\n\nconst readDisabledRecord = async (\n metadataPath: string\n): Promise<DisabledBundleRecord | null> => {\n try {\n const raw = await readFile(metadataPath, \"utf-8\");\n return JSON.parse(raw) as DisabledBundleRecord;\n } catch {\n return null;\n }\n};\n\nasync function listMetadataFiles(root: string): Promise<string[]> {\n const entries = await readdir(root, { withFileTypes: true });\n const results: string[] = [];\n\n for (const entry of entries) {\n const entryPath = join(root, entry.name);\n if (entry.isDirectory()) {\n results.push(...(await listMetadataFiles(entryPath)));\n continue;\n }\n\n if (entry.isFile() && entry.name === METADATA_FILENAME) {\n results.push(entryPath);\n }\n }\n\n return results;\n}\n\nconst listDisabledBundlesAsync = async (\n options: BundleStoreResolveOptions = {}\n): Promise<DisabledBundleRecord[]> => {\n const disabledRoot = options.disabledRoot ?? getDisabledStoreRoot();\n\n try {\n const metadataFiles = await listMetadataFiles(disabledRoot);\n const records = await Promise.all(\n metadataFiles.map((metadataPath) => readDisabledRecord(metadataPath))\n );\n\n return records.filter(\n (record): record is DisabledBundleRecord => record !== null\n );\n } catch {\n return [];\n }\n};\n\nconst findDisabledBundleByOriginalPathAsync = async (\n originalPath: string,\n options: BundleStoreResolveOptions = {}\n): Promise<DisabledBundleRecord | null> => {\n const resolvedOriginalPath = resolve(originalPath);\n const records = await listDisabledBundlesAsync(options);\n return (\n records.find(\n (record) => resolve(record.originalPath) === resolvedOriginalPath\n ) ?? null\n );\n};\n\nconst resolveManagedBundlePathAsync = async (\n originalPath: string,\n options: BundleStoreResolveOptions = {}\n): Promise<string> => {\n const disabledRecord = await findDisabledBundleByOriginalPathAsync(\n originalPath,\n options\n );\n return disabledRecord?.payloadPath ?? originalPath;\n};\n\nconst disableBundleAsync = async (\n options: DisableBundleOptions\n): Promise<DisabledBundleRecord> => {\n const resolvedBundlePath = resolve(options.bundlePath);\n const disabledRoot = options.disabledRoot ?? getDisabledStoreRoot();\n const displayName = basename(resolvedBundlePath);\n const disabledPath = buildDisabledBundlePath(\n resolvedBundlePath,\n displayName,\n options.agentId,\n options.scope,\n options.surface,\n disabledRoot\n );\n\n await rm(disabledPath, { recursive: true, force: true });\n await mkdir(disabledPath, { recursive: true });\n\n const record: DisabledBundleRecord = {\n agentId: options.agentId,\n disabledPath,\n displayName,\n id: buildRecordId(resolvedBundlePath),\n originalPath: resolvedBundlePath,\n payloadPath: payloadPath(disabledPath),\n scope: options.scope,\n surface: options.surface,\n };\n\n await rename(resolvedBundlePath, record.payloadPath);\n await writeFile(\n toMetadataPath(disabledPath),\n JSON.stringify(record, null, 2),\n \"utf-8\"\n );\n\n return record;\n};\n\nconst enableBundleAsync = async (\n originalPath: string,\n options: BundleStoreResolveOptions = {}\n): Promise<DisabledBundleRecord> => {\n const record = await findDisabledBundleByOriginalPathAsync(\n originalPath,\n options\n );\n if (!record) {\n throw new Error(`No disabled bundle found for ${originalPath}`);\n }\n\n await mkdir(dirname(record.originalPath), { recursive: true });\n await rm(record.originalPath, { recursive: true, force: true });\n await rename(record.payloadPath, record.originalPath);\n await rm(record.disabledPath, { recursive: true, force: true });\n\n return record;\n};\n\nconst removePathAsync = async (targetPath: string): Promise<void> => {\n await rm(targetPath, { recursive: true, force: true });\n};\n\nexport type {\n BundleScope,\n BundleSurface,\n DisabledBundleRecord,\n DisableBundleOptions,\n};\nexport {\n disableBundleAsync,\n enableBundleAsync,\n findDisabledBundleByOriginalPathAsync,\n getBundleStoreRoot,\n getDisabledStoreRoot,\n listDisabledBundlesAsync,\n removePathAsync,\n resolveManagedBundlePathAsync,\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\ntype InstalledSkillSource =\n | {\n type: \"profile\" | \"projects\";\n name: string;\n orgProjects?: string[];\n personalProjects?: string[];\n }\n | {\n type: \"marketplace\";\n name: string;\n slug: string;\n title?: string;\n skillSetId?: string;\n versionId?: string;\n };\n\ninterface InstalledSkill {\n kind: \"skill\" | \"workflow\";\n name: string;\n source: InstalledSkillSource;\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 normalizeInstalledSkill = (\n skill: Omit<InstalledSkill, \"kind\"> & { kind?: InstalledSkill[\"kind\"] }\n): InstalledSkill => ({\n kind: skill.kind ?? \"skill\",\n name: skill.name,\n source: skill.source,\n version: skill.version,\n installedAt: skill.installedAt,\n serverUrl: skill.serverUrl,\n});\n\nconst normalizeMetadata = (\n metadata: Partial<SkillsMetadata> | null | undefined\n): SkillsMetadata => ({\n skills: Array.isArray(metadata?.skills)\n ? metadata.skills.map(normalizeInstalledSkill)\n : [],\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: () =>\n normalizeMetadata(JSON.parse(content) as Partial<SkillsMetadata>),\n catch: () => normalizeMetadata(undefined),\n })\n ),\n Effect.orElseSucceed(() => normalizeMetadata(undefined))\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 kind: InstalledSkill[\"kind\"];\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 kind: skill.kind,\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 kind: InstalledSkill[\"kind\"];\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, InstalledSkillSource, 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.catch((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 { createHash } from \"node:crypto\";\nimport { chmod, mkdir, rm, symlink, writeFile } from \"node:fs/promises\";\nimport { dirname, join, resolve, sep } from \"node:path\";\nimport { Data, Effect, pipe } from \"effect\";\nimport type { AgentId } from \"./agents.ts\";\nimport type { Skill, SkillFile } from \"./api.ts\";\nimport { resolveManagedBundlePathAsync } from \"./bundle-store.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 writeSkillAtPath = (\n skillPath: string,\n skill: Skill,\n agentId?: AgentId\n): Effect.Effect<void, WriteError> =>\n pipe(\n createDirectory(skillPath, skillPath),\n Effect.flatMap(() =>\n Effect.forEach(\n skill.files,\n (file) => writeSkillFile(skillPath, file, agentId),\n {\n concurrency: \"unbounded\",\n }\n )\n ),\n Effect.map(() => undefined)\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) => writeSkillAtPath(skillDir, skill, agentId))\n );\n\nconst writeSkillSymlink = (\n basePath: string,\n skill: Skill,\n agentId: AgentId | undefined,\n options: WriteSkillsOptions\n): Effect.Effect<void, WriteError> =>\n pipe(\n assertWithinBase(basePath, skill.name),\n Effect.flatMap((installPath) =>\n Effect.tryPromise({\n try: async () => {\n if (!options.storeRoot) {\n throw new Error(\"storeRoot is required for shared-store installs\");\n }\n\n const storedBundlePath = resolveStorePath(\n options.storeRoot,\n skill,\n agentId\n );\n await Effect.runPromise(\n writeSkillAtPath(storedBundlePath, skill, agentId)\n );\n\n const destinationPath = await resolveManagedBundlePathAsync(\n installPath,\n {\n disabledRoot: options.disabledRoot,\n }\n );\n\n await mkdir(dirname(destinationPath), { recursive: true });\n await rm(destinationPath, { recursive: true, force: true });\n await symlink(\n storedBundlePath,\n destinationPath,\n process.platform === \"win32\" ? \"junction\" : \"dir\"\n );\n },\n catch: (e) =>\n new WriteError({\n path: skill.name,\n operation: \"write\",\n cause: e,\n }),\n })\n )\n );\n\ninterface WriteSkillsResult {\n written: string[];\n errors: Array<{ skill: string; error: string }>;\n}\n\ninterface WriteSkillsOptions {\n disabledRoot?: string;\n storeRoot?: string;\n}\n\nconst hashSkill = (skill: Skill, agentId?: AgentId): string =>\n createHash(\"sha256\")\n .update(JSON.stringify({ agentId, skill }))\n .digest(\"hex\")\n .slice(0, 16);\n\nconst resolveStorePath = (\n storeRoot: string,\n skill: Skill,\n agentId?: AgentId\n): string => join(storeRoot, `${skill.name}-${hashSkill(skill, agentId)}`);\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 options: WriteSkillsOptions = {}\n): Effect.Effect<WriteSkillsResult, never> =>\n pipe(\n Effect.forEach(\n skills,\n (skill) =>\n pipe(\n options.storeRoot\n ? writeSkillSymlink(basePath, skill, agentId, options)\n : writeSkill(basePath, skill, agentId),\n Effect.map(() => ({ success: true as const, skill: skill.name })),\n Effect.catch((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 options?: WriteSkillsOptions\n): Promise<void> =>\n Effect.runPromise(\n options?.storeRoot\n ? writeSkillSymlink(basePath, skill, agentId, options)\n : writeSkill(basePath, skill, agentId)\n );\n\nconst writeSkillsAsync = (\n basePath: string,\n skills: Skill[],\n agentId?: AgentId,\n options?: WriteSkillsOptions\n): Promise<WriteSkillsResult> =>\n Effect.runPromise(writeSkills(basePath, skills, agentId, options));\n\nexport type { WriteSkillsOptions, 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 { openBrowser } from \"../lib/device-auth.ts\";\nimport { startManageServer } from \"../lib/manage-server.ts\";\nimport { log } from \"../lib/tui.ts\";\n\ninterface ManageCommandOptions {\n apiKey?: string;\n open?: boolean;\n port?: string;\n server?: string;\n}\n\nfunction parsePort(portValue: string | undefined): number | undefined {\n if (!portValue) {\n return undefined;\n }\n\n const parsed = Number.parseInt(portValue, 10);\n if (!Number.isInteger(parsed) || parsed <= 0) {\n throw new Error(`Invalid port: ${portValue}`);\n }\n\n return parsed;\n}\n\nexport async function manageCommand(\n options: ManageCommandOptions\n): Promise<void> {\n try {\n const server = await startManageServer({\n apiKey: options.apiKey,\n port: parsePort(options.port),\n projectRoot: process.cwd(),\n server: options.server,\n });\n\n if (options.open !== false) {\n openBrowser(server.url);\n }\n\n log.success(`braid manage running at ${server.url}`);\n log.info(\"Press Ctrl+C to stop.\");\n\n await new Promise<void>((resolveClose, rejectClose) => {\n const shutdown = () => {\n process.off(\"SIGINT\", shutdown);\n process.off(\"SIGTERM\", shutdown);\n server.close().then(resolveClose).catch(rejectClose);\n };\n\n process.once(\"SIGINT\", shutdown);\n process.once(\"SIGTERM\", shutdown);\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n log.error(message);\n process.exit(1);\n }\n}\n\nexport type { ManageCommandOptions };\n","import { randomUUID } from \"node:crypto\";\nimport { lstat, readFile } from \"node:fs/promises\";\nimport type { IncomingMessage, Server, ServerResponse } from \"node:http\";\nimport { createServer } from \"node:http\";\nimport { isAbsolute, relative, resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport type { AgentId } from \"./agents.ts\";\nimport {\n getAgentById,\n resolveAgentsInstallPath,\n resolveHookConfigPath,\n resolveInstallPath,\n resolveRulesInstallPath,\n} from \"./agents.ts\";\nimport type { BundleScope, BundleSurface } from \"./bundle-store.ts\";\nimport {\n clearApiKeyAsync,\n loadMergedConfigAsync,\n persistApiKeyAsync,\n} from \"./config.ts\";\nimport {\n buildAuthVerificationUrlFromBaseUrl,\n fetchAuthConfig,\n fetchSessionInfo,\n getDeviceInfo,\n initiateDeviceAuth,\n openBrowser,\n pollForSession,\n revokeSession,\n} from \"./device-auth.ts\";\nimport type {\n InstallLibraryPackOptions,\n ManageBundleActionTarget,\n RemoveManagedBundleOptions,\n} from \"./manage-actions.ts\";\nimport {\n disableManagedBundleAsync,\n enableManagedBundleAsync,\n installLibraryPackAsync,\n removeManagedBundleAsync,\n} from \"./manage-actions.ts\";\nimport type {\n ManageInventory,\n ManageInventoryOptions,\n} from \"./manage-inventory.ts\";\nimport { getManageInventoryAsync } from \"./manage-inventory.ts\";\nimport { fetchMarketplaceLibraryAsync } from \"./marketplace-api.ts\";\n\ninterface ManageServerDependencies {\n getAuthSession?: () => Promise<unknown>;\n completeAuth?: (options: { requestId: string }) => Promise<unknown>;\n disableManagedBundle?: (\n options: ManageBundleActionTarget\n ) => Promise<unknown>;\n enableManagedBundle?: (options: {\n disabledRoot?: string;\n originalPath: string;\n }) => Promise<unknown>;\n getInventory?: () => Promise<ManageInventory>;\n installLibraryPack?: (options: InstallLibraryPackOptions) => Promise<unknown>;\n listLibrary?: () => Promise<unknown>;\n removeManagedBundle?: (\n options: RemoveManagedBundleOptions\n ) => Promise<unknown>;\n signOut?: () => Promise<unknown>;\n startAuth?: () => Promise<unknown>;\n}\n\ninterface StartManageServerOptions\n extends ManageServerDependencies,\n ManageInventoryOptions {\n apiKey?: string;\n assetRoot?: string;\n host?: string;\n port?: number;\n server?: string;\n}\n\ninterface ManageServerInstance {\n close: () => Promise<void>;\n host: string;\n port: number;\n url: string;\n}\n\ntype JsonResponse = ServerResponse<IncomingMessage>;\n\ninterface ManageApiDependencies {\n getAuthSession: () => Promise<unknown>;\n completeAuth: (options: { requestId: string }) => Promise<unknown>;\n disableManagedBundle: (options: ManageBundleActionTarget) => Promise<unknown>;\n enableManagedBundle: (options: {\n disabledRoot?: string;\n originalPath: string;\n }) => Promise<unknown>;\n getInventory: () => Promise<ManageInventory>;\n installLibraryPack: (options: InstallLibraryPackOptions) => Promise<unknown>;\n listLibrary: () => Promise<unknown>;\n removeManagedBundle: (\n options: RemoveManagedBundleOptions\n ) => Promise<unknown>;\n signOut: () => Promise<unknown>;\n startAuth: () => Promise<unknown>;\n}\n\nconst MIME_TYPES: Record<string, string> = {\n \".css\": \"text/css; charset=utf-8\",\n \".html\": \"text/html; charset=utf-8\",\n \".js\": \"text/javascript; charset=utf-8\",\n \".json\": \"application/json; charset=utf-8\",\n \".svg\": \"image/svg+xml\",\n \".ttf\": \"font/ttf\",\n \".woff\": \"font/woff\",\n \".woff2\": \"font/woff2\",\n};\n\nconst TRAILING_SLASHES = /\\/+$/;\nconst MANAGE_AUTH_TIMEOUT_SECONDS = 300;\nconst SESSION_TOKEN_PREFIX = \"brs_\";\n\ninterface ManageHttpErrorShape {\n code?: string;\n status?: number;\n}\n\ninterface PendingManageAuthRequest {\n convexSiteUrl: string;\n deviceCode: string;\n expiresIn: number;\n interval: number;\n}\n\ninterface ManagedBundlePathPayload {\n agentId: AgentId;\n originalPath: string;\n scope: BundleScope;\n surface: BundleSurface;\n}\n\ninterface ManageServerPathApi {\n isAbsolute: (targetPath: string) => boolean;\n relative: (from: string, to: string) => string;\n}\n\nfunction getErrorStatus(error: unknown): number {\n if (\n typeof error === \"object\" &&\n error !== null &&\n \"status\" in error &&\n typeof (error as ManageHttpErrorShape).status === \"number\"\n ) {\n return (error as ManageHttpErrorShape).status ?? 500;\n }\n\n return 500;\n}\n\nfunction getErrorCode(error: unknown): string | undefined {\n if (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n typeof (error as ManageHttpErrorShape).code === \"string\"\n ) {\n return (error as ManageHttpErrorShape).code;\n }\n\n return undefined;\n}\n\nfunction createManageHttpError(\n status: number,\n message: string,\n code?: string\n): Error &\n Required<Pick<ManageHttpErrorShape, \"status\">> &\n ManageHttpErrorShape {\n const error = new Error(message) as Error &\n Required<Pick<ManageHttpErrorShape, \"status\">> &\n ManageHttpErrorShape;\n\n error.status = status;\n if (code) {\n error.code = code;\n }\n\n return error;\n}\n\nasync function pathIsDirectory(targetPath: string): Promise<boolean> {\n try {\n const stats = await lstat(targetPath);\n return stats.isDirectory();\n } catch {\n return false;\n }\n}\n\nasync function pathIsFile(targetPath: string): Promise<boolean> {\n try {\n const stats = await lstat(targetPath);\n return stats.isFile();\n } catch {\n return false;\n }\n}\n\nasync function validateManageAssetRoot(targetPath: string): Promise<string> {\n if (\n !(\n (await pathIsDirectory(targetPath)) &&\n (await pathIsFile(resolve(targetPath, \"index.html\")))\n )\n ) {\n throw new Error(\n \"Manage UI assets not found. Run `bun run --cwd apps/cli build` or use the Vite manage UI dev server.\"\n );\n }\n\n return targetPath;\n}\n\nasync function resolveManageAssetRootFromModuleUrl(\n moduleUrl: string\n): Promise<string> {\n const candidates = [\n new URL(\"./manage-ui\", moduleUrl),\n new URL(\"../../dist/manage-ui\", moduleUrl),\n ];\n\n for (const candidate of candidates) {\n const candidatePath = fileURLToPath(candidate);\n if (\n (await pathIsDirectory(candidatePath)) &&\n (await pathIsFile(resolve(candidatePath, \"index.html\")))\n ) {\n return candidatePath;\n }\n }\n\n throw new Error(\n \"Manage UI assets not found. Run `bun run --cwd apps/cli build` or use the Vite manage UI dev server.\"\n );\n}\n\nfunction resolveManageAssetRoot(): Promise<string> {\n return resolveManageAssetRootFromModuleUrl(import.meta.url);\n}\n\nasync function resolveManageAssetRootOrNull(\n explicit?: string\n): Promise<string | null> {\n if (explicit) {\n return validateManageAssetRoot(explicit);\n }\n try {\n return await resolveManageAssetRoot();\n } catch {\n return null;\n }\n}\n\nfunction getContentType(pathname: string): string {\n const extension = pathname.slice(pathname.lastIndexOf(\".\"));\n return MIME_TYPES[extension] ?? \"application/octet-stream\";\n}\n\nfunction writeJson(\n response: JsonResponse,\n status: number,\n body: unknown\n): void {\n response.writeHead(status, {\n \"content-type\": \"application/json; charset=utf-8\",\n \"cache-control\": \"no-store\",\n });\n response.end(JSON.stringify(body));\n}\n\nasync function readJsonBody<T>(request: IncomingMessage): Promise<T> {\n const chunks: Buffer[] = [];\n\n for await (const chunk of request) {\n chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n }\n\n const raw = Buffer.concat(chunks).toString(\"utf-8\");\n return JSON.parse(raw) as T;\n}\n\nfunction isWithinManageAssetRoot(\n rootPath: string,\n candidatePath: string,\n pathApi: ManageServerPathApi = { isAbsolute, relative }\n): boolean {\n const relativePath = pathApi.relative(rootPath, candidatePath);\n\n return (\n relativePath === \"\" ||\n !(relativePath.startsWith(\"..\") || pathApi.isAbsolute(relativePath))\n );\n}\n\nasync function serveStaticAsset(\n serverResponse: JsonResponse,\n assetRoot: string,\n pathname: string\n): Promise<boolean> {\n const relativePath = pathname === \"/\" ? \"index.html\" : pathname.slice(1);\n const assetPath = resolve(assetRoot, relativePath);\n const resolvedRoot = resolve(assetRoot);\n\n if (!isWithinManageAssetRoot(resolvedRoot, assetPath)) {\n writeJson(serverResponse, 404, { error: \"Not found\" });\n return true;\n }\n\n try {\n const content = await readFile(assetPath);\n serverResponse.writeHead(200, {\n \"content-type\": getContentType(assetPath),\n \"cache-control\": pathname === \"/\" ? \"no-store\" : \"public, max-age=60\",\n });\n serverResponse.end(content);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction isManagedBundlePathWithinRoot(\n rootPath: string,\n targetPath: string\n): boolean {\n const relativePath = relative(resolve(rootPath), resolve(targetPath));\n\n return (\n relativePath !== \"\" &&\n !(relativePath.startsWith(\"..\") || isAbsolute(relativePath))\n );\n}\n\nfunction resolveManagedInstallRoot(\n payload: Omit<ManagedBundlePathPayload, \"originalPath\">,\n projectRoot?: string\n): string {\n const agent = getAgentById(payload.agentId);\n if (!agent) {\n throw createManageHttpError(400, \"Unknown agent.\", \"UNKNOWN_AGENT\");\n }\n\n let installRoot: string | undefined;\n\n if (payload.surface === \"skills\") {\n installRoot = resolveInstallPath(agent, {\n global: payload.scope === \"global\",\n projectRoot,\n });\n } else if (payload.surface === \"hooks\") {\n const hookConfigPath = resolveHookConfigPath(agent, {\n global: payload.scope === \"global\",\n projectRoot,\n });\n installRoot = hookConfigPath ? resolve(hookConfigPath, \"..\") : undefined;\n } else if (payload.surface === \"agents\") {\n installRoot = resolveAgentsInstallPath(agent, {\n global: payload.scope === \"global\",\n projectRoot,\n });\n } else {\n installRoot = resolveRulesInstallPath(agent, {\n global: payload.scope === \"global\",\n projectRoot,\n });\n }\n\n if (!installRoot) {\n throw createManageHttpError(\n 400,\n \"The selected provider does not support that install target.\",\n \"INSTALL_ROOT_NOT_FOUND\"\n );\n }\n\n return installRoot;\n}\n\nfunction validateManagedBundlePath(\n payload: ManagedBundlePathPayload,\n projectRoot?: string\n): string {\n const installRoot = resolveManagedInstallRoot(payload, projectRoot);\n const agent = getAgentById(payload.agentId);\n\n if (payload.surface === \"rules\" && agent?.ruleFormat === \"append-single\") {\n if (resolve(payload.originalPath) !== resolve(installRoot)) {\n throw createManageHttpError(\n 400,\n \"Bundle path is outside the managed install root.\",\n \"INVALID_BUNDLE_PATH\"\n );\n }\n\n return installRoot;\n }\n\n if (!isManagedBundlePathWithinRoot(installRoot, payload.originalPath)) {\n throw createManageHttpError(\n 400,\n \"Bundle path is outside the managed install root.\",\n \"INVALID_BUNDLE_PATH\"\n );\n }\n\n return installRoot;\n}\n\nfunction closeServer(server: Server): Promise<void> {\n return new Promise((resolveClose, rejectClose) => {\n server.close((error) => {\n if (error) {\n rejectClose(error);\n return;\n }\n resolveClose();\n });\n });\n}\n\nasync function handleManageApiRoute(\n request: IncomingMessage,\n response: JsonResponse,\n dependencies: ManageApiDependencies\n): Promise<boolean> {\n const method = request.method ?? \"GET\";\n const pathname = new URL(request.url ?? \"/\", \"http://127.0.0.1\").pathname;\n\n switch (`${method} ${pathname}`) {\n case \"GET /api/inventory\":\n writeJson(response, 200, await dependencies.getInventory());\n return true;\n case \"GET /api/library\":\n writeJson(response, 200, await dependencies.listLibrary());\n return true;\n case \"GET /api/auth/session\":\n writeJson(response, 200, {\n ok: true,\n result: await dependencies.getAuthSession(),\n });\n return true;\n case \"POST /api/auth/start\":\n writeJson(response, 200, {\n ok: true,\n result: await dependencies.startAuth(),\n });\n return true;\n case \"POST /api/auth/complete\": {\n const payload = await readJsonBody<{ requestId?: string }>(request);\n if (!payload.requestId) {\n throw createManageHttpError(\n 400,\n \"Missing authentication request ID\",\n \"AUTH_REQUEST_REQUIRED\"\n );\n }\n\n writeJson(response, 200, {\n ok: true,\n result: await dependencies.completeAuth({\n requestId: payload.requestId,\n }),\n });\n return true;\n }\n case \"POST /api/auth/sign-out\":\n writeJson(response, 200, {\n ok: true,\n result: await dependencies.signOut(),\n });\n return true;\n case \"POST /api/actions/install\": {\n const payload = await readJsonBody<InstallLibraryPackOptions>(request);\n writeJson(response, 200, {\n ok: true,\n result: await dependencies.installLibraryPack(payload),\n });\n return true;\n }\n case \"POST /api/actions/disable\": {\n const payload = await readJsonBody<ManageBundleActionTarget>(request);\n writeJson(response, 200, {\n ok: true,\n result: await dependencies.disableManagedBundle(payload),\n });\n return true;\n }\n case \"POST /api/actions/enable\": {\n const payload = await readJsonBody<{\n disabledRoot?: string;\n originalPath: string;\n }>(request);\n writeJson(response, 200, {\n ok: true,\n result: await dependencies.enableManagedBundle(payload),\n });\n return true;\n }\n case \"POST /api/actions/remove\": {\n const payload = await readJsonBody<RemoveManagedBundleOptions>(request);\n writeJson(response, 200, {\n ok: true,\n result: await dependencies.removeManagedBundle(payload),\n });\n return true;\n }\n default:\n return false;\n }\n}\n\nasync function handleManageRequest(\n request: IncomingMessage,\n response: JsonResponse,\n assetRoot: string | null,\n dependencies: ManageApiDependencies\n): Promise<void> {\n try {\n if (await handleManageApiRoute(request, response, dependencies)) {\n return;\n }\n\n if (assetRoot) {\n const pathname = new URL(request.url ?? \"/\", \"http://127.0.0.1\").pathname;\n const served = await serveStaticAsset(response, assetRoot, pathname);\n if (served) {\n return;\n }\n }\n\n writeJson(response, 404, { error: \"Not found\" });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n const code = getErrorCode(error);\n writeJson(response, getErrorStatus(error), {\n ...(code ? { code } : {}),\n error: message,\n });\n }\n}\n\nasync function startManageServer(\n options: StartManageServerOptions = {}\n): Promise<ManageServerInstance> {\n const assetRoot = await resolveManageAssetRootOrNull(options.assetRoot);\n const host = options.host ?? \"127.0.0.1\";\n const authRequests = new Map<string, PendingManageAuthRequest>();\n const getInventory =\n options.getInventory ??\n (() =>\n getManageInventoryAsync({\n detectedAgents: options.detectedAgents,\n disabledRoot: options.disabledRoot,\n projectRoot: options.projectRoot,\n }));\n const listLibrary =\n options.listLibrary ??\n (() =>\n fetchMarketplaceLibraryAsync({\n apiKey: options.apiKey,\n server: options.server,\n }));\n const installLibraryPackBase =\n options.installLibraryPack ?? installLibraryPackAsync;\n const installLibraryPack = (payload: InstallLibraryPackOptions) =>\n installLibraryPackBase({\n ...payload,\n apiKey: payload.apiKey ?? options.apiKey,\n server: payload.server ?? options.server,\n });\n const disableManagedBundleBase =\n options.disableManagedBundle ?? disableManagedBundleAsync;\n const disableManagedBundle = (payload: ManageBundleActionTarget) =>\n disableManagedBundleBase(\n (() => {\n validateManagedBundlePath(payload, options.projectRoot);\n return {\n ...payload,\n disabledRoot: payload.disabledRoot ?? options.disabledRoot,\n };\n })()\n );\n const enableManagedBundleBase =\n options.enableManagedBundle ?? enableManagedBundleAsync;\n const enableManagedBundle = (payload: {\n disabledRoot?: string;\n originalPath: string;\n }) =>\n enableManagedBundleBase({\n ...payload,\n disabledRoot: payload.disabledRoot ?? options.disabledRoot,\n });\n const removeManagedBundleBase =\n options.removeManagedBundle ?? removeManagedBundleAsync;\n const removeManagedBundle = (payload: RemoveManagedBundleOptions) =>\n removeManagedBundleBase(\n (() => {\n const installRoot = validateManagedBundlePath(\n payload,\n options.projectRoot\n );\n\n return {\n ...payload,\n disabledRoot: payload.disabledRoot ?? options.disabledRoot,\n installRoot,\n };\n })()\n );\n const startAuth =\n options.startAuth ??\n (async () => {\n const config = await loadMergedConfigAsync();\n const serverUrl = (options.server ?? config.serverUrl).replace(\n TRAILING_SLASHES,\n \"\"\n );\n const authConfig = await fetchAuthConfig(serverUrl);\n const deviceAuth = await initiateDeviceAuth(\n authConfig.convexSiteUrl,\n getDeviceInfo()\n );\n const requestId = randomUUID();\n const verificationUrl = buildAuthVerificationUrlFromBaseUrl(\n authConfig.verificationBaseUrl,\n deviceAuth.user_code\n );\n\n authRequests.set(requestId, {\n convexSiteUrl: authConfig.convexSiteUrl,\n deviceCode: deviceAuth.device_code,\n expiresIn: deviceAuth.expires_in,\n interval: deviceAuth.interval,\n });\n\n openBrowser(verificationUrl);\n\n return {\n expiresIn: deviceAuth.expires_in,\n requestId,\n userCode: deviceAuth.user_code,\n verificationUrl,\n };\n });\n const completeAuth =\n options.completeAuth ??\n (async ({ requestId }: { requestId: string }) => {\n const pendingRequest = authRequests.get(requestId);\n if (!pendingRequest) {\n throw createManageHttpError(\n 404,\n \"Authentication request not found\",\n \"AUTH_REQUEST_NOT_FOUND\"\n );\n }\n\n try {\n const session = await pollForSession(\n pendingRequest.convexSiteUrl,\n pendingRequest.deviceCode,\n pendingRequest.interval,\n pendingRequest.expiresIn,\n MANAGE_AUTH_TIMEOUT_SECONDS\n );\n\n await persistApiKeyAsync(session.sessionToken);\n\n return {\n authenticated: true,\n expiresAt: session.expiresAt,\n user: session.user,\n };\n } finally {\n authRequests.delete(requestId);\n }\n });\n const getAuthSession =\n options.getAuthSession ??\n (async () => {\n const config = await loadMergedConfigAsync();\n const token = config.token;\n\n if (!token) {\n return { authenticated: false };\n }\n\n if (!token.startsWith(SESSION_TOKEN_PREFIX)) {\n return { authenticated: true };\n }\n\n const serverUrl = (options.server ?? config.serverUrl).replace(\n TRAILING_SLASHES,\n \"\"\n );\n const authConfig = await fetchAuthConfig(serverUrl);\n const session = await fetchSessionInfo(authConfig.convexSiteUrl, token);\n\n if (!session) {\n await clearApiKeyAsync();\n return { authenticated: false };\n }\n\n return {\n authenticated: true,\n expiresAt: session.expiresAt,\n user: {\n email: session.email,\n name: session.name,\n },\n };\n });\n const signOut =\n options.signOut ??\n (async () => {\n const config = await loadMergedConfigAsync();\n const token = config.token;\n\n if (token?.startsWith(SESSION_TOKEN_PREFIX)) {\n try {\n const serverUrl = (options.server ?? config.serverUrl).replace(\n TRAILING_SLASHES,\n \"\"\n );\n const authConfig = await fetchAuthConfig(serverUrl);\n await revokeSession(authConfig.convexSiteUrl, token);\n } catch {\n /* best-effort revoke */\n }\n }\n\n await clearApiKeyAsync();\n\n return {\n authenticated: false,\n };\n });\n const dependencies: ManageApiDependencies = {\n getAuthSession,\n completeAuth,\n disableManagedBundle,\n enableManagedBundle,\n getInventory,\n installLibraryPack,\n listLibrary,\n removeManagedBundle,\n signOut,\n startAuth,\n };\n\n const server = createServer((request, response) => {\n handleManageRequest(request, response, assetRoot, dependencies).catch(\n (error) => {\n const message = error instanceof Error ? error.message : String(error);\n writeJson(response, 500, { error: message });\n }\n );\n });\n\n await new Promise<void>((resolveListen, rejectListen) => {\n const handleError = (error: Error) => {\n rejectListen(error);\n };\n\n server.once(\"error\", handleError);\n server.listen(options.port ?? 0, host, () => {\n server.off(\"error\", handleError);\n resolveListen();\n });\n });\n\n const address = server.address();\n if (!address || typeof address === \"string\") {\n await closeServer(server);\n throw new Error(\"Failed to determine manage server address\");\n }\n\n return {\n close: () => closeServer(server),\n host,\n port: address.port,\n url: `http://${host}:${address.port}`,\n };\n}\n\nexport type {\n ManageServerDependencies,\n ManageServerInstance,\n StartManageServerOptions,\n};\nexport {\n isWithinManageAssetRoot,\n resolveManageAssetRoot,\n resolveManageAssetRootFromModuleUrl,\n startManageServer,\n};\n","import { rm } from \"node:fs/promises\";\nimport { basename, dirname, join, relative } from \"node:path\";\nimport type { AgentId } from \"./agents.ts\";\nimport type {\n BundleScope,\n BundleSurface,\n DisabledBundleRecord,\n} from \"./bundle-store.ts\";\nimport {\n disableBundleAsync,\n enableBundleAsync,\n findDisabledBundleByOriginalPathAsync,\n removePathAsync,\n} from \"./bundle-store.ts\";\nimport {\n ensureMarketplaceHookBundleFileAsync,\n readMarketplaceHookBundleFileAsync,\n removeMarketplaceHooksBySourceAsync,\n writeMarketplaceHooksAsync,\n} from \"./hook-writer.ts\";\nimport { fetchMarketplaceInstallManifestAsync } from \"./marketplace-api.ts\";\nimport { installMarketplaceSkillSet } from \"./marketplace-installer.ts\";\nimport { removeFromMetadataAsync } from \"./metadata.ts\";\n\ninterface ManageBundleActionTarget {\n agentId: AgentId;\n disabledRoot?: string;\n originalPath: string;\n scope: BundleScope;\n surface: BundleSurface;\n}\n\ninterface RemoveManagedBundleOptions extends ManageBundleActionTarget {\n bundleName: string;\n installRoot: string;\n}\n\ninterface InstallLibraryPackOptions {\n agentId: AgentId;\n apiKey?: string;\n scope: BundleScope;\n server?: string;\n slug: string;\n}\n\ntype InstallLibraryPackResult = Awaited<\n ReturnType<typeof installMarketplaceSkillSet>\n>;\n\nconst HOOK_BUNDLE_PATH_SEPARATOR_REGEX = /[\\\\/]/;\n\nfunction isMarketplaceHookBundlePath(originalPath: string): boolean {\n return getHookBundleRoot(originalPath) !== null;\n}\n\nfunction getHookBundleRoot(originalPath: string): string | null {\n let currentPath = dirname(originalPath);\n\n while (true) {\n if (basename(currentPath) === \".braid-hooks\") {\n return dirname(currentPath);\n }\n\n const parentPath = dirname(currentPath);\n if (parentPath === currentPath) {\n return null;\n }\n currentPath = parentPath;\n }\n}\n\nfunction getHookBundleRelativePath(originalPath: string): string {\n const bundleRoot = getHookBundleRoot(originalPath);\n if (!bundleRoot) {\n throw new Error(`Invalid marketplace hook bundle path: ${originalPath}`);\n }\n\n return relative(join(bundleRoot, \".braid-hooks\"), originalPath);\n}\n\nfunction getHookSourceSlug(originalPath: string): string {\n const relativePath = getHookBundleRelativePath(originalPath);\n const pathSegments = relativePath.split(HOOK_BUNDLE_PATH_SEPARATOR_REGEX);\n const fileName = pathSegments.pop();\n\n if (!fileName?.endsWith(\".json\")) {\n throw new Error(\n `Invalid marketplace hook bundle filename: ${originalPath}`\n );\n }\n\n pathSegments.push(basename(fileName, \".json\"));\n return pathSegments.join(\"/\");\n}\n\nfunction getHookSettingsPath(originalPath: string): string {\n const bundleRoot = getHookBundleRoot(originalPath);\n if (!bundleRoot) {\n throw new Error(`Invalid marketplace hook bundle path: ${originalPath}`);\n }\n\n return join(bundleRoot, \"settings.json\");\n}\n\nasync function disableManagedBundleAsync(\n options: ManageBundleActionTarget\n): Promise<DisabledBundleRecord> {\n if (options.surface === \"hooks\") {\n const sourceSlug = getHookSourceSlug(options.originalPath);\n const settingsPath = getHookSettingsPath(options.originalPath);\n await ensureMarketplaceHookBundleFileAsync(settingsPath, sourceSlug);\n const disabledRecord = await disableBundleAsync({\n agentId: options.agentId,\n bundlePath: options.originalPath,\n disabledRoot: options.disabledRoot,\n scope: options.scope,\n surface: options.surface,\n });\n await removeMarketplaceHooksBySourceAsync(settingsPath, sourceSlug);\n return disabledRecord;\n }\n\n return disableBundleAsync({\n agentId: options.agentId,\n bundlePath: options.originalPath,\n disabledRoot: options.disabledRoot,\n scope: options.scope,\n surface: options.surface,\n });\n}\n\nasync function enableManagedBundleAsync(options: {\n disabledRoot?: string;\n originalPath: string;\n}): Promise<DisabledBundleRecord> {\n const disabledRecord = await enableBundleAsync(options.originalPath, {\n disabledRoot: options.disabledRoot,\n });\n\n if (isMarketplaceHookBundlePath(options.originalPath)) {\n const bundle = await readMarketplaceHookBundleFileAsync(\n options.originalPath\n );\n if (!bundle) {\n throw new Error(`Missing hook bundle data for ${options.originalPath}`);\n }\n\n await writeMarketplaceHooksAsync(\n getHookSettingsPath(options.originalPath),\n bundle.hooks,\n {\n source: bundle.source,\n sourceSlug: bundle.sourceSlug,\n version: bundle.version,\n }\n );\n }\n\n return disabledRecord;\n}\n\nasync function removeManagedBundleAsync(\n options: RemoveManagedBundleOptions\n): Promise<void> {\n if (options.surface === \"hooks\") {\n const disabledRecord = await findDisabledBundleByOriginalPathAsync(\n options.originalPath,\n {\n disabledRoot: options.disabledRoot,\n }\n );\n await removeMarketplaceHooksBySourceAsync(\n join(options.installRoot, \"settings.json\"),\n options.bundleName\n );\n if (disabledRecord) {\n await removePathAsync(disabledRecord.disabledPath);\n }\n return;\n }\n\n const disabledRecord = await findDisabledBundleByOriginalPathAsync(\n options.originalPath,\n {\n disabledRoot: options.disabledRoot,\n }\n );\n\n await rm(options.originalPath, { recursive: true, force: true });\n\n if (disabledRecord) {\n await removePathAsync(disabledRecord.disabledPath);\n }\n\n if (options.surface === \"skills\") {\n await removeFromMetadataAsync(options.installRoot, options.bundleName);\n }\n}\n\nasync function installLibraryPackAsync(\n options: InstallLibraryPackOptions\n): Promise<InstallLibraryPackResult> {\n const manifest = await fetchMarketplaceInstallManifestAsync(options.slug, {\n apiKey: options.apiKey,\n server: options.server,\n });\n\n return installMarketplaceSkillSet({\n agents: options.agentId,\n global: options.scope === \"global\",\n manifest,\n slug: options.slug,\n });\n}\n\nexport type {\n InstallLibraryPackOptions,\n InstallLibraryPackResult,\n ManageBundleActionTarget,\n RemoveManagedBundleOptions,\n};\nexport {\n disableManagedBundleAsync,\n enableManagedBundleAsync,\n installLibraryPackAsync,\n removeManagedBundleAsync,\n};\n","import { mkdir, readFile, rm, writeFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport { Data, Effect } from \"effect\";\nimport type { MarketplaceManifestResponse } from \"./marketplace-api.ts\";\nimport type { InstalledSkillSource } from \"./metadata.ts\";\n\ntype JsonObject = Record<string, unknown>;\ntype MarketplaceHookSpec = NonNullable<\n NonNullable<MarketplaceManifestResponse[\"manifest\"]>[\"hooks\"]\n>[number];\n\ninterface HookMatcherGroup {\n matcher?: string;\n hooks: MarketplaceHookSpec[\"handlers\"];\n}\n\ninterface InstalledHookMetadataEntry {\n sourceSlug: string;\n hookKey: string;\n version: string;\n event: string;\n matcher?: string;\n handlers: MarketplaceHookSpec[\"handlers\"];\n installedAt?: string;\n source?: InstalledSkillSource;\n}\n\ninterface InstalledHookMetadata {\n hooks: InstalledHookMetadataEntry[];\n}\n\ninterface WriteMarketplaceHooksOptions {\n sourceSlug: string;\n version: string;\n source?: InstalledSkillSource;\n}\n\ninterface InstalledMarketplaceHookSource {\n sourceSlug: string;\n source: InstalledSkillSource;\n installedAt?: string;\n version: string;\n}\n\ninterface MarketplaceHookBundle {\n hooks: MarketplaceHookSpec[];\n source?: InstalledSkillSource;\n sourceSlug: string;\n version: string;\n}\n\nclass HookConfigWriteError extends Data.TaggedError(\"HookConfigWriteError\")<{\n path: string;\n cause: unknown;\n}> {}\n\nconst HOOK_METADATA_FILENAME = \".braid-hooks-metadata.json\";\n\nfunction stableStringify(value: unknown): string {\n return JSON.stringify(value, (_key, currentValue) => {\n if (\n currentValue &&\n typeof currentValue === \"object\" &&\n !Array.isArray(currentValue)\n ) {\n return Object.keys(currentValue as JsonObject)\n .sort()\n .reduce((sorted, key) => {\n sorted[key] = (currentValue as JsonObject)[key];\n return sorted;\n }, {} as JsonObject);\n }\n\n return currentValue;\n });\n}\n\nfunction normalizeMatcher(value: unknown): string | undefined {\n if (typeof value !== \"string\") {\n return undefined;\n }\n\n const trimmed = value.trim();\n return trimmed === \"\" || trimmed === \"*\" ? undefined : trimmed;\n}\n\nfunction getHookKey(hook: MarketplaceHookSpec): string {\n if (typeof hook.slug === \"string\" && hook.slug.length > 0) {\n return hook.slug;\n }\n\n return `${hook.event}:${hook.title}`;\n}\n\nasync function readJsonFile(path: string): Promise<JsonObject> {\n try {\n const content = await readFile(path, \"utf-8\");\n const parsed = JSON.parse(content) as unknown;\n if (!(parsed && typeof parsed === \"object\" && !Array.isArray(parsed))) {\n throw new Error(`Expected JSON object in ${path}`);\n }\n return parsed as JsonObject;\n } catch (error) {\n if (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n error.code === \"ENOENT\"\n ) {\n return {};\n }\n throw error;\n }\n}\n\nasync function writeJsonFile(path: string, value: JsonObject): Promise<void> {\n await mkdir(dirname(path), { recursive: true, mode: 0o700 });\n await writeFile(path, `${JSON.stringify(value, null, 2)}\\n`, {\n encoding: \"utf-8\",\n mode: 0o600,\n });\n}\n\nfunction parseMatcherGroups(\n config: JsonObject,\n event: string\n): HookMatcherGroup[] {\n const hooksRecord =\n config.hooks &&\n typeof config.hooks === \"object\" &&\n !Array.isArray(config.hooks)\n ? (config.hooks as JsonObject)\n : {};\n const rawGroups = hooksRecord[event];\n\n if (!Array.isArray(rawGroups)) {\n return [];\n }\n\n const matcherGroups: HookMatcherGroup[] = [];\n\n for (const group of rawGroups) {\n if (!(group && typeof group === \"object\")) {\n continue;\n }\n\n const groupRecord = group as { matcher?: unknown; hooks?: unknown };\n matcherGroups.push({\n matcher: normalizeMatcher(groupRecord.matcher),\n hooks: Array.isArray(groupRecord.hooks) ? groupRecord.hooks : [],\n });\n }\n\n return matcherGroups;\n}\n\nfunction writeMatcherGroups(\n config: JsonObject,\n event: string,\n groups: HookMatcherGroup[]\n): JsonObject {\n const hooksRecord =\n config.hooks &&\n typeof config.hooks === \"object\" &&\n !Array.isArray(config.hooks)\n ? { ...(config.hooks as JsonObject) }\n : {};\n\n if (groups.length === 0) {\n delete hooksRecord[event];\n } else {\n hooksRecord[event] = groups.map((group) => ({\n ...(group.matcher ? { matcher: group.matcher } : {}),\n hooks: group.hooks,\n }));\n }\n\n if (Object.keys(hooksRecord).length === 0) {\n const nextConfig = { ...config };\n nextConfig.hooks = undefined;\n return nextConfig;\n }\n\n return {\n ...config,\n hooks: hooksRecord,\n };\n}\n\nfunction removeInstalledHandlers(\n config: JsonObject,\n entry: InstalledHookMetadataEntry,\n preservedHandlerKeys: ReadonlySet<string> = new Set<string>()\n): JsonObject {\n const handlerKeys = new Set(\n entry.handlers.map((handler) => stableStringify(handler))\n );\n const groups = parseMatcherGroups(config, entry.event)\n .map((group) => {\n if (group.matcher !== normalizeMatcher(entry.matcher)) {\n return group;\n }\n\n return {\n ...group,\n hooks: group.hooks.filter((handler) => {\n const handlerKey = stableStringify(handler);\n return (\n !handlerKeys.has(handlerKey) || preservedHandlerKeys.has(handlerKey)\n );\n }),\n };\n })\n .filter((group) => group.hooks.length > 0);\n\n return writeMatcherGroups(config, entry.event, groups);\n}\n\nfunction addHookHandlers(\n config: JsonObject,\n hook: MarketplaceHookSpec\n): JsonObject {\n const matcher = normalizeMatcher(hook.matcher);\n const groups = parseMatcherGroups(config, hook.event);\n const existingGroupIndex = groups.findIndex(\n (group) => group.matcher === matcher\n );\n\n if (existingGroupIndex >= 0) {\n const group = groups[existingGroupIndex];\n if (!group) {\n return config;\n }\n const existingHandlerKeys = new Set(\n group.hooks.map((handler) => stableStringify(handler))\n );\n const nextHandlers = [...group.hooks];\n\n for (const handler of hook.handlers) {\n const handlerKey = stableStringify(handler);\n if (!existingHandlerKeys.has(handlerKey)) {\n nextHandlers.push(handler);\n existingHandlerKeys.add(handlerKey);\n }\n }\n\n groups[existingGroupIndex] = {\n ...group,\n hooks: nextHandlers,\n };\n } else {\n groups.push({\n ...(matcher ? { matcher } : {}),\n hooks: [...hook.handlers],\n });\n }\n\n return writeMatcherGroups(config, hook.event, groups);\n}\n\nfunction getHookMetadataPath(settingsPath: string): string {\n return join(dirname(settingsPath), HOOK_METADATA_FILENAME);\n}\n\nasync function readHookMetadata(\n settingsPath: string\n): Promise<InstalledHookMetadata> {\n const metadataPath = getHookMetadataPath(settingsPath);\n const config = await readJsonFile(metadataPath);\n const hooks = Array.isArray(config.hooks)\n ? config.hooks\n .map((entry) => normalizeHookMetadataEntry(entry))\n .filter((entry): entry is InstalledHookMetadataEntry => entry !== null)\n : [];\n\n return { hooks };\n}\n\nasync function writeHookMetadata(\n settingsPath: string,\n metadata: InstalledHookMetadata\n): Promise<void> {\n await writeJsonFile(getHookMetadataPath(settingsPath), {\n hooks: metadata.hooks,\n });\n}\n\nfunction buildMarketplaceHookSource(sourceSlug: string): InstalledSkillSource {\n return {\n type: \"marketplace\",\n name: sourceSlug,\n slug: sourceSlug,\n title: sourceSlug,\n };\n}\n\nfunction normalizeHookMetadataEntry(\n value: unknown\n): InstalledHookMetadataEntry | null {\n if (!(value && typeof value === \"object\")) {\n return null;\n }\n\n const record = value as Record<string, unknown>;\n const sourceSlug =\n typeof record.sourceSlug === \"string\" ? record.sourceSlug : undefined;\n const hookKey =\n typeof record.hookKey === \"string\" ? record.hookKey : undefined;\n const version =\n typeof record.version === \"string\" ? record.version : undefined;\n const event = typeof record.event === \"string\" ? record.event : undefined;\n const handlers = Array.isArray(record.handlers) ? record.handlers : undefined;\n\n if (!(sourceSlug && hookKey && version && event && handlers)) {\n return null;\n }\n\n const matcher = normalizeMatcher(record.matcher);\n const installedAt =\n typeof record.installedAt === \"string\" ? record.installedAt : undefined;\n const source =\n record.source && typeof record.source === \"object\"\n ? (record.source as InstalledSkillSource)\n : buildMarketplaceHookSource(sourceSlug);\n\n return {\n sourceSlug,\n hookKey,\n version,\n event,\n matcher,\n handlers,\n installedAt,\n source,\n };\n}\n\nfunction getPreservedHandlerKeys(\n metadata: InstalledHookMetadataEntry[],\n entry: InstalledHookMetadataEntry\n): Set<string> {\n const preserved = new Set<string>();\n\n for (const otherEntry of metadata) {\n if (\n otherEntry.event !== entry.event ||\n normalizeMatcher(otherEntry.matcher) !== normalizeMatcher(entry.matcher)\n ) {\n continue;\n }\n\n for (const handler of otherEntry.handlers) {\n preserved.add(stableStringify(handler));\n }\n }\n\n return preserved;\n}\n\nasync function removeMarketplaceHooksBySource(\n settingsPath: string,\n sourceSlug: string\n): Promise<void> {\n let settings = await readJsonFile(settingsPath);\n const metadata = await readHookMetadata(settingsPath);\n const previousEntries = metadata.hooks.filter(\n (entry) => entry.sourceSlug === sourceSlug\n );\n const remainingEntries = metadata.hooks.filter(\n (entry) => entry.sourceSlug !== sourceSlug\n );\n\n for (const entry of previousEntries) {\n settings = removeInstalledHandlers(\n settings,\n entry,\n getPreservedHandlerKeys(remainingEntries, entry)\n );\n }\n\n await writeJsonFile(settingsPath, settings);\n await writeHookMetadata(settingsPath, {\n hooks: remainingEntries,\n });\n await rm(buildMarketplaceHookBundlePath(settingsPath, sourceSlug), {\n force: true,\n });\n}\n\nasync function listInstalledMarketplaceHookSources(\n settingsPath: string\n): Promise<InstalledMarketplaceHookSource[]> {\n const metadata = await readHookMetadata(settingsPath);\n const sources = new Map<string, InstalledMarketplaceHookSource>();\n\n for (const entry of metadata.hooks) {\n const existing = sources.get(entry.sourceSlug);\n\n if (!existing) {\n sources.set(entry.sourceSlug, {\n sourceSlug: entry.sourceSlug,\n source: entry.source ?? buildMarketplaceHookSource(entry.sourceSlug),\n installedAt: entry.installedAt,\n version: entry.version,\n });\n continue;\n }\n\n if (\n entry.installedAt &&\n (!existing.installedAt || entry.installedAt > existing.installedAt)\n ) {\n existing.installedAt = entry.installedAt;\n }\n\n existing.version = entry.version;\n existing.source = entry.source ?? existing.source;\n }\n\n return [...sources.values()].sort((left, right) =>\n left.sourceSlug.localeCompare(right.sourceSlug)\n );\n}\n\nfunction buildMarketplaceHookBundlePath(\n settingsPath: string,\n sourceSlug: string\n): string {\n return join(dirname(settingsPath), \".braid-hooks\", `${sourceSlug}.json`);\n}\n\nfunction buildMarketplaceHookBundle(\n hooks: MarketplaceHookSpec[],\n options: WriteMarketplaceHooksOptions\n): MarketplaceHookBundle {\n return {\n hooks,\n source: options.source ?? buildMarketplaceHookSource(options.sourceSlug),\n sourceSlug: options.sourceSlug,\n version: options.version,\n };\n}\n\nasync function writeMarketplaceHookBundleFile(\n settingsPath: string,\n bundle: MarketplaceHookBundle\n): Promise<void> {\n await writeJsonFile(\n buildMarketplaceHookBundlePath(settingsPath, bundle.sourceSlug),\n bundle as unknown as JsonObject\n );\n}\n\nasync function readMarketplaceHookBundleFile(\n bundlePath: string\n): Promise<MarketplaceHookBundle | null> {\n try {\n const content = await readFile(bundlePath, \"utf-8\");\n const parsed = JSON.parse(content) as Record<string, unknown>;\n if (\n typeof parsed.sourceSlug !== \"string\" ||\n typeof parsed.version !== \"string\" ||\n !Array.isArray(parsed.hooks)\n ) {\n return null;\n }\n\n return {\n hooks: parsed.hooks as MarketplaceHookSpec[],\n source:\n parsed.source && typeof parsed.source === \"object\"\n ? (parsed.source as InstalledSkillSource)\n : undefined,\n sourceSlug: parsed.sourceSlug,\n version: parsed.version,\n };\n } catch {\n return null;\n }\n}\n\nfunction deriveHookTitle(entry: InstalledHookMetadataEntry): string {\n if (entry.hookKey.startsWith(`${entry.event}:`)) {\n return entry.hookKey.slice(entry.event.length + 1) || entry.sourceSlug;\n }\n\n return entry.hookKey;\n}\n\nfunction deriveHookSlug(entry: InstalledHookMetadataEntry): string | undefined {\n return entry.hookKey.startsWith(`${entry.event}:`)\n ? undefined\n : entry.hookKey;\n}\n\nasync function ensureMarketplaceHookBundleFile(\n settingsPath: string,\n sourceSlug: string\n): Promise<string | null> {\n const bundlePath = buildMarketplaceHookBundlePath(settingsPath, sourceSlug);\n const existing = await readMarketplaceHookBundleFile(bundlePath);\n if (existing) {\n return bundlePath;\n }\n\n const metadata = await readHookMetadata(settingsPath);\n const entries = metadata.hooks.filter(\n (entry) => entry.sourceSlug === sourceSlug\n );\n if (entries.length === 0) {\n return null;\n }\n\n await writeMarketplaceHookBundleFile(settingsPath, {\n hooks: entries.map(\n (entry): MarketplaceHookSpec => ({\n title: deriveHookTitle(entry),\n ...(deriveHookSlug(entry) ? { slug: deriveHookSlug(entry) } : {}),\n runtime: \"claude\",\n event: entry.event,\n ...(entry.matcher ? { matcher: entry.matcher } : {}),\n handlers: entry.handlers,\n enabled: true,\n schemaVersion: 1,\n })\n ),\n source: entries[0]?.source,\n sourceSlug,\n version: entries[0]?.version ?? \"unknown\",\n });\n\n return bundlePath;\n}\n\nconst writeMarketplaceHooks = (\n settingsPath: string,\n hooks: MarketplaceHookSpec[],\n options: WriteMarketplaceHooksOptions\n): Effect.Effect<void, HookConfigWriteError> =>\n Effect.tryPromise({\n try: async () => {\n const activeHooks = hooks.filter(\n (hook) => hook.enabled !== false && hook.runtime === \"claude\"\n );\n let settings = await readJsonFile(settingsPath);\n const metadata = await readHookMetadata(settingsPath);\n const previousEntries = metadata.hooks.filter(\n (entry) => entry.sourceSlug === options.sourceSlug\n );\n const remainingEntries = metadata.hooks.filter(\n (entry) => entry.sourceSlug !== options.sourceSlug\n );\n\n for (const entry of previousEntries) {\n settings = removeInstalledHandlers(\n settings,\n entry,\n getPreservedHandlerKeys(remainingEntries, entry)\n );\n }\n\n const installedAt = new Date().toISOString();\n const nextEntries: InstalledHookMetadataEntry[] = [];\n for (const hook of activeHooks) {\n settings = addHookHandlers(settings, hook);\n nextEntries.push({\n sourceSlug: options.sourceSlug,\n hookKey: getHookKey(hook),\n version: options.version,\n event: hook.event,\n matcher: normalizeMatcher(hook.matcher),\n handlers: hook.handlers,\n installedAt,\n source:\n options.source ?? buildMarketplaceHookSource(options.sourceSlug),\n });\n }\n\n await writeJsonFile(settingsPath, settings);\n await writeHookMetadata(settingsPath, {\n hooks: [...remainingEntries, ...nextEntries],\n });\n if (activeHooks.length > 0) {\n await writeMarketplaceHookBundleFile(\n settingsPath,\n buildMarketplaceHookBundle(activeHooks, options)\n );\n } else {\n await rm(\n buildMarketplaceHookBundlePath(settingsPath, options.sourceSlug),\n {\n force: true,\n }\n );\n }\n },\n catch: (cause) => new HookConfigWriteError({ path: settingsPath, cause }),\n });\n\nconst writeMarketplaceHooksAsync = (\n settingsPath: string,\n hooks: MarketplaceHookSpec[],\n options: WriteMarketplaceHooksOptions\n): Promise<void> =>\n Effect.runPromise(writeMarketplaceHooks(settingsPath, hooks, options));\n\nconst removeMarketplaceHooksBySourceAsync = (\n settingsPath: string,\n sourceSlug: string\n): Promise<void> => removeMarketplaceHooksBySource(settingsPath, sourceSlug);\n\nconst ensureMarketplaceHookBundleFileAsync = (\n settingsPath: string,\n sourceSlug: string\n): Promise<string | null> =>\n ensureMarketplaceHookBundleFile(settingsPath, sourceSlug);\n\nconst listInstalledMarketplaceHookSourcesAsync = (\n settingsPath: string\n): Promise<InstalledMarketplaceHookSource[]> =>\n listInstalledMarketplaceHookSources(settingsPath);\n\nconst readMarketplaceHookBundleFileAsync = (\n bundlePath: string\n): Promise<MarketplaceHookBundle | null> =>\n readMarketplaceHookBundleFile(bundlePath);\n\nexport type {\n InstalledMarketplaceHookSource,\n MarketplaceHookBundle,\n WriteMarketplaceHooksOptions,\n};\nexport {\n buildMarketplaceHookBundlePath,\n ensureMarketplaceHookBundleFileAsync,\n HookConfigWriteError,\n listInstalledMarketplaceHookSourcesAsync,\n readMarketplaceHookBundleFileAsync,\n removeMarketplaceHooksBySourceAsync,\n writeMarketplaceHooks,\n writeMarketplaceHooksAsync,\n};\n","import { Data, Effect, pipe } from \"effect\";\nimport type { CanonicalAgentSpec } from \"./agent-writer.ts\";\nimport type { ExportedRule } from \"./api.ts\";\nimport { getApiKeyAsync, getServerUrlAsync } from \"./config.ts\";\n\nconst TRAILING_SLASH_REGEX = /\\/$/;\n\nclass MarketplaceApiError extends Data.TaggedError(\"MarketplaceApiError\")<{\n message: string;\n status: number;\n code: string;\n}> {}\n\ninterface MarketplaceClientOptions {\n server?: string;\n apiKey?: string;\n}\n\ninterface MarketplaceLibraryItem {\n entitlementId: string;\n skillSetId: string;\n listingId?: string;\n title: string;\n slug: string;\n grantedAt: number;\n latestVersionId?: string;\n scanVerdict?: \"clean\" | \"flagged\" | \"blocked\" | \"allowlisted\";\n commitSha?: string;\n}\n\ninterface MarketplaceLibraryResponse {\n items: MarketplaceLibraryItem[];\n}\n\ninterface MarketplaceManifestResponse {\n blocked: boolean;\n message?: string;\n skillSetId?: string;\n slug?: string;\n title?: string;\n versionId?: string;\n commitSha?: string;\n manifest?: {\n skills?: Array<{\n kind?: \"skill\" | \"workflow\";\n name: string;\n files: Array<{ path: string; content: string; encoding?: \"base64\" }>;\n }>;\n rules?: ExportedRule[];\n hooks?: Array<{\n title: string;\n slug?: string;\n description?: string;\n runtime: \"claude\";\n event: string;\n matcher?: string;\n handlers: unknown[];\n enabled: boolean;\n schemaVersion: number;\n }>;\n agents?: CanonicalAgentSpec[];\n workflows?: Array<{\n kind: \"workflow\";\n name: string;\n bundleName: string;\n description?: string;\n files: Array<{ path: string; content: string; encoding?: \"base64\" }>;\n }>;\n };\n}\n\nconst resolveApiKey = (\n provided?: string\n): Effect.Effect<string, MarketplaceApiError> => {\n if (provided) {\n return Effect.succeed(provided);\n }\n\n return pipe(\n Effect.tryPromise({\n try: () => getApiKeyAsync(),\n catch: () =>\n new MarketplaceApiError({\n message: \"Failed to load API key\",\n status: 500,\n code: \"CONFIG_ERROR\",\n }),\n }),\n Effect.flatMap((token) =>\n token\n ? Effect.succeed(token)\n : Effect.fail(\n new MarketplaceApiError({\n message: \"Not signed in. Run 'braid auth'.\",\n status: 401,\n code: \"AUTH_REQUIRED\",\n })\n )\n )\n );\n};\n\nconst resolveServer = (\n provided?: string\n): Effect.Effect<string, MarketplaceApiError> => {\n if (provided) {\n return Effect.succeed(provided.replace(TRAILING_SLASH_REGEX, \"\"));\n }\n\n return pipe(\n Effect.tryPromise({\n try: () => getServerUrlAsync(),\n catch: () =>\n new MarketplaceApiError({\n message: \"Failed to load server URL\",\n status: 500,\n code: \"CONFIG_ERROR\",\n }),\n }),\n Effect.map((server) => server.replace(TRAILING_SLASH_REGEX, \"\"))\n );\n};\n\nconst requestJson = <T>(\n url: string,\n options: RequestInit\n): Effect.Effect<T, MarketplaceApiError> =>\n pipe(\n Effect.tryPromise({\n try: () => fetch(url, options),\n catch: () =>\n new MarketplaceApiError({\n message: \"Network error\",\n status: 503,\n code: \"NETWORK_ERROR\",\n }),\n }),\n Effect.flatMap((response) =>\n Effect.tryPromise({\n try: async () => {\n const payload = (await response.json().catch(() => null)) as {\n error?: string;\n message?: string;\n code?: string;\n } | null;\n\n if (!response.ok) {\n throw new MarketplaceApiError({\n message: payload?.error ?? payload?.message ?? \"Request failed\",\n status: response.status,\n code: payload?.code ?? \"REQUEST_ERROR\",\n });\n }\n\n return payload as T;\n },\n catch: (error) =>\n error instanceof MarketplaceApiError\n ? error\n : new MarketplaceApiError({\n message: \"Invalid response\",\n status: 500,\n code: \"PARSE_ERROR\",\n }),\n })\n )\n );\n\nexport const fetchMarketplaceLibrary = (\n options: MarketplaceClientOptions\n): Effect.Effect<MarketplaceLibraryItem[], MarketplaceApiError> =>\n pipe(\n Effect.all({\n server: resolveServer(options.server),\n apiKey: resolveApiKey(options.apiKey),\n }),\n Effect.flatMap(({ server, apiKey }) =>\n requestJson<MarketplaceLibraryResponse>(\n `${server}/api/marketplace/library`,\n {\n method: \"GET\",\n headers: {\n Authorization: `Bearer ${apiKey}`,\n },\n }\n )\n ),\n Effect.map((response) => response.items)\n );\n\nexport const fetchMarketplaceInstallManifest = (\n slug: string,\n options: MarketplaceClientOptions\n): Effect.Effect<MarketplaceManifestResponse, MarketplaceApiError> =>\n pipe(\n Effect.all({\n server: resolveServer(options.server),\n apiKey: resolveApiKey(options.apiKey),\n }),\n Effect.flatMap(({ server, apiKey }) =>\n requestJson<MarketplaceManifestResponse>(\n `${server}/api/marketplace/install-manifest/${encodeURIComponent(slug)}`,\n {\n method: \"GET\",\n headers: {\n Authorization: `Bearer ${apiKey}`,\n },\n }\n )\n )\n );\n\nexport const fetchMarketplaceLibraryAsync = (\n options: MarketplaceClientOptions\n): Promise<MarketplaceLibraryItem[]> =>\n Effect.runPromise(fetchMarketplaceLibrary(options));\n\nexport const fetchMarketplaceInstallManifestAsync = (\n slug: string,\n options: MarketplaceClientOptions\n): Promise<MarketplaceManifestResponse> =>\n Effect.runPromise(fetchMarketplaceInstallManifest(slug, options));\n\nexport type {\n MarketplaceClientOptions,\n MarketplaceLibraryItem,\n MarketplaceManifestResponse,\n};\nexport { MarketplaceApiError };\n","import type { CanonicalAgentSpec } from \"./agent-writer.ts\";\nimport { writeAgentsForPlatformAsync } from \"./agent-writer.ts\";\nimport type { AgentConfig, AgentId } from \"./agents.ts\";\nimport {\n detectAgentsAsync,\n getAgentById,\n resolveAgentsInstallPath,\n resolveHookConfigPath,\n resolveInstallPath,\n resolveRulesInstallPath,\n} from \"./agents.ts\";\nimport type { ExportedRule } from \"./api.ts\";\nimport { getBundleStoreRoot, getDisabledStoreRoot } from \"./bundle-store.ts\";\nimport { writeMarketplaceHooksAsync } from \"./hook-writer.ts\";\nimport type { MarketplaceManifestResponse } from \"./marketplace-api.ts\";\nimport { updateMetadataAsync } from \"./metadata.ts\";\nimport { writeRulesForAgentAsync } from \"./rule-writer.ts\";\nimport { writeSkillsAsync } from \"./skill-writer.ts\";\n\ninterface InstallMarketplaceSkillSetOptions {\n slug: string;\n manifest: MarketplaceManifestResponse;\n agents?: string;\n global?: boolean;\n allowHooks?: boolean;\n}\n\ninterface InstallMarketplaceSkillSetResult {\n installedSkills: string[];\n targets: string[];\n}\n\ntype ManifestSkillBundle = NonNullable<\n NonNullable<MarketplaceManifestResponse[\"manifest\"]>[\"skills\"]\n>[number];\n\nfunction parseAgentIds(value: string | undefined): AgentId[] {\n if (!value) {\n return [];\n }\n\n return value\n .split(\",\")\n .map((entry) => entry.trim())\n .filter((entry): entry is AgentId =>\n Boolean(getAgentById(entry as AgentId))\n );\n}\n\nasync function resolveTargetAgents(\n agents: string | undefined\n): Promise<AgentConfig[]> {\n const agentIds = parseAgentIds(agents);\n const detected = await detectAgentsAsync();\n\n return agentIds.length\n ? agentIds\n .map((id) => getAgentById(id))\n .filter((agent): agent is NonNullable<typeof agent> => Boolean(agent))\n : detected\n .map((agent) => getAgentById(agent.id))\n .filter((agent): agent is AgentConfig => Boolean(agent));\n}\n\nfunction resolveManifestSkills(\n manifest: MarketplaceManifestResponse\n): ManifestSkillBundle[] {\n const skills = [...(manifest.manifest?.skills ?? [])];\n const workflows = manifest.manifest?.workflows ?? [];\n const existingNames = new Set(skills.map((skill) => skill.name));\n\n for (const workflow of workflows) {\n const bundleName = workflow.bundleName;\n if (existingNames.has(bundleName)) {\n continue;\n }\n\n skills.push({\n kind: workflow.kind,\n name: bundleName,\n files: workflow.files,\n });\n existingNames.add(bundleName);\n }\n\n return skills;\n}\n\nasync function installSkillsForAgent(args: {\n agent: AgentConfig;\n manifest: MarketplaceManifestResponse;\n slug: string;\n skills: NonNullable<MarketplaceManifestResponse[\"manifest\"]>[\"skills\"];\n global?: boolean;\n installedSkills: Set<string>;\n targets: string[];\n}): Promise<boolean> {\n const installPath = resolveInstallPath(args.agent, { global: args.global });\n if (!(installPath && args.skills && args.skills.length > 0)) {\n return false;\n }\n\n const result = await writeSkillsAsync(\n installPath,\n args.skills as never,\n args.agent.id,\n {\n disabledRoot: getDisabledStoreRoot(),\n storeRoot: getBundleStoreRoot(),\n }\n );\n if (result.errors.length > 0) {\n throw new Error(\n result.errors.map((entry) => `${entry.skill}: ${entry.error}`).join(\"; \")\n );\n }\n\n for (const name of result.written) {\n args.installedSkills.add(name);\n }\n\n if (result.written.length === 0) {\n return false;\n }\n\n await updateMetadataAsync(\n installPath,\n result.written.map((name) => ({\n kind: args.skills?.find((skill) => skill.name === name)?.kind ?? \"skill\",\n name,\n source: {\n type: \"marketplace\",\n name: args.slug,\n slug: args.slug,\n title: args.slug,\n versionId: args.manifest.versionId,\n },\n version: args.manifest.versionId ?? args.manifest.commitSha ?? \"unknown\",\n serverUrl: \"https://braid.cloud\",\n }))\n );\n\n args.targets.push(`${args.agent.name} -> ${installPath}`);\n return true;\n}\n\nasync function installRulesForAgent(args: {\n agent: AgentConfig;\n rules: ExportedRule[];\n global?: boolean;\n targets: string[];\n}): Promise<boolean> {\n const rulesPath = resolveRulesInstallPath(args.agent, {\n global: args.global,\n });\n if (!(args.rules.length > 0 && rulesPath && args.agent.ruleFormat)) {\n return false;\n }\n\n const result = await writeRulesForAgentAsync(\n args.agent,\n args.rules,\n rulesPath\n );\n if (result.errors.length > 0) {\n throw new Error(\n result.errors.map((entry) => `${entry.agent}: ${entry.error}`).join(\"; \")\n );\n }\n\n if (result.written === 0) {\n return false;\n }\n\n args.targets.push(`${args.agent.name} rules -> ${rulesPath}`);\n return true;\n}\n\nasync function installAgentsForAgent(args: {\n agent: AgentConfig;\n agents: CanonicalAgentSpec[];\n global?: boolean;\n targets: string[];\n}): Promise<boolean> {\n const agentsPath = resolveAgentsInstallPath(args.agent, {\n global: args.global,\n });\n if (!(args.agents.length > 0 && agentsPath)) {\n return false;\n }\n\n const result = await writeAgentsForPlatformAsync(\n args.agent,\n args.agents,\n agentsPath\n );\n if (result.errors.length > 0) {\n throw new Error(\n result.errors.map((entry) => `${entry.agent}: ${entry.error}`).join(\"; \")\n );\n }\n\n if (result.written.length === 0) {\n return false;\n }\n\n args.targets.push(`${args.agent.name} agents -> ${agentsPath}`);\n return true;\n}\n\nasync function installHooksForAgent(args: {\n agent: AgentConfig;\n hooks: NonNullable<MarketplaceManifestResponse[\"manifest\"]>[\"hooks\"];\n slug: string;\n manifest: MarketplaceManifestResponse;\n global?: boolean;\n targets: string[];\n}): Promise<boolean> {\n const hookConfigPath = resolveHookConfigPath(args.agent, {\n global: args.global,\n });\n if (!(hookConfigPath && args.hooks && args.hooks.length > 0)) {\n return false;\n }\n\n await writeMarketplaceHooksAsync(hookConfigPath, args.hooks, {\n sourceSlug: args.slug,\n source: {\n type: \"marketplace\",\n name: args.slug,\n slug: args.slug,\n title: args.manifest.title ?? args.slug,\n versionId: args.manifest.versionId,\n },\n version: args.manifest.versionId ?? args.manifest.commitSha ?? \"unknown\",\n });\n\n args.targets.push(`${args.agent.name} hooks -> ${hookConfigPath}`);\n return true;\n}\n\nexport async function installMarketplaceSkillSet(\n options: InstallMarketplaceSkillSetOptions\n): Promise<InstallMarketplaceSkillSetResult> {\n if (options.manifest.blocked) {\n throw new Error(\n options.manifest.message ?? \"Install blocked by scan verdict\"\n );\n }\n\n const resolvedSkills = resolveManifestSkills(options.manifest);\n const rules = options.manifest.manifest?.rules ?? [];\n const hooks = options.manifest.manifest?.hooks ?? [];\n const agents = options.manifest.manifest?.agents ?? [];\n const workflows = options.manifest.manifest?.workflows ?? [];\n\n if (hooks.length > 0 && !options.allowHooks) {\n throw new Error(\n \"Marketplace packs with hooks require explicit opt-in. Re-run with --allow-hooks after reviewing the hook commands.\"\n );\n }\n\n if (\n resolvedSkills.length === 0 &&\n rules.length === 0 &&\n hooks.length === 0 &&\n agents.length === 0 &&\n workflows.length === 0\n ) {\n throw new Error(\"No installable content found in manifest\");\n }\n\n const targetAgents = await resolveTargetAgents(options.agents);\n\n if (targetAgents.length === 0) {\n throw new Error(\n \"No compatible agents found. Use --agents to specify targets.\"\n );\n }\n\n const targets: string[] = [];\n const installedSkills = new Set<string>();\n\n for (const agent of targetAgents) {\n await installSkillsForAgent({\n agent,\n manifest: options.manifest,\n slug: options.slug,\n skills: resolvedSkills,\n global: options.global,\n installedSkills,\n targets,\n });\n await installRulesForAgent({\n agent,\n rules: rules as ExportedRule[],\n global: options.global,\n targets,\n });\n await installAgentsForAgent({\n agent,\n agents: agents as CanonicalAgentSpec[],\n global: options.global,\n targets,\n });\n await installHooksForAgent({\n agent,\n hooks,\n slug: options.slug,\n manifest: options.manifest,\n global: options.global,\n targets,\n });\n }\n\n if (targets.length === 0) {\n throw new Error(\"No writable install targets found for selected agents.\");\n }\n\n return {\n installedSkills: [...installedSkills],\n targets,\n };\n}\n","import type { Stats } from \"node:fs\";\nimport { access, constants, lstat, readdir } from \"node:fs/promises\";\nimport { basename, delimiter, dirname, join, resolve } from \"node:path\";\nimport type { DetectedAgent } from \"./agents.ts\";\nimport {\n detectAgentsAsync,\n resolveAgentsInstallPath,\n resolveHookConfigPath,\n resolveInstallPath,\n resolveRulesInstallPath,\n} from \"./agents.ts\";\nimport type {\n BundleScope,\n BundleSurface,\n DisabledBundleRecord,\n} from \"./bundle-store.ts\";\nimport { listDisabledBundlesAsync } from \"./bundle-store.ts\";\nimport {\n buildMarketplaceHookBundlePath,\n listInstalledMarketplaceHookSourcesAsync,\n readMarketplaceHookBundleFileAsync,\n} from \"./hook-writer.ts\";\nimport type { InstalledSkill, InstalledSkillSource } from \"./metadata.ts\";\nimport { METADATA_FILENAME, readMetadataAsync } from \"./metadata.ts\";\n\ntype ManageBundleKind = InstalledSkill[\"kind\"] | \"agent\" | \"hook\" | \"rule\";\ntype ManageBundleState = \"enabled\" | \"disabled\" | \"missing\";\n\ninterface ManageBundle {\n currentPath: string;\n installRoot: string;\n kind: ManageBundleKind;\n managed: boolean;\n name: string;\n originalPath: string;\n source?: InstalledSkillSource;\n state: ManageBundleState;\n installedAt?: string;\n}\n\ninterface ManageSurfaceInventory {\n bundles: ManageBundle[];\n rootPath: string | null;\n surface: BundleSurface;\n}\n\ninterface ManageScopeInventory {\n available: boolean;\n surfaces: {\n agents: ManageSurfaceInventory;\n hooks: ManageSurfaceInventory;\n rules: ManageSurfaceInventory;\n skills: ManageSurfaceInventory;\n };\n}\n\ninterface ManageProviderInventory {\n id: DetectedAgent[\"id\"];\n name: string;\n scopes: {\n global?: ManageScopeInventory;\n project?: ManageScopeInventory;\n };\n}\n\ninterface ManageInventory {\n providers: ManageProviderInventory[];\n}\n\ninterface ManageInventoryOptions {\n detectedAgents?: DetectedAgent[];\n disabledRoot?: string;\n projectRoot?: string;\n}\n\ninterface SurfaceEntry {\n currentPath: string;\n name: string;\n originalPath: string;\n}\n\ninterface ManageDetectionOptions {\n commandExists?: (command: string) => Promise<boolean>;\n disabledRecords?: DisabledBundleRecord[];\n pathExists?: (targetPath: string) => Promise<boolean>;\n}\n\nconst MANAGE_PROVIDER_COMMANDS: Partial<Record<DetectedAgent[\"id\"], string[]>> =\n {\n amp: [\"amp\"],\n \"claude-code\": [\"claude\"],\n codex: [\"codex\"],\n crush: [\"crush\"],\n droid: [\"droid\"],\n \"gemini-cli\": [\"gemini\"],\n goose: [\"goose\"],\n \"kiro-cli\": [\"kiro\"],\n \"kimi-cli\": [\"kimi\"],\n kode: [\"kode\"],\n mcpjam: [\"mcpjam\"],\n moltbot: [\"moltbot\"],\n mux: [\"mux\"],\n opencode: [\"opencode\"],\n openhands: [\"openhands\"],\n qoder: [\"qoder\"],\n \"qwen-code\": [\"qwen\"],\n trae: [\"trae\"],\n zencoder: [\"zencoder\"],\n };\n\nconst MANAGE_PROVIDER_APP_PATHS: Partial<\n Record<DetectedAgent[\"id\"], string[]>\n> =\n process.platform === \"darwin\"\n ? {\n \"claude-desktop\": [\"/Applications/Claude.app\"],\n cursor: [\"/Applications/Cursor.app\"],\n junie: [\"/Applications/Junie.app\"],\n windsurf: [\"/Applications/Windsurf.app\"],\n zed: [\"/Applications/Zed.app\"],\n }\n : {};\n\nasync function safeLstat(targetPath: string): Promise<Stats | null> {\n try {\n return await lstat(targetPath);\n } catch {\n return null;\n }\n}\n\nasync function pathExists(targetPath: string): Promise<boolean> {\n return (await safeLstat(targetPath)) !== null;\n}\n\nfunction getCommandExtensions(): string[] {\n if (process.platform !== \"win32\") {\n return [\"\"];\n }\n\n return (process.env.PATHEXT ?? \".EXE;.CMD;.BAT;.COM\")\n .split(\";\")\n .filter((extension) => extension.length > 0);\n}\n\nfunction getCommandCandidates(command: string, pathValue: string): string[] {\n return pathValue\n .split(delimiter)\n .flatMap((segment) =>\n segment\n ? getCommandExtensions().map((extension) =>\n join(segment, `${command}${extension}`)\n )\n : []\n );\n}\n\nasync function isExecutableCommandPath(candidate: string): Promise<boolean> {\n const stats = await safeLstat(candidate);\n if (!(stats && (stats.isFile() || stats.isSymbolicLink()))) {\n return false;\n }\n\n try {\n await access(candidate, constants.X_OK);\n return true;\n } catch {\n return process.platform === \"win32\";\n }\n}\n\nasync function commandExists(command: string): Promise<boolean> {\n const pathValue = process.env.PATH ?? \"\";\n if (!pathValue) {\n return false;\n }\n\n for (const candidate of getCommandCandidates(command, pathValue)) {\n if (await isExecutableCommandPath(candidate)) {\n return true;\n }\n }\n\n return false;\n}\n\nasync function anyPathExists(\n candidatePaths: string[],\n checkPath: (targetPath: string) => Promise<boolean>\n): Promise<boolean> {\n for (const candidatePath of candidatePaths) {\n if (await checkPath(candidatePath)) {\n return true;\n }\n }\n\n return false;\n}\n\nasync function anyCommandExists(\n commands: string[],\n checkCommand: (command: string) => Promise<boolean>\n): Promise<boolean> {\n for (const command of commands) {\n if (await checkCommand(command)) {\n return true;\n }\n }\n\n return false;\n}\n\nasync function hasInstalledGlobalSkillBundles(\n agent: DetectedAgent\n): Promise<boolean> {\n if (!agent.globalPath) {\n return false;\n }\n\n return (await listSurfaceEntries(agent.globalPath, \"skills\")).length > 0;\n}\n\nfunction hasDisabledGlobalBundles(\n agent: DetectedAgent,\n disabledRecords: DisabledBundleRecord[]\n): boolean {\n return disabledRecords.some(\n (record) => record.agentId === agent.id && record.scope === \"global\"\n );\n}\n\nasync function hasManageGlobalEvidenceAsync(\n agent: DetectedAgent,\n options: ManageDetectionOptions = {}\n): Promise<boolean> {\n const checkPath = options.pathExists ?? pathExists;\n const checkCommand = options.commandExists ?? commandExists;\n const disabledRecords = options.disabledRecords ?? [];\n\n return (\n (await anyPathExists(\n [agent.globalMarkerPath, agent.rulesGlobalPath].filter(\n (value): value is string => Boolean(value)\n ),\n checkPath\n )) ||\n (await anyPathExists(\n MANAGE_PROVIDER_APP_PATHS[agent.id] ?? [],\n checkPath\n )) ||\n (await anyCommandExists(\n MANAGE_PROVIDER_COMMANDS[agent.id] ?? [],\n checkCommand\n )) ||\n (await hasInstalledGlobalSkillBundles(agent)) ||\n hasDisabledGlobalBundles(agent, disabledRecords)\n );\n}\n\nasync function filterDetectedAgentsForManageAsync(\n detectedAgents: DetectedAgent[],\n options: ManageDetectionOptions = {}\n): Promise<DetectedAgent[]> {\n const filtered = await Promise.all(\n detectedAgents.map(async (agent) => {\n if (!agent.hasGlobalConfig) {\n return agent;\n }\n\n if (await hasManageGlobalEvidenceAsync(agent, options)) {\n return agent;\n }\n\n if (agent.hasProjectConfig) {\n return {\n ...agent,\n hasGlobalConfig: false,\n };\n }\n\n return null;\n })\n );\n\n return filtered.filter((agent): agent is DetectedAgent => agent !== null);\n}\n\nasync function listSurfaceEntries(\n rootPath: string,\n surface: BundleSurface\n): Promise<SurfaceEntry[]> {\n const stats = await safeLstat(rootPath);\n if (!stats) {\n return [];\n }\n\n if (stats.isFile() || stats.isSymbolicLink()) {\n return [\n {\n currentPath: rootPath,\n name: basename(rootPath),\n originalPath: rootPath,\n },\n ];\n }\n\n if (!stats.isDirectory()) {\n return [];\n }\n\n const entries = await readdir(rootPath, { withFileTypes: true });\n return entries\n .filter((entry) => {\n if (surface === \"skills\" && entry.name === METADATA_FILENAME) {\n return false;\n }\n return entry.isDirectory() || entry.isFile() || entry.isSymbolicLink();\n })\n .map((entry) => ({\n currentPath: join(rootPath, entry.name),\n name: entry.name,\n originalPath: join(rootPath, entry.name),\n }));\n}\n\nfunction toBundleKey(path: string): string {\n return resolve(path);\n}\n\nfunction sortBundles(bundles: ManageBundle[]): ManageBundle[] {\n return bundles.sort((left, right) => left.name.localeCompare(right.name));\n}\n\nfunction getDisabledRecordsForSurface(args: {\n agent: DetectedAgent;\n scope: BundleScope;\n surface: BundleSurface;\n disabledRecords: DisabledBundleRecord[];\n}): DisabledBundleRecord[] {\n return args.disabledRecords.filter(\n (record) =>\n record.agentId === args.agent.id &&\n record.scope === args.scope &&\n record.surface === args.surface\n );\n}\n\nasync function collectSkillBundles(args: {\n agent: DetectedAgent;\n scope: BundleScope;\n rootPath: string | null;\n disabledRecords: DisabledBundleRecord[];\n}): Promise<ManageBundle[]> {\n if (!args.rootPath) {\n return [];\n }\n\n const diskEntries = await listSurfaceEntries(args.rootPath, \"skills\");\n const metadata = await readMetadataAsync(args.rootPath);\n const metadataByName = new Map(\n metadata.skills.map((skill) => [skill.name, skill])\n );\n const disabledRecords = getDisabledRecordsForSurface({\n agent: args.agent,\n scope: args.scope,\n surface: \"skills\",\n disabledRecords: args.disabledRecords,\n });\n const disabledByPath = new Map(\n disabledRecords.map((record) => [toBundleKey(record.originalPath), record])\n );\n\n const bundles = new Map<string, ManageBundle>();\n\n for (const entry of diskEntries) {\n const metadataEntry = metadataByName.get(entry.name);\n const bundleKey = toBundleKey(entry.originalPath);\n bundles.set(bundleKey, {\n currentPath: entry.currentPath,\n installRoot: args.rootPath,\n kind: metadataEntry?.kind ?? \"skill\",\n managed: metadataEntry !== undefined,\n name: entry.name,\n originalPath: entry.originalPath,\n source: metadataEntry?.source,\n state: disabledByPath.has(bundleKey) ? \"disabled\" : \"enabled\",\n installedAt: metadataEntry?.installedAt,\n });\n }\n\n for (const metadataEntry of metadata.skills) {\n const originalPath = join(args.rootPath, metadataEntry.name);\n const bundleKey = toBundleKey(originalPath);\n\n if (bundles.has(bundleKey)) {\n continue;\n }\n\n const disabledRecord = disabledByPath.get(bundleKey);\n bundles.set(bundleKey, {\n currentPath: disabledRecord?.payloadPath ?? originalPath,\n installRoot: args.rootPath,\n kind: metadataEntry.kind,\n managed: true,\n name: metadataEntry.name,\n originalPath,\n source: metadataEntry.source,\n state: disabledRecord ? \"disabled\" : \"missing\",\n installedAt: metadataEntry.installedAt,\n });\n }\n\n for (const disabledRecord of disabledRecords) {\n const bundleKey = toBundleKey(disabledRecord.originalPath);\n if (bundles.has(bundleKey)) {\n continue;\n }\n\n bundles.set(bundleKey, {\n currentPath: disabledRecord.payloadPath,\n installRoot: args.rootPath,\n kind: \"skill\",\n managed: false,\n name: disabledRecord.displayName,\n originalPath: disabledRecord.originalPath,\n state: \"disabled\",\n });\n }\n\n return sortBundles([...bundles.values()]);\n}\n\nasync function collectGenericSurfaceBundles(\n args: {\n agent: DetectedAgent;\n scope: BundleScope;\n rootPath: string | null;\n surface: Exclude<BundleSurface, \"hooks\" | \"skills\">;\n } & {\n disabledRecords: DisabledBundleRecord[];\n }\n): Promise<ManageBundle[]> {\n if (!args.rootPath) {\n return [];\n }\n\n const diskEntries = await listSurfaceEntries(args.rootPath, args.surface);\n const disabledRecords = getDisabledRecordsForSurface({\n agent: args.agent,\n scope: args.scope,\n surface: args.surface,\n disabledRecords: args.disabledRecords,\n });\n\n const bundles = new Map<string, ManageBundle>();\n\n for (const entry of diskEntries) {\n const bundleKey = toBundleKey(entry.originalPath);\n bundles.set(bundleKey, {\n currentPath: entry.currentPath,\n installRoot: args.rootPath,\n kind: args.surface === \"agents\" ? \"agent\" : \"rule\",\n managed: false,\n name: entry.name,\n originalPath: entry.originalPath,\n state: \"enabled\",\n });\n }\n\n for (const disabledRecord of disabledRecords) {\n const bundleKey = toBundleKey(disabledRecord.originalPath);\n if (bundles.has(bundleKey)) {\n continue;\n }\n\n bundles.set(bundleKey, {\n currentPath: disabledRecord.payloadPath,\n installRoot: args.rootPath,\n kind: args.surface === \"agents\" ? \"agent\" : \"rule\",\n managed: false,\n name: disabledRecord.displayName,\n originalPath: disabledRecord.originalPath,\n state: \"disabled\",\n });\n }\n\n return sortBundles([...bundles.values()]);\n}\n\nasync function collectHookBundles(args: {\n agent: DetectedAgent;\n scope: BundleScope;\n settingsPath: string | null;\n disabledRecords: DisabledBundleRecord[];\n}): Promise<ManageBundle[]> {\n if (!args.settingsPath) {\n return [];\n }\n\n const settingsPath = args.settingsPath;\n const installRoot = dirname(settingsPath);\n const sources = await listInstalledMarketplaceHookSourcesAsync(settingsPath);\n const disabledRecords = getDisabledRecordsForSurface({\n agent: args.agent,\n scope: args.scope,\n surface: \"hooks\",\n disabledRecords: args.disabledRecords,\n });\n const bundles = new Map<string, ManageBundle>();\n\n for (const source of sources) {\n const bundlePath = buildMarketplaceHookBundlePath(\n settingsPath,\n source.sourceSlug\n );\n bundles.set(toBundleKey(bundlePath), {\n currentPath: bundlePath,\n installRoot,\n kind: \"hook\" as const,\n managed: true,\n name: source.sourceSlug,\n originalPath: bundlePath,\n source: source.source,\n state: \"enabled\" as const,\n installedAt: source.installedAt,\n });\n }\n\n for (const disabledRecord of disabledRecords) {\n const bundleKey = toBundleKey(disabledRecord.originalPath);\n if (bundles.has(bundleKey)) {\n continue;\n }\n\n const bundle = await readMarketplaceHookBundleFileAsync(\n disabledRecord.payloadPath\n );\n const bundleName =\n bundle?.sourceSlug ?? basename(disabledRecord.displayName, \".json\");\n\n bundles.set(bundleKey, {\n currentPath: disabledRecord.payloadPath,\n installRoot,\n kind: \"hook\",\n managed: true,\n name: bundleName,\n originalPath: disabledRecord.originalPath,\n source: bundle?.source,\n state: \"disabled\",\n });\n }\n\n return sortBundles([...bundles.values()]);\n}\n\nasync function collectScopeInventory(args: {\n agent: DetectedAgent;\n scope: BundleScope;\n projectRoot?: string;\n disabledRecords: DisabledBundleRecord[];\n}): Promise<ManageScopeInventory> {\n const isGlobal = args.scope === \"global\";\n const skillsRoot =\n resolveInstallPath(args.agent, {\n global: isGlobal,\n projectRoot: args.projectRoot,\n }) ?? null;\n const agentsRoot =\n resolveAgentsInstallPath(args.agent, {\n global: isGlobal,\n projectRoot: args.projectRoot,\n }) ?? null;\n const rulesRoot =\n resolveRulesInstallPath(args.agent, {\n global: isGlobal,\n projectRoot: args.projectRoot,\n }) ?? null;\n const hookSettingsPath =\n resolveHookConfigPath(args.agent, {\n global: isGlobal,\n projectRoot: args.projectRoot,\n }) ?? null;\n\n const [skills, agents, hooks, rules] = await Promise.all([\n collectSkillBundles({\n agent: args.agent,\n scope: args.scope,\n rootPath: skillsRoot,\n disabledRecords: args.disabledRecords,\n }),\n collectGenericSurfaceBundles({\n agent: args.agent,\n scope: args.scope,\n rootPath: agentsRoot,\n surface: \"agents\",\n disabledRecords: args.disabledRecords,\n }),\n collectHookBundles({\n agent: args.agent,\n scope: args.scope,\n settingsPath: hookSettingsPath,\n disabledRecords: args.disabledRecords,\n }),\n collectGenericSurfaceBundles({\n agent: args.agent,\n scope: args.scope,\n rootPath: rulesRoot,\n surface: \"rules\",\n disabledRecords: args.disabledRecords,\n }),\n ]);\n\n return {\n available: isGlobal\n ? args.agent.hasGlobalConfig\n : args.agent.hasProjectConfig,\n surfaces: {\n agents: {\n bundles: agents,\n rootPath: agentsRoot,\n surface: \"agents\",\n },\n hooks: {\n bundles: hooks,\n rootPath: hookSettingsPath ? dirname(hookSettingsPath) : null,\n surface: \"hooks\",\n },\n rules: {\n bundles: rules,\n rootPath: rulesRoot,\n surface: \"rules\",\n },\n skills: {\n bundles: skills,\n rootPath: skillsRoot,\n surface: \"skills\",\n },\n },\n };\n}\n\nasync function getManageInventoryAsync(\n options: ManageInventoryOptions = {}\n): Promise<ManageInventory> {\n const disabledRecords = await listDisabledBundlesAsync({\n disabledRoot: options.disabledRoot,\n });\n const detectedAgents = options.detectedAgents\n ? options.detectedAgents\n : await filterDetectedAgentsForManageAsync(\n await detectAgentsAsync(options.projectRoot),\n { disabledRecords }\n );\n\n const providers = await Promise.all(\n detectedAgents.map(async (agent): Promise<ManageProviderInventory> => {\n const scopes: ManageProviderInventory[\"scopes\"] = {};\n\n if (agent.hasProjectConfig) {\n scopes.project = await collectScopeInventory({\n agent,\n scope: \"project\",\n projectRoot: options.projectRoot,\n disabledRecords,\n });\n }\n\n if (agent.hasGlobalConfig) {\n scopes.global = await collectScopeInventory({\n agent,\n scope: \"global\",\n projectRoot: options.projectRoot,\n disabledRecords,\n });\n }\n\n return {\n id: agent.id,\n name: agent.name,\n scopes,\n };\n })\n );\n\n return {\n providers: providers.sort((left, right) =>\n left.name.localeCompare(right.name)\n ),\n };\n}\n\nexport type {\n ManageBundle,\n ManageBundleKind,\n ManageBundleState,\n ManageInventory,\n ManageInventoryOptions,\n ManageProviderInventory,\n ManageScopeInventory,\n ManageSurfaceInventory,\n};\nexport { filterDetectedAgentsForManageAsync, getManageInventoryAsync };\n","import {\n fetchMarketplaceInstallManifestAsync,\n fetchMarketplaceLibraryAsync,\n} from \"../lib/marketplace-api.ts\";\nimport { installMarketplaceSkillSet } from \"../lib/marketplace-installer.ts\";\nimport { log } from \"../lib/tui.ts\";\n\ninterface MarketplaceOptions {\n server?: string;\n apiKey?: string;\n agents?: string;\n global?: boolean;\n allowHooks?: boolean;\n yes?: boolean;\n}\n\nexport async function marketplaceLibraryCommand(\n options: MarketplaceOptions\n): Promise<void> {\n const items = await fetchMarketplaceLibraryAsync({\n server: options.server,\n apiKey: options.apiKey,\n });\n\n if (items.length === 0) {\n log.info(\"No marketplace packs in your library yet.\");\n return;\n }\n\n for (const item of items) {\n const scan = item.scanVerdict ?? \"clean\";\n const commit = item.commitSha ?? \"unknown\";\n log.info(\n `${item.slug} | ${item.title} | scan=${scan} | commit=${commit} | install=braid marketplace install ${item.slug}`\n );\n }\n}\n\nexport async function marketplaceInstallCommand(\n slug: string,\n options: MarketplaceOptions\n): Promise<void> {\n const manifest = await fetchMarketplaceInstallManifestAsync(slug, {\n server: options.server,\n apiKey: options.apiKey,\n });\n\n const installResult = await installMarketplaceSkillSet({\n slug,\n manifest,\n agents: options.agents,\n global: options.global,\n allowHooks: options.allowHooks,\n });\n\n log.success(`Installed marketplace pack ${slug}`);\n for (const target of installResult.targets) {\n log.info(` ${target}`);\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 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 type { Lockfile } from \"../lib/lockfile.ts\";\nimport {\n parseLockfileKey,\n readLockfileAsync,\n removeLockfileEntryAsync,\n} from \"../lib/lockfile.ts\";\nimport { intro, log, outro, spinner } from \"../lib/tui.ts\";\n\nconst VERSION_SUFFIX_REGEX = /@(\\d+)$/;\nconst VERSION_STRIP_REGEX = /@\\d+$/;\n\ninterface RetractOptions {\n server?: string;\n}\n\nexport function findMatchingLockfileKey(\n lockfile: Lockfile,\n source: string\n): string | null {\n const target = parseLockfileKey(source);\n if (!target) {\n return null;\n }\n\n return (\n Object.keys(lockfile.resolved).find((key) => {\n const parsed = parseLockfileKey(key);\n return (\n parsed?.source === target.source &&\n parsed.handle === target.handle &&\n parsed.slug === target.slug &&\n parsed.version === target.version\n );\n }) ?? null\n );\n}\n\nexport async function retractCommand(\n source: string,\n _options: RetractOptions\n): Promise<void> {\n const versionMatch = source.match(VERSION_SUFFIX_REGEX);\n if (!versionMatch?.[1]) {\n log.error(\"Version required. Usage: braid retract @handle/slug@3\");\n process.exit(1);\n }\n\n const version = Number.parseInt(versionMatch[1], 10);\n const entityRef = source.replace(VERSION_STRIP_REGEX, \"\");\n\n intro(`Unpinning local lock for ${entityRef} v${version}`);\n\n const retractSpinner = spinner();\n retractSpinner.start(\"Removing local lockfile entry...\");\n\n try {\n const lockfile = await readLockfileAsync(process.cwd());\n if (lockfile) {\n const matchingKey = findMatchingLockfileKey(lockfile, source);\n\n if (matchingKey) {\n await removeLockfileEntryAsync(process.cwd(), matchingKey);\n retractSpinner.stop(`Removed ${matchingKey} from braid.lock`);\n } else {\n retractSpinner.stop(\"Not found in lockfile — skipped\");\n }\n } else {\n retractSpinner.stop(\"No braid.lock found — skipped\");\n }\n\n log.info(\n `Only braid.lock was updated. To retract v${version} from the server, use the Releases tab in the web app.`\n );\n\n outro(`Unpinned ${entityRef} v${version}`);\n } catch (error) {\n retractSpinner.stop(\"Retract failed\");\n const message = error instanceof Error ? error.message : String(error);\n log.error(message);\n process.exit(1);\n }\n}\n","import type { SkillsExportResponse } from \"../lib/api.ts\";\nimport { fetchPublicExportAsync } from \"../lib/api.ts\";\nimport {\n buildLockfileKey,\n parseLockfileKey,\n readLockfileAsync,\n upsertLockfileEntryAsync,\n} from \"../lib/lockfile.ts\";\nimport { intro, log, outro, spinner } from \"../lib/tui.ts\";\n\ninterface RollbackOptions {\n server?: string;\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\nasync function findPreviousActiveVersion(args: {\n handle: string;\n slug: string;\n currentVersion: number;\n ruleIds: string[] | undefined;\n server: string | undefined;\n}): Promise<{ version: number; response: SkillsExportResponse } | null> {\n for (let v = args.currentVersion - 1; v >= 1; v--) {\n try {\n const response = await fetchPublicExportAsync(\n args.handle,\n args.slug,\n args.ruleIds,\n args.server,\n v\n );\n return { version: v, response };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n const isVersionUnavailable =\n message.includes(\"VERSION_NOT_FOUND\") ||\n message.includes(\"not found\") ||\n message.includes(\"unavailable\");\n if (!isVersionUnavailable) {\n throw error;\n }\n }\n }\n return null;\n}\n\nexport async function rollbackCommand(\n source: string,\n options: RollbackOptions\n): Promise<void> {\n intro(`Rolling back ${source}`);\n\n const rollbackSpinner = spinner();\n rollbackSpinner.start(\"Reading lockfile...\");\n\n try {\n const lockfile = await readLockfileAsync(process.cwd());\n if (!lockfile) {\n rollbackSpinner.stop(\"No braid.lock found\");\n log.error(\n \"Cannot determine current version. Use 'braid install @handle/slug@<version>' instead.\"\n );\n process.exit(1);\n }\n\n const currentEntry = Object.entries(lockfile.resolved).find(([key]) => {\n const parsed = parseLockfileKey(key);\n if (!parsed) {\n return false;\n }\n const prefix =\n parsed.source === \"marketplace\" ? `@${parsed.handle}` : parsed.handle;\n const keyWithoutVersion = `${prefix}/${parsed.slug}`;\n return source === keyWithoutVersion;\n });\n\n if (!currentEntry) {\n rollbackSpinner.stop(\"Not found in lockfile\");\n log.error(\n `'${source}' is not in braid.lock. Install it first with 'braid install ${source}'.`\n );\n process.exit(1);\n }\n\n const [currentKey, currentValue] = currentEntry;\n const parsed = parseLockfileKey(currentKey);\n if (!parsed) {\n rollbackSpinner.stop(\"Invalid lockfile entry\");\n log.error(`Invalid lockfile key: ${currentKey}`);\n process.exit(1);\n }\n\n if (parsed.source !== \"marketplace\") {\n rollbackSpinner.stop(\"Unsupported source\");\n log.error(\n \"Rollback currently supports marketplace sources only. Org-installed sources cannot be reinstalled from braid.lock yet.\"\n );\n process.exit(1);\n }\n\n if (parsed.version <= 1) {\n rollbackSpinner.stop(\"No previous version\");\n log.error(\n `'${source}' is on version 1 — there is no previous version to roll back to.`\n );\n process.exit(1);\n }\n\n const publicSource = parsePublicSource(source);\n if (!publicSource) {\n rollbackSpinner.stop(\"Unsupported format\");\n log.error(\n \"Rollback currently supports marketplace sources in the format @handle/slug.\"\n );\n process.exit(1);\n }\n\n rollbackSpinner.stop(`Current: v${parsed.version}`);\n rollbackSpinner.start(\"Finding previous active version...\");\n\n const result = await findPreviousActiveVersion({\n handle: publicSource.handle,\n slug: publicSource.slug,\n currentVersion: parsed.version,\n ruleIds: currentValue.ruleIds,\n server: options.server,\n });\n\n if (!result) {\n rollbackSpinner.stop(\"No active version found\");\n log.error(\n `No previous active version found for '${source}'. All earlier versions may be retracted.`\n );\n process.exit(1);\n }\n\n const { version: previousVersion, response: previousRelease } = result;\n rollbackSpinner.stop(`Found active version: v${previousVersion}`);\n\n const newKey = buildLockfileKey(\n parsed.source,\n parsed.handle,\n parsed.slug,\n previousVersion\n );\n\n await upsertLockfileEntryAsync(process.cwd(), newKey, {\n ...currentValue,\n version: previousVersion,\n contentHash: previousRelease.contentHash ?? previousRelease.version,\n ruleIds: currentValue.ruleIds,\n });\n\n if (newKey !== currentKey) {\n const { removeLockfileEntryAsync } = await import(\"../lib/lockfile.ts\");\n await removeLockfileEntryAsync(process.cwd(), currentKey);\n }\n\n log.info(\n `Lockfile updated. Run 'braid install ${source} --locked' to fetch v${previousVersion}.`\n );\n\n outro(`Rolled back ${source}: v${parsed.version} → v${previousVersion}`);\n } catch (error) {\n rollbackSpinner.stop(\"Rollback 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 process from \"node:process\";\nimport type { ScaffoldType } from \"../lib/scaffold.ts\";\nimport {\n inspectScaffoldDirectory,\n ScaffoldError,\n scaffoldArtifact,\n} from \"../lib/scaffold.ts\";\nimport {\n cancel,\n confirm,\n intro,\n isCancel,\n log,\n multiselect,\n outro,\n select,\n text,\n} from \"../lib/tui.ts\";\n\ninterface ScaffoldCommandOptions {\n type?: ScaffoldType;\n name?: string;\n title?: string;\n description?: string;\n linkedSkills?: string;\n skillRef?: string;\n agentRef?: string;\n workflowRef?: string;\n force?: boolean;\n yes?: boolean;\n}\n\nconst promptTitleFromName = (name: string): string =>\n name\n .split(\"-\")\n .filter(Boolean)\n .map((segment) => segment.charAt(0).toUpperCase() + segment.slice(1))\n .join(\" \");\n\nconst slugifyArtifactName = (value: string): string =>\n value\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\");\n\nconst parseList = (value: string | undefined): string[] | undefined => {\n if (!value) {\n return undefined;\n }\n\n const items = value\n .split(\",\")\n .map((item) => item.trim())\n .filter(Boolean);\n\n return items.length > 0 ? [...new Set(items)] : undefined;\n};\n\nconst matchAvailableReference = (\n value: string | undefined,\n availableNames: string[]\n): string | undefined => {\n const trimmed = value?.trim();\n if (!trimmed) {\n return undefined;\n }\n\n const exactMatch = availableNames.find((name) => name === trimmed);\n if (exactMatch) {\n return exactMatch;\n }\n\n const slugified = slugifyArtifactName(trimmed);\n if (!slugified) {\n return undefined;\n }\n\n const slugMatch = availableNames.find((name) => name === slugified);\n return slugMatch;\n};\n\nconst formatAvailableNames = (availableNames: string[]): string =>\n availableNames.length > 0 ? availableNames.join(\", \") : \"(none)\";\n\nconst normalizeReferenceValue = (\n referenceLabel: string,\n availableNamesLabel: string,\n value: string | undefined,\n availableNames: string[]\n): string | undefined => {\n const trimmed = value?.trim();\n if (!trimmed) {\n return undefined;\n }\n\n const match = matchAvailableReference(trimmed, availableNames);\n if (match) {\n return match;\n }\n\n throw new ScaffoldError(\n \"invalid_manifest\",\n `Unknown ${referenceLabel} \"${trimmed}\". Available ${availableNamesLabel}: ${formatAvailableNames(availableNames)}`\n );\n};\n\nconst normalizeReferenceList = (\n referenceLabel: string,\n availableNamesLabel: string,\n values: string[] | undefined,\n availableNames: string[]\n): string[] | undefined => {\n if (!values) {\n return undefined;\n }\n\n const normalized = values\n .map((value) =>\n normalizeReferenceValue(\n referenceLabel,\n availableNamesLabel,\n value,\n availableNames\n )\n )\n .filter((value): value is string => value !== undefined);\n\n return normalized.length > 0 ? [...new Set(normalized)] : undefined;\n};\n\nconst exitCancelled = (): never => {\n cancel(\"Scaffold cancelled.\");\n process.exit(0);\n};\n\nconst exitWithError = (message: string): never => {\n log.error(message);\n process.exit(1);\n};\n\nconst requirePromptValue = <T>(value: T | symbol): T => {\n if (isCancel(value)) {\n exitCancelled();\n }\n return value as T;\n};\n\nconst resolveType = async (\n options: ScaffoldCommandOptions\n): Promise<ScaffoldType> => {\n if (options.type) {\n return options.type;\n }\n if (options.yes) {\n return exitWithError(\"--type is required when using --yes\");\n }\n\n const selected = requirePromptValue(\n await select<ScaffoldType>({\n message: \"What do you want to scaffold?\",\n options: [\n {\n value: \"skill\",\n label: \"Skill\",\n hint: \"Create skills/<name>/SKILL.md\",\n },\n { value: \"rule\", label: \"Rule\", hint: \"Create rules/<name>.md\" },\n { value: \"agent\", label: \"Agent\", hint: \"Create agents/<name>.md\" },\n { value: \"hook\", label: \"Hook\", hint: \"Create hooks/<name>.json\" },\n {\n value: \"workflow\",\n label: \"Workflow\",\n hint: \"Create workflows/<name>.json\",\n },\n ],\n initialValue: \"skill\",\n })\n );\n return selected;\n};\n\nconst resolveName = async (\n options: ScaffoldCommandOptions\n): Promise<string> => {\n if (options.name?.trim()) {\n return options.name.trim();\n }\n if (options.yes) {\n return exitWithError(\"--name is required when using --yes\");\n }\n\n const value = requirePromptValue(\n await text({\n message: \"Artifact name\",\n placeholder: \"requesting-code-review\",\n validate: (input) =>\n (input ?? \"\").trim().length > 0 ? undefined : \"Name is required\",\n })\n );\n return value.trim();\n};\n\nconst resolveTitle = async (\n name: string,\n options: ScaffoldCommandOptions\n): Promise<string | undefined> => {\n if (options.title?.trim()) {\n return options.title.trim();\n }\n if (options.yes) {\n return undefined;\n }\n\n const value = requirePromptValue(\n await text({\n message: \"Title\",\n placeholder: promptTitleFromName(name),\n })\n );\n\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n};\n\nconst resolveDescription = async (\n options: ScaffoldCommandOptions\n): Promise<string | undefined> => {\n if (options.description?.trim()) {\n return options.description.trim();\n }\n if (options.yes) {\n return undefined;\n }\n\n const value = requirePromptValue(\n await text({\n message: \"Description\",\n placeholder: \"Describe when to use this artifact\",\n })\n );\n\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n};\n\nconst resolveLinkedSkills = async (\n options: ScaffoldCommandOptions,\n availableSkillNames: string[]\n): Promise<string[] | undefined> => {\n const fromFlags = parseList(options.linkedSkills);\n if (fromFlags) {\n return fromFlags;\n }\n if (options.yes || availableSkillNames.length === 0) {\n return undefined;\n }\n\n const selected = requirePromptValue(\n await multiselect({\n message: \"Link skills to this agent?\",\n options: availableSkillNames.map((skillName) => ({\n value: skillName,\n label: skillName,\n })),\n required: false,\n })\n );\n\n return selected.length > 0 ? selected : undefined;\n};\n\nconst resolveOptionalReference = async (\n label: string,\n flagValue: string | undefined,\n options: ScaffoldCommandOptions,\n availableNames: string[]\n): Promise<string | undefined> => {\n if (flagValue?.trim()) {\n return flagValue.trim();\n }\n if (options.yes || availableNames.length === 0) {\n return undefined;\n }\n\n const selected = requirePromptValue(\n await select<string>({\n message: `Select ${label} (optional)`,\n options: [\n { value: \"\", label: \"None\" },\n ...availableNames.map((name) => ({\n value: name,\n label: name,\n })),\n ],\n initialValue: \"\",\n })\n );\n\n return selected || undefined;\n};\n\nconst buildScaffoldInput = async (options: ScaffoldCommandOptions) => {\n const context = await inspectScaffoldDirectory(process.cwd());\n const availableSkillNames = context.manifest.skills.map(\n (entry) => entry.name\n );\n const availableAgentNames = context.manifest.agents.map(\n (entry) => entry.name\n );\n const availableWorkflowNames = context.manifest.workflows.map(\n (entry) => entry.name\n );\n const type = await resolveType(options);\n const name = await resolveName(options);\n const title = await resolveTitle(name, options);\n const description = await resolveDescription(options);\n\n const linkedSkillNames =\n type === \"agent\"\n ? normalizeReferenceList(\n \"linked skill\",\n \"skill names\",\n await resolveLinkedSkills(options, availableSkillNames),\n availableSkillNames\n )\n : undefined;\n\n const skillRef =\n type === \"workflow\"\n ? normalizeReferenceValue(\n \"skill reference\",\n \"skill names\",\n await resolveOptionalReference(\n \"a skill reference\",\n options.skillRef,\n options,\n availableSkillNames\n ),\n availableSkillNames\n )\n : undefined;\n\n const agentRef =\n type === \"workflow\"\n ? normalizeReferenceValue(\n \"agent reference\",\n \"agent names\",\n await resolveOptionalReference(\n \"an agent reference\",\n options.agentRef,\n options,\n availableAgentNames\n ),\n availableAgentNames\n )\n : undefined;\n\n const workflowRef =\n type === \"workflow\"\n ? normalizeReferenceValue(\n \"workflow reference\",\n \"workflow names\",\n await resolveOptionalReference(\n \"a workflow reference\",\n options.workflowRef,\n options,\n availableWorkflowNames\n ),\n availableWorkflowNames\n )\n : undefined;\n\n return {\n cwd: process.cwd(),\n type,\n name,\n title,\n description,\n linkedSkillNames,\n skillRef,\n agentRef,\n workflowRef,\n force: options.force,\n };\n};\n\nconst logSuccess = (\n type: ScaffoldType,\n name: string,\n createdFiles: string[]\n) => {\n log.success(`Scaffolded ${type} ${name}`);\n log.info(\"Created files:\");\n for (const file of createdFiles) {\n log.info(` ${file}`);\n }\n log.info(\n \"Next: commit these files and push the pack repo before importing from GitHub.\"\n );\n};\n\nconst finishScaffoldSuccess = (\n type: ScaffoldType,\n name: string,\n createdFiles: string[]\n) => {\n logSuccess(type, name, createdFiles);\n outro(\"Scaffold complete.\");\n};\n\nconst isMockedProcessExitError = (error: unknown): boolean =>\n error instanceof Error && error.message.startsWith(\"process.exit:\");\n\nconst handleScaffoldCommandFailure = (error: unknown): never => {\n if (error instanceof ScaffoldError) {\n exitWithError(error.message);\n }\n if (error instanceof Error && !isMockedProcessExitError(error)) {\n exitWithError(error.message);\n }\n\n throw error;\n};\n\nconst retryWithOverwrite = async ({\n options,\n scaffoldInput,\n}: {\n options: ScaffoldCommandOptions;\n scaffoldInput: Awaited<ReturnType<typeof buildScaffoldInput>>;\n}): Promise<boolean> => {\n if (scaffoldInput.force || options.yes) {\n return false;\n }\n\n const shouldOverwrite = await confirm({\n message: \"Overwrite the existing scaffolded file?\",\n initialValue: true,\n });\n\n if (isCancel(shouldOverwrite)) {\n exitCancelled();\n }\n if (!shouldOverwrite) {\n exitCancelled();\n }\n\n const result = await scaffoldArtifact({\n ...scaffoldInput,\n force: true,\n });\n finishScaffoldSuccess(\n scaffoldInput.type,\n scaffoldInput.name,\n result.createdFiles\n );\n return true;\n};\n\nexport async function scaffoldCommand(\n options: ScaffoldCommandOptions\n): Promise<void> {\n intro(\"braid scaffold\");\n\n try {\n const scaffoldInput = await buildScaffoldInput(options);\n\n try {\n const result = await scaffoldArtifact(scaffoldInput);\n finishScaffoldSuccess(\n scaffoldInput.type,\n scaffoldInput.name,\n result.createdFiles\n );\n return;\n } catch (error) {\n if (\n error instanceof ScaffoldError &&\n error.code === \"target_exists\" &&\n (await retryWithOverwrite({ options, scaffoldInput }))\n ) {\n return;\n }\n\n throw error;\n }\n } catch (error) {\n handleScaffoldCommandFailure(error);\n }\n}\n","import type { Dirent } from \"node:fs\";\nimport { constants as fsConstants } from \"node:fs\";\nimport {\n access,\n mkdir,\n readdir,\n readFile,\n rm,\n stat,\n writeFile,\n} from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\n\nexport type ScaffoldType = \"skill\" | \"rule\" | \"agent\" | \"hook\" | \"workflow\";\nexport type ScaffoldDirectoryState =\n | \"manifest-pack\"\n | \"legacy-root-skill\"\n | \"plain-directory\";\n\ninterface SkillManifestEntry {\n name: string;\n path: string;\n}\n\ninterface RuleManifestEntry {\n name: string;\n path: string;\n title?: string;\n tags?: string[];\n priority?: number;\n}\n\ninterface AgentManifestEntry {\n name: string;\n path: string;\n linkedSkillNames: string[];\n}\n\ninterface HookManifestEntry {\n name: string;\n path: string;\n}\n\ninterface WorkflowManifestEntry {\n name: string;\n path: string;\n skillRefs: string[];\n agentRefs: string[];\n workflowRefs: string[];\n}\n\nexport interface BraidPackManifest {\n version: 1;\n skills: SkillManifestEntry[];\n rules: RuleManifestEntry[];\n agents: AgentManifestEntry[];\n hooks: HookManifestEntry[];\n workflows: WorkflowManifestEntry[];\n}\n\nexport interface ScaffoldInput {\n cwd: string;\n type: ScaffoldType;\n name: string;\n title?: string;\n description?: string;\n force?: boolean;\n linkedSkillNames?: string[];\n skillRef?: string;\n agentRef?: string;\n workflowRef?: string;\n}\n\nexport interface ScaffoldResult {\n createdFiles: string[];\n updatedManifest: boolean;\n}\n\nexport interface ScaffoldContext {\n state: ScaffoldDirectoryState;\n manifest: BraidPackManifest;\n manifestPath: string;\n}\n\ninterface PreparedScaffoldOperation {\n absoluteArtifactPath: string;\n absoluteManifestPath: string;\n existingEntry: ManifestEntry | undefined;\n filePath: string;\n nextManifest: BraidPackManifest;\n previousManifestContent: string | undefined;\n}\n\ntype ManifestEntry =\n | SkillManifestEntry\n | RuleManifestEntry\n | AgentManifestEntry\n | HookManifestEntry\n | WorkflowManifestEntry;\n\ntype ManifestCollectionKey =\n | \"skills\"\n | \"rules\"\n | \"agents\"\n | \"hooks\"\n | \"workflows\";\ntype ScaffoldErrorCode =\n | \"invalid_repo_state\"\n | \"invalid_manifest\"\n | \"duplicate_name\"\n | \"target_exists\"\n | \"io_error\";\n\nconst BRAID_PACK_FILENAME = \"braid-pack.json\";\nconst DEFAULT_TIMEOUT_MS = 300_000;\nconst MAX_DURATION_MS = 1_800_000;\nconst AGENT_FRONTMATTER_START_REGEX = /^\\s*---\\s*[\\r\\n]/;\nconst SUBAGENT_MODE_REGEX = /(?:^|\\r?\\n)mode:\\s*subagent(?:\\r?\\n|$)/;\n\nconst defaultManifest = (): BraidPackManifest => ({\n version: 1,\n skills: [],\n rules: [],\n agents: [],\n hooks: [],\n workflows: [],\n});\n\nconst MANIFEST_KEY_BY_TYPE: Record<ScaffoldType, ManifestCollectionKey> = {\n skill: \"skills\",\n rule: \"rules\",\n agent: \"agents\",\n hook: \"hooks\",\n workflow: \"workflows\",\n};\n\nconst normalizeList = (values: string[] | undefined): string[] => [\n ...new Set((values ?? []).map((value) => value.trim()).filter(Boolean)),\n];\n\nconst assertNever = (value: never): never => {\n throw new ScaffoldError(\n \"invalid_manifest\",\n `Unsupported scaffold type: ${value}`\n );\n};\n\nconst slugify = (value: string): string =>\n value\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\");\n\nconst toTitleCase = (value: string): string =>\n value\n .split(\"-\")\n .filter(Boolean)\n .map((segment) => segment.charAt(0).toUpperCase() + segment.slice(1))\n .join(\" \");\n\nconst sortByName = <T extends { name: string }>(entries: T[]): T[] =>\n [...entries].sort((left, right) => left.name.localeCompare(right.name));\n\nconst normalizeManifestPath = (pathValue: string, context: string): string => {\n const trimmed = pathValue.trim();\n if (!trimmed) {\n throw new ScaffoldError(\"invalid_manifest\", `${context} path is required`);\n }\n if (trimmed.startsWith(\"/\")) {\n throw new ScaffoldError(\n \"invalid_manifest\",\n `${context} path must be relative to the manifest`\n );\n }\n\n const parts = trimmed.split(\"/\").filter(Boolean);\n if (parts.length === 0) {\n throw new ScaffoldError(\"invalid_manifest\", `${context} path is required`);\n }\n if (parts.some((part) => part === \".\" || part === \"..\")) {\n throw new ScaffoldError(\n \"invalid_manifest\",\n `${context} path must not contain path traversal segments`\n );\n }\n\n return parts.join(\"/\");\n};\n\nconst manifestExists = async (path: string): Promise<boolean> => {\n try {\n await access(path);\n return true;\n } catch {\n return false;\n }\n};\n\nconst isObjectRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\nconst readRequiredString = (\n record: Record<string, unknown>,\n key: string,\n context: string\n): string => {\n const value = record[key];\n if (typeof value !== \"string\" || value.trim().length === 0) {\n throw new ScaffoldError(\n \"invalid_manifest\",\n `${context}.${key} must be a non-empty string`\n );\n }\n return value.trim();\n};\n\nconst readStringArray = (\n record: Record<string, unknown>,\n key: string,\n context: string\n): string[] => {\n const value = record[key];\n if (value === undefined) {\n return [];\n }\n if (\n !Array.isArray(value) ||\n value.some((entry) => typeof entry !== \"string\")\n ) {\n throw new ScaffoldError(\n \"invalid_manifest\",\n `${context}.${key} must be an array of strings`\n );\n }\n return normalizeList(value);\n};\n\nconst formatIoError = (error: unknown): string =>\n error instanceof Error ? error.message : \"Unknown filesystem error\";\n\nconst isNotFoundError = (error: unknown): boolean =>\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n error.code === \"ENOENT\";\n\nconst toIoError = (path: string, error: unknown): ScaffoldError =>\n new ScaffoldError(\n \"io_error\",\n `Unable to update ${path}: ${formatIoError(error)}`\n );\n\nconst readManifestFile = async (manifestPath: string): Promise<string> => {\n try {\n return await readFile(manifestPath, \"utf-8\");\n } catch (error) {\n throw new ScaffoldError(\n \"io_error\",\n `Unable to read ${BRAID_PACK_FILENAME}: ${formatIoError(error)}`\n );\n }\n};\n\nconst readInspectionFile = async (absolutePath: string): Promise<string> => {\n try {\n return await readFile(absolutePath, \"utf-8\");\n } catch (error) {\n throw new ScaffoldError(\n \"io_error\",\n `Unable to read ${absolutePath}: ${formatIoError(error)}`\n );\n }\n};\n\nconst directoryContainsMatchingFile = async (\n absoluteDirectoryPath: string,\n matcher: (\n absoluteEntryPath: string,\n entryName: string\n ) => Promise<boolean> | boolean\n): Promise<boolean> => {\n let entries: Dirent[];\n try {\n const directoryStats = await stat(absoluteDirectoryPath);\n if (!directoryStats.isDirectory()) {\n return false;\n }\n\n entries = await readdir(absoluteDirectoryPath, { withFileTypes: true });\n } catch (error) {\n if (isNotFoundError(error)) {\n return false;\n }\n\n throw new ScaffoldError(\n \"io_error\",\n `Unable to inspect ${absoluteDirectoryPath}: ${formatIoError(error)}`\n );\n }\n\n for (const entry of entries) {\n const absoluteEntryPath = join(absoluteDirectoryPath, entry.name);\n\n if (entry.isDirectory()) {\n if (await directoryContainsMatchingFile(absoluteEntryPath, matcher)) {\n return true;\n }\n continue;\n }\n\n if (await matcher(absoluteEntryPath, entry.name)) {\n return true;\n }\n }\n\n return false;\n};\n\nconst directoryContainsSkillArtifact = async (\n absoluteDirectoryPath: string\n): Promise<boolean> =>\n directoryContainsMatchingFile(\n absoluteDirectoryPath,\n (_absoluteEntryPath, entryName) => entryName === \"SKILL.md\"\n );\n\nconst directoryContainsAgentArtifact = async (\n absoluteDirectoryPath: string\n): Promise<boolean> =>\n directoryContainsMatchingFile(\n absoluteDirectoryPath,\n async (absoluteEntryPath, entryName) => {\n if (!entryName.toLowerCase().endsWith(\".md\")) {\n return false;\n }\n\n const content = await readInspectionFile(absoluteEntryPath);\n return (\n AGENT_FRONTMATTER_START_REGEX.test(content) &&\n SUBAGENT_MODE_REGEX.test(content)\n );\n }\n );\n\nconst directoryContainsWorkflowArtifact = async (\n absoluteDirectoryPath: string\n): Promise<boolean> =>\n directoryContainsMatchingFile(\n absoluteDirectoryPath,\n async (absoluteEntryPath, entryName) => {\n if (!entryName.toLowerCase().endsWith(\".json\")) {\n return false;\n }\n\n try {\n const parsed = JSON.parse(await readInspectionFile(absoluteEntryPath));\n return (\n isObjectRecord(parsed) &&\n parsed.version === 1 &&\n parsed.kind === \"workflow\"\n );\n } catch {\n return false;\n }\n }\n );\n\nconst directoryContainsHookArtifact = async (\n absoluteDirectoryPath: string\n): Promise<boolean> =>\n directoryContainsMatchingFile(\n absoluteDirectoryPath,\n async (absoluteEntryPath, entryName) => {\n if (!entryName.toLowerCase().endsWith(\".json\")) {\n return false;\n }\n\n try {\n const parsed = JSON.parse(await readInspectionFile(absoluteEntryPath));\n return (\n isObjectRecord(parsed) &&\n parsed.version === 1 &&\n parsed.kind === \"hook\"\n );\n } catch {\n return false;\n }\n }\n );\n\nconst hasUnmanifestedPackContent = async (cwd: string): Promise<boolean> => {\n if (await manifestExists(join(cwd, \"SKILL.md\"))) {\n return true;\n }\n\n if (await directoryContainsSkillArtifact(join(cwd, \"skills\"))) {\n return true;\n }\n if (await directoryContainsAgentArtifact(join(cwd, \"agents\"))) {\n return true;\n }\n if (await directoryContainsHookArtifact(join(cwd, \"hooks\"))) {\n return true;\n }\n\n return directoryContainsWorkflowArtifact(join(cwd, \"workflows\"));\n};\n\nconst parseManifestEntries = <T extends ManifestEntry>(\n manifest: Record<string, unknown>,\n key: ManifestCollectionKey,\n parser: (record: Record<string, unknown>, context: string) => T\n): T[] => {\n const value = manifest[key];\n if (value === undefined) {\n return [];\n }\n if (!Array.isArray(value)) {\n throw new ScaffoldError(\"invalid_manifest\", `${key} must be an array`);\n }\n\n return value.map((entry, index) => {\n if (!isObjectRecord(entry)) {\n throw new ScaffoldError(\n \"invalid_manifest\",\n `${key}[${index}] must be an object`\n );\n }\n return parser(entry, `${key}[${index}]`);\n });\n};\n\nconst parseManifest = (content: string): BraidPackManifest => {\n let parsed: unknown;\n try {\n parsed = JSON.parse(content);\n } catch {\n throw new ScaffoldError(\n \"invalid_manifest\",\n \"braid-pack.json must be valid JSON\"\n );\n }\n\n if (!isObjectRecord(parsed)) {\n throw new ScaffoldError(\n \"invalid_manifest\",\n \"braid-pack.json must contain an object\"\n );\n }\n if (parsed.version !== 1) {\n throw new ScaffoldError(\n \"invalid_manifest\",\n \"braid-pack.json version must be 1\"\n );\n }\n\n return {\n version: 1,\n skills: sortByName(\n parseManifestEntries(parsed, \"skills\", (entry, context) => ({\n name: readRequiredString(entry, \"name\", context),\n path: normalizeManifestPath(\n readRequiredString(entry, \"path\", context),\n context\n ),\n }))\n ),\n rules: sortByName(\n parseManifestEntries(parsed, \"rules\", (entry, context) => ({\n name: readRequiredString(entry, \"name\", context),\n path: normalizeManifestPath(\n readRequiredString(entry, \"path\", context),\n context\n ),\n title:\n typeof entry.title === \"string\" && entry.title.trim().length > 0\n ? entry.title.trim()\n : undefined,\n tags: readStringArray(entry, \"tags\", context),\n priority:\n typeof entry.priority === \"number\" ? entry.priority : undefined,\n }))\n ),\n agents: sortByName(\n parseManifestEntries(parsed, \"agents\", (entry, context) => ({\n name: readRequiredString(entry, \"name\", context),\n path: normalizeManifestPath(\n readRequiredString(entry, \"path\", context),\n context\n ),\n linkedSkillNames: readStringArray(entry, \"linkedSkillNames\", context),\n }))\n ),\n hooks: sortByName(\n parseManifestEntries(parsed, \"hooks\", (entry, context) => ({\n name: readRequiredString(entry, \"name\", context),\n path: normalizeManifestPath(\n readRequiredString(entry, \"path\", context),\n context\n ),\n }))\n ),\n workflows: sortByName(\n parseManifestEntries(parsed, \"workflows\", (entry, context) => ({\n name: readRequiredString(entry, \"name\", context),\n path: normalizeManifestPath(\n readRequiredString(entry, \"path\", context),\n context\n ),\n skillRefs: readStringArray(entry, \"skillRefs\", context),\n agentRefs: readStringArray(entry, \"agentRefs\", context),\n workflowRefs: readStringArray(entry, \"workflowRefs\", context),\n }))\n ),\n };\n};\n\nconst stringifyManifest = (manifest: BraidPackManifest): string =>\n `${JSON.stringify(\n {\n version: 1,\n skills: sortByName(manifest.skills),\n rules: sortByName(manifest.rules),\n agents: sortByName(manifest.agents),\n hooks: sortByName(manifest.hooks),\n workflows: sortByName(manifest.workflows),\n },\n null,\n 2\n )}\\n`;\n\nconst yamlString = (value: string): string =>\n JSON.stringify(value.replace(/\\n+/g, \" \").trim());\n\nconst buildSkillTemplate = (input: {\n name: string;\n title: string;\n description: string;\n}): string =>\n [\n \"---\",\n `name: ${input.name}`,\n `description: ${yamlString(input.description)}`,\n \"---\",\n \"\",\n `# ${input.title}`,\n \"\",\n \"## When to use\",\n \"\",\n \"- Replace this with the situations where this skill should run.\",\n \"\",\n \"## Instructions\",\n \"\",\n \"- Replace this with the exact guidance this skill should provide.\",\n \"\",\n ].join(\"\\n\");\n\nconst buildRuleTemplate = (input: {\n title: string;\n description: string;\n}): string =>\n [\n `# ${input.title}`,\n \"\",\n input.description,\n \"\",\n \"Add the rule guidance here.\",\n \"\",\n ].join(\"\\n\");\n\nconst buildAgentTemplate = (input: {\n description: string;\n linkedSkillNames: string[];\n name: string;\n}): string => {\n const lines = [\n \"---\",\n `description: ${yamlString(input.description)}`,\n \"mode: subagent\",\n ];\n\n if (input.linkedSkillNames.length > 0) {\n lines.push(\"skills:\");\n for (const skillName of input.linkedSkillNames) {\n lines.push(` - ${skillName}`);\n }\n }\n\n lines.push(\n \"---\",\n \"\",\n `You are the \\`${input.name}\\` agent.`,\n \"\",\n \"Replace this prompt with the instructions this agent should follow.\",\n \"\"\n );\n\n return lines.join(\"\\n\");\n};\n\nconst buildHookTemplate = (input: { description: string; title: string }) =>\n `${JSON.stringify(\n {\n version: 1,\n kind: \"hook\",\n title: input.title,\n description: input.description,\n runtime: \"claude\",\n event: \"PreToolUse\",\n enabled: true,\n schemaVersion: 1,\n handlers: [\n {\n type: \"command\",\n command: \"echo 'Replace with your hook command'\",\n },\n ],\n },\n null,\n 2\n )}\\n`;\n\nconst buildWorkflowTemplate = (input: {\n description: string;\n skillRef?: string;\n agentRef?: string;\n workflowRef?: string;\n title: string;\n}) => {\n const nodes: Record<string, unknown>[] = [\n {\n key: \"input\",\n nodeType: \"input\",\n label: \"Input\",\n positionX: 0,\n positionY: 200,\n },\n {\n key: \"main-task\",\n nodeType: \"prompt\",\n label: \"Main Task\",\n positionX: 260,\n positionY: 200,\n promptTemplate: `Complete the ${input.title} workflow.`,\n ...(input.skillRef ? { skillRef: input.skillRef } : {}),\n ...(input.agentRef ? { agentRef: input.agentRef } : {}),\n },\n ];\n\n const edges: Record<string, string>[] = [\n {\n key: \"input->main-task\",\n sourceNodeKey: \"input\",\n targetNodeKey: \"main-task\",\n },\n ];\n\n let previousNodeKey = \"main-task\";\n let outputPositionX = 520;\n\n if (input.workflowRef) {\n const subFlowNodeKey = `run-${slugify(input.workflowRef)}`;\n nodes.push({\n key: subFlowNodeKey,\n nodeType: \"sub_flow\",\n label: `Run ${toTitleCase(input.workflowRef)}`,\n positionX: 520,\n positionY: 200,\n subFlowRef: input.workflowRef,\n });\n edges.push({\n key: `${previousNodeKey}->${subFlowNodeKey}`,\n sourceNodeKey: previousNodeKey,\n targetNodeKey: subFlowNodeKey,\n });\n previousNodeKey = subFlowNodeKey;\n outputPositionX = 780;\n }\n\n nodes.push({\n key: \"output\",\n nodeType: \"output\",\n label: \"Output\",\n positionX: outputPositionX,\n positionY: 200,\n });\n edges.push({\n key: `${previousNodeKey}->output`,\n sourceNodeKey: previousNodeKey,\n targetNodeKey: \"output\",\n });\n\n return `${JSON.stringify(\n {\n version: 1,\n kind: \"workflow\",\n name: input.title,\n description: input.description,\n defaultTimeoutMs: DEFAULT_TIMEOUT_MS,\n maxDurationMs: MAX_DURATION_MS,\n sharedWithOrg: false,\n nodes,\n edges,\n },\n null,\n 2\n )}\\n`;\n};\n\nconst resolveArtifactPaths = (type: ScaffoldType, name: string) => {\n switch (type) {\n case \"skill\":\n return {\n manifestPath: `skills/${name}`,\n filePath: `skills/${name}/SKILL.md`,\n };\n case \"rule\":\n return {\n manifestPath: `rules/${name}.md`,\n filePath: `rules/${name}.md`,\n };\n case \"agent\":\n return {\n manifestPath: `agents/${name}.md`,\n filePath: `agents/${name}.md`,\n };\n case \"hook\":\n return {\n manifestPath: `hooks/${name}.json`,\n filePath: `hooks/${name}.json`,\n };\n case \"workflow\":\n return {\n manifestPath: `workflows/${name}.json`,\n filePath: `workflows/${name}.json`,\n };\n default:\n return assertNever(type);\n }\n};\n\nconst buildManifestEntry = (\n input: ScaffoldInput,\n manifestPath: string,\n existingEntry?: ManifestEntry\n): ManifestEntry => {\n switch (input.type) {\n case \"skill\":\n return {\n name: input.name,\n path: manifestPath,\n };\n case \"rule\": {\n const existingRule = existingEntry as RuleManifestEntry | undefined;\n const title =\n input.title?.trim() || existingRule?.title || toTitleCase(input.name);\n return {\n name: input.name,\n path: manifestPath,\n title,\n tags: existingRule?.tags,\n priority: existingRule?.priority,\n };\n }\n case \"agent\": {\n const existingAgent = existingEntry as AgentManifestEntry | undefined;\n return {\n name: input.name,\n path: manifestPath,\n linkedSkillNames:\n input.linkedSkillNames ?? existingAgent?.linkedSkillNames ?? [],\n };\n }\n case \"hook\":\n return {\n name: input.name,\n path: manifestPath,\n };\n case \"workflow\": {\n const existingWorkflow = existingEntry as\n | WorkflowManifestEntry\n | undefined;\n return {\n name: input.name,\n path: manifestPath,\n skillRefs:\n input.skillRef !== undefined\n ? normalizeList([input.skillRef])\n : (existingWorkflow?.skillRefs ?? []),\n agentRefs:\n input.agentRef !== undefined\n ? normalizeList([input.agentRef])\n : (existingWorkflow?.agentRefs ?? []),\n workflowRefs:\n input.workflowRef !== undefined\n ? normalizeList([input.workflowRef])\n : (existingWorkflow?.workflowRefs ?? []),\n };\n }\n default:\n return assertNever(input.type);\n }\n};\n\nconst formatAvailableReferenceNames = (availableNames: string[]): string =>\n availableNames.length > 0 ? [...availableNames].sort().join(\", \") : \"(none)\";\n\nconst validateReferenceNames = (\n values: string[],\n availableNames: string[],\n referenceLabel: string,\n availableNamesLabel: string\n) => {\n const availableNameSet = new Set(availableNames);\n\n for (const value of values) {\n if (!availableNameSet.has(value)) {\n throw new ScaffoldError(\n \"invalid_manifest\",\n `Unknown ${referenceLabel} \"${value}\". Available ${availableNamesLabel}: ${formatAvailableReferenceNames(availableNames)}`\n );\n }\n }\n};\n\nconst validateManifestEntryReferences = (\n type: ScaffoldType,\n entry: ManifestEntry,\n manifest: BraidPackManifest\n) => {\n switch (type) {\n case \"agent\":\n validateReferenceNames(\n (entry as AgentManifestEntry).linkedSkillNames,\n manifest.skills.map((skill) => skill.name),\n \"linked skill\",\n \"skill names\"\n );\n return;\n case \"hook\":\n return;\n case \"workflow\":\n if ((entry as WorkflowManifestEntry).workflowRefs.includes(entry.name)) {\n throw new ScaffoldError(\n \"invalid_manifest\",\n `Workflow \"${entry.name}\" cannot reference itself.`\n );\n }\n validateReferenceNames(\n (entry as WorkflowManifestEntry).skillRefs,\n manifest.skills.map((skill) => skill.name),\n \"skill reference\",\n \"skill names\"\n );\n validateReferenceNames(\n (entry as WorkflowManifestEntry).agentRefs,\n manifest.agents.map((agent) => agent.name),\n \"agent reference\",\n \"agent names\"\n );\n validateReferenceNames(\n (entry as WorkflowManifestEntry).workflowRefs,\n manifest.workflows.map((workflow) => workflow.name),\n \"workflow reference\",\n \"workflow names\"\n );\n return;\n case \"skill\":\n case \"rule\":\n return;\n default:\n return assertNever(type);\n }\n};\n\nconst formatReferenceKinds = (referenceKinds: string[]): string => {\n const firstReferenceKind = referenceKinds.at(0);\n if (!firstReferenceKind) {\n return \"\";\n }\n\n if (referenceKinds.length === 1) {\n return firstReferenceKind;\n }\n\n const secondReferenceKind = referenceKinds.at(1);\n if (referenceKinds.length === 2) {\n return `${firstReferenceKind} and ${secondReferenceKind ?? \"\"}`;\n }\n\n const lastReferenceKind = referenceKinds.at(-1);\n if (!lastReferenceKind) {\n return \"\";\n }\n return `${referenceKinds.slice(0, -1).join(\", \")}, and ${lastReferenceKind}`;\n};\n\nconst assertWorkflowTemplateCanRepresentExistingRefs = (\n normalizedName: string,\n input: ScaffoldInput,\n existingWorkflow: WorkflowManifestEntry | undefined\n) => {\n const lossyPreservedRefs: string[] = [];\n if (\n input.skillRef === undefined &&\n (existingWorkflow?.skillRefs.length ?? 0) > 1\n ) {\n lossyPreservedRefs.push(\"skillRefs\");\n }\n if (\n input.agentRef === undefined &&\n (existingWorkflow?.agentRefs.length ?? 0) > 1\n ) {\n lossyPreservedRefs.push(\"agentRefs\");\n }\n if (\n input.workflowRef === undefined &&\n (existingWorkflow?.workflowRefs.length ?? 0) > 1\n ) {\n lossyPreservedRefs.push(\"workflowRefs\");\n }\n\n if (lossyPreservedRefs.length === 0) {\n return;\n }\n\n throw new ScaffoldError(\n \"invalid_manifest\",\n `Cannot scaffold workflow \"${normalizedName}\" because the existing manifest entry contains multiple ${formatReferenceKinds(lossyPreservedRefs)}. Pass explicit replacement refs before regenerating the workflow file.`\n );\n};\n\nconst buildWorkflowArtifactContent = (input: {\n description: string;\n existingWorkflow?: WorkflowManifestEntry;\n normalizedName: string;\n scaffoldInput: ScaffoldInput;\n title: string;\n}): string => {\n assertWorkflowTemplateCanRepresentExistingRefs(\n input.normalizedName,\n input.scaffoldInput,\n input.existingWorkflow\n );\n\n return buildWorkflowTemplate({\n title: input.title,\n description: input.description,\n skillRef:\n input.scaffoldInput.skillRef?.trim() ||\n input.existingWorkflow?.skillRefs[0],\n agentRef:\n input.scaffoldInput.agentRef?.trim() ||\n input.existingWorkflow?.agentRefs[0],\n workflowRef:\n input.scaffoldInput.workflowRef?.trim() ||\n input.existingWorkflow?.workflowRefs[0],\n });\n};\n\nconst buildArtifactContent = (\n input: ScaffoldInput,\n existingEntry?: ManifestEntry\n): string => {\n const normalizedName = slugify(input.name);\n const existingRule = existingEntry as RuleManifestEntry | undefined;\n const existingAgent = existingEntry as AgentManifestEntry | undefined;\n const existingWorkflow = existingEntry as WorkflowManifestEntry | undefined;\n const title =\n input.title?.trim() || existingRule?.title || toTitleCase(normalizedName);\n const description =\n input.description?.trim() ||\n `Replace this with a description for ${normalizedName}.`;\n\n switch (input.type) {\n case \"skill\":\n return buildSkillTemplate({\n name: normalizedName,\n title,\n description,\n });\n case \"rule\":\n return buildRuleTemplate({ title, description });\n case \"agent\":\n return buildAgentTemplate({\n name: normalizedName,\n description,\n linkedSkillNames:\n input.linkedSkillNames ?? existingAgent?.linkedSkillNames ?? [],\n });\n case \"hook\":\n return buildHookTemplate({\n description,\n title,\n });\n case \"workflow\":\n return buildWorkflowArtifactContent({\n description,\n existingWorkflow,\n normalizedName,\n scaffoldInput: input,\n title,\n });\n default:\n return assertNever(input.type);\n }\n};\n\nconst replaceManifestEntry = <T extends ManifestEntry>(\n entries: T[],\n nextEntry: T\n): T[] => {\n const existingIndex = entries.findIndex(\n (entry) => entry.name === nextEntry.name\n );\n if (existingIndex === -1) {\n return sortByName([...entries, nextEntry]);\n }\n\n const updated = [...entries];\n updated[existingIndex] = nextEntry;\n return sortByName(updated);\n};\n\nconst ensureWritableTarget = async (\n absoluteTargetPath: string,\n relativeTargetPath: string,\n force: boolean | undefined\n) => {\n if (!(await manifestExists(absoluteTargetPath))) {\n return;\n }\n\n if (!force) {\n throw new ScaffoldError(\n \"target_exists\",\n `Target file already exists: ${absoluteTargetPath}`\n );\n }\n\n try {\n await access(absoluteTargetPath, fsConstants.W_OK);\n } catch (error) {\n throw toIoError(relativeTargetPath, error);\n }\n};\n\nconst ensureWritableManifest = async (absoluteManifestPath: string) => {\n if (!(await manifestExists(absoluteManifestPath))) {\n return;\n }\n\n try {\n await access(absoluteManifestPath, fsConstants.W_OK);\n } catch (error) {\n throw toIoError(BRAID_PACK_FILENAME, error);\n }\n};\n\nconst writeTextFile = async (\n absolutePath: string,\n relativePath: string,\n content: string\n) => {\n try {\n await writeFile(absolutePath, content, \"utf-8\");\n } catch (error) {\n throw toIoError(relativePath, error);\n }\n};\n\nconst restoreManifest = async (\n absoluteManifestPath: string,\n previousContent: string | undefined\n) => {\n try {\n if (previousContent === undefined) {\n await rm(absoluteManifestPath, { force: true });\n return;\n }\n\n await writeFile(absoluteManifestPath, previousContent, \"utf-8\");\n } catch (error) {\n throw toIoError(BRAID_PACK_FILENAME, error);\n }\n};\n\nconst normalizeScaffoldInput = (input: ScaffoldInput): ScaffoldInput => ({\n ...input,\n name: slugify(input.name),\n title: input.title?.trim(),\n description: input.description?.trim(),\n linkedSkillNames:\n input.linkedSkillNames === undefined\n ? undefined\n : normalizeList(input.linkedSkillNames),\n skillRef: input.skillRef?.trim() || undefined,\n agentRef: input.agentRef?.trim() || undefined,\n workflowRef: input.workflowRef?.trim() || undefined,\n});\n\nconst prepareScaffoldOperation = async (\n normalizedInput: ScaffoldInput\n): Promise<PreparedScaffoldOperation> => {\n const context = await inspectScaffoldDirectory(normalizedInput.cwd);\n const { manifestPath, filePath } = resolveArtifactPaths(\n normalizedInput.type,\n normalizedInput.name\n );\n const absoluteManifestPath = join(normalizedInput.cwd, BRAID_PACK_FILENAME);\n const absoluteArtifactPath = join(normalizedInput.cwd, filePath);\n const manifestKey = MANIFEST_KEY_BY_TYPE[normalizedInput.type];\n const previousManifestContent =\n context.state === \"manifest-pack\"\n ? await readManifestFile(absoluteManifestPath)\n : undefined;\n const existingEntry = context.manifest[manifestKey].find(\n (entry) => entry.name === normalizedInput.name\n );\n const nextEntry = buildManifestEntry(\n normalizedInput,\n manifestPath,\n existingEntry\n );\n\n if (existingEntry && existingEntry.path !== manifestPath) {\n throw new ScaffoldError(\n \"duplicate_name\",\n `A ${normalizedInput.type} named \"${normalizedInput.name}\" already exists.`\n );\n }\n\n await ensureWritableTarget(\n absoluteArtifactPath,\n filePath,\n normalizedInput.force\n );\n await ensureWritableManifest(absoluteManifestPath);\n\n const nextManifest = {\n ...context.manifest,\n [manifestKey]: replaceManifestEntry(\n context.manifest[manifestKey] as ManifestEntry[],\n nextEntry\n ),\n } as BraidPackManifest;\n validateManifestEntryReferences(\n normalizedInput.type,\n nextEntry,\n nextManifest\n );\n\n return {\n absoluteArtifactPath,\n absoluteManifestPath,\n existingEntry,\n filePath,\n nextManifest,\n previousManifestContent,\n };\n};\n\nconst writeArtifactWithRollback = async ({\n absoluteArtifactPath,\n absoluteManifestPath,\n artifactContent,\n filePath,\n previousManifestContent,\n}: {\n absoluteArtifactPath: string;\n absoluteManifestPath: string;\n artifactContent: string;\n filePath: string;\n previousManifestContent: string | undefined;\n}) => {\n try {\n await mkdir(dirname(absoluteArtifactPath), { recursive: true });\n await writeTextFile(absoluteArtifactPath, filePath, artifactContent);\n } catch (error) {\n const artifactError =\n error instanceof ScaffoldError ? error : toIoError(filePath, error);\n\n try {\n await restoreManifest(absoluteManifestPath, previousManifestContent);\n } catch (rollbackError) {\n if (artifactError instanceof ScaffoldError) {\n throw new ScaffoldError(\n \"io_error\",\n `${artifactError.message}. Rollback failed: ${rollbackError instanceof Error ? rollbackError.message : \"Unknown rollback error\"}`\n );\n }\n throw rollbackError;\n }\n\n throw artifactError;\n }\n};\n\nexport class ScaffoldError extends Error {\n readonly code: ScaffoldErrorCode;\n\n constructor(code: ScaffoldErrorCode, message: string) {\n super(message);\n this.code = code;\n this.name = \"ScaffoldError\";\n }\n}\n\nexport const inspectScaffoldDirectory = async (\n cwd: string\n): Promise<ScaffoldContext> => {\n const manifestPath = join(cwd, BRAID_PACK_FILENAME);\n const hasManifest = await manifestExists(manifestPath);\n\n if (!hasManifest) {\n if (await manifestExists(join(cwd, \"SKILL.md\"))) {\n throw new ScaffoldError(\n \"invalid_repo_state\",\n \"Invalid repo state: root SKILL.md requires migration to braid-pack.json before scaffolding.\"\n );\n }\n if (await hasUnmanifestedPackContent(cwd)) {\n throw new ScaffoldError(\n \"invalid_repo_state\",\n \"Invalid repo state: existing Braid pack content requires braid-pack.json before scaffolding.\"\n );\n }\n\n return {\n state: \"plain-directory\",\n manifest: defaultManifest(),\n manifestPath,\n };\n }\n\n return {\n state: \"manifest-pack\",\n manifest: parseManifest(await readManifestFile(manifestPath)),\n manifestPath,\n };\n};\n\nexport const scaffoldArtifact = async (\n input: ScaffoldInput\n): Promise<ScaffoldResult> => {\n const normalizedInput = normalizeScaffoldInput(input);\n\n if (!normalizedInput.name) {\n throw new ScaffoldError(\"invalid_manifest\", \"Artifact name is required\");\n }\n\n const operation = await prepareScaffoldOperation(normalizedInput);\n const artifactContent = buildArtifactContent(\n normalizedInput,\n operation.existingEntry\n );\n await writeTextFile(\n operation.absoluteManifestPath,\n BRAID_PACK_FILENAME,\n stringifyManifest(operation.nextManifest)\n );\n await writeArtifactWithRollback({\n absoluteArtifactPath: operation.absoluteArtifactPath,\n absoluteManifestPath: operation.absoluteManifestPath,\n artifactContent,\n filePath: operation.filePath,\n previousManifestContent: operation.previousManifestContent,\n });\n\n return {\n createdFiles: [\n operation.absoluteManifestPath,\n operation.absoluteArtifactPath,\n ],\n updatedManifest: true,\n };\n};\n","import { rm } from \"node:fs/promises\";\nimport { join, resolve } from \"node:path\";\nimport {\n cancel,\n isCancel,\n log,\n multiselect,\n outro,\n spinner,\n} from \"@clack/prompts\";\nimport type { Exit } from \"effect\";\nimport { Cause, Data, Effect, Option, 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 {\n findDisabledBundleByOriginalPathAsync,\n getBundleStoreRoot,\n getDisabledStoreRoot,\n removePathAsync,\n} from \"../lib/bundle-store.ts\";\nimport {\n readMetadataAsync,\n removeFromMetadataAsync,\n updateMetadataAsync,\n} 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\ntype InstalledSource = Awaited<\n ReturnType<typeof readMetadataAsync>\n>[\"skills\"][number][\"source\"];\ntype UpdatableInstalledSource = Exclude<\n InstalledSource,\n { type: \"marketplace\" }\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 registerSourceForAgent = (\n source: UpdatableInstalledSource,\n serverUrl: string,\n installPath: string,\n agent: DetectedAgent,\n sourcesToUpdate: Map<string, SourceToUpdate>\n): void => {\n const key = `${source.type}:${source.name}`;\n let entry = sourcesToUpdate.get(key);\n\n if (!entry) {\n entry = {\n type: source.type,\n name: source.name,\n orgProjects: source.orgProjects,\n personalProjects: source.personalProjects,\n serverUrl,\n agents: [],\n };\n sourcesToUpdate.set(key, entry);\n }\n\n if (\n !entry.agents.some((registered) => registered.installPath === installPath)\n ) {\n entry.agents.push({\n agentId: agent.id,\n agentName: agent.name,\n installPath,\n });\n }\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 if (skill.source.type === \"marketplace\") {\n continue;\n }\n\n registerSourceForAgent(\n skill.source,\n skill.serverUrl,\n installPath,\n agent,\n sourcesToUpdate\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 areSameSourceProjects = (\n left: string[] | undefined,\n right: string[] | undefined\n): boolean => {\n if (left === undefined && right === undefined) {\n return true;\n }\n if (!(left && right) || left.length !== right.length) {\n return false;\n }\n\n return left.every((value, index) => value === right[index]);\n};\n\nconst isSameInstalledSource = (\n source: InstalledSource,\n target: Pick<\n SourceToUpdate,\n \"type\" | \"name\" | \"orgProjects\" | \"personalProjects\"\n >\n): boolean =>\n source.type === target.type &&\n source.name === target.name &&\n areSameSourceProjects(source.orgProjects, target.orgProjects) &&\n areSameSourceProjects(source.personalProjects, target.personalProjects);\n\nconst removeInstalledBundle = async (\n installPath: string,\n bundleName: string\n): Promise<void> => {\n const resolvedInstallPath = resolve(installPath);\n const resolvedBundlePath = resolve(join(installPath, bundleName));\n\n if (!resolvedBundlePath.startsWith(`${resolvedInstallPath}/`)) {\n throw new Error(`Unsafe bundle path for ${bundleName}`);\n }\n\n await rm(resolvedBundlePath, { recursive: true, force: true });\n const disabledRecord = await findDisabledBundleByOriginalPathAsync(\n resolvedBundlePath,\n {\n disabledRoot: getDisabledStoreRoot(),\n }\n );\n if (disabledRecord) {\n await removePathAsync(disabledRecord.disabledPath);\n }\n await removeFromMetadataAsync(installPath, bundleName);\n};\n\nconst pruneStaleSourceBundles = async (params: {\n installPath: string;\n source: Pick<\n SourceToUpdate,\n \"type\" | \"name\" | \"orgProjects\" | \"personalProjects\"\n >;\n serverUrl: string;\n currentBundleNames: string[];\n}): Promise<string[]> => {\n const currentNames = new Set(params.currentBundleNames);\n const metadata = await readMetadataAsync(params.installPath);\n const staleBundles = metadata.skills.filter(\n (skill) =>\n skill.serverUrl === params.serverUrl &&\n isSameInstalledSource(skill.source, params.source) &&\n !currentNames.has(skill.name)\n );\n\n for (const bundle of staleBundles) {\n await removeInstalledBundle(params.installPath, bundle.name);\n }\n\n return staleBundles.map((bundle) => bundle.name);\n};\n\nfunction countWrittenBundles(\n bundles: Awaited<ReturnType<typeof fetchSkillsAsync>>[\"skills\"],\n writtenNames: string[]\n): { skillCount: number; workflowCount: number } {\n let skillCount = 0;\n let workflowCount = 0;\n\n for (const name of writtenNames) {\n const bundle = bundles.find((skill) => skill.name === name);\n if ((bundle?.kind ?? \"skill\") === \"workflow\") {\n workflowCount += 1;\n } else {\n skillCount += 1;\n }\n }\n\n return { skillCount, workflowCount };\n}\n\nfunction formatBundleUpdateSummary(\n agentName: string,\n skillCount: number,\n workflowCount: number\n): string {\n const parts: string[] = [];\n\n if (skillCount > 0) {\n parts.push(`${skillCount} skills`);\n }\n if (workflowCount > 0) {\n parts.push(`${workflowCount} workflow${workflowCount === 1 ? \"\" : \"s\"}`);\n }\n\n return `${agentName}: ${parts.join(\", \")} updated`;\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 disabledRoot: getDisabledStoreRoot(),\n storeRoot: getBundleStoreRoot(),\n }\n );\n const { skillCount, workflowCount } = countWrittenBundles(\n response.skills,\n result.written\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 formatBundleUpdateSummary(agentName, skillCount, workflowCount)\n );\n }\n\n await pruneStaleSourceBundles({\n installPath,\n source: {\n type: response.source.type,\n name: response.source.name,\n orgProjects: response.source.orgProjects,\n personalProjects: response.source.personalProjects,\n },\n serverUrl,\n currentBundleNames: response.skills.map((skill) => skill.name),\n });\n\n await updateMetadataAsync(\n installPath,\n response.skills.map((s) => ({\n kind: s.kind ?? \"skill\",\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.catch((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: Exit.Exit<\n { totalUpdated: number; totalErrors: number },\n UpdateError | UserCancelledError\n >,\n updateSpinner: ReturnType<typeof spinner>\n): void => {\n if (result._tag !== \"Failure\") {\n return;\n }\n\n const error = pipe(result.cause, Cause.findErrorOption, Option.getOrNull);\n if (!error) {\n return;\n }\n\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 Effect.sync(() => {\n updateSpinner.stop(`Found ${sources.size} source(s) to update`);\n })\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 Effect.sync(() => {\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\n const result = await Effect.runPromiseExit(program);\n handleProgramExit(result, updateSpinner);\n}\n\nexport const __updateForTests = {\n pruneStaleSourceBundles,\n};\n"],"mappings":"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","names":["dirname","join","process","existsSync","readFileSync","mkdir","writeFile","homedir","dirname","join","process","Data","Effect","pipe","Data","Effect","pipe","hostname","path","process","process","rules","existing","path","readFile","writeFile","join","Data","Effect","pipe","platform","process","Effect","pipe","path","process","pipe","Effect","agents","Effect","path","process","process","existsSync","readFileSync","join","process","TRAILING_SLASHES","LOOPBACK_HOSTS","NEWLINE_REGEX","resolve","normalizeBaseUrl","hostname","stripQuotes","parseDotenv","TRAILING_SLASHES","scopeCommand","process","clearApiKeyAsync","process","parseCsv","writeJson","exitWithError","mkdir","readFile","writeFile","homedir","dirname","join","resolve","readFile","writeFile","join","Data","Effect","pipe","METADATA_FILENAME","pipe","Effect","Effect","Effect","mkdir","readFile","writeFile","dirname","resolve","sep","Data","Effect","pipe","rules","createHash","mkdir","rm","writeFile","dirname","join","resolve","sep","Data","Effect","pipe","Data","createDirectory","Effect","mkdir","writeTextFile","writeFile","assertWithinBase","resolve","sep","path","pipe","dirname","rm","createHash","join","skills","skills","Effect","skills","rules","log","spinner","log","spinner","process","lstat","readFile","relative","resolve","fileURLToPath","rm","basename","dirname","join","mkdir","readFile","rm","writeFile","dirname","join","Data","Effect","path","Data","Effect","pipe","TRAILING_SLASH_REGEX","resolveApiKey","agents","skills","rules","dirname","basename","join","disabledRecord","rm","access","constants","readdir","basename","dirname","join","resolve","join","access","constants","basename","readdir","METADATA_FILENAME","path","resolve","dirname","skills","agents","rules","TRAILING_SLASHES","SESSION_TOKEN_PREFIX","lstat","resolve","fileURLToPath","writeJson","relative","readFile","process","process","writeJson","exitWithError","fail","run","process","writeJson","fail","run","exitWithError","process","writeJson","parseCsv","exitWithError","fail","run","rm","join","resolve","process","join","process","resolve","rm","PUBLIC_SOURCE_REGEX","parsePublicSource","parsed","removeLockfileEntryAsync","process","parseCsv","writeJson","exitWithError","fail","run","process","access","mkdir","readdir","readFile","rm","writeFile","dirname","join","slugify","path","isObjectRecord","writeTextFile","exitCancelled","process","exitWithError","rm","join","resolve","cancel","isCancel","log","multiselect","outro","spinner","Data","Effect","pipe","Data","Effect","pipe","multiselect","isCancel","resolve","join","rm","countWrittenBundles","log","cancel","spinner","program","agents","outro","require"]}