Skip to content

架构待办事项

基于 ADR 实现差距 + 行业调研对比,梳理架构层面剩余工作。按优先级 P0-P3 排列。


P0 — 阻塞项(必须尽快解决)

#事项来源工作量说明
1CI/CD 流水线ADR 0009✅ 已完成.github/workflows/ci.yml 就位:turbo boundaries → affected lint/types:check/test → syncpack → server 构建(admin 构建经 DOTENVX_KEYS_FILE secret 解密 env 后启用)。commit 级(commitlint)+ push 级(pre-push:boundaries/types:check/syncpack)+ CI 级门禁齐备
2共享包测试ADR 0009 / 0015✅ 已完成(2026-08-08)@walnut/utils 5 个测试文件(queue 去重/清理语义、regex 正负例、crypto transformer 三套往返、persistent sync/async 加密包装);@walnut/contract 快照测试(12 组契约快照:wire format、错误码、角色、路由、socket 事件等 + API 表面)。contract 补 test 脚本与 vitest 配置,CI 的 affected test 自动覆盖
3前端构建修复ADR README 遗留✅ 已解决 2026-08-08。三个根因:(1) env 文件缺失——正确流程是 pnpm setup-env(dotenvx 从 env-encrypted/ 解密,需根 .env.keys);(2) root overrides 把 lru-cache 全局强制为 v11(ESM-only),破坏 workbox-build 的 CJS 依赖链(_lruCache is not a constructor)——已移除 override;(3) optimizeDeps.include: Object.keys(dependencies) 把 workspace 包列入预构建导致 @walnut/types 等解析失败——已过滤 @walnut/*。另修复 ~build/package 失效 import 及 tsbuildinfo 增量缓存掩盖的 6 处既有类型错误

P1 — 高收益(有明确的效率/质量提升)

#事项来源工作量说明
4Turbo Remote Cache行业调研❌ 已决定不接入(2026-08-08)。单人维护 + CI 规模小,单机缓存足够。globalPassThroughEnvTURBO_TOKEN/TURBO_TEAM 透传保留,未来接入零配置
5部署流水线ADR 0008✅ 已完成(Docker 方案)deploy.yml 已重写为 Docker 三镜像(backend/nginx/frontend)→ TCR → 服务器 docker compose pull && up -d,前端部署含 nginx-brotli 基础镜像。非 SCP 老方案,文件内"需要重新设计"TODO 已随重写移除
6commitlint行业调研enforce conventional commit 格式。✅ 已完成 2026-08-08(commit 029eb2b ——@commitlint/cli + config + commit-msg hook 已就位,Changesets + git-cliff 依赖的 commit message 规范已保障
7Changeset Bot行业调研GitHub App,PR 中自动提醒缺少 changeset。一次安装,零维护

P2 — 锦上添花(改善体验)

#事项来源工作量说明
8Docker 多阶段构建行业调研✅ 已完成apps/server/Dockerfileapps/admin/Dockerfiledeploy/nginx/Dockerfiledeploy/docker-compose.yml 均存在,作为 P1-5 部署方案的落地方案(Docker + TCR + compose)
9syncpack行业调研强制 workspace 中同类依赖版本一致。✅ 已完成 2026-07-30
10Codecov / 覆盖率报告行业调研PR 上自动评论覆盖率变化。免费,依赖 P0-2 测试先落地
11GitHub Environments行业调研多环境部署(staging / production),按环境隔离 Secrets。当前 deploy.yml 用 workflow_dispatch 的 inputs 模拟环境选择,未使用原生 environment: 机制

P3 — 远期(当前不做)

#事项来源原因
12Zod 替换 class-validatorADR 0016工程量巨大(100+ DTO 类,6 个子系统)。评估已完成,暂不迁移
13E2E 测试(Playwright)行业调研优先覆盖单元+集成测试。E2E 在测试体系稳定后再加
14Vitest 共享 preset行业调研理由已过时,重新评估
15oxlint / biome行业调研都不支持 Vue SFC。等支持后再加为 ESLint 的快速第一道扫描

ADR 0017 遗留(Package 重组收尾线)

ADR 0017 Phase 1(目录重组 + 既有包迁移)+ Phase 2.1/2.3(contract 共享常量)已完成。以下为剩余项:

#事项状态说明
A1旧目录残留清理✅ 已完成旧平铺目录(packages/{axios,client,contract,eslint-config,utils})零文件,9 个包全部在新分组(platform-any/platform-web/tooling)下(2026-08-08 清理并核实)
A2walnut 标签补齐✅ 已完成9 个包全部带 walnut 字段(platform/type/runtime)(2026-08-08 完成并核实)
A3turbo boundaries 升级✅ 已完成turbo.json boundaries 已含 platform-any/platform-node 维度(any/web/node deny 规则)(2026-08-08 完成并核实)
A4@walnut/client vue-router 死依赖✅ 已完成vue-router 依赖声明已移除(2026-08-08,见执行记录);现 client 的 vue/pinia 也已移入 peerDependencies
A5Phase 2.2 API 路由迁移🔄 渐进式✅ admin 侧 30 处静态硬编码 URL 全部迁移到 @walnut/contract/routes(2026-08-08)。剩余 11 处为带参动态模板字符串(device 子路由等)与 server 侧 44 个 controller 的同步,留待渐进
A6Phase 2.4 server 死依赖决策✅ 已完成✅ 2026-08-08 确认 server 0 处 import @walnut/utils,按 ADR 评估结论(libs/utils 迁移已跳过)移除依赖声明
A7Phase 3.1 @walnut/ui🔄 POC 完成✅ 2026-08-08 创建 packages/platform-web/ui/,迁入 Switch/DynamicTags/TimePicker 验证模式:naive-ui peerDependency、显式 import naive 组件、WalnutAdminComponentResolver 增扫 package 路径、Form/src/types.ts 类型改从 @walnut/ui/* 导入。lint/types:check/boundaries 全绿。剩余 22 组件(含依赖链复杂的 Button/Card/Form/Table)待批量迁移,需处理跨组件相对 import 与 app store 依赖注入
A8Phase 3.2 @walnut/i18n❌ 待做locale bootstrap + 状态机 + naive locale 映射。需定义 LocaleFetcher/LocaleCache DI 接口
A9Phase 3.3 @walnut/security❌ 待做URL 加密 guard + sign interceptor crypto + VerifyAuth 类型。需定义 SignProvider/CryptoKeyProvider/VerifyAuthHandler DI 接口
A10Phase 3.4 store 工厂迁移🔄 半完成createWalnutStore() 已进 @walnut/client(commit dec4619),但 admin 24 个 store 文件 0 处使用,未逐个迁移
A11Phase 4 自动导入迁移❌ 待做迁入 package 的代码中隐式全局变量改为显式 import;更新 auto-import / component resolver 指向新包

架构优化池(2026-08-08 review 新增)

全仓 review 发现、但非阻塞的优化候选。按收益排序,随手可做。

#事项说明工作量
R1peers 版本错位治理✅ 已完成(2026-08-08)peerDependencyRules.allowedVersions 豁免 5 项(@swc/cli、chokidar、class-validator、typescript、vite——均为仓库显式选用新版本、上游 peer 未跟进),pnpm peers check 恢复零告警
R2knip 豁免清单裁剪ignoreDependencies 已膨胀至 80+ 条集中豁免,掩盖真实死依赖、维护成本高。建议按包拆分豁免并周期性清理(08-08 批次已清过一轮,仍可继续)
R3root eslint 换 base preseteslint.config.mjs 用 vueConfig 但只 lint mjs/json/yaml/scripts,用 base preset 更贴切、更快
R4根 tsconfig.json 接入类型检查根 tsconfig 覆盖 scripts/ 但无任何脚本执行它(types:check 只跑 turbo 包任务)。建议加 types:check:root: tsc -p tsconfig.json 并入 pre-push/CI
R5AGENTS.md 重写✅ 已完成(2026-08-08)。根 AGENTS.md 重写为分发式导航文档(结构 + 命令 + 关键纪律),权威信息指向 CLAUDE.md 与架构文档,避免再次漂移
R6only-allow 加入 devDepspreinstall 里 npx only-allow pnpm 每次安装走网络拉取;加入 devDeps 并用 pnpm exec only-allow pnpm(packageManager 字段 + corepack 已兜底)
R7TS 7 / tsgo 迁移准备tsconfig.base.jsonignoreDeprecations: "6.0" 一刀切静音了通往原生编译器(tsgo)的迁移信号。建议列出实际触发的弃用项逐个决策,为 TS 7 铺路
R8@walnut/types exports 结构该包只有 ./* 子路径导出、无根 "."types 字段,消费方必须写 @walnut/types/xxx;评估是否补根导出
R9turbo preview 任务✅ 已修复(2026-08-08):根 preview: turbo preview 脚本曾指向未定义任务(turbo 报 Could not find task),已在 turbo.jsonpreview 任务(persistent + ^build)
R10CI affected 空集行为验证turbo run test --affected 在受影响集全为无 test 脚本的包(admin/docs/contract/types/http/ui)时是否报 "No tasks were executed" 失败——需实测确认 CI 矩阵的健壮性
R11文档漂移清扫apps/server/CLAUDE.md(pm2 脚本已删、pnpm typechecktypes:check、TS 5.9 → 6.0.3)、apps/docs/CLAUDE.mdpnpm format 不存在)等入口文档与现状的落差;本轮已修 server/docs 两处,其余(.claude/、.zcode/ 等)待查

执行记录

日期完成项
2026-08-08共享包测试 + peers + AGENTS:① P0-2 完成——@walnut/utils 5 个测试文件(queue/regex/crypto-transformer/persistent sync+async,20+ 用例)、@walnut/contract 12 组契约快照测试(防止错误码/路由/wire format 静默破坏)+ test 脚本与 vitest 配置;② R1 完成——peerDependencyRules.allowedVersions 豁免 5 项 peers 错位(@swc/cli、chokidar、class-validator、typescript、vite),pnpm peers check 零告警;③ R5 完成——根 AGENTS.md 重写为分发式导航文档(原文件自标过时、描述合并前单包结构)
2026-08-08文档配套 + 优化池:① A4 表格勾选(执行记录早已完成,表格漏更);② P1-4 Remote Cache 标记为已决定不接入;③ P3-14 Vitest preset 理由更新(4 包 → 12 包);④ 新增"架构优化池"R1-R11(peers 错位、knip 裁剪、root eslint base、types:check:root、tsgo 准备等);⑤ 修复 turbo preview 任务缺失(root 脚本指向未定义任务);⑥ release.md/index.md 的 fixed 组更新为 9+3;eslint.md 同步 pre-push/boundaries 与 lint-staged;turbo.md 补 preview 任务与 Remote Cache 决策;env-management.md 补 CI secret 用法;server/docs 的 CLAUDE.md 过时点修复
2026-08-08架构 review 第三批:① @walnut/clientvue/pinia 从 dependencies 移入 peerDependencies(与 @walnut/ui 对齐,防双实例)+ devDependencies 补供本包解析;② DOM lib 下沉:tsconfig.base.jsonlib: ["ESNext"]、移除 typeRoots,DOM/DOM.Iterable 下沉到 admin/docs/platform-web/*,platform-any 不再可见 DOM 全局;③ server strict: true(保留 strictPropertyInitialization: false)——tsc 零错误;④ 清理 6 处残留空导入 import { } from '@walnut/contract'(contract 无 declare global,无副作用职责);⑤ changesets fixed 组补齐 @walnut/release/@walnut/commitlint-config;⑥ build:stage 升级为独立 turbo 任务,废除 turbo build -- -- --mode stage 三重 -- 透传(透传参数会泄漏给全图任务);⑦ lint-staged 删除无效的 *.md 条目(eslint preset 关闭 markdown 后该条目静默无效)
2026-08-08架构 review 第二批:① turbo dev/test 任务接入 dependsOn: ["^build"]——修复 fresh clone 下 dev:server 因 contract/utils CJS dist 缺失(gitignore)而 MODULE_NOT_FOUND 的问题(ADR 0002 的 require 链路);② turbo boundaries 接入 pre-push 与 CI 门禁(此前无任何 gate,root 新增 boundaries 脚本);③ CI workflow 落地(P0-1 ✅:boundaries → affected lint/types:check/test → syncpack → 构建,admin 构建按 secret 存在与否自动启用);④ 根 clean:all glob 修复(packages/*/node_modules 匹配不到两层嵌套目录,补 packages/*/*/node_modules);⑤ @walnut/eslint-config 补 lint/lint:fix/types:check 脚本(此前该包代码从未被 lint);⑥ `apps/admin
2026-08-08架构 review 修复批:① 修复 production/stage 缺失 USER_ID_ENCRYPTION_KEY/USER_ID_HASH_SALT(validation fail-fast → 生产启动失败 bug,密钥与 development 对齐并重新加密);② 根 pnpm test 可用(修复 server vitest 配置路径错误——配置在 apps/api/ 子目录而脚本在包根跑、修复 smoke test 的 I18nService 依赖、utils/client --passWithNoTests、client 补 jsdom);③ knip 假门禁修复:knip:packages/appspackages/* glob 匹配不到两层目录改为 ./packages/*/*(此前静默空操作),清理 ~build/* 死 paths 与 8 条死 ignoreDependencies,全仓/包级 knip 加 8GB NODE_OPTIONS 防 OOM,移除真死依赖(client nanoid、admin lru-cache、docs dayjs、server pm2 脚本);④ server jest/ts-jest/ts-loader/ts-node/tsconfig-paths/@types/jest 残留清理(vitest 时代死配置,spec 改显式 vitest import,tsconfig types 删 jest);⑤ git-cliff 残留清理(release.test.ts 标题、knip ignore、文档引用);⑥ 根 scripts NODE_OPTIONS= 前缀统一改 cross-env(Windows cmd 兼容),admin lint 同修
2026-08-08PWA 移除:删除 vite-plugin-pwa + workbox-window + @vite-pwa/assets-generator 及全部相关代码(插件、注册、ReloadPrompt、store、图标、env schema)。原因:workbox-build 传递链问题多(lru-cache CJS 崩溃、高危漏洞、precaching 陈旧内容),后台场景价值有限。如未来需要 PWA 可考虑 Serwist 或自研轻量 SW
2026-08-08构建与 dev 验证:P0-3 解决(env 解密流程 + lru-cache override + optimizeDeps 过滤);修复 tsbuildinfo 掩盖的 6 处既有类型错误(Table/ApiSelect/CountryCallingSelect);pnpm build:admin 成功;dev 前端(3100)+ dev 后端(3000,连 MongoDB/Redis)均启动验证通过,端口已清理
2026-08-08ADR 0017 收尾批次:A1 旧目录残留清理;A2 6 包 walnut 标签补齐;A3 turbo boundaries 升级为 platform 维度(any/web/node)+ 修复 10 处 ~build/package 失效 import + 清理 utils-core 残留 types;A4 client 移除 vue-router 死依赖 + easy-fns-ts 依赖分类修正;A5 admin 30 处硬编码路由 → contract;A6 server 移除 @walnut/utils 死依赖;A7 @walnut/ui POC(3 组件)。lint 9/9 + types:check 9/9 + boundaries 零违规
2026-08-08文档同步:commitlint (P1-6) 实际已完成;新增 ADR 0017 遗留收尾线 (A1-A11)
2026-07-30syncpack (P2 #9) — 依赖版本一致性检测接入
2026-07-29P0 剩余 3 项未完成

相关文档

基于 MIT 许可发布