Repository navigation
Refactor/structure audit - #2
Merged
Merged
Conversation
proj.py (600 строк) и lit.py (1300 строк) делали каждый по многу дел сразу. Теперь внутри scripts/ три папки по объекту работы и хост-слой, а входы остались на месте. check/ — суждения о проекте, ничего не пишут: - declarations.py — разбор объявлений Lean и отпечатки формулировок (был leandecl.py); - hygiene.py — sorry, axiom, native_decide, отключённые линтеры; - results.py — проверки шапок записей и идей; - summaries.py — свежесть blueprint.md и ideas/README.md; - structure.py — обязательные файлы и согласие project.toml с lakefile.toml; - doctor.py — окружение проекта. state/ — состояние проекта, из которого собираются сводки: - proj.py — точка входа: new, set, sync, check, audit, fingerprint, statement, tex, doctor; - summaries.py — тексты blueprint.md, ideas/README.md и таблицы модулей; - aristotle.py — пакет для Aristotle и сверка ответа; - mcp.py — MCP-сервер proj. sources/ — источники: реестр, тексты, индекс: - lit.py — точка входа и командная строка; - web.py — сеть, повторы и обход VPN-туннеля (имя не http.py: файл http.py перекрыл бы стандартный пакет http, из которого urllib берёт соединения); - papers.py — опознание источника и запросы к arXiv, MathNet, Crossref, zbMATH, Scholar; - registry.py — papers.json, добавление работ, прикрепление файлов; - store.py — скачивание и хранение полных текстов, страницы PDF; - tex.py — транскрипция в LaTeX и нарезка на куски; - search.py — индекс и поиск по полным текстам; - catalog.py — каталог подборки и статус источника; - mcp.py — MCP-сервер lit. host/ — граница с внешними системами: - harness.py — адаптер DeepSeek Harness (был scripts/harness.py); - lean.py — единственное место, откуда зовут lake и lean. Пути к инструментам обновлены во всех инструкциях, настройках Claude, .mcp.json (--directory . --script scripts/...), CI обоих уровней и тестах. MCP-серверы переехали в свои папки: scripts/state/mcp.py и scripts/sources/mcp.py. Попутно исправлено: - proj_mcp.py обращался к proj.ROOT, переименованному в _ROOT, — сервер proj падал при запуске; - общий разбор записей (records.py) и проверки получают корень параметром, поэтому lit.py больше не считает пути при импорте; - docs/architecture.md описывает новое деление и его основание. Проверено: python -m unittest discover -s tests/template (36 тестов) и -s tests/kit (4 теста), template/scripts/host/harness.py --root template prepare и check, template/scripts/state/proj.py --root template check --fast.
После разрезания scripts/ по группам часть модулей ссылалась на имена, которых в них не было (REGISTRY, LIT, CATALOG, ATOM), и команды источников падали с NameError, пока тесты этого не видели. Добавлены три сторожа — неопределённые имена, обращения к атрибутам модуля в серверах MCP и вызов модуля вместо функции, — и по ним исправлены все ссылки. Заодно убраны два отказа при запуске: файл mcp.py перекрывал пакет `mcp`, поэтому оба сервера не поднимались, а proj.py sync звал lit.py с ключом --root после подкоманды, из-за чего каталог молча не пересобирался. Факты о реестре считает теперь одно место (sources/registry.py::facts): коды источников, карточки в обеих раскладках и карточки, сверенные по PDF; state/proj.py ими пользуется, а не читает чужую раскладку сам. Каталог собирается чистой сборкой текста и отделён от записи, дата из него убрана — поэтому proj.py check сверяет свежесть sources/catalog.md так же, как blueprint.md и ideas/README.md. Сводку каталога proj.py собирает в своём процессе, а не подпроцессом, пересборка после изменяющих команд переехала в фасад lit.py, а направление импортов внутри слоёв закреплено тестом с явным списком оставшихся колец.
Правило «результат инструмента отдаётся текстом, ошибка не роняет сервер» было записано в state/mcp.py и sources/mcp.py копией, и копии уже разошлись: один сервер ловил KeyError, другой нет. Правило переехало в scripts/mcptool.py, оба сервера берут его оттуда. Набор исключений взят объединением прежних двух и расширен TypeError: ошибка ввода или состояния возвращается текстом, чтобы одна неудачная команда не убивала сервер целиком. Прочие отказы в список не входят и видны как есть. Проверено: оба сервера поднимаются и отдают полный список инструментов (proj — 8, lit — 11), наборы тестов зелёные.
…дели Математический текст делят пять скиллов, по одному на слой, и каждый отвечает на свой вопрос: содержание (math-rigor), композиция (paper-canvas), стиль автора (shkalikov-style), язык (paper-de-ai), набор (math-typeset). Правило лежит в том скилле, на чей вопрос оно отвечает; справочники разложены по тем же слоям вместо прежних общих файлов. Тела скиллов больше не называют путей проекта: привязка к проекту — шапка (`paths`, `when_to_use`) и таблица слоёв в AGENTS.md. `exposition` стала командой: она загружает скиллы слоёв и своих правил о тексте не держит. В Harness модель выбирает навык по имени и первым 500 знакам описания, а поле whenToUse ей не показывается. Поэтому адаптер дописывает условие `when_to_use` и маску `paths` к описанию, а whenToUse оставляет подписью для интерфейса; описание, которое вместе с условием не помещается в предел каталога, сборка отвергает, а не обрезает молча. Обновление проекта останавливается, если навык проекта носит имя команды шаблона: команды и навыки делят одно пространство имён, и собрать интеграцию иначе нельзя. В режиме --dry-run об этом только сообщается. Обновлены AGENTS.md, DEEPSEEK.md, README.md и руководство; проверки адаптера и создания проекта дополнены случаями на длину описания и на столкновение имён.
harness_runtime.mjs считал корнем корень репозитория и искал output/harness/generated.json там, тогда как harness.py пишет его в template/output/harness/: job harness-contract в CI падал на чтении манифеста, а не проверял patch. Раньше корни совпадали случайно — потому что harness.py лежал в template/scripts/ и его parents[2] давал корень репозитория. Теперь проект задан явно: по умолчанию заготовка рядом со скриптом, ключ --project называет другой каталог, рабочий каталог провайдера навыков — тот же проект. Вызовы не изменились, CI оставлен как есть: prepare и проверка смотрят на одни файлы по структуре пути. Проверено настоящим прогоном контракта на пакетах Harness 0.2.1-alpha.2: 14 схем плагинов, 13 навыков, MCP lean-lsp 22 инструмента, lit 11, proj 8; запуск из другого рабочего каталога даёт то же, --project без значения и неверный --project отвергаются.
create.py собирал сводки нового проекта вызовом proj.py sync с check=False и capture_output=True: падение не видел ни пользователь, ни CI, а сообщение «Проект создан» печаталось всё равно. Именно так долго не замечался сломанный порядок ключа --root в вызове lit.py из sync — каталог источников молча не пересобирался. Теперь код возврата проверяется: создание останавливается до сборки интеграции Harness, сообщение называет команду, её код возврата и хвост обоих потоков, а скопированные файлы остаются на месте — причину видно и можно повторить sync руками. Успешный путь не изменился: вывод sync по-прежнему перехвачен и не печатается. Добавлены две проверки: падение sync прекращает создание и показывает его вывод, а успешный sync молчит. Первая падает на прежнем коде («Проект создан» печаталось при упавшем sync), это проверено возвратом прежней строки.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
No description provided.