diff --git a/cli/src/commands/configure.ts b/cli/src/commands/configure.ts index f4ce1818..a9ac3602 100644 --- a/cli/src/commands/configure.ts +++ b/cli/src/commands/configure.ts @@ -14,6 +14,7 @@ import { resolveDefaultLogsDir, resolvePaperclipInstanceId, } from "../config/home.js"; +import { printPaperclipCliBanner } from "../utils/banner.js"; type Section = "llm" | "database" | "logging" | "server" | "storage" | "secrets"; @@ -63,6 +64,7 @@ export async function configure(opts: { config?: string; section?: string; }): Promise { + printPaperclipCliBanner(); p.intro(pc.bgCyan(pc.black(" paperclip configure "))); const configPath = resolveConfigPath(opts.config); diff --git a/cli/src/commands/doctor.ts b/cli/src/commands/doctor.ts index 4eda9c7e..838f6d24 100644 --- a/cli/src/commands/doctor.ts +++ b/cli/src/commands/doctor.ts @@ -14,6 +14,7 @@ import { storageCheck, type CheckResult, } from "../checks/index.js"; +import { printPaperclipCliBanner } from "../utils/banner.js"; const STATUS_ICON = { pass: pc.green("✓"), @@ -26,6 +27,7 @@ export async function doctor(opts: { repair?: boolean; yes?: boolean; }): Promise<{ passed: number; warned: number; failed: number }> { + printPaperclipCliBanner(); p.intro(pc.bgCyan(pc.black(" paperclip doctor "))); const configPath = resolveConfigPath(opts.config); diff --git a/cli/src/commands/onboard.ts b/cli/src/commands/onboard.ts index 0e3c744c..1c38ff0d 100644 --- a/cli/src/commands/onboard.ts +++ b/cli/src/commands/onboard.ts @@ -12,8 +12,10 @@ import { defaultStorageConfig, promptStorage } from "../prompts/storage.js"; import { promptServer } from "../prompts/server.js"; import { describeLocalInstancePaths, resolvePaperclipInstanceId } from "../config/home.js"; import { bootstrapCeoInvite } from "./auth-bootstrap-ceo.js"; +import { printPaperclipCliBanner } from "../utils/banner.js"; export async function onboard(opts: { config?: string }): Promise { + printPaperclipCliBanner(); p.intro(pc.bgCyan(pc.black(" paperclipai onboard "))); const instance = describeLocalInstancePaths(resolvePaperclipInstanceId()); p.log.message( diff --git a/cli/src/utils/banner.ts b/cli/src/utils/banner.ts new file mode 100644 index 00000000..d8bc7f15 --- /dev/null +++ b/cli/src/utils/banner.ts @@ -0,0 +1,23 @@ +import pc from "picocolors"; + +const PAPERCLIP_ART = [ + " ____ _ ____ _____ ____ ____ _ ___ ____ ", + "| _ \\ / \\ | _ \\| ____| _ \\ / ___| | |_ _| _ \\ ", + "| |_) / _ \\ | |_) | _| | |_) | | | | | || |_) |", + "| __/ ___ \\| __/| |___| _ <| |___| |___ | || __/ ", + "|_| /_/ \\_\\_| |_____|_| \\_\\\\____|_____|___|_| ", +] as const; + +const TAGLINE = "Open-source orchestration for zero-human companies"; + +export function printPaperclipCliBanner(): void { + const lines = [ + "", + ...PAPERCLIP_ART.map((line) => pc.cyan(line)), + pc.blue(" ------------------------------------------------------"), + pc.bold(pc.white(` ${TAGLINE}`)), + "", + ]; + + console.log(lines.join("\n")); +}