home / skills / shipshitdev / library / fullstack-workspace-init

fullstack-workspace-init skill

/bundles/workspace/skills/fullstack-workspace-init

This skill scaffolds a production-ready full-stack monorepo with CRUD, Clerk auth, tests, and CI/CD ready to run with bun dev.

npx playbooks add skill shipshitdev/library --skill fullstack-workspace-init

Review the files below or copy the command above to add this skill to your agents.

Files (29)
SKILL.md
11.3 KB
---
name: fullstack-workspace-init
description: Scaffold a production-ready full-stack monorepo with working MVP features, tests, and CI/CD. Generates complete CRUD functionality, Clerk authentication, and quality gates that run immediately with `bun dev`.
---

# Full Stack Workspace Init

Create a **production-ready** monorepo with working MVP features:

- **Frontend:** NextJS 16 + React 19 + TypeScript + Tailwind + @agenticindiedev/ui
- **Backend:** NestJS 11 + MongoDB + Clerk Auth + Swagger
- **Mobile:** React Native + Expo (optional)
- **Quality:** Vitest (80% coverage) + Biome + Husky + GitHub Actions CI/CD
- **Package Manager:** bun

## What Makes This Different

This skill generates **working applications**, not empty scaffolds:

- Complete CRUD operations for your main entities
- Clerk authentication configured and working
- Tests with 80% coverage threshold
- GitHub Actions CI/CD pipeline
- Runs immediately with `bun dev`

---

## Workflow

### Phase 1: PRD Brief Intake

**Ask the user for a 1-2 paragraph product description**, then extract and confirm:

```
I'll help you build [Project Name]. Based on your description, I understand:

**Entities:**
- [Entity1]: [fields]
- [Entity2]: [fields]

**Features:**
- [Feature 1]
- [Feature 2]

**Routes:**
- / - Home/Dashboard
- /[entity] - List view
- /[entity]/[id] - Detail view

**API Endpoints:**
- GET/POST /api/[entity]
- GET/PATCH/DELETE /api/[entity]/:id

Is this correct? Any adjustments?
```

### Phase 2: Auth Setup (Always Included)

Generate Clerk authentication:

**Backend:**

- `auth/guards/clerk-auth.guard.ts` - Token verification guard
- `auth/decorators/current-user.decorator.ts` - User extraction decorator

**Frontend:**

- `providers/clerk-provider.tsx` - ClerkProvider wrapper
- `app/sign-in/[[...sign-in]]/page.tsx` - Sign in page
- `app/sign-up/[[...sign-up]]/page.tsx` - Sign up page
- `middleware.ts` - Protected route middleware

**Environment:**

- `.env.example` with all required variables

### Phase 3: Entity Generation

For each extracted entity, generate complete CRUD **with tests**:

**Backend (NestJS):**

```
api/apps/api/src/collections/{entity}/
├── {entity}.module.ts
├── {entity}.controller.ts         # Full CRUD + Swagger + ClerkAuthGuard
├── {entity}.controller.spec.ts    # Controller unit tests
├── {entity}.service.ts            # Business logic
├── {entity}.service.spec.ts       # Service unit tests
├── schemas/
│   └── {entity}.schema.ts         # Mongoose schema with userId
└── dto/
    ├── create-{entity}.dto.ts     # class-validator decorators
    └── update-{entity}.dto.ts     # PartialType of create

api/apps/api/test/
├── {entity}.e2e-spec.ts           # E2E tests with supertest
└── setup.ts                       # Test setup with MongoDB Memory Server
```

**Frontend (NextJS):**

```
frontend/apps/dashboard/
├── app/{entity}/
│   ├── page.tsx                   # List view (protected)
│   └── [id]/page.tsx              # Detail view (protected)
├── src/test/
│   └── setup.ts                   # Test setup with Clerk mocks
└── vitest.config.ts               # Frontend test config (jsdom)

frontend/packages/components/
├── {entity}-list.tsx
├── {entity}-list.spec.tsx         # Component tests
├── {entity}-form.tsx
├── {entity}-form.spec.tsx         # Component tests
└── {entity}-item.tsx

frontend/packages/hooks/
├── use-{entities}.ts              # React hook for state management
└── use-{entities}.spec.ts         # Hook tests

frontend/packages/services/
└── {entity}.service.ts            # API client with auth headers
```

### Phase 4: Quality Setup

**Vitest Configuration:**

- `vitest.config.ts` in each project
- 80% coverage threshold for lines, functions, branches
- `@vitest/coverage-v8` provider

**GitHub Actions:**

- `.github/workflows/ci.yml`
- Runs on push to main and PRs
- Steps: install → lint → test → build

**Husky Hooks:**

- Pre-commit: `lint-staged` (Biome check)
- Pre-push: `bun run typecheck`

**Biome:**

