import type { Argv } from "yargs" import { spawn } from "child_process" import { Database } from "@opencode-ai/core/database/database" import { Effect } from "effect" import { sql } from "drizzle-orm" import { effectCmd } from "../effect-cmd" const QueryCommand = effectCmd({ command: "$0 [query]", describe: "open an interactive sqlite3 shell or run a query", instance: false, builder: (yargs: Argv) => { return yargs .positional("query", { type: "string", describe: "SQL query to execute", }) .option("format", { type: "string", choices: ["json", "tsv"], default: "tsv", describe: "Output format", }) }, handler: Effect.fn("Cli.db.query")(function* (args: { query?: string; format: string }) { const query = args.query as string | undefined if (query) { const { db } = yield* Database.Service const result = yield* db.all>(sql.raw(query)).pipe(Effect.orDie) if (args.format === "json") console.log(JSON.stringify(result, null, 2)) else if (result.length > 0) { const keys = Object.keys(result[0]) console.log(keys.join("\t")) for (const row of result) console.log(keys.map((key) => row[key]).join("\t")) } return } const child = spawn("sqlite3", [Database.path()], { stdio: "inherit", }) yield* Effect.promise(() => new Promise((resolve) => child.on("close", resolve))) }), }) const PathCommand = effectCmd({ command: "path", describe: "print the database path", instance: false, handler: Effect.fn("Cli.db.path")(function* () { console.log(Database.path()) }), }) export const DbCommand = effectCmd({ command: "db", describe: "database tools", instance: false, builder: (yargs: Argv) => { return yargs.command(QueryCommand).command(PathCommand).demandCommand() }, handler: Effect.fn("Cli.db")(function* () {}), })