Files
2026-10-21 21:01:23 -03:00

8.5 KiB

Tasks: global quick capture (roadmap 38)

One task = one bounded implementation handoff. Spec: spec.md; rules: AGENTS.md, docs/CODE-MAP.md. Paths marked new do not exist yet. Tasks run in order; each leaves its own testable result. Later implementation owns code paths listed below; this documentation run writes only specs/plugins-parity/.

First tool call rule: batch at most three relevant reads in first tool call; write first OWNS file in SECOND tool call (compiling stub plus one failing test), then implement and pass that test. Do not spend second call exploring. For docs-only task, write first OWNS document in second call and validate its acceptance checklist. Standing VERIFY (future implementation only): export PATH="$HOME/.cargo/bin:$PATH"; cargo test -p <package>; cargo clippy -p <package> --all-targets -- -D warnings; rustfmt --edition 2024 <owned Rust files>; UI tasks add cargo xtask i18n and read snapshot PNGs; final integration adds cargo xtask layers, cargo xtask tree, cargo xtask ci. Stop on failure; never bypass checks. Standing DO NOT: edit outside OWNS, change Git state, commit, use cargo fmt --all, add unapproved dependency, modify craft-libs API, use unsafe/panics/input indexing, write disk outside atomic Vault/Session/settings APIs, hardcode UI strings. Parent module declarations/test harnesses must be owned explicitly.

Phase 1 — pure draft lifecycle

  • 1. Draft validation and submission state (brief briefs/25-quick-capture-model.md). OWNS: crates/ui-egui/src/capture/model.rs (new, first write), crates/ui-egui/src/capture/mod.rs (new), crates/ui-egui/src/lib.rs (module declaration only). FILES TO OPEN: specs/plugins-parity/global-quick-capture/spec.md D1, crates/engine/src/capture/mod.rs, crates/ui-egui/src/shell/app/popout.rs. GOAL: pure Draft/Target/CaptureState transitions; <=1 MiB text, <=200 title characters; one in-flight submission, generation-matched completion, hide preserves text, explicit discard clears. Use existing serde_json only to form note.capture params; no IO. TESTS: empty/whitespace/over-limit/multibyte; repeated submit; failure then retry; stale result cannot clear newer draft; hide/reopen/discard; valid Daily/Inbox param shape; quitting with draft reports confirmation required. VERIFY: standing -p notescraft-ui-egui, cargo test -p notescraft-ui-egui capture::model. DO NOT: native hotkey registration, viewport creation, disk draft recovery, dependency/Cargo changes, engine command registration.

Phase 2 — live command surface

  • 2. Ephemeral capture-window request in live Session. OWNS: crates/engine/src/capture/window.rs (new, first write), crates/engine/src/capture/mod.rs, crates/engine/src/vault/session.rs, crates/engine/src/commands.rs, crates/engine/src/ai/assistant_gate.rs, crates/engine/tests/core_commands.rs, crates/engine/tests/capture_window.rs (new). FILES TO OPEN: spec D3, crates/engine/src/capture/mod.rs, crates/engine/src/vault/session.rs, crates/engine/src/control/pump.rs. GOAL: capture.window.request/status; host registers capability, request coalesces to one pending event drained by shell; headless unsupported; writable gate; never return draft. Public rustdoc for minimal capability/drain methods so app can use without egui in engine. TESTS: unsupported headless; host-enabled request drains once; repeated request coalesces; read-only refused; request/status permission classification and core ids; existing note.capture regression. VERIFY: standing engine, --test capture_window --test capture --test core_commands. DO NOT: add UI dependencies below L5, create IPC server, save notes outside note.capture, infer global support from focused-app hotkeys.

