@siamriaz/octomux 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/LICENSE +21 -0
- package/README.md +272 -0
- package/dist/bin/octomux.d.ts +1 -0
- package/dist/bin/octomux.js +22 -0
- package/dist/bin/octomux.js.map +1 -0
- package/dist/chunk-3NCQOE6V.js +1957 -0
- package/dist/chunk-3NCQOE6V.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/package.json +68 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/commands/account/add.ts","../src/core/account-manager.ts","../src/core/config-store.ts","../src/platform/paths.ts","../src/types/config.ts","../src/types/account.ts","../src/core/ssh-service.ts","../src/platform/permissions.ts","../src/core/git-service.ts","../src/ui/prompts.ts","../src/ui/logger.ts","../src/ui/formatters.ts","../src/ui/table.ts","../src/commands/account/list.ts","../src/commands/account/edit.ts","../src/commands/account/remove.ts","../src/commands/account/test.ts","../src/commands/account/import.ts","../src/commands/account/index.ts","../src/commands/switch.ts","../src/commands/status.ts","../src/commands/clone.ts","../src/commands/remote.ts","../src/commands/uninstall.ts"],"sourcesContent":["import { Command } from 'commander';\nimport * as p from '@clack/prompts';\nimport pc from 'picocolors';\nimport { registerAccountCommands } from './commands/account/index.js';\nimport { registerSwitchCommand } from './commands/switch.js';\nimport { registerStatusCommand } from './commands/status.js';\nimport { registerCloneCommand } from './commands/clone.js';\nimport { registerRemoteCommand } from './commands/remote.js';\nimport { registerUninstallCommand } from './commands/uninstall.js';\nimport { handleCancel } from './ui/prompts.js';\n\nexport function createProgram(): Command {\n const program = new Command();\n\n program\n .name('octomux')\n .description('Enterprise-grade cross-platform GitHub multi-account & SSH identity manager')\n .version('1.0.0', '-v, --version', 'Output the current version of octomux');\n\n // Register commands\n registerAccountCommands(program);\n registerSwitchCommand(program);\n registerStatusCommand(program);\n registerCloneCommand(program);\n registerRemoteCommand(program);\n registerUninstallCommand(program);\n\n // Interactive root handler if no arguments provided\n program.action(async () => {\n p.intro(pc.bold(pc.cyan('🐙 octomux (omx) — GitHub Identity & SSH Manager')));\n\n const action = await p.select({\n message: 'What would you like to do?',\n options: [\n { value: 'list', label: '📋 List configured accounts' },\n { value: 'add', label: '➕ Add a new GitHub account' },\n { value: 'import', label: '🔑 Auto-import existing SSH keys' },\n { value: 'switch', label: '🔀 Switch Git identity (global / local)' },\n { value: 'remote', label: '🔗 Add or set remote origin for this repo' },\n { value: 'clone', label: '📦 Smart clone a repository' },\n { value: 'status', label: '🔍 Check active Git & SSH status' },\n { value: 'test', label: '⚡ Test SSH connections' },\n { value: 'uninstall', label: '🗑️ Uninstall & clean up octomux' },\n { value: 'exit', label: '🚪 Exit' },\n ],\n });\n handleCancel(action);\n\n if (action === 'exit') {\n p.outro('Goodbye!');\n process.exit(0);\n }\n\n switch (action) {\n case 'list':\n await program.parseAsync(['node', 'octomux', 'account', 'list']);\n break;\n case 'add':\n await program.parseAsync(['node', 'octomux', 'account', 'add']);\n break;\n case 'import':\n await program.parseAsync(['node', 'octomux', 'account', 'import']);\n break;\n case 'switch':\n await program.parseAsync(['node', 'octomux', 'switch']);\n break;\n case 'remote': {\n const repo = await p.text({\n message: 'Enter GitHub repository (e.g. owner/repo, https://github.com/...):',\n validate: (val) => (!val || !val.trim() ? 'Repository is required' : undefined),\n });\n handleCancel(repo);\n await program.parseAsync(['node', 'octomux', 'remote', repo as string]);\n break;\n }\n case 'clone': {\n const repo = await p.text({\n message: 'Enter repository slug or URL (e.g. owner/repo):',\n validate: (val) => (!val || !val.trim() ? 'Repository is required' : undefined),\n });\n handleCancel(repo);\n await program.parseAsync(['node', 'octomux', 'clone', repo as string]);\n break;\n }\n case 'status':\n await program.parseAsync(['node', 'octomux', 'status']);\n break;\n case 'test':\n await program.parseAsync(['node', 'octomux', 'account', 'test']);\n break;\n case 'uninstall':\n await program.parseAsync(['node', 'octomux', 'uninstall']);\n break;\n }\n });\n\n return program;\n}\n\nexport async function run(argv: string[] = process.argv): Promise<void> {\n const program = createProgram();\n await program.parseAsync(argv);\n}\n","import { Command } from 'commander';\nimport ora from 'ora';\nimport { AccountManager } from '../../core/account-manager.js';\nimport { SshService } from '../../core/ssh-service.js';\nimport { promptAddAccount } from '../../ui/prompts.js';\nimport { logger } from '../../ui/logger.js';\nimport { formatPublicKeyGuide } from '../../ui/formatters.js';\nimport { CreateAccountInput } from '../../types/account.js';\n\nexport function registerAccountAddCommand(accountCmd: Command): void {\n accountCmd\n .command('add')\n .description('Add and configure a new GitHub account profile')\n .option('-a, --alias <id>', 'Account alias identifier (e.g. work, personal)')\n .option('-u, --username <username>', 'GitHub username')\n .option('-e, --email <email>', 'Git commit email')\n .option('-g, --git-name <name>', 'Git author name (defaults to username)')\n .option('-k, --key-path <path>', 'Path to existing private SSH key')\n .option('--key-type <type>', 'SSH key type (ed25519 or rsa)', 'ed25519')\n .option('--no-keygen', 'Do not generate a new SSH key')\n .option('--global', 'Set as default global Git identity')\n .option('--json', 'Output result in JSON format')\n .action(async (options) => {\n const manager = new AccountManager();\n const sshService = new SshService();\n\n let input: CreateAccountInput;\n\n // If key required flags are provided, run in headless mode; otherwise launch interactive wizard\n if (options.alias && options.username && options.email) {\n input = {\n id: options.alias,\n username: options.username,\n email: options.email,\n gitUserName: options.gitName || options.username,\n sshKeyPath: options.keyPath,\n generateKey: options.keygen !== false && !options.keyPath,\n keyType: options.keyType === 'rsa' ? 'rsa' : 'ed25519',\n setAsGlobal: Boolean(options.global),\n };\n } else {\n input = await promptAddAccount();\n }\n\n const spinner = ora('Configuring GitHub account & SSH host...').start();\n\n try {\n const profile = await manager.addAccount(input);\n spinner.succeed(`Account '${profile.id}' (@${profile.username}) added successfully!`);\n\n const pubKeyContent = sshService.getPublicKey(profile.ssh.keyPath);\n\n if (options.json) {\n console.log(JSON.stringify({ ...profile, publicKeyContent: pubKeyContent }, null, 2));\n return;\n }\n\n const guide = formatPublicKeyGuide(profile, pubKeyContent);\n logger.box(guide, 'GitHub SSH Setup Required', 'green');\n } catch (err: unknown) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n spinner.fail(`Failed to add account: ${errorMsg}`);\n process.exit(1);\n }\n });\n}\n","import fs from 'node:fs';\nimport { ConfigStore } from './config-store.js';\nimport { SshService } from './ssh-service.js';\nimport { GitService } from './git-service.js';\nimport { getDefaultKeyPath } from '../platform/paths.js';\nimport {\n AccountProfile,\n AccountProfileSchema,\n CreateAccountInput,\n CreateAccountInputSchema,\n UpdateAccountInput,\n UpdateAccountInputSchema,\n} from '../types/account.js';\nimport { SshHostConfig, SshTestResult } from '../types/ssh.js';\n\nexport class AccountManager {\n private readonly configStore: ConfigStore;\n private readonly sshService: SshService;\n private readonly gitService: GitService;\n\n constructor(configStore?: ConfigStore, sshService?: SshService, gitService?: GitService) {\n this.configStore = configStore ?? new ConfigStore();\n this.sshService = sshService ?? new SshService();\n this.gitService = gitService ?? new GitService();\n }\n\n /**\n * Adds a new GitHub account profile, sets up SSH key and configures SSH hosts.\n */\n public async addAccount(input: CreateAccountInput): Promise<AccountProfile> {\n const validatedInput = CreateAccountInputSchema.parse(input);\n const existing = this.configStore.getAccount(validatedInput.id);\n\n if (existing) {\n throw new Error(`An account with alias '${validatedInput.id}' already exists.`);\n }\n\n const hostAlias = validatedInput.hostAlias || `github.com-${validatedInput.id}`;\n let privateKeyPath = validatedInput.sshKeyPath;\n let publicKeyPath = '';\n\n if (validatedInput.generateKey || !privateKeyPath) {\n const defaultKeyPath = getDefaultKeyPath(validatedInput.id, validatedInput.keyType);\n const keyGenResult = await this.sshService.generateKeyPair(\n validatedInput.email,\n defaultKeyPath,\n validatedInput.keyType,\n `octomux-${validatedInput.id}`\n );\n privateKeyPath = keyGenResult.privateKeyPath;\n publicKeyPath = keyGenResult.publicKeyPath;\n } else {\n if (!fs.existsSync(privateKeyPath)) {\n throw new Error(`Specified private SSH key does not exist at: ${privateKeyPath}`);\n }\n publicKeyPath = `${privateKeyPath}.pub`;\n if (!fs.existsSync(publicKeyPath)) {\n publicKeyPath = privateKeyPath;\n }\n }\n\n const profile: AccountProfile = AccountProfileSchema.parse({\n id: validatedInput.id,\n name: validatedInput.name || validatedInput.username,\n username: validatedInput.username,\n email: validatedInput.email,\n gitUserName: validatedInput.gitUserName || validatedInput.username,\n ssh: {\n keyPath: privateKeyPath,\n publicKeyPath,\n hostAlias,\n keyType: validatedInput.keyType,\n },\n token: validatedInput.token,\n isDefaultGlobal: validatedInput.setAsGlobal,\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n });\n\n this.configStore.setAccount(profile);\n this.syncAllSshHosts();\n\n if (validatedInput.setAsGlobal) {\n await this.gitService.setGlobalIdentity(profile.gitUserName, profile.email);\n }\n\n return profile;\n }\n\n /**\n * Updates an existing account profile.\n */\n public async updateAccount(alias: string, input: UpdateAccountInput): Promise<AccountProfile> {\n const validatedInput = UpdateAccountInputSchema.parse(input);\n const existing = this.configStore.getAccount(alias);\n\n if (!existing) {\n throw new Error(`Account profile '${alias}' does not exist.`);\n }\n\n let privateKeyPath = existing.ssh.keyPath;\n let publicKeyPath = existing.ssh.publicKeyPath;\n\n if (validatedInput.sshKeyPath && validatedInput.sshKeyPath !== existing.ssh.keyPath) {\n if (!fs.existsSync(validatedInput.sshKeyPath)) {\n throw new Error(`Specified SSH key does not exist at: ${validatedInput.sshKeyPath}`);\n }\n privateKeyPath = validatedInput.sshKeyPath;\n publicKeyPath = fs.existsSync(`${privateKeyPath}.pub`) ? `${privateKeyPath}.pub` : privateKeyPath;\n }\n\n const updated: AccountProfile = AccountProfileSchema.parse({\n ...existing,\n name: validatedInput.name ?? existing.name,\n username: validatedInput.username ?? existing.username,\n email: validatedInput.email ?? existing.email,\n gitUserName: validatedInput.gitUserName ?? existing.gitUserName,\n token: validatedInput.token !== undefined ? validatedInput.token : existing.token,\n ssh: {\n ...existing.ssh,\n keyPath: privateKeyPath,\n publicKeyPath,\n hostAlias: validatedInput.hostAlias ?? existing.ssh.hostAlias,\n },\n updatedAt: new Date().toISOString(),\n });\n\n this.configStore.setAccount(updated);\n this.syncAllSshHosts();\n\n return updated;\n }\n\n /**\n * Removes an account profile and optionally deletes its SSH keys.\n */\n public removeAccount(alias: string, deleteSshKey: boolean = false): boolean {\n const existing = this.configStore.getAccount(alias);\n if (!existing) {\n return false;\n }\n\n if (deleteSshKey) {\n try {\n if (fs.existsSync(existing.ssh.keyPath)) {\n fs.unlinkSync(existing.ssh.keyPath);\n }\n if (fs.existsSync(existing.ssh.publicKeyPath)) {\n fs.unlinkSync(existing.ssh.publicKeyPath);\n }\n } catch {\n // Ignore file delete errors\n }\n }\n\n const removed = this.configStore.removeAccount(alias);\n this.syncAllSshHosts();\n return removed;\n }\n\n /**\n * Returns a list of all configured account profiles.\n */\n public listAccounts(): AccountProfile[] {\n const accounts = this.configStore.getAccounts();\n return Object.values(accounts).sort((a, b) => a.id.localeCompare(b.id));\n }\n\n /**\n * Gets an account profile by alias.\n */\n public getAccount(alias: string): AccountProfile | undefined {\n return this.configStore.getAccount(alias);\n }\n\n /**\n * Switches the global Git user to the specified account.\n */\n public async switchGlobal(alias: string): Promise<AccountProfile> {\n const account = this.configStore.getAccount(alias);\n if (!account) {\n throw new Error(`Account profile '${alias}' not found.`);\n }\n\n await this.gitService.setGlobalIdentity(account.gitUserName, account.email);\n this.configStore.setActiveGlobal(alias);\n return account;\n }\n\n /**\n * Switches the local Git user in the current repository to the specified account.\n */\n public async switchLocal(alias: string, cwd?: string): Promise<AccountProfile> {\n const account = this.configStore.getAccount(alias);\n if (!account) {\n throw new Error(`Account profile '${alias}' not found.`);\n }\n\n await this.gitService.setLocalIdentity(\n account.gitUserName,\n account.email,\n account.ssh.keyPath,\n cwd\n );\n return account;\n }\n\n /**\n * Re-syncs all accounts into ~/.ssh/config.\n */\n public syncAllSshHosts(): void {\n const accounts = this.listAccounts();\n const hostConfigs: SshHostConfig[] = accounts.map((acc) => ({\n host: acc.ssh.hostAlias,\n hostName: 'github.com',\n user: 'git',\n identityFile: acc.ssh.keyPath,\n identitiesOnly: true,\n }));\n\n this.sshService.syncSshConfig(hostConfigs);\n }\n\n /**\n * Tests SSH connectivity for a specific account.\n */\n public async testAccount(alias: string): Promise<SshTestResult> {\n const account = this.configStore.getAccount(alias);\n if (!account) {\n throw new Error(`Account profile '${alias}' not found.`);\n }\n\n return this.sshService.testConnection(account.ssh.hostAlias, account.username);\n }\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport { getConfigFilePath } from '../platform/paths.js';\nimport { DEFAULT_CONFIG, OctomuxConfig, OctomuxConfigSchema } from '../types/config.js';\nimport { AccountProfile } from '../types/account.js';\n\nexport class ConfigStore {\n private readonly configPath: string;\n\n constructor(customConfigPath?: string) {\n this.configPath = customConfigPath ?? getConfigFilePath();\n }\n\n /**\n * Returns the config file path being managed.\n */\n public getPath(): string {\n return this.configPath;\n }\n\n /**\n * Loads and validates the octomux configuration.\n * If file does not exist, creates it with DEFAULT_CONFIG.\n */\n public load(): OctomuxConfig {\n if (!fs.existsSync(this.configPath)) {\n this.save(DEFAULT_CONFIG);\n return { ...DEFAULT_CONFIG };\n }\n\n try {\n const raw = fs.readFileSync(this.configPath, 'utf-8');\n const parsed = JSON.parse(raw);\n const validated = OctomuxConfigSchema.parse(parsed);\n return validated;\n } catch (error) {\n if (error instanceof SyntaxError) {\n throw new Error(`Corrupted config file at ${this.configPath}: Invalid JSON format.`);\n }\n throw error;\n }\n }\n\n /**\n * Atomically saves the configuration with backup creation.\n */\n public save(config: OctomuxConfig): void {\n const validated = OctomuxConfigSchema.parse(config);\n const dir = path.dirname(this.configPath);\n\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n\n // Create backup if previous config exists\n if (fs.existsSync(this.configPath)) {\n const backupPath = `${this.configPath}.bak`;\n try {\n fs.copyFileSync(this.configPath, backupPath);\n } catch {\n // Backup failure should not prevent writing\n }\n }\n\n const tempPath = `${this.configPath}.${Date.now()}.tmp`;\n const serialized = JSON.stringify(validated, null, 2);\n\n fs.writeFileSync(tempPath, serialized, 'utf-8');\n fs.renameSync(tempPath, this.configPath);\n }\n\n /**\n * Retrieves all configured account profiles.\n */\n public getAccounts(): Record<string, AccountProfile> {\n const config = this.load();\n return config.accounts;\n }\n\n /**\n * Retrieves a single account profile by its alias.\n */\n public getAccount(alias: string): AccountProfile | undefined {\n const accounts = this.getAccounts();\n return accounts[alias];\n }\n\n /**\n * Saves or updates an account profile.\n */\n public setAccount(account: AccountProfile): void {\n const config = this.load();\n config.accounts[account.id] = account;\n\n if (account.isDefaultGlobal) {\n config.activeGlobalAccount = account.id;\n // Mark others as non-default\n for (const [id, acc] of Object.entries(config.accounts)) {\n if (id !== account.id) {\n acc.isDefaultGlobal = false;\n }\n }\n }\n\n this.save(config);\n }\n\n /**\n * Removes an account profile by alias.\n */\n public removeAccount(alias: string): boolean {\n const config = this.load();\n if (!config.accounts[alias]) {\n return false;\n }\n\n delete config.accounts[alias];\n if (config.activeGlobalAccount === alias) {\n delete config.activeGlobalAccount;\n }\n\n this.save(config);\n return true;\n }\n\n /**\n * Sets the active global account alias.\n */\n public setActiveGlobal(alias: string): void {\n const config = this.load();\n if (!config.accounts[alias]) {\n throw new Error(`Cannot set active global account: Profile '${alias}' does not exist.`);\n }\n\n config.activeGlobalAccount = alias;\n for (const [id, acc] of Object.entries(config.accounts)) {\n acc.isDefaultGlobal = id === alias;\n }\n\n this.save(config);\n }\n\n /**\n * Gets the active global account profile if one is set.\n */\n public getActiveGlobal(): AccountProfile | undefined {\n const config = this.load();\n if (!config.activeGlobalAccount) {\n return undefined;\n }\n return config.accounts[config.activeGlobalAccount];\n }\n}\n","import os from 'node:os';\nimport path from 'node:path';\n\n/**\n * Returns the user's home directory across Windows, macOS, and Linux.\n */\nexport function getHomeDir(): string {\n return os.homedir();\n}\n\n/**\n * Returns the octomux configuration directory path (~/.octomux).\n */\nexport function getOctomuxDir(): string {\n return path.join(getHomeDir(), '.octomux');\n}\n\n/**\n * Returns the path to octomux configuration JSON file (~/.octomux/config.json).\n */\nexport function getConfigFilePath(): string {\n return path.join(getOctomuxDir(), 'config.json');\n}\n\n/**\n * Returns the user's .ssh directory path (~/.ssh).\n */\nexport function getSshDir(): string {\n return path.join(getHomeDir(), '.ssh');\n}\n\n/**\n * Returns the path to the user's SSH config file (~/.ssh/config).\n */\nexport function getSshConfigPath(): string {\n return path.join(getSshDir(), 'config');\n}\n\n/**\n * Returns the default private key path for an account alias.\n * e.g., ~/.ssh/id_ed25519_octomux_work\n */\nexport function getDefaultKeyPath(alias: string, keyType: 'ed25519' | 'rsa' = 'ed25519'): string {\n const filename = `id_${keyType}_octomux_${alias}`;\n return path.join(getSshDir(), filename);\n}\n\n/**\n * Converts a filesystem path to a POSIX path with forward slashes (required by OpenSSH config on all OSes).\n */\nexport function toPosixPath(filePath: string): string {\n return filePath.replace(/\\\\/g, '/');\n}\n","import { z } from 'zod';\nimport { AccountProfileSchema } from './account.js';\n\nexport const OctomuxConfigSchema = z.object({\n version: z.string().default('1.0.0'),\n activeGlobalAccount: z.string().optional(),\n defaultCloneProtocol: z.enum(['ssh', 'https']).default('ssh'),\n accounts: z.record(z.string(), AccountProfileSchema).default({}),\n});\nexport type OctomuxConfig = z.infer<typeof OctomuxConfigSchema>;\n\nexport const DEFAULT_CONFIG: OctomuxConfig = {\n version: '1.0.0',\n defaultCloneProtocol: 'ssh',\n accounts: {},\n};\n","import { z } from 'zod';\n\nexport const SshKeyTypeSchema = z.enum(['ed25519', 'rsa']);\nexport type SshKeyType = z.infer<typeof SshKeyTypeSchema>;\n\nexport const SshKeyDetailsSchema = z.object({\n keyPath: z.string().min(1, 'Private key path is required'),\n publicKeyPath: z.string().min(1, 'Public key path is required'),\n hostAlias: z.string().min(1, 'SSH Host alias is required'),\n keyType: SshKeyTypeSchema.default('ed25519'),\n});\nexport type SshKeyDetails = z.infer<typeof SshKeyDetailsSchema>;\n\nexport const AccountProfileSchema = z.object({\n id: z\n .string()\n .min(1, 'Account alias ID is required')\n .regex(/^[a-z0-9-_]+$/i, 'Alias must contain only alphanumeric characters, dashes, or underscores'),\n name: z.string().min(1, 'Display name is required'),\n username: z.string().min(1, 'GitHub username is required'),\n email: z.string().email('Invalid email address'),\n gitUserName: z.string().min(1, 'Git author name is required'),\n ssh: SshKeyDetailsSchema,\n signingKey: z.string().optional(),\n token: z.string().optional(),\n isDefaultGlobal: z.boolean().default(false),\n createdAt: z.string().datetime().default(() => new Date().toISOString()),\n updatedAt: z.string().datetime().default(() => new Date().toISOString()),\n});\nexport type AccountProfile = z.infer<typeof AccountProfileSchema>;\n\nexport const CreateAccountInputSchema = z.object({\n id: z\n .string()\n .min(1, 'Alias is required')\n .regex(/^[a-z0-9-_]+$/i, 'Alias must contain only letters, numbers, dashes, or underscores'),\n name: z.string().optional(),\n username: z.string().min(1, 'GitHub username is required'),\n email: z.string().email('Valid email is required'),\n gitUserName: z.string().optional(),\n sshKeyPath: z.string().optional(),\n generateKey: z.boolean().default(true),\n keyType: SshKeyTypeSchema.default('ed25519'),\n hostAlias: z.string().optional(),\n token: z.string().optional(),\n setAsGlobal: z.boolean().default(false),\n});\nexport type CreateAccountInput = z.input<typeof CreateAccountInputSchema>;\nexport type CreateAccountPayload = z.output<typeof CreateAccountInputSchema>;\n\nexport const UpdateAccountInputSchema = z.object({\n name: z.string().optional(),\n username: z.string().optional(),\n email: z.string().email().optional(),\n gitUserName: z.string().optional(),\n sshKeyPath: z.string().optional(),\n hostAlias: z.string().optional(),\n token: z.string().optional(),\n});\nexport type UpdateAccountInput = z.input<typeof UpdateAccountInputSchema>;\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport { execa } from 'execa';\nimport { getSshConfigPath, getSshDir, toPosixPath } from '../platform/paths.js';\nimport { setPrivateKeyPermissions, setSshDirPermissions } from '../platform/permissions.js';\nimport { DiscoveredSshKey, KeyPairResult, SshHostConfig, SshTestResult } from '../types/ssh.js';\nimport { SshKeyType } from '../types/account.js';\n\nexport const OCTOMUX_BLOCK_START = '# === OCTOMUX MANAGED HOSTS: START ===';\nexport const OCTOMUX_BLOCK_END = '# === OCTOMUX MANAGED HOSTS: END ===';\n\nexport class SshService {\n private readonly sshConfigPath: string;\n private readonly sshDir: string;\n\n constructor(customSshConfigPath?: string, customSshDir?: string) {\n this.sshConfigPath = customSshConfigPath ?? getSshConfigPath();\n this.sshDir = customSshDir ?? getSshDir();\n }\n\n public getSshConfigPath(): string {\n return this.sshConfigPath;\n }\n\n public getSshDir(): string {\n return this.sshDir;\n }\n\n /**\n * Scans ~/.ssh directory for existing private SSH keys created by the user or system.\n */\n public scanExistingSshKeys(): DiscoveredSshKey[] {\n if (!fs.existsSync(this.sshDir)) {\n return [];\n }\n\n const ignoredFiles = new Set([\n 'config',\n 'config.bak',\n 'known_hosts',\n 'known_hosts.old',\n 'authorized_keys',\n ]);\n\n const discovered: DiscoveredSshKey[] = [];\n const entries = fs.readdirSync(this.sshDir);\n\n for (const filename of entries) {\n if (filename.endsWith('.pub') || filename.endsWith('.tmp') || filename.endsWith('.bak')) {\n continue;\n }\n if (ignoredFiles.has(filename.toLowerCase())) {\n continue;\n }\n\n const privatePath = path.join(this.sshDir, filename);\n const stat = fs.statSync(privatePath);\n if (!stat.isFile()) {\n continue;\n }\n\n const pubPath = `${privatePath}.pub`;\n const hasPub = fs.existsSync(pubPath);\n\n let keyType: 'ed25519' | 'rsa' | 'ecdsa' | 'unknown' = 'unknown';\n let comment: string | undefined;\n\n if (hasPub) {\n try {\n const pubContent = fs.readFileSync(pubPath, 'utf-8').trim();\n const parts = pubContent.split(/\\s+/);\n if (parts.length >= 1 && parts[0]) {\n if (parts[0].includes('ed25519')) keyType = 'ed25519';\n else if (parts[0].includes('rsa')) keyType = 'rsa';\n else if (parts[0].includes('ecdsa')) keyType = 'ecdsa';\n }\n if (parts.length >= 3) {\n comment = parts.slice(2).join(' ');\n }\n } catch {\n // Ignore read errors\n }\n } else {\n if (filename.includes('ed25519')) keyType = 'ed25519';\n else if (filename.includes('rsa')) keyType = 'rsa';\n else if (filename.includes('ecdsa')) keyType = 'ecdsa';\n }\n\n discovered.push({\n name: filename,\n privateKeyPath: privatePath,\n publicKeyPath: hasPub ? pubPath : undefined,\n keyType,\n comment,\n isOctomuxManaged: filename.includes('_octomux_'),\n });\n }\n\n return discovered;\n }\n\n /**\n * Generates a new SSH key pair using ssh-keygen.\n */\n public async generateKeyPair(\n email: string,\n targetKeyPath: string,\n keyType: SshKeyType = 'ed25519',\n comment?: string\n ): Promise<KeyPairResult> {\n const parentDir = path.dirname(targetKeyPath);\n if (!fs.existsSync(parentDir)) {\n fs.mkdirSync(parentDir, { recursive: true });\n setSshDirPermissions(parentDir);\n }\n\n // If key already exists, throw an error to prevent accidental overwrite\n if (fs.existsSync(targetKeyPath)) {\n throw new Error(`SSH Key already exists at: ${targetKeyPath}`);\n }\n\n const keyComment = comment || `octomux-${email}`;\n const args = ['-t', keyType, '-C', keyComment, '-f', targetKeyPath, '-N', ''];\n\n if (keyType === 'rsa') {\n args.push('-b', '4096');\n }\n\n try {\n await execa('ssh-keygen', args);\n } catch (err: unknown) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n throw new Error(`Failed to generate SSH key with ssh-keygen: ${errorMsg}`);\n }\n\n // Set strict permissions\n setPrivateKeyPermissions(targetKeyPath);\n\n const publicKeyPath = `${targetKeyPath}.pub`;\n let publicKeyContent = '';\n if (fs.existsSync(publicKeyPath)) {\n publicKeyContent = fs.readFileSync(publicKeyPath, 'utf-8').trim();\n }\n\n return {\n privateKeyPath: targetKeyPath,\n publicKeyPath,\n publicKeyContent,\n };\n }\n\n /**\n * Reads an existing public key associated with a private key.\n */\n public getPublicKey(privateKeyPath: string): string | undefined {\n const pubPath = `${privateKeyPath}.pub`;\n if (fs.existsSync(pubPath)) {\n return fs.readFileSync(pubPath, 'utf-8').trim();\n }\n return undefined;\n }\n\n /**\n * Generates formatted SSH config block content for an array of host entries.\n */\n public formatHostEntries(hosts: SshHostConfig[]): string {\n const lines: string[] = [\n OCTOMUX_BLOCK_START,\n '# This block is automatically managed by octomux (omx).',\n '# Manual changes inside this block will be overwritten.',\n '',\n ];\n\n for (const host of hosts) {\n // Normalize identity file path with forward slashes for cross-platform OpenSSH compatibility\n const posixKeyPath = toPosixPath(host.identityFile);\n\n lines.push(`Host ${host.host}`);\n lines.push(` HostName ${host.hostName}`);\n lines.push(` User ${host.user}`);\n lines.push(` IdentityFile \"${posixKeyPath}\"`);\n lines.push(` IdentitiesOnly ${host.identitiesOnly !== false ? 'yes' : 'no'}`);\n\n if (host.extraOptions) {\n for (const [key, val] of Object.entries(host.extraOptions)) {\n lines.push(` ${key} ${val}`);\n }\n }\n lines.push('');\n }\n\n lines.push(OCTOMUX_BLOCK_END);\n return lines.join('\\n');\n }\n\n /**\n * Safely synchronizes octomux host entries into ~/.ssh/config.\n * Preserves all user configurations outside of the octomux delimiters.\n */\n public syncSshConfig(hosts: SshHostConfig[]): void {\n const dir = path.dirname(this.sshConfigPath);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n setSshDirPermissions(dir);\n }\n\n let existingContent = '';\n if (fs.existsSync(this.sshConfigPath)) {\n existingContent = fs.readFileSync(this.sshConfigPath, 'utf-8');\n\n // Backup existing SSH config\n try {\n fs.copyFileSync(this.sshConfigPath, `${this.sshConfigPath}.bak`);\n } catch {\n // Ignore backup failure\n }\n }\n\n const newBlock = this.formatHostEntries(hosts);\n\n let updatedContent = '';\n const startIndex = existingContent.indexOf(OCTOMUX_BLOCK_START);\n const endIndex = existingContent.indexOf(OCTOMUX_BLOCK_END);\n\n if (startIndex !== -1 && endIndex !== -1 && endIndex > startIndex) {\n const before = existingContent.slice(0, startIndex).trimEnd();\n const after = existingContent.slice(endIndex + OCTOMUX_BLOCK_END.length).trimStart();\n\n const parts: string[] = [];\n if (before.length > 0) parts.push(before);\n parts.push(newBlock);\n if (after.length > 0) parts.push(after);\n\n updatedContent = parts.join('\\n\\n') + '\\n';\n } else {\n // Append to the end of file\n const trimmed = existingContent.trim();\n updatedContent = trimmed ? `${trimmed}\\n\\n${newBlock}\\n` : `${newBlock}\\n`;\n }\n\n // Atomic write\n const tempFile = `${this.sshConfigPath}.${Date.now()}.tmp`;\n fs.writeFileSync(tempFile, updatedContent, 'utf-8');\n setPrivateKeyPermissions(tempFile);\n fs.renameSync(tempFile, this.sshConfigPath);\n setPrivateKeyPermissions(this.sshConfigPath);\n }\n\n /**\n * Tests SSH connection to a GitHub host alias.\n * Note: GitHub returns exit code 1 with success greeting on SSH -T.\n */\n public async testConnection(hostAlias: string, username: string = 'User'): Promise<SshTestResult> {\n try {\n const { stdout, stderr } = await execa(\n 'ssh',\n [\n '-T',\n '-o',\n 'BatchMode=yes',\n '-o',\n 'StrictHostKeyChecking=accept-new',\n '-o',\n 'ConnectTimeout=8',\n `git@${hostAlias}`,\n ],\n { reject: false }\n );\n\n const output = `${stdout}\\n${stderr}`.trim();\n // GitHub standard greeting: \"Hi <username>! You've successfully authenticated...\"\n const isAuthenticated =\n output.includes('successfully authenticated') ||\n output.toLowerCase().includes(`hi ${username.toLowerCase()}`);\n\n return {\n accountAlias: hostAlias.replace(/^github\\.com-/, ''),\n hostAlias,\n username,\n authenticated: isAuthenticated,\n rawOutput: output,\n error: isAuthenticated ? undefined : output,\n };\n } catch (err: unknown) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n return {\n accountAlias: hostAlias.replace(/^github\\.com-/, ''),\n hostAlias,\n username,\n authenticated: false,\n rawOutput: '',\n error: errorMsg,\n };\n }\n }\n}\n","import fs from 'node:fs';\nimport os from 'node:os';\n\n/**\n * Sets Unix file permissions to 0600 (read/write only by owner) on non-Windows platforms.\n * Safe to call on Windows without throwing.\n */\nexport function setPrivateKeyPermissions(filePath: string): void {\n if (os.platform() === 'win32') {\n return;\n }\n try {\n if (fs.existsSync(filePath)) {\n fs.chmodSync(filePath, 0o600);\n }\n } catch {\n // Ignore permission errors if file is read-only or in testing environment\n }\n}\n\n/**\n * Sets Unix directory permissions to 0700 (rwx only by owner) on non-Windows platforms.\n */\nexport function setSshDirPermissions(dirPath: string): void {\n if (os.platform() === 'win32') {\n return;\n }\n try {\n if (fs.existsSync(dirPath)) {\n fs.chmodSync(dirPath, 0o700);\n }\n } catch {\n // Ignore permission errors in testing or locked environments\n }\n}\n","import { execa } from 'execa';\nimport { toPosixPath } from '../platform/paths.js';\n\nexport interface GitIdentity {\n name?: string;\n email?: string;\n signingKey?: string;\n sshCommand?: string;\n}\n\nexport interface ParsedRepoInfo {\n owner: string;\n repo: string;\n originalUrl: string;\n}\n\nexport class GitService {\n /**\n * Checks if git is installed and available in PATH.\n */\n public async isGitInstalled(): Promise<boolean> {\n try {\n const { exitCode } = await execa('git', ['--version']);\n return exitCode === 0;\n } catch {\n return false;\n }\n }\n\n /**\n * Checks if the given directory (or current working directory) is inside a Git repository.\n */\n public async isInsideGitRepo(cwd?: string): Promise<boolean> {\n try {\n const { stdout } = await execa('git', ['rev-parse', '--is-inside-work-tree'], { cwd });\n return stdout.trim() === 'true';\n } catch {\n return false;\n }\n }\n\n /**\n * Gets the root directory of the current Git repository.\n */\n public async getRepoRoot(cwd?: string): Promise<string | undefined> {\n try {\n const { stdout } = await execa('git', ['rev-parse', '--show-toplevel'], { cwd });\n return stdout.trim();\n } catch {\n return undefined;\n }\n }\n\n /**\n * Reads Git identity (user.name, user.email, core.sshCommand) for a given scope.\n */\n public async getIdentity(scope: 'global' | 'local', cwd?: string): Promise<GitIdentity> {\n const flag = scope === 'global' ? '--global' : '--local';\n const identity: GitIdentity = {};\n\n try {\n const { stdout: name } = await execa('git', ['config', flag, '--get', 'user.name'], { cwd, reject: false });\n if (name.trim()) identity.name = name.trim();\n } catch {\n // Ignore unset configs\n }\n\n try {\n const { stdout: email } = await execa('git', ['config', flag, '--get', 'user.email'], { cwd, reject: false });\n if (email.trim()) identity.email = email.trim();\n } catch {\n // Ignore unset configs\n }\n\n try {\n const { stdout: sshCmd } = await execa('git', ['config', flag, '--get', 'core.sshCommand'], { cwd, reject: false });\n if (sshCmd.trim()) identity.sshCommand = sshCmd.trim();\n } catch {\n // Ignore unset configs\n }\n\n return identity;\n }\n\n /**\n * Sets global Git identity.\n */\n public async setGlobalIdentity(name: string, email: string): Promise<void> {\n await execa('git', ['config', '--global', 'user.name', name]);\n await execa('git', ['config', '--global', 'user.email', email]);\n }\n\n /**\n * Sets local Git identity and dedicated SSH command in a repository.\n */\n public async setLocalIdentity(\n name: string,\n email: string,\n sshKeyPath?: string,\n cwd?: string\n ): Promise<void> {\n const isRepo = await this.isInsideGitRepo(cwd);\n if (!isRepo) {\n throw new Error(`Current directory is not inside a Git repository.`);\n }\n\n await execa('git', ['config', '--local', 'user.name', name], { cwd });\n await execa('git', ['config', '--local', 'user.email', email], { cwd });\n\n if (sshKeyPath) {\n const posixKey = toPosixPath(sshKeyPath);\n const sshCommand = `ssh -i \"${posixKey}\" -o IdentitiesOnly=yes`;\n await execa('git', ['config', '--local', 'core.sshCommand', sshCommand], { cwd });\n }\n }\n\n /**\n * Parses GitHub URLs, SSH strings, or owner/repo shorthand slugs.\n */\n public parseRepoInput(input: string): ParsedRepoInfo | null {\n const trimmed = input.trim();\n\n // 1. Shorthand: owner/repo\n const slugMatch = /^([a-zA-Z0-9_.-]+)\\/([a-zA-Z0-9_.-]+)$/.exec(trimmed);\n if (slugMatch && slugMatch[1] && slugMatch[2]) {\n const repo = slugMatch[2].replace(/\\.git$/, '');\n return { owner: slugMatch[1], repo, originalUrl: trimmed };\n }\n\n // 2. HTTPS URL: https://github.com/owner/repo(.git)\n const httpsMatch = /^https?:\\/\\/github\\.com\\/([a-zA-Z0-9_.-]+)\\/([a-zA-Z0-9_.-]+?)(\\.git)?(?:\\/)?$/.exec(trimmed);\n if (httpsMatch && httpsMatch[1] && httpsMatch[2]) {\n return { owner: httpsMatch[1], repo: httpsMatch[2], originalUrl: trimmed };\n }\n\n // 3. SSH URL: git@github.com:owner/repo.git or git@github.com-alias:owner/repo.git\n const sshMatch = /^git@([a-zA-Z0-9_.-]+):([a-zA-Z0-9_.-]+)\\/([a-zA-Z0-9_.-]+?)(\\.git)?$/.exec(trimmed);\n if (sshMatch && sshMatch[2] && sshMatch[3]) {\n return { owner: sshMatch[2], repo: sshMatch[3], originalUrl: trimmed };\n }\n\n return null;\n }\n\n /**\n * Constructs an SSH clone URL using a specific SSH host alias.\n */\n public formatSshCloneUrl(hostAlias: string, owner: string, repo: string): string {\n return `git@${hostAlias}:${owner}/${repo}.git`;\n }\n\n /**\n * Executes git clone with real-time output streaming or promise resolution.\n */\n public async clone(cloneUrl: string, targetDir?: string, extraArgs: string[] = []): Promise<string> {\n const args = ['clone', cloneUrl];\n if (targetDir) {\n args.push(targetDir);\n }\n args.push(...extraArgs);\n\n await execa('git', args, { stdio: 'inherit' });\n\n // Determine target directory name\n if (targetDir) {\n return targetDir;\n }\n\n // Extract repo name from URL (e.g. git@github.com-work:facebook/react.git -> react)\n const match = /\\/([^/]+?)(\\.git)?$/.exec(cloneUrl);\n return match && match[1] ? match[1] : 'repository';\n }\n\n /**\n * Gets the current remote URL for a repository (origin by default).\n */\n public async getRemoteUrl(remote: string = 'origin', cwd?: string): Promise<string | undefined> {\n try {\n const { stdout } = await execa('git', ['remote', 'get-url', remote], { cwd });\n return stdout.trim();\n } catch {\n return undefined;\n }\n }\n\n /**\n * Sets the remote URL for a repository (or adds it if not existing).\n */\n public async setRemoteUrl(remote: string, url: string, cwd?: string): Promise<void> {\n await execa('git', ['remote', 'set-url', remote, url], { cwd });\n }\n\n /**\n * Adds a new remote to the repository.\n */\n public async addRemoteUrl(remote: string, url: string, cwd?: string): Promise<void> {\n await execa('git', ['remote', 'add', remote, url], { cwd });\n }\n\n /**\n * Initializes a new Git repository if not already initialized.\n */\n public async initRepo(cwd?: string): Promise<void> {\n await execa('git', ['init'], { cwd });\n }\n}\n","import * as p from '@clack/prompts';\nimport pc from 'picocolors';\nimport { SshService } from '../core/ssh-service.js';\nimport { AccountProfile, CreateAccountInput, SshKeyType, UpdateAccountInput } from '../types/account.js';\n\nexport function handleCancel(value: unknown): void {\n if (p.isCancel(value)) {\n p.cancel('Operation cancelled.');\n process.exit(0);\n }\n}\n\nexport async function promptAddAccount(): Promise<CreateAccountInput> {\n p.intro(pc.bold(pc.cyan('octomux (omx) — Add New GitHub Account')));\n\n const id = await p.text({\n message: 'Enter an alias ID for this account (e.g. work, personal, opensource):',\n placeholder: 'work',\n validate: (val) => {\n if (!val || !val.trim()) return 'Alias ID is required';\n if (!/^[a-z0-9-_]+$/i.test(val)) return 'Alias must contain only alphanumeric characters, dashes, or underscores';\n return undefined;\n },\n });\n handleCancel(id);\n\n const username = await p.text({\n message: 'Enter GitHub username (e.g. octocat):',\n placeholder: 'octocat',\n validate: (val) => (!val || !val.trim() ? 'GitHub username is required' : undefined),\n });\n handleCancel(username);\n\n const email = await p.text({\n message: 'Enter Git commit email (e.g. user@example.com):',\n placeholder: 'user@example.com',\n validate: (val) => {\n if (!val || !val.trim()) return 'Email is required';\n if (!/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(val)) return 'Invalid email address';\n return undefined;\n },\n });\n handleCancel(email);\n\n const gitUserName = await p.text({\n message: 'Enter Git author name (used in commit history):',\n placeholder: username as string,\n initialValue: username as string,\n });\n handleCancel(gitUserName);\n\n // Scan ~/.ssh for existing SSH keys\n const sshService = new SshService();\n const existingKeys = sshService.scanExistingSshKeys();\n\n const keyOptions: Array<{ value: string; label: string }> = [];\n\n // Add detected existing keys first\n for (const k of existingKeys) {\n const commentStr = k.comment ? ` (${k.comment})` : '';\n keyOptions.push({\n value: `existing:${k.privateKeyPath}`,\n label: `🔑 Use detected key: ${k.name} [${k.keyType}]${commentStr}`,\n });\n }\n\n // Generation options\n keyOptions.push(\n { value: 'generate_ed25519', label: '➕ Generate new Ed25519 key (Recommended)' },\n { value: 'generate_rsa', label: '➕ Generate new RSA 4096-bit key' },\n { value: 'manual', label: '📁 Specify a custom private key path...' }\n );\n\n const keyChoice = await p.select({\n message: 'SSH Key configuration:',\n options: keyOptions,\n });\n handleCancel(keyChoice);\n\n let generateKey = true;\n let keyType: SshKeyType = 'ed25519';\n let sshKeyPath: string | undefined;\n\n const keyChoiceStr = keyChoice as string;\n if (keyChoiceStr.startsWith('existing:')) {\n generateKey = false;\n sshKeyPath = keyChoiceStr.replace('existing:', '');\n keyType = sshKeyPath.includes('rsa') ? 'rsa' : 'ed25519';\n } else if (keyChoiceStr === 'generate_ed25519') {\n generateKey = true;\n keyType = 'ed25519';\n } else if (keyChoiceStr === 'generate_rsa') {\n generateKey = true;\n keyType = 'rsa';\n } else {\n generateKey = false;\n const pathInput = await p.text({\n message: 'Enter path to existing private SSH key:',\n placeholder: '~/.ssh/id_rsa',\n validate: (val) => (!val || !val.trim() ? 'Private key path is required' : undefined),\n });\n handleCancel(pathInput);\n sshKeyPath = pathInput as string;\n }\n\n const setAsGlobal = await p.confirm({\n message: 'Set this account as the active global Git identity now?',\n initialValue: false,\n });\n handleCancel(setAsGlobal);\n\n return {\n id: (id as string).trim(),\n name: (username as string).trim(),\n username: (username as string).trim(),\n email: (email as string).trim(),\n gitUserName: ((gitUserName as string) || (username as string)).trim(),\n generateKey,\n keyType,\n sshKeyPath,\n setAsGlobal: Boolean(setAsGlobal),\n };\n}\n\nexport async function promptSelectAccount(\n accounts: AccountProfile[],\n message: string = 'Select an account profile:'\n): Promise<AccountProfile> {\n if (accounts.length === 0) {\n throw new Error('No accounts available. Please add an account first with \"omx account add\".');\n }\n\n const selected = await p.select({\n message,\n options: accounts.map((acc) => ({\n value: acc.id,\n label: `${pc.bold(acc.id)} (@${acc.username} - ${acc.email})`,\n })),\n });\n handleCancel(selected);\n\n const found = accounts.find((a) => a.id === selected);\n if (!found) {\n throw new Error('Selected account not found.');\n }\n return found;\n}\n\nexport async function promptEditAccount(existing: AccountProfile): Promise<UpdateAccountInput> {\n p.intro(pc.bold(pc.cyan(`Edit Account: ${existing.id}`)));\n\n const username = await p.text({\n message: 'GitHub username:',\n initialValue: existing.username,\n });\n handleCancel(username);\n\n const email = await p.text({\n message: 'Git commit email:',\n initialValue: existing.email,\n });\n handleCancel(email);\n\n const gitUserName = await p.text({\n message: 'Git author name:',\n initialValue: existing.gitUserName,\n });\n handleCancel(gitUserName);\n\n return {\n username: username as string,\n email: email as string,\n gitUserName: gitUserName as string,\n };\n}\n\nexport async function promptConfirm(message: string, initialValue: boolean = false): Promise<boolean> {\n const result = await p.confirm({\n message,\n initialValue,\n });\n handleCancel(result);\n return Boolean(result);\n}\n","import pc from 'picocolors';\nimport boxen from 'boxen';\n\nexport const logger = {\n success(message: string): void {\n console.log(`${pc.green('✔')} ${message}`);\n },\n\n error(message: string): void {\n console.error(`${pc.red('✖')} ${pc.red(message)}`);\n },\n\n warn(message: string): void {\n console.warn(`${pc.yellow('⚠')} ${message}`);\n },\n\n info(message: string): void {\n console.log(`${pc.cyan('ℹ')} ${message}`);\n },\n\n step(stepNumber: number, total: number, message: string): void {\n console.log(`${pc.magenta(`[${stepNumber}/${total}]`)} ${message}`);\n },\n\n dim(message: string): void {\n console.log(pc.dim(message));\n },\n\n highlight(label: string, value: string): void {\n console.log(` ${pc.bold(label)}: ${pc.cyan(value)}`);\n },\n\n box(content: string, title?: string, borderColor: 'cyan' | 'green' | 'yellow' | 'magenta' = 'cyan'): void {\n console.log(\n boxen(content, {\n padding: 1,\n margin: { top: 0, bottom: 0 },\n borderStyle: 'round',\n borderColor,\n title: title ? pc.bold(title) : undefined,\n titleAlignment: 'left',\n })\n );\n },\n};\n","import pc from 'picocolors';\nimport { AccountProfile } from '../types/account.js';\nimport { SshTestResult } from '../types/ssh.js';\n\nexport function formatPublicKeyGuide(account: AccountProfile, publicKeyContent?: string): string {\n const lines = [\n pc.bold(pc.green('Account configured successfully!')),\n '',\n `${pc.bold('Next Step:')} Add your SSH Public Key to your GitHub Account:`,\n pc.cyan('https://github.com/settings/ssh/new'),\n '',\n `${pc.bold('Public Key Path:')} ${pc.dim(account.ssh.publicKeyPath)}`,\n ];\n\n if (publicKeyContent) {\n lines.push('');\n lines.push(pc.bold('Public Key Content:'));\n lines.push(pc.yellow(publicKeyContent));\n }\n\n return lines.join('\\n');\n}\n\nexport function formatTestResult(result: SshTestResult): string {\n if (result.authenticated) {\n return [\n pc.green(`✔ SSH connection to ${pc.bold(result.hostAlias)} succeeded!`),\n pc.dim(` GitHub greeting: Hi ${result.username}! You've successfully authenticated.`),\n ].join('\\n');\n }\n\n return [\n pc.red(`✖ SSH connection to ${pc.bold(result.hostAlias)} failed.`),\n pc.yellow(` Error output: ${result.error || 'Authentication rejected.'}`),\n pc.dim(` Tip: Make sure you added your public key at https://github.com/settings/keys`),\n ].join('\\n');\n}\n\nexport function formatCloneSummary(\n repoName: string,\n targetDir: string,\n account: AccountProfile\n): string {\n return [\n pc.bold(pc.green(`Repository cloned and configured successfully!`)),\n '',\n ` ${pc.bold('Repository:')} ${pc.cyan(repoName)}`,\n ` ${pc.bold('Location:')} ${targetDir}`,\n ` ${pc.bold('Account:')} ${pc.yellow(account.id)} (@${account.username})`,\n ` ${pc.bold('Author:')} ${account.gitUserName} <${account.email}>`,\n ` ${pc.bold('SSH Host:')} ${pc.cyan(account.ssh.hostAlias)}`,\n ].join('\\n');\n}\n","import Table from 'cli-table3';\nimport pc from 'picocolors';\nimport { AccountProfile } from '../types/account.js';\n\nexport function renderAccountTable(\n accounts: AccountProfile[],\n activeGlobalAlias?: string,\n activeLocalAlias?: string\n): string {\n if (accounts.length === 0) {\n return pc.dim('No accounts configured yet. Run \"omx account add\" to get started.');\n }\n\n const table = new Table({\n head: [\n pc.bold('Active'),\n pc.bold('Alias'),\n pc.bold('GitHub User'),\n pc.bold('Git Commit Email'),\n pc.bold('Git Author Name'),\n pc.bold('SSH Host Alias'),\n ],\n style: {\n head: [],\n border: ['dim'],\n },\n });\n\n for (const acc of accounts) {\n const isGlobal = activeGlobalAlias === acc.id || acc.isDefaultGlobal;\n const isLocal = activeLocalAlias === acc.id;\n\n let statusTag = '';\n if (isGlobal && isLocal) {\n statusTag = pc.green('★ Global & Local');\n } else if (isLocal) {\n statusTag = pc.cyan('● Local');\n } else if (isGlobal) {\n statusTag = pc.green('★ Global');\n } else {\n statusTag = pc.dim('—');\n }\n\n table.push([\n statusTag,\n pc.bold(pc.yellow(acc.id)),\n acc.username,\n acc.email,\n acc.gitUserName,\n pc.cyan(acc.ssh.hostAlias),\n ]);\n }\n\n return table.toString();\n}\n","import { Command } from 'commander';\nimport { AccountManager } from '../../core/account-manager.js';\nimport { GitService } from '../../core/git-service.js';\nimport { renderAccountTable } from '../../ui/table.js';\n\nexport function registerAccountListCommand(programOrAccountCmd: Command): void {\n const handler = async (options: { json?: boolean }) => {\n const manager = new AccountManager();\n const gitService = new GitService();\n\n const accounts = manager.listAccounts();\n\n if (options.json) {\n console.log(JSON.stringify(accounts, null, 2));\n return;\n }\n\n const activeGlobal = manager.getAccount(manager.listAccounts().find((a) => a.isDefaultGlobal)?.id || '');\n let activeLocalAlias: string | undefined;\n\n const isRepo = await gitService.isInsideGitRepo();\n if (isRepo) {\n const localIdentity = await gitService.getIdentity('local');\n if (localIdentity.email) {\n const match = accounts.find((a) => a.email.toLowerCase() === localIdentity.email?.toLowerCase());\n if (match) {\n activeLocalAlias = match.id;\n }\n }\n }\n\n console.log(renderAccountTable(accounts, activeGlobal?.id, activeLocalAlias));\n };\n\n programOrAccountCmd\n .command('list')\n .alias('ls')\n .description('List all configured GitHub accounts')\n .option('--json', 'Output list as JSON')\n .action(handler);\n}\n","import { Command } from 'commander';\nimport ora from 'ora';\nimport { AccountManager } from '../../core/account-manager.js';\nimport { promptEditAccount, promptSelectAccount } from '../../ui/prompts.js';\nimport { logger } from '../../ui/logger.js';\nimport { UpdateAccountInput } from '../../types/account.js';\n\nexport function registerAccountEditCommand(accountCmd: Command): void {\n accountCmd\n .command('edit [alias]')\n .description('Update an existing GitHub account profile')\n .option('-u, --username <username>', 'Update GitHub username')\n .option('-e, --email <email>', 'Update Git commit email')\n .option('-g, --git-name <name>', 'Update Git author name')\n .option('-k, --key-path <path>', 'Update private SSH key path')\n .option('--json', 'Output updated profile in JSON format')\n .action(async (aliasArg, options) => {\n const manager = new AccountManager();\n const accounts = manager.listAccounts();\n\n if (accounts.length === 0) {\n logger.warn('No accounts configured yet. Run \"omx account add\" first.');\n return;\n }\n\n let alias = aliasArg;\n let existing = alias ? manager.getAccount(alias) : undefined;\n\n if (!existing) {\n existing = await promptSelectAccount(accounts, 'Select an account to edit:');\n alias = existing.id;\n }\n\n let updateInput: UpdateAccountInput;\n\n if (options.username || options.email || options.gitName || options.keyPath) {\n updateInput = {\n username: options.username,\n email: options.email,\n gitUserName: options.gitName,\n sshKeyPath: options.keyPath,\n };\n } else {\n updateInput = await promptEditAccount(existing);\n }\n\n const spinner = ora(`Updating account '${alias}'...`).start();\n\n try {\n const updated = await manager.updateAccount(alias, updateInput);\n spinner.succeed(`Account '${alias}' updated successfully!`);\n\n if (options.json) {\n console.log(JSON.stringify(updated, null, 2));\n } else {\n logger.highlight('Username', updated.username);\n logger.highlight('Email', updated.email);\n logger.highlight('Git Author', updated.gitUserName);\n logger.highlight('SSH Host', updated.ssh.hostAlias);\n }\n } catch (err: unknown) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n spinner.fail(`Failed to update account: ${errorMsg}`);\n process.exit(1);\n }\n });\n}\n","import { Command } from 'commander';\nimport ora from 'ora';\nimport { AccountManager } from '../../core/account-manager.js';\nimport { promptConfirm, promptSelectAccount } from '../../ui/prompts.js';\nimport { logger } from '../../ui/logger.js';\n\nexport function registerAccountRemoveCommand(accountCmd: Command): void {\n accountCmd\n .command('remove [alias]')\n .alias('rm')\n .description('Remove a GitHub account profile')\n .option('-d, --delete-keys', 'Also delete the associated SSH private and public key files')\n .option('-y, --yes', 'Skip confirmation prompt')\n .action(async (aliasArg, options) => {\n const manager = new AccountManager();\n const accounts = manager.listAccounts();\n\n if (accounts.length === 0) {\n logger.warn('No accounts configured to remove.');\n return;\n }\n\n let alias = aliasArg;\n let targetAccount = alias ? manager.getAccount(alias) : undefined;\n\n if (!targetAccount) {\n targetAccount = await promptSelectAccount(accounts, 'Select an account to remove:');\n alias = targetAccount.id;\n }\n\n if (!options.yes) {\n const confirmed = await promptConfirm(\n `Are you sure you want to remove account profile '${alias}' (@${targetAccount.username})?`,\n false\n );\n if (!confirmed) {\n logger.info('Operation aborted.');\n return;\n }\n }\n\n const spinner = ora(`Removing account '${alias}'...`).start();\n\n try {\n const removed = manager.removeAccount(alias, Boolean(options.deleteKeys));\n if (removed) {\n spinner.succeed(`Account profile '${alias}' removed successfully.`);\n if (options.deleteKeys) {\n logger.dim(`SSH keys at ${targetAccount.ssh.keyPath} were deleted.`);\n }\n } else {\n spinner.fail(`Account profile '${alias}' was not found.`);\n }\n } catch (err: unknown) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n spinner.fail(`Failed to remove account: ${errorMsg}`);\n process.exit(1);\n }\n });\n}\n","import { Command } from 'commander';\nimport ora from 'ora';\nimport { AccountManager } from '../../core/account-manager.js';\nimport { promptSelectAccount } from '../../ui/prompts.js';\nimport { formatTestResult } from '../../ui/formatters.js';\nimport { logger } from '../../ui/logger.js';\n\nexport function registerAccountTestCommand(accountCmd: Command): void {\n accountCmd\n .command('test [alias]')\n .description('Test SSH connectivity and authentication for an account')\n .option('--all', 'Test all configured accounts')\n .option('--json', 'Output results in JSON format')\n .action(async (aliasArg, options) => {\n const manager = new AccountManager();\n const accounts = manager.listAccounts();\n\n if (accounts.length === 0) {\n logger.warn('No accounts configured yet. Run \"omx account add\" first.');\n return;\n }\n\n if (options.all) {\n const results = [];\n for (const acc of accounts) {\n const spinner = ora(`Testing SSH connection for '${acc.id}' (${acc.ssh.hostAlias})...`).start();\n const result = await manager.testAccount(acc.id);\n if (result.authenticated) {\n spinner.succeed(`Account '${acc.id}' authenticated successfully.`);\n } else {\n spinner.fail(`Account '${acc.id}' authentication failed.`);\n }\n results.push(result);\n }\n\n if (options.json) {\n console.log(JSON.stringify(results, null, 2));\n } else {\n for (const res of results) {\n console.log('\\n' + formatTestResult(res));\n }\n }\n return;\n }\n\n let alias = aliasArg;\n if (!alias) {\n const selected = await promptSelectAccount(accounts, 'Select an account to test SSH connection:');\n alias = selected.id;\n }\n\n const targetAccount = manager.getAccount(alias);\n if (!targetAccount) {\n logger.error(`Account profile '${alias}' does not exist.`);\n process.exit(1);\n }\n\n const spinner = ora(`Testing SSH connection to ${targetAccount.ssh.hostAlias}...`).start();\n const result = await manager.testAccount(alias);\n\n if (result.authenticated) {\n spinner.succeed(`SSH Authentication successful!`);\n } else {\n spinner.fail(`SSH Authentication failed.`);\n }\n\n if (options.json) {\n console.log(JSON.stringify(result, null, 2));\n } else {\n console.log('\\n' + formatTestResult(result));\n }\n });\n}\n","import path from 'node:path';\nimport { Command } from 'commander';\nimport * as p from '@clack/prompts';\nimport ora from 'ora';\nimport pc from 'picocolors';\nimport { AccountManager } from '../../core/account-manager.js';\nimport { SshService } from '../../core/ssh-service.js';\nimport { handleCancel } from '../../ui/prompts.js';\nimport { logger } from '../../ui/logger.js';\nimport { formatPublicKeyGuide } from '../../ui/formatters.js';\n\nexport function registerAccountImportCommand(accountCmd: Command): void {\n accountCmd\n .command('import [keyPath]')\n .description('Automatically discover or import an existing SSH key as an octomux account')\n .option('-a, --alias <id>', 'Account alias identifier')\n .option('-u, --username <username>', 'GitHub username')\n .option('-e, --email <email>', 'Git commit email')\n .option('-g, --git-name <name>', 'Git author name')\n .option('--global', 'Set as default global Git identity')\n .action(async (keyPathArg, options) => {\n const manager = new AccountManager();\n const sshService = new SshService();\n\n let targetKeyPath = keyPathArg;\n let initialEmail = options.email || '';\n let initialUsername = options.username || '';\n\n if (!targetKeyPath) {\n p.intro(pc.bold(pc.cyan('octomux (omx) — Auto-Import Existing SSH Key')));\n\n const discovered = sshService.scanExistingSshKeys();\n if (discovered.length === 0) {\n logger.warn('No existing SSH keys found in ~/.ssh. Use \"omx account add\" to generate one.');\n return;\n }\n\n const selectedKey = await p.select({\n message: 'Select an existing SSH key to import:',\n options: discovered.map((k) => {\n const comment = k.comment ? ` (${k.comment})` : '';\n return {\n value: k.privateKeyPath,\n label: `${pc.bold(k.name)} [${k.keyType}]${comment}`,\n };\n }),\n });\n handleCancel(selectedKey);\n targetKeyPath = selectedKey as string;\n\n // Try extracting comment from key\n const match = discovered.find((k) => k.privateKeyPath === targetKeyPath);\n if (match?.comment) {\n if (match.comment.includes('@')) {\n initialEmail = match.comment;\n } else {\n initialUsername = match.comment;\n }\n }\n }\n\n const basename = path.basename(targetKeyPath).replace(/^id_(ed25519|rsa|ecdsa)_?/, '') || 'profile';\n const defaultAlias = options.alias || (basename !== 'profile' ? basename : 'imported');\n\n const alias = options.alias || (await p.text({\n message: 'Account alias ID (e.g. work, personal):',\n initialValue: defaultAlias,\n validate: (val) => (!val || !val.trim() ? 'Alias is required' : undefined),\n }));\n handleCancel(alias);\n\n const username = options.username || (await p.text({\n message: 'GitHub username:',\n initialValue: initialUsername,\n validate: (val) => (!val || !val.trim() ? 'Username is required' : undefined),\n }));\n handleCancel(username);\n\n const email = options.email || (await p.text({\n message: 'Git commit email:',\n initialValue: initialEmail,\n validate: (val) => {\n if (!val || !val.trim()) return 'Email is required';\n if (!/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(val)) return 'Invalid email address';\n return undefined;\n },\n }));\n handleCancel(email);\n\n const gitUserName = options.gitName || (await p.text({\n message: 'Git author name:',\n initialValue: username as string,\n }));\n handleCancel(gitUserName);\n\n const setAsGlobal = options.global !== undefined\n ? Boolean(options.global)\n : await p.confirm({\n message: 'Set as active global Git identity?',\n initialValue: false,\n });\n handleCancel(setAsGlobal);\n\n const spinner = ora('Importing key and configuring SSH host...').start();\n\n try {\n const profile = await manager.addAccount({\n id: (alias as string).trim(),\n username: (username as string).trim(),\n email: (email as string).trim(),\n gitUserName: ((gitUserName as string) || (username as string)).trim(),\n sshKeyPath: targetKeyPath,\n generateKey: false,\n setAsGlobal: Boolean(setAsGlobal),\n });\n\n spinner.succeed(`Account '${profile.id}' imported successfully with key: ${path.basename(targetKeyPath)}`);\n\n const pubKeyContent = sshService.getPublicKey(profile.ssh.keyPath);\n const guide = formatPublicKeyGuide(profile, pubKeyContent);\n logger.box(guide, 'Account Imported', 'green');\n } catch (err: unknown) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n spinner.fail(`Failed to import account: ${errorMsg}`);\n process.exit(1);\n }\n });\n}\n","import { Command } from 'commander';\nimport { registerAccountAddCommand } from './add.js';\nimport { registerAccountListCommand } from './list.js';\nimport { registerAccountEditCommand } from './edit.js';\nimport { registerAccountRemoveCommand } from './remove.js';\nimport { registerAccountTestCommand } from './test.js';\nimport { registerAccountImportCommand } from './import.js';\n\nexport function registerAccountCommands(program: Command): void {\n const accountCmd = program\n .command('account')\n .alias('acc')\n .description('Manage GitHub account profiles and SSH configurations');\n\n registerAccountAddCommand(accountCmd);\n registerAccountListCommand(accountCmd);\n registerAccountEditCommand(accountCmd);\n registerAccountRemoveCommand(accountCmd);\n registerAccountTestCommand(accountCmd);\n registerAccountImportCommand(accountCmd);\n\n // Also expose `omx ls` and `omx import` directly on the root program\n registerAccountListCommand(program);\n registerAccountImportCommand(program);\n}\n","import { Command } from 'commander';\nimport * as p from '@clack/prompts';\nimport { AccountManager } from '../core/account-manager.js';\nimport { GitService } from '../core/git-service.js';\nimport { promptSelectAccount, handleCancel } from '../ui/prompts.js';\nimport { logger } from '../ui/logger.js';\n\nexport function registerSwitchCommand(program: Command): void {\n program\n .command('switch [alias]')\n .alias('use')\n .description('Switch active Git identity locally in current repository or globally')\n .option('-g, --global', 'Apply switch to global Git configuration')\n .option('-l, --local', 'Apply switch to local repository Git configuration')\n .action(async (aliasArg, options) => {\n const manager = new AccountManager();\n const gitService = new GitService();\n const accounts = manager.listAccounts();\n\n if (accounts.length === 0) {\n logger.warn('No accounts configured yet. Run \"omx account add\" first.');\n return;\n }\n\n let targetAccount = aliasArg ? manager.getAccount(aliasArg) : undefined;\n if (!targetAccount) {\n targetAccount = await promptSelectAccount(accounts, 'Select account to switch to:');\n }\n\n let isGlobal = Boolean(options.global);\n let isLocal = Boolean(options.local);\n\n const inRepo = await gitService.isInsideGitRepo();\n\n // If user didn't specify --global or --local\n if (!isGlobal && !isLocal) {\n if (inRepo) {\n const scope = await p.select({\n message: `Where do you want to apply account '${targetAccount.id}'?`,\n options: [\n { value: 'local', label: 'Local Repository (Current folder only, with dedicated SSH key)' },\n { value: 'global', label: 'Global (System-wide default Git user)' },\n { value: 'both', label: 'Both Local Repository & Global' },\n ],\n });\n handleCancel(scope);\n\n if (scope === 'local' || scope === 'both') isLocal = true;\n if (scope === 'global' || scope === 'both') isGlobal = true;\n } else {\n isGlobal = true;\n }\n }\n\n if (isGlobal) {\n await manager.switchGlobal(targetAccount.id);\n logger.success(`Global Git identity switched to: ${targetAccount.gitUserName} <${targetAccount.email}>`);\n }\n\n if (isLocal) {\n if (!inRepo) {\n logger.error('Cannot apply local config: Current directory is not inside a Git repository.');\n process.exit(1);\n }\n await manager.switchLocal(targetAccount.id);\n logger.success(`Local repository Git identity switched to: ${targetAccount.gitUserName} <${targetAccount.email}>`);\n logger.dim(`SSH Key bound: ${targetAccount.ssh.keyPath}`);\n }\n });\n}\n","import { Command } from 'commander';\nimport pc from 'picocolors';\nimport { AccountManager } from '../core/account-manager.js';\nimport { GitService } from '../core/git-service.js';\nimport { logger } from '../ui/logger.js';\n\nexport function registerStatusCommand(program: Command): void {\n const handler = async (options: { json?: boolean }) => {\n const manager = new AccountManager();\n const gitService = new GitService();\n const accounts = manager.listAccounts();\n\n const globalIdentity = await gitService.getIdentity('global');\n const inRepo = await gitService.isInsideGitRepo();\n let localIdentity;\n let repoRoot: string | undefined;\n let remoteUrl: string | undefined;\n\n if (inRepo) {\n localIdentity = await gitService.getIdentity('local');\n repoRoot = await gitService.getRepoRoot();\n remoteUrl = await gitService.getRemoteUrl();\n }\n\n const matchedGlobal = accounts.find(\n (a) => a.email.toLowerCase() === globalIdentity.email?.toLowerCase()\n );\n const matchedLocal = localIdentity?.email\n ? accounts.find((a) => a.email.toLowerCase() === localIdentity?.email?.toLowerCase())\n : undefined;\n\n if (options.json) {\n console.log(\n JSON.stringify(\n {\n inRepo,\n repoRoot,\n remoteUrl,\n global: {\n ...globalIdentity,\n matchedAccount: matchedGlobal?.id,\n },\n local: inRepo\n ? {\n ...localIdentity,\n matchedAccount: matchedLocal?.id,\n }\n : null,\n },\n null,\n 2\n )\n );\n return;\n }\n\n const lines: string[] = [];\n\n lines.push(pc.bold(pc.cyan('● Global Git Configuration:')));\n lines.push(\n ` Author: ${globalIdentity.name || pc.dim('(not set)')} <${\n globalIdentity.email || pc.dim('(not set)')\n }>`\n );\n if (matchedGlobal) {\n lines.push(` Profile: ${pc.yellow(matchedGlobal.id)} (@${matchedGlobal.username})`);\n } else {\n lines.push(` Profile: ${pc.dim('No matching octomux profile')}`);\n }\n\n lines.push('');\n\n if (inRepo) {\n lines.push(pc.bold(pc.green('● Current Local Repository:')));\n lines.push(` Path: ${repoRoot}`);\n if (remoteUrl) {\n lines.push(` Remote: ${pc.dim(remoteUrl)}`);\n }\n lines.push(\n ` Author: ${localIdentity?.name || pc.dim('(inherited from global)')} <${\n localIdentity?.email || pc.dim('(inherited from global)')\n }>`\n );\n if (localIdentity?.sshCommand) {\n lines.push(` SSH: ${pc.dim(localIdentity.sshCommand)}`);\n }\n if (matchedLocal) {\n lines.push(` Profile: ${pc.yellow(matchedLocal.id)} (@${matchedLocal.username})`);\n }\n } else {\n lines.push(pc.bold(pc.dim('● Current Directory is not a Git repository.')));\n }\n\n logger.box(lines.join('\\n'), 'Git & Identity Status', inRepo ? 'green' : 'cyan');\n };\n\n program\n .command('status')\n .alias('current')\n .description('Show active Git identities (global & local repository) and profile match')\n .option('--json', 'Output status as JSON')\n .action(handler);\n}\n","import path from 'node:path';\nimport fs from 'node:fs';\nimport { Command } from 'commander';\nimport ora from 'ora';\nimport { AccountManager } from '../core/account-manager.js';\nimport { GitService } from '../core/git-service.js';\nimport { promptSelectAccount } from '../ui/prompts.js';\nimport { formatCloneSummary } from '../ui/formatters.js';\nimport { logger } from '../ui/logger.js';\nimport { AccountProfile } from '../types/account.js';\n\nexport function registerCloneCommand(program: Command): void {\n program\n .command('clone <repo> [directory]')\n .description('Smart clone a GitHub repository and automatically configure local identity')\n .option('-a, --account <alias>', 'Account profile to clone and bind with')\n .option('--json', 'Output clone result as JSON')\n .allowUnknownOption(false)\n .action(async (repoInput: string, directoryArg: string | undefined, options) => {\n const manager = new AccountManager();\n const gitService = new GitService();\n const accounts = manager.listAccounts();\n\n if (accounts.length === 0) {\n logger.error('No accounts configured in octomux yet. Please run \"omx account add\" first.');\n process.exit(1);\n }\n\n // Parse repository input\n const parsedRepo = gitService.parseRepoInput(repoInput);\n if (!parsedRepo) {\n logger.error(\n `Invalid repository format: \"${repoInput}\".\\nSupported formats:\\n - owner/repo\\n - https://github.com/owner/repo.git\\n - git@github.com:owner/repo.git`\n );\n process.exit(1);\n }\n\n // Resolve account\n let account: AccountProfile | undefined;\n if (options.account) {\n account = manager.getAccount(options.account);\n if (!account) {\n logger.error(`Account profile '${options.account}' not found.`);\n process.exit(1);\n }\n } else if (accounts.length === 1 && accounts[0]) {\n account = accounts[0];\n } else {\n account = await promptSelectAccount(\n accounts,\n `Select the account to clone ${parsedRepo.owner}/${parsedRepo.repo}:`\n );\n }\n\n const sshCloneUrl = gitService.formatSshCloneUrl(\n account.ssh.hostAlias,\n parsedRepo.owner,\n parsedRepo.repo\n );\n\n logger.info(`Cloning with profile ${account.id} using SSH host: ${account.ssh.hostAlias}`);\n\n try {\n const clonedDirName = await gitService.clone(sshCloneUrl, directoryArg);\n const resolvedPath = path.resolve(process.cwd(), clonedDirName);\n\n // Verify the directory exists\n if (fs.existsSync(resolvedPath)) {\n const spinner = ora('Binding local Git author & SSH key configuration...').start();\n await gitService.setLocalIdentity(\n account.gitUserName,\n account.email,\n account.ssh.keyPath,\n resolvedPath\n );\n spinner.succeed('Local Git identity configured!');\n\n if (options.json) {\n console.log(\n JSON.stringify(\n {\n success: true,\n repository: `${parsedRepo.owner}/${parsedRepo.repo}`,\n path: resolvedPath,\n account: account.id,\n gitUserName: account.gitUserName,\n email: account.email,\n sshKey: account.ssh.keyPath,\n },\n null,\n 2\n )\n );\n } else {\n const summary = formatCloneSummary(\n `${parsedRepo.owner}/${parsedRepo.repo}`,\n resolvedPath,\n account\n );\n logger.box(summary, 'Smart Clone Complete', 'green');\n }\n }\n } catch (err: unknown) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n logger.error(`Git clone failed: ${errorMsg}`);\n process.exit(1);\n }\n });\n}\n","import { Command } from 'commander';\nimport * as p from '@clack/prompts';\nimport pc from 'picocolors';\nimport { AccountManager } from '../core/account-manager.js';\nimport { GitService } from '../core/git-service.js';\nimport { promptConfirm, promptSelectAccount, handleCancel } from '../ui/prompts.js';\nimport { logger } from '../ui/logger.js';\nimport { AccountProfile } from '../types/account.js';\n\nexport function registerRemoteCommand(program: Command): void {\n program\n .command('remote [repo]')\n .alias('origin')\n .description('Add or update Git remote origin and automatically bind local identity')\n .option('-a, --account <alias>', 'Account profile to bind with this remote')\n .option('-r, --remote <name>', 'Remote name', 'origin')\n .option('--init', 'Initialize a new Git repository if not already one')\n .option('--json', 'Output result in JSON format')\n .action(async (repoArg: string | undefined, options) => {\n const manager = new AccountManager();\n const gitService = new GitService();\n const accounts = manager.listAccounts();\n\n if (accounts.length === 0) {\n logger.error('No accounts configured in octomux yet. Run \"omx account add\" first.');\n process.exit(1);\n }\n\n let inRepo = await gitService.isInsideGitRepo();\n if (!inRepo) {\n if (options.init) {\n await gitService.initRepo();\n logger.success('Initialized new Git repository in current directory.');\n inRepo = true;\n } else {\n const shouldInit = await promptConfirm(\n 'Current directory is not a Git repository. Initialize git repository now?',\n true\n );\n if (shouldInit) {\n await gitService.initRepo();\n logger.success('Initialized new Git repository in current directory.');\n inRepo = true;\n } else {\n logger.error('Operation aborted: Not a Git repository.');\n process.exit(1);\n }\n }\n }\n\n let repoInput = repoArg;\n if (!repoInput) {\n const input = await p.text({\n message: 'Enter GitHub repository (e.g. owner/repo, https://github.com/owner/repo, or git@...):',\n placeholder: 'username/repo-name',\n validate: (val) => (!val || !val.trim() ? 'Repository is required' : undefined),\n });\n handleCancel(input);\n repoInput = input as string;\n }\n\n const parsedRepo = gitService.parseRepoInput(repoInput);\n if (!parsedRepo) {\n logger.error(\n `Invalid repository format: \"${repoInput}\".\\nSupported formats:\\n - owner/repo\\n - https://github.com/owner/repo.git\\n - git@github.com:owner/repo.git`\n );\n process.exit(1);\n }\n\n // Resolve account\n let account: AccountProfile | undefined;\n if (options.account) {\n account = manager.getAccount(options.account);\n if (!account) {\n logger.error(`Account profile '${options.account}' not found.`);\n process.exit(1);\n }\n } else if (accounts.length === 1 && accounts[0]) {\n account = accounts[0];\n } else {\n account = await promptSelectAccount(\n accounts,\n `Select the account profile for remote '${options.remote}':`\n );\n }\n\n const sshRemoteUrl = gitService.formatSshCloneUrl(\n account.ssh.hostAlias,\n parsedRepo.owner,\n parsedRepo.repo\n );\n\n const remoteName = options.remote || 'origin';\n const existingUrl = await gitService.getRemoteUrl(remoteName);\n\n if (existingUrl) {\n await gitService.setRemoteUrl(remoteName, sshRemoteUrl);\n logger.success(`Updated existing remote '${remoteName}' URL.`);\n } else {\n await gitService.addRemoteUrl(remoteName, sshRemoteUrl);\n logger.success(`Added remote '${remoteName}'.`);\n }\n\n // Automatically configure local repository author & SSH key\n await gitService.setLocalIdentity(\n account.gitUserName,\n account.email,\n account.ssh.keyPath\n );\n\n if (options.json) {\n console.log(\n JSON.stringify(\n {\n success: true,\n remote: remoteName,\n url: sshRemoteUrl,\n account: account.id,\n gitUserName: account.gitUserName,\n email: account.email,\n sshKey: account.ssh.keyPath,\n },\n null,\n 2\n )\n );\n return;\n }\n\n const summaryLines = [\n pc.bold(pc.green(`Remote '${remoteName}' configured successfully!`)),\n '',\n ` ${pc.bold('Remote URL:')} ${pc.cyan(sshRemoteUrl)}`,\n ` ${pc.bold('Account:')} ${pc.yellow(account.id)} (@${account.username})`,\n ` ${pc.bold('Author:')} ${account.gitUserName} <${account.email}>`,\n ` ${pc.bold('SSH Host:')} ${pc.cyan(account.ssh.hostAlias)}`,\n '',\n pc.dim('You can now push with: git push -u ' + remoteName + ' main'),\n ];\n\n logger.box(summaryLines.join('\\n'), 'Remote Origin Configured', 'green');\n });\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport { Command } from 'commander';\nimport ora from 'ora';\nimport { ConfigStore } from '../core/config-store.js';\nimport { SshService } from '../core/ssh-service.js';\nimport { getOctomuxDir, getSshDir } from '../platform/paths.js';\nimport { promptConfirm } from '../ui/prompts.js';\nimport { logger } from '../ui/logger.js';\n\nexport function registerUninstallCommand(program: Command): void {\n program\n .command('uninstall')\n .alias('purge')\n .description('Safely clean up octomux configurations, SSH blocks, and local data')\n .option('--delete-keys', 'Also delete octomux-generated SSH private & public keys')\n .option('-y, --yes', 'Skip interactive confirmation')\n .action(async (options) => {\n const configStore = new ConfigStore();\n const sshService = new SshService();\n\n logger.warn('This will safely remove octomux configurations from your system.');\n\n if (!options.yes) {\n const confirmed = await promptConfirm(\n 'Are you sure you want to clean up all octomux managed configurations?',\n false\n );\n if (!confirmed) {\n logger.info('Uninstall operation aborted.');\n return;\n }\n }\n\n let deleteKeys = Boolean(options.deleteKeys);\n if (!options.yes && !options.deleteKeys) {\n deleteKeys = await promptConfirm(\n 'Do you also want to delete all SSH keys generated by octomux (~/.ssh/id_*_octomux_*)?',\n false\n );\n }\n\n const spinner = ora('Cleaning up octomux configurations...').start();\n\n try {\n // 1. Clean ~/.ssh/config managed block\n sshService.syncSshConfig([]);\n spinner.text = 'Cleaned octomux managed block in ~/.ssh/config...';\n\n // 2. Optionally delete generated SSH keys\n if (deleteKeys) {\n const accounts = Object.values(configStore.getAccounts());\n for (const acc of accounts) {\n if (fs.existsSync(acc.ssh.keyPath)) {\n try {\n fs.unlinkSync(acc.ssh.keyPath);\n } catch {\n // Ignore file lock errors\n }\n }\n if (fs.existsSync(acc.ssh.publicKeyPath)) {\n try {\n fs.unlinkSync(acc.ssh.publicKeyPath);\n } catch {\n // Ignore\n }\n }\n }\n\n // Scan ~/.ssh for any orphaned id_*_octomux_* files\n const sshDir = getSshDir();\n if (fs.existsSync(sshDir)) {\n const files = fs.readdirSync(sshDir);\n for (const file of files) {\n if (file.includes('_octomux_')) {\n try {\n fs.unlinkSync(path.join(sshDir, file));\n } catch {\n // Ignore\n }\n }\n }\n }\n }\n\n // 3. Remove ~/.octomux directory\n const octomuxDir = getOctomuxDir();\n if (fs.existsSync(octomuxDir)) {\n fs.rmSync(octomuxDir, { recursive: true, force: true });\n }\n\n spinner.succeed('octomux configurations cleaned up successfully!');\n\n const lines = [\n 'octomux data has been safely uninstalled:',\n ' ✔ Cleaned managed entries from ~/.ssh/config (custom user hosts preserved)',\n deleteKeys\n ? ' ✔ Deleted octomux-generated SSH keys'\n : ' ℹ Preserved SSH keys in ~/.ssh/',\n ' ✔ Removed ~/.octomux configuration store',\n '',\n 'To remove the npm binary package, run:',\n ' npm uninstall -g octomux (or \"npm unlink -g octomux\" for dev builds)',\n ];\n\n logger.box(lines.join('\\n'), 'Safe Uninstall Complete', 'green');\n } catch (err: unknown) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n spinner.fail(`Failed to clean up: ${errorMsg}`);\n process.exit(1);\n }\n });\n}\n"],"mappings":"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","names":["p","pc","fs","path","z","z","path","fs","path","fs","os","fs","path","execa","execa","fs","pc","pc","pc","ora","ora","ora","ora","ora","spinner","ora","result","path","p","ora","pc","pc","path","ora","p","pc","pc","path","fs","ora","path","fs","ora","p","pc","pc","fs","path","ora","ora","fs","path","pc"]}
|
package/dist/index.d.ts
ADDED
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
package/package.json
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@siamriaz/octomux",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Enterprise-grade cross-platform GitHub multi-account, SSH identity, and smart clone manager",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"publishConfig": {
|
|
7
|
+
"access": "public"
|
|
8
|
+
},
|
|
9
|
+
"bin": {
|
|
10
|
+
"octomux": "./dist/bin/octomux.js",
|
|
11
|
+
"omx": "./dist/bin/octomux.js"
|
|
12
|
+
},
|
|
13
|
+
"main": "./dist/index.js",
|
|
14
|
+
"types": "./dist/index.d.ts",
|
|
15
|
+
"files": [
|
|
16
|
+
"dist"
|
|
17
|
+
],
|
|
18
|
+
"engines": {
|
|
19
|
+
"node": ">=18.0.0"
|
|
20
|
+
},
|
|
21
|
+
"scripts": {
|
|
22
|
+
"build": "tsup",
|
|
23
|
+
"dev": "tsup --watch",
|
|
24
|
+
"start": "node dist/bin/octomux.js",
|
|
25
|
+
"test": "vitest run",
|
|
26
|
+
"test:watch": "vitest",
|
|
27
|
+
"typecheck": "tsc --noEmit",
|
|
28
|
+
"prepublishOnly": "npm run typecheck && npm run test && npm run build"
|
|
29
|
+
},
|
|
30
|
+
"keywords": [
|
|
31
|
+
"github",
|
|
32
|
+
"git",
|
|
33
|
+
"multi-account",
|
|
34
|
+
"ssh",
|
|
35
|
+
"identity",
|
|
36
|
+
"cli",
|
|
37
|
+
"octomux",
|
|
38
|
+
"omx",
|
|
39
|
+
"ssh-config",
|
|
40
|
+
"git-config"
|
|
41
|
+
],
|
|
42
|
+
"author": "Siam",
|
|
43
|
+
"repository": {
|
|
44
|
+
"type": "git",
|
|
45
|
+
"url": "git+https://github.com/Siam777/github-manager.git"
|
|
46
|
+
},
|
|
47
|
+
"bugs": {
|
|
48
|
+
"url": "https://github.com/Siam777/github-manager/issues"
|
|
49
|
+
},
|
|
50
|
+
"homepage": "https://github.com/Siam777/github-manager#readme",
|
|
51
|
+
"license": "MIT",
|
|
52
|
+
"dependencies": {
|
|
53
|
+
"@clack/prompts": "^0.8.2",
|
|
54
|
+
"boxen": "^8.0.1",
|
|
55
|
+
"cli-table3": "^0.6.5",
|
|
56
|
+
"commander": "^12.1.0",
|
|
57
|
+
"execa": "^9.3.1",
|
|
58
|
+
"ora": "^8.0.1",
|
|
59
|
+
"picocolors": "^1.1.0",
|
|
60
|
+
"zod": "^3.23.8"
|
|
61
|
+
},
|
|
62
|
+
"devDependencies": {
|
|
63
|
+
"@types/node": "^20.14.12",
|
|
64
|
+
"tsup": "^8.2.4",
|
|
65
|
+
"typescript": "^5.5.4",
|
|
66
|
+
"vitest": "^2.0.5"
|
|
67
|
+
}
|
|
68
|
+
}
|