Webhooks
기준일: 2026-07-26
공식 기준: Webhooks
Webhooks 문서는 Hermes Agent 공식 문서(user-guide/messaging/webhooks)를 한국어로 정리한 가이드입니다. Receive events from GitHub, GitLab, and other services to trigger Hermes agent runs 명령·설정 키·코드 예시는 공식 문서를 그대로 보존하며, 해석과 절차 안내는 한국어로 제공합니다. 최종 동작은 설치 버전과 공식 원문을 확인하세요.
핵심 요약
Receive events from GitHub, GitLab, and other services to trigger Hermes agent runs
한국어 가이드 범위: user-guide/messaging/webhooks 경로의 설정·명령·제약·예시를 학습용으로 재구성합니다.
문서 구성
공식 문서의 주요 섹션은 다음과 같습니다.
- Webhooks
- Video Tutorial
- 빠른 시작
- 설정
- Via setup wizard
- Via environment variables
- Verify the server
- Configuring Routes {#configuring-routes}
- Route properties
- Full example
- Payload Filters
- Script Filters and Transforms
- ~/.hermes/scripts/todoist-hermes-label.py
- Prompt Templates
- Forum Topic Delivery
- GitHub PR Review (Step by Step) {#github-pr-review}
- 1. Create the webhook in GitHub
- 2. Add the route config
- 3. Ensure gh CLI is authenticated
- 4. Test it
- GitLab Webhook Setup {#gitlab-webhook-setup}
- 1. Create the webhook in GitLab
- 2. Add the route config
- Delivery Options {#delivery-options}
- Direct Delivery Mode {#direct-delivery-mode}
- When to use direct delivery
- Example: Telegram push from Supabase
- Example: Dynamic subscription via CLI
- Response codes
- Configuration gotchas
- Dynamic Subscriptions (CLI) {#dynamic-subscriptions}
- Create a subscription
- List subscriptions
- Remove a subscription
- Test a subscription
- How dynamic subscriptions work
- Agent-driven subscriptions
- Security {#security}
- HMAC signature validation
- Secret is required
상세 내용
Webhooks
Receive events from external services (GitHub, GitLab, JIRA, Stripe, etc.) and trigger Hermes agent runs automatically. The webhook adapter runs an HTTP server that accepts POST requests, validates HMAC signatures, transforms payloads into agent prompts, and routes responses back to the source or to another configured platform.
위 내용은 공식 문서의 해당 섹션 요지입니다. 세부 플래그·기본값은 원문을 확인하세요.
Video Tutorial
빠른 시작
- Enable via
hermes gateway setupor environment variables 2. Define routes inconfig.yamlor create them dynamically withhermes webhook subscribe3. Point your service athttp://your-server:8644/webhooks/
위 내용은 공식 문서의 해당 섹션 요지입니다. 세부 플래그·기본값은 원문을 확인하세요.
설정
There are two ways to enable the webhook adapter.
위 내용은 공식 문서의 해당 섹션 요지입니다. 세부 플래그·기본값은 원문을 확인하세요.
Via setup wizard
Follow the prompts to enable webhooks, set the port, and set a global HMAC secret.
위 내용은 공식 문서의 해당 섹션 요지입니다. 세부 플래그·기본값은 원문을 확인하세요.
hermes gateway setup
Via environment variables
WEBHOOK_ENABLED=true
WEBHOOK_PORT=8644 # default
WEBHOOK_SECRET=your-global-secret
Verify the server
curl http://localhost:8644/health
{"status": "ok", "platform": "webhook"}
Configuring Routes {#configuring-routes}
Routes define how different webhook sources are handled. Each route is a named entry under platforms.webhook.extra.routes in your config.yaml.
위 내용은 공식 문서의 해당 섹션 요지입니다. 세부 플래그·기본값은 원문을 확인하세요.
Route properties
| Property | Required | Description |
|---|---|---|
events |
No | List of event types to accept (e.g. ["pull_request"]). If empty, all events are accepted. Event type is read from X-GitHub-Event, X-GitLab-Event, or event_type in the payload. |
secret |
Yes | HMAC secret for signature validation. Falls back to the global secret if not set on the route. Set to "INSECURE_NO_AUTH" for testing only (skips validation). |
prompt |
No | Template string with dot-notation payload access (e.g. {pull_request.title}). If omitted, the full JSON payload is dumped into the prompt. Payload fields are untrusted — see Authenticated does not mean trusted. |
filters |
No | Declarative payload filters evaluated after auth/body/event filtering and before agent or direct delivery work. Non-matches return {"status":"ignored","reason":"filter"} with HTTP 200. |
script |
No | Filter/transform script under ~/.hermes/scripts/. The webhook payload is passed as JSON on stdin. JSON object stdout replaces the payload before templating; text stdout is exposed as script_output; empty stdout, [SILENT], or a nonzero exit code ignores the webhook. |
skills |
No | List of skill names to load for the agent run. |
deliver |
No | Where to send the response: github_comment, telegram, discord, slack, signal, sms, whatsapp, matrix, mattermost, homeassistant, email, dingtalk, feishu, wecom, weixin, bluebubbles, qqbot, or log (default). |
deliver_extra |
No | Additional delivery config — keys depend on deliver type (e.g. repo, pr_number, chat_id). Values support the same {dot.notation} templates as prompt. |
deliver_only |
No | If true, skip the agent entirely — the rendered prompt template becomes the literal message that gets delivered. Zero LLM cost, sub-second delivery. See Direct Delivery Mode for use cases. Requires deliver to be a real target (not log). |
Full example
주요 항목:
- field: "ref"
platforms:
webhook:
enabled: true
extra:
port: 8644
secret: "global-fallback-secret"
routes:
github-pr:
events: ["pull_request"]
secret: "github-webhook-secret"
prompt: |
Review this pull request:
Repository: {repository.full_name}
PR #{number}: {pull_request.title}
Author: {pull_request.user.login}
URL: {pull_request.html_url}
Diff URL: {pull_request.diff_url}
Action: {action}
skills: ["github-code-review"]
deliver: "github_comment"
deliver_extra:
repo: "{repository.full_name}"
pr_number: "{number}"
deploy-notify:
events: ["push"]
secret: "deploy-secret"
prompt: "New push to {repository.full_name} branch {ref}: {head_commit.message}"
filters:
- field: "ref"
equals: "refs/heads/main"
deliver: "telegram"
Payload Filters
Use filters when a provider sends a broad event stream but only some payloads should wake the agent or trigger deliver_only delivery. Filters run after signature validation, body parsing, and events, but before prompt rendering, idempotency, agent dispatch, or direct delivery.
위 내용은 공식 문서의 해당 섹션 요지입니다. 세부 플래그·기본값은 원문을 확인하세요.
주요 항목:
- field: "payload.labels"
- any:
- field: "payload.priority"
- field: "payload.project_id"
exists: true|falsemissing: trueequals/not_equalscontainsfor strings, lists, and dict keysinfor inline listsin_filefor JSON arrays, JSON objects (keys are used), or newline-delimited text filesregexall,any, andnotgroups
platforms:
webhook:
extra:
routes:
todoist:
events: ["item:updated"]
secret: "todoist-secret"
filters:
- field: "payload.labels"
contains: "hermes"
- any:
- field: "payload.priority"
equals: 4
- field: "payload.project_id"
in_file: "~/.hermes/data/todoist/watchlist.json"
prompt: "Todoist task changed: {payload.content}"
Script Filters and Transforms
Use script when declarative filters are not enough. Scripts must live under ~/.hermes/scripts/ for the active profile; relative paths resolve there, and path traversal outside that directory is blocked. .sh and .bash scripts run with bash, and all other extensions run with the current Python interpreter.
위 내용은 공식 문서의 해당 섹션 요지입니다. 세부 플래그·기본값은 원문을 확인하세요.
~/.hermes/scripts/todoist-hermes-label.py
payload = json.load(sys.stdin) labels = payload.get("payload", {}).get("labels", []) if "hermes" not in labels: print("[SILENT]") raise SystemExit(0)
위 내용은 공식 문서의 해당 섹션 요지입니다. 세부 플래그·기본값은 원문을 확인하세요.
주요 항목:
- JSON object stdout replaces the payload used by
promptanddeliver_extra. - Non-JSON text stdout is added to the payload as
script_output. - Empty stdout, exact
[SILENT],{"__hermes_ignore__": true}, timeout, missing script, or nonzero exit code returns HTTP 200 with{"status":"ignored","reason":"script"}.
Prompt Templates
Prompts use dot-notation to access nested fields in the webhook payload:
위 내용은 공식 문서의 해당 섹션 요지입니다. 세부 플래그·기본값은 원문을 확인하세요.
주요 항목:
{pull_request.title}resolves topayload["pull_request"]["title"]{repository.full_name}resolves topayload["repository"]["full_name"]{__raw__}— special token that dumps the entire payload as indented JSON (truncated at 4000 characters). Useful for monitoring alerts or generic webhooks where the agent needs the full context.- Missing keys are left as the literal
{key}string (no error) - Nested dicts and lists are JSON-serialized and truncated at 2000 characters
prompt: "PR #{pull_request.number} by {pull_request.user.login}: {__raw__}"
Forum Topic Delivery
When delivering webhook responses to Telegram, you can target a specific forum topic by including message_thread_id (or thread_id) in deliver_extra:
위 내용은 공식 문서의 해당 섹션 요지입니다. 세부 플래그·기본값은 원문을 확인하세요.
webhooks:
routes:
alerts:
events: ["alert"]
prompt: "Alert: {__raw__}"
deliver: "telegram"
deliver_extra:
chat_id: "-1001234567890"
message_thread_id: "42"
GitHub PR Review (Step by Step) {#github-pr-review}
This walkthrough sets up automatic code review on every pull request.
위 내용은 공식 문서의 해당 섹션 요지입니다. 세부 플래그·기본값은 원문을 확인하세요.
1. Create the webhook in GitHub
- Go to your repository → Settings → Webhooks → Add webhook 2. Set Payload URL to
http://your-server:8644/webhooks/github-pr3. Set Content type toapplication/json4. Set Secret to match your route config (e.g.github-webhook-secret) 5. Under Which events?, select Let me select individual events and check Pull requests 6. Click Add webhook
위 내용은 공식 문서의 해당 섹션 요지입니다. 세부 플래그·기본값은 원문을 확인하세요.
2. Add the route config
Add the github-pr route to your ~/.hermes/config.yaml as shown in the example above.
위 내용은 공식 문서의 해당 섹션 요지입니다. 세부 플래그·기본값은 원문을 확인하세요.
3. Ensure gh CLI is authenticated
The github_comment delivery type uses the GitHub CLI to post comments:
위 내용은 공식 문서의 해당 섹션 요지입니다. 세부 플래그·기본값은 원문을 확인하세요.
gh auth login
4. Test it
Open a pull request on the repository. The webhook fires, Hermes processes the event, and posts a review comment on the PR.
위 내용은 공식 문서의 해당 섹션 요지입니다. 세부 플래그·기본값은 원문을 확인하세요.
GitLab Webhook Setup {#gitlab-webhook-setup}
GitLab webhooks work similarly but use a different authentication mechanism. GitLab sends the secret as a plain X-Gitlab-Token header (exact string match, not HMAC).
위 내용은 공식 문서의 해당 섹션 요지입니다. 세부 플래그·기본값은 원문을 확인하세요.
1. Create the webhook in GitLab
- Go to your project → Settings → Webhooks 2. Set the URL to
http://your-server:8644/webhooks/gitlab-mr3. Enter your Secret token 4. Select Merge request events (and any other events you want) 5. Click Add webhook
위 내용은 공식 문서의 해당 섹션 요지입니다. 세부 플래그·기본값은 원문을 확인하세요.
2. Add the route config
platforms:
webhook:
enabled: true
extra:
routes:
gitlab-mr:
events: ["merge_request"]
secret: "your-gitlab-secret-token"
prompt: |
Review this merge request:
Project: {project.path_with_namespace}
MR !{object_attributes.iid}: {object_attributes.title}
Author: {object_attributes.last_commit.author.name}
URL: {object_attributes.url}
Action: {object_attributes.action}
deliver: "log"
Delivery Options {#delivery-options}
The deliver field controls where the agent's response goes after processing the webhook event.
위 내용은 공식 문서의 해당 섹션 요지입니다. 세부 플래그·기본값은 원문을 확인하세요.
| Deliver Type | Description |
|---|---|
log |
Logs the response to the gateway log output. This is the default and is useful for testing. |
github_comment |
Posts the response as a PR/issue comment via the gh CLI. Requires deliver_extra.repo and deliver_extra.pr_number. The gh CLI must be installed and authenticated on the gateway host (gh auth login). |
telegram |
Routes the response to Telegram. Uses the home channel, or specify chat_id in deliver_extra. |
discord |
Routes the response to Discord. Uses the home channel, or specify chat_id in deliver_extra. |
slack |
Routes the response to Slack. Uses the home channel, or specify chat_id in deliver_extra. |
signal |
Routes the response to Signal. Uses the home channel, or specify chat_id in deliver_extra. |
sms |
Routes the response to SMS via Twilio. Uses the home channel, or specify chat_id in deliver_extra. |
whatsapp |
Routes the response to WhatsApp. Uses the home channel, or specify chat_id in deliver_extra. |
matrix |
Routes the response to Matrix. Uses the home channel, or specify chat_id in deliver_extra. |
mattermost |
Routes the response to Mattermost. Uses the home channel, or specify chat_id in deliver_extra. |
homeassistant |
Routes the response to Home Assistant. Uses the home channel, or specify chat_id in deliver_extra. |
email |
Routes the response to Email. Uses the home channel, or specify chat_id in deliver_extra. |
dingtalk |
Routes the response to DingTalk. Uses the home channel, or specify chat_id in deliver_extra. |
feishu |
Routes the response to Feishu/Lark. Uses the home channel, or specify chat_id in deliver_extra. |
wecom |
Routes the response to WeCom. Uses the home channel, or specify chat_id in deliver_extra. |
weixin |
Routes the response to Weixin (WeChat). Uses the home channel, or specify chat_id in deliver_extra. |
bluebubbles |
Routes the response to BlueBubbles (iMessage). Uses the home channel, or specify chat_id in deliver_extra. |
Direct Delivery Mode {#direct-delivery-mode}
By default, every webhook POST triggers an agent run — the payload becomes a prompt, the agent processes it, and the agent's response is delivered. This costs LLM tokens on every event.
위 내용은 공식 문서의 해당 섹션 요지입니다. 세부 플래그·기본값은 원문을 확인하세요.
When to use direct delivery
주요 항목:
- External service push — Supabase/Firebase webhook fires on a database change → notify a user in Telegram instantly
- Monitoring alerts — Datadog/Grafana alert webhook → push to a Discord channel
- Inter-agent pings — Agent A notifies Agent B's user that a long-running task finished
- Background job completion — Cron job finishes → post result to Slack
- Zero LLM tokens — the agent is never invoked
- Sub-second delivery — a single adapter call, no reasoning loop
- Same security as agent mode — HMAC auth, rate limits, idempotency, and body-size limits all still apply
- Synchronous response — the POST returns
200 OKonce delivery succeeds, or502if the target rejects it, so your upstream service can retry intelligently
Example: Telegram push from Supabase
Your Supabase edge function signs the payload with HMAC-SHA256 and POSTs to https://your-server:8644/webhooks/antenna-matches. The webhook adapter validates the signature, renders the template from the payload, delivers to Telegram, and returns 200 OK.
위 내용은 공식 문서의 해당 섹션 요지입니다. 세부 플래그·기본값은 원문을 확인하세요.
platforms:
webhook:
enabled: true
extra:
port: 8644
secret: "global-secret"
routes:
antenna-matches:
secret: "antenna-webhook-secret"
deliver: "telegram"
deliver_only: true
prompt: "🎉 New match: {match.user_name} matched with you!"
deliver_extra:
chat_id: "{match.telegram_chat_id}"
Example: Dynamic subscription via CLI
hermes webhook subscribe antenna-matches \
--deliver telegram \
--deliver-chat-id "123456789" \
--deliver-only \
--prompt "🎉 New match: {match.user_name} matched with you!" \
--description "Antenna match notifications"
Response codes
| Status | Meaning |
|---|---|
200 OK |
Delivered successfully. Body: {"status": "delivered", "route": "...", "target": "...", "delivery_id": "..."} |
200 OK (status=duplicate) |
Duplicate X-GitHub-Delivery ID within the idempotency TTL (1 hour). Not re-delivered. |
401 Unauthorized |
HMAC signature invalid or missing. |
400 Bad Request |
Malformed JSON body. |
404 Not Found |
Unknown route name. |
413 Payload Too Large |
Body exceeded max_body_bytes. |
429 Too Many Requests |
Route rate limit exceeded. |
502 Bad Gateway |
Target adapter rejected the message or raised. The error is logged server-side; the response body is a generic Delivery failed to avoid leaking adapter internals. |
Configuration gotchas
주요 항목:
deliver_only: truerequiresdeliverto be a real target.deliver: log(or omittingdeliver) is rejected at startup — the adapter refuses to start if it finds a misconfigured route.- The
skillsfield is ignored in direct delivery mode (no agent runs, so there's nothing to inject skills into). - Template rendering uses the same
{dot.notation}syntax as agent mode, including the{__raw__}token. - Idempotency uses the same
X-GitHub-Delivery/X-Request-IDheader — retries with the same ID returnstatus=duplicateand do NOT re-deliver.
Dynamic Subscriptions (CLI) {#dynamic-subscriptions}
In addition to static routes in config.yaml, you can create webhook subscriptions dynamically using the hermes webhook CLI command. This is especially useful when the agent itself needs to set up event-driven triggers.
위 내용은 공식 문서의 해당 섹션 요지입니다. 세부 플래그·기본값은 원문을 확인하세요.
Create a subscription
This returns the webhook URL and an auto-generated HMAC secret. Configure your service to POST to that URL.
위 내용은 공식 문서의 해당 섹션 요지입니다. 세부 플래그·기본값은 원문을 확인하세요.
hermes webhook subscribe github-issues \
--events "issues" \
--prompt "New issue #{issue.number}: {issue.title}\nBy: {issue.user.login}\n\n{issue.body}" \
--deliver telegram \
--deliver-chat-id "-100123456789" \
--description "Triage new GitHub issues"
List subscriptions
hermes webhook list
Remove a subscription
hermes webhook remove github-issues
Test a subscription
hermes webhook test github-issues
hermes webhook test github-issues --payload '{"issue": {"number": 42, "title": "Test"}}'
How dynamic subscriptions work
주요 항목:
- Subscriptions are stored in
~/.hermes/webhook_subscriptions.json - The webhook adapter hot-reloads this file on each incoming request (mtime-gated, negligible overhead)
- Static routes from
config.yamlalways take precedence over dynamic ones with the same name - Dynamic subscriptions use the same route format and capabilities as static routes (events, prompt templates, skills, delivery)
- No gateway restart required — subscribe and it's immediately live
Agent-driven subscriptions
The agent can create subscriptions via the terminal tool when guided by the webhook-subscriptions skill. Ask the agent to "set up a webhook for GitHub issues" and it will run the appropriate hermes webhook subscribe command.
위 내용은 공식 문서의 해당 섹션 요지입니다. 세부 플래그·기본값은 원문을 확인하세요.
Security {#security}
The webhook adapter includes multiple layers of security:
위 내용은 공식 문서의 해당 섹션 요지입니다. 세부 플래그·기본값은 원문을 확인하세요.
HMAC signature validation
The adapter validates incoming webhook signatures using the appropriate method for each source:
위 내용은 공식 문서의 해당 섹션 요지입니다. 세부 플래그·기본값은 원문을 확인하세요.
주요 항목:
- GitHub:
X-Hub-Signature-256header — HMAC-SHA256 hex digest prefixed withsha256= - GitLab:
X-Gitlab-Tokenheader — plain secret string match - Generic (V2, recommended):
X-Webhook-Signature-V2+X-Webhook-Timestampheaders — HMAC-SHA256 hex digest of<timestamp>.<body>. The timestamp (Unix seconds) must be within ±300 seconds of the server clock, which prevents captured requests from being replayed later. - Generic (V1, legacy):
X-Webhook-Signatureheader — raw HMAC-SHA256 hex digest of the body only. Still accepted for backward compatibility, but it has no replay protection (a captured request replays indefinitely); the gateway logs a deprecation warning once per route. Switch senders to V2.
Secret is required
Every route must have a secret — either set directly on the route or inherited from the global secret. Routes without a secret cause the adapter to fail at startup with an error. For development/testing only, you can set the secret to "INSECURE_NO_AUTH" to skip validation entirely.
위 내용은 공식 문서의 해당 섹션 요지입니다. 세부 플래그·기본값은 원문을 확인하세요.
Rate limiting
Each route is rate-limited to 30 requests per minute by default (fixed-window). Configure this globally:
위 내용은 공식 문서의 해당 섹션 요지입니다. 세부 플래그·기본값은 원문을 확인하세요.
platforms:
webhook:
extra:
rate_limit: 60 # requests per minute
Idempotency
Delivery IDs (from X-GitHub-Delivery, X-Request-ID, or a timestamp fallback) are cached for 1 hour. Duplicate deliveries (e.g. webhook retries) are silently skipped with a 200 response, preventing duplicate agent runs.
위 내용은 공식 문서의 해당 섹션 요지입니다. 세부 플래그·기본값은 원문을 확인하세요.
Body size limits
Payloads exceeding 1 MB are rejected before the body is read. Configure this:
위 내용은 공식 문서의 해당 섹션 요지입니다. 세부 플래그·기본값은 원문을 확인하세요.
platforms:
webhook:
extra:
max_body_bytes: 2097152 # 2 MB
Authenticated does not mean trusted
This is the same trust model that applies to everything the agent reads: web pages, files, and tool output are all untrusted input. Hermes does not — and cannot reliably — sanitize untrusted text with a blocklist; phrasing, encoding, and translation make that trivially bypassable. The trust boundary is the agent's capability surface, not the input channel. Harden there:
위 내용은 공식 문서의 해당 섹션 요지입니다. 세부 플래그·기본값은 원문을 확인하세요.
주요 항목:
- Sandbox the runtime. Run the gateway with the Docker or SSH terminal backend (or in a VM) when exposed to the internet, so a hijacked turn cannot touch the host.
- Scope the toolset. Disable
terminal,file, and outbound-action tools on webhook-triggered sessions if the route only needs to read and summarize. Fewer capabilities means a smaller blast radius if a payload field carries injected instructions. - Keep approvals on for any destructive or outbound operation, so an injected instruction cannot act unattended.
- Template narrowly. Prefer a specific
promptwith named fields ({pull_request.title}) over{__raw__}or an empty template that dumps the whole payload, so only the fields you intend reach the prompt.
Troubleshooting {#troubleshooting}
이 섹션의 세부 항목은 공식 문서 Troubleshooting {#troubleshooting}를 참고하세요.
Webhook not arriving
주요 항목:
- Verify the port is exposed and accessible from the webhook source
- Check firewall rules — port
8644(or your configured port) must be open - Verify the URL path matches:
http://your-server:8644/webhooks/<route-name> - Use the
/healthendpoint to confirm the server is running
Signature validation failing
주요 항목:
- Ensure the secret in your route config exactly matches the secret configured in the webhook source
- For GitHub, the secret is HMAC-based — check
X-Hub-Signature-256 - For GitLab, the secret is a plain token match — check
X-Gitlab-Token - Check gateway logs for
Invalid signaturewarnings
Event being ignored
주요 항목:
- Check that the event type is in your route's
eventslist - GitHub events use values like
pull_request,push,issues(theX-GitHub-Eventheader value) - GitLab events use values like
merge_request,push(theX-GitLab-Eventheader value) - If
eventsis empty or not set, all events are accepted
Agent not responding
주요 항목:
- Run the gateway in foreground to see logs:
hermes gateway run - Check that the prompt template is rendering correctly
- Verify the delivery target is configured and connected
Duplicate responses
주요 항목:
- The idempotency cache should prevent this — check that the webhook source is sending a delivery ID header (
X-GitHub-DeliveryorX-Request-ID) - Delivery IDs are cached for 1 hour
실습 체크리스트
- 공식 문서와 설치된 Hermes 버전을 대조합니다.
- 관련 CLI는
hermes --help및 하위 명령--help로 확인합니다. - Gateway·메시징 변경 후
hermes gateway재시작을 검토합니다. - 시크릿·토큰은 환경 변수/시크릿 매니저에만 둡니다.
자주 쓰는 명령·설정 예시
hermes gateway setup
WEBHOOK_ENABLED=true
WEBHOOK_PORT=8644 # default
WEBHOOK_SECRET=your-global-secret
curl http://localhost:8644/health
{"status": "ok", "platform": "webhook"}
platforms:
webhook:
enabled: true
extra:
port: 8644
secret: "global-fallback-secret"
routes:
github-pr:
events: ["pull_request"]
secret: "github-webhook-secret"
prompt: |
Review this pull request:
Repository: {repository.full_name}
PR #{number}: {pull_request.title}
Author: {pull_request.user.login}
URL: {pull_request.html_url}
Diff URL: {pull_request.diff_url}
Action: {action}
skills: ["github-code-review"]
deliver: "github_comment"
deliver_extra:
repo: "{repository.full_name}"
pr_number: "{number}"
deploy-notify:
events: ["push"]
secret: "deploy-secret"
prompt: "New push to {repository.full_name} branch {ref}: {head_commit.message}"
filters:
- field: "ref"
equals: "refs/heads/main"
deliver: "telegram"
platforms:
webhook:
extra:
routes:
todoist:
events: ["item:updated"]
secret: "todoist-secret"
filters:
- field: "payload.labels"
contains: "hermes"
- any:
- field: "payload.priority"
equals: 4
- field: "payload.project_id"
in_file: "~/.hermes/data/todoist/watchlist.json"
prompt: "Todoist task changed: {payload.content}"
# ~/.hermes/scripts/todoist-hermes-label.py
payload = json.load(sys.stdin)
labels = payload.get("payload", {}).get("labels", [])
if "hermes" not in labels:
print("[SILENT]")
raise SystemExit(0)
payload["body"] = payload["payload"]["content"]
print(json.dumps(payload))
prompt: "PR #{pull_request.number} by {pull_request.user.login}: {__raw__}"
관련 링크
이 가이드는 공식 문서를 한국어 학습용으로 재구성한 것입니다. 옵션 기본값·API 이름은 설치 버전에 따라 달라질 수 있습니다.