zgo-core is in active development. The figures on this page are derived from the crate source as it stands today (Cargo.toml, src/commands.rs, src/ffi.rs, PORT_REPORT.md): version, crate-types, the dotted command list in commands::COMMANDS — held in lockstep with Engine::invoke's match arms by the commands_cover_invoke_arms drift-guard test — the exported C symbols, and the hand-assessed Alfred coverage. The "planned" column lists work that is not yet implemented — it is a roadmap, not a claim of coverage.
Module map
| module | role today | planned |
|---|---|---|
| lib (Engine) | one dotted command surface via Engine::invoke; event sink; id allocation; profile + clipboard persistence | more dispatch coverage as modules grow |
| model | workflow · object · connection · variable · feedback · item · arg · icon · mod · text · snippet · theme · profile types | workflow object config typing per object kind |
| scriptfilter | to_json + parse (JSON & legacy XML) + run_env always on; run_script/run_command behind exec | per-object Script Filter dispatch, rerun loop |
| matcher | case-insensitive subsequence ranking with word-start / consecutive / case bonuses; filter over items | per-source ranking profiles |
| frecency · rank | per-uid hit-count / last-used learning (learn.record, learn.rank) and a blended fuzzy + frecency score on one axis (rank.blend) | decay-curve tuning exposed to the host |
| minquery · stability · trajectory · regress | matcher introspection replayed through the live ranker: shortest query that pins a target (match.minquery), typo-robustness radius (match.stability), keystroke-by-keystroke prefix safety (match.trajectory), and catalog-drift regression against a saved baseline (catalog.snapshot → match.regress) | host-side scheduling of periodic baselines |
| classify | query.classify — ranks a raw query into typed interpretations (calc / unit / color / base / timestamp / url / email / ip / uuid / hex), each naming the command to run | more detector kinds as tool modules land |
| vars | {query} · {var:NAME} · {clipboard} · {date[:FMT]} · {time} · {uuid} · {allvars} token expansion | per-modifier variable scopes, secret masking |
| websearch | built-in search keywords + custom {query} URL templating with RFC 3986 encoding | per-site result parsing, suggestion fetch (host side) |
| clipboard | capped newest-first history with re-copy merge + case-insensitive search | image/file blob capture (host pasteboard integration) |
| snippet | auto-expansion keyword match (longest trigger) + placeholder expansion (clipboard / date / cursor) | per-collection affix editing, keystroke injection (host side) |
| store | profile + clipboard JSON persistence (dirs paths) | raw binary plist read, multi-profile |
| import | workflow info.plist-as-JSON import + export; alfredsnippet import | .alfredworkflow zip unpack, raw plist parse |
| dispatch · executor · utilities · conditional · fallback | trigger resolution (keyword / snippet / external / hotkey / file action), whole-graph walk threading the argument through each object, the pure argument transforms (utility.*), condition routing, and the empty-result fallback row | rerun loops, per-object async execution |
| developer / productivity tools | self-contained pure-Rust algorithms behind the same command surface: calc · gen (uuid v4/v5/v7 · ulid · nanoid · password · passphrase · strength · lorem) · hash (digests · HMAC · file) · codec (base64/32/58 · Z85 · url · html) · color (convert · WCAG contrast · palette) · numbase · numfmt · numspell · units · currency · ipcalc · cron · datemath · datetime · timezone (world clock · meeting planner · humanize) · unicode · urlparse · jwt · qr · regexp · textdiff · textstats · texttransform · readability · strmetrics · phonetic · pipeline · csvjson · dataconv · lineops · dictionary | see the port report's "beyond Alfred" rounds for what is deliberately out of scope (live rates, full UCD, tz history, YAML/TOML parsing) |
| catalog sources | the launchable surface behind the launch bar: appindex (filesystem / application index), spotlight, filesearch, bookmarks, contacts, runningapps, music, onepassword, process (ranking model only), syscommands (sleep / lock / trash catalogue + runner), actions (Universal Actions), keystroke (paste-to-front injection) | native enumeration stays host-side where the OS API is required |
| queryhistory | capped newest-first typed-query ring with a recall window (query.record / query.recent / query.list / query.clear) | per-profile history separation |
| ffi | C ABI: zgo_init · zgo_invoke · zgo_set_event_callback · zgo_string_free | richer event payloads |
tauri_plugin (feature tauri) | Tauri v2 command (zgo_invoke) + setup; events on zgo-event | mountable webui packaging |
Build surfaces
The crate declares crate-type = ["rlib", "staticlib", "cdylib"]. The rlib links natively into Rust/Tauri hosts; the staticlib/cdylib expose the C ABI for non-Rust hosts (header include/zgo_core.h, hand-written, no cbindgen). The default exec feature carries Script Filter / Run Script process spawning; building --no-default-features yields a feedback-only core with no spawn surface that compiles in headless CI — feedback serialization, parsing, matching, token expansion and web-search URL building still work without it. The optional tauri feature adds the Tauri v2 command layer.
Verification
The crate carries in-source unit and integration tests across the engine and its modules: the command surface (version reporting, workflow CRUD + import/export, match filtering, token rendering, web-search URL building, clipboard add/search/clear, feedback parse/render, structured unknown-command errors), plus module-level tests in matcher (word-start ranking, subsequence rejection), vars (token resolution, unknown-left-verbatim, uuid shape), scriptfilter (JSON + legacy XML parse, run-env), snippet (auto-expand match, cursor offset), clipboard, websearch, import and store. Tests for the feedback-only core run without spawning a process and pass identically in a headless Linux CI; the run_script path is feature-gated so the default test path can be built without it.