@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
@@ -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.3.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