@ralphkrauss/codex-account-switcher 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.js ADDED
@@ -0,0 +1,285 @@
1
+ #!/usr/bin/env node
2
+ import { realpathSync } from 'node:fs';
3
+ import { readFile } from 'node:fs/promises';
4
+ import { fileURLToPath, pathToFileURL } from 'node:url';
5
+ import { CxError, authFileExists, getCodexPaths, inspectDoctor, listAccounts, loginAccount, removeAccount, renameAccount, runCodex, saveAccount, useAccount, validateAccountName, } from './index.js';
6
+ const PACKAGE_NAME = '@ralphkrauss/codex-account-switcher';
7
+ const SUBCOMMANDS = new Set([
8
+ 'doctor',
9
+ 'help',
10
+ 'login',
11
+ 'ls',
12
+ 'rename',
13
+ 'rm',
14
+ 'run',
15
+ 'save',
16
+ 'use',
17
+ ]);
18
+ function write(stream, text) {
19
+ stream.write(text.endsWith('\n') ? text : `${text}\n`);
20
+ }
21
+ async function readPackageMetadata() {
22
+ try {
23
+ const packageJson = JSON.parse(await readFile(new URL('../package.json', import.meta.url), 'utf8'));
24
+ return {
25
+ name: typeof packageJson.name === 'string' ? packageJson.name : PACKAGE_NAME,
26
+ version: typeof packageJson.version === 'string' ? packageJson.version : '0.0.0',
27
+ };
28
+ }
29
+ catch {
30
+ return { name: PACKAGE_NAME, version: '0.0.0' };
31
+ }
32
+ }
33
+ function helpText(metadata) {
34
+ return `cx ${metadata.version} — safe Codex CLI account switcher
35
+
36
+ Usage:
37
+ cx ls
38
+ cx save <name> [--force]
39
+ cx use <name>
40
+ cx login <name> [--force]
41
+ cx rename <old> <new> [--force]
42
+ cx rm <name>
43
+ cx run [name] -- [codex args...]
44
+ cx doctor [--json]
45
+ cx --help
46
+ cx --version
47
+
48
+ Backward-friendly shortcuts:
49
+ cx <account> [codex args...] switch to <account>, then run codex
50
+ cx run codex with the current auth.json when present
51
+
52
+ Data layout:
53
+ Uses CODEX_HOME when set, otherwise ~/.codex.
54
+ Accounts are stored as CODEX_HOME/accounts/<name>.json.
55
+ The active account marker is CODEX_HOME/.current-account.
56
+
57
+ Account names may contain letters, numbers, dot, underscore, and dash only.`;
58
+ }
59
+ function parseForceArgs(args) {
60
+ let force = false;
61
+ const positionals = [];
62
+ for (const arg of args) {
63
+ if (arg === '--force') {
64
+ force = true;
65
+ continue;
66
+ }
67
+ if (arg.startsWith('--')) {
68
+ throw new CxError(`unknown option '${arg}'`, 2);
69
+ }
70
+ positionals.push(arg);
71
+ }
72
+ return { force, positionals };
73
+ }
74
+ function requireArity(command, positionals, expected) {
75
+ if (positionals.length !== expected) {
76
+ throw new CxError(`usage: cx ${command}`, 2);
77
+ }
78
+ }
79
+ function formatAccounts(list) {
80
+ const lines = [`Codex accounts (home: ${list.home}):`];
81
+ if (list.accounts.length === 0) {
82
+ lines.push(' (none yet — run: cx save <name> to register the current login, or cx login <name>)');
83
+ }
84
+ else {
85
+ for (const account of list.accounts) {
86
+ lines.push(account.active ? ` * ${account.name} (active)` : ` ${account.name}`);
87
+ }
88
+ }
89
+ if (list.currentMarker.state === 'invalid') {
90
+ lines.push('warning: .current-account is invalid; writeback will be skipped until fixed.');
91
+ }
92
+ else if (list.currentMarker.state === 'valid' && list.current === null) {
93
+ lines.push(`warning: current marker '${list.currentMarker.name}' has no matching stored account.`);
94
+ }
95
+ return lines.join('\n');
96
+ }
97
+ function formatDoctor(report) {
98
+ const current = report.current.state === 'valid'
99
+ ? `${report.current.name ?? '(none)'} (${report.current.slotExists ? 'slot ok' : 'slot missing'})`
100
+ : report.current.state;
101
+ const lines = [
102
+ 'Codex Account Switcher doctor',
103
+ `package: ${report.packageName}@${report.version}`,
104
+ `node: ${report.nodeVersion}`,
105
+ `platform: ${report.platform}`,
106
+ `codex home: ${report.codexHome}`,
107
+ `home exists: ${report.homeExists ? 'yes' : 'no'}`,
108
+ `accounts dir: ${report.accountsDir}`,
109
+ `accounts dir exists: ${report.accountsDirExists ? 'yes' : 'no'}`,
110
+ `accounts: ${report.accounts.length === 0 ? '(none)' : report.accounts.join(', ')}`,
111
+ `current account: ${current}`,
112
+ `auth.json: ${report.authJson.exists ? `${report.authJson.size} bytes (${report.authJson.looksNonEmpty ? 'usable for save/writeback' : 'too small for save/writeback'})` : 'missing'}`,
113
+ `codex executable: ${report.codexExecutable ?? 'not found'}`,
114
+ ];
115
+ if (report.current.reason) {
116
+ lines.push(`current marker note: ${report.current.reason}`);
117
+ }
118
+ if (report.warnings.length > 0) {
119
+ lines.push('warnings:');
120
+ for (const warning of report.warnings) {
121
+ lines.push(` - ${warning}`);
122
+ }
123
+ }
124
+ return lines.join('\n');
125
+ }
126
+ async function printList(io, env) {
127
+ write(io.stdout, formatAccounts(await listAccounts(getCodexPaths(env))));
128
+ }
129
+ function parseRunArgs(args) {
130
+ const separatorIndex = args.indexOf('--');
131
+ if (separatorIndex >= 0) {
132
+ const beforeSeparator = args.slice(0, separatorIndex);
133
+ if (beforeSeparator.length > 1) {
134
+ throw new CxError('usage: cx run [name] -- [codex args...]', 2);
135
+ }
136
+ return {
137
+ account: beforeSeparator[0] ?? null,
138
+ codexArgs: args.slice(separatorIndex + 1),
139
+ };
140
+ }
141
+ if (args.length === 0) {
142
+ return { account: null, codexArgs: [] };
143
+ }
144
+ const [account, ...codexArgs] = args;
145
+ if (!account || account.startsWith('-')) {
146
+ throw new CxError("usage: cx run [name] -- [codex args...] (use '--' before codex flags)", 2);
147
+ }
148
+ return { account, codexArgs };
149
+ }
150
+ export async function main(argv = process.argv.slice(2), env = process.env, io = { stdout: process.stdout, stderr: process.stderr }) {
151
+ const metadata = await readPackageMetadata();
152
+ const [first, ...rest] = argv;
153
+ if (first === '--help' || first === '-h' || first === 'help') {
154
+ write(io.stdout, helpText(metadata));
155
+ return 0;
156
+ }
157
+ if (first === '--version' || first === '-v') {
158
+ write(io.stdout, metadata.version);
159
+ return 0;
160
+ }
161
+ if (!first) {
162
+ const paths = getCodexPaths(env);
163
+ if (await authFileExists(paths)) {
164
+ return await runCodex([], { env });
165
+ }
166
+ write(io.stdout, helpText(metadata));
167
+ write(io.stdout, '');
168
+ write(io.stdout, `No live auth.json found at ${paths.authFile}.`);
169
+ write(io.stdout, 'Use cx ls, cx use <name>, cx save <name>, or cx login <name>.');
170
+ write(io.stdout, '');
171
+ write(io.stdout, formatAccounts(await listAccounts(paths)));
172
+ return 0;
173
+ }
174
+ if (!SUBCOMMANDS.has(first)) {
175
+ if (first.startsWith('-')) {
176
+ throw new CxError(`unknown option '${first}'`, 2);
177
+ }
178
+ validateAccountName(first);
179
+ await useAccount(first, { paths: getCodexPaths(env) });
180
+ write(io.stdout, `→ codex on '${first}'`);
181
+ return await runCodex(rest, { env });
182
+ }
183
+ switch (first) {
184
+ case 'ls': {
185
+ if (rest.length > 0) {
186
+ throw new CxError('usage: cx ls', 2);
187
+ }
188
+ await printList(io, env);
189
+ return 0;
190
+ }
191
+ case 'save': {
192
+ const parsed = parseForceArgs(rest);
193
+ requireArity('save <name> [--force]', parsed.positionals, 1);
194
+ const name = parsed.positionals[0] ?? '';
195
+ await saveAccount(name, { force: parsed.force, paths: getCodexPaths(env) });
196
+ write(io.stdout, `saved current login as '${name}'`);
197
+ return 0;
198
+ }
199
+ case 'use': {
200
+ requireArity('use <name>', rest, 1);
201
+ const name = rest[0] ?? '';
202
+ await useAccount(name, { paths: getCodexPaths(env) });
203
+ write(io.stdout, `active codex account: ${name}`);
204
+ return 0;
205
+ }
206
+ case 'login': {
207
+ const parsed = parseForceArgs(rest);
208
+ requireArity('login <name> [--force]', parsed.positionals, 1);
209
+ const name = parsed.positionals[0] ?? '';
210
+ await loginAccount(name, { force: parsed.force, env, paths: getCodexPaths(env) });
211
+ write(io.stdout, `logged in and saved as '${name}'`);
212
+ return 0;
213
+ }
214
+ case 'rename': {
215
+ const parsed = parseForceArgs(rest);
216
+ requireArity('rename <old> <new> [--force]', parsed.positionals, 2);
217
+ const oldName = parsed.positionals[0] ?? '';
218
+ const newName = parsed.positionals[1] ?? '';
219
+ await renameAccount(oldName, newName, { force: parsed.force, paths: getCodexPaths(env) });
220
+ write(io.stdout, `renamed '${oldName}' -> '${newName}'`);
221
+ return 0;
222
+ }
223
+ case 'rm': {
224
+ requireArity('rm <name>', rest, 1);
225
+ const name = rest[0] ?? '';
226
+ const result = await removeAccount(name, { paths: getCodexPaths(env) });
227
+ write(io.stdout, `removed '${name}'`);
228
+ if (result.wasActive) {
229
+ write(io.stderr, `warning: '${name}' was active; live auth.json was left in place until you switch or login.`);
230
+ }
231
+ return 0;
232
+ }
233
+ case 'run': {
234
+ const parsed = parseRunArgs(rest);
235
+ if (parsed.account) {
236
+ await useAccount(parsed.account, { paths: getCodexPaths(env) });
237
+ write(io.stdout, `→ codex on '${parsed.account}'`);
238
+ }
239
+ return await runCodex(parsed.codexArgs, { env });
240
+ }
241
+ case 'doctor': {
242
+ const json = rest.length === 1 && rest[0] === '--json';
243
+ if (rest.length > (json ? 1 : 0)) {
244
+ throw new CxError('usage: cx doctor [--json]', 2);
245
+ }
246
+ const report = await inspectDoctor({ packageName: metadata.name, version: metadata.version }, env);
247
+ write(io.stdout, json ? JSON.stringify(report, null, 2) : formatDoctor(report));
248
+ return 0;
249
+ }
250
+ default:
251
+ throw new CxError(`unknown command '${first}'`, 2);
252
+ }
253
+ }
254
+ function isEntrypoint() {
255
+ const invokedPath = process.argv[1];
256
+ if (!invokedPath) {
257
+ return false;
258
+ }
259
+ try {
260
+ return realpathSync(invokedPath) === realpathSync(fileURLToPath(import.meta.url));
261
+ }
262
+ catch {
263
+ return import.meta.url === pathToFileURL(invokedPath).href;
264
+ }
265
+ }
266
+ if (isEntrypoint()) {
267
+ try {
268
+ process.exitCode = await main();
269
+ }
270
+ catch (error) {
271
+ if (error instanceof CxError) {
272
+ write(process.stderr, error.message);
273
+ process.exitCode = error.exitCode;
274
+ }
275
+ else if (error instanceof Error) {
276
+ write(process.stderr, error.message);
277
+ process.exitCode = 1;
278
+ }
279
+ else {
280
+ write(process.stderr, String(error));
281
+ process.exitCode = 1;
282
+ }
283
+ }
284
+ }
285
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export { ACCOUNT_NAME_PATTERN, AUTH_NON_EMPTY_BYTES, CxError, accountPathForName, authFileExists, authLooksNonEmpty, getCodexHome, getCodexPaths, inspectDoctor, listAccountNames, listAccounts, loginAccount, readCurrentMarker, removeAccount, renameAccount, resolveExecutable, runCodex, saveAccount, switchAndRunCodex, useAccount, validateAccountName, writebackCurrentAccount, } from './accounts.js';
2
+ export type { AccountEntry, AccountList, CodexPaths, CurrentMarker, DoctorReport, ForceOptions, OperationOptions, RemoveResult, RenameResult, SpawnCodexOptions, WritebackResult, } from './accounts.js';
package/dist/index.js ADDED
@@ -0,0 +1,2 @@
1
+ export { ACCOUNT_NAME_PATTERN, AUTH_NON_EMPTY_BYTES, CxError, accountPathForName, authFileExists, authLooksNonEmpty, getCodexHome, getCodexPaths, inspectDoctor, listAccountNames, listAccounts, loginAccount, readCurrentMarker, removeAccount, renameAccount, resolveExecutable, runCodex, saveAccount, switchAndRunCodex, useAccount, validateAccountName, writebackCurrentAccount, } from './accounts.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,OAAO,EACP,kBAAkB,EAClB,cAAc,EACd,iBAAiB,EACjB,YAAY,EACZ,aAAa,EACb,aAAa,EACb,gBAAgB,EAChB,YAAY,EACZ,YAAY,EACZ,iBAAiB,EACjB,aAAa,EACb,aAAa,EACb,iBAAiB,EACjB,QAAQ,EACR,WAAW,EACX,iBAAiB,EACjB,UAAU,EACV,mBAAmB,EACnB,uBAAuB,GACxB,MAAM,eAAe,CAAC"}
package/package.json ADDED
@@ -0,0 +1,69 @@
1
+ {
2
+ "name": "@ralphkrauss/codex-account-switcher",
3
+ "version": "0.1.0",
4
+ "description": "Safe multi-account auth.json switcher for the native Codex CLI.",
5
+ "author": "Ralph Krauss <ralph@krauss.be>",
6
+ "type": "module",
7
+ "main": "dist/index.js",
8
+ "types": "dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.js"
13
+ },
14
+ "./package.json": "./package.json"
15
+ },
16
+ "bin": {
17
+ "cx": "dist/cli.js"
18
+ },
19
+ "scripts": {
20
+ "build": "node scripts/clean-dist.mjs && tsc",
21
+ "test": "node --test dist/__tests__/*.test.js",
22
+ "audit:prod": "pnpm audit --prod",
23
+ "verify": "pnpm build && pnpm test && node scripts/check-publish-ready.mjs && node scripts/resolve-publish-tag.mjs >/dev/null && pnpm audit --prod && npm pack --dry-run",
24
+ "prepack": "pnpm build",
25
+ "pack:dry-run": "npm pack --dry-run"
26
+ },
27
+ "files": [
28
+ "dist/",
29
+ "src/",
30
+ "!dist/__tests__/",
31
+ "!src/__tests__/",
32
+ "README.md",
33
+ "CHANGELOG.md",
34
+ "CONTRIBUTING.md",
35
+ "SECURITY.md",
36
+ "SUPPORT.md",
37
+ "PUBLISHING.md",
38
+ "LICENSE.md"
39
+ ],
40
+ "engines": {
41
+ "node": ">=22"
42
+ },
43
+ "repository": {
44
+ "type": "git",
45
+ "url": "git+https://github.com/ralphkrauss/codex-account-switcher.git"
46
+ },
47
+ "bugs": {
48
+ "url": "https://github.com/ralphkrauss/codex-account-switcher/issues"
49
+ },
50
+ "homepage": "https://github.com/ralphkrauss/codex-account-switcher#readme",
51
+ "license": "MIT",
52
+ "keywords": [
53
+ "codex",
54
+ "codex-cli",
55
+ "account-switcher",
56
+ "auth",
57
+ "cli",
58
+ "typescript",
59
+ "nodejs"
60
+ ],
61
+ "publishConfig": {
62
+ "access": "public"
63
+ },
64
+ "devDependencies": {
65
+ "@types/node": "^22.15.18",
66
+ "typescript": "^5.9.3"
67
+ },
68
+ "packageManager": "pnpm@10.30.3"
69
+ }