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 +10 -0
- package/dist/cli/omocs.js +97 -36
- package/docs/installation.md +4 -1
- package/package.json +1 -1
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
|
|
33536
|
+
const installedAuthPlugins = [];
|
|
33537
|
+
const { selectedAuthPlugins } = await esm_default12.prompt([{
|
|
33537
33538
|
type: "checkbox",
|
|
33538
|
-
name: "
|
|
33539
|
-
message: "
|
|
33540
|
-
choices:
|
|
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
|
-
|
|
33543
|
-
|
|
33544
|
-
|
|
33545
|
-
|
|
33546
|
-
|
|
33547
|
-
|
|
33548
|
-
|
|
33549
|
-
|
|
33550
|
-
|
|
33551
|
-
|
|
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
|
-
|
|
33559
|
-
const
|
|
33560
|
-
|
|
33561
|
-
|
|
33562
|
-
|
|
33563
|
-
|
|
33564
|
-
|
|
33565
|
-
|
|
33566
|
-
|
|
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" },
|
package/docs/installation.md
CHANGED
|
@@ -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
|
-
- ✅
|
|
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