@nightkatana/kronosys-app 1.0.0-beta.2 → 1.0.0-beta.21

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 (112) hide show
  1. package/README.md +28 -1
  2. package/app/api/action/route.ts +39 -3
  3. package/app/api/action-logs/route.ts +24 -0
  4. package/app/api/backup/route.ts +1 -1
  5. package/app/api/restore/route.ts +145 -0
  6. package/app/changelog/page.tsx +71 -4
  7. package/app/globals.css +127 -0
  8. package/app/guide/page.tsx +61 -15
  9. package/app/implementation/page.tsx +700 -0
  10. package/app/layout.tsx +14 -3
  11. package/app/licenses/page.tsx +99 -37
  12. package/app/logs/page.tsx +258 -0
  13. package/app/manifest.ts +5 -5
  14. package/app/page.tsx +784 -229
  15. package/app/reporting/page.tsx +1266 -474
  16. package/app/settings/page.tsx +252 -18
  17. package/bin/kronosys.mjs +140 -15
  18. package/components/KronosysPayloadProvider.tsx +2 -0
  19. package/components/RouteTransition.tsx +18 -0
  20. package/components/dashboard/AppShellCommandCenterPlaceholder.tsx +17 -0
  21. package/components/dashboard/AppShellHeaderSessionMeta.tsx +210 -0
  22. package/components/dashboard/AppShellHeaderWallClock.tsx +54 -0
  23. package/components/dashboard/AppShellLiveSessionDrawer.tsx +154 -38
  24. package/components/dashboard/AppShellRouteNav.tsx +323 -48
  25. package/components/dashboard/DashboardPauseBackdrop.tsx +50 -0
  26. package/components/dashboard/DashboardSimpleModal.tsx +168 -25
  27. package/components/dashboard/DashboardTour.tsx +115 -29
  28. package/components/dashboard/GlobalPauseConfirmModal.tsx +183 -0
  29. package/components/dashboard/KronosysDatetimePopoverField.tsx +167 -122
  30. package/components/dashboard/KronosysTimePopoverField.tsx +54 -12
  31. package/components/dashboard/NewSessionScopeModal.tsx +211 -20
  32. package/components/dashboard/PlannedTaskBoundaryConflictWatcher.tsx +275 -0
  33. package/components/dashboard/ReportingTour.tsx +87 -21
  34. package/components/dashboard/SavedProjectPicker.tsx +16 -3
  35. package/components/dashboard/SelectedSessionSidebarBlock.tsx +512 -142
  36. package/components/dashboard/SessionListPanel.tsx +327 -44
  37. package/components/dashboard/SettingsTagsProjectsSection.tsx +1073 -264
  38. package/components/dashboard/SettingsTaskTemplatesSection.tsx +316 -0
  39. package/components/dashboard/SettingsTour.tsx +86 -21
  40. package/components/dashboard/TagPills.tsx +14 -1
  41. package/components/dashboard/TaskFocusPanel.tsx +1081 -478
  42. package/components/dashboard/TaskSessionLiveCard.tsx +650 -135
  43. package/components/dashboard/TaskTimelineGanttModal.tsx +601 -0
  44. package/components/dashboard/taskFieldStyles.ts +20 -4
  45. package/components/dashboard/useReportingInteractionState.ts +80 -0
  46. package/lib/appShellHeaderClasses.ts +13 -0
  47. package/lib/businessRulesMatrix.ts +210 -0
  48. package/lib/copyToClipboard.ts +43 -0
  49. package/lib/dashboardCopy.ts +494 -84
  50. package/lib/dashboardQuickSearch.ts +54 -2
  51. package/lib/dashboardTimeZone.ts +109 -0
  52. package/lib/formatAppShellWallClock.ts +66 -0
  53. package/lib/formatSessionNameTemplate.ts +141 -0
  54. package/lib/generatedUserChangelog.ts +177 -6
  55. package/lib/globalPausePreview.ts +292 -0
  56. package/lib/implementationNotes.ts +1188 -0
  57. package/lib/kronosysApi.ts +6 -0
  58. package/lib/kronosysDashboardModalGates.ts +24 -0
  59. package/lib/plannedBoundaryAttention.ts +9 -0
  60. package/lib/plannedBoundaryConflict.ts +23 -0
  61. package/lib/reportingAggregate.ts +517 -75
  62. package/lib/reportingMetricHelp.ts +8 -0
  63. package/lib/reportingStrings.ts +37 -3
  64. package/lib/sessionListMerge.ts +4 -0
  65. package/lib/sessionTaskSidebarStats.ts +182 -21
  66. package/lib/settingsCopy.ts +178 -4
  67. package/lib/taskParsing.ts +360 -103
  68. package/lib/taskTemplateDraft.ts +135 -0
  69. package/lib/taskTimelineGantt.ts +265 -0
  70. package/lib/temporalDisplayPlanned.ts +71 -0
  71. package/lib/userGuideCopy.ts +121 -47
  72. package/next.config.ts +7 -0
  73. package/package.json +12 -24
  74. package/server/actionDispatch.ts +1000 -77
  75. package/server/actionTaskSession.ts +337 -24
  76. package/server/db.ts +7 -15
  77. package/server/dbSchema.ts +24 -0
  78. package/server/defaultCfg.ts +5 -0
  79. package/server/gitlabTokenStore.ts +0 -12
  80. package/server/liveHistorySync.ts +53 -0
  81. package/server/mainTimerHydrate.ts +38 -2
  82. package/server/payloadStore.ts +33 -11
  83. package/server/sessionWallHydrate.ts +66 -3
  84. package/server/userActionLog.ts +126 -0
  85. package/sonar-project.properties +11 -0
  86. package/tsconfig.json +2 -1
  87. package/components/dashboard/IssuePickerModal.tsx +0 -168
  88. package/components/dashboard/ThemeToggle.test.tsx +0 -26
  89. package/lib/backupCsvExport.test.ts +0 -149
  90. package/lib/dashboardQuickSearchQuery.test.ts +0 -63
  91. package/lib/dataDir.test.ts +0 -87
  92. package/lib/formatIsoShort.test.ts +0 -46
  93. package/lib/kronoFocusRhythm.test.ts +0 -130
  94. package/lib/kronoFocusTimerUrgency.test.ts +0 -74
  95. package/lib/legacyKronoFocusStorageKeys.test.ts +0 -29
  96. package/lib/reportingAggregate.test.ts +0 -325
  97. package/lib/reportingNonFinalIndicators.test.ts +0 -157
  98. package/lib/reportingTagWeekBreakdown.test.ts +0 -141
  99. package/lib/reportingWeekLayout.test.ts +0 -239
  100. package/lib/sessionAssiduity.test.ts +0 -25
  101. package/lib/sessionEndWarnings.test.ts +0 -200
  102. package/lib/sessionListMerge.test.ts +0 -101
  103. package/lib/sessionTaskSidebarStats.test.ts +0 -24
  104. package/lib/taskParsing.test.ts +0 -153
  105. package/lib/usageProfile.test.ts +0 -84
  106. package/server/actionDispatch.test.ts +0 -723
  107. package/server/actionTaskSession.test.ts +0 -713
  108. package/server/kronoFocusHydrate.test.ts +0 -142
  109. package/server/kronoFocusMigrate.test.ts +0 -53
  110. package/server/mainTimerHydrate.test.ts +0 -65
  111. package/server/payloadStore.test.ts +0 -78
  112. package/server/sessionWallHydrate.test.ts +0 -46
