@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.
Files changed (59) hide show
  1. package/dist/cli/config-manager.d.ts +3 -3
  2. package/dist/cli/index.js +158 -350
  3. package/dist/cli/types.d.ts +0 -1
  4. package/dist/config/index.d.ts +2 -2
  5. package/dist/config/schema.d.ts +215 -181
  6. package/dist/features/background-agent/index.d.ts +1 -1
  7. package/dist/features/background-agent/manager.d.ts +10 -0
  8. package/dist/features/background-agent/types.d.ts +4 -0
  9. package/dist/features/boulder-state/index.d.ts +1 -0
  10. package/dist/features/boulder-state/unified-state.d.ts +86 -0
  11. package/dist/features/maestro/hooks/index.d.ts +16 -0
  12. package/dist/features/maestro/index.d.ts +4 -0
  13. package/dist/features/maestro/skills/index.d.ts +4 -0
  14. package/dist/features/maestro/types.d.ts +42 -0
  15. package/dist/features/maestro/utils/index.d.ts +4 -0
  16. package/dist/features/workflow-engine/contracts/v1/types.d.ts +9 -0
  17. package/dist/hooks/background-notification/index.d.ts +10 -0
  18. package/dist/hooks/index.d.ts +3 -0
  19. package/dist/hooks/maestro-sisyphus-bridge/constants.d.ts +9 -0
  20. package/dist/hooks/maestro-sisyphus-bridge/index.d.ts +53 -0
  21. package/dist/hooks/tdd-enforcement/constants.d.ts +16 -0
  22. package/dist/hooks/tdd-enforcement/index.d.ts +54 -0
  23. package/dist/index.js +1851 -6022
  24. package/dist/shared/migration.d.ts +4 -0
  25. package/dist/tools/skill/tools.d.ts +1 -7
  26. package/dist/tools/slashcommand/tools.d.ts +1 -7
  27. package/package.json +2 -6
  28. package/dist/auth/antigravity/accounts.d.ts +0 -40
  29. package/dist/auth/antigravity/accounts.test.d.ts +0 -1
  30. package/dist/auth/antigravity/browser.d.ts +0 -27
  31. package/dist/auth/antigravity/browser.test.d.ts +0 -1
  32. package/dist/auth/antigravity/cli.d.ts +0 -2
  33. package/dist/auth/antigravity/cli.test.d.ts +0 -1
  34. package/dist/auth/antigravity/constants.d.ts +0 -98
  35. package/dist/auth/antigravity/constants.test.d.ts +0 -1
  36. package/dist/auth/antigravity/fetch.d.ts +0 -69
  37. package/dist/auth/antigravity/index.d.ts +0 -13
  38. package/dist/auth/antigravity/integration.test.d.ts +0 -10
  39. package/dist/auth/antigravity/message-converter.d.ts +0 -54
  40. package/dist/auth/antigravity/oauth.d.ts +0 -51
  41. package/dist/auth/antigravity/oauth.test.d.ts +0 -1
  42. package/dist/auth/antigravity/plugin.d.ts +0 -54
  43. package/dist/auth/antigravity/project.d.ts +0 -10
  44. package/dist/auth/antigravity/request.d.ts +0 -116
  45. package/dist/auth/antigravity/request.test.d.ts +0 -1
  46. package/dist/auth/antigravity/response.d.ts +0 -137
  47. package/dist/auth/antigravity/storage.d.ts +0 -5
  48. package/dist/auth/antigravity/storage.test.d.ts +0 -1
  49. package/dist/auth/antigravity/thinking.d.ts +0 -278
  50. package/dist/auth/antigravity/thinking.test.d.ts +0 -10
  51. package/dist/auth/antigravity/thought-signature-store.d.ts +0 -52
  52. package/dist/auth/antigravity/token.d.ts +0 -38
  53. package/dist/auth/antigravity/token.test.d.ts +0 -1
  54. package/dist/auth/antigravity/tools.d.ts +0 -119
  55. package/dist/auth/antigravity/types.d.ts +0 -229
  56. package/dist/cli/commands/auth.d.ts +0 -2
  57. package/dist/cli/config-manager.test.d.ts +0 -1
  58. package/dist/google-auth.d.ts +0 -3
  59. 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.13",
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 src/google-auth.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",
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 as homedir2 } from "os";
6494
- import { join as join3 } from "path";
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 join3(homedir2(), "Library", "Application Support", identifier);
6497
+ return join2(homedir(), "Library", "Application Support", identifier);
6507
6498
  case "win32": {
6508
- const appData = process.env.APPDATA || join3(homedir2(), "AppData", "Roaming");
6509
- return join3(appData, identifier);
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 || join3(homedir2(), ".config");
6514
- return join3(xdgConfig, identifier);
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 = join3(homedir2(), ".config", "opencode");
6521
- const crossPlatformConfig = join3(crossPlatformDir, "opencode.json");
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 || join3(homedir2(), "AppData", "Roaming");
6526
- const appdataDir = join3(appData, "opencode");
6527
- const appdataConfig = join3(appdataDir, "opencode.json");
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 || join3(homedir2(), ".config");
6534
- return join3(xdgConfig, "opencode");
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 = join3(legacyDir, "opencode.json");
6546
- const legacyConfigC = join3(legacyDir, "opencode.jsonc");
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: join3(configDir, "opencode.json"),
6558
- configJsonc: join3(configDir, "opencode.jsonc"),
6559
- packageJson: join3(configDir, "package.json"),
6560
- omoConfig: join3(configDir, "oh-my-opencode.json")
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(path3) {
6636
+ function parseConfigWithError(path2) {
6646
6637
  try {
6647
- const stat = statSync(path3);
6638
+ const stat = statSync(path2);
6648
6639
  if (stat.size === 0) {
6649
- return { config: null, error: `Config file is empty: ${path3}. Delete it or add valid JSON content.` };
6640
+ return { config: null, error: `Config file is empty: ${path2}. Delete it or add valid JSON content.` };
6650
6641
  }
6651
- const content = readFileSync2(path3, "utf-8");
6642
+ const content = readFileSync2(path2, "utf-8");
6652
6643
  if (isEmptyOrWhitespace(content)) {
6653
- return { config: null, error: `Config file contains only whitespace: ${path3}. Delete it or add valid JSON content.` };
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: ${path3}. Ensure it contains valid JSON.` };
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}: ${path3}` };
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 ${path3}`) };
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: path3 } = detectConfigFormat();
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(path3, JSON.stringify(config2, null, 2) + `
6675
+ writeFileSync(path2, JSON.stringify(config2, null, 2) + `
6685
6676
  `);
6686
- return { success: true, configPath: path3 };
6677
+ return { success: true, configPath: path2 };
6687
6678
  }
6688
- const parseResult = parseConfigWithError(path3);
6679
+ const parseResult = parseConfigWithError(path2);
6689
6680
  if (!parseResult.config) {
6690
- return { success: false, configPath: path3, error: parseResult.error ?? "Failed to parse config file" };
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: path3 };
6686
+ return { success: true, configPath: path2 };
6696
6687
  }
6697
6688
  config.plugin = [...plugins, pluginName];
6698
6689
  if (format2 === "jsonc") {
6699
- const content = readFileSync2(path3, "utf-8");
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(path3, newContent);
6700
+ writeFileSync(path2, newContent);
6710
6701
  } else {
6711
6702
  const newContent = content.replace(/^(\s*\{)/, `$1
6712
6703
  "plugin": ["${pluginName}"],`);
6713
- writeFileSync(path3, newContent);
6704
+ writeFileSync(path2, newContent);
6714
6705
  }
6715
6706
  } else {
6716
- writeFileSync(path3, JSON.stringify(config, null, 2) + `
6707
+ writeFileSync(path2, JSON.stringify(config, null, 2) + `
6717
6708
  `);
6718
6709
  }
6719
- return { success: true, configPath: path3 };
6710
+ return { success: true, configPath: path2 };
6720
6711
  } catch (err) {
6721
- return { success: false, configPath: path3, error: formatErrorWithSuggestion(err, "update opencode config") };
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/code-yeongyu/oh-my-opencode/master/assets/oh-my-opencode.schema.json"
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: path3 } = detectConfigFormat();
6891
+ const { format: format2, path: path2 } = detectConfigFormat();
6903
6892
  try {
6904
6893
  let existingConfig = null;
6905
6894
  if (format2 !== "none") {
6906
- const parseResult = parseConfigWithError(path3);
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-antigravity-auth");
6916
- const pluginEntry = version ? `opencode-antigravity-auth@${version}` : "opencode-antigravity-auth";
6917
- if (!plugins.some((p2) => p2.startsWith("opencode-antigravity-auth"))) {
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(path3, JSON.stringify(newConfig, null, 2) + `
6916
+ writeFileSync(path2, JSON.stringify(newConfig, null, 2) + `
6928
6917
  `);
6929
- return { success: true, configPath: path3 };
6918
+ return { success: true, configPath: path2 };
6930
6919
  } catch (err) {
6931
- return { success: false, configPath: path3, error: formatErrorWithSuggestion(err, "add auth plugins to config") };
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
- "antigravity-gemini-3-pro-high": {
6991
- name: "Gemini 3 Pro High (Antigravity)",
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
- "antigravity-gemini-3-flash": {
6998
- name: "Gemini 3 Flash (Antigravity)",
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
- "antigravity-gemini-3-pro-high": {
7011
- name: "Gemini 3 Pro High (Antigravity)",
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
- "antigravity-gemini-3-pro-low": {
7018
- name: "Gemini 3 Pro Low (Antigravity)",
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
- "antigravity-gemini-3-flash": {
7025
- name: "Gemini 3 Flash (Antigravity)",
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: path3 } = detectConfigFormat();
7076
+ const { format: format2, path: path2 } = detectConfigFormat();
7088
7077
  try {
7089
7078
  let existingConfig = null;
7090
7079
  if (format2 !== "none") {
7091
- const parseResult = parseConfigWithError(path3);
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(path3, JSON.stringify(newConfig, null, 2) + `
7101
+ writeFileSync(path2, JSON.stringify(newConfig, null, 2) + `
7113
7102
  `);
7114
- return { success: true, configPath: path3 };
7103
+ return { success: true, configPath: path2 };
7115
7104
  } catch (err) {
7116
- return { success: false, configPath: path3, error: formatErrorWithSuggestion(err, "add provider config") };
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: path3 } = detectConfigFormat();
7117
+ const { format: format2, path: path2 } = detectConfigFormat();
7129
7118
  if (format2 === "none") {
7130
7119
  return result;
7131
7120
  }
7132
- const parseResult = parseConfigWithError(path3);
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-antigravity-auth"));
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: args.gemini === "yes"
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: gemini === "yes"
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> --gemini=<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}, Gemini=${initial.gemini}`);
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.hasGemini || config.hasChatGPT) {
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 && !config.hasGemini) {
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 || config.hasGemini) && !args.skipAuth) {
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}, Gemini=${initial.gemini}`);
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.hasGemini || config.hasChatGPT) {
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 && !config.hasGemini) {
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 || config.hasGemini) && !args.skipAuth) {
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: path3, url: _url }) => {
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 = path3[name];
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: path3, query, querySerializer, url: _url }) => {
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 (path3) {
7933
- url = defaultPathSerializer({ path: path3, url });
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 path4 from "path";
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 path3 from "path";
9450
- import * as os3 from "os";
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 path3.join(process.env.LOCALAPPDATA ?? os3.homedir(), "opencode");
9412
+ return path2.join(process.env.LOCALAPPDATA ?? os2.homedir(), "opencode");
9458
9413
  }
9459
- return path3.join(os3.homedir(), ".cache", "opencode");
9414
+ return path2.join(os2.homedir(), ".cache", "opencode");
9460
9415
  }
9461
9416
  var CACHE_DIR = getCacheDir();
9462
- var VERSION_FILE = path3.join(CACHE_DIR, "version");
9463
- var INSTALLED_PACKAGE_JSON = path3.join(CACHE_DIR, "node_modules", PACKAGE_NAME, "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 = path3.join(os3.homedir(), ".config");
9467
- const appdataDir = process.env.APPDATA ?? path3.join(os3.homedir(), "AppData", "Roaming");
9468
- const crossPlatformConfig = path3.join(crossPlatformDir, "opencode", "opencode.json");
9469
- const crossPlatformConfigJsonc = path3.join(crossPlatformDir, "opencode", "opencode.jsonc");
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 ?? path3.join(os3.homedir(), ".config");
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 ?? path3.join(os3.homedir(), "AppData", "Roaming");
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 = path3.join(USER_CONFIG_DIR, "opencode", "opencode.json");
9484
- var USER_OPENCODE_CONFIG_JSONC = path3.join(USER_CONFIG_DIR, "opencode", "opencode.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 os4 from "os";
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
- path4.join(directory, ".opencode", "opencode.json"),
9497
- path4.join(directory, ".opencode", "opencode.jsonc"),
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 = path4.join(os4.homedir(), ".config");
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 = path4.join(alternateDir, "opencode", "opencode.json");
9507
- const alternateConfigJsonc = path4.join(alternateDir, "opencode", "opencode.jsonc");
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 : path4.dirname(startPath);
9499
+ let dir = stat.isDirectory() ? startPath : path3.dirname(startPath);
9545
9500
  for (let i2 = 0;i2 < 10; i2++) {
9546
- const pkgPath = path4.join(dir, "package.json");
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 = path4.dirname(dir);
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 = path4.dirname(fileURLToPath(import.meta.url));
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 homedir5 } from "os";
10055
- import { join as join6 } from "path";
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, path5) {
10787
- if (!path5)
10741
+ function getElementAtPath(obj, path4) {
10742
+ if (!path4)
10788
10743
  return obj;
10789
- return path5.reduce((acc, key) => acc?.[key], obj);
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(path5, issues) {
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(path5);
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, path5 = []) => {
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 = [...path5, ...issue2.path];
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 path5 = _path.map((seg) => typeof seg === "object" ? seg.key : seg);
11363
- for (const seg of path5) {
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 = join6(homedir5(), ".config", "opencode");
22646
- var USER_CONFIG_BASE = join6(USER_CONFIG_DIR2, `${PACKAGE_NAME2}`);
22647
- var PROJECT_CONFIG_BASE = join6(process.cwd(), ".opencode", PACKAGE_NAME2);
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 homedir6 } from "os";
22746
- import { join as join7 } from "path";
22747
- var OPENCODE_CONFIG_DIR = join7(homedir6(), ".config", "opencode");
22748
- var OPENCODE_JSON = join7(OPENCODE_CONFIG_DIR, "opencode.json");
22749
- var OPENCODE_JSONC = join7(OPENCODE_CONFIG_DIR, "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-antigravity-auth", name: "Google (Gemini)" }
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 homedir7 } from "os";
23191
- import { join as join8 } from "path";
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
- join8(homedir7(), ".claude", ".mcp.json"),
23195
- join8(process.cwd(), ".mcp.json"),
23196
- join8(process.cwd(), ".claude", ".mcp.json")
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/gemini)").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", `
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 --gemini=yes
23739
- $ bunx oh-my-opencode install --no-tui --claude=no --chatgpt=no --gemini=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
  });