Files
agents/.gitea/workflows/scripts/install-opencode.sh
senior cafd36eae1 fix(agent): single source of truth for model IDs (route.sh + install-opencode.sh)
Extract the agent registry to a shared agents.json and have both
route.sh (agent → model) and install-opencode.sh (ollama-cloud provider
models map) derive from it, so the two lists can no longer drift.

route.sh now copies agents.json to /tmp/agents.json instead of an inline
heredoc. install-opencode.sh builds the ollama-cloud  map by
collecting every registry model with the  prefix and
stripping it — non-ollama-cloud models (e.g. @lead's anthropic/claude-opus,
the local ornith:35b) are excluded by construction.

Resolves #31.
2026-07-04 07:20:25 +00:00

46 lines
2.7 KiB
Bash
Executable File

#!/usr/bin/env bash
# Install opencode + provider config (+ Playwright MCP for browser agents).
#
# Required env (provided by the workflow step): OLLAMA_URL OLLAMA_CLOUD_API_KEY NAME SKILLS
# GITHUB_PATH HOME
set -eu
curl -fsSL https://opencode.ai/install | bash
echo "$HOME/.opencode/bin" >> "$GITHUB_PATH"
mkdir -p ~/.config/opencode
# Playwright browser MCP only for agents that need to drive a web app
MCP='{}'
case "$NAME" in
senior|lead|qa)
echo "Enabling Playwright MCP for @$NAME"
MCP='{"playwright":{"type":"local","command":["npx","-y","@playwright/mcp@latest","--headless"],"enabled":true}}'
npx -y playwright install --with-deps chromium || npx -y playwright install chromium || true
;;
esac
# Per-agent skill scoping. Skills are loaded on-demand by opencode: only a skill's one-line
# `description` ever appears in an agent's <available_skills> list, and the full SKILL.md body
# (curl/API how-to) is loaded ONLY when the agent calls the `skill` tool — it is never in any
# system prompt. To also hide the summary from agents that shouldn't use a skill, we deny all
# skills by default and allow only the ones in this agent's registry list (passed via $SKILLS).
# A denied skill is hidden entirely (name + description omitted), so e.g. @junior never sees
# gitea-api at all; it just knows from the roster that @senior/@lead can, and asks them.
SKILLS="${SKILLS:-[]}"
PERM=$(jq -nc --argjson s "$SKILLS" '
{skill: ( {"*":"deny"} + (reduce $s[] as $k ({}; . + {($k):"allow"})) )}')
# Two ollama providers: local self-hosted (ornith) + Ollama Cloud (gemma4/kimi-k2.7-code/glm-5.2/minimax-m3).
# The ollama-cloud `models:` map is DERIVED from agents.json (the single source of truth, shared with
# route.sh) so every model an agent is routed to is always declared in the provider config. Only the
# `ollama-cloud/` provider prefix models participate — e.g. `anthropic/claude-opus-4-8` (@lead) is a
# built-in provider and `ornith:35b` is local-only, neither belongs here. See issue #31.
AGENTS_JSON="${SCRIPTS:-$(dirname -- "$0")}/agents.json"
CLOUD_MODELS=$(jq -r '[.[] | .model | select(startswith("ollama-cloud/")) | sub("^ollama-cloud/";"")] | map({(.):{}}) | add // {}' "$AGENTS_JSON")
jq -n --argjson mcp "$MCP" --argjson perm "$PERM" --argjson cloud "$CLOUD_MODELS" --arg url "$OLLAMA_URL" --arg ckey "$OLLAMA_CLOUD_API_KEY" '{
provider: {
ollama: {npm:"@ai-sdk/openai-compatible", options:{baseURL:($url+"/v1")}, models:{"ornith:35b":{}}},
"ollama-cloud": {npm:"@ai-sdk/openai-compatible", options:{baseURL:"https://ollama.com/v1", apiKey:$ckey}, models:$cloud}
},
permission: $perm,
mcp: $mcp
}' > ~/.config/opencode/opencode.json
echo "opencode config (secrets masked):"; cat ~/.config/opencode/opencode.json