omo-suites 1.5.4 → 1.6.0

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/CHANGELOG.md CHANGED
@@ -5,6 +5,16 @@ All notable changes to OMO Suites will be documented in this file.
5
5
  Format based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
6
6
  This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [1.6.0] - 2026-03-07
9
+
10
+ ### Added
11
+ - **Auth plugin support in `omocs init`** — authenticate via OAuth/CLI login instead of pasting API keys
12
+ - Auth plugins offered first (recommended), manual API keys offered second
13
+ - Supported auth plugins: Antigravity (Google DeepMind), OpenAI Codex
14
+ - Auth plugins auto-installed via `npm install -g` with spinner and error handling
15
+ - Auth plugins auto-registered in `opencode.json` plugin array
16
+ - Summary box shows both auth plugins and manual API keys configured
17
+
8
18
  ## [1.5.4] - 2026-03-07
9
19
 
10
20
  ### Added
package/dist/cli/omocs.js CHANGED
@@ -33533,45 +33533,101 @@ function registerInitCommand(program2) {
33533
33533
  validate: (input) => input === masterPassword ? true : "Passwords do not match"
33534
33534
  }]);
33535
33535
  heading("Step 6: API Providers");
33536
- const { selectedProviders } = await esm_default12.prompt([{
33536
+ const installedAuthPlugins = [];
33537
+ const { selectedAuthPlugins } = await esm_default12.prompt([{
33537
33538
  type: "checkbox",
33538
- name: "selectedProviders",
33539
- message: "Which providers do you use?",
33540
- choices: PROVIDERS.map((p) => ({ name: p.name, value: p.value }))
33539
+ name: "selectedAuthPlugins",
33540
+ message: "Authenticate via login plugins (recommended):",
33541
+ choices: AUTH_PLUGINS.map((p) => ({
33542
+ name: `${p.name} — ${p.description}`,
33543
+ value: p.value
33544
+ }))
33541
33545
  }]);
33542
- const accounts = {};
33543
- for (const providerKey of selectedProviders) {
33544
- const provider = PROVIDERS.find((p) => p.value === providerKey);
33545
- const envValue = process.env[provider.envKey];
33546
- let apiKey = "";
33547
- if (envValue) {
33548
- const { useEnv } = await esm_default12.prompt([{
33549
- type: "confirm",
33550
- name: "useEnv",
33551
- message: `Found ${provider.envKey} in environment. Use it?`,
33552
- default: true
33553
- }]);
33554
- if (useEnv) {
33555
- apiKey = envValue;
33546
+ if (selectedAuthPlugins.length > 0) {
33547
+ for (const pluginValue of selectedAuthPlugins) {
33548
+ const plugin = AUTH_PLUGINS.find((p) => p.value === pluginValue);
33549
+ const authSpinner = ora(`Installing ${plugin.package}...`).start();
33550
+ try {
33551
+ execSync3(`npm install -g ${plugin.package} 2>/dev/null`, { stdio: "pipe" });
33552
+ authSpinner.succeed(`${plugin.package} installed`);
33553
+ installedAuthPlugins.push(plugin.value);
33554
+ } catch {
33555
+ authSpinner.warn(`Failed to install ${plugin.package} you can install it manually later`);
33556
33556
  }
33557
33557
  }
33558
- if (!apiKey) {
33559
- const { key } = await esm_default12.prompt([{
33560
- type: "password",
33561
- name: "key",
33562
- message: `Enter API key for ${provider.name}:`,
33563
- mask: "*",
33564
- validate: (input) => input.length > 0 ? true : "API key cannot be empty"
33565
- }]);
33566
- apiKey = key;
33558
+ try {
33559
+ const opencodeConfigPath = findOpencodeConfig();
33560
+ let opencodeConfig = {};
33561
+ if (existsSync6(opencodeConfigPath)) {
33562
+ opencodeConfig = JSON.parse(readFileSync9(opencodeConfigPath, "utf-8"));
33563
+ }
33564
+ if (!opencodeConfig.plugin)
33565
+ opencodeConfig.plugin = [];
33566
+ for (const pluginName of installedAuthPlugins) {
33567
+ if (!opencodeConfig.plugin.includes(pluginName)) {
33568
+ opencodeConfig.plugin.push(pluginName);
33569
+ }
33570
+ }
33571
+ const configDir = dirname4(opencodeConfigPath);
33572
+ if (!existsSync6(configDir)) {
33573
+ mkdirSync4(configDir, { recursive: true });
33574
+ }
33575
+ writeFileSync5(opencodeConfigPath, JSON.stringify(opencodeConfig, null, 2));
33576
+ success("Registered auth plugins in opencode.json");
33577
+ } catch {
33578
+ info("Could not auto-register auth plugins in opencode.json. Add manually.");
33579
+ }
33580
+ }
33581
+ let selectedProviders = [];
33582
+ const accounts = {};
33583
+ const manualKeyMessage = selectedAuthPlugins.length > 0 ? "Also add manual API keys for other providers?" : "Which providers do you use?";
33584
+ const { wantManualKeys } = selectedAuthPlugins.length > 0 ? await esm_default12.prompt([{
33585
+ type: "confirm",
33586
+ name: "wantManualKeys",
33587
+ message: "Also configure manual API keys for other providers?",
33588
+ default: false
33589
+ }]) : { wantManualKeys: true };
33590
+ if (wantManualKeys) {
33591
+ const providerAnswer = await esm_default12.prompt([{
33592
+ type: "checkbox",
33593
+ name: "selectedProviders",
33594
+ message: manualKeyMessage,
33595
+ choices: PROVIDERS.map((p) => ({ name: p.name, value: p.value }))
33596
+ }]);
33597
+ selectedProviders = providerAnswer.selectedProviders;
33598
+ for (const providerKey of selectedProviders) {
33599
+ const provider = PROVIDERS.find((p) => p.value === providerKey);
33600
+ const envValue = process.env[provider.envKey];
33601
+ let apiKey = "";
33602
+ if (envValue) {
33603
+ const { useEnv } = await esm_default12.prompt([{
33604
+ type: "confirm",
33605
+ name: "useEnv",
33606
+ message: `Found ${provider.envKey} in environment. Use it?`,
33607
+ default: true
33608
+ }]);
33609
+ if (useEnv) {
33610
+ apiKey = envValue;
33611
+ }
33612
+ }
33613
+ if (!apiKey) {
33614
+ const { key } = await esm_default12.prompt([{
33615
+ type: "password",
33616
+ name: "key",
33617
+ message: `Enter API key for ${provider.name}:`,
33618
+ mask: "*",
33619
+ validate: (input) => input.length > 0 ? true : "API key cannot be empty"
33620
+ }]);
33621
+ apiKey = key;
33622
+ }
33623
+ const encryptedKey = encrypt(apiKey, masterPassword);
33624
+ accounts[providerKey] = [{
33625
+ label: "default",
33626
+ key: encryptedKey,
33627
+ priority: 1,
33628
+ status: "active"
33629
+ }];
33567
33630
  }
33568
- const encryptedKey = encrypt(apiKey, masterPassword);
33569
- accounts[providerKey] = [{
33570
- label: "default",
33571
- key: encryptedKey,
33572
- priority: 1,
33573
- status: "active"
33574
- }];
33575
33631
  }
33576
33632
  heading("Step 7: Choose Profile");
33577
33633
  const profileChoices = Object.entries(profiles).map(([key, profile2]) => ({
@@ -33641,11 +33697,12 @@ function registerInitCommand(program2) {
33641
33697
  const summaryLines = [
33642
33698
  `${icons.check} oh-my-opencode: ${source_default.bold(ohmyInstalled ? "found" : "installed")}`,
33643
33699
  `${icons.check} Plugins: oh-my-opencode + omocs registered`,
33700
+ installedAuthPlugins.length > 0 ? `${icons.check} Auth plugins: ${source_default.bold(installedAuthPlugins.join(", "))}` : `${icons.cross} Auth plugins: none (skipped)`,
33644
33701
  setupLaunchboard ? `${icons.check} Launchboard: ${source_default.bold("ready")} (omocs lb start)` : `${icons.cross} Launchboard: skipped`,
33645
33702
  `${icons.check} Profile: ${source_default.bold(profile.name)}`,
33646
33703
  `${icons.check} Coder model: ${source_default.bold(profile.agents.coder)}`,
33647
33704
  `${icons.check} Task model: ${source_default.bold(profile.agents.task)}`,
33648
- `${icons.check} API providers: ${source_default.bold(selectedProviders.length.toString())} configured`,
33705
+ selectedProviders.length > 0 ? `${icons.check} API providers: ${source_default.bold(selectedProviders.length.toString())} configured` : `${icons.cross} API providers: none (using auth plugins)`,
33649
33706
  `${icons.check} MCP tools: ${source_default.bold(installMcps.length.toString())} selected`,
33650
33707
  "",
33651
33708
  `${source_default.gray("Config:")} ~/.omocs/config.json`,
@@ -33665,7 +33722,7 @@ function registerInitCommand(program2) {
33665
33722
  }
33666
33723
  });
33667
33724
  }
33668
- var PROVIDERS;
33725
+ var AUTH_PLUGINS, PROVIDERS;
33669
33726
  var init_init = __esm(() => {
33670
33727
  init_source();
33671
33728
  init_ora();
@@ -33678,6 +33735,10 @@ var init_init = __esm(() => {
33678
33735
  init_detect();
33679
33736
  init_lsp_registry();
33680
33737
  init_mcp_registry();
33738
+ AUTH_PLUGINS = [
33739
+ { name: "Antigravity (Google DeepMind)", value: "opencode-antigravity-auth", package: "opencode-antigravity-auth@1.4.6", description: "OAuth login for Google DeepMind models" },
33740
+ { name: "OpenAI Codex", value: "opencode-openai-codex-auth", package: "opencode-openai-codex-auth@latest", description: "OAuth login for OpenAI Codex CLI" }
33741
+ ];
33681
33742
  PROVIDERS = [
33682
33743
  { name: "Anthropic (Claude)", value: "anthropic", envKey: "ANTHROPIC_API_KEY" },
33683
33744
  { name: "OpenAI (GPT)", value: "openai", envKey: "OPENAI_API_KEY" },
@@ -123,11 +123,14 @@ omocs init
123
123
  - ✅ Registers both `oh-my-opencode` and `omocs` as plugins in `opencode.json`
124
124
  - ✅ Optionally sets up Launchboard (AI Kanban board)
125
125
  - ✅ Sets master password for API key encryption
126
- - ✅ Configures API providers and keys
126
+ - ✅ **Auth plugins** authenticate via OAuth login (Antigravity, OpenAI Codex) instead of pasting API keys
127
+ - ✅ Configures manual API providers and keys (for providers not covered by auth plugins)
127
128
  - ✅ Selects and applies a profile
128
129
  - ✅ Detects project stack and suggests LSP servers
129
130
  - ✅ Configures MCP tools
130
131
 
132
+ > **New in v1.6.0**: Step 6 now offers **auth plugin** login (recommended) before manual API keys. Auth plugins like `opencode-antigravity-auth` and `opencode-openai-codex-auth` let you authenticate via OAuth/CLI login instead of pasting raw API keys. Manual keys still work as a fallback.
133
+
131
134
  The wizard is interactive and guides you through each step. **This is the recommended setup method** — no need to manually edit `opencode.json` or install oh-my-opencode separately.
132
135
 
133
136
  > **For non-interactive / CI environments**, see the [Manual Setup](#manual-setup-advanced) section below.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "omo-suites",
3
- "version": "1.5.4",
3
+ "version": "1.6.0",
4
4
  "description": "OMO Suites — OpenCode plugin + CLI toolkit. Multi-model orchestration, profiles, agent routing, MCP/LSP management.",
5
5
  "type": "module",
6
6
  "main": "dist/plugin.js",