@nexttylabs/echo 0.3.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (248) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/app/(public)/[organizationSlug]/roadmap/page.tsx +19 -1
  3. package/app/api/admin/backup/route.ts +22 -4
  4. package/app/api/auth/register/handler.ts +1 -2
  5. package/lib/auth/config.ts +0 -7
  6. package/lib/db/migrations/0000_needy_leech.sql +335 -0
  7. package/lib/db/migrations/meta/0000_snapshot.json +2186 -1
  8. package/lib/db/migrations/meta/_journal.json +2 -135
  9. package/lib/db/schema/auth.ts +0 -1
  10. package/lib/db/schema/index.ts +0 -1
  11. package/lib/portal/public-context.tsx +5 -0
  12. package/package.json +20 -1
  13. package/.changeset/README.md +0 -21
  14. package/.changeset/config.json +0 -11
  15. package/.changeset/cozy-ghosts-care.md +0 -5
  16. package/.changeset/sharp-lines-stand.md +0 -5
  17. package/.changeset/sour-doodles-eat.md +0 -5
  18. package/.changeset/tender-moose-shop.md +0 -5
  19. package/.github/pull_request_template.md +0 -13
  20. package/.github/workflows/ci.yml +0 -41
  21. package/.github/workflows/publish.yml +0 -44
  22. package/.github/workflows/release.yml +0 -73
  23. package/AGENTS.md +0 -92
  24. package/Dockerfile +0 -57
  25. package/Makefile +0 -77
  26. package/app/api/internal/domain-lookup/route.ts +0 -67
  27. package/bun.lock +0 -2503
  28. package/components/portal/project-switcher.tsx +0 -20
  29. package/docker-compose.dev.yml +0 -26
  30. package/docker-compose.yml +0 -98
  31. package/docs/architecture.md +0 -259
  32. package/docs/component-inventory.md +0 -261
  33. package/docs/database-migrations.md +0 -76
  34. package/docs/development-guide.md +0 -209
  35. package/docs/e2e-user-flows.csv +0 -31
  36. package/docs/er-diagram-feedback.mmd +0 -138
  37. package/docs/er-diagram.mmd +0 -281
  38. package/docs/i18n-check-report.md +0 -296
  39. package/docs/index.md +0 -214
  40. package/docs/logic-chain.md +0 -94
  41. package/docs/plans/2026-01-02-database-migration-scripts.md +0 -496
  42. package/docs/plans/2026-01-02-user-login-design.md +0 -37
  43. package/docs/plans/2026-01-02-user-login.md +0 -437
  44. package/docs/plans/2026-01-02-user-registration-design.md +0 -47
  45. package/docs/plans/2026-01-02-user-registration.md +0 -628
  46. package/docs/plans/2026-01-03-roles-permissions-design.md +0 -20
  47. package/docs/plans/2026-01-03-roles-permissions.md +0 -266
  48. package/docs/plans/2026-01-05-authentication-middleware.md +0 -207
  49. package/docs/plans/2026-01-05-member-removal.md +0 -186
  50. package/docs/plans/2026-01-05-organization-creation.md +0 -374
  51. package/docs/plans/2026-01-05-rbac-middleware.md +0 -112
  52. package/docs/plans/2026-01-05-role-configuration.md +0 -441
  53. package/docs/plans/2026-01-06-file-upload-support.md +0 -804
  54. package/docs/plans/2026-01-06-permission-check-hook.md +0 -155
  55. package/docs/plans/2026-01-06-resource-ownership-check.md +0 -231
  56. package/docs/plans/2026-01-07-feedback-tracking-link.md +0 -459
  57. package/docs/plans/2026-01-09-logout-redirect-design.md +0 -52
  58. package/docs/plans/2026-01-09-phase2-3-plan.md +0 -654
  59. package/docs/plans/2026-01-09-portal-execution-plan.md +0 -408
  60. package/docs/plans/2026-01-09-project-delete-feature-design.md +0 -163
  61. package/docs/plans/2026-01-09-project-delete-implementation.md +0 -451
  62. package/docs/plans/2026-01-09-project-edit-delete-design.md +0 -52
  63. package/docs/plans/2026-01-09-settings-center-design.md +0 -114
  64. package/docs/plans/2026-01-09-settings-center.md +0 -948
  65. package/docs/plans/2026-01-10-organization-only-design.md +0 -66
  66. package/docs/plans/2026-01-10-organization-only-implementation.md +0 -433
  67. package/docs/plans/2026-01-10-portal-settings-restructure-plan.md +0 -18
  68. package/docs/plans/2026-01-10-project-settings-tabs-design-implementation.md +0 -296
  69. package/docs/plans/2026-01-14-e2e-playwright-feedback.md +0 -173
  70. package/docs/plans/2026-01-15-feedback-management-org-context-design.md +0 -82
  71. package/docs/plans/2026-01-15-feedback-management-org-context-implementation-plan.md +0 -521
  72. package/docs/plans/2026-01-16-admin-feedback-filters-design.md +0 -75
  73. package/docs/plans/2026-01-16-admin-feedback-filters-implementation.md +0 -293
  74. package/docs/plans/2026-01-16-admin-feedback-route-consolidation.md +0 -180
  75. package/docs/plans/2026-01-16-e2e-test-fixes.md +0 -158
  76. package/docs/plans/2026-01-17-admin-feedback-filters.md +0 -214
  77. package/docs/plans/2026-01-17-admin-feedback-improvements.md +0 -453
  78. package/docs/plans/2026-01-18-changesets-design.md +0 -40
  79. package/docs/product_changes.md +0 -37
  80. package/docs/project-overview.md +0 -159
  81. package/docs/project-scan-report.json +0 -104
  82. package/docs/route-role-visibility.md +0 -51
  83. package/docs/source-tree-analysis.md +0 -150
  84. package/docs/testing/delete-project-manual-tests.md +0 -18
  85. package/docs/user-story-tracking.md +0 -191
  86. package/eslint.config.mjs +0 -19
  87. package/lib/db/migrations/.gitkeep +0 -0
  88. package/lib/db/migrations/0000_cynical_gladiator.sql +0 -53
  89. package/lib/db/migrations/0001_wandering_sunfire.sql +0 -27
  90. package/lib/db/migrations/0002_shallow_speedball.sql +0 -1
  91. package/lib/db/migrations/0003_add_org_description.sql +0 -1
  92. package/lib/db/migrations/0003_boring_wild_pack.sql +0 -13
  93. package/lib/db/migrations/0004_windy_tyrannus.sql +0 -27
  94. package/lib/db/migrations/0005_perpetual_doorman.sql +0 -5
  95. package/lib/db/migrations/0006_aberrant_captain_midlands.sql +0 -13
  96. package/lib/db/migrations/0007_clever_captain_cross.sql +0 -14
  97. package/lib/db/migrations/0008_sparkling_pandemic.sql +0 -2
  98. package/lib/db/migrations/0009_happy_black_tom.sql +0 -29
  99. package/lib/db/migrations/0010_kind_junta.sql +0 -8
  100. package/lib/db/migrations/0011_mute_squadron_supreme.sql +0 -25
  101. package/lib/db/migrations/0012_giant_power_man.sql +0 -24
  102. package/lib/db/migrations/0013_damp_titanium_man.sql +0 -17
  103. package/lib/db/migrations/0014_blue_alice.sql +0 -18
  104. package/lib/db/migrations/0015_webhook_tables.sql +0 -41
  105. package/lib/db/migrations/0016_github_integration.sql +0 -30
  106. package/lib/db/migrations/0016_overjoyed_ghost_rider.sql +0 -22
  107. package/lib/db/migrations/0017_slimy_inhumans.sql +0 -6
  108. package/lib/db/migrations/0018_same_spitfire.sql +0 -1
  109. package/lib/db/migrations/0019_jittery_loners.sql +0 -16
  110. package/lib/db/migrations/0019_remove_projects_add_org_settings.sql +0 -14
  111. package/lib/db/migrations/meta/0001_snapshot.json +0 -553
  112. package/lib/db/migrations/meta/0002_snapshot.json +0 -560
  113. package/lib/db/migrations/meta/0003_snapshot.json +0 -650
  114. package/lib/db/migrations/meta/0004_snapshot.json +0 -852
  115. package/lib/db/migrations/meta/0005_snapshot.json +0 -900
  116. package/lib/db/migrations/meta/0006_snapshot.json +0 -1011
  117. package/lib/db/migrations/meta/0007_snapshot.json +0 -1125
  118. package/lib/db/migrations/meta/0008_snapshot.json +0 -1146
  119. package/lib/db/migrations/meta/0009_snapshot.json +0 -1386
  120. package/lib/db/migrations/meta/0010_snapshot.json +0 -1419
  121. package/lib/db/migrations/meta/0011_snapshot.json +0 -1615
  122. package/lib/db/migrations/meta/0012_snapshot.json +0 -1805
  123. package/lib/db/migrations/meta/0013_snapshot.json +0 -1948
  124. package/lib/db/migrations/meta/0014_snapshot.json +0 -2082
  125. package/lib/db/migrations/meta/0015_snapshot.json +0 -2476
  126. package/lib/db/migrations/meta/0016_snapshot.json +0 -2633
  127. package/lib/db/migrations/meta/0017_snapshot.json +0 -2680
  128. package/lib/db/migrations/meta/0018_snapshot.json +0 -2686
  129. package/lib/db/migrations/meta/0019_snapshot.json +0 -2741
  130. package/lib/db/schema/projects.ts +0 -145
  131. package/lib/db/schema/user-profiles.ts +0 -31
  132. package/lib/validations/projects.ts +0 -49
  133. package/next-env.d.ts +0 -6
  134. package/playwright.config.ts +0 -44
  135. package/proxy.test.ts +0 -131
  136. package/proxy.ts +0 -190
  137. package/scripts/backup-db.sh +0 -57
  138. package/scripts/backup-db.ts +0 -24
  139. package/scripts/generate-openapi.ts +0 -22
  140. package/scripts/migration-helper.ts +0 -39
  141. package/scripts/pre-deploy.ts +0 -75
  142. package/scripts/restore-db.sh +0 -60
  143. package/scripts/rollback.ts +0 -72
  144. package/scripts/seed-tags.ts +0 -48
  145. package/tests/api/feedback-bulk.test.ts +0 -47
  146. package/tests/api/feedback-by-id.test.ts +0 -67
  147. package/tests/api/feedback-comments-route-import.test.ts +0 -26
  148. package/tests/api/feedback-create.test.ts +0 -71
  149. package/tests/api/feedback-delete.test.ts +0 -160
  150. package/tests/api/feedback-filter.test.ts +0 -250
  151. package/tests/api/feedback-list.test.ts +0 -234
  152. package/tests/api/feedback-route-assignee-condition.test.ts +0 -32
  153. package/tests/api/feedback-similar.test.ts +0 -46
  154. package/tests/api/feedback-sort.test.ts +0 -261
  155. package/tests/api/feedback-status-enum.test.ts +0 -49
  156. package/tests/api/feedback-status-filter.test.ts +0 -117
  157. package/tests/api/feedback-submit-on-behalf.test.ts +0 -269
  158. package/tests/api/feedback.test.ts +0 -175
  159. package/tests/api/identify-jwt.test.ts +0 -25
  160. package/tests/api/invitation-accept.test.ts +0 -213
  161. package/tests/api/organization-invitations.test.ts +0 -186
  162. package/tests/api/organization-members-list.test.ts +0 -79
  163. package/tests/api/organization-members.test.ts +0 -340
  164. package/tests/api/organizations.test.ts +0 -149
  165. package/tests/api/register.test.ts +0 -112
  166. package/tests/api/upload.test.ts +0 -103
  167. package/tests/api/vote.test.ts +0 -82
  168. package/tests/app/admin-feedback-detail-page.test.tsx +0 -25
  169. package/tests/app/admin-feedback-list-page.test.tsx +0 -25
  170. package/tests/app/admin-feedback-new-page.test.tsx +0 -25
  171. package/tests/app/health-route-helpers.test.ts +0 -27
  172. package/tests/app/login-page.test.ts +0 -26
  173. package/tests/app/portal-page.test.ts +0 -29
  174. package/tests/app/project-portal-overview.test.tsx +0 -25
  175. package/tests/app/widget-page-import.test.ts +0 -25
  176. package/tests/components/create-post-dialog-defaults.test.ts +0 -43
  177. package/tests/components/feedback/duplicate-suggestions-inline.test.tsx +0 -27
  178. package/tests/components/feedback/embedded-feedback-form.test.tsx +0 -96
  179. package/tests/components/feedback/feedback-detail.test.tsx +0 -25
  180. package/tests/components/feedback/feedback-stats.test.tsx +0 -49
  181. package/tests/components/feedback-bulk-actions.test.tsx +0 -39
  182. package/tests/components/feedback-i18n-keys.test.ts +0 -70
  183. package/tests/components/feedback-list-controls-compile.test.ts +0 -25
  184. package/tests/components/feedback-list-controls.test.tsx +0 -204
  185. package/tests/components/feedback-list-item.test.tsx +0 -67
  186. package/tests/components/landing/hero.test.tsx +0 -46
  187. package/tests/components/layout/language-switcher.test.tsx +0 -25
  188. package/tests/components/layout/sidebar.test.tsx +0 -157
  189. package/tests/components/login-form.test.ts +0 -25
  190. package/tests/components/organization-form.test.ts +0 -32
  191. package/tests/components/organization-switcher.test.ts +0 -25
  192. package/tests/components/pagination.test.tsx +0 -43
  193. package/tests/components/portal-overview.test.tsx +0 -25
  194. package/tests/components/profile-form.test.tsx +0 -139
  195. package/tests/components/role-selector.test.ts +0 -31
  196. package/tests/components/status-chart.test.tsx +0 -90
  197. package/tests/e2e/auth.e2e.ts +0 -323
  198. package/tests/e2e/feedback-actions.e2e.ts +0 -471
  199. package/tests/e2e/feedback-attachment.e2e.ts +0 -168
  200. package/tests/e2e/feedback-customer.e2e.ts +0 -226
  201. package/tests/e2e/feedback-management.e2e.ts +0 -565
  202. package/tests/e2e/feedback-submit.e2e.ts +0 -133
  203. package/tests/e2e/feedback-view.e2e.ts +0 -297
  204. package/tests/e2e/fixtures/test-data.ts +0 -235
  205. package/tests/e2e/health-check.e2e.ts +0 -230
  206. package/tests/e2e/helpers/test-utils-helpers.test.ts +0 -43
  207. package/tests/e2e/helpers/test-utils.ts +0 -298
  208. package/tests/e2e/integration-placeholders.e2e.ts +0 -199
  209. package/tests/e2e/organization.e2e.ts +0 -292
  210. package/tests/e2e/permissions.e2e.ts +0 -424
  211. package/tests/e2e/project-widget.e2e.ts +0 -63
  212. package/tests/feedback/filters.test.ts +0 -29
  213. package/tests/hooks/use-permissions.test.ts +0 -52
  214. package/tests/lib/ai/classifier.test.ts +0 -104
  215. package/tests/lib/ai/duplicate-detector.test.ts +0 -234
  216. package/tests/lib/attachments-schema.test.ts +0 -30
  217. package/tests/lib/auth/session.test.ts +0 -49
  218. package/tests/lib/auth-client.test.ts +0 -37
  219. package/tests/lib/auth-config.test.ts +0 -26
  220. package/tests/lib/feedback-prefill.test.ts +0 -52
  221. package/tests/lib/feedback-processor.test.ts +0 -41
  222. package/tests/lib/feedback-schema.test.ts +0 -33
  223. package/tests/lib/file-validator.test.ts +0 -48
  224. package/tests/lib/get-feedback-by-id.test.ts +0 -37
  225. package/tests/lib/invitations.test.ts +0 -35
  226. package/tests/lib/login-schema.test.ts +0 -36
  227. package/tests/lib/org-context.test.ts +0 -95
  228. package/tests/lib/organization-access.test.ts +0 -44
  229. package/tests/lib/organization-member-role-schema.test.ts +0 -41
  230. package/tests/lib/permissions.test.ts +0 -88
  231. package/tests/lib/portal-analytics.test.ts +0 -25
  232. package/tests/lib/portal-contributors.test.ts +0 -25
  233. package/tests/lib/portal-copy.test.ts +0 -27
  234. package/tests/lib/portal-i18n.test.ts +0 -30
  235. package/tests/lib/portal-leaderboard-settings.test.ts +0 -25
  236. package/tests/lib/portal-modules.test.ts +0 -25
  237. package/tests/lib/portal-seo.test.ts +0 -25
  238. package/tests/lib/portal-sharing.test.ts +0 -25
  239. package/tests/lib/portal-sorting.test.ts +0 -25
  240. package/tests/lib/portal-theme.test.ts +0 -25
  241. package/tests/lib/rate-limit.test.ts +0 -142
  242. package/tests/lib/resolve-locale.test.ts +0 -34
  243. package/tests/lib/services/backup.test.ts +0 -145
  244. package/tests/lib/user-organizations.test.ts +0 -42
  245. package/tests/lib/user-role-schema.test.ts +0 -33
  246. package/tests/lib/user-schema.test.ts +0 -25
  247. package/tests/setup.ts +0 -74
  248. package/vercel.json +0 -4
