Skip to content

Latest commit

 

History

History
61 lines (51 loc) · 3.89 KB

File metadata and controls

61 lines (51 loc) · 3.89 KB

Copyboard — Tasks

Phase/step checklist. See PLAN.md for full detail, SPEC.md for scope, ARCHITECTURE.md for design.

Phase 0 — Scaffolding, docs & tooling gate

  • 0.1 Create copyboard/ package + tests/ tree; retire copyboard.py sketch and main.py.
  • 0.2 Configure pyproject.toml (deps via uv, ruff, mypy disallow_untyped_defs incl. 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; confirm ruff / mypy / pytest green on the skeleton.

Phase 1 — Domain core (Qt-free, fully unit-tested)

  • 1.1 domain/content.pyRawClipboardData, ImagePayload, ClipboardPayload.
  • 1.2 domain/clipping.pyClipping ABC + TextualClipping + 7 kinds (text/url/path/image/command/json/markdown).
  • 1.3 domain/ports.pyClock, ClipboardSource, ClipboardSink, ClippingVault.
  • 1.4 config.py (RetentionPolicy 30 / 20 min, HotkeyConfig ctrl+shift+h, AppConfig) + config_loading.py (reads config.json).
  • 1.5 domain/clippingclassifier.pyClippingClassifier + Url/Path/Json/Markdown/Command detectors.
  • 1.6 domain/clippinghistory.pyClippingHistory.
  • 1.7 Tests: classifier (FakeVault), history count+time pruning (FakeClock), previews, config loading — 20 passing.

Phase 2 — Application service (Qt-free)

  • 2.1 application/events.py — event types + ObserverRegistry + HistoryObserver.
  • 2.2 application/copyboardservice.pyCopyboardService.
  • 2.3 adapters/systemclock.pySystemClock; adapters/tempdirvault.pyTempDirVault.
  • 2.4 Tests with fakes + a TempDirVault temp-file test — 26 passing total.

Phase 3 — Qt clipboard adapters

  • 3.1 adapters/qt/qtclipboard.pyQtClipboardSource (+ ClipboardEchoGuard), QtClipboardSink; PNG-by-default, configurable image format.
  • 3.2 Manual check: copying produces the right clipping kinds (covered by Phase 5 E2E).

Phase 4 — Qt viewer UI

  • 4.1 adapters/ui/clippingwidget.py — per-kind rendering + re-copy/delete.
  • 4.2 adapters/ui/mainwindow.py — list, subscribes to events, QTimer prune.
  • 4.3 GUI-thread observer marshaling (Qt signal).

Phase 5 — Tray, hotkey, entry point

  • 5.1 adapters/ui/trayicon.pyTrayIcon (+ programmatic icon).
  • 5.2 adapters/pynputhotkeybinder.pyPynputHotkeyBinder (Ctrl+Shift+H) via HotkeyBinder.
  • 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.

Phase 6 — Polish & final quality gate

  • 6.1 README.md written; docs + this checklist reconciled.
  • 6.2 Full ruff / mypy / pytest green across src + tests (42 files, 34 tests).
  • 6.3 Backlog notes (below).

Phase 7 — Stack paste mode (LIFO)

  • 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.

Backlog

  • 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.