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/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 ""