v0.2.0 — production polish
v0.2.0 — production polish
Six features that take NotebookAI from "build complete" to "feels like a product."
Highlights
- GitHub Actions CI — pytest + ruff + Next.js build + cargo check + Playwright e2e on every PR. Sidecar binary build matrix for macOS arm64/x86_64, Linux x64/arm64, Windows x64 — artifacts attach to GitHub Releases on tag push.
- Wiki-only mode (graceful degradation) — when Claude credentials are missing, NotebookAI no longer errors out. Ingest still saves raw markdown (compile skipped), Ask returns retrieval-only answers from the local sqlite-vec index, Lint runs the passive watcher only. Surfaced via top-nav badge + amber banner on the Ask page + new
agent.unavailableSSE event. Seedocs/wiki-only-mode.md. - PyInstaller-bundled sidecar — Tauri desktop now ships a single-file backend binary; end-users no longer need
uvinstalled. The Rust shell falls back touv runfor the dev loop when the bundled binary isn't present. - Playwright e2e suite — 16 browser tests across Read, Ask, Curate, Library modes, ~19s wall-time, deterministic via per-test API mocking (no real backend). 13 components got
data-testidattributes for selector stability. - Real app icons + brand mark — bold cream N on an ink-blue squircle with a single amber AI-node accent. One Python script generates every Tauri size, ICNS, ICO, and the web favicon. See
docs/branding.md. - Scheduled lint cron — per-notebook hourly Haiku lint with idle detection (max-mtime over
wiki/+raw/viaos.scandir) and token-budget gating. UI shows a "Next: in 23m" countdown with a "Run now" button. - First-run welcome flow — empty library + flag absent → 3-step welcome with a pre-seeded demo notebook (3 wiki articles + 1 chat) so a fresh install gives the user something to navigate immediately.
Stats
- 7 PRs merged (#1–#6 plus initial CI commit)
- ~25k LOC (up from ~14k in v0.1)
- 131 backend tests + 21 Playwright e2e tests, all green
- macOS, Linux, Windows backend + Linux Playwright now CI-verified per PR
Acknowledgements
Every PR went through isolated subagents with strict input/output contracts and a verification gate, per BUILD.md discipline. Pull requests are tagged with the contract section they amended.
Migration from v0.1.0
No breaking changes. New endpoints are additive:
POST /api/library/demo— create the demo notebookGET /api/notebooks/{id}/lint/schedule+POSTto update +POST .../run-nowGET /api/notebooks/{id}response gainedagent_status: {available, reason}- New SSE events:
agent.unavailable,lint.scheduled,lint.skipped,lint.run_complete
notebook.json schema additions are optional (lint_schedule_enabled, lint_schedule_interval_minutes); existing notebooks keep working with defaults.
Followups bumped from this milestone
- macOS codesigning + notarization for the bundled sidecar — out of scope until an Apple Developer ID is wired up
- Wider Tauri test coverage —
cargo checkruns but no functional tests yet - Hugging Face model pre-baking into the sidecar — would add ~33MB to bundle in exchange for instant first-launch