Skip to content

Commit e23a30f

Browse files
committed
ci(release): publish the hand-written note as the release body
generate-notes scopes the changelog to previous-tag..HEAD, which for v0.0.8 is v0.0.6...v0.0.8 (two PRs) — it can't express that the whole v0.0.7-alpha line rolls up into this release. Prefer docs/releases/<tag>.md as the body when present (checkout added so the file is on disk), falling back to the auto-generated changelog otherwise; evidence is still appended either way. Add the v0.0.8 release note covering v0.0.7-alpha.1..HEAD, and extend the wiring test to assert the file-first body + checkout.
1 parent 2339ac0 commit e23a30f

3 files changed

Lines changed: 158 additions & 6 deletions

File tree

.github/workflows/release.yml

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,7 @@ jobs:
163163
needs: [binary, deploy]
164164
runs-on: ubuntu-latest
165165
steps:
166+
- uses: actions/checkout@v5
166167
- uses: actions/download-artifact@v8
167168
with:
168169
path: dist
@@ -183,12 +184,20 @@ jobs:
183184
# Pre-releases: any tag with a -suffix (v0.0.7-alpha.6, v1.0.0-rc.1).
184185
prerelease=""
185186
[[ "$TAG" == *-* ]] && prerelease="--prerelease"
186-
# Body = GitHub's auto-generated changelog since the previous tag,
187-
# followed by the deploy evidence captured by the smoke job. The
188-
# evidence only exists because deploy was green, so its presence is
189-
# itself proof prod shipped before the release published.
190-
gh api "repos/${GH_REPO}/releases/generate-notes" \
191-
-f tag_name="$TAG" --jq .body > notes.md
187+
# Body: prefer the hand-written note for this tag (it can scope the
188+
# changelog however the release warrants — e.g. rolling up a whole
189+
# pre-release line). Fall back to GitHub's auto-generated changelog
190+
# since the previous tag when no hand-written note exists.
191+
note="docs/releases/${TAG}.md"
192+
if [ -f "$note" ]; then
193+
cp "$note" notes.md
194+
else
195+
gh api "repos/${GH_REPO}/releases/generate-notes" \
196+
-f tag_name="$TAG" --jq .body > notes.md
197+
fi
198+
# Append the deploy evidence captured by the smoke job. It only exists
199+
# because deploy was green, so its presence is itself proof prod
200+
# shipped before the release published.
192201
printf '\n\n' >> notes.md
193202
cat evidence/release-evidence.md >> notes.md
194203
gh release create "$TAG" $prerelease \

docs/releases/v0.0.8.md

