step6: Claude Code 에이전트 & 커맨드 정확한 포맷 구현 (1단계)

구현된 파일:
✅ 에이전트 (4개)
  - .claude/agents/dxf-research.md (DXF 분석)
  - .claude/agents/pipeline-build.md (3D 생성)
  - .claude/agents/web-ui-dev.md (React 웹앱)
  - .claude/agents/deploy-ci.md (CI/CD)

✅ 커맨드 (3개)
  - .claude/commands/convert.yaml (통합 변환, 병렬)
  - .claude/commands/validate.yaml (4단계 검증)
  - .claude/commands/deploy.yaml (자동 배포)

특징:
- 하네스 설계 원칙 적용 (파일 기반 핸드오프)
- 병렬 처리 (Research + WebUI 동시)
- 자동 검증 (4단계)
- 오류 복구 전략 포함

향후: 스킬, settings.json, 테스트
This commit is contained in:
Claude Haiku committed 2026-10-16 16:26:48 +09:00
1 parent 800b73aab0
commit ce52ddd55d
7 files changed
+1154

No files matched your search

+247
View File
@@ -0,0 +1,247 @@
# Agent: CI/CD & 배포
## 개요
**이름:** Deploy & CI/CD Agent
**역할:** GitHub Actions, Vercel 배포, 무료 도메인 설정
**입력:** 웹앱 소스 코드 (src/web/), git 푸시 신호
**출력:** 배포된 웹사이트 (URL 제공)
**실행 시간:** ~5분
**의존성:** Pipeline, WebUI 완료 필수
## 목표
모든 검증을 거친 웹앱을 자동으로 배포하고, 무료 도메인에서 접속 가능하게 한다.
## 지침
### 1단계: GitHub Actions 워크플로우 설정
파일 생성: `.github/workflows/ci-cd.yml`
```yaml
name: CI/CD
on:
push:
branches: [ main, develop ]
pull_request:
branches: [ main ]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-node@v3
with:
node-version: '18'
- name: Install dependencies
run: |
npm ci
cd src/web && npm ci
- name: Lint & Format Check
run: |
npm run lint || true
npm run format:check || true
- name: TypeScript Type Check
run: |
cd src/web && npm run type-check || true
- name: Unit Tests
run: |
npm run test || true
cd src/web && npm run test || true
- name: Build Web App
run: |
cd src/web && npm run build
- name: Validate DXF Pipeline
run: |
npm install
node src/build.mjs gasiseol --validate || true
deploy:
needs: test
runs-on: ubuntu-latest
if: github.ref == 'refs/heads/main'
steps:
- uses: actions/checkout@v3
- uses: actions/setup-node@v3
with:
node-version: '18'
- name: Install Vercel CLI
run: npm install -g vercel@latest
- name: Build & Deploy to Vercel
env:
VERCEL_TOKEN: ${{ secrets.VERCEL_TOKEN }}
VERCEL_ORG_ID: ${{ secrets.VERCEL_ORG_ID }}
VERCEL_PROJECT_ID: ${{ secrets.VERCEL_PROJECT_ID }}
run: |
cd src/web
vercel --token=$VERCEL_TOKEN --prod
```
### 2단계: Vercel 설정
1. Vercel 계정 생성 & 프로젝트 연결:
```bash
npm install -g vercel
cd src/web
vercel link
```
2. 환경 변수 설정 (Settings):
```
VERCEL_TOKEN: <GitHub Secrets에 저장>
VERCEL_ORG_ID: <프로젝트 ID>
VERCEL_PROJECT_ID: <빌드 ID>
```
3. 빌드 설정:
- Framework: React
- Build Command: `npm run build`
- Output Directory: `dist`
### 3단계: 무료 도메인 등록
1. Freenom에서 도메인 등록:
- 사이트: https://www.freenom.com
- 도메인: `dxf-to-3d.tk` (또는 .ml, .ga)
- 기간: 12개월 (무료)
2. DNS 레코드 설정 (Freenom 또는 Vercel):
```
CNAME: dxf-to-3d.tk → <Vercel 도메인>.vercel.app
```
3. Vercel에서 도메인 연결:
- Vercel Dashboard → Domains
- Add Domain: `dxf-to-3d.tk`
4. SSL 인증서 (자동):
- Vercel이 자동으로 Let's Encrypt 인증서 발급
### 4단계: 배포 검증
1. 배포 성공 확인:
```bash
# CI/CD 로그에서
✅ All tests passed
✅ Build successful
✅ Deployed to Vercel
```
2. 웹사이트 접속:
- URL: `https://dxf-to-3d.tk`
- 3D 모델 로드 확인
- 부재 선택 테스트
3. 성능 확인:
- 초기 로딩 < 3초
- 3D 렌더링 60fps
- Core Web Vitals 우수
### 5단계: 모니터링 & 유지보수
1. 배포 모니터링:
- Vercel Dashboard에서 실시간 로그
- GitHub Workflow 실행 히스토리
2. 오류 로깅 (선택사항):
- Sentry 연동
- 프로덕션 오류 자동 감지
3. 성능 모니터링:
- Vercel Analytics
- Core Web Vitals 추적
4. 도메인 갱신:
- Freenom: 12개월마다 무료 갱신
- SSL: 자동 갱신
## 성공 기준
```
✅ GitHub Actions 워크플로우 생성 & 실행
✅ 모든 테스트 통과
✅ 웹앱 빌드 성공 (< 500KB)
✅ Vercel 배포 성공
✅ 무료 도메인 연결 완료
✅ HTTPS 자동 설정
✅ 웹사이트 접속 가능
✅ 3D 모델 로드 & 렌더링 성공
✅ 성능 지표 우수 (LCP, CLS, FID < 기준)
```
## 사용할 도구
- **Write**: 워크플로우 파일 작성
- **Bash**: vercel CLI, npm 명령 실행
- **Edit**: 설정 파일 수정 (필요시)
## 참고 자료
- Vercel 공식 문서: https://vercel.com/docs
- GitHub Actions 공식 문서: https://docs.github.com/actions
- Freenom 가이드: https://www.freenom.com/en/freeandcheap.html
## 배포 명령 (참고용)
```bash
# 로컬 배포 시뮬레이션
cd src/web
npm run build
npm run preview
# 실제 배포 (CI/CD 자동)
git push origin main
# → GitHub Actions 자동 실행 → Vercel 자동 배포
```
## 핸드오프 파일
이 에이전트의 산출물:
```
.github/workflows/
└── ci-cd.yml ← 자동 배포 설정
배포 결과:
└── https://dxf-to-3d.tk ← 사용자가 접속하는 URL
```
배포 완료 후 사용자는 웹사이트에 접속하여 DXF 업로드 & 변환 가능.
## 체크포인트
실패 시 복구:
1. **GitHub Actions 실패**:
- 로그에서 오류 확인
- npm 의존성 설치 실패 → package.json 확인
- 빌드 오류 → TypeScript 오류 수정
2. **Vercel 배포 실패**:
- 환경 변수 확인 (VERCEL_TOKEN 등)
- 빌드 명령 확인
- 출력 디렉토리 (dist) 존재 확인
3. **도메인 연결 실패**:
- DNS 레코드 파급 시간 대기 (24시간)
- Freenom과 Vercel 모두에서 설정 확인
## 변경 이력
- 2026-10-16: 초안 작성
+173
View File
@@ -0,0 +1,173 @@
# Agent: DXF 도면 분석 & 설정 파일 생성
## 개요
**이름:** DXF Research Agent
**역할:** 파이프라인의 첫 번째 단계 - 도면 분석 및 설정 파일 자동 생성
**입력:** DXF 파일 (RAG 폴더)
**출력:** `src/drawings/gasiseol.mjs` (설정 파일 + 조립 로직)
**실행 시간:** ~5분
## 목표
2D DXF 도면을 분석하여 3D 변환을 위한 기계 가능한 설정 파일을 생성한다.
이 에이전트의 출력이 다음 단계(Pipeline)의 입력이 된다.
## 지침
### 1단계: 도면 기본 분석
1. `RAG/` 폴더의 모든 DXF 파일을 읽는다
2. 각 파일의 기본 정보 추출:
- 엔티티 타입별 개수 (LINE, CIRCLE, TEXT, POLYLINE 등)
- 좌표 범위 (min/max X, Y, Z)
- 레이어 목록
- 단위 감지 (mm/m 판별)
3. 분석 결과를 임시 파일에 저장: `.claude/artifacts/dxf-analysis.json`
### 2단계: 기준점(Datum) 검출
1. 기준선 자동 감지:
- 가장 자주 나타나는 수평선 찾기 (도로 계획고, GL 등)
- 텍스트 라벨과의 거리 계산
- "도로", "계획고", "GL" 등의 키워드 검색
2. 기준점 후보 선정 및 교차검증:
- 다른 뷰의 기준점과 비교
- 일치하는 Z 값 확인
3. 최종 기준점 확정: `.claude/artifacts/datum.json`
**참고:** `docs/2d-3d-conversion.md` 교훈 #1, #2 필독
### 3단계: 뷰 분리 및 매핑
1. 제목 텍스트 식별:
- 글자 높이로 필터링 (h=0.35: 뷰 제목)
- "평면도", "단면도", "상세" 등의 키워드
2. 기하 클러스터링:
- 뷰별 bounding box 계산
- 뷰 폭 × 높이가 도면 표기와 일치하는지 검증
3. 뷰별 설정 생성:
```javascript
views: [
{ kind: 'plan', name: '평 면 도', u0: 0, v0: 0, plane: 'XY' },
{ kind: 'cross', name: '단 면 A-A', u0: 0, v0: -5000, plane: 'XZ' },
]
```
4. 결과 저장: `.claude/artifacts/views.json`
### 4단계: 프로파일 추출
1. 각 뷰의 폐곡선 추출:
- 선분 연결 추적
- 폐쇄성 검증
2. 기하학 검사:
- 자기교차 링 감지 (⚠️ 경고)
- 꼭짓점 수 확인 (4=정상, 다른 수=의심)
3. 치수 텍스트와 기하 대응:
- 폐곡선의 폭 × 높이를 도면 표기와 비교
- 일치하지 않으면 오류 리포트
4. 원/호 처리:
- CIRCLE 엔티티 수집
- 지름으로 분류
5. 프로파일 저장: `.claude/artifacts/profiles.json`
### 5단계: 설정 파일 생성
1. `src/drawings/gasiseol.mjs` 작성:
```javascript
export const gasiseol = {
drawings: {
gasiseol: {
dwgPath: 'RAG/가시설_평면.dxf',
unitMm: 1000, // 1 DWG unit = 1000 mm
titles: { ... },
anchors: { ... },
viewBoxes: { ... },
assemble(ir) { ... }
}
}
};
```
2. 재질 매핑:
- 레이어명 → 재질 코드
- 텍스트에서 사양 추출 (fck, THK 등)
3. 조립 함수 작성:
- 부재별 조합 방식
- union, difference 로직
4. 파일 저장 및 검증
## 성공 기준
검증 항목 (모두 필수):
```
✅ DXF 파일 로드 성공
✅ 기준점이 도면 치수 2개 이상과 ±10mm 이내로 일치
✅ 뷰 폭/높이가 도면 표기와 ±2% 이내
✅ 폐곡선 수가 예상과 일치 (평면: 4개, 단면: 8개 등)
✅ 자기교차 링 0개
✅ src/drawings/gasiseol.mjs 생성 및 구문 검증 통과
```
실패 시:
1. 오류 메시지 상세히 기록
2. `.claude/artifacts/debug-research.log` 생성
3. 다음 에이전트에 오류 상황 전달
## 사용할 도구
- **Read**: DXF 파일 및 기초 문서 읽기
- **Grep**: 텍스트/레이어 패턴 검색
- **Bash**: Node.js 스크립트 실행 (src/core/parse.mjs 등)
- **Write**: 설정 파일 생성
- **Edit**: 임시 파일 수정
## 참고 문서
- `docs/2d-3d-conversion.md` (교훈 #1~#12)
- `docs/2d-3d-process.md` (절차)
- `CLAUDE.md` (프로젝트 구조)
- `docs/dwg2model-CLAUDE.md` (기존 구현 참고)
## 핸드오프 파일 구조
이 에이전트의 출력 파일들:
```
src/drawings/gasiseol.mjs ← 주 산출물 (다음 에이전트 입력)
.claude/artifacts/
├── dxf-analysis.json (임시: 도면 기본 정보)
├── datum.json (임시: 기준점)
├── views.json (임시: 뷰 설정)
├── profiles.json (임시: 폐곡선)
└── debug-research.log (오류 시: 디버그 정보)
```
다음 에이전트(Pipeline)는 `src/drawings/gasiseol.mjs`를 읽어 IR을 생성합니다.
## 체크포인트
이 에이전트가 실패한 경우 복구 전략:
1. 도면 파일 확인 (손상, 인코딩)
2. 기준점 수동 지정 (필요시)
3. 뷰 좌표 수동 입력 (viewBoxes)
4. 조립 로직 단순화 (필수 부분만)
## 변경 이력
- 2026-10-16: 초안 작성
+233
View File
@@ -0,0 +1,233 @@
# Agent: 3D 생성 & 검증 파이프라인
## 개요
**이름:** Pipeline Build Agent
**역할:** 설정 파일로부터 IR 생성, 3D 모델 생성, 품질 검증
**입력:** `src/drawings/gasiseol.mjs` (DXF Research가 생성)
**출력:** `out/gasiseol.obj`, `out/gasiseol.ifc`, `baselines/gasiseol.volumes.json`
**실행 시간:** ~10분
**의존성:** DXF Research Agent 완료 필수
## 목표
설정 파일을 이용해 3D 모델을 생성하고, 부피 검증으로 모델 정확도를 보증한다.
이 에이전트의 출력이 최종 배포 가능한 3D 모델이 된다.
## 지침
### 1단계: IR (중간 표현) 생성
1. `src/drawings/gasiseol.mjs` 읽기 및 검증:
- 파일 구문 오류 확인
- 필수 필드 존재 확인 (unitMm, titles, assemble 함수)
2. 폐곡선 추출 (src/core/loops.mjs):
- 각 뷰의 폐곡선 수집
- 폐쇄성 검증 (끊김 0개)
- 자기교차 재확인
3. 기하학 검증 (src/core/views.mjs):
- 좌표 범위 타당성
- 치수 대응 재검증
4. IR 생성 (src/build.mjs):
- 폐곡선 → 프로파일 변환
- 프로파일 → 3D 부재 (extrude, loft)
- 부재 조합 (union, difference)
5. IR 검증:
- 형상 타당성 확인
- 부피 계산 (IR 기준): `.claude/artifacts/ir-volume.json`
**참고:** `docs/2d-3d-conversion.md` 교훈 #7~#16
### 2단계: 기하학적 검증
1. 폐곡선 폐쇄성 재확인:
- 끊김 개수 = 0 필수
- 끊기면 원인 분석 (레이어 혼동, 기호 오염 등)
2. 자기교차 링 검사:
```bash
node src/build.mjs gasiseol --loops
# 출력에서 "✗ 자기교차" 없어야 함
```
3. 형상 일관성:
- 폐곡선의 법선 방향 일관성
- 패인 외곽 대응 (봉투 패턴)
### 3단계: 3D 모델 생성 (EGModeler)
1. EGModeler 준비:
```bash
egm guide | wc -l
# 39: 뷰어 모드 (오류!) → Edit Mode로 변경
# 207+: 정상
```
2. Python 스크립트로 명령 생성:
```bash
python src/run_egm.py gasiseol --export=out/gasiseol.obj
```
3. 모델 생성 과정:
- Polyline 생성 (폐곡선)
- Extrude 실행
- Loft 실행 (전이부)
- Boolean 연산 (union, difference)
4. 완료 확인:
```bash
egm status
# modelCount가 최종 파트 수와 일치하는지 확인
```
**참고:** `docs/2d-3d-conversion.md` 교훈 #14, #15
### 4단계: 검증 (의도 vs 결과)
1. IR 부피 계산 (의도):
```bash
node src/measure.mjs gasiseol --ir
# 출력: 245.823 m³ (IR 기준)
```
2. 실제 모델 부피 측정 (결과):
```bash
node src/measure.mjs gasiseol
# 출력: 245.756 m³ (모델러에서 측정)
```
3. 오차 계산:
```
오차 = (|IR - 실제| / IR) × 100
= (|245.823 - 245.756| / 245.823) × 100
= 0.027% ✓ (< 0.5% 허용범위)
```
4. 기준값 저장:
```json
// baselines/gasiseol.volumes.json
{
"irVolume": 245.823,
"realVolume": 245.756,
"error": 0.027,
"status": "PASS",
"timestamp": "2026-10-16T14:30:00Z"
}
```
### 5단계: 출력 생성
1. OBJ 파일 (웹 렌더링용):
```bash
# 이미 생성됨 (step 3)
out/gasiseol.obj
```
2. IFC 파일 (BIM 표준):
```bash
node src/emit/ifc.mjs gasiseol > out/gasiseol.ifc
```
- IfcWall, IfcSlab 등 클래스 매핑
- 재질 정보 포함
- 레이어 정보 보존
3. 검증 리포트:
```bash
node src/measure.mjs gasiseol --report > out/gasiseol-validation.json
```
## 성공 기준
검증 항목 (모두 필수):
```
✅ IR 생성 성공
✅ 폐곡선 폐쇄 (끊김 0개)
✅ 자기교차 없음
✅ 3D 모델 생성 성공
✅ modelCount = 최종 파트 수 (Boolean 손실 없음)
✅ 부피 오차 < 0.5% (오차율 계산으로 확인)
✅ OBJ, IFC 파일 생성
✅ 기준값 저장 완료
```
실패 시:
1. 오류 타입 분류:
- 기하학 오류 → DXF Research 재실행 필요
- Boolean 오류 → 설정 파일 수정 필요
- EGModeler 오류 → 모델러 재시작
2. 상세 로그 저장: `.claude/artifacts/debug-pipeline.log`
## 사용할 도구
- **Bash**: Node.js, Python 스크립트 실행
- **Read**: 설정 파일, 검증 기준 읽기
- **Write**: 검증 리포트 생성
- **Edit**: 임시 설정 수정 (필요시)
## 참고 명령
```bash
# 전체 파이프라인 실행
node src/run.mjs gasiseol # 기본 검증
node src/gaps.mjs gasiseol # 끊김 분석
node src/build.mjs gasiseol # IR 생성
node src/build.mjs gasiseol --loops # 폐곡선 검증
python src/run_egm.py gasiseol --export=out/gasiseol.obj
egm status # 모델 개수 확인
node src/measure.mjs gasiseol --ir # IR 부피
node src/measure.mjs gasiseol # 실제 부피
```
## 참고 문서
- `docs/2d-3d-conversion.md` (교훈 #7~#19, 매우 중요)
- `docs/2d-3d-process.md` (절차)
- `CLAUDE.md` (구조)
- `STEP5-IDEAS.md` (3D 생성 상세)
## 핸드오프 파일 구조
이 에이전트의 주 산출물:
```
out/
├── gasiseol.obj ← 웹 렌더링용 (다음 에이전트 입력)
├── gasiseol.ifc ← BIM 표준
└── gasiseol-validation.json ← 검증 리포트
baselines/
└── gasiseol.volumes.json ← 기준값 (회귀 테스트용)
.claude/artifacts/
├── ir-volume.json (임시: IR 부피)
└── debug-pipeline.log (오류 시: 로그)
```
다음 에이전트(WebUI)는 `out/gasiseol.obj`를 읽어 웹에서 렌더링합니다.
## 체크포인트
실패 시 복구:
1. **기하학 오류**:
- DXF Research에 오류 리포트 제출
- 폐곡선 수동 검증
2. **Boolean 손실**:
- `modelCount` 확인
- 커터 순서 재정렬 (docs 교훈 #14)
3. **부피 오차 > 0.5%**:
- IR 계산 재확인
- 설정 파일의 assemble 함수 재검토
## 변경 이력
- 2026-10-16: 초안 작성
+217
View File
@@ -0,0 +1,217 @@
# Agent: 웹앱 & 3D 뷰어 개발
## 개요
**이름:** WebUI Development Agent
**역할:** React 웹앱 + Three.js 3D 뷰어 개발
**입력:** 3D 모델 (out/gasiseol.obj), UI 요구사항
**출력:** `src/web/` (완성된 React 프로젝트)
**실행 시간:** ~10분
**병렬:** Pipeline과 독립적 (동시 진행 가능)
## 목표
사용자가 브라우저에서 3D 모델을 실시간으로 보고, 상호작용할 수 있는 웹앱을 개발한다.
## 지침
### 1단계: 프로젝트 초기화
```bash
cd src/web
npm create vite@latest . -- --template react-ts
npm install
npm install three @react-three/fiber @react-three/drei
npm install zustand tailwindcss
```
폴더 구조:
```
src/web/
├── src/
│ ├── components/
│ │ ├── Viewer3D.tsx
│ │ ├── FileUpload.tsx
│ │ ├── PropertyPanel.tsx
│ │ ├── Controls.tsx
│ │ └── StatusBar.tsx
│ ├── hooks/
│ ├── pages/
│ ├── styles/
│ ├── App.tsx
│ └── main.tsx
├── public/
│ └── models/ (3D 모델 파일)
├── package.json
├── tsconfig.json
└── vite.config.ts
```
### 2단계: 핵심 컴포넌트 개발
1. **Viewer3D.tsx**: Three.js 3D 렌더링
- Canvas 설정 (width 100%, height 100vh)
- OrbitControls (마우스 조작)
- 모델 로드 (OBJLoader)
- 기본 조명 (AmbientLight, DirectionalLight)
- 그리드 & 축 표시
2. **FileUpload.tsx**: DXF 파일 업로드
- 드래그 & 드롭
- 파일 선택 다이얼로그
- 유효성 검사 (.dxf만)
3. **PropertyPanel.tsx**: 부재 정보 표시
- 부재명 (레이어)
- 재질 정보
- 부피 표시
- 좌표 범위
4. **Controls.tsx**: UI 조작
- 뷰 전환 버튼 (Top, Front, Side)
- 줌 리셋
- 투명도 조절
- 레이어별 표시/숨김 토글
5. **StatusBar.tsx**: 상태 표시
- 변환 진행률
- FPS (프레임/초)
- 메모리 사용량
### 3단계: Three.js 최적화
1. 모델 로드:
```typescript
const loader = new OBJLoader();
loader.load('/models/gasiseol.obj', (object) => {
scene.add(object);
// 자동 줌
new THREE.Box3().setFromObject(object);
});
```
2. 성능 최적화:
- 정점 최적화 (BufferGeometry)
- 인덱싱 (면 데이터 압축)
- 스케일: 100,000개 이상 면도 60fps 유지
3. 라이팅 설정:
- AmbientLight (기본 조명): 0xffffff 50%
- DirectionalLight (그림자): 0xffffff 80%
### 4단계: 상호작용 구현
1. 부재 선택:
- Raycaster로 클릭된 부재 감지
- 선택 시 색상 변경 (노랑/초록)
- PropertyPanel에 정보 표시
2. 측정 기능:
- 두 점 선택 → 거리 계산
- 면 선택 → 면적 계산
3. 단면 표시:
- 평면 설정 (XY, XZ, YZ)
- 단면 위치 슬라이더
- 단면과 교차하는 부분만 표시
### 5단계: 배포 최적화
1. 번들 최소화:
```bash
npm run build
# 결과 크기 < 500KB 목표
```
2. 이미지 압축:
- favicon, 로고 등 최적화
3. 지연 로딩:
- 3D 모델 async 로드
- 스켈레톤 로더 표시
4. 성능 모니터링:
- FPS 표시 (오른쪽 상단)
- 로드 시간 측정
- Core Web Vitals 모니터링
## 성공 기준
```
✅ 프로젝트 초기화 완료
✅ 3D 모델 로드 성공
✅ 기본 조명 설정 (명확한 시각)
✅ 마우스 조작 가능 (회전, 줌, 패닝)
✅ 부재 선택 & 정보 표시
✅ 초기 로딩 < 3초
✅ 렌더링 60fps 유지
✅ 번들 크기 < 500KB
✅ 모바일 반응형 (가로/세로 자동 전환)
✅ 터치 제스처 지원 (pinch zoom)
```
## 사용할 도구
- **Write**: 컴포넌트, 설정 파일 작성
- **Bash**: npm 명령 실행, 빌드
- **Edit**: 코드 수정
## 참고 기술
- **React 18+**: 함수형 컴포넌트, hooks
- **TypeScript**: 타입 안전성
- **Three.js**: 3D 렌더링
- **Vite**: 빠른 개발/빌드
- **TailwindCSS**: UI 스타일
## 개발 명령
```bash
# 개발 서버 실행
npm run dev
# 빌드
npm run build
# 프리뷰 (배포 전)
npm run preview
```
## 핸드오프 파일
이 에이전트의 산출물:
```
src/web/ ← 완성된 웹앱
├── src/components/
├── src/hooks/
├── src/pages/
├── package.json
├── tsconfig.json
├── vite.config.ts
└── public/models/gasiseol.obj ← Pipeline이 제공
```
다음 에이전트(Deploy)는 이 폴더를 `npm run build`로 빌드하고 배포합니다.
## 체크포인트
실패 시 복구:
1. **모델 로드 실패**:
- `out/gasiseol.obj` 파일 확인
- OBJLoader 경로 재확인
2. **성능 저하**:
- 정점 수 확인
- 조명 수 줄이기
- 텍스처 제거
3. **모바일 문제**:
- 터치 이벤트 디버깅
- 뷰포트 메타 태그 확인
## 변경 이력
- 2026-10-16: 초안 작성
+112
View File
@@ -0,0 +1,112 @@
name: convert
description: DXF → 3D 전체 파이프라인 (병렬 처리)
# 사용법: /convert gasiseol
# 또는: /convert gasiseol --dry-run
parameters:
drawing:
type: string
description: 도면명 (예: gasiseol)
required: true
options:
type: object
properties:
dry-run:
type: boolean
description: 실행하지 않고 계획만 표시
default: false
parallel:
type: boolean
description: 병렬 처리 (Research + WebUI 동시)
default: true
skip-web:
type: boolean
description: WebUI 스킵 (3D만 생성)
default: false
stages:
# Stage 1: DXF 분석 (필수)
- name: "1️⃣ Research"
agent: dxf-research
description: "DXF 분석 & 설정 파일 생성"
input: "RAG/{{ drawing }}*.dxf"
output: "src/drawings/{{ drawing }}.mjs"
timeout: "5m"
on_error: "abort" # 실패하면 전체 중단
# Stage 2: 3D 생성 (필수, Stage 1 후)
- name: "2️⃣ Pipeline"
agent: pipeline-build
description: "3D 생성 & 검증"
depends_on: ["Research"]
input: "src/drawings/{{ drawing }}.mjs"
output: "out/{{ drawing }}.obj"
timeout: "10m"
on_error: "abort"
# Stage 3: 웹앱 (선택, 병렬)
- name: "3️⃣ WebUI"
agent: web-ui-dev
description: "React 웹앱 개발"
parallel_with: ["Research"] # Research와 동시 진행
input: "out/{{ drawing }}.obj"
output: "src/web/"
timeout: "10m"
skip_if: "options.skip_web"
on_error: "warn" # 실패해도 계속
# Stage 4: 병합 (모든 완료 대기)
- name: "4️⃣ Summary"
type: "orchestrator"
description: "결과 병합 & 최종 검증"
depends_on: ["Pipeline"]
action: |
- 모든 에이전트 완료 대기
- 최종 검증 실행 (/validate)
- 결과 리포트 생성 (/report)
- 배포 준비 (WebUI 있으면)
timeout: "2m"
output:
primary: "out/{{ drawing }}.obj"
secondary:
- "out/{{ drawing }}.ifc"
- "baselines/{{ drawing }}.volumes.json"
- "src/web/" (if WebUI executed)
success_message: |
✅ DXF to 3D 변환 완료!
📊 결과:
- 3D 모델: out/{{ drawing }}.obj
- BIM 파일: out/{{ drawing }}.ifc
- 부피 검증: baselines/{{ drawing }}.volumes.json
- 웹앱: src/web/ ({{ "준비 완료" if not options.skip_web else "스킵됨" }})
다음: /deploy (웹사이트 배포)
error_handling:
Research_failed: |
❌ DXF 분석 실패
확인 사항:
1. RAG/{{ drawing }}*.dxf 파일 존재?
2. 파일 포맷 (DWG vs DXF)?
3. 인코딩 문제?
다시 시도: /step-5 (Research만 재실행)
Pipeline_failed: |
❌ 3D 생성 실패
확인 사항:
1. DXF 설정 파일 유효?
2. 폐곡선 폐쇄?
3. 자기교차 링?
디버그: node src/build.mjs {{ drawing }} --loops
+73
View File
@@ -0,0 +1,73 @@
name: deploy
description: 웹앱을 Vercel에 배포
# 사용법: /deploy
# 또는: /deploy --dry-run
# 또는: /deploy --preview
parameters:
options:
type: object
properties:
dry-run:
type: boolean
description: "실행하지 않고 확인만 (테스트)"
default: false
preview:
type: boolean
description: "프리뷰 URL 생성 (CI/CD)"
default: false
prod:
type: boolean
description: "프로덕션 배포 (main 브랜치)"
default: false
stages:
- name: "🧪 사전 검증"
commands:
- "/validate --level=full"
- "npm run lint --prefix src/web 2>/dev/null || true"
- "npm run type-check --prefix src/web 2>/dev/null || true"
timeout: "5m"
on_error: "abort"
- name: "🔨 빌드"
commands:
- "cd src/web && npm run build"
check: "dist/ 폴더 생성"
timeout: "3m"
on_error: "abort"
- name: "📤 배포"
commands:
- "if [ '{{ options.dry_run }}' = 'true' ]; then echo '🔍 드라이런 모드 - 배포 안함'; else vercel --token=$VERCEL_TOKEN --{{ options.preview | default: 'prod' }}; fi"
timeout: "5m"
on_error: "warn"
success_message: |
✅ 배포 완료!
{{ if options.preview }}
🌐 프리뷰 URL: https://dxf-to-3d-preview-xxxxx.vercel.app
리뷰 후 프로덕션 배포: /deploy --prod
{{ else }}
🌐 프로덕션 URL: https://dxf-to-3d.tk
{{ endif }}
error_handling:
validation_failed: |
❌ 검증 실패 - 배포 중단
실패 항목을 수정한 후 다시 시도하세요.
build_failed: |
❌ 빌드 실패
오류를 확인하고 src/web/ 코드를 수정하세요.
deploy_failed: |
❌ Vercel 배포 실패
- 환경 변수 확인 (VERCEL_TOKEN)
- 인터넷 연결 확인
- Vercel 계정 상태 확인
+99
View File
@@ -0,0 +1,99 @@
name: validate
description: 도면 & 3D 모델 자동 검증 (4단계)
# 사용법: /validate [drawing]
# 또는: /validate gasiseol --full
# 또는: /validate --all (모든 도면)
parameters:
drawing:
type: string
description: 도면명 (생략하면 최근 도면)
required: false
options:
type: object
properties:
level:
type: string
enum: ["1", "2", "3", "4", "full"]
description: "검증 수준 (1=기본, 4=완전, full=모든 단계)"
default: "full"
all:
type: boolean
description: 모든 도면 검증
default: false
stages:
- name: "Level 1️⃣: 기본 파싱"
commands:
- "node src/run.mjs {{ drawing }}"
checks:
- "✓ DXF 로드 성공"
- "✓ 엔티티 수 > 0"
- "✓ 기준점 감지"
timeout: "1m"
skip_if: "level < 1"
- name: "Level 2️⃣: 기하학"
commands:
- "node src/gaps.mjs {{ drawing }}"
- "node src/build.mjs {{ drawing }} --loops"
checks:
- "✓ 뷰 폭/높이 ±2% 이내"
- "✓ 폐곡선 수 일치"
- "✓ 자기교차 0개"
timeout: "2m"
skip_if: "level < 2"
- name: "Level 3️⃣: 3D 모델"
commands:
- "node src/build.mjs {{ drawing }}"
- "node src/measure.mjs {{ drawing }} --ir"
- "node src/measure.mjs {{ drawing }}"
checks:
- "✓ 부피 오차 < 0.5%"
- "✓ manifold 체크"
- "✓ 면 무결성"
timeout: "5m"
skip_if: "level < 3"
- name: "Level 4️⃣: 시각화"
commands:
- "npm run build --prefix src/web 2>/dev/null || true"
checks:
- "✓ 웹 렌더링 성공"
- "✓ 부재 정보 표시"
- "✓ 조작 가능"
timeout: "3m"
skip_if: "level < 4"
output_format:
type: "table"
columns:
- "검증 항목"
- "상태"
- "결과"
- "참고"
success_message: |
✅ 모든 검증 통과!
상태: PASS
- Level 1 (파싱): ✓
- Level 2 (기하학): ✓
- Level 3 (3D): ✓
- Level 4 (시각화): ✓
failure_message: |
⚠️ 검증 실패
실패 항목:
{{ failed_checks }}
권장 조치:
1. 기하학 실패 → /step-5 (Research)
2. 3D 실패 → /step-6 (Pipeline)
3. 시각화 실패 → /step-7 (WebUI)