Phase/step checklist. See PLAN.md for full detail, SPEC.md for scope, ARCHITECTURE.md for design.
- 0.1 Create
copyboard/package +tests/tree; retirecopyboard.pysketch andmain.py. - 0.2 Configure
pyproject.toml(deps via uv, ruff, mypydisallow_untyped_defsincl. tests,project.scripts). - 0.3 Write project docs:
SPEC.md,ARCHITECTURE.md,TASKS.md. - 0.4 Write identical
CLAUDE.md/AGENTS.md/GEMINI.md. - 0.5
uv sync; confirmruff/mypy/pytestgreen on the skeleton.
- 1.1
domain/content.py—RawClipboardData,ImagePayload,ClipboardPayload. - 1.2
domain/clipping.py—ClippingABC +TextualClipping+ 7 kinds (text/url/path/image/command/json/markdown). - 1.3
domain/ports.py—Clock,ClipboardSource,ClipboardSink,ClippingVault. - 1.4
config.py(RetentionPolicy30 / 20 min,HotkeyConfigctrl+shift+h,AppConfig) +config_loading.py(readsconfig.json). - 1.5
domain/clippingclassifier.py—ClippingClassifier+ Url/Path/Json/Markdown/Command detectors. - 1.6
domain/clippinghistory.py—ClippingHistory. - 1.7 Tests: classifier (FakeVault), history count+time pruning (FakeClock), previews, config loading — 20 passing.
- 2.1
application/events.py— event types +ObserverRegistry+HistoryObserver. - 2.2
application/copyboardservice.py—CopyboardService. - 2.3
adapters/systemclock.py—SystemClock;adapters/tempdirvault.py—TempDirVault. - 2.4 Tests with fakes + a
TempDirVaulttemp-file test — 26 passing total.
- 3.1
adapters/qt/qtclipboard.py—QtClipboardSource(+ClipboardEchoGuard),QtClipboardSink; PNG-by-default, configurable image format. - 3.2 Manual check: copying produces the right clipping kinds (covered by Phase 5 E2E).
- 4.1
adapters/ui/clippingwidget.py— per-kind rendering + re-copy/delete. - 4.2
adapters/ui/mainwindow.py— list, subscribes to events,QTimerprune. - 4.3 GUI-thread observer marshaling (Qt signal).
- 5.1
adapters/ui/trayicon.py—TrayIcon(+ programmatic icon). - 5.2
adapters/pynputhotkeybinder.py—PynputHotkeyBinder(Ctrl+Shift+H) viaHotkeyBinder. - 5.3
__main__.py— composition root +main()(pynput→Qt queued-signal bridge). - 5.4 Headless boot smoke passed; interactive copy check is for the user on a real desktop.
- 6.1
README.mdwritten; docs + this checklist reconciled. - 6.2 Full
ruff/mypy/pytestgreen across src + tests (42 files, 34 tests). - 6.3 Backlog notes (below).
- 7.1 Add application-level stack state that prepares, consumes, and removes the exact clipping.
- 7.2 Add clipboard clearing and preserve echo suppression for the final item.
- 7.3 Observe Ctrl+V on Windows/Linux and Cmd+V on macOS after chord release.
- 7.4 Add the checkable tray toggle and GUI-thread signal wiring.
- 7.5 Cover LIFO behavior, platform shortcuts, clipboard clearing, and tray state with tests.
- 7.6 Add a synchronized viewer toggle and replace gradient styling with flat neutral boxes.
- Disk persistence (history surviving restart) — currently in-memory only.
- A web front-end reusing the pure core (the hexagonal seam makes it possible).
- A settings UI (config is edited directly in
config.json). - Image-size caps / thumbnail caching; de-duplication of consecutive identical clippings.
- Wayland global-hotkey support (pynput needs X11); macOS Accessibility onboarding.