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.mdD1,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 notescraftand 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.