Skip to content

Commit e8f18e1

Browse files
Release ShadowCode 0.22.0 with hardened native workflows
Refine model controls, response forks, parallel workspaces and Guardian diagnostics. Harden sandbox ownership, source indexing, pause/rewind and engine reconnection; expand regression and packaged application coverage and refresh release documentation.
1 parent e5f437d commit e8f18e1

82 files changed

Lines changed: 3032 additions & 1575 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/native.yml‎

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -77,46 +77,46 @@ jobs:
7777
- name: Build native development packages with dependency notices
7878
run: node scripts/build-native.mjs
7979
- name: Inspect both packages
80-
run: node scripts/check-native-package.mjs target/release/bundle/appimage/ShadowCode_0.21.0_amd64.AppImage target/release/bundle/deb/ShadowCode_0.21.0_amd64.deb
80+
run: node scripts/check-native-package.mjs target/release/bundle/appimage/ShadowCode_0.22.0_amd64.AppImage target/release/bundle/deb/ShadowCode_0.22.0_amd64.deb
8181
- name: Rebuild the shipped runtime sources without network access
8282
run: node scripts/test-native-runtime-sources.mjs
8383
- name: Exercise concurrent AppImage extraction and shutdown
8484
run: node scripts/test-native-runtime.mjs
8585
- name: Exercise the packaged CLI without a display
8686
env:
87-
SHADOW_DESKTOP_BINARY: ${{ github.workspace }}/target/release/bundle/appimage/ShadowCode_0.21.0_amd64.AppImage
87+
SHADOW_DESKTOP_BINARY: ${{ github.workspace }}/target/release/bundle/appimage/ShadowCode_0.22.0_amd64.AppImage
8888
SHADOW_CLI_ARGS: '["--appimage-extract-and-run"]'
8989
SHADOW_CLI_ARTIFACTS: artifacts/native-package/cli
9090
run: node scripts/test-native-cli.mjs
9191
- name: Exercise the packaged native terminal
9292
env:
93-
SHADOW_DESKTOP_BINARY: ${{ github.workspace }}/target/release/bundle/appimage/ShadowCode_0.21.0_amd64.AppImage
93+
SHADOW_DESKTOP_BINARY: ${{ github.workspace }}/target/release/bundle/appimage/ShadowCode_0.22.0_amd64.AppImage
9494
SHADOW_CLI_ARGS: '["--appimage-extract-and-run"]'
9595
SHADOW_TUI_ARTIFACTS: artifacts/native-package/tui
9696
run: node scripts/test-native-tui.mjs
9797
- name: Exercise the packaged native window
9898
env:
99-
SHADOW_DESKTOP_BINARY: ${{ github.workspace }}/target/release/bundle/appimage/ShadowCode_0.21.0_amd64.AppImage
99+
SHADOW_DESKTOP_BINARY: ${{ github.workspace }}/target/release/bundle/appimage/ShadowCode_0.22.0_amd64.AppImage
100100
SHADOW_DESKTOP_ARGS: '["--appimage-extract-and-run","ui"]'
101101
SHADOW_NATIVE_DEFAULT_PROFILE: '1'
102102
SHADOW_NATIVE_ARTIFACTS: artifacts/native-package/window
103103
run: xvfb-run -a -s '-screen 0 1440x1100x24' dbus-run-session -- node scripts/test-native-desktop.mjs
104104
- name: Exercise the packaged native MCP server
105105
env:
106-
SHADOW_DESKTOP_BINARY: ${{ github.workspace }}/target/release/bundle/appimage/ShadowCode_0.21.0_amd64.AppImage
106+
SHADOW_DESKTOP_BINARY: ${{ github.workspace }}/target/release/bundle/appimage/ShadowCode_0.22.0_amd64.AppImage
107107
SHADOW_CLI_ARGS: '["--appimage-extract-and-run"]'
108108
SHADOW_MCP_ARTIFACTS: artifacts/native-package/mcp-server
109109
run: node scripts/test-native-mcp-server.mjs
110110
- name: Exercise the packaged native MCP HTTP server
111111
env:
112-
SHADOW_DESKTOP_BINARY: ${{ github.workspace }}/target/release/bundle/appimage/ShadowCode_0.21.0_amd64.AppImage
112+
SHADOW_DESKTOP_BINARY: ${{ github.workspace }}/target/release/bundle/appimage/ShadowCode_0.22.0_amd64.AppImage
113113
SHADOW_CLI_ARGS: '["--appimage-extract-and-run"]'
114114
SHADOW_MCP_ARTIFACTS: artifacts/native-package/mcp-server-http
115115
SHADOW_MCP_TRANSPORT: http
116116
run: node scripts/test-native-mcp-server.mjs
117117
- name: Verify packaged MCP interoperability with official TypeScript clients
118118
env:
119-
SHADOW_DESKTOP_BINARY: ${{ github.workspace }}/target/release/bundle/appimage/ShadowCode_0.21.0_amd64.AppImage
119+
SHADOW_DESKTOP_BINARY: ${{ github.workspace }}/target/release/bundle/appimage/ShadowCode_0.22.0_amd64.AppImage
120120
SHADOW_CLI_ARGS: '["--appimage-extract-and-run"]'
121121
SHADOW_MCP_PEER_ARTIFACTS: artifacts/native-package/mcp-peer
122122
run: node scripts/test-native-mcp-peer.mjs

