1. 사업의 개요
+11 −11예시전자(가상)는 산업용 센서와 관제 소프트웨어를 개발합니다. 국내 매출 비중은 82%이며74%이며 해외 법인은 2곳입니다.3곳입니다.
항목별로 바뀐 곳을 칠하고, 바뀐 숫자만 모아 요약합니다.
레거시 attachment를 Block Kit으로 바꾸고 5개 언어 전송 코드를 만듭니다.
붙여넣은 내용은 서버로 보내지 않습니다.
공시 문서는 매년 비슷한 문장에 숫자만 조금씩 바뀝니다. 사람이 두 파일을 나란히 놓고 찾던 일을 항목 단위로 나눠 비교하고, 바뀐 숫자를 따로 뽑아 요약합니다. 비교는 jsdiff로 하되, 1,820억원 같은 숫자가 쉼표에서 쪼개지지 않도록 공백 단위로 자른 토큰을 비교합니다.
규칙으로 만든 요약입니다. LLM 요약을 붙일 때도 이 목록만 근거로 쓰게 해서 없는 변경을 지어내지 않도록 합니다.
예시전자(가상)는 산업용 센서와 관제 소프트웨어를 개발합니다. 국내 매출 비중은 82%이며74%이며 해외 법인은 2곳입니다.3곳입니다.
주력 제품은 온도·진동 센서 S-200과S-300과 관제 플랫폼 Watch입니다. Watch는 연간 구독 방식으로 판매합니다.판매하며, 올해부터 AI 이상 탐지 기능을 유료 옵션으로 제공합니다.
당기 매출액은 1,820억원으로2,140억원으로 전기 대비 6.1%17.6% 증가했습니다. 수주잔고는 640억원입니다.910억원입니다.
연구개발비는 매출액의 11.2%인10.4%인 204억원이며,223억원이며, 연구 인력은 138명입니다.151명입니다.
해외 매출 확대에 따라 환율 변동 위험이 커졌습니다.
1., Ⅱ., 가., ## 같은 제목 줄로 문서를 항목으로 자릅니다.다음 단계는 OpenDART에서 같은 회사의 두 해 보고서를 받아 자동으로 넣는 것입니다. 이 데이터는 공개자료 챗봇과 같이 씁니다.
오래된 알림 코드는 아직 attachments의 color, fields, footer를 씁니다. Slack은 이 형식을 레거시로 분류하고 Block Kit을 권장합니다. 붙여넣으면 Block Kit으로 바꾸고, 바꾼 메시지를 보내는 코드를 언어별로 만들어 줍니다.
Slack에서 보이는 모습
deploy-bot 앱
배포가 끝났습니다
curl -X POST "$SLACK_WEBHOOK_URL" \
-H 'Content-Type: application/json' \
-d '{"text":"배포가 끝났습니다","blocks":[{"type":"section","text":{"type":"mrkdwn","text":"배포가 끝났습니다"}}],"attachments":[{"color":"#36a64f","blocks":[{"type":"context","elements":[{"type":"mrkdwn","text":"deploy-bot"}]},{"type":"section","text":{"type":"mrkdwn","text":"*<https://example.com/releases/2.4.1|api-server v2.4.1>*\n변경 12건, 마이그레이션 1건이 포함되었습니다."}},{"type":"section","fields":[{"type":"mrkdwn","text":"*환경*\nproduction"},{"type":"mrkdwn","text":"*소요 시간*\n3분 42초"},{"type":"mrkdwn","text":"*승인자*\n@ops-lead"}]},{"type":"actions","elements":[{"type":"button","text":{"type":"plain_text","text":"릴리스 노트"},"url":"https://example.com/releases/2.4.1","action_id":"action_0"}]},{"type":"context","elements":[{"type":"mrkdwn","text":"GitHub Actions | <!date^1760659200^{date_short_pretty} {time}|2025-10-17T00:00:00.000Z>"}]}]}]}'웹훅 주소는 코드에 넣지 않고 SLACK_WEBHOOK_URL 환경변수로 받습니다. 블록 6개.
| 레거시 필드 | Block Kit |
|---|---|
pretext | 맨 위 section |
author_name, author_icon | context (이미지 + 텍스트) |
title, title_link, text | section mrkdwn, thumb_url은 accessory 이미지 |
fields | section.fields 10개씩 나눔 |
image_url | image |
actions 버튼 | actions + button |
footer, ts | context, 시간은 <!date^...>로 보는 사람의 시간대에 맞춤 |
color | Block Kit에는 없음. 옵션을 켜면 attachments[].blocks로 감싸 막대를 유지 |
레거시 시스템의 웹훅 주소만 바꿔 끼우면 되는 작은 서버입니다. 받은 메시지를 같은 규칙으로 바꿔 진짜 Slack 웹훅으로 넘깁니다.
// relay/server.mjs — Node 20+, 의존성 없음
import { createServer } from 'node:http'
import { toBlocks } from './convert.mjs' // 위 변환기와 같은 규칙
const routes = JSON.parse(process.env.RELAY_ROUTES) // { "deploy": "https://hooks.slack.com/..." }
createServer(async (req, res) => {
const name = req.url.split('/').pop()
if (req.method !== 'POST' || !routes[name]) return res.writeHead(404).end()
const legacy = JSON.parse(await new Response(req).text())
const out = await fetch(routes[name], {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(toBlocks(legacy, { keepColor: true })),
})
res.writeHead(out.status).end(await out.text())
}).listen(8787)웹훅 주소는 환경변수로만 받고, 로그에는 경로 이름과 응답 코드만 남깁니다.
포스트잇처럼 떠오를 때마다 하나씩 붙이는 도구 모음입니다. 각 도구는 입력 하나, 결과 하나로 끝나는 크기로 만들고, 쓸 만해지면 별도 서비스로 떼어냅니다. 아래 두 개는 이 페이지에서 바로 써볼 수 있습니다.
vibe-post-it/
├── Makefile # make dev / test / new NAME=...
├── tools/
│ ├── report-diff/ # 사업보고서 버전 비교 + 변경 요약
│ ├── slack-blocks/ # 레거시 attachment → Block Kit 변환
│ └── _template/ # 새 도구 뼈대
├── relay/ # 선택: 레거시 웹훅을 받아 변환 후 전달하는 작은 서버
└── packages/ui/ # 공통 입력창·결과 프레임