@easytocloud/claude-personae 0.1.0 → 0.2.1
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 +6 -3
- package/dist/cli.js +98 -21
- package/dist/cli.js.map +3 -3
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -12,7 +12,7 @@ devcontainer, or from a script.
|
|
|
12
12
|
|
|
13
13
|
> **Authoring stays in the GUI.** Create and edit providers, presets, MCP groups and
|
|
14
14
|
> directory groups in the VS Code extension. This CLI is for the *operate* verbs:
|
|
15
|
-
> switch, apply, list, current, export, import.
|
|
15
|
+
> switch, apply, sync, list, current, export, import.
|
|
16
16
|
|
|
17
17
|
## Install
|
|
18
18
|
|
|
@@ -33,7 +33,8 @@ ccp <command> [options]
|
|
|
33
33
|
| `ccp list [presets\|providers\|scopes]` | List configured items (default: all). `--json` for machine output. |
|
|
34
34
|
| `ccp current` | Show the active global + workspace preset. |
|
|
35
35
|
| `ccp switch <preset> [scope]` | Set the active preset and write the config files. |
|
|
36
|
-
| `ccp apply` | Re-apply the
|
|
36
|
+
| `ccp apply` | Re-apply the global + current-workspace scopes (reprovision a machine / fresh checkout). |
|
|
37
|
+
| `ccp sync` | Re-apply **every** known workspace assignment — propagate a changed preset everywhere. `--dry-run` previews without writing. |
|
|
37
38
|
| `ccp export` | Print the store as JSON with **credentials scrubbed** (`-o <file>` to write). |
|
|
38
39
|
| `ccp import <file\|->` | Import a store (`--mode merge` \| `replace`). `-` reads stdin. |
|
|
39
40
|
|
|
@@ -56,7 +57,9 @@ ccp list presets
|
|
|
56
57
|
ccp switch bedrock-prod # set the global preset
|
|
57
58
|
ccp switch dev --workspace # set a preset for the current project
|
|
58
59
|
ccp switch --workspace --inherit # project goes back to inheriting global
|
|
59
|
-
ccp apply # rewrite config files
|
|
60
|
+
ccp apply # rewrite config files for this project
|
|
61
|
+
ccp sync # re-apply every workspace after editing a preset
|
|
62
|
+
ccp sync --dry-run # preview what sync would rewrite
|
|
60
63
|
ccp export -o presets.json # share presets (keys replaced with <REPLACE_ME>)
|
|
61
64
|
cat presets.json | ccp import - --mode replace
|
|
62
65
|
```
|
package/dist/cli.js
CHANGED
|
@@ -730,10 +730,10 @@ var require_resolver = __commonJS({
|
|
|
730
730
|
};
|
|
731
731
|
})();
|
|
732
732
|
Object.defineProperty(exports2, "__esModule", { value: true });
|
|
733
|
-
exports2.resolvePreset =
|
|
734
|
-
exports2.applyGlobalConfig =
|
|
735
|
-
exports2.cleanProjectConfig =
|
|
736
|
-
exports2.applyProjectConfig =
|
|
733
|
+
exports2.resolvePreset = resolvePreset2;
|
|
734
|
+
exports2.applyGlobalConfig = applyGlobalConfig2;
|
|
735
|
+
exports2.cleanProjectConfig = cleanProjectConfig2;
|
|
736
|
+
exports2.applyProjectConfig = applyProjectConfig2;
|
|
737
737
|
exports2.applyAllScopes = applyAllScopes2;
|
|
738
738
|
var fs2 = __importStar(require("fs"));
|
|
739
739
|
var os = __importStar(require("os"));
|
|
@@ -742,7 +742,7 @@ var require_resolver = __commonJS({
|
|
|
742
742
|
var claudeSettings_1 = require_claudeSettings();
|
|
743
743
|
var claudeJson_1 = require_claudeJson();
|
|
744
744
|
var mcpJson_1 = require_mcpJson();
|
|
745
|
-
function
|
|
745
|
+
function resolvePreset2(store, presetId) {
|
|
746
746
|
const preset = store.presets.find((p) => p.id === presetId);
|
|
747
747
|
if (!preset) {
|
|
748
748
|
return null;
|
|
@@ -798,9 +798,6 @@ var require_resolver = __commonJS({
|
|
|
798
798
|
env["ANTHROPIC_AUTH_TOKEN"] = cred;
|
|
799
799
|
} else if (cred && mode === "apikey") {
|
|
800
800
|
env["ANTHROPIC_API_KEY"] = cred;
|
|
801
|
-
env["ANTHROPIC_AUTH_TOKEN"] = "local";
|
|
802
|
-
} else {
|
|
803
|
-
env["ANTHROPIC_AUTH_TOKEN"] = "local";
|
|
804
801
|
}
|
|
805
802
|
break;
|
|
806
803
|
}
|
|
@@ -816,8 +813,7 @@ var require_resolver = __commonJS({
|
|
|
816
813
|
}
|
|
817
814
|
env["DISABLE_PROMPT_CACHING"] = provider.disablePromptCaching ? "1" : "";
|
|
818
815
|
const shouldDisableLoginPrompt = provider.type === "bedrock" || provider.type === "proxy" && provider.disableLoginPrompt !== false;
|
|
819
|
-
env["CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC"] = shouldDisableLoginPrompt ? "1" : "";
|
|
820
|
-
env["DISABLE_AUTOUPDATER"] = shouldDisableLoginPrompt ? "1" : "";
|
|
816
|
+
env["CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC"] = shouldDisableLoginPrompt ? "1" : "0";
|
|
821
817
|
}
|
|
822
818
|
const mcpServers = {};
|
|
823
819
|
for (const groupId of preset.mcpGroupIds) {
|
|
@@ -861,6 +857,9 @@ var require_resolver = __commonJS({
|
|
|
861
857
|
if (key === "CLAUDE_CODE_USE_BEDROCK" && value === "0") {
|
|
862
858
|
return true;
|
|
863
859
|
}
|
|
860
|
+
if (key === "CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC" && value === "0") {
|
|
861
|
+
return true;
|
|
862
|
+
}
|
|
864
863
|
return false;
|
|
865
864
|
}
|
|
866
865
|
function filterForGlobal(env) {
|
|
@@ -878,7 +877,7 @@ var require_resolver = __commonJS({
|
|
|
878
877
|
}
|
|
879
878
|
return preserved;
|
|
880
879
|
}
|
|
881
|
-
function
|
|
880
|
+
function applyGlobalConfig2(resolved) {
|
|
882
881
|
const settings = (0, claudeSettings_1.readClaudeSettings)();
|
|
883
882
|
const preservedEnv = preserveUnmanagedEnv(settings.env ?? {});
|
|
884
883
|
const newSettings = {
|
|
@@ -908,7 +907,7 @@ var require_resolver = __commonJS({
|
|
|
908
907
|
(0, claudeSettings_1.writeClaudeSettings)(newSettings);
|
|
909
908
|
(0, claudeJson_1.writeUserMcpServers)(resolved.mcpServers);
|
|
910
909
|
}
|
|
911
|
-
function
|
|
910
|
+
function cleanProjectConfig2(workspaceRoot) {
|
|
912
911
|
const settings = (0, claudeSettings_1.readProjectSettings)(workspaceRoot);
|
|
913
912
|
if (Object.keys(settings).length === 0) {
|
|
914
913
|
return;
|
|
@@ -934,7 +933,7 @@ var require_resolver = __commonJS({
|
|
|
934
933
|
}
|
|
935
934
|
}
|
|
936
935
|
}
|
|
937
|
-
function
|
|
936
|
+
function applyProjectConfig2(resolved, workspaceRoot) {
|
|
938
937
|
const globalEnv = (0, claudeSettings_1.readClaudeSettings)().env ?? {};
|
|
939
938
|
const settings = (0, claudeSettings_1.readProjectSettings)(workspaceRoot);
|
|
940
939
|
const preservedEnv = preserveUnmanagedEnv(settings.env ?? {});
|
|
@@ -963,22 +962,22 @@ var require_resolver = __commonJS({
|
|
|
963
962
|
}
|
|
964
963
|
function applyAllScopes2(store, workspaceRoot) {
|
|
965
964
|
if (store.globalScope.mode === "preset" && store.globalScope.presetId) {
|
|
966
|
-
const resolved =
|
|
965
|
+
const resolved = resolvePreset2(store, store.globalScope.presetId);
|
|
967
966
|
if (resolved) {
|
|
968
|
-
|
|
967
|
+
applyGlobalConfig2(resolved);
|
|
969
968
|
}
|
|
970
969
|
}
|
|
971
970
|
if (workspaceRoot) {
|
|
972
971
|
const wsScope = store.workspaceScopes[workspaceRoot];
|
|
973
972
|
if (wsScope) {
|
|
974
973
|
if (wsScope.mode === "preset" && wsScope.presetId) {
|
|
975
|
-
const resolved =
|
|
974
|
+
const resolved = resolvePreset2(store, wsScope.presetId);
|
|
976
975
|
if (resolved) {
|
|
977
|
-
|
|
976
|
+
applyProjectConfig2(resolved, workspaceRoot);
|
|
978
977
|
}
|
|
979
978
|
}
|
|
980
979
|
if (wsScope.mode === "inherit") {
|
|
981
|
-
|
|
980
|
+
cleanProjectConfig2(workspaceRoot);
|
|
982
981
|
}
|
|
983
982
|
}
|
|
984
983
|
}
|
|
@@ -1157,7 +1156,7 @@ var require_package = __commonJS({
|
|
|
1157
1156
|
"package.json"(exports2, module2) {
|
|
1158
1157
|
module2.exports = {
|
|
1159
1158
|
name: "@easytocloud/claude-personae",
|
|
1160
|
-
version: "0.1
|
|
1159
|
+
version: "0.2.1",
|
|
1161
1160
|
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.",
|
|
1162
1161
|
license: "MIT",
|
|
1163
1162
|
repository: {
|
|
@@ -1224,7 +1223,8 @@ COMMANDS
|
|
|
1224
1223
|
list [presets|providers|scopes] List configured items (default: all)
|
|
1225
1224
|
current Show the active global + workspace preset
|
|
1226
1225
|
switch <preset> [scope] Set the active preset and apply it
|
|
1227
|
-
apply Re-apply the
|
|
1226
|
+
apply Re-apply the global + current-workspace scopes
|
|
1227
|
+
sync Re-apply EVERY known workspace assignment
|
|
1228
1228
|
export Print the store as JSON (credentials scrubbed)
|
|
1229
1229
|
import <file|-> Import a store from a file or stdin
|
|
1230
1230
|
|
|
@@ -1240,6 +1240,7 @@ OPTIONS
|
|
|
1240
1240
|
--out, -o <file> Write export to a file instead of stdout
|
|
1241
1241
|
--no-scrub Export without scrubbing credentials (dangerous)
|
|
1242
1242
|
--mode <merge|replace> Import mode (default: merge)
|
|
1243
|
+
--dry-run Preview only \u2014 show what \`sync\` would change, write nothing
|
|
1243
1244
|
--help, -h Show this help
|
|
1244
1245
|
--version, -v Show version
|
|
1245
1246
|
|
|
@@ -1248,7 +1249,9 @@ EXAMPLES
|
|
|
1248
1249
|
ccp switch bedrock-prod # set global preset
|
|
1249
1250
|
ccp switch dev --workspace # set preset for the current project
|
|
1250
1251
|
ccp switch --workspace --inherit # project inherits global again
|
|
1251
|
-
ccp apply # reprovision
|
|
1252
|
+
ccp apply # reprovision the current project's config
|
|
1253
|
+
ccp sync # re-apply every workspace after editing a preset
|
|
1254
|
+
ccp sync --dry-run # preview what sync would rewrite
|
|
1252
1255
|
ccp export -o presets.json
|
|
1253
1256
|
cat presets.json | ccp import - --mode replace
|
|
1254
1257
|
`;
|
|
@@ -1296,6 +1299,7 @@ function parse(argv) {
|
|
|
1296
1299
|
inherit: { type: "boolean", default: false },
|
|
1297
1300
|
manual: { type: "boolean", default: false },
|
|
1298
1301
|
mode: { type: "string" },
|
|
1302
|
+
"dry-run": { type: "boolean", default: false },
|
|
1299
1303
|
out: { type: "string", short: "o" },
|
|
1300
1304
|
"no-scrub": { type: "boolean", default: false },
|
|
1301
1305
|
help: { type: "boolean", short: "h", default: false },
|
|
@@ -1413,6 +1417,76 @@ function cmdApply(store, values) {
|
|
|
1413
1417
|
process.stdout.write(` workspace (${ws}): ${describeScope(store, store.workspaceScopes[ws])}
|
|
1414
1418
|
`);
|
|
1415
1419
|
}
|
|
1420
|
+
function cmdSync(store, values) {
|
|
1421
|
+
const dryRun = Boolean(values["dry-run"]);
|
|
1422
|
+
if (store.globalScope.mode === "preset" && store.globalScope.presetId) {
|
|
1423
|
+
const resolved = (0, import_claude_personae_core.resolvePreset)(store, store.globalScope.presetId);
|
|
1424
|
+
if (!resolved) {
|
|
1425
|
+
process.stderr.write(`global: preset missing \u2014 skipped
|
|
1426
|
+
`);
|
|
1427
|
+
} else {
|
|
1428
|
+
if (!dryRun) {
|
|
1429
|
+
(0, import_claude_personae_core.ensureOnboardingComplete)();
|
|
1430
|
+
(0, import_claude_personae_core.applyGlobalConfig)(resolved);
|
|
1431
|
+
}
|
|
1432
|
+
process.stdout.write(`${dryRun ? "would apply" : "applied"} global: ${describeScope(store, store.globalScope)}
|
|
1433
|
+
`);
|
|
1434
|
+
}
|
|
1435
|
+
} else {
|
|
1436
|
+
process.stdout.write(`(skip) global: ${describeScope(store, store.globalScope)}
|
|
1437
|
+
`);
|
|
1438
|
+
}
|
|
1439
|
+
const entries = Object.entries(store.workspaceScopes);
|
|
1440
|
+
if (entries.length === 0) {
|
|
1441
|
+
process.stdout.write("no workspace assignments to sync.\n");
|
|
1442
|
+
return;
|
|
1443
|
+
}
|
|
1444
|
+
let applied = 0;
|
|
1445
|
+
let skipped = 0;
|
|
1446
|
+
let missing = 0;
|
|
1447
|
+
for (const [ws, scope] of entries) {
|
|
1448
|
+
const desc = describeScope(store, scope);
|
|
1449
|
+
if (!fs.existsSync(ws)) {
|
|
1450
|
+
process.stderr.write(`(missing) ${ws}: ${desc}
|
|
1451
|
+
`);
|
|
1452
|
+
missing++;
|
|
1453
|
+
continue;
|
|
1454
|
+
}
|
|
1455
|
+
if (scope.mode === "manual") {
|
|
1456
|
+
process.stdout.write(`(manual) ${ws}: left untouched
|
|
1457
|
+
`);
|
|
1458
|
+
skipped++;
|
|
1459
|
+
continue;
|
|
1460
|
+
}
|
|
1461
|
+
if (scope.mode === "inherit") {
|
|
1462
|
+
if (!dryRun) {
|
|
1463
|
+
(0, import_claude_personae_core.cleanProjectConfig)(ws);
|
|
1464
|
+
}
|
|
1465
|
+
process.stdout.write(`${dryRun ? "would clear" : "cleared "} ${ws}: inherit from global
|
|
1466
|
+
`);
|
|
1467
|
+
applied++;
|
|
1468
|
+
continue;
|
|
1469
|
+
}
|
|
1470
|
+
const resolved = scope.presetId ? (0, import_claude_personae_core.resolvePreset)(store, scope.presetId) : null;
|
|
1471
|
+
if (!resolved) {
|
|
1472
|
+
process.stderr.write(`(skip) ${ws}: preset missing
|
|
1473
|
+
`);
|
|
1474
|
+
skipped++;
|
|
1475
|
+
continue;
|
|
1476
|
+
}
|
|
1477
|
+
if (!dryRun) {
|
|
1478
|
+
(0, import_claude_personae_core.applyProjectConfig)(resolved, ws);
|
|
1479
|
+
}
|
|
1480
|
+
process.stdout.write(`${dryRun ? "would apply" : "applied "} ${ws}: ${desc}
|
|
1481
|
+
`);
|
|
1482
|
+
applied++;
|
|
1483
|
+
}
|
|
1484
|
+
const verb = dryRun ? "would sync" : "synced";
|
|
1485
|
+
process.stdout.write(
|
|
1486
|
+
`
|
|
1487
|
+
${verb} ${applied} workspace(s)` + (skipped ? `, ${skipped} skipped` : "") + (missing ? `, ${missing} with missing directory` : "") + ".\n"
|
|
1488
|
+
);
|
|
1489
|
+
}
|
|
1416
1490
|
function cmdExport(store, values) {
|
|
1417
1491
|
const out = values["no-scrub"] ? store : (0, import_claude_personae_core.scrubStore)(store);
|
|
1418
1492
|
const content = JSON.stringify(out, null, 2) + "\n";
|
|
@@ -1498,6 +1572,9 @@ function main() {
|
|
|
1498
1572
|
case "apply":
|
|
1499
1573
|
cmdApply(store, values);
|
|
1500
1574
|
break;
|
|
1575
|
+
case "sync":
|
|
1576
|
+
cmdSync(store, values);
|
|
1577
|
+
break;
|
|
1501
1578
|
case "export":
|
|
1502
1579
|
cmdExport(store, values);
|
|
1503
1580
|
break;
|
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/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", "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 } from './claudeJson';\nimport { writeProjectMcpServers } from './mcpJson';\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 let baseUrl = provider.proxyBaseUrl || '';\n // Strip trailing /v1 (users often paste the full endpoint URL)\n baseUrl = baseUrl.replace(/\\/v1\\/?$/, '').replace(/\\/+$/, '');\n // OpenRouter requires /api in the URL path\n if (/openrouter\\.ai/i.test(baseUrl) && !/\\/api\\b/i.test(baseUrl)) {\n baseUrl = baseUrl + '/api';\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 const mode = provider.proxyAuthMode\n ?? (provider.proxyAuthToken ? 'authtoken' : 'apikey'); // eslint-disable-line deprecation/deprecation\n\n // 1Password: op:// ref \u2192 apiKeyHelper (conflicts with AUTH_TOKEN, so skip that)\n if (cred?.startsWith('op://')) {\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 env['ANTHROPIC_AUTH_TOKEN'] = 'local'; // suppresses login prompt\n } else {\n env['ANTHROPIC_AUTH_TOKEN'] = 'local'; // keyless \u2014 suppress login prompt only\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 login/nonessential traffic (AWS auth, never needs Anthropic login).\n // Proxy defaults to disabled (most are local/non-Anthropic); explicit false overrides for\n // proxies that forward to Anthropic and need the login flow.\n const shouldDisableLoginPrompt =\n provider.type === 'bedrock' ||\n (provider.type === 'proxy' && provider.disableLoginPrompt !== false);\n env['CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC'] = shouldDisableLoginPrompt ? '1' : '';\n env['DISABLE_AUTOUPDATER'] = shouldDisableLoginPrompt ? '1' : '';\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 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 // 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 './resolver';\nexport * from './transfer';\n", "{\n \"name\": \"@easytocloud/claude-personae\",\n \"version\": \"0.1.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 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 stored scopes to disk\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 (default)\n --workspace, -w Set the preset for a workspace (uses CWD)\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 --help, -h Show this help\n --version, -v Show version\n\nEXAMPLES\n ccp list presets\n ccp switch bedrock-prod # set global preset\n ccp switch dev --workspace # set preset for the current project\n ccp switch --workspace --inherit # project inherits global again\n ccp apply # reprovision config files from the store\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 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 toWorkspace = values.workspace || values.path !== undefined || values.inherit || values.manual;\n\n if (toWorkspace && !values.global) {\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 (default)\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 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 '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": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0DA,IAAAA,SAAA,oBAAA;AAQA,IAAAA,SAAA,uBAAA;AApDa,IAAAA,SAAA,eAA6B;MACxC,EAAE,QAAQ,MAAU,IAAI,+CAAgD,OAAO,0CAAoC;MACnH,EAAE,QAAQ,MAAU,IAAI,+CAAgD,OAAO,0CAAoC;MACnH,EAAE,QAAQ,MAAU,IAAI,+CAAgD,OAAO,0CAAoC;MACnH,EAAE,QAAQ,IAAU,IAAI,4CAAiD,OAAO,mCAA6B;MAC7G,EAAE,QAAQ,IAAU,IAAI,0CAAiD,OAAO,iCAA2B;;AAGhG,IAAAA,SAAA,gBAA8B;MACzC,EAAE,QAAQ,UAAU,IAAI,sCAAkD,OAAO,kCAA4B;MAC7G,EAAE,QAAQ,MAAU,IAAI,kCAAkD,OAAO,2CAAqC;MACtH,EAAE,QAAQ,MAAU,IAAI,kCAAkD,OAAO,2CAAqC;MACtH,EAAE,QAAQ,MAAU,IAAI,gDAAkD,OAAO,2CAAqC;MACtH,EAAE,QAAQ,MAAU,IAAI,gDAAkD,OAAO,2CAAqC;MACtH,EAAE,QAAQ,IAAU,IAAI,2CAAkD,OAAO,kCAA4B;MAC7G,EAAE,QAAQ,IAAU,IAAI,6CAAkD,OAAO,oCAA8B;;AAGpG,IAAAA,SAAA,cAA4B;MACvC,EAAE,QAAQ,MAAU,IAAI,mCAAiD,OAAO,yCAAmC;MACnH,EAAE,QAAQ,MAAU,IAAI,mCAAiD,OAAO,yCAAmC;MACnH,EAAE,QAAQ,IAAU,IAAI,yCAAkD,OAAO,gCAA0B;MAC3G,EAAE,QAAQ,IAAU,IAAI,2CAAkD,OAAO,kCAA4B;;AAIlG,IAAAA,SAAA,qBAAqB;MAChC,QAAQ;MACR,OAAO;MACP,MAAM;;AAGK,IAAAA,SAAA,cAAc;MACzB;MAAa;MAAa;MAAa;MACvC;MACA;MAAa;MAAa;MAAa;MAAgB;MACvD;MAAkB;MAAkB;MAAkB;MACtD;MAAc;;AAOhB,aAAgB,kBAAkB,QAAc;AAC9C,UAAI,OAAO,WAAW,KAAK,GAAG;AAAE,eAAO,CAAC,MAAM,UAAU,EAAE;MAAG;AAC7D,UAAI,OAAO,WAAW,KAAK,GAAG;AAAE,eAAO,CAAC,MAAM,UAAU,EAAE;MAAG;AAC7D,UAAI,OAAO,WAAW,KAAK,GAAG;AAAE,eAAO,CAAC,MAAM,UAAU,EAAE;MAAG;AAC7D,aAAO,CAAC,UAAU,EAAE;IACtB;AAGA,aAAgB,qBAAqB,QAAsB,QAAc;AACvE,YAAM,WAAW,kBAAkB,MAAM;AACzC,aAAO,OAAO,OAAO,OAAK,SAAS,SAAS,EAAE,MAAM,CAAC;IACvD;AAGa,IAAAA,SAAA,mBAAmB,oBAAI,IAAI;MACtC;MACA;MACA;MACA;MACA;MACA;MACA;MACA;;MACA;;MACA;;MACA;MACA;MACA;MACA;MACA;MACA;KACD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC7ED,IAAAC,SAAA,sBAAA;AAKA,IAAAA,SAAA,aAAA;AAiCA,IAAAA,SAAA,iBAAAC;AA2BA,IAAAD,SAAA,mBAAA;AAaA,IAAAA,SAAA,mBAAAE;AAgCA,IAAAF,SAAA,uBAAAG;AAQA,IAAAH,SAAA,oBAAAI;AAlIA,QAAAC,MAAA,aAAA,QAAA,IAAA,CAAA;AACA,QAAA,KAAA,aAAA,QAAA,IAAA,CAAA;AACA,QAAAC,QAAA,aAAA,QAAA,MAAA,CAAA;AACA,QAAA,SAAA,aAAA,QAAA,QAAA,CAAA;AAEA,QAAA,WAAA;AAGa,IAAAN,SAAA,sBAAsB;AACtB,IAAAA,SAAA,oBAAoB;AAGjC,aAAgB,sBAAmB;AACjC,aAAOM,MAAK,KAAK,GAAG,QAAO,GAAI,WAAW,qBAAqB;IACjE;AAGA,aAAgB,aAAU;AACxB,aAAO,OAAO,WAAU;IAC1B;AAGA,aAAS,gBAAgB,UAA0B;AACjD,aAAO;QACL,IAAIN,SAAA;QACJ,MAAM;QACN,MAAM;;QAEN,iBAAiB,UAAU,mBAAmB;QAC9C,cAAc,SAAA,mBAAmB;QACjC,gBAAgB,SAAA,mBAAmB;QACnC,WAAW,SAAA,mBAAmB;;IAElC;AAGA,aAAS,gBAAa;AACpB,aAAO;QACL,IAAIA,SAAA;QACJ,MAAM;QACN,YAAYA,SAAA;QACZ,aAAa,CAAA;QACb,mBAAmB,CAAA;;IAEvB;AAMA,aAAgBC,gBAAe,OAAmB;AAEhD,YAAM,mBAAmB,MAAM,UAAU,KAAK,OAAK,EAAE,OAAOD,SAAA,mBAAmB;AAC/E,UAAI,kBAAkB;AAEpB,yBAAiB,OAAO;AACxB,yBAAiB,OAAO;AACxB,yBAAiB,eAAe,SAAA,mBAAmB;AACnD,yBAAiB,iBAAiB,SAAA,mBAAmB;AACrD,yBAAiB,YAAY,SAAA,mBAAmB;MAClD,OAAO;AACL,cAAM,UAAU,QAAQ,gBAAe,CAAE;MAC3C;AAGA,YAAM,iBAAiB,MAAM,QAAQ,KAAK,OAAK,EAAE,OAAOA,SAAA,iBAAiB;AACzE,UAAI,gBAAgB;AAClB,uBAAe,OAAO;AACtB,uBAAe,aAAaA,SAAA;MAC9B,OAAO;AACL,cAAM,QAAQ,QAAQ,cAAa,CAAE;MACvC;AAEA,aAAO;IACT;AAGA,aAAgB,mBAAgB;AAC9B,aAAOC,gBAAe;QACpB,SAAS;QACT,WAAW,CAAA;QACX,WAAW,CAAA;QACX,iBAAiB,CAAA;QACjB,SAAS,CAAA;QACT,aAAa,EAAE,MAAM,UAAU,UAAUD,SAAA,kBAAiB;QAC1D,iBAAiB,CAAA;OAClB;IACH;AAGA,aAAgBE,oBAAgB;AAC9B,YAAM,WAAW,oBAAmB;AAEpC,UAAI,CAACG,IAAG,WAAW,QAAQ,GAAG;AAC5B,eAAO,iBAAgB;MACzB;AAEA,UAAI;AACF,cAAM,MAAMA,IAAG,aAAa,UAAU,MAAM;AAC5C,cAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,YAAI,OAAO,WAAW,YAAY,WAAW,QAAQ,CAAC,MAAM,QAAQ,MAAM,GAAG;AAC3E,gBAAM,QAAQ;AAEd,gBAAM,MAAM;AACZ,cAAI,IAAI,eAAe,KAAK,CAAC,MAAM,iBAAiB;AAClD,kBAAM,kBAAkB,IAAI,eAAe;AAC3C,mBAAO,IAAI,eAAe;UAC5B;AACA,cAAI,CAAC,MAAM,iBAAiB;AAC1B,kBAAM,kBAAkB,CAAA;UAC1B;AACA,cAAI,MAAM,YAAY,GAAG;AACvB,mBAAOJ,gBAAe,KAAK;UAC7B;QACF;AACA,eAAO,iBAAgB;MACzB,QAAQ;AACN,eAAO,iBAAgB;MACzB;IACF;AAGA,aAAgBE,sBAAqB,OAAqB,OAAa;AACrE,aACE,MAAM,QAAQ,KAAK,OAAK,EAAE,OAAO,KAAK,KACtC,MAAM,QAAQ,KAAK,OAAK,EAAE,KAAK,YAAW,MAAO,MAAM,YAAW,CAAE;IAExE;AAGA,aAAgBC,mBAAkB,OAAmB;AACnD,YAAM,WAAW,oBAAmB;AACpC,YAAM,MAAME,MAAK,QAAQ,QAAQ;AAEjC,UAAI,CAACD,IAAG,WAAW,GAAG,GAAG;AACvB,QAAAA,IAAG,UAAU,KAAK,EAAE,WAAW,KAAI,CAAE;MACvC;AAEA,MAAAA,IAAG,cAAc,UAAU,KAAK,UAAU,OAAO,MAAM,CAAC,IAAI,MAAM,MAAM;IAC1E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACtIA,IAAAE,SAAA,mBAAA;AAqBA,IAAAA,SAAA,mBAAA;AAmEA,IAAAA,SAAA,sBAAA;AA8BA,IAAAA,SAAA,kBAAA;AA3HA,QAAAC,MAAA,aAAA,QAAA,IAAA,CAAA;AACA,QAAA,KAAA,aAAA,QAAA,IAAA,CAAA;AACA,QAAAC,QAAA,aAAA,QAAA,MAAA,CAAA;AAGA,aAAgB,mBAAgB;AAC9B,aAAO,QAAQ,IAAI,mBAAmBA,MAAK,KAAK,GAAG,QAAO,GAAI,QAAQ,QAAQ;IAChF;AAmBA,aAAgB,mBAAgB;AAC9B,YAAM,UAAU,iBAAgB;AAChC,YAAM,cAAcA,MAAK,KAAK,GAAG,QAAO,GAAI,QAAQ,QAAQ;AAC5D,YAAM,iBAAiB,CAAC,CAAC,QAAQ,IAAI;AAGrC,UAAI,YAAY;AAChB,UAAI;AACF,oBAAYD,IAAG,UAAU,WAAW,EAAE,eAAc;MACtD,QAAQ;MAA2B;AAGnC,UAAI,CAAC,kBAAkB,CAAC,WAAW;AAAE,eAAO;MAAM;AAGlD,UAAI,aAAa;AACjB,UAAI;AACF,qBAAaA,IAAG,aAAa,OAAO;MACtC,QAAQ;AAEN,qBAAa;MACf;AAKA,YAAM,eAAeC,MAAK,KACxB,GAAG,QAAO,GACV,WAAW,oBAAoB,uBAC/B,YAAY,OAAO,SAAS;AAE9B,UAAI,WAAW,WAAW,eAAe,GAAG,KAAK,WAAW,WAAW,eAAeA,MAAK,GAAG,GAAG;AAC/F,qBAAaA,MAAK,KAAK,GAAG,QAAO,GAAI,QAAQ,WAAW,MAAM,aAAa,SAAS,CAAC,CAAC;MACxF;AAGA,YAAM,cAAcA,MAAK,KAAK,GAAG,QAAO,GAAI,QAAQ,UAAU;AAC9D,YAAM,iBAAiBA,MAAK,KAAK,aAAaA,MAAK,GAAG;AACtD,UAAI,WAAW,WAAW,cAAc,KAAK,WAAW,WAAW,cAAc,GAAG,GAAG;AACrF,cAAM,MAAMA,MAAK,SAAS,aAAa,UAAU;AACjD,cAAM,QAAQ,IAAI,MAAMA,MAAK,GAAG;AAChC,YAAI,MAAM,WAAW,KAAK,MAAM,CAAC,MAAM,UAAU;AAC/C,gBAAM,UAAU,MAAM,CAAC;AACvB,gBAAM,WAAW,gBAAgB,WAAW;AAC5C,iBAAO,EAAE,YAAY,UAAU,MAAM,SAAS,SAAQ;QACxD;MACF;AAEA,aAAO,EAAE,YAAY,UAAU,MAAK;IACtC;AAGA,aAAS,gBAAgB,aAAmB;AAC1C,UAAI;AACF,eAAOD,IAAG,YAAY,aAAa,EAAE,eAAe,KAAI,CAAE,EACvD,OAAO,OAAK,EAAE,YAAW,CAAE,EAC3B,IAAI,OAAK,EAAE,IAAI,EACf,KAAI;MACT,QAAQ;AACN,eAAO,CAAA;MACT;IACF;AAMA,aAAgB,oBAAoB,YAAkB;AACpD,UAAI,CAACA,IAAG,WAAW,UAAU,GAAG;AAC9B,eAAO,CAAC,SAAS;MACnB;AAEA,UAAI;AACF,cAAM,UAAUA,IAAG,aAAa,YAAY,MAAM;AAClD,cAAM,WAAqB,CAAA;AAE3B,mBAAW,QAAQ,QAAQ,MAAM,IAAI,GAAG;AACtC,gBAAM,UAAU,KAAK,KAAI;AAEzB,gBAAM,QAAQ,QAAQ,MAAM,4BAA4B;AACxD,cAAI,OAAO;AACT,kBAAM,OAAO,MAAM,CAAC,EAAE,KAAI;AAC1B,gBAAI,QAAQ,CAAC,SAAS,SAAS,IAAI,GAAG;AACpC,uBAAS,KAAK,IAAI;YACpB;UACF;QACF;AAEA,eAAO,SAAS,SAAS,IAAI,WAAW,CAAC,SAAS;MACpD,QAAQ;AACN,eAAO,CAAC,SAAS;MACnB;IACF;AAKA,aAAgB,kBAAe;AAC7B,aAAO,oBAAoB,iBAAgB,CAAE;IAC/C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACrHA,IAAAE,SAAA,wBAAA;AAKA,IAAAA,SAAA,yBAAA;AAKA,IAAAA,SAAA,qBAAA;AAoBA,IAAAA,SAAA,sBAAA;AAeA,IAAAA,SAAA,sBAAA;AAgBA,IAAAA,SAAA,uBAAA;AArEA,QAAAC,MAAA,aAAA,QAAA,IAAA,CAAA;AACA,QAAA,KAAA,aAAA,QAAA,IAAA,CAAA;AACA,QAAAC,QAAA,aAAA,QAAA,MAAA,CAAA;AAGA,QAAM,aAAa;AAGnB,aAAgB,wBAAqB;AACnC,aAAOA,MAAK,KAAK,GAAG,QAAO,GAAI,WAAW,eAAe;IAC3D;AAGA,aAAgB,uBAAuB,eAAqB;AAC1D,aAAOA,MAAK,KAAK,eAAe,WAAW,eAAe;IAC5D;AAGA,aAAgB,qBAAkB;AAChC,YAAM,WAAW,sBAAqB;AAEtC,UAAI,CAACD,IAAG,WAAW,QAAQ,GAAG;AAC5B,eAAO,CAAA;MACT;AAEA,UAAI;AACF,cAAM,MAAMA,IAAG,aAAa,UAAU,MAAM;AAC5C,cAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,YAAI,OAAO,WAAW,YAAY,WAAW,QAAQ,CAAC,MAAM,QAAQ,MAAM,GAAG;AAC3E,iBAAO;QACT;AACA,eAAO,CAAA;MACT,QAAQ;AACN,eAAO,CAAA;MACT;IACF;AAGA,aAAgB,oBAAoB,UAA4B;AAC9D,YAAM,WAAW,sBAAqB;AACtC,YAAM,MAAMC,MAAK,QAAQ,QAAQ;AAEjC,UAAI,CAACD,IAAG,WAAW,GAAG,GAAG;AACvB,QAAAA,IAAG,UAAU,KAAK,EAAE,WAAW,KAAI,CAAE;MACvC;AAGA,YAAM,SAA6B,EAAE,SAAS,YAAY,GAAG,SAAQ;AAErE,MAAAA,IAAG,cAAc,UAAU,KAAK,UAAU,QAAQ,MAAM,CAAC,IAAI,MAAM,MAAM;IAC3E;AAGA,aAAgB,oBAAoB,eAAqB;AACvD,YAAM,WAAW,uBAAuB,aAAa;AACrD,UAAI,CAACA,IAAG,WAAW,QAAQ,GAAG;AAAE,eAAO,CAAA;MAAI;AAC3C,UAAI;AACF,cAAM,MAAMA,IAAG,aAAa,UAAU,MAAM;AAC5C,cAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,YAAI,OAAO,WAAW,YAAY,WAAW,QAAQ,CAAC,MAAM,QAAQ,MAAM,GAAG;AAC3E,iBAAO;QACT;AACA,eAAO,CAAA;MACT,QAAQ;AACN,eAAO,CAAA;MACT;IACF;AAGA,aAAgB,qBAAqB,eAAuB,UAA4B;AACtF,YAAM,WAAW,uBAAuB,aAAa;AACrD,YAAM,MAAMC,MAAK,QAAQ,QAAQ;AAEjC,UAAI,CAACD,IAAG,WAAW,GAAG,GAAG;AACvB,QAAAA,IAAG,UAAU,KAAK,EAAE,WAAW,KAAI,CAAE;MACvC;AAEA,YAAM,SAA6B,EAAE,SAAS,YAAY,GAAG,SAAQ;AACrE,MAAAA,IAAG,cAAc,UAAU,KAAK,UAAU,QAAQ,MAAM,CAAC,IAAI,MAAM,MAAM;IAC3E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACpEA,IAAAE,SAAA,oBAAA;AAIA,IAAAA,SAAA,iBAAA;AAgBA,IAAAA,SAAA,qBAAA;AASA,IAAAA,SAAA,2BAAAC;AASA,IAAAD,SAAA,sBAAA;AAjDA,QAAAE,MAAA,aAAA,QAAA,IAAA,CAAA;AACA,QAAA,KAAA,aAAA,QAAA,IAAA,CAAA;AACA,QAAAC,QAAA,aAAA,QAAA,MAAA,CAAA;AASA,aAAgB,oBAAiB;AAC/B,aAAOA,MAAK,KAAK,GAAG,QAAO,GAAI,cAAc;IAC/C;AAEA,aAAgB,iBAAc;AAC5B,YAAM,WAAW,kBAAiB;AAClC,UAAI,CAACD,IAAG,WAAW,QAAQ,GAAG;AAAE,eAAO,CAAA;MAAI;AAC3C,UAAI;AACF,cAAM,MAAMA,IAAG,aAAa,UAAU,MAAM;AAC5C,cAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,YAAI,OAAO,WAAW,YAAY,WAAW,QAAQ,CAAC,MAAM,QAAQ,MAAM,GAAG;AAC3E,iBAAO;QACT;AACA,eAAO,CAAA;MACT,QAAQ;AACN,eAAO,CAAA;MACT;IACF;AAGA,aAAgB,qBAAkB;AAChC,aAAO,eAAc,EAAG,cAAc,CAAA;IACxC;AAOA,aAAgBD,4BAAwB;AACtC,YAAM,WAAW,kBAAiB;AAClC,YAAM,WAAW,eAAc;AAC/B,UAAI,SAAS,wBAAwB,GAAG;AAAE;MAAQ;AAClD,YAAM,UAAU,EAAE,GAAG,UAAU,wBAAwB,KAAI;AAC3D,MAAAC,IAAG,cAAc,UAAU,KAAK,UAAU,SAAS,MAAM,CAAC,IAAI,MAAM,MAAM;IAC5E;AAGA,aAAgB,oBAAoB,SAAwC;AAC1E,YAAM,WAAW,kBAAiB;AAClC,YAAM,WAAW,eAAc;AAC/B,YAAM,UAAsB,EAAE,GAAG,UAAU,YAAY,QAAO;AAC9D,MAAAA,IAAG,cAAc,UAAU,KAAK,UAAU,SAAS,MAAM,CAAC,IAAI,MAAM,MAAM;IAC5E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC7CA,IAAAE,SAAA,iBAAA;AAoBA,IAAAA,SAAA,wBAAA;AAKA,IAAAA,SAAA,yBAAA;AAlCA,QAAAC,MAAA,aAAA,QAAA,IAAA,CAAA;AACA,QAAAC,QAAA,aAAA,QAAA,MAAA,CAAA;AAQA,aAAgB,eAAe,eAAqB;AAClD,aAAOA,MAAK,KAAK,eAAe,WAAW;IAC7C;AAEA,aAAS,YAAY,eAAqB;AACxC,YAAM,WAAW,eAAe,aAAa;AAC7C,UAAI,CAACD,IAAG,WAAW,QAAQ,GAAG;AAAE,eAAO,CAAA;MAAI;AAC3C,UAAI;AACF,cAAM,MAAMA,IAAG,aAAa,UAAU,MAAM;AAC5C,cAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,YAAI,OAAO,WAAW,YAAY,WAAW,QAAQ,CAAC,MAAM,QAAQ,MAAM,GAAG;AAC3E,iBAAO;QACT;AACA,eAAO,CAAA;MACT,QAAQ;AACN,eAAO,CAAA;MACT;IACF;AAGA,aAAgB,sBAAsB,eAAqB;AACzD,aAAO,YAAY,aAAa,EAAE,cAAc,CAAA;IAClD;AAGA,aAAgB,uBAAuB,eAAuB,SAAwC;AACpG,YAAM,MAAM;AACZ,UAAI,CAACA,IAAG,WAAW,GAAG,GAAG;AAAE;MAAQ;AACnC,YAAM,WAAW,eAAe,aAAa;AAC7C,YAAM,WAAW,YAAY,aAAa;AAC1C,YAAM,UAAmB,EAAE,GAAG,UAAU,YAAY,QAAO;AAC3D,MAAAA,IAAG,cAAc,UAAU,KAAK,UAAU,SAAS,MAAM,CAAC,IAAI,MAAM,MAAM;IAC5E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACLA,IAAAE,SAAA,gBAAA;AAgMA,IAAAA,SAAA,oBAAA;AA8CA,IAAAA,SAAA,qBAAA;AAqCA,IAAAA,SAAA,qBAAA;AA6CA,IAAAA,SAAA,iBAAAC;AApWA,QAAAC,MAAA,aAAA,QAAA,IAAA,CAAA;AACA,QAAA,KAAA,aAAA,QAAA,IAAA,CAAA;AACA,QAAAC,QAAA,aAAA,QAAA,MAAA,CAAA;AAMA,QAAA,WAAA;AACA,QAAA,mBAAA;AAOA,QAAA,eAAA;AACA,QAAA,YAAA;AAmBA,aAAgB,cACd,OACA,UAAgB;AAEhB,YAAM,SAAS,MAAM,QAAQ,KAAK,OAAK,EAAE,OAAO,QAAQ;AACxD,UAAI,CAAC,QAAQ;AAAE,eAAO;MAAM;AAE5B,YAAM,WAAW,MAAM,UAAU,KAAK,OAAK,EAAE,OAAO,OAAO,UAAU;AACrE,YAAM,MAA8B,CAAA;AACpC,UAAI;AACJ,UAAI;AAEJ,UAAI,UAAU;AAOZ,YAAI,yBAAyB,IAAI;AACjC,YAAI,oBAAoB,IAAI;AAG5B,gBAAQ,SAAS,MAAM;UACrB,KAAK,WAAW;AACd,gBAAI,yBAAyB,IAAI;AACjC,gBAAI,SAAS,YAAY;AAAE,kBAAI,aAAa,IAAI,SAAS;YAAY;AACrE,gBAAI,SAAS,WAAW;AACtB,kBAAI,CAAC,SAAA,YAAY,SAAS,SAAS,SAAS,GAAG;AAC7C,sBAAM,IAAI,MAAM,uBAAuB,SAAS,SAAS,sBAAsB,SAAA,YAAY,KAAK,IAAI,CAAC,EAAE;cACzG;AACA,kBAAI,YAAY,IAAI,SAAS;YAC/B;AACA,gBAAI,SAAS,gBAAgB;AAAE,+BAAiB,SAAS;YAAgB;AAIzE,gBAAI,SAAS,QAAQ;AACnB,kBAAI,iBAAiB,IAAIA,MAAK,KAAK,GAAG,QAAO,GAAI,QAAQ,YAAY,SAAS,QAAQ,QAAQ;YAChG;AACA;UACF;UACA,KAAK;AACH,gBAAI,SAAS,iBAAiB,WAAW,OAAO,GAAG;AACjD,6BAAe,YAAY,SAAS,eAAe;YACrD,WAAW,SAAS,iBAAiB;AACnC,kBAAI,mBAAmB,IAAI,SAAS;YACtC;AACA;UACF,KAAK,SAAS;AACZ,gBAAI,UAAU,SAAS,gBAAgB;AAEvC,sBAAU,QAAQ,QAAQ,YAAY,EAAE,EAAE,QAAQ,QAAQ,EAAE;AAE5D,gBAAI,kBAAkB,KAAK,OAAO,KAAK,CAAC,WAAW,KAAK,OAAO,GAAG;AAChE,wBAAU,UAAU;YACtB;AACA,gBAAI,SAAS;AAAE,kBAAI,oBAAoB,IAAI;YAAS;AAIpD,kBAAM,OAAO,SAAS,mBACjB,SAAS,kBACT,SAAS;AACd,kBAAM,OAAO,SAAS,kBAChB,SAAS,iBAAiB,cAAc;AAG9C,gBAAI,MAAM,WAAW,OAAO,GAAG;AAC7B,6BAAe,YAAY,IAAI;YACjC,WAAW,QAAQ,SAAS,aAAa;AACvC,kBAAI,sBAAsB,IAAI;YAChC,WAAW,QAAQ,SAAS,UAAU;AACpC,kBAAI,mBAAmB,IAAI;AAC3B,kBAAI,sBAAsB,IAAI;YAChC,OAAO;AACL,kBAAI,sBAAsB,IAAI;YAChC;AACA;UACF;QACF;AAIA,YAAI,SAAS,SAAS,aAAa;AACjC,cAAI,gCAAgC,IAAI;AACxC,cAAI,+BAA+B,IAAI;AACvC,cAAI,8BAA8B,IAAI;QACxC,OAAO;AACL,cAAI,gCAAgC,IAAI,SAAS,gBAAgB;AACjE,cAAI,+BAA+B,IAAI,SAAS,kBAAkB;AAClE,cAAI,8BAA8B,IAAI,SAAS,aAAa;QAC9D;AACA,YAAI,wBAAwB,IAAI,SAAS,uBAAuB,MAAM;AAItE,cAAM,2BACJ,SAAS,SAAS,aACjB,SAAS,SAAS,WAAW,SAAS,uBAAuB;AAChE,YAAI,0CAA0C,IAAI,2BAA2B,MAAM;AACnF,YAAI,qBAAqB,IAAI,2BAA2B,MAAM;MAEhE;AAGA,YAAM,aAA8C,CAAA;AACpD,iBAAW,WAAW,OAAO,aAAa;AACxC,cAAM,QAAQ,MAAM,UAAU,KAAK,OAAK,EAAE,OAAO,OAAO;AACxD,YAAI,OAAO;AACT,qBAAW,UAAU,MAAM,SAAS;AAClC,kBAAM,SAA0B,EAAE,MAAM,OAAO,KAAI;AACnD,gBAAI,OAAO,KAAK;AAAE,qBAAO,MAAM,OAAO;YAAK;AAC3C,gBAAI,OAAO,SAAS;AAAE,qBAAO,UAAU,OAAO;YAAS;AACvD,gBAAI,OAAO,MAAM,QAAQ;AAAE,qBAAO,OAAO,OAAO;YAAM;AACtD,gBAAI,OAAO,OAAO,OAAO,KAAK,OAAO,GAAG,EAAE,QAAQ;AAAE,qBAAO,MAAM,OAAO;YAAK;AAC7E,uBAAW,OAAO,IAAI,IAAI;UAC5B;QACF;MACF;AAGA,YAAM,qBAA+B,CAAA;AACrC,iBAAW,WAAW,OAAO,mBAAmB;AAC9C,cAAM,QAAQ,MAAM,gBAAgB,KAAK,OAAK,EAAE,OAAO,OAAO;AAC9D,YAAI,OAAO;AACT,qBAAW,OAAO,MAAM,aAAa;AACnC,gBAAI,CAAC,mBAAmB,SAAS,GAAG,GAAG;AACrC,iCAAmB,KAAK,GAAG;YAC7B;UACF;QACF;MACF;AAEA,aAAO,EAAE,KAAK,oBAAoB,gBAAgB,cAAc,WAAU;IAC5E;AAWA,aAAS,OAAO,KAAa,OAAa;AACxC,UAAI,UAAU,IAAI;AAAE,eAAO;MAAM;AACjC,UAAI,QAAQ,6BAA6B,UAAU,KAAK;AAAE,eAAO;MAAM;AACvE,aAAO;IACT;AAGA,aAAS,gBAAgB,KAA2B;AAClD,aAAO,OAAO,YAAY,OAAO,QAAQ,GAAG,EAAE,OAAO,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;IACjF;AAOA,aAAS,iBACP,KACA,WAAiC;AAEjC,aAAO,OAAO,YACZ,OAAO,QAAQ,GAAG,EAAE,OAAO,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,GAAG,CAAC,KAAK,CAAC,OAAO,GAAG,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC;IAE3F;AAQA,aAAS,qBAAqB,UAAgC;AAC5D,YAAM,YAAoC,CAAA;AAC1C,iBAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,QAAQ,GAAG;AACnD,YAAI,CAAC,SAAA,iBAAiB,IAAI,GAAG,GAAG;AAC9B,oBAAU,GAAG,IAAI;QACnB;MACF;AACA,aAAO;IACT;AAOA,aAAgB,kBAAkB,UAAwB;AACxD,YAAM,YAAW,GAAA,iBAAA,oBAAkB;AACnC,YAAM,eAAe,qBAAqB,SAAS,OAAO,CAAA,CAAE;AAE5D,YAAM,cAAkC;QACtC,GAAG;QACH,KAAK,EAAE,GAAG,cAAc,GAAG,gBAAgB,SAAS,GAAG,EAAC;;AAI1D,UAAI,SAAS,mBAAmB,SAAS,GAAG;AAC1C,oBAAY,qBAAqB,SAAS;MAC5C,OAAO;AACL,eAAO,YAAY;MACrB;AAGA,UAAI,SAAS,gBAAgB;AAC3B,oBAAY,iBAAiB,SAAS;MACxC,OAAO;AACL,eAAO,YAAY;MACrB;AAGA,UAAI,SAAS,cAAc;AACzB,oBAAY,eAAe,SAAS;MACtC,OAAO;AACL,eAAO,YAAY;MACrB;AAGA,UAAI,YAAY,KAAK;AACnB,eAAO,YAAY,IAAI,iBAAiB;AACxC,eAAO,YAAY,IAAI,4BAA4B;AACnD,eAAO,YAAY,IAAI,uCAAuC;MAChE;AAEA,OAAA,GAAA,iBAAA,qBAAoB,WAAW;AAC/B,OAAA,GAAA,aAAA,qBAAoB,SAAS,UAAU;IACzC;AAOA,aAAgB,mBAAmB,eAAqB;AACtD,YAAM,YAAW,GAAA,iBAAA,qBAAoB,aAAa;AAClD,UAAI,OAAO,KAAK,QAAQ,EAAE,WAAW,GAAG;AAAE;MAAQ;AAGlD,UAAI,SAAS,KAAK;AAChB,mBAAW,OAAO,SAAA,kBAAkB;AAClC,iBAAO,SAAS,IAAI,GAAG;QACzB;AACA,YAAI,OAAO,KAAK,SAAS,GAAG,EAAE,WAAW,GAAG;AAC1C,iBAAO,SAAS;QAClB;MACF;AAGA,aAAO,SAAS;AAChB,aAAO,SAAS;AAChB,aAAO,SAAS;AAGhB,YAAM,YAAY,OAAO,KAAK,QAAQ,EAAE,OAAO,OAAK,MAAM,SAAS;AACnE,UAAI,UAAU,SAAS,GAAG;AACxB,SAAA,GAAA,iBAAA,sBAAqB,eAAe,QAAQ;MAC9C,OAAO;AAEL,cAAM,YAAW,GAAA,iBAAA,wBAAuB,aAAa;AACrD,YAAID,IAAG,WAAW,QAAQ,GAAG;AAC3B,UAAAA,IAAG,WAAW,QAAQ;QACxB;MACF;IACF;AAOA,aAAgB,mBACd,UACA,eAAqB;AAGrB,YAAM,aAAY,GAAA,iBAAA,oBAAkB,EAAG,OAAO,CAAA;AAC9C,YAAM,YAAW,GAAA,iBAAA,qBAAoB,aAAa;AAClD,YAAM,eAAe,qBAAqB,SAAS,OAAO,CAAA,CAAE;AAE5D,YAAM,cAAkC;QACtC,GAAG;QACH,KAAK,EAAE,GAAG,cAAc,GAAG,iBAAiB,SAAS,KAAK,SAAS,EAAC;;AAGtE,UAAI,SAAS,mBAAmB,SAAS,GAAG;AAC1C,oBAAY,qBAAqB,SAAS;MAC5C,OAAO;AACL,eAAO,YAAY;MACrB;AAEA,UAAI,SAAS,gBAAgB;AAC3B,oBAAY,iBAAiB,SAAS;MACxC,OAAO;AACL,eAAO,YAAY;MACrB;AAEA,UAAI,SAAS,cAAc;AACzB,oBAAY,eAAe,SAAS;MACtC,OAAO;AACL,eAAO,YAAY;MACrB;AAEA,OAAA,GAAA,iBAAA,sBAAqB,eAAe,WAAW;AAG/C,OAAA,GAAA,UAAA,wBAAuB,eAAe,SAAS,UAAU;AAIzD,yBAAmB,aAAa;IAClC;AAKA,aAAgBD,gBACd,OACA,eAAiC;AAGjC,UAAI,MAAM,YAAY,SAAS,YAAY,MAAM,YAAY,UAAU;AACrE,cAAM,WAAW,cAAc,OAAO,MAAM,YAAY,QAAQ;AAChE,YAAI,UAAU;AACZ,4BAAkB,QAAQ;QAC5B;MACF;AAGA,UAAI,eAAe;AACjB,cAAM,UAAU,MAAM,gBAAgB,aAAa;AACnD,YAAI,SAAS;AACX,cAAI,QAAQ,SAAS,YAAY,QAAQ,UAAU;AACjD,kBAAM,WAAW,cAAc,OAAO,QAAQ,QAAQ;AACtD,gBAAI,UAAU;AACZ,iCAAmB,UAAU,aAAa;YAC5C;UACF;AACA,cAAI,QAAQ,SAAS,WAAW;AAC9B,+BAAmB,aAAa;UAClC;QAEF;MACF;IACF;AAMA,QAAM,uBAAuB,CAAC,aAAa,UAAU;AAErD,aAAS,mBAAmB,eAAqB;AAC/C,YAAM,aAAaE,MAAK,KAAK,eAAe,eAAe;AAC3D,UAAI,CAACD,IAAG,WAAW,UAAU,GAAG;AAAE;MAAQ;AAC1C,UAAI;AACF,YAAI,UAAUA,IAAG,aAAa,YAAY,MAAM;AAChD,cAAM,QAAQ,QAAQ,MAAM,IAAI,EAAE,IAAI,OAAK,EAAE,KAAI,CAAE;AACnD,cAAM,UAAU,qBAAqB,OAAO,OAAK,CAAC,MAAM,SAAS,CAAC,CAAC;AACnE,YAAI,QAAQ,WAAW,GAAG;AAAE;QAAQ;AACpC,YAAI,CAAC,QAAQ,SAAS,IAAI,GAAG;AAAE,qBAAW;QAAM;AAChD,mBAAW,QAAQ,KAAK,IAAI,IAAI;AAChC,QAAAA,IAAG,cAAc,YAAY,SAAS,MAAM;MAC9C,QAAQ;MAAuC;IACjD;;;;;;;;;;ACvXA,IAAAE,SAAA,aAAA;AA6BA,IAAAA,SAAA,aAAAC;AAQA,IAAAD,SAAA,8BAAAE;AAgBA,IAAAF,SAAA,qBAAAG;AAaA,IAAAH,SAAA,qBAAAI;AA9FA,QAAA,aAAA;AAOA,QAAM,sBAAsB;MAC1B;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;;AAGW,IAAAJ,SAAA,cAAc;AAE3B,QAAM,cAAc,oBAAI,IAAwB;MAC9C;MAAI;MAAU;MAAe;MAAS;MAAS;MAC/C;MAAiB;MAAO;KACzB;AAGD,aAAgB,WAAW,OAAyB;AAClD,UAAI,CAAC,SAAS,YAAY,IAAI,KAAK,GAAG;AAAE,eAAO;MAAO;AAEtD,UAAI,MAAM,WAAW,OAAO,GAAG;AAAE,eAAO;MAAO;AAC/C,UAAI,WAAW;AACf,iBAAW,WAAW,qBAAqB;AACzC,gBAAQ,YAAY;AACpB,mBAAW,SAAS,QAAQ,SAASA,SAAA,WAAW;MAClD;AAEA,UAAI,aAAa,SAAS,MAAM,UAAU,MAAM,mBAAmB,KAAK,KAAK,GAAG;AAC9E,eAAOA,SAAA;MACT;AACA,aAAO;IACT;AAGA,aAAS,cAAc,UAAyB;AAC9C,aAAO;QACL,GAAG;QACH,iBAAiB,WAAW,SAAS,eAAe;QACpD,iBAAiB,WAAW,SAAS,eAAe;QACpD,aAAa,WAAW,SAAS,WAAW;QAC5C,gBAAgB,WAAW,SAAS,cAAc;QAClD,gBAAgB,SAAS;;;IAE7B;AAGA,aAAgBC,YAAW,OAAmB;AAC5C,aAAO;QACL,GAAG;QACH,WAAW,MAAM,UAAU,IAAI,aAAa;;IAEhD;AAGA,aAAgBC,6BAA4B,OAAmB;AAC7D,aAAO,MAAM,UACV,OAAO,OACN,EAAE,oBAAoBF,SAAA,eACtB,EAAE,oBAAoBA,SAAA,eACtB,EAAE,gBAAgBA,SAAA,eAClB,EAAE,mBAAmBA,SAAA,WAAW,EAEjC,IAAI,OAAK,EAAE,IAAI;IACpB;AAOA,aAAgBG,oBAAmB,KAAW;AAC5C,YAAM,WAAW,KAAK,MAAM,GAAG;AAC/B,UAAI,CAAC,SAAS,WAAW,CAAC,SAAS,aAAa,CAAC,SAAS,SAAS;AACjE,cAAM,IAAI,MAAM,2BAA2B;MAC7C;AACA,aAAO;IACT;AAOA,aAAgBC,oBAAmB,MAAoB,UAAsB;AAC3E,YAAM,QAAQ,oBAAI,IAAG;AAErB,iBAAW,YAAY,SAAS,WAAW;AACzC,cAAM,SAAQ,GAAA,WAAA,YAAU;AACxB,cAAM,IAAI,SAAS,IAAI,KAAK;AAC5B,aAAK,UAAU,KAAK,EAAE,GAAG,UAAU,IAAI,MAAK,CAAE;MAChD;AAEA,iBAAW,SAAS,SAAS,WAAW;AACtC,cAAM,SAAQ,GAAA,WAAA,YAAU;AACxB,cAAM,IAAI,MAAM,IAAI,KAAK;AACzB,aAAK,UAAU,KAAK,EAAE,GAAG,OAAO,IAAI,MAAK,CAAE;MAC7C;AAEA,iBAAW,SAAS,SAAS,iBAAiB;AAC5C,cAAM,SAAQ,GAAA,WAAA,YAAU;AACxB,cAAM,IAAI,MAAM,IAAI,KAAK;AACzB,aAAK,gBAAgB,KAAK,EAAE,GAAG,OAAO,IAAI,MAAK,CAAE;MACnD;AAEA,iBAAW,UAAU,SAAS,SAAS;AACrC,cAAM,SAAQ,GAAA,WAAA,YAAU;AACxB,aAAK,QAAQ,KAAK;UAChB,GAAG;UACH,IAAI;UACJ,YAAY,MAAM,IAAI,OAAO,UAAU,KAAK,OAAO;UACnD,aAAa,OAAO,YAAY,IAAI,QAAM,MAAM,IAAI,EAAE,KAAK,EAAE;UAC7D,mBAAmB,OAAO,kBAAkB,IAAI,QAAM,MAAM,IAAI,EAAE,KAAK,EAAE;SAC1E;MACH;AAEA,aAAO;IACT;;;;;;;;;;;;;;;;;;;;;;;;;AC9HA,iBAAA,iBAAAC,QAAA;AACA,iBAAA,kBAAAA,QAAA;AACA,iBAAA,oBAAAA,QAAA;AACA,iBAAA,qBAAAA,QAAA;AACA,iBAAA,0BAAAA,QAAA;AACA,iBAAA,sBAAAA,QAAA;AACA,iBAAA,mBAAAA,QAAA;AACA,iBAAA,oBAAAA,QAAA;AACA,iBAAA,oBAAAA,QAAA;;;;;ACVA;AAAA,iBAAAC,UAAAC,SAAA;AAAA,IAAAA,QAAA;AAAA,MACE,MAAQ;AAAA,MACR,SAAW;AAAA,MACX,aAAe;AAAA,MACf,SAAW;AAAA,MACX,YAAc;AAAA,QACZ,MAAQ;AAAA,QACR,KAAO;AAAA,QACP,WAAa;AAAA,MACf;AAAA,MACA,UAAY;AAAA,MACZ,MAAQ;AAAA,QACN,KAAO;AAAA,MACT;AAAA,MACA,UAAY;AAAA,QACV;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA,KAAO;AAAA,QACL,mBAAmB;AAAA,QACnB,KAAO;AAAA,MACT;AAAA,MACA,OAAS;AAAA,QACP;AAAA,QACA;AAAA,MACF;AAAA,MACA,SAAW;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,SAAW;AAAA,QACT,OAAS;AAAA,QACT,OAAS;AAAA,QACT,gBAAkB;AAAA,MACpB;AAAA,MACA,iBAAmB;AAAA,QACjB,qCAAqC;AAAA,QACrC,eAAe;AAAA,QACf,SAAW;AAAA,QACX,YAAc;AAAA,MAChB;AAAA,IACF;AAAA;AAAA;;;AC9CA,SAAoB;AACpB,WAAsB;AACtB,kBAA0B;AAC1B,kCAeO;AAGP,IAAM,UAAkB,kBAA2B;AAEnD,IAAM,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA0Cb,SAAS,KAAK,KAAoB;AAChC,UAAQ,OAAO,MAAM,UAAU,GAAG;AAAA,CAAI;AACtC,UAAQ,KAAK,CAAC;AAChB;AAEA,SAAS,aAAa,OAAqB,YAA4B;AACrE,SAAO,MAAM,UAAU,KAAK,OAAK,EAAE,OAAO,UAAU,GAAG,QAAQ;AACjE;AAEA,SAAS,cAAc,OAAqB,OAA4C;AACtF,MAAI,CAAC,OAAO;AAAE,WAAO;AAAA,EAAW;AAChC,MAAI,MAAM,SAAS,UAAU;AAAE,WAAO;AAAA,EAAsC;AAC5E,MAAI,MAAM,SAAS,WAAW;AAAE,WAAO;AAAA,EAAuB;AAC9D,QAAM,SAAS,MAAM,WAAW,MAAM,QAAQ,KAAK,OAAK,EAAE,OAAO,MAAM,QAAQ,IAAI;AACnF,SAAO,SAAS,GAAG,OAAO,IAAI,WAAM,aAAa,OAAO,OAAO,UAAU,CAAC,KAAK;AACjF;AAEA,SAAS,iBAAiB,OAAqB,OAAmC;AAChF,MAAI,CAAC,OAAO;AAAE,SAAK,iCAAiC;AAAA,EAAG;AACvD,QAAM,aAAS,kDAAqB,OAAO,KAAK;AAChD,MAAI,CAAC,QAAQ;AACX,UAAM,QAAQ,MAAM,QAAQ,IAAI,OAAK,EAAE,IAAI,EAAE,KAAK,IAAI;AACtD,SAAK,uBAAuB,KAAK,iBAAiB,SAAS,QAAQ,EAAE;AAAA,EACvE;AACA,SAAO;AACT;AAMA,SAAS,MAAM,MAAgB;AAC7B,aAAO,uBAAU;AAAA,IACf,MAAM;AAAA,IACN,kBAAkB;AAAA,IAClB,SAAS;AAAA,MACP,MAAM,EAAE,MAAM,WAAW,SAAS,MAAM;AAAA,MACxC,QAAQ,EAAE,MAAM,WAAW,OAAO,KAAK,SAAS,MAAM;AAAA,MACtD,WAAW,EAAE,MAAM,WAAW,OAAO,KAAK,SAAS,MAAM;AAAA,MACzD,MAAM,EAAE,MAAM,SAAS;AAAA,MACvB,SAAS,EAAE,MAAM,WAAW,SAAS,MAAM;AAAA,MAC3C,QAAQ,EAAE,MAAM,WAAW,SAAS,MAAM;AAAA,MAC1C,MAAM,EAAE,MAAM,SAAS;AAAA,MACvB,KAAK,EAAE,MAAM,UAAU,OAAO,IAAI;AAAA,MAClC,YAAY,EAAE,MAAM,WAAW,SAAS,MAAM;AAAA,MAC9C,MAAM,EAAE,MAAM,WAAW,OAAO,KAAK,SAAS,MAAM;AAAA,MACpD,SAAS,EAAE,MAAM,WAAW,OAAO,KAAK,SAAS,MAAM;AAAA,IACzD;AAAA,EACF,CAAC;AACH;AAEA,SAAS,aAAa,QAAwB;AAC5C,SAAO,OAAO,OAAY,aAAQ,OAAO,OAAO,IAAI,CAAC,IAAI,QAAQ,IAAI;AACvE;AAMA,SAAS,QAAQ,OAAqB,MAA0B,QAAsB;AACpF,QAAM,QAAQ,QAAQ;AACtB,MAAI,OAAO,MAAM;AACf,UAAM,MAA+B,CAAC;AACtC,QAAI,UAAU,SAAS,UAAU,WAAW;AAAE,UAAI,UAAU,MAAM;AAAA,IAAS;AAC3E,QAAI,UAAU,SAAS,UAAU,aAAa;AAAE,UAAI,YAAY,MAAM,UAAU,IAAI,QAAM,EAAE,IAAI,EAAE,IAAI,MAAM,EAAE,MAAM,MAAM,EAAE,KAAK,EAAE;AAAA,IAAG;AACtI,QAAI,UAAU,SAAS,UAAU,UAAU;AAAE,UAAI,cAAc,MAAM;AAAa,UAAI,kBAAkB,MAAM;AAAA,IAAiB;AAC/H,YAAQ,OAAO,MAAM,KAAK,UAAU,KAAK,MAAM,CAAC,IAAI,IAAI;AACxD;AAAA,EACF;AAEA,MAAI,UAAU,SAAS,UAAU,aAAa;AAC5C,YAAQ,OAAO,MAAM,cAAc;AACnC,eAAW,KAAK,MAAM,WAAW;AAC/B,cAAQ,OAAO,MAAM,KAAK,EAAE,IAAI,MAAM,EAAE,IAAI;AAAA,CAAK;AAAA,IACnD;AACA,YAAQ,OAAO,MAAM,IAAI;AAAA,EAC3B;AACA,MAAI,UAAU,SAAS,UAAU,WAAW;AAC1C,YAAQ,OAAO,MAAM,YAAY;AACjC,eAAW,KAAK,MAAM,SAAS;AAC7B,YAAM,OAAO,CAAC,YAAY,aAAa,OAAO,EAAE,UAAU,CAAC,EAAE;AAC7D,UAAI,EAAE,YAAY,QAAQ;AAAE,aAAK,KAAK,GAAG,EAAE,YAAY,MAAM,eAAe;AAAA,MAAG;AAC/E,UAAI,EAAE,kBAAkB,QAAQ;AAAE,aAAK,KAAK,GAAG,EAAE,kBAAkB,MAAM,eAAe;AAAA,MAAG;AAC3F,cAAQ,OAAO,MAAM,KAAK,EAAE,IAAI,aAAQ,KAAK,KAAK,QAAK,CAAC;AAAA,CAAI;AAAA,IAC9D;AACA,YAAQ,OAAO,MAAM,IAAI;AAAA,EAC3B;AACA,MAAI,UAAU,SAAS,UAAU,UAAU;AACzC,YAAQ,OAAO,MAAM,WAAW;AAChC,YAAQ,OAAO,MAAM,aAAa,cAAc,OAAO,MAAM,WAAW,CAAC;AAAA,CAAI;AAC7E,eAAW,CAAC,IAAI,KAAK,KAAK,OAAO,QAAQ,MAAM,eAAe,GAAG;AAC/D,cAAQ,OAAO,MAAM,KAAK,EAAE,KAAK,cAAc,OAAO,KAAK,CAAC;AAAA,CAAI;AAAA,IAClE;AAAA,EACF;AACF;AAEA,SAAS,WAAW,OAAqB,QAAsB;AAC7D,QAAM,KAAK,aAAa,MAAM;AAC9B,QAAM,UAAU,MAAM,gBAAgB,EAAE;AACxC,MAAI,OAAO,MAAM;AACf,YAAQ,OAAO,MAAM,KAAK,UAAU;AAAA,MAClC,QAAQ,MAAM;AAAA,MACd,WAAW,EAAE,MAAM,IAAI,OAAO,WAAW,KAAK;AAAA,IAChD,GAAG,MAAM,CAAC,IAAI,IAAI;AAClB;AAAA,EACF;AACA,UAAQ,OAAO,MAAM,cAAc,cAAc,OAAO,MAAM,WAAW,CAAC;AAAA,CAAI;AAC9E,UAAQ,OAAO,MAAM,cAAc,cAAc,OAAO,OAAO,CAAC,MAAM,EAAE;AAAA,CAAK;AAC/E;AAEA,SAAS,UAAU,OAAqB,WAA+B,QAAsB;AAC3F,QAAM,cAAc,OAAO,aAAa,OAAO,SAAS,UAAa,OAAO,WAAW,OAAO;AAE9F,MAAI,eAAe,CAAC,OAAO,QAAQ;AACjC,UAAM,KAAK,aAAa,MAAM;AAC9B,QAAI;AACJ,QAAI;AACJ,QAAI,OAAO,SAAS;AAClB,cAAQ,EAAE,MAAM,UAAU;AAC1B,gBAAU;AAAA,IACZ,WAAW,OAAO,QAAQ;AACxB,cAAQ,EAAE,MAAM,SAAS;AACzB,gBAAU;AAAA,IACZ,OAAO;AACL,YAAMC,UAAS,iBAAiB,OAAO,SAAS;AAChD,cAAQ,EAAE,MAAM,UAAU,UAAUA,QAAO,GAAG;AAC9C,gBAAU,GAAGA,QAAO,IAAI,WAAM,aAAa,OAAOA,QAAO,UAAU,CAAC;AAAA,IACtE;AACA,UAAM,gBAAgB,EAAE,IAAI;AAC5B,uDAAkB,KAAK;AACvB,8DAAyB;AACzB,oDAAe,OAAO,EAAE;AACxB,YAAQ,OAAO,MAAM,cAAc,EAAE,MAAM,OAAO;AAAA,CAAI;AACtD;AAAA,EACF;AAGA,QAAM,SAAS,iBAAiB,OAAO,SAAS;AAChD,QAAM,cAAc,EAAE,MAAM,UAAU,UAAU,OAAO,GAAG;AAC1D,qDAAkB,KAAK;AACvB,4DAAyB;AACzB,kDAAe,OAAO,MAAS;AAC/B,UAAQ,OAAO,MAAM,WAAW,OAAO,IAAI,WAAM,aAAa,OAAO,OAAO,UAAU,CAAC;AAAA,CAAI;AAC7F;AAEA,SAAS,SAAS,OAAqB,QAAsB;AAC3D,QAAM,KAAK,aAAa,MAAM;AAC9B,4DAAyB;AACzB,kDAAe,OAAO,EAAE;AACxB,UAAQ,OAAO,MAAM,0BAAqB,cAAc,OAAO,MAAM,WAAW,CAAC;AAAA,CAAI;AACrF,UAAQ,OAAO,MAAM,wBAAwB,EAAE,MAAM,cAAc,OAAO,MAAM,gBAAgB,EAAE,CAAC,CAAC;AAAA,CAAI;AAC1G;AAEA,SAAS,UAAU,OAAqB,QAAsB;AAC5D,QAAM,MAAM,OAAO,UAAU,IAAI,YAAQ,wCAAW,KAAK;AACzD,QAAM,UAAU,KAAK,UAAU,KAAK,MAAM,CAAC,IAAI;AAC/C,MAAI,OAAO,KAAK;AACd,IAAG,iBAAc,OAAO,OAAO,GAAG,GAAG,SAAS,MAAM;AACpD,YAAQ,OAAO,MAAM,eAAe,OAAO,GAAG;AAAA,CAAI;AAAA,EACpD,OAAO;AACL,YAAQ,OAAO,MAAM,OAAO;AAAA,EAC9B;AACA,MAAI,CAAC,OAAO,UAAU,KAAK,QAAQ,SAAS,uCAAW,GAAG;AACxD,YAAQ,OAAO,MAAM,wCAAwC,uCAAW;AAAA,CAAyC;AAAA,EACnH;AACF;AAEA,SAAS,UAAU,KAAyB,QAAsB;AAChE,MAAI,CAAC,KAAK;AAAE,SAAK,8CAA8C;AAAA,EAAG;AAClE,MAAI;AACJ,MAAI;AACF,UAAM,QAAQ,MAAS,gBAAa,GAAG,MAAM,IAAO,gBAAa,KAAK,MAAM;AAAA,EAC9E,SAAS,KAAK;AACZ,SAAK,eAAe,GAAG,KAAK,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,EAAE;AAAA,EAChF;AAEA,MAAI;AACJ,MAAI;AACF,mBAAW,gDAAmB,GAAG;AAAA,EACnC,SAAS,KAAK;AACZ,SAAK,kBAAkB,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,EAAE;AAAA,EAC3E;AAEA,QAAM,OAAO,OAAO,OAAO,QAAQ,OAAO;AAC1C,MAAI,SAAS,WAAW,SAAS,WAAW;AAAE,SAAK,qCAAqC;AAAA,EAAG;AAE3F,MAAI,SAAS,WAAW;AACtB,UAAMC,aAAQ,4CAAe,QAAQ;AACrC,uDAAkBA,MAAK;AACvB,YAAQ,OAAO,MAAM,iCAAiC;AACtD;AAAA,EACF;AAEA,QAAM,YAAQ,oDAAmB,8CAAiB,GAAG,QAAQ;AAC7D,qDAAkB,KAAK;AACvB,UAAQ,OAAO;AAAA,IACb,YAAY,SAAS,QAAQ,MAAM,eAAe,SAAS,UAAU,MAAM,iBACxE,SAAS,UAAU,MAAM,kBAAkB,SAAS,gBAAgB,MAAM;AAAA;AAAA,EAC/E;AACA,QAAM,mBAAe,yDAA4B,KAAK;AACtD,MAAI,aAAa,SAAS,GAAG;AAC3B,YAAQ,OAAO,MAAM,kEAAkE,aAAa,KAAK,IAAI,CAAC;AAAA,CAAI;AAAA,EACpH;AACF;AAIA,SAAS,OAAa;AACpB,MAAI;AACJ,MAAI;AACF,aAAS,MAAM,QAAQ,KAAK,MAAM,CAAC,CAAC;AAAA,EACtC,SAAS,KAAK;AACZ,SAAK,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,EACvD;AACA,QAAM,EAAE,QAAQ,YAAY,IAAI;AAEhC,MAAI,OAAO,SAAS;AAAE,YAAQ,OAAO,MAAM,GAAG,OAAO;AAAA,CAAI;AAAG;AAAA,EAAQ;AAEpE,QAAM,UAAU,YAAY,CAAC;AAC7B,MAAI,CAAC,WAAW,OAAO,MAAM;AAAE,YAAQ,OAAO,MAAM,IAAI;AAAG;AAAA,EAAQ;AAEnE,QAAM,YAAQ,8CAAiB;AAE/B,UAAQ,SAAS;AAAA,IACf,KAAK;AAAY,cAAQ,OAAO,YAAY,CAAC,GAAG,MAAM;AAAG;AAAA,IACzD,KAAK;AAAY,iBAAW,OAAO,MAAM;AAAG;AAAA,IAC5C,KAAK;AAAY,gBAAU,OAAO,YAAY,CAAC,GAAG,MAAM;AAAG;AAAA,IAC3D,KAAK;AAAY,eAAS,OAAO,MAAM;AAAG;AAAA,IAC1C,KAAK;AAAY,gBAAU,OAAO,MAAM;AAAG;AAAA,IAC3C,KAAK;AAAY,gBAAU,YAAY,CAAC,GAAG,MAAM;AAAG;AAAA,IACpD,KAAK;AAAY,cAAQ,OAAO,MAAM,IAAI;AAAG;AAAA,IAC7C;AAAiB,WAAK,oBAAoB,OAAO,wBAAwB;AAAA,EAC3E;AACF;AAEA,KAAK;",
|
|
6
|
-
"names": ["exports", "exports", "ensureDefaults", "readProfileStore", "findPresetByNameOrId", "writeProfileStore", "fs", "path", "exports", "fs", "path", "exports", "fs", "path", "exports", "ensureOnboardingComplete", "fs", "path", "exports", "fs", "path", "exports", "applyAllScopes", "fs", "path", "exports", "scrubStore", "providersNeedingCredentials", "parseIncomingStore", "mergeIncomingStore", "exports", "exports", "module", "preset", "store"]
|
|
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", "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 } from './claudeJson';\nimport { writeProjectMcpServers } from './mcpJson';\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 let baseUrl = provider.proxyBaseUrl || '';\n // Strip trailing /v1 (users often paste the full endpoint URL)\n baseUrl = baseUrl.replace(/\\/v1\\/?$/, '').replace(/\\/+$/, '');\n // OpenRouter requires /api in the URL path\n if (/openrouter\\.ai/i.test(baseUrl) && !/\\/api\\b/i.test(baseUrl)) {\n baseUrl = baseUrl + '/api';\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 const mode = provider.proxyAuthMode\n ?? (provider.proxyAuthToken ? 'authtoken' : 'apikey'); // eslint-disable-line deprecation/deprecation\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 user-selected mode,\n // or neither when keyless. Login-prompt suppression is handled by\n // CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC (set below), not by a synthetic token.\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 }\n // keyless: write neither \u2014 disableLoginPrompt toggle controls prompt suppression\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 // Proxy defaults to disabled (most are local/non-Anthropic); explicit false overrides for\n // proxies that forward to Anthropic and need the login flow.\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 shouldDisableLoginPrompt =\n provider.type === 'bedrock' ||\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 // 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 './resolver';\nexport * from './transfer';\n", "{\n \"name\": \"@easytocloud/claude-personae\",\n \"version\": \"0.2.1\",\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 (default)\n --workspace, -w Set the preset for a workspace (uses CWD)\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 bedrock-prod # set global preset\n ccp switch dev --workspace # set preset for the current project\n ccp switch --workspace --inherit # project 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 toWorkspace = values.workspace || values.path !== undefined || values.inherit || values.manual;\n\n if (toWorkspace && !values.global) {\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 (default)\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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",
|
|
6
|
+
"names": ["exports", "exports", "ensureDefaults", "readProfileStore", "findPresetByNameOrId", "writeProfileStore", "fs", "path", "exports", "fs", "path", "exports", "fs", "path", "exports", "ensureOnboardingComplete", "fs", "path", "exports", "fs", "path", "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.1
|
|
3
|
+
"version": "0.2.1",
|
|
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": {
|