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 倍

删除波次(按顺序执行)

  1. Wrapper 折叠(预期插件 delta:-400 到 -600):替换插件本地 wrapper 返回为直接读取 ResolvedChannelMessageIngress
  2. 共享结果 helper(预期 -200 到 -350):通用分类器,需同时迁移至少三个插件
  3. Route 描述符构建器(预期 -200 到 -350):目标:Google Chat、IRC、MS Teams、Nextcloud Talk
  4. Turn 组装共享(预期 -250 到 -450):目标:QA Channel、IRC、Nextcloud Talk、Zalo
  5. Core 重新打包(预期 core delta:-300 到 -700)
  6. 测试裁剪(预期 -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 覆盖

相关页面