@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,175 +0,0 @@
1
- import fs from 'node:fs';
2
- import os from 'node:os';
3
- import path from 'node:path';
4
-
5
- export const QA_MODES = ['local', 'performance', 'staging'];
6
-
7
- export const QA_CLOUD_BASE_URLS = {
8
- performance: 'https://performance-app.taskforcehq.ai',
9
- staging: 'https://staging-app.taskforcehq.ai'
10
- };
11
-
12
- function normalizePort(raw) {
13
- const value = String(raw || '').trim();
14
- if (!value) return null;
15
- const parsed = Number.parseInt(value, 10);
16
- if (!Number.isInteger(parsed) || parsed <= 0) {
17
- return null;
18
- }
19
- return parsed;
20
- }
21
-
22
- function stripQuotes(raw) {
23
- const value = String(raw || '').trim();
24
- if (
25
- (value.startsWith('"') && value.endsWith('"'))
26
- || (value.startsWith("'") && value.endsWith("'"))
27
- ) {
28
- return value.slice(1, -1);
29
- }
30
- return value;
31
- }
32
-
33
- export function normalizeQaMode(raw) {
34
- const normalized = String(raw || '').trim().toLowerCase();
35
- return QA_MODES.includes(normalized) ? normalized : null;
36
- }
37
-
38
- export function sanitizeQaAgentId(raw) {
39
- const normalized = String(raw || '')
40
- .trim()
41
- .toLowerCase()
42
- .replace(/[^a-z0-9_-]+/g, '-')
43
- .replace(/^-+|-+$/g, '')
44
- .replace(/-{2,}/g, '-');
45
- return normalized || null;
46
- }
47
-
48
- export function parseQaArgs(argv, env = process.env) {
49
- const positional = (argv || []).filter((arg) => !String(arg || '').startsWith('--'));
50
- const mode = normalizeQaMode(positional[0] || env.TASKFORCE_QA_MODE || 'local');
51
- const preferredPort = normalizePort(positional[1] || env.TASKFORCE_QA_PORT);
52
- const agentId = sanitizeQaAgentId(env.TASKFORCE_QA_AGENT);
53
- return { mode, agentId, preferredPort };
54
- }
55
-
56
- export function resolveQaPaths({ agentId, homeDir = os.homedir() }) {
57
- const safeAgentId = sanitizeQaAgentId(agentId);
58
- if (!safeAgentId) {
59
- throw new Error('TASKFORCE_QA_AGENT is required and must contain at least one safe path character.');
60
- }
61
- const root = path.resolve(homeDir, '.taskforce', 'qa', safeAgentId);
62
- return {
63
- agentId: safeAgentId,
64
- root,
65
- projectRoot: path.join(root, 'project'),
66
- envFile: path.join(root, 'env'),
67
- logsDir: path.join(root, 'logs'),
68
- artifactsDir: path.join(root, 'artifacts'),
69
- homeDir: path.join(root, 'home'),
70
- playwrightStorageState: path.join(root, 'playwright-auth.json')
71
- };
72
- }
73
-
74
- export function isPathInside(parentPath, childPath) {
75
- const parent = path.resolve(parentPath);
76
- const child = path.resolve(childPath);
77
- const relative = path.relative(parent, child);
78
- return relative === '' || (!relative.startsWith('..') && !path.isAbsolute(relative));
79
- }
80
-
81
- export function assertQaProjectRootSafe(projectRoot, repoRoot) {
82
- if (isPathInside(repoRoot, projectRoot)) {
83
- throw new Error(
84
- `Refusing to use QA project root inside the repository: ${projectRoot}\n`
85
- + `Move the QA root outside ${repoRoot}.`
86
- );
87
- }
88
- }
89
-
90
- export function parseEnvFileContents(raw) {
91
- const env = {};
92
- const lines = String(raw || '').split(/\r?\n/);
93
- for (const line of lines) {
94
- const trimmed = line.trim();
95
- if (!trimmed || trimmed.startsWith('#')) continue;
96
- const normalized = trimmed.startsWith('export ') ? trimmed.slice(7).trim() : trimmed;
97
- const separatorIndex = normalized.indexOf('=');
98
- if (separatorIndex <= 0) continue;
99
- const key = normalized.slice(0, separatorIndex).trim();
100
- if (!key) continue;
101
- const value = normalized.slice(separatorIndex + 1);
102
- env[key] = stripQuotes(value);
103
- }
104
- return env;
105
- }
106
-
107
- export function loadEnvFile(filePath) {
108
- const raw = fs.readFileSync(filePath, 'utf8');
109
- return parseEnvFileContents(raw);
110
- }
111
-
112
- export function ensureQaRootStructure(paths, options = {}) {
113
- const projectName = String(options.projectName || `taskforce-qa-${paths.agentId}`).trim();
114
- fs.mkdirSync(paths.root, { recursive: true });
115
- fs.mkdirSync(paths.projectRoot, { recursive: true });
116
- fs.mkdirSync(paths.logsDir, { recursive: true });
117
- fs.mkdirSync(paths.artifactsDir, { recursive: true });
118
- fs.mkdirSync(paths.homeDir, { recursive: true });
119
-
120
- const packageJsonPath = path.join(paths.projectRoot, 'package.json');
121
- if (!fs.existsSync(packageJsonPath)) {
122
- fs.writeFileSync(packageJsonPath, JSON.stringify({ name: projectName }, null, 2) + '\n', 'utf8');
123
- }
124
- return packageJsonPath;
125
- }
126
-
127
- export function resolveExpectedWorkspace(env) {
128
- const workspaceId = String(env.TASKFORCE_QA_EXPECTED_WORKSPACE_ID || '').trim();
129
- const workspaceSlug = String(env.TASKFORCE_QA_EXPECTED_WORKSPACE_SLUG || '').trim();
130
- if (!workspaceId && !workspaceSlug) return null;
131
- return {
132
- workspaceId: workspaceId || null,
133
- workspaceSlug: workspaceSlug || null
134
- };
135
- }
136
-
137
- export function matchExpectedWorkspace(result, expected) {
138
- const nestedWorkspaces = Array.isArray(result?.workspaces?.workspaces) ? result.workspaces.workspaces : [];
139
- const workspaces = Array.isArray(result?.workspaces) ? result.workspaces : nestedWorkspaces;
140
- const currentWorkspaceId = String(result?.currentWorkspaceId || '').trim();
141
- if (!expected) {
142
- return {
143
- ok: true,
144
- matchedWorkspaceId: currentWorkspaceId || null,
145
- reason: 'No expected workspace configured.'
146
- };
147
- }
148
-
149
- if (expected.workspaceId) {
150
- return {
151
- ok: currentWorkspaceId === expected.workspaceId,
152
- matchedWorkspaceId: currentWorkspaceId || null,
153
- reason: currentWorkspaceId === expected.workspaceId
154
- ? 'Matched expected workspace id.'
155
- : `Expected workspace id ${expected.workspaceId} but current workspace id was ${currentWorkspaceId || '(empty)'}.`
156
- };
157
- }
158
-
159
- const matchedBySlug = workspaces.find((workspace) => String(workspace?.slug || '').trim() === expected.workspaceSlug);
160
- if (!matchedBySlug) {
161
- return {
162
- ok: false,
163
- matchedWorkspaceId: currentWorkspaceId || null,
164
- reason: `Expected workspace slug ${expected.workspaceSlug} was not present in the available workspaces list.`
165
- };
166
- }
167
-
168
- return {
169
- ok: currentWorkspaceId === String(matchedBySlug.id || '').trim(),
170
- matchedWorkspaceId: currentWorkspaceId || null,
171
- reason: currentWorkspaceId === String(matchedBySlug.id || '').trim()
172
- ? 'Matched expected workspace slug.'
173
- : `Expected workspace slug ${expected.workspaceSlug} to resolve to workspace id ${String(matchedBySlug.id || '').trim()}, but current workspace id was ${currentWorkspaceId || '(empty)'}.`
174
- };
175
- }
@@ -1,49 +0,0 @@
1
- export const QA_MODES: string[];
2
- export const QA_CLOUD_BASE_URLS: Record<string, string>;
3
-
4
- export function normalizeQaMode(raw: unknown): string | null;
5
- export function sanitizeQaAgentId(raw: unknown): string | null;
6
- export function parseQaArgs(
7
- argv?: string[],
8
- env?: Record<string, string | undefined>
9
- ): { mode: string | null; agentId: string | null; preferredPort: number | null };
10
- export function resolveQaPaths(input: {
11
- agentId: string;
12
- homeDir?: string;
13
- }): {
14
- agentId: string;
15
- root: string;
16
- projectRoot: string;
17
- envFile: string;
18
- logsDir: string;
19
- artifactsDir: string;
20
- homeDir: string;
21
- playwrightStorageState: string;
22
- };
23
- export function isPathInside(parentPath: string, childPath: string): boolean;
24
- export function assertQaProjectRootSafe(projectRoot: string, repoRoot: string): void;
25
- export function parseEnvFileContents(raw: unknown): Record<string, string>;
26
- export function loadEnvFile(filePath: string): Record<string, string>;
27
- export function ensureQaRootStructure(
28
- paths: {
29
- agentId: string;
30
- root: string;
31
- projectRoot: string;
32
- logsDir: string;
33
- artifactsDir: string;
34
- homeDir: string;
35
- },
36
- options?: { projectName?: string }
37
- ): string;
38
- export function resolveExpectedWorkspace(env: Record<string, string | undefined>): {
39
- workspaceId: string | null;
40
- workspaceSlug: string | null;
41
- } | null;
42
- export function matchExpectedWorkspace(
43
- result: unknown,
44
- expected: { workspaceId: string | null; workspaceSlug: string | null } | null
45
- ): {
46
- ok: boolean;
47
- matchedWorkspaceId: string | null;
48
- reason: string;
49
- };
@@ -1,352 +0,0 @@
1
- #!/usr/bin/env node
2
- import { chromium } from '@playwright/test';
3
- import { spawn } from 'node:child_process';
4
- import fs from 'node:fs';
5
- import path from 'node:path';
6
- import { fileURLToPath } from 'node:url';
7
- import {
8
- QA_CLOUD_BASE_URLS,
9
- assertQaProjectRootSafe,
10
- ensureQaRootStructure,
11
- loadEnvFile,
12
- matchExpectedWorkspace,
13
- parseQaArgs,
14
- resolveExpectedWorkspace,
15
- resolveQaPaths
16
- } from './qa-open-lib.mjs';
17
-
18
- const __filename = fileURLToPath(import.meta.url);
19
- const __dirname = path.dirname(__filename);
20
- const REPO_ROOT = path.resolve(__dirname, '..');
21
- const CLI_PATH = path.resolve(REPO_ROOT, 'src/cli.ts');
22
- const TSX_LOADER_PATH = path.resolve(REPO_ROOT, 'node_modules/tsx/dist/loader.mjs');
23
- const UI_INDEX_PATH = path.resolve(REPO_ROOT, 'dist/ui/index.html');
24
-
25
- function fail(message) {
26
- throw new Error(message);
27
- }
28
-
29
- function createLogWriter(logFilePath, prefix) {
30
- const stream = fs.createWriteStream(logFilePath, { flags: 'a' });
31
- return (chunk) => {
32
- const text = String(chunk || '');
33
- process.stdout.write(`${prefix}${text}`);
34
- stream.write(text);
35
- };
36
- }
37
-
38
- function createErrorLogWriter(logFilePath, prefix) {
39
- const stream = fs.createWriteStream(logFilePath, { flags: 'a' });
40
- return (chunk) => {
41
- const text = String(chunk || '');
42
- process.stderr.write(`${prefix}${text}`);
43
- stream.write(text);
44
- };
45
- }
46
-
47
- function spawnLogged(command, args, options) {
48
- const child = spawn(command, args, {
49
- cwd: options.cwd,
50
- env: options.env,
51
- stdio: ['ignore', 'pipe', 'pipe']
52
- });
53
- const stdoutWriter = createLogWriter(options.stdoutLogPath, options.stdoutPrefix);
54
- const stderrWriter = createErrorLogWriter(options.stderrLogPath, options.stderrPrefix);
55
- child.stdout?.on('data', stdoutWriter);
56
- child.stderr?.on('data', stderrWriter);
57
- return child;
58
- }
59
-
60
- function isTruthyEnv(raw) {
61
- return /^(1|true|yes)$/i.test(String(raw || '').trim());
62
- }
63
-
64
- function stripRuntimeOnlyEnv(baseEnv) {
65
- const env = { ...baseEnv };
66
- for (const key of Object.keys(env)) {
67
- if (key.startsWith('TASKFORCE_QA_')) {
68
- delete env[key];
69
- continue;
70
- }
71
- if (key.startsWith('TASKFORCE_PLAYWRIGHT_')) {
72
- delete env[key];
73
- continue;
74
- }
75
- if (key === 'TASKFORCE_E2E_EMAIL' || key === 'TASKFORCE_E2E_PASSWORD') {
76
- delete env[key];
77
- }
78
- }
79
- return env;
80
- }
81
-
82
- function waitForChildExit(child, label) {
83
- return new Promise((resolve, reject) => {
84
- child.once('exit', (code, signal) => resolve({ label, code, signal }));
85
- child.once('error', (error) => {
86
- const message = error instanceof Error ? error.message : String(error);
87
- reject(new Error(`${label} failed to start: ${message}`));
88
- });
89
- });
90
- }
91
-
92
- async function waitForFreshUiBuild(child, startTimeMs, timeoutMs = 120000) {
93
- const startedAt = Date.now();
94
- return await new Promise((resolve, reject) => {
95
- let settled = false;
96
- const onExit = (code, signal) => {
97
- if (settled) return;
98
- settled = true;
99
- reject(new Error(`UI watch process exited before initial build completed (code=${code ?? 'null'} signal=${signal ?? 'null'}).`));
100
- };
101
- child.once('exit', onExit);
102
-
103
- const interval = setInterval(() => {
104
- try {
105
- const stat = fs.statSync(UI_INDEX_PATH);
106
- if (stat.mtimeMs >= startTimeMs) {
107
- settled = true;
108
- clearInterval(interval);
109
- child.off('exit', onExit);
110
- resolve();
111
- return;
112
- }
113
- } catch {
114
- // keep polling until timeout
115
- }
116
- if (Date.now() - startedAt > timeoutMs) {
117
- settled = true;
118
- clearInterval(interval);
119
- child.off('exit', onExit);
120
- reject(new Error(`Timed out waiting for a fresh standalone UI build at ${UI_INDEX_PATH}.`));
121
- }
122
- }, 500);
123
- });
124
- }
125
-
126
- async function runPlaywrightAuth(env) {
127
- await new Promise((resolve, reject) => {
128
- const child = spawn('npm', ['run', 'playwright:auth'], {
129
- cwd: REPO_ROOT,
130
- env,
131
- stdio: 'inherit'
132
- });
133
- child.once('exit', (code, signal) => {
134
- if (code === 0) {
135
- resolve();
136
- return;
137
- }
138
- reject(new Error(`Playwright auth bootstrap failed (code=${code ?? 'null'} signal=${signal ?? 'null'}).`));
139
- });
140
- child.once('error', reject);
141
- });
142
- }
143
-
144
- async function verifyCloudWorkspace(baseUrl, storageStatePath, expectedWorkspace) {
145
- const browser = await chromium.launch({ headless: true });
146
- try {
147
- const context = await browser.newContext({ storageState: storageStatePath });
148
- const page = await context.newPage();
149
- await page.goto(`${baseUrl}/taskforce/`, { waitUntil: 'domcontentloaded', timeout: 60000 });
150
- const payload = await page.evaluate(async () => {
151
- const sessionResponse = await fetch('/api/taskforce/auth/session', {
152
- method: 'GET',
153
- credentials: 'include',
154
- headers: { Accept: 'application/json' }
155
- });
156
- const workspacesResponse = await fetch('/api/taskforce/workspaces', {
157
- method: 'GET',
158
- credentials: 'include',
159
- headers: { Accept: 'application/json' }
160
- });
161
- return {
162
- session: await sessionResponse.json(),
163
- workspaces: await workspacesResponse.json()
164
- };
165
- });
166
- await context.close();
167
- const authenticated = Boolean(payload?.session?.authenticated);
168
- if (!authenticated) {
169
- fail(`Authentication succeeded earlier, but the saved storage state at ${storageStatePath} is not currently authenticated.`);
170
- }
171
- const match = matchExpectedWorkspace(payload?.workspaces, expectedWorkspace);
172
- if (!match.ok) {
173
- fail(
174
- `${match.reason}\n`
175
- + 'Check the expected workspace env vars and make sure the account is a member of the intended workspace.'
176
- );
177
- }
178
- } finally {
179
- await browser.close();
180
- }
181
- }
182
-
183
- function buildRuntimeEnv(baseEnv, paths) {
184
- const isolateHome = isTruthyEnv(baseEnv.TASKFORCE_QA_ISOLATE_HOME);
185
- const env = stripRuntimeOnlyEnv(baseEnv);
186
- if (isolateHome) {
187
- env.HOME = paths.homeDir;
188
- env.USERPROFILE = paths.homeDir;
189
- }
190
- return env;
191
- }
192
-
193
- async function main() {
194
- const { mode, agentId, preferredPort } = parseQaArgs(process.argv.slice(2), process.env);
195
- if (!mode) {
196
- fail('Invalid or missing QA mode. Use one of: local, performance, staging.');
197
- }
198
- if (!agentId) {
199
- fail('TASKFORCE_QA_AGENT is required. Example: TASKFORCE_QA_AGENT=codex npm run qa:open -- performance');
200
- }
201
-
202
- const paths = resolveQaPaths({ agentId });
203
- assertQaProjectRootSafe(paths.projectRoot, REPO_ROOT);
204
-
205
- const cloudMode = mode !== 'local';
206
- const envFileExists = fs.existsSync(paths.envFile);
207
- let envFileVars = {};
208
- if (envFileExists) {
209
- envFileVars = loadEnvFile(paths.envFile);
210
- } else if (cloudMode) {
211
- fail(
212
- `Missing QA env file for agent ${agentId}: ${paths.envFile}\n`
213
- + 'Create the file with TASKFORCE_E2E_EMAIL, TASKFORCE_E2E_PASSWORD, and the expected workspace id or slug.'
214
- );
215
- }
216
-
217
- const projectName = String(envFileVars.TASKFORCE_QA_PROJECT_NAME || `taskforce-qa-${paths.agentId}`).trim();
218
- ensureQaRootStructure(paths, { projectName });
219
-
220
- const qaEnv = {
221
- ...process.env,
222
- ...envFileVars,
223
- TASKFORCE_PLAYWRIGHT_ENV_FILE: paths.envFile,
224
- TASKFORCE_PLAYWRIGHT_STORAGE_STATE: paths.playwrightStorageState
225
- };
226
- const expectedWorkspace = resolveExpectedWorkspace(qaEnv);
227
- if (cloudMode && !expectedWorkspace) {
228
- fail(
229
- `Cloud QA for ${mode} requires TASKFORCE_QA_EXPECTED_WORKSPACE_ID or TASKFORCE_QA_EXPECTED_WORKSPACE_SLUG in ${paths.envFile}.`
230
- );
231
- }
232
- const runtimeEnv = buildRuntimeEnv(qaEnv, paths);
233
-
234
- console.log(`[qa:open] Agent: ${paths.agentId}`);
235
- console.log(`[qa:open] Mode: ${mode}`);
236
- console.log(`[qa:open] QA root: ${paths.root}`);
237
- console.log(`[qa:open] External project root: ${paths.projectRoot}`);
238
- console.log(`[qa:open] Artifact dir: ${paths.artifactsDir}`);
239
- if (preferredPort) {
240
- console.log(`[qa:open] Preferred port: ${preferredPort}`);
241
- }
242
- if (isTruthyEnv(qaEnv.TASKFORCE_QA_ISOLATE_HOME)) {
243
- console.log(`[qa:open] HOME isolation enabled: ${paths.homeDir}`);
244
- }
245
-
246
- if (cloudMode) {
247
- await runPlaywrightAuth({
248
- ...qaEnv,
249
- TASKFORCE_PLAYWRIGHT_CLOUD_BASE_URL: String(
250
- qaEnv.TASKFORCE_PLAYWRIGHT_CLOUD_BASE_URL || QA_CLOUD_BASE_URLS[mode]
251
- )
252
- });
253
- await verifyCloudWorkspace(
254
- String(qaEnv.TASKFORCE_PLAYWRIGHT_CLOUD_BASE_URL || QA_CLOUD_BASE_URLS[mode]),
255
- paths.playwrightStorageState,
256
- expectedWorkspace
257
- );
258
- console.log('[qa:open] Cloud auth and workspace verification passed.');
259
- }
260
-
261
- const devAppStartedAt = Date.now();
262
- const devApp = spawnLogged('npm', ['run', 'dev:app'], {
263
- cwd: REPO_ROOT,
264
- env: runtimeEnv,
265
- stdoutLogPath: path.join(paths.logsDir, 'dev-app.stdout.log'),
266
- stderrLogPath: path.join(paths.logsDir, 'dev-app.stderr.log'),
267
- stdoutPrefix: '[qa:open:dev-app] ',
268
- stderrPrefix: '[qa:open:dev-app] '
269
- });
270
- let runtime;
271
- let cleanupSignalHandlers = () => {};
272
- let shutdownStarted = false;
273
- let shutdownTimer = null;
274
-
275
- const shutdown = () => {
276
- if (shutdownStarted) return;
277
- shutdownStarted = true;
278
- for (const child of [runtime, devApp]) {
279
- if (child?.exitCode == null && child?.signalCode == null) {
280
- child.kill('SIGTERM');
281
- }
282
- }
283
- shutdownTimer = setTimeout(() => {
284
- for (const child of [runtime, devApp]) {
285
- if (child?.exitCode == null && child?.signalCode == null) {
286
- child.kill('SIGKILL');
287
- }
288
- }
289
- }, 5000);
290
- shutdownTimer.unref?.();
291
- };
292
-
293
- try {
294
- await waitForFreshUiBuild(devApp, devAppStartedAt);
295
- console.log('[qa:open] Standalone UI build is ready.');
296
-
297
- const runtimeArgs = ['--import', TSX_LOADER_PATH, CLI_PATH, 'open'];
298
- if (mode !== 'local') runtimeArgs.push(mode);
299
- if (preferredPort) runtimeArgs.push(String(preferredPort));
300
- runtime = spawnLogged(process.execPath, runtimeArgs, {
301
- cwd: paths.projectRoot,
302
- env: runtimeEnv,
303
- stdoutLogPath: path.join(paths.logsDir, 'runtime.stdout.log'),
304
- stderrLogPath: path.join(paths.logsDir, 'runtime.stderr.log'),
305
- stdoutPrefix: '[qa:open:runtime] ',
306
- stderrPrefix: '[qa:open:runtime] '
307
- });
308
-
309
- const devAppExit = waitForChildExit(devApp, 'UI watch process');
310
- const runtimeExit = waitForChildExit(runtime, 'Runtime process');
311
- const signalResult = await new Promise((resolve) => {
312
- const onSignal = (signal) => {
313
- shutdown();
314
- resolve({ type: 'signal', signal });
315
- };
316
- process.once('SIGINT', onSignal);
317
- process.once('SIGTERM', onSignal);
318
- cleanupSignalHandlers = () => {
319
- process.off('SIGINT', onSignal);
320
- process.off('SIGTERM', onSignal);
321
- };
322
- Promise.race([
323
- devAppExit.then((event) => ({ type: 'child', event })),
324
- runtimeExit.then((event) => ({ type: 'child', event }))
325
- ]).then(resolve, (error) => resolve({ type: 'error', error }));
326
- });
327
-
328
- cleanupSignalHandlers();
329
- shutdown();
330
- await Promise.allSettled([devAppExit, runtimeExit]);
331
-
332
- if (signalResult.type === 'signal') {
333
- return;
334
- }
335
- if (signalResult.type === 'error') {
336
- throw signalResult.error;
337
- }
338
- const { label, code, signal } = signalResult.event;
339
- throw new Error(`${label} exited unexpectedly (code=${code ?? 'null'} signal=${signal ?? 'null'}).`);
340
- } finally {
341
- cleanupSignalHandlers();
342
- shutdown();
343
- if (shutdownTimer) {
344
- clearTimeout(shutdownTimer);
345
- }
346
- }
347
- }
348
-
349
- main().catch((error) => {
350
- console.error(error instanceof Error ? error.message : String(error));
351
- process.exitCode = 1;
352
- });
@@ -1,88 +0,0 @@
1
- import * as fs from 'fs';
2
- import * as path from 'path';
3
-
4
- export function parseVersionTriplet(version) {
5
- const raw = String(version || '').trim();
6
- const match = raw.match(/^(\d+)\.(\d+)\.(\d+)(?:[-+].*)?$/);
7
- if (!match) return null;
8
- return {
9
- major: Number(match[1]),
10
- minor: Number(match[2]),
11
- patch: Number(match[3])
12
- };
13
- }
14
-
15
- export function parseReleaseTag(tag) {
16
- const raw = String(tag || '').trim();
17
- const match = raw.match(/^v(\d+)\.(\d+)\.(\d+)$/);
18
- if (!match) return null;
19
- return {
20
- major: Number(match[1]),
21
- minor: Number(match[2]),
22
- patch: Number(match[3])
23
- };
24
- }
25
-
26
- export function readVersionConfig(projectRoot) {
27
- const configPath = path.resolve(projectRoot, 'version.config.json');
28
- const raw = fs.readFileSync(configPath, 'utf8');
29
- const parsed = JSON.parse(raw);
30
- const major = Number(parsed?.major);
31
- const minor = Number(parsed?.minor);
32
- if (!Number.isInteger(major) || major < 0) {
33
- throw new Error(`version.config.json major must be a non-negative integer (got: ${parsed?.major})`);
34
- }
35
- if (!Number.isInteger(minor) || minor < 0) {
36
- throw new Error(`version.config.json minor must be a non-negative integer (got: ${parsed?.minor})`);
37
- }
38
- return {
39
- major,
40
- minor,
41
- path: configPath
42
- };
43
- }
44
-
45
- export function readPackageVersion(projectRoot) {
46
- const packagePath = path.resolve(projectRoot, 'package.json');
47
- const raw = fs.readFileSync(packagePath, 'utf8');
48
- const parsed = JSON.parse(raw);
49
- return String(parsed?.version || '').trim();
50
- }
51
-
52
- export function computeNextPatch({
53
- major,
54
- minor,
55
- releaseTags,
56
- currentPackageVersion
57
- }) {
58
- const patches = (releaseTags || [])
59
- .map(parseReleaseTag)
60
- .filter(tag => tag && tag.major === major && tag.minor === minor)
61
- .map(tag => tag.patch);
62
-
63
- if (patches.length > 0) {
64
- return Math.max(...patches) + 1;
65
- }
66
-
67
- const packageParsed = parseVersionTriplet(currentPackageVersion);
68
- if (packageParsed && packageParsed.major === major && packageParsed.minor === minor) {
69
- return packageParsed.patch + 1;
70
- }
71
-
72
- return 0;
73
- }
74
-
75
- export function computeNextVersion({
76
- major,
77
- minor,
78
- releaseTags,
79
- currentPackageVersion
80
- }) {
81
- const nextPatch = computeNextPatch({
82
- major,
83
- minor,
84
- releaseTags,
85
- currentPackageVersion
86
- });
87
- return `${major}.${minor}.${nextPatch}`;
88
- }