TrendShift 딥다이브 · 2026-07-03 재분석

Pascal Editor 딥다이브
— 브라우저 3D 건축 편집기에서 "AI가 집을 짓는" MCP 플랫폼으로

Pascal Editor는 React Three Fiber + WebGPU로 만든 웹 3D 건축 편집기다. 벽·바닥·천장·지붕은 물론 계단·엘리베이터·굴뚝·채광창·태양광 패널·배관(HVAC/덕트/파이프)까지 44종의 건축 노드 타입을 다룬다. 2026년 3월 첫 분석 이후 가장 큰 변화는 packages/mcp — Claude Desktop·Claude Code가 자연어로 방을 만들고 가구를 배치하는 완전한 MCP(Model Context Protocol) 서버가 추가된 것이다. 여기에 IFC(국제 건축 표준) 변환기, 서드파티 플러그인 시스템(3체크박스 노드 정의 모델)까지 더해져, 단순 3D 에디터에서 "AI 에이전트가 조작하는 건축 설계 플랫폼"으로 진화했다. (저장소: pascalorg/editor · MIT · TypeScript 100% · 코어 패키지 v0.9.1 · Turborepo 10패키지 모노레포)
목차
  1. 프로젝트 한줄 요약
  2. 왜 주목받는가
  3. 기술 스택 전체 지도
  4. 아키텍처 심화 분석
  5. 디렉토리 구조 해부
  6. 학습 포인트 (기술별)
  7. 하드웨어 / 시스템 요구사항
  8. 직접 해볼 수 있는 실습 과제
  9. 관련 기술 심화 학습 로드맵
  10. 핵심 키워드 사전
  11. 참고 링크

1프로젝트 한줄 요약

이 저장소가 대체 무엇인가.

핵심 메시지

"브라우저 안의 SketchUp" + "이제는 AI가 직접 도면을 그릴 수 있는 MCP 서버"

Pascal Editor는 설치 없이 브라우저에서 집의 평면도를 그리고 3D로 확인하는 오픈소스 3D 건축 편집기다. 벽을 그으면 자동으로 모서리가 맞춰지고(mitering), 문을 배치하면 벽에 구멍이 뚫리며(CSG), 계단을 놓으면 위층 슬라브에 자동으로 개구부가 생긴다.

하지만 2026년 7월 현재 가장 중요한 변화는 packages/mcp다. README은 이를 "Model Context Protocol server for the Pascal 3D editor. Drives the @pascal-app/core scene graph from any MCP-compatible AI host."라고 설명한다 — 즉 Claude 같은 AI가 브라우저 없이 헤드리스로 씬을 조작할 수 있다. create_wall, place_item, cut_opening부터 사진 한 장으로 방을 3D로 재구성하는 photo-to-scene까지, 40개 넘는 MCP 툴이 등록돼 있다.

README의 자기소개는 짧고 명확하다: "A 3D building editor built with React Three Fiber and WebGPU." 실제로 열어 보면 Site → Building → Level → (Wall/Slab/Ceiling/Roof/Zone) → Item의 계층 구조 위에서, 각 요소가 Zod 스키마로 타입 검증되고 Zustand 스토어에 플랫 딕셔너리로 저장된다.

루트 AGENTS.md(=CLAUDE.md=GEMINI.md 심링크)는 이 레포가 "Consumed both as npm packages and (in pascalorg/private-editor) as a git submodule"라고 밝힌다 — 즉 이 공개 레포가 상용 서비스(private-editor)의 엔진 역할도 겸한다. 오픈소스 코어 위에 비공개 프로덕트를 얹는 전형적인 "오픈 코어" 전략이다.

용어
MCP (Model Context Protocol)
Anthropic이 만든 AI와 외부 도구/데이터를 연결하는 표준 프로토콜. Claude Desktop이나 Claude Code 같은 "MCP 호스트"가 stdio 또는 HTTP로 "MCP 서버"와 통신하며, 서버가 노출한 tools(함수)·resources(데이터)·prompts(템플릿)를 AI가 호출한다. Pascal Editor의 @pascal-app/mcp"3D 씬 편집"을 MCP 툴로 노출해, AI가 "침실 3평짜리 방 하나 만들어줘"라고 하면 실제로 벽 노드가 생성되게 한다.
이 프로젝트의 트레이드마크
"플랫 노드 딕셔너리 + 더티 플래그" — 웹에서 CAD급 반응성을 낸다

수백 개의 벽·문·창문·배관을 다루면서도 60fps를 유지하는 비결은 모든 노드를 Record<id, Node> 평면 딕셔너리에 저장하고, 변경된 노드만 dirtyNodes Set에 표시해 다음 프레임에서 그 노드의 지오메트리만 재계산하는 것이다. Figma·Notion류 에디터가 쓰는 패턴을 3D 씬 그래프에 적용한 사례다.

2왜 주목받는가

WebGPU 실전 적용 · MCP로 "AI가 집 짓기" · IFC 건축 표준 지원 · 서드파티 플러그인 생태계.

기존 방식의 문제
웹 3D 건축 툴 = 비공개 SaaS 또는 WebGL 시대에 머무름

