@reinamaccredy/oh-my-opencode 3.0.0-beta.14 → 3.0.0-beta.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/config-manager.d.ts +3 -3
- package/dist/cli/index.js +158 -350
- package/dist/cli/types.d.ts +0 -1
- package/dist/config/index.d.ts +2 -2
- package/dist/config/schema.d.ts +215 -181
- package/dist/features/background-agent/index.d.ts +1 -1
- package/dist/features/background-agent/manager.d.ts +10 -0
- package/dist/features/background-agent/types.d.ts +4 -0
- package/dist/features/boulder-state/index.d.ts +1 -0
- package/dist/features/boulder-state/unified-state.d.ts +86 -0
- package/dist/features/maestro/hooks/index.d.ts +16 -0
- package/dist/features/maestro/index.d.ts +4 -0
- package/dist/features/maestro/skills/index.d.ts +4 -0
- package/dist/features/maestro/types.d.ts +42 -0
- package/dist/features/maestro/utils/index.d.ts +4 -0
- package/dist/features/workflow-engine/contracts/v1/types.d.ts +9 -0
- package/dist/hooks/background-notification/index.d.ts +10 -0
- package/dist/hooks/index.d.ts +3 -0
- package/dist/hooks/maestro-sisyphus-bridge/constants.d.ts +9 -0
- package/dist/hooks/maestro-sisyphus-bridge/index.d.ts +53 -0
- package/dist/hooks/tdd-enforcement/constants.d.ts +16 -0
- package/dist/hooks/tdd-enforcement/index.d.ts +54 -0
- package/dist/index.js +1851 -6022
- package/dist/shared/migration.d.ts +4 -0
- package/dist/tools/skill/tools.d.ts +1 -7
- package/dist/tools/slashcommand/tools.d.ts +1 -7
- package/package.json +2 -6
- package/dist/auth/antigravity/accounts.d.ts +0 -40
- package/dist/auth/antigravity/accounts.test.d.ts +0 -1
- package/dist/auth/antigravity/browser.d.ts +0 -27
- package/dist/auth/antigravity/browser.test.d.ts +0 -1
- package/dist/auth/antigravity/cli.d.ts +0 -2
- package/dist/auth/antigravity/cli.test.d.ts +0 -1
- package/dist/auth/antigravity/constants.d.ts +0 -98
- package/dist/auth/antigravity/constants.test.d.ts +0 -1
- package/dist/auth/antigravity/fetch.d.ts +0 -69
- package/dist/auth/antigravity/index.d.ts +0 -13
- package/dist/auth/antigravity/integration.test.d.ts +0 -10
- package/dist/auth/antigravity/message-converter.d.ts +0 -54
- package/dist/auth/antigravity/oauth.d.ts +0 -51
- package/dist/auth/antigravity/oauth.test.d.ts +0 -1
- package/dist/auth/antigravity/plugin.d.ts +0 -54
- package/dist/auth/antigravity/project.d.ts +0 -10
- package/dist/auth/antigravity/request.d.ts +0 -116
- package/dist/auth/antigravity/request.test.d.ts +0 -1
- package/dist/auth/antigravity/response.d.ts +0 -137
- package/dist/auth/antigravity/storage.d.ts +0 -5
- package/dist/auth/antigravity/storage.test.d.ts +0 -1
- package/dist/auth/antigravity/thinking.d.ts +0 -278
- package/dist/auth/antigravity/thinking.test.d.ts +0 -10
- package/dist/auth/antigravity/thought-signature-store.d.ts +0 -52
- package/dist/auth/antigravity/token.d.ts +0 -38
- package/dist/auth/antigravity/token.test.d.ts +0 -1
- package/dist/auth/antigravity/tools.d.ts +0 -119
- package/dist/auth/antigravity/types.d.ts +0 -229
- package/dist/cli/commands/auth.d.ts +0 -2
- package/dist/cli/config-manager.test.d.ts +0 -1
- package/dist/google-auth.d.ts +0 -3
- package/dist/google-auth.js +0 -3871
package/dist/cli/index.js
CHANGED
|
@@ -2253,7 +2253,7 @@ var require_picocolors = __commonJS((exports, module) => {
|
|
|
2253
2253
|
var require_package = __commonJS((exports, module) => {
|
|
2254
2254
|
module.exports = {
|
|
2255
2255
|
name: "@reinamaccredy/oh-my-opencode",
|
|
2256
|
-
version: "3.0.0-beta.
|
|
2256
|
+
version: "3.0.0-beta.16",
|
|
2257
2257
|
description: "Fork of oh-my-opencode with Maestro workflow integration - Multi-Model Orchestration, Parallel Background Agents, Design Phases, and TDD Methodology",
|
|
2258
2258
|
main: "dist/index.js",
|
|
2259
2259
|
types: "dist/index.d.ts",
|
|
@@ -2270,14 +2270,10 @@ var require_package = __commonJS((exports, module) => {
|
|
|
2270
2270
|
types: "./dist/index.d.ts",
|
|
2271
2271
|
import: "./dist/index.js"
|
|
2272
2272
|
},
|
|
2273
|
-
"./google-auth": {
|
|
2274
|
-
types: "./dist/google-auth.d.ts",
|
|
2275
|
-
import: "./dist/google-auth.js"
|
|
2276
|
-
},
|
|
2277
2273
|
"./schema.json": "./dist/oh-my-opencode.schema.json"
|
|
2278
2274
|
},
|
|
2279
2275
|
scripts: {
|
|
2280
|
-
build: "bun build src/index.ts
|
|
2276
|
+
build: "bun build src/index.ts --outdir dist --target bun --format esm --external @ast-grep/napi && tsc --emitDeclarationOnly && bun build src/cli/index.ts --outdir dist/cli --target bun --format esm --external @ast-grep/napi && bun run build:schema",
|
|
2281
2277
|
"build:schema": "bun run script/build-schema.ts",
|
|
2282
2278
|
clean: "rm -rf dist",
|
|
2283
2279
|
prepublishOnly: "bun run clean && bun run build",
|
|
@@ -2321,6 +2317,7 @@ var require_package = __commonJS((exports, module) => {
|
|
|
2321
2317
|
"@openauthjs/openauth": "^0.4.3",
|
|
2322
2318
|
"@opencode-ai/plugin": "^1.1.1",
|
|
2323
2319
|
"@opencode-ai/sdk": "^1.1.1",
|
|
2320
|
+
"@reinamaccredy/oh-my-opencode": "^3.0.0-beta.13",
|
|
2324
2321
|
commander: "^14.0.2",
|
|
2325
2322
|
hono: "^4.10.4",
|
|
2326
2323
|
"js-yaml": "^4.1.1",
|
|
@@ -5614,12 +5611,6 @@ function log(message, data) {
|
|
|
5614
5611
|
var DANGEROUS_KEYS = new Set(["__proto__", "constructor", "prototype"]);
|
|
5615
5612
|
// src/shared/dynamic-truncator.ts
|
|
5616
5613
|
var ANTHROPIC_ACTUAL_LIMIT = process.env.ANTHROPIC_1M_CONTEXT === "true" || process.env.VERTEX_ANTHROPIC_1M_CONTEXT === "true" ? 1e6 : 200000;
|
|
5617
|
-
// src/shared/data-path.ts
|
|
5618
|
-
import * as path2 from "path";
|
|
5619
|
-
import * as os2 from "os";
|
|
5620
|
-
function getDataDir() {
|
|
5621
|
-
return process.env.XDG_DATA_HOME ?? path2.join(os2.homedir(), ".local", "share");
|
|
5622
|
-
}
|
|
5623
5614
|
// src/shared/jsonc-parser.ts
|
|
5624
5615
|
import { existsSync, readFileSync } from "fs";
|
|
5625
5616
|
|
|
@@ -6490,8 +6481,8 @@ function detectConfigFile(basePath) {
|
|
|
6490
6481
|
}
|
|
6491
6482
|
// src/shared/opencode-config-dir.ts
|
|
6492
6483
|
import { existsSync as existsSync2 } from "fs";
|
|
6493
|
-
import { homedir
|
|
6494
|
-
import { join as
|
|
6484
|
+
import { homedir } from "os";
|
|
6485
|
+
import { join as join2 } from "path";
|
|
6495
6486
|
var TAURI_APP_IDENTIFIER = "ai.opencode.desktop";
|
|
6496
6487
|
var TAURI_APP_IDENTIFIER_DEV = "ai.opencode.desktop.dev";
|
|
6497
6488
|
function isDevBuild(version) {
|
|
@@ -6503,35 +6494,35 @@ function getTauriConfigDir(identifier) {
|
|
|
6503
6494
|
const platform = process.platform;
|
|
6504
6495
|
switch (platform) {
|
|
6505
6496
|
case "darwin":
|
|
6506
|
-
return
|
|
6497
|
+
return join2(homedir(), "Library", "Application Support", identifier);
|
|
6507
6498
|
case "win32": {
|
|
6508
|
-
const appData = process.env.APPDATA ||
|
|
6509
|
-
return
|
|
6499
|
+
const appData = process.env.APPDATA || join2(homedir(), "AppData", "Roaming");
|
|
6500
|
+
return join2(appData, identifier);
|
|
6510
6501
|
}
|
|
6511
6502
|
case "linux":
|
|
6512
6503
|
default: {
|
|
6513
|
-
const xdgConfig = process.env.XDG_CONFIG_HOME ||
|
|
6514
|
-
return
|
|
6504
|
+
const xdgConfig = process.env.XDG_CONFIG_HOME || join2(homedir(), ".config");
|
|
6505
|
+
return join2(xdgConfig, identifier);
|
|
6515
6506
|
}
|
|
6516
6507
|
}
|
|
6517
6508
|
}
|
|
6518
6509
|
function getCliConfigDir() {
|
|
6519
6510
|
if (process.platform === "win32") {
|
|
6520
|
-
const crossPlatformDir =
|
|
6521
|
-
const crossPlatformConfig =
|
|
6511
|
+
const crossPlatformDir = join2(homedir(), ".config", "opencode");
|
|
6512
|
+
const crossPlatformConfig = join2(crossPlatformDir, "opencode.json");
|
|
6522
6513
|
if (existsSync2(crossPlatformConfig)) {
|
|
6523
6514
|
return crossPlatformDir;
|
|
6524
6515
|
}
|
|
6525
|
-
const appData = process.env.APPDATA ||
|
|
6526
|
-
const appdataDir =
|
|
6527
|
-
const appdataConfig =
|
|
6516
|
+
const appData = process.env.APPDATA || join2(homedir(), "AppData", "Roaming");
|
|
6517
|
+
const appdataDir = join2(appData, "opencode");
|
|
6518
|
+
const appdataConfig = join2(appdataDir, "opencode.json");
|
|
6528
6519
|
if (existsSync2(appdataConfig)) {
|
|
6529
6520
|
return appdataDir;
|
|
6530
6521
|
}
|
|
6531
6522
|
return crossPlatformDir;
|
|
6532
6523
|
}
|
|
6533
|
-
const xdgConfig = process.env.XDG_CONFIG_HOME ||
|
|
6534
|
-
return
|
|
6524
|
+
const xdgConfig = process.env.XDG_CONFIG_HOME || join2(homedir(), ".config");
|
|
6525
|
+
return join2(xdgConfig, "opencode");
|
|
6535
6526
|
}
|
|
6536
6527
|
function getOpenCodeConfigDir(options) {
|
|
6537
6528
|
const { binary: binary2, version, checkExisting = true } = options;
|
|
@@ -6542,8 +6533,8 @@ function getOpenCodeConfigDir(options) {
|
|
|
6542
6533
|
const tauriDir = getTauriConfigDir(identifier);
|
|
6543
6534
|
if (checkExisting) {
|
|
6544
6535
|
const legacyDir = getCliConfigDir();
|
|
6545
|
-
const legacyConfig =
|
|
6546
|
-
const legacyConfigC =
|
|
6536
|
+
const legacyConfig = join2(legacyDir, "opencode.json");
|
|
6537
|
+
const legacyConfigC = join2(legacyDir, "opencode.jsonc");
|
|
6547
6538
|
if (existsSync2(legacyConfig) || existsSync2(legacyConfigC)) {
|
|
6548
6539
|
return legacyDir;
|
|
6549
6540
|
}
|
|
@@ -6554,10 +6545,10 @@ function getOpenCodeConfigPaths(options) {
|
|
|
6554
6545
|
const configDir = getOpenCodeConfigDir(options);
|
|
6555
6546
|
return {
|
|
6556
6547
|
configDir,
|
|
6557
|
-
configJson:
|
|
6558
|
-
configJsonc:
|
|
6559
|
-
packageJson:
|
|
6560
|
-
omoConfig:
|
|
6548
|
+
configJson: join2(configDir, "opencode.json"),
|
|
6549
|
+
configJsonc: join2(configDir, "opencode.jsonc"),
|
|
6550
|
+
packageJson: join2(configDir, "package.json"),
|
|
6551
|
+
omoConfig: join2(configDir, "oh-my-opencode.json")
|
|
6561
6552
|
};
|
|
6562
6553
|
}
|
|
6563
6554
|
// src/shared/opencode-version.ts
|
|
@@ -6642,26 +6633,26 @@ function detectConfigFormat() {
|
|
|
6642
6633
|
function isEmptyOrWhitespace(content) {
|
|
6643
6634
|
return content.trim().length === 0;
|
|
6644
6635
|
}
|
|
6645
|
-
function parseConfigWithError(
|
|
6636
|
+
function parseConfigWithError(path2) {
|
|
6646
6637
|
try {
|
|
6647
|
-
const stat = statSync(
|
|
6638
|
+
const stat = statSync(path2);
|
|
6648
6639
|
if (stat.size === 0) {
|
|
6649
|
-
return { config: null, error: `Config file is empty: ${
|
|
6640
|
+
return { config: null, error: `Config file is empty: ${path2}. Delete it or add valid JSON content.` };
|
|
6650
6641
|
}
|
|
6651
|
-
const content = readFileSync2(
|
|
6642
|
+
const content = readFileSync2(path2, "utf-8");
|
|
6652
6643
|
if (isEmptyOrWhitespace(content)) {
|
|
6653
|
-
return { config: null, error: `Config file contains only whitespace: ${
|
|
6644
|
+
return { config: null, error: `Config file contains only whitespace: ${path2}. Delete it or add valid JSON content.` };
|
|
6654
6645
|
}
|
|
6655
6646
|
const config = parseJsonc(content);
|
|
6656
6647
|
if (config === null || config === undefined) {
|
|
6657
|
-
return { config: null, error: `Config file parsed to null/undefined: ${
|
|
6648
|
+
return { config: null, error: `Config file parsed to null/undefined: ${path2}. Ensure it contains valid JSON.` };
|
|
6658
6649
|
}
|
|
6659
6650
|
if (typeof config !== "object" || Array.isArray(config)) {
|
|
6660
|
-
return { config: null, error: `Config file must contain a JSON object, not ${Array.isArray(config) ? "an array" : typeof config}: ${
|
|
6651
|
+
return { config: null, error: `Config file must contain a JSON object, not ${Array.isArray(config) ? "an array" : typeof config}: ${path2}` };
|
|
6661
6652
|
}
|
|
6662
6653
|
return { config };
|
|
6663
6654
|
} catch (err) {
|
|
6664
|
-
return { config: null, error: formatErrorWithSuggestion(err, `parse config file ${
|
|
6655
|
+
return { config: null, error: formatErrorWithSuggestion(err, `parse config file ${path2}`) };
|
|
6665
6656
|
}
|
|
6666
6657
|
}
|
|
6667
6658
|
function ensureConfigDir() {
|
|
@@ -6676,27 +6667,27 @@ function addPluginToOpenCodeConfig() {
|
|
|
6676
6667
|
} catch (err) {
|
|
6677
6668
|
return { success: false, configPath: getConfigDir(), error: formatErrorWithSuggestion(err, "create config directory") };
|
|
6678
6669
|
}
|
|
6679
|
-
const { format: format2, path:
|
|
6670
|
+
const { format: format2, path: path2 } = detectConfigFormat();
|
|
6680
6671
|
const pluginName = "oh-my-opencode";
|
|
6681
6672
|
try {
|
|
6682
6673
|
if (format2 === "none") {
|
|
6683
6674
|
const config2 = { plugin: [pluginName] };
|
|
6684
|
-
writeFileSync(
|
|
6675
|
+
writeFileSync(path2, JSON.stringify(config2, null, 2) + `
|
|
6685
6676
|
`);
|
|
6686
|
-
return { success: true, configPath:
|
|
6677
|
+
return { success: true, configPath: path2 };
|
|
6687
6678
|
}
|
|
6688
|
-
const parseResult = parseConfigWithError(
|
|
6679
|
+
const parseResult = parseConfigWithError(path2);
|
|
6689
6680
|
if (!parseResult.config) {
|
|
6690
|
-
return { success: false, configPath:
|
|
6681
|
+
return { success: false, configPath: path2, error: parseResult.error ?? "Failed to parse config file" };
|
|
6691
6682
|
}
|
|
6692
6683
|
const config = parseResult.config;
|
|
6693
6684
|
const plugins = config.plugin ?? [];
|
|
6694
6685
|
if (plugins.some((p2) => p2.startsWith(pluginName))) {
|
|
6695
|
-
return { success: true, configPath:
|
|
6686
|
+
return { success: true, configPath: path2 };
|
|
6696
6687
|
}
|
|
6697
6688
|
config.plugin = [...plugins, pluginName];
|
|
6698
6689
|
if (format2 === "jsonc") {
|
|
6699
|
-
const content = readFileSync2(
|
|
6690
|
+
const content = readFileSync2(path2, "utf-8");
|
|
6700
6691
|
const pluginArrayRegex = /"plugin"\s*:\s*\[([\s\S]*?)\]/;
|
|
6701
6692
|
const match = content.match(pluginArrayRegex);
|
|
6702
6693
|
if (match) {
|
|
@@ -6706,19 +6697,19 @@ function addPluginToOpenCodeConfig() {
|
|
|
6706
6697
|
const newContent = content.replace(pluginArrayRegex, `"plugin": [
|
|
6707
6698
|
${newArrayContent}
|
|
6708
6699
|
]`);
|
|
6709
|
-
writeFileSync(
|
|
6700
|
+
writeFileSync(path2, newContent);
|
|
6710
6701
|
} else {
|
|
6711
6702
|
const newContent = content.replace(/^(\s*\{)/, `$1
|
|
6712
6703
|
"plugin": ["${pluginName}"],`);
|
|
6713
|
-
writeFileSync(
|
|
6704
|
+
writeFileSync(path2, newContent);
|
|
6714
6705
|
}
|
|
6715
6706
|
} else {
|
|
6716
|
-
writeFileSync(
|
|
6707
|
+
writeFileSync(path2, JSON.stringify(config, null, 2) + `
|
|
6717
6708
|
`);
|
|
6718
6709
|
}
|
|
6719
|
-
return { success: true, configPath:
|
|
6710
|
+
return { success: true, configPath: path2 };
|
|
6720
6711
|
} catch (err) {
|
|
6721
|
-
return { success: false, configPath:
|
|
6712
|
+
return { success: false, configPath: path2, error: formatErrorWithSuggestion(err, "update opencode config") };
|
|
6722
6713
|
}
|
|
6723
6714
|
}
|
|
6724
6715
|
function deepMerge(target, source) {
|
|
@@ -6736,11 +6727,9 @@ function deepMerge(target, source) {
|
|
|
6736
6727
|
}
|
|
6737
6728
|
function generateOmoConfig(installConfig) {
|
|
6738
6729
|
const config = {
|
|
6739
|
-
$schema: "https://raw.githubusercontent.com/
|
|
6730
|
+
$schema: "https://raw.githubusercontent.com/ReinaMacCredy/oh-my-opencode/main/assets/oh-my-opencode.schema.json"
|
|
6740
6731
|
};
|
|
6741
|
-
if (installConfig.hasProxyPal || installConfig.hasGemini) {
|
|
6742
|
-
config.google_auth = false;
|
|
6743
|
-
}
|
|
6732
|
+
if (installConfig.hasProxyPal || installConfig.hasGemini) {}
|
|
6744
6733
|
const agents = {};
|
|
6745
6734
|
if (installConfig.hasProxyPal) {
|
|
6746
6735
|
agents["Sisyphus"] = { model: "proxypal/gemini-claude-opus-4-5-thinking" };
|
|
@@ -6899,11 +6888,11 @@ async function addAuthPlugins(config) {
|
|
|
6899
6888
|
} catch (err) {
|
|
6900
6889
|
return { success: false, configPath: getConfigDir(), error: formatErrorWithSuggestion(err, "create config directory") };
|
|
6901
6890
|
}
|
|
6902
|
-
const { format: format2, path:
|
|
6891
|
+
const { format: format2, path: path2 } = detectConfigFormat();
|
|
6903
6892
|
try {
|
|
6904
6893
|
let existingConfig = null;
|
|
6905
6894
|
if (format2 !== "none") {
|
|
6906
|
-
const parseResult = parseConfigWithError(
|
|
6895
|
+
const parseResult = parseConfigWithError(path2);
|
|
6907
6896
|
if (parseResult.error && !parseResult.config) {
|
|
6908
6897
|
existingConfig = {};
|
|
6909
6898
|
} else {
|
|
@@ -6912,9 +6901,9 @@ async function addAuthPlugins(config) {
|
|
|
6912
6901
|
}
|
|
6913
6902
|
const plugins = existingConfig?.plugin ?? [];
|
|
6914
6903
|
if (config.hasGemini) {
|
|
6915
|
-
const version = await fetchLatestVersion("opencode-
|
|
6916
|
-
const pluginEntry = version ? `opencode-
|
|
6917
|
-
if (!plugins.some((p2) => p2.startsWith("opencode-
|
|
6904
|
+
const version = await fetchLatestVersion("opencode-proxypal-auth");
|
|
6905
|
+
const pluginEntry = version ? `opencode-proxypal-auth@${version}` : "opencode-proxypal-auth";
|
|
6906
|
+
if (!plugins.some((p2) => p2.startsWith("opencode-proxypal-auth"))) {
|
|
6918
6907
|
plugins.push(pluginEntry);
|
|
6919
6908
|
}
|
|
6920
6909
|
}
|
|
@@ -6924,11 +6913,11 @@ async function addAuthPlugins(config) {
|
|
|
6924
6913
|
}
|
|
6925
6914
|
}
|
|
6926
6915
|
const newConfig = { ...existingConfig ?? {}, plugin: plugins };
|
|
6927
|
-
writeFileSync(
|
|
6916
|
+
writeFileSync(path2, JSON.stringify(newConfig, null, 2) + `
|
|
6928
6917
|
`);
|
|
6929
|
-
return { success: true, configPath:
|
|
6918
|
+
return { success: true, configPath: path2 };
|
|
6930
6919
|
} catch (err) {
|
|
6931
|
-
return { success: false, configPath:
|
|
6920
|
+
return { success: false, configPath: path2, error: formatErrorWithSuggestion(err, "add auth plugins to config") };
|
|
6932
6921
|
}
|
|
6933
6922
|
}
|
|
6934
6923
|
var PROXYPAL_PROVIDER_CONFIG = {
|
|
@@ -6987,15 +6976,15 @@ var PROXYPAL_PROVIDER_CONFIG = {
|
|
|
6987
6976
|
options: { reasoningEffort: "xhigh" },
|
|
6988
6977
|
reasoning: true
|
|
6989
6978
|
},
|
|
6990
|
-
"
|
|
6991
|
-
name: "Gemini 3 Pro High (
|
|
6979
|
+
"gemini-3-pro-high": {
|
|
6980
|
+
name: "Gemini 3 Pro High (ProxyPal)",
|
|
6992
6981
|
thinking: true,
|
|
6993
6982
|
attachment: true,
|
|
6994
6983
|
limit: { context: 1048576, output: 65535 },
|
|
6995
6984
|
modalities: { input: ["text", "image", "pdf"], output: ["text"] }
|
|
6996
6985
|
},
|
|
6997
|
-
"
|
|
6998
|
-
name: "Gemini 3 Flash (
|
|
6986
|
+
"gemini-3-flash": {
|
|
6987
|
+
name: "Gemini 3 Flash (ProxyPal)",
|
|
6999
6988
|
attachment: true,
|
|
7000
6989
|
limit: { context: 1048576, output: 65536 },
|
|
7001
6990
|
modalities: { input: ["text", "image", "pdf"], output: ["text"] }
|
|
@@ -7007,22 +6996,22 @@ var ANTIGRAVITY_PROVIDER_CONFIG = {
|
|
|
7007
6996
|
google: {
|
|
7008
6997
|
name: "Google",
|
|
7009
6998
|
models: {
|
|
7010
|
-
"
|
|
7011
|
-
name: "Gemini 3 Pro High (
|
|
6999
|
+
"gemini-3-pro-high": {
|
|
7000
|
+
name: "Gemini 3 Pro High (ProxyPal)",
|
|
7012
7001
|
thinking: true,
|
|
7013
7002
|
attachment: true,
|
|
7014
7003
|
limit: { context: 1048576, output: 65535 },
|
|
7015
7004
|
modalities: { input: ["text", "image", "pdf"], output: ["text"] }
|
|
7016
7005
|
},
|
|
7017
|
-
"
|
|
7018
|
-
name: "Gemini 3 Pro Low (
|
|
7006
|
+
"gemini-3-pro-low": {
|
|
7007
|
+
name: "Gemini 3 Pro Low (ProxyPal)",
|
|
7019
7008
|
thinking: true,
|
|
7020
7009
|
attachment: true,
|
|
7021
7010
|
limit: { context: 1048576, output: 65535 },
|
|
7022
7011
|
modalities: { input: ["text", "image", "pdf"], output: ["text"] }
|
|
7023
7012
|
},
|
|
7024
|
-
"
|
|
7025
|
-
name: "Gemini 3 Flash (
|
|
7013
|
+
"gemini-3-flash": {
|
|
7014
|
+
name: "Gemini 3 Flash (ProxyPal)",
|
|
7026
7015
|
attachment: true,
|
|
7027
7016
|
limit: { context: 1048576, output: 65536 },
|
|
7028
7017
|
modalities: { input: ["text", "image", "pdf"], output: ["text"] }
|
|
@@ -7084,11 +7073,11 @@ function addProviderConfig(config) {
|
|
|
7084
7073
|
} catch (err) {
|
|
7085
7074
|
return { success: false, configPath: getConfigDir(), error: formatErrorWithSuggestion(err, "create config directory") };
|
|
7086
7075
|
}
|
|
7087
|
-
const { format: format2, path:
|
|
7076
|
+
const { format: format2, path: path2 } = detectConfigFormat();
|
|
7088
7077
|
try {
|
|
7089
7078
|
let existingConfig = null;
|
|
7090
7079
|
if (format2 !== "none") {
|
|
7091
|
-
const parseResult = parseConfigWithError(
|
|
7080
|
+
const parseResult = parseConfigWithError(path2);
|
|
7092
7081
|
if (parseResult.error && !parseResult.config) {
|
|
7093
7082
|
existingConfig = {};
|
|
7094
7083
|
} else {
|
|
@@ -7109,11 +7098,11 @@ function addProviderConfig(config) {
|
|
|
7109
7098
|
if (Object.keys(providers).length > 0) {
|
|
7110
7099
|
newConfig.provider = providers;
|
|
7111
7100
|
}
|
|
7112
|
-
writeFileSync(
|
|
7101
|
+
writeFileSync(path2, JSON.stringify(newConfig, null, 2) + `
|
|
7113
7102
|
`);
|
|
7114
|
-
return { success: true, configPath:
|
|
7103
|
+
return { success: true, configPath: path2 };
|
|
7115
7104
|
} catch (err) {
|
|
7116
|
-
return { success: false, configPath:
|
|
7105
|
+
return { success: false, configPath: path2, error: formatErrorWithSuggestion(err, "add provider config") };
|
|
7117
7106
|
}
|
|
7118
7107
|
}
|
|
7119
7108
|
function detectCurrentConfig() {
|
|
@@ -7125,11 +7114,11 @@ function detectCurrentConfig() {
|
|
|
7125
7114
|
hasChatGPT: true,
|
|
7126
7115
|
hasGemini: false
|
|
7127
7116
|
};
|
|
7128
|
-
const { format: format2, path:
|
|
7117
|
+
const { format: format2, path: path2 } = detectConfigFormat();
|
|
7129
7118
|
if (format2 === "none") {
|
|
7130
7119
|
return result;
|
|
7131
7120
|
}
|
|
7132
|
-
const parseResult = parseConfigWithError(
|
|
7121
|
+
const parseResult = parseConfigWithError(path2);
|
|
7133
7122
|
if (!parseResult.config) {
|
|
7134
7123
|
return result;
|
|
7135
7124
|
}
|
|
@@ -7139,7 +7128,7 @@ function detectCurrentConfig() {
|
|
|
7139
7128
|
if (!result.isInstalled) {
|
|
7140
7129
|
return result;
|
|
7141
7130
|
}
|
|
7142
|
-
result.hasGemini = plugins.some((p2) => p2.startsWith("opencode-
|
|
7131
|
+
result.hasGemini = plugins.some((p2) => p2.startsWith("opencode-proxypal-auth"));
|
|
7143
7132
|
result.hasChatGPT = plugins.some((p2) => p2.startsWith("opencode-openai-codex-auth"));
|
|
7144
7133
|
const omoConfigPath = getOmoConfig();
|
|
7145
7134
|
if (!existsSync3(omoConfigPath)) {
|
|
@@ -7179,9 +7168,6 @@ function detectCurrentConfig() {
|
|
|
7179
7168
|
} else if (agents["oracle"]?.model === "opencode/glm-4.7-free") {
|
|
7180
7169
|
result.hasChatGPT = false;
|
|
7181
7170
|
}
|
|
7182
|
-
if (omoConfig.google_auth === false) {
|
|
7183
|
-
result.hasGemini = plugins.some((p2) => p2.startsWith("opencode-antigravity-auth"));
|
|
7184
|
-
}
|
|
7185
7171
|
} catch {}
|
|
7186
7172
|
return result;
|
|
7187
7173
|
}
|
|
@@ -7216,7 +7202,6 @@ function formatConfigSummary(config) {
|
|
|
7216
7202
|
const claudeDetail = config.hasClaude ? config.isMax20 ? "max20" : "standard" : undefined;
|
|
7217
7203
|
lines.push(formatProvider("Claude", config.hasClaude, claudeDetail));
|
|
7218
7204
|
lines.push(formatProvider("ChatGPT", config.hasChatGPT));
|
|
7219
|
-
lines.push(formatProvider("Gemini", config.hasGemini));
|
|
7220
7205
|
}
|
|
7221
7206
|
lines.push("");
|
|
7222
7207
|
lines.push(import_picocolors2.default.dim("\u2500".repeat(40)));
|
|
@@ -7232,12 +7217,6 @@ function formatConfigSummary(config) {
|
|
|
7232
7217
|
oracleModel = "gpt-5.2-codex";
|
|
7233
7218
|
librarianModel = "gemini-claude-opus-4-5-thinking";
|
|
7234
7219
|
frontendModel = "gemini-3-pro-preview";
|
|
7235
|
-
} else if (config.hasGemini) {
|
|
7236
|
-
sisyphusModel = "gemini-claude-opus-4-5-thinking";
|
|
7237
|
-
oracleModel = config.hasChatGPT ? "gpt-5.2-codex" : config.hasClaude ? "claude-opus-4-5" : "glm-4.7-free";
|
|
7238
|
-
librarianModel = "gemini-claude-opus-4-5-thinking";
|
|
7239
|
-
frontendModel = "gemini-3-pro-preview";
|
|
7240
|
-
} else if (config.hasClaude) {
|
|
7241
7220
|
sisyphusModel = "claude-opus-4-5";
|
|
7242
7221
|
oracleModel = config.hasChatGPT ? "gpt-5.2-codex" : "claude-opus-4-5";
|
|
7243
7222
|
librarianModel = "claude-sonnet-4-5";
|
|
@@ -7314,11 +7293,6 @@ function validateNonTuiArgs(args) {
|
|
|
7314
7293
|
} else if (!["no", "yes"].includes(args.chatgpt)) {
|
|
7315
7294
|
errors.push(`Invalid --chatgpt value: ${args.chatgpt} (expected: no, yes)`);
|
|
7316
7295
|
}
|
|
7317
|
-
if (args.gemini === undefined) {
|
|
7318
|
-
errors.push("--gemini is required (values: no, yes)");
|
|
7319
|
-
} else if (!["no", "yes"].includes(args.gemini)) {
|
|
7320
|
-
errors.push(`Invalid --gemini value: ${args.gemini} (expected: no, yes)`);
|
|
7321
|
-
}
|
|
7322
7296
|
return { valid: errors.length === 0, errors };
|
|
7323
7297
|
}
|
|
7324
7298
|
function argsToConfig(args) {
|
|
@@ -7336,7 +7310,7 @@ function argsToConfig(args) {
|
|
|
7336
7310
|
hasClaude: args.claude !== "no",
|
|
7337
7311
|
isMax20: args.claude === "max20",
|
|
7338
7312
|
hasChatGPT: args.chatgpt === "yes",
|
|
7339
|
-
hasGemini:
|
|
7313
|
+
hasGemini: false
|
|
7340
7314
|
};
|
|
7341
7315
|
}
|
|
7342
7316
|
function detectedToInitialValues(detected) {
|
|
@@ -7347,8 +7321,7 @@ function detectedToInitialValues(detected) {
|
|
|
7347
7321
|
return {
|
|
7348
7322
|
proxypal: detected.hasProxyPal ? "yes" : "no",
|
|
7349
7323
|
claude,
|
|
7350
|
-
chatgpt: detected.hasChatGPT ? "yes" : "no"
|
|
7351
|
-
gemini: detected.hasGemini ? "yes" : "no"
|
|
7324
|
+
chatgpt: detected.hasChatGPT ? "yes" : "no"
|
|
7352
7325
|
};
|
|
7353
7326
|
}
|
|
7354
7327
|
async function runTuiMode(detected) {
|
|
@@ -7399,24 +7372,12 @@ async function runTuiMode(detected) {
|
|
|
7399
7372
|
xe("Installation cancelled.");
|
|
7400
7373
|
return null;
|
|
7401
7374
|
}
|
|
7402
|
-
const gemini = await ve({
|
|
7403
|
-
message: "Will you integrate Google Gemini?",
|
|
7404
|
-
options: [
|
|
7405
|
-
{ value: "no", label: "No", hint: "Frontend/docs agents will use fallback" },
|
|
7406
|
-
{ value: "yes", label: "Yes", hint: "Beautiful UI generation with Gemini 3 Pro" }
|
|
7407
|
-
],
|
|
7408
|
-
initialValue: initial.gemini
|
|
7409
|
-
});
|
|
7410
|
-
if (pD(gemini)) {
|
|
7411
|
-
xe("Installation cancelled.");
|
|
7412
|
-
return null;
|
|
7413
|
-
}
|
|
7414
7375
|
return {
|
|
7415
7376
|
hasProxyPal: false,
|
|
7416
7377
|
hasClaude: claude !== "no",
|
|
7417
7378
|
isMax20: claude === "max20",
|
|
7418
7379
|
hasChatGPT: chatgpt === "yes",
|
|
7419
|
-
hasGemini:
|
|
7380
|
+
hasGemini: false
|
|
7420
7381
|
};
|
|
7421
7382
|
}
|
|
7422
7383
|
async function runNonTuiInstall(args) {
|
|
@@ -7429,7 +7390,7 @@ async function runNonTuiInstall(args) {
|
|
|
7429
7390
|
}
|
|
7430
7391
|
console.log();
|
|
7431
7392
|
printInfo("Usage: bunx oh-my-opencode install --no-tui --proxypal=yes");
|
|
7432
|
-
printInfo(" or: bunx oh-my-opencode install --no-tui --claude=<no|yes|max20> --chatgpt=<no|yes>
|
|
7393
|
+
printInfo(" or: bunx oh-my-opencode install --no-tui --claude=<no|yes|max20> --chatgpt=<no|yes>");
|
|
7433
7394
|
console.log();
|
|
7434
7395
|
return 1;
|
|
7435
7396
|
}
|
|
@@ -7452,7 +7413,7 @@ async function runNonTuiInstall(args) {
|
|
|
7452
7413
|
if (initial.proxypal === "yes") {
|
|
7453
7414
|
printInfo(`Current config: ProxyPal=yes`);
|
|
7454
7415
|
} else {
|
|
7455
|
-
printInfo(`Current config: Claude=${initial.claude}, ChatGPT=${initial.chatgpt}
|
|
7416
|
+
printInfo(`Current config: Claude=${initial.claude}, ChatGPT=${initial.chatgpt}`);
|
|
7456
7417
|
}
|
|
7457
7418
|
}
|
|
7458
7419
|
const config = argsToConfig(args);
|
|
@@ -7472,7 +7433,7 @@ async function runNonTuiInstall(args) {
|
|
|
7472
7433
|
}
|
|
7473
7434
|
printSuccess(`ProxyPal configured ${SYMBOLS.arrow} ${import_picocolors2.default.dim(providerResult.configPath)}`);
|
|
7474
7435
|
step += 1;
|
|
7475
|
-
} else if (config.
|
|
7436
|
+
} else if (config.hasChatGPT) {
|
|
7476
7437
|
printStep(step++, totalSteps, "Adding auth plugins...");
|
|
7477
7438
|
const authResult = await addAuthPlugins(config);
|
|
7478
7439
|
if (!authResult.success) {
|
|
@@ -7498,7 +7459,7 @@ async function runNonTuiInstall(args) {
|
|
|
7498
7459
|
}
|
|
7499
7460
|
printSuccess(`Config written ${SYMBOLS.arrow} ${import_picocolors2.default.dim(omoResult.configPath)}`);
|
|
7500
7461
|
printBox(formatConfigSummary(config), isUpdate ? "Updated Configuration" : "Installation Complete");
|
|
7501
|
-
if (!config.hasProxyPal && !config.hasClaude && !config.hasChatGPT
|
|
7462
|
+
if (!config.hasProxyPal && !config.hasClaude && !config.hasChatGPT) {
|
|
7502
7463
|
printWarning("No model providers configured. Using opencode/glm-4.7-free as fallback.");
|
|
7503
7464
|
}
|
|
7504
7465
|
if (config.hasProxyPal && !args.skipAuth) {
|
|
@@ -7507,7 +7468,7 @@ async function runNonTuiInstall(args) {
|
|
|
7507
7468
|
console.log(` ${SYMBOLS.arrow} Start ProxyPal and ensure proxy is running on ${import_picocolors2.default.cyan("http://localhost:8317")}`);
|
|
7508
7469
|
console.log(` ${SYMBOLS.arrow} Authenticate your providers in ProxyPal app`);
|
|
7509
7470
|
console.log();
|
|
7510
|
-
} else if ((config.hasClaude || config.hasChatGPT
|
|
7471
|
+
} else if ((config.hasClaude || config.hasChatGPT) && !args.skipAuth) {
|
|
7511
7472
|
console.log(import_picocolors2.default.bold("Next Steps - Authenticate your providers:"));
|
|
7512
7473
|
console.log();
|
|
7513
7474
|
if (config.hasClaude) {
|
|
@@ -7516,9 +7477,6 @@ async function runNonTuiInstall(args) {
|
|
|
7516
7477
|
if (config.hasChatGPT) {
|
|
7517
7478
|
console.log(` ${SYMBOLS.arrow} ${import_picocolors2.default.dim("opencode auth login")} ${import_picocolors2.default.gray("(select OpenAI \u2192 ChatGPT Plus/Pro)")}`);
|
|
7518
7479
|
}
|
|
7519
|
-
if (config.hasGemini) {
|
|
7520
|
-
console.log(` ${SYMBOLS.arrow} ${import_picocolors2.default.dim("opencode auth login")} ${import_picocolors2.default.gray("(select Google \u2192 OAuth with Antigravity)")}`);
|
|
7521
|
-
}
|
|
7522
7480
|
console.log();
|
|
7523
7481
|
}
|
|
7524
7482
|
console.log(`${SYMBOLS.star} ${import_picocolors2.default.bold(import_picocolors2.default.green(isUpdate ? "Configuration updated!" : "Installation complete!"))}`);
|
|
@@ -7546,7 +7504,7 @@ async function install(args) {
|
|
|
7546
7504
|
if (initial.proxypal === "yes") {
|
|
7547
7505
|
M2.info(`Existing configuration detected: ProxyPal=yes`);
|
|
7548
7506
|
} else {
|
|
7549
|
-
M2.info(`Existing configuration detected: Claude=${initial.claude}, ChatGPT=${initial.chatgpt}
|
|
7507
|
+
M2.info(`Existing configuration detected: Claude=${initial.claude}, ChatGPT=${initial.chatgpt}`);
|
|
7550
7508
|
}
|
|
7551
7509
|
}
|
|
7552
7510
|
const s = Y2();
|
|
@@ -7581,7 +7539,7 @@ async function install(args) {
|
|
|
7581
7539
|
return 1;
|
|
7582
7540
|
}
|
|
7583
7541
|
s.stop(`ProxyPal configured to ${import_picocolors2.default.cyan(providerResult.configPath)}`);
|
|
7584
|
-
} else if (config.
|
|
7542
|
+
} else if (config.hasChatGPT) {
|
|
7585
7543
|
s.start("Adding auth plugins (fetching latest versions)");
|
|
7586
7544
|
const authResult = await addAuthPlugins(config);
|
|
7587
7545
|
if (!authResult.success) {
|
|
@@ -7607,7 +7565,7 @@ async function install(args) {
|
|
|
7607
7565
|
return 1;
|
|
7608
7566
|
}
|
|
7609
7567
|
s.stop(`Config written to ${import_picocolors2.default.cyan(omoResult.configPath)}`);
|
|
7610
|
-
if (!config.hasProxyPal && !config.hasClaude && !config.hasChatGPT
|
|
7568
|
+
if (!config.hasProxyPal && !config.hasClaude && !config.hasChatGPT) {
|
|
7611
7569
|
M2.warn("No model providers configured. Using opencode/glm-4.7-free as fallback.");
|
|
7612
7570
|
}
|
|
7613
7571
|
Me(formatConfigSummary(config), isUpdate ? "Updated Configuration" : "Installation Complete");
|
|
@@ -7618,7 +7576,7 @@ async function install(args) {
|
|
|
7618
7576
|
];
|
|
7619
7577
|
Me(steps.join(`
|
|
7620
7578
|
`), "Next Steps - Configure ProxyPal");
|
|
7621
|
-
} else if ((config.hasClaude || config.hasChatGPT
|
|
7579
|
+
} else if ((config.hasClaude || config.hasChatGPT) && !args.skipAuth) {
|
|
7622
7580
|
const steps = [];
|
|
7623
7581
|
if (config.hasClaude) {
|
|
7624
7582
|
steps.push(`${import_picocolors2.default.dim("opencode auth login")} ${import_picocolors2.default.gray("(select Anthropic \u2192 Claude Pro/Max)")}`);
|
|
@@ -7626,9 +7584,6 @@ async function install(args) {
|
|
|
7626
7584
|
if (config.hasChatGPT) {
|
|
7627
7585
|
steps.push(`${import_picocolors2.default.dim("opencode auth login")} ${import_picocolors2.default.gray("(select OpenAI \u2192 ChatGPT Plus/Pro)")}`);
|
|
7628
7586
|
}
|
|
7629
|
-
if (config.hasGemini) {
|
|
7630
|
-
steps.push(`${import_picocolors2.default.dim("opencode auth login")} ${import_picocolors2.default.gray("(select Google \u2192 OAuth with Antigravity)")}`);
|
|
7631
|
-
}
|
|
7632
7587
|
Me(steps.join(`
|
|
7633
7588
|
`), "Next Steps - Authenticate your providers");
|
|
7634
7589
|
}
|
|
@@ -7876,7 +7831,7 @@ var serializeObjectParam = ({ allowReserved, explode, name, style, value, valueO
|
|
|
7876
7831
|
|
|
7877
7832
|
// node_modules/@opencode-ai/sdk/dist/gen/core/utils.gen.js
|
|
7878
7833
|
var PATH_PARAM_RE = /\{[^{}]+\}/g;
|
|
7879
|
-
var defaultPathSerializer = ({ path:
|
|
7834
|
+
var defaultPathSerializer = ({ path: path2, url: _url }) => {
|
|
7880
7835
|
let url = _url;
|
|
7881
7836
|
const matches = _url.match(PATH_PARAM_RE);
|
|
7882
7837
|
if (matches) {
|
|
@@ -7895,7 +7850,7 @@ var defaultPathSerializer = ({ path: path3, url: _url }) => {
|
|
|
7895
7850
|
name = name.substring(1);
|
|
7896
7851
|
style = "matrix";
|
|
7897
7852
|
}
|
|
7898
|
-
const value =
|
|
7853
|
+
const value = path2[name];
|
|
7899
7854
|
if (value === undefined || value === null) {
|
|
7900
7855
|
continue;
|
|
7901
7856
|
}
|
|
@@ -7926,11 +7881,11 @@ var defaultPathSerializer = ({ path: path3, url: _url }) => {
|
|
|
7926
7881
|
}
|
|
7927
7882
|
return url;
|
|
7928
7883
|
};
|
|
7929
|
-
var getUrl = ({ baseUrl, path:
|
|
7884
|
+
var getUrl = ({ baseUrl, path: path2, query, querySerializer, url: _url }) => {
|
|
7930
7885
|
const pathUrl = _url.startsWith("/") ? _url : `/${_url}`;
|
|
7931
7886
|
let url = (baseUrl ?? "") + pathUrl;
|
|
7932
|
-
if (
|
|
7933
|
-
url = defaultPathSerializer({ path:
|
|
7887
|
+
if (path2) {
|
|
7888
|
+
url = defaultPathSerializer({ path: path2, url });
|
|
7934
7889
|
}
|
|
7935
7890
|
let search = query ? querySerializer(query) : "";
|
|
7936
7891
|
if (search.startsWith("?")) {
|
|
@@ -9442,49 +9397,49 @@ All tasks completed.`));
|
|
|
9442
9397
|
}
|
|
9443
9398
|
// src/hooks/auto-update-checker/checker.ts
|
|
9444
9399
|
import * as fs3 from "fs";
|
|
9445
|
-
import * as
|
|
9400
|
+
import * as path3 from "path";
|
|
9446
9401
|
import { fileURLToPath } from "url";
|
|
9447
9402
|
|
|
9448
9403
|
// src/hooks/auto-update-checker/constants.ts
|
|
9449
|
-
import * as
|
|
9450
|
-
import * as
|
|
9404
|
+
import * as path2 from "path";
|
|
9405
|
+
import * as os2 from "os";
|
|
9451
9406
|
import * as fs2 from "fs";
|
|
9452
9407
|
var PACKAGE_NAME = "oh-my-opencode";
|
|
9453
9408
|
var NPM_REGISTRY_URL = `https://registry.npmjs.org/-/package/${PACKAGE_NAME}/dist-tags`;
|
|
9454
9409
|
var NPM_FETCH_TIMEOUT = 5000;
|
|
9455
9410
|
function getCacheDir() {
|
|
9456
9411
|
if (process.platform === "win32") {
|
|
9457
|
-
return
|
|
9412
|
+
return path2.join(process.env.LOCALAPPDATA ?? os2.homedir(), "opencode");
|
|
9458
9413
|
}
|
|
9459
|
-
return
|
|
9414
|
+
return path2.join(os2.homedir(), ".cache", "opencode");
|
|
9460
9415
|
}
|
|
9461
9416
|
var CACHE_DIR = getCacheDir();
|
|
9462
|
-
var VERSION_FILE =
|
|
9463
|
-
var INSTALLED_PACKAGE_JSON =
|
|
9417
|
+
var VERSION_FILE = path2.join(CACHE_DIR, "version");
|
|
9418
|
+
var INSTALLED_PACKAGE_JSON = path2.join(CACHE_DIR, "node_modules", PACKAGE_NAME, "package.json");
|
|
9464
9419
|
function getUserConfigDir() {
|
|
9465
9420
|
if (process.platform === "win32") {
|
|
9466
|
-
const crossPlatformDir =
|
|
9467
|
-
const appdataDir = process.env.APPDATA ??
|
|
9468
|
-
const crossPlatformConfig =
|
|
9469
|
-
const crossPlatformConfigJsonc =
|
|
9421
|
+
const crossPlatformDir = path2.join(os2.homedir(), ".config");
|
|
9422
|
+
const appdataDir = process.env.APPDATA ?? path2.join(os2.homedir(), "AppData", "Roaming");
|
|
9423
|
+
const crossPlatformConfig = path2.join(crossPlatformDir, "opencode", "opencode.json");
|
|
9424
|
+
const crossPlatformConfigJsonc = path2.join(crossPlatformDir, "opencode", "opencode.jsonc");
|
|
9470
9425
|
if (fs2.existsSync(crossPlatformConfig) || fs2.existsSync(crossPlatformConfigJsonc)) {
|
|
9471
9426
|
return crossPlatformDir;
|
|
9472
9427
|
}
|
|
9473
9428
|
return appdataDir;
|
|
9474
9429
|
}
|
|
9475
|
-
return process.env.XDG_CONFIG_HOME ??
|
|
9430
|
+
return process.env.XDG_CONFIG_HOME ?? path2.join(os2.homedir(), ".config");
|
|
9476
9431
|
}
|
|
9477
9432
|
function getWindowsAppdataDir() {
|
|
9478
9433
|
if (process.platform !== "win32")
|
|
9479
9434
|
return null;
|
|
9480
|
-
return process.env.APPDATA ??
|
|
9435
|
+
return process.env.APPDATA ?? path2.join(os2.homedir(), "AppData", "Roaming");
|
|
9481
9436
|
}
|
|
9482
9437
|
var USER_CONFIG_DIR = getUserConfigDir();
|
|
9483
|
-
var USER_OPENCODE_CONFIG =
|
|
9484
|
-
var USER_OPENCODE_CONFIG_JSONC =
|
|
9438
|
+
var USER_OPENCODE_CONFIG = path2.join(USER_CONFIG_DIR, "opencode", "opencode.json");
|
|
9439
|
+
var USER_OPENCODE_CONFIG_JSONC = path2.join(USER_CONFIG_DIR, "opencode", "opencode.jsonc");
|
|
9485
9440
|
|
|
9486
9441
|
// src/hooks/auto-update-checker/checker.ts
|
|
9487
|
-
import * as
|
|
9442
|
+
import * as os3 from "os";
|
|
9488
9443
|
function isLocalDevMode(directory) {
|
|
9489
9444
|
return getLocalDevPath(directory) !== null;
|
|
9490
9445
|
}
|
|
@@ -9493,18 +9448,18 @@ function stripJsonComments(json2) {
|
|
|
9493
9448
|
}
|
|
9494
9449
|
function getConfigPaths(directory) {
|
|
9495
9450
|
const paths = [
|
|
9496
|
-
|
|
9497
|
-
|
|
9451
|
+
path3.join(directory, ".opencode", "opencode.json"),
|
|
9452
|
+
path3.join(directory, ".opencode", "opencode.jsonc"),
|
|
9498
9453
|
USER_OPENCODE_CONFIG,
|
|
9499
9454
|
USER_OPENCODE_CONFIG_JSONC
|
|
9500
9455
|
];
|
|
9501
9456
|
if (process.platform === "win32") {
|
|
9502
|
-
const crossPlatformDir =
|
|
9457
|
+
const crossPlatformDir = path3.join(os3.homedir(), ".config");
|
|
9503
9458
|
const appdataDir = getWindowsAppdataDir();
|
|
9504
9459
|
if (appdataDir) {
|
|
9505
9460
|
const alternateDir = USER_CONFIG_DIR === crossPlatformDir ? appdataDir : crossPlatformDir;
|
|
9506
|
-
const alternateConfig =
|
|
9507
|
-
const alternateConfigJsonc =
|
|
9461
|
+
const alternateConfig = path3.join(alternateDir, "opencode", "opencode.json");
|
|
9462
|
+
const alternateConfigJsonc = path3.join(alternateDir, "opencode", "opencode.jsonc");
|
|
9508
9463
|
if (!paths.includes(alternateConfig)) {
|
|
9509
9464
|
paths.push(alternateConfig);
|
|
9510
9465
|
}
|
|
@@ -9541,9 +9496,9 @@ function getLocalDevPath(directory) {
|
|
|
9541
9496
|
function findPackageJsonUp(startPath) {
|
|
9542
9497
|
try {
|
|
9543
9498
|
const stat = fs3.statSync(startPath);
|
|
9544
|
-
let dir = stat.isDirectory() ? startPath :
|
|
9499
|
+
let dir = stat.isDirectory() ? startPath : path3.dirname(startPath);
|
|
9545
9500
|
for (let i2 = 0;i2 < 10; i2++) {
|
|
9546
|
-
const pkgPath =
|
|
9501
|
+
const pkgPath = path3.join(dir, "package.json");
|
|
9547
9502
|
if (fs3.existsSync(pkgPath)) {
|
|
9548
9503
|
try {
|
|
9549
9504
|
const content = fs3.readFileSync(pkgPath, "utf-8");
|
|
@@ -9552,7 +9507,7 @@ function findPackageJsonUp(startPath) {
|
|
|
9552
9507
|
return pkgPath;
|
|
9553
9508
|
} catch {}
|
|
9554
9509
|
}
|
|
9555
|
-
const parent =
|
|
9510
|
+
const parent = path3.dirname(dir);
|
|
9556
9511
|
if (parent === dir)
|
|
9557
9512
|
break;
|
|
9558
9513
|
dir = parent;
|
|
@@ -9594,7 +9549,7 @@ function getCachedVersion() {
|
|
|
9594
9549
|
}
|
|
9595
9550
|
} catch {}
|
|
9596
9551
|
try {
|
|
9597
|
-
const currentDir =
|
|
9552
|
+
const currentDir = path3.dirname(fileURLToPath(import.meta.url));
|
|
9598
9553
|
const pkgPath = findPackageJsonUp(currentDir);
|
|
9599
9554
|
if (pkgPath) {
|
|
9600
9555
|
const content = fs3.readFileSync(pkgPath, "utf-8");
|
|
@@ -10051,8 +10006,8 @@ function getPluginCheckDefinition() {
|
|
|
10051
10006
|
|
|
10052
10007
|
// src/cli/doctor/checks/config.ts
|
|
10053
10008
|
import { existsSync as existsSync7, readFileSync as readFileSync5 } from "fs";
|
|
10054
|
-
import { homedir as
|
|
10055
|
-
import { join as
|
|
10009
|
+
import { homedir as homedir4 } from "os";
|
|
10010
|
+
import { join as join5 } from "path";
|
|
10056
10011
|
|
|
10057
10012
|
// node_modules/zod/v4/classic/external.js
|
|
10058
10013
|
var exports_external = {};
|
|
@@ -10783,10 +10738,10 @@ function mergeDefs(...defs) {
|
|
|
10783
10738
|
function cloneDef(schema2) {
|
|
10784
10739
|
return mergeDefs(schema2._zod.def);
|
|
10785
10740
|
}
|
|
10786
|
-
function getElementAtPath(obj,
|
|
10787
|
-
if (!
|
|
10741
|
+
function getElementAtPath(obj, path4) {
|
|
10742
|
+
if (!path4)
|
|
10788
10743
|
return obj;
|
|
10789
|
-
return
|
|
10744
|
+
return path4.reduce((acc, key) => acc?.[key], obj);
|
|
10790
10745
|
}
|
|
10791
10746
|
function promiseAllObject(promisesObj) {
|
|
10792
10747
|
const keys = Object.keys(promisesObj);
|
|
@@ -11145,11 +11100,11 @@ function aborted(x2, startIndex = 0) {
|
|
|
11145
11100
|
}
|
|
11146
11101
|
return false;
|
|
11147
11102
|
}
|
|
11148
|
-
function prefixIssues(
|
|
11103
|
+
function prefixIssues(path4, issues) {
|
|
11149
11104
|
return issues.map((iss) => {
|
|
11150
11105
|
var _a;
|
|
11151
11106
|
(_a = iss).path ?? (_a.path = []);
|
|
11152
|
-
iss.path.unshift(
|
|
11107
|
+
iss.path.unshift(path4);
|
|
11153
11108
|
return iss;
|
|
11154
11109
|
});
|
|
11155
11110
|
}
|
|
@@ -11317,7 +11272,7 @@ function treeifyError(error, _mapper) {
|
|
|
11317
11272
|
return issue2.message;
|
|
11318
11273
|
};
|
|
11319
11274
|
const result = { errors: [] };
|
|
11320
|
-
const processError = (error2,
|
|
11275
|
+
const processError = (error2, path4 = []) => {
|
|
11321
11276
|
var _a, _b;
|
|
11322
11277
|
for (const issue2 of error2.issues) {
|
|
11323
11278
|
if (issue2.code === "invalid_union" && issue2.errors.length) {
|
|
@@ -11327,7 +11282,7 @@ function treeifyError(error, _mapper) {
|
|
|
11327
11282
|
} else if (issue2.code === "invalid_element") {
|
|
11328
11283
|
processError({ issues: issue2.issues }, issue2.path);
|
|
11329
11284
|
} else {
|
|
11330
|
-
const fullpath = [...
|
|
11285
|
+
const fullpath = [...path4, ...issue2.path];
|
|
11331
11286
|
if (fullpath.length === 0) {
|
|
11332
11287
|
result.errors.push(mapper(issue2));
|
|
11333
11288
|
continue;
|
|
@@ -11359,8 +11314,8 @@ function treeifyError(error, _mapper) {
|
|
|
11359
11314
|
}
|
|
11360
11315
|
function toDotPath(_path) {
|
|
11361
11316
|
const segs = [];
|
|
11362
|
-
const
|
|
11363
|
-
for (const seg of
|
|
11317
|
+
const path4 = _path.map((seg) => typeof seg === "object" ? seg.key : seg);
|
|
11318
|
+
for (const seg of path4) {
|
|
11364
11319
|
if (typeof seg === "number")
|
|
11365
11320
|
segs.push(`[${seg}]`);
|
|
11366
11321
|
else if (typeof seg === "symbol")
|
|
@@ -22450,7 +22405,9 @@ var HookNameSchema = exports_external.enum([
|
|
|
22450
22405
|
"edit-error-recovery",
|
|
22451
22406
|
"prometheus-md-only",
|
|
22452
22407
|
"start-work",
|
|
22453
|
-
"sisyphus-orchestrator"
|
|
22408
|
+
"sisyphus-orchestrator",
|
|
22409
|
+
"maestro-sisyphus-bridge",
|
|
22410
|
+
"tdd-enforcement"
|
|
22454
22411
|
]);
|
|
22455
22412
|
var BuiltinCommandNameSchema = exports_external.enum([
|
|
22456
22413
|
"init-deep",
|
|
@@ -22620,6 +22577,18 @@ var GitMasterConfigSchema = exports_external.object({
|
|
|
22620
22577
|
commit_footer: exports_external.boolean().default(true),
|
|
22621
22578
|
include_co_authored_by: exports_external.boolean().default(true)
|
|
22622
22579
|
});
|
|
22580
|
+
var MaestroConfigSchema = exports_external.object({
|
|
22581
|
+
autoExecute: exports_external.boolean().default(false),
|
|
22582
|
+
useDesignPhases: exports_external.boolean().default(true),
|
|
22583
|
+
useTracking: exports_external.boolean().default(true),
|
|
22584
|
+
preferredExecutionMode: exports_external.enum(["maestro", "sisyphus"]).default("maestro"),
|
|
22585
|
+
enforceTdd: exports_external.boolean().default(false),
|
|
22586
|
+
tddGates: exports_external.object({
|
|
22587
|
+
requireFailingTest: exports_external.boolean().default(true),
|
|
22588
|
+
requirePassingTest: exports_external.boolean().default(true),
|
|
22589
|
+
runFullSuiteAfterRefactor: exports_external.boolean().default(true)
|
|
22590
|
+
}).optional()
|
|
22591
|
+
});
|
|
22623
22592
|
var OhMyOpenCodeConfigSchema = exports_external.object({
|
|
22624
22593
|
$schema: exports_external.string().optional(),
|
|
22625
22594
|
disabled_mcps: exports_external.array(AnyMcpNameSchema).optional(),
|
|
@@ -22630,7 +22599,6 @@ var OhMyOpenCodeConfigSchema = exports_external.object({
|
|
|
22630
22599
|
agents: AgentOverridesSchema.optional(),
|
|
22631
22600
|
categories: CategoriesConfigSchema.optional(),
|
|
22632
22601
|
claude_code: ClaudeCodeConfigSchema.optional(),
|
|
22633
|
-
google_auth: exports_external.boolean().optional(),
|
|
22634
22602
|
sisyphus_agent: SisyphusAgentConfigSchema.optional(),
|
|
22635
22603
|
comment_checker: CommentCheckerConfigSchema.optional(),
|
|
22636
22604
|
experimental: ExperimentalConfigSchema.optional(),
|
|
@@ -22639,12 +22607,13 @@ var OhMyOpenCodeConfigSchema = exports_external.object({
|
|
|
22639
22607
|
ralph_loop: RalphLoopConfigSchema.optional(),
|
|
22640
22608
|
background_task: BackgroundTaskConfigSchema.optional(),
|
|
22641
22609
|
notification: NotificationConfigSchema.optional(),
|
|
22642
|
-
git_master: GitMasterConfigSchema.optional()
|
|
22610
|
+
git_master: GitMasterConfigSchema.optional(),
|
|
22611
|
+
maestro: MaestroConfigSchema.optional()
|
|
22643
22612
|
});
|
|
22644
22613
|
// src/cli/doctor/checks/config.ts
|
|
22645
|
-
var USER_CONFIG_DIR2 =
|
|
22646
|
-
var USER_CONFIG_BASE =
|
|
22647
|
-
var PROJECT_CONFIG_BASE =
|
|
22614
|
+
var USER_CONFIG_DIR2 = join5(homedir4(), ".config", "opencode");
|
|
22615
|
+
var USER_CONFIG_BASE = join5(USER_CONFIG_DIR2, `${PACKAGE_NAME2}`);
|
|
22616
|
+
var PROJECT_CONFIG_BASE = join5(process.cwd(), ".opencode", PACKAGE_NAME2);
|
|
22648
22617
|
function findConfigPath() {
|
|
22649
22618
|
const projectDetected = detectConfigFile(PROJECT_CONFIG_BASE);
|
|
22650
22619
|
if (projectDetected.format !== "none") {
|
|
@@ -22742,15 +22711,15 @@ function getConfigCheckDefinition() {
|
|
|
22742
22711
|
|
|
22743
22712
|
// src/cli/doctor/checks/auth.ts
|
|
22744
22713
|
import { existsSync as existsSync8, readFileSync as readFileSync6 } from "fs";
|
|
22745
|
-
import { homedir as
|
|
22746
|
-
import { join as
|
|
22747
|
-
var OPENCODE_CONFIG_DIR =
|
|
22748
|
-
var OPENCODE_JSON =
|
|
22749
|
-
var OPENCODE_JSONC =
|
|
22714
|
+
import { homedir as homedir5 } from "os";
|
|
22715
|
+
import { join as join6 } from "path";
|
|
22716
|
+
var OPENCODE_CONFIG_DIR = join6(homedir5(), ".config", "opencode");
|
|
22717
|
+
var OPENCODE_JSON = join6(OPENCODE_CONFIG_DIR, "opencode.json");
|
|
22718
|
+
var OPENCODE_JSONC = join6(OPENCODE_CONFIG_DIR, "opencode.jsonc");
|
|
22750
22719
|
var AUTH_PLUGINS = {
|
|
22751
22720
|
anthropic: { plugin: "builtin", name: "Anthropic (Claude)" },
|
|
22752
22721
|
openai: { plugin: "opencode-openai-codex-auth", name: "OpenAI (ChatGPT)" },
|
|
22753
|
-
google: { plugin: "opencode-
|
|
22722
|
+
google: { plugin: "opencode-proxypal-auth", name: "Google (Gemini)" }
|
|
22754
22723
|
};
|
|
22755
22724
|
function getOpenCodeConfig() {
|
|
22756
22725
|
const configPath = existsSync8(OPENCODE_JSONC) ? OPENCODE_JSONC : OPENCODE_JSON;
|
|
@@ -23187,13 +23156,13 @@ function getLspCheckDefinition() {
|
|
|
23187
23156
|
|
|
23188
23157
|
// src/cli/doctor/checks/mcp.ts
|
|
23189
23158
|
import { existsSync as existsSync9, readFileSync as readFileSync7 } from "fs";
|
|
23190
|
-
import { homedir as
|
|
23191
|
-
import { join as
|
|
23159
|
+
import { homedir as homedir6 } from "os";
|
|
23160
|
+
import { join as join7 } from "path";
|
|
23192
23161
|
var BUILTIN_MCP_SERVERS = ["context7", "grep_app"];
|
|
23193
23162
|
var MCP_CONFIG_PATHS = [
|
|
23194
|
-
|
|
23195
|
-
|
|
23196
|
-
|
|
23163
|
+
join7(homedir6(), ".claude", ".mcp.json"),
|
|
23164
|
+
join7(process.cwd(), ".mcp.json"),
|
|
23165
|
+
join7(process.cwd(), ".claude", ".mcp.json")
|
|
23197
23166
|
];
|
|
23198
23167
|
function loadUserMcpConfig() {
|
|
23199
23168
|
const servers = {};
|
|
@@ -23592,151 +23561,17 @@ async function doctor(options = {}) {
|
|
|
23592
23561
|
return result.exitCode;
|
|
23593
23562
|
}
|
|
23594
23563
|
|
|
23595
|
-
// src/auth/antigravity/storage.ts
|
|
23596
|
-
import { promises as fs4 } from "fs";
|
|
23597
|
-
import { join as join9, dirname as dirname2 } from "path";
|
|
23598
|
-
function getDataDir2() {
|
|
23599
|
-
return join9(getDataDir(), "opencode");
|
|
23600
|
-
}
|
|
23601
|
-
function getStoragePath() {
|
|
23602
|
-
return join9(getDataDir2(), "oh-my-opencode-accounts.json");
|
|
23603
|
-
}
|
|
23604
|
-
async function loadAccounts(path5) {
|
|
23605
|
-
const storagePath = path5 ?? getStoragePath();
|
|
23606
|
-
try {
|
|
23607
|
-
const content = await fs4.readFile(storagePath, "utf-8");
|
|
23608
|
-
const data = JSON.parse(content);
|
|
23609
|
-
if (!isValidAccountStorage(data)) {
|
|
23610
|
-
return null;
|
|
23611
|
-
}
|
|
23612
|
-
return data;
|
|
23613
|
-
} catch (error45) {
|
|
23614
|
-
const errorCode = error45.code;
|
|
23615
|
-
if (errorCode === "ENOENT") {
|
|
23616
|
-
return null;
|
|
23617
|
-
}
|
|
23618
|
-
if (error45 instanceof SyntaxError) {
|
|
23619
|
-
return null;
|
|
23620
|
-
}
|
|
23621
|
-
throw error45;
|
|
23622
|
-
}
|
|
23623
|
-
}
|
|
23624
|
-
async function saveAccounts(storage, path5) {
|
|
23625
|
-
const storagePath = path5 ?? getStoragePath();
|
|
23626
|
-
await fs4.mkdir(dirname2(storagePath), { recursive: true });
|
|
23627
|
-
const content = JSON.stringify(storage, null, 2);
|
|
23628
|
-
const tempPath = `${storagePath}.tmp.${process.pid}.${Date.now()}`;
|
|
23629
|
-
await fs4.writeFile(tempPath, content, { encoding: "utf-8", mode: 384 });
|
|
23630
|
-
try {
|
|
23631
|
-
await fs4.rename(tempPath, storagePath);
|
|
23632
|
-
} catch (error45) {
|
|
23633
|
-
await fs4.unlink(tempPath).catch(() => {});
|
|
23634
|
-
throw error45;
|
|
23635
|
-
}
|
|
23636
|
-
}
|
|
23637
|
-
function isValidAccountStorage(data) {
|
|
23638
|
-
if (typeof data !== "object" || data === null) {
|
|
23639
|
-
return false;
|
|
23640
|
-
}
|
|
23641
|
-
const obj = data;
|
|
23642
|
-
if (typeof obj.version !== "number") {
|
|
23643
|
-
return false;
|
|
23644
|
-
}
|
|
23645
|
-
if (!Array.isArray(obj.accounts)) {
|
|
23646
|
-
return false;
|
|
23647
|
-
}
|
|
23648
|
-
if (typeof obj.activeIndex !== "number") {
|
|
23649
|
-
return false;
|
|
23650
|
-
}
|
|
23651
|
-
return true;
|
|
23652
|
-
}
|
|
23653
|
-
|
|
23654
|
-
// src/cli/commands/auth.ts
|
|
23655
|
-
async function listAccounts() {
|
|
23656
|
-
const accounts = await loadAccounts();
|
|
23657
|
-
if (!accounts || accounts.accounts.length === 0) {
|
|
23658
|
-
console.log("No accounts found.");
|
|
23659
|
-
console.log("Run 'opencode auth login' and select Google (Antigravity) to add accounts.");
|
|
23660
|
-
return 0;
|
|
23661
|
-
}
|
|
23662
|
-
console.log(`
|
|
23663
|
-
Google Antigravity Accounts (${accounts.accounts.length}/10):
|
|
23664
|
-
`);
|
|
23665
|
-
for (let i2 = 0;i2 < accounts.accounts.length; i2++) {
|
|
23666
|
-
const acc = accounts.accounts[i2];
|
|
23667
|
-
const isActive = i2 === accounts.activeIndex;
|
|
23668
|
-
const activeMarker = isActive ? "* " : " ";
|
|
23669
|
-
console.log(`${activeMarker}[${i2}] ${acc.email || "Unknown"}`);
|
|
23670
|
-
console.log(` Tier: ${acc.tier || "free"}`);
|
|
23671
|
-
const rateLimits = acc.rateLimits || {};
|
|
23672
|
-
const now = Date.now();
|
|
23673
|
-
const limited = [];
|
|
23674
|
-
if (rateLimits.claude && rateLimits.claude > now) {
|
|
23675
|
-
const mins = Math.ceil((rateLimits.claude - now) / 60000);
|
|
23676
|
-
limited.push(`claude (${mins}m)`);
|
|
23677
|
-
}
|
|
23678
|
-
if (rateLimits["gemini-flash"] && rateLimits["gemini-flash"] > now) {
|
|
23679
|
-
const mins = Math.ceil((rateLimits["gemini-flash"] - now) / 60000);
|
|
23680
|
-
limited.push(`gemini-flash (${mins}m)`);
|
|
23681
|
-
}
|
|
23682
|
-
if (rateLimits["gemini-pro"] && rateLimits["gemini-pro"] > now) {
|
|
23683
|
-
const mins = Math.ceil((rateLimits["gemini-pro"] - now) / 60000);
|
|
23684
|
-
limited.push(`gemini-pro (${mins}m)`);
|
|
23685
|
-
}
|
|
23686
|
-
if (limited.length > 0) {
|
|
23687
|
-
console.log(` Rate limited: ${limited.join(", ")}`);
|
|
23688
|
-
}
|
|
23689
|
-
console.log();
|
|
23690
|
-
}
|
|
23691
|
-
return 0;
|
|
23692
|
-
}
|
|
23693
|
-
async function removeAccount(indexOrEmail) {
|
|
23694
|
-
const accounts = await loadAccounts();
|
|
23695
|
-
if (!accounts || accounts.accounts.length === 0) {
|
|
23696
|
-
console.error("No accounts found.");
|
|
23697
|
-
return 1;
|
|
23698
|
-
}
|
|
23699
|
-
let index;
|
|
23700
|
-
const parsedIndex = Number(indexOrEmail);
|
|
23701
|
-
if (Number.isInteger(parsedIndex) && String(parsedIndex) === indexOrEmail) {
|
|
23702
|
-
index = parsedIndex;
|
|
23703
|
-
} else {
|
|
23704
|
-
index = accounts.accounts.findIndex((acc) => acc.email === indexOrEmail);
|
|
23705
|
-
if (index === -1) {
|
|
23706
|
-
console.error(`Account not found: ${indexOrEmail}`);
|
|
23707
|
-
return 1;
|
|
23708
|
-
}
|
|
23709
|
-
}
|
|
23710
|
-
if (index < 0 || index >= accounts.accounts.length) {
|
|
23711
|
-
console.error(`Invalid index: ${index}. Valid range: 0-${accounts.accounts.length - 1}`);
|
|
23712
|
-
return 1;
|
|
23713
|
-
}
|
|
23714
|
-
const removed = accounts.accounts[index];
|
|
23715
|
-
accounts.accounts.splice(index, 1);
|
|
23716
|
-
if (accounts.accounts.length === 0) {
|
|
23717
|
-
accounts.activeIndex = -1;
|
|
23718
|
-
} else if (accounts.activeIndex >= accounts.accounts.length) {
|
|
23719
|
-
accounts.activeIndex = accounts.accounts.length - 1;
|
|
23720
|
-
} else if (accounts.activeIndex > index) {
|
|
23721
|
-
accounts.activeIndex--;
|
|
23722
|
-
}
|
|
23723
|
-
await saveAccounts(accounts);
|
|
23724
|
-
console.log(`Removed account: ${removed.email || "Unknown"} (index ${index})`);
|
|
23725
|
-
console.log(`Remaining accounts: ${accounts.accounts.length}`);
|
|
23726
|
-
return 0;
|
|
23727
|
-
}
|
|
23728
|
-
|
|
23729
23564
|
// src/cli/index.ts
|
|
23730
23565
|
var packageJson = await Promise.resolve().then(() => __toESM(require_package(), 1));
|
|
23731
23566
|
var VERSION = packageJson.version;
|
|
23732
23567
|
var program2 = new Command;
|
|
23733
23568
|
program2.name("oh-my-opencode").description("The ultimate OpenCode plugin - multi-model orchestration, LSP tools, and more").version(VERSION, "-v, --version", "Show version number");
|
|
23734
|
-
program2.command("install").description("Install and configure oh-my-opencode with interactive setup").option("--no-tui", "Run in non-interactive mode (requires all options)").option("--proxypal <value>", "ProxyPal proxy: no, yes (if yes, skips claude/chatgpt
|
|
23569
|
+
program2.command("install").description("Install and configure oh-my-opencode with interactive setup").option("--no-tui", "Run in non-interactive mode (requires all options)").option("--proxypal <value>", "ProxyPal proxy: no, yes (if yes, skips claude/chatgpt)").option("--claude <value>", "Claude subscription: no, yes, max20").option("--chatgpt <value>", "ChatGPT subscription: no, yes").option("--skip-auth", "Skip authentication setup hints").addHelpText("after", `
|
|
23735
23570
|
Examples:
|
|
23736
23571
|
$ bunx oh-my-opencode install
|
|
23737
23572
|
$ bunx oh-my-opencode install --no-tui --proxypal=yes
|
|
23738
|
-
$ bunx oh-my-opencode install --no-tui --claude=max20 --chatgpt=yes
|
|
23739
|
-
$ bunx oh-my-opencode install --no-tui --claude=no --chatgpt=no
|
|
23573
|
+
$ bunx oh-my-opencode install --no-tui --claude=max20 --chatgpt=yes
|
|
23574
|
+
$ bunx oh-my-opencode install --no-tui --claude=no --chatgpt=no
|
|
23740
23575
|
|
|
23741
23576
|
Model Providers:
|
|
23742
23577
|
ProxyPal Use ProxyPal proxy for all models (github.com/heyhuynhgiabuu/proxypal)
|
|
@@ -23749,7 +23584,6 @@ Model Providers:
|
|
|
23749
23584
|
proxypal: options.proxypal,
|
|
23750
23585
|
claude: options.claude,
|
|
23751
23586
|
chatgpt: options.chatgpt,
|
|
23752
|
-
gemini: options.gemini,
|
|
23753
23587
|
skipAuth: options.skipAuth ?? false
|
|
23754
23588
|
};
|
|
23755
23589
|
const exitCode = await install(args);
|
|
@@ -23816,32 +23650,6 @@ Categories:
|
|
|
23816
23650
|
const exitCode = await doctor(doctorOptions);
|
|
23817
23651
|
process.exit(exitCode);
|
|
23818
23652
|
});
|
|
23819
|
-
var authCommand = program2.command("auth").description("Manage Google Antigravity accounts");
|
|
23820
|
-
authCommand.command("list").description("List all Google Antigravity accounts").addHelpText("after", `
|
|
23821
|
-
Examples:
|
|
23822
|
-
$ bunx oh-my-opencode auth list
|
|
23823
|
-
|
|
23824
|
-
Shows:
|
|
23825
|
-
- Account index and email
|
|
23826
|
-
- Account tier (free/paid)
|
|
23827
|
-
- Active account (marked with *)
|
|
23828
|
-
- Rate limit status per model family
|
|
23829
|
-
`).action(async () => {
|
|
23830
|
-
const exitCode = await listAccounts();
|
|
23831
|
-
process.exit(exitCode);
|
|
23832
|
-
});
|
|
23833
|
-
authCommand.command("remove <index-or-email>").description("Remove an account by index or email").addHelpText("after", `
|
|
23834
|
-
Examples:
|
|
23835
|
-
$ bunx oh-my-opencode auth remove 0
|
|
23836
|
-
$ bunx oh-my-opencode auth remove user@example.com
|
|
23837
|
-
|
|
23838
|
-
Note:
|
|
23839
|
-
- Use 'auth list' to see account indices
|
|
23840
|
-
- Removing the active account will switch to the next available account
|
|
23841
|
-
`).action(async (indexOrEmail) => {
|
|
23842
|
-
const exitCode = await removeAccount(indexOrEmail);
|
|
23843
|
-
process.exit(exitCode);
|
|
23844
|
-
});
|
|
23845
23653
|
program2.command("version").description("Show version information").action(() => {
|
|
23846
23654
|
console.log(`oh-my-opencode v${VERSION}`);
|
|
23847
23655
|
});
|