jotter-app 3.8.1.dev0__tar.gz → 3.8.2.dev0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (319) hide show
  1. {jotter_app-3.8.1.dev0/src/jotter_app.egg-info → jotter_app-3.8.2.dev0}/PKG-INFO +1 -1
  2. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/components/ui/TagInput.vue +1 -3
  3. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/utils/tagUtils.ts +2 -9
  4. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/src/jotter/_version.py +3 -3
  5. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/src/jotter/features/buckets/repo.py +6 -3
  6. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/src/jotter/features/projects/manifest.py +20 -14
  7. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/src/jotter/features/projects/repo.py +4 -1
  8. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/src/jotter/features/sync/service.py +0 -1
  9. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/src/jotter/features/tasks/disk_repo.py +5 -4
  10. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0/src/jotter_app.egg-info}/PKG-INFO +1 -1
  11. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/src/jotter_app.egg-info/scm_version.json +2 -2
  12. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/tests/test_bucket_service.py +5 -1
  13. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/tests/test_sync_service.py +0 -1
  14. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/.codecov.yml +0 -0
  15. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/.github/dependabot.yml +0 -0
  16. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/.github/workflows/ci.yml +0 -0
  17. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/.github/workflows/pages.yml +0 -0
  18. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/.github/workflows/release.yml +0 -0
  19. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/.gitignore +0 -0
  20. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/CONTRIBUTING.md +0 -0
  21. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/LICENSE.md +0 -0
  22. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/README.md +0 -0
  23. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/docs/.vitepress/config.mts +0 -0
  24. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/docs/assets/icon.ico +0 -0
  25. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/docs/assets/icon.png +0 -0
  26. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/docs/assets/jotter.sample.yaml +0 -0
  27. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/docs/assets/screenshot.png +0 -0
  28. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/docs/de/developer/api.md +0 -0
  29. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/docs/de/developer/architecture.md +0 -0
  30. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/docs/de/index.md +0 -0
  31. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/docs/de/installation/development.md +0 -0
  32. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/docs/de/installation/precompiled.md +0 -0
  33. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/docs/de/user/configuration.md +0 -0
  34. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/docs/de/user/format-spec.md +0 -0
  35. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/docs/de/user/git-sync.md +0 -0
  36. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/docs/de/user/import-export.md +0 -0
  37. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/docs/de/user/obsidian.md +0 -0
  38. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/docs/de/user/pomodoro.md +0 -0
  39. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/docs/de/user/postponing.md +0 -0
  40. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/docs/de/user/safety.md +0 -0
  41. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/docs/de/user/searching-filtering.md +0 -0
  42. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/docs/de/user/shortcuts.md +0 -0
  43. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/docs/de/user/time-blocking.md +0 -0
  44. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/docs/de/user/voice-dictation.md +0 -0
  45. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/docs/developer/adr/0001-immutable-bucket-slugs.md +0 -0
  46. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/docs/developer/adr/0002-decline-recurring-tasks.md +0 -0
  47. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/docs/developer/api.md +0 -0
  48. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/docs/developer/architecture.md +0 -0
  49. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/docs/index.md +0 -0
  50. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/docs/installation/development.md +0 -0
  51. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/docs/installation/precompiled.md +0 -0
  52. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/docs/public/logo.png +0 -0
  53. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/docs/user/configuration.md +0 -0
  54. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/docs/user/format-spec.md +0 -0
  55. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/docs/user/git-sync.md +0 -0
  56. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/docs/user/import-export.md +0 -0
  57. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/docs/user/obsidian.md +0 -0
  58. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/docs/user/pomodoro.md +0 -0
  59. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/docs/user/postponing.md +0 -0
  60. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/docs/user/safety.md +0 -0
  61. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/docs/user/searching-filtering.md +0 -0
  62. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/docs/user/shortcuts.md +0 -0
  63. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/docs/user/time-blocking.md +0 -0
  64. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/docs/user/voice-dictation.md +0 -0
  65. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/.gitignore +0 -0
  66. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/.prettierrc +0 -0
  67. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/README.md +0 -0
  68. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/eslint.config.js +0 -0
  69. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/index.html +0 -0
  70. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/package-lock.json +0 -0
  71. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/package.json +0 -0
  72. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/playwright.config.ts +0 -0
  73. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/public/favicon.svg +0 -0
  74. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/public/manifest.json +0 -0
  75. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/public/pwa-192.png +0 -0
  76. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/public/pwa-512.png +0 -0
  77. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/public/sw.js +0 -0
  78. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/App.vue +0 -0
  79. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/__tests__/api.spec.ts +0 -0
  80. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/__tests__/factories.ts +0 -0
  81. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/api.demo.ts +0 -0
  82. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/api.ts +0 -0
  83. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/components/layout/MainLayout.vue +0 -0
  84. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/components/layout/NavigationBar.vue +0 -0
  85. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/components/layout/ProjectLayout.vue +0 -0
  86. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/components/layout/ProjectSidebar.vue +0 -0
  87. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/components/layout/TimeblockSidebar.vue +0 -0
  88. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/components/layout/TimelineLayout.vue +0 -0
  89. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/components/layout/__tests__/NavigationBar.spec.ts +0 -0
  90. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/components/layout/__tests__/ProjectSidebar.spec.ts +0 -0
  91. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/components/layout/__tests__/TimeblockSidebar.spec.ts +0 -0
  92. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/components/modals/ColumnEditModal.vue +0 -0
  93. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/components/modals/FilterModal.vue +0 -0
  94. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/components/modals/ModalRegistry.vue +0 -0
  95. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/components/modals/MoveTasksConfirmModal.vue +0 -0
  96. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/components/modals/ProjectEditModal.vue +0 -0
  97. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/components/modals/TaskCreateModal.vue +0 -0
  98. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/components/modals/TaskDetailModal.vue +0 -0
  99. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/components/modals/TaskImportModal.vue +0 -0
  100. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/components/modals/TimeMachineModal.vue +0 -0
  101. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/components/modals/TimeblockEditModal.vue +0 -0
  102. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/components/modals/__tests__/ColumnEditModal.spec.ts +0 -0
  103. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/components/modals/__tests__/FilterModal.spec.ts +0 -0
  104. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/components/modals/__tests__/MoveTasksConfirmModal.spec.ts +0 -0
  105. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/components/modals/__tests__/ProjectEditModal.spec.ts +0 -0
  106. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/components/modals/__tests__/TaskCreateModal.spec.ts +0 -0
  107. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/components/modals/__tests__/TaskDetailModal.spec.ts +0 -0
  108. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/components/modals/__tests__/TimeMachineModal.spec.ts +0 -0
  109. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/components/modals/__tests__/TimeblockEditModal.spec.ts +0 -0
  110. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/components/ui/BaseModal.vue +0 -0
  111. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/components/ui/BulkActionBar.vue +0 -0
  112. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/components/ui/GenericColumn.vue +0 -0
  113. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/components/ui/GlobalDialog.vue +0 -0
  114. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/components/ui/KeywordHighlightInput.vue +0 -0
  115. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/components/ui/MarkdownEditor.vue +0 -0
  116. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/components/ui/PomodoroBar.vue +0 -0
  117. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/components/ui/TaskCard.vue +0 -0
  118. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/components/ui/ToastContainer.vue +0 -0
  119. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/components/ui/__tests__/BulkActionBar.spec.ts +0 -0
  120. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/components/ui/__tests__/PomodoroBar.spec.ts +0 -0
  121. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/components/ui/__tests__/TagInput.spec.ts +0 -0
  122. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/components/ui/__tests__/TaskCard.spec.ts +0 -0
  123. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/components/ui/__tests__/ToastContainer.spec.ts +0 -0
  124. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/components/views/BoardView.vue +0 -0
  125. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/components/views/HomeView.vue +0 -0
  126. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/components/views/ListView.vue +0 -0
  127. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/components/views/MatrixView.vue +0 -0
  128. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/components/views/ReviewView.vue +0 -0
  129. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/components/views/SettingsView.vue +0 -0
  130. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/components/views/TagView.vue +0 -0
  131. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/components/views/TimeView.vue +0 -0
  132. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/components/views/TriageView.vue +0 -0
  133. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/components/views/__tests__/ReviewView.spec.ts +0 -0
  134. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/components/views/__tests__/TriageView.spec.ts +0 -0
  135. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/composables/__tests__/useBoardNavigation.spec.ts +0 -0
  136. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/composables/__tests__/useDialog.spec.ts +0 -0
  137. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/composables/__tests__/useI18n.spec.ts +0 -0
  138. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/composables/__tests__/useKeyboardShortcuts.spec.ts +0 -0
  139. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/composables/__tests__/useSpeechRecognition.spec.ts +0 -0
  140. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/composables/__tests__/useTaskMutations.spec.ts +0 -0
  141. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/composables/useBoardNavigation.ts +0 -0
  142. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/composables/useBuckets.ts +0 -0
  143. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/composables/useDialog.ts +0 -0
  144. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/composables/useDragSelect.ts +0 -0
  145. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/composables/useI18n.ts +0 -0
  146. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/composables/useKeyboardShortcuts.ts +0 -0
  147. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/composables/useProjects.ts +0 -0
  148. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/composables/useSpeechRecognition.ts +0 -0
  149. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/composables/useTaskAutocomplete.ts +0 -0
  150. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/composables/useTaskExport.ts +0 -0
  151. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/composables/useTaskFilters.ts +0 -0
  152. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/composables/useTaskMutations.ts +0 -0
  153. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/composables/useTaskSelection.ts +0 -0
  154. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/composables/useToast.ts +0 -0
  155. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/features/task-editor/components/TaskAttachments.vue +0 -0
  156. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/features/task-editor/components/TaskChecklist.vue +0 -0
  157. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/features/task-editor/components/TaskEditFields.vue +0 -0
  158. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/features/task-editor/components/TaskImageLightbox.vue +0 -0
  159. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/features/task-editor/composables/useTaskEditor.ts +0 -0
  160. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/features/task-import/components/StepColumnMapper.vue +0 -0
  161. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/features/task-import/components/StepProgress.vue +0 -0
  162. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/features/task-import/components/StepRowPreview.vue +0 -0
  163. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/features/task-import/components/StepSummary.vue +0 -0
  164. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/features/task-import/components/StepUpload.vue +0 -0
  165. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/features/task-import/composables/__tests__/useImportWizard.spec.ts +0 -0
  166. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/features/task-import/composables/useImportWizard.ts +0 -0
  167. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/features/task-triage/components/TriageCard.vue +0 -0
  168. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/locales/de.ts +0 -0
  169. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/locales/en.ts +0 -0
  170. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/main.ts +0 -0
  171. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/router.ts +0 -0
  172. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/stores/__tests__/modal.spec.ts +0 -0
  173. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/stores/__tests__/pomodoro.spec.ts +0 -0
  174. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/stores/__tests__/selection.spec.ts +0 -0
  175. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/stores/__tests__/settings.spec.ts +0 -0
  176. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/stores/__tests__/timeblock.spec.ts +0 -0
  177. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/stores/__tests__/toast.spec.ts +0 -0
  178. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/stores/__tests__/ui.spec.ts +0 -0
  179. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/stores/modal.ts +0 -0
  180. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/stores/pomodoro.ts +0 -0
  181. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/stores/project.ts +0 -0
  182. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/stores/selection.ts +0 -0
  183. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/stores/settings.ts +0 -0
  184. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/stores/timeblock.ts +0 -0
  185. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/stores/toast.ts +0 -0
  186. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/stores/ui.ts +0 -0
  187. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/style.css +0 -0
  188. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/test-setup.ts +0 -0
  189. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/types.ts +0 -0
  190. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/utils/__tests__/dsl.spec.ts +0 -0
  191. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/utils/__tests__/effects.spec.ts +0 -0
  192. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/utils/__tests__/markdown.spec.ts +0 -0
  193. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/utils/__tests__/tagUtils.spec.ts +0 -0
  194. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/utils/__tests__/titleParser.spec.ts +0 -0
  195. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/utils/constants.ts +0 -0
  196. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/utils/dsl.ts +0 -0
  197. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/utils/effects.ts +0 -0
  198. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/utils/markdown.ts +0 -0
  199. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/utils/sound.ts +0 -0
  200. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/src/utils/titleParser.ts +0 -0
  201. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/tests/e2e/kanban.spec.ts +0 -0
  202. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/tsconfig.app.json +0 -0
  203. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/tsconfig.json +0 -0
  204. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/tsconfig.node.json +0 -0
  205. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/frontend/vite.config.ts +0 -0
  206. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/jotter.spec +0 -0
  207. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/package-lock.json +0 -0
  208. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/package.json +0 -0
  209. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/pyproject.toml +0 -0
  210. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/run.py +0 -0
  211. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/scripts/combine-coverage.js +0 -0
  212. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/scripts/loc_history.py +0 -0
  213. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/scripts/plot_loc.py +0 -0
  214. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/setup.cfg +0 -0
  215. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/src/jotter/__init__.py +0 -0
  216. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/src/jotter/__main__.py +0 -0
  217. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/src/jotter/app.py +0 -0
  218. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/src/jotter/config.py +0 -0
  219. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/src/jotter/dist/assets/BoardView-Bzv-K-Ph.js +0 -0
  220. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/src/jotter/dist/assets/GenericColumn-1-2wmdHw.js +0 -0
  221. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/src/jotter/dist/assets/GenericColumn-o9T_l6dT.css +0 -0
  222. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/src/jotter/dist/assets/HomeView-DhflHyXt.css +0 -0
  223. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/src/jotter/dist/assets/HomeView-DzrYr7dK.js +0 -0
  224. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/src/jotter/dist/assets/ListView-ffjP4j7Q.js +0 -0
  225. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/src/jotter/dist/assets/MarkdownEditor-BnBNucg1.js +0 -0
  226. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/src/jotter/dist/assets/MarkdownEditor-Dw1c_PRw.css +0 -0
  227. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/src/jotter/dist/assets/MatrixView-KELVqO_3.css +0 -0
  228. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/src/jotter/dist/assets/MatrixView-_HLDMvmI.js +0 -0
  229. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/src/jotter/dist/assets/ReviewView-gn5qGoSC.js +0 -0
  230. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/src/jotter/dist/assets/SettingsView-CWHtcai7.js +0 -0
  231. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/src/jotter/dist/assets/TagView-YeoZ5bkd.js +0 -0
  232. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/src/jotter/dist/assets/TaskCard-DkCRPRZJ.css +0 -0
  233. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/src/jotter/dist/assets/TaskCard-_hBOxwKl.js +0 -0
  234. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/src/jotter/dist/assets/TaskDetailModal-DJd3Xdbe.js +0 -0
  235. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/src/jotter/dist/assets/TaskDetailModal-DM7nQldC.css +0 -0
  236. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/src/jotter/dist/assets/TimeView-B2BEDiSC.js +0 -0
  237. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/src/jotter/dist/assets/TriageView-BjTRMMbr.js +0 -0
  238. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/src/jotter/dist/assets/TriageView-CFurWdNn.css +0 -0
  239. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/src/jotter/dist/assets/chevron-down-BXro-pNT.js +0 -0
  240. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/src/jotter/dist/assets/dist-CUD5qJpD.js +0 -0
  241. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/src/jotter/dist/assets/index-Bk6K6mur.js +0 -0
  242. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/src/jotter/dist/assets/index-QF5vFcj-.css +0 -0
  243. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/src/jotter/dist/assets/inter-cyrillic-ext-wght-italic-B5xAaiFk.woff2 +0 -0
  244. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/src/jotter/dist/assets/inter-cyrillic-ext-wght-normal-BOeWTOD4.woff2 +0 -0
  245. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/src/jotter/dist/assets/inter-cyrillic-wght-italic-DzZdc28x.woff2 +0 -0
  246. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/src/jotter/dist/assets/inter-cyrillic-wght-normal-DqGufNeO.woff2 +0 -0
  247. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/src/jotter/dist/assets/inter-greek-ext-wght-italic-DcOpz6Lw.woff2 +0 -0
  248. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/src/jotter/dist/assets/inter-greek-ext-wght-normal-DlzME5K_.woff2 +0 -0
  249. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/src/jotter/dist/assets/inter-greek-wght-italic-CILZdfAp.woff2 +0 -0
  250. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/src/jotter/dist/assets/inter-greek-wght-normal-CkhJZR-_.woff2 +0 -0
  251. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/src/jotter/dist/assets/inter-latin-ext-wght-italic-0pjOp8NU.woff2 +0 -0
  252. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/src/jotter/dist/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2 +0 -0
  253. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/src/jotter/dist/assets/inter-latin-wght-italic-DpCbqKDY.woff2 +0 -0
  254. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/src/jotter/dist/assets/inter-latin-wght-normal-Dx4kXJAl.woff2 +0 -0
  255. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/src/jotter/dist/assets/inter-vietnamese-wght-italic-K3WlGtc8.woff2 +0 -0
  256. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/src/jotter/dist/assets/inter-vietnamese-wght-normal-CBcvBZtf.woff2 +0 -0
  257. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/src/jotter/dist/assets/marked.esm-HaWzKJJ6.js +0 -0
  258. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/src/jotter/dist/assets/paperclip-DIkWl2JD.js +0 -0
  259. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/src/jotter/dist/assets/useBuckets-BDGwDWwv.js +0 -0
  260. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/src/jotter/dist/assets/useTaskMutations-CuFjiNvT.js +0 -0
  261. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/src/jotter/dist/assets/useToast-FPmyjTCe.js +0 -0
  262. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/src/jotter/dist/assets/xlsx-CsRylhoj.js +0 -0
  263. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/src/jotter/dist/favicon.svg +0 -0
  264. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/src/jotter/dist/index.html +0 -0
  265. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/src/jotter/dist/manifest.json +0 -0
  266. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/src/jotter/dist/pwa-192.png +0 -0
  267. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/src/jotter/dist/pwa-512.png +0 -0
  268. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/src/jotter/dist/sw.js +0 -0
  269. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/src/jotter/features/buckets/__init__.py +0 -0
  270. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/src/jotter/features/buckets/domain.py +0 -0
  271. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/src/jotter/features/buckets/router.py +0 -0
  272. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/src/jotter/features/buckets/schemas.py +0 -0
  273. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/src/jotter/features/buckets/service.py +0 -0
  274. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/src/jotter/features/projects/__init__.py +0 -0
  275. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/src/jotter/features/projects/domain.py +0 -0
  276. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/src/jotter/features/projects/router.py +0 -0
  277. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/src/jotter/features/projects/schemas.py +0 -0
  278. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/src/jotter/features/projects/service.py +0 -0
  279. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/src/jotter/features/settings/__init__.py +0 -0
  280. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/src/jotter/features/settings/router.py +0 -0
  281. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/src/jotter/features/settings/schemas.py +0 -0
  282. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/src/jotter/features/settings/service.py +0 -0
  283. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/src/jotter/features/sync/__init__.py +0 -0
  284. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/src/jotter/features/sync/git_adapter.py +0 -0
  285. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/src/jotter/features/sync/router.py +0 -0
  286. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/src/jotter/features/tasks/__init__.py +0 -0
  287. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/src/jotter/features/tasks/domain.py +0 -0
  288. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/src/jotter/features/tasks/router.py +0 -0
  289. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/src/jotter/features/tasks/schemas.py +0 -0
  290. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/src/jotter/features/tasks/service.py +0 -0
  291. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/src/jotter/features/tasks/sqlite_repo.py +0 -0
  292. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/src/jotter/features/timeblock/__init__.py +0 -0
  293. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/src/jotter/features/timeblock/repo.py +0 -0
  294. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/src/jotter/features/timeblock/router.py +0 -0
  295. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/src/jotter/features/timeblock/schemas.py +0 -0
  296. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/src/jotter/features/timeblock/service.py +0 -0
  297. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/src/jotter/main.py +0 -0
  298. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/src/jotter/mcp_server.py +0 -0
  299. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/src/jotter/shared/__init__.py +0 -0
  300. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/src/jotter/shared/db.py +0 -0
  301. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/src/jotter/shared/deps.py +0 -0
  302. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/src/jotter/shared/exceptions.py +0 -0
  303. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/src/jotter/shared/slug.py +0 -0
  304. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/src/jotter/shared/ulid.py +0 -0
  305. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/src/jotter/shared/value_objects.py +0 -0
  306. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/src/jotter_app.egg-info/SOURCES.txt +0 -0
  307. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/src/jotter_app.egg-info/dependency_links.txt +0 -0
  308. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/src/jotter_app.egg-info/entry_points.txt +0 -0
  309. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/src/jotter_app.egg-info/requires.txt +0 -0
  310. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/src/jotter_app.egg-info/scm_file_list.json +0 -0
  311. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/src/jotter_app.egg-info/top_level.txt +0 -0
  312. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/tests/conftest.py +0 -0
  313. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/tests/test_api.py +0 -0
  314. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/tests/test_config.py +0 -0
  315. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/tests/test_domain.py +0 -0
  316. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/tests/test_git_service.py +0 -0
  317. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/tests/test_mcp_server.py +0 -0
  318. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/tests/test_task_service.py +0 -0
  319. {jotter_app-3.8.1.dev0 → jotter_app-3.8.2.dev0}/tests/test_timeblocks.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: jotter-app
