---
name: mandu-mcp-create-flow
description: |
  스펙 우선 생성 워크플로우. "만들어줘", 피처/리소스/라우트 추가 시 자동 호출.
  contract → generate 순서를 강제하고 생성 직후 verify loop 로 전이.
  granular 도구 (add_route + create_contract + generate) 를 손으로 엮지 않는다.
---

# Mandu MCP Create Flow

새 기능을 스캐폴딩할 때의 **스펙 우선** 레시피. "contract 없이 generate 먼저"
라는 대표적 실수를 방지하고, 가능한 한 집계 도구 (resource/feature/scaffold) 를
사용한다.

## Trigger

- "만들어줘", "추가해줘", "create", "add"
- "CRUD" + 엔티티 이름
- 피처 / 라우트 / 리소스 / API 엔드포인트 / 컴포넌트 추가
- `mandu-create-feature` 또는 `mandu-create-api` task-shaped skill 이 활성화될 때

## Decision Tree

요청의 단위를 먼저 구분한다.

```
요청 내용
├─ 리소스 단위 (User, Post, Comment 같은 도메인 엔티티)
│    → Track A: Resource flow
├─ 피처 단위 (페이지 + 섹션 + island + slot 세트)
│    → Track B: Feature flow
├─ 단일 라우트 (페이지 하나 또는 API 하나만)
│    → Track C: Route flow
└─ 스키마만 이미 있고 스캐폴드만 필요
     → Track D: Scaffold-only
```

### Track A — Resource Flow (도메인 엔티티)

```
mandu.resource.create        ← Tier-0 aggregate: resource + fields 묶음 생성
  └─> mandu_create_contract  ← Zod 계약 (집계 도구가 자동으로 요청하지 않을 때만)
       └─> mandu_generate    ← 스캐폴드 생성
            └─> mandu-mcp-verify 로 전이
```

`mandu.resource.create` 인자 예:
```
mandu.resource.create({
  name: "Post",
  fields: { title: "string", content: "string", publishedAt: "datetime?" }
})
```

리소스가 생성되면 route / slot / contract 의 후보가 제안된다. 제안을 그대로
받아 `mandu_generate` 로 흘린다. 제안된 경로를 무시하고 `mandu_add_route` 로
손수 만들지 않는다.

### Track B — Feature Flow (페이지 + island + slot)

```
mandu_analyze_structure         ← alias of mandu.negotiate.analyze, 요구사항 → 구조 제안
  └─> mandu.feature.create      ← Tier-0 aggregate: 여러 라우트 + slot + island 묶음
       └─> mandu_create_contract ← API 엔드포인트가 포함된 경우
            └─> mandu_generate
                 └─> mandu-mcp-verify 로 전이
```

또는 단축 경로:

```
mandu_generate_scaffold   ← alias of mandu.negotiate.scaffold,
                            negotiate + scaffold 를 한 번에
  └─> mandu-mcp-verify
```

사용자가 이미 스키마를 구체적으로 제시했다면 `mandu_analyze_structure` 는 스킵.
"대충 사용자 프로필 페이지 만들어줘" 처럼 모호한 요청일 때만 negotiate 먼저.

### Track C — Single Route Flow

```
mandu_add_route          ← 파일 생성 (경로 규칙 자동 적용)
  └─> mandu_create_contract ← API 라우트면 필수, 페이지만이면 생략 가능
       └─> mandu_generate    ← 스캐폴드 반영
            └─> mandu-mcp-verify
```

`mandu_add_route` 인자:
```
mandu_add_route({ path: "/users/[id]", type: "page" })
mandu_add_route({ path: "/api/users/[id]", type: "api" })
```

### Track D — Scaffold-Only (스키마 이미 있음)

사용자가 `spec.ts` 또는 기존 contract 를 제시했다면:

```
mandu_generate_scaffold   ← negotiate skip, 바로 scaffold
  └─> mandu-mcp-verify
```

## Absolute Rules

| # | 규칙 | 이유 |
|---|------|------|
| R-1 | `mandu_generate` 는 **언제나 마지막** | contract 이전 generate 는 생성물 타입이 unstable |
| R-2 | `mandu_create_contract` 는 **`mandu_generate` 전에** | 생성물이 Zod 타입에 바인딩됨 |
| R-3 | 복합 생성은 **집계 도구 우선** (`resource.create` / `feature.create` / `generate_scaffold`) | 순서 / 롤백 / 검증을 집계가 처리 |
| R-4 | 생성 직후 **무조건 `mandu-mcp-verify` 로 전이** | 생성물은 guard / contract / ate 로 검증해야 의미 있음 |
| R-5 | 사용자가 스키마를 준 경우 **`negotiate` 스킵** | 중복 분석 왕복 제거 |
| R-6 | 단일 트랜잭션 단위는 **`mandu_begin` ~ `mandu_commit`** 로 감싼다 (위험 변경 시) | `mandu-mcp-safe-change` 참조 |

## Post-Create Transition (자동)

생성이 끝나면 **반드시** `mandu-mcp-verify` fast path 로 넘어간다:

```
mandu_generate 완료
  → mandu.ate.auto_pipeline + mandu_guard_check + mandu_doctor (병렬)
  → 실패 시 drill-down
```

`mandu_generate` 의 응답이 "success" 라도 verify 를 건너뛰지 않는다.
guard 위반이나 contract 타입 불일치는 생성 자체는 성공해도 나중에 드러난다.

## Anti-patterns

### AP — Granular Manual Assembly
- 증상: 피처 하나 만들라는 요청에 `mandu_add_route` × 3 + `mandu_create_contract` × 2 + `mandu_generate` 를 수동 호출.
- 왜 안 되나: 중간에 실패하면 반쯤 만들어진 상태. 집계 도구 (`feature.create`, `resource.create`) 가 이 시퀀스를 트랜잭션으로 처리한다.
- 대응: Track A / B / D 의 집계 도구 먼저.

### AP — Generate Before Contract (R-2 위반)
- 증상: `mandu_generate` → 결과 보고 → `mandu_create_contract` → 또 `mandu_generate`.
- 왜 안 되나: 1차 generate 의 생성물이 버려짐 + 2차에서 import path 꼬임.
- 대응: contract 먼저. 항상.

### AP — Negotiate 후 직접 생성
- 증상: `mandu_analyze_structure` 로 계획 받고, 반환된 route 목록을 `mandu_add_route` 로 손으로 하나씩.
- 왜 안 되나: `mandu_generate_scaffold` 가 이 역할. negotiate 의 구조를 바로 scaffold 로 흘린다.
- 대응: `mandu_generate_scaffold` 한 방.

### AP — "만들고 바로 커밋"
- 증상: `mandu_generate` 결과를 보고 verify 스킵하고 git commit.
- 왜 안 되나: guard 위반 / contract 불일치가 커밋에 박힘.
- 대응: R-4 (생성 직후 verify) 지킨다.

## Quick Recipes

### 간단한 CRUD 리소스 추가
```
mandu.resource.create({ name, fields })
mandu_generate                        (resource.create 가 요청할 때만)
→ mandu-mcp-verify
```
호출 수: 2-3

### 피처 + API + Island
```
mandu_generate_scaffold({ description })
→ mandu-mcp-verify
```
호출 수: 2 (가장 압축된 경로)

### 이미 있는 contract 에 라우트 하나만 추가
```
mandu_add_route({ path, type })
mandu_generate
→ mandu-mcp-verify
```
호출 수: 3

목표: 표준 CRUD 피처 기준 **≤ 6 MCP 호출 (생성 + verify fast path 포함)**.

## See Also

- `mandu-mcp-index` — 라우터 / anti-pattern 카탈로그
- `mandu-mcp-verify` — 생성 직후 자동 전이
- `mandu-mcp-safe-change` — 기존 구조를 흔드는 리팩터의 경우
- `mandu-create-feature`, `mandu-create-api` — 도메인 지식 (파일 구조, 네이밍)
- `mandu-slot` — slot 파일 작성 규칙
