opencode-gemini-cli-oauth 1.0.0 → 1.1.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/README.md CHANGED
@@ -28,23 +28,26 @@ This plugin integrates Gemini CLI's OAuth authentication with OpenCode, allowing
28
28
  ### Install Plugin
29
29
 
30
30
  ```bash
31
- # Clone repository
32
- git clone https://github.com/yourusername/opencode-gemini-cli-oauth.git
33
- cd opencode-gemini-cli-oauth
31
+ # Install globally from NPM
32
+ npm install -g opencode-gemini-cli-oauth
33
+ ```
34
34
 
35
- # Install dependencies
36
- npm install
35
+ ### ⚔ Easy Setup (Recommended)
37
36
 
38
- # Build
39
- npm run build
37
+ Run the setup wizard to automatically configure OpenCode with Gemini models:
40
38
 
41
- # Install globally
42
- npm link
39
+ ```bash
40
+ opencode-gemini-setup
43
41
  ```
44
42
 
45
- ### Configure OpenCode
43
+ This will:
44
+ 1. Check your Gemini CLI authentication
45
+ 2. Login if needed
46
+ 3. Configure `opencode.json` with the latest models (Gemini 2.0, 1.5, etc.)
47
+
48
+ ### Manual Configuration
46
49
 
47
- Add to `~/.config/opencode/opencode.json`:
50
+ If you prefer to configure manually, add to `~/.config/opencode/opencode.json`:
48
51
 
