opencode-1password-auth 1.0.8 → 1.0.9
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/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +388 -0
- package/dist/index.js.map +1 -0
- package/package.json +26 -4
- package/index.ts +0 -453
- package/setup.ps1 +0 -636
- package/setup.sh +0 -646
package/setup.sh
DELETED
|
@@ -1,646 +0,0 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
|
|
3
|
-
# OpenCode 1Password Auth Plugin - Setup Script
|
|
4
|
-
# This script helps configure the environment variables needed for the plugin
|
|
5
|
-
|
|
6
|
-
set -e
|
|
7
|
-
|
|
8
|
-
# Colors for output
|
|
9
|
-
RED='\033[0;31m'
|
|
10
|
-
GREEN='\033[0;32m'
|
|
11
|
-
YELLOW='\033[1;33m'
|
|
12
|
-
CYAN='\033[0;36m'
|
|
13
|
-
GRAY='\033[0;90m'
|
|
14
|
-
NC='\033[0m' # No Color
|
|
15
|
-
|
|
16
|
-
# Functions
|
|
17
|
-
log_banner() {
|
|
18
|
-
echo ""
|
|
19
|
-
echo -e "${CYAN}========================================${NC}"
|
|
20
|
-
echo -e "${CYAN} OpenCode 1Password Auth Setup${NC}"
|
|
21
|
-
echo -e "${CYAN}========================================${NC}"
|
|
22
|
-
echo ""
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
log_success() {
|
|
26
|
-
echo -e "${GREEN}[OK]${NC} $1"
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
log_error() {
|
|
30
|
-
echo -e "${RED}[ERROR]${NC} $1"
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
log_info() {
|
|
34
|
-
echo -e "${YELLOW}[INFO]${NC} $1"
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
get_existing_values() {
|
|
38
|
-
if [[ "$OSTYPE" == "darwin"* ]] || [[ "$OSTYPE" == "linux-gnu"* ]]; then
|
|
39
|
-
OP_SERVICE_ACCOUNT_TOKEN="${OP_SERVICE_ACCOUNT_TOKEN:-}"
|
|
40
|
-
OP_CONFIG_ENV_ID="${OP_CONFIG_ENV_ID:-}"
|
|
41
|
-
|
|
42
|
-
# Check shell RC files
|
|
43
|
-
if [[ -f "$HOME/.zshrc" ]] && grep -q "OP_SERVICE_ACCOUNT_TOKEN" "$HOME/.zshrc" 2>/dev/null; then
|
|
44
|
-
source "$HOME/.zshrc" 2>/dev/null
|
|
45
|
-
fi
|
|
46
|
-
if [[ -f "$HOME/.bashrc" ]] && grep -q "OP_SERVICE_ACCOUNT_TOKEN" "$HOME/.bashrc" 2>/dev/null; then
|
|
47
|
-
source "$HOME/.bashrc" 2>/dev/null
|
|
48
|
-
fi
|
|
49
|
-
if [[ -f "$HOME/.bash_profile" ]] && grep -q "OP_SERVICE_ACCOUNT_TOKEN" "$HOME/.bash_profile" 2>/dev/null; then
|
|
50
|
-
source "$HOME/.bash_profile" 2>/dev/null
|
|
51
|
-
fi
|
|
52
|
-
fi
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
save_to_rc() {
|
|
56
|
-
local var_name="$1"
|
|
57
|
-
local var_value="$2"
|
|
58
|
-
local rc_file="$3"
|
|
59
|
-
|
|
60
|
-
# Remove existing entry if present
|
|
61
|
-
if [[ -f "$rc_file" ]]; then
|
|
62
|
-
sed -i.bak "/export ${var_name}=/d" "$rc_file"
|
|
63
|
-
fi
|
|
64
|
-
|
|
65
|
-
# Add new entry
|
|
66
|
-
echo "export ${var_name}='${var_value}'" >> "$rc_file"
|
|
67
|
-
log_success "Added ${var_name} to ${rc_file}"
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
remove_from_rc() {
|
|
71
|
-
local var_name="$1"
|
|
72
|
-
local rc_file="$2"
|
|
73
|
-
|
|
74
|
-
if [[ -f "$rc_file" ]]; then
|
|
75
|
-
sed -i.bak "/export ${var_name}=/d" "$rc_file"
|
|
76
|
-
log_success "Removed ${var_name} from ${rc_file}"
|
|
77
|
-
fi
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
test_connection() {
|
|
81
|
-
local token="$1"
|
|
82
|
-
|
|
83
|
-
# Create temporary test script
|
|
84
|
-
cat > /tmp/test_1p_$$.js << 'EOF'
|
|
85
|
-
const sdk = require('@1password/sdk');
|
|
86
|
-
|
|
87
|
-
async function test() {
|
|
88
|
-
const token = process.argv[1];
|
|
89
|
-
const client = await sdk.createClient({
|
|
90
|
-
auth: token,
|
|
91
|
-
integrationName: 'opencode-1password-setup-test',
|
|
92
|
-
integrationVersion: '1.0.0'
|
|
93
|
-
});
|
|
94
|
-
console.log('SUCCESS');
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
test().catch(err => {
|
|
98
|
-
console.error('FAILED:', err.message);
|
|
99
|
-
process.exit(1);
|
|
100
|
-
});
|
|
101
|
-
EOF
|
|
102
|
-
|
|
103
|
-
result=$(node /tmp/test_1p_$$.js "$token" 2>&1)
|
|
104
|
-
rm -f /tmp/test_1p_$$.js
|
|
105
|
-
|
|
106
|
-
if [[ "$result" == "SUCCESS" ]]; then
|
|
107
|
-
return 0
|
|
108
|
-
else
|
|
109
|
-
return 1
|
|
110
|
-
fi
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
get_audit_data() {
|
|
114
|
-
local token="$1"
|
|
115
|
-
local config_id="$2"
|
|
116
|
-
|
|
117
|
-
cat > /tmp/audit_1p_$$.js << 'EOF'
|
|
118
|
-
const sdk = require('@1password/sdk');
|
|
119
|
-
|
|
120
|
-
async function audit() {
|
|
121
|
-
const token = process.argv[1];
|
|
122
|
-
const configId = process.argv[2];
|
|
123
|
-
|
|
124
|
-
const client = await sdk.createClient({
|
|
125
|
-
auth: token,
|
|
126
|
-
integrationName: 'opencode-1password-setup-test',
|
|
127
|
-
integrationVersion: '1.0.0'
|
|
128
|
-
});
|
|
129
|
-
|
|
130
|
-
const { variables } = await client.environments.getVariables(configId);
|
|
131
|
-
|
|
132
|
-
const envIds = {};
|
|
133
|
-
for (const v of variables) {
|
|
134
|
-
if (v.name.endsWith('_ENV_ID') && v.value) {
|
|
135
|
-
envIds[v.name] = v.value;
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
console.log(JSON.stringify(envIds));
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
audit().catch(err => {
|
|
143
|
-
console.error('FAILED:', err.message);
|
|
144
|
-
process.exit(1);
|
|
145
|
-
});
|
|
146
|
-
EOF
|
|
147
|
-
|
|
148
|
-
result=$(node /tmp/audit_1p_$$.js "$token" "$config_id" 2>&1)
|
|
149
|
-
rm -f /tmp/audit_1p_$$.js
|
|
150
|
-
echo "$result"
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
show_audit_report() {
|
|
154
|
-
local token="$1"
|
|
155
|
-
local env_ids_json="$2"
|
|
156
|
-
|
|
157
|
-
echo ""
|
|
158
|
-
echo -e "${CYAN}========================================${NC}"
|
|
159
|
-
echo -e "${CYAN} Configuration Audit Report${NC}"
|
|
160
|
-
echo -e "${CYAN}========================================${NC}"
|
|
161
|
-
echo ""
|
|
162
|
-
|
|
163
|
-
echo -e "${WHITE}Bootstrap Environment References:${NC}"
|
|
164
|
-
echo "--------------------------------"
|
|
165
|
-
|
|
166
|
-
# Parse JSON manually (macOS doesn't have jq by default)
|
|
167
|
-
echo "$env_ids_json" | sed 's/[{}"]//g' | tr ',' '\n' | while IFS=':' read -r key value; do
|
|
168
|
-
if [[ -n "$key" && -n "$value" ]]; then
|
|
169
|
-
masked="${value:0:10}..."
|
|
170
|
-
echo -e " ${key} = ${masked}"
|
|
171
|
-
fi
|
|
172
|
-
done
|
|
173
|
-
|
|
174
|
-
echo ""
|
|
175
|
-
|
|
176
|
-
# For each referenced environment, show its contents
|
|
177
|
-
echo "$env_ids_json" | sed 's/[{}"]//g' | tr ',' '\n' | while IFS=':' read -r key value; do
|
|
178
|
-
if [[ -n "$key" && -n "$value" && "$key" != *"{"* ]]; then
|
|
179
|
-
env_id="$value"
|
|
180
|
-
env_name=$(echo "$key" | sed 's/OPENCODE_//' | sed 's/_ENV_ID//')
|
|
181
|
-
|
|
182
|
-
echo -e "${WHITE}${env_name} Environment:${NC}"
|
|
183
|
-
echo "--------------------------------"
|
|
184
|
-
|
|
185
|
-
# Read and display this environment
|
|
186
|
-
cat > /tmp/read_env_$$.js << 'EOFINNER'
|
|
187
|
-
const sdk = require('@1password/sdk');
|
|
188
|
-
|
|
189
|
-
async function readEnv() {
|
|
190
|
-
const token = process.argv[1];
|
|
191
|
-
const envId = process.argv[2];
|
|
192
|
-
|
|
193
|
-
const client = await sdk.createClient({
|
|
194
|
-
auth: token,
|
|
195
|
-
integrationName: 'opencode-1password-setup-test',
|
|
196
|
-
integrationVersion: '1.0.0'
|
|
197
|
-
});
|
|
198
|
-
|
|
199
|
-
const { variables } = await client.environments.getVariables(envId);
|
|
200
|
-
|
|
201
|
-
for (const v of variables) {
|
|
202
|
-
const masked = v.value ? v.value.substring(0, 8) + '••••••••' : '(empty)';
|
|
203
|
-
console.log(v.name + '=' + masked);
|
|
204
|
-
}
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
readEnv().catch(err => {
|
|
208
|
-
console.error('Error:', err.message);
|
|
209
|
-
});
|
|
210
|
-
EOFINNER
|
|
211
|
-
|
|
212
|
-
node /tmp/read_env_$$.js "$token" "$env_id" 2>&1 | while IFS='=' read -r name masked; do
|
|
213
|
-
if [[ -n "$name" ]]; then
|
|
214
|
-
echo -e " ${name}=${masked}"
|
|
215
|
-
fi
|
|
216
|
-
done
|
|
217
|
-
|
|
218
|
-
rm -f /tmp/read_env_$$.js
|
|
219
|
-
echo ""
|
|
220
|
-
fi
|
|
221
|
-
done
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
update_config_files() {
|
|
225
|
-
local token="$1"
|
|
226
|
-
local providers_env_id="$2"
|
|
227
|
-
local mcps_env_id="$3"
|
|
228
|
-
|
|
229
|
-
log_info "Reading secrets from 1Password..."
|
|
230
|
-
|
|
231
|
-
# Get provider and MCP secrets
|
|
232
|
-
cat > /tmp/update_config_$$.js << 'EOF'
|
|
233
|
-
const sdk = require('@1password/sdk');
|
|
234
|
-
|
|
235
|
-
async function getSecrets() {
|
|
236
|
-
const token = process.argv[1];
|
|
237
|
-
const providersEnvId = process.argv[2];
|
|
238
|
-
const mcpsEnvId = process.argv[3];
|
|
239
|
-
|
|
240
|
-
const client = await sdk.createClient({
|
|
241
|
-
auth: token,
|
|
242
|
-
integrationName: 'opencode-1password-setup',
|
|
243
|
-
integrationVersion: '1.0.0'
|
|
244
|
-
});
|
|
245
|
-
|
|
246
|
-
const providers = {};
|
|
247
|
-
const { variables: providerVars } = await client.environments.getVariables(providersEnvId);
|
|
248
|
-
for (const v of providerVars) {
|
|
249
|
-
if (v.value) providers[v.name] = v.value;
|
|
250
|
-
}
|
|
251
|
-
|
|
252
|
-
const mcps = {};
|
|
253
|
-
if (mcpsEnvId) {
|
|
254
|
-
const { variables: mcpVars } = await client.environments.getVariables(mcpsEnvId);
|
|
255
|
-
for (const v of mcpVars) {
|
|
256
|
-
if (v.value) mcps[v.name] = v.value;
|
|
257
|
-
}
|
|
258
|
-
}
|
|
259
|
-
|
|
260
|
-
console.log(JSON.stringify({ providers, mcps }));
|
|
261
|
-
}
|
|
262
|
-
|
|
263
|
-
getSecrets().catch(err => {
|
|
264
|
-
console.error('FAILED:', err.message);
|
|
265
|
-
process.exit(1);
|
|
266
|
-
});
|
|
267
|
-
EOF
|
|
268
|
-
|
|
269
|
-
result=$(node /tmp/update_config_$$.js "$token" "$providers_env_id" "$mcps_env_id" 2>&1)
|
|
270
|
-
rm -f /tmp/update_config_$$.js
|
|
271
|
-
|
|
272
|
-
if [[ "$result" == "FAILED:"* ]]; then
|
|
273
|
-
log_error "Failed to read secrets from 1Password: $result"
|
|
274
|
-
return 1
|
|
275
|
-
fi
|
|
276
|
-
|
|
277
|
-
# Get home directory
|
|
278
|
-
home="${HOME:-}"
|
|
279
|
-
if [[ -z "$home" ]]; then
|
|
280
|
-
home=$(eval echo ~)
|
|
281
|
-
fi
|
|
282
|
-
|
|
283
|
-
# Update auth.json
|
|
284
|
-
auth_json_path="$home/.local/share/opencode/auth.json"
|
|
285
|
-
log_info "Updating auth.json..."
|
|
286
|
-
|
|
287
|
-
if [[ -f "$auth_json_path" ]]; then
|
|
288
|
-
# Read auth.json and update
|
|
289
|
-
auth_content=$(cat "$auth_json_path")
|
|
290
|
-
# Use node to parse and update JSON
|
|
291
|
-
cat > /tmp/update_auth_$$.js << 'EOFJ'
|
|
292
|
-
const fs = require('fs');
|
|
293
|
-
const authPath = process.argv[1];
|
|
294
|
-
const auth = JSON.parse(fs.readFileSync(authPath, 'utf8'));
|
|
295
|
-
|
|
296
|
-
let modified = false;
|
|
297
|
-
for (const [providerId, authConfig] of Object.entries(auth)) {
|
|
298
|
-
if (authConfig.key && !authConfig.key.startsWith('{env:')) {
|
|
299
|
-
authConfig.key = '{env:' + providerId + '}';
|
|
300
|
-
modified = true;
|
|
301
|
-
console.log('Updated ' + providerId + ' -> {env:' + providerId + '}');
|
|
302
|
-
}
|
|
303
|
-
}
|
|
304
|
-
|
|
305
|
-
if (modified) {
|
|
306
|
-
fs.writeFileSync(authPath, JSON.stringify(auth, null, 2));
|
|
307
|
-
console.log('auth.json updated');
|
|
308
|
-
} else {
|
|
309
|
-
console.log('auth.json already uses environment variable references');
|
|
310
|
-
}
|
|
311
|
-
EOFJ
|
|
312
|
-
|
|
313
|
-
update_result=$(node /tmp/update_auth_$$.js "$auth_json_path" 2>&1)
|
|
314
|
-
rm -f /tmp/update_auth_$$.js
|
|
315
|
-
echo "$update_result" | while read line; do
|
|
316
|
-
if [[ "$line" == Updated* ]] || [[ "$line" == *updated* ]]; then
|
|
317
|
-
log_success "$(echo "$line" | sed 's/Updated/Updated/')"
|
|
318
|
-
else
|
|
319
|
-
log_info "$line"
|
|
320
|
-
fi
|
|
321
|
-
done
|
|
322
|
-
else
|
|
323
|
-
log_info "auth.json not found at $auth_json_path"
|
|
324
|
-
fi
|
|
325
|
-
|
|
326
|
-
# Update opencode.json MCP config
|
|
327
|
-
config_json_path="$home/.config/opencode/opencode.json"
|
|
328
|
-
log_info "Updating opencode.json MCP config..."
|
|
329
|
-
|
|
330
|
-
if [[ -f "$config_json_path" ]]; then
|
|
331
|
-
cat > /tmp/update_mcp_$$.js << 'EOFMCP'
|
|
332
|
-
const fs = require('fs');
|
|
333
|
-
const configPath = process.argv[1];
|
|
334
|
-
const config = JSON.parse(fs.readFileSync(configPath, 'utf8'));
|
|
335
|
-
|
|
336
|
-
let modified = false;
|
|
337
|
-
if (config.mcp) {
|
|
338
|
-
for (const [serverName, serverConfig] of Object.entries(config.mcp)) {
|
|
339
|
-
if (serverConfig && serverConfig.environment) {
|
|
340
|
-
for (const [key, value] of Object.entries(serverConfig.environment)) {
|
|
341
|
-
if (value && !value.startsWith('{env:') && !value.startsWith('$')) {
|
|
342
|
-
serverConfig.environment[key] = '{env:' + key + '}';
|
|
343
|
-
modified = true;
|
|
344
|
-
console.log('Updated ' + serverName + '.' + key + ' -> {env:' + key + '}');
|
|
345
|
-
}
|
|
346
|
-
}
|
|
347
|
-
}
|
|
348
|
-
}
|
|
349
|
-
}
|
|
350
|
-
|
|
351
|
-
if (modified) {
|
|
352
|
-
fs.writeFileSync(configPath, JSON.stringify(config, null, 2));
|
|
353
|
-
console.log('opencode.json updated');
|
|
354
|
-
} else {
|
|
355
|
-
console.log('opencode.json already uses environment variable references');
|
|
356
|
-
}
|
|
357
|
-
EOFMCP
|
|
358
|
-
|
|
359
|
-
update_result=$(node /tmp/update_mcp_$$.js "$config_json_path" 2>&1)
|
|
360
|
-
rm -f /tmp/update_mcp_$$.js
|
|
361
|
-
echo "$update_result" | while read line; do
|
|
362
|
-
if [[ "$line" == Updated* ]] || [[ "$line" == *updated* ]]; then
|
|
363
|
-
log_success "$(echo "$line" | sed 's/Updated/Updated/')"
|
|
364
|
-
else
|
|
365
|
-
log_info "$line"
|
|
366
|
-
fi
|
|
367
|
-
done
|
|
368
|
-
else
|
|
369
|
-
log_info "opencode.json not found at $config_json_path"
|
|
370
|
-
fi
|
|
371
|
-
|
|
372
|
-
log_success "Config update complete!"
|
|
373
|
-
}
|
|
374
|
-
|
|
375
|
-
# Parse arguments
|
|
376
|
-
UNINSTALL=false
|
|
377
|
-
AUDIT=false
|
|
378
|
-
UPDATE_CONFIG=false
|
|
379
|
-
|
|
380
|
-
while [[ $# -gt 0 ]]; do
|
|
381
|
-
case $1 in
|
|
382
|
-
-u|--uninstall)
|
|
383
|
-
UNINSTALL=true
|
|
384
|
-
shift
|
|
385
|
-
;;
|
|
386
|
-
-a|--audit)
|
|
387
|
-
AUDIT=true
|
|
388
|
-
shift
|
|
389
|
-
;;
|
|
390
|
-
-c|--update-config)
|
|
391
|
-
UPDATE_CONFIG=true
|
|
392
|
-
shift
|
|
393
|
-
;;
|
|
394
|
-
*)
|
|
395
|
-
echo "Usage: $0 [--uninstall|--audit|--update-config]"
|
|
396
|
-
exit 1
|
|
397
|
-
;;
|
|
398
|
-
esac
|
|
399
|
-
done
|
|
400
|
-
|
|
401
|
-
# Main script execution
|
|
402
|
-
log_banner
|
|
403
|
-
|
|
404
|
-
if [[ "$UNINSTALL" == true ]]; then
|
|
405
|
-
echo -e "${YELLOW}Uninstall Mode${NC}"
|
|
406
|
-
echo -e "${YELLOW}------------${NC}"
|
|
407
|
-
echo ""
|
|
408
|
-
|
|
409
|
-
get_existing_values
|
|
410
|
-
|
|
411
|
-
if [[ -z "$OP_SERVICE_ACCOUNT_TOKEN" && -z "$OP_CONFIG_ENV_ID" ]]; then
|
|
412
|
-
log_info "No environment variables found. Nothing to uninstall."
|
|
413
|
-
exit 0
|
|
414
|
-
fi
|
|
415
|
-
|
|
416
|
-
echo "Found the following environment variables:"
|
|
417
|
-
if [[ -n "$OP_SERVICE_ACCOUNT_TOKEN" ]]; then
|
|
418
|
-
echo " OP_SERVICE_ACCOUNT_TOKEN = ${OP_SERVICE_ACCOUNT_TOKEN:0:8}..."
|
|
419
|
-
fi
|
|
420
|
-
if [[ -n "$OP_CONFIG_ENV_ID" ]]; then
|
|
421
|
-
echo " OP_CONFIG_ENV_ID = ${OP_CONFIG_ENV_ID:0:8}..."
|
|
422
|
-
fi
|
|
423
|
-
echo ""
|
|
424
|
-
|
|
425
|
-
read -p "Remove these environment variables? (y/N) " -n 1 -r
|
|
426
|
-
echo ""
|
|
427
|
-
|
|
428
|
-
if [[ $REPLY =~ ^[Yy]$ ]]; then
|
|
429
|
-
# Remove from all RC files
|
|
430
|
-
for rc in "$HOME/.zshrc" "$HOME/.bashrc" "$HOME/.bash_profile"; do
|
|
431
|
-
if [[ -f "$rc" ]]; then
|
|
432
|
-
remove_from_rc "OP_SERVICE_ACCOUNT_TOKEN" "$rc"
|
|
433
|
-
remove_from_rc "OP_CONFIG_ENV_ID" "$rc"
|
|
434
|
-
fi
|
|
435
|
-
done
|
|
436
|
-
|
|
437
|
-
# Unset in current session
|
|
438
|
-
unset OP_SERVICE_ACCOUNT_TOKEN OP_CONFIG_ENV_ID
|
|
439
|
-
|
|
440
|
-
log_success "Removed environment variables."
|
|
441
|
-
log_info "Please restart any OpenCode sessions for changes to take effect."
|
|
442
|
-
else
|
|
443
|
-
log_info "Uninstall cancelled."
|
|
444
|
-
fi
|
|
445
|
-
|
|
446
|
-
exit 0
|
|
447
|
-
fi
|
|
448
|
-
|
|
449
|
-
if [[ "$AUDIT" == true ]]; then
|
|
450
|
-
echo -e "${YELLOW}Audit Mode${NC}"
|
|
451
|
-
echo -e "${YELLOW}----------${NC}"
|
|
452
|
-
echo ""
|
|
453
|
-
|
|
454
|
-
get_existing_values
|
|
455
|
-
|
|
456
|
-
if [[ -z "$OP_SERVICE_ACCOUNT_TOKEN" || -z "$OP_CONFIG_ENV_ID" ]]; then
|
|
457
|
-
log_error "Environment variables not set. Run setup first."
|
|
458
|
-
exit 1
|
|
459
|
-
fi
|
|
460
|
-
|
|
461
|
-
log_info "Testing 1Password connection..."
|
|
462
|
-
|
|
463
|
-
if test_connection "$OP_SERVICE_ACCOUNT_TOKEN"; then
|
|
464
|
-
log_success "1Password connection successful!"
|
|
465
|
-
else
|
|
466
|
-
log_error "Failed to connect to 1Password. Check your service account token."
|
|
467
|
-
exit 1
|
|
468
|
-
fi
|
|
469
|
-
|
|
470
|
-
log_info "Reading configuration..."
|
|
471
|
-
|
|
472
|
-
env_ids_json=$(get_audit_data "$OP_SERVICE_ACCOUNT_TOKEN" "$OP_CONFIG_ENV_ID")
|
|
473
|
-
|
|
474
|
-
if [[ -n "$env_ids_json" && "$env_ids_json" != "FAILED:"* ]]; then
|
|
475
|
-
show_audit_report "$OP_SERVICE_ACCOUNT_TOKEN" "$env_ids_json"
|
|
476
|
-
else
|
|
477
|
-
log_error "Failed to read bootstrap environment."
|
|
478
|
-
exit 1
|
|
479
|
-
fi
|
|
480
|
-
|
|
481
|
-
exit 0
|
|
482
|
-
fi
|
|
483
|
-
|
|
484
|
-
if [[ "$UPDATE_CONFIG" == true ]]; then
|
|
485
|
-
echo -e "${YELLOW}Update Config Mode${NC}"
|
|
486
|
-
echo -e "${YELLOW}------------------${NC}"
|
|
487
|
-
echo ""
|
|
488
|
-
|
|
489
|
-
get_existing_values
|
|
490
|
-
|
|
491
|
-
if [[ -z "$OP_SERVICE_ACCOUNT_TOKEN" || -z "$OP_CONFIG_ENV_ID" ]]; then
|
|
492
|
-
log_error "Environment variables not set. Run setup first."
|
|
493
|
-
exit 1
|
|
494
|
-
fi
|
|
495
|
-
|
|
496
|
-
log_info "Testing 1Password connection..."
|
|
497
|
-
|
|
498
|
-
if test_connection "$OP_SERVICE_ACCOUNT_TOKEN"; then
|
|
499
|
-
log_success "1Password connection successful!"
|
|
500
|
-
else
|
|
501
|
-
log_error "Failed to connect to 1Password. Check your service account token."
|
|
502
|
-
exit 1
|
|
503
|
-
fi
|
|
504
|
-
|
|
505
|
-
log_info "Reading configuration from 1Password..."
|
|
506
|
-
|
|
507
|
-
env_ids_json=$(get_audit_data "$OP_SERVICE_ACCOUNT_TOKEN" "$OP_CONFIG_ENV_ID")
|
|
508
|
-
|
|
509
|
-
if [[ -n "$env_ids_json" && "$env_ids_json" != "FAILED:"* ]]; then
|
|
510
|
-
# Parse JSON to extract env IDs
|
|
511
|
-
providers_env_id=$(echo "$env_ids_json" | sed -n 's/.*"OPENCODE_PROVIDERS_ENV_ID":"\([^"]*\)".*/\1/p')
|
|
512
|
-
mcps_env_id=$(echo "$env_ids_json" | sed -n 's/.*"OPENCODE_MCPS_ENV_ID":"\([^"]*\)".*/\1/p')
|
|
513
|
-
|
|
514
|
-
if [[ -n "$providers_env_id" ]]; then
|
|
515
|
-
log_info "Updating config files to use environment variables..."
|
|
516
|
-
update_config_files "$OP_SERVICE_ACCOUNT_TOKEN" "$providers_env_id" "$mcps_env_id"
|
|
517
|
-
else
|
|
518
|
-
log_error "Could not find OPENCODE_PROVIDERS_ENV_ID in bootstrap environment"
|
|
519
|
-
exit 1
|
|
520
|
-
fi
|
|
521
|
-
else
|
|
522
|
-
log_error "Failed to read bootstrap environment."
|
|
523
|
-
exit 1
|
|
524
|
-
fi
|
|
525
|
-
|
|
526
|
-
exit 0
|
|
527
|
-
fi
|
|
528
|
-
|
|
529
|
-
# Setup mode (default)
|
|
530
|
-
echo -e "${YELLOW}Setup Mode${NC}"
|
|
531
|
-
echo -e "${YELLOW}----------${NC}"
|
|
532
|
-
echo ""
|
|
533
|
-
|
|
534
|
-
get_existing_values
|
|
535
|
-
|
|
536
|
-
IS_UPDATE=false
|
|
537
|
-
if [[ -n "$OP_SERVICE_ACCOUNT_TOKEN" && -n "$OP_CONFIG_ENV_ID" ]]; then
|
|
538
|
-
IS_UPDATE=true
|
|
539
|
-
echo "Found existing configuration:"
|
|
540
|
-
echo " OP_SERVICE_ACCOUNT_TOKEN = ${OP_SERVICE_ACCOUNT_TOKEN:0:8}..."
|
|
541
|
-
echo " OP_CONFIG_ENV_ID = ${OP_CONFIG_ENV_ID:0:8}..."
|
|
542
|
-
echo ""
|
|
543
|
-
|
|
544
|
-
read -p "Update existing values? (y/N) " -n 1 -r
|
|
545
|
-
echo ""
|
|
546
|
-
|
|
547
|
-
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
|
|
548
|
-
log_info "Setup cancelled."
|
|
549
|
-
exit 0
|
|
550
|
-
fi
|
|
551
|
-
fi
|
|
552
|
-
|
|
553
|
-
# Prompt for new values
|
|
554
|
-
echo "Enter your 1Password credentials:"
|
|
555
|
-
echo ""
|
|
556
|
-
|
|
557
|
-
if [[ "$IS_UPDATE" == false ]]; then
|
|
558
|
-
read -s -p " OP_SERVICE_ACCOUNT_TOKEN: " OP_SERVICE_ACCOUNT_TOKEN
|
|
559
|
-
else
|
|
560
|
-
read -s -p " OP_SERVICE_ACCOUNT_TOKEN (leave blank to keep): " NEW_TOKEN
|
|
561
|
-
if [[ -n "$NEW_TOKEN" ]]; then
|
|
562
|
-
OP_SERVICE_ACCOUNT_TOKEN="$NEW_TOKEN"
|
|
563
|
-
fi
|
|
564
|
-
fi
|
|
565
|
-
echo ""
|
|
566
|
-
|
|
567
|
-
if [[ "$IS_UPDATE" == false ]]; then
|
|
568
|
-
read -p " OP_CONFIG_ENV_ID: " OP_CONFIG_ENV_ID
|
|
569
|
-
else
|
|
570
|
-
read -p " OP_CONFIG_ENV_ID (leave blank to keep): " NEW_CONFIG_ID
|
|
571
|
-
if [[ -n "$NEW_CONFIG_ID" ]]; then
|
|
572
|
-
OP_CONFIG_ENV_ID="$NEW_CONFIG_ID"
|
|
573
|
-
fi
|
|
574
|
-
fi
|
|
575
|
-
|
|
576
|
-
if [[ -z "$OP_SERVICE_ACCOUNT_TOKEN" || -z "$OP_CONFIG_ENV_ID" ]]; then
|
|
577
|
-
log_error "Both token and config ID are required."
|
|
578
|
-
exit 1
|
|
579
|
-
fi
|
|
580
|
-
|
|
581
|
-
echo ""
|
|
582
|
-
echo "Summary:"
|
|
583
|
-
echo " OP_SERVICE_ACCOUNT_TOKEN = ${OP_SERVICE_ACCOUNT_TOKEN:0:8}..."
|
|
584
|
-
echo " OP_CONFIG_ENV_ID = ${OP_CONFIG_ENV_ID:0:8}..."
|
|
585
|
-
echo ""
|
|
586
|
-
|
|
587
|
-
# Detect shell and RC file
|
|
588
|
-
if [[ -n "$ZSH_VERSION" ]]; then
|
|
589
|
-
SHELL_RC="$HOME/.zshrc"
|
|
590
|
-
elif [[ -n "$BASH_VERSION" ]]; then
|
|
591
|
-
SHELL_RC="$HOME/.bashrc"
|
|
592
|
-
else
|
|
593
|
-
SHELL_RC="$HOME/.profile"
|
|
594
|
-
fi
|
|
595
|
-
|
|
596
|
-
echo "Where should these be saved?"
|
|
597
|
-
echo " [1] Current shell only (no file modification)"
|
|
598
|
-
echo " [2] Shell RC file (~/.zshrc or ~/.bashrc)"
|
|
599
|
-
read -p "Choice [1]: " scope_choice
|
|
600
|
-
|
|
601
|
-
if [[ "$scope_choice" == "2" ]]; then
|
|
602
|
-
log_info "Saving to ${SHELL_RC}..."
|
|
603
|
-
|
|
604
|
-
save_to_rc "OP_SERVICE_ACCOUNT_TOKEN" "$OP_SERVICE_ACCOUNT_TOKEN" "$SHELL_RC"
|
|
605
|
-
save_to_rc "OP_CONFIG_ENV_ID" "$OP_CONFIG_ENV_ID" "$SHELL_RC"
|
|
606
|
-
|
|
607
|
-
# Also export to current session
|
|
608
|
-
export OP_SERVICE_ACCOUNT_TOKEN
|
|
609
|
-
export OP_CONFIG_ENV_ID
|
|
610
|
-
|
|
611
|
-
log_info "Added to ${SHELL_RC}. Restart your shell or run:"
|
|
612
|
-
echo " source ${SHELL_RC}"
|
|
613
|
-
else
|
|
614
|
-
export OP_SERVICE_ACCOUNT_TOKEN
|
|
615
|
-
export OP_CONFIG_ENV_ID
|
|
616
|
-
log_info "Exported to current shell only."
|
|
617
|
-
fi
|
|
618
|
-
|
|
619
|
-
echo ""
|
|
620
|
-
log_info "Testing 1Password connection..."
|
|
621
|
-
|
|
622
|
-
if test_connection "$OP_SERVICE_ACCOUNT_TOKEN"; then
|
|
623
|
-
log_success "1Password connection successful!"
|
|
624
|
-
else
|
|
625
|
-
log_error "Failed to connect to 1Password. Check your service account token."
|
|
626
|
-
log_info "Environment variables were saved. You may need to restart your terminal."
|
|
627
|
-
exit 1
|
|
628
|
-
fi
|
|
629
|
-
|
|
630
|
-
log_info "Reading configuration..."
|
|
631
|
-
|
|
632
|
-
env_ids_json=$(get_audit_data "$OP_SERVICE_ACCOUNT_TOKEN" "$OP_CONFIG_ENV_ID")
|
|
633
|
-
|
|
634
|
-
if [[ -n "$env_ids_json" && "$env_ids_json" != "FAILED:"* ]]; then
|
|
635
|
-
show_audit_report "$OP_SERVICE_ACCOUNT_TOKEN" "$env_ids_json"
|
|
636
|
-
fi
|
|
637
|
-
|
|
638
|
-
echo ""
|
|
639
|
-
log_success "Setup complete!"
|
|
640
|
-
log_info "Restart OpenCode to activate the plugin."
|
|
641
|
-
echo ""
|
|
642
|
-
echo "Usage:"
|
|
643
|
-
echo " ./setup.sh --audit Show current configuration"
|
|
644
|
-
echo " ./setup.sh --update-config Update config files to use {env:VAR} references"
|
|
645
|
-
echo " ./setup.sh --uninstall Remove environment variables"
|
|
646
|
-
echo ""
|