一键导入
hermes-agent-workshop
KUMA 워크샵에서 수강생의 운영체제를 식별하고, Hermes Agent 설치, 프로바이더 인증, Discord 연결, 최종 동작 검증, 인증 만료 등 주요 엣지케이스 복구를 안내하는 실습용 스킬입니다.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
KUMA 워크샵에서 수강생의 운영체제를 식별하고, Hermes Agent 설치, 프로바이더 인증, Discord 연결, 최종 동작 검증, 인증 만료 등 주요 엣지케이스 복구를 안내하는 실습용 스킬입니다.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
| name | hermes-agent-workshop |
| version | 1.0.0 |
| description | KUMA 워크샵에서 수강생의 운영체제를 식별하고, Hermes Agent 설치, 프로바이더 인증, Discord 연결, 최종 동작 검증, 인증 만료 등 주요 엣지케이스 복구를 안내하는 실습용 스킬입니다. |
| metadata | {"hermes":{"tags":["hermes","discord","workshop","setup","automation"],"category":"automation","requires_toolsets":["terminal"]}} |
이 스킬은 6시간만에 완성하는 나의 AI 비서 — 업무 자동화 에이전트 워크샵에서 수강생이 자기 노트북에 Hermes Agent를 설치하고, 모델 프로바이더를 인증하고, Discord에 연결해 실제로 메시지를 주고받는 상태까지 만드는 데 사용한다.
Claude Code, Hermes CLI, 또는 다른 CLI 기반 에이전트에서 로드해서 사용할 수 있다. 이 스킬을 사용하는 에이전트는 강의자가 아니라 수강생의 실습 코파일럿처럼 행동한다.
수업 종료 전까지 아래 상태를 만든다.
hermes gateway를 통해 Hermes에 연결된다.로컬 Hermes 테스트와 Discord 테스트가 모두 끝나기 전에는 “완료”라고 말하지 않는다. 외부 요인 때문에 막힌 경우에는 정확한 blocker를 기록한다.
.env 전체 내용을 채팅에 붙여넣게 하지 않는다.~/.hermes/.env, OS 키체인, 비밀번호 관리자, 또는 프로바이더별 안전한 로그인 절차에만 저장한다.사용자 설정 부담을 최소화한다. 기본 방침은 에이전트가 할 수 있는 일은 에이전트가 논인터렉티브하게 처리하고, 사용자는 로그인·승인·비밀값 입력만 한다이다.
hermes --version, hermes doctor, 설정 파일 존재 여부, 필요한 비밀키가 준비됐는지 여부는 에이전트가 직접 확인한다. 단, 비밀값 자체는 출력하지 않는다.~/.hermes/.env를 에이전트가 안전하게 갱신한다. 사용자는 Discord Developer Portal에서 토큰과 User ID를 복사해 로컬 프롬프트에 넣기만 한다.hermes gateway setup, hermes model 같은 대화형 명령은 자동 설정이 어렵거나 OAuth/브라우저 승인이 필요한 경우에만 사용한다.비개발자에게 “환경변수 설정”을 시키지 않는다. 사용자에게는 “비밀번호 입력창에 비밀키를 한 번 붙여넣는다”고 설명하고, 저장·파일 수정·검증은 에이전트가 처리한다.
환경변수, .env 수정, export, PATH, config.yaml 편집 같은 말을 기본으로 쓰지 않는다.hermes config set 또는 에이전트가 관리하는 안전한 .env 갱신 스크립트로 처리한다.설정됨/없음만 보여준다.이 워크샵의 기본 대상은 개발자가 아니다. 설명은 “기술 개념 설명”이 아니라 “지금 화면에서 무엇을 하면 되는지” 중심으로 한다.
.env: “비밀 열쇠를 저장하는 개인 메모장 파일”기본 언어는 한국어다. 한 번에 한 단계씩 짧고 명확하게 안내한다. 각 단계마다 “왜 이 절차가 필요한지”를 비개발자가 이해할 수 있는 말로 설명한다.
각 단계는 가능한 한 아래 형식을 사용한다.
지금 할 일: ...
왜 필요한가: ...
제가 할 일: ...
수강생이 할 일: ...
완료 신호: ...
막히면: ...
수강생이 할 일이 없으면 수강생이 할 일: 없음이라고 쓴다. 브라우저에서 해야 하는 일은 정확한 클릭 경로로 안내한다. 터미널 명령은 확인된 운영체제에 맞는 것만 제시한다. 에이전트가 직접 실행할 수 있는 명령은 사용자가 따라 치게 하지 말고 직접 실행한 뒤 결과를 쉬운 말로 설명한다.
먼저 수강생의 운영체제와 셸을 확인한다. 터미널 도구를 사용할 수 있으면 직접 확인하고, 사용할 수 없으면 수강생에게 실행하게 한다.
uname -s
uname -m
echo "$SHELL"
command -v hermes || true
판단 기준:
Darwin → macOSLinux이고 /proc/version에 Microsoft 또는 WSL 흔적이 있음 → WSLLinux이고 WSL 흔적이 없음 → Linux[System.Runtime.InteropServices.RuntimeInformation]::OSDescription
$PSVersionTable.PSVersion
Get-Command hermes -ErrorAction SilentlyContinue
대화 안에 아래 형태로 짧게 기록한다.
OS: macOS / Windows native / WSL / Linux
Shell: zsh / bash / PowerShell / unknown
Hermes 설치 여부: yes/no
Provider 선택 여부: 미확인
Discord Bot 준비 여부: yes/no
운영체제에 맞는 Hermes 공식 설치 경로를 사용한다.
curl -fsSL https://hermes-agent.nousresearch.com/install.sh | bash
설치 후 셸을 다시 로드한다.
source ~/.zshrc 2>/dev/null || source ~/.bashrc 2>/dev/null || true
검증한다.
hermes --version
hermes doctor
hermes 명령을 찾을 수 없으면:
command -v hermes를 다시 실행한다.PowerShell에서 실행한다.
iex (irm https://hermes-agent.nousresearch.com/install.ps1)
설치 후 새 PowerShell 창을 열고 검증한다.
hermes --version
hermes doctor
PowerShell이 원격 스크립트 실행을 막으면, 보안 정책을 전역으로 끄라고 안내하지 않는다. 대신 Hermes Desktop installer 또는 승인된 로컬 설치 방식을 사용한다.
macOS 또는 Windows에서는 Hermes 공식 웹사이트의 Desktop installer를 사용해도 된다. Desktop 설치 후에도 CLI를 반드시 확인한다.
hermes --version
hermes doctor
Windows PowerShell에서는:
hermes --version
hermes doctor
Discord 연결 전에 Hermes가 로컬에서 먼저 동작해야 한다. 이 단계의 목표는 사용자가 설정 파일을 직접 만지지 않고, Hermes가 사용할 “AI 두뇌 계정”을 연결하는 것이다.
먼저 에이전트가 아래를 직접 확인한다. 비밀값은 출력하지 않는다.
hermes doctor
hermes config check
가능하면 현재 설정 파일 존재 여부와 provider 관련 환경변수 이름만 확인한다.
python3 - <<'PY'
import os
from pathlib import Path
home = Path.home() / ".hermes"
print(f"Hermes 폴더: {'있음' if home.exists() else '없음'}")
print(f"config.yaml: {'있음' if (home / 'config.yaml').exists() else '없음'}")
print(f".env: {'있음' if (home / '.env').exists() else '없음'}")
for key in ["OPENROUTER_API_KEY", "ANTHROPIC_API_KEY", "OPENAI_API_KEY", "GOOGLE_API_KEY", "GEMINI_API_KEY", "HF_TOKEN"]:
print(f"{key}: {'설정됨' if os.environ.get(key) else '환경변수에는 없음'}")
PY
Windows PowerShell에서는 같은 목적의 확인을 PowerShell로 수행한다.
$homePath = Join-Path $HOME ".hermes"
"Hermes 폴더: " + (Test-Path $homePath)
"config.yaml: " + (Test-Path (Join-Path $homePath "config.yaml"))
".env: " + (Test-Path (Join-Path $homePath ".env"))
"OPENROUTER_API_KEY: " + [bool]$env:OPENROUTER_API_KEY
"ANTHROPIC_API_KEY: " + [bool]$env:ANTHROPIC_API_KEY
"GOOGLE_API_KEY: " + [bool]$env:GOOGLE_API_KEY
"GEMINI_API_KEY: " + [bool]$env:GEMINI_API_KEY
쉬운 설명:
hermes doctor: Hermes가 아픈 곳이 있는지 보는 건강검진config.yaml: 일반 설정이 들어 있는 파일.env: 비밀번호 같은 비밀 열쇠가 들어 있는 파일비개발자 수강생에게는 기본 추천안을 하나만 먼저 제시한다.
hermes setup --portalhermes model을 열고 브라우저 로그인만 사용자가 완료Nous Portal을 쓰는 경우:
hermes setup --portal
특정 provider/model 선택이 필요한 경우:
hermes model
API key를 직접 저장해야 하는 경우에는 사용자가 파일을 열지 않게 하고, 에이전트가 로컬 입력 프롬프트를 제공한다. 예시는 OpenRouter다.
python3 - <<'PY'
import getpass
import subprocess
key = getpass.getpass("OpenRouter API Key를 붙여넣으세요. 화면에는 보이지 않습니다: ").strip()
if not key:
raise SystemExit("키가 비어 있어 저장하지 않았습니다.")
subprocess.run(["hermes", "config", "set", "OPENROUTER_API_KEY", key], check=True)
subprocess.run(["hermes", "config", "set", "model", "openrouter/anthropic/claude-sonnet-4"], check=False)
print("OpenRouter 키 저장을 완료했습니다. 키 값은 출력하지 않았습니다.")
PY
다른 API key provider도 같은 방식으로 hermes config set KEY VALUE를 사용한다. 키 이름 예시는 ANTHROPIC_API_KEY, GOOGLE_API_KEY, GEMINI_API_KEY 등이다.
중요 조건:
hermes model에서 더 큰 context 모델을 선택한다.다음으로 로컬 채팅을 검증한다.
hermes doctor
hermes
Hermes가 열리면 간단히 질문한다.
내 현재 Hermes 설정이 정상인지 한 문장으로 답해줘.
성공 기준:
로컬 채팅이 실패하면 Discord 설정으로 넘어가지 말고 provider/model 문제부터 해결한다.
Discord Developer Portal에서 봇을 만든다.
Hermes Agent토큰을 채팅에 붙여넣지 않는다. 노출되면 즉시 Reset Token으로 재발급한다.
Bot → Privileged Gateway Intents에서 아래 두 항목을 켠다.
특히 Message Content Intent는 필수다. 이 항목이 꺼져 있으면 봇이 온라인이어도 메시지 내용을 읽지 못한다.
권장 방식:
bot, applications.commands수동 URL 방식:
https://discord.com/oauth2/authorize?client_id=YOUR_APP_ID&scope=bot+applications.commands&permissions=274878286912
YOUR_APP_ID를 Application ID로 바꾼다.
hermes gateway를 실행하기 전까지 Bot은 오프라인으로 보일 수 있다.
이 값은 username이 아니라 긴 숫자 ID다. Hermes allowlist에 이 값을 사용한다.
이 단계의 목표는 사용자가 ~/.hermes/.env 파일을 직접 열지 않게 하는 것이다. 에이전트가 Discord 연결값을 안전하게 저장하고, 사용자는 Bot Token은 비밀번호 입력창에, User ID는 일반 입력창에 붙여넣는다.
macOS / Linux / WSL에서는 아래 로컬 프롬프트를 사용한다. 토큰은 화면에 보이지 않는다.
python3 - <<'PY'
from pathlib import Path
import getpass
path = Path.home() / ".hermes" / ".env"
path.parent.mkdir(parents=True, exist_ok=True)
print("Discord Bot Token과 User ID를 Hermes에 저장합니다.")
print("토큰은 비밀번호처럼 화면에 보이지 않습니다. 채팅에 붙여넣지 마세요.")
token = getpass.getpass("Discord Bot Token: ").strip()
allowed = input("Discord User ID 숫자: ").strip()
home_channel = input("Home Channel ID (선택, 없으면 Enter): ").strip()
free_channels = input("Mention 없이 답할 Channel ID들 (선택, 쉼표 구분, 없으면 Enter): ").strip()
if not token:
raise SystemExit("Discord Bot Token이 비어 있어 저장하지 않았습니다.")
if not allowed:
raise SystemExit("Discord User ID가 비어 있어 저장하지 않았습니다.")
updates = {
"DISCORD_BOT_TOKEN": token,
"DISCORD_ALLOWED_USERS": allowed,
"DISCORD_REQUIRE_MENTION": "true",
}
if home_channel:
updates["DISCORD_HOME_CHANNEL"] = home_channel
if free_channels:
updates["DISCORD_FREE_RESPONSE_CHANNELS"] = free_channels
existing = {}
if path.exists():
for line in path.read_text().splitlines():
if "=" in line and not line.lstrip().startswith("#"):
k, v = line.split("=", 1)
existing[k] = v
existing.update(updates)
path.write_text("\n".join(f"{k}={v}" for k, v in existing.items()) + "\n")
print(f"저장 완료: {path}")
print("토큰 값은 출력하지 않았습니다.")
PY
Windows PowerShell에서는 아래를 사용한다.
$hermesDir = Join-Path $HOME ".hermes"
$envPath = Join-Path $hermesDir ".env"
New-Item -ItemType Directory -Force -Path $hermesDir | Out-Null
Write-Host "Discord Bot Token과 User ID를 Hermes에 저장합니다. 토큰은 화면에 보이지 않습니다."
$secureToken = Read-Host "Discord Bot Token" -AsSecureString
$ptr = [Runtime.InteropServices.Marshal]::SecureStringToBSTR($secureToken)
$token = [Runtime.InteropServices.Marshal]::PtrToStringBSTR($ptr)
[Runtime.InteropServices.Marshal]::ZeroFreeBSTR($ptr)
$userId = Read-Host "Discord User ID 숫자"
$homeChannel = Read-Host "Home Channel ID (선택, 없으면 Enter)"
$freeChannels = Read-Host "Mention 없이 답할 Channel ID들 (선택, 쉼표 구분, 없으면 Enter)"
if (-not $token) { throw "Discord Bot Token이 비어 있어 저장하지 않았습니다." }
if (-not $userId) { throw "Discord User ID가 비어 있어 저장하지 않았습니다." }
$lines = @(
"DISCORD_BOT_TOKEN=$token",
"DISCORD_ALLOWED_USERS=$userId",
"DISCORD_REQUIRE_MENTION=true"
)
if ($homeChannel) { $lines += "DISCORD_HOME_CHANNEL=$homeChannel" }
if ($freeChannels) { $lines += "DISCORD_FREE_RESPONSE_CHANNELS=$freeChannels" }
Set-Content -Path $envPath -Value $lines
Write-Host "저장 완료: $envPath"
Write-Host "토큰 값은 출력하지 않았습니다."
자동 저장이 실패하거나 Hermes가 추가 platform 설정을 요구할 때만 guided setup을 사용한다.
hermes gateway setup
프롬프트에서 Discord를 선택한다. Discord bot token과 allowed user ID는 로컬 터미널의 안전한 입력 흐름에 넣고, 채팅에는 쓰지 않는다.
Gateway를 실행한다.
hermes gateway
가능하면 다른 터미널에서 상태를 확인한다.
hermes gateway status
아래 순서대로 테스트한다.
Bot에게 DM을 보낸다.
안녕. 한 문장으로 지금 연결 상태를 알려줘.
성공 기준:
@mention 없이 Bot이 응답한다.Bot이 볼 수 있는 서버 채널에서 보낸다.
@HermesAgent 안녕. 지금 디스코드 연결 테스트 중이야.
성공 기준:
특정 채널에서 mention 없이 Hermes가 답하게 하려면 channel ID를 확인한 뒤 설정한다.
DISCORD_FREE_RESPONSE_CHANNELS=channel_id
설정 후 gateway를 재시작하고 해당 채널에서 일반 메시지를 테스트한다.
Hermes 설치와 Discord 연결이 끝난 뒤에만 업무 자동화 MVP를 고른다. 한 번에 여러 기능을 만들지 않는다.
빠른 완성 순서:
첫 MVP에서는 Gmail, Calendar, Notion 같은 실시간 OAuth 연동보다 샘플 텍스트 또는 간단한 파일 입력을 우선한다. 실시간 연동은 선택 확장이다.
문제가 생기면 아래 순서대로 진단한다. 한 번에 하나만 수정하고 같은 테스트로 재확인한다.
증상:
401, 403, unauthorized, forbidden, invalid_api_key, expired token, authentication expired, OAuth refresh 실패가 보인다.진단:
hermes doctor
hermes model
복구:
~/.hermes/.env에서 키를 교체한다.hermes model을 다시 실행하고 브라우저/device login을 완료한다.hermes setup --portal 또는 Hermes가 안내하는 Nous auth 경로를 사용한다.hermes gateway를 재시작해 Discord가 새 인증 정보를 읽게 한다.이 문제는 Discord token 재발급으로 해결하지 않는다. Discord 로그에 Discord 인증 실패가 있을 때만 Discord token을 확인한다.
증상:
429, rate limit, quota exceeded, server overloaded, 500, 502, 503, 연결 끊김이 보인다.복구:
hermes doctor로 기본 provider 설정이 정상인지 확인한다.hermes fallback
주의:
순서대로 확인한다.
hermes gateway가 실행 중인가?DISCORD_ALLOWED_USERS에 들어 있는가?DISCORD_ALLOWED_ROLES가 맞는가?DISCORD_IGNORED_CHANNELS에 들어 있거나 DISCORD_ALLOWED_CHANNELS에서 제외된 것은 아닌가?가장 흔한 해결책:
hermes gateway 재시작하기가능한 원인:
DISCORD_ALLOWED_USERS와 DISCORD_ALLOWED_ROLES가 비어 있거나 틀렸다.해결:
DISCORD_ALLOWED_USERS를 갱신한다.hermes gateway를 재시작한다.증상:
해결:
DISCORD_BOT_TOKEN을 갱신한다.토큰이 노출되었다면 무조건 재발급한다.
가능한 원인:
해결:
hermes gateway 재시작가능한 원인:
DISCORD_ALLOWED_USERS에 해당 사용자가 없다.해결:
bot, applications.commands를 포함해 다시 초대한다.274878286912를 사용한다..env 수정 후에도 옛 설정을 계속 씀가능한 원인:
해결:
hermes gateway를 중지한다.hermes 명령이 없음해결:
command -v hermes를 실행한다.Get-Command hermes를 실행한다.가능한 원인:
해결:
hermes model
더 큰 context window를 가진 모델을 선택한다.
해결:
hermes doctor를 실행한다.hermes model을 실행해 같은 provider를 다시 선택한다.hermes gateway가 같은 Hermes profile을 쓰는지 확인한다.해결:
applications.commands가 포함되었는지 확인한다.DISCORD_COMMAND_SYNC_POLICY를 확인한다. 기본값 safe가 보통 적절하다.권장:
~/.hermes/config.yaml에서 group_sessions_per_user: true를 유지한다.shared session의 위험:
무엇이든 이상하면 아래 순서대로 확인한다.
hermes doctor
hermes model
hermes setup
hermes sessions list
hermes --continue
hermes gateway status
해석:
hermes doctor가 실패하면 config/auth부터 고친다.hermes model이 실패하면 provider credential을 고친다.완료라고 말하기 전에 아래 항목을 확인하고 기록한다.
OS 확인: 완료/미완료
Hermes 설치: 완료/미완료
hermes --version: 확인/미확인
hermes doctor: 통과/경고/실패
Provider/model: 확인된 값 또는 미확인
Local Hermes chat: 성공/실패
Discord application 생성: 완료/미완료
Message Content Intent: ON/OFF/미확인
Server Members Intent: ON/OFF/미확인
DISCORD_ALLOWED_USERS 또는 ROLES: 설정/미설정
hermes gateway: 실행/실패
Discord DM test: 성공/실패
Discord server mention test: 성공/실패
주요 blocker: 없음 또는 구체적 원인
작업이 끝나면 실제 확인한 사실만 한국어로 보고한다.
완료된 것:
- OS: ...
- Hermes 설치: ...
- Provider/model: ...
- 로컬 Hermes 테스트: ...
- Discord 연결: ...
- Discord 테스트: ...
실행 방법:
- 로컬 Hermes: hermes
- Discord Gateway: hermes gateway
문제 발생 시 우선순위:
1. hermes doctor
2. hermes model
3. hermes gateway status
4. Discord Intent / allowed user / mention 확인
미완료 또는 외부 blocker:
- ...
확인하지 않은 기능은 성공했다고 말하지 않는다.