답변 대기를 밖으로 보내기

답을 기다리는 티켓이 하나 생기면 그 사실만 앱 밖으로 내보낼 수 있습니다. 설정웹훅에 주소 한 줄을 넣으면 새로 선 답변 대기가 그 주소로 나갑니다. Slack에 붙이면 방에 한 줄이 섭니다.

한 방향입니다. 나가기만 하고 밖에서 들어오는 자리는 없습니다(이 장 마지막 절).

주소 붙이기

우측 위 톱니바퀴로 설정을 열고 왼쪽 트리에서 웹훅을 고르세요. 트리를 훑기 싫으면 검색칸에 웹훅을 치시면 됩니다.

  1. 주소 칸에 받는 쪽 주소를 넣고 저장을 누릅니다. Slack이라면 그 방의 incoming webhook 주소입니다. 앱을 설치하거나 봇을 만들 일은 없습니다. 주소 한 줄이 전부입니다.
  2. https로 시작하지 않으면 저장이 거절되고 https 주소만 받습니다가 섭니다. 파일은 안 갈립니다. 주소 자체가 비밀이라(아래 §주소는 비밀입니다) 평문으로 나갈 수 없습니다.
  3. 저장되면 그 아래 한 줄이 보내지 않습니다에서 가린 요약으로 바뀝니다. 남는 것은 스킴과 호스트까지고 그 뒤는 /…로 접힙니다. 원문은 다시 그리지 않습니다.
  4. 테스트 보내기를 누르세요. 보냈습니다가 서면 그 주소로 실제로 한 건이 들어간 것입니다. 못 갔으면 보내지 못했습니다 - <호스트> <사유>가 같은 자리에 섭니다. 저장된 주소가 없으면 이 버튼은 꺼져 있습니다. 보낼 곳이 없으니까요.

테스트 보내기가 보내는 값은 그 순간 답변 대기 첫 건입니다. 0건이면 자리표시 한 벌이 나가서 갓 만든 큐에서도 눌립니다. 테스트는 실제 사건을 쓰지 않습니다. 아직 안 나간 티켓이 테스트에 실려 갔어도 제 차례가 오면 그 티켓의 줄이 따로 한 번 나갑니다.

끄려면 칸을 비우고 저장하세요. 그 줄이 보내지 않습니다로 돌아옵니다.

언제 나가나

  • 새로 선 답변 대기 하나에 한 줄입니다. 앱이 15초마다 확인합니다.
  • 같은 티켓은 한 번입니다. 그 티켓이 답변 대기로 사흘을 서 있어도 줄은 하나입니다.
  • 앱을 켠 직후에 이미 서 있던 것은 안 나갑니다. 첫 확인은 지금 무엇이 답변 대기인지를 조용히 적어 두기만 하고, 그 뒤에 새로 생긴 것부터 보냅니다. 켤 때마다 밀린 것이 쏟아지면 그 방을 다음 주에 끄게 되니까요. 앱이 꺼져 있던 사이에 생긴 것도 같은 이유로 안 옵니다. 밀린 것들은 종과 보드에 서 있습니다.
  • 답이 붙어 풀린 것은 안 보냅니다. 답을 쓰면 종에서는 내려가지만 그 사실이 밖으로 따라 나가지는 않습니다.
  • 답변 대기 하나뿐입니다. 종에 서는 나머지 여섯은 나가지 않습니다. 사람이 답을 써야 큐가 다시 도는 상태는 이것 하나뿐이니까요(화면 소개 §알림 종).

무엇이 나가나

POST 하나, content-type: application/json, 본문은 키 다섯입니다.

{
  "text": "답변 대기: 매뉴얼이 웹훅을 말한다 - dira GUI (1ce93426)",
  "project": "dira-gui",
  "hash": "1ce93426",
  "title": "매뉴얼이 웹훅을 말한다",
  "at": "2026-08-20T01:26:23.000Z"
}
json

text 한 칸에 제목과 프로젝트와 해시가 다 들어 있습니다. Slack 계열은 그 키 하나만 보고 줄을 그립니다. 그래서 주소만 붙여도 읽을 수 있는 한 줄이 섭니다. 거기 서는 프로젝트 이름은 화면에서 보시는 그 이름입니다. 보드에 dira GUI로 서 있으면 방에도 dira GUI가 갑니다. project 칸은 다릅니다. 등록할 때 정해져 주소에 쓰이는 슬러그(dira-gui)라, 나중에 이름을 바꿔도 따라오지 않습니다. 사람이 읽는 칸은 text, 코드가 프로젝트를 가르는 칸은 project입니다. 문장의 언어는 설정언어를 따릅니다. at은 UTC입니다.

