@nexttylabs/echo 0.4.0 → 0.6.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 (262) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/app/(dashboard)/admin/feedback/[id]/edit/page.tsx +12 -6
  3. package/app/(dashboard)/admin/feedback/new/page.tsx +19 -17
  4. package/app/(dashboard)/admin/layout.tsx +16 -6
  5. package/app/(dashboard)/layout.tsx +4 -2
  6. package/app/(dashboard)/settings/api-keys/page.tsx +13 -3
  7. package/app/(dashboard)/settings/layout.tsx +25 -2
  8. package/app/(dashboard)/settings/organization/page.tsx +8 -9
  9. package/app/(public)/[organizationSlug]/roadmap/page.tsx +19 -1
  10. package/app/api/admin/backup/route.ts +22 -4
  11. package/app/api/auth/register/handler.ts +1 -2
  12. package/app/api/feedback/[id]/comments/[commentId]/route.ts +13 -4
  13. package/app/api/feedback/[id]/reclassify/route.ts +4 -4
  14. package/app/api/organizations/handler.ts +2 -4
  15. package/components/settings/settings-sidebar.tsx +4 -4
  16. package/hooks/use-organization.tsx +116 -0
  17. package/hooks/use-permissions.ts +24 -11
  18. package/lib/auth/config.ts +0 -7
  19. package/lib/auth/organization.ts +20 -0
  20. package/lib/auth/permissions.ts +10 -0
  21. package/lib/db/migrations/0000_needy_leech.sql +335 -0
  22. package/lib/db/migrations/meta/0000_snapshot.json +2186 -1
  23. package/lib/db/migrations/meta/_journal.json +2 -135
  24. package/lib/db/schema/auth.ts +0 -1
  25. package/lib/db/schema/index.ts +0 -1
  26. package/lib/portal/public-context.tsx +5 -0
  27. package/package.json +20 -1
  28. package/.changeset/README.md +0 -21
  29. package/.changeset/config.json +0 -11
  30. package/.changeset/cozy-ghosts-care.md +0 -5
  31. package/.changeset/sharp-lines-stand.md +0 -5
  32. package/.changeset/sour-doodles-eat.md +0 -5
  33. package/.changeset/tender-moose-shop.md +0 -5
  34. package/.github/pull_request_template.md +0 -13
  35. package/.github/workflows/ci.yml +0 -41
  36. package/.github/workflows/publish.yml +0 -44
  37. package/.github/workflows/release.yml +0 -73
  38. package/AGENTS.md +0 -92
  39. package/Dockerfile +0 -57
  40. package/Makefile +0 -77
  41. package/bun.lock +0 -2503
  42. package/components/portal/project-switcher.tsx +0 -20
  43. package/docker-compose.dev.yml +0 -26
  44. package/docker-compose.yml +0 -98
  45. package/docs/architecture.md +0 -259
  46. package/docs/component-inventory.md +0 -261
  47. package/docs/database-migrations.md +0 -76
  48. package/docs/development-guide.md +0 -209
  49. package/docs/e2e-user-flows.csv +0 -31
  50. package/docs/er-diagram-feedback.mmd +0 -138
  51. package/docs/er-diagram.mmd +0 -281
  52. package/docs/i18n-check-report.md +0 -296
  53. package/docs/index.md +0 -214
  54. package/docs/logic-chain.md +0 -94
  55. package/docs/plans/2026-01-02-database-migration-scripts.md +0 -496
  56. package/docs/plans/2026-01-02-user-login-design.md +0 -37
  57. package/docs/plans/2026-01-02-user-login.md +0 -437
  58. package/docs/plans/2026-01-02-user-registration-design.md +0 -47
  59. package/docs/plans/2026-01-02-user-registration.md +0 -628
  60. package/docs/plans/2026-01-03-roles-permissions-design.md +0 -20
  61. package/docs/plans/2026-01-03-roles-permissions.md +0 -266
  62. package/docs/plans/2026-01-05-authentication-middleware.md +0 -207
  63. package/docs/plans/2026-01-05-member-removal.md +0 -186
  64. package/docs/plans/2026-01-05-organization-creation.md +0 -374
  65. package/docs/plans/2026-01-05-rbac-middleware.md +0 -112
  66. package/docs/plans/2026-01-05-role-configuration.md +0 -441
  67. package/docs/plans/2026-01-06-file-upload-support.md +0 -804
  68. package/docs/plans/2026-01-06-permission-check-hook.md +0 -155
  69. package/docs/plans/2026-01-06-resource-ownership-check.md +0 -231
  70. package/docs/plans/2026-01-07-feedback-tracking-link.md +0 -459
  71. package/docs/plans/2026-01-09-logout-redirect-design.md +0 -52
  72. package/docs/plans/2026-01-09-phase2-3-plan.md +0 -654
  73. package/docs/plans/2026-01-09-portal-execution-plan.md +0 -408
  74. package/docs/plans/2026-01-09-project-delete-feature-design.md +0 -163
  75. package/docs/plans/2026-01-09-project-delete-implementation.md +0 -451
  76. package/docs/plans/2026-01-09-project-edit-delete-design.md +0 -52
  77. package/docs/plans/2026-01-09-settings-center-design.md +0 -114
  78. package/docs/plans/2026-01-09-settings-center.md +0 -948
  79. package/docs/plans/2026-01-10-organization-only-design.md +0 -66
  80. package/docs/plans/2026-01-10-organization-only-implementation.md +0 -433
  81. package/docs/plans/2026-01-10-portal-settings-restructure-plan.md +0 -18
  82. package/docs/plans/2026-01-10-project-settings-tabs-design-implementation.md +0 -296
  83. package/docs/plans/2026-01-14-e2e-playwright-feedback.md +0 -173
  84. package/docs/plans/2026-01-15-feedback-management-org-context-design.md +0 -82
  85. package/docs/plans/2026-01-15-feedback-management-org-context-implementation-plan.md +0 -521
  86. package/docs/plans/2026-01-16-admin-feedback-filters-design.md +0 -75
  87. package/docs/plans/2026-01-16-admin-feedback-filters-implementation.md +0 -293
  88. package/docs/plans/2026-01-16-admin-feedback-route-consolidation.md +0 -180
  89. package/docs/plans/2026-01-16-e2e-test-fixes.md +0 -158
  90. package/docs/plans/2026-01-17-admin-feedback-filters.md +0 -214
  91. package/docs/plans/2026-01-17-admin-feedback-improvements.md +0 -453
  92. package/docs/plans/2026-01-18-changesets-design.md +0 -40
  93. package/docs/product_changes.md +0 -37
  94. package/docs/project-overview.md +0 -159
  95. package/docs/project-scan-report.json +0 -104
  96. package/docs/route-role-visibility.md +0 -51
  97. package/docs/source-tree-analysis.md +0 -150
  98. package/docs/testing/delete-project-manual-tests.md +0 -18
  99. package/docs/user-story-tracking.md +0 -191
  100. package/eslint.config.mjs +0 -19
  101. package/lib/db/migrations/.gitkeep +0 -0
  102. package/lib/db/migrations/0000_cynical_gladiator.sql +0 -53
  103. package/lib/db/migrations/0001_wandering_sunfire.sql +0 -27
  104. package/lib/db/migrations/0002_shallow_speedball.sql +0 -1
  105. package/lib/db/migrations/0003_add_org_description.sql +0 -1
  106. package/lib/db/migrations/0003_boring_wild_pack.sql +0 -13
  107. package/lib/db/migrations/0004_windy_tyrannus.sql +0 -27
  108. package/lib/db/migrations/0005_perpetual_doorman.sql +0 -5
  109. package/lib/db/migrations/0006_aberrant_captain_midlands.sql +0 -13
  110. package/lib/db/migrations/0007_clever_captain_cross.sql +0 -14
  111. package/lib/db/migrations/0008_sparkling_pandemic.sql +0 -2
  112. package/lib/db/migrations/0009_happy_black_tom.sql +0 -29
  113. package/lib/db/migrations/0010_kind_junta.sql +0 -8
  114. package/lib/db/migrations/0011_mute_squadron_supreme.sql +0 -25
  115. package/lib/db/migrations/0012_giant_power_man.sql +0 -24
  116. package/lib/db/migrations/0013_damp_titanium_man.sql +0 -17
  117. package/lib/db/migrations/0014_blue_alice.sql +0 -18
  118. package/lib/db/migrations/0015_webhook_tables.sql +0 -41
  119. package/lib/db/migrations/0016_github_integration.sql +0 -30
  120. package/lib/db/migrations/0016_overjoyed_ghost_rider.sql +0 -22
  121. package/lib/db/migrations/0017_slimy_inhumans.sql +0 -6
  122. package/lib/db/migrations/0018_same_spitfire.sql +0 -1
  123. package/lib/db/migrations/0019_jittery_loners.sql +0 -16
  124. package/lib/db/migrations/0019_remove_projects_add_org_settings.sql +0 -14
  125. package/lib/db/migrations/meta/0001_snapshot.json +0 -553
  126. package/lib/db/migrations/meta/0002_snapshot.json +0 -560
  127. package/lib/db/migrations/meta/0003_snapshot.json +0 -650
  128. package/lib/db/migrations/meta/0004_snapshot.json +0 -852
  129. package/lib/db/migrations/meta/0005_snapshot.json +0 -900
  130. package/lib/db/migrations/meta/0006_snapshot.json +0 -1011
  131. package/lib/db/migrations/meta/0007_snapshot.json +0 -1125
  132. package/lib/db/migrations/meta/0008_snapshot.json +0 -1146
  133. package/lib/db/migrations/meta/0009_snapshot.json +0 -1386
  134. package/lib/db/migrations/meta/0010_snapshot.json +0 -1419
  135. package/lib/db/migrations/meta/0011_snapshot.json +0 -1615
  136. package/lib/db/migrations/meta/0012_snapshot.json +0 -1805
  137. package/lib/db/migrations/meta/0013_snapshot.json +0 -1948
  138. package/lib/db/migrations/meta/0014_snapshot.json +0 -2082
  139. package/lib/db/migrations/meta/0015_snapshot.json +0 -2476
  140. package/lib/db/migrations/meta/0016_snapshot.json +0 -2633
  141. package/lib/db/migrations/meta/0017_snapshot.json +0 -2680
  142. package/lib/db/migrations/meta/0018_snapshot.json +0 -2686
  143. package/lib/db/migrations/meta/0019_snapshot.json +0 -2741
  144. package/lib/db/schema/projects.ts +0 -145
  145. package/lib/db/schema/user-profiles.ts +0 -31
  146. package/lib/validations/projects.ts +0 -49
  147. package/next-env.d.ts +0 -6
  148. package/playwright.config.ts +0 -44
  149. package/proxy.test.ts +0 -131
  150. package/proxy.ts +0 -116
  151. package/scripts/backup-db.sh +0 -57
  152. package/scripts/backup-db.ts +0 -24
  153. package/scripts/generate-openapi.ts +0 -22
  154. package/scripts/migration-helper.ts +0 -39
  155. package/scripts/pre-deploy.ts +0 -75
  156. package/scripts/restore-db.sh +0 -60
  157. package/scripts/rollback.ts +0 -72
  158. package/scripts/seed-tags.ts +0 -48
  159. package/tests/api/feedback-bulk.test.ts +0 -47
  160. package/tests/api/feedback-by-id.test.ts +0 -67
  161. package/tests/api/feedback-comments-route-import.test.ts +0 -26
  162. package/tests/api/feedback-create.test.ts +0 -71
  163. package/tests/api/feedback-delete.test.ts +0 -160
  164. package/tests/api/feedback-filter.test.ts +0 -250
  165. package/tests/api/feedback-list.test.ts +0 -234
  166. package/tests/api/feedback-route-assignee-condition.test.ts +0 -32
  167. package/tests/api/feedback-similar.test.ts +0 -46
  168. package/tests/api/feedback-sort.test.ts +0 -261
  169. package/tests/api/feedback-status-enum.test.ts +0 -49
  170. package/tests/api/feedback-status-filter.test.ts +0 -117
  171. package/tests/api/feedback-submit-on-behalf.test.ts +0 -269
  172. package/tests/api/feedback.test.ts +0 -175
  173. package/tests/api/identify-jwt.test.ts +0 -25
  174. package/tests/api/invitation-accept.test.ts +0 -213
  175. package/tests/api/organization-invitations.test.ts +0 -186
  176. package/tests/api/organization-members-list.test.ts +0 -79
  177. package/tests/api/organization-members.test.ts +0 -340
  178. package/tests/api/organizations.test.ts +0 -149
  179. package/tests/api/register.test.ts +0 -112
  180. package/tests/api/upload.test.ts +0 -103
  181. package/tests/api/vote.test.ts +0 -82
  182. package/tests/app/admin-feedback-detail-page.test.tsx +0 -25
  183. package/tests/app/admin-feedback-list-page.test.tsx +0 -25
  184. package/tests/app/admin-feedback-new-page.test.tsx +0 -25
  185. package/tests/app/health-route-helpers.test.ts +0 -27
  186. package/tests/app/login-page.test.ts +0 -26
  187. package/tests/app/portal-page.test.ts +0 -29
  188. package/tests/app/project-portal-overview.test.tsx +0 -25
  189. package/tests/app/widget-page-import.test.ts +0 -25
  190. package/tests/components/create-post-dialog-defaults.test.ts +0 -43
  191. package/tests/components/feedback/duplicate-suggestions-inline.test.tsx +0 -27
  192. package/tests/components/feedback/embedded-feedback-form.test.tsx +0 -96
  193. package/tests/components/feedback/feedback-detail.test.tsx +0 -25
  194. package/tests/components/feedback/feedback-stats.test.tsx +0 -49
  195. package/tests/components/feedback-bulk-actions.test.tsx +0 -39
  196. package/tests/components/feedback-i18n-keys.test.ts +0 -70
  197. package/tests/components/feedback-list-controls-compile.test.ts +0 -25
  198. package/tests/components/feedback-list-controls.test.tsx +0 -204
  199. package/tests/components/feedback-list-item.test.tsx +0 -67
  200. package/tests/components/landing/hero.test.tsx +0 -46
  201. package/tests/components/layout/language-switcher.test.tsx +0 -25
  202. package/tests/components/layout/sidebar.test.tsx +0 -157
  203. package/tests/components/login-form.test.ts +0 -25
  204. package/tests/components/organization-form.test.ts +0 -32
  205. package/tests/components/organization-switcher.test.ts +0 -25
  206. package/tests/components/pagination.test.tsx +0 -43
  207. package/tests/components/portal-overview.test.tsx +0 -25
  208. package/tests/components/profile-form.test.tsx +0 -139
  209. package/tests/components/role-selector.test.ts +0 -31
  210. package/tests/components/status-chart.test.tsx +0 -90
  211. package/tests/e2e/auth.e2e.ts +0 -323
  212. package/tests/e2e/feedback-actions.e2e.ts +0 -471
  213. package/tests/e2e/feedback-attachment.e2e.ts +0 -168
  214. package/tests/e2e/feedback-customer.e2e.ts +0 -226
  215. package/tests/e2e/feedback-management.e2e.ts +0 -565
  216. package/tests/e2e/feedback-submit.e2e.ts +0 -133
  217. package/tests/e2e/feedback-view.e2e.ts +0 -297
  218. package/tests/e2e/fixtures/test-data.ts +0 -235
  219. package/tests/e2e/health-check.e2e.ts +0 -230
  220. package/tests/e2e/helpers/test-utils-helpers.test.ts +0 -43
  221. package/tests/e2e/helpers/test-utils.ts +0 -298
  222. package/tests/e2e/integration-placeholders.e2e.ts +0 -199
  223. package/tests/e2e/organization.e2e.ts +0 -292
  224. package/tests/e2e/permissions.e2e.ts +0 -424
  225. package/tests/e2e/project-widget.e2e.ts +0 -63
  226. package/tests/feedback/filters.test.ts +0 -29
  227. package/tests/hooks/use-permissions.test.ts +0 -52
  228. package/tests/lib/ai/classifier.test.ts +0 -104
  229. package/tests/lib/ai/duplicate-detector.test.ts +0 -234
  230. package/tests/lib/attachments-schema.test.ts +0 -30
  231. package/tests/lib/auth/session.test.ts +0 -49
  232. package/tests/lib/auth-client.test.ts +0 -37
  233. package/tests/lib/auth-config.test.ts +0 -26
  234. package/tests/lib/feedback-prefill.test.ts +0 -52
  235. package/tests/lib/feedback-processor.test.ts +0 -41
  236. package/tests/lib/feedback-schema.test.ts +0 -33
  237. package/tests/lib/file-validator.test.ts +0 -48
  238. package/tests/lib/get-feedback-by-id.test.ts +0 -37
  239. package/tests/lib/invitations.test.ts +0 -35
  240. package/tests/lib/login-schema.test.ts +0 -36
  241. package/tests/lib/org-context.test.ts +0 -95
  242. package/tests/lib/organization-access.test.ts +0 -44
  243. package/tests/lib/organization-member-role-schema.test.ts +0 -41
  244. package/tests/lib/permissions.test.ts +0 -88
  245. package/tests/lib/portal-analytics.test.ts +0 -25
  246. package/tests/lib/portal-contributors.test.ts +0 -25
  247. package/tests/lib/portal-copy.test.ts +0 -27
  248. package/tests/lib/portal-i18n.test.ts +0 -30
  249. package/tests/lib/portal-leaderboard-settings.test.ts +0 -25
  250. package/tests/lib/portal-modules.test.ts +0 -25
  251. package/tests/lib/portal-seo.test.ts +0 -25
  252. package/tests/lib/portal-sharing.test.ts +0 -25
  253. package/tests/lib/portal-sorting.test.ts +0 -25
  254. package/tests/lib/portal-theme.test.ts +0 -25
  255. package/tests/lib/rate-limit.test.ts +0 -142
  256. package/tests/lib/resolve-locale.test.ts +0 -34
  257. package/tests/lib/services/backup.test.ts +0 -145
  258. package/tests/lib/user-organizations.test.ts +0 -42
  259. package/tests/lib/user-role-schema.test.ts +0 -33
  260. package/tests/lib/user-schema.test.ts +0 -25
  261. package/tests/setup.ts +0 -74
  262. package/vercel.json +0 -4
