#!/usr/bin/env bun import { Command } from "commander" import { install } from "./install" import { run } from "./run" import type { InstallArgs } from "./types" import type { RunOptions } from "./run" const packageJson = await import("../../package.json") const VERSION = packageJson.version const program = new Command() program .name("oh-my-opencode") .description("The ultimate OpenCode plugin - multi-model orchestration, LSP tools, and more") .version(VERSION, "-v, --version", "Show version number") program .command("install") .description("Install and configure oh-my-opencode with interactive setup") .option("--no-tui", "Run in non-interactive mode (requires all options)") .option("--claude ", "Claude subscription: no, yes, max20") .option("--chatgpt ", "ChatGPT subscription: no, yes") .option("--gemini ", "Gemini integration: no, yes") .option("--skip-auth", "Skip authentication setup hints") .addHelpText("after", ` Examples: $ bunx oh-my-opencode install $ bunx oh-my-opencode install --no-tui --claude=max20 --chatgpt=yes --gemini=yes $ bunx oh-my-opencode install --no-tui --claude=no --chatgpt=no --gemini=no Model Providers: Claude Required for Sisyphus (main orchestrator) and Librarian agents ChatGPT Powers the Oracle agent for debugging and architecture Gemini Powers frontend, documentation, and multimodal agents `) .action(async (options) => { const args: InstallArgs = { tui: options.tui !== false, claude: options.claude, chatgpt: options.chatgpt, gemini: options.gemini, skipAuth: options.skipAuth ?? false, } const exitCode = await install(args) process.exit(exitCode) }) program .command("run ") .description("Run opencode with todo/background task completion enforcement") .option("-a, --agent ", "Agent to use (default: Sisyphus)") .option("-d, --directory ", "Working directory") .option("-t, --timeout ", "Timeout in milliseconds (default: 30 minutes)", parseInt) .addHelpText("after", ` Examples: $ bunx oh-my-opencode run "Fix the bug in index.ts" $ bunx oh-my-opencode run --agent Sisyphus "Implement feature X" $ bunx oh-my-opencode run --timeout 3600000 "Large refactoring task" Unlike 'opencode run', this command waits until: - All todos are completed or cancelled - All child sessions (background tasks) are idle `) .action(async (message: string, options) => { const runOptions: RunOptions = { message, agent: options.agent, directory: options.directory, timeout: options.timeout, } const exitCode = await run(runOptions) process.exit(exitCode) }) program .command("version") .description("Show version information") .action(() => { console.log(`oh-my-opencode v${VERSION}`) }) program.parse()