PCB Agent

KiCad 연동 PCB 배치 에이전트

1. 한눈에 보기

KiCad 프로젝트 폴더를 지정하면 회로도에서 넷리스트를 뽑아 PCB 외곽 · 레이어 · 부품 배치를 만든 .kicad_pcb 를 같은 폴더에 저장하고, KiCad 3D 렌더링과 배치 정보 · DRC 결과를 보여 줍니다. 결과가 마음에 들지 않으면 아래 터미널에서 Claude Code CLI 에게 말로 고쳐 달라고 합니다.

입력 · KiCad 프로젝트(.kicad_pro / .kicad_sch) 입력 · 외곽(프리셋 / DXF) · 레이어 수 입력 · Datasheet 폴더(선택) 입력 · 외곽 고정 홀 · 추가 사항(선택) 출력 · 배치된 .kicad_pcb 출력 · Top / 3D / Bottom 렌더 출력 · 보고서 · DRC · BOM
왜 로컬 브리지가 필요한가요? 웹 페이지는 보안상 내 PC 의 프로그램(KiCad, Claude CLI)을 직접 실행할 수 없습니다. 그래서 PC 에서 작은 Node 서버(브리지)를 켜 두고, 웹 화면은 http://127.0.0.1:8765 의 브리지에게 일을 시킵니다.

2. 구조

세 층으로 나뉩니다. 웹 화면은 어디서 열든(irodmas.com · GitHub Pages · localhost) 같은 파일이고, 실제 작업은 모두 PC 의 브리지와 KiCad 에서 일어납니다.

PCB Agent 구조: 웹 화면, 로컬 브리지, KiCad 와 Claude CLI, 프로젝트 폴더 웹 화면 web/ (index.html · guide.html · js/app.js · outline.js · board2d.js) 설정 패널 · DXF 파서(브라우저에서 외곽 계산) · Top/3D/2D 뷰 · 정보 탭 · Claude 터미널 irodmas.com/webcadagent/ · samcho93.github.io/webCadAgent/ · http://127.0.0.1:8765/ fetch (JSON) · EventSource (로그 · Claude 스트림) 로컬 브리지 server/index.js (Node, 의존성 없음, 127.0.0.1 전용) kicad.js: KiCad 찾기 · 프로젝트 스캔 · 넷리스트 · 렌더 · DRC | claude.js: claude -p 세션 Origin 허용 목록 · 작업 잠금(한 번에 하나) · 폴더 찾아보기 · 이미지/데이터시트 전달 kicad-cli sch export netlist pcb render · export svg · drc KiCad Python (pcbnew) python/pcb_agent.py 배치 엔진 · 보드 분석 Claude Code CLI claude -p --output-format stream-json (프로젝트 폴더) KiCad 프로젝트 폴더 .kicad_sch → .kicad_pcb · pcb-agent/ (job · report · overrides · render · drc · backups)

웹 화면

상태를 갖지 않는 정적 페이지. 외곽(프리셋 · DXF)은 브라우저에서 {primitives, loops} 로 계산해 보냅니다. 마지막 폴더 · 외곽 설정은 브라우저와 프로젝트의 pcb-agent/settings.json 에 기억합니다.

로컬 브리지

KiCad 설치 위치와 claude 실행 파일을 찾고, 요청마다 KiCad 도구를 실행합니다. 진행 로그와 Claude 출력은 SSE(/api/events)로 실시간 전달합니다.

Footprint Agent

별도 저장소 webFootprintAgent(FastAPI, 포트 8766). 데이터시트로 KiCad 심볼 · 풋프린트를 만드는 에이전트로, PCB Agent 브리지가 API 로 호출해 없는 풋프린트를 채웁니다.

배치 엔진

KiCad 에 들어 있는 Python 으로 실행되어 pcbnew API 로 풋프린트를 불러오고 보드를 만듭니다. 결과는 JSON 보고서로 남깁니다.

3. 배치 파이프라인

⚡ 배치 실행을 누르면 아래 순서로 진행되고, 각 단계의 진행 상황이 로그 탭에 실시간으로 찍힙니다.

  1. 웹입력 정리

    외곽 프리셋 치수 또는 DXF 를 해석해 Edge.Cuts 용 선 · 호 · 원과 닫힌 외곽 다각형(내부 컷아웃 포함)을 만듭니다.

  2. 브리지작업 파일 작성

    pcb-agent/settings.json(다음에 복원)과 job.json(엔진 입력)을 쓰고, “고정 부품 유지”를 끄면 overrides.json 을 비웁니다.

  3. kicad-cli넷리스트 추출

    sch export netlist 로 계층 회로도 전체의 부품(ref · 값 · 풋프린트 · 데이터시트 · 시트)과 넷을 얻습니다.

  4. 엔진풋프린트 로드

    pcb-agent/footprints.json 의 대체 풋프린트(Footprint Agent 가 만든 것)를 회로도 값보다 먼저 쓰고, 전역 · 프로젝트 fp-lib-table 과 ${KICAD9_FOOTPRINT_DIR} 등 경로 변수를 풀어 라이브러리에서 풋프린트를 불러오고, 패드마다 넷을 연결합니다. 없는 풋프린트는 보고서에 표시합니다.

  5. 엔진보드 · 외곽 · 레이어

    Edge.Cuts 를 그리고 동박 레이어 수를 설정합니다(4층 이상은 내층 이름 GND / PWR …).

  6. 엔진외곽 고정 홀

    직접 지정이면 크기 · 간격 · 배치대로, 자동이면 회로도의 홀 부품을 모서리에 놓거나(있을 때) 보드 크기에 맞는 홀을 새로 만들어 고정합니다. 다른 부품은 이 자리를 피해 배치됩니다. 자세히

  7. 엔진배치 참고 페이지 찾기

    시트 이름 · 파일 · 제목에 placement · replacement · 배치 · layout · floorplan 이 있으면 그 페이지의 심볼 · 부품 이름 텍스트 위치를 보드 좌표로 옮겨 “목표 위치”로 씁니다.

  8. 엔진배치

    고정 부품(overrides) → 마운팅 홀 → 커넥터(가장자리) → IC → 수동 소자 → 반복 개선. 자세한 방법은 4장.

  9. 엔진실크 정리 · 저장

    부품 이름을 겹치지 않는 옆자리로 옮기고, 임시 폴더에 저장한 뒤 프로젝트 폴더로 복사합니다(기존 파일은 backups/, .kicad_pro 는 건드리지 않음).

  10. 엔진보드 분석

    저장된 보드를 다시 읽어 크기 · 면적 · 부품 · 패드 · 넷 · 래츠네스트(MST) 길이 · 밀도 · 겹침 · 외곽 밖 부품을 report.json 에 씁니다.

  11. kicad-cli렌더링 · DRC (동시에)

    pcb render top / bottom / iso PNG, 앞면 레이어 SVG, pcb drc --schematic-parity 를 병렬로 실행합니다.

  12. 웹결과 표시

    Top 렌더, 2D 배치도(래츠네스트), 요약 카드, 부품 · 넷 · DRC 표를 그립니다.

  13. 웹추가 사항 반영 (선택)

    “추가 사항”이 있고 “배치가 끝나면 Claude 가 반영”이 켜져 있으면 그 내용을 Claude 에게 자동으로 보냅니다 → 5장의 수정 루프로 이어집니다.

