Skip to content

chore: prepare 0.3.0-beta.1 release#158

Merged
F16shen merged 4 commits into
rustfrom
release/v0.3.0-beta.1-prep
May 11, 2026
Merged

chore: prepare 0.3.0-beta.1 release#158
F16shen merged 4 commits into
rustfrom
release/v0.3.0-beta.1-prep

Conversation

@F16shen
Copy link
Copy Markdown
Collaborator

@F16shen F16shen commented May 11, 2026

Background

Prepare the first Rust beta release on the rust line so we can validate the 0.3 runtime and packaging path before the final 0.3.0 release moves to main.

Changes

  • set the Rust workspace version to 0.3.0-beta.1 and refresh release metadata
  • add the 0.3.0-beta.1 changelog entry for the Rust beta line
  • align release/update/install/uninstall paths and docs with the Rust beta packaging flow
  • keep the release bundle and installer expectations consistent with linux-amd64 assets

Validation

  • make packaging-test
  • cargo test -p aish-cli compare_versions_prerelease
  • cargo test -p aish-cli is_safe_purge_path
  • cargo build --release --target x86_64-unknown-linux-musl
  • local bundle build and install smoke for aish-0.3.0-beta.1-linux-amd64

Risk

  • this PR is intended for the rust branch only
  • run the manual Release Preparation workflow against release/v0.3.0-beta.1-prep before merge
  • the final stable 0.3.0 release should be prepared separately on main

Summary by CodeRabbit

  • New Features

    • Systemd unit files now bundled with installation.
  • Documentation

    • Updated installation and uninstallation instructions across all language variants (README files).
    • Clarified that only aish binary is installed with bundled sandbox systemd units.
    • Updated uninstall commands from aish-uninstall to aish uninstall --yes (or with --purge for full removal).
  • Chores

    • Version bumped to 0.3.0-beta.1.
    • Enhanced workflow validation checks for systemd artifacts.
    • Simplified uninstall process.

Review Change Stack

@github-actions
Copy link
Copy Markdown
Contributor

Thanks for the pull request. A maintainer will review it when available.

Please keep the PR focused, explain the why in the description, and make sure local checks pass before requesting review.

Contribution guide: https://github.com/AI-Shell-Team/aish/blob/main/CONTRIBUTING.md

@github-actions
Copy link
Copy Markdown
Contributor

This pull request description looks incomplete. Please update the missing sections below before review.

Missing items:

  • Summary
  • User-visible Changes
  • Compatibility
  • Testing
  • Change Type
  • Scope

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented May 11, 2026

Warning

Rate limit exceeded

@F16shen has exceeded the limit for the number of commits that can be reviewed per hour. Please wait 18 minutes and 54 seconds before requesting another review.

You’ve run out of usage credits. Purchase more in the billing tab.

⌛ How to resolve this issue?

After the wait time has elapsed, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout.

Please see our FAQ for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 1c9474fe-dd7a-4b31-b272-2bd65f6d563a

📥 Commits

Reviewing files that changed from the base of the PR and between 06c7d71 and 01ef450.

📒 Files selected for processing (2)
  • build.sh
  • packaging/scripts/setup-ci-env.sh
📝 Walkthrough

Walkthrough

The PR consolidates the installation and uninstallation workflow by removing the separate aish-uninstall binary from distribution. The workspace version is bumped to 0.3.0-beta.1. Systemd unit file validation is added to release workflows. All supporting documentation, tests, and version-reference strings are updated accordingly.

Changes

Unified Uninstallation Interface

