fix: DBNAME 硬编码规范归属 + develop 职责补应用脚手架

- module-development-spec: 加「模块取库名禁止硬编码 DBNAME」规范(用 ServerEnv().get_module_dbname()),
  修正过时的 Database Name Consistency Check(原暗示模块可硬编码 DBNAME)
- web-application-spec: get_module_dbname 示例改为应用级映射(勿写死 'dbname')
- agent.develop/role/SKILL.md: 职责区分应用级(产出应用脚手架)/模块级(产出Python包)
This commit is contained in:
yumoqing 2026-08-22 18:35:28 +08:00
parent 8c22f654ae
commit 59f77f1756
3 changed files with 14 additions and 2 deletions

View File

@ -150,6 +150,7 @@ Not all modules need tables/CRUD — `models/` and `json/` can be omitted entire
- **Mandatory**: use sqlor-database-module for all relational operations. Table definitions as `{tablename}.json` in models/; CRUD definitions as `{tablename_or_alias}.json` in json/.
- **Bulk xlsx→json conversion**: `scripts/xlsx2json_models.py` converts all `.xlsx` model files across Sage modules to JSON in one pass.
- **CRITICAL: 模块取库名禁止硬编码 DBNAME** —— 库名由宿主应用决定,不是模块自己写死。模块取库名统一用 `get_module_dbname('模块名')`.dspy 里直接调用,是 ServerEnv 注入的全局,无需 import`ServerEnv().get_module_dbname('模块名')`.py 模块文件里)。**禁止**在模块里写 `DBNAME = 'hrs6'` / `DBNAME = 'sage'` / `dbname = 'xxx'` 之类硬编码——同一模块可被多个应用挂载,各应用的库名不同,硬编码会查错库或 table-not-found。宿主应用在 `app/{appname}.py` 里定义 `get_module_dbname(m)` 并挂到 ServerEnv见 web-application-spec
### 4. Initialization Data (init/data.json or init/data.yaml — three formats)
@ -365,7 +366,7 @@ Run before EVERY commit touching .dspy; fix violations FIRST, then commit (do no
### CRITICAL: Database Name Consistency Check
When a module uses its own database (not `sage`), verify in THREE places: ① Python `init.py`: `DBNAME = "actual_db_name"` (not module name); ② app entry `global_func.py`: `get_module_dbname()` returns correct DB; ③ app entry `cms.py`: `get_module_dbname()` override correct. Pitfalls: `DBNAME = "entcms"` when actual DB is `"ocai_cms"` → all queries fail table-not-found; `global_func.py` returning `'sage'` → dspy queries wrong database.
模块取库名不硬编码,统一从宿主应用获取。验证点:① 模块内(.py`ServerEnv().get_module_dbname('模块名')`.dspy 里直接 `get_module_dbname('模块名')`(全局,无需 import——**不要**在模块里写 `DBNAME = "xxx"`;② 宿主应用 `app/{appname}.py` 定义 `get_module_dbname(m)` 返回模块 m 的真实库名,并在 init() 里挂到 ServerEnv`env.get_module_dbname = get_module_dbname`,见 web-application-spec③ 应用入口的 `get_module_dbname()` 返回值必须匹配实际库名。Pitfalls: 模块硬编码 `DBNAME = "entcms"` 而实际库是 `"ocai_cms"` → 所有查询 table-not-found应用 `get_module_dbname()` 返回 `'sage'` → dspy 查错库。
### Post-Deployment Testing (equally mandatory)

View File

@ -63,7 +63,10 @@ from appbase.init import load_appbase
from rbac.init import load_rbac
def get_module_dbname(m):
return 'dbname'
# 返回模块 m 对应的数据库名。库名由应用统一决定,模块禁止硬编码 DBNAME见 module-development-spec
# 实现方式:应用级「模块名 → 库名」映射,从 appbase params 表 / conf/config.json 读,或直接映射表。
# 例:单库应用所有模块返回同一主库名;多库应用按模块返回各自库名。勿写死 'dbname'/'hrs6'。
return module_dbname_map(m)
def password_encode(s):
if s is None:

View File

@ -7,7 +7,15 @@ capability: feature_dev_capability, bug_fix_capability
# 开发工程师develop角色定义
## 职责
### 应用级 developdesign 自动派生的「应用架构」任务)
- 产出**应用脚手架**`repos/{应用名}_app/` 应用仓库,含 `app/{应用名}.py`唯一入口init() 里 load 各模块)、`conf/config.json``build.sh`(一键部署)、`.env`
- `app/{应用名}.py` 里定义 `get_module_dbname(m)`(模块→库名映射,禁止硬编码)并在 init() 挂到 ServerEnv逐个 `load_{模块}()` 挂载业务模块
- **应用是唯一部署单元**:一个应用 = 一个入口 = 一个端口;模块不独立部署
### 模块级 developPM 按模块清单派发的「模块开发」任务)
- 按 design 阶段设计师的模块清单,为每个模块产出可运行源码,写入模块独立仓库 `repos/{模块名}/`
- 模块是 Python 包(无独立 app.py/端口/Dockerfile通过 `load_{模块}()` 挂到应用;取库名用 `ServerEnv().get_module_dbname('模块名')`,禁止硬编码 DBNAME
- 基础模块apppublic / sqlor / ahserver / accounting / appbase / rbac已存在直接复用不重新开发
## 应遵守的规范(开发前先 load_skill 加载对应全文,不要凭记忆瞎写)