@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.
- package/README.md +89 -127
- package/dist/TaskforceCore.js +1 -1
- package/dist/components/context/ContextAttachmentManager.js +4 -3
- package/dist/components/features/InitiativesModule.js +1 -1
- package/dist/components/features/TaskSettings.js +1 -1
- package/dist/components/ui/DisclosureSectionHeader.d.ts +12 -0
- package/dist/components/ui/DisclosureSectionHeader.js +8 -0
- package/dist/components/views/PlanComparisonPage.js +1 -1
- package/dist/components/views/StandaloneLayout.js +18 -4
- package/dist/components/views/panels/PlanningDrawer.js +2 -1
- package/dist/components/views/standalone/modals/AccountHubModal.js +1 -1
- package/dist/components/views/standalone/modals/HelpModal.d.ts +3 -1
- package/dist/components/views/standalone/modals/HelpModal.js +17 -2
- package/dist/core/PlanEntitlementService.d.ts +2 -0
- package/dist/core/PlanEntitlementService.js +57 -4
- package/dist/hooks/useFilterSort.js +1 -1
- package/dist/hooks/useTaskforce.js +2 -2
- package/dist/hooks/workspace/useTaskforceWorkspaceBootstrap.js +5 -2
- package/dist/localization/locales/en-US.js +1 -1
- package/dist/localization/locales/es-419.js +1 -1
- package/dist/localization/locales/pt-BR.js +1 -1
- package/dist/mcp/runtime.js +49 -14
- package/dist/server/routes/billing.js +0 -1
- package/dist/ui/assets/AgentsModule-BULqIo8e.js +1 -0
- package/dist/ui/assets/{AnnotatedAttachmentWorkspace-CCckzWYZ.js → AnnotatedAttachmentWorkspace-DHr4rHK9.js} +1 -1
- package/dist/ui/assets/ContextAttachmentManager-DoMe2OpY.js +3 -0
- package/dist/ui/assets/{DocumentWorkspace-BVaWPA25.js → DocumentWorkspace-DumBWhvb.js} +1 -1
- package/dist/ui/assets/{EntityActivityTimeline-DSj0ThaK.js → EntityActivityTimeline-sHk8Nzbq.js} +1 -1
- package/dist/ui/assets/{InitiativesModule-AxMkWtxH.js → InitiativesModule-3X9UNzHh.js} +1 -1
- package/dist/ui/assets/PlansPage-C3A3EYaV.js +1 -0
- package/dist/ui/assets/PlansPage-DeAzWYTb.css +1 -0
- package/dist/ui/assets/{TaskContextUpload-Dw4rTF4i.js → TaskContextUpload-C8G7pWkX.js} +1 -1
- package/dist/ui/assets/{TaskSettings-f2ga42_V.js → TaskSettings-DM1o9Wla.js} +2 -2
- package/dist/ui/assets/{WorkflowsModule-E4UL3mov.js → WorkflowsModule-CW0crzvD.js} +1 -1
- package/dist/ui/assets/documentReferences-BZB3nMRb.js +1 -0
- package/dist/ui/assets/index-BWFQ9mGn.js +5 -0
- package/dist/ui/assets/{index-BvAbqx5Q.css → index-DcK_8tuE.css} +1 -1
- package/dist/ui/assets/{vendor-icons-B32hGuF2.js → vendor-icons-CLnehDTw.js} +1 -1
- package/dist/ui/index.html +3 -3
- package/dist/utils/supportContact.d.ts +9 -0
- package/dist/utils/supportContact.js +32 -0
- package/package.json +12 -4
- package/scripts/postinstall.js +4 -3
- package/dist/TaskforceCore.CategoryFallback.test.d.ts +0 -1
- package/dist/TaskforceCore.CategoryFallback.test.js +0 -101
- package/dist/TaskforceCore.filter-persistence.test.d.ts +0 -1
- package/dist/TaskforceCore.filter-persistence.test.js +0 -402
- package/dist/TaskforceCore.routing.test.d.ts +0 -1
- package/dist/TaskforceCore.routing.test.js +0 -311
- package/dist/TaskforceCore.test.d.ts +0 -1
- package/dist/TaskforceCore.test.js +0 -7910
- package/dist/TaskforceWidget.test.d.ts +0 -1
- package/dist/TaskforceWidget.test.js +0 -92
- package/dist/UnsavedChangesRelaxed.test.d.ts +0 -1
- package/dist/UnsavedChangesRelaxed.test.js +0 -16
- package/dist/__tests__/localizationCatalogs.test.d.ts +0 -1
- package/dist/__tests__/localizationCatalogs.test.js +0 -54
- package/dist/__tests__/workflowSimulation.test.d.ts +0 -1
- package/dist/__tests__/workflowSimulation.test.js +0 -113
- package/dist/annotatedAttachments/AnnotatedAttachmentSessionStore.test.d.ts +0 -1
- package/dist/annotatedAttachments/AnnotatedAttachmentSessionStore.test.js +0 -278
- package/dist/annotatedAttachments/payload.test.d.ts +0 -1
- package/dist/annotatedAttachments/payload.test.js +0 -67
- package/dist/compat/workspaceSyncCompat.test.d.ts +0 -1
- package/dist/compat/workspaceSyncCompat.test.js +0 -124
- package/dist/components/features/AgentsModule.test.d.ts +0 -1
- package/dist/components/features/AgentsModule.test.js +0 -601
- package/dist/components/features/AnnotatedAttachmentWorkspace.test.d.ts +0 -1
- package/dist/components/features/AnnotatedAttachmentWorkspace.test.js +0 -2883
- package/dist/components/features/DocumentWorkspace.test.d.ts +0 -1
- package/dist/components/features/DocumentWorkspace.test.js +0 -1439
- package/dist/components/features/TaskSettings.test.d.ts +0 -1
- package/dist/components/features/TaskSettings.test.js +0 -1674
- package/dist/components/features/settings/TaxonomyLibraryManager.test.d.ts +0 -1
- package/dist/components/features/settings/TaxonomyLibraryManager.test.js +0 -141
- package/dist/components/task/TaskActionHeader.test.d.ts +0 -1
- package/dist/components/task/TaskActionHeader.test.js +0 -91
- package/dist/components/task/TaskCard.test.d.ts +0 -1
- package/dist/components/task/TaskCard.test.js +0 -513
- package/dist/components/task/TaskContextUpload.test.d.ts +0 -1
- package/dist/components/task/TaskContextUpload.test.js +0 -506
- package/dist/components/task/TaskForm.test.d.ts +0 -1
- package/dist/components/task/TaskForm.test.js +0 -946
- package/dist/components/task/TaskKanban.empty-column-drop.test.d.ts +0 -1
- package/dist/components/task/TaskKanban.empty-column-drop.test.js +0 -66
- package/dist/components/task/TaskKanban.planning-drop.test.d.ts +0 -1
- package/dist/components/task/TaskKanban.planning-drop.test.js +0 -93
- package/dist/components/task/TaskKanban.test.d.ts +0 -1
- package/dist/components/task/TaskKanban.test.js +0 -99
- package/dist/components/task/TaskList.test.d.ts +0 -1
- package/dist/components/task/TaskList.test.js +0 -473
- package/dist/components/task/TaskStatusActions.test.d.ts +0 -1
- package/dist/components/task/TaskStatusActions.test.js +0 -54
- package/dist/components/task/taskKanbanDropRules.test.d.ts +0 -1
- package/dist/components/task/taskKanbanDropRules.test.js +0 -114
- package/dist/components/ui/LevelSelector.test.d.ts +0 -1
- package/dist/components/ui/LevelSelector.test.js +0 -55
- package/dist/components/ui/Markdown.test.d.ts +0 -1
- package/dist/components/ui/Markdown.test.js +0 -38
- package/dist/components/ui/MultiSelectFilter.test.d.ts +0 -1
- package/dist/components/ui/MultiSelectFilter.test.js +0 -74
- package/dist/components/ui/TaxonomyDropdown.test.d.ts +0 -1
- package/dist/components/ui/TaxonomyDropdown.test.js +0 -130
- package/dist/components/ui/TopNoticeLayer.test.d.ts +0 -1
- package/dist/components/ui/TopNoticeLayer.test.js +0 -25
- package/dist/components/views/AppShellHeader.test.d.ts +0 -1
- package/dist/components/views/AppShellHeader.test.js +0 -42
- package/dist/components/views/PlanComparisonPage.test.d.ts +0 -1
- package/dist/components/views/PlanComparisonPage.test.js +0 -757
- package/dist/components/views/PlansPage.test.d.ts +0 -1
- package/dist/components/views/PlansPage.test.js +0 -710
- package/dist/components/views/chrome/WorkspaceChromeSections.test.d.ts +0 -1
- package/dist/components/views/chrome/WorkspaceChromeSections.test.js +0 -54
- package/dist/components/views/chrome/workspaceChrome.test.d.ts +0 -1
- package/dist/components/views/chrome/workspaceChrome.test.js +0 -52
- package/dist/components/views/panels/DocumentFilterToolbar.test.d.ts +0 -1
- package/dist/components/views/panels/DocumentFilterToolbar.test.js +0 -19
- package/dist/components/views/panels/FilterToolbar.test.d.ts +0 -1
- package/dist/components/views/panels/FilterToolbar.test.js +0 -47
- package/dist/components/views/panels/PlanningDrawer.test.d.ts +0 -1
- package/dist/components/views/panels/PlanningDrawer.test.js +0 -529
- package/dist/components/views/planningScope.test.d.ts +0 -1
- package/dist/components/views/planningScope.test.js +0 -60
- package/dist/components/views/standalone/modals/AccountHubModal.test.d.ts +0 -1
- package/dist/components/views/standalone/modals/AccountHubModal.test.js +0 -66
- package/dist/components/views/standalone/modals/SyncEnableWarningModal.test.d.ts +0 -1
- package/dist/components/views/standalone/modals/SyncEnableWarningModal.test.js +0 -24
- package/dist/components/views/teamManagementAccess.test.d.ts +0 -1
- package/dist/components/views/teamManagementAccess.test.js +0 -44
- package/dist/config/deployment.test.d.ts +0 -1
- package/dist/config/deployment.test.js +0 -90
- package/dist/config/envSchema.test.d.ts +0 -1
- package/dist/config/envSchema.test.js +0 -125
- package/dist/core/AiProfileService.test.d.ts +0 -1
- package/dist/core/AiProfileService.test.js +0 -184
- package/dist/core/AiProfiles.test.d.ts +0 -1
- package/dist/core/AiProfiles.test.js +0 -1873
- package/dist/core/AuthTokenService.test.d.ts +0 -1
- package/dist/core/AuthTokenService.test.js +0 -78
- package/dist/core/BulkUpdateFieldsPreview.test.d.ts +0 -1
- package/dist/core/BulkUpdateFieldsPreview.test.js +0 -62
- package/dist/core/CompletedAt.test.d.ts +0 -1
- package/dist/core/CompletedAt.test.js +0 -44
- package/dist/core/CreatedBy.test.d.ts +0 -1
- package/dist/core/CreatedBy.test.js +0 -188
- package/dist/core/DeletedTaskTrash.test.d.ts +0 -1
- package/dist/core/DeletedTaskTrash.test.js +0 -104
- package/dist/core/EntitlementsPolicy.test.d.ts +0 -1
- package/dist/core/EntitlementsPolicy.test.js +0 -280
- package/dist/core/GlobalSettingsService.test.d.ts +0 -1
- package/dist/core/GlobalSettingsService.test.js +0 -45
- package/dist/core/JsonBackupRuntime.test.d.ts +0 -1
- package/dist/core/JsonBackupRuntime.test.js +0 -155
- package/dist/core/PlanFeatureCatalog.test.d.ts +0 -1
- package/dist/core/PlanFeatureCatalog.test.js +0 -139
- package/dist/core/PlanVersionPolicy.test.d.ts +0 -1
- package/dist/core/PlanVersionPolicy.test.js +0 -204
- package/dist/core/PlanningEntities.test.d.ts +0 -1
- package/dist/core/PlanningEntities.test.js +0 -509
- package/dist/core/ScheduleFields.test.d.ts +0 -1
- package/dist/core/ScheduleFields.test.js +0 -193
- package/dist/core/SetupState.test.d.ts +0 -1
- package/dist/core/SetupState.test.js +0 -113
- package/dist/core/SignupMonetizationSettings.test.d.ts +0 -1
- package/dist/core/SignupMonetizationSettings.test.js +0 -515
- package/dist/core/Stats.test.d.ts +0 -1
- package/dist/core/Stats.test.js +0 -36
- package/dist/core/SystemAdmin.test.d.ts +0 -1
- package/dist/core/SystemAdmin.test.js +0 -1106
- package/dist/core/TaskActivitySync.test.d.ts +0 -1
- package/dist/core/TaskActivitySync.test.js +0 -90
- package/dist/core/TaskAttachmentsCanonical.test.d.ts +0 -1
- package/dist/core/TaskAttachmentsCanonical.test.js +0 -356
- package/dist/core/TaskAuditTimeline.test.d.ts +0 -1
- package/dist/core/TaskAuditTimeline.test.js +0 -319
- package/dist/core/TaskTaxonomyValidation.test.d.ts +0 -1
- package/dist/core/TaskTaxonomyValidation.test.js +0 -440
- package/dist/core/Taskforce.ids.test.d.ts +0 -1
- package/dist/core/Taskforce.ids.test.js +0 -611
- package/dist/core/Taskforce.listTasksSlim.test.d.ts +0 -1
- package/dist/core/Taskforce.listTasksSlim.test.js +0 -91
- package/dist/core/Taskforce.mcpAuth.test.d.ts +0 -1
- package/dist/core/Taskforce.mcpAuth.test.js +0 -450
- package/dist/core/Taskforce.realtimeMutation.test.d.ts +0 -1
- package/dist/core/Taskforce.realtimeMutation.test.js +0 -131
- package/dist/core/UserProfileAvatarDrafts.test.d.ts +0 -1
- package/dist/core/UserProfileAvatarDrafts.test.js +0 -138
- package/dist/core/WorkspaceDelete.test.d.ts +0 -1
- package/dist/core/WorkspaceDelete.test.js +0 -159
- package/dist/core/WorkspacePermissions.test.d.ts +0 -1
- package/dist/core/WorkspacePermissions.test.js +0 -270
- package/dist/core/WorkspacePlanMode.test.d.ts +0 -1
- package/dist/core/WorkspacePlanMode.test.js +0 -383
- package/dist/core/WorkspaceSyncSettings.test.d.ts +0 -1
- package/dist/core/WorkspaceSyncSettings.test.js +0 -65
- package/dist/core/__tests__/TaskAttachmentsCanonical.test.d.ts +0 -1
- package/dist/core/__tests__/TaskAttachmentsCanonical.test.js +0 -212
- package/dist/documentReviews/DocumentReviewSessionStore.test.d.ts +0 -1
- package/dist/documentReviews/DocumentReviewSessionStore.test.js +0 -127
- package/dist/hooks/authGuardPolicy.test.d.ts +0 -1
- package/dist/hooks/authGuardPolicy.test.js +0 -76
- package/dist/hooks/bootstrapTimeouts.test.d.ts +0 -1
- package/dist/hooks/bootstrapTimeouts.test.js +0 -12
- package/dist/hooks/sync/controlPlane.test.d.ts +0 -1
- package/dist/hooks/sync/controlPlane.test.js +0 -121
- package/dist/hooks/sync/lifecyclePolicy.test.d.ts +0 -1
- package/dist/hooks/sync/lifecyclePolicy.test.js +0 -124
- package/dist/hooks/sync/orchestratorShared.test.d.ts +0 -1
- package/dist/hooks/sync/orchestratorShared.test.js +0 -98
- package/dist/hooks/sync/pullLifecycle.test.d.ts +0 -1
- package/dist/hooks/sync/pullLifecycle.test.js +0 -80
- package/dist/hooks/sync/recovery.test.d.ts +0 -1
- package/dist/hooks/sync/recovery.test.js +0 -292
- package/dist/hooks/sync/transfers.test.d.ts +0 -1
- package/dist/hooks/sync/transfers.test.js +0 -928
- package/dist/hooks/sync/useRecentSyncEvents.test.d.ts +0 -1
- package/dist/hooks/sync/useRecentSyncEvents.test.js +0 -124
- package/dist/hooks/sync/useSyncStatusActions.test.d.ts +0 -1
- package/dist/hooks/sync/useSyncStatusActions.test.js +0 -133
- package/dist/hooks/sync/useSyncStatusControls.test.d.ts +0 -1
- package/dist/hooks/sync/useSyncStatusControls.test.js +0 -88
- package/dist/hooks/useFilterSort.test.d.ts +0 -1
- package/dist/hooks/useFilterSort.test.js +0 -419
- package/dist/hooks/useRealtimeSync.test.d.ts +0 -1
- package/dist/hooks/useRealtimeSync.test.js +0 -311
- package/dist/hooks/useSyncOrchestrator.aiProfiles.test.d.ts +0 -1
- package/dist/hooks/useSyncOrchestrator.aiProfiles.test.js +0 -54
- package/dist/hooks/useSyncOrchestrator.context-assets.test.d.ts +0 -1
- package/dist/hooks/useSyncOrchestrator.context-assets.test.js +0 -228
- package/dist/hooks/useSyncOrchestrator.retry-closure.test.d.ts +0 -1
- package/dist/hooks/useSyncOrchestrator.retry-closure.test.js +0 -2027
- package/dist/hooks/useTaskData.test.d.ts +0 -1
- package/dist/hooks/useTaskData.test.js +0 -291
- package/dist/hooks/useTaskMutations.test.d.ts +0 -1
- package/dist/hooks/useTaskMutations.test.js +0 -256
- package/dist/hooks/useTaskforce.contract.test.d.ts +0 -1
- package/dist/hooks/useTaskforce.contract.test.js +0 -7
- package/dist/hooks/useTaskforce.priority-filters.test.d.ts +0 -1
- package/dist/hooks/useTaskforce.priority-filters.test.js +0 -28
- package/dist/hooks/useTaskforce.runtime-routing.test.d.ts +0 -1
- package/dist/hooks/useTaskforce.runtime-routing.test.js +0 -246
- package/dist/hooks/useTaskforce.sync-behavior.test.d.ts +0 -1
- package/dist/hooks/useTaskforce.sync-behavior.test.js +0 -3644
- package/dist/hooks/useWorkspaceSyncController.test.d.ts +0 -1
- package/dist/hooks/useWorkspaceSyncController.test.js +0 -192
- package/dist/hooks/workspace/useTaskforceApiRouting.test.d.ts +0 -1
- package/dist/hooks/workspace/useTaskforceApiRouting.test.js +0 -77
- package/dist/hooks/workspace/workspaceLocalState.test.d.ts +0 -1
- package/dist/hooks/workspace/workspaceLocalState.test.js +0 -59
- package/dist/localization/localizationCatalogs.test.d.ts +0 -1
- package/dist/localization/localizationCatalogs.test.js +0 -37
- package/dist/mcp/aiProfileBootstrap.test.d.ts +0 -1
- package/dist/mcp/aiProfileBootstrap.test.js +0 -68
- package/dist/mcp/canonicalAssetHelpers.test.d.ts +0 -1
- package/dist/mcp/canonicalAssetHelpers.test.js +0 -67
- package/dist/mcp/clientIntegrations.test.d.ts +0 -1
- package/dist/mcp/clientIntegrations.test.js +0 -219
- package/dist/mcp/optionResolution.test.d.ts +0 -1
- package/dist/mcp/optionResolution.test.js +0 -43
- package/dist/mcp/runtime.test.d.ts +0 -1
- package/dist/mcp/runtime.test.js +0 -5120
- package/dist/mcp/structuredCommentValidation.test.d.ts +0 -1
- package/dist/mcp/structuredCommentValidation.test.js +0 -31
- package/dist/mcp/structuredDocValidation.test.d.ts +0 -1
- package/dist/mcp/structuredDocValidation.test.js +0 -35
- package/dist/mcp/toolRegistry.test.d.ts +0 -1
- package/dist/mcp/toolRegistry.test.js +0 -34
- package/dist/migrations/billingSchemaParity.test.d.ts +0 -1
- package/dist/migrations/billingSchemaParity.test.js +0 -160
- package/dist/migrations/taskSchemaMigrations.test.d.ts +0 -1
- package/dist/migrations/taskSchemaMigrations.test.js +0 -225
- package/dist/qaOpen.test.d.ts +0 -1
- package/dist/qaOpen.test.js +0 -56
- package/dist/releaseVersion.test.d.ts +0 -1
- package/dist/releaseVersion.test.js +0 -32
- package/dist/runtime/appGates.test.d.ts +0 -1
- package/dist/runtime/appGates.test.js +0 -42
- package/dist/server/aiProfileAvatarAssets.test.d.ts +0 -1
- package/dist/server/aiProfileAvatarAssets.test.js +0 -213
- package/dist/server/annotatedAttachmentsRoutes.test.d.ts +0 -1
- package/dist/server/annotatedAttachmentsRoutes.test.js +0 -532
- package/dist/server/auth.test.d.ts +0 -1
- package/dist/server/auth.test.js +0 -131
- package/dist/server/buildInfo.test.d.ts +0 -1
- package/dist/server/buildInfo.test.js +0 -29
- package/dist/server/cors.test.d.ts +0 -1
- package/dist/server/cors.test.js +0 -77
- package/dist/server/documentReviewRoutes.test.d.ts +0 -1
- package/dist/server/documentReviewRoutes.test.js +0 -190
- package/dist/server/email.test.d.ts +0 -1
- package/dist/server/email.test.js +0 -113
- package/dist/server/index.cookieProxy.test.d.ts +0 -1
- package/dist/server/index.cookieProxy.test.js +0 -67
- package/dist/server/index.rateLimit.test.d.ts +0 -1
- package/dist/server/index.rateLimit.test.js +0 -22
- package/dist/server/index.test.d.ts +0 -1
- package/dist/server/index.test.js +0 -283
- package/dist/server/rateLimit.test.d.ts +0 -1
- package/dist/server/rateLimit.test.js +0 -107
- package/dist/server/realtimeSync.auth.test.d.ts +0 -1
- package/dist/server/realtimeSync.auth.test.js +0 -62
- package/dist/server/realtimeSync.replay.test.d.ts +0 -1
- package/dist/server/realtimeSync.replay.test.js +0 -192
- package/dist/server/realtimeSync.workspaceIsolation.test.d.ts +0 -1
- package/dist/server/realtimeSync.workspaceIsolation.test.js +0 -101
- package/dist/server/routes/billing.test.d.ts +0 -1
- package/dist/server/routes/billing.test.js +0 -3455
- package/dist/server/routes/shared.test.d.ts +0 -1
- package/dist/server/routes/shared.test.js +0 -32
- package/dist/server/routes/sync.integration.test.d.ts +0 -1
- package/dist/server/routes/sync.integration.test.js +0 -2932
- package/dist/server/routes/syncAuxRoutes.test.d.ts +0 -1
- package/dist/server/routes/syncAuxRoutes.test.js +0 -158
- package/dist/server/routes/syncRouteGuards.test.d.ts +0 -1
- package/dist/server/routes/syncRouteGuards.test.js +0 -94
- package/dist/server/routes.test.d.ts +0 -1
- package/dist/server/routes.test.js +0 -15612
- package/dist/server/runtimeMode.test.d.ts +0 -1
- package/dist/server/runtimeMode.test.js +0 -26
- package/dist/server/securityHeaders.test.d.ts +0 -1
- package/dist/server/securityHeaders.test.js +0 -70
- package/dist/services/templateEngine.test.d.ts +0 -1
- package/dist/services/templateEngine.test.js +0 -150
- package/dist/services/templates.test.d.ts +0 -1
- package/dist/services/templates.test.js +0 -45
- package/dist/services/workflowDocumentFixtures.test.d.ts +0 -1
- package/dist/services/workflowDocumentFixtures.test.js +0 -78
- package/dist/services/workflowExportMatrix.test.d.ts +0 -1
- package/dist/services/workflowExportMatrix.test.js +0 -113
- package/dist/services/workflowExportSnapshots.test.d.ts +0 -1
- package/dist/services/workflowExportSnapshots.test.js +0 -30
- package/dist/services/workflowGeneration.test.d.ts +0 -1
- package/dist/services/workflowGeneration.test.js +0 -12
- package/dist/services/workflowSimulation.test.d.ts +0 -1
- package/dist/services/workflowSimulation.test.js +0 -113
- package/dist/services/workflowV2Policy.test.d.ts +0 -1
- package/dist/services/workflowV2Policy.test.js +0 -80
- package/dist/shared/customTaxonomyLibrary.test.d.ts +0 -1
- package/dist/shared/customTaxonomyLibrary.test.js +0 -20
- package/dist/shared/passwordPolicy.test.d.ts +0 -1
- package/dist/shared/passwordPolicy.test.js +0 -34
- package/dist/shared/runtimeContract.test.d.ts +0 -1
- package/dist/shared/runtimeContract.test.js +0 -23
- package/dist/shared/taxonomyLibrary.test.d.ts +0 -1
- package/dist/shared/taxonomyLibrary.test.js +0 -26
- package/dist/shared/taxonomyState.test.d.ts +0 -1
- package/dist/shared/taxonomyState.test.js +0 -71
- package/dist/soak/preflight.cli.d.ts +0 -1
- package/dist/soak/preflight.cli.js +0 -28
- package/dist/soak/preflight.d.ts +0 -26
- package/dist/soak/preflight.js +0 -113
- package/dist/soak/preflight.test.d.ts +0 -1
- package/dist/soak/preflight.test.js +0 -39
- package/dist/storage/objectStorageClient.test.d.ts +0 -1
- package/dist/storage/objectStorageClient.test.js +0 -82
- package/dist/storage/objectStorageConfig.test.d.ts +0 -1
- package/dist/storage/objectStorageConfig.test.js +0 -50
- package/dist/storage/postgresAdapter.test.d.ts +0 -1
- package/dist/storage/postgresAdapter.test.js +0 -29
- package/dist/storage/workspaceAssetStore.test.d.ts +0 -1
- package/dist/storage/workspaceAssetStore.test.js +0 -588
- package/dist/sync/cloudSyncApi.test.d.ts +0 -1
- package/dist/sync/cloudSyncApi.test.js +0 -111
- package/dist/sync/collaborationSyncPayload.test.d.ts +0 -1
- package/dist/sync/collaborationSyncPayload.test.js +0 -125
- package/dist/sync/contentSyncPayload.test.d.ts +0 -1
- package/dist/sync/contentSyncPayload.test.js +0 -143
- package/dist/sync/encryptionService.test.d.ts +0 -1
- package/dist/sync/encryptionService.test.js +0 -52
- package/dist/sync/planningSyncPayload.test.d.ts +0 -1
- package/dist/sync/planningSyncPayload.test.js +0 -92
- package/dist/sync/realtimeFeature.test.d.ts +0 -1
- package/dist/sync/realtimeFeature.test.js +0 -30
- package/dist/sync/realtimeReconcile.test.d.ts +0 -1
- package/dist/sync/realtimeReconcile.test.js +0 -43
- package/dist/sync/syncApplyHandlers.test.d.ts +0 -1
- package/dist/sync/syncApplyHandlers.test.js +0 -626
- package/dist/sync/syncService.test.d.ts +0 -1
- package/dist/sync/syncService.test.js +0 -903
- package/dist/sync/taskSyncPayload.test.d.ts +0 -1
- package/dist/sync/taskSyncPayload.test.js +0 -54
- package/dist/sync/workspacePullFeed.test.d.ts +0 -1
- package/dist/sync/workspacePullFeed.test.js +0 -438
- package/dist/sync/workspaceSyncModel.test.d.ts +0 -1
- package/dist/sync/workspaceSyncModel.test.js +0 -1442
- package/dist/test/setup.d.ts +0 -1
- package/dist/test/setup.js +0 -15
- package/dist/ui/assets/AgentsModule-BS4Pi_nC.js +0 -1
- package/dist/ui/assets/ContextAttachmentManager-CfG_ER7C.js +0 -3
- package/dist/ui/assets/PlansPage-B_z-D6Nh.css +0 -1
- package/dist/ui/assets/PlansPage-Ndt7mYfo.js +0 -1
- package/dist/ui/assets/documentReferences-BOUcJm6-.js +0 -1
- package/dist/ui/assets/index-MAHKvFqp.js +0 -4
- package/dist/utils/accountProfileSummaryCache.test.d.ts +0 -1
- package/dist/utils/accountProfileSummaryCache.test.js +0 -63
- package/dist/utils/annotatedAttachments.test.d.ts +0 -1
- package/dist/utils/annotatedAttachments.test.js +0 -108
- package/dist/utils/assignees.test.d.ts +0 -1
- package/dist/utils/assignees.test.js +0 -25
- package/dist/utils/avatarUpload.test.d.ts +0 -1
- package/dist/utils/avatarUpload.test.js +0 -40
- package/dist/utils/canonicalAssetKind.test.d.ts +0 -1
- package/dist/utils/canonicalAssetKind.test.js +0 -24
- package/dist/utils/coalescedRefresh.test.d.ts +0 -1
- package/dist/utils/coalescedRefresh.test.js +0 -30
- package/dist/utils/constants.icons.test.d.ts +0 -1
- package/dist/utils/constants.icons.test.js +0 -41
- package/dist/utils/planParser.test.d.ts +0 -1
- package/dist/utils/planParser.test.js +0 -183
- package/dist/utils/planningReferences.test.d.ts +0 -1
- package/dist/utils/planningReferences.test.js +0 -17
- package/dist/utils/syncEventDetails.test.d.ts +0 -1
- package/dist/utils/syncEventDetails.test.js +0 -23
- package/dist/utils/syncEventPresentation.test.d.ts +0 -1
- package/dist/utils/syncEventPresentation.test.js +0 -64
- package/dist/utils/syncStatusPresentation.test.d.ts +0 -1
- package/dist/utils/syncStatusPresentation.test.js +0 -164
- package/dist/utils/taskActivity.test.d.ts +0 -1
- package/dist/utils/taskActivity.test.js +0 -218
- package/dist/utils/taskDraftDefaults.test.d.ts +0 -1
- package/dist/utils/taskDraftDefaults.test.js +0 -34
- package/dist/utils/taskDragZones.test.d.ts +0 -1
- package/dist/utils/taskDragZones.test.js +0 -14
- package/dist/utils/taskNormalization.test.d.ts +0 -1
- package/dist/utils/taskNormalization.test.js +0 -158
- package/dist/utils/taskSearch.test.d.ts +0 -1
- package/dist/utils/taskSearch.test.js +0 -69
- package/dist/utils/taskUtils.test.d.ts +0 -1
- package/dist/utils/taskUtils.test.js +0 -19
- package/dist/utils/taskforceApiClient.test.d.ts +0 -1
- package/dist/utils/taskforceApiClient.test.js +0 -44
- package/dist/utils/taxonomyFormDefaults.test.d.ts +0 -1
- package/dist/utils/taxonomyFormDefaults.test.js +0 -63
- package/dist/utils/uiNotice.test.d.ts +0 -1
- package/dist/utils/uiNotice.test.js +0 -18
- package/dist/utils/workspaceIdentity.test.d.ts +0 -1
- package/dist/utils/workspaceIdentity.test.js +0 -61
- package/dist/utils/workspaceLifecycle.test.d.ts +0 -1
- package/dist/utils/workspaceLifecycle.test.js +0 -64
- package/dist/utils/workspaceSyncPresentation.test.d.ts +0 -1
- package/dist/utils/workspaceSyncPresentation.test.js +0 -71
- package/scripts/bootstrap-playwright-auth.mjs +0 -155
- package/scripts/check-cloud-mcp.mjs +0 -83
- package/scripts/check-compat-boundaries.mjs +0 -41
- package/scripts/check-env.ts +0 -31
- package/scripts/check-localization-strings.mjs +0 -49
- package/scripts/check-runtime-boundaries.mjs +0 -44
- package/scripts/debug-global.mjs +0 -34
- package/scripts/debug-login.mjs +0 -32
- package/scripts/debug-server.mjs +0 -36
- package/scripts/deploy-prod.sh +0 -41
- package/scripts/deploy-staging.sh +0 -23
- package/scripts/export-sqlite-to-postgres.mjs +0 -123
- package/scripts/generate-env-example.ts +0 -8
- package/scripts/mcp-stdio-adapter.mjs +0 -160
- package/scripts/migrate-task-data-assets.mjs +0 -408
- package/scripts/playwright-auth.sh +0 -19
- package/scripts/qa-open-lib.mjs +0 -175
- package/scripts/qa-open-lib.mjs.d.ts +0 -49
- package/scripts/qa-open.mjs +0 -352
- package/scripts/release-version-lib.mjs +0 -88
- package/scripts/release-version.mjs +0 -72
- package/scripts/run-billing-performance-smoke.sh +0 -24
- package/scripts/run-dev-proxy.sh +0 -51
- package/scripts/run-e2e-realtime.sh +0 -30
- package/scripts/run-smoke.sh +0 -35
- package/scripts/run-soak.sh +0 -41
- package/scripts/test-global.js +0 -143
- package/scripts/update-homebrew-formula.sh +0 -108
- package/scripts/with-esbuild.sh +0 -11
package/scripts/qa-open-lib.mjs
DELETED
|
@@ -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
|
-
};
|
package/scripts/qa-open.mjs
DELETED
|
@@ -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
|
-
}
|