Layer / File(s) Summary
Version Declaration
Cargo.toml
Workspace version is updated from 1.0.0 to 0.3.0-beta.1.
Archive Uninstall Simplification
crates/aish-cli/src/uninstall.rs
Remove ARCHIVE_BINARY_NAMES constant and simplify uninstall_archive to directly remove only /usr/local/bin/aish instead of searching for a bundled aish-uninstall script.
Bundle Installer/Uninstaller
packaging/scripts/install-bundle.sh, packaging/scripts/uninstall-bundle.sh
Remove installation and removal of the aish-uninstall executable; installer now places only the main aish binary from the packaged rootfs.
Release Workflows & Smoke Tests
.github/workflows/release-preparation.yml, .github/workflows/release.yml, packaging/tests/release_scripts_smoke.sh
Add validation that installed bundles contain systemd unit files (aish-sandbox.service and aish-sandbox.socket). Update version examples and test assertions for 0.3.0-beta.1.
Multilingual Documentation
README.md, README_CN.md, README_DE.md, README_ES.md, README_FR.md, README_JA.md
Update installer and uninstallation documentation to reflect that only aish binary plus bundled systemd units are installed; document unified aish uninstall --yes and aish uninstall --yes --purge commands instead of separate aish-uninstall tool.
Changelog, Build Config, and Test Data
CHANGELOG.md, Makefile, packaging/scripts/update_release_files.py, crates/aish-cli/src/update.rs
Update version strings to 0.3.0-beta.1 in error messages, help text, and test inputs. Mark [Unreleased] as empty and remove stale changelog entries. Update version comparison tests with new example versions.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~12 minutes

Possibly related PRs

  • AI-Shell-Team/aish#127: Both PRs modify release workflows to add or strengthen smoke test assertions in CI/CD pipelines.
  • AI-Shell-Team/aish#137: Both PRs modify release workflows and packaging/installer scripts to consolidate release tooling and binary distribution behavior.
  • AI-Shell-Team/aish#125: Both PRs modify release/packaging pipelines and versioning (Cargo-based versions, release scripts, installer behavior, and CI workflows).

Suggested labels

packaging, docs, ci-cd, tests, size: S, experienced-contributor

Poem

🐰 A rabbit hops with joy today,
One binary to rule the way,
Uninstall now speaks in unified tongue,
Systemd units verified and sung,
Version bumps to point the way,
Docs in six languages say: "stay!"

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 50.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately and concisely describes the main purpose of the PR: preparing a beta release for version 0.3.0-beta.1.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch release/v0.3.0-beta.1-prep

Tip

💬 Introducing Slack Agent: The best way for teams to turn conversations into code.

Slack Agent is built on CodeRabbit's deep understanding of your code, so your team can collaborate across the entire SDLC without losing context.

  • Generate code and open pull requests
  • Plan features and break down work
  • Investigate incidents and troubleshoot customer tickets together
  • Automate recurring tasks and respond to alerts with triggers
  • Summarize progress and report instantly

Built for teams:

  • Shared memory across your entire org—no repeating context
  • Per-thread sandboxes to safely plan and execute work
  • Governance built-in—scoped access, auditability, and budget controls

One agent for your entire SDLC. Right inside Slack.

👉 Get started


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🧹 Nitpick comments (1)
README_ES.md (1)

129-129: 💤 Low value

Consider refining the Spanish phrasing.

The phrase "resuelve el último directorio de release" is understandable but could be more natural. Consider:

  • "determina el último directorio de versión" (determines the latest version directory)
  • "encuentra la última versión disponible" (finds the latest available version)

Also, "release" is an English word—consider translating it to "versión" or "lanzamiento", or formatting it as code/technical term.

