Skip to content

Commit e381993

Browse files
authored
Merge pull request #5 from OneNoted/release-0-3-1
Release 0.3.1
2 parents 68ffb38 + a42a936 commit e381993

59 files changed

Lines changed: 17442 additions & 1891 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/release-assets.yml

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ jobs:
5454
- name: Run headless app smoke
5555
run: |
5656
TASKERS_TERMINAL_BACKEND=mock \
57+
TIMEOUT_SECONDS=90 \
5758
bash scripts/headless-smoke.sh \
5859
./target/debug/taskers-gtk \
5960
--smoke-script baseline \
@@ -63,14 +64,19 @@ jobs:
6364
- name: Build Linux bundle
6465
run: bash scripts/build_linux_bundle.sh
6566

67+
- name: Build Ghostty runtime bundle
68+
run: bash scripts/build_ghostty_runtime_bundle.sh
69+
6670
- name: Run launcher smoke
67-
run: bash scripts/smoke_linux_release_launcher.sh
71+
run: TIMEOUT_SECONDS=90 bash scripts/smoke_linux_release_launcher.sh
6872

69-
- name: Upload Linux bundle
73+
- name: Upload release assets
7074
uses: actions/upload-artifact@v4
7175
with:
72-
name: linux-bundle
73-
path: dist/taskers-linux-bundle-v*.tar.xz
76+
name: release-assets
77+
path: |
78+
dist/taskers-linux-bundle-v*.tar.xz
79+
dist/taskers-ghostty-runtime-v*.tar.xz
7480
7581
release-manifest:
7682
needs:
@@ -124,6 +130,7 @@ jobs:
124130
echo 'files<<EOF'
125131
echo 'dist/release/taskers-manifest-v*.json'
126132
echo 'dist/release/taskers-linux-bundle-v*.tar.xz'
133+
echo 'dist/release/taskers-ghostty-runtime-v*.tar.xz'
127134
echo 'EOF'
128135
} >> "$GITHUB_OUTPUT"
129136

Cargo.lock

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

Cargo.toml

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ edition = "2024"
2020
homepage = "https://github.com/OneNoted/taskers"
2121
license = "MIT OR Apache-2.0"
2222
repository = "https://github.com/OneNoted/taskers"
23-
version = "0.3.0"
23+
version = "0.3.1"
2424

2525
[workspace.dependencies]
2626
adw = { package = "libadwaita", version = "0.9.1" }
@@ -47,12 +47,12 @@ ureq = "2.12"
4747
uuid = { version = "1.22.0", features = ["serde", "v7"] }
4848
webkit6 = { version = "0.6.1", features = ["v2_50"] }
4949
xz2 = "0.1"
50-
taskers-core = { version = "0.3.0", path = "crates/taskers-core" }
51-
taskers-control = { version = "0.3.0", path = "crates/taskers-control" }
52-
taskers-domain = { version = "0.3.0", path = "crates/taskers-domain" }
53-
taskers-ghostty = { version = "0.3.0", path = "crates/taskers-ghostty" }
54-
taskers-host = { version = "0.3.0", path = "crates/taskers-host" }
55-
taskers-paths = { version = "0.3.0", path = "crates/taskers-paths" }
56-
taskers-runtime = { version = "0.3.0", path = "crates/taskers-runtime" }
57-
taskers-shell = { version = "0.3.0", path = "crates/taskers-shell" }
58-
taskers-shell-core = { version = "0.3.0", path = "crates/taskers-shell-core" }
50+
taskers-core = { version = "0.3.1", path = "crates/taskers-core" }
51+
taskers-control = { version = "0.3.1", path = "crates/taskers-control" }
52+
taskers-domain = { version = "0.3.1", path = "crates/taskers-domain" }
53+
taskers-ghostty = { version = "0.3.1", path = "crates/taskers-ghostty" }
54+
taskers-host = { version = "0.3.1", path = "crates/taskers-host" }
55+
taskers-paths = { version = "0.3.1", path = "crates/taskers-paths" }
56+
taskers-runtime = { version = "0.3.1", path = "crates/taskers-runtime" }
57+
taskers-shell = { version = "0.3.1", path = "crates/taskers-shell" }
58+
taskers-shell-core = { version = "0.3.1", path = "crates/taskers-shell-core" }