안 나가는 것은 이렇습니다. 티켓 본문, ## 질문 n 절과 선택지, 사람이 쓴 답, 큐 루트 경로, 페르소나와 워커 이름, 토큰, 티켓 파일 이름. 위 다섯 칸이 전부입니다. 그래서 이 줄을 받아도 티켓을 열 수는 없습니다. 해시는 사람이 눈으로 대조하는 표시값이고 링크가 아닙니다. 받는 쪽이 열 주소는 이 컴퓨터의 localhost라 원격에서는 안 열리니까요.

받는 쪽 - 되는 것과 안 되는 것

받는 쪽어떻게 보이나
Slack그대로 한 줄이 섭니다. text 하나를 보는 쪽이라 붙이는 것으로 끝입니다
Discord줄이 안 그려집니다. 그쪽이 보는 키는 content입니다. 요청 자체는 가고 JSON도 그대로 남습니다
Lark, DingTalk, WeCom안 받습니다. msg_type이나 msgtype과 중첩 객체를 요구해서 이 본문으로는 아무것도 안 그려집니다. 붙여 놓고 기다리지 마세요
내가 띄운 서버나 스크립트됩니다. POST 본문을 JSON으로 읽고 5초 안에 응답하면 그만입니다

주소는 비밀입니다

그 주소를 아는 사람은 누구나 그 방에 글을 씁니다. 서명 헤더도 토큰도 안 붙습니다. 주소 한 줄이 열쇠입니다. 그 줄을 받은 사람은 이 앱 없이도 그 방에 글을 넣습니다.

  • 남에게 넘기지 마세요. 이슈, 스크린샷, 커밋, 채팅에 붙이면 그 방이 열립니다. 저장한 뒤 화면이 원문을 다시 안 그리는 이유가 이것입니다.
  • 파일은 ~/.config/dira/webhook.json 하나이고 권한이 0600입니다. 이 컴퓨터의 주인만 읽고 씁니다. 큐(.dira) 안에는 두지 않습니다. 큐는 프로젝트 폴더 안이라 커밋도 백업도 동기화도 타는 자리입니다. 같은 큐를 두 컴퓨터가 열면 같은 사건이 두 번 나가기도 합니다.
  • 이 컴퓨터의 설정이고 주소는 하나입니다. 등록된 프로젝트 전부가 그 주소를 같이 씁니다. 어느 프로젝트에서 온 줄인지는 본문의 project가 말합니다.
  • 로그에도 주소 전문을 안 적습니다. 실패 한 줄에 드는 것은 호스트까지입니다.

지우려면 아래 한 줄이면 됩니다. 화면에서 칸을 비우고 저장하는 것과 같은 결과입니다.

rm ~/.config/dira/webhook.json
bash

못 보냈을 때

  • 다시 보내지 않습니다. 한 사건에 한 번입니다. 주소가 틀렸거나 받는 쪽이 죽어 있었으면 그 티켓의 줄은 영영 오지 않습니다. 주소를 고쳐도 지난 것이 밀려 오지는 않습니다.
  • 그래도 사실을 잃지는 않습니다. 답변 대기는 상태입니다. 종의 답변을 기다리는 티켓과 보드와 데스크톱 알림이 그 티켓을 계속 말하고 있습니다. 웹훅은 둘째 채널이고 원본이 아닙니다.
  • 화면은 배경 실패를 말하지 않습니다. 종에 항목이 늘지 않습니다. 못 나간 것은 큐를 막지 않고 사람이 손을 댈 것은 이미 종에 서 있으니까요.
  • 남는 것은 서버 로그 한 줄입니다. [dira] 웹훅 실패: <호스트> <사유> 꼴로 앱을 띄운 터미널에 찍힙니다(로그 읽는 법의 큐 로그와는 다른 자리입니다).
  • 주소가 살아 있는지는 사람이 눌러서 압니다. 그 판정을 내는 자리가 테스트 보내기 하나입니다. 받는 쪽을 바꿨으면 한 번 누르고 넘어가세요.

들어오는 웹훅은 없습니다

밖에서 이 큐를 깨울 수는 없습니다. 이 앱에는 듣는 포트가 없습니다. 요청을 받는 서버로 서지 않으니까요. Slack에서 명령을 보내 티켓을 만들거나 세션을 띄우는 길도 없습니다. 티켓이 들어오는 문은 화면과 큐 폴더의 파일, 그 둘입니다.

다음은 마치면서입니다.