“다시 분석” 버튼은 8~11 단계만 실행합니다 — KiCad 에서 직접 고친 보드를 확인할 때 씁니다.

4. 자동 배치 알고리즘

배치는 “연결된 부품끼리 가깝게, 커넥터는 가장자리에, 겹치지 않게”를 목표로 하는 그리디 배치 + 반복 개선입니다. 20개 부품 기준 1초 남짓 걸립니다.

부품 분류

  • hole — H, MH, MountingHole → 보드 모서리
  • connector — J, P, CN, USB, Connector 라이브러리 → 가장자리
  • ic — U, IC, Q, Y, Module, Package → 먼저, 크기 · 연결 순
  • passive — R, C, L, D, SW … → 연결된 부품 옆

크기

각 풋프린트의 코트야드(없으면 텍스트 제외 외곽) 상자를 0 · 90 · 180 · 270° 에서 미리 재 둡니다. 부품 사이에는 “부품 간격”, 외곽과는 “가장자리 여유”를 둡니다.

위치 비용

비용 = Σ넷 w · 거리 + 0.08 · (보드 중심까지 거리) [+ 참고 위치까지 거리]

  • 작은 넷: w = 1/(부품 수−1), 같은 넷 패드들의 무게중심까지 거리
  • 큰 넷(GND · VCC · 3V3 …, 10핀 초과): w = 0.35, 가장 가까운 IC 핀까지 거리 → 디커플링 커패시터가 IC 전원 핀 옆으로
  • 후보 위치는 연결된 부품들의 가중 중심에서 나선형으로 넓혀 가며, 들어갈 수 있는 첫 40곳 중 비용이 가장 낮은 곳
  1. 마운팅 홀을 모서리에.
  2. 주 IC를 보드 가운데에 임시로 놓습니다 — 커넥터가 IC 쪽 가장자리를 고르게 하기 위해.
  3. 커넥터: 외곽을 따라 2 × 격자 간격마다 후보를 만들고, 긴 변이 가장자리와 나란하고 결합면(패드 중심 → 몸체 중심 방향)이 바깥을 보는 회전만 허용, 가장자리에 붙여 놓습니다. 커넥터끼리는 서로 밀어냅니다.
  4. 주 IC 를 들어 올린 뒤 IC 를 크기 × 연결 수 순서로, 이어서 나머지를 “이미 놓인 부품과 연결이 많은 순서”로 놓습니다.
  5. 반복 개선(2회): 작은 부품부터 하나씩 빼서 다시 찾아보고, 비용이 줄면 옮깁니다.
  6. 못 넣은 부품은 (옵션) 뒷면, 그래도 안 되면 보드 오른쪽 밖에 나열하고 보고서의 “확인 필요”에 표시합니다.
  7. 실크: 부품 이름의 실제 글자 상자를 재서 위 · 아래 · 좌 · 우 · 세로 중 비어 있는 곳에 놓고, 자리가 없으면 Fab 레이어로 옮겨 실크 DRC 를 피합니다.

외곽 고정 홀

자동 (기본)회로도에 마운팅 홀 부품(H · MH · MountingHole)이 있으면 그 부품을 모서리에 놓습니다. 없으면 에이전트가 추가합니다: 짧은 변 30 mm 미만 M2 (Ø2.2), 60 mm 미만 M2.5 (Ø2.7), 그 이상 M3 (Ø3.2) · 킵아웃 Ø4 / 5 / 6 mm · NPTH, 외곽 → 홀 중심 간격 = 킵아웃 반지름 + 1 mm(가장자리 여유가 더 크면 그 값), 25 mm 미만 보드는 대각선 2개 · 그 외 네 모서리 4개. 짧은 변이 간격의 4배보다 작으면 넣지 않고 경고합니다.
직접 지정홀 크기(M2 ~ M5 또는 드릴 지름), 패드 · 킵아웃 지름, 외곽에서 홀 중심까지 간격, 배치(네 모서리 · 대각선 2개 · 모서리 + 긴 변 가운데 6개 · 좌표 직접 입력), 도금(PTH) 여부와 GND 연결. 빈 칸은 자동 값.
추가 안 함새 홀을 만들지 않습니다 (회로도의 홀 부품은 모서리에 배치).
  • 홀 위치는 보드 외곽 상자의 모서리(또는 변 가운데)에서 안쪽으로 걸어 들어가며 “보드 안이고 모든 외곽선 · 컷아웃에서 지정 간격 이상 떨어진” 첫 지점으로 정합니다 — 둥근 모서리 · 원형 · DXF 외곽에서도 같은 간격이 지켜집니다.
  • 추가된 홀은 보드 전용 풋프린트(H1, H2 …, BOM · 위치 파일 제외)라서 회로도와 불일치 DRC 가 나지 않습니다. 도금 홀은 GND 넷에 연결할 수 있습니다.
  • 홀은 배치 전에 고정되므로 다른 부품이 홀 킵아웃을 피해 놓입니다. Claude 가 overrides.json 에 H 위치를 적으면 그 자리를 우선합니다.