Lines changed: 138 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,138 @@
1+
## 🧱 v0.0.8 — The "New Foundation" Release
2+
3+
- **Release date:** 2026-06-26
4+
- **Previous release:** `v0.0.7-alpha.1` (2026-04-13) — the initial v0.0.7 line
5+
- **Range:** `v0.0.7-alpha.1..v0.0.8`
6+
- **Delta:** **1,427 commits**, **1,647 files changed**, **+131,487 / −137,152**
7+
8+
---
9+
10+
### A bigger codebase, then a smaller one. Wallfacer was rebuilt from the ground up.
11+
12+
The entire v0.0.7 alpha line rolls up into v0.0.8 — over ten weeks and 1,400 commits of work. This is not a feature bump. The frontend was rewritten as a Vue SPA, the native desktop app was retired, multi-harness and host-execution support landed, a full spec-coordination lifecycle was built, and the groundwork for multi-user cloud collaboration went in. We deleted nearly as much code as we added, and what remains is a real platform.
13+
14+
---
15+
16+
## 🖥️ A Brand-New Frontend — Rebuilt in Vue
17+
18+
The legacy hand-rolled vanilla-JS `ui/` is gone. The entire interface is now a **Vue single-page app**, shipped as the default:
19+
20+
- **Vue SPA is the default UI** — the legacy interface was removed entirely after a full parity migration
21+
- **Chat / Plan / Board navigation** — three first-class surfaces instead of one monolithic view
22+
- **History-based routing** with deep links, last-route memory, and migrated legacy hash URLs
23+
- **CodeMirror 6 file editor** with **VS Code-style editor tabs** — single-click preview, double-click/save to pin, and a board-status indicator on each tab
24+
- **Dockable panel workspace** — drag the terminal to any edge, maximize, split, and tab-group panels, all driven by a pure layout-reducer store
25+
- **App-native components**`AppSelect` replaces every native dropdown across settings, analytics, composer, agents, flows, and routines
26+
27+
## 💬 A Real Chat & Planning Surface
28+
29+
Planning is now a conversation, not a form:
30+
31+
- **Dedicated Chat surface** plus a **floating, draggable chat popup** available on every tab and resizable from any edge or corner
32+
- **Codex-style agent trajectory** — the agent's work streams in as clean prose, animates in, shimmers on the active step, and folds when done
33+
- **Token usage and cost shown per turn and per thread**, with a compact command preview under each tool step
34+
- **Auto-titled sessions** — threads name themselves from the opening message, shown live; deferred thread creation until the first message
35+
- **Session management** — group by status and by last-activity date ranges, archive, and permanently delete archived threads
36+
37+
## 🤖 Multi-Harness Support & Host Execution
38+
39+
Wallfacer is no longer tied to one agent or to containers:
40+
41+
- **Five harnesses** behind a unified abstraction: **Claude, Codex, Cursor, OpenCode, and Pi**
42+
- **Host-execution mode** — run agents directly on the host with no container, including `cursor-agent`, `opencode`, and `pi`
43+
- **Harness pickers everywhere** — logo+text selectors in the task composer, settings, and the landing page, surfaced from the registry
44+
- `wallfacer doctor` probes host binaries; `CURSOR_API_KEY` and friends are wired through env GET/PUT/test
45+
- Heavyweight, inspector, and headless agent roles all migrated onto the shared `Harness` interface
46+
47+
## 📐 Spec Coordination — A Full Lifecycle
48+
49+
The spec system grew from notes into a coordinated, drift-aware workflow:
50+
51+
- **Explicit lifecycle states**`drafted → validated → dispatched → testing → done`, with a completion gate
52+
- **Drift testing** — an agent-backed drift tester compares a finished task against its spec, with verdict types, a pure classifier, and a tester-failure override
53+
- **Staleness propagation** — advisory cross-tree scans surface stale candidates with mark-stale/dismiss and bulk-dismiss; chat edits fan out to dependents
54+
- **Archive/unarchive** that relocates the spec file via `git mv` and resolves archived specs by logical path
55+
- **Folder dispatch** of non-leaf subtrees and per-workspace commit mutexes for safe concurrent spec commits
56+
- **Spec comments** rendered in a margin rail (drop the centered popover), with fold toggles and breakpoint auto-fold
57+
58+
## ☁️ Cloud & Multi-User Foundations
59+
60+
The groundwork for shared, signed-in, multi-tenant operation:
61+
62+
- **Browser sign-in by default** via a public OAuth client; `wallfacer auth login/logout/whoami` CLI subcommands
63+
- **Device-auth flow**`/api/auth/device/{start,poll,cancel}` for local SPA sign-in
64+
- **Org switching** with a shared `latere-ui` account menu; workspaces isolated by org in cloud mode
65+
- **Coordination plane** — outbound connector, accept-side websocket handler, an in-memory instance registry, and a **durable Postgres comment store** with a shared pool and versioned `golang-migrate` migrations
66+
- **Token-audience validation** and authenticated-principal gating on the feedback and comment routes
67+
- Opt-in coordination with a persisted toggle, status endpoints, and an out-of-sync banner
68+
69+
## 🗺️ Knowledge-Graph Map & Console
70+
71+
- **Map redesigned as a navigable knowledge graph** with deterministic community detection and a readability-tuned layout
72+
- **Console sidebar redesign** — Wallfacer/Workspace branding, shared fold, search bar, and a resizable spec tree
73+
- **Two-step workspace picker wizard**
74+
75+
## 🎨 Design System & Branding
76+
77+
- **Depth system** — an elevation ladder, frosted floating overlays, tactile filled buttons, and depth on panels and the status bar
78+
- **Hanken Grotesk** as the UI font
79+
- **Signature chat look** — a pixel-mark agent and ember accents, Claude-style threads
80+
- **Free-form, Apple-style landing page** with OS auto-detection on the install page and theme-aware screenshots
81+
82+
## ⏰ Routines
83+
84+
- **Scheduled / recurring tasks** with interval and flow pickers, a redesigned Routines page, and full backlog editing (prompt, sandbox, deps, `scheduled_at`)
85+
- Routines self-unregister when stopped, auto-disable when the last live instance is cancelled, and hide their system cards from the board
86+
- **Flows renamed to Workflows**, rendered as a pipeline
87+
88+
## 🧹 The Great Subtraction
89+
90+
This release removed as much as it added:
91+
92+
- **Native desktop app retired** — the Wails build, tray, deps, and CI are gone; Wallfacer is web-only
93+
- **Rebrand** — module path migrated to `latere.ai/x/wallfacer`, with vanity import resolution
94+
- **Legacy `ui/` deleted** after the Vue parity migration completed
95+
- Removed the workspace `AGENTS.md` editor and the host-mode banner; dropped `--container`/`--image` flags from `wallfacer desktop`
96+
97+
## ⚡ Performance
98+
99+
- **Incremental stream parsing** for planning and task-activity logs — no more O(n²) re-parsing on every chunk
100+
- **Lazy-loaded telemetry** shrinks the eager entry chunk
101+
- Shared `useNow` ticker and `tasksById` map across cards; batched critical-path scoring for autopilot candidates
102+
- Skip the mermaid enhancer on the streaming hot path; drop redundant `git rev-parse`/re-stat per comment thread
103+
104+
## 🛡️ Reliability
105+
106+
- Fixed live task detail going stale across SSE updates on the board and map
107+
- Double-click guards and immediate feedback on task-detail actions
108+
- Fixed a live-log relay goroutine leak on client disconnect
109+
- Coordinator persists resolve/reopen before fan-out (matching create/reply) and ignores stale socket leaves
110+
- Config-toggle and routine background passes run on a detached context so they survive request cancellation
111+
- Don't carry the active workspace across an org switch; strip SSG landing markup on cloud deep routes to stop the flash
112+
113+
---
114+
115+
## Upgrading
116+
117+
### One-liner install (recommended)
118+
119+
```bash
120+
curl -fsSL https://raw.githubusercontent.com/changkun/wallfacer/main/install.sh | sh
121+
```
122+
123+
### Direct binary download
124+
125+
Download the binary for your platform from the **Assets** section below, then:
126+
127+
```bash
128+
chmod +x wallfacer-*
129+
sudo mv wallfacer-* /usr/local/bin/wallfacer
130+
wallfacer doctor # verify setup
131+
wallfacer run # launch
132+
```
133+
134+
> **Note:** the standalone desktop app has been removed. Wallfacer now runs as a local web app — `wallfacer run` serves the Vue UI in your browser.
135+
136+
---
137+
138+
**1,427 commits. A frontend rebuilt, a desktop app retired, five agent harnesses, and the first steps into the cloud.** This is the release where Wallfacer's foundation was poured. [Tell us what breaks](https://github.com/changkun/wallfacer/issues).

release_evidence_test.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,11 @@ func TestReleaseWorkflowWiresEvidence(t *testing.T) {
3636
"name: Download release evidence",
3737
"cat evidence/release-evidence.md >> notes.md",
3838
"--notes-file notes.md",
39+
// release body prefers the hand-written note for the tag, so the
40+
// published changelog is not capped at the auto-generated previous-tag
41+
// scope. Requires a checkout so the file is on disk.
42+
`note="docs/releases/${TAG}.md"`,
43+
"uses: actions/checkout",
3944
} {
4045
if !strings.Contains(yml, want) {
4146
t.Errorf("release.yml missing evidence wiring: %q", want)

0 commit comments

Comments
 (0)