Spaces:
Paused
Paused
| import { Command } from "commander"; | |
| import pc from "picocolors"; | |
| import { | |
| readContext, | |
| resolveContextPath, | |
| resolveProfile, | |
| setCurrentProfile, | |
| upsertProfile, | |
| } from "../../client/context.js"; | |
| import { printOutput } from "./common.js"; | |
| interface ContextOptions { | |
| dataDir?: string; | |
| context?: string; | |
| profile?: string; | |
| json?: boolean; | |
| } | |
| interface ContextSetOptions extends ContextOptions { | |
| apiBase?: string; | |
| companyId?: string; | |
| apiKeyEnvVarName?: string; | |
| use?: boolean; | |
| } | |
| export function registerContextCommands(program: Command): void { | |
| const context = program.command("context").description("Manage CLI client context profiles"); | |
| context | |
| .command("show") | |
| .description("Show current context and active profile") | |
| .option("-d, --data-dir <path>", "Paperclip data directory root (isolates state from ~/.paperclip)") | |
| .option("--context <path>", "Path to CLI context file") | |
| .option("--profile <name>", "Profile to inspect") | |
| .option("--json", "Output raw JSON") | |
| .action((opts: ContextOptions) => { | |
| const contextPath = resolveContextPath(opts.context); | |
| const store = readContext(opts.context); | |
| const resolved = resolveProfile(store, opts.profile); | |
| const payload = { | |
| contextPath, | |
| currentProfile: store.currentProfile, | |
| profileName: resolved.name, | |
| profile: resolved.profile, | |
| profiles: store.profiles, | |
| }; | |
| printOutput(payload, { json: opts.json }); | |
| }); | |
| context | |
| .command("list") | |
| .description("List available context profiles") | |
| .option("-d, --data-dir <path>", "Paperclip data directory root (isolates state from ~/.paperclip)") | |
| .option("--context <path>", "Path to CLI context file") | |
| .option("--json", "Output raw JSON") | |
| .action((opts: ContextOptions) => { | |
| const store = readContext(opts.context); | |
| const rows = Object.entries(store.profiles).map(([name, profile]) => ({ | |
| name, | |
| current: name === store.currentProfile, | |
| apiBase: profile.apiBase ?? null, | |
| companyId: profile.companyId ?? null, | |
| apiKeyEnvVarName: profile.apiKeyEnvVarName ?? null, | |
| })); | |
| printOutput(rows, { json: opts.json }); | |
| }); | |
| context | |
| .command("use") | |
| .description("Set active context profile") | |
| .argument("<profile>", "Profile name") | |
| .option("-d, --data-dir <path>", "Paperclip data directory root (isolates state from ~/.paperclip)") | |
| .option("--context <path>", "Path to CLI context file") | |
| .action((profile: string, opts: ContextOptions) => { | |
| setCurrentProfile(profile, opts.context); | |
| console.log(pc.green(`Active profile set to '${profile}'.`)); | |
| }); | |
| context | |
| .command("set") | |
| .description("Set values on a profile") | |
| .option("-d, --data-dir <path>", "Paperclip data directory root (isolates state from ~/.paperclip)") | |
| .option("--context <path>", "Path to CLI context file") | |
| .option("--profile <name>", "Profile name (default: current profile)") | |
| .option("--api-base <url>", "Default API base URL") | |
| .option("--company-id <id>", "Default company ID") | |
| .option("--api-key-env-var-name <name>", "Env var containing API key (recommended)") | |
| .option("--use", "Set this profile as active") | |
| .option("--json", "Output raw JSON") | |
| .action((opts: ContextSetOptions) => { | |
| const existing = readContext(opts.context); | |
| const targetProfile = opts.profile?.trim() || existing.currentProfile || "default"; | |
| upsertProfile( | |
| targetProfile, | |
| { | |
| apiBase: opts.apiBase, | |
| companyId: opts.companyId, | |
| apiKeyEnvVarName: opts.apiKeyEnvVarName, | |
| }, | |
| opts.context, | |
| ); | |
| if (opts.use) { | |
| setCurrentProfile(targetProfile, opts.context); | |
| } | |
| const updated = readContext(opts.context); | |
| const resolved = resolveProfile(updated, targetProfile); | |
| const payload = { | |
| contextPath: resolveContextPath(opts.context), | |
| currentProfile: updated.currentProfile, | |
| profileName: resolved.name, | |
| profile: resolved.profile, | |
| }; | |
| if (!opts.json) { | |
| console.log(pc.green(`Updated profile '${targetProfile}'.`)); | |
| if (opts.use) { | |
| console.log(pc.green(`Set '${targetProfile}' as active profile.`)); | |
| } | |
| } | |
| printOutput(payload, { json: opts.json }); | |
| }); | |
| } | |