@contracts 首版(§8.1 九个文件): - id 品牌 ID / terminal 终态五名与归侧四标签 / envelope 信封六字段与四类事件 - card 工单两模式 + 对话卡族(形状对齐 2026-07-26 原型定稿) - contract7 契约七件 / ledger 三级寻址与写三分 / process-package 流程包 DSL 与触发器三类 - manifest 活动包清单六区(含 CMMN·DMN·步序声明的资产形状)/ org / api 路由契约 模块(L1): - event 信封存储、归属解析三级短路、投递五诺、监听注册表、三级消费裁定 - ledger schema 自生长(最大化合并/最宽类型/只增不破坏)、任务视图叠加、写三分、冲突检查 - org 岗位授权(客体三类×动作三种)、停用前置检查、会话、种子播种 - llm 四元绑定、ModelGateway 三模式(live/record/replay)—— 两缝之一 app 装配:Hono 服务 + 鉴权中间件 + 治理台/工作台路由;drizzle 迁移;AES-256-GCM 凭证密封 ADR-007 工具链与门禁 · ADR-008 投递队列 · ADR-009 凭证加密 (ADR 编号自 007 续:编码规范 §14 已用到 006,README 写「从 005 续」是笔误) 门禁五道全绿;96 个测试通过,含对真实 PG 的 ledger 集成测试 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01KeDBx2PHLavbURXB8LJJ7m
35 lines
2.5 KiB
Markdown
35 lines
2.5 KiB
Markdown
# ADR-007 · 工具链与门禁的落地形态
|
|
|
|
- 状态:已决(M0)
|
|
- 日期:2026-07-27
|
|
- 上下文:编码规范 §11 规定五道门禁(tsc / eslint / depcruise / api-report / test)必须存在且可执行,
|
|
但未规定 TypeScript 的运行与产出形态。§1 表内已定案的构建件只有 Vite(前端)与 tsup(§8.2 活动编译预设)。
|
|
|
|
## 决定
|
|
|
|
1. **后端不引新的 TS 运行器**。`apps/api` 以 **tsup**(§8.2 已定案的表内件,esbuild 内核,原生解析 tsconfig `paths`)
|
|
打包为 ESM 后由 Node 22+ 直跑;开发期 `tsup --watch --onSuccess node dist/main.js`。
|
|
不引入 `tsx` / `ts-node` / `swc` 等表外依赖(§12.5#3)。
|
|
2. **tsc 分两个工程**:`tsconfig.node.json`(api / packages / activities / tools,lib ES2023)与
|
|
`tsconfig.web.json`(web / ui-kit,lib DOM + jsx)。二者共享 `tsconfig.base.json` 的严格开关与
|
|
§11.1 规定的 `paths`。根 `tsconfig.json` 只做 solution 引用。
|
|
理由:一份 tsconfig 同时挂 DOM 与 Node 全局会让 §9.2「组件内禁裸 fetch」之类的门禁失去类型依据。
|
|
3. **契约快照的范围**(`tools/api-report.mjs`):`tsc --emitDeclarationOnly` 出全量声明后,
|
|
**只保留契约面**落 `api-report/` —— `packages/contracts/**`、各 `packages/<pkg>/src/index.d.ts`、
|
|
各 `apps/api/src/modules/<m>/{index,contract,port}.d.ts`。
|
|
由此「改 `internal/` 时 api-report 纹丝不动」(§11.5)成立。
|
|
配套纪律:模块出口的公开签名必须由 `contract.ts` / `port.ts` 的显式类型承载,
|
|
不得依赖 `internal/` 的推断类型泄漏(由 `explicit-module-boundary-types` 在 modules/ 下强制)。
|
|
4. **§11.2 的解析层封装**采用双保险:每个后端模块带 workspace `package.json`(`exports` 只开 `index.ts`),
|
|
同时保留 §11.1 的 `@modules/*` 路径别名;穿透 `internal/` 的拦截由 ESLint `no-restricted-imports`
|
|
与 depcruise `no-cross-module-internal` 两道机检承担(§11.3 / §11.4)。
|
|
5. **tier-order 生成物入库**:`tools/depcruise-tiers.generated.cjs` 由 `tools/gen-depcruise-tiers.ts`
|
|
从 `tools/module-tiers.json` 生成并提交,`pnpm gates` 首步重新生成 —— 层级表与门禁的漂移在 diff 上可见。
|
|
|
|
## 后果
|
|
|
|
- 表外依赖为零;门禁全部可离线执行。
|
|
- 后端产物是打好的 bundle,栈帧靠 sourcemap 还原。
|
|
- `no-orphans` 对契约面(`index` / `contract` / `port`)、`app/`、`activities/`、`tools/` 与测试放行——
|
|
这些是合法的无入边文件;其余孤儿一律 error。
|