75e211415e
- Added lazy-loaded `gallery` command registration and new filters for tool, state, width, expanded, and plain output. - Implemented gallery state rendering with terminal-width defaults, state filtering, and unknown-tool fallback handling. - Added shared fixture types and aggregated renderer fixtures for multiple tool families in `galleryFixtures`. - Added tests for renderer state coverage, route-specific output (streaming/progress/success/error), and fixture fallback.
50 lines
3.0 KiB
TypeScript
50 lines
3.0 KiB
TypeScript
/**
|
|
* Top-level CLI command table.
|
|
*
|
|
* Lives in its own module (importable without side effects) so that tests can
|
|
* inspect the registered subcommands without triggering the side-effectful
|
|
* top-level await in `cli.ts`. Adding a new subcommand here is enough to make
|
|
* `runCli` route to it instead of forwarding the argv as a prompt to
|
|
* `launch` — see #1496 for the original "args silently leak to the LLM"
|
|
* regression that motivated the split.
|
|
*/
|
|
import type { CommandEntry } from "@oh-my-pi/pi-utils/cli";
|
|
|
|
export const commands: CommandEntry[] = [
|
|
{ name: "launch", load: () => import("./commands/launch").then(m => m.default) },
|
|
{ name: "acp", load: () => import("./commands/acp").then(m => m.default) },
|
|
{ name: "auth-broker", load: () => import("./commands/auth-broker").then(m => m.default) },
|
|
{ name: "auth-gateway", load: () => import("./commands/auth-gateway").then(m => m.default) },
|
|
{ name: "agents", load: () => import("./commands/agents").then(m => m.default) },
|
|
{ name: "commit", load: () => import("./commands/commit").then(m => m.default) },
|
|
{ name: "completions", load: () => import("./commands/completions").then(m => m.default) },
|
|
{ name: "__complete", load: () => import("./commands/complete").then(m => m.default) },
|
|
{ name: "config", load: () => import("./commands/config").then(m => m.default) },
|
|
{ name: "dry-balance", load: () => import("./commands/dry-balance").then(m => m.default) },
|
|
{ name: "grep", load: () => import("./commands/grep").then(m => m.default) },
|
|
{ name: "gallery", load: () => import("./commands/gallery").then(m => m.default) },
|
|
{ name: "grievances", load: () => import("./commands/grievances").then(m => m.default) },
|
|
{ name: "install", load: () => import("./commands/install").then(m => m.default) },
|
|
{ name: "plugin", load: () => import("./commands/plugin").then(m => m.default) },
|
|
{ name: "setup", load: () => import("./commands/setup").then(m => m.default) },
|
|
{ name: "shell", load: () => import("./commands/shell").then(m => m.default) },
|
|
{ name: "read", load: () => import("./commands/read").then(m => m.default) },
|
|
{ name: "ssh", load: () => import("./commands/ssh").then(m => m.default) },
|
|
{ name: "stats", load: () => import("./commands/stats").then(m => m.default) },
|
|
{ name: "update", load: () => import("./commands/update").then(m => m.default) },
|
|
{ name: "tiny-models", load: () => import("./commands/tiny-models").then(m => m.default) },
|
|
{ name: "worktree", load: () => import("./commands/worktree").then(m => m.default), aliases: ["wt"] },
|
|
{ name: "search", load: () => import("./commands/web-search").then(m => m.default), aliases: ["q"] },
|
|
];
|
|
|
|
/**
|
|
* Return true when `first` matches a registered subcommand name or alias.
|
|
*
|
|
* Flags (`-…`) and `@file` arguments are never subcommands; for those the CLI
|
|
* runner skips ahead to the default `launch` command.
|
|
*/
|
|
export function isSubcommand(first: string | undefined): boolean {
|
|
if (!first || first.startsWith("-") || first.startsWith("@")) return false;
|
|
return commands.some(entry => entry.name === first || entry.aliases?.includes(first));
|
|
}
|