배치 참고 페이지가 있을 때 — 참고 위치가 있는 부품은 그 점에서 탐색을 시작하고 거리 비용(가중 1.0, 커넥터는 3.0)을 더하므로 디자이너가 그린 배치를 따르되, 겹침과 외곽은 엔진이 해결합니다. 페이지의 다른 글(예: “안테나는 오른쪽 가장자리”)은 Claude 에게 전달됩니다.

배선은 다음 단계 4-1. 자동 배선에서 Freerouting 으로 합니다.

4-1. 자동 배선 (Freerouting)

배치가 끝난 보드를 Freerouting 으로 자동 배선합니다. 설정 패널 ⑧ 배선의 🔀 배선 실행, 또는 배치가 끝나면 자동으로 배선을 켜 두면 배치 직후 이어서 실행됩니다.

  1. 엔진DSN 내보내기

    기존 트랙 · 비아를 지우고(“기존 트랙 유지”를 켜면 남은 연결만), 동박을 비운 보드를 기준으로 저장한 뒤 Specctra route.dsn 을 만듭니다. KiCad 9 의 DSN 내보내기가 일부 풋프린트 그림(예: Choke_Schaffner_RN102)에서 멈추는 문제가 있어, 내보내기용 사본에서만 풋프린트 그림(선 · 호 · 문자)을 빼고 패드 · 외곽 · 존만 넘깁니다.

  2. Freerouting1단계: 배선

    Java 21+ 로 Freerouting 을 창 없이 실행합니다 (최대 배선 패스). 패스마다 미배선 · 위반 수가 작업 중 표시와 로그에 나옵니다.

  3. Freerouting2단계: 최적화 (선택)

    남은 시간 안에 최적화(길이 · 비아 줄이기)를 포함해 다시 실행하고, 끝나면 그 결과를 씁니다. 시간 제한에 걸리면 1단계 결과를 그대로 씁니다 — 큰 보드는 최적화 한 패스가 몇 분씩 걸리기 때문입니다.

  4. 엔진SES 가져오기

    route.ses 를 기준 보드에 가져오고, 보드 최소 폭보다 좁은 트랙은 최소 폭으로 맞춥니다. GND 동박이 있으면 스티칭 비아(격자 + 끊어진 동박 섬마다 하나)를 넣고 동박을 채운 뒤 저장합니다 (이전 파일은 backups/).

  5. kicad-cli렌더 · DRC

    배선된 보드를 다시 렌더링하고 DRC 를 실행합니다. 요약에 트랙 수 · 길이 · 비아 · 미배선 연결 · Freerouting 시간과 패스가 표시됩니다.

필요한 것Java 21 이상(예: Adoptium, 또는 FREEROUTING_JAVA), freerouting-x.y.z.jar (webCadAgent/tools/, 옆 PCB/tools/, ~/freerouting, 다운로드 폴더에서 찾음, 또는 FREEROUTING_JAR). 브리지 시작 시 확인해 ⑧ 배선에 표시합니다.
최대 배선 패스기본 50. 미배선이 남으면 늘려 보세요.
시간 제한기본 15분. 1단계가 이 안에 끝나지 않으면 결과가 없습니다 (Freerouting 은 끝날 때만 결과를 씁니다).
중지1단계 중이면 배선 취소, 2단계(최적화) 중이면 1단계 결과로 마무리합니다.

예: ESP32-C3 보드(부품 24개) — 8패스 만에 미배선 0, 트랙 272개 · 비아 18개, Freerouting 57초. CoffeeMachine(부품 121개 · 미배선 165개) — 약 2분에 미배선 0, 최적화 1패스가 약 6분.

배치를 다시 실행하면 보드가 새로 만들어져 배선이 지워집니다. 배치를 확정한 뒤 배선하세요. 자동 배선 결과도 고속 · 전원 · 아날로그 경로는 KiCad 에서 확인 · 수정하는 것이 좋습니다.

4-2. 메탈 PCB (알루미늄 MCPCB)

설정 ④ 기판 종류에서 메탈 PCB를 고르면 단면 금속 기판 규칙으로 배치 · 배선합니다. LED · 전원 모듈처럼 열을 빼야 하는 보드에 씁니다.

옵션베이스 금속(알루미늄 · 구리) · 두께(1.0 ~ 3.0 mm) · 동박(1 ~ 3 oz) · 절연층 열전도율(1.0 ~ 3.0 W/mK) · 외곽 → 동박 최소 거리(기본 1.0 mm)
배치동박 레이어 1층(윗면)으로 고정, 부품은 윗면만(뒷면 배치 끔), 가장자리 여유는 최소 거리 이상, 고정 홀은 비도금(NPTH) — 도금 홀은 알루미늄 베이스와 닿기 때문. 스루홀 부품이 있으면 “절연 홀 가공 필요” 경고
배선B.Cu 전체를 배선 · 비아 금지 영역으로 내보내 F.Cu 만, 비아 없이 배선. GND 동박은 F.Cu 만, 스티칭 비아 없음. 단면으로 연결하지 못한 곳은 요약에 표시 — 0Ω 점퍼나 배치 · 핀 배정 변경으로 해결
보드 · 제조보드 두께 = 베이스 + 절연층(약 0.1 mm) + 동박. User.Comments 레이어에 제조 메모(베이스 · 두께 · 열전도율 · 비도금 · 가장자리 거리 · 마감), 보드 Plot 설정은 F.Cu · F.Mask · F.Paste · F.Silkscreen · Edge.Cuts 만 → 거버도 앞면 레이어만 나옵니다.

예: ESP32 보드를 메탈(알루미늄 1.5 mm · 2.0 W/mK)로 — 두께 1.635 mm, 고정 홀 비도금, 단면 배선 트랙 203개 · 비아 0, 미연결 6곳(점퍼 필요).

4-3. 제조 파일 (거버)

