@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,76 +0,0 @@
|
|
|
1
|
-
# Database Migration Guide
|
|
2
|
-
|
|
3
|
-
## Generating Migrations
|
|
4
|
-
|
|
5
|
-
After changing the schema in `lib/db/schema/`, run:
|
|
6
|
-
|
|
7
|
-
```bash
|
|
8
|
-
bun run db:generate
|
|
9
|
-
```
|
|
10
|
-
|
|
11
|
-
This creates a new migration in `lib/db/migrations/`.
|
|
12
|
-
|
|
13
|
-
## Applying Migrations
|
|
14
|
-
|
|
15
|
-
**Development:**
|
|
16
|
-
|
|
17
|
-
```bash
|
|
18
|
-
bun run db:push
|
|
19
|
-
```
|
|
20
|
-
|
|
21
|
-
`db:push` applies schema changes directly and is useful for local iteration.
|
|
22
|
-
|
|
23
|
-
**Production:**
|
|
24
|
-
|
|
25
|
-
```bash
|
|
26
|
-
bun run db:migrate
|
|
27
|
-
```
|
|
28
|
-
|
|
29
|
-
`db:migrate` applies generated migration files in order.
|
|
30
|
-
|
|
31
|
-
## Checking Schema
|
|
32
|
-
|
|
33
|
-
```bash
|
|
34
|
-
bun run db:check
|
|
35
|
-
```
|
|
36
|
-
|
|
37
|
-
Verifies the database schema matches your Drizzle schema.
|
|
38
|
-
|
|
39
|
-
## Database Studio
|
|
40
|
-
|
|
41
|
-
```bash
|
|
42
|
-
bun run db:studio
|
|
43
|
-
```
|
|
44
|
-
|
|
45
|
-
Opens Drizzle Studio (default: http://localhost:4983).
|
|
46
|
-
|
|
47
|
-
## Rollback
|
|
48
|
-
|
|
49
|
-
Drizzle does not generate down migrations automatically. To rollback:
|
|
50
|
-
|
|
51
|
-
1. Create a rollback SQL file alongside the migration:
|
|
52
|
-
`lib/db/migrations/<migration-name>-rollback.sql`
|
|
53
|
-
2. Run the rollback script:
|
|
54
|
-
|
|
55
|
-
```bash
|
|
56
|
-
bun run scripts/rollback.ts 1
|
|
57
|
-
```
|
|
58
|
-
|
|
59
|
-
## Pre-deploy Migration
|
|
60
|
-
|
|
61
|
-
Use the pre-deploy script in CI/CD or release automation to verify connectivity,
|
|
62
|
-
optionally run backups, apply migrations, and validate the resulting schema:
|
|
63
|
-
|
|
64
|
-
```bash
|
|
65
|
-
bun run scripts/pre-deploy.ts
|
|
66
|
-
```
|
|
67
|
-
|
|
68
|
-
Set `DB_BACKUP_BEFORE_MIGRATE=true` to enable backup integration (Story 8.5).
|
|
69
|
-
|
|
70
|
-
## Best Practices
|
|
71
|
-
|
|
72
|
-
1. Test migrations on a production-like copy first
|
|
73
|
-
2. Keep migrations small and reversible when possible
|
|
74
|
-
3. Prefer additive changes (`ADD COLUMN` with defaults) to avoid data loss
|
|
75
|
-
4. Avoid long-running migrations during peak traffic
|
|
76
|
-
5. Document any manual steps in the PR description
|
|
@@ -1,209 +0,0 @@
|
|
|
1
|
-
# Development Guide
|
|
2
|
-
|
|
3
|
-
**Project:** Echo
|
|
4
|
-
**Generated:** 2025-12-31
|
|
5
|
-
|
|
6
|
-
## Prerequisites
|
|
7
|
-
|
|
8
|
-
| 依赖 | 版本 | 说明 |
|
|
9
|
-
|------|------|------|
|
|
10
|
-
| **Bun** | 最新版 | 包管理器(项目使用 Bun) |
|
|
11
|
-
| **Node.js** | 20.x | 运行时(通过 Bun 管理) |
|
|
12
|
-
| **TypeScript** | 5.x | 类型系统 |
|
|
13
|
-
|
|
14
|
-
## Installation
|
|
15
|
-
|
|
16
|
-
```bash
|
|
17
|
-
# 安装依赖
|
|
18
|
-
bun install
|
|
19
|
-
```
|
|
20
|
-
|
|
21
|
-
## Development
|
|
22
|
-
|
|
23
|
-
```bash
|
|
24
|
-
# 启动开发服务器
|
|
25
|
-
bun dev
|
|
26
|
-
|
|
27
|
-
# 访问 http://localhost:3000
|
|
28
|
-
```
|
|
29
|
-
|
|
30
|
-
开发服务器启动后,访问 [http://localhost:3000](http://localhost:3000) 查看应用。
|
|
31
|
-
|
|
32
|
-
## Build
|
|
33
|
-
|
|
34
|
-
```bash
|
|
35
|
-
# 生产构建
|
|
36
|
-
bun run build
|
|
37
|
-
|
|
38
|
-
# 启动生产服务器
|
|
39
|
-
bun start
|
|
40
|
-
```
|
|
41
|
-
|
|
42
|
-
## Linting
|
|
43
|
-
|
|
44
|
-
```bash
|
|
45
|
-
# 运行 ESLint
|
|
46
|
-
bun run lint
|
|
47
|
-
```
|
|
48
|
-
|
|
49
|
-
## Project Structure
|
|
50
|
-
|
|
51
|
-
```
|
|
52
|
-
echo/
|
|
53
|
-
├── app/ # Next.js App Router
|
|
54
|
-
├── components/ # React 组件
|
|
55
|
-
│ └── ui/ # Shadcn/ui 组件
|
|
56
|
-
├── lib/ # 工具函数
|
|
57
|
-
├── public/ # 静态资源
|
|
58
|
-
└── docs/ # 项目文档
|
|
59
|
-
```
|
|
60
|
-
|
|
61
|
-
## Available Scripts
|
|
62
|
-
|
|
63
|
-
| 命令 | 说明 |
|
|
64
|
-
|------|------|
|
|
65
|
-
| `bun dev` | 启动开发服务器 |
|
|
66
|
-
| `bun run build` | 生产构建 |
|
|
67
|
-
| `bun start` | 启动生产服务器 |
|
|
68
|
-
| `bun run lint` | 运行代码检查 |
|
|
69
|
-
|
|
70
|
-
## Component Development
|
|
71
|
-
|
|
72
|
-
### 添加 Shadcn/ui 组件
|
|
73
|
-
|
|
74
|
-
Shadcn/ui 组件已安装在 `components/ui/` 目录。
|
|
75
|
-
|
|
76
|
-
当前组件库包括:
|
|
77
|
-
- alert-dialog, badge, button, card, combobox
|
|
78
|
-
- dropdown-menu, field, input-group, input
|
|
79
|
-
- label, select, separator, textarea
|
|
80
|
-
|
|
81
|
-
### 创建新组件
|
|
82
|
-
|
|
83
|
-
```tsx
|
|
84
|
-
// components/my-component.tsx
|
|
85
|
-
export function MyComponent() {
|
|
86
|
-
return <div>My Component</div>;
|
|
87
|
-
}
|
|
88
|
-
```
|
|
89
|
-
|
|
90
|
-
### 使用工具函数
|
|
91
|
-
|
|
92
|
-
```tsx
|
|
93
|
-
import { cn } from "@/lib/utils";
|
|
94
|
-
|
|
95
|
-
// 合并 Tailwind 类名
|
|
96
|
-
className={cn("base-class", condition && "conditional-class")}
|
|
97
|
-
```
|
|
98
|
-
|
|
99
|
-
## Styling
|
|
100
|
-
|
|
101
|
-
### Tailwind CSS v4
|
|
102
|
-
|
|
103
|
-
项目使用 Tailwind CSS v4,配置在 `app/globals.css` 中:
|
|
104
|
-
|
|
105
|
-
```css
|
|
106
|
-
@theme inline {
|
|
107
|
-
--color-primary: var(--primary);
|
|
108
|
-
/* ... 更多主题变量 */
|
|
109
|
-
}
|
|
110
|
-
```
|
|
111
|
-
|
|
112
|
-
### 暗黑模式
|
|
113
|
-
|
|
114
|
-
使用 `.dark` 类选择器:
|
|
115
|
-
|
|
116
|
-
```html
|
|
117
|
-
<html class="dark">
|
|
118
|
-
```
|
|
119
|
-
|
|
120
|
-
### 色彩空间
|
|
121
|
-
|
|
122
|
-
项目使用 **OKLCH** 色彩空间,提供感知上均匀的颜色。
|
|
123
|
-
|
|
124
|
-
## Import Aliases
|
|
125
|
-
|
|
126
|
-
```typescript
|
|
127
|
-
@/components → components/
|
|
128
|
-
@/lib → lib/
|
|
129
|
-
@/components/ui → components/ui
|
|
130
|
-
```
|
|
131
|
-
|
|
132
|
-
## Code Quality
|
|
133
|
-
|
|
134
|
-
### TypeScript 配置
|
|
135
|
-
|
|
136
|
-
- **Strict mode:** 已启用
|
|
137
|
-
- **Target:** ES2017
|
|
138
|
-
- **Module:** ESNext (bundler resolution)
|
|
139
|
-
|
|
140
|
-
### ESLint
|
|
141
|
-
|
|
142
|
-
配置文件:`eslint.config.mjs`
|
|
143
|
-
- 使用 Next.js ESLint 配置
|
|
144
|
-
|
|
145
|
-
## Common Development Tasks
|
|
146
|
-
|
|
147
|
-
### 添加新页面
|
|
148
|
-
|
|
149
|
-
在 `app/` 目录创建新文件:
|
|
150
|
-
|
|
151
|
-
```
|
|
152
|
-
app/
|
|
153
|
-
├── about/
|
|
154
|
-
│ └── page.tsx # /about 路由
|
|
155
|
-
└── dashboard/
|
|
156
|
-
└── page.tsx # /dashboard 路由
|
|
157
|
-
```
|
|
158
|
-
|
|
159
|
-
### 添加 API 路由
|
|
160
|
-
|
|
161
|
-
在 `app/api/` 目录创建路由处理器:
|
|
162
|
-
|
|
163
|
-
```
|
|
164
|
-
app/
|
|
165
|
-
└── api/
|
|
166
|
-
└── users/
|
|
167
|
-
└── route.ts # /api/users 端点
|
|
168
|
-
```
|
|
169
|
-
|
|
170
|
-
### 环境变量
|
|
171
|
-
|
|
172
|
-
创建 `.env.local` 文件:
|
|
173
|
-
|
|
174
|
-
```bash
|
|
175
|
-
NEXT_PUBLIC_API_URL=your_api_url
|
|
176
|
-
```
|
|
177
|
-
|
|
178
|
-
## Deployment Notes
|
|
179
|
-
|
|
180
|
-
### 推荐平台
|
|
181
|
-
|
|
182
|
-
- **Vercel** (Next.js 官方平台)
|
|
183
|
-
- 其他支持 Next.js 的托管平台
|
|
184
|
-
|
|
185
|
-
### 部署步骤
|
|
186
|
-
|
|
187
|
-
```bash
|
|
188
|
-
# 1. 构建项目
|
|
189
|
-
bun run build
|
|
190
|
-
|
|
191
|
-
# 2. 输出在 .next/ 目录
|
|
192
|
-
# 3. 使用 bun start 启动或部署到平台
|
|
193
|
-
```
|
|
194
|
-
|
|
195
|
-
## Troubleshooting
|
|
196
|
-
|
|
197
|
-
### 常见问题
|
|
198
|
-
|
|
199
|
-
| 问题 | 解决方案 |
|
|
200
|
-
|------|----------|
|
|
201
|
-
| 依赖安装失败 | 清除缓存:`rm -rf node_modules bun.lockb && bun install` |
|
|
202
|
-
| 端口被占用 | 修改端口或关闭占用 3000 端口的进程 |
|
|
203
|
-
| 类型错误 | 运行 `bun run lint` 检查 |
|
|
204
|
-
|
|
205
|
-
### 获取帮助
|
|
206
|
-
|
|
207
|
-
- 查看 [Next.js 文档](https://nextjs.org/docs)
|
|
208
|
-
- 查看 [Shadcn/ui 文档](https://ui.shadcn.com)
|
|
209
|
-
- 查看 [Tailwind CSS 文档](https://tailwindcss.com/docs)
|
package/docs/e2e-user-flows.csv
DELETED
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
flow_id,role,module,title,entry,preconditions,steps_summary,assertions,refs,phase,is_completed
|
|
2
|
-
E2E-UF-001,终端用户,反馈收集,提交反馈(基础字段+类型+优先级),Widget/Portal,项目已创建且嵌入入口可用,"打开表单->填标题/描述/类型/优先级->提交->获得跟踪链接","提交成功提示;生成可访问跟踪链接;新反馈可在列表/详情看到","FR1;FR2;FR3;FR5;FR30-FR32",Phase1(MVP),true
|
|
3
|
-
E2E-UF-002,终端用户,反馈收集,提交反馈(带附件上传),Widget/Portal,同E2E-UF-001,"提交时上传附件->提交成功","附件上传成功;详情页可看到/下载附件","FR1;FR4",Phase1(MVP),true
|
|
4
|
-
E2E-UF-003,终端用户,反馈查看,使用跟踪链接查看反馈详情,跟踪链接,已存在公开反馈,"访问跟踪链接->查看标题/描述/状态/附件","详情页可访问;状态展示与后台一致","FR5;FR14",Phase1(MVP),true
|
|
5
|
-
E2E-UF-004,终端用户,投票,对反馈投票,Portal反馈详情页,存在可投票公开反馈,"打开详情->点击投票","投票数变化或投票状态变化","FR15",Phase1(MVP),true
|
|
6
|
-
E2E-UF-005,客服,反馈收集,代客户提交反馈(代表客户提交),后台提交入口,客服账号已登录且有代提交权限,"登录->填写反馈->勾选代提交->提交->生成反馈链接","创建成功;带代提交标记/来源信息;可复制链接","FR6;FR23;FR29",Phase1(MVP),true
|
|
7
|
-
E2E-UF-006,产品团队,认证,登录系统(团队成员),登录页,存在有效用户,"打开登录页->输入凭据->登录->进入后台","进入受保护页面成功","FR23",Phase1(MVP),true
|
|
8
|
-
E2E-UF-007,产品经理/管理员,反馈管理,查看反馈列表(默认加载),后台反馈列表页,已登录且存在反馈数据,"进入列表页->加载列表","列表加载成功;关键字段可见","FR7",Phase1(MVP),true
|
|
9
|
-
E2E-UF-008,产品经理/管理员,反馈管理,列表筛选:按状态筛选,后台反馈列表页,存在多状态反馈,"选择状态筛选->列表刷新","列表项均符合筛选状态","FR8",Phase1(MVP),true
|
|
10
|
-
E2E-UF-009,产品经理/管理员,反馈管理,列表排序:按投票数/按时间排序,后台反馈列表页,存在投票数和时间差异数据,"选择按投票排序->切换按时间排序","排序结果符合预期","FR9;FR10",Phase1(MVP),true
|
|
11
|
-
E2E-UF-010,产品经理/管理员,反馈管理,查看反馈详情(后台),后台反馈列表/详情页,已登录且存在反馈,"从列表进入详情->查看完整信息","详情字段展示完整","FR11",Phase1(MVP),true
|
|
12
|
-
E2E-UF-011,产品经理/管理员,反馈管理,修改反馈状态,后台反馈详情页,已登录且对目标反馈有权限,"打开详情->修改状态->保存","状态更新后列表/详情同步","FR12",Phase1(MVP),true
|
|
13
|
-
E2E-UF-012,产品经理,反馈管理,编辑反馈标题与描述,后台反馈详情页,产品经理登录,"编辑标题/描述->保存->刷新","内容持久化","FR17",Phase1(MVP),true
|
|
14
|
-
E2E-UF-013,产品经理/管理员,反馈管理,删除反馈,后台反馈详情/列表页,有可删除反馈,"触发删除->二次确认","列表移除;详情不可访问/404","FR13",Phase1(MVP),true
|
|
15
|
-
E2E-UF-014,产品经理,协作与沟通,添加内部备注,后台反馈详情页,产品经理登录,"添加备注->保存","备注可见且持久化","FR16",Phase1(MVP),true
|
|
16
|
-
E2E-UF-015,管理员,协作与沟通,回复反馈并通知提交者(占位),后台反馈详情页,管理员登录,"回复->触发通知","回复成功;通知产生(需实现后通过Outbox/Mock SMTP断言)","FR18",Phase1(MVP/占位),true
|
|
17
|
-
E2E-UF-016,管理员,组织管理,创建组织,组织创建入口,允许创建组织,"创建组织->进入组织后台","组织创建成功;进入组织作用域","FR19",Phase1(MVP),true
|
|
18
|
-
E2E-UF-017,管理员,组织管理,邀请成员加入组织(邀请链接),组织成员管理页,管理员在组织内,"输入邮箱邀请->生成邀请链接->使用链接加入","成员出现在成员列表","FR20",Phase1(MVP),true
|
|
19
|
-
E2E-UF-018,管理员,组织管理,配置成员角色(RBAC),组织成员管理页,存在成员,"设置成员角色->刷新权限","不同角色权限生效","FR24;FR25",Phase1(MVP),true
|
|
20
|
-
E2E-UF-019,管理员,组织管理,移除组织成员,组织成员管理页,存在可移除成员,"移除成员->确认","成员被移除;无法访问组织资源","FR21",Phase1(MVP),true
|
|
21
|
-
E2E-UF-020,用户,认证,用户注册账户,注册页,允许自注册,"填写注册信息->提交->登录","注册成功且可登录","FR22;FR23",Phase1(MVP),true
|
|
22
|
-
E2E-UF-021,管理员,项目管理,创建项目,项目管理页,管理员登录,"创建项目->进入项目","项目创建成功","FR30",Phase1(MVP),true
|
|
23
|
-
E2E-UF-022,管理员/终端用户,项目管理,配置嵌入式Widget,项目设置/Widget配置页,已创建项目,"修改Widget配置->保存","配置持久化;预览/嵌入代码反映配置","FR31",Phase1(MVP),true
|
|
24
|
-
E2E-UF-023,管理员/终端用户,项目管理,获取嵌入代码并在外部页面使用(集成级占位),宿主页面+Widget,已创建项目且可复制嵌入代码,"复制嵌入代码->宿主页加载->打开Widget->提交反馈","Widget可加载;提交成功","FR32;FR1",Phase1(MVP/占位),true
|
|
25
|
-
E2E-UF-024,系统/产品团队,AI(基础),自动分类(关键词触发),提交反馈后/详情页,准备包含特定关键词的文本,"提交反馈->查看AI分类/建议","出现自动分类结果或建议提示","FR33;FR34",Phase1(MVP),true
|
|
26
|
-
E2E-UF-025,系统/产品团队,AI(基础),重复反馈检测建议(占位),创建/详情页,存在相似反馈A并创建相似反馈B,"创建B->查看重复建议","出现潜在重复建议UI","FR35",Phase1(MVP/占位),true
|
|
27
|
-
E2E-UF-026,匿名用户,权限控制,未登录访问后台受保护页面被拦截,直接访问后台URL,无,"访问受保护URL","重定向登录或401","FR25",Phase1(MVP),true
|
|
28
|
-
E2E-UF-027,开发者/客服,权限控制,无权编辑反馈状态(RBAC),后台反馈详情页,开发者/客服登录,"尝试修改状态","不显示入口或操作失败且提示无权限","FR25;RBAC",Phase1(MVP),true
|
|
29
|
-
E2E-UF-028,非管理员,权限控制,无权进行组织管理操作(RBAC),组织管理页/动作,非管理员登录,"访问组织管理页或执行邀请/移除/配置角色","被禁止访问","FR25;FR26;RBAC",Phase1(MVP),true
|
|
30
|
-
E2E-UF-029,运维,运维与部署,健康检查端点可用,/health,服务已运行,"请求/health","返回200且包含健康状态","FR39",Phase1(MVP),true
|
|
31
|
-
E2E-UF-030,运维/系统,可观测性,结构化日志产出(占位),日志系统,可读取日志输出,"执行一次关键操作->检查日志","至少出现结构化日志条目","FR40",Phase1(MVP/占位),true
|
|
@@ -1,138 +0,0 @@
|
|
|
1
|
-
erDiagram
|
|
2
|
-
feedback {
|
|
3
|
-
int feedbackId PK
|
|
4
|
-
text title
|
|
5
|
-
text description
|
|
6
|
-
text type
|
|
7
|
-
text priority
|
|
8
|
-
text status
|
|
9
|
-
text organizationId
|
|
10
|
-
boolean submittedOnBehalf
|
|
11
|
-
text submittedBy FK
|
|
12
|
-
jsonb customerInfo
|
|
13
|
-
timestamp createdAt
|
|
14
|
-
timestamp updatedAt
|
|
15
|
-
timestamp deletedAt
|
|
16
|
-
boolean autoClassified
|
|
17
|
-
text processingStatus
|
|
18
|
-
timestamp processedAt
|
|
19
|
-
int githubIssueId
|
|
20
|
-
int githubIssueNumber
|
|
21
|
-
text githubIssueUrl
|
|
22
|
-
timestamp githubSyncedAt
|
|
23
|
-
text githubStatus
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
attachments {
|
|
27
|
-
int attachmentId PK
|
|
28
|
-
int feedbackId FK
|
|
29
|
-
text fileName
|
|
30
|
-
text filePath
|
|
31
|
-
int fileSize
|
|
32
|
-
text mimeType
|
|
33
|
-
timestamp createdAt
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
votes {
|
|
37
|
-
int voteId PK
|
|
38
|
-
int feedbackId FK
|
|
39
|
-
text visitorId
|
|
40
|
-
text userId FK
|
|
41
|
-
timestamp createdAt
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
comments {
|
|
45
|
-
int commentId PK
|
|
46
|
-
int feedbackId FK
|
|
47
|
-
text userId FK
|
|
48
|
-
text authorName
|
|
49
|
-
text authorEmail
|
|
50
|
-
text guestToken
|
|
51
|
-
text content
|
|
52
|
-
boolean isInternal
|
|
53
|
-
timestamp createdAt
|
|
54
|
-
timestamp updatedAt
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
status_history {
|
|
58
|
-
int historyId PK
|
|
59
|
-
int feedbackId FK
|
|
60
|
-
text oldStatus
|
|
61
|
-
text newStatus
|
|
62
|
-
text changedBy FK
|
|
63
|
-
timestamp changedAt
|
|
64
|
-
text comment
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
tags {
|
|
68
|
-
int tagId PK
|
|
69
|
-
text name
|
|
70
|
-
text slug
|
|
71
|
-
text color
|
|
72
|
-
text description
|
|
73
|
-
timestamp createdAt
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
feedback_tags {
|
|
77
|
-
int id PK
|
|
78
|
-
int feedbackId FK
|
|
79
|
-
int tagId FK
|
|
80
|
-
timestamp createdAt
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
ai_processing_results {
|
|
84
|
-
int id PK
|
|
85
|
-
int feedbackId FK
|
|
86
|
-
jsonb classification
|
|
87
|
-
jsonb tagSuggestions
|
|
88
|
-
jsonb duplicateCandidates
|
|
89
|
-
int processingTime
|
|
90
|
-
text status
|
|
91
|
-
text errorMessage
|
|
92
|
-
timestamp createdAt
|
|
93
|
-
timestamp updatedAt
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
duplicate_feedback {
|
|
97
|
-
int id PK
|
|
98
|
-
int originalFeedbackId FK
|
|
99
|
-
int duplicateFeedbackId FK
|
|
100
|
-
int similarity
|
|
101
|
-
text status
|
|
102
|
-
text confirmedBy FK
|
|
103
|
-
timestamp confirmedAt
|
|
104
|
-
timestamp createdAt
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
notifications {
|
|
108
|
-
int notificationId PK
|
|
109
|
-
text userId FK
|
|
110
|
-
int feedbackId FK
|
|
111
|
-
text type
|
|
112
|
-
jsonb data
|
|
113
|
-
text status
|
|
114
|
-
timestamp sentAt
|
|
115
|
-
text error
|
|
116
|
-
timestamp createdAt
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
user {
|
|
120
|
-
text id PK
|
|
121
|
-
text name
|
|
122
|
-
text email
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
feedback ||--o{ attachments : has
|
|
126
|
-
feedback ||--o{ votes : has
|
|
127
|
-
feedback ||--o{ comments : has
|
|
128
|
-
feedback ||--o{ status_history : status
|
|
129
|
-
feedback ||--o{ feedback_tags : tags
|
|
130
|
-
feedback ||--o{ ai_processing_results : ai
|
|
131
|
-
feedback ||--o{ duplicate_feedback : duplicates
|
|
132
|
-
feedback ||--o{ notifications : notifies
|
|
133
|
-
|
|
134
|
-
tags ||--o{ feedback_tags : maps
|
|
135
|
-
user ||--o{ votes : votes
|
|
136
|
-
user ||--o{ comments : comments
|
|
137
|
-
user ||--o{ status_history : changes
|
|
138
|
-
user ||--o{ notifications : receives
|