diff --git a/claude-code/bundle/commands/auth-login.js b/claude-code/bundle/commands/auth-login.js index 0b2edef..ba08f32 100755 --- a/claude-code/bundle/commands/auth-login.js +++ b/claude-code/bundle/commands/auth-login.js @@ -1,7 +1,7 @@ #!/usr/bin/env node // dist/src/commands/auth.js -import { readFileSync, writeFileSync, existsSync, mkdirSync } from "node:fs"; +import { readFileSync, writeFileSync, existsSync, mkdirSync, unlinkSync } from "node:fs"; import { join } from "node:path"; import { homedir } from "node:os"; import { execSync } from "node:child_process"; @@ -22,6 +22,13 @@ function saveCredentials(creds) { mkdirSync(CONFIG_DIR, { recursive: true, mode: 448 }); writeFileSync(CREDS_PATH, JSON.stringify({ ...creds, savedAt: (/* @__PURE__ */ new Date()).toISOString() }, null, 2), { mode: 384 }); } +function deleteCredentials() { + if (existsSync(CREDS_PATH)) { + unlinkSync(CREDS_PATH); + return true; + } + return false; +} async function apiGet(path, token, apiUrl, orgId) { const headers = { Authorization: `Bearer ${token}`, @@ -722,8 +729,16 @@ async function main() { } break; } + case "logout": { + if (deleteCredentials()) { + console.log("Logged out. Credentials removed."); + } else { + console.log("Not logged in."); + } + break; + } default: - console.log("Commands: login, whoami, org list, org switch, workspaces, workspace, sessions prune, invite, members, remove, autoupdate"); + console.log("Commands: login, logout, whoami, org list, org switch, workspaces, workspace, sessions prune, invite, members, remove, autoupdate"); } } main().catch((e) => { diff --git a/claude-code/bundle/session-start.js b/claude-code/bundle/session-start.js index e022424..600faa9 100755 --- a/claude-code/bundle/session-start.js +++ b/claude-code/bundle/session-start.js @@ -8,7 +8,7 @@ import { execSync as execSync2 } from "node:child_process"; import { homedir as homedir4 } from "node:os"; // dist/src/commands/auth.js -import { readFileSync, writeFileSync, existsSync, mkdirSync } from "node:fs"; +import { readFileSync, writeFileSync, existsSync, mkdirSync, unlinkSync } from "node:fs"; import { join } from "node:path"; import { homedir } from "node:os"; import { execSync } from "node:child_process"; diff --git a/src/commands/auth-login.ts b/src/commands/auth-login.ts index 29bc677..e024af7 100644 --- a/src/commands/auth-login.ts +++ b/src/commands/auth-login.ts @@ -5,6 +5,7 @@ * * Usage: * node auth-login.js login — device flow login + * node auth-login.js logout — remove credentials * node auth-login.js org list — list orgs * node auth-login.js org switch — switch org * node auth-login.js workspaces — list workspaces @@ -18,7 +19,7 @@ */ import { - login, loadCredentials, saveCredentials, listOrgs, switchOrg, + login, loadCredentials, saveCredentials, deleteCredentials, listOrgs, switchOrg, listWorkspaces, switchWorkspace, inviteMember, listMembers, removeMember, } from "./auth.js"; @@ -134,8 +135,17 @@ async function main(): Promise { break; } + case "logout": { + if (deleteCredentials()) { + console.log("Logged out. Credentials removed."); + } else { + console.log("Not logged in."); + } + break; + } + default: - console.log("Commands: login, whoami, org list, org switch, workspaces, workspace, sessions prune, invite, members, remove, autoupdate"); + console.log("Commands: login, logout, whoami, org list, org switch, workspaces, workspace, sessions prune, invite, members, remove, autoupdate"); } } diff --git a/src/commands/auth.ts b/src/commands/auth.ts index d07ca4a..1519f58 100644 --- a/src/commands/auth.ts +++ b/src/commands/auth.ts @@ -3,7 +3,7 @@ * and org/workspace management. */ -import { readFileSync, writeFileSync, existsSync, mkdirSync } from "node:fs"; +import { readFileSync, writeFileSync, existsSync, mkdirSync, unlinkSync } from "node:fs"; import { join } from "node:path"; import { homedir } from "node:os"; import { execSync } from "node:child_process"; @@ -60,6 +60,14 @@ export function saveCredentials(creds: Credentials): void { writeFileSync(CREDS_PATH, JSON.stringify({ ...creds, savedAt: new Date().toISOString() }, null, 2), { mode: 0o600 }); } +export function deleteCredentials(): boolean { + if (existsSync(CREDS_PATH)) { + unlinkSync(CREDS_PATH); + return true; + } + return false; +} + // ── JWT Helpers ────────────────────────────────────────────────────────────── export function decodeJwtPayload(token: string): Record | null {