@taskforcehq/taskforce 0.3.168
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 +241 -0
- package/dist/Taskforce.d.ts +3 -0
- package/dist/Taskforce.js +3 -0
- package/dist/Taskforce.module.css +7587 -0
- package/dist/TaskforceCore.CategoryFallback.test.d.ts +1 -0
- package/dist/TaskforceCore.CategoryFallback.test.js +98 -0
- package/dist/TaskforceCore.d.ts +12 -0
- package/dist/TaskforceCore.js +729 -0
- package/dist/TaskforceCore.test.d.ts +1 -0
- package/dist/TaskforceCore.test.js +2132 -0
- package/dist/TaskforceScreenshot.d.ts +11 -0
- package/dist/TaskforceScreenshot.js +113 -0
- package/dist/TaskforceWidget.d.ts +6 -0
- package/dist/TaskforceWidget.js +101 -0
- package/dist/TaskforceWidget.test.d.ts +1 -0
- package/dist/TaskforceWidget.test.js +92 -0
- package/dist/UnsavedChangesRelaxed.test.d.ts +1 -0
- package/dist/UnsavedChangesRelaxed.test.js +16 -0
- package/dist/__tests__/localizationCatalogs.test.d.ts +1 -0
- package/dist/__tests__/localizationCatalogs.test.js +37 -0
- package/dist/__tests__/planParser.test.d.ts +1 -0
- package/dist/__tests__/planParser.test.js +183 -0
- package/dist/__tests__/releaseVersion.test.d.ts +1 -0
- package/dist/__tests__/releaseVersion.test.js +32 -0
- package/dist/__tests__/structuredCommentValidation.test.d.ts +1 -0
- package/dist/__tests__/structuredCommentValidation.test.js +31 -0
- package/dist/__tests__/structuredDocValidation.test.d.ts +1 -0
- package/dist/__tests__/structuredDocValidation.test.js +30 -0
- package/dist/__tests__/templateEngine.test.d.ts +1 -0
- package/dist/__tests__/templateEngine.test.js +150 -0
- package/dist/__tests__/templates.test.d.ts +1 -0
- package/dist/__tests__/templates.test.js +45 -0
- package/dist/__tests__/workflowDocumentFixtures.test.d.ts +1 -0
- package/dist/__tests__/workflowDocumentFixtures.test.js +78 -0
- package/dist/__tests__/workflowExportMatrix.test.d.ts +1 -0
- package/dist/__tests__/workflowExportMatrix.test.js +113 -0
- package/dist/__tests__/workflowExportSnapshots.test.d.ts +1 -0
- package/dist/__tests__/workflowExportSnapshots.test.js +28 -0
- package/dist/__tests__/workflowGeneration.test.d.ts +1 -0
- package/dist/__tests__/workflowGeneration.test.js +12 -0
- package/dist/__tests__/workflowSimulation.test.d.ts +1 -0
- package/dist/__tests__/workflowSimulation.test.js +113 -0
- package/dist/__tests__/workflowV2Policy.test.d.ts +1 -0
- package/dist/__tests__/workflowV2Policy.test.js +80 -0
- package/dist/api.d.ts +30 -0
- package/dist/api.js +85 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +217 -0
- package/dist/compat/priorityCompat.d.ts +2 -0
- package/dist/compat/priorityCompat.js +24 -0
- package/dist/components/features/DocumentGenerateModal.d.ts +9 -0
- package/dist/components/features/DocumentGenerateModal.js +114 -0
- package/dist/components/features/DocumentIndex.d.ts +19 -0
- package/dist/components/features/DocumentIndex.js +51 -0
- package/dist/components/features/DocumentViewer.d.ts +9 -0
- package/dist/components/features/DocumentViewer.js +253 -0
- package/dist/components/features/DocumentWorkspace.d.ts +21 -0
- package/dist/components/features/DocumentWorkspace.js +88 -0
- package/dist/components/features/TaskSettings.d.ts +209 -0
- package/dist/components/features/TaskSettings.js +500 -0
- package/dist/components/features/TaskSettings.test.d.ts +1 -0
- package/dist/components/features/TaskSettings.test.js +308 -0
- package/dist/components/features/settings/CategoryManager.d.ts +19 -0
- package/dist/components/features/settings/CategoryManager.js +113 -0
- package/dist/components/features/settings/TaxonomyEditor.d.ts +8 -0
- package/dist/components/features/settings/TaxonomyEditor.js +98 -0
- package/dist/components/features/settings/TaxonomyManager 2.d.ts +52 -0
- package/dist/components/features/settings/TaxonomyManager 2.js +75 -0
- package/dist/components/features/settings/TaxonomyManager.d.ts +54 -0
- package/dist/components/features/settings/TaxonomyManager.js +77 -0
- package/dist/components/features/settings/TypeManager.d.ts +10 -0
- package/dist/components/features/settings/TypeManager.js +50 -0
- package/dist/components/features/settings/WorkflowEditorPrototype.d.ts +15 -0
- package/dist/components/features/settings/WorkflowEditorPrototype.js +245 -0
- package/dist/components/task/TaskActionHeader.d.ts +20 -0
- package/dist/components/task/TaskActionHeader.js +13 -0
- package/dist/components/task/TaskCard.d.ts +47 -0
- package/dist/components/task/TaskCard.js +326 -0
- package/dist/components/task/TaskCard.test.d.ts +1 -0
- package/dist/components/task/TaskCard.test.js +95 -0
- package/dist/components/task/TaskContextUpload.d.ts +12 -0
- package/dist/components/task/TaskContextUpload.js +393 -0
- package/dist/components/task/TaskContextUpload.test.d.ts +1 -0
- package/dist/components/task/TaskContextUpload.test.js +189 -0
- package/dist/components/task/TaskForm.d.ts +105 -0
- package/dist/components/task/TaskForm.js +241 -0
- package/dist/components/task/TaskForm.test.d.ts +1 -0
- package/dist/components/task/TaskForm.test.js +288 -0
- package/dist/components/task/TaskKanban 2.d.ts +76 -0
- package/dist/components/task/TaskKanban 2.js +1004 -0
- package/dist/components/task/TaskKanban.d.ts +76 -0
- package/dist/components/task/TaskKanban.empty-column-drop.test.d.ts +1 -0
- package/dist/components/task/TaskKanban.empty-column-drop.test.js +66 -0
- package/dist/components/task/TaskKanban.js +1026 -0
- package/dist/components/task/TaskKanban.test.d.ts +1 -0
- package/dist/components/task/TaskKanban.test.js +46 -0
- package/dist/components/task/TaskList.d.ts +74 -0
- package/dist/components/task/TaskList.js +38 -0
- package/dist/components/task/TaskList.test.d.ts +1 -0
- package/dist/components/task/TaskList.test.js +270 -0
- package/dist/components/task/TaskScreenshotSection.d.ts +15 -0
- package/dist/components/task/TaskScreenshotSection.js +22 -0
- package/dist/components/ui/LevelSelector.d.ts +13 -0
- package/dist/components/ui/LevelSelector.js +25 -0
- package/dist/components/ui/LevelSelector.test.d.ts +1 -0
- package/dist/components/ui/LevelSelector.test.js +55 -0
- package/dist/components/ui/Markdown.d.ts +6 -0
- package/dist/components/ui/Markdown.js +94 -0
- package/dist/components/ui/Markdown.test.d.ts +1 -0
- package/dist/components/ui/Markdown.test.js +38 -0
- package/dist/components/ui/Modal.d.ts +16 -0
- package/dist/components/ui/Modal.js +49 -0
- package/dist/components/ui/MultiSelectFilter.d.ts +10 -0
- package/dist/components/ui/MultiSelectFilter.js +71 -0
- package/dist/components/ui/MultiSelectFilter.test.d.ts +1 -0
- package/dist/components/ui/MultiSelectFilter.test.js +74 -0
- package/dist/components/ui/TaxonomyDropdown.d.ts +17 -0
- package/dist/components/ui/TaxonomyDropdown.js +145 -0
- package/dist/components/ui/TaxonomyDropdown.test.d.ts +1 -0
- package/dist/components/ui/TaxonomyDropdown.test.js +130 -0
- package/dist/components/views/StandaloneLayout 2.d.ts +8 -0
- package/dist/components/views/StandaloneLayout 2.js +1660 -0
- package/dist/components/views/StandaloneLayout.d.ts +8 -0
- package/dist/components/views/StandaloneLayout.js +2117 -0
- package/dist/components/views/WidgetView.d.ts +8 -0
- package/dist/components/views/WidgetView.js +221 -0
- package/dist/config/envSchema.d.ts +28 -0
- package/dist/config/envSchema.js +374 -0
- package/dist/config/envSchema.test.d.ts +1 -0
- package/dist/config/envSchema.test.js +97 -0
- package/dist/config/surfaceBase.d.ts +2 -0
- package/dist/config/surfaceBase.js +8 -0
- package/dist/core/BulkUpdateFieldsPreview.test.d.ts +1 -0
- package/dist/core/BulkUpdateFieldsPreview.test.js +62 -0
- package/dist/core/CompletedAt.test.d.ts +1 -0
- package/dist/core/CompletedAt.test.js +44 -0
- package/dist/core/CreatedBy.test.d.ts +1 -0
- package/dist/core/CreatedBy.test.js +60 -0
- package/dist/core/EntitlementsPolicy.test.d.ts +1 -0
- package/dist/core/EntitlementsPolicy.test.js +145 -0
- package/dist/core/InitiativeTemplates.test.d.ts +1 -0
- package/dist/core/InitiativeTemplates.test.js +50 -0
- package/dist/core/ParentLifecycle.test.d.ts +1 -0
- package/dist/core/ParentLifecycle.test.js +98 -0
- package/dist/core/ScheduleFields.test.d.ts +1 -0
- package/dist/core/ScheduleFields.test.js +197 -0
- package/dist/core/SetupState.test.d.ts +1 -0
- package/dist/core/SetupState.test.js +113 -0
- package/dist/core/SystemAdmin.test.d.ts +1 -0
- package/dist/core/SystemAdmin.test.js +295 -0
- package/dist/core/TaskTaxonomyValidation.test.d.ts +1 -0
- package/dist/core/TaskTaxonomyValidation.test.js +64 -0
- package/dist/core/Taskforce.d.ts +1063 -0
- package/dist/core/Taskforce.ids.test.d.ts +1 -0
- package/dist/core/Taskforce.ids.test.js +168 -0
- package/dist/core/Taskforce.js +5981 -0
- package/dist/core/Taskforce.realtimeMutation.test.d.ts +1 -0
- package/dist/core/Taskforce.realtimeMutation.test.js +76 -0
- package/dist/core/WorkspaceDelete.test.d.ts +1 -0
- package/dist/core/WorkspaceDelete.test.js +140 -0
- package/dist/core/WorkspacePermissions.test.d.ts +1 -0
- package/dist/core/WorkspacePermissions.test.js +151 -0
- package/dist/core/WorkspacePlanMode.test.d.ts +1 -0
- package/dist/core/WorkspacePlanMode.test.js +104 -0
- package/dist/hooks/authGuardPolicy.d.ts +26 -0
- package/dist/hooks/authGuardPolicy.js +32 -0
- package/dist/hooks/authGuardPolicy.test.d.ts +1 -0
- package/dist/hooks/authGuardPolicy.test.js +76 -0
- package/dist/hooks/useDraggable.d.ts +12 -0
- package/dist/hooks/useDraggable.js +65 -0
- package/dist/hooks/useRealtimeSync.d.ts +24 -0
- package/dist/hooks/useRealtimeSync.js +275 -0
- package/dist/hooks/useRealtimeSync.test.d.ts +1 -0
- package/dist/hooks/useRealtimeSync.test.js +284 -0
- package/dist/hooks/useSyncOrchestrator.d.ts +164 -0
- package/dist/hooks/useSyncOrchestrator.js +1427 -0
- package/dist/hooks/useSyncOrchestrator.retry-closure.test.d.ts +1 -0
- package/dist/hooks/useSyncOrchestrator.retry-closure.test.js +367 -0
- package/dist/hooks/useTaskforce.d.ts +727 -0
- package/dist/hooks/useTaskforce.js +4396 -0
- package/dist/hooks/useTaskforce.priority-filters.test.d.ts +1 -0
- package/dist/hooks/useTaskforce.priority-filters.test.js +33 -0
- package/dist/hooks/useWorkspaceSyncController.d.ts +80 -0
- package/dist/hooks/useWorkspaceSyncController.js +598 -0
- package/dist/hooks/useWorkspaceSyncController.test.d.ts +1 -0
- package/dist/hooks/useWorkspaceSyncController.test.js +236 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.js +11 -0
- package/dist/localization/index.d.ts +8 -0
- package/dist/localization/index.js +81 -0
- package/dist/localization/locales/en-US.d.ts +151 -0
- package/dist/localization/locales/en-US.js +150 -0
- package/dist/localization/locales/es-419.d.ts +2 -0
- package/dist/localization/locales/es-419.js +150 -0
- package/dist/localization/locales/pt-BR.d.ts +2 -0
- package/dist/localization/locales/pt-BR.js +150 -0
- package/dist/main.d.ts +1 -0
- package/dist/main.js +33 -0
- package/dist/mcp/optionResolution.d.ts +14 -0
- package/dist/mcp/optionResolution.js +126 -0
- package/dist/mcp/optionResolution.test.d.ts +1 -0
- package/dist/mcp/optionResolution.test.js +39 -0
- package/dist/mcp/server.d.ts +1 -0
- package/dist/mcp/server.js +1793 -0
- package/dist/mcp/structuredCommentValidation.d.ts +6 -0
- package/dist/mcp/structuredCommentValidation.js +56 -0
- package/dist/mcp/structuredDocValidation.d.ts +6 -0
- package/dist/mcp/structuredDocValidation.js +75 -0
- package/dist/migrations/billingSchemaParity.test.d.ts +1 -0
- package/dist/migrations/billingSchemaParity.test.js +46 -0
- package/dist/migrations/clientMigrations.d.ts +9 -0
- package/dist/migrations/clientMigrations.js +74 -0
- package/dist/migrations/flags.d.ts +6 -0
- package/dist/migrations/flags.js +8 -0
- package/dist/migrations/taskMigrations.d.ts +71 -0
- package/dist/migrations/taskMigrations.js +236 -0
- package/dist/migrations/taskMigrations.test.d.ts +1 -0
- package/dist/migrations/taskMigrations.test.js +34 -0
- package/dist/migrations/taskSchemaMigrations.d.ts +11 -0
- package/dist/migrations/taskSchemaMigrations.js +453 -0
- package/dist/plugins/index.d.ts +10 -0
- package/dist/plugins/index.js +10 -0
- package/dist/plugins/vite.d.ts +19 -0
- package/dist/plugins/vite.js +271 -0
- package/dist/public/android-chrome-192x192.png +0 -0
- package/dist/public/android-chrome-512x512.png +0 -0
- package/dist/public/apple-touch-icon.png +0 -0
- package/dist/public/favicon-16x16.png +0 -0
- package/dist/public/favicon-32x32.png +0 -0
- package/dist/public/favicon.ico +0 -0
- package/dist/public/favicon.png +0 -0
- package/dist/public/site.webmanifest +1 -0
- package/dist/public/taskforce.png +0 -0
- package/dist/resources/templates/WORKFLOW_V2_POLICY.md +55 -0
- package/dist/resources/templates/environments/aider.yaml +14 -0
- package/dist/resources/templates/environments/antigravity.yaml +10 -0
- package/dist/resources/templates/environments/claude.yaml +10 -0
- package/dist/resources/templates/environments/cline.yaml +10 -0
- package/dist/resources/templates/environments/codex.yaml +13 -0
- package/dist/resources/templates/environments/copilot.yaml +10 -0
- package/dist/resources/templates/environments/cursor.yaml +9 -0
- package/dist/resources/templates/environments/gemini.yaml +9 -0
- package/dist/resources/templates/environments/windsurf.yaml +10 -0
- package/dist/resources/templates/workflow-sources/README.md +9 -0
- package/dist/resources/templates/workflow-sources/workflowDocs.mjs +520 -0
- package/dist/resources/templates/workflow-sources/workflowEditorOverrides.json +1 -0
- package/dist/resources/templates/workflows/collaborate.yaml +104 -0
- package/dist/resources/templates/workflows/do.yaml +82 -0
- package/dist/resources/templates/workflows/evaluate.yaml +111 -0
- package/dist/resources/templates/workflows/execute.yaml +142 -0
- package/dist/resources/templates/workflows/plan.yaml +112 -0
- package/dist/resources/templates/workflows/review.yaml +109 -0
- package/dist/runtime/capabilities.d.ts +8 -0
- package/dist/runtime/capabilities.js +16 -0
- package/dist/security/virusScan.d.ts +16 -0
- package/dist/security/virusScan.js +83 -0
- package/dist/server/auth.d.ts +51 -0
- package/dist/server/auth.js +266 -0
- package/dist/server/auth.test.d.ts +1 -0
- package/dist/server/auth.test.js +111 -0
- package/dist/server/buildInfo.d.ts +7 -0
- package/dist/server/buildInfo.js +100 -0
- package/dist/server/buildInfo.test.d.ts +1 -0
- package/dist/server/buildInfo.test.js +29 -0
- package/dist/server/cors.d.ts +7 -0
- package/dist/server/cors.js +76 -0
- package/dist/server/cors.test.d.ts +1 -0
- package/dist/server/cors.test.js +71 -0
- package/dist/server/email.d.ts +28 -0
- package/dist/server/email.js +138 -0
- package/dist/server/email.test.d.ts +1 -0
- package/dist/server/email.test.js +113 -0
- package/dist/server/index.cookieProxy.test.d.ts +1 -0
- package/dist/server/index.cookieProxy.test.js +19 -0
- package/dist/server/index.d.ts +17 -0
- package/dist/server/index.js +757 -0
- package/dist/server/index.rateLimit.test.d.ts +1 -0
- package/dist/server/index.rateLimit.test.js +13 -0
- package/dist/server/index.test.d.ts +1 -0
- package/dist/server/index.test.js +19 -0
- package/dist/server/rateLimit.d.ts +29 -0
- package/dist/server/rateLimit.js +99 -0
- package/dist/server/rateLimit.test.d.ts +1 -0
- package/dist/server/rateLimit.test.js +107 -0
- package/dist/server/realtimeSync.auth.test.d.ts +1 -0
- package/dist/server/realtimeSync.auth.test.js +62 -0
- package/dist/server/realtimeSync.replay.test.d.ts +1 -0
- package/dist/server/realtimeSync.replay.test.js +192 -0
- package/dist/server/realtimeSync.workspaceIsolation.test.d.ts +1 -0
- package/dist/server/realtimeSync.workspaceIsolation.test.js +101 -0
- package/dist/server/realtimeSyncWs.d.ts +30 -0
- package/dist/server/realtimeSyncWs.js +257 -0
- package/dist/server/routes.billing.d.ts +15 -0
- package/dist/server/routes.billing.js +991 -0
- package/dist/server/routes.billing.test.d.ts +1 -0
- package/dist/server/routes.billing.test.js +387 -0
- package/dist/server/routes.d.ts +72 -0
- package/dist/server/routes.js +4820 -0
- package/dist/server/routes.sync.d.ts +17 -0
- package/dist/server/routes.sync.integration.test.d.ts +1 -0
- package/dist/server/routes.sync.integration.test.js +470 -0
- package/dist/server/routes.sync.js +1141 -0
- package/dist/server/routes.test.d.ts +1 -0
- package/dist/server/routes.test.js +4945 -0
- package/dist/server/runtimeMode.d.ts +4 -0
- package/dist/server/runtimeMode.js +25 -0
- package/dist/server/runtimeMode.test.d.ts +1 -0
- package/dist/server/runtimeMode.test.js +26 -0
- package/dist/server/securityHeaders.d.ts +3 -0
- package/dist/server/securityHeaders.js +25 -0
- package/dist/server/securityHeaders.test.d.ts +1 -0
- package/dist/server/securityHeaders.test.js +32 -0
- package/dist/server/smtpTransport.d.ts +21 -0
- package/dist/server/smtpTransport.js +11 -0
- package/dist/server/start.d.ts +1 -0
- package/dist/server/start.js +17 -0
- package/dist/services/formatTransformers.d.ts +29 -0
- package/dist/services/formatTransformers.js +56 -0
- package/dist/services/templateEngine.d.ts +46 -0
- package/dist/services/templateEngine.js +148 -0
- package/dist/shared/runtimeContract.d.ts +12 -0
- package/dist/shared/runtimeContract.js +23 -0
- package/dist/shared/runtimeContract.test.d.ts +1 -0
- package/dist/shared/runtimeContract.test.js +23 -0
- package/dist/soak/preflight.cli.d.ts +1 -0
- package/dist/soak/preflight.cli.js +28 -0
- package/dist/soak/preflight.d.ts +26 -0
- package/dist/soak/preflight.js +113 -0
- package/dist/soak/preflight.test.d.ts +1 -0
- package/dist/soak/preflight.test.js +39 -0
- package/dist/soak/syncSoakHarness.d.ts +6 -0
- package/dist/soak/syncSoakHarness.js +10 -0
- package/dist/storage/createDatabaseAdapter.d.ts +2 -0
- package/dist/storage/createDatabaseAdapter.js +9 -0
- package/dist/storage/databaseAdapter.d.ts +22 -0
- package/dist/storage/databaseAdapter.js +1 -0
- package/dist/storage/documentIntegrity.d.ts +28 -0
- package/dist/storage/documentIntegrity.js +103 -0
- package/dist/storage/documentPurge.d.ts +14 -0
- package/dist/storage/documentPurge.js +46 -0
- package/dist/storage/documentRegistry.d.ts +39 -0
- package/dist/storage/documentRegistry.js +115 -0
- package/dist/storage/integritySchedule.d.ts +17 -0
- package/dist/storage/integritySchedule.js +62 -0
- package/dist/storage/objectStorage.d.ts +20 -0
- package/dist/storage/objectStorage.js +15 -0
- package/dist/storage/objectStorageClient.d.ts +18 -0
- package/dist/storage/objectStorageClient.js +301 -0
- package/dist/storage/objectStorageConfig.d.ts +2 -0
- package/dist/storage/objectStorageConfig.js +45 -0
- package/dist/storage/postgresAdapter.d.ts +20 -0
- package/dist/storage/postgresAdapter.js +204 -0
- package/dist/storage/postgresWorker.d.ts +1 -0
- package/dist/storage/postgresWorker.js +110 -0
- package/dist/storage/providerConfig.d.ts +6 -0
- package/dist/storage/providerConfig.js +11 -0
- package/dist/storage/sqliteAdapter.d.ts +14 -0
- package/dist/storage/sqliteAdapter.js +28 -0
- package/dist/storage/taskAssetStore.d.ts +56 -0
- package/dist/storage/taskAssetStore.js +297 -0
- package/dist/sync/cloudSyncApi.d.ts +47 -0
- package/dist/sync/cloudSyncApi.js +138 -0
- package/dist/sync/cloudSyncApi.test.d.ts +1 -0
- package/dist/sync/cloudSyncApi.test.js +54 -0
- package/dist/sync/encryptionService.d.ts +11 -0
- package/dist/sync/encryptionService.js +61 -0
- package/dist/sync/encryptionService.test.d.ts +1 -0
- package/dist/sync/encryptionService.test.js +52 -0
- package/dist/sync/realtimeFeature.d.ts +6 -0
- package/dist/sync/realtimeFeature.js +20 -0
- package/dist/sync/realtimeFeature.test.d.ts +1 -0
- package/dist/sync/realtimeFeature.test.js +30 -0
- package/dist/sync/realtimeReconcile.d.ts +30 -0
- package/dist/sync/realtimeReconcile.js +90 -0
- package/dist/sync/realtimeReconcile.test.d.ts +1 -0
- package/dist/sync/realtimeReconcile.test.js +43 -0
- package/dist/sync/syncService.d.ts +96 -0
- package/dist/sync/syncService.js +423 -0
- package/dist/sync/syncService.test.d.ts +1 -0
- package/dist/sync/syncService.test.js +484 -0
- package/dist/sync/workspaceSyncModel.d.ts +61 -0
- package/dist/sync/workspaceSyncModel.js +136 -0
- package/dist/sync/workspaceSyncModel.test.d.ts +1 -0
- package/dist/sync/workspaceSyncModel.test.js +73 -0
- package/dist/test/setup.d.ts +1 -0
- package/dist/test/setup.js +15 -0
- package/dist/types.d.ts +157 -0
- package/dist/types.js +41 -0
- package/dist/ui/assets/RussoOne-Regular-C3BxZIj7.ttf +0 -0
- package/dist/ui/assets/index-0W5vyCpn.css +1 -0
- package/dist/ui/assets/index-MCZuNNfn.js +23 -0
- package/dist/ui/assets/logo_white_01-0Vx-iIIv.png +0 -0
- package/dist/ui/assets/taskforce-BxLPokNB.png +0 -0
- package/dist/ui/assets/vendor-dnd-BI1K77C1.js +5 -0
- package/dist/ui/assets/vendor-icons-ZFG3SGwo.js +1 -0
- package/dist/ui/assets/vendor-markdown-CKYkQHfj.js +29 -0
- package/dist/ui/assets/vendor-react-DdIDsh7f.js +9 -0
- package/dist/ui/assets/vendor-router-BtiNU7Dl.js +3 -0
- package/dist/ui/branding/logos/logo_black_01.png +0 -0
- package/dist/ui/branding/logos/logo_black_02.png +0 -0
- package/dist/ui/branding/logos/logo_white_01.png +0 -0
- package/dist/ui/branding/logos/logo_white_02.png +0 -0
- package/dist/ui/favicon/android-chrome-192x192.png +0 -0
- package/dist/ui/favicon/android-chrome-512x512.png +0 -0
- package/dist/ui/favicon/apple-touch-icon.png +0 -0
- package/dist/ui/favicon/favicon-16x16.png +0 -0
- package/dist/ui/favicon/favicon-32x32.png +0 -0
- package/dist/ui/favicon/favicon.ico +0 -0
- package/dist/ui/favicon/favicon.png +0 -0
- package/dist/ui/favicon/site.webmanifest +1 -0
- package/dist/ui/fonts/RussoOne-Regular.ttf +0 -0
- package/dist/ui/images/taskforce.png +0 -0
- package/dist/ui/index.html +19 -0
- package/dist/utils/checklistMarkdown.d.ts +9 -0
- package/dist/utils/checklistMarkdown.js +46 -0
- package/dist/utils/constants.d.ts +21 -0
- package/dist/utils/constants.icons.test.d.ts +1 -0
- package/dist/utils/constants.icons.test.js +40 -0
- package/dist/utils/constants.js +100 -0
- package/dist/utils/contextFiles.d.ts +8 -0
- package/dist/utils/contextFiles.js +54 -0
- package/dist/utils/formatting.d.ts +5 -0
- package/dist/utils/formatting.js +30 -0
- package/dist/utils/planParser.d.ts +22 -0
- package/dist/utils/planParser.js +151 -0
- package/dist/utils/taskDragZones.d.ts +8 -0
- package/dist/utils/taskDragZones.js +14 -0
- package/dist/utils/taskDragZones.test.d.ts +1 -0
- package/dist/utils/taskDragZones.test.js +14 -0
- package/dist/utils/taskHierarchy.d.ts +4 -0
- package/dist/utils/taskHierarchy.js +69 -0
- package/dist/utils/taskHierarchy.test.d.ts +1 -0
- package/dist/utils/taskHierarchy.test.js +38 -0
- package/dist/utils/taskParenting.d.ts +3 -0
- package/dist/utils/taskParenting.js +24 -0
- package/dist/utils/taskParenting.test.d.ts +1 -0
- package/dist/utils/taskParenting.test.js +21 -0
- package/dist/utils/taskRelations.d.ts +6 -0
- package/dist/utils/taskRelations.js +24 -0
- package/dist/utils/taskRelations.test.d.ts +1 -0
- package/dist/utils/taskRelations.test.js +34 -0
- package/dist/utils/taskUtils.d.ts +2 -0
- package/dist/utils/taskUtils.js +20 -0
- package/dist/utils/taskforceApiClient.d.ts +7 -0
- package/dist/utils/taskforceApiClient.js +42 -0
- package/dist/utils/workspaceIdentity.d.ts +8 -0
- package/dist/utils/workspaceIdentity.js +47 -0
- package/dist/utils/workspaceIdentity.test.d.ts +1 -0
- package/dist/utils/workspaceIdentity.test.js +32 -0
- package/dist/utils/workspaceLifecycle.d.ts +26 -0
- package/dist/utils/workspaceLifecycle.js +69 -0
- package/dist/utils/workspaceLifecycle.test.d.ts +1 -0
- package/dist/utils/workspaceLifecycle.test.js +64 -0
- package/package.json +133 -0
- package/scripts/check-compat-boundaries.js +48 -0
- package/scripts/check-env.ts +24 -0
- package/scripts/check-localization-strings.mjs +49 -0
- package/scripts/check-runtime-boundaries.mjs +44 -0
- package/scripts/debug-global.mjs +34 -0
- package/scripts/debug-server.mjs +36 -0
- package/scripts/export-sqlite-to-postgres.mjs +125 -0
- package/scripts/generate-env-example.ts +8 -0
- package/scripts/generate-workflow-templates.mjs +134 -0
- package/scripts/mcp-stdio-adapter.mjs +160 -0
- package/scripts/postinstall.js +60 -0
- package/scripts/release-version-lib.mjs +88 -0
- package/scripts/release-version.mjs +72 -0
- package/scripts/run-dev-proxy.sh +49 -0
- package/scripts/run-e2e-realtime.sh +16 -0
- package/scripts/run-smoke.sh +23 -0
- package/scripts/run-soak.sh +29 -0
- package/scripts/test-global.js +143 -0
- package/scripts/update-homebrew-formula.sh +38 -0
- package/src/resources/templates/WORKFLOW_V2_POLICY.md +55 -0
- package/src/resources/templates/environments/aider.yaml +14 -0
- package/src/resources/templates/environments/antigravity.yaml +10 -0
- package/src/resources/templates/environments/claude.yaml +10 -0
- package/src/resources/templates/environments/cline.yaml +10 -0
- package/src/resources/templates/environments/codex.yaml +13 -0
- package/src/resources/templates/environments/copilot.yaml +10 -0
- package/src/resources/templates/environments/cursor.yaml +9 -0
- package/src/resources/templates/environments/gemini.yaml +9 -0
- package/src/resources/templates/environments/windsurf.yaml +10 -0
- package/src/resources/templates/workflow-sources/README.md +9 -0
- package/src/resources/templates/workflow-sources/workflowDocs.mjs +520 -0
- package/src/resources/templates/workflow-sources/workflowEditorOverrides.json +1 -0
- package/src/resources/templates/workflows/collaborate.yaml +104 -0
- package/src/resources/templates/workflows/do.yaml +82 -0
- package/src/resources/templates/workflows/evaluate.yaml +111 -0
- package/src/resources/templates/workflows/execute.yaml +142 -0
- package/src/resources/templates/workflows/plan.yaml +112 -0
- package/src/resources/templates/workflows/review.yaml +109 -0
|
@@ -0,0 +1,453 @@
|
|
|
1
|
+
export function ensureTenantSchema(db) {
|
|
2
|
+
const taskColumns = db.prepare(`PRAGMA table_info(tasks)`).all();
|
|
3
|
+
const hasTaskTenantColumn = taskColumns.some((c) => c.name === 'tenant_id');
|
|
4
|
+
if (!hasTaskTenantColumn) {
|
|
5
|
+
db.exec(`ALTER TABLE tasks ADD COLUMN tenant_id TEXT NOT NULL DEFAULT 'default'`);
|
|
6
|
+
}
|
|
7
|
+
const commentColumns = db.prepare(`PRAGMA table_info(comments)`).all();
|
|
8
|
+
const hasCommentTenantColumn = commentColumns.some((c) => c.name === 'tenant_id');
|
|
9
|
+
if (!hasCommentTenantColumn) {
|
|
10
|
+
db.exec(`ALTER TABLE comments ADD COLUMN tenant_id TEXT NOT NULL DEFAULT 'default'`);
|
|
11
|
+
}
|
|
12
|
+
const screenshotColumns = db.prepare(`PRAGMA table_info(screenshots)`).all();
|
|
13
|
+
const hasScreenshotTenantColumn = screenshotColumns.some((c) => c.name === 'tenant_id');
|
|
14
|
+
if (!hasScreenshotTenantColumn) {
|
|
15
|
+
db.exec(`ALTER TABLE screenshots ADD COLUMN tenant_id TEXT NOT NULL DEFAULT 'default'`);
|
|
16
|
+
}
|
|
17
|
+
db.exec(`
|
|
18
|
+
CREATE INDEX IF NOT EXISTS idx_tasks_tenant ON tasks(tenant_id);
|
|
19
|
+
CREATE INDEX IF NOT EXISTS idx_tasks_tenant_archived ON tasks(tenant_id, is_archived);
|
|
20
|
+
CREATE INDEX IF NOT EXISTS idx_comments_tenant_task ON comments(tenant_id, task_id);
|
|
21
|
+
CREATE INDEX IF NOT EXISTS idx_screenshots_tenant_task ON screenshots(tenant_id, task_id);
|
|
22
|
+
`);
|
|
23
|
+
}
|
|
24
|
+
export function ensureParentTaskSchema(db) {
|
|
25
|
+
const columns = db.prepare(`PRAGMA table_info(tasks)`).all();
|
|
26
|
+
const hasParentColumn = columns.some((c) => c.name === 'parent_task_id');
|
|
27
|
+
const hasChildDisplayOrderColumn = columns.some((c) => c.name === 'child_display_order');
|
|
28
|
+
if (!hasParentColumn) {
|
|
29
|
+
db.exec(`ALTER TABLE tasks ADD COLUMN parent_task_id TEXT`);
|
|
30
|
+
}
|
|
31
|
+
if (!hasChildDisplayOrderColumn) {
|
|
32
|
+
db.exec(`ALTER TABLE tasks ADD COLUMN child_display_order INTEGER`);
|
|
33
|
+
}
|
|
34
|
+
db.exec(`
|
|
35
|
+
CREATE INDEX IF NOT EXISTS idx_tasks_parent_task_id ON tasks(parent_task_id);
|
|
36
|
+
CREATE INDEX IF NOT EXISTS idx_tasks_parent_child_order ON tasks(parent_task_id, child_display_order);
|
|
37
|
+
`);
|
|
38
|
+
// SQLite-only runtime guard triggers. Postgres path enforces constraints in core logic.
|
|
39
|
+
if (db.provider === 'sqlite') {
|
|
40
|
+
db.exec(`
|
|
41
|
+
CREATE TRIGGER IF NOT EXISTS trg_tasks_parent_guard_insert
|
|
42
|
+
BEFORE INSERT ON tasks
|
|
43
|
+
FOR EACH ROW
|
|
44
|
+
WHEN NEW.parent_task_id IS NOT NULL AND TRIM(NEW.parent_task_id) <> ''
|
|
45
|
+
BEGIN
|
|
46
|
+
SELECT CASE
|
|
47
|
+
WHEN NEW.parent_task_id = NEW.id THEN RAISE(ABORT, 'Task cannot parent itself')
|
|
48
|
+
WHEN (SELECT id FROM tasks WHERE id = NEW.parent_task_id) IS NULL THEN RAISE(ABORT, 'Parent task not found')
|
|
49
|
+
END;
|
|
50
|
+
END;
|
|
51
|
+
`);
|
|
52
|
+
db.exec(`
|
|
53
|
+
CREATE TRIGGER IF NOT EXISTS trg_tasks_parent_guard_update
|
|
54
|
+
BEFORE UPDATE OF parent_task_id ON tasks
|
|
55
|
+
FOR EACH ROW
|
|
56
|
+
WHEN NEW.parent_task_id IS NOT NULL AND TRIM(NEW.parent_task_id) <> ''
|
|
57
|
+
BEGIN
|
|
58
|
+
SELECT CASE
|
|
59
|
+
WHEN NEW.parent_task_id = NEW.id THEN RAISE(ABORT, 'Task cannot parent itself')
|
|
60
|
+
WHEN (SELECT id FROM tasks WHERE id = NEW.parent_task_id) IS NULL THEN RAISE(ABORT, 'Parent task not found')
|
|
61
|
+
END;
|
|
62
|
+
END;
|
|
63
|
+
`);
|
|
64
|
+
// Block deletion of parent tasks while children still point to them.
|
|
65
|
+
db.exec(`
|
|
66
|
+
CREATE TRIGGER IF NOT EXISTS trg_tasks_block_delete_with_children
|
|
67
|
+
BEFORE DELETE ON tasks
|
|
68
|
+
FOR EACH ROW
|
|
69
|
+
WHEN EXISTS (SELECT 1 FROM tasks WHERE parent_task_id = OLD.id)
|
|
70
|
+
BEGIN
|
|
71
|
+
SELECT RAISE(ABORT, 'Cannot delete parent task with children');
|
|
72
|
+
END;
|
|
73
|
+
`);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
export function ensureScheduleTaskSchema(db) {
|
|
77
|
+
const columns = db.prepare(`PRAGMA table_info(tasks)`).all();
|
|
78
|
+
const hasScheduledDateColumn = columns.some((c) => c.name === 'scheduled_date');
|
|
79
|
+
const hasDueDateColumn = columns.some((c) => c.name === 'due_date');
|
|
80
|
+
const hasScheduledWeekKeyColumn = columns.some((c) => c.name === 'scheduled_week_key');
|
|
81
|
+
const hasOrderInDayColumn = columns.some((c) => c.name === 'order_in_day');
|
|
82
|
+
if (!hasScheduledDateColumn) {
|
|
83
|
+
db.exec(`ALTER TABLE tasks ADD COLUMN scheduled_date TEXT`);
|
|
84
|
+
}
|
|
85
|
+
if (!hasDueDateColumn) {
|
|
86
|
+
db.exec(`ALTER TABLE tasks ADD COLUMN due_date TEXT`);
|
|
87
|
+
}
|
|
88
|
+
if (!hasScheduledWeekKeyColumn) {
|
|
89
|
+
db.exec(`ALTER TABLE tasks ADD COLUMN scheduled_week_key TEXT`);
|
|
90
|
+
}
|
|
91
|
+
if (!hasOrderInDayColumn) {
|
|
92
|
+
db.exec(`ALTER TABLE tasks ADD COLUMN order_in_day INTEGER`);
|
|
93
|
+
}
|
|
94
|
+
db.exec(`
|
|
95
|
+
CREATE INDEX IF NOT EXISTS idx_tasks_scheduled_week_key ON tasks(scheduled_week_key);
|
|
96
|
+
CREATE INDEX IF NOT EXISTS idx_tasks_scheduled_date_order ON tasks(scheduled_date, order_in_day);
|
|
97
|
+
CREATE INDEX IF NOT EXISTS idx_tasks_due_date ON tasks(due_date);
|
|
98
|
+
`);
|
|
99
|
+
}
|
|
100
|
+
export function ensureAssigneeTaskSchema(db) {
|
|
101
|
+
const columns = db.prepare(`PRAGMA table_info(tasks)`).all();
|
|
102
|
+
const hasAssigneeColumn = columns.some((c) => c.name === 'assignee');
|
|
103
|
+
if (!hasAssigneeColumn) {
|
|
104
|
+
db.exec(`ALTER TABLE tasks ADD COLUMN assignee TEXT NOT NULL DEFAULT 'unassigned'`);
|
|
105
|
+
db.exec(`UPDATE tasks SET assignee = 'unassigned' WHERE assignee IS NULL OR TRIM(assignee) = ''`);
|
|
106
|
+
}
|
|
107
|
+
db.exec(`CREATE INDEX IF NOT EXISTS idx_tasks_assignee ON tasks(assignee)`);
|
|
108
|
+
}
|
|
109
|
+
export function ensureWorkspaceSchema(db) {
|
|
110
|
+
db.exec(`
|
|
111
|
+
CREATE TABLE IF NOT EXISTS workspaces (
|
|
112
|
+
id TEXT PRIMARY KEY,
|
|
113
|
+
tenant_id TEXT NOT NULL DEFAULT 'default',
|
|
114
|
+
slug TEXT,
|
|
115
|
+
name TEXT NOT NULL,
|
|
116
|
+
description TEXT,
|
|
117
|
+
created_at TEXT NOT NULL,
|
|
118
|
+
updated_at TEXT
|
|
119
|
+
);
|
|
120
|
+
|
|
121
|
+
CREATE TABLE IF NOT EXISTS users (
|
|
122
|
+
id TEXT PRIMARY KEY,
|
|
123
|
+
tenant_id TEXT NOT NULL DEFAULT 'default',
|
|
124
|
+
email TEXT NOT NULL,
|
|
125
|
+
display_name TEXT,
|
|
126
|
+
avatar_url TEXT,
|
|
127
|
+
auth_provider TEXT,
|
|
128
|
+
external_auth_id TEXT,
|
|
129
|
+
password_hash TEXT,
|
|
130
|
+
email_verified_at TEXT,
|
|
131
|
+
beta_access BOOLEAN NOT NULL DEFAULT TRUE,
|
|
132
|
+
is_disabled BOOLEAN NOT NULL DEFAULT FALSE,
|
|
133
|
+
created_at TEXT NOT NULL,
|
|
134
|
+
updated_at TEXT
|
|
135
|
+
);
|
|
136
|
+
|
|
137
|
+
CREATE TABLE IF NOT EXISTS auth_tokens (
|
|
138
|
+
id TEXT PRIMARY KEY,
|
|
139
|
+
tenant_id TEXT NOT NULL DEFAULT 'default',
|
|
140
|
+
user_id TEXT NOT NULL,
|
|
141
|
+
workspace_id TEXT,
|
|
142
|
+
purpose TEXT NOT NULL,
|
|
143
|
+
token_hash TEXT NOT NULL,
|
|
144
|
+
expires_at TEXT NOT NULL,
|
|
145
|
+
used_at TEXT,
|
|
146
|
+
revoked_at TEXT,
|
|
147
|
+
created_at TEXT NOT NULL,
|
|
148
|
+
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
|
|
149
|
+
);
|
|
150
|
+
|
|
151
|
+
CREATE TABLE IF NOT EXISTS workspace_memberships (
|
|
152
|
+
id TEXT PRIMARY KEY,
|
|
153
|
+
tenant_id TEXT NOT NULL DEFAULT 'default',
|
|
154
|
+
workspace_id TEXT NOT NULL,
|
|
155
|
+
user_id TEXT NOT NULL,
|
|
156
|
+
role TEXT NOT NULL DEFAULT 'member',
|
|
157
|
+
permission_mode TEXT NOT NULL DEFAULT 'read-write',
|
|
158
|
+
beta_access BOOLEAN NOT NULL DEFAULT TRUE,
|
|
159
|
+
status TEXT NOT NULL DEFAULT 'active',
|
|
160
|
+
created_at TEXT NOT NULL,
|
|
161
|
+
updated_at TEXT,
|
|
162
|
+
FOREIGN KEY (workspace_id) REFERENCES workspaces(id) ON DELETE CASCADE,
|
|
163
|
+
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
|
|
164
|
+
);
|
|
165
|
+
`);
|
|
166
|
+
const taskColumns = db.prepare(`PRAGMA table_info(tasks)`).all();
|
|
167
|
+
const hasTaskWorkspaceColumn = taskColumns.some((c) => c.name === 'workspace_id');
|
|
168
|
+
if (!hasTaskWorkspaceColumn) {
|
|
169
|
+
db.exec(`ALTER TABLE tasks ADD COLUMN workspace_id TEXT NOT NULL DEFAULT 'default'`);
|
|
170
|
+
}
|
|
171
|
+
const commentColumns = db.prepare(`PRAGMA table_info(comments)`).all();
|
|
172
|
+
const hasCommentWorkspaceColumn = commentColumns.some((c) => c.name === 'workspace_id');
|
|
173
|
+
if (!hasCommentWorkspaceColumn) {
|
|
174
|
+
db.exec(`ALTER TABLE comments ADD COLUMN workspace_id TEXT NOT NULL DEFAULT 'default'`);
|
|
175
|
+
}
|
|
176
|
+
const screenshotColumns = db.prepare(`PRAGMA table_info(screenshots)`).all();
|
|
177
|
+
const hasScreenshotWorkspaceColumn = screenshotColumns.some((c) => c.name === 'workspace_id');
|
|
178
|
+
if (!hasScreenshotWorkspaceColumn) {
|
|
179
|
+
db.exec(`ALTER TABLE screenshots ADD COLUMN workspace_id TEXT NOT NULL DEFAULT 'default'`);
|
|
180
|
+
}
|
|
181
|
+
const userColumns = db.prepare(`PRAGMA table_info(users)`).all();
|
|
182
|
+
const hasPasswordHashColumn = userColumns.some((c) => c.name === 'password_hash');
|
|
183
|
+
if (!hasPasswordHashColumn) {
|
|
184
|
+
db.exec(`ALTER TABLE users ADD COLUMN password_hash TEXT`);
|
|
185
|
+
}
|
|
186
|
+
const hasEmailVerifiedAtColumn = userColumns.some((c) => c.name === 'email_verified_at');
|
|
187
|
+
if (!hasEmailVerifiedAtColumn) {
|
|
188
|
+
db.exec(`ALTER TABLE users ADD COLUMN email_verified_at TEXT`);
|
|
189
|
+
}
|
|
190
|
+
const hasSystemRoleColumn = userColumns.some((c) => c.name === 'system_role');
|
|
191
|
+
if (!hasSystemRoleColumn) {
|
|
192
|
+
db.exec(`ALTER TABLE users ADD COLUMN system_role TEXT NOT NULL DEFAULT 'user'`);
|
|
193
|
+
}
|
|
194
|
+
const hasUserBetaAccessColumn = userColumns.some((c) => c.name === 'beta_access');
|
|
195
|
+
if (!hasUserBetaAccessColumn) {
|
|
196
|
+
db.exec(`ALTER TABLE users ADD COLUMN beta_access BOOLEAN NOT NULL DEFAULT TRUE`);
|
|
197
|
+
}
|
|
198
|
+
const membershipColumns = db.prepare(`PRAGMA table_info(workspace_memberships)`).all();
|
|
199
|
+
const hasBetaAccessColumn = membershipColumns.some((c) => c.name === 'beta_access');
|
|
200
|
+
const hasPermissionModeColumn = membershipColumns.some((c) => c.name === 'permission_mode');
|
|
201
|
+
if (!hasBetaAccessColumn) {
|
|
202
|
+
db.exec(`ALTER TABLE workspace_memberships ADD COLUMN beta_access BOOLEAN NOT NULL DEFAULT TRUE`);
|
|
203
|
+
}
|
|
204
|
+
if (!hasPermissionModeColumn) {
|
|
205
|
+
db.exec(`ALTER TABLE workspace_memberships ADD COLUMN permission_mode TEXT NOT NULL DEFAULT 'read-write'`);
|
|
206
|
+
}
|
|
207
|
+
const authTokenColumns = db.prepare(`PRAGMA table_info(auth_tokens)`).all();
|
|
208
|
+
const hasRevokedAtColumn = authTokenColumns.some((c) => c.name === 'revoked_at');
|
|
209
|
+
const hasWorkspaceIdColumn = authTokenColumns.some((c) => c.name === 'workspace_id');
|
|
210
|
+
if (!hasRevokedAtColumn) {
|
|
211
|
+
db.exec(`ALTER TABLE auth_tokens ADD COLUMN revoked_at TEXT`);
|
|
212
|
+
}
|
|
213
|
+
if (!hasWorkspaceIdColumn) {
|
|
214
|
+
db.exec(`ALTER TABLE auth_tokens ADD COLUMN workspace_id TEXT`);
|
|
215
|
+
}
|
|
216
|
+
db.exec(`
|
|
217
|
+
CREATE UNIQUE INDEX IF NOT EXISTS idx_workspaces_tenant_slug ON workspaces(tenant_id, slug);
|
|
218
|
+
CREATE UNIQUE INDEX IF NOT EXISTS idx_users_tenant_email ON users(tenant_id, email);
|
|
219
|
+
CREATE INDEX IF NOT EXISTS idx_users_tenant_system_role ON users(tenant_id, system_role);
|
|
220
|
+
CREATE UNIQUE INDEX IF NOT EXISTS idx_workspace_memberships_workspace_user ON workspace_memberships(workspace_id, user_id);
|
|
221
|
+
CREATE UNIQUE INDEX IF NOT EXISTS idx_auth_tokens_hash ON auth_tokens(token_hash);
|
|
222
|
+
|
|
223
|
+
CREATE INDEX IF NOT EXISTS idx_tasks_workspace ON tasks(workspace_id);
|
|
224
|
+
CREATE INDEX IF NOT EXISTS idx_tasks_tenant_workspace_archived ON tasks(tenant_id, workspace_id, is_archived);
|
|
225
|
+
CREATE INDEX IF NOT EXISTS idx_comments_workspace_task ON comments(workspace_id, task_id);
|
|
226
|
+
CREATE INDEX IF NOT EXISTS idx_screenshots_workspace_task ON screenshots(workspace_id, task_id);
|
|
227
|
+
CREATE INDEX IF NOT EXISTS idx_workspace_memberships_user ON workspace_memberships(user_id);
|
|
228
|
+
CREATE INDEX IF NOT EXISTS idx_workspace_memberships_workspace ON workspace_memberships(workspace_id);
|
|
229
|
+
CREATE INDEX IF NOT EXISTS idx_auth_tokens_user_purpose ON auth_tokens(user_id, purpose);
|
|
230
|
+
CREATE INDEX IF NOT EXISTS idx_auth_tokens_workspace_purpose ON auth_tokens(workspace_id, purpose);
|
|
231
|
+
CREATE INDEX IF NOT EXISTS idx_auth_tokens_expires ON auth_tokens(expires_at);
|
|
232
|
+
`);
|
|
233
|
+
}
|
|
234
|
+
export function ensureBillingSchema(db) {
|
|
235
|
+
db.exec(`
|
|
236
|
+
CREATE TABLE IF NOT EXISTS user_billing (
|
|
237
|
+
user_id TEXT PRIMARY KEY,
|
|
238
|
+
tenant_id TEXT NOT NULL DEFAULT 'default',
|
|
239
|
+
stripe_customer_id TEXT UNIQUE,
|
|
240
|
+
stripe_subscription_id TEXT,
|
|
241
|
+
stripe_price_id TEXT,
|
|
242
|
+
stripe_status TEXT,
|
|
243
|
+
tier TEXT NOT NULL DEFAULT 'free',
|
|
244
|
+
billing_interval TEXT,
|
|
245
|
+
entitlement_state TEXT NOT NULL DEFAULT 'free',
|
|
246
|
+
trial_end TEXT,
|
|
247
|
+
current_period_end TEXT,
|
|
248
|
+
effective_until TEXT,
|
|
249
|
+
created_at TEXT NOT NULL,
|
|
250
|
+
updated_at TEXT NOT NULL,
|
|
251
|
+
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
|
|
252
|
+
);
|
|
253
|
+
|
|
254
|
+
CREATE TABLE IF NOT EXISTS stripe_webhook_events (
|
|
255
|
+
event_id TEXT PRIMARY KEY,
|
|
256
|
+
tenant_id TEXT NOT NULL DEFAULT 'default',
|
|
257
|
+
event_type TEXT NOT NULL,
|
|
258
|
+
processed_at TEXT NOT NULL
|
|
259
|
+
);
|
|
260
|
+
|
|
261
|
+
CREATE TABLE IF NOT EXISTS stripe_webhook_failures (
|
|
262
|
+
id TEXT PRIMARY KEY,
|
|
263
|
+
tenant_id TEXT NOT NULL DEFAULT 'default',
|
|
264
|
+
event_id TEXT NOT NULL,
|
|
265
|
+
event_type TEXT,
|
|
266
|
+
reason TEXT NOT NULL,
|
|
267
|
+
payload_excerpt TEXT,
|
|
268
|
+
purge_after TEXT NOT NULL,
|
|
269
|
+
created_at TEXT NOT NULL
|
|
270
|
+
);
|
|
271
|
+
|
|
272
|
+
CREATE TABLE IF NOT EXISTS billing_config (
|
|
273
|
+
tenant_id TEXT PRIMARY KEY,
|
|
274
|
+
config_json TEXT NOT NULL DEFAULT '{}',
|
|
275
|
+
updated_at TEXT NOT NULL,
|
|
276
|
+
updated_by TEXT
|
|
277
|
+
);
|
|
278
|
+
|
|
279
|
+
CREATE TABLE IF NOT EXISTS billing_price_mappings (
|
|
280
|
+
tenant_id TEXT NOT NULL DEFAULT 'default',
|
|
281
|
+
plan_version_id TEXT NOT NULL,
|
|
282
|
+
billing_interval TEXT NOT NULL,
|
|
283
|
+
stripe_price_id TEXT NOT NULL,
|
|
284
|
+
active BOOLEAN NOT NULL DEFAULT TRUE,
|
|
285
|
+
created_at TEXT NOT NULL,
|
|
286
|
+
updated_at TEXT NOT NULL,
|
|
287
|
+
PRIMARY KEY (tenant_id, stripe_price_id)
|
|
288
|
+
);
|
|
289
|
+
|
|
290
|
+
CREATE INDEX IF NOT EXISTS idx_user_billing_tenant ON user_billing(tenant_id);
|
|
291
|
+
CREATE INDEX IF NOT EXISTS idx_user_billing_customer ON user_billing(stripe_customer_id);
|
|
292
|
+
CREATE INDEX IF NOT EXISTS idx_stripe_webhook_events_tenant ON stripe_webhook_events(tenant_id);
|
|
293
|
+
CREATE INDEX IF NOT EXISTS idx_stripe_webhook_failures_tenant ON stripe_webhook_failures(tenant_id);
|
|
294
|
+
CREATE INDEX IF NOT EXISTS idx_stripe_webhook_failures_event ON stripe_webhook_failures(event_id);
|
|
295
|
+
CREATE INDEX IF NOT EXISTS idx_stripe_webhook_failures_purge_after ON stripe_webhook_failures(purge_after);
|
|
296
|
+
CREATE INDEX IF NOT EXISTS idx_billing_price_mappings_plan ON billing_price_mappings(tenant_id, plan_version_id);
|
|
297
|
+
CREATE INDEX IF NOT EXISTS idx_billing_price_mappings_active ON billing_price_mappings(tenant_id, active);
|
|
298
|
+
`);
|
|
299
|
+
}
|
|
300
|
+
export function ensureEntitlementsSchema(db) {
|
|
301
|
+
db.exec(`
|
|
302
|
+
CREATE TABLE IF NOT EXISTS plan_catalog (
|
|
303
|
+
plan_id TEXT PRIMARY KEY,
|
|
304
|
+
tenant_id TEXT NOT NULL DEFAULT 'default',
|
|
305
|
+
display_name TEXT NOT NULL,
|
|
306
|
+
status TEXT NOT NULL DEFAULT 'active',
|
|
307
|
+
created_at TEXT NOT NULL,
|
|
308
|
+
updated_at TEXT NOT NULL
|
|
309
|
+
);
|
|
310
|
+
|
|
311
|
+
CREATE TABLE IF NOT EXISTS plan_versions (
|
|
312
|
+
plan_version_id TEXT PRIMARY KEY,
|
|
313
|
+
tenant_id TEXT NOT NULL DEFAULT 'default',
|
|
314
|
+
plan_id TEXT NOT NULL,
|
|
315
|
+
version_number INTEGER NOT NULL,
|
|
316
|
+
is_default BOOLEAN NOT NULL DEFAULT FALSE,
|
|
317
|
+
seat_limit INTEGER,
|
|
318
|
+
metadata_json TEXT NOT NULL DEFAULT '{}',
|
|
319
|
+
created_at TEXT NOT NULL,
|
|
320
|
+
updated_at TEXT NOT NULL,
|
|
321
|
+
FOREIGN KEY (plan_id) REFERENCES plan_catalog(plan_id) ON DELETE CASCADE
|
|
322
|
+
);
|
|
323
|
+
|
|
324
|
+
CREATE TABLE IF NOT EXISTS plan_feature_matrix (
|
|
325
|
+
tenant_id TEXT NOT NULL DEFAULT 'default',
|
|
326
|
+
plan_version_id TEXT NOT NULL,
|
|
327
|
+
feature_key TEXT NOT NULL,
|
|
328
|
+
access TEXT NOT NULL DEFAULT 'disabled',
|
|
329
|
+
config_json TEXT NOT NULL DEFAULT '{}',
|
|
330
|
+
created_at TEXT NOT NULL,
|
|
331
|
+
updated_at TEXT NOT NULL,
|
|
332
|
+
PRIMARY KEY (tenant_id, plan_version_id, feature_key),
|
|
333
|
+
FOREIGN KEY (plan_version_id) REFERENCES plan_versions(plan_version_id) ON DELETE CASCADE
|
|
334
|
+
);
|
|
335
|
+
|
|
336
|
+
CREATE TABLE IF NOT EXISTS account_entitlements (
|
|
337
|
+
account_id TEXT PRIMARY KEY,
|
|
338
|
+
tenant_id TEXT NOT NULL DEFAULT 'default',
|
|
339
|
+
plan_version_id TEXT NOT NULL,
|
|
340
|
+
entitlement_state TEXT NOT NULL DEFAULT 'active',
|
|
341
|
+
effective_at TEXT,
|
|
342
|
+
effective_until TEXT,
|
|
343
|
+
updated_by TEXT,
|
|
344
|
+
created_at TEXT NOT NULL,
|
|
345
|
+
updated_at TEXT NOT NULL,
|
|
346
|
+
FOREIGN KEY (plan_version_id) REFERENCES plan_versions(plan_version_id)
|
|
347
|
+
);
|
|
348
|
+
|
|
349
|
+
CREATE TABLE IF NOT EXISTS entitlement_audit_log (
|
|
350
|
+
id TEXT PRIMARY KEY,
|
|
351
|
+
tenant_id TEXT NOT NULL DEFAULT 'default',
|
|
352
|
+
actor_user_id TEXT NOT NULL,
|
|
353
|
+
actor_role TEXT NOT NULL,
|
|
354
|
+
account_id TEXT NOT NULL,
|
|
355
|
+
action TEXT NOT NULL,
|
|
356
|
+
reason TEXT,
|
|
357
|
+
before_json TEXT NOT NULL DEFAULT '{}',
|
|
358
|
+
after_json TEXT NOT NULL DEFAULT '{}',
|
|
359
|
+
request_id TEXT,
|
|
360
|
+
created_at TEXT NOT NULL
|
|
361
|
+
);
|
|
362
|
+
|
|
363
|
+
CREATE UNIQUE INDEX IF NOT EXISTS idx_plan_versions_plan_version
|
|
364
|
+
ON plan_versions(tenant_id, plan_id, version_number);
|
|
365
|
+
CREATE INDEX IF NOT EXISTS idx_plan_versions_plan_id
|
|
366
|
+
ON plan_versions(tenant_id, plan_id);
|
|
367
|
+
CREATE INDEX IF NOT EXISTS idx_plan_versions_default
|
|
368
|
+
ON plan_versions(tenant_id, plan_id, is_default);
|
|
369
|
+
CREATE INDEX IF NOT EXISTS idx_plan_feature_matrix_plan_version
|
|
370
|
+
ON plan_feature_matrix(tenant_id, plan_version_id);
|
|
371
|
+
CREATE INDEX IF NOT EXISTS idx_account_entitlements_state
|
|
372
|
+
ON account_entitlements(tenant_id, entitlement_state);
|
|
373
|
+
CREATE INDEX IF NOT EXISTS idx_account_entitlements_plan_version
|
|
374
|
+
ON account_entitlements(tenant_id, plan_version_id);
|
|
375
|
+
CREATE INDEX IF NOT EXISTS idx_account_entitlements_effective_until
|
|
376
|
+
ON account_entitlements(tenant_id, effective_until);
|
|
377
|
+
CREATE INDEX IF NOT EXISTS idx_entitlement_audit_log_account
|
|
378
|
+
ON entitlement_audit_log(tenant_id, account_id, created_at);
|
|
379
|
+
CREATE INDEX IF NOT EXISTS idx_entitlement_audit_log_actor
|
|
380
|
+
ON entitlement_audit_log(tenant_id, actor_user_id, created_at);
|
|
381
|
+
`);
|
|
382
|
+
}
|
|
383
|
+
export function ensureTaskAssetsSchema(db) {
|
|
384
|
+
db.exec(`
|
|
385
|
+
CREATE TABLE IF NOT EXISTS task_assets (
|
|
386
|
+
tenant_id TEXT NOT NULL DEFAULT 'default',
|
|
387
|
+
workspace_id TEXT NOT NULL DEFAULT 'default',
|
|
388
|
+
path TEXT NOT NULL,
|
|
389
|
+
provider TEXT NOT NULL,
|
|
390
|
+
version INTEGER NOT NULL DEFAULT 1,
|
|
391
|
+
content_type TEXT NOT NULL,
|
|
392
|
+
size_bytes INTEGER NOT NULL,
|
|
393
|
+
sha256 TEXT NOT NULL,
|
|
394
|
+
uploaded_at TEXT NOT NULL,
|
|
395
|
+
scan_engine TEXT NOT NULL DEFAULT 'none',
|
|
396
|
+
scan_verdict TEXT NOT NULL DEFAULT 'clean',
|
|
397
|
+
scan_details TEXT,
|
|
398
|
+
scan_scanned_at TEXT,
|
|
399
|
+
quarantine_status TEXT NOT NULL DEFAULT 'none',
|
|
400
|
+
deleted_at TEXT,
|
|
401
|
+
purge_after TEXT,
|
|
402
|
+
updated_at TEXT NOT NULL,
|
|
403
|
+
PRIMARY KEY (tenant_id, workspace_id, path)
|
|
404
|
+
);
|
|
405
|
+
|
|
406
|
+
CREATE INDEX IF NOT EXISTS idx_task_assets_tenant_workspace_deleted
|
|
407
|
+
ON task_assets(tenant_id, workspace_id, deleted_at);
|
|
408
|
+
CREATE INDEX IF NOT EXISTS idx_task_assets_purge_after
|
|
409
|
+
ON task_assets(purge_after);
|
|
410
|
+
CREATE INDEX IF NOT EXISTS idx_task_assets_workspace_uploaded_at
|
|
411
|
+
ON task_assets(workspace_id, uploaded_at);
|
|
412
|
+
`);
|
|
413
|
+
const columns = db.prepare(`PRAGMA table_info(task_assets)`).all();
|
|
414
|
+
const hasQuarantineColumn = columns.some((c) => c.name === 'quarantine_status');
|
|
415
|
+
if (!hasQuarantineColumn) {
|
|
416
|
+
db.exec(`ALTER TABLE task_assets ADD COLUMN quarantine_status TEXT NOT NULL DEFAULT 'none'`);
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
export function ensureSyncEventsSchema(db) {
|
|
420
|
+
const syncEventsIdColumnSql = db.provider === 'postgres'
|
|
421
|
+
? 'id BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY'
|
|
422
|
+
: 'id INTEGER PRIMARY KEY AUTOINCREMENT';
|
|
423
|
+
db.exec(`
|
|
424
|
+
CREATE TABLE IF NOT EXISTS sync_events (
|
|
425
|
+
${syncEventsIdColumnSql},
|
|
426
|
+
tenant_id TEXT NOT NULL DEFAULT 'default',
|
|
427
|
+
workspace_id TEXT NOT NULL DEFAULT 'default',
|
|
428
|
+
event_type TEXT NOT NULL,
|
|
429
|
+
status TEXT NOT NULL,
|
|
430
|
+
status_code INTEGER,
|
|
431
|
+
error_message TEXT,
|
|
432
|
+
change_count INTEGER,
|
|
433
|
+
request_ms INTEGER,
|
|
434
|
+
occurred_at TEXT NOT NULL
|
|
435
|
+
);
|
|
436
|
+
CREATE INDEX IF NOT EXISTS idx_sync_events_workspace_occurred
|
|
437
|
+
ON sync_events(tenant_id, workspace_id, occurred_at);
|
|
438
|
+
`);
|
|
439
|
+
}
|
|
440
|
+
export function ensureWorkspaceDocumentsSchema(db) {
|
|
441
|
+
db.exec(`
|
|
442
|
+
CREATE TABLE IF NOT EXISTS workspace_documents (
|
|
443
|
+
tenant_id TEXT NOT NULL DEFAULT 'default',
|
|
444
|
+
workspace_id TEXT NOT NULL DEFAULT 'default',
|
|
445
|
+
path TEXT NOT NULL,
|
|
446
|
+
content_hash TEXT NOT NULL,
|
|
447
|
+
updated_at TEXT NOT NULL,
|
|
448
|
+
PRIMARY KEY (tenant_id, workspace_id, path)
|
|
449
|
+
);
|
|
450
|
+
CREATE INDEX IF NOT EXISTS idx_workspace_documents_workspace_path
|
|
451
|
+
ON workspace_documents(tenant_id, workspace_id, path);
|
|
452
|
+
`);
|
|
453
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Taskforce Plugins
|
|
3
|
+
*
|
|
4
|
+
* Adapters for different dev server environments.
|
|
5
|
+
* Each plugin intercepts /api/taskforce/ requests and writes to TASKFORCE.json.
|
|
6
|
+
*
|
|
7
|
+
* Available plugins:
|
|
8
|
+
* - vite: For Vite projects
|
|
9
|
+
*/
|
|
10
|
+
export { taskforcePlugin } from './vite.js';
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Taskforce Plugins
|
|
3
|
+
*
|
|
4
|
+
* Adapters for different dev server environments.
|
|
5
|
+
* Each plugin intercepts /api/taskforce/ requests and writes to TASKFORCE.json.
|
|
6
|
+
*
|
|
7
|
+
* Available plugins:
|
|
8
|
+
* - vite: For Vite projects
|
|
9
|
+
*/
|
|
10
|
+
export { taskforcePlugin } from './vite.js';
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Taskforce Vite Plugin
|
|
3
|
+
*
|
|
4
|
+
* Handles task operations during development by reading/writing JSON files.
|
|
5
|
+
* Uses TaskforceCore for logic, acting as an HTTP adapter.
|
|
6
|
+
*/
|
|
7
|
+
import type { Plugin } from 'vite';
|
|
8
|
+
/**
|
|
9
|
+
* Vite plugin for Taskforce file operations
|
|
10
|
+
*
|
|
11
|
+
* Uses project root (parent of frontend/) as base path for file operations.
|
|
12
|
+
* Default storage path: .taskforce/ (for AI agent accessibility)
|
|
13
|
+
*/
|
|
14
|
+
export declare function taskforcePlugin(options?: {
|
|
15
|
+
outputPath?: string;
|
|
16
|
+
hostRoot?: string;
|
|
17
|
+
mode?: 'app' | 'standalone';
|
|
18
|
+
}): Plugin;
|
|
19
|
+
export default taskforcePlugin;
|