MCP/Rules Improvements + MCP Prompts (#357)

- Use ESM for building the MCP Server
- Added own Postgres dependency to MCP Server for querying tables and other entities in MCP
- Vastly improved AI Agent rules
- Added MCP Prompts for reviewing code and planning features
- Minor refactoring
This commit is contained in:
Giancarlo Buomprisco
2025-09-19 22:57:35 +08:00
committed by GitHub
parent f85035bd01
commit 9712e2354b
27 changed files with 2101 additions and 639 deletions

View File

@@ -9,7 +9,7 @@ import { EllipsisVertical } from 'lucide-react';
import { useForm } from 'react-hook-form';
import { z } from 'zod';
import { Database } from '@kit/supabase/database';
import { Tables } from '@kit/supabase/database';
import { Button } from '@kit/ui/button';
import {
DropdownMenu,
@@ -38,7 +38,7 @@ import { AdminDeleteUserDialog } from './admin-delete-user-dialog';
import { AdminImpersonateUserDialog } from './admin-impersonate-user-dialog';
import { AdminResetPasswordDialog } from './admin-reset-password-dialog';
type Account = Database['public']['Tables']['accounts']['Row'];
type Account = Tables<'accounts'>;
const FiltersSchema = z.object({
type: z.enum(['all', 'team', 'personal']),

View File

@@ -5,7 +5,6 @@ import { useCallback, useEffect, useState } from 'react';
import { Bell, CircleAlert, Info, TriangleAlert, XIcon } from 'lucide-react';
import { useTranslation } from 'react-i18next';
import { Database } from '@kit/supabase/database';
import { Button } from '@kit/ui/button';
import { If } from '@kit/ui/if';
import { Popover, PopoverContent, PopoverTrigger } from '@kit/ui/popover';
@@ -13,38 +12,29 @@ import { Separator } from '@kit/ui/separator';
import { cn } from '@kit/ui/utils';
import { useDismissNotification, useFetchNotifications } from '../hooks';
type Notification = Database['public']['Tables']['notifications']['Row'];
type PartialNotification = Pick<
Notification,
'id' | 'body' | 'dismissed' | 'type' | 'created_at' | 'link'
>;
import { Notification } from '../types';
export function NotificationsPopover(params: {
realtime: boolean;
accountIds: string[];
onClick?: (notification: PartialNotification) => void;
onClick?: (notification: Notification) => void;
}) {
const { i18n, t } = useTranslation();
const [open, setOpen] = useState(false);
const [notifications, setNotifications] = useState<PartialNotification[]>([]);
const [notifications, setNotifications] = useState<Notification[]>([]);
const onNotifications = useCallback(
(notifications: PartialNotification[]) => {
setNotifications((existing) => {
const unique = new Set(existing.map((notification) => notification.id));
const onNotifications = useCallback((notifications: Notification[]) => {
setNotifications((existing) => {
const unique = new Set(existing.map((notification) => notification.id));
const notificationsFiltered = notifications.filter(
(notification) => !unique.has(notification.id),
);
const notificationsFiltered = notifications.filter(
(notification) => !unique.has(notification.id),
);
return [...notificationsFiltered, ...existing];
});
},
[],
);
return [...notificationsFiltered, ...existing];
});
}, []);
const dismissNotification = useDismissNotification();

View File

@@ -4,17 +4,9 @@ import { useQuery } from '@tanstack/react-query';
import { useSupabase } from '@kit/supabase/hooks/use-supabase';
import { Notification } from '../types';
import { useNotificationsStream } from './use-notifications-stream';
type Notification = {
id: number;
body: string;
dismissed: boolean;
type: 'info' | 'warning' | 'error';
created_at: string;
link: string | null;
};
export function useFetchNotifications({
onNotifications,
accountIds,

View File

@@ -2,14 +2,7 @@ import { useEffect } from 'react';
import { useSupabase } from '@kit/supabase/hooks/use-supabase';
type Notification = {
id: number;
body: string;
dismissed: boolean;
type: 'info' | 'warning' | 'error';
created_at: string;
link: string | null;
};
import { Notification } from '../types';
export function useNotificationsStream({
onNotifications,

View File

@@ -0,0 +1,6 @@
import { Tables } from '@kit/supabase/database';
export type Notification = Pick<
Tables<'notifications'>,
'id' | 'body' | 'dismissed' | 'type' | 'created_at' | 'link'
>;

View File

@@ -3,9 +3,9 @@ import { SupabaseClient } from '@supabase/supabase-js';
import { z } from 'zod';
import { getLogger } from '@kit/shared/logger';
import { Database } from '@kit/supabase/database';
import { Database, Tables } from '@kit/supabase/database';
type Invitation = Database['public']['Tables']['invitations']['Row'];
type Invitation = Tables<'invitations'>;
const invitePath = '/join';

View File

@@ -1,9 +1,9 @@
import { z } from 'zod';
import { getLogger } from '@kit/shared/logger';
import { Database } from '@kit/supabase/database';
import { Tables } from '@kit/supabase/database';
type Account = Database['public']['Tables']['accounts']['Row'];
type Account = Tables<'accounts'>;
export function createAccountWebhooksService() {
return new AccountWebhooksService();