3
- Version: 3.8.1.dev0
3
+ Version: 3.8.2.dev0
4
4
  Summary: Local-first Markdown Kanban Board web application
5
5
  Author: Simon
6
6
  License: Apache-2.0
@@ -60,9 +60,7 @@ const currentTagsSet = computed(() => {
60
60
  // Suggestions list
61
61
  const tagSuggestions = computed(() => {
62
62
  const query = activeTagQuery.value;
63
- const baseList = props.suggestionsOverride
64
- ? props.suggestionsOverride.map(sanitizeTag).filter(Boolean)
65
- : existingTags.value;
63
+ const baseList = props.suggestionsOverride ? props.suggestionsOverride.map(sanitizeTag).filter(Boolean) : existingTags.value;
66
64
  return baseList.filter((tag) => {
67
65
  const normalizedTag = tag.toLowerCase();
68
66
  if (currentTagsSet.value.has(normalizedTag)) return false;
@@ -14,12 +14,7 @@
14
14
  */
15
15
  export function sanitizeTag(tag: string | null | undefined): string {
16
16
  if (!tag) return '';
17
- return String(tag)
18
- .trim()
19
- .replace(/^#+/, '')
20
- .replace(/#/g, '')
21
- .replace(/\s+/g, '-')
22
- .toLowerCase();
17
+ return String(tag).trim().replace(/^#+/, '').replace(/#/g, '').replace(/\s+/g, '-').toLowerCase();
23
18
  }
24
19
 
25
20
  /**
@@ -29,9 +24,7 @@ export function sanitizeTag(tag: string | null | undefined): string {
29
24
  export function sanitizeTags(tagsInput: string | string[] | null | undefined): string[] {
30
25
  if (!tagsInput) return [];
31
26
 
32
- const rawTags = Array.isArray(tagsInput)
33
- ? tagsInput
34
- : String(tagsInput).split(/[,;|\n]+/);
27
+ const rawTags = Array.isArray(tagsInput) ? tagsInput : String(tagsInput).split(/[,;|\n]+/);
35
28
 
36
29
  const resultSet = new Set<string>();
37
30
  for (const raw of rawTags) {
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
18
18
  commit_id: str | None
19
19
  __commit_id__: str | None
20
20
 
21
- __version__ = version = '3.8.1.dev0'
22
- __version_tuple__ = version_tuple = (3, 8, 1, 'dev0')
21
+ __version__ = version = '3.8.2.dev0'
22
+ __version_tuple__ = version_tuple = (3, 8, 2, 'dev0')
23
23
 
24
- __commit_id__ = commit_id = 'g23eebde2b'
24
+ __commit_id__ = commit_id = 'gcb93b6334'
@@ -1,6 +1,5 @@
1
1
  """Repository for managing bucket columns on disk (index.md / buckets.json) and SQLite."""
2
2
 
3
- import json
4
3
  import sqlite3
5
4
  from pathlib import Path
6
5
  from typing import Any
@@ -149,7 +148,9 @@ class BucketRepository:
149
148
  project = Project(
150
149
  id=row["id"],
151
150
  name=row["title"],
152
- description=row["description"] if "description" in row.keys() and row["description"] is not None else "",
151
+ description=row["description"]
152
+ if "description" in row.keys() and row["description"] is not None
153
+ else "",
153
154
  git_remote=row["git_remote"],
154
155
  done_clean_period=row["done_clean_period"],
155
156
  created_at=row["created_at"],
@@ -213,7 +214,9 @@ class BucketRepository:
213
214
  project = Project(
214
215
  id=row["id"],
215
216
  name=row["title"],
216
- description=row["description"] if "description" in row.keys() and row["description"] is not None else "",
217
+ description=row["description"]
218
+ if "description" in row.keys() and row["description"] is not None
219
+ else "",
217
220
  git_remote=row["git_remote"],
218
221
  done_clean_period=row["done_clean_period"],
219
222
  created_at=row["created_at"],
@@ -45,7 +45,6 @@ def read_project_manifest(
45
45
  pass
46
46
 
47
47
  fm_data: dict[str, Any] = {}
48
- body = ""
49
48
 
50
49
  if index_file.is_file():
51
50
  content = index_file.read_text(encoding="utf-8")
@@ -58,31 +57,36 @@ def read_project_manifest(
58
57
  fm_data = loaded
59
58
  except Exception:
60
59
  pass
61
- body = parts[2].lstrip("\r\n")
62
- else:
63
- body = content
64
- else:
65
- body = content
66
60
 
67
61
  # Resolve project fields (manifest index.md -> legacy projects.json -> defaults)
68
- proj_id = str(fm_data.get("id") or (legacy_data.get("id") if legacy_data else None) or fallback_id).strip() or fallback_id
62
+ proj_id = (
63
+ str(fm_data.get("id") or (legacy_data.get("id") if legacy_data else None) or fallback_id).strip() or fallback_id
64
+ )
69
65
  title = str(
70
66
  fm_data.get("title")
71
67
  or fm_data.get("name")
72
68
  or (legacy_data.get("title") or legacy_data.get("name") if legacy_data else None)
73
69
  or proj_id.capitalize()
74
70
  ).strip()
75
- description = str(fm_data.get("description") or (legacy_data.get("description") if legacy_data else "") or "").strip()
76
- git_remote = fm_data.get("git_remote") or fm_data.get("gitRemote") or (legacy_data.get("git_remote") or legacy_data.get("gitRemote") if legacy_data else None)
71
+ description = str(
72
+ fm_data.get("description") or (legacy_data.get("description") if legacy_data else "") or ""
73
+ ).strip()
74
+ git_remote = (
75
+ fm_data.get("git_remote")
76
+ or fm_data.get("gitRemote")
77
+ or (legacy_data.get("git_remote") or legacy_data.get("gitRemote") if legacy_data else None)
78
+ )
77
79
  git_remote_str = str(git_remote).strip() if git_remote else None
78
80
 
79
81
  raw_clean_period = (
80
- fm_data.get("done_clean_period")
81
- if "done_clean_period" in fm_data
82
- else fm_data.get("doneCleanPeriod")
82
+ fm_data.get("done_clean_period") if "done_clean_period" in fm_data else fm_data.get("doneCleanPeriod")
83
83
  )
84
84
  if raw_clean_period is None and legacy_data:
85
- raw_clean_period = legacy_data.get("done_clean_period") if "done_clean_period" in legacy_data else legacy_data.get("doneCleanPeriod")
85
+ raw_clean_period = (
86
+ legacy_data.get("done_clean_period")
87
+ if "done_clean_period" in legacy_data
88
+ else legacy_data.get("doneCleanPeriod")
89
+ )
86
90
  clean_period_int = int(raw_clean_period) if raw_clean_period is not None else None
87
91
 
88
92
  created_at = (
@@ -265,7 +269,9 @@ def write_project_manifest(
265
269
  final_content = f"---\n{yaml_content}---\n{body_to_write}"
266
270
 
267
271
  # Write to a uniquely named temporary file in the same directory before atomic replacement
268
- with tempfile.NamedTemporaryFile("w", dir=project_dir, delete=False, encoding="utf-8", prefix=".index_", suffix=".tmp") as f:
272
+ with tempfile.NamedTemporaryFile(
273
+ "w", dir=project_dir, delete=False, encoding="utf-8", prefix=".index_", suffix=".tmp"
274
+ ) as f:
269
275
  f.write(final_content)
270
276
  tmp_path = Path(f.name)
271
277
 
@@ -35,7 +35,9 @@ class ProjectRepository:
35
35
 
36
36
  def get_all(self) -> list[Project]:
37
37
  cursor = self.conn.cursor()
38
- cursor.execute("SELECT id, title, description, created_at, done_clean_period, git_remote FROM projects ORDER BY id ASC")
38
+ cursor.execute(
39
+ "SELECT id, title, description, created_at, done_clean_period, git_remote FROM projects ORDER BY id ASC"
40
+ )
39
41
  rows = cursor.fetchall()
40
42
  return [self._row_to_project(row) for row in rows]
41
43
 
@@ -136,6 +138,7 @@ class ProjectRepository:
136
138
  if legacy_file.is_file():
137
139
  try:
138
140
  import json
141
+
139
142
  content = json.loads(legacy_file.read_text(encoding="utf-8"))
140
143
  if isinstance(content, list):
141
144
  for p in content:
@@ -7,7 +7,6 @@ from typing import Self
7
7
 
8
8
  from jotter.features.buckets.domain import Bucket
9
9
  from jotter.features.buckets.repo import BucketRepository
10
- from jotter.features.projects.domain import Project
11
10
  from jotter.features.projects.repo import ProjectRepository
12
11
  from jotter.features.sync.git_adapter import git_sync
13
12
  from jotter.features.tasks.disk_repo import DiskTaskRepository
@@ -39,7 +39,10 @@ class DiskTaskRepository:
39
39
  parent_dir.mkdir(parents=True, exist_ok=True)
40
40
 
41
41
  import tempfile
42
- with tempfile.NamedTemporaryFile("w", dir=parent_dir, delete=False, encoding="utf-8", prefix=f".{task.id}_", suffix=".tmp") as f:
42
+
43
+ with tempfile.NamedTemporaryFile(
44
+ "w", dir=parent_dir, delete=False, encoding="utf-8", prefix=f".{task.id}_", suffix=".tmp"
45
+ ) as f:
43
46
  f.write(content)
44
47
  tmp_path = Path(f.name)
45
48
  tmp_path.replace(path)
@@ -52,9 +55,7 @@ class DiskTaskRepository:
52
55
  def get_all_task_files(self, project_id: str) -> list[Path]:
53
56
  p = self.get_project_dir(project_id)
54
57
  return [
55
- f
56
- for f in p.glob("*.md")
57
- if f.is_file() and f.name.lower() not in ("index.md", "readme.md", ".project.md")
58
+ f for f in p.glob("*.md") if f.is_file() and f.name.lower() not in ("index.md", "readme.md", ".project.md")
58
59
  ]
59
60
 
60
61
  def serialize_task(self, task: Task) -> str:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: jotter-app
3
- Version: 3.8.1.dev0
3
+ Version: 3.8.2.dev0
4
4
  Summary: Local-first Markdown Kanban Board web application
5
5
  Author: Simon
6
6
  License: Apache-2.0
@@ -1,7 +1,7 @@
1
1
  {
2
- "tag": "3.8.0",
2
+ "tag": "3.8.1",
3
3
  "distance": 0,
4
- "node": "g23eebde2b3430086bfb76afdd0e631f75b472f7a",
4
+ "node": "gcb93b633482fa33bf8b0f7699e261fde78001402",
5
5
  "dirty": true,
6
6
  "branch": "HEAD",
7
7
  "node_date": "2026-09-18"
@@ -95,4 +95,8 @@ def test_index_md_project_manifest_roundtrip(temp_dir, test_env):
95
95
  content_updated = index_file.read_text(encoding="utf-8")
96
96
  assert "name: reviews" in content_updated
97
97
  assert "title: Reviews" in content_updated
98
- assert "color: '#00ff00'" in content_updated or "color: '#00FF00'" in content_updated or 'color: "#00ff00"' in content_updated
98
+ assert (
99
+ "color: '#00ff00'" in content_updated
100
+ or "color: '#00FF00'" in content_updated
101
+ or 'color: "#00ff00"' in content_updated
102
+ )
@@ -257,4 +257,3 @@ def test_sync_migrates_projects_json_to_index_md(temp_dir, test_env):
257
257
  assert alpha_buckets[0].name == "ideas"
258
258
  assert alpha_buckets[0].title == "Ideas Column"
259
259
  assert alpha_buckets[1].name == "done"
260
-