jotter-app 3.0.0__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 (222) hide show
  1. jotter_app-3.0.0/.codecov.yml +17 -0
  2. jotter_app-3.0.0/.github/dependabot.yml +82 -0
  3. jotter_app-3.0.0/.github/workflows/ci.yml +200 -0
  4. jotter_app-3.0.0/.github/workflows/pages.yml +71 -0
  5. jotter_app-3.0.0/.github/workflows/release.yml +63 -0
  6. jotter_app-3.0.0/.gitignore +72 -0
  7. jotter_app-3.0.0/CONTRIBUTING.md +90 -0
  8. jotter_app-3.0.0/LICENSE.md +201 -0
  9. jotter_app-3.0.0/PKG-INFO +141 -0
  10. jotter_app-3.0.0/README.md +119 -0
  11. jotter_app-3.0.0/backend/_version.py +24 -0
  12. jotter_app-3.0.0/backend/app.py +74 -0
  13. jotter_app-3.0.0/backend/config.py +104 -0
  14. jotter_app-3.0.0/backend/db.py +102 -0
  15. jotter_app-3.0.0/backend/dist/assets/index-BysN6By9.css +2 -0
  16. jotter_app-3.0.0/backend/dist/assets/index-DirnwN8A.js +272 -0
  17. jotter_app-3.0.0/backend/dist/assets/inter-cyrillic-ext-wght-italic-B5xAaiFk.woff2 +0 -0
  18. jotter_app-3.0.0/backend/dist/assets/inter-cyrillic-ext-wght-normal-BOeWTOD4.woff2 +0 -0
  19. jotter_app-3.0.0/backend/dist/assets/inter-cyrillic-wght-italic-DzZdc28x.woff2 +0 -0
  20. jotter_app-3.0.0/backend/dist/assets/inter-cyrillic-wght-normal-DqGufNeO.woff2 +0 -0
  21. jotter_app-3.0.0/backend/dist/assets/inter-greek-ext-wght-italic-DcOpz6Lw.woff2 +0 -0
  22. jotter_app-3.0.0/backend/dist/assets/inter-greek-ext-wght-normal-DlzME5K_.woff2 +0 -0
  23. jotter_app-3.0.0/backend/dist/assets/inter-greek-wght-italic-CILZdfAp.woff2 +0 -0
  24. jotter_app-3.0.0/backend/dist/assets/inter-greek-wght-normal-CkhJZR-_.woff2 +0 -0
  25. jotter_app-3.0.0/backend/dist/assets/inter-latin-ext-wght-italic-0pjOp8NU.woff2 +0 -0
  26. jotter_app-3.0.0/backend/dist/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2 +0 -0
  27. jotter_app-3.0.0/backend/dist/assets/inter-latin-wght-italic-DpCbqKDY.woff2 +0 -0
  28. jotter_app-3.0.0/backend/dist/assets/inter-latin-wght-normal-Dx4kXJAl.woff2 +0 -0
  29. jotter_app-3.0.0/backend/dist/assets/inter-vietnamese-wght-italic-K3WlGtc8.woff2 +0 -0
  30. jotter_app-3.0.0/backend/dist/assets/inter-vietnamese-wght-normal-CBcvBZtf.woff2 +0 -0
  31. jotter_app-3.0.0/backend/dist/favicon.svg +16 -0
  32. jotter_app-3.0.0/backend/dist/index.html +16 -0
  33. jotter_app-3.0.0/backend/dist/manifest.json +49 -0
  34. jotter_app-3.0.0/backend/dist/pwa-192.png +0 -0
  35. jotter_app-3.0.0/backend/dist/pwa-512.png +0 -0
  36. jotter_app-3.0.0/backend/dist/sw.js +42 -0
  37. jotter_app-3.0.0/backend/main.py +40 -0
  38. jotter_app-3.0.0/backend/models/bucket.py +33 -0
  39. jotter_app-3.0.0/backend/models/project.py +23 -0
  40. jotter_app-3.0.0/backend/models/settings.py +23 -0
  41. jotter_app-3.0.0/backend/models/task.py +70 -0
  42. jotter_app-3.0.0/backend/routes/buckets.py +49 -0
  43. jotter_app-3.0.0/backend/routes/projects.py +53 -0
  44. jotter_app-3.0.0/backend/routes/settings.py +19 -0
  45. jotter_app-3.0.0/backend/routes/system.py +62 -0
  46. jotter_app-3.0.0/backend/routes/tasks.py +157 -0
  47. jotter_app-3.0.0/backend/services/bucket_service.py +286 -0
  48. jotter_app-3.0.0/backend/services/git_service.py +184 -0
  49. jotter_app-3.0.0/backend/services/project_service.py +218 -0
  50. jotter_app-3.0.0/backend/services/settings_service.py +34 -0
  51. jotter_app-3.0.0/backend/services/sync_service.py +256 -0
  52. jotter_app-3.0.0/backend/services/task_service.py +554 -0
  53. jotter_app-3.0.0/backend/utils/slug.py +12 -0
  54. jotter_app-3.0.0/backend/utils/ulid.py +21 -0
  55. jotter_app-3.0.0/docs/.vitepress/config.mts +167 -0
  56. jotter_app-3.0.0/docs/assets/icon.ico +0 -0
  57. jotter_app-3.0.0/docs/assets/icon.png +0 -0
  58. jotter_app-3.0.0/docs/assets/jotter.sample.yaml +18 -0
  59. jotter_app-3.0.0/docs/assets/screenshot.png +0 -0
  60. jotter_app-3.0.0/docs/de/developer/api.md +81 -0
  61. jotter_app-3.0.0/docs/de/developer/architecture.md +211 -0
  62. jotter_app-3.0.0/docs/de/index.md +394 -0
  63. jotter_app-3.0.0/docs/de/installation/development.md +82 -0
  64. jotter_app-3.0.0/docs/de/installation/precompiled.md +71 -0
  65. jotter_app-3.0.0/docs/de/user/configuration.md +125 -0
  66. jotter_app-3.0.0/docs/de/user/format-spec.md +100 -0
  67. jotter_app-3.0.0/docs/de/user/git-sync.md +106 -0
  68. jotter_app-3.0.0/docs/de/user/import-export.md +73 -0
  69. jotter_app-3.0.0/docs/de/user/obsidian.md +83 -0
  70. jotter_app-3.0.0/docs/de/user/postponing.md +61 -0
  71. jotter_app-3.0.0/docs/de/user/safety.md +69 -0
  72. jotter_app-3.0.0/docs/de/user/searching-filtering.md +59 -0
  73. jotter_app-3.0.0/docs/de/user/shortcuts.md +31 -0
  74. jotter_app-3.0.0/docs/developer/adr/0001-immutable-bucket-slugs.md +35 -0
  75. jotter_app-3.0.0/docs/developer/adr/0002-decline-recurring-tasks.md +86 -0
  76. jotter_app-3.0.0/docs/developer/api.md +81 -0
  77. jotter_app-3.0.0/docs/developer/architecture.md +203 -0
  78. jotter_app-3.0.0/docs/index.md +394 -0
  79. jotter_app-3.0.0/docs/installation/development.md +81 -0
  80. jotter_app-3.0.0/docs/installation/precompiled.md +69 -0
  81. jotter_app-3.0.0/docs/public/logo.png +0 -0
  82. jotter_app-3.0.0/docs/user/configuration.md +126 -0
  83. jotter_app-3.0.0/docs/user/format-spec.md +100 -0
  84. jotter_app-3.0.0/docs/user/git-sync.md +113 -0
  85. jotter_app-3.0.0/docs/user/import-export.md +73 -0
  86. jotter_app-3.0.0/docs/user/obsidian.md +83 -0
  87. jotter_app-3.0.0/docs/user/postponing.md +61 -0
  88. jotter_app-3.0.0/docs/user/safety.md +69 -0
  89. jotter_app-3.0.0/docs/user/searching-filtering.md +59 -0
  90. jotter_app-3.0.0/docs/user/shortcuts.md +31 -0
  91. jotter_app-3.0.0/frontend/.gitignore +34 -0
  92. jotter_app-3.0.0/frontend/.prettierrc +7 -0
  93. jotter_app-3.0.0/frontend/README.md +44 -0
  94. jotter_app-3.0.0/frontend/eslint.config.js +45 -0
  95. jotter_app-3.0.0/frontend/index.html +15 -0
  96. jotter_app-3.0.0/frontend/package-lock.json +5714 -0
  97. jotter_app-3.0.0/frontend/package.json +60 -0
  98. jotter_app-3.0.0/frontend/playwright.config.ts +46 -0
  99. jotter_app-3.0.0/frontend/public/favicon.svg +16 -0
  100. jotter_app-3.0.0/frontend/public/manifest.json +49 -0
  101. jotter_app-3.0.0/frontend/public/pwa-192.png +0 -0
  102. jotter_app-3.0.0/frontend/public/pwa-512.png +0 -0
  103. jotter_app-3.0.0/frontend/public/sw.js +42 -0
  104. jotter_app-3.0.0/frontend/src/App.vue +24 -0
  105. jotter_app-3.0.0/frontend/src/__tests__/api.spec.ts +106 -0
  106. jotter_app-3.0.0/frontend/src/api.demo.ts +589 -0
  107. jotter_app-3.0.0/frontend/src/api.ts +469 -0
  108. jotter_app-3.0.0/frontend/src/components/layout/MainLayout.vue +248 -0
  109. jotter_app-3.0.0/frontend/src/components/layout/NavigationBar.vue +329 -0
  110. jotter_app-3.0.0/frontend/src/components/layout/ProjectLayout.vue +419 -0
  111. jotter_app-3.0.0/frontend/src/components/layout/ProjectSidebar.vue +462 -0
  112. jotter_app-3.0.0/frontend/src/components/layout/TimelineLayout.vue +253 -0
  113. jotter_app-3.0.0/frontend/src/components/layout/__tests__/NavigationBar.spec.ts +123 -0
  114. jotter_app-3.0.0/frontend/src/components/layout/__tests__/ProjectSidebar.spec.ts +122 -0
  115. jotter_app-3.0.0/frontend/src/components/modals/ColumnEditModal.vue +339 -0
  116. jotter_app-3.0.0/frontend/src/components/modals/FilterModal.vue +422 -0
  117. jotter_app-3.0.0/frontend/src/components/modals/ModalRegistry.vue +81 -0
  118. jotter_app-3.0.0/frontend/src/components/modals/MoveTasksConfirmModal.vue +158 -0
  119. jotter_app-3.0.0/frontend/src/components/modals/ProjectEditModal.vue +200 -0
  120. jotter_app-3.0.0/frontend/src/components/modals/TaskCreateModal.vue +436 -0
  121. jotter_app-3.0.0/frontend/src/components/modals/TaskDetailModal.vue +851 -0
  122. jotter_app-3.0.0/frontend/src/components/modals/TaskImportModal.vue +249 -0
  123. jotter_app-3.0.0/frontend/src/components/modals/TimeMachineModal.vue +353 -0
  124. jotter_app-3.0.0/frontend/src/components/modals/__tests__/ColumnEditModal.spec.ts +293 -0
  125. jotter_app-3.0.0/frontend/src/components/modals/__tests__/FilterModal.spec.ts +151 -0
  126. jotter_app-3.0.0/frontend/src/components/modals/__tests__/MoveTasksConfirmModal.spec.ts +167 -0
  127. jotter_app-3.0.0/frontend/src/components/modals/__tests__/ProjectEditModal.spec.ts +163 -0
  128. jotter_app-3.0.0/frontend/src/components/modals/__tests__/TaskCreateModal.spec.ts +127 -0
  129. jotter_app-3.0.0/frontend/src/components/modals/__tests__/TaskDetailModal.spec.ts +226 -0
  130. jotter_app-3.0.0/frontend/src/components/modals/__tests__/TimeMachineModal.spec.ts +130 -0
  131. jotter_app-3.0.0/frontend/src/components/ui/BulkActionBar.vue +525 -0
  132. jotter_app-3.0.0/frontend/src/components/ui/GenericColumn.vue +466 -0
  133. jotter_app-3.0.0/frontend/src/components/ui/GlobalDialog.vue +71 -0
  134. jotter_app-3.0.0/frontend/src/components/ui/KeywordHighlightInput.vue +222 -0
  135. jotter_app-3.0.0/frontend/src/components/ui/MarkdownEditor.vue +225 -0
  136. jotter_app-3.0.0/frontend/src/components/ui/TagInput.vue +177 -0
  137. jotter_app-3.0.0/frontend/src/components/ui/TaskCard.vue +485 -0
  138. jotter_app-3.0.0/frontend/src/components/ui/__tests__/BulkActionBar.spec.ts +189 -0
  139. jotter_app-3.0.0/frontend/src/components/ui/__tests__/TagInput.spec.ts +162 -0
  140. jotter_app-3.0.0/frontend/src/components/ui/__tests__/TaskCard.spec.ts +213 -0
  141. jotter_app-3.0.0/frontend/src/components/views/BoardView.vue +433 -0
  142. jotter_app-3.0.0/frontend/src/components/views/HomeView.vue +202 -0
  143. jotter_app-3.0.0/frontend/src/components/views/ListView.vue +291 -0
  144. jotter_app-3.0.0/frontend/src/components/views/MatrixView.vue +461 -0
  145. jotter_app-3.0.0/frontend/src/components/views/SettingsView.vue +518 -0
  146. jotter_app-3.0.0/frontend/src/components/views/TagView.vue +162 -0
  147. jotter_app-3.0.0/frontend/src/components/views/TimeView.vue +43 -0
  148. jotter_app-3.0.0/frontend/src/components/views/TriageView.vue +641 -0
  149. jotter_app-3.0.0/frontend/src/components/views/__tests__/TriageView.spec.ts +351 -0
  150. jotter_app-3.0.0/frontend/src/composables/__tests__/useBoardNavigation.spec.ts +279 -0
  151. jotter_app-3.0.0/frontend/src/composables/__tests__/useDialog.spec.ts +60 -0
  152. jotter_app-3.0.0/frontend/src/composables/__tests__/useI18n.spec.ts +50 -0
  153. jotter_app-3.0.0/frontend/src/composables/__tests__/useKeyboardShortcuts.spec.ts +129 -0
  154. jotter_app-3.0.0/frontend/src/composables/__tests__/useTaskMutations.spec.ts +185 -0
  155. jotter_app-3.0.0/frontend/src/composables/useBoardNavigation.ts +136 -0
  156. jotter_app-3.0.0/frontend/src/composables/useBuckets.ts +144 -0
  157. jotter_app-3.0.0/frontend/src/composables/useDialog.ts +64 -0
  158. jotter_app-3.0.0/frontend/src/composables/useDragSelect.ts +133 -0
  159. jotter_app-3.0.0/frontend/src/composables/useI18n.ts +112 -0
  160. jotter_app-3.0.0/frontend/src/composables/useKeyboardShortcuts.ts +56 -0
  161. jotter_app-3.0.0/frontend/src/composables/useProjects.ts +90 -0
  162. jotter_app-3.0.0/frontend/src/composables/useTaskAutocomplete.ts +106 -0
  163. jotter_app-3.0.0/frontend/src/composables/useTaskExport.ts +50 -0
  164. jotter_app-3.0.0/frontend/src/composables/useTaskFilters.ts +264 -0
  165. jotter_app-3.0.0/frontend/src/composables/useTaskMutations.ts +239 -0
  166. jotter_app-3.0.0/frontend/src/composables/useTaskSelection.ts +39 -0
  167. jotter_app-3.0.0/frontend/src/features/task-editor/components/TaskAttachments.vue +159 -0
  168. jotter_app-3.0.0/frontend/src/features/task-editor/components/TaskChecklist.vue +68 -0
  169. jotter_app-3.0.0/frontend/src/features/task-editor/composables/useTaskEditor.ts +242 -0
  170. jotter_app-3.0.0/frontend/src/features/task-import/components/StepColumnMapper.vue +275 -0
  171. jotter_app-3.0.0/frontend/src/features/task-import/components/StepProgress.vue +59 -0
  172. jotter_app-3.0.0/frontend/src/features/task-import/components/StepRowPreview.vue +104 -0
  173. jotter_app-3.0.0/frontend/src/features/task-import/components/StepSummary.vue +47 -0
  174. jotter_app-3.0.0/frontend/src/features/task-import/components/StepUpload.vue +69 -0
  175. jotter_app-3.0.0/frontend/src/features/task-import/composables/__tests__/useImportWizard.spec.ts +261 -0
  176. jotter_app-3.0.0/frontend/src/features/task-import/composables/useImportWizard.ts +585 -0
  177. jotter_app-3.0.0/frontend/src/features/task-triage/components/TriageCard.vue +366 -0
  178. jotter_app-3.0.0/frontend/src/locales/de.ts +540 -0
  179. jotter_app-3.0.0/frontend/src/locales/en.ts +535 -0
  180. jotter_app-3.0.0/frontend/src/main.ts +23 -0
  181. jotter_app-3.0.0/frontend/src/router.ts +151 -0
  182. jotter_app-3.0.0/frontend/src/stores/__tests__/modal.spec.ts +68 -0
  183. jotter_app-3.0.0/frontend/src/stores/__tests__/selection.spec.ts +78 -0
  184. jotter_app-3.0.0/frontend/src/stores/__tests__/settings.spec.ts +68 -0
  185. jotter_app-3.0.0/frontend/src/stores/__tests__/ui.spec.ts +65 -0
  186. jotter_app-3.0.0/frontend/src/stores/modal.ts +58 -0
  187. jotter_app-3.0.0/frontend/src/stores/project.ts +222 -0
  188. jotter_app-3.0.0/frontend/src/stores/selection.ts +57 -0
  189. jotter_app-3.0.0/frontend/src/stores/settings.ts +182 -0
  190. jotter_app-3.0.0/frontend/src/stores/ui.ts +100 -0
  191. jotter_app-3.0.0/frontend/src/style.css +355 -0
  192. jotter_app-3.0.0/frontend/src/test-setup.ts +23 -0
  193. jotter_app-3.0.0/frontend/src/types.ts +98 -0
  194. jotter_app-3.0.0/frontend/src/utils/__tests__/dsl.spec.ts +125 -0
  195. jotter_app-3.0.0/frontend/src/utils/__tests__/titleParser.spec.ts +352 -0
  196. jotter_app-3.0.0/frontend/src/utils/constants.ts +53 -0
  197. jotter_app-3.0.0/frontend/src/utils/dsl.ts +137 -0
  198. jotter_app-3.0.0/frontend/src/utils/markdown.ts +23 -0
  199. jotter_app-3.0.0/frontend/src/utils/titleParser.ts +462 -0
  200. jotter_app-3.0.0/frontend/tests/e2e/kanban.spec.ts +129 -0
  201. jotter_app-3.0.0/frontend/tsconfig.app.json +19 -0
  202. jotter_app-3.0.0/frontend/tsconfig.json +7 -0
  203. jotter_app-3.0.0/frontend/tsconfig.node.json +24 -0
  204. jotter_app-3.0.0/frontend/vite.config.ts +33 -0
  205. jotter_app-3.0.0/jotter_app.egg-info/PKG-INFO +141 -0
  206. jotter_app-3.0.0/jotter_app.egg-info/SOURCES.txt +220 -0
  207. jotter_app-3.0.0/jotter_app.egg-info/dependency_links.txt +1 -0
  208. jotter_app-3.0.0/jotter_app.egg-info/entry_points.txt +2 -0
  209. jotter_app-3.0.0/jotter_app.egg-info/requires.txt +12 -0
  210. jotter_app-3.0.0/jotter_app.egg-info/scm_file_list.json +193 -0
  211. jotter_app-3.0.0/jotter_app.egg-info/scm_version.json +8 -0
  212. jotter_app-3.0.0/jotter_app.egg-info/top_level.txt +1 -0
  213. jotter_app-3.0.0/package-lock.json +2891 -0
  214. jotter_app-3.0.0/package.json +41 -0
  215. jotter_app-3.0.0/pyproject.toml +68 -0
  216. jotter_app-3.0.0/run.py +10 -0
  217. jotter_app-3.0.0/scripts/combine-coverage.js +85 -0
  218. jotter_app-3.0.0/scripts/install.sh +71 -0
  219. jotter_app-3.0.0/scripts/uninstall.sh +32 -0
  220. jotter_app-3.0.0/setup.cfg +4 -0
  221. jotter_app-3.0.0/tests/backend/test_api.py +245 -0
  222. jotter_app-3.0.0/tests/integration_test.go +573 -0