Spline·SketchUp Web 같은 도구는 WebGL 기반이거나 폐쇄형 SaaS다. 오픈소스 + WebGPU + React 생태계 통합 + AI 에이전트 연동을 동시에 만족하는 3D 건축 에디터는 사실상 없었다.

3월 분석 대비 무엇이 달라졌나

영역2026-03 시점2026-07 현재
패키지 수앱 1개 + 패키지 9개앱 2개(editor + ifc-converter) + 패키지 10개(+mcp, +nodes, +plugin-trees)
노드 타입Wall/Slab/Zone/Item 등 소수44종 — 계단·엘리베이터·굴뚝·채광창·태양광판·배관(HVAC/덕트/파이프)까지
AI 연동없음packages/mcp — Claude Desktop/Code에서 자연어로 씬 조작, 사진→3D, 도면 이미지 분석
건축 표준없음packages/ifc-converter — IFC(Industry Foundation Classes) 파일 → Pascal 씬 그래프
확장성내장 기능뿐공식 Plugin 계약 — 서드파티가 노드 종류·패널을 추가(plugin-trees가 레퍼런스 구현)
아키텍처 문서README 위주wiki/architecture/ 17개 문서 — 레이어 경계, 노드 정의 3체크박스 모델, 상호작용 스코프 등
Pascal Editor의 차별점
"오픈소스 + WebGPU + MCP" 삼박자

완전 오픈소스이면서 WebGPU 렌더러를 쓰고, 건축 특화 CSG 불리언 연산(벽에 문 구멍 뚫기)Claude가 직접 부를 수 있는 40여 개의 MCP 툴을 동시에 갖춘 것이 독보적이다. "AI가 도면을 그리는" 데모가 실제로 동작하는 몇 안 되는 오픈소스 사례다.

경쟁 제품 비교

비교 항목Pascal EditorSplineSketchUp Web
오픈소스✅ MIT
WebGPU 지원❌ (WebGL)❌ (WebGL)
건축 특화 노드✅ 44종(MEP 포함)❌ (범용 3D)
AI 에이전트(MCP) 연동✅ 공식 패키지
IFC 건축 표준 호환△(플러그인)
서드파티 플러그인 계약✅ 공식 Plugin API

주목도를 끌어올린 구체적 요인은 다음과 같다. ① "AI가 집을 짓는다"는 화제성. MCP 서버 하나로 Claude가 create_room·add_door·furnish_room을 호출해 실제 3D 건물을 만드는 데모는 AI 에이전트 시대의 대표적 활용 사례가 됐다.
② Vision AI 파이프라인. analyze_floorplan_image·analyze_room_photo·photo_to_scene 툴로 스마트폰 사진 한 장을 3D 씬으로 역변환하는 기능은 실측(measurement) 도구로도 활용 가치가 크다.
③ 프로덕션급 아키텍처 문서. wiki/architecture/의 17개 문서와 .agents/skills/review-architecture/는 대규모 오픈소스 프로젝트가 AI 코딩 에이전트와 협업하는 법을 실전으로 보여준다.

3기술 스택 전체 지도

프론트엔드(R3F/WebGPU) · MCP 백엔드(Bun+SQLite) · Turborepo 10패키지 인프라.

① 프론트엔드 (UI & 렌더링)

기술버전역할
React19.2.4UI 컴포넌트 프레임워크
Next.js16.2.9SSR, 라우팅, 빌드(App Router)
Three.js0.184.03D 렌더링 엔진 (WebGPU 렌더러)
React Three Fiber9.5.0Three.js의 React 선언적 래퍼
Drei10.7.7R3F 유틸리티 컴포넌트 모음
Tailwind CSS4.2.1유틸리티 기반 CSS
Radix UI1.2.8접근성 갖춘 헤드리스 UI(Tooltip 등)

② 상태관리 & 데이터 검증

기술역할
Zustand경량 상태관리 — 스토어 계층(useScene/useViewer/useEditor) 분리
ZundoZustand 기반 Undo/Redo(50단계 히스토리, "시간 여행" 미들웨어)
Zod4.3.5 — 44종 노드 스키마의 런타임 검증. MCP 툴 입력 검증에도 재사용
IndexedDB클라이언트 영구 저장소(브라우저)

③ 3D 지오메트리 & 연산

기술역할
three-bvh-csgBVH 기반 CSG 불리언 연산 — 벽에 문/창문 구멍 뚫기, 지붕 절단
Spatial Grid Manager충돌 감지 및 배치 유효성 검사(canPlaceOnFloor/Wall/Ceiling)
mitt타입 안전 이벤트 이미터 — 노드/그리드 이벤트 버스
@dgreenheck/ez-tree플러그인(plugin-trees)의 프로시저럴 나무 지오메트리 라이브러리

④ MCP 백엔드 (packages/mcp) — 신규 축

기술역할
Bun 런타임브라우저·React·WebGPU 없이 헤드리스로 씬 그래프 조작
MCP SDKtools/resources/prompts 노출. stdio 및 HTTP(bearer token) 트랜스포트 지원
SQLite(WAL 모드)~/.pascal/data/pascal.db — 로컬 씬 저장, 트랜잭션 버전 체크로 동시 저장 충돌 방지
Server-Sent EventsMCP가 편집한 변경을 /api/scenes/:id/events로 스트리밍 → 열린 브라우저 탭에 실시간 반영(live-sync)
Vision 분석 툴analyze-floorplan-image·analyze-room-photo — 이미지를 씬 데이터로 해석

⑤ 빌드 & 개발 도구

기술버전역할
Turborepo2.9.17+10패키지 모노레포 빌드 오케스트레이션, 증분 캐시
Bun1.3.0패키지 매니저 & 런타임(packageManager 고정)
Biome2.4.16Rust 기반 Linter+Formatter(ESLint/Prettier 대체)
TypeScript6.0.3전 패키지 100% 타입 커버리지
@typescript/native-preview7.0.0-dev차세대 네이티브(tsgo) 타입체커 실험 도입
react-scan0.5.3React 렌더링 성능 시각화(dev)
설계 통찰
"같은 스키마를 UI와 AI가 함께 쓴다"

Zod로 정의한 44종 노드 스키마(packages/core/src/schema/nodes/)는 에디터 UI의 폼 검증뿐 아니라 MCP 툴의 입력 파라미터 검증에도 그대로 재사용된다. 사람이 클릭해서 만든 벽이든, Claude가 create_wall을 호출해 만든 벽이든 동일한 타입 안전성을 보장받는다 — "AI 우선 설계(AI-native)"가 사후 통합이 아니라 스키마 레이어부터 관통하는 구조다.

4아키텍처 심화 분석

3계층 레이어 경계 + 3체크박스 노드 정의 모델 + MCP↔브라우저 실시간 동기화.

Pascal Editor의 아키텍처는 AGENTS.md가 못박은 세 개의 엄격한 레이어 경계 위에 서 있다. packages/core는 Three.js를 몰라야 하고(순수 도메인 로직), packages/viewer는 에디터 개념(툴·패널·모드)을 몰라야 하며(뷰어 격리), apps/editor만 이 둘을 조합해 실제 편집 경험을 만든다. 이 경계 위에 MCP 서버가 core를 헤드리스로 직접 구동하는 네 번째 진입점이 얹혀 있다.

┌─────────────── AI 호스트 (Claude Desktop / Claude Code) ───────────────┐ │ MCP tools: create_wall · place_item · cut_opening · photo_to_scene │ └──────────────────────────────┬───────────────────────────────────────┘ │ stdio / HTTP(bearer token) ▼ ┌─────────────────────── packages/mcp (Bun, headless) ───────────────────┐ │ tools/ (40+) → operations/scene-operations.ts → @pascal-app/core │ │ storage/ SQLite(WAL) ~/.pascal/data/pascal.db ← scene_events stream │ └──────────────────────────────┬───────────────────────────────────────┘ │ SSE /api/scenes/:id/events ▼ ┌─────────────────────────── apps/editor (Next.js) ──────────────────────┐ │ Tools(Wall/Zone/Item..) SelectionMgr Panels(UI) useEditor(Zustand) │ │ ──────────────────────── Event Bus (mitt) ────────────────────────── │ ├───────────────────────── packages/viewer ───────────────────────────────┤ │ SceneRenderer → NodeRenderer (kind별 3체크박스 디스패치) │ │ geometry?(순수 함수) · renderer?(커스텀 React) · system?(useFrame) │ │ WallRenderer → useRegistry(id, 'wall', ref) │ │ useViewer(Zustand) CameraControls PostProcessing │ ├───────────────────────── packages/core ─────────────────────────────────┤ │ useScene(Zustand) nodeRegistry(44종) Zod Schema SceneRegistry │ │ nodes: Record NodeDefinition 노드별 타입 nodes: Map │ │ CRUD + dirty geometry/renderer/ 검증 byType: Set │ │ Zundo undo history system 필드 │ │ Dirty Node Tracking: updateNode() → dirtyNodes.add(id) → useFrame() │ │ → GeometrySystem 재계산 → clearDirty() │ ├───────────────────────── Three.js (WebGPU) ──────────────────────────────┤ │ WebGPURenderer → Scene → Geometry(CSG) → Materials → Screen Output │ └───────────────────────────────────────────────────────────────────────┘
용어
레이어 격리 (Layer Isolation)
packages/vieweruseEditor·에디터 툴·페인트 모드 같은 "에디터 전용 어휘"를 절대 몰라야 한다는 규칙. 덕분에 @pascal-app/viewer는 단독 npm 패키지로 배포돼, 서드파티가 에디터 기능 없이 "3D 뷰어만" 임베드할 수 있다. 위반 여부는 .agents/skills/review-architecture 스킬이 PR마다 자동 점검한다.

핵심 설계 패턴 1 — 3체크박스 노드 정의 모델

기존 분석(3월)에서는 렌더러가 하나의 방식(React 컴포넌트)으로 통일된 것처럼 보였지만, 지금은 wiki/architecture/node-definitions.md가 정의하는 독립적인 3개 필드로 세분화됐다. 노드 종류(kind)마다 필요한 조합만 켠다.

