/** * Argument parser for /vault commands. * * Splits raw input into a typed subcommand plus remaining args[]. * This supports current single-arg subcommands and future multi-arg * commands like `/vault export age` or `/vault backend keychain`. */ const SUBCOMMANDS = [ "show", "verify", "providers", "setup", "import", "export", "path", "help", ] as const; export type Subcommand = (typeof SUBCOMMANDS)[number]; export interface ParsedCommand { readonly subcommand: Subcommand; readonly args: readonly string[]; } export function isSubcommand(value: string): value is Subcommand { return (SUBCOMMANDS as readonly string[]).includes(value); } /** * Parse raw command input into subcommand + args. * Returns undefined when input is empty (settings panel path). * Throws on unrecognized subcommand. */ export function parseVaultArgs(raw: string): ParsedCommand | undefined { const tokens = raw .trim() .split(/\s+/) .filter((t) => t.length > 0); if (tokens.length === 0) { return undefined; } const first = tokens[0]; if (!first) { return undefined; } const candidate = first.toLowerCase(); if (!isSubcommand(candidate)) { return undefined; } return { subcommand: candidate, args: tokens.slice(1), }; } export function getSubcommands(): readonly Subcommand[] { return SUBCOMMANDS; } export function getSubcommandDescription(cmd: Subcommand): string { switch (cmd) { case "show": return "Backend status and managed providers"; case "verify": return "Check backend health"; case "providers": return "List managed vs excluded providers"; case "setup": return "Guided first-time setup"; case "import": return "Import existing auth.json credentials into vault"; case "export": return "Export credentials to another backend or rewrite current"; case "path": return "Config and vault file locations"; case "help": return "Usage summary"; } }