# Dashboard Sync Guide

This document explains how to sync shared code between StemeDB Dashboard and Aphoria Dashboard.

## Architecture Decision

Both dashboards use the **Copy with Documentation** approach:
- Shared infrastructure is copied, not abstracted into a monorepo package
- This minimizes build complexity and allows independent versioning
- Controlled divergence is acceptable with documented sync procedures

## Shared Components

### Shared Code (Keep in Sync)

These files should be kept synchronized between dashboards:

#### UI Components (`src/components/ui/`)
- `badge.tsx`
- `button.tsx`
- `card.tsx`
- `date-picker.tsx`
- `input.tsx`
- `separator.tsx`
- `sheet.tsx`
- `tabs.tsx`

#### Shared Components (`src/components/shared/`)
- `confirmation-dialog.tsx`
- `api-status.tsx`
- `error-state.tsx`

#### Reusable Layout Components (`src/components/layout/`)
- `header.tsx`
- `theme-toggle.tsx`

**Note:** Do NOT sync `sidebar.tsx` - each dashboard has its own navigation.

#### Library Code (`src/lib/`)
- `api/client.ts` - API client (has both StemeDB + Aphoria methods)
- `api/types.ts` - Type definitions
- `api/index.ts` - API exports
- `utils.ts` - Utilities
- `format.ts` - Formatting helpers
- `types.ts` - Type definitions
- `constants.ts` - Constants
- `auth/api-key.ts` - API key handling

#### Base Configuration
- `globals.css` - TailwindCSS globals
- `components.json` - shadcn/ui config

### Dashboard-Specific Code (Do NOT Sync)

#### StemeDB Dashboard Only
- `src/app/skeptic/`, `src/app/layered/`, `src/app/sources/`, `src/app/quarantine/`, `src/app/circuit/`, `src/app/audit/`
- `src/components/skeptic/`, `src/components/layered/`, `src/components/sources/`, `src/components/quarantine/`, `src/components/circuit/`, `src/components/audit/`
- `src/components/layout/sidebar.tsx` (6 routes)
- `package.json` (port 18188)

#### Aphoria Dashboard Only
- `src/app/scans/`, `src/app/claims/`, `src/app/corpus/`
- `src/components/scans/`, `src/components/claims/`, `src/components/corpus/`
- `src/components/layout/sidebar.tsx` (3 routes)
- `package.json` (port 18189)

## Sync Procedures

### When to Sync

You need to sync when:
1. **Adding new shadcn/ui components** - Add to both dashboards
2. **Updating API types** - Update `lib/api/types.ts` in both
3. **Changing API client methods** - Update `lib/api/client.ts` in both
4. **Modifying shared utilities** - Update `lib/utils.ts`, `lib/format.ts`, etc.
5. **Changing globals.css** - Update in both

### How to Sync

**Option 1: Manual Copy (Recommended)**

```bash
# Sync UI components
cp -r stemedb-dashboard/src/components/ui/* aphoria-dashboard/src/components/ui/

# Sync shared components
cp -r stemedb-dashboard/src/components/shared/* aphoria-dashboard/src/components/shared/

# Sync layout components (except sidebar)
cp stemedb-dashboard/src/components/layout/header.tsx aphoria-dashboard/src/components/layout/
cp stemedb-dashboard/src/components/layout/theme-toggle.tsx aphoria-dashboard/src/components/layout/

# Sync lib directory
cp -r stemedb-dashboard/src/lib/* aphoria-dashboard/src/lib/

# Sync globals.css
cp stemedb-dashboard/src/app/globals.css aphoria-dashboard/src/app/
```

**Option 2: rsync Script**

Create a script `sync-dashboards.sh`:

```bash
#!/bin/bash
set -e

SRC="applications/stemedb-dashboard/src"
DEST="applications/aphoria-dashboard/src"

echo "Syncing shared code from StemeDB to Aphoria Dashboard..."

# Sync UI components
rsync -av --delete "$SRC/components/ui/" "$DEST/components/ui/"

# Sync shared components
rsync -av --delete "$SRC/components/shared/" "$DEST/components/shared/"

# Sync layout components (exclude sidebar)
rsync -av --exclude="sidebar.tsx" "$SRC/components/layout/" "$DEST/components/layout/"

# Sync lib directory
rsync -av --delete "$SRC/lib/" "$DEST/lib/"

# Sync globals.css
rsync -av "$SRC/app/globals.css" "$DEST/app/"

echo "Sync complete!"
```

**Option 3: Reverse Sync (Aphoria → StemeDB)**

If you make changes in Aphoria Dashboard first:

```bash
# Reverse direction
SRC="applications/aphoria-dashboard/src"
DEST="applications/stemedb-dashboard/src"

# Same rsync commands but reversed
```

### Sync Checklist

After syncing, verify:
- [ ] Both dashboards build without errors
- [ ] No import errors in browser console
- [ ] Shared components render correctly in both dashboards
- [ ] API calls work in both dashboards
- [ ] UI components match in both dashboards

## Dependency Version Management

### Keep Aligned

Both `package.json` files should have matching versions for:
- `next`
- `react`
- `react-dom`
- `tailwindcss`
- `@tailwindcss/postcss`
- `lucide-react`
- `class-variance-authority`
- `clsx`
- `tailwind-merge`
- All other shared dependencies

### Update Strategy

When updating dependencies:
1. Update `package.json` in both dashboards
2. Run `npm install` in both
3. Test both dashboards
4. Commit both at the same time

## Future: Monorepo Packages

If code drift becomes problematic, consider refactoring to:

```
applications/
├── packages/
│   ├── dashboard-shared/     # Shared UI components, lib, utils
│   │   ├── src/
│   │   │   ├── components/
│   │   │   ├── lib/
│   │   │   └── index.ts
│   │   └── package.json
│   └── dashboard-api/        # Shared API client
│       ├── src/
│       │   └── client.ts
│       └── package.json
├── stemedb-dashboard/
│   ├── package.json          # Depends on dashboard-shared
│   └── src/
└── aphoria-dashboard/
    ├── package.json          # Depends on dashboard-shared
    └── src/
```

This would:
- Eliminate manual syncing
- Enforce shared component consistency
- Add build complexity (workspace setup)
- Require version management between packages

**Decision Point:** If syncing more than once a week, migrate to monorepo.

## Questions?

If you're unsure whether to sync a file:
- **Is it in the Shared Code list above?** → Sync it
- **Is it in the Dashboard-Specific list?** → Don't sync it
- **Not sure?** → Check if it's used by both dashboards. If yes, sync it.
