본문으로 건너뛰기

© 2026 Molayo

Dev.to헤드라인2026. 06. 19. 05:57

실리콘에서 PWA까지: 자율형 AI 에이전트(Hermes)를 일상 워크플로우에 직접 배포한 경험

요약

자율형 CLI AI 에이전트인 Hermes를 실제 개발 워크플로우에 배포하여 복잡한 문제를 해결한 경험을 다룹니다. 파일 시스템과 터미널 접근 권한을 가진 Hermes가 PWA 에셋 경로 문제, 시간대 계산 오류, 리눅스 컴파일 오류를 어떻게 해결했는지 상세히 설명합니다.

핵심 포인트

  • Hermes는 단순 채팅을 넘어 파일 시스템과 터미널을 직접 제어하는 자율형 에이전트임
  • PWA 환경의 복잡한 에셋 경로 및 브라우저 오디오 재생 정책 문제를 해결함
  • DST(일광 절약 시간제)로 인한 시간대 드리프트 문제를 UTC 정규화로 해결함
  • 리눅스 환경의 네이티브 컴파일러 링크 오류를 분석하고 수정함

베어메탈 (bare-metal) C 프로그래밍, 모션 제어 (motion control), 산업 자동화 (industrial automation) 등 실리콘 계층부터 다뤄온 20년 이상의 경력을 가진 엔지니어로서, 저는 항상 "AI 코딩 어시스턴트 (AI coding assistants)"에 대해 회의적이었습니다. 자동 완성 스니펫 (auto-complete snippets)을 작성하는 것은 쉽지만, 복잡하고 프로덕션 환경에 적합한 (production-ready) 시스템을 설계하는 것은 완전히 다른 차원의 문제입니다.

하지만 최근 저의 새로운 사업들을 런칭하는 과정에서—구체적으로는 모듈형 Flutter Web PWA Book-to-App 프레임워크 (tefila_meditation), Go 네이티브 데스크톱 앱 (remote-viewer), 그리고 여성 건강 주기 계산기 최적화 과정에서—저는 평소와 다른 시도를 해보기로 했습니다.

저는 Nous Research의 자율형 CLI 기반 AI 에이전트인 Hermes를 저의 Linux 터미널 환경에 직접 배포했습니다.

브라우저 탭에 머물며 코드를 복사해서 붙여넣으라고 요구하는 일반적인 채팅 위젯 (chat widgets)과 달리, Hermes는 파일 시스템 (filesystem), 패키지 매니저 (package manager), 그리고 터미널 접근 권한을 모두 가진 채 로컬에 배포되었습니다. Hermes는 "스텁 (stubs)"이나 "플레이스홀더 (placeholders)"를 작성하지 않습니다. 코드를 작성하고, 컴파일하며, 정적 출력 (static output)을 분석하고, git을 실행하며, 빌드 결과물을 직접 배포합니다.

우리가 함께 승리한 3가지 실제 사례는 다음과 같습니다:

  1. 모바일 자동 재생 및 PWA 에셋 경로 지옥 (The Mobile Autoplay & PWA Asset Path Hell)
    오프라인 환경에서도 작동하는 'Daily Quiet Corner'의 루핑(looping) 환경음 재생 기능을 구축할 때, 우리는 전형적인 모바일 웹의 벽에 부딪혔습니다. 현대의 브라우저들은 즉각적이고 동기적인 사용자 제스처(user gesture)에 의해 트리거되지 않는 한 오디오 재생을 공격적으로 차단합니다. 게다가 Flutter Web은 에셋을 이중 중첩 구조(assets/assets/audio/...)로 컴파일하여, 삼중 에셋 경로 해석(assets/assets/assets/...)을 유발하고 조용한 404 오류를 발생시킵니다.
    • 해결 방법: Hermes는 테스트 브라우저의 네트워크 리소스 요청을 분석하여 404 오류를 격리했고, 브라우저의 "사용자 제스처 토큰(user gesture token)"을 보존하기 위해 플레이어를 동기적 실행 흐름(synchronous execution flow)으로 리팩터링했습니다. 또한 Web에서는 이중 에셋 라우팅을 사용하는 네이티브 UrlSource를 사용하도록 소스 로더를 동적으로 전환하는 동시에, 모바일에서는 네이티브 AssetSource를 유지하도록 했습니다.

  2. Python/Dart에서의 시간대 드리프트 및 일광 절약 시간제(DST) 계산
    우리의 주기 계산은 전형적인 버그로 인해 어려움을 겪고 있었습니다. 계절별 일광 절약 시간제(Daylight Saving Time, DST) 전환으로 인해 하루가 23시간 또는 25시간으로 계산되어 예측값이 어긋나는 현상이 발생했습니다.
    • 해결 방법: 임시방편적인 오프셋(offset) 수정 작업을 적용하는 대신, Dart 프론트엔드와 Python 백엔드 모두에서 모든 datetime 연산을 UTC로 정규화했습니다. 또한 계절별 시계 전환 시 100% 수학적 일관성을 보장하기 위해 포괄적인 단위 테스트(unit tests)를 지원했습니다.

  3. 데스크톱 Linux 툴체인 컴파일
    Ubuntu에서 Go 네이티브 데스크톱 앱인 "remote-viewer"를 빌드할 때, CMake 과정에서 네이티브 GStreamer 링크 오류가 발생했습니다. Hermes는 컴파일러 로그를 파싱하여 누락된 네이티브 개발 패키지를 격리했고, Android Studio의 작업을 차단하던 문제를 해결하기 위해 정확한 GStreamer 설치 의존성(dependencies)을 제공했습니다.

핵심 요약 (Key Takeaways):
• UI 이벤트의 비동기 간극(Async Gaps)과 작별하기: 모바일 브라우저는 자동 재생 차단(autoplay blocks)에 매우 엄격합니다. 클릭과 '.play()' 호출 사이에 단 하나의 'await' 마이크로태스크(microtask)라도 있다면, 브라우저는 제스처 토큰(gesture token)을 폐기합니다. 미디어 재생 설정은 반드시 엄격하게 동기적(synchronous)으로 유지하십시오.
• Flutter Web 에셋 캐싱(Asset Caching)은 매우 공격적입니다: PWA의 서비스 워커(Service workers)는 컴파일된 JS를 매우 강력하게 캐싱하기 때문에 일반적인 새로고침으로는 업데이트가 반영되지 않습니다. 에셋 접두사(asset-prefix) 변경 사항을 테스트할 때는 항상 강력한 캐시 새로고침(hard cache-reload, Ctrl+F5)을 수행하십시오.
• 대체제가 아닌 파트너로서의 AI 에이전트: 시스템 사고(systems-thinking, 인간)와 신속한 실행 및 반복(rapid execution and iteration, 에이전트)을 결합할 때 마법이 일어납니다. 저는 아키텍처를 가이드했고, Hermes는 상용구 코드(boilerplate), 컴파일(compilations), 그리고 리포지토리 동기화(repo synchronization)를 처리했습니다.

Hermes를 제 터미널에 직접 배포한 것은 코딩 양을 줄여준 것이 아니라, 더 빠르고 깔끔하며 훨씬 더 높은 확신을 가지고 빌드할 수 있게 해주었습니다.

여러분은 AI 에이전트를 개발 워크플로우(development workflows)에 통합하고 계신가요, 아니면 샌드박스(sandbox) 안에 가두어 두고 계신가요? 함께 논의해 봅시다!

AI 자동 생성 콘텐츠

본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.

원문 바로가기
0

댓글

0