@@ -6,7 +6,45 @@ adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
66
77## [ Unreleased]
88
9- (Empty — see 0.8.0 below.)
9+ (Empty — see 0.9.0 below.)
10+
11+ ## [ 0.9.0] — 2026-05-21
12+
13+ Replaces the ` praxis login ` localhost callback with a server-mediated
14+ poll handshake. Removes the CLI's local HTTP listener entirely,
15+ sidestepping browser security policies (Brave Shields, Chromium
16+ Private Network Access) that increasingly block cross-network
17+ fetches to ` http://127.0.0.1:<port> ` .
18+
19+ ### Changed (breaking)
20+ - ` praxis login ` no longer opens a local HTTP server. Instead it
21+ generates a session nonce, opens the browser to
22+ ` /ui/ai/settings/api-keys?cli_session=<nonce>&suggested_name=... ` ,
23+ and polls ` GET /ai-api/v1/cli-session/<nonce>/key ` every 1.5s for
24+ the freshly-created key. No ` net.Listen ` , no CORS handler, no PNA
25+ preflight dance. ` browserCallbackLogin ` → ` browserSessionPollLogin ` ;
26+ ~ 50 lines shorter overall.
27+ - Suggested key name now carries a 5-hex-char random suffix
28+ (` praxis-cli-a1b2c ` ) so repeated login attempts during development
29+ don't trip the modal's "name already exists" validation.
30+
31+ ### Fixed
32+ - ` skillcatalog ` now writes valid frontmatter for local catalog skills:
33+ ` name: ` lines are only rewritten when the existing value differs (no
34+ more cosmetic quoting churn on every render), and malformed-frontmatter
35+ recovery is documented for future readers. Adds a regression test for
36+ the no-op guard.
37+ - ` RemoveOrphanedByPrefix ` is annotated with the ` praxis- ` reserved
38+ namespace contract so its deletion scope is obvious from the function
39+ alone.
40+
41+ ### Companion backend changes
42+ - ** Requires ` agent-factory ` PR #1114 ** (commit ` 012292a7 ` , merged
43+ 2026-05-13) to be deployed. Provides the
44+ ` /ai-api/v1/cli-session/<nonce>/key ` POST + GET endpoints used by the
45+ new login flow. A v0.9 CLI against an older deployment will time out
46+ waiting for the key — there is no graceful fallback to the old
47+ localhost path.
1048
1149## [ 0.8.0] — 2026-05-12
1250
0 commit comments