설정 ⑨ 📦 거버 생성은 만들어진 PCB 파일을 기준으로 브리지된 KiCad(kicad-cli)가 제조 파일을 만듭니다. PCB Agent 는 직접 파일을 만들지 않고, KiCad 가 만든 결과를 ZIP 으로 묶고 미리보기만 보여 줍니다.

거버pcb export gerbers --board-plot-params — KiCad PCB 편집기의 Plot 설정(레이어 · 옵션)을 그대로 사용. 배치 엔진이 일반 기판은 앞 · 뒤 레이어 전체, 메탈 PCB 는 앞면 레이어만 Plot 설정에 넣어 둡니다. 바꾸려면 KiCad 에서 Plot 설정을 고치면 됩니다. Gerber 작업 파일(.gbrjob) 포함
드릴pcb export drill Excellon(mm), PTH · NPTH 분리, (선택) 드릴 맵 Gerber X2
부품 위치pcb export pos CSV(mm), 양면(메탈은 앞면), DNP 제외
BOMsch export bom — 회로도 기준 KiCad BOM, 값 · 풋프린트로 묶음
결과프로젝트의 fabrication/<보드>-<시각>/ 와 같은 이름의 ZIP. ⬇ ZIP 받기, webGerber 에서 보기(samcho93.github.io/webGerber 가 브리지에서 ZIP 을 받아 실사 렌더링), 제조 미리보기 탭(앞면 · 뒷면 미러, 확대 · 이동). DRC 오류나 미배선이 있으면 경고

5. Claude 수정 루프

Claude 수정 루프: 명령, claude 실행, 보드 수정, 자동 재분석과 렌더링 터미널 명령“USB 를 아래 가장자리로” 브리지 → claude -p문맥: 경로 · 부품표 · 방법 Claude 작업overrides.json → 엔진 재실행 PCB 변경 감지분석 · 렌더 · DRC 화면 자동 갱신 → 다음 명령은 같은 세션(--resume)으로 이어짐
  • Claude 는 프로젝트 폴더를 작업 폴더로, Datasheet 폴더와 엔진 폴더를 추가 폴더로 받아 실행됩니다 (파일 수정 허용 · Bash/Read/Edit/Write 등).
  • 시스템 프롬프트로 KiCad 경로, 보드 파일, 데이터시트 매칭, 현재 부품 위치표, 수정 방법이 전달됩니다:
    1. 배치 변경: pcb-agent/overrides.json 에 {"U1": {"x":…, "y":…, "rot":90, "side":"F"}} 를 쓰고 엔진을 다시 실행 → 고정 부품 주변으로 나머지를 다시 배치
    2. 그 밖의 수정(동박 · 킵아웃 · 넷 클래스 · 텍스트 …): pcbnew Python 스크립트로 직접
    3. 외곽 · 레이어 변경: job.json 을 고쳐 다시 실행
  • 추가 사항: 설정 패널 ⑥ 에 적은 요구 사항은 배치 직후 자동으로 Claude 에게 전달되고(옵션), 이후 모든 대화의 시스템 프롬프트에 “계속 지켜야 할 조건”으로 들어갑니다. Claude 는 반영한 것과 못 한 것(이유)을 정리해 답합니다.
  • Claude 가 끝났을 때 보드 파일 수정 시각이 바뀌었으면 브리지가 자동으로 다시 분석 · 렌더링합니다.
  • 같은 프로젝트에서는 대화가 이어집니다. 새 세션으로 처음부터, ■ 중지로 작업을 멈춥니다. 비용 · 턴 수는 작업이 끝나면 표시됩니다.

5-1. Footprint Agent 연동

회로도의 Footprint 필드가 비어 있거나, 지정한 라이브러리에 풋프린트가 없으면 배치할 수 없습니다. 이런 부품은 풋프린트 탭에서 먼저 KiCad 라이브러리에서 찾고, 맞는 것이 없을 때만 webFootprintAgent 로 데이터시트에서 만듭니다.

라이브러리 우선 찾기

① 같은 이름회로도가 이 PC 에 없는 라이브러리를 가리키면, 같은 이름의 풋프린트를 다른 라이브러리에서 찾습니다 (점수 100).
② 이미 만든 부품Footprint Agent 라이브러리에 같은 부품 번호로 저장된 풋프린트가 있고 패드 수가 맞으면 프로젝트로 복사해 씁니다 (점수 95).
③ 심볼 필터심볼의 풋프린트 필터(R_*, Connector*:*_1x??_*, SOT?23*, TSSOP*3x3mm* …)에 맞고 패드 수가 핀 수와 같은 풋프린트를 설치된 KiCad 라이브러리 전체(약 1만 4천 개)에서 고릅니다. 필터가 없으면 값 · 설명의 패키지 이름(SOIC-8, TO-220 …)으로 찾습니다.
기본값수동 소자 기본 크기(0402 · 0603 · 0805 · 1206 · THT)와 커넥터 기본(핀 헤더 · 핀 소켓 2.54, JST XH 2.5, JST PH 2.0, 터미널 블록 5.08)으로 순위를 정합니다.
추천 / 확인 필요앞의 규칙으로 분명히 정해지면 추천, 아니면 확인 필요. 정격이 큰 소자(2W 저항, 275VAC · 630V 콘덴서), 부품 번호가 있는 다이오드, “Fuse Holder” 같은 값, 후보가 비슷한 부품(전해 콘덴서 · 바리스터 · TO 패키지)은 기본 크기를 그대로 쓰지 않고 확인 필요로 둡니다.

자동 채우기

  1. 추천 후보가 있으면 바로 지정합니다 (footprints.json).
  2. 후보가 불확실한데 부품 번호가 있는 부품(SS14, MOC3052, K7805 …)과 후보가 전혀 없는 부품 → Footprint Agent 로 데이터시트를 찾아 생성합니다.
  3. 후보가 불확실하고 값만 있는 부품(470uF/16V, Fuse Holder …) → 확인 필요 목록. 행의 후보 목록에서 골라 적용.
  4. 값만으로 알 수 없고 후보도 없는 부품 → 직접 지정 (부품 번호 · 패키지 힌트를 넣고 생성).

