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.
- jotter_app-3.0.0/.codecov.yml +17 -0
- jotter_app-3.0.0/.github/dependabot.yml +82 -0
- jotter_app-3.0.0/.github/workflows/ci.yml +200 -0
- jotter_app-3.0.0/.github/workflows/pages.yml +71 -0
- jotter_app-3.0.0/.github/workflows/release.yml +63 -0
- jotter_app-3.0.0/.gitignore +72 -0
- jotter_app-3.0.0/CONTRIBUTING.md +90 -0
- jotter_app-3.0.0/LICENSE.md +201 -0
- jotter_app-3.0.0/PKG-INFO +141 -0
- jotter_app-3.0.0/README.md +119 -0
- jotter_app-3.0.0/backend/_version.py +24 -0
- jotter_app-3.0.0/backend/app.py +74 -0
- jotter_app-3.0.0/backend/config.py +104 -0
- jotter_app-3.0.0/backend/db.py +102 -0
- jotter_app-3.0.0/backend/dist/assets/index-BysN6By9.css +2 -0
- jotter_app-3.0.0/backend/dist/assets/index-DirnwN8A.js +272 -0
- jotter_app-3.0.0/backend/dist/assets/inter-cyrillic-ext-wght-italic-B5xAaiFk.woff2 +0 -0
- jotter_app-3.0.0/backend/dist/assets/inter-cyrillic-ext-wght-normal-BOeWTOD4.woff2 +0 -0
- jotter_app-3.0.0/backend/dist/assets/inter-cyrillic-wght-italic-DzZdc28x.woff2 +0 -0
- jotter_app-3.0.0/backend/dist/assets/inter-cyrillic-wght-normal-DqGufNeO.woff2 +0 -0
- jotter_app-3.0.0/backend/dist/assets/inter-greek-ext-wght-italic-DcOpz6Lw.woff2 +0 -0
- jotter_app-3.0.0/backend/dist/assets/inter-greek-ext-wght-normal-DlzME5K_.woff2 +0 -0
- jotter_app-3.0.0/backend/dist/assets/inter-greek-wght-italic-CILZdfAp.woff2 +0 -0
- jotter_app-3.0.0/backend/dist/assets/inter-greek-wght-normal-CkhJZR-_.woff2 +0 -0
- jotter_app-3.0.0/backend/dist/assets/inter-latin-ext-wght-italic-0pjOp8NU.woff2 +0 -0
- jotter_app-3.0.0/backend/dist/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2 +0 -0
- jotter_app-3.0.0/backend/dist/assets/inter-latin-wght-italic-DpCbqKDY.woff2 +0 -0
- jotter_app-3.0.0/backend/dist/assets/inter-latin-wght-normal-Dx4kXJAl.woff2 +0 -0
- jotter_app-3.0.0/backend/dist/assets/inter-vietnamese-wght-italic-K3WlGtc8.woff2 +0 -0
- jotter_app-3.0.0/backend/dist/assets/inter-vietnamese-wght-normal-CBcvBZtf.woff2 +0 -0
- jotter_app-3.0.0/backend/dist/favicon.svg +16 -0
- jotter_app-3.0.0/backend/dist/index.html +16 -0
- jotter_app-3.0.0/backend/dist/manifest.json +49 -0
- jotter_app-3.0.0/backend/dist/pwa-192.png +0 -0
- jotter_app-3.0.0/backend/dist/pwa-512.png +0 -0
- jotter_app-3.0.0/backend/dist/sw.js +42 -0
- jotter_app-3.0.0/backend/main.py +40 -0
- jotter_app-3.0.0/backend/models/bucket.py +33 -0
- jotter_app-3.0.0/backend/models/project.py +23 -0
- jotter_app-3.0.0/backend/models/settings.py +23 -0
- jotter_app-3.0.0/backend/models/task.py +70 -0
- jotter_app-3.0.0/backend/routes/buckets.py +49 -0
- jotter_app-3.0.0/backend/routes/projects.py +53 -0
- jotter_app-3.0.0/backend/routes/settings.py +19 -0
- jotter_app-3.0.0/backend/routes/system.py +62 -0
- jotter_app-3.0.0/backend/routes/tasks.py +157 -0
- jotter_app-3.0.0/backend/services/bucket_service.py +286 -0
- jotter_app-3.0.0/backend/services/git_service.py +184 -0
- jotter_app-3.0.0/backend/services/project_service.py +218 -0
- jotter_app-3.0.0/backend/services/settings_service.py +34 -0
- jotter_app-3.0.0/backend/services/sync_service.py +256 -0
- jotter_app-3.0.0/backend/services/task_service.py +554 -0
- jotter_app-3.0.0/backend/utils/slug.py +12 -0
- jotter_app-3.0.0/backend/utils/ulid.py +21 -0
- jotter_app-3.0.0/docs/.vitepress/config.mts +167 -0
- jotter_app-3.0.0/docs/assets/icon.ico +0 -0
- jotter_app-3.0.0/docs/assets/icon.png +0 -0
- jotter_app-3.0.0/docs/assets/jotter.sample.yaml +18 -0
- jotter_app-3.0.0/docs/assets/screenshot.png +0 -0
- jotter_app-3.0.0/docs/de/developer/api.md +81 -0
- jotter_app-3.0.0/docs/de/developer/architecture.md +211 -0
- jotter_app-3.0.0/docs/de/index.md +394 -0
- jotter_app-3.0.0/docs/de/installation/development.md +82 -0
- jotter_app-3.0.0/docs/de/installation/precompiled.md +71 -0
- jotter_app-3.0.0/docs/de/user/configuration.md +125 -0
- jotter_app-3.0.0/docs/de/user/format-spec.md +100 -0
- jotter_app-3.0.0/docs/de/user/git-sync.md +106 -0
- jotter_app-3.0.0/docs/de/user/import-export.md +73 -0
- jotter_app-3.0.0/docs/de/user/obsidian.md +83 -0
- jotter_app-3.0.0/docs/de/user/postponing.md +61 -0
- jotter_app-3.0.0/docs/de/user/safety.md +69 -0
- jotter_app-3.0.0/docs/de/user/searching-filtering.md +59 -0
- jotter_app-3.0.0/docs/de/user/shortcuts.md +31 -0
- jotter_app-3.0.0/docs/developer/adr/0001-immutable-bucket-slugs.md +35 -0
- jotter_app-3.0.0/docs/developer/adr/0002-decline-recurring-tasks.md +86 -0
- jotter_app-3.0.0/docs/developer/api.md +81 -0
- jotter_app-3.0.0/docs/developer/architecture.md +203 -0
- jotter_app-3.0.0/docs/index.md +394 -0
- jotter_app-3.0.0/docs/installation/development.md +81 -0
- jotter_app-3.0.0/docs/installation/precompiled.md +69 -0
- jotter_app-3.0.0/docs/public/logo.png +0 -0
- jotter_app-3.0.0/docs/user/configuration.md +126 -0
- jotter_app-3.0.0/docs/user/format-spec.md +100 -0
- jotter_app-3.0.0/docs/user/git-sync.md +113 -0
- jotter_app-3.0.0/docs/user/import-export.md +73 -0
- jotter_app-3.0.0/docs/user/obsidian.md +83 -0
- jotter_app-3.0.0/docs/user/postponing.md +61 -0
- jotter_app-3.0.0/docs/user/safety.md +69 -0
- jotter_app-3.0.0/docs/user/searching-filtering.md +59 -0
- jotter_app-3.0.0/docs/user/shortcuts.md +31 -0
- jotter_app-3.0.0/frontend/.gitignore +34 -0
- jotter_app-3.0.0/frontend/.prettierrc +7 -0
- jotter_app-3.0.0/frontend/README.md +44 -0
- jotter_app-3.0.0/frontend/eslint.config.js +45 -0
- jotter_app-3.0.0/frontend/index.html +15 -0
- jotter_app-3.0.0/frontend/package-lock.json +5714 -0
- jotter_app-3.0.0/frontend/package.json +60 -0
- jotter_app-3.0.0/frontend/playwright.config.ts +46 -0
- jotter_app-3.0.0/frontend/public/favicon.svg +16 -0
- jotter_app-3.0.0/frontend/public/manifest.json +49 -0
- jotter_app-3.0.0/frontend/public/pwa-192.png +0 -0
- jotter_app-3.0.0/frontend/public/pwa-512.png +0 -0
- jotter_app-3.0.0/frontend/public/sw.js +42 -0
- jotter_app-3.0.0/frontend/src/App.vue +24 -0
- jotter_app-3.0.0/frontend/src/__tests__/api.spec.ts +106 -0
- jotter_app-3.0.0/frontend/src/api.demo.ts +589 -0
- jotter_app-3.0.0/frontend/src/api.ts +469 -0
- jotter_app-3.0.0/frontend/src/components/layout/MainLayout.vue +248 -0
- jotter_app-3.0.0/frontend/src/components/layout/NavigationBar.vue +329 -0
- jotter_app-3.0.0/frontend/src/components/layout/ProjectLayout.vue +419 -0
- jotter_app-3.0.0/frontend/src/components/layout/ProjectSidebar.vue +462 -0
- jotter_app-3.0.0/frontend/src/components/layout/TimelineLayout.vue +253 -0
- jotter_app-3.0.0/frontend/src/components/layout/__tests__/NavigationBar.spec.ts +123 -0
- jotter_app-3.0.0/frontend/src/components/layout/__tests__/ProjectSidebar.spec.ts +122 -0
- jotter_app-3.0.0/frontend/src/components/modals/ColumnEditModal.vue +339 -0
- jotter_app-3.0.0/frontend/src/components/modals/FilterModal.vue +422 -0
- jotter_app-3.0.0/frontend/src/components/modals/ModalRegistry.vue +81 -0
- jotter_app-3.0.0/frontend/src/components/modals/MoveTasksConfirmModal.vue +158 -0
- jotter_app-3.0.0/frontend/src/components/modals/ProjectEditModal.vue +200 -0
- jotter_app-3.0.0/frontend/src/components/modals/TaskCreateModal.vue +436 -0
- jotter_app-3.0.0/frontend/src/components/modals/TaskDetailModal.vue +851 -0
- jotter_app-3.0.0/frontend/src/components/modals/TaskImportModal.vue +249 -0
- jotter_app-3.0.0/frontend/src/components/modals/TimeMachineModal.vue +353 -0
- jotter_app-3.0.0/frontend/src/components/modals/__tests__/ColumnEditModal.spec.ts +293 -0
- jotter_app-3.0.0/frontend/src/components/modals/__tests__/FilterModal.spec.ts +151 -0
- jotter_app-3.0.0/frontend/src/components/modals/__tests__/MoveTasksConfirmModal.spec.ts +167 -0
- jotter_app-3.0.0/frontend/src/components/modals/__tests__/ProjectEditModal.spec.ts +163 -0
- jotter_app-3.0.0/frontend/src/components/modals/__tests__/TaskCreateModal.spec.ts +127 -0
- jotter_app-3.0.0/frontend/src/components/modals/__tests__/TaskDetailModal.spec.ts +226 -0
- jotter_app-3.0.0/frontend/src/components/modals/__tests__/TimeMachineModal.spec.ts +130 -0
- jotter_app-3.0.0/frontend/src/components/ui/BulkActionBar.vue +525 -0
- jotter_app-3.0.0/frontend/src/components/ui/GenericColumn.vue +466 -0
- jotter_app-3.0.0/frontend/src/components/ui/GlobalDialog.vue +71 -0
- jotter_app-3.0.0/frontend/src/components/ui/KeywordHighlightInput.vue +222 -0
- jotter_app-3.0.0/frontend/src/components/ui/MarkdownEditor.vue +225 -0
- jotter_app-3.0.0/frontend/src/components/ui/TagInput.vue +177 -0
- jotter_app-3.0.0/frontend/src/components/ui/TaskCard.vue +485 -0
- jotter_app-3.0.0/frontend/src/components/ui/__tests__/BulkActionBar.spec.ts +189 -0
- jotter_app-3.0.0/frontend/src/components/ui/__tests__/TagInput.spec.ts +162 -0
- jotter_app-3.0.0/frontend/src/components/ui/__tests__/TaskCard.spec.ts +213 -0
- jotter_app-3.0.0/frontend/src/components/views/BoardView.vue +433 -0
- jotter_app-3.0.0/frontend/src/components/views/HomeView.vue +202 -0
- jotter_app-3.0.0/frontend/src/components/views/ListView.vue +291 -0
- jotter_app-3.0.0/frontend/src/components/views/MatrixView.vue +461 -0
- jotter_app-3.0.0/frontend/src/components/views/SettingsView.vue +518 -0
- jotter_app-3.0.0/frontend/src/components/views/TagView.vue +162 -0
- jotter_app-3.0.0/frontend/src/components/views/TimeView.vue +43 -0
- jotter_app-3.0.0/frontend/src/components/views/TriageView.vue +641 -0
- jotter_app-3.0.0/frontend/src/components/views/__tests__/TriageView.spec.ts +351 -0
- jotter_app-3.0.0/frontend/src/composables/__tests__/useBoardNavigation.spec.ts +279 -0
- jotter_app-3.0.0/frontend/src/composables/__tests__/useDialog.spec.ts +60 -0
- jotter_app-3.0.0/frontend/src/composables/__tests__/useI18n.spec.ts +50 -0
- jotter_app-3.0.0/frontend/src/composables/__tests__/useKeyboardShortcuts.spec.ts +129 -0
- jotter_app-3.0.0/frontend/src/composables/__tests__/useTaskMutations.spec.ts +185 -0
- jotter_app-3.0.0/frontend/src/composables/useBoardNavigation.ts +136 -0
- jotter_app-3.0.0/frontend/src/composables/useBuckets.ts +144 -0
- jotter_app-3.0.0/frontend/src/composables/useDialog.ts +64 -0
- jotter_app-3.0.0/frontend/src/composables/useDragSelect.ts +133 -0
- jotter_app-3.0.0/frontend/src/composables/useI18n.ts +112 -0
- jotter_app-3.0.0/frontend/src/composables/useKeyboardShortcuts.ts +56 -0
- jotter_app-3.0.0/frontend/src/composables/useProjects.ts +90 -0
- jotter_app-3.0.0/frontend/src/composables/useTaskAutocomplete.ts +106 -0
- jotter_app-3.0.0/frontend/src/composables/useTaskExport.ts +50 -0
- jotter_app-3.0.0/frontend/src/composables/useTaskFilters.ts +264 -0
- jotter_app-3.0.0/frontend/src/composables/useTaskMutations.ts +239 -0
- jotter_app-3.0.0/frontend/src/composables/useTaskSelection.ts +39 -0
- jotter_app-3.0.0/frontend/src/features/task-editor/components/TaskAttachments.vue +159 -0
- jotter_app-3.0.0/frontend/src/features/task-editor/components/TaskChecklist.vue +68 -0
- jotter_app-3.0.0/frontend/src/features/task-editor/composables/useTaskEditor.ts +242 -0
- jotter_app-3.0.0/frontend/src/features/task-import/components/StepColumnMapper.vue +275 -0
- jotter_app-3.0.0/frontend/src/features/task-import/components/StepProgress.vue +59 -0
- jotter_app-3.0.0/frontend/src/features/task-import/components/StepRowPreview.vue +104 -0
- jotter_app-3.0.0/frontend/src/features/task-import/components/StepSummary.vue +47 -0
- jotter_app-3.0.0/frontend/src/features/task-import/components/StepUpload.vue +69 -0
- jotter_app-3.0.0/frontend/src/features/task-import/composables/__tests__/useImportWizard.spec.ts +261 -0
- jotter_app-3.0.0/frontend/src/features/task-import/composables/useImportWizard.ts +585 -0
- jotter_app-3.0.0/frontend/src/features/task-triage/components/TriageCard.vue +366 -0
- jotter_app-3.0.0/frontend/src/locales/de.ts +540 -0
- jotter_app-3.0.0/frontend/src/locales/en.ts +535 -0
- jotter_app-3.0.0/frontend/src/main.ts +23 -0
- jotter_app-3.0.0/frontend/src/router.ts +151 -0
- jotter_app-3.0.0/frontend/src/stores/__tests__/modal.spec.ts +68 -0
- jotter_app-3.0.0/frontend/src/stores/__tests__/selection.spec.ts +78 -0
- jotter_app-3.0.0/frontend/src/stores/__tests__/settings.spec.ts +68 -0
- jotter_app-3.0.0/frontend/src/stores/__tests__/ui.spec.ts +65 -0
- jotter_app-3.0.0/frontend/src/stores/modal.ts +58 -0
- jotter_app-3.0.0/frontend/src/stores/project.ts +222 -0
- jotter_app-3.0.0/frontend/src/stores/selection.ts +57 -0
- jotter_app-3.0.0/frontend/src/stores/settings.ts +182 -0
- jotter_app-3.0.0/frontend/src/stores/ui.ts +100 -0
- jotter_app-3.0.0/frontend/src/style.css +355 -0
- jotter_app-3.0.0/frontend/src/test-setup.ts +23 -0
- jotter_app-3.0.0/frontend/src/types.ts +98 -0
- jotter_app-3.0.0/frontend/src/utils/__tests__/dsl.spec.ts +125 -0
- jotter_app-3.0.0/frontend/src/utils/__tests__/titleParser.spec.ts +352 -0
- jotter_app-3.0.0/frontend/src/utils/constants.ts +53 -0
- jotter_app-3.0.0/frontend/src/utils/dsl.ts +137 -0
- jotter_app-3.0.0/frontend/src/utils/markdown.ts +23 -0
- jotter_app-3.0.0/frontend/src/utils/titleParser.ts +462 -0
- jotter_app-3.0.0/frontend/tests/e2e/kanban.spec.ts +129 -0
- jotter_app-3.0.0/frontend/tsconfig.app.json +19 -0
- jotter_app-3.0.0/frontend/tsconfig.json +7 -0
- jotter_app-3.0.0/frontend/tsconfig.node.json +24 -0
- jotter_app-3.0.0/frontend/vite.config.ts +33 -0
- jotter_app-3.0.0/jotter_app.egg-info/PKG-INFO +141 -0
- jotter_app-3.0.0/jotter_app.egg-info/SOURCES.txt +220 -0
- jotter_app-3.0.0/jotter_app.egg-info/dependency_links.txt +1 -0
- jotter_app-3.0.0/jotter_app.egg-info/entry_points.txt +2 -0
- jotter_app-3.0.0/jotter_app.egg-info/requires.txt +12 -0
- jotter_app-3.0.0/jotter_app.egg-info/scm_file_list.json +193 -0
- jotter_app-3.0.0/jotter_app.egg-info/scm_version.json +8 -0
- jotter_app-3.0.0/jotter_app.egg-info/top_level.txt +1 -0
- jotter_app-3.0.0/package-lock.json +2891 -0
- jotter_app-3.0.0/package.json +41 -0
- jotter_app-3.0.0/pyproject.toml +68 -0
- jotter_app-3.0.0/run.py +10 -0
- jotter_app-3.0.0/scripts/combine-coverage.js +85 -0
- jotter_app-3.0.0/scripts/install.sh +71 -0
- jotter_app-3.0.0/scripts/uninstall.sh +32 -0
- jotter_app-3.0.0/setup.cfg +4 -0
- jotter_app-3.0.0/tests/backend/test_api.py +245 -0
- 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.
|