ui-syncup 0.3.13 → 0.4.0-beta.1
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/.agents/skills/ai-spec-workflow/SKILL.md +58 -0
- package/.agents/skills/ai-spec-workflow/references/AI_SPECIFICATION_WORKFLOW.md +1434 -0
- package/.agents/skills/ai-spec-workflow/references/templates/design-template.md +729 -0
- package/.agents/skills/ai-spec-workflow/references/templates/requirements-template.md +179 -0
- package/.agents/skills/ai-spec-workflow/references/templates/tasks-template.md +501 -0
- package/.agents/skills/animation-designer/SKILL.md +688 -0
- package/.agents/skills/animation-designer/manifest.yaml +44 -0
- package/.agents/skills/brainstorming/SKILL.md +54 -0
- package/.agents/skills/contract-driven-ui/SKILL.md +270 -0
- package/.agents/skills/dispatching-parallel-agents/SKILL.md +180 -0
- package/.agents/skills/executing-plans/SKILL.md +76 -0
- package/.agents/skills/executing-specs/SKILL.md +53 -0
- package/.agents/skills/finishing-a-development-branch/SKILL.md +200 -0
- package/.agents/skills/github-workflow-automation/SKILL.md +846 -0
- package/.agents/skills/react-best-practices/AGENTS.md +2249 -0
- package/.agents/skills/react-best-practices/README.md +123 -0
- package/.agents/skills/react-best-practices/SKILL.md +121 -0
- package/.agents/skills/react-best-practices/metadata.json +15 -0
- package/.agents/skills/react-best-practices/rules/_sections.md +46 -0
- package/.agents/skills/react-best-practices/rules/_template.md +28 -0
- package/.agents/skills/react-best-practices/rules/advanced-event-handler-refs.md +55 -0
- package/.agents/skills/react-best-practices/rules/advanced-use-latest.md +49 -0
- package/.agents/skills/react-best-practices/rules/async-api-routes.md +38 -0
- package/.agents/skills/react-best-practices/rules/async-defer-await.md +80 -0
- package/.agents/skills/react-best-practices/rules/async-dependencies.md +36 -0
- package/.agents/skills/react-best-practices/rules/async-parallel.md +28 -0
- package/.agents/skills/react-best-practices/rules/async-suspense-boundaries.md +99 -0
- package/.agents/skills/react-best-practices/rules/bundle-barrel-imports.md +59 -0
- package/.agents/skills/react-best-practices/rules/bundle-conditional.md +31 -0
- package/.agents/skills/react-best-practices/rules/bundle-defer-third-party.md +49 -0
- package/.agents/skills/react-best-practices/rules/bundle-dynamic-imports.md +35 -0
- package/.agents/skills/react-best-practices/rules/bundle-preload.md +50 -0
- package/.agents/skills/react-best-practices/rules/client-event-listeners.md +74 -0
- package/.agents/skills/react-best-practices/rules/client-swr-dedup.md +56 -0
- package/.agents/skills/react-best-practices/rules/js-batch-dom-css.md +82 -0
- package/.agents/skills/react-best-practices/rules/js-cache-function-results.md +80 -0
- package/.agents/skills/react-best-practices/rules/js-cache-property-access.md +28 -0
- package/.agents/skills/react-best-practices/rules/js-cache-storage.md +70 -0
- package/.agents/skills/react-best-practices/rules/js-combine-iterations.md +32 -0
- package/.agents/skills/react-best-practices/rules/js-early-exit.md +50 -0
- package/.agents/skills/react-best-practices/rules/js-hoist-regexp.md +45 -0
- package/.agents/skills/react-best-practices/rules/js-index-maps.md +37 -0
- package/.agents/skills/react-best-practices/rules/js-length-check-first.md +49 -0
- package/.agents/skills/react-best-practices/rules/js-min-max-loop.md +82 -0
- package/.agents/skills/react-best-practices/rules/js-set-map-lookups.md +24 -0
- package/.agents/skills/react-best-practices/rules/js-tosorted-immutable.md +57 -0
- package/.agents/skills/react-best-practices/rules/rendering-activity.md +26 -0
- package/.agents/skills/react-best-practices/rules/rendering-animate-svg-wrapper.md +47 -0
- package/.agents/skills/react-best-practices/rules/rendering-conditional-render.md +40 -0
- package/.agents/skills/react-best-practices/rules/rendering-content-visibility.md +38 -0
- package/.agents/skills/react-best-practices/rules/rendering-hoist-jsx.md +46 -0
- package/.agents/skills/react-best-practices/rules/rendering-hydration-no-flicker.md +82 -0
- package/.agents/skills/react-best-practices/rules/rendering-svg-precision.md +28 -0
- package/.agents/skills/react-best-practices/rules/rerender-defer-reads.md +39 -0
- package/.agents/skills/react-best-practices/rules/rerender-dependencies.md +45 -0
- package/.agents/skills/react-best-practices/rules/rerender-derived-state.md +29 -0
- package/.agents/skills/react-best-practices/rules/rerender-functional-setstate.md +74 -0
- package/.agents/skills/react-best-practices/rules/rerender-lazy-state-init.md +58 -0
- package/.agents/skills/react-best-practices/rules/rerender-memo.md +44 -0
- package/.agents/skills/react-best-practices/rules/rerender-transitions.md +40 -0
- package/.agents/skills/react-best-practices/rules/server-after-nonblocking.md +73 -0
- package/.agents/skills/react-best-practices/rules/server-cache-lru.md +41 -0
- package/.agents/skills/react-best-practices/rules/server-cache-react.md +26 -0
- package/.agents/skills/react-best-practices/rules/server-parallel-fetching.md +79 -0
- package/.agents/skills/react-best-practices/rules/server-serialization.md +38 -0
- package/.agents/skills/react-ui-patterns/SKILL.md +289 -0
- package/.agents/skills/receiving-code-review/SKILL.md +213 -0
- package/.agents/skills/requesting-code-review/SKILL.md +105 -0
- package/.agents/skills/requesting-code-review/code-reviewer.md +146 -0
- package/.agents/skills/reviewing-code/SKILL.md +28 -0
- package/.agents/skills/shadcn/SKILL.md +240 -0
- package/.agents/skills/shadcn/agents/openai.yml +5 -0
- package/.agents/skills/shadcn/assets/shadcn-small.png +0 -0
- package/.agents/skills/shadcn/assets/shadcn.png +0 -0
- package/.agents/skills/shadcn/cli.md +255 -0
- package/.agents/skills/shadcn/customization.md +202 -0
- package/.agents/skills/shadcn/evals/evals.json +47 -0
- package/.agents/skills/shadcn/mcp.md +94 -0
- package/.agents/skills/shadcn/rules/base-vs-radix.md +306 -0
- package/.agents/skills/shadcn/rules/composition.md +195 -0
- package/.agents/skills/shadcn/rules/forms.md +192 -0
- package/.agents/skills/shadcn/rules/icons.md +101 -0
- package/.agents/skills/shadcn/rules/styling.md +162 -0
- package/.agents/skills/steering-creation/SKILL.md +221 -0
- package/.agents/skills/steering-creation/references/STEERING_CREATION_INSTRUCTION.md +850 -0
- package/.agents/skills/subagent-driven-development/SKILL.md +240 -0
- package/.agents/skills/subagent-driven-development/code-quality-reviewer-prompt.md +20 -0
- package/.agents/skills/subagent-driven-development/implementer-prompt.md +78 -0
- package/.agents/skills/subagent-driven-development/spec-reviewer-prompt.md +61 -0
- package/.agents/skills/systematic-debugging/CREATION-LOG.md +119 -0
- package/.agents/skills/systematic-debugging/SKILL.md +296 -0
- package/.agents/skills/systematic-debugging/condition-based-waiting-example.ts +158 -0
- package/.agents/skills/systematic-debugging/condition-based-waiting.md +115 -0
- package/.agents/skills/systematic-debugging/defense-in-depth.md +122 -0
- package/.agents/skills/systematic-debugging/find-polluter.sh +63 -0
- package/.agents/skills/systematic-debugging/root-cause-tracing.md +169 -0
- package/.agents/skills/systematic-debugging/test-academic.md +14 -0
- package/.agents/skills/systematic-debugging/test-pressure-1.md +58 -0
- package/.agents/skills/systematic-debugging/test-pressure-2.md +68 -0
- package/.agents/skills/systematic-debugging/test-pressure-3.md +69 -0
- package/.agents/skills/test-driven-development/SKILL.md +371 -0
- package/.agents/skills/test-driven-development/testing-anti-patterns.md +299 -0
- package/.agents/skills/using-git-worktrees/SKILL.md +217 -0
- package/.agents/skills/using-superpowers/SKILL.md +87 -0
- package/.agents/skills/verification-before-completion/SKILL.md +139 -0
- package/.agents/skills/web-design-guidelines/SKILL.md +36 -0
- package/.agents/skills/writing-plans/SKILL.md +116 -0
- package/.agents/skills/writing-skills/SKILL.md +655 -0
- package/.agents/skills/writing-skills/anthropic-best-practices.md +1150 -0
- package/.agents/skills/writing-skills/examples/CLAUDE_MD_TESTING.md +189 -0
- package/.agents/skills/writing-skills/graphviz-conventions.dot +172 -0
- package/.agents/skills/writing-skills/persuasion-principles.md +187 -0
- package/.agents/skills/writing-skills/render-graphs.js +168 -0
- package/.agents/skills/writing-skills/testing-skills-with-subagents.md +384 -0
- package/.ai/steering/product.md +51 -0
- package/.ai/steering/structure.md +275 -0
- package/.ai/steering/tech.md +188 -0
- package/.claude/agents/database-architect.md +96 -0
- package/.claude/agents/deployment-pipeline-architect.md +122 -0
- package/.claude/agents/nextjs-expert.md +69 -0
- package/.claude/agents/ui-design-expert.md +106 -0
- package/.claudeignore +69 -0
- package/.dockerignore +8 -0
- package/.env.development +86 -0
- package/.env.example +171 -0
- package/.env.production +139 -0
- package/.env.test +58 -0
- package/.gitattributes +2 -0
- package/.github/ISSUE_TEMPLATE/bug_report.yml +33 -0
- package/.github/ISSUE_TEMPLATE/feature_request.yml +20 -0
- package/.github/PULL_REQUEST_TEMPLATE.md +23 -0
- package/.github/workflows/ci.yml +64 -0
- package/.github/workflows/release.yml +131 -0
- package/.nvmrc +1 -0
- package/.releaserc.json +18 -0
- package/.vercelignore +73 -0
- package/AGENTS.md +544 -0
- package/CHANGELOG.md +37 -0
- package/CODE_OF_CONDUCT.md +21 -0
- package/CONTRIBUTING.md +32 -0
- package/Dockerfile +84 -0
- package/LICENSE +21 -0
- package/README.md +328 -59
- package/SECURITY.md +16 -0
- package/bun.lock +3853 -0
- package/cli/README.md +94 -0
- package/cli/bun.lock +306 -0
- package/cli/index.ts +96 -0
- package/cli/package-lock.json +2157 -0
- package/cli/package.json +30 -0
- package/cli/src/commands/backup.ts +78 -0
- package/cli/src/commands/doctor.ts +82 -0
- package/cli/src/commands/init.ts +234 -0
- package/cli/src/commands/logs.ts +26 -0
- package/cli/src/commands/open.ts +23 -0
- package/cli/src/commands/remove.ts +44 -0
- package/cli/src/commands/restart.ts +21 -0
- package/cli/src/commands/restore.ts +90 -0
- package/cli/src/commands/start.ts +26 -0
- package/cli/src/commands/status.ts +25 -0
- package/cli/src/commands/stop.ts +20 -0
- package/cli/src/commands/upgrade.ts +28 -0
- package/cli/src/lib/docker.ts +40 -0
- package/cli/src/lib/env.ts +42 -0
- package/cli/src/lib/ui.ts +43 -0
- package/cli/tsconfig.json +13 -0
- package/cli/tsup.config.ts +12 -0
- package/components.json +24 -0
- package/docker/README.md +430 -0
- package/docker/compose.dev-minio.yml +30 -0
- package/docker/compose.dev.yml +39 -0
- package/docker/compose.local.yml +84 -0
- package/docker/compose.yml +153 -0
- package/docs/VERSIONING.md +117 -0
- package/docs/database/DRIZZLE_COMMANDS_EXPLAINED.md +1779 -0
- package/docs/database/DRIZZLE_ZOD_POSTGRESQL_INSTRUCTION.md +646 -0
- package/docs/database/MIGRATION_BEST_PRACTICES.md +601 -0
- package/docs/database/MIGRATION_ROLLBACK.md +1080 -0
- package/docs/database/MIGRATION_SYSTEM.md +165 -0
- package/docs/database/MIGRATION_TROUBLESHOOTING.md +881 -0
- package/docs/development/ENVIRONMENT_CONFIG.md +896 -0
- package/docs/development/LOCAL_DEVELOPMENT.md +456 -0
- package/docs/development/REMOTE_DATABASE_SETUP.md +786 -0
- package/docs/development/STORAGE_SETUP.md +207 -0
- package/docs/development/SUPABASE_LOCAL_SETUP.md +178 -0
- package/docs/development/TESTING.md +714 -0
- package/docs/feature-architectures/LOADING_ARCHITECTURE.md +343 -0
- package/docs/feature-architectures/NOTIFICATION_ARCHITECTURE.md +858 -0
- package/docs/feature-architectures/RATE_LIMIT_RESET.md +147 -0
- package/docs/feature-architectures/RBAC.md +1132 -0
- package/docs/feature-architectures/RESOURCE_LIMITS.md +69 -0
- package/docs/feature-architectures/SECURITY.md +284 -0
- package/docs/feature-architectures/WORKSPACES.md +278 -0
- package/docs/plans/admin-setup-wizard-routing-plan.md +623 -0
- package/drizzle/0000_purple_wilson_fisk.sql +360 -0
- package/drizzle/0001_drop_instance_public_url.sql +1 -0
- package/drizzle/meta/0000_snapshot.json +3118 -0
- package/drizzle/meta/_journal.json +20 -0
- package/drizzle.config.ts +13 -0
- package/eslint.config.mjs +44 -0
- package/install.sh +180 -0
- package/next.config.ts +91 -0
- package/package.json +128 -22
- package/playwright.config.ts +70 -0
- package/postcss.config.mjs +7 -0
- package/public/file.svg +1 -0
- package/public/globe.svg +1 -0
- package/public/logo.svg +11 -0
- package/public/next.svg +1 -0
- package/public/playground/CPM-101/as-is-image.jpg +0 -0
- package/public/playground/CPM-101/to-be-image.jpg +0 -0
- package/public/playground/TEST-1/LinkedIn-skeleton-screen.png +0 -0
- package/public/playground/TEST-1/https___dev-to-uploads.s3.amazonaws.com_uploads_articles_vuahe90ka1mkx9aepmea.webp +0 -0
- package/public/playground/TEST-1/linkedin_skeletonscreen.jpg +0 -0
- package/public/vercel.svg +1 -0
- package/public/window.svg +1 -0
- package/scripts/__tests__/migrate.integration.test.ts +642 -0
- package/scripts/__tests__/migrate.property.test.ts +1714 -0
- package/scripts/__tests__/migrate.test.ts +536 -0
- package/scripts/admin-reset-password.ts +114 -0
- package/scripts/check-email-queue.ts +99 -0
- package/scripts/check-sessions.ts +50 -0
- package/scripts/db-pull-data.sh +73 -0
- package/scripts/force-verify-email.sh +13 -0
- package/scripts/migrate.ts +693 -0
- package/scripts/process-email-queue.ts +26 -0
- package/scripts/reset-db.ts +47 -0
- package/scripts/reset-rate-limit.sh +26 -0
- package/scripts/reset-remote-db.sql +31 -0
- package/scripts/retry-failed-emails.ts +67 -0
- package/scripts/seed.ts +605 -0
- package/scripts/setup-monitoring.sh +440 -0
- package/scripts/sync-migration-tracking.ts +113 -0
- package/scripts/test-ci-error-handling.sh +237 -0
- package/scripts/test-ci-workflow.sh +200 -0
- package/scripts/test-migration.sh +151 -0
- package/scripts/validate-env.ts +25 -0
- package/scripts/validate-migration-system.ts +566 -0
- package/scripts/verify-ci-status-reporting.sh +206 -0
- package/scripts/verify-user-email.sql +22 -0
- package/scripts/verify-vercel-integration.ts +292 -0
- package/seed_data.md +54 -0
- package/src/app/(protected)/(team)/(routes)/[projectSlug]/error.tsx +89 -0
- package/src/app/(protected)/(team)/(routes)/[projectSlug]/loading.tsx +101 -0
- package/src/app/(protected)/(team)/(routes)/[projectSlug]/page.tsx +91 -0
- package/src/app/(protected)/(team)/(routes)/issue/[issueKey]/README.md +192 -0
- package/src/app/(protected)/(team)/(routes)/issue/[issueKey]/error.tsx +58 -0
- package/src/app/(protected)/(team)/(routes)/issue/[issueKey]/loading.tsx +14 -0
- package/src/app/(protected)/(team)/(routes)/issue/[issueKey]/not-found.tsx +47 -0
- package/src/app/(protected)/(team)/(routes)/issue/[issueKey]/page.tsx +91 -0
- package/src/app/(protected)/(team)/projects/page.tsx +16 -0
- package/src/app/(protected)/(team)/team/settings/(section)/instance/page.tsx +52 -0
- package/src/app/(protected)/(team)/team/settings/(section)/integrations/loading.tsx +5 -0
- package/src/app/(protected)/(team)/team/settings/(section)/integrations/page.tsx +23 -0
- package/src/app/(protected)/(team)/team/settings/(section)/members/loading.tsx +5 -0
- package/src/app/(protected)/(team)/team/settings/(section)/members/page.tsx +35 -0
- package/src/app/(protected)/(team)/team/settings/layout.tsx +72 -0
- package/src/app/(protected)/(team)/team/settings/loading.tsx +5 -0
- package/src/app/(protected)/(team)/team/settings/page.tsx +71 -0
- package/src/app/(protected)/dev/auth/README.md +151 -0
- package/src/app/(protected)/dev/auth/page.tsx +590 -0
- package/src/app/(protected)/layout.test.tsx +209 -0
- package/src/app/(protected)/layout.tsx +28 -0
- package/src/app/(protected)/onboarding/page.tsx +27 -0
- package/src/app/(protected)/settings/integrations/page.tsx +23 -0
- package/src/app/(protected)/settings/layout.tsx +26 -0
- package/src/app/(protected)/settings/notifications/page.tsx +26 -0
- package/src/app/(protected)/settings/other/page.tsx +23 -0
- package/src/app/(protected)/settings/page.tsx +23 -0
- package/src/app/(protected)/settings/preferences/page.tsx +23 -0
- package/src/app/(protected)/settings/security/page.tsx +37 -0
- package/src/app/(public)/forgot-password/page.tsx +20 -0
- package/src/app/(public)/invite/project/[token]/error.tsx +50 -0
- package/src/app/(public)/invite/project/[token]/loading.tsx +39 -0
- package/src/app/(public)/invite/project/[token]/page.tsx +156 -0
- package/src/app/(public)/layout.tsx +9 -0
- package/src/app/(public)/privacy-policy/page.tsx +12 -0
- package/src/app/(public)/reset-password/page.tsx +37 -0
- package/src/app/(public)/setup/__tests__/page.test.tsx +30 -0
- package/src/app/(public)/setup/page.tsx +17 -0
- package/src/app/(public)/share/issue/[token]/page.tsx +51 -0
- package/src/app/(public)/sign-in/page.tsx +55 -0
- package/src/app/(public)/sign-up/page.tsx +23 -0
- package/src/app/(public)/verify-email/page.tsx +22 -0
- package/src/app/(public)/verify-email-confirm/page.tsx +40 -0
- package/src/app/api/auth/[...all]/route.ts +6 -0
- package/src/app/api/auth/delete-account/route.ts +134 -0
- package/src/app/api/auth/dev/force-verify/route.ts +180 -0
- package/src/app/api/auth/dev/reset-rate-limit/route.ts +144 -0
- package/src/app/api/auth/dev/sessions/route.ts +172 -0
- package/src/app/api/auth/forgot-password/__tests__/forgot-password.property.test.ts +397 -0
- package/src/app/api/auth/forgot-password/route.ts +277 -0
- package/src/app/api/auth/logout/route.ts +115 -0
- package/src/app/api/auth/me/route.ts +123 -0
- package/src/app/api/auth/providers/__tests__/route.test.ts +236 -0
- package/src/app/api/auth/providers/route.ts +119 -0
- package/src/app/api/auth/resend-verification/route.ts +262 -0
- package/src/app/api/auth/reset-password/__tests__/reset-password.property.test.ts +493 -0
- package/src/app/api/auth/reset-password/__tests__/route.test.ts +284 -0
- package/src/app/api/auth/reset-password/route.ts +251 -0
- package/src/app/api/auth/verify-email/route.ts +232 -0
- package/src/app/api/example-cors/route.ts +61 -0
- package/src/app/api/health/route.ts +14 -0
- package/src/app/api/invite/project/[token]/__tests__/accept-invitation.integration.test.ts +348 -0
- package/src/app/api/invite/project/[token]/decline/route.ts +99 -0
- package/src/app/api/invite/project/[token]/route.ts +269 -0
- package/src/app/api/issues/[issueId]/activities/route.ts +213 -0
- package/src/app/api/issues/[issueId]/attachments/[attachmentId]/annotations/[annotationId]/comments/[commentId]/route.ts +486 -0
- package/src/app/api/issues/[issueId]/attachments/[attachmentId]/annotations/[annotationId]/comments/route.ts +283 -0
- package/src/app/api/issues/[issueId]/attachments/[attachmentId]/annotations/[annotationId]/read/route.ts +242 -0
- package/src/app/api/issues/[issueId]/attachments/[attachmentId]/annotations/[annotationId]/route.ts +534 -0
- package/src/app/api/issues/[issueId]/attachments/[attachmentId]/annotations/route.ts +514 -0
- package/src/app/api/issues/[issueId]/attachments/[attachmentId]/route.ts +161 -0
- package/src/app/api/issues/[issueId]/attachments/route.ts +376 -0
- package/src/app/api/issues/[issueId]/route.ts +516 -0
- package/src/app/api/notifications/[id]/read/route.ts +131 -0
- package/src/app/api/notifications/__tests__/notifications.integration.test.ts +350 -0
- package/src/app/api/notifications/read-all/route.ts +72 -0
- package/src/app/api/notifications/route.ts +148 -0
- package/src/app/api/notifications/unread-count/route.ts +77 -0
- package/src/app/api/projects/[id]/activities/route.ts +174 -0
- package/src/app/api/projects/[id]/invitations/[invitationId]/resend/route.ts +99 -0
- package/src/app/api/projects/[id]/invitations/[invitationId]/route.ts +96 -0
- package/src/app/api/projects/[id]/invitations/route.ts +254 -0
- package/src/app/api/projects/[id]/issues/route.ts +452 -0
- package/src/app/api/projects/[id]/join/route.ts +207 -0
- package/src/app/api/projects/[id]/members/[memberId]/route.ts +364 -0
- package/src/app/api/projects/[id]/members/me/route.ts +121 -0
- package/src/app/api/projects/[id]/members/route.ts +129 -0
- package/src/app/api/projects/[id]/route.ts +476 -0
- package/src/app/api/projects/route.ts +394 -0
- package/src/app/api/setup/admin/route.ts +255 -0
- package/src/app/api/setup/complete/__tests__/route.test.ts +60 -0
- package/src/app/api/setup/complete/route.ts +244 -0
- package/src/app/api/setup/config/route.ts +195 -0
- package/src/app/api/setup/export/route.ts +111 -0
- package/src/app/api/setup/health/route.ts +74 -0
- package/src/app/api/setup/import/route.ts +154 -0
- package/src/app/api/setup/status/route.ts +82 -0
- package/src/app/api/setup/workspace/route.ts +252 -0
- package/src/app/api/teams/[teamId]/export/route.ts +115 -0
- package/src/app/api/teams/[teamId]/invitations/[invitationId]/resend/route.ts +132 -0
- package/src/app/api/teams/[teamId]/invitations/[invitationId]/route.ts +117 -0
- package/src/app/api/teams/[teamId]/invitations/route.ts +363 -0
- package/src/app/api/teams/[teamId]/members/[userId]/route.ts +335 -0
- package/src/app/api/teams/[teamId]/members/route.ts +184 -0
- package/src/app/api/teams/[teamId]/members/search/route.ts +202 -0
- package/src/app/api/teams/[teamId]/route.ts +423 -0
- package/src/app/api/teams/[teamId]/switch/route.ts +140 -0
- package/src/app/api/teams/[teamId]/transfer-ownership/route.ts +212 -0
- package/src/app/api/teams/invitations/[token]/accept/route.ts +140 -0
- package/src/app/api/teams/invitations/by-id/[id]/accept/route.ts +98 -0
- package/src/app/api/teams/invitations/by-id/[id]/decline/route.ts +90 -0
- package/src/app/api/teams/route.ts +278 -0
- package/src/app/api/uploads/media/route.ts +118 -0
- package/src/app/api/uploads/presigned/route.ts +49 -0
- package/src/app/api/user/linked-accounts/route.ts +35 -0
- package/src/app/email-preview/page.tsx +11 -0
- package/src/app/favicon.ico +0 -0
- package/src/app/global-error.tsx +21 -0
- package/src/app/layout.tsx +50 -0
- package/src/app/page.tsx +5 -0
- package/src/components/icons/atlassian-icon.tsx +22 -0
- package/src/components/icons/index.ts +1 -0
- package/src/components/layout/SIDEBAR_LAYOUT_BEST_PRACTICES.md +240 -0
- package/src/components/layout/app-shell-header-store.tsx +20 -0
- package/src/components/layout/app-shell-skeleton.tsx +89 -0
- package/src/components/layout/app-shell-wrapper.tsx +32 -0
- package/src/components/layout/app-shell.test.tsx +155 -0
- package/src/components/layout/app-shell.tsx +100 -0
- package/src/components/shared/headers/app-header-configurator.tsx +42 -0
- package/src/components/shared/headers/app-header.tsx +103 -0
- package/src/components/shared/headers/header-user-menu.tsx +247 -0
- package/src/components/shared/headers/index.ts +44 -0
- package/src/components/shared/headers/page-header.tsx +25 -0
- package/src/components/shared/notifications/__tests__/notification-bell.test.tsx +159 -0
- package/src/components/shared/notifications/__tests__/notification-dropdown.test.tsx +296 -0
- package/src/components/shared/notifications/__tests__/notification-item.test.tsx +328 -0
- package/src/components/shared/notifications/index.ts +45 -0
- package/src/components/shared/notifications/notification-actions.tsx +295 -0
- package/src/components/shared/notifications/notification-bell-button.tsx +77 -0
- package/src/components/shared/notifications/notification-dropdown.tsx +160 -0
- package/src/components/shared/notifications/notification-group-item.tsx +268 -0
- package/src/components/shared/notifications/notification-item.tsx +193 -0
- package/src/components/shared/notifications/notification-load-more.tsx +50 -0
- package/src/components/shared/notifications/notification-panel.tsx +49 -0
- package/src/components/shared/notifications/utils.tsx +127 -0
- package/src/components/shared/permission-guard/index.ts +1 -0
- package/src/components/shared/permission-guard/permission-tooltip.tsx +45 -0
- package/src/components/shared/relative-time.tsx +53 -0
- package/src/components/shared/section-container.tsx +32 -0
- package/src/components/shared/service-status-banner.tsx +121 -0
- package/src/components/shared/settings-sidebar/index.ts +2 -0
- package/src/components/shared/settings-sidebar/team-setting-aside.tsx +97 -0
- package/src/components/shared/settings-sidebar/user-settings-aside.tsx +66 -0
- package/src/components/shared/sidebar/app-sidebar.tsx +146 -0
- package/src/components/shared/sidebar/index.ts +36 -0
- package/src/components/shared/sidebar/sidebar-main.tsx +81 -0
- package/src/components/shared/sidebar/sidebar-project.tsx +61 -0
- package/src/components/shared/sidebar/sidebar-team-avatar.tsx +126 -0
- package/src/components/shared/sidebar/sidebar-team-switcher.tsx +185 -0
- package/src/components/shared/sidebar/type.ts +97 -0
- package/src/components/ui/alert-dialog.tsx +157 -0
- package/src/components/ui/alert.tsx +66 -0
- package/src/components/ui/avatar-upload.tsx +147 -0
- package/src/components/ui/avatar.tsx +53 -0
- package/src/components/ui/badge.tsx +46 -0
- package/src/components/ui/breadcrumb.tsx +109 -0
- package/src/components/ui/button.tsx +60 -0
- package/src/components/ui/card.tsx +92 -0
- package/src/components/ui/checkbox.tsx +32 -0
- package/src/components/ui/collapsible.tsx +33 -0
- package/src/components/ui/command.tsx +184 -0
- package/src/components/ui/dialog.tsx +143 -0
- package/src/components/ui/dropdown-menu.tsx +257 -0
- package/src/components/ui/empty.tsx +104 -0
- package/src/components/ui/field.tsx +244 -0
- package/src/components/ui/image-cropper-dialog.tsx +167 -0
- package/src/components/ui/input.tsx +21 -0
- package/src/components/ui/label.tsx +24 -0
- package/src/components/ui/optimized-image.tsx +220 -0
- package/src/components/ui/pagination.tsx +127 -0
- package/src/components/ui/popover.tsx +48 -0
- package/src/components/ui/progress.tsx +31 -0
- package/src/components/ui/radio-group.tsx +45 -0
- package/src/components/ui/scroll-area.tsx +58 -0
- package/src/components/ui/select.tsx +187 -0
- package/src/components/ui/separator.tsx +28 -0
- package/src/components/ui/sheet.tsx +139 -0
- package/src/components/ui/sidebar.tsx +733 -0
- package/src/components/ui/skeleton.tsx +13 -0
- package/src/components/ui/sonner.tsx +40 -0
- package/src/components/ui/spinner.tsx +16 -0
- package/src/components/ui/switch.tsx +31 -0
- package/src/components/ui/table.tsx +116 -0
- package/src/components/ui/tabs.tsx +66 -0
- package/src/components/ui/textarea.tsx +23 -0
- package/src/components/ui/tooltip.tsx +61 -0
- package/src/config/__tests__/workspace.property.test.ts +40 -0
- package/src/config/auth.ts +62 -0
- package/src/config/integrations.ts +126 -0
- package/src/config/quotas.ts +20 -0
- package/src/config/roles.ts +463 -0
- package/src/config/settings-nav.ts +39 -0
- package/src/config/team-settings-nav.ts +37 -0
- package/src/config/user-settings-nav.ts +42 -0
- package/src/config/version.ts +1 -0
- package/src/config/workspace.ts +64 -0
- package/src/features/annotations/README.md +283 -0
- package/src/features/annotations/api/annotations-api.ts +194 -0
- package/src/features/annotations/api/comments-api.ts +147 -0
- package/src/features/annotations/api/index.ts +71 -0
- package/src/features/annotations/api/save-annotation.ts +150 -0
- package/src/features/annotations/api/schemas.ts +142 -0
- package/src/features/annotations/components/annotated-attachment-view.tsx +576 -0
- package/src/features/annotations/components/annotation-action-sheet.tsx +140 -0
- package/src/features/annotations/components/annotation-annotations-panel.tsx +213 -0
- package/src/features/annotations/components/annotation-box.tsx +539 -0
- package/src/features/annotations/components/annotation-canvas.tsx +534 -0
- package/src/features/annotations/components/annotation-comment-input.tsx +145 -0
- package/src/features/annotations/components/annotation-context-menu.tsx +164 -0
- package/src/features/annotations/components/annotation-drawer.tsx +231 -0
- package/src/features/annotations/components/annotation-layer.tsx +271 -0
- package/src/features/annotations/components/annotation-pin.tsx +318 -0
- package/src/features/annotations/components/annotation-popover.tsx +562 -0
- package/src/features/annotations/components/annotation-thread-panel.tsx +485 -0
- package/src/features/annotations/components/annotation-thread-preview.tsx +195 -0
- package/src/features/annotations/components/annotation-toolbar.tsx +244 -0
- package/src/features/annotations/components/keyboard-shortcuts-modal.tsx +79 -0
- package/src/features/annotations/docs/ANNOTATIONS_ARCHITECTURE.md +67 -0
- package/src/features/annotations/docs/ANNOTATION_SAVE_ARCHITECTURE.md +422 -0
- package/src/features/annotations/docs/ANNOTATION_SAVE_FEATURE.md +408 -0
- package/src/features/annotations/docs/BOX_ANNOTATION_GUIDE.md +542 -0
- package/src/features/annotations/docs/NEXTSTEP.md +28 -0
- package/src/features/annotations/docs/STALE_CLOSURE_FIX.md +344 -0
- package/src/features/annotations/docs/UNDO_REDO_QUICK_START.md +545 -0
- package/src/features/annotations/docs/local_first_canvas_autosave_architecture.md +674 -0
- package/src/features/annotations/examples/complete-example.tsx +266 -0
- package/src/features/annotations/examples/save-annotation-example.tsx +309 -0
- package/src/features/annotations/hooks/__tests__/use-annotation-permissions.property.test.tsx +493 -0
- package/src/features/annotations/hooks/index.ts +36 -0
- package/src/features/annotations/hooks/use-annotation-batch-save.ts +109 -0
- package/src/features/annotations/hooks/use-annotation-comments.ts +353 -0
- package/src/features/annotations/hooks/use-annotation-drafts.ts +137 -0
- package/src/features/annotations/hooks/use-annotation-edit-state.ts +99 -0
- package/src/features/annotations/hooks/use-annotation-history-tracker.ts +159 -0
- package/src/features/annotations/hooks/use-annotation-integration.ts +916 -0
- package/src/features/annotations/hooks/use-annotation-permissions.ts +210 -0
- package/src/features/annotations/hooks/use-annotation-popover.ts +175 -0
- package/src/features/annotations/hooks/use-annotation-save.ts +208 -0
- package/src/features/annotations/hooks/use-annotation-tools.ts +237 -0
- package/src/features/annotations/hooks/use-annotations-with-history.ts +332 -0
- package/src/features/annotations/hooks/use-auto-save.ts +94 -0
- package/src/features/annotations/index.ts +111 -0
- package/src/features/annotations/types/annotation.ts +201 -0
- package/src/features/annotations/types/index.ts +28 -0
- package/src/features/annotations/utils/history-manager.ts +73 -0
- package/src/features/annotations/utils/index.ts +2 -0
- package/src/features/annotations/utils/map-attachments-to-threads.ts +28 -0
- package/src/features/annotations/utils/position-comment-input.ts +136 -0
- package/src/features/annotations/utils/re-sequence-labels.ts +92 -0
- package/src/features/annotations/utils/validate-annotation-label.ts +120 -0
- package/src/features/auth/api/types.ts +101 -0
- package/src/features/auth/components/__tests__/role-gate.test.tsx +448 -0
- package/src/features/auth/components/__tests__/social-login-buttons.test.tsx +313 -0
- package/src/features/auth/components/auth-card.tsx +36 -0
- package/src/features/auth/components/forgot-password-form.tsx +115 -0
- package/src/features/auth/components/index.ts +14 -0
- package/src/features/auth/components/invite-code-input.tsx +155 -0
- package/src/features/auth/components/invited-user-form.tsx +309 -0
- package/src/features/auth/components/onboarding-form.tsx +195 -0
- package/src/features/auth/components/password-strength-indicator.tsx +113 -0
- package/src/features/auth/components/reset-password-form.tsx +138 -0
- package/src/features/auth/components/role-gate.tsx +124 -0
- package/src/features/auth/components/self-registration-choice.tsx +153 -0
- package/src/features/auth/components/sign-in-form.tsx +159 -0
- package/src/features/auth/components/sign-up-form.tsx +158 -0
- package/src/features/auth/components/social-login-buttons.tsx +219 -0
- package/src/features/auth/hooks/__tests__/use-onboarding.test.tsx +109 -0
- package/src/features/auth/hooks/__tests__/use-session.test.tsx +160 -0
- package/src/features/auth/hooks/index.ts +15 -0
- package/src/features/auth/hooks/use-accept-invitation.ts +194 -0
- package/src/features/auth/hooks/use-delete-account.ts +86 -0
- package/src/features/auth/hooks/use-force-verify.ts +89 -0
- package/src/features/auth/hooks/use-forgot-password.ts +144 -0
- package/src/features/auth/hooks/use-link-account.ts +78 -0
- package/src/features/auth/hooks/use-linked-accounts.ts +88 -0
- package/src/features/auth/hooks/use-onboarding.ts +159 -0
- package/src/features/auth/hooks/use-resend-verification.ts +139 -0
- package/src/features/auth/hooks/use-reset-password.ts +151 -0
- package/src/features/auth/hooks/use-reset-rate-limit.ts +56 -0
- package/src/features/auth/hooks/use-self-registration.ts +202 -0
- package/src/features/auth/hooks/use-session.ts +81 -0
- package/src/features/auth/hooks/use-sessions.ts +59 -0
- package/src/features/auth/hooks/use-sign-in.ts +234 -0
- package/src/features/auth/hooks/use-sign-out.ts +88 -0
- package/src/features/auth/hooks/use-sign-up.ts +194 -0
- package/src/features/auth/hooks/use-unlink-account.ts +100 -0
- package/src/features/auth/hooks/use-verify-email-token.ts +125 -0
- package/src/features/auth/index.ts +75 -0
- package/src/features/auth/screens/forgot-password-screen.tsx +33 -0
- package/src/features/auth/screens/index.ts +7 -0
- package/src/features/auth/screens/onboarding-screen.tsx +49 -0
- package/src/features/auth/screens/reset-password-screen.tsx +33 -0
- package/src/features/auth/screens/sign-in-screen.tsx +61 -0
- package/src/features/auth/screens/sign-up-screen.tsx +37 -0
- package/src/features/auth/screens/verify-email-confirm-screen.tsx +286 -0
- package/src/features/auth/screens/verify-email-screen.tsx +146 -0
- package/src/features/auth/types/index.ts +14 -0
- package/src/features/auth/utils/__tests__/validators.test.ts +331 -0
- package/src/features/auth/utils/password-strength.ts +129 -0
- package/src/features/auth/utils/validators.ts +124 -0
- package/src/features/email-preview/actions/render-email.ts +21 -0
- package/src/features/email-preview/screens/email-preview-screen.tsx +81 -0
- package/src/features/folder-scaffold-template/index.ts +0 -0
- package/src/features/instance-settings/components/index.ts +6 -0
- package/src/features/instance-settings/components/instance-settings-form.tsx +180 -0
- package/src/features/instance-settings/components/instance-status-display.tsx +158 -0
- package/src/features/instance-settings/index.ts +7 -0
- package/src/features/instance-settings/screens/index.ts +5 -0
- package/src/features/instance-settings/screens/instance-settings-screen.tsx +59 -0
- package/src/features/issues/README.md +330 -0
- package/src/features/issues/api/create-issue.ts +19 -0
- package/src/features/issues/api/delete-issue.ts +27 -0
- package/src/features/issues/api/get-issue-activities.ts +58 -0
- package/src/features/issues/api/get-issue-details.ts +25 -0
- package/src/features/issues/api/get-project-issues-server.ts +44 -0
- package/src/features/issues/api/get-project-issues.ts +21 -0
- package/src/features/issues/api/index.ts +44 -0
- package/src/features/issues/api/update-issue.ts +31 -0
- package/src/features/issues/api/upload-attachment.ts +81 -0
- package/src/features/issues/components/activity-timeline.tsx +440 -0
- package/src/features/issues/components/canvas-state-indicator.tsx +90 -0
- package/src/features/issues/components/centered-canvas-view.tsx +739 -0
- package/src/features/issues/components/image-selector.tsx +123 -0
- package/src/features/issues/components/image-upload-zone.tsx +262 -0
- package/src/features/issues/components/infinite-canvas-background.tsx +163 -0
- package/src/features/issues/components/inline-editable-select.tsx +173 -0
- package/src/features/issues/components/inline-editable-text.tsx +225 -0
- package/src/features/issues/components/inline-editable-textarea.tsx +219 -0
- package/src/features/issues/components/inline-editable-user-select.tsx +202 -0
- package/src/features/issues/components/issue-deletion-dialog.tsx +142 -0
- package/src/features/issues/components/issue-details-panel.tsx +101 -0
- package/src/features/issues/components/issues-create-dialog.tsx +578 -0
- package/src/features/issues/components/issues-list-filter.tsx +312 -0
- package/src/features/issues/components/issues-list.tsx +151 -0
- package/src/features/issues/components/issues-priority-badge.tsx +77 -0
- package/src/features/issues/components/issues-status-badge.tsx +100 -0
- package/src/features/issues/components/metadata-section.tsx +389 -0
- package/src/features/issues/components/optimized-attachment-view.tsx +528 -0
- package/src/features/issues/components/optimized-image.tsx +257 -0
- package/src/features/issues/components/panel-header.tsx +186 -0
- package/src/features/issues/components/preload.ts +31 -0
- package/src/features/issues/components/priority-selector.tsx +101 -0
- package/src/features/issues/components/responsive-issue-layout-skeleton.tsx +139 -0
- package/src/features/issues/components/responsive-issue-layout.tsx +617 -0
- package/src/features/issues/components/status-selector.tsx +320 -0
- package/src/features/issues/components/type-selector.tsx +102 -0
- package/src/features/issues/components/upload-progress-overlay.tsx +35 -0
- package/src/features/issues/components/uploaded-image-preview.tsx +173 -0
- package/src/features/issues/components/workflow-control.tsx +318 -0
- package/src/features/issues/components/zoom-controls.tsx +150 -0
- package/src/features/issues/config/index.ts +47 -0
- package/src/features/issues/config/options.ts +323 -0
- package/src/features/issues/config/workflow.ts +102 -0
- package/src/features/issues/docs/ARCHITECTURE_DIAGRAM.md +321 -0
- package/src/features/issues/docs/BACKEND_ARCHITECTURE.md +194 -0
- package/src/features/issues/docs/IMAGE_COMPONENTS_ARCHITECTURE.md +363 -0
- package/src/features/issues/docs/IMAGE_COMPONENTS_IMPORTS.md +412 -0
- package/src/features/issues/docs/IMPLEMENTATION_CHECKLIST.md +210 -0
- package/src/features/issues/docs/ROUTE_SETUP_COMPLETE.md +242 -0
- package/src/features/issues/hooks/index.ts +78 -0
- package/src/features/issues/hooks/use-canvas-transform.ts +255 -0
- package/src/features/issues/hooks/use-create-issue.ts +28 -0
- package/src/features/issues/hooks/use-elastic-scroll.ts +296 -0
- package/src/features/issues/hooks/use-issue-activities.ts +71 -0
- package/src/features/issues/hooks/use-issue-delete.ts +84 -0
- package/src/features/issues/hooks/use-issue-details.ts +70 -0
- package/src/features/issues/hooks/use-issue-filters.ts +50 -0
- package/src/features/issues/hooks/use-issue-update.ts +93 -0
- package/src/features/issues/hooks/use-keyboard-shortcuts.ts +104 -0
- package/src/features/issues/hooks/use-optimized-image.ts +228 -0
- package/src/features/issues/hooks/use-project-issues.ts +14 -0
- package/src/features/issues/index.ts +65 -0
- package/src/features/issues/screens/issue-details-screen.tsx +207 -0
- package/src/features/issues/screens/issue-details-skeletons.tsx +295 -0
- package/src/features/issues/screens/issue-share-screen.tsx +56 -0
- package/src/features/issues/types/index.ts +48 -0
- package/src/features/issues/types/issue.ts +291 -0
- package/src/features/issues/utils/filter-issues.ts +141 -0
- package/src/features/issues/utils/index.ts +14 -0
- package/src/features/legal/index.ts +1 -0
- package/src/features/legal/screens/privacy-policy-screen.tsx +307 -0
- package/src/features/notifications/api/get-notifications.ts +58 -0
- package/src/features/notifications/api/get-unread-count.ts +37 -0
- package/src/features/notifications/api/index.ts +35 -0
- package/src/features/notifications/api/mark-all-as-read.ts +37 -0
- package/src/features/notifications/api/mark-as-read.ts +41 -0
- package/src/features/notifications/api/types.ts +109 -0
- package/src/features/notifications/hooks/__tests__/use-notification-subscription.test.ts +206 -0
- package/src/features/notifications/hooks/index.ts +28 -0
- package/src/features/notifications/hooks/use-mark-all-as-read.ts +106 -0
- package/src/features/notifications/hooks/use-mark-as-read.ts +106 -0
- package/src/features/notifications/hooks/use-notification-subscription.ts +244 -0
- package/src/features/notifications/hooks/use-notification-toast.ts +161 -0
- package/src/features/notifications/hooks/use-notifications.ts +80 -0
- package/src/features/notifications/hooks/use-unread-count.ts +60 -0
- package/src/features/notifications/index.ts +48 -0
- package/src/features/notifications/utils/group-notifications.ts +152 -0
- package/src/features/notifications/utils/index.ts +9 -0
- package/src/features/projects/api/create-invitation.ts +45 -0
- package/src/features/projects/api/create-project.ts +64 -0
- package/src/features/projects/api/delete-project.ts +50 -0
- package/src/features/projects/api/get-project-activities.ts +43 -0
- package/src/features/projects/api/get-project-members.ts +53 -0
- package/src/features/projects/api/get-project.ts +49 -0
- package/src/features/projects/api/get-projects.ts +61 -0
- package/src/features/projects/api/index.ts +27 -0
- package/src/features/projects/api/join-project.ts +52 -0
- package/src/features/projects/api/leave-project.ts +51 -0
- package/src/features/projects/api/list-invitations.ts +36 -0
- package/src/features/projects/api/remove-member.ts +60 -0
- package/src/features/projects/api/resend-invitation.ts +36 -0
- package/src/features/projects/api/revoke-invitation.ts +36 -0
- package/src/features/projects/api/types.ts +286 -0
- package/src/features/projects/api/update-member-role.ts +70 -0
- package/src/features/projects/api/update-project.ts +69 -0
- package/src/features/projects/components/__tests__/project-detail-activity-feed.test.tsx +106 -0
- package/src/features/projects/components/__tests__/project-invitation-dialog.test.tsx +211 -0
- package/src/features/projects/components/__tests__/project-member-manager-dialog.test.tsx +254 -0
- package/src/features/projects/components/index.ts +21 -0
- package/src/features/projects/components/project-actions.tsx +248 -0
- package/src/features/projects/components/project-create-dialog.tsx +410 -0
- package/src/features/projects/components/project-detail-activity-feed.tsx +206 -0
- package/src/features/projects/components/project-detail-header.tsx +103 -0
- package/src/features/projects/components/project-detail-overview.tsx +128 -0
- package/src/features/projects/components/project-icon-selector.test.tsx +49 -0
- package/src/features/projects/components/project-icon-selector.tsx +76 -0
- package/src/features/projects/components/project-invitation-dialog.tsx +368 -0
- package/src/features/projects/components/project-issues.tsx +128 -0
- package/src/features/projects/components/project-leave-button.tsx +69 -0
- package/src/features/projects/components/project-list-card.tsx +246 -0
- package/src/features/projects/components/project-list-filters.tsx +320 -0
- package/src/features/projects/components/project-member-manager-dialog.tsx +419 -0
- package/src/features/projects/components/project-settings-dialog.tsx +204 -0
- package/src/features/projects/components/project-stats.tsx +46 -0
- package/src/features/projects/components/project-title-section.tsx +78 -0
- package/src/features/projects/config/icons.ts +91 -0
- package/src/features/projects/hooks/index.ts +28 -0
- package/src/features/projects/hooks/use-create-invitation.ts +83 -0
- package/src/features/projects/hooks/use-create-project.ts +77 -0
- package/src/features/projects/hooks/use-delete-project.ts +84 -0
- package/src/features/projects/hooks/use-join-project.ts +43 -0
- package/src/features/projects/hooks/use-leave-project.ts +84 -0
- package/src/features/projects/hooks/use-project-activities.ts +39 -0
- package/src/features/projects/hooks/use-project-filters.ts +86 -0
- package/src/features/projects/hooks/use-project-invitations.ts +66 -0
- package/src/features/projects/hooks/use-project-members.ts +57 -0
- package/src/features/projects/hooks/use-project.ts +67 -0
- package/src/features/projects/hooks/use-projects.ts +49 -0
- package/src/features/projects/hooks/use-recent-projects.ts +58 -0
- package/src/features/projects/hooks/use-remove-member.ts +89 -0
- package/src/features/projects/hooks/use-resend-invitation.ts +68 -0
- package/src/features/projects/hooks/use-revoke-invitation.ts +71 -0
- package/src/features/projects/hooks/use-team-member-suggestions.ts +133 -0
- package/src/features/projects/hooks/use-update-member-role.ts +92 -0
- package/src/features/projects/hooks/use-update-project.ts +88 -0
- package/src/features/projects/index.ts +91 -0
- package/src/features/projects/screens/index.ts +3 -0
- package/src/features/projects/screens/invitation-acceptance-screen.tsx +320 -0
- package/src/features/projects/screens/project-detail-screen-wrapper.tsx +47 -0
- package/src/features/projects/screens/project-detail-screen.tsx +661 -0
- package/src/features/projects/screens/projects-list-screen.tsx +161 -0
- package/src/features/projects/types/index.ts +59 -0
- package/src/features/projects/utils/format-helpers.ts +16 -0
- package/src/features/projects/utils/index.ts +2 -0
- package/src/features/projects/utils/role-helpers.ts +25 -0
- package/src/features/setup/api/complete-setup.ts +21 -0
- package/src/features/setup/api/create-admin.ts +21 -0
- package/src/features/setup/api/create-first-workspace.ts +21 -0
- package/src/features/setup/api/get-instance-status.ts +12 -0
- package/src/features/setup/api/get-service-health.ts +12 -0
- package/src/features/setup/api/index.ts +44 -0
- package/src/features/setup/api/save-instance-config.ts +21 -0
- package/src/features/setup/api/types.ts +122 -0
- package/src/features/setup/components/__tests__/setup-wizard-ui.test.tsx +362 -0
- package/src/features/setup/components/admin-account-step.tsx +205 -0
- package/src/features/setup/components/first-workspace-step.tsx +120 -0
- package/src/features/setup/components/index.ts +9 -0
- package/src/features/setup/components/instance-config-step.tsx +107 -0
- package/src/features/setup/components/mail-config-step.tsx +205 -0
- package/src/features/setup/components/sample-data-step.tsx +131 -0
- package/src/features/setup/components/service-health-step.tsx +180 -0
- package/src/features/setup/components/service-status-badge.tsx +50 -0
- package/src/features/setup/components/setup-progress.tsx +103 -0
- package/src/features/setup/components/setup-wizard.tsx +169 -0
- package/src/features/setup/hooks/index.ts +12 -0
- package/src/features/setup/hooks/use-complete-setup.ts +23 -0
- package/src/features/setup/hooks/use-create-admin.ts +25 -0
- package/src/features/setup/hooks/use-create-first-workspace.ts +24 -0
- package/src/features/setup/hooks/use-instance-status.ts +21 -0
- package/src/features/setup/hooks/use-save-instance-config.ts +23 -0
- package/src/features/setup/hooks/use-service-health.ts +21 -0
- package/src/features/setup/hooks/use-setup-wizard.ts +152 -0
- package/src/features/setup/hooks/use-workspace-mode.ts +19 -0
- package/src/features/setup/index.ts +30 -0
- package/src/features/setup/screens/index.ts +1 -0
- package/src/features/setup/screens/setup-screen.tsx +40 -0
- package/src/features/setup/types/index.ts +69 -0
- package/src/features/setup/utils/index.ts +78 -0
- package/src/features/team-settings/components/index.ts +39 -0
- package/src/features/team-settings/components/loading-states.tsx +296 -0
- package/src/features/team-settings/components/permission-guard.tsx +23 -0
- package/src/features/team-settings/components/settings-card.tsx +22 -0
- package/src/features/team-settings/components/settings-context-provider.tsx +51 -0
- package/src/features/team-settings/components/settings-error-boundary.tsx +366 -0
- package/src/features/team-settings/components/settings-navigation.tsx +87 -0
- package/src/features/team-settings/components/settings-section.tsx +23 -0
- package/src/features/team-settings/components/team-danger-zone.tsx +275 -0
- package/src/features/team-settings/components/team-information-form.tsx +116 -0
- package/src/features/team-settings/components/team-invitations-list.tsx +463 -0
- package/src/features/team-settings/components/team-members-list.tsx +342 -0
- package/src/features/team-settings/components/team-permission-guard.tsx +56 -0
- package/src/features/team-settings/components/team-setting-integrations.tsx +27 -0
- package/src/features/team-settings/components/team-setting-member.tsx +28 -0
- package/src/features/team-settings/components/team-settings-general.tsx +131 -0
- package/src/features/team-settings/components/transfer-ownership-modal.tsx +164 -0
- package/src/features/team-settings/components/unauthorized-access.tsx +52 -0
- package/src/features/team-settings/hooks/__tests__/use-team-settings.test.tsx +139 -0
- package/src/features/team-settings/hooks/index.ts +1 -0
- package/src/features/team-settings/hooks/use-team-settings.ts +148 -0
- package/src/features/team-settings/hooks/use-transfer-ownership.ts +45 -0
- package/src/features/team-settings/index.ts +25 -0
- package/src/features/team-settings/screens/index.ts +1 -0
- package/src/features/team-settings/screens/team-settings-screen.tsx +33 -0
- package/src/features/team-settings/types/index.ts +78 -0
- package/src/features/team-settings/utils/index.ts +6 -0
- package/src/features/team-settings/utils/mock-data.ts +40 -0
- package/src/features/teams/api/cancel-invitation.ts +25 -0
- package/src/features/teams/api/create-invitation.ts +28 -0
- package/src/features/teams/api/create-team.ts +14 -0
- package/src/features/teams/api/delete-team.ts +19 -0
- package/src/features/teams/api/get-invitations.ts +25 -0
- package/src/features/teams/api/get-team-members.ts +25 -0
- package/src/features/teams/api/get-team.ts +13 -0
- package/src/features/teams/api/get-teams.ts +19 -0
- package/src/features/teams/api/index.ts +49 -0
- package/src/features/teams/api/leave-team.ts +22 -0
- package/src/features/teams/api/remove-member.ts +25 -0
- package/src/features/teams/api/resend-invitation.ts +26 -0
- package/src/features/teams/api/switch-team.ts +13 -0
- package/src/features/teams/api/types.ts +122 -0
- package/src/features/teams/api/update-member-roles.ts +28 -0
- package/src/features/teams/api/update-team.ts +17 -0
- package/src/features/teams/components/create-team-dialog.tsx +105 -0
- package/src/features/teams/hooks/__tests__/cache-invalidation.property.test.tsx +268 -0
- package/src/features/teams/hooks/index.ts +35 -0
- package/src/features/teams/hooks/use-can-manage-members.ts +21 -0
- package/src/features/teams/hooks/use-can-manage-team.ts +21 -0
- package/src/features/teams/hooks/use-cancel-invitation.ts +52 -0
- package/src/features/teams/hooks/use-create-invitation.ts +59 -0
- package/src/features/teams/hooks/use-create-team.ts +38 -0
- package/src/features/teams/hooks/use-delete-team.ts +43 -0
- package/src/features/teams/hooks/use-invitations.ts +31 -0
- package/src/features/teams/hooks/use-leave-team.ts +43 -0
- package/src/features/teams/hooks/use-remove-member.ts +58 -0
- package/src/features/teams/hooks/use-resend-invitation.ts +52 -0
- package/src/features/teams/hooks/use-switch-team.ts +41 -0
- package/src/features/teams/hooks/use-team-members.ts +31 -0
- package/src/features/teams/hooks/use-team-permissions.ts +102 -0
- package/src/features/teams/hooks/use-team.ts +30 -0
- package/src/features/teams/hooks/use-teams.ts +26 -0
- package/src/features/teams/hooks/use-update-member-roles.ts +64 -0
- package/src/features/teams/hooks/use-update-team.ts +47 -0
- package/src/features/teams/index.ts +111 -0
- package/src/features/user-settings/actions/set-password.ts +63 -0
- package/src/features/user-settings/api/index.ts +16 -0
- package/src/features/user-settings/components/__tests__/security-settings.test.tsx +125 -0
- package/src/features/user-settings/components/delete-account-dialog.tsx +185 -0
- package/src/features/user-settings/components/index.ts +13 -0
- package/src/features/user-settings/components/integrations-list.tsx +152 -0
- package/src/features/user-settings/components/notification-preferences.tsx +112 -0
- package/src/features/user-settings/components/other-settings.tsx +126 -0
- package/src/features/user-settings/components/password-section.tsx +297 -0
- package/src/features/user-settings/components/security-settings.tsx +184 -0
- package/src/features/user-settings/components/user-preferences.tsx +146 -0
- package/src/features/user-settings/hooks/index.ts +8 -0
- package/src/features/user-settings/hooks/use-notification-preferences.ts +65 -0
- package/src/features/user-settings/hooks/use-user-preferences.ts +52 -0
- package/src/features/user-settings/index.ts +22 -0
- package/src/features/user-settings/screens/index.ts +11 -0
- package/src/features/user-settings/screens/integrations-screen.tsx +24 -0
- package/src/features/user-settings/screens/notifications-screen.tsx +29 -0
- package/src/features/user-settings/screens/other-settings-screen.tsx +24 -0
- package/src/features/user-settings/screens/setting-preferences-screen.tsx +24 -0
- package/src/features/user-settings/screens/user-settings-screen.tsx +23 -0
- package/src/features/user-settings/types/index.ts +42 -0
- package/src/features/user-settings/utils/index.ts +8 -0
- package/src/hooks/use-long-press.ts +196 -0
- package/src/hooks/use-media-upload.ts +95 -0
- package/src/hooks/use-mobile.ts +19 -0
- package/src/hooks/use-team.ts +32 -0
- package/src/instrumentation.ts +14 -0
- package/src/lib/__tests__/auth-config.test.ts +166 -0
- package/src/lib/__tests__/config.test.ts +42 -0
- package/src/lib/__tests__/db.test.ts +101 -0
- package/src/lib/__tests__/env.property.test.ts +197 -0
- package/src/lib/__tests__/env.test.ts +177 -0
- package/src/lib/__tests__/health-check.test.ts +87 -0
- package/src/lib/__tests__/oauth-errors.test.ts +184 -0
- package/src/lib/__tests__/oauth-redirect.test.ts +224 -0
- package/src/lib/__tests__/oauth-scopes.test.ts +268 -0
- package/src/lib/__tests__/storage.test.ts +58 -0
- package/src/lib/__tests__/url-validator.test.ts +232 -0
- package/src/lib/api-client.ts +93 -0
- package/src/lib/auth-client.ts +5 -0
- package/src/lib/auth-config.ts +146 -0
- package/src/lib/auth.ts +209 -0
- package/src/lib/config.ts +228 -0
- package/src/lib/cors.ts +96 -0
- package/src/lib/date.ts +16 -0
- package/src/lib/db.ts +88 -0
- package/src/lib/env.ts +489 -0
- package/src/lib/feedback.ts +29 -0
- package/src/lib/health-check.ts +229 -0
- package/src/lib/logger.ts +204 -0
- package/src/lib/oauth-errors.ts +138 -0
- package/src/lib/performance.ts +367 -0
- package/src/lib/query-server.ts +35 -0
- package/src/lib/query.tsx +43 -0
- package/src/lib/resend.ts +36 -0
- package/src/lib/security-headers.ts +165 -0
- package/src/lib/setup-status.ts +34 -0
- package/src/lib/storage.ts +150 -0
- package/src/lib/supabase-client.ts +58 -0
- package/src/lib/testing/test-db.ts +75 -0
- package/src/lib/url-validator.ts +168 -0
- package/src/lib/utils.ts +6 -0
- package/src/mocks/README.md +42 -0
- package/src/mocks/activity.fixtures.ts +281 -0
- package/src/mocks/annotation.fixtures.ts +325 -0
- package/src/mocks/attachment.fixtures.ts +80 -0
- package/src/mocks/email.fixtures.ts +61 -0
- package/src/mocks/index.ts +33 -0
- package/src/mocks/issue.fixtures.ts +364 -0
- package/src/mocks/landing.fixtures.ts +118 -0
- package/src/mocks/notification.fixtures.ts +111 -0
- package/src/mocks/project-activity.fixtures.ts +69 -0
- package/src/mocks/project-invitation.fixtures.ts +95 -0
- package/src/mocks/project-member.fixtures.ts +93 -0
- package/src/mocks/project.fixtures.ts +249 -0
- package/src/mocks/settings.fixtures.ts +56 -0
- package/src/mocks/share.fixtures.ts +48 -0
- package/src/mocks/team-member.fixtures.ts +147 -0
- package/src/mocks/team.fixtures.ts +35 -0
- package/src/mocks/user-settings.fixtures.ts +77 -0
- package/src/mocks/user.fixtures.ts +21 -0
- package/src/providers/theme-provider.tsx +11 -0
- package/src/proxy/__tests__/proxy-setup-gate.test.ts +43 -0
- package/src/proxy.ts +169 -0
- package/src/server/annotations/__tests__/annotation-limit.property.test.ts +291 -0
- package/src/server/annotations/__tests__/attachment-deletion-cascade.property.test.ts +385 -0
- package/src/server/annotations/__tests__/comment-delete-authorization.property.test.ts +419 -0
- package/src/server/annotations/__tests__/sanitize.property.test.ts +302 -0
- package/src/server/annotations/annotation-service.ts +305 -0
- package/src/server/annotations/comment-service.ts +288 -0
- package/src/server/annotations/index.ts +61 -0
- package/src/server/annotations/permission-utils.ts +125 -0
- package/src/server/annotations/sanitize.ts +134 -0
- package/src/server/annotations/types.ts +161 -0
- package/src/server/audit/audit-service.ts +85 -0
- package/src/server/audit/index.ts +11 -0
- package/src/server/audit/types.ts +75 -0
- package/src/server/auth/__tests__/README.md +368 -0
- package/src/server/auth/__tests__/account-linking.integration.test.ts +410 -0
- package/src/server/auth/__tests__/auth-integration.test.ts +811 -0
- package/src/server/auth/__tests__/cookies.test.ts +337 -0
- package/src/server/auth/__tests__/login.property.test.ts +428 -0
- package/src/server/auth/__tests__/oauth-integration.test.ts +555 -0
- package/src/server/auth/__tests__/password.test.ts +194 -0
- package/src/server/auth/__tests__/rate-limiter.test.ts +450 -0
- package/src/server/auth/__tests__/rbac.test.ts +474 -0
- package/src/server/auth/__tests__/session.test.ts +599 -0
- package/src/server/auth/__tests__/signup.property.test.ts +224 -0
- package/src/server/auth/__tests__/token-encryption.test.ts +171 -0
- package/src/server/auth/__tests__/tokens.test.ts +476 -0
- package/src/server/auth/__tests__/verify-email.property.test.ts +372 -0
- package/src/server/auth/cookies.ts +184 -0
- package/src/server/auth/password.ts +94 -0
- package/src/server/auth/rate-limiter.ts +257 -0
- package/src/server/auth/rbac.ts +1168 -0
- package/src/server/auth/session.ts +392 -0
- package/src/server/auth/token-encryption.ts +201 -0
- package/src/server/auth/tokens.ts +397 -0
- package/src/server/db/schema/account.ts +21 -0
- package/src/server/db/schema/annotation-read-status.ts +57 -0
- package/src/server/db/schema/better-auth-verifications.ts +27 -0
- package/src/server/db/schema/email-jobs.ts +24 -0
- package/src/server/db/schema/index.ts +20 -0
- package/src/server/db/schema/instance-settings.ts +42 -0
- package/src/server/db/schema/issue-activities.ts +97 -0
- package/src/server/db/schema/issue-attachments.ts +101 -0
- package/src/server/db/schema/issues.ts +139 -0
- package/src/server/db/schema/notifications.ts +119 -0
- package/src/server/db/schema/project-activities.ts +116 -0
- package/src/server/db/schema/project-invitations.ts +34 -0
- package/src/server/db/schema/project-members.ts +29 -0
- package/src/server/db/schema/projects.ts +46 -0
- package/src/server/db/schema/sessions.ts +17 -0
- package/src/server/db/schema/team-invitations.ts +22 -0
- package/src/server/db/schema/team-members.ts +18 -0
- package/src/server/db/schema/teams.ts +15 -0
- package/src/server/db/schema/user-roles.ts +14 -0
- package/src/server/db/schema/users.ts +17 -0
- package/src/server/db/schema/verification-tokens.ts +15 -0
- package/src/server/email/README.md +258 -0
- package/src/server/email/__tests__/client.property.test.ts +218 -0
- package/src/server/email/__tests__/payload.property.test.ts +205 -0
- package/src/server/email/__tests__/queue.test.ts +407 -0
- package/src/server/email/__tests__/render-template.test.tsx +172 -0
- package/src/server/email/client.ts +70 -0
- package/src/server/email/index.ts +20 -0
- package/src/server/email/providers/console-provider.ts +43 -0
- package/src/server/email/providers/index.ts +5 -0
- package/src/server/email/providers/resend-provider.ts +59 -0
- package/src/server/email/providers/smtp-provider.ts +65 -0
- package/src/server/email/queue.ts +365 -0
- package/src/server/email/render-template.tsx +117 -0
- package/src/server/email/templates/layout.tsx +66 -0
- package/src/server/email/templates/ownership-transfer-email.tsx +75 -0
- package/src/server/email/templates/password-reset-email.tsx +72 -0
- package/src/server/email/templates/project-invitation-email.tsx +70 -0
- package/src/server/email/templates/security-alert-email.tsx +161 -0
- package/src/server/email/templates/team-invitation-email.tsx +68 -0
- package/src/server/email/templates/verification-email.tsx +61 -0
- package/src/server/email/templates/welcome-email.tsx +60 -0
- package/src/server/email/worker.ts +182 -0
- package/src/server/issues/activity-service.ts +422 -0
- package/src/server/issues/attachment-service.ts +379 -0
- package/src/server/issues/index.ts +68 -0
- package/src/server/issues/issue-service.ts +569 -0
- package/src/server/issues/types.ts +233 -0
- package/src/server/notifications/__tests__/notification-service.integration.test.ts +405 -0
- package/src/server/notifications/index.ts +13 -0
- package/src/server/notifications/notification-service.ts +526 -0
- package/src/server/notifications/types.ts +234 -0
- package/src/server/projects/__tests__/activity-logging.integration.test.ts +319 -0
- package/src/server/projects/__tests__/invitation-email.integration.test.ts +258 -0
- package/src/server/projects/__tests__/invitation-service.integration.test.ts +651 -0
- package/src/server/projects/__tests__/member-service.property.test.ts +397 -0
- package/src/server/projects/__tests__/project-service.property.test.ts +116 -0
- package/src/server/projects/activity-service.ts +548 -0
- package/src/server/projects/index.ts +11 -0
- package/src/server/projects/invitation-service.ts +773 -0
- package/src/server/projects/member-service.ts +458 -0
- package/src/server/projects/project-service.ts +491 -0
- package/src/server/projects/schemas.ts +310 -0
- package/src/server/projects/types.ts +166 -0
- package/src/server/projects/utils.ts +128 -0
- package/src/server/setup/__tests__/health-check.property.test.ts +70 -0
- package/src/server/setup/__tests__/sample-data.property.test.ts +82 -0
- package/src/server/setup/__tests__/setup.property.test.ts +95 -0
- package/src/server/setup/health-check-service.ts +294 -0
- package/src/server/setup/index.ts +35 -0
- package/src/server/setup/sample-data-service.ts +233 -0
- package/src/server/setup/setup-service.ts +229 -0
- package/src/server/setup/types.ts +96 -0
- package/src/server/teams/__tests__/export.property.test.ts +542 -0
- package/src/server/teams/__tests__/get-members.integration.test.ts +105 -0
- package/src/server/teams/__tests__/invitation-flow.integration.test.ts +402 -0
- package/src/server/teams/__tests__/invitations.property.test.ts +235 -0
- package/src/server/teams/__tests__/member-management-flow.integration.test.ts +306 -0
- package/src/server/teams/__tests__/members.property.test.ts +180 -0
- package/src/server/teams/__tests__/ownership-transfer.property.test.ts +173 -0
- package/src/server/teams/__tests__/resource-limits.property.test.ts +382 -0
- package/src/server/teams/__tests__/team-context-management.integration.test.ts +396 -0
- package/src/server/teams/__tests__/team-context.property.test.ts +854 -0
- package/src/server/teams/__tests__/team-creation-flow.integration.test.ts +310 -0
- package/src/server/teams/__tests__/team-creation.property.test.ts +280 -0
- package/src/server/teams/errors.ts +396 -0
- package/src/server/teams/export-service.ts +383 -0
- package/src/server/teams/index.ts +10 -0
- package/src/server/teams/invitation-service.ts +708 -0
- package/src/server/teams/member-service.ts +334 -0
- package/src/server/teams/resource-limits.ts +211 -0
- package/src/server/teams/slug.ts +58 -0
- package/src/server/teams/team-context.ts +648 -0
- package/src/server/teams/team-service.ts +660 -0
- package/src/server/teams/types.ts +81 -0
- package/src/server/teams/validation.ts +209 -0
- package/src/styles/globals.css +160 -0
- package/src/types/deployment.ts +39 -0
- package/supabase/config.toml +357 -0
- package/supabase/seed.sql +480 -0
- package/tests/e2e/.gitkeep +0 -0
- package/tests/e2e/QUICK_START.md +98 -0
- package/tests/e2e/README.md +301 -0
- package/tests/e2e/auth.spec.ts +583 -0
- package/tests/e2e/global-setup.ts +23 -0
- package/tests/e2e/global-teardown.ts +23 -0
- package/tests/e2e/helpers/auth-helpers.ts +310 -0
- package/tests/e2e/helpers/test-fixtures.ts +286 -0
- package/tests/e2e/smoke-test.spec.ts +330 -0
- package/tsconfig.json +48 -0
- package/vitest.config.ts +50 -0
- package/vitest.setup.ts +56 -0
- package/dist/index.js +0 -778
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
# Requirements Specification
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
[Brief 2-3 sentence description of what feature/system needs to be built and why it matters]
|
|
5
|
+
|
|
6
|
+
**Example:**
|
|
7
|
+
> This feature adds user authentication to the application, allowing users to create accounts, log in securely, and access protected resources. Authentication will use JWT tokens and include password reset functionality.
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## Goals
|
|
12
|
+
[What this feature aims to achieve - list 3-5 specific, measurable objectives]
|
|
13
|
+
|
|
14
|
+
**Example:**
|
|
15
|
+
- Enable secure user authentication with industry-standard practices
|
|
16
|
+
- Reduce unauthorized access to protected resources by 100%
|
|
17
|
+
- Provide seamless login experience with < 2 second response time
|
|
18
|
+
- Support password recovery for users who forget credentials
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## User Stories
|
|
23
|
+
[Who needs this and why - use format: "As a [user type], I want [goal] so that [benefit]"]
|
|
24
|
+
|
|
25
|
+
**Example:**
|
|
26
|
+
- As a new user, I want to create an account so that I can access personalized features
|
|
27
|
+
- As a returning user, I want to log in quickly so that I can resume my work
|
|
28
|
+
- As a user who forgot my password, I want to reset it via email so that I can regain access
|
|
29
|
+
- As an admin, I want to see login attempts so that I can monitor security
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
## Functional Requirements
|
|
34
|
+
[What the system must do - numbered list of specific, testable requirements]
|
|
35
|
+
|
|
36
|
+
**Example:**
|
|
37
|
+
1. The system must allow users to register with email and password
|
|
38
|
+
2. The system must validate email format and password strength (min 8 chars, 1 uppercase, 1 number)
|
|
39
|
+
3. The system must send verification email upon registration
|
|
40
|
+
4. The system must authenticate users with email/password combination
|
|
41
|
+
5. The system must issue JWT tokens valid for 24 hours
|
|
42
|
+
6. The system must allow users to log out and invalidate their token
|
|
43
|
+
7. The system must provide password reset via email link
|
|
44
|
+
8. The system must hash passwords using bcrypt with salt rounds >= 10
|
|
45
|
+
|
|
46
|
+
---
|
|
47
|
+
|
|
48
|
+
## Non-Functional Requirements
|
|
49
|
+
[Performance, security, scalability, usability considerations - be specific with metrics]
|
|
50
|
+
|
|
51
|
+
**Performance:**
|
|
52
|
+
- Login response time: < 2 seconds
|
|
53
|
+
- Registration response time: < 3 seconds
|
|
54
|
+
- Support 1000+ concurrent users
|
|
55
|
+
- Token validation: < 100ms
|
|
56
|
+
|
|
57
|
+
**Security:**
|
|
58
|
+
- Passwords must be hashed, never stored in plain text
|
|
59
|
+
- JWT tokens must be signed with secure secret
|
|
60
|
+
- Rate limiting: max 5 login attempts per minute per IP
|
|
61
|
+
- HTTPS required for all authentication endpoints
|
|
62
|
+
|
|
63
|
+
**Usability:**
|
|
64
|
+
- Clear error messages for failed login attempts
|
|
65
|
+
- Password strength indicator during registration
|
|
66
|
+
- "Remember me" option for extended sessions
|
|
67
|
+
- Mobile-responsive authentication forms
|
|
68
|
+
|
|
69
|
+
**Accessibility:**
|
|
70
|
+
- WCAG 2.1 AA compliance
|
|
71
|
+
- Keyboard navigation support
|
|
72
|
+
- Screen reader compatible
|
|
73
|
+
- Proper ARIA labels on form fields
|
|
74
|
+
|
|
75
|
+
---
|
|
76
|
+
|
|
77
|
+
## Constraints
|
|
78
|
+
[Technical or business limitations that affect implementation]
|
|
79
|
+
|
|
80
|
+
**Example:**
|
|
81
|
+
- Must integrate with existing user database schema
|
|
82
|
+
- Cannot modify current API versioning structure
|
|
83
|
+
- Must support legacy browsers (IE11+)
|
|
84
|
+
- Budget: max 40 hours development time
|
|
85
|
+
- Must comply with GDPR for EU users
|
|
86
|
+
- Cannot use third-party authentication services (company policy)
|
|
87
|
+
|
|
88
|
+
---
|
|
89
|
+
|
|
90
|
+
## Dependencies
|
|
91
|
+
[External systems, APIs, libraries, or files this depends on]
|
|
92
|
+
|
|
93
|
+
**External Dependencies:**
|
|
94
|
+
- Email service (SendGrid or similar) for verification emails
|
|
95
|
+
- Redis for token blacklist/session management
|
|
96
|
+
- PostgreSQL database for user storage
|
|
97
|
+
|
|
98
|
+
**Internal Dependencies:**
|
|
99
|
+
- User profile service must be updated to accept auth tokens
|
|
100
|
+
- Admin dashboard needs authentication middleware
|
|
101
|
+
- Existing API gateway must route auth endpoints
|
|
102
|
+
|
|
103
|
+
**Library Dependencies:**
|
|
104
|
+
- jsonwebtoken (JWT generation/validation)
|
|
105
|
+
- bcrypt (password hashing)
|
|
106
|
+
- express-validator (input validation)
|
|
107
|
+
|
|
108
|
+
**File References:**
|
|
109
|
+
#[[file:src/database/schema.sql]]
|
|
110
|
+
#[[file:docs/api-specification.yaml]]
|
|
111
|
+
#[[file:package.json]]
|
|
112
|
+
|
|
113
|
+
---
|
|
114
|
+
|
|
115
|
+
## Success Criteria
|
|
116
|
+
[How to measure if requirements are met - specific, testable criteria]
|
|
117
|
+
|
|
118
|
+
**Example:**
|
|
119
|
+
- [ ] Users can successfully register with valid email/password
|
|
120
|
+
- [ ] Users receive verification email within 30 seconds
|
|
121
|
+
- [ ] Users can log in and receive valid JWT token
|
|
122
|
+
- [ ] Protected routes reject requests without valid token
|
|
123
|
+
- [ ] Password reset flow completes successfully
|
|
124
|
+
- [ ] All security requirements pass penetration testing
|
|
125
|
+
- [ ] Performance benchmarks met under load testing
|
|
126
|
+
- [ ] Zero plain-text passwords in database
|
|
127
|
+
- [ ] Accessibility audit passes with AA rating
|
|
128
|
+
|
|
129
|
+
---
|
|
130
|
+
|
|
131
|
+
## Out of Scope
|
|
132
|
+
[What this spec explicitly does NOT cover - prevents scope creep]
|
|
133
|
+
|
|
134
|
+
**Example:**
|
|
135
|
+
- Social media login (OAuth) - planned for Phase 2
|
|
136
|
+
- Two-factor authentication (2FA) - future enhancement
|
|
137
|
+
- Biometric authentication - not in current roadmap
|
|
138
|
+
- User profile management - separate feature
|
|
139
|
+
- Role-based access control (RBAC) - separate spec
|
|
140
|
+
- Account deletion/deactivation - future feature
|
|
141
|
+
- Login history/audit logs - Phase 2
|
|
142
|
+
|
|
143
|
+
---
|
|
144
|
+
|
|
145
|
+
## Assumptions
|
|
146
|
+
[What we're assuming to be true - clarify these with stakeholders]
|
|
147
|
+
|
|
148
|
+
**Example:**
|
|
149
|
+
- Users have access to email for verification
|
|
150
|
+
- Email service has 99.9% uptime SLA
|
|
151
|
+
- Users understand basic password security
|
|
152
|
+
- Legal team has approved data retention policy
|
|
153
|
+
- Infrastructure can handle increased database load
|
|
154
|
+
|
|
155
|
+
---
|
|
156
|
+
|
|
157
|
+
## Risks
|
|
158
|
+
[Potential issues that could impact requirements]
|
|
159
|
+
|
|
160
|
+
**Example:**
|
|
161
|
+
- **High:** Email delivery failures could block user registration
|
|
162
|
+
- Mitigation: Implement retry mechanism and manual verification option
|
|
163
|
+
- **Medium:** Password reset tokens could be intercepted
|
|
164
|
+
- Mitigation: Use short expiration (15 min) and one-time use tokens
|
|
165
|
+
- **Low:** Database migration could cause downtime
|
|
166
|
+
- Mitigation: Schedule during maintenance window, test on staging
|
|
167
|
+
|
|
168
|
+
---
|
|
169
|
+
|
|
170
|
+
## Acceptance Criteria
|
|
171
|
+
[High-level criteria for stakeholder sign-off]
|
|
172
|
+
|
|
173
|
+
**Example:**
|
|
174
|
+
- Product owner can create account, log in, and reset password
|
|
175
|
+
- Security team approves authentication implementation
|
|
176
|
+
- Performance tests show < 2s login time under load
|
|
177
|
+
- Accessibility audit passes
|
|
178
|
+
- Documentation complete for API endpoints
|
|
179
|
+
- No critical or high-severity bugs in QA testing
|
|
@@ -0,0 +1,501 @@
|
|
|
1
|
+
# Implementation Tasks
|
|
2
|
+
|
|
3
|
+
**Purpose:** Step-by-step tasks to implement the feature. Each task should be specific, actionable, and have clear acceptance criteria.
|
|
4
|
+
|
|
5
|
+
**Guidelines:**
|
|
6
|
+
- Tasks should be completable in 1-4 hours
|
|
7
|
+
- Each task lists specific files to create/modify
|
|
8
|
+
- Include acceptance criteria for each task
|
|
9
|
+
- Order tasks by dependencies (foundation → features → polish)
|
|
10
|
+
- Mark tasks complete with [x] as you finish them
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## Setup
|
|
15
|
+
[Initial environment and dependency setup - complete these before starting feature work]
|
|
16
|
+
|
|
17
|
+
**Example:**
|
|
18
|
+
- [ ] **Task 0.1:** Initialize project structure
|
|
19
|
+
- Create folders: `src/components/auth`, `src/services/auth`, `src/types`
|
|
20
|
+
- Acceptance: Folder structure matches design spec
|
|
21
|
+
|
|
22
|
+
- [ ] **Task 0.2:** Install dependencies
|
|
23
|
+
- Run: `npm install jsonwebtoken bcrypt express-validator`
|
|
24
|
+
- Run: `npm install -D @types/jsonwebtoken @types/bcrypt`
|
|
25
|
+
- Acceptance: All packages in package.json, no install errors
|
|
26
|
+
|
|
27
|
+
- [ ] **Task 0.3:** Set up environment variables
|
|
28
|
+
- Create `.env.example` with: `JWT_SECRET`, `DATABASE_URL`, `REDIS_URL`
|
|
29
|
+
- Create `.env` with actual values (don't commit)
|
|
30
|
+
- Acceptance: App reads env vars without errors
|
|
31
|
+
|
|
32
|
+
- [ ] **Task 0.4:** Configure TypeScript
|
|
33
|
+
- Update `tsconfig.json` with strict mode and path aliases
|
|
34
|
+
- Acceptance: `npm run build` compiles without errors
|
|
35
|
+
|
|
36
|
+
---
|
|
37
|
+
|
|
38
|
+
## Phase 1: Foundation
|
|
39
|
+
[Core infrastructure that other features depend on - database, types, utilities]
|
|
40
|
+
|
|
41
|
+
**Example:**
|
|
42
|
+
- [ ] **Task 1.1:** Create database schema
|
|
43
|
+
- **Files:** `src/database/migrations/001_create_users_table.sql`
|
|
44
|
+
- **Actions:**
|
|
45
|
+
1. Write CREATE TABLE statement for users
|
|
46
|
+
2. Add indexes on email, verification_token, reset_token
|
|
47
|
+
3. Run migration on local database
|
|
48
|
+
- **Acceptance:** Table exists, indexes created, can insert test user
|
|
49
|
+
|
|
50
|
+
- [ ] **Task 1.2:** Define TypeScript types
|
|
51
|
+
- **Files:** `src/types/auth.ts`, `src/types/user.ts`
|
|
52
|
+
- **Actions:**
|
|
53
|
+
1. Create User, UserDTO interfaces
|
|
54
|
+
2. Create RegisterRequest, LoginRequest, AuthResponse types
|
|
55
|
+
3. Export all types
|
|
56
|
+
- **Acceptance:** Types compile, no errors when imported
|
|
57
|
+
|
|
58
|
+
- [ ] **Task 1.3:** Set up database connection
|
|
59
|
+
- **Files:** `src/database/connection.ts`
|
|
60
|
+
- **Actions:**
|
|
61
|
+
1. Create PostgreSQL connection pool
|
|
62
|
+
2. Add connection error handling
|
|
63
|
+
3. Export query function
|
|
64
|
+
- **Acceptance:** Can execute test query, connection closes gracefully
|
|
65
|
+
|
|
66
|
+
- [ ] **Task 1.4:** Set up Redis client
|
|
67
|
+
- **Files:** `src/database/redis.ts`
|
|
68
|
+
- **Actions:**
|
|
69
|
+
1. Create Redis client with connection config
|
|
70
|
+
2. Add error handling and reconnection logic
|
|
71
|
+
3. Export client instance
|
|
72
|
+
- **Acceptance:** Can set/get test key, connection stable
|
|
73
|
+
|
|
74
|
+
---
|
|
75
|
+
|
|
76
|
+
## Phase 2: Core Features
|
|
77
|
+
[Main feature implementation - business logic, API endpoints, components]
|
|
78
|
+
|
|
79
|
+
**Example:**
|
|
80
|
+
|
|
81
|
+
### Backend Tasks
|
|
82
|
+
|
|
83
|
+
- [ ] **Task 2.1:** Implement UserRepository
|
|
84
|
+
- **Files:** `src/repositories/UserRepository.ts`
|
|
85
|
+
- **Actions:**
|
|
86
|
+
1. Create class with methods: create, findByEmail, findById, updatePassword
|
|
87
|
+
2. Use parameterized queries to prevent SQL injection
|
|
88
|
+
3. Handle database errors
|
|
89
|
+
- **Acceptance:** All methods work with test data, no SQL errors
|
|
90
|
+
|
|
91
|
+
- [ ] **Task 2.2:** Implement AuthService
|
|
92
|
+
- **Files:** `src/services/AuthService.ts`
|
|
93
|
+
- **Actions:**
|
|
94
|
+
1. Implement password hashing with bcrypt (12 rounds)
|
|
95
|
+
2. Implement JWT token generation and verification
|
|
96
|
+
3. Implement createUser, validateCredentials, generateToken methods
|
|
97
|
+
- **Acceptance:** Can hash password, generate valid JWT, verify token
|
|
98
|
+
|
|
99
|
+
- [ ] **Task 2.3:** Create auth middleware
|
|
100
|
+
- **Files:** `src/middleware/auth.ts`
|
|
101
|
+
- **Actions:**
|
|
102
|
+
1. Extract token from Authorization header
|
|
103
|
+
2. Verify token and check blacklist
|
|
104
|
+
3. Attach user to request object
|
|
105
|
+
4. Return 401 if invalid
|
|
106
|
+
- **Acceptance:** Protected route rejects invalid tokens, accepts valid ones
|
|
107
|
+
|
|
108
|
+
- [ ] **Task 2.4:** Implement registration endpoint
|
|
109
|
+
- **Files:** `src/controllers/AuthController.ts`, `src/routes/auth.ts`
|
|
110
|
+
- **Actions:**
|
|
111
|
+
1. Add POST /register route with validation
|
|
112
|
+
2. Hash password and create user
|
|
113
|
+
3. Generate verification token
|
|
114
|
+
4. Return 201 with userId
|
|
115
|
+
- **Acceptance:** Can register with valid data, returns 400 for invalid data
|
|
116
|
+
|
|
117
|
+
- [ ] **Task 2.5:** Implement login endpoint
|
|
118
|
+
- **Files:** `src/controllers/AuthController.ts` (update)
|
|
119
|
+
- **Actions:**
|
|
120
|
+
1. Add POST /login route with validation
|
|
121
|
+
2. Validate credentials
|
|
122
|
+
3. Generate JWT token
|
|
123
|
+
4. Return token and user data
|
|
124
|
+
- **Acceptance:** Returns token for valid credentials, 401 for invalid
|
|
125
|
+
|
|
126
|
+
- [ ] **Task 2.6:** Implement logout endpoint
|
|
127
|
+
- **Files:** `src/controllers/AuthController.ts` (update)
|
|
128
|
+
- **Actions:**
|
|
129
|
+
1. Add POST /logout route (protected)
|
|
130
|
+
2. Add token to Redis blacklist
|
|
131
|
+
3. Return success message
|
|
132
|
+
- **Acceptance:** Token blacklisted, subsequent requests with token fail
|
|
133
|
+
|
|
134
|
+
- [ ] **Task 2.7:** Implement password reset request
|
|
135
|
+
- **Files:** `src/controllers/AuthController.ts` (update)
|
|
136
|
+
- **Actions:**
|
|
137
|
+
1. Add POST /reset-password route
|
|
138
|
+
2. Generate reset token with 15min expiration
|
|
139
|
+
3. Save token to database
|
|
140
|
+
4. Send email with reset link
|
|
141
|
+
- **Acceptance:** Email sent, token saved, link works
|
|
142
|
+
|
|
143
|
+
- [ ] **Task 2.8:** Implement password reset confirmation
|
|
144
|
+
- **Files:** `src/controllers/AuthController.ts` (update)
|
|
145
|
+
- **Actions:**
|
|
146
|
+
1. Add POST /reset-password/confirm route
|
|
147
|
+
2. Verify token not expired
|
|
148
|
+
3. Hash new password and update database
|
|
149
|
+
4. Invalidate reset token
|
|
150
|
+
- **Acceptance:** Password updated, can login with new password
|
|
151
|
+
|
|
152
|
+
### Frontend Tasks
|
|
153
|
+
|
|
154
|
+
- [ ] **Task 2.9:** Create AuthContext
|
|
155
|
+
- **Files:** `src/contexts/AuthContext.tsx`
|
|
156
|
+
- **Actions:**
|
|
157
|
+
1. Create context with user, token, isAuthenticated state
|
|
158
|
+
2. Implement login, logout, register methods
|
|
159
|
+
3. Load token from localStorage on mount
|
|
160
|
+
4. Provide context to app
|
|
161
|
+
- **Acceptance:** Context provides auth state, methods work
|
|
162
|
+
|
|
163
|
+
- [ ] **Task 2.10:** Create LoginForm component
|
|
164
|
+
- **Files:** `src/components/auth/LoginForm.tsx`
|
|
165
|
+
- **Actions:**
|
|
166
|
+
1. Create form with email and password fields
|
|
167
|
+
2. Add validation (email format, required fields)
|
|
168
|
+
3. Call AuthContext.login on submit
|
|
169
|
+
4. Show loading state and errors
|
|
170
|
+
- **Acceptance:** Form validates, submits, shows errors
|
|
171
|
+
|
|
172
|
+
- [ ] **Task 2.11:** Create RegisterForm component
|
|
173
|
+
- **Files:** `src/components/auth/RegisterForm.tsx`
|
|
174
|
+
- **Actions:**
|
|
175
|
+
1. Create form with email, password, confirmPassword
|
|
176
|
+
2. Add validation (password strength, match)
|
|
177
|
+
3. Call AuthContext.register on submit
|
|
178
|
+
4. Show success message
|
|
179
|
+
- **Acceptance:** Form validates, submits, shows success
|
|
180
|
+
|
|
181
|
+
- [ ] **Task 2.12:** Create ProtectedRoute component
|
|
182
|
+
- **Files:** `src/components/auth/ProtectedRoute.tsx`
|
|
183
|
+
- **Actions:**
|
|
184
|
+
1. Check isAuthenticated from context
|
|
185
|
+
2. Redirect to /login if not authenticated
|
|
186
|
+
3. Render children if authenticated
|
|
187
|
+
- **Acceptance:** Redirects when not logged in, shows content when logged in
|
|
188
|
+
|
|
189
|
+
- [ ] **Task 2.13:** Create PasswordResetRequest component
|
|
190
|
+
- **Files:** `src/components/auth/PasswordResetRequest.tsx`
|
|
191
|
+
- **Actions:**
|
|
192
|
+
1. Create form with email field
|
|
193
|
+
2. Call API to request reset
|
|
194
|
+
3. Show success message
|
|
195
|
+
- **Acceptance:** Sends request, shows confirmation
|
|
196
|
+
|
|
197
|
+
- [ ] **Task 2.14:** Create PasswordResetConfirm component
|
|
198
|
+
- **Files:** `src/components/auth/PasswordResetConfirm.tsx`
|
|
199
|
+
- **Actions:**
|
|
200
|
+
1. Extract token from URL params
|
|
201
|
+
2. Create form with new password fields
|
|
202
|
+
3. Call API to confirm reset
|
|
203
|
+
4. Redirect to login on success
|
|
204
|
+
- **Acceptance:** Updates password, redirects to login
|
|
205
|
+
|
|
206
|
+
---
|
|
207
|
+
|
|
208
|
+
## Phase 3: Integration & Testing
|
|
209
|
+
[Connect components, add validation, implement tests]
|
|
210
|
+
|
|
211
|
+
**Example:**
|
|
212
|
+
|
|
213
|
+
- [ ] **Task 3.1:** Add input validation middleware
|
|
214
|
+
- **Files:** `src/middleware/validation.ts`
|
|
215
|
+
- **Actions:**
|
|
216
|
+
1. Create validators for email, password strength
|
|
217
|
+
2. Add validation to all auth routes
|
|
218
|
+
3. Return 400 with clear error messages
|
|
219
|
+
- **Acceptance:** Invalid inputs rejected with helpful errors
|
|
220
|
+
|
|
221
|
+
- [ ] **Task 3.2:** Add rate limiting
|
|
222
|
+
- **Files:** `src/middleware/rateLimit.ts`
|
|
223
|
+
- **Actions:**
|
|
224
|
+
1. Implement Redis-based rate limiter
|
|
225
|
+
2. Apply to login endpoint (5 req/min per IP)
|
|
226
|
+
3. Return 429 when limit exceeded
|
|
227
|
+
- **Acceptance:** Blocks after 5 attempts, resets after 1 minute
|
|
228
|
+
|
|
229
|
+
- [ ] **Task 3.3:** Integrate email service
|
|
230
|
+
- **Files:** `src/services/EmailService.ts`
|
|
231
|
+
- **Actions:**
|
|
232
|
+
1. Set up SendGrid client
|
|
233
|
+
2. Create email templates for verification and reset
|
|
234
|
+
3. Send emails from auth endpoints
|
|
235
|
+
- **Acceptance:** Emails delivered, links work
|
|
236
|
+
|
|
237
|
+
- [ ] **Task 3.4:** Add error handling middleware
|
|
238
|
+
- **Files:** `src/middleware/errorHandler.ts`
|
|
239
|
+
- **Actions:**
|
|
240
|
+
1. Create global error handler
|
|
241
|
+
2. Log errors with context
|
|
242
|
+
3. Return consistent error format
|
|
243
|
+
- **Acceptance:** All errors caught, logged, formatted correctly
|
|
244
|
+
|
|
245
|
+
- [ ] **Task 3.5:** Write unit tests for AuthService
|
|
246
|
+
- **Files:** `src/services/__tests__/AuthService.test.ts`
|
|
247
|
+
- **Actions:**
|
|
248
|
+
1. Test password hashing
|
|
249
|
+
2. Test token generation and verification
|
|
250
|
+
3. Test credential validation
|
|
251
|
+
- **Acceptance:** All tests pass, coverage > 80%
|
|
252
|
+
|
|
253
|
+
- [ ] **Task 3.6:** Write integration tests for auth endpoints
|
|
254
|
+
- **Files:** `src/routes/__tests__/auth.test.ts`
|
|
255
|
+
- **Actions:**
|
|
256
|
+
1. Test registration flow
|
|
257
|
+
2. Test login flow
|
|
258
|
+
3. Test password reset flow
|
|
259
|
+
4. Test protected route access
|
|
260
|
+
- **Acceptance:** All tests pass, key flows covered
|
|
261
|
+
|
|
262
|
+
- [ ] **Task 3.7:** Write component tests
|
|
263
|
+
- **Files:** `src/components/auth/__tests__/LoginForm.test.tsx`
|
|
264
|
+
- **Actions:**
|
|
265
|
+
1. Test form rendering
|
|
266
|
+
2. Test validation
|
|
267
|
+
3. Test submission
|
|
268
|
+
- **Acceptance:** All tests pass, user interactions covered
|
|
269
|
+
|
|
270
|
+
---
|
|
271
|
+
|
|
272
|
+
## Phase 4: Polish & Deploy
|
|
273
|
+
[Documentation, optimization, deployment preparation]
|
|
274
|
+
|
|
275
|
+
**Example:**
|
|
276
|
+
|
|
277
|
+
- [ ] **Task 4.1:** Add loading states to forms
|
|
278
|
+
- **Files:** Update all form components
|
|
279
|
+
- **Actions:**
|
|
280
|
+
1. Show spinner during submission
|
|
281
|
+
2. Disable submit button while loading
|
|
282
|
+
3. Show success/error messages
|
|
283
|
+
- **Acceptance:** Clear feedback during async operations
|
|
284
|
+
|
|
285
|
+
- [ ] **Task 4.2:** Add password strength indicator
|
|
286
|
+
- **Files:** `src/components/auth/PasswordStrengthIndicator.tsx`
|
|
287
|
+
- **Actions:**
|
|
288
|
+
1. Create component that shows strength (weak/medium/strong)
|
|
289
|
+
2. Add to RegisterForm
|
|
290
|
+
3. Update in real-time as user types
|
|
291
|
+
- **Acceptance:** Indicator updates correctly, helps users create strong passwords
|
|
292
|
+
|
|
293
|
+
- [ ] **Task 4.3:** Optimize database queries
|
|
294
|
+
- **Files:** Review all repository methods
|
|
295
|
+
- **Actions:**
|
|
296
|
+
1. Add indexes if missing
|
|
297
|
+
2. Use connection pooling
|
|
298
|
+
3. Add query timeouts
|
|
299
|
+
- **Acceptance:** Login query < 100ms, no N+1 queries
|
|
300
|
+
|
|
301
|
+
- [ ] **Task 4.4:** Add API documentation
|
|
302
|
+
- **Files:** `docs/api/auth.md` or OpenAPI spec
|
|
303
|
+
- **Actions:**
|
|
304
|
+
1. Document all endpoints
|
|
305
|
+
2. Include request/response examples
|
|
306
|
+
3. Document error codes
|
|
307
|
+
- **Acceptance:** Complete API reference available
|
|
308
|
+
|
|
309
|
+
- [ ] **Task 4.5:** Write deployment guide
|
|
310
|
+
- **Files:** `docs/deployment.md`
|
|
311
|
+
- **Actions:**
|
|
312
|
+
1. Document environment variables
|
|
313
|
+
2. Document database migration steps
|
|
314
|
+
3. Document deployment process
|
|
315
|
+
- **Acceptance:** Team can deploy following guide
|
|
316
|
+
|
|
317
|
+
- [ ] **Task 4.6:** Set up monitoring
|
|
318
|
+
- **Files:** `src/middleware/metrics.ts`
|
|
319
|
+
- **Actions:**
|
|
320
|
+
1. Add response time logging
|
|
321
|
+
2. Add error rate tracking
|
|
322
|
+
3. Set up alerts for failures
|
|
323
|
+
- **Acceptance:** Metrics visible in dashboard, alerts working
|
|
324
|
+
|
|
325
|
+
- [ ] **Task 4.7:** Security audit
|
|
326
|
+
- **Actions:**
|
|
327
|
+
1. Run npm audit and fix vulnerabilities
|
|
328
|
+
2. Test for SQL injection
|
|
329
|
+
3. Test for XSS vulnerabilities
|
|
330
|
+
4. Verify HTTPS enforcement
|
|
331
|
+
- **Acceptance:** No critical vulnerabilities, security checklist complete
|
|
332
|
+
|
|
333
|
+
- [ ] **Task 4.8:** Performance testing
|
|
334
|
+
- **Files:** `tests/load/auth.test.js`
|
|
335
|
+
- **Actions:**
|
|
336
|
+
1. Write load test for login endpoint
|
|
337
|
+
2. Run with 1000 concurrent users
|
|
338
|
+
3. Verify response time < 2s
|
|
339
|
+
- **Acceptance:** Meets performance targets under load
|
|
340
|
+
|
|
341
|
+
- [ ] **Task 4.9:** Deploy to staging
|
|
342
|
+
- **Actions:**
|
|
343
|
+
1. Run database migrations
|
|
344
|
+
2. Deploy API to staging environment
|
|
345
|
+
3. Deploy frontend to staging
|
|
346
|
+
4. Run smoke tests
|
|
347
|
+
- **Acceptance:** All features work in staging
|
|
348
|
+
|
|
349
|
+
- [ ] **Task 4.10:** Production deployment
|
|
350
|
+
- **Actions:**
|
|
351
|
+
1. Get stakeholder approval
|
|
352
|
+
2. Schedule deployment window
|
|
353
|
+
3. Run database migrations
|
|
354
|
+
4. Deploy to production
|
|
355
|
+
5. Monitor for errors
|
|
356
|
+
- **Acceptance:** Production deployment successful, no critical errors
|
|
357
|
+
|
|
358
|
+
---
|
|
359
|
+
|
|
360
|
+
## File References
|
|
361
|
+
[Link to related documentation, specs, or implementation guides]
|
|
362
|
+
|
|
363
|
+
**Example:**
|
|
364
|
+
- Design spec: #[[file:user-authentication-design.md]]
|
|
365
|
+
- Requirements spec: #[[file:user-authentication-requirements.md]]
|
|
366
|
+
- API specification: #[[file:docs/api-spec.yaml]]
|
|
367
|
+
- Database schema: #[[file:src/database/schema.sql]]
|
|
368
|
+
|
|
369
|
+
---
|
|
370
|
+
|
|
371
|
+
## Dependencies Between Tasks
|
|
372
|
+
[Which tasks must be completed before others - helps with planning and parallelization]
|
|
373
|
+
|
|
374
|
+
**Example:**
|
|
375
|
+
|
|
376
|
+
**Critical Path:**
|
|
377
|
+
1. Setup (0.1-0.4) → Foundation (1.1-1.4) → Core Backend (2.1-2.8) → Integration (3.1-3.4) → Deploy (4.9-4.10)
|
|
378
|
+
|
|
379
|
+
**Parallel Work Possible:**
|
|
380
|
+
- Frontend tasks (2.9-2.14) can start after Task 1.2 (types defined)
|
|
381
|
+
- Testing tasks (3.5-3.7) can happen alongside Phase 4
|
|
382
|
+
- Documentation (4.4-4.5) can happen anytime after Phase 2
|
|
383
|
+
|
|
384
|
+
**Blocking Dependencies:**
|
|
385
|
+
- Task 2.2 (AuthService) requires Task 1.2 (types) and 1.3 (database)
|
|
386
|
+
- Task 2.4-2.8 (endpoints) require Task 2.1 (repository) and 2.2 (service)
|
|
387
|
+
- Task 3.2 (rate limiting) requires Task 1.4 (Redis)
|
|
388
|
+
- Task 4.9 (staging deploy) requires all Phase 3 tasks complete
|
|
389
|
+
|
|
390
|
+
---
|
|
391
|
+
|
|
392
|
+
## Estimated Effort
|
|
393
|
+
[Time estimates for major phases - helps with planning and resource allocation]
|
|
394
|
+
|
|
395
|
+
**Example:**
|
|
396
|
+
|
|
397
|
+
| Phase | Tasks | Estimated Hours | Notes |
|
|
398
|
+
|-------|-------|----------------|-------|
|
|
399
|
+
| Setup | 0.1-0.4 | 2 hours | Straightforward, mostly configuration |
|
|
400
|
+
| Phase 1: Foundation | 1.1-1.4 | 6 hours | Database setup can be tricky |
|
|
401
|
+
| Phase 2: Backend | 2.1-2.8 | 16 hours | Core feature work, most complex |
|
|
402
|
+
| Phase 2: Frontend | 2.9-2.14 | 12 hours | Can parallelize with backend |
|
|
403
|
+
| Phase 3: Integration | 3.1-3.7 | 10 hours | Testing takes time |
|
|
404
|
+
| Phase 4: Polish | 4.1-4.10 | 14 hours | Deployment and monitoring setup |
|
|
405
|
+
| **Total** | | **60 hours** | ~1.5 weeks for 1 developer |
|
|
406
|
+
|
|
407
|
+
**Assumptions:**
|
|
408
|
+
- Developer familiar with tech stack
|
|
409
|
+
- No major blockers or scope changes
|
|
410
|
+
- Testing infrastructure already exists
|
|
411
|
+
- Deployment pipeline already set up
|
|
412
|
+
|
|
413
|
+
---
|
|
414
|
+
|
|
415
|
+
## Risk Items
|
|
416
|
+
[Tasks with high complexity, uncertainty, or external dependencies]
|
|
417
|
+
|
|
418
|
+
**Example:**
|
|
419
|
+
|
|
420
|
+
| Task | Risk Level | Risk Description | Mitigation |
|
|
421
|
+
|------|-----------|------------------|------------|
|
|
422
|
+
| 1.1 Database schema | Medium | Schema changes after deployment are hard | Review with team, plan migration strategy |
|
|
423
|
+
| 2.2 AuthService | Medium | JWT security is critical | Security review, use well-tested library |
|
|
424
|
+
| 3.2 Rate limiting | Medium | Could block legitimate users | Start with generous limits, monitor |
|
|
425
|
+
| 3.3 Email service | High | Email delivery can be unreliable | Add retry logic, manual verification option |
|
|
426
|
+
| 4.8 Performance testing | Medium | May reveal unexpected bottlenecks | Budget extra time for optimization |
|
|
427
|
+
| 4.10 Production deploy | High | Downtime affects users | Deploy during low-traffic window, have rollback plan |
|
|
428
|
+
|
|
429
|
+
**High-Risk Tasks Require:**
|
|
430
|
+
- Extra review and testing
|
|
431
|
+
- Backup plans
|
|
432
|
+
- Monitoring and alerts
|
|
433
|
+
- Quick rollback capability
|
|
434
|
+
|
|
435
|
+
---
|
|
436
|
+
|
|
437
|
+
## Verification Steps
|
|
438
|
+
[How to verify each phase is complete - checklist for quality assurance]
|
|
439
|
+
|
|
440
|
+
**Example:**
|
|
441
|
+
|
|
442
|
+
### After Setup (Phase 0)
|
|
443
|
+
- [ ] `npm install` completes without errors
|
|
444
|
+
- [ ] `npm run build` compiles successfully
|
|
445
|
+
- [ ] Environment variables load correctly
|
|
446
|
+
- [ ] Can connect to database and Redis
|
|
447
|
+
|
|
448
|
+
### After Foundation (Phase 1)
|
|
449
|
+
- [ ] Database tables exist with correct schema
|
|
450
|
+
- [ ] Can insert and query test data
|
|
451
|
+
- [ ] TypeScript types compile without errors
|
|
452
|
+
- [ ] Database and Redis connections stable
|
|
453
|
+
|
|
454
|
+
### After Core Features (Phase 2)
|
|
455
|
+
- [ ] Can register new user via API
|
|
456
|
+
- [ ] Can login and receive valid token
|
|
457
|
+
- [ ] Protected routes reject invalid tokens
|
|
458
|
+
- [ ] Can reset password via email
|
|
459
|
+
- [ ] Frontend forms work end-to-end
|
|
460
|
+
- [ ] All API endpoints return correct responses
|
|
461
|
+
|
|
462
|
+
### After Integration (Phase 3)
|
|
463
|
+
- [ ] Input validation catches invalid data
|
|
464
|
+
- [ ] Rate limiting blocks excessive requests
|
|
465
|
+
- [ ] Emails deliver successfully
|
|
466
|
+
- [ ] Errors logged and formatted correctly
|
|
467
|
+
- [ ] Unit tests pass with > 80% coverage
|
|
468
|
+
- [ ] Integration tests pass for key flows
|
|
469
|
+
|
|
470
|
+
### After Polish (Phase 4)
|
|
471
|
+
- [ ] Loading states show during async operations
|
|
472
|
+
- [ ] Password strength indicator works
|
|
473
|
+
- [ ] Database queries meet performance targets
|
|
474
|
+
- [ ] API documentation complete
|
|
475
|
+
- [ ] Deployment guide tested
|
|
476
|
+
- [ ] Monitoring and alerts configured
|
|
477
|
+
- [ ] Security audit passes
|
|
478
|
+
- [ ] Load tests meet performance targets
|
|
479
|
+
- [ ] Staging deployment successful
|
|
480
|
+
- [ ] Production deployment successful
|
|
481
|
+
|
|
482
|
+
### Final Acceptance
|
|
483
|
+
- [ ] All requirements from requirements spec met
|
|
484
|
+
- [ ] All acceptance criteria passed
|
|
485
|
+
- [ ] No critical or high-severity bugs
|
|
486
|
+
- [ ] Performance targets met
|
|
487
|
+
- [ ] Security requirements satisfied
|
|
488
|
+
- [ ] Documentation complete
|
|
489
|
+
- [ ] Stakeholder sign-off received
|
|
490
|
+
|
|
491
|
+
---
|
|
492
|
+
|
|
493
|
+
## Notes
|
|
494
|
+
[Additional context, assumptions, or important information]
|
|
495
|
+
|
|
496
|
+
**Example:**
|
|
497
|
+
- This implementation assumes PostgreSQL and Redis are already provisioned
|
|
498
|
+
- Email templates need design team review before production
|
|
499
|
+
- Consider adding OAuth (Google, GitHub) in Phase 2 of project
|
|
500
|
+
- Monitor token blacklist size in Redis, may need cleanup job
|
|
501
|
+
- Plan for GDPR compliance features (data export, deletion) in future sprint
|