Phase 3 — native registration (owner gate)

  • 3. Platform hotkey owner and settings; stop until Q1/Q2 answered. OWNS: apps/notescraft/src/capture_hotkey.rs (new, first write), apps/notescraft/src/main.rs, apps/notescraft/Cargo.toml, Cargo.toml (approved global-hotkey workspace dependency ONLY), Cargo.lock, crates/engine/src/prefs/quick_capture_config.rs (new), crates/engine/src/prefs/mod.rs, crates/engine/src/prefs/app_settings.rs, crates/engine/src/prefs/settings.rs. FILES TO OPEN: spec D4-D5 and owner decisions, apps/notescraft/src/main.rs, apps/notescraft/src/menu.rs (main-thread event polling), crates/engine/src/prefs/app_settings.rs, crates/engine/src/prefs/settings.rs. GOAL: default-off local config and explicit owner; safe approved facade only, macOS main loop and Windows same-thread loop probe against pinned eframe. Only owner process registers. Conflict/unsupported states explicit; disable/rebind/exit unregisters, prior effective chord preserved if replacement fails. Repaint wakeup while minimized; native event requests command from task 2. This is not a new crate: no layers entry needed; if extraction becomes necessary, stop for plan update and own root Cargo.toml plus xtask/src/layers.rs registration before building it. TESTS: fake registration backend conflict/replace/rollback/drop, owner vs non-owner; settings validation/defaults/roundtrip. Actual manual smoke macOS/Windows/X11 from another foreground app, minimized main window, disable/rebind/exit. Wayland reports unsupported. Record each tested OS; no extrapolation. VERIFY: standing -p notescraft and engine; approved-platform compile probes and manual matrix; layers/tree. DO NOT: add dependency before explicit approval, handwritten unsafe FFI, global low-level key hooks, second listener, login daemon, automatically transfer owner.

Phase 4 — compact window

  • 4. Viewport, focus, submit and settings UX. OWNS: crates/ui-egui/src/capture/window.rs (new, first write), crates/ui-egui/src/capture/mod.rs, crates/ui-egui/src/shell/app.rs, crates/ui-egui/src/shell/app/window/commands.rs, crates/ui-egui/src/shell/app/window/frame.rs, crates/ui-egui/src/shell/hotkeys/commands.rs, crates/ui-egui/src/views/settings_view/categories/core_cards.rs, crates/ui-egui/src/text/features/quick_capture.rs (new), crates/ui-egui/src/text/features/mod.rs, crates/i18n/locales/en.toml (append ui.quick_capture), crates/ui-egui/tests/quick_capture.rs (new), apps/notescraft/src/main.rs (quit confirmation integration only). FILES TO OPEN: spec D1-D6, crates/ui-egui/src/shell/app/popout.rs, crates/ui-egui/src/shell/app/window/frame.rs, crates/ui-egui/src/shell/app/window/commands.rs, crates/ui-egui/src/views/settings_view/categories/core_cards.rs. GOAL: one themed native child viewport; consume coalesced engine request; focus/reopen preserves draft; text/target/title; keyboard submit/Esc/Discard; async result generation safety; note.capture sole writer. Settings includes explicit owner/chord/effective status. Pending draft joins existing quit confirmation. Use current craft-ui controls, no shared API change. TESTS: kittest focus and keys, repeated request/save, failed write, read-only, dirty Daily buffer/undo, close/reopen, discard, quit cancel; no draft content in settings/control status/logs; all text i18n. VERIFY: standing ui-egui + engine + desktop; i18n; snapshot PNGs read in Mocha/Latte, desktop and compact; actual foreground/minimized capture smoke from task 3. DO NOT: block painting, read clipboard, silently clear draft, hardcode labels, persist plaintext draft.

Phase 5 — acceptance and documentation

  • 5. Record measured platform coverage and final status. OWNS: specs/plugins-parity/global-quick-capture/validation.md (new, first write), specs/plugins-parity/global-quick-capture/spec.md, specs/plugins-parity/global-quick-capture/tasks.md, specs/plugins-parity/roadmap.md (38 only), ROADMAP.md, docs/ARCHITECTURE.md, docs/CODE-MAP.md (feature entries only). FILES TO OPEN: spec AC1-8 and open decisions, crates/ui-egui/tests/quick_capture.rs, specs/plugins-parity/roadmap.md. GOAL: acceptance-to-test mapping, owner approval record, actual platform/event-loop results, unsupported Wayland status, app-running-only/owner/draft-loss limits. Update command/path maps only after implementation passes. TESTS: manually verify two vault processes, native foreground test, conflict/rebind/exit and quit-with-draft; document exact platform/backend versions. Each AC has evidence or remains visibly blocked. VERIFY: standing final gates incl cargo xtask ci; links and task status agree. These commands are future implementation checks, not part of current docs run. DO NOT: claim unsupported backend works, remove approval gates without owner decision, add features or commit.