@nexttylabs/echo 0.4.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.
- package/CHANGELOG.md +13 -0
- package/app/(public)/[organizationSlug]/roadmap/page.tsx +19 -1
- package/app/api/admin/backup/route.ts +22 -4
- package/app/api/auth/register/handler.ts +1 -2
- package/lib/auth/config.ts +0 -7
- package/lib/db/migrations/0000_needy_leech.sql +335 -0
- package/lib/db/migrations/meta/0000_snapshot.json +2186 -1
- package/lib/db/migrations/meta/_journal.json +2 -135
- package/lib/db/schema/auth.ts +0 -1
- package/lib/db/schema/index.ts +0 -1
- package/lib/portal/public-context.tsx +5 -0
- package/package.json +20 -1
- package/.changeset/README.md +0 -21
- package/.changeset/config.json +0 -11
- package/.changeset/cozy-ghosts-care.md +0 -5
- package/.changeset/sharp-lines-stand.md +0 -5
- package/.changeset/sour-doodles-eat.md +0 -5
- package/.changeset/tender-moose-shop.md +0 -5
- package/.github/pull_request_template.md +0 -13
- package/.github/workflows/ci.yml +0 -41
- package/.github/workflows/publish.yml +0 -44
- package/.github/workflows/release.yml +0 -73
- package/AGENTS.md +0 -92
- package/Dockerfile +0 -57
- package/Makefile +0 -77
- package/bun.lock +0 -2503
- package/components/portal/project-switcher.tsx +0 -20
- package/docker-compose.dev.yml +0 -26
- package/docker-compose.yml +0 -98
- package/docs/architecture.md +0 -259
- package/docs/component-inventory.md +0 -261
- package/docs/database-migrations.md +0 -76
- package/docs/development-guide.md +0 -209
- package/docs/e2e-user-flows.csv +0 -31
- package/docs/er-diagram-feedback.mmd +0 -138
- package/docs/er-diagram.mmd +0 -281
- package/docs/i18n-check-report.md +0 -296
- package/docs/index.md +0 -214
- package/docs/logic-chain.md +0 -94
- package/docs/plans/2026-01-02-database-migration-scripts.md +0 -496
- package/docs/plans/2026-01-02-user-login-design.md +0 -37
- package/docs/plans/2026-01-02-user-login.md +0 -437
- package/docs/plans/2026-01-02-user-registration-design.md +0 -47
- package/docs/plans/2026-01-02-user-registration.md +0 -628
- package/docs/plans/2026-01-03-roles-permissions-design.md +0 -20
- package/docs/plans/2026-01-03-roles-permissions.md +0 -266
- package/docs/plans/2026-01-05-authentication-middleware.md +0 -207
- package/docs/plans/2026-01-05-member-removal.md +0 -186
- package/docs/plans/2026-01-05-organization-creation.md +0 -374
- package/docs/plans/2026-01-05-rbac-middleware.md +0 -112
- package/docs/plans/2026-01-05-role-configuration.md +0 -441
- package/docs/plans/2026-01-06-file-upload-support.md +0 -804
- package/docs/plans/2026-01-06-permission-check-hook.md +0 -155
- package/docs/plans/2026-01-06-resource-ownership-check.md +0 -231
- package/docs/plans/2026-01-07-feedback-tracking-link.md +0 -459
- package/docs/plans/2026-01-09-logout-redirect-design.md +0 -52
- package/docs/plans/2026-01-09-phase2-3-plan.md +0 -654
- package/docs/plans/2026-01-09-portal-execution-plan.md +0 -408
- package/docs/plans/2026-01-09-project-delete-feature-design.md +0 -163
- package/docs/plans/2026-01-09-project-delete-implementation.md +0 -451
- package/docs/plans/2026-01-09-project-edit-delete-design.md +0 -52
- package/docs/plans/2026-01-09-settings-center-design.md +0 -114
- package/docs/plans/2026-01-09-settings-center.md +0 -948
- package/docs/plans/2026-01-10-organization-only-design.md +0 -66
- package/docs/plans/2026-01-10-organization-only-implementation.md +0 -433
- package/docs/plans/2026-01-10-portal-settings-restructure-plan.md +0 -18
- package/docs/plans/2026-01-10-project-settings-tabs-design-implementation.md +0 -296
- package/docs/plans/2026-01-14-e2e-playwright-feedback.md +0 -173
- package/docs/plans/2026-01-15-feedback-management-org-context-design.md +0 -82
- package/docs/plans/2026-01-15-feedback-management-org-context-implementation-plan.md +0 -521
- package/docs/plans/2026-01-16-admin-feedback-filters-design.md +0 -75
- package/docs/plans/2026-01-16-admin-feedback-filters-implementation.md +0 -293
- package/docs/plans/2026-01-16-admin-feedback-route-consolidation.md +0 -180
- package/docs/plans/2026-01-16-e2e-test-fixes.md +0 -158
- package/docs/plans/2026-01-17-admin-feedback-filters.md +0 -214
- package/docs/plans/2026-01-17-admin-feedback-improvements.md +0 -453
- package/docs/plans/2026-01-18-changesets-design.md +0 -40
- package/docs/product_changes.md +0 -37
- package/docs/project-overview.md +0 -159
- package/docs/project-scan-report.json +0 -104
- package/docs/route-role-visibility.md +0 -51
- package/docs/source-tree-analysis.md +0 -150
- package/docs/testing/delete-project-manual-tests.md +0 -18
- package/docs/user-story-tracking.md +0 -191
- package/eslint.config.mjs +0 -19
- package/lib/db/migrations/.gitkeep +0 -0
- package/lib/db/migrations/0000_cynical_gladiator.sql +0 -53
- package/lib/db/migrations/0001_wandering_sunfire.sql +0 -27
- package/lib/db/migrations/0002_shallow_speedball.sql +0 -1
- package/lib/db/migrations/0003_add_org_description.sql +0 -1
- package/lib/db/migrations/0003_boring_wild_pack.sql +0 -13
- package/lib/db/migrations/0004_windy_tyrannus.sql +0 -27
- package/lib/db/migrations/0005_perpetual_doorman.sql +0 -5
- package/lib/db/migrations/0006_aberrant_captain_midlands.sql +0 -13
- package/lib/db/migrations/0007_clever_captain_cross.sql +0 -14
- package/lib/db/migrations/0008_sparkling_pandemic.sql +0 -2
- package/lib/db/migrations/0009_happy_black_tom.sql +0 -29
- package/lib/db/migrations/0010_kind_junta.sql +0 -8
- package/lib/db/migrations/0011_mute_squadron_supreme.sql +0 -25
- package/lib/db/migrations/0012_giant_power_man.sql +0 -24
- package/lib/db/migrations/0013_damp_titanium_man.sql +0 -17
- package/lib/db/migrations/0014_blue_alice.sql +0 -18
- package/lib/db/migrations/0015_webhook_tables.sql +0 -41
- package/lib/db/migrations/0016_github_integration.sql +0 -30
- package/lib/db/migrations/0016_overjoyed_ghost_rider.sql +0 -22
- package/lib/db/migrations/0017_slimy_inhumans.sql +0 -6
- package/lib/db/migrations/0018_same_spitfire.sql +0 -1
- package/lib/db/migrations/0019_jittery_loners.sql +0 -16
- package/lib/db/migrations/0019_remove_projects_add_org_settings.sql +0 -14
- package/lib/db/migrations/meta/0001_snapshot.json +0 -553
- package/lib/db/migrations/meta/0002_snapshot.json +0 -560
- package/lib/db/migrations/meta/0003_snapshot.json +0 -650
- package/lib/db/migrations/meta/0004_snapshot.json +0 -852
- package/lib/db/migrations/meta/0005_snapshot.json +0 -900
- package/lib/db/migrations/meta/0006_snapshot.json +0 -1011
- package/lib/db/migrations/meta/0007_snapshot.json +0 -1125
- package/lib/db/migrations/meta/0008_snapshot.json +0 -1146
- package/lib/db/migrations/meta/0009_snapshot.json +0 -1386
- package/lib/db/migrations/meta/0010_snapshot.json +0 -1419
- package/lib/db/migrations/meta/0011_snapshot.json +0 -1615
- package/lib/db/migrations/meta/0012_snapshot.json +0 -1805
- package/lib/db/migrations/meta/0013_snapshot.json +0 -1948
- package/lib/db/migrations/meta/0014_snapshot.json +0 -2082
- package/lib/db/migrations/meta/0015_snapshot.json +0 -2476
- package/lib/db/migrations/meta/0016_snapshot.json +0 -2633
- package/lib/db/migrations/meta/0017_snapshot.json +0 -2680
- package/lib/db/migrations/meta/0018_snapshot.json +0 -2686
- package/lib/db/migrations/meta/0019_snapshot.json +0 -2741
- package/lib/db/schema/projects.ts +0 -145
- package/lib/db/schema/user-profiles.ts +0 -31
- package/lib/validations/projects.ts +0 -49
- package/next-env.d.ts +0 -6
- package/playwright.config.ts +0 -44
- package/proxy.test.ts +0 -131
- package/proxy.ts +0 -116
- package/scripts/backup-db.sh +0 -57
- package/scripts/backup-db.ts +0 -24
- package/scripts/generate-openapi.ts +0 -22
- package/scripts/migration-helper.ts +0 -39
- package/scripts/pre-deploy.ts +0 -75
- package/scripts/restore-db.sh +0 -60
- package/scripts/rollback.ts +0 -72
- package/scripts/seed-tags.ts +0 -48
- package/tests/api/feedback-bulk.test.ts +0 -47
- package/tests/api/feedback-by-id.test.ts +0 -67
- package/tests/api/feedback-comments-route-import.test.ts +0 -26
- package/tests/api/feedback-create.test.ts +0 -71
- package/tests/api/feedback-delete.test.ts +0 -160
- package/tests/api/feedback-filter.test.ts +0 -250
- package/tests/api/feedback-list.test.ts +0 -234
- package/tests/api/feedback-route-assignee-condition.test.ts +0 -32
- package/tests/api/feedback-similar.test.ts +0 -46
- package/tests/api/feedback-sort.test.ts +0 -261
- package/tests/api/feedback-status-enum.test.ts +0 -49
- package/tests/api/feedback-status-filter.test.ts +0 -117
- package/tests/api/feedback-submit-on-behalf.test.ts +0 -269
- package/tests/api/feedback.test.ts +0 -175
- package/tests/api/identify-jwt.test.ts +0 -25
- package/tests/api/invitation-accept.test.ts +0 -213
- package/tests/api/organization-invitations.test.ts +0 -186
- package/tests/api/organization-members-list.test.ts +0 -79
- package/tests/api/organization-members.test.ts +0 -340
- package/tests/api/organizations.test.ts +0 -149
- package/tests/api/register.test.ts +0 -112
- package/tests/api/upload.test.ts +0 -103
- package/tests/api/vote.test.ts +0 -82
- package/tests/app/admin-feedback-detail-page.test.tsx +0 -25
- package/tests/app/admin-feedback-list-page.test.tsx +0 -25
- package/tests/app/admin-feedback-new-page.test.tsx +0 -25
- package/tests/app/health-route-helpers.test.ts +0 -27
- package/tests/app/login-page.test.ts +0 -26
- package/tests/app/portal-page.test.ts +0 -29
- package/tests/app/project-portal-overview.test.tsx +0 -25
- package/tests/app/widget-page-import.test.ts +0 -25
- package/tests/components/create-post-dialog-defaults.test.ts +0 -43
- package/tests/components/feedback/duplicate-suggestions-inline.test.tsx +0 -27
- package/tests/components/feedback/embedded-feedback-form.test.tsx +0 -96
- package/tests/components/feedback/feedback-detail.test.tsx +0 -25
- package/tests/components/feedback/feedback-stats.test.tsx +0 -49
- package/tests/components/feedback-bulk-actions.test.tsx +0 -39
- package/tests/components/feedback-i18n-keys.test.ts +0 -70
- package/tests/components/feedback-list-controls-compile.test.ts +0 -25
- package/tests/components/feedback-list-controls.test.tsx +0 -204
- package/tests/components/feedback-list-item.test.tsx +0 -67
- package/tests/components/landing/hero.test.tsx +0 -46
- package/tests/components/layout/language-switcher.test.tsx +0 -25
- package/tests/components/layout/sidebar.test.tsx +0 -157
- package/tests/components/login-form.test.ts +0 -25
- package/tests/components/organization-form.test.ts +0 -32
- package/tests/components/organization-switcher.test.ts +0 -25
- package/tests/components/pagination.test.tsx +0 -43
- package/tests/components/portal-overview.test.tsx +0 -25
- package/tests/components/profile-form.test.tsx +0 -139
- package/tests/components/role-selector.test.ts +0 -31
- package/tests/components/status-chart.test.tsx +0 -90
- package/tests/e2e/auth.e2e.ts +0 -323
- package/tests/e2e/feedback-actions.e2e.ts +0 -471
- package/tests/e2e/feedback-attachment.e2e.ts +0 -168
- package/tests/e2e/feedback-customer.e2e.ts +0 -226
- package/tests/e2e/feedback-management.e2e.ts +0 -565
- package/tests/e2e/feedback-submit.e2e.ts +0 -133
- package/tests/e2e/feedback-view.e2e.ts +0 -297
- package/tests/e2e/fixtures/test-data.ts +0 -235
- package/tests/e2e/health-check.e2e.ts +0 -230
- package/tests/e2e/helpers/test-utils-helpers.test.ts +0 -43
- package/tests/e2e/helpers/test-utils.ts +0 -298
- package/tests/e2e/integration-placeholders.e2e.ts +0 -199
- package/tests/e2e/organization.e2e.ts +0 -292
- package/tests/e2e/permissions.e2e.ts +0 -424
- package/tests/e2e/project-widget.e2e.ts +0 -63
- package/tests/feedback/filters.test.ts +0 -29
- package/tests/hooks/use-permissions.test.ts +0 -52
- package/tests/lib/ai/classifier.test.ts +0 -104
- package/tests/lib/ai/duplicate-detector.test.ts +0 -234
- package/tests/lib/attachments-schema.test.ts +0 -30
- package/tests/lib/auth/session.test.ts +0 -49
- package/tests/lib/auth-client.test.ts +0 -37
- package/tests/lib/auth-config.test.ts +0 -26
- package/tests/lib/feedback-prefill.test.ts +0 -52
- package/tests/lib/feedback-processor.test.ts +0 -41
- package/tests/lib/feedback-schema.test.ts +0 -33
- package/tests/lib/file-validator.test.ts +0 -48
- package/tests/lib/get-feedback-by-id.test.ts +0 -37
- package/tests/lib/invitations.test.ts +0 -35
- package/tests/lib/login-schema.test.ts +0 -36
- package/tests/lib/org-context.test.ts +0 -95
- package/tests/lib/organization-access.test.ts +0 -44
- package/tests/lib/organization-member-role-schema.test.ts +0 -41
- package/tests/lib/permissions.test.ts +0 -88
- package/tests/lib/portal-analytics.test.ts +0 -25
- package/tests/lib/portal-contributors.test.ts +0 -25
- package/tests/lib/portal-copy.test.ts +0 -27
- package/tests/lib/portal-i18n.test.ts +0 -30
- package/tests/lib/portal-leaderboard-settings.test.ts +0 -25
- package/tests/lib/portal-modules.test.ts +0 -25
- package/tests/lib/portal-seo.test.ts +0 -25
- package/tests/lib/portal-sharing.test.ts +0 -25
- package/tests/lib/portal-sorting.test.ts +0 -25
- package/tests/lib/portal-theme.test.ts +0 -25
- package/tests/lib/rate-limit.test.ts +0 -142
- package/tests/lib/resolve-locale.test.ts +0 -34
- package/tests/lib/services/backup.test.ts +0 -145
- package/tests/lib/user-organizations.test.ts +0 -42
- package/tests/lib/user-role-schema.test.ts +0 -33
- package/tests/lib/user-schema.test.ts +0 -25
- package/tests/setup.ts +0 -74
- 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
|
-
}
|
package/docker-compose.dev.yml
DELETED
|
@@ -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
|
package/docker-compose.yml
DELETED
|
@@ -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
|
package/docs/architecture.md
DELETED
|
@@ -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
|
-
```
|