@@ -1,20 +0,0 @@
1
- /*
2
- * Copyright (c) 2026 Echo Team
3
- *
4
- * This program is free software: you can redistribute it and/or modify
5
- * it under the terms of the GNU Affero General Public License as published by
6
- * the Free Software Foundation, either version 3 of the License, or
7
- * (at your option) any later version.
8
- *
9
- * This program is distributed in the hope that it will be useful,
10
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
11
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
- * GNU Affero General Public License for more details.
13
- *
14
- * You should have received a copy of the GNU Affero General Public License
15
- * along with this program. If not, see <https://www.gnu.org/licenses/>.
16
- */
17
-
18
- export function ProjectSwitcher() {
19
- return null;
20
- }
@@ -1,26 +0,0 @@
1
- # docker-compose.dev.yml
2
- version: "3.9"
3
-
4
- services:
5
- postgres:
6
- image: postgres:18-alpine
7
- container_name: echo-postgres-dev
8
- restart: unless-stopped
9
- environment:
10
- POSTGRES_USER: echo
11
- POSTGRES_PASSWORD: echo
12
- POSTGRES_DB: echo_dev
13
- volumes:
14
- - postgres_dev_data:/var/lib/postgresql/data
15
- - ./db/init:/docker-entrypoint-initdb.d
16
- ports:
17
- - "5433:5432"
18
- networks:
19
- - echo-dev-network
20
-
21
- volumes:
22
- postgres_dev_data:
23
-
24
- networks:
25
- echo-dev-network:
26
- driver: bridge
@@ -1,98 +0,0 @@
1
- version: "3.9"
2
-
3
- services:
4
- # PostgreSQL Database
5
- postgres:
6
- image: postgres:16-alpine
7
- container_name: echo-postgres
8
- restart: unless-stopped
9
- environment:
10
- POSTGRES_USER: ${POSTGRES_USER:-echo}
11
- POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-changeme}
12
- POSTGRES_DB: ${POSTGRES_DB:-echo}
13
- PGDATA: /var/lib/postgresql/data/pgdata
14
- volumes:
15
- - postgres_data:/var/lib/postgresql/data
16
- ports:
17
- - "${POSTGRES_PORT:-5432}:5432"
18
- healthcheck:
19
- test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-echo} -d ${POSTGRES_DB:-echo}"]
20
- interval: 10s
21
- timeout: 5s
22
- retries: 5
23
- networks:
24
- - echo-network
25
-
26
- # Redis (optional - for caching/sessions in growth phase)
27
- redis:
28
- image: redis:7-alpine
29
- container_name: echo-redis
30
- restart: unless-stopped
31
- command: redis-server --requirepass ${REDIS_PASSWORD:-changeme}
32
- volumes:
33
- - redis_data:/data
34
- ports:
35
- - "${REDIS_PORT:-6379}:6379"
36
- healthcheck:
37
- test: ["CMD", "redis-cli", "--raw", "incr", "ping"]
38
- interval: 10s
39
- timeout: 5s
40
- retries: 5
41
- networks:
42
- - echo-network
43
- profiles:
44
- - with-redis
45
-
46
- # Next.js Application
47
- app:
48
- build:
49
- context: .
50
- dockerfile: Dockerfile
51
- container_name: echo-app
52
- restart: unless-stopped
53
- ports:
54
- - "${APP_PORT:-3000}:3000"
55
- environment:
56
- DATABASE_URL: postgresql://${POSTGRES_USER:-echo}:${POSTGRES_PASSWORD:-changeme}@postgres:5432/${POSTGRES_DB:-echo}
57
- REDIS_URL: redis://:${REDIS_PASSWORD:-changeme}@redis:6379
58
- NODE_ENV: production
59
- NEXT_PUBLIC_APP_URL: ${NEXT_PUBLIC_APP_URL:-http://localhost:3000}
60
- BETTER_AUTH_SECRET: ${BETTER_AUTH_SECRET}
61
- BETTER_AUTH_URL: ${BETTER_AUTH_URL:-http://localhost:3000}
62
- RESEND_API_KEY: ${RESEND_API_KEY}
63
- OPENAI_API_KEY: ${OPENAI_API_KEY}
64
- depends_on:
65
- postgres:
66
- condition: service_healthy
67
- healthcheck:
68
- test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:3000/api/health"]
69
- interval: 30s
70
- timeout: 10s
71
- retries: 3
72
- start_period: 40s
73
- networks:
74
- - echo-network
75
-
76
- # Migration service
77
- migrate:
78
- build: .
79
- command: ["bun", "run", "db:migrate"]
80
- environment:
81
- DATABASE_URL: postgresql://${POSTGRES_USER:-echo}:${POSTGRES_PASSWORD:-changeme}@postgres:5432/${POSTGRES_DB:-echo}
82
- depends_on:
83
- postgres:
84
- condition: service_healthy
85
- networks:
86
- - echo-network
87
- profiles:
88
- - migrate
89
-
90
- volumes:
91
- postgres_data:
92
- driver: local
93
- redis_data:
94
- driver: local
95
-
96
- networks:
97
- echo-network:
98
- driver: bridge
@@ -1,259 +0,0 @@
1
- # Architecture Documentation
2
-
3
- **Project:** Echo
4
- **Type:** Web Application (Next.js + React + TypeScript)
5
- **Generated:** 2025-12-31
6
-
7
- ## Executive Summary
8
-
9
- Echo 是一个基于 Next.js 16 和 React 19 的现代 Web 应用,使用 App Router 架构和 React Server Components。项目采用 TypeScript 严格模式,使用 Shadcn/ui 作为组件库,Tailwind CSS v4 进行样式管理。
10
-
11
- ## Technology Stack
12
-
13
- ### Core Framework
14
-
15
- | 技术 | 版本 | 用途 |
16
- |------|------|------|
17
- | **Next.js** | 16.1.1 | React 框架(App Router)|
18
- | **React** | 19.2.3 | UI 库(RSC enabled)|
19
- | **TypeScript** | 5.x | 类型系统(strict mode)|
20
-
21
- ### Styling
22
-
23
- | 技术 | 版本 | 用途 |
24
- |------|------|------|
25
- | **Tailwind CSS** | 4.x | 实用优先的 CSS 框架 |
26
- | **tw-animate-css** | 1.4.0 | 动画支持 |
27
-
28
- ### Component Library
29
-
30
- | 技术 | 版本 | 用途 |
31
- |------|------|------|
32
- | **Shadcn/ui** | 3.6.2 | 组件系统 |
33
- | **Radix UI** | 1.4.3 | 无障碍基础组件 |
34
- | **Base UI** | 1.0.0 | React 基础组件 |
35
- | **Lucide React** | 0.562.0 | 图标库 |
36
-
37
- ### Utilities
38
-
39
- | 技术 | 用途 |
40
- |------|------|
41
- | **clsx** | 条件类名 |
42
- | **tailwind-merge** | 合并 Tailwind 类名 |
43
- | **class-variance-authority** | 组件变体管理 |
44
-
45
- ## Architecture Pattern
46
-
47
- ### Next.js App Router
48
-
49
- 项目使用 Next.js 13+ 引入的 App Router 架构:
50
-
51
- ```
52
- app/
53
- ├── layout.tsx # 根布局(持久 UI)
54
- ├── page.tsx # 首页路由
55
- └── globals.css # 全局样式
56
- ```
57
-
58
- **特点:**
59
- - 基于文件系统的路由
60
- - 支持嵌套布局
61
- - React Server Components (RSC)
62
- - 流式渲染
63
- - 并行路由
64
-
65
- ### React Server Components
66
-
67
- | 特性 | 说明 |
68
- |------|------|
69
- | **默认服务器组件** | 减少客户端 JavaScript |
70
- | **选择性客户端组件** | 使用 'use client' 指令 |
71
- | **数据获取** | 在服务器组件中直接获取 |
72
-
73
- ### Component Architecture
74
-
75
- ```
76
- components/
77
- ├── ui/ # Shadcn/ui 基础组件(14 个)
78
- │ ├── alert-dialog.tsx
79
- │ ├── badge.tsx
80
- │ ├── button.tsx
81
- │ ├── card.tsx
82
- │ ├── combobox.tsx
83
- │ ├── dropdown-menu.tsx
84
- │ ├── field.tsx
85
- │ ├── input-group.tsx
86
- │ ├── input.tsx
87
- │ ├── label.tsx
88
- │ ├── select.tsx
89
- │ ├── separator.tsx
90
- │ └── textarea.tsx
91
- ├── component-example.tsx # 自定义组件
92
- └── example.tsx
93
- ```
94
-
95
- ## Data Architecture
96
-
97
- ### 当前状态
98
-
99
- **无数据层实现** - 项目目前是纯前端应用,没有:
100
-
101
- - ❌ 数据库连接
102
- - ❌ ORM/数据模型
103
- - ❌ API 集成
104
- - ❌ 状态管理
105
-
106
- ### 扩展点
107
-
108
- 当需要添加数据功能时:
109
-
110
- 1. **API 路由** - 在 `app/api/` 创建 RESTful 端点
111
- 2. **数据获取** - 在 Server Components 中获取
112
- 3. **状态管理** - 添加 React Context 或 Zustand
113
- 4. **数据库** - 集成 Prisma + PostgreSQL
114
-
115
- ## API Design
116
-
117
- ### 当前状态
118
-
119
- **无 API 实现** - 项目未定义 API 端点。
120
-
121
- ### 推荐扩展
122
-
123
- 在 `app/api/` 目录添加路由:
124
-
125
- ```
126
- app/api/
127
- ├── auth/
128
- │ └── route.ts # POST /api/auth
129
- ├── feedback/
130
- │ └── route.ts # POST /api/feedback
131
- └── users/
132
- └── route.ts # GET/POST /api/users
133
- ```
134
-
135
- ## Component Overview
136
-
137
- ### Shadcn/ui Components
138
-
139
- | 组件 | 用途 | 状态 |
140
- |------|------|------|
141
- | alert-dialog | 警告/确认对话框 | ✅ 已安装 |
142
- | badge | 徽章/标签 | ✅ 已安装 |
143
- | button | 按钮 | ✅ 已安装 |
144
- | card | 卡片容器 | ✅ 已安装 |
145
- | combobox | 组合输入框 | ✅ 已安装 |
146
- | dropdown-menu | 下拉菜单 | ✅ 已安装 |
147
- | field | 表单字段包装器 | ✅ 已安装 |
148
- | input-group | 输入组 | ✅ 已安装 |
149
- | input | 文本输入 | ✅ 已安装 |
150
- | label | 表单标签 | ✅ 已安装 |
151
- | select | 选择器 | ✅ 已安装 |
152
- | separator | 分隔线 | ✅ 已安装 |
153
- | textarea | 多行文本输入 | ✅ 已安装 |
154
-
155
- ### Custom Components
156
-
157
- | 组件 | 位置 | 状态 |
158
- |------|------|------|
159
- | ComponentExample | components/component-example.tsx | ✅ 示例 |
160
- | Example | components/example.tsx | ✅ 示例 |
161
-
162
- ## Source Tree
163
-
164
- 完整源代码树请参阅:[Source Tree Analysis](./source-tree-analysis.md)
165
-
166
- ## Development Workflow
167
-
168
- 开发流程请参阅:[Development Guide](./development-guide.md)
169
-
170
- ## Deployment Architecture
171
-
172
- ### 当前配置
173
-
174
- | 项目 | 状态 |
175
- |------|------|
176
- | **构建输出** | `.next/` 目录 |
177
- | **启动命令** | `bun start` |
178
- | **环境变量** | `.env.local` |
179
- | **Docker** | ❌ 未配置 |
180
- | **CI/CD** | ❌ 未配置 |
181
-
182
- ### 推荐部署
183
-
184
- - **Vercel** - Next.js 官方平台(零配置)
185
- - **Netlify** - 支持 Next.js
186
- - **自托管** - 使用 Docker 容器化
187
-
188
- ## Security Considerations
189
-
190
- ### 当前状态
191
-
192
- | 安全措施 | 状态 |
193
- |----------|------|
194
- | **环境变量** | `NEXT_PUBLIC_*` 前缀 |
195
- | **TypeScript** | Strict mode(类型安全)|
196
- | **ESLint** | 已配置 |
197
- | **认证/授权** | ❌ 未实现 |
198
- | **HTTPS** | 部署平台处理 |
199
-
200
- ### 推荐添加
201
-
202
- 1. **认证** - NextAuth.js 或 Clerk
203
- 2. **API 安全** - CSRF 保护、速率限制
204
- 3. **输入验证** - Zod schema 验证
205
- 4. **CORS** - API 路由配置
206
-
207
- ## Performance Considerations
208
-
209
- ### 优化措施
210
-
211
- | 优化 | 说明 |
212
- |------|------|
213
- | **Server Components** | 减少客户端 JavaScript |
214
- | **字体优化** | next/font (Geist, Inter) |
215
- | **图片优化** | next/image(未使用)|
216
- | **代码分割** | App Router 自动处理 |
217
-
218
- ### 推荐添加
219
-
220
- 1. **图片优化** - 使用 `next/image`
221
- 2. **动态导入** - `next/dynamic`
222
- 3. **缓存策略** - Next.js 缓存配置
223
- 4. **性能监控** - Vercel Analytics
224
-
225
- ## Testing Strategy
226
-
227
- ### 当前状态
228
-
229
- ❌ **无测试配置**
230
-
231
- ### 推荐添加
232
-
233
- 1. **单元测试** - Vitest + Testing Library
234
- 2. **组件测试** - Playwright 或 Cypress
235
- 3. **E2E 测试** - Playwright
236
- 4. **类型检查** - TypeScript + tsc
237
-
238
- ## Future Enhancements
239
-
240
- ### 短期(1-2 周)
241
-
242
- 1. 添加测试套件
243
- 2. 实现 API 路由
244
- 3. 添加状态管理
245
- 4. 配置 CI/CD
246
-
247
- ### 中期(1-2 月)
248
-
249
- 1. 数据库集成
250
- 2. 用户认证
251
- 3. 错误处理
252
- 4. 性能监控
253
-
254
- ### 长期(3+ 月)
255
-
256
- 1. 微服务架构(如需要)
257
- 2. 国际化 (i18n)
258
- 3. PWA 支持
259
- 4. 离线功能
@@ -1,261 +0,0 @@
1
- # Component Inventory
2
-
3
- **Project:** Echo
4
- **Generated:** 2025-12-31
5
-
6
- ## Overview
7
-
8
- 项目使用 **Shadcn/ui 3.6.2** 组件库,基于 Radix UI primitives 和 Base UI 构建。
9
-
10
- ## Design System Configuration
11
-
12
- | 配置 | 值 |
13
- |------|-----|
14
- | **样式变体** | radix-maia |
15
- | **基础颜色** | neutral |
16
- | **图标库** | lucide-react |
17
- | **RSC** | enabled |
18
- | **CSS 变量** | enabled |
19
-
20
- ## Shadcn/ui Components (14 个)
21
-
22
- ### Form Components
23
-
24
- | 组件 | 文件 | 描述 |
25
- |------|------|------|
26
- | **Input** | `input.tsx` | 单行文本输入 |
27
- | **Textarea** | `textarea.tsx` | 多行文本输入 |
28
- | **Label** | `label.tsx` | 表单标签 |
29
- | **Field** | `field.tsx` | 表单字段包装器 |
30
- | **Input Group** | `input-group.tsx` | 输入组容器 |
31
- | **Select** | `select.tsx` | 下拉选择器 |
32
- | **Combobox** | `combobox.tsx` | 组合输入/搜索 |
33
-
34
- ### Action Components
35
-
36
- | 组件 | 文件 | 描述 |
37
- |------|------|------|
38
- | **Button** | `button.tsx` | 按钮(多种变体)|
39
- | **Dropdown Menu** | `dropdown-menu.tsx` | 下拉菜单 |
40
- | **Alert Dialog** | `alert-dialog.tsx` | 警告/确认对话框 |
41
-
42
- ### Layout Components
43
-
44
- | 组件 | 文件 | 描述 |
45
- |------|------|------|
46
- | **Card** | `card.tsx` | 卡片容器 |
47
- | **Separator** | `separator.tsx` | 分隔线 |
48
-
49
- ### Display Components
50
-
51
- | 组件 | 文件 | 描述 |
52
- |------|------|------|
53
- | **Badge** | `badge.tsx` | 徽章/标签 |
54
-
55
- ## Component Usage
56
-
57
- ### Button
58
-
59
- ```tsx
60
- import { Button } from "@/components/ui/button";
61
-
62
- <Button variant="default">Click me</Button>
63
- <Button variant="outline">Outline</Button>
64
- <Button variant="ghost">Ghost</Button>
65
- ```
66
-
67
- ### Card
68
-
69
- ```tsx
70
- import { Card } from "@/components/ui/card";
71
-
72
- <Card>
73
- <CardHeader>
74
- <CardTitle>Title</CardTitle>
75
- </CardHeader>
76
- <CardContent>Content</CardContent>
77
- </Card>
78
- ```
79
-
80
- ### Input
81
-
82
- ```tsx
83
- import { Input } from "@/components/ui/input";
84
-
85
- <Input type="text" placeholder="Enter text..." />
86
- ```
87
-
88
- ## Custom Components
89
-
90
- | 组件 | 文件 | 描述 | 状态 |
91
- |------|------|------|------|
92
- | **ComponentExample** | `component-example.tsx` | 示例组件 | ✅ |
93
- | **Example** | `example.tsx` | 简单示例 | ✅ |
94
-
95
- ## Reusable Patterns
96
-
97
- ### cn() Utility
98
-
99
- 合并 Tailwind 类名:
100
-
101
- ```tsx
102
- import { cn } from "@/lib/utils";
103
-
104
- className={cn(
105
- "base-class",
106
- condition && "conditional-class",
107
- "another-class"
108
- )}
109
- ```
110
-
111
- ### Component Variants
112
-
113
- 使用 `class-variance-authority` 管理变体:
114
-
115
- ```tsx
116
- const buttonVariants = cva(
117
- "base-classes",
118
- {
119
- variants: {
120
- variant: {
121
- default: "default-classes",
122
- outline: "outline-classes",
123
- },
124
- },
125
- }
126
- );
127
- ```
128
-
129
- ## Component Organization
130
-
131
- ```
132
- components/
133
- ├── ui/ # Shadcn/ui 基础组件(不要直接修改)
134
- │ ├── alert-dialog.tsx
135
- │ ├── badge.tsx
136
- │ ├── button.tsx
137
- │ ├── card.tsx
138
- │ ├── combobox.tsx
139
- │ ├── dropdown-menu.tsx
140
- │ ├── field.tsx
141
- │ ├── input-group.tsx
142
- │ ├── input.tsx
143
- │ ├── label.tsx
144
- │ ├── select.tsx
145
- │ ├── separator.tsx
146
- │ └── textarea.tsx
147
- ├── component-example.tsx # 自定义组件
148
- └── example.tsx
149
- ```
150
-
151
- ## Adding New Components
152
-
153
- ### Option 1: Add Shadcn/ui Component
154
-
155
- 使用 Shadcn CLI 添加新组件:
156
-
157
- ```bash
158
- npx shadcn@latest add [component-name]
159
- ```
160
-
161
- 例如:
162
- ```bash
163
- npx shadcn@latest add dialog
164
- npx shadcn@latest add tooltip
165
- npx shadcn@latest add switch
166
- ```
167
-
168
- ### Option 2: Create Custom Component
169
-
170
- 1. 在 `components/` 创建新文件
171
- 2. 使用 Shadcn/ui 组件作为基础
172
- 3. 应用项目样式变体
173
-
174
- ```tsx
175
- // components/my-feature.tsx
176
- import { Button } from "@/components/ui/button";
177
- import { Card } from "@/components/ui/card";
178
-
179
- export function MyFeature() {
180
- return (
181
- <Card>
182
- <CardHeader>
183
- <CardTitle>My Feature</CardTitle>
184
- </CardHeader>
185
- <CardContent>
186
- <Button>Action</Button>
187
- </CardContent>
188
- </Card>
189
- );
190
- }
191
- ```
192
-
193
- ## Styling Conventions
194
-
195
- ### Tailwind Integration
196
-
197
- 所有组件使用 Tailwind CSS 实用类:
198
-
199
- ```tsx
200
- className="flex items-center justify-between p-4 rounded-lg"
201
- ```
202
-
203
- ### Theme Variables
204
-
205
- 使用 CSS 自定义属性:
206
-
207
- ```tsx
208
- className="bg-primary text-primary-foreground"
209
- ```
210
-
211
- 可用变量:
212
- - `background`, `foreground`
213
- - `primary`, `primary-foreground`
214
- - `secondary`, `secondary-foreground`
215
- - `accent`, `accent-foreground`
216
- - `muted`, `muted-foreground`
217
- - `card`, `card-foreground`
218
- - `popover`, `popover-foreground`
219
- - `border`, `input`, `ring`
220
-
221
- ## Icon Usage
222
-
223
- 使用 Lucide React 图标:
224
-
225
- ```tsx
226
- import { ChevronLeft, Search, User } from "lucide-react";
227
-
228
- <ChevronLeft className="h-4 w-4" />
229
- <Search className="h-5 w-5" />
230
- <User className="h-6 w-6" />
231
- ```
232
-
233
- ## Component Best Practices
234
-
235
- 1. **优先使用 Shadcn/ui 组件** - 避免重复造轮
236
- 2. **直接修改 ui/ 组件** - 项目采用直接修改方式,不是重新安装
237
- 3. **使用 cn() 合并类名** - 保持类名可预测
238
- 4. **遵循命名约定** - PascalCase 用于组件
239
- 5. **保持组件小而专注** - 单一职责原则
240
-
241
- ## Missing Components
242
-
243
- 以下常用组件未安装,可以根据需要添加:
244
-
245
- - dialog(对话框)
246
- - tooltip(工具提示)
247
- - toast(通知)
248
- - switch(开关)
249
- - checkbox(复选框)
250
- - radio(单选框)
251
- - tabs(选项卡)
252
- - table(表格)
253
- - avatar(头像)
254
- - progress(进度条)
255
- - slider(滑块)
256
- - calendar(日历)
257
-
258
- 要添加这些组件,运行:
259
- ```bash
260
- npx shadcn@latest add [component-name]
261
- ```