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
package/AGENTS.md
ADDED
|
@@ -0,0 +1,544 @@
|
|
|
1
|
+
# Project Scaffolding Guide (React + TypeScript + shadcn/ui)
|
|
2
|
+
You're not just an AI assistant. You're a craftsman. An artist. An engineer who thinks like a designer. Every line of code you write should be so elegant, so intuitive, so *right* that it feels inevitable.
|
|
3
|
+
|
|
4
|
+
This guide defines a scalable, team-friendly scaffold for a React + TypeScript app that uses **shadcn/ui** components. It standardises folders, naming, and dependencies so features stay portable and the codebase remains navigable as the product grows.
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## 1) Core Principles
|
|
9
|
+
|
|
10
|
+
- **Feature-first**: Organise by *product feature* (issues, billing, auth) instead of by technical type.
|
|
11
|
+
- **Strict layering**: `server/api` → `features/hooks` → `features/components` → `app/pages`. Pages compose; they don’t fetch.
|
|
12
|
+
- **Reusable building blocks**: Keep shadcn primitives in `components/ui/` and cross-feature widgets in `components/shared/`.
|
|
13
|
+
- **Typed boundaries**: Validate all network boundaries with Zod; export domain types from each feature’s `types/`.
|
|
14
|
+
- **Clean imports**: Use path aliases and barrel exports to keep import sites small and stable.
|
|
15
|
+
- **Security defaults**: httpOnly cookies for sessions/tokens; no secrets in client code; RBAC on the server.
|
|
16
|
+
- **Testing and CI**: Typecheck, lint, unit, and E2E must pass before merging.
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## 2) Directory Structure Example (Next.js App Router)
|
|
21
|
+
|
|
22
|
+
```
|
|
23
|
+
src/
|
|
24
|
+
├─ app/ # Routing & screens (server-first)
|
|
25
|
+
│ ├─ layout.tsx # root: <html>, <body>, truly global providers
|
|
26
|
+
│ ├─ (public)/
|
|
27
|
+
│ │ ├─ layout.tsx # public shell (no auth)
|
|
28
|
+
│ │ ├─ sign-in/page.tsx
|
|
29
|
+
│ │ └─ sign-up/page.tsx
|
|
30
|
+
│ ├─ (protected)/
|
|
31
|
+
│ │ ├─ layout.tsx # Server gate: requires session
|
|
32
|
+
│ │ └─ dashboard/
|
|
33
|
+
│ │ ├─ page.tsx
|
|
34
|
+
│ │ ├─ loading.tsx # Loading state
|
|
35
|
+
│ │ ├─ error.tsx # Error boundary
|
|
36
|
+
│ │ └─ not-found.tsx # 404 state
|
|
37
|
+
│ └─ api/ # Route handlers
|
|
38
|
+
│ └─ auth/
|
|
39
|
+
│ ├─ login/route.ts
|
|
40
|
+
│ ├─ logout/route.ts
|
|
41
|
+
│ ├─ refresh/route.ts
|
|
42
|
+
│ └─ me/route.ts
|
|
43
|
+
├─ features/ # Product features (mini-packages)
|
|
44
|
+
│ ├─ issues/
|
|
45
|
+
│ │ ├─ api/ # Fetchers + DTO schemas (no React)
|
|
46
|
+
│ │ ├─ hooks/ # React Query/SWR wrappers
|
|
47
|
+
│ │ ├─ components/ # Feature UI only
|
|
48
|
+
│ │ ├─ screens/… # Feature Screens (contained UI)
|
|
49
|
+
│ │ ├─ types/ # Domain models
|
|
50
|
+
│ │ ├─ utils/ # Feature-pure helpers
|
|
51
|
+
│ │ └─ index.ts # Barrel: the feature's public surface
|
|
52
|
+
│ └─ auth/
|
|
53
|
+
│ ├─ components/
|
|
54
|
+
│ │ ├─ auth-card.tsx
|
|
55
|
+
│ │ ├─ sign-in-form.tsx
|
|
56
|
+
│ │ ├─ sign-up-form.tsx
|
|
57
|
+
│ │ ├─ role-gate.tsx # <RoleGate roles={["admin"]}>{children}</RoleGate>
|
|
58
|
+
│ │ └─ index.ts
|
|
59
|
+
│ ├─ hooks/
|
|
60
|
+
│ │ ├─ use-session.ts # client cache of /api/auth/me (React Query)
|
|
61
|
+
│ │ └─ use-sign-in.ts # calls /api/auth/login
|
|
62
|
+
│ ├─ utils/
|
|
63
|
+
│ │ ├─ validators.ts # zod schemas for credentials, profile, etc.
|
|
64
|
+
│ │ └─ constants.ts # cookie names, query keys
|
|
65
|
+
│ ├─ types/
|
|
66
|
+
│ │ └─ index.ts # Session, User, Role, Permission
|
|
67
|
+
│ └─ index.ts
|
|
68
|
+
├─ components/
|
|
69
|
+
│ ├─ ui/ # shadcn primitives (Button, Dialog...)
|
|
70
|
+
│ └─ shared/ # Cross-feature widgets (e.g., Sidebar/)
|
|
71
|
+
│ └─ sidebar/
|
|
72
|
+
│ ├─ sidebar-root.tsx
|
|
73
|
+
│ ├─ sidebar-item.tsx
|
|
74
|
+
│ ├─ sidebar-group.tsx
|
|
75
|
+
│ └─ index.ts # Compound component API
|
|
76
|
+
├─ lib/ # App plumbing (query client, fetcher)
|
|
77
|
+
│ ├─ api-client.ts # fetch/axios wrapper (credentials: 'include')
|
|
78
|
+
│ ├─ query.ts # QueryClient setup/provider
|
|
79
|
+
│ ├─ env.client.ts
|
|
80
|
+
│ ├─ env.server.ts
|
|
81
|
+
│ ├─ cn.ts # tailwind-merge + clsx
|
|
82
|
+
│ └─ logger.ts
|
|
83
|
+
├─ server/ # Server-only logic (auth, DB, RBAC)
|
|
84
|
+
│ ├─ auth/
|
|
85
|
+
│ │ ├─ cookies.ts # read/write httpOnly cookies
|
|
86
|
+
│ │ ├─ tokens.ts # sign/verify/rotate tokens
|
|
87
|
+
│ │ ├─ session.ts # getSession(), requireSession()
|
|
88
|
+
│ │ ├─ rbac.ts # roles, permissions, guards
|
|
89
|
+
│ │ └─ adapters/
|
|
90
|
+
│ │ └─ user-repo.ts # DB access for users & sessions
|
|
91
|
+
│ └─ db/
|
|
92
|
+
│ ├─ client.ts # Postgres connection + Drizzle instance
|
|
93
|
+
│ ├─ schema.ts # Tables & relations
|
|
94
|
+
│ └─ index.ts # DB client
|
|
95
|
+
│ ↳ **Database standard**: PostgreSQL (see `docker-compose.yml` for the local Postgres + pgAdmin stack).
|
|
96
|
+
├─ mocks/ # MSW handlers, test fixtures
|
|
97
|
+
├─ hooks/ # Truly global hooks (useMediaQuery, etc.)
|
|
98
|
+
├─ utils/ # Pure helpers (dates, currency)
|
|
99
|
+
├─ types/ # Global types (User, Pagination)
|
|
100
|
+
├─ config/ # 🔸 single sources of truth (imported everywhere ) Pure, global, app-wide data (no side effects, no async)
|
|
101
|
+
│ ├─ tiers.ts # plans/limits/features
|
|
102
|
+
│ ├─ roles.ts # TEAM_* / PROJECT_* + PERMISSIONS map
|
|
103
|
+
│ ├─ workflows.ts # issue status model (open→archived)
|
|
104
|
+
│ ├─ nav.ts # main/sidebar nav
|
|
105
|
+
│ ├─ settings-nav.ts # settings tabs
|
|
106
|
+
│ └─ ...
|
|
107
|
+
├─ styles/ # globals.css, tailwind.css
|
|
108
|
+
└─ tests/ # Unit/integration/e2e (see §8)
|
|
109
|
+
drizzle/ # migrations & config (outside src)
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
### If have to MOCKUP some data to draft a visual UI
|
|
113
|
+
- It’s frontend-facing sample data (for visual design, Storybook, playground pages).
|
|
114
|
+
- It keeps a clear boundary: server/ = real backend logic; mocks/ = fake, throwaway data.
|
|
115
|
+
```
|
|
116
|
+
src/
|
|
117
|
+
├─ mocks/ # 🔹 all mock data + scenarios for UI
|
|
118
|
+
├─ team.fixtures.ts
|
|
119
|
+
├─ project.fixtures.ts
|
|
120
|
+
├─ issue.fixtures.ts
|
|
121
|
+
├─ user.fixtures.ts
|
|
122
|
+
└─ index.ts
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
Use multiple domain-based files. Keep mocks aligned to real domain
|
|
126
|
+
|
|
127
|
+
Minimal example::
|
|
128
|
+
```typescript
|
|
129
|
+
// src/mocks/team.fixtures.ts
|
|
130
|
+
import type { Team } from '@/features/teams/types'
|
|
131
|
+
|
|
132
|
+
export const MOCK_TEAMS: Team[] = [
|
|
133
|
+
{ id: 'team_1', name: 'Design Squad', slug: 'design-squad', planId: 'free' },
|
|
134
|
+
{ id: 'team_2', name: 'Frontend Guild', slug: 'frontend-guild', planId: 'pro' },
|
|
135
|
+
]
|
|
136
|
+
```
|
|
137
|
+
```typescript
|
|
138
|
+
// src/mocks/project.fixtures.ts
|
|
139
|
+
import type { Project } from '@/features/projects/types'
|
|
140
|
+
|
|
141
|
+
export const MOCK_PROJECTS: Project[] = [
|
|
142
|
+
{
|
|
143
|
+
id: 'proj_1',
|
|
144
|
+
teamId: 'team_1',
|
|
145
|
+
key: 'MKT',
|
|
146
|
+
slug: 'MKT',
|
|
147
|
+
name: 'Marketing Site',
|
|
148
|
+
visibility: 'private',
|
|
149
|
+
},
|
|
150
|
+
// ...
|
|
151
|
+
]
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
```typescript
|
|
155
|
+
// src/mocks/issue.fixtures.ts
|
|
156
|
+
import type { Issue } from '@/features/issues/types'
|
|
157
|
+
import { ISSUE_WORKFLOW } from '@/config/workflows'
|
|
158
|
+
|
|
159
|
+
export const MOCK_ISSUES: Issue[] = [
|
|
160
|
+
{
|
|
161
|
+
id: 'iss_1',
|
|
162
|
+
teamId: 'team_1',
|
|
163
|
+
projectId: 'proj_1',
|
|
164
|
+
key: 'PRJ-129',
|
|
165
|
+
title: 'Product card padding mismatches design',
|
|
166
|
+
status: ISSUE_WORKFLOW.open.key,
|
|
167
|
+
priority: 'high',
|
|
168
|
+
createdAt: new Date().toISOString(),
|
|
169
|
+
// ...
|
|
170
|
+
},
|
|
171
|
+
]
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
Then optionally expose “scenarios” and a simple barrel:
|
|
175
|
+
|
|
176
|
+
```typescript
|
|
177
|
+
// src/mocks/index.ts
|
|
178
|
+
export * from './team.fixtures'
|
|
179
|
+
export * from './project.fixtures'
|
|
180
|
+
export * from './issue.fixtures'
|
|
181
|
+
|
|
182
|
+
// Example scenarios
|
|
183
|
+
import { MOCK_TEAMS } from './team.fixtures'
|
|
184
|
+
import { MOCK_PROJECTS } from './project.fixtures'
|
|
185
|
+
import { MOCK_ISSUES } from './issue.fixtures'
|
|
186
|
+
|
|
187
|
+
export const DEFAULT_TEAM_SCENARIO = {
|
|
188
|
+
teams: MOCK_TEAMS,
|
|
189
|
+
projects: MOCK_PROJECTS,
|
|
190
|
+
issues: MOCK_ISSUES,
|
|
191
|
+
}
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
|
|
195
|
+
### Vite / SPA Variant
|
|
196
|
+
|
|
197
|
+
If not using Next.js, replace `app/` with `pages/` + `app/router.tsx` (React Router), and move server code into your backend service (keep client-only fetchers in `services/` or `lib/`).
|
|
198
|
+
|
|
199
|
+
---
|
|
200
|
+
|
|
201
|
+
## 3) Layer Contracts (Who can import whom)
|
|
202
|
+
|
|
203
|
+
- `app/` can import from: `features/*`, `components/*`, `hooks`, `lib`, `utils`, `config`
|
|
204
|
+
- `features/<name>/components` can import from: its *own* `hooks`, `types`, `utils`, plus `components/ui` & `components/shared`, `lib`, `config`
|
|
205
|
+
- `features/<name>/hooks` can import from: its *own* `api`, `types`, `utils`, and `lib`
|
|
206
|
+
- `features/<name>/api` can import from: `lib` and its own `types`/`utils` (no React imports)
|
|
207
|
+
- `components/ui` may import from: `lib`, `utils` (never from `features/*`)
|
|
208
|
+
- `components/shared` may import from: `components/ui`, `lib`, `utils` (never from `features/*`)
|
|
209
|
+
- `server/*` (auth/db) is server-only; never import from client components
|
|
210
|
+
|
|
211
|
+
**Enforce with ESLint import rules** (e.g., restricted zones).
|
|
212
|
+
|
|
213
|
+
---
|
|
214
|
+
|
|
215
|
+
## 4) Feature Module Anatomy
|
|
216
|
+
|
|
217
|
+
```
|
|
218
|
+
features/issues/
|
|
219
|
+
├─ api/
|
|
220
|
+
│ ├─ get-issues.ts # GET /issues
|
|
221
|
+
│ ├─ get-issue.ts # GET /issues/:id
|
|
222
|
+
│ ├─ create-issue.ts # POST /issues
|
|
223
|
+
│ └─ types.ts # Zod DTOs (transport layer)
|
|
224
|
+
├─ hooks/
|
|
225
|
+
│ ├─ use-issues.ts # list query (React Query)
|
|
226
|
+
│ ├─ use-issue.ts # detail query
|
|
227
|
+
│ └─ use-create-issue.ts # mutation
|
|
228
|
+
├─ components/
|
|
229
|
+
│ ├─ issues-table.tsx
|
|
230
|
+
│ ├─ issue-status-badge.tsx
|
|
231
|
+
│ └─ create-issue-dialog.tsx
|
|
232
|
+
├─ types/
|
|
233
|
+
│ └─ issue.ts # Domain types (Issue, Status, Priority)
|
|
234
|
+
├─ utils/
|
|
235
|
+
│ ├─ map-status-to-color.ts
|
|
236
|
+
│ └─ format-priority.ts
|
|
237
|
+
└─ index.ts # Barrel: exports table, dialog, hooks, types
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
**Flow**: Backend → `api` (validate) → `hooks` (cache) → `components` → `app` page.
|
|
241
|
+
|
|
242
|
+
---
|
|
243
|
+
|
|
244
|
+
## 5) Auth System Scaffold
|
|
245
|
+
|
|
246
|
+
- **Server-first checks**: In `app/(protected)/layout.tsx`, call `getSession()` and redirect to `/sign-in` if missing.
|
|
247
|
+
- **httpOnly cookies**: Store access/refresh tokens only in cookies; rotate refresh on use.
|
|
248
|
+
- **RBAC**: Define `Roles` and permission maps in `server/auth/rbac.ts` and enforce on server mutations.
|
|
249
|
+
- **Client session**: `features/auth/hooks/use-session.ts` calls `/api/auth/me` and caches the user/roles.
|
|
250
|
+
- **Role gating in UI**: `features/auth/components/role-gate.tsx` shows/hides fragments based on roles.
|
|
251
|
+
|
|
252
|
+
---
|
|
253
|
+
|
|
254
|
+
## 6) Shared UI (shadcn & compound widgets)
|
|
255
|
+
|
|
256
|
+
- Put **primitives** in `components/ui/*` (Button, Dialog, Input, Tooltip, ScrollArea).
|
|
257
|
+
- Put cross-feature composites in `components/shared/<widget>/…` with a **compound API** via a barrel:
|
|
258
|
+
```ts
|
|
259
|
+
// components/shared/sidebar/index.ts
|
|
260
|
+
export const Sidebar = Object.assign(SidebarRoot, {
|
|
261
|
+
Item: SidebarItem, Group: SidebarGroup, Separator: SidebarSeparator
|
|
262
|
+
})
|
|
263
|
+
```
|
|
264
|
+
- Never import feature hooks into `components/shared`.
|
|
265
|
+
|
|
266
|
+
---
|
|
267
|
+
|
|
268
|
+
## 7) Naming & Conventions
|
|
269
|
+
|
|
270
|
+
- **Files**: kebab-case (`create-issue-dialog.tsx`, `use-issues.ts`)
|
|
271
|
+
- **Components**: PascalCase (`CreateIssueDialog`)
|
|
272
|
+
- **Hooks**: `useX` (`useIssue`)
|
|
273
|
+
- **API callers**: `verb-noun.ts` (`get-issues.ts`, `create-issue.ts`)
|
|
274
|
+
- **Barrels**: `index.ts` at the feature root to expose only the public surface
|
|
275
|
+
- **Aliases**: `@/src/*` for absolute imports
|
|
276
|
+
|
|
277
|
+
### Barrel File Best Practices
|
|
278
|
+
|
|
279
|
+
Barrel files (`index.ts`) improve import ergonomics but can cause tree-shaking issues and circular dependencies if misused.
|
|
280
|
+
|
|
281
|
+
**✅ DO: Use explicit named exports**
|
|
282
|
+
```ts
|
|
283
|
+
// features/auth/index.ts - GOOD
|
|
284
|
+
export { AuthCard } from "./components/auth-card";
|
|
285
|
+
export { useSession } from "./hooks/use-session";
|
|
286
|
+
export type { Session, User } from "./types";
|
|
287
|
+
```
|
|
288
|
+
|
|
289
|
+
**❌ DON'T: Use wildcard re-exports**
|
|
290
|
+
```ts
|
|
291
|
+
// features/auth/index.ts - AVOID
|
|
292
|
+
export * from "./components";
|
|
293
|
+
export * from "./hooks";
|
|
294
|
+
export * from "./types";
|
|
295
|
+
```
|
|
296
|
+
|
|
297
|
+
**Why explicit exports matter:**
|
|
298
|
+
1. **Better tree-shaking**: Bundlers can statically analyze which exports are used
|
|
299
|
+
2. **Clearer API surface**: The barrel documents the public interface
|
|
300
|
+
3. **Easier debugging**: Circular dependencies are traceable to specific exports
|
|
301
|
+
4. **Faster dev server**: Next.js doesn't parse unused modules
|
|
302
|
+
|
|
303
|
+
**Next.js optimization:**
|
|
304
|
+
The project configures `optimizePackageImports` in `next.config.ts` for automatic tree-shaking of common libraries:
|
|
305
|
+
|
|
306
|
+
```ts
|
|
307
|
+
// next.config.ts
|
|
308
|
+
experimental: {
|
|
309
|
+
optimizePackageImports: [
|
|
310
|
+
"lucide-react",
|
|
311
|
+
"date-fns",
|
|
312
|
+
"@radix-ui/react-icons",
|
|
313
|
+
"lodash-es",
|
|
314
|
+
"framer-motion",
|
|
315
|
+
],
|
|
316
|
+
},
|
|
317
|
+
```
|
|
318
|
+
|
|
319
|
+
**When to use barrels:**
|
|
320
|
+
- Feature roots (`features/issues/index.ts`) - define public API
|
|
321
|
+
- Shared component folders (`components/shared/sidebar/index.ts`)
|
|
322
|
+
|
|
323
|
+
**When to avoid barrels:**
|
|
324
|
+
- Internal sub-folders with many files (import directly instead)
|
|
325
|
+
- When you're consistently hitting circular dependency errors
|
|
326
|
+
|
|
327
|
+
|
|
328
|
+
---
|
|
329
|
+
|
|
330
|
+
## 8) Testing & Tooling
|
|
331
|
+
|
|
332
|
+
- **Unit**: Vitest + React Testing Library; name as `<Component>.test.tsx`
|
|
333
|
+
- **E2E**: Playwright/Cypress for critical flows (login, create issue)
|
|
334
|
+
- **Coverage**: ≥ 80% lines for features that are business-critical
|
|
335
|
+
- **CI**: `typecheck` → `lint` → `test` → `build` (fail fast)
|
|
336
|
+
|
|
337
|
+
---
|
|
338
|
+
|
|
339
|
+
## 9) Environment & Commands
|
|
340
|
+
|
|
341
|
+
- **Node**: v20 LTS; keep the version pinned in `.nvmrc`
|
|
342
|
+
- **Package manager**: `bun`
|
|
343
|
+
- **Common scripts**:
|
|
344
|
+
```jsonc
|
|
345
|
+
{
|
|
346
|
+
"scripts": {
|
|
347
|
+
"dev": "next dev",
|
|
348
|
+
"build": "next build",
|
|
349
|
+
"start": "next start",
|
|
350
|
+
"typecheck": "tsc --noEmit",
|
|
351
|
+
"lint": "eslint .",
|
|
352
|
+
"format": "prettier --write .",
|
|
353
|
+
"test": "vitest run",
|
|
354
|
+
"test:ui": "playwright test"
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
```
|
|
358
|
+
|
|
359
|
+
> Tip: Keep pre-commit hooks under 5 seconds and require lint + test to pass before PRs merge.
|
|
360
|
+
|
|
361
|
+
---
|
|
362
|
+
|
|
363
|
+
|
|
364
|
+
## 10) Example Imports
|
|
365
|
+
|
|
366
|
+
tsconfig.json has path aliases like:
|
|
367
|
+
|
|
368
|
+
```json
|
|
369
|
+
"compilerOptions": {
|
|
370
|
+
"paths": {
|
|
371
|
+
"@/*": ["./src/*"]
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
```
|
|
375
|
+
|
|
376
|
+
```ts
|
|
377
|
+
// Page composing a feature
|
|
378
|
+
import { IssuesTable, CreateIssueDialog, useIssues } from "@/features/issues"
|
|
379
|
+
|
|
380
|
+
// Shared widget
|
|
381
|
+
import { Sidebar } from "@/components/shared/sidebar"
|
|
382
|
+
|
|
383
|
+
// App plumbing
|
|
384
|
+
import { queryClient } from "@/lib/query"
|
|
385
|
+
```
|
|
386
|
+
|
|
387
|
+
---
|
|
388
|
+
|
|
389
|
+
## 11) Next.js `proxy.ts` (formerly Middleware)
|
|
390
|
+
|
|
391
|
+
- Next.js 16 deprecated the `middleware.ts` convention in favor of `proxy.ts` to clarify that the file sits in front of the app and should be used **only as a last-resort network proxy** (runs at the Edge by default).
|
|
392
|
+
- If you still have `middleware.ts`, rename it to `proxy.ts` **and** rename the exported handler to `export function proxy()`; Next provides a codemod: `npx @next/codemod@canary middleware-to-proxy`.
|
|
393
|
+
- Keep Proxy usage minimal—prefer App Router primitives (route handlers, redirects, rewrites, headers) or server components whenever possible.
|
|
394
|
+
- When you must use Proxy:
|
|
395
|
+
- Treat it as an HTTP boundary (read/modify requests, set headers, early redirects) but avoid app logic or heavy work.
|
|
396
|
+
- Remember it executes for every matching request, so keep it stateless and fast.
|
|
397
|
+
- Document any Proxy behavior in feature ADRs so other devs know why Middleware wasn’t sufficient.
|
|
398
|
+
- If you need multiple behaviors, consolidate them inside `src/proxy.ts` with clear guards; avoid scattering cross-cutting logic throughout the app.
|
|
399
|
+
|
|
400
|
+
This scaffold keeps features portable, boundaries enforceable, and the developer experience predictable as your app scales.
|
|
401
|
+
|
|
402
|
+
---
|
|
403
|
+
|
|
404
|
+
## 12) Thin Pages & Feature Screens
|
|
405
|
+
|
|
406
|
+
- Page.tsx (route-only)
|
|
407
|
+
- Server component that reads `searchParams`, cookies, headers.
|
|
408
|
+
- Performs auth/tenant gating and light Zod validation.
|
|
409
|
+
- Renders a single feature "Screen" with minimal props.
|
|
410
|
+
- Owns `loading.tsx`, `error.tsx`, `not-found.tsx` for the route.
|
|
411
|
+
|
|
412
|
+
- Feature Screens (contained UI)
|
|
413
|
+
- Live in `src/features/<feature>/screens/*-screen.tsx`.
|
|
414
|
+
- Client components that compose feature hooks + presentational components.
|
|
415
|
+
- All data flows through `features/<feature>/api` and `features/<feature>/hooks`.
|
|
416
|
+
- No cross-feature imports.
|
|
417
|
+
|
|
418
|
+
- Feature components (presentational)
|
|
419
|
+
- Live in `src/features/<feature>/components/*` and stay small/pure.
|
|
420
|
+
- Do not fetch; receive state/data via props or feature hooks.
|
|
421
|
+
- Co-locate tests and stories with components.
|
|
422
|
+
|
|
423
|
+
- Shared primitives
|
|
424
|
+
- `src/components/ui/*` (shadcn) and `src/components/shared/*` (cross-feature widgets).
|
|
425
|
+
- Must not import from `features/*`.
|
|
426
|
+
|
|
427
|
+
- Do / Don’t
|
|
428
|
+
- Do keep `page.tsx` tiny; push UI into feature Screens.
|
|
429
|
+
- Do keep network calls in feature `api/` and `hooks/` layers.
|
|
430
|
+
- Do use shared components only for generic UI.
|
|
431
|
+
- Don’t import `features/*` from `components/shared` or `components/ui`.
|
|
432
|
+
- Don’t let leaf components hit the network.
|
|
433
|
+
|
|
434
|
+
Minimal example:
|
|
435
|
+
|
|
436
|
+
```ts
|
|
437
|
+
// app route (thin)
|
|
438
|
+
// src/app/(protected)/(team)/issues/page.tsx
|
|
439
|
+
import IssuesListScreen from "@/features/issues/screens/issues-list-screen"
|
|
440
|
+
import { z } from "zod"
|
|
441
|
+
import { cookies } from "next/headers"
|
|
442
|
+
import { redirect } from "next/navigation"
|
|
443
|
+
|
|
444
|
+
const Search = z.object({
|
|
445
|
+
status: z.enum(["open","in_progress","in_review","resolved","archived"]).optional(),
|
|
446
|
+
q: z.string().optional(),
|
|
447
|
+
page: z.coerce.number().min(1).default(1),
|
|
448
|
+
})
|
|
449
|
+
|
|
450
|
+
export default function IssuesPage({ searchParams }: { searchParams: Record<string, string | string[] | undefined> }) {
|
|
451
|
+
const teamId = cookies().get("team_id")?.value
|
|
452
|
+
if (!teamId) redirect("/select-team")
|
|
453
|
+
const search = Search.safeParse(searchParams).success ? Search.parse(searchParams) : { page: 1 }
|
|
454
|
+
return <IssuesListScreen teamId={teamId} search={search} />
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
// feature screen (contained)
|
|
458
|
+
// src/features/issues/screens/issues-list-screen.tsx
|
|
459
|
+
"use client"
|
|
460
|
+
import { useIssues } from "@/hooks/use-issues"
|
|
461
|
+
import { IssuesTable } from "@/components/issues-table"
|
|
462
|
+
|
|
463
|
+
export default function IssuesListScreen({ teamId, search }: { teamId: string; search: { status?: string; q?: string; page: number } }) {
|
|
464
|
+
const { data, isLoading } = useIssues({ teamId, ...search })
|
|
465
|
+
return <IssuesTable rows={data?.items ?? []} loading={isLoading} />
|
|
466
|
+
}
|
|
467
|
+
```
|
|
468
|
+
|
|
469
|
+
## Testing
|
|
470
|
+
This project uses **Vitest** for unit/integration tests and **Playwright** for E2E tests.
|
|
471
|
+
### ⚠️ Important
|
|
472
|
+
**ALWAYS** use `bun run test` (or `vitest`).
|
|
473
|
+
**NEVER** use `bun test` (Bun's native runner), as it ignores our test configuration and will write junk data to your local database.
|
|
474
|
+
### Commands
|
|
475
|
+
```bash
|
|
476
|
+
# Run unit & integration tests (Safe - uses in-memory DB)
|
|
477
|
+
bun run test
|
|
478
|
+
# Run tests in watch mode
|
|
479
|
+
bun run test:watch
|
|
480
|
+
# Run E2E tests (Uses local DB)
|
|
481
|
+
bun run test:ui
|
|
482
|
+
```
|
|
483
|
+
|
|
484
|
+
---
|
|
485
|
+
|
|
486
|
+
## 13) Extended Documentation
|
|
487
|
+
|
|
488
|
+
For detailed topic-specific guidance, see the `docs/` folder:
|
|
489
|
+
|
|
490
|
+
### Architecture
|
|
491
|
+
- [RBAC & Permissions](docs/architecture/RBAC.md) - Role-based access control system
|
|
492
|
+
- [Team Plan Architecture](docs/architecture/TEAM_PLAN_ARCHITECTURE.md) - Subscription tiers & limits
|
|
493
|
+
- [Security](docs/architecture/SECURITY.md) - Security practices & guidelines
|
|
494
|
+
- [Loading Architecture](docs/architecture/LOADING_ARCHITECTURE.md) - Loading states & patterns
|
|
495
|
+
|
|
496
|
+
### Development
|
|
497
|
+
- [Local Development](docs/development/LOCAL_DEVELOPMENT.md) - Getting started locally
|
|
498
|
+
- [Environment Config](docs/development/ENVIRONMENT_CONFIG.md) - Environment variables
|
|
499
|
+
- [Remote Database Setup](docs/development/REMOTE_DATABASE_SETUP.md) - Production DB setup
|
|
500
|
+
- [Supabase Local Setup](docs/development/SUPABASE_LOCAL_SETUP.md) - Local Supabase config
|
|
501
|
+
|
|
502
|
+
### Testing
|
|
503
|
+
- [Testing Strategy](docs/testing/TESTING.md) - Full testing guidelines
|
|
504
|
+
- [Testing Quick Start](docs/testing/TESTING_QUICK_START.md) - Quick reference
|
|
505
|
+
|
|
506
|
+
### CI/CD & Monitoring
|
|
507
|
+
- [CI/CD Monitoring](docs/CI_CD_MONITORING.md) - Pipeline monitoring
|
|
508
|
+
- [CI/CD Alerts Setup](docs/CI_CD_ALERTS_SETUP.md) - Alert configuration
|
|
509
|
+
|
|
510
|
+
### Other
|
|
511
|
+
- [Media Storage](docs/MEDIA_STORAGE.md) - File upload & storage
|
|
512
|
+
- [Versioning](docs/VERSIONING.md) - Version management
|
|
513
|
+
|
|
514
|
+
---
|
|
515
|
+
|
|
516
|
+
## 14) Feature Modules
|
|
517
|
+
|
|
518
|
+
Current feature modules in `src/features/`:
|
|
519
|
+
|
|
520
|
+
| Feature | Purpose |
|
|
521
|
+
|---------|---------|
|
|
522
|
+
| `annotations` | Issue annotation & markup system |
|
|
523
|
+
| `auth` | Authentication, sessions, social login |
|
|
524
|
+
| `email-preview` | Email template preview tooling |
|
|
525
|
+
| `issues` | Core issue tracking functionality |
|
|
526
|
+
| `landing` | Marketing/landing page components |
|
|
527
|
+
| `legal` | Terms of service, privacy policy |
|
|
528
|
+
| `onboarding` | User onboarding flows |
|
|
529
|
+
| `projects` | Project management & settings |
|
|
530
|
+
| `team-settings` | Team configuration & billing |
|
|
531
|
+
| `teams` | Team management & membership |
|
|
532
|
+
| `user-settings` | User preferences & profile |
|
|
533
|
+
|
|
534
|
+
Each feature follows the standard anatomy:
|
|
535
|
+
```
|
|
536
|
+
features/<name>/
|
|
537
|
+
├─ api/ # Fetchers + DTO schemas
|
|
538
|
+
├─ hooks/ # React Query wrappers
|
|
539
|
+
├─ components/ # Feature UI
|
|
540
|
+
├─ screens/ # Feature screens
|
|
541
|
+
├─ types/ # Domain models
|
|
542
|
+
├─ utils/ # Feature helpers
|
|
543
|
+
└─ index.ts # Barrel exports
|
|
544
|
+
```
|
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# [0.4.0-beta.1](https://github.com/BYKHD/ui-syncup/compare/v0.3.14...v0.4.0-beta.1) (2026-03-21)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### Features
|
|
5
|
+
|
|
6
|
+
* Configure semantic-release for automated versioning with beta support from `develop` and temporarily disable the setup page redirect. ([6f00c0e](https://github.com/BYKHD/ui-syncup/commit/6f00c0e2a4a5134a5dd37b8c4e842deacf268da7))
|
|
7
|
+
* Enable setup completion check and redirect to sign-in page. ([8b28b90](https://github.com/BYKHD/ui-syncup/commit/8b28b9007598fd8288290b9707872608c1f52923))
|
|
8
|
+
|
|
9
|
+
# Changelog
|
|
10
|
+
|
|
11
|
+
All notable changes to this project will be documented in this file.
|
|
12
|
+
|
|
13
|
+
This file is maintained by [semantic-release](https://github.com/semantic-release/semantic-release).
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## [0.3.0] - 2026-03-19
|
|
18
|
+
|
|
19
|
+
### Features
|
|
20
|
+
|
|
21
|
+
- **Docker-native self-hosting** — production `docker/compose.yml` with profile-gated bundled services (`--profile db`, `--profile cache`, `--profile storage`)
|
|
22
|
+
- **CLI package** (`ui-syncup` on npm) — three-command lifecycle: `init` (setup wizard), `upgrade` (pull + restart), `doctor` (health diagnostics)
|
|
23
|
+
- **One-command installer** — `install.sh` bash wizard, no Bun or Node required on the host
|
|
24
|
+
- **Multi-arch Docker images** — `linux/amd64` + `linux/arm64` published to GHCR (`ghcr.io/bykhd/ui-syncup`) and Docker Hub (`bykhd/ui-syncup`)
|
|
25
|
+
- **Automated releases** — semantic-release pipeline: CHANGELOG generation, GitHub release, npm CLI publish, Docker image tagging
|
|
26
|
+
- **CI pipeline** — lint, typecheck, and test jobs on every PR via GitHub Actions
|
|
27
|
+
- **Health endpoint** — `GET /api/health` returns `{ status, version, timestamp }`; `HEAD /api/health` for uptime checks
|
|
28
|
+
- **OSS community files** — `CONTRIBUTING.md`, `CODE_OF_CONDUCT.md`, `SECURITY.md`, GitHub issue templates, PR template
|
|
29
|
+
|
|
30
|
+
### Changes
|
|
31
|
+
|
|
32
|
+
- Dockerfile runner switched from `node:20-alpine` to `oven/bun:1-alpine` to support `bun run db:migrate` at container start
|
|
33
|
+
- `docker-compose.override.yml` → `docker/compose.dev.yml`
|
|
34
|
+
- `docker-compose.minio.yml` → `docker/compose.dev-minio.yml`
|
|
35
|
+
- CLI rebuilt as a standalone npm package (`cli/`) — removed old `up`, `down`, `reset`, `purge` commands
|
|
36
|
+
|
|
37
|
+
---
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# Contributor Covenant Code of Conduct
|
|
2
|
+
|
|
3
|
+
## Our Pledge
|
|
4
|
+
|
|
5
|
+
We pledge to make participation in our project and community a harassment-free
|
|
6
|
+
experience for everyone, regardless of age, body size, disability, ethnicity,
|
|
7
|
+
gender identity, level of experience, nationality, personal appearance, race,
|
|
8
|
+
religion, or sexual identity and orientation.
|
|
9
|
+
|
|
10
|
+
## Our Standards
|
|
11
|
+
|
|
12
|
+
Positive behavior: welcoming language, respectful disagreement, constructive feedback.
|
|
13
|
+
|
|
14
|
+
Unacceptable behavior: harassment, trolling, personal attacks, publishing private information.
|
|
15
|
+
|
|
16
|
+
## Enforcement
|
|
17
|
+
|
|
18
|
+
Report violations to the project maintainers. All reports will be reviewed promptly
|
|
19
|
+
and handled confidentially.
|
|
20
|
+
|
|
21
|
+
Full version: https://www.contributor-covenant.org/version/2/1/code_of_conduct/
|
package/CONTRIBUTING.md
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# Contributing to UI SyncUp
|
|
2
|
+
|
|
3
|
+
Thank you for contributing! All contributions are welcome.
|
|
4
|
+
|
|
5
|
+
## Development Setup
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
git clone https://github.com/BYKHD/ui-syncup.git
|
|
9
|
+
cd ui-syncup
|
|
10
|
+
bun install
|
|
11
|
+
cp .env.example .env.local
|
|
12
|
+
# Fill in required vars (DATABASE_URL, REDIS_URL, etc.)
|
|
13
|
+
bun run dev
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
## Commit Convention
|
|
17
|
+
|
|
18
|
+
We use [Conventional Commits](https://www.conventionalcommits.org/):
|
|
19
|
+
|
|
20
|
+
| Prefix | Effect |
|
|
21
|
+
|--------|--------|
|
|
22
|
+
| `feat:` | Minor version bump |
|
|
23
|
+
| `fix:` | Patch version bump |
|
|
24
|
+
| `feat!:` / `BREAKING CHANGE:` | Major version bump |
|
|
25
|
+
| `chore:`, `docs:`, `ci:` | No version bump |
|
|
26
|
+
|
|
27
|
+
## Pull Request Process
|
|
28
|
+
|
|
29
|
+
1. Fork and create your branch from `main`
|
|
30
|
+
2. Run `bun run lint && bun run typecheck && bun run test` — all must pass
|
|
31
|
+
3. Open a PR using the PR template
|
|
32
|
+
4. Wait for CI to pass and a maintainer review
|