예: CoffeeMachine 프로젝트(풋프린트 없는 부품 147개)에서 자동 채우기 한 번으로 97개가 라이브러리에서 지정되었고(2초), 17건은 확인 필요, 1건(MMBT2907)은 Footprint Agent 대상이었습니다.

Footprint Agent 로 만들기

Footprint Agent 연동 흐름: 부족한 풋프린트 찾기, 생성 요청, 검증, 프로젝트 라이브러리 설치, 다시 배치 ① 부족 확인fp-lib-table 로실제 파일 존재 검사 ② 생성 요청부품 번호 · 패키지 힌트로컬 PDF / 링크 / 검색 ③ Footprint Agent추출 → IPC-7351 생성규칙 · kicad-cli · AI 검토 · 3D ④ 프로젝트 설치AgentParts.pretty.3dshapes · footprints.json ⑤ 배치새 풋프린트사용 검증 통과 → 자동 설치 · 미통과(needs_review) → 결과 확인 후 “검토 후 사용” · 실패 → 부품 번호 / 패키지 힌트 / 데이터시트를 바꿔 다시 생성

3D 모델

Footprint Agent 는 풋프린트가 완성되면 데이터시트 패키지 도면(몸체 두께 · 띄움 · 리드 모양 · 각인)으로 3D 모델(STEP)을 만들어 함께 줍니다. PCB Agent 는 설치할 때 이 파일을 프로젝트의 AgentParts.3dshapes/ 로 복사하고 풋프린트를 ${KIPRJMOD}/AgentParts.3dshapes/<풋프린트>.step 으로 연결합니다. 보드에 이미 놓인 같은 부품에도 모델을 붙이고(엔진 models 모드) 3D 렌더 · 3D 보기(GLB)를 다시 그리므로, 배치를 다시 하지 않아도 3D 뷰에서 바로 보입니다. Footprint Agent 라이브러리에서 고른 풋프린트(점수 95)도 모델 파일을 같이 복사합니다.

  1. Footprint Agent 브리지를 켭니다. webCadAgent 옆에 webFootprintAgent 를 clone 해 두면 풋프린트 탭의 시작 버튼으로 켤 수 있습니다 (또는 그 폴더에서 start.bat). 다른 위치는 FP_AGENT_DIR, 다른 주소는 FP_AGENT_URL.
  2. 프로젝트를 불러오면 풋프린트가 미지정이거나 라이브러리에 없음인 부품이 탭에 뜨고(탭 이름 옆 숫자), 같은 값 · 풋프린트의 부품은 한 줄로 묶입니다.
  3. 부품 번호(MPN 필드 → 값 순), 패키지 힌트(지정된 풋프린트 이름), 데이터시트(Datasheet 폴더에서 매칭된 PDF → 회로도의 링크 → 웹 검색)를 확인 · 수정하고 생성 (또는 자동 채우기).
  4. 진행 상황(데이터시트 확보 → 추출 → 생성 → 검증 → AI 검토)과 미리보기가 작업 카드에 표시됩니다. 통과하면 자동으로 프로젝트에 설치됩니다: <프로젝트>/AgentParts.pretty/ · AgentParts.kicad_sym, 프로젝트 fp-lib-table · sym-lib-table 에 ${KIPRJMOD} 경로로 등록, pcb-agent/footprints.json 에 {"U1": "AgentParts:…"}.
  5. 이 풋프린트로 다시 배치 를 누르면 고정 부품을 유지한 채 다시 배치합니다. 되돌리기 는 대체 풋프린트를 빼고 회로도 값으로 돌아갑니다.
  6. 결과가 확정되면 회로도에 반영 (부품 줄 · 작업 카드, 또는 매핑 모두 회로도에 반영) 을 누릅니다. 계층 회로도의 모든 시트에서 해당 레퍼런스의 심볼을 찾아 (property "Footprint" "…") 값만 AgentParts:… 로 바꾸고(나머지 서식은 그대로), 바꾼 .kicad_sch 는 먼저 pcb-agent/backups/sch-<시각>/ 에 백업한 뒤 footprints.json 에서 그 부품을 뺍니다. 이제 DRC 회로도 패리티의 footprint_symbol_mismatch 가 사라집니다. 여러 번 쓰인 시트에서 같은 심볼의 인스턴스들이 서로 다른 풋프린트로 매핑돼 있으면 바꾸지 않고 로그에 알려 줍니다. KiCad 회로도 편집기가 열려 있으면 먼저 닫으세요 (저장 시 덮어씁니다).
주의 — 회로도에 반영 전까지 대체 풋프린트는 회로도의 Footprint 필드를 바꾸지 않으므로 DRC 의 “회로도 불일치”에 표시됩니다. 자동 생성 결과는 1번 핀 위치 · 패드 번호 · 노출 패드를 데이터시트와 꼭 대조하세요.

6. 설치 · 실행

KiCad 9kicad-cli 와 번들 Python(pcbnew)을 씁니다. KiCad 8 도 배치는 되지만 3D 렌더는 9 부터 (8 에서는 레이어 SVG 로 대체)
Node.js 18+브리지 서버 (외부 패키지 없음)
Claude Code CLInpm i -g @anthropic-ai/claude-code 설치 후 터미널에서 claude 로 한 번 로그인
git clone https://github.com/samcho93/webCadAgent
cd webCadAgent
node server/index.js          # Windows: start.bat 더블클릭

브라우저가 http://127.0.0.1:8765/ 로 열립니다. irodmas.com 화면에서 쓸 때는 오른쪽 위 연결 표시가 초록색이 되는지 확인하고, 브라우저가 “로컬 네트워크 접근”을 물으면 허용합니다.

--port / PCB_AGENT_PORT포트 변경 (웹 화면 ⚙ 에서 브리지 주소도 변경)
--no-open브라우저 자동 열기 끔
KICAD_CLI · KICAD_PYTHONKiCad 를 기본 위치가 아닌 곳에 설치했을 때
CLAUDE_CLIclaude 실행 파일 경로
PCB_AGENT_ORIGINS브리지를 쓸 수 있는 웹 주소 추가 (쉼표 구분)

7. 사용법 (메뉴별)

작업 화면 배치: 왼쪽 설정, 가운데 뷰, 오른쪽 정보, 아래 Claude 터미널 머리글 — 메뉴(작업 · 구조/사용법) · 브리지 연결 상태 · ⚙ 브리지 주소 A. 설정 패널 ① 프로젝트 폴더② Datasheet 폴더③ PCB 외형 / DXF ④ 레이어 · 옵션⑤ 외곽 고정 홀⑥ 추가 사항⑦ 저장 · 배치 실행⑧ 배선 (Freerouting) B. 뷰Top 렌더 · 2D 배치도 · 3D 투시Bottom · 레이어 SVG C. 정보요약 · 부품 · 넷 · DRC회로도 · 데이터시트 · 로그 D. Claude CLI 터미널빠른 명령 칩 · 출력(도구 사용 · 결과) · 입력창 · 중지 · 새 세션

A. 설정 패널

B. 뷰

Top 렌더KiCad 3D 레이트레이싱 Top 이미지 (기본 화면). 휠: 커서 위치 확대 · 드래그: 이동 · 더블클릭: 맞춤, 오른쪽 위 + / - / ⤢ 버튼과 배율 표시
2D 배치도외곽 · 코트야드 · 패드 · 래츠네스트. 휠 확대, 빈 곳 드래그로 화면 이동, 더블클릭 맞춤, + / - / ⤢ 버튼, 부품 위에 올리면 정보, 클릭하면 부품 표에서 강조. 색: IC 진회색 · 수동 소자 갈색 · 커넥터 회청색 · 뒷면 파랑
✥ 부품 이동: 부품을 드래그해 옮기기(격자 0.1 ~ 2.54 mm 맞춤, Shift 는 격자 없이), R 또는 ⟳ 로 90° 회전, 방향키로 미세 이동. 옮긴 부품은 점선, 다른 부품과 겹치거나 보드 밖이면 빨간색. 래츠네스트는 바로 다시 계산됩니다. 적용하면 보드 파일에 쓰고(다른 부품 · 배선은 그대로, 배선된 보드면 옮긴 부품의 트랙이 끊어지니 다시 배선) overrides.json 에 고정해 다시 배치해도 유지, 렌더 · DRC 다시 실행. 취소는 화면의 변경만 되돌립니다.
3D 보기kicad-cli 로 내보낸 GLB(부품 3D 모델 · 트랙 · 패드 · 동박 · 실크 포함)를 브라우저에서 three.js 로 표시 — 드래그: 회전 · 오른쪽 드래그 / Shift+드래그: 이동 · 휠: 확대. 방향 버튼: 등각 · 윗면 · 아랫면 · 앞 · 뒤 · 왼쪽 · 오른쪽, 📷 현재 화면 PNG 저장, ↻ 다시 불러오기. 처음 열 때 GLB 를 만드느라 20초쯤 걸리고, 보드가 바뀌기 전까지는 다시 쓰입니다. (three.js 는 cdn.jsdelivr.net 에서 받습니다)
Bottom뒷면 렌더 (Top 과 같은 확대 · 이동)
레이어 SVGF.Cu · 실크 · Fab · 코트야드 · Edge.Cuts 2D 플롯 (KiCad 8 에서도 나옴, 확대 · 이동)
창 크기설정 · 뷰 · 정보 · 터미널 사이의 경계선을 드래그해 크기를 바꿉니다 (더블클릭: 기본값). 크기는 브라우저에 기억됩니다. 좁은 화면(1280 px 이하)에서는 뷰와 정보 사이 경계선이 나타나고, 휴대폰 폭에서는 위아래로 쌓입니다.

C. 정보 탭

요약보드 크기 · 면적 · 레이어 · 부품(윗면/뒷면, SMD/THT) · 패드 · 넷 · 래츠네스트 길이 · 미배선 · 겹침/외곽 밖 · DRC 위반, 부품 밀도 막대, 부품 종류, 배치 기준 · 설계 규칙 · 파일 경로 · 백업, “확인 필요” 목록, 보고서 JSON 저장
부품ref · 값 · 풋프린트 · X · Y · 회전 · 면 · 크기 · 데이터시트(📄 로컬 / 🔗 웹). 검색 · 열 정렬, 행을 누르면 2D 배치도에서 강조, BOM CSV 저장(같은 값 · 풋프린트 묶음)
넷넷별 패드 수 · 부품 수 · 래츠네스트 길이 (긴 순)
DRC위반 · 오류 · 미연결(배선 전이라 정상) · 회로도 불일치, 종류별 묶음과 예시
풋프린트Footprint Agent 연결 상태 · 시작, 수동 소자 · 커넥터 기본값, 자동 채우기(KiCad 라이브러리 → Footprint Agent), 풋프린트가 없는 부품 목록과 행마다 KiCad 라이브러리 후보 · 적용 · 생성, 생성 작업 진행 · 미리보기 · 설치 · 다시 배치 · 회로도에 반영 · 되돌리기 (5-1장)
회로도시트 계층, 배치 참고 페이지 표시, 그 페이지에서 읽은 부품 수와 메모
데이터시트부품 ↔ 파일 매칭 표, 폴더의 전체 파일 목록
로그브리지 · 엔진 · 렌더 · DRC 진행 로그 (오류는 빨강)

D. Claude CLI 터미널

프로젝트를 불러오면 입력창이 열립니다. Enter 전송, Shift+Enter 줄바꿈. 위의 칩을 누르면 자주 쓰는 명령이 입력됩니다. 출력에는 Claude 의 답(실시간), 도구 사용(⏺ 노란색), 도구 결과(회색), 완료 시 턴 수 · 비용이 표시됩니다.