49
52
  ```json
50
53
  {
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=setup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/cli/setup.ts"],"names":[],"mappings":""}
@@ -0,0 +1,132 @@
1
+ #!/usr/bin/env node
2
+ import { spawn } from 'child_process';
3
+ import fs from 'fs/promises';
4
+ import path from 'path';
5
+ import os from 'os';
6
+ import readline from 'readline';
7
+ const GEMINI_DIR = path.join(os.homedir(), '.gemini');
8
+ const OPENCODE_CONFIG_DIR = path.join(os.homedir(), '.config', 'opencode');
9
+ const OPENCODE_CONFIG_PATH = path.join(OPENCODE_CONFIG_DIR, 'opencode.json');
10
+ const OAUTH_CREDS_PATH = path.join(GEMINI_DIR, 'oauth_creds.json');
11
+ const MODELS_CONFIG = {
12
+ "gemini-cli-oauth": {
13
+ "npm": "opencode-gemini-cli-oauth",
14
+ "models": {
15
+ "gemini-2.0-flash-exp": {
16
+ "name": "Gemini 2.0 Flash (Google Account)",
17
+ "limit": { "context": 1048576, "output": 8192 },
18
+ "modalities": { "input": ["text", "image", "audio", "video"], "output": ["text"] }
19
+ },
20
+ "gemini-1.5-pro-latest": {
21
+ "name": "Gemini 1.5 Pro (Google Account)",
22
+ "limit": { "context": 2097152, "output": 8192 },
23
+ "modalities": { "input": ["text", "image", "audio", "video", "pdf"], "output": ["text"] }
24
+ },
25
+ "gemini-1.5-flash-latest": {
26
+ "name": "Gemini 1.5 Flash (Google Account)",
27
+ "limit": { "context": 1048576, "output": 8192 },
28
+ "modalities": { "input": ["text", "image", "audio", "video", "pdf"], "output": ["text"] }
29
+ },
30
+ "gemini-exp-1206": {
31
+ "name": "Gemini Experimental 1206 (Google Account)",
32
+ "limit": { "context": 2097152, "output": 8192 },
33
+ "modalities": { "input": ["text", "image"], "output": ["text"] }
34
+ }
35
+ }
36
+ }
37
+ };
38
+ const rl = readline.createInterface({
39
+ input: process.stdin,
40
+ output: process.stdout
41
+ });
42
+ const question = (query) => {
43
+ return new Promise((resolve) => rl.question(query, resolve));
44
+ };
45
+ async function checkGeminiCliInstalled() {
46
+ return new Promise((resolve) => {
47
+ const check = spawn('gemini', ['--version']);
48
+ check.on('error', () => resolve(false));
49
+ check.on('close', (code) => resolve(code === 0));
50
+ });
51
+ }
52
+ async function runGeminiLogin() {
53
+ console.log('\nšŸ” Initiating Gemini CLI Login...');
54
+ console.log('This will open your browser to authenticate with Google.');
55
+ return new Promise((resolve, reject) => {
56
+ const login = spawn('gemini', ['auth', 'login'], { stdio: 'inherit' });
57
+ login.on('close', (code) => {
58
+ if (code === 0)
59
+ resolve();
60
+ else
61
+ reject(new Error('Login failed'));
62
+ });
63
+ });
64
+ }
65
+ async function updateOpencodeConfig() {
66
+ try {
67
+ await fs.mkdir(OPENCODE_CONFIG_DIR, { recursive: true });
68
+ let config = {};
69
+ try {
70
+ const content = await fs.readFile(OPENCODE_CONFIG_PATH, 'utf-8');
71
+ config = JSON.parse(content);
72
+ }
73
+ catch (e) {
74
+ console.log('Creating new OpenCode configuration file...');
75
+ }
76
+ // Ensure provider section exists
77
+ if (!config.provider)
78
+ config.provider = {};
79
+ // Merge our models
80
+ console.log('\nšŸ“¦ Configuring models in opencode.json...');
81
+ config.provider['gemini-cli-oauth'] = MODELS_CONFIG['gemini-cli-oauth'];
82
+ // Ensure plugin is listed
83
+ if (!config.plugin)
84
+ config.plugin = [];
85
+ if (!config.plugin.includes('opencode-gemini-cli-oauth')) {
86
+ config.plugin.push('opencode-gemini-cli-oauth');
87
+ }
88
+ await fs.writeFile(OPENCODE_CONFIG_PATH, JSON.stringify(config, null, 2));
89
+ console.log('āœ… Configuration updated successfully!');
90
+ console.log(` Location: ${OPENCODE_CONFIG_PATH}`);
91
+ }
92
+ catch (error) {
93
+ console.error('āŒ Failed to update configuration:', error);
94
+ }
95
+ }
96
+ async function main() {
97
+ console.log('šŸš€ OpenCode Gemini CLI OAuth Setup');
98
+ console.log('==================================');
99
+ // 1. Check Gemini CLI
100
+ const hasGemini = await checkGeminiCliInstalled();
101
+ if (!hasGemini) {
102
+ console.error('āŒ Gemini CLI is not installed.');
103
+ console.log('Please install it first: npm install -g @google/gemini-cli');
104
+ process.exit(1);
105
+ }
106
+ // 2. Check Auth
107
+ try {
108
+ await fs.access(OAUTH_CREDS_PATH);
109
+ console.log('āœ… OAuth credentials found.');
110
+ const answer = await question('Do you want to re-authenticate? (y/N) ');
111
+ if (answer.toLowerCase() === 'y') {
112
+ await runGeminiLogin();
113
+ }
114
+ }
115
+ catch {
116
+ console.log('āš ļø No OAuth credentials found.');
117
+ const answer = await question('Do you want to login now? (Y/n) ');
118
+ if (answer.toLowerCase() !== 'n') {
119
+ await runGeminiLogin();
120
+ }
121
+ }
122
+ // 3. Update Config
123
+ const updateConfig = await question('Do you want to automatically configure OpenCode models? (Y/n) ');
124
+ if (updateConfig.toLowerCase() !== 'n') {
125
+ await updateOpencodeConfig();
126
+ }
127
+ console.log('\n✨ Setup Complete!');
128
+ console.log('You can now use "Gemini (Google Account)" models in OpenCode.');
129
+ rl.close();
130
+ }
131
+ main().catch(console.error);
132
+ //# sourceMappingURL=setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/cli/setup.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "opencode-gemini-cli-oauth",
3
- "version": "1.0.0",
3
+ "version": "1.1.0",
4
4
  "description": "OpenCode plugin for Gemini CLI OAuth authentication - use Google account quota without API keys",
5
5
  "type": "module",
6
6
  "main": "dist/index-minimal.js",
@@ -19,6 +19,9 @@
19
19
  "ai",
20
20
  "plugin"
21
21
  ],
22
+ "bin": {
23
+ "opencode-gemini-setup": "./dist/cli/setup.js"
24
+ },
22
25
  "files": [
23
26
  "dist",
24
27
  "LICENSE",