@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,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)
@@ -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