명령 예
  • USB 커넥터를 아래쪽 가장자리 가운데로 옮기고 나머지를 다시 배치해줘
  • ESP32 모듈 안테나가 보드 오른쪽 가장자리 밖을 향하도록 돌리고, 안테나 아래에는 부품을 두지 마
  • C1~C5 디커플링 커패시터를 각 IC 전원 핀에서 2 mm 안으로
  • 데이터시트를 보고 레귤레이터 주변 레이아웃 권장 사항대로 배치해줘
  • 보드를 50 × 40 mm 로 줄이고 4층으로 바꿔서 다시 배치
  • 모서리에 M3 마운팅 홀 4개 추가
  • 현재 배치를 검토하고 배선이 어려워 보이는 곳을 알려줘

배치 참고 페이지 만들기

  1. 회로도에 계층 시트를 하나 추가하고 이름을 placement (또는 배치)로 정합니다.
  2. 그 페이지에 보드 모양 비율대로 사각형을 그립니다 (보드 외곽 기준, 선택).
  3. 사각형 안의 원하는 자리에 부품 이름만 적은 텍스트(J1, U2, SW1 …)를 놓습니다. 심볼을 직접 배치해도 됩니다.
  4. 지켜야 할 조건은 문장으로 적어 둡니다 (예: “안테나는 오른쪽 가장자리”) — Claude 가 읽습니다.
  5. 프로젝트를 다시 불러오면 “배치 페이지: 있음”으로 표시되고, 배치 실행 시 그 위치를 따릅니다.

8. 파일 구조

저장소 (webCadAgent)

server/
  index.js     HTTP · SSE · API · 작업 잠금 · Claude 문맥
  kicad.js     KiCad 찾기 · 스캔 · 넷리스트 · 렌더 · DRC
  claude.js    claude -p stream-json 세션
python/
  pcb_agent.py 배치 엔진 · 보드 분석 (pcbnew)
web/
  index.html   작업 화면
  guide.html   이 가이드
  js/app.js    화면 동작 · 브리지 통신
  js/outline.js 외곽 프리셋 · DXF 파서
  js/board2d.js 2D 배치도 캔버스
start.bat · package.json · README.md

프로젝트 폴더에 생기는 것

<프로젝트>.kicad_pcb   배치된 보드
AgentParts.pretty/ · .kicad_sym  Footprint Agent 가 만든 부품
fp-lib-table · sym-lib-table  (AgentParts 등록)
pcb-agent/
  settings.json  마지막 외곽 · 레이어 · 옵션 · 홀 · 추가 사항
  footprints.json 대체 풋프린트 {ref: "AgentParts:…"}
  job.json       엔진 입력 (Claude 가 재실행)
  overrides.json 고정 부품 위치
  report.json    분석 보고서
  netlist.net    추출한 넷리스트
  route.dsn · route.ses · route_base.kicad_pcb  배선 중간 파일
  board.glb      3D 보기 모델
  render_top/bottom/iso.png
  top_layers.svg · drc.json
  backups/       덮어쓰기 전 PCB

엔진만 실행하기

"C:\Program Files\KiCad\9.0\bin\python.exe" python/pcb_agent.py <프로젝트>/pcb-agent/job.json

9. 브리지 API

GET /api/status브리지 버전, KiCad · Claude 경로와 버전, 작업 중 여부
GET /api/eventsSSE — log · busy · claude(start · delta · text · tool · tool_result · result · end) · board
GET /api/fs?path=폴더 목록 (빈 값이면 드라이브 · 홈)
POST /api/project{dir} → 프로젝트 · 시트 · 부품 · 배치 페이지 · 지난 결과
POST /api/datasheets{dir, projectDir} → 파일 목록 · 부품 매칭
POST /api/place{projectDir, outline, outlineSpec, layers, placement, options, holes, requirements, pcbName, useOverrides, quality} → {report, images, drc}
POST /api/analyze{projectDir} → 현재 PCB 분석 · 렌더 · DRC
GET /api/image · /api/datasheet렌더 이미지 · 데이터시트 파일 전달 (프로젝트의 pcb-agent / 매칭된 파일만)
GET /api/fp/status · POST /api/fp/startFootprint Agent 상태 · 시작
POST /api/fp/candidates{projectDir} → 부품별 풋프린트 상태(ok · agent · missing · none), 데이터시트 후보, 진행 중 작업
POST /api/fp/apply · autofill라이브러리 풋프린트 지정 {projectDir, refs, id, copyFrom?} · 자동 채우기 {projectDir, prefs: {passiveSize, connector}, aiReview, generate} → applied · review · generating · manual
POST /api/fp/create · install · unmap생성 요청 {projectDir, refs, partNumber, packageHint, datasheetFile, datasheetUrl, aiReview} · 설치({id, force}) · 대체 해제
POST /api/fp/apply-schematic{projectDir, refs?} → footprints.json 매핑을 회로도 Footprint 필드에 쓰고(백업 후) 매핑에서 제거. {applied, skipped, backups, files}
GET /api/route/status · POST /api/route · /api/route/stopJava · Freerouting 확인, 자동 배선 {projectDir, passes, timeoutMin, optimize, stitch, keepTracks} → {report, images, drc}, 중지. 진행은 SSE route 이벤트
POST /api/fab · GET /api/fab-fileKiCad 로 제조 파일 생성 {projectDir, options: {drillMap, pos, bom}} → ZIP · 파일 목록 · 미리보기, fabrication 폴더의 파일 전달 (webGerber 가 이 주소로 ZIP 을 받음)
GET /api/glb · POST /api/move3D 보기용 GLB (보드보다 오래되면 kicad-cli 로 다시 내보냄) · 2D 배치도에서 옮긴 부품 적용 {projectDir, moves: {REF: {x, y, rot}}} → 보드 저장 · overrides 고정 · 렌더 · DRC
POST /api/open-kicadKiCad PCB 편집기로 열기
POST /api/claude · /stop · /reset수정 명령 전송(백그라운드, 결과는 SSE) · 중지 · 새 세션

브리지는 127.0.0.1 에만 열리고, 허용된 Origin(irodmas.com · samcho93.github.io · localhost · PCB_AGENT_ORIGINS)이 아닌 요청은 403 으로 거절합니다.

10. 문제 해결

“로컬 브리지에 연결할 수 없습니다”

