贡献指南
感谢参与 ACE。本文约定开发流程与代码规范。
环境
source scripts/env.sh # 每个 shell 必做:设 SDKROOT(MacOSX15.sdk)+ DYLD_LIBRARY_PATH(openssl@3),否则链接失败
cjpm build
cjpm test # 全 workspace 单测,提交前必须全绿
本机构建绕过(macOS 26 / cjc 1.1.0-alpha)与 stdx 预编译接入详见 CLAUDE.md。改 stdx 相关 cjpm.toml 前先读 doc/roadmap-m12-plus.md。
架构约束
- 零运行时反射:声明式能力一律用编译期宏生成等价显式代码,保留
--debug-macro可审计;不引入运行时反射/枚举。 - 内核 stdx-free:
ace-web/ace-router/ace-bodyparser/ace-framework-runtime不依赖 stdx;仅ace-http、ace-security、智能体 claude 层接触 stdx。新能力优先做成 stdx-free 可单测的 module。 - 小而组合:每个能力一个可单独引入的 module(高内聚、可单测);新增成员后加入根
cjpm.toml的[workspace].members。 - 能力皆中间件:横切关注点优先做中间件或专用方法宏,不做通用反射式 AOP。
工作流
- TDD:先写
*_test.cj(红)→ 实现(绿)→ 重构;纯逻辑(校验/解析/限流等)做成可单测纯函数,时间/IO 依赖以注入方式隔离(如RateLimiter注入nowMs、verifyJwtAt注入nowSec)。 - 宏特性:用
examples/di-demo(或新增 example)做端到端集成验证(宏消费需独立包,不便直接单测)。 - 构建/测试全绿:
cjpm test必须 0 失败再提交。 - 代码审查:横切/安全/宏改动建议过 code-reviewer。
编码规范
- 不可变优先:始终创建新对象,不修改入参;Bean 注入字段用
let。 - 小文件聚焦:200–400 行,函数 <50 行,嵌套 <4 层。
- 全面错误处理:
Option/Result/try-catch;不泄露敏感信息(错误响应统一脱敏)。 - 无硬编码密钥(走环境变量,如
ANTHROPIC_API_KEY)。 - 命名清晰,无遗留调试输出。
仓颉/宏踩坑(本仓库已踩)
- 宏生成多条语句必须
;分隔(否则 token 粘连);卫生命名用双下划线前缀(__ret/__b/__dto)。 ArrayList用.add、Tokens用.append;字符串按字节处理,字节字面量带u8后缀。- 闭包捕获并重新赋值
var不可靠 → 用引用类型累积(ArrayList)。 std.regex用 POSIX[0-9],不认\d。- member 目录名(
ace-router)≠ 包名(aceboot::router)时,用整cjpm test(或-m)。
提交信息
约定式提交:<type>: <description>,type ∈ feat/fix/refactor/docs/test/chore/perf/ci。简洁专业,不加签名/emoji。
版本
语义化版本;0.x API 未稳定。稳定性分级见 README.md →「版本与 API 稳定性」。