From 960de4e2380ab4b2a6786c0a3c1cd0fffc603997 Mon Sep 17 00:00:00 2001 From: "Morten R. N." Date: Sun, 2 Aug 2026 21:26:51 +0200 Subject: [PATCH] chore: remove add-dark-mode change and stale add-live-kanban tasks.md - Remove the empty add-dark-mode change (never developed beyond a scaffold; no artifacts, no tasks). - Remove the leftover openspec/changes/add-live-kanban/tasks.md that the archive commit missed (the change is fully archived under openspec/changes/archive/2026-08-02-add-live-kanban/). No active changes remain; openspec doctor healthy; both main specs (openspec-tui, release-pipeline) validate. --- openspec/changes/add-dark-mode/.openspec.yaml | 2 - openspec/changes/add-live-kanban/tasks.md | 38 ------------------- 2 files changed, 40 deletions(-) delete mode 100644 openspec/changes/add-dark-mode/.openspec.yaml delete mode 100644 openspec/changes/add-live-kanban/tasks.md diff --git a/openspec/changes/add-dark-mode/.openspec.yaml b/openspec/changes/add-dark-mode/.openspec.yaml deleted file mode 100644 index d658936..0000000 --- a/openspec/changes/add-dark-mode/.openspec.yaml +++ /dev/null @@ -1,2 +0,0 @@ -schema: spec-driven -created: 2026-08-02 diff --git a/openspec/changes/add-live-kanban/tasks.md b/openspec/changes/add-live-kanban/tasks.md deleted file mode 100644 index 2fe5a36..0000000 --- a/openspec/changes/add-live-kanban/tasks.md +++ /dev/null @@ -1,38 +0,0 @@ -## 1. Change probe in client - -- [x] 1.1 Add `OpenSpecClient.has_changed() -> bool` that stats the mtimes of `/openspec/changes/` and each change's `tasks.md` (and the specs dir for dashboard), compares against a cached snapshot kept on the client, and returns whether any mtime advanced; updates the cache when invoked -- [x] 1.2 Add a `reset_change_cache()` helper (or reset on `reload()`) so a forced refresh re-baselines the cache and doesn't immediately re-fire - -## 2. Live-refresh state on the app - -- [x] 2.1 Add ephemeral `live_refresh: bool` (default `True`) and the mtime cache to `OpenSpecUIApp`; do not persist either -- [x] 2.2 Add a helper to detect "foreground busy": app is in `suspend()` or a modal/non-`reload`-able screen is atop the stack -- [x] 2.3 Add `toggle_live_refresh()` and expose current state for screens to read - -## 3. Polling on kanban - -- [x] 3.1 In `KanbanScreen`, start a `set_interval(~1s)` timer on mount that, when `live_refresh` and not foreground-busy, calls `client.has_changed()` and only calls `reload()` when it returns true -- [x] 3.2 Skip ticks when the screen is not the active/top screen or when foreground-busy -- [x] 3.3 Show `● live` / `○ paused` in the kanban title; update it on toggle and on reload -- [x] 3.4 Bind `p` to toggle live refresh; keep `r` as a forced immediate reload that works in both live and paused states - -## 4. Polling on dashboard - -- [x] 4.1 Mirror the timer logic on `DashboardScreen`, gating `list_changes()` + `list_specs()` behind `has_changed()` -- [x] 4.2 Skip ticks when foreground-busy or not the top screen -- [x] 4.3 Show the live/paused indicator in the dashboard title; bind `p` and keep `r` - -## 5. Editor/modal race safety - -- [x] 5.1 Confirm the foreground-busy check suspends polling for the full `$EDITOR` session in `DetailScreen.action_edit` (via `app.suspend()`) and resumes only after the editor exits — *implemented: `_in_editor` flag set in a try/finally around `app.suspend()`; verified `foreground_busy()` is True during and False after* -- [x] 5.2 Confirm modal screens (confirm, new-change, palette) suppress polling ticks while atop the stack — *verified via Textual `run_test()`: opening the command palette makes the dashboard non-top, and its `_tick` early-returns without probing (the `self is not self.app.screen` guard)* - -## 6. Verification - -- [x] 6.1 Manual: open kanban, flip a task checkbox in another window, confirm the card moves to the matching column within ~1s with no keypress — *verified via `run_test()`: touching a change's `tasks.md` then calling `_tick()` triggers a reload that re-populates the kanban columns* -- [x] 6.2 Manual: open dashboard, add/remove a change externally, confirm counts and listings update within the polling interval — *verified via `run_test()`: external `tasks.md` mtime bump → dashboard `_tick()` reloads and re-populates `_changes`* -- [x] 6.3 Manual: press `p` and confirm the indicator switches to paused and ticks stop; press `p` again to resume — *verified: `p` flips `live_refresh` True↔False and the title glyph `● live`↔`○ paused`; `_tick` early-returns when paused* -- [x] 6.4 Manual: while paused, press `r` and confirm an immediate forced reload — *verified: `r` calls `reload()` + `reset_change_cache()` and works in both live and paused states* -- [x] 6.5 Manual: invoke `e` to edit an artifact and confirm no poll fires mid-edit and the view reloads cleanly after the editor exits — *verified: `_in_editor` flag + the "am I top" guard suppress polling during the suspended `$EDITOR` session; flag clears in `finally`* -- [x] 6.6 Run `openspec validate add-live-kanban` and resolve any reported issues — *valid* -- [x] 6.7 Commit on a `feat/live-kanban` branch with Conventional Commit messages and open a PR referencing the change — *PR #8, CI build-check passed*