install.sh ставит allow-правила цикла фичи, --no-permissions для отказа (#24, 0.5.0) #26

Merged
aep merged 1 commits from feat/24-harness-permissions into main 2026-10-23 23:04:34 +03:00
Owner

Closes #24. Bounded: дизайн утверждён в чате 23.10.2026. Пересматривает решение владельца 2: раньше строку allow-правила владелец добавлял сам, теперь install.sh ставит правила цикла фичи, а отказаться можно флагом --no-permissions.

Что сделано

  • global/permissions.json — 11 allow-правил:

    • git worktree, git branch -m, git branch -D;
    • git push -u origin feat/…, git push -u origin chore/…, git push origin --delete;
    • tea issues, tea pulls create/list/edit, tea comments.

    tea pulls merge и push в main в список не входят: merge делается только по команде человека.

  • install.sh:

    • шаг 5 дописывает недостающие правила в permissions.allow файла ~/.claude/settings.json, чужие правила не трогает, печатает, что добавил;
    • кладёт копию списка в ~/.claude/harness/permissions.json;
    • --no-permissions пропускает шаг 5;
    • на неизвестный аргумент выдаёт ошибку (раньше молча делал полную установку);
    • --check показывает permissions обвязки: N/M и недостающие правила.
  • doctor.sh, раздел «Машина» — то же: ok / WARN со списком / MISS. WARN проверки push --delete в разделе «Проект» подсказывает bash install.sh.

  • adopt-project.sh, new-project.sh — строку push --delete по-прежнему печатают, с пометкой «если обвязка ставилась с --no-permissions».

  • harness-doctor SKILL.md — сам агент запускает только install.sh --no-permissions. Права ставит владелец: иначе агент обошёл бы отказ классификатора auto mode («Self-Modification»).

  • Docs:

    • README — что ставит install.sh и флаг;
    • HARNESS.md — рецепт п. 4 и абзац о подтверждениях;
    • roles/dev.md, п. 4;
    • CLAUDE.md;
    • ретро, решение 2 — пометка о пересмотре;
    • CHANGELOG 0.5.0.

Проверка

  • bash tests/run.sh — passed 505, failed 0. Новые тесты (18), все сначала падали:
    • test-install (13): файл есть и установлен; список прочитан и не пуст; все правила стоят по одному разу после двух установок; чужое правило сохранено; дублей нет; в списке нет merge, push в main и EnterWorktree; --check ok; --no-permissions — exit 0, правила пропущены, хуки ставятся, --check предупреждает;
    • test-doctor (3): WARN, ok, MISS;
    • test-workspace (1): пометка --no-permissions в выводе adopt.
  • Вживую: install.sh --check на этой машине выдаёт WARN permissions обвязки: 9/11, нет: Bash(git push -u origin chore/:*) Bash(tea pulls edit:*). Это два правила, которых не было в разовом скрипте.

Находки

Маркер Что Статус
O-14 я советовал разрешить EnterWorktree и additionalDirectories, но вход в worktree вне .claude/worktrees/ спрашивает подтверждение при любых правилах (Claude Code ≥ 2.1.206, docs/worktrees) fixed 897fa0f (в список не вошло); перенос worktree — #25
O-15 install.sh молча игнорировал неизвестные аргументы и делал полную установку fixed 897fa0f

Rulings I made

  • EnterWorktree/ExitWorktree и additionalDirectories в список не вошли: первое не снимает запрос, ExitWorktree подтверждения не требует, путь к worktree свой у каждой машины. Цена: нет.
  • Добавлены git push -u origin chore/:* (архивные PR, chore/harness-init) и tea pulls edit:* (правка описания PR). Их не было в разовом скрипте. Цена: если «chore/» окажется лишним, оно разрешает push веток chore/… без подтверждения.
  • Правила только дописываются: при удалении правила из global/permissions.json install.sh не уберёт его из settings.json. Цена: устаревшие правила обвязки остаются, пока их не уберут руками.
  • Неизвестный аргумент install.sh теперь ошибка. Цена: скрипт, который передавал лишний аргумент, перестанет работать.

После merge

bash install.sh запускаете вы: агент права себе не выдаёт. Ожидается settings.json: permissions +2 (Bash(git push -u origin chore/:*), Bash(tea pulls edit:*)), затем --check выдаёт ok permissions обвязки: 11/11. Правила EnterWorktree/ExitWorktree и additionalDirectories из разового скрипта в settings.json ничему не мешают. Убрать их можно руками, install.sh их не трогает.

🤖 Generated with Claude Code

Closes #24. Bounded: дизайн утверждён в чате 23.10.2026. Пересматривает решение владельца 2: раньше строку allow-правила владелец добавлял сам, теперь `install.sh` ставит правила цикла фичи, а отказаться можно флагом `--no-permissions`. ## Что сделано - **`global/permissions.json`** — 11 allow-правил: - `git worktree`, `git branch -m`, `git branch -D`; - `git push -u origin feat/…`, `git push -u origin chore/…`, `git push origin --delete`; - `tea issues`, `tea pulls create/list/edit`, `tea comments`. `tea pulls merge` и push в main в список не входят: merge делается только по команде человека. - **`install.sh`**: - шаг 5 дописывает недостающие правила в `permissions.allow` файла `~/.claude/settings.json`, чужие правила не трогает, печатает, что добавил; - кладёт копию списка в `~/.claude/harness/permissions.json`; - `--no-permissions` пропускает шаг 5; - на неизвестный аргумент выдаёт ошибку (раньше молча делал полную установку); - `--check` показывает `permissions обвязки: N/M` и недостающие правила. - **`doctor.sh`**, раздел «Машина» — то же: `ok` / `WARN` со списком / `MISS`. WARN проверки `push --delete` в разделе «Проект» подсказывает `bash install.sh`. - **`adopt-project.sh`, `new-project.sh`** — строку `push --delete` по-прежнему печатают, с пометкой «если обвязка ставилась с `--no-permissions`». - **harness-doctor `SKILL.md`** — сам агент запускает только `install.sh --no-permissions`. Права ставит владелец: иначе агент обошёл бы отказ классификатора auto mode («Self-Modification»). - **Docs:** - README — что ставит `install.sh` и флаг; - `HARNESS.md` — рецепт п. 4 и абзац о подтверждениях; - `roles/dev.md`, п. 4; - `CLAUDE.md`; - ретро, решение 2 — пометка о пересмотре; - CHANGELOG 0.5.0. ## Проверка - `bash tests/run.sh` — passed 505, failed 0. Новые тесты (18), все сначала падали: - `test-install` (13): файл есть и установлен; список прочитан и не пуст; все правила стоят по одному разу после двух установок; чужое правило сохранено; дублей нет; в списке нет merge, push в main и `EnterWorktree`; `--check` ok; `--no-permissions` — exit 0, правила пропущены, хуки ставятся, `--check` предупреждает; - `test-doctor` (3): WARN, ok, MISS; - `test-workspace` (1): пометка `--no-permissions` в выводе `adopt`. - Вживую: `install.sh --check` на этой машине выдаёт `WARN permissions обвязки: 9/11, нет: Bash(git push -u origin chore/:*) Bash(tea pulls edit:*)`. Это два правила, которых не было в разовом скрипте. ## Находки | Маркер | Что | Статус | |---|---|---| | O-14 | я советовал разрешить `EnterWorktree` и `additionalDirectories`, но вход в worktree вне `.claude/worktrees/` спрашивает подтверждение при любых правилах (Claude Code ≥ 2.1.206, docs/worktrees) | fixed 897fa0f (в список не вошло); перенос worktree — #25 | | O-15 | `install.sh` молча игнорировал неизвестные аргументы и делал полную установку | fixed 897fa0f | ## Rulings I made - `EnterWorktree`/`ExitWorktree` и `additionalDirectories` в список не вошли: первое не снимает запрос, `ExitWorktree` подтверждения не требует, путь к worktree свой у каждой машины. Цена: нет. - Добавлены `git push -u origin chore/:*` (архивные PR, `chore/harness-init`) и `tea pulls edit:*` (правка описания PR). Их не было в разовом скрипте. Цена: если «chore/» окажется лишним, оно разрешает push веток `chore/…` без подтверждения. - Правила только дописываются: при удалении правила из `global/permissions.json` `install.sh` не уберёт его из `settings.json`. Цена: устаревшие правила обвязки остаются, пока их не уберут руками. - Неизвестный аргумент `install.sh` теперь ошибка. Цена: скрипт, который передавал лишний аргумент, перестанет работать. ## После merge `bash install.sh` запускаете вы: агент права себе не выдаёт. Ожидается `settings.json: permissions +2 (Bash(git push -u origin chore/:*), Bash(tea pulls edit:*))`, затем `--check` выдаёт `ok permissions обвязки: 11/11`. Правила `EnterWorktree`/`ExitWorktree` и `additionalDirectories` из разового скрипта в `settings.json` ничему не мешают. Убрать их можно руками, `install.sh` их не трогает. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
aep added 1 commit 2026-10-23 23:02:30 +03:00
Пересмотр решения владельца 2: allow-правила (git worktree, git branch
-m/-D, push фичевых и chore-веток, push --delete, tea issues/pulls
create/list/edit/comments) ставит install.sh в ~/.claude/settings.json,
а не владелец руками. Список — global/permissions.json; merge и push в
main в нём нет. Правила только дописываются, чужие не трогаются; копия
списка — ~/.claude/harness/permissions.json для doctor.sh.

- install.sh: шаг 5 — слияние permissions.allow; --no-permissions;
  неизвестный аргумент — ошибка; --check показывает permissions N/M.
- doctor.sh, «Машина»: ok / WARN со списком недостающих / MISS.
- adopt/new-project: строка push --delete — для --no-permissions.
- harness-doctor: агент чинит install.sh --no-permissions, права ставит
  владелец (иначе обход отказа классификатора auto mode).
- EnterWorktree не входит: вход в worktree вне .claude/worktrees/
  спрашивает подтверждение при любых правилах (#25).
- README, HARNESS.md, roles/dev.md, CLAUDE.md, ретро (пометка о
  пересмотре решения 2), CHANGELOG 0.5.0.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
aep merged commit 04369f1b0a into main 2026-10-23 23:04:34 +03:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: aep/claude-harness#26
No description provided.