@hepheastus-devkit/claude-switch 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +162 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +331 -0
- package/dist/cli.js.map +1 -0
- package/dist/profileManager.d.ts +33 -0
- package/dist/profileManager.js +997 -0
- package/dist/profileManager.js.map +1 -0
- package/dist/registry.d.ts +57 -0
- package/dist/registry.js +118 -0
- package/dist/registry.js.map +1 -0
- package/dist/secureStore.d.ts +9 -0
- package/dist/secureStore.js +118 -0
- package/dist/secureStore.js.map +1 -0
- package/dist/utils.d.ts +66 -0
- package/dist/utils.js +239 -0
- package/dist/utils.js.map +1 -0
- package/package.json +63 -0
package/dist/utils.js
ADDED
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.ALIASES_FILE = exports.CONFIG_SUBDIR = exports.APIKEY_FILE = exports.METADATA_FILE = exports.CREDENTIALS_FILE = exports.APPDATA_CLAUDE_DIR = exports.APIKEY_PS_FILE = exports.APIKEY_ENV_FILE = exports.PROFILES_DIR = exports.SWITCH_DIR = void 0;
|
|
7
|
+
exports.getActiveClaudeDir = getActiveClaudeDir;
|
|
8
|
+
exports.ensureDir = ensureDir;
|
|
9
|
+
exports.ensureClaudeDir = ensureClaudeDir;
|
|
10
|
+
exports.getProfileDir = getProfileDir;
|
|
11
|
+
exports.sanitizeProfileName = sanitizeProfileName;
|
|
12
|
+
exports.profileExists = profileExists;
|
|
13
|
+
exports.readApiKeyFromProfile = readApiKeyFromProfile;
|
|
14
|
+
exports.saveApiKeyToProfile = saveApiKeyToProfile;
|
|
15
|
+
exports.copyCredentials = copyCredentials;
|
|
16
|
+
exports.logSuccess = logSuccess;
|
|
17
|
+
exports.logInfo = logInfo;
|
|
18
|
+
exports.logWarn = logWarn;
|
|
19
|
+
exports.logError = logError;
|
|
20
|
+
exports.resolveClaudeBin = resolveClaudeBin;
|
|
21
|
+
exports.launchClaudeWithConfigDir = launchClaudeWithConfigDir;
|
|
22
|
+
exports.loadAliases = loadAliases;
|
|
23
|
+
exports.saveAliases = saveAliases;
|
|
24
|
+
exports.formatApiKeyExport = formatApiKeyExport;
|
|
25
|
+
exports.writeShellEnvFiles = writeShellEnvFiles;
|
|
26
|
+
const os_1 = __importDefault(require("os"));
|
|
27
|
+
const path_1 = __importDefault(require("path"));
|
|
28
|
+
const fs_extra_1 = __importDefault(require("fs-extra"));
|
|
29
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
30
|
+
const child_process_1 = require("child_process");
|
|
31
|
+
const secureStore_1 = require("./secureStore");
|
|
32
|
+
exports.SWITCH_DIR = path_1.default.join(os_1.default.homedir(), '.claude-switch');
|
|
33
|
+
exports.PROFILES_DIR = path_1.default.join(exports.SWITCH_DIR, 'profiles');
|
|
34
|
+
/** File used to persist the current account's API key for shell sourcing */
|
|
35
|
+
exports.APIKEY_ENV_FILE = path_1.default.join(exports.SWITCH_DIR, 'current-apikey.env');
|
|
36
|
+
exports.APIKEY_PS_FILE = path_1.default.join(exports.SWITCH_DIR, 'current-apikey.ps1');
|
|
37
|
+
/** Electron app data dir for Claude (contains IndexedDB / Local Storage) */
|
|
38
|
+
exports.APPDATA_CLAUDE_DIR = process.env.APPDATA
|
|
39
|
+
? path_1.default.join(process.env.APPDATA, 'Claude')
|
|
40
|
+
: path_1.default.join(os_1.default.homedir(), '.config', 'Claude'); // fallback for Linux/macOS
|
|
41
|
+
function getActiveClaudeDir() {
|
|
42
|
+
// Respect official override first
|
|
43
|
+
if (process.env.CLAUDE_CONFIG_DIR) {
|
|
44
|
+
return process.env.CLAUDE_CONFIG_DIR;
|
|
45
|
+
}
|
|
46
|
+
return path_1.default.join(os_1.default.homedir(), '.claude');
|
|
47
|
+
}
|
|
48
|
+
async function ensureDir(dir) {
|
|
49
|
+
await fs_extra_1.default.ensureDir(dir);
|
|
50
|
+
}
|
|
51
|
+
async function ensureClaudeDir() {
|
|
52
|
+
const claudeDir = getActiveClaudeDir();
|
|
53
|
+
await fs_extra_1.default.ensureDir(claudeDir);
|
|
54
|
+
await ensureDir(exports.SWITCH_DIR);
|
|
55
|
+
await ensureDir(exports.PROFILES_DIR);
|
|
56
|
+
}
|
|
57
|
+
function getProfileDir(name) {
|
|
58
|
+
// Sanitize name lightly
|
|
59
|
+
const safe = name.replace(/[^a-zA-Z0-9_-]/g, '_');
|
|
60
|
+
return path_1.default.join(exports.PROFILES_DIR, safe);
|
|
61
|
+
}
|
|
62
|
+
/** Returns the sanitized directory name for a given profile name */
|
|
63
|
+
function sanitizeProfileName(name) {
|
|
64
|
+
return name.replace(/[^a-zA-Z0-9_-]/g, '_');
|
|
65
|
+
}
|
|
66
|
+
async function profileExists(name) {
|
|
67
|
+
return fs_extra_1.default.pathExists(getProfileDir(name));
|
|
68
|
+
}
|
|
69
|
+
exports.CREDENTIALS_FILE = '.credentials.json';
|
|
70
|
+
exports.METADATA_FILE = 'profile.json';
|
|
71
|
+
exports.APIKEY_FILE = 'apikey.json';
|
|
72
|
+
/** Read the stored API key for a profile, or null if not set */
|
|
73
|
+
async function readApiKeyFromProfile(name) {
|
|
74
|
+
const p = path_1.default.join(getProfileDir(name), exports.APIKEY_FILE);
|
|
75
|
+
if (await fs_extra_1.default.pathExists(p)) {
|
|
76
|
+
try {
|
|
77
|
+
const entry = await fs_extra_1.default.readJson(p);
|
|
78
|
+
if (!entry.key)
|
|
79
|
+
return null;
|
|
80
|
+
// Transparent decryption
|
|
81
|
+
return (0, secureStore_1.decrypt)(entry.key);
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
return null;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
return null;
|
|
88
|
+
}
|
|
89
|
+
/** Save an API key into a profile directory */
|
|
90
|
+
async function saveApiKeyToProfile(name, key, note) {
|
|
91
|
+
// Transparent encryption
|
|
92
|
+
const encryptedKey = (0, secureStore_1.encrypt)(key);
|
|
93
|
+
const entry = {
|
|
94
|
+
key: encryptedKey,
|
|
95
|
+
addedAt: new Date().toISOString(),
|
|
96
|
+
...(note ? { note } : {}),
|
|
97
|
+
};
|
|
98
|
+
await fs_extra_1.default.writeJson(path_1.default.join(getProfileDir(name), exports.APIKEY_FILE), entry, { spaces: 2 });
|
|
99
|
+
}
|
|
100
|
+
async function copyCredentials(fromDir, toDir) {
|
|
101
|
+
const fromCred = path_1.default.join(fromDir, exports.CREDENTIALS_FILE);
|
|
102
|
+
const toCred = path_1.default.join(toDir, exports.CREDENTIALS_FILE);
|
|
103
|
+
if (await fs_extra_1.default.pathExists(fromCred)) {
|
|
104
|
+
await fs_extra_1.default.copy(fromCred, toCred, { overwrite: true });
|
|
105
|
+
return true;
|
|
106
|
+
}
|
|
107
|
+
return false;
|
|
108
|
+
}
|
|
109
|
+
function logSuccess(msg) {
|
|
110
|
+
console.log(chalk_1.default.green('✓ ' + msg));
|
|
111
|
+
}
|
|
112
|
+
function logInfo(msg) {
|
|
113
|
+
console.log(chalk_1.default.cyan(msg));
|
|
114
|
+
}
|
|
115
|
+
function logWarn(msg) {
|
|
116
|
+
console.log(chalk_1.default.yellow('⚠ ' + msg));
|
|
117
|
+
}
|
|
118
|
+
function logError(msg) {
|
|
119
|
+
console.error(chalk_1.default.red('✗ ' + msg));
|
|
120
|
+
}
|
|
121
|
+
// For full isolation profiles
|
|
122
|
+
exports.CONFIG_SUBDIR = 'config';
|
|
123
|
+
/**
|
|
124
|
+
* Resolve the actual claude binary path.
|
|
125
|
+
* On Windows, tries claude.cmd first (npm global), then claude.exe, then claude.
|
|
126
|
+
* Falls back gracefully to just 'claude' with shell:true.
|
|
127
|
+
*/
|
|
128
|
+
function resolveClaudeBin() {
|
|
129
|
+
if (process.platform === 'win32') {
|
|
130
|
+
const candidates = ['claude.cmd', 'claude.exe', 'claude'];
|
|
131
|
+
for (const bin of candidates) {
|
|
132
|
+
try {
|
|
133
|
+
(0, child_process_1.execFileSync)('where', [bin], { stdio: 'pipe' });
|
|
134
|
+
return bin;
|
|
135
|
+
}
|
|
136
|
+
catch {
|
|
137
|
+
// not found, try next
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
else {
|
|
142
|
+
try {
|
|
143
|
+
(0, child_process_1.execFileSync)('which', ['claude'], { stdio: 'pipe' });
|
|
144
|
+
return 'claude';
|
|
145
|
+
}
|
|
146
|
+
catch {
|
|
147
|
+
// not in PATH, fall through
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
// Final fallback: let the shell resolve it
|
|
151
|
+
return 'claude';
|
|
152
|
+
}
|
|
153
|
+
// Spawn claude with custom config dir (for run command)
|
|
154
|
+
function launchClaudeWithConfigDir(configDir, extraArgs = []) {
|
|
155
|
+
const env = { ...process.env, CLAUDE_CONFIG_DIR: configDir };
|
|
156
|
+
console.log(chalk_1.default.cyan(`Launching claude with CLAUDE_CONFIG_DIR=${configDir}`));
|
|
157
|
+
logInfo('This will start a fully isolated Claude session for the profile.');
|
|
158
|
+
const claudeBin = resolveClaudeBin();
|
|
159
|
+
const child = (0, child_process_1.spawn)(claudeBin, extraArgs, {
|
|
160
|
+
stdio: 'inherit',
|
|
161
|
+
env,
|
|
162
|
+
shell: true, // important for global npm bins on Windows/PowerShell
|
|
163
|
+
});
|
|
164
|
+
child.on('error', (err) => {
|
|
165
|
+
logError(`Failed to launch claude: ${err.message}`);
|
|
166
|
+
logInfo('Make sure "claude" is installed and in PATH (npm i -g @anthropic-ai/claude-code or similar).');
|
|
167
|
+
});
|
|
168
|
+
child.on('close', (code) => {
|
|
169
|
+
if (code !== 0) {
|
|
170
|
+
logWarn(`Claude exited with code ${code}`);
|
|
171
|
+
}
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
// Simple alias storage
|
|
175
|
+
exports.ALIASES_FILE = path_1.default.join(exports.SWITCH_DIR, 'aliases.json');
|
|
176
|
+
async function loadAliases() {
|
|
177
|
+
if (await fs_extra_1.default.pathExists(exports.ALIASES_FILE)) {
|
|
178
|
+
return fs_extra_1.default.readJson(exports.ALIASES_FILE).catch(() => ({}));
|
|
179
|
+
}
|
|
180
|
+
return {};
|
|
181
|
+
}
|
|
182
|
+
async function saveAliases(aliases) {
|
|
183
|
+
await ensureDir(exports.SWITCH_DIR);
|
|
184
|
+
await fs_extra_1.default.writeJson(exports.ALIASES_FILE, aliases, { spaces: 2 });
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Generate a shell-sourceable env line for the current API key.
|
|
188
|
+
* Works for bash/zsh/fish-compatible shells.
|
|
189
|
+
*/
|
|
190
|
+
function formatApiKeyExport(key) {
|
|
191
|
+
if (process.platform === 'win32') {
|
|
192
|
+
// PowerShell
|
|
193
|
+
return `$env:ANTHROPIC_API_KEY="${key}"`;
|
|
194
|
+
}
|
|
195
|
+
// bash/zsh
|
|
196
|
+
return `export ANTHROPIC_API_KEY="${key}"`;
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Writes both bash/zsh env file and powershell env file containing
|
|
200
|
+
* environment exports/unsets for the active profile settings.
|
|
201
|
+
*/
|
|
202
|
+
async function writeShellEnvFiles(apiKey, apiUrl, proxy) {
|
|
203
|
+
let envContent = '';
|
|
204
|
+
let psContent = '';
|
|
205
|
+
// API Key
|
|
206
|
+
if (apiKey) {
|
|
207
|
+
envContent += `export ANTHROPIC_API_KEY="${apiKey}"\n`;
|
|
208
|
+
psContent += `$env:ANTHROPIC_API_KEY="${apiKey}"\n`;
|
|
209
|
+
}
|
|
210
|
+
else {
|
|
211
|
+
envContent += `unset ANTHROPIC_API_KEY\n`;
|
|
212
|
+
psContent += `Remove-Item Env:\\ANTHROPIC_API_KEY -ErrorAction SilentlyContinue\n`;
|
|
213
|
+
}
|
|
214
|
+
// Base URL
|
|
215
|
+
if (apiUrl) {
|
|
216
|
+
envContent += `export ANTHROPIC_BASE_URL="${apiUrl}"\n`;
|
|
217
|
+
psContent += `$env:ANTHROPIC_BASE_URL="${apiUrl}"\n`;
|
|
218
|
+
}
|
|
219
|
+
else {
|
|
220
|
+
envContent += `unset ANTHROPIC_BASE_URL\n`;
|
|
221
|
+
psContent += `Remove-Item Env:\\ANTHROPIC_BASE_URL -ErrorAction SilentlyContinue\n`;
|
|
222
|
+
}
|
|
223
|
+
// Proxy settings
|
|
224
|
+
if (proxy) {
|
|
225
|
+
envContent += `export HTTPS_PROXY="${proxy}"\n`;
|
|
226
|
+
envContent += `export HTTP_PROXY="${proxy}"\n`;
|
|
227
|
+
psContent += `$env:HTTPS_PROXY="${proxy}"\n`;
|
|
228
|
+
psContent += `$env:HTTP_PROXY="${proxy}"\n`;
|
|
229
|
+
}
|
|
230
|
+
else {
|
|
231
|
+
envContent += `unset HTTPS_PROXY\n`;
|
|
232
|
+
envContent += `unset HTTP_PROXY\n`;
|
|
233
|
+
psContent += `Remove-Item Env:\\HTTPS_PROXY -ErrorAction SilentlyContinue\n`;
|
|
234
|
+
psContent += `Remove-Item Env:\\HTTP_PROXY -ErrorAction SilentlyContinue\n`;
|
|
235
|
+
}
|
|
236
|
+
await fs_extra_1.default.writeFile(exports.APIKEY_ENV_FILE, envContent, 'utf8');
|
|
237
|
+
await fs_extra_1.default.writeFile(exports.APIKEY_PS_FILE, psContent, 'utf8');
|
|
238
|
+
}
|
|
239
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@hepheastus-devkit/claude-switch",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Terminal-first multi-account switcher for Claude Code. codex-auth style experience: flexible switch by number/name/alias, interactive picker, full isolation launches, aliases, export/import. Works great on Windows.",
|
|
5
|
+
"bin": {
|
|
6
|
+
"claude-switch": "dist/cli.js",
|
|
7
|
+
"csw": "dist/cli.js"
|
|
8
|
+
},
|
|
9
|
+
"files": [
|
|
10
|
+
"dist",
|
|
11
|
+
"README.md"
|
|
12
|
+
],
|
|
13
|
+
"scripts": {
|
|
14
|
+
"build": "tsc",
|
|
15
|
+
"dev": "ts-node src/cli.ts",
|
|
16
|
+
"start": "node dist/cli.js",
|
|
17
|
+
"watch": "tsc --watch",
|
|
18
|
+
"clean": "rimraf dist",
|
|
19
|
+
"prepare": "npm run build",
|
|
20
|
+
"prepublishOnly": "npm run clean && npm run build"
|
|
21
|
+
},
|
|
22
|
+
"keywords": [
|
|
23
|
+
"claude",
|
|
24
|
+
"claude-code",
|
|
25
|
+
"anthropic",
|
|
26
|
+
"account",
|
|
27
|
+
"switch",
|
|
28
|
+
"multi-account",
|
|
29
|
+
"auth",
|
|
30
|
+
"oauth"
|
|
31
|
+
],
|
|
32
|
+
"private": false,
|
|
33
|
+
"publishConfig": {
|
|
34
|
+
"access": "public"
|
|
35
|
+
},
|
|
36
|
+
"repository": {
|
|
37
|
+
"type": "git",
|
|
38
|
+
"url": "git+https://github.com/Hephaestus-DevKit/claude-switch.git"
|
|
39
|
+
},
|
|
40
|
+
"bugs": {
|
|
41
|
+
"url": "https://github.com/Hephaestus-DevKit/claude-switch/issues"
|
|
42
|
+
},
|
|
43
|
+
"homepage": "https://github.com/Hephaestus-DevKit/claude-switch#readme",
|
|
44
|
+
"license": "MIT",
|
|
45
|
+
"dependencies": {
|
|
46
|
+
"chalk": "^5.3.0",
|
|
47
|
+
"commander": "^12.1.0",
|
|
48
|
+
"fs-extra": "^11.2.0",
|
|
49
|
+
"inquirer": "^9.3.6",
|
|
50
|
+
"ora": "^8.0.1"
|
|
51
|
+
},
|
|
52
|
+
"devDependencies": {
|
|
53
|
+
"@types/fs-extra": "^11.0.4",
|
|
54
|
+
"@types/inquirer": "^9.0.7",
|
|
55
|
+
"@types/node": "^20.14.0",
|
|
56
|
+
"rimraf": "^5.0.7",
|
|
57
|
+
"ts-node": "^10.9.2",
|
|
58
|
+
"typescript": "^5.4.5"
|
|
59
|
+
},
|
|
60
|
+
"engines": {
|
|
61
|
+
"node": ">=18.0.0"
|
|
62
|
+
}
|
|
63
|
+
}
|