diff --git a/Cargo.lock b/Cargo.lock index 724fa64..e775c9e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8,39 +8,6 @@ version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" -[[package]] -name = "aster-cli" -version = "0.1.0" -dependencies = [ - "aster-core", - "aster-storage", - "tokio", -] - -[[package]] -name = "aster-core" -version = "0.1.0" - -[[package]] -name = "aster-server" -version = "0.1.0" -dependencies = [ - "aster-core", - "aster-storage", - "axum", - "serde", - "tokio", -] - -[[package]] -name = "aster-storage" -version = "0.1.0" -dependencies = [ - "sqlx", - "tempfile", - "tokio", -] - [[package]] name = "atoi" version = "2.0.0" @@ -159,6 +126,19 @@ version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4e7648175b45a9a48536d676f68d918270699102aa8dab5496df06904c914600" +[[package]] +name = "cli" +version = "0.1.0" +dependencies = [ + "core", + "storage", + "tokio", +] + +[[package]] +name = "core" +version = "0.1.0" + [[package]] name = "cpufeatures" version = "0.2.17" @@ -1079,6 +1059,17 @@ dependencies = [ "serde", ] +[[package]] +name = "server" +version = "0.1.0" +dependencies = [ + "axum", + "core", + "serde", + "storage", + "tokio", +] + [[package]] name = "sha2" version = "0.10.9" @@ -1292,6 +1283,15 @@ version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" +[[package]] +name = "storage" +version = "0.1.0" +dependencies = [ + "sqlx", + "tempfile", + "tokio", +] + [[package]] name = "stringprep" version = "0.1.5" diff --git a/Cargo.toml b/Cargo.toml index 103249c..c115405 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,8 +9,8 @@ rust-version = "1.91" license = "MIT" [workspace.dependencies] -aster-core = { path = "crates/core" } -aster-storage = { path = "crates/storage" } +core = { path = "crates/core" } +storage = { path = "crates/storage" } axum = { version = "0.8", default-features = false, features = ["http1", "json", "tokio"] } serde = { version = "1", features = ["derive"] } serde_json = "1" diff --git a/Dockerfile b/Dockerfile index dc6d552..c6665ed 100644 --- a/Dockerfile +++ b/Dockerfile @@ -13,19 +13,19 @@ ENV CARGO_PROFILE_DEV_DEBUG=0 CARGO_PROFILE_TEST_DEBUG=0 CMD ["sh", "scripts/check.sh"] FROM source AS build -RUN cargo build --locked --release -p aster-server -p aster-cli +RUN cargo build --locked --release -p server -p cli FROM debian:bookworm-slim AS runtime RUN apt-get update && apt-get install -y --no-install-recommends ca-certificates curl \ && rm -rf /var/lib/apt/lists/* \ && useradd --system --uid 10001 --create-home aster \ && mkdir -p /data && chown aster:aster /data -COPY --from=build /build/target/release/aster-server /usr/local/bin/aster-server -COPY --from=build /build/target/release/aster /usr/local/bin/aster +COPY --from=build /build/target/release/server /usr/local/bin/server +COPY --from=build /build/target/release/cli /usr/local/bin/cli USER 10001 WORKDIR /data ENV ASTER_LISTEN=0.0.0.0:8080 SQLITE_PATH=/data/aster.db EXPOSE 8080 HEALTHCHECK --interval=10s --timeout=6s --start-period=10s --retries=3 \ CMD curl --fail --silent http://127.0.0.1:8080/health || exit 1 -CMD ["aster-server"] +CMD ["server"] diff --git a/README.md b/README.md index a4be7ee..8b2d63a 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ VM 从空堆启动;尚无源码 lexer/parser、Python type/元类体系、 | 文件或目录 | 职责 | | --- | --- | -| Cargo.toml / Cargo.lock | 工作区、包依赖、Rust 版本要求及依赖锁定;目录名无 aster- 前缀,包名保留 | +| Cargo.toml / Cargo.lock | 工作区、包依赖、Rust 版本要求及依赖锁定;包名与目录一致:core、storage、cli、server | | crates/ | core、storage、cli、server 四个包,每个目录的 README 解释本目录 | | docs/ | 跨目录的架构、运行时契约、配置、运行、部署与维护说明 | | scripts/ | 指定远端环境中的检查、冒烟、CI 与部署脚本 | diff --git a/crates/README.md b/crates/README.md index db3bf69..75ef136 100644 --- a/crates/README.md +++ b/crates/README.md @@ -1,12 +1,14 @@ # Cargo 工作区 -本目录包含四个 crate。目录名不用 aster- 前缀,Cargo 包名和二进制名保留现有名称;路径依赖定义在根 Cargo.toml。 +本目录包含四个 crate。Cargo 包名与目录一致,均不带项目前缀;路径依赖定义在根 Cargo.toml。 | 目录 | 包名/产物 | 职责 | | --- | --- | --- | -| [core](core/README.md) | aster-core | 零外部依赖的对象运行时、堆与字节码 VM | -| [storage](storage/README.md) | aster-storage | 宿主元数据与 SQLite/PostgreSQL 适配,不依赖 core | -| [cli](cli/README.md) | aster-cli,二进制 aster | 引导演示和 metadata 命令 | -| [server](server/README.md) | aster-server | 最小常驻 HTTP 宿主 | +| [core](core/README.md) | core | 零外部依赖的对象运行时、堆与字节码 VM | +| [storage](storage/README.md) | storage | 宿主元数据与 SQLite/PostgreSQL 适配,不依赖 core | +| [cli](cli/README.md) | cli,二进制 cli | 引导演示和 metadata 命令 | +| [server](server/README.md) | server | 最小常驻 HTTP 宿主 | + +core 的 Rust 库目标明确命名为 endor_core,避免与 Rust 标准库 core 重名;storage 的引用名为 storage,两个二进制分别为 cli、server。Cargo 通过 [lib] 自定义库名,详见 [Cargo 目标说明](https://doc.rust-lang.org/cargo/reference/cargo-targets.html#the-name-field)。 CLI/Server 依赖 Core 和 Storage,Core 与 Storage 互不依赖。网络、数据库、浏览器、进程配置和信号留在宿主。全局说明见 [架构](../docs/architecture/README.md),查功能位置从 [文档索引](../docs/README.md) 进入。返回 [项目入口](../README.md)。 diff --git a/crates/cli/Cargo.toml b/crates/cli/Cargo.toml index e3d91d5..184715d 100644 --- a/crates/cli/Cargo.toml +++ b/crates/cli/Cargo.toml @@ -1,17 +1,17 @@ [package] -name = "aster-cli" +name = "cli" version.workspace = true edition.workspace = true rust-version.workspace = true license.workspace = true [[bin]] -name = "aster" +name = "cli" path = "src/main.rs" [dependencies] -aster-core.workspace = true -aster-storage.workspace = true +core.workspace = true +storage.workspace = true tokio.workspace = true [lints] diff --git a/crates/cli/README.md b/crates/cli/README.md index e9be7b1..1bbc98c 100644 --- a/crates/cli/README.md +++ b/crates/cli/README.md @@ -1,10 +1,10 @@ -# aster-cli / aster +# cli 命令行宿主。bootstrap 演示两个运行时对象并释放;metadata put/get 使用独立 Storage,不让数据库配置进入 Core。 | 内容 | 职责 | | --- | --- | -| Cargo.toml | CLI 包、aster 二进制名称、core/storage/Tokio 依赖 | +| Cargo.toml | CLI 包、cli 二进制名称、core/storage/Tokio 依赖 | | [src](src/README.md) | 参数路由、命令执行和退出码 | 用法见 [运行指南](../../docs/operations/README.md),文本参数与环境边界见 [配置](../../docs/operations/configuration.md)。此 CLI 当前不是 Endor 源码解释命令。返回 [工作区](../README.md)。 diff --git a/crates/cli/src/main.rs b/crates/cli/src/main.rs index b703ed8..32dfdeb 100644 --- a/crates/cli/src/main.rs +++ b/crates/cli/src/main.rs @@ -1,17 +1,17 @@ use std::error::Error; use std::process::ExitCode; -use aster_core::{Value, Vm}; -use aster_storage::{Storage, StorageConfig}; +use endor_core::{Value, Vm}; +use storage::{Storage, StorageConfig}; -const USAGE: &str = "Usage: aster [bootstrap | metadata put | metadata get ]"; +const USAGE: &str = "Usage: cli [bootstrap | metadata put | metadata get ]"; #[tokio::main] async fn main() -> ExitCode { match run().await { Ok(()) => ExitCode::SUCCESS, Err(error) => { - eprintln!("aster: {error}"); + eprintln!("cli: {error}"); ExitCode::FAILURE } } diff --git a/crates/core/Cargo.toml b/crates/core/Cargo.toml index 2c1056a..5481ffa 100644 --- a/crates/core/Cargo.toml +++ b/crates/core/Cargo.toml @@ -1,9 +1,13 @@ [package] -name = "aster-core" +name = "core" version.workspace = true edition.workspace = true rust-version.workspace = true license.workspace = true +# Keep the library distinct from Rust's built-in core crate. +[lib] +name = "endor_core" + [lints] workspace = true diff --git a/crates/core/README.md b/crates/core/README.md index 9bf9119..36bd412 100644 --- a/crates/core/README.md +++ b/crates/core/README.md @@ -1,10 +1,10 @@ -# aster-core +# core -Endor VM 内核,保持零外部依赖。负责 EndorObject、堆、代际句柄、引用计数/循环回收、基本载荷和小型 wordcode 执行器。公共 Rust API 从 src/lib.rs 导出。 +Endor VM 内核,保持零外部依赖。负责 EndorObject、堆、代际句柄、引用计数/循环回收、基本载荷和小型 wordcode 执行器。公共 Rust API 从 src/lib.rs 导出。Cargo 包名为 core,Rust 引用名为 endor_core,由 Cargo.toml 的 [lib] 设置,避免与标准库 core 重名。 | 内容 | 入口 | | --- | --- | -| Cargo.toml | 包元数据和工作区 lint;没有外部依赖 | +| Cargo.toml | 包元数据、endor_core 库目标和工作区 lint;没有外部依赖 | | [src](src/README.md) | 文件职责、公开接口和常见修改位置 | | [tests](tests/README.md) | 对象、基本载荷、执行语义与生命周期检查 | diff --git a/crates/core/src/lib.rs b/crates/core/src/lib.rs index 7873bd0..80411ba 100644 --- a/crates/core/src/lib.rs +++ b/crates/core/src/lib.rs @@ -2,7 +2,7 @@ //! Python language type system; wordcode is not CPython bytecode compatible. //! //! ``` -//! use aster_core::{Value, Vm}; +//! use endor_core::{Value, Vm}; //! let mut vm = Vm::new()?; //! let object = vm.new_object()?; // One owned external reference. //! vm.set_attr(object, "x", Value::Number(42_i64.into()))?; @@ -12,12 +12,12 @@ //! assert_eq!(vm.ref_count(object)?, 1); //! vm.release(object)?; // The object is destroyed. //! assert_eq!(vm.object_count(), 0); -//! # Ok::<(), aster_core::VmError>(()) +//! # Ok::<(), endor_core::VmError>(()) //! ``` //! //! Execute validated wordcode without a source parser: //! ``` -//! use aster_core::{CodeLayout, EndorCode, Instruction, Opcode, Value, Vm}; +//! use endor_core::{CodeLayout, EndorCode, Instruction, Opcode, Value, Vm}; //! let mut vm = Vm::new()?; //! let globals = vm.new_dict()?; //! let code = EndorCode::from_instructions( @@ -35,7 +35,7 @@ //! vm.release(code)?; //! vm.release(globals)?; //! assert_eq!(vm.object_count(), 0); -//! # Ok::<(), aster_core::VmError>(()) +//! # Ok::<(), endor_core::VmError>(()) //! ``` mod builtins; diff --git a/crates/core/tests/README.md b/crates/core/tests/README.md index 88a1c0f..3d86d1f 100644 --- a/crates/core/tests/README.md +++ b/crates/core/tests/README.md @@ -1,6 +1,6 @@ # Core 公开行为检查 -本目录通过 aster_core 公共 API 检查宿主可观察的语义,不为检查开放内部句柄构造器。 +本目录通过 endor_core 公共 API 检查宿主可观察的语义,不为检查开放内部句柄构造器。 | 文件 | 覆盖 | | --- | --- | diff --git a/crates/core/tests/builtins.rs b/crates/core/tests/builtins.rs index f12e85c..5706f87 100644 --- a/crates/core/tests/builtins.rs +++ b/crates/core/tests/builtins.rs @@ -1,4 +1,4 @@ -use aster_core::{ +use endor_core::{ CodeLayout, CompareOp, EndorBaseExceptionObject, EndorCode, EndorDictObject, EndorFunctionObject, EndorInteger, EndorNativeFunctionObject, EndorNumber, EndorNumberObject, EndorReal, EndorStringObject, EndorTracebackEntry, Instruction, Opcode, Value, Vm, VmError, diff --git a/crates/core/tests/execution.rs b/crates/core/tests/execution.rs index 82f75af..871f76d 100644 --- a/crates/core/tests/execution.rs +++ b/crates/core/tests/execution.rs @@ -2,7 +2,7 @@ use std::any::Any; use std::sync::Arc; use std::sync::atomic::{AtomicUsize, Ordering}; -use aster_core::{ +use endor_core::{ CodeLayout, CompareOp, EndorCode, EndorCodeObject, EndorNativeFunctionObject, ExecutionLimits, Instruction, ObjectPayload, ObjectRef, Opcode, Value, Vm, VmError, }; diff --git a/crates/core/tests/runtime.rs b/crates/core/tests/runtime.rs index 01452b6..8a38431 100644 --- a/crates/core/tests/runtime.rs +++ b/crates/core/tests/runtime.rs @@ -2,7 +2,7 @@ use std::any::Any; use std::sync::Arc; use std::sync::atomic::{AtomicUsize, Ordering}; -use aster_core::{CompareOp, NativeFunction, ObjectPayload, ObjectRef, Record, Value, Vm, VmError}; +use endor_core::{CompareOp, NativeFunction, ObjectPayload, ObjectRef, Record, Value, Vm, VmError}; #[derive(Debug)] struct Resource { diff --git a/crates/server/Cargo.toml b/crates/server/Cargo.toml index 9a6b5c9..0e0cf69 100644 --- a/crates/server/Cargo.toml +++ b/crates/server/Cargo.toml @@ -1,13 +1,13 @@ [package] -name = "aster-server" +name = "server" version.workspace = true edition.workspace = true rust-version.workspace = true license.workspace = true [dependencies] -aster-core.workspace = true -aster-storage.workspace = true +core.workspace = true +storage.workspace = true axum.workspace = true serde.workspace = true tokio.workspace = true diff --git a/crates/server/README.md b/crates/server/README.md index f1b4470..b881ef4 100644 --- a/crates/server/README.md +++ b/crates/server/README.md @@ -1,4 +1,4 @@ -# aster-server +# server 最小常驻 HTTP 宿主,提供数据库健康检查和只读 VM 引导信息。它通过 Arc 共享 Vm,没有语言执行接口或可变 VM 请求上下文。 diff --git a/crates/server/src/main.rs b/crates/server/src/main.rs index a38357f..63db08d 100644 --- a/crates/server/src/main.rs +++ b/crates/server/src/main.rs @@ -3,10 +3,10 @@ use std::future::Future; use std::process::ExitCode; use std::sync::Arc; -use aster_core::Vm; -use aster_storage::{Storage, StorageConfig}; use axum::{Json, Router, extract::State, http::StatusCode, routing::get}; +use endor_core::Vm; use serde::Serialize; +use storage::{Storage, StorageConfig}; #[derive(Clone)] struct AppState { @@ -32,7 +32,7 @@ async fn main() -> ExitCode { match run().await { Ok(()) => ExitCode::SUCCESS, Err(error) => { - eprintln!("aster-server: {error}"); + eprintln!("server: {error}"); ExitCode::FAILURE } } @@ -55,7 +55,7 @@ async fn run() -> Result<(), Box> { storage: storage.clone(), }); println!( - "Aster host listening on {} (storage={})", + "Endor host listening on {} (storage={})", listener.local_addr()?, storage.backend_name() ); diff --git a/crates/storage/Cargo.toml b/crates/storage/Cargo.toml index 69681bc..d9de0b9 100644 --- a/crates/storage/Cargo.toml +++ b/crates/storage/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "aster-storage" +name = "storage" version.workspace = true edition.workspace = true rust-version.workspace = true diff --git a/crates/storage/README.md b/crates/storage/README.md index 7303180..07adb6a 100644 --- a/crates/storage/README.md +++ b/crates/storage/README.md @@ -1,4 +1,4 @@ -# aster-storage +# storage 宿主元数据存储,依赖 SQLx/Tokio,不依赖 VM 内核。一个 Storage 选择 SQLite 或 PostgreSQL;明确配置 PostgreSQL 后失败不回退。 diff --git a/crates/storage/src/lib.rs b/crates/storage/src/lib.rs index a93630c..2346062 100644 --- a/crates/storage/src/lib.rs +++ b/crates/storage/src/lib.rs @@ -1,4 +1,4 @@ -//! Host metadata storage; deliberately has no dependency on aster-core. +//! Host metadata storage; deliberately has no dependency on core. use std::fmt; use std::path::PathBuf; use std::str::FromStr; diff --git a/crates/storage/tests/postgres.rs b/crates/storage/tests/postgres.rs index ab0a1df..06c7dce 100644 --- a/crates/storage/tests/postgres.rs +++ b/crates/storage/tests/postgres.rs @@ -1,4 +1,4 @@ -use aster_storage::{Storage, StorageConfig}; +use storage::{Storage, StorageConfig}; /// Run explicitly against a disposable database; never silently skip a missing URL. #[tokio::test] diff --git a/crates/storage/tests/storage.rs b/crates/storage/tests/storage.rs index f79d223..39fb08a 100644 --- a/crates/storage/tests/storage.rs +++ b/crates/storage/tests/storage.rs @@ -1,4 +1,4 @@ -use aster_storage::{Storage, StorageConfig}; +use storage::{Storage, StorageConfig}; #[test] fn configuration_defaults_precedence_and_errors() { diff --git a/docs/architecture/README.md b/docs/architecture/README.md index c479527..8b9b437 100644 --- a/docs/architecture/README.md +++ b/docs/architecture/README.md @@ -11,7 +11,7 @@ Server ─→ Core └─────→ Storage ``` -Core 与 Storage 互不依赖。HTTP、Tokio、SQLx、数据库、网络和后续浏览器能力属于宿主,不进入零外部依赖的 aster-core。源码包导航见 [crates](../../crates/README.md)。 +Core 与 Storage 互不依赖。HTTP、Tokio、SQLx、数据库、网络和后续浏览器能力属于宿主,不进入零外部依赖的 core。源码包导航见 [crates](../../crates/README.md)。 | 组件 | 当前职责 | 全局契约 | | --- | --- | --- | diff --git a/docs/operations/README.md b/docs/operations/README.md index 533ab6b..848f87e 100644 --- a/docs/operations/README.md +++ b/docs/operations/README.md @@ -8,14 +8,14 @@ ```sh cargo build --workspace --locked -cargo run -p aster-cli -- bootstrap +cargo run -p cli -- bootstrap ``` bootstrap 创建两个 Record,输出 runtime=EndorObject、type_system=disabled、objects_distinct=true 和 heap_objects=2,显式释放后输出 released heap_objects=0。它不读取数据库配置,因此无效 DATABASE_URL 也不影响该命令。 ```sh -cargo run -p aster-cli -- metadata put project 'Aster VM' -cargo run -p aster-cli -- metadata get project +cargo run -p cli -- metadata put project 'Aster VM' +cargo run -p cli -- metadata get project ``` 每次 metadata 命令读取宿主存储配置、连接、操作并关闭连接池;缺失键显示 (missing)。命令和退出码的源码位置见 [cli/src](../../crates/cli/src/README.md)。 @@ -23,7 +23,7 @@ cargo run -p aster-cli -- metadata get project ## HTTP 宿主 ```sh -cargo run -p aster-server +cargo run -p server curl --fail http://127.0.0.1:8080/health curl --fail http://127.0.0.1:8080/bootstrap ``` diff --git a/docs/operations/deployment.md b/docs/operations/deployment.md index 345c2a0..e8e4fe2 100644 --- a/docs/operations/deployment.md +++ b/docs/operations/deployment.md @@ -4,7 +4,7 @@ ## 镜像与独立运行 -Dockerfile 的 source 阶段复制 Cargo 工作区及脚本;ci 阶段安装远端检查工具,build 阶段构建 aster-server 和 aster,runtime 阶段使用 Debian slim、UID 10001、/data 工作目录及 HTTP 健康检查。 +Dockerfile 的 source 阶段复制 Cargo 工作区及脚本;ci 阶段安装远端检查工具,build 阶段构建 server 和 cli,runtime 阶段使用 Debian slim、UID 10001、/data 工作目录及 HTTP 健康检查。 指定环境的 SQLite 方案: @@ -12,7 +12,7 @@ Dockerfile 的 source 阶段复制 Cargo 工作区及脚本;ci 阶段安装远 cp .env.example .env docker compose up --build -d curl --fail http://127.0.0.1:8080/health -docker compose exec aster aster metadata put project 'Aster VM' +docker compose exec aster cli metadata put project 'Aster VM' ``` 默认 docker-compose.yml 只向应用提供 SQLITE_PATH,使用 aster-sqlite 命名卷;不透传 DATABASE_URL。down 保留数据,down -v 会删除卷。 @@ -21,7 +21,7 @@ docker compose exec aster aster metadata put project 'Aster VM' ```sh docker compose -f docker-compose.postgres.yml up --build -d -docker compose -f docker-compose.postgres.yml exec aster aster metadata get project +docker compose -f docker-compose.postgres.yml exec aster cli metadata get project ``` 仅使用该 Compose 文件,不与默认 SQLite 文件叠加。此方案使用 aster-postgres 命名卷、PostgreSQL 17;数据库不发布宿主端口。两个独立方案不要同时占用相同应用端口。内部示例连接禁用 TLS,跨不可信网络使用 PostgreSQL TLS 验证。 @@ -38,6 +38,8 @@ docker compose -f docker-compose.postgres.yml exec aster aster metadata get proj ## 生产目录与数据 +Cargo 包名为 core/storage/cli/server,core 的 Rust 库名为 endor_core,可执行文件为 cli/server。Compose 应用服务名 aster、数据库名、卷和生产路径是已有部署资源标识,运行命令为该服务中的 cli;包改名无需迁移这些数据或重建数据库。 + | 路径 | 用途 | | --- | --- | | /opt/endorphin-aster-vm/releases// | 固定版本的 compose.yml 与 release.env | diff --git a/docs/operations/validation.md b/docs/operations/validation.md index f7a4f65..4941916 100644 --- a/docs/operations/validation.md +++ b/docs/operations/validation.md @@ -12,7 +12,7 @@ ```sh sh scripts/check.sh -cargo test -p aster-storage --test postgres --locked -- --ignored +cargo test -p storage --test postgres --locked -- --ignored python3 scripts/smoke.py ``` diff --git a/docs/runtime/builtins.md b/docs/runtime/builtins.md index 4e71db8..4c959e4 100644 --- a/docs/runtime/builtins.md +++ b/docs/runtime/builtins.md @@ -23,7 +23,7 @@ Python 代码中的 `def greet(name): ...` 创建的是语言函数。函数需 CPython 的 `len`、`print` 等宿主实现的内建函数则通过 C 函数入口调用。Endor 使用 Rust,所以命名为 `EndorNativeFunctionObject`,不把 C 写入名称。 ```rust -use aster_core::{EndorNativeFunctionObject, Value, Vm, VmError}; +use endor_core::{EndorNativeFunctionObject, Value, Vm, VmError}; fn echo(arguments: &[Value]) -> Result { match arguments { @@ -58,9 +58,9 @@ Native 函数和语言函数均通过 `Vm::call(&mut self, ...)` 调用。语言 | Complex | 复数记录 | 实部与虚部各自的 Integer、Decimal、Rational 或 BinaryFloat 表示 | ```rust -use aster_core::{EndorNumber, Value}; +use endor_core::{EndorNumber, Value}; -fn main() -> Result<(), aster_core::VmError> { +fn main() -> Result<(), endor_core::VmError> { let id = EndorNumber::integer("1234567890123456789012345678901234567890")?; let amount = EndorNumber::decimal("12345678901234567890.000100")?; let ratio = EndorNumber::rational("1", "3")?; @@ -105,9 +105,9 @@ print(read()) # updated `read` 与 `write` 必须引用同一个变量位置。若各自复制一份 `x` 的初始值,write 重新赋值后 read 就看不到变化。Cell 是这个共享位置:函数持有 Cell,Cell 持有当前值。外层函数返回后,Cell 仍被闭包持有。 ```rust -use aster_core::{Value, Vm}; +use endor_core::{Value, Vm}; -fn main() -> Result<(), aster_core::VmError> { +fn main() -> Result<(), endor_core::VmError> { let mut vm = Vm::new()?; let cell = vm.new_cell(None)?; // 空槽,不是 Nil。 vm.cell_set(cell, Value::Text("first".into()))?; diff --git a/docs/runtime/bytecode.md b/docs/runtime/bytecode.md index 39039d6..e6b9c66 100644 --- a/docs/runtime/bytecode.md +++ b/docs/runtime/bytecode.md @@ -94,9 +94,9 @@ Vm::execute(code, globals) ## 最小示例 ```rust -use aster_core::{CodeLayout, EndorCode, Instruction, Opcode, Value, Vm}; +use endor_core::{CodeLayout, EndorCode, Instruction, Opcode, Value, Vm}; -fn main() -> Result<(), aster_core::VmError> { +fn main() -> Result<(), endor_core::VmError> { let mut vm = Vm::new()?; let globals = vm.new_dict()?; let code = EndorCode::from_instructions( diff --git a/scripts/README.md b/scripts/README.md index d42f0e7..e74bf10 100644 --- a/scripts/README.md +++ b/scripts/README.md @@ -5,9 +5,9 @@ | 文件 | 入口与副作用 | | --- | --- | | [check.sh](check.sh) | fmt 检查、workspace 测试、严格 Clippy;会使用 Cargo 依赖和构建产物 | -| [smoke.py](smoke.py) | 标准库 Python 脚本;构建后用 Cargo metadata 定位 debug 二进制,支持 CARGO_TARGET_DIR;临时 SQLite 数据、HTTP 探测和 SIGTERM 退出,不改生产配置 | +| [smoke.py](smoke.py) | 标准库 Python 脚本;构建后用 Cargo metadata 定位 cli/server 的 debug 二进制,支持 CARGO_TARGET_DIR;临时 SQLite 数据、HTTP 探测和 SIGTERM 退出,不改生产配置 | | [ci-ces-control.sh](ci-ces-control.sh) | 需要 ASTER_RELEASE_SHA;构建 ci 镜像、创建临时网络/PostgreSQL/检查容器,运行全部检查;退出清理临时容器和网络,保留专属远端 Cargo 缓存卷 | -| [deploy-ces-control.sh](deploy-ces-control.sh) | ces-control root 执行;校验已构建镜像、锁定发布、保留密码和数据、验证新服务后切换 current,失败尝试恢复旧版;保留镜像 | +| [deploy-ces-control.sh](deploy-ces-control.sh) | ces-control root 执行;校验已构建镜像、锁定发布、保留密码和数据、验证新服务后切换 current,失败尝试恢复旧版;保留镜像;应用服务 aster 内调用 cli | CI/部署使用的镜像与路径仅属于本项目,禁止改动其他项目和共享 Runner。smoke.py 临时选择端口后再启动宿主,存在小的端口竞争窗口,指定环境遇到冲突可重试。 diff --git a/scripts/ci-ces-control.sh b/scripts/ci-ces-control.sh index b5e08ae..9df0f3d 100644 --- a/scripts/ci-ces-control.sh +++ b/scripts/ci-ces-control.sh @@ -47,6 +47,6 @@ docker run --name "$checks" --init --network "$network" \ --env ASTER_TEST_POSTGRES_URL='postgres://aster:aster-ci-only@postgres:5432/aster?sslmode=disable' \ "$image" sh -eu -c ' sh scripts/check.sh - cargo test -p aster-storage --test postgres --locked -- --ignored + cargo test -p storage --test postgres --locked -- --ignored python3 scripts/smoke.py ' diff --git a/scripts/deploy-ces-control.sh b/scripts/deploy-ces-control.sh index ffd4f76..c524dc9 100644 --- a/scripts/deploy-ces-control.sh +++ b/scripts/deploy-ces-control.sh @@ -45,11 +45,11 @@ if ! compose_at "$release" up -d --no-build --wait --wait-timeout 180; then rollback exit 1 fi -if ! compose_at "$release" exec -T aster aster metadata put deployment.release "$release_sha"; then +if ! compose_at "$release" exec -T aster cli metadata put deployment.release "$release_sha"; then rollback exit 1 fi -if ! actual=$(compose_at "$release" exec -T aster aster metadata get deployment.release); then +if ! actual=$(compose_at "$release" exec -T aster cli metadata get deployment.release); then rollback exit 1 fi diff --git a/scripts/smoke.py b/scripts/smoke.py index cd800b7..26646d0 100644 --- a/scripts/smoke.py +++ b/scripts/smoke.py @@ -24,8 +24,8 @@ def main(): # Cargo may use a configured CARGO_TARGET_DIR; discover the actual binaries. metadata = json.loads(run("cargo", "metadata", "--no-deps", "--format-version", "1", env=env)) binary_dir = Path(metadata["target_directory"]) / "debug" - cli = str(binary_dir / "aster") - server = str(binary_dir / "aster-server") + cli = str(binary_dir / "cli") + server = str(binary_dir / "server") with tempfile.TemporaryDirectory(prefix="aster-smoke-") as directory: env["SQLITE_PATH"] = str(Path(directory) / "nested" / "aster.db") # This must succeed even when an explicit database URL is invalid.