README.md

Lines changed: 67 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,24 @@
1-
# taskers
1+
# Taskers
22

3-
Taskers is a Linux-first terminal workspace for agent-heavy work. It provides
4-
Niri-style top-level windows, local pane splits, tabs inside panes, and an
5-
attention rail for active and completed work.
3+
Taskers is a Linux-first terminal workspace for agent-heavy work. It combines:
4+
5+
- top-level workspace windows that behave like a tiling canvas
6+
- panes inside each window
7+
- tabs inside each pane
8+
- an attention rail for unread, waiting, error, and completed work
9+
- a local control CLI for notifications, agent state, browser automation, and debugging
610

711
The active product lives at the repo root. Archived pre-cutover GTK/AppKit code
812
is kept under `taskers-old/` for reference only.
913

10-
## Try it
14+
## Documentation
15+
16+
- [Daily usage](docs/usage.md)
17+
- [Notifications and attention](docs/notifications.md)
18+
- [Taskersctl operator guide](docs/taskersctl.md)
19+
- [Release checklist](docs/release.md)
20+
21+
## Install
1122

1223
Linux (`x86_64-unknown-linux-gnu`):
1324

@@ -16,12 +27,54 @@ cargo install taskers --locked
1627
taskers
1728
```
1829

19-
The first launch downloads the exact version-matched Linux bundle from the tagged
20-
GitHub release. The Linux app requires GTK4/libadwaita plus the host WebKitGTK
21-
6.0 runtime.
30+
The first launch downloads the exact version-matched Linux bundle from the
31+
tagged GitHub release. The Linux app requires GTK4/libadwaita plus the host
32+
WebKitGTK 6.0 runtime.
2233

2334
Mainline macOS support is currently not shipped from this repo root.
2435

36+
## First 5 Minutes
37+
38+
Start Taskers:
39+
40+
```bash
41+
taskers
42+
```
43+
44+
Keep the workspace model straight:
45+
46+
- A workspace contains top-level workspace windows.
47+
- A workspace window contains panes.
48+
- A pane contains tabs.
49+
- Scrolling/panning is a workspace-window concern. Splits and tabs stay local to the current window.
50+
51+
Open a terminal in Taskers and emit a test notification:
52+
53+
```bash
54+
taskersctl notify --title "Taskers" --body "Hello from the current pane"
55+
```
56+
57+
You should see:
58+
59+
- an unread badge in the sidebar
60+
- a notification row in the attention rail
61+
- a desktop banner unless the target is already visible and notification suppression is enabled
62+
63+
Try the built-in shell helpers from a Taskers terminal:
64+
65+
```bash
66+
taskers_waiting "Need review"
67+
taskers_done "Finished"
68+
taskers_error "Build failed"
69+
```
70+
71+
Open a browser pane from the pane controls, then inspect it from the same Taskers terminal:
72+
73+
```bash
74+
taskersctl browser snapshot
75+
taskersctl browser get title
76+
```
77+
2578
## Develop
2679

2780
On Ubuntu 24.04, install the Linux UI dependencies first:
@@ -30,13 +83,14 @@ On Ubuntu 24.04, install the Linux UI dependencies first:
3083
sudo apt-get install -y libgtk-4-dev libadwaita-1-dev libjavascriptcoregtk-6.0-dev libwebkitgtk-6.0-dev xvfb
3184
```
3285

33-
Run the app directly:
86+
Install the app into Cargo's bin directory, then run it from there:
3487

3588
```bash
36-
cargo run -p taskers-gtk --bin taskers-gtk
89+
cargo install --path crates/taskers-app --force
90+
taskers-gtk
3791
```
3892

39-
Point the desktop launcher at the repo-local dev build:
93+
Point the desktop launcher at that Cargo-bin install:
4094