Suggested refinement
-El instalador resuelve el último directorio de release en `https://www.aishell.ai/repo`, descarga el bundle correspondiente a tu arquitectura e instala `aish` en `/usr/local/bin`, junto con las unidades systemd del sandbox incluidas en el bundle.
+El instalador determina la última versión disponible en `https://www.aishell.ai/repo`, descarga el bundle correspondiente a tu arquitectura e instala `aish` en `/usr/local/bin`, junto con las unidades systemd del sandbox incluidas en el bundle.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@README_ES.md` at line 129, Replace the phrase "resuelve el último directorio
de release" with a more natural Spanish phrasing such as "determina el último
directorio de versión" or "encuentra la última versión disponible", and replace
the English word "release" with "versión" (or "lanzamiento") or format it as a
technical term if you prefer; update the sentence that starts "El instalador
resuelve el último directorio de release en `https://www.aishell.ai/repo`..." to
use the chosen Spanish wording while keeping the rest of the line intact (the
URL, action of downloading the bundle, installing `aish` to `/usr/local/bin`,
and the mention of systemd units).
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@crates/aish-cli/src/uninstall.rs`:
- Around line 160-172: Add removal of the legacy "aish-uninstall" binary
alongside the existing "aish" removal: after creating archive_bin from
ARCHIVE_BIN_DIR and handling removal for "aish" (the block using archive_bin and
run_sudo), create another PathBuf for "aish-uninstall" (e.g., archive_uninstall
= PathBuf::from(ARCHIVE_BIN_DIR).join("aish-uninstall")), check its existence,
call run_sudo(&["rm", "-f", archive_uninstall.to_str().unwrap_or("")]) and
mirror the same error handling logic (building path_str, populating the args map
with "path" and "error", calling t_with_args("cli.uninstall.file_remove_failed",
&args), and setting success = false on error) so legacy uninstallers are cleaned
up consistently.

In `@packaging/scripts/uninstall-bundle.sh`:
- Line 89: Update the uninstall step that removes the aish binary to also remove
the legacy aish-uninstall binary; modify the invocation that calls target_path
with BIN_DIR and "aish" (the rm -f "$(target_path "${BIN_DIR}/aish")" call) so
it also runs rm -f against "$(target_path "${BIN_DIR}/aish-uninstall")" to
ensure stale /usr/local/bin/aish-uninstall is cleaned up during bundle
uninstall.

---

Nitpick comments:
In `@README_ES.md`:
- Line 129: Replace the phrase "resuelve el último directorio de release" with a
more natural Spanish phrasing such as "determina el último directorio de
versión" or "encuentra la última versión disponible", and replace the English
word "release" with "versión" (or "lanzamiento") or format it as a technical
term if you prefer; update the sentence that starts "El instalador resuelve el
último directorio de release en `https://www.aishell.ai/repo`..." to use the
chosen Spanish wording while keeping the rest of the line intact (the URL,
action of downloading the bundle, installing `aish` to `/usr/local/bin`, and the
mention of systemd units).
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: afe59712-fe94-45da-a904-50b0d57d2a1d

📥 Commits

Reviewing files that changed from the base of the PR and between 2f6d426 and 06c7d71.

