- Add new 'run' command using @opencode-ai/sdk to manage agent sessions - Implement recursive descendant session checking (waits for ALL nested child sessions) - Add completion conditions: all todos done + all descendant sessions idle - Add SSE event processing for session state tracking - Fix todo-continuation-enforcer to clean up session tracking - Comprehensive test coverage with memory-safe test patterns Unlike 'opencode run', this command ensures the agent completes all tasks by recursively waiting for nested background agent sessions before exiting. 🤖 Generated with assistance of OhMyOpenCode (https://github.com/code-yeongyu/oh-my-opencode)
84 lines
2.8 KiB
TypeScript
84 lines
2.8 KiB
TypeScript
#!/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 <value>", "Claude subscription: no, yes, max20")
|
|
.option("--chatgpt <value>", "ChatGPT subscription: no, yes")
|
|
.option("--gemini <value>", "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 <message>")
|
|
.description("Run opencode with todo/background task completion enforcement")
|
|
.option("-a, --agent <name>", "Agent to use (default: Sisyphus)")
|
|
.option("-d, --directory <path>", "Working directory")
|
|
.option("-t, --timeout <ms>", "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()
|