T-S8GC-profile-kinds-pomodoro-and-tracking
State: planning/draft · Impact: high · Complexity: medium
Give tracking its own profiles. Today one profile carries a work context and a
pomodoro recipe, Track mode ignores the recipe, and both pickers show every
profile. A kind on the profile gives each mode a short form and a filtered
picker without a second entity. Decided in
D-W3KP-pumice-profile-kinds-and-settings-layout.
| Location | Role today |
|---|---|
apps/pumice/crates/pumice/src/types.rs | TimerProfile with recipe fields, default_tags, notes_template; no kind |
apps/pumice/src-tauri/src/schema/mod.rs | ProfileInput mirrors it |
apps/pumice/crates/pumice-config/src/defaults.rs | built-in Basic Pomodoro |
apps/pumice/crates/pumice-config/src/journal.rs | show_after_focus only |
apps/pumice/src-nuxt/app/components/TimerProfileForm.vue | one form; the recipe section says “ignored while tracking” |
apps/pumice/src-nuxt/app/components/TimerTypeList.vue | one list |
apps/pumice/src-nuxt/app/components/FocusViewBody.vue | picker shows every profile in both modes |
apps/pumice/src-nuxt/app/components/SettingsJournal.vue | one switch, “Show Journal after Focus” |
Proposed
Section titled “Proposed”TimerProfile.kind: pomodoro | track, #[serde(default)] to pomodoro, plus
properties: Vec<PropertyRow> (key, value, as_text, enabled), the
same row shape as the vault’s. A
built-in General tracking profile is appended at upgrade when none exists.
The Profiles tab shows two lists; the tracking form has name, tags, notes
template and property rows only. The focus view’s picker shows the
profiles of the persisted timer mode. JournalConfig.show_after_tracked,
default true, governs the journal after a tracked End; the Journal tab has
two switches.
Approach
Section titled “Approach”- Add
ProfileKindtopumicetypes and reuse the vault’sPropertyRow;kindandpropertiesonTimerProfileandProfileInput; regenerate ops. - Config upgrade: default kind, append
General(track) once; fixture. show_after_trackedinJournalConfig; the tracked End path reads it.TimerTypeListrenders two sections;TimerProfileFormtakeskindand hides the recipe fortrack; add the property rows table.FocusViewBodyfiltersprofilesbytimerMode;start_trackedrefuses a pomodoro profile id and vice versa.SettingsJournalsecond switch. Stories and captures for every changed surface.
| Area | Note |
|---|---|
apps/pumice/crates/pumice/src/types.rs | ProfileKind, two fields on TimerProfile |
apps/pumice/src-tauri/src/schema/mod.rs | ProfileInput fields |
apps/pumice/crates/pumice-config/src/defaults.rs | built-in General tracking profile |
apps/pumice/crates/pumice-config/src/journal.rs | show_after_tracked |
apps/pumice/src-tauri/tests/config_upgrades.rs | upgrade fixture with kind-less profiles |
apps/pumice/src-nuxt/app/components/TimerProfileForm.vue | kind-aware form, property rows table |
apps/pumice/src-nuxt/app/components/TimerTypeList.vue | two lists |
apps/pumice/src-nuxt/app/components/SettingsProfiles.vue | section titles |
apps/pumice/src-nuxt/app/components/FocusViewBody.vue | picker filtered by mode |
apps/pumice/src-nuxt/app/components/SettingsJournal.vue | second switch |
Acceptance criteria
Section titled “Acceptance criteria”- An old config with kind-less profiles loads; every profile is
pomodoroand aGeneraltracking profile exists. - In Track mode the picker lists tracking profiles only; in Pomodoro mode, pomodoro profiles only.
- The tracking profile form shows no recipe fields.
- A tracked End with “Show journal after a tracked End” off writes the row without opening the journal.
-
moon run pumice:codegen-drift,pumice:check,pumice:testgreen; screenshots committed and embedded in a PR comment.
Out of scope
Section titled “Out of scope”- Per-profile vault templates or folders.
- Splitting contexts and recipes into two entities.