@easytocloud/claude-personae 0.2.5 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +21 -2
- package/dist/cli.js +182 -47
- package/dist/cli.js.map +2 -2
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -38,6 +38,16 @@ ccp <command> [options]
|
|
|
38
38
|
| `ccp export` | Print the store as JSON with **credentials scrubbed** (`-o <file>` to write). |
|
|
39
39
|
| `ccp import <file\|->` | Import a store (`--mode merge` \| `replace`). `-` reads stdin. |
|
|
40
40
|
|
|
41
|
+
### Import modes
|
|
42
|
+
|
|
43
|
+
- **`--mode merge`** (default) — upserts by ID: entries whose UUID already exists
|
|
44
|
+
locally are **updated in place** (an update from the same original source);
|
|
45
|
+
unknown UUIDs are added. Re-importing the same export is idempotent — no
|
|
46
|
+
duplicates. Nothing is ever deleted by a merge. Your working credentials are
|
|
47
|
+
preserved when the import carries scrubbed `<REPLACE_ME>` placeholders; real
|
|
48
|
+
incoming values (including `op://` references) do overwrite.
|
|
49
|
+
- **`--mode replace`** — wipes the local store and takes the import wholesale.
|
|
50
|
+
|
|
41
51
|
### Scope (for `switch`)
|
|
42
52
|
|
|
43
53
|
By default `switch` sets the **current workspace** (CWD) preset — the smallest blast
|
|
@@ -70,8 +80,17 @@ cat presets.json | ccp import - --mode replace
|
|
|
70
80
|
|
|
71
81
|
- **Global scope** → `~/.claude/settings.json` (env vars, allowed directories,
|
|
72
82
|
`awsAuthRefresh`/`apiKeyHelper`) and `~/.claude.json` (MCP servers).
|
|
73
|
-
- **Workspace scope** → `<dir>/.claude/settings.json`
|
|
74
|
-
|
|
83
|
+
- **Workspace scope** → `<dir>/.claude/settings.json` (only the keys that differ
|
|
84
|
+
from global) and `~/.claude.json` → `projects["<dir>"].mcpServers` (Claude
|
|
85
|
+
Code's per-project "local" scope). `--inherit` removes these so global applies.
|
|
86
|
+
|
|
87
|
+
Nothing is written inside your repository except `.claude/settings.json` — MCP
|
|
88
|
+
servers never touch a shareable `.mcp.json`, so there is nothing MCP-related to
|
|
89
|
+
accidentally commit. Servers you add yourself (e.g. via `claude mcp add`) are
|
|
90
|
+
preserved: ccp tracks which server names it wrote and only ever replaces those.
|
|
91
|
+
If an earlier ccp version wrote servers into a workspace `.mcp.json`, the next
|
|
92
|
+
`apply`/`sync` migrates them out (servers added by you or your team under other
|
|
93
|
+
names are left alone).
|
|
75
94
|
|
|
76
95
|
Presets are resolved by the exact same engine as the extension, so a Bedrock preset
|
|
77
96
|
sets `CLAUDE_CODE_USE_BEDROCK=1`, `AWS_PROFILE`, `AWS_REGION`, the model overrides, etc.
|
package/dist/cli.js
CHANGED
|
@@ -563,6 +563,8 @@ var require_claudeJson = __commonJS({
|
|
|
563
563
|
exports2.readUserMcpServers = readUserMcpServers;
|
|
564
564
|
exports2.ensureOnboardingComplete = ensureOnboardingComplete2;
|
|
565
565
|
exports2.writeUserMcpServers = writeUserMcpServers;
|
|
566
|
+
exports2.writeProjectMcpServersToClaudeJson = writeProjectMcpServersToClaudeJson;
|
|
567
|
+
exports2.removeProjectMcpServersFromClaudeJson = removeProjectMcpServersFromClaudeJson;
|
|
566
568
|
var fs2 = __importStar(require("fs"));
|
|
567
569
|
var os = __importStar(require("os"));
|
|
568
570
|
var path2 = __importStar(require("path"));
|
|
@@ -597,11 +599,68 @@ var require_claudeJson = __commonJS({
|
|
|
597
599
|
const updated = { ...existing, hasCompletedOnboarding: true };
|
|
598
600
|
fs2.writeFileSync(filePath, JSON.stringify(updated, null, 2) + "\n", "utf8");
|
|
599
601
|
}
|
|
600
|
-
function
|
|
601
|
-
|
|
602
|
+
function writeClaudeJson(updated) {
|
|
603
|
+
fs2.writeFileSync(getClaudeJsonPath(), JSON.stringify(updated, null, 2) + "\n", "utf8");
|
|
604
|
+
}
|
|
605
|
+
function mergeOwned(existing, servers, previouslyOwned) {
|
|
606
|
+
const merged = { ...existing ?? {} };
|
|
607
|
+
for (const name of previouslyOwned) {
|
|
608
|
+
delete merged[name];
|
|
609
|
+
}
|
|
610
|
+
Object.assign(merged, servers);
|
|
611
|
+
return Object.keys(merged).length > 0 ? merged : void 0;
|
|
612
|
+
}
|
|
613
|
+
function writeUserMcpServers(servers, previouslyOwned = []) {
|
|
602
614
|
const existing = readClaudeJson();
|
|
603
|
-
const
|
|
604
|
-
|
|
615
|
+
const merged = mergeOwned(existing.mcpServers, servers, previouslyOwned);
|
|
616
|
+
const updated = { ...existing };
|
|
617
|
+
if (merged) {
|
|
618
|
+
updated.mcpServers = merged;
|
|
619
|
+
} else {
|
|
620
|
+
delete updated.mcpServers;
|
|
621
|
+
}
|
|
622
|
+
writeClaudeJson(updated);
|
|
623
|
+
return Object.keys(servers);
|
|
624
|
+
}
|
|
625
|
+
function writeProjectMcpServersToClaudeJson(workspaceRoot, servers, previouslyOwned = []) {
|
|
626
|
+
const existing = readClaudeJson();
|
|
627
|
+
const projects = { ...existing.projects ?? {} };
|
|
628
|
+
const entry = { ...projects[workspaceRoot] ?? {} };
|
|
629
|
+
const merged = mergeOwned(entry.mcpServers, servers, previouslyOwned);
|
|
630
|
+
if (merged) {
|
|
631
|
+
entry.mcpServers = merged;
|
|
632
|
+
} else {
|
|
633
|
+
delete entry.mcpServers;
|
|
634
|
+
}
|
|
635
|
+
if (Object.keys(entry).length > 0 || projects[workspaceRoot]) {
|
|
636
|
+
projects[workspaceRoot] = entry;
|
|
637
|
+
}
|
|
638
|
+
const updated = { ...existing };
|
|
639
|
+
if (Object.keys(projects).length > 0) {
|
|
640
|
+
updated.projects = projects;
|
|
641
|
+
}
|
|
642
|
+
writeClaudeJson(updated);
|
|
643
|
+
return Object.keys(servers);
|
|
644
|
+
}
|
|
645
|
+
function removeProjectMcpServersFromClaudeJson(workspaceRoot, ownedNames) {
|
|
646
|
+
if (ownedNames.length === 0) {
|
|
647
|
+
return;
|
|
648
|
+
}
|
|
649
|
+
const existing = readClaudeJson();
|
|
650
|
+
const entry = existing.projects?.[workspaceRoot];
|
|
651
|
+
if (!entry?.mcpServers) {
|
|
652
|
+
return;
|
|
653
|
+
}
|
|
654
|
+
const remaining = { ...entry.mcpServers };
|
|
655
|
+
for (const name of ownedNames) {
|
|
656
|
+
delete remaining[name];
|
|
657
|
+
}
|
|
658
|
+
if (Object.keys(remaining).length > 0) {
|
|
659
|
+
entry.mcpServers = remaining;
|
|
660
|
+
} else {
|
|
661
|
+
delete entry.mcpServers;
|
|
662
|
+
}
|
|
663
|
+
writeClaudeJson(existing);
|
|
605
664
|
}
|
|
606
665
|
}
|
|
607
666
|
});
|
|
@@ -650,7 +709,7 @@ var require_mcpJson = __commonJS({
|
|
|
650
709
|
Object.defineProperty(exports2, "__esModule", { value: true });
|
|
651
710
|
exports2.getMcpJsonPath = getMcpJsonPath;
|
|
652
711
|
exports2.readProjectMcpServers = readProjectMcpServers;
|
|
653
|
-
exports2.
|
|
712
|
+
exports2.cleanupLegacyMcpJson = cleanupLegacyMcpJson;
|
|
654
713
|
var fs2 = __importStar(require("fs"));
|
|
655
714
|
var path2 = __importStar(require("path"));
|
|
656
715
|
function getMcpJsonPath(workspaceRoot) {
|
|
@@ -675,15 +734,40 @@ var require_mcpJson = __commonJS({
|
|
|
675
734
|
function readProjectMcpServers(workspaceRoot) {
|
|
676
735
|
return readMcpJson(workspaceRoot).mcpServers ?? {};
|
|
677
736
|
}
|
|
678
|
-
function
|
|
679
|
-
|
|
680
|
-
if (!fs2.existsSync(dir)) {
|
|
737
|
+
function cleanupLegacyMcpJson(workspaceRoot, serverNames) {
|
|
738
|
+
if (serverNames.length === 0) {
|
|
681
739
|
return;
|
|
682
740
|
}
|
|
683
741
|
const filePath = getMcpJsonPath(workspaceRoot);
|
|
742
|
+
if (!fs2.existsSync(filePath)) {
|
|
743
|
+
return;
|
|
744
|
+
}
|
|
684
745
|
const existing = readMcpJson(workspaceRoot);
|
|
685
|
-
|
|
686
|
-
|
|
746
|
+
if (!existing.mcpServers) {
|
|
747
|
+
return;
|
|
748
|
+
}
|
|
749
|
+
const remaining = { ...existing.mcpServers };
|
|
750
|
+
let removed = false;
|
|
751
|
+
for (const name of serverNames) {
|
|
752
|
+
if (name in remaining) {
|
|
753
|
+
delete remaining[name];
|
|
754
|
+
removed = true;
|
|
755
|
+
}
|
|
756
|
+
}
|
|
757
|
+
if (!removed) {
|
|
758
|
+
return;
|
|
759
|
+
}
|
|
760
|
+
const updated = { ...existing };
|
|
761
|
+
if (Object.keys(remaining).length > 0) {
|
|
762
|
+
updated.mcpServers = remaining;
|
|
763
|
+
} else {
|
|
764
|
+
delete updated.mcpServers;
|
|
765
|
+
}
|
|
766
|
+
if (Object.keys(updated).length === 0) {
|
|
767
|
+
fs2.unlinkSync(filePath);
|
|
768
|
+
} else {
|
|
769
|
+
fs2.writeFileSync(filePath, JSON.stringify(updated, null, 2) + "\n", "utf8");
|
|
770
|
+
}
|
|
687
771
|
}
|
|
688
772
|
}
|
|
689
773
|
});
|
|
@@ -850,6 +934,7 @@ var require_resolver = __commonJS({
|
|
|
850
934
|
var claudeSettings_1 = require_claudeSettings();
|
|
851
935
|
var claudeJson_1 = require_claudeJson();
|
|
852
936
|
var mcpJson_1 = require_mcpJson();
|
|
937
|
+
var profiles_1 = require_profiles();
|
|
853
938
|
var knownProviders_1 = require_knownProviders();
|
|
854
939
|
function resolvePreset2(store, presetId) {
|
|
855
940
|
const preset = store.presets.find((p) => p.id === presetId);
|
|
@@ -1000,7 +1085,7 @@ var require_resolver = __commonJS({
|
|
|
1000
1085
|
}
|
|
1001
1086
|
return preserved;
|
|
1002
1087
|
}
|
|
1003
|
-
function applyGlobalConfig2(resolved) {
|
|
1088
|
+
function applyGlobalConfig2(resolved, previouslyOwned) {
|
|
1004
1089
|
const settings = (0, claudeSettings_1.readClaudeSettings)();
|
|
1005
1090
|
const preservedEnv = preserveUnmanagedEnv(settings.env ?? {});
|
|
1006
1091
|
const newSettings = {
|
|
@@ -1028,9 +1113,12 @@ var require_resolver = __commonJS({
|
|
|
1028
1113
|
delete newSettings.env["ANTHROPIC_SMALL_FAST_MODEL_AWS_REGION"];
|
|
1029
1114
|
}
|
|
1030
1115
|
(0, claudeSettings_1.writeClaudeSettings)(newSettings);
|
|
1031
|
-
(0, claudeJson_1.
|
|
1116
|
+
const owned = previouslyOwned ?? Object.keys((0, claudeJson_1.readUserMcpServers)());
|
|
1117
|
+
return (0, claudeJson_1.writeUserMcpServers)(resolved.mcpServers, owned);
|
|
1032
1118
|
}
|
|
1033
|
-
function cleanProjectConfig2(workspaceRoot) {
|
|
1119
|
+
function cleanProjectConfig2(workspaceRoot, ownedMcpNames = []) {
|
|
1120
|
+
(0, claudeJson_1.removeProjectMcpServersFromClaudeJson)(workspaceRoot, ownedMcpNames);
|
|
1121
|
+
(0, mcpJson_1.cleanupLegacyMcpJson)(workspaceRoot, ownedMcpNames);
|
|
1034
1122
|
const settings = (0, claudeSettings_1.readProjectSettings)(workspaceRoot);
|
|
1035
1123
|
if (Object.keys(settings).length === 0) {
|
|
1036
1124
|
return;
|
|
@@ -1056,7 +1144,7 @@ var require_resolver = __commonJS({
|
|
|
1056
1144
|
}
|
|
1057
1145
|
}
|
|
1058
1146
|
}
|
|
1059
|
-
function applyProjectConfig2(resolved, workspaceRoot) {
|
|
1147
|
+
function applyProjectConfig2(resolved, workspaceRoot, previouslyOwned = []) {
|
|
1060
1148
|
const globalEnv = (0, claudeSettings_1.readClaudeSettings)().env ?? {};
|
|
1061
1149
|
const settings = (0, claudeSettings_1.readProjectSettings)(workspaceRoot);
|
|
1062
1150
|
const preservedEnv = preserveUnmanagedEnv(settings.env ?? {});
|
|
@@ -1080,31 +1168,41 @@ var require_resolver = __commonJS({
|
|
|
1080
1168
|
delete newSettings.apiKeyHelper;
|
|
1081
1169
|
}
|
|
1082
1170
|
(0, claudeSettings_1.writeProjectSettings)(workspaceRoot, newSettings);
|
|
1083
|
-
(0,
|
|
1171
|
+
const owned = (0, claudeJson_1.writeProjectMcpServersToClaudeJson)(workspaceRoot, resolved.mcpServers, previouslyOwned);
|
|
1172
|
+
(0, mcpJson_1.cleanupLegacyMcpJson)(workspaceRoot, [.../* @__PURE__ */ new Set([...previouslyOwned, ...owned])]);
|
|
1084
1173
|
ensureVscodeignore(workspaceRoot);
|
|
1174
|
+
return owned;
|
|
1085
1175
|
}
|
|
1086
1176
|
function applyAllScopes2(store, workspaceRoot) {
|
|
1087
1177
|
(0, claudeJson_1.ensureOnboardingComplete)();
|
|
1178
|
+
const before = JSON.stringify(store.mcpOwnership ?? {});
|
|
1179
|
+
store.mcpOwnership ??= {};
|
|
1180
|
+
store.mcpOwnership.workspaces ??= {};
|
|
1088
1181
|
if (store.globalScope.mode === "preset" && store.globalScope.presetId) {
|
|
1089
1182
|
const resolved = resolvePreset2(store, store.globalScope.presetId);
|
|
1090
1183
|
if (resolved) {
|
|
1091
|
-
applyGlobalConfig2(resolved);
|
|
1184
|
+
store.mcpOwnership.global = applyGlobalConfig2(resolved, store.mcpOwnership.global);
|
|
1092
1185
|
}
|
|
1093
1186
|
}
|
|
1094
1187
|
if (workspaceRoot) {
|
|
1095
1188
|
const wsScope = store.workspaceScopes[workspaceRoot];
|
|
1096
1189
|
if (wsScope) {
|
|
1190
|
+
const owned = store.mcpOwnership.workspaces[workspaceRoot] ?? [];
|
|
1097
1191
|
if (wsScope.mode === "preset" && wsScope.presetId) {
|
|
1098
1192
|
const resolved = resolvePreset2(store, wsScope.presetId);
|
|
1099
1193
|
if (resolved) {
|
|
1100
|
-
applyProjectConfig2(resolved, workspaceRoot);
|
|
1194
|
+
store.mcpOwnership.workspaces[workspaceRoot] = applyProjectConfig2(resolved, workspaceRoot, owned);
|
|
1101
1195
|
}
|
|
1102
1196
|
}
|
|
1103
1197
|
if (wsScope.mode === "inherit") {
|
|
1104
|
-
cleanProjectConfig2(workspaceRoot);
|
|
1198
|
+
cleanProjectConfig2(workspaceRoot, owned);
|
|
1199
|
+
delete store.mcpOwnership.workspaces[workspaceRoot];
|
|
1105
1200
|
}
|
|
1106
1201
|
}
|
|
1107
1202
|
}
|
|
1203
|
+
if (JSON.stringify(store.mcpOwnership) !== before) {
|
|
1204
|
+
(0, profiles_1.writeProfileStore)(store);
|
|
1205
|
+
}
|
|
1108
1206
|
}
|
|
1109
1207
|
var VSCODEIGNORE_ENTRIES = [".mcp.json", ".claude/"];
|
|
1110
1208
|
function ensureVscodeignore(workspaceRoot) {
|
|
@@ -1141,7 +1239,6 @@ var require_transfer = __commonJS({
|
|
|
1141
1239
|
exports2.providersNeedingCredentials = providersNeedingCredentials2;
|
|
1142
1240
|
exports2.parseIncomingStore = parseIncomingStore2;
|
|
1143
1241
|
exports2.mergeIncomingStore = mergeIncomingStore2;
|
|
1144
|
-
var profiles_1 = require_profiles();
|
|
1145
1242
|
var CREDENTIAL_PATTERNS = [
|
|
1146
1243
|
/sk-ant-[a-zA-Z0-9_-]{20,}/g,
|
|
1147
1244
|
/sk-or-[a-zA-Z0-9_-]{20,}/g,
|
|
@@ -1195,10 +1292,12 @@ var require_transfer = __commonJS({
|
|
|
1195
1292
|
};
|
|
1196
1293
|
}
|
|
1197
1294
|
function scrubStore2(store) {
|
|
1198
|
-
|
|
1295
|
+
const scrubbed = {
|
|
1199
1296
|
...store,
|
|
1200
1297
|
providers: store.providers.map(scrubProvider)
|
|
1201
1298
|
};
|
|
1299
|
+
delete scrubbed.mcpOwnership;
|
|
1300
|
+
return scrubbed;
|
|
1202
1301
|
}
|
|
1203
1302
|
function providersNeedingCredentials2(store) {
|
|
1204
1303
|
return store.providers.filter((p) => p.anthropicApiKey === exports2.PLACEHOLDER || p.proxyCredential === exports2.PLACEHOLDER || p.proxyApiKey === exports2.PLACEHOLDER || p.proxyAuthToken === exports2.PLACEHOLDER).map((p) => p.name);
|
|
@@ -1210,32 +1309,47 @@ var require_transfer = __commonJS({
|
|
|
1210
1309
|
}
|
|
1211
1310
|
return incoming;
|
|
1212
1311
|
}
|
|
1213
|
-
function
|
|
1214
|
-
const
|
|
1312
|
+
function upsertById(list, incoming) {
|
|
1313
|
+
const idx = list.findIndex((e) => e.id === incoming.id);
|
|
1314
|
+
if (idx >= 0) {
|
|
1315
|
+
list[idx] = incoming;
|
|
1316
|
+
return "updated";
|
|
1317
|
+
}
|
|
1318
|
+
list.push(incoming);
|
|
1319
|
+
return "added";
|
|
1320
|
+
}
|
|
1321
|
+
function preserveCredential(incoming, existing) {
|
|
1322
|
+
if (incoming === exports2.PLACEHOLDER || incoming === void 0 || incoming === "") {
|
|
1323
|
+
return existing ?? incoming;
|
|
1324
|
+
}
|
|
1325
|
+
return incoming;
|
|
1326
|
+
}
|
|
1327
|
+
function mergeIncomingStore2(base, incoming, result) {
|
|
1328
|
+
const tally = { added: 0, updated: 0 };
|
|
1329
|
+
const count = (outcome) => {
|
|
1330
|
+
tally[outcome]++;
|
|
1331
|
+
};
|
|
1215
1332
|
for (const provider of incoming.providers) {
|
|
1216
|
-
const
|
|
1217
|
-
|
|
1218
|
-
|
|
1333
|
+
const existing = base.providers.find((p) => p.id === provider.id);
|
|
1334
|
+
count(upsertById(base.providers, {
|
|
1335
|
+
...provider,
|
|
1336
|
+
anthropicApiKey: preserveCredential(provider.anthropicApiKey, existing?.anthropicApiKey),
|
|
1337
|
+
proxyCredential: preserveCredential(provider.proxyCredential, existing?.proxyCredential),
|
|
1338
|
+
proxyApiKey: preserveCredential(provider.proxyApiKey, existing?.proxyApiKey),
|
|
1339
|
+
proxyAuthToken: preserveCredential(provider.proxyAuthToken, existing?.proxyAuthToken)
|
|
1340
|
+
}));
|
|
1219
1341
|
}
|
|
1220
1342
|
for (const group of incoming.mcpGroups) {
|
|
1221
|
-
|
|
1222
|
-
idMap.set(group.id, newId);
|
|
1223
|
-
base.mcpGroups.push({ ...group, id: newId });
|
|
1343
|
+
count(upsertById(base.mcpGroups, group));
|
|
1224
1344
|
}
|
|
1225
1345
|
for (const group of incoming.directoryGroups) {
|
|
1226
|
-
|
|
1227
|
-
idMap.set(group.id, newId);
|
|
1228
|
-
base.directoryGroups.push({ ...group, id: newId });
|
|
1346
|
+
count(upsertById(base.directoryGroups, group));
|
|
1229
1347
|
}
|
|
1230
1348
|
for (const preset of incoming.presets) {
|
|
1231
|
-
|
|
1232
|
-
|
|
1233
|
-
|
|
1234
|
-
|
|
1235
|
-
providerId: idMap.get(preset.providerId) ?? preset.providerId,
|
|
1236
|
-
mcpGroupIds: preset.mcpGroupIds.map((id) => idMap.get(id) ?? id),
|
|
1237
|
-
directoryGroupIds: preset.directoryGroupIds.map((id) => idMap.get(id) ?? id)
|
|
1238
|
-
});
|
|
1349
|
+
count(upsertById(base.presets, preset));
|
|
1350
|
+
}
|
|
1351
|
+
if (result) {
|
|
1352
|
+
Object.assign(result, tally);
|
|
1239
1353
|
}
|
|
1240
1354
|
return base;
|
|
1241
1355
|
}
|
|
@@ -1281,7 +1395,7 @@ var require_package = __commonJS({
|
|
|
1281
1395
|
"package.json"(exports2, module2) {
|
|
1282
1396
|
module2.exports = {
|
|
1283
1397
|
name: "@easytocloud/claude-personae",
|
|
1284
|
-
version: "0.
|
|
1398
|
+
version: "0.5.0",
|
|
1285
1399
|
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.",
|
|
1286
1400
|
license: "MIT",
|
|
1287
1401
|
repository: {
|
|
@@ -1349,7 +1463,11 @@ COMMANDS
|
|
|
1349
1463
|
current Show the active global + workspace preset
|
|
1350
1464
|
switch <preset> [scope] Set the active preset and apply it
|
|
1351
1465
|
apply Re-apply the global + current-workspace scopes
|
|
1352
|
-
sync Re-
|
|
1466
|
+
sync Re-align all config with the profile store:
|
|
1467
|
+
global + EVERY known workspace assignment.
|
|
1468
|
+
MCP servers are written to ~/.claude.json;
|
|
1469
|
+
entries we once wrote to .mcp.json are
|
|
1470
|
+
migrated out (other servers left alone)
|
|
1353
1471
|
export Print the store as JSON (credentials scrubbed)
|
|
1354
1472
|
import <file|-> Import a store from a file or stdin
|
|
1355
1473
|
|
|
@@ -1364,7 +1482,11 @@ OPTIONS
|
|
|
1364
1482
|
--json Machine-readable JSON output (list, current)
|
|
1365
1483
|
--out, -o <file> Write export to a file instead of stdout
|
|
1366
1484
|
--no-scrub Export without scrubbing credentials (dangerous)
|
|
1367
|
-
--mode <merge|replace> Import mode (default: merge)
|
|
1485
|
+
--mode <merge|replace> Import mode (default: merge). merge upserts by ID:
|
|
1486
|
+
same ID \u2192 entry is updated in place (credentials
|
|
1487
|
+
preserved when the import has placeholders), new ID
|
|
1488
|
+
\u2192 added; nothing is deleted. replace wipes the store
|
|
1489
|
+
and takes the import wholesale
|
|
1368
1490
|
--dry-run Preview only \u2014 show what \`sync\` would change, write nothing
|
|
1369
1491
|
--help, -h Show this help
|
|
1370
1492
|
--version, -v Show version
|
|
@@ -1544,6 +1666,11 @@ function cmdApply(store, values) {
|
|
|
1544
1666
|
}
|
|
1545
1667
|
function cmdSync(store, values) {
|
|
1546
1668
|
const dryRun = Boolean(values["dry-run"]);
|
|
1669
|
+
if (!dryRun) {
|
|
1670
|
+
store.mcpOwnership ??= {};
|
|
1671
|
+
store.mcpOwnership.workspaces ??= {};
|
|
1672
|
+
}
|
|
1673
|
+
const ownership = store.mcpOwnership;
|
|
1547
1674
|
if (store.globalScope.mode === "preset" && store.globalScope.presetId) {
|
|
1548
1675
|
const resolved = (0, import_claude_personae_core.resolvePreset)(store, store.globalScope.presetId);
|
|
1549
1676
|
if (!resolved) {
|
|
@@ -1552,7 +1679,7 @@ function cmdSync(store, values) {
|
|
|
1552
1679
|
} else {
|
|
1553
1680
|
if (!dryRun) {
|
|
1554
1681
|
(0, import_claude_personae_core.ensureOnboardingComplete)();
|
|
1555
|
-
(0, import_claude_personae_core.applyGlobalConfig)(resolved);
|
|
1682
|
+
ownership.global = (0, import_claude_personae_core.applyGlobalConfig)(resolved, ownership.global);
|
|
1556
1683
|
}
|
|
1557
1684
|
process.stdout.write(`${dryRun ? "would apply" : "applied"} global: ${describeScope(store, store.globalScope)}
|
|
1558
1685
|
`);
|
|
@@ -1563,6 +1690,9 @@ function cmdSync(store, values) {
|
|
|
1563
1690
|
}
|
|
1564
1691
|
const entries = Object.entries(store.workspaceScopes);
|
|
1565
1692
|
if (entries.length === 0) {
|
|
1693
|
+
if (!dryRun) {
|
|
1694
|
+
(0, import_claude_personae_core.writeProfileStore)(store);
|
|
1695
|
+
}
|
|
1566
1696
|
process.stdout.write("no workspace assignments to sync.\n");
|
|
1567
1697
|
return;
|
|
1568
1698
|
}
|
|
@@ -1585,7 +1715,8 @@ function cmdSync(store, values) {
|
|
|
1585
1715
|
}
|
|
1586
1716
|
if (scope.mode === "inherit") {
|
|
1587
1717
|
if (!dryRun) {
|
|
1588
|
-
(0, import_claude_personae_core.cleanProjectConfig)(ws);
|
|
1718
|
+
(0, import_claude_personae_core.cleanProjectConfig)(ws, ownership.workspaces[ws] ?? []);
|
|
1719
|
+
delete ownership.workspaces[ws];
|
|
1589
1720
|
}
|
|
1590
1721
|
process.stdout.write(`${dryRun ? "would clear" : "cleared "} ${ws}: inherit from global
|
|
1591
1722
|
`);
|
|
@@ -1600,12 +1731,15 @@ function cmdSync(store, values) {
|
|
|
1600
1731
|
continue;
|
|
1601
1732
|
}
|
|
1602
1733
|
if (!dryRun) {
|
|
1603
|
-
(0, import_claude_personae_core.applyProjectConfig)(resolved, ws);
|
|
1734
|
+
ownership.workspaces[ws] = (0, import_claude_personae_core.applyProjectConfig)(resolved, ws, ownership.workspaces[ws] ?? []);
|
|
1604
1735
|
}
|
|
1605
1736
|
process.stdout.write(`${dryRun ? "would apply" : "applied "} ${ws}: ${desc}
|
|
1606
1737
|
`);
|
|
1607
1738
|
applied++;
|
|
1608
1739
|
}
|
|
1740
|
+
if (!dryRun) {
|
|
1741
|
+
(0, import_claude_personae_core.writeProfileStore)(store);
|
|
1742
|
+
}
|
|
1609
1743
|
const verb = dryRun ? "would sync" : "synced";
|
|
1610
1744
|
process.stdout.write(
|
|
1611
1745
|
`
|
|
@@ -1653,10 +1787,11 @@ function cmdImport(src, values) {
|
|
|
1653
1787
|
process.stdout.write("presets replaced from import.\n");
|
|
1654
1788
|
return;
|
|
1655
1789
|
}
|
|
1656
|
-
const
|
|
1790
|
+
const result = { added: 0, updated: 0 };
|
|
1791
|
+
const store = (0, import_claude_personae_core.mergeIncomingStore)((0, import_claude_personae_core.readProfileStore)(), incoming, result);
|
|
1657
1792
|
(0, import_claude_personae_core.writeProfileStore)(store);
|
|
1658
1793
|
process.stdout.write(
|
|
1659
|
-
`
|
|
1794
|
+
`merged: ${result.added} added, ${result.updated} updated (${incoming.presets.length} preset(s), ${incoming.providers.length} provider(s), ${incoming.mcpGroups.length} MCP group(s), ${incoming.directoryGroups.length} directory group(s) in import).
|
|
1660
1795
|
`
|
|
1661
1796
|
);
|
|
1662
1797
|
const placeholders = (0, import_claude_personae_core.providersNeedingCredentials)(store);
|
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/** Opaque shape of ~/.claude.json \u2014 we only touch the mcpServers key. */\ninterface ClaudeJson {\n mcpServers?: Record<string, McpServerConfig>;\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\n/** Writes (only) the mcpServers key into ~/.claude.json, preserving all other keys. */\nexport function writeUserMcpServers(servers: Record<string, McpServerConfig>): void {\n const filePath = getClaudeJsonPath();\n const existing = readClaudeJson();\n const updated: ClaudeJson = { ...existing, mcpServers: servers };\n fs.writeFileSync(filePath, JSON.stringify(updated, null, 2) + '\\n', 'utf8');\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/** Writes (only) the mcpServers key into {workspaceRoot}/.mcp.json, preserving other keys. */\nexport function writeProjectMcpServers(workspaceRoot: string, servers: Record<string, McpServerConfig>): void {\n const dir = workspaceRoot;\n if (!fs.existsSync(dir)) { return; }\n const filePath = getMcpJsonPath(workspaceRoot);\n const existing = readMcpJson(workspaceRoot);\n const updated: McpJson = { ...existing, mcpServers: servers };\n fs.writeFileSync(filePath, JSON.stringify(updated, null, 2) + '\\n', 'utf8');\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 { writeUserMcpServers, ensureOnboardingComplete } from './claudeJson';\nimport { writeProjectMcpServers } from './mcpJson';\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\n */\nexport function applyGlobalConfig(resolved: ResolvedConfig): void {\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 writeUserMcpServers(resolved.mcpServers);\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.\n */\nexport function cleanProjectConfig(workspaceRoot: string): void {\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 {workspace}/.mcp.json\n */\nexport function applyProjectConfig(\n resolved: ResolvedConfig,\n workspaceRoot: string\n): void {\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 // Write MCP servers to .mcp.json\n writeProjectMcpServers(workspaceRoot, resolved.mcpServers);\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\n/**\n * Resolve and apply the active scope assignments from the store.\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 // Global scope\n if (store.globalScope.mode === 'preset' && store.globalScope.presetId) {\n const resolved = resolvePreset(store, store.globalScope.presetId);\n if (resolved) {\n applyGlobalConfig(resolved);\n }\n }\n\n // Workspace scope\n if (workspaceRoot) {\n const wsScope = store.workspaceScopes[workspaceRoot];\n if (wsScope) {\n if (wsScope.mode === 'preset' && wsScope.presetId) {\n const resolved = resolvePreset(store, wsScope.presetId);\n if (resolved) {\n applyProjectConfig(resolved, workspaceRoot);\n }\n }\n if (wsScope.mode === 'inherit') {\n cleanProjectConfig(workspaceRoot);\n }\n // 'manual' mode: user manages files themselves\n }\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';\nimport { generateId } from './profiles';\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 return {\n ...store,\n providers: store.providers.map(scrubProvider),\n };\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/**\n * Merge an incoming store into a base store, re-generating all IDs to avoid\n * collisions and remapping preset \u2192 provider/group references. Mutates and\n * returns `base`.\n */\nexport function mergeIncomingStore(base: ProfileStore, incoming: ProfileStore): ProfileStore {\n const idMap = new Map<string, string>(); // old ID \u2192 new ID\n\n for (const provider of incoming.providers) {\n const newId = generateId();\n idMap.set(provider.id, newId);\n base.providers.push({ ...provider, id: newId });\n }\n\n for (const group of incoming.mcpGroups) {\n const newId = generateId();\n idMap.set(group.id, newId);\n base.mcpGroups.push({ ...group, id: newId });\n }\n\n for (const group of incoming.directoryGroups) {\n const newId = generateId();\n idMap.set(group.id, newId);\n base.directoryGroups.push({ ...group, id: newId });\n }\n\n for (const preset of incoming.presets) {\n const newId = generateId();\n base.presets.push({\n ...preset,\n id: newId,\n providerId: idMap.get(preset.providerId) ?? preset.providerId,\n mcpGroupIds: preset.mcpGroupIds.map(id => idMap.get(id) ?? id),\n directoryGroupIds: preset.directoryGroupIds.map(id => idMap.get(id) ?? id),\n });\n }\n\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.2.5\",\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-apply EVERY known workspace assignment\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)\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 // 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) { ensureOnboardingComplete(); applyGlobalConfig(resolved); }\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 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) { cleanProjectConfig(ws); }\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) { applyProjectConfig(resolved, ws); }\n process.stdout.write(`${dryRun ? 'would apply' : 'applied '} ${ws}: ${desc}\\n`);\n applied++;\n }\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 store = mergeIncomingStore(readProfileStore(), incoming);\n writeProfileStore(store);\n process.stdout.write(\n `imported ${incoming.presets.length} preset(s), ${incoming.providers.length} provider(s), ` +\n `${incoming.mcpGroups.length} MCP group(s), ${incoming.directoryGroups.length} directory group(s).\\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 /** 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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",
|
|
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.
|
|
3
|
+
"version": "0.5.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": {
|