refactor: remove legacy multi-agent-mux skills and infrastructure, and add Mattermost notification script and collaboration documentation
This commit is contained in:
Executable
+138
@@ -0,0 +1,138 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
"""
|
||||
Mattermost Incoming Webhook 알림 송신 유틸리티 스크립트.
|
||||
3인 연구팀의 협업 환경 및 빌드/테스트/실험 결과 전송용으로 사용됩니다.
|
||||
"""
|
||||
|
||||
import os
|
||||
import sys
|
||||
import json
|
||||
import argparse
|
||||
import urllib.request
|
||||
from urllib.error import URLError, HTTPError
|
||||
|
||||
def load_env(env_path=".env"):
|
||||
""".env 파일에서 환경 변수를 로드합니다."""
|
||||
if os.path.exists(env_path):
|
||||
with open(env_path, "r", encoding="utf-8") as f:
|
||||
for line in f:
|
||||
line = line.strip()
|
||||
if not line or line.startswith("#"):
|
||||
continue
|
||||
if "=" in line:
|
||||
key, value = line.split("=", 1)
|
||||
os.environ[key.strip()] = value.strip().strip('"').strip("'")
|
||||
|
||||
def send_mattermost_message(webhook_url, text, username=None, icon_emoji=None, attachments=None):
|
||||
"""
|
||||
Mattermost Webhook으로 POST 요청을 보냅니다.
|
||||
"""
|
||||
payload = {
|
||||
"text": text
|
||||
}
|
||||
if username:
|
||||
payload["username"] = username
|
||||
if icon_emoji:
|
||||
payload["icon_emoji"] = icon_emoji
|
||||
if attachments:
|
||||
payload["attachments"] = attachments
|
||||
|
||||
data = json.dumps(payload).encode("utf-8")
|
||||
req = urllib.request.Request(
|
||||
webhook_url,
|
||||
data=data,
|
||||
headers={"Content-Type": "application/json"}
|
||||
)
|
||||
|
||||
try:
|
||||
with urllib.request.urlopen(req) as response:
|
||||
if response.status in [200, 201]:
|
||||
return True, "SUCCESS"
|
||||
else:
|
||||
return False, f"Unexpected response status: {response.status}"
|
||||
except HTTPError as e:
|
||||
return False, f"HTTP Error {e.code}: {e.reason}"
|
||||
except URLError as e:
|
||||
return False, f"URL Error: {e.reason}"
|
||||
except Exception as e:
|
||||
return False, f"General Error: {str(e)}"
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser(description="Mattermost webhook notification CLI utility.")
|
||||
parser.add_argument("--message", "-m", required=True, help="송신할 메시지 본문 (Markdown 포맷 지원)")
|
||||
parser.add_argument("--title", "-t", help="메시지 첨부 카드 제목")
|
||||
parser.add_argument("--level", "-l", choices=["info", "warning", "error", "success"], default="info", help="알림 레벨")
|
||||
parser.add_argument("--author", "-a", default="Multi-Agent-Backplane", help="송신자 이름")
|
||||
parser.add_argument("--env", default=".env", help="환경 변수 파일 경로")
|
||||
|
||||
args = parser.parse_args()
|
||||
|
||||
# 환경 변수 로드
|
||||
load_env(args.env)
|
||||
|
||||
webhook_url = os.environ.get("MATTERMOST_WEBHOOK_URL")
|
||||
if not webhook_url:
|
||||
print("[ERROR] MATTERMOST_WEBHOOK_URL 환경변수가 설정되지 않았습니다.", file=sys.stderr)
|
||||
print("💡 로컬의 .env 파일에 'MATTERMOST_WEBHOOK_URL=웹훅주소' 형태로 추가하거나 셸 환경변수를 설정하십시오.", file=sys.stderr)
|
||||
sys.exit(1)
|
||||
|
||||
# 알림 레벨별 색상 및 이모지 설정
|
||||
colors = {
|
||||
"info": "#2196F3", # Blue
|
||||
"warning": "#FF9800", # Orange
|
||||
"error": "#F44336", # Red
|
||||
"success": "#4CAF50" # Green
|
||||
}
|
||||
emojis = {
|
||||
"info": ":information_source:",
|
||||
"warning": ":warning:",
|
||||
"error": ":x:",
|
||||
"success": ":white_check_mark:"
|
||||
}
|
||||
|
||||
color = colors.get(args.level)
|
||||
emoji = emojis.get(args.level)
|
||||
|
||||
username = f"{args.author} {emoji}"
|
||||
|
||||
attachments = None
|
||||
if args.title:
|
||||
attachments = [{
|
||||
"fallback": f"[{args.level.upper()}] {args.title}",
|
||||
"color": color,
|
||||
"title": args.title,
|
||||
"text": args.message,
|
||||
"fields": [
|
||||
{
|
||||
"short": True,
|
||||
"title": "Notification Level",
|
||||
"value": args.level.upper()
|
||||
},
|
||||
{
|
||||
"short": True,
|
||||
"title": "Trigger Entity",
|
||||
"value": args.author
|
||||
}
|
||||
]
|
||||
}]
|
||||
text = "" # attachments가 있으면 본문 텍스트는 비우거나 제목으로 대체
|
||||
else:
|
||||
text = f"{args.message}"
|
||||
|
||||
success, msg = send_mattermost_message(
|
||||
webhook_url=webhook_url,
|
||||
text=text,
|
||||
username=username,
|
||||
attachments=attachments
|
||||
)
|
||||
|
||||
if success:
|
||||
print("[SUCCESS] Mattermost 알림 전송 완료.")
|
||||
else:
|
||||
print(f"[ERROR] Mattermost 알림 전송 실패: {msg}", file=sys.stderr)
|
||||
sys.exit(2)
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user