ZAGROS

Delivery

Roadmap

Each file tracks one slice of delivery. Front-matter status is one of planned, in-progress, shipped, partial. adrs lists the decisions in ../adr/ the work implements. Checkboxes mark what is verified in the repo, not what is merely written.

shipped 2 partial 5

01-core

WS01: Core: catalog, fuzzy search, frecency, config, themes

shipped
  • [x] Paths and portable mode
  • [x] Config load/save with commented defaults
  • [x] Fuzzy matcher with highlight indices
  • [x] Frecency history
  • [x] Catalog with concurrent providers and keyword routing
  • [x] Theme loader and four built-in themes

ADR 0002 ADR 0007

02-ui-tray

WS02: Native Win32 UI and system tray

partial
  • [x] Launcher window, GDI rendering, DPI scaling
  • [x] Keyboard navigation, own text editing
  • [x] Global hotkey (Alt+Space default)
  • [x] Tray icon, menu, Explorer restart recovery, single instance
  • [x] Permission consent dialog
  • [x] Extension manager window
  • [x] CLI and wiring (cmd/zagros)
  • [x] Typing performance (see docs/ui.md, "Performance architecture")
    • [x] --trace / ZAGROS_TRACE=1 timing log (trace.log)
    • [x] Async icons: letter tile first, one worker, deduplicated bounded queue, premultiplied DIB blit, cache kept across hide/show (128), trimmed after 5 min idle
    • [x] Progressive results: Catalog.QueryStream, core.Tiered (tier 0 inline, tier 1 debounced 40 ms with 1.5 s budget), stale-snapshot drop, one apply per 16 ms, selection kept by item ID
    • [x] Everything: in-process DLL, result reuse for extended and backspaced queries, es.exe only as a debounced, kill-on-cancel fallback
    • [x] Warm start: apps index, fonts, back buffer, shell icon init off the UI thread; "Indexing..." status and automatic re-run when the index lands
    • [x] Stable window: resize only when the row count changes; GDI objects created once per face/size/DPI
    • [x] UI-thread audit: tray file/config work moved to goroutines

Verified: go build, go vet, unit tests, and zagros.exe --selftest (offscreen render at 96 and 168 DPI, a 50-keystroke burst with a 200 ms slow provider that fails on any paint over 50 ms or instant results later than 30 ms, permission dialog, manager, tray icon add/remove). Burst numbers on the dev machine: old wait-for-all behaviour 201 ms until anything shows; now results are painted within 2 ms of a keystroke (0.7 ms average) and the worst paint is 1.4 ms.

Not verified by hand (no interactive session): real keyboard and mouse use, Tab actions menu, IME, focus on show, fade, dialog clicks, right-click tray menu, balloons, Explorer-restart recovery, ext install end to end, a live typing session with --trace against real Everything and extensions, icons of network paths.

Known gaps: no .syso resource (exe file shows no icon in Explorer), icons use SHGetFileInfo only (no UWP icons), IME composition window not positioned at the caret, manager does not show per-extension settings and calls the extension admin synchronously on click, Ctrl+V reads the clipboard on the UI thread, systemIsDark reads the registry on each show when following Windows.

ADR 0003 ADR 0004

03-extensions

WS03: Starlark extension runtime and permissions

shipped
  • [x] Manifest and zip install with zip-slip protection
  • [x] Permission store and per-call checks
  • [x] Host modules (http, fs, clipboard, proc, storage, crypto)
  • [x] Provider adapter, hot reload, pack and validate
  • [x] Extension docs and two examples

Notes:

  • Tests pass for permission denial, zip-slip, step limit, timeout, install and consent flows. -race was not run (needs CGO).
  • The UI must supply a Platform (clipboard, notifications) and a PermissionPrompter.
  • Manifest uses [[permission_detail]] for reasons and [[settings]] for the settings schema.

ADR 0005 ADR 0006

04-builtin

WS04: Built-in providers

partial
  • [x] Apps (Start menu, Store apps)
  • [x] Everything search
  • [x] Calculator, units, text tools, passwords
  • [x] System commands, windows, processes
  • [x] Web search and aliases, clipboard history, emoji, help

Notes:

  • Tests pass for calc, units, passwords and text tools. Apps ran on a dev machine (360 Start Menu entries found).
  • Everything integration is untested against a real Everything install; only the "not found" path is verified.
  • Clipboard history capture is untested against real clipboard changes.
  • Executor must honour Extra["confirm"] and Extra["nohistory"], and run Func actions.

ADR 0008

05-marketplace

WS05: Marketplace and registry

partial
  • [x] Registry format, schema and generator
  • [x] Client: list, search, resolve, download with limits
  • [x] github:owner/repo installs and update checks

Open items:

  • Not run against real GitHub (tests use httptest servers).
  • tomlite.go is a small TOML subset parser and ParseManifest assumes a manifest layout; reconcile with internal/ext and switch to BurntSushi/toml.
  • The app adapter from ext.Manager to market.Installer is not written yet.
  • [x] Starter content: 6+ themes and 4+ sample extensions in marketplace/ with registry entries (ADR 0012)

Starter content (ADR 0012): 7 themes and 6 extensions (wiki, hackernews, npm-search, weather, dictionary, snippets), all with registry entries. Tests validate every theme's contrast and run every extension against stubbed HTTP.

Still open:

  • Theme install, market list|search and the Themes tab are wired (zagros theme install), but only smoke-tested offline.
  • HTTP fixtures are written from memory of each service's response shape; no live calls were made.
  • Theme release-asset route has no test.

ADR 0009

06-site

WS06: Website, docs and CI

partial
  • [x] Boxy-styled landing, docs, marketplace, decisions and roadmap pages
  • [x] Pages, CI and release workflows
  • [x] README and LICENSE

Notes:

  • Site builds locally (25 pages, 0 broken internal links, Boxy lint 0 errors). The three workflows were written but never run on GitHub.
  • Fallback docs under site/content/ contain claims to verify against the finished UI and built-ins (Alt+Space default, Tab opens actions menu, default web searches).
  • release.yml sets -X main.version; cmd/zagros needs a version variable.

ADR 0010

07-packaging

WS07: Packaging

partial
  • [x] Scoop manifest (placeholder hashes)
  • [x] Winget manifests (written, not validated with winget; ReleaseDate and hashes are placeholders)
  • [x] Update script (not run yet)

ADR 0011