---
pr: 78
title: fix(docs): align tool names to kebab-case (local .opencode/tools)
---

## Что сделано
Заменил snake_case имена ЛОКАЛЬНЫХ opencode tools на kebab-case в активной документации (AGENTS.md, 6 SKILL.md, 3 agents/*.md, 2 commands/*.md, docs/project-map/README.md). 12 файлов, 84 insertions / 82 deletions.

Локальные tools (правки, kebab-case): create-issue, create-pr, merge-pr, post-review, post-docs-review, pipeline-status, spec-status, memory-setup. Однословные commit/tunnel — без изменений.

MCP plugin tools (memory_search, memory_list, memory_save, memory_access) — НЕ тронуты, остались snake_case (это другой namespace, имена задаёт плагин).

Доп. правки:
- spec/SKILL.md:28 — broken ADR-026 ref → ADR-019 (ADR-026 создан в PR#63 про другой topic — enforce-tool-usage-policy; ADR-019 уже описывает аналогичный deny-rule паттерн для post-review/post-docs-review).
- spec/SKILL.md:28 — путь скрипта `config/scripts/spec-status.py` → `.opencode/scripts/spec-status.py` (расхождение с AGENTS.md).
- add-skill/SKILL.md — список существующих скиллов 12 → 14 (добавлены release, tunnel; восстановлен алфавитный порядок).

Исторические docs/handoff/* и docs/decisions/* НЕ тронуты — сохраняют оригинальное написание эпохи написания (включая snake_case в ADR-009, handoff pr-29 — там документационная конвенция, не runtime).

Верификация: grep по активным файлам на snake_case локальных tools → 0 совпадений.

## Почему
Реальные имена opencode tools в runtime registry — kebab-case (подтверждено анализом opencode.db: 397 runtime вызовов локальных tools в kebab-case, 0 в snake_case). Имя tool'а резолвится из filename (.opencode/tools/create-pr.ts → registry name "create-pr") — SDK `tool()` не имеет поля `name` (@opencode-ai/plugin@1.18.5 `tool.js`: `tool(input){ return input }`).

В AGENTS.md / SKILL.md / agents промптах tool'ы были написаны в snake_case (create_pr, merge_pr, pipeline_status и т.д.) — документационная конвенция эпохи написания (ADR-009/handoff pr-29, 2026-07-23). Runtime резолвит snake→kebab автоматически через utility `Re=(X)=>X.replace(/_/g,"-")` в opencode.exe — поэтому система работала, НО агент спотыкался: читал "вызови pipeline_status", искал такой tool в tool-списке, находил только pipeline-status, не совпадало → fallback на raw bash (deny → блок) или вызов не того tool.

MCP plugin tools (memory_*) остаются snake_case — их имена задаёт плагин в export-коде, не filename. opencode.db подтверждает: memory_search (65 calls), memory_save (13), memory_access (22) — все snake_case.

См. ADR-034 (этот PR) + memory `technical/tool-name-casing-kebab-vs-mcp-snake.md`.

## Pending
—

## Watch out
- ADR-009 (PR#29) текст остался со snake_case (pipeline_status, spec_status) — НЕ правлен, исторический документ. Intent ADR верен: "commands переименованы, tool'ы не тронуты" — registry names действительно не менялись, просто написаны были в snake в документации.
- opencode.json `agent.tools` map keys остались snake_case (create_pr, merge_pr и т.д.) — НЕ правлен. Runtime конвертирует _ → - через Re-utility, система работает. Смена keys на kebab требует проверки JSON-схемы + test_permissions.py (assert'ит snake keys) — отдельный PR если нужно.
- PR#2 (commit tool doc fix + restore --staged allow + ADR) — отдельный PR, не в этом scope.
