Skip to content

fix(install): не ломать payload на байткоде и синкать Claude-манифест#109

Merged
mimfort merged 2 commits into
mainfrom
dev
Jul 14, 2026
Merged

fix(install): не ломать payload на байткоде и синкать Claude-манифест#109
mimfort merged 2 commits into
mainfrom
dev

Conversation

@mimfort

@mimfort mimfort commented Jul 14, 2026

Copy link
Copy Markdown
Owner

Два follow-up фикса к разбору красного CI (#108) — оба про грабли, которые остались бы на будущее.

1. payload_digest падал на __pycache__

Хуки плагина (plugin/hooks/*.py) при запуске оставляют байткод, а __pycache__ лежал в _FORBIDDEN_PAYLOAD_PARTS — обход payload бросал ValueError: forbidden payload path. В CI дерево чистое, но у пользователя это ломало reviewer install codex на шаге snapshot verification.

Байткод — производное от .py, которые уже входят в digest, поэтому __pycache__ и *.pyc/*.pyo теперь игнорируются, а не запрещаются. Запрет на .git/.env/.venv/build/dist — это защита от утечки секретов и артефактов сборки в payload, он сохранён и закреплён параметризованным тестом.

Digest реального payload при этом не изменился — манифесты на main остаются валидными.

2. Бамп версии снова сломал бы CI

sync_plugin_metadata вёл только Codex-манифесты, а plugin/.claude-plugin/plugin.json надо было править руками — ровно поэтому бамп 0.3.0 → 0.3.1 положил CI. Теперь скрипт синка обновляет и Claude-манифест, а --check явно сообщает о рассинхроне (Claude manifest version '0.3.1' != '0.3.2') вместо загадочного расхождения digest.

Порядок важен: Claude-манифест пишется до вычисления digest, потому что он лежит внутри payload и его версия, в отличие от Codex-манифеста, не нормализуется.

Проверено симуляцией бампа на 0.3.2: один прогон scripts/update_codex_plugin_manifest.py приводит все три манифеста в согласованное состояние, --check зелёный.

Проверка

env PATH="/usr/bin:/bin:/usr/sbin" pytest -q (эмуляция раннера без uv) → 1243 passed, 1 skipped; ruff check . → чисто. Тесты написаны до фиксов и падали на старом коде.

mimfort added 2 commits July 14, 2026 20:53
payload_digest падал с "forbidden payload path" на plugin/hooks/__pycache__:
хуки плагина при запуске оставляют .pyc, из-за чего у пользователя мог
сломаться `reviewer install codex` (snapshot verification). Байткод —
производное от .py, которые уже входят в digest, поэтому __pycache__/*.pyc
теперь игнорируются, а не запрещаются. Запрет на .git/.env/.venv/build/dist
(защита от секретов в payload) сохранён и закреплён тестом.

sync_plugin_metadata обновлял только Codex-манифесты, так что бамп версии в
pyproject оставлял plugin/.claude-plugin/plugin.json позади и валил CI
(см. 0.3.0 → 0.3.1). Теперь скрипт синка ведёт и Claude-манифест, а --check
явно сообщает о рассинхроне. Манифест пишется до вычисления digest: он лежит
внутри payload, и его версия, в отличие от Codex-манифеста, не нормализуется.
@mimfort
mimfort merged commit 4a06603 into main Jul 14, 2026
6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant