@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.
Files changed (247) hide show
  1. package/CHANGELOG.md +13 -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/bun.lock +0 -2503
  27. package/components/portal/project-switcher.tsx +0 -20
  28. package/docker-compose.dev.yml +0 -26
  29. package/docker-compose.yml +0 -98
  30. package/docs/architecture.md +0 -259
  31. package/docs/component-inventory.md +0 -261
  32. package/docs/database-migrations.md +0 -76
  33. package/docs/development-guide.md +0 -209
  34. package/docs/e2e-user-flows.csv +0 -31
  35. package/docs/er-diagram-feedback.mmd +0 -138
  36. package/docs/er-diagram.mmd +0 -281
  37. package/docs/i18n-check-report.md +0 -296
  38. package/docs/index.md +0 -214
  39. package/docs/logic-chain.md +0 -94
  40. package/docs/plans/2026-01-02-database-migration-scripts.md +0 -496
  41. package/docs/plans/2026-01-02-user-login-design.md +0 -37
  42. package/docs/plans/2026-01-02-user-login.md +0 -437
  43. package/docs/plans/2026-01-02-user-registration-design.md +0 -47
  44. package/docs/plans/2026-01-02-user-registration.md +0 -628
  45. package/docs/plans/2026-01-03-roles-permissions-design.md +0 -20
  46. package/docs/plans/2026-01-03-roles-permissions.md +0 -266
  47. package/docs/plans/2026-01-05-authentication-middleware.md +0 -207
  48. package/docs/plans/2026-01-05-member-removal.md +0 -186
  49. package/docs/plans/2026-01-05-organization-creation.md +0 -374
  50. package/docs/plans/2026-01-05-rbac-middleware.md +0 -112
  51. package/docs/plans/2026-01-05-role-configuration.md +0 -441
  52. package/docs/plans/2026-01-06-file-upload-support.md +0 -804
  53. package/docs/plans/2026-01-06-permission-check-hook.md +0 -155
  54. package/docs/plans/2026-01-06-resource-ownership-check.md +0 -231
  55. package/docs/plans/2026-01-07-feedback-tracking-link.md +0 -459
  56. package/docs/plans/2026-01-09-logout-redirect-design.md +0 -52
  57. package/docs/plans/2026-01-09-phase2-3-plan.md +0 -654
  58. package/docs/plans/2026-01-09-portal-execution-plan.md +0 -408
  59. package/docs/plans/2026-01-09-project-delete-feature-design.md +0 -163
  60. package/docs/plans/2026-01-09-project-delete-implementation.md +0 -451
  61. package/docs/plans/2026-01-09-project-edit-delete-design.md +0 -52
  62. package/docs/plans/2026-01-09-settings-center-design.md +0 -114
  63. package/docs/plans/2026-01-09-settings-center.md +0 -948
  64. package/docs/plans/2026-01-10-organization-only-design.md +0 -66
  65. package/docs/plans/2026-01-10-organization-only-implementation.md +0 -433
  66. package/docs/plans/2026-01-10-portal-settings-restructure-plan.md +0 -18
  67. package/docs/plans/2026-01-10-project-settings-tabs-design-implementation.md +0 -296
  68. package/docs/plans/2026-01-14-e2e-playwright-feedback.md +0 -173
  69. package/docs/plans/2026-01-15-feedback-management-org-context-design.md +0 -82
  70. package/docs/plans/2026-01-15-feedback-management-org-context-implementation-plan.md +0 -521
  71. package/docs/plans/2026-01-16-admin-feedback-filters-design.md +0 -75
  72. package/docs/plans/2026-01-16-admin-feedback-filters-implementation.md +0 -293
  73. package/docs/plans/2026-01-16-admin-feedback-route-consolidation.md +0 -180
  74. package/docs/plans/2026-01-16-e2e-test-fixes.md +0 -158
  75. package/docs/plans/2026-01-17-admin-feedback-filters.md +0 -214
  76. package/docs/plans/2026-01-17-admin-feedback-improvements.md +0 -453
  77. package/docs/plans/2026-01-18-changesets-design.md +0 -40
  78. package/docs/product_changes.md +0 -37
  79. package/docs/project-overview.md +0 -159
  80. package/docs/project-scan-report.json +0 -104
  81. package/docs/route-role-visibility.md +0 -51
  82. package/docs/source-tree-analysis.md +0 -150
  83. package/docs/testing/delete-project-manual-tests.md +0 -18
  84. package/docs/user-story-tracking.md +0 -191
  85. package/eslint.config.mjs +0 -19
  86. package/lib/db/migrations/.gitkeep +0 -0
  87. package/lib/db/migrations/0000_cynical_gladiator.sql +0 -53
  88. package/lib/db/migrations/0001_wandering_sunfire.sql +0 -27
  89. package/lib/db/migrations/0002_shallow_speedball.sql +0 -1
  90. package/lib/db/migrations/0003_add_org_description.sql +0 -1
  91. package/lib/db/migrations/0003_boring_wild_pack.sql +0 -13
  92. package/lib/db/migrations/0004_windy_tyrannus.sql +0 -27
  93. package/lib/db/migrations/0005_perpetual_doorman.sql +0 -5
  94. package/lib/db/migrations/0006_aberrant_captain_midlands.sql +0 -13
  95. package/lib/db/migrations/0007_clever_captain_cross.sql +0 -14
  96. package/lib/db/migrations/0008_sparkling_pandemic.sql +0 -2
  97. package/lib/db/migrations/0009_happy_black_tom.sql +0 -29
  98. package/lib/db/migrations/0010_kind_junta.sql +0 -8
  99. package/lib/db/migrations/0011_mute_squadron_supreme.sql +0 -25
  100. package/lib/db/migrations/0012_giant_power_man.sql +0 -24
  101. package/lib/db/migrations/0013_damp_titanium_man.sql +0 -17
  102. package/lib/db/migrations/0014_blue_alice.sql +0 -18
  103. package/lib/db/migrations/0015_webhook_tables.sql +0 -41
  104. package/lib/db/migrations/0016_github_integration.sql +0 -30
  105. package/lib/db/migrations/0016_overjoyed_ghost_rider.sql +0 -22
  106. package/lib/db/migrations/0017_slimy_inhumans.sql +0 -6
  107. package/lib/db/migrations/0018_same_spitfire.sql +0 -1
  108. package/lib/db/migrations/0019_jittery_loners.sql +0 -16
  109. package/lib/db/migrations/0019_remove_projects_add_org_settings.sql +0 -14
  110. package/lib/db/migrations/meta/0001_snapshot.json +0 -553
  111. package/lib/db/migrations/meta/0002_snapshot.json +0 -560
  112. package/lib/db/migrations/meta/0003_snapshot.json +0 -650
  113. package/lib/db/migrations/meta/0004_snapshot.json +0 -852
  114. package/lib/db/migrations/meta/0005_snapshot.json +0 -900
  115. package/lib/db/migrations/meta/0006_snapshot.json +0 -1011
  116. package/lib/db/migrations/meta/0007_snapshot.json +0 -1125
  117. package/lib/db/migrations/meta/0008_snapshot.json +0 -1146
  118. package/lib/db/migrations/meta/0009_snapshot.json +0 -1386
  119. package/lib/db/migrations/meta/0010_snapshot.json +0 -1419
  120. package/lib/db/migrations/meta/0011_snapshot.json +0 -1615
  121. package/lib/db/migrations/meta/0012_snapshot.json +0 -1805
  122. package/lib/db/migrations/meta/0013_snapshot.json +0 -1948
  123. package/lib/db/migrations/meta/0014_snapshot.json +0 -2082
  124. package/lib/db/migrations/meta/0015_snapshot.json +0 -2476
  125. package/lib/db/migrations/meta/0016_snapshot.json +0 -2633
  126. package/lib/db/migrations/meta/0017_snapshot.json +0 -2680
  127. package/lib/db/migrations/meta/0018_snapshot.json +0 -2686
  128. package/lib/db/migrations/meta/0019_snapshot.json +0 -2741
  129. package/lib/db/schema/projects.ts +0 -145
  130. package/lib/db/schema/user-profiles.ts +0 -31
  131. package/lib/validations/projects.ts +0 -49
  132. package/next-env.d.ts +0 -6
  133. package/playwright.config.ts +0 -44
  134. package/proxy.test.ts +0 -131
  135. package/proxy.ts +0 -116
  136. package/scripts/backup-db.sh +0 -57
  137. package/scripts/backup-db.ts +0 -24
  138. package/scripts/generate-openapi.ts +0 -22
  139. package/scripts/migration-helper.ts +0 -39
  140. package/scripts/pre-deploy.ts +0 -75
  141. package/scripts/restore-db.sh +0 -60
  142. package/scripts/rollback.ts +0 -72
  143. package/scripts/seed-tags.ts +0 -48
  144. package/tests/api/feedback-bulk.test.ts +0 -47
  145. package/tests/api/feedback-by-id.test.ts +0 -67
  146. package/tests/api/feedback-comments-route-import.test.ts +0 -26
  147. package/tests/api/feedback-create.test.ts +0 -71
  148. package/tests/api/feedback-delete.test.ts +0 -160
  149. package/tests/api/feedback-filter.test.ts +0 -250
  150. package/tests/api/feedback-list.test.ts +0 -234
  151. package/tests/api/feedback-route-assignee-condition.test.ts +0 -32
  152. package/tests/api/feedback-similar.test.ts +0 -46
  153. package/tests/api/feedback-sort.test.ts +0 -261
  154. package/tests/api/feedback-status-enum.test.ts +0 -49
  155. package/tests/api/feedback-status-filter.test.ts +0 -117
  156. package/tests/api/feedback-submit-on-behalf.test.ts +0 -269
  157. package/tests/api/feedback.test.ts +0 -175
  158. package/tests/api/identify-jwt.test.ts +0 -25
  159. package/tests/api/invitation-accept.test.ts +0 -213
  160. package/tests/api/organization-invitations.test.ts +0 -186
  161. package/tests/api/organization-members-list.test.ts +0 -79
  162. package/tests/api/organization-members.test.ts +0 -340
  163. package/tests/api/organizations.test.ts +0 -149
  164. package/tests/api/register.test.ts +0 -112
  165. package/tests/api/upload.test.ts +0 -103
  166. package/tests/api/vote.test.ts +0 -82
  167. package/tests/app/admin-feedback-detail-page.test.tsx +0 -25
  168. package/tests/app/admin-feedback-list-page.test.tsx +0 -25
  169. package/tests/app/admin-feedback-new-page.test.tsx +0 -25
  170. package/tests/app/health-route-helpers.test.ts +0 -27
  171. package/tests/app/login-page.test.ts +0 -26
  172. package/tests/app/portal-page.test.ts +0 -29
  173. package/tests/app/project-portal-overview.test.tsx +0 -25
  174. package/tests/app/widget-page-import.test.ts +0 -25
  175. package/tests/components/create-post-dialog-defaults.test.ts +0 -43
  176. package/tests/components/feedback/duplicate-suggestions-inline.test.tsx +0 -27
  177. package/tests/components/feedback/embedded-feedback-form.test.tsx +0 -96
  178. package/tests/components/feedback/feedback-detail.test.tsx +0 -25
  179. package/tests/components/feedback/feedback-stats.test.tsx +0 -49
  180. package/tests/components/feedback-bulk-actions.test.tsx +0 -39
  181. package/tests/components/feedback-i18n-keys.test.ts +0 -70
  182. package/tests/components/feedback-list-controls-compile.test.ts +0 -25
  183. package/tests/components/feedback-list-controls.test.tsx +0 -204
  184. package/tests/components/feedback-list-item.test.tsx +0 -67
  185. package/tests/components/landing/hero.test.tsx +0 -46
  186. package/tests/components/layout/language-switcher.test.tsx +0 -25
  187. package/tests/components/layout/sidebar.test.tsx +0 -157
  188. package/tests/components/login-form.test.ts +0 -25
  189. package/tests/components/organization-form.test.ts +0 -32
  190. package/tests/components/organization-switcher.test.ts +0 -25
  191. package/tests/components/pagination.test.tsx +0 -43
  192. package/tests/components/portal-overview.test.tsx +0 -25
  193. package/tests/components/profile-form.test.tsx +0 -139
  194. package/tests/components/role-selector.test.ts +0 -31
  195. package/tests/components/status-chart.test.tsx +0 -90
  196. package/tests/e2e/auth.e2e.ts +0 -323
  197. package/tests/e2e/feedback-actions.e2e.ts +0 -471
  198. package/tests/e2e/feedback-attachment.e2e.ts +0 -168
  199. package/tests/e2e/feedback-customer.e2e.ts +0 -226
  200. package/tests/e2e/feedback-management.e2e.ts +0 -565
  201. package/tests/e2e/feedback-submit.e2e.ts +0 -133
  202. package/tests/e2e/feedback-view.e2e.ts +0 -297
  203. package/tests/e2e/fixtures/test-data.ts +0 -235
  204. package/tests/e2e/health-check.e2e.ts +0 -230
  205. package/tests/e2e/helpers/test-utils-helpers.test.ts +0 -43
  206. package/tests/e2e/helpers/test-utils.ts +0 -298
  207. package/tests/e2e/integration-placeholders.e2e.ts +0 -199
  208. package/tests/e2e/organization.e2e.ts +0 -292
  209. package/tests/e2e/permissions.e2e.ts +0 -424
  210. package/tests/e2e/project-widget.e2e.ts +0 -63
  211. package/tests/feedback/filters.test.ts +0 -29
  212. package/tests/hooks/use-permissions.test.ts +0 -52
  213. package/tests/lib/ai/classifier.test.ts +0 -104
  214. package/tests/lib/ai/duplicate-detector.test.ts +0 -234
  215. package/tests/lib/attachments-schema.test.ts +0 -30
  216. package/tests/lib/auth/session.test.ts +0 -49
  217. package/tests/lib/auth-client.test.ts +0 -37
  218. package/tests/lib/auth-config.test.ts +0 -26
  219. package/tests/lib/feedback-prefill.test.ts +0 -52
  220. package/tests/lib/feedback-processor.test.ts +0 -41
  221. package/tests/lib/feedback-schema.test.ts +0 -33
  222. package/tests/lib/file-validator.test.ts +0 -48
  223. package/tests/lib/get-feedback-by-id.test.ts +0 -37
  224. package/tests/lib/invitations.test.ts +0 -35
  225. package/tests/lib/login-schema.test.ts +0 -36
  226. package/tests/lib/org-context.test.ts +0 -95
  227. package/tests/lib/organization-access.test.ts +0 -44
  228. package/tests/lib/organization-member-role-schema.test.ts +0 -41
  229. package/tests/lib/permissions.test.ts +0 -88
  230. package/tests/lib/portal-analytics.test.ts +0 -25
  231. package/tests/lib/portal-contributors.test.ts +0 -25
  232. package/tests/lib/portal-copy.test.ts +0 -27
  233. package/tests/lib/portal-i18n.test.ts +0 -30
  234. package/tests/lib/portal-leaderboard-settings.test.ts +0 -25
  235. package/tests/lib/portal-modules.test.ts +0 -25
  236. package/tests/lib/portal-seo.test.ts +0 -25
  237. package/tests/lib/portal-sharing.test.ts +0 -25
  238. package/tests/lib/portal-sorting.test.ts +0 -25
  239. package/tests/lib/portal-theme.test.ts +0 -25
  240. package/tests/lib/rate-limit.test.ts +0 -142
  241. package/tests/lib/resolve-locale.test.ts +0 -34
  242. package/tests/lib/services/backup.test.ts +0 -145
  243. package/tests/lib/user-organizations.test.ts +0 -42
  244. package/tests/lib/user-role-schema.test.ts +0 -33
  245. package/tests/lib/user-schema.test.ts +0 -25
  246. package/tests/setup.ts +0 -74
  247. 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.5.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