diff --git a/docs/deploystack/development/backend/database.mdx b/docs/deploystack/development/backend/database.mdx index a063206..b2cb130 100644 --- a/docs/deploystack/development/backend/database.mdx +++ b/docs/deploystack/development/backend/database.mdx @@ -96,10 +96,13 @@ This file is automatically managed by the setup API. You typically do not need t ## Database Structure -The database schema is defined in `src/db/schema.ts`. It contains: +The database schema is defined in `src/db/schema.sqlite.ts`. This is the **single source of truth** for all database schema definitions. It contains: 1. Base schema tables (core application) -2. Plugin tables (dynamically loaded) +2. Plugin table definitions (populated dynamically) +3. Proper foreign key relationships and constraints + +**Important**: Only `schema.sqlite.ts` should be edited for schema changes. The previous `schema.ts` file has been removed to eliminate confusion. ## Making Schema Changes @@ -107,7 +110,7 @@ Follow these steps to add or modify database tables: 1. **Modify Schema Definition** - Edit `src/db/schema.ts` to add or modify tables: + Edit `src/db/schema.sqlite.ts` to add or modify tables: ```typescript // Example: Adding a new projects table @@ -115,18 +118,14 @@ Follow these steps to add or modify database tables: id: text('id').primaryKey(), name: text('name').notNull(), description: text('description'), - userId: text('user_id').references(() => users.id), - createdAt: integer('created_at', { mode: 'timestamp' }).notNull().default(sql`(strftime('%s', 'now'))`), - updatedAt: integer('updated_at', { mode: 'timestamp' }).notNull().default(sql`(strftime('%s', 'now'))`), + userId: text('user_id').references(() => authUser.id), + createdAt: integer('created_at', { mode: 'timestamp' }).notNull().$defaultFn(() => new Date()), + updatedAt: integer('updated_at', { mode: 'timestamp' }).notNull().$defaultFn(() => new Date()), }); - - // Don't forget to add it to baseSchema - export const baseSchema = { - users, - projects, // Add your new table here - }; ``` + **Note**: Tables are automatically exported and available - no need to manually add them to a base schema object. + 2. **Generate Migration** Run the migration generation command: @@ -181,7 +180,7 @@ Tables defined by plugins are automatically created when the plugin is loaded an ## Development Workflow -1. Make schema changes in `src/db/schema.ts` +1. Make schema changes in `src/db/schema.sqlite.ts` 2. Generate migrations with `npm run db:generate` 3. Restart the server to apply migrations 4. Update application code to use the modified schema @@ -193,7 +192,7 @@ Tables defined by plugins are automatically created when the plugin is loaded an - Include proper foreign key constraints for relational data - Add explicit types for all columns - Always use migrations for schema changes in development and production -- **Important**: When adding foreign key relationships, update the dialect-specific schema files (e.g., `src/db/schema.sqlite.ts`) rather than the central `schema.ts` file, as Drizzle Kit uses these files for migration generation +- **Important**: All schema changes should be made in `src/db/schema.sqlite.ts` as it is the single source of truth for Drizzle Kit migration generation - Never manually create migration files - always use `npm run db:generate` to ensure proper migration structure ## Inspecting the Database diff --git a/docs/deploystack/development/backend/roles.mdx b/docs/deploystack/development/backend/roles.mdx index 55b9004..f414733 100644 --- a/docs/deploystack/development/backend/roles.mdx +++ b/docs/deploystack/development/backend/roles.mdx @@ -129,6 +129,14 @@ When a user registers: - Automatic conflict resolution for duplicate slugs - Team owner becomes `team_admin` automatically +#### Default Team Protection + +- **Default Team Identification**: Teams created during user registration (name matches username) +- **Name Protection**: Default team names cannot be changed via API or UI +- **Deletion Protection**: Default teams cannot be deleted +- **Description Editing**: Default team descriptions can still be modified +- **UI Indicators**: Frontend shows lock icons and explanatory text for protected fields + #### Team Roles - **Team Admin**: Full control over team settings and management @@ -195,6 +203,30 @@ DELETE /api/teams/:id Authorization: Required (teams.delete permission) ``` +#### Get Team by ID + +```http +GET /api/teams/:id +Authorization: Required (teams.view permission) +``` + +**Response:** + +```json +{ + "success": true, + "data": { + "id": "team123", + "name": "My Team", + "slug": "my-team", + "description": "Team description", + "owner_id": "user123", + "created_at": "2025-01-30T15:00:00.000Z", + "updated_at": "2025-01-30T15:00:00.000Z" + } +} +``` + #### Get Team Members ```http @@ -217,14 +249,82 @@ const team = await TeamService.createTeam({ // Get user's teams const teams = await TeamService.getUserTeams(userId); +// Get team by ID +const team = await TeamService.getTeamById(teamId); + +// Update team +const updatedTeam = await TeamService.updateTeam(teamId, { + name: 'New Name', + description: 'New description' +}); + +// Delete team +const deleted = await TeamService.deleteTeam(teamId); + // Check team limits const canCreate = await TeamService.canUserCreateTeam(userId); // Team membership checks const isAdmin = await TeamService.isTeamAdmin(teamId, userId); const isOwner = await TeamService.isTeamOwner(teamId, userId); +const isMember = await TeamService.isTeamMember(teamId, userId); + +// Default team checks +const isDefault = await TeamService.isDefaultTeam(teamId, userId); + +// Get team membership details +const membership = await TeamService.getTeamMembership(teamId, userId); ``` +### Frontend Team Management + +The system includes a comprehensive team management interface: + +#### Teams List Page (`/teams`) + +- Displays all user's teams in a data table +- Shows team name, description, creation date, and member count +- Includes "Manage" button for team administrators +- Uses shadcn/ui components for consistent styling + +#### Team Management Page (`/teams/manage/:id`) + +- **URL Pattern**: `/teams/manage/{teamId}` +- **Access Control**: Only team administrators can access +- **Design**: Matches admin interface styling (`/admin/users/:id`) +- **Features**: + - Team information display (ID, creation date, update date) + - Editable team name (disabled for default teams with lock icon) + - Editable team description (always available) + - Default team badge and explanations + - Danger zone with team deletion (protected for default teams) + - Confirmation modal for team deletion using shadcn dialog + +#### UI Components + +```typescript +// Team management form validation +const teamSchema = z.object({ + name: z.string().min(1, 'Team name is required'), + description: z.string().optional() +}); + +// Default team protection in UI +const isDefaultTeam = computed(() => { + return team.value?.name === user.value?.username; +}); +``` + +#### Internationalization + +Complete i18n support with translation keys: + +- `teams.manage.title` - Page title +- `teams.manage.defaultTeam.badge` - Default team indicator +- `teams.manage.form.name.disabled` - Lock explanation +- `teams.manage.dangerZone.title` - Deletion section +- `teams.manage.delete.confirmation` - Confirmation dialog + ## Database Schema ### Roles Table diff --git a/docs/deploystack/development/frontend/event-bus.mdx b/docs/deploystack/development/frontend/event-bus.mdx new file mode 100644 index 0000000..c82dea3 --- /dev/null +++ b/docs/deploystack/development/frontend/event-bus.mdx @@ -0,0 +1,596 @@ +--- +title: Global Event Bus +description: Complete guide to using the global event bus system for cross-component communication in the DeployStack frontend. +sidebar: Event Bus +--- + +# Global Event Bus + +The DeployStack frontend implements a global event bus system using the [mitt](https://github.com/developit/mitt) library to enable efficient cross-component communication. This system provides immediate updates across components without requiring direct parent-child relationships or complex state management. + +## Overview + +The event bus solves common frontend challenges such as: +- **Cross-component communication** between unrelated components +- **Immediate UI updates** when data changes in different parts of the application +- **Cache invalidation** and data synchronization +- **Decoupled architecture** for better maintainability + +## Architecture + +### Event Bus Setup + +The event bus is configured globally in `main.ts` using Vue 3's provide/inject pattern: + +```typescript +// main.ts +import mitt from 'mitt' +import type { EventBusEvents } from './composables/useEventBus' + +// Create typed event bus +const emitter = mitt() + +// Provide globally +app.provide('emitter', emitter) +``` + +### Type Safety + +All events are strictly typed using TypeScript interfaces: + +```typescript +// src/composables/useEventBus.ts +export type EventBusEvents = { + 'teams-updated': void + 'team-created': void + 'team-deleted': void + 'user-profile-updated': void + 'mcp-server-deployed': { serverId: string; status: string } + 'notification-show': { message: string; type: 'success' | 'error' | 'warning' } +} +``` + +## Usage + +### Basic Implementation + +#### 1. Using the Composable + +```typescript +// In any component +import { useEventBus } from '@/composables/useEventBus' + +export default { + setup() { + const eventBus = useEventBus() + + // Emit events + eventBus.emit('teams-updated') + + // Listen to events + eventBus.on('teams-updated', () => { + console.log('Teams were updated!') + }) + + return {} + } +} +``` + +#### 2. Component Lifecycle Management + +```vue + +``` + +## Real-World Examples + +### Example 1: Team Management System + +This example shows how the sidebar automatically updates when teams are created from the teams page. + +#### Emitting Events (Team Creation) + +```vue + + +``` + +#### Listening for Events (Sidebar Updates) + +```vue + + +``` + +### Example 2: Notification System + +```vue + + +``` + +#### Triggering Notifications + +```vue + + +``` + +### Example 3: MCP Server Deployment Status + +```vue + + +``` + +```vue + + +``` + +## Best Practices + +### 1. Event Naming Convention + +Use descriptive, action-based names with consistent patterns: + +```typescript +// Good +'teams-updated' +'user-profile-changed' +'mcp-server-deployed' +'notification-show' + +// Avoid +'update' +'change' +'event1' +``` + +### 2. Type Safety + +Always define event types in the `EventBusEvents` interface: + +```typescript +export type EventBusEvents = { + // Simple events (no data) + 'teams-updated': void + 'cache-cleared': void + + // Events with data + 'user-updated': { userId: string; changes: Partial } + 'error-occurred': { message: string; code?: string } + 'progress-update': { percentage: number; task: string } +} +``` + +### 3. Memory Management + +Always clean up event listeners to prevent memory leaks: + +```vue + +``` + +### 4. Error Handling + +Wrap event handlers in try-catch blocks: + +```typescript +const handleDataUpdate = (data: any) => { + try { + // Process the event data + updateLocalState(data) + } catch (error) { + console.error('Error handling data update event:', error) + // Optionally emit an error event + eventBus.emit('error-occurred', { + message: 'Failed to process data update', + code: 'EVENT_HANDLER_ERROR' + }) + } +} +``` + +### 5. Debugging Events + +Add logging for development: + +```typescript +const eventBus = useEventBus() + +// Development logging +if (import.meta.env.DEV) { + eventBus.on('*', (type, data) => { + console.log(`[EventBus] ${type}:`, data) + }) +} +``` + +## Common Patterns + +### 1. Data Synchronization + +```typescript +// Pattern: Emit after successful API operations +const createTeam = async (teamData: CreateTeamInput) => { + try { + const newTeam = await TeamService.createTeam(teamData) + eventBus.emit('teams-updated') + return newTeam + } catch (error) { + eventBus.emit('error-occurred', { message: 'Failed to create team' }) + throw error + } +} +``` + +### 2. Cache Invalidation + +```typescript +// Pattern: Clear cache and refresh data +eventBus.on('teams-updated', () => { + TeamService.clearCache() + fetchTeams(true) // Force refresh +}) +``` + +### 3. UI State Updates + +```typescript +// Pattern: Update UI state across components +eventBus.on('user-profile-updated', (userData) => { + // Update user avatar in header + userAvatar.value = userData.avatar + // Update user name in sidebar + userName.value = userData.name +}) +``` + +## Performance Considerations + +### 1. Event Frequency + +Be mindful of high-frequency events: + +```typescript +// Good: Debounce frequent events +import { debounce } from 'lodash-es' + +const debouncedUpdate = debounce(() => { + eventBus.emit('search-updated') +}, 300) + +// Bad: Emitting on every keystroke +onInput(() => { + eventBus.emit('search-updated') // Too frequent! +}) +``` + +### 2. Event Data Size + +Keep event payloads small: + +```typescript +// Good: Send only necessary data +eventBus.emit('user-updated', { + userId: user.id, + changes: { name: user.name } +}) + +// Avoid: Sending entire objects +eventBus.emit('user-updated', entireUserObject) // Too much data! +``` + +## Testing + +### Unit Testing Events + +```typescript +// tests/components/TeamManager.test.ts +import { describe, it, expect, vi } from 'vitest' +import { mount } from '@vue/test-utils' +import TeamManager from '@/components/TeamManager.vue' + +describe('TeamManager', () => { + it('emits teams-updated event after creating team', async () => { + const mockEventBus = { + emit: vi.fn(), + on: vi.fn(), + off: vi.fn() + } + + const wrapper = mount(TeamManager, { + global: { + provide: { + emitter: mockEventBus + } + } + }) + + await wrapper.vm.createTeam({ name: 'Test Team' }) + + expect(mockEventBus.emit).toHaveBeenCalledWith('teams-updated') + }) +}) +``` + +## Migration Guide + +### From Direct Component Communication + +**Before:** +```vue + + + + +emit('team-created', teamData) +``` + +**After:** +```vue + + + + + +``` + +### Adding New Events + +1. **Define the event type**: +```typescript +// src/composables/useEventBus.ts +export type EventBusEvents = { + // ... existing events + 'new-feature-updated': { featureId: string; status: string } +} +``` + +2. **Emit the event**: +```typescript +eventBus.emit('new-feature-updated', { + featureId: 'feature-123', + status: 'active' +}) +``` + +3. **Listen for the event**: +```typescript +eventBus.on('new-feature-updated', (data) => { + console.log(`Feature ${data.featureId} is now ${data.status}`) +}) +``` + +## Troubleshooting + +### Common Issues + +1. **Events not firing**: Check if the event name matches exactly +2. **Memory leaks**: Ensure `eventBus.off()` is called in `onUnmounted()` +3. **TypeScript errors**: Verify event types are defined in `EventBusEvents` +4. **Handler not called**: Check if the listener was registered before the event was emitted + +### Debugging Tips + +```typescript +// Add global event logging +if (import.meta.env.DEV) { + const eventBus = useEventBus() + + // Log all events + eventBus.on('*', (type, data) => { + console.group(`[EventBus] ${type}`) + console.log('Data:', data) + console.log('Timestamp:', new Date().toISOString()) + console.groupEnd() + }) +} +``` + +The global event bus system provides a powerful and type-safe way to handle cross-component communication in the DeployStack frontend, enabling immediate updates and better user experience. diff --git a/docs/deploystack/development/frontend/index.mdx b/docs/deploystack/development/frontend/index.mdx index fe80308..bc78aa1 100644 --- a/docs/deploystack/development/frontend/index.mdx +++ b/docs/deploystack/development/frontend/index.mdx @@ -340,10 +340,10 @@ onMounted(() => { Continue reading the detailed guides: +- [Global Event Bus](/deploystack/development/frontend/event-bus) - Cross-component communication system - [Internationalization (i18n)](/deploystack/development/frontend/internationalization) - Multi-language support - [Plugin System](/deploystack/development/frontend/plugins) - Extending functionality - [Router Optimization](/deploystack/development/frontend/router-optimization) - Performance improvements -- [Contributing Guidelines](/deploystack/development/frontend/contributing) - How to contribute ## Docker Development diff --git a/docs/deploystack/teams.mdx b/docs/deploystack/teams.mdx new file mode 100644 index 0000000..b4a67b1 --- /dev/null +++ b/docs/deploystack/teams.mdx @@ -0,0 +1,312 @@ +--- +title: Teams Structure in DeployStack +description: Organize your MCP server deployments with teams - your workspace for managing servers, credentials, and environment variables in DeployStack. +sidebar: Teams +--- + +# Teams + +Teams are the organizational foundation of DeployStack, serving as dedicated workspaces where you manage all your MCP server deployments, cloud provider credentials, and environment variables. Think of teams as isolated containers that keep your deployment resources organized and secure. + +## Overview + +In DeployStack, teams provide: + +- **Isolated Workspaces**: Each team maintains its own separate environment for deployments +- **Resource Organization**: All your MCP servers, credentials, and settings are organized within teams +- **Access Control**: Team-based permissions ensure secure access to your deployment resources +- **Multi-Project Support**: Create up to 3 teams to organize different projects or environments + +Every team acts as a complete deployment environment, containing everything needed to deploy and manage MCP servers across various cloud providers. + +## Getting Started with Teams + +### Automatic Team Creation + +When you register for DeployStack, a default team is automatically created for you: + +- **Team Name**: Uses your username +- **Team Slug**: A URL-friendly version of your username (e.g., `john-doe`) +- **Description**: Automatically set as "[username]'s team" +- **Role**: You become the Team Administrator with full control + +This default team is immediately ready for use - you can start deploying MCP servers right away. + +### Team Limits + +Each user can create and manage up to **3 teams total**, including your default team. This means you can create 2 additional teams beyond your automatically created default team. + +## What Teams Contain + +Teams serve as comprehensive containers for all your deployment resources: + +### MCP Server Settings +- All deployed MCP server configurations +- Server deployment history and status +- Custom server settings and parameters +- Deployment logs and monitoring data + +### Cloud Provider Credentials +- **Render.com**: API tokens and service configurations +- **Fly.io**: Authentication tokens and app settings +- **Other Providers**: Credentials for additional supported platforms + +### Global Environment Variables +- **Node.js Environment Variables**: Custom env vars for Node.js-based MCP servers +- **Reusable Variables**: Environment variables that can be applied across multiple servers +- **Secure Storage**: All environment variables are encrypted and securely stored + +These global environment variables allow you to define common settings once and apply them to multiple MCP servers within the same team, streamlining your deployment process. + +## Team Management + +### Managing Your Teams + +DeployStack provides an intuitive interface for managing your teams through the Teams dashboard. + +#### Accessing Team Management + +1. **Navigate to Teams**: Go to the Teams section in your dashboard +2. **View Teams Table**: See all your teams with their details +3. **Manage Teams**: Click the "Manage" button next to any team you want to edit + +The "Manage" button is available for all teams where you have administrative privileges. + +#### Team Management Interface + +When you click "Manage" on a team, you'll access a comprehensive management interface that includes: + +- **Team Information**: View team ID, creation date, and last update +- **Team Settings**: Edit team name and description +- **Default Team Protection**: Special handling for your default team +- **Team Deletion**: Remove teams you no longer need (with safety protections) + +### Creating Additional Teams + +To create a new team: + +1. Navigate to the Teams section in your dashboard +2. Click "Create New Team" +3. Provide a team name and optional description +4. The system automatically generates a unique URL-friendly slug + +**Note**: You can only create teams if you haven't reached the 3-team limit. + +### Editing Team Details + +You can modify your teams through the team management interface: + +#### Team Name Editing + +- **Regular Teams**: You can freely change the name of teams you created +- **Default Teams**: Your automatically created default team name **cannot be changed** +- **Protection Indicator**: Default teams show a lock icon with an explanation +- **Reason**: This prevents confusion since your default team name matches your username + +#### Team Description Editing + +- **All Teams**: You can edit descriptions for any team you administer +- **No Restrictions**: This applies to both default and regular teams +- **Optional Field**: Descriptions can be left empty if desired + +#### Visual Indicators + +The interface provides clear visual feedback: + +- **Default Team Badge**: Shows "Default Team" label for your original team +- **Lock Icons**: Appear next to fields that cannot be edited +- **Explanatory Text**: Describes why certain fields are protected +- **Form Validation**: Prevents invalid changes and provides helpful error messages + +### Team Naming and Slugs + +- **Team Names**: Can contain spaces, special characters, and any readable text +- **Team Slugs**: Automatically generated URL-friendly identifiers +- **Unique Slugs**: If a slug already exists, the system adds a number (e.g., `my-team-2`) +- **Permanent Slugs**: Once created, team slugs cannot be changed + +### Team Ownership + +- **Team Owner**: The user who created the team has full administrative control +- **Owner Privileges**: Can modify all team settings, manage resources, and delete the team +- **Single Owner**: Each team has exactly one owner (currently you) + +## Team Features + +### Current Structure + +DeployStack teams currently operate with a **single-user model**: + +- Each team belongs to one user +- You have full control over your teams +- No team sharing or collaboration features (planned for future releases) + +### Team Roles + +Within your teams, you automatically have the **Team Administrator** role, which provides: + +- Full access to all team resources +- Ability to deploy and manage MCP servers +- Permission to modify team settings +- Authority to delete the team + +*Note: Team User roles exist in the system for future multi-user team functionality.* + +### Resource Isolation + +Each team maintains complete isolation: + +- **Separate Credentials**: Cloud provider credentials are team-specific +- **Independent Servers**: MCP servers in one team don't affect others +- **Isolated Variables**: Environment variables are scoped to individual teams +- **Secure Boundaries**: No cross-team access to resources + +## Working with Teams + +### Step-by-Step Team Management + +#### Editing a Team + +1. **Navigate to Teams**: Go to your Teams dashboard +2. **Find Your Team**: Locate the team you want to edit in the table +3. **Click Manage**: Click the "Manage" button in the Actions column +4. **Edit Details**: + - Modify the team name (if not a default team) + - Update the team description + - Save your changes +5. **Confirmation**: You'll see a success message when changes are saved + +#### Deleting a Team (Non-Default Only) + +1. **Prepare the Team**: Remove all MCP servers and configurations +2. **Access Management**: Click "Manage" on the team you want to delete +3. **Find Danger Zone**: Scroll down to the "Danger Zone" section +4. **Click Delete**: Click the "Delete Team" button +5. **Confirm Action**: In the popup dialog, confirm you want to delete the team +6. **Final Warning**: Read the warning about permanent data loss +7. **Complete Deletion**: Click "Delete" in the confirmation dialog + +#### Understanding Team Status + +- **Default Team Badge**: Your original team shows a "Default Team" badge +- **Lock Icons**: Indicate fields that cannot be edited +- **Member Count**: Shows how many users are in each team (currently always 1) +- **Last Updated**: Displays when the team was last modified + +### Switching Between Teams + +If you have multiple teams, you can switch between them to: + +- Access different sets of MCP servers +- Use different cloud provider credentials +- Apply different environment variable sets +- Organize projects or environments separately + +### Managing Team Settings + +For each team, you can: + +- **Update Team Name**: Modify the display name +- **Edit Description**: Change or add team descriptions +- **Manage Credentials**: Add, update, or remove cloud provider credentials +- **Configure Variables**: Set up global environment variables +- **Monitor Deployments**: View all MCP servers and their status + +### Understanding Team Slugs + +Team slugs serve as unique identifiers: + +- **URL Component**: Used in dashboard URLs and API endpoints +- **Permanent Identifier**: Cannot be changed after team creation +- **Conflict Resolution**: System automatically handles naming conflicts +- **Case Insensitive**: Converted to lowercase with hyphens + +## Team Deletion and Consequences + +⚠️ **Critical Warning**: Team deletion is permanent and irreversible. + +### Default Team Protection + +**Your default team cannot be deleted** - this is a permanent protection: + +- **No Delete Option**: The deletion section won't appear for default teams +- **Safety Measure**: Prevents accidental loss of your primary workspace +- **Alternative**: You can still edit the description and manage all resources + +### Protection Mechanisms + +For non-default teams, multiple safety measures protect against accidental deletion: + +1. **Active Server Check**: Teams with active MCP servers **cannot be deleted** +2. **Confirmation Dialog**: A modal dialog requires explicit confirmation +3. **Clear Warning**: The interface clearly explains the consequences +4. **Two-Step Process**: You must first remove all servers, then confirm deletion + +### Required Steps Before Deletion + +To delete a non-default team, you must: + +1. **Stop All Running MCP Servers**: Ensure no servers are currently deployed or running +2. **Remove All Server Configurations**: Delete all MCP server settings and configurations +3. **Access Danger Zone**: Navigate to the "Danger Zone" section in team management +4. **Confirm Deletion**: Click delete and confirm in the popup dialog + +### What Gets Permanently Deleted + +When you delete a team, you lose **everything** associated with it: + +- **All MCP Server Settings**: Complete server configurations and deployment history +- **All Cloud Provider Credentials**: Stored API keys, tokens, and authentication data +- **All Global Environment Variables**: Custom environment settings and variables +- **Complete Deployment History**: Logs, monitoring data, and historical information + +### No Recovery Options + +**Team deletion is permanent** - there are no backups, recovery options, or ways to restore deleted teams. Once deleted, all data is gone forever. + +## Team Permissions + +Your team permissions determine what actions you can perform: + +### Global vs Team Permissions + +- **Global Permissions**: Control system-wide access (user management, global settings) +- **Team Permissions**: Control what you can do within your teams + +### Team-Related Permissions + +- **`teams.create`**: Create new teams (up to your limit) +- **`teams.view`**: View team details and resources +- **`teams.edit`**: Modify team settings and configurations +- **`teams.delete`**: Delete teams (after removing all servers) +- **`teams.manage`**: Full team management capabilities + +### Deployment Capabilities + +Your team role affects your ability to: + +- Deploy new MCP servers +- Modify server configurations +- Manage cloud provider credentials +- Set up environment variables +- Monitor deployment status +- Access deployment logs + +## Getting the Most from Teams + +### Organization Strategies + +Consider creating separate teams for: + +- **Different Projects**: Organize MCP servers by project or client + +### Resource Management + +Within each team: + +- **Group Related Servers**: Deploy related MCP servers in the same team +- **Shared Credentials**: Use the same cloud provider credentials across servers +- **Common Variables**: Leverage global environment variables for consistency +- **Logical Organization**: Use descriptive names and descriptions + +Teams provide the foundation for organized, secure, and efficient MCP server deployment in DeployStack. By understanding how teams work, you can effectively manage your deployment resources and maintain clean separation between different projects and environments. diff --git a/docs/deploystack/troubleshooting.mdx b/docs/deploystack/troubleshooting.mdx new file mode 100644 index 0000000..1f9eb2a --- /dev/null +++ b/docs/deploystack/troubleshooting.mdx @@ -0,0 +1,9 @@ +--- +title: Troubleshooting DeployStack +description: Common issues and solutions for DeployStack MCP Serverdeployments +sidebar: Troubleshooting +--- + +# Troubleshooting DeployStack + +Under this section, we will cover common issues and solutions for DeployStack MCP Server deployments. If you encounter any problems, please refer to the following troubleshooting steps. \ No newline at end of file diff --git a/docs/docker-deployment/application-logo-configuration.mdx b/docs/docker-deployment/application-logo-configuration.mdx index 92a3349..11bbcd8 100644 --- a/docs/docker-deployment/application-logo-configuration.mdx +++ b/docs/docker-deployment/application-logo-configuration.mdx @@ -9,7 +9,7 @@ Add a custom logo to make your application stand out in the DeployStack catalog. ## Adding Your Logo -Configure your logo in `.deploystack/config.yml` - [DeployStack Configuration File Reference](/deploystack/deploystack-config-file): +Configure your logo in `.deploystack/config.yml` - [DeployStack Configuration File Reference](/docker-deployment/deploystack-config-file): ```yaml application: diff --git a/docs/docker-deployment/deploystack-config-file.mdx b/docs/docker-deployment/deploystack-config-file.mdx index a5dfc95..5623309 100644 --- a/docs/docker-deployment/deploystack-config-file.mdx +++ b/docs/docker-deployment/deploystack-config-file.mdx @@ -56,7 +56,7 @@ The override process follows this order: ### Branch Deployment Settings -Before configuring multiple branch deployments, ensure you have installed the [DeployStack Repository Sync GitHub App](/deploystack/github-application), as it's required for branch monitoring and template updates. +Before configuring multiple branch deployments, ensure you have installed the [DeployStack Repository Sync GitHub App](/docker-deployment/github-application), as it's required for branch monitoring and template updates. You can configure multiple branch deployments using the `deployment.branches` section: @@ -256,4 +256,4 @@ deployment: ### Minimal Configuration example for logo update -Please visit our [Application Logo Configuration](/deploystack/application-logo-configuration) page. +Please visit our [Application Logo Configuration](/docker-deployment/application-logo-configuration) page. diff --git a/docs/docker-deployment/deploystack-configuration-directory.mdx b/docs/docker-deployment/deploystack-configuration-directory.mdx index c178cbe..7cd58b9 100644 --- a/docs/docker-deployment/deploystack-configuration-directory.mdx +++ b/docs/docker-deployment/deploystack-configuration-directory.mdx @@ -5,7 +5,7 @@ description: Technical guide for setting up the .deploystack directory to manage # .deploystack Directory Reference -The `.deploystack` directory in your repository contains configuration files that DeployStack uses to generate and maintain your Infrastructure as Code templates. Creating this repo allows you to enable the [lifecycle of IaC](/deploystack/iac-lifecycle). The deploystack configurations repo only makes sense if you also [install DeployStack GitHub app](/deploystack/github-application). Otherwise, changes to DeployStack backend will not be recognized. +The `.deploystack` directory in your repository contains configuration files that DeployStack uses to generate and maintain your Infrastructure as Code templates. Creating this repo allows you to enable the [lifecycle of IaC](/docker-deployment/iac-lifecycle). The deploystack configurations repo only makes sense if you also [install DeployStack GitHub app](/docker-deployment/github-application). Otherwise, changes to DeployStack backend will not be recognized. `.deploystack` directory is optional. You don't need to create it to submit your repository to deploystack.io. @@ -24,7 +24,7 @@ The `.deploystack` directory in your repository contains configuration files tha ### DeployStack Configuration File -Please read more at [DeployStack Configuration File Reference](/deploystack/deploystack-config-file). +Please read more at [DeployStack Configuration File Reference](/docker-deployment/deploystack-config-file). ### Docker Configuration @@ -52,11 +52,11 @@ docker run -d -p 80:80 nginx:alpine ### Environment Variables -Please read more from our [environment variables](/deploystack/docker-environment-variables) page. +Please read more from our [environment variables](/docker-deployment/docker-environment-variables) page. ## Automatic Updates -When the [DeployStack GitHub App](/deploystack/github-application) is installed: +When the [DeployStack GitHub App](/docker-deployment/github-application) is installed: 1. Changes to specific (`docker-compose.yml` & `docker-run.txt`) file in `.deploystack/` trigger template updates 2. Updates only process when changes occur on the default branch @@ -66,6 +66,6 @@ When the [DeployStack GitHub App](/deploystack/github-application) is installed: - The `.deploystack` directory is **optional** - Without this directory, automatic template updates are **not** available -- You can add the directory and install the [DeployStack GitHub Sync App](/deploystack/github-application) at any time -- [Environment variables](/deploystack/docker-environment-variables) and [DeployStack config](/deploystack/deploystack-config-file) are optional components +- You can add the directory and install the [DeployStack GitHub Sync App](/docker-deployment/github-application) at any time +- [Environment variables](/docker-deployment/docker-environment-variables) and [DeployStack config](/docker-deployment/deploystack-config-file) are optional components - Only one Docker configuration file should be used (either compose or run) diff --git a/docs/docker-deployment/docker-compose-requirements.mdx b/docs/docker-deployment/docker-compose-requirements.mdx index eb91b87..141ce64 100644 --- a/docs/docker-deployment/docker-compose-requirements.mdx +++ b/docs/docker-deployment/docker-compose-requirements.mdx @@ -86,7 +86,7 @@ Currently, DeployStack only supports public images from Docker Hub. If you need ## Environment Variables -Please read more from our [environment variables](/deploystack/docker-environment-variables) page. +Please read more from our [environment variables](/docker-deployment/docker-environment-variables) page. ## Validation @@ -98,5 +98,5 @@ When you submit your repository, we perform these checks: ## Next Steps -- See how [One-Click Deploy](/deploystack/one-click-deploy) works -- Check the [Troubleshooting](/deploystack/troubleshooting) guide if you run into issues +- See how [One-Click Deploy](/docker-deployment/one-click-deploy) works +- Check the [Troubleshooting](/docker-deployment/troubleshooting) guide if you run into issues diff --git a/docs/docker-deployment/getting-started.mdx b/docs/docker-deployment/getting-started.mdx index a9260dc..de76781 100644 --- a/docs/docker-deployment/getting-started.mdx +++ b/docs/docker-deployment/getting-started.mdx @@ -101,7 +101,7 @@ Create a `.deploystack` directory in your repository with these components: - `docker-run.txt`: Alternative to compose file, contains your Docker run command - Only one of these files should be present -For more configuration options please check our [.deploystack Directory Reference](/deploystack/deploystack-configuration-directory). +For more configuration options please check our [.deploystack Directory Reference](/docker-deployment/deploystack-configuration-directory). ### GitHub App Integration @@ -191,6 +191,6 @@ After template generation: ## Need Additional Help? -- Review our detailed [Troubleshooting Guide](/deploystack/troubleshooting) +- Review our detailed [Troubleshooting Guide](/docker-deployment/troubleshooting) - Join our active [Discord Community](https://discord.gg/UjFWwByB) - Submit issues on GitHub to our [Feedback repository](https://github.com/deploystackio/feedback) diff --git a/docs/docker-deployment/github-application.mdx b/docs/docker-deployment/github-application.mdx index 8fe39a4..f5a8a8f 100644 --- a/docs/docker-deployment/github-application.mdx +++ b/docs/docker-deployment/github-application.mdx @@ -11,7 +11,7 @@ The DeployStack GitHub App ensures your Infrastructure as Code (IaC) templates r When you install the [DeployStack Repository Sync](https://github.com/apps/deploystack-repository-sync) app, it monitors specific files in your repository: -- `.deploystack/` directory - [Contains your Docker configurations and assets](/deploystack/deploystack-configuration-directory) +- `.deploystack/` directory - [Contains your Docker configurations and assets](/docker-deployment/deploystack-configuration-directory) - `README.md` - For README.md updates When changes are detected in these files, the app automatically triggers an update of your IaC templates in our [deploy-templates](https://github.com/deploystackio/deploy-templates) repository. @@ -47,12 +47,12 @@ When the app detects changes, it automatically updates: - Repository Homepage - Description - IaC templates - - Depends on which technique (docker compose or docker run command) you choose, you can upload the `docker-compose.yml` or `docker-run.txt` in the `.deploystack` directory. Every time you update the files on your main branch (or additional branch), IaC templates will be updated automatically - [Automatic Updates](/deploystack/deploystack-configuration-directory#automatic-updates). + - Depends on which technique (docker compose or docker run command) you choose, you can upload the `docker-compose.yml` or `docker-run.txt` in the `.deploystack` directory. Every time you update the files on your main branch (or additional branch), IaC templates will be updated automatically - [Automatic Updates](/docker-deployment/deploystack-configuration-directory#automatic-updates). - Environment variables - - To make it easier for a user to deploy IaC templates, it is recommended to work with environment variables. For this purpose, you can upload an `env` file and add your appropriate variables - [Environment Variables](/deploystack/deploystack-configuration-directory#environment-variables). + - To make it easier for a user to deploy IaC templates, it is recommended to work with environment variables. For this purpose, you can upload an `env` file and add your appropriate variables - [Environment Variables](/docker-deployment/deploystack-configuration-directory#environment-variables). - DeployStack Configuration - Project / Applicaton Logo - - It is possible to upload your own logo to DeployStack catalog. To do this you need to upload a file to our directory `.deploystack`. Read more about it here: [Repository Logo](/deploystack/deploystack-configuration-directory#repository-logo) + - It is possible to upload your own logo to DeployStack catalog. To do this you need to upload a file to our directory `.deploystack`. Read more about it here: [Repository Logo](/docker-deployment/deploystack-configuration-directory#repository-logo) ## Managing the Integration @@ -66,4 +66,4 @@ After installing the app: 2. Commit and push your changes 3. DeployStack will automatically update your deployment templates -For details about the `.deploystack` directory structure, check our [.deploystack Directory Reference](/deploystack/deploystack-configuration-directory). +For details about the `.deploystack` directory structure, check our [.deploystack Directory Reference](/docker-deployment/deploystack-configuration-directory). diff --git a/docs/docker-deployment/iac-lifecycle.mdx b/docs/docker-deployment/iac-lifecycle.mdx index 6341728..a7c2568 100644 --- a/docs/docker-deployment/iac-lifecycle.mdx +++ b/docs/docker-deployment/iac-lifecycle.mdx @@ -11,7 +11,7 @@ This guide explains how DeployStack manages and updates your Infrastructure as C ### Initial Setup -1. Create a `.deploystack` [configuration directory](/deploystack/deploystack-configuration-directory) in your repository +1. Create a `.deploystack` [configuration directory](/docker-deployment/deploystack-configuration-directory) in your repository 2. Add your Docker configuration files: - `docker-compose.yml` for Compose configurations - `docker-run.txt` for Docker run commands @@ -20,7 +20,7 @@ This guide explains how DeployStack manages and updates your Infrastructure as C ### Enabling Automatic Updates -Install the [DeployStack Repository Sync](/deploystack/github-application) GitHub App to keep your templates up to date when: +Install the [DeployStack Repository Sync](/docker-deployment/github-application) GitHub App to keep your templates up to date when: - You modify Docker configurations in the `.deploystack` directory - Cloud providers update their IaC specifications @@ -36,7 +36,7 @@ All IaC templates are stored in public and open-source repository: [https://gith ### Prerequisites for activating the flow -1. You have installed the [DeployStack GitHub app](/deploystack/github-application). +1. You have installed the [DeployStack GitHub app](/docker-deployment/github-application). 2. You have created the `.deploystack/docker-run.txt` or `.deploystack/docker-compose.yml` file. The choice between `docker-run.txt` or `docker-compose.yml` depends on the submission process used to DeployStack. When submitting to DeployStack, you can choose two methods -> Docker Run or Docker Compose. diff --git a/docs/docker-deployment/index.mdx b/docs/docker-deployment/index.mdx index 2203faa..499e268 100644 --- a/docs/docker-deployment/index.mdx +++ b/docs/docker-deployment/index.mdx @@ -10,10 +10,10 @@ DeployStack helps you deploy Docker Compose and Docker Run applications across d ## Documentation Sections -- [Getting Started](/deploystack/getting-started) - Quick introduction and first steps -- [Docker Compose Requirements](/deploystack/docker-compose-requirements) - Learn about supported configurations -- [One-Click Deploy](/deploystack/one-click-deploy) - Learn about deployment automation -- [Troubleshooting](/deploystack/troubleshooting) - Resolve common issues +- [Getting Started](/docker-deployment/getting-started) - Quick introduction and first steps +- [Docker Compose Requirements](/docker-deployment/docker-compose-requirements) - Learn about supported configurations +- [One-Click Deploy](/docker-deployment/one-click-deploy) - Learn about deployment automation +- [Troubleshooting](/docker-deployment/troubleshooting) - Resolve common issues ## Additional Resources diff --git a/docs/docker-deployment/multiple-branches.mdx b/docs/docker-deployment/multiple-branches.mdx index e05520f..d5237a8 100644 --- a/docs/docker-deployment/multiple-branches.mdx +++ b/docs/docker-deployment/multiple-branches.mdx @@ -20,7 +20,7 @@ Every repository starts with its default branch (typically `main` or `master`). When you change your default branch in GitHub: -- DeployStack automatically detects the change - you need to install [DeployStack GitHub App](/deploystack/github-application) +- DeployStack automatically detects the change - you need to install [DeployStack GitHub App](/docker-deployment/github-application) - Regenerates templates for the new default branch - Updates all deployment buttons @@ -80,7 +80,7 @@ This structure allows you to: - Modify service configurations independently - Keep each version's deployment parameters isolated -Remember: The DeployStack GitHub App only monitors the standard filenames: check [.deploystack Directory Reference for more info](/deploystack/deploystack-configuration-directory) +Remember: The DeployStack GitHub App only monitors the standard filenames: check [.deploystack Directory Reference for more info](/docker-deployment/deploystack-configuration-directory) ## Real-World Example @@ -142,7 +142,7 @@ This strategy allows your users to: - Maximum of 5 active branches supported - Each branch can have unique Docker configurations - Default branch can be changed (switch to another branch and make it default) but not excluded -- Branch configurations ([DeployStack config file](/deploystack/deploystack-config-file)) must be in the default branch +- Branch configurations ([DeployStack config file](/docker-deployment/deploystack-config-file)) must be in the default branch - All branches are automatically monitored for changes - Template regeneration happens automatically when: - Branch content changes diff --git a/docs/docker-deployment/troubleshooting.mdx b/docs/docker-deployment/troubleshooting.mdx index 88c0c22..3ec950b 100644 --- a/docs/docker-deployment/troubleshooting.mdx +++ b/docs/docker-deployment/troubleshooting.mdx @@ -82,7 +82,7 @@ The submitted docker-compose file doesn't meet the required format or contains u **Solution:** - Validate your docker-compose file syntax -- Check our [Docker Compose Requirements](/deploystack/docker-compose-requirements) page +- Check our [Docker Compose Requirements](/docker-deployment/docker-compose-requirements) page - Ensure you're using supported features only ## Error Converting Docker Compose to IaC @@ -139,7 +139,7 @@ This indicates an unexpected error in our validation process. ## General Troubleshooting Tips 1. Validate your docker-compose file locally before submission -2. Ensure your repository meets all [requirements](/deploystack/docker-compose-requirements) +2. Ensure your repository meets all [requirements](/docker-deployment/docker-compose-requirements) 3. Check that all services use supported configurations 4. Verify your repository is public and accessible @@ -148,5 +148,5 @@ This indicates an unexpected error in our validation process. If you're still experiencing issues: - Join our [Discord community](https://discord.gg/UjFWwByB) -- Check our [Docker Compose Requirements](/deploystack/docker-compose-requirements) +- Check our [Docker Compose Requirements](/docker-deployment/docker-compose-requirements) - Review [supported features](/docker-to-iac/supported-docker-compose-variables) diff --git a/docs/index.mdx b/docs/index.mdx index 479672f..25f75f8 100644 --- a/docs/index.mdx +++ b/docs/index.mdx @@ -85,13 +85,10 @@ Public repository for feature requests, bug reports, and roadmap discussions - Include comprehensive documentation and usage examples - Ensure production-ready deployment configurations -Visit our [MCP Server Development Guide](/deploystack/mcp-development) for detailed instructions. - ## Community and Support - Join our [Discord community](https://discord.gg/42Ce3S7b3b) for real-time discussions - Explore the [MCP Server Catalog](https://deploystack.io/mcp) for deployment-ready servers - Check our [troubleshooting guide](/deploystack/troubleshooting) for common issues -- Follow [@deploystack](https://twitter.com/deploystack) for ecosystem updates Ready to eliminate MCP server deployment complexity? [Get started for free →](https://cloud.deploystack.io) diff --git a/package-lock.json b/package-lock.json index a504141..f5493e6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,9 +10,9 @@ "hasInstallScript": true, "dependencies": { "@types/mdx": "^2.0.13", - "fumadocs-core": "^15.5.3", - "fumadocs-mdx": "^11.6.7", - "fumadocs-ui": "^15.5.3", + "fumadocs-core": "^15.5.4", + "fumadocs-mdx": "^11.6.9", + "fumadocs-ui": "^15.5.4", "lucide-react": "^0.513.0", "mdx": "^0.3.1", "next": "^15.3.3", @@ -23,8 +23,8 @@ "devDependencies": { "@semantic-release/github": "^11.0.3", "@tailwindcss/postcss": "^4.1.10", - "@types/node": "22.15.30", - "@types/react": "^19.1.6", + "@types/node": "24.0.4", + "@types/react": "^19.1.8", "@types/react-dom": "^19.1.6", "autoprefixer": "^10.4.21", "markdownlint-cli": "^0.45.0", @@ -2450,84 +2450,84 @@ } }, "node_modules/@shikijs/core": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-3.6.0.tgz", - "integrity": "sha512-9By7Xb3olEX0o6UeJyPLI1PE1scC4d3wcVepvtv2xbuN9/IThYN4Wcwh24rcFeASzPam11MCq8yQpwwzCgSBRw==", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-3.7.0.tgz", + "integrity": "sha512-yilc0S9HvTPyahHpcum8eonYrQtmGTU0lbtwxhA6jHv4Bm1cAdlPFRCJX4AHebkCm75aKTjjRAW+DezqD1b/cg==", "license": "MIT", "dependencies": { - "@shikijs/types": "3.6.0", + "@shikijs/types": "3.7.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4", "hast-util-to-html": "^9.0.5" } }, "node_modules/@shikijs/engine-javascript": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-3.6.0.tgz", - "integrity": "sha512-7YnLhZG/TU05IHMG14QaLvTW/9WiK8SEYafceccHUSXs2Qr5vJibUwsDfXDLmRi0zHdzsxrGKpSX6hnqe0k8nA==", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-3.7.0.tgz", + "integrity": "sha512-0t17s03Cbv+ZcUvv+y33GtX75WBLQELgNdVghnsdhTgU3hVcWcMsoP6Lb0nDTl95ZJfbP1mVMO0p3byVh3uuzA==", "license": "MIT", "dependencies": { - "@shikijs/types": "3.6.0", + "@shikijs/types": "3.7.0", "@shikijs/vscode-textmate": "^10.0.2", "oniguruma-to-es": "^4.3.3" } }, "node_modules/@shikijs/engine-oniguruma": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-3.6.0.tgz", - "integrity": "sha512-nmOhIZ9yT3Grd+2plmW/d8+vZ2pcQmo/UnVwXMUXAKTXdi+LK0S08Ancrz5tQQPkxvjBalpMW2aKvwXfelauvA==", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-3.7.0.tgz", + "integrity": "sha512-5BxcD6LjVWsGu4xyaBC5bu8LdNgPCVBnAkWTtOCs/CZxcB22L8rcoWfv7Hh/3WooVjBZmFtyxhgvkQFedPGnFw==", "license": "MIT", "dependencies": { - "@shikijs/types": "3.6.0", + "@shikijs/types": "3.7.0", "@shikijs/vscode-textmate": "^10.0.2" } }, "node_modules/@shikijs/langs": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-3.6.0.tgz", - "integrity": "sha512-IdZkQJaLBu1LCYCwkr30hNuSDfllOT8RWYVZK1tD2J03DkiagYKRxj/pDSl8Didml3xxuyzUjgtioInwEQM/TA==", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-3.7.0.tgz", + "integrity": "sha512-1zYtdfXLr9xDKLTGy5kb7O0zDQsxXiIsw1iIBcNOO8Yi5/Y1qDbJ+0VsFoqTlzdmneO8Ij35g7QKF8kcLyznCQ==", "license": "MIT", "dependencies": { - "@shikijs/types": "3.6.0" + "@shikijs/types": "3.7.0" } }, "node_modules/@shikijs/rehype": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/@shikijs/rehype/-/rehype-3.6.0.tgz", - "integrity": "sha512-r0Rr2hvXXqLl5DJ1Lx7RImU81XsK2bjThaym/lujl2A0r7SId0u1s+bcWYfFKb+7mCLH7MXF+jdzCtdWGOcYCQ==", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@shikijs/rehype/-/rehype-3.7.0.tgz", + "integrity": "sha512-YjAZxhQnBXE8ehppKGzuVGPoE4pjVsxqzkWhBZlkP495AjlR++MgfiRFcQfDt3qX5lK3gEDTcghB/8E3yNrWqQ==", "license": "MIT", "dependencies": { - "@shikijs/types": "3.6.0", + "@shikijs/types": "3.7.0", "@types/hast": "^3.0.4", "hast-util-to-string": "^3.0.1", - "shiki": "3.6.0", + "shiki": "3.7.0", "unified": "^11.0.5", "unist-util-visit": "^5.0.0" } }, "node_modules/@shikijs/themes": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-3.6.0.tgz", - "integrity": "sha512-Fq2j4nWr1DF4drvmhqKq8x5vVQ27VncF8XZMBuHuQMZvUSS3NBgpqfwz/FoGe36+W6PvniZ1yDlg2d4kmYDU6w==", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-3.7.0.tgz", + "integrity": "sha512-VJx8497iZPy5zLiiCTSIaOChIcKQwR0FebwE9S3rcN0+J/GTWwQ1v/bqhTbpbY3zybPKeO8wdammqkpXc4NVjQ==", "license": "MIT", "dependencies": { - "@shikijs/types": "3.6.0" + "@shikijs/types": "3.7.0" } }, "node_modules/@shikijs/transformers": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/@shikijs/transformers/-/transformers-3.6.0.tgz", - "integrity": "sha512-PYkU54lYV0RCaUG8n2FNTF+YWiU3uPhcjLGq2x/C8lIrUX9GVnRb3bK+R5xtdFHbuctntATKm7ondp/H/dux9Q==", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@shikijs/transformers/-/transformers-3.7.0.tgz", + "integrity": "sha512-VplaqIMRNsNOorCXJHkbF5S0pT6xm8Z/s7w7OPZLohf8tR93XH0krvUafpNy/ozEylrWuShJF0+ftEB+wFRwGA==", "license": "MIT", "dependencies": { - "@shikijs/core": "3.6.0", - "@shikijs/types": "3.6.0" + "@shikijs/core": "3.7.0", + "@shikijs/types": "3.7.0" } }, "node_modules/@shikijs/types": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-3.6.0.tgz", - "integrity": "sha512-cLWFiToxYu0aAzJqhXTQsFiJRTFDAGl93IrMSBNaGSzs7ixkLfdG6pH11HipuWFGW5vyx4X47W8HDQ7eSrmBUg==", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-3.7.0.tgz", + "integrity": "sha512-MGaLeaRlSWpnP0XSAum3kP3a8vtcTsITqoEPYdt3lQG3YCdQH4DnEhodkYcNMcU0uW0RffhoD1O3e0vG5eSBBg==", "license": "MIT", "dependencies": { "@shikijs/vscode-textmate": "^10.0.2", @@ -2986,13 +2986,13 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "22.15.30", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.15.30.tgz", - "integrity": "sha512-6Q7lr06bEHdlfplU6YRbgG1SFBdlsfNC4/lX+SkhiTs0cpJkOElmWls8PxDFv4yY/xKb8Y6SO0OmSX4wgqTZbA==", + "version": "24.0.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.0.4.tgz", + "integrity": "sha512-ulyqAkrhnuNq9pB76DRBTkcS6YsmDALy6Ua63V8OhrOBgbcYt6IOdzpw5P1+dyRIyMerzLkeYWBeOXPpA9GMAA==", "dev": true, "license": "MIT", "dependencies": { - "undici-types": "~6.21.0" + "undici-types": "~7.8.0" } }, "node_modules/@types/normalize-package-data": { @@ -3004,9 +3004,9 @@ "peer": true }, "node_modules/@types/react": { - "version": "19.1.6", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.6.tgz", - "integrity": "sha512-JeG0rEWak0N6Itr6QUx+X60uQmN+5t3j9r/OVDtWzFXKaj6kD1BwJzOksD0FF6iWxZlbE1kB0q9vtnU2ekqa1Q==", + "version": "19.1.8", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.8.tgz", + "integrity": "sha512-AwAfQ2Wa5bCx9WP8nZL2uMZWod7J7/JSplxbTmBQ5ms6QpqNYm672H0Vu9ZVKVngQ+ii4R/byguVEUZQyeg44g==", "devOptional": true, "license": "MIT", "dependencies": { @@ -4590,19 +4590,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "license": "BSD-2-Clause", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/estree-util-attach-comments": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/estree-util-attach-comments/-/estree-util-attach-comments-3.0.0.tgz", @@ -4787,18 +4774,6 @@ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "license": "MIT" }, - "node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "license": "MIT", - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/fast-content-type-parse": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/fast-content-type-parse/-/fast-content-type-parse-3.0.0.tgz", @@ -5014,15 +4989,15 @@ } }, "node_modules/fumadocs-core": { - "version": "15.5.3", - "resolved": "https://registry.npmjs.org/fumadocs-core/-/fumadocs-core-15.5.3.tgz", - "integrity": "sha512-FGOrPqUpovSkc25s7EzNvYO0Oi1mlAJz9GxJ3jb8W1v5rmtWgjVhpjs5vBNMQtKDpQuO0GjkHN5iMQVbW0DvjQ==", + "version": "15.5.4", + "resolved": "https://registry.npmjs.org/fumadocs-core/-/fumadocs-core-15.5.4.tgz", + "integrity": "sha512-AwRVxMnV+3LUmCCk25I+x/MIELtwxuXmXxaLLXsnas+MPxY9Yo1L5dCubNeiDTJZHBqtDxEEpE7sRmSDIJzfAQ==", "license": "MIT", "dependencies": { "@formatjs/intl-localematcher": "^0.6.1", "@orama/orama": "^3.1.6", - "@shikijs/rehype": "^3.6.0", - "@shikijs/transformers": "^3.6.0", + "@shikijs/rehype": "^3.7.0", + "@shikijs/transformers": "^3.7.0", "github-slugger": "^2.0.0", "hast-util-to-estree": "^3.1.3", "hast-util-to-jsx-runtime": "^2.3.6", @@ -5033,7 +5008,7 @@ "remark-gfm": "^4.0.1", "remark-rehype": "^11.1.2", "scroll-into-view-if-needed": "^3.1.0", - "shiki": "^3.6.0", + "shiki": "^3.7.0", "unist-util-visit": "^5.0.0" }, "peerDependencies": { @@ -5066,9 +5041,9 @@ } }, "node_modules/fumadocs-mdx": { - "version": "11.6.7", - "resolved": "https://registry.npmjs.org/fumadocs-mdx/-/fumadocs-mdx-11.6.7.tgz", - "integrity": "sha512-jOZzxowvhwe9RzV6jVjIS2FsQIz9P6QYkMBPgR0nq9+7trP+mmiLoIq5EwhTPrR/Y/4gTiSl9TXFWxTY02trnw==", + "version": "11.6.9", + "resolved": "https://registry.npmjs.org/fumadocs-mdx/-/fumadocs-mdx-11.6.9.tgz", + "integrity": "sha512-Gm29CFOpvBe8m8r4Es0U6xsVvGaKEMiACsJeUYr6QdZiTYKXkl9a+gI6kkOfPJ/Aoyb561mh3Q0JSONX37GT5w==", "license": "MIT", "dependencies": { "@mdx-js/mdx": "^3.1.0", @@ -5076,14 +5051,13 @@ "chokidar": "^4.0.3", "esbuild": "^0.25.5", "estree-util-value-to-estree": "^3.4.0", - "gray-matter": "^4.0.3", "js-yaml": "^4.1.0", "lru-cache": "^11.1.0", "picocolors": "^1.1.1", "tinyexec": "^1.0.1", "tinyglobby": "^0.2.14", "unist-util-visit": "^5.0.0", - "zod": "^3.25.42" + "zod": "^3.25.63" }, "bin": { "fumadocs-mdx": "bin.js" @@ -5091,11 +5065,18 @@ "peerDependencies": { "@fumadocs/mdx-remote": "^1.2.0", "fumadocs-core": "^14.0.0 || ^15.0.0", - "next": "^15.3.0" + "next": "^15.3.0", + "vite": "6.x.x" }, "peerDependenciesMeta": { "@fumadocs/mdx-remote": { "optional": true + }, + "next": { + "optional": true + }, + "vite": { + "optional": true } } }, @@ -5109,9 +5090,9 @@ } }, "node_modules/fumadocs-ui": { - "version": "15.5.3", - "resolved": "https://registry.npmjs.org/fumadocs-ui/-/fumadocs-ui-15.5.3.tgz", - "integrity": "sha512-5SmN1j7HBQ9XuboAicfFqoNLPpN37Iwz0+cCLt6cOOequurTjfPfYCjvlKzP5q0GxDjrpU2vEQX/9JMa25bC6w==", + "version": "15.5.4", + "resolved": "https://registry.npmjs.org/fumadocs-ui/-/fumadocs-ui-15.5.4.tgz", + "integrity": "sha512-UH/Ia/AYXwepQtM9SwCjm5youKWEop63LAWO1HRk7XkDBFWveggnv6KPlB3tS7n2HkhAtprWWmqGL3YB81ifSw==", "license": "MIT", "dependencies": { "@radix-ui/react-accordion": "^1.2.11", @@ -5125,12 +5106,12 @@ "@radix-ui/react-slot": "^1.2.3", "@radix-ui/react-tabs": "^1.1.12", "class-variance-authority": "^0.7.1", - "fumadocs-core": "15.5.3", + "fumadocs-core": "15.5.4", "lodash.merge": "^4.6.2", "next-themes": "^0.4.6", "postcss-selector-parser": "^7.1.0", "react-medium-image-zoom": "^5.2.14", - "react-remove-scroll": "^2.7.1", + "scroll-into-view-if-needed": "^3.1.0", "tailwind-merge": "^3.3.1" }, "peerDependencies": { @@ -5152,6 +5133,58 @@ } } }, + "node_modules/fumadocs-ui/node_modules/fumadocs-core": { + "version": "15.5.3", + "resolved": "https://registry.npmjs.org/fumadocs-core/-/fumadocs-core-15.5.3.tgz", + "integrity": "sha512-FGOrPqUpovSkc25s7EzNvYO0Oi1mlAJz9GxJ3jb8W1v5rmtWgjVhpjs5vBNMQtKDpQuO0GjkHN5iMQVbW0DvjQ==", + "license": "MIT", + "dependencies": { + "@formatjs/intl-localematcher": "^0.6.1", + "@orama/orama": "^3.1.6", + "@shikijs/rehype": "^3.6.0", + "@shikijs/transformers": "^3.6.0", + "github-slugger": "^2.0.0", + "hast-util-to-estree": "^3.1.3", + "hast-util-to-jsx-runtime": "^2.3.6", + "image-size": "^2.0.2", + "negotiator": "^1.0.0", + "react-remove-scroll": "^2.7.1", + "remark": "^15.0.0", + "remark-gfm": "^4.0.1", + "remark-rehype": "^11.1.2", + "scroll-into-view-if-needed": "^3.1.0", + "shiki": "^3.6.0", + "unist-util-visit": "^5.0.0" + }, + "peerDependencies": { + "@oramacloud/client": "1.x.x || 2.x.x", + "@types/react": "*", + "algoliasearch": "5.x.x", + "next": "14.x.x || 15.x.x", + "react": "18.x.x || 19.x.x", + "react-dom": "18.x.x || 19.x.x" + }, + "peerDependenciesMeta": { + "@oramacloud/client": { + "optional": true + }, + "@types/react": { + "optional": true + }, + "algoliasearch": { + "optional": true + }, + "next": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, "node_modules/function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", @@ -5330,43 +5363,6 @@ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "license": "ISC" }, - "node_modules/gray-matter": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", - "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==", - "license": "MIT", - "dependencies": { - "js-yaml": "^3.13.1", - "kind-of": "^6.0.2", - "section-matter": "^1.0.0", - "strip-bom-string": "^1.0.0" - }, - "engines": { - "node": ">=6.0" - } - }, - "node_modules/gray-matter/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "license": "MIT", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/gray-matter/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "license": "MIT", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, "node_modules/handlebars": { "version": "4.7.8", "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", @@ -5819,15 +5815,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -6113,15 +6100,6 @@ "node": ">= 12" } }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/lightningcss": { "version": "1.30.1", "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.1.tgz", @@ -12316,19 +12294,6 @@ "compute-scroll-into-view": "^3.0.2" } }, - "node_modules/section-matter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", - "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==", - "license": "MIT", - "dependencies": { - "extend-shallow": "^2.0.1", - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/semantic-release": { "version": "24.1.2", "resolved": "https://registry.npmjs.org/semantic-release/-/semantic-release-24.1.2.tgz", @@ -12484,17 +12449,17 @@ } }, "node_modules/shiki": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-3.6.0.tgz", - "integrity": "sha512-tKn/Y0MGBTffQoklaATXmTqDU02zx8NYBGQ+F6gy87/YjKbizcLd+Cybh/0ZtOBX9r1NEnAy/GTRDKtOsc1L9w==", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-3.7.0.tgz", + "integrity": "sha512-ZcI4UT9n6N2pDuM2n3Jbk0sR4Swzq43nLPgS/4h0E3B/NrFn2HKElrDtceSf8Zx/OWYOo7G1SAtBLypCp+YXqg==", "license": "MIT", "dependencies": { - "@shikijs/core": "3.6.0", - "@shikijs/engine-javascript": "3.6.0", - "@shikijs/engine-oniguruma": "3.6.0", - "@shikijs/langs": "3.6.0", - "@shikijs/themes": "3.6.0", - "@shikijs/types": "3.6.0", + "@shikijs/core": "3.7.0", + "@shikijs/engine-javascript": "3.7.0", + "@shikijs/engine-oniguruma": "3.7.0", + "@shikijs/langs": "3.7.0", + "@shikijs/themes": "3.7.0", + "@shikijs/types": "3.7.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } @@ -12765,12 +12730,6 @@ "through2": "~2.0.0" } }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "license": "BSD-3-Clause" - }, "node_modules/stream-combiner2": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", @@ -12931,15 +12890,6 @@ "node": ">=4" } }, - "node_modules/strip-bom-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", - "integrity": "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/strip-final-newline": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-4.0.0.tgz", @@ -13404,9 +13354,9 @@ } }, "node_modules/undici-types": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", - "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.8.0.tgz", + "integrity": "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==", "dev": true, "license": "MIT" }, @@ -14010,9 +13960,9 @@ } }, "node_modules/zod": { - "version": "3.25.56", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.56.tgz", - "integrity": "sha512-rd6eEF3BTNvQnR2e2wwolfTmUTnp70aUTqr0oaGbHifzC3BKJsoV+Gat8vxUMR1hwOKBs6El+qWehrHbCpW6SQ==", + "version": "3.25.67", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.67.tgz", + "integrity": "sha512-idA2YXwpCdqUSKRCACDE6ItZD9TZzy3OZMtpfLoh6oPR47lipysRrJfjzMqFxQ3uJuUPyUeWe1r9vLH33xO/Qw==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/colinhacks" diff --git a/package.json b/package.json index 2ff4f0d..6627467 100644 --- a/package.json +++ b/package.json @@ -14,9 +14,9 @@ }, "dependencies": { "@types/mdx": "^2.0.13", - "fumadocs-core": "^15.5.3", - "fumadocs-mdx": "^11.6.7", - "fumadocs-ui": "^15.5.3", + "fumadocs-core": "^15.5.4", + "fumadocs-mdx": "^11.6.9", + "fumadocs-ui": "^15.5.4", "lucide-react": "^0.513.0", "mdx": "^0.3.1", "next": "^15.3.3", @@ -27,8 +27,8 @@ "devDependencies": { "@semantic-release/github": "^11.0.3", "@tailwindcss/postcss": "^4.1.10", - "@types/node": "22.15.30", - "@types/react": "^19.1.6", + "@types/node": "24.0.4", + "@types/react": "^19.1.8", "@types/react-dom": "^19.1.6", "autoprefixer": "^10.4.21", "markdownlint-cli": "^0.45.0",