Files
core/.trellis/tasks/09-29-external-libs/prd.md
T

78 lines
5.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Dever 外部 Lib 生态
## Goal
让 Dever Package 通过现有 Port/Adapter 边界安全复用 PyPI、npm、Go Modules 及后续其它语言生态。用户统一使用 `dever lib` 管理依赖,`dever run/build` 自动管理 Worker;业务源码不直接调用外语函数,也不接触语言工具链、环境变量或进程协议。
## Definitions
- **Package**:Dever 组件的发行单位,包含 `.dever` 业务源码并接受完整静态检查。
- **Lib**:PyPI、npm、Go Modules 等外部生态依赖。
- **Adapter**:Port 与 Lib 之间唯一合法的桥接层。
- **Worker**:运行外部 Adapter 的隔离进程,不是用户可调用的业务层。
## Requirements
### Language Boundary
- 外部 Adapter 继续属于 `module/<component>/<domain>/adapter`,完整实现同领域一个 Port。
- App 只调用 Port;Domain、Model、API、Job 不直接调用 Lib、Worker 或外部 SDK。
- `port.dever` 仍是输入、输出、failure、effect 和 schema 的唯一来源;不得从 Python annotation、TypeScript 类型或 Go 接口反向定义业务合同。
- 外部 Adapter 使用严格的 `external <ecosystem> <entry>` 声明,可包含 Lib 与 capability 声明;禁止任意 shell/build 命令。
- 普通 Dever Adapter、测试 Port fake 与现有运行时选择合同保持不变。
### Protocol And Lifecycle
- 所有语言共用一个版本化 Dever Component Protocol,而不是在编译器中增加 `python_call`、`go_call`、`js_call` 特例。
- 协议支持 handshake、schema identity、typed setting、call、result/error、cancel、health 和 shutdown。
- Worker 长驻并由结构化生命周期拥有;启动失败、崩溃、超时、取消和关闭均有界,不产生 detached 进程。
- 业务错误只能返回 Port 声明的 error variant;协议破坏、进程崩溃和非法输出成为安全 runtime fault,不自动重试。
### Dependency Management
- 用户命令为 `dever lib add/list/update/remove/doctor`;生态使用 `pip:`、`npm:`、`go:` 等明确前缀。
- 解析结果写入编译器生成的项目根 `dever.lock`,记录精确版本、传递依赖、内容摘要、runtime、目标平台和 Port schema identity。
- `dever.lock` 是可提交、不可手改的构建输入,不替代只负责部署配置和 Secret 的 `config/setting.json`。
- 只有显式 `lib add/update` 可以联网;`check/test/run/build` 默认离线且不得从用户 PATH 或环境变量选择语言 runtime。
- 首批正式生态是 `exec`、`pip`、`npm` 和 `go`;Maven、NuGet、Composer、Gem 通过同一扩展合同后续增加,不修改语言核心和协议。
### Security And Capabilities
- 外部源码不受 Dever 内部静态检查,因此默认无网络、项目外文件、子进程、设备和 GPU 权限。
- Adapter 必须显式声明所需 capability;声明参与 Port effect 的保守分析,并由 Worker sandbox 执行。
- Worker 只接收当前 Adapter 的 typed setting,不读取完整 `setting.json`;Secret 不进入日志、协议诊断或缓存身份明文。
- 安装脚本、路径、符号链接、归档解包和原生产物必须经过边界、摘要和所有权校验。
### Run, Build And Package
- `dever run` 从机器级 Dever 缓存准备并监督选中的 Worker,不要求用户手动启动服务。
- `dever build` 把所有可运行时选择的外部 Adapter、runtime 与锁定依赖封装进自包含应用;目标机器不需要 Python、Node、Go 或包管理器。
- 嵌入资源以内容摘要验证后释放到应用 `data/cache/lib`,不覆盖项目源码、配置或用户文件。
- Dever Package 可以携带外部 Adapter 声明;普通使用者只执行 `dever package add`,项目解析时把传递 Lib 统一锁定。
- 不同 Adapter 的依赖环境隔离,允许同一外部包的不同版本共存;机器缓存按内容去重。
## Acceptance Criteria
- [ ] 同一个 Port 可以分别由 Dever、`exec`、Python、JavaScript 和 Go Adapter 实现,App 调用代码不变。
- [ ] 协议 schema、operation、输入、输出或 error 不匹配在用户业务代码执行前失败。
- [ ] Worker 崩溃、取消、超时和主程序关闭不会遗留进程或把半条响应当成功结果。
- [ ] `lib add/update` 产生确定性 lock;断网 `check/run/build` 使用相同 lock 和机器缓存成功,缺失依赖明确失败且不隐式联网。
- [ ] Python、Node 和 Go 组件在目标机器没有对应系统 runtime/toolchain 时仍可由构建产物运行。
- [ ] 未声明 capability 的网络、文件、进程和设备访问被拒绝;Secret 与其他项目路径不出现在诊断或状态输出。
- [ ] 一个 Dever Package 可以封装外部 Lib,另一个项目只安装该 Package 即可构建和运行。
- [ ] 新增第四种生态只实现 resolver/runtime pack/SDK,不修改 Port、Component Protocol 或 App 调用规则。
## Out Of Scope
- FFI、动态库加载和同进程外语解释器。
- 自动把任意第三方函数、类或对象模型暴露成 Dever API;普通生态库仍需要薄 Adapter bridge。
- 云端编译、源码上传或运行时联网安装。
- 外部 Adapter 热切换、请求级实现选择和无约束自动重试。
- 修改现有 Dever Package/Component/Domain 的业务命名和调用规则。
## Child Deliverables
1. `09-29-external-lib-protocol`:语言合同、统一协议、通用 `exec` Worker 和生命周期。
2. `09-29-external-lib-ecosystems`:`dever lib`、`dever.lock`、共享缓存及 pip/npm/go resolver 和 SDK。
3. `09-29-external-lib-packaging`:`run/build` 自包含打包与 Dever Package 传递依赖。