build(repo): 落成工具链、依赖契约与十个模块的空骨架
第 ③ 阶段剩下的那半:架构文档之外,import-linter 契约也落地了。 pyproject.toml 把九条依赖规则里的七条写成五条 import-linter 契约。 分层用一条 layers 契约表达规则 1、2、3、8,`|` 表示同层互不 import; 另外四条 forbidden 分别管下游反向 import、polygateway 的唯一入口、 以及三个纯逻辑模块不碰 asyncio 与 pathlib。 契约不是平凡的绿:故意注入两处违规验证过,都被点名到行号。 先建十个模块的空包,是为了避开 PolyGateway bootstrap 期那段 Makefile 门控—— 它当时没有包,lint-imports 报 module not found 而红,只好加一段跳过逻辑。 空包让契约从第一天就真的在跑。 剩下两条规则落不进契约,写成了 tests/unit 下的测试: 规则 6「types 与 ports 不许 import 任何第三方」判据要反过来写(只许标准库和自己), 规则 9「import polyloop 之后 sys.modules 里没有 polygateway」是运行时事实。 另加硬约束 §1.1 零业务假设的黑名单扫描——它第一次跑就抓到 _assembly 的 docstring 里写了 dissect 的业务词,已改。三个扫描类测试都带 fail-closed 守卫, 防止目录搬走之后扫到空列表安静地绿。 工程约定取自实验室已有项目:setuptools + src layout、ruff 十一项 select、 line-length 100 来自 PolyGateway;dev 工具链版本钉死、--strict-markers 与 --import-mode=importlib 来自 CHSAnalyzer 与 dissect 踩过的坑,各自的理由写在配置注释里。 e2e 默认不跑,它打真实网关要花钱。 CLAUDE.md §0 那句「契约还没写,要等 src/ 落地」已过期,改掉; README 勾掉第 ②③ 阶段,补上本地检查命令与 GovDoc-Editor 那一行。 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,28 @@
|
||||
.PHONY: install lint format check test ci
|
||||
|
||||
ENV := PolyLoop
|
||||
|
||||
# 命令形状是固定的:PYTHONUNBUFFERED=1 加 conda run --live-stream。conda 和 Python 各缓冲
|
||||
# 一层,两层都得拆——只加其中一个,长跑命令仍然全程无输出,直到进程结束才一次性吐出。
|
||||
RUN := PYTHONUNBUFFERED=1 conda run --live-stream -n $(ENV)
|
||||
|
||||
install:
|
||||
$(RUN) pip install -e ".[dev]"
|
||||
|
||||
# lint 带 --fix 会改工作区,check 只读。CI 用 check,人手修用 lint。
|
||||
lint:
|
||||
$(RUN) ruff check src/ tests/ --fix
|
||||
$(RUN) lint-imports
|
||||
|
||||
format:
|
||||
$(RUN) ruff format src/ tests/
|
||||
|
||||
check:
|
||||
$(RUN) ruff format --check src/ tests/
|
||||
$(RUN) ruff check src/ tests/
|
||||
$(RUN) lint-imports
|
||||
|
||||
test:
|
||||
$(RUN) pytest
|
||||
|
||||
ci: check test
|
||||
Reference in New Issue
Block a user