⛔ Files ignored due to path filters (1)
  • Cargo.lock is excluded by !**/*.lock
📒 Files selected for processing (17)
  • .github/workflows/release-preparation.yml
  • .github/workflows/release.yml
  • CHANGELOG.md
  • Cargo.toml
  • Makefile
  • README.md
  • README_CN.md
  • README_DE.md
  • README_ES.md
  • README_FR.md
  • README_JA.md
  • crates/aish-cli/src/uninstall.rs
  • crates/aish-cli/src/update.rs
  • packaging/scripts/install-bundle.sh
  • packaging/scripts/uninstall-bundle.sh
  • packaging/scripts/update_release_files.py
  • packaging/tests/release_scripts_smoke.sh
💤 Files with no reviewable changes (1)
  • packaging/scripts/install-bundle.sh

Comment on lines +160 to +172
let archive_bin = PathBuf::from(ARCHIVE_BIN_DIR).join("aish");
if archive_bin.exists() {
if let Err(e) = run_sudo(&["rm", "-f", archive_bin.to_str().unwrap_or("")]) {
let path_str = archive_bin.display().to_string();
eprintln!("\x1b[31m{}\x1b[0m", {
let mut args = std::collections::HashMap::new();
args.insert("path".to_string(), path_str);
args.insert("error".to_string(), e.to_string());
t_with_args("cli.uninstall.file_remove_failed", &args)
});
success = false;
}
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Clean up legacy aish-uninstall binary during archive uninstall.

Line 160 now removes only aish; older installs can still leave /usr/local/bin/aish-uninstall behind, which creates stale-command confusion after uninstall.

Suggested patch
     let archive_bin = PathBuf::from(ARCHIVE_BIN_DIR).join("aish");
-    if archive_bin.exists() {
-        if let Err(e) = run_sudo(&["rm", "-f", archive_bin.to_str().unwrap_or("")]) {
-            let path_str = archive_bin.display().to_string();
-            eprintln!("\x1b[31m{}\x1b[0m", {
-                let mut args = std::collections::HashMap::new();
-                args.insert("path".to_string(), path_str);
-                args.insert("error".to_string(), e.to_string());
-                t_with_args("cli.uninstall.file_remove_failed", &args)
-            });
-            success = false;
-        }
-    }
+    let legacy_uninstall_bin = PathBuf::from(ARCHIVE_BIN_DIR).join("aish-uninstall");
+    for bin in [&archive_bin, &legacy_uninstall_bin] {
+        if bin.exists() {
+            if let Err(e) = run_sudo(&["rm", "-f", bin.to_str().unwrap_or("")]) {
+                let path_str = bin.display().to_string();
+                eprintln!("\x1b[31m{}\x1b[0m", {
+                    let mut args = std::collections::HashMap::new();
+                    args.insert("path".to_string(), path_str);
+                    args.insert("error".to_string(), e.to_string());
+                    t_with_args("cli.uninstall.file_remove_failed", &args)
+                });
+                success = false;
+            }
+        }
+    }
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
let archive_bin = PathBuf::from(ARCHIVE_BIN_DIR).join("aish");
if archive_bin.exists() {
if let Err(e) = run_sudo(&["rm", "-f", archive_bin.to_str().unwrap_or("")]) {
let path_str = archive_bin.display().to_string();
eprintln!("\x1b[31m{}\x1b[0m", {
let mut args = std::collections::HashMap::new();
args.insert("path".to_string(), path_str);
args.insert("error".to_string(), e.to_string());
t_with_args("cli.uninstall.file_remove_failed", &args)
});
success = false;
}
}
let archive_bin = PathBuf::from(ARCHIVE_BIN_DIR).join("aish");
let legacy_uninstall_bin = PathBuf::from(ARCHIVE_BIN_DIR).join("aish-uninstall");
for bin in [&archive_bin, &legacy_uninstall_bin] {
if bin.exists() {
if let Err(e) = run_sudo(&["rm", "-f", bin.to_str().unwrap_or("")]) {
let path_str = bin.display().to_string();
eprintln!("\x1b[31m{}\x1b[0m", {
let mut args = std::collections::HashMap::new();
args.insert("path".to_string(), path_str);
args.insert("error".to_string(), e.to_string());
t_with_args("cli.uninstall.file_remove_failed", &args)
});
success = false;
}
}
}
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@crates/aish-cli/src/uninstall.rs` around lines 160 - 172, Add removal of the
legacy "aish-uninstall" binary alongside the existing "aish" removal: after
creating archive_bin from ARCHIVE_BIN_DIR and handling removal for "aish" (the
block using archive_bin and run_sudo), create another PathBuf for
"aish-uninstall" (e.g., archive_uninstall =
PathBuf::from(ARCHIVE_BIN_DIR).join("aish-uninstall")), check its existence,
call run_sudo(&["rm", "-f", archive_uninstall.to_str().unwrap_or("")]) and
mirror the same error handling logic (building path_str, populating the args map
with "path" and "error", calling t_with_args("cli.uninstall.file_remove_failed",
&args), and setting success = false on error) so legacy uninstallers are cleaned
up consistently.

remove_systemd_units

rm -f "$(target_path "${BIN_DIR}/aish")" "$(target_path "${BIN_DIR}/aish-uninstall")"
rm -f "$(target_path "${BIN_DIR}/aish")"
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Also remove legacy aish-uninstall binary during uninstall.

On systems upgraded from older bundle layouts, this leaves a stale executable in /usr/local/bin. Clean it up for backward-safe uninstall behavior.

Suggested patch
-rm -f "$(target_path "${BIN_DIR}/aish")"
+rm -f \
+  "$(target_path "${BIN_DIR}/aish")" \
+  "$(target_path "${BIN_DIR}/aish-uninstall")"
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
rm -f "$(target_path "${BIN_DIR}/aish")"
rm -f \
"$(target_path "${BIN_DIR}/aish")" \
"$(target_path "${BIN_DIR}/aish-uninstall")"
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packaging/scripts/uninstall-bundle.sh` at line 89, Update the uninstall step
that removes the aish binary to also remove the legacy aish-uninstall binary;
modify the invocation that calls target_path with BIN_DIR and "aish" (the rm -f
"$(target_path "${BIN_DIR}/aish")" call) so it also runs rm -f against
"$(target_path "${BIN_DIR}/aish-uninstall")" to ensure stale
/usr/local/bin/aish-uninstall is cleaned up during bundle uninstall.

@F16shen
Copy link
Copy Markdown
Collaborator Author

F16shen commented May 11, 2026

#157

@F16shen F16shen merged commit ec03e6e into rust May 11, 2026
11 checks passed
@F16shen F16shen deleted the release/v0.3.0-beta.1-prep branch May 11, 2026 05:40
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant