Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 10 additions & 3 deletions .cursor/mcp.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,18 @@
},
"convex": {
"command": "npx",
"args": ["-y", "convex@latest", "mcp", "start"]
"args": [
"-y",
"convex@latest",
"mcp",
"start"
]
},
"browsermcp": {
"command": "npx",
"args": ["@browsermcp/mcp@latest"]
"args": [
"@browsermcp/mcp@latest"
]
}
}
}
}
2 changes: 1 addition & 1 deletion .cursor/rules/nx-rules.mdc
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ alwaysApply: true

// This file is automatically generated by Nx Console

You are in an nx workspace using Nx 21.2.1 and pnpm as the package manager.
You are in an nx workspace using Nx 21.2.3 and pnpm as the package manager.

You have access to the Nx MCP server and the tools it provides. Use them. Follow these guidelines in order to best help the user:

Expand Down
2 changes: 1 addition & 1 deletion apps/coming-soon/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
"private": true,
"type": "module",
"dependencies": {
"next": "15.3.4",
"next": "15.3.5",
"react": "19.1.0",
"react-dom": "19.1.0"
},
Expand Down
6 changes: 3 additions & 3 deletions apps/hackathon-e2e/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,11 @@
"dependencies": {
"@t3-oss/env-core": "0.13.8",
"@t3-oss/env-nextjs": "0.13.8",
"dotenv": "^17.0.1",
"zod": "3.25.67"
"dotenv": "^17.2.0",
"zod": "4.0.5"
},
"devDependencies": {
"@clerk/testing": "^1.9.2"
"@clerk/testing": "^1.9.3"
},
"nx": {
"implicitDependencies": [
Expand Down
4 changes: 2 additions & 2 deletions apps/hackathon-e2e/src/env.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,10 @@ import "dotenv/config";

export const env = createEnv({
server: {
BASE_URL: z.string().url(),
BASE_URL: z.url(),
CLERK_PUBLISHABLE_KEY: z.string().min(1),
CLERK_SECRET_KEY: z.string().min(1),
PLAYWRIGHT_USER_EMAIL: z.string().email(),
PLAYWRIGHT_USER_EMAIL: z.email(),
PLAYWRIGHT_USER_PASSWORD: z.string().min(1),
},
client: {},
Expand Down
4 changes: 2 additions & 2 deletions apps/hackathon/convex/model/error.ts
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ export const safeParseConvexObject = <T extends z.ZodRawShape>(
}
return err({
type: "DATA_IS_UNEXPECTED_SHAPE",
message: JSON.stringify(result.error.format()),
message: JSON.stringify(z.prettifyError(result.error)),
});
};

Expand All @@ -73,7 +73,7 @@ export const safeParseConvexArray = <T extends z.ZodRawShape>(
}
return err({
type: "DATA_IS_UNEXPECTED_SHAPE",
message: JSON.stringify(result.error.format()),
message: JSON.stringify(z.prettifyError(result.error)),
});
};

Expand Down
22 changes: 11 additions & 11 deletions apps/hackathon/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -13,30 +13,30 @@
}
},
"dependencies": {
"@clerk/nextjs": "6.23.1",
"@clerk/nextjs": "6.24.0",
"@j5/component-library": "workspace:*",
"@sentry/nextjs": "9.33.0",
"@sentry/nextjs": "9.38.0",
"@t3-oss/env-nextjs": "0.13.8",
"@tanstack/react-form": "1.12.4",
"@tanstack/react-form": "1.14.1",
"@tanstack/zod-form-adapter": "0.42.1",
"convex": "1.25.0",
"convex-helpers": "0.1.95",
"convex": "1.25.2",
"convex-helpers": "0.1.99",
"fast-deep-equal": "3.1.3",
"neverthrow": "8.2.0",
"next": "15.3.4",
"posthog-js": "1.255.1",
"posthog-node": "5.1.1",
"next": "15.3.5",
"posthog-js": "1.257.0",
"posthog-node": "5.5.0",
"react": "19.1.0",
"react-dom": "19.1.0",
"uuid": "11.1.0",
"zod": "3.25.67"
"zod": "4.0.5"
},
"devDependencies": {
"@storybook/nextjs-vite": "9.0.14",
"@storybook/nextjs-vite": "9.0.16",
"@tailwindcss/postcss": "4.1.11",
"@tailwindcss/vite": "4.1.11",
"eslint-plugin-neverthrow": "1.1.4",
"postcss": "8.5.6",
"tailwindcss": "4.1.11"
"tailwindcss": "4.1.12"
}
}
2 changes: 1 addition & 1 deletion apps/hackathon/src/env.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ export const env = createEnv({
NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY: z.string().min(1),
NEXT_PUBLIC_CLERK_SIGN_UP_FORCE_REDIRECT_URL: z.string().min(1),
NEXT_PUBLIC_POSTHOG_KEY: z.string().min(1),
NEXT_PUBLIC_POSTHOG_HOST: z.string().url(),
NEXT_PUBLIC_POSTHOG_HOST: z.url(),
NEXT_PUBLIC_POSTHOG_ENABLED: z
.string()
// only allow "true" or "false"
Expand Down
2 changes: 1 addition & 1 deletion apps/hackathon/src/server/zod/project.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ export const ProjectSchema = z.object({
comments: z.array(CommentSchema),
description: z.string().min(1),
// TODO: add imageUrls
// imageUrls: z.array(z.string().url()).optional(),
// imageUrls: z.array(z.url()).optional(),
hackathonEventId: HackathonEventIdSchema,
title: z.string().min(1),
updatedAt: z.number(),
Expand Down
2 changes: 1 addition & 1 deletion apps/hackathon/src/server/zod/user.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ export const UserSchema = z.object({
...baseConvexFields("users"),
firstName: z.string().min(1),
lastName: z.string().min(1),
avatarUrl: z.string().url(),
avatarUrl: z.url(),
clerkUserId: z.string(),
role: UserRoleSchema.default("USER"),
});
Expand Down
28 changes: 14 additions & 14 deletions apps/hire/docs/db_schema.md
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ export const CompanySchema = z.object({
* Links Profiles to Companies and defines their role within that company.
*/
export const CompanyMemberSchema = z.object({
companyId: z.string().uuid(), // Foreign key to CompanySchema.id
companyId: z.uuid(), // Foreign key to CompanySchema.id
profileId: nonEmptyString, // Foreign key to ProfileSchema.id (Clerk User ID)
role: CompanyRoleEnum,
createdAt: z.date().default(() => new Date()),
Expand All @@ -50,7 +50,7 @@ export const CompanyMemberSchema = z.object({
* Manages the list of candidate sources for a specific company.
*/
export const SourceSchema = z.object({
companyId: z.string().uuid(), // Foreign key to CompanySchema.id
companyId: z.uuid(), // Foreign key to CompanySchema.id
name: nonEmptyString, // e.g., "LinkedIn", "Referral"
order: z.number().int().positive().default(1),
});
Expand All @@ -60,7 +60,7 @@ export const SourceSchema = z.object({
* Manages the list of user-defined seniority levels for a specific company.
*/
export const SenioritySchema = z.object({
companyId: z.string().uuid(), // Foreign key to CompanySchema.id
companyId: z.uuid(), // Foreign key to CompanySchema.id
name: nonEmptyString, // e.g., "Intern", "Senior Engineer"
order: z.number().int().positive().default(1),
createdAt: z.date().default(() => new Date()),
Expand All @@ -75,7 +75,7 @@ export const SenioritySchema = z.object({
* Manages the list of user-defined hiring stages for a specific company.
*/
export const KanbanStageSchema = z.object({
companyId: z.string().uuid(), // Foreign key to CompanySchema.id
companyId: z.uuid(), // Foreign key to CompanySchema.id
name: nonEmptyString, // e.g., "Applied", "Technical Interview"
order: z.number().int().positive().default(1),
createdAt: z.date().default(() => new Date()),
Expand All @@ -90,7 +90,7 @@ export const KanbanStageSchema = z.object({
* Manages the list of user-defined job roles for a specific company.
*/
export const RoleSchema = z.object({
companyId: z.string().uuid(), // Foreign key to CompanySchema.id
companyId: z.uuid(), // Foreign key to CompanySchema.id
name: nonEmptyString, // e.g., "Software Engineer", "Product Manager"
order: z.number().int().positive().default(1),
createdAt: z.date().default(() => new Date()),
Expand All @@ -105,7 +105,7 @@ export const RoleSchema = z.object({
* Central table for all candidate information, scoped to a company.
*/
export const CandidateSchema = z.object({
companyId: z.string().uuid(), // Foreign key to CompanySchema.id
companyId: z.uuid(), // Foreign key to CompanySchema.id
name: nonEmptyString,
email: z
.string()
Expand All @@ -118,14 +118,14 @@ export const CandidateSchema = z.object({
.url({ message: "Invalid URL" })
.optional()
.nullable(),
resumeUrl: z.string().url({ message: "Invalid URL" }).optional().nullable(), // URL from UploadThing (@https://uploadthing.com/)
resumeUrl: z.url({ message: "Invalid URL" }).optional().nullable(), // URL from UploadThing (@https://uploadthing.com/)
targetTeam: z.string().optional().nullable(),
roleId: z.string().uuid(), // Foreign key to RoleSchema.id
seniorityId: z.string().uuid(), // Foreign key to SenioritySchema.id
kanbanStageId: z.string().uuid(), // Foreign key to KanbanStageSchema.id
roleId: z.uuid(), // Foreign key to RoleSchema.id
seniorityId: z.uuid(), // Foreign key to SenioritySchema.id
kanbanStageId: z.uuid(), // Foreign key to KanbanStageSchema.id
salaryExpectations: z.string().optional().nullable(),
nextSteps: z.string().optional().nullable(),
sourceId: z.string().uuid().optional().nullable(), // Foreign key to SourceSchema.id
sourceId: z.uuid().optional().nullable(), // Foreign key to SourceSchema.id
addedByProfileId: nonEmptyString, // Clerk User ID of the user who added the candidate
updatedAt: z
.date()
Expand All @@ -138,7 +138,7 @@ export const CandidateSchema = z.object({
* Stores structured templates for interview notes, scoped to a company.
*/
export const InterviewNoteTemplateSchema = z.object({
companyId: z.string().uuid(), // Foreign key to CompanySchema.id
companyId: z.uuid(), // Foreign key to CompanySchema.id
name: nonEmptyString, // e.g., "Technical Interview Template"
templateFields: z.record(z.string(), z.any()).default({}),
createdAt: z.date().default(() => new Date()),
Expand All @@ -154,11 +154,11 @@ export const InterviewNoteTemplateSchema = z.object({
* Implicitly scoped to a company via candidate_id.
*/
export const InterviewSchema = z.object({
candidateId: z.string().uuid(), // Foreign key to CandidateSchema.id
candidateId: z.uuid(), // Foreign key to CandidateSchema.id
interviewType: z.string().optional().nullable(),
interviewDate: z.date().optional().nullable(),
interviewers: z.array(nonEmptyString).default([]),
assignedTemplateId: z.string().uuid().optional().nullable(),
assignedTemplateId: z.uuid().optional().nullable(),
notesContent: z.record(z.string(), z.any()).optional().nullable(),
recordedByProfileId: nonEmptyString, // Clerk User ID of user who recorded the interview
createdAt: z.date().default(() => new Date()),
Expand Down
12 changes: 6 additions & 6 deletions apps/hire/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,21 +3,21 @@
"private": true,
"type": "module",
"dependencies": {
"@clerk/nextjs": "6.23.1",
"@clerk/nextjs": "6.24.0",
"@dnd-kit/core": "6.3.1",
"@dnd-kit/sortable": "10.0.0",
"@dnd-kit/utilities": "3.2.2",
"@j5/component-library": "workspace:*",
"@t3-oss/env-nextjs": "0.13.8",
"@tanstack/react-form": "1.12.4",
"@tanstack/react-form": "1.14.1",
"@tanstack/zod-form-adapter": "0.42.1",
"convex": "1.25.0",
"convex-helpers": "0.1.95",
"convex": "1.25.2",
"convex-helpers": "0.1.99",
"dayjs": "1.11.13",
"next": "15.3.4",
"next": "15.3.5",
"react": "19.1.0",
"react-dom": "19.1.0",
"zod": "3.25.67"
"zod": "4.0.5"
},
"devDependencies": {
"@tailwindcss/postcss": "4.1.11",
Expand Down
6 changes: 3 additions & 3 deletions apps/hire/src/server/zod/candidate.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,15 +11,15 @@ export const CandidateSchema = z.object({
...baseConvexFields("candidates"),
companyId: CompanyIdSchema,
completedOnboardingSteps: z.array(zid("onboardingSteps")).default([]),
email: z.string().email({ message: "Invalid email address" }).optional(),
email: z.email().optional(),
kanbanStageId: zid("kanbanStages"),
linkedinProfile: z.string().url({ message: "Invalid URL" }).optional(),
linkedinProfile: z.url().optional(),
name: nonEmptyString,
location: z.string().optional(),
startDate: z.number().optional(),
nextSteps: z.string().optional(),
phone: z.string().optional(),
resumeUrl: z.string().url({ message: "Invalid URL" }).optional(),
resumeUrl: z.url().optional(),
roleId: zid("roles").optional(),
salaryExpectations: z.string().optional(),
seniorityId: zid("seniorities").optional(),
Expand Down
17 changes: 0 additions & 17 deletions apps/packing-list/.env.example

This file was deleted.

24 changes: 12 additions & 12 deletions apps/packing-list/docs/data_model.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,34 +10,34 @@ import { z } from "zod";
// Represents a predefined, centrally managed tag used for categorization and rule logic.
// Examples: "Weather: Warm", "Trip Type: Business", "Travel Mode: Carry-on"
const TagSchema = z.object({
id: z.string().uuid(), // Assuming UUIDs for IDs
id: z.uuid(), // Assuming UUIDs for IDs
name: z.string().min(1), // Enforce non-empty name
});
// Note: Database-level uniqueness for 'name' needs separate handling.

// Represents a category for items (e.g., "Clothing", "Toiletries")
const CategorySchema = z.object({
id: z.string().uuid(),
id: z.uuid(),
name: z.string().min(1),
});
// Note: Database-level uniqueness for 'name' needs separate handling.

// Represents a packable item in the master list
const ItemSchema = z.object({
id: z.string().uuid(),
id: z.uuid(),
name: z.string().min(1),
categoryId: z.string().uuid().nullable().optional(), // Optional foreign key
tagIds: z.array(z.string().uuid()), // Array of foreign keys referencing predefined Tag.id values
categoryId: z.uuid().nullable().optional(), // Optional foreign key
tagIds: z.array(z.uuid()), // Array of foreign keys referencing predefined Tag.id values
// indicating rules (weather, trip type, duration, etc.)
});
// Note: Database-level uniqueness for 'name' needs separate handling.

// Represents a piece of luggage in the master list
const LuggageSchema = z.object({
id: z.string().uuid(),
id: z.uuid(),
name: z.string().min(1),
capacityDays: z.number().int().positive(), // Must be a positive integer
travelModeTagIds: z.array(z.string().uuid()).min(1), // Array of foreign keys referencing predefined Tag.id values
travelModeTagIds: z.array(z.uuid()).min(1), // Array of foreign keys referencing predefined Tag.id values
// corresponding to travel modes (e.g., "Travel Mode: Carry-on")
});
// Note: Database-level uniqueness for 'name' needs separate handling.
Expand All @@ -46,7 +46,7 @@ const LuggageSchema = z.object({

// Represents an item within the currently active packing list
const PackingListItemSchema = z.object({
itemId: z.string().uuid(), // Reference to the master Item.id
itemId: z.uuid(), // Reference to the master Item.id
name: z.string().min(1), // Copied item name
quantity: z.number().int().positive(), // Calculated quantity
isPacked: z.boolean().default(false), // Default to not packed
Expand All @@ -59,12 +59,12 @@ const CurrentPackingListSchema = z.object({
destination: z.string().min(1),
startDate: z.date(),
endDate: z.date(),
tripTypeTagId: z.string().uuid(), // Reference to Tag.id
travelModeTagId: z.string().uuid(), // Reference to Tag.id
tripTypeTagId: z.uuid(), // Reference to Tag.id
travelModeTagId: z.uuid(), // Reference to Tag.id
// Assuming dailyWeatherTagIds array length matches trip duration requires custom validation logic outside the basic schema
dailyWeatherTagIds: z.array(z.string().uuid()),
dailyWeatherTagIds: z.array(z.uuid()),
}),
suggestedLuggageIds: z.array(z.string().uuid()), // List of Luggage.id
suggestedLuggageIds: z.array(z.uuid()), // List of Luggage.id
items: z.array(PackingListItemSchema), // The list of items
});

Expand Down
Loading
Loading