@nexttylabs/echo 0.4.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +13 -0
- package/app/(public)/[organizationSlug]/roadmap/page.tsx +19 -1
- package/app/api/admin/backup/route.ts +22 -4
- package/app/api/auth/register/handler.ts +1 -2
- package/lib/auth/config.ts +0 -7
- package/lib/db/migrations/0000_needy_leech.sql +335 -0
- package/lib/db/migrations/meta/0000_snapshot.json +2186 -1
- package/lib/db/migrations/meta/_journal.json +2 -135
- package/lib/db/schema/auth.ts +0 -1
- package/lib/db/schema/index.ts +0 -1
- package/lib/portal/public-context.tsx +5 -0
- package/package.json +20 -1
- package/.changeset/README.md +0 -21
- package/.changeset/config.json +0 -11
- package/.changeset/cozy-ghosts-care.md +0 -5
- package/.changeset/sharp-lines-stand.md +0 -5
- package/.changeset/sour-doodles-eat.md +0 -5
- package/.changeset/tender-moose-shop.md +0 -5
- package/.github/pull_request_template.md +0 -13
- package/.github/workflows/ci.yml +0 -41
- package/.github/workflows/publish.yml +0 -44
- package/.github/workflows/release.yml +0 -73
- package/AGENTS.md +0 -92
- package/Dockerfile +0 -57
- package/Makefile +0 -77
- package/bun.lock +0 -2503
- package/components/portal/project-switcher.tsx +0 -20
- package/docker-compose.dev.yml +0 -26
- package/docker-compose.yml +0 -98
- package/docs/architecture.md +0 -259
- package/docs/component-inventory.md +0 -261
- package/docs/database-migrations.md +0 -76
- package/docs/development-guide.md +0 -209
- package/docs/e2e-user-flows.csv +0 -31
- package/docs/er-diagram-feedback.mmd +0 -138
- package/docs/er-diagram.mmd +0 -281
- package/docs/i18n-check-report.md +0 -296
- package/docs/index.md +0 -214
- package/docs/logic-chain.md +0 -94
- package/docs/plans/2026-01-02-database-migration-scripts.md +0 -496
- package/docs/plans/2026-01-02-user-login-design.md +0 -37
- package/docs/plans/2026-01-02-user-login.md +0 -437
- package/docs/plans/2026-01-02-user-registration-design.md +0 -47
- package/docs/plans/2026-01-02-user-registration.md +0 -628
- package/docs/plans/2026-01-03-roles-permissions-design.md +0 -20
- package/docs/plans/2026-01-03-roles-permissions.md +0 -266
- package/docs/plans/2026-01-05-authentication-middleware.md +0 -207
- package/docs/plans/2026-01-05-member-removal.md +0 -186
- package/docs/plans/2026-01-05-organization-creation.md +0 -374
- package/docs/plans/2026-01-05-rbac-middleware.md +0 -112
- package/docs/plans/2026-01-05-role-configuration.md +0 -441
- package/docs/plans/2026-01-06-file-upload-support.md +0 -804
- package/docs/plans/2026-01-06-permission-check-hook.md +0 -155
- package/docs/plans/2026-01-06-resource-ownership-check.md +0 -231
- package/docs/plans/2026-01-07-feedback-tracking-link.md +0 -459
- package/docs/plans/2026-01-09-logout-redirect-design.md +0 -52
- package/docs/plans/2026-01-09-phase2-3-plan.md +0 -654
- package/docs/plans/2026-01-09-portal-execution-plan.md +0 -408
- package/docs/plans/2026-01-09-project-delete-feature-design.md +0 -163
- package/docs/plans/2026-01-09-project-delete-implementation.md +0 -451
- package/docs/plans/2026-01-09-project-edit-delete-design.md +0 -52
- package/docs/plans/2026-01-09-settings-center-design.md +0 -114
- package/docs/plans/2026-01-09-settings-center.md +0 -948
- package/docs/plans/2026-01-10-organization-only-design.md +0 -66
- package/docs/plans/2026-01-10-organization-only-implementation.md +0 -433
- package/docs/plans/2026-01-10-portal-settings-restructure-plan.md +0 -18
- package/docs/plans/2026-01-10-project-settings-tabs-design-implementation.md +0 -296
- package/docs/plans/2026-01-14-e2e-playwright-feedback.md +0 -173
- package/docs/plans/2026-01-15-feedback-management-org-context-design.md +0 -82
- package/docs/plans/2026-01-15-feedback-management-org-context-implementation-plan.md +0 -521
- package/docs/plans/2026-01-16-admin-feedback-filters-design.md +0 -75
- package/docs/plans/2026-01-16-admin-feedback-filters-implementation.md +0 -293
- package/docs/plans/2026-01-16-admin-feedback-route-consolidation.md +0 -180
- package/docs/plans/2026-01-16-e2e-test-fixes.md +0 -158
- package/docs/plans/2026-01-17-admin-feedback-filters.md +0 -214
- package/docs/plans/2026-01-17-admin-feedback-improvements.md +0 -453
- package/docs/plans/2026-01-18-changesets-design.md +0 -40
- package/docs/product_changes.md +0 -37
- package/docs/project-overview.md +0 -159
- package/docs/project-scan-report.json +0 -104
- package/docs/route-role-visibility.md +0 -51
- package/docs/source-tree-analysis.md +0 -150
- package/docs/testing/delete-project-manual-tests.md +0 -18
- package/docs/user-story-tracking.md +0 -191
- package/eslint.config.mjs +0 -19
- package/lib/db/migrations/.gitkeep +0 -0
- package/lib/db/migrations/0000_cynical_gladiator.sql +0 -53
- package/lib/db/migrations/0001_wandering_sunfire.sql +0 -27
- package/lib/db/migrations/0002_shallow_speedball.sql +0 -1
- package/lib/db/migrations/0003_add_org_description.sql +0 -1
- package/lib/db/migrations/0003_boring_wild_pack.sql +0 -13
- package/lib/db/migrations/0004_windy_tyrannus.sql +0 -27
- package/lib/db/migrations/0005_perpetual_doorman.sql +0 -5
- package/lib/db/migrations/0006_aberrant_captain_midlands.sql +0 -13
- package/lib/db/migrations/0007_clever_captain_cross.sql +0 -14
- package/lib/db/migrations/0008_sparkling_pandemic.sql +0 -2
- package/lib/db/migrations/0009_happy_black_tom.sql +0 -29
- package/lib/db/migrations/0010_kind_junta.sql +0 -8
- package/lib/db/migrations/0011_mute_squadron_supreme.sql +0 -25
- package/lib/db/migrations/0012_giant_power_man.sql +0 -24
- package/lib/db/migrations/0013_damp_titanium_man.sql +0 -17
- package/lib/db/migrations/0014_blue_alice.sql +0 -18
- package/lib/db/migrations/0015_webhook_tables.sql +0 -41
- package/lib/db/migrations/0016_github_integration.sql +0 -30
- package/lib/db/migrations/0016_overjoyed_ghost_rider.sql +0 -22
- package/lib/db/migrations/0017_slimy_inhumans.sql +0 -6
- package/lib/db/migrations/0018_same_spitfire.sql +0 -1
- package/lib/db/migrations/0019_jittery_loners.sql +0 -16
- package/lib/db/migrations/0019_remove_projects_add_org_settings.sql +0 -14
- package/lib/db/migrations/meta/0001_snapshot.json +0 -553
- package/lib/db/migrations/meta/0002_snapshot.json +0 -560
- package/lib/db/migrations/meta/0003_snapshot.json +0 -650
- package/lib/db/migrations/meta/0004_snapshot.json +0 -852
- package/lib/db/migrations/meta/0005_snapshot.json +0 -900
- package/lib/db/migrations/meta/0006_snapshot.json +0 -1011
- package/lib/db/migrations/meta/0007_snapshot.json +0 -1125
- package/lib/db/migrations/meta/0008_snapshot.json +0 -1146
- package/lib/db/migrations/meta/0009_snapshot.json +0 -1386
- package/lib/db/migrations/meta/0010_snapshot.json +0 -1419
- package/lib/db/migrations/meta/0011_snapshot.json +0 -1615
- package/lib/db/migrations/meta/0012_snapshot.json +0 -1805
- package/lib/db/migrations/meta/0013_snapshot.json +0 -1948
- package/lib/db/migrations/meta/0014_snapshot.json +0 -2082
- package/lib/db/migrations/meta/0015_snapshot.json +0 -2476
- package/lib/db/migrations/meta/0016_snapshot.json +0 -2633
- package/lib/db/migrations/meta/0017_snapshot.json +0 -2680
- package/lib/db/migrations/meta/0018_snapshot.json +0 -2686
- package/lib/db/migrations/meta/0019_snapshot.json +0 -2741
- package/lib/db/schema/projects.ts +0 -145
- package/lib/db/schema/user-profiles.ts +0 -31
- package/lib/validations/projects.ts +0 -49
- package/next-env.d.ts +0 -6
- package/playwright.config.ts +0 -44
- package/proxy.test.ts +0 -131
- package/proxy.ts +0 -116
- package/scripts/backup-db.sh +0 -57
- package/scripts/backup-db.ts +0 -24
- package/scripts/generate-openapi.ts +0 -22
- package/scripts/migration-helper.ts +0 -39
- package/scripts/pre-deploy.ts +0 -75
- package/scripts/restore-db.sh +0 -60
- package/scripts/rollback.ts +0 -72
- package/scripts/seed-tags.ts +0 -48
- package/tests/api/feedback-bulk.test.ts +0 -47
- package/tests/api/feedback-by-id.test.ts +0 -67
- package/tests/api/feedback-comments-route-import.test.ts +0 -26
- package/tests/api/feedback-create.test.ts +0 -71
- package/tests/api/feedback-delete.test.ts +0 -160
- package/tests/api/feedback-filter.test.ts +0 -250
- package/tests/api/feedback-list.test.ts +0 -234
- package/tests/api/feedback-route-assignee-condition.test.ts +0 -32
- package/tests/api/feedback-similar.test.ts +0 -46
- package/tests/api/feedback-sort.test.ts +0 -261
- package/tests/api/feedback-status-enum.test.ts +0 -49
- package/tests/api/feedback-status-filter.test.ts +0 -117
- package/tests/api/feedback-submit-on-behalf.test.ts +0 -269
- package/tests/api/feedback.test.ts +0 -175
- package/tests/api/identify-jwt.test.ts +0 -25
- package/tests/api/invitation-accept.test.ts +0 -213
- package/tests/api/organization-invitations.test.ts +0 -186
- package/tests/api/organization-members-list.test.ts +0 -79
- package/tests/api/organization-members.test.ts +0 -340
- package/tests/api/organizations.test.ts +0 -149
- package/tests/api/register.test.ts +0 -112
- package/tests/api/upload.test.ts +0 -103
- package/tests/api/vote.test.ts +0 -82
- package/tests/app/admin-feedback-detail-page.test.tsx +0 -25
- package/tests/app/admin-feedback-list-page.test.tsx +0 -25
- package/tests/app/admin-feedback-new-page.test.tsx +0 -25
- package/tests/app/health-route-helpers.test.ts +0 -27
- package/tests/app/login-page.test.ts +0 -26
- package/tests/app/portal-page.test.ts +0 -29
- package/tests/app/project-portal-overview.test.tsx +0 -25
- package/tests/app/widget-page-import.test.ts +0 -25
- package/tests/components/create-post-dialog-defaults.test.ts +0 -43
- package/tests/components/feedback/duplicate-suggestions-inline.test.tsx +0 -27
- package/tests/components/feedback/embedded-feedback-form.test.tsx +0 -96
- package/tests/components/feedback/feedback-detail.test.tsx +0 -25
- package/tests/components/feedback/feedback-stats.test.tsx +0 -49
- package/tests/components/feedback-bulk-actions.test.tsx +0 -39
- package/tests/components/feedback-i18n-keys.test.ts +0 -70
- package/tests/components/feedback-list-controls-compile.test.ts +0 -25
- package/tests/components/feedback-list-controls.test.tsx +0 -204
- package/tests/components/feedback-list-item.test.tsx +0 -67
- package/tests/components/landing/hero.test.tsx +0 -46
- package/tests/components/layout/language-switcher.test.tsx +0 -25
- package/tests/components/layout/sidebar.test.tsx +0 -157
- package/tests/components/login-form.test.ts +0 -25
- package/tests/components/organization-form.test.ts +0 -32
- package/tests/components/organization-switcher.test.ts +0 -25
- package/tests/components/pagination.test.tsx +0 -43
- package/tests/components/portal-overview.test.tsx +0 -25
- package/tests/components/profile-form.test.tsx +0 -139
- package/tests/components/role-selector.test.ts +0 -31
- package/tests/components/status-chart.test.tsx +0 -90
- package/tests/e2e/auth.e2e.ts +0 -323
- package/tests/e2e/feedback-actions.e2e.ts +0 -471
- package/tests/e2e/feedback-attachment.e2e.ts +0 -168
- package/tests/e2e/feedback-customer.e2e.ts +0 -226
- package/tests/e2e/feedback-management.e2e.ts +0 -565
- package/tests/e2e/feedback-submit.e2e.ts +0 -133
- package/tests/e2e/feedback-view.e2e.ts +0 -297
- package/tests/e2e/fixtures/test-data.ts +0 -235
- package/tests/e2e/health-check.e2e.ts +0 -230
- package/tests/e2e/helpers/test-utils-helpers.test.ts +0 -43
- package/tests/e2e/helpers/test-utils.ts +0 -298
- package/tests/e2e/integration-placeholders.e2e.ts +0 -199
- package/tests/e2e/organization.e2e.ts +0 -292
- package/tests/e2e/permissions.e2e.ts +0 -424
- package/tests/e2e/project-widget.e2e.ts +0 -63
- package/tests/feedback/filters.test.ts +0 -29
- package/tests/hooks/use-permissions.test.ts +0 -52
- package/tests/lib/ai/classifier.test.ts +0 -104
- package/tests/lib/ai/duplicate-detector.test.ts +0 -234
- package/tests/lib/attachments-schema.test.ts +0 -30
- package/tests/lib/auth/session.test.ts +0 -49
- package/tests/lib/auth-client.test.ts +0 -37
- package/tests/lib/auth-config.test.ts +0 -26
- package/tests/lib/feedback-prefill.test.ts +0 -52
- package/tests/lib/feedback-processor.test.ts +0 -41
- package/tests/lib/feedback-schema.test.ts +0 -33
- package/tests/lib/file-validator.test.ts +0 -48
- package/tests/lib/get-feedback-by-id.test.ts +0 -37
- package/tests/lib/invitations.test.ts +0 -35
- package/tests/lib/login-schema.test.ts +0 -36
- package/tests/lib/org-context.test.ts +0 -95
- package/tests/lib/organization-access.test.ts +0 -44
- package/tests/lib/organization-member-role-schema.test.ts +0 -41
- package/tests/lib/permissions.test.ts +0 -88
- package/tests/lib/portal-analytics.test.ts +0 -25
- package/tests/lib/portal-contributors.test.ts +0 -25
- package/tests/lib/portal-copy.test.ts +0 -27
- package/tests/lib/portal-i18n.test.ts +0 -30
- package/tests/lib/portal-leaderboard-settings.test.ts +0 -25
- package/tests/lib/portal-modules.test.ts +0 -25
- package/tests/lib/portal-seo.test.ts +0 -25
- package/tests/lib/portal-sharing.test.ts +0 -25
- package/tests/lib/portal-sorting.test.ts +0 -25
- package/tests/lib/portal-theme.test.ts +0 -25
- package/tests/lib/rate-limit.test.ts +0 -142
- package/tests/lib/resolve-locale.test.ts +0 -34
- package/tests/lib/services/backup.test.ts +0 -145
- package/tests/lib/user-organizations.test.ts +0 -42
- package/tests/lib/user-role-schema.test.ts +0 -33
- package/tests/lib/user-schema.test.ts +0 -25
- package/tests/setup.ts +0 -74
- package/vercel.json +0 -4
|
@@ -5,141 +5,8 @@
|
|
|
5
5
|
{
|
|
6
6
|
"idx": 0,
|
|
7
7
|
"version": "7",
|
|
8
|
-
"when":
|
|
9
|
-
"tag": "
|
|
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
|
]
|
package/lib/db/schema/auth.ts
CHANGED
|
@@ -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(),
|
package/lib/db/schema/index.ts
CHANGED
|
@@ -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
|
+
"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",
|
package/.changeset/README.md
DELETED
|
@@ -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.
|
package/.changeset/config.json
DELETED
|
@@ -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
|
-
}
|
package/.github/workflows/ci.yml
DELETED
|
@@ -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
|