feat(门禁): 编号门禁 id-check 落地(36→37 钩子)+ 批 1 编号单词化改名
新增门禁本体 - scripts/check_ids.py:实现 docs/编号规范.md §8 八项校验;默认 warn-only, 唯一硬拦项是「可判定比例跌破基线」(防回退的本体) - scripts/id_registry.json:66 个前缀族,逐项来自 §4 总表 + 全库实测游标, 偏差一律写进 cursor_note,不凭记忆编造 - scripts/id_aliases.json:旧号 → 新号 / 作废标记(照搬 section_aliases.json 范式) - 顺带收编 check_test_traceability.py:正则补齐大写后缀与无模块码形态, 比对范围扩到 test/host 与 7 篇「单元测试说明.md」,另加 --board-only 回退旧口径 批 1 改名(用户授权解禁「不改写存量号」) - 代码规范条款 S1~S19 → CODE-RULE-nn:78 处 / 2 文件 - UI 像素回归状态 S0~S7 → MENU-STATE-nn:61 处 / 3 文件(冻结在 07) - 两族属主登记处 = 脚本自身的规则表 / STATES 表,文档只作引用方 - 新增 scripts/rename_ids.py(§7.3 规划脚本):映射表驱动、显式 scope、默认干跑、 自动写 scoped 别名,跳过 [示例]/[计划] 行与变更记录表,按原字节读写保 BOM 行尾 - 已应用映射表存档 scripts/rename_maps/batch1.json 作审计轨迹 有牙实测(证明门禁不是空转) - 注入 Z-99 / 裸形 / 悬空 / 越游标 / 未紧邻 / 跨文档重复定义 六例, 分别被校验 1/2/3/5/6/4 点名,--strict 退出码 1;临时档删除后工作树干净 验证与同步 - 可判定比例基线 82.3% → 82.7%(已 --update-baseline 入档);错误级 1312 → 1291 - ci_local.py 全绿(L0 + L0.5 共 1104 断言);ui-golden Passed; check_doc_links.py --all 无法判定 0 - 未改任何 C/H 源文件,故本次不需 @build - 文档:AGENTS.md 与 pre-commit使用说明.md 计数 36→37 并新增 §2.25 详解; 编号规范 §4.1 补两行、§8.1 落地记录、§8.2 规范与仓库偏差、§8.3 迁移批次记录
This commit is contained in:
@@ -43,8 +43,14 @@ REPO_ROOT = Path(__file__).resolve().parent.parent
|
||||
CODE_DIR = REPO_ROOT / "test" / "board"
|
||||
DOC_DIR = REPO_ROOT / "docs" / "测试说明"
|
||||
|
||||
# TC 编号:TC-<PFX>-<NNN>。<PFX> 允许字母数字(NET/GD5F/STO/RTC…)
|
||||
TC_RE = re.compile(r"TC-[A-Za-z0-9]+-\d+")
|
||||
# TC 编号:TC-<PFX>-<NNN>。<PFX> 允许字母数字(NET/GD5F/STO/RTC…)。
|
||||
# 2026-10-20 收编进 id-check 门禁时补的三条(docs/编号规范.md §8「顺带收编」):
|
||||
# ① 规范 §4.1 的合规形态 `TC-[A-Z]{1,4}-\d{3,4}[a-z]?`(带小写后缀,TC-NET-1502b);
|
||||
# ② 现存的大写后缀形态(TC-AI-01A [示例],§7.1 待统一小写)也要能抓出来,否则整条漏扫;
|
||||
# ③ 无模块码形态(iec104 的 TC-014/TC-104,§7.2 列为孤儿)纳入比对而不是静默忽略。
|
||||
TC_RE = re.compile(r"TC-(?:[A-Z][A-Z0-9]{0,4}-\d{1,4}[A-Za-z]?|\d{2,4}[a-z]?)")
|
||||
# 规范合规形态(用于 --verbose 里区分"形态待迁移"与"纯追溯断链")
|
||||
TC_CANON_RE = re.compile(r"^TC-[A-Z]{1,4}-\d{3,4}[a-z]?$")
|
||||
# 占位符前缀(文档模板里的 `TC-XXX-…`)不参与比对
|
||||
PLACEHOLDER_PREFIXES = {"XXX"}
|
||||
|
||||
@@ -80,13 +86,24 @@ def main():
|
||||
help="额外打印各前缀的 TC 计数")
|
||||
ap.add_argument("--code-dir", default=str(CODE_DIR))
|
||||
ap.add_argument("--doc-dir", default=str(DOC_DIR))
|
||||
ap.add_argument("--board-only", action="store_true",
|
||||
help="只比板级(test/board/*.c ↔ *_Test_Guide.md),"
|
||||
"不含主机侧单测一侧(2026-10-20 起默认纳入 7 篇「单元测试说明.md」)")
|
||||
args = ap.parse_args()
|
||||
|
||||
code_dir = Path(args.code_dir)
|
||||
doc_dir = Path(args.doc_dir)
|
||||
host_dir = REPO_ROOT / "test" / "host"
|
||||
|
||||
code_files = sorted(code_dir.glob("*.c")) if code_dir.is_dir() else []
|
||||
doc_files = sorted(doc_dir.glob("*_Test_Guide.md")) if doc_dir.is_dir() else []
|
||||
if not args.board_only:
|
||||
# 主机侧单测一侧:7 篇「单元测试说明.md」+ test/host 下的测试代码(*.c / *_test.py /
|
||||
# run_unit_test.py)——TC 编号在两侧都是**追溯链的锚点**,缺一侧就是断链。
|
||||
doc_files += sorted(doc_dir.glob("*单元测试说明.md"))
|
||||
if host_dir.is_dir():
|
||||
code_files += sorted(host_dir.rglob("*.c"))
|
||||
code_files += sorted(host_dir.rglob("*.py"))
|
||||
|
||||
if not code_files:
|
||||
print(f"[ERR] 未找到代码侧文件:{code_dir}/*.c", file=sys.stderr)
|
||||
|
||||
Reference in New Issue
Block a user