- `biome.json` in each project
- 100 character line width
- Double quotes, semicolons

### Phase 5: Verification

Run quality gate and report results:

```
✅ Generation complete!

Quality Report:
- bun install: ✓ succeeded
- bun run lint: ✓ 0 errors
- bun run test: ✓ 24 tests passed
- Coverage: 82% (threshold: 80%)

Ready to run:
  cd [project]
  bun dev
```

---

## Usage

```bash
# Create workspace with PRD-style prompt
python3 ~/.claude/skills/fullstack-workspace-init/scripts/init-workspace.py \
  --root ~/www/myproject \
  --name "My Project" \
  --brief "A task management app where users can create tasks with titles and due dates, organize them into projects, and mark them complete."

# Or interactive mode (prompts for brief)
python3 ~/.claude/skills/fullstack-workspace-init/scripts/init-workspace.py \
  --root ~/www/myproject \
  --name "My Project" \
  --interactive
```

---

## Generated Structure

```
myproject/
├── .github/
│   └── workflows/
│       └── ci.yml              # GitHub Actions CI/CD
├── .husky/
│   ├── pre-commit              # Lint staged files
│   └── pre-push                # Type check
├── .agents/                     # AI documentation
├── package.json                # Workspace root
├── biome.json                  # Root linting config
│
├── api/                        # NestJS backend
│   ├── apps/api/src/
│   │   ├── main.ts
│   │   ├── app.module.ts
│   │   ├── auth/
│   │   │   ├── guards/clerk-auth.guard.ts
│   │   │   ├── guards/clerk-auth.guard.spec.ts  # Auth guard tests
│   │   │   └── decorators/current-user.decorator.ts
│   │   └── collections/
│   │       └── {entity}/
│   │           ├── {entity}.controller.ts
│   │           ├── {entity}.controller.spec.ts  # Controller tests
│   │           ├── {entity}.service.ts
│   │           └── {entity}.service.spec.ts     # Service tests
│   ├── apps/api/test/
│   │   ├── {entity}.e2e-spec.ts                 # E2E tests
│   │   └── setup.ts                             # E2E test setup
│   ├── vitest.config.ts
│   ├── package.json
│   └── .env.example
│
├── frontend/                   # NextJS apps
│   ├── apps/dashboard/
│   │   ├── app/
│   │   │   ├── layout.tsx
│   │   │   ├── page.tsx
│   │   │   ├── sign-in/[[...sign-in]]/page.tsx
│   │   │   ├── sign-up/[[...sign-up]]/page.tsx
│   │   │   └── {entity}/       # Generated per entity
│   │   ├── src/test/
│   │   │   └── setup.ts        # Test setup with Clerk mocks
│   │   ├── middleware.ts       # Clerk route protection
│   │   └── providers/
│   │       └── clerk-provider.tsx
│   ├── packages/
│   │   ├── components/
│   │   │   ├── {entity}-list.tsx
│   │   │   ├── {entity}-list.spec.tsx   # Component tests
│   │   │   ├── {entity}-form.tsx
│   │   │   └── {entity}-form.spec.tsx   # Component tests
│   │   ├── hooks/
│   │   │   ├── use-{entities}.ts
│   │   │   └── use-{entities}.spec.ts   # Hook tests
│   │   ├── services/           # API clients
│   │   └── interfaces/
│   ├── vitest.config.ts        # Frontend test config (jsdom)
│   └── package.json
│
├── mobile/                     # React Native + Expo (optional)
│   └── ...
│
└── packages/                   # Shared packages
    └── packages/
        ├── common/
        │   ├── interfaces/
        │   └── enums/
        └── helpers/
```

---

## Key Patterns

### Backend Controller Pattern

```typescript
@ApiTags('tasks')
@ApiBearerAuth()
@UseGuards(ClerkAuthGuard)
@Controller('tasks')
export class TasksController {
  constructor(private readonly tasksService: TasksService) {}

  @Post()
  @ApiOperation({ summary: 'Create a new task' })
  create(
    @Body() createTaskDto: CreateTaskDto,
    @CurrentUser() user: { userId: string },
  ) {
    return this.tasksService.create(createTaskDto, user.userId);
  }
  // ... full CRUD
}
```

### Backend Service Pattern

```typescript
@Injectable()
export class TasksService {
  constructor(
    @InjectModel(Task.name) private taskModel: Model<TaskDocument>,
  ) {}

  async create(createTaskDto: CreateTaskDto, userId: string): Promise<Task> {
    const task = new this.taskModel({ ...createTaskDto, userId });
    return task.save();
  }
  // ... full CRUD with userId filtering
}
```

### Frontend Component Pattern

```typescript
'use client';

import { useEffect, useState } from 'react';
import { TaskService } from '@services/task.service';
import { Task } from '@interfaces/task.interface';

export function TaskList() {
  const [tasks, setTasks] = useState<Task[]>([]);
  const [loading, setLoading] = useState(true);

  useEffect(() => {
    const controller = new AbortController();
    TaskService.getAll({ signal: controller.signal })
      .then(setTasks)
      .finally(() => setLoading(false));
    return () => controller.abort();
  }, []);

  // ... render
}
```

---

## Additional Scripts

```bash
# Add a new entity to existing project
python3 ~/.claude/skills/fullstack-workspace-init/scripts/add-entity.py \
  --root ~/www/myproject \
  --name "comment" \
  --fields "content:string,taskId:string"

# Add a new frontend app
python3 ~/.claude/skills/fullstack-workspace-init/scripts/add-frontend-app.py \
  --root ~/www/myproject/frontend \
  --name admin
```

---

## Development Commands

After scaffolding:

```bash
cd myproject

# Install all dependencies
bun install

# Start all services (backend + frontend)
bun dev

# Or start individually
bun run dev:api      # Backend on :3001
bun run dev:frontend # Frontend on :3000
bun run dev:mobile   # Mobile via Expo

# Quality commands
bun run lint         # Check code style
bun run test         # Run tests
bun run test:coverage # Run with coverage
bun run typecheck    # Type checking
```

---

## Environment Variables

Create `.env` files based on `.env.example`:

**API (.env):**

```
PORT=3001
MONGODB_URI=mongodb://localhost:27017/myproject
CLERK_SECRET_KEY=sk_test_...
```

**Frontend (.env.local):**

```
NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY=pk_test_...
NEXT_PUBLIC_API_URL=http://localhost:3001
```

---

## References

- `references/templates/` - Code generation templates
  - `service.spec.template.ts` - NestJS service unit test template
  - `controller.spec.template.ts` - NestJS controller unit test template
  - `e2e.spec.template.ts` - E2E test template with supertest + MongoDB Memory Server
  - `component.spec.template.tsx` - React component test template
  - `hook.spec.template.ts` - React hook test template
  - `test-setup.template.ts` - Frontend test setup with Clerk mocks
- `references/vitest.config.ts` - Backend Vitest configuration (80% coverage)
- `references/vitest.config.frontend.ts` - Frontend Vitest configuration (jsdom)
- `references/github-actions/ci.yml` - CI/CD workflow
- `references/architecture-guide.md` - Architectural decisions
- `references/coding-standards.md` - Coding rules

Overview

This skill scaffolds a production-ready full-stack monorepo with a working MVP, tests, and CI/CD so you can start building immediately. It generates backend and frontend apps, Clerk authentication, complete CRUD for your entities, quality gates, and a bun-powered dev workflow that runs with bun dev. The output is runnable, tested, and includes GitHub Actions, Husky hooks, and linting configuration.

How this skill works

You provide a 1–2 paragraph product brief or run interactively. The generator extracts entities, fields, routes, and features, then emits a monorepo with Next.js frontend, NestJS backend, optional Expo mobile app, and shared packages. Each entity receives full CRUD (controllers, services, DTOs, Mongoose schemas), frontend components/hooks/services, unit and E2E tests, and Clerk auth wired end-to-end. The tool also creates Vitest configs, coverage thresholds, Biome linting, Husky hooks, and a CI workflow so quality gates run immediately.

When to use it

  • Bootstrapping a new full-stack product with working auth and CRUD
  • Creating a monorepo that must include tests and CI from day one
  • Generating consistent entity code across backend and frontend
  • Adding a new entity to an existing workspace with tests and API clients
  • Preparing a demo or MVP that must be runnable locally with bun dev
  • Standardizing architecture across teams using NestJS, Next.js, and Clerk

Best practices

  • Provide a clear 1–2 paragraph product brief so entity extraction is accurate
  • Design entities with userId ownership fields to preserve multi-tenant safety
  • Keep DTOs and schemas aligned; use class-validator for backend validation
  • Run bun install and bun dev immediately to surface missing env variables and quick feedback
  • Use the generated GitHub Actions and Husky hooks as the canonical CI/lint workflow
  • Add integration tests for critical flows beyond generated unit/E2E tests

Example use cases

  • Create a task management MVP with tasks and projects, full CRUD, and Clerk auth
  • Scaffold a notes app where users create and share notes, with frontend components and API clients
  • Add a comments entity to an existing workspace using the add-entity script; tests and API routes are generated
  • Prepare a demo product for investor or user testing with CI, coverage gates, and runnable dev servers
  • Spin up an admin app and dashboard using add-frontend-app script and shared services

FAQ

Will generated code run locally out of the box?

Yes. The workspace includes .env.example files and scripts; run bun install then bun dev. You may need to set required env variables (Clerk keys, MongoDB URI).

Can I add entities later?

Yes. Use the add-entity script to generate backend, frontend, tests, and services for new entities while preserving existing code and quality gates.