@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
@@ -8,13 +8,13 @@
8
8
  <link rel="icon" type="image/png" sizes="16x16" href="/favicon/favicon-16x16.png" />
9
9
  <link rel="apple-touch-icon" href="/taskforce/favicon/apple-touch-icon.png" />
10
10
  <title>Taskforce</title>
11
- <script type="module" crossorigin src="/taskforce/assets/index-zvbo2Jse.js"></script>
11
+ <script type="module" crossorigin src="/taskforce/assets/index-BWFQ9mGn.js"></script>
12
12
  <link rel="modulepreload" crossorigin href="/taskforce/assets/vendor-react-CKJs5o3c.js">
13
13
  <link rel="modulepreload" crossorigin href="/taskforce/assets/vendor-icons-CLnehDTw.js">
14
14
  <link rel="modulepreload" crossorigin href="/taskforce/assets/vendor-markdown-BUxTU7dS.js">
15
15
  <link rel="modulepreload" crossorigin href="/taskforce/assets/vendor-dnd-DRzYolkg.js">
16
16
  <link rel="modulepreload" crossorigin href="/taskforce/assets/vendor-router-BbWMxlnO.js">
17
- <link rel="stylesheet" crossorigin href="/taskforce/assets/index-DOR9PRqt.css">
17
+ <link rel="stylesheet" crossorigin href="/taskforce/assets/index-DcK_8tuE.css">
18
18
  </head>
19
19
  <body>
20
20
  <div id="root"></div>
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@taskforcehq/taskforce",
3
- "version": "0.3.311",
4
- "description": "Mission Command center for AI-powered task management (beta - under active development)",
3
+ "version": "0.3.313",
4
+ "description": "Shared task and planning workspace for humans collaborating with AI (public beta)",
5
5
  "author": "Taskforce HQ <hello@taskforcehq.ai> (https://taskforcehq.ai)",
6
6
  "license": "MIT",
7
7
  "repository": {
@@ -13,7 +13,7 @@
13
13
  "url": "https://github.com/taskforcehq/taskforce/issues"
14
14
  },
15
15
  "publishConfig": {
16
- "access": "restricted",
16
+ "access": "public",
17
17
  "registry": "https://registry.npmjs.org/"
18
18
  },
19
19
  "main": "dist/index.js",
@@ -24,8 +24,16 @@
24
24
  },
25
25
  "files": [
26
26
  "dist",
27
- "scripts",
27
+ "!dist/**/*.test.js",
28
+ "!dist/**/*.test.d.ts",
29
+ "!dist/**/__tests__/**",
30
+ "!dist/admin/**",
31
+ "!dist/site/**",
32
+ "!dist/soak/**",
33
+ "!dist/test/**",
28
34
  "README.md",
35
+ "scripts/generate-workflow-templates.mjs",
36
+ "scripts/postinstall.js",
29
37
  "src/resources/templates"
30
38
  ],
