Add portable OpenCode config bundle for Linux and Windows
This commit is contained in:
commit
40c4d63b80
7 files changed
+450
No files matched your search
@@ -0,0 +1,9 @@
|
||||
# Copy to .env and fill locally. Never commit your real keys.
|
||||
|
||||
OPENROUTER_API_KEY=
|
||||
OPENCODE_ZEN_API_KEY=
|
||||
V0_API_KEY=
|
||||
GITHUB_TOKEN=
|
||||
ANTHROPIC_API_KEY=
|
||||
OPENAI_API_KEY=
|
||||
GOOGLE_API_KEY=
|
||||
@@ -0,0 +1,3 @@
|
||||
.env
|
||||
*.env
|
||||
.DS_Store
|
||||
@@ -0,0 +1,25 @@
|
||||
# OpenCode Portable Config
|
||||
|
||||
This folder is safe to commit to GitHub. It contains config and installers, but no API keys.
|
||||
|
||||
## What is included
|
||||
|
||||
- `templates/opencode.json`
|
||||
- `templates/oh-my-opencode.json`
|
||||
- `scripts/install-linux.sh`
|
||||
- `scripts/install-windows.ps1`
|
||||
- `.env.example`
|
||||
|
||||
## How to use
|
||||
|
||||
1. Push this folder to your GitHub repo.
|
||||
2. On a target machine, clone or download the repo.
|
||||
3. Run the platform installer from `scripts/`.
|
||||
4. Copy `.env.example` to `.env` and fill keys locally.
|
||||
5. Run `opencode auth login <provider>` or `/connect` in OpenCode.
|
||||
|
||||
## Important
|
||||
|
||||
- Do not commit `.env`.
|
||||
- Do not commit `~/.local/share/opencode/auth.json`.
|
||||
- Credentials should always be entered locally on each machine.
|
||||
Executable
+25
@@ -0,0 +1,25 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
||||
TEMPLATES_DIR="$ROOT_DIR/templates"
|
||||
TARGET_DIR="${XDG_CONFIG_HOME:-$HOME/.config}/opencode"
|
||||
|
||||
echo "Installing OpenCode config to: $TARGET_DIR"
|
||||
mkdir -p "$TARGET_DIR"
|
||||
cp "$TEMPLATES_DIR/opencode.json" "$TARGET_DIR/opencode.json"
|
||||
cp "$TEMPLATES_DIR/oh-my-opencode.json" "$TARGET_DIR/oh-my-opencode.json"
|
||||
|
||||
echo "Installing optional components (Node/Bun packages)..."
|
||||
if command -v bun >/dev/null 2>&1; then
|
||||
(cd "$TARGET_DIR" && bun add @opencode-ai/plugin @code-yeongyu/comment-checker)
|
||||
elif command -v npm >/dev/null 2>&1; then
|
||||
(cd "$TARGET_DIR" && npm install @opencode-ai/plugin @code-yeongyu/comment-checker)
|
||||
else
|
||||
echo "Skipping package install: bun/npm not found"
|
||||
fi
|
||||
|
||||
echo "Done."
|
||||
echo "Next steps:"
|
||||
echo "1) Add keys locally with: opencode auth login <provider>"
|
||||
echo "2) Verify with: bunx oh-my-opencode doctor --verbose"
|
||||
@@ -0,0 +1,28 @@
|
||||
$ErrorActionPreference = "Stop"
|
||||
|
||||
$RootDir = Split-Path -Path (Split-Path -Parent $MyInvocation.MyCommand.Path) -Parent
|
||||
$TemplatesDir = Join-Path $RootDir "templates"
|
||||
$TargetDir = Join-Path $env:USERPROFILE ".config\opencode"
|
||||
|
||||
Write-Host "Installing OpenCode config to: $TargetDir"
|
||||
New-Item -ItemType Directory -Path $TargetDir -Force | Out-Null
|
||||
Copy-Item (Join-Path $TemplatesDir "opencode.json") (Join-Path $TargetDir "opencode.json") -Force
|
||||
Copy-Item (Join-Path $TemplatesDir "oh-my-opencode.json") (Join-Path $TargetDir "oh-my-opencode.json") -Force
|
||||
|
||||
Write-Host "Installing optional components (Node/Bun packages)..."
|
||||
if (Get-Command bun -ErrorAction SilentlyContinue) {
|
||||
Push-Location $TargetDir
|
||||
bun add @opencode-ai/plugin @code-yeongyu/comment-checker
|
||||
Pop-Location
|
||||
} elseif (Get-Command npm -ErrorAction SilentlyContinue) {
|
||||
Push-Location $TargetDir
|
||||
npm install @opencode-ai/plugin @code-yeongyu/comment-checker
|
||||
Pop-Location
|
||||
} else {
|
||||
Write-Host "Skipping package install: bun/npm not found"
|
||||
}
|
||||
|
||||
Write-Host "Done."
|
||||
Write-Host "Next steps:"
|
||||
Write-Host "1) Add keys locally with: opencode auth login <provider>"
|
||||
Write-Host "2) Verify with: bunx oh-my-opencode doctor --verbose"
|
||||
@@ -0,0 +1,221 @@
|
||||
{
|
||||
"$schema": "https://raw.githubusercontent.com/code-yeongyu/oh-my-opencode/dev/assets/oh-my-opencode.schema.json",
|
||||
"agents": {
|
||||
"sisyphus": {
|
||||
"model": "zai-coding-plan/glm-4.7-flashx",
|
||||
"variant": "medium",
|
||||
"fallback_models": [
|
||||
"github-copilot/gpt-5-mini",
|
||||
"opencode-go/glm-5",
|
||||
"v0/v0-pro",
|
||||
"openrouter/nvidia/nemotron-3-super-120b-a12b:free"
|
||||
]
|
||||
},
|
||||
"hephaestus": {
|
||||
"model": "opencode-go/glm-5",
|
||||
"variant": "medium",
|
||||
"fallback_models": [
|
||||
"github-copilot/grok-code-fast-1",
|
||||
"zai-coding-plan/glm-4.7-flash",
|
||||
"openrouter/stepfun/step-3.5-flash:free",
|
||||
"v0/v0-mini"
|
||||
]
|
||||
},
|
||||
"oracle": {
|
||||
"model": "github-copilot/gpt-5-mini",
|
||||
"variant": "medium",
|
||||
"fallback_models": [
|
||||
"anthropic/claude-sonnet-4-6",
|
||||
"zai-coding-plan/glm-4.6",
|
||||
"v0/v0-pro",
|
||||
"openrouter/nvidia/nemotron-nano-12b-v2-vl:free"
|
||||
]
|
||||
},
|
||||
"librarian": {
|
||||
"model": "openrouter/stepfun/step-3.5-flash:free",
|
||||
"fallback_models": [
|
||||
"google/gemini-3-flash-preview",
|
||||
"github-copilot/gpt-5-mini",
|
||||
"v0/v0-mini",
|
||||
"anthropic/claude-sonnet-4-6"
|
||||
]
|
||||
},
|
||||
"explore": {
|
||||
"model": "v0/v0-mini",
|
||||
"fallback_models": [
|
||||
"openrouter/nvidia/nemotron-nano-12b-v2-vl:free",
|
||||
"github-copilot/grok-code-fast-1",
|
||||
"zai-coding-plan/glm-4.7-flash",
|
||||
"opencode-go/kimi-k2.5"
|
||||
]
|
||||
},
|
||||
"multimodal-looker": {
|
||||
"model": "zai-coding-plan/glm-4.6v",
|
||||
"fallback_models": [
|
||||
"openrouter/nvidia/nemotron-nano-12b-v2-vl:free",
|
||||
"google/gemini-3.1-pro-preview",
|
||||
"opencode/gpt-5.4"
|
||||
]
|
||||
},
|
||||
"prometheus": {
|
||||
"model": "openai/gpt-5.4",
|
||||
"variant": "medium",
|
||||
"fallback_models": [
|
||||
"anthropic/claude-opus-4-6",
|
||||
"github-copilot/gpt-5.4",
|
||||
"zai-coding-plan/glm-4.7-flashx",
|
||||
"v0/v0-pro"
|
||||
]
|
||||
},
|
||||
"metis": {
|
||||
"model": "opencode/gpt-5.4",
|
||||
"variant": "medium",
|
||||
"fallback_models": [
|
||||
"google/gemini-3.1-pro-preview",
|
||||
"anthropic/claude-opus-4-6",
|
||||
"openrouter/nvidia/nemotron-3-super-120b-a12b:free",
|
||||
"github-copilot/gpt-5-mini"
|
||||
]
|
||||
},
|
||||
"momus": {
|
||||
"model": "anthropic/claude-sonnet-4-6",
|
||||
"variant": "medium",
|
||||
"fallback_models": [
|
||||
"openai/gpt-5.4",
|
||||
"github-copilot/gpt-5-mini",
|
||||
"openrouter/stepfun/step-3.5-flash:free",
|
||||
"v0/v0-pro"
|
||||
]
|
||||
},
|
||||
"atlas": {
|
||||
"model": "github-copilot/grok-code-fast-1",
|
||||
"fallback_models": [
|
||||
"openrouter/stepfun/step-3.5-flash:free",
|
||||
"zai-coding-plan/glm-4.7-flash",
|
||||
"opencode-go/kimi-k2.5",
|
||||
"anthropic/claude-sonnet-4-6"
|
||||
]
|
||||
}
|
||||
},
|
||||
"background_task": {
|
||||
"defaultConcurrency": 12,
|
||||
"providerConcurrency": {
|
||||
"anthropic": 1,
|
||||
"openai": 1,
|
||||
"google": 1,
|
||||
"github-copilot": 2,
|
||||
"zai-coding-plan": 2,
|
||||
"opencode": 1,
|
||||
"v0": 2,
|
||||
"opencode-go": 2,
|
||||
"openrouter": 3
|
||||
},
|
||||
"modelConcurrency": {
|
||||
"openai/gpt-5.4": 1,
|
||||
"openai/gpt-5.2": 1,
|
||||
"anthropic/claude-opus-4-6": 1,
|
||||
"anthropic/claude-sonnet-4-6": 1,
|
||||
"google/gemini-3-flash-preview": 1,
|
||||
"google/gemini-3.1-pro-preview": 1,
|
||||
"github-copilot/gpt-5.3-codex": 1,
|
||||
"github-copilot/gpt-5.4": 1,
|
||||
"github-copilot/gpt-5-mini": 2,
|
||||
"github-copilot/grok-code-fast-1": 2,
|
||||
"zai-coding-plan/glm-4.6v": 1,
|
||||
"zai-coding-plan/glm-4.7-flash": 2,
|
||||
"zai-coding-plan/glm-4.7-flashx": 2,
|
||||
"zai-coding-plan/glm-4.6": 2,
|
||||
"opencode/gpt-5.3-codex": 1,
|
||||
"opencode/gpt-5.4": 1,
|
||||
"v0/v0-pro": 2,
|
||||
"v0/v0-mini": 2,
|
||||
"opencode-go/glm-5": 2,
|
||||
"opencode-go/kimi-k2.5": 2,
|
||||
"openrouter/nvidia/nemotron-3-super-120b-a12b:free": 3,
|
||||
"openrouter/stepfun/step-3.5-flash:free": 3,
|
||||
"openrouter/nvidia/nemotron-nano-12b-v2-vl:free": 3
|
||||
}
|
||||
},
|
||||
"model_fallback": true,
|
||||
"runtime_fallback": false,
|
||||
"categories": {
|
||||
"visual-engineering": {
|
||||
"model": "google/gemini-3.1-pro-preview",
|
||||
"variant": "high",
|
||||
"fallback_models": [
|
||||
"openrouter/nvidia/nemotron-nano-12b-v2-vl:free",
|
||||
"zai-coding-plan/glm-4.6v",
|
||||
"openai/gpt-5.4"
|
||||
]
|
||||
},
|
||||
"ultrabrain": {
|
||||
"model": "zai-coding-plan/glm-4.7-flashx",
|
||||
"variant": "high",
|
||||
"fallback_models": [
|
||||
"opencode-go/glm-5",
|
||||
"github-copilot/gpt-5-mini",
|
||||
"anthropic/claude-opus-4-6",
|
||||
"v0/v0-pro"
|
||||
]
|
||||
},
|
||||
"deep": {
|
||||
"model": "anthropic/claude-opus-4-6",
|
||||
"variant": "medium",
|
||||
"fallback_models": [
|
||||
"openai/gpt-5.4",
|
||||
"zai-coding-plan/glm-4.6",
|
||||
"openrouter/nvidia/nemotron-3-super-120b-a12b:free"
|
||||
]
|
||||
},
|
||||
"artistry": {
|
||||
"model": "github-copilot/gpt-5.4",
|
||||
"variant": "high",
|
||||
"fallback_models": [
|
||||
"google/gemini-3-flash-preview",
|
||||
"openrouter/stepfun/step-3.5-flash:free",
|
||||
"v0/v0-pro"
|
||||
]
|
||||
},
|
||||
"quick": {
|
||||
"model": "opencode-go/glm-5",
|
||||
"variant": "medium",
|
||||
"fallback_models": [
|
||||
"zai-coding-plan/glm-4.7-flash",
|
||||
"github-copilot/grok-code-fast-1",
|
||||
"v0/v0-mini",
|
||||
"openrouter/stepfun/step-3.5-flash:free"
|
||||
]
|
||||
},
|
||||
"unspecified-low": {
|
||||
"model": "openrouter/stepfun/step-3.5-flash:free",
|
||||
"variant": "medium",
|
||||
"fallback_models": [
|
||||
"v0/v0-mini",
|
||||
"zai-coding-plan/glm-4.6",
|
||||
"github-copilot/gpt-5-mini",
|
||||
"google/gemini-3-flash-preview"
|
||||
]
|
||||
},
|
||||
"unspecified-high": {
|
||||
"model": "github-copilot/gpt-5.3-codex",
|
||||
"variant": "high",
|
||||
"fallback_models": [
|
||||
"openai/gpt-5.4",
|
||||
"anthropic/claude-sonnet-4-6",
|
||||
"zai-coding-plan/glm-4.7-flashx"
|
||||
]
|
||||
},
|
||||
"writing": {
|
||||
"model": "anthropic/claude-sonnet-4-6",
|
||||
"variant": "medium",
|
||||
"fallback_models": [
|
||||
"openai/gpt-5.4",
|
||||
"github-copilot/gpt-5-mini",
|
||||
"v0/v0-pro"
|
||||
]
|
||||
}
|
||||
},
|
||||
"_migrations": [
|
||||
"model-version:anthropic/claude-sonnet-4-5->anthropic/claude-sonnet-4-6"
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,139 @@
|
||||
{
|
||||
"$schema": "https://opencode.ai/config.json",
|
||||
"provider": {
|
||||
"ollama2": {
|
||||
"npm": "@ai-sdk/openai-compatible",
|
||||
"name": "Ollama 2 (main local)",
|
||||
"options": {
|
||||
"baseURL": "http://127.0.0.1:11434/v1",
|
||||
"apiKey": "ollama",
|
||||
"timeout": false,
|
||||
"requestTimeout": 900000,
|
||||
"chunkTimeout": 180000
|
||||
},
|
||||
"models": {
|
||||
"devstral-small-2": {
|
||||
"name": "Devstral Small 2"
|
||||
},
|
||||
"qwen2.5-coder:7b": {
|
||||
"name": "Qwen 2.5 Coder (7B)"
|
||||
}
|
||||
}
|
||||
},
|
||||
"ollama3": {
|
||||
"npm": "@ai-sdk/openai-compatible",
|
||||
"name": "Ollama 3 (12GB local)",
|
||||
"options": {
|
||||
"baseURL": "http://127.0.0.1:30069/v1",
|
||||
"apiKey": "ollama",
|
||||
"timeout": false,
|
||||
"requestTimeout": 900000,
|
||||
"chunkTimeout": 180000
|
||||
},
|
||||
"models": {
|
||||
"qwen2.5-coder:7b": {
|
||||
"name": "Qwen 2.5 Coder (7B)"
|
||||
}
|
||||
}
|
||||
},
|
||||
"anthropic": {
|
||||
"npm": "@ai-sdk/openai-compatible",
|
||||
"name": "Anthropic",
|
||||
"options": {
|
||||
"baseURL": "https://api.anthropic.com/v1"
|
||||
},
|
||||
"models": {
|
||||
"claude-opus-4-6": {
|
||||
"name": "Claude Opus 4.6"
|
||||
}
|
||||
}
|
||||
},
|
||||
"github-copilot": {
|
||||
"npm": "@ai-sdk/openai-compatible",
|
||||
"name": "GitHub Copilot",
|
||||
"models": {
|
||||
"gpt-5-mini": {
|
||||
"name": "GPT-5 Mini"
|
||||
},
|
||||
"grok-code-fast-1": {
|
||||
"name": "Grok Code Fast 1"
|
||||
}
|
||||
}
|
||||
},
|
||||
"zai-coding-plan": {
|
||||
"npm": "@ai-sdk/openai-compatible",
|
||||
"name": "Z.AI Coding Plan",
|
||||
"models": {
|
||||
"glm-4.7-flash": {
|
||||
"name": "GLM-4.7-Flash"
|
||||
},
|
||||
"glm-4.7-flashx": {
|
||||
"name": "GLM-4.7-Flashx"
|
||||
},
|
||||
"glm-4.6": {
|
||||
"name": "GLM-4.6"
|
||||
}
|
||||
}
|
||||
},
|
||||
"v0": {
|
||||
"npm": "@ai-sdk/openai-compatible",
|
||||
"name": "v0 (Vercel)",
|
||||
"options": {
|
||||
"baseURL": "https://api.v0.dev/v1"
|
||||
},
|
||||
"models": {
|
||||
"v0-pro": {
|
||||
"name": "v0 Pro"
|
||||
},
|
||||
"v0-mini": {
|
||||
"name": "v0 Mini"
|
||||
}
|
||||
}
|
||||
},
|
||||
"openrouter": {
|
||||
"npm": "@ai-sdk/openai-compatible",
|
||||
"name": "OpenRouter",
|
||||
"options": {
|
||||
"baseURL": "https://openrouter.ai/api/v1"
|
||||
},
|
||||
"models": {
|
||||
"nvidia/nemotron-3-super-120b-a12b:free": {
|
||||
"name": "NVIDIA Nemotron 3 Super 120B A12B (Free)"
|
||||
},
|
||||
"stepfun/step-3.5-flash:free": {
|
||||
"name": "StepFun Step 3.5 Flash (Free)"
|
||||
},
|
||||
"nvidia/nemotron-nano-12b-v2-vl:free": {
|
||||
"name": "NVIDIA Nemotron Nano 12B V2 VL (Free)"
|
||||
}
|
||||
}
|
||||
},
|
||||
"opencode-zen": {
|
||||
"npm": "@ai-sdk/openai-compatible",
|
||||
"name": "OpenCode Zen",
|
||||
"options": {
|
||||
"baseURL": "https://opencode.ai/zen/v1"
|
||||
},
|
||||
"models": {
|
||||
"glm-5": {
|
||||
"name": "GLM-5"
|
||||
},
|
||||
"kimi-k2.5": {
|
||||
"name": "Kimi K2.5"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"permission": {
|
||||
"read": "allow",
|
||||
"edit": "allow",
|
||||
"write": "allow",
|
||||
"delete": "allow",
|
||||
"execute": "allow"
|
||||
},
|
||||
"model": "zai-coding-plan/glm-4.7-flashx",
|
||||
"small_model": "github-copilot/gpt-5-mini",
|
||||
"plugin": [
|
||||
"oh-my-opencode"
|
||||
]
|
||||
}
|
||||
Reference in new issue
Block a user