Плагин Claude Code: роли, опознание сессии, границы правки и git-порядок. Один экземпляр на все
репозитории; всё, что у них различается, каждый объявляет сам — файлом .claude/harness.yaml
рядом со своим кодом.
- 🧭 Главное
- 🧱 Что внутри
- 🔌 Как подключить
- 🚦 Как запускать сессии
- 🧩 Что объявляет репозиторий
- 🔍 Проверка установки
- ❓ Почему так, а не иначе · 🗺️ План
Одна роль на сессию, и она впаяна на старте. main — architect: держит контракты, координацию и
доставку, кода зон не пишет. <зона> — owner этой зоны: отвечает за неё целиком и правит только
её папки. layer — один артефакт по узкому промпту, git не трогает вовсе.
Границы держит машина, а не обещание:
- правка файла — штатными правилами доступа: у роли свой файл настроек, в нём чужие зоны закрыты;
- git-запись — гейтом: он разбирает команду (
bash -c, кавычки, подстановка, heredoc видны ему все) и сверяет глагол с правами роли, а состав коммита — с её путями; - граница репозитория — хуком: правка файла и git-запись за пределами репозитория сессии
запрещены любой роли, architect не исключение. Соседний репозиторий в скоупе, в том числе
прилинкованный через
node_modules, правит только его собственная сессия.
Не закрыто: запись в соседний репозиторий не-git командой Bash (sed -i ../сосед/…). Это держит
только песочница Claude Code, а ей нужны user namespaces, которых в контейнере может не быть —
разбор в FAQ.
| Часть | Что делает |
|---|---|
agents/ |
пять ролей |
skills/shared-policy/ |
общая политика — рамка, которую включает каждая роль |
hooks/scope-identity.mjs |
баннер на старте: кто ты, какие папки твои, чего нельзя |
hooks/main-session-marker.mjs |
маркер architect-сессии — им даётся право на доставку |
hooks/git-gate.mjs |
гейт git-записи: чужой репозиторий, глагол по роли, состав коммита по зоне, цифры перед сменой ветки |
hooks/repo-boundary.mjs |
правка файла вне репозитория сессии — отказ любой роли |
hooks/ownership.mjs |
кто владеет файлом по раскладке зон (нужен проверке состава коммита) |
hooks/harness-config.mjs |
чтение harness.yaml: зоны, пины моделей, git-права |
hooks/harness-doctor.mjs |
проверка установки: включён ли плагин, разложены ли роли, есть ли pre-commit |
hooks/statusline.mjs |
строка состояния с ролью — включается в личных настройках, см. ниже |
scripts/generate-roles.mjs |
собирает файлы ролей из harness.yaml |
skills/ |
пять действий захода: /harness:shift, task, report, verdict, checkpoint — все пишут в ROADMAP.yaml скоупа |
claude plugin marketplace add egor6-66/harness
claude plugin install harness@omnifield --scope projectЧтобы плагин включался у каждого, кто клонировал репозиторий, это записывается в его
.claude/settings.json (файл коммитится):
{
"extraKnownMarketplaces": {
"omnifield": { "source": { "source": "github", "repo": "egor6-66/harness" } }
},
"enabledPlugins": { "harness@omnifield": true }
}🖥️ Строка состояния — личная настройка. Плагин её задать не может (Claude Code берёт
statusLine только из настроек, не из плагина), поэтому роль на экране включается в своём
~/.claude/settings.json, указав путь до hooks/statusline.mjs установленного плагина. Без неё
всё работает — просто роль не видна постоянно.
Роль приезжает файлом настроек — в нём и она сама, и границы её правки:
claude --settings .claude/roles/main.json # architect
claude --settings .claude/roles/ui.json # owner зоны ui
claude --settings .claude/roles/layer.json # layerФайлы ролей собираются из конфига и коммитятся:
node ~/.claude/plugins/<путь до плагина>/scripts/generate-roles.mjs ..claude/harness.yaml — данные, и только они:
apiVersion: harness/v1
kind: harness
product: <имя>
architects: 1
models:
architect: claude-opus-5
owner: claude-opus-5
layer: claude-haiku-4-5
zones:
<зона>:
paths: [<папка>]
description: "что это за зона"
git:
architect: full
owner: commit-only
layer: noneПути зон не пересекаются: одна папка — один владелец. Конфиг пустой или шаблонный — сессия стартует в режиме онбординга, и первая работа это заполнить его вместе с человеком.
node <плагин>/hooks/harness-doctor.mjs # общий отчёт
HARNESS_SCOPE=<роль> node <плагин>/hooks/harness-doctor.mjs # + кто ты при этой ролиГоворит по факту: прочитан ли конфиг, существуют ли папки зон, не пересекаются ли они, включён ли плагин, разложены ли файлы ролей, есть ли в репозитории машинный pre-commit.