Pre-unlock wave U3 (highest-ROI). Task 7 from CONVERGENCE-PLAN — consolidate 2 provision-*.sh scripts into Rust via Backend trait. Old shells (provision-hetzner.sh, provision-vultr.sh) had identical 6-subcommand surface (create|status|destroy|list), log/die/check_deps helpers, idempotency contract. Sole delta: hcloud vs vultr-cli. RULE 0.2 says Rust-first when >50 LOC + growth expected. New crate _primitives/_rust/kei-provision/: - src/backend.rs (58 LOC) — Backend trait: create/status/destroy/list; CreateOpts and ServerInfo structs - src/backends/hetzner.rs (143 LOC) — shells to `hcloud server ...` --output=json, parses JSON response, honors HCLOUD_TOKEN env (RULE 0.8) - src/backends/vultr.rs (189 LOC) — same pattern, `vultr-cli instance`, honors VULTR_API_KEY env - src/exec.rs (100 LOC) — Command runner + PATH-aware env preservation - src/b64.rs (49 LOC) — minimal user-data base64 encoder; zero transitive deps - src/main.rs (141 LOC) — clap CLI `kei-provision <backend> <cmd>` - tests/backend_smoke.rs (184 LOC) — tempdir PATH-inject fake hcloud + fake vultr-cli, no real cloud. Mutex-serialized (Rust test parallelism). Tests: 11/11 (3 b64 unit + 8 backend_smoke integration). Coverage: hetzner status present/absent/list, vultr status found/absent/destroy idempotent, unknown-backend error, CreateOpts default. Old shells kept with superseded-v0.17 header — install.sh still copies them, legacy scripts still work. New users get kei-provision binary. harden-base.sh untouched (different lifecycle — runs on target VPS). Backend trait factored to accept aws/doctl/linode follow-ups without re-architecture. Workspace Cargo.toml: +kei-provision member (1 line). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
63 lines
1.6 KiB
TOML
63 lines
1.6 KiB
TOML
[workspace]
|
|
resolver = "2"
|
|
members = [
|
|
"kei-ledger",
|
|
"kei-migrate",
|
|
"kei-changelog",
|
|
"ssh-check",
|
|
"firewall-diff",
|
|
"mock-render",
|
|
"visual-diff",
|
|
"tokens-sync",
|
|
"kei-memory",
|
|
"kei-conflict-scan",
|
|
"kei-refactor-engine",
|
|
"kei-graph-check",
|
|
"kei-store",
|
|
# v0.14 LBM port — 10 new MCP-core primitives
|
|
"kei-router",
|
|
"kei-sage",
|
|
"kei-task",
|
|
"kei-chat-store",
|
|
"kei-crossdomain",
|
|
"kei-search-core",
|
|
"kei-content-store",
|
|
"kei-social-store",
|
|
"kei-curator",
|
|
"kei-auth",
|
|
# v0.15 artifact handoff pipeline
|
|
"kei-artifact",
|
|
# v0.18 exobrain CLI
|
|
"keisei",
|
|
# v1 substrate — local web wizard for scaffolding atoms (Stream A)
|
|
"kei-forge",
|
|
# v1 substrate — atom invocation runtime + schema linter (Stream D)
|
|
"kei-runtime",
|
|
# v1 substrate — shared atom discovery + frontmatter + safe path (Stream E)
|
|
"kei-atom-discovery",
|
|
# agent substrate v1 — phase 3 runtime (Capability trait + registry + compose/spawn/verify)
|
|
"kei-agent-runtime",
|
|
# agent substrate v1 — phase 3 hook-protocol CLI adapter
|
|
"kei-capability",
|
|
# v0.24 unification — unified VPS provisioner (supersedes provision-{hetzner,vultr}.sh)
|
|
"kei-provision",
|
|
]
|
|
|
|
[workspace.package]
|
|
edition = "2021"
|
|
rust-version = "1.75"
|
|
|
|
[workspace.dependencies]
|
|
clap = { version = "4", features = ["derive"] }
|
|
serde = { version = "1", features = ["derive"] }
|
|
serde_json = "1"
|
|
serde_yaml = "0.9"
|
|
sha2 = "0.10"
|
|
image = { version = "0.25", default-features = false, features = ["png"] }
|
|
regex = "1.10"
|
|
|
|
[profile.release]
|
|
opt-level = "z"
|
|
lto = true
|
|
strip = true
|
|
codegen-units = 1
|