@taskforcehq/taskforce 0.3.309 → 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 (470) hide show
  1. package/README.md +89 -127
  2. package/dist/TaskforceCore.js +1 -1
  3. package/dist/components/context/ContextAttachmentManager.js +4 -3
  4. package/dist/components/features/InitiativesModule.js +1 -1
  5. package/dist/components/features/TaskSettings.js +1 -1
  6. package/dist/components/ui/DisclosureSectionHeader.d.ts +12 -0
  7. package/dist/components/ui/DisclosureSectionHeader.js +8 -0
  8. package/dist/components/views/PlanComparisonPage.js +1 -1
  9. package/dist/components/views/StandaloneLayout.js +18 -4
  10. package/dist/components/views/panels/PlanningDrawer.js +2 -1
  11. package/dist/components/views/standalone/modals/AccountHubModal.js +1 -1
  12. package/dist/components/views/standalone/modals/HelpModal.d.ts +3 -1
  13. package/dist/components/views/standalone/modals/HelpModal.js +17 -2
  14. package/dist/core/PlanEntitlementService.d.ts +2 -0
  15. package/dist/core/PlanEntitlementService.js +57 -4
  16. package/dist/hooks/useFilterSort.js +1 -1
  17. package/dist/hooks/useTaskforce.js +2 -2
  18. package/dist/hooks/workspace/useTaskforceWorkspaceBootstrap.js +5 -2
  19. package/dist/localization/locales/en-US.js +1 -1
  20. package/dist/localization/locales/es-419.js +1 -1
  21. package/dist/localization/locales/pt-BR.js +1 -1
  22. package/dist/mcp/runtime.js +49 -14
  23. package/dist/server/routes/billing.js +0 -1
  24. package/dist/ui/assets/AgentsModule-BULqIo8e.js +1 -0
  25. package/dist/ui/assets/{AnnotatedAttachmentWorkspace-CCckzWYZ.js → AnnotatedAttachmentWorkspace-DHr4rHK9.js} +1 -1
  26. package/dist/ui/assets/ContextAttachmentManager-DoMe2OpY.js +3 -0
  27. package/dist/ui/assets/{DocumentWorkspace-BVaWPA25.js → DocumentWorkspace-DumBWhvb.js} +1 -1
  28. package/dist/ui/assets/{EntityActivityTimeline-DSj0ThaK.js → EntityActivityTimeline-sHk8Nzbq.js} +1 -1
  29. package/dist/ui/assets/{InitiativesModule-AxMkWtxH.js → InitiativesModule-3X9UNzHh.js} +1 -1
  30. package/dist/ui/assets/PlansPage-C3A3EYaV.js +1 -0
  31. package/dist/ui/assets/PlansPage-DeAzWYTb.css +1 -0
  32. package/dist/ui/assets/{TaskContextUpload-Dw4rTF4i.js → TaskContextUpload-C8G7pWkX.js} +1 -1
  33. package/dist/ui/assets/{TaskSettings-f2ga42_V.js → TaskSettings-DM1o9Wla.js} +2 -2
  34. package/dist/ui/assets/{WorkflowsModule-E4UL3mov.js → WorkflowsModule-CW0crzvD.js} +1 -1
  35. package/dist/ui/assets/documentReferences-BZB3nMRb.js +1 -0
  36. package/dist/ui/assets/index-BWFQ9mGn.js +5 -0
  37. package/dist/ui/assets/{index-BvAbqx5Q.css → index-DcK_8tuE.css} +1 -1
  38. package/dist/ui/assets/{vendor-icons-B32hGuF2.js → vendor-icons-CLnehDTw.js} +1 -1
  39. package/dist/ui/index.html +3 -3
  40. package/dist/utils/supportContact.d.ts +9 -0
  41. package/dist/utils/supportContact.js +32 -0
  42. package/package.json +12 -4
  43. package/scripts/postinstall.js +4 -3
  44. package/dist/TaskforceCore.CategoryFallback.test.d.ts +0 -1
  45. package/dist/TaskforceCore.CategoryFallback.test.js +0 -101
  46. package/dist/TaskforceCore.filter-persistence.test.d.ts +0 -1
  47. package/dist/TaskforceCore.filter-persistence.test.js +0 -402
  48. package/dist/TaskforceCore.routing.test.d.ts +0 -1
  49. package/dist/TaskforceCore.routing.test.js +0 -311
  50. package/dist/TaskforceCore.test.d.ts +0 -1
  51. package/dist/TaskforceCore.test.js +0 -7910
  52. package/dist/TaskforceWidget.test.d.ts +0 -1
  53. package/dist/TaskforceWidget.test.js +0 -92
  54. package/dist/UnsavedChangesRelaxed.test.d.ts +0 -1
  55. package/dist/UnsavedChangesRelaxed.test.js +0 -16
  56. package/dist/__tests__/localizationCatalogs.test.d.ts +0 -1
  57. package/dist/__tests__/localizationCatalogs.test.js +0 -54
  58. package/dist/__tests__/workflowSimulation.test.d.ts +0 -1
  59. package/dist/__tests__/workflowSimulation.test.js +0 -113
  60. package/dist/annotatedAttachments/AnnotatedAttachmentSessionStore.test.d.ts +0 -1
  61. package/dist/annotatedAttachments/AnnotatedAttachmentSessionStore.test.js +0 -278
  62. package/dist/annotatedAttachments/payload.test.d.ts +0 -1
  63. package/dist/annotatedAttachments/payload.test.js +0 -67
  64. package/dist/compat/workspaceSyncCompat.test.d.ts +0 -1
  65. package/dist/compat/workspaceSyncCompat.test.js +0 -124
  66. package/dist/components/features/AgentsModule.test.d.ts +0 -1
  67. package/dist/components/features/AgentsModule.test.js +0 -601
  68. package/dist/components/features/AnnotatedAttachmentWorkspace.test.d.ts +0 -1
  69. package/dist/components/features/AnnotatedAttachmentWorkspace.test.js +0 -2883
  70. package/dist/components/features/DocumentWorkspace.test.d.ts +0 -1
  71. package/dist/components/features/DocumentWorkspace.test.js +0 -1439
  72. package/dist/components/features/TaskSettings.test.d.ts +0 -1
  73. package/dist/components/features/TaskSettings.test.js +0 -1674
  74. package/dist/components/features/settings/TaxonomyLibraryManager.test.d.ts +0 -1
  75. package/dist/components/features/settings/TaxonomyLibraryManager.test.js +0 -141
  76. package/dist/components/task/TaskActionHeader.test.d.ts +0 -1
  77. package/dist/components/task/TaskActionHeader.test.js +0 -91
  78. package/dist/components/task/TaskCard.test.d.ts +0 -1
  79. package/dist/components/task/TaskCard.test.js +0 -513
  80. package/dist/components/task/TaskContextUpload.test.d.ts +0 -1
  81. package/dist/components/task/TaskContextUpload.test.js +0 -506
  82. package/dist/components/task/TaskForm.test.d.ts +0 -1
  83. package/dist/components/task/TaskForm.test.js +0 -946
  84. package/dist/components/task/TaskKanban.empty-column-drop.test.d.ts +0 -1
  85. package/dist/components/task/TaskKanban.empty-column-drop.test.js +0 -66
  86. package/dist/components/task/TaskKanban.planning-drop.test.d.ts +0 -1
  87. package/dist/components/task/TaskKanban.planning-drop.test.js +0 -93
  88. package/dist/components/task/TaskKanban.test.d.ts +0 -1
  89. package/dist/components/task/TaskKanban.test.js +0 -99
  90. package/dist/components/task/TaskList.test.d.ts +0 -1
  91. package/dist/components/task/TaskList.test.js +0 -473
  92. package/dist/components/task/TaskStatusActions.test.d.ts +0 -1
  93. package/dist/components/task/TaskStatusActions.test.js +0 -54
  94. package/dist/components/task/taskKanbanDropRules.test.d.ts +0 -1
  95. package/dist/components/task/taskKanbanDropRules.test.js +0 -114
  96. package/dist/components/ui/LevelSelector.test.d.ts +0 -1
  97. package/dist/components/ui/LevelSelector.test.js +0 -55
  98. package/dist/components/ui/Markdown.test.d.ts +0 -1
  99. package/dist/components/ui/Markdown.test.js +0 -38
  100. package/dist/components/ui/MultiSelectFilter.test.d.ts +0 -1
  101. package/dist/components/ui/MultiSelectFilter.test.js +0 -74
  102. package/dist/components/ui/TaxonomyDropdown.test.d.ts +0 -1
  103. package/dist/components/ui/TaxonomyDropdown.test.js +0 -130
  104. package/dist/components/ui/TopNoticeLayer.test.d.ts +0 -1
  105. package/dist/components/ui/TopNoticeLayer.test.js +0 -25
  106. package/dist/components/views/AppShellHeader.test.d.ts +0 -1
  107. package/dist/components/views/AppShellHeader.test.js +0 -42
  108. package/dist/components/views/PlanComparisonPage.test.d.ts +0 -1
  109. package/dist/components/views/PlanComparisonPage.test.js +0 -757
  110. package/dist/components/views/PlansPage.test.d.ts +0 -1
  111. package/dist/components/views/PlansPage.test.js +0 -710
  112. package/dist/components/views/chrome/WorkspaceChromeSections.test.d.ts +0 -1
  113. package/dist/components/views/chrome/WorkspaceChromeSections.test.js +0 -54
  114. package/dist/components/views/chrome/workspaceChrome.test.d.ts +0 -1
  115. package/dist/components/views/chrome/workspaceChrome.test.js +0 -52
  116. package/dist/components/views/panels/DocumentFilterToolbar.test.d.ts +0 -1
  117. package/dist/components/views/panels/DocumentFilterToolbar.test.js +0 -19
  118. package/dist/components/views/panels/FilterToolbar.test.d.ts +0 -1
  119. package/dist/components/views/panels/FilterToolbar.test.js +0 -47
  120. package/dist/components/views/panels/PlanningDrawer.test.d.ts +0 -1
  121. package/dist/components/views/panels/PlanningDrawer.test.js +0 -529
  122. package/dist/components/views/planningScope.test.d.ts +0 -1
  123. package/dist/components/views/planningScope.test.js +0 -60
  124. package/dist/components/views/standalone/modals/AccountHubModal.test.d.ts +0 -1
  125. package/dist/components/views/standalone/modals/AccountHubModal.test.js +0 -66
  126. package/dist/components/views/standalone/modals/SyncEnableWarningModal.test.d.ts +0 -1
  127. package/dist/components/views/standalone/modals/SyncEnableWarningModal.test.js +0 -24
  128. package/dist/components/views/teamManagementAccess.test.d.ts +0 -1
  129. package/dist/components/views/teamManagementAccess.test.js +0 -44
  130. package/dist/config/deployment.test.d.ts +0 -1
  131. package/dist/config/deployment.test.js +0 -90
  132. package/dist/config/envSchema.test.d.ts +0 -1
  133. package/dist/config/envSchema.test.js +0 -125
  134. package/dist/core/AiProfileService.test.d.ts +0 -1
  135. package/dist/core/AiProfileService.test.js +0 -184
  136. package/dist/core/AiProfiles.test.d.ts +0 -1
  137. package/dist/core/AiProfiles.test.js +0 -1873
  138. package/dist/core/AuthTokenService.test.d.ts +0 -1
  139. package/dist/core/AuthTokenService.test.js +0 -78
  140. package/dist/core/BulkUpdateFieldsPreview.test.d.ts +0 -1
  141. package/dist/core/BulkUpdateFieldsPreview.test.js +0 -62
  142. package/dist/core/CompletedAt.test.d.ts +0 -1
  143. package/dist/core/CompletedAt.test.js +0 -44
  144. package/dist/core/CreatedBy.test.d.ts +0 -1
  145. package/dist/core/CreatedBy.test.js +0 -188
  146. package/dist/core/DeletedTaskTrash.test.d.ts +0 -1
  147. package/dist/core/DeletedTaskTrash.test.js +0 -104
  148. package/dist/core/EntitlementsPolicy.test.d.ts +0 -1
  149. package/dist/core/EntitlementsPolicy.test.js +0 -280
  150. package/dist/core/GlobalSettingsService.test.d.ts +0 -1
  151. package/dist/core/GlobalSettingsService.test.js +0 -45
  152. package/dist/core/JsonBackupRuntime.test.d.ts +0 -1
  153. package/dist/core/JsonBackupRuntime.test.js +0 -155
  154. package/dist/core/PlanFeatureCatalog.test.d.ts +0 -1
  155. package/dist/core/PlanFeatureCatalog.test.js +0 -139
  156. package/dist/core/PlanVersionPolicy.test.d.ts +0 -1
  157. package/dist/core/PlanVersionPolicy.test.js +0 -204
  158. package/dist/core/PlanningEntities.test.d.ts +0 -1
  159. package/dist/core/PlanningEntities.test.js +0 -509
  160. package/dist/core/ScheduleFields.test.d.ts +0 -1
  161. package/dist/core/ScheduleFields.test.js +0 -193
  162. package/dist/core/SetupState.test.d.ts +0 -1
  163. package/dist/core/SetupState.test.js +0 -113
  164. package/dist/core/SignupMonetizationSettings.test.d.ts +0 -1
  165. package/dist/core/SignupMonetizationSettings.test.js +0 -515
  166. package/dist/core/Stats.test.d.ts +0 -1
  167. package/dist/core/Stats.test.js +0 -36
  168. package/dist/core/SystemAdmin.test.d.ts +0 -1
  169. package/dist/core/SystemAdmin.test.js +0 -1106
  170. package/dist/core/TaskActivitySync.test.d.ts +0 -1
  171. package/dist/core/TaskActivitySync.test.js +0 -90
  172. package/dist/core/TaskAttachmentsCanonical.test.d.ts +0 -1
  173. package/dist/core/TaskAttachmentsCanonical.test.js +0 -356
  174. package/dist/core/TaskAuditTimeline.test.d.ts +0 -1
  175. package/dist/core/TaskAuditTimeline.test.js +0 -319
  176. package/dist/core/TaskTaxonomyValidation.test.d.ts +0 -1
  177. package/dist/core/TaskTaxonomyValidation.test.js +0 -440
  178. package/dist/core/Taskforce.ids.test.d.ts +0 -1
  179. package/dist/core/Taskforce.ids.test.js +0 -611
  180. package/dist/core/Taskforce.listTasksSlim.test.d.ts +0 -1
  181. package/dist/core/Taskforce.listTasksSlim.test.js +0 -91
  182. package/dist/core/Taskforce.mcpAuth.test.d.ts +0 -1
  183. package/dist/core/Taskforce.mcpAuth.test.js +0 -450
  184. package/dist/core/Taskforce.realtimeMutation.test.d.ts +0 -1
  185. package/dist/core/Taskforce.realtimeMutation.test.js +0 -131
  186. package/dist/core/UserProfileAvatarDrafts.test.d.ts +0 -1
  187. package/dist/core/UserProfileAvatarDrafts.test.js +0 -138
  188. package/dist/core/WorkspaceDelete.test.d.ts +0 -1
  189. package/dist/core/WorkspaceDelete.test.js +0 -159
  190. package/dist/core/WorkspacePermissions.test.d.ts +0 -1
  191. package/dist/core/WorkspacePermissions.test.js +0 -270
  192. package/dist/core/WorkspacePlanMode.test.d.ts +0 -1
  193. package/dist/core/WorkspacePlanMode.test.js +0 -383
  194. package/dist/core/WorkspaceSyncSettings.test.d.ts +0 -1
  195. package/dist/core/WorkspaceSyncSettings.test.js +0 -65
  196. package/dist/core/__tests__/TaskAttachmentsCanonical.test.d.ts +0 -1
  197. package/dist/core/__tests__/TaskAttachmentsCanonical.test.js +0 -212
  198. package/dist/documentReviews/DocumentReviewSessionStore.test.d.ts +0 -1
  199. package/dist/documentReviews/DocumentReviewSessionStore.test.js +0 -127
  200. package/dist/hooks/authGuardPolicy.test.d.ts +0 -1
  201. package/dist/hooks/authGuardPolicy.test.js +0 -76
  202. package/dist/hooks/bootstrapTimeouts.test.d.ts +0 -1
  203. package/dist/hooks/bootstrapTimeouts.test.js +0 -12
  204. package/dist/hooks/sync/controlPlane.test.d.ts +0 -1
  205. package/dist/hooks/sync/controlPlane.test.js +0 -121
  206. package/dist/hooks/sync/lifecyclePolicy.test.d.ts +0 -1
  207. package/dist/hooks/sync/lifecyclePolicy.test.js +0 -124
  208. package/dist/hooks/sync/orchestratorShared.test.d.ts +0 -1
  209. package/dist/hooks/sync/orchestratorShared.test.js +0 -98
  210. package/dist/hooks/sync/pullLifecycle.test.d.ts +0 -1
  211. package/dist/hooks/sync/pullLifecycle.test.js +0 -80
  212. package/dist/hooks/sync/recovery.test.d.ts +0 -1
  213. package/dist/hooks/sync/recovery.test.js +0 -292
  214. package/dist/hooks/sync/transfers.test.d.ts +0 -1
  215. package/dist/hooks/sync/transfers.test.js +0 -928
  216. package/dist/hooks/sync/useRecentSyncEvents.test.d.ts +0 -1
  217. package/dist/hooks/sync/useRecentSyncEvents.test.js +0 -124
  218. package/dist/hooks/sync/useSyncStatusActions.test.d.ts +0 -1
  219. package/dist/hooks/sync/useSyncStatusActions.test.js +0 -133
  220. package/dist/hooks/sync/useSyncStatusControls.test.d.ts +0 -1
  221. package/dist/hooks/sync/useSyncStatusControls.test.js +0 -88
  222. package/dist/hooks/useFilterSort.test.d.ts +0 -1
  223. package/dist/hooks/useFilterSort.test.js +0 -419
  224. package/dist/hooks/useRealtimeSync.test.d.ts +0 -1
  225. package/dist/hooks/useRealtimeSync.test.js +0 -311
  226. package/dist/hooks/useSyncOrchestrator.aiProfiles.test.d.ts +0 -1
  227. package/dist/hooks/useSyncOrchestrator.aiProfiles.test.js +0 -54
  228. package/dist/hooks/useSyncOrchestrator.context-assets.test.d.ts +0 -1
  229. package/dist/hooks/useSyncOrchestrator.context-assets.test.js +0 -228
  230. package/dist/hooks/useSyncOrchestrator.retry-closure.test.d.ts +0 -1
  231. package/dist/hooks/useSyncOrchestrator.retry-closure.test.js +0 -2027
  232. package/dist/hooks/useTaskData.test.d.ts +0 -1
  233. package/dist/hooks/useTaskData.test.js +0 -291
  234. package/dist/hooks/useTaskMutations.test.d.ts +0 -1
  235. package/dist/hooks/useTaskMutations.test.js +0 -256
  236. package/dist/hooks/useTaskforce.contract.test.d.ts +0 -1
  237. package/dist/hooks/useTaskforce.contract.test.js +0 -7
  238. package/dist/hooks/useTaskforce.priority-filters.test.d.ts +0 -1
  239. package/dist/hooks/useTaskforce.priority-filters.test.js +0 -28
  240. package/dist/hooks/useTaskforce.runtime-routing.test.d.ts +0 -1
  241. package/dist/hooks/useTaskforce.runtime-routing.test.js +0 -246
  242. package/dist/hooks/useTaskforce.sync-behavior.test.d.ts +0 -1
  243. package/dist/hooks/useTaskforce.sync-behavior.test.js +0 -3644
  244. package/dist/hooks/useWorkspaceSyncController.test.d.ts +0 -1
  245. package/dist/hooks/useWorkspaceSyncController.test.js +0 -192
  246. package/dist/hooks/workspace/useTaskforceApiRouting.test.d.ts +0 -1
  247. package/dist/hooks/workspace/useTaskforceApiRouting.test.js +0 -77
  248. package/dist/hooks/workspace/workspaceLocalState.test.d.ts +0 -1
  249. package/dist/hooks/workspace/workspaceLocalState.test.js +0 -59
  250. package/dist/localization/localizationCatalogs.test.d.ts +0 -1
  251. package/dist/localization/localizationCatalogs.test.js +0 -37
  252. package/dist/mcp/aiProfileBootstrap.test.d.ts +0 -1
  253. package/dist/mcp/aiProfileBootstrap.test.js +0 -68
  254. package/dist/mcp/canonicalAssetHelpers.test.d.ts +0 -1
  255. package/dist/mcp/canonicalAssetHelpers.test.js +0 -67
  256. package/dist/mcp/clientIntegrations.test.d.ts +0 -1
  257. package/dist/mcp/clientIntegrations.test.js +0 -219
  258. package/dist/mcp/optionResolution.test.d.ts +0 -1
  259. package/dist/mcp/optionResolution.test.js +0 -43
  260. package/dist/mcp/runtime.test.d.ts +0 -1
  261. package/dist/mcp/runtime.test.js +0 -5120
  262. package/dist/mcp/structuredCommentValidation.test.d.ts +0 -1
  263. package/dist/mcp/structuredCommentValidation.test.js +0 -31
  264. package/dist/mcp/structuredDocValidation.test.d.ts +0 -1
  265. package/dist/mcp/structuredDocValidation.test.js +0 -35
  266. package/dist/mcp/toolRegistry.test.d.ts +0 -1
  267. package/dist/mcp/toolRegistry.test.js +0 -34
  268. package/dist/migrations/billingSchemaParity.test.d.ts +0 -1
  269. package/dist/migrations/billingSchemaParity.test.js +0 -160
  270. package/dist/migrations/taskSchemaMigrations.test.d.ts +0 -1
  271. package/dist/migrations/taskSchemaMigrations.test.js +0 -225
  272. package/dist/qaOpen.test.d.ts +0 -1
  273. package/dist/qaOpen.test.js +0 -56
  274. package/dist/releaseVersion.test.d.ts +0 -1
  275. package/dist/releaseVersion.test.js +0 -32
  276. package/dist/runtime/appGates.test.d.ts +0 -1
  277. package/dist/runtime/appGates.test.js +0 -42
  278. package/dist/server/aiProfileAvatarAssets.test.d.ts +0 -1
  279. package/dist/server/aiProfileAvatarAssets.test.js +0 -213
  280. package/dist/server/annotatedAttachmentsRoutes.test.d.ts +0 -1
  281. package/dist/server/annotatedAttachmentsRoutes.test.js +0 -532
  282. package/dist/server/auth.test.d.ts +0 -1
  283. package/dist/server/auth.test.js +0 -131
  284. package/dist/server/buildInfo.test.d.ts +0 -1
  285. package/dist/server/buildInfo.test.js +0 -29
  286. package/dist/server/cors.test.d.ts +0 -1
  287. package/dist/server/cors.test.js +0 -77
  288. package/dist/server/documentReviewRoutes.test.d.ts +0 -1
  289. package/dist/server/documentReviewRoutes.test.js +0 -190
  290. package/dist/server/email.test.d.ts +0 -1
  291. package/dist/server/email.test.js +0 -113
  292. package/dist/server/index.cookieProxy.test.d.ts +0 -1
  293. package/dist/server/index.cookieProxy.test.js +0 -67
  294. package/dist/server/index.rateLimit.test.d.ts +0 -1
  295. package/dist/server/index.rateLimit.test.js +0 -22
  296. package/dist/server/index.test.d.ts +0 -1
  297. package/dist/server/index.test.js +0 -283
  298. package/dist/server/rateLimit.test.d.ts +0 -1
  299. package/dist/server/rateLimit.test.js +0 -107
  300. package/dist/server/realtimeSync.auth.test.d.ts +0 -1
  301. package/dist/server/realtimeSync.auth.test.js +0 -62
  302. package/dist/server/realtimeSync.replay.test.d.ts +0 -1
  303. package/dist/server/realtimeSync.replay.test.js +0 -192
  304. package/dist/server/realtimeSync.workspaceIsolation.test.d.ts +0 -1
  305. package/dist/server/realtimeSync.workspaceIsolation.test.js +0 -101
  306. package/dist/server/routes/billing.test.d.ts +0 -1
  307. package/dist/server/routes/billing.test.js +0 -3455
  308. package/dist/server/routes/shared.test.d.ts +0 -1
  309. package/dist/server/routes/shared.test.js +0 -32
  310. package/dist/server/routes/sync.integration.test.d.ts +0 -1
  311. package/dist/server/routes/sync.integration.test.js +0 -2932
  312. package/dist/server/routes/syncAuxRoutes.test.d.ts +0 -1
  313. package/dist/server/routes/syncAuxRoutes.test.js +0 -158
  314. package/dist/server/routes/syncRouteGuards.test.d.ts +0 -1
  315. package/dist/server/routes/syncRouteGuards.test.js +0 -94
  316. package/dist/server/routes.test.d.ts +0 -1
  317. package/dist/server/routes.test.js +0 -15612
  318. package/dist/server/runtimeMode.test.d.ts +0 -1
  319. package/dist/server/runtimeMode.test.js +0 -26
  320. package/dist/server/securityHeaders.test.d.ts +0 -1
  321. package/dist/server/securityHeaders.test.js +0 -70
  322. package/dist/services/templateEngine.test.d.ts +0 -1
  323. package/dist/services/templateEngine.test.js +0 -150
  324. package/dist/services/templates.test.d.ts +0 -1
  325. package/dist/services/templates.test.js +0 -45
  326. package/dist/services/workflowDocumentFixtures.test.d.ts +0 -1
  327. package/dist/services/workflowDocumentFixtures.test.js +0 -78
  328. package/dist/services/workflowExportMatrix.test.d.ts +0 -1
  329. package/dist/services/workflowExportMatrix.test.js +0 -113
  330. package/dist/services/workflowExportSnapshots.test.d.ts +0 -1
  331. package/dist/services/workflowExportSnapshots.test.js +0 -30
  332. package/dist/services/workflowGeneration.test.d.ts +0 -1
  333. package/dist/services/workflowGeneration.test.js +0 -12
  334. package/dist/services/workflowSimulation.test.d.ts +0 -1
  335. package/dist/services/workflowSimulation.test.js +0 -113
  336. package/dist/services/workflowV2Policy.test.d.ts +0 -1
  337. package/dist/services/workflowV2Policy.test.js +0 -80
  338. package/dist/shared/customTaxonomyLibrary.test.d.ts +0 -1
  339. package/dist/shared/customTaxonomyLibrary.test.js +0 -20
  340. package/dist/shared/passwordPolicy.test.d.ts +0 -1
  341. package/dist/shared/passwordPolicy.test.js +0 -34
  342. package/dist/shared/runtimeContract.test.d.ts +0 -1
  343. package/dist/shared/runtimeContract.test.js +0 -23
  344. package/dist/shared/taxonomyLibrary.test.d.ts +0 -1
  345. package/dist/shared/taxonomyLibrary.test.js +0 -26
  346. package/dist/shared/taxonomyState.test.d.ts +0 -1
  347. package/dist/shared/taxonomyState.test.js +0 -71
  348. package/dist/soak/preflight.cli.d.ts +0 -1
  349. package/dist/soak/preflight.cli.js +0 -28
  350. package/dist/soak/preflight.d.ts +0 -26
  351. package/dist/soak/preflight.js +0 -113
  352. package/dist/soak/preflight.test.d.ts +0 -1
  353. package/dist/soak/preflight.test.js +0 -39
  354. package/dist/storage/objectStorageClient.test.d.ts +0 -1
  355. package/dist/storage/objectStorageClient.test.js +0 -82
  356. package/dist/storage/objectStorageConfig.test.d.ts +0 -1
  357. package/dist/storage/objectStorageConfig.test.js +0 -50
  358. package/dist/storage/postgresAdapter.test.d.ts +0 -1
  359. package/dist/storage/postgresAdapter.test.js +0 -29
  360. package/dist/storage/workspaceAssetStore.test.d.ts +0 -1
  361. package/dist/storage/workspaceAssetStore.test.js +0 -588
  362. package/dist/sync/cloudSyncApi.test.d.ts +0 -1
  363. package/dist/sync/cloudSyncApi.test.js +0 -111
  364. package/dist/sync/collaborationSyncPayload.test.d.ts +0 -1
  365. package/dist/sync/collaborationSyncPayload.test.js +0 -125
  366. package/dist/sync/contentSyncPayload.test.d.ts +0 -1
  367. package/dist/sync/contentSyncPayload.test.js +0 -143
  368. package/dist/sync/encryptionService.test.d.ts +0 -1
  369. package/dist/sync/encryptionService.test.js +0 -52
  370. package/dist/sync/planningSyncPayload.test.d.ts +0 -1
  371. package/dist/sync/planningSyncPayload.test.js +0 -92
  372. package/dist/sync/realtimeFeature.test.d.ts +0 -1
  373. package/dist/sync/realtimeFeature.test.js +0 -30
  374. package/dist/sync/realtimeReconcile.test.d.ts +0 -1
  375. package/dist/sync/realtimeReconcile.test.js +0 -43
  376. package/dist/sync/syncApplyHandlers.test.d.ts +0 -1
  377. package/dist/sync/syncApplyHandlers.test.js +0 -626
  378. package/dist/sync/syncService.test.d.ts +0 -1
  379. package/dist/sync/syncService.test.js +0 -903
  380. package/dist/sync/taskSyncPayload.test.d.ts +0 -1
  381. package/dist/sync/taskSyncPayload.test.js +0 -54
  382. package/dist/sync/workspacePullFeed.test.d.ts +0 -1
  383. package/dist/sync/workspacePullFeed.test.js +0 -438
  384. package/dist/sync/workspaceSyncModel.test.d.ts +0 -1
  385. package/dist/sync/workspaceSyncModel.test.js +0 -1442
  386. package/dist/test/setup.d.ts +0 -1
  387. package/dist/test/setup.js +0 -15
  388. package/dist/ui/assets/AgentsModule-BS4Pi_nC.js +0 -1
  389. package/dist/ui/assets/ContextAttachmentManager-CfG_ER7C.js +0 -3
  390. package/dist/ui/assets/PlansPage-B_z-D6Nh.css +0 -1
  391. package/dist/ui/assets/PlansPage-Ndt7mYfo.js +0 -1
  392. package/dist/ui/assets/documentReferences-BOUcJm6-.js +0 -1
  393. package/dist/ui/assets/index-MAHKvFqp.js +0 -4
  394. package/dist/utils/accountProfileSummaryCache.test.d.ts +0 -1
  395. package/dist/utils/accountProfileSummaryCache.test.js +0 -63
  396. package/dist/utils/annotatedAttachments.test.d.ts +0 -1
  397. package/dist/utils/annotatedAttachments.test.js +0 -108
  398. package/dist/utils/assignees.test.d.ts +0 -1
  399. package/dist/utils/assignees.test.js +0 -25
  400. package/dist/utils/avatarUpload.test.d.ts +0 -1
  401. package/dist/utils/avatarUpload.test.js +0 -40
  402. package/dist/utils/canonicalAssetKind.test.d.ts +0 -1
  403. package/dist/utils/canonicalAssetKind.test.js +0 -24
  404. package/dist/utils/coalescedRefresh.test.d.ts +0 -1
  405. package/dist/utils/coalescedRefresh.test.js +0 -30
  406. package/dist/utils/constants.icons.test.d.ts +0 -1
  407. package/dist/utils/constants.icons.test.js +0 -41
  408. package/dist/utils/planParser.test.d.ts +0 -1
  409. package/dist/utils/planParser.test.js +0 -183
  410. package/dist/utils/planningReferences.test.d.ts +0 -1
  411. package/dist/utils/planningReferences.test.js +0 -17
  412. package/dist/utils/syncEventDetails.test.d.ts +0 -1
  413. package/dist/utils/syncEventDetails.test.js +0 -23
  414. package/dist/utils/syncEventPresentation.test.d.ts +0 -1
  415. package/dist/utils/syncEventPresentation.test.js +0 -64
  416. package/dist/utils/syncStatusPresentation.test.d.ts +0 -1
  417. package/dist/utils/syncStatusPresentation.test.js +0 -164
  418. package/dist/utils/taskActivity.test.d.ts +0 -1
  419. package/dist/utils/taskActivity.test.js +0 -218
  420. package/dist/utils/taskDraftDefaults.test.d.ts +0 -1
  421. package/dist/utils/taskDraftDefaults.test.js +0 -34
  422. package/dist/utils/taskDragZones.test.d.ts +0 -1
  423. package/dist/utils/taskDragZones.test.js +0 -14
  424. package/dist/utils/taskNormalization.test.d.ts +0 -1
  425. package/dist/utils/taskNormalization.test.js +0 -158
  426. package/dist/utils/taskSearch.test.d.ts +0 -1
  427. package/dist/utils/taskSearch.test.js +0 -69
  428. package/dist/utils/taskUtils.test.d.ts +0 -1
  429. package/dist/utils/taskUtils.test.js +0 -19
  430. package/dist/utils/taskforceApiClient.test.d.ts +0 -1
  431. package/dist/utils/taskforceApiClient.test.js +0 -44
  432. package/dist/utils/taxonomyFormDefaults.test.d.ts +0 -1
  433. package/dist/utils/taxonomyFormDefaults.test.js +0 -63
  434. package/dist/utils/uiNotice.test.d.ts +0 -1
  435. package/dist/utils/uiNotice.test.js +0 -18
  436. package/dist/utils/workspaceIdentity.test.d.ts +0 -1
  437. package/dist/utils/workspaceIdentity.test.js +0 -61
  438. package/dist/utils/workspaceLifecycle.test.d.ts +0 -1
  439. package/dist/utils/workspaceLifecycle.test.js +0 -64
  440. package/dist/utils/workspaceSyncPresentation.test.d.ts +0 -1
  441. package/dist/utils/workspaceSyncPresentation.test.js +0 -71
  442. package/scripts/bootstrap-playwright-auth.mjs +0 -155
  443. package/scripts/check-cloud-mcp.mjs +0 -83
  444. package/scripts/check-compat-boundaries.mjs +0 -41
  445. package/scripts/check-env.ts +0 -31
  446. package/scripts/check-localization-strings.mjs +0 -49
  447. package/scripts/check-runtime-boundaries.mjs +0 -44
  448. package/scripts/debug-global.mjs +0 -34
  449. package/scripts/debug-login.mjs +0 -32
  450. package/scripts/debug-server.mjs +0 -36
  451. package/scripts/deploy-prod.sh +0 -41
  452. package/scripts/deploy-staging.sh +0 -23
  453. package/scripts/export-sqlite-to-postgres.mjs +0 -123
  454. package/scripts/generate-env-example.ts +0 -8
  455. package/scripts/mcp-stdio-adapter.mjs +0 -160
  456. package/scripts/migrate-task-data-assets.mjs +0 -408
  457. package/scripts/playwright-auth.sh +0 -19
  458. package/scripts/qa-open-lib.mjs +0 -175
  459. package/scripts/qa-open-lib.mjs.d.ts +0 -49
  460. package/scripts/qa-open.mjs +0 -352
  461. package/scripts/release-version-lib.mjs +0 -88
  462. package/scripts/release-version.mjs +0 -72
  463. package/scripts/run-billing-performance-smoke.sh +0 -24
  464. package/scripts/run-dev-proxy.sh +0 -51
  465. package/scripts/run-e2e-realtime.sh +0 -30
  466. package/scripts/run-smoke.sh +0 -35
  467. package/scripts/run-soak.sh +0 -41
  468. package/scripts/test-global.js +0 -143
  469. package/scripts/update-homebrew-formula.sh +0 -108
  470. 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
- }