feat: publish Dever core with project scaffolding and versioned AI skills
This commit is contained in:
1 parent
70fa73cdc2
commit
ac458ffa7f
960 files changed
+221319
-1163
No files matched your search
@@ -0,0 +1,2 @@
|
||||
{"file":".trellis/spec/backend/toolchain-and-library.md","reason":"复核共享缓存的身份、完整性、并发和验证要求"}
|
||||
{"file":".trellis/tasks/09-28-shared-toolchain/prd.md","reason":"按当前子任务的验收标准进行最终检查"}
|
||||
@@ -0,0 +1,86 @@
|
||||
# Design
|
||||
|
||||
## Boundary
|
||||
|
||||
本任务增加机器级 Dever 管理层。它拥有稳定入口、版本目录、项目版本分派、更新事务和共享缓存服务;版本化编译器继续拥有源码检查、生成和运行语义。项目仍通过现有 CLI 合同进入编译器。
|
||||
|
||||
## Directory Contract
|
||||
|
||||
发行安装器按平台选择机器级根目录,但根内布局一致:
|
||||
|
||||
```text
|
||||
<toolchain>/
|
||||
bin/
|
||||
dever stable launcher
|
||||
deverd cache/build service
|
||||
state/
|
||||
active-version
|
||||
install.lock
|
||||
versions/
|
||||
<version>/
|
||||
dever-core
|
||||
manifest.json
|
||||
runtime/
|
||||
cache/
|
||||
native/
|
||||
downloads/
|
||||
staging/
|
||||
```
|
||||
|
||||
`bin/dever` 是机器上唯一公开入口。`versions/*`、`state/*` 与缓存目录不加入 PATH,也不要求用户直接操作。目录根由安装器写入 launcher 自身的安装位置,运行时不读取环境变量。
|
||||
|
||||
## Command Flow
|
||||
|
||||
1. launcher 解析命令和项目根,不读取 Dever 源码。
|
||||
2. 对项目命令只解析 `config/setting.json` 的 `dever.version`;存在时精确选择,否则读取机器 `active-version`。
|
||||
3. launcher 校验版本 manifest 和核心可执行文件身份,然后把原参数分派给版本核心。
|
||||
4. 核心完成现有 check/run/build 流程;需要原生产物时通过本机受保护 IPC 请求 `deverd`。
|
||||
5. `deverd` 根据已安装版本和完整构建输入自行计算缓存键、编译或恢复产物,再将结果返回请求用户,客户端不能指定缓存文件路径。
|
||||
|
||||
`config/setting.json` 增加可选配置:
|
||||
|
||||
```json
|
||||
{
|
||||
"dever": {
|
||||
"version": "0.1.0"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
runtime 配置解析器接受并忽略已经由 launcher 消费的 `dever` 段,确保同一配置可以同时用于 `run` 和独立构建产物;构建产物不使用该字段选择自身 runtime。
|
||||
|
||||
## Ownership
|
||||
|
||||
- `dever-cli`:稳定 launcher 命令合同、项目版本读取和版本核心分派。
|
||||
- 独立 machine manager 模块:安装、更新、切换、卸载、签名验证和原子状态变更;不把这些分散进每个命令分支。
|
||||
- `dever-runtime::config`:只增加严格的 `dever.version` 配置合同,不承担安装或版本选择。
|
||||
- `dever-core::native::build`:把默认缓存请求交给共享服务;保留显式隔离缓存入口供测试使用。
|
||||
- cache service:唯一可写共享缓存的进程,负责密码学键、编译、恢复、并发发布、租约和清理。
|
||||
- 平台 adapter:只封装全局路径、权限提升、服务管理和 IPC 差异;上层状态机和版本规则只有一套。
|
||||
|
||||
## Install And Update Transaction
|
||||
|
||||
下载先进入 `cache/downloads`,验证发行 manifest 签名、包摘要、平台和版本后解包到 `cache/staging`。核心自检成功后原子发布到 `versions/<version>`,最后原子更新 `active-version`。任一步失败都删除 staging 并保留旧版本。卸载同样持有 `install.lock`,不能删除当前版本或正在服务请求的版本。
|
||||
|
||||
初次安装由签名的系统安装器建立全局入口、机器服务、权限和初始版本;之后统一由 `dever install/update/use/uninstall` 管理。需要管理员权限时使用平台标准提权流程,不保存凭据。
|
||||
|
||||
## Cache Security And Cleanup
|
||||
|
||||
- `deverd` 使用专用系统身份,缓存目录只允许该身份写入。
|
||||
- 本地 IPC 使用操作系统凭据识别调用者;请求只包含规范化构建输入,不接受任意读写路径。
|
||||
- 缓存键使用 SHA-256 等密码学摘要;命中前复核 manifest 与产物摘要。
|
||||
- 客户端只有提交完整相同输入才能取得同一产物,服务不提供缓存目录列表或其他项目索引。
|
||||
- 运行中的条目持有租约。清理只删除无租约的 staging、损坏条目和按策略选出的旧条目,并使用原子删除/替换。
|
||||
- `cache status` 输出容量、条目数和版本占用,不输出项目源码、路径或用户信息。
|
||||
|
||||
## Failure Contract
|
||||
|
||||
全局入口、活动版本状态、项目锁定、签名、版本 manifest、IPC 或缓存完整性任一验证失败时返回明确错误。不得静默切换版本、使用用户 PATH 中的编译器、改写项目配置或执行未验证产物。
|
||||
|
||||
## Compatibility
|
||||
|
||||
开发态 `deverc` 保持为私有仓库入口直到正式发行链完成。正式 `dever` 不读取开发仓库 `target/native-artifacts`。已有项目无需新增配置;只有需要固定版本的项目才增加 `dever.version`。
|
||||
|
||||
## Deferred Complexity
|
||||
|
||||
本任务不重复实现父发行任务的原生后端、目标包生产和发布基础设施。安装管理层必须以父任务提供的签名发行包为输入;在发行包合同完成前可以实现和测试本地 fixture,但不能宣称公开安装链已完成。
|
||||
@@ -0,0 +1,2 @@
|
||||
{"file":".trellis/spec/backend/toolchain-and-library.md","reason":"定义原生产物缓存、工具链边界和定向验证合同"}
|
||||
{"file":".trellis/tasks/09-06-private-compiler-distribution/prd.md","reason":"约束本子任务不扩大到公开发行、内置后端和跨平台矩阵"}
|
||||
@@ -0,0 +1,46 @@
|
||||
# Implementation Plan
|
||||
|
||||
## Phase 1: Contracts
|
||||
|
||||
- [x] 定义唯一的机器目录布局、发行 manifest、版本语法、签名输入、active-version 状态和平台权限合同。
|
||||
- [x] 在 `config/setting.json` 增加严格的可选 `dever.version`,并覆盖未知字段、非法版本和独立产物读取行为。
|
||||
- [x] 固定用户命令:`install/update/use/uninstall/version/cache status/cache clean`,现有项目命令不改变。
|
||||
|
||||
## Phase 2: Global Launcher And Version Store
|
||||
|
||||
- [x] 把稳定 launcher 与版本核心分开;所有项目命令通过同一选择函数分派。
|
||||
- [x] 实现版本安装、签名/摘要验证、staging、自检、原子发布和 active-version 可恢复原子切换。
|
||||
- [x] 实现更新回滚、当前版本卸载保护、缺失锁定版本诊断和显式降级拒绝。
|
||||
- [ ] 实现 Linux、macOS、Windows 平台标准提权适配。
|
||||
- [ ] 为 Linux、macOS、Windows 分别实现机器级入口、目录权限和服务注册,平台差异只留在 adapter。
|
||||
|
||||
## Phase 3: Cross-user Build Cache
|
||||
|
||||
- [ ] 将版本核心原生编译接入受保护的 daemon build service;已完成的 Status/Clean/Lib artifact IPC 不代替编译请求。
|
||||
- [ ] 使用密码学内容摘要统一编译器、runtime、目标、生成内容与选项身份;SHA-256 与 store 已实现,但版本核心尚未通过受保护服务使用它。
|
||||
- [x] 实现认证 IPC、并发请求合并、不可变原子发布、租约、完整性复核和安全结果交付。(IPC 客户端只接受 token-authenticated `deverd` 响应,未恢复同进程 fallback。)
|
||||
- [x] 实现 `cache status/clean` 与更新/卸载后的损坏、staging 和无引用条目清理。
|
||||
- [x] Linux 采用内核 peer credential 接受不同 UID 的 content-addressed Lib artifact put/get 和 metadata-only status;拒绝非 owner clean/管理 token 读取,限制每 UID/总连接、单资产/总容量/条目数。
|
||||
|
||||
## Phase 4: Integration And Documentation
|
||||
|
||||
- [x] 将现有 `check/api/fmt/test/run/build/tenant` 命令接入统一 launcher,验证参数和退出码透传。
|
||||
- [x] 更新 `README.md`、`LANGUAGE.md`、`IMPLEMENTATION.md` 和 backend toolchain spec,明确用户只有一个 `dever`。
|
||||
- [x] 使用签名本地 fixture 验证双版本、双项目、并发缓存发布、升级故障与缓存清理。
|
||||
- [x] 使用 root 与自有 uid=65534 fixture 客户端验证同一 launcher、不同 UID 的 status/artifact IPC、token/clean/admission 隔离;不创建系统账号或安装真实全局服务。
|
||||
- [x] 运行受影响 crate 检查和定向测试;不默认运行全量测试或替换当前机器的真实全局命令。
|
||||
- [ ] 最终安全审查安装提权、路径穿越、符号链接、TOCTOU、缓存投毒、降级与跨用户信息泄露。
|
||||
|
||||
## Rollback
|
||||
|
||||
安装和更新始终保留上一活动版本,active-version 只在新版本自检通过后切换。launcher 或服务升级失败时恢复上一套文件和服务定义;缓存是可再生数据,回滚不迁移或修改任何项目目录。
|
||||
|
||||
## Implementation Record (2026-09-29)
|
||||
|
||||
- 已完成稳定 `dever` 二进制、严格项目版本读取、签名/摘要/平台验证、双版本安装与切换、活动版本追加校验日志、失败回滚、缺失锁定版本诊断、参数与退出码透传。
|
||||
- 已完成开发态原生缓存 SHA-256 化,以及未来 `deverd` 内部 store 的不可变发布、完整性复核、读/写租约、状态与清理算法;该 store 明确不构成 IPC 或跨用户权限边界。
|
||||
- 复审后,launcher 的 `cache status/clean` 在认证 IPC 未完成前统一明确失败,不再直接构造 store;安装复制固定为机器共享只读权限,launcher 在执行前复核状态、公钥、版本目录和发行文件的属主与可写位,并拒绝 `update` 通过 `latest` 隐式降级。
|
||||
- 本地签名 fixture 已覆盖双版本、双项目、并发缓存发布、篡改拒绝、健康检查失败、部分 active 记录恢复和清理租约。没有创建真实系统用户、安装全局命令或变更系统服务。
|
||||
- 真实 Linux/macOS/Windows 提权与服务注册 adapter、认证 IPC、版本核心到 `deverd` 的构建请求、签名发行目录与下载(当前 `latest` 只是未签名本地 fixture 指针)、内置后端发行包和六宿主发行验证仍由父任务 `09-06-private-compiler-distribution` 阻塞;这些项保持未勾选,不能用同进程 store 代替。
|
||||
- 最终定向复验:受影响的 `dever-cli`、`dever-runtime`、`dever-core` 离线 `cargo check` 通过;`shared_toolchain` 6/6、`application_config` 6/6 通过。`rustfmt`、`clippy` 未安装;未运行全量、性能、真实系统安装或跨平台测试。
|
||||
- 本轮补充 `deverd --root <machine-root>` 本地服务和长度分帧 IPC:token 文件与 socket 均限制为 owner-only,`cache status/clean` 通过服务访问 CacheStore;服务不可用时客户端失败,不构造本地 store。跨平台 peer credential、系统服务注册、提权和真实双用户验证仍未完成。
|
||||
@@ -0,0 +1,81 @@
|
||||
# Dever 本机共享工具链
|
||||
|
||||
## Goal
|
||||
|
||||
让一台机器上的所有用户和所有 Dever 项目始终使用同一个全局 `dever` 命令。Dever 内部负责安装、升级、版本选择、项目锁定、安全共享缓存和清理;用户不需要理解或指定编译器真实路径。
|
||||
|
||||
## Background
|
||||
|
||||
- `deverc check/run/build <project-root>` 已经可以处理任意项目根目录,但当前只是开发仓库中的单个引导编译器。
|
||||
- 当前没有正式的全局 `dever` 入口、机器级安装目录、版本选择、项目锁定、升级回滚或卸载合同。
|
||||
- 当前 `compile`、`compile_application`、`compile_project` 和 `compile_test_suite` 把默认缓存固定到编译器源码工作区的 `target/native-artifacts`,不能作为多用户机器级缓存。
|
||||
- 现有缓存键已经包含编译器、后端工具、runtime、生成内容、平台和编译选项,并且发布过程具有完整性校验和并发原子性。
|
||||
- 项目配置只读取各项目自己的 `config/setting.json`;工具链选择也必须遵守这一配置边界,不增加环境变量或第二个项目配置文件。
|
||||
|
||||
## Requirements
|
||||
|
||||
### Global Command
|
||||
|
||||
- 每台机器只公开一个 `dever` 命令;普通用户和所有项目都调用这个入口。
|
||||
- 全局入口不得要求用户设置 `PATH` 之外的 Dever 环境变量,也不得要求用户知道内部版本目录。
|
||||
- `check/api/fmt/test/run/build/tenant` 等现有命令参数保持项目根合同,入口只负责选择工具链后原样分派。
|
||||
|
||||
### Installation And Versions
|
||||
|
||||
- 提供 `dever install <version|latest>`、`dever update`、`dever use <version>` 和 `dever uninstall <version>`。
|
||||
- 初次安装、版本安装、切换和卸载按操作系统要求获取管理员权限;日常项目命令不需要管理员权限。
|
||||
- 多个版本安装在机器级版本目录,安装与切换使用 staging + atomic rename,失败时保留当前可用版本。
|
||||
- 下载的发行物必须校验受信签名和内容摘要;不得执行未验证的编译器。
|
||||
- `dever update` 安装并切换到新版本;失败或健康检查不通过时自动保留旧版本。
|
||||
- 卸载当前默认版本必须先切换到其它版本;项目锁定了已卸载版本时给出明确的安装命令,不静默改用其它版本。
|
||||
|
||||
### Project Selection
|
||||
|
||||
- 项目可以在 `config/setting.json` 中可选声明 `dever.version`。
|
||||
- 已锁定项目精确选择该版本;未锁定项目使用机器默认版本。
|
||||
- 版本缺失、格式非法或不受支持时在读取项目源码和运行项目程序前失败。
|
||||
- 版本选择不读取环境变量,不新增 `.dever-version`、lock 文件或用户级配置。
|
||||
|
||||
### Machine Sharing And Isolation
|
||||
|
||||
- 所有操作系统用户共享同一个全局入口、已安装版本、标准库、runtime/target packs 和机器级缓存服务。
|
||||
- 每个项目的源码、`config/setting.json`、`data/`、构建输出、端口和运行进程保持独立,不复制到工具链目录。
|
||||
- 普通用户不能直接修改全局入口、已安装版本、默认版本状态或缓存条目。
|
||||
- 跨用户缓存不得让一个用户写入随后由另一个用户直接执行的未验证文件,也不得提供按目录浏览其他项目产物的能力。
|
||||
|
||||
### Shared Cache
|
||||
|
||||
- 共享缓存由机器级 Dever 缓存/编译服务独占写入;客户端只提交完整构建输入并接收验证后的结果。
|
||||
- 缓存键改为密码学内容摘要,并继续覆盖编译器版本、runtime、目标平台、生成内容和编译选项。
|
||||
- 相同版本和相同完整输入可以跨项目、跨用户复用;不同输入、版本或目标不得复用。
|
||||
- 缓存发布保持不可变、完整性校验和并发原子性;普通用户不能伪造缓存命中。
|
||||
- 提供 `dever cache status` 和 `dever cache clean`;更新或卸载后自动清理没有引用的临时文件和损坏条目。
|
||||
- 缓存服务不可用时明确失败,不退回不受保护的全局可写目录;是否允许本次不使用共享缓存必须是显式 CLI 选项,而不是隐藏回退。
|
||||
|
||||
## Acceptance Criteria
|
||||
|
||||
- [ ] 安装后,机器上的两个不同系统用户都通过同一路径的 `dever` 命令运行各自项目,无需用户级 Dever 安装。
|
||||
- [ ] 未锁定项目自动使用机器默认版本;`config/setting.json` 锁定版本的项目自动使用对应已安装版本。
|
||||
- [ ] 安装、升级、切换和卸载具有原子性;故障注入后旧的可用版本和全局入口不受损。
|
||||
- [ ] 签名错误、摘要错误、版本缺失和卸载当前版本均返回明确错误,不执行错误版本。
|
||||
- [ ] 两个项目或用户产生相同完整原生输入时命中同一缓存;输入、版本或目标改变时不会错误复用。
|
||||
- [ ] 非特权用户无法修改版本、默认状态或伪造缓存条目供其他用户执行。
|
||||
- [ ] 项目源码、配置、运行数据和显式构建输出不会进入共享安装目录或被其他用户通过 Dever 浏览。
|
||||
- [ ] `dever cache status/clean` 可检查和清理共享缓存;并发构建与清理不会暴露半成品或删除正在使用的条目。
|
||||
- [ ] 所有选择和运行行为不读取 `HOME`、`XDG_*`、`DEVER_*`、`RUSTC` 或其它 Dever 配置环境变量。
|
||||
- [ ] Linux、macOS 和 Windows 分别验证全局入口、系统权限、版本分派和升级回滚;实际支持平台必须与父发行任务一致。
|
||||
|
||||
## Out Of Scope
|
||||
|
||||
- 修改 `.dever` 语言语法或应用业务目录规范。
|
||||
- 将项目运行配置移出 `config/setting.json`。
|
||||
- 云端编译、上传源码或依赖远程构建服务。
|
||||
- 在本任务重复实现父任务负责的 LLVM/LLD 后端和六目标交叉编译器;本任务消费父任务交付的可安装发行物。
|
||||
- 承诺不同源码产生的程序可以共享缓存;共享仅发生在完整输入一致时。
|
||||
|
||||
## Key Decisions
|
||||
|
||||
- “简单”指用户只面对一个 `dever` 命令和项目现有的 `config/setting.json`,不是减少产品功能。
|
||||
- 全局入口与真实编译器版本分离:入口稳定,版本可以并存、切换和回滚。
|
||||
- `dever.version` 是唯一项目级工具链选择;机器默认版本是唯一未锁定项目选择,不存在更多优先级。
|
||||
- 跨用户写共享可执行缓存是安全边界,因此由机器服务持有,不能使用所有用户可写目录代替。
|
||||
@@ -0,0 +1,26 @@
|
||||
{
|
||||
"id": "shared-toolchain",
|
||||
"name": "shared-toolchain",
|
||||
"title": "Dever 本机共享工具链",
|
||||
"description": "让一台机器上的所有用户和项目通过一个全局 dever 命令共享版本化工具链,并自动完成版本选择、更新与安全缓存",
|
||||
"status": "in_progress",
|
||||
"dev_type": null,
|
||||
"scope": null,
|
||||
"package": null,
|
||||
"priority": "P2",
|
||||
"creator": "Antigravity",
|
||||
"assignee": "Antigravity",
|
||||
"createdAt": "2026-09-28",
|
||||
"completedAt": null,
|
||||
"branch": "main",
|
||||
"base_branch": "main",
|
||||
"worktree_path": null,
|
||||
"commit": null,
|
||||
"pr_url": null,
|
||||
"subtasks": [],
|
||||
"children": [],
|
||||
"parent": "09-06-private-compiler-distribution",
|
||||
"relatedFiles": [],
|
||||
"notes": "",
|
||||
"meta": {}
|
||||
}
|
||||
Reference in new issue
Block a user