@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/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
+ }