4195
```bash
4296
bash scripts/install-dev-desktop-entry.sh
@@ -47,10 +101,10 @@ Run the headless baseline smoke:
47101
```bash
48102
TASKERS_TERMINAL_BACKEND=mock \
49103
bash scripts/headless-smoke.sh \
50-
./target/debug/taskers-gtk \
104+
"$(command -v taskers-gtk)" \
51105
--smoke-script baseline \
52106
--diagnostic-log stderr \
53107
--quit-after-ms 5000
54108
```
55109

56-
Release checklist: [docs/release.md](docs/release.md)
110+
For publishing and release prep, use [docs/release.md](docs/release.md).

assets/taskers.desktop.in

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,5 @@ Icon=taskers
88
Terminal=false
99
Categories=Development;
1010
StartupNotify=true
11-
StartupWMClass=taskers
11+
StartupWMClass=dev.taskers.app
1212
X-GNOME-UsesNotifications=true

crates/taskers-app/Cargo.toml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,10 @@ publish = false
1313
name = "taskers-gtk"
1414
path = "src/main.rs"
1515

16+
[[bin]]
17+
name = "taskersctl"
18+
path = "src/bin/taskersctl.rs"
19+
1620
[dependencies]
1721
adw.workspace = true
1822
anyhow.workspace = true
@@ -21,6 +25,8 @@ clap.workspace = true
2125
dioxus.workspace = true
2226
dioxus-liveview.workspace = true
2327
gtk.workspace = true
28+
serde.workspace = true
29+
serde_json.workspace = true
2430
taskers-control.workspace = true
2531
taskers-core.workspace = true
2632
taskers-domain.workspace = true
@@ -30,5 +36,6 @@ taskers-paths.workspace = true
3036
taskers-runtime.workspace = true
3137
taskers-shell.workspace = true
3238
taskers-shell-core.workspace = true
39+
time.workspace = true
3340
tokio.workspace = true
3441
webkit6.workspace = true
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
#!/bin/sh
2+
set -eu
3+
4+
payload=${1-}
5+
message=
6+
taskers_ctl=${TASKERS_CTL_PATH:-}
7+
8+
if [ -z "$taskers_ctl" ] && command -v taskersctl >/dev/null 2>&1; then
9+
taskers_ctl=$(command -v taskersctl)
10+
fi
11+
12+
if [ -n "$payload" ]; then
13+
if command -v jq >/dev/null 2>&1; then
14+
message=$(
15+
printf '%s' "$payload" \
16+
| jq -r '."last-assistant-message" // .message // .title // empty' 2>/dev/null \
17+
| head -c 160
18+
)
19+
fi
20+
fi
21+
22+
if [ -z "$message" ]; then
23+
message="Turn complete"
24+
fi
25+
26+
has_embedded_surface_context() {
27+
[ -x "${taskers_ctl:-}" ] || return 1
28+
[ -n "${TASKERS_WORKSPACE_ID:-}" ] || return 1
29+
[ -n "${TASKERS_PANE_ID:-}" ] || return 1
30+
[ -n "${TASKERS_SURFACE_ID:-}" ] || return 1
31+
[ -n "${TASKERS_TTY_NAME:-}" ] || return 1
32+
33+
current_tty=$(tty 2>/dev/null || true)
34+
case "$current_tty" in
35+
/dev/*) ;;
36+
*) return 1 ;;
37+
esac
38+
39+
[ "$current_tty" = "$TASKERS_TTY_NAME" ] || return 1
40+
}
41+
42+
if has_embedded_surface_context; then
43+
"$taskers_ctl" agent-hook stop \
44+
--workspace "$TASKERS_WORKSPACE_ID" \
45+
--pane "$TASKERS_PANE_ID" \
46+
--surface "$TASKERS_SURFACE_ID" \
47+
--agent codex \
48+
--title Codex \
49+
--message "$message" >/dev/null 2>&1 || true
50+
fi

0 commit comments

Comments
 (0)