필드용도고르는 기준
geometry?순수 함수. (node, ctx, ...) => Object3D노드 데이터의 순수 함수로 메시가 결정될 때(선반·기둥·벽)
renderer?커스텀 React 컴포넌트가 메시 생성을 전담<Html>·useGLTF·인스턴싱·TSL 셰이더가 필요할 때(존, 나무)
system?프레임마다 도는 컴포넌트(useFrame, null 반환)애니메이션·투명도 전환·크로스킨드 더티 캐스케이드가 필요할 때(문 열림)
// shelf — 순수 geometry만, React·프레임 로직 없음
export const shelfDefinition: NodeDefinition<typeof ShelfNode> = {
  geometry: buildShelfGeometry,         // geometry.ts의 순수 함수
}

// door — 순수 geometry + 애니메이션 system 병행
export const doorDefinition: NodeDefinition<typeof DoorNode> = {
  geometry: buildDoorGeometry,
  system: { module: () => import('./animation') },  // operationState 진행
}

런타임에서는 <NodeRenderer>def.renderer 유무로 커스텀 컴포넌트 or <ParametricNodeRenderer>(빈 그룹 + 레지스트리 등록)를 고르고, <GeometrySystem>이 매 프레임 dirty한 노드 중 def.geometry가 있는 것만 재빌드한다. "구조/조직용 킨드(site·building·level·zone)"는 dirtyTracking: false로 이 추적에서 아예 빠진다 — 불필요한 더티 마크가 세션 내내 누적되는 걸 막기 위해서다.

핵심 설계 패턴 2 — GeometryContext로 "순수함" 지키기

geometry() 두 번째 인자 GeometryContextresolve()·children·siblings·parent만 제공한다. 벽은 ctx.siblings로 이웃 벽과 모서리를 맞대고(mitering), 문/창문은 ctx.parent로 자신이 박힌 벽의 두께를 읽어 프레임 깊이를 맞춘다. 빌더 함수 자체는 useScene import도, 스토어 mutation도 하지 않는 순수 함수로 남아 유닛 테스트가 쉽다.

핵심 설계 패턴 3 — 상호작용 스코프 (Interaction Scope, "the spine")

wiki/architecture/interaction-scope.md가 정의하는, 배치·이동·핸들 조작·박스 선택·페인트 등 모든 포인터 상호작용을 관장하는 단일 상태 머신이다. InteractionScope 유니온 타입 + begin/update/end/endIf 계약으로, "지금 무엇을 클릭하면 무슨 일이 일어나야 하는가"를 한 곳에서 판정한다. PR이 배치/이동/핸들/리셰이프/박스선택/페인트 중 하나라도 건드리면 이 문서를 반드시 읽어야 한다고 AGENTS.md가 명시한다 — 그만큼 사고(엉뚱한 클릭 처리) 위험이 큰 코어라는 뜻이다.

핵심 설계 패턴 4 — MCP ↔ 브라우저 실시간 동기화(Live Sync)

MCP와 에디터가 같은 PASCAL_DATA_DIR을 공유하면, MCP의 씬 변경이 SQLite에 저장되고 로컬 scene_events 스트림에 기록된다. 열려 있는 에디터 브라우저 탭은 /api/scenes/:id/eventsServer-Sent Events로 구독해 씬 그래프 스냅샷을 실시간 반영한다. 각 mutation은 저장 전 버전 체크를 거쳐, 브라우저와 MCP 프로세스가 동시에 저장하면 live_sync_version_conflict를 반환하고 load_scene으로 재로드하게 한다 — 낙관적 동시성 제어(optimistic concurrency)의 실전 사례다.

비유

3체크박스 모델은 "레고 부품 카탈로그"다. 어떤 부품(노드 킨드)은 순수 성형(geometry)만 필요하고, 어떤 건 조립 설명서(renderer)가 따로 있어야 하며, 어떤 건 태엽(system)이 돌아야 움직인다. 세 속성이 독립적이라 필요한 것만 골라 끼운다 — 모든 부품에 태엽을 강제하지 않는다.

설계 패턴 5 — 플랫 노드 저장 + 더티 트래킹 (기존 핵심, 여전히 유효)

모든 노드는 Record<id, Node> 평면 딕셔너리에 저장되고, parentId/children으로만 트리를 표현한다. 노드가 바뀌면 dirtyNodes Set에 추가되고, 다음 useFrame에서 그 노드만 재계산된다. Figma·Notion류 복잡한 에디터의 공통 패턴을, Pascal은 44종 건축 노드 + MCP 동시 편집까지 확장해 적용하고 있다.

// 업데이트 시 dirtyNodes에 자동 추가 (사람이든 MCP든 동일 경로)
useScene.getState().updateNode(wallId, { thickness: 0.2 })

// GeometrySystem 렌더 루프: dirty 노드 중 def.geometry 보유자만 처리
useFrame(() => {
  for (const id of dirtyNodes) {
    const group = sceneRegistry.nodes.get(id)          // O(1)
    const ctx = buildGeometryContext(id)              // siblings/parent/children
    const built = def.geometry(node, ctx, shading, textures, colorPreset, theme)
    disposeOldChildren(group); group.add(...built.children)
    clearDirty(id)
  }
})

5디렉토리 구조 해부

2개 앱 + 10개 패키지 Turborepo 모노레포 — 1,302개 TS/TSX 파일.

editor/ ├── apps/ │ ├── editor/ # Next.js 16 메인 애플리케이션 (:3002) │ │ ├── app/ # App Router │ │ ├── components/tools/ # 에디터 도구 (Wall/Zone/Item/Slab Tool) │ │ └── store/ # useEditor (Zustand) │ └── ifc-converter/ # IFC 파일 업로드 → 변환 UI (신규 분리 앱) │ ├── packages/ │ ├── core/ # @pascal-app/core v0.9.1 — 순수 로직, Three.js 금지 │ │ └── src/ │ │ ├── schema/nodes/ # 44종 Zod 스키마 (wall/stair/duct-fitting/skylight..) │ │ ├── store/ # useScene (Zustand + Zundo undo) │ │ ├── registry/ # nodeRegistry — NodeDefinition 3체크박스 등록소 │ │ ├── systems/ # wall/stair/elevator/fence 지오메트리 생성 │ │ ├── events/ # 타입 안전 이벤트 버스 (mitt) │ │ └── hooks/scene-registry/ # useRegistry — ID→Object3D 맵 │ │ │ ├── viewer/ # @pascal-app/viewer — 독립 배포 가능한 3D 캔버스 │ │ └── src/ │ │ ├── components/renderers/ # NodeRenderer, GeometrySystem │ │ └── systems/ # ceiling/column/door/roof/stair/window/zone 등 19개 │ │ │ ├── editor/ # @pascal-app/editor — 재사용 가능한 에디터 UI 컴포넌트 │ ├── nodes/ # @pascal-app/nodes — builtinPlugin (킨드별 폴더) │ │ │ ├── mcp/ # @pascal-app/mcp — MCP 서버 (신규, Bun 헤드리스) │ │ └── src/ │ │ ├── tools/ # 40+ MCP 툴: create-wall, cut-opening, export-glb.. │ │ │ ├── vision/ # analyze-floorplan-image, analyze-room-photo │ │ │ ├── photo-to-scene/ # 사진 → 3D 씬 역변환 │ │ │ ├── scene-lifecycle/# save/load/list/rename/delete-scene │ │ │ ├── templates/ # garden-house, two-bedroom, empty-studio │ │ │ └── variants/ # generate-variants (설계 변형 생성) │ │ ├── storage/ # SQLite(WAL) 드라이버, slug, 버전 체크 │ │ ├── transports/ # stdio.ts, http.ts (bearer token) │ │ └── bridge/ # scene-bridge — core 스토어를 Node 환경에서 구동 │ │ │ ├── ifc-converter/ # @pascal-app/ifc-converter — IFC→씬 순수 변환 │ ├── plugin-trees/ # @pascal-app/plugin-trees — 1st-party 플러그인 예제 │ │ └── src/ # 나무/꽃/잔디 3킨드, instanced.tsx(공용 렌더링 코어) │ ├── ui/ # @repo/ui — 공유 UI 프리미티브 │ ├── eslint-config/ typescript-config/ # 공유 린트·tsconfig │ ├── wiki/architecture/ # 17개 아키텍처 규범 문서 (레이어/시스템/플러그인 등) ├── .agents/skills/ # open-pr, review-architecture (Claude/Cursor/Codex 공유) ├── AGENTS.md ← CLAUDE.md, GEMINI.md 심링크 # 에이전트 작업 규칙 ├── turbo.json · biome.jsonc · bun.lock └── LICENSE(MIT) · README.md · CHANGELOG.md

네 덩어리로 나눠 읽으면 명료하다.

① 도메인 코어 packages/core/. Three.js를 몰라야 하는 순수 로직 레이어. 44종 노드 스키마와 nodeRegistry가 여기 있다. 이 패키지 하나가 UI(apps/editor)와 MCP(packages/mcp) 양쪽에서 동시에 소비된다 — "도메인 로직은 한 곳, 진입점은 여럿"의 실물이다.

② 독립 뷰어 packages/viewer/. 에디터 개념을 모르는 "순수 3D 캔버스"로, 그 자체로 npm 배포된다. 19개의 뷰어 시스템(ceiling·column·door·roof·stair·window·zone 등)이 각 노드 킨드의 프레임별 갱신을 맡는다.

③ MCP 서버 packages/mcp/. 이번 재분석의 핵심 신규 축. tools/ 안에 기능별로 vision(사진 분석)·photo-to-scene(역변환)·scene-lifecycle(저장/불러오기)·templates(정원 딸린 집 등 프리셋)·variants(설계 변형 자동 생성) 5개 하위 그룹이 있다. 거의 모든 툴 파일 옆에 *.test.ts가 붙어 있어 AI가 호출하는 인터페이스일수록 테스트를 촘촘히 깐다는 원칙이 보인다.