‎.github/workflows/release.yml‎

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -64,9 +64,7 @@ jobs:
6464
npm --prefix scripts/native-mcp-peer ci --ignore-scripts --no-audit --no-fund
6565
SHADOW_DESKTOP_BINARY="$BINARY" SHADOW_CLI_ARGS='["--appimage-extract-and-run"]' node scripts/test-native-mcp-peer.mjs
6666
- name: Create release checksums
67-
run: |
68-
cd target/release/bundle
69-
sha256sum appimage/*.AppImage appimage/*runtime-sources.tar.gz deb/*.deb > SHA256SUMS
67+
run: cp artifacts/native-package/SHA256SUMS target/release/bundle/SHA256SUMS
7068
- name: Verify installer replacement and checksum refusal
7169
run: bash scripts/test-install-appimage.sh
7270
- name: Publish checked native artifacts

‎.gitignore‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ build/
77
.pytest_cache/
88
.mypy_cache/
99
.ruff_cache/
10-
.venv/
10+
.venv
1111
venv/
1212
ui/node_modules/
1313
scripts/native-mcp-peer/node_modules/
@@ -32,5 +32,5 @@ artifacts/
3232
ui/test-results/
3333
ui/playwright-report/
3434
src/shadow_agent/_assets/
35-
/target/
35+
/target
3636
/src-tauri/gen/

‎CHANGELOG.md‎

Lines changed: 27 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,32 @@
11
# Changelog
22

3-
## Unreleased (flagship complete)
4-
5-
- **Code intelligence:** On-demand SQLite AST symbol index for Rust/TypeScript
6-
(ordinary tables). Tools: `find_references`, `goto_definition`,
7-
`get_diagnostics`, `get_type_signature`. Patch prep includes bounded callers.
8-
- **Sandbox:** Ephemeral scratch upper (`SHADOWCODE_SCRATCH`) with discard path;
9-
real home stays read-only; CoW probe is honest (not kernel-proof).
10-
- **Parallel worktrees:** Cap 2 workers + lead; verifier reports unclean merges;
11-
disabled outside git.
12-
- **Inference:** Ollama `keep_alive` retained; no fake prefix-cache 3× claim
13-
(see `docs/NATIVE_INFERENCE.md`).
14-
- **Verification:** Bug/fix prompts still ask for a failing case first; narrow
15-
test commands when verification is requested; model prose never verifies.
16-
- **Session fork:** `POST /api/sessions/{id}/fork` from an event id; original
17-
intact.
18-
- **Guardian:** Optional scheduled read-only health check (default OFF); patch
19-
prepare only after approval; never silent auto-PR.
20-
- **UI:** Advanced settings group for guardian/parallel/sandbox; vitest uses
21-
happy-dom (jsdom ESM break on Node 22.11).
3+
## 0.22.0
4+
5+
- Native desktop controls for context windows, Ollama residency, response forks,
6+
parallel workspace preparation and combined integration checks.
7+
- Durable, workspace-scoped parallel plans; cleanup refuses dirty or active
8+
checkouts and retains worker branches. Git filters and custom merge drivers
9+
cannot execute through these operations.
10+
- Event forks retain completed tool context, exclude later turns and reject
11+
events belonging to other sessions. Original deletion preserves fork context.
12+
- Rewind waits for a confirmed pause boundary and reserves idle workspaces;
13+
in-flight commands and other tasks cannot race checkpoint restoration.
14+
Task pause/resume controls are distinct from goal scheduling controls.
15+
- Attached windows close promptly during owner reconnection and retain live
16+
event notifications across engine replacements and subsequent disconnects.
17+
- Private AST cache with path confinement, content hashes, Unicode-safe
18+
signatures, deletion refresh, exact-name priority and syntactic call sites.
19+
- Managed temporary scratch cleanup, corrected project mount order, operational
20+
bubblewrap probing and no automatic shell replay after an execution failure.
21+
- Guardian state and proposal approvals scoped to profile/workspace. Diagnostics
22+
and draft proposals now accurately describe their limited behavior.
23+
- Validated Ollama residency, numeric unload/indefinite wire values and saved
24+
routing preferences. Removed unused prompt hash computation.
25+
- Fixed Ctrl+N after session activation and shortcut modifier overlap; improved
26+
model badge contrast in light, dark and dimmed dialog layouts.
27+
- Split Markdown rendering into a separate UI bundle. Updated Happy DOM to a
28+
patched release and declared the supported Node minimum.
29+
- Updated native build, packaging version, regression coverage and feature docs.
2230

2331
## 0.21.0
2432

‎Cargo.lock‎

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

‎Cargo.toml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ default-members = ["native/core"]
44
resolver = "2"
55

66
[workspace.package]
7-
version = "0.21.0"
7+
version = "0.22.0"
88
edition = "2021"
99
rust-version = "1.95"
1010
license = "MIT"

‎README.md‎

Lines changed: 35 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# ShadowCode
22

3-
![version](https://img.shields.io/badge/version-0.21.0-386c51) ![Rust](https://img.shields.io/badge/runtime-Rust%201.95-orange) ![license](https://img.shields.io/badge/license-MIT-green)
3+
![version](https://img.shields.io/badge/version-0.22.0-386c51) ![Rust](https://img.shields.io/badge/runtime-Rust%201.95-orange) ![license](https://img.shields.io/badge/license-MIT-green)
44

55
**Your ideas. Your models. Your machine.**
66

@@ -10,7 +10,7 @@ context, tools, permissions, checkpoints, plans, and verification.
1010

1111
![ShadowCode workspace](docs/images/workspace-light.png)
1212

13-
**Native 0.21 release:** the `main` branch builds a Rust/Tauri desktop window
13+
**Native 0.22 release:** the `main` branch builds a Rust/Tauri desktop window
1414
with the interface embedded in the executable. It needs no Python runtime or
1515
browser launcher. See the [native desktop guide](docs/NATIVE_DESKTOP.md)
1616
and the [goals](docs/NATIVE_GOALS.md) and [model routing](docs/NATIVE_ROUTING.md)
@@ -35,33 +35,33 @@ Integrations and release checks are tracked under the [release gates](docs/NATIV
3535

3636
## Native AppImage
3737

38-
Download the `v0.21.0` **x86_64 AppImage**
39-
and its `SHA256SUMS` file from [GitHub releases](https://github.com/ShadowfetchLinux/ShadowCode/releases/latest).
38+
Download the `v0.22.0` **x86_64 AppImage**
39+
and its `SHA256SUMS` file from [GitHub releases](https://github.com/Shadowfetchapps/ShadowCode/releases/latest).
4040
The native application embeds its interface; Python, Node.js and a browser
4141
launcher are not runtime dependencies. The release targets **Ubuntu 24.04 or
4242
newer / glibc 2.39+**. Git and a model provider such as Ollama remain external.
4343

4444
```bash
45-
sha256sum -c SHA256SUMS
46-
chmod +x ShadowCode_0.21.0_amd64.AppImage
47-
./ShadowCode_0.21.0_amd64.AppImage --appimage-extract-and-run
45+
sha256sum --ignore-missing -c SHA256SUMS
46+
chmod +x ShadowCode_0.22.0_amd64.AppImage
47+
./ShadowCode_0.22.0_amd64.AppImage --appimage-extract-and-run
4848
```
4949

5050
Extraction mode works without FUSE. To install into `~/Applications`, add a
5151
stable `shadow` command, and replace the desktop launcher:
5252

5353
```bash
54-
git clone https://github.com/ShadowfetchLinux/ShadowCode.git
54+
git clone https://github.com/Shadowfetchapps/ShadowCode.git
5555
cd ShadowCode
56-
./scripts/install-appimage.sh /path/to/ShadowCode_0.21.0_amd64.AppImage
56+
./scripts/install-appimage.sh /path/to/ShadowCode_0.22.0_amd64.AppImage
5757
```
5858

5959
Keep `SHA256SUMS` beside the download and the installer verifies its matching
6060
entry automatically. It replaces older ShadowCode AppImages only after the new
6161
executable starts, preserves settings, keys, memory and task history, and refuses
6262
a changed download before it can alter the installed application.
6363

64-
## Native 0.21 highlights
64+
## Native 0.22 highlights
6565

6666
- **A focused workspace.** Persistent projects and tasks, search, pinned tasks,
6767
a refined light/dark interface, and responsive layouts. Files, review, terminal,
@@ -87,16 +87,17 @@ a changed download before it can alter the installed application.
8787
outputs from the machine running ShadowCode, never screen contents, and marks
8888
incomplete detection as unknown instead of guessing zero.
8989

90-
See [CHANGELOG.md](CHANGELOG.md) for the release history and
90+
See the [0.22 qualification report](docs/SHADOWCODE_022_QUALIFICATION_REPORT.md),
91+
[CHANGELOG.md](CHANGELOG.md) for the release history, and
9192
[the user guide](docs/USER_GUIDE.md) for workflows and recovery.
9293

9394
## Native development build
9495

95-
Requires Rust 1.95, Node 22+, and the packages listed in the [native desktop
96+
Requires Rust 1.95, Node 22.12+ or 24+, and the packages listed in the [native desktop
9697
guide](docs/NATIVE_DESKTOP.md#build-and-run).
9798

9899
```bash
99-
git clone https://github.com/ShadowfetchLinux/ShadowCode.git
100+
git clone https://github.com/Shadowfetchapps/ShadowCode.git
100101
cd ShadowCode
101102
npm --prefix ui ci
102103
npm --prefix ui run build
@@ -108,39 +109,27 @@ cargo build -p shadowcode-desktop --locked
108109
the [native migration guide](docs/NATIVE_MIGRATION.md) for validation and release
109110
requirements.
110111

111-
## Open-Weight Model Flagship Pillar
112-
113-
ShadowCode is purpose-built to serve as the definitive harness for open-source, open-weight models:
114-
115-
- **Open-Weight Coding Champions:** First-class showcase and prompt tuning for **Qwen 2.5 Coder** (7B, 14B, 32B), **DeepSeek R1 & V3** (14B, 32B, 671B), **Llama 3.3** (70B), **Mistral Devstral** (22B), **GPT-OSS** (20B), and **Gemma 4** (12B).
116-
- **Hardware & VRAM Compatibility Advisor:** Automatically checks your GPU and VRAM (e.g. NVIDIA RTX 16GB) to suggest optimal model quantization and parameters (7B ~5GB, 14B ~10GB, 32B ~20GB, 70B ~40GB).
117-
- **Local Privacy & Zero Telemetry:** Connects seamlessly to local inference runtimes:
118-
- **Ollama** (`http://127.0.0.1:11434`)
119-
- **LM Studio** (`http://127.0.0.1:1234`)
120-
- **vLLM** (`http://127.0.0.1:8000`)
121-
- **llama.cpp** (`http://127.0.0.1:8080`)
122-
- **Reasoning Channel Visualizer:** Transparent chain-of-thought streaming for reasoning models like DeepSeek R1 with live timers and collapsible thought traces.
123-
124-
## 20-Minute Fast-Track Mastery (Codex & Cursor Workflow)
125-
126-
Anyone with basic coding intent can master the autonomous agent loop in under 20 minutes:
127-
128-
1. **Pick Model & Workspace:** Connect your local Ollama / open-weight server in one click or select from the Open-Weights Showcase.
129-
2. **Select Agent Mode:**
130-
- 🔨 **Build (Coder):** Autonomous file modification, command execution, and test repair.
131-
- 🧭 **Plan (Architect):** Non-destructive milestone blueprints and roadmaps before editing code.
132-
- 🛡️ **Review (Auditor):** Strict security audits, vulnerability scanning, and bug discovery.
133-
- 🧪 **Test (QA):** Unit test authoring and behavioral regression checks.
134-
3. **The Codex / Cursor Iterative Loop:**
135-
- Prompt with clear intent and file attachments.
136-
- Watch live tool execution and file inspection cards.
137-
- Inspect color-coded diff hunks in the Changes drawer (`Ctrl+B`).
138-
- Accept or reject edits per-hunk, per-file, or rewind previous tasks with one click.
139-
4. **Live Steering & Queueing:**
140-
- Click **Pause** to give live redirection advice, then **Resume** to inject context.
141-
- Queue follow-ups while an active task is executing without waiting.
142-
5. **Interactive Flow Guide:**
143-
- Launch the visual **20-Min Flow Guide** anytime from the top bar or welcome screen.
112+
## Local models and a focused workflow
113+
114+
Connect Ollama, LM Studio, llama.cpp, vLLM, or a compatible hosted endpoint.
115+
Tool use and answer quality depend on the selected model. ShadowCode provides
116+
workspace tools, explicit approvals, saved history, and verification evidence.
117+
A model is useful for coding only when it reliably calls those tools.
118+
119+
Settings → Model exposes the context window and Ollama model residency. Start
120+
with 16,384 tokens on a local model and increase it only within the model's
121+
supported window and your available memory. Model weights and inference engines
122+
remain external; see [inference settings](docs/NATIVE_INFERENCE.md).
123+
124+
During a task, pause and steer the next model turn, or queue a follow-up.
125+
**Fork from here** creates a separate conversation at a response while retaining
126+
available completed tool context. See [history](docs/NATIVE_HISTORY.md).
127+
128+
Settings → Advanced prepares up to two workspaces, opens them for explicit
129+
tasks, checks their combined merge result, and removes clean checkouts while
130+
retaining branches. It does not launch workers automatically. Optional Guardian
131+
diagnostics are off by default. See [parallel workspaces](docs/NATIVE_PARALLEL.md)
132+
and [Guardian](docs/NATIVE_GUARDIAN.md).
144133

145134
## Workflows
146135

‎config.example.yaml‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@ model:
1313
endpoint: ""
1414
api_key_env: OPENAI_API_KEY
1515
name: mock-coder
16-
context_limit: 128000
16+
context_limit: 16384
17+
keep_alive: "30m" # Ollama only: duration, "0" to unload, "-1" indefinite
1718

1819
permissions:
1920
level: workspace # read_only | workspace | elevated

‎docs/NATIVE_DESKTOP.md‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Native desktop — 0.21
1+
# Native desktop — 0.22
22

33
The `main` branch builds one Rust desktop executable with the React
44
interface embedded. Tauri hosts it in the system WebKit webview. The interface
@@ -53,7 +53,7 @@ sudo apt-get install build-essential pkg-config libgtk-3-dev \
5353
libwebkit2gtk-4.1-dev librsvg2-dev libayatana-appindicator3-dev patchelf
5454
```
5555

56-
Use Rust 1.95 and Node 22 or newer for development. From the repository root:
56+
Use Rust 1.95 and Node 22.12+ or 24+ for development. From the repository root:
5757

5858
```sh
5959
npm --prefix ui ci
@@ -140,8 +140,8 @@ From the repository root, build both package formats with:
140140
```sh
141141
node scripts/build-native.mjs
142142
node scripts/check-native-package.mjs \
143-
target/release/bundle/appimage/ShadowCode_0.21.0_amd64.AppImage \
144-
target/release/bundle/deb/ShadowCode_0.21.0_amd64.deb
143+
target/release/bundle/appimage/ShadowCode_0.22.0_amd64.AppImage \
144+
target/release/bundle/deb/ShadowCode_0.22.0_amd64.deb
145145
node scripts/test-native-runtime.mjs
146146
node --test scripts/test-native-source-fetch.mjs
147147
node scripts/test-native-runtime-sources.mjs

‎docs/NATIVE_GUARDIAN.md‎

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,17 @@
1-
# Guardian (optional, approval-gated)
1+
# Guardian diagnostics
22

3-
`shadowcode serve` may run a scheduled **read-only** health check when enabled
4-
in Settings → Advanced. **Default OFF.**
3+
Guardian is off by default. Enable it and save an interval of 60–86,400 seconds
4+
in Settings → Advanced. Run diagnostics manually there; scheduled checks run
5+
while `shadowcode serve` is running. The desktop alone does not start a scheduler.
56

6-
- Checks Doctor/sandbox probes and test hints without writing the main tree.
7-
- May open a worktree and prepare a patch **only after explicit approval**.
8-
- Never pushes, opens a PR, or notify-and-merges while idle.
9-
- Desktop notification via `notify-send` when available; otherwise logs.
7+
Checks inspect local isolation support and identify a suggested test command.
8+
They do not run tests, edit code, push, open a PR or merge. Last-run results and
9+
pending proposals are scoped to the current engine profile and workspace.
10+
Results are visible in Advanced; desktop notifications are not implemented.
11+
12+
The optional proposal API requires both `enabled` and `allow_prepare_patch`.
13+
`POST /api/guardian/request-patch` with `summary` returns an immutable
14+
`approval_id`. Passing that exact ID to `POST /api/guardian/approve-patch` saves
15+
`PROPOSAL.md` outside the project. The ID is bound to the profile, workspace and
16+
original summary and can be used once. Despite the compatibility endpoint name,
17+
this saves a **proposal draft**, not a generated patch or Git worktree.

0 commit comments

Comments
 (0)