Files
mcphub/AGENTS.md

4.7 KiB

Repository Guidelines

These notes align current contributors around the code layout, daily commands, and collaboration habits that keep @samanhappy/mcphub moving quickly.

Project Structure & Module Organization

  • Backend services live in src, grouped by responsibility (controllers/, services/, dao/, routes/, utils/), with server.ts orchestrating HTTP bootstrap.
  • frontend/src contains the Vite + React dashboard; frontend/public hosts static assets and translations sit in locales/.
  • Jest-aware test code is split between colocated specs (src/**/*.{test,spec}.ts) and higher-level suites in tests/; use tests/utils/ helpers when exercising the CLI or SSE flows.
  • Build artifacts and bundles are generated into dist/, frontend/dist/, and coverage/; never edit these manually.

Build, Test, and Development Commands

  • pnpm dev runs backend (tsx watch src/index.ts) and frontend (vite) together for local iteration.
  • pnpm backend:dev, pnpm frontend:dev, and pnpm frontend:preview target each surface independently; prefer them when debugging one stack.
  • pnpm build executes pnpm backend:build (TypeScript to dist/) and pnpm frontend:build; run before release or publishing.
  • pnpm test, pnpm test:watch, and pnpm test:coverage drive Jest; pnpm lint and pnpm format enforce style via ESLint and Prettier.

Coding Style & Naming Conventions

  • TypeScript everywhere; default to 2-space indentation and single quotes, letting Prettier settle formatting. ESLint configuration assumes ES modules.
  • Name services and data access layers with suffixes (UserService, AuthDao), React components and files in PascalCase, and utility modules in camelCase.
  • Keep DTOs and shared types in src/types to avoid duplication; re-export through index files only when it clarifies imports.

Testing Guidelines

  • Use Jest with the ts-jest ESM preset; place shared setup in tests/setup.ts and mock helpers under tests/utils/.
  • Mirror production directory names when adding new suites and end filenames with .test.ts or .spec.ts for automatic discovery.
  • Aim to maintain or raise coverage when touching critical flows (auth, OAuth, SSE); add integration tests under tests/integration/ when touching cross-service logic.

Commit & Pull Request Guidelines

  • Follow the existing Conventional Commit pattern (feat:, fix:, chore:, etc.) with imperative, present-tense summaries and optional multi-line context.
  • Each PR should describe the behavior change, list testing performed, and link issues; include before/after screenshots or GIFs for frontend tweaks.
  • Re-run pnpm build and pnpm test before requesting review, and ensure generated artifacts stay out of the diff.

DAO Layer & Dual Data Source

MCPHub supports JSON file (default) and PostgreSQL storage. Set USE_DB=true + DB_URL to switch.

Key Files

  • src/types/index.ts - Core interfaces (IUser, IGroup, ServerConfig, etc.)
  • src/dao/*Dao.ts - DAO interface + JSON implementation
  • src/dao/*DaoDbImpl.ts - Database implementation
  • src/db/entities/*.ts - TypeORM entities
  • src/db/repositories/*.ts - TypeORM repository wrappers
  • src/utils/migration.ts - JSON-to-database migration

Modifying Data Structures (CRITICAL)

When adding/changing fields, update ALL these files:

Step File Action
1 src/types/index.ts Add field to interface
2 src/dao/*Dao.ts Update JSON impl if needed
3 src/db/entities/*.ts Add TypeORM @Column
4 src/dao/*DaoDbImpl.ts Map field in create/update
5 src/db/repositories/*.ts Update if needed
6 src/utils/migration.ts Include in migration
7 mcp_settings.json Update example if applicable

Data Type Mapping

Model DAO DB Entity JSON Path
IUser UserDao User settings.users[]
ServerConfig ServerDao Server settings.mcpServers{}
IGroup GroupDao Group settings.groups[]
SystemConfig SystemConfigDao SystemConfig settings.systemConfig
UserConfig UserConfigDao UserConfig settings.userConfigs{}

Common Pitfalls

  • Forgetting migration script → fields won't migrate to DB
  • Optional fields need nullable: true in entity
  • Complex objects need simple-json column type