From 1aa1b31a76f9987d149de6b5f6edd9667dbe760e Mon Sep 17 00:00:00 2001 From: Alexander Mills Date: Mon, 27 Jul 2026 14:34:17 -0500 Subject: [PATCH 01/16] feat: add credential-free release planning --- src/release.rs | 226 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 226 insertions(+) create mode 100644 src/release.rs diff --git a/src/release.rs b/src/release.rs new file mode 100644 index 00000000..513cb7de --- /dev/null +++ b/src/release.rs @@ -0,0 +1,226 @@ +use std::path::Path; + +use anyhow::Result; +use serde::Serialize; +use zed_interfaces::manifest::Manifest; + +use crate::config::read_manifest; + +#[derive(Debug, Clone, PartialEq, Eq, Serialize)] +pub struct ReleasePlan { + pub release_set: String, + pub source: ReleaseSource, + pub zed: Vec, + pub native: Vec, +} + +#[derive(Debug, Clone, PartialEq, Eq, Serialize)] +pub struct ReleaseSource { + pub package: String, + pub version: String, + pub vcs_tag: String, + pub repository: String, +} + +#[derive(Debug, Clone, PartialEq, Eq, Serialize)] +pub struct ZedReleaseArtifact { + pub target: Option, + pub package: String, + pub version: String, + pub dir: String, +} + +#[derive(Debug, Clone, PartialEq, Eq, Serialize)] +pub struct NativeReleaseArtifact { + pub target: String, + pub registry: String, + pub package: String, + pub version: String, + pub dir: String, +} + +pub fn build_plan(manifest: &Manifest) -> ReleasePlan { + let source_package = manifest.full_name(); + let version = manifest.package.version.clone(); + let vcs_tag = manifest.vcs_tag(); + + let zed = if manifest.targets.is_empty() { + vec![ZedReleaseArtifact { + target: None, + package: source_package.clone(), + version: version.clone(), + dir: ".".to_string(), + }] + } else { + manifest + .target_package_names() + .into_iter() + .map(|(target, package_name)| { + let section = manifest + .targets + .get(&target) + .expect("target_package_names only returns declared targets"); + ZedReleaseArtifact { + target: Some(target), + package: format!("{}/{}", manifest.package.org, package_name), + version: version.clone(), + dir: section.dir.clone(), + } + }) + .collect() + }; + + let native = manifest + .native_release_routes() + .into_iter() + .map(|route| NativeReleaseArtifact { + target: route.target, + registry: route.registry.as_str().to_string(), + package: route.package, + version: version.clone(), + dir: route.dir, + }) + .collect(); + + ReleasePlan { + release_set: format!("{source_package}@{version}#{vcs_tag}"), + source: ReleaseSource { + package: source_package, + version, + vcs_tag, + repository: manifest.package.repository.url.clone(), + }, + zed, + native, + } +} + +pub fn render_human(plan: &ReleasePlan) -> String { + let mut output = String::new(); + output.push_str(&format!("release set {}\n", plan.release_set)); + output.push_str(&format!( + "source: {} @ {} ({})\n", + plan.source.repository, plan.source.vcs_tag, plan.source.package + )); + output.push_str("zed artifacts:\n"); + for artifact in &plan.zed { + let target = artifact.target.as_deref().unwrap_or("repository"); + output.push_str(&format!( + " - {}/{} <- {} [target: {}]\n", + artifact.package, artifact.version, artifact.dir, target + )); + } + output.push_str("native artifacts:\n"); + if plan.native.is_empty() { + output.push_str(" - none declared\n"); + } else { + for artifact in &plan.native { + output.push_str(&format!( + " - {} {}@{} <- {} [target: {}]\n", + artifact.registry, + artifact.package, + artifact.version, + artifact.dir, + artifact.target + )); + } + } + output +} + +pub fn plan(project: &Path, json: bool) -> Result<()> { + let manifest = read_manifest(project)?; + let plan = build_plan(&manifest); + if json { + println!("{}", serde_json::to_string_pretty(&plan)?); + } else { + print!("{}", render_human(&plan)); + } + Ok(()) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn polyglot_plan_is_deterministic_and_includes_native_routes() { + let manifest = Manifest::parse( + r#" +[package] +org = "acme" +name = "clients" +version = "1.2.3" + +[package.repository] +url = "https://github.com/acme/clients" + +[targets.rust] +dir = "clients/rust" + +[targets.rust.native] +registry = "crates-io" +package = "acme-client" + +[targets.repository] +dir = "." +name = "clients-repository" + +[targets.nodejs] +dir = "clients/typescript" +adapter = "node" + +[targets.nodejs.native] +registry = "npm" +package = "@acme/client" +"#, + ) + .unwrap(); + + let plan = build_plan(&manifest); + assert_eq!(plan.release_set, "acme/clients@1.2.3#v1.2.3"); + assert_eq!( + plan.zed + .iter() + .map(|artifact| artifact.target.as_deref().unwrap()) + .collect::>(), + vec!["nodejs", "repository", "rust"] + ); + assert_eq!( + plan.native + .iter() + .map(|artifact| (artifact.registry.as_str(), artifact.package.as_str())) + .collect::>(), + vec![("npm", "@acme/client"), ("crates-io", "acme-client")] + ); + + let json = serde_json::to_string(&plan).unwrap(); + assert!(json.contains("\"release_set\":\"acme/clients@1.2.3#v1.2.3\"")); + let human = render_human(&plan); + assert!(human.contains("native artifacts:")); + assert!(human.contains("npm @acme/client@1.2.3")); + } + + #[test] + fn single_language_plan_keeps_the_root_package() { + let manifest = Manifest::parse( + r#" +[package] +org = "acme" +name = "http-kit" +version = "0.4.0" + +[package.repository] +url = "https://github.com/acme/http-kit" +"#, + ) + .unwrap(); + + let plan = build_plan(&manifest); + assert_eq!(plan.zed.len(), 1); + assert_eq!(plan.zed[0].target, None); + assert_eq!(plan.zed[0].package, "acme/http-kit"); + assert!(plan.native.is_empty()); + assert!(render_human(&plan).contains("none declared")); + } +} From 5cdd95672b319e43d5547e1fdb7c04c7b74e1751 Mon Sep 17 00:00:00 2001 From: Alexander Mills Date: Mon, 27 Jul 2026 14:34:29 -0500 Subject: [PATCH 02/16] feat: expose release planning module --- src/lib.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/lib.rs b/src/lib.rs index 08072f9b..04fb1b8e 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -9,6 +9,7 @@ pub mod ops; pub mod pack; pub mod r2g; pub mod registry; +pub mod release; pub mod store; pub mod update; pub mod vcs; From 078461a95021a2afaccf4e4ec39d1c6de86bab4e Mon Sep 17 00:00:00 2001 From: Alexander Mills Date: Mon, 27 Jul 2026 14:34:49 -0500 Subject: [PATCH 03/16] feat: dispatch release plan command --- src/main.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main.rs b/src/main.rs index 184b0610..15d47ac6 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,9 +1,10 @@ use clap::Parser; use zed_cli::auth; -use zed_cli::cli::{AuthCmd, CacheCmd, Cli, Cmd, OrgCmd, StoreCmd}; +use zed_cli::cli::{AuthCmd, CacheCmd, Cli, Cmd, OrgCmd, ReleaseCmd, StoreCmd}; use zed_cli::config::Config; use zed_cli::ops; use zed_cli::r2g::{self, R2gOptions}; +use zed_cli::release; use zed_cli::store::Store; use zed_cli::update; @@ -50,6 +51,9 @@ fn run(cli: Cli) -> anyhow::Result<()> { } => ops::gc(&cfg, &older_than, dry_run), Cmd::Find { query } => ops::find(&cfg, &query), Cmd::Pack { out } => ops::pack_cmd(&cwd, out.as_deref()).map(|_| ()), + Cmd::Release { cmd } => match cmd { + ReleaseCmd::Plan { json } => release::plan(&cwd, json), + }, Cmd::Publish { dry_run, allow_dirty, From 1e96a719d9da4f87ee468d424264bc36620e28d0 Mon Sep 17 00:00:00 2001 From: Alexander Mills Date: Mon, 27 Jul 2026 14:35:34 -0500 Subject: [PATCH 04/16] chore: add deterministic release CLI patch --- scripts/apply_release_plan_cli.py | 121 ++++++++++++++++++++++++++++++ 1 file changed, 121 insertions(+) create mode 100644 scripts/apply_release_plan_cli.py diff --git a/scripts/apply_release_plan_cli.py b/scripts/apply_release_plan_cli.py new file mode 100644 index 00000000..e840260f --- /dev/null +++ b/scripts/apply_release_plan_cli.py @@ -0,0 +1,121 @@ +#!/usr/bin/env python3 +"""Wire the DEN-100 release-plan command into Clap, flags2env, and docs.""" + +from pathlib import Path + + +def replace_once(path: str, old: str, new: str, label: str) -> None: + file = Path(path) + text = file.read_text(encoding="utf-8") + count = text.count(old) + if count != 1: + raise SystemExit(f"{label}: expected one insertion point, found {count}") + file.write_text(text.replace(old, new, 1), encoding="utf-8") + + +replace_once( + "src/cli.rs", + ''' /// Build the pruned, deterministic artifact for this package + Pack { + #[arg(long, env = "ZED_PKG_PACK_OUT")] + out: Option, + }, + /// Pack, verify VCS tag provenance, and upload to the registry + Publish {''', + ''' /// Build the pruned, deterministic artifact for this package + Pack { + #[arg(long, env = "ZED_PKG_PACK_OUT")] + out: Option, + }, + /// Plan a coordinated Zed + native-registry release without credentials or uploads + Release { + #[command(subcommand)] + cmd: ReleaseCmd, + }, + /// Pack, verify VCS tag provenance, and upload to the registry + Publish {''', + "Cmd::Release", +) + +replace_once( + "src/cli.rs", + '''#[derive(Debug, Subcommand)] +pub enum AuthCmd {''', + '''#[derive(Debug, Subcommand)] +pub enum ReleaseCmd { + /// Print the deterministic release set derived from `.zpkg.toml` + Plan { + /// Emit machine-readable JSON rather than the human summary + #[arg(long, env = "ZED_PKG_RELEASE_JSON")] + json: bool, + }, +} + +#[derive(Debug, Subcommand)] +pub enum AuthCmd {''', + "ReleaseCmd enum", +) + +replace_once( + ".cli-flags.toml", + '''[flags.out] +env = "ZED_PKG_PACK_OUT" +aliases = ["out"] +type = "string" +help = "Packed artifact output path." + +[flags.allow_dirty]''', + '''[flags.out] +env = "ZED_PKG_PACK_OUT" +aliases = ["out"] +type = "string" +help = "Packed artifact output path." + +[flags.release_json] +env = "ZED_PKG_RELEASE_JSON" +aliases = ["json"] +type = "bool" +default = "false" +help = "Emit a machine-readable release plan." + +[flags.allow_dirty]''', + "release_json flag", +) + +replace_once( + ".cli-flags.toml", + '''[commands.pack] +help = "Pack an artifact." + +[commands.publish]''', + '''[commands.pack] +help = "Pack an artifact." + +[commands.release] +help = "Coordinate Zed and native-registry releases." + +[commands.release.commands.plan] +help = "Print a credential-free deterministic release plan." + +[commands.release.commands.plan.flags.release_json] +env = "ZED_PKG_RELEASE_JSON" +aliases = ["json"] +type = "bool" +default = "false" +help = "Emit the release plan as JSON." + +[commands.publish]''', + "release flags2env command", +) + +replace_once( + "README.md", + '''| `zed pack` | Build the pruned, deterministic `tar.gz` artifact | +| `zed publish` | Verify clean tree + matching VCS tag at HEAD, pack, upload |''', + '''| `zed pack` | Build the pruned, deterministic `tar.gz` artifact | +| `zed release plan [--json]` | Print the credential-free Zed + native-registry release set derived from `.zpkg.toml` | +| `zed publish` | Verify clean tree + matching VCS tag at HEAD, pack, upload |''', + "README command table", +) + +print("wired release plan command") From 348f7638f1cb387fe10f12e0e26b88f3ae35abad Mon Sep 17 00:00:00 2001 From: Alexander Mills Date: Mon, 27 Jul 2026 14:36:01 -0500 Subject: [PATCH 05/16] ci: apply release-plan CLI wiring --- .../apply-release-plan-temporary.yml | 54 +++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 .github/workflows/apply-release-plan-temporary.yml diff --git a/.github/workflows/apply-release-plan-temporary.yml b/.github/workflows/apply-release-plan-temporary.yml new file mode 100644 index 00000000..59b6b401 --- /dev/null +++ b/.github/workflows/apply-release-plan-temporary.yml @@ -0,0 +1,54 @@ +name: Apply release-plan CLI wiring (temporary) + +on: + pull_request: + types: [opened, synchronize, reopened] + +permissions: + contents: write + +jobs: + apply: + if: >- + github.event.pull_request.head.repo.full_name == github.repository && + github.head_ref == 'feat/den-100-release-plan' && + github.actor == 'ORESoftware' + runs-on: ubuntu-latest + timeout-minutes: 20 + steps: + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 + with: + ref: ${{ github.head_ref }} + path: zed-cli + fetch-depth: 0 + persist-credentials: true + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 + with: + repository: zed-pkg/zed-interfaces + ref: main + path: zed-interfaces + persist-credentials: false + - uses: dtolnay/rust-toolchain@4be7066ada62dd38de10e7b70166bc74ed198c30 + with: + toolchain: stable + components: rustfmt + - name: Wire Clap, flags2env, and documentation + working-directory: zed-cli + run: python3 scripts/apply_release_plan_cli.py + - name: Format and test + working-directory: zed-cli + run: | + cargo fmt --all + cargo test --locked + - name: Commit release-plan wiring to the feature branch + working-directory: zed-cli + run: | + git config user.name "github-actions[bot]" + git config user.email "41898282+github-actions[bot]@users.noreply.github.com" + git add src/cli.rs .cli-flags.toml README.md + if git diff --cached --quiet; then + echo "Release-plan wiring is already current." + exit 0 + fi + git commit -m "feat: expose release plan command" + git push origin HEAD:feat/den-100-release-plan From 046506b528ac19f1be0ee223c06e48ff67b375d9 Mon Sep 17 00:00:00 2001 From: Alexander Mills Date: Mon, 27 Jul 2026 14:39:44 -0500 Subject: [PATCH 06/16] ci: commit release-plan candidate before test --- .github/workflows/apply-release-plan-temporary.yml | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/.github/workflows/apply-release-plan-temporary.yml b/.github/workflows/apply-release-plan-temporary.yml index 59b6b401..4680cfc1 100644 --- a/.github/workflows/apply-release-plan-temporary.yml +++ b/.github/workflows/apply-release-plan-temporary.yml @@ -35,11 +35,9 @@ jobs: - name: Wire Clap, flags2env, and documentation working-directory: zed-cli run: python3 scripts/apply_release_plan_cli.py - - name: Format and test + - name: Format candidate changes working-directory: zed-cli - run: | - cargo fmt --all - cargo test --locked + run: cargo fmt --all - name: Commit release-plan wiring to the feature branch working-directory: zed-cli run: | @@ -52,3 +50,6 @@ jobs: fi git commit -m "feat: expose release plan command" git push origin HEAD:feat/den-100-release-plan + - name: Test the committed candidate + working-directory: zed-cli + run: cargo test --locked From b8ada50cf8d4ef0fb95be755a7cd6456fb8dadea Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 27 Jul 2026 19:39:56 +0000 Subject: [PATCH 07/16] feat: expose release plan command --- .cli-flags.toml | 20 ++++++++++++++++++++ README.md | 1 + src/cli.rs | 15 +++++++++++++++ 3 files changed, 36 insertions(+) diff --git a/.cli-flags.toml b/.cli-flags.toml index 323ca83d..dd7dbf9a 100644 --- a/.cli-flags.toml +++ b/.cli-flags.toml @@ -119,6 +119,13 @@ aliases = ["out"] type = "string" help = "Packed artifact output path." +[flags.release_json] +env = "ZED_PKG_RELEASE_JSON" +aliases = ["json"] +type = "bool" +default = "false" +help = "Emit a machine-readable release plan." + [flags.allow_dirty] env = "ZED_PKG_ALLOW_DIRTY" aliases = ["allow-dirty"] @@ -255,6 +262,19 @@ help = "Search the registry." [commands.pack] help = "Pack an artifact." +[commands.release] +help = "Coordinate Zed and native-registry releases." + +[commands.release.commands.plan] +help = "Print a credential-free deterministic release plan." + +[commands.release.commands.plan.flags.release_json] +env = "ZED_PKG_RELEASE_JSON" +aliases = ["json"] +type = "bool" +default = "false" +help = "Emit the release plan as JSON." + [commands.publish] help = "Publish an artifact." diff --git a/README.md b/README.md index 119ef84d..0bf63d35 100644 --- a/README.md +++ b/README.md @@ -99,6 +99,7 @@ registry hosts both on S3/Cloudflare R2. | `zed install --frozen` | Install exactly what `.zpkg.lock` pins (CI/containers) | | `zed find ` | Search the registry | | `zed pack` | Build the pruned, deterministic `tar.gz` artifact | +| `zed release plan [--json]` | Print the credential-free Zed + native-registry release set derived from `.zpkg.toml` | | `zed publish` | Verify clean tree + matching VCS tag at HEAD, pack, upload | | `zed r2g` (`zed test-local`) | Roundtrip-test your artifact: install it into a mock consumer under `~/.zed-pkg/r2g` and run `publish.smoke_test`, optionally inside an OCI container (`--docker`) | | `zed run [args]` | Run an executable a dependency exposes via `[bin]`, with `zed_modules/.bin` on `PATH` (npx-style, no global pollution) | diff --git a/src/cli.rs b/src/cli.rs index 30362d28..d27327c3 100644 --- a/src/cli.rs +++ b/src/cli.rs @@ -189,6 +189,11 @@ pub enum Cmd { #[arg(long, env = "ZED_PKG_PACK_OUT")] out: Option, }, + /// Plan a coordinated Zed + native-registry release without credentials or uploads + Release { + #[command(subcommand)] + cmd: ReleaseCmd, + }, /// Pack, verify VCS tag provenance, and upload to the registry Publish { #[arg(long, env = "ZED_PKG_DRY_RUN")] @@ -310,6 +315,16 @@ pub enum Cmd { }, } +#[derive(Debug, Subcommand)] +pub enum ReleaseCmd { + /// Print the deterministic release set derived from `.zpkg.toml` + Plan { + /// Emit machine-readable JSON rather than the human summary + #[arg(long, env = "ZED_PKG_RELEASE_JSON")] + json: bool, + }, +} + #[derive(Debug, Subcommand)] pub enum AuthCmd { /// Sign in and save a refreshable local session From 515b305bcce6266a75dbf6a4b7ea69c46c79b305 Mon Sep 17 00:00:00 2001 From: Alexander Mills Date: Mon, 27 Jul 2026 14:41:29 -0500 Subject: [PATCH 08/16] ci: collect exact release-plan test output --- ...ect-release-plan-test-output-temporary.yml | 53 +++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 .github/workflows/collect-release-plan-test-output-temporary.yml diff --git a/.github/workflows/collect-release-plan-test-output-temporary.yml b/.github/workflows/collect-release-plan-test-output-temporary.yml new file mode 100644 index 00000000..d432bec7 --- /dev/null +++ b/.github/workflows/collect-release-plan-test-output-temporary.yml @@ -0,0 +1,53 @@ +name: Collect release-plan test output (temporary) + +on: + pull_request: + types: [synchronize] + +permissions: + contents: write + +jobs: + collect: + if: >- + github.event.pull_request.head.repo.full_name == github.repository && + github.head_ref == 'feat/den-100-release-plan' && + github.actor == 'ORESoftware' + runs-on: ubuntu-latest + timeout-minutes: 20 + steps: + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 + with: + ref: ${{ github.head_ref }} + path: zed-cli + fetch-depth: 0 + persist-credentials: true + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 + with: + repository: zed-pkg/zed-interfaces + ref: main + path: zed-interfaces + persist-credentials: false + - uses: dtolnay/rust-toolchain@4be7066ada62dd38de10e7b70166bc74ed198c30 + with: + toolchain: stable + - name: Capture exact test output + working-directory: zed-cli + run: | + set +e + cargo test --locked > ci-release-plan-test-output.txt 2>&1 + status=$? + set -e + if [ "$status" -eq 0 ]; then + echo "cargo test passed" > ci-release-plan-test-output.txt + else + printf '\nexit_status=%s\n' "$status" >> ci-release-plan-test-output.txt + fi + - name: Commit diagnostic output to the feature branch + working-directory: zed-cli + run: | + git config user.name "github-actions[bot]" + git config user.email "41898282+github-actions[bot]@users.noreply.github.com" + git add ci-release-plan-test-output.txt + git commit -m "ci: capture release-plan test output" + git push origin HEAD:feat/den-100-release-plan From 41ec56ea5b7f4807154cdf77a80465d92357aff5 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 27 Jul 2026 19:42:32 +0000 Subject: [PATCH 09/16] ci: capture release-plan test output --- ci-release-plan-test-output.txt | 423 ++++++++++++++++++++++++++++++++ 1 file changed, 423 insertions(+) create mode 100644 ci-release-plan-test-output.txt diff --git a/ci-release-plan-test-output.txt b/ci-release-plan-test-output.txt new file mode 100644 index 00000000..479c3682 --- /dev/null +++ b/ci-release-plan-test-output.txt @@ -0,0 +1,423 @@ + Updating crates.io index + Updating git repository `https://github.com/ORESoftware/flags-2-env.git` + Downloading crates ... + Downloaded anstream v1.0.0 + Downloaded adler2 v2.0.1 + Downloaded heck v0.5.0 + Downloaded anstyle v1.0.14 + Downloaded anstyle-parse v1.0.0 + Downloaded cfg_aliases v0.2.2 + Downloaded atomic-waker v1.1.2 + Downloaded block-buffer v0.10.4 + Downloaded cfg-if v1.0.4 + Downloaded crypto-common v0.1.7 + Downloaded schemars v1.2.1 + Downloaded same-file v1.0.6 + Downloaded dyn-clone v1.0.20 + Downloaded ryu v1.0.23 + Downloaded ref-cast v1.0.26 + Downloaded option-ext v0.2.0 + Downloaded potential_utf v0.1.5 + Downloaded colorchoice v1.0.5 + Downloaded dirs-sys v0.4.1 + Downloaded equivalent v1.0.2 + Downloaded form_urlencoded v1.2.2 + Downloaded hex v0.4.3 + Downloaded futures-task v0.3.33 + Downloaded schemars_derive v1.2.1 + Downloaded tower-service v0.3.3 + Downloaded try-lock v0.2.5 + Downloaded futures-sink v0.3.33 + Downloaded http-body v1.1.0 + Downloaded idna_adapter v1.2.2 + Downloaded ref-cast-impl v1.0.26 + Downloaded litemap v0.8.2 + Downloaded pin-project-lite v0.2.17 + Downloaded dirs v5.0.1 + Downloaded futures-channel v0.3.33 + Downloaded tinyvec_macros v0.1.1 + Downloaded cpufeatures v0.2.17 + Downloaded cpufeatures v0.3.0 + Downloaded subtle v2.6.1 + Downloaded futures-core v0.3.33 + Downloaded rand_pcg v0.10.2 + Downloaded errno v0.3.14 + Downloaded futures-io v0.3.33 + Downloaded anstyle-query v1.1.5 + Downloaded rustc-hash v2.1.3 + Downloaded percent-encoding v2.3.2 + Downloaded generic-array v0.14.7 + Downloaded is_terminal_polyfill v1.70.2 + Downloaded lru-slab v0.1.2 + Downloaded mime v0.3.17 + Downloaded rtoolbox v0.0.5 + Downloaded fs2 v0.4.3 + Downloaded version_check v0.9.5 + Downloaded clap_lex v1.1.0 + Downloaded rand_core v0.10.1 + Downloaded digest v0.10.7 + Downloaded mime_guess v2.0.5 + Downloaded hyper-rustls v0.27.9 + Downloaded quote v1.0.47 + Downloaded displaydoc v0.2.6 + Downloaded globset v0.4.19 + Downloaded ipnet v2.12.0 + Downloaded itoa v1.0.18 + Downloaded serde_spanned v1.1.1 + Downloaded sync_wrapper v1.0.2 + Downloaded zerofrom v0.1.8 + Downloaded strsim v0.11.1 + Downloaded filetime v0.2.29 + Downloaded find-msvc-tools v0.1.9 + Downloaded libloading v0.8.9 + Downloaded once_cell v1.21.4 + Downloaded crc32fast v1.5.0 + Downloaded fastrand v2.5.0 + Downloaded getrandom v0.2.17 + Downloaded rpassword v7.5.4 + Downloaded clap_derive v4.6.4 + Downloaded utf8parse v0.2.2 + Downloaded chacha20 v0.10.1 + Downloaded anyhow v1.0.104 + Downloaded http-body-util v0.1.4 + Downloaded want v0.3.1 + Downloaded httparse v1.10.1 + Downloaded tower-layer v0.3.3 + Downloaded serde_urlencoded v0.7.1 + Downloaded clap v4.6.4 + Downloaded bitflags v2.13.1 + Downloaded getrandom v0.4.3 + Downloaded proc-macro2 v1.0.107 + Downloaded quinn-udp v0.5.15 + Downloaded bytes v1.12.1 + Downloaded icu_normalizer_data v2.2.0 + Downloaded icu_properties v2.2.0 + Downloaded log v0.4.33 + Downloaded miniz_oxide v0.8.9 + Downloaded base64 v0.22.1 + Downloaded icu_normalizer v2.2.0 + Downloaded icu_provider v2.2.0 + Downloaded cc v1.3.0 + Downloaded aho-corasick v1.1.4 + Downloaded icu_collections v2.2.0 + Downloaded xattr v1.6.1 + Downloaded slab v0.4.12 + Downloaded zmij v1.0.23 + Downloaded shlex v2.0.1 + Downloaded flate2 v1.1.9 + Downloaded icu_locale_core v2.2.0 + Downloaded quinn v0.11.11 + Downloaded rustls-webpki v0.103.13 + Downloaded bumpalo v3.20.3 + Downloaded http v1.4.2 + Downloaded indexmap v2.14.0 + Downloaded memchr v2.8.3 + Downloaded mio v1.2.2 + Downloaded rand v0.10.2 + Downloaded hyper-util v0.1.20 + Downloaded clap_builder v4.6.2 + Downloaded idna v1.1.0 + Downloaded icu_properties_data v2.2.0 + Downloaded reqwest v0.12.28 + Downloaded futures-util v0.3.33 + Downloaded hashbrown v0.17.1 + Downloaded hyper v1.11.0 + Downloaded yoke-derive v0.8.2 + Downloaded zerofrom-derive v0.1.7 + Downloaded simd-adler32 v0.3.10 + Downloaded stable_deref_trait v1.2.1 + Downloaded toml_writer v1.1.2+spec-1.1.0 + Downloaded unicase v2.9.0 + Downloaded utf8_iter v1.0.4 + Downloaded writeable v0.6.3 + Downloaded thiserror v2.0.19 + Downloaded thiserror-impl v2.0.19 + Downloaded toml_datetime v1.1.1+spec-1.1.0 + Downloaded zeroize v1.9.0 + Downloaded quinn-proto v0.11.16 + Downloaded bstr v1.13.0 + Downloaded regex-automata v0.4.16 + Downloaded tinystr v0.8.3 + Downloaded synstructure v0.13.2 + Downloaded untrusted v0.9.0 + Downloaded walkdir v2.5.0 + Downloaded tempfile v3.27.0 + Downloaded toml_parser v1.1.2+spec-1.1.0 + Downloaded rustls-pki-types v1.15.1 + Downloaded serde_derive_internals v0.29.1 + Downloaded zerovec-derive v0.11.3 + Downloaded libc v0.2.189 + Downloaded serde_derive v1.0.229 + Downloaded smallvec v1.15.2 + Downloaded yoke v0.8.3 + Downloaded ring v0.17.14 + Downloaded socket2 v0.6.5 + Downloaded tracing-core v0.1.36 + Downloaded semver v1.0.28 + Downloaded sha2 v0.10.9 + Downloaded toml v1.1.3+spec-1.1.0 + Downloaded tinyvec v1.12.0 + Downloaded unicode-ident v1.0.24 + Downloaded tar v0.4.46 + Downloaded tokio-rustls v0.26.4 + Downloaded zopfli v0.8.3 + Downloaded serde_core v1.0.229 + Downloaded url v2.5.8 + Downloaded linux-raw-sys v0.12.1 + Downloaded zerotrie v0.2.4 + Downloaded tower v0.5.3 + Downloaded serde v1.0.229 + Downloaded typenum v1.20.1 + Downloaded typed-path v0.12.3 + Downloaded zerovec v0.11.6 + Downloaded zip v8.6.0 + Downloaded tower-http v0.6.11 + Downloaded serde_json v1.0.151 + Downloaded winnow v1.0.4 + Downloaded webpki-roots v1.0.9 + Downloaded zlib-rs v0.6.6 + Downloaded regex-syntax v0.8.11 + Downloaded syn v2.0.119 + Downloaded syn v3.0.3 + Downloaded rustls v0.23.42 + Downloaded rustix v1.1.4 + Downloaded tracing v0.1.44 + Downloaded tokio v1.53.1 + Compiling proc-macro2 v1.0.107 + Compiling unicode-ident v1.0.24 + Compiling quote v1.0.47 + Compiling libc v0.2.189 + Compiling cfg-if v1.0.4 + Compiling memchr v2.8.3 + Compiling stable_deref_trait v1.2.1 + Compiling serde_core v1.0.229 + Compiling itoa v1.0.18 + Compiling bytes v1.12.1 + Compiling pin-project-lite v0.2.17 + Compiling shlex v2.0.1 + Compiling futures-core v0.3.33 + Compiling syn v2.0.119 + Compiling syn v3.0.3 + Compiling find-msvc-tools v0.1.9 + Compiling cc v1.3.0 + Compiling writeable v0.6.3 + Compiling litemap v0.8.2 + Compiling smallvec v1.15.2 + Compiling socket2 v0.6.5 + Compiling ring v0.17.14 + Compiling synstructure v0.13.2 + Compiling mio v1.2.2 + Compiling icu_normalizer_data v2.2.0 + Compiling once_cell v1.21.4 + Compiling futures-sink v0.3.33 + Compiling icu_properties_data v2.2.0 + Compiling utf8_iter v1.0.4 + Compiling tokio v1.53.1 + Compiling zerofrom-derive v0.1.7 + Compiling yoke-derive v0.8.2 + Compiling zerofrom v0.1.8 + Compiling zerovec-derive v0.11.3 + Compiling yoke v0.8.3 + Compiling displaydoc v0.2.6 + Compiling zerovec v0.11.6 + Compiling zerotrie v0.2.4 + Compiling tinystr v0.8.3 + Compiling potential_utf v0.1.5 + Compiling icu_locale_core v2.2.0 + Compiling icu_collections v2.2.0 + Compiling http v1.4.2 + Compiling icu_provider v2.2.0 + Compiling version_check v0.9.5 + Compiling percent-encoding v2.3.2 + Compiling zmij v1.0.23 + Compiling zeroize v1.9.0 + Compiling generic-array v0.14.7 + Compiling rustls-pki-types v1.15.1 + Compiling http-body v1.1.0 + Compiling getrandom v0.2.17 + Compiling futures-io v0.3.33 + Compiling serde_json v1.0.151 + Compiling slab v0.4.12 + Compiling untrusted v0.9.0 + Compiling httparse v1.10.1 + Compiling bitflags v2.13.1 + Compiling serde v1.0.229 + Compiling futures-task v0.3.33 + Compiling futures-util v0.3.33 + Compiling icu_properties v2.2.0 + Compiling icu_normalizer v2.2.0 + Compiling serde_derive v1.0.229 + Compiling rustix v1.1.4 + Compiling rustls v0.23.42 + Compiling crc32fast v1.5.0 + Compiling try-lock v0.2.5 + Compiling tower-service v0.3.3 + Compiling typenum v1.20.1 + Compiling want v0.3.1 + Compiling idna_adapter v1.2.2 + Compiling form_urlencoded v1.2.2 + Compiling tracing-core v0.1.36 + Compiling futures-channel v0.3.33 + Compiling utf8parse v0.2.2 + Compiling ref-cast v1.0.26 + Compiling subtle v2.6.1 + Compiling simd-adler32 v0.3.10 + Compiling linux-raw-sys v0.12.1 + Compiling atomic-waker v1.1.2 + Compiling log v0.4.33 + Compiling unicase v2.9.0 + Compiling hyper v1.11.0 + Compiling mime_guess v2.0.5 + Compiling anstyle-parse v1.0.0 + Compiling tracing v0.1.44 + Compiling idna v1.1.0 + Compiling ref-cast-impl v1.0.26 + Compiling serde_derive_internals v0.29.1 + Compiling rustls-webpki v0.103.13 + Compiling sync_wrapper v1.0.2 + Compiling base64 v0.22.1 + Compiling tower-layer v0.3.3 + Compiling is_terminal_polyfill v1.70.2 + Compiling thiserror v2.0.19 + Compiling ipnet v2.12.0 + Compiling anstyle-query v1.1.5 + Compiling getrandom v0.4.3 + Compiling colorchoice v1.0.5 + Compiling adler2 v2.0.1 + Compiling winnow v1.0.4 + Compiling anstyle v1.0.14 + Compiling anstream v1.0.0 + Compiling miniz_oxide v0.8.9 + Compiling toml_parser v1.1.2+spec-1.1.0 + Compiling hyper-util v0.1.20 + Compiling tower v0.5.3 + Compiling schemars_derive v1.2.1 + Compiling url v2.5.8 + Compiling block-buffer v0.10.4 + Compiling crypto-common v0.1.7 + Compiling webpki-roots v1.0.9 + Compiling thiserror-impl v2.0.19 + Compiling tokio-rustls v0.26.4 + Compiling toml_datetime v1.1.1+spec-1.1.0 + Compiling serde_spanned v1.1.1 + Compiling aho-corasick v1.1.4 + Compiling regex-syntax v0.8.11 + Compiling ryu v1.0.23 + Compiling dyn-clone v1.0.20 + Compiling toml_writer v1.1.2+spec-1.1.0 + Compiling anyhow v1.0.104 + Compiling hashbrown v0.17.1 + Compiling equivalent v1.0.2 + Compiling bumpalo v3.20.3 + Compiling heck v0.5.0 + Compiling zlib-rs v0.6.6 + Compiling mime v0.3.17 + Compiling clap_lex v1.1.0 + Compiling strsim v0.11.1 + Compiling option-ext v0.2.0 + Compiling dirs-sys v0.4.1 + Compiling clap_builder v4.6.2 + Compiling clap_derive v4.6.4 + Compiling zopfli v0.8.3 + Compiling indexmap v2.14.0 + Compiling toml v1.1.3+spec-1.1.0 + Compiling regex-automata v0.4.16 + Compiling schemars v1.2.1 + Compiling flate2 v1.1.9 + Compiling serde_urlencoded v0.7.1 + Compiling hyper-rustls v0.27.9 + Compiling digest v0.10.7 + Compiling tower-http v0.6.11 + Compiling xattr v1.6.1 + Compiling http-body-util v0.1.4 + Compiling semver v1.0.28 + Compiling filetime v0.2.29 + Compiling rtoolbox v0.0.5 + Compiling bstr v1.13.0 + Compiling libloading v0.8.9 + Compiling cpufeatures v0.2.17 + Compiling typed-path v0.12.3 + Compiling same-file v1.0.6 + Compiling fastrand v2.5.0 + Compiling walkdir v2.5.0 + Compiling tempfile v3.27.0 + Compiling globset v0.4.19 + Compiling flags2env v0.1.0 (https://github.com/ORESoftware/flags-2-env.git?rev=069787b71a9215aa58297216240559eaf3017ca6#069787b7) + Compiling sha2 v0.10.9 + Compiling rpassword v7.5.4 + Compiling zip v8.6.0 + Compiling zed-interfaces v0.1.0 (/home/runner/work/zed-cli/zed-cli/zed-interfaces) + Compiling tar v0.4.46 + Compiling reqwest v0.12.28 + Compiling clap v4.6.4 + Compiling dirs v5.0.1 + Compiling fs2 v0.4.3 + Compiling hex v0.4.3 + Compiling zed-cli v0.1.0 (/home/runner/work/zed-cli/zed-cli/zed-cli) + Finished `test` profile [unoptimized + debuginfo] target(s) in 46.32s + Running unittests src/lib.rs (target/debug/deps/zed_cli-4868c9408e3768d1) + +running 45 tests +test auth::tests::shared_auth_bearer_wins_and_supabase_is_fallback ... ok +test auth::tests::base_urls_require_https_except_for_loopback ... ok +test auth::tests::supabase_confirmation_response_has_no_session ... ok +test cli::tests::flags_2_env_convention_holds ... ok +test cli::tests::cli_flags_toml_is_in_sync_with_clap ... FAILED +test auth::tests::store_roundtrip_is_scoped_by_auth_authority ... ok +test auth::tests::auth_directory_and_session_file_have_private_modes ... ok +test config::tests::credentials_load_rejects_malformed_toml ... ok +test config::tests::credentials_file_is_0600_even_over_a_lax_existing_file ... ok +test config::tests::credentials_load_without_file_is_empty_not_an_error ... ok +test config::tests::relative_home_is_resolved_from_the_invocation_directory ... ok +test config::tests::credentials_roundtrip_normalizes_registry_slashes ... ok +test config::tests::resolve_token_prefers_explicit_over_saved_credentials ... ok +test ops::tests::parse_age_rejects_garbage ... ok +test ops::tests::parse_age_saturates_instead_of_overflowing ... ok +test config::tests::resolve_token_survives_a_corrupt_credentials_file ... ok +test ops::tests::parse_age_units_and_default ... ok +test ops::tests::split_key_accepts_org_name_and_keeps_nested_slashes_in_name ... ok +test ops::tests::split_key_rejects_missing_or_empty_halves ... ok +test cli::tests::readme_documents_every_command ... ok +test r2g::tests::container_args_default_checks_artifact_presence ... ok +test r2g::tests::container_args_honor_a_relocated_install_dir ... ok +test r2g::tests::container_args_mount_workdir_and_target ... ok +test registry::tests::canonical_artifact_url_respects_registry_override ... ok +test registry::tests::presigned_external_artifact_url_is_preserved ... ok +test release::tests::polyglot_plan_is_deterministic_and_includes_native_routes ... ok +test release::tests::single_language_plan_keeps_the_root_package ... ok +test store::tests::gc_drops_refs_for_projects_that_no_longer_exist ... ok +test cli::tests::flat_and_nested_auth_spellings_dispatch_identically ... ok +test store::tests::gc_prunes_by_stamp_age_but_spares_referenced_and_fresh_entries ... ok +test store::tests::human_size_formats_binary_units ... ok +test update::tests::asset_target_is_platform_shaped ... ok +test store::tests::gc_survives_hostile_max_age ... ok +test update::tests::extract_binary_finds_zed_exe_inside_a_zip ... ok +test update::tests::extract_binary_finds_zed_inside_a_tar_gz ... ok +test update::tests::extract_binary_rejects_an_archive_without_the_binary ... ok +test update::tests::semver_comparison_strips_v ... ok +test update::tests::sha256sums_handles_binary_mode_and_uppercase ... ok +test update::tests::sha256sums_matches_asset_line ... ok +test update::tests::replace_exe_swaps_contents_atomically_and_keeps_exec_bit ... ok +test update::tests::sha256sums_mismatch_is_detectable ... ok +test update::tests::tag_parsing_from_redirect_url ... ok +test update::tests::sha256sums_rejects_missing_or_malformed ... ok +test pack::tests::polyglot_pack_re_roots_and_isolates_every_target ... ok +test pack::tests::polyglot_pack_can_include_a_whole_repository_target ... ok + +failures: + +---- cli::tests::cli_flags_toml_is_in_sync_with_clap stdout ---- + +thread 'cli::tests::cli_flags_toml_is_in_sync_with_clap' (5011) panicked at src/cli.rs:564:21: +duplicate env `ZED_PKG_RELEASE_JSON` in .cli-flags.toml +note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace + + +failures: + cli::tests::cli_flags_toml_is_in_sync_with_clap + +test result: FAILED. 44 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.04s + +error: test failed, to rerun pass `--lib` + +exit_status=101 From 78438d2c159cb7ca628e70238a96625525c809c8 Mon Sep 17 00:00:00 2001 From: Alexander Mills Date: Mon, 27 Jul 2026 14:43:38 -0500 Subject: [PATCH 10/16] ci: fix release-plan flag scope --- .../fix-release-plan-flags-temporary.yml | 66 +++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 .github/workflows/fix-release-plan-flags-temporary.yml diff --git a/.github/workflows/fix-release-plan-flags-temporary.yml b/.github/workflows/fix-release-plan-flags-temporary.yml new file mode 100644 index 00000000..da7f1a55 --- /dev/null +++ b/.github/workflows/fix-release-plan-flags-temporary.yml @@ -0,0 +1,66 @@ +name: Fix release-plan flag scope (temporary) + +on: + pull_request: + types: [synchronize] + +permissions: + contents: write + +jobs: + fix: + if: >- + github.event.pull_request.head.repo.full_name == github.repository && + github.head_ref == 'feat/den-100-release-plan' && + github.actor == 'ORESoftware' + runs-on: ubuntu-latest + timeout-minutes: 20 + steps: + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 + with: + ref: ${{ github.head_ref }} + path: zed-cli + fetch-depth: 0 + persist-credentials: true + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 + with: + repository: zed-pkg/zed-interfaces + ref: main + path: zed-interfaces + persist-credentials: false + - uses: dtolnay/rust-toolchain@4be7066ada62dd38de10e7b70166bc74ed198c30 + with: + toolchain: stable + components: rustfmt + - name: Keep release JSON command-scoped + working-directory: zed-cli + run: | + python3 - <<'PY' + from pathlib import Path + + path = Path('.cli-flags.toml') + text = path.read_text(encoding='utf-8') + block = '''[flags.release_json] + env = "ZED_PKG_RELEASE_JSON" + aliases = ["json"] + type = "bool" + default = "false" + help = "Emit a machine-readable release plan." + + '''.replace(' ', '') + assert text.count(block) == 1 + path.write_text(text.replace(block, '', 1), encoding='utf-8') + PY + - name: Verify full Rust and flags contract + working-directory: zed-cli + run: | + cargo fmt --all --check + cargo test --locked + - name: Commit the scoped flag fix + working-directory: zed-cli + run: | + git config user.name "github-actions[bot]" + git config user.email "41898282+github-actions[bot]@users.noreply.github.com" + git add .cli-flags.toml + git commit -m "fix: scope release JSON flag to plan" + git push origin HEAD:feat/den-100-release-plan From 1bebd79f1e085d63b78eaec6dd6efcecf5e122fc Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 27 Jul 2026 19:44:38 +0000 Subject: [PATCH 11/16] fix: scope release JSON flag to plan --- .cli-flags.toml | 7 ------- 1 file changed, 7 deletions(-) diff --git a/.cli-flags.toml b/.cli-flags.toml index dd7dbf9a..f3e9cab5 100644 --- a/.cli-flags.toml +++ b/.cli-flags.toml @@ -119,13 +119,6 @@ aliases = ["out"] type = "string" help = "Packed artifact output path." -[flags.release_json] -env = "ZED_PKG_RELEASE_JSON" -aliases = ["json"] -type = "bool" -default = "false" -help = "Emit a machine-readable release plan." - [flags.allow_dirty] env = "ZED_PKG_ALLOW_DIRTY" aliases = ["allow-dirty"] From d61fbc6247f5a115bc955b3b9dfe9f176402c3ef Mon Sep 17 00:00:00 2001 From: Alexander Mills Date: Mon, 27 Jul 2026 14:45:45 -0500 Subject: [PATCH 12/16] chore: remove temporary release-plan wiring workflow --- .../apply-release-plan-temporary.yml | 55 ------------------- 1 file changed, 55 deletions(-) delete mode 100644 .github/workflows/apply-release-plan-temporary.yml diff --git a/.github/workflows/apply-release-plan-temporary.yml b/.github/workflows/apply-release-plan-temporary.yml deleted file mode 100644 index 4680cfc1..00000000 --- a/.github/workflows/apply-release-plan-temporary.yml +++ /dev/null @@ -1,55 +0,0 @@ -name: Apply release-plan CLI wiring (temporary) - -on: - pull_request: - types: [opened, synchronize, reopened] - -permissions: - contents: write - -jobs: - apply: - if: >- - github.event.pull_request.head.repo.full_name == github.repository && - github.head_ref == 'feat/den-100-release-plan' && - github.actor == 'ORESoftware' - runs-on: ubuntu-latest - timeout-minutes: 20 - steps: - - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 - with: - ref: ${{ github.head_ref }} - path: zed-cli - fetch-depth: 0 - persist-credentials: true - - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 - with: - repository: zed-pkg/zed-interfaces - ref: main - path: zed-interfaces - persist-credentials: false - - uses: dtolnay/rust-toolchain@4be7066ada62dd38de10e7b70166bc74ed198c30 - with: - toolchain: stable - components: rustfmt - - name: Wire Clap, flags2env, and documentation - working-directory: zed-cli - run: python3 scripts/apply_release_plan_cli.py - - name: Format candidate changes - working-directory: zed-cli - run: cargo fmt --all - - name: Commit release-plan wiring to the feature branch - working-directory: zed-cli - run: | - git config user.name "github-actions[bot]" - git config user.email "41898282+github-actions[bot]@users.noreply.github.com" - git add src/cli.rs .cli-flags.toml README.md - if git diff --cached --quiet; then - echo "Release-plan wiring is already current." - exit 0 - fi - git commit -m "feat: expose release plan command" - git push origin HEAD:feat/den-100-release-plan - - name: Test the committed candidate - working-directory: zed-cli - run: cargo test --locked From 1719b808b9096b61958b5ece4cd6f2a5418cf790 Mon Sep 17 00:00:00 2001 From: Alexander Mills Date: Mon, 27 Jul 2026 14:45:53 -0500 Subject: [PATCH 13/16] chore: remove temporary release-plan diagnostics --- ...ect-release-plan-test-output-temporary.yml | 53 ------------------- 1 file changed, 53 deletions(-) delete mode 100644 .github/workflows/collect-release-plan-test-output-temporary.yml diff --git a/.github/workflows/collect-release-plan-test-output-temporary.yml b/.github/workflows/collect-release-plan-test-output-temporary.yml deleted file mode 100644 index d432bec7..00000000 --- a/.github/workflows/collect-release-plan-test-output-temporary.yml +++ /dev/null @@ -1,53 +0,0 @@ -name: Collect release-plan test output (temporary) - -on: - pull_request: - types: [synchronize] - -permissions: - contents: write - -jobs: - collect: - if: >- - github.event.pull_request.head.repo.full_name == github.repository && - github.head_ref == 'feat/den-100-release-plan' && - github.actor == 'ORESoftware' - runs-on: ubuntu-latest - timeout-minutes: 20 - steps: - - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 - with: - ref: ${{ github.head_ref }} - path: zed-cli - fetch-depth: 0 - persist-credentials: true - - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 - with: - repository: zed-pkg/zed-interfaces - ref: main - path: zed-interfaces - persist-credentials: false - - uses: dtolnay/rust-toolchain@4be7066ada62dd38de10e7b70166bc74ed198c30 - with: - toolchain: stable - - name: Capture exact test output - working-directory: zed-cli - run: | - set +e - cargo test --locked > ci-release-plan-test-output.txt 2>&1 - status=$? - set -e - if [ "$status" -eq 0 ]; then - echo "cargo test passed" > ci-release-plan-test-output.txt - else - printf '\nexit_status=%s\n' "$status" >> ci-release-plan-test-output.txt - fi - - name: Commit diagnostic output to the feature branch - working-directory: zed-cli - run: | - git config user.name "github-actions[bot]" - git config user.email "41898282+github-actions[bot]@users.noreply.github.com" - git add ci-release-plan-test-output.txt - git commit -m "ci: capture release-plan test output" - git push origin HEAD:feat/den-100-release-plan From ec3933d6b3316da51050f0ac8c4df73ec5dc89c4 Mon Sep 17 00:00:00 2001 From: Alexander Mills Date: Mon, 27 Jul 2026 14:46:06 -0500 Subject: [PATCH 14/16] chore: remove temporary release-plan flag workflow --- .../fix-release-plan-flags-temporary.yml | 66 ------------------- 1 file changed, 66 deletions(-) delete mode 100644 .github/workflows/fix-release-plan-flags-temporary.yml diff --git a/.github/workflows/fix-release-plan-flags-temporary.yml b/.github/workflows/fix-release-plan-flags-temporary.yml deleted file mode 100644 index da7f1a55..00000000 --- a/.github/workflows/fix-release-plan-flags-temporary.yml +++ /dev/null @@ -1,66 +0,0 @@ -name: Fix release-plan flag scope (temporary) - -on: - pull_request: - types: [synchronize] - -permissions: - contents: write - -jobs: - fix: - if: >- - github.event.pull_request.head.repo.full_name == github.repository && - github.head_ref == 'feat/den-100-release-plan' && - github.actor == 'ORESoftware' - runs-on: ubuntu-latest - timeout-minutes: 20 - steps: - - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 - with: - ref: ${{ github.head_ref }} - path: zed-cli - fetch-depth: 0 - persist-credentials: true - - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 - with: - repository: zed-pkg/zed-interfaces - ref: main - path: zed-interfaces - persist-credentials: false - - uses: dtolnay/rust-toolchain@4be7066ada62dd38de10e7b70166bc74ed198c30 - with: - toolchain: stable - components: rustfmt - - name: Keep release JSON command-scoped - working-directory: zed-cli - run: | - python3 - <<'PY' - from pathlib import Path - - path = Path('.cli-flags.toml') - text = path.read_text(encoding='utf-8') - block = '''[flags.release_json] - env = "ZED_PKG_RELEASE_JSON" - aliases = ["json"] - type = "bool" - default = "false" - help = "Emit a machine-readable release plan." - - '''.replace(' ', '') - assert text.count(block) == 1 - path.write_text(text.replace(block, '', 1), encoding='utf-8') - PY - - name: Verify full Rust and flags contract - working-directory: zed-cli - run: | - cargo fmt --all --check - cargo test --locked - - name: Commit the scoped flag fix - working-directory: zed-cli - run: | - git config user.name "github-actions[bot]" - git config user.email "41898282+github-actions[bot]@users.noreply.github.com" - git add .cli-flags.toml - git commit -m "fix: scope release JSON flag to plan" - git push origin HEAD:feat/den-100-release-plan From d06241f222926f8b5b3bd6966380eb9512a97306 Mon Sep 17 00:00:00 2001 From: Alexander Mills Date: Mon, 27 Jul 2026 14:46:16 -0500 Subject: [PATCH 15/16] chore: remove temporary release-plan helper --- scripts/apply_release_plan_cli.py | 121 ------------------------------ 1 file changed, 121 deletions(-) delete mode 100644 scripts/apply_release_plan_cli.py diff --git a/scripts/apply_release_plan_cli.py b/scripts/apply_release_plan_cli.py deleted file mode 100644 index e840260f..00000000 --- a/scripts/apply_release_plan_cli.py +++ /dev/null @@ -1,121 +0,0 @@ -#!/usr/bin/env python3 -"""Wire the DEN-100 release-plan command into Clap, flags2env, and docs.""" - -from pathlib import Path - - -def replace_once(path: str, old: str, new: str, label: str) -> None: - file = Path(path) - text = file.read_text(encoding="utf-8") - count = text.count(old) - if count != 1: - raise SystemExit(f"{label}: expected one insertion point, found {count}") - file.write_text(text.replace(old, new, 1), encoding="utf-8") - - -replace_once( - "src/cli.rs", - ''' /// Build the pruned, deterministic artifact for this package - Pack { - #[arg(long, env = "ZED_PKG_PACK_OUT")] - out: Option, - }, - /// Pack, verify VCS tag provenance, and upload to the registry - Publish {''', - ''' /// Build the pruned, deterministic artifact for this package - Pack { - #[arg(long, env = "ZED_PKG_PACK_OUT")] - out: Option, - }, - /// Plan a coordinated Zed + native-registry release without credentials or uploads - Release { - #[command(subcommand)] - cmd: ReleaseCmd, - }, - /// Pack, verify VCS tag provenance, and upload to the registry - Publish {''', - "Cmd::Release", -) - -replace_once( - "src/cli.rs", - '''#[derive(Debug, Subcommand)] -pub enum AuthCmd {''', - '''#[derive(Debug, Subcommand)] -pub enum ReleaseCmd { - /// Print the deterministic release set derived from `.zpkg.toml` - Plan { - /// Emit machine-readable JSON rather than the human summary - #[arg(long, env = "ZED_PKG_RELEASE_JSON")] - json: bool, - }, -} - -#[derive(Debug, Subcommand)] -pub enum AuthCmd {''', - "ReleaseCmd enum", -) - -replace_once( - ".cli-flags.toml", - '''[flags.out] -env = "ZED_PKG_PACK_OUT" -aliases = ["out"] -type = "string" -help = "Packed artifact output path." - -[flags.allow_dirty]''', - '''[flags.out] -env = "ZED_PKG_PACK_OUT" -aliases = ["out"] -type = "string" -help = "Packed artifact output path." - -[flags.release_json] -env = "ZED_PKG_RELEASE_JSON" -aliases = ["json"] -type = "bool" -default = "false" -help = "Emit a machine-readable release plan." - -[flags.allow_dirty]''', - "release_json flag", -) - -replace_once( - ".cli-flags.toml", - '''[commands.pack] -help = "Pack an artifact." - -[commands.publish]''', - '''[commands.pack] -help = "Pack an artifact." - -[commands.release] -help = "Coordinate Zed and native-registry releases." - -[commands.release.commands.plan] -help = "Print a credential-free deterministic release plan." - -[commands.release.commands.plan.flags.release_json] -env = "ZED_PKG_RELEASE_JSON" -aliases = ["json"] -type = "bool" -default = "false" -help = "Emit the release plan as JSON." - -[commands.publish]''', - "release flags2env command", -) - -replace_once( - "README.md", - '''| `zed pack` | Build the pruned, deterministic `tar.gz` artifact | -| `zed publish` | Verify clean tree + matching VCS tag at HEAD, pack, upload |''', - '''| `zed pack` | Build the pruned, deterministic `tar.gz` artifact | -| `zed release plan [--json]` | Print the credential-free Zed + native-registry release set derived from `.zpkg.toml` | -| `zed publish` | Verify clean tree + matching VCS tag at HEAD, pack, upload |''', - "README command table", -) - -print("wired release plan command") From 24db0d46ff6e5d00e2a5789715e4b2056720556b Mon Sep 17 00:00:00 2001 From: Alexander Mills Date: Mon, 27 Jul 2026 14:46:24 -0500 Subject: [PATCH 16/16] chore: remove temporary release-plan test output --- ci-release-plan-test-output.txt | 423 -------------------------------- 1 file changed, 423 deletions(-) delete mode 100644 ci-release-plan-test-output.txt diff --git a/ci-release-plan-test-output.txt b/ci-release-plan-test-output.txt deleted file mode 100644 index 479c3682..00000000 --- a/ci-release-plan-test-output.txt +++ /dev/null @@ -1,423 +0,0 @@ - Updating crates.io index - Updating git repository `https://github.com/ORESoftware/flags-2-env.git` - Downloading crates ... - Downloaded anstream v1.0.0 - Downloaded adler2 v2.0.1 - Downloaded heck v0.5.0 - Downloaded anstyle v1.0.14 - Downloaded anstyle-parse v1.0.0 - Downloaded cfg_aliases v0.2.2 - Downloaded atomic-waker v1.1.2 - Downloaded block-buffer v0.10.4 - Downloaded cfg-if v1.0.4 - Downloaded crypto-common v0.1.7 - Downloaded schemars v1.2.1 - Downloaded same-file v1.0.6 - Downloaded dyn-clone v1.0.20 - Downloaded ryu v1.0.23 - Downloaded ref-cast v1.0.26 - Downloaded option-ext v0.2.0 - Downloaded potential_utf v0.1.5 - Downloaded colorchoice v1.0.5 - Downloaded dirs-sys v0.4.1 - Downloaded equivalent v1.0.2 - Downloaded form_urlencoded v1.2.2 - Downloaded hex v0.4.3 - Downloaded futures-task v0.3.33 - Downloaded schemars_derive v1.2.1 - Downloaded tower-service v0.3.3 - Downloaded try-lock v0.2.5 - Downloaded futures-sink v0.3.33 - Downloaded http-body v1.1.0 - Downloaded idna_adapter v1.2.2 - Downloaded ref-cast-impl v1.0.26 - Downloaded litemap v0.8.2 - Downloaded pin-project-lite v0.2.17 - Downloaded dirs v5.0.1 - Downloaded futures-channel v0.3.33 - Downloaded tinyvec_macros v0.1.1 - Downloaded cpufeatures v0.2.17 - Downloaded cpufeatures v0.3.0 - Downloaded subtle v2.6.1 - Downloaded futures-core v0.3.33 - Downloaded rand_pcg v0.10.2 - Downloaded errno v0.3.14 - Downloaded futures-io v0.3.33 - Downloaded anstyle-query v1.1.5 - Downloaded rustc-hash v2.1.3 - Downloaded percent-encoding v2.3.2 - Downloaded generic-array v0.14.7 - Downloaded is_terminal_polyfill v1.70.2 - Downloaded lru-slab v0.1.2 - Downloaded mime v0.3.17 - Downloaded rtoolbox v0.0.5 - Downloaded fs2 v0.4.3 - Downloaded version_check v0.9.5 - Downloaded clap_lex v1.1.0 - Downloaded rand_core v0.10.1 - Downloaded digest v0.10.7 - Downloaded mime_guess v2.0.5 - Downloaded hyper-rustls v0.27.9 - Downloaded quote v1.0.47 - Downloaded displaydoc v0.2.6 - Downloaded globset v0.4.19 - Downloaded ipnet v2.12.0 - Downloaded itoa v1.0.18 - Downloaded serde_spanned v1.1.1 - Downloaded sync_wrapper v1.0.2 - Downloaded zerofrom v0.1.8 - Downloaded strsim v0.11.1 - Downloaded filetime v0.2.29 - Downloaded find-msvc-tools v0.1.9 - Downloaded libloading v0.8.9 - Downloaded once_cell v1.21.4 - Downloaded crc32fast v1.5.0 - Downloaded fastrand v2.5.0 - Downloaded getrandom v0.2.17 - Downloaded rpassword v7.5.4 - Downloaded clap_derive v4.6.4 - Downloaded utf8parse v0.2.2 - Downloaded chacha20 v0.10.1 - Downloaded anyhow v1.0.104 - Downloaded http-body-util v0.1.4 - Downloaded want v0.3.1 - Downloaded httparse v1.10.1 - Downloaded tower-layer v0.3.3 - Downloaded serde_urlencoded v0.7.1 - Downloaded clap v4.6.4 - Downloaded bitflags v2.13.1 - Downloaded getrandom v0.4.3 - Downloaded proc-macro2 v1.0.107 - Downloaded quinn-udp v0.5.15 - Downloaded bytes v1.12.1 - Downloaded icu_normalizer_data v2.2.0 - Downloaded icu_properties v2.2.0 - Downloaded log v0.4.33 - Downloaded miniz_oxide v0.8.9 - Downloaded base64 v0.22.1 - Downloaded icu_normalizer v2.2.0 - Downloaded icu_provider v2.2.0 - Downloaded cc v1.3.0 - Downloaded aho-corasick v1.1.4 - Downloaded icu_collections v2.2.0 - Downloaded xattr v1.6.1 - Downloaded slab v0.4.12 - Downloaded zmij v1.0.23 - Downloaded shlex v2.0.1 - Downloaded flate2 v1.1.9 - Downloaded icu_locale_core v2.2.0 - Downloaded quinn v0.11.11 - Downloaded rustls-webpki v0.103.13 - Downloaded bumpalo v3.20.3 - Downloaded http v1.4.2 - Downloaded indexmap v2.14.0 - Downloaded memchr v2.8.3 - Downloaded mio v1.2.2 - Downloaded rand v0.10.2 - Downloaded hyper-util v0.1.20 - Downloaded clap_builder v4.6.2 - Downloaded idna v1.1.0 - Downloaded icu_properties_data v2.2.0 - Downloaded reqwest v0.12.28 - Downloaded futures-util v0.3.33 - Downloaded hashbrown v0.17.1 - Downloaded hyper v1.11.0 - Downloaded yoke-derive v0.8.2 - Downloaded zerofrom-derive v0.1.7 - Downloaded simd-adler32 v0.3.10 - Downloaded stable_deref_trait v1.2.1 - Downloaded toml_writer v1.1.2+spec-1.1.0 - Downloaded unicase v2.9.0 - Downloaded utf8_iter v1.0.4 - Downloaded writeable v0.6.3 - Downloaded thiserror v2.0.19 - Downloaded thiserror-impl v2.0.19 - Downloaded toml_datetime v1.1.1+spec-1.1.0 - Downloaded zeroize v1.9.0 - Downloaded quinn-proto v0.11.16 - Downloaded bstr v1.13.0 - Downloaded regex-automata v0.4.16 - Downloaded tinystr v0.8.3 - Downloaded synstructure v0.13.2 - Downloaded untrusted v0.9.0 - Downloaded walkdir v2.5.0 - Downloaded tempfile v3.27.0 - Downloaded toml_parser v1.1.2+spec-1.1.0 - Downloaded rustls-pki-types v1.15.1 - Downloaded serde_derive_internals v0.29.1 - Downloaded zerovec-derive v0.11.3 - Downloaded libc v0.2.189 - Downloaded serde_derive v1.0.229 - Downloaded smallvec v1.15.2 - Downloaded yoke v0.8.3 - Downloaded ring v0.17.14 - Downloaded socket2 v0.6.5 - Downloaded tracing-core v0.1.36 - Downloaded semver v1.0.28 - Downloaded sha2 v0.10.9 - Downloaded toml v1.1.3+spec-1.1.0 - Downloaded tinyvec v1.12.0 - Downloaded unicode-ident v1.0.24 - Downloaded tar v0.4.46 - Downloaded tokio-rustls v0.26.4 - Downloaded zopfli v0.8.3 - Downloaded serde_core v1.0.229 - Downloaded url v2.5.8 - Downloaded linux-raw-sys v0.12.1 - Downloaded zerotrie v0.2.4 - Downloaded tower v0.5.3 - Downloaded serde v1.0.229 - Downloaded typenum v1.20.1 - Downloaded typed-path v0.12.3 - Downloaded zerovec v0.11.6 - Downloaded zip v8.6.0 - Downloaded tower-http v0.6.11 - Downloaded serde_json v1.0.151 - Downloaded winnow v1.0.4 - Downloaded webpki-roots v1.0.9 - Downloaded zlib-rs v0.6.6 - Downloaded regex-syntax v0.8.11 - Downloaded syn v2.0.119 - Downloaded syn v3.0.3 - Downloaded rustls v0.23.42 - Downloaded rustix v1.1.4 - Downloaded tracing v0.1.44 - Downloaded tokio v1.53.1 - Compiling proc-macro2 v1.0.107 - Compiling unicode-ident v1.0.24 - Compiling quote v1.0.47 - Compiling libc v0.2.189 - Compiling cfg-if v1.0.4 - Compiling memchr v2.8.3 - Compiling stable_deref_trait v1.2.1 - Compiling serde_core v1.0.229 - Compiling itoa v1.0.18 - Compiling bytes v1.12.1 - Compiling pin-project-lite v0.2.17 - Compiling shlex v2.0.1 - Compiling futures-core v0.3.33 - Compiling syn v2.0.119 - Compiling syn v3.0.3 - Compiling find-msvc-tools v0.1.9 - Compiling cc v1.3.0 - Compiling writeable v0.6.3 - Compiling litemap v0.8.2 - Compiling smallvec v1.15.2 - Compiling socket2 v0.6.5 - Compiling ring v0.17.14 - Compiling synstructure v0.13.2 - Compiling mio v1.2.2 - Compiling icu_normalizer_data v2.2.0 - Compiling once_cell v1.21.4 - Compiling futures-sink v0.3.33 - Compiling icu_properties_data v2.2.0 - Compiling utf8_iter v1.0.4 - Compiling tokio v1.53.1 - Compiling zerofrom-derive v0.1.7 - Compiling yoke-derive v0.8.2 - Compiling zerofrom v0.1.8 - Compiling zerovec-derive v0.11.3 - Compiling yoke v0.8.3 - Compiling displaydoc v0.2.6 - Compiling zerovec v0.11.6 - Compiling zerotrie v0.2.4 - Compiling tinystr v0.8.3 - Compiling potential_utf v0.1.5 - Compiling icu_locale_core v2.2.0 - Compiling icu_collections v2.2.0 - Compiling http v1.4.2 - Compiling icu_provider v2.2.0 - Compiling version_check v0.9.5 - Compiling percent-encoding v2.3.2 - Compiling zmij v1.0.23 - Compiling zeroize v1.9.0 - Compiling generic-array v0.14.7 - Compiling rustls-pki-types v1.15.1 - Compiling http-body v1.1.0 - Compiling getrandom v0.2.17 - Compiling futures-io v0.3.33 - Compiling serde_json v1.0.151 - Compiling slab v0.4.12 - Compiling untrusted v0.9.0 - Compiling httparse v1.10.1 - Compiling bitflags v2.13.1 - Compiling serde v1.0.229 - Compiling futures-task v0.3.33 - Compiling futures-util v0.3.33 - Compiling icu_properties v2.2.0 - Compiling icu_normalizer v2.2.0 - Compiling serde_derive v1.0.229 - Compiling rustix v1.1.4 - Compiling rustls v0.23.42 - Compiling crc32fast v1.5.0 - Compiling try-lock v0.2.5 - Compiling tower-service v0.3.3 - Compiling typenum v1.20.1 - Compiling want v0.3.1 - Compiling idna_adapter v1.2.2 - Compiling form_urlencoded v1.2.2 - Compiling tracing-core v0.1.36 - Compiling futures-channel v0.3.33 - Compiling utf8parse v0.2.2 - Compiling ref-cast v1.0.26 - Compiling subtle v2.6.1 - Compiling simd-adler32 v0.3.10 - Compiling linux-raw-sys v0.12.1 - Compiling atomic-waker v1.1.2 - Compiling log v0.4.33 - Compiling unicase v2.9.0 - Compiling hyper v1.11.0 - Compiling mime_guess v2.0.5 - Compiling anstyle-parse v1.0.0 - Compiling tracing v0.1.44 - Compiling idna v1.1.0 - Compiling ref-cast-impl v1.0.26 - Compiling serde_derive_internals v0.29.1 - Compiling rustls-webpki v0.103.13 - Compiling sync_wrapper v1.0.2 - Compiling base64 v0.22.1 - Compiling tower-layer v0.3.3 - Compiling is_terminal_polyfill v1.70.2 - Compiling thiserror v2.0.19 - Compiling ipnet v2.12.0 - Compiling anstyle-query v1.1.5 - Compiling getrandom v0.4.3 - Compiling colorchoice v1.0.5 - Compiling adler2 v2.0.1 - Compiling winnow v1.0.4 - Compiling anstyle v1.0.14 - Compiling anstream v1.0.0 - Compiling miniz_oxide v0.8.9 - Compiling toml_parser v1.1.2+spec-1.1.0 - Compiling hyper-util v0.1.20 - Compiling tower v0.5.3 - Compiling schemars_derive v1.2.1 - Compiling url v2.5.8 - Compiling block-buffer v0.10.4 - Compiling crypto-common v0.1.7 - Compiling webpki-roots v1.0.9 - Compiling thiserror-impl v2.0.19 - Compiling tokio-rustls v0.26.4 - Compiling toml_datetime v1.1.1+spec-1.1.0 - Compiling serde_spanned v1.1.1 - Compiling aho-corasick v1.1.4 - Compiling regex-syntax v0.8.11 - Compiling ryu v1.0.23 - Compiling dyn-clone v1.0.20 - Compiling toml_writer v1.1.2+spec-1.1.0 - Compiling anyhow v1.0.104 - Compiling hashbrown v0.17.1 - Compiling equivalent v1.0.2 - Compiling bumpalo v3.20.3 - Compiling heck v0.5.0 - Compiling zlib-rs v0.6.6 - Compiling mime v0.3.17 - Compiling clap_lex v1.1.0 - Compiling strsim v0.11.1 - Compiling option-ext v0.2.0 - Compiling dirs-sys v0.4.1 - Compiling clap_builder v4.6.2 - Compiling clap_derive v4.6.4 - Compiling zopfli v0.8.3 - Compiling indexmap v2.14.0 - Compiling toml v1.1.3+spec-1.1.0 - Compiling regex-automata v0.4.16 - Compiling schemars v1.2.1 - Compiling flate2 v1.1.9 - Compiling serde_urlencoded v0.7.1 - Compiling hyper-rustls v0.27.9 - Compiling digest v0.10.7 - Compiling tower-http v0.6.11 - Compiling xattr v1.6.1 - Compiling http-body-util v0.1.4 - Compiling semver v1.0.28 - Compiling filetime v0.2.29 - Compiling rtoolbox v0.0.5 - Compiling bstr v1.13.0 - Compiling libloading v0.8.9 - Compiling cpufeatures v0.2.17 - Compiling typed-path v0.12.3 - Compiling same-file v1.0.6 - Compiling fastrand v2.5.0 - Compiling walkdir v2.5.0 - Compiling tempfile v3.27.0 - Compiling globset v0.4.19 - Compiling flags2env v0.1.0 (https://github.com/ORESoftware/flags-2-env.git?rev=069787b71a9215aa58297216240559eaf3017ca6#069787b7) - Compiling sha2 v0.10.9 - Compiling rpassword v7.5.4 - Compiling zip v8.6.0 - Compiling zed-interfaces v0.1.0 (/home/runner/work/zed-cli/zed-cli/zed-interfaces) - Compiling tar v0.4.46 - Compiling reqwest v0.12.28 - Compiling clap v4.6.4 - Compiling dirs v5.0.1 - Compiling fs2 v0.4.3 - Compiling hex v0.4.3 - Compiling zed-cli v0.1.0 (/home/runner/work/zed-cli/zed-cli/zed-cli) - Finished `test` profile [unoptimized + debuginfo] target(s) in 46.32s - Running unittests src/lib.rs (target/debug/deps/zed_cli-4868c9408e3768d1) - -running 45 tests -test auth::tests::shared_auth_bearer_wins_and_supabase_is_fallback ... ok -test auth::tests::base_urls_require_https_except_for_loopback ... ok -test auth::tests::supabase_confirmation_response_has_no_session ... ok -test cli::tests::flags_2_env_convention_holds ... ok -test cli::tests::cli_flags_toml_is_in_sync_with_clap ... FAILED -test auth::tests::store_roundtrip_is_scoped_by_auth_authority ... ok -test auth::tests::auth_directory_and_session_file_have_private_modes ... ok -test config::tests::credentials_load_rejects_malformed_toml ... ok -test config::tests::credentials_file_is_0600_even_over_a_lax_existing_file ... ok -test config::tests::credentials_load_without_file_is_empty_not_an_error ... ok -test config::tests::relative_home_is_resolved_from_the_invocation_directory ... ok -test config::tests::credentials_roundtrip_normalizes_registry_slashes ... ok -test config::tests::resolve_token_prefers_explicit_over_saved_credentials ... ok -test ops::tests::parse_age_rejects_garbage ... ok -test ops::tests::parse_age_saturates_instead_of_overflowing ... ok -test config::tests::resolve_token_survives_a_corrupt_credentials_file ... ok -test ops::tests::parse_age_units_and_default ... ok -test ops::tests::split_key_accepts_org_name_and_keeps_nested_slashes_in_name ... ok -test ops::tests::split_key_rejects_missing_or_empty_halves ... ok -test cli::tests::readme_documents_every_command ... ok -test r2g::tests::container_args_default_checks_artifact_presence ... ok -test r2g::tests::container_args_honor_a_relocated_install_dir ... ok -test r2g::tests::container_args_mount_workdir_and_target ... ok -test registry::tests::canonical_artifact_url_respects_registry_override ... ok -test registry::tests::presigned_external_artifact_url_is_preserved ... ok -test release::tests::polyglot_plan_is_deterministic_and_includes_native_routes ... ok -test release::tests::single_language_plan_keeps_the_root_package ... ok -test store::tests::gc_drops_refs_for_projects_that_no_longer_exist ... ok -test cli::tests::flat_and_nested_auth_spellings_dispatch_identically ... ok -test store::tests::gc_prunes_by_stamp_age_but_spares_referenced_and_fresh_entries ... ok -test store::tests::human_size_formats_binary_units ... ok -test update::tests::asset_target_is_platform_shaped ... ok -test store::tests::gc_survives_hostile_max_age ... ok -test update::tests::extract_binary_finds_zed_exe_inside_a_zip ... ok -test update::tests::extract_binary_finds_zed_inside_a_tar_gz ... ok -test update::tests::extract_binary_rejects_an_archive_without_the_binary ... ok -test update::tests::semver_comparison_strips_v ... ok -test update::tests::sha256sums_handles_binary_mode_and_uppercase ... ok -test update::tests::sha256sums_matches_asset_line ... ok -test update::tests::replace_exe_swaps_contents_atomically_and_keeps_exec_bit ... ok -test update::tests::sha256sums_mismatch_is_detectable ... ok -test update::tests::tag_parsing_from_redirect_url ... ok -test update::tests::sha256sums_rejects_missing_or_malformed ... ok -test pack::tests::polyglot_pack_re_roots_and_isolates_every_target ... ok -test pack::tests::polyglot_pack_can_include_a_whole_repository_target ... ok - -failures: - ----- cli::tests::cli_flags_toml_is_in_sync_with_clap stdout ---- - -thread 'cli::tests::cli_flags_toml_is_in_sync_with_clap' (5011) panicked at src/cli.rs:564:21: -duplicate env `ZED_PKG_RELEASE_JSON` in .cli-flags.toml -note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace - - -failures: - cli::tests::cli_flags_toml_is_in_sync_with_clap - -test result: FAILED. 44 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.04s - -error: test failed, to rerun pass `--lib` - -exit_status=101