Refactor UI lifecycle functions into AppLifecycle with persistent ownership

Replaced free lifecycle functions with an AppLifecycle class in src/tunacode/ui/lifecycle.py.

tools-only Updated 7 repo stars

File contents

Refactor UI lifecycle functions into AppLifecycle with persistent ownership

Summary

Replaced free lifecycle functions with an AppLifecycle class in src/tunacode/ui/lifecycle.py.

Updated TextualReplApp to persist a single lifecycle instance (self._lifecycle) and reuse that instance across on_mount and on_unmount.

This removes function-level indirection and makes REPL startup idempotent through _repl_started inside lifecycle state.

Files changed

  • src/tunacode/ui/PLAN.md
  • src/tunacode/ui/lifecycle.py
  • src/tunacode/ui/app.py

Behavior notes

  • Theme and session metadata initialization stay in mount flow.
  • Setup dismissal still proceeds into REPL startup.
  • Slopgotchi timer ownership remains on TextualReplApp._slopgotchi_timer, with lifecycle start/stop helpers managing it.
  • on_unmount now fails loudly if lifecycle was never initialized.

Validation

  • uv run ruff check src/tunacode/ui/app.py src/tunacode/ui/lifecycle.py ✅
  • uv run pytest tests/unit/ui/test_supported_themes.py -q ✅
  • uv run ruff check . ✅

tools-only/X-Skills/tree/main/development/2492-2026-02-20-app-lifecycle-class-refactor_1b2690be commit 463edc3463

Frequently asked questions

npx skillmds@latest add tools-only/refactor-ui-lifecycle-functions-into-applifecycle-with