31
39
  "exports": {
@@ -44,17 +44,18 @@ try {
44
44
  if (projectRoot) {
45
45
  try {
46
46
  const projectPkg = JSON.parse(readFileSync(join(projectRoot, 'package.json'), 'utf-8'));
47
- if (projectPkg.dependencies && projectPkg.dependencies.taskforce) {
47
+ const dependencies = projectPkg.dependencies || {};
48
+ if (dependencies.taskforce || dependencies['@taskforcehq/taskforce']) {
48
49
  console.log('\x1b[33m\n⚠️ [Taskforce] Warning: Installed as a regular dependency.\x1b[0m');
49
50
  console.log('\x1b[33m Taskforce should be installed globally.\x1b[0m');
50
- console.log(' Run: \x1b[36mnpm install -g @taskforcehq/taskforce\x1b[0m to fix this.\n');
51
+ console.log(' Run: \x1b[36mnpm install --global @taskforcehq/taskforce\x1b[0m to fix this.\n');
51
52
  }
52
53
  } catch (err) {
53
54
  // Ignore errors checking project package.json
54
55
  }
55
56
  }
56
57
 
57
- console.log(`Run \x1b[36mnpx @taskforcehq/taskforce open\x1b[0m to manage your tasks.\n`);
58
+ console.log(`Run \x1b[36mtaskforce open\x1b[0m from the folder, workspace, or project you want to manage.\n`);
58
59
  } catch (e) {
59
60
  // Silent fail to avoid breaking install
60
61
  }
@@ -1 +0,0 @@
1
- export {};
@@ -1,101 +0,0 @@
1
- import { jsx as _jsx } from "react/jsx-runtime";
2
- import { render, screen, waitFor } from '@testing-library/react';
3
- import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
4
- import { TaskforceCore } from './TaskforceCore';
5
- const mockTasks = [
6
- {
7
- id: 'task-invalid-cat',
8
- title: 'Task with Invalid Category',
9
- description: 'This category does not exist in config',
10
- category: 'non-existent-category',
11
- type: 'feature',
12
- priority: 2,
13
- status: 'task',
14
- createdAt: new Date().toISOString(),
15
- }
16
- ];
17
- const mockConfig = {
18
- storagePath: '.Taskforce',
19
- shortcut: 'Alt+T',
20
- projectName: 'Test Project',
21
- setupState: {
22
- globalSetupState: 'complete',
23
- workspaceSetupState: 'complete',
24
- workspaceId: 'default'
25
- }
26
- };
27
- function stubFetch(categories) {
28
- vi.stubGlobal('fetch', vi.fn((url) => {
29
- if (url.includes('/api/taskforce/config')) {
30
- return Promise.resolve({ ok: true, json: () => Promise.resolve(mockConfig) });
31
- }
32
- if (url.includes('/api/taskforce/taxonomy-state')) {
33
- return Promise.resolve({ ok: true, json: () => Promise.resolve({ categories, types: [], priorities: [], taxonomies: [] }) });
34
- }
35
- if (url.includes('/api/taskforce/categories')) {
36
- return Promise.resolve({ ok: true, json: () => Promise.resolve({ categories }) });
37
- }
38
- if (url.includes('/api/taskforce/tasks')) {
39
- return Promise.resolve({ ok: true, json: () => Promise.resolve({ tasks: mockTasks }) });
40
- }
41
- if (url.includes('/api/taskforce/types')) {
42
- return Promise.resolve({ ok: true, json: () => Promise.resolve({ types: [] }) });
43
- }
44
- if (url.includes('/api/taskforce/priorities')) {
45
- return Promise.resolve({ ok: true, json: () => Promise.resolve({ priorities: [] }) });
46
- }
47
- if (url.includes('/api/taskforce/approaches')) {
48
- return Promise.resolve({ ok: true, json: () => Promise.resolve({ approaches: [] }) });
49
- }
50
- if (url.includes('/api/taskforce/specialists')) {
51
- return Promise.resolve({ ok: true, json: () => Promise.resolve({ specialists: [] }) });
52
- }
53
- if (url.includes('/api/taskforce/ui-state?key=app')) {
54
- return Promise.resolve({
55
- ok: true,
56
- json: () => Promise.resolve({
57
- success: true,
58
- state: {
59
- hasInitedFilters: true,
60
- filterPriorities: [],
61
- filterCategories: ['general'],
62
- filterTypes: [],
63
- filterStatus: ['task', 'on-hold', 'in-progress', 'review', 'done', 'cancelled'],
64
- groupBy: 'category'
65
- }
66
- })
67
- });
68
- }
69
- if (url.includes('/api/taskforce/ui-state')) {
70
- return Promise.resolve({ ok: true, json: () => Promise.resolve({ success: true }) });
71
- }
72
- return Promise.resolve({ ok: true, json: () => Promise.resolve({}) });
73
- }));
74
- }
75
- describe('Taskforce Category Handling', () => {
76
- beforeEach(() => {
77
- localStorage.clear();
78
- });
79
- afterEach(() => {
80
- vi.restoreAllMocks();
81
- });
82
- it('loads successfully with tasks that reference unknown categories', async () => {
83
- stubFetch([{ value: 'general', label: 'General' }]);
84
- render(_jsx(TaskforceCore, {}));
85
- await waitFor(() => {
86
- expect(screen.getByText('Test Project')).toBeInTheDocument();
87
- expect(screen.getByTitle('Open tasks matching current filters')).toHaveTextContent('0/1');
88
- });
89
- });
90
- it('remains stable when category ordering includes values before general', async () => {
91
- stubFetch([
92
- { value: 'aaa', label: 'AAA First' },
93
- { value: 'general', label: 'General' }
94
- ]);
95
- render(_jsx(TaskforceCore, {}));
96
- await waitFor(() => {
97
- expect(screen.getByText('Test Project')).toBeInTheDocument();
98
- expect(screen.getByTitle('Open tasks matching current filters')).toHaveTextContent('0/1');
99
- });
100
- });
101
- });
@@ -1 +0,0 @@
1
- export {};
@@ -1,402 +0,0 @@
1
- import { jsx as _jsx } from "react/jsx-runtime";
2
- import { render, screen, waitFor, within } from '@testing-library/react';
3
- import userEvent from '@testing-library/user-event';
4
- import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
5
- import { TaskforceCore } from './TaskforceCore';
6
- const baseConfig = {
7
- storagePath: '.Taskforce',
8
- shortcut: 'Alt+T',
9
- projectName: 'Test Project',
10
- runtimeMode: 'local',
11
- workspaceId: 'default',
12
- setupState: {
13
- globalSetupState: 'complete',
14
- workspaceSetupState: 'complete',
15
- workspaceId: 'default'
16
- }
17
- };
18
- const categories = [
19
- { value: 'default', label: 'General' },
20
- { value: 'product', label: 'Product' }
21
- ];
22
- const tasks = [
23
- {
24
- id: 'task-default',
25
- title: 'Default Task',
26
- category: 'default',
27
- type: 'task',
28
- priority: 2,
29
- status: 'task',
30
- createdAt: '2026-03-18T10:00:00.000Z'
31
- },
32
- {
33
- id: 'task-product',
34
- title: 'Product Task',
35
- category: 'product',
36
- type: 'task',
37
- priority: 2,
38
- status: 'task',
39
- createdAt: '2026-03-18T10:05:00.000Z'
40
- }
41
- ];
42
- const assigneeTasks = [
43
- {
44
- id: 'task-codex',
45
- title: 'Codex Task',
46
- category: 'default',
47
- type: 'task',
48
- priority: 2,
49
- status: 'task',
50
- assignee: 'ai-profile-codex',
51
- createdAt: '2026-03-18T10:00:00.000Z'
52
- },
53
- {
54
- id: 'task-member-1',
55
- title: 'Alex Task',
56
- category: 'default',
57
- type: 'task',
58
- priority: 2,
59
- status: 'task',
60
- assignee: 'member-1',
61
- createdAt: '2026-03-18T10:05:00.000Z'
62
- },
63
- {
64
- id: 'task-member-2',
65
- title: 'Bailey Task',
66
- category: 'default',
67
- type: 'task',
68
- priority: 2,
69
- status: 'task',
70
- assignee: 'member-2',
71
- createdAt: '2026-03-18T10:10:00.000Z'
72
- }
73
- ];
74
- const defaultAssigneeOptions = [
75
- { value: 'ai-profile-codex', label: 'Codex', kind: 'agent' },
76
- { value: 'member-1', label: 'Alex Example', kind: 'member' },
77
- { value: 'member-2', label: 'Bailey Example', kind: 'member' }
78
- ];
79
- function createDeferredResponse() {
80
- let resolve;
81
- const promise = new Promise((res) => {
82
- resolve = res;
83
- });
84
- return { promise, resolve };
85
- }
86
- function installFetchStub(persistedState, options) {
87
- const deferredCategories = options?.delayCategories ? createDeferredResponse() : null;
88
- const deferredAssignees = options?.delayAssigneeOptions ? createDeferredResponse() : null;
89
- let currentTasks = options?.tasks ?? tasks;
90
- let currentAssigneeOptions = options?.assigneeOptions ?? defaultAssigneeOptions;
91
- vi.stubGlobal('fetch', vi.fn((url, init) => {
92
- const method = String(init?.method || 'GET').toUpperCase();
93
- if (url.includes('/api/taskforce/auth/runtime-config')) {
94
- return Promise.resolve({ ok: true, json: () => Promise.resolve({ config: { runtimeMode: 'local', workspaceMode: 'single-local', authSource: 'cloud' } }) });
95
- }
96
- if (url.includes('/api/taskforce/auth/session')) {
97
- return Promise.resolve({ ok: true, json: () => Promise.resolve({ authenticated: false, authRequiredForApi: false, userId: 'anonymous', email: '', workspaceId: 'default' }) });
98
- }
99
- if (url.includes('/api/taskforce/config')) {
100
- return Promise.resolve({
101
- ok: true,
102
- json: () => Promise.resolve(baseConfig)
103
- });
104
- }
105
- if (url.includes('/api/taskforce/categories')) {
106
- if (deferredCategories)
107
- return deferredCategories.promise;
108
- return Promise.resolve({ ok: true, json: () => Promise.resolve({ categories }) });
109
- }
110
- if (url.includes('/api/taskforce/types')) {
111
- return Promise.resolve({ ok: true, json: () => Promise.resolve({ types: [{ value: 'task', label: 'Task' }] }) });
112
- }
113
- if (url.includes('/api/taskforce/priorities')) {
114
- return Promise.resolve({
115
- ok: true,
116
- json: () => Promise.resolve({
117
- priorities: [
118
- { value: 1, label: 'Low' },
119
- { value: 2, label: 'Medium' },
120
- { value: 3, label: 'High' },
121
- ]
122
- })
123
- });
124
- }
125
- if (url.includes('/api/taskforce/approaches')) {
126
- return Promise.resolve({ ok: true, json: () => Promise.resolve({ approaches: [] }) });
127
- }
128
- if (url.includes('/api/taskforce/specialists')) {
129
- return Promise.resolve({ ok: true, json: () => Promise.resolve({ specialists: [] }) });
130
- }
131
- if (url.includes('/api/taskforce/taxonomies')) {
132
- return Promise.resolve({ ok: true, json: () => Promise.resolve({ taxonomies: [] }) });
133
- }
134
- if (url.includes('/api/taskforce/workspace/assignee-options')) {
135
- if (deferredAssignees)
136
- return deferredAssignees.promise;
137
- return Promise.resolve({ ok: true, json: () => Promise.resolve({ assignees: currentAssigneeOptions }) });
138
- }
139
- if (url.includes('/api/taskforce/tasks')) {
140
- return Promise.resolve({ ok: true, json: () => Promise.resolve({ tasks: currentTasks }) });
141
- }
142
- if (url.includes('/api/taskforce/ui-state?key=app')) {
143
- return Promise.resolve({ ok: true, json: () => Promise.resolve({ success: true, state: persistedState }) });
144
- }
145
- if (url.includes('/api/taskforce/ui-state') && method === 'POST') {
146
- const body = init?.body ? JSON.parse(String(init.body)) : {};
147
- Object.assign(persistedState, body?.patch || body?.state || {});
148
- return Promise.resolve({ ok: true, json: () => Promise.resolve({ success: true }) });
149
- }
150
- return Promise.resolve({ ok: true, json: () => Promise.resolve({}) });
151
- }));
152
- return {
153
- resolveCategories: () => {
154
- deferredCategories?.resolve({ ok: true, json: () => Promise.resolve({ categories }) });
155
- },
156
- resolveAssigneeOptions: () => {
157
- deferredAssignees?.resolve({ ok: true, json: () => Promise.resolve({ assignees: currentAssigneeOptions }) });
158
- },
159
- setAssigneeOptions: (next) => {
160
- currentAssigneeOptions = next;
161
- },
162
- setTasks: (next) => {
163
- currentTasks = next;
164
- }
165
- };
166
- }
167
- async function selectOnlyProductCategory(user) {
168
- await user.click(screen.getByTitle('Toggle Filters'));
169
- await user.click(screen.getByTitle('Filter by Category'));
170
- const categoryMenuLabel = await screen.findByText('Toggle All');
171
- const categoryMenu = categoryMenuLabel.closest('div')?.parentElement;
172
- await user.click(within(categoryMenu).getByText('General'));
173
- }
174
- async function openAssigneeMenu(user) {
175
- await user.click(screen.getByTitle('Toggle Filters'));
176
- await user.click(screen.getByTitle('Filter by Assignee'));
177
- const toggleAll = await screen.findByText('Toggle All');
178
- return toggleAll.closest('div')?.parentElement;
179
- }
180
- describe('TaskforceCore category filter persistence', () => {
181
- beforeEach(() => {
182
- localStorage.clear();
183
- });
184
- afterEach(() => {
185
- vi.restoreAllMocks();
186
- });
187
- it('persists the selected category across repeated remounts', async () => {
188
- const persistedState = {};
189
- installFetchStub(persistedState);
190
- const user = userEvent.setup();
191
- const firstRender = render(_jsx(TaskforceCore, { mode: "standalone" }));
192
- await waitFor(() => {
193
- expect(screen.getByText('Default Task')).toBeInTheDocument();
194
- expect(screen.getByText('Product Task')).toBeInTheDocument();
195
- });
196
- await selectOnlyProductCategory(user);
197
- await waitFor(() => {
198
- expect(screen.getByText('Product Task')).toBeInTheDocument();
199
- expect(screen.queryByText('Default Task')).not.toBeInTheDocument();
200
- });
201
- expect(persistedState.filterCategories).toEqual(['product']);
202
- firstRender.unmount();
203
- render(_jsx(TaskforceCore, { mode: "standalone" }));
204
- await waitFor(() => {
205
- expect(screen.getByText('Product Task')).toBeInTheDocument();
206
- expect(screen.queryByText('Default Task')).not.toBeInTheDocument();
207
- });
208
- expect(persistedState.filterCategories).toEqual(['product']);
209
- });
210
- it('does not overwrite the restored category when categories load after config', async () => {
211
- const persistedState = {
212
- hasInitedFilters: true,
213
- filterCategories: ['product'],
214
- filterTypes: ['task'],
215
- filterPriorities: [1, 2, 3, 4],
216
- filterStatus: ['task', 'on-hold', 'in-progress', 'review', 'done', 'cancelled']
217
- };
218
- const fetchControl = installFetchStub(persistedState, { delayCategories: true });
219
- const firstRender = render(_jsx(TaskforceCore, { mode: "standalone" }));
220
- await waitFor(() => {
221
- expect(screen.getByText('Default Task')).toBeInTheDocument();
222
- expect(screen.getByText('Product Task')).toBeInTheDocument();
223
- });
224
- expect(persistedState.filterCategories).toEqual(['product']);
225
- fetchControl.resolveCategories();
226
- await waitFor(() => {
227
- expect(screen.getByText('Product Task')).toBeInTheDocument();
228
- expect(screen.queryByText('Default Task')).not.toBeInTheDocument();
229
- });
230
- expect(persistedState.filterCategories).toEqual(['product']);
231
- firstRender.unmount();
232
- render(_jsx(TaskforceCore, { mode: "standalone" }));
233
- await waitFor(() => {
234
- expect(screen.getByText('Product Task')).toBeInTheDocument();
235
- expect(screen.queryByText('Default Task')).not.toBeInTheDocument();
236
- });
237
- expect(persistedState.filterCategories).toEqual(['product']);
238
- });
239
- it('falls back to all categories when the saved category no longer exists', async () => {
240
- const persistedState = {
241
- filterCategories: ['missing-category']
242
- };
243
- installFetchStub(persistedState);
244
- render(_jsx(TaskforceCore, { mode: "standalone" }));
245
- await waitFor(() => {
246
- expect(screen.getByText('Default Task')).toBeInTheDocument();
247
- expect(screen.getByText('Product Task')).toBeInTheDocument();
248
- });
249
- });
250
- });
251
- describe('TaskforceCore assignee filter persistence', () => {
252
- beforeEach(() => {
253
- localStorage.clear();
254
- });
255
- afterEach(() => {
256
- vi.restoreAllMocks();
257
- });
258
- it('persists toggle-all across repeated remounts for dynamic assignee options', async () => {
259
- const persistedState = {};
260
- installFetchStub(persistedState, {
261
- tasks: assigneeTasks
262
- });
263
- const user = userEvent.setup();
264
- const firstRender = render(_jsx(TaskforceCore, { mode: "standalone" }));
265
- await waitFor(() => {
266
- expect(screen.getByText('Codex Task')).toBeInTheDocument();
267
- expect(screen.getByText('Alex Task')).toBeInTheDocument();
268
- expect(screen.getByText('Bailey Task')).toBeInTheDocument();
269
- });
270
- const assigneeMenu = await openAssigneeMenu(user);
271
- await user.click(within(assigneeMenu).getByText('Alex Example'));
272
- await waitFor(() => {
273
- expect(screen.queryByText('Alex Task')).not.toBeInTheDocument();
274
- });
275
- await user.click(within(assigneeMenu).getByText('Toggle All'));
276
- await waitFor(() => {
277
- expect(screen.getByText('Codex Task')).toBeInTheDocument();
278
- expect(screen.getByText('Alex Task')).toBeInTheDocument();
279
- expect(screen.getByText('Bailey Task')).toBeInTheDocument();
280
- expect(persistedState.filterAssigneesAllSelected).toBe(true);
281
- });
282
- firstRender.unmount();
283
- render(_jsx(TaskforceCore, { mode: "standalone" }));
284
- await waitFor(() => {
285
- expect(screen.getByText('Codex Task')).toBeInTheDocument();
286
- expect(screen.getByText('Alex Task')).toBeInTheDocument();
287
- expect(screen.getByText('Bailey Task')).toBeInTheDocument();
288
- });
289
- });
290
- it('restores all-assignees selection after assignee options load late and expands to new members', async () => {
291
- const persistedState = {
292
- hasInitedFilters: true,
293
- filterAssignees: ['ai-profile-codex', 'member-1', 'member-2'],
294
- filterAssigneesAllSelected: true,
295
- filterCategories: ['default', 'product'],
296
- filterTypes: ['task'],
297
- filterPriorities: [1, 2, 3, 4],
298
- filterStatus: ['task', 'on-hold', 'in-progress', 'review', 'done', 'cancelled']
299
- };
300
- const fetchControl = installFetchStub(persistedState, {
301
- tasks: assigneeTasks,
302
- delayAssigneeOptions: true
303
- });
304
- const firstRender = render(_jsx(TaskforceCore, { mode: "standalone" }));
305
- await waitFor(() => {
306
- expect(screen.getByText('Codex Task')).toBeInTheDocument();
307
- expect(screen.getByText('Alex Task')).toBeInTheDocument();
308
- expect(screen.getByText('Bailey Task')).toBeInTheDocument();
309
- });
310
- fetchControl.resolveAssigneeOptions();
311
- await waitFor(() => {
312
- expect(persistedState.filterAssigneesAllSelected).toBe(true);
313
- expect(persistedState.filterAssignees).toEqual(['unassigned', 'ai-profile-codex', 'member-1', 'member-2']);
314
- });
315
- fetchControl.setAssigneeOptions([
316
- ...defaultAssigneeOptions,
317
- { value: 'member-3', label: 'Casey Example', kind: 'member' }
318
- ]);
319
- fetchControl.setTasks([
320
- ...assigneeTasks,
321
- {
322
- id: 'task-member-3',
323
- title: 'Casey Task',
324
- category: 'default',
325
- type: 'task',
326
- priority: 2,
327
- status: 'task',
328
- assignee: 'member-3',
329
- createdAt: '2026-03-18T10:15:00.000Z'
330
- }
331
- ]);
332
- firstRender.unmount();
333
- render(_jsx(TaskforceCore, { mode: "standalone" }));
334
- await waitFor(() => {
335
- expect(screen.getByText('Casey Task')).toBeInTheDocument();
336
- expect(persistedState.filterAssigneesAllSelected).toBe(true);
337
- expect(persistedState.filterAssignees).toEqual(['unassigned', 'ai-profile-codex', 'member-1', 'member-2', 'member-3']);
338
- });
339
- });
340
- it('preserves a custom assignee subset across refresh', async () => {
341
- const persistedState = {
342
- hasInitedFilters: true,
343
- filterAssignees: ['ai-profile-codex', 'member-1'],
344
- filterAssigneesAllSelected: false,
345
- filterCategories: ['default', 'product'],
346
- filterTypes: ['task'],
347
- filterPriorities: [1, 2, 3, 4],
348
- filterStatus: ['task', 'on-hold', 'in-progress', 'review', 'done', 'cancelled']
349
- };
350
- installFetchStub(persistedState, {
351
- tasks: assigneeTasks
352
- });
353
- render(_jsx(TaskforceCore, { mode: "standalone" }));
354
- await waitFor(() => {
355
- expect(screen.getByText('Codex Task')).toBeInTheDocument();
356
- expect(screen.getByText('Alex Task')).toBeInTheDocument();
357
- expect(screen.queryByText('Bailey Task')).not.toBeInTheDocument();
358
- });
359
- });
360
- it('keeps a manually deselected assignee excluded instead of immediately restoring all assignees', async () => {
361
- const persistedState = {};
362
- installFetchStub(persistedState, {
363
- tasks: assigneeTasks
364
- });
365
- const user = userEvent.setup();
366
- render(_jsx(TaskforceCore, { mode: "standalone" }));
367
- await waitFor(() => {
368
- expect(screen.getByText('Codex Task')).toBeInTheDocument();
369
- expect(screen.getByText('Alex Task')).toBeInTheDocument();
370
- expect(screen.getByText('Bailey Task')).toBeInTheDocument();
371
- });
372
- const assigneeMenu = await openAssigneeMenu(user);
373
- await user.click(within(assigneeMenu).getByText('Codex'));
374
- await waitFor(() => {
375
- expect(screen.queryByText('Codex Task')).not.toBeInTheDocument();
376
- expect(screen.getByText('Alex Task')).toBeInTheDocument();
377
- expect(screen.getByText('Bailey Task')).toBeInTheDocument();
378
- expect(persistedState.filterAssigneesAllSelected).toBe(false);
379
- });
380
- });
381
- it('falls back to all assignees when a saved custom subset no longer exists', async () => {
382
- const persistedState = {
383
- hasInitedFilters: true,
384
- filterAssignees: ['member-missing'],
385
- filterAssigneesAllSelected: false,
386
- filterCategories: ['default', 'product'],
387
- filterTypes: ['task'],
388
- filterPriorities: [1, 2, 3, 4],
389
- filterStatus: ['task', 'on-hold', 'in-progress', 'review', 'done', 'cancelled']
390
- };
391
- installFetchStub(persistedState, {
392
- tasks: assigneeTasks
393
- });
394
- render(_jsx(TaskforceCore, { mode: "standalone" }));
395
- await waitFor(() => {
396
- expect(screen.getByText('Codex Task')).toBeInTheDocument();
397
- expect(screen.getByText('Alex Task')).toBeInTheDocument();
398
- expect(screen.getByText('Bailey Task')).toBeInTheDocument();
399
- expect(persistedState.filterAssigneesAllSelected).toBe(true);
400
- });
401
- });
402
- });
@@ -1 +0,0 @@
1
- export {};