@easytocloud/claude-personae 0.5.0 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.js CHANGED
@@ -39,35 +39,37 @@ var require_models = __commonJS({
39
39
  "../core/dist/models.js"(exports2) {
40
40
  "use strict";
41
41
  Object.defineProperty(exports2, "__esModule", { value: true });
42
- exports2.MANAGED_ENV_KEYS = exports2.AWS_REGIONS = exports2.ANTHROPIC_DEFAULTS = exports2.OPUS_MODELS = exports2.SONNET_MODELS = exports2.HAIKU_MODELS = void 0;
42
+ exports2.MANAGED_ENV_KEYS = exports2.PROVIDER_DATA_SHARE_PATTERNS = exports2.AWS_REGIONS = exports2.ANTHROPIC_DEFAULTS = exports2.OPUS_MODELS = exports2.SONNET_MODELS = exports2.HAIKU_MODELS = void 0;
43
43
  exports2.getRegionPrefixes = getRegionPrefixes;
44
44
  exports2.filterModelsByRegion = filterModelsByRegion;
45
+ exports2.requiresProviderDataShare = requiresProviderDataShare;
46
+ exports2.isMantleModelId = isMantleModelId;
45
47
  exports2.HAIKU_MODELS = [
48
+ { prefix: "global", id: "global.anthropic.claude-haiku-4-5-20251001-v1:0", label: "Claude Haiku 4.5 \u2014 Global" },
46
49
  { prefix: "us", id: "us.anthropic.claude-haiku-4-5-20251001-v1:0", label: "Claude Haiku 4.5 \u2014 US Cross-Region" },
47
50
  { prefix: "eu", id: "eu.anthropic.claude-haiku-4-5-20251001-v1:0", label: "Claude Haiku 4.5 \u2014 EU Cross-Region" },
48
- { prefix: "ap", id: "ap.anthropic.claude-haiku-4-5-20251001-v1:0", label: "Claude Haiku 4.5 \u2014 AP Cross-Region" },
49
- { prefix: "", id: "anthropic.claude-3-5-haiku-20241022-v1:0", label: "Claude Haiku 3.5 \u2014 Regional" },
50
- { prefix: "", id: "anthropic.claude-3-haiku-20240307-v1:0", label: "Claude Haiku 3 \u2014 Regional" }
51
+ { prefix: "jp", id: "jp.anthropic.claude-haiku-4-5-20251001-v1:0", label: "Claude Haiku 4.5 \u2014 Japan Cross-Region" },
52
+ { prefix: "au", id: "au.anthropic.claude-haiku-4-5-20251001-v1:0", label: "Claude Haiku 4.5 \u2014 Australia Cross-Region" },
53
+ { prefix: "mantle", id: "anthropic.claude-haiku-4-5", label: "Claude Haiku 4.5 \u2014 Mantle" }
51
54
  ];
52
55
  exports2.SONNET_MODELS = [
53
- { prefix: "global", id: "global.anthropic.claude-sonnet-4-6", label: "Claude Sonnet 4.6 \u2014 Global" },
54
- { prefix: "us", id: "us.anthropic.claude-sonnet-4-6", label: "Claude Sonnet 4.6 \u2014 US Cross-Region" },
55
- { prefix: "eu", id: "eu.anthropic.claude-sonnet-4-6", label: "Claude Sonnet 4.6 \u2014 EU Cross-Region" },
56
- { prefix: "us", id: "us.anthropic.claude-sonnet-4-5-20250929-v1:0", label: "Claude Sonnet 4.5 \u2014 US Cross-Region" },
57
- { prefix: "eu", id: "eu.anthropic.claude-sonnet-4-5-20250929-v1:0", label: "Claude Sonnet 4.5 \u2014 EU Cross-Region" },
58
- { prefix: "", id: "anthropic.claude-sonnet-4-20250514-v1:0", label: "Claude Sonnet 4 \u2014 Regional" },
59
- { prefix: "", id: "anthropic.claude-3-7-sonnet-20250219-v1:0", label: "Claude Sonnet 3.7 \u2014 Regional" }
56
+ { prefix: "global", id: "global.anthropic.claude-sonnet-5", label: "Claude Sonnet 5 \u2014 Global" },
57
+ { prefix: "us", id: "us.anthropic.claude-sonnet-5", label: "Claude Sonnet 5 \u2014 US Cross-Region" },
58
+ { prefix: "eu", id: "eu.anthropic.claude-sonnet-5", label: "Claude Sonnet 5 \u2014 EU Cross-Region" },
59
+ { prefix: "mantle", id: "anthropic.claude-sonnet-5", label: "Claude Sonnet 5 \u2014 Mantle" }
60
60
  ];
61
61
  exports2.OPUS_MODELS = [
62
- { prefix: "us", id: "us.anthropic.claude-opus-4-6-v1", label: "Claude Opus 4.6 \u2014 US Cross-Region" },
63
- { prefix: "eu", id: "eu.anthropic.claude-opus-4-6-v1", label: "Claude Opus 4.6 \u2014 EU Cross-Region" },
64
- { prefix: "", id: "anthropic.claude-opus-4-20250514-v1:0", label: "Claude Opus 4 \u2014 Regional" },
65
- { prefix: "", id: "anthropic.claude-opus-4-5-20251101-v1:0", label: "Claude Opus 4.5 \u2014 Regional" }
62
+ { prefix: "global", id: "global.anthropic.claude-opus-4-8", label: "Claude Opus 4.8 \u2014 Global" },
63
+ { prefix: "us", id: "us.anthropic.claude-opus-4-8", label: "Claude Opus 4.8 \u2014 US Cross-Region" },
64
+ { prefix: "eu", id: "eu.anthropic.claude-opus-4-8", label: "Claude Opus 4.8 \u2014 EU Cross-Region" },
65
+ { prefix: "jp", id: "jp.anthropic.claude-opus-4-8", label: "Claude Opus 4.8 \u2014 Japan Cross-Region" },
66
+ { prefix: "au", id: "au.anthropic.claude-opus-4-8", label: "Claude Opus 4.8 \u2014 Australia Cross-Region" },
67
+ { prefix: "mantle", id: "anthropic.claude-opus-4-8", label: "Claude Opus 4.8 \u2014 Mantle" }
66
68
  ];
67
69
  exports2.ANTHROPIC_DEFAULTS = {
68
- sonnet: "claude-sonnet-4-6-20250514",
70
+ sonnet: "claude-sonnet-5",
69
71
  haiku: "claude-haiku-4-5-20251001",
70
- opus: "claude-opus-4-6-20250514"
72
+ opus: "claude-opus-4-8"
71
73
  };
72
74
  exports2.AWS_REGIONS = [
73
75
  "us-east-1",
@@ -95,7 +97,7 @@ var require_models = __commonJS({
95
97
  return ["eu", "global", ""];
96
98
  }
97
99
  if (region.startsWith("ap-")) {
98
- return ["ap", "global", ""];
100
+ return ["apac", "jp", "au", "global", ""];
99
101
  }
100
102
  return ["global", ""];
101
103
  }
@@ -103,8 +105,26 @@ var require_models = __commonJS({
103
105
  const prefixes = getRegionPrefixes(region);
104
106
  return models.filter((m) => prefixes.includes(m.prefix));
105
107
  }
108
+ exports2.PROVIDER_DATA_SHARE_PATTERNS = ["fable", "mythos"];
109
+ function requiresProviderDataShare(modelId) {
110
+ const id = modelId.toLowerCase();
111
+ return exports2.PROVIDER_DATA_SHARE_PATTERNS.some((p) => id.includes(p));
112
+ }
113
+ function isMantleModelId(modelId) {
114
+ if (!/^anthropic\.claude-/i.test(modelId)) {
115
+ return false;
116
+ }
117
+ if (/-v\d+(:\d+)?$/i.test(modelId)) {
118
+ return false;
119
+ }
120
+ if (/-\d{8}/.test(modelId)) {
121
+ return false;
122
+ }
123
+ return true;
124
+ }
106
125
  exports2.MANAGED_ENV_KEYS = /* @__PURE__ */ new Set([
107
126
  "CLAUDE_CODE_USE_BEDROCK",
127
+ "CLAUDE_CODE_USE_MANTLE",
108
128
  "AWS_PROFILE",
109
129
  "AWS_REGION",
110
130
  "AWS_CONFIG_FILE",
@@ -951,6 +971,7 @@ var require_resolver = __commonJS({
951
971
  switch (provider.type) {
952
972
  case "bedrock": {
953
973
  env["CLAUDE_CODE_USE_BEDROCK"] = "1";
974
+ env["CLAUDE_CODE_USE_MANTLE"] = provider.useMantle ? "1" : "0";
954
975
  if (provider.awsProfile) {
955
976
  env["AWS_PROFILE"] = provider.awsProfile;
956
977
  }
@@ -1065,6 +1086,9 @@ var require_resolver = __commonJS({
1065
1086
  if (key === "CLAUDE_CODE_USE_BEDROCK" && value === "0") {
1066
1087
  return true;
1067
1088
  }
1089
+ if (key === "CLAUDE_CODE_USE_MANTLE" && value === "0") {
1090
+ return true;
1091
+ }
1068
1092
  if (key === "CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC" && value === "0") {
1069
1093
  return true;
1070
1094
  }
@@ -1395,7 +1419,7 @@ var require_package = __commonJS({
1395
1419
  "package.json"(exports2, module2) {
1396
1420
  module2.exports = {
1397
1421
  name: "@easytocloud/claude-personae",
1398
- version: "0.5.0",
1422
+ version: "0.8.0",
1399
1423
  description: "CLI to switch Claude Code provider presets (AWS Bedrock / Anthropic / proxy) \u2014 companion to the Claude Code Personae VS Code extension. Operates on the same ~/.claude profile store.",
1400
1424
  license: "MIT",
1401
1425
  repository: {
package/dist/cli.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../core/src/models.ts", "../../core/src/profiles.ts", "../../core/src/awsConfig.ts", "../../core/src/claudeSettings.ts", "../../core/src/claudeJson.ts", "../../core/src/mcpJson.ts", "../../core/src/knownProviders.ts", "../../core/src/resolver.ts", "../../core/src/transfer.ts", "../../core/src/index.ts", "../package.json", "../src/index.ts"],
4
- "sourcesContent": ["// ---------------------------------------------------------------------------\n// Known Bedrock inference profile IDs (as of Feb 2026)\n// Also used for Anthropic Direct API model selection.\n// ---------------------------------------------------------------------------\n\nexport interface ModelEntry {\n /** Region prefix: 'global' | 'us' | 'eu' | 'ap' | '' (regional \u2014 always shown) */\n prefix: string;\n /** Full model identifier */\n id: string;\n /** Human-friendly label */\n label: string;\n}\n\nexport const HAIKU_MODELS: ModelEntry[] = [\n { prefix: 'us', id: 'us.anthropic.claude-haiku-4-5-20251001-v1:0', label: 'Claude Haiku 4.5 \u2014 US Cross-Region' },\n { prefix: 'eu', id: 'eu.anthropic.claude-haiku-4-5-20251001-v1:0', label: 'Claude Haiku 4.5 \u2014 EU Cross-Region' },\n { prefix: 'ap', id: 'ap.anthropic.claude-haiku-4-5-20251001-v1:0', label: 'Claude Haiku 4.5 \u2014 AP Cross-Region' },\n { prefix: '', id: 'anthropic.claude-3-5-haiku-20241022-v1:0', label: 'Claude Haiku 3.5 \u2014 Regional' },\n { prefix: '', id: 'anthropic.claude-3-haiku-20240307-v1:0', label: 'Claude Haiku 3 \u2014 Regional' },\n];\n\nexport const SONNET_MODELS: ModelEntry[] = [\n { prefix: 'global', id: 'global.anthropic.claude-sonnet-4-6', label: 'Claude Sonnet 4.6 \u2014 Global' },\n { prefix: 'us', id: 'us.anthropic.claude-sonnet-4-6', label: 'Claude Sonnet 4.6 \u2014 US Cross-Region' },\n { prefix: 'eu', id: 'eu.anthropic.claude-sonnet-4-6', label: 'Claude Sonnet 4.6 \u2014 EU Cross-Region' },\n { prefix: 'us', id: 'us.anthropic.claude-sonnet-4-5-20250929-v1:0', label: 'Claude Sonnet 4.5 \u2014 US Cross-Region' },\n { prefix: 'eu', id: 'eu.anthropic.claude-sonnet-4-5-20250929-v1:0', label: 'Claude Sonnet 4.5 \u2014 EU Cross-Region' },\n { prefix: '', id: 'anthropic.claude-sonnet-4-20250514-v1:0', label: 'Claude Sonnet 4 \u2014 Regional' },\n { prefix: '', id: 'anthropic.claude-3-7-sonnet-20250219-v1:0', label: 'Claude Sonnet 3.7 \u2014 Regional' },\n];\n\nexport const OPUS_MODELS: ModelEntry[] = [\n { prefix: 'us', id: 'us.anthropic.claude-opus-4-6-v1', label: 'Claude Opus 4.6 \u2014 US Cross-Region' },\n { prefix: 'eu', id: 'eu.anthropic.claude-opus-4-6-v1', label: 'Claude Opus 4.6 \u2014 EU Cross-Region' },\n { prefix: '', id: 'anthropic.claude-opus-4-20250514-v1:0', label: 'Claude Opus 4 \u2014 Regional' },\n { prefix: '', id: 'anthropic.claude-opus-4-5-20251101-v1:0', label: 'Claude Opus 4.5 \u2014 Regional' },\n];\n\n/** Default model IDs for Anthropic Direct API (no region prefix needed) */\nexport const ANTHROPIC_DEFAULTS = {\n sonnet: 'claude-sonnet-4-6-20250514',\n haiku: 'claude-haiku-4-5-20251001',\n opus: 'claude-opus-4-6-20250514',\n};\n\nexport const AWS_REGIONS = [\n 'us-east-1', 'us-east-2', 'us-west-1', 'us-west-2',\n 'ca-central-1',\n 'eu-west-1', 'eu-west-2', 'eu-west-3', 'eu-central-1', 'eu-north-1',\n 'ap-northeast-1', 'ap-northeast-2', 'ap-southeast-1', 'ap-southeast-2',\n 'ap-south-1', 'sa-east-1',\n];\n\n/**\n * Returns the model-ID prefixes that should be visible for a given AWS region.\n * Regional models (prefix '') are always included.\n */\nexport function getRegionPrefixes(region: string): string[] {\n if (region.startsWith('us-')) { return ['us', 'global', '']; }\n if (region.startsWith('eu-')) { return ['eu', 'global', '']; }\n if (region.startsWith('ap-')) { return ['ap', 'global', '']; }\n return ['global', ''];\n}\n\n/** Filter a model list to only those matching the region prefixes. */\nexport function filterModelsByRegion(models: ModelEntry[], region: string): ModelEntry[] {\n const prefixes = getRegionPrefixes(region);\n return models.filter(m => prefixes.includes(m.prefix));\n}\n\n/** Environment variable keys managed by this extension. */\nexport const MANAGED_ENV_KEYS = new Set([\n 'CLAUDE_CODE_USE_BEDROCK',\n 'AWS_PROFILE',\n 'AWS_REGION',\n 'AWS_CONFIG_FILE',\n 'ANTHROPIC_DEFAULT_SONNET_MODEL',\n 'ANTHROPIC_DEFAULT_HAIKU_MODEL',\n 'ANTHROPIC_DEFAULT_OPUS_MODEL',\n 'ANTHROPIC_MODEL', // old name \u2014 cleared on save\n 'ANTHROPIC_SMALL_FAST_MODEL', // deprecated \u2014 cleared on save\n 'ANTHROPIC_SMALL_FAST_MODEL_AWS_REGION', // cleared on save\n 'DISABLE_PROMPT_CACHING',\n 'ANTHROPIC_BASE_URL',\n 'ANTHROPIC_API_KEY',\n 'ANTHROPIC_AUTH_TOKEN',\n 'CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC',\n 'DISABLE_AUTOUPDATER',\n]);\n", "import * as fs from 'fs';\nimport * as os from 'os';\nimport * as path from 'path';\nimport * as crypto from 'crypto';\nimport { ProfileStore, ProviderProfile, Preset } from './types';\nimport { ANTHROPIC_DEFAULTS } from './models';\n\n/** Well-known IDs for the built-in Default preset and provider. */\nexport const DEFAULT_PROVIDER_ID = '__default_anthropic__';\nexport const DEFAULT_PRESET_ID = '__default__';\n\n/** Returns the path to ~/.claude/coder-profiles.json */\nexport function getProfileStorePath(): string {\n return path.join(os.homedir(), '.claude', 'coder-profiles.json');\n}\n\n/** Generates a UUID v4 identifier. */\nexport function generateId(): string {\n return crypto.randomUUID();\n}\n\n/** The built-in Anthropic provider (always present). */\nfunction defaultProvider(existing?: ProviderProfile): ProviderProfile {\n return {\n id: DEFAULT_PROVIDER_ID,\n name: 'Anthropic',\n type: 'anthropic',\n // Preserve user's API key if they've set one\n anthropicApiKey: existing?.anthropicApiKey ?? undefined,\n primaryModel: ANTHROPIC_DEFAULTS.sonnet,\n smallFastModel: ANTHROPIC_DEFAULTS.haiku,\n opusModel: ANTHROPIC_DEFAULTS.opus,\n };\n}\n\n/** The built-in Default preset (always present). */\nfunction defaultPreset(): Preset {\n return {\n id: DEFAULT_PRESET_ID,\n name: 'Default',\n providerId: DEFAULT_PROVIDER_ID,\n mcpGroupIds: [],\n directoryGroupIds: [],\n };\n}\n\n/**\n * Ensures the store always contains the built-in Default provider and preset.\n * Preserves the user's API key on the default provider if already set.\n */\nexport function ensureDefaults(store: ProfileStore): ProfileStore {\n // Ensure default provider exists (preserve API key)\n const existingProvider = store.providers.find(p => p.id === DEFAULT_PROVIDER_ID);\n if (existingProvider) {\n // Reset immutable fields but keep API key\n existingProvider.name = 'Anthropic';\n existingProvider.type = 'anthropic';\n existingProvider.primaryModel = ANTHROPIC_DEFAULTS.sonnet;\n existingProvider.smallFastModel = ANTHROPIC_DEFAULTS.haiku;\n existingProvider.opusModel = ANTHROPIC_DEFAULTS.opus;\n } else {\n store.providers.unshift(defaultProvider());\n }\n\n // Ensure default preset exists\n const existingPreset = store.presets.find(p => p.id === DEFAULT_PRESET_ID);\n if (existingPreset) {\n existingPreset.name = 'Default';\n existingPreset.providerId = DEFAULT_PROVIDER_ID;\n } else {\n store.presets.unshift(defaultPreset());\n }\n\n return store;\n}\n\n/** Returns a default empty ProfileStore with built-in defaults. */\nexport function createEmptyStore(): ProfileStore {\n return ensureDefaults({\n version: 1,\n providers: [],\n mcpGroups: [],\n directoryGroups: [],\n presets: [],\n globalScope: { mode: 'preset', presetId: DEFAULT_PRESET_ID },\n workspaceScopes: {},\n });\n}\n\n/** Reads and parses ~/.claude/coder-profiles.json. Returns empty store if missing or unreadable. */\nexport function readProfileStore(): ProfileStore {\n const filePath = getProfileStorePath();\n\n if (!fs.existsSync(filePath)) {\n return createEmptyStore();\n }\n\n try {\n const raw = fs.readFileSync(filePath, 'utf8');\n const parsed = JSON.parse(raw) as unknown;\n if (typeof parsed === 'object' && parsed !== null && !Array.isArray(parsed)) {\n const store = parsed as ProfileStore;\n // Migrate v0.2.0 projectScopes \u2192 workspaceScopes\n const obj = parsed as Record<string, unknown>;\n if (obj['projectScopes'] && !store.workspaceScopes) {\n store.workspaceScopes = obj['projectScopes'] as Record<string, import('./types').ScopeAssignment>;\n delete obj['projectScopes'];\n }\n if (!store.workspaceScopes) {\n store.workspaceScopes = {};\n }\n if (store.version === 1) {\n return ensureDefaults(store);\n }\n }\n return createEmptyStore();\n } catch {\n return createEmptyStore();\n }\n}\n\n/** Find a preset by exact ID first, then by case-insensitive name. */\nexport function findPresetByNameOrId(store: ProfileStore, query: string): Preset | undefined {\n return (\n store.presets.find(p => p.id === query) ??\n store.presets.find(p => p.name.toLowerCase() === query.toLowerCase())\n );\n}\n\n/** Writes the profile store to ~/.claude/coder-profiles.json, creating the directory if needed. */\nexport function writeProfileStore(store: ProfileStore): void {\n const filePath = getProfileStorePath();\n const dir = path.dirname(filePath);\n\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n\n fs.writeFileSync(filePath, JSON.stringify(store, null, 2) + '\\n', 'utf8');\n}\n", "import * as fs from 'fs';\nimport * as os from 'os';\nimport * as path from 'path';\n\n/** Returns the path to the AWS config file, respecting $AWS_CONFIG_FILE. */\nexport function getAwsConfigPath(): string {\n return process.env.AWS_CONFIG_FILE ?? path.join(os.homedir(), '.aws', 'config');\n}\n\nexport interface AwsConfigInfo {\n /** Resolved (real) path of the config file. */\n configPath: string;\n /** True when the path matches ~/.aws/aws-envs/<name>/config */\n isAwsEnv: boolean;\n /** The env name when isAwsEnv is true, otherwise undefined. */\n envName?: string;\n /** All available env names when isAwsEnv is true. */\n envNames?: string[];\n}\n\n/**\n * Detects the AWS config file in use, resolving symlinks.\n * Returns null when config is plain/default (no $AWS_CONFIG_FILE and ~/.aws/config\n * is not a symlink) \u2014 nothing worth showing the user.\n * Otherwise returns info about the resolved path and whether aws-envs is in use.\n */\nexport function getAwsConfigInfo(): AwsConfigInfo | null {\n const rawPath = getAwsConfigPath();\n const defaultPath = path.join(os.homedir(), '.aws', 'config');\n const hasEnvOverride = !!process.env.AWS_CONFIG_FILE;\n\n // Check if the default config is a symlink\n let isSymlink = false;\n try {\n isSymlink = fs.lstatSync(defaultPath).isSymbolicLink();\n } catch { /* file may not exist */ }\n\n // Nothing interesting \u2014 hide the row entirely\n if (!hasEnvOverride && !isSymlink) { return null; }\n\n // Resolve symlink if present\n let configPath = rawPath;\n try {\n configPath = fs.realpathSync(rawPath);\n } catch {\n // File may not exist yet \u2014 use raw path\n configPath = rawPath;\n }\n\n // Normalize iCloud dotfiles path:\n // ~/Library/Mobile Documents/com~apple~CloudDocs/dotFiles/aws/dot-aws/...\n // is the iCloud-synced mirror of ~/.aws/... \u2014 treat it as such.\n const iCloudDotAws = path.join(\n os.homedir(),\n 'Library', 'Mobile Documents', 'com~apple~CloudDocs',\n 'dotFiles', 'aws', 'dot-aws'\n );\n if (configPath.startsWith(iCloudDotAws + '/') || configPath.startsWith(iCloudDotAws + path.sep)) {\n configPath = path.join(os.homedir(), '.aws', configPath.slice(iCloudDotAws.length + 1));\n }\n\n // Detect aws-envs pattern: ~/.aws/aws-envs/<name>/config\n const awsEnvsBase = path.join(os.homedir(), '.aws', 'aws-envs');\n const awsEnvsPattern = path.join(awsEnvsBase, path.sep);\n if (configPath.startsWith(awsEnvsPattern) || configPath.startsWith(awsEnvsBase + '/')) {\n const rel = path.relative(awsEnvsBase, configPath);\n const parts = rel.split(path.sep);\n if (parts.length === 2 && parts[1] === 'config') {\n const envName = parts[0];\n const envNames = listAwsEnvNames(awsEnvsBase);\n return { configPath, isAwsEnv: true, envName, envNames };\n }\n }\n\n return { configPath, isAwsEnv: false };\n}\n\n/** Lists available env names under ~/.aws/aws-envs/. */\nfunction listAwsEnvNames(awsEnvsBase: string): string[] {\n try {\n return fs.readdirSync(awsEnvsBase, { withFileTypes: true })\n .filter(d => d.isDirectory())\n .map(d => d.name)\n .sort();\n } catch {\n return [];\n }\n}\n\n/**\n * Reads AWS profile names from the config file at `configPath`.\n * Supports both [default] and [profile name] section headers.\n */\nexport function readAwsProfilesFrom(configPath: string): string[] {\n if (!fs.existsSync(configPath)) {\n return ['default'];\n }\n\n try {\n const content = fs.readFileSync(configPath, 'utf8');\n const profiles: string[] = [];\n\n for (const line of content.split('\\n')) {\n const trimmed = line.trim();\n // Matches [default] or [profile my-profile-name]\n const match = trimmed.match(/^\\[(?:profile\\s+)?(.+?)\\]$/);\n if (match) {\n const name = match[1].trim();\n if (name && !profiles.includes(name)) {\n profiles.push(name);\n }\n }\n }\n\n return profiles.length > 0 ? profiles : ['default'];\n } catch {\n return ['default'];\n }\n}\n\n/**\n * Reads AWS profile names from the currently active config file.\n */\nexport function readAwsProfiles(): string[] {\n return readAwsProfilesFrom(getAwsConfigPath());\n}\n", "import * as fs from 'fs';\nimport * as os from 'os';\nimport * as path from 'path';\nimport { ClaudeCodeSettings } from './types';\n\nconst SCHEMA_URL = 'https://json.schemastore.org/claude-code-settings.json';\n\n/** Returns the path to ~/.claude/settings.json */\nexport function getClaudeSettingsPath(): string {\n return path.join(os.homedir(), '.claude', 'settings.json');\n}\n\n/** Returns the path to {workspaceRoot}/.claude/settings.json */\nexport function getProjectSettingsPath(workspaceRoot: string): string {\n return path.join(workspaceRoot, '.claude', 'settings.json');\n}\n\n/** Reads and parses ~/.claude/settings.json. Returns {} if missing or unreadable. */\nexport function readClaudeSettings(): ClaudeCodeSettings {\n const filePath = getClaudeSettingsPath();\n\n if (!fs.existsSync(filePath)) {\n return {};\n }\n\n try {\n const raw = fs.readFileSync(filePath, 'utf8');\n const parsed = JSON.parse(raw) as unknown;\n if (typeof parsed === 'object' && parsed !== null && !Array.isArray(parsed)) {\n return parsed as ClaudeCodeSettings;\n }\n return {};\n } catch {\n return {};\n }\n}\n\n/** Writes settings to ~/.claude/settings.json, creating the directory if needed. */\nexport function writeClaudeSettings(settings: ClaudeCodeSettings): void {\n const filePath = getClaudeSettingsPath();\n const dir = path.dirname(filePath);\n\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n\n // Always include the JSON schema reference for IDE autocomplete\n const output: ClaudeCodeSettings = { $schema: SCHEMA_URL, ...settings };\n\n fs.writeFileSync(filePath, JSON.stringify(output, null, 2) + '\\n', 'utf8');\n}\n\n/** Reads and parses {workspaceRoot}/.claude/settings.json. Returns {} if missing. */\nexport function readProjectSettings(workspaceRoot: string): ClaudeCodeSettings {\n const filePath = getProjectSettingsPath(workspaceRoot);\n if (!fs.existsSync(filePath)) { return {}; }\n try {\n const raw = fs.readFileSync(filePath, 'utf8');\n const parsed = JSON.parse(raw) as unknown;\n if (typeof parsed === 'object' && parsed !== null && !Array.isArray(parsed)) {\n return parsed as ClaudeCodeSettings;\n }\n return {};\n } catch {\n return {};\n }\n}\n\n/** Writes settings to {workspaceRoot}/.claude/settings.json, creating the directory if needed. */\nexport function writeProjectSettings(workspaceRoot: string, settings: ClaudeCodeSettings): void {\n const filePath = getProjectSettingsPath(workspaceRoot);\n const dir = path.dirname(filePath);\n\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n\n const output: ClaudeCodeSettings = { $schema: SCHEMA_URL, ...settings };\n fs.writeFileSync(filePath, JSON.stringify(output, null, 2) + '\\n', 'utf8');\n}\n", "import * as fs from 'fs';\nimport * as os from 'os';\nimport * as path from 'path';\nimport { McpServerConfig } from './types';\n\n/** Per-project entry inside ~/.claude.json's projects block. */\ninterface ClaudeJsonProject {\n mcpServers?: Record<string, McpServerConfig>;\n [key: string]: unknown;\n}\n\n/** Opaque shape of ~/.claude.json \u2014 we only touch mcpServers keys (top-level and per-project). */\ninterface ClaudeJson {\n mcpServers?: Record<string, McpServerConfig>;\n projects?: Record<string, ClaudeJsonProject>;\n [key: string]: unknown;\n}\n\nexport function getClaudeJsonPath(): string {\n return path.join(os.homedir(), '.claude.json');\n}\n\nexport function readClaudeJson(): ClaudeJson {\n const filePath = getClaudeJsonPath();\n if (!fs.existsSync(filePath)) { return {}; }\n try {\n const raw = fs.readFileSync(filePath, 'utf8');\n const parsed = JSON.parse(raw) as unknown;\n if (typeof parsed === 'object' && parsed !== null && !Array.isArray(parsed)) {\n return parsed as ClaudeJson;\n }\n return {};\n } catch {\n return {};\n }\n}\n\n/** Reads MCP server entries from ~/.claude.json. Returns {} if missing or unreadable. */\nexport function readUserMcpServers(): Record<string, McpServerConfig> {\n return readClaudeJson().mcpServers ?? {};\n}\n\n/**\n * Ensures hasCompletedOnboarding is true in ~/.claude.json.\n * Prevents Claude Code from showing the first-run login wizard when the\n * user is relying on Bedrock or a proxy provider.\n */\nexport function ensureOnboardingComplete(): void {\n const filePath = getClaudeJsonPath();\n const existing = readClaudeJson();\n if (existing['hasCompletedOnboarding']) { return; } // already set \u2014 no write needed\n const updated = { ...existing, hasCompletedOnboarding: true };\n fs.writeFileSync(filePath, JSON.stringify(updated, null, 2) + '\\n', 'utf8');\n}\n\nfunction writeClaudeJson(updated: ClaudeJson): void {\n fs.writeFileSync(getClaudeJsonPath(), JSON.stringify(updated, null, 2) + '\\n', 'utf8');\n}\n\n/**\n * Ownership-aware merge: removes `previouslyOwned` names from the given\n * mcpServers map, then adds the preset's servers. Hand-added servers survive.\n * Returns the merged map (or undefined when the result is empty).\n */\nfunction mergeOwned(\n existing: Record<string, McpServerConfig> | undefined,\n servers: Record<string, McpServerConfig>,\n previouslyOwned: string[]\n): Record<string, McpServerConfig> | undefined {\n const merged: Record<string, McpServerConfig> = { ...(existing ?? {}) };\n for (const name of previouslyOwned) { delete merged[name]; }\n Object.assign(merged, servers);\n return Object.keys(merged).length > 0 ? merged : undefined;\n}\n\n/**\n * Merges the preset's MCP servers into the top-level mcpServers of\n * ~/.claude.json (global scope). Returns the names now owned by us.\n */\nexport function writeUserMcpServers(\n servers: Record<string, McpServerConfig>,\n previouslyOwned: string[] = []\n): string[] {\n const existing = readClaudeJson();\n const merged = mergeOwned(existing.mcpServers, servers, previouslyOwned);\n const updated: ClaudeJson = { ...existing };\n if (merged) { updated.mcpServers = merged; } else { delete updated.mcpServers; }\n writeClaudeJson(updated);\n return Object.keys(servers);\n}\n\n/**\n * Merges the preset's MCP servers into ~/.claude.json \u2192\n * projects[workspaceRoot].mcpServers (Claude Code's \"local\" scope for that\n * project). Returns the names now owned by us.\n */\nexport function writeProjectMcpServersToClaudeJson(\n workspaceRoot: string,\n servers: Record<string, McpServerConfig>,\n previouslyOwned: string[] = []\n): string[] {\n const existing = readClaudeJson();\n const projects = { ...(existing.projects ?? {}) };\n const entry: ClaudeJsonProject = { ...(projects[workspaceRoot] ?? {}) };\n const merged = mergeOwned(entry.mcpServers, servers, previouslyOwned);\n if (merged) { entry.mcpServers = merged; } else { delete entry.mcpServers; }\n\n // Don't create an otherwise-empty project entry for a no-server preset\n if (Object.keys(entry).length > 0 || projects[workspaceRoot]) {\n projects[workspaceRoot] = entry;\n }\n const updated: ClaudeJson = { ...existing };\n if (Object.keys(projects).length > 0) { updated.projects = projects; }\n writeClaudeJson(updated);\n return Object.keys(servers);\n}\n\n/**\n * Removes our owned MCP servers from projects[workspaceRoot] in ~/.claude.json\n * (used when a workspace goes back to inheriting the global scope).\n */\nexport function removeProjectMcpServersFromClaudeJson(\n workspaceRoot: string,\n ownedNames: string[]\n): void {\n if (ownedNames.length === 0) { return; }\n const existing = readClaudeJson();\n const entry = existing.projects?.[workspaceRoot];\n if (!entry?.mcpServers) { return; }\n const remaining = { ...entry.mcpServers };\n for (const name of ownedNames) { delete remaining[name]; }\n if (Object.keys(remaining).length > 0) {\n entry.mcpServers = remaining;\n } else {\n delete entry.mcpServers;\n }\n writeClaudeJson(existing);\n}\n", "import * as fs from 'fs';\nimport * as path from 'path';\nimport { McpServerConfig } from './types';\n\ninterface McpJson {\n mcpServers?: Record<string, McpServerConfig>;\n [key: string]: unknown;\n}\n\nexport function getMcpJsonPath(workspaceRoot: string): string {\n return path.join(workspaceRoot, '.mcp.json');\n}\n\nfunction readMcpJson(workspaceRoot: string): McpJson {\n const filePath = getMcpJsonPath(workspaceRoot);\n if (!fs.existsSync(filePath)) { return {}; }\n try {\n const raw = fs.readFileSync(filePath, 'utf8');\n const parsed = JSON.parse(raw) as unknown;\n if (typeof parsed === 'object' && parsed !== null && !Array.isArray(parsed)) {\n return parsed as McpJson;\n }\n return {};\n } catch {\n return {};\n }\n}\n\n/** Reads MCP server entries from {workspaceRoot}/.mcp.json. Returns {} if missing. */\nexport function readProjectMcpServers(workspaceRoot: string): Record<string, McpServerConfig> {\n return readMcpJson(workspaceRoot).mcpServers ?? {};\n}\n\n/**\n * Legacy cleanup: earlier versions wrote preset MCP servers into\n * {workspaceRoot}/.mcp.json; they now live in ~/.claude.json. Removes only\n * the named servers from the file's mcpServers key, drops the key when it\n * becomes empty, and deletes the file when nothing else remains. Servers the\n * user (or their team) added under other names are left untouched.\n */\nexport function cleanupLegacyMcpJson(workspaceRoot: string, serverNames: string[]): void {\n if (serverNames.length === 0) { return; }\n const filePath = getMcpJsonPath(workspaceRoot);\n if (!fs.existsSync(filePath)) { return; }\n\n const existing = readMcpJson(workspaceRoot);\n if (!existing.mcpServers) { return; }\n\n const remaining = { ...existing.mcpServers };\n let removed = false;\n for (const name of serverNames) {\n if (name in remaining) { delete remaining[name]; removed = true; }\n }\n if (!removed) { return; }\n\n const updated: McpJson = { ...existing };\n if (Object.keys(remaining).length > 0) {\n updated.mcpServers = remaining;\n } else {\n delete updated.mcpServers;\n }\n\n if (Object.keys(updated).length === 0) {\n fs.unlinkSync(filePath);\n } else {\n fs.writeFileSync(filePath, JSON.stringify(updated, null, 2) + '\\n', 'utf8');\n }\n}\n", "// Curated catalogue of well-known providers selectable from the \"3rd party\"\n// dropdown in the provider drawer. The catalogue is the single source of truth\n// for default URL, locked scheme/path, auth handling, and UI labelling \u2014 both\n// the webview and the resolver read from it so a hand-edited profile store\n// still resolves to the right env vars.\n\nexport type KnownProviderId =\n | 'bedrock'\n | 'openrouter'\n | 'ollama'\n | 'lmstudio'\n | 'omlx'\n | 'vllm'\n | 'litellm'\n | 'custom';\n\nexport interface KnownProvider {\n id: KnownProviderId;\n label: string;\n type: 'bedrock' | 'proxy';\n // Pre-filled into the URL field when the user picks this preset.\n defaultUrl?: string;\n // Locked parts of the URL \u2014 host and port stay editable; scheme + path\n // snap back on blur via normalizeKnownUrl().\n scheme?: 'http' | 'https';\n path?: string;\n // Auth mode written to settings.json. 'none' means no credential field is\n // shown in the UI; resolver writes a placeholder ANTHROPIC_AUTH_TOKEN so\n // Claude Code does not fall back to its OAuth flow.\n authMode?: 'apikey' | 'authtoken' | 'none';\n // UI label for the credential field. Deliberately user-facing terminology\n // (e.g. \"OpenRouter API key\") \u2014 never references AUTH_TOKEN or Bearer.\n credentialLabel?: string;\n // Whether the credential is mandatory for a working setup.\n credentialRequired?: boolean;\n}\n\nexport const KNOWN_PROVIDERS: KnownProvider[] = [\n {\n id: 'bedrock',\n label: 'Amazon Bedrock',\n type: 'bedrock',\n },\n {\n id: 'openrouter',\n label: 'OpenRouter',\n type: 'proxy',\n defaultUrl: 'https://openrouter.ai/api',\n scheme: 'https',\n path: '/api',\n authMode: 'authtoken',\n credentialLabel: 'OpenRouter API key',\n credentialRequired: true,\n },\n {\n id: 'ollama',\n label: 'Ollama',\n type: 'proxy',\n defaultUrl: 'http://localhost:11434',\n scheme: 'http',\n path: '',\n authMode: 'none',\n },\n {\n id: 'lmstudio',\n label: 'LM Studio',\n type: 'proxy',\n defaultUrl: 'http://localhost:1234',\n scheme: 'http',\n path: '',\n authMode: 'none',\n },\n {\n id: 'omlx',\n label: 'oMLX',\n type: 'proxy',\n defaultUrl: 'http://localhost:8000',\n scheme: 'http',\n path: '',\n authMode: 'authtoken',\n credentialLabel: 'oMLX API key (optional)',\n credentialRequired: false,\n },\n {\n id: 'vllm',\n label: 'vLLM',\n type: 'proxy',\n defaultUrl: 'http://localhost:8000',\n scheme: 'http',\n path: '',\n authMode: 'authtoken',\n credentialLabel: 'API key (optional)',\n credentialRequired: false,\n },\n {\n id: 'litellm',\n label: 'LiteLLM',\n type: 'proxy',\n defaultUrl: 'http://localhost:4000',\n scheme: 'http',\n path: '',\n authMode: 'authtoken',\n credentialLabel: 'API key (optional)',\n credentialRequired: false,\n },\n {\n id: 'custom',\n label: 'Other / Custom\u2026',\n type: 'proxy',\n },\n];\n\nexport function knownProvider(id: string | undefined): KnownProvider | undefined {\n if (!id) { return undefined; }\n return KNOWN_PROVIDERS.find(p => p.id === id);\n}\n\n/**\n * Coerce a user-typed URL to the known preset's scheme + path while keeping\n * the host and port the user entered. Lets users point Ollama/LM Studio at\n * another machine or non-default port without breaking the path contract.\n *\n * Examples:\n * openrouter, \"openrouter.ai/v1\" \u2192 \"https://openrouter.ai/api\"\n * ollama, \"192.168.1.50:11434\" \u2192 \"http://192.168.1.50:11434\"\n * lmstudio, \"http://mybox:1234\" \u2192 \"http://mybox:1234\"\n * custom, anything \u2192 returned unchanged\n */\nexport function normalizeKnownUrl(p: KnownProvider, raw: string): string {\n const trimmed = (raw || '').trim();\n if (!trimmed) { return p.defaultUrl ?? ''; }\n // Custom: don't touch the URL.\n if (p.id === 'custom' || !p.scheme) { return trimmed; }\n\n // Strip any scheme the user typed; we'll re-apply the locked one.\n const withoutScheme = trimmed.replace(/^[a-z][a-z0-9+.-]*:\\/\\//i, '');\n // Drop trailing slashes so we don't double-append the path.\n const noTrailingSlash = withoutScheme.replace(/\\/+$/, '');\n // Split host[:port] from any path the user appended; we discard the path.\n const slashIdx = noTrailingSlash.indexOf('/');\n const hostPort = slashIdx === -1 ? noTrailingSlash : noTrailingSlash.slice(0, slashIdx);\n if (!hostPort) { return p.defaultUrl ?? ''; }\n\n return `${p.scheme}://${hostPort}${p.path ?? ''}`;\n}\n", "import * as fs from 'fs';\nimport * as os from 'os';\nimport * as path from 'path';\nimport {\n ProfileStore,\n McpServerConfig,\n ClaudeCodeSettings,\n} from './types';\nimport { MANAGED_ENV_KEYS, AWS_REGIONS } from './models';\nimport {\n readClaudeSettings,\n writeClaudeSettings,\n readProjectSettings,\n writeProjectSettings,\n getProjectSettingsPath,\n} from './claudeSettings';\nimport {\n writeUserMcpServers,\n readUserMcpServers,\n writeProjectMcpServersToClaudeJson,\n removeProjectMcpServersFromClaudeJson,\n ensureOnboardingComplete,\n} from './claudeJson';\nimport { cleanupLegacyMcpJson } from './mcpJson';\nimport { writeProfileStore } from './profiles';\nimport { knownProvider, normalizeKnownUrl } from './knownProviders';\n\n// ---------------------------------------------------------------------------\n// Resolved configuration \u2014 the flat representation written to Claude Code files\n// ---------------------------------------------------------------------------\n\nexport interface ResolvedConfig {\n env: Record<string, string>;\n allowedDirectories: string[];\n awsAuthRefresh?: string;\n apiKeyHelper?: string;\n mcpServers: Record<string, McpServerConfig>;\n}\n\n// ---------------------------------------------------------------------------\n// Resolution: Preset \u2192 flat config\n// ---------------------------------------------------------------------------\n\n/** Resolve a preset ID into flat env vars, MCP servers, and directories. */\nexport function resolvePreset(\n store: ProfileStore,\n presetId: string\n): ResolvedConfig | null {\n const preset = store.presets.find(p => p.id === presetId);\n if (!preset) { return null; }\n\n const provider = store.providers.find(p => p.id === preset.providerId);\n const env: Record<string, string> = {};\n let awsAuthRefresh: string | undefined;\n let apiKeyHelper: string | undefined;\n\n if (provider) {\n // Reset cross-provider keys so a workspace preset using a different provider than the\n // global preset doesn't silently inherit parent values.\n // - CLAUDE_CODE_USE_BEDROCK=0 overrides a parent bedrock preset (set to 1 below if bedrock)\n // - ANTHROPIC_BASE_URL='' overrides a parent proxy URL (deleted below for global)\n // - AWS_PROFILE/AWS_REGION: NOT reset \u2014 they don't affect non-bedrock providers\n // - ANTHROPIC_API_KEY/AUTH_TOKEN: written only by the provider-specific block below\n env['CLAUDE_CODE_USE_BEDROCK'] = '0';\n env['ANTHROPIC_BASE_URL'] = '';\n\n // Provider-specific env vars\n switch (provider.type) {\n case 'bedrock': {\n env['CLAUDE_CODE_USE_BEDROCK'] = '1';\n if (provider.awsProfile) { env['AWS_PROFILE'] = provider.awsProfile; }\n if (provider.awsRegion) {\n if (!AWS_REGIONS.includes(provider.awsRegion)) {\n throw new Error(`Invalid AWS region \"${provider.awsRegion}\". Must be one of: ${AWS_REGIONS.join(', ')}`);\n }\n env['AWS_REGION'] = provider.awsRegion;\n }\n if (provider.awsAuthRefresh) { awsAuthRefresh = provider.awsAuthRefresh; }\n // Write AWS_CONFIG_FILE when the provider has a specific aws-env selected.\n // This is stored per-provider so switching envs for one provider does not\n // affect other providers.\n if (provider.awsEnv) {\n env['AWS_CONFIG_FILE'] = path.join(os.homedir(), '.aws', 'aws-envs', provider.awsEnv, 'config');\n }\n break;\n }\n case 'anthropic':\n if (provider.anthropicApiKey?.startsWith('op://')) {\n apiKeyHelper = `op read '${provider.anthropicApiKey}'`;\n } else if (provider.anthropicApiKey) {\n env['ANTHROPIC_API_KEY'] = provider.anthropicApiKey;\n }\n break;\n case 'proxy': {\n // Resolve which known-provider entry (if any) applies. Hand-edited\n // stores without proxyPreset default to 'custom' \u2014 same behaviour as\n // before the catalogue existed.\n const known = knownProvider(provider.proxyPreset ?? 'custom');\n const isKnown = known && known.id !== 'custom';\n\n let baseUrl = provider.proxyBaseUrl || '';\n if (isKnown && known) {\n // Catalogue is source of truth for known presets: re-impose scheme + path,\n // accept whatever host:port the user stored. Belt-and-suspenders against\n // hand-edited profile stores.\n baseUrl = normalizeKnownUrl(known, baseUrl);\n } else {\n // Custom path: strip trailing /v1 (users often paste the full endpoint URL)\n baseUrl = baseUrl.replace(/\\/v1\\/?$/, '').replace(/\\/+$/, '');\n // OpenRouter requires /api \u2014 defensive fallback for custom entries that\n // happen to point at openrouter.ai.\n if (/openrouter\\.ai/i.test(baseUrl) && !/\\/api\\b/i.test(baseUrl)) {\n baseUrl = baseUrl + '/api';\n }\n }\n if (baseUrl) { env['ANTHROPIC_BASE_URL'] = baseUrl; }\n\n // Resolve credential: new single-field model (proxyCredential + proxyAuthMode),\n // with fallback migration for stored data that uses the old separate fields.\n const cred = provider.proxyCredential\n ?? provider.proxyAuthToken // eslint-disable-line deprecation/deprecation\n ?? provider.proxyApiKey; // eslint-disable-line deprecation/deprecation\n // Mode source of truth: the catalogue for known presets, the user's\n // selection for 'custom', or migration fallback for legacy stores.\n let mode: 'apikey' | 'authtoken' | 'none';\n if (isKnown && known?.authMode) {\n mode = known.authMode;\n } else {\n mode = provider.proxyAuthMode\n ?? (provider.proxyAuthToken ? 'authtoken' : 'apikey'); // eslint-disable-line deprecation/deprecation\n }\n\n // Mutual exclusivity rule: ANTHROPIC_API_KEY and ANTHROPIC_AUTH_TOKEN must never\n // coexist in settings.json. Exactly one is written based on the resolved mode,\n // or a placeholder AUTH_TOKEN when the user supplied no credential.\n if (cred?.startsWith('op://')) {\n // 1Password ref \u2192 apiKeyHelper (no API_KEY/AUTH_TOKEN written)\n apiKeyHelper = `op read '${cred}'`;\n } else if (cred && mode === 'authtoken') {\n env['ANTHROPIC_AUTH_TOKEN'] = cred;\n } else if (cred && mode === 'apikey') {\n env['ANTHROPIC_API_KEY'] = cred;\n } else {\n // Placeholder fallback: a non-empty Authorization header keeps\n // Claude Code from falling back to its OAuth flow against local\n // servers that ignore the header anyway (Ollama, LM Studio).\n env['ANTHROPIC_AUTH_TOKEN'] = 'none';\n }\n break;\n }\n }\n\n // Model env vars \u2014 for Anthropic native, clear any overrides (empty string resets\n // workspace-level to unset); for other providers, set the configured model names.\n if (provider.type === 'anthropic') {\n env['ANTHROPIC_DEFAULT_SONNET_MODEL'] = '';\n env['ANTHROPIC_DEFAULT_HAIKU_MODEL'] = '';\n env['ANTHROPIC_DEFAULT_OPUS_MODEL'] = '';\n } else {\n env['ANTHROPIC_DEFAULT_SONNET_MODEL'] = provider.primaryModel || '';\n env['ANTHROPIC_DEFAULT_HAIKU_MODEL'] = provider.smallFastModel || '';\n env['ANTHROPIC_DEFAULT_OPUS_MODEL'] = provider.opusModel || '';\n }\n env['DISABLE_PROMPT_CACHING'] = provider.disablePromptCaching ? '1' : '';\n // Bedrock always disables nonessential traffic (AWS auth, never needs Anthropic login).\n // Known 3rd-party presets (OpenRouter, Ollama, LM Studio, oMLX, vLLM, LiteLLM) are\n // also force-on \u2014 none of them route to Anthropic, so telemetry/login traffic is\n // always wrong. Only the 'custom' proxy honours the user's Standalone-mode toggle,\n // since a custom proxy might legitimately forward to Anthropic.\n // DISABLE_AUTOUPDATER is intentionally NOT written here: auto-update is a CLI-lifecycle\n // decision that belongs to the user/machine, not a preset. Toggling presets across\n // workspaces shouldn't flip whether the CLI updates itself.\n const isKnownProxy = provider.type === 'proxy'\n && provider.proxyPreset !== undefined\n && provider.proxyPreset !== 'custom';\n const shouldDisableLoginPrompt =\n provider.type === 'bedrock' ||\n isKnownProxy ||\n (provider.type === 'proxy' && provider.disableLoginPrompt !== false);\n env['CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC'] = shouldDisableLoginPrompt ? '1' : '0';\n\n }\n\n // Merge MCP servers from all selected groups\n const mcpServers: Record<string, McpServerConfig> = {};\n for (const groupId of preset.mcpGroupIds) {\n const group = store.mcpGroups.find(g => g.id === groupId);\n if (group) {\n for (const server of group.servers) {\n const config: McpServerConfig = { type: server.type };\n if (server.url) { config.url = server.url; }\n if (server.command) { config.command = server.command; }\n if (server.args?.length) { config.args = server.args; }\n if (server.env && Object.keys(server.env).length) { config.env = server.env; }\n mcpServers[server.name] = config;\n }\n }\n }\n\n // Merge directories from all selected groups\n const allowedDirectories: string[] = [];\n for (const groupId of preset.directoryGroupIds) {\n const group = store.directoryGroups.find(g => g.id === groupId);\n if (group) {\n for (const dir of group.directories) {\n if (!allowedDirectories.includes(dir)) {\n allowedDirectories.push(dir);\n }\n }\n }\n }\n\n return { env, allowedDirectories, awsAuthRefresh, apiKeyHelper, mcpServers };\n}\n\n// ---------------------------------------------------------------------------\n// Apply resolved config to Claude Code's actual files\n// ---------------------------------------------------------------------------\n\n/**\n * Returns true when key=value carries no information and need not be written.\n * - Empty string is always a no-op at global level (no parent to override).\n * - CLAUDE_CODE_USE_BEDROCK=0 is the default; writing it at global level is noise.\n */\nfunction isNoOp(key: string, value: string): boolean {\n if (value === '') { return true; }\n if (key === 'CLAUDE_CODE_USE_BEDROCK' && value === '0') { return true; }\n if (key === 'CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC' && value === '0') { return true; }\n return false;\n}\n\n/** Strip no-op values before writing to global settings \u2014 global has no parent. */\nfunction filterForGlobal(env: Record<string, string>): Record<string, string> {\n return Object.fromEntries(Object.entries(env).filter(([k, v]) => !isNoOp(k, v)));\n}\n\n/**\n * At project level, a no-op value is worth writing only when the global env has\n * that key set to a meaningful value (i.e. we need to explicitly override it).\n * Otherwise it's noise.\n */\nfunction filterForProject(\n env: Record<string, string>,\n globalEnv: Record<string, string>\n): Record<string, string> {\n return Object.fromEntries(\n Object.entries(env).filter(([k, v]) => !isNoOp(k, v) || !isNoOp(k, globalEnv[k] ?? ''))\n );\n}\n\n// ---------------------------------------------------------------------------\n\n/**\n * Return a copy of `existing` with all MANAGED_ENV_KEYS removed,\n * so user-defined env vars are preserved when we overwrite managed ones.\n */\nfunction preserveUnmanagedEnv(existing: Record<string, string>): Record<string, string> {\n const preserved: Record<string, string> = {};\n for (const [key, value] of Object.entries(existing)) {\n if (!MANAGED_ENV_KEYS.has(key)) {\n preserved[key] = value;\n }\n }\n return preserved;\n}\n\n/**\n * Apply a resolved config to the global scope:\n * - env vars \u2192 ~/.claude/settings.json\n * - MCP servers \u2192 ~/.claude.json (top-level mcpServers, ownership-merged)\n *\n * `previouslyOwned` is the list of server names we wrote last time; exactly\n * those are removed before merging so hand-added servers survive. Pass\n * undefined on the first ownership-aware apply to treat every existing\n * top-level server as ours (pre-ownership versions replaced the key\n * wholesale, so historically it was all ccp-written).\n * Returns the server names now owned by us.\n */\nexport function applyGlobalConfig(\n resolved: ResolvedConfig,\n previouslyOwned?: string[]\n): string[] {\n const settings = readClaudeSettings();\n const preservedEnv = preserveUnmanagedEnv(settings.env ?? {});\n\n const newSettings: ClaudeCodeSettings = {\n ...settings,\n env: { ...preservedEnv, ...filterForGlobal(resolved.env) },\n };\n\n // Set or clear allowedDirectories\n if (resolved.allowedDirectories.length > 0) {\n newSettings.allowedDirectories = resolved.allowedDirectories;\n } else {\n delete newSettings.allowedDirectories;\n }\n\n // Set or clear awsAuthRefresh\n if (resolved.awsAuthRefresh) {\n newSettings.awsAuthRefresh = resolved.awsAuthRefresh;\n } else {\n delete newSettings.awsAuthRefresh;\n }\n\n // Set or clear apiKeyHelper (1Password / op-read support)\n if (resolved.apiKeyHelper) {\n newSettings.apiKeyHelper = resolved.apiKeyHelper;\n } else {\n delete newSettings.apiKeyHelper;\n }\n\n // Clear deprecated env var keys\n if (newSettings.env) {\n delete newSettings.env['ANTHROPIC_MODEL'];\n delete newSettings.env['ANTHROPIC_SMALL_FAST_MODEL'];\n delete newSettings.env['ANTHROPIC_SMALL_FAST_MODEL_AWS_REGION'];\n }\n\n writeClaudeSettings(newSettings);\n\n // No ownership record yet \u2192 migrate: treat all existing top-level servers\n // as ours, matching the old wholesale-replace behavior.\n const owned = previouslyOwned ?? Object.keys(readUserMcpServers());\n return writeUserMcpServers(resolved.mcpServers, owned);\n}\n\n/**\n * Remove managed env keys, allowedDirectories, and awsAuthRefresh from\n * {workspace}/.claude/settings.json so the project inherits from global.\n * Preserves any non-managed keys the user may have set. Also removes our\n * owned MCP servers from ~/.claude.json's projects block and from any\n * legacy .mcp.json we wrote in earlier versions.\n */\nexport function cleanProjectConfig(workspaceRoot: string, ownedMcpNames: string[] = []): void {\n removeProjectMcpServersFromClaudeJson(workspaceRoot, ownedMcpNames);\n cleanupLegacyMcpJson(workspaceRoot, ownedMcpNames);\n\n const settings = readProjectSettings(workspaceRoot);\n if (Object.keys(settings).length === 0) { return; } // nothing to clean\n\n // Remove managed env keys\n if (settings.env) {\n for (const key of MANAGED_ENV_KEYS) {\n delete settings.env[key];\n }\n if (Object.keys(settings.env).length === 0) {\n delete settings.env;\n }\n }\n\n // Remove fields we manage\n delete settings.allowedDirectories;\n delete settings.awsAuthRefresh;\n delete settings.apiKeyHelper;\n\n // Only write back if there's still content beyond $schema; otherwise leave file alone\n const remaining = Object.keys(settings).filter(k => k !== '$schema');\n if (remaining.length > 0) {\n writeProjectSettings(workspaceRoot, settings);\n } else {\n // File only has $schema (or nothing) \u2014 remove it to keep the project clean\n const filePath = getProjectSettingsPath(workspaceRoot);\n if (fs.existsSync(filePath)) {\n fs.unlinkSync(filePath);\n }\n }\n}\n\n/**\n * Apply a resolved config to the project scope:\n * - env vars + directories \u2192 {workspace}/.claude/settings.json\n * - MCP servers \u2192 ~/.claude.json projects[workspace].mcpServers\n * (ownership-merged; .mcp.json is no longer written \u2014 any servers we put\n * there in earlier versions are migrated out on this apply)\n *\n * Returns the MCP server names now owned by us for this workspace.\n */\nexport function applyProjectConfig(\n resolved: ResolvedConfig,\n workspaceRoot: string,\n previouslyOwned: string[] = []\n): string[] {\n // Write env vars and directories to project-level settings\n const globalEnv = readClaudeSettings().env ?? {};\n const settings = readProjectSettings(workspaceRoot);\n const preservedEnv = preserveUnmanagedEnv(settings.env ?? {});\n\n const newSettings: ClaudeCodeSettings = {\n ...settings,\n env: { ...preservedEnv, ...filterForProject(resolved.env, globalEnv) },\n };\n\n if (resolved.allowedDirectories.length > 0) {\n newSettings.allowedDirectories = resolved.allowedDirectories;\n } else {\n delete newSettings.allowedDirectories;\n }\n\n if (resolved.awsAuthRefresh) {\n newSettings.awsAuthRefresh = resolved.awsAuthRefresh;\n } else {\n delete newSettings.awsAuthRefresh;\n }\n\n if (resolved.apiKeyHelper) {\n newSettings.apiKeyHelper = resolved.apiKeyHelper;\n } else {\n delete newSettings.apiKeyHelper;\n }\n\n writeProjectSettings(workspaceRoot, newSettings);\n\n // MCP servers \u2192 ~/.claude.json projects block (Claude Code \"local\" scope)\n const owned = writeProjectMcpServersToClaudeJson(\n workspaceRoot,\n resolved.mcpServers,\n previouslyOwned\n );\n\n // Migrate: earlier versions wrote these servers into {workspace}/.mcp.json.\n // Remove them (previously owned + freshly applied names) so they don't\n // load twice; other servers in the file are left alone.\n cleanupLegacyMcpJson(workspaceRoot, [...new Set([...previouslyOwned, ...owned])]);\n\n // If the workspace is a VS Code extension, ensure .mcp.json and .claude/\n // are listed in .vscodeignore so they don't end up in published VSIXs.\n ensureVscodeignore(workspaceRoot);\n\n return owned;\n}\n\n/**\n * Resolve and apply the active scope assignments from the store.\n * Updates store.mcpOwnership (which server names we wrote where) and\n * persists the store when the ownership record changed.\n */\nexport function applyAllScopes(\n store: ProfileStore,\n workspaceRoot: string | undefined\n): void {\n // Onboarding flag: Claude Code shows the OAuth /login wizard when\n // ~/.claude.json is missing hasCompletedOnboarding or has it false.\n // Guarantee it's true here so every apply path is structurally safe \u2014\n // not dependent on every caller remembering to invoke it separately.\n ensureOnboardingComplete();\n\n const before = JSON.stringify(store.mcpOwnership ?? {});\n store.mcpOwnership ??= {};\n store.mcpOwnership.workspaces ??= {};\n\n // Global scope\n if (store.globalScope.mode === 'preset' && store.globalScope.presetId) {\n const resolved = resolvePreset(store, store.globalScope.presetId);\n if (resolved) {\n store.mcpOwnership.global = applyGlobalConfig(resolved, store.mcpOwnership.global);\n }\n }\n\n // Workspace scope\n if (workspaceRoot) {\n const wsScope = store.workspaceScopes[workspaceRoot];\n if (wsScope) {\n const owned = store.mcpOwnership.workspaces[workspaceRoot] ?? [];\n if (wsScope.mode === 'preset' && wsScope.presetId) {\n const resolved = resolvePreset(store, wsScope.presetId);\n if (resolved) {\n store.mcpOwnership.workspaces[workspaceRoot] =\n applyProjectConfig(resolved, workspaceRoot, owned);\n }\n }\n if (wsScope.mode === 'inherit') {\n cleanProjectConfig(workspaceRoot, owned);\n delete store.mcpOwnership.workspaces[workspaceRoot];\n }\n // 'manual' mode: user manages files themselves\n }\n }\n\n if (JSON.stringify(store.mcpOwnership) !== before) {\n writeProfileStore(store);\n }\n}\n\n// ---------------------------------------------------------------------------\n// .vscodeignore helper \u2014 prevent leaking generated config into published VSIXs\n// ---------------------------------------------------------------------------\n\nconst VSCODEIGNORE_ENTRIES = ['.mcp.json', '.claude/'];\n\nfunction ensureVscodeignore(workspaceRoot: string): void {\n const ignorePath = path.join(workspaceRoot, '.vscodeignore');\n if (!fs.existsSync(ignorePath)) { return; } // not a VS Code extension project\n try {\n let content = fs.readFileSync(ignorePath, 'utf8');\n const lines = content.split('\\n').map(l => l.trim());\n const missing = VSCODEIGNORE_ENTRIES.filter(e => !lines.includes(e));\n if (missing.length === 0) { return; }\n if (!content.endsWith('\\n')) { content += '\\n'; }\n content += missing.join('\\n') + '\\n';\n fs.writeFileSync(ignorePath, content, 'utf8');\n } catch { /* best effort \u2014 don't break save */ }\n}\n", "import { ProfileStore, ProviderProfile } from './types';\n\n// ---------------------------------------------------------------------------\n// Credential scrubbing \u2014 real keys must never leave the machine on export.\n// Shared by the VS Code export command and the CLI `export` command.\n// ---------------------------------------------------------------------------\n\nconst CREDENTIAL_PATTERNS = [\n /sk-ant-[a-zA-Z0-9_-]{20,}/g,\n /sk-or-[a-zA-Z0-9_-]{20,}/g,\n /sk-proj-[a-zA-Z0-9_-]{20,}/g,\n /sk-live-[a-zA-Z0-9_-]{20,}/g,\n /AKIA[A-Z0-9]{16}/g,\n /ghp_[a-zA-Z0-9]{36,}/g,\n /gho_[a-zA-Z0-9]{36,}/g,\n /github_pat_[a-zA-Z0-9_]{20,}/g,\n /xoxb-[a-zA-Z0-9-]+/g,\n /xoxp-[a-zA-Z0-9-]+/g,\n];\n\nexport const PLACEHOLDER = '<REPLACE_ME>';\n\nconst SAFE_VALUES = new Set<string | undefined>([\n '', 'foobar', 'placeholder', 'dummy', 'local', 'Optional',\n 'your-key-here', 'xxx', undefined,\n]);\n\n/** Scrub known credential patterns from a string value. */\nexport function scrubValue(value: string | undefined): string | undefined {\n if (!value || SAFE_VALUES.has(value)) { return value; }\n // op:// references are 1Password pointers, not secrets \u2014 keep them.\n if (value.startsWith('op://')) { return value; }\n let scrubbed = value;\n for (const pattern of CREDENTIAL_PATTERNS) {\n pattern.lastIndex = 0;\n scrubbed = scrubbed.replace(pattern, PLACEHOLDER);\n }\n // If it still looks like a real key (long alphanumeric string), replace it\n if (scrubbed === value && value.length >= 20 && /^[a-zA-Z0-9_-]+$/.test(value)) {\n return PLACEHOLDER;\n }\n return scrubbed;\n}\n\n/** Deep-scrub a provider profile of all credential-like fields. */\nfunction scrubProvider(provider: ProviderProfile): ProviderProfile {\n return {\n ...provider,\n anthropicApiKey: scrubValue(provider.anthropicApiKey),\n proxyCredential: scrubValue(provider.proxyCredential),\n proxyApiKey: scrubValue(provider.proxyApiKey),\n proxyAuthToken: scrubValue(provider.proxyAuthToken),\n awsAuthRefresh: provider.awsAuthRefresh, // command, not a secret\n };\n}\n\n/** Scrub all credentials from a profile store for safe export. */\nexport function scrubStore(store: ProfileStore): ProfileStore {\n const scrubbed: ProfileStore = {\n ...store,\n providers: store.providers.map(scrubProvider),\n };\n // Machine-local state: which MCP server names we wrote into this machine's\n // ~/.claude.json. Meaningless (and misleading) on another machine.\n delete scrubbed.mcpOwnership;\n return scrubbed;\n}\n\n/** Names of providers whose credentials are placeholders that need replacing. */\nexport function providersNeedingCredentials(store: ProfileStore): string[] {\n return store.providers\n .filter(p =>\n p.anthropicApiKey === PLACEHOLDER ||\n p.proxyCredential === PLACEHOLDER ||\n p.proxyApiKey === PLACEHOLDER ||\n p.proxyAuthToken === PLACEHOLDER\n )\n .map(p => p.name);\n}\n\n// ---------------------------------------------------------------------------\n// Import \u2014 parse + validate + merge. Shared by extension and CLI.\n// ---------------------------------------------------------------------------\n\n/** Parse and validate raw JSON into a ProfileStore. Throws on malformed input. */\nexport function parseIncomingStore(raw: string): ProfileStore {\n const incoming = JSON.parse(raw) as ProfileStore;\n if (!incoming.version || !incoming.providers || !incoming.presets) {\n throw new Error('Not a valid profile store');\n }\n return incoming;\n}\n\n/** Insert `incoming` or overwrite the entry with the same ID. */\nfunction upsertById<T extends { id: string }>(list: T[], incoming: T): 'added' | 'updated' {\n const idx = list.findIndex(e => e.id === incoming.id);\n if (idx >= 0) { list[idx] = incoming; return 'updated'; }\n list.push(incoming);\n return 'added';\n}\n\n/**\n * Keep the existing credential when the incoming one is a scrubbed\n * placeholder (or absent) \u2014 a merge must never destroy working credentials.\n * Real incoming values (including op:// references, which survive scrubbing)\n * do overwrite.\n */\nfunction preserveCredential(\n incoming: string | undefined,\n existing: string | undefined\n): string | undefined {\n if (incoming === PLACEHOLDER || incoming === undefined || incoming === '') {\n return existing ?? incoming;\n }\n return incoming;\n}\n\nexport interface MergeResult {\n added: number;\n updated: number;\n}\n\n/**\n * Merge an incoming store into a base store with upsert semantics: entries\n * whose UUID already exists locally are overwritten in place (same lineage \u2014\n * an update from the original source); unknown UUIDs are added as-is. IDs are\n * never regenerated, so re-importing the same export is idempotent and\n * cross-references stay intact. Existing entries absent from the import are\n * left alone (merge never deletes \u2014 use replace for that). Scope assignments\n * and mcpOwnership are machine-local and not merged. Mutates and returns\n * `base`; per-kind counts are written to `result` when provided.\n */\nexport function mergeIncomingStore(\n base: ProfileStore,\n incoming: ProfileStore,\n result?: MergeResult\n): ProfileStore {\n const tally: MergeResult = { added: 0, updated: 0 };\n const count = (outcome: 'added' | 'updated') => { tally[outcome]++; };\n\n for (const provider of incoming.providers) {\n const existing = base.providers.find(p => p.id === provider.id);\n count(upsertById(base.providers, {\n ...provider,\n anthropicApiKey: preserveCredential(provider.anthropicApiKey, existing?.anthropicApiKey),\n proxyCredential: preserveCredential(provider.proxyCredential, existing?.proxyCredential),\n proxyApiKey: preserveCredential(provider.proxyApiKey, existing?.proxyApiKey),\n proxyAuthToken: preserveCredential(provider.proxyAuthToken, existing?.proxyAuthToken),\n }));\n }\n\n for (const group of incoming.mcpGroups) {\n count(upsertById(base.mcpGroups, group));\n }\n\n for (const group of incoming.directoryGroups) {\n count(upsertById(base.directoryGroups, group));\n }\n\n for (const preset of incoming.presets) {\n count(upsertById(base.presets, preset));\n }\n\n if (result) { Object.assign(result, tally); }\n return base;\n}\n", "// Public API of the Claude Code Personae engine \u2014 shared by the VS Code\n// extension and the CLI. Both bundle this source via esbuild.\nexport * from './types';\nexport * from './models';\nexport * from './profiles';\nexport * from './awsConfig';\nexport * from './claudeSettings';\nexport * from './claudeJson';\nexport * from './mcpJson';\nexport * from './knownProviders';\nexport * from './resolver';\nexport * from './transfer';\n", "{\n \"name\": \"@easytocloud/claude-personae\",\n \"version\": \"0.5.0\",\n \"description\": \"CLI to switch Claude Code provider presets (AWS Bedrock / Anthropic / proxy) \u2014 companion to the Claude Code Personae VS Code extension. Operates on the same ~/.claude profile store.\",\n \"license\": \"MIT\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/easytocloud/bedrock-claude-code\",\n \"directory\": \"cli\"\n },\n \"homepage\": \"https://github.com/easytocloud/bedrock-claude-code#readme\",\n \"bugs\": {\n \"url\": \"https://github.com/easytocloud/bedrock-claude-code/issues\"\n },\n \"keywords\": [\n \"claude\",\n \"claude-code\",\n \"aws\",\n \"bedrock\",\n \"anthropic\",\n \"cli\",\n \"presets\",\n \"proxy\"\n ],\n \"bin\": {\n \"claude-personae\": \"dist/cli.js\",\n \"ccp\": \"dist/cli.js\"\n },\n \"files\": [\n \"dist\",\n \"README.md\"\n ],\n \"engines\": {\n \"node\": \">=18\"\n },\n \"scripts\": {\n \"build\": \"node esbuild.js\",\n \"watch\": \"node esbuild.js --watch\",\n \"prepublishOnly\": \"node esbuild.js\"\n },\n \"devDependencies\": {\n \"@easytocloud/claude-personae-core\": \"*\",\n \"@types/node\": \"^20.0.0\",\n \"esbuild\": \"^0.25.0\",\n \"typescript\": \"^5.6.0\"\n }\n}\n", "import * as fs from 'fs';\nimport * as path from 'path';\nimport { parseArgs } from 'util';\nimport {\n readProfileStore,\n writeProfileStore,\n ensureDefaults,\n applyAllScopes,\n resolvePreset,\n applyGlobalConfig,\n applyProjectConfig,\n cleanProjectConfig,\n ensureOnboardingComplete,\n findPresetByNameOrId,\n scrubStore,\n PLACEHOLDER,\n parseIncomingStore,\n mergeIncomingStore,\n providersNeedingCredentials,\n ProfileStore,\n ScopeAssignment,\n Preset,\n} from '@easytocloud/claude-personae-core';\n\n// eslint-disable-next-line @typescript-eslint/no-var-requires\nconst VERSION: string = require('../package.json').version;\n\nconst HELP = `claude-personae (ccp) \u2014 switch Claude Code provider presets from the shell\n\nOperates on the same profile store as the \"Claude Code Personae\" VS Code\nextension (~/.claude/coder-profiles.json). Use the extension to author\nproviders/presets; use this CLI to switch and apply them.\n\nUSAGE\n ccp <command> [options]\n\nCOMMANDS\n list [presets|providers|scopes] List configured items (default: all)\n current Show the active global + workspace preset\n switch <preset> [scope] Set the active preset and apply it\n apply Re-apply the global + current-workspace scopes\n sync Re-align all config with the profile store:\n global + EVERY known workspace assignment.\n MCP servers are written to ~/.claude.json;\n entries we once wrote to .mcp.json are\n migrated out (other servers left alone)\n export Print the store as JSON (credentials scrubbed)\n import <file|-> Import a store from a file or stdin\n\nSCOPE (for \\`switch\\`)\n --global, -g Set the global preset (use with care \u2014 affects all workspaces)\n --workspace, -w Set the preset for a workspace (uses CWD, default)\n --path <dir> Workspace directory to target (implies --workspace)\n --inherit Workspace inherits the global preset (clears overrides)\n --manual Workspace is managed manually (CLI leaves files alone)\n\nOPTIONS\n --json Machine-readable JSON output (list, current)\n --out, -o <file> Write export to a file instead of stdout\n --no-scrub Export without scrubbing credentials (dangerous)\n --mode <merge|replace> Import mode (default: merge). merge upserts by ID:\n same ID \u2192 entry is updated in place (credentials\n preserved when the import has placeholders), new ID\n \u2192 added; nothing is deleted. replace wipes the store\n and takes the import wholesale\n --dry-run Preview only \u2014 show what \\`sync\\` would change, write nothing\n --help, -h Show this help\n --version, -v Show version\n\nEXAMPLES\n ccp list presets\n ccp switch dev # set preset for the current workspace (default)\n ccp switch bedrock-prod --global # set global preset (affects all workspaces)\n ccp switch --inherit # current workspace inherits global again\n ccp apply # reprovision the current project's config\n ccp sync # re-apply every workspace after editing a preset\n ccp sync --dry-run # preview what sync would rewrite\n ccp export -o presets.json\n cat presets.json | ccp import - --mode replace\n`;\n\nfunction fail(msg: string): never {\n process.stderr.write(`error: ${msg}\\n`);\n process.exit(1);\n}\n\nfunction providerName(store: ProfileStore, providerId: string): string {\n return store.providers.find(p => p.id === providerId)?.name ?? '(unknown provider)';\n}\n\nfunction describeScope(store: ProfileStore, scope: ScopeAssignment | undefined): string {\n if (!scope) { return 'not set'; }\n if (scope.mode === 'manual') { return 'manual (CLI/GUI leave files alone)'; }\n if (scope.mode === 'inherit') { return 'inherit from global'; }\n const preset = scope.presetId ? store.presets.find(p => p.id === scope.presetId) : undefined;\n return preset ? `${preset.name} \u2192 ${providerName(store, preset.providerId)}` : '(preset missing)';\n}\n\nfunction resolvePresetArg(store: ProfileStore, query: string | undefined): Preset {\n if (!query) { fail('a preset name or id is required'); }\n const preset = findPresetByNameOrId(store, query);\n if (!preset) {\n const names = store.presets.map(p => p.name).join(', ');\n fail(`no preset matching \"${query}\". Available: ${names || '(none)'}`);\n }\n return preset;\n}\n\n// ---------------------------------------------------------------------------\n\ntype Values = ReturnType<typeof parse>['values'];\n\nfunction parse(argv: string[]) {\n return parseArgs({\n args: argv,\n allowPositionals: true,\n options: {\n json: { type: 'boolean', default: false },\n global: { type: 'boolean', short: 'g', default: false },\n workspace: { type: 'boolean', short: 'w', default: false },\n path: { type: 'string' },\n inherit: { type: 'boolean', default: false },\n manual: { type: 'boolean', default: false },\n mode: { type: 'string' },\n 'dry-run': { type: 'boolean', default: false },\n out: { type: 'string', short: 'o' },\n 'no-scrub': { type: 'boolean', default: false },\n help: { type: 'boolean', short: 'h', default: false },\n version: { type: 'boolean', short: 'v', default: false },\n },\n });\n}\n\nfunction workspaceDir(values: Values): string {\n return values.path ? path.resolve(String(values.path)) : process.cwd();\n}\n\n// ---------------------------------------------------------------------------\n// Commands\n// ---------------------------------------------------------------------------\n\nfunction cmdList(store: ProfileStore, what: string | undefined, values: Values): void {\n const which = what ?? 'all';\n if (values.json) {\n const out: Record<string, unknown> = {};\n if (which === 'all' || which === 'presets') { out.presets = store.presets; }\n if (which === 'all' || which === 'providers') { out.providers = store.providers.map(p => ({ id: p.id, name: p.name, type: p.type })); }\n if (which === 'all' || which === 'scopes') { out.globalScope = store.globalScope; out.workspaceScopes = store.workspaceScopes; }\n process.stdout.write(JSON.stringify(out, null, 2) + '\\n');\n return;\n }\n\n if (which === 'all' || which === 'providers') {\n process.stdout.write('Providers:\\n');\n for (const p of store.providers) {\n process.stdout.write(` ${p.name} [${p.type}]\\n`);\n }\n process.stdout.write('\\n');\n }\n if (which === 'all' || which === 'presets') {\n process.stdout.write('Presets:\\n');\n for (const p of store.presets) {\n const bits = [`provider ${providerName(store, p.providerId)}`];\n if (p.mcpGroupIds.length) { bits.push(`${p.mcpGroupIds.length} MCP group(s)`); }\n if (p.directoryGroupIds.length) { bits.push(`${p.directoryGroupIds.length} dir group(s)`); }\n process.stdout.write(` ${p.name} \u2014 ${bits.join(' \u00B7 ')}\\n`);\n }\n process.stdout.write('\\n');\n }\n if (which === 'all' || which === 'scopes') {\n process.stdout.write('Scopes:\\n');\n process.stdout.write(` global: ${describeScope(store, store.globalScope)}\\n`);\n for (const [ws, scope] of Object.entries(store.workspaceScopes)) {\n process.stdout.write(` ${ws}: ${describeScope(store, scope)}\\n`);\n }\n }\n}\n\nfunction cmdCurrent(store: ProfileStore, values: Values): void {\n const ws = workspaceDir(values);\n const wsScope = store.workspaceScopes[ws];\n if (values.json) {\n process.stdout.write(JSON.stringify({\n global: store.globalScope,\n workspace: { path: ws, scope: wsScope ?? null },\n }, null, 2) + '\\n');\n return;\n }\n process.stdout.write(`global: ${describeScope(store, store.globalScope)}\\n`);\n process.stdout.write(`workspace: ${describeScope(store, wsScope)} (${ws})\\n`);\n}\n\nfunction cmdSwitch(store: ProfileStore, presetArg: string | undefined, values: Values): void {\n const toGlobal = values.global && !values.workspace && values.path === undefined && !values.inherit && !values.manual;\n\n if (!toGlobal) {\n const ws = workspaceDir(values);\n let scope: ScopeAssignment;\n let summary: string;\n if (values.inherit) {\n scope = { mode: 'inherit' };\n summary = 'inherit from global';\n } else if (values.manual) {\n scope = { mode: 'manual' };\n summary = 'manual';\n } else {\n const preset = resolvePresetArg(store, presetArg);\n scope = { mode: 'preset', presetId: preset.id };\n summary = `${preset.name} \u2192 ${providerName(store, preset.providerId)}`;\n }\n store.workspaceScopes[ws] = scope;\n writeProfileStore(store);\n ensureOnboardingComplete();\n applyAllScopes(store, ws);\n process.stdout.write(`workspace (${ws}): ${summary}\\n`);\n return;\n }\n\n // Global (explicit --global only)\n const preset = resolvePresetArg(store, presetArg);\n store.globalScope = { mode: 'preset', presetId: preset.id };\n writeProfileStore(store);\n ensureOnboardingComplete();\n applyAllScopes(store, undefined);\n process.stdout.write(`global: ${preset.name} \u2192 ${providerName(store, preset.providerId)}\\n`);\n}\n\nfunction cmdApply(store: ProfileStore, values: Values): void {\n const ws = workspaceDir(values);\n ensureOnboardingComplete();\n applyAllScopes(store, ws);\n process.stdout.write(`applied \u2014 global: ${describeScope(store, store.globalScope)}\\n`);\n process.stdout.write(` workspace (${ws}): ${describeScope(store, store.workspaceScopes[ws])}\\n`);\n}\n\nfunction cmdSync(store: ProfileStore, values: Values): void {\n const dryRun = Boolean(values['dry-run']);\n\n if (!dryRun) {\n store.mcpOwnership ??= {};\n store.mcpOwnership.workspaces ??= {};\n }\n const ownership = store.mcpOwnership;\n\n // Global scope\n if (store.globalScope.mode === 'preset' && store.globalScope.presetId) {\n const resolved = resolvePreset(store, store.globalScope.presetId);\n if (!resolved) {\n process.stderr.write(`global: preset missing \u2014 skipped\\n`);\n } else {\n if (!dryRun) {\n ensureOnboardingComplete();\n ownership!.global = applyGlobalConfig(resolved, ownership!.global);\n }\n process.stdout.write(`${dryRun ? 'would apply' : 'applied'} global: ${describeScope(store, store.globalScope)}\\n`);\n }\n } else {\n process.stdout.write(`(skip) global: ${describeScope(store, store.globalScope)}\\n`);\n }\n\n const entries = Object.entries(store.workspaceScopes);\n if (entries.length === 0) {\n if (!dryRun) { writeProfileStore(store); }\n process.stdout.write('no workspace assignments to sync.\\n');\n return;\n }\n\n let applied = 0;\n let skipped = 0;\n let missing = 0;\n\n for (const [ws, scope] of entries) {\n const desc = describeScope(store, scope);\n\n if (!fs.existsSync(ws)) {\n process.stderr.write(`(missing) ${ws}: ${desc}\\n`);\n missing++;\n continue;\n }\n if (scope.mode === 'manual') {\n process.stdout.write(`(manual) ${ws}: left untouched\\n`);\n skipped++;\n continue;\n }\n if (scope.mode === 'inherit') {\n if (!dryRun) {\n cleanProjectConfig(ws, ownership!.workspaces![ws] ?? []);\n delete ownership!.workspaces![ws];\n }\n process.stdout.write(`${dryRun ? 'would clear' : 'cleared '} ${ws}: inherit from global\\n`);\n applied++;\n continue;\n }\n // preset\n const resolved = scope.presetId ? resolvePreset(store, scope.presetId) : null;\n if (!resolved) {\n process.stderr.write(`(skip) ${ws}: preset missing\\n`);\n skipped++;\n continue;\n }\n if (!dryRun) {\n ownership!.workspaces![ws] = applyProjectConfig(resolved, ws, ownership!.workspaces![ws] ?? []);\n }\n process.stdout.write(`${dryRun ? 'would apply' : 'applied '} ${ws}: ${desc}\\n`);\n applied++;\n }\n\n if (!dryRun) { writeProfileStore(store); }\n\n const verb = dryRun ? 'would sync' : 'synced';\n process.stdout.write(\n `\\n${verb} ${applied} workspace(s)` +\n (skipped ? `, ${skipped} skipped` : '') +\n (missing ? `, ${missing} with missing directory` : '') +\n '.\\n'\n );\n}\n\nfunction cmdExport(store: ProfileStore, values: Values): void {\n const out = values['no-scrub'] ? store : scrubStore(store);\n const content = JSON.stringify(out, null, 2) + '\\n';\n if (values.out) {\n fs.writeFileSync(String(values.out), content, 'utf8');\n process.stderr.write(`exported to ${values.out}\\n`);\n } else {\n process.stdout.write(content);\n }\n if (!values['no-scrub'] && content.includes(PLACEHOLDER)) {\n process.stderr.write(`note: credentials were replaced with ${PLACEHOLDER} \u2014 recipients must fill in their own.\\n`);\n }\n}\n\nfunction cmdImport(src: string | undefined, values: Values): void {\n if (!src) { fail('import requires a file path or \"-\" for stdin'); }\n let raw: string;\n try {\n raw = src === '-' ? fs.readFileSync(0, 'utf8') : fs.readFileSync(src, 'utf8');\n } catch (err) {\n fail(`cannot read ${src}: ${err instanceof Error ? err.message : String(err)}`);\n }\n\n let incoming: ProfileStore;\n try {\n incoming = parseIncomingStore(raw);\n } catch (err) {\n fail(`import failed: ${err instanceof Error ? err.message : String(err)}`);\n }\n\n const mode = String(values.mode ?? 'merge');\n if (mode !== 'merge' && mode !== 'replace') { fail(`--mode must be \"merge\" or \"replace\"`); }\n\n if (mode === 'replace') {\n const store = ensureDefaults(incoming);\n writeProfileStore(store);\n process.stdout.write('presets replaced from import.\\n');\n return;\n }\n\n const result = { added: 0, updated: 0 };\n const store = mergeIncomingStore(readProfileStore(), incoming, result);\n writeProfileStore(store);\n process.stdout.write(\n `merged: ${result.added} added, ${result.updated} updated ` +\n `(${incoming.presets.length} preset(s), ${incoming.providers.length} provider(s), ` +\n `${incoming.mcpGroups.length} MCP group(s), ${incoming.directoryGroups.length} directory group(s) in import).\\n`\n );\n const placeholders = providersNeedingCredentials(store);\n if (placeholders.length > 0) {\n process.stderr.write(`note: these providers have placeholder credentials to replace: ${placeholders.join(', ')}\\n`);\n }\n}\n\n// ---------------------------------------------------------------------------\n\nfunction main(): void {\n let parsed: ReturnType<typeof parse>;\n try {\n parsed = parse(process.argv.slice(2));\n } catch (err) {\n fail(err instanceof Error ? err.message : String(err));\n }\n const { values, positionals } = parsed;\n\n if (values.version) { process.stdout.write(`${VERSION}\\n`); return; }\n\n const command = positionals[0];\n if (!command || values.help) { process.stdout.write(HELP); return; }\n\n const store = readProfileStore();\n\n switch (command) {\n case 'list': cmdList(store, positionals[1], values); break;\n case 'current': cmdCurrent(store, values); break;\n case 'switch': cmdSwitch(store, positionals[1], values); break;\n case 'apply': cmdApply(store, values); break;\n case 'sync': cmdSync(store, values); break;\n case 'export': cmdExport(store, values); break;\n case 'import': cmdImport(positionals[1], values); break;\n case 'help': process.stdout.write(HELP); break;\n default: fail(`unknown command \"${command}\". Run \\`ccp --help\\`.`);\n }\n}\n\nmain();\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["// ---------------------------------------------------------------------------\n// Known Bedrock inference profile IDs (as of Feb 2026)\n// Also used for Anthropic Direct API model selection.\n// ---------------------------------------------------------------------------\n\nexport interface ModelEntry {\n /** Geo prefix: 'global' | 'us' | 'eu' | 'apac' | 'jp' | 'au' | 'mantle' | '' (regional \u2014 always shown) */\n prefix: string;\n /** Full model identifier */\n id: string;\n /** Human-friendly label */\n label: string;\n}\n\nexport const HAIKU_MODELS: ModelEntry[] = [\n { prefix: 'global', id: 'global.anthropic.claude-haiku-4-5-20251001-v1:0', label: 'Claude Haiku 4.5 \u2014 Global' },\n { prefix: 'us', id: 'us.anthropic.claude-haiku-4-5-20251001-v1:0', label: 'Claude Haiku 4.5 \u2014 US Cross-Region' },\n { prefix: 'eu', id: 'eu.anthropic.claude-haiku-4-5-20251001-v1:0', label: 'Claude Haiku 4.5 \u2014 EU Cross-Region' },\n { prefix: 'jp', id: 'jp.anthropic.claude-haiku-4-5-20251001-v1:0', label: 'Claude Haiku 4.5 \u2014 Japan Cross-Region' },\n { prefix: 'au', id: 'au.anthropic.claude-haiku-4-5-20251001-v1:0', label: 'Claude Haiku 4.5 \u2014 Australia Cross-Region' },\n { prefix: 'mantle', id: 'anthropic.claude-haiku-4-5', label: 'Claude Haiku 4.5 \u2014 Mantle' },\n];\n\nexport const SONNET_MODELS: ModelEntry[] = [\n { prefix: 'global', id: 'global.anthropic.claude-sonnet-5', label: 'Claude Sonnet 5 \u2014 Global' },\n { prefix: 'us', id: 'us.anthropic.claude-sonnet-5', label: 'Claude Sonnet 5 \u2014 US Cross-Region' },\n { prefix: 'eu', id: 'eu.anthropic.claude-sonnet-5', label: 'Claude Sonnet 5 \u2014 EU Cross-Region' },\n { prefix: 'mantle', id: 'anthropic.claude-sonnet-5', label: 'Claude Sonnet 5 \u2014 Mantle' },\n];\n\nexport const OPUS_MODELS: ModelEntry[] = [\n { prefix: 'global', id: 'global.anthropic.claude-opus-4-8', label: 'Claude Opus 4.8 \u2014 Global' },\n { prefix: 'us', id: 'us.anthropic.claude-opus-4-8', label: 'Claude Opus 4.8 \u2014 US Cross-Region' },\n { prefix: 'eu', id: 'eu.anthropic.claude-opus-4-8', label: 'Claude Opus 4.8 \u2014 EU Cross-Region' },\n { prefix: 'jp', id: 'jp.anthropic.claude-opus-4-8', label: 'Claude Opus 4.8 \u2014 Japan Cross-Region' },\n { prefix: 'au', id: 'au.anthropic.claude-opus-4-8', label: 'Claude Opus 4.8 \u2014 Australia Cross-Region' },\n { prefix: 'mantle', id: 'anthropic.claude-opus-4-8', label: 'Claude Opus 4.8 \u2014 Mantle' },\n];\n\n/** Default model IDs for Anthropic Direct API (no region prefix needed) */\nexport const ANTHROPIC_DEFAULTS = {\n sonnet: 'claude-sonnet-5',\n haiku: 'claude-haiku-4-5-20251001',\n opus: 'claude-opus-4-8',\n};\n\nexport const AWS_REGIONS = [\n 'us-east-1', 'us-east-2', 'us-west-1', 'us-west-2',\n 'ca-central-1',\n 'eu-west-1', 'eu-west-2', 'eu-west-3', 'eu-central-1', 'eu-north-1',\n 'ap-northeast-1', 'ap-northeast-2', 'ap-southeast-1', 'ap-southeast-2',\n 'ap-south-1', 'sa-east-1',\n];\n\n/**\n * Returns the model-ID prefixes that should be visible for a given AWS region.\n * Regional models (prefix '') are always included.\n */\nexport function getRegionPrefixes(region: string): string[] {\n if (region.startsWith('us-')) { return ['us', 'global', '']; }\n if (region.startsWith('eu-')) { return ['eu', 'global', '']; }\n if (region.startsWith('ap-')) { return ['apac', 'jp', 'au', 'global', '']; }\n return ['global', ''];\n}\n\n/** Filter a model list to only those matching the region prefixes. */\nexport function filterModelsByRegion(models: ModelEntry[], region: string): ModelEntry[] {\n const prefixes = getRegionPrefixes(region);\n return models.filter(m => prefixes.includes(m.prefix));\n}\n\n/**\n * Model families whose Bedrock terms require sharing inference data with the\n * model provider (data-retention allowed_modes == [\"provider_data_share\"]):\n * prompts and completions leave the AWS boundary and are retained by the\n * provider (currently up to 30 days, for trust & safety). All other Bedrock\n * models keep data inside AWS.\n *\n * Curated list because allowed_modes is only queryable via the bedrock-mantle\n * API (Bedrock API key), not the SigV4 CLI used for model fetching.\n */\nexport const PROVIDER_DATA_SHARE_PATTERNS = ['fable', 'mythos'];\n\nexport function requiresProviderDataShare(modelId: string): boolean {\n const id = modelId.toLowerCase();\n return PROVIDER_DATA_SHARE_PATTERNS.some(p => id.includes(p));\n}\n\n/**\n * Mantle is a separate Bedrock endpoint (native Anthropic API shape) that\n * uses bare model IDs like `anthropic.claude-sonnet-5` or\n * `anthropic.claude-haiku-4-5` \u2014 `anthropic.` prefix, no geo prefix\n * (us./eu./global./...), and critically no Bedrock foundation-model version\n * suffix (`-v1:0`, `-v2:0`, ...) or embedded date (`-20250929`). Foundation\n * models returned by `list-foundation-models` for the same families DO carry\n * that suffix/date (e.g. `anthropic.claude-haiku-4-5-20251001-v1:0`), so\n * checking for the absence of both is what actually distinguishes a\n * Mantle-format ID from a same-family Invoke API one.\n */\nexport function isMantleModelId(modelId: string): boolean {\n if (!/^anthropic\\.claude-/i.test(modelId)) { return false; }\n if (/-v\\d+(:\\d+)?$/i.test(modelId)) { return false; } // Bedrock version suffix\n if (/-\\d{8}/.test(modelId)) { return false; } // embedded date\n return true;\n}\n\n/** Environment variable keys managed by this extension. */\nexport const MANAGED_ENV_KEYS = new Set([\n 'CLAUDE_CODE_USE_BEDROCK',\n 'CLAUDE_CODE_USE_MANTLE',\n 'AWS_PROFILE',\n 'AWS_REGION',\n 'AWS_CONFIG_FILE',\n 'ANTHROPIC_DEFAULT_SONNET_MODEL',\n 'ANTHROPIC_DEFAULT_HAIKU_MODEL',\n 'ANTHROPIC_DEFAULT_OPUS_MODEL',\n 'ANTHROPIC_MODEL', // old name \u2014 cleared on save\n 'ANTHROPIC_SMALL_FAST_MODEL', // deprecated \u2014 cleared on save\n 'ANTHROPIC_SMALL_FAST_MODEL_AWS_REGION', // cleared on save\n 'DISABLE_PROMPT_CACHING',\n 'ANTHROPIC_BASE_URL',\n 'ANTHROPIC_API_KEY',\n 'ANTHROPIC_AUTH_TOKEN',\n 'CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC',\n 'DISABLE_AUTOUPDATER',\n]);\n", "import * as fs from 'fs';\nimport * as os from 'os';\nimport * as path from 'path';\nimport * as crypto from 'crypto';\nimport { ProfileStore, ProviderProfile, Preset } from './types';\nimport { ANTHROPIC_DEFAULTS } from './models';\n\n/** Well-known IDs for the built-in Default preset and provider. */\nexport const DEFAULT_PROVIDER_ID = '__default_anthropic__';\nexport const DEFAULT_PRESET_ID = '__default__';\n\n/** Returns the path to ~/.claude/coder-profiles.json */\nexport function getProfileStorePath(): string {\n return path.join(os.homedir(), '.claude', 'coder-profiles.json');\n}\n\n/** Generates a UUID v4 identifier. */\nexport function generateId(): string {\n return crypto.randomUUID();\n}\n\n/** The built-in Anthropic provider (always present). */\nfunction defaultProvider(existing?: ProviderProfile): ProviderProfile {\n return {\n id: DEFAULT_PROVIDER_ID,\n name: 'Anthropic',\n type: 'anthropic',\n // Preserve user's API key if they've set one\n anthropicApiKey: existing?.anthropicApiKey ?? undefined,\n primaryModel: ANTHROPIC_DEFAULTS.sonnet,\n smallFastModel: ANTHROPIC_DEFAULTS.haiku,\n opusModel: ANTHROPIC_DEFAULTS.opus,\n };\n}\n\n/** The built-in Default preset (always present). */\nfunction defaultPreset(): Preset {\n return {\n id: DEFAULT_PRESET_ID,\n name: 'Default',\n providerId: DEFAULT_PROVIDER_ID,\n mcpGroupIds: [],\n directoryGroupIds: [],\n };\n}\n\n/**\n * Ensures the store always contains the built-in Default provider and preset.\n * Preserves the user's API key on the default provider if already set.\n */\nexport function ensureDefaults(store: ProfileStore): ProfileStore {\n // Ensure default provider exists (preserve API key)\n const existingProvider = store.providers.find(p => p.id === DEFAULT_PROVIDER_ID);\n if (existingProvider) {\n // Reset immutable fields but keep API key\n existingProvider.name = 'Anthropic';\n existingProvider.type = 'anthropic';\n existingProvider.primaryModel = ANTHROPIC_DEFAULTS.sonnet;\n existingProvider.smallFastModel = ANTHROPIC_DEFAULTS.haiku;\n existingProvider.opusModel = ANTHROPIC_DEFAULTS.opus;\n } else {\n store.providers.unshift(defaultProvider());\n }\n\n // Ensure default preset exists\n const existingPreset = store.presets.find(p => p.id === DEFAULT_PRESET_ID);\n if (existingPreset) {\n existingPreset.name = 'Default';\n existingPreset.providerId = DEFAULT_PROVIDER_ID;\n } else {\n store.presets.unshift(defaultPreset());\n }\n\n return store;\n}\n\n/** Returns a default empty ProfileStore with built-in defaults. */\nexport function createEmptyStore(): ProfileStore {\n return ensureDefaults({\n version: 1,\n providers: [],\n mcpGroups: [],\n directoryGroups: [],\n presets: [],\n globalScope: { mode: 'preset', presetId: DEFAULT_PRESET_ID },\n workspaceScopes: {},\n });\n}\n\n/** Reads and parses ~/.claude/coder-profiles.json. Returns empty store if missing or unreadable. */\nexport function readProfileStore(): ProfileStore {\n const filePath = getProfileStorePath();\n\n if (!fs.existsSync(filePath)) {\n return createEmptyStore();\n }\n\n try {\n const raw = fs.readFileSync(filePath, 'utf8');\n const parsed = JSON.parse(raw) as unknown;\n if (typeof parsed === 'object' && parsed !== null && !Array.isArray(parsed)) {\n const store = parsed as ProfileStore;\n // Migrate v0.2.0 projectScopes \u2192 workspaceScopes\n const obj = parsed as Record<string, unknown>;\n if (obj['projectScopes'] && !store.workspaceScopes) {\n store.workspaceScopes = obj['projectScopes'] as Record<string, import('./types').ScopeAssignment>;\n delete obj['projectScopes'];\n }\n if (!store.workspaceScopes) {\n store.workspaceScopes = {};\n }\n if (store.version === 1) {\n return ensureDefaults(store);\n }\n }\n return createEmptyStore();\n } catch {\n return createEmptyStore();\n }\n}\n\n/** Find a preset by exact ID first, then by case-insensitive name. */\nexport function findPresetByNameOrId(store: ProfileStore, query: string): Preset | undefined {\n return (\n store.presets.find(p => p.id === query) ??\n store.presets.find(p => p.name.toLowerCase() === query.toLowerCase())\n );\n}\n\n/** Writes the profile store to ~/.claude/coder-profiles.json, creating the directory if needed. */\nexport function writeProfileStore(store: ProfileStore): void {\n const filePath = getProfileStorePath();\n const dir = path.dirname(filePath);\n\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n\n fs.writeFileSync(filePath, JSON.stringify(store, null, 2) + '\\n', 'utf8');\n}\n", "import * as fs from 'fs';\nimport * as os from 'os';\nimport * as path from 'path';\n\n/** Returns the path to the AWS config file, respecting $AWS_CONFIG_FILE. */\nexport function getAwsConfigPath(): string {\n return process.env.AWS_CONFIG_FILE ?? path.join(os.homedir(), '.aws', 'config');\n}\n\nexport interface AwsConfigInfo {\n /** Resolved (real) path of the config file. */\n configPath: string;\n /** True when the path matches ~/.aws/aws-envs/<name>/config */\n isAwsEnv: boolean;\n /** The env name when isAwsEnv is true, otherwise undefined. */\n envName?: string;\n /** All available env names when isAwsEnv is true. */\n envNames?: string[];\n}\n\n/**\n * Detects the AWS config file in use, resolving symlinks.\n * Returns null when config is plain/default (no $AWS_CONFIG_FILE and ~/.aws/config\n * is not a symlink) \u2014 nothing worth showing the user.\n * Otherwise returns info about the resolved path and whether aws-envs is in use.\n */\nexport function getAwsConfigInfo(): AwsConfigInfo | null {\n const rawPath = getAwsConfigPath();\n const defaultPath = path.join(os.homedir(), '.aws', 'config');\n const hasEnvOverride = !!process.env.AWS_CONFIG_FILE;\n\n // Check if the default config is a symlink\n let isSymlink = false;\n try {\n isSymlink = fs.lstatSync(defaultPath).isSymbolicLink();\n } catch { /* file may not exist */ }\n\n // Nothing interesting \u2014 hide the row entirely\n if (!hasEnvOverride && !isSymlink) { return null; }\n\n // Resolve symlink if present\n let configPath = rawPath;\n try {\n configPath = fs.realpathSync(rawPath);\n } catch {\n // File may not exist yet \u2014 use raw path\n configPath = rawPath;\n }\n\n // Normalize iCloud dotfiles path:\n // ~/Library/Mobile Documents/com~apple~CloudDocs/dotFiles/aws/dot-aws/...\n // is the iCloud-synced mirror of ~/.aws/... \u2014 treat it as such.\n const iCloudDotAws = path.join(\n os.homedir(),\n 'Library', 'Mobile Documents', 'com~apple~CloudDocs',\n 'dotFiles', 'aws', 'dot-aws'\n );\n if (configPath.startsWith(iCloudDotAws + '/') || configPath.startsWith(iCloudDotAws + path.sep)) {\n configPath = path.join(os.homedir(), '.aws', configPath.slice(iCloudDotAws.length + 1));\n }\n\n // Detect aws-envs pattern: ~/.aws/aws-envs/<name>/config\n const awsEnvsBase = path.join(os.homedir(), '.aws', 'aws-envs');\n const awsEnvsPattern = path.join(awsEnvsBase, path.sep);\n if (configPath.startsWith(awsEnvsPattern) || configPath.startsWith(awsEnvsBase + '/')) {\n const rel = path.relative(awsEnvsBase, configPath);\n const parts = rel.split(path.sep);\n if (parts.length === 2 && parts[1] === 'config') {\n const envName = parts[0];\n const envNames = listAwsEnvNames(awsEnvsBase);\n return { configPath, isAwsEnv: true, envName, envNames };\n }\n }\n\n return { configPath, isAwsEnv: false };\n}\n\n/** Lists available env names under ~/.aws/aws-envs/. */\nfunction listAwsEnvNames(awsEnvsBase: string): string[] {\n try {\n return fs.readdirSync(awsEnvsBase, { withFileTypes: true })\n .filter(d => d.isDirectory())\n .map(d => d.name)\n .sort();\n } catch {\n return [];\n }\n}\n\n/**\n * Reads AWS profile names from the config file at `configPath`.\n * Supports both [default] and [profile name] section headers.\n */\nexport function readAwsProfilesFrom(configPath: string): string[] {\n if (!fs.existsSync(configPath)) {\n return ['default'];\n }\n\n try {\n const content = fs.readFileSync(configPath, 'utf8');\n const profiles: string[] = [];\n\n for (const line of content.split('\\n')) {\n const trimmed = line.trim();\n // Matches [default] or [profile my-profile-name]\n const match = trimmed.match(/^\\[(?:profile\\s+)?(.+?)\\]$/);\n if (match) {\n const name = match[1].trim();\n if (name && !profiles.includes(name)) {\n profiles.push(name);\n }\n }\n }\n\n return profiles.length > 0 ? profiles : ['default'];\n } catch {\n return ['default'];\n }\n}\n\n/**\n * Reads AWS profile names from the currently active config file.\n */\nexport function readAwsProfiles(): string[] {\n return readAwsProfilesFrom(getAwsConfigPath());\n}\n", "import * as fs from 'fs';\nimport * as os from 'os';\nimport * as path from 'path';\nimport { ClaudeCodeSettings } from './types';\n\nconst SCHEMA_URL = 'https://json.schemastore.org/claude-code-settings.json';\n\n/** Returns the path to ~/.claude/settings.json */\nexport function getClaudeSettingsPath(): string {\n return path.join(os.homedir(), '.claude', 'settings.json');\n}\n\n/** Returns the path to {workspaceRoot}/.claude/settings.json */\nexport function getProjectSettingsPath(workspaceRoot: string): string {\n return path.join(workspaceRoot, '.claude', 'settings.json');\n}\n\n/** Reads and parses ~/.claude/settings.json. Returns {} if missing or unreadable. */\nexport function readClaudeSettings(): ClaudeCodeSettings {\n const filePath = getClaudeSettingsPath();\n\n if (!fs.existsSync(filePath)) {\n return {};\n }\n\n try {\n const raw = fs.readFileSync(filePath, 'utf8');\n const parsed = JSON.parse(raw) as unknown;\n if (typeof parsed === 'object' && parsed !== null && !Array.isArray(parsed)) {\n return parsed as ClaudeCodeSettings;\n }\n return {};\n } catch {\n return {};\n }\n}\n\n/** Writes settings to ~/.claude/settings.json, creating the directory if needed. */\nexport function writeClaudeSettings(settings: ClaudeCodeSettings): void {\n const filePath = getClaudeSettingsPath();\n const dir = path.dirname(filePath);\n\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n\n // Always include the JSON schema reference for IDE autocomplete\n const output: ClaudeCodeSettings = { $schema: SCHEMA_URL, ...settings };\n\n fs.writeFileSync(filePath, JSON.stringify(output, null, 2) + '\\n', 'utf8');\n}\n\n/** Reads and parses {workspaceRoot}/.claude/settings.json. Returns {} if missing. */\nexport function readProjectSettings(workspaceRoot: string): ClaudeCodeSettings {\n const filePath = getProjectSettingsPath(workspaceRoot);\n if (!fs.existsSync(filePath)) { return {}; }\n try {\n const raw = fs.readFileSync(filePath, 'utf8');\n const parsed = JSON.parse(raw) as unknown;\n if (typeof parsed === 'object' && parsed !== null && !Array.isArray(parsed)) {\n return parsed as ClaudeCodeSettings;\n }\n return {};\n } catch {\n return {};\n }\n}\n\n/** Writes settings to {workspaceRoot}/.claude/settings.json, creating the directory if needed. */\nexport function writeProjectSettings(workspaceRoot: string, settings: ClaudeCodeSettings): void {\n const filePath = getProjectSettingsPath(workspaceRoot);\n const dir = path.dirname(filePath);\n\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n\n const output: ClaudeCodeSettings = { $schema: SCHEMA_URL, ...settings };\n fs.writeFileSync(filePath, JSON.stringify(output, null, 2) + '\\n', 'utf8');\n}\n", "import * as fs from 'fs';\nimport * as os from 'os';\nimport * as path from 'path';\nimport { McpServerConfig } from './types';\n\n/** Per-project entry inside ~/.claude.json's projects block. */\ninterface ClaudeJsonProject {\n mcpServers?: Record<string, McpServerConfig>;\n [key: string]: unknown;\n}\n\n/** Opaque shape of ~/.claude.json \u2014 we only touch mcpServers keys (top-level and per-project). */\ninterface ClaudeJson {\n mcpServers?: Record<string, McpServerConfig>;\n projects?: Record<string, ClaudeJsonProject>;\n [key: string]: unknown;\n}\n\nexport function getClaudeJsonPath(): string {\n return path.join(os.homedir(), '.claude.json');\n}\n\nexport function readClaudeJson(): ClaudeJson {\n const filePath = getClaudeJsonPath();\n if (!fs.existsSync(filePath)) { return {}; }\n try {\n const raw = fs.readFileSync(filePath, 'utf8');\n const parsed = JSON.parse(raw) as unknown;\n if (typeof parsed === 'object' && parsed !== null && !Array.isArray(parsed)) {\n return parsed as ClaudeJson;\n }\n return {};\n } catch {\n return {};\n }\n}\n\n/** Reads MCP server entries from ~/.claude.json. Returns {} if missing or unreadable. */\nexport function readUserMcpServers(): Record<string, McpServerConfig> {\n return readClaudeJson().mcpServers ?? {};\n}\n\n/**\n * Ensures hasCompletedOnboarding is true in ~/.claude.json.\n * Prevents Claude Code from showing the first-run login wizard when the\n * user is relying on Bedrock or a proxy provider.\n */\nexport function ensureOnboardingComplete(): void {\n const filePath = getClaudeJsonPath();\n const existing = readClaudeJson();\n if (existing['hasCompletedOnboarding']) { return; } // already set \u2014 no write needed\n const updated = { ...existing, hasCompletedOnboarding: true };\n fs.writeFileSync(filePath, JSON.stringify(updated, null, 2) + '\\n', 'utf8');\n}\n\nfunction writeClaudeJson(updated: ClaudeJson): void {\n fs.writeFileSync(getClaudeJsonPath(), JSON.stringify(updated, null, 2) + '\\n', 'utf8');\n}\n\n/**\n * Ownership-aware merge: removes `previouslyOwned` names from the given\n * mcpServers map, then adds the preset's servers. Hand-added servers survive.\n * Returns the merged map (or undefined when the result is empty).\n */\nfunction mergeOwned(\n existing: Record<string, McpServerConfig> | undefined,\n servers: Record<string, McpServerConfig>,\n previouslyOwned: string[]\n): Record<string, McpServerConfig> | undefined {\n const merged: Record<string, McpServerConfig> = { ...(existing ?? {}) };\n for (const name of previouslyOwned) { delete merged[name]; }\n Object.assign(merged, servers);\n return Object.keys(merged).length > 0 ? merged : undefined;\n}\n\n/**\n * Merges the preset's MCP servers into the top-level mcpServers of\n * ~/.claude.json (global scope). Returns the names now owned by us.\n */\nexport function writeUserMcpServers(\n servers: Record<string, McpServerConfig>,\n previouslyOwned: string[] = []\n): string[] {\n const existing = readClaudeJson();\n const merged = mergeOwned(existing.mcpServers, servers, previouslyOwned);\n const updated: ClaudeJson = { ...existing };\n if (merged) { updated.mcpServers = merged; } else { delete updated.mcpServers; }\n writeClaudeJson(updated);\n return Object.keys(servers);\n}\n\n/**\n * Merges the preset's MCP servers into ~/.claude.json \u2192\n * projects[workspaceRoot].mcpServers (Claude Code's \"local\" scope for that\n * project). Returns the names now owned by us.\n */\nexport function writeProjectMcpServersToClaudeJson(\n workspaceRoot: string,\n servers: Record<string, McpServerConfig>,\n previouslyOwned: string[] = []\n): string[] {\n const existing = readClaudeJson();\n const projects = { ...(existing.projects ?? {}) };\n const entry: ClaudeJsonProject = { ...(projects[workspaceRoot] ?? {}) };\n const merged = mergeOwned(entry.mcpServers, servers, previouslyOwned);\n if (merged) { entry.mcpServers = merged; } else { delete entry.mcpServers; }\n\n // Don't create an otherwise-empty project entry for a no-server preset\n if (Object.keys(entry).length > 0 || projects[workspaceRoot]) {\n projects[workspaceRoot] = entry;\n }\n const updated: ClaudeJson = { ...existing };\n if (Object.keys(projects).length > 0) { updated.projects = projects; }\n writeClaudeJson(updated);\n return Object.keys(servers);\n}\n\n/**\n * Removes our owned MCP servers from projects[workspaceRoot] in ~/.claude.json\n * (used when a workspace goes back to inheriting the global scope).\n */\nexport function removeProjectMcpServersFromClaudeJson(\n workspaceRoot: string,\n ownedNames: string[]\n): void {\n if (ownedNames.length === 0) { return; }\n const existing = readClaudeJson();\n const entry = existing.projects?.[workspaceRoot];\n if (!entry?.mcpServers) { return; }\n const remaining = { ...entry.mcpServers };\n for (const name of ownedNames) { delete remaining[name]; }\n if (Object.keys(remaining).length > 0) {\n entry.mcpServers = remaining;\n } else {\n delete entry.mcpServers;\n }\n writeClaudeJson(existing);\n}\n", "import * as fs from 'fs';\nimport * as path from 'path';\nimport { McpServerConfig } from './types';\n\ninterface McpJson {\n mcpServers?: Record<string, McpServerConfig>;\n [key: string]: unknown;\n}\n\nexport function getMcpJsonPath(workspaceRoot: string): string {\n return path.join(workspaceRoot, '.mcp.json');\n}\n\nfunction readMcpJson(workspaceRoot: string): McpJson {\n const filePath = getMcpJsonPath(workspaceRoot);\n if (!fs.existsSync(filePath)) { return {}; }\n try {\n const raw = fs.readFileSync(filePath, 'utf8');\n const parsed = JSON.parse(raw) as unknown;\n if (typeof parsed === 'object' && parsed !== null && !Array.isArray(parsed)) {\n return parsed as McpJson;\n }\n return {};\n } catch {\n return {};\n }\n}\n\n/** Reads MCP server entries from {workspaceRoot}/.mcp.json. Returns {} if missing. */\nexport function readProjectMcpServers(workspaceRoot: string): Record<string, McpServerConfig> {\n return readMcpJson(workspaceRoot).mcpServers ?? {};\n}\n\n/**\n * Legacy cleanup: earlier versions wrote preset MCP servers into\n * {workspaceRoot}/.mcp.json; they now live in ~/.claude.json. Removes only\n * the named servers from the file's mcpServers key, drops the key when it\n * becomes empty, and deletes the file when nothing else remains. Servers the\n * user (or their team) added under other names are left untouched.\n */\nexport function cleanupLegacyMcpJson(workspaceRoot: string, serverNames: string[]): void {\n if (serverNames.length === 0) { return; }\n const filePath = getMcpJsonPath(workspaceRoot);\n if (!fs.existsSync(filePath)) { return; }\n\n const existing = readMcpJson(workspaceRoot);\n if (!existing.mcpServers) { return; }\n\n const remaining = { ...existing.mcpServers };\n let removed = false;\n for (const name of serverNames) {\n if (name in remaining) { delete remaining[name]; removed = true; }\n }\n if (!removed) { return; }\n\n const updated: McpJson = { ...existing };\n if (Object.keys(remaining).length > 0) {\n updated.mcpServers = remaining;\n } else {\n delete updated.mcpServers;\n }\n\n if (Object.keys(updated).length === 0) {\n fs.unlinkSync(filePath);\n } else {\n fs.writeFileSync(filePath, JSON.stringify(updated, null, 2) + '\\n', 'utf8');\n }\n}\n", "// Curated catalogue of well-known providers selectable from the \"3rd party\"\n// dropdown in the provider drawer. The catalogue is the single source of truth\n// for default URL, locked scheme/path, auth handling, and UI labelling \u2014 both\n// the webview and the resolver read from it so a hand-edited profile store\n// still resolves to the right env vars.\n\nexport type KnownProviderId =\n | 'bedrock'\n | 'openrouter'\n | 'ollama'\n | 'lmstudio'\n | 'omlx'\n | 'vllm'\n | 'litellm'\n | 'custom';\n\nexport interface KnownProvider {\n id: KnownProviderId;\n label: string;\n type: 'bedrock' | 'proxy';\n // Pre-filled into the URL field when the user picks this preset.\n defaultUrl?: string;\n // Locked parts of the URL \u2014 host and port stay editable; scheme + path\n // snap back on blur via normalizeKnownUrl().\n scheme?: 'http' | 'https';\n path?: string;\n // Auth mode written to settings.json. 'none' means no credential field is\n // shown in the UI; resolver writes a placeholder ANTHROPIC_AUTH_TOKEN so\n // Claude Code does not fall back to its OAuth flow.\n authMode?: 'apikey' | 'authtoken' | 'none';\n // UI label for the credential field. Deliberately user-facing terminology\n // (e.g. \"OpenRouter API key\") \u2014 never references AUTH_TOKEN or Bearer.\n credentialLabel?: string;\n // Whether the credential is mandatory for a working setup.\n credentialRequired?: boolean;\n}\n\nexport const KNOWN_PROVIDERS: KnownProvider[] = [\n {\n id: 'bedrock',\n label: 'Amazon Bedrock',\n type: 'bedrock',\n },\n {\n id: 'openrouter',\n label: 'OpenRouter',\n type: 'proxy',\n defaultUrl: 'https://openrouter.ai/api',\n scheme: 'https',\n path: '/api',\n authMode: 'authtoken',\n credentialLabel: 'OpenRouter API key',\n credentialRequired: true,\n },\n {\n id: 'ollama',\n label: 'Ollama',\n type: 'proxy',\n defaultUrl: 'http://localhost:11434',\n scheme: 'http',\n path: '',\n authMode: 'none',\n },\n {\n id: 'lmstudio',\n label: 'LM Studio',\n type: 'proxy',\n defaultUrl: 'http://localhost:1234',\n scheme: 'http',\n path: '',\n authMode: 'none',\n },\n {\n id: 'omlx',\n label: 'oMLX',\n type: 'proxy',\n defaultUrl: 'http://localhost:8000',\n scheme: 'http',\n path: '',\n authMode: 'authtoken',\n credentialLabel: 'oMLX API key (optional)',\n credentialRequired: false,\n },\n {\n id: 'vllm',\n label: 'vLLM',\n type: 'proxy',\n defaultUrl: 'http://localhost:8000',\n scheme: 'http',\n path: '',\n authMode: 'authtoken',\n credentialLabel: 'API key (optional)',\n credentialRequired: false,\n },\n {\n id: 'litellm',\n label: 'LiteLLM',\n type: 'proxy',\n defaultUrl: 'http://localhost:4000',\n scheme: 'http',\n path: '',\n authMode: 'authtoken',\n credentialLabel: 'API key (optional)',\n credentialRequired: false,\n },\n {\n id: 'custom',\n label: 'Other / Custom\u2026',\n type: 'proxy',\n },\n];\n\nexport function knownProvider(id: string | undefined): KnownProvider | undefined {\n if (!id) { return undefined; }\n return KNOWN_PROVIDERS.find(p => p.id === id);\n}\n\n/**\n * Coerce a user-typed URL to the known preset's scheme + path while keeping\n * the host and port the user entered. Lets users point Ollama/LM Studio at\n * another machine or non-default port without breaking the path contract.\n *\n * Examples:\n * openrouter, \"openrouter.ai/v1\" \u2192 \"https://openrouter.ai/api\"\n * ollama, \"192.168.1.50:11434\" \u2192 \"http://192.168.1.50:11434\"\n * lmstudio, \"http://mybox:1234\" \u2192 \"http://mybox:1234\"\n * custom, anything \u2192 returned unchanged\n */\nexport function normalizeKnownUrl(p: KnownProvider, raw: string): string {\n const trimmed = (raw || '').trim();\n if (!trimmed) { return p.defaultUrl ?? ''; }\n // Custom: don't touch the URL.\n if (p.id === 'custom' || !p.scheme) { return trimmed; }\n\n // Strip any scheme the user typed; we'll re-apply the locked one.\n const withoutScheme = trimmed.replace(/^[a-z][a-z0-9+.-]*:\\/\\//i, '');\n // Drop trailing slashes so we don't double-append the path.\n const noTrailingSlash = withoutScheme.replace(/\\/+$/, '');\n // Split host[:port] from any path the user appended; we discard the path.\n const slashIdx = noTrailingSlash.indexOf('/');\n const hostPort = slashIdx === -1 ? noTrailingSlash : noTrailingSlash.slice(0, slashIdx);\n if (!hostPort) { return p.defaultUrl ?? ''; }\n\n return `${p.scheme}://${hostPort}${p.path ?? ''}`;\n}\n", "import * as fs from 'fs';\nimport * as os from 'os';\nimport * as path from 'path';\nimport {\n ProfileStore,\n McpServerConfig,\n ClaudeCodeSettings,\n} from './types';\nimport { MANAGED_ENV_KEYS, AWS_REGIONS } from './models';\nimport {\n readClaudeSettings,\n writeClaudeSettings,\n readProjectSettings,\n writeProjectSettings,\n getProjectSettingsPath,\n} from './claudeSettings';\nimport {\n writeUserMcpServers,\n readUserMcpServers,\n writeProjectMcpServersToClaudeJson,\n removeProjectMcpServersFromClaudeJson,\n ensureOnboardingComplete,\n} from './claudeJson';\nimport { cleanupLegacyMcpJson } from './mcpJson';\nimport { writeProfileStore } from './profiles';\nimport { knownProvider, normalizeKnownUrl } from './knownProviders';\n\n// ---------------------------------------------------------------------------\n// Resolved configuration \u2014 the flat representation written to Claude Code files\n// ---------------------------------------------------------------------------\n\nexport interface ResolvedConfig {\n env: Record<string, string>;\n allowedDirectories: string[];\n awsAuthRefresh?: string;\n apiKeyHelper?: string;\n mcpServers: Record<string, McpServerConfig>;\n}\n\n// ---------------------------------------------------------------------------\n// Resolution: Preset \u2192 flat config\n// ---------------------------------------------------------------------------\n\n/** Resolve a preset ID into flat env vars, MCP servers, and directories. */\nexport function resolvePreset(\n store: ProfileStore,\n presetId: string\n): ResolvedConfig | null {\n const preset = store.presets.find(p => p.id === presetId);\n if (!preset) { return null; }\n\n const provider = store.providers.find(p => p.id === preset.providerId);\n const env: Record<string, string> = {};\n let awsAuthRefresh: string | undefined;\n let apiKeyHelper: string | undefined;\n\n if (provider) {\n // Reset cross-provider keys so a workspace preset using a different provider than the\n // global preset doesn't silently inherit parent values.\n // - CLAUDE_CODE_USE_BEDROCK=0 overrides a parent bedrock preset (set to 1 below if bedrock)\n // - ANTHROPIC_BASE_URL='' overrides a parent proxy URL (deleted below for global)\n // - AWS_PROFILE/AWS_REGION: NOT reset \u2014 they don't affect non-bedrock providers\n // - ANTHROPIC_API_KEY/AUTH_TOKEN: written only by the provider-specific block below\n env['CLAUDE_CODE_USE_BEDROCK'] = '0';\n env['ANTHROPIC_BASE_URL'] = '';\n\n // Provider-specific env vars\n switch (provider.type) {\n case 'bedrock': {\n env['CLAUDE_CODE_USE_BEDROCK'] = '1';\n env['CLAUDE_CODE_USE_MANTLE'] = provider.useMantle ? '1' : '0';\n if (provider.awsProfile) { env['AWS_PROFILE'] = provider.awsProfile; }\n if (provider.awsRegion) {\n if (!AWS_REGIONS.includes(provider.awsRegion)) {\n throw new Error(`Invalid AWS region \"${provider.awsRegion}\". Must be one of: ${AWS_REGIONS.join(', ')}`);\n }\n env['AWS_REGION'] = provider.awsRegion;\n }\n if (provider.awsAuthRefresh) { awsAuthRefresh = provider.awsAuthRefresh; }\n // Write AWS_CONFIG_FILE when the provider has a specific aws-env selected.\n // This is stored per-provider so switching envs for one provider does not\n // affect other providers.\n if (provider.awsEnv) {\n env['AWS_CONFIG_FILE'] = path.join(os.homedir(), '.aws', 'aws-envs', provider.awsEnv, 'config');\n }\n break;\n }\n case 'anthropic':\n if (provider.anthropicApiKey?.startsWith('op://')) {\n apiKeyHelper = `op read '${provider.anthropicApiKey}'`;\n } else if (provider.anthropicApiKey) {\n env['ANTHROPIC_API_KEY'] = provider.anthropicApiKey;\n }\n break;\n case 'proxy': {\n // Resolve which known-provider entry (if any) applies. Hand-edited\n // stores without proxyPreset default to 'custom' \u2014 same behaviour as\n // before the catalogue existed.\n const known = knownProvider(provider.proxyPreset ?? 'custom');\n const isKnown = known && known.id !== 'custom';\n\n let baseUrl = provider.proxyBaseUrl || '';\n if (isKnown && known) {\n // Catalogue is source of truth for known presets: re-impose scheme + path,\n // accept whatever host:port the user stored. Belt-and-suspenders against\n // hand-edited profile stores.\n baseUrl = normalizeKnownUrl(known, baseUrl);\n } else {\n // Custom path: strip trailing /v1 (users often paste the full endpoint URL)\n baseUrl = baseUrl.replace(/\\/v1\\/?$/, '').replace(/\\/+$/, '');\n // OpenRouter requires /api \u2014 defensive fallback for custom entries that\n // happen to point at openrouter.ai.\n if (/openrouter\\.ai/i.test(baseUrl) && !/\\/api\\b/i.test(baseUrl)) {\n baseUrl = baseUrl + '/api';\n }\n }\n if (baseUrl) { env['ANTHROPIC_BASE_URL'] = baseUrl; }\n\n // Resolve credential: new single-field model (proxyCredential + proxyAuthMode),\n // with fallback migration for stored data that uses the old separate fields.\n const cred = provider.proxyCredential\n ?? provider.proxyAuthToken // eslint-disable-line deprecation/deprecation\n ?? provider.proxyApiKey; // eslint-disable-line deprecation/deprecation\n // Mode source of truth: the catalogue for known presets, the user's\n // selection for 'custom', or migration fallback for legacy stores.\n let mode: 'apikey' | 'authtoken' | 'none';\n if (isKnown && known?.authMode) {\n mode = known.authMode;\n } else {\n mode = provider.proxyAuthMode\n ?? (provider.proxyAuthToken ? 'authtoken' : 'apikey'); // eslint-disable-line deprecation/deprecation\n }\n\n // Mutual exclusivity rule: ANTHROPIC_API_KEY and ANTHROPIC_AUTH_TOKEN must never\n // coexist in settings.json. Exactly one is written based on the resolved mode,\n // or a placeholder AUTH_TOKEN when the user supplied no credential.\n if (cred?.startsWith('op://')) {\n // 1Password ref \u2192 apiKeyHelper (no API_KEY/AUTH_TOKEN written)\n apiKeyHelper = `op read '${cred}'`;\n } else if (cred && mode === 'authtoken') {\n env['ANTHROPIC_AUTH_TOKEN'] = cred;\n } else if (cred && mode === 'apikey') {\n env['ANTHROPIC_API_KEY'] = cred;\n } else {\n // Placeholder fallback: a non-empty Authorization header keeps\n // Claude Code from falling back to its OAuth flow against local\n // servers that ignore the header anyway (Ollama, LM Studio).\n env['ANTHROPIC_AUTH_TOKEN'] = 'none';\n }\n break;\n }\n }\n\n // Model env vars \u2014 for Anthropic native, clear any overrides (empty string resets\n // workspace-level to unset); for other providers, set the configured model names.\n if (provider.type === 'anthropic') {\n env['ANTHROPIC_DEFAULT_SONNET_MODEL'] = '';\n env['ANTHROPIC_DEFAULT_HAIKU_MODEL'] = '';\n env['ANTHROPIC_DEFAULT_OPUS_MODEL'] = '';\n } else {\n env['ANTHROPIC_DEFAULT_SONNET_MODEL'] = provider.primaryModel || '';\n env['ANTHROPIC_DEFAULT_HAIKU_MODEL'] = provider.smallFastModel || '';\n env['ANTHROPIC_DEFAULT_OPUS_MODEL'] = provider.opusModel || '';\n }\n env['DISABLE_PROMPT_CACHING'] = provider.disablePromptCaching ? '1' : '';\n // Bedrock always disables nonessential traffic (AWS auth, never needs Anthropic login).\n // Known 3rd-party presets (OpenRouter, Ollama, LM Studio, oMLX, vLLM, LiteLLM) are\n // also force-on \u2014 none of them route to Anthropic, so telemetry/login traffic is\n // always wrong. Only the 'custom' proxy honours the user's Standalone-mode toggle,\n // since a custom proxy might legitimately forward to Anthropic.\n // DISABLE_AUTOUPDATER is intentionally NOT written here: auto-update is a CLI-lifecycle\n // decision that belongs to the user/machine, not a preset. Toggling presets across\n // workspaces shouldn't flip whether the CLI updates itself.\n const isKnownProxy = provider.type === 'proxy'\n && provider.proxyPreset !== undefined\n && provider.proxyPreset !== 'custom';\n const shouldDisableLoginPrompt =\n provider.type === 'bedrock' ||\n isKnownProxy ||\n (provider.type === 'proxy' && provider.disableLoginPrompt !== false);\n env['CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC'] = shouldDisableLoginPrompt ? '1' : '0';\n\n }\n\n // Merge MCP servers from all selected groups\n const mcpServers: Record<string, McpServerConfig> = {};\n for (const groupId of preset.mcpGroupIds) {\n const group = store.mcpGroups.find(g => g.id === groupId);\n if (group) {\n for (const server of group.servers) {\n const config: McpServerConfig = { type: server.type };\n if (server.url) { config.url = server.url; }\n if (server.command) { config.command = server.command; }\n if (server.args?.length) { config.args = server.args; }\n if (server.env && Object.keys(server.env).length) { config.env = server.env; }\n mcpServers[server.name] = config;\n }\n }\n }\n\n // Merge directories from all selected groups\n const allowedDirectories: string[] = [];\n for (const groupId of preset.directoryGroupIds) {\n const group = store.directoryGroups.find(g => g.id === groupId);\n if (group) {\n for (const dir of group.directories) {\n if (!allowedDirectories.includes(dir)) {\n allowedDirectories.push(dir);\n }\n }\n }\n }\n\n return { env, allowedDirectories, awsAuthRefresh, apiKeyHelper, mcpServers };\n}\n\n// ---------------------------------------------------------------------------\n// Apply resolved config to Claude Code's actual files\n// ---------------------------------------------------------------------------\n\n/**\n * Returns true when key=value carries no information and need not be written.\n * - Empty string is always a no-op at global level (no parent to override).\n * - CLAUDE_CODE_USE_BEDROCK=0 is the default; writing it at global level is noise.\n */\nfunction isNoOp(key: string, value: string): boolean {\n if (value === '') { return true; }\n if (key === 'CLAUDE_CODE_USE_BEDROCK' && value === '0') { return true; }\n if (key === 'CLAUDE_CODE_USE_MANTLE' && value === '0') { return true; }\n if (key === 'CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC' && value === '0') { return true; }\n return false;\n}\n\n/** Strip no-op values before writing to global settings \u2014 global has no parent. */\nfunction filterForGlobal(env: Record<string, string>): Record<string, string> {\n return Object.fromEntries(Object.entries(env).filter(([k, v]) => !isNoOp(k, v)));\n}\n\n/**\n * At project level, a no-op value is worth writing only when the global env has\n * that key set to a meaningful value (i.e. we need to explicitly override it).\n * Otherwise it's noise.\n */\nfunction filterForProject(\n env: Record<string, string>,\n globalEnv: Record<string, string>\n): Record<string, string> {\n return Object.fromEntries(\n Object.entries(env).filter(([k, v]) => !isNoOp(k, v) || !isNoOp(k, globalEnv[k] ?? ''))\n );\n}\n\n// ---------------------------------------------------------------------------\n\n/**\n * Return a copy of `existing` with all MANAGED_ENV_KEYS removed,\n * so user-defined env vars are preserved when we overwrite managed ones.\n */\nfunction preserveUnmanagedEnv(existing: Record<string, string>): Record<string, string> {\n const preserved: Record<string, string> = {};\n for (const [key, value] of Object.entries(existing)) {\n if (!MANAGED_ENV_KEYS.has(key)) {\n preserved[key] = value;\n }\n }\n return preserved;\n}\n\n/**\n * Apply a resolved config to the global scope:\n * - env vars \u2192 ~/.claude/settings.json\n * - MCP servers \u2192 ~/.claude.json (top-level mcpServers, ownership-merged)\n *\n * `previouslyOwned` is the list of server names we wrote last time; exactly\n * those are removed before merging so hand-added servers survive. Pass\n * undefined on the first ownership-aware apply to treat every existing\n * top-level server as ours (pre-ownership versions replaced the key\n * wholesale, so historically it was all ccp-written).\n * Returns the server names now owned by us.\n */\nexport function applyGlobalConfig(\n resolved: ResolvedConfig,\n previouslyOwned?: string[]\n): string[] {\n const settings = readClaudeSettings();\n const preservedEnv = preserveUnmanagedEnv(settings.env ?? {});\n\n const newSettings: ClaudeCodeSettings = {\n ...settings,\n env: { ...preservedEnv, ...filterForGlobal(resolved.env) },\n };\n\n // Set or clear allowedDirectories\n if (resolved.allowedDirectories.length > 0) {\n newSettings.allowedDirectories = resolved.allowedDirectories;\n } else {\n delete newSettings.allowedDirectories;\n }\n\n // Set or clear awsAuthRefresh\n if (resolved.awsAuthRefresh) {\n newSettings.awsAuthRefresh = resolved.awsAuthRefresh;\n } else {\n delete newSettings.awsAuthRefresh;\n }\n\n // Set or clear apiKeyHelper (1Password / op-read support)\n if (resolved.apiKeyHelper) {\n newSettings.apiKeyHelper = resolved.apiKeyHelper;\n } else {\n delete newSettings.apiKeyHelper;\n }\n\n // Clear deprecated env var keys\n if (newSettings.env) {\n delete newSettings.env['ANTHROPIC_MODEL'];\n delete newSettings.env['ANTHROPIC_SMALL_FAST_MODEL'];\n delete newSettings.env['ANTHROPIC_SMALL_FAST_MODEL_AWS_REGION'];\n }\n\n writeClaudeSettings(newSettings);\n\n // No ownership record yet \u2192 migrate: treat all existing top-level servers\n // as ours, matching the old wholesale-replace behavior.\n const owned = previouslyOwned ?? Object.keys(readUserMcpServers());\n return writeUserMcpServers(resolved.mcpServers, owned);\n}\n\n/**\n * Remove managed env keys, allowedDirectories, and awsAuthRefresh from\n * {workspace}/.claude/settings.json so the project inherits from global.\n * Preserves any non-managed keys the user may have set. Also removes our\n * owned MCP servers from ~/.claude.json's projects block and from any\n * legacy .mcp.json we wrote in earlier versions.\n */\nexport function cleanProjectConfig(workspaceRoot: string, ownedMcpNames: string[] = []): void {\n removeProjectMcpServersFromClaudeJson(workspaceRoot, ownedMcpNames);\n cleanupLegacyMcpJson(workspaceRoot, ownedMcpNames);\n\n const settings = readProjectSettings(workspaceRoot);\n if (Object.keys(settings).length === 0) { return; } // nothing to clean\n\n // Remove managed env keys\n if (settings.env) {\n for (const key of MANAGED_ENV_KEYS) {\n delete settings.env[key];\n }\n if (Object.keys(settings.env).length === 0) {\n delete settings.env;\n }\n }\n\n // Remove fields we manage\n delete settings.allowedDirectories;\n delete settings.awsAuthRefresh;\n delete settings.apiKeyHelper;\n\n // Only write back if there's still content beyond $schema; otherwise leave file alone\n const remaining = Object.keys(settings).filter(k => k !== '$schema');\n if (remaining.length > 0) {\n writeProjectSettings(workspaceRoot, settings);\n } else {\n // File only has $schema (or nothing) \u2014 remove it to keep the project clean\n const filePath = getProjectSettingsPath(workspaceRoot);\n if (fs.existsSync(filePath)) {\n fs.unlinkSync(filePath);\n }\n }\n}\n\n/**\n * Apply a resolved config to the project scope:\n * - env vars + directories \u2192 {workspace}/.claude/settings.json\n * - MCP servers \u2192 ~/.claude.json projects[workspace].mcpServers\n * (ownership-merged; .mcp.json is no longer written \u2014 any servers we put\n * there in earlier versions are migrated out on this apply)\n *\n * Returns the MCP server names now owned by us for this workspace.\n */\nexport function applyProjectConfig(\n resolved: ResolvedConfig,\n workspaceRoot: string,\n previouslyOwned: string[] = []\n): string[] {\n // Write env vars and directories to project-level settings\n const globalEnv = readClaudeSettings().env ?? {};\n const settings = readProjectSettings(workspaceRoot);\n const preservedEnv = preserveUnmanagedEnv(settings.env ?? {});\n\n const newSettings: ClaudeCodeSettings = {\n ...settings,\n env: { ...preservedEnv, ...filterForProject(resolved.env, globalEnv) },\n };\n\n if (resolved.allowedDirectories.length > 0) {\n newSettings.allowedDirectories = resolved.allowedDirectories;\n } else {\n delete newSettings.allowedDirectories;\n }\n\n if (resolved.awsAuthRefresh) {\n newSettings.awsAuthRefresh = resolved.awsAuthRefresh;\n } else {\n delete newSettings.awsAuthRefresh;\n }\n\n if (resolved.apiKeyHelper) {\n newSettings.apiKeyHelper = resolved.apiKeyHelper;\n } else {\n delete newSettings.apiKeyHelper;\n }\n\n writeProjectSettings(workspaceRoot, newSettings);\n\n // MCP servers \u2192 ~/.claude.json projects block (Claude Code \"local\" scope)\n const owned = writeProjectMcpServersToClaudeJson(\n workspaceRoot,\n resolved.mcpServers,\n previouslyOwned\n );\n\n // Migrate: earlier versions wrote these servers into {workspace}/.mcp.json.\n // Remove them (previously owned + freshly applied names) so they don't\n // load twice; other servers in the file are left alone.\n cleanupLegacyMcpJson(workspaceRoot, [...new Set([...previouslyOwned, ...owned])]);\n\n // If the workspace is a VS Code extension, ensure .mcp.json and .claude/\n // are listed in .vscodeignore so they don't end up in published VSIXs.\n ensureVscodeignore(workspaceRoot);\n\n return owned;\n}\n\n/**\n * Resolve and apply the active scope assignments from the store.\n * Updates store.mcpOwnership (which server names we wrote where) and\n * persists the store when the ownership record changed.\n */\nexport function applyAllScopes(\n store: ProfileStore,\n workspaceRoot: string | undefined\n): void {\n // Onboarding flag: Claude Code shows the OAuth /login wizard when\n // ~/.claude.json is missing hasCompletedOnboarding or has it false.\n // Guarantee it's true here so every apply path is structurally safe \u2014\n // not dependent on every caller remembering to invoke it separately.\n ensureOnboardingComplete();\n\n const before = JSON.stringify(store.mcpOwnership ?? {});\n store.mcpOwnership ??= {};\n store.mcpOwnership.workspaces ??= {};\n\n // Global scope\n if (store.globalScope.mode === 'preset' && store.globalScope.presetId) {\n const resolved = resolvePreset(store, store.globalScope.presetId);\n if (resolved) {\n store.mcpOwnership.global = applyGlobalConfig(resolved, store.mcpOwnership.global);\n }\n }\n\n // Workspace scope\n if (workspaceRoot) {\n const wsScope = store.workspaceScopes[workspaceRoot];\n if (wsScope) {\n const owned = store.mcpOwnership.workspaces[workspaceRoot] ?? [];\n if (wsScope.mode === 'preset' && wsScope.presetId) {\n const resolved = resolvePreset(store, wsScope.presetId);\n if (resolved) {\n store.mcpOwnership.workspaces[workspaceRoot] =\n applyProjectConfig(resolved, workspaceRoot, owned);\n }\n }\n if (wsScope.mode === 'inherit') {\n cleanProjectConfig(workspaceRoot, owned);\n delete store.mcpOwnership.workspaces[workspaceRoot];\n }\n // 'manual' mode: user manages files themselves\n }\n }\n\n if (JSON.stringify(store.mcpOwnership) !== before) {\n writeProfileStore(store);\n }\n}\n\n// ---------------------------------------------------------------------------\n// .vscodeignore helper \u2014 prevent leaking generated config into published VSIXs\n// ---------------------------------------------------------------------------\n\nconst VSCODEIGNORE_ENTRIES = ['.mcp.json', '.claude/'];\n\nfunction ensureVscodeignore(workspaceRoot: string): void {\n const ignorePath = path.join(workspaceRoot, '.vscodeignore');\n if (!fs.existsSync(ignorePath)) { return; } // not a VS Code extension project\n try {\n let content = fs.readFileSync(ignorePath, 'utf8');\n const lines = content.split('\\n').map(l => l.trim());\n const missing = VSCODEIGNORE_ENTRIES.filter(e => !lines.includes(e));\n if (missing.length === 0) { return; }\n if (!content.endsWith('\\n')) { content += '\\n'; }\n content += missing.join('\\n') + '\\n';\n fs.writeFileSync(ignorePath, content, 'utf8');\n } catch { /* best effort \u2014 don't break save */ }\n}\n", "import { ProfileStore, ProviderProfile } from './types';\n\n// ---------------------------------------------------------------------------\n// Credential scrubbing \u2014 real keys must never leave the machine on export.\n// Shared by the VS Code export command and the CLI `export` command.\n// ---------------------------------------------------------------------------\n\nconst CREDENTIAL_PATTERNS = [\n /sk-ant-[a-zA-Z0-9_-]{20,}/g,\n /sk-or-[a-zA-Z0-9_-]{20,}/g,\n /sk-proj-[a-zA-Z0-9_-]{20,}/g,\n /sk-live-[a-zA-Z0-9_-]{20,}/g,\n /AKIA[A-Z0-9]{16}/g,\n /ghp_[a-zA-Z0-9]{36,}/g,\n /gho_[a-zA-Z0-9]{36,}/g,\n /github_pat_[a-zA-Z0-9_]{20,}/g,\n /xoxb-[a-zA-Z0-9-]+/g,\n /xoxp-[a-zA-Z0-9-]+/g,\n];\n\nexport const PLACEHOLDER = '<REPLACE_ME>';\n\nconst SAFE_VALUES = new Set<string | undefined>([\n '', 'foobar', 'placeholder', 'dummy', 'local', 'Optional',\n 'your-key-here', 'xxx', undefined,\n]);\n\n/** Scrub known credential patterns from a string value. */\nexport function scrubValue(value: string | undefined): string | undefined {\n if (!value || SAFE_VALUES.has(value)) { return value; }\n // op:// references are 1Password pointers, not secrets \u2014 keep them.\n if (value.startsWith('op://')) { return value; }\n let scrubbed = value;\n for (const pattern of CREDENTIAL_PATTERNS) {\n pattern.lastIndex = 0;\n scrubbed = scrubbed.replace(pattern, PLACEHOLDER);\n }\n // If it still looks like a real key (long alphanumeric string), replace it\n if (scrubbed === value && value.length >= 20 && /^[a-zA-Z0-9_-]+$/.test(value)) {\n return PLACEHOLDER;\n }\n return scrubbed;\n}\n\n/** Deep-scrub a provider profile of all credential-like fields. */\nfunction scrubProvider(provider: ProviderProfile): ProviderProfile {\n return {\n ...provider,\n anthropicApiKey: scrubValue(provider.anthropicApiKey),\n proxyCredential: scrubValue(provider.proxyCredential),\n proxyApiKey: scrubValue(provider.proxyApiKey),\n proxyAuthToken: scrubValue(provider.proxyAuthToken),\n awsAuthRefresh: provider.awsAuthRefresh, // command, not a secret\n };\n}\n\n/** Scrub all credentials from a profile store for safe export. */\nexport function scrubStore(store: ProfileStore): ProfileStore {\n const scrubbed: ProfileStore = {\n ...store,\n providers: store.providers.map(scrubProvider),\n };\n // Machine-local state: which MCP server names we wrote into this machine's\n // ~/.claude.json. Meaningless (and misleading) on another machine.\n delete scrubbed.mcpOwnership;\n return scrubbed;\n}\n\n/** Names of providers whose credentials are placeholders that need replacing. */\nexport function providersNeedingCredentials(store: ProfileStore): string[] {\n return store.providers\n .filter(p =>\n p.anthropicApiKey === PLACEHOLDER ||\n p.proxyCredential === PLACEHOLDER ||\n p.proxyApiKey === PLACEHOLDER ||\n p.proxyAuthToken === PLACEHOLDER\n )\n .map(p => p.name);\n}\n\n// ---------------------------------------------------------------------------\n// Import \u2014 parse + validate + merge. Shared by extension and CLI.\n// ---------------------------------------------------------------------------\n\n/** Parse and validate raw JSON into a ProfileStore. Throws on malformed input. */\nexport function parseIncomingStore(raw: string): ProfileStore {\n const incoming = JSON.parse(raw) as ProfileStore;\n if (!incoming.version || !incoming.providers || !incoming.presets) {\n throw new Error('Not a valid profile store');\n }\n return incoming;\n}\n\n/** Insert `incoming` or overwrite the entry with the same ID. */\nfunction upsertById<T extends { id: string }>(list: T[], incoming: T): 'added' | 'updated' {\n const idx = list.findIndex(e => e.id === incoming.id);\n if (idx >= 0) { list[idx] = incoming; return 'updated'; }\n list.push(incoming);\n return 'added';\n}\n\n/**\n * Keep the existing credential when the incoming one is a scrubbed\n * placeholder (or absent) \u2014 a merge must never destroy working credentials.\n * Real incoming values (including op:// references, which survive scrubbing)\n * do overwrite.\n */\nfunction preserveCredential(\n incoming: string | undefined,\n existing: string | undefined\n): string | undefined {\n if (incoming === PLACEHOLDER || incoming === undefined || incoming === '') {\n return existing ?? incoming;\n }\n return incoming;\n}\n\nexport interface MergeResult {\n added: number;\n updated: number;\n}\n\n/**\n * Merge an incoming store into a base store with upsert semantics: entries\n * whose UUID already exists locally are overwritten in place (same lineage \u2014\n * an update from the original source); unknown UUIDs are added as-is. IDs are\n * never regenerated, so re-importing the same export is idempotent and\n * cross-references stay intact. Existing entries absent from the import are\n * left alone (merge never deletes \u2014 use replace for that). Scope assignments\n * and mcpOwnership are machine-local and not merged. Mutates and returns\n * `base`; per-kind counts are written to `result` when provided.\n */\nexport function mergeIncomingStore(\n base: ProfileStore,\n incoming: ProfileStore,\n result?: MergeResult\n): ProfileStore {\n const tally: MergeResult = { added: 0, updated: 0 };\n const count = (outcome: 'added' | 'updated') => { tally[outcome]++; };\n\n for (const provider of incoming.providers) {\n const existing = base.providers.find(p => p.id === provider.id);\n count(upsertById(base.providers, {\n ...provider,\n anthropicApiKey: preserveCredential(provider.anthropicApiKey, existing?.anthropicApiKey),\n proxyCredential: preserveCredential(provider.proxyCredential, existing?.proxyCredential),\n proxyApiKey: preserveCredential(provider.proxyApiKey, existing?.proxyApiKey),\n proxyAuthToken: preserveCredential(provider.proxyAuthToken, existing?.proxyAuthToken),\n }));\n }\n\n for (const group of incoming.mcpGroups) {\n count(upsertById(base.mcpGroups, group));\n }\n\n for (const group of incoming.directoryGroups) {\n count(upsertById(base.directoryGroups, group));\n }\n\n for (const preset of incoming.presets) {\n count(upsertById(base.presets, preset));\n }\n\n if (result) { Object.assign(result, tally); }\n return base;\n}\n", "// Public API of the Claude Code Personae engine \u2014 shared by the VS Code\n// extension and the CLI. Both bundle this source via esbuild.\nexport * from './types';\nexport * from './models';\nexport * from './profiles';\nexport * from './awsConfig';\nexport * from './claudeSettings';\nexport * from './claudeJson';\nexport * from './mcpJson';\nexport * from './knownProviders';\nexport * from './resolver';\nexport * from './transfer';\n", "{\n \"name\": \"@easytocloud/claude-personae\",\n \"version\": \"0.8.0\",\n \"description\": \"CLI to switch Claude Code provider presets (AWS Bedrock / Anthropic / proxy) \u2014 companion to the Claude Code Personae VS Code extension. Operates on the same ~/.claude profile store.\",\n \"license\": \"MIT\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/easytocloud/bedrock-claude-code\",\n \"directory\": \"cli\"\n },\n \"homepage\": \"https://github.com/easytocloud/bedrock-claude-code#readme\",\n \"bugs\": {\n \"url\": \"https://github.com/easytocloud/bedrock-claude-code/issues\"\n },\n \"keywords\": [\n \"claude\",\n \"claude-code\",\n \"aws\",\n \"bedrock\",\n \"anthropic\",\n \"cli\",\n \"presets\",\n \"proxy\"\n ],\n \"bin\": {\n \"claude-personae\": \"dist/cli.js\",\n \"ccp\": \"dist/cli.js\"\n },\n \"files\": [\n \"dist\",\n \"README.md\"\n ],\n \"engines\": {\n \"node\": \">=18\"\n },\n \"scripts\": {\n \"build\": \"node esbuild.js\",\n \"watch\": \"node esbuild.js --watch\",\n \"prepublishOnly\": \"node esbuild.js\"\n },\n \"devDependencies\": {\n \"@easytocloud/claude-personae-core\": \"*\",\n \"@types/node\": \"^20.0.0\",\n \"esbuild\": \"^0.25.0\",\n \"typescript\": \"^5.6.0\"\n }\n}\n", "import * as fs from 'fs';\nimport * as path from 'path';\nimport { parseArgs } from 'util';\nimport {\n readProfileStore,\n writeProfileStore,\n ensureDefaults,\n applyAllScopes,\n resolvePreset,\n applyGlobalConfig,\n applyProjectConfig,\n cleanProjectConfig,\n ensureOnboardingComplete,\n findPresetByNameOrId,\n scrubStore,\n PLACEHOLDER,\n parseIncomingStore,\n mergeIncomingStore,\n providersNeedingCredentials,\n ProfileStore,\n ScopeAssignment,\n Preset,\n} from '@easytocloud/claude-personae-core';\n\n// eslint-disable-next-line @typescript-eslint/no-var-requires\nconst VERSION: string = require('../package.json').version;\n\nconst HELP = `claude-personae (ccp) \u2014 switch Claude Code provider presets from the shell\n\nOperates on the same profile store as the \"Claude Code Personae\" VS Code\nextension (~/.claude/coder-profiles.json). Use the extension to author\nproviders/presets; use this CLI to switch and apply them.\n\nUSAGE\n ccp <command> [options]\n\nCOMMANDS\n list [presets|providers|scopes] List configured items (default: all)\n current Show the active global + workspace preset\n switch <preset> [scope] Set the active preset and apply it\n apply Re-apply the global + current-workspace scopes\n sync Re-align all config with the profile store:\n global + EVERY known workspace assignment.\n MCP servers are written to ~/.claude.json;\n entries we once wrote to .mcp.json are\n migrated out (other servers left alone)\n export Print the store as JSON (credentials scrubbed)\n import <file|-> Import a store from a file or stdin\n\nSCOPE (for \\`switch\\`)\n --global, -g Set the global preset (use with care \u2014 affects all workspaces)\n --workspace, -w Set the preset for a workspace (uses CWD, default)\n --path <dir> Workspace directory to target (implies --workspace)\n --inherit Workspace inherits the global preset (clears overrides)\n --manual Workspace is managed manually (CLI leaves files alone)\n\nOPTIONS\n --json Machine-readable JSON output (list, current)\n --out, -o <file> Write export to a file instead of stdout\n --no-scrub Export without scrubbing credentials (dangerous)\n --mode <merge|replace> Import mode (default: merge). merge upserts by ID:\n same ID \u2192 entry is updated in place (credentials\n preserved when the import has placeholders), new ID\n \u2192 added; nothing is deleted. replace wipes the store\n and takes the import wholesale\n --dry-run Preview only \u2014 show what \\`sync\\` would change, write nothing\n --help, -h Show this help\n --version, -v Show version\n\nEXAMPLES\n ccp list presets\n ccp switch dev # set preset for the current workspace (default)\n ccp switch bedrock-prod --global # set global preset (affects all workspaces)\n ccp switch --inherit # current workspace inherits global again\n ccp apply # reprovision the current project's config\n ccp sync # re-apply every workspace after editing a preset\n ccp sync --dry-run # preview what sync would rewrite\n ccp export -o presets.json\n cat presets.json | ccp import - --mode replace\n`;\n\nfunction fail(msg: string): never {\n process.stderr.write(`error: ${msg}\\n`);\n process.exit(1);\n}\n\nfunction providerName(store: ProfileStore, providerId: string): string {\n return store.providers.find(p => p.id === providerId)?.name ?? '(unknown provider)';\n}\n\nfunction describeScope(store: ProfileStore, scope: ScopeAssignment | undefined): string {\n if (!scope) { return 'not set'; }\n if (scope.mode === 'manual') { return 'manual (CLI/GUI leave files alone)'; }\n if (scope.mode === 'inherit') { return 'inherit from global'; }\n const preset = scope.presetId ? store.presets.find(p => p.id === scope.presetId) : undefined;\n return preset ? `${preset.name} \u2192 ${providerName(store, preset.providerId)}` : '(preset missing)';\n}\n\nfunction resolvePresetArg(store: ProfileStore, query: string | undefined): Preset {\n if (!query) { fail('a preset name or id is required'); }\n const preset = findPresetByNameOrId(store, query);\n if (!preset) {\n const names = store.presets.map(p => p.name).join(', ');\n fail(`no preset matching \"${query}\". Available: ${names || '(none)'}`);\n }\n return preset;\n}\n\n// ---------------------------------------------------------------------------\n\ntype Values = ReturnType<typeof parse>['values'];\n\nfunction parse(argv: string[]) {\n return parseArgs({\n args: argv,\n allowPositionals: true,\n options: {\n json: { type: 'boolean', default: false },\n global: { type: 'boolean', short: 'g', default: false },\n workspace: { type: 'boolean', short: 'w', default: false },\n path: { type: 'string' },\n inherit: { type: 'boolean', default: false },\n manual: { type: 'boolean', default: false },\n mode: { type: 'string' },\n 'dry-run': { type: 'boolean', default: false },\n out: { type: 'string', short: 'o' },\n 'no-scrub': { type: 'boolean', default: false },\n help: { type: 'boolean', short: 'h', default: false },\n version: { type: 'boolean', short: 'v', default: false },\n },\n });\n}\n\nfunction workspaceDir(values: Values): string {\n return values.path ? path.resolve(String(values.path)) : process.cwd();\n}\n\n// ---------------------------------------------------------------------------\n// Commands\n// ---------------------------------------------------------------------------\n\nfunction cmdList(store: ProfileStore, what: string | undefined, values: Values): void {\n const which = what ?? 'all';\n if (values.json) {\n const out: Record<string, unknown> = {};\n if (which === 'all' || which === 'presets') { out.presets = store.presets; }\n if (which === 'all' || which === 'providers') { out.providers = store.providers.map(p => ({ id: p.id, name: p.name, type: p.type })); }\n if (which === 'all' || which === 'scopes') { out.globalScope = store.globalScope; out.workspaceScopes = store.workspaceScopes; }\n process.stdout.write(JSON.stringify(out, null, 2) + '\\n');\n return;\n }\n\n if (which === 'all' || which === 'providers') {\n process.stdout.write('Providers:\\n');\n for (const p of store.providers) {\n process.stdout.write(` ${p.name} [${p.type}]\\n`);\n }\n process.stdout.write('\\n');\n }\n if (which === 'all' || which === 'presets') {\n process.stdout.write('Presets:\\n');\n for (const p of store.presets) {\n const bits = [`provider ${providerName(store, p.providerId)}`];\n if (p.mcpGroupIds.length) { bits.push(`${p.mcpGroupIds.length} MCP group(s)`); }\n if (p.directoryGroupIds.length) { bits.push(`${p.directoryGroupIds.length} dir group(s)`); }\n process.stdout.write(` ${p.name} \u2014 ${bits.join(' \u00B7 ')}\\n`);\n }\n process.stdout.write('\\n');\n }\n if (which === 'all' || which === 'scopes') {\n process.stdout.write('Scopes:\\n');\n process.stdout.write(` global: ${describeScope(store, store.globalScope)}\\n`);\n for (const [ws, scope] of Object.entries(store.workspaceScopes)) {\n process.stdout.write(` ${ws}: ${describeScope(store, scope)}\\n`);\n }\n }\n}\n\nfunction cmdCurrent(store: ProfileStore, values: Values): void {\n const ws = workspaceDir(values);\n const wsScope = store.workspaceScopes[ws];\n if (values.json) {\n process.stdout.write(JSON.stringify({\n global: store.globalScope,\n workspace: { path: ws, scope: wsScope ?? null },\n }, null, 2) + '\\n');\n return;\n }\n process.stdout.write(`global: ${describeScope(store, store.globalScope)}\\n`);\n process.stdout.write(`workspace: ${describeScope(store, wsScope)} (${ws})\\n`);\n}\n\nfunction cmdSwitch(store: ProfileStore, presetArg: string | undefined, values: Values): void {\n const toGlobal = values.global && !values.workspace && values.path === undefined && !values.inherit && !values.manual;\n\n if (!toGlobal) {\n const ws = workspaceDir(values);\n let scope: ScopeAssignment;\n let summary: string;\n if (values.inherit) {\n scope = { mode: 'inherit' };\n summary = 'inherit from global';\n } else if (values.manual) {\n scope = { mode: 'manual' };\n summary = 'manual';\n } else {\n const preset = resolvePresetArg(store, presetArg);\n scope = { mode: 'preset', presetId: preset.id };\n summary = `${preset.name} \u2192 ${providerName(store, preset.providerId)}`;\n }\n store.workspaceScopes[ws] = scope;\n writeProfileStore(store);\n ensureOnboardingComplete();\n applyAllScopes(store, ws);\n process.stdout.write(`workspace (${ws}): ${summary}\\n`);\n return;\n }\n\n // Global (explicit --global only)\n const preset = resolvePresetArg(store, presetArg);\n store.globalScope = { mode: 'preset', presetId: preset.id };\n writeProfileStore(store);\n ensureOnboardingComplete();\n applyAllScopes(store, undefined);\n process.stdout.write(`global: ${preset.name} \u2192 ${providerName(store, preset.providerId)}\\n`);\n}\n\nfunction cmdApply(store: ProfileStore, values: Values): void {\n const ws = workspaceDir(values);\n ensureOnboardingComplete();\n applyAllScopes(store, ws);\n process.stdout.write(`applied \u2014 global: ${describeScope(store, store.globalScope)}\\n`);\n process.stdout.write(` workspace (${ws}): ${describeScope(store, store.workspaceScopes[ws])}\\n`);\n}\n\nfunction cmdSync(store: ProfileStore, values: Values): void {\n const dryRun = Boolean(values['dry-run']);\n\n if (!dryRun) {\n store.mcpOwnership ??= {};\n store.mcpOwnership.workspaces ??= {};\n }\n const ownership = store.mcpOwnership;\n\n // Global scope\n if (store.globalScope.mode === 'preset' && store.globalScope.presetId) {\n const resolved = resolvePreset(store, store.globalScope.presetId);\n if (!resolved) {\n process.stderr.write(`global: preset missing \u2014 skipped\\n`);\n } else {\n if (!dryRun) {\n ensureOnboardingComplete();\n ownership!.global = applyGlobalConfig(resolved, ownership!.global);\n }\n process.stdout.write(`${dryRun ? 'would apply' : 'applied'} global: ${describeScope(store, store.globalScope)}\\n`);\n }\n } else {\n process.stdout.write(`(skip) global: ${describeScope(store, store.globalScope)}\\n`);\n }\n\n const entries = Object.entries(store.workspaceScopes);\n if (entries.length === 0) {\n if (!dryRun) { writeProfileStore(store); }\n process.stdout.write('no workspace assignments to sync.\\n');\n return;\n }\n\n let applied = 0;\n let skipped = 0;\n let missing = 0;\n\n for (const [ws, scope] of entries) {\n const desc = describeScope(store, scope);\n\n if (!fs.existsSync(ws)) {\n process.stderr.write(`(missing) ${ws}: ${desc}\\n`);\n missing++;\n continue;\n }\n if (scope.mode === 'manual') {\n process.stdout.write(`(manual) ${ws}: left untouched\\n`);\n skipped++;\n continue;\n }\n if (scope.mode === 'inherit') {\n if (!dryRun) {\n cleanProjectConfig(ws, ownership!.workspaces![ws] ?? []);\n delete ownership!.workspaces![ws];\n }\n process.stdout.write(`${dryRun ? 'would clear' : 'cleared '} ${ws}: inherit from global\\n`);\n applied++;\n continue;\n }\n // preset\n const resolved = scope.presetId ? resolvePreset(store, scope.presetId) : null;\n if (!resolved) {\n process.stderr.write(`(skip) ${ws}: preset missing\\n`);\n skipped++;\n continue;\n }\n if (!dryRun) {\n ownership!.workspaces![ws] = applyProjectConfig(resolved, ws, ownership!.workspaces![ws] ?? []);\n }\n process.stdout.write(`${dryRun ? 'would apply' : 'applied '} ${ws}: ${desc}\\n`);\n applied++;\n }\n\n if (!dryRun) { writeProfileStore(store); }\n\n const verb = dryRun ? 'would sync' : 'synced';\n process.stdout.write(\n `\\n${verb} ${applied} workspace(s)` +\n (skipped ? `, ${skipped} skipped` : '') +\n (missing ? `, ${missing} with missing directory` : '') +\n '.\\n'\n );\n}\n\nfunction cmdExport(store: ProfileStore, values: Values): void {\n const out = values['no-scrub'] ? store : scrubStore(store);\n const content = JSON.stringify(out, null, 2) + '\\n';\n if (values.out) {\n fs.writeFileSync(String(values.out), content, 'utf8');\n process.stderr.write(`exported to ${values.out}\\n`);\n } else {\n process.stdout.write(content);\n }\n if (!values['no-scrub'] && content.includes(PLACEHOLDER)) {\n process.stderr.write(`note: credentials were replaced with ${PLACEHOLDER} \u2014 recipients must fill in their own.\\n`);\n }\n}\n\nfunction cmdImport(src: string | undefined, values: Values): void {\n if (!src) { fail('import requires a file path or \"-\" for stdin'); }\n let raw: string;\n try {\n raw = src === '-' ? fs.readFileSync(0, 'utf8') : fs.readFileSync(src, 'utf8');\n } catch (err) {\n fail(`cannot read ${src}: ${err instanceof Error ? err.message : String(err)}`);\n }\n\n let incoming: ProfileStore;\n try {\n incoming = parseIncomingStore(raw);\n } catch (err) {\n fail(`import failed: ${err instanceof Error ? err.message : String(err)}`);\n }\n\n const mode = String(values.mode ?? 'merge');\n if (mode !== 'merge' && mode !== 'replace') { fail(`--mode must be \"merge\" or \"replace\"`); }\n\n if (mode === 'replace') {\n const store = ensureDefaults(incoming);\n writeProfileStore(store);\n process.stdout.write('presets replaced from import.\\n');\n return;\n }\n\n const result = { added: 0, updated: 0 };\n const store = mergeIncomingStore(readProfileStore(), incoming, result);\n writeProfileStore(store);\n process.stdout.write(\n `merged: ${result.added} added, ${result.updated} updated ` +\n `(${incoming.presets.length} preset(s), ${incoming.providers.length} provider(s), ` +\n `${incoming.mcpGroups.length} MCP group(s), ${incoming.directoryGroups.length} directory group(s) in import).\\n`\n );\n const placeholders = providersNeedingCredentials(store);\n if (placeholders.length > 0) {\n process.stderr.write(`note: these providers have placeholder credentials to replace: ${placeholders.join(', ')}\\n`);\n }\n}\n\n// ---------------------------------------------------------------------------\n\nfunction main(): void {\n let parsed: ReturnType<typeof parse>;\n try {\n parsed = parse(process.argv.slice(2));\n } catch (err) {\n fail(err instanceof Error ? err.message : String(err));\n }\n const { values, positionals } = parsed;\n\n if (values.version) { process.stdout.write(`${VERSION}\\n`); return; }\n\n const command = positionals[0];\n if (!command || values.help) { process.stdout.write(HELP); return; }\n\n const store = readProfileStore();\n\n switch (command) {\n case 'list': cmdList(store, positionals[1], values); break;\n case 'current': cmdCurrent(store, values); break;\n case 'switch': cmdSwitch(store, positionals[1], values); break;\n case 'apply': cmdApply(store, values); break;\n case 'sync': cmdSync(store, values); break;\n case 'export': cmdExport(store, values); break;\n case 'import': cmdImport(positionals[1], values); break;\n case 'help': process.stdout.write(HELP); break;\n default: fail(`unknown command \"${command}\". Run \\`ccp --help\\`.`);\n }\n}\n\nmain();\n"],
5
+ "mappings": "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",
6
6
  "names": ["exports", "exports", "ensureDefaults", "readProfileStore", "findPresetByNameOrId", "writeProfileStore", "fs", "path", "exports", "fs", "path", "exports", "fs", "path", "exports", "ensureOnboardingComplete", "fs", "path", "exports", "fs", "path", "exports", "exports", "resolvePreset", "applyGlobalConfig", "cleanProjectConfig", "applyProjectConfig", "applyAllScopes", "fs", "path", "exports", "scrubStore", "providersNeedingCredentials", "parseIncomingStore", "mergeIncomingStore", "exports", "exports", "module", "preset", "store"]
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@easytocloud/claude-personae",
3
- "version": "0.5.0",
3
+ "version": "0.8.0",
4
4
  "description": "CLI to switch Claude Code provider presets (AWS Bedrock / Anthropic / proxy) — companion to the Claude Code Personae VS Code extension. Operates on the same ~/.claude profile store.",
5
5
  "license": "MIT",
6
6
  "repository": {