# Certd 开发 Agent 上下文 进入仓库后先读本文。本文同时包含常驻规则、仓库地图、常用入口和验证命令;不要依赖分散规则文件。 思考时也要使用中文。 ## 项目定位 Certd 是可私有化部署的 SSL/TLS 证书自动化管理平台,提供 Web 管理台和后端服务,用于证书申请、续期、部署、监控、通知和开放 API 集成。 核心模型是“证书流水线”: - 通过 ACME 申请证书。 - 完成 DNS-01、HTTP-01、CNAME 代理或服务商验证。 - 导出 pem、pfx、der、jks、p7b 等证书格式。 - 部署到主机、Nginx、Kubernetes、CDN、云厂商、面板等目标。 - 通知用户,并监控站点证书过期时间。 系统会保存证书、云厂商凭据、SSH 信息、API Key 等敏感数据。始终按私有化/本地部署产品处理,避免泄露本地数据和配置。 ## 仓库边界 - 根仓库是 pnpm + lerna monorepo;不要引入 npm/yarn lockfile。 - `packages/pro/` 是独立 Git 工作区;修改商业版代码后,必须在 `packages/pro` 内单独执行 `git status` / `git diff`。 - 不要把 `packages/ui/certd-server/data/`、`logs/`、生成的 metadata/dist 等运行时或构建产物纳入改动,除非任务明确要求。 - 例外:分析插件动态依赖时,可以只读查看后端数据目录下的 `./data/.runtime-deps`;该目录用于 runtime-deps 动态安装第三方 SDK,不应纳入提交。 核心包: - `packages/ui/certd-server`:后端服务。 - `packages/ui/certd-client`:前端 Web 管理台。 - `packages/core/pipeline`:流水线核心。 - `packages/core/acme-client`:ACME 客户端。 - `packages/plugins/plugin-lib`:插件共享能力。 ## 仓库地图 - `package.json`:根脚本与 workspace 元信息。 - `pnpm-workspace.yaml`:workspace 匹配规则,包含 `packages/**`、`packages/ui/**`。 - `lerna.json`:lerna-lite 配置。 - `docs`:VitePress 文档站。 - `docker`:Docker 安装和运行相关文件。 - `packages/core/acme-client`:ACME 协议客户端。 - `packages/core/basic`:共享基础工具。 - `packages/core/pipeline`:流水线核心抽象、插件模型、执行上下文。 - `packages/libs`:共享集成库。 - `packages/plugins/plugin-lib`:证书、DNS Provider、格式转换等插件共享能力。 - `packages/plugins/plugin-cert`:证书插件包入口。 - `packages/ui/certd-server`:后端 Midway 服务。 - `packages/ui/certd-client`:前端 Vue/Vite 管理台。 - `packages/pro`:商业版独立 Git 工作区,需在该目录内单独检查状态。 常见运行时或生成产物: - 根目录:`node_modules`、`logs`、`output`、`lerna-debug.log`、`tmp-certd-client-vite*.log`。 - 后端:`packages/ui/certd-server/data`、`packages/ui/certd-server/logs`。 - 后端动态依赖:`./data/.runtime-deps`,常见于阿里云 SDK、腾讯云 SDK 等插件第三方依赖。 - 各包:`dist`。 - 插件:metadata/yaml 导出结果。 ## 常用验证 - 前端改动文件格式化:`packages\ui\certd-client\node_modules\.bin\prettier.cmd --write `。 - 前端改动文件 ESLint 修复:`packages\ui\certd-client\node_modules\.bin\eslint.cmd --fix `。 - 后端单元测试:`cd packages\ui\certd-server && npm run unit`。 - 后端改动文件 lint fix:`cd packages\ui\certd-server && npm run lint`。 - 其他package lint fix:`cd packages\xxx\xxxx && npm run lint`。 ## 通用工作规则 - 先读本文,再按任务读取具体代码或技能文件。 - PowerShell 读取中文、Markdown、locale、文档类文件时使用 `Get-Content -Raw -Encoding UTF8`;仍乱码时先执行 `[Console]::OutputEncoding = [System.Text.UTF8Encoding]::new()`。 - PowerShell 中用 `rg` 搜索含引号、括号、反斜杠的 pattern 时,优先用单引号包裹整个 pattern,例如 `rg 'await import\("tencentcloud-sdk-nodejs' packages/ui/certd-server/src -g '*.ts'`。 - 手工编辑或创建文件时优先使用 `apply_patch`。单个文件内有多处不连续改动时,拆成多个独立的 `*** Update File` 块,每块只改一处附近上下文;不要在同一个 update hunk 里强塞多个 `@@`。 - 只有真正机械化的大批量替换、格式化或生成任务才考虑脚本/工具。若必须使用临时脚本,应放在临时目录并在同一个受控步骤内完成创建、执行、删除;不要把临时脚本落在仓库里跨多步工具调用执行。 - 不要主动运行 `pnpm install`;缺依赖、TTY、网络导致安装或测试失败时,停止尝试并说明环境问题。 - 优先沿用现有模块、插件、service、页面模式;不要为形式上的复用制造过度抽象。 - 代码可读性优先于短写法。复杂条件、三元表达式、链式调用、内联对象和多层 helper 调用要拆成命名清晰的中间变量或小方法。 - 方法调用链不要直接塞进另一个方法参数;先用有意义的局部变量承接返回值,再传入下一步。 - 不要在单一表达式内嵌套分支、对象构造与方法调用。优先使用清晰的 `if/else` 分支;仅在确实能降低复杂度时才提取有意义的中间变量,避免为拆分而增加阅读跳转。 - 注释优先使用中文,尤其是业务规则、兼容逻辑、协议细节和隐藏风险;文件已有英文风格或引用外部术语时可保持一致。 - 遵守 DRY 和单一职责;第三次出现的业务规则、字段转换、权限判断、Repository 选择、事务传播、金额计算等逻辑,应优先抽成合适 helper 或 service 方法。 ## 测试与验证 - 务必写单元测试,覆盖主要业务逻辑。 - 实现新功能或修复行为缺陷前,优先补单元测试并先确认红灯,再实现并跑聚焦验证。 - 确实不适合先写测试时,在回复中说明原因和替代验证方式。 - 后补单元测试时,按正确行为写预期;若红灯需要修改既有实现,先向用户确认这是 bug 还是既有需求,避免未经确认改变行为。 - 后端纯单测放在 `src/**/*.test.ts`,尽量与被测文件相邻;`test:unit` 只跑这些文件,构建/打包应排除 `*.test.ts`。 - 单测需要 mock ESM 静态 import 时,优先使用 `esmock`,不要为了测试改业务代码结构。 - 各包 `test:unit` 脚本应显式设置 `NODE_ENV=unittest`。 - 单包单测优先用 `cd <包目录> && npm run test:unit`,例如 `cd packages\ui\certd-server && npm run test:unit`。 - 优先对改动包运行聚焦测试或格式化/ESLint;只有跨包影响明显时再考虑更大范围构建。 ## 后端规则 - 后端主包是 `packages/ui/certd-server`,使用 Node.js、ESM、TypeScript、MidwayJS 3、Koa、TypeORM 和 SQL 迁移。 - 做后端任务时,先定位 `packages/ui/certd-server/src/modules` 下的模块,以及相关 entity/service/controller。 - 表结构变更必须添加或更新 `packages/ui/certd-server/db/migration/*.sql`;不要依赖 TypeORM 自动同步。 - 文件上传接口 `/basic/file/upload` 返回临时 key;业务保存前必须调用 `FileService.saveFile(userId, key, "public" | "private")` 转成永久 key,不能直接保存 `tmpfile_key_...`。 - 方法参数超过 3 个时,优先改为对象参数。 - 事务链路方法统一用 `method(ctx, req)`,`ctx` 放第一位并承载 `manager?: EntityManager`,业务参数放 `req` 对象。 - 只有需要事务传播时才定义 `ctx`;普通查询、纯函数和简单私有方法继续使用明确参数。 - 需要按事务上下文取 Repository 时,用 `BaseService.getRepo(ctx, EntityClass)`。 - 需要“有事务则复用、无事务则开启”时,用 `BaseService.transactionWithCtx(ctx, callback)`。 - 基础 CRUD 数据访问优先复用 `BaseService` 的 `find`、`findOne`、`list`、`page`、`update`、`deleteWhere` 等方法;不要从 `repository.createQueryBuilder()` 开始重复实现完整查询或更新。仅将关键词组合筛选、联表、业务排序等基类无法表达的部分放入 `list/page` 的 `buildQuery`。 - 拼接可选 `projectId` 查询条件时,**必须**使用 `BaseService.buildUserProjectQuery(userId, projectId)`,禁止直接写 `{ userId, projectId }`。因为 `projectId` 可能为 `null`/`undefined`,直接放入查询会生成错误的 `WHERE projectId = NULL` 条件。 - `ctx` 类型复用 `BaseService` 导出的 `ServiceContext`。 - 新增 service 方法避免与 `BaseService` 方法签名冲突,例如不要用 `delete(id)` 覆盖 `delete(ids, where?)`;改用 `deleteById` 等具体名称。 ### 后端地图 - `packages/ui/certd-server/bootstrap.js`:Midway 启动入口,使用 `@midwayjs/bootstrap`。 - `packages/ui/certd-server/src/configuration.ts`:Midway 主配置,注册组件和全局中间件。 - `packages/ui/certd-server/src/config/config.default.ts`:端口、HTTPS、静态文件、cron、TypeORM、Flyway、上传、JWT、Swagger 默认配置。 - `packages/ui/certd-server/src/config/loader.ts`:读取 `.env`、`.env..yaml`,支持 `certd_` 前缀环境变量覆盖嵌套配置。 - `packages/ui/certd-server/src/modules`:业务模块根目录,常见模块包括: - `basic` - `cert` - `cname` - `cron` - `login` - `monitor` - `open` - `pipeline` - `plugin` - `suite` - `sys` - `packages/ui/certd-server/src/controller`:API 入口,按 `basic`、`user`、`sys`、`openapi` 分组。 - `packages/ui/certd-server/db/migration`:SQL 迁移目录;TypeORM `synchronize: false`,表结构变更必须配套迁移 SQL。 - 后端测试使用 Mocha + Node `assert/strict`;纯单测放在 `src/**/*.test.ts`,可参考 `src/utils/random.test.ts`、`src/controller/basic/app-controller.test.ts`、`src/modules/pipeline/service/pipeline-service.test.ts`。 ## 前端规则 - 前端主包是 `packages/ui/certd-client`,使用 Vue 3、Vite、TypeScript、Ant Design Vue、Fast Crud、Pinia、vue-router、vue-i18n。 - 做前端任务时,先定位 `packages/ui/certd-client/src/views/certd` 下的页面,再找对应 `src/api`。 - 不要运行前端 `pnpm tsc` / `vue-tsc`;当前 `vue-tsc@1.8.27` 会抛无效内部错误。前端 `test:unit` 只是占位脚本,也不要跑。 - 前端 TS/Vue/locale 改动后,只对本次改动文件运行现有 Prettier / ESLint:`packages\ui\certd-client\node_modules\.bin\prettier.cmd --write ` 和 `packages\ui\certd-client\node_modules\.bin\eslint.cmd --fix `。 - 列表管理、后台管理、记录查询、CRUD 表格页面优先使用 Fast Crud;开发或重构前读 `.trae/skills/fast-crud-page-dev/SKILL.md`。 - 只有轻量只读展示、强交互自定义界面或既有页面模式明显不适合 Fast Crud 时,才手写 `a-table` / 自定义列表,并在回复中说明。 - 内嵌 Fast Crud 时,外层必须有稳定高度或完整 `flex: 1; min-height: 0` 链路。 - 前端组件样式统一写在 `