④ 위키 + 에이전트 스킬 wiki/architecture/, .agents/skills/. 사람이 아니라 AI 코딩 에이전트가 읽도록 설계된 규범 문서다. AGENTS.md가 "레이어 경계를 건드리는 변경 전에는 반드시 이 문서를 먼저 읽어라"고 명시하고, review-architecture 스킬이 PR 리뷰 시 이를 자동으로 로드해 위반 여부를 층별로 분류·보고한다.

용어
오픈 코어 (Open Core)
핵심 엔진(@pascal-app/{core,viewer,editor,mcp})을 오픈소스로 공개하고, 이를 서브모듈로 끌어와 쓰는 별도 비공개 저장소(pascalorg/private-editor)에서 상용 기능(계정·과금·협업 등으로 추정)을 얹는 사업 모델. AGENTS.md에 명시된 이 구조 덕분에, 커뮤니티 기여가 코어 엔진 품질을 직접 개선하면서도 회사는 별도 수익화 레이어를 가질 수 있다.

6학습 포인트 (기술별)

이 저장소에서 "무엇을 배울 수 있는가" — 개념 → 코드 위치 → 실습 아이디어.

학습 포인트 A

AI 에이전트용 MCP 서버를 처음부터 설계하기

packages/mcp 전체가 "도메인 로직을 AI가 호출 가능한 툴로 노출하는 법"의 실전 교과서다. tools/index.ts에서 툴이 등록되는 방식, operations/scene-operations.ts가 core 스토어를 감싸는 어댑터 계층, storage/sqlite-scene-store.ts버전 체크 기반 낙관적 동시성 제어를 함께 읽으면 "브라우저 없는 헤드리스 AI 백엔드"를 통째로 배운다.

실습: packages/mcp/src/tools/measure.ts(가장 단순한 툴 중 하나)를 읽고, 같은 패턴으로 "노드 개수를 킨드별로 세는" 새 MCP 툴을 하나 추가해 bunx pascal-mcp로 호출해 보기.

학습 포인트 B

레이어 경계를 코드가 아니라 "규칙"으로 강제하기

packages/core가 Three.js를 import하면 안 된다는 규칙은 컴파일러가 아니라 AGENTS.md + review-architecture 스킬이 지킨다. 사람/AI 리뷰어가 읽는 "헌법 문서"로 아키텍처를 통제하는 대규모 오픈소스의 실전 운영 방식을 배운다.

실습: wiki/architecture/viewer-isolation.md를 읽고, packages/viewer 소스에서 실제로 useEditor나 에디터 전용 개념을 import하는 곳이 있는지 grep으로 검증(없어야 정상).

학습 포인트 C

3체크박스 노드 정의 — "필요한 능력만 조합"하는 레지스트리 패턴

geometry/renderer/system 세 필드를 독립적으로 켜고 끄는 NodeDefinition 모델은, 조건 분기 대신 "필드 존재 여부 = 참여 여부"로 다형성을 표현한다. 44종의 서로 다른 건축 요소를 하나의 통일된 등록 인터페이스로 다루는 법을 배운다.

실습: packages/nodes/src/shelf/(geometry만)와 packages/plugin-trees/src/(system+renderer)를 나란히 열어, 같은 NodeDefinition 타입이 어떻게 다르게 채워지는지 비교.

학습 포인트 D

서드파티 플러그인 API 설계 — "1st-party 예제로 계약을 증명"

plugin-trees"structurally identical to a third-party plugin" — 내부 전용 API를 전혀 쓰지 않고 @pascal-app/*를 peer-dependency로만 소비한다. 플러그인 작성자에게 신뢰를 주는 가장 확실한 방법은, 자사 팀도 같은 제약 안에서 만든 예제를 공개하는 것이라는 통찰을 얻는다.

실습: wiki/architecture/plugin-authoring.mdPlugin 계약을 읽고, plugin-trees/src/index.ts가 그 계약의 어떤 필드를 채우는지 대조.

학습 포인트 E

낙관적 동시성 제어 (Optimistic Concurrency) 실전

브라우저 탭과 MCP 프로세스가 같은 씬을 동시에 편집할 수 있는 상황에서, Pascal은 락(lock) 대신 저장 시 버전을 체크하고 충돌하면 실패시키는(live_sync_version_conflict) 전략을 택했다. 분산 상태 동기화의 실무 트레이드오프를 실제 코드로 확인할 수 있다.

실습: packages/mcp/src/storage/sqlite-scene-store.ts의 저장 함수에서 버전 비교 로직을 찾아, 같은 씬을 두 클라이언트가 동시에 저장하면 무슨 값이 반환되는지 추적.

학습 포인트 F

IFC(건축 표준) 파싱 — CAD 상호운용성의 첫걸음

packages/ifc-converterUint8Array의 IFC 바이트를 받아 Pascal의 노드/루트ID/통계로 변환하는 순수 함수 라이브러리다(DOM·React 의존 없음). 실무 CAD/BIM 파일 포맷을 다루는 첫 진입점으로 삼기 좋다.

실습: IFC 샘플 파일(공개 IFC 예제 파일 검색)을 apps/ifc-converter UI에 업로드해, 변환된 노드 수와 원본 IFC 엔티티 수를 비교.

7하드웨어 / 시스템 요구사항

WebGPU 지원 브라우저 필수 · MCP 서버는 Bun만 있으면 헤드리스로 별도 구동.

구성요소최소 요구사항권장 사항
브라우저(에디터 UI)Chrome 113+ / Edge 113+ (WebGPU 지원)Chrome 최신 안정판
GPUWebGPU 지원 GPU전용 GPU(NVIDIA/AMD), 복잡한 건물일수록 유리
Node.js18+ (engines.node 명시)20+
Bun1.3.0 (packageManager 고정)동일 버전 유지 권장
RAM8GB16GB(다층 건물 + 다수 MEP 노드 편집 시)
MCP 서버(헤드리스)Bun만 있으면 브라우저·GPU 불필요에디터와 별도 터미널/프로세스로 상시 구동
MCP 저장소로컬 SQLite 파일(~/.pascal/data/pascal.db)PASCAL_DATA_DIR로 에디터와 경로 공유 시 Live Sync 활성화
OSmacOS, Windows, Linux
진입 관점
"에디터는 GPU가 필요하지만, MCP 서버는 노트북 CPU만으로 충분"

브라우저 3D 에디터를 직접 만져보려면 WebGPU GPU가 필요하지만, AI가 도면을 짜는 워크플로만 체험하고 싶다면 bunx pascal-mcp --stdio 하나로 충분하다. Claude Desktop 설정 파일에 서버를 등록하면 그래픽 환경 없이도 "AI에게 집을 설계시키는" 경험을 할 수 있다.

현실적 주의
Firefox/Safari는 아직 WebGPU 실험 단계

WebGPU는 Chrome/Edge에서 기본 활성화됐지만 Firefox·Safari는 여전히 플래그 뒤에 있거나 부분 지원이다. 또한 bun dev는 반드시 루트 디렉토리에서 실행해야 packages/core·packages/viewer의 워처가 함께 돌아 핫 리로드가 동작한다 — 개별 앱 폴더에서 실행하면 패키지 변경이 반영되지 않는다.

8직접 해볼 수 있는 실습 과제

난이도별로 손을 움직여 보는 5가지 — 3D 에디터부터 MCP AI 연동까지.

입문 ★☆☆☆☆

과제 1 — 로컬 실행 + 44종 노드 훑어보기

git clone https://github.com/pascalorg/editor.git
cd editor
bun install
bun dev
# http://localhost:3002 에서 에디터 열기

벽·바닥·계단·지붕을 그려 보고, packages/core/src/schema/nodes/ 폴더의 44개 파일 목록만 훑어보며 이 에디터가 얼마나 광범위한 건축 요소(굴뚝·태양광판·덕트·엘리베이터)를 다루는지 체감한다.

중급 ★★☆☆☆

과제 2 — Claude Code에 Pascal MCP 서버 연결하기

# 리포 루트에서
bun run --filter=@pascal-app/mcp build
claude mcp add pascal bun /absolute/path/to/editor/packages/mcp/dist/bin/pascal-mcp.js

Claude Code 세션에서 "정원 딸린 작은 집 하나 만들어줘"처럼 자연어로 요청해, create_room·add_door·furnish_room 같은 MCP 툴이 실제로 호출되는 과정을 관찰한다. 같은 PASCAL_DATA_DIR로 에디터를 함께 띄우면 브라우저에 실시간 반영되는 Live Sync도 확인 가능.

과제 3 — 커스텀 노드 타입 추가 (3체크박스 실습)

packages/nodes/src/에 새 킨드(예: column과 유사한 "beam" 기둥보)를 추가하되, geometry만 채우는 가장 단순한 조합으로 시작한다. Zod 스키마 → nodeRegistry 등록 → 에디터 툴바에서 배치까지 전체 흐름을 경험한다.

고급 ★★★☆☆

과제 4 — 사진 한 장으로 방 재구성 (Vision MCP 파이프라인)

packages/mcp/src/tools/vision/analyze-room-photo.tsphoto-to-scene/을 읽고, 실제 방 사진을 MCP 클라이언트로 전달해 벽 위치·문/창문 추정 결과가 씬 노드로 변환되는지 확인한다. 결과의 정확도 한계(원근 왜곡, 가려진 벽)를 기록해 보는 것도 좋은 학습이다.

과제 5 — 서드파티 플러그인 직접 만들기 (plugin-trees 복제)

packages/plugin-trees를 통째로 복사해 packages/plugin-fences(또는 다른 조경 요소)로 리네이밍하고, wiki/architecture/plugin-authoring.mdPlugin 계약(panels·parametrics·tool/preview)을 따라 좌측 프리셋 패널까지 갖춘 완전한 플러그인을 만든다. 인스턴스 렌더링(instanced.tsx 패턴)을 재사용해 N개 배치 시 드로우콜이 적게 유지되는지 성능을 확인하면 심화 과제가 된다.

9관련 기술 심화 학습 로드맵

5주 코스 — R3F/WebGPU 기초부터 MCP 서버 직접 만들기까지.

1주차: React Three Fiber + WebGPU 기초 Three.js 핵심 개념(Scene/Camera/Renderer/Mesh/Geometry/Material) R3F 공식 튜토리얼 완주(r3f.docs.pmnd.rs) + useFrame/useThree 훅 Three.js WebGPURenderer 초기화, WebGL fallback 처리 실습 실습: 벽 하나 그려지는 과정을 WallRenderer→WallSystem까지 추적 2주차: Zustand 다중 스토어 + 3체크박스 레지스트리 useScene/useViewer/useEditor 3계층 분리 이유 이해 Zundo로 Undo/Redo 50단계 구현 원리 wiki/architecture/node-definitions.md 정독 실습: geometry-only 노드 하나를 직접 등록 3주차: CSG 지오메트리 + 공간 자료구조 CSG 불리언 연산(Union/Subtraction/Intersection) 이론 three-bvh-csg + BVH 자료구조로 성능이 좋아지는 원리 Spatial Grid Manager로 배치 유효성 검사하는 법 실습: 벽에 창문 배치 시 CSG cutout이 생기는 코드 경로 추적 4주차: MCP 서버 아키텍처 Model Context Protocol 스펙(tools/resources/prompts) 이해 packages/mcp의 tools/ → operations/ → core 어댑터 계층 정독 SQLite WAL 모드 + 낙관적 동시성 제어(버전 체크) 실습 실습: 자체 MCP 툴 하나 추가해 Claude Desktop에 연결 5주차: 플러그인 생태계 + 프로덕션 운영 wiki/architecture/plugin-authoring.md의 Plugin 계약 정독 plugin-trees를 레퍼런스로 나만의 플러그인 완성 .agents/skills/review-architecture로 아키텍처 리뷰 자동화 체험 IFC 변환기로 실제 CAD 파일 상호운용성 실습
곁들이면 좋은 배경 지식
MCP 생태계 · BIM/IFC · 게임 엔진 패턴

Pascal Editor는 세 분야가 교차한다. MCP(Anthropic의 AI 도구 연동 표준), BIM/IFC(건축 정보 모델링 업계 표준 — Revit·ArchiCAD와의 상호운용성), 그리고 게임 엔진 패턴(더티 플래그·씬 레지스트리·ECS와 유사한 시스템 분리). 이 셋을 동시에 다루는 오픈소스는 드물어, 각 분야를 따로 공부하되 이 레포를 "교차점 사례"로 삼으면 이해가 빠르다.

10핵심 키워드 사전

이 프로젝트를 읽을 때 반복 등장하는 용어 정리.

키워드
MCP (Model Context Protocol)AI 호스트(Claude 등)와 외부 도구/데이터를 연결하는 Anthropic 표준 프로토콜
NodeDefinition (3체크박스 모델)geometry/renderer/system 3개 독립 필드로 노드 킨드의 렌더링 방식을 조합하는 등록 모델
Dirty Node / Dirty Flag변경된 노드만 표시해 다음 프레임에 그 노드만 재계산하는 최적화 패턴
Scene Registry노드 ID → Three.js Object3D 매핑. 선언적 React와 명령적 Three.js 사이의 브릿지
GeometryContextgeometry() 빌더가 받는 읽기 전용 씬 접근 객체(resolve/children/siblings/parent)
Interaction Scope ("the spine")배치·이동·핸들·박스선택·페인트를 관장하는 단일 상호작용 상태 머신
Layer Isolationcore는 Three.js를, viewer는 에디터 개념을 몰라야 한다는 아키텍처 경계 규칙
Live SyncMCP의 씬 변경을 SSE로 스트리밍해 열린 브라우저 탭에 실시간 반영하는 메커니즘
Optimistic Concurrency락 대신 저장 시 버전 체크로 동시 편집 충돌을 감지하는 방식(live_sync_version_conflict)
CSG (Constructive Solid Geometry)불리언 연산(합/차/교)으로 복잡한 형태를 만드는 기법. 벽에 문 구멍 뚫기에 사용
BVHBounding Volume Hierarchy. 공간을 계층적으로 분할해 CSG·충돌·레이캐스팅을 가속
IFC (Industry Foundation Classes)건축/BIM 업계 표준 파일 포맷. Revit·ArchiCAD 등과의 상호운용성 핵심
Open Core엔진은 오픈소스로 공개하고 비공개 서브모듈 레포에서 상용 기능을 얹는 사업 모델
Plugin (Manifest)서드파티가 노드 킨드·좌측 패널을 추가하는 공식 계약. 1st-party 예제는 plugin-trees
WebGPUWebGL 차세대 표준. GPU 컴퓨트 셰이더, 멀티스레드 렌더링, 낮은 API 오버헤드
ZundoZustand용 Undo/Redo 미들웨어(50단계 히스토리)
Turborepo변경된 패키지만 증분 재빌드하는 모노레포 빌드 오케스트레이터

11참고 링크

원본을 직접 확인하고 싶을 때.