AI가 배선도·코드·디버깅까지 돕는 임베디드 IDEaily-blockly는 크게 세 덩어리로 이뤄진다. 첫째는 비주얼 블록 에디터 — 레고처럼 블록을 끼워 프로그램을 만들면, 그게 아두이노용 C++(.ino)나 MicroPython 코드로 자동 변환된다. 둘째는 하드웨어 실행 계층 — 그 코드를 실제 보드에 맞춰 컴파일하고, 시리얼·BLE·무선(OTA)으로 업로드한다. 셋째는 AI 에이전트 — "온습도 센서로 팬을 제어하고 싶어" 같은 자연어 요구를 받아 보드·모듈·라이브러리를 추천하고, 배선도를 그리고, 블록/코드를 짜고, 컴파일 에러 로그를 읽어 고쳐준다.
핵심 발상은 "블록 코딩의 쉬움과 전문 임베디드 개발의 깊이를 한 화면에서 잇는 것"이다. 초보자는 블록만 만져도 되고, 숙련자는 생성된 .ino를 열어 직접 손댈 수 있으며, 그 둘은 소스맵(block-source-map)으로 연결돼 "이 블록이 코드 몇 번째 줄이 되는지"까지 추적된다.
보통 아두이노 개발은 이렇다 — 보드에 맞는 툴체인을 깔고, 라이브러리를 찾아 넣고, C++로 코드를 쓰고, 안 되면 에러 메시지를 구글링한다. 진입장벽이 높다.
aily-blockly는 이 과정을 뒤집는다. 보드를 목록에서 고르기만 하면 필요한 컴파일러·라이브러리가 프로젝트에 딸려 오고, 블록을 끼우면 코드가 생기며, 막히면 AI가 배선도와 수정안을 내놓는다. "설정"이라는 벽을 걷어내고, 만들고 싶은 것에만 집중하게 하는 게 목표다.
블록과 생성 코드의 대응은 이렇게 눈에 보인다. 블록 하나하나가 코드의 특정 줄로 매핑되고, 그 매핑이 디버깅의 근거가 된다.
블록(비주얼) 생성 코드 (.ino / C++)
──────────────────────────────────────────────────────
[setup 안에서] → void setup() {
[핀 13을 출력으로] → pinMode(13, OUTPUT);
[loop 안에서] → void loop() {
[핀 13 = 켬(HIGH)] → digitalWrite(13, HIGH);
[1000ms 기다리기] → delay(1000);
[핀 13 = 끔(LOW)] → digitalWrite(13, LOW);
[1000ms 기다리기] → delay(1000);
} // ← 각 블록의 코드 줄 범위가 소스맵에 기록됨
스스로 alpha 단계(v0.9.72)임을 밝히고 있어 양산용 펌웨어보다는 프로토타이핑·교육·메이커 용도를 겨냥한다. 그럼에도 규모는 작지 않다 — 렌더러(Angular) 소스만 30만 줄대, Electron(Node) 계층 4만 줄대의 대형 프로젝트다.
비슷한 블록 코딩 툴(Scratch 계열, mBlock, Arduino의 예전 Blockly 실험)은 많았지만, aily-blockly가 TrendShift 1위에 오른 건 네 가지가 동시에 겹쳤기 때문이다.
대부분의 블록 툴은 초보용 장난감에서 끝난다. 생성된 코드는 숨겨져 있거나 조잡하다. aily-blockly는 반대로 블록 ↔ 생성 코드 ↔ 소스레벨 디버깅을 한 줄로 잇는다. 블록으로 만든 프로그램의 각 블록이 최종 코드의 어느 줄인지(block-source-map) 추적되므로, 블록을 만지다가 그대로 .ino를 열어 전문 개발로 넘어갈 수 있다. "배우다가 버리는 도구"가 아니라 "계속 쓰는 도구"를 지향한다.
단순 코드 자동완성이 아니라, 프로젝트 분석 → 보드·모듈 추천 → 배선도 생성 → 코드 작성 → 컴파일 에러 분석 → 디버깅까지 전 과정을 도구를 쥔 에이전트가 수행한다. 내부 엔진 aily-lex(LEX)는 별도 프로세스에서 격리 실행되며, MCP(Model Context Protocol)·AI Skills(SKILL.md)·서브에이전트·명령 보안 검증까지 갖춰 사실상 하드웨어 특화 코딩 에이전트다. README도 이 설계가 Kode(shareAI-lab)와 microsoft/vscode-copilot-chat을 참고했다고 밝힌다.
ESP32·STM32·아두이노(AVR)·RP2040·nRF5x·Renesas·MicroPython까지 100종 이상 보드/칩을 지원하는데, 그 방식이 영리하다. 모든 보드가 하나의 npm 패키지(@aily-project/board-*)이고, 라이브러리·컴파일러도 마찬가지다. 보드를 고르면 필요한 패키지가 프로젝트로 설치돼, 툴체인 세팅이라는 고전적 고통이 사라진다.
외부 CLI(esptool, arduino-cli) 없이 WebSerial(esptool-js)로 ESP를 직접 굽고, Web Bluetooth로 BLE OTA, mDNS로 무선 네트워크 OTA까지 한다. 컴파일도 arduino-cli를 직접 부르지 않고 자체 도구 aily-builder(+ 전처리 캐시)로 감싸 대기 시간을 줄인다("Lightning Compilation").
| 도구 | 강점 | aily-blockly와의 차이 |
|---|---|---|
| Arduino IDE | 표준·안정, 방대한 생태계 | 텍스트 코드만. 툴체인/라이브러리 설정 수동, AI·블록·소스맵 없음 |
| PlatformIO | 다중 보드·전문 빌드 | 전문가용 설정 중심. 비주얼 블록·내장 에이전트 없음 |
| Scratch / mBlock | 교육용 블록 코딩 | 초보 장난감에서 끝남. "진짜 코드"로의 연속성·전문 확장 약함 |
| Cursor + Arduino | 강력한 코드 에이전트 | 하드웨어 인식(보드 파라미터·배선·플래싱)이 IDE에 통합돼 있지 않음 |
| aily-blockly | 블록+프로코드+AI+하드웨어 | 블록↔코드↔소스맵 연속성 + 내장 에이전트 + npm 보드 생태계 + 브라우저 플래싱 |
데스크톱 셸은 Electron 35(Tauri 아님), UI는 Angular 19 + ng-zorro-antd(Ant Design) 컴포넌트다. 코드 에디터는 Monaco, 터미널은 xterm + node-pty를 쓴다. 스택은 "데스크톱/UI 층", "AI 에이전트 층", "하드웨어 실행 층" 세 겹으로 나뉜다. 가장 특징적인 건, 보드·라이브러리·컴파일러·SDK가 전부 @aily-project/ 스코프의 npm 패키지로 쪼개져 semver로 버전 관리된다는 점이다.
| 패키지 / 버전 | 역할 |
|---|---|
| electron ^35.0.2 | 데스크톱 셸. 메인 프로세스가 파일·시리얼·빌드·업데이트를 관장. electron-builder ^25 / electron-updater / electron-log 동반. |
| @angular/* ^19.0.0 | 렌더러 SPA 프레임워크. standalone 컴포넌트 + lazy loadComponent 라우팅. |
| ng-zorro-antd ^19.0.1 | Ant Design 기반 UI 컴포넌트 킷(다이얼로그·트리·폼 등). |
| blockly (npm:aily-project-blockly ^1.0.2) | 표준 Blockly가 아니라 포크를 blockly 별칭으로 사용. 커스텀 렌더러/필드/플러그인 탑재. |
| monaco-editor ^0.52 · @xterm/xterm ^5.5 | 코드 에디터 + 터미널. 터미널 백엔드는 @lydell/node-pty. |
| mermaid ^11.9 · marked ^15 · shiki ^3.5 | 배선도/구조도 다이어그램, 마크다운/코드 하이라이트(AI 대화·문서 렌더). |
| 패키지 / 요소 | 역할 |
|---|---|
| aily-lex ^1.0.6 | 에이전트 엔진(LEX). 대화·계획·도구 호출 루프의 심장. 별도 프로세스에서 격리 실행. |
| @modelcontextprotocol/sdk ^1.25 | MCP 클라이언트/서버. 외부 도구·데이터 소스를 표준 프로토콜로 연결. |
| js-tiktoken · @orama/orama | 토큰 카운트(예산 관리) + 로컬 전문검색 인덱스(코드/문서 검색). |
| 멀티 프로바이더(BYOK) | claude/anthropic · openai(gpt-4/o1/o3) · deepseek · qwen · moonshot(kimi) · openrouter — chatLanguageModels.json에 사용자 키로 설정. |
AI Skills (public/skills/*/SKILL.md) | YAML frontmatter + 워크플로 마크다운. blockly-project-planning · abs-syntax-reference 등. Claude Agent Skills 패턴. |
에이전트 도구 40+ (tools/aily-chat/tools/) | editBlockTool · switchBoardTool · buildProjectTool · getBoardParametersTool · connectionGraphTool 등. |
| 패키지 / 요소 | 역할 |
|---|---|
| aily-builder (자체, 번들 1.2.4) | arduino-cli/PlatformIO를 직접 쓰지 않고 감싼 자체 고속 컴파일 도구. 전처리 결과 캐시로 재빌드 단축. |
| serialport ^13 | 시리얼 통신(모니터/플로터/업로드). Electron 계층에 네이티브로 설치. |
| esptool-js ^0.6 | 브라우저 WebSerial로 ESP32 계열을 직접 플래싱(외부 esptool 불필요). |
| electron/ble.js + Web Bluetooth | BLE OTA 무선 펌웨어 업데이트(참고: BLEOTA). |
| network-ota-*.js (mDNS) | 네트워크에서 기기를 찾아 무선 업로드(참고: ESPConnect). |
| probe-rs 0.31 | DAPLink/CMSIS-DAP/SWD 디버거 연동(electron/probe-rs.js). |
세 층의 공통 철학은 "웹 기술로 하드웨어를 다룬다"이다. UI는 Angular, 플래싱은 WebSerial/Web Bluetooth, 확장은 npm, 에이전트는 MCP — 임베디드 개발의 무거운 네이티브 툴체인을 최대한 브라우저·Node 생태계로 끌어와, 설치 부담을 줄이고 크로스 플랫폼(Win/mac/Linux)으로 만든다. 무거운 컴파일러만 필요할 때 7z로 압축돼 내려받아진다.
aily-blockly는 Electron의 3-프로세스 구조를 넘어, AI 에이전트를 별도 프로세스로 한 겹 더 격리한 게 특징이다. 전체 그림은 이렇다.
에이전트 엔진(LEX)은 렌더러도 메인도 아닌 별도의 utilityProcess에서 돈다 — AI가 무거운 작업이나 무한 루프에 빠져도 UI(렌더러)나 시스템(메인)이 얼어붙지 않도록 프로세스 경계로 갈라 둔 것이다. chat-runtime-host.js가 이 프로세스를 utilityProcess.fork로 띄우고, HOST_COMMAND·RESOURCE_HANDLER 같은 IPC 채널로만 통신한다. 명령 실행은 command-security.service.ts가 검증하고, 토큰 예산은 tiktoken으로 관리하며, 서브에이전트·반복 감지(repetition-detection)까지 있는 본격 에이전트 런타임이다.
블록을 코드로 바꾸는 생성기는 둘이다. ArduinoGenerator(C++/.ino)와 MicroPythonGenerator(Python). 둘 다 Blockly.CodeGenerator를 상속하고, 프로젝트의 devmode(arduino | micropython)로 갈린다. 흥미로운 건 라이브러리가 제공하는 생성기 코드를 신뢰하지 않고 iframe realm 안에서 실행한다는 점이다(blockly-generator-runtime.service.ts). 외부 라이브러리의 generator.js가 타이머·전역을 오염시켜도 iframe을 교체해 원복한다 — 플러그인을 안전하게 실행하는 샌드박스 패턴이다.
생성 결과에는 어느 블록이 코드의 어느 섹션(macros/libraries/variables/objects/functions/setups/loops/body)에 무슨 코드를 기여했는지 + 최종 코드의 행 범위가 함께 기록된다. 특히 실행 가능한 줄(executableLineRanges, GDB가 멈출 수 있는 지점)과 선언·include 줄(supportLineRanges)을 구분한다. 덕분에 블록으로 짠 프로그램도 "이 블록에 브레이크포인트"처럼 소스레벨로 디버깅할 수 있다.
컴파일은 child/scripts/compile.js가 담당한다. 흐름은 이렇다.
1) 블록 생성 코드를 <proj>/.temp/sketch/sketch.ino 로 기록
+ block-source-map을 .build/aily-block-source-map.json 에 저장
2) <proj>/node_modules/<boardModule>/board.json 을 읽어
compilerParam(예: -b esp32:esp32:XIAO_ESP32S3 )에서 보드 타입 파싱
3) aily-builder compile "<src>" --board "<type>" \
--build-path ... --preprocess-result ... \
--emit-artifact-manifest ...
→ 전처리 결과(preprocess.json) 캐시를 재사용해 재빌드 시간 단축
즉 arduino-cli/PlatformIO를 직접 부르는 대신 자체 빌더로 감싸, 캐시·아티팩트 매니페스트·그래프 의미 리비전(SHA-256) 같은 최적화를 얹는다. 이게 README가 말하는 "Lightning Compilation"의 실체다.
| 경로 | 기술 | 대상 |
|---|---|---|
| 시리얼 업로드 | serialport(upload.js) | 일반 MCU(AVR/STM32 등) |
| ESP 직접 플래싱 | esptool-js + WebSerial | ESP32/ESP8266(외부 툴 불필요) |
| BLE OTA | Web Bluetooth(ble.js) | BLE 지원 보드 무선 업데이트 |
| 네트워크 OTA | mDNS 검색 + 업로드 | Wi-Fi 기기 무선 업데이트 |
| 디버그 | probe-rs(SWD/DAPLink) | 하드웨어 디버깅 |
메인 프로세스는 BrowserWindow를 nodeIntegration: true + preload로 띄운다. 이는 렌더러에서 Node API에 직접 접근할 수 있다는 뜻으로, 요즘 Electron 보안 권장(컨텍스트 격리 + nodeIntegration: false)과는 반대 방향이다. 로컬 개발 도구라 위험도는 제한적이고 저장소에 docs/aily-security-guidelines.md도 있지만, 이 코드를 보안 학습의 반면교사로 읽을 때 눈여겨볼 지점이다. 신뢰할 수 없는 원격 콘텐츠를 렌더러에 절대 로드하지 않는 것이 전제다.
구조가 곧 설계 의도다. "Node로 하드웨어·빌드를 다루는 쪽"(electron/·child/)과 "UI·에디터·에이전트를 그리는 쪽"(src/)이 프로세스 경계로 갈려 있다. 하드웨어와 대화하는 무거운 일은 전부 electron/·child/에 있고, 사용자가 보는 모든 화면과 로직은 src/app/에 있다. 새 보드·라이브러리·컴파일러는 코드 수정이 아니라 npm 패키지 추가로 확장되므로, 이 저장소 자체는 "플랫폼"이고 하드웨어 지원은 "데이터"에 가깝다.
SKILL.md들은 사람이 아니라 에이전트가 읽는 워크플로 문서다. blockly-project-planning(프로젝트 계획법), abs-syntax-reference(블록 텍스트 문법), library-migration-guide(라이브러리를 블록으로 변환하는 법) 등. 에이전트에게 "이 IDE에서 일 잘하는 법"을 문서로 주입하는 Claude Agent Skills 패턴이다.aily-blockly는 "데스크톱 앱 + 비주얼 프로그래밍 + 임베디드 + AI 에이전트"가 한 저장소에 겹쳐 있어, 각 계층이 그대로 교재가 된다.
메인/렌더러/preload의 기본 3-프로세스에, utilityProcess로 무거운 작업을 격리하는 실전 패턴을 볼 수 있다. IPC 채널 설계, contextBridge로 안전하게 API를 노출하는 법, 그리고 "왜 AI 런타임을 별도 프로세스로 빼야 하는가"라는 판단의 근거를 코드로 배운다.
표준 Blockly를 포크해 커스텀 렌더러(aily-thrasos/zelos/icon), 커스텀 필드(LED 패턴·매트릭스·오디오), 플러그인(continuous-toolbox·multiselect·toolbox-search)을 얹었다. "블록을 코드로 바꾸는 생성기(CodeGenerator)"를 두 언어(C++/Python)로 구현한 사례라, Blockly를 장난감 이상으로 쓰는 법을 배운다.
보드·라이브러리·컴파일러·SDK를 전부 @aily-project/ 스코프 npm 패키지로 쪼개고, 프로젝트를 그 패키지들에 의존하는 하나의 npm 프로젝트로 만든 것이 이 저장소의 지적 핵심이다. 덕분에 보드 지원은 semver로 버전 관리되고, 프로젝트마다 격리되며(재현성), 커뮤니티가 패키지만 올리면 확장된다. "플랫폼과 콘텐츠를 분리"하는 설계 감각을 실물로 익힌다.
비주얼 표현(블록)을 텍스트 코드로 낮추면서 양방향 추적성(소스맵)을 유지하는 법은 컴파일러·트랜스파일러의 핵심 주제다. aily-blockly의 block-source-map은 "고수준 표현 ↔ 저수준 코드"를 잇는 실전 예제다.
도구(tool) 40여 개, MCP 연결, Skills 주입, 서브에이전트, 명령 보안 검증, 토큰 예산, 반복 감지 — "데모"가 아니라 "제품" 수준의 에이전트가 어떻게 구성되는지 통째로 볼 수 있다. 특히 도메인(하드웨어)에 특화된 도구(getBoardParametersTool·connectionGraphTool)를 어떻게 설계하는지가 값지다.
WebSerial(esptool-js)과 Web Bluetooth(BLE OTA)로 물리 장치와 통신하는 코드는 흔치 않은 학습 자료다. "웹이 어디까지 하드웨어에 닿는가"를 실물로 확인할 수 있다.
이 프로젝트의 주인공은 소프트웨어를 돌릴 PC가 아니라 대상 개발보드다. 지원 범위가 요청의 Arduino·MicroPython·ESP32·STM32·RP2040·nRF5x를 전부 덮는다(코드/설정 등장 빈도 순).
| MCU 패밀리 | 대표 보드 / 비고 |
|---|---|
| ESP32 (최다) | ESP32-S3 · ESP32-C3 등. WebSerial(esptool-js) 직접 플래싱 · Wi-Fi/BLE OTA |
| STM32 | ARM Cortex-M 계열. probe-rs(SWD/DAPLink) 디버깅 |
| AVR | 고전 Arduino Uno/Nano 등 |
| MicroPython | C++ 대신 Python 생성기 경로(devmode: micropython) |
| RP2040 | Raspberry Pi Pico 계열 |
| Nordic nRF5x | nRF52 · nRF51 (BLE) |
| SAMD · Renesas | SAMD 계열 · Renesas(Arduino Uno R4) |
브랜드 자산(public/brands/)에는 Arduino·Espressif·STMicroelectronics·Nordic·Raspberry Pi·M5Stack·micro:bit·Adafruit·SparkFun·Seeed(SenseCraft) 등이 들어 있다. 각 보드는 npm 패키지 @aily-project/board-*이고, 그 안의 board.json이 컴파일 파라미터와 핀맵의 정본이다.
board.json에는 컴파일 파라미터(compilerParam), GPIO/ADC/PWM/UART/I2C/SPI 능력, 그리고 배선 단자의 기하(pinmap)가 담겨 있고, AI 도구 getBoardParametersTool이 이걸 authoritative source로 읽어 배선도·코드를 만든다. 즉 "AI가 배선을 안다"는 건 마법이 아니라 이 구조화된 데이터 덕분이다.| 항목 | 요구 / 참고 |
|---|---|
| OS | Windows(NSIS 설치, 글로벌/CN 플레이버) · macOS(arm64/x64/universal dmg) · Linux |
| 번들 런타임 | Node 22.x · 7za/7zz · ripgrep · probe-rs · aily-builder를 앱이 동봉(별도 설치 불필요) |
| 컴파일러 | 보드별 @aily-project/compiler-*를 필요 시 다운로드(대형 ESP32 컴파일러는 7z 압축) |
| 프로젝트 파일 | 확장자 .abi(Aily Blockly Project), 파일 연결 등록 |
| 업데이트 | electron-updater(dl.yiyu.pro/blockly), 커스텀 레지스트리 registry.yiyu |
| 개발 빌드 | Windows는 개발자 모드 필요. 설치는 2단계(npm ci 루트 + cd electron && npm ci) |
aily-blockly를 설치하고 새 프로젝트에서 보드(예: Arduino Uno 또는 ESP32)를 목록에서 선택한다. "핀 출력 설정" + "디지털 쓰기" + "기다리기" 블록을 끼워 내장 LED를 1초 간격으로 깜빡이게 만들고, 케이블을 꽂아 업로드한다. 목표: "보드 선택 → 블록 → 업로드"의 전체 흐름을 몸에 익히기. 툴체인을 손으로 깔 필요가 없다는 걸 체감한다.
같은 프로젝트에서 코드 뷰(Monaco)를 열어 블록이 만들어낸 .ino 코드를 읽는다. 블록 하나를 지우거나 값을 바꾸면 코드의 어느 줄이 바뀌는지 관찰한다(소스맵의 효과). 이어 시리얼 모니터로 Serial.println() 출력을 확인한다. 배우는 것: 비주얼 표현과 텍스트 코드가 어떻게 1:1로 대응되는가.
aily-chat(에이전트)에게 자연어로 "DHT11 온습도 센서 값을 읽어 시리얼로 출력하고, 배선도를 그려줘"라고 요청한다. AI가 추천한 라이브러리·배선도·블록을 검토하고, 시리얼 플로터로 값을 그래프로 본다. 배우는 것: 에이전트가 board.json·라이브러리 정보를 근거로 어떻게 실제 결과물을 내는지, 그리고 그 결과를 어떻게 검증하는지.
MicroPython을 지원하는 보드로 같은 로직을 다시 만들어 Arduino 생성기 vs MicroPython 생성기의 출력 차이를 비교한다. 이어 설치된 @aily-project/lib-* 패키지 하나를 열어 블록 정의·생성기(generator.js)·block.json이 어떻게 짜였는지 살펴본다. 배우는 것: 하나의 블록 프로그램이 두 언어로 낮춰지는 원리, 라이브러리를 블록으로 만드는 형식.
두 갈래 중 하나에 도전한다. (A) src/app/tools/aily-chat/tools/의 도구 하나(예: getBoardParametersTool)와 public/skills/*/SKILL.md를 읽어 "에이전트가 하드웨어를 아는 법"을 역설계한다. (B) 기존 board.json을 참고해 미지원 보드용 board.json/핀맵을 직접 작성해 새 보드를 추가해 본다. 배우는 것: 도메인 특화 에이전트 도구 설계, 또는 하드웨어 지원을 "데이터"로 확장하는 감각.
| 주차 | 주제 | 무엇을 · 왜 |
|---|---|---|
| 1주 | Blockly 기초 | 블록 정의(block.json)·툴박스·워크스페이스·CodeGenerator. 비주얼 프로그래밍의 뼈대. |
| 2주 | Electron 멀티프로세스 | 메인/렌더러/preload/IPC와 utilityProcess 격리. 데스크톱 앱의 프로세스 모델. |
| 3주 | 임베디드 툴체인 | 컴파일·업로드·시리얼, board.json/핀맵, arduino-cli 개념. 하드웨어가 코드가 되는 경로. |
| 4주 | 코드 생성기 · 소스맵 | 고수준 표현을 코드로 낮추기 + 양방향 추적(block-source-map). 컴파일러 프런트엔드 감각. |
| 5주 | LLM 에이전트 | 도구 정의·MCP·Skills·ABS·토큰 예산·명령 보안. 제품 수준 에이전트 구성. |
| 6주 | 브라우저 하드웨어 통신 | WebSerial(esptool-js)·Web Bluetooth(BLE OTA)·mDNS OTA·probe-rs. 웹이 장치에 닿는 법. |
처음부터 AI 에이전트·MCP를 파려 하면 정작 이 IDE의 토대(블록→코드→하드웨어)를 건너뛰게 된다. 1~4주에 "블록이 어떻게 .ino가 되고, 그게 어떻게 보드에 올라가는가"를 손으로 재현하면 aily-blockly의 절반이 이해된다. 그 위에서 5~6주에 에이전트와 브라우저 하드웨어 통신을 얹는 순서가 가장 단단하다. 하드웨어를 모르면 하드웨어용 AI도 못 만든다.
aily-project-blockly)를 쓴다.project.abs). 예: logic_compare($a, EQ, $b)처럼 값 블록은 괄호로, 문장은 @이름:으로 표기. AI가 편집하기 쉬운 LLM 친화적 표현이고, .ino/C++는 여기서 파생된다..abi의 프로젝트는 사실 하나의 npm 프로젝트다. package.json이 보드(board-*)와 라이브러리(lib-*)를 의존성으로 선언한다. 이 패키지들은 @aily-project/ 스코프의 커스텀 레지스트리(registry.yiyu)에서 온다.utilityProcess에서 격리 실행된다. MCP·Skills·서브에이전트·명령 보안을 아우르는 하드웨어 특화 코딩 에이전트.esptool-js는 이를 이용해 ESP32/ESP8266에 펌웨어를 외부 도구 없이 직접 플래싱한다.