(3/3) Hermes Agent 프로필 — 에이전트 한 대를 역할별로 쪼개 쓰기
🤖 Hermes Agent 셋업 ~ 운영 시리즈 (전체 3편)
- Hermes Agent Docker Compose 셋업
- Hermes Agent + Discord 'NoneType' 트러블슈팅
- Hermes Agent 프로필로 에이전트 쪼개 쓰기 ← 지금 글
Summary
1편에서 Docker Compose로 Hermes Agent를 띄우고, 2편에서 Discord 연동 버그를 잡았어요. 그 뒤로 몇 달을 굴리면서 한 가지가 계속 걸렸습니다.
인스턴스가 하나뿐이라 모든 게 한 통에 섞인다는 점이에요. 블로그 초안을 쓰던 세션 기억이 부동산 데이터 작업에 끼어들고, 실험용으로 켠 스킬이 운영 크론에까지 붙고, API 키 하나를 바꾸면 무관한 작업까지 같이 흔들렸습니다.
hermes profile 이 정확히 이 문제를 풉니다.
완전히 격리된 Hermes 인스턴스를 여러 개 만들어서, 설정·키·기억·세션·스킬·크론을 각각 따로 두는 기능이에요.
💡 이 글에서 다루는 것
- 프로필이 실제로 무엇을 가르고 무엇을 공유하는지
- 프로필 만들기와 복제(
--clone계열) 옵션 차이- 프로필을 지목하는 세 가지 방법과 각각의 함정
- 게이트웨이를 프로필마다 띄울지, 한 대로 묶을지
- 역할 설명(
describe)과 칸반 자동 라우팅export/import/install로 다른 머신에 옮기기- 이름 변경·삭제 시 남는 찌꺼기 정리
글에 나오는 출력은 전부 Hermes Agent v0.21.3 (2026.9.14) 컨테이너에서 실제로 실행한 결과입니다. 확인이 끝난 테스트 프로필은 전부 삭제했어요.
1. 프로필이 실제로 가르는 것
먼저 지금 상태부터 봅니다.
hermes profile list
Profile Model Gateway Alias Distribution
─────────────── ─────────────────────────── ─────────── ─────────── ────────────────────
◆default gpt-5.5 running — —
◆ 가 지금 활성 프로필입니다. 아직 default 하나뿐이에요.
어디에 사는가
프로필은 디렉토리 하나입니다. 그게 전부예요.
| 프로필 | 경로 |
|---|---|
default |
HERMES_HOME 루트 그대로(Docker면 /opt/data,맨몸 설치면 ~/.hermes) |
| 이름 있는 프로필 |
<루트>/profiles/<이름> |
여기서 default 가 특별하다는 점을 먼저 짚고 갑니다.
default 는 profiles/ 밑에 있지 않고 루트 그 자체예요.
그래서 삭제할 수 없고, 이름을 바꿔도 내부 식별자는 계속 default 로 남습니다.
프로필 안에 뭐가 들어가나
새로 만든 프로필 디렉토리는 이렇게 생겼습니다.
ls -A /opt/data/profiles/blogdemo
.env
SOUL.md
audio_cache
backups
config.yaml
cron
home
hooks
image_cache
logs
memories
pairing
plans
profile.yaml
sessions
skills
skins
workspace
| 항목 | 내용 | 프로필마다 따로? |
|---|---|---|
config.yaml |
모델·프로바이더 보안·폴백 설정 |
따로 |
.env |
API 키·봇 토큰 | 따로 |
SOUL.md |
성격·역할 지시문 |
따로 |
memories/ |
장기 기억 ( MEMORY.md,USER.md) |
따로 |
sessions/ |
대화 기록 | 따로 |
skills/ |
설치된 스킬 (신규 생성 시 58개 동기화) |
따로 |
cron/ |
예약 작업 | 따로 |
workspace/ |
작업 디렉토리 | 따로 |
profile.yaml |
역할 설명(description) |
따로 |
auth.json |
Nous 계정 등 풀링된 자격증명 | 루트에서 공유 |
kanban.db |
칸반 보드 | 루트에서 공유 |
정리하면 — “이 에이전트가 누구인가”에 해당하는 건 전부 갈라지고, 계정·보드처럼 기계 단위인 건 공유됩니다.
2. 첫 프로필 만들기
hermes profile create blogdemo \
--description "블로그 초안과 자료 조사 담당"
Profile 'blogdemo' created at /opt/data/profiles/blogdemo
58 bundled skills synced.
Wrapper created: /opt/data/.local/bin/blogdemo
Next steps:
blogdemo setup Configure API keys and model
blogdemo chat Start chatting
hermes gateway restart Serve this profile from the running multiplexed gateway
⚠ This profile has no API keys yet. Run 'blogdemo setup' first,
or it will inherit keys from your shell environment.
한 줄로 세 가지가 같이 일어났어요.
| 일어난 일 | 결과 |
|---|---|
| 디렉토리 생성 | profiles/blogdemo 와 하위 구조 |
| 스킬 동기화 | 번들 스킬 58개 복사 |
| 래퍼 스크립트 | ~/.local/bin/blogdemo 생성 |
만들어진 결과는 show 로 한 번에 확인합니다.
hermes profile show blogdemo
Profile: blogdemo
Path: /opt/data/profiles/blogdemo
Model: gpt-5.5 (openai-codex)
Gateway: stopped
Skills: 58
.env: exists
SOUL.md: exists
Alias: blogdemo → hermes -p blogdemo (/opt/data/.local/bin/blogdemo)
--description 은 지금 주는 게 좋습니다
--description 은 단순한 메모가 아니라 칸반 오케스트레이터가 작업을 배분할 때 읽는 값입니다.
6절에서 자세히 다루는데, 나중에 붙이는 것보다 만들 때 같이 주는 편이 손이 덜 갑니다.
실제로 profile.yaml 에 이렇게 들어갑니다.
cat /opt/data/profiles/blogdemo/profile.yaml
description: 블로그 초안과 자료 조사 담당
description_auto: false
키 경고를 흘려듣지 마세요
출력 마지막의 경고가 중요합니다.
프로필의 .env 가 비어 있으면 셸 환경변수의 키를 그대로 물려받습니다.
“격리했으니 안전하겠지” 하고 방치하면, 실험용 프로필이 운영 키로 API를 때립니다.
새 프로필은 만들자마자 .env 를 채우거나 <프로필> setup 을 한 번 돌려주세요.
⚠️
.env에 키를 추가할 때는 항상 이어쓰기(>>) 로 하세요. 덮어쓰면 그 프로필이 들고 있던 다른 키가 통째로 날아가고, 복구 경로가 사실상 없습니다.
3. 프로필을 지목하는 세 가지 방법
만들었으면 골라 써야죠. 방법이 세 개고, 셋 다 성격이 다릅니다.
| 방법 | 형태 | 유효 범위 | 쓰기 좋은 곳 |
|---|---|---|---|
-p--profile |
hermes -pblogdemo chat |
그 명령 한 번 |
스크립트 크론·CI |
| 래퍼 스크립트 |
blogdemo chat |
그 명령 한 번 |
손으로 칠 때 |
| sticky 기본값 |
hermes profileuse blogdemo |
바꿀 때까지 계속 |
한동안 한 프로필만 팔 때 |
함정 1 — -p 는 어디 붙여도 먹지만, 앞에 붙이세요
-p 는 argparse 가 돌기 전에 걷어내는 플래그입니다.
argv 전체를 훑기 때문에 서브커맨드 앞이든 뒤든 둘 다 동작해요.
hermes -p blogdemo gateway list
hermes gateway list -p blogdemo
둘 다 같은 결과가 나옵니다. 그런데도 앞에 붙이는 걸 습관으로 만드는 게 낫습니다. 틀린 값을 줬을 때 나오는 메시지가 위치에 따라 달라지거든요.
| 준 값 | 서브커맨드 앞 | 서브커맨드 뒤 |
|---|---|---|
없는 프로필nosuch |
없다고 알려줌 |
같음 |
규칙 위반"work bot" |
이름 규칙을 설명하고 대안 제시 |
argparse usage 덤프 |
앞에 붙이면 이렇게 나옵니다.
hermes -p "work bot" gateway list
Error: 'work bot' is not a valid profile name. Use lowercase letters,
numbers, '-' or '_', starting with a letter or number, up to 64 characters
(for example: work-bot). Then run `hermes profile create work-bot`.
Run `hermes profile list` to see your profiles.
뒤에 붙이면 같은 실수가 최상위 usage: 벽으로 바뀌어서, 원인을 찾는 데 시간이 더 듭니다.
함정 1-b — 서브커맨드가 자기 -p 를 가질 때
프로필 이름 규칙(^[a-z0-9][a-z0-9_-]{0,63}$)에 맞는 값은
어디에 있든 프로필 플래그가 먼저 집어갑니다.
포트 번호처럼 이름 규칙에 우연히 맞는 값이 제일 위험해요.
hermes gateway list -p 8080
Error: Profile '8080' does not exist. Create it with: hermes profile create 8080
서브커맨드에 -p 를 넘기려던 건데 프로필 플래그가 가로챈 겁니다.
이럴 땐 -- 로 경계를 긋거나, 애초에 프로필은 앞에서 -p 로 지정해 두세요.
또 하나, 값은 소문자로 정규화됩니다. -p NoSuch 는 nosuch 를 찾습니다.
함정 2 — 래퍼는 PATH 에 있어야 합니다
create 가 만들어 주는 래퍼는 이렇게 생긴 두 줄짜리 스크립트예요.
cat /opt/data/.local/bin/blogdemo
#!/bin/sh
exec /opt/hermes/bin/hermes -p blogdemo "$@"
생성 위치는 항상 ~/.local/bin 입니다.
이 디렉토리가 PATH 에 없으면 blogdemo: command not found 가 나요.
create 가 “Wrapper created” 라고 말해줘도 PATH 는 대신 고쳐주지 않습니다.
이름을 따로 주고 싶으면 --name 을 씁니다.
hermes profile alias blogdemo2 --name bd2
✓ Alias created: /opt/data/.local/bin/bd2
래퍼를 아예 안 만들려면 생성할 때 --no-alias 를 주면 됩니다.
함정 3 — sticky 는 전역 상태입니다
hermes profile use blogdemo
Switched to: blogdemo
이건 셸 세션 단위가 아니라 루트에 파일 하나를 쓰는 전역 설정입니다.
cat /opt/data/active_profile
blogdemo
그래서 다른 터미널, 크론, 게이트웨이가 전부 같이 영향을 받아요.
되돌릴 때는 default 로 되돌리면 되고, 그러면 파일 자체가 지워집니다.
hermes profile use default
Switched to: default (~/.hermes)
바꿔 놓은 걸 잊기 쉬우니, 자동화에는 sticky 대신 -p 를 쓰는 편을 권합니다.
sticky 는 “오늘 하루 이 프로필만 판다” 같은 상황에만요.
4. 복제 — 어디까지 따라오는가
비슷한 프로필을 또 만들 때는 처음부터 세팅하지 말고 복제합니다. 그런데 옵션이 다섯 갈래라 헷갈려요. 뭐가 따라오는지 정리하면 이렇습니다.
| 옵션 | 따라오는 것 | 따라오지 않는 것 |
|---|---|---|
| (없음) | 번들 스킬만 | 나머지 전부 |
--clone |
config.yaml.envSOUL.mdMEMORY.mdUSER.md스킬 |
세션 크론 메신저 채널 |
--clone-all |
활성 프로필 전체 상태 |
세션 DB 백업 체크포인트 크론 메신저 채널 |
--clone-from X |
X 를 원본으로--clone 수행 |
위와 동일 |
--clone-channels |
원본의 봇 토큰 허용목록 플랫폼 설정까지 |
— |
복제원은 기본적으로 활성 프로필입니다. --clone-from 을 주면 그 프로필이 원본이 돼요.
hermes profile create blogdemo2 --clone-from blogdemo
Profile 'blogdemo2' created at /opt/data/profiles/blogdemo2
Cloned config, .env, SOUL.md, and skills from blogdemo.
Wrapper created: /opt/data/.local/bin/blogdemo2
출력 요약은 “config, .env, SOUL.md, and skills” 네 가지만 말하는데,
실제로는 memories/MEMORY.md 와 memories/USER.md 도 같이 복사됩니다.
에이전트의 정체성에 해당하는 파일이라 SOUL.md 와 한 묶음으로 취급하거든요.
요약 줄만 믿고 “기억은 안 따라왔겠지” 하면 안 됩니다.
실측 — description 은 복제되지 않습니다
반대로, 요약에 없으면서 실제로도 안 따라오는 게 있어요. profile.yaml 입니다.
cat /opt/data/profiles/blogdemo2/profile.yaml
cat: /opt/data/profiles/blogdemo2/profile.yaml: No such file or directory
복제로 만든 프로필은 역할 설명이 비어 있는 상태로 시작합니다.
칸반 라우팅을 쓸 생각이라면 복제 직후에 describe 로 채워 넣어야 해요.
--clone-channels 는 기본적으로 쓰지 마세요
메신저 채널까지 복제한다는 건 같은 봇 토큰을 두 프로필이 들고 있게 된다는 뜻입니다. 둘 다 게이트웨이에 붙으면 같은 메시지를 두 번 처리하거나, 한쪽이 연결을 뺏깁니다. Hermes 도 이걸 알아서, 원본이 살아 있는 멀티플렉스 게이트웨이에 물려 있으면 아예 거부합니다.
봇을 진짜로 하나 더 두고 싶다면, 복제가 아니라 새 봇 토큰을 발급받아 새 프로필에 넣는 게 맞습니다.
크론이 따라오지 않는 이유
--clone-all 조차 cron/ 은 일부러 비웁니다.
복제본이 크론 잡을 물려받으면 게이트웨이 두 대가 같은 잡을 각자 실행해서,
비용이 두 배로 나가고 메시지도 두 번 갑니다. 의도된 제외예요.
5. 게이트웨이 — 프로필마다 한 대 vs 한 대로 통합
여기가 실전에서 제일 많이 막히는 지점입니다.
프로필은 각자 게이트웨이를 띄울 수 있고, 반대로 기본 프로필의 게이트웨이 한 대가 전부를 서빙할 수도 있어요. 후자를 멀티플렉스 모드라고 부릅니다.
| 모드 | 설정 | 특징 |
|---|---|---|
| 프로필별 독립 |
gateway.multiplex_profiles= false |
프로세스가 프로필 수만큼. 격리는 강하지만 메모리와 포트를 각자 먹음 |
| 멀티플렉스 | gateway.multiplex_profiles= true |
기본 프로필 게이트웨이 한 대가 전부 서빙. 프로세스 하나 |
지금 설정을 확인합니다.
hermes config get gateway.multiplex_profiles
true
함정 — 프로필을 만들어도 게이트웨이는 자동으로 안 붙습니다
멀티플렉스가 켜져 있는데도, 방금 만든 프로필은 이렇게 나옵니다.
hermes gateway list
Gateways:
✓ default (current) — PID 158
✗ blogdemo — not running
게이트웨이는 뜰 때 한 번 서빙할 프로필 목록을 읽습니다.
그 뒤에 생긴 프로필은 다음 재시작 전까지 인식되지 않아요.
create 출력이 “Serve this profile from the running multiplexed gateway” 라고 알려주는 게 이것 때문입니다.
hermes gateway restart
“프로필을 만들었는데 Discord 가 응답을 안 한다”의 대부분이 이겁니다. 독립 모드에서도 마찬가지로, 새 프로필은 스스로 게이트웨이를 띄우지 않습니다.
독립 → 멀티플렉스로 옮기기
이미 프로필마다 게이트웨이를 띄워 놨다면 전용 마이그레이션 명령이 있어요.
먼저 --dry-run 으로 계획만 뽑아 보세요.
hermes gateway migrate --multiplex --dry-run
이 명령은 프리플라이트를 먼저 돌립니다.
중복 봇 토큰이 있거나, 포트를 직접 점유하는 플랫폼에 /p/<프로필>/ 인그레스가 없으면 아무것도 바꾸지 않고 막아요.
되돌릴 때는 --standalone 을 쓰면 기록해 둔 매니페스트로 복원됩니다.
6. 역할 설명과 칸반 자동 배분
hermes kanban 은 여러 프로필이 공유하는 SQLite 작업 보드입니다.
작업을 쪼개서 프로필에 나눠줄 때, 디스패처는 프로필 이름이 아니라 설명을 읽습니다.
blog-writer 라는 이름만 보고 “글쓰기 작업을 주자”고 판단하지 않아요.
description 이 비어 있으면 라우팅 근거가 없습니다.
읽기와 쓰기 모두 describe 로 합니다.
hermes profile describe blogdemo
블로그 초안과 자료 조사 담당
hermes profile describe blogdemo \
--text "부동산 수집 스크립트 유지보수와 회귀 테스트"
프로필이 많아져서 손으로 쓰기 귀찮다면 보조 LLM에 맡길 수도 있습니다.
| 옵션 | 동작 |
|---|---|
--auto |
보조 LLM이 프로필 내용을 읽고 설명 생성 |
--all |
설명이 비어 있는 모든 프로필을 한 번에 |
--overwrite |
사람이 직접 쓴 설명까지 덮어씀 |
--auto 는 API 호출이 실제로 발생하니 프로필이 많을 때는 비용을 한 번 생각하고 돌리세요.
기본값은 비어 있거나 이전에 자동 생성된 것만 채웁니다 — 손으로 쓴 설명은 건드리지 않아요.
7. 다른 머신으로 옮기기
압축해서 들고 가기
hermes profile export blogdemo
✓ Exported 'blogdemo' to /opt/data/profile-exports/blogdemo-20260919-213455.tar.gz
아카이브는 프로필 이름 디렉토리를 최상위로 갖는 평범한 tarball 입니다.
tar -tzf /opt/data/profile-exports/blogdemo-20260919-213455.tar.gz | head
blogdemo/
blogdemo/SOUL.md
blogdemo/audio_cache/
blogdemo/backups/
blogdemo/backups/config/
blogdemo/backups/config/config.yaml.good.20260919-213319
blogdemo/backups/config/config.yaml.good.20260919-213344
blogdemo/config.yaml
blogdemo/cron/
blogdemo/home/
복원은 import 이고, --name 으로 다른 이름을 붙일 수 있습니다.
hermes profile import \
/opt/data/profile-exports/blogdemo-20260919-213455.tar.gz \
--name blogrestore
✓ Imported profile 'blogrestore' at /opt/data/profiles/blogrestore
Wrapper created: /opt/data/.local/bin/blogrestore
⚠️ 아카이브에는
.env가 그대로 들어갑니다. API 키와 봇 토큰이 평문으로 담긴다는 뜻이에요. 아카이브를 Git 저장소나 공유 드라이브에 올리지 마세요. 백업을 자동화할 거면 저장 위치를 먼저 정하고 시작하는 게 안전합니다.
배포 가능한 프로필 — distribution
팀에 같은 세팅을 나눠줄 거라면 export/import 대신 distribution 이 낫습니다.
Git 저장소 루트에 distribution.yaml 을 두면 그 자체가 설치 가능한 프로필이 돼요.
hermes profile install github.com/myteam/hermes-reviewer --alias
매니페스트에 들어가는 필드는 이렇습니다.
| 필드 | 용도 |
|---|---|
name |
프로필 이름 (필수) |
version |
배포 버전 |
description |
역할 설명 |
hermes_requires |
최소 Hermes 버전. 안 맞으면 설치 단계에서 즉시 실패 |
env_requires |
필요한 환경변수 목록..env.template 생성에 쓰임 |
distribution_owned |
배포본이 소유하는 파일·디렉토리 |
distribution_owned 를 지정하지 않으면 기본값이 적용됩니다 —
SOUL.md, config.yaml, mcp.json, skills, cron, distribution.yaml.
업데이트는 기록된 출처에서 다시 당겨옵니다.
hermes profile update hermes-reviewer
| 구분 | 대상 |
|---|---|
| 덮어씀 | 배포본이 소유한 파일, 배포본이 제공한 스킬·크론 |
| 보존 | 내가 추가한 스킬·크론, 기억, 세션, 인증, .env |
| 조건부 | config.yaml — 기본 보존, --force-config 를 줘야 덮어씀 |
config.yaml 이 기본 보존인 게 핵심이에요.
모델이나 프로바이더를 내가 바꿔 뒀다면 업데이트해도 그대로 남습니다.
8. 이름 바꾸기와 지우기
rename
hermes profile rename blogdemo2 blogdemo9
✓ Renamed blogdemo2 → blogdemo9
✓ Alias updated: blogdemo9
Profile renamed: blogdemo2 → blogdemo9
Path: /opt/data/profiles/blogdemo9
디렉토리, 래퍼, 세션·라우팅 식별자까지 같이 옮겨줍니다.
단, 커스텀 이름 래퍼는 고아가 됩니다.
앞에서 --name bd2 로 만들어 둔 래퍼는 rename 이 정리해 주지 않아요.
cat /opt/data/.local/bin/bd2
#!/bin/sh
exec /opt/hermes/bin/hermes -p blogdemo2 "$@"
bd2 profile list
Error: Profile 'blogdemo2' does not exist. Create it with: hermes profile create blogdemo2
이름이 프로필명과 같은 래퍼만 자동 갱신되고, 별도 이름을 준 래퍼는 예전 프로필을 계속 가리킵니다.
--name 을 썼다면 rename 후에 직접 다시 만들어 주세요.
delete
hermes profile delete blogdemo -y
This will permanently delete:
• All config, API keys, memories, sessions, skills, cron jobs
• Command alias (/opt/data/.local/bin/blogdemo)
✓ Removed /opt/data/.local/bin/blogdemo
✓ Removed /opt/data/profiles/blogdemo
Profile 'blogdemo' deleted.
되돌릴 수 없습니다. 아까운 게 있으면 export 를 먼저 하세요.
default 는 예외입니다
1절에서 짚었듯 default 는 루트 그 자체라, 지울 수 없습니다.
hermes profile delete default -y
Error: Cannot delete the default profile (~/.hermes).
To remove everything, use: hermes uninstall
rename 도 다르게 동작해요. 디렉토리를 옮기는 대신 표시 이름만 붙입니다.
hermes profile rename default "메인봇"
✓ Display name set: 메인봇 (canonical id remains 'default')
목록에는 이렇게 보이지만, -p 로 지목할 때 쓰는 식별자는 여전히 default 입니다.
Profile Model Gateway Alias Distribution
─────────────── ─────────────────────────── ─────────── ─────────── ────────────────────
◆메인봇 (default) gpt-5.5 running — —
표시 이름은 루트의 profile.yaml 에 display_name 한 줄로 저장되니,
되돌리고 싶으면 그 줄을 지우면 됩니다.
identity 재정리가 필요한 순간
delete 와 rename 은 디렉토리만 치우는 게 아니라
세션 키·라우팅 키·하트비트·전달 레코드까지 같이 정리합니다.
그런데 게이트웨이가 돌고 있으면 라우팅 인덱스가 메모리에 올라가 있어서, 삭제·변경이 DB에는 반영돼도 살아 있는 게이트웨이에는 안 먹을 수 있어요. 그럴 때 쓰라고 재실행용 명령이 따로 있습니다.
| 상황 | 명령 |
|---|---|
| 삭제한 프로필의 라우팅이 남아 있음 |
hermes profilepurge-identity<지운이름> |
| 이름 바꾼 프로필이 예전 이름으로 잡힘 |
hermes profilemigrate-identity<옛이름> <새이름> |
둘 다 멱등이라 여러 번 돌려도 안전합니다. 게이트웨이를 재시작하거나 정지한 뒤에 돌리는 게 정석이에요.
9. 이름 규칙 — 조용히 바뀌는 쪽을 조심
프로필 이름은 소문자·숫자·하이픈·밑줄, 첫 글자는 영숫자, 최대 64자입니다.
그런데 위반 처리가 두 갈래라서 이게 함정이에요.
| 입력 | 처리 |
|---|---|
BlogDemo |
조용히 소문자로 정규화 → blogdemo |
blog writer |
거부 + 대안 제시 |
대문자는 에러가 아니라 그냥 바뀝니다. BlogDemo 로 만든 프로필은 blogdemo 로 저장돼요.
그래서 이미 blogdemo 가 있는 상태에서 BlogDemo 를 만들면 이렇게 됩니다.
hermes profile create BlogDemo
Error: A profile named 'blogdemo' already exists.
공백은 정규화 대상이 아니라 거부됩니다. 대신 친절하게 대안을 줘요.
hermes profile create "blog writer"
Error: 'blog writer' is not a valid profile name. Use lowercase letters,
numbers, '-' or '_', starting with a letter or number, up to 64 characters
(for example: blog-writer). Then run `hermes profile create blog-writer`.
처음부터 소문자와 하이픈으로만 쓰면 둘 다 안 만납니다.
10. 명령어 한 장 정리
| 하고 싶은 것 | 명령 |
|---|---|
| 목록 보기 | hermes profile list |
| 상세 보기 | hermes profile show <이름> |
| 만들기 | hermes profile create <이름>--description "..." |
| 복제해서 만들기 | hermes profile create <새이름>--clone-from <원본> |
| 한 번만 지목 | hermes -p <이름> <서브커맨드> |
| 기본값 고정 | hermes profile use <이름> |
| 기본값 해제 | hermes profile use default |
| 래퍼 만들기 | hermes profile alias <이름>--name <별칭> |
| 래퍼 지우기 | hermes profile alias <이름>--remove |
| 역할 설명 읽기·쓰기 |
hermes profile describe <이름>[--text "..."] |
| 게이트웨이 상태 | hermes gateway list |
| 새 프로필 서빙 시작 |
hermes gateway restart |
| 멀티플렉스 전환(계획만) |
hermes gateway migrate--multiplex --dry-run |
| 백업 | hermes profile export <이름> |
| 복원 | hermes profile import <아카이브>--name <이름> |
| 배포본 설치 | hermes profile install <git-url>--alias |
| 배포본 갱신 | hermes profile update <이름> |
| 이름 바꾸기 | hermes profile rename <옛이름> <새이름> |
| 지우기 | hermes profile delete <이름> -y |
11. 제가 쓰는 구성
참고삼아, 지금 굴려볼 만하다고 생각하는 구성을 적어둡니다.
| 프로필 | 역할 | 설명(describe) |
|---|---|---|
default |
메신저 창구 잡다한 질문 |
(비움) |
ops |
크론·수집 스크립트 유지보수 |
데이터 수집 파이프라인 유지보수와 회귀 테스트 |
writer |
블로그 초안 자료 조사 |
기술 블로그 초안 작성과 출처 조사 |
lab |
실험용 언제 날려도 되는 곳 |
프로토타입 실험 전용 |
설계 원칙은 세 가지예요.
- 메신저 창구는
default하나로. 봇 토큰은 한 프로필만 들고 있어야 충돌이 안 납니다. - 게이트웨이는 멀티플렉스 한 대로. 프로세스를 프로필 수만큼 띄울 이유가 없어요.
lab은 주기적으로 지우고 다시 만든다. 실험 찌꺼기가 쌓이는 곳을 하나로 몰아두면 나머지가 깨끗합니다.
마무리
프로필은 기능 자체는 단순합니다. 디렉토리를 나누는 것뿐이에요. 그런데 실제로 써 보면 걸리는 곳이 정해져 있습니다.
| 자주 밟는 지뢰 | 정리 |
|---|---|
-p 를뒤에 붙임 |
동작은 하지만 에러 메시지가 쓸모없어짐 |
서브커맨드-p 가 안 먹음 |
이름 규칙에 맞는 값은 프로필 플래그가 가로챔 |
| 프로필 만들었는데 봇이 무응답 |
hermes gateway restart필요 |
| 복제했는데 라우팅이 안 됨 |
description 은복제되지 않음 |
래퍼가command not found |
~/.local/bin 이PATH 에 없음 |
| rename 후 커스텀 래퍼가 깨짐 |
--name 래퍼는수동 재생성 |
| 실험 프로필이 운영 키를 씀 |
빈 .env 는셸 환경변수를 상속 |
여기까지가 Hermes Agent 시리즈 3편입니다. 1편에서 띄우고, 2편에서 고치고, 3편에서 역할별로 쪼갰어요.