agent.develop cb1132e6a9 fix(pbl_compiler): M3b RBAC 29条显式登记+CRUD只读拒绝端点+json根键统一+audit BinOp解析修复
- scripts/load_path.py: PATHS_CONTRACTS 20 条(含 M3b 5 个导出契约) + PATHS_READONLY_DENY 9 条
  = 29 条全显式登记,无通配符;与 wwwroot/api/*.dspy(29) 一一对应
- wwwroot/api/: 新增 9 个 CRUD 只读拒绝端点(create/update/delete × 3 表),
  封死 xls2ui 回退默认写入口,保 rules_hash 29.6 确定性指纹唯一写入路径
- json/*.json: 根级 browserfields 合并进 params,三文件统一 tblname/alias/title/params 根键集,
  editable 齐备 new_/update_/delete_data_url 且指向真实 .dspy
- scripts/audit_rbac_parity.py: 修复 PATHS = A + B (BinOp) 解析取空的自身缺陷(假 FAIL 根因),
  新增 json/ 根键白名单 + editable 三 URL + 幽灵/漏登记 检查
- pbl_compiler/init.py: 文件头注释登记条数与代码事实对齐(29=20+9)
- 实跑: audit_rbac_parity.py rc=0 PASS;test_m3b_mapping.py PASS=113/FAIL=0
2026-09-19 11:04:55 +08:00

80 lines
3.5 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""`load_pbl_compiler()` —— pbl_compiler 模块唯一挂载入口。
注册三处同步之 ③env.<契约名> = <契约名>(① 定义在实现文件,② 导出在 __init__.py
QC #2 整改M3a 轮api.py 的 15 个 Web 契约全部 env 注册。
QC #1 整改M3b 本轮CONTRACTS 由 15 → 20新增 rules_export_api.py 的 5 个
「第12章规则映射 / 导出 / game_definition 写入」契约,并导出 GD 规则写入器与纯映射
层函数(宿主应用与自测脚本可直接复用)。本文件的 CONTRACTS 是三处同步的唯一事实源:
· wwwroot/api/<契约名>.dspy 薄包装(一一对应,共 20 个)
· scripts/load_path.py PATHSRBAC 逐条显式登记,共 29 条 = Web 契约端点 20 + CRUD 只读拒绝端点 9无通配符
· __init__.py import + __all__
"""
from ahserver.serverenv import ServerEnv
from pbl_compiler.api import (
pbl_compiler_compile,
pbl_compiler_preview,
pbl_compiler_compare,
pbl_compiler_task_get,
pbl_compiler_task_list,
pbl_game_definition_get,
pbl_game_definition_get_by_blueprint,
pbl_compiler_verify_determinism,
pbl_compiler_version_register,
pbl_compiler_version_get,
pbl_compiler_version_list,
pbl_compiler_version_diff,
pbl_compiler_version_save,
pbl_capability_list,
pbl_capability_register,
)
from pbl_compiler.rules_export_api import (
pbl_compiler_export_rules,
pbl_compiler_rules_preview,
pbl_compiler_rules_diff,
pbl_game_definition_rules_get,
pbl_script_rule_list,
)
#: 契约名 → 实现单一事实源__init__.py 导出、env 注册、wwwroot/api/*.dspy、
#: scripts/load_path.py RBAC 四处都从这里派生,数量必须一致)
CONTRACTS = {
# —— M3a结构编译 / 任务 / GD 产物 / 确定性 / 版本 / 能力15——
'pbl_compiler_compile': pbl_compiler_compile,
'pbl_compiler_preview': pbl_compiler_preview,
'pbl_compiler_compare': pbl_compiler_compare,
'pbl_compiler_task_get': pbl_compiler_task_get,
'pbl_compiler_task_list': pbl_compiler_task_list,
'pbl_game_definition_get': pbl_game_definition_get,
'pbl_game_definition_get_by_blueprint': pbl_game_definition_get_by_blueprint,
'pbl_compiler_verify_determinism': pbl_compiler_verify_determinism,
'pbl_compiler_version_register': pbl_compiler_version_register,
'pbl_compiler_version_get': pbl_compiler_version_get,
'pbl_compiler_version_list': pbl_compiler_version_list,
'pbl_compiler_version_diff': pbl_compiler_version_diff,
'pbl_compiler_version_save': pbl_compiler_version_save,
'pbl_capability_list': pbl_capability_list,
'pbl_capability_register': pbl_capability_register,
# —— M3b第12章 event→condition→response → script_type=1 规则映射与导出5——
'pbl_compiler_export_rules': pbl_compiler_export_rules,
'pbl_compiler_rules_preview': pbl_compiler_rules_preview,
'pbl_compiler_rules_diff': pbl_compiler_rules_diff,
'pbl_game_definition_rules_get': pbl_game_definition_rules_get,
'pbl_script_rule_list': pbl_script_rule_list,
}
#: 模块名 → 表复数别名CRUD dspy 用复数名init.py 注册单复数两套,见规范 Pitfall
TABLE_ALIAS_DUAL = {}
def load_pbl_compiler():
"""挂载 pbl_compiler把 20 个契约注册到 ServerEnv 供 .dspy/.ui 直接调用。"""
env = ServerEnv()
for name, fn in CONTRACTS.items():
setattr(env, name, fn)
return 'pbl_compiler'