@@ -85,6 +85,17 @@ export type SettingsCopy = {
85
85
  dangerClearHistoryBackupCsvStoreBlobs: string;
86
86
  dangerClearHistoryBackupSqlite: string;
87
87
  dangerClearHistoryBackupSqliteHint: string;
88
+ dangerBackupRestoreTitle: string;
89
+ dangerBackupRestoreIntro: string;
90
+ dangerRestorePickFile: string;
91
+ dangerRestoreHint: string;
92
+ dangerRestoreButton: string;
93
+ dangerRestoreBusy: string;
94
+ dangerRestoreConfirm: string;
95
+ dangerRestoreNoFile: string;
96
+ dangerRestoreDoneJson: string;
97
+ dangerRestoreDoneSqlite: string;
98
+ dangerRestoreFailed: string;
88
99
  sectionArchivedSessions: string;
89
100
  archivedSessionsIntro: string;
90
101
  archivesPaginationPrev: string;
@@ -111,6 +122,24 @@ export type SettingsCopy = {
111
122
  devDataHiddenNotDev: string;
112
123
  sectionWorkspaceLoc: string;
113
124
  sectionTagsProjects: string;
125
+ sectionTaskTemplates: string;
126
+ taskTemplatesIntro: string;
127
+ taskTemplatesHelpAria: string;
128
+ taskTemplatesHelpBody: string;
129
+ taskTemplatesEmpty: string;
130
+ taskTemplatesDraftPlaceholder: string;
131
+ taskTemplatesAddBtn: string;
132
+ taskTemplatesSavedToast: string;
133
+ taskTemplatesRemovedToast: string;
134
+ taskTemplatesUpdatedToast: string;
135
+ taskTemplatesColDraft: string;
136
+ taskTemplatesColUpdated: string;
137
+ taskTemplatesColActions: string;
138
+ taskTemplatesEditBtn: string;
139
+ taskTemplatesSaveBtn: string;
140
+ taskTemplatesCancelBtn: string;
141
+ taskTemplatesDeleteBtn: string;
142
+ taskTemplatesDeleteConfirm: string;
114
143
  tagsProjectsIntro: string;
115
144
  tagsProjectsHelpAria: string;
116
145
  /** Aide longue : impact masquage / épingle / projets (sauts de ligne possibles). */
@@ -152,6 +181,10 @@ export type SettingsCopy = {
152
181
  tagPurgeHiddenConfirm: string;
153
182
  /** aria-label : effacer une étiquette masquée et toute sa métadonnée. */
154
183
  tagPurgeHiddenAriaLabel: string;
184
+ tagRenameBtn: string;
185
+ tagRenamePrompt: string;
186
+ tagRenameImpactConfirm: string;
187
+ renameImpactDontShowAgain: string;
155
188
  tagUnpinConfirm: string;
156
189
  tagExcludeConfirm: string;
157
190
  projectsHeading: string;
@@ -160,7 +193,13 @@ export type SettingsCopy = {
160
193
  /** `aria-label` du (?) à côté de « Projets enregistrés » (intro + suppression). */
161
194
  projectsHelpAria: string;
162
195
  projectsHelpBody: string;
196
+ projectsAddFieldLabel: string;
197
+ projectsAddPlaceholder: string;
198
+ projectsAddBtn: string;
163
199
  projectsTableProjectCol: string;
200
+ projectsRenameBtn: string;
201
+ projectsRenamePrompt: string;
202
+ projectRenameImpactConfirm: string;
164
203
  /** aria-label : effacer le projet et les métadonnées associées (étiquettes scoped, etc.). */
165
204
  projectsRemoveBtn: string;
166
205
  /** Confirmation pour l’effacement complet d’un projet. */
@@ -182,6 +221,13 @@ export type SettingsCopy = {
182
221
  tagStartTaskConflictParallelBtn: string;
183
222
  /** Case à cocher : mémoriser le choix pour les prochains démarrages. */
184
223
  tagStartTaskConflictDontShowAgain: string;
224
+ tagsScopeToolHeading: string;
225
+ tagsScopeToolSourceLabel: string;
226
+ tagsScopeToolTargetProjectLabel: string;
227
+ tagsScopeToolTargetGlobalOption: string;
228
+ tagsScopeToolCopyBtn: string;
229
+ tagsScopeToolMoveBtn: string;
230
+ tagsScopeToolNoTags: string;
185
231
  tagsEmptyGlobal: string;
186
232
  tagsByProjectSectionEmpty: string;
187
233
  tagsByProjectSubEmpty: string;
@@ -370,6 +416,9 @@ export type SettingsCopy = {
370
416
  dashboardClockFormatDesc: string;
371
417
  dashboardClock24hOption: string;
372
418
  dashboardClock12hOption: string;
419
+ /** Gabarit du nom initial des nouvelles sessions (`%%`, `%UUID`, strftime). */
420
+ dashboardDefaultSessionNameTemplate: string;
421
+ dashboardDefaultSessionNameTemplateDesc: string;
373
422
  /** Erreur de validation du fuseau (IANA inconnu). */
374
423
  invalidDashboardTimeZone: string;
375
424
  /** Sommaire : sous-entrée sous « Tableau de bord web ». */
@@ -390,7 +439,11 @@ export type SettingsCopy = {
390
439
  tagsProjectsTabGlobal: string;
391
440
  /** Onglet 2 : projets enregistrés + étiquettes liées par projet. */
392
441
  tagsProjectsTabProjects: string;
442
+ /** Onglet 3 : modèles de tâche enregistrés. */
443
+ tagsProjectsTabTemplates: string;
393
444
  tocSubSessionDurationAlert: string;
445
+ /** Sommaire : gabarit du nom de session. */
446
+ tocSubDefaultSessionNameTemplate: string;
394
447
  dashboardSessionDurationAlertHours: string;
395
448
  dashboardSessionDurationAlertHoursDesc: string;
396
449
  dashboardTourBlockTitle: string;
@@ -455,10 +508,10 @@ const en: SettingsCopy = {
455
508
  "Shows controls to edit a session start time from the Sessions column for the live session or a historical session.",
456
509
  dashboardAllowTaskEndTimeEdit: "Allow task end-time correction in the dashboard",
457
510
  dashboardAllowTaskEndTimeEditDesc:
458
- "Shows controls to edit the end time of a completed task in the Tasks column (start time can be edited separately).",
511
+ "Shows controls to set or edit task end time in the Tasks column, including while a task is running (the task completes automatically when that planned end is reached).",
459
512
  dashboardAllowSessionEndTimeEdit: "Allow session end-time correction in the dashboard",
460
513
  dashboardAllowSessionEndTimeEditDesc:
461
- "Shows controls to edit a session end time in the Sessions column when the session is already finished (start time can be edited separately).",
514
+ "Shows controls to set or edit a session end time in the Sessions column, including while a live session is open (the session closes automatically when that planned end is reached).",
462
515
  sectionCollection: "Collection & buffers",
463
516
  sectionHistory: "Session history",
464
517
  sectionDangerZone: "Danger zone",
@@ -505,6 +558,22 @@ const en: SettingsCopy = {
505
558
  dangerClearHistoryBackupCsvStoreBlobs: "Config & snapshots — `cfg`, Git stats, workspace LOC, UI prefs",
506
559
  dangerClearHistoryBackupSqlite: "SQLite — database file",
507
560
  dangerClearHistoryBackupSqliteHint: "Raw kronosys.sqlite after a WAL checkpoint (restore by replacing the file when the app is stopped).",
561
+ dangerBackupRestoreTitle: "Backups and full restore",
562
+ dangerBackupRestoreIntro:
563
+ "Download a full backup first, then restore from a previous backup file when needed (JSON snapshot or SQLite file).",
564
+ dangerRestorePickFile: "Restore file (`.json` or `.sqlite`)",
565
+ dangerRestoreHint:
566
+ "Restoring replaces the current local store on this machine. Create a backup right before restoring if you are unsure.",
567
+ dangerRestoreButton: "Restore from backup…",
568
+ dangerRestoreBusy: "Restoring…",
569
+ dangerRestoreConfirm:
570
+ "Restore this backup file now? The current local data store will be replaced for this environment.",
571
+ dangerRestoreNoFile: "Choose a backup file before starting restore.",
572
+ dangerRestoreDoneJson:
573
+ "Restore completed from JSON snapshot. The dashboard data has been reloaded.",
574
+ dangerRestoreDoneSqlite:
575
+ "Restore completed from SQLite file. The dashboard data has been reloaded.",
576
+ dangerRestoreFailed: "Restore failed: {detail}",
508
577
  sectionArchivedSessions: "Archived sessions",
509
578
  archivedSessionsIntro:
510
579
  "Sessions hidden from the main dashboard list, newest first. Restore adds them back to the Sessions column.",
@@ -533,6 +602,26 @@ const en: SettingsCopy = {
533
602
  devDataHiddenNotDev: "This block is only shown when the dashboard is served in development mode (`next dev`).",
534
603
  sectionWorkspaceLoc: "Reporting — workspace code snapshot",
535
604
  sectionTagsProjects: "Tags & saved projects",
605
+ sectionTaskTemplates: "Task templates",
606
+ taskTemplatesIntro:
607
+ "Saved lines for the “what are you working on” field (title, optional #tags and @project). You can still save a template from an active or completed task on the dashboard.",
608
+ taskTemplatesHelpAria: "Help: task templates",
609
+ taskTemplatesHelpBody:
610
+ "Templates only prefill the task draft — they do not start a timer or change recorded tasks.\n\nUse the same syntax as on the dashboard: a title, optional #tags, optional @project. Editing or deleting a template does not modify existing sessions or tasks.",
611
+ taskTemplatesEmpty: "No task templates yet. Add one above or save one from the dashboard.",
612
+ taskTemplatesDraftPlaceholder: "e.g. Deep work #focus @acme",
613
+ taskTemplatesAddBtn: "Add template",
614
+ taskTemplatesSavedToast: "Task template saved.",
615
+ taskTemplatesRemovedToast: "Task template removed.",
616
+ taskTemplatesUpdatedToast: "Task template updated.",
617
+ taskTemplatesColDraft: "Template",
618
+ taskTemplatesColUpdated: "Updated",
619
+ taskTemplatesColActions: "Actions",
620
+ taskTemplatesEditBtn: "Edit template",
621
+ taskTemplatesSaveBtn: "Save changes",
622
+ taskTemplatesCancelBtn: "Cancel",
623
+ taskTemplatesDeleteBtn: "Delete template",
624
+ taskTemplatesDeleteConfirm: "Remove this task template from the saved list?",
536
625
  tagsProjectsIntro:
537
626
  "Manage global tags, saved projects, and project-linked tags separately. The same controls appear in the right column on the main dashboard. Actions here do not bulk-edit tasks or session files.",
538
627
  tagsProjectsHelpAria: "Help: impact of tag and project changes",
@@ -569,6 +658,11 @@ const en: SettingsCopy = {
569
658
  tagPurgeHiddenConfirm:
570
659
  "Remove this tag from the hidden list and clear its description? If tasks still use it, it can show again in shortcuts. Tasks are not modified.",
571
660
  tagPurgeHiddenAriaLabel: "Permanently delete this hidden tag’s metadata",
661
+ tagRenameBtn: "Rename tag",
662
+ tagRenamePrompt: "New tag name",
663
+ tagRenameImpactConfirm:
664
+ "Rename this tag everywhere? Reporting and historical task breakdowns will now use the new name. Existing sessions and task entries will be updated.",
665
+ renameImpactDontShowAgain: "Remember this choice and don’t show again",
572
666
  tagUnpinConfirm: "Remove this tag from your pinned list? It may still appear if used on tasks.",
573
667
  tagExcludeConfirm:
574
668
  "Hide this tag from dashboard shortcuts? Task and session data are not changed; existing tasks keep the tag and reporting can still count it.",
@@ -577,7 +671,14 @@ const en: SettingsCopy = {
577
671
  projectsHelpAria: "Help: saved projects",
578
672
  projectsHelpBody:
579
673
  "Deleting a project (trash icon) removes it from the saved list, clears its description, and purges metadata for tags stored as Project#… for that project. Tasks are not modified; any task that still references @project keeps it.",
674
+ projectsAddFieldLabel: "Add a project",
675
+ projectsAddPlaceholder: "e.g. ClientABC",
676
+ projectsAddBtn: "Add project",
580
677
  projectsTableProjectCol: "Project",
678
+ projectsRenameBtn: "Rename project",
679
+ projectsRenamePrompt: "New project name",
680
+ projectRenameImpactConfirm:
681
+ "Rename this project everywhere? Reporting by project and historical task breakdowns will now use the new name. Existing sessions and task entries will be updated.",
581
682
  projectsRemoveBtn: "Delete project and related tag metadata",
582
683
  projectRemoveConfirm:
583
684
  "Permanently delete this project’s metadata? It will be removed from the saved list, its description cleared, and pinned/hidden/description data for tags in the form Project#… under this project will be removed. Tasks are not modified.",
@@ -596,6 +697,13 @@ const en: SettingsCopy = {
596
697
  tagStartTaskConflictParallelBtn: "Start in parallel (keep timers running)",
597
698
  tagStartTaskConflictDontShowAgain:
598
699
  "Remember this choice and don’t show this dialog again (the same action will run automatically next time).",
700
+ tagsScopeToolHeading: "Tag scope migration",
701
+ tagsScopeToolSourceLabel: "Source tag",
702
+ tagsScopeToolTargetProjectLabel: "Target project scope",
703
+ tagsScopeToolTargetGlobalOption: "Global (no project)",
704
+ tagsScopeToolCopyBtn: "Copy to target scope",
705
+ tagsScopeToolMoveBtn: "Move to target scope",
706
+ tagsScopeToolNoTags: "No known tag available to migrate yet.",
599
707
  tagsEmptyGlobal: "No global tags in shortcuts yet. Pin one above or add #tags on tasks.",
600
708
  tagsByProjectSectionEmpty: "No project-linked tags in shortcuts yet. Use @Project#code on a task or pin one below.",
601
709
  tagsByProjectSubEmpty: "No linked tag for this project in shortcuts yet.",
@@ -621,7 +729,9 @@ const en: SettingsCopy = {
621
729
  tagsProjectsTabsAriaLabel: "Tags column sections",
622
730
  tagsProjectsTabGlobal: "Global tags",
623
731
  tagsProjectsTabProjects: "Projects & linked tags",
732
+ tagsProjectsTabTemplates: "Task templates",
624
733
  tocSubSessionDurationAlert: "Session duration alert",
734
+ tocSubDefaultSessionNameTemplate: "Default session name",
625
735
  dashboardSessionDurationAlertHours: "Session duration alert (hours)",
626
736
  dashboardSessionDurationAlertHoursDesc:
627
737
  "Wall-clock session duration in the dashboard sidebar: when it reaches this many hours or more, the value is shown in red with a slow blink. Default: 24. Range: 1–8760.",
@@ -823,6 +933,9 @@ const en: SettingsCopy = {
823
933
  "How times are shown on the dashboard (task start/end, past-task date preview) and in schedule time previews. Dates are unchanged.",
824
934
  dashboardClock24hOption: "24-hour",
825
935
  dashboardClock12hOption: "12-hour (AM/PM)",
936
+ dashboardDefaultSessionNameTemplate: "Default new session name template",
937
+ dashboardDefaultSessionNameTemplateDesc:
938
+ "Applied when a brand-new live session is created (dashboard “New session”, or the implicit session when the first task starts with no session yet). Leave empty to leave the name blank. Tokens: `%%` for a literal percent; `%UUID` for the full session id; `%Y` `%y` `%m` `%d` `%H` `%M` `%S` plus `%F` (same as `%Y-%m-%d`) follow POSIX strftime semantics (IEEE / Open Group reference: https://pubs.opengroup.org/onlinepubs/9699919799/functions/strftime.html). Note: `%m` is the month; `%M` is minutes. Expansion uses the Display time zone chosen above (consistent with dashboard reporting day buckets).",
826
939
  invalidDashboardTimeZone: "Unrecognized time zone. Enter a valid IANA name (e.g. America/Toronto).",
827
940
  dialogOkBtn: "OK",
828
941
  dialogCancelBtn: "Cancel",
@@ -883,11 +996,11 @@ const fr: SettingsCopy = {
883
996
  dashboardAllowTaskEndTimeEdit:
884
997
  "Autoriser la correction de l’heure de fin des tâches dans le tableau de bord",
885
998
  dashboardAllowTaskEndTimeEditDesc:
886
- "Affiche des contrôles pour modifier l’heure de fin d’une tâche déjà terminée dans la colonne Tâches (l’heure de début se règle à part).",
999
+ "Affiche des contrôles pour définir ou modifier l’heure de fin d’une tâche dans la colonne Tâches, y compris pendant son exécution (la tâche se termine automatiquement à l’heure planifiée).",
887
1000
  dashboardAllowSessionEndTimeEdit:
888
1001
  "Autoriser la correction de l’heure de fin des sessions dans le tableau de bord",
889
1002
  dashboardAllowSessionEndTimeEditDesc:
890
- "Affiche des contrôles pour modifier l’heure de fin d’une session déjà terminée dans la colonne Sessions (l’heure de début se règle à part).",
1003
+ "Affiche des contrôles pour définir ou modifier l’heure de fin d’une session dans la colonne Sessions, y compris sur une session live (la session se clôt automatiquement à l’heure planifiée).",
891
1004
  sectionCollection: "Collecte et tampons",
892
1005
  sectionHistory: "Historique des sessions",
893
1006
  sectionDangerZone: "Zone de danger",
@@ -935,6 +1048,23 @@ const fr: SettingsCopy = {
935
1048
  dangerClearHistoryBackupSqlite: "SQLite — fichier de base de données",
936
1049
  dangerClearHistoryBackupSqliteHint:
937
1050
  "Fichier kronosys.sqlite après pointage WAL (restauration en remplaçant le fichier à l’arrêt de l’application).",
1051
+ dangerBackupRestoreTitle: "Sauvegardes et restauration complète",
1052
+ dangerBackupRestoreIntro:
1053
+ "Téléchargez d’abord une sauvegarde complète, puis restaurez un fichier de sauvegarde antérieur au besoin (instantané JSON ou fichier SQLite).",
1054
+ dangerRestorePickFile: "Fichier de restauration (`.json` ou `.sqlite`)",
1055
+ dangerRestoreHint:
1056
+ "La restauration remplace le stockage local courant sur cette machine. Faites une sauvegarde juste avant si vous avez un doute.",
1057
+ dangerRestoreButton: "Restaurer depuis une sauvegarde…",
1058
+ dangerRestoreBusy: "Restauration…",
1059
+ dangerRestoreConfirm:
1060
+ "Restaurer ce fichier de sauvegarde maintenant ? Le stockage local courant sera remplacé pour cet environnement.",
1061
+ dangerRestoreNoFile:
1062
+ "Choisissez un fichier de sauvegarde avant de lancer la restauration.",
1063
+ dangerRestoreDoneJson:
1064
+ "Restauration terminée depuis l’instantané JSON. Les données du tableau de bord ont été rechargées.",
1065
+ dangerRestoreDoneSqlite:
1066
+ "Restauration terminée depuis le fichier SQLite. Les données du tableau de bord ont été rechargées.",
1067
+ dangerRestoreFailed: "Échec de la restauration : {detail}",
938
1068
  sectionArchivedSessions: "Sessions archivées",
939
1069
  archivedSessionsIntro:
940
1070
  "Sessions retirées de la liste principale du tableau de bord, triées par enregistrement le plus récent. Restaurer les réintègre dans la colonne Sessions.",
@@ -964,6 +1094,26 @@ const fr: SettingsCopy = {
964
1094
  devDataHiddenNotDev: "Ce bloc s’affiche seulement lorsque le tableau de bord est servi en mode développement (`next dev`).",
965
1095
  sectionWorkspaceLoc: "Rapports — instantané lignes de code",
966
1096
  sectionTagsProjects: "Étiquettes et projets enregistrés",
1097
+ sectionTaskTemplates: "Modèles de tâche",
1098
+ taskTemplatesIntro:
1099
+ "Lignes enregistrées pour le champ « sur quoi travaillez-vous » (titre, #étiquettes et @projet facultatifs). Vous pouvez aussi enregistrer un modèle depuis une tâche en cours ou terminée sur le tableau de bord.",
1100
+ taskTemplatesHelpAria: "Aide : modèles de tâche",
1101
+ taskTemplatesHelpBody:
1102
+ "Les modèles ne font que préremplir le brouillon de tâche — ils ne démarrent pas le minuteur ni ne modifient les enregistrements existants.\n\nMême syntaxe que sur le tableau de bord : un titre, des #étiquettes facultatives, un @projet facultatif. Modifier ou supprimer un modèle ne change pas les sessions ou tâches déjà saisies.",
1103
+ taskTemplatesEmpty: "Aucun modèle de tâche. Ajoutez-en un ci-dessus ou enregistrez-en un depuis le tableau de bord.",
1104
+ taskTemplatesDraftPlaceholder: "ex. Travail profond #focus @acme",
1105
+ taskTemplatesAddBtn: "Ajouter le modèle",
1106
+ taskTemplatesSavedToast: "Modèle de tâche enregistré.",
1107
+ taskTemplatesRemovedToast: "Modèle de tâche supprimé.",
1108
+ taskTemplatesUpdatedToast: "Modèle de tâche mis à jour.",
1109
+ taskTemplatesColDraft: "Modèle",
1110
+ taskTemplatesColUpdated: "Mis à jour",
1111
+ taskTemplatesColActions: "Actions",
1112
+ taskTemplatesEditBtn: "Modifier le modèle",
1113
+ taskTemplatesSaveBtn: "Enregistrer",
1114
+ taskTemplatesCancelBtn: "Annuler",
1115
+ taskTemplatesDeleteBtn: "Supprimer le modèle",
1116
+ taskTemplatesDeleteConfirm: "Retirer ce modèle de la liste enregistrée ?",
967
1117
  tagsProjectsIntro:
968
1118
  "Gérez à part les étiquettes globales, les projets enregistrés et les étiquettes liées regroupées par projet. Les mêmes contrôles sont disponibles dans la colonne de droite du tableau de bord. Ces actions ne réécrivent pas en masse les tâches ni les fichiers de session.",
969
1119
  tagsProjectsHelpAria: "Aide : impact des changements d’étiquettes et de projets",
@@ -1000,6 +1150,11 @@ const fr: SettingsCopy = {
1000
1150
  tagPurgeHiddenConfirm:
1001
1151
  "Retirer cette étiquette de la liste masquée et effacer sa description ? Si des tâches l’utilisent encore, elle peut réapparaître dans les raccourcis. Les tâches ne sont pas modifiées.",
1002
1152
  tagPurgeHiddenAriaLabel: "Supprimer définitivement les métadonnées de cette étiquette masquée",
1153
+ tagRenameBtn: "Renommer l’étiquette",
1154
+ tagRenamePrompt: "Nouveau nom de l’étiquette",
1155
+ tagRenameImpactConfirm:
1156
+ "Renommer cette étiquette partout ? Les rapports et les ventilations historiques des tâches utiliseront désormais le nouveau nom. Les sessions et entrées de tâches existantes seront mises à jour.",
1157
+ renameImpactDontShowAgain: "Mémoriser ce choix et ne plus afficher",
1003
1158
  tagUnpinConfirm: "Retirer cette étiquette de la liste épinglée ? Elle peut réapparaître si des tâches l’utilisent encore.",
1004
1159
  tagExcludeConfirm:
1005
1160
  "Masquer cette étiquette des raccourcis du tableau de bord ? Les données des tâches et sessions ne sont pas modifiées ; les tâches existantes gardent l’étiquette et les bilans peuvent encore la compter.",
@@ -1008,7 +1163,14 @@ const fr: SettingsCopy = {
1008
1163
  projectsHelpAria: "Aide : projets enregistrés",
1009
1164
  projectsHelpBody:
1010
1165
  "La suppression (icône corbeille) retire le projet de la liste enregistrée, efface sa description et purge les métadonnées des étiquettes enregistrées sous la forme Projet#… pour ce projet. Les tâches ne sont pas modifiées.",
1166
+ projectsAddFieldLabel: "Ajouter un projet",
1167
+ projectsAddPlaceholder: "ex. ClientABC",
1168
+ projectsAddBtn: "Ajouter le projet",
1011
1169
  projectsTableProjectCol: "Projet",
1170
+ projectsRenameBtn: "Renommer le projet",
1171
+ projectsRenamePrompt: "Nouveau nom du projet",
1172
+ projectRenameImpactConfirm:
1173
+ "Renommer ce projet partout ? Les rapports par projet et les ventilations historiques des tâches utiliseront désormais le nouveau nom. Les sessions et entrées de tâches existantes seront mises à jour.",
1012
1174
  projectsRemoveBtn: "Supprimer le projet et les métadonnées d’étiquettes liées",
1013
1175
  projectRemoveConfirm:
1014
1176
  "Supprimer définitivement les métadonnées de ce projet ? Il sera retiré de la liste enregistrée, sa description effacée, et les données épinglées / masquées / descriptions des étiquettes Projet#… sous ce projet seront supprimées. Les tâches ne sont pas modifiées.",
@@ -1027,6 +1189,13 @@ const fr: SettingsCopy = {
1027
1189
  tagStartTaskConflictParallelBtn: "Démarrer en parallèle (garder les minuteurs)",
1028
1190
  tagStartTaskConflictDontShowAgain:
1029
1191
  "Mémoriser ce choix et ne plus afficher cette boîte (la même action sera appliquée automatiquement la prochaine fois).",
1192
+ tagsScopeToolHeading: "Migration de portée des étiquettes",
1193
+ tagsScopeToolSourceLabel: "Étiquette source",
1194
+ tagsScopeToolTargetProjectLabel: "Portée projet cible",
1195
+ tagsScopeToolTargetGlobalOption: "Globale (sans projet)",
1196
+ tagsScopeToolCopyBtn: "Copier vers la portée cible",
1197
+ tagsScopeToolMoveBtn: "Déplacer vers la portée cible",
1198
+ tagsScopeToolNoTags: "Aucune étiquette connue à migrer pour le moment.",
1030
1199
  tagsEmptyGlobal:
1031
1200
  "Aucune étiquette globale dans les raccourcis pour l’instant. Épinglez-en une ci-dessus ou utilisez des #tags sur les tâches.",
1032
1201
  tagsByProjectSectionEmpty:
@@ -1055,7 +1224,9 @@ const fr: SettingsCopy = {
1055
1224
  tagsProjectsTabsAriaLabel: "Sections de la colonne étiquettes",
1056
1225
  tagsProjectsTabGlobal: "Étiquettes globales",
1057
1226
  tagsProjectsTabProjects: "Projets et étiquettes liées",
1227
+ tagsProjectsTabTemplates: "Modèles de tâche",
1058
1228
  tocSubSessionDurationAlert: "Alerte durée de session",
1229
+ tocSubDefaultSessionNameTemplate: "Nom de session par défaut",
1059
1230
  dashboardSessionDurationAlertHours: "Seuil d’alerte durée de session (heures)",
1060
1231
  dashboardSessionDurationAlertHoursDesc:
1061
1232
  "Durée murale de session (panneau latéral du tableau de bord) : dès qu’elle atteint ce nombre d’heures (ou plus), la valeur s’affiche en rouge avec un clignotement lent. Défaut : 24. Plage : 1–8760.",
@@ -1263,6 +1434,9 @@ const fr: SettingsCopy = {
1263
1434
  "Affichage des heures sur le tableau de bord (début et fin des tâches, aperçu des dates de tâches passées) et dans les aperçus des sélecteurs d’heure du calendrier. Les dates ne changent pas.",
1264
1435
  dashboardClock24hOption: "24 heures",
1265
1436
  dashboardClock12hOption: "12 heures (AM/PM)",
1437
+ dashboardDefaultSessionNameTemplate: "Gabarit du nom des nouvelles sessions",
1438
+ dashboardDefaultSessionNameTemplateDesc:
1439
+ "Renseigné lors du démarrage d’une nouvelle session active (commande « Nouvelle session » ou session implicite créée par la première tâche). Laissez vide pour garder le champ vide. Séquences : `%%` pour un pourcentage littéral ; `%UUID` pour l’identifiant complet de session ; `%Y` `%y` `%m` `%d` `%H` `%M` `%S` ainsi que `%F` (équivalent `%Y-%m-%d`) suivent la sémantique de `strftime()` POSIX (référence IEEE / Open Group : https://pubs.opengroup.org/onlinepubs/9699919799/functions/strftime.html). Attention : `%m` est le mois ; `%M` représente les minutes. Les valeurs utilisent le fuseau d’affichage choisi ci-dessus (cohérent avec les regroupements quotidiens des rapports).",
1266
1440
  invalidDashboardTimeZone: "Fuseau horaire non reconnu. Saisissez un nom IANA valide (ex. America/Toronto).",
1267
1441
  dialogOkBtn: "OK",
1268
1442
  dialogCancelBtn: "Annuler",