superset

GitHub

Apache Superset is a Data Visualization and Data Exploration Platform

RAW Rules

AGENTS.md

# Superset Monorepo

Superset is an agent-first development platform, with an Electron desktop IDE, Next.js web apps, and an Expo mobile app as the main customer-facing surfaces. It's a Turborepo monorepo, deployed apps are in apps/ and supporting packages are in packages/, and we use tRPC for the api.

You're working inside a Superset workspace, an isolated git-worktree copy of this repo. "Workspace" in a user message means that, not an editor workspace.

## Project Structure

All projects in this repo should be structured like this:

```
app/
β”œβ”€β”€ page.tsx
β”œβ”€β”€ dashboard/
β”‚   β”œβ”€β”€ page.tsx
β”‚   β”œβ”€β”€ components/
β”‚   β”‚   └── MetricsChart/
β”‚   β”‚       β”œβ”€β”€ MetricsChart.tsx
β”‚   β”‚       β”œβ”€β”€ MetricsChart.test.tsx      # Tests co-located
β”‚   β”‚       β”œβ”€β”€ index.ts
β”‚   β”‚       └── constants.ts
β”‚   β”œβ”€β”€ hooks/                             # Hooks used only in dashboard
β”‚   β”‚   └── useMetrics/
β”‚   β”‚       β”œβ”€β”€ useMetrics.ts
β”‚   β”‚       β”œβ”€β”€ useMetrics.test.ts
β”‚   β”‚       └── index.ts
β”‚   β”œβ”€β”€ utils/                             # Utils used only in dashboard
β”‚   β”‚   └── formatData/
β”‚   β”‚       β”œβ”€β”€ formatData.ts
β”‚   β”‚       β”œβ”€β”€ formatData.test.ts
β”‚   β”‚       └── index.ts
β”‚   β”œβ”€β”€ stores/                            # Stores used only in dashboard
β”‚   β”‚   └── dashboardStore/
β”‚   β”‚       β”œβ”€β”€ dashboardStore.ts
β”‚   β”‚       └── index.ts
β”‚   └── providers/                         # Providers for dashboard context
β”‚       └── DashboardProvider/
β”‚           β”œβ”€β”€ DashboardProvider.tsx
β”‚           └── index.ts
└── components/
    β”œβ”€β”€ Sidebar/
    β”‚   β”œβ”€β”€ Sidebar.tsx
    β”‚   β”œβ”€β”€ Sidebar.test.tsx               # Tests co-located
    β”‚   β”œβ”€β”€ index.ts
    β”‚   β”œβ”€β”€ components/                    # Used 2+ times IN Sidebar
    β”‚   β”‚   └── SidebarButton/             # Shared by SidebarNav + SidebarFooter
    β”‚   β”‚       β”œβ”€β”€ SidebarButton.tsx
    β”‚   β”‚       β”œβ”€β”€ SidebarButton.test.tsx
    β”‚   β”‚       └── index.ts
    β”‚   β”œβ”€β”€ SidebarNav/
    β”‚   β”‚   β”œβ”€β”€ SidebarNav.tsx
    β”‚   β”‚   └── index.ts
    β”‚   └── SidebarFooter/
    β”‚       β”œβ”€β”€ SidebarFooter.tsx
    β”‚       └── index.ts
    └── HeroSection/
        β”œβ”€β”€ HeroSection.tsx
        β”œβ”€β”€ HeroSection.test.tsx           # Tests co-located
        β”œβ”€β”€ index.ts
        └── components/                    # Used ONLY by HeroSection
            └── HeroCanvas/
                β”œβ”€β”€ HeroCanvas.tsx
                β”œβ”€β”€ HeroCanvas.test.tsx
                β”œβ”€β”€ HeroCanvas.stories.tsx
                β”œβ”€β”€ index.ts
                └── config.ts

components/                                # Used in 2+ pages (last resort)
└── Header/
```

1. **One folder per component**: `ComponentName/ComponentName.tsx` + `index.ts` for barrel export
2. **Co-locate by usage**: If used once, nest under parent's `components/`. If used 2+ times, promote to **highest shared parent's** `components/` (or `components/` as last resort)
3. **One component per file**: No multi-component files
4. **Co-locate dependencies**: Utils, hooks, constants, config, tests, stories live next to the file using them

### Exception: shadcn/ui Components

The `src/components/ui/` and `src/components/ai-elements` directories contain shadcn/ui components. These use **kebab-case single files** (e.g., `button.tsx`, `base-node.tsx`) instead of the folder structure above. This is intentionalβ€”shadcn CLI expects this format for updates via `bunx shadcn@latest add`.

## Database

Drizzle ORM, schema in `packages/db/src/`. Follow `.agents/skills/db-migrations/SKILL.md` to generate
migrations. Never hand-edit `packages/db/drizzle/` (SQL, `meta/_journal.json`, snapshots) without
explicit user confirmation, and never apply migrations against a shared or production database.

## Releases

Desktop, host-service, and cli share one version; cut releases on a dedicated branch. Runbook:
`scripts/release/README.md`. A *canary* is a separate thing: `bash scripts/release-canary.sh
[commit]` builds the rolling internal `desktop-canary` prerelease, not a versioned release.

## Orchestrating agents and workspaces

When work wants a fresh isolated environment, a parallel agent, or a long-running job, reach for the
`superset` CLI instead of hand-rolling git worktrees or doing it all serially in this one. It's
already on `PATH` in Superset terminals, and we dogfood it.

Replace the capitalized placeholders before running these:

```bash
superset ws create --project PROJECT_ID --branch BRANCH --agent claude --prompt "..."
superset agents create --workspace WORKSPACE_ID --agent claude --prompt "..."
superset ws list
superset terminals read --workspace WORKSPACE_ID --terminal TERMINAL_ID
superset ws delete WORKSPACE_ID
```

In order: an isolated workspace with an agent already working in it, another agent in an existing
workspace, what's running, what an agent is doing right now, and cleanup when you're done.

`superset <command> --help` covers the rest (tasks, automations, hosts, settings). Pass `--json` for
parsable output; it's on by default under agent environments.

## Further reading

- `.agents/skills/`: CDP UI verification, DB migrations, ticket format, and more. Read the matching
  `SKILL.md` when a task fits its description.
- `docs/agent-tooling.md`: where commands, skills, and per-agent-CLI config live.
- `apps/desktop/AGENTS.md`: desktop specifics (notices, persisted renderer state).
- `apps/mobile/AGENTS.md`: mobile structure and iOS-only scope.