opencode-config/.opencode/skills/configure-opencode/SKILL.md
Sergey 67174b4879
refactor(pipeline): make pipeline-status sole orchestrator + slim docs (#42)
* refactor(pipeline): add subagent_type and template to NEXT actions

NEXT_ACTIONS now explicitly specifies subagent_type + template per phase (except MERGE which calls merge_pr tool). ISSUE/IMPLEMENT -> general/A, DOCS -> docs-reviewer/B, REVIEW -> reviewer/C, MEMORY -> memory-syncer/E. Existing tests updated to new format, 25 new tests added.

* refactor(docs): slim AGENTS.md and run-pipeline skill

AGENTS.md 71 -> 31 lines: remove Commits/Pull Requests sections (formats in tools), shorten Development Workflow/Pipeline to 1-2 lines. run-pipeline SKILL.md 164 -> 155 lines: remove Phase 0 Bootstrap (duplicated phases, now in pipeline-status NEXT_ACTIONS). Keep protocol, templates, restrictions.

* chore(skills): remove commit skill (format in tool validator)

commit/SKILL.md deleted (format validated by commit.ts tool, PR#38). References updated: configure-opencode SKILL.md (2 places), add-skill SKILL.md (1 place + tree structure). project-map README: remove commit/SKILL.md from tree, add configure-opencode.

* docs(handoff): add ADR-017 and handoff for orchestration switch

PR number in handoff frontmatter is <PR-NUMBER> placeholder, will be set after gh pr create.

* docs(handoff): set PR number

Set PR number 42 in handoff frontmatter, rename handoff/ADR files from pr-41 to pr-42 (pipeline-status matches pr-{pr_number}-*.md in diff).

* docs: update project map + handoff + ADR

---------

Co-authored-by: opencode-agent <agent@slaid098.dev>
2026-07-24 15:40:20 +03:00

8.9 KiB
Raw Blame History

name description
configure-opencode Use when adding, changing, or removing MCP servers, providers, permissions, agents, plugins, or any block in opencode.json. Always writes to .opencode/opencode.json in slaid098/opencode-config (project-local, auto-discovered, zero env var). Also when user says "добавь MCP", "подключи интеграцию", "пропиши permissions", "добавь провайдера", "измени конфиг opencode", "куда писать конфиг".

configure-opencode

Канонический скилл для правок opencode.json в репо slaid098/opencode-config. Фиксирует контракт «куда писать конфиг» и форматы блоков. Конфиг-репо — это шаблон, который клонируют пользователи.

1. Каноническое правило (canonical rule)

  • Всегда пишем конфиг в .opencode/opencode.json в репо slaid098/opencode-config (project-local, auto-discovered). opencode автоматически подхватывает .opencode/opencode.json при запуске — без env var, без bind-mount, без symlink.
  • Репо slaid098/opencode-config сам по себе — шаблон, который пользователь клонирует: git clone … && opencode в корне клона — и конфиг работает.
  • НЕ создавать отдельный project-local opencode.json в других репо (например .opencode/opencode.json в other-repo) для глобальных настроек. Глобальные правки идут в slaid098/opencode-config.
  • НЕ спрашивать пользователя «куда писать конфиг» — ответ всегда .opencode/opencode.json в slaid098/opencode-config.
  • Исключение: явный override-сценарий (project-local конфиг нужен для изоляции в конкретном проекте) — тогда указать явно в комментарии к изменению.
  • Docker (опционально): для контейнерного запуска можно bind-mount .opencode/~/.config/opencode/ (см. docker-compose.yml) — но это optional path, не канон. Репо обязан работать и bare-opencode в клона.

2. Применение изменений

  • commit + push в репо slaid098/opencode-config (через commit tool).
  • В клонах: git pull + рестарт opencode (MCP-серверы, skills, agents грузятся при старте — см. add-skill/SKILL.md). До рестарта правки не видны.
  • Для Docker-сетапа: git pull на хосте + docker compose restart opencode (или эквивалент) — MCP/skills/agents грузятся при старте контейнера.

3. Структура top-level ключей opencode.json

  • $schema — JSON-schema URL для автокомплита в IDE.
  • plugin — npm-пакет плагина (например @mathew-cf/opencode-memory).
  • skills.paths — массив путей к skill-директориям (по умолчанию [".opencode/skills"]).
  • compaction — настройки сжатия контекста.
  • disabled_providers — массив отключённых провайдеров.
  • provider — current provider config (см. ниже).
  • permission — permission rules (read/bash, см. ниже).
  • agent — per-agent overrides (frontmatter-like, переопределяет per-agent).
  • mcp — MCP-серверы (remote/local, см. ниже).

4. MCP-форматы

Remote (streamable-HTTP):

"<name>": {
  "type": "remote",
  "url": "https://example.com/mcp",
  "enabled": true,
  "timeout": 300000
}

Local (subprocess):

"<name>": {
  "type": "local",
  "command": ["npx", "-y", "<package>"],
  "enabled": true
}

Env-плейсхолдеры: "{env:VAR_NAME}" — значение подставляется из env. НЕ хардкодить секреты (API keys, tokens) в JSON. Пример: "url": "{env:MY_API_URL}", "--api-key", "{env:MY_API_KEY}".

timeout — в миллисекундах, обязателен для медленных MCP (LLM-агенты, скрапинг). Для быстрых (well-known manifests) — можно опустить (default).

5. Provider-формат

"provider": {
  "npm": "<package-name>",
  "options": {
    "baseURL": "https://api.example.com/v1",
    "apiKey": "{env:PROVIDER_API_KEY}"
  },
  "models": {
    "<model-id>": {
      "limit": { "context": 128000, "output": 8192 },
      "reasoning": true,
      "modalities": ["text", "image"],
      "variants": ["<variant-id>"]
    }
  }
}

6. Permissions

  • read — массив glob-паттернов для разрешённых read-путей (например ["**/*"] или ["./src/**"]).
  • bash — объект "<pattern>": "<action>" где:
    • action"allow", "ask", или "deny".
    • pattern — glob-паттерн bash-команды (например "git push*", "gh pr merge*", "python3*").
  • Семантика findLast: при нескольких матчах побеждает последнее правило (last wins). Это значит порядок правил имеет значение.
  • Три состояния:
    • allow — команда выполняется без подтверждения.
    • ask — opencode спрашивает пользователя перед выполнением.
    • deny — команда блокируется (deny-лог в opencode.log).
  • Guard: после правок permission.bash запускать локально python3 .opencode/scripts/check-permissions.py — детектирует опасные паттерны (например gh pr checks*, см. ADR-006). CI (permissions-check.yml) запускает тот же скрипт.
  • См. ADR-006 (детерминированный guard), ADR-005 (Actions API вместо Checks API в allow-list'ах).

7. Gotchas

  • Рестарт обязателен: правки в .opencode/opencode.json НЕ видны opencode до рестарта (MCP/skills/agents грузятся при старте). В клонах — рестарт opencode; в Docker — docker compose restart opencode.
  • env-плейсхолдеры не хардкод: секреты в .env (не в git), плейсхолдер "{env:VAR}" в opencode.json (в git). Пример: MY_API_URL, MY_API_KEY, MY_TUNNEL_TOKEN.
  • OPENCODE_CONFIG_DIR env var (power-user/Docker): указывает на директорию с opencode.json — загружается ПОСЛЕ .opencode/ и МОЖЕТ переопределять его. Канонический путь .opencode/ не требует этого env var; OPENCODE_CONFIG_DIR нужен только для кастомного layout (Docker, power-user).
  • findLast семантика: при конфликте правил побеждает последнее. Если добавить deny после allowdeny wins. Если allow после denyallow wins. Порядок имеет значение.
  • CI проверяет permissions: permissions-check.yml запускается на PR с изменениями .opencode/opencode.json, .opencode/agents/**, .opencode/scripts/check-permissions.py. Локальная проверка перед commit: python3 .opencode/scripts/check-permissions.py → exit 0, "OK: No dangerous permission rules found."

8. Commit message

  • Формат: feat(config): ... / chore(config): ... / fix(config): ... (conventional commits, English, ≤72 chars).
  • Перед commit — использовать commit tool (валидация формата встроена), проверить git log --oneline -20, match existing style.
  • Примеры: feat(config): add integrations MCP server, fix(config): correct timeout for integrations discover tool.

9. Не дублировать блоки между репо

  • .opencode/opencode.json в slaid098/opencode-config — единственный источник правды для конфига. Репо сам по себе — шаблон, который клонируют.
  • Project-local opencode.json в других репо — только для явного override (например отключить MCP для конкретного проекта). В 99% случаев не нужен — клонируй slaid098/opencode-config или используй instructions array с remote URLs.