@taskforcehq/taskforce 0.3.311 → 0.3.313

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 (454) hide show
  1. package/README.md +40 -2
  2. package/dist/TaskforceCore.js +1 -1
  3. package/dist/components/features/InitiativesModule.js +1 -1
  4. package/dist/components/features/TaskSettings.js +1 -1
  5. package/dist/components/views/StandaloneLayout.js +3 -6
  6. package/dist/components/views/standalone/modals/AccountHubModal.d.ts +1 -2
  7. package/dist/components/views/standalone/modals/AccountHubModal.js +2 -3
  8. package/dist/components/views/standalone/modals/HelpModal.js +15 -2
  9. package/dist/hooks/useFilterSort.js +1 -1
  10. package/dist/hooks/useTaskforce.js +2 -2
  11. package/dist/hooks/workspace/useTaskforceWorkspaceBootstrap.js +5 -2
  12. package/dist/ui/assets/{AgentsModule-D8u9P5dZ.js → AgentsModule-BULqIo8e.js} +1 -1
  13. package/dist/ui/assets/{AnnotatedAttachmentWorkspace-CsUauFA2.js → AnnotatedAttachmentWorkspace-DHr4rHK9.js} +1 -1
  14. package/dist/ui/assets/{ContextAttachmentManager-DbQvDHFz.js → ContextAttachmentManager-DoMe2OpY.js} +1 -1
  15. package/dist/ui/assets/{DocumentWorkspace-BmTkN1A8.js → DocumentWorkspace-DumBWhvb.js} +1 -1
  16. package/dist/ui/assets/{EntityActivityTimeline-BXHTM-Nh.js → EntityActivityTimeline-sHk8Nzbq.js} +1 -1
  17. package/dist/ui/assets/{InitiativesModule-D33RyXx0.js → InitiativesModule-3X9UNzHh.js} +1 -1
  18. package/dist/ui/assets/{PlansPage-D0RXlT9_.js → PlansPage-C3A3EYaV.js} +1 -1
  19. package/dist/ui/assets/{TaskContextUpload-Vsg67lpR.js → TaskContextUpload-C8G7pWkX.js} +1 -1
  20. package/dist/ui/assets/{TaskSettings-DshLw7_d.js → TaskSettings-DM1o9Wla.js} +2 -2
  21. package/dist/ui/assets/{WorkflowsModule-CLM-1BnF.js → WorkflowsModule-CW0crzvD.js} +1 -1
  22. package/dist/ui/assets/documentReferences-BZB3nMRb.js +1 -0
  23. package/dist/ui/assets/index-BWFQ9mGn.js +5 -0
  24. package/dist/ui/assets/{index-DOR9PRqt.css → index-DcK_8tuE.css} +1 -1
  25. package/dist/ui/index.html +2 -2
  26. package/package.json +12 -4
  27. package/scripts/postinstall.js +4 -3
  28. package/dist/TaskforceCore.CategoryFallback.test.d.ts +0 -1
  29. package/dist/TaskforceCore.CategoryFallback.test.js +0 -101
  30. package/dist/TaskforceCore.filter-persistence.test.d.ts +0 -1
  31. package/dist/TaskforceCore.filter-persistence.test.js +0 -402
  32. package/dist/TaskforceCore.routing.test.d.ts +0 -1
  33. package/dist/TaskforceCore.routing.test.js +0 -311
  34. package/dist/TaskforceCore.test.d.ts +0 -1
  35. package/dist/TaskforceCore.test.js +0 -7910
  36. package/dist/TaskforceWidget.test.d.ts +0 -1
  37. package/dist/TaskforceWidget.test.js +0 -92
  38. package/dist/UnsavedChangesRelaxed.test.d.ts +0 -1
  39. package/dist/UnsavedChangesRelaxed.test.js +0 -16
  40. package/dist/__tests__/localizationCatalogs.test.d.ts +0 -1
  41. package/dist/__tests__/localizationCatalogs.test.js +0 -54
  42. package/dist/__tests__/workflowSimulation.test.d.ts +0 -1
  43. package/dist/__tests__/workflowSimulation.test.js +0 -113
  44. package/dist/annotatedAttachments/AnnotatedAttachmentSessionStore.test.d.ts +0 -1
  45. package/dist/annotatedAttachments/AnnotatedAttachmentSessionStore.test.js +0 -278
  46. package/dist/annotatedAttachments/payload.test.d.ts +0 -1
  47. package/dist/annotatedAttachments/payload.test.js +0 -67
  48. package/dist/compat/workspaceSyncCompat.test.d.ts +0 -1
  49. package/dist/compat/workspaceSyncCompat.test.js +0 -124
  50. package/dist/components/features/AgentsModule.test.d.ts +0 -1
  51. package/dist/components/features/AgentsModule.test.js +0 -601
  52. package/dist/components/features/AnnotatedAttachmentWorkspace.test.d.ts +0 -1
  53. package/dist/components/features/AnnotatedAttachmentWorkspace.test.js +0 -2883
  54. package/dist/components/features/DocumentWorkspace.test.d.ts +0 -1
  55. package/dist/components/features/DocumentWorkspace.test.js +0 -1439
  56. package/dist/components/features/TaskSettings.test.d.ts +0 -1
  57. package/dist/components/features/TaskSettings.test.js +0 -1674
  58. package/dist/components/features/settings/TaxonomyLibraryManager.test.d.ts +0 -1
  59. package/dist/components/features/settings/TaxonomyLibraryManager.test.js +0 -141
  60. package/dist/components/task/TaskActionHeader.test.d.ts +0 -1
  61. package/dist/components/task/TaskActionHeader.test.js +0 -91
  62. package/dist/components/task/TaskCard.test.d.ts +0 -1
  63. package/dist/components/task/TaskCard.test.js +0 -513
  64. package/dist/components/task/TaskContextUpload.test.d.ts +0 -1
  65. package/dist/components/task/TaskContextUpload.test.js +0 -506
  66. package/dist/components/task/TaskForm.test.d.ts +0 -1
  67. package/dist/components/task/TaskForm.test.js +0 -946
  68. package/dist/components/task/TaskKanban.empty-column-drop.test.d.ts +0 -1
  69. package/dist/components/task/TaskKanban.empty-column-drop.test.js +0 -66
  70. package/dist/components/task/TaskKanban.planning-drop.test.d.ts +0 -1
  71. package/dist/components/task/TaskKanban.planning-drop.test.js +0 -93
  72. package/dist/components/task/TaskKanban.test.d.ts +0 -1
  73. package/dist/components/task/TaskKanban.test.js +0 -99
  74. package/dist/components/task/TaskList.test.d.ts +0 -1
  75. package/dist/components/task/TaskList.test.js +0 -473
  76. package/dist/components/task/TaskStatusActions.test.d.ts +0 -1
  77. package/dist/components/task/TaskStatusActions.test.js +0 -54
  78. package/dist/components/task/taskKanbanDropRules.test.d.ts +0 -1
  79. package/dist/components/task/taskKanbanDropRules.test.js +0 -114
  80. package/dist/components/ui/LevelSelector.test.d.ts +0 -1
  81. package/dist/components/ui/LevelSelector.test.js +0 -55
  82. package/dist/components/ui/Markdown.test.d.ts +0 -1
  83. package/dist/components/ui/Markdown.test.js +0 -38
  84. package/dist/components/ui/MultiSelectFilter.test.d.ts +0 -1
  85. package/dist/components/ui/MultiSelectFilter.test.js +0 -74
  86. package/dist/components/ui/TaxonomyDropdown.test.d.ts +0 -1
  87. package/dist/components/ui/TaxonomyDropdown.test.js +0 -130
  88. package/dist/components/ui/TopNoticeLayer.test.d.ts +0 -1
  89. package/dist/components/ui/TopNoticeLayer.test.js +0 -25
  90. package/dist/components/views/AppShellHeader.test.d.ts +0 -1
  91. package/dist/components/views/AppShellHeader.test.js +0 -42
  92. package/dist/components/views/PlanComparisonPage.test.d.ts +0 -1
  93. package/dist/components/views/PlanComparisonPage.test.js +0 -758
  94. package/dist/components/views/PlansPage.test.d.ts +0 -1
  95. package/dist/components/views/PlansPage.test.js +0 -710
  96. package/dist/components/views/chrome/WorkspaceChromeSections.test.d.ts +0 -1
  97. package/dist/components/views/chrome/WorkspaceChromeSections.test.js +0 -54
  98. package/dist/components/views/chrome/workspaceChrome.test.d.ts +0 -1
  99. package/dist/components/views/chrome/workspaceChrome.test.js +0 -52
  100. package/dist/components/views/panels/DocumentFilterToolbar.test.d.ts +0 -1
  101. package/dist/components/views/panels/DocumentFilterToolbar.test.js +0 -19
  102. package/dist/components/views/panels/FilterToolbar.test.d.ts +0 -1
  103. package/dist/components/views/panels/FilterToolbar.test.js +0 -47
  104. package/dist/components/views/panels/PlanningDrawer.test.d.ts +0 -1
  105. package/dist/components/views/panels/PlanningDrawer.test.js +0 -529
  106. package/dist/components/views/planningScope.test.d.ts +0 -1
  107. package/dist/components/views/planningScope.test.js +0 -60
  108. package/dist/components/views/standalone/modals/AccountHubModal.test.d.ts +0 -1
  109. package/dist/components/views/standalone/modals/AccountHubModal.test.js +0 -72
  110. package/dist/components/views/standalone/modals/HelpModal.test.d.ts +0 -1
  111. package/dist/components/views/standalone/modals/HelpModal.test.js +0 -23
  112. package/dist/components/views/standalone/modals/SyncEnableWarningModal.test.d.ts +0 -1
  113. package/dist/components/views/standalone/modals/SyncEnableWarningModal.test.js +0 -24
  114. package/dist/components/views/teamManagementAccess.test.d.ts +0 -1
  115. package/dist/components/views/teamManagementAccess.test.js +0 -44
  116. package/dist/config/deployment.test.d.ts +0 -1
  117. package/dist/config/deployment.test.js +0 -90
  118. package/dist/config/envSchema.test.d.ts +0 -1
  119. package/dist/config/envSchema.test.js +0 -125
  120. package/dist/core/AiProfileService.test.d.ts +0 -1
  121. package/dist/core/AiProfileService.test.js +0 -184
  122. package/dist/core/AiProfiles.test.d.ts +0 -1
  123. package/dist/core/AiProfiles.test.js +0 -1873
  124. package/dist/core/AuthTokenService.test.d.ts +0 -1
  125. package/dist/core/AuthTokenService.test.js +0 -78
  126. package/dist/core/BulkUpdateFieldsPreview.test.d.ts +0 -1
  127. package/dist/core/BulkUpdateFieldsPreview.test.js +0 -62
  128. package/dist/core/CompletedAt.test.d.ts +0 -1
  129. package/dist/core/CompletedAt.test.js +0 -44
  130. package/dist/core/CreatedBy.test.d.ts +0 -1
  131. package/dist/core/CreatedBy.test.js +0 -188
  132. package/dist/core/DeletedTaskTrash.test.d.ts +0 -1
  133. package/dist/core/DeletedTaskTrash.test.js +0 -104
  134. package/dist/core/EntitlementsPolicy.test.d.ts +0 -1
  135. package/dist/core/EntitlementsPolicy.test.js +0 -280
  136. package/dist/core/GlobalSettingsService.test.d.ts +0 -1
  137. package/dist/core/GlobalSettingsService.test.js +0 -45
  138. package/dist/core/JsonBackupRuntime.test.d.ts +0 -1
  139. package/dist/core/JsonBackupRuntime.test.js +0 -155
  140. package/dist/core/PlanFeatureCatalog.test.d.ts +0 -1
  141. package/dist/core/PlanFeatureCatalog.test.js +0 -139
  142. package/dist/core/PlanVersionPolicy.test.d.ts +0 -1
  143. package/dist/core/PlanVersionPolicy.test.js +0 -236
  144. package/dist/core/PlanningEntities.test.d.ts +0 -1
  145. package/dist/core/PlanningEntities.test.js +0 -509
  146. package/dist/core/ScheduleFields.test.d.ts +0 -1
  147. package/dist/core/ScheduleFields.test.js +0 -193
  148. package/dist/core/SetupState.test.d.ts +0 -1
  149. package/dist/core/SetupState.test.js +0 -113
  150. package/dist/core/SignupMonetizationSettings.test.d.ts +0 -1
  151. package/dist/core/SignupMonetizationSettings.test.js +0 -515
  152. package/dist/core/Stats.test.d.ts +0 -1
  153. package/dist/core/Stats.test.js +0 -36
  154. package/dist/core/SystemAdmin.test.d.ts +0 -1
  155. package/dist/core/SystemAdmin.test.js +0 -1106
  156. package/dist/core/TaskActivitySync.test.d.ts +0 -1
  157. package/dist/core/TaskActivitySync.test.js +0 -90
  158. package/dist/core/TaskAttachmentsCanonical.test.d.ts +0 -1
  159. package/dist/core/TaskAttachmentsCanonical.test.js +0 -356
  160. package/dist/core/TaskAuditTimeline.test.d.ts +0 -1
  161. package/dist/core/TaskAuditTimeline.test.js +0 -319
  162. package/dist/core/TaskTaxonomyValidation.test.d.ts +0 -1
  163. package/dist/core/TaskTaxonomyValidation.test.js +0 -440
  164. package/dist/core/Taskforce.ids.test.d.ts +0 -1
  165. package/dist/core/Taskforce.ids.test.js +0 -611
  166. package/dist/core/Taskforce.listTasksSlim.test.d.ts +0 -1
  167. package/dist/core/Taskforce.listTasksSlim.test.js +0 -91
  168. package/dist/core/Taskforce.mcpAuth.test.d.ts +0 -1
  169. package/dist/core/Taskforce.mcpAuth.test.js +0 -450
  170. package/dist/core/Taskforce.realtimeMutation.test.d.ts +0 -1
  171. package/dist/core/Taskforce.realtimeMutation.test.js +0 -131
  172. package/dist/core/UserProfileAvatarDrafts.test.d.ts +0 -1
  173. package/dist/core/UserProfileAvatarDrafts.test.js +0 -138
  174. package/dist/core/WorkspaceDelete.test.d.ts +0 -1
  175. package/dist/core/WorkspaceDelete.test.js +0 -159
  176. package/dist/core/WorkspacePermissions.test.d.ts +0 -1
  177. package/dist/core/WorkspacePermissions.test.js +0 -270
  178. package/dist/core/WorkspacePlanMode.test.d.ts +0 -1
  179. package/dist/core/WorkspacePlanMode.test.js +0 -383
  180. package/dist/core/WorkspaceSyncSettings.test.d.ts +0 -1
  181. package/dist/core/WorkspaceSyncSettings.test.js +0 -65
  182. package/dist/core/__tests__/TaskAttachmentsCanonical.test.d.ts +0 -1
  183. package/dist/core/__tests__/TaskAttachmentsCanonical.test.js +0 -212
  184. package/dist/documentReviews/DocumentReviewSessionStore.test.d.ts +0 -1
  185. package/dist/documentReviews/DocumentReviewSessionStore.test.js +0 -127
  186. package/dist/hooks/authGuardPolicy.test.d.ts +0 -1
  187. package/dist/hooks/authGuardPolicy.test.js +0 -76
  188. package/dist/hooks/bootstrapTimeouts.test.d.ts +0 -1
  189. package/dist/hooks/bootstrapTimeouts.test.js +0 -12
  190. package/dist/hooks/sync/controlPlane.test.d.ts +0 -1
  191. package/dist/hooks/sync/controlPlane.test.js +0 -121
  192. package/dist/hooks/sync/lifecyclePolicy.test.d.ts +0 -1
  193. package/dist/hooks/sync/lifecyclePolicy.test.js +0 -124
  194. package/dist/hooks/sync/orchestratorShared.test.d.ts +0 -1
  195. package/dist/hooks/sync/orchestratorShared.test.js +0 -98
  196. package/dist/hooks/sync/pullLifecycle.test.d.ts +0 -1
  197. package/dist/hooks/sync/pullLifecycle.test.js +0 -80
  198. package/dist/hooks/sync/recovery.test.d.ts +0 -1
  199. package/dist/hooks/sync/recovery.test.js +0 -292
  200. package/dist/hooks/sync/transfers.test.d.ts +0 -1
  201. package/dist/hooks/sync/transfers.test.js +0 -928
  202. package/dist/hooks/sync/useRecentSyncEvents.test.d.ts +0 -1
  203. package/dist/hooks/sync/useRecentSyncEvents.test.js +0 -124
  204. package/dist/hooks/sync/useSyncStatusActions.test.d.ts +0 -1
  205. package/dist/hooks/sync/useSyncStatusActions.test.js +0 -133
  206. package/dist/hooks/sync/useSyncStatusControls.test.d.ts +0 -1
  207. package/dist/hooks/sync/useSyncStatusControls.test.js +0 -88
  208. package/dist/hooks/useFilterSort.test.d.ts +0 -1
  209. package/dist/hooks/useFilterSort.test.js +0 -419
  210. package/dist/hooks/useRealtimeSync.test.d.ts +0 -1
  211. package/dist/hooks/useRealtimeSync.test.js +0 -311
  212. package/dist/hooks/useSyncOrchestrator.aiProfiles.test.d.ts +0 -1
  213. package/dist/hooks/useSyncOrchestrator.aiProfiles.test.js +0 -54
  214. package/dist/hooks/useSyncOrchestrator.context-assets.test.d.ts +0 -1
  215. package/dist/hooks/useSyncOrchestrator.context-assets.test.js +0 -228
  216. package/dist/hooks/useSyncOrchestrator.retry-closure.test.d.ts +0 -1
  217. package/dist/hooks/useSyncOrchestrator.retry-closure.test.js +0 -2027
  218. package/dist/hooks/useTaskData.test.d.ts +0 -1
  219. package/dist/hooks/useTaskData.test.js +0 -291
  220. package/dist/hooks/useTaskMutations.test.d.ts +0 -1
  221. package/dist/hooks/useTaskMutations.test.js +0 -256
  222. package/dist/hooks/useTaskforce.contract.test.d.ts +0 -1
  223. package/dist/hooks/useTaskforce.contract.test.js +0 -7
  224. package/dist/hooks/useTaskforce.priority-filters.test.d.ts +0 -1
  225. package/dist/hooks/useTaskforce.priority-filters.test.js +0 -28
  226. package/dist/hooks/useTaskforce.runtime-routing.test.d.ts +0 -1
  227. package/dist/hooks/useTaskforce.runtime-routing.test.js +0 -246
  228. package/dist/hooks/useTaskforce.sync-behavior.test.d.ts +0 -1
  229. package/dist/hooks/useTaskforce.sync-behavior.test.js +0 -3644
  230. package/dist/hooks/useWorkspaceSyncController.test.d.ts +0 -1
  231. package/dist/hooks/useWorkspaceSyncController.test.js +0 -192
  232. package/dist/hooks/workspace/useTaskforceApiRouting.test.d.ts +0 -1
  233. package/dist/hooks/workspace/useTaskforceApiRouting.test.js +0 -77
  234. package/dist/hooks/workspace/workspaceLocalState.test.d.ts +0 -1
  235. package/dist/hooks/workspace/workspaceLocalState.test.js +0 -59
  236. package/dist/localization/localizationCatalogs.test.d.ts +0 -1
  237. package/dist/localization/localizationCatalogs.test.js +0 -37
  238. package/dist/mcp/aiProfileBootstrap.test.d.ts +0 -1
  239. package/dist/mcp/aiProfileBootstrap.test.js +0 -68
  240. package/dist/mcp/canonicalAssetHelpers.test.d.ts +0 -1
  241. package/dist/mcp/canonicalAssetHelpers.test.js +0 -67
  242. package/dist/mcp/clientIntegrations.test.d.ts +0 -1
  243. package/dist/mcp/clientIntegrations.test.js +0 -219
  244. package/dist/mcp/optionResolution.test.d.ts +0 -1
  245. package/dist/mcp/optionResolution.test.js +0 -43
  246. package/dist/mcp/runtime.test.d.ts +0 -1
  247. package/dist/mcp/runtime.test.js +0 -5211
  248. package/dist/mcp/structuredCommentValidation.test.d.ts +0 -1
  249. package/dist/mcp/structuredCommentValidation.test.js +0 -31
  250. package/dist/mcp/structuredDocValidation.test.d.ts +0 -1
  251. package/dist/mcp/structuredDocValidation.test.js +0 -35
  252. package/dist/mcp/toolRegistry.test.d.ts +0 -1
  253. package/dist/mcp/toolRegistry.test.js +0 -34
  254. package/dist/migrations/billingSchemaParity.test.d.ts +0 -1
  255. package/dist/migrations/billingSchemaParity.test.js +0 -160
  256. package/dist/migrations/taskSchemaMigrations.test.d.ts +0 -1
  257. package/dist/migrations/taskSchemaMigrations.test.js +0 -225
  258. package/dist/qaOpen.test.d.ts +0 -1
  259. package/dist/qaOpen.test.js +0 -56
  260. package/dist/releaseVersion.test.d.ts +0 -1
  261. package/dist/releaseVersion.test.js +0 -32
  262. package/dist/runtime/appGates.test.d.ts +0 -1
  263. package/dist/runtime/appGates.test.js +0 -42
  264. package/dist/server/aiProfileAvatarAssets.test.d.ts +0 -1
  265. package/dist/server/aiProfileAvatarAssets.test.js +0 -213
  266. package/dist/server/annotatedAttachmentsRoutes.test.d.ts +0 -1
  267. package/dist/server/annotatedAttachmentsRoutes.test.js +0 -532
  268. package/dist/server/auth.test.d.ts +0 -1
  269. package/dist/server/auth.test.js +0 -131
  270. package/dist/server/buildInfo.test.d.ts +0 -1
  271. package/dist/server/buildInfo.test.js +0 -29
  272. package/dist/server/cors.test.d.ts +0 -1
  273. package/dist/server/cors.test.js +0 -77
  274. package/dist/server/documentReviewRoutes.test.d.ts +0 -1
  275. package/dist/server/documentReviewRoutes.test.js +0 -190
  276. package/dist/server/email.test.d.ts +0 -1
  277. package/dist/server/email.test.js +0 -113
  278. package/dist/server/index.cookieProxy.test.d.ts +0 -1
  279. package/dist/server/index.cookieProxy.test.js +0 -67
  280. package/dist/server/index.rateLimit.test.d.ts +0 -1
  281. package/dist/server/index.rateLimit.test.js +0 -22
  282. package/dist/server/index.test.d.ts +0 -1
  283. package/dist/server/index.test.js +0 -283
  284. package/dist/server/rateLimit.test.d.ts +0 -1
  285. package/dist/server/rateLimit.test.js +0 -107
  286. package/dist/server/realtimeSync.auth.test.d.ts +0 -1
  287. package/dist/server/realtimeSync.auth.test.js +0 -62
  288. package/dist/server/realtimeSync.replay.test.d.ts +0 -1
  289. package/dist/server/realtimeSync.replay.test.js +0 -192
  290. package/dist/server/realtimeSync.workspaceIsolation.test.d.ts +0 -1
  291. package/dist/server/realtimeSync.workspaceIsolation.test.js +0 -101
  292. package/dist/server/routes/billing.test.d.ts +0 -1
  293. package/dist/server/routes/billing.test.js +0 -3515
  294. package/dist/server/routes/shared.test.d.ts +0 -1
  295. package/dist/server/routes/shared.test.js +0 -32
  296. package/dist/server/routes/sync.integration.test.d.ts +0 -1
  297. package/dist/server/routes/sync.integration.test.js +0 -2932
  298. package/dist/server/routes/syncAuxRoutes.test.d.ts +0 -1
  299. package/dist/server/routes/syncAuxRoutes.test.js +0 -158
  300. package/dist/server/routes/syncRouteGuards.test.d.ts +0 -1
  301. package/dist/server/routes/syncRouteGuards.test.js +0 -94
  302. package/dist/server/routes.test.d.ts +0 -1
  303. package/dist/server/routes.test.js +0 -15612
  304. package/dist/server/runtimeMode.test.d.ts +0 -1
  305. package/dist/server/runtimeMode.test.js +0 -26
  306. package/dist/server/securityHeaders.test.d.ts +0 -1
  307. package/dist/server/securityHeaders.test.js +0 -70
  308. package/dist/services/templateEngine.test.d.ts +0 -1
  309. package/dist/services/templateEngine.test.js +0 -150
  310. package/dist/services/templates.test.d.ts +0 -1
  311. package/dist/services/templates.test.js +0 -45
  312. package/dist/services/workflowDocumentFixtures.test.d.ts +0 -1
  313. package/dist/services/workflowDocumentFixtures.test.js +0 -78
  314. package/dist/services/workflowExportMatrix.test.d.ts +0 -1
  315. package/dist/services/workflowExportMatrix.test.js +0 -113
  316. package/dist/services/workflowExportSnapshots.test.d.ts +0 -1
  317. package/dist/services/workflowExportSnapshots.test.js +0 -30
  318. package/dist/services/workflowGeneration.test.d.ts +0 -1
  319. package/dist/services/workflowGeneration.test.js +0 -12
  320. package/dist/services/workflowSimulation.test.d.ts +0 -1
  321. package/dist/services/workflowSimulation.test.js +0 -113
  322. package/dist/services/workflowV2Policy.test.d.ts +0 -1
  323. package/dist/services/workflowV2Policy.test.js +0 -80
  324. package/dist/shared/customTaxonomyLibrary.test.d.ts +0 -1
  325. package/dist/shared/customTaxonomyLibrary.test.js +0 -20
  326. package/dist/shared/passwordPolicy.test.d.ts +0 -1
  327. package/dist/shared/passwordPolicy.test.js +0 -34
  328. package/dist/shared/runtimeContract.test.d.ts +0 -1
  329. package/dist/shared/runtimeContract.test.js +0 -23
  330. package/dist/shared/taxonomyLibrary.test.d.ts +0 -1
  331. package/dist/shared/taxonomyLibrary.test.js +0 -26
  332. package/dist/shared/taxonomyState.test.d.ts +0 -1
  333. package/dist/shared/taxonomyState.test.js +0 -71
  334. package/dist/soak/preflight.cli.d.ts +0 -1
  335. package/dist/soak/preflight.cli.js +0 -28
  336. package/dist/soak/preflight.d.ts +0 -26
  337. package/dist/soak/preflight.js +0 -113
  338. package/dist/soak/preflight.test.d.ts +0 -1
  339. package/dist/soak/preflight.test.js +0 -39
  340. package/dist/storage/objectStorageClient.test.d.ts +0 -1
  341. package/dist/storage/objectStorageClient.test.js +0 -82
  342. package/dist/storage/objectStorageConfig.test.d.ts +0 -1
  343. package/dist/storage/objectStorageConfig.test.js +0 -50
  344. package/dist/storage/postgresAdapter.test.d.ts +0 -1
  345. package/dist/storage/postgresAdapter.test.js +0 -29
  346. package/dist/storage/workspaceAssetStore.test.d.ts +0 -1
  347. package/dist/storage/workspaceAssetStore.test.js +0 -588
  348. package/dist/sync/cloudSyncApi.test.d.ts +0 -1
  349. package/dist/sync/cloudSyncApi.test.js +0 -111
  350. package/dist/sync/collaborationSyncPayload.test.d.ts +0 -1
  351. package/dist/sync/collaborationSyncPayload.test.js +0 -125
  352. package/dist/sync/contentSyncPayload.test.d.ts +0 -1
  353. package/dist/sync/contentSyncPayload.test.js +0 -143
  354. package/dist/sync/encryptionService.test.d.ts +0 -1
  355. package/dist/sync/encryptionService.test.js +0 -52
  356. package/dist/sync/planningSyncPayload.test.d.ts +0 -1
  357. package/dist/sync/planningSyncPayload.test.js +0 -92
  358. package/dist/sync/realtimeFeature.test.d.ts +0 -1
  359. package/dist/sync/realtimeFeature.test.js +0 -30
  360. package/dist/sync/realtimeReconcile.test.d.ts +0 -1
  361. package/dist/sync/realtimeReconcile.test.js +0 -43
  362. package/dist/sync/syncApplyHandlers.test.d.ts +0 -1
  363. package/dist/sync/syncApplyHandlers.test.js +0 -626
  364. package/dist/sync/syncService.test.d.ts +0 -1
  365. package/dist/sync/syncService.test.js +0 -903
  366. package/dist/sync/taskSyncPayload.test.d.ts +0 -1
  367. package/dist/sync/taskSyncPayload.test.js +0 -54
  368. package/dist/sync/workspacePullFeed.test.d.ts +0 -1
  369. package/dist/sync/workspacePullFeed.test.js +0 -438
  370. package/dist/sync/workspaceSyncModel.test.d.ts +0 -1
  371. package/dist/sync/workspaceSyncModel.test.js +0 -1442
  372. package/dist/test/setup.d.ts +0 -1
  373. package/dist/test/setup.js +0 -15
  374. package/dist/ui/assets/documentReferences-BPWp6ce0.js +0 -1
  375. package/dist/ui/assets/index-zvbo2Jse.js +0 -5
  376. package/dist/utils/accountProfileSummaryCache.test.d.ts +0 -1
  377. package/dist/utils/accountProfileSummaryCache.test.js +0 -63
  378. package/dist/utils/annotatedAttachments.test.d.ts +0 -1
  379. package/dist/utils/annotatedAttachments.test.js +0 -108
  380. package/dist/utils/assignees.test.d.ts +0 -1
  381. package/dist/utils/assignees.test.js +0 -25
  382. package/dist/utils/avatarUpload.test.d.ts +0 -1
  383. package/dist/utils/avatarUpload.test.js +0 -40
  384. package/dist/utils/canonicalAssetKind.test.d.ts +0 -1
  385. package/dist/utils/canonicalAssetKind.test.js +0 -24
  386. package/dist/utils/coalescedRefresh.test.d.ts +0 -1
  387. package/dist/utils/coalescedRefresh.test.js +0 -30
  388. package/dist/utils/constants.icons.test.d.ts +0 -1
  389. package/dist/utils/constants.icons.test.js +0 -41
  390. package/dist/utils/planParser.test.d.ts +0 -1
  391. package/dist/utils/planParser.test.js +0 -183
  392. package/dist/utils/planningReferences.test.d.ts +0 -1
  393. package/dist/utils/planningReferences.test.js +0 -17
  394. package/dist/utils/supportContact.test.d.ts +0 -1
  395. package/dist/utils/supportContact.test.js +0 -19
  396. package/dist/utils/syncEventDetails.test.d.ts +0 -1
  397. package/dist/utils/syncEventDetails.test.js +0 -23
  398. package/dist/utils/syncEventPresentation.test.d.ts +0 -1
  399. package/dist/utils/syncEventPresentation.test.js +0 -64
  400. package/dist/utils/syncStatusPresentation.test.d.ts +0 -1
  401. package/dist/utils/syncStatusPresentation.test.js +0 -164
  402. package/dist/utils/taskActivity.test.d.ts +0 -1
  403. package/dist/utils/taskActivity.test.js +0 -218
  404. package/dist/utils/taskDraftDefaults.test.d.ts +0 -1
  405. package/dist/utils/taskDraftDefaults.test.js +0 -34
  406. package/dist/utils/taskDragZones.test.d.ts +0 -1
  407. package/dist/utils/taskDragZones.test.js +0 -14
  408. package/dist/utils/taskNormalization.test.d.ts +0 -1
  409. package/dist/utils/taskNormalization.test.js +0 -158
  410. package/dist/utils/taskSearch.test.d.ts +0 -1
  411. package/dist/utils/taskSearch.test.js +0 -69
  412. package/dist/utils/taskUtils.test.d.ts +0 -1
  413. package/dist/utils/taskUtils.test.js +0 -19
  414. package/dist/utils/taskforceApiClient.test.d.ts +0 -1
  415. package/dist/utils/taskforceApiClient.test.js +0 -44
  416. package/dist/utils/taxonomyFormDefaults.test.d.ts +0 -1
  417. package/dist/utils/taxonomyFormDefaults.test.js +0 -63
  418. package/dist/utils/uiNotice.test.d.ts +0 -1
  419. package/dist/utils/uiNotice.test.js +0 -18
  420. package/dist/utils/workspaceIdentity.test.d.ts +0 -1
  421. package/dist/utils/workspaceIdentity.test.js +0 -61
  422. package/dist/utils/workspaceLifecycle.test.d.ts +0 -1
  423. package/dist/utils/workspaceLifecycle.test.js +0 -64
  424. package/dist/utils/workspaceSyncPresentation.test.d.ts +0 -1
  425. package/dist/utils/workspaceSyncPresentation.test.js +0 -71
  426. package/scripts/bootstrap-playwright-auth.mjs +0 -155
  427. package/scripts/check-cloud-mcp.mjs +0 -83
  428. package/scripts/check-compat-boundaries.mjs +0 -41
  429. package/scripts/check-env.ts +0 -31
  430. package/scripts/check-localization-strings.mjs +0 -49
  431. package/scripts/check-runtime-boundaries.mjs +0 -44
  432. package/scripts/debug-global.mjs +0 -34
  433. package/scripts/debug-login.mjs +0 -32
  434. package/scripts/debug-server.mjs +0 -36
  435. package/scripts/deploy-prod.sh +0 -41
  436. package/scripts/deploy-staging.sh +0 -23
  437. package/scripts/export-sqlite-to-postgres.mjs +0 -123
  438. package/scripts/generate-env-example.ts +0 -8
  439. package/scripts/mcp-stdio-adapter.mjs +0 -160
  440. package/scripts/migrate-task-data-assets.mjs +0 -408
  441. package/scripts/playwright-auth.sh +0 -19
  442. package/scripts/qa-open-lib.mjs +0 -175
  443. package/scripts/qa-open-lib.mjs.d.ts +0 -49
  444. package/scripts/qa-open.mjs +0 -352
  445. package/scripts/release-version-lib.mjs +0 -88
  446. package/scripts/release-version.mjs +0 -72
  447. package/scripts/run-billing-performance-smoke.sh +0 -24
  448. package/scripts/run-dev-proxy.sh +0 -51
  449. package/scripts/run-e2e-realtime.sh +0 -30
  450. package/scripts/run-smoke.sh +0 -35
  451. package/scripts/run-soak.sh +0 -41
  452. package/scripts/test-global.js +0 -143
  453. package/scripts/update-homebrew-formula.sh +0 -108
  454. package/scripts/with-esbuild.sh +0 -11