@@ -0,0 +1,17 @@
1
+ coverage:
2
+ status:
3
+ project:
4
+ default:
5
+ target: auto
6
+ threshold: 1.0%
7
+ patch:
8
+ default:
9
+ informational: true
10
+ range: "50...75"
11
+
12
+ ignore:
13
+ - "frontend/wailsjs/**/*"
14
+ - "frontend/dist/**/*"
15
+ - "main_desktop.go"
16
+ - "main_server.go"
17
+ - "shared_assets.go"
@@ -0,0 +1,82 @@
1
+ version: 2
2
+ updates:
3
+ # Maintain Python dependencies in pyproject.toml
4
+ - package-ecosystem: "pip"
5
+ directory: "/"
6
+ schedule:
7
+ interval: "weekly"
8
+ day: "monday"
9
+ time: "08:00"
10
+ timezone: "Europe/Zurich"
11
+ open-pull-requests-limit: 10
12
+ labels:
13
+ - "dependencies"
14
+ - "python"
15
+ groups:
16
+ pip-minor-patch:
17
+ patterns:
18
+ - "*"
19
+ update-types:
20
+ - "minor"
21
+ - "patch"
22
+
23
+ # Maintain npm dependencies at the root level
24
+ - package-ecosystem: "npm"
25
+ directory: "/"
26
+ schedule:
27
+ interval: "weekly"
28
+ day: "monday"
29
+ time: "08:00"
30
+ timezone: "Europe/Zurich"
31
+ open-pull-requests-limit: 10
32
+ labels:
33
+ - "dependencies"
34
+ - "npm"
35
+ groups:
36
+ npm-root-minor-patch:
37
+ patterns:
38
+ - "*"
39
+ update-types:
40
+ - "minor"
41
+ - "patch"
42
+
43
+ # Maintain npm dependencies in the frontend directory
44
+ - package-ecosystem: "npm"
45
+ directory: "/frontend"
46
+ schedule:
47
+ interval: "weekly"
48
+ day: "monday"
49
+ time: "08:00"
50
+ timezone: "Europe/Zurich"
51
+ open-pull-requests-limit: 10
52
+ labels:
53
+ - "dependencies"
54
+ - "npm"
55
+ - "frontend"
56
+ groups:
57
+ npm-frontend-minor-patch:
58
+ patterns:
59
+ - "*"
60
+ update-types:
61
+ - "minor"
62
+ - "patch"
63
+
64
+ # Maintain GitHub Actions dependencies
65
+ - package-ecosystem: "github-actions"
66
+ directory: "/"
67
+ schedule:
68
+ interval: "weekly"
69
+ day: "monday"
70
+ time: "08:00"
71
+ timezone: "Europe/Zurich"
72
+ open-pull-requests-limit: 10
73
+ labels:
74
+ - "dependencies"
75
+ - "github-actions"
76
+ groups:
77
+ actions-minor-patch:
78
+ patterns:
79
+ - "*"
80
+ update-types:
81
+ - "minor"
82
+ - "patch"
@@ -0,0 +1,200 @@
1
+ name: CI Pipeline
2
+
3
+ on:
4
+ push:
5
+ branches: [ main ]
6
+ tags:
7
+ - '*'
8
+ pull_request:
9
+ branches: [ main ]
10
+
11
+ env:
12
+ FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true
13
+
14
+ jobs:
15
+ lint-and-format:
16
+ runs-on: ubuntu-latest
17
+ steps:
18
+ - name: Checkout Code
19
+ uses: actions/checkout@v7
20
+ with:
21
+ fetch-depth: 0
22
+
23
+ - name: Set up Python
24
+ uses: actions/setup-python@v5
25
+ with:
26
+ python-version: '3.12'
27
+ cache: 'pip'
28
+
29
+ - name: Set up Node.js
30
+ uses: actions/setup-node@v7
31
+ with:
32
+ node-version: '22'
33
+
34
+ - name: Cache Node Modules
35
+ uses: actions/cache@v6
36
+ with:
37
+ path: |
38
+ node_modules
39
+ frontend/node_modules
40
+ key: ${{ runner.os }}-node-${{ hashFiles('package-lock.json', 'frontend/package-lock.json') }}
41
+ restore-keys: |
42
+ ${{ runner.os }}-node-
43
+
44
+ - name: Install All Dependencies
45
+ run: |
46
+ pip install -e .[dev]
47
+ npm run install:all
48
+
49
+ - name: Check Formatting
50
+ run: |
51
+ npm run format:check
52
+
53
+ - name: Run Linters
54
+ run: |
55
+ npm run lint
56
+
57
+ unit-tests:
58
+ runs-on: ubuntu-latest
59
+ steps:
60
+ - name: Checkout Code
61
+ uses: actions/checkout@v7
62
+ with:
63
+ fetch-depth: 0
64
+
65
+ - name: Set up Python
66
+ uses: actions/setup-python@v5
67
+ with:
68
+ python-version: '3.12'
69
+ cache: 'pip'
70
+
71
+ - name: Set up Node.js
72
+ uses: actions/setup-node@v7
73
+ with:
74
+ node-version: '22'
75
+
76
+ - name: Cache Node Modules
77
+ uses: actions/cache@v6
78
+ with:
79
+ path: |
80
+ node_modules
81
+ frontend/node_modules
82
+ key: ${{ runner.os }}-node-${{ hashFiles('package-lock.json', 'frontend/package-lock.json') }}
83
+ restore-keys: |
84
+ ${{ runner.os }}-node-
85
+
86
+ - name: Install All Dependencies
87
+ run: |
88
+ pip install -e .[dev]
89
+ npm run install:all
90
+
91
+ - name: Run Backend Tests with Coverage
92
+ run: |
93
+ python3 -m pytest --cov=backend --cov-report=xml --cov-report=term tests/backend/
94
+
95
+ - name: Run Frontend Tests with Coverage
96
+ run: |
97
+ cd frontend && npm run test:coverage
98
+
99
+ - name: Upload Backend Coverage to Codecov
100
+ uses: codecov/codecov-action@v7
101
+ with:
102
+ token: ${{ secrets.CODECOV_TOKEN }}
103
+ files: coverage.xml
104
+ flags: backend
105
+ fail_ci_if_error: false
106
+
107
+ - name: Upload Frontend Coverage to Codecov
108
+ uses: codecov/codecov-action@v7
109
+ with:
110
+ token: ${{ secrets.CODECOV_TOKEN }}
111
+ files: frontend/coverage/lcov.info
112
+ flags: frontend
113
+ fail_ci_if_error: false
114
+
115
+ e2e-tests:
116
+ runs-on: ubuntu-latest
117
+ steps:
118
+ - name: Checkout Code
119
+ uses: actions/checkout@v7
120
+ with:
121
+ fetch-depth: 0
122
+
123
+ - name: Set up Python
124
+ uses: actions/setup-python@v5
125
+ with:
126
+ python-version: '3.12'
127
+ cache: 'pip'
128
+
129
+ - name: Set up Node.js
130
+ uses: actions/setup-node@v7
131
+ with:
132
+ node-version: '22'
133
+
134
+ - name: Cache Node Modules
135
+ uses: actions/cache@v6
136
+ with:
137
+ path: |
138
+ node_modules
139
+ frontend/node_modules
140
+ key: ${{ runner.os }}-node-${{ hashFiles('package-lock.json', 'frontend/package-lock.json') }}
141
+ restore-keys: |
142
+ ${{ runner.os }}-node-
143
+
144
+ - name: Install All Dependencies
145
+ run: |
146
+ pip install -e .[dev]
147
+ npm run install:all
148
+
149
+ - name: Cache Playwright Binaries
150
+ uses: actions/cache@v6
151
+ with:
152
+ path: ~/.cache/ms-playwright
153
+ key: ${{ runner.os }}-playwright-${{ hashFiles('frontend/package-lock.json') }}
154
+
155
+ - name: Install Playwright Browsers & OS Dependencies
156
+ run: |
157
+ cd frontend
158
+ npx playwright install --with-deps chromium
159
+
160
+ - name: Run Playwright E2E Tests
161
+ run: |
162
+ cd frontend
163
+ npx playwright test
164
+
165
+ - name: Upload Playwright Report on Failure
166
+ if: failure()
167
+ uses: actions/upload-artifact@v7
168
+ with:
169
+ name: playwright-report
170
+ path: frontend/playwright-report/
171
+ retention-days: 15
172
+
173
+ build-checks:
174
+ runs-on: ubuntu-latest
175
+ steps:
176
+ - name: Checkout Code
177
+ uses: actions/checkout@v7
178
+ with:
179
+ fetch-depth: 0
180
+
181
+ - name: Set up Python
182
+ uses: actions/setup-python@v5
183
+ with:
184
+ python-version: '3.12'
185
+ cache: 'pip'
186
+
187
+ - name: Set up Node.js
188
+ uses: actions/setup-node@v7
189
+ with:
190
+ node-version: '22'
191
+
192
+ - name: Install Dependencies
193
+ run: |
194
+ pip install build
195
+ npm run install:all
196
+
197
+ - name: Build Frontend & Python Distribution
198
+ run: |
199
+ npm run build:frontend
200
+ python3 -m build
@@ -0,0 +1,71 @@
1
+ name: Deploy to GitHub Pages
2
+
3
+ on:
4
+ push:
5
+ tags:
6
+ - '*'
7
+ workflow_dispatch:
8
+
9
+ permissions:
10
+ contents: read
11
+ pages: write
12
+ id-token: write
13
+
14
+ concurrency:
15
+ group: "pages"
16
+ cancel-in-progress: false
17
+
18
+ env:
19
+ FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true
20
+
21
+ jobs:
22
+ deploy-pages:
23
+ runs-on: ubuntu-latest
24
+ environment:
25
+ name: github-pages
26
+ url: ${{ steps.deployment.outputs.page_url }}
27
+ steps:
28
+ - name: Checkout Code
29
+ uses: actions/checkout@v7
30
+
31
+ - name: Set up Node.js
32
+ uses: actions/setup-node@v7
33
+ with:
34
+ node-version: '22'
35
+
36
+ - name: Cache Node Modules
37
+ uses: actions/cache@v6
38
+ with:
39
+ path: |
40
+ node_modules
41
+ frontend/node_modules
42
+ key: ${{ runner.os }}-node-${{ hashFiles('package-lock.json', 'frontend/package-lock.json') }}
43
+ restore-keys: |
44
+ ${{ runner.os }}-node-
45
+
46
+ - name: Install All Dependencies
47
+ shell: bash
48
+ run: |
49
+ npm install
50
+ cd frontend && npm install
51
+
52
+ - name: Build Docs and Frontend Demo
53
+ shell: bash
54
+ run: |
55
+ npm run docs:build
56
+ cd frontend && npm run build
57
+ cd ..
58
+ mkdir -p dist-pages
59
+ cp -R docs/.vitepress/dist/. dist-pages/
60
+ mkdir -p dist-pages/demo
61
+ cp -R frontend/dist/. dist-pages/demo/
62
+
63
+ - name: Upload Pages Artifact
64
+ uses: actions/upload-pages-artifact@v5
65
+ with:
66
+ path: dist-pages
67
+
68
+ - name: Deploy to GitHub Pages
69
+ # Identical deployment step
70
+ id: deployment
71
+ uses: actions/deploy-pages@v5
@@ -0,0 +1,63 @@
1
+ name: Release Pipeline
2
+
3
+ on:
4
+ push:
5
+ tags:
6
+ - '*'
7
+
8
+ env:
9
+ FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true
10
+
11
+ permissions:
12
+ contents: write
13
+ id-token: write # Required for PyPI Trusted Publishing (OIDC)
14
+
15
+ jobs:
16
+ build-and-release:
17
+ runs-on: ubuntu-latest
18
+ steps:
19
+ - name: Checkout Code
20
+ uses: actions/checkout@v7
21
+ with:
22
+ fetch-depth: 0
23
+
24
+ - name: Set up Python
25
+ uses: actions/setup-python@v5
26
+ with:
27
+ python-version: '3.12'
28
+ cache: 'pip'
29
+
30
+ - name: Set up Node.js
31
+ uses: actions/setup-node@v7
32
+ with:
33
+ node-version: '22'
34
+
35
+ - name: Install Build Tools & Dependencies
36
+ run: |
37
+ pip install build shiv
38
+ npm run install:all
39
+
40
+ - name: Build Bundled Python Package (Wheel & Sdist)
41
+ run: |
42
+ npm run build:package
43
+
44
+ - name: Build Standalone ZipApp (jotter.pyz)
45
+ run: |
46
+ mkdir -p dist-pyz
47
+ shiv -e backend.main:main -o dist-pyz/jotter.pyz .
48
+
49
+ - name: Create GitHub Release
50
+ env:
51
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
52
+ run: |
53
+ gh release create "${{ github.ref_name }}" dist/* dist-pyz/* \
54
+ --title "${{ github.ref_name }}" \
55
+ --generate-notes
56
+
57
+ - name: Publish to PyPI
58
+ uses: pypa/gh-action-pypi-publish@release/v1
59
+ continue-on-error: true # Allow release to succeed if PyPI credentials/Trusted Publishing are not yet configured
60
+ with:
61
+ packages-dir: dist/
62
+ skip-existing: true
63
+ print-hash: true
@@ -0,0 +1,72 @@
1
+ # Python Virtual Environments
2
+ .venv/
3
+ venv/
4
+ env/
5
+ ENV/
6
+
7
+ # Python Bytecode & Cache
8
+ __pycache__/
9
+ *.py[cod]
10
+ *$py.class
11
+ *.pyo
12
+ *.pyd
13
+
14
+ # Python Packaging & Builds
15
+ *.egg-info/
16
+ .eggs/
17
+ dist/
18
+ dist-pyz/
19
+ build/
20
+ backend/dist/
21
+ backend/_version.py
22
+ *.egg
23
+ *.pyz
24
+
25
+ # Testing & Coverage
26
+ .pytest_cache/
27
+ .coverage
28
+ .coverage.*
29
+ coverage.json
30
+ coverage.xml
31
+ coverage.out
32
+ htmlcov/
33
+ .tox/
34
+ .nox/
35
+ .hypothesis/
36
+
37
+ # Type Checking & Linting
38
+ .mypy_cache/
39
+ .ruff_cache/
40
+ .pytype/
41
+
42
+ # Databases & Runtime Files
43
+ *.db
44
+ *.db-journal
45
+ *.db-wal
46
+ *.db-shm
47
+ tasks/
48
+
49
+ # Node & Frontend
50
+ node_modules/
51
+ frontend/dist/
52
+ dist-pages/
53
+ docs/.vitepress/dist/
54
+ docs/.vitepress/cache/
55
+
56
+ # Local Configurations & Editor Settings
57
+ jotter.yaml
58
+ jotter.yml
59
+ jotter.json
60
+ .vscode/
61
+ .idea/
62
+ *.swp
63
+ *.swo
64
+ *~
65
+ .DS_Store
66
+
67
+ # Temporary Test Data
68
+ frontend/tests/e2e/temp_data/
69
+ *.tmp
70
+
71
+ # Antigravity CLI / Tooling
72
+ .antigravitycli
@@ -0,0 +1,90 @@
1
+ # Contributing to Jotter
2
+
3
+ Thank you for your interest in contributing to Jotter! We welcome issues, suggestions, and pull requests to help make Jotter the best local-first task manager.
4
+
5
+ ---
6
+
7
+ ## Code of Conduct & Committing Rules
8
+
9
+ To maintain a clean and trackable history, we enforce the following rules:
10
+
11
+ ### 1. Conventional Commits
12
+
13
+ All commit messages must follow the [Conventional Commits](https://www.conventionalcommits.org/) specification. This helps automate releases and changelogs.
14
+
15
+ Format: `<type>: <description>`
16
+
17
+ Common types:
18
+
19
+ - `feat`: A new feature for the user
20
+ - `fix`: A bug fix for the user
21
+ - `docs`: Documentation changes
22
+ - `style`: Code formatting changes (Prettier/Ruff format)
23
+ - `refactor`: Restructuring code without changing functionality
24
+ - `test`: Adding or correcting tests
25
+ - `chore`: Maintenance tasks, dependencies updates
26
+
27
+ Example:
28
+
29
+ ```bash
30
+ feat: support keyboard autocomplete tags list in details modal
31
+ fix: expand home user path in config data directory resolution
32
+ ```
33
+
34
+ ### 2. Semi-Linear Git History
35
+
36
+ We prefer a **semi-linear git history with merge commits** for features.
37
+
38
+ - Keep your feature branch updated by **rebasing** it onto the latest `main` branch. Bypassing this with a reverse merge (`git merge main` inside your feature branch) is discouraged as it creates messy commit loops.
39
+ - Pull requests will be integrated using a merge commit (`git merge --no-ff`) to ensure feature boundaries are cleanly documented in the commit graph, while keeping the history clean and readable.
40
+
41
+ ### 3. Development Setup
42
+
43
+ Please refer to the [Development Setup Guide](docs/installation/development.md) for instructions on setting up your local environment, installing dependencies, and running the dev servers.
44
+
45
+ ---
46
+
47
+ ## Code Quality Standards
48
+
49
+ Before submitting a pull request, please ensure your changes adhere to our style and testing checks.
50
+
51
+ ### Formatting & Linting
52
+
53
+ Run the following commands from the root directory to verify code cleanliness:
54
+
55
+ ```bash
56
+ # Auto-format both Python and Vue/TypeScript files
57
+ npm run format
58
+
59
+ # Run linters on the entire project
60
+ npm run lint
61
+ ```
62
+
63
+ - **Python Backend**: Uses **Ruff** for linting and formatting.
64
+ - **Frontend UI**: Uses **ESLint** and **Prettier** for code formatting and TypeScript linting.
65
+
66
+ ### Testing
67
+
68
+ We require all tests to pass before merging. You can run all backend (Pytest) and frontend (Vitest) tests using:
69
+
70
+ ```bash
71
+ npm run test
72
+ ```
73
+
74
+ #### Testing Philosophy: Sociable over Solitary
75
+
76
+ We advocate for **sociable unit and integration tests** over solitary testing styles that mock internal collaborators:
77
+
78
+ * **Mock ONLY External Boundaries**: Only mock boundaries that are slow, stateful, or outside our control. Examples include HTTP requests (`fetch`), direct filesystem access, and specific browser-only APIs.
79
+ * **Keep Internal Collaborators Live**: Do not mock internal application code (e.g., Pinia stores, helper functions, data parsers, utility classes). Use them live in your tests.
80
+ * **Why**: This prevents fragile tests that break during internal refactorings, ensures genuine integration safety, and keeps test code readable and clear of setup boilerplate.
81
+
82
+ ---
83
+
84
+ ## Pull Request Process
85
+
86
+ 1. Create a feature branch off of `main` (e.g. `feat/my-new-feature` or `fix/issue-description`).
87
+ 2. Make your changes and commit them using conventional commit messages.
88
+ 3. Ensure formatting, linting, and tests all pass cleanly.
89
+ 4. Push your branch and open a Pull Request targeting `main`.
90
+ 5. Clearly describe the changes and screenshots of UI modifications where relevant.