PC 에서 node server/index.js 가 실행 중인지, 포트가 8765 인지 확인하세요. irodmas.com 에서는 브라우저의 로컬 네트워크 접근 권한을 허용해야 합니다. Safari 는 https 페이지에서 localhost 접속을 막을 수 있으니 Chrome · Edge 를 쓰거나 http://127.0.0.1:8765/ 를 직접 여세요.

“풋프린트를 찾지 못한 부품”이 있어요

회로도의 Footprint 필드가 라이브러리:이름 형식인지, 그 라이브러리가 KiCad 전역 또는 프로젝트 fp-lib-table 에 등록돼 있는지 확인하세요. 풋프린트가 비어 있는 부품은 “미지정”으로 따로 표시됩니다.

부품이 보드 밖에 나열돼 있어요

외곽 안에 다 들어가지 않은 부품입니다. 외곽을 키우거나, 부품 간격 · 가장자리 여유를 줄이거나, “뒷면 배치”를 켜세요. 요약의 부품 밀도가 60~70% 를 넘으면 배선 공간도 부족해집니다.

DXF 를 읽었는데 “닫힌 외곽선을 만들 수 없습니다”

선 끝점이 서로 맞지 않거나(틈), 치수선 · 문자 레이어가 섞인 경우입니다. 외곽 레이어만 체크하고, CAD 에서 외곽을 하나의 폴리라인으로 합치면 가장 확실합니다. 블록(INSERT)은 읽지 않으니 분해해서 저장하세요.

3D 렌더가 안 나와요

pcb render 는 KiCad 9 부터 있습니다. KiCad 8 에서는 “레이어 SVG” 탭을 보세요. 로그 탭에 실패 원인이 찍힙니다.

Claude 가 실행되지 않아요

터미널에서 claude 를 한 번 실행해 로그인했는지 확인하세요. 설치 위치가 특이하면 CLAUDE_CLI 환경 변수로 실행 파일을 지정합니다. 한 번에 하나의 명령만 실행되며, ■ 중지로 멈출 수 있습니다.

고정 홀이 들어가지 않았어요

자동 모드에서 보드 짧은 변이 홀 간격의 4배보다 작으면 넣지 않습니다(요약의 “확인 필요”에 표시). 직접 지정으로 작은 홀(M2)과 짧은 간격을 주거나 대각선 2개를 고르세요. 회로도에 이미 홀 부품이 있으면 자동 모드는 새로 만들지 않고 그 부품을 씁니다.

Footprint Agent 가 “실행 중이 아님”이에요

webFootprintAgent 폴더에서 pip install -r requirements.txt 후 python run.py 를 실행하거나, webCadAgent 옆에 clone 해 두고 풋프린트 탭의 시작을 누르세요. Claude CLI 로그인(또는 .env 의 API 키)이 필요합니다.

배선이 “시간 안에 끝나지 않아 중단”돼요

1단계(배선)가 시간 제한 안에 끝나지 않은 경우입니다. 시간 제한을 늘리거나, 부품 간격 · 보드 크기를 늘리거나, 레이어를 4층으로 바꿔 보세요. 최적화가 오래 걸리는 것은 문제가 되지 않습니다 — 끝나지 않으면 1단계 결과를 씁니다.

배치를 되돌리고 싶어요

pcb-agent/backups/ 에 덮어쓰기 전 파일이 시각별로 남아 있습니다. 원하는 파일을 프로젝트 폴더의 .kicad_pcb 로 복사한 뒤 “다시 분석”을 누르세요.

11. 개발 이력

요청 · 변경 · 검증의 자세한 기록은 저장소의 CHANGELOG.md 에 있습니다. 최신 항목이 위입니다.

2026-10-19 · 3DFootprint Agent 3D 모델(데이터시트 도면 · 각인)을 프로젝트 AgentParts.3dshapes 로 설치하고 보드의 같은 부품에 붙여 3D 뷰에 표시
2026-10-16 11:50 · c78da88메탈 PCB(단면 · 비아 없음), KiCad 로 제조 파일(거버 · 드릴 · CPL · BOM) ZIP · webGerber, 기존 PCB 먼저 불러와 수정 / 새로 선택
2026-10-16 10:45 · a717144뷰 확대 · 이동, 3D 보기(드래그 회전 · 방향 버튼), 2D 부품 이동 · 회전 → 적용, 창 크기 조정
2026-10-16 02:10 · ffabf5a배치 후 Freerouting 자동 배선 (배선 버튼 · 배치 후 자동 실행 · 2단계 최적화 · 결과 렌더/DRC)
2026-10-15 15:01 · 5414358풋프린트: KiCad 라이브러리 우선 찾기(심볼 필터 · 패드 수 · 크기/커넥터 기본값) → 없으면 Footprint Agent, 자동 채우기
2026-10-15 14:43 · 7b60ff9Footprint Agent 가 실행 중인데 “실행 중이 아님”으로 나오던 문제 수정
2026-10-15 14:36 · 30e8b92한글 경로 프로젝트에서 브리지가 꺼지던 문제(Node 24 fs.rmSync) 수정, KiCad 탐지 위치 확대
2026-10-15 14:10 · b8f2947풋프린트 탭: 대체 풋프린트를 회로도 Footprint 필드에 반영
2026-10-15 14:00 · a8cb44eFootprint Agent(webFootprintAgent) 연동 — 없는 풋프린트를 데이터시트로 생성 · 설치
2026-10-15 13:32 · 7ca34a2?project=<폴더> 로 프로젝트 바로 열기, irodmas.com 대문 카드 스크린샷
2026-10-15 13:17 · 184f652외곽 고정 홀(자동 · 직접 지정), 추가 사항(배치 후 Claude 반영)
2026-10-15 13:02 · 78d197c구조 · 사용법 가이드 메뉴
2026-10-15 12:49 · facbcb9초기 개발: 외곽(프리셋 · DXF) · 레이어 · 배치 참고 페이지 · 자동 배치 · 렌더 · DRC · Claude CLI 터미널, irodmas.com 배포

PCB Agent · github.com/samcho93/webCadAgent · MIT