@@ -1,473 +0,0 @@
1
- import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
2
- import { useState } from 'react';
3
- import { render, screen, waitFor } from '@testing-library/react';
4
- import userEvent from '@testing-library/user-event';
5
- import { describe, it, expect, vi } from 'vitest';
6
- import { TaskList } from './TaskList';
7
- // Mock child components
8
- vi.mock('../ui/MultiSelectFilter', () => ({
9
- MultiSelectFilter: ({ label, selected, onChange, options = [] }) => (_jsxs("div", { "data-testid": `filter-${label.toLowerCase()}`, children: [_jsxs("button", { onClick: () => onChange(['new-selection']), children: ["Change ", label] }), _jsxs("span", { children: ["Selected: ", selected.join(', ')] }), _jsxs("span", { children: ["Options: ", options.map((option) => option.label).join(', ')] })] }))
10
- }));
11
- vi.mock('../ui/Markdown', () => ({
12
- Markdown: ({ children }) => _jsxs("div", { children: ["Markdown: ", children] })
13
- }));
14
- describe('TaskList Component', () => {
15
- const defaultProps = {
16
- tasks: [],
17
- archivedTasks: [],
18
- categories: [
19
- { value: 'general', label: 'General', disabled: false },
20
- { value: 'backend', label: 'Backend', disabled: false }
21
- ],
22
- types: [{ value: 'feature', label: 'Feature' }],
23
- priorities: [{ value: 3, label: 'High' }],
24
- approaches: [],
25
- searchQuery: '',
26
- filterCategories: ['General'],
27
- filterTypes: [],
28
- filterPriorities: [],
29
- filterStatus: [],
30
- sortBy: 'created',
31
- sortOrder: 'desc',
32
- showArchive: false,
33
- collapsedCategories: {},
34
- filterTaxonomies: {},
35
- taxonomies: [],
36
- loadingTasks: false,
37
- filteredTasks: [],
38
- filteredArchive: [],
39
- groupedTasks: {},
40
- copiedId: null,
41
- onSearchChange: vi.fn(),
42
- onFilterCategoriesChange: vi.fn(),
43
- onFilterTypesChange: vi.fn(),
44
- onFilterPrioritiesChange: vi.fn(),
45
- onFilterStatusChange: vi.fn(),
46
- onTaxonomyFilterChange: vi.fn(),
47
- onSortByChange: vi.fn(),
48
- onSortOrderChange: vi.fn(),
49
- onShowArchiveChange: vi.fn(),
50
- onClearFilters: vi.fn(),
51
- onToggleCategory: vi.fn(),
52
- onEditTask: vi.fn(),
53
- onCopyId: vi.fn(),
54
- onToggleInProgress: vi.fn(),
55
- onToggleReview: vi.fn(),
56
- onToggleComplete: vi.fn(),
57
- onToggleCancel: vi.fn(),
58
- onArchiveTask: vi.fn(),
59
- onBulkArchive: vi.fn(),
60
- onUnarchive: vi.fn(),
61
- onDelete: vi.fn(),
62
- onFetchArchive: vi.fn(),
63
- getIconForType: () => _jsx("span", { children: "Icon" }),
64
- renderHighlighted: (text) => text,
65
- };
66
- const renderComponent = (props = {}) => {
67
- return render(_jsx(TaskList, { ...defaultProps, ...props }));
68
- };
69
- it('2.1 Renders filter controls', () => {
70
- renderComponent();
71
- expect(screen.getByPlaceholderText('Search tasks...')).toBeInTheDocument();
72
- expect(screen.getByTestId('filter-category')).toBeInTheDocument();
73
- expect(screen.getByTestId('filter-type')).toBeInTheDocument();
74
- // Check Sort By
75
- expect(screen.getByText('Sort By:')).toBeInTheDocument();
76
- });
77
- it('2.2 Search interaction', async () => {
78
- const user = userEvent.setup();
79
- renderComponent();
80
- const input = screen.getByPlaceholderText('Search tasks...');
81
- await user.type(input, 'fix');
82
- expect(defaultProps.onSearchChange).toHaveBeenCalled();
83
- });
84
- it('2.3 Clear search', async () => {
85
- const user = userEvent.setup();
86
- renderComponent({ searchQuery: 'test' });
87
- const clearBtn = screen.getByTitle('Clear search');
88
- await user.click(clearBtn);
89
- expect(defaultProps.onSearchChange).toHaveBeenCalledWith('');
90
- });
91
- it('2.4 Filter interactions', async () => {
92
- const user = userEvent.setup();
93
- renderComponent();
94
- // Interact with mocked filter
95
- const changeCatBtn = screen.getByText('Change Category');
96
- await user.click(changeCatBtn);
97
- expect(defaultProps.onFilterCategoriesChange).toHaveBeenCalledWith(['new-selection']);
98
- });
99
- it('2.4a Hides custom taxonomy filters when filter participation is disabled', () => {
100
- renderComponent({
101
- taxonomies: [
102
- {
103
- id: 'review-status',
104
- label: 'Review Status',
105
- widgetType: 'select',
106
- isSystem: false,
107
- multiSelect: false,
108
- filterEnabled: false,
109
- options: [{ value: 'pending', label: 'Pending', status: 'active' }]
110
- }
111
- ]
112
- });
113
- expect(screen.queryByTestId('filter-review status')).not.toBeInTheDocument();
114
- });
115
- it('2.4a1 Hides retired custom taxonomies from filters when no tasks use them', () => {
116
- renderComponent({
117
- taxonomies: [
118
- {
119
- id: 'review-status',
120
- label: 'Review Status',
121
- status: 'retired',
122
- widgetType: 'select',
123
- isSystem: false,
124
- multiSelect: false,
125
- filterEnabled: true,
126
- options: [{ value: 'pending', label: 'Pending', status: 'active' }]
127
- }
128
- ]
129
- });
130
- expect(screen.queryByTestId('filter-review status (retired)')).not.toBeInTheDocument();
131
- });
132
- it('2.4a2 Shows retired custom taxonomies in filters when tasks still use them', () => {
133
- renderComponent({
134
- tasks: [
135
- {
136
- id: 'legacy-review-task',
137
- title: 'Legacy Review Task',
138
- category: 'general',
139
- type: 'feature',
140
- priority: 3,
141
- description: null,
142
- createdAt: '',
143
- updatedAt: '',
144
- completed: false,
145
- cancelled: false,
146
- status: 'task',
147
- taxonomies: { 'review-status': 'pending' }
148
- }
149
- ],
150
- taxonomies: [
151
- {
152
- id: 'review-status',
153
- label: 'Review Status',
154
- status: 'retired',
155
- widgetType: 'select',
156
- isSystem: false,
157
- multiSelect: false,
158
- filterEnabled: true,
159
- options: [{ value: 'pending', label: 'Pending', status: 'active' }]
160
- }
161
- ],
162
- filterTaxonomies: { 'review-status': ['pending'] }
163
- });
164
- expect(screen.getByTestId('filter-review status (retired)')).toBeInTheDocument();
165
- });
166
- it('2.4aa Hides retired custom taxonomy options when no tasks use them', () => {
167
- renderComponent({
168
- taxonomies: [
169
- {
170
- id: 'review-status',
171
- label: 'Review Status',
172
- widgetType: 'select',
173
- isSystem: false,
174
- multiSelect: false,
175
- filterEnabled: true,
176
- options: [
177
- { value: 'pending', label: 'Pending', status: 'active' },
178
- { value: 'legacy', label: 'Legacy', status: 'retired' }
179
- ]
180
- }
181
- ],
182
- filterTaxonomies: { 'review-status': ['pending'] }
183
- });
184
- expect(screen.getByText('Options: Pending')).toBeInTheDocument();
185
- });
186
- it('2.4ab Shows retired custom taxonomy options in filters when tasks still use them', () => {
187
- renderComponent({
188
- tasks: [
189
- {
190
- id: 'legacy-review-task',
191
- title: 'Legacy Review Task',
192
- category: 'general',
193
- type: 'feature',
194
- priority: 3,
195
- description: null,
196
- createdAt: '',
197
- updatedAt: '',
198
- completed: false,
199
- cancelled: false,
200
- status: 'task',
201
- taxonomies: { 'review-status': 'legacy' }
202
- }
203
- ],
204
- taxonomies: [
205
- {
206
- id: 'review-status',
207
- label: 'Review Status',
208
- widgetType: 'select',
209
- isSystem: false,
210
- multiSelect: false,
211
- filterEnabled: true,
212
- options: [
213
- { value: 'pending', label: 'Pending', status: 'active' },
214
- { value: 'legacy', label: 'Legacy', status: 'retired' }
215
- ]
216
- }
217
- ],
218
- filterTaxonomies: { 'review-status': ['pending', 'legacy'] }
219
- });
220
- expect(screen.getByText('Options: Pending, Legacy (Retired)')).toBeInTheDocument();
221
- });
222
- it('2.4b Shows legacy categories in the filter when tasks still use them', () => {
223
- renderComponent({
224
- categories: [
225
- { value: 'default', label: 'General', disabled: false },
226
- { value: 'backend', label: 'Backend', disabled: true }
227
- ],
228
- tasks: [
229
- {
230
- id: 'legacy-task',
231
- title: 'Legacy Task',
232
- category: 'backend',
233
- type: 'feature',
234
- priority: 3,
235
- description: null,
236
- createdAt: '',
237
- updatedAt: '',
238
- completed: false,
239
- cancelled: false,
240
- status: 'task'
241
- }
242
- ],
243
- filterCategories: ['default', 'backend']
244
- });
245
- expect(screen.getByText('Options: General, Backend (Legacy)')).toBeInTheDocument();
246
- });
247
- it('2.4c Shows retired types in the filter when tasks still use them', () => {
248
- renderComponent({
249
- types: [
250
- { value: 'task', label: 'Task', status: 'active' },
251
- { value: 'issue', label: 'Issue', status: 'retired' }
252
- ],
253
- tasks: [
254
- {
255
- id: 'legacy-type-task',
256
- title: 'Legacy Type Task',
257
- category: 'general',
258
- type: 'issue',
259
- priority: 3,
260
- description: null,
261
- createdAt: '',
262
- updatedAt: '',
263
- completed: false,
264
- cancelled: false,
265
- status: 'task'
266
- }
267
- ],
268
- filterTypes: ['task', 'issue']
269
- });
270
- expect(screen.getByText('Options: Task, Issue (Retired)')).toBeInTheDocument();
271
- });
272
- it('2.5 Sorting', async () => {
273
- const user = userEvent.setup();
274
- renderComponent();
275
- const select = screen.getAllByRole('combobox')[0]; // Sort select
276
- await user.selectOptions(select, 'priority');
277
- expect(defaultProps.onSortByChange).toHaveBeenCalledWith('priority');
278
- });
279
- it('2.5a Shows enabled custom taxonomies in sort options', () => {
280
- renderComponent({
281
- taxonomies: [
282
- {
283
- id: 'track',
284
- label: 'Track',
285
- widgetType: 'select',
286
- isSystem: false,
287
- multiSelect: false,
288
- sortEnabled: true,
289
- options: [{ value: 'platform', label: 'Platform', status: 'active' }]
290
- },
291
- {
292
- id: 'channel',
293
- label: 'Channel',
294
- widgetType: 'select',
295
- isSystem: false,
296
- multiSelect: false,
297
- sortEnabled: false,
298
- options: [{ value: 'email', label: 'Email', status: 'active' }]
299
- }
300
- ]
301
- });
302
- expect(screen.getByRole('option', { name: 'Track' })).toBeInTheDocument();
303
- expect(screen.queryByRole('option', { name: 'Channel' })).not.toBeInTheDocument();
304
- });
305
- it('2.6 Clear filters', async () => {
306
- const user = userEvent.setup();
307
- renderComponent();
308
- const resetBtn = screen.getByTitle('Reset all filters');
309
- await user.click(resetBtn);
310
- expect(defaultProps.onClearFilters).toHaveBeenCalled();
311
- });
312
- it('2.7 Archive toggle', async () => {
313
- const user = userEvent.setup();
314
- renderComponent();
315
- const toggle = screen.getByLabelText('Archived');
316
- await user.click(toggle);
317
- expect(defaultProps.onShowArchiveChange).toHaveBeenCalledWith(true);
318
- expect(defaultProps.onFetchArchive).toHaveBeenCalled();
319
- });
320
- it('2.8 Renders grouped tasks', () => {
321
- const task = {
322
- id: '1', title: 'Test Task', category: 'General', type: 'feature',
323
- priority: 3, description: null,
324
- createdAt: '', updatedAt: '', completed: false, cancelled: false,
325
- status: 'task'
326
- };
327
- renderComponent({
328
- filteredTasks: [task],
329
- groupedTasks: { 'General': [task] }
330
- });
331
- // Category header
332
- expect(screen.getByText('General')).toBeInTheDocument();
333
- expect(screen.getByText('(1)')).toBeInTheDocument();
334
- // Task item
335
- expect(screen.getByText('Test Task')).toBeInTheDocument();
336
- });
337
- it('2.9 Collapse category', async () => {
338
- const user = userEvent.setup();
339
- const task = {
340
- id: '1', title: 'Test Task', category: 'General', type: 'feature',
341
- priority: 3, description: null,
342
- createdAt: '', updatedAt: '', completed: false, cancelled: false,
343
- status: 'task'
344
- };
345
- renderComponent({
346
- filteredTasks: [task],
347
- groupedTasks: { 'General': [task] },
348
- collapsedCategories: { 'General': false }
349
- });
350
- const titleEl = screen.getByText('General');
351
- await user.click(titleEl);
352
- expect(defaultProps.onToggleCategory).toHaveBeenCalledWith('General');
353
- });
354
- it('2.10 Task Actions - Edit', async () => {
355
- const user = userEvent.setup();
356
- const task = {
357
- id: '1', title: 'Test Task', category: 'General', type: 'feature',
358
- priority: 3, description: null,
359
- createdAt: '', updatedAt: '', completed: false, cancelled: false,
360
- status: 'task'
361
- };
362
- renderComponent({
363
- filteredTasks: [task],
364
- groupedTasks: { 'General': [task] }
365
- });
366
- await user.click(screen.getByText('Test Task'));
367
- expect(defaultProps.onEditTask).toHaveBeenCalledWith(task);
368
- });
369
- it('2.11 Task Actions - Buttons', async () => {
370
- const user = userEvent.setup();
371
- const task = {
372
- id: '1', title: 'Test Task', category: 'General', type: 'feature',
373
- priority: 3, description: null,
374
- createdAt: '', updatedAt: '', completed: false, cancelled: false,
375
- status: 'task'
376
- };
377
- renderComponent({
378
- filteredTasks: [task],
379
- groupedTasks: { 'General': [task] }
380
- });
381
- const statusSelect = screen.getByRole('combobox', { name: 'Status' });
382
- await user.click(statusSelect);
383
- await user.click(screen.getByRole('option', { name: 'Working' }));
384
- expect(defaultProps.onToggleInProgress).toHaveBeenCalledWith(task);
385
- await user.click(screen.getByRole('combobox', { name: 'Status' }));
386
- await user.click(screen.getByRole('option', { name: 'Done' }));
387
- expect(defaultProps.onToggleComplete).toHaveBeenCalledWith(task);
388
- });
389
- it('2.12 Empty state', () => {
390
- renderComponent({ filteredTasks: [], loadingTasks: false });
391
- expect(screen.getByText('No active tasks')).toBeInTheDocument();
392
- });
393
- it('shows a task-reference-specific empty state for unmatched searches', () => {
394
- renderComponent({ filteredTasks: [], loadingTasks: false, searchQuery: ' T - 123 ' });
395
- expect(screen.getByText('No task found for T-123')).toBeInTheDocument();
396
- });
397
- it('2.13 Loading state', () => {
398
- renderComponent({ loadingTasks: true });
399
- expect(screen.queryByText('No active tasks')).not.toBeInTheDocument();
400
- });
401
- it('2.14 Archive List', () => {
402
- const archivedTask = {
403
- id: '2', title: 'Archived Task', category: 'General', type: 'feature',
404
- priority: 1, description: null,
405
- createdAt: '', updatedAt: '', completed: true, cancelled: false,
406
- status: 'done'
407
- };
408
- renderComponent({
409
- showArchive: true,
410
- filteredArchive: [archivedTask]
411
- });
412
- expect(screen.getByText('Archived')).toBeInTheDocument();
413
- expect(screen.getByText(/Archived Task/)).toBeInTheDocument();
414
- });
415
- it('2.15 Bulk Archive', async () => {
416
- const user = userEvent.setup();
417
- const completedTask = {
418
- id: '1', title: 'Done Task', category: 'General', type: 'feature',
419
- priority: 3, description: null,
420
- createdAt: '', updatedAt: '', completed: true, cancelled: false,
421
- status: 'done'
422
- };
423
- renderComponent({
424
- tasks: [completedTask]
425
- });
426
- const bulkBtn = screen.getByTitle('Archive all completed and cancelled tasks');
427
- expect(bulkBtn).not.toBeDisabled();
428
- await user.click(bulkBtn);
429
- expect(defaultProps.onBulkArchive).toHaveBeenCalled();
430
- });
431
- it('2.16 Search does not show archive when archive toggle is off', () => {
432
- const archivedTask = {
433
- id: '2', title: 'Archived Match', category: 'General', type: 'feature',
434
- priority: 1, description: null,
435
- createdAt: '', updatedAt: '', completed: true, cancelled: false,
436
- status: 'done'
437
- };
438
- renderComponent({
439
- showArchive: false,
440
- searchQuery: 'match',
441
- filteredArchive: [archivedTask]
442
- });
443
- expect(screen.queryByText('Archived')).not.toBeInTheDocument();
444
- expect(screen.queryByText(/Archived Match/)).not.toBeInTheDocument();
445
- });
446
- it('2.17 Archived delete removes task immediately from archive view', async () => {
447
- const user = userEvent.setup();
448
- const archivedTask = {
449
- id: 'arch-1',
450
- title: 'Archived Immediate Remove',
451
- description: null,
452
- category: 'General',
453
- type: 'feature',
454
- priority: 1,
455
- createdAt: '',
456
- updatedAt: '',
457
- completed: true,
458
- cancelled: false,
459
- status: 'done',
460
- isArchived: true
461
- };
462
- const TestHarness = () => {
463
- const [archive, setArchive] = useState([archivedTask]);
464
- return (_jsx(TaskList, { ...defaultProps, showArchive: true, filteredArchive: archive, onDelete: (taskId) => setArchive((prev) => prev.filter((task) => task.id !== taskId)) }));
465
- };
466
- render(_jsx(TestHarness, {}));
467
- expect(screen.getByText(/Archived Immediate Remove/i)).toBeInTheDocument();
468
- await user.click(screen.getByTitle('Delete Permanently'));
469
- await waitFor(() => {
470
- expect(screen.queryByText(/Archived Immediate Remove/i)).not.toBeInTheDocument();
471
- });
472
- });
473
- });
@@ -1 +0,0 @@
1
- export {};
@@ -1,54 +0,0 @@
1
- import { jsx as _jsx } from "react/jsx-runtime";
2
- import { render, screen } from '@testing-library/react';
3
- import userEvent from '@testing-library/user-event';
4
- import { describe, expect, it, vi } from 'vitest';
5
- import { TaskStatusActions } from './TaskStatusActions';
6
- const makeTask = (overrides = {}) => ({
7
- id: 'task-1',
8
- title: 'Status Test',
9
- description: null,
10
- category: 'default',
11
- type: 'feature',
12
- priority: 2,
13
- status: 'task',
14
- createdAt: '2026-02-13T00:00:00.000Z',
15
- ...overrides
16
- });
17
- describe('TaskStatusActions', () => {
18
- it('renders the taxonomy dropdown with the current status', () => {
19
- render(_jsx(TaskStatusActions, { task: makeTask({ status: 'review' }) }));
20
- expect(screen.getByRole('combobox', { name: 'Status' })).toHaveTextContent('Review');
21
- });
22
- it('shows archive only for terminal statuses', () => {
23
- const { rerender } = render(_jsx(TaskStatusActions, { task: makeTask({ status: 'in-progress' }) }));
24
- expect(screen.queryByRole('button', { name: 'Archive task' })).not.toBeInTheDocument();
25
- rerender(_jsx(TaskStatusActions, { task: makeTask({ status: 'done' }) }));
26
- expect(screen.getByRole('button', { name: 'Archive task' })).toBeInTheDocument();
27
- });
28
- it('can render an unarchive action for archived read-only views', async () => {
29
- const user = userEvent.setup();
30
- const task = makeTask({ status: 'done' });
31
- const onUnarchiveTask = vi.fn();
32
- render(_jsx(TaskStatusActions, { task: task, archiveActionMode: "unarchive", onUnarchiveTask: onUnarchiveTask }));
33
- await user.click(screen.getByRole('button', { name: 'Unarchive task' }));
34
- expect(screen.queryByRole('button', { name: 'Archive task' })).not.toBeInTheDocument();
35
- expect(onUnarchiveTask).toHaveBeenCalledWith(task);
36
- });
37
- it('uses the compact short label when compressed', () => {
38
- render(_jsx(TaskStatusActions, { task: makeTask({ status: 'in-progress' }), compressed: true }));
39
- expect(screen.getByRole('combobox', { name: 'Status' })).toHaveTextContent('Working');
40
- });
41
- it('can hide the closed-state status label', () => {
42
- render(_jsx(TaskStatusActions, { task: makeTask({ status: 'review' }), showLabel: false }));
43
- expect(screen.getByRole('combobox', { name: 'Status' })).not.toHaveTextContent('Review');
44
- });
45
- it('calls onSetStatus when the dropdown changes', async () => {
46
- const user = userEvent.setup();
47
- const task = makeTask({ status: 'task' });
48
- const onSetStatus = vi.fn();
49
- render(_jsx(TaskStatusActions, { task: task, onSetStatus: onSetStatus }));
50
- await user.click(screen.getByRole('combobox', { name: 'Status' }));
51
- await user.click(screen.getByRole('option', { name: 'Review' }));
52
- expect(onSetStatus).toHaveBeenCalledWith(task, 'review');
53
- });
54
- });
@@ -1 +0,0 @@
1
- export {};
@@ -1,114 +0,0 @@
1
- import { describe, expect, it } from 'vitest';
2
- import { buildBacklogDropUpdates, buildScheduleDropResult, buildScheduledDayDropUpdates, buildStatusTransitionUpdates, } from './taskKanbanDropRules';
3
- const makeTask = (overrides = {}) => ({
4
- id: 'task-1',
5
- title: 'Task',
6
- description: null,
7
- category: 'default',
8
- type: 'feature',
9
- priority: 2,
10
- status: 'task',
11
- createdAt: '2026-01-01T00:00:00.000Z',
12
- ...overrides,
13
- });
14
- const toMap = (pairs) => new Map(pairs.map((pair) => [pair.taskId, pair.updates]));
15
- describe('taskKanbanDropRules', () => {
16
- it('reorders backlog tasks and recalculates orderInDay', () => {
17
- const activeTask = makeTask({ id: 'task-2' });
18
- const result = toMap(buildBacklogDropUpdates({
19
- activeTask,
20
- sourceColumnId: 'backlog',
21
- targetTasks: [makeTask({ id: 'task-1' }), makeTask({ id: 'task-3' })],
22
- sourceTasks: [makeTask({ id: 'task-1' }), makeTask({ id: 'task-3' })],
23
- insertAt: 1,
24
- }));
25
- expect(result.get('task-1')).toEqual({ orderInDay: 0 });
26
- expect(result.get('task-2')).toEqual({ orderInDay: 1 });
27
- expect(result.get('task-3')).toEqual({ orderInDay: 2 });
28
- });
29
- it('moving scheduled task to backlog clears scheduled fields', () => {
30
- const activeTask = makeTask({ id: 'task-2', scheduledDate: '2026-04-14', scheduledWeekKey: '2026-W16' });
31
- const result = toMap(buildBacklogDropUpdates({
32
- activeTask,
33
- sourceColumnId: 'mon',
34
- targetTasks: [makeTask({ id: 'task-1' })],
35
- sourceTasks: [],
36
- insertAt: 1,
37
- }));
38
- expect(result.get('task-2')).toEqual({
39
- scheduledDate: null,
40
- scheduledWeekKey: null,
41
- orderInDay: 1,
42
- });
43
- });
44
- it('moving task into a scheduled day sets scheduled fields and reindexes source column', () => {
45
- const activeTask = makeTask({ id: 'task-3' });
46
- const result = toMap(buildScheduledDayDropUpdates({
47
- activeTask,
48
- sourceColumnId: 'backlog',
49
- targetColumnId: 'mon',
50
- targetTasks: [makeTask({ id: 'task-1' })],
51
- sourceTasks: [makeTask({ id: 'task-2' })],
52
- insertAt: 1,
53
- scheduledDate: '2026-04-14',
54
- scheduledWeekKey: '2026-W16',
55
- }));
56
- expect(result.get('task-3')).toEqual({
57
- scheduledDate: '2026-04-14',
58
- scheduledWeekKey: '2026-W16',
59
- orderInDay: 1,
60
- });
61
- expect(result.get('task-2')).toEqual({ orderInDay: 0 });
62
- });
63
- it('blocks non-terminal tasks from being scheduled into the past', () => {
64
- const result = buildScheduleDropResult({
65
- activeTask: makeTask({ id: 'task-3', status: 'task' }),
66
- sourceColumnId: 'backlog',
67
- targetColumnId: 'mon',
68
- targetTasks: [],
69
- sourceTasks: [],
70
- overTaskId: null,
71
- isBelowOverItem: false,
72
- scheduleDates: {
73
- mon: '2026-04-13',
74
- tue: '2026-04-14',
75
- wed: '2026-04-15',
76
- thu: '2026-04-16',
77
- fri: '2026-04-17',
78
- sat: '2026-04-18',
79
- sun: '2026-04-19',
80
- },
81
- parseToIsoWeekKey: () => '2026-W16',
82
- todayDate: '2026-04-14',
83
- });
84
- expect(result).toEqual({ kind: 'blocked', reason: 'Only completed work can be scheduled in the past.' });
85
- });
86
- it('preserves cancelled grouping as a no-op for completed column drops', () => {
87
- const task = makeTask({ id: 'task-cancelled', status: 'cancelled', completedAt: '2026-04-01T00:00:00.000Z' });
88
- expect(buildStatusTransitionUpdates(task, 'completed', '2026-04-14T07:00:00.000Z')).toBeNull();
89
- });
90
- it('stamps completedAt when moving into completed', () => {
91
- const nowIso = '2026-04-14T07:00:00.000Z';
92
- const result = buildStatusTransitionUpdates(makeTask({ id: 'task-done' }), 'completed', nowIso);
93
- expect(result).toEqual({
94
- status: 'done',
95
- inProgress: false,
96
- readyForReview: false,
97
- completed: true,
98
- cancelled: false,
99
- completedAt: nowIso,
100
- });
101
- });
102
- it('resets review and progress flags when moving back to reviewable workflow states', () => {
103
- const nowIso = '2026-04-14T07:00:00.000Z';
104
- const result = buildStatusTransitionUpdates(makeTask({ id: 'task-review', status: 'done', inProgress: true, readyForReview: true, completed: true }), 'review', nowIso);
105
- expect(result).toEqual({
106
- status: 'review',
107
- inProgress: false,
108
- readyForReview: true,
109
- completed: false,
110
- cancelled: false,
111
- completedAt: null,
112
- });
113
- });
114
- });
@@ -1 +0,0 @@
1
- export {};