@@ -5,141 +5,8 @@
5
5
  {
6
6
  "idx": 0,
7
7
  "version": "7",
8
- "when": 1767356248668,
9
- "tag": "0000_cynical_gladiator",
10
- "breakpoints": true
11
- },
12
- {
13
- "idx": 1,
14
- "version": "7",
15
- "when": 1767358480833,
16
- "tag": "0001_wandering_sunfire",
17
- "breakpoints": true
18
- },
19
- {
20
- "idx": 2,
21
- "version": "7",
22
- "when": 1767447464294,
23
- "tag": "0002_shallow_speedball",
24
- "breakpoints": true
25
- },
26
- {
27
- "idx": 3,
28
- "version": "7",
29
- "when": 1767618679883,
30
- "tag": "0003_boring_wild_pack",
31
- "breakpoints": true
32
- },
33
- {
34
- "idx": 4,
35
- "version": "7",
36
- "when": 1767686927936,
37
- "tag": "0004_windy_tyrannus",
38
- "breakpoints": true
39
- },
40
- {
41
- "idx": 5,
42
- "version": "7",
43
- "when": 1767775923741,
44
- "tag": "0005_perpetual_doorman",
45
- "breakpoints": true
46
- },
47
- {
48
- "idx": 6,
49
- "version": "7",
50
- "when": 1767779404021,
51
- "tag": "0006_aberrant_captain_midlands",
52
- "breakpoints": true
53
- },
54
- {
55
- "idx": 7,
56
- "version": "7",
57
- "when": 1767780880706,
58
- "tag": "0007_clever_captain_cross",
59
- "breakpoints": true
60
- },
61
- {
62
- "idx": 8,
63
- "version": "7",
64
- "when": 1767781386461,
65
- "tag": "0008_sparkling_pandemic",
66
- "breakpoints": true
67
- },
68
- {
69
- "idx": 9,
70
- "version": "7",
71
- "when": 1767796022398,
72
- "tag": "0009_happy_black_tom",
73
- "breakpoints": true
74
- },
75
- {
76
- "idx": 10,
77
- "version": "7",
78
- "when": 1767796896302,
79
- "tag": "0010_kind_junta",
80
- "breakpoints": true
81
- },
82
- {
83
- "idx": 11,
84
- "version": "7",
85
- "when": 1767797351041,
86
- "tag": "0011_mute_squadron_supreme",
87
- "breakpoints": true
88
- },
89
- {
90
- "idx": 12,
91
- "version": "7",
92
- "when": 1767798663525,
93
- "tag": "0012_giant_power_man",
94
- "breakpoints": true
95
- },
96
- {
97
- "idx": 13,
98
- "version": "7",
99
- "when": 1767799814306,
100
- "tag": "0013_damp_titanium_man",
101
- "breakpoints": true
102
- },
103
- {
104
- "idx": 14,
105
- "version": "7",
106
- "when": 1767800034105,
107
- "tag": "0014_blue_alice",
108
- "breakpoints": true
109
- },
110
- {
111
- "idx": 15,
112
- "version": "7",
113
- "when": 1767858973622,
114
- "tag": "0015_webhook_tables",
115
- "breakpoints": true
116
- },
117
- {
118
- "idx": 16,
119
- "version": "7",
120
- "when": 1767869834578,
121
- "tag": "0016_overjoyed_ghost_rider",
122
- "breakpoints": true
123
- },
124
- {
125
- "idx": 17,
126
- "version": "7",
127
- "when": 1768024527472,
128
- "tag": "0017_slimy_inhumans",
129
- "breakpoints": true
130
- },
131
- {
132
- "idx": 18,
133
- "version": "7",
134
- "when": 1768031440139,
135
- "tag": "0018_same_spitfire",
136
- "breakpoints": true
137
- },
138
- {
139
- "idx": 19,
140
- "version": "7",
141
- "when": 1768056878170,
142
- "tag": "0019_jittery_loners",
8
+ "when": 1768879906435,
9
+ "tag": "0000_needy_leech",
143
10
  "breakpoints": true
144
11
  }
