Ingress 重构的健康标准:core 集中化只有在捆绑插件生产代码变小、旧第三方 SDK 兼容性被隔离到 SDK/core shim 时才算成功。
目标运行时形态
bundled plugin event
-> 本地提取平台事实
-> 事实可用时解析一次共享 ingress
-> 基于通用 ingress 投影/结果分支
-> 本地执行平台副作用捆绑插件不应将 ingress 翻译回本地 AccessResult、GroupAccessDecision、CommandAuthDecision 等形状,除非该类型是公开插件 API。
代码预算
基于与 origin/main 的 merge-base 测量:
| 类别 | 当前 | 要求 |
|---|---|---|
| plugin production | +4,148 / -5,388 = -1,240 | ⇐ -1,500 |
| core production | +3,922 / -546 = +3,376 | ⇐ +1,500 |
| tests | +2,326 / -2,414 = -88 | ⇐ +1,000 |
| total | +11,142 / -8,367 = +2,775 | ⇐ +2,000 |
重新测量命令:
base=$(git merge-base HEAD origin/main)
git diff --shortstat "$base"
pnpm lint:extensions:no-deprecated-channel-access核心边界
Core 拥有通用策略:
- allowlist 规范化和匹配
- access-group 扩展和诊断
- pairing-store DM allowlist 读取
- route、sender、command、event、activation 门控
- admission 映射:dispatch、drop、skip、observe、pairing
插件拥有传输事实和副作用:
- webhook/socket/request 真实性验证
- 平台身份提取和 API 查询
- channel 特定策略默认值
- pairing 挑战投递、回复、ack、typing、媒体、历史
Core 必须保持 channel 无关:src/channels/message-access 中不得有 Discord、Slack、Telegram、Matrix 等特定内容。
接受规则
每个新 core helper 必须立即删除捆绑插件生产代码:
一个捆绑调用者 拒绝;保持插件本地
两个捆绑调用者 仅在插件生产 LOC 下降时接受
三个或更多调用者 插件删除量必须至少是新 core LOC 的 2 倍删除波次(按顺序执行)
- Wrapper 折叠(预期插件 delta:-400 到 -600):替换插件本地 wrapper 返回为直接读取
ResolvedChannelMessageIngress - 共享结果 helper(预期 -200 到 -350):通用分类器,需同时迁移至少三个插件
- Route 描述符构建器(预期 -200 到 -350):目标:Google Chat、IRC、MS Teams、Nextcloud Talk
- Turn 组装共享(预期 -250 到 -450):目标:QA Channel、IRC、Nextcloud Talk、Zalo
- Core 重新打包(预期 core delta:-300 到 -700)
- 测试裁剪(预期 -300 到 -600):删除仅断言已删除 wrapper 形状的测试
验证
pnpm lint:extensions:no-deprecated-channel-access
pnpm test src/channels/message-access/message-access.test.ts
pnpm plugin-sdk:api:check
pnpm config:docs:check退出标准
- 捆绑生产代码不导入已废弃的 channel-access 或 command-auth facade
- 兼容性代码隔离到 SDK/core seam
- 插件生产 LOC 相对
origin/main至少净减少 1,500 行 - core 生产 LOC ⇐ +1,500,或超出部分由总量 ⇐ +2,000 覆盖