Skip to content

Commit 096b519

Browse files
committed
Release v0.1.5
- Add embedded VM shell with xterm.js terminal - Add VM Images management page - Add Alpine packages management page - Add first-run detection with setup banner - Change to free-form RAM/vCPU input - Read config from CLI (shows actual values with defaults) - Fix config parsing for unquoted strings - Fix init banner persistence
1 parent e931a91 commit 096b519

21 files changed

Lines changed: 1670 additions & 89 deletions

CHANGELOG.md

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,24 @@
22

33
All notable changes to this project will be documented in this file.
44

5+
## [0.1.5] - 2025-01-27
6+
7+
### Added
8+
- Embedded VM shell with xterm.js terminal emulator
9+
- VM Images management page (install/uninstall alpine, freebsd images)
10+
- Alpine packages management page (add/remove custom apk packages)
11+
- First-run detection with setup info banner
12+
- Free-form RAM/vCPU input (no longer constrained to dropdown options)
13+
14+
### Changed
15+
- Settings now reads config from CLI (shows actual values including defaults)
16+
- Shell auto-starts when navigating to Shell page (if no filesystem mounted)
17+
- Improved CLI not found message
18+
19+
### Fixed
20+
- Config parsing for unquoted string values from CLI output
21+
- Init banner now disappears after VM initialization completes
22+
523
## [0.1.1] - 2025-01-27
624

725
### Security

package-lock.json

Lines changed: 20 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "anylinuxfs-gui",
3-
"version": "0.1.1",
3+
"version": "0.1.5",
44
"private": true,
55
"type": "module",
66
"scripts": {
@@ -13,7 +13,9 @@
1313
"tauri:build": "tauri build"
1414
},
1515
"dependencies": {
16-
"@tauri-apps/api": "^2"
16+
"@tauri-apps/api": "^2",
17+
"@xterm/addon-fit": "^0.11.0",
18+
"@xterm/xterm": "^6.0.0"
1719
},
1820
"devDependencies": {
1921
"@sveltejs/adapter-static": "^3",

src-tauri/Cargo.lock

Lines changed: 149 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src-tauri/Cargo.toml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "anylinuxfs-gui"
3-
version = "0.1.1"
3+
version = "0.1.5"
44
edition = "2021"
55

66
[lib]
@@ -15,7 +15,8 @@ tauri = { version = "2", features = [] }
1515
tauri-plugin-shell = "2"
1616
serde = { version = "1", features = ["derive"] }
1717
serde_json = "1"
18-
tokio = { version = "1", features = ["rt", "rt-multi-thread"] }
18+
tokio = { version = "1", features = ["rt", "rt-multi-thread", "sync"] }
1919
notify = "6"
2020
toml = "0.8"
2121
dirs = "5"
22+
portable-pty = "0.8"

src-tauri/src/commands/apk.rs

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
use crate::cli::execute_command;
2+
3+
#[tauri::command]
4+
pub fn list_packages() -> Result<Vec<String>, String> {
5+
let output = execute_command(&["apk", "info"], false, None)?;
6+
7+
let packages: Vec<String> = output
8+
.lines()
9+
.map(|line| line.trim().to_string())
10+
.filter(|line| !line.is_empty())
11+
.collect();
12+
13+
Ok(packages)
14+
}
15+
16+
#[tauri::command]
17+
pub async fn add_packages(packages: Vec<String>) -> Result<(), String> {
18+
if packages.is_empty() {
19+
return Err("No packages specified".to_string());
20+
}
21+
22+
tokio::task::spawn_blocking(move || {
23+
let mut args = vec!["apk", "add"];
24+
let pkg_refs: Vec<&str> = packages.iter().map(|s| s.as_str()).collect();
25+
args.extend(pkg_refs);
26+
execute_command(&args, false, None)?;
27+
Ok(())
28+
})
29+
.await
30+
.map_err(|e| format!("Task error: {}", e))?
31+
}
32+
33+
#[tauri::command]
34+
pub async fn remove_packages(packages: Vec<String>) -> Result<(), String> {
35+
if packages.is_empty() {
36+
return Err("No packages specified".to_string());
37+
}
38+
39+
tokio::task::spawn_blocking(move || {
40+
let mut args = vec!["apk", "del"];
41+
let pkg_refs: Vec<&str> = packages.iter().map(|s| s.as_str()).collect();
42+
args.extend(pkg_refs);
43+
execute_command(&args, false, None)?;
44+
Ok(())
45+
})
46+
.await
47+
.map_err(|e| format!("Task error: {}", e))?
48+
}

0 commit comments

Comments
 (0)