145
12
  ]
@@ -22,7 +22,6 @@ export const user = pgTable("user", {
22
22
  id: text("id").primaryKey(),
23
23
  name: text("name").notNull(),
24
24
  email: text("email").notNull().unique(),
25
- role: text("role").notNull().default("admin"),
26
25
  emailVerified: boolean("email_verified").default(false).notNull(),
27
26
  image: text("image"),
28
27
  createdAt: timestamp("created_at").defaultNow().notNull(),
@@ -16,7 +16,6 @@
16
16
  */
17
17
 
18
18
  export * from "./auth";
19
- export * from "./user-profiles";
20
19
  export * from "./organizations";
21
20
  export * from "./organization-settings";
22
21
  export * from "./organization-members";
@@ -34,6 +34,11 @@ const defaultModules: PortalModulesConfig = {
34
34
  export async function getPortalPublicContext(organizationSlug: string) {
35
35
  if (!db) return null;
36
36
 
37
+ // Skip static asset paths that shouldn't be treated as org slugs
38
+ if (organizationSlug.includes('.') || /^(api|_next|favicon|apple-touch-icon|robots|sitemap)/.test(organizationSlug)) {
39
+ return null;
40
+ }
41
+
37
42
  const organization = await db.query.organizations.findFirst({
38
43
  where: eq(organizations.slug, organizationSlug),
39
44
  });
package/package.json CHANGED
@@ -1,11 +1,30 @@
1
1
  {
2
2
  "name": "@nexttylabs/echo",
3
- "version": "0.4.0",
3
+ "version": "0.6.0",
4
4
  "license": "AGPL-3.0",
5
5
  "private": false,
6
6
  "publishConfig": {
7
7
  "access": "public"
8
8
  },
9
+ "files": [
10
+ "app",
11
+ "components",
12
+ "lib",
13
+ "hooks",
14
+ "i18n",
15
+ "messages",
16
+ "public",
17
+ "db",
18
+ "types",
19
+ "next.config.ts",
20
+ "tsconfig.json",
21
+ "postcss.config.mjs",
22
+ "drizzle.config.ts",
23
+ "components.json",
24
+ "README.md",
25
+ "LICENSE",
26
+ "CHANGELOG.md"
27
+ ],
9
28
  "scripts": {
10
29
  "dev": "bun --bun next dev",
11
30
  "build": "node node_modules/next/dist/bin/next build",
@@ -1,21 +0,0 @@
1
- # Changesets
2
-
3
- This repository uses Changesets to manage versioning and changelogs.
4
-
5
- ## Add a changeset
6
-
7
- ```bash
8
- bun run changeset
9
- ```
10
-
11
- Follow the prompts and commit the generated file in `.changeset/` with your changes.
12
-
13
- ## Release flow
14
-
15
- On merge to `main`, GitHub Actions will:
16
- 1. Run `changeset version`
17
- 2. Update `CHANGELOG.md` and `package.json`
18
- 3. Create a tag `vX.Y.Z`
19
- 4. Publish to npm
20
-
21
- See `.github/workflows/release.yml` for details.
@@ -1,11 +0,0 @@
1
- {
2
- "$schema": "https://unpkg.com/@changesets/config/schema.json",
3
- "changelog": "@changesets/cli/changelog",
4
- "commit": false,
5
- "fixed": [],
6
- "linked": [],
7
- "access": "public",
8
- "baseBranch": "main",
9
- "updateInternalDependencies": "patch",
10
- "ignore": []
11
- }
@@ -1,5 +0,0 @@
1
- ---
2
- "@nexttylabs/echo": patch
3
- ---
4
-
5
- remove legacy changeset files
@@ -1,5 +0,0 @@
1
- ---
2
- "@nexttylabs/echo": minor
3
- ---
4
-
5
- feat: support editing user profile
@@ -1,5 +0,0 @@
1
- ---
2
- "@nexttylabs/echo": patch
3
- ---
4
-
5
- fix workflow errors
@@ -1,5 +0,0 @@
1
- ---
2
- "@nexttylabs/echo": patch
3
- ---
4
-
5
- first release
@@ -1,13 +0,0 @@
1
- ## Summary
2
-
3
- - [ ] This PR includes at least one changeset file (run `bun run changeset`)
4
-
5
- ## Changes
6
-
7
- -
8
-
9
- ## Testing
10
-
11
- - [ ] `bun run lint`
12
- - [ ] `bun run test`
13
- - [ ] `bun run build`
@@ -1,41 +0,0 @@
1
- name: CI
2
-
3
- on:
4
- push:
5
- branches: [ main ]
6
- pull_request:
7
- branches: [ main ]
8
-
9
- permissions:
10
- contents: read
11
-
12
- jobs:
13
- ci:
14
- runs-on: ubuntu-latest
15
-
16
- steps:
17
- - name: Checkout
18
- uses: actions/checkout@v4
19
-
20
- - name: Setup Node.js
21
- uses: actions/setup-node@v4
22
- with:
23
- node-version: '20.x'
24
-
25
- - name: Setup Bun
26
- uses: oven-sh/setup-bun@v1
27
- with:
28
- bun-version: 'latest'
29
- cache: true
30
-
31
- - name: Install dependencies
32
- run: bun install
33
-
34
- - name: Lint
35
- run: bun run lint
36
-
37
- - name: Test
38
- run: bun run test
39
-
40
- - name: Build
41
- run: bun run build
@@ -1,44 +0,0 @@
1
- name: Publish
2
-
3
- on:
4
- push:
5
- tags: [ 'v*' ]
6
- workflow_dispatch:
7
- inputs:
8
- tag:
9
- description: 'Tag version to publish'
10
- required: true
11
- type: string
12
-
13
- permissions:
14
- contents: read
15
-
16
- jobs:
17
- publish:
18
- runs-on: ubuntu-latest
19
-
20
- steps:
21
- - name: Checkout
22
- uses: actions/checkout@v4
23
-
24
- - name: Setup Node.js
25
- uses: actions/setup-node@v4
26
- with:
27
- node-version: '20.x'
28
- registry-url: 'https://registry.npmjs.org'
29
-
30
- - name: Setup Bun
31
- uses: oven-sh/setup-bun@v1
32
- with:
33
- bun-version: 'latest'
34
-
35
- - name: Install dependencies
36
- run: bun install
37
-
38
- - name: Build
39
- run: bun run build
40
-
41
- - name: Publish
42
- env:
43
- NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
44
- run: npm publish --access public
@@ -1,73 +0,0 @@
1
- name: Release
2
-
3
- on:
4
- push:
5
- branches: [ main ]
6
-
7
- permissions:
8
- contents: write
9
- actions: write
10
-
11
- jobs:
12
- version:
13
- runs-on: ubuntu-latest
14
-
15
- steps:
16
- - name: Checkout
17
- uses: actions/checkout@v4
18
- with:
19
- fetch-depth: 0
20
-
21
- - name: Setup Node.js
22
- uses: actions/setup-node@v4
23
- with:
24
- node-version: '20.x'
25
-
26
- - name: Setup Bun
27
- uses: oven-sh/setup-bun@v1
28
- with:
29
- bun-version: 'latest'
30
-
31
- - name: Install dependencies
32
- run: bun install
33
-
34
- - name: Version packages
35
- run: bunx changeset version
36
-
37
- - name: Check for changes
38
- id: git_status
39
- run: |
40
- if [[ -n "$(git status --porcelain)" ]]; then
41
- echo "changed=true" >> "$GITHUB_OUTPUT"
42
- else
43
- echo "changed=false" >> "$GITHUB_OUTPUT"
44
- fi
45
-
46
- - name: Commit version updates
47
- if: steps.git_status.outputs.changed == 'true'
48
- run: |
49
- git config user.name "github-actions[bot]"
50
- git config user.email "github-actions[bot]@users.noreply.github.com"
51
- git add package.json CHANGELOG.md
52
- git commit -m "chore: release"
53
-
54
- - name: Create tag
55
- if: steps.git_status.outputs.changed == 'true'
56
- run: |
57
- VERSION=$(node -p "require('./package.json').version")
58
- git tag "v${VERSION}"
59
-
60
- - name: Push changes and tag
61
- if: steps.git_status.outputs.changed == 'true'
62
- run: |
63
- git push origin HEAD:main
64
- VERSION=$(node -p "require('./package.json').version")
65
- git push origin "v${VERSION}"
66
-
67
- - name: Trigger Publish workflow
68
- if: steps.git_status.outputs.changed == 'true'
69
- run: |
70
- VERSION=$(node -p "require('./package.json').version")
71
- gh workflow run publish.yml -f tag="v${VERSION}"
72
- env:
73
- GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
package/AGENTS.md DELETED
@@ -1,92 +0,0 @@
1
- # AGENTS.md
2
-
3
- This file provides guidance to agents when working with code in this repository.
4
-
5
- ## Project Overview
6
-
7
- Echo is a modern Next.js application using the App Router with React 19, TypeScript, and Tailwind CSS v4. The project uses Bun as the package manager and Shadcn/ui (Radix UI primitives with Base UI) for component library.
8
-
9
- ## Development Commands
10
-
11
- This project uses **Bun** as the package manager (not npm, yarn, or pnpm).
12
-
13
- ```bash
14
- bun dev # Start development server on http://localhost:3000
15
- bun run build # Build for production
16
- bun start # Start production server
17
- bun run lint # Run ESLint
18
- ```
19
-
20
- ## Architecture
21
-
22
- ### Directory Structure
23
- - `app/` - Next.js App Router (layout.tsx, page.tsx, globals.css)
24
- - `components/` - Custom components
25
- - `components/ui/` - Shadcn/ui components (14 base components)
26
- - `lib/` - Utility functions
27
- - `public/` - Static assets
28
-
29
- ### Import Aliases (from components.json)
30
- ```
31
- @/components → components/
32
- @/lib → lib/
33
- @/components/ui → components/ui
34
- @/hooks → hooks/ (not yet created)
35
- ```
36
-
37
- ### Styling System
38
-
39
- **Tailwind CSS v4** with inline configuration in `app/globals.css`:
40
- - No separate tailwind.config file - uses `@theme inline` directive
41
- - CSS custom properties for all theming (light/dark mode)
42
- - Uses **oklch color space** for perceptually uniform colors
43
- - Custom dark mode via `.dark` class selector
44
- - Includes `tw-animate-css` for animations
45
-
46
- **Shadcn/ui Configuration:**
47
- - Style variant: `radix-maia`
48
- - Base color: `neutral`
49
- - Icon library: `lucide-react`
50
- - RSC (React Server Components): enabled
51
-
52
- ### Component Conventions
53
-
54
- 1. UI components from Shadcn are in `components/ui/` - modify these directly rather than re-installing
55
- 2. Use the `cn()` utility from `lib/utils.ts` for class name merging (combines clsx and tailwind-merge)
56
- 3. All component files are `.tsx` with React Server Components enabled
57
-
58
- ### TypeScript Configuration
59
-
60
- - `strict: true` enabled
61
- - Path alias `@/*` maps to project root
62
- - Module resolution: `bundler` mode
63
- - JSX: `react-jsx` transform
64
-
65
- ### Internationalization
66
-
67
- - The project uses **next-intl** for internationalization.
68
- - All user-facing text in components and pages must be localized using language files (e.g., `messages/en.json`).
69
- - Avoid hardcoding strings in TSX files; use the `useTranslations` hook instead.
70
-
71
- ## Tech Stack Summary
72
-
73
- | Technology | Version |
74
- |------------|---------|
75
- | Next.js | 16.1.1 |
76
- | React | 19.2.3 |
77
- | TypeScript | 5.x |
78
- | Tailwind CSS | 4.x |
79
- | Shadcn/ui | 3.6.2 |
80
- | Base UI | 1.0.0 |
81
- | Radix UI | 1.4.3 |
82
- | Lucide React | 0.562.0 |
83
-
84
- ## Browser Automation
85
-
86
- Use `agent-browser` for web automation. Run `agent-browser --help` for all commands.
87
-
88
- Core workflow:
89
- 1. `agent-browser open <url>` - Navigate to page
90
- 2. `agent-browser snapshot -i` - Get interactive elements with refs (@e1, @e2)
91
- 3. `agent-browser click @e1` / `fill @e2 "text"` - Interact using refs
92
- 4. Re-snapshot after page changes
package/Dockerfile DELETED
@@ -1,57 +0,0 @@
1
- # Dockerfile
2
- FROM node:20-alpine AS base
3
-
4
- # Install dependencies only when needed
5
- FROM base AS deps
6
- RUN apk add --no-cache libc6-compat
7
- WORKDIR /app
8
-
9
- # Install bun
10
- COPY --from=oven/bun:1 /usr/local/bin/bun /bin/bun
11
-
12
- # Copy package files
13
- COPY package.json bun.lock* ./
14
- RUN bun install --frozen-lockfile
15
-
16
- # Rebuild the source code only when needed
17
- FROM base AS builder
18
- WORKDIR /app
19
- COPY --from=deps /app/node_modules ./node_modules
20
- COPY . .
21
-
22
- # Install bun
23
- COPY --from=oven/bun:1 /usr/local/bin/bun /bin/bun
24
-
25
- # Set environment for build
26
- ENV NEXT_TELEMETRY_DISABLED=1
27
-
28
- RUN bun run build
29
-
30
- # Production image, copy all the files and run next
31
- FROM base AS runner
32
- WORKDIR /app
33
-
34
- ENV NODE_ENV=production
35
- ENV NEXT_TELEMETRY_DISABLED=1
36
-
37
- RUN addgroup --system --gid 1001 nodejs
38
- RUN adduser --system --uid 1001 nextjs
39
-
40
- COPY --from=builder /app/public ./public
41
-
42
- # Set correct permission for prerender cache
43
- RUN mkdir -p .next
44
- RUN chown nextjs:nodejs .next
45
-
46
- # Automatically leverage output traces to reduce image size
47
- COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./
48
- COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static
49
-
50
- USER nextjs
51
-
52
- EXPOSE 3000
53
-
54
- ENV PORT=3000
55
- ENV HOSTNAME="0.0.0.0"
56
-
57
- CMD ["node", "server.js"]
package/Makefile DELETED
@@ -1,77 +0,0 @@
1
- # Makefile
2
-
3
- .PHONY: help dev build up down restart logs db-migrate db-backup
4
-
5
- help: ## Show this help message
6
- @echo 'Usage: make [target]'
7
- @echo ''
8
- @echo 'Available targets:'
9
- @awk 'BEGIN {FS = ":.*?## "} /^[a-zA-Z_-]+:.*?## / {printf " \033[36m%-15s\033[0m %s\n", $$1, $$2}' $(MAKEFILE_LIST)
10
-
11
- dev: ## Start development environment
12
- docker-compose -f docker-compose.dev.yml up -d
13
- @echo "Development environment started!"
14
- @echo "App: http://localhost:3000"
15
- @echo "Database: postgresql://echo:echo@localhost:5432/echo_dev"
16
-
17
- build: ## Build production images
18
- docker-compose build
19
-
20
- up: ## Start production environment
21
- docker-compose up -d
22
- @echo "Production environment started!"
23
- @echo "App: http://localhost:3000"
24
-
25
- down: ## Stop all containers
26
- docker-compose down
27
-
28
- restart: ## Restart all containers
29
- docker-compose restart
30
-
31
- logs: ## Show logs from all containers
32
- docker-compose logs -f
33
-
34
- logs-app: ## Show logs from app container
35
- docker-compose logs -f app
36
-
37
- logs-db: ## Show logs from database container
38
- docker-compose logs -f postgres
39
-
40
- db-migrate: ## Run database migrations
41
- docker-compose exec app bunx drizzle-kit migrate
42
-
43
- db-backup: ## Backup database (Docker)
44
- @mkdir -p backups
45
- docker-compose exec postgres pg_dump -U echo echo > backups/backup-$$(date +%Y%m%d-%H%M%S).sql
46
- @echo "Backup completed!"
47
-
48
- db-restore: ## Restore database (usage: make db-restore FILE=backups/backup.sql)
49
- docker-compose exec -T postgres psql -U echo echo < $(FILE)
50
-
51
- backup: ## Create database backup (local)
52
- @echo "Creating backup..."
53
- ./scripts/backup-db.sh
54
-
55
- backup-ts: ## Create database backup using TypeScript
56
- bun run scripts/backup-db.ts
57
-
58
- restore: ## Restore database (usage: make restore FILE=backups/echo-20240101-020000.sql.gz)
59
- ./scripts/restore-db.sh $(FILE)
60
-
61
- list-backups: ## List all backups
62
- @echo "Available backups:"
63
- @ls -lh backups/echo-*.sql.gz 2>/dev/null || echo "No backups found"
64
-
65
- db-shell: ## Open database shell
66
- docker-compose exec postgres psql -U echo echo
67
-
68
- shell: ## Open app container shell
69
- docker-compose exec app sh
70
-
71
- clean: ## Remove all containers, volumes, and images
72
- docker-compose down -v --rmi all
73
- @echo "Everything cleaned up!"
74
-
75
- dev-watch: ## Start development with hot reload
76
- @echo "Starting development server with hot reload..."
77
- bun run dev