Skip to content

v0.1.0 — Refactor + Contract Tests

Latest

Choose a tag to compare

@benclawbot benclawbot released this 09 Jul 22:28

v0.1.0 — Refactor + Contract Tests

First tagged release. The 10-step cleanup plan from the previous development cycle is complete; this release ships the result plus the new contract tests that lock the wire shape between the Rust agent runtime and the React UI.

Installers

  • Windows MSI (Zeus_0.1.0_x64_en-US.msi) — system-wide Windows Installer bundle.
  • Windows NSIS (Zeus_0.1.0_x64-setup.exe) — per-user installer, no admin required.

The ddgs search sidecar is not bundled in this release. webSearch will auto-detect a pip install ddgs on PATH first, then SearXNG (if ZEUS_SEARXNG_URL is set), then fall back to the raw DuckDuckGo HTML scrape. To bundle the sidecar instead, set ZEUS_BUNDLE_DDGS=1 before npm run tauri:build.

What's in this release

View extraction

App.tsx dropped from 2505 → 2299 lines. Five new view components pulled out as pure props-in JSX: HomeView, ProjectsView, MemoryView, HarnessEvolutionView, InspectorPanel (plus the previously-extracted SkillsView and SettingsView).

CSS Modules

View-specific styles now live in HomeView.module.css and ProjectsView.module.css. Shared chat-bubble chrome (used by AgentProgressBubble) stays in the global styles.css and is reached from the module via :global(.chat-body) where descendants cross the boundary. Memory / Harness Evolution / Inspector are pure shared chrome and were deliberately left on global — the cost-benefit of a module with re-exports is zero.

Registry split

src/providers/registry.ts (540 lines) is now a 36-line barrel re-exporting from four focused modules: chatTypes.ts, toolBlockParser.ts, toolDispatch.ts, providerRegistry.ts. All existing imports keep working.

Contract tests

  • typeDrift.test.ts (4 tests) — locks the Rust↔TS wire shape for ProviderInfo and SkillSummary via JSON fixtures + a regex check on #[serde(rename_all = "camelCase")]. A drift on either side fails CI.
  • bridge.test.ts (10 tests) — walks every invoke<...>("name", ...) call in TS and asserts it resolves to a name in the declared Tauri command list. Renaming a command without updating the list fails CI.
  • bridge_integration.rs — does the inverse on the Rust side, asserts every name in the declared list has a matching #[tauri::command] declaration.

Test count: 250 passing (was 236, +14 from the new contract suites).

Opt-ins

  • ZEUS_BUNDLE_DDGS=1scripts/build-ddgs-sidecar.{sh,ps1} now no-op unless this is set. Sidecar is no longer part of the default install path.
  • ZEUS_BUNDLED_SKILLS=id1,id2,… — comma-separated allowlist for the Skills picker. Off-list skills still load on demand via load_skill(id).

Planner polish

  • summarizeSessionTitle() — low-temp LLM probe that shortens session labels to 2–4 words.
  • tightenStep() — clamps plan labels to ≤5 words / ≤40 chars so the plan panel never ships prose-length bullets.

CI

  • contract.yml — new fast workflow: tsc --noEmit + npm test on every push to main and every PR. 250 tests, ~25s.
  • package.yml — now uploads MSI / NSIS / raw exe / ddgs sidecar as workflow artifacts (skipped for PRs, 30-day retention).

Known gaps

  • Visual regression: I have not run the built installer in a real browser session to eyeball the chat after the CSS module split. The contract tests verify the structural rules; the module-vs-global :global() boundary deserves a manual pass before tagging v0.2.
  • src/styles.css is unchanged but the rules now duplicate the view-owned ones in the two new .module.css files. A follow-up could prune the global duplicates. Kept for now so a missed rule in a module still renders something via the global fallback.